From d8b6ed0443503cbd1b357f172950534df151dfea Mon Sep 17 00:00:00 2001 From: Feten Dridi Date: Mon, 9 Dec 2024 06:16:28 +0100 Subject: [PATCH] Initial commit --- .vscode/config.json | 0 .vscode/deploy.yml | 3 + .vscode/docker/backup.dockerfile | 14 + .vscode/docker/exporter.dockerfile | 27 + .vscode/docker/odoo.dockerfile | 13 + .vscode/entrypoint_backup.sh | 11 + .vscode/entrypoint_odoo.sh | 4 + .vscode/fluent.conf | 13 + .vscode/inventory/hosts | 2 + .vscode/notes.txt | 3 + .vscode/odoo.conf | 8 + .vscode/pg_metrics_exporter.py | 59 + .vscode/prometheus.yml | 0 .../docker-compose/files/docker-compose.yml | 109 + .vscode/roles/docker-compose/tasks/main.yml | 21 + .../docker-compose/templates/environment.j2 | 4 + .vscode/settings.json | 3 + myenv/bin/Activate.ps1 | 247 + myenv/bin/activate | 70 + myenv/bin/activate.csh | 27 + myenv/bin/activate.fish | 69 + myenv/bin/debugpy | 10 + myenv/bin/get_gprof | 75 + myenv/bin/get_objgraph | 54 + myenv/bin/pip | 10 + myenv/bin/pip3 | 10 + myenv/bin/pip3.12 | 10 + myenv/bin/pysemver | 10 + myenv/bin/python | 1 + myenv/bin/python3 | 1 + myenv/bin/python3.12 | 1 + myenv/bin/undill | 22 + .../Arpeggio-2.0.2.dist-info/AUTHORS.md | 11 + .../Arpeggio-2.0.2.dist-info/INSTALLER | 1 + .../Arpeggio-2.0.2.dist-info/LICENSE | 22 + .../Arpeggio-2.0.2.dist-info/METADATA | 54 + .../Arpeggio-2.0.2.dist-info/RECORD | 103 + .../Arpeggio-2.0.2.dist-info/WHEEL | 6 + .../Arpeggio-2.0.2.dist-info/top_level.txt | 1 + .../PyYAML-6.0.2.dist-info/INSTALLER | 1 + .../PyYAML-6.0.2.dist-info/LICENSE | 20 + .../PyYAML-6.0.2.dist-info/METADATA | 46 + .../PyYAML-6.0.2.dist-info/RECORD | 43 + .../PyYAML-6.0.2.dist-info/WHEEL | 6 + .../PyYAML-6.0.2.dist-info/top_level.txt | 2 + .../__pycache__/semver.cpython-312.pyc | Bin 0 -> 46765 bytes .../__pycache__/six.cpython-312.pyc | Bin 0 -> 41421 bytes .../site-packages/_yaml/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 878 bytes .../site-packages/arpeggio/__init__.py | 1924 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 76882 bytes .../__pycache__/cleanpeg.cpython-312.pyc | Bin 0 -> 3871 bytes .../__pycache__/export.cpython-312.pyc | Bin 0 -> 9775 bytes .../arpeggio/__pycache__/peg.cpython-312.pyc | Bin 0 -> 13106 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 617 bytes .../site-packages/arpeggio/cleanpeg.py | 69 + .../site-packages/arpeggio/export.py | 221 + .../python3.12/site-packages/arpeggio/peg.py | 290 + .../site-packages/arpeggio/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 205 bytes .../test_decorator_combine.cpython-312.pyc | Bin 0 -> 1561 bytes ...st_default_semantic_action.cpython-312.pyc | Bin 0 -> 2847 bytes .../__pycache__/test_eolterm.cpython-312.pyc | Bin 0 -> 1913 bytes .../test_error_reporting.cpython-312.pyc | Bin 0 -> 11606 bytes .../__pycache__/test_examples.cpython-312.pyc | Bin 0 -> 2427 bytes .../__pycache__/test_exporter.cpython-312.pyc | Bin 0 -> 2529 bytes .../__pycache__/test_flags.cpython-312.pyc | Bin 0 -> 3147 bytes .../test_parser_params.cpython-312.pyc | Bin 0 -> 3529 bytes .../test_parser_resilience.cpython-312.pyc | Bin 0 -> 922 bytes .../test_parsing_expressions.cpython-312.pyc | Bin 0 -> 19121 bytes .../test_pathologic_models.cpython-312.pyc | Bin 0 -> 1193 bytes .../test_peg_parser.cpython-312.pyc | Bin 0 -> 4280 bytes .../__pycache__/test_position.cpython-312.pyc | Bin 0 -> 2349 bytes ...ode_navigation_expressions.cpython-312.pyc | Bin 0 -> 3198 bytes .../test_python_parser.cpython-312.pyc | Bin 0 -> 3001 bytes .../test_reduce_tree.cpython-312.pyc | Bin 0 -> 2384 bytes ...st_semantic_action_results.cpython-312.pyc | Bin 0 -> 2682 bytes .../test_separators.cpython-312.pyc | Bin 0 -> 3402 bytes .../test_sequence_params.cpython-312.pyc | Bin 0 -> 2884 bytes .../test_suppression.cpython-312.pyc | Bin 0 -> 2810 bytes .../__pycache__/test_unicode.cpython-312.pyc | Bin 0 -> 945 bytes .../__pycache__/test_visitor.cpython-312.pyc | Bin 0 -> 2684 bytes .../arpeggio/tests/regressions/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 217 bytes .../test_direct_rule_call.cpython-312.pyc | Bin 0 -> 1968 bytes .../test_memoization.cpython-312.pyc | Bin 0 -> 3050 bytes .../tests/regressions/issue_16/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/test_issue_16.cpython-312.pyc | Bin 0 -> 2590 bytes .../regressions/issue_16/test_issue_16.py | 98 + .../tests/regressions/issue_20/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/test_issue_20.cpython-312.pyc | Bin 0 -> 878 bytes .../regressions/issue_20/test_issue_20.py | 23 + .../tests/regressions/issue_22/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/test_issue_22.cpython-312.pyc | Bin 0 -> 1277 bytes .../tests/regressions/issue_22/grammar1.peg | 17 + .../tests/regressions/issue_22/grammar2.peg | 17 + .../regressions/issue_22/test_issue_22.py | 19 + .../tests/regressions/issue_26/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/test_issue_26.cpython-312.pyc | Bin 0 -> 840 bytes .../regressions/issue_26/test_issue_26.py | 13 + .../tests/regressions/issue_31/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/test_issue_31.cpython-312.pyc | Bin 0 -> 928 bytes .../regressions/issue_31/test_issue_31.py | 17 + .../tests/regressions/issue_32/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/test_issue_32.cpython-312.pyc | Bin 0 -> 10032 bytes .../regressions/issue_32/test_issue_32.py | 242 + .../tests/regressions/issue_43/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/test_issue43.cpython-312.pyc | Bin 0 -> 1239 bytes .../regressions/issue_43/test_issue43.py | 31 + .../__pycache__/test_issue_61.cpython-312.pyc | Bin 0 -> 2336 bytes .../regressions/issue_61/test_issue_61.py | 48 + .../__pycache__/test_issue_73.cpython-312.pyc | Bin 0 -> 1418 bytes .../regressions/issue_73/test_issue_73.py | 33 + .../regressions/test_direct_rule_call.py | 31 + .../tests/regressions/test_memoization.py | 52 + .../arpeggio/tests/test_decorator_combine.py | 43 + .../tests/test_default_semantic_action.py | 77 + .../arpeggio/tests/test_eolterm.py | 39 + .../arpeggio/tests/test_error_reporting.py | 223 + .../arpeggio/tests/test_examples.py | 47 + .../arpeggio/tests/test_exporter.py | 53 + .../arpeggio/tests/test_flags.py | 67 + .../arpeggio/tests/test_parser_params.py | 109 + .../arpeggio/tests/test_parser_resilience.py | 12 + .../tests/test_parsing_expressions.py | 397 + .../arpeggio/tests/test_pathologic_models.py | 30 + .../arpeggio/tests/test_peg_parser.py | 78 + .../arpeggio/tests/test_position.py | 51 + .../test_ptnode_navigation_expressions.py | 70 + .../arpeggio/tests/test_python_parser.py | 47 + .../arpeggio/tests/test_reduce_tree.py | 51 + .../tests/test_semantic_action_results.py | 59 + .../arpeggio/tests/test_separators.py | 61 + .../arpeggio/tests/test_sequence_params.py | 87 + .../arpeggio/tests/test_suppression.py | 67 + .../arpeggio/tests/test_unicode.py | 25 + .../arpeggio/tests/test_visitor.py | 59 + .../site-packages/arpeggio/utils.py | 14 + .../python3.12/site-packages/attr/__init__.py | 103 + .../site-packages/attr/__init__.pyi | 388 + .../attr/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2664 bytes .../attr/__pycache__/_cmp.cpython-312.pyc | Bin 0 -> 5111 bytes .../attr/__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3815 bytes .../attr/__pycache__/_config.cpython-312.pyc | Bin 0 -> 1128 bytes .../attr/__pycache__/_funcs.cpython-312.pyc | Bin 0 -> 15351 bytes .../attr/__pycache__/_make.cpython-312.pyc | Bin 0 -> 91966 bytes .../__pycache__/_next_gen.cpython-312.pyc | Bin 0 -> 24608 bytes .../__pycache__/_version_info.cpython-312.pyc | Bin 0 -> 3142 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 4260 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 3599 bytes .../attr/__pycache__/filters.cpython-312.pyc | Bin 0 -> 3013 bytes .../attr/__pycache__/setters.cpython-312.pyc | Bin 0 -> 1944 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 26243 bytes .../lib/python3.12/site-packages/attr/_cmp.py | 160 + .../python3.12/site-packages/attr/_cmp.pyi | 13 + .../python3.12/site-packages/attr/_compat.py | 103 + .../python3.12/site-packages/attr/_config.py | 31 + .../python3.12/site-packages/attr/_funcs.py | 522 + .../python3.12/site-packages/attr/_make.py | 2960 + .../site-packages/attr/_next_gen.py | 631 + .../site-packages/attr/_typing_compat.pyi | 15 + .../site-packages/attr/_version_info.py | 86 + .../site-packages/attr/_version_info.pyi | 9 + .../site-packages/attr/converters.py | 151 + .../site-packages/attr/converters.pyi | 13 + .../site-packages/attr/exceptions.py | 95 + .../site-packages/attr/exceptions.pyi | 17 + .../python3.12/site-packages/attr/filters.py | 72 + .../python3.12/site-packages/attr/filters.pyi | 6 + .../python3.12/site-packages/attr/py.typed | 0 .../python3.12/site-packages/attr/setters.py | 79 + .../python3.12/site-packages/attr/setters.pyi | 20 + .../site-packages/attr/validators.py | 711 + .../site-packages/attr/validators.pyi | 83 + .../attrs-24.2.0.dist-info/INSTALLER | 1 + .../attrs-24.2.0.dist-info/METADATA | 242 + .../attrs-24.2.0.dist-info/RECORD | 55 + .../attrs-24.2.0.dist-info/WHEEL | 4 + .../attrs-24.2.0.dist-info/licenses/LICENSE | 21 + .../site-packages/attrs/__init__.py | 67 + .../site-packages/attrs/__init__.pyi | 252 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1125 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 237 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 237 bytes .../attrs/__pycache__/filters.cpython-312.pyc | Bin 0 -> 231 bytes .../attrs/__pycache__/setters.cpython-312.pyc | Bin 0 -> 231 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 237 bytes .../site-packages/attrs/converters.py | 3 + .../site-packages/attrs/exceptions.py | 3 + .../python3.12/site-packages/attrs/filters.py | 3 + .../python3.12/site-packages/attrs/py.typed | 0 .../python3.12/site-packages/attrs/setters.py | 3 + .../site-packages/attrs/validators.py | 3 + .../debugpy-1.8.9.dist-info/INSTALLER | 1 + .../debugpy-1.8.9.dist-info/LICENSE | 24 + .../debugpy-1.8.9.dist-info/METADATA | 27 + .../debugpy-1.8.9.dist-info/RECORD | 536 + .../debugpy-1.8.9.dist-info/WHEEL | 8 + .../debugpy-1.8.9.dist-info/entry_points.txt | 2 + .../debugpy-1.8.9.dist-info/top_level.txt | 1 + .../debugpy/ThirdPartyNotices.txt | 499 + .../site-packages/debugpy/__init__.py | 38 + .../site-packages/debugpy/__main__.py | 71 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 791 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 574 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 586 bytes .../__pycache__/public_api.cpython-312.pyc | Bin 0 -> 7658 bytes .../debugpy/_vendored/__init__.py | 126 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5109 bytes .../_pydevd_packaging.cpython-312.pyc | Bin 0 -> 1314 bytes .../__pycache__/_util.cpython-312.pyc | Bin 0 -> 2522 bytes .../__pycache__/force_pydevd.cpython-312.pyc | Bin 0 -> 3037 bytes .../debugpy/_vendored/_pydevd_packaging.py | 48 + .../site-packages/debugpy/_vendored/_util.py | 59 + .../debugpy/_vendored/force_pydevd.py | 81 + ...v_app_engine_debug_startup.cpython-312.pyc | Bin 0 -> 1017 bytes .../pydev_coverage.cpython-312.pyc | Bin 0 -> 4052 bytes .../__pycache__/pydev_pysrc.cpython-312.pyc | Bin 0 -> 327 bytes .../pydev_run_in_console.cpython-312.pyc | Bin 0 -> 5347 bytes .../__pycache__/pydevconsole.cpython-312.pyc | Bin 0 -> 21494 bytes .../pydevd/__pycache__/pydevd.cpython-312.pyc | Bin 0 -> 150393 bytes .../pydevd_file_utils.cpython-312.pyc | Bin 0 -> 32269 bytes .../pydevd_tracing.cpython-312.pyc | Bin 0 -> 15140 bytes .../setup_pydevd_cython.cpython-312.pyc | Bin 0 -> 11088 bytes .../pydevd/_pydev_bundle/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 229 bytes .../_pydev_calltip_util.cpython-312.pyc | Bin 0 -> 5922 bytes .../_pydev_completer.cpython-312.pyc | Bin 0 -> 9444 bytes .../_pydev_execfile.cpython-312.pyc | Bin 0 -> 861 bytes ..._pydev_filesystem_encoding.cpython-312.pyc | Bin 0 -> 1446 bytes .../__pycache__/_pydev_getopt.cpython-312.pyc | Bin 0 -> 4867 bytes .../_pydev_imports_tipper.cpython-312.pyc | Bin 0 -> 11947 bytes .../_pydev_jy_imports_tipper.cpython-312.pyc | Bin 0 -> 16986 bytes .../__pycache__/_pydev_log.cpython-312.pyc | Bin 0 -> 1737 bytes .../_pydev_saved_modules.cpython-312.pyc | Bin 0 -> 5726 bytes .../_pydev_sys_patch.cpython-312.pyc | Bin 0 -> 3114 bytes .../_pydev_tipper_common.cpython-312.pyc | Bin 0 -> 2239 bytes .../pydev_console_utils.cpython-312.pyc | Bin 0 -> 28525 bytes .../pydev_import_hook.cpython-312.pyc | Bin 0 -> 2032 bytes .../__pycache__/pydev_imports.cpython-312.pyc | Bin 0 -> 637 bytes .../pydev_ipython_console.cpython-312.pyc | Bin 0 -> 5322 bytes .../pydev_ipython_console_011.cpython-312.pyc | Bin 0 -> 17631 bytes .../pydev_is_thread_alive.cpython-312.pyc | Bin 0 -> 1190 bytes .../pydev_localhost.cpython-312.pyc | Bin 0 -> 2659 bytes .../__pycache__/pydev_log.cpython-312.pyc | Bin 0 -> 10951 bytes .../__pycache__/pydev_monkey.cpython-312.pyc | Bin 0 -> 40377 bytes .../pydev_monkey_qt.cpython-312.pyc | Bin 0 -> 9101 bytes .../pydev_override.cpython-312.pyc | Bin 0 -> 1524 bytes .../__pycache__/pydev_umd.cpython-312.pyc | Bin 0 -> 7327 bytes .../pydev_versioncheck.cpython-312.pyc | Bin 0 -> 857 bytes .../_pydev_bundle/_pydev_calltip_util.py | 153 + .../pydevd/_pydev_bundle/_pydev_completer.py | 267 + .../pydevd/_pydev_bundle/_pydev_execfile.py | 16 + .../_pydev_filesystem_encoding.py | 43 + .../pydevd/_pydev_bundle/_pydev_getopt.py | 133 + .../_pydev_bundle/_pydev_imports_tipper.py | 372 + .../_pydev_bundle/_pydev_jy_imports_tipper.py | 485 + .../pydevd/_pydev_bundle/_pydev_log.py | 23 + .../_pydev_bundle/_pydev_saved_modules.py | 134 + .../pydevd/_pydev_bundle/_pydev_sys_patch.py | 77 + .../_pydev_bundle/_pydev_tipper_common.py | 53 + .../pydevd/_pydev_bundle/fsnotify/__init__.py | 349 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14004 bytes .../_pydev_bundle/pydev_console_utils.py | 641 + .../pydevd/_pydev_bundle/pydev_import_hook.py | 38 + .../pydevd/_pydev_bundle/pydev_imports.py | 12 + .../_pydev_bundle/pydev_ipython_console.py | 95 + .../pydev_ipython_console_011.py | 504 + .../_pydev_bundle/pydev_is_thread_alive.py | 30 + .../pydevd/_pydev_bundle/pydev_localhost.py | 68 + .../pydevd/_pydev_bundle/pydev_log.py | 284 + .../pydevd/_pydev_bundle/pydev_monkey.py | 1293 + .../pydevd/_pydev_bundle/pydev_monkey_qt.py | 220 + .../pydevd/_pydev_bundle/pydev_override.py | 37 + .../pydevd/_pydev_bundle/pydev_umd.py | 181 + .../_pydev_bundle/pydev_versioncheck.py | 16 + .../pydevd/_pydev_runfiles/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 231 bytes .../pydev_runfiles.cpython-312.pyc | Bin 0 -> 35526 bytes .../pydev_runfiles_coverage.cpython-312.pyc | Bin 0 -> 3314 bytes .../pydev_runfiles_nose.cpython-312.pyc | Bin 0 -> 8641 bytes .../pydev_runfiles_parallel.cpython-312.pyc | Bin 0 -> 10278 bytes ...v_runfiles_parallel_client.cpython-312.pyc | Bin 0 -> 7855 bytes .../pydev_runfiles_pytest2.cpython-312.pyc | Bin 0 -> 10132 bytes .../pydev_runfiles_unittest.cpython-312.pyc | Bin 0 -> 8157 bytes .../pydev_runfiles_xml_rpc.cpython-312.pyc | Bin 0 -> 9494 bytes .../pydevd/_pydev_runfiles/pydev_runfiles.py | 884 + .../pydev_runfiles_coverage.py | 77 + .../_pydev_runfiles/pydev_runfiles_nose.py | 206 + .../pydev_runfiles_parallel.py | 266 + .../pydev_runfiles_parallel_client.py | 194 + .../_pydev_runfiles/pydev_runfiles_pytest2.py | 308 + .../pydev_runfiles_unittest.py | 141 + .../_pydev_runfiles/pydev_runfiles_xml_rpc.py | 260 + .../pydevd/_pydevd_bundle/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 230 bytes .../pydevconsole_code.cpython-312.pyc | Bin 0 -> 20298 bytes ...evd_additional_thread_info.cpython-312.pyc | Bin 0 -> 913 bytes ...tional_thread_info_regular.cpython-312.pyc | Bin 0 -> 7861 bytes .../__pycache__/pydevd_api.cpython-312.pyc | Bin 0 -> 55206 bytes .../pydevd_breakpoints.cpython-312.pyc | Bin 0 -> 7863 bytes .../pydevd_bytecode_utils.cpython-312.pyc | Bin 0 -> 37592 bytes ...ydevd_bytecode_utils_py311.cpython-312.pyc | Bin 0 -> 4772 bytes .../pydevd_code_to_source.cpython-312.pyc | Bin 0 -> 27356 bytes ...devd_collect_bytecode_info.cpython-312.pyc | Bin 0 -> 35204 bytes .../__pycache__/pydevd_comm.cpython-312.pyc | Bin 0 -> 89055 bytes .../pydevd_comm_constants.cpython-312.pyc | Bin 0 -> 5947 bytes ...devd_command_line_handling.cpython-312.pyc | Bin 0 -> 6912 bytes .../pydevd_console.cpython-312.pyc | Bin 0 -> 11557 bytes .../pydevd_constants.cpython-312.pyc | Bin 0 -> 28982 bytes .../pydevd_custom_frames.cpython-312.pyc | Bin 0 -> 4912 bytes .../pydevd_cython_wrapper.cpython-312.pyc | Bin 0 -> 1905 bytes .../pydevd_daemon_thread.cpython-312.pyc | Bin 0 -> 9683 bytes .../pydevd_defaults.cpython-312.pyc | Bin 0 -> 2673 bytes .../pydevd_dont_trace.cpython-312.pyc | Bin 0 -> 2705 bytes .../pydevd_dont_trace_files.cpython-312.pyc | Bin 0 -> 6393 bytes .../__pycache__/pydevd_exec2.cpython-312.pyc | Bin 0 -> 451 bytes .../pydevd_extension_api.cpython-312.pyc | Bin 0 -> 5520 bytes .../pydevd_extension_utils.cpython-312.pyc | Bin 0 -> 3790 bytes .../pydevd_filtering.cpython-312.pyc | Bin 0 -> 14722 bytes .../__pycache__/pydevd_frame.cpython-312.pyc | Bin 0 -> 36153 bytes .../pydevd_frame_utils.cpython-312.pyc | Bin 0 -> 18218 bytes .../pydevd_gevent_integration.cpython-312.pyc | Bin 0 -> 4337 bytes .../pydevd_import_class.cpython-312.pyc | Bin 0 -> 2139 bytes .../__pycache__/pydevd_io.cpython-312.pyc | Bin 0 -> 11422 bytes .../pydevd_json_debug_options.cpython-312.pyc | Bin 0 -> 7040 bytes .../pydevd_net_command.cpython-312.pyc | Bin 0 -> 5762 bytes ...d_net_command_factory_json.cpython-312.pyc | Bin 0 -> 27935 bytes ...vd_net_command_factory_xml.cpython-312.pyc | Bin 0 -> 29175 bytes .../pydevd_plugin_utils.cpython-312.pyc | Bin 0 -> 9019 bytes ...pydevd_process_net_command.cpython-312.pyc | Bin 0 -> 35587 bytes ...d_process_net_command_json.cpython-312.pyc | Bin 0 -> 60844 bytes .../pydevd_referrers.cpython-312.pyc | Bin 0 -> 9252 bytes .../__pycache__/pydevd_reload.cpython-312.pyc | Bin 0 -> 14294 bytes .../pydevd_resolver.cpython-312.pyc | Bin 0 -> 32630 bytes .../__pycache__/pydevd_runpy.cpython-312.pyc | Bin 0 -> 14881 bytes .../pydevd_safe_repr.cpython-312.pyc | Bin 0 -> 13335 bytes .../pydevd_save_locals.cpython-312.pyc | Bin 0 -> 3907 bytes .../pydevd_signature.cpython-312.pyc | Bin 0 -> 10101 bytes .../pydevd_source_mapping.cpython-312.pyc | Bin 0 -> 7766 bytes .../pydevd_stackless.cpython-312.pyc | Bin 0 -> 13538 bytes .../pydevd_suspended_frames.cpython-312.pyc | Bin 0 -> 23913 bytes .../pydevd_thread_lifecycle.cpython-312.pyc | Bin 0 -> 4463 bytes .../pydevd_timeout.cpython-312.pyc | Bin 0 -> 10673 bytes .../pydevd_trace_dispatch.cpython-312.pyc | Bin 0 -> 3638 bytes ...evd_trace_dispatch_regular.cpython-312.pyc | Bin 0 -> 14504 bytes .../pydevd_traceproperty.cpython-312.pyc | Bin 0 -> 3911 bytes .../__pycache__/pydevd_utils.cpython-312.pyc | Bin 0 -> 20788 bytes .../__pycache__/pydevd_vars.cpython-312.pyc | Bin 0 -> 32564 bytes .../pydevd_vm_type.cpython-312.pyc | Bin 0 -> 1283 bytes .../__pycache__/pydevd_xml.cpython-312.pyc | Bin 0 -> 16609 bytes .../_pydevd_bundle/_debug_adapter/__init__.py | 0 ...main__pydevd_gen_debug_adapter_protocol.py | 606 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 245 bytes ...gen_debug_adapter_protocol.cpython-312.pyc | Bin 0 -> 27416 bytes .../pydevd_base_schema.cpython-312.pyc | Bin 0 -> 6231 bytes .../__pycache__/pydevd_schema.cpython-312.pyc | Bin 0 -> 624791 bytes .../pydevd_schema_log.cpython-312.pyc | Bin 0 -> 2335 bytes .../_debug_adapter/debugProtocol.json | 4190 ++ .../_debug_adapter/debugProtocolCustom.json | 325 + .../_debug_adapter/pydevd_base_schema.py | 143 + .../_debug_adapter/pydevd_schema.py | 17458 +++++ .../_debug_adapter/pydevd_schema_log.py | 45 + .../_pydevd_bundle/pydevconsole_code.py | 553 + .../pydevd_additional_thread_info.py | 41 + .../pydevd_additional_thread_info_regular.py | 328 + .../pydevd/_pydevd_bundle/pydevd_api.py | 1200 + .../_pydevd_bundle/pydevd_breakpoints.py | 181 + .../_pydevd_bundle/pydevd_bytecode_utils.py | 938 + .../pydevd_bytecode_utils_py311.py | 105 + .../_pydevd_bundle/pydevd_code_to_source.py | 605 + .../pydevd_collect_bytecode_info.py | 873 + .../pydevd/_pydevd_bundle/pydevd_comm.py | 1920 + .../_pydevd_bundle/pydevd_comm_constants.py | 200 + .../pydevd_command_line_handling.py | 181 + .../pydevd_concurrency_analyser/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 258 bytes .../pydevd_concurrency_logger.cpython-312.pyc | Bin 0 -> 16967 bytes .../pydevd_thread_wrappers.cpython-312.pyc | Bin 0 -> 3858 bytes .../pydevd_concurrency_logger.py | 482 + .../pydevd_thread_wrappers.py | 82 + .../pydevd/_pydevd_bundle/pydevd_console.py | 265 + .../pydevd/_pydevd_bundle/pydevd_constants.py | 847 + .../_pydevd_bundle/pydevd_custom_frames.py | 114 + .../pydevd/_pydevd_bundle/pydevd_cython.c | 55557 ++++++++++++++++ ...evd_cython.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 4988896 bytes .../pydevd/_pydevd_bundle/pydevd_cython.pxd | 42 + .../pydevd/_pydevd_bundle/pydevd_cython.pyx | 2173 + .../_pydevd_bundle/pydevd_cython_wrapper.py | 63 + .../_pydevd_bundle/pydevd_daemon_thread.py | 202 + .../pydevd/_pydevd_bundle/pydevd_defaults.py | 64 + .../_pydevd_bundle/pydevd_dont_trace.py | 123 + .../_pydevd_bundle/pydevd_dont_trace_files.py | 178 + .../pydevd/_pydevd_bundle/pydevd_exec2.py | 5 + .../_pydevd_bundle/pydevd_extension_api.py | 107 + .../_pydevd_bundle/pydevd_extension_utils.py | 65 + .../pydevd/_pydevd_bundle/pydevd_filtering.py | 338 + .../pydevd/_pydevd_bundle/pydevd_frame.py | 1307 + .../_pydevd_bundle/pydevd_frame_utils.py | 445 + .../pydevd_gevent_integration.py | 91 + .../_pydevd_bundle/pydevd_import_class.py | 70 + .../pydevd/_pydevd_bundle/pydevd_io.py | 256 + .../pydevd_json_debug_options.py | 200 + .../_pydevd_bundle/pydevd_net_command.py | 147 + .../pydevd_net_command_factory_json.py | 586 + .../pydevd_net_command_factory_xml.py | 558 + .../_pydevd_bundle/pydevd_plugin_utils.py | 208 + .../pydevd_process_net_command.py | 805 + .../pydevd_process_net_command_json.py | 1354 + .../pydevd/_pydevd_bundle/pydevd_referrers.py | 252 + .../pydevd/_pydevd_bundle/pydevd_reload.py | 433 + .../pydevd/_pydevd_bundle/pydevd_resolver.py | 830 + .../pydevd/_pydevd_bundle/pydevd_runpy.py | 339 + .../pydevd/_pydevd_bundle/pydevd_safe_repr.py | 395 + .../_pydevd_bundle/pydevd_save_locals.py | 130 + .../pydevd/_pydevd_bundle/pydevd_signature.py | 201 + .../_pydevd_bundle/pydevd_source_mapping.py | 152 + .../pydevd/_pydevd_bundle/pydevd_stackless.py | 412 + .../_pydevd_bundle/pydevd_suspended_frames.py | 544 + .../_pydevd_bundle/pydevd_thread_lifecycle.py | 106 + .../pydevd/_pydevd_bundle/pydevd_timeout.py | 237 + .../_pydevd_bundle/pydevd_trace_dispatch.py | 92 + .../pydevd_trace_dispatch_regular.py | 550 + .../_pydevd_bundle/pydevd_traceproperty.py | 89 + .../pydevd/_pydevd_bundle/pydevd_utils.py | 517 + .../pydevd/_pydevd_bundle/pydevd_vars.py | 852 + .../pydevd/_pydevd_bundle/pydevd_vm_type.py | 40 + .../pydevd/_pydevd_bundle/pydevd_xml.py | 434 + .../pydevd/_pydevd_frame_eval/.gitignore | 3 + .../pydevd/_pydevd_frame_eval/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 234 bytes ..._frame_eval_cython_wrapper.cpython-312.pyc | Bin 0 -> 1408 bytes .../pydevd_frame_eval_main.cpython-312.pyc | Bin 0 -> 1387 bytes .../pydevd_frame_tracing.cpython-312.pyc | Bin 0 -> 4900 bytes .../pydevd_modify_bytecode.cpython-312.pyc | Bin 0 -> 11305 bytes .../pydevd_frame_eval_cython_wrapper.py | 43 + .../pydevd_frame_eval_main.py | 71 + .../pydevd_frame_evaluator.c | 26454 ++++++++ .../pydevd_frame_evaluator.pxd | 131 + .../pydevd_frame_evaluator.template.pyx | 613 + .../pydevd_frame_tracing.py | 121 + .../pydevd_modify_bytecode.py | 363 + .../pydevd/_pydevd_frame_eval/release_mem.h | 5 + .../_pydevd_frame_eval/vendored/README.txt | 18 + .../_pydevd_frame_eval/vendored/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 243 bytes .../pydevd_fix_code.cpython-312.pyc | Bin 0 -> 2619 bytes .../bytecode-0.13.0.dev0.dist-info/COPYING | 21 + .../bytecode-0.13.0.dev0.dist-info/INSTALLER | 1 + .../bytecode-0.13.0.dev0.dist-info/METADATA | 77 + .../bytecode-0.13.0.dev0.dist-info/RECORD | 42 + .../bytecode-0.13.0.dev0.dist-info/REQUESTED | 0 .../bytecode-0.13.0.dev0.dist-info/WHEEL | 5 + .../direct_url.json | 1 + .../top_level.txt | 1 + .../vendored/bytecode/__init__.py | 131 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4644 bytes .../__pycache__/bytecode.cpython-312.pyc | Bin 0 -> 10751 bytes .../bytecode/__pycache__/cfg.cpython-312.pyc | Bin 0 -> 17468 bytes .../__pycache__/concrete.cpython-312.pyc | Bin 0 -> 27346 bytes .../__pycache__/flags.cpython-312.pyc | Bin 0 -> 5197 bytes .../__pycache__/instr.cpython-312.pyc | Bin 0 -> 16443 bytes .../__pycache__/peephole_opt.cpython-312.pyc | Bin 0 -> 21613 bytes .../vendored/bytecode/bytecode.py | 208 + .../vendored/bytecode/cfg.py | 443 + .../vendored/bytecode/concrete.py | 658 + .../vendored/bytecode/flags.py | 162 + .../vendored/bytecode/instr.py | 372 + .../vendored/bytecode/peephole_opt.py | 488 + .../vendored/bytecode/tests/__init__.py | 150 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6501 bytes .../__pycache__/test_bytecode.cpython-312.pyc | Bin 0 -> 21270 bytes .../__pycache__/test_cfg.cpython-312.pyc | Bin 0 -> 39072 bytes .../__pycache__/test_code.cpython-312.pyc | Bin 0 -> 3722 bytes .../__pycache__/test_concrete.cpython-312.pyc | Bin 0 -> 55273 bytes .../__pycache__/test_flags.cpython-312.pyc | Bin 0 -> 8752 bytes .../__pycache__/test_instr.cpython-312.pyc | Bin 0 -> 17334 bytes .../__pycache__/test_misc.cpython-312.pyc | Bin 0 -> 9372 bytes .../test_peephole_opt.cpython-312.pyc | Bin 0 -> 30651 bytes .../util_annotation.cpython-312.pyc | Bin 0 -> 1080 bytes .../vendored/bytecode/tests/test_bytecode.py | 486 + .../vendored/bytecode/tests/test_cfg.py | 816 + .../vendored/bytecode/tests/test_code.py | 93 + .../vendored/bytecode/tests/test_concrete.py | 1486 + .../vendored/bytecode/tests/test_flags.py | 157 + .../vendored/bytecode/tests/test_instr.py | 351 + .../vendored/bytecode/tests/test_misc.py | 258 + .../bytecode/tests/test_peephole_opt.py | 974 + .../bytecode/tests/util_annotation.py | 15 + .../vendored/pydevd_fix_code.py | 45 + .../_pydevd_sys_monitoring.cpython-312.pyc | Bin 0 -> 52883 bytes .../pydevd_sys_monitoring.cpython-312.pyc | Bin 0 -> 638 bytes .../_pydevd_sys_monitoring.py | 1967 + .../_pydevd_sys_monitoring_cython.c | 44954 +++++++++++++ ...ing_cython.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 4031712 bytes .../_pydevd_sys_monitoring_cython.pxd | 46 + .../_pydevd_sys_monitoring_cython.pyx | 1973 + .../pydevd_sys_monitoring.py | 16 + .../pydevd/pydev_app_engine_debug_startup.py | 22 + .../_vendored/pydevd/pydev_coverage.py | 92 + .../_vendored/pydevd/pydev_ipython/README | 8 + .../pydevd/pydev_ipython/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 229 bytes .../__pycache__/inputhook.cpython-312.pyc | Bin 0 -> 22434 bytes .../__pycache__/inputhookglut.cpython-312.pyc | Bin 0 -> 3572 bytes .../__pycache__/inputhookgtk.cpython-312.pyc | Bin 0 -> 1049 bytes .../__pycache__/inputhookgtk3.cpython-312.pyc | Bin 0 -> 1063 bytes .../inputhookpyglet.cpython-312.pyc | Bin 0 -> 2448 bytes .../__pycache__/inputhookqt4.cpython-312.pyc | Bin 0 -> 5672 bytes .../__pycache__/inputhookqt5.cpython-312.pyc | Bin 0 -> 5710 bytes .../__pycache__/inputhookqt6.cpython-312.pyc | Bin 0 -> 5770 bytes .../__pycache__/inputhooktk.cpython-312.pyc | Bin 0 -> 810 bytes .../__pycache__/inputhookwx.cpython-312.pyc | Bin 0 -> 6156 bytes .../matplotlibtools.cpython-312.pyc | Bin 0 -> 6275 bytes .../__pycache__/qt.cpython-312.pyc | Bin 0 -> 1082 bytes .../__pycache__/qt_for_kernel.cpython-312.pyc | Bin 0 -> 4313 bytes .../__pycache__/qt_loaders.cpython-312.pyc | Bin 0 -> 11779 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 2410 bytes .../pydevd/pydev_ipython/inputhook.py | 614 + .../pydevd/pydev_ipython/inputhookglut.py | 150 + .../pydevd/pydev_ipython/inputhookgtk.py | 37 + .../pydevd/pydev_ipython/inputhookgtk3.py | 37 + .../pydevd/pydev_ipython/inputhookpyglet.py | 95 + .../pydevd/pydev_ipython/inputhookqt4.py | 198 + .../pydevd/pydev_ipython/inputhookqt5.py | 201 + .../pydevd/pydev_ipython/inputhookqt6.py | 201 + .../pydevd/pydev_ipython/inputhooktk.py | 25 + .../pydevd/pydev_ipython/inputhookwx.py | 173 + .../pydevd/pydev_ipython/matplotlibtools.py | 154 + .../_vendored/pydevd/pydev_ipython/qt.py | 24 + .../pydevd/pydev_ipython/qt_for_kernel.py | 135 + .../pydevd/pydev_ipython/qt_loaders.py | 378 + .../_vendored/pydevd/pydev_ipython/version.py | 50 + .../debugpy/_vendored/pydevd/pydev_pysrc.py | 1 + .../_vendored/pydevd/pydev_run_in_console.py | 152 + .../__not_in_default_pythonpath.txt | 1 + .../__pycache__/sitecustomize.cpython-312.pyc | Bin 0 -> 6870 bytes .../pydev_sitecustomize/sitecustomize.py | 267 + .../debugpy/_vendored/pydevd/pydevconsole.py | 611 + .../debugpy/_vendored/pydevd/pydevd.py | 3710 ++ .../pydevd_attach_to_process/README.txt | 27 + .../_always_live_program.cpython-312.pyc | Bin 0 -> 1770 bytes .../__pycache__/_check.cpython-312.pyc | Bin 0 -> 430 bytes .../_test_attach_to_process.cpython-312.pyc | Bin 0 -> 832 bytes ...st_attach_to_process_linux.cpython-312.pyc | Bin 0 -> 3348 bytes ...add_code_to_python_process.cpython-312.pyc | Bin 0 -> 21313 bytes .../__pycache__/attach_pydevd.cpython-312.pyc | Bin 0 -> 3492 bytes .../__pycache__/attach_script.cpython-312.pyc | Bin 0 -> 6542 bytes .../_always_live_program.py | 40 + .../pydevd/pydevd_attach_to_process/_check.py | 3 + .../_test_attach_to_process.py | 11 + .../_test_attach_to_process_linux.py | 75 + .../add_code_to_python_process.py | 603 + .../attach_linux_amd64.so | Bin 0 -> 31160 bytes .../pydevd_attach_to_process/attach_pydevd.py | 89 + .../pydevd_attach_to_process/attach_script.py | 201 + .../common/py_custom_pyeval_settrace.hpp | 193 + .../common/py_custom_pyeval_settrace_310.hpp | 113 + .../common/py_custom_pyeval_settrace_311.hpp | 120 + .../py_custom_pyeval_settrace_common.hpp | 62 + .../common/py_settrace.hpp | 194 + .../common/py_utils.hpp | 85 + .../common/py_version.hpp | 98 + .../pydevd_attach_to_process/common/python.h | 704 + .../common/ref_utils.hpp | 63 + .../linux_and_mac/.gitignore | 4 + .../__pycache__/lldb_prepare.cpython-312.pyc | Bin 0 -> 2300 bytes .../linux_and_mac/attach.cpp | 111 + .../linux_and_mac/compile_linux.sh | 11 + .../linux_and_mac/compile_mac.sh | 4 + .../linux_and_mac/compile_manylinux.cmd | 10 + .../linux_and_mac/lldb_prepare.py | 55 + .../winappdbg/__init__.py | 247 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4257 bytes .../__pycache__/breakpoint.cpython-312.pyc | Bin 0 -> 176857 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 6551 bytes .../__pycache__/crash.cpython-312.pyc | Bin 0 -> 68826 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 54388 bytes .../__pycache__/disasm.cpython-312.pyc | Bin 0 -> 20142 bytes .../__pycache__/event.cpython-312.pyc | Bin 0 -> 70339 bytes .../__pycache__/interactive.cpython-312.pyc | Bin 0 -> 94269 bytes .../__pycache__/module.cpython-312.pyc | Bin 0 -> 65657 bytes .../__pycache__/process.cpython-312.pyc | Bin 0 -> 181957 bytes .../__pycache__/registry.cpython-312.pyc | Bin 0 -> 24966 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 21328 bytes .../winappdbg/__pycache__/sql.cpython-312.pyc | Bin 0 -> 34537 bytes .../__pycache__/system.cpython-312.pyc | Bin 0 -> 48097 bytes .../__pycache__/textio.cpython-312.pyc | Bin 0 -> 68109 bytes .../__pycache__/thread.cpython-312.pyc | Bin 0 -> 82812 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 31220 bytes .../__pycache__/window.cpython-312.pyc | Bin 0 -> 27851 bytes .../winappdbg/breakpoint.py | 4763 ++ .../winappdbg/compat.py | 201 + .../winappdbg/crash.py | 1908 + .../winappdbg/debug.py | 1513 + .../winappdbg/disasm.py | 717 + .../winappdbg/event.py | 1877 + .../winappdbg/interactive.py | 2269 + .../winappdbg/module.py | 1983 + .../winappdbg/process.py | 4885 ++ .../winappdbg/registry.py | 696 + .../winappdbg/search.py | 661 + .../pydevd_attach_to_process/winappdbg/sql.py | 981 + .../winappdbg/system.py | 1227 + .../winappdbg/textio.py | 1848 + .../winappdbg/thread.py | 2108 + .../winappdbg/util.py | 1059 + .../winappdbg/win32/__init__.py | 72 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1992 bytes .../__pycache__/advapi32.cpython-312.pyc | Bin 0 -> 109224 bytes .../__pycache__/context_amd64.cpython-312.pyc | Bin 0 -> 19678 bytes .../__pycache__/context_i386.cpython-312.pyc | Bin 0 -> 11704 bytes .../win32/__pycache__/dbghelp.cpython-312.pyc | Bin 0 -> 35177 bytes .../win32/__pycache__/defines.cpython-312.pyc | Bin 0 -> 22297 bytes .../win32/__pycache__/gdi32.cpython-312.pyc | Bin 0 -> 13631 bytes .../__pycache__/kernel32.cpython-312.pyc | Bin 0 -> 152282 bytes .../win32/__pycache__/ntdll.cpython-312.pyc | Bin 0 -> 15617 bytes .../win32/__pycache__/peb_teb.cpython-312.pyc | Bin 0 -> 59627 bytes .../win32/__pycache__/psapi.cpython-312.pyc | Bin 0 -> 13143 bytes .../win32/__pycache__/shell32.cpython-312.pyc | Bin 0 -> 12831 bytes .../win32/__pycache__/shlwapi.cpython-312.pyc | Bin 0 -> 28435 bytes .../win32/__pycache__/user32.cpython-312.pyc | Bin 0 -> 61032 bytes .../win32/__pycache__/version.cpython-312.pyc | Bin 0 -> 31905 bytes .../__pycache__/wtsapi32.cpython-312.pyc | Bin 0 -> 6233 bytes .../winappdbg/win32/advapi32.py | 3687 + .../winappdbg/win32/context_amd64.py | 816 + .../winappdbg/win32/context_i386.py | 461 + .../winappdbg/win32/dbghelp.py | 1381 + .../winappdbg/win32/defines.py | 737 + .../winappdbg/win32/gdi32.py | 526 + .../winappdbg/win32/kernel32.py | 5098 ++ .../winappdbg/win32/ntdll.py | 579 + .../winappdbg/win32/peb_teb.py | 3517 + .../winappdbg/win32/psapi.py | 410 + .../winappdbg/win32/shell32.py | 403 + .../winappdbg/win32/shlwapi.py | 838 + .../winappdbg/win32/user32.py | 1832 + .../winappdbg/win32/version.py | 1085 + .../winappdbg/win32/wtsapi32.py | 355 + .../winappdbg/window.py | 753 + .../windows/attach.cpp | 640 + .../pydevd_attach_to_process/windows/attach.h | 57 + .../windows/compile_windows.bat | 44 + .../windows/inject_dll.cpp | 134 + .../windows/py_win_helpers.hpp | 77 + .../windows/run_code_in_memory.hpp | 116 + .../windows/run_code_on_dllmain.cpp | 78 + .../windows/stdafx.cpp | 22 + .../pydevd_attach_to_process/windows/stdafx.h | 36 + .../windows/targetver.h | 22 + .../_vendored/pydevd/pydevd_file_utils.py | 965 + .../pydevd/pydevd_plugins/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 343 bytes .../__pycache__/django_debug.cpython-312.pyc | Bin 0 -> 23872 bytes .../__pycache__/jinja2_debug.cpython-312.pyc | Bin 0 -> 19701 bytes .../pydevd_line_validation.cpython-312.pyc | Bin 0 -> 5675 bytes .../pydevd/pydevd_plugins/django_debug.py | 640 + .../pydevd_plugins/extensions/README.md | 30 + .../pydevd_plugins/extensions/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 354 bytes .../extensions/types/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 360 bytes .../pydevd_helpers.cpython-312.pyc | Bin 0 -> 1283 bytes .../pydevd_plugin_numpy_types.cpython-312.pyc | Bin 0 -> 4603 bytes ...pydevd_plugin_pandas_types.cpython-312.pyc | Bin 0 -> 7467 bytes ...vd_plugins_django_form_str.cpython-312.pyc | Bin 0 -> 1288 bytes .../extensions/types/pydevd_helpers.py | 26 + .../types/pydevd_plugin_numpy_types.py | 90 + .../types/pydevd_plugin_pandas_types.py | 178 + .../types/pydevd_plugins_django_form_str.py | 17 + .../pydevd/pydevd_plugins/jinja2_debug.py | 528 + .../pydevd_plugins/pydevd_line_validation.py | 120 + .../_vendored/pydevd/pydevd_tracing.py | 407 + .../_vendored/pydevd/setup_pydevd_cython.py | 287 + .../site-packages/debugpy/_version.py | 21 + .../site-packages/debugpy/adapter/__init__.py | 14 + .../site-packages/debugpy/adapter/__main__.py | 227 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 419 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 8547 bytes .../__pycache__/clients.cpython-312.pyc | Bin 0 -> 30938 bytes .../__pycache__/components.cpython-312.pyc | Bin 0 -> 9808 bytes .../__pycache__/launchers.cpython-312.pyc | Bin 0 -> 9003 bytes .../__pycache__/servers.cpython-312.pyc | Bin 0 -> 25454 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 13817 bytes .../site-packages/debugpy/adapter/clients.py | 786 + .../debugpy/adapter/components.py | 183 + .../debugpy/adapter/launchers.py | 198 + .../site-packages/debugpy/adapter/servers.py | 620 + .../site-packages/debugpy/adapter/sessions.py | 293 + .../site-packages/debugpy/common/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 719 bytes .../common/__pycache__/json.cpython-312.pyc | Bin 0 -> 12566 bytes .../common/__pycache__/log.cpython-312.pyc | Bin 0 -> 17704 bytes .../__pycache__/messaging.cpython-312.pyc | Bin 0 -> 65899 bytes .../__pycache__/singleton.cpython-312.pyc | Bin 0 -> 7982 bytes .../__pycache__/sockets.cpython-312.pyc | Bin 0 -> 5252 bytes .../common/__pycache__/stacks.cpython-312.pyc | Bin 0 -> 2412 bytes .../__pycache__/timestamp.cpython-312.pyc | Bin 0 -> 707 bytes .../common/__pycache__/util.cpython-312.pyc | Bin 0 -> 6388 bytes .../site-packages/debugpy/common/json.py | 292 + .../site-packages/debugpy/common/log.py | 411 + .../site-packages/debugpy/common/messaging.py | 1506 + .../site-packages/debugpy/common/singleton.py | 185 + .../site-packages/debugpy/common/sockets.py | 129 + .../site-packages/debugpy/common/stacks.py | 62 + .../site-packages/debugpy/common/timestamp.py | 22 + .../site-packages/debugpy/common/util.py | 164 + .../debugpy/launcher/__init__.py | 32 + .../debugpy/launcher/__main__.py | 91 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1108 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 2530 bytes .../__pycache__/debuggee.cpython-312.pyc | Bin 0 -> 10258 bytes .../__pycache__/handlers.cpython-312.pyc | Bin 0 -> 6122 bytes .../__pycache__/output.cpython-312.pyc | Bin 0 -> 5030 bytes .../__pycache__/winapi.cpython-312.pyc | Bin 0 -> 4412 bytes .../debugpy/launcher/debuggee.py | 250 + .../debugpy/launcher/handlers.py | 152 + .../site-packages/debugpy/launcher/output.py | 113 + .../site-packages/debugpy/launcher/winapi.py | 104 + .../site-packages/debugpy/public_api.py | 195 + .../site-packages/debugpy/server/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 261 bytes .../server/__pycache__/api.cpython-312.pyc | Bin 0 -> 14775 bytes .../attach_pid_injected.cpython-312.pyc | Bin 0 -> 3675 bytes .../server/__pycache__/cli.cpython-312.pyc | Bin 0 -> 20843 bytes .../site-packages/debugpy/server/api.py | 365 + .../debugpy/server/attach_pid_injected.py | 92 + .../site-packages/debugpy/server/cli.py | 505 + .../dill-0.3.9.dist-info/INSTALLER | 1 + .../dill-0.3.9.dist-info/LICENSE | 35 + .../dill-0.3.9.dist-info/METADATA | 281 + .../site-packages/dill-0.3.9.dist-info/RECORD | 101 + .../site-packages/dill-0.3.9.dist-info/WHEEL | 5 + .../dill-0.3.9.dist-info/top_level.txt | 1 + .../python3.12/site-packages/dill/__diff.py | 234 + .../python3.12/site-packages/dill/__info__.py | 291 + .../python3.12/site-packages/dill/__init__.py | 119 + .../dill/__pycache__/__diff.cpython-312.pyc | Bin 0 -> 8996 bytes .../dill/__pycache__/__info__.cpython-312.pyc | Bin 0 -> 10712 bytes .../dill/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4728 bytes .../dill/__pycache__/_dill.cpython-312.pyc | Bin 0 -> 102107 bytes .../dill/__pycache__/_objects.cpython-312.pyc | Bin 0 -> 25799 bytes .../dill/__pycache__/_shims.cpython-312.pyc | Bin 0 -> 7694 bytes .../dill/__pycache__/detect.cpython-312.pyc | Bin 0 -> 13347 bytes .../dill/__pycache__/logger.cpython-312.pyc | Bin 0 -> 12641 bytes .../dill/__pycache__/objtypes.cpython-312.pyc | Bin 0 -> 669 bytes .../dill/__pycache__/pointers.cpython-312.pyc | Bin 0 -> 4974 bytes .../dill/__pycache__/session.cpython-312.pyc | Bin 0 -> 26371 bytes .../dill/__pycache__/settings.cpython-312.pyc | Bin 0 -> 397 bytes .../dill/__pycache__/source.cpython-312.pyc | Bin 0 -> 41175 bytes .../dill/__pycache__/temp.cpython-312.pyc | Bin 0 -> 9477 bytes .../python3.12/site-packages/dill/_dill.py | 2226 + .../python3.12/site-packages/dill/_objects.py | 541 + .../python3.12/site-packages/dill/_shims.py | 193 + .../python3.12/site-packages/dill/detect.py | 284 + .../python3.12/site-packages/dill/logger.py | 285 + .../python3.12/site-packages/dill/objtypes.py | 24 + .../python3.12/site-packages/dill/pointers.py | 122 + .../python3.12/site-packages/dill/session.py | 612 + .../python3.12/site-packages/dill/settings.py | 25 + .../python3.12/site-packages/dill/source.py | 1023 + .../lib/python3.12/site-packages/dill/temp.py | 252 + .../site-packages/dill/tests/__init__.py | 22 + .../site-packages/dill/tests/__main__.py | 35 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 409 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1326 bytes .../__pycache__/test_abc.cpython-312.pyc | Bin 0 -> 7952 bytes .../__pycache__/test_check.cpython-312.pyc | Bin 0 -> 2142 bytes .../__pycache__/test_classdef.cpython-312.pyc | Bin 0 -> 19668 bytes .../test_dataclasses.cpython-312.pyc | Bin 0 -> 1594 bytes .../__pycache__/test_detect.cpython-312.pyc | Bin 0 -> 7678 bytes .../test_dictviews.cpython-312.pyc | Bin 0 -> 2193 bytes .../__pycache__/test_diff.cpython-312.pyc | Bin 0 -> 3526 bytes .../test_extendpickle.cpython-312.pyc | Bin 0 -> 2211 bytes .../__pycache__/test_fglobals.cpython-312.pyc | Bin 0 -> 2925 bytes .../__pycache__/test_file.cpython-312.pyc | Bin 0 -> 19291 bytes .../test_functions.cpython-312.pyc | Bin 0 -> 7135 bytes .../__pycache__/test_functors.cpython-312.pyc | Bin 0 -> 1485 bytes .../__pycache__/test_logger.cpython-312.pyc | Bin 0 -> 3687 bytes .../__pycache__/test_mixins.cpython-312.pyc | Bin 0 -> 6933 bytes .../__pycache__/test_module.cpython-312.pyc | Bin 0 -> 3204 bytes .../test_moduledict.cpython-312.pyc | Bin 0 -> 2128 bytes .../__pycache__/test_nested.cpython-312.pyc | Bin 0 -> 6311 bytes .../__pycache__/test_objects.cpython-312.pyc | Bin 0 -> 2704 bytes .../test_properties.cpython-312.pyc | Bin 0 -> 2455 bytes .../test_pycapsule.cpython-312.pyc | Bin 0 -> 2092 bytes .../test_recursive.cpython-312.pyc | Bin 0 -> 8881 bytes .../test_registered.cpython-312.pyc | Bin 0 -> 2596 bytes .../test_restricted.cpython-312.pyc | Bin 0 -> 1240 bytes .../__pycache__/test_selected.cpython-312.pyc | Bin 0 -> 5969 bytes .../__pycache__/test_session.cpython-312.pyc | Bin 0 -> 14498 bytes .../__pycache__/test_source.cpython-312.pyc | Bin 0 -> 10335 bytes .../__pycache__/test_sources.cpython-312.pyc | Bin 0 -> 17746 bytes .../__pycache__/test_temp.cpython-312.pyc | Bin 0 -> 4298 bytes .../__pycache__/test_threads.cpython-312.pyc | Bin 0 -> 2102 bytes .../__pycache__/test_weakref.cpython-312.pyc | Bin 0 -> 2821 bytes .../site-packages/dill/tests/test_abc.py | 169 + .../site-packages/dill/tests/test_check.py | 62 + .../site-packages/dill/tests/test_classdef.py | 340 + .../dill/tests/test_dataclasses.py | 35 + .../site-packages/dill/tests/test_detect.py | 160 + .../dill/tests/test_dictviews.py | 39 + .../site-packages/dill/tests/test_diff.py | 107 + .../dill/tests/test_extendpickle.py | 53 + .../site-packages/dill/tests/test_fglobals.py | 55 + .../site-packages/dill/tests/test_file.py | 500 + .../dill/tests/test_functions.py | 141 + .../site-packages/dill/tests/test_functors.py | 39 + .../site-packages/dill/tests/test_logger.py | 70 + .../site-packages/dill/tests/test_mixins.py | 121 + .../site-packages/dill/tests/test_module.py | 84 + .../dill/tests/test_moduledict.py | 54 + .../site-packages/dill/tests/test_nested.py | 135 + .../site-packages/dill/tests/test_objects.py | 63 + .../dill/tests/test_properties.py | 62 + .../dill/tests/test_pycapsule.py | 45 + .../dill/tests/test_recursive.py | 177 + .../dill/tests/test_registered.py | 64 + .../dill/tests/test_restricted.py | 27 + .../site-packages/dill/tests/test_selected.py | 126 + .../site-packages/dill/tests/test_session.py | 280 + .../site-packages/dill/tests/test_source.py | 173 + .../site-packages/dill/tests/test_sources.py | 190 + .../site-packages/dill/tests/test_temp.py | 103 + .../site-packages/dill/tests/test_threads.py | 46 + .../site-packages/dill/tests/test_weakref.py | 72 + .../google/_upb/_message.abi3.so | Bin 0 -> 371296 bytes .../site-packages/google/protobuf/__init__.py | 10 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 235 bytes .../__pycache__/any_pb2.cpython-312.pyc | Bin 0 -> 1603 bytes .../__pycache__/api_pb2.cpython-312.pyc | Bin 0 -> 2622 bytes .../__pycache__/descriptor.cpython-312.pyc | Bin 0 -> 51093 bytes .../descriptor_database.cpython-312.pyc | Bin 0 -> 6796 bytes .../descriptor_pb2.cpython-312.pyc | Bin 0 -> 123213 bytes .../descriptor_pool.cpython-312.pyc | Bin 0 -> 53283 bytes .../__pycache__/duration_pb2.cpython-312.pyc | Bin 0 -> 1655 bytes .../__pycache__/empty_pb2.cpython-312.pyc | Bin 0 -> 1579 bytes .../field_mask_pb2.cpython-312.pyc | Bin 0 -> 1641 bytes .../__pycache__/json_format.cpython-312.pyc | Bin 0 -> 40569 bytes .../__pycache__/message.cpython-312.pyc | Bin 0 -> 14167 bytes .../message_factory.cpython-312.pyc | Bin 0 -> 8760 bytes .../__pycache__/proto_builder.cpython-312.pyc | Bin 0 -> 4494 bytes .../__pycache__/reflection.cpython-312.pyc | Bin 0 -> 2153 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 9088 bytes .../service_reflection.cpython-312.pyc | Bin 0 -> 12479 bytes .../source_context_pb2.cpython-312.pyc | Bin 0 -> 1680 bytes .../__pycache__/struct_pb2.cpython-312.pyc | Bin 0 -> 2561 bytes .../symbol_database.cpython-312.pyc | Bin 0 -> 8690 bytes .../__pycache__/text_encoding.cpython-312.pyc | Bin 0 -> 3679 bytes .../__pycache__/text_format.cpython-312.pyc | Bin 0 -> 74655 bytes .../__pycache__/timestamp_pb2.cpython-312.pyc | Bin 0 -> 1664 bytes .../__pycache__/type_pb2.cpython-312.pyc | Bin 0 -> 4046 bytes .../unknown_fields.cpython-312.pyc | Bin 0 -> 4374 bytes .../__pycache__/wrappers_pb2.cpython-312.pyc | Bin 0 -> 2639 bytes .../site-packages/google/protobuf/any_pb2.py | 27 + .../site-packages/google/protobuf/api_pb2.py | 33 + .../google/protobuf/compiler/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 215 bytes .../__pycache__/plugin_pb2.cpython-312.pyc | Bin 0 -> 2989 bytes .../google/protobuf/compiler/plugin_pb2.py | 36 + .../google/protobuf/descriptor.py | 1282 + .../google/protobuf/descriptor_database.py | 154 + .../google/protobuf/descriptor_pb2.py | 2790 + .../google/protobuf/descriptor_pool.py | 1271 + .../google/protobuf/duration_pb2.py | 27 + .../google/protobuf/empty_pb2.py | 27 + .../google/protobuf/field_mask_pb2.py | 27 + .../google/protobuf/internal/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 215 bytes .../_parameterized.cpython-312.pyc | Bin 0 -> 17383 bytes .../api_implementation.cpython-312.pyc | Bin 0 -> 3297 bytes .../__pycache__/builder.cpython-312.pyc | Bin 0 -> 5348 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 32646 bytes .../__pycache__/decoder.cpython-312.pyc | Bin 0 -> 38084 bytes .../__pycache__/encoder.cpython-312.pyc | Bin 0 -> 32666 bytes .../enum_type_wrapper.cpython-312.pyc | Bin 0 -> 4417 bytes .../extension_dict.cpython-312.pyc | Bin 0 -> 8751 bytes .../__pycache__/field_mask.cpython-312.pyc | Bin 0 -> 13867 bytes .../message_listener.cpython-312.pyc | Bin 0 -> 2444 bytes .../python_message.cpython-312.pyc | Bin 0 -> 63943 bytes .../testing_refleaks.cpython-312.pyc | Bin 0 -> 5235 bytes .../__pycache__/type_checkers.cpython-312.pyc | Bin 0 -> 19958 bytes .../well_known_types.cpython-312.pyc | Bin 0 -> 25854 bytes .../__pycache__/wire_format.cpython-312.pyc | Bin 0 -> 8313 bytes .../protobuf/internal/_parameterized.py | 420 + .../protobuf/internal/api_implementation.py | 140 + .../google/protobuf/internal/builder.py | 118 + .../google/protobuf/internal/containers.py | 687 + .../google/protobuf/internal/decoder.py | 1044 + .../google/protobuf/internal/encoder.py | 806 + .../protobuf/internal/enum_type_wrapper.py | 101 + .../protobuf/internal/extension_dict.py | 194 + .../google/protobuf/internal/field_mask.py | 310 + .../protobuf/internal/message_listener.py | 55 + .../protobuf/internal/python_message.py | 1546 + .../protobuf/internal/testing_refleaks.py | 119 + .../google/protobuf/internal/type_checkers.py | 408 + .../protobuf/internal/well_known_types.py | 567 + .../google/protobuf/internal/wire_format.py | 245 + .../google/protobuf/json_format.py | 904 + .../site-packages/google/protobuf/message.py | 399 + .../google/protobuf/message_factory.py | 233 + .../google/protobuf/proto_builder.py | 111 + .../google/protobuf/pyext/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 212 bytes .../__pycache__/cpp_message.cpython-312.pyc | Bin 0 -> 1683 bytes .../google/protobuf/pyext/cpp_message.py | 49 + .../google/protobuf/reflection.py | 72 + .../site-packages/google/protobuf/service.py | 205 + .../google/protobuf/service_reflection.py | 272 + .../google/protobuf/source_context_pb2.py | 27 + .../google/protobuf/struct_pb2.py | 37 + .../google/protobuf/symbol_database.py | 197 + .../google/protobuf/testdata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 215 bytes .../google/protobuf/text_encoding.py | 85 + .../google/protobuf/text_format.py | 1834 + .../google/protobuf/timestamp_pb2.py | 27 + .../site-packages/google/protobuf/type_pb2.py | 43 + .../google/protobuf/unknown_fields.py | 97 + .../google/protobuf/util/__init__.py | 0 .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 211 bytes .../google/protobuf/wrappers_pb2.py | 43 + .../python3.12/site-packages/grpc/__init__.py | 2348 + .../grpc/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 91331 bytes .../grpc/__pycache__/_auth.cpython-312.pyc | Bin 0 -> 3185 bytes .../grpc/__pycache__/_channel.cpython-312.pyc | Bin 0 -> 98532 bytes .../grpc/__pycache__/_common.cpython-312.pyc | Bin 0 -> 9187 bytes .../__pycache__/_compression.cpython-312.pyc | Bin 0 -> 1980 bytes .../_grpcio_metadata.cpython-312.pyc | Bin 0 -> 230 bytes .../__pycache__/_interceptor.cpython-312.pyc | Bin 0 -> 30766 bytes .../_observability.cpython-312.pyc | Bin 0 -> 12724 bytes .../_plugin_wrapping.cpython-312.pyc | Bin 0 -> 5746 bytes .../_runtime_protos.cpython-312.pyc | Bin 0 -> 6051 bytes .../grpc/__pycache__/_server.cpython-312.pyc | Bin 0 -> 63697 bytes .../__pycache__/_simple_stubs.cpython-312.pyc | Bin 0 -> 25291 bytes .../grpc/__pycache__/_typing.cpython-312.pyc | Bin 0 -> 2259 bytes .../__pycache__/_utilities.cpython-312.pyc | Bin 0 -> 10615 bytes .../python3.12/site-packages/grpc/_auth.py | 80 + .../python3.12/site-packages/grpc/_channel.py | 2267 + .../python3.12/site-packages/grpc/_common.py | 183 + .../site-packages/grpc/_compression.py | 71 + .../site-packages/grpc/_cython/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../grpc/_cython/_credentials/roots.pem | 4337 ++ .../grpc/_cython/_cygrpc/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 211 bytes .../cygrpc.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 13247656 bytes .../site-packages/grpc/_grpcio_metadata.py | 1 + .../site-packages/grpc/_interceptor.py | 813 + .../site-packages/grpc/_observability.py | 299 + .../site-packages/grpc/_plugin_wrapping.py | 136 + .../site-packages/grpc/_runtime_protos.py | 165 + .../python3.12/site-packages/grpc/_server.py | 1528 + .../site-packages/grpc/_simple_stubs.py | 588 + .../python3.12/site-packages/grpc/_typing.py | 95 + .../site-packages/grpc/_utilities.py | 222 + .../site-packages/grpc/aio/__init__.py | 95 + .../aio/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2172 bytes .../__pycache__/_base_call.cpython-312.pyc | Bin 0 -> 8958 bytes .../__pycache__/_base_channel.cpython-312.pyc | Bin 0 -> 15970 bytes .../__pycache__/_base_server.cpython-312.pyc | Bin 0 -> 15931 bytes .../aio/__pycache__/_call.cpython-312.pyc | Bin 0 -> 35313 bytes .../aio/__pycache__/_channel.cpython-312.pyc | Bin 0 -> 21773 bytes .../__pycache__/_interceptor.cpython-312.pyc | Bin 0 -> 48935 bytes .../aio/__pycache__/_metadata.cpython-312.pyc | Bin 0 -> 7577 bytes .../aio/__pycache__/_server.cpython-312.pyc | Bin 0 -> 10295 bytes .../aio/__pycache__/_typing.cpython-312.pyc | Bin 0 -> 1174 bytes .../aio/__pycache__/_utils.cpython-312.pyc | Bin 0 -> 583 bytes .../site-packages/grpc/aio/_base_call.py | 257 + .../site-packages/grpc/aio/_base_channel.py | 364 + .../site-packages/grpc/aio/_base_server.py | 385 + .../site-packages/grpc/aio/_call.py | 764 + .../site-packages/grpc/aio/_channel.py | 627 + .../site-packages/grpc/aio/_interceptor.py | 1178 + .../site-packages/grpc/aio/_metadata.py | 137 + .../site-packages/grpc/aio/_server.py | 239 + .../site-packages/grpc/aio/_typing.py | 43 + .../site-packages/grpc/aio/_utils.py | 22 + .../site-packages/grpc/beta/__init__.py | 13 + .../beta/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../_client_adaptations.cpython-312.pyc | Bin 0 -> 28305 bytes .../__pycache__/_metadata.cpython-312.pyc | Bin 0 -> 2009 bytes .../_server_adaptations.cpython-312.pyc | Bin 0 -> 18980 bytes .../implementations.cpython-312.pyc | Bin 0 -> 12184 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 0 -> 7306 bytes .../__pycache__/utilities.cpython-312.pyc | Bin 0 -> 7144 bytes .../grpc/beta/_client_adaptations.py | 1015 + .../site-packages/grpc/beta/_metadata.py | 56 + .../grpc/beta/_server_adaptations.py | 465 + .../grpc/beta/implementations.py | 345 + .../site-packages/grpc/beta/interfaces.py | 163 + .../site-packages/grpc/beta/utilities.py | 153 + .../grpc/experimental/__init__.py | 134 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4437 bytes .../__pycache__/gevent.cpython-312.pyc | Bin 0 -> 745 bytes .../__pycache__/session_cache.cpython-312.pyc | Bin 0 -> 1703 bytes .../grpc/experimental/aio/__init__.py | 16 + .../aio/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 311 bytes .../site-packages/grpc/experimental/gevent.py | 27 + .../grpc/experimental/session_cache.py | 45 + .../site-packages/grpc/framework/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 205 bytes .../grpc/framework/common/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 212 bytes .../__pycache__/cardinality.cpython-312.pyc | Bin 0 -> 879 bytes .../common/__pycache__/style.cpython-312.pyc | Bin 0 -> 703 bytes .../grpc/framework/common/cardinality.py | 26 + .../grpc/framework/common/style.py | 24 + .../grpc/framework/foundation/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../__pycache__/abandonment.cpython-312.pyc | Bin 0 -> 691 bytes .../__pycache__/callable_util.cpython-312.pyc | Bin 0 -> 3902 bytes .../__pycache__/future.cpython-312.pyc | Bin 0 -> 7984 bytes .../__pycache__/logging_pool.cpython-312.pyc | Bin 0 -> 3158 bytes .../__pycache__/stream.cpython-312.pyc | Bin 0 -> 1537 bytes .../__pycache__/stream_util.cpython-312.pyc | Bin 0 -> 7738 bytes .../grpc/framework/foundation/abandonment.py | 22 + .../framework/foundation/callable_util.py | 98 + .../grpc/framework/foundation/future.py | 219 + .../grpc/framework/foundation/logging_pool.py | 72 + .../grpc/framework/foundation/stream.py | 43 + .../grpc/framework/foundation/stream_util.py | 148 + .../grpc/framework/interfaces/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../framework/interfaces/base/__init__.py | 13 + .../base/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 221 bytes .../base/__pycache__/base.cpython-312.pyc | Bin 0 -> 14898 bytes .../__pycache__/utilities.cpython-312.pyc | Bin 0 -> 2421 bytes .../grpc/framework/interfaces/base/base.py | 328 + .../framework/interfaces/base/utilities.py | 83 + .../framework/interfaces/face/__init__.py | 13 + .../face/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 221 bytes .../face/__pycache__/face.cpython-312.pyc | Bin 0 -> 44211 bytes .../__pycache__/utilities.cpython-312.pyc | Bin 0 -> 6886 bytes .../grpc/framework/interfaces/face/face.py | 1084 + .../framework/interfaces/face/utilities.py | 245 + .../grpcio-1.66.2.dist-info/INSTALLER | 1 + .../grpcio-1.66.2.dist-info/LICENSE | 610 + .../grpcio-1.66.2.dist-info/METADATA | 130 + .../grpcio-1.66.2.dist-info/RECORD | 120 + .../grpcio-1.66.2.dist-info/WHEEL | 6 + .../grpcio-1.66.2.dist-info/top_level.txt | 1 + .../parver-0.5.dist-info/INSTALLER | 1 + .../parver-0.5.dist-info/LICENSE | 21 + .../parver-0.5.dist-info/METADATA | 82 + .../site-packages/parver-0.5.dist-info/RECORD | 19 + .../site-packages/parver-0.5.dist-info/WHEEL | 5 + .../parver-0.5.dist-info/top_level.txt | 1 + .../site-packages/parver/__init__.py | 9 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 431 bytes .../__pycache__/_helpers.cpython-312.pyc | Bin 0 -> 5984 bytes .../parver/__pycache__/_parse.cpython-312.pyc | Bin 0 -> 10884 bytes .../__pycache__/_segments.cpython-312.pyc | Bin 0 -> 3507 bytes .../__pycache__/_typing.cpython-312.pyc | Bin 0 -> 896 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 46737 bytes .../site-packages/parver/_helpers.py | 115 + .../python3.12/site-packages/parver/_parse.py | 244 + .../site-packages/parver/_segments.py | 53 + .../site-packages/parver/_typing.py | 18 + .../site-packages/parver/_version.py | 1144 + .../python3.12/site-packages/parver/py.typed | 0 .../pip-24.0.dist-info/AUTHORS.txt | 760 + .../pip-24.0.dist-info/INSTALLER | 1 + .../pip-24.0.dist-info/LICENSE.txt | 20 + .../site-packages/pip-24.0.dist-info/METADATA | 88 + .../site-packages/pip-24.0.dist-info/RECORD | 1005 + .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 + .../pip-24.0.dist-info/entry_points.txt | 4 + .../pip-24.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 13 + .../python3.12/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 703 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 859 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2222 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 805 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14312 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12683 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17684 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33302 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 688 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 4989 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10570 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13667 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 296 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8483 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10473 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30392 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1799 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2316 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4923 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15040 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 2638 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 18870 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7858 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 393 bytes .../pip/_internal/cli/autocompletion.py | 172 + .../pip/_internal/cli/base_command.py | 236 + .../pip/_internal/cli/cmdoptions.py | 1074 + .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 79 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 505 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4020 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9729 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2108 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5210 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13230 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10179 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7607 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4434 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 3001 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1691 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6738 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3993 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 28931 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15674 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7639 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 9746 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4744 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8974 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 54 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 109 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 774 + .../pip/_internal/commands/list.py | 370 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 959 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2880 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1718 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8506 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 2266 bytes .../pip/_internal/distributions/base.py | 51 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 156 + .../pip/_internal/distributions/wheel.py | 40 + .../site-packages/pip/_internal/exceptions.py | 728 + .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 250 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21904 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40753 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 12622 bytes .../pip/_internal/index/collector.py | 507 + .../pip/_internal/index/package_finder.py | 1027 + .../pip/_internal/index/sources.py | 285 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16794 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6874 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8029 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3799 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5900 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2893 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35730 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 15808 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 702 + .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 376 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3351 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 13443 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11198 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 227 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 278 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 284 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1923 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 11217 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4245 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1712 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2290 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26020 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1187 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5106 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1869 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4972 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5798 bytes .../pip/_internal/models/candidate.py | 30 + .../pip/_internal/models/direct_url.py | 235 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 579 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 132 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 272 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 22014 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 6536 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8571 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11681 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18792 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2271 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2967 bytes .../pip/_internal/network/auth.py | 561 + .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 520 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 215 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7597 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10135 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25765 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 221 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7841 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1898 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1932 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3083 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1702 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2043 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3947 bytes .../operations/build/build_tracker.py | 139 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 187 + .../pip/_internal/operations/freeze.py | 255 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 284 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1835 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 33877 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 734 + .../pip/_internal/operations/prepare.py | 730 + .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3761 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 21600 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 21479 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 38432 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 7236 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 32995 bytes .../pip/_internal/req/constructors.py | 576 + .../pip/_internal/req/req_file.py | 554 + .../pip/_internal/req/req_install.py | 923 + .../pip/_internal/req/req_set.py | 119 + .../pip/_internal/req/req_uninstall.py | 649 + .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 215 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1203 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 222 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22457 bytes .../_internal/resolution/legacy/resolver.py | 598 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8355 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 30416 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 32132 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6226 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10396 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 4953 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 11447 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 12369 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 597 + .../resolution/resolvelib/factory.py | 812 + .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 255 + .../resolution/resolvelib/reporter.py | 80 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 248 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 210 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4551 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1881 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2425 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2228 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 5576 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 699 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4201 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3578 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 3241 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2173 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 4008 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7473 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1179 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2357 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7569 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13572 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 34136 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 0 -> 2727 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2598 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4565 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8733 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 12077 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 11123 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2420 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4495 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5941 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 80 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 151 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 783 + .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 549 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5041 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 19010 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7630 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12502 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29028 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 + .../pip/_internal/wheel_builder.py | 354 + .../site-packages/pip/_vendor/__init__.py | 121 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4711 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 0 -> 41288 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 122068 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 921 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2665 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 6483 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3828 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 16186 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 4366 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6713 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 6424 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 1693 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 161 + .../pip/_vendor/cachecontrol/cache.py | 74 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 454 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7729 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2757 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 494 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/serialize.py | 206 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 337 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 664 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3346 bytes .../pip/_vendor/certifi/cacert.pem | 4635 ++ .../site-packages/pip/_vendor/certifi/core.py | 119 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4587 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 0 -> 27218 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 0 -> 1406 bytes .../chardistribution.cpython-312.pyc | Bin 0 -> 9657 bytes .../charsetgroupprober.cpython-312.pyc | Bin 0 -> 4141 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 0 -> 5037 bytes .../codingstatemachine.cpython-312.pyc | Bin 0 -> 3897 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 0 -> 808 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 0 -> 1415 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 0 -> 3015 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 0 -> 4585 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 0 -> 15329 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 0 -> 4402 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 0 -> 12101 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 0 -> 1409 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 0 -> 27223 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 0 -> 1409 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 0 -> 19145 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 0 -> 1422 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 0 -> 5841 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 0 -> 22174 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 0 -> 83022 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 0 -> 1413 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 0 -> 39568 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 0 -> 83141 bytes .../langgreekmodel.cpython-312.pyc | Bin 0 -> 77007 bytes .../langhebrewmodel.cpython-312.pyc | Bin 0 -> 77518 bytes .../langhungarianmodel.cpython-312.pyc | Bin 0 -> 83095 bytes .../langrussianmodel.cpython-312.pyc | Bin 0 -> 105270 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 0 -> 77696 bytes .../langturkishmodel.cpython-312.pyc | Bin 0 -> 77535 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 0 -> 7021 bytes .../macromanprober.cpython-312.pyc | Bin 0 -> 7201 bytes .../mbcharsetprober.cpython-312.pyc | Bin 0 -> 3922 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 0 -> 1607 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 0 -> 38664 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 0 -> 651 bytes .../sbcharsetprober.cpython-312.pyc | Bin 0 -> 6406 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 0 -> 2376 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 0 -> 4514 bytes .../universaldetector.cpython-312.pyc | Bin 0 -> 12288 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 0 -> 9998 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 0 -> 3194 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 507 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 214 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 0 -> 4031 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 + .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 ++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 ++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 ++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 ++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 ++ .../pip/_vendor/chardet/langthaimodel.py | 4380 ++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 ++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 + .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 219 bytes .../__pycache__/languages.cpython-312.pyc | Bin 0 -> 9774 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 511 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 3969 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 0 -> 16440 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 0 -> 3569 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 8145 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 0 -> 9107 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 217 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 0 -> 5486 bytes .../ansitowin32_test.cpython-312.pyc | Bin 0 -> 18122 bytes .../initialise_test.cpython-312.pyc | Bin 0 -> 11767 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 0 -> 4923 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2507 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 0 -> 6631 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../_vendor/colorama/tests/initialise_test.py | 189 + .../pip/_vendor/colorama/tests/isatty_test.py | 57 + .../pip/_vendor/colorama/tests/utils.py | 49 + .../_vendor/colorama/tests/winterm_test.py | 131 + .../pip/_vendor/colorama/win32.py | 180 + .../pip/_vendor/colorama/winterm.py | 195 + .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1288 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45624 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 66046 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24385 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 60177 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15144 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7701 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41818 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17344 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19599 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 88275 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30385 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 51880 bytes .../pip/_vendor/distlib/compat.py | 1138 + .../pip/_vendor/distlib/database.py | 1359 + .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1303 + .../pip/_vendor/distlib/manifest.py | 384 + .../pip/_vendor/distlib/markers.py | 167 + .../pip/_vendor/distlib/metadata.py | 1068 + .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 452 + .../site-packages/pip/_vendor/distlib/util.py | 2025 + .../pip/_vendor/distlib/version.py | 751 + .../pip/_vendor/distlib/wheel.py | 1099 + .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 979 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 311 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53773 bytes .../pip/_vendor/distro/distro.py | 1399 + .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 900 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4652 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 906 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16301 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 38401 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2657 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 235 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158889 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 2151 + .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 +++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1850 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2044 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8687 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 43595 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 + .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-312.pyc | Bin 0 -> 649 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 485 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 12095 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 6929 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3260 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 14077 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 6965 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 31266 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 18975 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 5887 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19958 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 + .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3361 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 146493 bytes .../pip/_vendor/platformdirs/__init__.py | 566 + .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18048 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1965 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 9463 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 9691 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 5656 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 12460 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 330 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13018 bytes .../pip/_vendor/platformdirs/android.py | 210 + .../pip/_vendor/platformdirs/api.py | 223 + .../pip/_vendor/platformdirs/macos.py | 91 + .../pip/_vendor/platformdirs/unix.py | 223 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 255 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3508 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 754 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26625 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2646 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3252 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4589 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38349 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1588 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 3416 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4101 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4776 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 11066 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6694 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8162 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 33008 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 14001 bytes .../pip/_vendor/pygments/cmdline.py | 668 + .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37956 bytes .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6946 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4235 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4214 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7284 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 40592 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 27063 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6085 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 19974 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6904 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2950 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 6146 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9086 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5849 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15177 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 + .../pip/_vendor/pygments/formatters/img.py | 645 + .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 943 + .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14672 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 64424 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42659 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 + .../pip/_vendor/pygments/lexers/python.py | 1198 + .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 217 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 103 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4468 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 330 + .../pip/_vendor/pyparsing/__init__.py | 322 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7931 bytes .../__pycache__/actions.cpython-312.pyc | Bin 0 -> 8415 bytes .../__pycache__/common.cpython-312.pyc | Bin 0 -> 13434 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 267728 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13014 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 48521 bytes .../__pycache__/results.cpython-312.pyc | Bin 0 -> 34130 bytes .../__pycache__/testing.cpython-312.pyc | Bin 0 -> 17208 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 0 -> 13204 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 14924 bytes .../pip/_vendor/pyparsing/actions.py | 217 + .../pip/_vendor/pyparsing/common.py | 432 + .../pip/_vendor/pyparsing/core.py | 6115 ++ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26833 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 + .../pip/_vendor/pyparsing/helpers.py | 1100 + .../pip/_vendor/pyparsing/results.py | 796 + .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 361 + .../pip/_vendor/pyparsing/util.py | 284 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 633 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 394 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14745 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1100 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14417 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5473 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 604 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2044 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 21300 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7224 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13943 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 942 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1527 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25266 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7067 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4332 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1072 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35468 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 792 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27777 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 5979 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5637 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36289 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 538 + .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 + .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 + .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 833 + .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1094 + .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 654 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6871 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2674 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25917 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10526 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 220 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 440 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 547 + .../pip/_vendor/resolvelib/structs.py | 170 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 274 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7035 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10324 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7841 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205996 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1749 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2341 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 557 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 875 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12097 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4167 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1905 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3640 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5180 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 746 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6599 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13199 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 985 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 885 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28996 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2510 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3593 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 2380 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1628 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12342 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9126 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4292 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11878 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5638 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26590 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1721 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8607 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113813 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2278 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9246 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10949 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10393 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1507 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4229 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1865 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3597 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3102 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9918 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6055 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5229 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20240 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19163 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4914 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13574 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9318 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6396 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7154 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1840 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5334 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12117 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40076 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 75098 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10409 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14801 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1812 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 587 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6646 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6588 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3850 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2504 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28181 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6084 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6088 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33534 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2159 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39632 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43604 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3368 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 58983 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6360 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 334 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31568 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11459 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 + .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 + .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 622 + .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2633 + .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 190 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 994 + .../pip/_vendor/rich/progress.py | 1702 + .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 + .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 796 + .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 948 + .../site-packages/pip/_vendor/rich/table.py | 1002 + .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1307 + .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 756 + .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 + .../pip/_vendor/tenacity/__init__.py | 608 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27106 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 0 -> 4826 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 2335 bytes .../__pycache__/after.cpython-312.pyc | Bin 0 -> 1644 bytes .../__pycache__/before.cpython-312.pyc | Bin 0 -> 1484 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 0 -> 2322 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 0 -> 1432 bytes .../__pycache__/retry.cpython-312.pyc | Bin 0 -> 14301 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 0 -> 5588 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 0 -> 2606 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 0 -> 12433 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 + .../pip/_vendor/tenacity/_utils.py | 76 + .../pip/_vendor/tenacity/after.py | 51 + .../pip/_vendor/tenacity/before.py | 46 + .../pip/_vendor/tenacity/before_sleep.py | 71 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 272 + .../pip/_vendor/tenacity/stop.py | 103 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 228 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 404 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26947 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3928 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 386 bytes .../pip/_vendor/tomli/_parser.py | 691 + .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 638 bytes .../__pycache__/_api.cpython-312.pyc | Bin 0 -> 15817 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 16682 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 0 -> 2235 bytes .../_ssl_constants.cpython-312.pyc | Bin 0 -> 1119 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15526 bytes .../pip/_vendor/truststore/_api.py | 302 + .../pip/_vendor/truststore/_macos.py | 501 + .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 554 + .../pip/_vendor/typing_extensions.py | 3072 + .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3425 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 15951 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 238 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20427 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36299 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13513 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10433 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4038 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20322 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 7314 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 33988 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 + .../pip/_vendor/urllib3/connectionpool.py | 1132 + .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 218 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1868 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11584 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5739 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24470 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35576 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7531 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 235 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17447 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14821 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 + .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 219 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41339 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 229 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1845 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7351 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 + .../pip/_vendor/urllib3/poolmanager.py | 537 + .../pip/_vendor/urllib3/request.py | 191 + .../pip/_vendor/urllib3/response.py | 879 + .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1166 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4776 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1572 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1372 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4203 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 3009 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21738 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15123 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5091 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10792 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11159 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15815 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4423 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 622 + .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 12021 bytes .../__pycache__/labels.cpython-312.pyc | Bin 0 -> 7152 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 0 -> 2719 bytes .../__pycache__/tests.cpython-312.pyc | Bin 0 -> 9271 bytes .../x_user_defined.cpython-312.pyc | Bin 0 -> 3315 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.12/site-packages/pip/py.typed | 4 + .../protobuf-4.25.5.dist-info/INSTALLER | 1 + .../protobuf-4.25.5.dist-info/LICENSE | 32 + .../protobuf-4.25.5.dist-info/METADATA | 16 + .../protobuf-4.25.5.dist-info/RECORD | 102 + .../protobuf-4.25.5.dist-info/WHEEL | 4 + .../psycopg2-2.9.10.dist-info/INSTALLER | 1 + .../psycopg2-2.9.10.dist-info/LICENSE | 49 + .../psycopg2-2.9.10.dist-info/METADATA | 123 + .../psycopg2-2.9.10.dist-info/RECORD | 30 + .../psycopg2-2.9.10.dist-info/REQUESTED | 0 .../psycopg2-2.9.10.dist-info/WHEEL | 5 + .../psycopg2-2.9.10.dist-info/top_level.txt | 1 + .../site-packages/psycopg2/__init__.py | 126 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3767 bytes .../__pycache__/_ipaddress.cpython-312.pyc | Bin 0 -> 2643 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 7492 bytes .../__pycache__/_range.cpython-312.pyc | Bin 0 -> 21063 bytes .../__pycache__/errorcodes.cpython-312.pyc | Bin 0 -> 14456 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 551 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 0 -> 7477 bytes .../__pycache__/extras.cpython-312.pyc | Bin 0 -> 60561 bytes .../psycopg2/__pycache__/pool.cpython-312.pyc | Bin 0 -> 7847 bytes .../psycopg2/__pycache__/sql.cpython-312.pyc | Bin 0 -> 18951 bytes .../psycopg2/__pycache__/tz.cpython-312.pyc | Bin 0 -> 6213 bytes .../site-packages/psycopg2/_ipaddress.py | 90 + .../site-packages/psycopg2/_json.py | 199 + .../_psycopg.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 339145 bytes .../site-packages/psycopg2/_range.py | 554 + .../site-packages/psycopg2/errorcodes.py | 450 + .../site-packages/psycopg2/errors.py | 38 + .../site-packages/psycopg2/extensions.py | 213 + .../site-packages/psycopg2/extras.py | 1340 + .../python3.12/site-packages/psycopg2/pool.py | 187 + .../python3.12/site-packages/psycopg2/sql.py | 455 + .../python3.12/site-packages/psycopg2/tz.py | 158 + .../INSTALLER | 1 + .../psycopg2_binary-2.9.10.dist-info/LICENSE | 49 + .../psycopg2_binary-2.9.10.dist-info/METADATA | 123 + .../psycopg2_binary-2.9.10.dist-info/RECORD | 44 + .../REQUESTED | 0 .../psycopg2_binary-2.9.10.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../libcom_err-2abe824b.so.2.1 | Bin 0 -> 17497 bytes .../libcrypto-ea28cefb.so.1.1 | Bin 0 -> 3133185 bytes .../libgssapi_krb5-497db0c6.so.2.2 | Bin 0 -> 345209 bytes .../libk5crypto-b1f99d5c.so.3.1 | Bin 0 -> 219953 bytes .../libkeyutils-dfe70bd6.so.1.5 | Bin 0 -> 17913 bytes .../libkrb5-fcafa220.so.3.3 | Bin 0 -> 1018953 bytes .../libkrb5support-d0bcff84.so.0.1 | Bin 0 -> 76873 bytes .../liblber-e0f57070.so.2.0.200 | Bin 0 -> 60977 bytes .../libldap-c37ed727.so.2.0.200 | Bin 0 -> 447313 bytes .../libpcre-9513aab5.so.1.2.0 | Bin 0 -> 406817 bytes .../libpq-e8a033dd.so.5.16 | Bin 0 -> 370761 bytes .../libsasl2-883649fd.so.3.0.0 | Bin 0 -> 119217 bytes .../libselinux-0922c95c.so.1 | Bin 0 -> 178337 bytes .../libssl-3e69114b.so.1.1 | Bin 0 -> 646065 bytes .../pulumi-3.142.0.dist-info/INSTALLER | 1 + .../pulumi-3.142.0.dist-info/METADATA | 212 + .../pulumi-3.142.0.dist-info/RECORD | 217 + .../pulumi-3.142.0.dist-info/REQUESTED | 0 .../pulumi-3.142.0.dist-info/WHEEL | 5 + .../pulumi-3.142.0.dist-info/top_level.txt | 1 + .../site-packages/pulumi/__init__.py | 195 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2567 bytes .../pulumi/__pycache__/_types.cpython-312.pyc | Bin 0 -> 28850 bytes .../pulumi/__pycache__/_utils.cpython-312.pyc | Bin 0 -> 15299 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 345 bytes .../pulumi/__pycache__/asset.cpython-312.pyc | Bin 0 -> 5584 bytes .../pulumi/__pycache__/config.cpython-312.pyc | Bin 0 -> 30008 bytes .../__pycache__/deprecated.cpython-312.pyc | Bin 0 -> 1979 bytes .../pulumi/__pycache__/errors.cpython-312.pyc | Bin 0 -> 2160 bytes .../pulumi/__pycache__/invoke.cpython-312.pyc | Bin 0 -> 11935 bytes .../pulumi/__pycache__/log.cpython-312.pyc | Bin 0 -> 5215 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 886 bytes .../pulumi/__pycache__/output.cpython-312.pyc | Bin 0 -> 55736 bytes .../__pycache__/resource.cpython-312.pyc | Bin 0 -> 43399 bytes .../stack_reference.cpython-312.pyc | Bin 0 -> 7683 bytes .../pulumi/__pycache__/urn.cpython-312.pyc | Bin 0 -> 1249 bytes .../python3.12/site-packages/pulumi/_types.py | 1107 + .../python3.12/site-packages/pulumi/_utils.py | 348 + .../site-packages/pulumi/_version.py | 20 + .../python3.12/site-packages/pulumi/asset.py | 124 + .../pulumi/automation/__init__.py | 256 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6439 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 12757 bytes .../__pycache__/_config.cpython-312.pyc | Bin 0 -> 1233 bytes .../__pycache__/_env.cpython-312.pyc | Bin 0 -> 281 bytes .../_local_workspace.cpython-312.pyc | Bin 0 -> 41981 bytes .../_minimum_version.cpython-312.pyc | Bin 0 -> 350 bytes .../__pycache__/_output.cpython-312.pyc | Bin 0 -> 1072 bytes .../_project_settings.cpython-312.pyc | Bin 0 -> 10814 bytes .../__pycache__/_remote_stack.cpython-312.pyc | Bin 0 -> 6742 bytes .../_remote_workspace.cpython-312.pyc | Bin 0 -> 7571 bytes .../_representable.cpython-312.pyc | Bin 0 -> 924 bytes .../__pycache__/_server.cpython-312.pyc | Bin 0 -> 8369 bytes .../__pycache__/_stack.cpython-312.pyc | Bin 0 -> 55094 bytes .../_stack_settings.cpython-312.pyc | Bin 0 -> 3128 bytes .../__pycache__/_tag.cpython-312.pyc | Bin 0 -> 298 bytes .../__pycache__/_workspace.cpython-312.pyc | Bin 0 -> 19407 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 4832 bytes .../__pycache__/events.cpython-312.pyc | Bin 0 -> 25810 bytes .../site-packages/pulumi/automation/_cmd.py | 288 + .../pulumi/automation/_config.py | 38 + .../site-packages/pulumi/automation/_env.py | 15 + .../pulumi/automation/_local_workspace.py | 907 + .../pulumi/automation/_minimum_version.py | 17 + .../pulumi/automation/_output.py | 31 + .../pulumi/automation/_project_settings.py | 263 + .../pulumi/automation/_remote_stack.py | 155 + .../pulumi/automation/_remote_workspace.py | 243 + .../pulumi/automation/_representable.py | 24 + .../pulumi/automation/_server.py | 137 + .../site-packages/pulumi/automation/_stack.py | 1162 + .../pulumi/automation/_stack_settings.py | 85 + .../site-packages/pulumi/automation/_tag.py | 18 + .../pulumi/automation/_workspace.py | 492 + .../site-packages/pulumi/automation/errors.py | 98 + .../site-packages/pulumi/automation/events.py | 629 + .../python3.12/site-packages/pulumi/config.py | 623 + .../site-packages/pulumi/deprecated.py | 54 + .../site-packages/pulumi/dynamic/__init__.py | 47 + .../site-packages/pulumi/dynamic/__main__.py | 258 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 614 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 13063 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 2081 bytes .../__pycache__/dynamic.cpython-312.pyc | Bin 0 -> 12228 bytes .../site-packages/pulumi/dynamic/config.py | 37 + .../site-packages/pulumi/dynamic/dynamic.py | 356 + .../python3.12/site-packages/pulumi/errors.py | 52 + .../python3.12/site-packages/pulumi/invoke.py | 339 + .../python3.12/site-packages/pulumi/log.py | 154 + .../site-packages/pulumi/metadata.py | 38 + .../python3.12/site-packages/pulumi/output.py | 1058 + .../site-packages/pulumi/policy/__init__.py | 17 + .../site-packages/pulumi/policy/__main__.py | 73 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 291 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 2989 bytes .../site-packages/pulumi/provider/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 443 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 5065 bytes .../__pycache__/server.cpython-312.pyc | Bin 0 -> 26450 bytes .../site-packages/pulumi/provider/provider.py | 137 + .../site-packages/pulumi/provider/server.py | 518 + .../python3.12/site-packages/pulumi/py.typed | 0 .../site-packages/pulumi/resource.py | 1321 + .../site-packages/pulumi/runtime/__init__.py | 110 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1430 bytes .../__pycache__/_callbacks.cpython-312.pyc | Bin 0 -> 18630 bytes .../__pycache__/_depends_on.cpython-312.pyc | Bin 0 -> 2159 bytes .../runtime/__pycache__/_json.cpython-312.pyc | Bin 0 -> 1689 bytes .../_serialization.cpython-312.pyc | Bin 0 -> 2820 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 4047 bytes .../__pycache__/invoke.cpython-312.pyc | Bin 0 -> 19754 bytes .../__pycache__/known_types.cpython-312.pyc | Bin 0 -> 3180 bytes .../runtime/__pycache__/mocks.cpython-312.pyc | Bin 0 -> 15149 bytes .../__pycache__/resource.cpython-312.pyc | Bin 0 -> 44473 bytes .../resource_cycle_breaker.cpython-312.pyc | Bin 0 -> 2133 bytes .../runtime/__pycache__/rpc.cpython-312.pyc | Bin 0 -> 52691 bytes .../__pycache__/rpc_manager.cpython-312.pyc | Bin 0 -> 3567 bytes .../__pycache__/settings.cpython-312.pyc | Bin 0 -> 15608 bytes .../runtime/__pycache__/stack.cpython-312.pyc | Bin 0 -> 13830 bytes .../__pycache__/sync_await.cpython-312.pyc | Bin 0 -> 2526 bytes .../pulumi/runtime/_callbacks.py | 465 + .../pulumi/runtime/_depends_on.py | 64 + .../site-packages/pulumi/runtime/_json.py | 47 + .../pulumi/runtime/_serialization.py | 89 + .../site-packages/pulumi/runtime/config.py | 114 + .../site-packages/pulumi/runtime/invoke.py | 500 + .../pulumi/runtime/known_types.py | 99 + .../site-packages/pulumi/runtime/mocks.py | 316 + .../pulumi/runtime/proto/__init__.py | 31 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 734 bytes .../__pycache__/alias_pb2.cpython-312.pyc | Bin 0 -> 1604 bytes .../alias_pb2_grpc.cpython-312.pyc | Bin 0 -> 323 bytes .../__pycache__/analyzer_pb2.cpython-312.pyc | Bin 0 -> 6486 bytes .../analyzer_pb2_grpc.cpython-312.pyc | Bin 0 -> 11155 bytes .../__pycache__/callback_pb2.cpython-312.pyc | Bin 0 -> 1822 bytes .../callback_pb2_grpc.cpython-312.pyc | Bin 0 -> 3495 bytes .../__pycache__/converter_pb2.cpython-312.pyc | Bin 0 -> 2607 bytes .../converter_pb2_grpc.cpython-312.pyc | Bin 0 -> 5028 bytes .../__pycache__/engine_pb2.cpython-312.pyc | Bin 0 -> 2819 bytes .../engine_pb2_grpc.cpython-312.pyc | Bin 0 -> 7971 bytes .../__pycache__/errors_pb2.cpython-312.pyc | Bin 0 -> 1715 bytes .../errors_pb2_grpc.cpython-312.pyc | Bin 0 -> 324 bytes .../__pycache__/language_pb2.cpython-312.pyc | Bin 0 -> 10656 bytes .../language_pb2_grpc.cpython-312.pyc | Bin 0 -> 19230 bytes .../__pycache__/plugin_pb2.cpython-312.pyc | Bin 0 -> 1894 bytes .../plugin_pb2_grpc.cpython-312.pyc | Bin 0 -> 324 bytes .../__pycache__/provider_pb2.cpython-312.pyc | Bin 0 -> 13787 bytes .../provider_pb2_grpc.cpython-312.pyc | Bin 0 -> 40331 bytes .../__pycache__/resource_pb2.cpython-312.pyc | Bin 0 -> 11905 bytes .../resource_pb2_grpc.cpython-312.pyc | Bin 0 -> 15783 bytes .../__pycache__/source_pb2.cpython-312.pyc | Bin 0 -> 1418 bytes .../source_pb2_grpc.cpython-312.pyc | Bin 0 -> 324 bytes .../__pycache__/status_pb2.cpython-312.pyc | Bin 0 -> 1632 bytes .../status_pb2_grpc.cpython-312.pyc | Bin 0 -> 324 bytes .../pulumi/runtime/proto/alias_pb2.py | 28 + .../pulumi/runtime/proto/alias_pb2.pyi | 87 + .../pulumi/runtime/proto/alias_pb2_grpc.py | 4 + .../pulumi/runtime/proto/alias_pb2_grpc.pyi | 17 + .../pulumi/runtime/proto/analyzer_pb2.py | 75 + .../pulumi/runtime/proto/analyzer_pb2.pyi | 621 + .../pulumi/runtime/proto/analyzer_pb2_grpc.py | 255 + .../runtime/proto/analyzer_pb2_grpc.pyi | 129 + .../pulumi/runtime/proto/callback_pb2.py | 32 + .../pulumi/runtime/proto/callback_pb2.pyi | 84 + .../pulumi/runtime/proto/callback_pb2_grpc.py | 70 + .../runtime/proto/callback_pb2_grpc.pyi | 45 + .../pulumi/runtime/proto/codegen/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 447 bytes .../__pycache__/hcl_pb2.cpython-312.pyc | Bin 0 -> 1990 bytes .../__pycache__/hcl_pb2_grpc.cpython-312.pyc | Bin 0 -> 329 bytes .../__pycache__/loader_pb2.cpython-312.pyc | Bin 0 -> 1907 bytes .../loader_pb2_grpc.cpython-312.pyc | Bin 0 -> 3574 bytes .../__pycache__/mapper_pb2.cpython-312.pyc | Bin 0 -> 1705 bytes .../mapper_pb2_grpc.cpython-312.pyc | Bin 0 -> 3538 bytes .../pulumi/runtime/proto/codegen/hcl_pb2.py | 32 + .../pulumi/runtime/proto/codegen/hcl_pb2.pyi | 180 + .../runtime/proto/codegen/hcl_pb2_grpc.py | 4 + .../runtime/proto/codegen/hcl_pb2_grpc.pyi | 17 + .../runtime/proto/codegen/loader_pb2.py | 32 + .../runtime/proto/codegen/loader_pb2.pyi | 104 + .../runtime/proto/codegen/loader_pb2_grpc.py | 73 + .../runtime/proto/codegen/loader_pb2_grpc.pyi | 47 + .../runtime/proto/codegen/mapper_pb2.py | 30 + .../runtime/proto/codegen/mapper_pb2.pyi | 72 + .../runtime/proto/codegen/mapper_pb2_grpc.py | 73 + .../runtime/proto/codegen/mapper_pb2_grpc.pyi | 47 + .../pulumi/runtime/proto/converter_pb2.py | 37 + .../pulumi/runtime/proto/converter_pb2.pyi | 172 + .../runtime/proto/converter_pb2_grpc.py | 107 + .../runtime/proto/converter_pb2_grpc.pyi | 61 + .../pulumi/runtime/proto/engine_pb2.py | 42 + .../pulumi/runtime/proto/engine_pb2.pyi | 176 + .../pulumi/runtime/proto/engine_pb2_grpc.py | 181 + .../pulumi/runtime/proto/engine_pb2_grpc.pyi | 96 + .../pulumi/runtime/proto/errors_pb2.py | 30 + .../pulumi/runtime/proto/errors_pb2.pyi | 89 + .../pulumi/runtime/proto/errors_pb2_grpc.py | 4 + .../pulumi/runtime/proto/errors_pb2_grpc.pyi | 17 + .../pulumi/runtime/proto/language_pb2.py | 130 + .../pulumi/runtime/proto/language_pb2.pyi | 869 + .../pulumi/runtime/proto/language_pb2_grpc.py | 449 + .../runtime/proto/language_pb2_grpc.pyi | 184 + .../pulumi/runtime/proto/plugin_pb2.py | 34 + .../pulumi/runtime/proto/plugin_pb2.pyi | 124 + .../pulumi/runtime/proto/plugin_pb2_grpc.py | 4 + .../pulumi/runtime/proto/plugin_pb2_grpc.pyi | 17 + .../pulumi/runtime/proto/provider_pb2.py | 151 + .../pulumi/runtime/proto/provider_pb2.pyi | 1783 + .../pulumi/runtime/proto/provider_pb2_grpc.py | 835 + .../runtime/proto/provider_pb2_grpc.pyi | 528 + .../pulumi/runtime/proto/resource_pb2.py | 126 + .../pulumi/runtime/proto/resource_pb2.pyi | 1104 + .../pulumi/runtime/proto/resource_pb2_grpc.py | 371 + .../runtime/proto/resource_pb2_grpc.pyi | 141 + .../pulumi/runtime/proto/source_pb2.py | 26 + .../pulumi/runtime/proto/source_pb2.pyi | 54 + .../pulumi/runtime/proto/source_pb2_grpc.py | 4 + .../pulumi/runtime/proto/source_pb2_grpc.pyi | 17 + .../pulumi/runtime/proto/status_pb2.py | 27 + .../pulumi/runtime/proto/status_pb2.pyi | 115 + .../pulumi/runtime/proto/status_pb2_grpc.py | 4 + .../pulumi/runtime/proto/status_pb2_grpc.pyi | 17 + .../site-packages/pulumi/runtime/resource.py | 1231 + .../pulumi/runtime/resource_cycle_breaker.py | 69 + .../site-packages/pulumi/runtime/rpc.py | 1584 + .../pulumi/runtime/rpc_manager.py | 90 + .../site-packages/pulumi/runtime/settings.py | 396 + .../site-packages/pulumi/runtime/stack.py | 363 + .../pulumi/runtime/sync_await.py | 77 + .../site-packages/pulumi/stack_reference.py | 175 + .../python3.12/site-packages/pulumi/urn.py | 41 + .../pulumi_docker-4.5.7.dist-info/INSTALLER | 1 + .../pulumi_docker-4.5.7.dist-info/METADATA | 63 + .../pulumi_docker-4.5.7.dist-info/RECORD | 59 + .../pulumi_docker-4.5.7.dist-info/REQUESTED | 0 .../pulumi_docker-4.5.7.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/pulumi_docker/__init__.py | 139 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2812 bytes .../__pycache__/_enums.cpython-312.pyc | Bin 0 -> 614 bytes .../__pycache__/_inputs.cpython-312.pyc | Bin 0 -> 313519 bytes .../__pycache__/_utilities.cpython-312.pyc | Bin 0 -> 13760 bytes .../__pycache__/container.cpython-312.pyc | Bin 0 -> 196563 bytes .../__pycache__/get_logs.cpython-312.pyc | Bin 0 -> 14045 bytes .../__pycache__/get_network.cpython-312.pyc | Bin 0 -> 8762 bytes .../__pycache__/get_plugin.cpython-312.pyc | Bin 0 -> 9174 bytes .../get_registry_image.cpython-312.pyc | Bin 0 -> 7313 bytes .../get_remote_image.cpython-312.pyc | Bin 0 -> 6490 bytes .../__pycache__/image.cpython-312.pyc | Bin 0 -> 25421 bytes .../__pycache__/network.cpython-312.pyc | Bin 0 -> 43555 bytes .../__pycache__/outputs.cpython-312.pyc | Bin 0 -> 202442 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 31900 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 16032 bytes .../registry_image.cpython-312.pyc | Bin 0 -> 19818 bytes .../__pycache__/remote_image.cpython-312.pyc | Bin 0 -> 34839 bytes .../__pycache__/secret.cpython-312.pyc | Bin 0 -> 13925 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 33187 bytes .../service_config.cpython-312.pyc | Bin 0 -> 11750 bytes .../__pycache__/tag.cpython-312.pyc | Bin 0 -> 12464 bytes .../__pycache__/volume.cpython-312.pyc | Bin 0 -> 20320 bytes .../site-packages/pulumi_docker/_enums.py | 23 + .../site-packages/pulumi_docker/_inputs.py | 6201 ++ .../site-packages/pulumi_docker/_utilities.py | 327 + .../pulumi_docker/config/__init__.py | 8 + .../pulumi_docker/config/__init__.pyi | 49 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 370 bytes .../__pycache__/outputs.cpython-312.pyc | Bin 0 -> 4937 bytes .../config/__pycache__/vars.cpython-312.pyc | Bin 0 -> 3267 bytes .../pulumi_docker/config/outputs.py | 94 + .../pulumi_docker/config/vars.py | 69 + .../site-packages/pulumi_docker/container.py | 3233 + .../site-packages/pulumi_docker/get_logs.py | 268 + .../pulumi_docker/get_network.py | 183 + .../site-packages/pulumi_docker/get_plugin.py | 194 + .../pulumi_docker/get_registry_image.py | 152 + .../pulumi_docker/get_remote_image.py | 140 + .../site-packages/pulumi_docker/image.py | 458 + .../site-packages/pulumi_docker/network.py | 781 + .../site-packages/pulumi_docker/outputs.py | 4170 ++ .../site-packages/pulumi_docker/plugin.py | 574 + .../site-packages/pulumi_docker/provider.py | 263 + .../pulumi_docker/pulumi-plugin.json | 5 + .../site-packages/pulumi_docker/py.typed | 0 .../pulumi_docker/registry_image.py | 321 + .../pulumi_docker/remote_image.py | 603 + .../site-packages/pulumi_docker/secret.py | 257 + .../site-packages/pulumi_docker/service.py | 633 + .../pulumi_docker/service_config.py | 262 + .../site-packages/pulumi_docker/tag.py | 227 + .../site-packages/pulumi_docker/volume.py | 405 + .../semver-2.13.0.dist-info/INSTALLER | 1 + .../semver-2.13.0.dist-info/LICENSE.txt | 27 + .../semver-2.13.0.dist-info/METADATA | 146 + .../semver-2.13.0.dist-info/RECORD | 10 + .../semver-2.13.0.dist-info/WHEEL | 6 + .../semver-2.13.0.dist-info/entry_points.txt | 3 + .../semver-2.13.0.dist-info/top_level.txt | 1 + myenv/lib/python3.12/site-packages/semver.py | 1259 + .../six-1.17.0.dist-info/INSTALLER | 1 + .../six-1.17.0.dist-info/LICENSE | 18 + .../six-1.17.0.dist-info/METADATA | 43 + .../site-packages/six-1.17.0.dist-info/RECORD | 8 + .../site-packages/six-1.17.0.dist-info/WHEEL | 6 + .../six-1.17.0.dist-info/top_level.txt | 1 + myenv/lib/python3.12/site-packages/six.py | 1003 + .../python3.12/site-packages/yaml/__init__.py | 390 + .../yaml/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 15632 bytes .../yaml/__pycache__/composer.cpython-312.pyc | Bin 0 -> 6541 bytes .../__pycache__/constructor.cpython-312.pyc | Bin 0 -> 34934 bytes .../yaml/__pycache__/cyaml.cpython-312.pyc | Bin 0 -> 4642 bytes .../yaml/__pycache__/dumper.cpython-312.pyc | Bin 0 -> 2478 bytes .../yaml/__pycache__/emitter.cpython-312.pyc | Bin 0 -> 50182 bytes .../yaml/__pycache__/error.cpython-312.pyc | Bin 0 -> 4284 bytes .../yaml/__pycache__/events.cpython-312.pyc | Bin 0 -> 4726 bytes .../yaml/__pycache__/loader.cpython-312.pyc | Bin 0 -> 3540 bytes .../yaml/__pycache__/nodes.cpython-312.pyc | Bin 0 -> 2225 bytes .../yaml/__pycache__/parser.cpython-312.pyc | Bin 0 -> 24730 bytes .../yaml/__pycache__/reader.cpython-312.pyc | Bin 0 -> 8860 bytes .../__pycache__/representer.cpython-312.pyc | Bin 0 -> 16933 bytes .../yaml/__pycache__/resolver.cpython-312.pyc | Bin 0 -> 9077 bytes .../yaml/__pycache__/scanner.cpython-312.pyc | Bin 0 -> 49868 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 0 -> 6215 bytes .../yaml/__pycache__/tokens.cpython-312.pyc | Bin 0 -> 5795 bytes .../_yaml.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 2481784 bytes .../python3.12/site-packages/yaml/composer.py | 139 + .../site-packages/yaml/constructor.py | 748 + .../python3.12/site-packages/yaml/cyaml.py | 101 + .../python3.12/site-packages/yaml/dumper.py | 62 + .../python3.12/site-packages/yaml/emitter.py | 1137 + .../python3.12/site-packages/yaml/error.py | 75 + .../python3.12/site-packages/yaml/events.py | 86 + .../python3.12/site-packages/yaml/loader.py | 63 + .../python3.12/site-packages/yaml/nodes.py | 49 + .../python3.12/site-packages/yaml/parser.py | 589 + .../python3.12/site-packages/yaml/reader.py | 185 + .../site-packages/yaml/representer.py | 389 + .../python3.12/site-packages/yaml/resolver.py | 227 + .../python3.12/site-packages/yaml/scanner.py | 1435 + .../site-packages/yaml/serializer.py | 111 + .../python3.12/site-packages/yaml/tokens.py | 104 + myenv/lib64 | 1 + myenv/pyvenv.cfg | 5 + 2455 files changed, 586200 insertions(+) create mode 100644 .vscode/config.json create mode 100644 .vscode/deploy.yml create mode 100644 .vscode/docker/backup.dockerfile create mode 100644 .vscode/docker/exporter.dockerfile create mode 100644 .vscode/docker/odoo.dockerfile create mode 100644 .vscode/entrypoint_backup.sh create mode 100644 .vscode/entrypoint_odoo.sh create mode 100644 .vscode/fluent.conf create mode 100644 .vscode/inventory/hosts create mode 100644 .vscode/notes.txt create mode 100644 .vscode/odoo.conf create mode 100644 .vscode/pg_metrics_exporter.py create mode 100644 .vscode/prometheus.yml create mode 100644 .vscode/roles/docker-compose/files/docker-compose.yml create mode 100644 .vscode/roles/docker-compose/tasks/main.yml create mode 100644 .vscode/roles/docker-compose/templates/environment.j2 create mode 100644 .vscode/settings.json create mode 100644 myenv/bin/Activate.ps1 create mode 100644 myenv/bin/activate create mode 100644 myenv/bin/activate.csh create mode 100644 myenv/bin/activate.fish create mode 100644 myenv/bin/debugpy create mode 100644 myenv/bin/get_gprof create mode 100644 myenv/bin/get_objgraph create mode 100644 myenv/bin/pip create mode 100644 myenv/bin/pip3 create mode 100644 myenv/bin/pip3.12 create mode 100644 myenv/bin/pysemver create mode 120000 myenv/bin/python create mode 120000 myenv/bin/python3 create mode 120000 myenv/bin/python3.12 create mode 100644 myenv/bin/undill create mode 100644 myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/AUTHORS.md create mode 100644 myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/__pycache__/semver.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/_yaml/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/_yaml/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/__pycache__/cleanpeg.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/__pycache__/export.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/__pycache__/peg.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/__pycache__/utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/cleanpeg.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/export.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/peg.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_decorator_combine.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_default_semantic_action.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_eolterm.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_error_reporting.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_examples.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_exporter.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_flags.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_parser_params.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_parser_resilience.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_parsing_expressions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_pathologic_models.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_peg_parser.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_position.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_ptnode_navigation_expressions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_python_parser.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_reduce_tree.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_semantic_action_results.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_separators.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_sequence_params.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_suppression.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_unicode.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_visitor.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/test_direct_rule_call.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/test_memoization.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/__pycache__/test_issue_16.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/test_issue_16.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/__pycache__/test_issue_20.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/test_issue_20.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/__pycache__/test_issue_22.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/grammar1.peg create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/grammar2.peg create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/test_issue_22.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/__pycache__/test_issue_26.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/test_issue_26.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/__pycache__/test_issue_31.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/test_issue_31.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__pycache__/test_issue_32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/test_issue_32.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__pycache__/test_issue43.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/test_issue43.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_61/__pycache__/test_issue_61.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_61/test_issue_61.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_73/__pycache__/test_issue_73.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_73/test_issue_73.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/test_direct_rule_call.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/test_memoization.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_decorator_combine.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_default_semantic_action.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_eolterm.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_error_reporting.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_examples.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_exporter.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_flags.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_parser_params.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_parser_resilience.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_parsing_expressions.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_pathologic_models.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_peg_parser.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_position.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_ptnode_navigation_expressions.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_python_parser.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_reduce_tree.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_semantic_action_results.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_separators.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_sequence_params.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_suppression.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_unicode.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/tests/test_visitor.py create mode 100644 myenv/lib/python3.12/site-packages/arpeggio/utils.py create mode 100644 myenv/lib/python3.12/site-packages/attr/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/attr/__init__.pyi create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/_compat.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/exceptions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attr/_cmp.py create mode 100644 myenv/lib/python3.12/site-packages/attr/_cmp.pyi create mode 100644 myenv/lib/python3.12/site-packages/attr/_compat.py create mode 100644 myenv/lib/python3.12/site-packages/attr/_config.py create mode 100644 myenv/lib/python3.12/site-packages/attr/_funcs.py create mode 100644 myenv/lib/python3.12/site-packages/attr/_make.py create mode 100644 myenv/lib/python3.12/site-packages/attr/_next_gen.py create mode 100644 myenv/lib/python3.12/site-packages/attr/_typing_compat.pyi create mode 100644 myenv/lib/python3.12/site-packages/attr/_version_info.py create mode 100644 myenv/lib/python3.12/site-packages/attr/_version_info.pyi create mode 100644 myenv/lib/python3.12/site-packages/attr/converters.py create mode 100644 myenv/lib/python3.12/site-packages/attr/converters.pyi create mode 100644 myenv/lib/python3.12/site-packages/attr/exceptions.py create mode 100644 myenv/lib/python3.12/site-packages/attr/exceptions.pyi create mode 100644 myenv/lib/python3.12/site-packages/attr/filters.py create mode 100644 myenv/lib/python3.12/site-packages/attr/filters.pyi create mode 100644 myenv/lib/python3.12/site-packages/attr/py.typed create mode 100644 myenv/lib/python3.12/site-packages/attr/setters.py create mode 100644 myenv/lib/python3.12/site-packages/attr/setters.pyi create mode 100644 myenv/lib/python3.12/site-packages/attr/validators.py create mode 100644 myenv/lib/python3.12/site-packages/attr/validators.pyi create mode 100644 myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/licenses/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/attrs/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/attrs/__init__.pyi create mode 100644 myenv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attrs/__pycache__/converters.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attrs/__pycache__/filters.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/attrs/converters.py create mode 100644 myenv/lib/python3.12/site-packages/attrs/exceptions.py create mode 100644 myenv/lib/python3.12/site-packages/attrs/filters.py create mode 100644 myenv/lib/python3.12/site-packages/attrs/py.typed create mode 100644 myenv/lib/python3.12/site-packages/attrs/setters.py create mode 100644 myenv/lib/python3.12/site-packages/attrs/validators.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/entry_points.txt create mode 100644 myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/debugpy/ThirdPartyNotices.txt create mode 100644 myenv/lib/python3.12/site-packages/debugpy/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/__pycache__/_version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/__pycache__/public_api.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/_pydevd_packaging.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/_util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/force_pydevd.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/_pydevd_packaging.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/_util.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/force_pydevd.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_app_engine_debug_startup.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_coverage.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_pysrc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_run_in_console.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevconsole.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd_file_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd_tracing.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/setup_pydevd_cython.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_calltip_util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_completer.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_execfile.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_filesystem_encoding.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_getopt.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_imports_tipper.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_jy_imports_tipper.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_log.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_saved_modules.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_sys_patch.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_tipper_common.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_console_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_import_hook.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_imports.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_ipython_console.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_ipython_console_011.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_is_thread_alive.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_localhost.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_log.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_monkey.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_monkey_qt.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_override.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_umd.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_versioncheck.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_calltip_util.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_completer.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_execfile.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_filesystem_encoding.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_getopt.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_imports_tipper.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_jy_imports_tipper.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_log.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_saved_modules.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_sys_patch.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_tipper_common.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_console_utils.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_import_hook.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_imports.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console_011.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_is_thread_alive.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_localhost.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_log.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey_qt.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_override.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_umd.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_versioncheck.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_coverage.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_nose.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_parallel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_parallel_client.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_pytest2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_unittest.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_xml_rpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_coverage.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_nose.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel_client.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_pytest2.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_unittest.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_xml_rpc.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevconsole_code.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_additional_thread_info.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_additional_thread_info_regular.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_api.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_breakpoints.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_bytecode_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_bytecode_utils_py311.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_code_to_source.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_collect_bytecode_info.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_comm.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_comm_constants.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_command_line_handling.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_console.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_constants.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_custom_frames.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_cython_wrapper.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_daemon_thread.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_defaults.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_dont_trace.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_dont_trace_files.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_exec2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_extension_api.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_extension_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_filtering.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_frame.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_frame_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_gevent_integration.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_import_class.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_io.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_json_debug_options.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command_factory_json.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command_factory_xml.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_plugin_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_process_net_command.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_process_net_command_json.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_referrers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_reload.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_resolver.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_runpy.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_safe_repr.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_save_locals.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_signature.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_source_mapping.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_stackless.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_suspended_frames.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_thread_lifecycle.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_timeout.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_trace_dispatch.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_trace_dispatch_regular.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_traceproperty.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_vars.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_vm_type.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_xml.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__main__pydevd_gen_debug_adapter_protocol.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/__main__pydevd_gen_debug_adapter_protocol.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_base_schema.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_schema.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_schema_log.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocol.json create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocolCustom.json create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_base_schema.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema_log.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevconsole_code.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info_regular.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_api.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_breakpoints.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils_py311.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_code_to_source.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_collect_bytecode_info.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm_constants.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_command_line_handling.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/pydevd_concurrency_logger.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/pydevd_thread_wrappers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_concurrency_logger.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_thread_wrappers.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_console.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_constants.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_custom_frames.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.c create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.cpython-312-x86_64-linux-gnu.so create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython_wrapper.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_defaults.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace_files.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_exec2.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_api.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_utils.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame_utils.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_gevent_integration.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_import_class.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_io.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_json_debug_options.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_json.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_xml.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_plugin_utils.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_referrers.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_reload.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_safe_repr.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_save_locals.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_signature.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_source_mapping.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_stackless.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_suspended_frames.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_thread_lifecycle.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_timeout.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch_regular.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_traceproperty.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_utils.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vars.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vm_type.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_xml.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/.gitignore create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_eval_cython_wrapper.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_eval_main.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_tracing.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_modify_bytecode.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_cython_wrapper.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_main.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.c create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_tracing.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_modify_bytecode.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/release_mem.h create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/README.txt create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__pycache__/pydevd_fix_code.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/COPYING create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/REQUESTED create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/direct_url.json create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/bytecode.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/cfg.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/concrete.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/flags.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/instr.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/peephole_opt.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/bytecode.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/cfg.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/concrete.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/flags.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/instr.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/peephole_opt.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_bytecode.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_cfg.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_code.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_concrete.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_flags.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_instr.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_misc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_peephole_opt.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/util_annotation.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/util_annotation.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/pydevd_fix_code.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/__pycache__/_pydevd_sys_monitoring.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/__pycache__/pydevd_sys_monitoring.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.c create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.cpython-312-x86_64-linux-gnu.so create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pxd create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pyx create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/pydevd_sys_monitoring.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_app_engine_debug_startup.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_coverage.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/README create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhook.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookglut.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookgtk.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookgtk3.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookpyglet.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt4.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt5.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt6.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhooktk.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookwx.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/matplotlibtools.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt_for_kernel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt_loaders.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhook.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookglut.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk3.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookpyglet.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt4.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt5.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt6.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhooktk.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookwx.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/matplotlibtools.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt_for_kernel.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt_loaders.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/version.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_pysrc.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_run_in_console.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/__not_in_default_pythonpath.txt create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/__pycache__/sitecustomize.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/sitecustomize.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevconsole.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/README.txt create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_always_live_program.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_check.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_test_attach_to_process.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_test_attach_to_process_linux.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/add_code_to_python_process.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/attach_pydevd.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/attach_script.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/_always_live_program.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/_check.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/_test_attach_to_process.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/_test_attach_to_process_linux.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_linux_amd64.so create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_pydevd.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_script.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_310.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_311.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_common.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_settrace.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_utils.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/python.h create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/ref_utils.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/.gitignore create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/__pycache__/lldb_prepare.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/attach.cpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_mac.sh create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_manylinux.cmd create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/lldb_prepare.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/breakpoint.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/compat.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/crash.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/debug.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/disasm.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/event.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/interactive.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/module.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/process.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/registry.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/search.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/sql.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/system.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/textio.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/thread.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/window.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/breakpoint.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/compat.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/crash.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/debug.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/disasm.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/event.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/interactive.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/module.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/process.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/registry.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/search.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/sql.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/system.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/textio.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/thread.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/util.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/advapi32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/context_amd64.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/context_i386.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/dbghelp.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/defines.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/gdi32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/kernel32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/ntdll.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/peb_teb.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/psapi.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/shell32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/shlwapi.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/user32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/wtsapi32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/advapi32.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_amd64.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_i386.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/dbghelp.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/defines.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/gdi32.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/kernel32.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/ntdll.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/peb_teb.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/psapi.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shell32.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shlwapi.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/user32.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/version.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/wtsapi32.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/window.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.cpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.h create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/compile_windows.bat create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/inject_dll.cpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/py_win_helpers.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_in_memory.hpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_on_dllmain.cpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.cpp create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.h create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/targetver.h create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_file_utils.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/django_debug.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/jinja2_debug.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/pydevd_line_validation.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/django_debug.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/README.md create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_helpers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugin_numpy_types.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugin_pandas_types.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugins_django_form_str.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_helpers.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_numpy_types.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_pandas_types.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugins_django_form_str.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/jinja2_debug.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/pydevd_line_validation.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_tracing.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/setup_pydevd_cython.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/_version.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/clients.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/components.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/launchers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/servers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/sessions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/clients.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/components.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/launchers.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/servers.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/adapter/sessions.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/json.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/log.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/messaging.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/singleton.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/sockets.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/stacks.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/timestamp.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/json.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/log.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/messaging.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/singleton.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/sockets.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/stacks.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/timestamp.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/common/util.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/debuggee.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/handlers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/output.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/winapi.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/debuggee.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/handlers.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/output.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/launcher/winapi.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/public_api.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/server/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/api.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/attach_pid_injected.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/cli.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/debugpy/server/api.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/server/attach_pid_injected.py create mode 100644 myenv/lib/python3.12/site-packages/debugpy/server/cli.py create mode 100644 myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/dill/__diff.py create mode 100644 myenv/lib/python3.12/site-packages/dill/__info__.py create mode 100644 myenv/lib/python3.12/site-packages/dill/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/__diff.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/__info__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/_dill.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/_objects.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/_shims.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/detect.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/logger.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/objtypes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/pointers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/session.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/settings.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/source.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/__pycache__/temp.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/_dill.py create mode 100644 myenv/lib/python3.12/site-packages/dill/_objects.py create mode 100644 myenv/lib/python3.12/site-packages/dill/_shims.py create mode 100644 myenv/lib/python3.12/site-packages/dill/detect.py create mode 100644 myenv/lib/python3.12/site-packages/dill/logger.py create mode 100644 myenv/lib/python3.12/site-packages/dill/objtypes.py create mode 100644 myenv/lib/python3.12/site-packages/dill/pointers.py create mode 100644 myenv/lib/python3.12/site-packages/dill/session.py create mode 100644 myenv/lib/python3.12/site-packages/dill/settings.py create mode 100644 myenv/lib/python3.12/site-packages/dill/source.py create mode 100644 myenv/lib/python3.12/site-packages/dill/temp.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_abc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_check.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_classdef.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_dataclasses.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_detect.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_dictviews.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_diff.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_extendpickle.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_fglobals.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_file.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functors.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_logger.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_mixins.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_module.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_moduledict.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_nested.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_objects.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_properties.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_pycapsule.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_recursive.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_registered.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_restricted.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_selected.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_session.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_source.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_sources.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_temp.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_threads.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_weakref.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_abc.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_check.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_classdef.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_dataclasses.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_detect.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_dictviews.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_diff.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_extendpickle.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_fglobals.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_file.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_functions.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_functors.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_logger.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_mixins.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_module.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_moduledict.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_nested.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_objects.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_properties.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_pycapsule.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_recursive.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_registered.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_restricted.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_selected.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_session.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_source.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_sources.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_temp.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_threads.py create mode 100644 myenv/lib/python3.12/site-packages/dill/tests/test_weakref.py create mode 100644 myenv/lib/python3.12/site-packages/google/_upb/_message.abi3.so create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/any_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/api_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_database.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_pool.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/duration_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/empty_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/field_mask_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/json_format.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/message.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/message_factory.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/proto_builder.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/reflection.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/service.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/service_reflection.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/source_context_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/struct_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/symbol_database.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/text_encoding.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/text_format.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/timestamp_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/type_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/unknown_fields.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/wrappers_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/any_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/api_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/compiler/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/compiler/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/compiler/__pycache__/plugin_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/compiler/plugin_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/descriptor.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/descriptor_database.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/descriptor_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/descriptor_pool.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/duration_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/empty_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/field_mask_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/_parameterized.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/api_implementation.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/builder.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/containers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/decoder.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/encoder.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/enum_type_wrapper.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/extension_dict.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/field_mask.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/message_listener.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/python_message.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/testing_refleaks.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/type_checkers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/well_known_types.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/wire_format.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/_parameterized.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/api_implementation.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/builder.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/containers.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/decoder.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/encoder.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/enum_type_wrapper.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/extension_dict.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/field_mask.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/message_listener.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/python_message.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/testing_refleaks.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/type_checkers.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/well_known_types.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/internal/wire_format.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/json_format.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/message.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/message_factory.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/proto_builder.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/pyext/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/pyext/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/pyext/__pycache__/cpp_message.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/pyext/cpp_message.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/reflection.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/service.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/service_reflection.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/source_context_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/struct_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/symbol_database.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/testdata/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/testdata/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/text_encoding.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/text_format.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/timestamp_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/type_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/unknown_fields.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/util/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/util/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/google/protobuf/wrappers_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_auth.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_channel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_common.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_compression.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_grpcio_metadata.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_interceptor.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_observability.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_plugin_wrapping.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_runtime_protos.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_server.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_simple_stubs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_typing.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/__pycache__/_utilities.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/_auth.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_channel.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_common.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_compression.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_cython/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_cython/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/_cython/_credentials/roots.pem create mode 100644 myenv/lib/python3.12/site-packages/grpc/_cython/_cygrpc/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_cython/_cygrpc/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/_cython/cygrpc.cpython-312-x86_64-linux-gnu.so create mode 100644 myenv/lib/python3.12/site-packages/grpc/_grpcio_metadata.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_interceptor.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_observability.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_plugin_wrapping.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_runtime_protos.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_server.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_simple_stubs.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_typing.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/_utilities.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_call.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_channel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_server.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_call.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_channel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_interceptor.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_metadata.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_server.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_typing.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_base_call.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_base_channel.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_base_server.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_call.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_channel.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_interceptor.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_metadata.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_server.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_typing.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/aio/_utils.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_client_adaptations.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_metadata.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_server_adaptations.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/implementations.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/interfaces.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/utilities.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/_client_adaptations.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/_metadata.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/_server_adaptations.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/implementations.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/interfaces.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/beta/utilities.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/experimental/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/experimental/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/experimental/__pycache__/gevent.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/experimental/__pycache__/session_cache.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/experimental/aio/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/experimental/aio/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/experimental/gevent.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/experimental/session_cache.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/common/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/cardinality.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/style.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/common/cardinality.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/common/style.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/abandonment.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/callable_util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/future.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/logging_pool.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/stream.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/stream_util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/abandonment.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/callable_util.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/future.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/logging_pool.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/stream.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/foundation/stream_util.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/base.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/utilities.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/base.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/utilities.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__pycache__/face.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__pycache__/utilities.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/face.py create mode 100644 myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/utilities.py create mode 100644 myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/parver-0.5.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/parver-0.5.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/parver-0.5.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/parver-0.5.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/parver-0.5.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/parver-0.5.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/parver/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/parver/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/parver/__pycache__/_helpers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/parver/__pycache__/_parse.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/parver/__pycache__/_segments.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/parver/__pycache__/_typing.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/parver/__pycache__/_version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/parver/_helpers.py create mode 100644 myenv/lib/python3.12/site-packages/parver/_parse.py create mode 100644 myenv/lib/python3.12/site-packages/parver/_segments.py create mode 100644 myenv/lib/python3.12/site-packages/parver/_typing.py create mode 100644 myenv/lib/python3.12/site-packages/parver/_version.py create mode 100644 myenv/lib/python3.12/site-packages/parver/py.typed create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt create mode 100644 myenv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/six.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 myenv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 myenv/lib/python3.12/site-packages/pip/py.typed create mode 100644 myenv/lib/python3.12/site-packages/protobuf-4.25.5.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/protobuf-4.25.5.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/protobuf-4.25.5.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/protobuf-4.25.5.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/protobuf-4.25.5.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/psycopg2-2.9.10.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/psycopg2-2.9.10.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/psycopg2-2.9.10.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/psycopg2-2.9.10.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/psycopg2-2.9.10.dist-info/REQUESTED create mode 100644 myenv/lib/python3.12/site-packages/psycopg2-2.9.10.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/psycopg2-2.9.10.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/_ipaddress.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/_json.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/_range.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/errorcodes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/errors.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/extensions.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/extras.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/pool.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/sql.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/__pycache__/tz.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/_ipaddress.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/_json.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/_psycopg.cpython-312-x86_64-linux-gnu.so create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/_range.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/errorcodes.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/errors.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/extensions.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/extras.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/pool.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/sql.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2/tz.py create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/REQUESTED create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libcom_err-2abe824b.so.2.1 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libcrypto-ea28cefb.so.1.1 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libgssapi_krb5-497db0c6.so.2.2 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libk5crypto-b1f99d5c.so.3.1 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libkeyutils-dfe70bd6.so.1.5 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libkrb5-fcafa220.so.3.3 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libkrb5support-d0bcff84.so.0.1 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/liblber-e0f57070.so.2.0.200 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libldap-c37ed727.so.2.0.200 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libpcre-9513aab5.so.1.2.0 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libpq-e8a033dd.so.5.16 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libsasl2-883649fd.so.3.0.0 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libselinux-0922c95c.so.1 create mode 100644 myenv/lib/python3.12/site-packages/psycopg2_binary.libs/libssl-3e69114b.so.1.1 create mode 100644 myenv/lib/python3.12/site-packages/pulumi-3.142.0.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/pulumi-3.142.0.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/pulumi-3.142.0.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/pulumi-3.142.0.dist-info/REQUESTED create mode 100644 myenv/lib/python3.12/site-packages/pulumi-3.142.0.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/pulumi-3.142.0.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/_types.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/_utils.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/_version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/asset.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/config.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/deprecated.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/errors.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/invoke.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/log.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/metadata.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/output.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/resource.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/stack_reference.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/__pycache__/urn.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/_types.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/_utils.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/_version.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/asset.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_cmd.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_config.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_env.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_local_workspace.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_minimum_version.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_output.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_project_settings.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_remote_stack.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_remote_workspace.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_representable.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_server.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_stack.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_stack_settings.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_tag.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/_workspace.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/errors.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/__pycache__/events.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_cmd.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_config.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_env.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_local_workspace.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_minimum_version.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_output.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_project_settings.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_remote_stack.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_remote_workspace.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_representable.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_server.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_stack.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_stack_settings.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_tag.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/_workspace.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/errors.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/automation/events.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/config.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/deprecated.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/dynamic/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/dynamic/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/dynamic/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/dynamic/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/dynamic/__pycache__/config.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/dynamic/__pycache__/dynamic.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/dynamic/config.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/dynamic/dynamic.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/errors.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/invoke.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/log.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/metadata.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/output.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/policy/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/policy/__main__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/policy/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/policy/__pycache__/__main__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/provider/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/provider/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/provider/__pycache__/provider.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/provider/__pycache__/server.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/provider/provider.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/provider/server.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/py.typed create mode 100644 myenv/lib/python3.12/site-packages/pulumi/resource.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/_callbacks.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/_depends_on.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/_json.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/_serialization.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/config.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/invoke.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/known_types.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/mocks.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/resource.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/resource_cycle_breaker.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/rpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/rpc_manager.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/settings.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/stack.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/__pycache__/sync_await.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/_callbacks.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/_depends_on.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/_json.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/_serialization.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/config.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/invoke.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/known_types.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/mocks.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/alias_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/alias_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/analyzer_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/analyzer_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/callback_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/callback_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/converter_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/converter_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/engine_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/engine_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/errors_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/errors_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/language_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/language_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/plugin_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/plugin_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/provider_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/provider_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/resource_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/resource_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/source_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/source_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/status_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/__pycache__/status_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/alias_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/alias_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/alias_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/alias_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/analyzer_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/analyzer_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/analyzer_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/analyzer_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/callback_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/callback_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/callback_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/callback_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/__pycache__/hcl_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/__pycache__/hcl_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/__pycache__/loader_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/__pycache__/loader_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/__pycache__/mapper_pb2.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/__pycache__/mapper_pb2_grpc.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/hcl_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/hcl_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/hcl_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/hcl_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/loader_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/loader_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/loader_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/loader_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/mapper_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/mapper_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/mapper_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/codegen/mapper_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/converter_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/converter_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/converter_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/converter_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/engine_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/engine_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/engine_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/engine_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/errors_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/errors_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/errors_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/errors_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/language_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/language_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/language_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/language_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/plugin_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/plugin_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/plugin_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/plugin_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/provider_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/provider_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/provider_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/provider_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/resource_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/resource_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/resource_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/resource_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/source_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/source_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/source_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/source_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/status_pb2.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/status_pb2.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/status_pb2_grpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/proto/status_pb2_grpc.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/resource.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/resource_cycle_breaker.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/rpc.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/rpc_manager.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/settings.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/stack.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/runtime/sync_await.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/stack_reference.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi/urn.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker-4.5.7.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker-4.5.7.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker-4.5.7.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker-4.5.7.dist-info/REQUESTED create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker-4.5.7.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker-4.5.7.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/_enums.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/_inputs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/_utilities.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/container.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/get_logs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/get_network.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/get_plugin.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/get_registry_image.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/get_remote_image.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/image.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/network.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/outputs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/plugin.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/provider.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/registry_image.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/remote_image.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/secret.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/service.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/service_config.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/tag.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/__pycache__/volume.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/_enums.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/_inputs.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/_utilities.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/config/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/config/__init__.pyi create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/config/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/config/__pycache__/outputs.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/config/__pycache__/vars.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/config/outputs.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/config/vars.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/container.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/get_logs.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/get_network.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/get_plugin.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/get_registry_image.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/get_remote_image.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/image.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/network.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/outputs.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/plugin.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/provider.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/pulumi-plugin.json create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/py.typed create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/registry_image.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/remote_image.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/secret.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/service.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/service_config.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/tag.py create mode 100644 myenv/lib/python3.12/site-packages/pulumi_docker/volume.py create mode 100644 myenv/lib/python3.12/site-packages/semver-2.13.0.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/semver-2.13.0.dist-info/LICENSE.txt create mode 100644 myenv/lib/python3.12/site-packages/semver-2.13.0.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/semver-2.13.0.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/semver-2.13.0.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/semver-2.13.0.dist-info/entry_points.txt create mode 100644 myenv/lib/python3.12/site-packages/semver-2.13.0.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/semver.py create mode 100644 myenv/lib/python3.12/site-packages/six-1.17.0.dist-info/INSTALLER create mode 100644 myenv/lib/python3.12/site-packages/six-1.17.0.dist-info/LICENSE create mode 100644 myenv/lib/python3.12/site-packages/six-1.17.0.dist-info/METADATA create mode 100644 myenv/lib/python3.12/site-packages/six-1.17.0.dist-info/RECORD create mode 100644 myenv/lib/python3.12/site-packages/six-1.17.0.dist-info/WHEEL create mode 100644 myenv/lib/python3.12/site-packages/six-1.17.0.dist-info/top_level.txt create mode 100644 myenv/lib/python3.12/site-packages/six.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/__init__.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/__init__.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/composer.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/constructor.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/cyaml.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/dumper.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/emitter.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/error.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/events.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/loader.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/nodes.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/parser.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/reader.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/representer.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/resolver.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/scanner.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/serializer.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/__pycache__/tokens.cpython-312.pyc create mode 100644 myenv/lib/python3.12/site-packages/yaml/_yaml.cpython-312-x86_64-linux-gnu.so create mode 100644 myenv/lib/python3.12/site-packages/yaml/composer.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/constructor.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/cyaml.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/dumper.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/emitter.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/error.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/events.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/loader.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/nodes.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/parser.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/reader.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/representer.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/resolver.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/scanner.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/serializer.py create mode 100644 myenv/lib/python3.12/site-packages/yaml/tokens.py create mode 120000 myenv/lib64 create mode 100644 myenv/pyvenv.cfg diff --git a/.vscode/config.json b/.vscode/config.json new file mode 100644 index 0000000..e69de29 diff --git a/.vscode/deploy.yml b/.vscode/deploy.yml new file mode 100644 index 0000000..c9d6460 --- /dev/null +++ b/.vscode/deploy.yml @@ -0,0 +1,3 @@ +- hosts: localhost + roles: + - docker-compose \ No newline at end of file diff --git a/.vscode/docker/backup.dockerfile b/.vscode/docker/backup.dockerfile new file mode 100644 index 0000000..80d895d --- /dev/null +++ b/.vscode/docker/backup.dockerfile @@ -0,0 +1,14 @@ +# Use the Alpine image as the base +FROM alpine:latest as backup_custom + +# Copy the entrypoint script into the container +COPY entrypoint_backup.sh /usr/local/bin/entrypoint_backup.sh + +# Switch to root user for setup +USER root + +# Make the entrypoint script executable +RUN chmod +x /usr/local/bin/entrypoint_backup.sh + +# Set the new entrypoint +ENTRYPOINT ["/usr/local/bin/entrypoint_backup.sh"] diff --git a/.vscode/docker/exporter.dockerfile b/.vscode/docker/exporter.dockerfile new file mode 100644 index 0000000..4d577ec --- /dev/null +++ b/.vscode/docker/exporter.dockerfile @@ -0,0 +1,27 @@ +# Use a Python slim image as base +FROM python:3.9-slim as exporter_custom + +# Set environment variables to avoid buffering +ENV PYTHONUNBUFFERED=1 + +# Create and set working directory +WORKDIR /app + +# Install required dependencies +RUN apt-get update && \ + apt-get install -y \ + libpq-dev && \ + pip install psycopg2-binary prometheus-client && \ + apt-get clean + +# Create a directory for logs +RUN mkdir /app/logs + +# Copy the Python script into the container +COPY pg_metrics_exporter.py /app/ + +# Set permissions for log directory (if required) +RUN chmod 755 /app/logs + +# Run the script and redirect logs to a file +CMD ["python", "/app/pg_metrics_exporter.py", ">", "/app/logs/exporter.log", "2>&1"] diff --git a/.vscode/docker/odoo.dockerfile b/.vscode/docker/odoo.dockerfile new file mode 100644 index 0000000..a50af7d --- /dev/null +++ b/.vscode/docker/odoo.dockerfile @@ -0,0 +1,13 @@ +# Use the existing Odoo image as the base +FROM odoo:latest as odoo-custom + +# Copy the entrypoint script into the container +COPY entrypoint_odoo.sh /usr/local/bin/entrypoint_odoo.sh + +USER root + +# Make the entrypoint script executable +RUN chmod +x /usr/local/bin/entrypoint_odoo.sh + +# Set the new entrypoint +ENTRYPOINT ["/usr/local/bin/entrypoint_odoo.sh"] diff --git a/.vscode/entrypoint_backup.sh b/.vscode/entrypoint_backup.sh new file mode 100644 index 0000000..6ee9b8f --- /dev/null +++ b/.vscode/entrypoint_backup.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Install PostgreSQL client +apk add --no-cache postgresql-client + +# Wait until the PostgreSQL server is ready +until pg_isready -h admin -U admin; do + echo "Waiting for PostgreSQL..." + sleep 2 +done + diff --git a/.vscode/entrypoint_odoo.sh b/.vscode/entrypoint_odoo.sh new file mode 100644 index 0000000..4175206 --- /dev/null +++ b/.vscode/entrypoint_odoo.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +sleep 20 +odoo -i base diff --git a/.vscode/fluent.conf b/.vscode/fluent.conf new file mode 100644 index 0000000..53d1bb1 --- /dev/null +++ b/.vscode/fluent.conf @@ -0,0 +1,13 @@ + + @type tail + path "/var/log/odoo/odoo.log" + pos_file "/fluentd/logs/odoo.pos" + format none + tag "odoo.log" + + + + @type file + path "/fluentd/logs/collected-logs" + + diff --git a/.vscode/inventory/hosts b/.vscode/inventory/hosts new file mode 100644 index 0000000..55f2674 --- /dev/null +++ b/.vscode/inventory/hosts @@ -0,0 +1,2 @@ +[localhost] +localhost ansible_connection=local \ No newline at end of file diff --git a/.vscode/notes.txt b/.vscode/notes.txt new file mode 100644 index 0000000..04c45bc --- /dev/null +++ b/.vscode/notes.txt @@ -0,0 +1,3 @@ + docker-compose -f roles/docker-compose/files/docker-compose.yml up -d + + ansible-playbook -i hosts deploy.yml \ No newline at end of file diff --git a/.vscode/odoo.conf b/.vscode/odoo.conf new file mode 100644 index 0000000..c9b9d81 --- /dev/null +++ b/.vscode/odoo.conf @@ -0,0 +1,8 @@ +[options] +db_host = admin +db_port = 5432 +db_user = admin +db_password = admin +default_productivity_apps = True +db_name = admin +logfile = /var/log/odoo/odoo.log diff --git a/.vscode/pg_metrics_exporter.py b/.vscode/pg_metrics_exporter.py new file mode 100644 index 0000000..ea4e692 --- /dev/null +++ b/.vscode/pg_metrics_exporter.py @@ -0,0 +1,59 @@ +import psycopg2 +from prometheus_client import start_http_server, Gauge +import time + +# Configuration for database connection +DB_PARAMS = { + "host": "admin", + "database": "admin", + "user": "admin", + "password": "admin" +} + +# Prometheus metrics +QUERY_CALLS = Gauge('postgresql_query_calls', 'Number of calls for each query', ['query']) +QUERY_TOTAL_TIME = Gauge('postgresql_query_total_time_ms', 'Total execution time for each query in ms', ['query']) + +def fetch_metrics(): + try: + # Log connection attempt + print("Connecting to PostgreSQL database...") + + conn = psycopg2.connect(**DB_PARAMS) + cur = conn.cursor() + + # Execute query to get data + cur.execute(""" + SELECT query, calls, total_exec_time + FROM pg_stat_statements + ORDER BY total_exec_time DESC; + """) + + # Iterate through results and set Prometheus metrics + for row in cur: + query = row[0].replace("\\", "\\\\").replace('"', '\\"') # Escape special characters + calls = row[1] + total_time = row[2] * 1000 # Convert seconds to milliseconds + + QUERY_CALLS.labels(query=query).set(calls) + QUERY_TOTAL_TIME.labels(query=query).set(total_time) + + # Log the metrics being set + print(f"Metrics set for query: {query} | Calls: {calls} | Total execution time: {total_time} ms") + + cur.close() + conn.close() + except psycopg2.Error as e: + print(f"Error fetching data: {e}") + except Exception as e: + print(f"Unexpected error: {e}") + +if __name__ == '__main__': + # Start Prometheus HTTP server on port 8000 + start_http_server(8000) + print("Exporter running on http://localhost:8000/metrics") + + # Main loop to fetch metrics at regular intervals + while True: + fetch_metrics() + time.sleep(60) # Scrape every 60 seconds diff --git a/.vscode/prometheus.yml b/.vscode/prometheus.yml new file mode 100644 index 0000000..e69de29 diff --git a/.vscode/roles/docker-compose/files/docker-compose.yml b/.vscode/roles/docker-compose/files/docker-compose.yml new file mode 100644 index 0000000..29441a1 --- /dev/null +++ b/.vscode/roles/docker-compose/files/docker-compose.yml @@ -0,0 +1,109 @@ +version: "3.9" +services: + admin: + image: postgres:latest + environment: + POSTGRES_DB: admin + POSTGRES_USER: admin + POSTGRES_PASSWORD: admin + ports: + - "5432:5432" + volumes: + - postgres-data:/var/lib/postgresql/data + networks: + - testNetwork + + pgadmin: + image: dpage/pgadmin4:latest + environment: + PGADMIN_DEFAULT_EMAIL: admin@admin.com + PGADMIN_DEFAULT_PASSWORD: admin + ports: + - "5051:80" + networks: + - testNetwork + + prometheus_exporter: + image: exporter_custom + ports: + - "8000:8000" + networks: + - testNetwork + depends_on: + - admin + + odoo: + image: odoo_custom + environment: + HOST: admin + USER: admin + PASSWORD: admin + DATABASE: admin + ODOO_PASSWORD: admin + ports: + - "8069:8069" + volumes: + - ./odoo.conf:/etc/odoo/odoo.conf + - ./logs/odoo:/var/log/odoo + networks: + - testNetwork + depends_on: + - admin + + grafana: + image: grafana/grafana:latest + environment: + GF_SECURITY_ADMIN_PASSWORD: grafana_pwd + GF_DATASOURCES_PROMETHEUS_URL: http://prometheus:9090 + ports: + - "3000:3000" + networks: + - testNetwork + depends_on: + - prometheus + + prometheus: + image: prom/prometheus:latest + ports: + - "9090:9090" + volumes: + - prometheus-data:/prometheus + - ./prometheus.yml:/etc/prometheus/prometheus.yml + networks: + - testNetwork + + fluentd: + image: fluent/fluentd:v1.13-1 + ports: + - "24224:24224" + volumes: + - ./logs/odoo:/var/log/odoo + - ./fluent.conf:/fluentd/etc/fluent.conf + networks: + - testNetwork + depends_on: + - odoo + + + backup: + image: backup_custom + environment: + POSTGRES_HOST: admin + POSTGRES_DB: admin + POSTGRES_USER: admin + POSTGRES_PASSWORD: admin + volumes: + - backup-data:/backup + networks: + - testNetwork + depends_on: + - admin + +networks: + testNetwork: + driver: bridge + +volumes: + postgres-data: + prometheus-data: + backup-data: \ No newline at end of file diff --git a/.vscode/roles/docker-compose/tasks/main.yml b/.vscode/roles/docker-compose/tasks/main.yml new file mode 100644 index 0000000..d7b0515 --- /dev/null +++ b/.vscode/roles/docker-compose/tasks/main.yml @@ -0,0 +1,21 @@ +--- +- name: Ensure Docker Compose is installed + ansible.builtin.shell: | + curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose + args: + executable: /bin/bash + become: yes + + +- name: Copy Docker Compose file + ansible.builtin.copy: + src: roles/docker-compose/files/docker-compose.yml + dest: /opt/docker-compose.yml + become: yes + + +- name: Run Docker Compose + ansible.builtin.command: + cmd: docker-compose up -d + chdir: /opt diff --git a/.vscode/roles/docker-compose/templates/environment.j2 b/.vscode/roles/docker-compose/templates/environment.j2 new file mode 100644 index 0000000..1757bba --- /dev/null +++ b/.vscode/roles/docker-compose/templates/environment.j2 @@ -0,0 +1,4 @@ +POSTGRES_PASSWORD={{ POSTGRES_PASSWORD }} +POSTGRES_USER={{ POSTGRES_USER }} +POSTGRES_DB={{ POSTGRES_DB }} +ODOO_PASSWORD={{ ODOO_PASSWORD }} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5d71af8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "ansible.python.interpreterPath": "/bin/python3" +} \ No newline at end of file diff --git a/myenv/bin/Activate.ps1 b/myenv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/myenv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/myenv/bin/activate b/myenv/bin/activate new file mode 100644 index 0000000..ee16d07 --- /dev/null +++ b/myenv/bin/activate @@ -0,0 +1,70 @@ +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # Call hash to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + hash -r 2> /dev/null + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath '/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv') +else + # use the path as-is + export VIRTUAL_ENV='/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv' +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/"bin":$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1='(myenv) '"${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT='(myenv) ' + export VIRTUAL_ENV_PROMPT +fi + +# Call hash to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +hash -r 2> /dev/null diff --git a/myenv/bin/activate.csh b/myenv/bin/activate.csh new file mode 100644 index 0000000..719d0cf --- /dev/null +++ b/myenv/bin/activate.csh @@ -0,0 +1,27 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. + +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV '/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv' + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/"bin":$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = '(myenv) '"$prompt" + setenv VIRTUAL_ENV_PROMPT '(myenv) ' +endif + +alias pydoc python -m pydoc + +rehash diff --git a/myenv/bin/activate.fish b/myenv/bin/activate.fish new file mode 100644 index 0000000..957667a --- /dev/null +++ b/myenv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/). You cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV '/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv' + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/"bin $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) '(myenv) ' (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT '(myenv) ' +end diff --git a/myenv/bin/debugpy b/myenv/bin/debugpy new file mode 100644 index 0000000..9fcb23e --- /dev/null +++ b/myenv/bin/debugpy @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv/bin/python3" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from debugpy.server.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/get_gprof b/myenv/bin/get_gprof new file mode 100644 index 0000000..f02ee1c --- /dev/null +++ b/myenv/bin/get_gprof @@ -0,0 +1,75 @@ +#!/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv/bin/python3 +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +''' +build profile graph for the given instance + +running: + $ get_gprof + +executes: + gprof2dot -f pstats .prof | dot -Tpng -o .call.png + +where: + are arguments for gprof2dot, such as "-n 5 -e 5" + is code to create the instance to profile + is the class of the instance (i.e. type(instance)) + +For example: + $ get_gprof -n 5 -e 1 "import numpy; numpy.array([1,2])" + +will create 'ndarray.call.png' with the profile graph for numpy.array([1,2]), +where '-n 5' eliminates nodes below 5% threshold, similarly '-e 1' eliminates +edges below 1% threshold +''' + +if __name__ == "__main__": + import sys + if len(sys.argv) < 2: + print ("Please provide an object instance (e.g. 'import math; math.pi')") + sys.exit() + # grab args for gprof2dot + args = sys.argv[1:-1] + args = ' '.join(args) + # last arg builds the object + obj = sys.argv[-1] + obj = obj.split(';') + # multi-line prep for generating an instance + for line in obj[:-1]: + exec(line) + # one-line generation of an instance + try: + obj = eval(obj[-1]) + except Exception: + print ("Error processing object instance") + sys.exit() + + # get object 'name' + objtype = type(obj) + name = getattr(objtype, '__name__', getattr(objtype, '__class__', objtype)) + + # profile dumping an object + import dill + import os + import cProfile + #name = os.path.splitext(os.path.basename(__file__))[0] + cProfile.run("dill.dumps(obj)", filename="%s.prof" % name) + msg = "gprof2dot -f pstats %s %s.prof | dot -Tpng -o %s.call.png" % (args, name, name) + try: + res = os.system(msg) + except Exception: + print ("Please verify install of 'gprof2dot' to view profile graphs") + if res: + print ("Please verify install of 'gprof2dot' to view profile graphs") + + # get stats + f_prof = "%s.prof" % name + import pstats + stats = pstats.Stats(f_prof, stream=sys.stdout) + stats.strip_dirs().sort_stats('cumtime') + stats.print_stats(20) #XXX: save to file instead of print top 20? + os.remove(f_prof) diff --git a/myenv/bin/get_objgraph b/myenv/bin/get_objgraph new file mode 100644 index 0000000..a3d9a34 --- /dev/null +++ b/myenv/bin/get_objgraph @@ -0,0 +1,54 @@ +#!/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv/bin/python3 +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +display the reference paths for objects in ``dill.types`` or a .pkl file + +Notes: + the generated image is useful in showing the pointer references in + objects that are or can be pickled. Any object in ``dill.objects`` + listed in ``dill.load_types(picklable=True, unpicklable=True)`` works. + +Examples:: + + $ get_objgraph ArrayType + Image generated as ArrayType.png +""" + +import dill as pickle +#pickle.debug.trace(True) +#import pickle + +# get all objects for testing +from dill import load_types +load_types(pickleable=True,unpickleable=True) +from dill import objects + +if __name__ == "__main__": + import sys + if len(sys.argv) != 2: + print ("Please provide exactly one file or type name (e.g. 'IntType')") + msg = "\n" + for objtype in list(objects.keys())[:40]: + msg += objtype + ', ' + print (msg + "...") + else: + objtype = str(sys.argv[-1]) + try: + obj = objects[objtype] + except KeyError: + obj = pickle.load(open(objtype,'rb')) + import os + objtype = os.path.splitext(objtype)[0] + try: + import objgraph + objgraph.show_refs(obj, filename=objtype+'.png') + except ImportError: + print ("Please install 'objgraph' to view object graphs") + + +# EOF diff --git a/myenv/bin/pip b/myenv/bin/pip new file mode 100644 index 0000000..812fa1b --- /dev/null +++ b/myenv/bin/pip @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv/bin/python3" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/pip3 b/myenv/bin/pip3 new file mode 100644 index 0000000..812fa1b --- /dev/null +++ b/myenv/bin/pip3 @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv/bin/python3" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/pip3.12 b/myenv/bin/pip3.12 new file mode 100644 index 0000000..812fa1b --- /dev/null +++ b/myenv/bin/pip3.12 @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv/bin/python3" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/pysemver b/myenv/bin/pysemver new file mode 100644 index 0000000..d0f4437 --- /dev/null +++ b/myenv/bin/pysemver @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv/bin/python3" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from semver import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/python b/myenv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/myenv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/myenv/bin/python3 b/myenv/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/myenv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/myenv/bin/python3.12 b/myenv/bin/python3.12 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/myenv/bin/python3.12 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/myenv/bin/undill b/myenv/bin/undill new file mode 100644 index 0000000..566a408 --- /dev/null +++ b/myenv/bin/undill @@ -0,0 +1,22 @@ +#!/mnt/c/Users/Feten Dridi/Desktop/projetAnsible/myenv/bin/python3 +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +unpickle the contents of a pickled object file + +Examples:: + + $ undill hello.pkl + ['hello', 'world'] +""" + +if __name__ == '__main__': + import sys + import dill + for file in sys.argv[1:]: + print (dill.load(open(file,'rb'))) + diff --git a/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/AUTHORS.md b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/AUTHORS.md new file mode 100644 index 0000000..ef00fc4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/AUTHORS.md @@ -0,0 +1,11 @@ +Arpeggio - Parser interpreter based on PEG grammars + +Author: Igor R. Dejanović + + +# Contributors + +- Bug reports/ideas: https://github.com/textX/Arpeggio/issues?utf8=%E2%9C%93&q=is%3Aissue +- Code/docs contributions: + - https://github.com/textX/Arpeggio/graphs/contributors + - https://github.com/textX/Arpeggio/pulls?utf8=%E2%9C%93&q=is%3Apr+ diff --git a/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/INSTALLER b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/LICENSE b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/LICENSE new file mode 100644 index 0000000..b4a0484 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/LICENSE @@ -0,0 +1,22 @@ +Arpeggio is released under the terms of the MIT License +------------------------------------------------------- + +Copyright (c) 2009-2019 Igor R. Dejanović + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/METADATA b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/METADATA new file mode 100644 index 0000000..3d9f5a6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/METADATA @@ -0,0 +1,54 @@ +Metadata-Version: 2.1 +Name: Arpeggio +Version: 2.0.2 +Summary: Packrat parser interpreter +Home-page: https://github.com/textX/Arpeggio +Download-URL: +Author: Igor R. Dejanovic +Author-email: igor.dejanovic@gmail.com +License: MIT +Keywords: parser,PEG,packrat,library,interpreter +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Information Technology +Classifier: Intended Audience :: Science/Research +Classifier: Topic :: Software Development :: Interpreters +Classifier: Topic :: Software Development :: Compilers +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Description-Content-Type: text/markdown +License-File: LICENSE +License-File: AUTHORS.md +Provides-Extra: dev +Requires-Dist: wheel ; extra == 'dev' +Requires-Dist: mkdocs ; extra == 'dev' +Requires-Dist: mike ; extra == 'dev' +Requires-Dist: twine ; extra == 'dev' +Provides-Extra: test +Requires-Dist: flake8 ; extra == 'test' +Requires-Dist: coverage ; extra == 'test' +Requires-Dist: coveralls ; extra == 'test' +Requires-Dist: pytest ; extra == 'test' + +![](https://raw.githubusercontent.com/textX/Arpeggio/master/art/arpeggio-logo.png) + +[![PyPI Version](https://img.shields.io/pypi/v/Arpeggio.svg)](https://pypi.python.org/pypi/Arpeggio) +![](https://img.shields.io/pypi/l/Arpeggio.svg) +[![Build status](https://github.com/textx/Arpeggio/actions/workflows/ci-linux-ubuntu.yml/badge.svg)](https://github.com/textx/Arpeggio/actions) +[![Coverage Status](https://coveralls.io/repos/github/textX/Arpeggio/badge.svg)](https://coveralls.io/github/textX/Arpeggio) +[![Documentation](https://img.shields.io/badge/docs-latest-green.svg)](http://textx.github.io/Arpeggio/latest/) + +Arpeggio is a recursive descent parser with memoization based on PEG grammars +(aka Packrat parser). + +Documentation with tutorials is available [here](http://textx.github.io/Arpeggio/). + +**Note:** for a higher level parsing/language tool (i.e., a nicer interface to +Arpeggio) see [textX](https://github.com/textX/textX). diff --git a/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/RECORD b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/RECORD new file mode 100644 index 0000000..f886df0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/RECORD @@ -0,0 +1,103 @@ +Arpeggio-2.0.2.dist-info/AUTHORS.md,sha256=Qmm0ctdqOMSZLg-z_PnaBKAxGXuWqsD4l5q_WXJe7Ao,381 +Arpeggio-2.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Arpeggio-2.0.2.dist-info/LICENSE,sha256=U-vbB6IMAKHb2WVqNp6Ldb-on9o0K1QTMY4LTgvpHys,1218 +Arpeggio-2.0.2.dist-info/METADATA,sha256=HqmT2lyKp5jZRa2zDre676_Ou1XtQLD3hdPnB7ghTAU,2445 +Arpeggio-2.0.2.dist-info/RECORD,, +Arpeggio-2.0.2.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110 +Arpeggio-2.0.2.dist-info/top_level.txt,sha256=kdvFB1a87VHff27Uaeq70GZjKVS6HBV_keZDL20k8jE,9 +arpeggio/__init__.py,sha256=2GRZeypUO1OGiUuuJmusj6EmVnagwxLwyUFQf84Vnm0,64627 +arpeggio/__pycache__/__init__.cpython-312.pyc,, +arpeggio/__pycache__/cleanpeg.cpython-312.pyc,, +arpeggio/__pycache__/export.cpython-312.pyc,, +arpeggio/__pycache__/peg.cpython-312.pyc,, +arpeggio/__pycache__/utils.cpython-312.pyc,, +arpeggio/cleanpeg.py,sha256=Cg-aEXuIjKWhcbLLT__cpxCsjiPDChXOpeDIoT-KRGQ,2867 +arpeggio/export.py,sha256=WnznnPw7_CHpG4nWG7r19hcV-L_MQj35KV9XUQJxtq8,6689 +arpeggio/peg.py,sha256=VUVTwarDUxobeWQ7OOmox5WcBByhfm6qwHLPJCwXaBs,10659 +arpeggio/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_decorator_combine.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_default_semantic_action.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_eolterm.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_error_reporting.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_examples.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_exporter.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_flags.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_parser_params.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_parser_resilience.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_parsing_expressions.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_pathologic_models.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_peg_parser.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_position.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_ptnode_navigation_expressions.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_python_parser.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_reduce_tree.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_semantic_action_results.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_separators.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_sequence_params.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_suppression.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_unicode.cpython-312.pyc,, +arpeggio/tests/__pycache__/test_visitor.cpython-312.pyc,, +arpeggio/tests/regressions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/regressions/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/regressions/__pycache__/test_direct_rule_call.cpython-312.pyc,, +arpeggio/tests/regressions/__pycache__/test_memoization.cpython-312.pyc,, +arpeggio/tests/regressions/issue_16/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/regressions/issue_16/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/regressions/issue_16/__pycache__/test_issue_16.cpython-312.pyc,, +arpeggio/tests/regressions/issue_16/test_issue_16.py,sha256=u1t8jPSOw0sr4-Yu6wLf8TTIfDzehXmvPas5dZBMtVs,2145 +arpeggio/tests/regressions/issue_20/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/regressions/issue_20/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/regressions/issue_20/__pycache__/test_issue_20.cpython-312.pyc,, +arpeggio/tests/regressions/issue_20/test_issue_20.py,sha256=s8Gn9Bcyxn-Rx63x1QK7ryV9G9howI2OHcc0MLDnSG0,828 +arpeggio/tests/regressions/issue_22/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/regressions/issue_22/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/regressions/issue_22/__pycache__/test_issue_22.cpython-312.pyc,, +arpeggio/tests/regressions/issue_22/grammar1.peg,sha256=iI7a6N9Ed3QcLdchLA_Nq18NstAGRVKPNLdmcNykars,849 +arpeggio/tests/regressions/issue_22/grammar2.peg,sha256=8SUzUN2bMp-taRZIW0j1adFa5PI-xd6Ud6aJvHvoMII,723 +arpeggio/tests/regressions/issue_22/test_issue_22.py,sha256=-NyBT8bcxq_wCmvKILLRuGvOzFdJm6gYXZwj2Jd28IY,550 +arpeggio/tests/regressions/issue_26/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/regressions/issue_26/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/regressions/issue_26/__pycache__/test_issue_26.cpython-312.pyc,, +arpeggio/tests/regressions/issue_26/test_issue_26.py,sha256=uguIaMdtzjQYqQ_Lge4OONEtOhCH4Og2x1ycBMCkuUo,407 +arpeggio/tests/regressions/issue_31/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/regressions/issue_31/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/regressions/issue_31/__pycache__/test_issue_31.cpython-312.pyc,, +arpeggio/tests/regressions/issue_31/test_issue_31.py,sha256=uRMHaMFNGVUOd6hh8xfQla1002ENwgiVJKtcZYl4Tk4,358 +arpeggio/tests/regressions/issue_32/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/regressions/issue_32/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/regressions/issue_32/__pycache__/test_issue_32.cpython-312.pyc,, +arpeggio/tests/regressions/issue_32/test_issue_32.py,sha256=U5vWwepRnfqiIHsr8sGGwyKIXf-WEhxb5NiFHNDB9Xc,8732 +arpeggio/tests/regressions/issue_43/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +arpeggio/tests/regressions/issue_43/__pycache__/__init__.cpython-312.pyc,, +arpeggio/tests/regressions/issue_43/__pycache__/test_issue43.cpython-312.pyc,, +arpeggio/tests/regressions/issue_43/test_issue43.py,sha256=iBkussTWmmNk8rsvEHoEbaBm_T_H1WpCa-YSoaRYTyM,562 +arpeggio/tests/regressions/issue_61/__pycache__/test_issue_61.cpython-312.pyc,, +arpeggio/tests/regressions/issue_61/test_issue_61.py,sha256=Jflo-G3EbbP5dgJKDcu5ZljH64IUWC0CgEH9jpInLkU,1341 +arpeggio/tests/regressions/issue_73/__pycache__/test_issue_73.cpython-312.pyc,, +arpeggio/tests/regressions/issue_73/test_issue_73.py,sha256=Kq244G_bVCroP37_t8nXMPPkKqDzHsiv8hhE-RWfD4g,966 +arpeggio/tests/regressions/test_direct_rule_call.py,sha256=Ndqhqn5ZK258MGFCEGRp_En8qnMjneHscgCF4xZ8_Rk,918 +arpeggio/tests/regressions/test_memoization.py,sha256=FUm_aw4zwlwXnvGTVFpx2FIYXmPRo0neq8VhPux_siI,1527 +arpeggio/tests/test_decorator_combine.py,sha256=lsxoWNHynJ1-osWEisosSI-2P-2JSWk7J5v22Me6Vp4,1365 +arpeggio/tests/test_default_semantic_action.py,sha256=2ReNg2oJp3mT9nzYo_7xQa0_OHhUQMrYfY-HNyWFJto,2074 +arpeggio/tests/test_eolterm.py,sha256=6fA-dPUhklwwQIQh3n9qKueyC3Ww9OR795x8RNVnE5k,1000 +arpeggio/tests/test_error_reporting.py,sha256=apTYLrI0L-DSPdqNHFV7Wtt0Ahm5egbO1TuqiEvq1I4,5938 +arpeggio/tests/test_examples.py,sha256=J524z_4smnswnwrukaxETiSXxch63s5hHI9PL4h51cc,1659 +arpeggio/tests/test_exporter.py,sha256=4-0V5tsQIRkHpQ43zwHulz2ML8EvcIwD1pzpDUXJJ44,1633 +arpeggio/tests/test_flags.py,sha256=v8oWzMtHzCGc1Pcc-XThpPokeSFkB9XYUB2nKRvgYgA,1968 +arpeggio/tests/test_parser_params.py,sha256=AuYk3R7LPMjTKtFLaC0mIhFndUNQQJsS4CeHq9wFxcU,2958 +arpeggio/tests/test_parser_resilience.py,sha256=63cVOwqnhp58Jk1_xniUZ-o3BfIICRndzB4MZ0sGar4,384 +arpeggio/tests/test_parsing_expressions.py,sha256=87aV7dqp59i3X83YalZHfRQN8lJmlmEYxKgLxy3WUPg,9336 +arpeggio/tests/test_pathologic_models.py,sha256=PxrDzY3_39b7G7fMywQBU9u2gwOHhy3st2cQWUjBbgs,1015 +arpeggio/tests/test_peg_parser.py,sha256=upISz7cMasuV58e-VKgUVNQUCGJZLEPuaaCz54JcP6I,3574 +arpeggio/tests/test_position.py,sha256=czNZNsADNpaqwv-7V-wPtsWHnzSmP_KtuGi7WJpEMmY,1522 +arpeggio/tests/test_ptnode_navigation_expressions.py,sha256=CB7eir5bXoEo3mzuHjJbrDoJTqxNykBNbGLoKB7qGEk,2342 +arpeggio/tests/test_python_parser.py,sha256=BrtRARU26K8pxjUQOdci_5GDcRIjvVo8VWtw47kW4h8,2100 +arpeggio/tests/test_reduce_tree.py,sha256=c9gd5qhqrhb2lhMT437n9OcVpecHjVTLMhOYXDYw0fU,1744 +arpeggio/tests/test_semantic_action_results.py,sha256=ZdnXLo8hJsnaNZ0NF5nOpVH5Yv1NKKhu_S1nm11ugcs,1713 +arpeggio/tests/test_separators.py,sha256=KVYVQGp9vwpjs88z9BdP0sbfN1Zk1tnG1NLIMOlP7rk,1482 +arpeggio/tests/test_sequence_params.py,sha256=NpaYme4TX586MFweO9lvLIPzEEVcxJZue52JN3ai3tA,2508 +arpeggio/tests/test_suppression.py,sha256=jt19AHlLUsy2kqLyh8HloSX03u9SV5ENmpSZO8mqPHI,1835 +arpeggio/tests/test_unicode.py,sha256=Z2oS8b_mGNh5VX0yRdCfVsdE-bHYjxa6zu3BJc8TYzw,751 +arpeggio/tests/test_visitor.py,sha256=TX7nl55N6XWFaTnr4JLeCJxbx9WkM3M8bWt993F-Rgs,1709 +arpeggio/utils.py,sha256=eb5yjVMI9ScTLcZ5IfAsiyF2dewV22KWpsfhW5j39kg,416 diff --git a/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/WHEEL new file mode 100644 index 0000000..f771c29 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/top_level.txt b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..e5f6165 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/Arpeggio-2.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +arpeggio diff --git a/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/INSTALLER b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/LICENSE b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/LICENSE new file mode 100644 index 0000000..2f1b8e1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2017-2021 Ingy döt Net +Copyright (c) 2006-2016 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/METADATA b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/METADATA new file mode 100644 index 0000000..db029b7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/METADATA @@ -0,0 +1,46 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 6.0.2 +Summary: YAML parser and emitter for Python +Home-page: https://pyyaml.org/ +Download-URL: https://pypi.org/project/PyYAML/ +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues +Project-URL: CI, https://github.com/yaml/pyyaml/actions +Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation +Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core +Project-URL: Source Code, https://github.com/yaml/pyyaml +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Cython +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup +Requires-Python: >=3.8 +License-File: LICENSE + +YAML is a data serialization format designed for human readability +and interaction with scripting languages. PyYAML is a YAML parser +and emitter for Python. + +PyYAML features a complete YAML 1.1 parser, Unicode support, pickle +support, capable extension API, and sensible error messages. PyYAML +supports standard YAML tags and provides Python-specific tags that +allow to represent an arbitrary Python object. + +PyYAML is applicable for a broad range of tasks from complex +configuration files to object serialization and persistence. diff --git a/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/RECORD b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/RECORD new file mode 100644 index 0000000..f596c8e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/RECORD @@ -0,0 +1,43 @@ +PyYAML-6.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyYAML-6.0.2.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101 +PyYAML-6.0.2.dist-info/METADATA,sha256=9-odFB5seu4pGPcEv7E8iyxNF51_uKnaNGjLAhz2lto,2060 +PyYAML-6.0.2.dist-info/RECORD,, +PyYAML-6.0.2.dist-info/WHEEL,sha256=1pP4yhrbipRtdbm4Rbg3aoTjzc7pDhpHKO0CEY24CNM,152 +PyYAML-6.0.2.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 +_yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402 +_yaml/__pycache__/__init__.cpython-312.pyc,, +yaml/__init__.py,sha256=N35S01HMesFTe0aRRMWkPj0Pa8IEbHpE9FK7cr5Bdtw,12311 +yaml/__pycache__/__init__.cpython-312.pyc,, +yaml/__pycache__/composer.cpython-312.pyc,, +yaml/__pycache__/constructor.cpython-312.pyc,, +yaml/__pycache__/cyaml.cpython-312.pyc,, +yaml/__pycache__/dumper.cpython-312.pyc,, +yaml/__pycache__/emitter.cpython-312.pyc,, +yaml/__pycache__/error.cpython-312.pyc,, +yaml/__pycache__/events.cpython-312.pyc,, +yaml/__pycache__/loader.cpython-312.pyc,, +yaml/__pycache__/nodes.cpython-312.pyc,, +yaml/__pycache__/parser.cpython-312.pyc,, +yaml/__pycache__/reader.cpython-312.pyc,, +yaml/__pycache__/representer.cpython-312.pyc,, +yaml/__pycache__/resolver.cpython-312.pyc,, +yaml/__pycache__/scanner.cpython-312.pyc,, +yaml/__pycache__/serializer.cpython-312.pyc,, +yaml/__pycache__/tokens.cpython-312.pyc,, +yaml/_yaml.cpython-312-x86_64-linux-gnu.so,sha256=PJFgxnc0f5Dyde6WKmBm6fZWapawmWl7aBRruXjRA80,2481784 +yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 +yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639 +yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851 +yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837 +yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006 +yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 +yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 +yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061 +yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 +yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 +yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794 +yaml/representer.py,sha256=IuWP-cAW9sHKEnS0gCqSa894k1Bg4cgTxaDwIcbRQ-Y,14190 +yaml/resolver.py,sha256=9L-VYfm4mWHxUD1Vg4X7rjDRK_7VZd6b92wzq7Y2IKY,9004 +yaml/scanner.py,sha256=YEM3iLZSaQwXcQRg2l2R4MdT0zGP2F9eHkKGKnHyWQY,51279 +yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 +yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/WHEEL new file mode 100644 index 0000000..56616a8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.44.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 + diff --git a/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/top_level.txt b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..e6475e9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_yaml +yaml diff --git a/myenv/lib/python3.12/site-packages/__pycache__/semver.cpython-312.pyc b/myenv/lib/python3.12/site-packages/__pycache__/semver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6cfe9012e0de417099d1303a8fa5e20b3944dd0 GIT binary patch literal 46765 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc b/myenv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff883ba44ec1511692e4cb8c84a64a1f1864d694 GIT binary patch literal 41421 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 verPkF_X$6Ana}SMKCX73UuF5Y#YC>paejy8= (3, 6) else ImportError + raise exc("No module named '_yaml'") +else: + from yaml._yaml import * + import warnings + warnings.warn( + 'The _yaml extension module is now located at yaml._yaml' + ' and its location is subject to change. To use the' + ' LibYAML-based parser and emitter, import from `yaml`:' + ' `from yaml import CLoader as Loader, CDumper as Dumper`.', + DeprecationWarning + ) + del warnings + # Don't `del yaml` here because yaml is actually an existing + # namespace member of _yaml. + +__name__ = '_yaml' +# If the module is top-level (i.e. not a part of any specific package) +# then the attribute should be set to ''. +# https://docs.python.org/3.8/library/types.html +__package__ = '' diff --git a/myenv/lib/python3.12/site-packages/_yaml/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/_yaml/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb1865d469f505b1624459ec84eb041140b45863 GIT binary patch literal 878 zcmYjP&rcLF6mDl`cV~ZrK#&+UDW?SkJ5diN#+VRRq6y0hH7+LI*=^Y!n3+!6F0h=y ziypoCFKCE~M=$;bUhv03YD`S@!fg$nIN9z}jjUE= zN%jDy>?csOb7Aha1=E~v!_^FTV?2%jzY~`h4y@Dz!J13*jUp*DN_{w6JT~qXbq?e0 zKz4B$wEBJ&V!Sj9RcVWI5wI8s@j9Eej?G1nvwGW|T45++q!&^Y`w=Cmf{m=AMexe* z(Q22Xp##w!Nn?}aj2;LSvuzZzwlB5Lm&gdKDcg?;3ZzJ*Mx@!I*V>?Mi6leqt{-=3 z6`@szdV(UU%Pa@2M+^1k`Iawqy2R&#a%A$*D3Fr!ITS<*;}WfN7NMpo*1UqSZGO08y9Wri13V79CrBUiZ&mA;f**`hDFqno29>ch^gFuBBf zF}cGzKf{~oT~ZJ)UvGm&Bef@snEm7TeRO0~&yc!jok|kck*#?yhdK#^edQqRoTb>@b zm-JuX!SnbpCH@;SHbaVLkmoVq8u7r|zwE=(qU=UDNzT5$J7TLkLew0G58a zz#V-i4<{=xCqL)BZw~rCJ^$wX$LSj%3YXum?JXV^%7-JBPlcI7XXdAK>8msG#TnbX o`?S7aA6Rz21_v(4U;JInX0n43kRQ{qG_mLEV{~l4$ftC*KXA +# Copyright: (c) 2009-2019 Igor R. Dejanović +# License: MIT License +# +# This is an implementation of packrat parser interpreter based on PEG +# grammars. Grammars are defined using Python language constructs or the PEG +# textual notation. +############################################################################### + +from __future__ import print_function, unicode_literals +import sys +from collections import OrderedDict +import codecs +import re +import bisect +from arpeggio.utils import isstr +import types + +__version__ = "2.0.2" + +if sys.version < '3': + text = unicode +else: + text = str + +DEFAULT_WS = '\t\n\r ' +NOMATCH_MARKER = 0 + + +class ArpeggioError(Exception): + """ + Base class for arpeggio errors. + """ + def __init__(self, message): + self.message = message + + def __str__(self): + return repr(self.message) + + +class GrammarError(ArpeggioError): + """ + Error raised during parser building phase used to indicate error in the + grammar definition. + """ + + +class SemanticError(ArpeggioError): + """ + Error raised during the phase of semantic analysis used to indicate + semantic error. + """ + + +class NoMatch(Exception): + """ + Exception raised by the Match classes during parsing to indicate that the + match is not successful. + + Args: + rules (list of ParsingExpression): Rules that are tried at the position + of the exception. + position (int): A position in the input stream where exception + occurred. + parser (Parser): An instance of a parser. + """ + def __init__(self, rules, position, parser): + self.rules = rules + self.position = position + self.parser = parser + + + def eval_attrs(self): + """ + Call this to evaluate `message`, `context`, `line` and `col`. Called by __str__. + """ + def rule_to_exp_str(rule): + if hasattr(rule, '_exp_str'): + # Rule may override expected report string + return rule._exp_str + elif rule.root: + return rule.rule_name + elif isinstance(rule, Match) and \ + not isinstance(rule, EndOfFile): + return "'{}'".format(rule.to_match.replace('\n', '\\n')) + else: + return rule.name + + if not self.rules: + self.message = "Not expected input" + else: + what_is_expected = OrderedDict.fromkeys( + ["{}".format(rule_to_exp_str(r)) for r in self.rules]) + what_str = " or ".join(what_is_expected) + self.message = "Expected {}".format(what_str) + + self.context = self.parser.context(position=self.position) + self.line, self.col = self.parser.pos_to_linecol(self.position) + + def __str__(self): + self.eval_attrs() + return "{} at position {}{} => '{}'."\ + .format(self.message, + "{}:".format(self.parser.file_name) + if self.parser.file_name else "", + (self.line, self.col), + self.context) + + def __unicode__(self): + return self.__str__() + + +def flatten(_iterable): + '''Flattening of python iterables.''' + result = [] + for e in _iterable: + if hasattr(e, "__iter__") and not type(e) in [text, NonTerminal]: + result.extend(flatten(e)) + else: + result.append(e) + return result + + +class DebugPrinter(object): + """ + Mixin class for adding debug print support. + + Attributes: + debug (bool): If true debugging messages will be printed. + _current_indent(int): Current indentation level for prints. + """ + + def __init__(self, **kwargs): + + self.debug = kwargs.pop("debug", False) + self.file = kwargs.pop("file", sys.stdout) + self._current_indent = 0 + + super(DebugPrinter, self).__init__(**kwargs) + + def dprint(self, message, indent_change=0): + """ + Handle debug message. Print to the stream specified by the 'file' + keyword argument at the current indentation level. Default stream is + stdout. + """ + if indent_change < 0: + self._current_indent += indent_change + + print(("%s%s" % (" " * self._current_indent, message)), + file=self.file) + + if indent_change > 0: + self._current_indent += indent_change + + +# --------------------------------------------------------- +# Parser Model (PEG Abstract Semantic Graph) elements + + +class ParsingExpression(object): + """ + An abstract class for all parsing expressions. + Represents the node of the Parser Model. + + Attributes: + elements: A list (or other python object) used as a staging structure + for python based grammar definition. Used in _from_python for + building nodes list of child parser expressions. + rule_name (str): The name of the parser rule if this is the root rule. + root (bool): Does this parser expression represents the + root of the parser rule? The root parser rule will create + non-terminal node of the parse tree during parsing. + nodes (list of ParsingExpression): A list of child parser expressions. + suppress (bool): If this is set to True than no ParseTreeNode will be + created for this ParsingExpression. Default False. + """ + + suppress = False + + def __init__(self, *elements, **kwargs): + + if len(elements) == 1: + elements = elements[0] + self.elements = elements + + self.rule_name = kwargs.get('rule_name', '') + self.root = kwargs.get('root', False) + + nodes = kwargs.get('nodes', []) + if not hasattr(nodes, '__iter__'): + nodes = [nodes] + self.nodes = nodes + + if 'suppress' in kwargs: + self.suppress = kwargs['suppress'] + + # Memoization. Every node cache the parsing results for the given input + # positions. + self._result_cache = {} # position -> parse tree at the position + + @property + def desc(self): + return "{}{}".format(self.name, "-" if self.suppress else "") + + @property + def name(self): + if self.root: + return "%s=%s" % (self.rule_name, self.__class__.__name__) + else: + return self.__class__.__name__ + + @property + def id(self): + if self.root: + return self.rule_name + else: + return id(self) + + def _clear_cache(self, processed=None): + """ + Clears memoization cache. Should be called on input change and end + of parsing. + + Args: + processed (set): Set of processed nodes to prevent infinite loops. + """ + + self._result_cache = {} + + if not processed: + processed = set() + + for node in self.nodes: + if node not in processed: + processed.add(node) + node._clear_cache(processed) + + def parse(self, parser): + + if parser.debug: + name = self.name + if name.startswith('__asgn'): + name = "{}[{}]".format(self.name, self._attr_name) + parser.dprint(">> Matching rule {}{} at position {} => {}" + .format(name, + " in {}".format(parser.in_rule) + if parser.in_rule else "", + parser.position, + parser.context()), 1) + + # Current position could change in recursive calls + # so save it. + c_pos = parser.position + + # Memoization. + # If this position is already parsed by this parser expression use + # the result + if parser.memoization: + try: + result, new_pos = self._result_cache[c_pos] + parser.position = new_pos + parser.cache_hits += 1 + if parser.debug: + parser.dprint( + "** Cache hit for [{}, {}] = '{}' : new_pos={}" + .format(name, c_pos, text(result), text(new_pos))) + parser.dprint( + "<<+ Matched rule {} at position {}" + .format(name, new_pos), -1) + + # If NoMatch is recorded at this position raise. + if result is NOMATCH_MARKER: + raise parser.nm + + # else return cached result + return result + + except KeyError: + parser.cache_misses += 1 + + # Remember last parsing expression and set this as + # the new last. + last_pexpression = parser.last_pexpression + parser.last_pexpression = self + + if self.rule_name: + # If we are entering root rule + # remember previous root rule name and set + # this one on the parser to be available for + # debugging messages + previous_root_rule_name = parser.in_rule + parser.in_rule = self.rule_name + + try: + result = self._parse(parser) + if self.suppress or (type(result) is list and + result and result[0] is None): + result = None + + except NoMatch: + parser.position = c_pos # Backtracking + # Memoize NoMatch at this position for this rule + if parser.memoization: + self._result_cache[c_pos] = (NOMATCH_MARKER, c_pos) + raise + + finally: + # Recover last parsing expression. + parser.last_pexpression = last_pexpression + + if parser.debug: + parser.dprint("<<{} rule {}{} at position {} => {}" + .format("- Not matched" + if parser.position is c_pos + else "+ Matched", + name, + " in {}".format(parser.in_rule) + if parser.in_rule else "", + parser.position, + parser.context()), -1) + + # If leaving root rule restore previous root rule name. + if self.rule_name: + parser.in_rule = previous_root_rule_name + + # For root rules flatten non-terminal/list + if self.root and result and not isinstance(result, Terminal): + if not isinstance(result, NonTerminal): + result = flatten(result) + + # Tree reduction will eliminate Non-terminal with single child. + if parser.reduce_tree and len(result) == 1: + result = result[0] + + # If the result is not parse tree node it must be a plain list + # so create a new NonTerminal. + if not isinstance(result, ParseTreeNode): + result = NonTerminal(self, result) + + # Result caching for use by memoization. + if parser.memoization: + self._result_cache[c_pos] = (result, parser.position) + + return result + + +class Sequence(ParsingExpression): + """ + Will match sequence of parser expressions in exact order they are defined. + """ + + def __init__(self, *elements, **kwargs): + super(Sequence, self).__init__(*elements, **kwargs) + self.ws = kwargs.pop('ws', None) + self.skipws = kwargs.pop('skipws', None) + + def _parse(self, parser): + results = [] + c_pos = parser.position + + if self.ws is not None: + old_ws = parser.ws + parser.ws = self.ws + + if self.skipws is not None: + old_skipws = parser.skipws + parser.skipws = self.skipws + + # Prefetching + append = results.append + + try: + for e in self.nodes: + result = e.parse(parser) + if result: + append(result) + + except NoMatch: + parser.position = c_pos # Backtracking + raise + + finally: + if self.ws is not None: + parser.ws = old_ws + if self.skipws is not None: + parser.skipws = old_skipws + + if results: + return results + + +class OrderedChoice(Sequence): + """ + Will match one of the parser expressions specified. Parser will try to + match expressions in the order they are defined. + """ + def _parse(self, parser): + result = None + match = False + c_pos = parser.position + + if self.ws is not None: + old_ws = parser.ws + parser.ws = self.ws + + if self.skipws is not None: + old_skipws = parser.skipws + parser.skipws = self.skipws + + try: + for e in self.nodes: + try: + result = e.parse(parser) + if result is not None: + match = True + result = [result] + break + except NoMatch: + parser.position = c_pos # Backtracking + finally: + if self.ws is not None: + parser.ws = old_ws + if self.skipws is not None: + parser.skipws = old_skipws + + if not match: + parser._nm_raise(self, c_pos, parser) + + return result + + +class Repetition(ParsingExpression): + """ + Base class for all repetition-like parser expressions (?,*,+) + Args: + eolterm(bool): Flag that indicates that end of line should + terminate repetition match. + """ + def __init__(self, *elements, **kwargs): + super(Repetition, self).__init__(*elements, **kwargs) + self.eolterm = kwargs.get('eolterm', False) + self.sep = kwargs.get('sep', None) + + +class Optional(Repetition): + """ + Optional will try to match parser expression specified and will not fail + in case match is not successful. + """ + def _parse(self, parser): + result = None + c_pos = parser.position + + try: + result = [self.nodes[0].parse(parser)] + except NoMatch: + parser.position = c_pos # Backtracking + + return result + + +class ZeroOrMore(Repetition): + """ + ZeroOrMore will try to match parser expression specified zero or more + times. It will never fail. + """ + def _parse(self, parser): + results = [] + + if self.eolterm: + # Remember current eolterm and set eolterm of + # this repetition + old_eolterm = parser.eolterm + parser.eolterm = self.eolterm + + # Prefetching + append = results.append + p = self.nodes[0].parse + sep = self.sep.parse if self.sep else None + result = None + + while True: + try: + c_pos = parser.position + if sep and result: + sep_result = sep(parser) + if sep_result: + append(sep_result) + result = p(parser) + if not result: + break + append(result) + except NoMatch: + parser.position = c_pos # Backtracking + break + + if self.eolterm: + # Restore previous eolterm + parser.eolterm = old_eolterm + + return results + + +class OneOrMore(Repetition): + """ + OneOrMore will try to match parser expression specified one or more times. + """ + def _parse(self, parser): + results = [] + first = True + + if self.eolterm: + # Remember current eolterm and set eolterm of + # this repetition + old_eolterm = parser.eolterm + parser.eolterm = self.eolterm + + # Prefetching + append = results.append + p = self.nodes[0].parse + sep = self.sep.parse if self.sep else None + result = None + + try: + while True: + try: + c_pos = parser.position + if sep and result: + sep_result = sep(parser) + if sep_result: + append(sep_result) + result = p(parser) + if not result: + break + append(result) + first = False + except NoMatch: + parser.position = c_pos # Backtracking + + if first: + raise + + break + finally: + if self.eolterm: + # Restore previous eolterm + parser.eolterm = old_eolterm + + return results + + +class UnorderedGroup(Repetition): + """ + Will try to match all of the parsing expression in any order. + """ + def _parse(self, parser): + results = [] + c_pos = parser.position + + if self.eolterm: + # Remember current eolterm and set eolterm of + # this repetition + old_eolterm = parser.eolterm + parser.eolterm = self.eolterm + + # Prefetching + append = results.append + nodes_to_try = list(self.nodes) + sep = self.sep.parse if self.sep else None + result = None + sep_result = None + first = True + + while nodes_to_try: + sep_exc = None + + # Separator + c_loc_pos_sep = parser.position + if sep and not first: + try: + sep_result = sep(parser) + except NoMatch as e: + parser.position = c_loc_pos_sep # Backtracking + + # This still might be valid if all remaining subexpressions + # are optional and none of them will match + sep_exc = e + + c_loc_pos = parser.position + match = True + all_optionals_fail = True + for e in list(nodes_to_try): + try: + result = e.parse(parser) + if result: + if sep_exc: + raise sep_exc + if sep_result: + append(sep_result) + first = False + match = True + all_optionals_fail = False + append(result) + nodes_to_try.remove(e) + break + + except NoMatch: + match = False + parser.position = c_loc_pos # local backtracking + + if not match or all_optionals_fail: + # If sep is matched backtrack it + parser.position = c_loc_pos_sep + break + + if self.eolterm: + # Restore previous eolterm + parser.eolterm = old_eolterm + + if not match: + # Unsuccessful match of the whole PE - full backtracking + parser.position = c_pos + parser._nm_raise(self, c_pos, parser) + + if results: + return results + + +class SyntaxPredicate(ParsingExpression): + """ + Base class for all syntax predicates (and, not, empty). + Predicates are parser expressions that will do the match but will not + consume any input. + """ + + +class And(SyntaxPredicate): + """ + This predicate will succeed if the specified expression matches current + input. + """ + def _parse(self, parser): + c_pos = parser.position + for e in self.nodes: + try: + e.parse(parser) + except NoMatch: + parser.position = c_pos + raise + parser.position = c_pos + + +class Not(SyntaxPredicate): + """ + This predicate will succeed if the specified expression doesn't match + current input. + """ + def _parse(self, parser): + c_pos = parser.position + old_in_not = parser.in_not + parser.in_not = True + try: + for e in self.nodes: + try: + e.parse(parser) + except NoMatch: + parser.position = c_pos + return + parser.position = c_pos + parser._nm_raise(self, c_pos, parser) + finally: + parser.in_not = old_in_not + + +class Empty(SyntaxPredicate): + """ + This predicate will always succeed without consuming input. + """ + def _parse(self, parser): + pass + + +class Decorator(ParsingExpression): + """ + Decorator are special kind of parsing expression used to mark + a containing pexpression and give it some special semantics. + For example, decorators are used to mark pexpression as lexical + rules (see :class:Lex). + """ + + +class Combine(Decorator): + """ + This decorator defines pexpression that represents a lexeme rule. + This rules will always return a Terminal parse tree node. + Whitespaces will be preserved. Comments will not be matched. + """ + def _parse(self, parser): + results = [] + + oldin_lex_rule = parser.in_lex_rule + parser.in_lex_rule = True + c_pos = parser.position + try: + for parser_model_node in self.nodes: + results.append(parser_model_node.parse(parser)) + + results = flatten(results) + + # Create terminal from result + return Terminal(self, c_pos, + "".join([x.flat_str() for x in results])) + except NoMatch: + parser.position = c_pos # Backtracking + raise + finally: + parser.in_lex_rule = oldin_lex_rule + + +class Match(ParsingExpression): + """ + Base class for all classes that will try to match something from the input. + """ + def __init__(self, rule_name, root=False, **kwargs): + super(Match, self).__init__(rule_name=rule_name, root=root, **kwargs) + + @property + def name(self): + if self.root: + return "%s=%s(%s)" % (self.rule_name, self.__class__.__name__, + self.to_match) + else: + return "%s(%s)" % (self.__class__.__name__, self.to_match) + + def _parse_comments(self, parser): + """Parse comments.""" + + try: + parser.in_parse_comments = True + if parser.comments_model: + try: + while True: + # TODO: Consumed whitespaces and comments should be + # attached to the first match ahead. + parser.comments.append( + parser.comments_model.parse(parser)) + if parser.skipws: + # Whitespace skipping + pos = parser.position + ws = parser.ws + i = parser.input + length = len(i) + while pos < length and i[pos] in ws: + pos += 1 + parser.position = pos + except NoMatch: + # NoMatch in comment matching is perfectly + # legal and no action should be taken. + pass + finally: + parser.in_parse_comments = False + + def parse(self, parser): + + if parser.skipws and not parser.in_lex_rule: + # Whitespace skipping + pos = parser.position + ws = parser.ws + i = parser.input + length = len(i) + while pos < length and i[pos] in ws: + pos += 1 + parser.position = pos + + if parser.debug: + parser.dprint( + "?? Try match rule {}{} at position {} => {}" + .format(self.name, + " in {}".format(parser.in_rule) + if parser.in_rule else "", + parser.position, + parser.context())) + + if parser.skipws and parser.position in parser.comment_positions: + # Skip comments if already parsed. + parser.position = parser.comment_positions[parser.position] + else: + if not parser.in_parse_comments and not parser.in_lex_rule: + comment_start = parser.position + self._parse_comments(parser) + parser.comment_positions[comment_start] = parser.position + + result = self._parse(parser) + if not self.suppress: + return result + + +class RegExMatch(Match): + ''' + This Match class will perform input matching based on Regular Expressions. + + Args: + to_match (regex string): A regular expression string to match. + It will be used to create regular expression using re.compile. + ignore_case(bool): If case insensitive match is needed. + Default is None to support propagation from global parser setting. + multiline(bool): allow regex to works on multiple lines + (re.DOTALL flag). Default is None to support propagation from + global parser setting. + str_repr(str): A string that is used to represent this regex. + re_flags: flags parameter for re.compile if neither ignore_case + or multiple are set. + + ''' + def __init__(self, to_match, rule_name='', root=False, ignore_case=None, + multiline=None, str_repr=None, re_flags=re.MULTILINE, + **kwargs): + super(RegExMatch, self).__init__(rule_name, root, **kwargs) + self.to_match_regex = to_match + self.ignore_case = ignore_case + self.multiline = multiline + self.explicit_flags = re_flags + + self.to_match = str_repr if str_repr is not None else to_match + + def compile(self): + flags = self.explicit_flags + if self.multiline is True: + flags |= re.DOTALL + if self.multiline is False and flags & re.DOTALL: + flags -= re.DOTALL + if self.ignore_case is True: + flags |= re.IGNORECASE + if self.ignore_case is False and flags & re.IGNORECASE: + flags -= re.IGNORECASE + self.regex = re.compile(self.to_match_regex, flags) + + def __str__(self): + return self.to_match + + def __unicode__(self): + return self.__str__() + + def _parse(self, parser): + c_pos = parser.position + m = self.regex.match(parser.input, c_pos) + if m: + matched = m.group() + if parser.debug: + parser.dprint( + "++ Match '%s' at %d => '%s'" % + (matched, c_pos, parser.context(len(matched)))) + parser.position += len(matched) + if matched: + return Terminal(self, c_pos, matched, extra_info=m) + else: + if parser.debug: + parser.dprint("-- NoMatch at {}".format(c_pos)) + parser._nm_raise(self, c_pos, parser) + + +class StrMatch(Match): + """ + This Match class will perform input matching by a string comparison. + + Args: + to_match (str): A string to match. + ignore_case(bool): If case insensitive match is needed. + Default is None to support propagation from global parser setting. + """ + def __init__(self, to_match, rule_name='', root=False, ignore_case=None, + **kwargs): + super(StrMatch, self).__init__(rule_name, root, **kwargs) + self.to_match = to_match + self.ignore_case = ignore_case + + def _parse(self, parser): + c_pos = parser.position + input_frag = parser.input[c_pos:c_pos+len(self.to_match)] + if self.ignore_case: + match = input_frag.lower() == self.to_match.lower() + else: + match = input_frag == self.to_match + if match: + if parser.debug: + parser.dprint( + "++ Match '{}' at {} => '{}'" + .format(self.to_match, c_pos, + parser.context(len(self.to_match)))) + parser.position += len(self.to_match) + + # If this match is inside sequence than mark for suppression + suppress = type(parser.last_pexpression) is Sequence + + return Terminal(self, c_pos, self.to_match, suppress=suppress) + else: + if parser.debug: + parser.dprint( + "-- No match '{}' at {} => '{}'" + .format(self.to_match, c_pos, + parser.context(len(self.to_match)))) + parser._nm_raise(self, c_pos, parser) + + def __str__(self): + return self.to_match + + def __unicode__(self): + return self.__str__() + + def __eq__(self, other): + return self.to_match == text(other) + + def __hash__(self): + return hash(self.to_match) + + + +# HACK: Kwd class is a bit hackish. Need to find a better way to +# introduce different classes of string tokens. +class Kwd(StrMatch): + """ + A specialization of StrMatch to specify keywords of the language. + """ + def __init__(self, to_match): + super(Kwd, self).__init__(to_match) + self.to_match = to_match + self.root = True + self.rule_name = 'keyword' + + +class EndOfFile(Match): + """ + The Match class that will succeed in case end of input is reached. + """ + def __init__(self): + super(EndOfFile, self).__init__("EOF") + + @property + def name(self): + return "EOF" + + def _parse(self, parser): + c_pos = parser.position + if len(parser.input) == c_pos: + return Terminal(EOF(), c_pos, '', suppress=True) + else: + if parser.debug: + parser.dprint("!! EOF not matched.") + parser._nm_raise(self, c_pos, parser) + + +def EOF(): + return EndOfFile() + +# --------------------------------------------------------- + + +# --------------------------------------------------- +# Parse Tree node classes + +class ParseTreeNode(object): + """ + Abstract base class representing node of the Parse Tree. + The node can be terminal(the leaf of the parse tree) or non-terminal. + + Attributes: + rule (ParsingExpression): The rule that created this node. + rule_name (str): The name of the rule that created this node if + root rule or empty string otherwise. + position (int): A position in the input stream where the match + occurred. + position_end (int, read-only): A position in the input stream where + the node ends. + This position is one char behind the last char contained in this + node. Thus, position_end - position = length of the node. + error (bool): Is this a false parse tree node created during error + recovery. + comments : A parse tree of comment(s) attached to this node. + """ + def __init__(self, rule, position, error): + assert rule + assert rule.rule_name is not None + self.rule = rule + self.rule_name = rule.rule_name + self.position = position + self.error = error + self.comments = None + + @property + def name(self): + return "%s [%s]" % (self.rule_name, self.position) + + @property + def position_end(self): + "Must be implemented in subclasses." + raise NotImplementedError + + def visit(self, visitor): + """ + Visitor pattern implementation. + + Args: + visitor(PTNodeVisitor): The visitor object. + """ + if visitor.debug: + visitor.dprint("Visiting {} type:{} str:{}" + .format(self.name, type(self).__name__, text(self))) + + children = SemanticActionResults() + if isinstance(self, NonTerminal): + for node in self: + child = node.visit(visitor) + # If visit returns None suppress that child node + if child is not None: + children.append_result(node.rule_name, child) + + visit_name = "visit_%s" % self.rule_name + if hasattr(visitor, visit_name): + # Call visit method. + result = getattr(visitor, visit_name)(self, children) + + # If there is a method with 'second' prefix save + # the result of visit for post-processing + if hasattr(visitor, "second_%s" % self.rule_name): + visitor.for_second_pass.append((self.rule_name, result)) + + return result + + elif visitor.defaults: + # If default actions are enabled + return visitor.visit__default__(self, children) + + def tree_str(self, indent=0): + return '{}{} [{}-{}]'.format(' ' * indent, self.rule.name, + self.position, self.position_end) + + +class Terminal(ParseTreeNode): + """ + Leaf node of the Parse Tree. Represents matched string. + + Attributes: + rule (ParsingExpression): The rule that created this terminal. + position (int): A position in the input stream where match occurred. + value (str): Matched string at the given position or missing token + name in the case of an error node. + suppress(bool): If True this terminal can be ignored in semantic + analysis. + extra_info(object): additional information (e.g. the re matcher + object) + """ + + __slots__ = ['rule', 'rule_name', 'position', 'error', 'comments', + 'value', 'suppress', 'extra_info'] + + def __init__(self, rule, position, value, error=False, suppress=False, + extra_info=None): + super(Terminal, self).__init__(rule, position, error) + self.value = value + self.suppress = suppress + self.extra_info = extra_info + + @property + def desc(self): + if self.value: + return "%s '%s' [%s]" % (self.rule_name, self.value, self.position) + else: + return "%s [%s]" % (self.rule_name, self.position) + + @property + def position_end(self): + return self.position + len(self.value) + + def flat_str(self): + return self.value + + def __str__(self): + return self.value + + def __unicode__(self): + return self.__str__() + + def __repr__(self): + return self.desc + + def tree_str(self, indent=0): + return '{}: {}'.format(super(Terminal, self).tree_str(indent), + self.value) + + def __eq__(self, other): + return text(self) == text(other) + + +class NonTerminal(ParseTreeNode, list): + """ + Non-leaf node of the Parse Tree. Represents language syntax construction. + At the same time used in ParseTreeNode navigation expressions. + See test_ptnode_navigation_expressions.py for examples of navigation + expressions. + + Attributes: + nodes (list of ParseTreeNode): Children parse tree nodes. + _filtered (bool): Is this NT a dynamically created filtered NT. + This is used internally. + + """ + + __slots__ = ['rule', 'rule_name', 'position', 'error', 'comments', + '_filtered', '_expr_cache'] + + def __init__(self, rule, nodes, error=False, _filtered=False): + + # Inherit position from the first child node + position = nodes[0].position if nodes else 0 + + super(NonTerminal, self).__init__(rule, position, error) + + self.extend(flatten([nodes])) + self._filtered = _filtered + + @property + def value(self): + """Terminal protocol.""" + return text(self) + + @property + def desc(self): + return self.name + + @property + def position_end(self): + return self[-1].position_end if self else self.position + + def flat_str(self): + """ + Return flatten string representation. + """ + return "".join([x.flat_str() for x in self]) + + def __str__(self): + return " | ".join([text(x) for x in self]) + + def __unicode__(self): + return self.__str__() + + def __repr__(self): + return "[ %s ]" % ", ".join([repr(x) for x in self]) + + def tree_str(self, indent=0): + return '{}\n{}'.format(super(NonTerminal, self).tree_str(indent), + '\n'.join([c.tree_str(indent + 1) + for c in self])) + + def __getattr__(self, rule_name): + """ + Find a child (non)terminal by the rule name. + + Args: + rule_name(str): The name of the rule that is referenced from + this node rule. + """ + # Prevent infinite recursion + if rule_name in ['_expr_cache', '_filtered', 'rule', 'rule_name', + 'position', 'append', 'extend']: + raise AttributeError + + try: + # First check the cache + if rule_name in self._expr_cache: + return self._expr_cache[rule_name] + except AttributeError: + # Navigation expression cache. Used for lookup by rule name. + self._expr_cache = {} + + # If result is not found in the cache collect all nodes + # with the given rule name and create new NonTerminal + # and cache it for later access. + nodes = [] + rule = None + for n in self: + if self._filtered: + # For filtered NT rule_name is a rule on + # each of its children + for m in n: + if m.rule_name == rule_name: + nodes.append(m) + rule = m.rule + else: + if n.rule_name == rule_name: + nodes.append(n) + rule = n.rule + + if rule is None: + # If rule is not found resort to default behavior + return self.__getattribute__(rule_name) + + result = NonTerminal(rule=rule, nodes=nodes, _filtered=True) + self._expr_cache[rule_name] = result + return result + + +# ---------------------------------------------------- +# Semantic Actions +# +class PTNodeVisitor(DebugPrinter): + """ + Base class for all parse tree visitors. + """ + def __init__(self, defaults=True, **kwargs): + """ + Args: + defaults(bool): If the default visit method should be applied in + case no method is defined. + """ + self.for_second_pass = [] + self.defaults = defaults + + super(PTNodeVisitor, self).__init__(**kwargs) + + def visit__default__(self, node, children): + """ + Called if no visit method is defined for the node. + + Args: + node(ParseTreeNode): + children(processed children ParseTreeNode-s): + """ + if isinstance(node, Terminal): + # Default for Terminal is to convert to string unless suppress flag + # is set in which case it is suppressed by setting to None. + retval = text(node) if not node.suppress else None + else: + retval = node + # Special case. If only one child exist return it. + if len(children) == 1: + retval = children[0] + else: + # If there is only one non-string child return + # that by default. This will support e.g. bracket + # removals. + last_non_str = None + for c in children: + if not isstr(c): + if last_non_str is None: + last_non_str = c + else: + # If there is multiple non-string objects + # by default convert non-terminal to string + if self.debug: + self.dprint("*** Warning: Multiple " + "non-string objects found in " + "default visit. Converting non-" + "terminal to a string.") + retval = text(node) + break + else: + # Return the only non-string child + retval = last_non_str + + return retval + + +def visit_parse_tree(parse_tree, visitor): + """ + Applies visitor to parse_tree and runs the second pass + afterwards. + + Args: + parse_tree(ParseTreeNode): + visitor(PTNodeVisitor): + """ + if not parse_tree: + raise Exception( + "Parse tree is empty. You did call parse(), didn't you?") + + if visitor.debug: + visitor.dprint("ASG: First pass") + + # Visit tree. + result = parse_tree.visit(visitor) + + # Second pass + if visitor.debug: + visitor.dprint("ASG: Second pass") + for sa_name, asg_node in visitor.for_second_pass: + getattr(visitor, "second_%s" % sa_name)(asg_node) + + return result + + +class SemanticAction(object): + """ + Semantic actions are executed during semantic analysis. They are in charge + of producing Abstract Semantic Graph (ASG) out of the parse tree. + Every non-terminal and terminal can have semantic action defined which will + be triggered during semantic analysis. + Semantic action triggering is separated in two passes. first_pass method is + required and the method called second_pass is optional and will be called + if exists after the first pass. Second pass can be used for forward + referencing, e.g. linking to the declaration registered in the first pass + stage. + """ + def first_pass(self, parser, node, nodes): + """ + Called in the first pass of tree walk. + This is the default implementation used if no semantic action is + defined. + """ + if isinstance(node, Terminal): + # Default for Terminal is to convert to string unless suppress flag + # is set in which case it is suppressed by setting to None. + retval = text(node) if not node.suppress else None + else: + retval = node + # Special case. If only one child exist return it. + if len(nodes) == 1: + retval = nodes[0] + else: + # If there is only one non-string child return + # that by default. This will support e.g. bracket + # removals. + last_non_str = None + for c in nodes: + if not isstr(c): + if last_non_str is None: + last_non_str = c + else: + # If there is multiple non-string objects + # by default convert non-terminal to string + if parser.debug: + parser.dprint( + "*** Warning: Multiple non-" + "string objects found in applying " + "default semantic action. Converting " + "non-terminal to string.") + retval = text(node) + break + else: + # Return the only non-string child + retval = last_non_str + + return retval + + +class SemanticActionResults(list): + """ + Used in visitor methods call to supply results of semantic analysis + of children parse tree nodes. + Enables dot access by the name of the rule similar to NonTerminal + tree navigation. + Enables index access as well as iteration. + """ + def __init__(self): + self.results = {} + + def append_result(self, name, result): + if name: + if name not in self.results: + self.results[name] = [] + self.results[name].append(result) + + self.append(result) + + def __getattr__(self, attr_name): + if attr_name == 'results': + raise AttributeError + + return self.results.get(attr_name, []) + + +# Common semantic actions +class SemanticActionSingleChild(SemanticAction): + def first_pass(self, parser, node, children): + return children[0] + + +class SemanticActionBodyWithBraces(SemanticAction): + def first_pass(self, parser, node, children): + return children[1:-1] + + +class SemanticActionToString(SemanticAction): + def first_pass(self, parser, node, children): + return text(node) + +# ---------------------------------------------------- +# Parsers + + +class Parser(DebugPrinter): + """ + Abstract base class for all parsers. + + Attributes: + comments_model: parser model for comments. + comments(list): A list of ParseTreeNode for matched comments. + sem_actions(dict): A dictionary of semantic actions keyed by the + rule name. + parse_tree(NonTerminal): The parse tree consisting of NonTerminal and + Terminal instances. + in_rule (str): Current rule name. + in_parse_comments (bool): True if parsing comments. + in_lex_rule (bool): True if in lexical rule. Currently used in Combine + decorator to convert match to a single Terminal. + in_not (bool): True if in Not parsing expression. Used for better error + reporting. + last_pexpression (ParsingExpression): Last parsing expression + traversed. + """ + + # Not marker for NoMatch rules list. Used if the first unsuccessful rule + # match is Not. + FIRST_NOT = Not() + + def __init__(self, skipws=True, ws=None, reduce_tree=False, autokwd=False, + ignore_case=False, memoization=False, **kwargs): + """ + Args: + skipws (bool): Should the whitespace skipping be done. Default is + True. + ws (str): A string consisting of whitespace characters. + reduce_tree (bool): If true non-terminals with single child will be + eliminated from the parse tree. Default is False. + autokwd(bool): If keyword-like StrMatches are matched on word + boundaries. Default is False. + ignore_case(bool): If case is ignored (default=False) + memoization(bool): If memoization should be used + (a.k.a. packrat parsing) + """ + + super(Parser, self).__init__(**kwargs) + + # Used to indicate state in which parser should not + # treat newlines as whitespaces. + self._eolterm = False + + self.skipws = skipws + if ws is not None: + self.ws = ws + else: + self.ws = DEFAULT_WS + + self.reduce_tree = reduce_tree + self.autokwd = autokwd + self.ignore_case = ignore_case + self.memoization = memoization + self.comments_model = None + self.comments = [] + self.comment_positions = {} + self.sem_actions = {} + + self.parse_tree = None + + # Create regex used for autokwd matching + flags = 0 + if ignore_case: + flags = re.IGNORECASE + self.keyword_regex = re.compile(r'[^\d\W]\w*', flags) + + # Keep track of root rule we are currently in. + # Used for debugging purposes + self.in_rule = '' + + self.in_parse_comments = False + + # Are we in lexical rule? If so do not + # skip whitespaces. + self.in_lex_rule = False + + # Are we in Not parsing expression? + self.in_not = False + + # Last parsing expression traversed + self.last_pexpression = None + + @property + def ws(self): + return self._ws + + @ws.setter + def ws(self, new_value): + self._real_ws = new_value + self._ws = new_value + if self.eolterm: + self._ws = self._ws.replace('\n', '').replace('\r', '') + + @property + def eolterm(self): + return self._eolterm + + @eolterm.setter + def eolterm(self, new_value): + # Toggle newline char in ws on eolterm property set. + # During eolterm state parser should not treat + # newline as a whitespace. + self._eolterm = new_value + if self._eolterm: + self._ws = self._ws.replace('\n', '').replace('\r', '') + else: + self._ws = self._real_ws + + def parse(self, _input, file_name=None): + """ + Parses input and produces parse tree. + + Args: + _input(str): An input string to parse. + file_name(str): If input is loaded from file this can be + set to file name. It is used in error messages. + """ + self.position = 0 # Input position + self.nm = None # Last NoMatch exception + self.line_ends = [] + self.input = _input + self.file_name = file_name + self.comment_positions = {} + self.cache_hits = 0 + self.cache_misses = 0 + try: + self.parse_tree = self._parse() + except NoMatch as e: + # Remove Not marker + if e.rules[0] is Parser.FIRST_NOT: + del e.rules[0] + # Get line and column from position + e.line, e.col = self.pos_to_linecol(e.position) + raise + finally: + # At end of parsing clear all memoization caches. + # Do this here to free memory. + if self.memoization: + self._clear_caches() + + # In debug mode export parse tree to dot file for + # visualization + if self.debug and self.parse_tree: + from arpeggio.export import PTDOTExporter + root_rule_name = self.parse_tree.rule_name + PTDOTExporter().exportFile( + self.parse_tree, "{}_parse_tree.dot".format(root_rule_name)) + return self.parse_tree + + def parse_file(self, file_name): + """ + Parses content from the given file. + Args: + file_name(str): A file name. + """ + with codecs.open(file_name, 'r', 'utf-8') as f: + content = f.read() + + return self.parse(content, file_name=file_name) + + def getASG(self, sem_actions=None, defaults=True): + """ + Creates Abstract Semantic Graph (ASG) from the parse tree. + + Args: + sem_actions (dict): The semantic actions dictionary to use for + semantic analysis. Rule names are the keys and semantic action + objects are values. + defaults (bool): If True a default semantic action will be + applied in case no action is defined for the node. + """ + if not self.parse_tree: + raise Exception( + "Parse tree is empty. You did call parse(), didn't you?") + + if sem_actions is None: + if not self.sem_actions: + raise Exception("Semantic actions not defined.") + else: + sem_actions = self.sem_actions + + if type(sem_actions) is not dict: + raise Exception("Semantic actions parameter must be a dictionary.") + + for_second_pass = [] + + def tree_walk(node): + """ + Walking the parse tree and calling first_pass for every registered + semantic actions and creating list of object that needs to be + called in the second pass. + """ + + if self.debug: + self.dprint( + "Walking down %s type: %s str: %s" % + (node.name, type(node).__name__, text(node))) + + children = SemanticActionResults() + if isinstance(node, NonTerminal): + for n in node: + child = tree_walk(n) + if child is not None: + children.append_result(n.rule_name, child) + + if self.debug: + self.dprint("Processing %s = '%s' type:%s len:%d" % + (node.name, text(node), type(node).__name__, + len(node) if isinstance(node, list) else 0)) + for i, a in enumerate(children): + self.dprint(" %d:%s type:%s" % + (i+1, text(a), type(a).__name__)) + + if node.rule_name in sem_actions: + sem_action = sem_actions[node.rule_name] + if isinstance(sem_action, types.FunctionType): + retval = sem_action(self, node, children) + else: + retval = sem_action.first_pass(self, node, children) + + if hasattr(sem_action, "second_pass"): + for_second_pass.append((node.rule_name, retval)) + + if self.debug: + action_name = sem_action.__name__ \ + if hasattr(sem_action, '__name__') \ + else sem_action.__class__.__name__ + self.dprint(" Applying semantic action %s" % action_name) + + else: + if defaults: + # If no rule is present use some sane defaults + if self.debug: + self.dprint(" Applying default semantic action.") + + retval = SemanticAction().first_pass(self, node, children) + + else: + retval = node + + if self.debug: + if retval is None: + self.dprint(" Suppressed.") + else: + self.dprint(" Resolved to = %s type:%s" % + (text(retval), type(retval).__name__)) + return retval + + if self.debug: + self.dprint("ASG: First pass") + asg = tree_walk(self.parse_tree) + + # Second pass + if self.debug: + self.dprint("ASG: Second pass") + for sa_name, asg_node in for_second_pass: + sem_actions[sa_name].second_pass(self, asg_node) + + return asg + + def pos_to_linecol(self, pos): + """ + Calculate (line, column) tuple for the given position in the stream. + """ + if not self.line_ends: + try: + # TODO: Check this implementation on Windows. + self.line_ends.append(self.input.index("\n")) + while True: + try: + self.line_ends.append( + self.input.index("\n", self.line_ends[-1] + 1)) + except ValueError: + break + except ValueError: + pass + + line = bisect.bisect_left(self.line_ends, pos) + col = pos + if line > 0: + col -= self.line_ends[line - 1] + if self.input[self.line_ends[line - 1]] in '\n\r': + col -= 1 + return line + 1, col + 1 + + def context(self, length=None, position=None): + """ + Returns current context substring, i.e. the substring around current + position. + Args: + length(int): If given used to mark with asterisk a length chars + from the current position. + position(int): The position in the input stream. + """ + if not position: + position = self.position + if length: + retval = "{}*{}*{}".format( + text(self.input[max(position - 10, 0):position]), + text(self.input[position:position + length]), + text(self.input[position + length:position + 10])) + else: + retval = "{}*{}".format( + text(self.input[max(position - 10, 0):position]), + text(self.input[position:position + 10])) + + return retval.replace('\n', ' ').replace('\r', '') + + def _nm_raise(self, *args): + """ + Register new NoMatch object if the input is consumed + from the last NoMatch and raise last NoMatch. + + Args: + args: A NoMatch instance or (value, position, parser) + """ + + rule, position, parser = args + if self.nm is None or not parser.in_parse_comments: + if self.nm is None or position > self.nm.position: + if self.in_not: + self.nm = NoMatch([Parser.FIRST_NOT], position, parser) + else: + self.nm = NoMatch([rule], position, parser) + elif position == self.nm.position and isinstance(rule, Match) \ + and not self.in_not: + self.nm.rules.append(rule) + + raise self.nm + + def _clear_caches(self): + """ + Clear memoization caches if packrat parser is used. + """ + self.parser_model._clear_cache() + if self.comments_model: + self.comments_model._clear_cache() + + +class CrossRef(object): + ''' + Used for rule reference resolving. + ''' + def __init__(self, target_rule_name, position=-1): + self.target_rule_name = target_rule_name + self.position = position + + +class ParserPython(Parser): + + def __init__(self, language_def, comment_def=None, syntax_classes=None, + *args, **kwargs): + """ + Constructs parser from python statements and expressions. + + Args: + language_def (python function): A python function that defines + the root rule of the grammar. + comment_def (python function): A python function that defines + the root rule of the comments grammar. + syntax_classes (dict): Overrides of special syntax parser + expression classes (StrMatch, Sequence, OrderedChoice). + + """ + super(ParserPython, self).__init__(*args, **kwargs) + + self.syntax_classes = syntax_classes if syntax_classes else {} + + # PEG Abstract Syntax Graph + self.parser_model = self._from_python(language_def) + + self.comments_model = None + if comment_def: + self.comments_model = self._from_python(comment_def) + self.comments_model.root = True + self.comments_model.rule_name = comment_def.__name__ + + # In debug mode export parser model to dot for + # visualization + if self.debug: + from arpeggio.export import PMDOTExporter + root_rule = language_def.__name__ + PMDOTExporter().exportFile(self.parser_model, + "{}_parser_model.dot".format(root_rule)) + + def _parse(self): + return self.parser_model.parse(self) + + def _from_python(self, expression): + """ + Create parser model from the definition given in the form of python + functions returning lists, tuples, callables, strings and + ParsingExpression objects. + + Returns: + Parser Model (PEG Abstract Semantic Graph) + """ + __rule_cache = {"EndOfFile": EndOfFile()} + __for_resolving = [] # Expressions that needs crossref resolvnih + self.__cross_refs = 0 + _StrMatch = self.syntax_classes.get('StrMatch', StrMatch) + _OrderedChoice = self.syntax_classes.get('OrderedChoice', + OrderedChoice) + _Sequence = self.syntax_classes.get('Sequence', Sequence) + + def inner_from_python(expression): + retval = None + if isinstance(expression, types.FunctionType): + # If this expression is a parser rule + rule_name = expression.__name__ + if rule_name in __rule_cache: + c_rule = __rule_cache.get(rule_name) + if self.debug: + self.dprint("Rule {} founded in cache." + .format(rule_name)) + if isinstance(c_rule, CrossRef): + self.__cross_refs += 1 + if self.debug: + self.dprint("CrossRef usage: {}" + .format(c_rule.target_rule_name)) + return c_rule + + # Semantic action for the rule + if hasattr(expression, "sem"): + self.sem_actions[rule_name] = expression.sem + + # Register rule cross-ref to support recursion + __rule_cache[rule_name] = CrossRef(rule_name) + + curr_expr = expression + while isinstance(curr_expr, types.FunctionType): + # If function directly returns another function + # go into until non-function is returned. + curr_expr = curr_expr() + retval = inner_from_python(curr_expr) + retval.rule_name = rule_name + retval.root = True + + # Update cache + __rule_cache[rule_name] = retval + if self.debug: + self.dprint("New rule: {} -> {}" + .format(rule_name, retval.__class__.__name__)) + + elif type(expression) is text or isinstance(expression, _StrMatch): + if type(expression) is text: + retval = _StrMatch(expression, + ignore_case=self.ignore_case) + else: + retval = expression + if expression.ignore_case is None: + expression.ignore_case = self.ignore_case + + if self.autokwd: + to_match = retval.to_match + match = self.keyword_regex.match(to_match) + if match and match.span() == (0, len(to_match)): + retval = RegExMatch(r'{}\b'.format(to_match), + ignore_case=self.ignore_case, + str_repr=to_match) + retval.compile() + + elif isinstance(expression, RegExMatch): + # Regular expression are not compiled yet + # to support global settings propagation from + # parser. + if expression.ignore_case is None: + expression.ignore_case = self.ignore_case + expression.compile() + + retval = expression + + elif isinstance(expression, Match): + retval = expression + + elif isinstance(expression, UnorderedGroup): + retval = expression + for n in retval.elements: + retval.nodes.append(inner_from_python(n)) + if any((isinstance(x, CrossRef) for x in retval.nodes)): + __for_resolving.append(retval) + + elif isinstance(expression, _Sequence) or \ + isinstance(expression, Repetition) or \ + isinstance(expression, SyntaxPredicate) or \ + isinstance(expression, Decorator): + retval = expression + retval.nodes.append(inner_from_python(retval.elements)) + if any((isinstance(x, CrossRef) for x in retval.nodes)): + __for_resolving.append(retval) + + elif type(expression) in [list, tuple]: + if type(expression) is list: + retval = _OrderedChoice(expression) + else: + retval = _Sequence(expression) + + retval.nodes = [inner_from_python(e) for e in expression] + if any((isinstance(x, CrossRef) for x in retval.nodes)): + __for_resolving.append(retval) + + else: + raise GrammarError("Unrecognized grammar element '%s'." % + text(expression)) + + # Translate separator expression. + if isinstance(expression, Repetition) and expression.sep: + expression.sep = inner_from_python(expression.sep) + + return retval + + # Cross-ref resolving + def resolve(): + for e in __for_resolving: + for i, node in enumerate(e.nodes): + if isinstance(node, CrossRef): + self.__cross_refs -= 1 + e.nodes[i] = __rule_cache[node.target_rule_name] + + parser_model = inner_from_python(expression) + resolve() + assert self.__cross_refs == 0, "Not all crossrefs are resolved!" + return parser_model + + def errors(self): + pass diff --git a/myenv/lib/python3.12/site-packages/arpeggio/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73499f5a28f391d5f8721bf5e2795535aea90d25 GIT binary patch literal 76882 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 O*?}z|b983Z;{O1VCfnrz literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/__pycache__/cleanpeg.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/__pycache__/cleanpeg.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0231e5c745fb4962343fb50530dacc0d6ae5c076 GIT binary patch literal 3871 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/__pycache__/peg.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/__pycache__/peg.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59f65dc336a5ea57fadcaf53b720d0c3d2b9e861 GIT binary patch literal 13106 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/__pycache__/utils.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e5162c5316d64afe4a0ca003c99ad87a5d9cda3 GIT binary patch literal 617 zcmbtQv2GJV5S`sUJLgjzryvELZ76a=cu8m@B&0y;CL&VYSm(RdWr@9a+F2)DL_v{? z8YvVMv=*O26DbuZ3M78OV2a39c1;|m&qzCZGxK)d%zUrc1F#mT{q!pV`0awFc{gD8 z%z|@Bpa(S&gg`>hphpY#2n2f!x@t4jWe%WVC-9CPzzGSx(+9zRq-8e7=Ge%gG*VzE zh^@-4IR$3ltZm&nnA_TWFm%cKc7yg{Lb@R>1Bp_hiBv4gU=X1|qoqnGq$G&0LvtSU zkup5yZ%}CDuZ0n+xvOO&`L4htljS_u*;`>=DwKnv;G;sQV?LAvo)_jYQ_nkF+Z?44 zPxB}~ic*0*(z!@enQ^xZcJiXENVLkjW)c@_}O^)x%H)Y+1R}BH)l2l_t{vx z>x5LhLzT?QRW16zrS>gc$S+*o74FWkciCuN_$}>*>xN#r((fl(-0$nk@?Tl&MkDb` z>r78z!CUm4`#Ym784tw^y>6-Qr1-?TDI*B8E`_ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/cleanpeg.py b/myenv/lib/python3.12/site-packages/arpeggio/cleanpeg.py new file mode 100644 index 0000000..d9d7213 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/cleanpeg.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: cleanpeg.py +# Purpose: This module is a variation of the original peg.py. +# The syntax is slightly changed to be more readable and familiar to +# python users. It is based on the Yash's suggestion - issue 11 +# Author: Igor R. Dejanovic +# Copyright: (c) 2014-2017 Igor R. Dejanovic +# License: MIT License +####################################################################### + +from __future__ import print_function, unicode_literals + +from arpeggio import Optional, ZeroOrMore, Not, OneOrMore, EOF, ParserPython, \ + visit_parse_tree +from arpeggio import RegExMatch as _ +from .peg import PEGVisitor +from .peg import ParserPEG as ParserPEGOrig + +__all__ = ['ParserPEG'] + +# Lexical invariants +ASSIGNMENT = "=" +ORDERED_CHOICE = "/" +ZERO_OR_MORE = "*" +ONE_OR_MORE = "+" +OPTIONAL = "?" +UNORDERED_GROUP = "#" +AND = "&" +NOT = "!" +OPEN = "(" +CLOSE = ")" + +# PEG syntax rules +def peggrammar(): return OneOrMore(rule), EOF +def rule(): return rule_name, ASSIGNMENT, ordered_choice +def ordered_choice(): return sequence, ZeroOrMore(ORDERED_CHOICE, sequence) +def sequence(): return OneOrMore(prefix) +def prefix(): return Optional([AND, NOT]), sufix +def sufix(): return expression, Optional([OPTIONAL, + ZERO_OR_MORE, + ONE_OR_MORE, + UNORDERED_GROUP]) +def expression(): return [regex, rule_crossref, + (OPEN, ordered_choice, CLOSE), + str_match], Not(ASSIGNMENT) + +# PEG Lexical rules +def regex(): return [("r'", _(r'''[^'\\]*(?:\\.[^'\\]*)*'''), "'"), + ('r"', _(r'''[^"\\]*(?:\\.[^"\\]*)*'''), '"')] +def rule_name(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") +def rule_crossref(): return rule_name +def str_match(): return _(r'''(?s)('[^'\\]*(?:\\.[^'\\]*)*')|''' + r'''("[^"\\]*(?:\\.[^"\\]*)*")''') +def comment(): return "//", _(".*\n") + + +class ParserPEG(ParserPEGOrig): + + def _from_peg(self, language_def): + parser = ParserPython(peggrammar, comment, reduce_tree=False, + debug=self.debug) + parser.root_rule_name = self.root_rule_name + parse_tree = parser.parse(language_def) + + return visit_parse_tree(parse_tree, PEGVisitor(self.root_rule_name, + self.comment_rule_name, + self.ignore_case, + debug=self.debug)) diff --git a/myenv/lib/python3.12/site-packages/arpeggio/export.py b/myenv/lib/python3.12/site-packages/arpeggio/export.py new file mode 100644 index 0000000..5b92784 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/export.py @@ -0,0 +1,221 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: export.py +# Purpose: Export support for arpeggio +# Author: Igor R. Dejanović +# Copyright: (c) 2009 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import io +from arpeggio import Terminal + + +class Exporter(object): + """ + Base class for all Exporters. + """ + + def __init__(self): + super(Exporter, self).__init__() + + # Export initialization + self._render_set = set() # Used in rendering to prevent + # rendering + # of the same node multiple times + + self._adapter_map = {} # Used as a registry of adapters to + # ensure that the same adapter is + # returned for the same adaptee object + + def export(self, obj): + """ + Export of an obj to a string. + """ + self._outf = io.StringIO() + self._export(obj) + content = self._outf.getvalue() + self._outf.close() + return content + + def exportFile(self, obj, file_name): + """ + Export of obj to a file. + """ + self._outf = io.open(file_name, "w", encoding="utf-8") + self._export(obj) + self._outf.close() + + def _export(self, obj): + self._outf.write(self._start()) + self._render_node(obj) + self._outf.write(self._end()) + + def _start(self): + """ + Override this to specify the beginning of the graph representation. + """ + return "" + + def _end(self): + """ + Override this to specify the end of the graph representation. + """ + return "" + + +class ExportAdapter(object): + """ + Base adapter class for the export support. + Adapter should be defined for every export and graph type. + + Attributes: + adaptee: A node to adapt. + export: An export object used as a context of the export. + """ + def __init__(self, node, export): + self.adaptee = node # adaptee is adapted graph node + self.export = export + + +# ------------------------------------------------------------------------- +# Support for DOT language + + +class DOTExportAdapter(ExportAdapter): + """ + Base adapter class for the DOT export support. + """ + @property + def id(self): + """ + Graph node unique identification. + """ + raise NotImplementedError() + + @property + def desc(self): + """ + Graph node textual description. + """ + raise NotImplementedError() + + @property + def neighbours(self): + """ + A set of adjacent graph nodes. + """ + raise NotImplementedError() + + +class PMDOTExportAdapter(DOTExportAdapter): + """ + Adapter for ParsingExpression graph types (parser model). + """ + @property + def id(self): + return id(self.adaptee) + + @property + def desc(self): + return self.adaptee.desc + + @property + def neighbours(self): + if not hasattr(self, "_neighbours"): + self._neighbours= [] + + # Registry of adapters used in this export + adapter_map = self.export._adapter_map + + for c, n in enumerate(self.adaptee.nodes): + if isinstance(n, PMDOTExportAdapter): + # if the neighbour node is already adapted use that adapter + self._neighbours.append((str(c + 1), n)) + elif id(n) in adapter_map: + # current node is adaptee -> there is registered adapter + self._neighbours.append((str(c + 1), adapter_map[id(n)])) + else: + # Create new adapter + adapter = PMDOTExportAdapter(n, self.export) + self._neighbours.append((str(c + 1), adapter)) + adapter_map[adapter.id] = adapter + + return self._neighbours + + +class PTDOTExportAdapter(PMDOTExportAdapter): + """ + Adapter for ParseTreeNode graph types. + """ + @property + def neighbours(self): + if isinstance(self.adaptee, Terminal): + return [] + else: + if not hasattr(self, "_neighbours"): + self._neighbours = [] + for c, n in enumerate(self.adaptee): + adapter = PTDOTExportAdapter(n, self.export) + self._neighbours.append((str(c + 1), adapter)) + return self._neighbours + + +class DOTExporter(Exporter): + """ + Export to DOT language (part of GraphViz, see http://www.graphviz.org/) + """ + def _render_node(self, node): + if not node in self._render_set: + self._render_set.add(node) + self._outf.write('\n%s [label="%s"];' % + (node.id, self._dot_label_esc(node.desc))) + #TODO Comment handling +# if hasattr(node, "comments") and root.comments: +# retval += self.node(root.comments) +# retval += '\n%s->%s [label="comment"]' % \ + #(id(root), id(root.comments)) + for name, n in node.neighbours: + self._outf.write('\n%s->%s [label="%s"]' % + (node.id, n.id, name)) + self._outf.write('\n') + self._render_node(n) + + def _start(self): + return "digraph arpeggio_graph {" + + def _end(self): + return "\n}" + + def _dot_label_esc(self, to_esc): + to_esc = to_esc.replace("\\", "\\\\") + to_esc = to_esc.replace('\"', '\\"') + to_esc = to_esc.replace('\n', '\\n') + return to_esc + + +class PMDOTExporter(DOTExporter): + """ + A convenience DOTExport extension that uses ParserExpressionDOTExportAdapter + """ + def export(self, obj): + return super(PMDOTExporter, self).\ + export(PMDOTExportAdapter(obj, self)) + + def exportFile(self, obj, file_name): + return super(PMDOTExporter, self).\ + exportFile(PMDOTExportAdapter(obj, self), file_name) + + +class PTDOTExporter(DOTExporter): + """ + A convenience DOTExport extension that uses PTDOTExportAdapter + """ + def export(self, obj): + return super(PTDOTExporter, self).\ + export(PTDOTExportAdapter(obj, self)) + + def exportFile(self, obj, file_name): + return super(PTDOTExporter, self).\ + exportFile(PTDOTExportAdapter(obj, self), file_name) diff --git a/myenv/lib/python3.12/site-packages/arpeggio/peg.py b/myenv/lib/python3.12/site-packages/arpeggio/peg.py new file mode 100644 index 0000000..1f0ed76 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/peg.py @@ -0,0 +1,290 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: peg.py +# Purpose: Implementing PEG language +# Author: Igor R. Dejanovic +# Copyright: (c) 2009-2017 Igor R. Dejanovic +# License: MIT License +####################################################################### + +from __future__ import print_function, unicode_literals +import sys +import codecs +import copy +import re +from arpeggio import Sequence, OrderedChoice, Optional, ZeroOrMore, \ + OneOrMore, UnorderedGroup, EOF, EndOfFile, PTNodeVisitor, \ + SemanticError, CrossRef, GrammarError, StrMatch, And, Not, Parser, \ + ParserPython, visit_parse_tree +from arpeggio import RegExMatch as _ + +if sys.version < '3': + text = unicode +else: + text = str + +__all__ = ['ParserPEG'] + +# Lexical invariants +LEFT_ARROW = "<-" +ORDERED_CHOICE = "/" +ZERO_OR_MORE = "*" +ONE_OR_MORE = "+" +OPTIONAL = "?" +UNORDERED_GROUP = "#" +AND = "&" +NOT = "!" +OPEN = "(" +CLOSE = ")" + + +# PEG syntax rules +def peggrammar(): return OneOrMore(rule), EOF +def rule(): return rule_name, LEFT_ARROW, ordered_choice, ";" +def ordered_choice(): return sequence, ZeroOrMore(ORDERED_CHOICE, sequence) +def sequence(): return OneOrMore(prefix) +def prefix(): return Optional([AND, NOT]), sufix +def sufix(): return expression, Optional([OPTIONAL, + ZERO_OR_MORE, + ONE_OR_MORE, + UNORDERED_GROUP]) +def expression(): return [regex, rule_crossref, + (OPEN, ordered_choice, CLOSE), + str_match] + +# PEG Lexical rules +def regex(): return [("r'", _(r'''[^'\\]*(?:\\.[^'\\]*)*'''), "'"), + ('r"', _(r'''[^"\\]*(?:\\.[^"\\]*)*'''), '"')] +def rule_name(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") +def rule_crossref(): return rule_name +def str_match(): return _(r'''(?s)('[^'\\]*(?:\\.[^'\\]*)*')|''' + r'''("[^"\\]*(?:\\.[^"\\]*)*")''') +def comment(): return "//", _(".*\n") + + +# Escape sequences supported in PEG literal string matches +PEG_ESCAPE_SEQUENCES_RE = re.compile(r""" + \\ ( [\n\\'"abfnrtv] | # \\x single-character escapes + [0-7]{1,3} | # \\ooo octal escape + x[0-9A-Fa-f]{2} | # \\xXX hex escape + u[0-9A-Fa-f]{4} | # \\uXXXX hex escape + U[0-9A-Fa-f]{8} | # \\UXXXXXXXX hex escape + N\{[- 0-9A-Z]+\} # \\N{name} Unicode name or alias + ) + """, re.VERBOSE | re.UNICODE) + + +class PEGVisitor(PTNodeVisitor): + """ + Visitor that transforms parse tree to a PEG parser for the given language. + """ + + def __init__(self, root_rule_name, comment_rule_name, ignore_case, + *args, **kwargs): + super(PEGVisitor, self).__init__(*args, **kwargs) + self.root_rule_name = root_rule_name + self.comment_rule_name = comment_rule_name + self.ignore_case = ignore_case + # Used for linking phase + self.peg_rules = { + "EOF": EndOfFile() + } + + def visit_peggrammar(self, node, children): + + def _resolve(node): + """ + Resolves CrossRefs from the parser model. + """ + + if node in self.resolved: + return node + self.resolved.add(node) + + def get_rule_by_name(rule_name): + try: + return self.peg_rules[rule_name] + except KeyError: + raise SemanticError("Rule \"{}\" does not exists." + .format(rule_name)) + + def resolve_rule_by_name(rule_name): + + if self.debug: + self.dprint("Resolving crossref {}".format(rule_name)) + + resolved_rule = get_rule_by_name(rule_name) + while type(resolved_rule) is CrossRef: + target_rule = resolved_rule.target_rule_name + resolved_rule = get_rule_by_name(target_rule) + + # If resolved rule hasn't got the same name it + # should be cloned and preserved in the peg_rules cache + if resolved_rule.rule_name != rule_name: + resolved_rule = copy.copy(resolved_rule) + resolved_rule.rule_name = rule_name + self.peg_rules[rule_name] = resolved_rule + if self.debug: + self.dprint("Resolving: cloned to {} = > {}" + .format(resolved_rule.rule_name, + resolved_rule.name)) + return resolved_rule + + if isinstance(node, CrossRef): + # The root rule is a cross-ref + resolved_rule = resolve_rule_by_name(node.target_rule_name) + return _resolve(resolved_rule) + else: + # Resolve children nodes + for i, n in enumerate(node.nodes): + node.nodes[i] = _resolve(n) + self.resolved.add(node) + return node + + # Find root and comment rules + self.resolved = set() + comment_rule = None + for rule in children: + if rule.rule_name == self.root_rule_name: + root_rule = _resolve(rule) + if rule.rule_name == self.comment_rule_name: + comment_rule = _resolve(rule) + + assert root_rule, "Root rule not found!" + return root_rule, comment_rule + + def visit_rule(self, node, children): + rule_name = children[0] + if len(children) > 2: + retval = Sequence(nodes=children[1:]) + else: + retval = children[1] + + retval.rule_name = rule_name + retval.root = True + + # Keep a map of parser rules for cross reference + # resolving. + self.peg_rules[rule_name] = retval + return retval + + def visit_sequence(self, node, children): + if len(children) > 1: + return Sequence(nodes=children[:]) + else: + # If only one child rule exists reduce. + return children[0] + + def visit_ordered_choice(self, node, children): + if len(children) > 1: + retval = OrderedChoice(nodes=children[:]) + else: + # If only one child rule exists reduce. + retval = children[0] + return retval + + def visit_prefix(self, node, children): + if len(children) == 2: + if children[0] == NOT: + retval = Not() + else: + retval = And() + if type(children[1]) is list: + retval.nodes = children[1] + else: + retval.nodes = [children[1]] + else: + # If there is no optional prefix reduce. + retval = children[0] + + return retval + + def visit_sufix(self, node, children): + if len(children) == 2: + if type(children[0]) is list: + nodes = children[0] + else: + nodes = [children[0]] + if children[1] == ZERO_OR_MORE: + retval = ZeroOrMore(nodes=nodes) + elif children[1] == ONE_OR_MORE: + retval = OneOrMore(nodes=nodes) + elif children[1] == OPTIONAL: + retval = Optional(nodes=nodes) + else: + retval = UnorderedGroup(nodes=nodes[0].nodes) + else: + retval = children[0] + + return retval + + def visit_rule_crossref(self, node, children): + return CrossRef(node.value) + + def visit_regex(self, node, children): + match = _(children[0], ignore_case=self.ignore_case) + match.compile() + return match + + def visit_str_match(self, node, children): + match_str = node.value[1:-1] + + # Scan the string literal, and sequentially match those escape + # sequences which are syntactically valid Python. Attempt to convert + # those, raising ``GrammarError`` for any semantically invalid ones. + def decode_escape(match): + try: + return codecs.decode(match.group(0), "unicode_escape") + except UnicodeDecodeError: + raise GrammarError("Invalid escape sequence '%s'." % + match.group(0)) + match_str = PEG_ESCAPE_SEQUENCES_RE.sub(decode_escape, match_str) + + return StrMatch(match_str, ignore_case=self.ignore_case) + + +class ParserPEG(Parser): + + def __init__(self, language_def, root_rule_name, comment_rule_name=None, + *args, **kwargs): + """ + Constructs parser from textual PEG definition. + + Args: + language_def (str): A string describing language grammar using + PEG notation. + root_rule_name(str): The name of the root rule. + comment_rule_name(str): The name of the rule for comments. + """ + super(ParserPEG, self).__init__(*args, **kwargs) + self.root_rule_name = root_rule_name + self.comment_rule_name = comment_rule_name + + # PEG Abstract Syntax Graph + self.parser_model, self.comments_model = self._from_peg(language_def) + # Comments should be optional and there can be more of them + if self.comments_model: + self.comments_model.root = True + self.comments_model.rule_name = comment_rule_name + + # In debug mode export parser model to dot for + # visualization + if self.debug: + from arpeggio.export import PMDOTExporter + root_rule = self.parser_model.rule_name + PMDOTExporter().exportFile( + self.parser_model, "{}_peg_parser_model.dot".format(root_rule)) + + def _parse(self): + return self.parser_model.parse(self) + + def _from_peg(self, language_def): + parser = ParserPython(peggrammar, comment, reduce_tree=False, + debug=self.debug) + parser.root_rule_name = self.root_rule_name + parse_tree = parser.parse(language_def) + + return visit_parse_tree(parse_tree, PEGVisitor(self.root_rule_name, + self.comment_rule_name, + self.ignore_case, + debug=self.debug)) diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2728352f564e0124c2c95861844a3c69ce55e47f GIT binary patch literal 205 zcmZ9FJqp4=5QVcwK?1pht%VuXRsk zz8MDIJC38kE7BJ^=4Z5j^;3U&23@cer&r)6e(T4dp@CL2lyD|=1V?1li`1z~L5ftf zv0$CKAs;lUqCsdo)DLJ>0k-3-(c5Ib0aA=Bo0oMiksx;#rBntOi3zeyX~kKV*lw8b WT2tK{+`E}C7k+4jZzzOtp{E}}4L4x` literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_decorator_combine.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_decorator_combine.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..092b2a5232420797d0c0509c95cb6acd8b84ef94 GIT binary patch literal 1561 zcmaJ=&2Jk;6rb5Iuf2BMHZ)BTAr3aEj)Ye!LItTxA(R{{)h&Wn>Z+2p_Kwp{_QRSP zH`sE(LXoHeDM1v)haNa^LE+GU0j^vO>7gt=Ai;%Oz(qkhF|+nMO;vc(zIpTJ&D(ju z_j^C2QVGB$;ayw4Dg*Ev-$Wt|js7Atwt)pK=l~ZQ5OP~^1Vdn}=!mXlNUm(iu3{)| z%!s+Fp}KJ+?k0=`i@D9d+a9V6pB^p>(<1x& z7a;&2%iG|#T!j|gP}f-%8{iX}GXFqYU}tErLrYv2ENNYA!4-b{326zVNQpA!2C~Bc z^@LD0azr;?1rYp4RxyeRF=jaL47&gU)uKEti6$dEIw!(K@DY4G#*(L45FLAZWJ?;H zuN;fc4_8ZBJq^GhV*_NtJRopQfZ#fNHw2%({l0h|tigP&cm!tt&~f(lCz$#YZUX^y zz|JtM1*^ilATJaTVBs6iftcGU;ktte$Gd&d)LoD275yrs0MVBaMPB9twk=z~fXFKK zYkCd)D~P`75xeXl-EAQ6mhRYPy%rMYmBRcPoiIARTr(@H<}xC>iEC(i+4gmc2qmE| zS*YS;llr(+84#sVYXlPZecGJmVUfEu$XYn(_!Y*_g#r&b$zDp*O#RaaKc^=?ZFIA@ zKj^8`eO}`cC^!p3C>EHp4G#H5M@+I{)agU^SR+nFU1gAo#Q>TCEayecM-_9fVg3Wm zJBv?n#e0bP%bL0Wtzw8d=LI>%R2w`@PuyvKmHpzwZ{zo}J7c@)vpw}}n6xRI<#M^u zjG38oh8dXmH;}k9AIB2k$TdE)fx^II*aZqUZGs4n^Rt9aY>!aWs~{X>4$P+@kZ+kz z9px2#obQzIJ`NPytJUfJa6QBP6eBbrRz!HI87^;xWd`F=d`hH*a)qbYI#{&9;|*kEb`MJJWa8cH=XD z0w_;EP{%fto#fWF`|5N1B6F}j$%(D%-PQZrTu++oX>$*?lUvp9JD=NMPmX*KwBuW| zo!2+dcg}aKKWVw1l>1T3?Q1N-9#4Bf_~3pgo>-g`zn_v9Ux?+CL84Tu)@dE1QVDZ@ z;7O(eHR5lG^JIaRx^_=TlY{C|BmYwo3BeP8Hi4elSCjmVD3rOt? U5YFrardZW*rms%H7sKxV3${36_y7O^ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_default_semantic_action.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_default_semantic_action.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f26892c680124163e1ca9a77d3465ebd5e23a016 GIT binary patch literal 2847 zcmd5;O>7fK6rR~#JN7z`L*jtr(2zhVF(EM|&=zP5fizSVi4dWvxK&q+cjB1Xj+xoe zB&DiBk!sW)D)oR798!rxqHt)X9(wJ$7gIRUEm4tL4%{e7r7EYsH@5Rff7Dw?nzu7= ze%`$A{q6UDzfPd(nX`$ohmc=zQfaR8VDTXgt`mz`G)2-hMk$V!loC_mtESYn7SqzM zm@Dm$x#gM$ysDUo5-(xim~OeINvzs(1NB=~Kx-@y(17JNYoTv~UZ;=~#L}mU8op3}_k^H}Y9Kjs>+q~zZ0arsyE!t}DUM1@#e*;aKcZ_?SB6zk zT^(Ge?aMR*YP5g>+r2eC_5G-F=`Qr zO$z?5PAcHR=%W>18tRQ}aAl?8SQ=*v25X;tS+yvlU3s*njJ`~WN$pBnAe9}qyK>n) z!Vb;UY<#wCm(`UU)X{d(%vCuzgg2-t0|3zmIUeQ+@)Oi3;&wEfP1ue%YjBnxyTmL< zPl{wl*k&fqI0|(F5F~;bHbkG1f$($G6wAzMjwV=Y*m28M?r3t!6CX*YEWkma&MnZS zZ#nvKk_+3&nnFy4)&bSEy3z(m#Bm@w@@p_u2+g$KXu22NIa_}>xF_#@7;c++XV(1k z-ETVYg^%U~51U(O+Ha<3FaFTHH$PFJ*FG$IdcPX^_Tty0Fpwr3gjaeDBV(qSVK};B zq{l4qd>B_7#>H_nRa)V@K;}jVL2u+pc0d=9w#hVER5aHyDzBDH|ItI-r$PANxyDN% z;h$W?E}NYYG_a|x8W@rq-wLO}2Q_;#%lHd0ar9EO8IbMxc3`YGh*WuMQ|Uo#Ot1%c zZUX`)XlN|7&+NO=aj)UUJ8gFxy7Kyiz?Kru;S#(YUh*7poybGd0bNu9LEuzZQwcX* zS%;en4D5>qAZrm=)wtr^ACb%C!b)hs_HtW|dWt(x=7we|cUD4#5*y7an^4{&SE()Q zGcw9^Os}$Wxju=Zvs}~O*|R^=QYjy2=BVQ-XK^uC#nItq#&%pXBpi1Fip0{2ny@Ua6ogV8Fj&Tf>SFPOun&Dh90LMY@i*Sub&W18RQPd_&cRW$4cTki^J*#8z0T2X5F{}T zLpmMcyNSOp=Y0S~e^9q2 z7g%z;=rQ{F;1a>_Qmsat^6xJZ`21Ew>RY~u=6utEAFJy=eKY5p_C9m#blYNBr%iu6 aHK>9js;~Af%VK*=>D@`b+o|<-sDA>QT2+hy literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_eolterm.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_eolterm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..288301c0a3fafc33d3d793dd0399616907d820c1 GIT binary patch literal 1913 zcmd5-&2Jk;6rb5IJ5C*v7D@;ov06$nQnLybJ%y+wtq({|Dp7i{Dp_mq*mb)f)|)kw ztwgd=q&8eQA?Lt>qpjw^vHt^?NX-E);(!oRxm6em=!y5nn*=A&z>Sgi?RfURH^2G4 z-y46E&1M*mOmM6AL}%WHMO9Nte0ItWGt$Vs}6b;`jn!Z)E z{8TZ8-;GUHOuHu9v6hy%ex_7;9#1xddL?v4$*V^K98a$1jW|;j5U#=X5JWt-7Kmhe z>V^YSz>QXPCk$f!+FGHK08%dlEh1)vJ8143_suSQU_3CZn#(uS8;Ea{eP*~iTGKT) zc*Io{nsw%yJJ!SGbQ{{bc9-%T8SDIE60xDL>r(rWeac%bpIRLOL4jxR8JtD)h1O+T zY>P(+sjB)%tj|~b98$Q}*J86;2N}hd6qPV=C1L1vo;7Sgi0q2}F&82jWSJLYQ4otT$zqB>Fu!aN5` z(r0iQUqHJ;7ESxD6VWPu$I(|(Xor2-?p^v?@4fTL-J4z6onBEHN8qB{5H4-mWi8&< zR^cU_!}NhUgfW3@?YR?S4C{Leod=W_DU)jF_LP%za%J_DGdUbiq0i%S5N@*~N)ZUr z*TBM%*ldve`xZ>9U-h8TMB%7Kh%FGZ=|zeaAWV{CDBqPUim&+Pf4~TDqGOsOE~ELQ z!+tUrVq+yX&OJ@@>{#d8uNIq_*`Dh)_p zJJgzz`~_9V=KxZQe+|R;72oQe@5$cGqnmrP%e&Ld#{r`6sN!MfVD}>sl-!41_Z$dA zwZBeD6fbmy_9Q9Y$&uI-p#!0WH^}7B9Fy$XzdtJE(fJh$_^V=<|GQ%InK)A_Rhv;0 z@3|6?Ua_HCv}>H+zcAI!Gb{(Sl)AW8&nOs2O7twf=!b686H9Oro#_ul5)Dsv&iVIj Z?mL$K&0>7%F?;_PYl5F1oI|4u@+Sm4z@GpB literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_error_reporting.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_error_reporting.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7826a17d4e9bfa1e3b38da816d181dc315ce898a GIT binary patch literal 11606 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 CwFl1t literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_exporter.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_exporter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57a678746c9b909f2ad063937abbbc33c16b9f07 GIT binary patch literal 2529 zcmcIl&2JM&6rb5$Z|t=l5(h$zf@7+*&BnxAVrWPLMo5ITNF=C04=W_gcqhieYrC_X zD6y!Nwn!D1qMpJb2M(wTN)H_J2lU>{My4WKT2*R$=`AHxm3-=(@h1jxsXEfUotgJ` z=J!74H$Mi03WBB-KFy|Ognnm}Mic6T{qJC~jtperJTkG4F&hhcK^OQ})J6D;dCBzX z9#ht3u9xy%rdRixKHX<3x?=iuzZuX2T;~B@Q16DZd>82lj4qHph8JY7;R6{m6p(#H zSR849X?+dW7Q~SoRx1kcU?Vwfj$|QL)>zRLEtD21(^}HlgXfHKz)0@XF;2 z^VeopN<|8bFum3`RXwhEzGUZ$g>>FkbV7^s^m36B*Ee4v^`SU3f6)zGNmGl^E35Xc zVgZg)J|WqemCI>6b1Tz=iI4~r*7pZMtRovYlm_0akFO$Cm@5Zv7^64hAnx2SVz41j zJx2S?xcZr97Hln}U5E25?IN*BA$o!4jGT6XShwwBNh{IfBC*dGtlZ5!(acp+Sl05n zn_7vZOT*X6U(-^Op$s-;-ytrE-aZh38lSo{z2$g z0K^*F=zVam5{@~c7(D9-$R$n!^c^r@0knc3*3cjR!y8h?f7FqV)(|u=J*b(ZJSgA5pdCSj z&K8^X1qStY2Q4-O)L276#f^%?$Y$4sw?!7Wj<)FUSb%AZfGpt>`Vs?iisg5eD70(9 z3b{fyT5~UI0)^(IHGbgwa)j|llQB{?yA-#J8%29gl_|r^Z!FO4#ay1afp#lbC|a&m zO53+wnXKf1gjCGKXt7vDYnOVU?UYx}peh(0gKkZNSVJ!r|4fSPNRbE2&xXc# zhQ@b?&b<_|=RAHXqd@oliF*_GllPL&k*TNtX-Asg@z*Q%jmg=7eb*6$y9P}N== z&efcLIP>uP&u$Q9_nW^(HBRTG$q6#bcIjHkt+3O1NO+BMKRZ~X>OBJ&WhqaRGy#9H z0<*4zfJX`AzYiij@*D-9Bj2y+^glAfAK{@R5e1&ois5HOy_zoDdyrd^cSlab*4 eI`T#2FIbQ4i%96%W1|;dFFv#1@556(GXDaC3;tUG literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_flags.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_flags.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6858b31218e0ff865a41469aeca036d0553dc45 GIT binary patch literal 3147 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_parser_resilience.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_parser_resilience.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0fc1e2449c40bda5d7f86a6d9352e6da8777529 GIT binary patch literal 922 zcmZ`%&ubGw6rS15ZjvUk6}3I9%L016vSI4heA)jNwO3yzGc37@6CJr-h6M~S1Kb2q!c{u zbTL9dq>+g-RC-NN4v>pnOp%XU*jHK#mbOAwKiA6nT1)HOD%D%Mn|p;?`9!U0zvT~V zN;(z?o)fynqMjhkraT?B*LX-{K`hUYLM9-nyks*@*is_a!yr}XA1y38!v^}B4yeNF zeFQi_0=gZDi$&HcYAZ)W{|h9vEMi0E{v)E0IkJog2&3m{qm=nCc2UmsEEaC7$nR)a z`G1+Nnq_pAhv+3vl-sC*INk>SR-qn7udC10RkV$3xt*C6!UZ?Px-ATwMWoa5LL=(4 z!VN~8aEma5$BsidZ^x7-Mw^Ac(Y8GrGg43WwimcQS=<>hjDczxwLFtFFv&owM~Q$E zsm^SV6P^}Vl8DSR7P3_9*GX01j%pYJ2UR7P#`%uv2f}pBCompvE)YQiV~%;QXU-A6 zDZ~|{M{Eo_%fsT20lMgCW#Vw^&GMmnQn}k*_*xv@tL|3!lau1DKL~3# zKNqg-m3Pbg%byApXDT?pm#*$j?@k|A5tlU)b@U&Ex~EdT%j literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_parsing_expressions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_parsing_expressions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55f4e6e01a1eec50abdd6815fa3a54df71248bc5 GIT binary patch literal 19121 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_pathologic_models.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_pathologic_models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3be1d4436d768ef755302ae48b28457f07985a7 GIT binary patch literal 1193 zcmah|OKTKC5bmDY*`2KW@cjsgjULP%vf~3iNC*Z@ZYF{ca4thh;8xqJN zmz?53h@gl^CH@J|UWDjn^dKmRH+7XjPF7E5jGnAvs%omMs;j=Ld0nqp5zwCKR%c5` z=#%;=NXwPMB~aFphddmh5Zf3lT?;f@1E~jkSh7o@VH;uDE{7Gn5}LLNKBX085B0T{ z@l_>i;dE~=^4-{DPT)(%X&|OsMq0HQk7xMRn6uQJNu(b~G)QaLC>M-h>&tE&rIqRU zDwS?G)hB1B+`Ozzlz~ItXz&ym)QDHm5|TJO1Gb1Za(xL)<(JW1snB+%RGBg=A}%0| z7V+FrVc(UWR`@`dx_UNptT5{9r_fm>@Vti6ZOEW3_x0Oo9=A#h8&v{yg9%CEyi*dY z#)uyY-(!T51wezuoP>Z!J995EA)*`i0*}yOp7sS1J=bN-BeL5Q5bpI{KkATOFtb=0 z6UqDF!}5D*hx*Y@-U*(tPREZ)mquQ|z{wZHr6RxfAD9hj{s6p#i@?_Z0(cix4;P>m zQvQMYj&>cjwCNPnmd=%xtAyMH_5uxnqwNJNjHKmSH(~0+nqrbg40>hXv3n?onQBh488 zXg1brtF;H$-tnQcum<96j?Xh<`_WV3)nb63O4nB3Z;D0F~+|RB0TaQ)xV(0cW81@ JZs6f8@;3>jB;No4 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_peg_parser.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_peg_parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3184bfe6be40b93d75d1259bed0536d6d3a81443 GIT binary patch literal 4280 zcmdT{O>7&-6`o!GYf1e$vZG3oyP>6uOIccrKXwesNu9U+Z-k}}jH z>Cd4{?(CcQz4zwL?0YkB{}hY05x5lVt^D6(g!~0N;);00?jIyV?h=!jQjtvKQ!Yv+ zd0H;{rhO&y@V3x|ct=F<$A!3T1^e;^(*!vddHC|T%f z>I!P1Pf*RL8IcJM(umn6w4ooSO0%Dr1!5}ilLwyabo>8kjA+Xk9skZ4X6#}617F=u zF_%_e%X~Uo#_BXX-zU>u%aYdhS5%(Td~W#1^yf>|%28LDDqB}5D-|rG=!T}s7YrwN zU6b6%C4#k#ou%PQ-`fs;#7T4-_TF1A_ z&UF~F)e8rvfj)S{B@${p$w$-Un#a_VbxSSgL4hkKT72UiA)7ObIW*hU8CK6-oNTys z)-u&=xO~DH)o@gBPNe{puK`x1Z7cG`$ewg&Pa1cL8?5lPb^T~M2dmq-{6OIw-u)Ds zyJVFtG@vH2;AKmbLm(p;6NK3E_sM&b6A;M3`c6>bBL3@o2TL!6g>>_2%HM*{0^c#3 zT%=52(~o7M`KOoyT!tRIk&70+$S#x_)q-xcz6NupvPp|>ge?{6oMn`#+g7j(mhBi2 zoD7%34Ok#zyM9D9iQ%9&u9>=L>m|$4bNWvpP;GsZI@D6%U5bGb73$d+=Bhp=w&=p}URDl}`P79`O_JIc|ja&$*YRF%ZN$@x4i1{@jus2KZO7I?AV+vK^T9qDn+;?Ti+eLsYI~a5P+8+&0Nbpx>p=rv^x9f;g z0cUBSJPCA~;{rVeoQ#L+Kxg-%I2B-?Y*8OO!6nq85dg+; zFky;|jKd*FB51!kfmD5j<_yv)5K4`4p}LrcjI^hNZl}aZ=v4|w z5?=8UQmr#cz0%@U>NM}{^9oF)n`?>|)6Xv|z82);Y=!UWRJuMD^b+=4=$``ke!vaX zld%)xlVR|>K1fB^&uE3+_woI~4HT@(lH&&93|T5VHikQ#GVBGE?&Jx~ZOm~orUH8a zZks{_xf>?2%-Xp}u@`R7+?x4ta4V*+O+Lk>{b+GpNpAX+n@aMD(*CO(AB@)s>AN8R zjgaUC8R!6SfqtTN+zEa#0j!rUhY-FTLilp%8K)T*LRaofuEMCfl%sPFqxAnMui1;> zKf_AQSo0D|#7I4f_9u|Q>gj`+NFIUIQwI@|I09*;jZphflSUYBCX8^FCyRiaiGuKd zJxRncn2wMjI7TBm1lF1u!ifWug5hz@`k^@})LTM~VVIvlIWN?sUnA6?e(g}74PvOz z1~JrUgBa?wK_2Qk7_xC;`GFa^I|`x0k1XPNM-v=K@KIs<9{NS03&)wX&^WFdHi#Jz zhYlQP&4Ne%r^U^|R)XKmO7qY=sQ7WB!ard(OC&gW5A;7IWcY^?d^m~YS0c;g7#V{i z=cX)?t6%{+@A$5go01luT6wt*3+6nQq)@XOaWy^<^=&*CSG8mHqSTf0SJ=zo%Ss@p z8tVK?02(!ikDNNMg&4j8){9LiHhdEeLQMpf4eXgl!KOCDHH9yQP@Wm3lELcxs>JpO zSU2BGm#i`~DTLWvo|Ts>Y#3BugWG-&8rV<$az}XW{Fh%NWd?byk+$uGj~ zx1+bBcYeAR?q55LMUnAQ-?lQi=^xxw2LCnsG}3Xq|5pERZ*E1t{ftO~qmP8K?Qs8B zK45%>Tn_Eo_*(vW;?V1g?^7l4dUr@W#D;+7hDEi<3r)TZeA;eQ0HaX*@zrv>8mwHA z8W!-~_DkXu>3hgx8rlrOF;q0*!z#w*U`6=yxqeu~MOT4i2g+E76;>!O8Tr}6vy!jc zeZtd)A5?qc2`G-CE`F6|!7^ru4PVlv=9468_YjfV|4hR literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_position.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_position.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..433e83ac718d48a6a1db25eb5e97ed49254a6b9e GIT binary patch literal 2349 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 To9wa42Q~?Ac#jC({3Y=pOw?0# literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_python_parser.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_python_parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a46d68f4c13e32b6e55cc285d454e1cc63f79f7 GIT binary patch literal 3001 zcmcImO>7fK6y90?#%qWCHN`1{t$-$L$KH6?A(SAZN)S=hBs8Htm{gYWZh{l<+MQh^ z5(O!$dT7O=+~AM{2M(#qfkTcx^xlg@kP>YKV0qxKP zpq&f66#feVNW^KYn1y^v)3e2bt zihbuOko%lXm=uUceyZ_PoWzeWhNrdIbP~wYv=)a6N%lu>2aR`c$%bjmdHD-~VacPq zt()RSTF?seMctaWOJ%uCOLMyYiD?yX6m{8H(9K(Nv2a5!Gtg=>rN|aIo+#(?^SN2w zl5@1I&(0P~vaMUT#c0+w&X$?G$?}5ZH!H>sozivy(FxrO16k%)+8>N;MB~+tI6VS_ zect*&z`Q*N%zke*ewMF$Y}XS5HsAJwDQlW{#xu*$@DLB*_%4a>lEg0Q+a;3Zp=iW_ zI3fLZnd+7WJ4ahliXdnk5XV20%iASNG1OhqtvC<>eDtBZ>UkL3h$hzjTdDNg+%G4q z1Ea4zWZ*J+#gQIHJ1>)W_@lr~;15u@+2|!}8bQw*nxAUEF+V)x4vFm&S>hQeit#y! z+6x(J&|{$KhHkwN1Tc3$>RFw7a&q;`&;E@MN2<}0YRAa`fsf+OQj8X0L=cBzqzH-; zWa<#RRu)&)C!W>VnznIbxEdX0t+4)hmH5wSEd2v z4(zx$pDX6+3DDr4TbQX3yXd2H8`0#Nry5nO9qQYVa2W>a1u*Z1bcb8w=JsHLd9BSM zt^-XY^L+qpEP&z+Eg7PF{KbL^=?EoFyg2olsOeUo7Fd-`vN>3&DP}m^ zm~kmcq2_Z;?1bI9vj!B}qSHbvMLlcg4BZJ8tO6{TgR)66E{@Lx6U*`9{7~xr?m!Fc zq39mvE-Xyhayi=!l=gzb2hgoNkY(=gAlKTna%v-TVtMq1(7q`gUl)#V3VrKB-|Fa7 zL8*F`s-Qd<-n%!m*)6SiOOMY!6Vg?0x+K4^!Pt7Id~?nDw3QSJOf{eR8mb#i{-SqB*vi+LXSZo zf-XbHfi+PA{`Wrm-~*?EKOCkiKqTlm1`U}8Ct`**A+7~1+U3?@=dX+I&%JcS-gK{c zec&q*e*L1@8;7qHaA;Gv7zCM8)5m~UnZB+a0!g~2m4P4Jr$tvlc&2H1YJgdYy$MjH zaIyMS%rw=!R4QGw?L%94>Skyd4b3e?&dgss$9LR1Q_ zR7b^DP?|kZ&NiV^K4u^LP{9;xBc?c`dN8QCEhtBC>(~*L>bim`;Z+3RL!g!dO~>Eo zp5l{`i4?1w4|cJNydj z#TdWMap5r@cpsy{KNpVN^WQxWqGOW*R8Iy_JsEh-cy?t-T}~*QovGLrs%Ntl!9t~4 zK$uRj{(y2HChS^gHx;|2SV_b}$KpWo>{2|S>;dCG1lUc>ZdJUzSYc!S9=PCkgXf`| zLLt3C@dbhf(z*Zy-Y$gv)5Vd#-?+#dKOsGDI3TZ){K=i#_H(3vnlue=$O(+mUNDBh$VnIxc@a-%33@I%c{46u zmrXre)M%!l+mxvVYg+NUku+t+JM4CmQ8#?Yq%}1l0iOr2DG{N?GXt368c`+x=5=ESL1yvDU ze@2W03i^Di#P>5gG;$?n0SSX8HM^wdsg+V$iRSZqF=bQBwz$kNs+F@eV>3#J zN)4E z=Qgs&TiyCts9JL3EO{hMD?T@nE0&qP;QH+aooNhLW^E`iC~HR%^~8BltP3Cj<<#!v z){Q5(_RB{D<4$7SiI2C!M2H+_FDL-B7Mze)K$?J%_(9DpB17m5BQ;}*p$!F+Wg&Hd zWo-BUQR4F6tdkga;=`>tFhw|y_dxk4x@HN({Xv$5ITabpW(=b=L*TGbV7HJQfbi+= zvXdBc;zO;`!J!&m0%em_1is7B>atB#cYzB-@eXtgC#;dJ(bhFzF?$hQ8kyAu?}#~@ z4}EjmWw=;Erg;~9XDHsqNHUMKJ+k%ShcPGK+Zqs|a0=UiOsF=(>Y2x>iBEiwYd3OL zSP>RqJ8B9su{sS`&E55~E<@#PLM2Sv6Y#Y6r zRFk9dna4f_DJM77JBBI2>&OWv5x-U^+=h4P9?y6s$S?_bIduIcd@tNED;H?SR1NAz zbW1laTQ#$kh0reu0_vAvH%nzG>3jln1B_bbf^A`#WHQMMnA?t3xUv2+NGyWIz)C<( zS|iV+@2^e%9_!k^v{yckU0a)a7CZml-1^+sM@O;b+SH2>iFR)EtdBjFyAR~f4Lb7RGr8kT-v-8EFH|KeEPQ%#e zhw^|U4LI^Z6_H=%G>~kpl+~pm3?w|DqR%L;_8zgw*uF4G}6NPJM6IPErTj7wvDKXWz{G znD>$25{Wng(!J4%Um}G3i9hNTt}$!#z|0YgSc*ejC8sFJtB#se;T>{9u9nl>a4zgd zauK&F*W^ZXQ8$*0Njc4lyLwKSd>CY#a|z%hH%YF=Y65JvqJV8y46xmb18%c)zz$0_ zlkjw^3&`v!tLfGkxRh2zTgkKY1&bPv%_%b-e<&Rh@f>A^ zVRp8_sE7@Fw8l1{Gnr4>xiX(Dc%pNJx~9kN{8xEy7rgV-FFD*7iE|f*;Ji`Ww|Rky zwrOOHBJMOeqZD+4$m!t=16PX$20CFOex6PYTs>>@{A4~bH9)i*pS9fpbA$)0fR@75 z`j7F@2uZ6$LNU{-2#?#$=OW_Me8ICGk~NfiTgkc}&*rli!FoSCNICU-PBYuGv!|(l znHP%LA}dT${*~w3V-C%_W$I059eXTWl)m<5j(wN~H|UX~nZImKP(N$3BAuA93t3Km z?n^ZMT0jg_M#Nx2NHWE;XqsTA>za&pfIUfg{1$);SvY=g|NZG|*O6-S2y2I>fBCP$ zg7p6rU^e@|;r)cl>lsHjRu>i605q(`WmJz!={IeCXcmVze9>l#a|3{7V{ z5E^W0#WjTO@c3vW*mCmz#pSL;4@Rn8N2|%BTkXJQigfMgsawR51VfdUe z)Y52zGz$SAzZn2b_y#X4Q%z>JY6pQpy9Uf0DJ#;;zTnsf_qsrYA?$?5#|;%S-?#P5 z^~j>!=Ezz~{fcEYXF`{(Lr_SH(ddQr3}F{)(xs+_WAmeTPgawutqSW`w-zX*B&S#e zI+g-`BV?(7S~--~L{qK4^Jrn6aI=hm6qq?OtD2--i?$+SvN8?dWDi3^^Qki~G!Ghu zh~_74$70m;ac@sgkIY7)2aQASn(3&i%WPWQ2hx5MK!rR{?!FxhocTX{@K#=+p%ATl z0zg@&@UVC3mpRg?UoIZNEjS0H{#&uhTp>$Y84Z|~CY8WDJ7;eETImkB~#+8!k z1YcM$Y-NWL8j=GYV+cL)$i%xzUa4w$&stOqw@V%Ja~?jg6IK%1zxE|K2V+OM_Rc!A z)JLJkTI;-~%qmms&13x}GE3^Ybxq|MU`dO$_f)LLYT3SWl!*7jm9OPa#Q&_GrME5mBq zkS~*TbZDmaqnHITIOXkcd+`3G|CB@|5kzRlE!la;O*d%tN?_T?G1j*!GGg z7<|E@B2t?@sDHhrcK?^f>{AfMbo6fkRLILHNpx2RRuj7x4n8QYB#u`GpC&r)T)KT} z{=jmgr!u&zwci+iqIEB6-SgAcgWs-bXIHi4PooRp-Ti(=JGiQM{%o)8`*=k^QPoaV z^%KwZmLJP^uHU}Ctna;d?6IDzYN@K8dZs6z=-o?t_xzP5ec!#2$9iv7>s``&Wum8d zVg-$tc!@y;F?0ufETbbLTA#teG?TMLh8M%cum{Oliq^VZCWx{OIm0Andl7IX2g6TJ z9ohF~gO=Lj4hc2;gN%QIx-vMCtvVB;G_6<+C>g z;4hN?gQQ+Xh>{VcUy!4M0Mji<>Scr^+AFcA&25#~>qty#zvaFr@LJp1s-$H&{sETB BG&BGJ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_separators.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_separators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3edab31148198cb7dfca90c64e2d5f34b154027 GIT binary patch literal 3402 zcmdT`O=ufO6rS1D{z&#(vEuxRC|;trsf^-n;-rvYuu)wI#0iw7jR=VK?nYLk)ry%_ zT?+?H$)N#5dMHH4Krc4QA%`3bA+Aqt4+iUyZrf9P=`D=|2A%q5rFAXKY8r409d_T& z&b)c^_rCAF?-eD2p!Afk=D!mV`j!0zg=q9(m4k+0Zm=GVW>69xLljSQ7+nJktmQNQ8k)u_ zaiVRbA((JCylZI?_cv|P#3q;LO#V?QFzW_4i*9fqp_DM;Vco-%4V+%Y9#5@uiX+S% z34>TfYamgBYIe!h4DAY>I@QK4*D9$QQZNfz#-g`er>vEUbJKE1OSCXqv^0ChDt)RI z3zJ&ezoU`iW5+cL7k#v>8@KelMKzt2t$e=VXs$(F>dPF=t`psL2pulZcv7C|wyl$D zv$G1W;Sd{KBR5@er~XnNK3jAQaG>+UtpPo-WV#>39QrwWpf>V=uMI6E>(SvS{7Q6W zMIIqB=p2Xr_JB)O3@hgn%c?4RTAd6Yy&UT9LJDI1k(K!DsE{rCnHXqsm%LQ=v{~uU(5R&4XKyv-o-EJ?HzM zQ?fQ=sKu%|W6CK23^wrB0V#$idJqJI)c#tsMr-kf} zEY*8msDBqsZtzl~W;_^K;2$R+)5pL|XTJen8eNe`H}jG_sRA9PRiogeGdTile21+Qa_1IFjp1!ssy4K$yuCqELA-Bk?Bu1+ zh~KHx$z8AHt^Ae@`0aXKKFs(n*=Z*c=v=MK2boTSF<)YR&vqQRE`tr$pY)lrsoJ0{ z?mZibWn_Lyie(1)rPHyD%71$_mPzx=vXJSQmIs7PLRwaZOiEf#3z?HrO7SAO+>MG` zf$T3wSYk!uAUrupBbzy^9|Co+c7Ie>pU3(J(lg$ kw?Mq$F~+~3BR?Sps2#IR3J<=NBOu}mR@c;hIN|%&pISSlL;wH) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_sequence_params.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_sequence_params.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c133756065813c60a574b0fefddb839fe83e3abb GIT binary patch literal 2884 zcmdT`O-vg{6rR~Xug#BvCWIzISqPB00dIknQVG!@C{m>qMT%M}T&%@A7=!;hv#w(+ zsi+jGic~3=O5xZmqK6#0ra86;M>tZojoL#`y-`es#G&eYYa1MXb7(4cR{nN8^JeCK zZ)U!?KQ=W52$Y7@XR)9Bg#3DR27Sr{GV8NdKs_&ov_Ei~5OrI!sdzMPvq&QDFm5HpOh|ScZ&_S0ek<=Rq*JbM zCjE)!L>FBBHv2rwQc)JI`ry4ZKpB4JzX8A@`heUg4)yu~?vb@>{XV@%7t!)Sv89>? zxG5h$+EHr*7jex4#nEdGwb|Yyl)T1@iVe?NHLS;uP;0YNl2`=Hn@58yUupS_s3Q-7A4adT+t6Yydp23!zPI z$(Glup|h2F={8waXIwd*Vy^7u(yr<(aK>C^KAq*Olw){SNg0sr-Zhgc$Bdev!iEZS znmH_GO!2rKH>a3ba?%+y!_$k*nMjHFT!NX&JWG9HCgO8u#@qhk@ZgXs;BX9Ntmu*z zW5Tp}hQ(s>wCOP62oEEodNd*#i(5$%&g5NR3~EV>7cQb*q!N?xSRx&TV>TYH_MQPJ z%k2QmO7xJk7rh>+9FCr? ze6Ox4&;`ZTFoGf9499E68xR@+rr|zl6*qYkHZ~&!5zq_XiqHmdGNX%NAvyr+7(HR7 z;Mn?nF*sG!r@Yx_3avm2IMoqaRXMuost`oMTn%;rBIjz{iVG$<9*|YZ^8ot1D=P5Z z8iwbZ+fWy0j$WYaLI5n2tpHWu-_}U;`IRdhP2J1Wn;KCYzP|a@&0_1-k`mfdsQMAD zH`vxmpyg5L!_IGW8~#gw5~_xO)|($SK5Q(W?JwyAJ2JFv>U*>Fyij^~{Md%3y8sQ`6Y?y6MOMAh16M9>a3_tI};Ge9v$8!JpDDJ(b;OKf^F?ge>->7gux5vo{RMgh*<&Q%9 zUPq-lP~Yyy%?H5DY6Or!$27&y#H6v-UB`FVDGO0M@eo?EI}dLy0$?kySFr| zet44VN@`zKbzx9@FAVbc?a0u&8K^2RPS%2xwQlKDoj66qhxRo5-I6|t8a`B~;nzw^ ze_dkef1wQQn79}L*xfPE8de(G^-dh9`((TP!`p3>-SV?`b@Gz$S+_cQ%@^{!fkts2LL^$d^$9(AOwJ!%R&3XCE`&RLil^4DP*>+bSOQ!8?f{pVlFadr@icWw{nNs@K c8A7lALYjUf*PoN?TUrP0D~}A&u(#>|0DJF8RR910 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_suppression.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_suppression.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b4fded4985bb92249d756e3006850e9e640e832 GIT binary patch literal 2810 zcmbW3&2JM&6u@WpD<+QPKvF{U0Shf61`@Yv8i5L-v=G!vO;JfXSV$|!J8=x_wV7E5 z93_%fMJj0zo(A_h#25F#*wzw9m6Mvomkr zd%ySmYa-D~pvB#*`4cUK{Dm)#rbM0kN6@)PY+_S~6lsQ1>?@9vQQ%i~)S{Nrih4#b z8X2S5l4*f?ZINVRwhnTSZGdd8Dyf!r+%QFhj*45zm274?1&{HpBPLQ>&~`b?1>={i z-b~32VprJB3UhM|dLI8Q>*Z#G)-PE8;%(W_MXJdk6(m0Os~|v6x=0p?N97!ddGavo zFVJ~<9alCrTY0`hnOAJ}O_;Z}8v}$0P%4N=k2(;-^g{LUj;hP7f zj-NjB(nZ%x=h9z-c|>}gdCWC0@Pb`PUtr>fS1PB=ymXy;=Uq{la#*@pW$tX+DNLoy z(wOfJy*r#1VCungHg_YNXCj^DWtPtuN@j27$@6TnnB{ZFaE&D* ze>`6{bjB&=z;|Oq(L%I@H~^wXo+P`M_2tSB`A6Ds$+M4U{p3YIc9D1BZT7+aO}M@( zZ*Ss#IYt_92QiUSI9e>w%NPwQmG8qhL%#9A02@^tPoNLM8GJ8J?%!QM-VKvUc*Of4 zYGflu^>MmskoKPCW2=cHwedd_o!?zsy5{!`ttQg7@wNEgyN8!fFB>cIgT8j~ar~fE zc!$T)EqHkSXAobj_lQC+$$+yJ4@ScF5LZC^M!lm>Q(Ik(K{!TZFN7oR*wk!oD;zz5 zGHmnDgVffyLKDK(km1_0V=N}e_H2z+TT}75j11vPa3>f)>zTsi1vhUNkuE08TLo{% zY(&A?NnT;5T{7L0XF`10l^ipr8%z(PR_^2i!(!+~E*j|7(c$+9BN=KFNES4sLK;w? zjf5VHV%`eXu%sGWQFSGnZs0#T@jwe=mgQ!P%(8-3%PN9W4))tD>t-eEgflz=hjMhh zbYB=F9nHJ(9$0V$o;n(Mk*sxgFU7(S4#B_+PM4VX!OZs*GmNb$WC?O#!%?<2tpVQp z1jlsB<0#rtU{FhCfN9)VplxbWDH+;xCtk-E5n)Gh10?L98d*zr-DQva2Y<}3_K!X? z{N$J)8w)Rhx~^lqt>a-*ne{Eg9%vl%mc)#AK`&4p=B6~M4u1ou_M?#6B8vdphoKdF zUal)Y1}o7%f`I`2HruFv;Qpyi0zaDu)z7_xyeIMYJG0+@uzYwW-s@|+1rpSc~O`HP62YZIcR>)ZN{1X z@l2_ZV<+W)UZv~+$%AI2d3z=fa6IEysFRg*vO+MiOIc_} zZgPV6f>oQ)lySz7!^9{~nkX=B$no7V#5Ey=TSfkrD9)+Z>=Tklpb&X))&Yym+~|M2 zUj*f8_*Nh>5tH{bKN_q3>0i42A`~K&!39`+TkMalB7nJ{8AgJzeoC9FjH1!~_MsiV6p@#vhR| z9U*LCc9LGg3N90i)Vs-P&thl70x-shVI8JAfeHPoN-6!ji_n4JN#YN3ewCcxFk0!M Qjh?;qP<^12_Dik)1$G&tK>z>% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_unicode.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_unicode.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5d4d30a5ac72f3a9f7bedeecce2b014a71f99fc GIT binary patch literal 945 zcma)4&1(}u6o0eXY|^BWrX+q~kR=GZ2eWADMT#Jl9*UHL=pmP7o1LVa?iVu?VWC10 zFCIOmLJwa3xb$D>)k~l!R}WH8o)khZJ^5ynG=3d?Fu(Wa&CL7y&4*H{04T-aap$`N z@KtVRg8NiPYp4d`fI~d+Ns|z1E1uF+P-nc1uQpZmsn4OAb+U+>qao&;9AZ9JjQlql z$RNp5FK}C-LoLr0l-VBNLg(VP%{XP-vDgiRR+@4O8Psx(Y6t@mQ#W8GVpbirGY`Q~ zw#L$Nd}Js|w(T-55{=VV7&vcWB%hr{rXL8iWj?}G+}xmo2KqX49oJl^d{2at8L_ZS z#r=T0J03OtmvNvTsFpYtQabZrUuOosJutf^xxAw5AOf&9rNQL*f9o0dlb%&H1`reMttW?Y`syuPKs^EZ zjuj>3W>7|h%U69kSpC1i394Bdg;ZODQOe~v(DigQ z$+9G7Mv3LyqP5E^cwWWD>j-`LT)J|27kAU1 zjfJFOS?!+aF=|;%c8$4X89m9*e!;xJ2_@+aWwt*EJIk;6q0{r|J$4yS<#@P`@FPPA c8CQVZ`~;=32BdxpjRf=ru8lO6TudwZ31p4RFaQ7m literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_visitor.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/__pycache__/test_visitor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5488e4a193db0c5a6be22b5936f36b7ae5a54df0 GIT binary patch literal 2684 zcmah~&2JM&6rWwMKR3^AdH9wv7v!dMAHu`NmT?1B9KZJ(rV+GBpbYIGrNv( z6ol2H3ZzQ(P$`j`0|ySE&|CkDUK|n$G^G-1(*rluP$6;Zd$V>D9NLbxzkPoDX5PoV zk6+^P7=fibW0OCH2>Ap5)K{=ZtSuaafIPx@dBj@rz||s^EzD#mmF6am;cpufRp?3=&2WMGTKKCOSr$Z91Nn`#k4a z1?LiTOL@-)ov?FY;?Z#()AHY2Ed@dkWJhlF3 zA}~r)>abAElq!M~7I!@na#^n6&_`q)rQQ}Zw&P`TnJZwun;BvrbGiq(MXk&LbFX=Y zVy4Io)6Dzaajo$@%h+Y+%w+P`c%~?Q?Mt8dAOqg9-lCbiW==9UWAY-KoU{rVkGY;J z(U1`+@N}^(!js&zZIknM(2tMX3{WA9r|utmFjMX9ttNVT8?fH-R|AIh_ah*-`n&1v zr0Uf(jBIk36xaZ3LLDWKl;KoBgeD3l?oElHH)V0k@nqhLfJ*re1hhy(0tmMQ0PGuj zFu3sP<8wckR*v;oJNv7N{_SRNTuT!6fSEPrZ~K`Wk=+d;Q(!w@mUunV-5N4m){u9wWb|AqI!R(=ej zAvw@7j&J}TnRvI!Uz!@+zaG(oZBmE)oP*CB3&xHg`vGtc#*A|Fy>&>{$AP6@=o!!>Vhc;cF1%+Fs0Oxu&r>G%Om~0~{LNlrNK1 zYbRciwHzQBAu4S!jVWxWI{Hk_gO-p<~w)oXUy1Kt_RXe$+ zcl=*H2SatG3{DCMZk(>pxY0G{pV=sd(YZU|4P{eN|ANyth3I7bfLQN9)Jix1fq9}hS zh|=>biN6Uc%Goyr;7^kJjU<03y@K=$a$JzKAYFnaUxi4#trC6K)LMzY4#kwVJN9b= Mul2nxN=gRfADIa>qW}N^ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93783c1a68ad55152708999bfdf81e94b688ffcb GIT binary patch literal 217 zcmZ9GJqiLr425_60a3hzt%U})6+sY7J8hR$!x(pWW=NvAC-DrP#bbB^v9ofv^+DeI z5>mWpzu!%wdTwXyeAV`^Pb*&TNtF!E=8%|q$xSl dG#!WP+nJaCcqwqf?O4Rbks97jV+=PV{QzC$JW&7u literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/test_direct_rule_call.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/test_direct_rule_call.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd60413a3448199f8f179e63210e6ef279baab42 GIT binary patch literal 1968 zcmb7EO>7%Q6rR~1$FZF%shdKfKU<(bE45j*1;im#i4^J*5mS`H!I#x$ckFDk-gRfz zP+O^FkWqem35Sv#IB=xOg(FAqToQ7iT8gLym)=03sLF}=#&)6rQemW>c{}gT`}y9_ zcLM_%0xKJSQ2AUXQMxOma6IE*QVjh-ahF?V6Q` z4mFuqxR8jt2!JRS;vCSX>z!NL!%z@M>dGVNDJE?u?+6v@S!qjV6OKR9q)DYIfnu$WX^iGSnZ7&#k^*a5#=ZKEw9YY?2VB^j0nY;m zU0|d{JyKGZ2y_>8U`d5;S9dQyBixC4wc3EL?=-xNG51yq2pMG&2pOg3(c8*xMYfC5 z1W#SnRYrju@3rY%&#|5sI2WL$7nB8cqpN+Im}*gm^cdfn3P(ngDf=8Mqvi-<>WL;; zP)<@cIe-!^gi)2~xQir%HD$X|J&XlT1?d1T-0VR$WI3Ly3maz|Hh z-JM#0Z!355?$pEl=^yeJw(=Lgy7~3%-@N+m@OHkinJdWT6iqEj+ji(wnQbQ-+pb0) zR=%C&Z2MN-2|65(zCmfch(`8HBRO<11sowCLK!UKr)}~?QTngbP8pnnt3+`eJ`6Vap>bmkCD7Z}>?bkWp10IM*VI0BaF64oSDfwrG6n0*|pj-z&t^^{~J z-;OzB(qCE6T(%^ZCIUV-HYQ6u8U9za`5BNyTVfWr-4=P0Bl`J7JNZyE9v#lF=3A40 zYN~#nesS^-g6HppWa!lPpwW7({r0Z|$JWnn54_a6_F(9_wd0>1U-!0$UT#f3&@zit zA5XR4eUu$ub(Y^;AOAjkVpA(@o+@l>g{|xfiIUleNhsIjI)@~173@PDHPFo@-5XsJ t5ebI$^lzhLH$B=(;#F?KbIg`F0^4sYrSvCq?ng54Gr6>*y+FH}`3n_a>(c-L literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/test_memoization.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/__pycache__/test_memoization.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fb83f6dc0d4b5d4d854aedd8354ef37bde0a7e7 GIT binary patch literal 3050 zcmd^B&2Jk;6rWvx#vi3ArKBW;O;hA1wAqHHh|siZMcYG!oT4U31R-m^J9f6QciowF zR9mfNp-4${<4}@gjIYO6{}aGC*X2rWWSl6eQ$nm z-@Nym`5_*U5NJ{Bv+N%MLVm`F%_cVojSpe4OblX3Ig*#AB?-rJPM(%U@0<2P@5}k~ zf$0Fe^Uss%pb-EWD#-)E=eW#(Z>uWbB5}e01&qm}pjOGZJ$H`X` ztQXv)2#-c|_7vIH2=Aj2+tw(>2M(3Li73z}DR&fSMspM`$EaqMl)UEXGt^L6F-H}X zD;c|J8H#Cv7FBc&-YK>vYFpx5oTd>U67yGBmVYEhh@fi)UgF9brBHGZEMwkr zij2a#OtFhjq3ECrP6-ozr|THG*Wuqd3gUrpncOG$rHl+x&d6E$CaFrvDyjP10D3#@ zb!o5DIa*gLm6sJYZ#k;2PC){2^*VK^rCepEVX9XtpLOhlT444q>Rhq7na)u)U!vBW znlsZXxD4rXZfN*@l|wR}DQNnvmZe#`Jzw>RXV8hDh932|V**YZarJ<(oYxv!7fcUdQR;E_3tt8i`zPq-T ztaV?g9lg+i7i3qgu!=;iVla3hZ^r5-VIi1cm=aal3ysF2@Wj!gQekm?jn!E`)rNN> z(1$_0fjH>f`PFw<#%f0s3}<(_1kavJei$s1l2nzGuA~WHJb@;j1L%6&4rraA-N01= z|6IGk>3xAQ6m0{ikAODoLeb{e>idFX?Aiv^F*e(vldz4^9SP;}Cm zW{1!=C~Uz%^eKl?D)NU3KQW#RzmH?efji1&XkwGy;|C@fI|Is?sQeCyzbfSS!z3{F z%%5=mz25Ja`0zJ&yL({C%}(pP1{dM|)TM9!L9Y{{DKj-`mtJ zHV04sucyQ3f{Z6yPKS(U=HPG;hs1w79dES6ip%aUzE zY6G}Hn_R`-+Cme!+r%vRu}#SI;HyBseGsHz$2KAL_jW-}vUl*g7eqO+#e(9p@rBrj zi#NrUMW?5gvtKF~mBiVE;7E1??fO9^*-0E?^!A~!u7mcQjetQP8aW`4!D9c&U{5;V z6#S*Hcb=$>{}em_=-9^Scztwyee{#>Kdp~W)MFDh|3ob|@k;D95OyP}RHld*s#J<$ zy#Qg0tC#D8ir43Fh)18!B9*eI-loXERDyzohq^o%5)lK4{+ Uc}Dtv3wB8-8zY_4Ns-xq1Gb0U$p8QV literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34ee0d50bbd3aa2d487954cef042233c06549ff8 GIT binary patch literal 226 zcmZ9GL23d)5JjgQ1u=LBw=T3Wf~yb+3@+WpZ8K`oDQBj;sVaq8dJ4~wv*Z{#fy~ZT zdbasc|Gz3~@qeb%NtX2D_pZ<1-u|l_rprBRv$@%QXFNz-*Z(|k(0GL-dLD3yi?k;57F!wVg1gr-G*g_;f!Tm1@tyu>?bu+g+y$;=-U1w%{ z9JI+riJ?zIVnQE%@Iixrfd7LrLGi(CG{MLVZ;hCk@Pgmjy**llNp5!L`+Mg5`F`hq z92+w<7&Z1`2Uj)iFSW@>VX(M&8Wz_zPxEwN3-p#A6k3I#*edFZR`5%$5`2q(IjFQM zKr6LIymG7RRW56-QE!BdQoUt(RoK;f1#9%KGHVr+aoiT6A4}rUAPTumo{1TCLytH< zm4stoBu_`2GU+VD%#}1`XDvM$eGhX%_IpSmcwiyX%dnUFkoWdltB8Ce5E%Gd&b3PF)XwX9n6nn82BdusbRR-cfo-q zLK=peVY5sHZBu|!4|T=VFxSo!>2*WyrNrR^G8zYjNe~2KV+f2bX3U&yqEvCHgxY@S zE*a?zp3O@j0G9aV>?f=9QqSIiE`zP<;wXw; zm$J~b6hGGz2<``Usa!;1q)G()$PI%44}F1+25R?~u^$s;!-|sy!U=N;z@}l&m?&de zQ^?$JP8pj8Aj+4_Tp2i-B-{z+6t{hnhMExr+(T_L2@?&vib@M^UOe7x9caGh zKzfWcnKO^j_e~nP!Y0-{kPUUgfE6&yCmW`1PfwZF3M}TPrl;nnY}1-FL@#KEekw6L z_fe{aS%$mR+FW;l3!|&D3?a>lRLXFRgRZMSCHSfRz0Y8}u1RQk*;pyu7_4~hlppG?6f(*=Enj)XRIA{XnC|JT#g!s(N=oZuS<}vGR{7%Dv|`^U zLAVU~j4&WcE)qcnq6>&zph60S0g_o85~#a~CF)`UsALjT1|69)K|L~^8oH}a!PP@^ zUvJ)h0K+OI<+ST3MV~OMlvKb8H2kE*;Au#z?jrR)@S2na?J%KkNHvrDU)TYYwrhU? zvcf(^Bw^?TryjLW5V0h~$OaIdC-OLW2k6>CkFaIir)@jx$;FTzo<4ZU7Vz*iBkV5W z4iPry5$SYjXseDQY)(3y2mwVVY-oKkaSpzcvYdQ39rcoGUYh(_2<-&?#95g7+CNpT zY+Pwve)rCZapl#|SJ(AlMt1&Q9lNr4_0zSbU#rjkHojwBU%Pa(`rPgM&h;0rJ^yv_ zm->rqhrX@%Pu#AJUu~=(y0-u4+U}dB-S@zvmO60NDj$%f3@(>pu^BEhf6Czr_X^(^ zZww%_3Xk=wzM`F1nvaYXJ%`F_0VGBqVZ&C!ABJpz&GL9W+$AF&j-kVGz==Xe zQh^uo__??E4q#d(KBi<0%A#003Aa^gSC$E015TZWIgSg?{axVd&$j@&5o)x6tPR literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/test_issue_16.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/test_issue_16.py new file mode 100644 index 0000000..58d7d3b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_16/test_issue_16.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, unicode_literals, print_function + +import pytest +from arpeggio.cleanpeg import ParserPEG + +input = """\ +add($args[$i]); + } + + public function __get( $name = null ) { + return $this->self[$name]; + } + + public function add( $name = null, $enum = null ) { + if( isset($enum) ) + $this->self[$name] = $enum; + else + $this->self[$name] = end($this->self) + 1; + } + + +""" + +grammar = r""" + +calc = test + +test = visibility ws* function_keyword ws* word ws* arguments* ws* +function = visibility "function" word arguments block +block = "{" ws* r'[^}]*' ws* "}" +arguments = "(" ws* argument* ws* ")" + +// $types = array("cappuccino") +// arguments end with optional comma +argument = ( byvalue / byreference ) ("=" value )* ","* +byreference = "&" byvalue +byvalue = variable + +// value may be variable or array or string or any php type +value = variable + +visibility = "public" / "protected" / "private" +function_keyword = "function" + +variable = "$" literal r'[a-zA-Z0-9_]*' +word = r'[a-zA-Z0-9_]+' +literal = r'[a-zA-Z]+' + +comment = r'("//.*")|("/\*.*\*/")' +symbol = r'[\W]+' + +anyword = r'[\w]*' ws* +ws = r'[\s]+' + + +""" + + +def argument(parser, node, children): + """ + Removes parenthesis if exists and returns what was contained inside. + """ + print(children) + + if len(children) == 1: + print(children[0]) + return children[0] + + sign = -1 if children[0] == '-' else 1 + + return sign * children[-1] + +# Rules are mapped to semantic actions +sem_actions = { + "argument": argument, +} + + +def test_issue_16(): + + parser = ParserPEG(grammar, "calc", skipws=False) + + input_expr = """public function __construct( )""" + parse_tree = parser.parse(input_expr) + + # Do semantic analysis. Do not use default actions. + asg = parser.getASG(sem_actions=sem_actions, defaults=False) + + assert asg diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe745062857b4e13f70a2387397f91a949fbebff GIT binary patch literal 226 zcmZ9GJ&FQB5QV4x0a3hzsezV1sR)7?nz?B+YSEU?bT?I{FyWqJ&)``+h9_9ejOE^TQ=~D3EhR=O}=pr~sp56rtb+ mNaTukHUVqNlUh5D)w{DO!|__+lG~|~Nh3A2ltXTaG-0Sa)0VqC*G_l?Mi&6*ioH7mAjHpI*)sOAI~;IXFdI$!hSE>^>h zg!ySey@*N5>ydCxHMCOag7TH7+(;8uSk5F%lX|4g>&uINudJSIK;VVCRe)V2v5o=+ z_)X705;Oi2GyAd7l>HZ>b>l8_t*Wxu85dGHg8FF^C|hnY9=Hb2%W?-1uC{=nvsmBn^ay)1Y3(JiJLTeNFugIGX2Jj)3b9#fB+Y= zy1!KqsUUTp(J*8wkyJ=QI1M=!0(20B3DKb5+>B0n{nd2VR5;|vfzL1uF$vH@FK+HV z=!~6x_2_M(bMErHOYd)VuH0^q-uWonqpR(qRXzmU{?atpQ){{c&QVSO=+oD12Xx-S z+h{Wv~u|T!KB$LJImV*eRs6O)c{MfhV+EwYEXwf z$te{%t8%%_OE9bPTo*6xeGQK#p1+YYpYk!tj=~V<0b1x&>GaFWGq1IHFnp?Y>tJMj zcjEcP9_x%uwU!QwC)&kI+p6prD_V%ETTp|Zx89HqPCbw36;+|%irQdZKcYAT@Xf>+e?N)v)DH*Y*?lzg8Lf653s35^zW|*;&uIVv literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/test_issue_20.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/test_issue_20.py new file mode 100644 index 0000000..125c456 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_20/test_issue_20.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_optional_in_choice +# Purpose: Optional matches always succeeds but should not stop alternative +# probing on failed match. +# Author: Igor R. Dejanović +# Copyright: (c) 2015 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals + +# Grammar +from arpeggio import ParserPython, Optional, EOF + +def g(): return [Optional('first'), Optional('second'), Optional('third')], EOF + + +def test_optional_in_choice(): + parser = ParserPython(g) + input_str = "second" + parse_tree = parser.parse(input_str) + assert parse_tree is not None diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5040535dbfc4d73841549a140c7b5254ca53433 GIT binary patch literal 226 zcmZ9GF>1p=5Jk0748cKnNbABHth6Bz5Gmc+?IPR5dLn6enHdLE`V>Bc&yr*01V){! ztlE5-|KAK#{GXzjXGza~>!$pj?7zmxbh%_hwlM2!#t&&5r=R;7datmDjUWqrqN0DP znGOUsN~9~nzM;G+uQHyP46<3A?}`rY`5f1D(6WRid`>Y*3m z9)CBCT2fQ`n2886}pjPam%z|vFJ*+1Cc9L zY?E;eH68O!xIu?su@ZFSY%UBDEwWNK;&C;WK%a^%B@Y86qntlniG z1W|85%4T20rf#Z>knB*~Q5|eoAiai&S+by7twXe{T4qUg>U7&im$JFMO4xp99j&~h z8IY(NX2Tk$tx`xRQ86^wrupKDY7$a|#eCii6@4q~)ZGM69(nLIYmhfd_84n}?=dhr z-A#AWUA3b=&Gb*qv~Pb&O+LBaEp!Uq<<9c{*=MLfb+w@JW_~rx-hoT&dc6&4TmzG&A`h1v$>xw}2oBA3*dINDo3u;k;Mz0}(tMY5)KL literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/grammar1.peg b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/grammar1.peg new file mode 100644 index 0000000..1b95c6e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/grammar1.peg @@ -0,0 +1,17 @@ +number_token = r'(\d+|\d+\.\d*|\d*\.\d+)' +identifier_token = r'[a-zA-Z_][a-zA-Z0-9_]*' + +unqualified_identifier_expression = identifier_token +qualified_identifier_expression = identifier_token ( "." identifier_token )* + +unary_expression = number_token / qualified_identifier_expression + +method_call_expression = qualified_identifier_expression "(" ( rvalue_expression ( "," rvalue_expression )* )? ")" +collection_index_expression = qualified_identifier_expression "[" rvalue_expression ( "," rvalue_expression )* "]" + +lvalue_expression = qualified_identifier_expression +rvalue_expression = collection_index_expression / method_call_expression / unary_expression + +expression = collection_index_expression / method_call_expression / unary_expression + +belang = expression* EOF diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/grammar2.peg b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/grammar2.peg new file mode 100644 index 0000000..ebdc962 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/grammar2.peg @@ -0,0 +1,17 @@ +number_token = r'(\d+|\d+\.\d*|\d*\.\d+)' +identifier_token = r'[a-zA-Z_][a-zA-Z0-9_]*' + +qualified_identifier_expression = identifier_token ( "." identifier_token )* + +unary_expression = number_token / qualified_identifier_expression + +lvalue_expression = qualified_identifier_expression +rvalue_expression = expression + +expression = compound_expression / unary_expression +compound_expression = qualified_identifier_expression (method_call_par / index_par)+ + +method_call_par = "(" (rvalue_expression ("," rvalue_expression)* )? ")" +index_par = "[" rvalue_expression ("," rvalue_expression)* "]" + +belang = expression* EOF diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/test_issue_22.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/test_issue_22.py new file mode 100644 index 0000000..09a4c94 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_22/test_issue_22.py @@ -0,0 +1,19 @@ +import os +from arpeggio.cleanpeg import ParserPEG + + +def test_issue_22(): + """ + Infinite recursion during resolving of a grammar given in a clean PEG + notation. + """ + current_dir = os.path.dirname(__file__) + + grammar1 = open(os.path.join(current_dir, 'grammar1.peg')).read() + parser1 = ParserPEG(grammar1, 'belang') + parser1.parse('a [0]') + parser1.parse('a (0)') + + grammar2 = open(os.path.join(current_dir, 'grammar2.peg')).read() + parser2 = ParserPEG(grammar2, 'belang', debug=True) + parser2.parse('a [0](1)[2]') diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c65543aab10d0217bea56b1071d701555361e5bc GIT binary patch literal 226 zcmZ9GF^U2~5Jjg~7ZzpiU}~@yDj10%h@qLAHlr48=}dQ1RU=Her`R)i7LVZx7BeGz zQa{xHuZjx(Ezf&dQs4i$Ht(&y>(Nb@zpTlIW^>K>BW;iN=lKhjSJ=Z=kOkJL=m#sN z1HlUAtRX_=a6(;rpLhr9n`zhvr~OS8WEXcuEDKR`5`IsX{3(+uiAAlKo<4(l(`m zA|iOwTg8({rGJW-q&>7O2!bbXg?Q@8H!(pIe6Vlk?fbnq@4cC?mQ_F?X8b%j!U+9P z#!$4urgt4SN61G$4pD?RFh;)i8f|DT-8OzI$i~^kn#%>{YfqkfgRuT$fY#ybeFOzL za2rWD=Z_pfp5wtOZG3?1iX0PPKOXRH?Le!md}HEkjd_HG_6)tkK;*~VVE#AC_#4$i zc5Zcly-@l`cr&D>rP91;ZqdDzQz2Lq+jmBo5g)+3{IYWUR(XWU43%krS|kybH5LaY z!J;&znKcq^8(cM?ZNGseBv@wiQwmwP?IULbgTHmaHZ5{mQ*XBABELsp~b| zfC}RBlm-Dyh@?Ua!f7y=gCI7KL8WX+*bDqD_ddL9gM zyBRu>E4`Y-Vt`UAnS{Y|3%XF9h!>y^(S@N~(-%6*P5vsNsT=QiKjlxY^5M$4b?x2e z+s)3+yQkK|;mUWjcxKLY&6y87C+1wonCqBx=jz{V*PJ~w?XGEmc23M{$EbGAY7bJQ zRhVUQ*jU92sT)I+{o(hE_=5NpV0;qP<<)AG_;3@Cco9tX4uvZ8LdO_?L*<@Pz)OAn EH+4MKbpQYW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/test_issue_26.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/test_issue_26.py new file mode 100644 index 0000000..39fa32c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_26/test_issue_26.py @@ -0,0 +1,13 @@ +from arpeggio.cleanpeg import ParserPEG + +def test_regex_with_empty_successful_match_in_repetition(): + grammar = \ + """ + rule = (subexpression)+ + subexpression = r'^.*$' + """ + parser = ParserPEG(grammar, "rule") + parsed = parser.parse("something simple") + + assert parsed.rule_name == "rule" + assert parsed.subexpression.rule_name == "subexpression" diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13284b280542de8067fcde4ff603c05dbaab7696 GIT binary patch literal 226 zcmZ9GF^U2~5Jjh*6=Y@Zu&IF-qp2(`h@qLL&8S6N>r8i3RSFY&3eVtK_85BtF*C9! z^+Wyts;J=q6~$+kH1r$S<$q`IdVHkIHEXkxS=}=3rR~xEJTK6Ag&nK~Szw8Z{%gUs zCs?2yHAILUeo=qC(6&ZsTJ&eAX$!H{L-4anIRzobajbU7%Ar8T5uKv|ilPFHj!}ey n7a)-n+F1$Kk|(ux65Hos-h}3UYn=J`#TxaGa+g%g z1IC%G>YcqLLC8syJQJHRvPn4&i#6~ZkJKnT;89Fsi1sOe6f$qurzGgm@Hz3lT@tIk z*UM}72@_COW4n1^yOa?dV(PkHL^u^=2v8R&V_p<8;xX2y*7}-yWzDj3+)3tKu!F#c z!+WyJqCw0%RwzR1Sh3_>uJ}Sk_d+A zFKP$RKngBeJxMd#j6%o6kP?-UkuEQtLhTj}zl| zVw6q_w?-@D!kymcX$Ix5y{Q~mM!9kBZm;(J%3^P8urc6DSlvt~S<7m*c^jx@fuxpX vW}i_hJ;x%)Tw-&UsRWVJ_GuMvh_~{mVhh5Z>KNm%XyqGPouqU4x*GHwT|(w* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/test_issue_31.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/test_issue_31.py new file mode 100644 index 0000000..977aa6c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_31/test_issue_31.py @@ -0,0 +1,17 @@ +from __future__ import unicode_literals +from arpeggio import ParserPython, ZeroOrMore + + +def test_empty_nested_parse(): + + def grammar(): return [first] + def first(): return ZeroOrMore("second") + + parser = ParserPython(grammar) + + # Parse tree will be empty + # as nothing will be parsed + tree = parser.parse("something") + + assert not tree + diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e6bbb532c731e9b8cf02e6bc4b86c8fb6a0c2f0 GIT binary patch literal 226 zcmZ9GF^U2~5Jjh*6=Y@Zu&IF-j;Smxh@qLL&8S6N>r8i3RSFY&3eVtK_85BtF*C9! z^+Wyts;J=q6~$+kH1r$S<$q`IdVHkIHEXkxS=}=3rR~xEJTK6Ag&nK~Szw8Z{%gUs zCs?2yHAILUeo=qC(6&ZsTJ&eAX$!H{L-4c7v;-l=ajbU7%Ar8T5uKv|ilPFHj!}ey n7a)-n+F1$Kk|(ux65Hos-h}7b2 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__pycache__/test_issue_32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/__pycache__/test_issue_32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43f87b36d3aa02613504023c468de9ff23f380e6 GIT binary patch literal 10032 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 XuMI%EgY94L^0IyR{cd)QI^X{Q)ag!i literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/test_issue_32.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/test_issue_32.py new file mode 100644 index 0000000..2ef7ab1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_32/test_issue_32.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- + +# Test github issue 32: ensure that Python-style escape sequences in peg and +# cleanpeg grammars are properly converted, and ensure that escaping of those +# sequences works as well. + +from __future__ import print_function +import re +import sys + +import pytest + +import arpeggio +from arpeggio.cleanpeg import ParserPEG as ParserCleanPEG +from arpeggio.peg import ParserPEG + + +def check_parser(grammar, text): + """Test that the PEG parsers correctly parse a grammar and match the given + text. Test both the peg and cleanpeg parsers. Raise an exception if the + grammar parse failed, and returns False if the match fails. Otherwise, + return True. + + Parameters: + grammar -- Not the full grammar, but just the PEG expression for a string + literal or regex match, e.g. "'x'" to match an x. + text -- The text to test against the grammar for a match. + """ + # test the peg parser + parser = ParserPEG('top <- ' + grammar + ' EOF;', 'top', skipws=False) + if parser.parse(text) is None: + return False + + # test the cleanpeg parser + parser = ParserCleanPEG('top = ' + grammar + ' EOF', 'top', skipws=False) + if parser.parse(text) is None: + return False + + return True + + +def check_regex(grammar, text): + """Before calling check_parser(), verify that the regular expression + given in ``grammar`` matches ``text``. Only works for single regexs. + """ + if not re.match(eval(grammar).strip() + '$', text): + return False + return check_parser(grammar, text) + + +# ==== Make sure things are working as expected. ==== + +def test_harness(): + assert check_parser(r"'x'", 'x') + with pytest.raises(arpeggio.NoMatch): + check_parser(r"'x'", 'y') + with pytest.raises(arpeggio.NoMatch): + check_parser(r"'x'", 'xx') + assert check_parser(r"'x' 'y'", 'xy') + assert check_parser(r"'\''", "'") + assert check_regex(r"r'x'", 'x') + + +# ==== Check things that were broken in arpeggio 1.5 @ commit 25dae48 ==== + +# ---- string literal quoting ---- + +def test_literal_quoting_1(): + # this happens to work in 25dae48 if there are no subsequent single quotes + # in the grammar: + assert check_parser(r"'\\'", '\\') + # add subsequent single quotes and it fails: + assert check_parser(r""" '\\' 'x' """, '\\x') + + +def test_literal_quoting_2(): + # this grammar should fail to parse, but passes on 25dae48: + with pytest.raises(arpeggio.NoMatch): + check_parser(r""" '\\'x' """, r"\'x") + + +def test_literal_quoting_3(): + # escaping double quotes within double-quoted strings was not implemented + # in 25dae48: + assert check_parser(r''' "x\"y" ''', 'x"y') + + +# ---- now repeat the above section with single and double quotes swapped ---- + +def test_literal_quoting_4(): + assert check_parser(r'"\\"', '\\') + assert check_parser(r''' "\\" "x" ''', '\\x') + + +def test_literal_quoting_5(): + with pytest.raises(arpeggio.NoMatch): + check_parser(r''' "\\"x" ''', r'\"x') + + +def test_literal_quoting_6(): + assert check_parser(r""" 'x\'y' """, "x'y") + + +# ---- regular expression quoting ---- + +# Because arpeggio has treated regular expressions in PEG grammars most +# nearly like raw strings, the tests below expect the peg and cleanpeg +# grammars to behave such that "rule <- r'';" will match the +# same text as the Python expression "re.match(r'')". +# +# This can be a little surprising at times, since Python's handling of +# quotes inside raw strings is somewhat odd. Raw strings "treat backslashes +# as literal characters"[1], yet a backslash also functions as an escape +# character before certain characters: +# - before quotes inside a string (e.g. "r'x\'x'" is accepted as the +# string "x\'x"), +# - before another backslash (e.g. "r'x\\'x'" fails with a syntax error, +# while "r'x\\x' is accepted as the string "x\\x"), and +# - similarly before a newline. +# +# [1] https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals + +def test_regex_quoting_1(): + assert check_regex(r"r'\\'", '\\') + assert check_regex(r'r"\\"', '\\') + assert check_parser(r""" r'\\' r'x' """, '\\x') + assert check_parser(r''' r"\\" r"x" ''', '\\x') + + +def test_regex_quoting_2(): + with pytest.raises(arpeggio.NoMatch): + check_parser(r""" r'\\' ' """, "\\' ") + with pytest.raises(arpeggio.NoMatch): + check_parser(r''' r"\\" " ''', '\\" ') + + +def test_regex_quoting_3(): + assert check_regex(r""" r'x\'y' """, "x'y") + assert check_regex(r''' r"x\"y" ''', 'x"y') + + +# ---- string literal escape sequence translation ---- + +def test_broken_escape_translation(): + # 25dae48 would translate this as 'newline-newline', not 'backslash-n-newline'. + assert check_parser(r"'\\n\n'", '\\n\n') + assert check_parser(r"'\\t\t'", '\\t\t') + + +def test_multiple_backslash_sequences(): + assert check_parser(r"'\\n'", '\\n') # backslash-n + assert check_parser(r"'\\\n'", '\\\n') # backslash-newline + assert check_parser(r"'\\\\n'", '\\\\n') # backslash-backslash-n + assert check_parser(r"'\\\\\n'", '\\\\\n') # backslash-backslash-newline + + +# ==== Check newly-implemented escape sequences ==== + +def test_single_character_escapes(): + # make sure parsing across newlines works, otherwise the following + # backslash-newline test won't work: + assert check_parser(" \n 'x' \n ", 'x') + # a compact test is clearer for failure diagnosis: + assert check_parser("'x\\\ny'", 'xy') # backslash-newline + # but this would probably only be used like so: + assert check_parser(""" 'extremely_\ +long_\ +match' """, 'extremely_long_match') + + # the remaining single-character escapes: + assert check_parser(r'"\\"', '\\') # \\ + assert check_parser(r"'\''", "'") # \' + assert check_parser("'\\\"'", '"') # \" + assert check_parser(r"'\a'", '\a') + assert check_parser(r"'\b'", '\b') + assert check_parser(r"'\f'", '\f') + assert check_parser(r"'\n'", '\n') + assert check_parser(r"'\r'", '\r') + assert check_parser(r"'\t'", '\t') + assert check_parser(r"'\v'", '\v') + + # unrecognized escape sequences *are not changed* + assert check_parser(r"'\x'", '\\x') + + +def test_octal_escapes(): + assert check_parser(r"'\7'", '\7') + assert check_parser(r"'\41'", '!') + assert check_parser(r"'\101'", 'A') + assert check_parser(r"'\1001'", '@1') # too long + + +def test_hexadecimal_escapes(): + assert check_parser(r"'\x41'", 'A') + assert check_parser(r"'\x4A'", 'J') + assert check_parser(r"'\x4a'", 'J') + assert check_parser(r"'\x__'", '\\x__') # too short + assert check_parser(r"'\x1_'", '\\x1_') # too short + assert check_parser(r"'\x411'", 'A1') # too long + + +def test_small_u_unicode_escapes(): + assert check_parser(r"'\u0041'", 'A') + assert check_parser(r"'\u004A'", 'J') + assert check_parser(r"'\u004a'", 'J') + assert check_parser(r"'\u____'", '\\u____') # too short + assert check_parser(r"'\u1___'", '\\u1___') # too short + assert check_parser(r"'\u41__'", '\\u41__') # too short + assert check_parser(r"'\u041_'", '\\u041_') # too short + assert check_parser(r"'\u00411'", 'A1') # too long + + +def test_big_u_unicode_escapes(): + assert check_parser(r"'\U00000041'", 'A') + assert check_parser(r"'\U0000004A'", 'J') + assert check_parser(r"'\U0000004a'", 'J') + assert check_parser(r"'\U________'", '\\U________') # too short + assert check_parser(r"'\U1_______'", '\\U1_______') # too short + assert check_parser(r"'\U41______'", '\\U41______') # too short + assert check_parser(r"'\U041_____'", '\\U041_____') # too short + assert check_parser(r"'\U0041____'", '\\U0041____') # too short + assert check_parser(r"'\U00041___'", '\\U00041___') # too short + assert check_parser(r"'\U000041__'", '\\U000041__') # too short + assert check_parser(r"'\U0000041_'", '\\U0000041_') # too short + assert check_parser(r"'\U000000411'", 'A1') # too long + with pytest.raises(arpeggio.GrammarError): + check_parser(r"'\U00110000'", '?') # out-of-range + + +def test_unicode_name_escapes(): + assert check_parser(r"'\N{LATIN SMALL LETTER B}'", 'b') + + if sys.version_info >= (3, 3): + # check that Unicode name aliases work as well + assert check_parser(r"'\N{LATIN CAPITAL LETTER GHA}'", '\u01a2') + + with pytest.raises(arpeggio.GrammarError): + check_parser(r"'\N{NOT A VALID NAME}'", '\\N{NOT A VALID NAME}') + + # This shouldn't raise, because it shouldn't pass the valid-escape filter: + assert check_parser(r"'\N{should not match filter regex!}'", + '\\N{should not match filter regex!}') diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__init__.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6111821ef0f2152463672392100746f5a27168c3 GIT binary patch literal 226 zcmZ9GJ&FQB5QV4x0a3hzseu;$gdzxHXy&HPs6|^k)7?~+!i0N@J%eZQ7@lA;GqNZ3 zLB01?QNerk``s+5=YL$C&)UBAYNg9xR%Ju8y=UA=+pGS0|3c{%4zLqsfekA9!J6qv zutvFPh!8oPQCD7QUm%nf`WqCqhgj(;_}O?e1tG;z%nz5`p+L?NoudGXq5_PLQG|jQ mAdxHD`3$TjPipNrR`1TD499DMOKzt|CXLka-!#T>GtmdY>OXh@ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__pycache__/test_issue43.cpython-312.pyc b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_43/__pycache__/test_issue43.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b5630a659fe3b3a1b7b024ab11f90db24c88163 GIT binary patch literal 1239 zcmcIj&1)1f6i?=3zxw6+0iqSc^wI_0&~7h^3WeI7^%Mvfa8B^&&oazr4(Qnf%@_$%nDA3IZERo`tgpLSNKm zU@+I#yA8uW3eYMFaA3r^Wvm()1?DTXY6cdd71)4wPyj4+inY?#Oyvn8!gGy!*2zaC@3 zGVQWn`u{kqp2#p~J`NnXA~HmJT$A>N>q(cTF~0)otE!|rsQWjD!vy}Oux9&PhBKOB zE8S#nJ4t!KI151Ew4J#!bz={%QXD1B9a8-oaKCw>iRD@`FS>4!HeENb4(@2Z88a_| zC!t@7K2d#QS_Q8D@{3%jrTeWkXvgd!zYbaTZp9S9Hxpz0-7v6qQb2h6xM1R2$D7%Q6rR~XukAQ)nn2r#sHRaN2H{mGL_#%I5l#+>I+a?G;)~^YC(b7Ju9;b5 zY$cL~A{qyzZ~!F-4m~z%4?S|=R&HD@IfrT~5)xc;3#3vYC*F*+38@lViWu2%e%{QR z_rCYN*&ia25P}xAKPNN_)Xd$?4)3@hD>DQ5-Q^?#(XT5q^tzJT$0O5Rw=7l zwX9{eav&Qh>sh@V%m!hfvV^jsx)fKpxUo3)PE~EI;Fu&=vRp#*C6M4OSWqqv;8v4K5}&0Ccki_4S~n{xA%gAKK$ z)EsIu&f4bQXGYm}je_w3)Dbf#h)e8Pnp&o1qzRjMor+PR&Kz;yv6(epB1XAR?2nC- zHEmQx)m=)AzHTt6$=53R!hF6+n31OyQY>1I;S%ODgOVa8j9HG&42!WU$&HN)RnDI! zDs@k1#D=>Iq|w!ZhrDWY1yQ!SZZNqTOC(E90m?s>@DFgdut5-iG||K8nQub3-sqei zxi_#G9s5phM=!Va%R8V&$D{oUXpW-Yg7?alW@PB4qHM}{6(487R?Y0;*d9*YpgnMK z15?gqKwGl*0i{t`puHd(uk!eFPY#4(3+wdOrQ7nleS7-eaC>O%TX!>> zZtH2<2Rn|$0rM_vI0e>F9mk~%JpU_0ZiX`%-w+ASMLV^f^9%9z>V8&xrE{Zs25` ztDDjBwmvSR-Qraj*C>zGQ!D&S0hSek&kad);-yZzhV+ENWn6O1t}NQDl_WBT6B^fm8iy!VZ9 zLIws2nu!Iok#r&0g$tz{moD5C#EqMQbP-_xorUAz@!H4xOWmj6!jWCFFSA&o_ zlu>7nh0R86Ty8{e7}UI2zI1su))&L~Ymt4!K1wZ_R7A`j`adIlp>4y4wnQAVZnQDW zb=cG#xlJ6UE#W6eB#A+A)VoLP3VbvH&{k3qiF=Z<219FGT~lw0fBb8#k)a2HHQCWt zvv`Mm>lFpoBu8C71Hh$u_>8pRC5W_P@B}cd4SEdxrE75O?G^Y`z6L9#q%S^2Oaz_6 zum38-*90XX$LV*GTo>*hB^(XKf+hI_D9MYlx`Kr~JD8?R5)%xVj(|d>c<57$H9g8j z2|9;;SyvAlzTx;#>d`W`vZi2C}z2Ki!VZodGTY^SoD%XjAXvM0C7 zUsex5Q%5$)zNDr`_D&b?OzfPV+?d_XocwB`yKsB-ex|saIkok1ccDACpF&r0MPaMF zdA_HNbk9G2q(fo!07zpzym?&hzkck#L*8R}9;D-)At&6OP2B8EWL%=Ku X`5h)7K=v<*kQ09bLf;r8qe<-FDg|Ny literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_73/test_issue_73.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_73/test_issue_73.py new file mode 100644 index 0000000..944e8a0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/issue_73/test_issue_73.py @@ -0,0 +1,33 @@ +from __future__ import unicode_literals +import pytest +from arpeggio import ParserPython, UnorderedGroup, Optional, \ + EOF, NoMatch + + +def test_nondeterministic_unordered_group(): + + def root(): + return 'word1', UnorderedGroup(some_rule, 'word2', some_rule), EOF + + def some_rule(): + return Optional('word2'), Optional('word3') + + content = '''word1 word2 ''' + + # If the 'word2' from unordered group in the `root` rule matches first + # the input parses, else it fails. + # We repeat parser construction and parsing many times to check + # if it fails every time. The current fix will iterate in order from left + # to right and repeat matching until all rules in a unordered group + # succeeds. + fail = 0 + success = 0 + for _ in range(100): + try: + parser = ParserPython(root) + parser.parse(content) + success += 1 + except NoMatch: + fail += 1 + + assert fail == 100 diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/test_direct_rule_call.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/test_direct_rule_call.py new file mode 100644 index 0000000..09650ca --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/test_direct_rule_call.py @@ -0,0 +1,31 @@ +from __future__ import unicode_literals +import pytest +from arpeggio import SemanticAction, ParserPython + +def test_direct_rule_call(): + ''' + Test regression where in direct rule call semantic action is + erroneously attached to both caller and callee. + ''' + + def grammar(): return rule1, rule2 + def rule1(): return "a" + def rule2(): return rule1 + + call_count = [0] + + class DummySemAction(SemanticAction): + def first_pass(self, parser, node, nodes): + call_count[0] += 1 + return SemanticAction.first_pass(self, parser, node, nodes) + + # Sem action is attached to rule2 only but + # this bug will attach it to rule1 also resulting in + # wrong call count. + rule2.sem = DummySemAction() + + parser = ParserPython(grammar) + parse_tree = parser.parse("aa") + parser.getASG() + + assert call_count[0] == 1, "Semantic action should be called once!" diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/test_memoization.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/test_memoization.py new file mode 100644 index 0000000..6b5fa2e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/regressions/test_memoization.py @@ -0,0 +1,52 @@ +from __future__ import unicode_literals +import pytest +import sys +from arpeggio import ParserPython + + +def test_memoization_positive(capsys): + ''' + Test that already matched rule is found in the cache on + subsequent matches. + Args: + capsys - pytest fixture for output capture + ''' + + def grammar(): return [(rule1, ruleb), (rule1, rulec)] + def rule1(): return rulea, ruleb + def rulea(): return "a" + def ruleb(): return "b" + def rulec(): return "c" + + parser = ParserPython(grammar, memoization=True, debug=True) + + # Parse input where a rule1 will match but ruleb will fail + # Second sequence will try rule1 again on the same location + # and result should be found in the cache. + parse_tree = parser.parse("a b c") + + # Assert that cached result is used + assert "Cache hit" in capsys.readouterr()[0] + assert parser.cache_hits == 1 + assert parser.cache_misses == 4 + +def test_memoization_nomatch(capsys): + ''' + Test that already failed match is found in the cache on + subsequent matches. + ''' + + def grammar(): return [(rule1, ruleb), [rule1, rulec]] + def rule1(): return rulea, ruleb + def rulea(): return "a" + def ruleb(): return "b" + def rulec(): return "c" + + parser = ParserPython(grammar, memoization=True, debug=True) + parse_tree = parser.parse("c") + + assert "Cache hit for [rule1=Sequence, 0] = '0'" in capsys.readouterr()[0] + assert parser.cache_hits == 1 + assert parser.cache_misses == 4 + + diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_decorator_combine.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_decorator_combine.py new file mode 100644 index 0000000..1525ec3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_decorator_combine.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_decorator_combine +# Purpose: Test for Combine decorator. Combine decorator +# results in Terminal parse tree node. Whitespaces are +# preserved (they are not skipped) and comments are not matched. +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest +from arpeggio import ParserPython, ZeroOrMore, OneOrMore, NonTerminal, \ + Terminal, NoMatch, Combine + + +def test_combine_python(): + + # This will result in NonTerminal node + def root(): + return my_rule(), "." + + # This will result in Terminal node + def my_rule(): + return Combine(ZeroOrMore("a"), OneOrMore("b")) + + parser = ParserPython(root) + + input1 = "abbb." + + # Whitespaces are preserved in lexical rules so the following input + # should not be recognized. + input2 = "a b bb." + + ptree1 = parser.parse(input1) + + with pytest.raises(NoMatch): + parser.parse(input2) + + assert isinstance(ptree1, NonTerminal) + assert isinstance(ptree1[0], Terminal) + assert ptree1[0].value == "abbb" diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_default_semantic_action.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_default_semantic_action.py new file mode 100644 index 0000000..2efc65c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_default_semantic_action.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_default_semantic_action +# Purpose: Default semantic action is applied during semantic analysis +# if no action is given for node type. Default action converts +# terminals to strings, remove StrMatch terminals from sequences. +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest # noqa +from arpeggio import ParserPython, SemanticAction, ParseTreeNode +from arpeggio import RegExMatch as _ + +try: + # For python 2.x + text=unicode +except: + # For python 3.x + text=str + +def grammar(): return parentheses, 'strmatch' +def parentheses(): return '(', rulea, ')' +def rulea(): return ['+', '-'], number +def number(): return _(r'\d+') + + +p_removed = False +number_str = False +parse_tree_node = False + + +class ParenthesesSA(SemanticAction): + def first_pass(self, parser, node, children): + global p_removed, parse_tree_node + p_removed = text(children[0]) != '(' + parse_tree_node = isinstance(children[0], ParseTreeNode) + return children[0] if len(children) == 1 else children[1] + + +class RuleSA(SemanticAction): + def first_pass(self, parser, node, children): + global number_str + number_str = type(children[1]) == text + return children[1] + + +parentheses.sem = ParenthesesSA() +rulea.sem = RuleSA() + + +def test_default_action_enabled(): + + parser = ParserPython(grammar) + + parser.parse('(-34) strmatch') + + parser.getASG(defaults=True) + + assert p_removed + assert number_str + assert not parse_tree_node + + +def test_default_action_disabled(): + + parser = ParserPython(grammar) + + parser.parse('(-34) strmatch') + + parser.getASG(defaults=False) + + assert not p_removed + assert not number_str + assert parse_tree_node diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_eolterm.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_eolterm.py new file mode 100644 index 0000000..8ed1fc8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_eolterm.py @@ -0,0 +1,39 @@ +from __future__ import unicode_literals +import pytest # noqa + +# Grammar +from arpeggio import ZeroOrMore, OneOrMore, ParserPython, EOF + + +def test_zeroormore_eolterm(): + + def grammar(): return first, second, EOF + def first(): return ZeroOrMore(["a", "b"], eolterm=True) + def second(): return "a" + + # first rule should match only first line + # so that second rule will match "a" on the new line + input = """a a b a b b + a""" + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse(input) + + assert result + + +def test_oneormore_eolterm(): + + def grammar(): return first, second, EOF + def first(): return OneOrMore(["a", "b"], eolterm=True) + def second(): return "a" + + # first rule should match only first line + # so that second rule will match "a" on the new line + input = """a a a b a + a""" + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse(input) + + assert result diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_error_reporting.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_error_reporting.py new file mode 100644 index 0000000..eb66c40 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_error_reporting.py @@ -0,0 +1,223 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_error_reporting +# Purpose: Test error reporting for various cases. +# Author: Igor R. Dejanović +# Copyright: (c) 2015 Igor R. Dejanović +# License: MIT License +####################################################################### +from __future__ import unicode_literals +import pytest + +from arpeggio import Optional, Not, ParserPython, NoMatch, EOF +from arpeggio import RegExMatch as _ + + +def test_non_optional_precedence(): + """ + Test that all tried match at position are reported. + """ + def grammar(): + return Optional('a'), 'b' + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse('c') + assert "Expected 'a' or 'b'" in str(e.value) + assert (e.value.line, e.value.col) == (1, 1) + + def grammar(): + return ['b', Optional('a')] + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse('c') + + assert "Expected 'b'" in str(e.value) + assert (e.value.line, e.value.col) == (1, 1) + + +def test_optional_with_better_match(): + """ + Test that optional match that has gone further in the input stream + has precedence over non-optional. + """ + + def grammar(): return [first, Optional(second)] + def first(): return 'one', 'two', 'three', '4' + def second(): return 'one', 'two', 'three', 'four', 'five' + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse('one two three four 5') + + assert "Expected 'five'" in str(e.value) + assert (e.value.line, e.value.col) == (1, 20) + + +def test_alternative_added(): + """ + Test that matches from alternative branches at the same positiona are + reported. + """ + + def grammar(): + return ['one', 'two'], _(r'\w+') + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse(' three ident') + assert "Expected 'one' or 'two'" in str(e.value) + assert (e.value.line, e.value.col) == (1, 4) + + +def test_file_name_reporting(): + """ + Test that if parser has file name set it will be reported. + """ + + def grammar(): return Optional('a'), 'b', EOF + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse("\n\n a c", file_name="test_file.peg") + assert "Expected 'b' at position test_file.peg:(3, 6)" in str(e.value) + assert (e.value.line, e.value.col) == (3, 6) + + +def test_comment_matching_not_reported(): + """ + Test that matching of comments is not reported. + """ + + def grammar(): return Optional('a'), 'b', EOF + def comments(): return _(r'//.*$') + + parser = ParserPython(grammar, comments) + + with pytest.raises(NoMatch) as e: + parser.parse('\n\n a // This is a comment \n c') + assert "Expected 'b' at position (4, 2)" in str(e.value) + assert (e.value.line, e.value.col) == (4, 2) + + +def test_not_match_at_beginning(): + """ + Test that matching of Not ParsingExpression is not reported in the + error message. + """ + + def grammar(): + return Not('one'), _(r'\w+') + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse(' one ident') + assert "Not expected input" in str(e.value) + + +def test_not_match_as_alternative(): + """ + Test that Not is not reported if a part of OrderedChoice. + """ + + def grammar(): + return ['one', Not('two')], _(r'\w+') + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse(' three ident') + assert "Expected 'one' at " in str(e.value) + + +def test_sequence_of_nots(): + """ + Test that sequence of Not rules is handled properly. + """ + + def grammar(): + return Not('one'), Not('two'), _(r'\w+') + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse(' two ident') + assert "Not expected input" in str(e.value) + + +def test_compound_not_match(): + """ + Test a more complex Not match error reporting. + """ + def grammar(): + return [Not(['two', 'three']), 'one', 'two'], _(r'\w+') + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch) as e: + parser.parse(' three ident') + assert "Expected 'one' or 'two' at" in str(e.value) + + with pytest.raises(NoMatch) as e: + parser.parse(' four ident') + assert "Expected 'one' or 'two' at" in str(e.value) + + +# HACK: Disabled just for this bugfix release as this require new handling of +# infallibles +def _test_not_succeed_in_ordered_choice(): + """ + Test that Not can succeed in ordered choice leading to ordered choice + to succeed. + See: https://github.com/textX/Arpeggio/issues/96 + """ + + def grammar(): + return [Not("a"), "a"], Optional("b") + + parser = ParserPython(grammar) + parser.parse('b') + + +def test_reporting_newline_symbols_when_not_matched(): + + # A case when a string match has newline + def grammar(): + return "first", "\n" + + parser = ParserPython(grammar, skipws=False) + + with pytest.raises(NoMatch) as e: + _ = parser.parse('first') + + assert "Expected '\\n' at position (1, 6)" in str(e.value) + + # A case when regex match has newline + from arpeggio import RegExMatch + def grammar(): + return "first", RegExMatch("\n") + + parser = ParserPython(grammar, skipws=False) + + with pytest.raises(NoMatch) as e: + _ = parser.parse('first') + + assert "Expected '\\n' at position (1, 6)" in str(e.value) + + # A case when the match is the root rule + def grammar(): + return "root\nrule" + + parser = ParserPython(grammar, skipws=False) + + with pytest.raises(NoMatch) as e: + _ = parser.parse('something') + + assert "Expected grammar at position (1, 1)" in str(e.value) diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_examples.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_examples.py new file mode 100644 index 0000000..3321543 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_examples.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_examples +# Purpose: Test that examples run without errors. +# Author: Igor R. Dejanović +# Copyright: (c) 2014-2015 Igor R. Dejanović +# License: MIT License +####################################################################### +import pytest # noqa +import os +import sys +import glob + +PY_LT_3_5 = sys.version_info < (3, 5) +if PY_LT_3_5: + import imp +else: + import importlib + + +def test_examples(): + + examples_folder = os.path.join(os.path.abspath(os.path.dirname(__file__)), + '..', '..', 'examples') + if not os.path.exists(examples_folder): + print('Warning: Examples not found. Skipping tests.') + return + + examples_pat = os.path.join(examples_folder, '*', '*.py') + + # Filter out __init__.py + examples = [f for f in glob.glob(examples_pat) if f != '__init__.py'] + for e in examples: + example_dir = os.path.dirname(e) + sys.path.insert(0, example_dir) + (module_name, _) = os.path.splitext(os.path.basename(e)) + if PY_LT_3_5: + (module_file, module_path, desc) = \ + imp.find_module(module_name, [example_dir]) + mod = imp.load_module(module_name, module_file, module_path, desc) + else: + mod_spec = importlib.util.spec_from_file_location(module_name, e) + mod = importlib.util.module_from_spec(mod_spec) + mod_spec.loader.exec_module(mod) + + if hasattr(mod, 'main'): + mod.main(debug=False) diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_exporter.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_exporter.py new file mode 100644 index 0000000..65933a4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_exporter.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_python_parser +# Purpose: Testing the dot exporter. +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest +import os +from arpeggio.export import PMDOTExporter, PTDOTExporter + +# Grammar +from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF, ParserPython +from arpeggio import RegExMatch as _ + + +def number(): return _(r'\d*\.\d*|\d+') +def factor(): return Optional(["+","-"]), [number, + ("(", expression, ")")] +def term(): return factor, ZeroOrMore(["*","/"], factor) +def expression(): return term, ZeroOrMore(["+", "-"], term) +def calc(): return OneOrMore(expression), EOF + + +@pytest.fixture +def parser(): + return ParserPython(calc) + + +def test_export_parser_model(parser): + """ + Testing parser model export + """ + + PMDOTExporter().exportFile(parser.parser_model, + "test_exporter_parser_model.dot") + + assert os.path.exists("test_exporter_parser_model.dot") + + +def test_export_parse_tree(parser): + """ + Testing parse tree export. + """ + + parse_tree = parser.parse("-(4-1)*5+(2+4.67)+5.89/(.2+7)") + PTDOTExporter().exportFile(parse_tree, + "test_exporter_parse_tree.dot") + + assert os.path.exists("test_exporter_parse_tree.dot") diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_flags.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_flags.py new file mode 100644 index 0000000..e83a272 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_flags.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_flags +# Purpose: Test for parser flags +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import re +import pytest + +# Grammar +from arpeggio import ParserPython, Optional, EOF +from arpeggio import RegExMatch as _ +from arpeggio import NoMatch + + +def foo(): return 'r', bar, Optional(qux), baz, Optional(ham), Optional(buz), EOF +def bar(): return 'BAR' +def baz(): return _(r'1\w+') +def buz(): return _(r'Aba*', ignore_case=True) +def qux(): return _(r'/\*.*\*/', multiline=True) +def ham(): return _(r'/\*.*\*/', re_flags=re.DOTALL) # equivalent to qux + + +@pytest.fixture +def parser_ci(): + return ParserPython(foo, ignore_case=True) + + +@pytest.fixture +def parser_nonci(): + return ParserPython(foo, ignore_case=False) + + +def test_parse_tree_ci(parser_ci): + input_str = "R bar 1baz" + parse_tree = parser_ci.parse(input_str) + assert parse_tree is not None + + +def test_parse_tree_nonci(parser_nonci): + input_str = "R bar 1baz" + with pytest.raises(NoMatch): + parser_nonci.parse(input_str) + + +def test_flags_override(parser_nonci): + # Parser is not case insensitive + # But the buz match is. + input_str = "r BAR 1baz abaaaaAAaaa" + parse_tree = parser_nonci.parse(input_str) + assert parse_tree is not None + + +def test_multiline_comment(parser_nonci): + input_str = "r BAR /*1baz\nabaaaaAAaaa\n*/1baz" + parse_tree = parser_nonci.parse(input_str) + assert parse_tree is not None + + +def test_multiline_comment_by_re_flags(parser_nonci): + input_str = "r BAR 1baz/*this\nis\nnot\nparsed*/" + parse_tree = parser_nonci.parse(input_str) + assert parse_tree is not None diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parser_params.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parser_params.py new file mode 100644 index 0000000..5c216ed --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parser_params.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_parser_params +# Purpose: Test for parser parameters. +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest +from arpeggio import ParserPython, NoMatch +import sys + + +def test_autokwd(): + """ + autokwd will match keywords on word boundaries. + """ + def grammar(): + return ("one", "two", "three") + + parser = ParserPython(grammar, autokwd=True) + + # If autokwd is enabled this should parse without error. + parser.parse("one two three") + + # But this will not parse because each word to match + # will be, by default, tried to match as a whole word + with pytest.raises(NoMatch): + parser.parse("onetwothree") + + parser = ParserPython(grammar, autokwd=False) + # If we turn off the autokwd than this will match. + parser.parse("one two three") + parser.parse("onetwothree") + + +def test_skipws(): + """ + skipws will skip whitespaces. + """ + + def grammar(): + return ("one", "two", "three") + + parser = ParserPython(grammar) + + # If skipws is on this should parse without error. + parser.parse("one two three") + + # If not the same input will raise exception. + parser = ParserPython(grammar, skipws=False) + with pytest.raises(NoMatch): + parser.parse("one two three") + + +def test_ws(): + """ + ws consists of chars that will be skipped if skipws is enables. + By default it consists of space, tab and newline. + """ + + def grammar(): + return ("one", "two", "three") + + parser = ParserPython(grammar) + + # With default ws this should parse without error + parser.parse("""one + two three""") + + # If we make only a space char to be ws than the + # same input will raise exception. + parser = ParserPython(grammar, ws=" ") + with pytest.raises(NoMatch): + parser.parse("""one + two three""") + + # But if only spaces are between words than it will + # parse. + parser.parse("one two three") + + +def test_file(capsys): + """ + 'file' specifies an output file for the DebugPrinter mixin. + """ + + def grammar(): + return ("one", "two", "three") + + # First use stdout + parser = ParserPython(grammar, debug=True, file=sys.stdout) + out, err = capsys.readouterr() + + parser.dprint('this is stdout') + out, err = capsys.readouterr() + assert out == 'this is stdout\n' + assert err == '' + + # Now use stderr + parser = ParserPython(grammar, debug=False, file=sys.stderr) + out, err = capsys.readouterr() + + parser.dprint('this is stderr') + out, err = capsys.readouterr() + assert out == '' + assert err == 'this is stderr\n' diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parser_resilience.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parser_resilience.py new file mode 100644 index 0000000..a7926d7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parser_resilience.py @@ -0,0 +1,12 @@ +# coding=utf-8 +from __future__ import unicode_literals, absolute_import +from arpeggio import ParserPython, EOF +import pytest + + +def test_parser_resilience(): + """Tests that arpeggio parsers recover successfully from failure.""" + parser = ParserPython(('findme', EOF)) + with pytest.raises(TypeError): + parser.parse(map) + assert parser.parse(' findme ') is not None diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parsing_expressions.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parsing_expressions.py new file mode 100644 index 0000000..aea723a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_parsing_expressions.py @@ -0,0 +1,397 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_parsing_expressions +# Purpose: Test for parsing expressions. +# Author: Igor R. Dejanović +# Copyright: (c) 2014-2017 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest +from arpeggio import ParserPython, UnorderedGroup, ZeroOrMore, OneOrMore, \ + NoMatch, EOF, Optional, And, Not, StrMatch, RegExMatch + + +def test_sequence(): + + def grammar(): + return ("a", "b", "c") + + parser = ParserPython(grammar) + + parsed = parser.parse("a b c") + + assert str(parsed) == "a | b | c" + assert repr(parsed) == "[ 'a' [0], 'b' [2], 'c' [4] ]" + + +def test_ordered_choice(): + + def grammar(): + return ["a", "b", "c"], EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("b") + + assert str(parsed) == "b | " + assert repr(parsed) == "[ 'b' [0], EOF [1] ]" + + parsed = parser.parse("c") + assert str(parsed) == "c | " + assert repr(parsed) == "[ 'c' [0], EOF [1] ]" + + with pytest.raises(NoMatch): + parser.parse("ab") + + with pytest.raises(NoMatch): + parser.parse("bb") + + +def test_unordered_group(): + + def grammar(): + return UnorderedGroup("a", "b", "c"), EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("b a c") + + assert str(parsed) == "b | a | c | " + assert repr(parsed) == "[ 'b' [0], 'a' [2], 'c' [4], EOF [5] ]" + + with pytest.raises(NoMatch): + parser.parse("a b a c") + + with pytest.raises(NoMatch): + parser.parse("a c") + + with pytest.raises(NoMatch): + parser.parse("b b a c") + + +def test_unordered_group_with_separator(): + + def grammar(): + return UnorderedGroup("a", "b", "c", sep=StrMatch(",")), EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("b, a , c") + + assert str(parsed) == "b | , | a | , | c | " + assert repr(parsed) == \ + "[ 'b' [0], ',' [1], 'a' [3], ',' [5], 'c' [7], EOF [8] ]" + + with pytest.raises(NoMatch): + parser.parse("a, b, a, c") + + with pytest.raises(NoMatch): + parser.parse("a, c") + + with pytest.raises(NoMatch): + parser.parse("b, b, a, c") + + with pytest.raises(NoMatch): + parser.parse(",a, b, c") + + with pytest.raises(NoMatch): + parser.parse("a, b, c,") + + with pytest.raises(NoMatch): + parser.parse("a, ,b, c") + + +def test_unordered_group_with_optionals(): + + def grammar(): + return UnorderedGroup("a", Optional("b"), "c"), EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("b a c") + assert str(parsed) == "b | a | c | " + + parsed = parser.parse("a c b") + assert str(parsed) == "a | c | b | " + + parsed = parser.parse("a c") + assert str(parsed) == "a | c | " + + with pytest.raises(NoMatch): + parser.parse("a b c b") + + with pytest.raises(NoMatch): + parser.parse("a b ") + + +def test_unordered_group_with_optionals_and_separator(): + + def grammar(): + return UnorderedGroup("a", Optional("b"), "c", sep=","), EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("b, a, c") + assert parsed + + parsed = parser.parse("a, c, b") + assert parsed + + parsed = parser.parse("a, c") + assert parsed + + with pytest.raises(NoMatch): + parser.parse("a, b, c, b") + + with pytest.raises(NoMatch): + parser.parse("a, b ") + + with pytest.raises(NoMatch): + parser.parse("a, c, ") + + with pytest.raises(NoMatch): + parser.parse("a, b c ") + + with pytest.raises(NoMatch): + parser.parse(",a, c ") + + +def test_zero_or_more(): + + def grammar(): + return ZeroOrMore("a"), EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("aaaaaaa") + + assert str(parsed) == "a | a | a | a | a | a | a | " + assert repr(parsed) == "[ 'a' [0], 'a' [1], 'a' [2],"\ + " 'a' [3], 'a' [4], 'a' [5], 'a' [6], EOF [7] ]" + + parsed = parser.parse("") + + assert str(parsed) == "" + assert repr(parsed) == "[ EOF [0] ]" + + with pytest.raises(NoMatch): + parser.parse("bbb") + + +def test_zero_or_more_with_separator(): + + def grammar(): + return ZeroOrMore("a", sep=","), EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("a, a , a , a , a,a, a") + + assert str(parsed) == \ + "a | , | a | , | a | , | a | , | a | , | a | , | a | " + assert repr(parsed) == \ + "[ 'a' [0], ',' [1], 'a' [3], ',' [5], 'a' [7], ',' [9], "\ + "'a' [11], ',' [13], 'a' [16], ',' [17], 'a' [18], ',' [19],"\ + " 'a' [21], EOF [22] ]" + + parsed = parser.parse("") + + assert str(parsed) == "" + assert repr(parsed) == "[ EOF [0] ]" + + with pytest.raises(NoMatch): + parser.parse("aa a") + + with pytest.raises(NoMatch): + parser.parse(",a,a ,a") + + with pytest.raises(NoMatch): + parser.parse("a,a ,a,") + + with pytest.raises(NoMatch): + parser.parse("bbb") + + +def test_zero_or_more_with_optional_separator(): + + def grammar(): + return ZeroOrMore("a", sep=RegExMatch(",?")), EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("a, a , a a , a,a, a") + + assert str(parsed) == \ + "a | , | a | , | a | a | , | a | , | a | , | a | " + assert repr(parsed) == \ + "[ 'a' [0], ',' [1], 'a' [3], ',' [5], 'a' [7], "\ + "'a' [11], ',' [13], 'a' [16], ',' [17], 'a' [18], ',' [19],"\ + " 'a' [21], EOF [22] ]" + + parsed = parser.parse("") + + assert str(parsed) == "" + assert repr(parsed) == "[ EOF [0] ]" + + parser.parse("aa a") + + with pytest.raises(NoMatch): + parser.parse(",a,a ,a") + + with pytest.raises(NoMatch): + parser.parse("a,a ,a,") + + with pytest.raises(NoMatch): + parser.parse("bbb") + + +def test_one_or_more(): + + def grammar(): + return OneOrMore("a"), "b" + + parser = ParserPython(grammar) + + parsed = parser.parse("aaaaaa a b") + + assert str(parsed) == "a | a | a | a | a | a | a | b" + assert repr(parsed) == "[ 'a' [0], 'a' [1], 'a' [2],"\ + " 'a' [3], 'a' [4], 'a' [5], 'a' [7], 'b' [10] ]" + + parser.parse("ab") + + with pytest.raises(NoMatch): + parser.parse("") + + with pytest.raises(NoMatch): + parser.parse("b") + + +def test_one_or_more_with_separator(): + + def grammar(): + return OneOrMore("a", sep=","), "b" + + parser = ParserPython(grammar) + + parsed = parser.parse("a, a, a, a b") + + assert str(parsed) == "a | , | a | , | a | , | a | b" + assert repr(parsed) == \ + "[ 'a' [0], ',' [1], 'a' [3], ',' [4], 'a' [6], ',' [7], "\ + "'a' [9], 'b' [12] ]" + + parser.parse("a b") + + with pytest.raises(NoMatch): + parser.parse("") + + with pytest.raises(NoMatch): + parser.parse("b") + + with pytest.raises(NoMatch): + parser.parse("a a b") + + with pytest.raises(NoMatch): + parser.parse("a a, b") + + with pytest.raises(NoMatch): + parser.parse(", a, a b") + + +def test_one_or_more_with_optional_separator(): + + def grammar(): + return OneOrMore("a", sep=RegExMatch(",?")), "b" + + parser = ParserPython(grammar) + + parsed = parser.parse("a, a a, a b") + + assert str(parsed) == "a | , | a | a | , | a | b" + assert repr(parsed) == \ + "[ 'a' [0], ',' [1], 'a' [3], 'a' [6], ',' [7], "\ + "'a' [9], 'b' [12] ]" + + parser.parse("a b") + + with pytest.raises(NoMatch): + parser.parse("") + + with pytest.raises(NoMatch): + parser.parse("b") + + with pytest.raises(NoMatch): + parser.parse("a a, b") + + with pytest.raises(NoMatch): + parser.parse(", a, a b") + + +def test_optional(): + + def grammar(): + return Optional("a"), "b", EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("ab") + + assert str(parsed) == "a | b | " + assert repr(parsed) == "[ 'a' [0], 'b' [1], EOF [2] ]" + + parsed = parser.parse("b") + + assert str(parsed) == "b | " + assert repr(parsed) == "[ 'b' [0], EOF [1] ]" + + with pytest.raises(NoMatch): + parser.parse("aab") + + with pytest.raises(NoMatch): + parser.parse("") + + +# Syntax predicates + +def test_and(): + + def grammar(): + return "a", And("b"), ["c", "b"], EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("ab") + assert str(parsed) == "a | b | " + assert repr(parsed) == "[ 'a' [0], 'b' [1], EOF [2] ]" + + # 'And' will try to match 'b' and fail so 'c' will never get matched + with pytest.raises(NoMatch): + parser.parse("ac") + + # 'And' will not consume 'b' from the input so second 'b' will never match + with pytest.raises(NoMatch): + parser.parse("abb") + + +def test_not(): + + def grammar(): + return "a", Not("b"), ["b", "c"], EOF + + parser = ParserPython(grammar) + + parsed = parser.parse("ac") + + assert str(parsed) == "a | c | " + assert repr(parsed) == "[ 'a' [0], 'c' [1], EOF [2] ]" + + # Not will will fail on 'b' + with pytest.raises(NoMatch): + parser.parse("ab") + + # And will not consume 'c' from the input so 'b' will never match + with pytest.raises(NoMatch): + parser.parse("acb") diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_pathologic_models.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_pathologic_models.py new file mode 100644 index 0000000..f5d89c9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_pathologic_models.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_pathologic_models +# Purpose: Test for grammar models that could lead to infinite loops are +# handled properly. +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### +from __future__ import unicode_literals +import pytest + +from arpeggio import ZeroOrMore, Optional, ParserPython, NoMatch, EOF + + +def test_optional_inside_zeroormore(): + """ + Test optional match inside a zero or more. + Optional should always succeed thus inducing ZeroOrMore + to try the match again. + Arpeggio handle this case. + """ + def grammar(): + return ZeroOrMore(Optional('a')), EOF + + parser = ParserPython(grammar) + + with pytest.raises(NoMatch): + # This could lead to infinite loop + parser.parse('b') diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_peg_parser.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_peg_parser.py new file mode 100644 index 0000000..37a2293 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_peg_parser.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_peg_parser +# Purpose: Test for parser constructed using PEG textual grammars. +# Author: Igor R. Dejanović +# Copyright: (c) 2014-2017 Igor R. Dejanović +# License: MIT License +####################################################################### +import pytest # noqa +from arpeggio import Sequence, NonTerminal, NoMatch +from arpeggio.peg import ParserPEG +from arpeggio.cleanpeg import ParserPEG as ParserPEGClean + +grammar = r''' + // This is a comment + number <- r'\d*\.\d*|\d+'; + factor <- ("+" / "-")? + (number / "(" expression ")"); + // This is another comment + term <- factor (( "*" / "/") factor)*; + expression <- term (("+" / "-") term)*; + calc <- expression+ EOF; + // And final comment at the end of file +''' + +clean_grammar = grammar.replace('<-', '=').replace(';', '') + +@pytest.mark.parametrize('parser', [ParserPEG(grammar, 'calc'), + ParserPEGClean(clean_grammar, 'calc')]) +def test_construct_parser(parser): + assert parser.parser_model.rule_name == 'calc' + assert isinstance(parser.parser_model, Sequence) + assert parser.parser_model.nodes[0].name == 'OneOrMore' + + +@pytest.mark.parametrize('parser', [ParserPEG(grammar, 'calc'), + ParserPEGClean(clean_grammar, 'calc')]) +def test_parse_input(parser): + + input = "4+5*7/3.45*-45*(2.56+32)/-56*(2-1.34)" + result = parser.parse(input) + + assert isinstance(result, NonTerminal) + assert str(result) == "4 | + | 5 | * | 7 | / | 3.45 | * | - | 45 | * | ( | 2.56 | + | 32 | ) | / | - | 56 | * | ( | 2 | - | 1.34 | ) | " # noqa + assert repr(result) == "[ [ [ [ number '4' [0] ] ], '+' [1], [ [ number '5' [2] ], '*' [3], [ number '7' [4] ], '/' [5], [ number '3.45' [6] ], '*' [10], [ '-' [11], number '45' [12] ], '*' [14], [ '(' [15], [ [ [ number '2.56' [16] ] ], '+' [20], [ [ number '32' [21] ] ] ], ')' [23] ], '/' [24], [ '-' [25], number '56' [26] ], '*' [28], [ '(' [29], [ [ [ number '2' [30] ] ], '-' [31], [ [ number '1.34' [32] ] ] ], ')' [36] ] ] ], EOF [37] ]" # noqa + + +@pytest.mark.parametrize('parser', + [ParserPEG(grammar, 'calc', reduce_tree=True), + ParserPEGClean(clean_grammar, 'calc', + reduce_tree=True)]) +def test_reduce_tree(parser): + + input = "4+5*7/3.45*-45*(2.56+32)/-56*(2-1.34)" + result = parser.parse(input) + + assert isinstance(result, NonTerminal) + + assert str(result) == "4 | + | 5 | * | 7 | / | 3.45 | * | - | 45 | * | ( | 2.56 | + | 32 | ) | / | - | 56 | * | ( | 2 | - | 1.34 | ) | " # noqa + assert repr(result) == "[ [ number '4' [0], '+' [1], [ number '5' [2], '*' [3], number '7' [4], '/' [5], number '3.45' [6], '*' [10], [ '-' [11], number '45' [12] ], '*' [14], [ '(' [15], [ number '2.56' [16], '+' [20], number '32' [21] ], ')' [23] ], '/' [24], [ '-' [25], number '56' [26] ], '*' [28], [ '(' [29], [ number '2' [30], '-' [31], number '1.34' [32] ], ')' [36] ] ] ], EOF [37] ]" # noqa + + +def test_unordered_group(): + + grammar = """ + g <- (("a" "b") "c" )#; + """ + + parser = ParserPEG(grammar, 'g', reduce_tree=True) + + r = parser.parse("c a b") + assert isinstance(r, NonTerminal) + + r = parser.parse("a b c") + assert isinstance(r, NonTerminal) + + with pytest.raises(NoMatch): + parser.parse("a c b") diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_position.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_position.py new file mode 100644 index 0000000..9b98a17 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_position.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_position +# Purpose: Test that positions in the input stream are properly calculated. +# Author: Igor R. Dejanović +# Copyright: (c) 2015-2017 Igor R. Dejanović +# License: MIT License +####################################################################### +from __future__ import unicode_literals +import pytest +from arpeggio import ParserPython + + +@pytest.fixture +def parse_tree(): + + def grammar(): return ("first", "second", "third") + + parser = ParserPython(grammar) + + return parser.parse(" first \n\n second third") + + +def test_position(parse_tree): + assert parse_tree[0].position == 3 + assert parse_tree[1].position == 13 + assert parse_tree[2].position == 22 + assert parse_tree.position == 3 + + +def test_position_end(parse_tree): + assert parse_tree[0].position_end == 8 + assert parse_tree[1].position_end == 19 + assert parse_tree[2].position_end == 27 + assert parse_tree.position_end == 27 + + +def test_pos_to_linecol(): + + def grammar(): return ("a", "b", "c") + + parser = ParserPython(grammar) + + parse_tree = parser.parse("a\n\n\n b\nc") + + a_pos = parse_tree[0].position + assert parser.pos_to_linecol(a_pos) == (1, 1) + b_pos = parse_tree[1].position + assert parser.pos_to_linecol(b_pos) == (4, 2) + c_pos = parse_tree[2].position + assert parser.pos_to_linecol(c_pos) == (5, 1) diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_ptnode_navigation_expressions.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_ptnode_navigation_expressions.py new file mode 100644 index 0000000..b756e19 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_ptnode_navigation_expressions.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_ptnode_navigation_expressions +# Purpose: Test ParseTreeNode navigation expressions. +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest # noqa + +# Grammar +from arpeggio import ParserPython, ZeroOrMore, ParseTreeNode, NonTerminal + + +def foo(): return "a", bar, "b", baz, bar2, ZeroOrMore(bar) +def bar(): return [bla, bum], baz, "c" +def bar2():return ZeroOrMore(bla) +def baz(): return "d" +def bla(): return "bla" +def bum(): return ["bum", "bam"] + + +def test_lookup_single(): + + parser = ParserPython(foo, reduce_tree=False) + + result = parser.parse("a bum d c b d bla bum d c") + + # Uncomment following line to visualize the parse tree in graphviz + # PTDOTExporter().exportFile(result, 'test_ptnode_navigation_expressions.dot') + + assert isinstance(result, ParseTreeNode) + assert isinstance(result.bar, NonTerminal) + # dot access + assert result.bar.rule_name == 'bar' + # Index access + assert result[1].rule_name == 'bar' + + # There are six children from result + assert len(result) == 6 + + # There is two bar matched from result (at the begging and from ZeroOrMore) + # Dot access collect all NTs from the given path + assert len(result.bar) == 2 + # Verify position + assert result.bar[0].position == 2 + assert result.bar[1].position == 18 + + # Multilevel dot access returns all elements from all previous ones. + # For example this returns all bum from all bar in result + assert len(result.bar.bum) == 2 + # Verify that proper bum are returned + assert result.bar.bum[0].rule_name == 'bum' + assert result.bar.bum[1].position == 18 + + # Access to terminal + assert result.bar.bum[-1][0].value == 'bum' + assert result.bar2.bla[0].value == 'bla' + + # The same for all bla from all bar2 + assert len(result.bar2.bla) == 1 + + assert hasattr(result, "bar") + assert hasattr(result, "baz") + + # Test that accessing an invalid rule name raises AttributeError + with pytest.raises(AttributeError): + result.unexisting diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_python_parser.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_python_parser.py new file mode 100644 index 0000000..7db6484 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_python_parser.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_python_parser +# Purpose: Test for parser constructed using Python-based grammars. +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest # noqa + +# Grammar +from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF, ParserPython,\ + Sequence, NonTerminal +from arpeggio import RegExMatch as _ + + +def number(): return _(r'\d*\.\d*|\d+') +def factor(): return Optional(["+", "-"]), [number, + ("(", expression, ")")] +def term(): return factor, ZeroOrMore(["*", "/"], factor) +def expression(): return term, ZeroOrMore(["+", "-"], term) +def calc(): return OneOrMore(expression), EOF + + +def test_pp_construction(): + ''' + Tests parser construction from python internal DSL description. + ''' + parser = ParserPython(calc) + + assert parser.parser_model.rule_name == 'calc' + assert isinstance(parser.parser_model, Sequence) + assert parser.parser_model.nodes[0].desc == 'OneOrMore' + + +def test_parse_input(): + + parser = ParserPython(calc) + input = "4+5*7/3.45*-45*(2.56+32)/-56*(2-1.34)" + result = parser.parse(input) + + assert isinstance(result, NonTerminal) + assert str(result) == "4 | + | 5 | * | 7 | / | 3.45 | * | - | 45 | * | ( | 2.56 | + | 32 | ) | / | - | 56 | * | ( | 2 | - | 1.34 | ) | " + assert repr(result) == "[ [ [ [ number '4' [0] ] ], '+' [1], [ [ number '5' [2] ], '*' [3], [ number '7' [4] ], '/' [5], [ number '3.45' [6] ], '*' [10], [ '-' [11], number '45' [12] ], '*' [14], [ '(' [15], [ [ [ number '2.56' [16] ] ], '+' [20], [ [ number '32' [21] ] ] ], ')' [23] ], '/' [24], [ '-' [25], number '56' [26] ], '*' [28], [ '(' [29], [ [ [ number '2' [30] ] ], '-' [31], [ [ number '1.34' [32] ] ] ], ')' [36] ] ] ], EOF [37] ]" + diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_reduce_tree.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_reduce_tree.py new file mode 100644 index 0000000..c132389 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_reduce_tree.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_reduce_tree +# Purpose: Test parse tree reduction +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest # noqa + +# Grammar +from arpeggio import ZeroOrMore, OneOrMore, ParserPython, Terminal, NonTerminal +from arpeggio import RegExMatch as _ + + +def grammar(): return first, "a", second, [first, second] +def first(): return [fourth, third], ZeroOrMore(third) +def second(): return OneOrMore(third), "b" +def third(): return [third_str, fourth] +def third_str(): return "3" +def fourth(): return _(r'\d+') + + +def test_reduce_tree(): + + input = "34 a 3 3 b 3 b" + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse(input) + +# PTDOTExporter().exportFile(result, 'test_reduce_tree_pt.dot') + + assert result[0].rule_name == 'first' + assert isinstance(result[0], NonTerminal) + assert result[3].rule_name == 'first' + assert result[0][0].rule_name == 'fourth' + # Check reduction for direct OrderedChoice + assert result[2][0].rule_name == 'third' + + parser = ParserPython(grammar, reduce_tree=True) + result = parser.parse(input) + + # PTDOTExporter().exportFile(result, 'test_reduce_tree_pt.dot') + + assert result[0].rule_name == 'fourth' + assert isinstance(result[0], Terminal) + assert result[3].rule_name == 'fourth' + # Check reduction for direct OrderedChoice + assert result[2][0].rule_name == 'third_str' diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_semantic_action_results.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_semantic_action_results.py new file mode 100644 index 0000000..f23d493 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_semantic_action_results.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_semantic_action_results +# Purpose: Tests semantic action results passed to first_pass call +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest # noqa + +# Grammar +from arpeggio import ZeroOrMore, OneOrMore, ParserPython, \ + SemanticActionResults, PTNodeVisitor, visit_parse_tree +from arpeggio.export import PTDOTExporter +from arpeggio import RegExMatch as _ + + +def grammar(): return first, "a", second +def first(): return [fourth, third], ZeroOrMore(third) +def second(): return OneOrMore(third), "b" +def third(): return [third_str, fourth] +def third_str(): return "3" +def fourth(): return _(r'\d+') + + +first_sar = None +third_sar = None + + +class Visitor(PTNodeVisitor): + def visit_first(self, node, children): + global first_sar + first_sar = children + + def visit_third(self, node, children): + global third_sar + third_sar = children + + return 1 + + +def test_semantic_action_results(): + + global first_sar, third_sar + + input = "4 3 3 3 a 3 3 b" + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse(input) + + PTDOTExporter().exportFile(result, 'test_semantic_action_results_pt.dot') + + visit_parse_tree(result, Visitor()) + + assert isinstance(first_sar, SemanticActionResults) + assert len(first_sar.third) == 3 + assert third_sar.third_str[0] == '3' diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_separators.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_separators.py new file mode 100644 index 0000000..acc6c0a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_separators.py @@ -0,0 +1,61 @@ +from __future__ import unicode_literals +import pytest # noqa + +# Grammar +from arpeggio import ZeroOrMore, OneOrMore, UnorderedGroup, \ + ParserPython, NoMatch, EOF + + +def test_zeroormore_with_separator(): + + def grammar(): + return ZeroOrMore(['a', 'b'], sep=','), EOF + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse('a, b, b, b, a') + assert result + + with pytest.raises(NoMatch): + parser.parse('a, b a') + + +def test_oneormore_with_ordered_choice_separator(): + + def grammar(): + return OneOrMore(['a', 'b'], sep=[',', ';']), EOF + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse('a, a; a, b, a; a') + assert result + + with pytest.raises(NoMatch): + parser.parse('a, b a') + + with pytest.raises(NoMatch): + parser.parse('a, b: a') + + +def test_unordered_group_with_separator(): + + def grammar(): + return UnorderedGroup('a', 'b', 'c', sep=[',', ';']), EOF + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse('b , a, c') + assert result + result = parser.parse('b , c; a') + assert result + + # Check separator matching + with pytest.raises(NoMatch): + parser.parse('a, b c') + + with pytest.raises(NoMatch): + parser.parse('a, c: a') + + # Each element must be matched exactly once + with pytest.raises(NoMatch): + parser.parse('a, b, b; c') + + with pytest.raises(NoMatch): + parser.parse('a, c') diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_sequence_params.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_sequence_params.py new file mode 100644 index 0000000..5b06771 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_sequence_params.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_sequence_params +# Purpose: Test Sequence expression parameters. +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest +from arpeggio import ParserPython, NoMatch, Sequence + + +def test_skipws(): + """ + skipws may be defined per Sequence. + """ + + def grammar(): + return Sequence("one", "two", "three"), "four" + + parser = ParserPython(grammar) + + # By default, skipws is True and whitespaces will be skipped. + parser.parse("one two three four") + + def grammar(): + return Sequence("one", "two", "three", skipws=False), "four" + + parser = ParserPython(grammar) + + # If we disable skipws for sequence only then whitespace + # skipping should not be done inside sequence. + with pytest.raises(NoMatch): + parser.parse("one two three four") + + # But it will be done outside of it + parser.parse("onetwothree four") + + +def test_ws(): + """ + ws can be changed per Sequence. + """ + + def grammar(): + return Sequence("one", "two", "three"), "four" + + parser = ParserPython(grammar) + + # By default, ws consists of space, tab and newline + # So this should parse. + parser.parse("""one + two three four""") + + def grammar(): + return Sequence("one", "two", "three", ws=' '), "four" + + parser = ParserPython(grammar) + + # If we change ws per sequence and set it to space only + # given input will raise exception + with pytest.raises(NoMatch): + parser.parse("""one + two three four""") + + # But ws will be default outside of sequence + parser.parse("""one two three + four""") + + # Test for ws with more than one char. + def grammar(): + return Sequence("one", "two", "three", ws=' \t'), "four" + + parser = ParserPython(grammar) + + # If we change ws per sequence and set it to spaces and tabs + # given input will raise exception + with pytest.raises(NoMatch): + parser.parse("one two \nthree \t four") + + # But ws will be default outside of sequence + parser.parse("one two three \n\t four") + + # Inside sequence a spaces and tabs will be skipped + parser.parse("one \t two\t three \nfour") diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_suppression.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_suppression.py new file mode 100644 index 0000000..62bf2b2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_suppression.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_suppression +# Purpose: Test suppresion of parse tree nodes. +# Author: Igor R. Dejanović +# Copyright: (c) 2016 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest # noqa +from arpeggio import ParserPython, Sequence, StrMatch, RegExMatch + + +def test_sequence_suppress(): + """ + """ + + def grammar(): + return Sequence("one", "two", "three", suppress=True), "four" + + parser = ParserPython(grammar) + + result = parser.parse("one two three four") + assert result[0] == "four" + + +def test_suppress_string_match(): + """ + Test that string matches with suppress=True do not produce parse tree + nodes. + """ + + class SuppressStrMatch(StrMatch): + suppress = True + + def grammar(): + return "one", "two", SuppressStrMatch("three"), "four" + + parser = ParserPython(grammar) + + result = parser.parse("one two three four") + assert len(result) == 3 + assert result[1] == "two" + assert result[2] == "four" + + +def test_register_syntax_classes_suppress(): + """ + Test suppressing by overriding special syntax forms (lists - OrderedChoice, + tuples - Sequences and string - StrMatch). + """ + + class SuppressStrMatch(StrMatch): + suppress = True + + def grammar(): + return "one", "two", RegExMatch(r'\d+'), "three" + + parser = ParserPython(grammar, + syntax_classes={'StrMatch': SuppressStrMatch}) + + result = parser.parse("one two 42 three") + + # Only regex will end up in the tree + assert len(result) == 1 + assert result[0] == "42" diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_unicode.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_unicode.py new file mode 100644 index 0000000..7e6be10 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_unicode.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_unicode +# Purpose: Tests matching unicode characters +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest # noqa + +# Grammar +from arpeggio import ParserPython + +def grammar(): return first, "±", second +def first(): return "♪" +def second(): return "a" + + +def test_unicode_match(): + parser = ParserPython(grammar) + + parse_tree = parser.parse("♪ ± a") + assert parse_tree diff --git a/myenv/lib/python3.12/site-packages/arpeggio/tests/test_visitor.py b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_visitor.py new file mode 100644 index 0000000..045c655 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/tests/test_visitor.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_semantic_action_results +# Purpose: Tests semantic actions based on visitor +# Author: Igor R. Dejanović +# Copyright: (c) 2014 Igor R. Dejanović +# License: MIT License +####################################################################### + +from __future__ import unicode_literals +import pytest # noqa + +# Grammar +from arpeggio import ZeroOrMore, OneOrMore, ParserPython,\ + PTNodeVisitor, visit_parse_tree, SemanticActionResults +from arpeggio.export import PTDOTExporter +from arpeggio import RegExMatch as _ + +def grammar(): return first, "a", second +def first(): return [fourth, third], ZeroOrMore(third) +def second(): return OneOrMore(third), "b" +def third(): return [third_str, fourth] +def third_str(): return "3" +def fourth(): return _(r'\d+') + + +first_sar = None +third_sar = None + + +class Visitor(PTNodeVisitor): + + def visit_first(self, node, children): + global first_sar + first_sar = children + + def visit_third(self, node, children): + global third_sar + third_sar = children + + return 1 + + +def test_semantic_action_results(): + + global first_sar, third_sar + + input = "4 3 3 3 a 3 3 b" + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse(input) + + PTDOTExporter().exportFile(result, 'test_semantic_action_results_pt.dot') + + visit_parse_tree(result, Visitor(defaults=True)) + + assert isinstance(first_sar, SemanticActionResults) + assert len(first_sar.third) == 3 + assert third_sar.third_str[0] == '3' diff --git a/myenv/lib/python3.12/site-packages/arpeggio/utils.py b/myenv/lib/python3.12/site-packages/arpeggio/utils.py new file mode 100644 index 0000000..93905ea --- /dev/null +++ b/myenv/lib/python3.12/site-packages/arpeggio/utils.py @@ -0,0 +1,14 @@ +""" +Various utilities. +""" + +# isstr check if object is of string type. +# This works for both python 2 and 3 +# Taken from http://stackoverflow.com/questions/11301138/how-to-check-if-variable-is-string-with-python-2-and-3-compatibility +try: + basestring # attempt to evaluate basestring + def isstr(s): + return isinstance(s, basestring) +except NameError: + def isstr(s): + return isinstance(s, str) \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/attr/__init__.py b/myenv/lib/python3.12/site-packages/attr/__init__.py new file mode 100644 index 0000000..51b1c25 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/__init__.py @@ -0,0 +1,103 @@ +# SPDX-License-Identifier: MIT + +""" +Classes Without Boilerplate +""" + +from functools import partial +from typing import Callable + +from . import converters, exceptions, filters, setters, validators +from ._cmp import cmp_using +from ._compat import Protocol +from ._config import get_run_validators, set_run_validators +from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types +from ._make import ( + NOTHING, + Attribute, + Converter, + Factory, + attrib, + attrs, + fields, + fields_dict, + make_class, + validate, +) +from ._next_gen import define, field, frozen, mutable +from ._version_info import VersionInfo + + +s = attributes = attrs +ib = attr = attrib +dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) + + +class AttrsInstance(Protocol): + pass + + +__all__ = [ + "Attribute", + "AttrsInstance", + "Converter", + "Factory", + "NOTHING", + "asdict", + "assoc", + "astuple", + "attr", + "attrib", + "attributes", + "attrs", + "cmp_using", + "converters", + "define", + "evolve", + "exceptions", + "field", + "fields", + "fields_dict", + "filters", + "frozen", + "get_run_validators", + "has", + "ib", + "make_class", + "mutable", + "resolve_types", + "s", + "set_run_validators", + "setters", + "validate", + "validators", +] + + +def _make_getattr(mod_name: str) -> Callable: + """ + Create a metadata proxy for packaging information that uses *mod_name* in + its warnings and errors. + """ + + def __getattr__(name: str) -> str: + if name not in ("__version__", "__version_info__"): + msg = f"module {mod_name} has no attribute {name}" + raise AttributeError(msg) + + try: + from importlib.metadata import metadata + except ImportError: + from importlib_metadata import metadata + + meta = metadata("attrs") + + if name == "__version_info__": + return VersionInfo._from_version_string(meta["version"]) + + return meta["version"] + + return __getattr__ + + +__getattr__ = _make_getattr(__name__) diff --git a/myenv/lib/python3.12/site-packages/attr/__init__.pyi b/myenv/lib/python3.12/site-packages/attr/__init__.pyi new file mode 100644 index 0000000..6ae0a83 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/__init__.pyi @@ -0,0 +1,388 @@ +import enum +import sys + +from typing import ( + Any, + Callable, + Generic, + Mapping, + Protocol, + Sequence, + TypeVar, + overload, +) + +# `import X as X` is required to make these public +from . import converters as converters +from . import exceptions as exceptions +from . import filters as filters +from . import setters as setters +from . import validators as validators +from ._cmp import cmp_using as cmp_using +from ._typing_compat import AttrsInstance_ +from ._version_info import VersionInfo +from attrs import ( + define as define, + field as field, + mutable as mutable, + frozen as frozen, + _EqOrderType, + _ValidatorType, + _ConverterType, + _ReprArgType, + _OnSetAttrType, + _OnSetAttrArgType, + _FieldTransformer, + _ValidatorArgType, +) + +if sys.version_info >= (3, 10): + from typing import TypeGuard +else: + from typing_extensions import TypeGuard + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +__version__: str +__version_info__: VersionInfo +__title__: str +__description__: str +__url__: str +__uri__: str +__author__: str +__email__: str +__license__: str +__copyright__: str + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_FilterType = Callable[["Attribute[_T]", _T], bool] + +# We subclass this here to keep the protocol's qualified name clean. +class AttrsInstance(AttrsInstance_, Protocol): + pass + +_A = TypeVar("_A", bound=type[AttrsInstance]) + +class _Nothing(enum.Enum): + NOTHING = enum.auto() + +NOTHING = _Nothing.NOTHING + +# NOTE: Factory lies about its return type to make this possible: +# `x: List[int] # = Factory(list)` +# Work around mypy issue #4554 in the common case by using an overload. +if sys.version_info >= (3, 8): + from typing import Literal + @overload + def Factory(factory: Callable[[], _T]) -> _T: ... + @overload + def Factory( + factory: Callable[[Any], _T], + takes_self: Literal[True], + ) -> _T: ... + @overload + def Factory( + factory: Callable[[], _T], + takes_self: Literal[False], + ) -> _T: ... + +else: + @overload + def Factory(factory: Callable[[], _T]) -> _T: ... + @overload + def Factory( + factory: Union[Callable[[Any], _T], Callable[[], _T]], + takes_self: bool = ..., + ) -> _T: ... + +In = TypeVar("In") +Out = TypeVar("Out") + +class Converter(Generic[In, Out]): + @overload + def __init__(self, converter: Callable[[In], Out]) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance, Attribute], Out], + *, + takes_self: Literal[True], + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, Attribute], Out], + *, + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance], Out], + *, + takes_self: Literal[True], + ) -> None: ... + +class Attribute(Generic[_T]): + name: str + default: _T | None + validator: _ValidatorType[_T] | None + repr: _ReprArgType + cmp: _EqOrderType + eq: _EqOrderType + order: _EqOrderType + hash: bool | None + init: bool + converter: _ConverterType | Converter[Any, _T] | None + metadata: dict[Any, Any] + type: type[_T] | None + kw_only: bool + on_setattr: _OnSetAttrType + alias: str | None + + def evolve(self, **changes: Any) -> "Attribute[Any]": ... + +# NOTE: We had several choices for the annotation to use for type arg: +# 1) Type[_T] +# - Pros: Handles simple cases correctly +# - Cons: Might produce less informative errors in the case of conflicting +# TypeVars e.g. `attr.ib(default='bad', type=int)` +# 2) Callable[..., _T] +# - Pros: Better error messages than #1 for conflicting TypeVars +# - Cons: Terrible error messages for validator checks. +# e.g. attr.ib(type=int, validator=validate_str) +# -> error: Cannot infer function type argument +# 3) type (and do all of the work in the mypy plugin) +# - Pros: Simple here, and we could customize the plugin with our own errors. +# - Cons: Would need to write mypy plugin code to handle all the cases. +# We chose option #1. + +# `attr` lies about its return type to make the following possible: +# attr() -> Any +# attr(8) -> int +# attr(validator=) -> Whatever the callable expects. +# This makes this type of assignments possible: +# x: int = attr(8) +# +# This form catches explicit None or no default but with no other arguments +# returns Any. +@overload +def attrib( + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def attrib( + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def attrib( + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def attrib( + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: object = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: _C, + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> _C: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: None = ..., + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> Callable[[_C], _C]: ... +def fields(cls: type[AttrsInstance]) -> Any: ... +def fields_dict(cls: type[AttrsInstance]) -> dict[str, Attribute[Any]]: ... +def validate(inst: AttrsInstance) -> None: ... +def resolve_types( + cls: _A, + globalns: dict[str, Any] | None = ..., + localns: dict[str, Any] | None = ..., + attribs: list[Attribute[Any]] | None = ..., + include_extras: bool = ..., +) -> _A: ... + +# TODO: add support for returning a proper attrs class from the mypy plugin +# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', +# [attr.ib()])` is valid +def make_class( + name: str, + attrs: list[str] | tuple[str, ...] | dict[str, Any], + bases: tuple[type, ...] = ..., + class_body: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + collect_by_mro: bool = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., +) -> type: ... + +# _funcs -- + +# TODO: add support for returning TypedDict from the mypy plugin +# FIXME: asdict/astuple do not honor their factory args. Waiting on one of +# these: +# https://github.com/python/mypy/issues/4236 +# https://github.com/python/typing/issues/253 +# XXX: remember to fix attrs.asdict/astuple too! +def asdict( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + dict_factory: type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., + value_serializer: Callable[[type, Attribute[Any], Any], Any] | None = ..., + tuple_keys: bool | None = ..., +) -> dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + tuple_factory: type[Sequence[Any]] = ..., + retain_collection_types: bool = ..., +) -> tuple[Any, ...]: ... +def has(cls: type) -> TypeGuard[type[AttrsInstance]]: ... +def assoc(inst: _T, **changes: Any) -> _T: ... +def evolve(inst: _T, **changes: Any) -> _T: ... + +# _config -- + +def set_run_validators(run: bool) -> None: ... +def get_run_validators() -> bool: ... + +# aliases -- + +s = attributes = attrs +ib = attr = attrib +dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..066dfe890e9bd6dfe38fe13ea6f2b92b6151058f GIT binary patch literal 2664 zcmZWqO>7*u73R#&{_pB%SC(Y!Z!B51SBbT;r6h$D7?7nnQh+Kg?4}4W)6ouBo_IL3 z<#1(5kWsZTPzUJ2m)1tp0zuJ33-^%Taw?E>FG|%SE)l~4dMI*}BL@k5>U$im)Vc)r z<0JX_hVSp&zn04d0;3$hvw9{+$iHyW8R-LI|Dr+2J>n5cJi{{sgPYVeP)-FYZcz(l z%S#7oo}n3@rCFY%Ii9C^UZ4eimI;cyL`z!E24&twyR@7Ox_J-n;k~q1uk%5LS80{^ z(LR2R9^?JApAXOhK1c`kc_BE?PtX&5hz{{#I?PAt2p^@Re2k89o7(&&J;}%EIG>;s zTE7^a;*)fepQfkz8G44FrDyeiDX8%&I%Nq-e4{1M`5h8O+V0^*_g@Xbj=NX&y|sg!BD=zTTVOn!&S8UJrT*M5d}3< zRaTjFL_2hj)Kvv+JhxZNsEiwXenYA>cn~#I){SMm6)=@yYf-SqRO-4LtFmA*t{l11 zVsWjYvdeE@TU=UxQ|0HR6#hzEGL@h2IH9sv+y*>x1FY*~unu#qGEJWaUaX4A?C38S zxO;;+4Gf{m9lV#-ES2$C(+`a6EN@GU9e7-P2Lc9xS_+%dHCUJ2wv3$Q zlW_y%-Wdl8Bl{)TxknhG1{A!xVL+_P=t8^{#?lQNY`Ky7#kVt7jZ3X?3f7liNm^#vB+kWs7N64851&V{iLkFN6# z7OvF;f2H2qfLaM>rq5rf$G&9eT5jWpyUOA^zQ67`e&|cbnQm=})9@h;r$C6YZ*P-_ zR!+Ro*{_`x{T*2hpfreZ451sL2cZ{0S!i7xN3oCu3Q`w~6R1!`$RLa%R1mTVHo_3X zFaj_M5hoGK2vq=O`YU1tSK|nMxMjqm3m18WQ3NC-m4krl@T!bpvMs_!CpmCREcjs; z?!O4|bL1sMf|Lx;Jd&H%9nu7jx?Q?uY#CQc&Dv}gY#8%`LEG7`&6#weQ(PM|u)bk8 zBVi{ohIX-iC>g z0=(}3oWQ8;{{`Te#yzqHZmb!i>Y49b9}q9KMLrm(Df~&Ln=Qr@(JMr5#ItL zHp!OhWjd#~;I5awaTcOEC^2DryoY7|+}KKaIm~nC=2giqBh-kkBa8hZnztcZy5;;CU_QP-_CU`W#>j ze)#AZYy(H8#Vj7Cc)TjKF$-^r^RTJg3d?6(VCA95K%wXc_&4roiaOYsem#g9ZV+FZ z{x6-YXk!!L+imi&*u67w@zdhPhkZl$7w=!(nSAwQ>!Y=u%B4H=pI7V;tGkuSozmo< zmCDaPD$P8}k)FZ(+1+mYj`amxtxo=}IQe;X^t0;Br`4H{7Ct`y=eKvO3p=HSFS@ID zm)`%$PHyzur@f?S=qqC6XCIel_EIoEi?P9fotZ0;PYT_0!>Lb(3_u8d3f!-m+D$Qs z@5Ge+$W9zB|Br8C9*(|?I@qw_%U-EFJ@%W4Jp$A3C%(pMZ=93{cC3EQKg+dORMv64 zr~#FcZ?;3={V0e9_OQyp-vz{7U{k9DYSDzE8AS7frUc7@|1nKJV5<@FmMaBTv|fcx ze>EW*WD}Kf@FVeayq1s^_FTd}Y3)_QfSMYQSP^?7slg*g)69h)tGpAkbqTo-6B4vh zTXP)}n<^iclqL|YHSrR{G(sKW9DvFr@#w!aP23nF_{(=3aT!%G$l?qFrbA32Xfnsr zdzO1WX{Sr#`>;fYh<^nDNj8ip8Pl-7&Jknu5gGb7x%>}u8H7h<lRqu$cmD@jkiSs? literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed4b68d7d7e468d9ba3603861d0b7e966cb94eec GIT binary patch literal 5111 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 D`DTC| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9437022255aa6949a58587a5b19b44ccaccc15d GIT binary patch literal 91966 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 Le`qW@7_$7o)>ftT literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f40f3ae85ce1361bd5ffecc81654c26c97dfa3c GIT binary patch literal 24608 zcmc(HTWloPnO-&TcXCM1)w+~4V~cE0H>Hs*FGd%Op3&G7*dt+QFN^@2 z@B7a=Rdt#@BMA9Jf0>@1aPXOKe{bV?&vE`cznIS{ee%htIQhV7 zIJccfsWH$jwFYhvl$^$3W2iaU8oE6s=fln6*2wKqIUm9K*zIvSA8k&wCT~x+rfyHQ zrf*NTW^T{4W^d2RZ)455)`{CEO3t{`IN2D_{+nn_Hu!HG|9Hl~Jo3MZ#?((28`D1; zygeVx-(DDSf`MS3zy5sYqd_&}+l#@J+{wEQR6el^c)Ajr` zjjM_0`t64P60Ujfc9?Fujc|QEh=X=I(FoT4PBV4y`pr&|R44wP^Ia}=N4NYq4gKcd zm-P1}NYfxr@Y9H&G{SnyoBSm0Y&C=B;qF51>Z{jQ-}uh0+G{szH($NAdh6EjcSmo$ zcI(^MZ+xpeS6h#xcY}5fP&lmwK=3DA>ki9Tz&iUz+i$lc{2Vk^<+n~6yc)+*eB;)& z<;CuB%2juV;$SQ8PIlUfzaG>!{baK{q>f=bOuNHLGfDwn4cDF84*WZDuwLWk?qHI} z-6_A5Mm05h(jC3CT_f_k6Lr77sR543Ey2BdcOZDDI}8K|7*Z}af;6b7-4h!@nsBOI zkeqZUqHJ~D6YF8nY}C@&Zzt}vwL%UC-&y|7WNkRPJQ6)&+Sj|Pwmg_FYJ%* zpV%MTAKstbU)-PHpWPqWAK4$@FYOQRkF75>N(M@N0(EqEiInIQO&#GH*`bpw8f_fDDX%s8w@*9oBy$oJxUG^HC zHgMy%f^;)#kk#tAwGp;A+%ysx`aZ!&;=U+X*HAXA5kt zm>`VWxSv;&m%WPu%af;pzh;gH%#3adv2HYtGYJ>P@$Pb?qx{M zWsj?_m`6R0+*R=LWmyh6MTE{>T8pCQa(|8C$WQ45eF@Qa@aLnNC~r`d4tw4-g;UyC}a;zxqw2bkIp+@M_tVf>9i9>J(s zd4ofnrEfH&B=O@N+?nEN)^5#Alj~)JW`Zy1oxUi(-cC{u6|K9}(IR{pwM@E|FS=za zO#Tht!I8G0OnsS)OJdC+xVO~=hSTN_ZcY*ilrV{47vPD`TX6^A%bj*JfOhcPJLNJ5 z@5OT1z8f{~g4S9)xX^^)-$37+iEHA9_`d}+LTSMLVfz@Ya=jDNT$MHBEVTl^jg?*` zE93Dp1h$L^H$iiPfckGKI_+EPJ|Ma&4>u4NCxjf z zQDF^p7$V`UlgUV9yOcMHZim5Z*74_ zM9Eq}1!Tc$hIgQipD4&5;6Ths?o?+>V45QpS;ccY=%HqxRY62Lm4KNub zhs@b4$u5=&CkN&^xGYjM6nvAAq!JV0-}S?$Pu7PX_g(Q+G0#5B z^E~=x6iwrJ_D-EkRKtLtW%!ZMHdv`fS~KwP8a096L`F%@UfrX$5B+S5$ki$lW?cdq zZ$v4TFZ_8+r6^q&!ydv`W&TShnLgJKKWDuc98pS&DJ>?p-wodB_{}igF*>^H!kc)z z17Y5d+E2ktXuz&)w|hZBix-!Wd%o_{AHZb;DymmN0>S;R+k}htX7Ba4++8dX)?n8) zKYa(P8^-%h@z|=gWr#PbH(sl~_WD~rZUtOZ178pXTENwUR)GDdRv@|Hg2g0g(Ar8x zx@f+9do3Bg-6hS0U}tKqjW&%DrVi=zys&!DeaU_964if9ju)@h!iopzgyxxN^!KIk zqWk2%CokgZWzSm{1jj)=2=9snz}xU!w!|AZ7Cf7f=fVbk@8q&2W=e_V(>GXH3xIrU zVyy_l9z1Pj`-zx#u&sExhYPQ-yKQ)?Mp2Q$V?TsQ_6~+0h)Zxd!Noz^iQ5XIHL~&v zGD;mE%@@|7hBVX^UqI;r8I;bcI6#P=Lf*9FZpYM@^b)MW;LA(En`Df$6>bGZKZ=SG zOKb+~sc@cJmGK2dx6)t4;;=AsQ$1>fm&k5)a?i9HX^?HKAgb4(a)#5~Hh9q1 zc$sqtr5%C~HOb*`$b&{r78XeKLXRauz}Vrk9R~16kLy6_w;63?K8?GyCvb%P9YJ^< zN+)VzjWU4p~*Bsmn>Kzr(MGg3I0oJOFl>|J6`O+!OK0JAGpOy2JfgjYL(riiy>3S zxf6xHq(usj4$TKArd?g^)BAY=X)_p|b;tcV^jZW)zSdKUbI~S%W z&erEZUXH3}N`AX2cxsBbug*90b%VnV`OTW1#-~ym%2!mzh@Kw*Z|V`mpH&JH4{XX;3&b7g1{)tR>UNd4A8L0);7GnM%DfzkqcGCL2fD;pZ86 zK+uV#s=9@`1KA0!Bqc63D_OA0d9Dph~K; z#hMHnCTxMj5Fin8bo01ixIP`8;dQiUhBeE94~&E!5RONCp)oqqw*x7j%5p;Uq_7<_1IV;aEv`dl z06dj4baJD@M~|6iVg%?ZFeCA>+C-Lu=>&2y9N(w~#~N9YV%D<`DHaQ45-Oq%K<&Cc zX~QI#gif6>fLIdKpb|H51&X0O7815vom2>gz`(Z6dSVz9^^gX`o%J{f;DKP-TXD1z z`>o9FT&CAg$CM19&7Fl%EU)Ui-=wlqp5`$_5l%XRQiGS=o{d zS4C9AiaN>&$;va&KL4^;6P`JiDOM{)4hYeI(H3(Z57UWP>BZHV0@pq-`3hOitk6`h z+F#w&zXSU6sQ|86y_jywt4V6e9-ryecG97lWN=ReDrAEWGRZn!SMV+k5i%v(Fh(qA z2Tz z&7i~ni9}Vict5FLlUuH9pId6Lo&^uYR2hNeiV6BJK+tF1PDzBlXD~u`1{;J>!cw0S z*Rk28HbpjFVn4C<;8sqHKJYP6fTn#CuscnKvR;zHrV>Zp4mvzbgsEGQz3Q1PX9X`o zl(@!lC^<0BvbBXGjik%Lf-1w_=W!TzSyZ_Z1&HjVYUIN~LkbnkLGB<8k&H(H3bKMo zkp%!i_Up%d3(n<5xK9;D9n`;=!UBk#5;5WRW=aU{IdL6KwF7X}1DWZjN!R@4c`Sq=Kh~3$ zAsBo(Az`-~@SEmy6MXT>$~Fo&DVAQGde!}Y)al0tptM^LV^})abZStj(Pr2Rl``m` zpi>h8{LHXrytX7o9QR4iFhpr3s4*deoSk^#NZa*cfv=$esZ;z^5(r?7go#=d?^mG< z+BYfy&ARv6*w&HC#eUt5nxgg52$d-D5BQ{g;tePvdCFx{TBj+iI52kSQ5=$ zY@q0yS*Bm!V_8?-^-jA^o1oYNpqV#>){)3bjBOllgeVbc=U1BmT2|a>%}?78+`mb4 z32Dw73ZT{tIXPns!LZar^yx5unAlzuO{Xp~!lFbynN4O(3OPsITSznNehSUS#GHE8k4xP8~^PkmPl6et>N9cR3kozp~1hgNmkrLs9D? zQ#)!`tWGFPDsq0OR6|ycVt1ddKJzp^DvRb#cz`h!pDyj-?x@Kg7hP^eMmS-CrGVu+ zN_k-L+S*R76-N(4ULNP_XRs`zb40tg3PBvEirg)nODJw@hQ%fu65jQ+Sws>tY9jl| zIkRWUdMb0U;p!(<fhx5-}`n~>B|6H*Fp5_vASL9f) zmLgIAY$n9zL9UGGG;pFxq^fikS{8tJ$?j0RdpcUgVTW^Kt%qW%!#~8CYfzaxs^~_6 zvJ2YUb1$rh4{KS}nL*Qv#!@M@7`Y#iRDYUWgxWGW6*}NH!-E6GK{w%=R%K?jd8)YI z@-V-i+~HPOzk_^`fO*)?FE@^CEkm2nC&wAsNG|E`*-YtPv^^)>>K{9n-*aS@I%T;|g-- zNIn1*IRUtpm0S2&qE+D?h6~vVAuUJSemgDNap`za>Lqy?$7jscjG{ZxM`A^QG>CzY ztuT?Sr2-BrTObN*tH(0I@?F$5(4q<`suYt}5&@D?m0?t&rnTJ5wC0yp=O6n1q#rRK zTMs0cp^LPtI?fmcGMlkC(Cvy2Hfu1In`D5R4$^ zwk;MkK<%B_aWt9y8X7*O$p)|<#1pV&Wtd@feknh~8mwGqegVHB!;qm)7{H7m&2rS7 zwCe%^h6JpaalQo)-Gdeztf;kA+0M*PD0Fk)5eLEUAEo45a5M%A5$^+gjuFUYv99aB z(bGeQ&`BD6=}@39uR0!9!8b3d#Vl2;RfG*pMlvvMNG}EDljNaj+np?Q+j^)0Gqml; zY;o%sR9}MvT1U4ga!5>d0CCFSlr(?}VWg%j+@LxzvnF1<-bQY-6R4``v*3BYn4iDw zK|ygvuy=@36qzj)6Q0WLJcMRI0yw)>WN__W(XluNPj_Z8+Jw`sGLFPN)i66L0nRMn zSQQD}@WU}!j0LP#Kibf2fmH2?zI$sHtGSPsu`^46o~Ha2s-^GwF_PyL#Dek=+VmE! zbh}?J8n6Ly9F)dK?4X#7ea9sD;KL)z#r7Y67AueC=a7yPMVaD_sQ@MIE3sw zg;yqMQ|Nb>wqjJM(qP%@;1J(UxEm9&(APrW1^5vS2F5i2){&+r{#9y^zNqB8qz8+T zz$?;&qj=J0J;q}?o>h8%Eo$sQWvJ$9a+yl#*zBoAio#^gj+4;U=ANRx=)|jUBbz7L zu%MYNlXEPg?2$g0MAK9bH9*EwwZz7Ks&z_21Kk5eQr%jFRy3a=<4p!8`VW1jDc*H z4`^`d*AnDGky2G^M?VNPr2`@$KWJRO>|T1h`b_m{87u!$Hv zK1yM-&t+@DIM=gY1d1h@g2`x{L*l_>+y|o)K}Bt`!}0{S1i(tEoer7iUklk*3|@fJ zLDaAM7IWEJ$JQF4oxH*{3c=tu2?z5y3kx(dm*3W7+P$BD3KN56WtdO%PXl3Q5DMc+G51MUIY;4t9QC1FLQhWv3JrxH9 zH?iWbqTd)O)!k^yVL5kY6YIen@)-UU)#_5cx{k6^(HZ1k6`i3g)RQZg z%z!I0qm{Ql7G<71N|RCuwJH@uE8rM+YXoYZVV za~fwtY@ytB{utXR59V3h&{@htE#Zx$0KG_}QBm^!WS0Dwrz;$^|CLv&CiZVNy z1Ys%AGQO-rrY)0|mC1UzfP@Fveed|^xAm1)J6)--AOMMzm21e_x81AQ0THfT4U#)) zw6y{OdOJv0)gF(P)=tpAyV4BTbnP4&&Pyu^RCfi{r#sl3lt>+Y1ub~@(i(C?NCb9= z8&NGx-#w{HmDLxU5j1=9a#b$B2~J7=7bf_R?>WDmUHp}EdT!$5Q)iC`@%QiMPah5A z?>~$<^QVqRc{awgah^>$XD=L0@@$INrg=8wESx!-<=LFGc<$%~&*q(TUpZRf*`jk| z@#rMaPVw4lo}F<{K5}%HXXl(VPab`VXOB3i9y@xJXOB5^^GA>K%q8R}c=ja6J4&9*k;XvBi6JxZjif{7{vVI-I&V`Vdp=j4x3Kf_ zhXcCla&6|sohdM-5C7gU^;E?-5vZ$&-xEPV|G8rmgshA$T=AL zm*WG@!SF85KGLhW>5OAjD6cgN*UmdBc~(9boOr5a?in!8)d#-s+;p~`dxPJ1woA*y z?|zUeFjTdn-rTx`c z;8)ezD%g}D4wyU(O9Z%?=aT1EZd`l!m20XNZf;a@24l$F`$SYMHz}ywuyPr!?E5)MY&M0F7_5y%j6`tD+{{PJpt;`VzH+W+?9?CJkDd;Y)9p8uPtzW&#l^T&t3SloBwv@{^Iigc=W>0 z-ulzG-ke0~P_?Oj{#xEAm-=8}F zkH4H<`jt~MSA$l&vGDAAfY9I$A0|dzM{x5q6iQ_hZ|`Gl1n)J(?9*6_nhBc zn>aH(@f!z+|INd1o_l=w%SYEr&e)0jqh}6h7xpLrZgTeh@jv>;{h@Pl8ILUw^KRY`qwHXTYdU1ubhL1J{#;Rd}S4jFgEbgJNvjUZBL!fdS|AGcee;L37e zqS;@MElg+!F*{HT>XgGG+d){_u$a85?n^dE7E-;YcnCSJ5Z*jvKM6IDW$X~;2o~VF zg9DM9LTMKfWwzcNrZ zybZ*=1?f}0Q!2{?Ko4q~$~McOT&k9k6bkZMYL9n5^t3$O+`-NhWclit@CJ4z5V4*C z_!6mSh_|Fc+AS@aN;y6fYNY*l@AXXKieU$n#aFojMxUP{2P&6fGjEjGXMq#>=n)-^ zZ)Z=zfhsGAnd2Q7Y~F+lBE%faT#IBI;%M6%0fLv+CMad-i|QFqxZNX3q(EVI%26WW z8YwdWQKPYyw0QyAGw91ssf*7p#HCsN04Kw%99U@ninRgi*MGQFJDQ_bF0BLF>eab0Z>2LpgHh!5d2aHFt< zZ5n#g)~uIVv|{QA$~S{pNb$ZvncssVUgvgdAs$$lG3ThI*6A53wrKopg=g5>6bV+|!{oQH|4r*4v6etE7^ z)k9>HXJMQ9gGBZ7QiPG9Exy*u>E%6q6Q8V{x2ZjRx~Z9UwPHTgeTeMkM35yGq|L&+ zHLreB_b?i$YLeBtP9MqAlKs(+t#Y3e=Qqu^IKK3Q68!&Z*WBk^7!3DAcaVG$ZBJOz zEvXzJY38@+)w@4WZ)4;>JG4=W!Zm%iKpX|Aw>)HlD>Mz_R-JgJivl2q3}U5}Du)=N zAStnxi;Ai3SV4=o)&4<@T!uy0Z$4@iE7Zqv$|Xao7ECEUG-XPE2fIliMNH=M&naA& zrjo3yAM2vGAS=bW*i4ZEUd;mujo$0F*C5u5o4VBVnJGlb2a|~coUY=Dqg3=hP3y5m zk^CKKCVWw-hxe}C^oMFZ!Y`mQi}u|m)0JR+^4+|2)Pv^LJdXQ+;@IEP6K!+yZ*#$KIX^dYjwGrtP50NE)EpjQtH{ zTcxfsR||Pcmere(1RxcHlq-FZBn~B2lDAa4*l~g=RC?gQcIkP%7RG{hOQHqMrsQ`N zdG5jqS9|XsR0)*AE0jkkL7m5fC+f#zWfYlZM0;M<{rv!$f`+`n&8&S3qo5I32%uIi zE9sZu!K*rm3sf*YZ#CmU-hOPa%>_}a)fwKn1*R1Nr$i*8VM3k(Sj$QF@@N?YO=s)pSe>;oB+={0r*3oy*hd2;0xq#v`iLU;xF>%CB8gD@)ryZxoeAbMVnea z6*N3(zYZmoR@O-&4WR7AwFscL)*pkQ)S>k}QJ~^d_$$2vs8b0X7?o1>(kO(R>P0?G z6Qdi|!>^>4hhR2B!zdYpShnVqle1Dmkl8CGW@QYWVYacg6R~rFXH?_S5@OQ+n(s9e zPusi$Bbk$0n)E(1#^`l>n8q#iIUAn>DDXT&1amP`<_mzV1w;JVYC#z&yf6s6+n}L5 z-6B}Yu#)vn2(vTPcmgu=S^eO{AFr`Lbr`HTIp7bimd7dd9fj~UZO*Ygrr(jqXv=3l$>Zz z(JgFoR)Q~0qLF{;82x)LVwN6r)0S?EmUA60-FmcGsSW&Hf_ zSoeDoC+|6*-Wo=U?{Mz);ry2lr%&krPn_imuHZWUpPW9NSvXvH6vs~=ot+vva%P7| zR3&P#I|{dmZ@R>5m60~W%Z%qlJW;fSW#fCP;<~OpOW9}?!w%x#Cr{$guYA-f{e0jf z)=%-_D~I3xnJn}sdwQYC)$-L#rje3WDN$uSbO#4FV5xF}Bs~45yhRGW6q>p;d(#@q zZV_k={kw6h5V2slmiDnt$kK;lq*YO7b_*}K9%6nd{syKTzrw>R4&Bpg%vwIL8cEN$ zWRKSLYqE#pE4<%+GGRLa=_izn*$yCwe}OW5;^G_VHsee!kVqiU?8(Ek%ZKiTPbWu6 zn-N2sfgEf`0v7TKPe?#e$4MXr;0*8)0({t)0MgU=J5j(>AgH=~h#(qYe*J=!IEK!v zSOoAr27C*=<-s0=C&WaCYI0}HLz}2(pO8ZJB2fL4uYdUbe}3-M!2u$9z#zGFWBC-w zS;NLT)b__^e<|K{oWz9NbyO$7NR8JMMafsq81c7w%P@9G-U*~jARgyWYza{E%vPiB zM3(hWq&Yw;$lXz098-m03bho!MJR=9emnLec3*dz!OQV$_?04j0~2B zem&)s9{Zop$-i~J{I||izZn=Q4gA{SVa6$4LYaSd;b`#6Na;&x0+^gV9G^a%TjUY{ zPs|)n&K;gOc{n!Bz%nj=^OoFS-*nNJ_z87Pe$-5Yiued5E#|1|We VGmWpV^VpLgUih^$UQ+t#{{qQTxeNdR literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d048698070bf23874d071963cc1ee75103773210 GIT binary patch literal 3142 zcmb_e-ESMm5#PJxo%ktHvK&QLi>^PEn1V!xa^k|Stv0RXk0KE2*hvv0!1cskNhcle zsNJO!5;9-}evs-1vv2{caDlo=9&E@6QnU~K6I}E~Nd+`H2xy9?K>a3LE*ki$vv(v# zMGA@lT~c$iGqW?Zqu?vQDPk!!7CgQ7f!PkQ$zRn#_ zaNn3_UX8lNMy%kWH8$HdU~VId3JO65l_&)ba*t5`fx0Hc!73PgBprJs(LfSwI~Au1 zqFqO=n+71ooz}L){rMi}NERFQ1MFKE}qzu&hhAEyD5qsbQQS#xD)y zBh$8PIY%-WpE-*I`Di9McZF5xH*#<$JPvO2`*>Ki@!9?J7~PdeD}a3@Oh!btOp6Wp2Ka!cK@v{e z4}si9OUhgWIDxi7h_cp@UR6aCd}yf!GNR5OM~HPVsdIY!xsWGX^R$9gw1h;nF~I|g z^n+1Tze}Tkt;T5AfDcvfcN+CF%0z1?gDXog{={OO;vqhSEtgGQC^FAaGU`x^16iaF*yz0M*uvKU)X?MQ zGIfcs*{;ZFzE*U&ufTVa%P^4Mvzc7U6}e*W4Guk%J4Xd|@i?=Iog1foUU=nPnR#L$DYcSt76u3Ph|6>Ic^I&Qnrfo)(qu2**7_}(SxQ9y_qdn{azDB zNvS2~FnipY8g8${eiko4p1c6$8rq7ZROij}E9dJ!y7AhwvYF^yUbu0xe(C4m`!t!l zd12*3{ihqrZ~wikXS2JveyP6jiz~PKKR9~Vx~Ke>yr22QiH{ck*!?^4`%@3|4=?@c z<)@mOj&C6~7T*T%XcsIcjAVhf{{;kKiRR$>)dgVvstEQK#1d^F-GQzmTHst#gwZ_O zoaWpRvKfN)oii*qL>wRwPo8Q&qoDR(TMjLN6Ky}QhoJ4IRe)`z z_F)T&6E3eXz^x}{DI3Bz2h6s{rG*zQ$0m)jnGGkV1pDg&yrpf~;}S1bESTl;X^)j) zlNaW)-7sd~k$zGp4T@m~ zK5G5D5ZkUg0oL3G0#Hq(WcudV%Gl}~zcGJhew-NI>>XI0xHY*v@kLkv>fi?lH@aTj z>=|574t}2Q{^jM>gSQGB>0@{EpQMk4;w=qz4~Fa)UC-6UjjO9~|C--@LS8>u#}JDF zuB6vs71g)E;vMv^_7-|axvxy#*Vqtf*o#2?&fVp`A7S7Sv5eHI6%O-%mX^45CczR` z*Dy`GV4Ag_U1beq=fIGU0fBm|TI|TDeFJ~(%Y59Ixi|QizL!=mEdQ_`*@~icPyNbD zZ9Urm<Gece+Nj2g-={e=Haj>YEgd4MQqy zM3Nkky`^x(-cm@}q_qBDrAW$BjIUJJqtAc&G_hYPn1twLChbQ}(}m_TO+Rj$C681b z$tO*7p<+1=O^0a`uL#{FXB8Weq*s!Ik~{~**I+x+38Qoiwd-8m@KKkSZLqD{gj_UnkI2mLTekaDJD{fJEp2L}J4&N}P zfQNHJH%rz$4R0xb8-)3tk(_L=Am?Y%Ghvm+*bhJ^JBoiF2p~*R{vAci;6Ks8-w@t1 pkedEXF_s7GmAm5~^=>F9|D*m`QTn%#q>!%qT}jf9BXS=E_%CSJ;WYpN literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..449ab6430d9839be7ed032c8f15652a5937ecf38 GIT binary patch literal 4260 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 O)pp&kJ|pl_Zu%Fj2x9{P literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01d088a70bb3f0c873df9fa570fd64ec02fb43d7 GIT binary patch literal 3013 zcmds2L2nyH6rR~#JGPrN4NV{c(N0^`VpG

    k-6sj=Y#Y9%T_Dpby9ckFDt-nC}N zNgbt?g(@YfDwPA!9D9ul5hfzSAF4^_s`0%+ya5 z&P&r)G7qutbX{>9N4hNzjt*bj19O9@-kd|PkOfjCx1z{f(ag38?V%9>>aX@F>t{&X zm@lRnw0F3w3tuveg($G*>@$>Ci^B=+-F7MI&QYeZ;S?tY{bk{+(L3qfCkJkiOx|lJ zVD_W2y>w+@FMXUhDDZuyH34iOEnO-hlHf(RCI-P5Ltq|;XcsQphA0;y+I=Ve8Y0Tw z6FVW~zd|CAG5-$9$OA}<5t4~J=>j4tc90-pdnAC4fu)v6K^ERxYsa=HAVy&vl}Ek` zrb&KDk>nFl=9{D6j!dp6CcjUNz!hOHx1Pv_y(0FC>xtsVfH4@~AVw_ShPA{-(`|?n z3)jYN7qvxw(b%pK3#6+FA423+{i<qGZjYXMMWMDJ(LNYVb6Q6R39J*4>Nd7heI`xW>4DArTYtT z(fhba1E=1y?~BrLqw)S{0y^1rC#N}ic&I7HVX>l2EILG`4#RQ zKhBPVc$i06-nMy7;kCGaMY1_p&A>f#&j~Sh)v~92P*U`FV}0KS^QjJ6Nza4#U|ZH_ z$wewhDQM~W?dzk!Wh0z7aDG{vC1*&;dQiz^sT4|gsnjy?qE}!+7bugJB*{hLG^ z+W+0~`1Q-nmv4@(4IkXpVc_oY_{tk=!~5X%CsSe!maWo|Md_Hp8xai69yFMj*b64g z>g36jova3;qs4xh#4XzBYytiDkcsDR7T3qqw~eu8VQK8+*l$KGmfF}!21lEx!{clS z?KNP}BjMS~-}1}};18O~_<_p6vqHW-HoEbP|8Ke->(i~zu!wogk{~y=y6RCkq`JMG zIOvDOI|a_8Bi>+_dSV>*70-bA6P2RU0F}B$>QSjXmB)3jfcd9X+LeMINyI0y4>sts z3CZ~|Hbtk4LlAoe;}4)gUY$zETLYz%6WE|5u~OB#z&k%+{OyJ83m2_+qC;|SB~DZW sr|$8bcmaZd7epePH*`wr&vA_!za|KMb~B!!@y#d4>1g|9FyU!`0GDLfW&i*H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43c185cacac2710b3caffe065cdc8922e07f9d69 GIT binary patch literal 1944 zcma)7&rjS&6rQoYUhnc_fe;{7LnbK+@+#O#dZ{9WL_<*zRT34oQjl8LyPgGu*Ivzd zNkL0Rt4Jkk4@gx7M~;p7Q+fdrDZx@CqPBtljeCmGk){l`@Z-5 zYez>OfpmnQ&rInE{U%;oqNJ0fNtmo74^1NvdrE+-%Cv&TTn*H!Hm$*2dxWMlUIw)8 z>7cV-7PO%tn%hdvOy?I3Gq-d#eigrH7*~*;Vg`!9#G$d%d4n@J^aX6#tl4$ zOl7H(Cm^5JL*fPjDZ+IzWxPn-&?Ah-brzC%mbRt~ZcwKrs>rp#W(=Zdy0wW?7Z~G!>*3or7^?f%+M*qlU7qKF&;_FWM1W))dsx8mNIA z>Q?&Ivif7Eh8ik(jPE`{rk)sn$YVDw(?l2P@k>cAqz@hGU!t&uL~lltWYdVaxKxBn zR$jYyHH_`D{TT;;?MWKbkW4V&^X&=B=i{hm*H|=1`?@6J$e3n%RKDyz1bv_E8Stwuek=GW-bJ3?EdK~#1FK4!hSCxGGC zLH)CWo_F-ED*JsG4-w8;tCM@({Ts&SwO_96c8@&%@IZyd108kstmcm3JYohYQ(>KA z-UW&aw7(*(0FOiyS2AI}O>BvMxZ$r(J=1g0h1v(UwSLwOizk2)21Lq_`arFtSWr$% zi?QEf6EA%t5xvjo0u5sz3TYw$1SD}pN|aP1&#(B@I}0(G1{auWf}KQhoJ4gThYJ?~ zsAeE~MUtHL!{S94yaNWC73`Qpqnx$B0MD?t|O*2lqsOx zobcw9EUOKb%Y7iGDv7DIh>3x^vW&hwE~8>I8^vKxfQ`QA#epn20UPjbg|Q)4+e!bJOG0`vqga1jrrGR>ut9;WPFSic5?kAafe zGz!nMgFD&5&8s`v;pc^cZDU~H=zL}j>=*+p<9luG&9#?WW@UCw-^e}HuI#tW9aw7g^kM_51tl= z_s;dMJ@{#KyZzG3Lf6`bjgL1gyM>W$W8@9^?wW1zV{yEw3^j!=Y|`{*?tm{a}2Xkp}+-(GJrm literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dde309aa01c4c12c1a0df8aedb7a5fa7153050f6 GIT binary patch literal 26243 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attr/_cmp.py b/myenv/lib/python3.12/site-packages/attr/_cmp.py new file mode 100644 index 0000000..f367bb3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_cmp.py @@ -0,0 +1,160 @@ +# SPDX-License-Identifier: MIT + + +import functools +import types + +from ._make import _make_ne + + +_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "ge": ">="} + + +def cmp_using( + eq=None, + lt=None, + le=None, + gt=None, + ge=None, + require_same_type=True, + class_name="Comparable", +): + """ + Create a class that can be passed into `attrs.field`'s ``eq``, ``order``, + and ``cmp`` arguments to customize field comparison. + + The resulting class will have a full set of ordering methods if at least + one of ``{lt, le, gt, ge}`` and ``eq`` are provided. + + Args: + eq (typing.Callable | None): + Callable used to evaluate equality of two objects. + + lt (typing.Callable | None): + Callable used to evaluate whether one object is less than another + object. + + le (typing.Callable | None): + Callable used to evaluate whether one object is less than or equal + to another object. + + gt (typing.Callable | None): + Callable used to evaluate whether one object is greater than + another object. + + ge (typing.Callable | None): + Callable used to evaluate whether one object is greater than or + equal to another object. + + require_same_type (bool): + When `True`, equality and ordering methods will return + `NotImplemented` if objects are not of the same type. + + class_name (str | None): Name of class. Defaults to "Comparable". + + See `comparison` for more details. + + .. versionadded:: 21.1.0 + """ + + body = { + "__slots__": ["value"], + "__init__": _make_init(), + "_requirements": [], + "_is_comparable_to": _is_comparable_to, + } + + # Add operations. + num_order_functions = 0 + has_eq_function = False + + if eq is not None: + has_eq_function = True + body["__eq__"] = _make_operator("eq", eq) + body["__ne__"] = _make_ne() + + if lt is not None: + num_order_functions += 1 + body["__lt__"] = _make_operator("lt", lt) + + if le is not None: + num_order_functions += 1 + body["__le__"] = _make_operator("le", le) + + if gt is not None: + num_order_functions += 1 + body["__gt__"] = _make_operator("gt", gt) + + if ge is not None: + num_order_functions += 1 + body["__ge__"] = _make_operator("ge", ge) + + type_ = types.new_class( + class_name, (object,), {}, lambda ns: ns.update(body) + ) + + # Add same type requirement. + if require_same_type: + type_._requirements.append(_check_same_type) + + # Add total ordering if at least one operation was defined. + if 0 < num_order_functions < 4: + if not has_eq_function: + # functools.total_ordering requires __eq__ to be defined, + # so raise early error here to keep a nice stack. + msg = "eq must be define is order to complete ordering from lt, le, gt, ge." + raise ValueError(msg) + type_ = functools.total_ordering(type_) + + return type_ + + +def _make_init(): + """ + Create __init__ method. + """ + + def __init__(self, value): + """ + Initialize object with *value*. + """ + self.value = value + + return __init__ + + +def _make_operator(name, func): + """ + Create operator method. + """ + + def method(self, other): + if not self._is_comparable_to(other): + return NotImplemented + + result = func(self.value, other.value) + if result is NotImplemented: + return NotImplemented + + return result + + method.__name__ = f"__{name}__" + method.__doc__ = ( + f"Return a {_operation_names[name]} b. Computed by attrs." + ) + + return method + + +def _is_comparable_to(self, other): + """ + Check whether `other` is comparable to `self`. + """ + return all(func(self, other) for func in self._requirements) + + +def _check_same_type(self, other): + """ + Return True if *self* and *other* are of the same type, False otherwise. + """ + return other.value.__class__ is self.value.__class__ diff --git a/myenv/lib/python3.12/site-packages/attr/_cmp.pyi b/myenv/lib/python3.12/site-packages/attr/_cmp.pyi new file mode 100644 index 0000000..cc7893b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_cmp.pyi @@ -0,0 +1,13 @@ +from typing import Any, Callable + +_CompareWithType = Callable[[Any, Any], bool] + +def cmp_using( + eq: _CompareWithType | None = ..., + lt: _CompareWithType | None = ..., + le: _CompareWithType | None = ..., + gt: _CompareWithType | None = ..., + ge: _CompareWithType | None = ..., + require_same_type: bool = ..., + class_name: str = ..., +) -> type: ... diff --git a/myenv/lib/python3.12/site-packages/attr/_compat.py b/myenv/lib/python3.12/site-packages/attr/_compat.py new file mode 100644 index 0000000..104eeb0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_compat.py @@ -0,0 +1,103 @@ +# SPDX-License-Identifier: MIT + +import inspect +import platform +import sys +import threading + +from collections.abc import Mapping, Sequence # noqa: F401 +from typing import _GenericAlias + + +PYPY = platform.python_implementation() == "PyPy" +PY_3_8_PLUS = sys.version_info[:2] >= (3, 8) +PY_3_9_PLUS = sys.version_info[:2] >= (3, 9) +PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) +PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) +PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) +PY_3_13_PLUS = sys.version_info[:2] >= (3, 13) +PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) + + +if sys.version_info < (3, 8): + try: + from typing_extensions import Protocol + except ImportError: # pragma: no cover + Protocol = object +else: + from typing import Protocol # noqa: F401 + +if PY_3_14_PLUS: # pragma: no cover + import annotationlib + + _get_annotations = annotationlib.get_annotations + +else: + + def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + return cls.__dict__.get("__annotations__", {}) + + +class _AnnotationExtractor: + """ + Extract type annotations from a callable, returning None whenever there + is none. + """ + + __slots__ = ["sig"] + + def __init__(self, callable): + try: + self.sig = inspect.signature(callable) + except (ValueError, TypeError): # inspect failed + self.sig = None + + def get_first_param_type(self): + """ + Return the type annotation of the first argument if it's not empty. + """ + if not self.sig: + return None + + params = list(self.sig.parameters.values()) + if params and params[0].annotation is not inspect.Parameter.empty: + return params[0].annotation + + return None + + def get_return_type(self): + """ + Return the return type if it's not empty. + """ + if ( + self.sig + and self.sig.return_annotation is not inspect.Signature.empty + ): + return self.sig.return_annotation + + return None + + +# Thread-local global to track attrs instances which are already being repr'd. +# This is needed because there is no other (thread-safe) way to pass info +# about the instances that are already being repr'd through the call stack +# in order to ensure we don't perform infinite recursion. +# +# For instance, if an instance contains a dict which contains that instance, +# we need to know that we're already repr'ing the outside instance from within +# the dict's repr() call. +# +# This lives here rather than in _make.py so that the functions in _make.py +# don't have a direct reference to the thread-local in their globals dict. +# If they have such a reference, it breaks cloudpickle. +repr_context = threading.local() + + +def get_generic_base(cl): + """If this is a generic class (A[str]), return the generic base for it.""" + if cl.__class__ is _GenericAlias: + return cl.__origin__ + return None diff --git a/myenv/lib/python3.12/site-packages/attr/_config.py b/myenv/lib/python3.12/site-packages/attr/_config.py new file mode 100644 index 0000000..9c245b1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_config.py @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: MIT + +__all__ = ["set_run_validators", "get_run_validators"] + +_run_validators = True + + +def set_run_validators(run): + """ + Set whether or not validators are run. By default, they are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` + instead. + """ + if not isinstance(run, bool): + msg = "'run' must be bool." + raise TypeError(msg) + global _run_validators + _run_validators = run + + +def get_run_validators(): + """ + Return whether or not validators are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` + instead. + """ + return _run_validators diff --git a/myenv/lib/python3.12/site-packages/attr/_funcs.py b/myenv/lib/python3.12/site-packages/attr/_funcs.py new file mode 100644 index 0000000..355cef4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_funcs.py @@ -0,0 +1,522 @@ +# SPDX-License-Identifier: MIT + + +import copy + +from ._compat import PY_3_9_PLUS, get_generic_base +from ._make import _OBJ_SETATTR, NOTHING, fields +from .exceptions import AttrsAttributeNotFoundError + + +def asdict( + inst, + recurse=True, + filter=None, + dict_factory=dict, + retain_collection_types=False, + value_serializer=None, +): + """ + Return the *attrs* attribute values of *inst* as a dict. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + dict_factory (~typing.Callable): + A callable to produce dictionaries from. For example, to produce + ordered dictionaries instead of normal Python dictionaries, pass in + ``collections.OrderedDict``. + + retain_collection_types (bool): + Do not convert to `list` when encountering an attribute whose type + is `tuple` or `set`. Only meaningful if *recurse* is `True`. + + value_serializer (typing.Callable | None): + A hook that is called for every attribute or dict key/value. It + receives the current instance, field and value and must return the + (updated) value. The hook is run *after* the optional *filter* has + been applied. + + Returns: + Return type of *dict_factory*. + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.0.0 *dict_factory* + .. versionadded:: 16.1.0 *retain_collection_types* + .. versionadded:: 20.3.0 *value_serializer* + .. versionadded:: 21.3.0 + If a dict has a collection for a key, it is serialized as a tuple. + """ + attrs = fields(inst.__class__) + rv = dict_factory() + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + + if value_serializer is not None: + v = value_serializer(inst, a, v) + + if recurse is True: + if has(v.__class__): + rv[a.name] = asdict( + v, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif isinstance(v, (tuple, list, set, frozenset)): + cf = v.__class__ if retain_collection_types is True else list + items = [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in v + ] + try: + rv[a.name] = cf(items) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv[a.name] = cf(*items) + elif isinstance(v, dict): + df = dict_factory + rv[a.name] = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in v.items() + ) + else: + rv[a.name] = v + else: + rv[a.name] = v + return rv + + +def _asdict_anything( + val, + is_key, + filter, + dict_factory, + retain_collection_types, + value_serializer, +): + """ + ``asdict`` only works on attrs instances, this works on anything. + """ + if getattr(val.__class__, "__attrs_attrs__", None) is not None: + # Attrs class. + rv = asdict( + val, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif isinstance(val, (tuple, list, set, frozenset)): + if retain_collection_types is True: + cf = val.__class__ + elif is_key: + cf = tuple + else: + cf = list + + rv = cf( + [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in val + ] + ) + elif isinstance(val, dict): + df = dict_factory + rv = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in val.items() + ) + else: + rv = val + if value_serializer is not None: + rv = value_serializer(None, None, rv) + + return rv + + +def astuple( + inst, + recurse=True, + filter=None, + tuple_factory=tuple, + retain_collection_types=False, +): + """ + Return the *attrs* attribute values of *inst* as a tuple. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): + Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + tuple_factory (~typing.Callable): + A callable to produce tuples from. For example, to produce lists + instead of tuples. + + retain_collection_types (bool): + Do not convert to `list` or `dict` when encountering an attribute + which type is `tuple`, `dict` or `set`. Only meaningful if + *recurse* is `True`. + + Returns: + Return type of *tuple_factory* + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.2.0 + """ + attrs = fields(inst.__class__) + rv = [] + retain = retain_collection_types # Very long. :/ + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + if recurse is True: + if has(v.__class__): + rv.append( + astuple( + v, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + ) + elif isinstance(v, (tuple, list, set, frozenset)): + cf = v.__class__ if retain is True else list + items = [ + ( + astuple( + j, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(j.__class__) + else j + ) + for j in v + ] + try: + rv.append(cf(items)) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv.append(cf(*items)) + elif isinstance(v, dict): + df = v.__class__ if retain is True else dict + rv.append( + df( + ( + ( + astuple( + kk, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(kk.__class__) + else kk + ), + ( + astuple( + vv, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(vv.__class__) + else vv + ), + ) + for kk, vv in v.items() + ) + ) + else: + rv.append(v) + else: + rv.append(v) + + return rv if tuple_factory is list else tuple_factory(rv) + + +def has(cls): + """ + Check whether *cls* is a class with *attrs* attributes. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + Returns: + bool: + """ + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is not None: + return True + + # No attrs, maybe it's a specialized generic (A[str])? + generic_base = get_generic_base(cls) + if generic_base is not None: + generic_attrs = getattr(generic_base, "__attrs_attrs__", None) + if generic_attrs is not None: + # Stick it on here for speed next time. + cls.__attrs_attrs__ = generic_attrs + return generic_attrs is not None + return False + + +def assoc(inst, **changes): + """ + Copy *inst* and apply *changes*. + + This is different from `evolve` that applies the changes to the arguments + that create the new instance. + + `evolve`'s behavior is preferable, but there are `edge cases`_ where it + doesn't work. Therefore `assoc` is deprecated, but will not be removed. + + .. _`edge cases`: https://github.com/python-attrs/attrs/issues/251 + + Args: + inst: Instance of a class with *attrs* attributes. + + changes: Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + attrs.exceptions.AttrsAttributeNotFoundError: + If *attr_name* couldn't be found on *cls*. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. deprecated:: 17.1.0 + Use `attrs.evolve` instead if you can. This function will not be + removed du to the slightly different approach compared to + `attrs.evolve`, though. + """ + new = copy.copy(inst) + attrs = fields(inst.__class__) + for k, v in changes.items(): + a = getattr(attrs, k, NOTHING) + if a is NOTHING: + msg = f"{k} is not an attrs attribute on {new.__class__}." + raise AttrsAttributeNotFoundError(msg) + _OBJ_SETATTR(new, k, v) + return new + + +def evolve(*args, **changes): + """ + Create a new instance, based on the first positional argument with + *changes* applied. + + Args: + + inst: + Instance of a class with *attrs* attributes. *inst* must be passed + as a positional argument. + + changes: + Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + TypeError: + If *attr_name* couldn't be found in the class ``__init__``. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 17.1.0 + .. deprecated:: 23.1.0 + It is now deprecated to pass the instance using the keyword argument + *inst*. It will raise a warning until at least April 2024, after which + it will become an error. Always pass the instance as a positional + argument. + .. versionchanged:: 24.1.0 + *inst* can't be passed as a keyword argument anymore. + """ + try: + (inst,) = args + except ValueError: + msg = ( + f"evolve() takes 1 positional argument, but {len(args)} were given" + ) + raise TypeError(msg) from None + + cls = inst.__class__ + attrs = fields(cls) + for a in attrs: + if not a.init: + continue + attr_name = a.name # To deal with private attributes. + init_name = a.alias + if init_name not in changes: + changes[init_name] = getattr(inst, attr_name) + + return cls(**changes) + + +def resolve_types( + cls, globalns=None, localns=None, attribs=None, include_extras=True +): + """ + Resolve any strings and forward annotations in type annotations. + + This is only required if you need concrete types in :class:`Attribute`'s + *type* field. In other words, you don't need to resolve your types if you + only use them for static type checking. + + With no arguments, names will be looked up in the module in which the class + was created. If this is not what you want, for example, if the name only + exists inside a method, you may pass *globalns* or *localns* to specify + other dictionaries in which to look up these names. See the docs of + `typing.get_type_hints` for more details. + + Args: + cls (type): Class to resolve. + + globalns (dict | None): Dictionary containing global variables. + + localns (dict | None): Dictionary containing local variables. + + attribs (list | None): + List of attribs for the given class. This is necessary when calling + from inside a ``field_transformer`` since *cls* is not an *attrs* + class yet. + + include_extras (bool): + Resolve more accurately, if possible. Pass ``include_extras`` to + ``typing.get_hints``, if supported by the typing module. On + supported Python versions (3.9+), this resolves the types more + accurately. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class and you didn't pass any attribs. + + NameError: If types cannot be resolved because of missing variables. + + Returns: + *cls* so you can use this function also as a class decorator. Please + note that you have to apply it **after** `attrs.define`. That means the + decorator has to come in the line **before** `attrs.define`. + + .. versionadded:: 20.1.0 + .. versionadded:: 21.1.0 *attribs* + .. versionadded:: 23.1.0 *include_extras* + """ + # Since calling get_type_hints is expensive we cache whether we've + # done it already. + if getattr(cls, "__attrs_types_resolved__", None) != cls: + import typing + + kwargs = {"globalns": globalns, "localns": localns} + + if PY_3_9_PLUS: + kwargs["include_extras"] = include_extras + + hints = typing.get_type_hints(cls, **kwargs) + for field in fields(cls) if attribs is None else attribs: + if field.name in hints: + # Since fields have been frozen we must work around it. + _OBJ_SETATTR(field, "type", hints[field.name]) + # We store the class we resolved so that subclasses know they haven't + # been resolved. + cls.__attrs_types_resolved__ = cls + + # Return the class so you can use it as a decorator too. + return cls diff --git a/myenv/lib/python3.12/site-packages/attr/_make.py b/myenv/lib/python3.12/site-packages/attr/_make.py new file mode 100644 index 0000000..bf00c5f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_make.py @@ -0,0 +1,2960 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +import abc +import contextlib +import copy +import enum +import functools +import inspect +import itertools +import linecache +import sys +import types +import typing + +from operator import itemgetter + +# We need to import _compat itself in addition to the _compat members to avoid +# having the thread-local in the globals here. +from . import _compat, _config, setters +from ._compat import ( + PY_3_8_PLUS, + PY_3_10_PLUS, + PY_3_11_PLUS, + _AnnotationExtractor, + _get_annotations, + get_generic_base, +) +from .exceptions import ( + DefaultAlreadySetError, + FrozenInstanceError, + NotAnAttrsClassError, + UnannotatedAttributeError, +) + + +# This is used at least twice, so cache it here. +_OBJ_SETATTR = object.__setattr__ +_INIT_FACTORY_PAT = "__attr_factory_%s" +_CLASSVAR_PREFIXES = ( + "typing.ClassVar", + "t.ClassVar", + "ClassVar", + "typing_extensions.ClassVar", +) +# we don't use a double-underscore prefix because that triggers +# name mangling when trying to create a slot for the field +# (when slots=True) +_HASH_CACHE_FIELD = "_attrs_cached_hash" + +_EMPTY_METADATA_SINGLETON = types.MappingProxyType({}) + +# Unique object for unequivocal getattr() defaults. +_SENTINEL = object() + +_DEFAULT_ON_SETATTR = setters.pipe(setters.convert, setters.validate) + + +class _Nothing(enum.Enum): + """ + Sentinel to indicate the lack of a value when `None` is ambiguous. + + If extending attrs, you can use ``typing.Literal[NOTHING]`` to show + that a value may be ``NOTHING``. + + .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. + .. versionchanged:: 22.2.0 ``NOTHING`` is now an ``enum.Enum`` variant. + """ + + NOTHING = enum.auto() + + def __repr__(self): + return "NOTHING" + + def __bool__(self): + return False + + +NOTHING = _Nothing.NOTHING +""" +Sentinel to indicate the lack of a value when `None` is ambiguous. +""" + + +class _CacheHashWrapper(int): + """ + An integer subclass that pickles / copies as None + + This is used for non-slots classes with ``cache_hash=True``, to avoid + serializing a potentially (even likely) invalid hash value. Since `None` + is the default value for uncalculated hashes, whenever this is copied, + the copy's value for the hash should automatically reset. + + See GH #613 for more details. + """ + + def __reduce__(self, _none_constructor=type(None), _args=()): # noqa: B008 + return _none_constructor, _args + + +def attrib( + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new field / attribute on a class. + + Identical to `attrs.field`, except it's not keyword-only. + + Consider using `attrs.field` in new code (``attr.ib`` will *never* go away, + though). + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attr.s` (or similar)! + + + .. versionadded:: 15.2.0 *convert* + .. versionadded:: 16.3.0 *metadata* + .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. + .. versionchanged:: 17.1.0 + *hash* is `None` and therefore mirrors *eq* by default. + .. versionadded:: 17.3.0 *type* + .. deprecated:: 17.4.0 *convert* + .. versionadded:: 17.4.0 + *converter* as a replacement for the deprecated *convert* to achieve + consistency with other noun-based arguments. + .. versionadded:: 18.1.0 + ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. + .. versionadded:: 18.2.0 *kw_only* + .. versionchanged:: 19.2.0 *convert* keyword argument removed. + .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 22.2.0 *alias* + """ + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq, order, True + ) + + if hash is not None and hash is not True and hash is not False: + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + if factory is not None: + if default is not NOTHING: + msg = ( + "The `default` and `factory` arguments are mutually exclusive." + ) + raise ValueError(msg) + if not callable(factory): + msg = "The `factory` argument must be a callable." + raise ValueError(msg) + default = Factory(factory) + + if metadata is None: + metadata = {} + + # Apply syntactic sugar by auto-wrapping. + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + if validator and isinstance(validator, (list, tuple)): + validator = and_(*validator) + + if converter and isinstance(converter, (list, tuple)): + converter = pipe(*converter) + + return _CountingAttr( + default=default, + validator=validator, + repr=repr, + cmp=None, + hash=hash, + init=init, + converter=converter, + metadata=metadata, + type=type, + kw_only=kw_only, + eq=eq, + eq_key=eq_key, + order=order, + order_key=order_key, + on_setattr=on_setattr, + alias=alias, + ) + + +def _compile_and_eval(script, globs, locs=None, filename=""): + """ + Evaluate the script with the given global (globs) and local (locs) + variables. + """ + bytecode = compile(script, filename, "exec") + eval(bytecode, globs, locs) + + +def _make_method(name, script, filename, globs, locals=None): + """ + Create the method with the script given and return the method object. + """ + locs = {} if locals is None else locals + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + count = 1 + base_filename = filename + while True: + linecache_tuple = ( + len(script), + None, + script.splitlines(True), + filename, + ) + old_val = linecache.cache.setdefault(filename, linecache_tuple) + if old_val == linecache_tuple: + break + + filename = f"{base_filename[:-1]}-{count}>" + count += 1 + + _compile_and_eval(script, globs, locs, filename) + + return locs[name] + + +def _make_attr_tuple_class(cls_name, attr_names): + """ + Create a tuple subclass to hold `Attribute`s for an `attrs` class. + + The subclass is a bare tuple with properties for names. + + class MyClassAttributes(tuple): + __slots__ = () + x = property(itemgetter(0)) + """ + attr_class_name = f"{cls_name}Attributes" + attr_class_template = [ + f"class {attr_class_name}(tuple):", + " __slots__ = ()", + ] + if attr_names: + for i, attr_name in enumerate(attr_names): + attr_class_template.append( + f" {attr_name} = _attrs_property(_attrs_itemgetter({i}))" + ) + else: + attr_class_template.append(" pass") + globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} + _compile_and_eval("\n".join(attr_class_template), globs) + return globs[attr_class_name] + + +# Tuple class for extracted attributes from a class definition. +# `base_attrs` is a subset of `attrs`. +_Attributes = _make_attr_tuple_class( + "_Attributes", + [ + # all attributes to build dunder methods for + "attrs", + # attributes that have been inherited + "base_attrs", + # map inherited attributes to their originating classes + "base_attrs_map", + ], +) + + +def _is_class_var(annot): + """ + Check whether *annot* is a typing.ClassVar. + + The string comparison hack is used to avoid evaluating all string + annotations which would put attrs-based classes at a performance + disadvantage compared to plain old classes. + """ + annot = str(annot) + + # Annotation can be quoted. + if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): + annot = annot[1:-1] + + return annot.startswith(_CLASSVAR_PREFIXES) + + +def _has_own_attribute(cls, attrib_name): + """ + Check whether *cls* defines *attrib_name* (and doesn't just inherit it). + """ + return attrib_name in cls.__dict__ + + +def _collect_base_attrs(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in reversed(cls.__mro__[1:-1]): + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.inherited or a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + # For each name, only keep the freshest definition i.e. the furthest at the + # back. base_attr_map is fine because it gets overwritten with every new + # instance. + filtered = [] + seen = set() + for a in reversed(base_attrs): + if a.name in seen: + continue + filtered.insert(0, a) + seen.add(a.name) + + return filtered, base_attr_map + + +def _collect_base_attrs_broken(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + + N.B. *taken_attr_names* will be mutated. + + Adhere to the old incorrect behavior. + + Notably it collects from the front and considers inherited attributes which + leads to the buggy behavior reported in #428. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in cls.__mro__[1:-1]: + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + taken_attr_names.add(a.name) + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + return base_attrs, base_attr_map + + +def _transform_attrs( + cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer +): + """ + Transform all `_CountingAttr`s on a class into `Attribute`s. + + If *these* is passed, use that and don't look for them on the class. + + If *collect_by_mro* is True, collect them in the correct MRO order, + otherwise use the old -- incorrect -- order. See #428. + + Return an `_Attributes`. + """ + cd = cls.__dict__ + anns = _get_annotations(cls) + + if these is not None: + ca_list = list(these.items()) + elif auto_attribs is True: + ca_names = { + name + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + } + ca_list = [] + annot_names = set() + for attr_name, type in anns.items(): + if _is_class_var(type): + continue + annot_names.add(attr_name) + a = cd.get(attr_name, NOTHING) + + if not isinstance(a, _CountingAttr): + a = attrib() if a is NOTHING else attrib(default=a) + ca_list.append((attr_name, a)) + + unannotated = ca_names - annot_names + if len(unannotated) > 0: + raise UnannotatedAttributeError( + "The following `attr.ib`s lack a type annotation: " + + ", ".join( + sorted(unannotated, key=lambda n: cd.get(n).counter) + ) + + "." + ) + else: + ca_list = sorted( + ( + (name, attr) + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + ), + key=lambda e: e[1].counter, + ) + + own_attrs = [ + Attribute.from_counting_attr( + name=attr_name, ca=ca, type=anns.get(attr_name) + ) + for attr_name, ca in ca_list + ] + + if collect_by_mro: + base_attrs, base_attr_map = _collect_base_attrs( + cls, {a.name for a in own_attrs} + ) + else: + base_attrs, base_attr_map = _collect_base_attrs_broken( + cls, {a.name for a in own_attrs} + ) + + if kw_only: + own_attrs = [a.evolve(kw_only=True) for a in own_attrs] + base_attrs = [a.evolve(kw_only=True) for a in base_attrs] + + attrs = base_attrs + own_attrs + + # Mandatory vs non-mandatory attr order only matters when they are part of + # the __init__ signature and when they aren't kw_only (which are moved to + # the end and can be mandatory or non-mandatory in any order, as they will + # be specified as keyword args anyway). Check the order of those attrs: + had_default = False + for a in (a for a in attrs if a.init is not False and a.kw_only is False): + if had_default is True and a.default is NOTHING: + msg = f"No mandatory attributes allowed after an attribute with a default value or factory. Attribute in question: {a!r}" + raise ValueError(msg) + + if had_default is False and a.default is not NOTHING: + had_default = True + + if field_transformer is not None: + attrs = field_transformer(cls, attrs) + + # Resolve default field alias after executing field_transformer. + # This allows field_transformer to differentiate between explicit vs + # default aliases and supply their own defaults. + attrs = [ + a.evolve(alias=_default_init_alias_for(a.name)) if not a.alias else a + for a in attrs + ] + + # Create AttrsClass *after* applying the field_transformer since it may + # add or remove attributes! + attr_names = [a.name for a in attrs] + AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) + + return _Attributes((AttrsClass(attrs), base_attrs, base_attr_map)) + + +def _make_cached_property_getattr(cached_properties, original_getattr, cls): + lines = [ + # Wrapped to get `__class__` into closure cell for super() + # (It will be replaced with the newly constructed class after construction). + "def wrapper(_cls):", + " __class__ = _cls", + " def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):", + " func = cached_properties.get(item)", + " if func is not None:", + " result = func(self)", + " _setter = _cached_setattr_get(self)", + " _setter(item, result)", + " return result", + ] + if original_getattr is not None: + lines.append( + " return original_getattr(self, item)", + ) + else: + lines.extend( + [ + " try:", + " return super().__getattribute__(item)", + " except AttributeError:", + " if not hasattr(super(), '__getattr__'):", + " raise", + " return super().__getattr__(item)", + " original_error = f\"'{self.__class__.__name__}' object has no attribute '{item}'\"", + " raise AttributeError(original_error)", + ] + ) + + lines.extend( + [ + " return __getattr__", + "__getattr__ = wrapper(_cls)", + ] + ) + + unique_filename = _generate_unique_filename(cls, "getattr") + + glob = { + "cached_properties": cached_properties, + "_cached_setattr_get": _OBJ_SETATTR.__get__, + "original_getattr": original_getattr, + } + + return _make_method( + "__getattr__", + "\n".join(lines), + unique_filename, + glob, + locals={ + "_cls": cls, + }, + ) + + +def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + if isinstance(self, BaseException) and name in ( + "__cause__", + "__context__", + "__traceback__", + ): + BaseException.__setattr__(self, name, value) + return + + raise FrozenInstanceError() + + +def _frozen_delattrs(self, name): + """ + Attached to frozen classes as __delattr__. + """ + raise FrozenInstanceError() + + +class _ClassBuilder: + """ + Iteratively build *one* class. + """ + + __slots__ = ( + "_attr_names", + "_attrs", + "_base_attr_map", + "_base_names", + "_cache_hash", + "_cls", + "_cls_dict", + "_delete_attribs", + "_frozen", + "_has_pre_init", + "_pre_init_has_args", + "_has_post_init", + "_is_exc", + "_on_setattr", + "_slots", + "_weakref_slot", + "_wrote_own_setattr", + "_has_custom_setattr", + ) + + def __init__( + self, + cls, + these, + slots, + frozen, + weakref_slot, + getstate_setstate, + auto_attribs, + kw_only, + cache_hash, + is_exc, + collect_by_mro, + on_setattr, + has_custom_setattr, + field_transformer, + ): + attrs, base_attrs, base_map = _transform_attrs( + cls, + these, + auto_attribs, + kw_only, + collect_by_mro, + field_transformer, + ) + + self._cls = cls + self._cls_dict = dict(cls.__dict__) if slots else {} + self._attrs = attrs + self._base_names = {a.name for a in base_attrs} + self._base_attr_map = base_map + self._attr_names = tuple(a.name for a in attrs) + self._slots = slots + self._frozen = frozen + self._weakref_slot = weakref_slot + self._cache_hash = cache_hash + self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) + self._pre_init_has_args = False + if self._has_pre_init: + # Check if the pre init method has more arguments than just `self` + # We want to pass arguments if pre init expects arguments + pre_init_func = cls.__attrs_pre_init__ + pre_init_signature = inspect.signature(pre_init_func) + self._pre_init_has_args = len(pre_init_signature.parameters) > 1 + self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) + self._delete_attribs = not bool(these) + self._is_exc = is_exc + self._on_setattr = on_setattr + + self._has_custom_setattr = has_custom_setattr + self._wrote_own_setattr = False + + self._cls_dict["__attrs_attrs__"] = self._attrs + + if frozen: + self._cls_dict["__setattr__"] = _frozen_setattrs + self._cls_dict["__delattr__"] = _frozen_delattrs + + self._wrote_own_setattr = True + elif on_setattr in ( + _DEFAULT_ON_SETATTR, + setters.validate, + setters.convert, + ): + has_validator = has_converter = False + for a in attrs: + if a.validator is not None: + has_validator = True + if a.converter is not None: + has_converter = True + + if has_validator and has_converter: + break + if ( + ( + on_setattr == _DEFAULT_ON_SETATTR + and not (has_validator or has_converter) + ) + or (on_setattr == setters.validate and not has_validator) + or (on_setattr == setters.convert and not has_converter) + ): + # If class-level on_setattr is set to convert + validate, but + # there's no field to convert or validate, pretend like there's + # no on_setattr. + self._on_setattr = None + + if getstate_setstate: + ( + self._cls_dict["__getstate__"], + self._cls_dict["__setstate__"], + ) = self._make_getstate_setstate() + + def __repr__(self): + return f"<_ClassBuilder(cls={self._cls.__name__})>" + + def build_class(self): + """ + Finalize class based on the accumulated configuration. + + Builder cannot be used after calling this method. + """ + if self._slots is True: + cls = self._create_slots_class() + else: + cls = self._patch_original_class() + if PY_3_10_PLUS: + cls = abc.update_abstractmethods(cls) + + # The method gets only called if it's not inherited from a base class. + # _has_own_attribute does NOT work properly for classmethods. + if ( + getattr(cls, "__attrs_init_subclass__", None) + and "__attrs_init_subclass__" not in cls.__dict__ + ): + cls.__attrs_init_subclass__() + + return cls + + def _patch_original_class(self): + """ + Apply accumulated methods and return the class. + """ + cls = self._cls + base_names = self._base_names + + # Clean class of attribute definitions (`attr.ib()`s). + if self._delete_attribs: + for name in self._attr_names: + if ( + name not in base_names + and getattr(cls, name, _SENTINEL) is not _SENTINEL + ): + # An AttributeError can happen if a base class defines a + # class variable and we want to set an attribute with the + # same name by using only a type annotation. + with contextlib.suppress(AttributeError): + delattr(cls, name) + + # Attach our dunder methods. + for name, value in self._cls_dict.items(): + setattr(cls, name, value) + + # If we've inherited an attrs __setattr__ and don't write our own, + # reset it to object's. + if not self._wrote_own_setattr and getattr( + cls, "__attrs_own_setattr__", False + ): + cls.__attrs_own_setattr__ = False + + if not self._has_custom_setattr: + cls.__setattr__ = _OBJ_SETATTR + + return cls + + def _create_slots_class(self): + """ + Build and return a new class with a `__slots__` attribute. + """ + cd = { + k: v + for k, v in self._cls_dict.items() + if k not in (*tuple(self._attr_names), "__dict__", "__weakref__") + } + + # If our class doesn't have its own implementation of __setattr__ + # (either from the user or by us), check the bases, if one of them has + # an attrs-made __setattr__, that needs to be reset. We don't walk the + # MRO because we only care about our immediate base classes. + # XXX: This can be confused by subclassing a slotted attrs class with + # XXX: a non-attrs class and subclass the resulting class with an attrs + # XXX: class. See `test_slotted_confused` for details. For now that's + # XXX: OK with us. + if not self._wrote_own_setattr: + cd["__attrs_own_setattr__"] = False + + if not self._has_custom_setattr: + for base_cls in self._cls.__bases__: + if base_cls.__dict__.get("__attrs_own_setattr__", False): + cd["__setattr__"] = _OBJ_SETATTR + break + + # Traverse the MRO to collect existing slots + # and check for an existing __weakref__. + existing_slots = {} + weakref_inherited = False + for base_cls in self._cls.__mro__[1:-1]: + if base_cls.__dict__.get("__weakref__", None) is not None: + weakref_inherited = True + existing_slots.update( + { + name: getattr(base_cls, name) + for name in getattr(base_cls, "__slots__", []) + } + ) + + base_names = set(self._base_names) + + names = self._attr_names + if ( + self._weakref_slot + and "__weakref__" not in getattr(self._cls, "__slots__", ()) + and "__weakref__" not in names + and not weakref_inherited + ): + names += ("__weakref__",) + + if PY_3_8_PLUS: + cached_properties = { + name: cached_property.func + for name, cached_property in cd.items() + if isinstance(cached_property, functools.cached_property) + } + else: + # `functools.cached_property` was introduced in 3.8. + # So can't be used before this. + cached_properties = {} + + # Collect methods with a `__class__` reference that are shadowed in the new class. + # To know to update them. + additional_closure_functions_to_update = [] + if cached_properties: + class_annotations = _get_annotations(self._cls) + for name, func in cached_properties.items(): + # Add cached properties to names for slotting. + names += (name,) + # Clear out function from class to avoid clashing. + del cd[name] + additional_closure_functions_to_update.append(func) + annotation = inspect.signature(func).return_annotation + if annotation is not inspect.Parameter.empty: + class_annotations[name] = annotation + + original_getattr = cd.get("__getattr__") + if original_getattr is not None: + additional_closure_functions_to_update.append(original_getattr) + + cd["__getattr__"] = _make_cached_property_getattr( + cached_properties, original_getattr, self._cls + ) + + # We only add the names of attributes that aren't inherited. + # Setting __slots__ to inherited attributes wastes memory. + slot_names = [name for name in names if name not in base_names] + + # There are slots for attributes from current class + # that are defined in parent classes. + # As their descriptors may be overridden by a child class, + # we collect them here and update the class dict + reused_slots = { + slot: slot_descriptor + for slot, slot_descriptor in existing_slots.items() + if slot in slot_names + } + slot_names = [name for name in slot_names if name not in reused_slots] + cd.update(reused_slots) + if self._cache_hash: + slot_names.append(_HASH_CACHE_FIELD) + + cd["__slots__"] = tuple(slot_names) + + cd["__qualname__"] = self._cls.__qualname__ + + # Create new class based on old class and our methods. + cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) + + # The following is a fix for + # . + # If a method mentions `__class__` or uses the no-arg super(), the + # compiler will bake a reference to the class in the method itself + # as `method.__closure__`. Since we replace the class with a + # clone, we rewrite these references so it keeps working. + for item in itertools.chain( + cls.__dict__.values(), additional_closure_functions_to_update + ): + if isinstance(item, (classmethod, staticmethod)): + # Class- and staticmethods hide their functions inside. + # These might need to be rewritten as well. + closure_cells = getattr(item.__func__, "__closure__", None) + elif isinstance(item, property): + # Workaround for property `super()` shortcut (PY3-only). + # There is no universal way for other descriptors. + closure_cells = getattr(item.fget, "__closure__", None) + else: + closure_cells = getattr(item, "__closure__", None) + + if not closure_cells: # Catch None or the empty list. + continue + for cell in closure_cells: + try: + match = cell.cell_contents is self._cls + except ValueError: # noqa: PERF203 + # ValueError: Cell is empty + pass + else: + if match: + cell.cell_contents = cls + return cls + + def add_repr(self, ns): + self._cls_dict["__repr__"] = self._add_method_dunders( + _make_repr(self._attrs, ns, self._cls) + ) + return self + + def add_str(self): + repr = self._cls_dict.get("__repr__") + if repr is None: + msg = "__str__ can only be generated if a __repr__ exists." + raise ValueError(msg) + + def __str__(self): + return self.__repr__() + + self._cls_dict["__str__"] = self._add_method_dunders(__str__) + return self + + def _make_getstate_setstate(self): + """ + Create custom __setstate__ and __getstate__ methods. + """ + # __weakref__ is not writable. + state_attr_names = tuple( + an for an in self._attr_names if an != "__weakref__" + ) + + def slots_getstate(self): + """ + Automatically created by attrs. + """ + return {name: getattr(self, name) for name in state_attr_names} + + hash_caching_enabled = self._cache_hash + + def slots_setstate(self, state): + """ + Automatically created by attrs. + """ + __bound_setattr = _OBJ_SETATTR.__get__(self) + if isinstance(state, tuple): + # Backward compatibility with attrs instances pickled with + # attrs versions before v22.2.0 which stored tuples. + for name, value in zip(state_attr_names, state): + __bound_setattr(name, value) + else: + for name in state_attr_names: + if name in state: + __bound_setattr(name, state[name]) + + # The hash code cache is not included when the object is + # serialized, but it still needs to be initialized to None to + # indicate that the first call to __hash__ should be a cache + # miss. + if hash_caching_enabled: + __bound_setattr(_HASH_CACHE_FIELD, None) + + return slots_getstate, slots_setstate + + def make_unhashable(self): + self._cls_dict["__hash__"] = None + return self + + def add_hash(self): + self._cls_dict["__hash__"] = self._add_method_dunders( + _make_hash( + self._cls, + self._attrs, + frozen=self._frozen, + cache_hash=self._cache_hash, + ) + ) + + return self + + def add_init(self): + self._cls_dict["__init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=False, + ) + ) + + return self + + def add_match_args(self): + self._cls_dict["__match_args__"] = tuple( + field.name + for field in self._attrs + if field.init and not field.kw_only + ) + + def add_attrs_init(self): + self._cls_dict["__attrs_init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=True, + ) + ) + + return self + + def add_eq(self): + cd = self._cls_dict + + cd["__eq__"] = self._add_method_dunders( + _make_eq(self._cls, self._attrs) + ) + cd["__ne__"] = self._add_method_dunders(_make_ne()) + + return self + + def add_order(self): + cd = self._cls_dict + + cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( + self._add_method_dunders(meth) + for meth in _make_order(self._cls, self._attrs) + ) + + return self + + def add_setattr(self): + if self._frozen: + return self + + sa_attrs = {} + for a in self._attrs: + on_setattr = a.on_setattr or self._on_setattr + if on_setattr and on_setattr is not setters.NO_OP: + sa_attrs[a.name] = a, on_setattr + + if not sa_attrs: + return self + + if self._has_custom_setattr: + # We need to write a __setattr__ but there already is one! + msg = "Can't combine custom __setattr__ with on_setattr hooks." + raise ValueError(msg) + + # docstring comes from _add_method_dunders + def __setattr__(self, name, val): + try: + a, hook = sa_attrs[name] + except KeyError: + nval = val + else: + nval = hook(self, a, val) + + _OBJ_SETATTR(self, name, nval) + + self._cls_dict["__attrs_own_setattr__"] = True + self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) + self._wrote_own_setattr = True + + return self + + def _add_method_dunders(self, method): + """ + Add __module__ and __qualname__ to a *method* if possible. + """ + with contextlib.suppress(AttributeError): + method.__module__ = self._cls.__module__ + + with contextlib.suppress(AttributeError): + method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" + + with contextlib.suppress(AttributeError): + method.__doc__ = ( + "Method generated by attrs for class " + f"{self._cls.__qualname__}." + ) + + return method + + +def _determine_attrs_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + return cmp, cmp + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq = default_eq + + if order is None: + order = eq + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, order + + +def _determine_attrib_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + def decide_callable_or_boolean(value): + """ + Decide whether a key function is used. + """ + if callable(value): + value, key = True, value + else: + key = None + return value, key + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + cmp, cmp_key = decide_callable_or_boolean(cmp) + return cmp, cmp_key, cmp, cmp_key + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq, eq_key = default_eq, None + else: + eq, eq_key = decide_callable_or_boolean(eq) + + if order is None: + order, order_key = eq, eq_key + else: + order, order_key = decide_callable_or_boolean(order) + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, eq_key, order, order_key + + +def _determine_whether_to_implement( + cls, flag, auto_detect, dunders, default=True +): + """ + Check whether we should implement a set of methods for *cls*. + + *flag* is the argument passed into @attr.s like 'init', *auto_detect* the + same as passed into @attr.s and *dunders* is a tuple of attribute names + whose presence signal that the user has implemented it themselves. + + Return *default* if no reason for either for or against is found. + """ + if flag is True or flag is False: + return flag + + if flag is None and auto_detect is False: + return default + + # Logically, flag is None and auto_detect is True here. + for dunder in dunders: + if _has_own_attribute(cls, dunder): + return False + + return default + + +def attrs( + maybe_cls=None, + these=None, + repr_ns=None, + repr=None, + cmp=None, + hash=None, + init=None, + slots=False, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=False, + kw_only=False, + cache_hash=False, + auto_exc=False, + eq=None, + order=None, + auto_detect=False, + collect_by_mro=False, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, + unsafe_hash=None, +): + r""" + A class decorator that adds :term:`dunder methods` according to the + specified attributes using `attr.ib` or the *these* argument. + + Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will + *never* go away, though). + + Args: + repr_ns (str): + When using nested classes, there was no way in Python 2 to + automatically detect that. This argument allows to set a custom + name for a more meaningful ``repr`` output. This argument is + pointless in Python 3 and is therefore deprecated. + + .. caution:: + Refer to `attrs.define` for the rest of the parameters, but note that they + can have different defaults. + + Notably, leaving *on_setattr* as `None` will **not** add any hooks. + + .. versionadded:: 16.0.0 *slots* + .. versionadded:: 16.1.0 *frozen* + .. versionadded:: 16.3.0 *str* + .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. + .. versionchanged:: 17.1.0 + *hash* supports `None` as value which is also the default now. + .. versionadded:: 17.3.0 *auto_attribs* + .. versionchanged:: 18.1.0 + If *these* is passed, no attributes are deleted from the class body. + .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. + .. versionadded:: 18.2.0 *weakref_slot* + .. deprecated:: 18.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a + `DeprecationWarning` if the classes compared are subclasses of + each other. ``__eq`` and ``__ne__`` never tried to compared subclasses + to each other. + .. versionchanged:: 19.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider + subclasses comparable anymore. + .. versionadded:: 18.2.0 *kw_only* + .. versionadded:: 18.2.0 *cache_hash* + .. versionadded:: 19.1.0 *auto_exc* + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *auto_detect* + .. versionadded:: 20.1.0 *collect_by_mro* + .. versionadded:: 20.1.0 *getstate_setstate* + .. versionadded:: 20.1.0 *on_setattr* + .. versionadded:: 20.3.0 *field_transformer* + .. versionchanged:: 21.1.0 + ``init=False`` injects ``__attrs_init__`` + .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 21.3.0 *match_args* + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. deprecated:: 24.1.0 *repr_ns* + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + """ + if repr_ns is not None: + import warnings + + warnings.warn( + DeprecationWarning( + "The `repr_ns` argument is deprecated and will be removed in or after August 2025." + ), + stacklevel=2, + ) + + eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) + + # unsafe_hash takes precedence due to PEP 681. + if unsafe_hash is not None: + hash = unsafe_hash + + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + def wrap(cls): + is_frozen = frozen or _has_frozen_base_class(cls) + is_exc = auto_exc is True and issubclass(cls, BaseException) + has_own_setattr = auto_detect and _has_own_attribute( + cls, "__setattr__" + ) + + if has_own_setattr and is_frozen: + msg = "Can't freeze a class with a custom __setattr__." + raise ValueError(msg) + + builder = _ClassBuilder( + cls, + these, + slots, + is_frozen, + weakref_slot, + _determine_whether_to_implement( + cls, + getstate_setstate, + auto_detect, + ("__getstate__", "__setstate__"), + default=slots, + ), + auto_attribs, + kw_only, + cache_hash, + is_exc, + collect_by_mro, + on_setattr, + has_own_setattr, + field_transformer, + ) + if _determine_whether_to_implement( + cls, repr, auto_detect, ("__repr__",) + ): + builder.add_repr(repr_ns) + if str is True: + builder.add_str() + + eq = _determine_whether_to_implement( + cls, eq_, auto_detect, ("__eq__", "__ne__") + ) + if not is_exc and eq is True: + builder.add_eq() + if not is_exc and _determine_whether_to_implement( + cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") + ): + builder.add_order() + + builder.add_setattr() + + nonlocal hash + if ( + hash is None + and auto_detect is True + and _has_own_attribute(cls, "__hash__") + ): + hash = False + + if hash is not True and hash is not False and hash is not None: + # Can't use `hash in` because 1 == True for example. + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + if hash is False or (hash is None and eq is False) or is_exc: + # Don't do anything. Should fall back to __object__'s __hash__ + # which is by id. + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." + raise TypeError(msg) + elif hash is True or ( + hash is None and eq is True and is_frozen is True + ): + # Build a __hash__ if told so, or if it's safe. + builder.add_hash() + else: + # Raise TypeError on attempts to hash. + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." + raise TypeError(msg) + builder.make_unhashable() + + if _determine_whether_to_implement( + cls, init, auto_detect, ("__init__",) + ): + builder.add_init() + else: + builder.add_attrs_init() + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, init must be True." + raise TypeError(msg) + + if ( + PY_3_10_PLUS + and match_args + and not _has_own_attribute(cls, "__match_args__") + ): + builder.add_match_args() + + return builder.build_class() + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +_attrs = attrs +""" +Internal alias so we can use it in functions that take an argument called +*attrs*. +""" + + +def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return cls.__setattr__ is _frozen_setattrs + + +def _generate_unique_filename(cls, func_name): + """ + Create a "filename" suitable for a function being generated. + """ + return ( + f"" + ) + + +def _make_hash(cls, attrs, frozen, cache_hash): + attrs = tuple( + a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) + ) + + tab = " " + + unique_filename = _generate_unique_filename(cls, "hash") + type_hash = hash(unique_filename) + # If eq is custom generated, we need to include the functions in globs + globs = {} + + hash_def = "def __hash__(self" + hash_func = "hash((" + closing_braces = "))" + if not cache_hash: + hash_def += "):" + else: + hash_def += ", *" + + hash_def += ", _cache_wrapper=__import__('attr._make')._make._CacheHashWrapper):" + hash_func = "_cache_wrapper(" + hash_func + closing_braces += ")" + + method_lines = [hash_def] + + def append_hash_computation_lines(prefix, indent): + """ + Generate the code for actually computing the hash code. + Below this will either be returned directly or used to compute + a value which is then cached, depending on the value of cache_hash + """ + + method_lines.extend( + [ + indent + prefix + hash_func, + indent + f" {type_hash},", + ] + ) + + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + globs[cmp_name] = a.eq_key + method_lines.append( + indent + f" {cmp_name}(self.{a.name})," + ) + else: + method_lines.append(indent + f" self.{a.name},") + + method_lines.append(indent + " " + closing_braces) + + if cache_hash: + method_lines.append(tab + f"if self.{_HASH_CACHE_FIELD} is None:") + if frozen: + append_hash_computation_lines( + f"object.__setattr__(self, '{_HASH_CACHE_FIELD}', ", tab * 2 + ) + method_lines.append(tab * 2 + ")") # close __setattr__ + else: + append_hash_computation_lines( + f"self.{_HASH_CACHE_FIELD} = ", tab * 2 + ) + method_lines.append(tab + f"return self.{_HASH_CACHE_FIELD}") + else: + append_hash_computation_lines("return ", tab) + + script = "\n".join(method_lines) + return _make_method("__hash__", script, unique_filename, globs) + + +def _add_hash(cls, attrs): + """ + Add a hash method to *cls*. + """ + cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False) + return cls + + +def _make_ne(): + """ + Create __ne__ method. + """ + + def __ne__(self, other): + """ + Check equality and either forward a NotImplemented or + return the result negated. + """ + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + + return not result + + return __ne__ + + +def _make_eq(cls, attrs): + """ + Create __eq__ method for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.eq] + + unique_filename = _generate_unique_filename(cls, "eq") + lines = [ + "def __eq__(self, other):", + " if other.__class__ is not self.__class__:", + " return NotImplemented", + ] + + # We can't just do a big self.x = other.x and... clause due to + # irregularities like nan == nan is false but (nan,) == (nan,) is true. + globs = {} + if attrs: + lines.append(" return (") + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + # Add the key function to the global namespace + # of the evaluated function. + globs[cmp_name] = a.eq_key + lines.append( + f" {cmp_name}(self.{a.name}) == {cmp_name}(other.{a.name})" + ) + else: + lines.append(f" self.{a.name} == other.{a.name}") + if a is not attrs[-1]: + lines[-1] = f"{lines[-1]} and" + lines.append(" )") + else: + lines.append(" return True") + + script = "\n".join(lines) + + return _make_method("__eq__", script, unique_filename, globs) + + +def _make_order(cls, attrs): + """ + Create ordering methods for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.order] + + def attrs_to_tuple(obj): + """ + Save us some typing. + """ + return tuple( + key(value) if key else value + for value, key in ( + (getattr(obj, a.name), a.order_key) for a in attrs + ) + ) + + def __lt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) < attrs_to_tuple(other) + + return NotImplemented + + def __le__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) <= attrs_to_tuple(other) + + return NotImplemented + + def __gt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) > attrs_to_tuple(other) + + return NotImplemented + + def __ge__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) >= attrs_to_tuple(other) + + return NotImplemented + + return __lt__, __le__, __gt__, __ge__ + + +def _add_eq(cls, attrs=None): + """ + Add equality methods to *cls* with *attrs*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__eq__ = _make_eq(cls, attrs) + cls.__ne__ = _make_ne() + + return cls + + +def _make_repr(attrs, ns, cls): + unique_filename = _generate_unique_filename(cls, "repr") + # Figure out which attributes to include, and which function to use to + # format them. The a.repr value can be either bool or a custom + # callable. + attr_names_with_reprs = tuple( + (a.name, (repr if a.repr is True else a.repr), a.init) + for a in attrs + if a.repr is not False + ) + globs = { + name + "_repr": r for name, r, _ in attr_names_with_reprs if r != repr + } + globs["_compat"] = _compat + globs["AttributeError"] = AttributeError + globs["NOTHING"] = NOTHING + attribute_fragments = [] + for name, r, i in attr_names_with_reprs: + accessor = ( + "self." + name if i else 'getattr(self, "' + name + '", NOTHING)' + ) + fragment = ( + "%s={%s!r}" % (name, accessor) + if r == repr + else "%s={%s_repr(%s)}" % (name, name, accessor) + ) + attribute_fragments.append(fragment) + repr_fragment = ", ".join(attribute_fragments) + + if ns is None: + cls_name_fragment = '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' + else: + cls_name_fragment = ns + ".{self.__class__.__name__}" + + lines = [ + "def __repr__(self):", + " try:", + " already_repring = _compat.repr_context.already_repring", + " except AttributeError:", + " already_repring = {id(self),}", + " _compat.repr_context.already_repring = already_repring", + " else:", + " if id(self) in already_repring:", + " return '...'", + " else:", + " already_repring.add(id(self))", + " try:", + f" return f'{cls_name_fragment}({repr_fragment})'", + " finally:", + " already_repring.remove(id(self))", + ] + + return _make_method( + "__repr__", "\n".join(lines), unique_filename, globs=globs + ) + + +def _add_repr(cls, ns=None, attrs=None): + """ + Add a repr method to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__repr__ = _make_repr(attrs, ns, cls) + return cls + + +def fields(cls): + """ + Return the tuple of *attrs* attributes for a class. + + The tuple also allows accessing the fields by their names (see below for + examples). + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + tuple (with name accessors) of `attrs.Attribute` + + .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields + by name. + .. versionchanged:: 23.1.0 Add support for generic classes. + """ + generic_base = get_generic_base(cls) + + if generic_base is None and not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + + attrs = getattr(cls, "__attrs_attrs__", None) + + if attrs is None: + if generic_base is not None: + attrs = getattr(generic_base, "__attrs_attrs__", None) + if attrs is not None: + # Even though this is global state, stick it on here to speed + # it up. We rely on `cls` being cached for this to be + # efficient. + cls.__attrs_attrs__ = attrs + return attrs + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + + return attrs + + +def fields_dict(cls): + """ + Return an ordered dictionary of *attrs* attributes for a class, whose keys + are the attribute names. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + dict[str, attrs.Attribute]: Dict of attribute name to definition + + .. versionadded:: 18.1.0 + """ + if not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + return {a.name: a for a in attrs} + + +def validate(inst): + """ + Validate all attributes on *inst* that have a validator. + + Leaves all exceptions through. + + Args: + inst: Instance of a class with *attrs* attributes. + """ + if _config._run_validators is False: + return + + for a in fields(inst.__class__): + v = a.validator + if v is not None: + v(inst, a, getattr(inst, a.name)) + + +def _is_slot_attr(a_name, base_attr_map): + """ + Check if the attribute name comes from a slot class. + """ + cls = base_attr_map.get(a_name) + return cls and "__slots__" in cls.__dict__ + + +def _make_init( + cls, + attrs, + pre_init, + pre_init_has_args, + post_init, + frozen, + slots, + cache_hash, + base_attr_map, + is_exc, + cls_on_setattr, + attrs_init, +): + has_cls_on_setattr = ( + cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP + ) + + if frozen and has_cls_on_setattr: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = cache_hash or frozen + filtered_attrs = [] + attr_dict = {} + for a in attrs: + if not a.init and a.default is NOTHING: + continue + + filtered_attrs.append(a) + attr_dict[a.name] = a + + if a.on_setattr is not None: + if frozen is True: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = True + elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: + needs_cached_setattr = True + + unique_filename = _generate_unique_filename(cls, "init") + + script, globs, annotations = _attrs_to_init_script( + filtered_attrs, + frozen, + slots, + pre_init, + pre_init_has_args, + post_init, + cache_hash, + base_attr_map, + is_exc, + needs_cached_setattr, + has_cls_on_setattr, + "__attrs_init__" if attrs_init else "__init__", + ) + if cls.__module__ in sys.modules: + # This makes typing.get_type_hints(CLS.__init__) resolve string types. + globs.update(sys.modules[cls.__module__].__dict__) + + globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) + + if needs_cached_setattr: + # Save the lookup overhead in __init__ if we need to circumvent + # setattr hooks. + globs["_cached_setattr_get"] = _OBJ_SETATTR.__get__ + + init = _make_method( + "__attrs_init__" if attrs_init else "__init__", + script, + unique_filename, + globs, + ) + init.__annotations__ = annotations + + return init + + +def _setattr(attr_name: str, value_var: str, has_on_setattr: bool) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*. + """ + return f"_setattr('{attr_name}', {value_var})" + + +def _setattr_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*, but run + its converter first. + """ + return f"_setattr('{attr_name}', {converter._fmt_converter_call(attr_name, value_var)})" + + +def _assign(attr_name: str, value: str, has_on_setattr: bool) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise + relegate to _setattr. + """ + if has_on_setattr: + return _setattr(attr_name, value, True) + + return f"self.{attr_name} = {value}" + + +def _assign_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment after + conversion. Otherwise relegate to _setattr_with_converter. + """ + if has_on_setattr: + return _setattr_with_converter(attr_name, value_var, True, converter) + + return f"self.{attr_name} = {converter._fmt_converter_call(attr_name, value_var)}" + + +def _determine_setters( + frozen: bool, slots: bool, base_attr_map: dict[str, type] +): + """ + Determine the correct setter functions based on whether a class is frozen + and/or slotted. + """ + if frozen is True: + if slots is True: + return (), _setattr, _setattr_with_converter + + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + + def fmt_setter( + attr_name: str, value_var: str, has_on_setattr: bool + ) -> str: + if _is_slot_attr(attr_name, base_attr_map): + return _setattr(attr_name, value_var, has_on_setattr) + + return f"_inst_dict['{attr_name}'] = {value_var}" + + def fmt_setter_with_converter( + attr_name: str, + value_var: str, + has_on_setattr: bool, + converter: Converter, + ) -> str: + if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): + return _setattr_with_converter( + attr_name, value_var, has_on_setattr, converter + ) + + return f"_inst_dict['{attr_name}'] = {converter._fmt_converter_call(attr_name, value_var)}" + + return ( + ("_inst_dict = self.__dict__",), + fmt_setter, + fmt_setter_with_converter, + ) + + # Not frozen -- we can just assign directly. + return (), _assign, _assign_with_converter + + +def _attrs_to_init_script( + attrs: list[Attribute], + is_frozen: bool, + is_slotted: bool, + call_pre_init: bool, + pre_init_has_args: bool, + call_post_init: bool, + does_cache_hash: bool, + base_attr_map: dict[str, type], + is_exc: bool, + needs_cached_setattr: bool, + has_cls_on_setattr: bool, + method_name: str, +) -> tuple[str, dict, dict]: + """ + Return a script of an initializer for *attrs*, a dict of globals, and + annotations for the initializer. + + The globals are required by the generated script. + """ + lines = ["self.__attrs_pre_init__()"] if call_pre_init else [] + + if needs_cached_setattr: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup per + # assignment. Note _setattr will be used again below if + # does_cache_hash is True. + "_setattr = _cached_setattr_get(self)" + ) + + extra_lines, fmt_setter, fmt_setter_with_converter = _determine_setters( + is_frozen, is_slotted, base_attr_map + ) + lines.extend(extra_lines) + + args = [] + kw_only_args = [] + attrs_to_validate = [] + + # This is a dictionary of names to validator and converter callables. + # Injecting this into __init__ globals lets us avoid lookups. + names_for_globals = {} + annotations = {"return": None} + + for a in attrs: + if a.validator: + attrs_to_validate.append(a) + + attr_name = a.name + has_on_setattr = a.on_setattr is not None or ( + a.on_setattr is not setters.NO_OP and has_cls_on_setattr + ) + # a.alias is set to maybe-mangled attr_name in _ClassBuilder if not + # explicitly provided + arg_name = a.alias + + has_factory = isinstance(a.default, Factory) + maybe_self = "self" if has_factory and a.default.takes_self else "" + + if a.converter and not isinstance(a.converter, Converter): + converter = Converter(a.converter) + else: + converter = a.converter + + if a.init is False: + if has_factory: + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + elif converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + ) + ) + elif a.default is not NOTHING and not has_factory: + arg = f"{arg_name}=attr_dict['{attr_name}'].default" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + elif has_factory: + arg = f"{arg_name}=NOTHING" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + lines.append(f"if {arg_name} is not NOTHING:") + + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + " " + + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter_with_converter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + " " + fmt_setter(attr_name, arg_name, has_on_setattr) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.kw_only: + kw_only_args.append(arg_name) + else: + args.append(arg_name) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + if a.init is True: + if a.type is not None and converter is None: + annotations[arg_name] = a.type + elif converter is not None and converter._first_param_type: + # Use the type from the converter if present. + annotations[arg_name] = converter._first_param_type + + if attrs_to_validate: # we can skip this if there are no validators. + names_for_globals["_config"] = _config + lines.append("if _config._run_validators is True:") + for a in attrs_to_validate: + val_name = "__attr_validator_" + a.name + attr_name = "__attr_" + a.name + lines.append(f" {val_name}(self, {attr_name}, self.{a.name})") + names_for_globals[val_name] = a.validator + names_for_globals[attr_name] = a + + if call_post_init: + lines.append("self.__attrs_post_init__()") + + # Because this is set only after __attrs_post_init__ is called, a crash + # will result if post-init tries to access the hash code. This seemed + # preferable to setting this beforehand, in which case alteration to field + # values during post-init combined with post-init accessing the hash code + # would result in silent bugs. + if does_cache_hash: + if is_frozen: + if is_slotted: + init_hash_cache = f"_setattr('{_HASH_CACHE_FIELD}', None)" + else: + init_hash_cache = f"_inst_dict['{_HASH_CACHE_FIELD}'] = None" + else: + init_hash_cache = f"self.{_HASH_CACHE_FIELD} = None" + lines.append(init_hash_cache) + + # For exceptions we rely on BaseException.__init__ for proper + # initialization. + if is_exc: + vals = ",".join(f"self.{a.name}" for a in attrs if a.init) + + lines.append(f"BaseException.__init__(self, {vals})") + + args = ", ".join(args) + pre_init_args = args + if kw_only_args: + # leading comma & kw_only args + args += f"{', ' if args else ''}*, {', '.join(kw_only_args)}" + pre_init_kw_only_args = ", ".join( + [ + f"{kw_arg_name}={kw_arg_name}" + # We need to remove the defaults from the kw_only_args. + for kw_arg_name in (kwa.split("=")[0] for kwa in kw_only_args) + ] + ) + pre_init_args += ", " if pre_init_args else "" + pre_init_args += pre_init_kw_only_args + + if call_pre_init and pre_init_has_args: + # If pre init method has arguments, pass same arguments as `__init__`. + lines[0] = f"self.__attrs_pre_init__({pre_init_args})" + + # Python 3.7 doesn't allow backslashes in f strings. + NL = "\n " + return ( + f"""def {method_name}(self, {args}): + {NL.join(lines) if lines else 'pass'} +""", + names_for_globals, + annotations, + ) + + +def _default_init_alias_for(name: str) -> str: + """ + The default __init__ parameter name for a field. + + This performs private-name adjustment via leading-unscore stripping, + and is the default value of Attribute.alias if not provided. + """ + + return name.lstrip("_") + + +class Attribute: + """ + *Read-only* representation of an attribute. + + .. warning:: + + You should never instantiate this class yourself. + + The class has *all* arguments of `attr.ib` (except for ``factory`` which is + only syntactic sugar for ``default=Factory(...)`` plus the following: + + - ``name`` (`str`): The name of the attribute. + - ``alias`` (`str`): The __init__ parameter name of the attribute, after + any explicit overrides and default private-attribute-name handling. + - ``inherited`` (`bool`): Whether or not that attribute has been inherited + from a base class. + - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The + callables that are used for comparing and ordering objects by this + attribute, respectively. These are set by passing a callable to + `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also + :ref:`comparison customization `. + + Instances of this class are frequently used for introspection purposes + like: + + - `fields` returns a tuple of them. + - Validators get them passed as the first argument. + - The :ref:`field transformer ` hook receives a list of + them. + - The ``alias`` property exposes the __init__ parameter name of the field, + with any overrides and default private-attribute handling applied. + + + .. versionadded:: 20.1.0 *inherited* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.2.0 *inherited* is not taken into account for + equality checks and hashing anymore. + .. versionadded:: 21.1.0 *eq_key* and *order_key* + .. versionadded:: 22.2.0 *alias* + + For the full version history of the fields, see `attr.ib`. + """ + + __slots__ = ( + "name", + "default", + "validator", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "type", + "converter", + "kw_only", + "inherited", + "on_setattr", + "alias", + ) + + def __init__( + self, + name, + default, + validator, + repr, + cmp, # XXX: unused, remove along with other cmp code. + hash, + init, + inherited, + metadata=None, + type=None, + converter=None, + kw_only=False, + eq=None, + eq_key=None, + order=None, + order_key=None, + on_setattr=None, + alias=None, + ): + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq_key or eq, order_key or order, True + ) + + # Cache this descriptor here to speed things up later. + bound_setattr = _OBJ_SETATTR.__get__(self) + + # Despite the big red warning, people *do* instantiate `Attribute` + # themselves. + bound_setattr("name", name) + bound_setattr("default", default) + bound_setattr("validator", validator) + bound_setattr("repr", repr) + bound_setattr("eq", eq) + bound_setattr("eq_key", eq_key) + bound_setattr("order", order) + bound_setattr("order_key", order_key) + bound_setattr("hash", hash) + bound_setattr("init", init) + bound_setattr("converter", converter) + bound_setattr( + "metadata", + ( + types.MappingProxyType(dict(metadata)) # Shallow copy + if metadata + else _EMPTY_METADATA_SINGLETON + ), + ) + bound_setattr("type", type) + bound_setattr("kw_only", kw_only) + bound_setattr("inherited", inherited) + bound_setattr("on_setattr", on_setattr) + bound_setattr("alias", alias) + + def __setattr__(self, name, value): + raise FrozenInstanceError() + + @classmethod + def from_counting_attr(cls, name, ca, type=None): + # type holds the annotated value. deal with conflicts: + if type is None: + type = ca.type + elif ca.type is not None: + msg = "Type annotation and type argument cannot both be present" + raise ValueError(msg) + inst_dict = { + k: getattr(ca, k) + for k in Attribute.__slots__ + if k + not in ( + "name", + "validator", + "default", + "type", + "inherited", + ) # exclude methods and deprecated alias + } + return cls( + name=name, + validator=ca._validator, + default=ca._default, + type=type, + cmp=None, + inherited=False, + **inst_dict, + ) + + # Don't use attrs.evolve since fields(Attribute) doesn't work + def evolve(self, **changes): + """ + Copy *self* and apply *changes*. + + This works similarly to `attrs.evolve` but that function does not work + with {class}`Attribute`. + + It is mainly meant to be used for `transform-fields`. + + .. versionadded:: 20.3.0 + """ + new = copy.copy(self) + + new._setattrs(changes.items()) + + return new + + # Don't use _add_pickle since fields(Attribute) doesn't work + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple( + getattr(self, name) if name != "metadata" else dict(self.metadata) + for name in self.__slots__ + ) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + self._setattrs(zip(self.__slots__, state)) + + def _setattrs(self, name_values_pairs): + bound_setattr = _OBJ_SETATTR.__get__(self) + for name, value in name_values_pairs: + if name != "metadata": + bound_setattr(name, value) + else: + bound_setattr( + name, + ( + types.MappingProxyType(dict(value)) + if value + else _EMPTY_METADATA_SINGLETON + ), + ) + + +_a = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=(name != "metadata"), + init=True, + inherited=False, + alias=_default_init_alias_for(name), + ) + for name in Attribute.__slots__ +] + +Attribute = _add_hash( + _add_eq( + _add_repr(Attribute, attrs=_a), + attrs=[a for a in _a if a.name != "inherited"], + ), + attrs=[a for a in _a if a.hash and a.name != "inherited"], +) + + +class _CountingAttr: + """ + Intermediate representation of attributes that uses a counter to preserve + the order in which the attributes have been defined. + + *Internal* data structure of the attrs library. Running into is most + likely the result of a bug like a forgotten `@attr.s` decorator. + """ + + __slots__ = ( + "counter", + "_default", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "_validator", + "converter", + "type", + "kw_only", + "on_setattr", + "alias", + ) + __attrs_attrs__ = ( + *tuple( + Attribute( + name=name, + alias=_default_init_alias_for(name), + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=True, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ) + for name in ( + "counter", + "_default", + "repr", + "eq", + "order", + "hash", + "init", + "on_setattr", + "alias", + ) + ), + Attribute( + name="metadata", + alias="metadata", + default=None, + validator=None, + repr=True, + cmp=None, + hash=False, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ), + ) + cls_counter = 0 + + def __init__( + self, + default, + validator, + repr, + cmp, + hash, + init, + converter, + metadata, + type, + kw_only, + eq, + eq_key, + order, + order_key, + on_setattr, + alias, + ): + _CountingAttr.cls_counter += 1 + self.counter = _CountingAttr.cls_counter + self._default = default + self._validator = validator + self.converter = converter + self.repr = repr + self.eq = eq + self.eq_key = eq_key + self.order = order + self.order_key = order_key + self.hash = hash + self.init = init + self.metadata = metadata + self.type = type + self.kw_only = kw_only + self.on_setattr = on_setattr + self.alias = alias + + def validator(self, meth): + """ + Decorator that adds *meth* to the list of validators. + + Returns *meth* unchanged. + + .. versionadded:: 17.1.0 + """ + if self._validator is None: + self._validator = meth + else: + self._validator = and_(self._validator, meth) + return meth + + def default(self, meth): + """ + Decorator that allows to set the default for an attribute. + + Returns *meth* unchanged. + + Raises: + DefaultAlreadySetError: If default has been set before. + + .. versionadded:: 17.1.0 + """ + if self._default is not NOTHING: + raise DefaultAlreadySetError() + + self._default = Factory(meth, takes_self=True) + + return meth + + +_CountingAttr = _add_eq(_add_repr(_CountingAttr)) + + +class Factory: + """ + Stores a factory callable. + + If passed as the default value to `attrs.field`, the factory is used to + generate a new value. + + Args: + factory (typing.Callable): + A callable that takes either none or exactly one mandatory + positional argument depending on *takes_self*. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. + + .. versionadded:: 17.1.0 *takes_self* + """ + + __slots__ = ("factory", "takes_self") + + def __init__(self, factory, takes_self=False): + self.factory = factory + self.takes_self = takes_self + + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple(getattr(self, name) for name in self.__slots__) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + for name, value in zip(self.__slots__, state): + setattr(self, name, value) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in Factory.__slots__ +] + +Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) + + +class Converter: + """ + Stores a converter callable. + + Allows for the wrapped converter to take additional arguments. The + arguments are passed in the order they are documented. + + Args: + converter (Callable): A callable that converts the passed value. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. (default: `False`) + + takes_field (bool): + Pass the field definition (an :class:`Attribute`) into the + converter as a positional argument. (default: `False`) + + .. versionadded:: 24.1.0 + """ + + __slots__ = ( + "converter", + "takes_self", + "takes_field", + "_first_param_type", + "_global_name", + "__call__", + ) + + def __init__(self, converter, *, takes_self=False, takes_field=False): + self.converter = converter + self.takes_self = takes_self + self.takes_field = takes_field + + ex = _AnnotationExtractor(converter) + self._first_param_type = ex.get_first_param_type() + + if not (self.takes_self or self.takes_field): + self.__call__ = lambda value, _, __: self.converter(value) + elif self.takes_self and not self.takes_field: + self.__call__ = lambda value, instance, __: self.converter( + value, instance + ) + elif not self.takes_self and self.takes_field: + self.__call__ = lambda value, __, field: self.converter( + value, field + ) + else: + self.__call__ = lambda value, instance, field: self.converter( + value, instance, field + ) + + rt = ex.get_return_type() + if rt is not None: + self.__call__.__annotations__["return"] = rt + + @staticmethod + def _get_global_name(attr_name: str) -> str: + """ + Return the name that a converter for an attribute name *attr_name* + would have. + """ + return f"__attr_converter_{attr_name}" + + def _fmt_converter_call(self, attr_name: str, value_var: str) -> str: + """ + Return a string that calls the converter for an attribute name + *attr_name* and the value in variable named *value_var* according to + `self.takes_self` and `self.takes_field`. + """ + if not (self.takes_self or self.takes_field): + return f"{self._get_global_name(attr_name)}({value_var})" + + if self.takes_self and self.takes_field: + return f"{self._get_global_name(attr_name)}({value_var}, self, attr_dict['{attr_name}'])" + + if self.takes_self: + return f"{self._get_global_name(attr_name)}({value_var}, self)" + + return f"{self._get_global_name(attr_name)}({value_var}, attr_dict['{attr_name}'])" + + def __getstate__(self): + """ + Return a dict containing only converter and takes_self -- the rest gets + computed when loading. + """ + return { + "converter": self.converter, + "takes_self": self.takes_self, + "takes_field": self.takes_field, + } + + def __setstate__(self, state): + """ + Load instance from state. + """ + self.__init__(**state) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in ("converter", "takes_self", "takes_field") +] + +Converter = _add_hash( + _add_eq(_add_repr(Converter, attrs=_f), attrs=_f), attrs=_f +) + + +def make_class( + name, attrs, bases=(object,), class_body=None, **attributes_arguments +): + r""" + A quick way to create a new class called *name* with *attrs*. + + Args: + name (str): The name for the new class. + + attrs( list | dict): + A list of names or a dictionary of mappings of names to `attr.ib`\ + s / `attrs.field`\ s. + + The order is deduced from the order of the names or attributes + inside *attrs*. Otherwise the order of the definition of the + attributes is used. + + bases (tuple[type, ...]): Classes that the new class will subclass. + + class_body (dict): + An optional dictionary of class attributes for the new class. + + attributes_arguments: Passed unmodified to `attr.s`. + + Returns: + type: A new class with *attrs*. + + .. versionadded:: 17.1.0 *bases* + .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. + .. versionchanged:: 23.2.0 *class_body* + """ + if isinstance(attrs, dict): + cls_dict = attrs + elif isinstance(attrs, (list, tuple)): + cls_dict = {a: attrib() for a in attrs} + else: + msg = "attrs argument must be a dict or a list." + raise TypeError(msg) + + pre_init = cls_dict.pop("__attrs_pre_init__", None) + post_init = cls_dict.pop("__attrs_post_init__", None) + user_init = cls_dict.pop("__init__", None) + + body = {} + if class_body is not None: + body.update(class_body) + if pre_init is not None: + body["__attrs_pre_init__"] = pre_init + if post_init is not None: + body["__attrs_post_init__"] = post_init + if user_init is not None: + body["__init__"] = user_init + + type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) + + # For pickling to work, the __module__ variable needs to be set to the + # frame where the class is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython). + with contextlib.suppress(AttributeError, ValueError): + type_.__module__ = sys._getframe(1).f_globals.get( + "__name__", "__main__" + ) + + # We do it here for proper warnings with meaningful stacklevel. + cmp = attributes_arguments.pop("cmp", None) + ( + attributes_arguments["eq"], + attributes_arguments["order"], + ) = _determine_attrs_eq_order( + cmp, + attributes_arguments.get("eq"), + attributes_arguments.get("order"), + True, + ) + + cls = _attrs(these=cls_dict, **attributes_arguments)(type_) + # Only add type annotations now or "_attrs()" will complain: + cls.__annotations__ = { + k: v.type for k, v in cls_dict.items() if v.type is not None + } + return cls + + +# These are required by within this module so we define them here and merely +# import into .validators / .converters. + + +@attrs(slots=True, unsafe_hash=True) +class _AndValidator: + """ + Compose many validators to a single one. + """ + + _validators = attrib() + + def __call__(self, inst, attr, value): + for v in self._validators: + v(inst, attr, value) + + +def and_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + .. versionadded:: 17.1.0 + """ + vals = [] + for validator in validators: + vals.extend( + validator._validators + if isinstance(validator, _AndValidator) + else [validator] + ) + + return _AndValidator(tuple(vals)) + + +def pipe(*converters): + """ + A converter that composes multiple converters into one. + + When called on a value, it runs all wrapped converters, returning the + *last* value. + + Type annotations will be inferred from the wrapped converters', if they + have any. + + converters (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of converters. + + .. versionadded:: 20.1.0 + """ + + def pipe_converter(val, inst, field): + for c in converters: + val = c(val, inst, field) if isinstance(c, Converter) else c(val) + + return val + + if not converters: + # If the converter list is empty, pipe_converter is the identity. + A = typing.TypeVar("A") + pipe_converter.__annotations__.update({"val": A, "return": A}) + else: + # Get parameter type from first converter. + t = _AnnotationExtractor(converters[0]).get_first_param_type() + if t: + pipe_converter.__annotations__["val"] = t + + last = converters[-1] + if not PY_3_11_PLUS and isinstance(last, Converter): + last = last.__call__ + + # Get return type from last converter. + rt = _AnnotationExtractor(last).get_return_type() + if rt: + pipe_converter.__annotations__["return"] = rt + + return Converter(pipe_converter, takes_self=True, takes_field=True) diff --git a/myenv/lib/python3.12/site-packages/attr/_next_gen.py b/myenv/lib/python3.12/site-packages/attr/_next_gen.py new file mode 100644 index 0000000..dbb65cc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_next_gen.py @@ -0,0 +1,631 @@ +# SPDX-License-Identifier: MIT + +""" +These are keyword-only APIs that call `attr.s` and `attr.ib` with different +default values. +""" + + +from functools import partial + +from . import setters +from ._funcs import asdict as _asdict +from ._funcs import astuple as _astuple +from ._make import ( + _DEFAULT_ON_SETATTR, + NOTHING, + _frozen_setattrs, + attrib, + attrs, +) +from .exceptions import UnannotatedAttributeError + + +def define( + maybe_cls=None, + *, + these=None, + repr=None, + unsafe_hash=None, + hash=None, + init=None, + slots=True, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=None, + kw_only=False, + cache_hash=False, + auto_exc=True, + eq=None, + order=False, + auto_detect=True, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, +): + r""" + A class decorator that adds :term:`dunder methods` according to + :term:`fields ` specified using :doc:`type annotations `, + `field()` calls, or the *these* argument. + + Since *attrs* patches or replaces an existing class, you cannot use + `object.__init_subclass__` with *attrs* classes, because it runs too early. + As a replacement, you can define ``__attrs_init_subclass__`` on your class. + It will be called by *attrs* classes that subclass it after they're + created. See also :ref:`init-subclass`. + + Args: + slots (bool): + Create a :term:`slotted class ` that's more + memory-efficient. Slotted classes are generally superior to the + default dict classes, but have some gotchas you should know about, + so we encourage you to read the :term:`glossary entry `. + + auto_detect (bool): + Instead of setting the *init*, *repr*, *eq*, and *hash* arguments + explicitly, assume they are set to True **unless any** of the + involved methods for one of the arguments is implemented in the + *current* class (meaning, it is *not* inherited from some base + class). + + So, for example by implementing ``__eq__`` on a class yourself, + *attrs* will deduce ``eq=False`` and will create *neither* + ``__eq__`` *nor* ``__ne__`` (but Python classes come with a + sensible ``__ne__`` by default, so it *should* be enough to only + implement ``__eq__`` in most cases). + + Passing True or False` to *init*, *repr*, *eq*, *cmp*, or *hash* + overrides whatever *auto_detect* would determine. + + auto_exc (bool): + If the class subclasses `BaseException` (which implicitly includes + any subclass of any exception), the following happens to behave + like a well-behaved Python exception class: + + - the values for *eq*, *order*, and *hash* are ignored and the + instances compare and hash by the instance's ids [#]_ , + - all attributes that are either passed into ``__init__`` or have a + default value are additionally available as a tuple in the + ``args`` attribute, + - the value of *str* is ignored leaving ``__str__`` to base + classes. + + .. [#] + Note that *attrs* will *not* remove existing implementations of + ``__hash__`` or the equality methods. It just won't add own + ones. + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + A callable that is run whenever the user attempts to set an + attribute (either by assignment like ``i.x = 42`` or by using + `setattr` like ``setattr(i, "x", 42)``). It receives the same + arguments as validators: the instance, the attribute that is being + modified, and the new value. + + If no exception is raised, the attribute is set to the return value + of the callable. + + If a list of callables is passed, they're automatically wrapped in + an `attrs.setters.pipe`. + + If left None, the default behavior is to run converters and + validators whenever an attribute is set. + + init (bool): + Create a ``__init__`` method that initializes the *attrs* + attributes. Leading underscores are stripped for the argument name, + unless an alias is set on the attribute. + + .. seealso:: + `init` shows advanced ways to customize the generated + ``__init__`` method, including executing code before and after. + + repr(bool): + Create a ``__repr__`` method with a human readable representation + of *attrs* attributes. + + str (bool): + Create a ``__str__`` method that is identical to ``__repr__``. This + is usually not necessary except for `Exception`\ s. + + eq (bool | None): + If True or None (default), add ``__eq__`` and ``__ne__`` methods + that check two instances for equality. + + .. seealso:: + `comparison` describes how to customize the comparison behavior + going as far comparing NumPy arrays. + + order (bool | None): + If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` + methods that behave like *eq* above and allow instances to be + ordered. + + They compare the instances as if they were tuples of their *attrs* + attributes if and only if the types of both classes are + *identical*. + + If `None` mirror value of *eq*. + + .. seealso:: `comparison` + + cmp (bool | None): + Setting *cmp* is equivalent to setting *eq* and *order* to the same + value. Must not be mixed with *eq* or *order*. + + unsafe_hash (bool | None): + If None (default), the ``__hash__`` method is generated according + how *eq* and *frozen* are set. + + 1. If *both* are True, *attrs* will generate a ``__hash__`` for + you. + 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set + to None, marking it unhashable (which it is). + 3. If *eq* is False, ``__hash__`` will be left untouched meaning + the ``__hash__`` method of the base class will be used. If the + base class is `object`, this means it will fall back to id-based + hashing. + + Although not recommended, you can decide for yourself and force + *attrs* to create one (for example, if the class is immutable even + though you didn't freeze it programmatically) by passing True or + not. Both of these cases are rather special and should be used + carefully. + + .. seealso:: + + - Our documentation on `hashing`, + - Python's documentation on `object.__hash__`, + - and the `GitHub issue that led to the default \ behavior + `_ for more + details. + + hash (bool | None): + Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence. + + cache_hash (bool): + Ensure that the object's hash code is computed only once and stored + on the object. If this is set to True, hashing must be either + explicitly or implicitly enabled for this class. If the hash code + is cached, avoid any reassignments of fields involved in hash code + computation or mutations of the objects those fields point to after + object creation. If such changes occur, the behavior of the + object's hash code is undefined. + + frozen (bool): + Make instances immutable after initialization. If someone attempts + to modify a frozen instance, `attrs.exceptions.FrozenInstanceError` + is raised. + + .. note:: + + 1. This is achieved by installing a custom ``__setattr__`` + method on your class, so you can't implement your own. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance `impact + ` when initializing new instances. In other + words: ``__init__`` is slightly slower with ``frozen=True``. + + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You + can circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + 5. Subclasses of a frozen class are frozen too. + + kw_only (bool): + Make all attributes keyword-only in the generated ``__init__`` (if + *init* is False, this parameter is ignored). + + weakref_slot (bool): + Make instances weak-referenceable. This has no effect unless + *slots* is True. + + field_transformer (~typing.Callable | None): + A function that is called with the original class object and all + fields right before *attrs* finalizes the class. You can use this, + for example, to automatically add converters or validators to + fields based on their types. + + .. seealso:: `transform-fields` + + match_args (bool): + If True (default), set ``__match_args__`` on the class to support + :pep:`634` (*Structural Pattern Matching*). It is a tuple of all + non-keyword-only ``__init__`` parameter names on Python 3.10 and + later. Ignored on older Python versions. + + collect_by_mro (bool): + If True, *attrs* collects attributes from base classes correctly + according to the `method resolution order + `_. If False, *attrs* + will mimic the (wrong) behavior of `dataclasses` and :pep:`681`. + + See also `issue #428 + `_. + + getstate_setstate (bool | None): + .. note:: + + This is usually only interesting for slotted classes and you + should probably just set *auto_detect* to True. + + If True, ``__getstate__`` and ``__setstate__`` are generated and + attached to the class. This is necessary for slotted classes to be + pickleable. If left None, it's True by default for slotted classes + and False for dict classes. + + If *auto_detect* is True, and *getstate_setstate* is left None, and + **either** ``__getstate__`` or ``__setstate__`` is detected + directly on the class (meaning: not inherited), it is set to False + (this is usually what you want). + + auto_attribs (bool | None): + If True, look at type annotations to determine which attributes to + use, like `dataclasses`. If False, it will only look for explicit + :func:`field` class attributes, like classic *attrs*. + + If left None, it will guess: + + 1. If any attributes are annotated and no unannotated + `attrs.field`\ s are found, it assumes *auto_attribs=True*. + 2. Otherwise it assumes *auto_attribs=False* and tries to collect + `attrs.field`\ s. + + If *attrs* decides to look at type annotations, **all** fields + **must** be annotated. If *attrs* encounters a field that is set to + a :func:`field` / `attr.ib` but lacks a type annotation, an + `attrs.exceptions.UnannotatedAttributeError` is raised. Use + ``field_name: typing.Any = field(...)`` if you don't want to set a + type. + + .. warning:: + + For features that use the attribute name to create decorators + (for example, :ref:`validators `), you still *must* + assign :func:`field` / `attr.ib` to them. Otherwise Python will + either not find the name or try to use the default value to + call, for example, ``validator`` on it. + + Attributes annotated as `typing.ClassVar`, and attributes that are + neither annotated nor set to an `field()` are **ignored**. + + these (dict[str, object]): + A dictionary of name to the (private) return value of `field()` + mappings. This is useful to avoid the definition of your attributes + within the class body because you can't (for example, if you want + to add ``__repr__`` methods to Django models) or don't want to. + + If *these* is not `None`, *attrs* will *not* search the class body + for attributes and will *not* remove any attributes from it. + + The order is deduced from the order of the attributes inside + *these*. + + Arguably, this is a rather obscure feature. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + + .. note:: + + The main differences to the classic `attr.s` are: + + - Automatically detect whether or not *auto_attribs* should be `True` + (c.f. *auto_attribs* parameter). + - Converters and validators run when attributes are set by default -- + if *frozen* is `False`. + - *slots=True* + + Usually, this has only upsides and few visible effects in everyday + programming. But it *can* lead to some surprising behaviors, so + please make sure to read :term:`slotted classes`. + + - *auto_exc=True* + - *auto_detect=True* + - *order=False* + - Some options that were only relevant on Python 2 or were kept around + for backwards-compatibility have been removed. + + """ + + def do_it(cls, auto_attribs): + return attrs( + maybe_cls=cls, + these=these, + repr=repr, + hash=hash, + unsafe_hash=unsafe_hash, + init=init, + slots=slots, + frozen=frozen, + weakref_slot=weakref_slot, + str=str, + auto_attribs=auto_attribs, + kw_only=kw_only, + cache_hash=cache_hash, + auto_exc=auto_exc, + eq=eq, + order=order, + auto_detect=auto_detect, + collect_by_mro=True, + getstate_setstate=getstate_setstate, + on_setattr=on_setattr, + field_transformer=field_transformer, + match_args=match_args, + ) + + def wrap(cls): + """ + Making this a wrapper ensures this code runs during class creation. + + We also ensure that frozen-ness of classes is inherited. + """ + nonlocal frozen, on_setattr + + had_on_setattr = on_setattr not in (None, setters.NO_OP) + + # By default, mutable classes convert & validate on setattr. + if frozen is False and on_setattr is None: + on_setattr = _DEFAULT_ON_SETATTR + + # However, if we subclass a frozen class, we inherit the immutability + # and disable on_setattr. + for base_cls in cls.__bases__: + if base_cls.__setattr__ is _frozen_setattrs: + if had_on_setattr: + msg = "Frozen classes can't use on_setattr (frozen-ness was inherited)." + raise ValueError(msg) + + on_setattr = setters.NO_OP + break + + if auto_attribs is not None: + return do_it(cls, auto_attribs) + + try: + return do_it(cls, True) + except UnannotatedAttributeError: + return do_it(cls, False) + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +mutable = define +frozen = partial(define, frozen=True, on_setattr=None) + + +def field( + *, + default=NOTHING, + validator=None, + repr=True, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new :term:`field` / :term:`attribute` on a class. + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attrs.define` (or similar)! + + Args: + default: + A value that is used if an *attrs*-generated ``__init__`` is used + and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of `attrs.Factory`, its callable will + be used to construct a new value (useful for mutable data types + like lists or dicts). + + If a default is not set (or set manually to `attrs.NOTHING`), a + value *must* be supplied when instantiating; otherwise a + `TypeError` will be raised. + + .. seealso:: `defaults` + + factory (~typing.Callable): + Syntactic sugar for ``default=attr.Factory(factory)``. + + validator (~typing.Callable | list[~typing.Callable]): + Callable that is called by *attrs*-generated ``__init__`` methods + after the instance has been initialized. They receive the + initialized instance, the :func:`~attrs.Attribute`, and the passed + value. + + The return value is *not* inspected so the validator has to throw + an exception itself. + + If a `list` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. + + The validator can also be set using decorator notation as shown + below. + + .. seealso:: :ref:`validators` + + repr (bool | ~typing.Callable): + Include this attribute in the generated ``__repr__`` method. If + True, include the attribute; if False, omit it. By default, the + built-in ``repr()`` function is used. To override how the attribute + value is formatted, pass a ``callable`` that takes a single value + and returns a string. Note that the resulting string is used as-is, + which means it will be used directly *instead* of calling + ``repr()`` (the default). + + eq (bool | ~typing.Callable): + If True (default), include this attribute in the generated + ``__eq__`` and ``__ne__`` methods that check two instances for + equality. To override how the attribute value is compared, pass a + callable that takes a single value and returns the value to be + compared. + + .. seealso:: `comparison` + + order (bool | ~typing.Callable): + If True (default), include this attributes in the generated + ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To + override how the attribute value is ordered, pass a callable that + takes a single value and returns the value to be ordered. + + .. seealso:: `comparison` + + cmp(bool | ~typing.Callable): + Setting *cmp* is equivalent to setting *eq* and *order* to the same + value. Must not be mixed with *eq* or *order*. + + .. seealso:: `comparison` + + hash (bool | None): + Include this attribute in the generated ``__hash__`` method. If + None (default), mirror *eq*'s value. This is the correct behavior + according the Python spec. Setting this value to anything else + than None is *discouraged*. + + .. seealso:: `hashing` + + init (bool): + Include this attribute in the generated ``__init__`` method. + + It is possible to set this to False and set a default value. In + that case this attributed is unconditionally initialized with the + specified default value or factory. + + .. seealso:: `init` + + converter (typing.Callable | Converter): + A callable that is called by *attrs*-generated ``__init__`` methods + to convert attribute's value to the desired format. + + If a vanilla callable is passed, it is given the passed-in value as + the only positional argument. It is possible to receive additional + arguments by wrapping the callable in a `Converter`. + + Either way, the returned value will be used as the new value of the + attribute. The value is converted before being passed to the + validator, if any. + + .. seealso:: :ref:`converters` + + metadata (dict | None): + An arbitrary mapping, to be used by third-party code. + + .. seealso:: `extending-metadata`. + + type (type): + The type of the attribute. Nowadays, the preferred method to + specify the type is using a variable annotation (see :pep:`526`). + This argument is provided for backwards-compatibility and for usage + with `make_class`. Regardless of the approach used, the type will + be stored on ``Attribute.type``. + + Please note that *attrs* doesn't do anything with this metadata by + itself. You can use it as part of your own code or for `static type + checking `. + + kw_only (bool): + Make this attribute keyword-only in the generated ``__init__`` (if + ``init`` is False, this parameter is ignored). + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + Allows to overwrite the *on_setattr* setting from `attr.s`. If left + None, the *on_setattr* value from `attr.s` is used. Set to + `attrs.setters.NO_OP` to run **no** `setattr` hooks for this + attribute -- regardless of the setting in `define()`. + + alias (str | None): + Override this attribute's parameter name in the generated + ``__init__`` method. If left None, default to ``name`` stripped + of leading underscores. See `private-attributes`. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionadded:: 22.2.0 *alias* + .. versionadded:: 23.1.0 + The *type* parameter has been re-added; mostly for `attrs.make_class`. + Please note that type checkers ignore this metadata. + + .. seealso:: + + `attr.ib` + """ + return attrib( + default=default, + validator=validator, + repr=repr, + hash=hash, + init=init, + metadata=metadata, + type=type, + converter=converter, + factory=factory, + kw_only=kw_only, + eq=eq, + order=order, + on_setattr=on_setattr, + alias=alias, + ) + + +def asdict(inst, *, recurse=True, filter=None, value_serializer=None): + """ + Same as `attr.asdict`, except that collections types are always retained + and dict is always used as *dict_factory*. + + .. versionadded:: 21.3.0 + """ + return _asdict( + inst=inst, + recurse=recurse, + filter=filter, + value_serializer=value_serializer, + retain_collection_types=True, + ) + + +def astuple(inst, *, recurse=True, filter=None): + """ + Same as `attr.astuple`, except that collections types are always retained + and `tuple` is always used as the *tuple_factory*. + + .. versionadded:: 21.3.0 + """ + return _astuple( + inst=inst, recurse=recurse, filter=filter, retain_collection_types=True + ) diff --git a/myenv/lib/python3.12/site-packages/attr/_typing_compat.pyi b/myenv/lib/python3.12/site-packages/attr/_typing_compat.pyi new file mode 100644 index 0000000..ca7b71e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_typing_compat.pyi @@ -0,0 +1,15 @@ +from typing import Any, ClassVar, Protocol + +# MYPY is a special constant in mypy which works the same way as `TYPE_CHECKING`. +MYPY = False + +if MYPY: + # A protocol to be able to statically accept an attrs class. + class AttrsInstance_(Protocol): + __attrs_attrs__: ClassVar[Any] + +else: + # For type checkers without plug-in support use an empty protocol that + # will (hopefully) be combined into a union. + class AttrsInstance_(Protocol): + pass diff --git a/myenv/lib/python3.12/site-packages/attr/_version_info.py b/myenv/lib/python3.12/site-packages/attr/_version_info.py new file mode 100644 index 0000000..51a1312 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_version_info.py @@ -0,0 +1,86 @@ +# SPDX-License-Identifier: MIT + + +from functools import total_ordering + +from ._funcs import astuple +from ._make import attrib, attrs + + +@total_ordering +@attrs(eq=False, order=False, slots=True, frozen=True) +class VersionInfo: + """ + A version object that can be compared to tuple of length 1--4: + + >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) + True + >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) + True + >>> vi = attr.VersionInfo(19, 2, 0, "final") + >>> vi < (19, 1, 1) + False + >>> vi < (19,) + False + >>> vi == (19, 2,) + True + >>> vi == (19, 2, 1) + False + + .. versionadded:: 19.2 + """ + + year = attrib(type=int) + minor = attrib(type=int) + micro = attrib(type=int) + releaselevel = attrib(type=str) + + @classmethod + def _from_version_string(cls, s): + """ + Parse *s* and return a _VersionInfo. + """ + v = s.split(".") + if len(v) == 3: + v.append("final") + + return cls( + year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] + ) + + def _ensure_tuple(self, other): + """ + Ensure *other* is a tuple of a valid length. + + Returns a possibly transformed *other* and ourselves as a tuple of + the same length as *other*. + """ + + if self.__class__ is other.__class__: + other = astuple(other) + + if not isinstance(other, tuple): + raise NotImplementedError + + if not (1 <= len(other) <= 4): + raise NotImplementedError + + return astuple(self)[: len(other)], other + + def __eq__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + return us == them + + def __lt__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't + # have to do anything special with releaselevel for now. + return us < them diff --git a/myenv/lib/python3.12/site-packages/attr/_version_info.pyi b/myenv/lib/python3.12/site-packages/attr/_version_info.pyi new file mode 100644 index 0000000..45ced08 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/_version_info.pyi @@ -0,0 +1,9 @@ +class VersionInfo: + @property + def year(self) -> int: ... + @property + def minor(self) -> int: ... + @property + def micro(self) -> int: ... + @property + def releaselevel(self) -> str: ... diff --git a/myenv/lib/python3.12/site-packages/attr/converters.py b/myenv/lib/python3.12/site-packages/attr/converters.py new file mode 100644 index 0000000..9238311 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/converters.py @@ -0,0 +1,151 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful converters. +""" + + +import typing + +from ._compat import _AnnotationExtractor +from ._make import NOTHING, Factory, pipe + + +__all__ = [ + "default_if_none", + "optional", + "pipe", + "to_bool", +] + + +def optional(converter): + """ + A converter that allows an attribute to be optional. An optional attribute + is one which can be set to `None`. + + Type annotations will be inferred from the wrapped converter's, if it has + any. + + Args: + converter (typing.Callable): + the converter that is used for non-`None` values. + + .. versionadded:: 17.1.0 + """ + + def optional_converter(val): + if val is None: + return None + return converter(val) + + xtr = _AnnotationExtractor(converter) + + t = xtr.get_first_param_type() + if t: + optional_converter.__annotations__["val"] = typing.Optional[t] + + rt = xtr.get_return_type() + if rt: + optional_converter.__annotations__["return"] = typing.Optional[rt] + + return optional_converter + + +def default_if_none(default=NOTHING, factory=None): + """ + A converter that allows to replace `None` values by *default* or the result + of *factory*. + + Args: + default: + Value to be used if `None` is passed. Passing an instance of + `attrs.Factory` is supported, however the ``takes_self`` option is + *not*. + + factory (typing.Callable): + A callable that takes no parameters whose result is used if `None` + is passed. + + Raises: + TypeError: If **neither** *default* or *factory* is passed. + + TypeError: If **both** *default* and *factory* are passed. + + ValueError: + If an instance of `attrs.Factory` is passed with + ``takes_self=True``. + + .. versionadded:: 18.2.0 + """ + if default is NOTHING and factory is None: + msg = "Must pass either `default` or `factory`." + raise TypeError(msg) + + if default is not NOTHING and factory is not None: + msg = "Must pass either `default` or `factory` but not both." + raise TypeError(msg) + + if factory is not None: + default = Factory(factory) + + if isinstance(default, Factory): + if default.takes_self: + msg = "`takes_self` is not supported by default_if_none." + raise ValueError(msg) + + def default_if_none_converter(val): + if val is not None: + return val + + return default.factory() + + else: + + def default_if_none_converter(val): + if val is not None: + return val + + return default + + return default_if_none_converter + + +def to_bool(val): + """ + Convert "boolean" strings (for example, from environment variables) to real + booleans. + + Values mapping to `True`: + + - ``True`` + - ``"true"`` / ``"t"`` + - ``"yes"`` / ``"y"`` + - ``"on"`` + - ``"1"`` + - ``1`` + + Values mapping to `False`: + + - ``False`` + - ``"false"`` / ``"f"`` + - ``"no"`` / ``"n"`` + - ``"off"`` + - ``"0"`` + - ``0`` + + Raises: + ValueError: For any other value. + + .. versionadded:: 21.3.0 + """ + if isinstance(val, str): + val = val.lower() + + if val in (True, "true", "t", "yes", "y", "on", "1", 1): + return True + if val in (False, "false", "f", "no", "n", "off", "0", 0): + return False + + msg = f"Cannot convert value to bool: {val!r}" + raise ValueError(msg) diff --git a/myenv/lib/python3.12/site-packages/attr/converters.pyi b/myenv/lib/python3.12/site-packages/attr/converters.pyi new file mode 100644 index 0000000..9ef478f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/converters.pyi @@ -0,0 +1,13 @@ +from typing import Callable, TypeVar, overload + +from attrs import _ConverterType + +_T = TypeVar("_T") + +def pipe(*validators: _ConverterType) -> _ConverterType: ... +def optional(converter: _ConverterType) -> _ConverterType: ... +@overload +def default_if_none(default: _T) -> _ConverterType: ... +@overload +def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType: ... +def to_bool(val: str) -> bool: ... diff --git a/myenv/lib/python3.12/site-packages/attr/exceptions.py b/myenv/lib/python3.12/site-packages/attr/exceptions.py new file mode 100644 index 0000000..3b7abb8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/exceptions.py @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +from typing import ClassVar + + +class FrozenError(AttributeError): + """ + A frozen/immutable instance or attribute have been attempted to be + modified. + + It mirrors the behavior of ``namedtuples`` by using the same error message + and subclassing `AttributeError`. + + .. versionadded:: 20.1.0 + """ + + msg = "can't set attribute" + args: ClassVar[tuple[str]] = [msg] + + +class FrozenInstanceError(FrozenError): + """ + A frozen instance has been attempted to be modified. + + .. versionadded:: 16.1.0 + """ + + +class FrozenAttributeError(FrozenError): + """ + A frozen attribute has been attempted to be modified. + + .. versionadded:: 20.1.0 + """ + + +class AttrsAttributeNotFoundError(ValueError): + """ + An *attrs* function couldn't find an attribute that the user asked for. + + .. versionadded:: 16.2.0 + """ + + +class NotAnAttrsClassError(ValueError): + """ + A non-*attrs* class has been passed into an *attrs* function. + + .. versionadded:: 16.2.0 + """ + + +class DefaultAlreadySetError(RuntimeError): + """ + A default has been set when defining the field and is attempted to be reset + using the decorator. + + .. versionadded:: 17.1.0 + """ + + +class UnannotatedAttributeError(RuntimeError): + """ + A class with ``auto_attribs=True`` has a field without a type annotation. + + .. versionadded:: 17.3.0 + """ + + +class PythonTooOldError(RuntimeError): + """ + It was attempted to use an *attrs* feature that requires a newer Python + version. + + .. versionadded:: 18.2.0 + """ + + +class NotCallableError(TypeError): + """ + A field requiring a callable has been set with a value that is not + callable. + + .. versionadded:: 19.2.0 + """ + + def __init__(self, msg, value): + super(TypeError, self).__init__(msg, value) + self.msg = msg + self.value = value + + def __str__(self): + return str(self.msg) diff --git a/myenv/lib/python3.12/site-packages/attr/exceptions.pyi b/myenv/lib/python3.12/site-packages/attr/exceptions.pyi new file mode 100644 index 0000000..f268011 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/exceptions.pyi @@ -0,0 +1,17 @@ +from typing import Any + +class FrozenError(AttributeError): + msg: str = ... + +class FrozenInstanceError(FrozenError): ... +class FrozenAttributeError(FrozenError): ... +class AttrsAttributeNotFoundError(ValueError): ... +class NotAnAttrsClassError(ValueError): ... +class DefaultAlreadySetError(RuntimeError): ... +class UnannotatedAttributeError(RuntimeError): ... +class PythonTooOldError(RuntimeError): ... + +class NotCallableError(TypeError): + msg: str = ... + value: Any = ... + def __init__(self, msg: str, value: Any) -> None: ... diff --git a/myenv/lib/python3.12/site-packages/attr/filters.py b/myenv/lib/python3.12/site-packages/attr/filters.py new file mode 100644 index 0000000..689b170 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/filters.py @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful filters for `attrs.asdict` and `attrs.astuple`. +""" + +from ._make import Attribute + + +def _split_what(what): + """ + Returns a tuple of `frozenset`s of classes and attributes. + """ + return ( + frozenset(cls for cls in what if isinstance(cls, type)), + frozenset(cls for cls in what if isinstance(cls, str)), + frozenset(cls for cls in what if isinstance(cls, Attribute)), + ) + + +def include(*what): + """ + Create a filter that only allows *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to include. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.1.0 Accept strings with field names. + """ + cls, names, attrs = _split_what(what) + + def include_(attribute, value): + return ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return include_ + + +def exclude(*what): + """ + Create a filter that does **not** allow *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to exclude. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.3.0 Accept field name string as input argument + """ + cls, names, attrs = _split_what(what) + + def exclude_(attribute, value): + return not ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return exclude_ diff --git a/myenv/lib/python3.12/site-packages/attr/filters.pyi b/myenv/lib/python3.12/site-packages/attr/filters.pyi new file mode 100644 index 0000000..974abdc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/filters.pyi @@ -0,0 +1,6 @@ +from typing import Any + +from . import Attribute, _FilterType + +def include(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... +def exclude(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... diff --git a/myenv/lib/python3.12/site-packages/attr/py.typed b/myenv/lib/python3.12/site-packages/attr/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/attr/setters.py b/myenv/lib/python3.12/site-packages/attr/setters.py new file mode 100644 index 0000000..a9ce016 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/setters.py @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly used hooks for on_setattr. +""" + +from . import _config +from .exceptions import FrozenAttributeError + + +def pipe(*setters): + """ + Run all *setters* and return the return value of the last one. + + .. versionadded:: 20.1.0 + """ + + def wrapped_pipe(instance, attrib, new_value): + rv = new_value + + for setter in setters: + rv = setter(instance, attrib, rv) + + return rv + + return wrapped_pipe + + +def frozen(_, __, ___): + """ + Prevent an attribute to be modified. + + .. versionadded:: 20.1.0 + """ + raise FrozenAttributeError() + + +def validate(instance, attrib, new_value): + """ + Run *attrib*'s validator on *new_value* if it has one. + + .. versionadded:: 20.1.0 + """ + if _config._run_validators is False: + return new_value + + v = attrib.validator + if not v: + return new_value + + v(instance, attrib, new_value) + + return new_value + + +def convert(instance, attrib, new_value): + """ + Run *attrib*'s converter -- if it has one -- on *new_value* and return the + result. + + .. versionadded:: 20.1.0 + """ + c = attrib.converter + if c: + # This can be removed once we drop 3.8 and use attrs.Converter instead. + from ._make import Converter + + if not isinstance(c, Converter): + return c(new_value) + + return c(new_value, instance, attrib) + + return new_value + + +# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. +# Sphinx's autodata stopped working, so the docstring is inlined in the API +# docs. +NO_OP = object() diff --git a/myenv/lib/python3.12/site-packages/attr/setters.pyi b/myenv/lib/python3.12/site-packages/attr/setters.pyi new file mode 100644 index 0000000..73abf36 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/setters.pyi @@ -0,0 +1,20 @@ +from typing import Any, NewType, NoReturn, TypeVar + +from . import Attribute +from attrs import _OnSetAttrType + +_T = TypeVar("_T") + +def frozen( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> NoReturn: ... +def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... +def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... + +# convert is allowed to return Any, because they can be chained using pipe. +def convert( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> Any: ... + +_NoOpType = NewType("_NoOpType", object) +NO_OP: _NoOpType diff --git a/myenv/lib/python3.12/site-packages/attr/validators.py b/myenv/lib/python3.12/site-packages/attr/validators.py new file mode 100644 index 0000000..8a56717 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/validators.py @@ -0,0 +1,711 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful validators. +""" + + +import operator +import re + +from contextlib import contextmanager +from re import Pattern + +from ._config import get_run_validators, set_run_validators +from ._make import _AndValidator, and_, attrib, attrs +from .converters import default_if_none +from .exceptions import NotCallableError + + +__all__ = [ + "and_", + "deep_iterable", + "deep_mapping", + "disabled", + "ge", + "get_disabled", + "gt", + "in_", + "instance_of", + "is_callable", + "le", + "lt", + "matches_re", + "max_len", + "min_len", + "not_", + "optional", + "or_", + "set_disabled", +] + + +def set_disabled(disabled): + """ + Globally disable or enable running validators. + + By default, they are run. + + Args: + disabled (bool): If `True`, disable running all validators. + + .. warning:: + + This function is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(not disabled) + + +def get_disabled(): + """ + Return a bool indicating whether validators are currently disabled or not. + + Returns: + bool:`True` if validators are currently disabled. + + .. versionadded:: 21.3.0 + """ + return not get_run_validators() + + +@contextmanager +def disabled(): + """ + Context manager that disables running validators within its context. + + .. warning:: + + This context manager is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(False) + try: + yield + finally: + set_run_validators(True) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InstanceOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not isinstance(value, self.type): + msg = f"'{attr.name}' must be {self.type!r} (got {value!r} that is a {value.__class__!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def instance_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `isinstance` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type]): The type to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _InstanceOfValidator(type) + + +@attrs(repr=False, frozen=True, slots=True) +class _MatchesReValidator: + pattern = attrib() + match_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.match_func(value): + msg = f"'{attr.name}' must match regex {self.pattern.pattern!r} ({value!r} doesn't)" + raise ValueError( + msg, + attr, + self.pattern, + value, + ) + + def __repr__(self): + return f"" + + +def matches_re(regex, flags=0, func=None): + r""" + A validator that raises `ValueError` if the initializer is called with a + string that doesn't match *regex*. + + Args: + regex (str, re.Pattern): + A regex string or precompiled pattern to match against + + flags (int): + Flags that will be passed to the underlying re function (default 0) + + func (typing.Callable): + Which underlying `re` function to call. Valid options are + `re.fullmatch`, `re.search`, and `re.match`; the default `None` + means `re.fullmatch`. For performance reasons, the pattern is + always precompiled using `re.compile`. + + .. versionadded:: 19.2.0 + .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. + """ + valid_funcs = (re.fullmatch, None, re.search, re.match) + if func not in valid_funcs: + msg = "'func' must be one of {}.".format( + ", ".join( + sorted(e and e.__name__ or "None" for e in set(valid_funcs)) + ) + ) + raise ValueError(msg) + + if isinstance(regex, Pattern): + if flags: + msg = "'flags' can only be used with a string pattern; pass flags to re.compile() instead" + raise TypeError(msg) + pattern = regex + else: + pattern = re.compile(regex, flags) + + if func is re.match: + match_func = pattern.match + elif func is re.search: + match_func = pattern.search + else: + match_func = pattern.fullmatch + + return _MatchesReValidator(pattern, match_func) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OptionalValidator: + validator = attrib() + + def __call__(self, inst, attr, value): + if value is None: + return + + self.validator(inst, attr, value) + + def __repr__(self): + return f"" + + +def optional(validator): + """ + A validator that makes an attribute optional. An optional attribute is one + which can be set to `None` in addition to satisfying the requirements of + the sub-validator. + + Args: + validator + (typing.Callable | tuple[typing.Callable] | list[typing.Callable]): + A validator (or validators) that is used for non-`None` values. + + .. versionadded:: 15.1.0 + .. versionchanged:: 17.1.0 *validator* can be a list of validators. + .. versionchanged:: 23.1.0 *validator* can also be a tuple of validators. + """ + if isinstance(validator, (list, tuple)): + return _OptionalValidator(_AndValidator(validator)) + + return _OptionalValidator(validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InValidator: + options = attrib() + _original_options = attrib(hash=False) + + def __call__(self, inst, attr, value): + try: + in_options = value in self.options + except TypeError: # e.g. `1 in "abc"` + in_options = False + + if not in_options: + msg = f"'{attr.name}' must be in {self._original_options!r} (got {value!r})" + raise ValueError( + msg, + attr, + self._original_options, + value, + ) + + def __repr__(self): + return f"" + + +def in_(options): + """ + A validator that raises a `ValueError` if the initializer is called with a + value that does not belong in the *options* provided. + + The check is performed using ``value in options``, so *options* has to + support that operation. + + To keep the validator hashable, dicts, lists, and sets are transparently + transformed into a `tuple`. + + Args: + options: Allowed options. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected options, and the value it got. + + .. versionadded:: 17.1.0 + .. versionchanged:: 22.1.0 + The ValueError was incomplete until now and only contained the human + readable error message. Now it contains all the information that has + been promised since 17.1.0. + .. versionchanged:: 24.1.0 + *options* that are a list, dict, or a set are now transformed into a + tuple to keep the validator hashable. + """ + repr_options = options + if isinstance(options, (list, dict, set)): + options = tuple(options) + + return _InValidator(options, repr_options) + + +@attrs(repr=False, slots=False, unsafe_hash=True) +class _IsCallableValidator: + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not callable(value): + message = ( + "'{name}' must be callable " + "(got {value!r} that is a {actual!r})." + ) + raise NotCallableError( + msg=message.format( + name=attr.name, value=value, actual=value.__class__ + ), + value=value, + ) + + def __repr__(self): + return "" + + +def is_callable(): + """ + A validator that raises a `attrs.exceptions.NotCallableError` if the + initializer is called with a value for this particular attribute that is + not callable. + + .. versionadded:: 19.1.0 + + Raises: + attrs.exceptions.NotCallableError: + With a human readable error message containing the attribute + (`attrs.Attribute`) name, and the value it got. + """ + return _IsCallableValidator() + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepIterable: + member_validator = attrib(validator=is_callable()) + iterable_validator = attrib( + default=None, validator=optional(is_callable()) + ) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.iterable_validator is not None: + self.iterable_validator(inst, attr, value) + + for member in value: + self.member_validator(inst, attr, member) + + def __repr__(self): + iterable_identifier = ( + "" + if self.iterable_validator is None + else f" {self.iterable_validator!r}" + ) + return ( + f"" + ) + + +def deep_iterable(member_validator, iterable_validator=None): + """ + A validator that performs deep validation of an iterable. + + Args: + member_validator: Validator to apply to iterable members. + + iterable_validator: + Validator to apply to iterable itself (optional). + + Raises + TypeError: if any sub-validators fail + + .. versionadded:: 19.1.0 + """ + if isinstance(member_validator, (list, tuple)): + member_validator = and_(*member_validator) + return _DeepIterable(member_validator, iterable_validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepMapping: + key_validator = attrib(validator=is_callable()) + value_validator = attrib(validator=is_callable()) + mapping_validator = attrib(default=None, validator=optional(is_callable())) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.mapping_validator is not None: + self.mapping_validator(inst, attr, value) + + for key in value: + self.key_validator(inst, attr, key) + self.value_validator(inst, attr, value[key]) + + def __repr__(self): + return f"" + + +def deep_mapping(key_validator, value_validator, mapping_validator=None): + """ + A validator that performs deep validation of a dictionary. + + Args: + key_validator: Validator to apply to dictionary keys. + + value_validator: Validator to apply to dictionary values. + + mapping_validator: + Validator to apply to top-level mapping attribute (optional). + + .. versionadded:: 19.1.0 + + Raises: + TypeError: if any sub-validators fail + """ + return _DeepMapping(key_validator, value_validator, mapping_validator) + + +@attrs(repr=False, frozen=True, slots=True) +class _NumberValidator: + bound = attrib() + compare_op = attrib() + compare_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.compare_func(value, self.bound): + msg = f"'{attr.name}' must be {self.compare_op} {self.bound}: {value}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def lt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number larger or equal to *val*. + + The validator uses `operator.lt` to compare the values. + + Args: + val: Exclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<", operator.lt) + + +def le(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number greater than *val*. + + The validator uses `operator.le` to compare the values. + + Args: + val: Inclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<=", operator.le) + + +def ge(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller than *val*. + + The validator uses `operator.ge` to compare the values. + + Args: + val: Inclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">=", operator.ge) + + +def gt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller or equal to *val*. + + The validator uses `operator.ge` to compare the values. + + Args: + val: Exclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">", operator.gt) + + +@attrs(repr=False, frozen=True, slots=True) +class _MaxLengthValidator: + max_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) > self.max_length: + msg = f"Length of '{attr.name}' must be <= {self.max_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def max_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is longer than *length*. + + Args: + length (int): Maximum length of the string or iterable + + .. versionadded:: 21.3.0 + """ + return _MaxLengthValidator(length) + + +@attrs(repr=False, frozen=True, slots=True) +class _MinLengthValidator: + min_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) < self.min_length: + msg = f"Length of '{attr.name}' must be >= {self.min_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def min_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is shorter than *length*. + + Args: + length (int): Minimum length of the string or iterable + + .. versionadded:: 22.1.0 + """ + return _MinLengthValidator(length) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _SubclassOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not issubclass(value, self.type): + msg = f"'{attr.name}' must be a subclass of {self.type!r} (got {value!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def _subclass_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `issubclass` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type, ...]): The type(s) to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _SubclassOfValidator(type) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _NotValidator: + validator = attrib() + msg = attrib( + converter=default_if_none( + "not_ validator child '{validator!r}' " + "did not raise a captured error" + ) + ) + exc_types = attrib( + validator=deep_iterable( + member_validator=_subclass_of(Exception), + iterable_validator=instance_of(tuple), + ), + ) + + def __call__(self, inst, attr, value): + try: + self.validator(inst, attr, value) + except self.exc_types: + pass # suppress error to invert validity + else: + raise ValueError( + self.msg.format( + validator=self.validator, + exc_types=self.exc_types, + ), + attr, + self.validator, + value, + self.exc_types, + ) + + def __repr__(self): + return f"" + + +def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): + """ + A validator that wraps and logically 'inverts' the validator passed to it. + It will raise a `ValueError` if the provided validator *doesn't* raise a + `ValueError` or `TypeError` (by default), and will suppress the exception + if the provided validator *does*. + + Intended to be used with existing validators to compose logic without + needing to create inverted variants, for example, ``not_(in_(...))``. + + Args: + validator: A validator to be logically inverted. + + msg (str): + Message to raise if validator fails. Formatted with keys + ``exc_types`` and ``validator``. + + exc_types (tuple[type, ...]): + Exception type(s) to capture. Other types raised by child + validators will not be intercepted and pass through. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the validator that failed to raise an + exception, the value it got, and the expected exception types. + + .. versionadded:: 22.2.0 + """ + try: + exc_types = tuple(exc_types) + except TypeError: + exc_types = (exc_types,) + return _NotValidator(validator, msg, exc_types) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OrValidator: + validators = attrib() + + def __call__(self, inst, attr, value): + for v in self.validators: + try: + v(inst, attr, value) + except Exception: # noqa: BLE001, PERF203, S112 + continue + else: + return + + msg = f"None of {self.validators!r} satisfied for value {value!r}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def or_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators until one of them is + satisfied. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + Raises: + ValueError: + If no validator is satisfied. Raised with a human-readable error + message listing all the wrapped validators and the value that + failed all of them. + + .. versionadded:: 24.1.0 + """ + vals = [] + for v in validators: + vals.extend(v.validators if isinstance(v, _OrValidator) else [v]) + + return _OrValidator(tuple(vals)) diff --git a/myenv/lib/python3.12/site-packages/attr/validators.pyi b/myenv/lib/python3.12/site-packages/attr/validators.pyi new file mode 100644 index 0000000..a314110 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attr/validators.pyi @@ -0,0 +1,83 @@ +from typing import ( + Any, + AnyStr, + Callable, + Container, + ContextManager, + Iterable, + Mapping, + Match, + Pattern, + TypeVar, + overload, +) + +from attrs import _ValidatorType +from attrs import _ValidatorArgType + +_T = TypeVar("_T") +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_I = TypeVar("_I", bound=Iterable) +_K = TypeVar("_K") +_V = TypeVar("_V") +_M = TypeVar("_M", bound=Mapping) + +def set_disabled(run: bool) -> None: ... +def get_disabled() -> bool: ... +def disabled() -> ContextManager[None]: ... + +# To be more precise on instance_of use some overloads. +# If there are more than 3 items in the tuple then we fall back to Any +@overload +def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... +@overload +def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2]] +) -> _ValidatorType[_T1 | _T2]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2], type[_T3]] +) -> _ValidatorType[_T1 | _T2 | _T3]: ... +@overload +def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... +def optional( + validator: ( + _ValidatorType[_T] + | list[_ValidatorType[_T]] + | tuple[_ValidatorType[_T]] + ), +) -> _ValidatorType[_T | None]: ... +def in_(options: Container[_T]) -> _ValidatorType[_T]: ... +def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... +def matches_re( + regex: Pattern[AnyStr] | AnyStr, + flags: int = ..., + func: Callable[[AnyStr, AnyStr, int], Match[AnyStr] | None] | None = ..., +) -> _ValidatorType[AnyStr]: ... +def deep_iterable( + member_validator: _ValidatorArgType[_T], + iterable_validator: _ValidatorType[_I] | None = ..., +) -> _ValidatorType[_I]: ... +def deep_mapping( + key_validator: _ValidatorType[_K], + value_validator: _ValidatorType[_V], + mapping_validator: _ValidatorType[_M] | None = ..., +) -> _ValidatorType[_M]: ... +def is_callable() -> _ValidatorType[_T]: ... +def lt(val: _T) -> _ValidatorType[_T]: ... +def le(val: _T) -> _ValidatorType[_T]: ... +def ge(val: _T) -> _ValidatorType[_T]: ... +def gt(val: _T) -> _ValidatorType[_T]: ... +def max_len(length: int) -> _ValidatorType[_T]: ... +def min_len(length: int) -> _ValidatorType[_T]: ... +def not_( + validator: _ValidatorType[_T], + *, + msg: str | None = None, + exc_types: type[Exception] | Iterable[type[Exception]] = ..., +) -> _ValidatorType[_T]: ... +def or_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... diff --git a/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/INSTALLER b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA new file mode 100644 index 0000000..a85b378 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA @@ -0,0 +1,242 @@ +Metadata-Version: 2.3 +Name: attrs +Version: 24.2.0 +Summary: Classes Without Boilerplate +Project-URL: Documentation, https://www.attrs.org/ +Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html +Project-URL: GitHub, https://github.com/python-attrs/attrs +Project-URL: Funding, https://github.com/sponsors/hynek +Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi +Author-email: Hynek Schlawack +License-Expression: MIT +License-File: LICENSE +Keywords: attribute,boilerplate,class +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.7 +Requires-Dist: importlib-metadata; python_version < '3.8' +Provides-Extra: benchmark +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark' +Requires-Dist: hypothesis; extra == 'benchmark' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'benchmark' +Requires-Dist: pympler; extra == 'benchmark' +Requires-Dist: pytest-codspeed; extra == 'benchmark' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'benchmark' +Requires-Dist: pytest-xdist[psutil]; extra == 'benchmark' +Requires-Dist: pytest>=4.3.0; extra == 'benchmark' +Provides-Extra: cov +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov' +Requires-Dist: coverage[toml]>=5.3; extra == 'cov' +Requires-Dist: hypothesis; extra == 'cov' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'cov' +Requires-Dist: pympler; extra == 'cov' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'cov' +Requires-Dist: pytest-xdist[psutil]; extra == 'cov' +Requires-Dist: pytest>=4.3.0; extra == 'cov' +Provides-Extra: dev +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev' +Requires-Dist: hypothesis; extra == 'dev' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'dev' +Requires-Dist: pre-commit; extra == 'dev' +Requires-Dist: pympler; extra == 'dev' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'dev' +Requires-Dist: pytest-xdist[psutil]; extra == 'dev' +Requires-Dist: pytest>=4.3.0; extra == 'dev' +Provides-Extra: docs +Requires-Dist: cogapp; extra == 'docs' +Requires-Dist: furo; extra == 'docs' +Requires-Dist: myst-parser; extra == 'docs' +Requires-Dist: sphinx; extra == 'docs' +Requires-Dist: sphinx-notfound-page; extra == 'docs' +Requires-Dist: sphinxcontrib-towncrier; extra == 'docs' +Requires-Dist: towncrier<24.7; extra == 'docs' +Provides-Extra: tests +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests' +Requires-Dist: hypothesis; extra == 'tests' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests' +Requires-Dist: pympler; extra == 'tests' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests' +Requires-Dist: pytest-xdist[psutil]; extra == 'tests' +Requires-Dist: pytest>=4.3.0; extra == 'tests' +Provides-Extra: tests-mypy +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests-mypy' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests-mypy' +Description-Content-Type: text/markdown + + + + +*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)). +[Trusted by NASA](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020! + +Its main goal is to help you to write **concise** and **correct** software without slowing down your code. + + +## Sponsors + +*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek). +Especially those generously supporting us at the *The Organization* tier and higher: + + + +

    + + + + + + + + +

    + + + +

    + Please consider joining them to help make attrs’s maintenance more sustainable! +

    + + + +## Example + +*attrs* gives you a class decorator and a way to declaratively define the attributes on that class: + + + +```pycon +>>> from attrs import asdict, define, make_class, Factory + +>>> @define +... class SomeClass: +... a_number: int = 42 +... list_of_numbers: list[int] = Factory(list) +... +... def hard_math(self, another_number): +... return self.a_number + sum(self.list_of_numbers) * another_number + + +>>> sc = SomeClass(1, [1, 2, 3]) +>>> sc +SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) + +>>> sc.hard_math(3) +19 +>>> sc == SomeClass(1, [1, 2, 3]) +True +>>> sc != SomeClass(2, [3, 2, 1]) +True + +>>> asdict(sc) +{'a_number': 1, 'list_of_numbers': [1, 2, 3]} + +>>> SomeClass() +SomeClass(a_number=42, list_of_numbers=[]) + +>>> C = make_class("C", ["a", "b"]) +>>> C("foo", "bar") +C(a='foo', b='bar') +``` + +After *declaring* your attributes, *attrs* gives you: + +- a concise and explicit overview of the class's attributes, +- a nice human-readable `__repr__`, +- equality-checking methods, +- an initializer, +- and much more, + +*without* writing dull boilerplate code again and again and *without* runtime performance penalties. + +--- + +This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0. +The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**. + +Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation! + + +### Hate Type Annotations!? + +No problem! +Types are entirely **optional** with *attrs*. +Simply assign `attrs.field()` to the attributes instead of annotating them with types: + +```python +from attrs import define, field + +@define +class SomeClass: + a_number = field(default=42) + list_of_numbers = field(factory=list) +``` + + +## Data Classes + +On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*). +In practice it does a lot more and is more flexible. +For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger. + +For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice. + + +## Project Information + +- [**Changelog**](https://www.attrs.org/en/stable/changelog.html) +- [**Documentation**](https://www.attrs.org/) +- [**PyPI**](https://pypi.org/project/attrs/) +- [**Source Code**](https://github.com/python-attrs/attrs) +- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md) +- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs) +- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs) + + +### *attrs* for Enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. +Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. +[Learn more](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). + +## Release Information + +### Deprecations + +- Given the amount of warnings raised in the broader ecosystem, we've decided to only soft-deprecate the *hash* argument to `@define` / `@attr.s`. + Please don't use it in new code, but we don't intend to remove it anymore. + [#1330](https://github.com/python-attrs/attrs/issues/1330) + + +### Changes + +- `attrs.converters.pipe()` (and its syntactic sugar of passing a list for `attrs.field()`'s / `attr.ib()`'s *converter* argument) works again when passing `attrs.setters.convert` to *on_setattr* (which is default for `attrs.define`). + [#1328](https://github.com/python-attrs/attrs/issues/1328) +- Restored support for PEP [649](https://peps.python.org/pep-0649/) / [749](https://peps.python.org/pep-0749/)-implementing Pythons -- currently 3.14-dev. + [#1329](https://github.com/python-attrs/attrs/issues/1329) + + + +--- + +[Full changelog →](https://www.attrs.org/en/stable/changelog.html) diff --git a/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/RECORD b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/RECORD new file mode 100644 index 0000000..1b01979 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/RECORD @@ -0,0 +1,55 @@ +attr/__init__.py,sha256=l8Ewh5KZE7CCY0i1iDfSCnFiUTIkBVoqsXjX9EZnIVA,2087 +attr/__init__.pyi,sha256=aTVHBPX6krCGvbQvOl_UKqEzmi2HFsaIVm2WKmAiqVs,11434 +attr/__pycache__/__init__.cpython-312.pyc,, +attr/__pycache__/_cmp.cpython-312.pyc,, +attr/__pycache__/_compat.cpython-312.pyc,, +attr/__pycache__/_config.cpython-312.pyc,, +attr/__pycache__/_funcs.cpython-312.pyc,, +attr/__pycache__/_make.cpython-312.pyc,, +attr/__pycache__/_next_gen.cpython-312.pyc,, +attr/__pycache__/_version_info.cpython-312.pyc,, +attr/__pycache__/converters.cpython-312.pyc,, +attr/__pycache__/exceptions.cpython-312.pyc,, +attr/__pycache__/filters.cpython-312.pyc,, +attr/__pycache__/setters.cpython-312.pyc,, +attr/__pycache__/validators.cpython-312.pyc,, +attr/_cmp.py,sha256=3umHiBtgsEYtvNP_8XrQwTCdFoZIX4DEur76N-2a3X8,4123 +attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 +attr/_compat.py,sha256=n2Uk3c-ywv0PkFfGlvqR7SzDXp4NOhWmNV_ZK6YfWoM,2958 +attr/_config.py,sha256=z81Vt-GeT_2taxs1XZfmHx9TWlSxjPb6eZH1LTGsS54,843 +attr/_funcs.py,sha256=SGDmNlED1TM3tgO9Ap2mfRfVI24XEAcrNQs7o2eBXHQ,17386 +attr/_make.py,sha256=BjENJz5eJoojJVbCoupWjXLLEZJ7VID89lisLbQUlmQ,91479 +attr/_next_gen.py,sha256=dhGb96VFg4kXBkS9Zdz1A2uxVJ99q_RT1hw3kLA9-uI,24630 +attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 +attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 +attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 +attr/converters.py,sha256=vNa58pZi9V6uxBzl4t1QrHbQfkT4iRFAodyXe7lcgg0,3506 +attr/converters.pyi,sha256=mpDoVFO3Cpx8xYSSV0iZFl7IAHuoNBglxKfxHvLj_sY,410 +attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 +attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 +attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 +attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/setters.py,sha256=faMQeiBo_nbXYnPaQ1pq8PXeA7Zr-uNsVsPMiKCmxhc,1619 +attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 +attr/validators.py,sha256=985eTP6RHyon61YEauMJgyNy1rEOhJWiSXMJgRxPtrQ,20045 +attr/validators.pyi,sha256=LjKf7AoXZfvGSfT3LRs61Qfln94konYyMUPoJJjOxK4,2502 +attrs-24.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-24.2.0.dist-info/METADATA,sha256=3Jgk4lr9Y1SAqAcwOLPN_mpW0wc6VOGm-yHt1LsPIHw,11524 +attrs-24.2.0.dist-info/RECORD,, +attrs-24.2.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +attrs-24.2.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 +attrs/__init__.py,sha256=5FHo-EMFOX-g4ialSK4fwOjuoHzLISJDZCwoOl02Ty8,1071 +attrs/__init__.pyi,sha256=o3l92VsD9kHz8sldEtb_tllBTs3TeL-vIBMTxo2Zc_4,7703 +attrs/__pycache__/__init__.cpython-312.pyc,, +attrs/__pycache__/converters.cpython-312.pyc,, +attrs/__pycache__/exceptions.cpython-312.pyc,, +attrs/__pycache__/filters.cpython-312.pyc,, +attrs/__pycache__/setters.cpython-312.pyc,, +attrs/__pycache__/validators.cpython-312.pyc,, +attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 +attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 +attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 +attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 +attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/WHEEL new file mode 100644 index 0000000..cdd68a4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.25.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/licenses/LICENSE b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..2bd6453 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack and the attrs contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/myenv/lib/python3.12/site-packages/attrs/__init__.py b/myenv/lib/python3.12/site-packages/attrs/__init__.py new file mode 100644 index 0000000..963b197 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attrs/__init__.py @@ -0,0 +1,67 @@ +# SPDX-License-Identifier: MIT + +from attr import ( + NOTHING, + Attribute, + AttrsInstance, + Converter, + Factory, + _make_getattr, + assoc, + cmp_using, + define, + evolve, + field, + fields, + fields_dict, + frozen, + has, + make_class, + mutable, + resolve_types, + validate, +) +from attr._next_gen import asdict, astuple + +from . import converters, exceptions, filters, setters, validators + + +__all__ = [ + "__author__", + "__copyright__", + "__description__", + "__doc__", + "__email__", + "__license__", + "__title__", + "__url__", + "__version__", + "__version_info__", + "asdict", + "assoc", + "astuple", + "Attribute", + "AttrsInstance", + "cmp_using", + "Converter", + "converters", + "define", + "evolve", + "exceptions", + "Factory", + "field", + "fields_dict", + "fields", + "filters", + "frozen", + "has", + "make_class", + "mutable", + "NOTHING", + "resolve_types", + "setters", + "validate", + "validators", +] + +__getattr__ = _make_getattr(__name__) diff --git a/myenv/lib/python3.12/site-packages/attrs/__init__.pyi b/myenv/lib/python3.12/site-packages/attrs/__init__.pyi new file mode 100644 index 0000000..b2670de --- /dev/null +++ b/myenv/lib/python3.12/site-packages/attrs/__init__.pyi @@ -0,0 +1,252 @@ +import sys + +from typing import ( + Any, + Callable, + Mapping, + Sequence, + overload, + TypeVar, +) + +# Because we need to type our own stuff, we have to make everything from +# attr explicitly public too. +from attr import __author__ as __author__ +from attr import __copyright__ as __copyright__ +from attr import __description__ as __description__ +from attr import __email__ as __email__ +from attr import __license__ as __license__ +from attr import __title__ as __title__ +from attr import __url__ as __url__ +from attr import __version__ as __version__ +from attr import __version_info__ as __version_info__ +from attr import assoc as assoc +from attr import Attribute as Attribute +from attr import AttrsInstance as AttrsInstance +from attr import cmp_using as cmp_using +from attr import converters as converters +from attr import Converter as Converter +from attr import evolve as evolve +from attr import exceptions as exceptions +from attr import Factory as Factory +from attr import fields as fields +from attr import fields_dict as fields_dict +from attr import filters as filters +from attr import has as has +from attr import make_class as make_class +from attr import NOTHING as NOTHING +from attr import resolve_types as resolve_types +from attr import setters as setters +from attr import validate as validate +from attr import validators as validators +from attr import attrib, asdict as asdict, astuple as astuple + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_EqOrderType = bool | Callable[[Any], Any] +_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] +_ConverterType = Callable[[Any], Any] +_ReprType = Callable[[Any], str] +_ReprArgType = bool | _ReprType +_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] +_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType +_FieldTransformer = Callable[ + [type, list["Attribute[Any]"]], list["Attribute[Any]"] +] +# FIXME: in reality, if multiple validators are passed they must be in a list +# or tuple, but those are invariant and so would prevent subtypes of +# _ValidatorType from working when passed in a list or tuple. +_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]] + +@overload +def field( + *, + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def field( + *, + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def field( + *, + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def field( + *, + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... + +mutable = define + +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... diff --git a/myenv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52d7904ead94dfb21c12816dca3f413495e415db GIT binary patch literal 1125 zcmZvaJC7Vi5XXD=F|&``-Fw^jFt!8^7Q~HgQiSBgGPZ<{1PD55_09C{wQs6t)ZM%C z64{@^1Vm(rk3xt@Iwe5PFb*s^qN;aK4q$@cRFz6q|EjLvMxz14Z)Coo9k zpA&wo#Z;<3_%&InD9CqQt4um zOgcYrD)oxSoOZ*YxK@od)w4o1Ue^X|Ug!!(LBlB@jlsHFZQb<4Fc3n{{bg;1z$ryh zH%qH$mmb}T5T$a3)v*)?G7QuO8hs%YNL`^h6r$3FGES}HUi*qn%$?hH0&dfx7>sTT zaqVbxQ43-BQNHaHZV>RqnC%ki>}*OnAPfl`ghN6`7!f9fG2w`?N!TK66Ltu6r*@Zc zOxPpbLYz(SgbqFED&u|c*fzH4QErqM^}JURd&jm>!2h+49jRFuQ6)H9DaWL87d zykR|EoGI#$3P~JoP*$|To)AU?Eftr&K0zUVVQ(;ty(@AsJ}>g`9Bw&(q`WeB9$H=M z{GoDJzHaiy)=!mxV4TL=%3-O@BCqs$-YoIm&1Wa~?&nT>^=TuED>+jxC$%mYLK}^D zaMCQ_^*)EXoLA}#dk=fk$+=U+-|Zwx-ln@r>n-~)UdPzSEcxUwcKQc9{U`ls*m|D5 U{yJfk;~yXYKEC^6Xmc#{FS0v19RL6T literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attrs/__pycache__/converters.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attrs/__pycache__/converters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01cd7ef230af365b35f8457ba400470d1a54e258 GIT binary patch literal 237 zcmX@j%ge<81iX1+={`XEF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$1VPq@+kMIX|x~wWuVusCXsAXOR4_RQ=q%68&WT&|;vVzFTTZYMz2iQD#b}zDsIx zc1eDLenC-wR%(f3UU6np4p4PvYF?RsPG*vRL1jrsex9+Op^<)ZW=X1UL1J=tVtQ(^ wKFFqGeS}qd1(m-zY;yBcN^?@}ia3C_G6Hci$Xg$n85tSBvN15q6|n)i0KLjVMgRZ+ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd7b66f6c538948132367a9b2f4ec19749df38ce GIT binary patch literal 237 zcmX@j%ge<81iX1+={`XEF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$1VPq@+kMwIVsSpd>RtuXrWHXOR4_RQ=q%68&WT(BjmhVtu#NlGHo}m!iy+OnsNs z;_Q?m%-GapA?8Nlc xVttTJ#rg=V^a?6}aoFVMr7GFPF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$0i1q@+kMEiuO$84yb}Fn{m^2dpuSsbNot;gOHpP@roKyRadt_5 zfqp?zepYIUV_tD)QckLVZe?m-nSM@Yl72yDNk)F2v7VukesN|=s%}AIa&}^RYOy}Z unqqyZJ$eO|zc_4i^HWN5QtgU3fL1aBaWTk4AD9^#8NaeIFiID(0l5I=JwBEI literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f20cb0fbf387309d01875cf8154be1405647e39 GIT binary patch literal 231 zcmX@j%ge<81iX1+>7GFPF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$0i1q@+l%IJKlCwWxR{!)K7>uO$84yb}Fn{m^2dpuSsbNot;gOHpP@roKyRadt_5 zfqp?zepYIUV_tD)QckLVZe?m-nSM@Yl72yDNk)F2v7VukesN|=s%}AIa&}^RYOy}Z unqqyZJ$eO|zc_4i^HWN5QtgU3fL1aBaWTk4AD9^#8NaeIFiID(0l5J2k3P5n literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc b/myenv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8801b07c47be864f97635ae0540b552f80858296 GIT binary patch literal 237 zcmX@j%ge<81iX1+={`XEF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$1VPq@+l%EHNiDC9x#GsCXsAXOR4_RQ=q%68&WT(BjmhVtu#NlGHo}m!iy+OnsNs z;_Q?m%-GapA?8Nlc xVttTJ#rg=V^a?6}aoFVMr=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE + +debugpy is an implementation of the Debug Adapter Protocol for Python. + +The source code and the issue tracker is [hosted on GitHub](https://github.com/microsoft/debugpy/). diff --git a/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/RECORD b/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/RECORD new file mode 100644 index 0000000..de614bc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/RECORD @@ -0,0 +1,536 @@ +../../../bin/debugpy,sha256=EuVHc-215aZv70CG9j4bgCmu3GdPQxfLCbuBF8w8i7g,300 +debugpy-1.8.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +debugpy-1.8.9.dist-info/LICENSE,sha256=g8PtOU5gAGfBe30cCb0-og8HA7jAcW5qn0FLmfy9-BA,1176 +debugpy-1.8.9.dist-info/METADATA,sha256=uXHWCkCNmenKUXSq5WWlyecVp80rHElZyKSfI-Gcp7Y,1093 +debugpy-1.8.9.dist-info/RECORD,, +debugpy-1.8.9.dist-info/WHEEL,sha256=1RWCnhubPuPKqvmBwMRMY-6dUmf4qJFlSvGgdfRq1aQ,224 +debugpy-1.8.9.dist-info/entry_points.txt,sha256=NczeIkyCjwYAaTVWNszVe-gdhF1rXbqCcWqwFtDyhhk,52 +debugpy-1.8.9.dist-info/top_level.txt,sha256=6Om6JTEaqkWnj-9-7kJOJr988sTO6iSuiK4N9X6RLpg,8 +debugpy/ThirdPartyNotices.txt,sha256=WzmT853BlHOtkEiV_xtk96iazYeVDKWB2tqKMtcm_jo,34345 +debugpy/__init__.py,sha256=B621TRbcw1Pr4LrqSZB8Qr0CW9QfpbpcEz2eaN16jns,1018 +debugpy/__main__.py,sha256=a_DXjwzIJwPVnXlh7z_VnXqhSpuEr1vd1DzCwVt6tVQ,3187 +debugpy/__pycache__/__init__.cpython-312.pyc,, +debugpy/__pycache__/__main__.cpython-312.pyc,, +debugpy/__pycache__/_version.cpython-312.pyc,, +debugpy/__pycache__/public_api.cpython-312.pyc,, +debugpy/_vendored/__init__.py,sha256=cQGcZObOjPcKFDQk06oWNgqBHh2rXDCv0JTNISv3_rg,3878 +debugpy/_vendored/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/__pycache__/_pydevd_packaging.cpython-312.pyc,, +debugpy/_vendored/__pycache__/_util.cpython-312.pyc,, +debugpy/_vendored/__pycache__/force_pydevd.cpython-312.pyc,, +debugpy/_vendored/_pydevd_packaging.py,sha256=cYo9maxM8jNPj-vdvCtweaYAPX210Pg8-NHS8ZU02Mg,1245 +debugpy/_vendored/_util.py,sha256=E5k-21l2RXQHxl0C5YF5ZmZr-Fzgd9eNl1c6UYYzjfg,1840 +debugpy/_vendored/force_pydevd.py,sha256=spQVMTUrxCRoNiSKKIkK96AhEi0JX6vHxcBIJNcNQE0,3172 +debugpy/_vendored/pydevd/__pycache__/pydev_app_engine_debug_startup.cpython-312.pyc,, +debugpy/_vendored/pydevd/__pycache__/pydev_coverage.cpython-312.pyc,, +debugpy/_vendored/pydevd/__pycache__/pydev_pysrc.cpython-312.pyc,, +debugpy/_vendored/pydevd/__pycache__/pydev_run_in_console.cpython-312.pyc,, +debugpy/_vendored/pydevd/__pycache__/pydevconsole.cpython-312.pyc,, +debugpy/_vendored/pydevd/__pycache__/pydevd.cpython-312.pyc,, +debugpy/_vendored/pydevd/__pycache__/pydevd_file_utils.cpython-312.pyc,, +debugpy/_vendored/pydevd/__pycache__/pydevd_tracing.cpython-312.pyc,, +debugpy/_vendored/pydevd/__pycache__/setup_pydevd_cython.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_calltip_util.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_completer.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_execfile.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_filesystem_encoding.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_getopt.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_imports_tipper.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_jy_imports_tipper.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_log.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_saved_modules.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_sys_patch.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_tipper_common.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_console_utils.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_import_hook.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_imports.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_ipython_console.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_ipython_console_011.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_is_thread_alive.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_localhost.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_log.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_monkey.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_monkey_qt.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_override.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_umd.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_versioncheck.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_calltip_util.py,sha256=ZMO1wM5-1IrV2d-896sMLYoC0RAGSE-8-PBbfNo6m9s,4684 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_completer.py,sha256=uTezSnBcGiiy1AhwehM1XzHOr7NbTHXQz_0C9uze674,8535 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_execfile.py,sha256=YeFIPF5nFVaA1seRIa_KAMM1ac5Qo43DS9iuyBe-tFo,485 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_filesystem_encoding.py,sha256=yp-aAAwAGrLlR7GyzAb0fbsNFLaEy1uMJPLg8ULFi64,1101 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_getopt.py,sha256=St7LkdI7n2bF4Xw_Kr-8t7_1YqfI0xAW8mkX_57ccv8,4429 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_imports_tipper.py,sha256=4Pgzh0yaDeQi1YKKopCgRu-eCcAL2zf9BaPMtJ4WSgQ,12312 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_jy_imports_tipper.py,sha256=nE9qiNXx3_ZIwFlpKFPB1KHhcvEphoSGhv8ALOYzPBE,16994 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_log.py,sha256=ENhSEv7ekEcaw-91a1EW6nqlDEO61qL6BvVSS29fshE,554 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_saved_modules.py,sha256=wegdTSDGivI0gctzCr8N2ueFxXfztNP3Ehznao3RWP4,4740 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_sys_patch.py,sha256=u0Nl0sV-18ldTJu0okEeR-21l3Gju0aa2JiRfK9QliQ,2237 +debugpy/_vendored/pydevd/_pydev_bundle/_pydev_tipper_common.py,sha256=jEVMSSg8ShzeGNaYIdPUxDNwo1tp1UfbUs_XrCh5ieY,1228 +debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__init__.py,sha256=Vdcr0nJLaQOYBWn5o4rvZfi5n2-A52oyiJbQEOV31RM,12706 +debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_bundle/pydev_console_utils.py,sha256=t1lS1eqr5VYb7sy8SCfI9mUGrrCvKe8YdUFmlNe9eg0,23750 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_import_hook.py,sha256=gou6qpNq2AtOlV105_KjbRFGuLinxVxVmm-oJediz-M,1320 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_imports.py,sha256=BtBesnz6_ROgrRXhNsX3EOZ1wQdmYi8KzdYaUQPqvG4,403 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console.py,sha256=1nRJShSTk7u7LFh9FD3Mmgx38b5N2OKljHuUMlXi0Oo,3773 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console_011.py,sha256=rpH_5dgX-ftT69TakcnEyBatLzSOrzIr__rWAUht91Q,20763 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_is_thread_alive.py,sha256=j_2C_x_vxQi1l6ccKaeTtyQfbWLZ5v-kpoyTnux2pEw,877 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_localhost.py,sha256=hdpf8wjIcwxImg_n9eyC3fTLLIpqXBCbICFZ_8ymVRA,2071 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_log.py,sha256=4DmESdPd4gu3HSjuwSZsO9A1mCMX-H3RlMjJSHbNuFY,9321 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py,sha256=d-Wle8TY3imtH72Qsty0s9Bq98CQEw_c12afGs1QdtA,44063 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey_qt.py,sha256=08fPxniJEp63MqA_llPXlq5gfliXtwslmHQu3njcLTE,7310 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_override.py,sha256=RDNX5x3GQDkZvCYP_uzi_hQ17vLYPGFXM0OhEkfrbiY,871 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_umd.py,sha256=3a4qX92uJSnAPBzUEc0Pwxgufq-4Mw0VNrxjK5v6zBw,6228 +debugpy/_vendored/pydevd/_pydev_bundle/pydev_versioncheck.py,sha256=vKCufGZ5intWqErkMxo1V_gwB1lIt1wtu5lzi0bfkaE,508 +debugpy/_vendored/pydevd/_pydev_runfiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_coverage.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_nose.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_parallel.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_parallel_client.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_pytest2.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_unittest.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_xml_rpc.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles.py,sha256=j9CMZnmkYwtnBRakF7DWvLhTkiiuj82H9LyGUkS6SuM,32678 +debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_coverage.py,sha256=bHeJjZUZOt4Dc2a7S3jrRerth52qkWdOhUUTS5JZRl0,3408 +debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_nose.py,sha256=shYjBqxALylDKZjkSZRtf27dvBaooxhNshHizks0GxU,7556 +debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel.py,sha256=32dQKKeVuZsVPLWOGeHnrJFLLegs8r84RpLCvNpqXwU,9480 +debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel_client.py,sha256=eWV6nbYBpLwNOv1GIPr32VOkUscKHhZJaqFpNq9yDj8,7712 +debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_pytest2.py,sha256=L3H6rGDFd8ZCPwaR814uQtV6AAahO0WKK3FvSpO4j6k,9845 +debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_unittest.py,sha256=XOwg_BGkHh5DGQ4BhgHcCFWXPQHnW17llxpXuVElPV8,6566 +debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_xml_rpc.py,sha256=IdgMXY3ubZaGuc7Ek2prf2KddciKX3E5CTC1SoC8E6I,10833 +debugpy/_vendored/pydevd/_pydevd_bundle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevconsole_code.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_additional_thread_info.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_additional_thread_info_regular.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_api.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_breakpoints.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_bytecode_utils.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_bytecode_utils_py311.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_code_to_source.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_collect_bytecode_info.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_comm.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_comm_constants.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_command_line_handling.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_console.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_constants.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_custom_frames.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_cython_wrapper.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_daemon_thread.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_defaults.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_dont_trace.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_dont_trace_files.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_exec2.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_extension_api.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_extension_utils.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_filtering.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_frame.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_frame_utils.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_gevent_integration.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_import_class.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_io.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_json_debug_options.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command_factory_json.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command_factory_xml.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_plugin_utils.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_process_net_command.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_process_net_command_json.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_referrers.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_reload.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_resolver.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_runpy.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_safe_repr.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_save_locals.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_signature.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_source_mapping.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_stackless.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_suspended_frames.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_thread_lifecycle.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_timeout.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_trace_dispatch.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_trace_dispatch_regular.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_traceproperty.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_utils.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_vars.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_vm_type.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_xml.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__main__pydevd_gen_debug_adapter_protocol.py,sha256=AUrSO4NvkLu2y6zYuCoLJGxsLJaz-5dO7qwnuD7NUGc,23353 +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/__main__pydevd_gen_debug_adapter_protocol.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_base_schema.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_schema.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_schema_log.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocol.json,sha256=ZK1DO5_0uSNgdx_I2sUNz5yslRwAV9CvDS-Ca0MIe_s,170390 +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocolCustom.json,sha256=NmKM_bN5s6ozUPXIFc_Q3w6unk6Zf1hb1pgyjvxv4QM,10616 +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_base_schema.py,sha256=BHq0SoUikbOeHAyM65ubD9jMBoB0vMCmvzuVzClBkPE,4000 +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema.py,sha256=a6zohIFheZYlwweF7zbLPvSyNDwyy60rp70ltwIfUVQ,843038 +debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema_log.py,sha256=123W8MKmZHTj7dNj7QT91n6HdYt_jDaWhk_WOc-X5Vk,1254 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevconsole_code.py,sha256=jpc0pWVCqQi6NLpmkfUpEFLCDSUuSzPjW7k6c2rFPS8,18936 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info.py,sha256=yZWzEG_rc-bLwcO-QDkwLm1gfxDkfsxRShOmR2vvEGI,1644 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info_regular.py,sha256=cFx2V7EQ41GC0GEkp7sRrYl0ys485PYS8Rn-5XXAsWY,10811 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_api.py,sha256=iJ1kbtW0MLq2AgsP5Jkh7AaRmUnKYRUVfFcSnM9BYv8,51296 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_breakpoints.py,sha256=RpGULGmfu0bxngCoGQWCyweGINfgQ-MGv4VfwFm7pJs,6004 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils.py,sha256=pEUOkF9ZQYGOpFCn9xew3AuoJJda24mUD7uMGE3jmYE,29025 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils_py311.py,sha256=bGoEjyxw9Cwiyh370B3f6e7jg3E-dBmNLvGMFrdtfYU,3600 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_code_to_source.py,sha256=g3pel_1S6KZJMMRoMGP1Q6WHm6arR85_z2UuQnagjdk,17560 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_collect_bytecode_info.py,sha256=J-lD6gK0jC7ebY0_JfRCsmB1IA_Hy02-V2s5tnmWSCc,35130 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm.py,sha256=gnDS8w2pjeK-cMsm0arO8xGnC21PUCxZsufo7pgHg3w,78702 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm_constants.py,sha256=KKGZxtVkEeEM5q0wx3T6FW1hffOCZShrzCU2z9f97dI,6076 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_command_line_handling.py,sha256=aOfHy9eRFV2qc3PjmSFd5AHyHU8UqXHObsetOmmBtas,6102 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/pydevd_concurrency_logger.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/pydevd_thread_wrappers.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_concurrency_logger.py,sha256=6tBkRL4jF1ImM7rSh9zovvgf6Q6F7JQYdXuuvOZewjQ,20708 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_thread_wrappers.py,sha256=cBQ_QMkzxrWDrREe5t-QzRcxhPM-K_iyScKhP4uOWUU,2038 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_console.py,sha256=FM_He7YK5qV65C_tZO2vxoaWpVy3ptN3hZY8SGYHhrc,10169 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_constants.py,sha256=ixmOzAXWjIObWRe5b1Y2uHdgfRzuea171iiae9DmHUY,28493 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_custom_frames.py,sha256=zfl--e0QFREouhGYO-_Gt1cQ8u6ueDiAoIJY7Hc2Ztg,4424 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.c,sha256=_qloia3vS8JMI_jKpsb04j_iHF1aQdPEfpAJczm8Da0,2621187 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.cpython-312-x86_64-linux-gnu.so,sha256=8SmWvLalgzeCzLvfFEVlqCMK2eRW9ZVSD7F4GFMPCXY,4988896 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd,sha256=XKgDVO6Tp-gH3RVQVP05yzIViQuA5RR97hp5R05RDQM,1691 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx,sha256=--h19TffmvHDbhiB-CLWiFuHnEEUyUM9FFnaAJDu79g,98873 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython_wrapper.py,sha256=sGHXLxVW9kKVS81I22ewZsrgsGJL1hbSv2mlKWOIogs,1850 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py,sha256=V93_fOxroEKto3Gi1mwTDNkqR_fXDKtu3oy3PkeECMM,8377 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_defaults.py,sha256=5nz2GRseE6ioxiJ_s1dCjBwvlI8j_d3szEQ9nArtfww,2294 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace.py,sha256=gLJnuCKPrRYrdkPum_xnEaGoSlB4XXC4_qmyZkm929E,3562 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace_files.py,sha256=rrwR9jMY2WDjgjAUJ25B6B3UklGpGqM3F7-6vwTm5ak,6363 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_exec2.py,sha256=t46OdHix6ySRWE7mawY8NMNXrwbSWmFum3rVV5sLpkE,160 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_api.py,sha256=Y3TyC1OKxSiryduwI6_8jOhkQao0pKqHINa7mvAbQfQ,3906 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_utils.py,sha256=iQtNDZKv-hGFSdUg9KnzJ-l_o0VarIFAMateVvj01ZY,2300 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py,sha256=0ih5GKDXv2aM3xl_h91BB3WQRbmheRU7eIA-RKUwjr8,12993 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py,sha256=I-NY3Srwc3jdpUdKSaRFC_SYvL0uhavGptYzDgNWAQs,64529 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame_utils.py,sha256=lgqBlHv_JjI90Xna7KYTBPeFOuw79OsAPI04MVPNecM,14084 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_gevent_integration.py,sha256=AjOT4VSCd4iBxdTf7vCU4euSS6gWbhKZcQcFljyXkUw,3866 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_import_class.py,sha256=FxvE5zjfcmidba4rDih2relTmTHC7kQeHjoxsUijG8o,1779 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_io.py,sha256=Ap8jBhmOJd8NxYdsomRfFojXtEgxXH4CAU4t3K8LFcY,8115 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_json_debug_options.py,sha256=NGcRVk2hb2SuM6VKGp2QjDSEI3-47tSF-ZK2cGyluTM,6153 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command.py,sha256=_iMSMyC7ENFjg7YA4OV8-5QQf226v-WHlXou55H0cHA,4595 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_json.py,sha256=X6mLeyQvEMlIP3Q6Ap9cwAEAZlV5G0j7ptLUY0YqBEM,25196 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_xml.py,sha256=rpM8QOvlh0dqN6cO95cZLCzC5LqOs9sCiZmZEsvy5Vs,23784 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_plugin_utils.py,sha256=y6FV81GoR5mHvGVeNsnVuifunXjqc2YtBeI0N0nuI4Y,7200 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command.py,sha256=953VV4ntmcdRRKhhazI49uAn_j2Wm1cZrHbZtooPEZA,36009 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py,sha256=BOZ-UTZW_gdrkIywjzALte12VJFDkohXeiQqyRDgtXg,57539 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_referrers.py,sha256=dhGMvpD2F0tFX6v9w4rXjtyKc4QOzpySKMWHAQ4RANM,9678 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_reload.py,sha256=IusZgHtATN80C1kpe3iAD9WqKkW5zydzXGwum-uEdVY,15779 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py,sha256=c_9bGh06MbEQw4hbwa7bU6KMQmaUzIu8w4viX3KdBJs,29621 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py,sha256=dQEIMsoceb-KuCmhPFRnxKcxrqoEthhSW0j0rBrnmrU,13007 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_safe_repr.py,sha256=sPopHB3gqKdTZUbM8Dm2sEs9Tfp52ocnAxkA8kSQ98Y,14392 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_save_locals.py,sha256=9h9aJisgkUtB-nZ2CgRxXt4JQPmW0yTj5SQicAoBr-U,4160 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_signature.py,sha256=UjmfnYIfcofVeA-CdwPlXXRwWFJnsXPrLGoogYA5cO0,6877 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_source_mapping.py,sha256=5LCHce85kLWRQK_yv7neJEtzkQs6l4wuS9Pw1xS8DEk,6491 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_stackless.py,sha256=IKEjb4CWvnqi3Mn9dkZzmphx7nJPUND0esVmhswXXcU,16921 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_suspended_frames.py,sha256=kVWcxu1eVcoBkcICetP1Soaa_RYcx0dhZ_SzvUsvkHs,21082 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_thread_lifecycle.py,sha256=ZouTzWGAYnkNceUz8huF0QPN6pm3U2q_3DFY39-sotc,3854 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_timeout.py,sha256=iTEiKxJJ15sY4rqnDMBnT0Cp0rPo2sTHSfy7RGZMB_k,8407 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch.py,sha256=grsHR472gmkJF6-qYOzHQPLhtnLkdkCY_I2Ie5uSiCk,3917 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch_regular.py,sha256=PyNvnDnWlgWeR7S6_DRgWv4aApKq-9HSWKxbTivgJZ4,23358 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_traceproperty.py,sha256=2_4hpLfcctLGL5poRezbA-OdRyG-Cbr1Rid09iKhaEY,3256 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_utils.py,sha256=0hwVWSwFxeoyjskk0s8NELC1b_r57sIAiIypwUN8itU,17819 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vars.py,sha256=GRTcrybaTe8d5a8gV1GUPJG6JzM1ikmT-wa-aEop8n8,31129 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vm_type.py,sha256=BEG4bhTNYPlwmdJe0hCvIU01TizoxhqbIMZR0L6H2Qo,1557 +debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_xml.py,sha256=ekN1XZJ3v0xgPdarUAsZQ0nklq9Ks63FOMoZX2LIFAQ,15499 +debugpy/_vendored/pydevd/_pydevd_frame_eval/.gitignore,sha256=EKhbR-PpYtbvIYhIYeDDdUKDcU_kZf4kBzDgARh1Fgg,87 +debugpy/_vendored/pydevd/_pydevd_frame_eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_eval_cython_wrapper.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_eval_main.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_tracing.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_modify_bytecode.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_cython_wrapper.py,sha256=dNoR--B9du5TXeycVvNkQwkBf9_utKATcJAKshhRTXE,1341 +debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_main.py,sha256=RY--kYB1fBBhr_uAF5ohaiB77VcnVf7XCcsE8FMVzdo,2444 +debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.c,sha256=RTL4Mo8CXDFJKpkl-tQ83BSXiyUTDt-JMCARVPeAYq0,1181258 +debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd,sha256=0pKrUK3YwQtlJk7vvhZzqnDCJvB6JOb4V23Zl8UrqYI,5324 +debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx,sha256=YOHqtbizcUtC_jMeBlNQ6FLQZn-CZ3fcoqChyHF4h4g,24550 +debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_tracing.py,sha256=o-H1r3hMgoWEqiTyjfPMeJHWn87lQXTsqM44PYMEndw,4218 +debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_modify_bytecode.py,sha256=2NTPPo720-yNRYcpO_FXYUkZRbWrpFLPHnCVEksiv0E,13545 +debugpy/_vendored/pydevd/_pydevd_frame_eval/release_mem.h,sha256=MbMCNJQXkcJZ8UU7xoH44MwqE3QRWZX5WCAz7zCju6Y,79 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/README.txt,sha256=jgSPsMO3Gc8ncNUe5RwdxdVB-YHyAioWMPXHcD6KbQE,700 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__pycache__/pydevd_fix_code.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/COPYING,sha256=baWkm-Te2LLURwK7TL0zOkMSVjVCU_ezvObHBo298Tk,1074 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/METADATA,sha256=9XadDK6YTQ-FPowYI5DS4ieA7hRGnRP_fM5Z9ioPkEQ,2929 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/RECORD,sha256=2udHTtpgQXukzLaj7MVfrJhBa40hV7SjP8vyZ5vNqMU,2995 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/direct_url.json,sha256=s58Rb4KXRlMKxk-mzpvr_tJRQ-Hx8-DHsU6NdohCnAg,93 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/top_level.txt,sha256=9BhdB7HqYZ-PvHNoWX6ilwLYWQqcgEOLwdb3aXm5Gys,9 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__init__.py,sha256=lOOVD9sXmMmUhGrsHT-Hbfvxkkr_fksHhoK3MMRvO9w,4153 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/bytecode.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/cfg.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/concrete.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/flags.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/instr.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/peephole_opt.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/bytecode.py,sha256=Ltz55rgfiI8u6AkgKEjPQcN6cmbsbI038V0Z2yI6Ohs,7089 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/cfg.py,sha256=4kRdapTM7vm84NztarrXylB7OyVs58OX0QRFCnSbw7k,15106 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/concrete.py,sha256=1Dxiyq8YdbTGp485BphORX9YC_lqtEDPyWvOB3BsEw4,22153 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/flags.py,sha256=O0EOKqo3KG5fCNiC-PbKrRUxtY8qmLyFmOifalrA-Dg,5851 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/instr.py,sha256=Xh7F5I5aRvET9ckEtwcWixjyorJTgHTxNRy3sUFOZTU,11319 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/peephole_opt.py,sha256=hWqADZBfR2XFzgQhnMI3Ehvr_qmU3YD5EUhFHmVNQYw,15694 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__init__.py,sha256=Y9YYEfLXTsK-cawB_vGY5J-eS9zMlgQhrR8PgtAytzI,4944 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_bytecode.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_cfg.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_code.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_concrete.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_flags.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_instr.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_misc.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_peephole_opt.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/util_annotation.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py,sha256=dCNH33zllq0I1cdJJMiJMVSEPak59HudvPTfLQJ_pjI,15879 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py,sha256=alz8zqwS7YKpxeZmm0DJLQESYdq6MMHM0aWJIku4W7g,28311 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py,sha256=Zme1AIunMA3-8bI80UUz7N6b4XBTzGp8fbKplgh1oy8,2425 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py,sha256=A2tz5Ok3Rc096nA4TicSLc4-p5_RegKZ2I0mWbxOMhM,49321 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py,sha256=jJZeKuoydHU8MysWEbRVFziUBpqEa8XckLjBt4iRrJQ,6007 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py,sha256=DXZCzcn-zTHdufz8jst0oA_szJyjD4I53kQYFk9iMc0,11537 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py,sha256=U-00FGCnM6lzxwrKsR6ky4bmwT72ixumWTEbggdNyLE,7017 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py,sha256=yFqYsN_9AJnWW6wifg-civ_1rdzXlJgEOosNWFqyJrs,32866 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/util_annotation.py,sha256=VULvmILaYyzOfOii8hHR-j0pnW04h0hgdk1-kwIMJ18,463 +debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/pydevd_fix_code.py,sha256=01uudUsZpFPHvT234uV4oKSJBGgdl8jGolZ2oPjqy9M,1761 +debugpy/_vendored/pydevd/_pydevd_sys_monitoring/__pycache__/_pydevd_sys_monitoring.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_sys_monitoring/__pycache__/pydevd_sys_monitoring.cpython-312.pyc,, +debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring.py,sha256=BI-BAJjuCMJog9PzdYM3iHLm6BX5s-gdq6hadKDFSy0,73390 +debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.c,sha256=IcfeNwlGd3ApZFLBF08lcQ8Jvoy-tDQWssQKEjsl-aE,2022211 +debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.cpython-312-x86_64-linux-gnu.so,sha256=E0rBbyPkSlhhCFYujkk6g8gzAbCKh3tqgl3Is1x0cPs,4031712 +debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pxd,sha256=p9bIrp0Afnk7VI84PAyUkZ5-YmX0FHRDgUuD49jqNOg,2339 +debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pyx,sha256=h6q6c3rW6zfamydPfFR0pjQIGBe8GyoQjhc_BBRkRFo,75750 +debugpy/_vendored/pydevd/_pydevd_sys_monitoring/pydevd_sys_monitoring.py,sha256=r3vtANxiCWK4eyGAkh90n8hAEdFMkyKvgWHpxNpFahA,549 +debugpy/_vendored/pydevd/pydev_app_engine_debug_startup.py,sha256=aUfyVkecqLGb2_lcEasx_0r_tfmBJ5ujI-oALs2OMWY,669 +debugpy/_vendored/pydevd/pydev_coverage.py,sha256=MAXc7dsM_iVzYeMWWgFGow3vshy4597VxNMhqoXw6rs,3112 +debugpy/_vendored/pydevd/pydev_ipython/README,sha256=rvIWDUoNsPxITSg6EUu3L9DihmZUCwx68vQsqo_FSQg,538 +debugpy/_vendored/pydevd/pydev_ipython/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhook.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookglut.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookgtk.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookgtk3.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookpyglet.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt4.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt5.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt6.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhooktk.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookwx.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/matplotlibtools.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt_for_kernel.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt_loaders.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/__pycache__/version.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_ipython/inputhook.py,sha256=AObjWOCN_FZqvlhxRRnAzPNvFyUd2CC9OPwh7SE8_Mw,19978 +debugpy/_vendored/pydevd/pydev_ipython/inputhookglut.py,sha256=EN3MwAQLeZPJ6YQGf9jPqf0Dt1yfzRy9vFI3KoTvxrY,5619 +debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk.py,sha256=kwFRWRb4gU4wv39gkL-3JyR58W5wkwhFrQWh_a4WVZM,1114 +debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk3.py,sha256=JXhh_JdEDCjFJVYaI-RIP5N4WS5bLUFhMObS_vf98cw,1112 +debugpy/_vendored/pydevd/pydev_ipython/inputhookpyglet.py,sha256=Z81MLqlQNqHOKgV9VVaplWLRx83-ESHx7NhyCK3ZnA4,3264 +debugpy/_vendored/pydevd/pydev_ipython/inputhookqt4.py,sha256=fmjiu01IGsgnGTNzsWNywwjRvKPAt2MnOTrhDP6KoTo,7251 +debugpy/_vendored/pydevd/pydev_ipython/inputhookqt5.py,sha256=w9SmF3s1AI6lQt6eOt0HubsuThlauHN3tardQdHcxZU,7297 +debugpy/_vendored/pydevd/pydev_ipython/inputhookqt6.py,sha256=lnZl_FKgPKpAtRVpssboxMdajYTAar6J7-eVsrSMcgY,7332 +debugpy/_vendored/pydevd/pydev_ipython/inputhooktk.py,sha256=UwU5VCPtL6BayUy4VauXnzocDotgAA59nnHCVCTujks,754 +debugpy/_vendored/pydevd/pydev_ipython/inputhookwx.py,sha256=HhX9S6aPZcyT21yvE_V2lmWiujKUY6PQfnbEpIXdlg0,6527 +debugpy/_vendored/pydevd/pydev_ipython/matplotlibtools.py,sha256=ALCaCLM3ikmARJtyfNgVbM76EKK2U8ZoVgD74vWyBfk,5355 +debugpy/_vendored/pydevd/pydev_ipython/qt.py,sha256=TeVCKo2j9m2UVUYHWKPnNxYviNwYksQXqU6dVMuoGSQ,872 +debugpy/_vendored/pydevd/pydev_ipython/qt_for_kernel.py,sha256=ascvuaRSEjDV_Qg1svDntW5dXizhDiZ7-JWa2C6in-U,3954 +debugpy/_vendored/pydevd/pydev_ipython/qt_loaders.py,sha256=0Zw9erdlR9c-kxNQvR68fKR8HGcJWFvptsqSHv7pWbY,10423 +debugpy/_vendored/pydevd/pydev_ipython/version.py,sha256=Dwjp3k3a_fdBFmSewViOYY1YT3h5duLNsbbNKKF7xWY,1496 +debugpy/_vendored/pydevd/pydev_pysrc.py,sha256=dOUTYxOuRSKfHdc6ow5BINVU-xfhfhX0xf8jNIIJ4B0,101 +debugpy/_vendored/pydevd/pydev_run_in_console.py,sha256=V3HQfKuyTVXz2piosoOqDCKVK1numOsuh5bdo3a9Z_w,4637 +debugpy/_vendored/pydevd/pydev_sitecustomize/__not_in_default_pythonpath.txt,sha256=hnkTAuxSFW_Tilgw0Bt1RVLrfGRE3hYjAmTPm1k-sc8,21 +debugpy/_vendored/pydevd/pydev_sitecustomize/__pycache__/sitecustomize.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydev_sitecustomize/sitecustomize.py,sha256=3jy-E93p1fIpuoH9YjBAc3Z_fctGTp9tU-05B7fNHY8,9672 +debugpy/_vendored/pydevd/pydevconsole.py,sha256=RA9k6VaVL5cmIQBE1qoAZAw5Kvk1TK0Va7xEEtxZ6ko,21119 +debugpy/_vendored/pydevd/pydevd.py,sha256=hTW3iG4WMqHwfphLoagRZ-A_VK5qVpEC1KvwM5SKbKI,154970 +debugpy/_vendored/pydevd/pydevd_attach_to_process/README.txt,sha256=JibLodU4lzwvGyI8TNbfYhu626MPpYN3z4YAw82zTPU,960 +debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_always_live_program.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_check.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_test_attach_to_process.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_test_attach_to_process_linux.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/add_code_to_python_process.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/attach_pydevd.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/attach_script.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/_always_live_program.py,sha256=paautgjjZYWolomOWv4ti1K6_XumjSDDbrHPkXYC1Bs,687 +debugpy/_vendored/pydevd/pydevd_attach_to_process/_check.py,sha256=yL5p7qHGw-1aoESl1fbcwV6QXgHmtb3bTTFN0xV9108,136 +debugpy/_vendored/pydevd/pydevd_attach_to_process/_test_attach_to_process.py,sha256=ETGZegNNorgxyYuJUviWu4hFm6946sv9ZGd7_N4doAw,299 +debugpy/_vendored/pydevd/pydevd_attach_to_process/_test_attach_to_process_linux.py,sha256=NVKu3K_p9zzbHbULftrrxe-FvH4XIm7G7ipL8lXt0r8,2563 +debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py,sha256=CvNaX4F9U-66fwEmE36gbvdq0OQw88DmPTuuneuCE60,22591 +debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_linux_amd64.so,sha256=VfHUwn20XKLQTma5FaRtdCChDTrtM8QZgvIvex7RjEI,31160 +debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_pydevd.py,sha256=Sqinii4iXCP4OPrn54queWZ7oyBmJDoyb8FY8n8FHMQ,2585 +debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_script.py,sha256=L7RA14Og8NhnR5bUFuPaNIXKoQb0d4ldEm_ppbI4KZo,8027 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace.hpp,sha256=GCjlTIQW1wRoEpp1yCbeJiUaa9JDTbeOypJiZBRtxPE,8399 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_310.hpp,sha256=mNr6LVLPDoCRyxLPTdYb0JWDXSfRn7xuAzPOzZWvoFs,4062 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_311.hpp,sha256=_tpO9I0U0f2RqCYM8DIOPQJTLv8sL2NCxwKE2BnR0NE,4269 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_common.hpp,sha256=r1ch6UgwF4rxW8ehiNnAvJE18VCoUl2TujP7nTCy0vQ,1870 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_settrace.hpp,sha256=OKa2mC0dEpE3nAij3mA3sYyVlEXuj5nDI-C-fdW-mdM,7681 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_utils.hpp,sha256=7GKYwDPPvu5JhPtni2zB44r0Kh0bO2NZH-LAiFkY55A,3865 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp,sha256=gh4nf1am3is_-_ocE3Z8TQbEoZko-BP6EtrYMQTtPjs,2912 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/python.h,sha256=ueIyBiClInxfKMlgAVMuxTvmhESadiWeA4uSwZAROeo,21631 +debugpy/_vendored/pydevd/pydevd_attach_to_process/common/ref_utils.hpp,sha256=8wDFQk9XoAnK2EdM4J-RErKfBYZn93uG6Rw5OCbLsA0,1475 +debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/.gitignore,sha256=r3rDatBumb9cRDhx35hsdJp9URPUmjgkynAQViLIoR4,82 +debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/__pycache__/lldb_prepare.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/attach.cpp,sha256=xG8NmOwfuhXN93spuG_uEfe0tOn32hnljCqY5f1z354,3703 +debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh,sha256=zLx_fpShueHqBioStvOE0hm1aBuvIkc5EygxXSSh8mQ,275 +debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_mac.sh,sha256=6szfH260KYg9ZuPusllOBx4vfPXU6ZrOrOrEdh-2bOM,232 +debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_manylinux.cmd,sha256=W93C4jG-fGn27rd1Yes3neP2upJTO9qAdKZPf8cvSQE,633 +debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/lldb_prepare.py,sha256=GqHCLbSBblmzU84bAmmyz5Qx_H8dvFupmTdINziqjxg,1679 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__init__.py,sha256=XA6hCWO9SoUtiuxV1v3HJkZa1BmIShgUprOgi4OlTUQ,6882 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/breakpoint.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/compat.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/crash.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/debug.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/disasm.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/event.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/interactive.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/module.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/process.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/registry.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/search.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/sql.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/system.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/textio.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/thread.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/util.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/window.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/breakpoint.py,sha256=jcOEzFhaddlbO3Zugzl0Mh-lstl85asKhlPmrgcfA14,165140 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/compat.py,sha256=ihE-Lzas1wWBRbIEBQA9LPvG3Jh7y4iPJuMlk-Kos_c,5269 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/crash.py,sha256=SI0ruZbchgv9LAUJJmf1v0R2wsjwcTp04WUeyjh_AEI,64753 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/debug.py,sha256=r7FgApjADs2mU5ZmqtSpIFEEgDbjA4IGKRjbacGrXUY,57665 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/disasm.py,sha256=5BydhX5AvIJfxRkIZIo6YsDxiks52LmgH7769WmV2uU,24389 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/event.py,sha256=fOHu-P2XEd0KPuErInrjY6BBs-nxBsFEz5P9O_kmzIw,65139 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/interactive.py,sha256=0EeHQfjF65jKLYvkyJcJQcOJSMPp0iSzyXZRTUUTubA,83677 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/module.py,sha256=KJHWzxNqkD3aRCR_Cwl-nDjPhlxOFIEn6xtrero3-Tk,69754 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/process.py,sha256=pDXB9nk_-ExnUc6ntUg5IE5pUgRnjeMlUbzS94-4h0c,179713 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/registry.py,sha256=h7xU3ikr-ejiRUtCFaSdQcTIW2P6bskCE4aKQZJEqMQ,21439 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/search.py,sha256=n5rySAFHiTgOfBQN1OoE5dPdinSglAQOfz2jLD-yiuc,23241 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/sql.py,sha256=qMaGYYTqXd5COhAiPIKalHk0ycfrFAKFxjc9fUUSAf0,33696 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/system.py,sha256=PGw1QhMNzdckVKExOV6wtmmnz17e3DUdx9Stni7dvBo,44397 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/textio.py,sha256=xL7IV2tYCILF7vzyx__DZbj_32P5Eyym2mZBjc9RhPQ,59539 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/thread.py,sha256=ca1FgBLQgWFaK7YpdGH-_oTVCz1fLqH8SMHkwnYmbaY,74682 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/util.py,sha256=F94MaOk56bD9hw5IRRVU4HvVrgAFMjmUd428C_g_0No,35919 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__init__.py,sha256=ZtWZmRPUrihwFxg_CjXvQQAc7jhhgCjPoJmzrg8_coo,2813 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/advapi32.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/context_amd64.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/context_i386.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/dbghelp.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/defines.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/gdi32.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/kernel32.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/ntdll.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/peb_teb.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/psapi.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/shell32.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/shlwapi.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/user32.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/version.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/wtsapi32.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/advapi32.py,sha256=ocN7LpTDO2iIVpciWimF6sqI90DVJwD7FMYR7M1JiSA,118442 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_amd64.py,sha256=S2-vrADxktXe25VdRuOy6Q4Dj8mxr1Dd4MIq9Vy-5V0,23649 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_i386.py,sha256=PamJv8oAvxylJJe4m5p-58VLUGY3ULTrIqhZdjedsGg,15408 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/dbghelp.py,sha256=TESaeh8YTpsEKj9ZhWcpkuZ6RAHLjDdJAarB7qzNlMQ,44984 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/defines.py,sha256=bWZzQ-fHDgZWBbhe8-nTrq436brWZ39AFot351UvHLI,20900 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/gdi32.py,sha256=eerwd8qqKxNzlulR47vVf5p_WixeCFmaQLAkLiWRzA0,14155 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/kernel32.py,sha256=Cs_R4qfbCqvPZ4qY-IfrvNx4bu5rUhqccJwjFu3yftY,158759 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/ntdll.py,sha256=KkyFYI9eK8jOVws0j7-G_mDmHKTYP0fLFQkQfilrv2Q,20556 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/peb_teb.py,sha256=PuHmAyFLTrkx2lpPTK9JNYT8YB7zHPcOAgapIlbmIm4,136048 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/psapi.py,sha256=gKLiFGbpmzJ36zj-CW0GWCrbrTwtomVysnLIDXmi80Y,13705 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shell32.py,sha256=NmlMKVF92SnCh4dIq7gX4LCV4qfdZJEWiK2XbL1u71c,12773 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shlwapi.py,sha256=iN18pyt4X9RCsQj_fxkCAyqCqIfmIYP4UV1Ftg0eylQ,25371 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/user32.py,sha256=gIX0gA0qSK_eenRqDUyPnnf6hMnvMnMHCWG3XutnWOs,51438 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/version.py,sha256=UAEkxj40ZltRTW4oaNGMZTfQW5-gRmGlVbz3C1e2E5A,33834 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/wtsapi32.py,sha256=-sDrGpAQv0y9VxFwbdDFH-ozfvE75R_uygva0L58Reo,10781 +debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/window.py,sha256=oBsxsI37NbQkLcDu_JVBRnyRBitXN4AI0Z1b4HSO2R8,24017 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.cpp,sha256=hJY1byqijqru-q6167Akh20aOTLp19cGeANoFpWCTxw,27984 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.h,sha256=rWBA3kdzfyHaE9X9Diub3cojoJlXjC3TKnLQv-nGCeA,1846 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/compile_windows.bat,sha256=YbDPk6EGQPYRNtKjex7GajIrFnnuZ1kigsDYRgEB71o,2160 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/inject_dll.cpp,sha256=GQmZbpNBRMMW1WFcDFOlJaGLy1-oZ4qCCIyo5exPLBM,4792 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/py_win_helpers.hpp,sha256=45pO-c1ofub4nn0XY9kMsTm3s48_EPE-VWAhld3704I,2479 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_in_memory.hpp,sha256=zvDC9cVGZ6BXEsz_Im-QMIubdw6vX3BCIg2T11cVfvg,3355 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_on_dllmain.cpp,sha256=ApQza8ZJrfe2U4jTJPa8ItzvnHc7w2G6Yrfq4BT_56g,2516 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.cpp,sha256=NO8qlc7sKU6oHA_AnXJSodHupZLizp3npBTc-EGpBj8,999 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.h,sha256=l0tEIxxiv0XrIeiJ2zedTd4fYrdlxVTK8ECpBk881WM,1162 +debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/targetver.h,sha256=fqw-iPopG_V-pFRxf33lVFL0uvWfDUB2ky0bibFblK0,1013 +debugpy/_vendored/pydevd/pydevd_file_utils.py,sha256=C_tIt1ElBnF5ju8Lq8pCNKmuYcHz6Z3EdqSQZxX56e8,36394 +debugpy/_vendored/pydevd/pydevd_plugins/__init__.py,sha256=_2bZAHuDVAx7MM7KA7pt3DYp641NY4RzSoRAwesWKfU,67 +debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/django_debug.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/jinja2_debug.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/pydevd_line_validation.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/django_debug.py,sha256=8StvDnfs-3MFuuknOFsoyK_AK5UuEzzthk8DTNFNIn8,22246 +debugpy/_vendored/pydevd/pydevd_plugins/extensions/README.md,sha256=cxu8F295snUVNgqE5xXKnZTpbqbR3LTmm60pgK0IOTs,1183 +debugpy/_vendored/pydevd/pydevd_plugins/extensions/__init__.py,sha256=_2bZAHuDVAx7MM7KA7pt3DYp641NY4RzSoRAwesWKfU,67 +debugpy/_vendored/pydevd/pydevd_plugins/extensions/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__init__.py,sha256=_2bZAHuDVAx7MM7KA7pt3DYp641NY4RzSoRAwesWKfU,67 +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/__init__.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_helpers.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugin_numpy_types.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugin_pandas_types.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugins_django_form_str.cpython-312.pyc,, +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_helpers.py,sha256=F4ODS-1OYkAbKeIikE1y6hh4x2nMJueFtA-uRnQVrYY,642 +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_numpy_types.py,sha256=uDczvkuJgBLb_ULhJ2CA6v5_3JJ9EvNy3ZF6z5i2f-8,3250 +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_pandas_types.py,sha256=DNs8j07AA-OtDwQNIZVGqwWKqEHYFPSIgTa7HtGZVdI,6575 +debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugins_django_form_str.py,sha256=-aj9h1rqP46DMilxMGwi1p3fDa47VxZkiLC3SlRs7nw,539 +debugpy/_vendored/pydevd/pydevd_plugins/jinja2_debug.py,sha256=lVb2Xix86off_pI7FPfukDo5QE_dkHnpPeTiWd1mDJc,19018 +debugpy/_vendored/pydevd/pydevd_plugins/pydevd_line_validation.py,sha256=YGJZ4SY2O6pY70mxSb36fFy0_9uxSDkrA1Z-MqUrYSU,6654 +debugpy/_vendored/pydevd/pydevd_tracing.py,sha256=EgBJwIt0Hn3t6C6Jfd6UoDCIrsxnuES1fxaAWizEasg,15779 +debugpy/_vendored/pydevd/setup_pydevd_cython.py,sha256=bg0KwBVRwAdDKp3u8mlU4arkPvKGlI0A-kQb899V1RI,11446 +debugpy/_version.py,sha256=4qfkdWnkTpt2toZzPoLHMk07oc2bQ_eCXSWR9qiAMXg,497 +debugpy/adapter/__init__.py,sha256=ewTjlS3VAb6lypFWfGZjY7j2wiW6ApS3KSPJrm0xsEk,346 +debugpy/adapter/__main__.py,sha256=MBXkVyKOTc0QwB-vrUAI_al7EMaGIC3k7mXtfBv7U78,8257 +debugpy/adapter/__pycache__/__init__.cpython-312.pyc,, +debugpy/adapter/__pycache__/__main__.cpython-312.pyc,, +debugpy/adapter/__pycache__/clients.cpython-312.pyc,, +debugpy/adapter/__pycache__/components.cpython-312.pyc,, +debugpy/adapter/__pycache__/launchers.cpython-312.pyc,, +debugpy/adapter/__pycache__/servers.cpython-312.pyc,, +debugpy/adapter/__pycache__/sessions.cpython-312.pyc,, +debugpy/adapter/clients.py,sha256=qzv-eHGZvSW2LpiglWyHQr-Oym5-cSuocWlHt74uSDs,31341 +debugpy/adapter/components.py,sha256=M-xe4YIK3oKEwj_G-42kfqYuYODRB-S_m7sI962pAX0,6081 +debugpy/adapter/launchers.py,sha256=VWMB5i8GJX6CW1FP3OtT1a-iGqMcTabJ3UowNiWq02A,7000 +debugpy/adapter/servers.py,sha256=todtOnPao_cU1tl39ynNxMwgHHP8HKNjMPLSDvPZIF0,23418 +debugpy/adapter/sessions.py,sha256=KzkGF3hWP59siooY3UbnATQY2wqIbCHFpqJHO7aR8jo,11229 +debugpy/common/__init__.py,sha256=A9wk72d0JyUbZBXHLvMi7v65_5hy2chhoNTupk5mYYk,609 +debugpy/common/__pycache__/__init__.cpython-312.pyc,, +debugpy/common/__pycache__/json.cpython-312.pyc,, +debugpy/common/__pycache__/log.cpython-312.pyc,, +debugpy/common/__pycache__/messaging.cpython-312.pyc,, +debugpy/common/__pycache__/singleton.cpython-312.pyc,, +debugpy/common/__pycache__/sockets.cpython-312.pyc,, +debugpy/common/__pycache__/stacks.cpython-312.pyc,, +debugpy/common/__pycache__/timestamp.cpython-312.pyc,, +debugpy/common/__pycache__/util.cpython-312.pyc,, +debugpy/common/json.py,sha256=NoinXsMZHybYGNiSbq3_OWPJxtmYbDew6RkqF3zMyZ8,9674 +debugpy/common/log.py,sha256=NqGC5AIo9zdls1FKn5Gv0n1EvLmaB0d5s12CRY7ZpLs,11706 +debugpy/common/messaging.py,sha256=ptfq2f__NWYhqSU_vcP1CtDZ9H5hmCTOUn_e4s3QbFs,56620 +debugpy/common/singleton.py,sha256=bSTqWB9bLp1SpP1W9-LH_OlU9Arbd7pqu4OcjYKDQ_0,7666 +debugpy/common/sockets.py,sha256=RsRPizhPy6SRsK5DSEiUWIBX2fw-D90ch-KnSfQwmZk,4224 +debugpy/common/stacks.py,sha256=czZjqyY_5ntvOSpelZlJkpH4Gqq9JyZY7tcUqz4sWXA,1526 +debugpy/common/timestamp.py,sha256=ZocK6sWz2JUD1hBAKj672ta8D3ze0Z3zJD_CWjeDq7A,410 +debugpy/common/util.py,sha256=CPWCyS757aIcGISxf_SbaGlewSCFOgou0raEKfCZ56I,4646 +debugpy/launcher/__init__.py,sha256=L7aoLf-CaGikoiEJokF5JmSL0Y7FWIn2EOJFV89KbbY,890 +debugpy/launcher/__main__.py,sha256=yLvc7PNl8YulPLINLZVBGY-38hClmkgec0LmkEQna_Q,3812 +debugpy/launcher/__pycache__/__init__.cpython-312.pyc,, +debugpy/launcher/__pycache__/__main__.cpython-312.pyc,, +debugpy/launcher/__pycache__/debuggee.cpython-312.pyc,, +debugpy/launcher/__pycache__/handlers.cpython-312.pyc,, +debugpy/launcher/__pycache__/output.cpython-312.pyc,, +debugpy/launcher/__pycache__/winapi.cpython-312.pyc,, +debugpy/launcher/debuggee.py,sha256=I8pCEge8cSsVZL7J0sZTOh9IuwIzZf7ENGV3-HxSey8,8689 +debugpy/launcher/handlers.py,sha256=vsMHp4SKqbR1ar27RW7t-SbApXdWPfhS7qLlgr_cw8g,5728 +debugpy/launcher/output.py,sha256=R8YWa7ccb9Sy_ighQqN9R5W1OdMNcnmizmTLYc6yTsg,3748 +debugpy/launcher/winapi.py,sha256=7ACn2Hxf8Kx5bBmxmuC-0A_hG60kEfrDtrZW_BnnjV4,3129 +debugpy/public_api.py,sha256=cIm_msfe3DCnISmyd1t71JDfVIbcO69TlnywLtFtBP0,6376 +debugpy/server/__init__.py,sha256=mmPRoui4PkSeZxG3r5Gep6YB0MLMq_lIJru1pfGmKUY,323 +debugpy/server/__pycache__/__init__.cpython-312.pyc,, +debugpy/server/__pycache__/api.cpython-312.pyc,, +debugpy/server/__pycache__/attach_pid_injected.cpython-312.pyc,, +debugpy/server/__pycache__/cli.cpython-312.pyc,, +debugpy/server/api.py,sha256=fQoGQIzIYZPl1TUs7Tb0lA6q2sI3jIuZksArUeD7xkA,11789 +debugpy/server/attach_pid_injected.py,sha256=mx8G8CDw5HGOPBM5XGkjkLka_LHVQJEuMJ4tUJHQqX8,2734 +debugpy/server/cli.py,sha256=NoysHvEe6CKV5YLcJ_18PBe2KL5Ygbx-5SCbkaGCuRQ,16357 diff --git a/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/WHEEL new file mode 100644 index 0000000..e5ff606 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/WHEEL @@ -0,0 +1,8 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.6.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_5_x86_64 +Tag: cp312-cp312-manylinux1_x86_64 +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 + diff --git a/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/entry_points.txt b/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/entry_points.txt new file mode 100644 index 0000000..5aedaf5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +debugpy = debugpy.server.cli:main diff --git a/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/top_level.txt b/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/top_level.txt new file mode 100644 index 0000000..2802a6b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy-1.8.9.dist-info/top_level.txt @@ -0,0 +1 @@ +debugpy diff --git a/myenv/lib/python3.12/site-packages/debugpy/ThirdPartyNotices.txt b/myenv/lib/python3.12/site-packages/debugpy/ThirdPartyNotices.txt new file mode 100644 index 0000000..2b30990 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/ThirdPartyNotices.txt @@ -0,0 +1,499 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +debugpy incorporates third party material from the projects listed below. + + +1. PyDev.Debugger (https://github.com/fabioz/PyDev.Debugger) + Includes:File copyright Brainwy Software Ltda. + Includes:File(s) related to Python, Cpython + Includes:File authored by Yuli Fitterman + Includes:File copyright Brainwy software Ltda + Includes:File with methods from Spyder + Includes:File(s) related to IPython + Includes:Files copyright Microsoft Corporation + Includes:six + Includes:WinAppDbg + Includes:XML-RPC client interface for Python + + +%% PyDev.Debugger NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The source code for the PyDev.Debugger files are provided with debugpy, or you may send a check or money order for US $5.00, including the product name (debugpy), the open source component name (PyDev.Debugger) and version number, to: Source Code Compliance Team, Microsoft Corporation, One Microsoft Way, Redmond, WA 98052, USA. + +Eclipse Public License, Version 1.0 (EPL-1.0) +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. +1. DEFINITIONS +"Contribution" means: +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and +b) in the case of each subsequent Contributor: +i) changes to the Program, and +ii) additions to the Program; +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. +"Contributor" means any person or entity that distributes the Program. +"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. +"Program" means the Contributions distributed in accordance with this Agreement. +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. +2. GRANT OF RIGHTS +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. +3. REQUIREMENTS +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: +a) it complies with the terms and conditions of this Agreement; and +b) its license agreement: +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. +When the Program is made available in source code form: +a) it must be made available under this Agreement; and +b) a copy of this Agreement must be included with each copy of the Program. +Contributors may not remove or alter any copyright notices contained within the Program. +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. +4. COMMERCIAL DISTRIBUTION +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. +5. NO WARRANTY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. +6. DISCLAIMER OF LIABILITY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +7. GENERAL +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. +If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. +========================================= +Includes File copyright Brainwy Software Ltda. + +File includes the following notice: + +Copyright: Brainwy Software Ltda. + +License: EPL. + +========================================= +Includes file(s) from Python, Python xreload, Cpython and an ActiveState.com Recipe on "NULL OBJECT DESIGN PATTERN (PYTHON RECIPE)" + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017 Python Software Foundation; All Rights +Reserved" are retained in Python alone or in any derivative version prepared by +Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (C) 2006-2010 Python Software Foundation + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +Includes File authored by Yuli Fitterman + +Copyright (c) Yuli Fitterman + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +========================================= +Includes file(s): * Copyright (c) Brainwy software Ltda. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Apache License, Version 2.0, please send an email to + * vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. +========================================= +Includes file(s): Copyright (c) 2009-2012 Pierre Raybaut + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +Includes file(s) from Ipython + +Copyright (c) 2008-2010, IPython Development Team +Copyright (c) 2001-2007, Fernando Perez. +Copyright (c) 2001, Janko Hauser +Copyright (c) 2001, Nathaniel Gray + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +Neither the name of the IPython Development Team nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +Includes file(s): * Copyright (c) Microsoft Corporation. +* +* This source code is subject to terms and conditions of the Apache License, Version 2.0. A +* copy of the license can be found in the License.html file at the root of this distribution. If +* you cannot locate the Apache License, Version 2.0, please send an email to +* vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound +* by the terms of the Apache License, Version 2.0. +* +* You must not remove this notice, or any other, from this software. +========================================= +Includes file(s) from https://pythonhosted.org/six/ + +Copyright (c) 2010-2018 Benjamin Peterson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +Includes WinAppDbg + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +========================================= +Includes XML-RPC client interface for Python +# Copyright (c) 1999-2002 by Secret Labs AB +# Copyright (c) 1999-2002 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY +# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +# OF THIS SOFTWARE. +========================================= +Includes https://github.com/vstinner/bytecode e3e77fb690ed05ac171e15694e1c5d0e0dc34e86 - MIT + +Copyright (c) 2016 Red Hat. + +The MIT License (MIT) +Copyright (c) 2016 Red Hat. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +Includes https://github.com/benhoyt/scandir 6ed381881bc2fb9de05804e892eeeeb3601a3af2 - BSD 3-Clause "New" or "Revised" License + +Copyright (c) 2012, Ben Hoyt +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +* Neither the name of Ben Hoyt nor the names of its contributors may be used +to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF PyDev.Debugger NOTICES, INFORMATION, AND LICENSE diff --git a/myenv/lib/python3.12/site-packages/debugpy/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/__init__.py new file mode 100644 index 0000000..975bec7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/__init__.py @@ -0,0 +1,38 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +"""An implementation of the Debug Adapter Protocol (DAP) for Python. + +https://microsoft.github.io/debug-adapter-protocol/ +""" + +# debugpy stable public API consists solely of members of this module that are +# enumerated below. +__all__ = [ # noqa + "__version__", + "breakpoint", + "configure", + "connect", + "debug_this_thread", + "is_client_connected", + "listen", + "log_to", + "trace_this_thread", + "wait_for_client", +] + +import sys + +assert sys.version_info >= (3, 7), ( + "Python 3.6 and below is not supported by this version of debugpy; " + "use debugpy 1.5.1 or earlier." +) + + +# Actual definitions are in a separate file to work around parsing issues causing +# SyntaxError on Python 2 and preventing the above version check from executing. +from debugpy.public_api import * # noqa +from debugpy.public_api import __version__ + +del sys diff --git a/myenv/lib/python3.12/site-packages/debugpy/__main__.py b/myenv/lib/python3.12/site-packages/debugpy/__main__.py new file mode 100644 index 0000000..14b9013 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/__main__.py @@ -0,0 +1,71 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import sys + +if __name__ == "__main__": + + # There are three ways to run debugpy: + # + # 1. Installed as a module in the current environment (python -m debugpy ...) + # 2. Run as a script from source code (python /src/debugpy ...) + # 3. Installed as a module in a random directory + # + # ----- + # + # In the first case, no extra work is needed. Importing debugpy will work as expected. + # Also, running 'debugpy' instead of 'python -m debugpy' will work because of the entry point + # defined in setup.py. + # + # ----- + # + # In the second case, sys.path[0] is the one added automatically by Python for the directory + # containing this file. 'import debugpy' will not work since we need the parent directory + # of debugpy/ to be in sys.path, rather than debugpy/ itself. So we need to modify sys.path[0]. + # Running 'debugpy' will not work because the entry point is not defined in this case. + # + # ----- + # + # In the third case, running 'python -m debugpy' will not work because the module is not installed + # in any environment. Running 'python /debugpy' will work, just like the second case. + # But running the entry point will not work because python doesn't know where to find the debugpy module. + # + # In this case, no changes to sys.path are required. You just have to do the following before calling + # the entry point: + # 1. Add to PYTHONPATH. + # On Windows, this is set PYTHONPATH=%PYTHONPATH%; + # 2. Add /bin to PATH. (OPTIONAL) + # On Windows, this is set PATH=%PATH%;\bin + # 3. Run the entry point from a command prompt + # On Windows, this is \bin\debugpy.exe, or just 'debugpy' if you did the previous step. + # + # ----- + # + # If we modify sys.path, 'import debugpy' will work, but it will break other imports + # because they will be resolved relative to debugpy/ - e.g. `import debugger` will try + # to import debugpy/debugger.py. + # + # To fix both problems, we need to do the following steps: + # 1. Modify sys.path[0] to point at the parent directory of debugpy/ instead of debugpy/ itself. + # 2. Import debugpy. + # 3. Remove sys.path[0] so that it doesn't affect future imports. + # + # For example, suppose the user did: + # + # python /foo/bar/debugpy ... + # + # At the beginning of this script, sys.path[0] will contain "/foo/bar/debugpy". + # We want to replace it with "/foo/bar', then 'import debugpy', then remove the replaced entry. + # The imported debugpy module will remain in sys.modules, and thus all future imports of it + # or its submodules will resolve accordingly. + if "debugpy" not in sys.modules: + + # Do not use dirname() to walk up - this can be a relative path, e.g. ".". + sys.path[0] = sys.path[0] + "/../" + import debugpy # noqa + del sys.path[0] + + from debugpy.server import cli + + cli.main() diff --git a/myenv/lib/python3.12/site-packages/debugpy/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d457a19b841ce2af8764c0c49c3486ded1814410 GIT binary patch literal 791 zcmY*WziSjh6rS0=yN!Fs7zHC%6R>at*(C;3s0as#g@vTi;uMDcF}F9l-I-x#HepkV z|Af|dBK{jTHfkd*2#Qs@=vk%m-DMAPVBY)Y@!mJ@eedJys*m7&D4*tMEEiJdSqWJ#5iK^7~^G}+hE%2XEQ)^M;Nkg6nY&R`@>EMB$2QElom5H4Wt7cXw&Qb_ZPl_we&9EKN)MSf@Fk^Nt|v8?G8+*l^S%bZ%-tXmzY z?7zCTqnKL?6SUPQbEO^!&I#-Rop@l5>G^DAH{2t!$VkEpc|^D&LRw-frKGkD!Zj!b z(RPfva*H-qeUDUzEgxhjyc6yakc`C|8rETe8@v@@J>PWDYdlIbnSu%c;-UcHn%XoM zm-28imd%xxI#g9s@RY`iFY4c-8L*%;7L~$AY4pT^sL?|PDv+V(8IOj{Os!NAsDHrh zKp37BkX{S(*OVf literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/__pycache__/__main__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c9e68c0fa2f9c517e5ad97e471cf56aae2a1af9 GIT binary patch literal 574 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/__init__.py new file mode 100644 index 0000000..daf9f90 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/__init__.py @@ -0,0 +1,126 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import contextlib +from importlib import import_module +import os +import sys + +from . import _util + + +VENDORED_ROOT = os.path.dirname(os.path.abspath(__file__)) +# TODO: Move the "pydevd" git submodule to the debugpy/_vendored directory +# and then drop the following fallback. +if "pydevd" not in os.listdir(VENDORED_ROOT): + VENDORED_ROOT = os.path.dirname(VENDORED_ROOT) + + +def list_all(resolve=False): + """Return the list of vendored projects.""" + # TODO: Derive from os.listdir(VENDORED_ROOT)? + projects = ["pydevd"] + if not resolve: + return projects + return [project_root(name) for name in projects] + + +def project_root(project): + """Return the path the root dir of the vendored project. + + If "project" is an empty string then the path prefix for vendored + projects (e.g. "debugpy/_vendored/") will be returned. + """ + if not project: + project = "" + return os.path.join(VENDORED_ROOT, project) + + +def iter_project_files(project, relative=False, **kwargs): + """Yield (dirname, basename, filename) for all files in the project.""" + if relative: + with _util.cwd(VENDORED_ROOT): + for result in _util.iter_all_files(project, **kwargs): + yield result + else: + root = project_root(project) + for result in _util.iter_all_files(root, **kwargs): + yield result + + +def iter_packaging_files(project): + """Yield the filenames for all files in the project. + + The filenames are relative to "debugpy/_vendored". This is most + useful for the "package data" in a setup.py. + """ + # TODO: Use default filters? __pycache__ and .pyc? + prune_dir = None + exclude_file = None + try: + mod = import_module("._{}_packaging".format(project), __name__) + except ImportError: + pass + else: + prune_dir = getattr(mod, "prune_dir", prune_dir) + exclude_file = getattr(mod, "exclude_file", exclude_file) + results = iter_project_files( + project, relative=True, prune_dir=prune_dir, exclude_file=exclude_file + ) + for _, _, filename in results: + yield filename + + +def prefix_matcher(*prefixes): + """Return a module match func that matches any of the given prefixes.""" + assert prefixes + + def match(name, module): + for prefix in prefixes: + if name.startswith(prefix): + return True + else: + return False + + return match + + +def check_modules(project, match, root=None): + """Verify that only vendored modules have been imported.""" + if root is None: + root = project_root(project) + extensions = [] + unvendored = {} + for modname, mod in list(sys.modules.items()): + if not match(modname, mod): + continue + try: + filename = getattr(mod, "__file__", None) + except: # In theory it's possible that any error is raised when accessing __file__ + filename = None + if not filename: # extension module + extensions.append(modname) + elif not filename.startswith(root): + unvendored[modname] = filename + return unvendored, extensions + + +@contextlib.contextmanager +def vendored(project, root=None): + """A context manager under which the vendored project will be imported.""" + if root is None: + root = project_root(project) + # Add the vendored project directory, so that it gets tried first. + sys.path.insert(0, root) + try: + yield root + finally: + sys.path.remove(root) + + +def preimport(project, modules, **kwargs): + """Import each of the named modules out of the vendored project.""" + with vendored(project, **kwargs): + for name in modules: + import_module(name) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed2d498a3b4929abe36d6a987dc3a65b665b1c6f GIT binary patch literal 5109 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 a=;lSbd6jd~Ej6BST`RiQAy84@{Qm$kKZeZ! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/_pydevd_packaging.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/_pydevd_packaging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..709478591c6a9cf97d306e4086ee510a9dc75a2a GIT binary patch literal 1314 zcmZ{k&2Jk;6u@V8z204a#Ic;VhNdEvQgsh>m7{|w=Z%U z4*E_%B6LU`HwxE!!Oec;W}6aY9v&5*vmvNG6p9Z>39~JugNg4p!YI_Td4fZ+R!V4O z)`7?c;wo?~_#I5LVDu2ZhvpH-n+irxAQMIr+ESmOO>8O6B%f~5(io6KOk`o=Q;FGU zgMd23V@Zi_x&DAqdAg_Q45rcfmfa0P+qEBY%D8=>hBTOKFpqe4gYu2A*SGtuw@$-_ zfP1SxwYw1whPLmm+I`96!<+NBY!2W)=(pXCc87AC(A7bwAKA{32BgO*u``5eh!=E# zVp5Q_C23ZMtxUng=RxhD=Ot7qfBV%l^YY&aYYX_-%9Z`KAIzWbKC684QWc(;(tj%T zIT!eLFWBmj+8y0}#T}f2gRBk#V-Jlm!5cRK4UUu%G|I+D($0R$Eyl&fFqmHw}bjWr;(PVv+d`bd3u)xDM3;CuOu02%}9qJRbyEHLY z+nfrEi(|~qu@VeSoKLDc82lcn9Te-8-Ft`nTwJNe=Jf8;p*b5@W@58?Y|f6&+5In$ z%=ce&e0gME7mi|u6(Pf$IfXC-oZxy%PVbJe@T4+Kx#9Imk7j-`5;fz%ffdn4c!&ix z;QZ$J|8h%7ZL825D{LBaZs){hgUe}r*8KGIM~%gYi2)rYnXwuKyvE1`2NUX=m{|fP z7)|ZoIMm;ci?#2z#>IEyT0O45bzHqVu3r8A_EFV}YnS5k%>L52d`*~@nLqT(v0fkR z_5F)SDcj<-#MQLSB)wOO<_tp5PcNFdW9*VpqJ`5!$(@M5GPzJz@Z7lD?U8{`KW3L< uLNptlXMac6PYk48IZ>68vSXYUbi9C1XG}bORxjbIO!W_RoF7U6 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/_util.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/_util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45f2cf1bf87dcb712c0b089546fb7811d30cdb8a GIT binary patch literal 2522 zcmb7_O>7fK6o6;;$98PT3C@3@(FRZxmta#W8c?B?X-X)hmMZm+s8zc0j-54|U3Yd( zFxp5EA=N2VA*w`tYYshtA|%>gIKqWXFSH4&yUn3eduVTgZ~)Xp-;V7#vQk<`-ZyV& z=DnSn_xZga8XNrx+TFA?}BIjE{Kx|!#Ays`Al^;n+&So znZ}#eZLudCEmizr)PQV!m0Q4gv+u2JaLp!sT83^w?LyLX&E#hO+2=7lDsk3zXgQPfm$6$ z6@+*igu~ND5ROOAx@<%mXviIFaz(Q%wz-1gBC>-yc+A1$4o;aaD~y^NISq^)_kTdU zVYU|@GYR6^(3G0P1#z`w=i=bC;hU#!2bVkEamneO9WKNRpIzxK1-H$O%#IX$i|-cO z?*}CprQY8{ZC7#y{U_g!M*#+vdzP7aAl{7cggB7N&3S*L`bdyG{!jI(RTW4Y6p#@t z@Lz6QRmO~aMRm;vaF!~S4Zz%(-O}E@&AMibRSap5&0X+w$mTZtgv6DwaVAh_2Cp?s z0QggzXSRHut>(T1*nA}!S^~-=mIQGk;-T*KIbIh|H;)Ke*_v>KjG^j|sG2ZD+h75# zV{CZM+&GMxHE@S^ux=W@$_7z;Gc4bBeE9hp5+>|6=#EH!oBYubIi>*nCC<13N3O3j_6 zV9Q)$Hc>oyKe&6%gPM2TYwEi`a;xKZ|H{BgcRt)zJh=GLz3|@U;NAyq@TDhgk26Pu zM?+BG6N!k|@mDH56w~shgen7-iq8rqOOgzFcAo2K9S(z7K7HytJZUI7jl53#V9c#v z=Bpq8V~p4R2#0?~4X`^d_%rVQ5qCe}ytreXN8I)`rnUNU*Lrslzp&mDz)|`lnEnIe C%|ZnL literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/force_pydevd.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/__pycache__/force_pydevd.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff53f3ee82ab2412bcb2896eb46ae16590943c05 GIT binary patch literal 3037 zcmb_e?N1xY8K3d)`W0j1TpS$U+&~G07he*Rv}qbJv9Sp+rUcTAviA!ffCm5p1Z9wiB7}x+lWn5S zl$^*R4)HRd7epa%7wvh6=*T-oCj>Tt1tieXj_kx+}`V={`N!mOIVR z4Y>x?3Ch5ani%$IoQd%=%vBoTXdLnw8#mF-3~ewu8g1fy3}-||Ek`5QpxS1lk1_Po zI1|&tFh)e`;c~rHIrOkxpZMKzR%H|CL;{O$&4lP3<`DzPX8bi~ ze8WD01JX&h(*K#80|^;`0>6g;WqqUHTg6th--BWho%|UPPf;GNxl4>yL*i3xXXZ(1 zmD}?HF<|OJs&|MT5a2-0Nb{iwcjT@ea#2$XF&{eh7Q~z0ruB_7bVKIi4V`KK12ULP zuvrbs_Q>SN5VfK9kKr%5w{ZM6n_ISZgL6QGcWe;crhNp#2midw-3E8yH~jy4i~sYw zzrW)PBWOP)-fX^DP<1I^KqVQ^eqme|{XFreS8#gO@@k~HsN&`9T`8Z^=?j&(s9m2( zoNHJ?1r;M=FP0HrLqsqou}h|0AIvK0LcW;Nvr94#r3=M!sIVNWV?!xf#VJ${)q`QQ zE?jYke)7|G&K(L7UoO()}0baI~X3u+0Irn%eE*sZ8!zFj{aMtG@|DVB%p zA&2Ech8+7kM4FhKj*%0VYw>1GnwXEw#H84*$TYFdCW$?pQRoh6Hk|2{jxz%n*1)bG z2+FkTv;8*Wu+m1{OSA;5#X?rmAAvmsf1ri)iXKjf7d5PE;R&o`B@|V&C>xGqZB;K6 z!$q}_!+J!~jG~6~Wvr})yJ zO9B=lsljKZP*_z%l+pL;zt&8L3iuQ6+2#XPKJbEXRXeGRmaWCg)tl;2pU?6kyqqe@ zy0-4I;t!!z@c@2ry_5CL8%o1pr_|p|T=lM``%;ZW6I($e&O0ep$toF*09Bw))ou(9 zV=%t^#3PjywnYLZV%O;DG7bkVafx;Um)A0cH-Zp5U5*|o!slr2iG!vvtJ1=Any!*& z+KA~D>CIwI8s#F>Gbroy`1zxl9zY7o7L*^>`KZQCMtWu6kPh zo12f_jLj}Y7ABLk(#=URX10>rW>5|plLEB8^pq?gPJF;X7$0%sPb@6VNjGlN0CV%n zh2-_*G&w$J_UHAIrWf+rb(0HeiN+=(i_;4YnA<$1(o8ZMBRstXR%qj8RfTpvaY~YL zIwXm>D96c}x#awU+F>kelvOo;j2t+x)-R@O>L@jh7T5Y{d+%}(!mr!__PheFSHSmo zFjfO&ukFC!wRv}^Yv^I-$=zDl*d7P{<8Y(7;(7lEf90BY{H>d9+rfcqaG(|(s`-a2 zQ!m}$sa*dHf2@+YH?uKwzkAd9iSHxdL;Gi*N1i8BwZ5@hYozLrJm<%E?SMbAY5T?Z)<4u1wXdqI(EOW=4yKlpfC-0+WNNoZ`9hRww$f|oZ;CQ zjETE$@ZB-E1zMhii@QySL%X5lsK~tc{gp3)Gid(@a0-rnfx`AW0c?H+n!mI|7^ECw zXT`n^I;x;!t8;|L{>l#E;Ge zLKmo1sbqqol{yyDp?^ZBE?q!W1R)S$WD`qRtR+f`*h?iT_Nat-MqJ@yj+4F^ zM^Q-znJNhZ6pXfc#mL@>JWe=6o#^}sa!*rAK??Vc@XgWyAm_$;RcG$p`hN|iOO<1n zCwMvr z4;2Pj%jNulRXx|B%p|Pg8z!-+#yqVInr~9dB}>GsYplxS07Fy5P;OWjkf|^kFW@j) zsoCJN5cwWqlM;z;GL&h9`rzVlgb}j>hUeA-qtYORD-Bj9VB*O^p6ap-Gzg$mclyj#Mbs8eU}^t#LRivFCRPW4$};A(kdV_VMyU1pxI z`^0mA&A8Mq*Fdia;5PM|UDi9;52mK?>(pkD^Ucb#X#v&a2Ks?+GsAW4q4a zTn4z7?Sc_2dp9%X2WQHox`!JzcuYn)T=dt{4}3V4L{U7Dl+%=ejDEK&iZ7u(P;qAiu%f0k?t8g%M zeN$=ct;GW*ugrXc3+H)JlcJb5V-tfJjX!-;V9-}L**?70GdAD8seCKO& VEBEc{PTBf}s;9RFq>-B(@GlWh54HdR literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_coverage.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_coverage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc637e1ec705edbcf66cdb7591885f41501b7fc4 GIT binary patch literal 4052 zcmbUkTWl29_0D5=XJ>cut}$Q(p=03$Z@{}iKrIf?0JeFAU?46Clyo)Td-2Y)J2Sd7 ze(Y+UnkrFD)D)w%wWFkp^OZ!XYWh_^Dix}#Ldr+I*vOj+AFiTG8+Bj~6~uxV_Z6R(yLFou6w}ajTge-EFh>;IQ0Snpqzz0u(#8;>>HtZ| zY0mp3y#4S9@I2fCr|?zyS`LkJSQzC?T-M|15rnMokxhMBLO1F(>A7#g3j8N5EVjTk z_A&Xay+LFLJ?Ij`{u^~J_M%b24lUgX*@(AZetUWWyub}67Yq(zX_UwApGS*BCH_VC z*@|`{iyP)SbO9i1=Oe-eG|X*<-31q>wvPvkzmOFeM=~UR*;0lx#Lf_^z@%K#K;3Co zSNe%UiHeo}f_v_1y>5|&(wEUJ1^$U;lC-Agas`*9P6#Ggxnxi!VHQSQdX}QUqFSP!t)u!_$68BqJo<7Y{hRVL76y+8M{MS&UIf zvdo-jlM&ky4U_0jAZ_GLb|Es}<06%S6lErJB+W_GpYb0nEB5Pc|_)B2NU!Oj@^Gl^ZhlNPYh zVXEoN;FVSqlm5X0vye;;5gi+pU;xErsQyZMiUjeTsK-;vETot~GzN?@PqwbXG=?6^ z$hT&pp=s<`B@ldl_{#9>uUvU$0?!3DO&|W?==(?K+xC>(_I%to+tzt=SGn!Lt@U@? zj#hbJFm^w-ZURqr&Bj`*h>s}KXYNNgOmXk|-}b*FO}BmMpNl3do4z+8eeHwWs*J)- zW4+@)80-Byw7maU)yD;6m2k8YT07ReXgv))-4?@#1L$^i%b`x;c0yw7PTyfMaQlY> ztp6msbAUe_7SaH{G?*RS=#(Mq+~`CQoh(XGj)N#g%&#Hhm|-3pLmd4E3*T~w=H7oq28K9dVF;YV43B@63RBOq=iHK+1;x4#_|Cata(Oc)NgO~uuFd2;Msxx+`; zg||(pNud@4qfRIVg_K&Fp{G)dT;c)qpE&=33HN}huDGu*QeM-w{9qo~G;8cH3t1Z*M7bhWiy$qRol(U!MN}T6Ezv3o2$iOiX zZ222un2U3#;+!K`HjVQRpV;YeBNk&-QD_uii^2T^L?tLC{IohihyQr)FXL99**UXGOsm#?WVCqLA4u;@zV^@z|>%H1Lv$w|?^c_489NzV*_VNQ~^5;O?*8I(=wv?NgPemdTUX zPfo{v*}KrxI^Wb@ZfgH9cCTrBH3)ED$SC?mCAxM}zAn#4m2y;>X?Pb!jR#5vq!^ui-Ok z!&mE()G$6W^~79Y+x^B3?+Wi8nQoqM-CJ(mJKy?jx%JtbM`l}}yVZEBb*8mzwz+$@ zv1dF`2{lffyBpe62{$m>^Wn{R!V|EpJMH6Q$RBzNvm+@-?uFB~mjj$LFLIj~!WalD&L%S8BeK z{;U3pKGX8!IVttI)Vv_Y=A}(#Y15qa#HZ4lMT<3ue{K|yh0vYQp}i+~f%zBlHlEQ7yMf`)faw57HhuW68>G)j=s7_XW>$;+Jv* i*YsuEa~v0{_V7pyj~DL>EuV^^*N#^OByObLfb(y%@sm~n literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_pysrc.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_pysrc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40bf983c05684c01db28d584685beae2e52b3522 GIT binary patch literal 327 zcmXv~F-`+95Ih5d2q}Nqk}HS>vSCGflB#O+JtT`d(%jtcuDSNc6BXB z6PLbLtGdG|H8w-%ldRV0GzHXoRO9*p)$dC)pZ1emOM2+>E}Uj3VIk#4rX%z literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_run_in_console.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydev_run_in_console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a65db3f40a293c53a74ff3c447fa39c0b613a4c8 GIT binary patch literal 5347 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevconsole.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevconsole.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e84b3f39b8c52be132085518d0a1387a24909bb GIT binary patch literal 21494 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 f59=pl0 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f29481403fd466a5166cbf49d031dd4d0e63a3f5 GIT binary patch literal 150393 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 ((wP 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\Yr^oIbKqr{K9<7tA~O4&anB{knT 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 T9bBTHT5dYHUO%-?g!}&knUt+` literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd_file_utils.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd_file_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6514983bbb9e29d1d41b86baf0d0760f8c192858 GIT binary patch literal 32269 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd_tracing.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/__pycache__/pydevd_tracing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7fbbc2433cebf68b77874038212028494df50b5 GIT binary patch literal 15140 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 b`u#Qu>;gEj{#m{9f|dL^c@jTQlkog+K(`3> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35f487d5b537c3561033d858821293e76e1bd5ae GIT binary patch literal 229 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 t#rVV*W(RgW+Pp^7 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_completer.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_completer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..971c5d58935bd031c7081c7dc85d6a93e6996980 GIT binary patch literal 9444 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_execfile.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_execfile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a9be129745c8ab50f03f3119c3d20e70d69588a GIT binary patch literal 861 zcmZWn%}X0W6rb6hY<6QcBuZ_eQcEi|hdS8OgJ=sD=`pt!>?I^SlXT;Lv9o@}?qUu- zC<-b)*rUgmT>KZj^wN_^F-$Ll^w682Amr2;-GxBkutc7)W^u;!Koj4&I`Eo&G!42#~9j zToZyYpT>oS)LYkxvL-+Th}ubR5(ze`4@Em3gDJq^iUPp`fMRV=tf~uO1(s0xudLI9 zIgaQmHA@CpS&MO_(x72Is5+Eu^-8U3E^?z@Y1m$^YBR2f-Xe9aHOi6aQWZMEcOs=s|q&QqRJvXFo$e0|^_^tG|u;Yf<#P1jl z7=BAd#Q1z*5ev^#witRo_5-g;!#S5(HJf6mMcrj=TQ%&r!jGQ&Vsh#^W>!d_`GR=0 zK^Z2rw$$)jxUx)L;sun5P(qgpuH4v4ZOJ8~Qi5bBB>73d#q|^fBZ8uw1X~fR4Z7KZ zcJx~>p5==>@n*cWewv>+&QF}?@o^q+pl&wT{?r{RZm8#I_{=EmjBSqXh9|~@3ji~Z z4z%v@{r#D}nJ=$4^lMe@T)2V`#Qh(@ZiZe?Zm)`BZur4nz=T_`Au4n$%lS~ z3Ukxy(RAjGk}WCaatYpW`wlL}Aqa+r>gltNN0w~*Iv5pDJ~<{kf1yGMuh0;j4eko~ E4=qZ`=Kufz literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_filesystem_encoding.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_filesystem_encoding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58f1e19aa18b4c756a98e3f9c1c200b0b2eb1fd3 GIT binary patch literal 1446 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 CrL-CV literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_jy_imports_tipper.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_jy_imports_tipper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dae16f1e51df711b57da4dbd830c49e044c3176 GIT binary patch literal 16986 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_saved_modules.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_saved_modules.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb3e140f78d8f158bd166da3437705f73a62f33d GIT binary patch literal 5726 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_sys_patch.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_sys_patch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a118f918a56483b59586babaf451425d5aa3e5c7 GIT binary patch literal 3114 zcma)8OK%fb6uvWK$74KT8|URX5R(_40I_%oh(JIIk3uV0AS!_>O&!k=9Q@LqNrP@axXM)5tXQ1l3XMzKSM5ZssNf-9iRo(3EGk4 zSD$oObB7gZ*-w3?xs z3Z|+yp+*(Z9)^~(w+^>1 zz>q0c&y5172}NK-e*S8k@%j!vqri^8$p;2KO zmnYSVzyT-5V5U)2j&aRX<5`uN955fa&!3^_R_0AnQPQ!LrYLN`FwkTH%k*SuVpO48 zG80p+lbW_}vZVo>mdP~$KA;x>X!Sn|KWn-TqU+tD5PV|b#)+aBTJZRPJbeA|ZSAS2 z=Z)0)T-scA5~-IRBE{Q>%j?`G=81yaV&b;) zXu|UQiFmH+nlT3dN(>J6veK^j>w}xNj_4Lk38%6Y*w7}mZ8x3 zUrMd7y8G@8+#Q%3E=paC!L5&kQsh7(a^P9;;Oy|+>9_5~?JxV8Y3HlR&QfH5A+jHh z`xd))Jc^eFPZkDGKI{5?_Eb^od@F+WyOlQL3oQ}O?O%|5Z=2CU8+86H`>dhYqVK(q zr})^p@92K=`0&1Akv!S&9(D?UI5^ZIKfGRugM}?Nht4n#)xJ8``m(9b*08`>Cjjf* zRi8DhI`*~HM#pRnR#y^@_fxBVjVbu?*S9wfPjdf+goLT?6eS1!(c$MXwqI#vcy2no;BKxqYRbosS9J5 z@qmGptwC@zxU$u>54x*?+Zm6g<66@C4AFG>;;4TP;p2@A;hOJ3O_RkyYbnrQ2=wFo zXQ6sdpKq3nu7SmlO{I>Vg^rzwVn92N_Z40JW!}jE{U+F13T`h1wrRG-7 Mzr3rN^Rw0e0Z~zam;e9( literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_tipper_common.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/_pydev_tipper_common.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a777d31b7a2292e8b78a3ae052f399f649e55fe GIT binary patch literal 2239 zcmah~O>7%Q6rS|JMO z++b_nAB2PhmFfag-CK`Ez4V9#;=-W^IM|9&tZfgK=%u%)=>g?{n6b05lYkg$=ly-} zoA+jBcYo{Z>Hu^+N`Er{yAyyvnPCsdma;KOl{-KI3QU1ZO$jeS#qlM$iHLBi}f=TCL8_kL=~K*%l0Jww$_r0!*u4Usc>xGUe`r>Yzzt5n#tL5Th4$__XALH zo33P^jcQ4gGuzfxYoI4pzmXy@(wQNA|{dF+}zvb})?XjkhsiGGWI}s5l>N z-BJv5t{oBgc0{06Pue*xX`ca&9&34Rt-$}!9pdd1F1Soyfr~Q$pzwd*3BLVKAgFiJ z98W$-cc0(RhBw3Xrcf^SmXImC62)tR#%=9jGdXViTYJ)ei@$&e0U5S2hX4{FJNK~d zX~_b-2yXtp3_j;Bf@K)(JdfB`=6#pv@R*#EFs3r^n2TGTvJp#YDOH!!YLsij8d%HU zh#*W-ny%_b{^;chO;Xgv9FCfi$+5_(lcRIX(Ug>qD^lcyN!?Mifq6IjoP8Sdff*yL z8zj7_8_QuSZe+=c@FomL_gP-XDNFK#YVn$mGpbB1kA~BRl1-_WXI^bAifIrxs>_XqNTT}Im#FHSTJF6v`54~e3pyt0k)j1FN@1a#DbdTOzGJ)X7TXW z*er=@ortpdF;)>4-&2XIhi8zcXyS~D7m1M(GssA)WLn2sJf({1oT^_DQ(9cikJM>W zY9-Z3Y86hMwBDxk>W!-Dom=(4U*zik-qP&X3#}f>-F-FTaJ{>)?&~g1uY6FPS?7Te zD9wJeu-?HMJyeFpe8m%b*3n-Hj^AIZ29G_Qss`WuIq>6!p9ZSI>D7+Y73b-{UQU7T z;THflI~~70{`Hx4j#`_zm!9LVL%wqYcqH_ldzE{11kyRmAukOe_M>ea_YYu$ssOR? m{HEt*^NoE6jZ>4o^O*f*DI?~kV1$;wq%N_mdE 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�}jPP9yMl!QL)h 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 W-*kS}c{j1AnHX#&23L{6fB!$S1l8UE literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_imports.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_imports.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebe031e6ca99a7a1c7c5c893df35aae2d0842e77 GIT binary patch literal 637 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_ipython_console_011.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_ipython_console_011.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4197a3cd7e15441ab4dceabec3762dc12ad1cb97 GIT binary patch literal 17631 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 R7|*@Wd&cU`@B4Vb{{w^Uk>vmY literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_is_thread_alive.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_is_thread_alive.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc64710400ed7d9dff334239a17451607fcd6a7f GIT binary patch literal 1190 zcmb_azfaph6uyh�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 aESfhg4yt;i)rBk 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β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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_monkey_qt.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_monkey_qt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a98a85723efb5dd7fa96b3e0d656c7e81b3d7d44 GIT binary patch literal 9101 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 VjyuFXI?FHTqK~&9<~SQ4{~KmF8n6HW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_override.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_override.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..390361ee5f49d985724b525ac18da94096b401c8 GIT binary patch literal 1524 zcmds1&1(}u6rbJHHcisTCaGvkaXbVX)T~j#Qqo}U2Ocy%_yu0p&CVolvtP_?QWH`L zBAANcN!p(3(cr;RDZDoA9ys!%9?nXHGc&FGKmC!jibb6#d1FY ztAfMd?n*^?)2`|<&(znk_txqNtKkrP1<1U;u2cYTX1biXM=UefYtl4~5{Mt!SamQu z2Qvi+^8T$5&CwVxO5$}-(<{rSVqjTr4$o4GiKAKO0wES@4#+aHR9R-AzHGr%n;wJa zn*9cL9$JX|hhlvk__1Jf?ZavL%~X%h;JUsg}{PWR$R3 zlyog4*(H|9ycADdl&I$5^R}Yql^muL!kI$OE=h6`o5&&b6|xiwv9=7tYf9|q;9E-PE+x=&(G?nx0(7;1r2}j#mw5w#^Tn}=F%ts*+yug zHrEJ^ZbY^wHYZ;9zYW%d+b5?!hNfzBUqbLz_;V<_9fEGc0CA}}V>8%;Ijty)&^bmq~oo$8_{_PMiZ*-fn?j+pNl*ha1KY237L;lK> z>;J|Rcff>Cp78(ZZyfRUiXsu_JjDSWl86ULl8%WklU(F}Le3rcj(gsuVWEPKQ)HCc Wx@6n+2!ilU92LT?3jrbQ*76f>`A&rZ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_umd.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/__pycache__/pydev_umd.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..408cef8654fd5a7a881bc0cea010c6b9b2c2d515 GIT binary patch literal 7327 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 h7jO1`8ur*NS%Eb9WK=TNSJN completer instance. + + If unspecified, the default namespace where completions are performed + is __main__ (technically, __main__.__dict__). Namespaces should be + given as dictionaries. + + An optional second namespace can be given. This allows the completer + to handle cases where both the local and global scopes need to be + distinguished. + + Completer instances should be used as the completion mechanism of + readline via the set_completer() call: + + readline.set_completer(Completer(my_namespace).complete) + """ + + # Don't bind to namespace quite yet, but flag whether the user wants a + # specific namespace or to use __main__.__dict__. This will allow us + # to bind to __main__.__dict__ at completion time, not now. + if namespace is None: + self.use_main_ns = 1 + else: + self.use_main_ns = 0 + self.namespace = namespace + + # The global namespace, if given, can be bound directly + if global_namespace is None: + self.global_namespace = {} + else: + self.global_namespace = global_namespace + + def complete(self, text): + """Return the next possible completion for 'text'. + + This is called successively with state == 0, 1, 2, ... until it + returns None. The completion should begin with 'text'. + + """ + if self.use_main_ns: + # In pydev this option should never be used + raise RuntimeError("Namespace must be provided!") + self.namespace = __main__.__dict__ # @UndefinedVariable + + if "." in text: + return self.attr_matches(text) + else: + return self.global_matches(text) + + def global_matches(self, text): + """Compute matches when text is a simple name. + + Return a list of all keywords, built-in functions and names currently + defined in self.namespace or self.global_namespace that match. + + """ + + def get_item(obj, attr): + return obj[attr] + + a = {} + + for dict_with_comps in [__builtin__.__dict__, self.namespace, self.global_namespace]: # @UndefinedVariable + a.update(dict_with_comps) + + filter = _StartsWithFilter(text) + + return dir2(a, a.keys(), get_item, filter) + + def attr_matches(self, text): + """Compute matches when text contains a dot. + + Assuming the text is of the form NAME.NAME....[NAME], and is + evaluatable in self.namespace or self.global_namespace, it will be + evaluated and its attributes (as revealed by dir()) are used as + possible completions. (For class instances, class members are are + also considered.) + + WARNING: this can still invoke arbitrary C code, if an object + with a __getattr__ hook is evaluated. + + """ + import re + + # Another option, seems to work great. Catches things like ''. + m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text) # @UndefinedVariable + + if not m: + return [] + + expr, attr = m.group(1, 3) + try: + obj = eval(expr, self.namespace) + except: + try: + obj = eval(expr, self.global_namespace) + except: + return [] + + filter = _StartsWithFilter(attr) + + words = dir2(obj, filter=filter) + + return words + + +def generate_completions(frame, act_tok): + """ + :return list(tuple(method_name, docstring, parameters, completion_type)) + + method_name: str + docstring: str + parameters: str -- i.e.: "(a, b)" + completion_type is an int + See: _pydev_bundle._pydev_imports_tipper for TYPE_ constants + """ + if frame is None: + return [] + + # Not using frame.f_globals because of https://sourceforge.net/tracker2/?func=detail&aid=2541355&group_id=85796&atid=577329 + # (Names not resolved in generator expression in method) + # See message: http://mail.python.org/pipermail/python-list/2009-January/526522.html + updated_globals = {} + updated_globals.update(frame.f_globals) + updated_globals.update(frame.f_locals) # locals later because it has precedence over the actual globals + + if pydevconsole.IPYTHON: + completions = pydevconsole.get_completions(act_tok, act_tok, updated_globals, frame.f_locals) + else: + completer = Completer(updated_globals, None) + # list(tuple(name, descr, parameters, type)) + completions = completer.complete(act_tok) + + return completions + + +def generate_completions_as_xml(frame, act_tok): + completions = generate_completions(frame, act_tok) + return completions_to_xml(completions) + + +def completions_to_xml(completions): + valid_xml = pydevd_xml.make_valid_xml_value + quote = pydevd_xml.quote + msg = [""] + + for comp in completions: + msg.append('_= \t"))) + msg.append('" p1="') + msg.append(valid_xml(quote(comp[1], "/>_= \t"))) + msg.append('" p2="') + msg.append(valid_xml(quote(comp[2], "/>_= \t"))) + msg.append('" p3="') + msg.append(valid_xml(quote(comp[3], "/>_= \t"))) + msg.append('"/>') + msg.append("") + + return "".join(msg) + + +identifier_start = ascii_letters + "_" +identifier_part = ascii_letters + "_" + digits + +identifier_start = set(identifier_start) +identifier_part = set(identifier_part) + + +def isidentifier(s): + return s.isidentifier() + + +TokenAndQualifier = namedtuple("TokenAndQualifier", "token, qualifier") + + +def extract_token_and_qualifier(text, line=0, column=0): + """ + Extracts the token a qualifier from the text given the line/colum + (see test_extract_token_and_qualifier for examples). + + :param unicode text: + :param int line: 0-based + :param int column: 0-based + """ + # Note: not using the tokenize module because text should be unicode and + # line/column refer to the unicode text (otherwise we'd have to know + # those ranges after converted to bytes). + if line < 0: + line = 0 + if column < 0: + column = 0 + + if isinstance(text, bytes): + text = text.decode("utf-8") + + lines = text.splitlines() + try: + text = lines[line] + except IndexError: + return TokenAndQualifier("", "") + + if column >= len(text): + column = len(text) + + text = text[:column] + token = "" + qualifier = "" + + temp_token = [] + for i in range(column - 1, -1, -1): + c = text[i] + if c in identifier_part or isidentifier(c) or c == ".": + temp_token.append(c) + else: + break + temp_token = "".join(reversed(temp_token)) + if "." in temp_token: + temp_token = temp_token.split(".") + token = ".".join(temp_token[:-1]) + qualifier = temp_token[-1] + else: + qualifier = temp_token + + return TokenAndQualifier(token, qualifier) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_execfile.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_execfile.py new file mode 100644 index 0000000..4abdd4b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_execfile.py @@ -0,0 +1,16 @@ +# We must redefine it in Py3k if it's not already there +def execfile(file, glob=None, loc=None): + if glob is None: + import sys + + glob = sys._getframe().f_back.f_globals + if loc is None: + loc = glob + + import tokenize + + with tokenize.open(file) as stream: + contents = stream.read() + + # execute the script (note: it's important to compile first to have the filename set in debug mode) + exec(compile(contents + "\n", file, "exec"), glob, loc) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_filesystem_encoding.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_filesystem_encoding.py new file mode 100644 index 0000000..b0a21bf --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_filesystem_encoding.py @@ -0,0 +1,43 @@ +import sys + + +def __getfilesystemencoding(): + """ + Note: there's a copy of this method in interpreterInfo.py + """ + try: + ret = sys.getfilesystemencoding() + if not ret: + raise RuntimeError("Unable to get encoding.") + return ret + except: + try: + # Handle Jython + from java.lang import System # @UnresolvedImport + + env = System.getProperty("os.name").lower() + if env.find("win") != -1: + return "ISO-8859-1" # mbcs does not work on Jython, so, use a (hopefully) suitable replacement + return "utf-8" + except: + pass + + # Only available from 2.3 onwards. + if sys.platform == "win32": + return "mbcs" + return "utf-8" + + +def getfilesystemencoding(): + try: + ret = __getfilesystemencoding() + + # Check if the encoding is actually there to be used! + if hasattr("", "encode"): + "".encode(ret) + if hasattr("", "decode"): + "".decode(ret) + + return ret + except: + return "utf-8" diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_getopt.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_getopt.py new file mode 100644 index 0000000..d8765ca --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_getopt.py @@ -0,0 +1,133 @@ +# ======================================================================================================================= +# getopt code copied since gnu_getopt is not available on jython 2.1 +# ======================================================================================================================= +class GetoptError(Exception): + opt = "" + msg = "" + + def __init__(self, msg, opt=""): + self.msg = msg + self.opt = opt + Exception.__init__(self, msg, opt) + + def __str__(self): + return self.msg + + +def gnu_getopt(args, shortopts, longopts=[]): + """getopt(args, options[, long_options]) -> opts, args + + This function works like getopt(), except that GNU style scanning + mode is used by default. This means that option and non-option + arguments may be intermixed. The getopt() function stops + processing options as soon as a non-option argument is + encountered. + + If the first character of the option string is `+', or if the + environment variable POSIXLY_CORRECT is set, then option + processing stops as soon as a non-option argument is encountered. + """ + + opts = [] + prog_args = [] + if type("") == type(longopts): + longopts = [longopts] + else: + longopts = list(longopts) + + # Allow options after non-option arguments? + all_options_first = False + if shortopts.startswith("+"): + shortopts = shortopts[1:] + all_options_first = True + + while args: + if args[0] == "--": + prog_args += args[1:] + break + + if args[0][:2] == "--": + opts, args = do_longs(opts, args[0][2:], longopts, args[1:]) + elif args[0][:1] == "-": + opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:]) + else: + if all_options_first: + prog_args += args + break + else: + prog_args.append(args[0]) + args = args[1:] + + return opts, prog_args + + +def do_longs(opts, opt, longopts, args): + try: + i = opt.index("=") + except ValueError: + optarg = None + else: + opt, optarg = opt[:i], opt[i + 1 :] + + has_arg, opt = long_has_args(opt, longopts) + if has_arg: + if optarg is None: + if not args: + raise GetoptError("option --%s requires argument" % opt, opt) + optarg, args = args[0], args[1:] + elif optarg: + raise GetoptError("option --%s must not have an argument" % opt, opt) + opts.append(("--" + opt, optarg or "")) + return opts, args + + +# Return: +# has_arg? +# full option name +def long_has_args(opt, longopts): + possibilities = [o for o in longopts if o.startswith(opt)] + if not possibilities: + raise GetoptError("option --%s not recognized" % opt, opt) + # Is there an exact match? + if opt in possibilities: + return False, opt + elif opt + "=" in possibilities: + return True, opt + # No exact match, so better be unique. + if len(possibilities) > 1: + # XXX since possibilities contains all valid continuations, might be + # nice to work them into the error msg + raise GetoptError("option --%s not a unique prefix" % opt, opt) + assert len(possibilities) == 1 + unique_match = possibilities[0] + has_arg = unique_match.endswith("=") + if has_arg: + unique_match = unique_match[:-1] + return has_arg, unique_match + + +def do_shorts(opts, optstring, shortopts, args): + while optstring != "": + opt, optstring = optstring[0], optstring[1:] + if short_has_arg(opt, shortopts): + if optstring == "": + if not args: + raise GetoptError("option -%s requires argument" % opt, opt) + optstring, args = args[0], args[1:] + optarg, optstring = optstring, "" + else: + optarg = "" + opts.append(("-" + opt, optarg)) + return opts, args + + +def short_has_arg(opt, shortopts): + for i in range(len(shortopts)): + if opt == shortopts[i] != ":": + return shortopts.startswith(":", i + 1) + raise GetoptError("option -%s not recognized" % opt, opt) + + +# ======================================================================================================================= +# End getopt code +# ======================================================================================================================= diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_imports_tipper.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_imports_tipper.py new file mode 100644 index 0000000..b8f0abc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_imports_tipper.py @@ -0,0 +1,372 @@ +import inspect +import os.path +import sys + +from _pydev_bundle._pydev_tipper_common import do_find +from _pydevd_bundle.pydevd_utils import hasattr_checked, dir_checked + +from inspect import getfullargspec + + +def getargspec(*args, **kwargs): + arg_spec = getfullargspec(*args, **kwargs) + return arg_spec.args, arg_spec.varargs, arg_spec.varkw, arg_spec.defaults, arg_spec.kwonlyargs or [], arg_spec.kwonlydefaults or {} + + +# completion types. +TYPE_IMPORT = "0" +TYPE_CLASS = "1" +TYPE_FUNCTION = "2" +TYPE_ATTR = "3" +TYPE_BUILTIN = "4" +TYPE_PARAM = "5" + + +def _imp(name, log=None): + try: + return __import__(name) + except: + if "." in name: + sub = name[0 : name.rfind(".")] + + if log is not None: + log.add_content("Unable to import", name, "trying with", sub) + log.add_exception() + + return _imp(sub, log) + else: + s = "Unable to import module: %s - sys.path: %s" % (str(name), sys.path) + if log is not None: + log.add_content(s) + log.add_exception() + + raise ImportError(s) + + +IS_IPY = False +if sys.platform == "cli": + IS_IPY = True + _old_imp = _imp + + def _imp(name, log=None): + # We must add a reference in clr for .Net + import clr # @UnresolvedImport + + initial_name = name + while "." in name: + try: + clr.AddReference(name) + break # If it worked, that's OK. + except: + name = name[0 : name.rfind(".")] + else: + try: + clr.AddReference(name) + except: + pass # That's OK (not dot net module). + + return _old_imp(initial_name, log) + + +def get_file(mod): + f = None + try: + f = inspect.getsourcefile(mod) or inspect.getfile(mod) + except: + try: + f = getattr(mod, "__file__", None) + except: + f = None + if f and f.lower(f[-4:]) in [".pyc", ".pyo"]: + filename = f[:-4] + ".py" + if os.path.exists(filename): + f = filename + + return f + + +def Find(name, log=None): + f = None + + mod = _imp(name, log) + parent = mod + foundAs = "" + + if inspect.ismodule(mod): + f = get_file(mod) + + components = name.split(".") + + old_comp = None + for comp in components[1:]: + try: + # this happens in the following case: + # we have mx.DateTime.mxDateTime.mxDateTime.pyd + # but after importing it, mx.DateTime.mxDateTime shadows access to mxDateTime.pyd + mod = getattr(mod, comp) + except AttributeError: + if old_comp != comp: + raise + + if inspect.ismodule(mod): + f = get_file(mod) + else: + if len(foundAs) > 0: + foundAs = foundAs + "." + foundAs = foundAs + comp + + old_comp = comp + + return f, mod, parent, foundAs + + +def search_definition(data): + """@return file, line, col""" + + data = data.replace("\n", "") + if data.endswith("."): + data = data.rstrip(".") + f, mod, parent, foundAs = Find(data) + try: + return do_find(f, mod), foundAs + except: + return do_find(f, parent), foundAs + + +def generate_tip(data, log=None): + data = data.replace("\n", "") + if data.endswith("."): + data = data.rstrip(".") + + f, mod, parent, foundAs = Find(data, log) + # print_ >> open('temp.txt', 'w'), f + tips = generate_imports_tip_for_module(mod) + return f, tips + + +def check_char(c): + if c == "-" or c == ".": + return "_" + return c + + +_SENTINEL = object() + + +def generate_imports_tip_for_module(obj_to_complete, dir_comps=None, getattr=getattr, filter=lambda name: True): + """ + @param obj_to_complete: the object from where we should get the completions + @param dir_comps: if passed, we should not 'dir' the object and should just iterate those passed as kwonly_arg parameter + @param getattr: the way to get kwonly_arg given object from the obj_to_complete (used for the completer) + @param filter: kwonly_arg callable that receives the name and decides if it should be appended or not to the results + @return: list of tuples, so that each tuple represents kwonly_arg completion with: + name, doc, args, type (from the TYPE_* constants) + """ + ret = [] + + if dir_comps is None: + dir_comps = dir_checked(obj_to_complete) + if hasattr_checked(obj_to_complete, "__dict__"): + dir_comps.append("__dict__") + if hasattr_checked(obj_to_complete, "__class__"): + dir_comps.append("__class__") + + get_complete_info = True + + if len(dir_comps) > 1000: + # ok, we don't want to let our users wait forever... + # no complete info for you... + + get_complete_info = False + + dontGetDocsOn = (float, int, str, tuple, list, dict) + dontGetattrOn = (dict, list, set, tuple) + for d in dir_comps: + if d is None: + continue + + if not filter(d): + continue + + args = "" + + try: + try: + if isinstance(obj_to_complete, dontGetattrOn): + raise Exception( + 'Since python 3.9, e.g. "dict[str]" will return' + " a dict that's only supposed to take strings. " + 'Interestingly, e.g. dict["val"] is also valid ' + "and presumably represents a dict that only takes " + 'keys that are "val". This breaks our check for ' + "class attributes." + ) + obj = getattr(obj_to_complete.__class__, d) + except: + obj = getattr(obj_to_complete, d) + except: # just ignore and get it without additional info + ret.append((d, "", args, TYPE_BUILTIN)) + else: + if get_complete_info: + try: + retType = TYPE_BUILTIN + + # check if we have to get docs + getDoc = True + for class_ in dontGetDocsOn: + if isinstance(obj, class_): + getDoc = False + break + + doc = "" + if getDoc: + # no need to get this info... too many constants are defined and + # makes things much slower (passing all that through sockets takes quite some time) + try: + doc = inspect.getdoc(obj) + if doc is None: + doc = "" + except: # may happen on jython when checking java classes (so, just ignore it) + doc = "" + + if inspect.ismethod(obj) or inspect.isbuiltin(obj) or inspect.isfunction(obj) or inspect.isroutine(obj): + try: + args, vargs, kwargs, defaults, kwonly_args, kwonly_defaults = getargspec(obj) + + args = args[:] + + for kwonly_arg in kwonly_args: + default = kwonly_defaults.get(kwonly_arg, _SENTINEL) + if default is not _SENTINEL: + args.append("%s=%s" % (kwonly_arg, default)) + else: + args.append(str(kwonly_arg)) + + args = "(%s)" % (", ".join(args)) + except TypeError: + # ok, let's see if we can get the arguments from the doc + args, doc = signature_from_docstring(doc, getattr(obj, "__name__", None)) + + retType = TYPE_FUNCTION + + elif inspect.isclass(obj): + retType = TYPE_CLASS + + elif inspect.ismodule(obj): + retType = TYPE_IMPORT + + else: + retType = TYPE_ATTR + + # add token and doc to return - assure only strings. + ret.append((d, doc, args, retType)) + + except: # just ignore and get it without aditional info + ret.append((d, "", args, TYPE_BUILTIN)) + + else: # get_complete_info == False + if inspect.ismethod(obj) or inspect.isbuiltin(obj) or inspect.isfunction(obj) or inspect.isroutine(obj): + retType = TYPE_FUNCTION + + elif inspect.isclass(obj): + retType = TYPE_CLASS + + elif inspect.ismodule(obj): + retType = TYPE_IMPORT + + else: + retType = TYPE_ATTR + # ok, no complete info, let's try to do this as fast and clean as possible + # so, no docs for this kind of information, only the signatures + ret.append((d, "", str(args), retType)) + + return ret + + +def signature_from_docstring(doc, obj_name): + args = "()" + try: + found = False + if len(doc) > 0: + if IS_IPY: + # Handle case where we have the situation below + # sort(self, object cmp, object key) + # sort(self, object cmp, object key, bool reverse) + # sort(self) + # sort(self, object cmp) + + # Or: sort(self: list, cmp: object, key: object) + # sort(self: list, cmp: object, key: object, reverse: bool) + # sort(self: list) + # sort(self: list, cmp: object) + if obj_name: + name = obj_name + "(" + + # Fix issue where it was appearing sort(aa)sort(bb)sort(cc) in the same line. + lines = doc.splitlines() + if len(lines) == 1: + c = doc.count(name) + if c > 1: + doc = ("\n" + name).join(doc.split(name)) + + major = "" + for line in doc.splitlines(): + if line.startswith(name) and line.endswith(")"): + if len(line) > len(major): + major = line + if major: + args = major[major.index("(") :] + found = True + + if not found: + i = doc.find("->") + if i < 0: + i = doc.find("--") + if i < 0: + i = doc.find("\n") + if i < 0: + i = doc.find("\r") + + if i > 0: + s = doc[0:i] + s = s.strip() + + # let's see if we have a docstring in the first line + if s[-1] == ")": + start = s.find("(") + if start >= 0: + end = s.find("[") + if end <= 0: + end = s.find(")") + if end <= 0: + end = len(s) + + args = s[start:end] + if not args[-1] == ")": + args = args + ")" + + # now, get rid of unwanted chars + l = len(args) - 1 + r = [] + for i in range(len(args)): + if i == 0 or i == l: + r.append(args[i]) + else: + r.append(check_char(args[i])) + + args = "".join(r) + + if IS_IPY: + if args.startswith("(self:"): + i = args.find(",") + if i >= 0: + args = "(self" + args[i:] + else: + args = "(self)" + i = args.find(")") + if i > 0: + args = args[: i + 1] + + except: + pass + return args, doc diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_jy_imports_tipper.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_jy_imports_tipper.py new file mode 100644 index 0000000..d1265de --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_jy_imports_tipper.py @@ -0,0 +1,485 @@ +import traceback +from io import StringIO +from java.lang import StringBuffer # @UnresolvedImport +from java.lang import String # @UnresolvedImport +import java.lang # @UnresolvedImport +import sys +from _pydev_bundle._pydev_tipper_common import do_find + +from org.python.core import PyReflectedFunction # @UnresolvedImport + +from org.python import core # @UnresolvedImport +from org.python.core import PyClass # @UnresolvedImport + +# completion types. +TYPE_IMPORT = "0" +TYPE_CLASS = "1" +TYPE_FUNCTION = "2" +TYPE_ATTR = "3" +TYPE_BUILTIN = "4" +TYPE_PARAM = "5" + + +def _imp(name): + try: + return __import__(name) + except: + if "." in name: + sub = name[0 : name.rfind(".")] + return _imp(sub) + else: + s = "Unable to import module: %s - sys.path: %s" % (str(name), sys.path) + raise RuntimeError(s) + + +import java.util + +_java_rt_file = getattr(java.util, "__file__", None) + + +def Find(name): + f = None + if name.startswith("__builtin__"): + if name == "__builtin__.str": + name = "org.python.core.PyString" + elif name == "__builtin__.dict": + name = "org.python.core.PyDictionary" + + mod = _imp(name) + parent = mod + foundAs = "" + + try: + f = getattr(mod, "__file__", None) + except: + f = None + + components = name.split(".") + old_comp = None + for comp in components[1:]: + try: + # this happens in the following case: + # we have mx.DateTime.mxDateTime.mxDateTime.pyd + # but after importing it, mx.DateTime.mxDateTime does shadows access to mxDateTime.pyd + mod = getattr(mod, comp) + except AttributeError: + if old_comp != comp: + raise + + if hasattr(mod, "__file__"): + f = mod.__file__ + else: + if len(foundAs) > 0: + foundAs = foundAs + "." + foundAs = foundAs + comp + + old_comp = comp + + if f is None and name.startswith("java.lang"): + # Hack: java.lang.__file__ is None on Jython 2.7 (whereas it pointed to rt.jar on Jython 2.5). + f = _java_rt_file + + if f is not None: + if f.endswith(".pyc"): + f = f[:-1] + elif f.endswith("$py.class"): + f = f[: -len("$py.class")] + ".py" + return f, mod, parent, foundAs + + +def format_param_class_name(paramClassName): + if paramClassName.startswith(""): + paramClassName = paramClassName[len(" + paramClassName = paramClassName.split("'")[1] + except: + paramClassName = repr(paramTypesClass) # just in case something else happens... it will at least be visible + # if the parameter equals [C, it means it it a char array, so, let's change it + + a = format_param_class_name(paramClassName) + # a = a.replace('[]','Array') + # a = a.replace('Object', 'obj') + # a = a.replace('String', 's') + # a = a.replace('Integer', 'i') + # a = a.replace('Char', 'c') + # a = a.replace('Double', 'd') + args.append(a) # so we don't leave invalid code + + info = Info(name, args=args, ret=ret) + # print_ info.basic_as_str() + infos.append(info) + + return 1, infos + except Exception: + s = StringIO() + traceback.print_exc(file=s) + return 1, [Info(str("ERROR"), doc=s.getvalue())] + + return 0, None + + +def ismodule(mod): + # java modules... do we have other way to know that? + if not hasattr(mod, "getClass") and not hasattr(mod, "__class__") and hasattr(mod, "__name__"): + return 1 + + return isinstance(mod, core.PyModule) + + +def dir_obj(obj): + ret = [] + found = java.util.HashMap() + original = obj + if hasattr(obj, "__class__"): + if obj.__class__ == java.lang.Class: + # get info about superclasses + classes = [] + classes.append(obj) + try: + c = obj.getSuperclass() + except TypeError: + # may happen on jython when getting the java.lang.Class class + c = obj.getSuperclass(obj) + + while c != None: + classes.append(c) + c = c.getSuperclass() + + # get info about interfaces + interfs = [] + for obj in classes: + try: + interfs.extend(obj.getInterfaces()) + except TypeError: + interfs.extend(obj.getInterfaces(obj)) + classes.extend(interfs) + + # now is the time when we actually get info on the declared methods and fields + for obj in classes: + try: + declaredMethods = obj.getDeclaredMethods() + except TypeError: + declaredMethods = obj.getDeclaredMethods(obj) + + try: + declaredFields = obj.getDeclaredFields() + except TypeError: + declaredFields = obj.getDeclaredFields(obj) + + for i in range(len(declaredMethods)): + name = declaredMethods[i].getName() + ret.append(name) + found.put(name, 1) + + for i in range(len(declaredFields)): + name = declaredFields[i].getName() + ret.append(name) + found.put(name, 1) + + elif isclass(obj.__class__): + d = dir(obj.__class__) + for name in d: + ret.append(name) + found.put(name, 1) + + # this simple dir does not always get all the info, that's why we have the part before + # (e.g.: if we do a dir on String, some methods that are from other interfaces such as + # charAt don't appear) + d = dir(original) + for name in d: + if found.get(name) != 1: + ret.append(name) + + return ret + + +def format_arg(arg): + """formats an argument to be shown""" + + s = str(arg) + dot = s.rfind(".") + if dot >= 0: + s = s[dot + 1 :] + + s = s.replace(";", "") + s = s.replace("[]", "Array") + if len(s) > 0: + c = s[0].lower() + s = c + s[1:] + + return s + + +def search_definition(data): + """@return file, line, col""" + + data = data.replace("\n", "") + if data.endswith("."): + data = data.rstrip(".") + f, mod, parent, foundAs = Find(data) + try: + return do_find(f, mod), foundAs + except: + return do_find(f, parent), foundAs + + +def generate_imports_tip_for_module(obj_to_complete, dir_comps=None, getattr=getattr, filter=lambda name: True): + """ + @param obj_to_complete: the object from where we should get the completions + @param dir_comps: if passed, we should not 'dir' the object and should just iterate those passed as a parameter + @param getattr: the way to get a given object from the obj_to_complete (used for the completer) + @param filter: a callable that receives the name and decides if it should be appended or not to the results + @return: list of tuples, so that each tuple represents a completion with: + name, doc, args, type (from the TYPE_* constants) + """ + ret = [] + + if dir_comps is None: + dir_comps = dir_obj(obj_to_complete) + + for d in dir_comps: + if d is None: + continue + + if not filter(d): + continue + + args = "" + doc = "" + retType = TYPE_BUILTIN + + try: + obj = getattr(obj_to_complete, d) + except (AttributeError, java.lang.NoClassDefFoundError): + # jython has a bug in its custom classloader that prevents some things from working correctly, so, let's see if + # we can fix that... (maybe fixing it in jython itself would be a better idea, as this is clearly a bug) + # for that we need a custom classloader... we have references from it in the below places: + # + # http://mindprod.com/jgloss/classloader.html + # http://www.javaworld.com/javaworld/jw-03-2000/jw-03-classload-p2.html + # http://freshmeat.net/articles/view/1643/ + # + # note: this only happens when we add things to the sys.path at runtime, if they are added to the classpath + # before the run, everything goes fine. + # + # The code below ilustrates what I mean... + # + # import sys + # sys.path.insert(1, r"C:\bin\eclipse310\plugins\org.junit_3.8.1\junit.jar" ) + # + # import junit.framework + # print_ dir(junit.framework) #shows the TestCase class here + # + # import junit.framework.TestCase + # + # raises the error: + # Traceback (innermost last): + # File "", line 1, in ? + # ImportError: No module named TestCase + # + # whereas if we had added the jar to the classpath before, everything would be fine by now... + + ret.append((d, "", "", retType)) + # that's ok, private things cannot be gotten... + continue + else: + isMet = ismethod(obj) + if isMet[0] and isMet[1]: + info = isMet[1][0] + try: + args, vargs, kwargs = info.args, info.varargs, info.kwargs + doc = info.get_as_doc() + r = "" + for a in args: + if len(r) > 0: + r += ", " + r += format_arg(a) + args = "(%s)" % (r) + except TypeError: + traceback.print_exc() + args = "()" + + retType = TYPE_FUNCTION + + elif isclass(obj): + retType = TYPE_CLASS + + elif ismodule(obj): + retType = TYPE_IMPORT + + # add token and doc to return - assure only strings. + ret.append((d, doc, args, retType)) + + return ret + + +if __name__ == "__main__": + sys.path.append(r"D:\dev_programs\eclipse_3\310\eclipse\plugins\org.junit_3.8.1\junit.jar") + sys.stdout.write("%s\n" % Find("junit.framework.TestCase")) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_log.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_log.py new file mode 100644 index 0000000..5c9580f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_log.py @@ -0,0 +1,23 @@ +import traceback +import sys +from io import StringIO + + +class Log: + def __init__(self): + self._contents = [] + + def add_content(self, *content): + self._contents.append(" ".join(content)) + + def add_exception(self): + s = StringIO() + exc_info = sys.exc_info() + traceback.print_exception(exc_info[0], exc_info[1], exc_info[2], limit=None, file=s) + self._contents.append(s.getvalue()) + + def get_contents(self): + return "\n".join(self._contents) + + def clear_log(self): + del self._contents[:] diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_saved_modules.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_saved_modules.py new file mode 100644 index 0000000..f1ba037 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_saved_modules.py @@ -0,0 +1,134 @@ +import sys +import os + + +def find_in_pythonpath(module_name): + # Check all the occurrences where we could match the given module/package in the PYTHONPATH. + # + # This is a simplistic approach, but probably covers most of the cases we're interested in + # (i.e.: this may fail in more elaborate cases of import customization or .zip imports, but + # this should be rare in general). + found_at = [] + + parts = module_name.split(".") # split because we need to convert mod.name to mod/name + for path in sys.path: + target = os.path.join(path, *parts) + target_py = target + ".py" + if os.path.isdir(target): + found_at.append(target) + if os.path.exists(target_py): + found_at.append(target_py) + return found_at + + +class DebuggerInitializationError(Exception): + pass + + +class VerifyShadowedImport(object): + def __init__(self, import_name): + self.import_name = import_name + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if exc_type is not None: + if exc_type == DebuggerInitializationError: + return False # It's already an error we generated. + + # We couldn't even import it... + found_at = find_in_pythonpath(self.import_name) + + if len(found_at) <= 1: + # It wasn't found anywhere or there was just 1 occurrence. + # Let's just return to show the original error. + return False + + # We found more than 1 occurrence of the same module in the PYTHONPATH + # (the user module and the standard library module). + # Let's notify the user as it seems that the module was shadowed. + msg = self._generate_shadowed_import_message(found_at) + raise DebuggerInitializationError(msg) + + def _generate_shadowed_import_message(self, found_at): + msg = """It was not possible to initialize the debugger due to a module name conflict. + +i.e.: the module "%(import_name)s" could not be imported because it is shadowed by: +%(found_at)s +Please rename this file/folder so that the original module from the standard library can be imported.""" % { + "import_name": self.import_name, + "found_at": found_at[0], + } + + return msg + + def check(self, module, expected_attributes): + msg = "" + for expected_attribute in expected_attributes: + try: + getattr(module, expected_attribute) + except: + msg = self._generate_shadowed_import_message([module.__file__]) + break + + if msg: + raise DebuggerInitializationError(msg) + + +with VerifyShadowedImport("threading") as verify_shadowed: + import threading + + verify_shadowed.check(threading, ["Thread", "settrace", "setprofile", "Lock", "RLock", "current_thread"]) + ThreadingEvent = threading.Event + ThreadingLock = threading.Lock + threading_current_thread = threading.current_thread + +with VerifyShadowedImport("time") as verify_shadowed: + import time + + verify_shadowed.check(time, ["sleep", "time", "mktime"]) + +with VerifyShadowedImport("socket") as verify_shadowed: + import socket + + verify_shadowed.check(socket, ["socket", "gethostname", "getaddrinfo"]) + +with VerifyShadowedImport("select") as verify_shadowed: + import select + + verify_shadowed.check(select, ["select"]) + +with VerifyShadowedImport("code") as verify_shadowed: + import code as _code + + verify_shadowed.check(_code, ["compile_command", "InteractiveInterpreter"]) + +with VerifyShadowedImport("_thread") as verify_shadowed: + import _thread as thread + + verify_shadowed.check(thread, ["start_new_thread", "start_new", "allocate_lock"]) + +with VerifyShadowedImport("queue") as verify_shadowed: + import queue as _queue + + verify_shadowed.check(_queue, ["Queue", "LifoQueue", "Empty", "Full", "deque"]) + +with VerifyShadowedImport("xmlrpclib") as verify_shadowed: + import xmlrpc.client as xmlrpclib + + verify_shadowed.check(xmlrpclib, ["ServerProxy", "Marshaller", "Server"]) + +with VerifyShadowedImport("xmlrpc.server") as verify_shadowed: + import xmlrpc.server as xmlrpcserver + + verify_shadowed.check(xmlrpcserver, ["SimpleXMLRPCServer"]) + +with VerifyShadowedImport("http.server") as verify_shadowed: + import http.server as BaseHTTPServer + + verify_shadowed.check(BaseHTTPServer, ["BaseHTTPRequestHandler"]) + +# If set, this is a version of the threading.enumerate that doesn't have the patching to remove the pydevd threads. +# Note: as it can't be set during execution, don't import the name (import the module and access it through its name). +pydevd_saved_threading_enumerate = None diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_sys_patch.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_sys_patch.py new file mode 100644 index 0000000..23e7d4f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_sys_patch.py @@ -0,0 +1,77 @@ +import sys + + +def patch_sys_module(): + def patched_exc_info(fun): + def pydev_debugger_exc_info(): + type, value, traceback = fun() + if type == ImportError: + # we should not show frame added by plugin_import call + if traceback and hasattr(traceback, "tb_next"): + return type, value, traceback.tb_next + return type, value, traceback + + return pydev_debugger_exc_info + + system_exc_info = sys.exc_info + sys.exc_info = patched_exc_info(system_exc_info) + if not hasattr(sys, "system_exc_info"): + sys.system_exc_info = system_exc_info + + +def patched_reload(orig_reload): + def pydev_debugger_reload(module): + orig_reload(module) + if module.__name__ == "sys": + # if sys module was reloaded we should patch it again + patch_sys_module() + + return pydev_debugger_reload + + +def patch_reload(): + import builtins # Py3 + + if hasattr(builtins, "reload"): + sys.builtin_orig_reload = builtins.reload + builtins.reload = patched_reload(sys.builtin_orig_reload) # @UndefinedVariable + try: + import imp + + sys.imp_orig_reload = imp.reload + imp.reload = patched_reload(sys.imp_orig_reload) # @UndefinedVariable + except ImportError: + pass # Ok, imp not available on Python 3.12. + else: + try: + import importlib + + sys.importlib_orig_reload = importlib.reload # @UndefinedVariable + importlib.reload = patched_reload(sys.importlib_orig_reload) # @UndefinedVariable + except: + pass + + del builtins + + +def cancel_patches_in_sys_module(): + sys.exc_info = sys.system_exc_info # @UndefinedVariable + import builtins # Py3 + + if hasattr(sys, "builtin_orig_reload"): + builtins.reload = sys.builtin_orig_reload + + if hasattr(sys, "imp_orig_reload"): + try: + import imp + + imp.reload = sys.imp_orig_reload + except ImportError: + pass # Ok, imp not available in Python 3.12. + + if hasattr(sys, "importlib_orig_reload"): + import importlib + + importlib.reload = sys.importlib_orig_reload + + del builtins diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_tipper_common.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_tipper_common.py new file mode 100644 index 0000000..25c0f6f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_tipper_common.py @@ -0,0 +1,53 @@ +import inspect +import re + + +def do_find(f, mod): + import linecache + + if inspect.ismodule(mod): + return f, 0, 0 + + lines = linecache.getlines(f) + + if inspect.isclass(mod): + name = mod.__name__ + pat = re.compile(r"^\s*class\s*" + name + r"\b") + for i in range(len(lines)): + if pat.match(lines[i]): + return f, i, 0 + + return f, 0, 0 + + if inspect.ismethod(mod): + mod = mod.im_func + + if inspect.isfunction(mod): + try: + mod = mod.func_code + except AttributeError: + mod = mod.__code__ # python 3k + + if inspect.istraceback(mod): + mod = mod.tb_frame + + if inspect.isframe(mod): + mod = mod.f_code + + if inspect.iscode(mod): + if not hasattr(mod, "co_filename"): + return None, 0, 0 + + if not hasattr(mod, "co_firstlineno"): + return mod.co_filename, 0, 0 + + lnum = mod.co_firstlineno + pat = re.compile(r"^(\s*def\s)|(.*(? 0: + if pat.match(lines[lnum]): + break + lnum -= 1 + + return f, lnum, 0 + + raise RuntimeError("Do not know about: " + f + " " + str(mod)) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__init__.py new file mode 100644 index 0000000..c661b40 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__init__.py @@ -0,0 +1,349 @@ +""" +Sample usage to track changes in a thread. + + import threading + import time + watcher = fsnotify.Watcher() + watcher.accepted_file_extensions = {'.py', '.pyw'} + + # Configure target values to compute throttling. + # Note: internal sleep times will be updated based on + # profiling the actual application runtime to match + # those values. + + watcher.target_time_for_single_scan = 2. + watcher.target_time_for_notification = 4. + + watcher.set_tracked_paths([target_dir]) + + def start_watching(): # Called from thread + for change_enum, change_path in watcher.iter_changes(): + if change_enum == fsnotify.Change.added: + print('Added: ', change_path) + elif change_enum == fsnotify.Change.modified: + print('Modified: ', change_path) + elif change_enum == fsnotify.Change.deleted: + print('Deleted: ', change_path) + + t = threading.Thread(target=start_watching) + t.daemon = True + t.start() + + try: + ... + finally: + watcher.dispose() + + +Note: changes are only reported for files (added/modified/deleted), not directories. +""" +import sys +from os.path import basename +from _pydev_bundle import pydev_log, _pydev_saved_modules +from os import scandir + +try: + from enum import IntEnum +except: + + class IntEnum(object): + pass + + +import time + +__author__ = "Fabio Zadrozny" +__email__ = "fabiofz@gmail.com" +__version__ = "0.1.5" # Version here and in setup.py + + +class Change(IntEnum): + added = 1 + modified = 2 + deleted = 3 + + +class _SingleVisitInfo(object): + def __init__(self): + self.count = 0 + self.visited_dirs = set() + self.file_to_mtime = {} + self.last_sleep_time = time.time() + + +class _PathWatcher(object): + """ + Helper to watch a single path. + """ + + def __init__(self, root_path, accept_directory, accept_file, single_visit_info, max_recursion_level, sleep_time=0.0): + """ + :type root_path: str + :type accept_directory: Callback[str, bool] + :type accept_file: Callback[str, bool] + :type max_recursion_level: int + :type sleep_time: float + """ + self.accept_directory = accept_directory + self.accept_file = accept_file + self._max_recursion_level = max_recursion_level + + self._root_path = root_path + + # Initial sleep value for throttling, it'll be auto-updated based on the + # Watcher.target_time_for_single_scan. + self.sleep_time = sleep_time + + self.sleep_at_elapsed = 1.0 / 30.0 + + # When created, do the initial snapshot right away! + old_file_to_mtime = {} + self._check(single_visit_info, lambda _change: None, old_file_to_mtime) + + def __eq__(self, o): + if isinstance(o, _PathWatcher): + return self._root_path == o._root_path + + return False + + def __ne__(self, o): + return not self == o + + def __hash__(self): + return hash(self._root_path) + + def _check_dir(self, dir_path, single_visit_info, append_change, old_file_to_mtime, level): + # This is the actual poll loop + if dir_path in single_visit_info.visited_dirs or level > self._max_recursion_level: + return + single_visit_info.visited_dirs.add(dir_path) + try: + if isinstance(dir_path, bytes): + try: + dir_path = dir_path.decode(sys.getfilesystemencoding()) + except UnicodeDecodeError: + try: + dir_path = dir_path.decode("utf-8") + except UnicodeDecodeError: + return # Ignore if we can't deal with the path. + + new_files = single_visit_info.file_to_mtime + + for entry in scandir(dir_path): + single_visit_info.count += 1 + + # Throttle if needed inside the loop + # to avoid consuming too much CPU. + if single_visit_info.count % 300 == 0: + if self.sleep_time > 0: + t = time.time() + diff = t - single_visit_info.last_sleep_time + if diff > self.sleep_at_elapsed: + time.sleep(self.sleep_time) + single_visit_info.last_sleep_time = time.time() + + if entry.is_dir(): + if self.accept_directory(entry.path): + self._check_dir(entry.path, single_visit_info, append_change, old_file_to_mtime, level + 1) + + elif self.accept_file(entry.path): + stat = entry.stat() + mtime = (stat.st_mtime_ns, stat.st_size) + path = entry.path + new_files[path] = mtime + + old_mtime = old_file_to_mtime.pop(path, None) + if not old_mtime: + append_change((Change.added, path)) + elif old_mtime != mtime: + append_change((Change.modified, path)) + + except OSError: + pass # Directory was removed in the meanwhile. + + def _check(self, single_visit_info, append_change, old_file_to_mtime): + self._check_dir(self._root_path, single_visit_info, append_change, old_file_to_mtime, 0) + + +class Watcher(object): + # By default (if accept_directory is not specified), these will be the + # ignored directories. + ignored_dirs = {".git", "__pycache__", ".idea", "node_modules", ".metadata"} + + # By default (if accept_file is not specified), these will be the + # accepted files. + accepted_file_extensions = () + + # Set to the target value for doing full scan of all files (adds a sleep inside the poll loop + # which processes files to reach the target time). + # Lower values will consume more CPU + # Set to 0.0 to have no sleeps (which will result in a higher cpu load). + target_time_for_single_scan = 2.0 + + # Set the target value from the start of one scan to the start of another scan (adds a + # sleep after a full poll is done to reach the target time). + # Lower values will consume more CPU. + # Set to 0.0 to have a new scan start right away without any sleeps. + target_time_for_notification = 4.0 + + # Set to True to print the time for a single poll through all the paths. + print_poll_time = False + + # This is the maximum recursion level. + max_recursion_level = 10 + + def __init__(self, accept_directory=None, accept_file=None): + """ + :param Callable[str, bool] accept_directory: + Callable that returns whether a directory should be watched. + Note: if passed it'll override the `ignored_dirs` + + :param Callable[str, bool] accept_file: + Callable that returns whether a file should be watched. + Note: if passed it'll override the `accepted_file_extensions`. + """ + self._path_watchers = set() + self._disposed = _pydev_saved_modules.ThreadingEvent() + + if accept_directory is None: + accept_directory = lambda dir_path: basename(dir_path) not in self.ignored_dirs + if accept_file is None: + accept_file = lambda path_name: not self.accepted_file_extensions or path_name.endswith(self.accepted_file_extensions) + self.accept_file = accept_file + self.accept_directory = accept_directory + self._single_visit_info = _SingleVisitInfo() + + @property + def accept_directory(self): + return self._accept_directory + + @accept_directory.setter + def accept_directory(self, accept_directory): + self._accept_directory = accept_directory + for path_watcher in self._path_watchers: + path_watcher.accept_directory = accept_directory + + @property + def accept_file(self): + return self._accept_file + + @accept_file.setter + def accept_file(self, accept_file): + self._accept_file = accept_file + for path_watcher in self._path_watchers: + path_watcher.accept_file = accept_file + + def dispose(self): + self._disposed.set() + + @property + def path_watchers(self): + return tuple(self._path_watchers) + + def set_tracked_paths(self, paths): + """ + Note: always resets all path trackers to track the passed paths. + """ + if not isinstance(paths, (list, tuple, set)): + paths = (paths,) + + # Sort by the path len so that the bigger paths come first (so, + # if there's any nesting we want the nested paths to be visited + # before the parent paths so that the max_recursion_level is correct). + paths = sorted(set(paths), key=lambda path: -len(path)) + path_watchers = set() + + self._single_visit_info = _SingleVisitInfo() + + initial_time = time.time() + for path in paths: + sleep_time = 0.0 # When collecting the first time, sleep_time should be 0! + path_watcher = _PathWatcher( + path, + self.accept_directory, + self.accept_file, + self._single_visit_info, + max_recursion_level=self.max_recursion_level, + sleep_time=sleep_time, + ) + + path_watchers.add(path_watcher) + + actual_time = time.time() - initial_time + + pydev_log.debug("Tracking the following paths for changes: %s", paths) + pydev_log.debug("Time to track: %.2fs", actual_time) + pydev_log.debug("Folders found: %s", len(self._single_visit_info.visited_dirs)) + pydev_log.debug("Files found: %s", len(self._single_visit_info.file_to_mtime)) + self._path_watchers = path_watchers + + def iter_changes(self): + """ + Continuously provides changes (until dispose() is called). + + Changes provided are tuples with the Change enum and filesystem path. + + :rtype: Iterable[Tuple[Change, str]] + """ + while not self._disposed.is_set(): + initial_time = time.time() + + old_visit_info = self._single_visit_info + old_file_to_mtime = old_visit_info.file_to_mtime + changes = [] + append_change = changes.append + + self._single_visit_info = single_visit_info = _SingleVisitInfo() + for path_watcher in self._path_watchers: + path_watcher._check(single_visit_info, append_change, old_file_to_mtime) + + # Note that we pop entries while visiting, so, what remained is what's deleted. + for entry in old_file_to_mtime: + append_change((Change.deleted, entry)) + + for change in changes: + yield change + + actual_time = time.time() - initial_time + if self.print_poll_time: + print("--- Total poll time: %.3fs" % actual_time) + + if actual_time > 0: + if self.target_time_for_single_scan <= 0.0: + for path_watcher in self._path_watchers: + path_watcher.sleep_time = 0.0 + else: + perc = self.target_time_for_single_scan / actual_time + + # Prevent from changing the values too much (go slowly into the right + # direction). + # (to prevent from cases where the user puts the machine on sleep and + # values become too skewed). + if perc > 2.0: + perc = 2.0 + elif perc < 0.5: + perc = 0.5 + + for path_watcher in self._path_watchers: + if path_watcher.sleep_time <= 0.0: + path_watcher.sleep_time = 0.001 + new_sleep_time = path_watcher.sleep_time * perc + + # Prevent from changing the values too much (go slowly into the right + # direction). + # (to prevent from cases where the user puts the machine on sleep and + # values become too skewed). + diff_sleep_time = new_sleep_time - path_watcher.sleep_time + path_watcher.sleep_time += diff_sleep_time / (3.0 * len(self._path_watchers)) + + if actual_time > 0: + self._disposed.wait(actual_time) + + if path_watcher.sleep_time < 0.001: + path_watcher.sleep_time = 0.001 + + # print('new sleep time: %s' % path_watcher.sleep_time) + + diff = self.target_time_for_notification - actual_time + if diff > 0.0: + self._disposed.wait(diff) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d43aeed8594a87d04d99da0a4a4588bf63952b5 GIT binary patch literal 14004 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", symbol) + except (OverflowError, SyntaxError, ValueError): + # Case 1 + return False + if code is None: + # Case 2 + return True + + # Case 3 + return False + + def need_more(self, code_fragment): + if self.buffer is None: + self.buffer = code_fragment + else: + self.buffer.append(code_fragment) + + return self.need_more_for_code(self.buffer.text) + + def create_std_in(self, debugger=None, original_std_in=None): + if debugger is None: + return StdIn(self, self.host, self.client_port, original_stdin=original_std_in) + else: + return DebugConsoleStdIn(py_db=debugger, original_stdin=original_std_in) + + def add_exec(self, code_fragment, debugger=None): + # In case sys.excepthook called, use original excepthook #PyDev-877: Debug console freezes with Python 3.5+ + # (showtraceback does it on python 3.5 onwards) + sys.excepthook = sys.__excepthook__ + try: + original_in = sys.stdin + try: + help = None + if "pydoc" in sys.modules: + pydoc = sys.modules["pydoc"] # Don't import it if it still is not there. + + if hasattr(pydoc, "help"): + # You never know how will the API be changed, so, let's code defensively here + help = pydoc.help + if not hasattr(help, "input"): + help = None + except: + # Just ignore any error here + pass + + more = False + try: + sys.stdin = self.create_std_in(debugger, original_in) + try: + if help is not None: + # This will enable the help() function to work. + try: + try: + help.input = sys.stdin + except AttributeError: + help._input = sys.stdin + except: + help = None + if not self._input_error_printed: + self._input_error_printed = True + sys.stderr.write("\nError when trying to update pydoc.help.input\n") + sys.stderr.write("(help() may not work -- please report this as a bug in the pydev bugtracker).\n\n") + traceback.print_exc() + + try: + self.start_exec() + if hasattr(self, "debugger"): + self.debugger.enable_tracing() + + more = self.do_add_exec(code_fragment) + + if hasattr(self, "debugger"): + self.debugger.disable_tracing() + + self.finish_exec(more) + finally: + if help is not None: + try: + try: + help.input = original_in + except AttributeError: + help._input = original_in + except: + pass + + finally: + sys.stdin = original_in + except SystemExit: + raise + except: + traceback.print_exc() + finally: + sys.__excepthook__ = sys.excepthook + + return more + + def do_add_exec(self, codeFragment): + """ + Subclasses should override. + + @return: more (True if more input is needed to complete the statement and False if the statement is complete). + """ + raise NotImplementedError() + + def get_namespace(self): + """ + Subclasses should override. + + @return: dict with namespace. + """ + raise NotImplementedError() + + def __resolve_reference__(self, text): + """ + + :type text: str + """ + obj = None + if "." not in text: + try: + obj = self.get_namespace()[text] + except KeyError: + pass + + if obj is None: + try: + obj = self.get_namespace()["__builtins__"][text] + except: + pass + + if obj is None: + try: + obj = getattr(self.get_namespace()["__builtins__"], text, None) + except: + pass + + else: + try: + last_dot = text.rindex(".") + parent_context = text[0:last_dot] + res = pydevd_vars.eval_in_context(parent_context, self.get_namespace(), self.get_namespace()) + obj = getattr(res, text[last_dot + 1 :]) + except: + pass + return obj + + def getDescription(self, text): + try: + obj = self.__resolve_reference__(text) + if obj is None: + return "" + return get_description(obj) + except: + return "" + + def do_exec_code(self, code, is_single_line): + try: + code_fragment = CodeFragment(code, is_single_line) + more = self.need_more(code_fragment) + if not more: + code_fragment = self.buffer + self.buffer = None + self.exec_queue.put(code_fragment) + + return more + except: + traceback.print_exc() + return False + + def execLine(self, line): + return self.do_exec_code(line, True) + + def execMultipleLines(self, lines): + if IS_JYTHON: + more = False + for line in lines.split("\n"): + more = self.do_exec_code(line, True) + return more + else: + return self.do_exec_code(lines, False) + + def interrupt(self): + self.buffer = None # Also clear the buffer when it's interrupted. + try: + if self.interruptable: + # Fix for #PyDev-500: Console interrupt can't interrupt on sleep + interrupt_main_thread(self.mainThread) + + self.finish_exec(False) + return True + except: + traceback.print_exc() + return False + + def close(self): + sys.exit(0) + + def start_exec(self): + self.interruptable = True + + def get_server(self): + if getattr(self, "host", None) is not None: + return xmlrpclib.Server("http://%s:%s" % (self.host, self.client_port)) + else: + return None + + server = property(get_server) + + def ShowConsole(self): + server = self.get_server() + if server is not None: + server.ShowConsole() + + def finish_exec(self, more): + self.interruptable = False + + server = self.get_server() + + if server is not None: + return server.NotifyFinished(more) + else: + return True + + def getFrame(self): + xml = StringIO() + hidden_ns = self.get_ipython_hidden_vars_dict() + xml.write("") + xml.write(pydevd_xml.frame_vars_to_xml(self.get_namespace(), hidden_ns)) + xml.write("") + + return xml.getvalue() + + @silence_warnings_decorator + def getVariable(self, attributes): + xml = StringIO() + xml.write("") + val_dict = pydevd_vars.resolve_compound_var_object_fields(self.get_namespace(), attributes) + if val_dict is None: + val_dict = {} + + for k, val in val_dict.items(): + val = val_dict[k] + evaluate_full_value = pydevd_xml.should_evaluate_full_value(val) + xml.write(pydevd_vars.var_to_xml(val, k, evaluate_full_value=evaluate_full_value)) + + xml.write("") + + return xml.getvalue() + + def getArray(self, attr, roffset, coffset, rows, cols, format): + name = attr.split("\t")[-1] + array = pydevd_vars.eval_in_context(name, self.get_namespace(), self.get_namespace()) + return pydevd_vars.table_like_struct_to_xml(array, name, roffset, coffset, rows, cols, format) + + def evaluate(self, expression): + xml = StringIO() + xml.write("") + result = pydevd_vars.eval_in_context(expression, self.get_namespace(), self.get_namespace()) + xml.write(pydevd_vars.var_to_xml(result, expression)) + xml.write("") + return xml.getvalue() + + @silence_warnings_decorator + def loadFullValue(self, seq, scope_attrs): + """ + Evaluate full value for async Console variables in a separate thread and send results to IDE side + :param seq: id of command + :param scope_attrs: a sequence of variables with their attributes separated by NEXT_VALUE_SEPARATOR + (i.e.: obj\tattr1\tattr2NEXT_VALUE_SEPARATORobj2\attr1\tattr2) + :return: + """ + frame_variables = self.get_namespace() + var_objects = [] + vars = scope_attrs.split(NEXT_VALUE_SEPARATOR) + for var_attrs in vars: + if "\t" in var_attrs: + name, attrs = var_attrs.split("\t", 1) + + else: + name = var_attrs + attrs = None + if name in frame_variables: + var_object = pydevd_vars.resolve_var_object(frame_variables[name], attrs) + var_objects.append((var_object, name)) + else: + var_object = pydevd_vars.eval_in_context(name, frame_variables, frame_variables) + var_objects.append((var_object, name)) + + from _pydevd_bundle.pydevd_comm import GetValueAsyncThreadConsole + + py_db = getattr(self, "debugger", None) + + if py_db is None: + py_db = get_global_debugger() + + if py_db is None: + from pydevd import PyDB + + py_db = PyDB() + + t = GetValueAsyncThreadConsole(py_db, self.get_server(), seq, var_objects) + t.start() + + def changeVariable(self, attr, value): + def do_change_variable(): + Exec("%s=%s" % (attr, value), self.get_namespace(), self.get_namespace()) + + # Important: it has to be really enabled in the main thread, so, schedule + # it to run in the main thread. + self.exec_queue.put(do_change_variable) + + def connectToDebugger(self, debuggerPort, debugger_options=None): + """ + Used to show console with variables connection. + Mainly, monkey-patches things in the debugger structure so that the debugger protocol works. + """ + + if debugger_options is None: + debugger_options = {} + env_key = "PYDEVD_EXTRA_ENVS" + if env_key in debugger_options: + for env_name, value in debugger_options[env_key].items(): + existing_value = os.environ.get(env_name, None) + if existing_value: + os.environ[env_name] = "%s%c%s" % (existing_value, os.path.pathsep, value) + else: + os.environ[env_name] = value + if env_name == "PYTHONPATH": + sys.path.append(value) + + del debugger_options[env_key] + + def do_connect_to_debugger(): + try: + # Try to import the packages needed to attach the debugger + import pydevd + from _pydev_bundle._pydev_saved_modules import threading + except: + # This happens on Jython embedded in host eclipse + traceback.print_exc() + sys.stderr.write("pydevd is not available, cannot connect\n") + + from _pydevd_bundle.pydevd_constants import set_thread_id + from _pydev_bundle import pydev_localhost + + set_thread_id(threading.current_thread(), "console_main") + + VIRTUAL_FRAME_ID = "1" # matches PyStackFrameConsole.java + VIRTUAL_CONSOLE_ID = "console_main" # matches PyThreadConsole.java + f = FakeFrame() + f.f_back = None + f.f_globals = {} # As globals=locals here, let's simply let it empty (and save a bit of network traffic). + f.f_locals = self.get_namespace() + + self.debugger = pydevd.PyDB() + self.debugger.add_fake_frame(thread_id=VIRTUAL_CONSOLE_ID, frame_id=VIRTUAL_FRAME_ID, frame=f) + try: + pydevd.apply_debugger_options(debugger_options) + self.debugger.connect(pydev_localhost.get_localhost(), debuggerPort) + self.debugger.prepare_to_run() + self.debugger.disable_tracing() + except: + traceback.print_exc() + sys.stderr.write("Failed to connect to target debugger.\n") + + # Register to process commands when idle + self.debugrunning = False + try: + import pydevconsole + + pydevconsole.set_debug_hook(self.debugger.process_internal_commands) + except: + traceback.print_exc() + sys.stderr.write("Version of Python does not support debuggable Interactive Console.\n") + + # Important: it has to be really enabled in the main thread, so, schedule + # it to run in the main thread. + self.exec_queue.put(do_connect_to_debugger) + + return ("connect complete",) + + def handshake(self): + if self.connect_status_queue is not None: + self.connect_status_queue.put(True) + return "PyCharm" + + def get_connect_status_queue(self): + return self.connect_status_queue + + def hello(self, input_str): + # Don't care what the input string is + return ("Hello eclipse",) + + def enableGui(self, guiname): + """Enable the GUI specified in guiname (see inputhook for list). + As with IPython, enabling multiple GUIs isn't an error, but + only the last one's main loop runs and it may not work + """ + + def do_enable_gui(): + from _pydev_bundle.pydev_versioncheck import versionok_for_gui + + if versionok_for_gui(): + try: + from pydev_ipython.inputhook import enable_gui + + enable_gui(guiname) + except: + sys.stderr.write("Failed to enable GUI event loop integration for '%s'\n" % guiname) + traceback.print_exc() + elif guiname not in ["none", "", None]: + # Only print a warning if the guiname was going to do something + sys.stderr.write("PyDev console: Python version does not support GUI event loop integration for '%s'\n" % guiname) + # Return value does not matter, so return back what was sent + return guiname + + # Important: it has to be really enabled in the main thread, so, schedule + # it to run in the main thread. + self.exec_queue.put(do_enable_gui) + + def get_ipython_hidden_vars_dict(self): + return None + + +# ======================================================================================================================= +# FakeFrame +# ======================================================================================================================= +class FakeFrame: + """ + Used to show console with variables connection. + A class to be used as a mock of a frame. + """ diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_import_hook.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_import_hook.py new file mode 100644 index 0000000..4dd9136 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_import_hook.py @@ -0,0 +1,38 @@ +import sys +import traceback +from types import ModuleType +from _pydevd_bundle.pydevd_constants import DebugInfoHolder + +import builtins + + +class ImportHookManager(ModuleType): + def __init__(self, name, system_import): + ModuleType.__init__(self, name) + self._system_import = system_import + self._modules_to_patch = {} + + def add_module_name(self, module_name, activate_function): + self._modules_to_patch[module_name] = activate_function + + def do_import(self, name, *args, **kwargs): + module = self._system_import(name, *args, **kwargs) + try: + activate_func = self._modules_to_patch.pop(name, None) + if activate_func: + activate_func() # call activate function + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 2: + traceback.print_exc() + + # Restore normal system importer to reduce performance impact + # of calling this method every time an import statement is invoked + if not self._modules_to_patch: + builtins.__import__ = self._system_import + + return module + + +import_hook_manager = ImportHookManager(__name__ + ".import_hook", builtins.__import__) +builtins.__import__ = import_hook_manager.do_import +sys.modules[import_hook_manager.__name__] = import_hook_manager diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_imports.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_imports.py new file mode 100644 index 0000000..4ee2868 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_imports.py @@ -0,0 +1,12 @@ +from _pydev_bundle._pydev_saved_modules import xmlrpclib +from _pydev_bundle._pydev_saved_modules import xmlrpcserver + +SimpleXMLRPCServer = xmlrpcserver.SimpleXMLRPCServer + +from _pydev_bundle._pydev_execfile import execfile + +from _pydev_bundle._pydev_saved_modules import _queue + +from _pydevd_bundle.pydevd_exec2 import Exec + +from urllib.parse import quote, quote_plus, unquote_plus # @UnresolvedImport diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console.py new file mode 100644 index 0000000..72b1679 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console.py @@ -0,0 +1,95 @@ +import sys +from _pydev_bundle.pydev_console_utils import BaseInterpreterInterface + +import traceback + +# Uncomment to force PyDev standard shell. +# raise ImportError() + +from _pydev_bundle.pydev_ipython_console_011 import get_pydev_frontend + + +# ======================================================================================================================= +# InterpreterInterface +# ======================================================================================================================= +class InterpreterInterface(BaseInterpreterInterface): + """ + The methods in this class should be registered in the xml-rpc server. + """ + + def __init__(self, host, client_port, main_thread, show_banner=True, connect_status_queue=None): + BaseInterpreterInterface.__init__(self, main_thread, connect_status_queue) + self.client_port = client_port + self.host = host + self.interpreter = get_pydev_frontend(host, client_port) + self._input_error_printed = False + self.notification_succeeded = False + self.notification_tries = 0 + self.notification_max_tries = 3 + self.show_banner = show_banner + + self.notify_about_magic() + + def get_greeting_msg(self): + if self.show_banner: + self.interpreter.show_banner() + return self.interpreter.get_greeting_msg() + + def do_add_exec(self, code_fragment): + self.notify_about_magic() + if code_fragment.text.rstrip().endswith("??"): + print("IPython-->") + try: + res = bool(self.interpreter.add_exec(code_fragment.text)) + finally: + if code_fragment.text.rstrip().endswith("??"): + print("<--IPython") + + return res + + def get_namespace(self): + return self.interpreter.get_namespace() + + def getCompletions(self, text, act_tok): + return self.interpreter.getCompletions(text, act_tok) + + def close(self): + sys.exit(0) + + def notify_about_magic(self): + if not self.notification_succeeded: + self.notification_tries += 1 + if self.notification_tries > self.notification_max_tries: + return + completions = self.getCompletions("%", "%") + magic_commands = [x[0] for x in completions] + + server = self.get_server() + + if server is not None: + try: + server.NotifyAboutMagic(magic_commands, self.interpreter.is_automagic()) + self.notification_succeeded = True + except: + self.notification_succeeded = False + + def get_ipython_hidden_vars_dict(self): + try: + if hasattr(self.interpreter, "ipython") and hasattr(self.interpreter.ipython, "user_ns_hidden"): + user_ns_hidden = self.interpreter.ipython.user_ns_hidden + if isinstance(user_ns_hidden, dict): + # Since IPython 2 dict `user_ns_hidden` contains hidden variables and values + user_hidden_dict = user_ns_hidden.copy() + else: + # In IPython 1.x `user_ns_hidden` used to be a set with names of hidden variables + user_hidden_dict = dict([(key, val) for key, val in self.interpreter.ipython.user_ns.items() if key in user_ns_hidden]) + + # while `_`, `__` and `___` were not initialized, they are not presented in `user_ns_hidden` + user_hidden_dict.setdefault("_", "") + user_hidden_dict.setdefault("__", "") + user_hidden_dict.setdefault("___", "") + + return user_hidden_dict + except: + # Getting IPython variables shouldn't break loading frame variables + traceback.print_exc() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console_011.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console_011.py new file mode 100644 index 0000000..dabf1f3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console_011.py @@ -0,0 +1,504 @@ +# TODO that would make IPython integration better +# - show output other times then when enter was pressed +# - support proper exit to allow IPython to cleanup (e.g. temp files created with %edit) +# - support Ctrl-D (Ctrl-Z on Windows) +# - use IPython (numbered) prompts in PyDev +# - better integration of IPython and PyDev completions +# - some of the semantics on handling the code completion are not correct: +# eg: Start a line with % and then type c should give %cd as a completion by it doesn't +# however type %c and request completions and %cd is given as an option +# eg: Completing a magic when user typed it without the leading % causes the % to be inserted +# to the left of what should be the first colon. +"""Interface to TerminalInteractiveShell for PyDev Interactive Console frontend + for IPython 0.11 to 1.0+. +""" + +from __future__ import print_function + +import os +import sys +import codeop +import traceback + +from IPython.core.error import UsageError +from IPython.core.completer import IPCompleter +from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC +from IPython.core.usage import default_banner_parts +from IPython.utils.strdispatch import StrDispatch +import IPython.core.release as IPythonRelease +from IPython.terminal.interactiveshell import TerminalInteractiveShell + +try: + from traitlets import CBool, Unicode +except ImportError: + from IPython.utils.traitlets import CBool, Unicode +from IPython.core import release + +from _pydev_bundle.pydev_imports import xmlrpclib + +default_pydev_banner_parts = default_banner_parts + +default_pydev_banner = "".join(default_pydev_banner_parts) + + +def show_in_pager(self, strng, *args, **kwargs): + """Run a string through pager""" + # On PyDev we just output the string, there are scroll bars in the console + # to handle "paging". This is the same behaviour as when TERM==dump (see + # page.py) + # for compatibility with mime-bundle form: + if isinstance(strng, dict): + strng = strng.get("text/plain", strng) + print(strng) + + +def create_editor_hook(pydev_host, pydev_client_port): + def call_editor(filename, line=0, wait=True): + """Open an editor in PyDev""" + if line is None: + line = 0 + + # Make sure to send an absolution path because unlike most editor hooks + # we don't launch a process. This is more like what happens in the zmqshell + filename = os.path.abspath(filename) + + # import sys + # sys.__stderr__.write('Calling editor at: %s:%s\n' % (pydev_host, pydev_client_port)) + + # Tell PyDev to open the editor + server = xmlrpclib.Server("http://%s:%s" % (pydev_host, pydev_client_port)) + server.IPythonEditor(filename, str(line)) + + if wait: + input("Press Enter when done editing:") + + return call_editor + + +class PyDevIPCompleter(IPCompleter): + def __init__(self, *args, **kwargs): + """Create a Completer that reuses the advanced completion support of PyDev + in addition to the completion support provided by IPython""" + IPCompleter.__init__(self, *args, **kwargs) + # Use PyDev for python matches, see getCompletions below + if self.python_matches in self.matchers: + # `self.python_matches` matches attributes or global python names + self.matchers.remove(self.python_matches) + + +class PyDevIPCompleter6(IPCompleter): + def __init__(self, *args, **kwargs): + """Create a Completer that reuses the advanced completion support of PyDev + in addition to the completion support provided by IPython""" + IPCompleter.__init__(self, *args, **kwargs) + + @property + def matchers(self): + """All active matcher routines for completion""" + # To remove python_matches we now have to override it as it's now a property in the superclass. + return [ + self.file_matches, + self.magic_matches, + self.python_func_kw_matches, + self.dict_key_matches, + ] + + @matchers.setter + def matchers(self, value): + # To stop the init in IPCompleter raising an AttributeError we now have to specify a setter as it's now a property in the superclass. + return + + +class PyDevTerminalInteractiveShell(TerminalInteractiveShell): + banner1 = Unicode(default_pydev_banner, config=True, help="""The part of the banner to be printed before the profile""") + + # TODO term_title: (can PyDev's title be changed???, see terminal.py for where to inject code, in particular set_term_title as used by %cd) + # for now, just disable term_title + term_title = CBool(False) + + # Note in version 0.11 there is no guard in the IPython code about displaying a + # warning, so with 0.11 you get: + # WARNING: Readline services not available or not loaded. + # WARNING: The auto-indent feature requires the readline library + # Disable readline, readline type code is all handled by PyDev (on Java side) + readline_use = CBool(False) + # autoindent has no meaning in PyDev (PyDev always handles that on the Java side), + # and attempting to enable it will print a warning in the absence of readline. + autoindent = CBool(False) + # Force console to not give warning about color scheme choice and default to NoColor. + # TODO It would be nice to enable colors in PyDev but: + # - The PyDev Console (Eclipse Console) does not support the full range of colors, so the + # effect isn't as nice anyway at the command line + # - If done, the color scheme should default to LightBG, but actually be dependent on + # any settings the user has (such as if a dark theme is in use, then Linux is probably + # a better theme). + colors_force = CBool(True) + colors = Unicode("NoColor") + # Since IPython 5 the terminal interface is not compatible with Emacs `inferior-shell` and + # the `simple_prompt` flag is needed + simple_prompt = CBool(True) + + # In the PyDev Console, GUI control is done via hookable XML-RPC server + @staticmethod + def enable_gui(gui=None, app=None): + """Switch amongst GUI input hooks by name.""" + # Deferred import + from pydev_ipython.inputhook import enable_gui as real_enable_gui + + try: + return real_enable_gui(gui, app) + except ValueError as e: + raise UsageError("%s" % e) + + # ------------------------------------------------------------------------- + # Things related to hooks + # ------------------------------------------------------------------------- + + def init_history(self): + # Disable history so that we don't have an additional thread for that + # (and we don't use the history anyways). + self.config.HistoryManager.enabled = False + super(PyDevTerminalInteractiveShell, self).init_history() + + def init_hooks(self): + super(PyDevTerminalInteractiveShell, self).init_hooks() + self.set_hook("show_in_pager", show_in_pager) + + # ------------------------------------------------------------------------- + # Things related to exceptions + # ------------------------------------------------------------------------- + + def showtraceback(self, exc_tuple=None, *args, **kwargs): + # IPython does a lot of clever stuff with Exceptions. However mostly + # it is related to IPython running in a terminal instead of an IDE. + # (e.g. it prints out snippets of code around the stack trace) + # PyDev does a lot of clever stuff too, so leave exception handling + # with default print_exc that PyDev can parse and do its clever stuff + # with (e.g. it puts links back to the original source code) + try: + if exc_tuple is None: + etype, value, tb = sys.exc_info() + else: + etype, value, tb = exc_tuple + except ValueError: + return + + if tb is not None: + traceback.print_exception(etype, value, tb) + + # ------------------------------------------------------------------------- + # Things related to text completion + # ------------------------------------------------------------------------- + + # The way to construct an IPCompleter changed in most versions, + # so we have a custom, per version implementation of the construction + + def _new_completer_100(self): + completer = PyDevIPCompleter( + shell=self, + namespace=self.user_ns, + global_namespace=self.user_global_ns, + alias_table=self.alias_manager.alias_table, + use_readline=self.has_readline, + parent=self, + ) + return completer + + def _new_completer_234(self): + # correct for IPython versions 2.x, 3.x, 4.x + completer = PyDevIPCompleter( + shell=self, + namespace=self.user_ns, + global_namespace=self.user_global_ns, + use_readline=self.has_readline, + parent=self, + ) + return completer + + def _new_completer_500(self): + completer = PyDevIPCompleter( + shell=self, namespace=self.user_ns, global_namespace=self.user_global_ns, use_readline=False, parent=self + ) + return completer + + def _new_completer_600(self): + completer = PyDevIPCompleter6( + shell=self, namespace=self.user_ns, global_namespace=self.user_global_ns, use_readline=False, parent=self + ) + return completer + + def add_completer_hooks(self): + from IPython.core.completerlib import module_completer, magic_run_completer, cd_completer + + try: + from IPython.core.completerlib import reset_completer + except ImportError: + # reset_completer was added for rel-0.13 + reset_completer = None + self.configurables.append(self.Completer) + + # Add custom completers to the basic ones built into IPCompleter + sdisp = self.strdispatchers.get("complete_command", StrDispatch()) + self.strdispatchers["complete_command"] = sdisp + self.Completer.custom_completers = sdisp + + self.set_hook("complete_command", module_completer, str_key="import") + self.set_hook("complete_command", module_completer, str_key="from") + self.set_hook("complete_command", magic_run_completer, str_key="%run") + self.set_hook("complete_command", cd_completer, str_key="%cd") + if reset_completer: + self.set_hook("complete_command", reset_completer, str_key="%reset") + + def init_completer(self): + """Initialize the completion machinery. + + This creates a completer that provides the completions that are + IPython specific. We use this to supplement PyDev's core code + completions. + """ + # PyDev uses its own completer and custom hooks so that it uses + # most completions from PyDev's core completer which provides + # extra information. + # See getCompletions for where the two sets of results are merged + + if IPythonRelease._version_major >= 6: + self.Completer = self._new_completer_600() + elif IPythonRelease._version_major >= 5: + self.Completer = self._new_completer_500() + elif IPythonRelease._version_major >= 2: + self.Completer = self._new_completer_234() + elif IPythonRelease._version_major >= 1: + self.Completer = self._new_completer_100() + + if hasattr(self.Completer, "use_jedi"): + self.Completer.use_jedi = False + + self.add_completer_hooks() + + if IPythonRelease._version_major <= 3: + # Only configure readline if we truly are using readline. IPython can + # do tab-completion over the network, in GUIs, etc, where readline + # itself may be absent + if self.has_readline: + self.set_readline_completer() + + # ------------------------------------------------------------------------- + # Things related to aliases + # ------------------------------------------------------------------------- + + def init_alias(self): + # InteractiveShell defines alias's we want, but TerminalInteractiveShell defines + # ones we don't. So don't use super and instead go right to InteractiveShell + InteractiveShell.init_alias(self) + + # ------------------------------------------------------------------------- + # Things related to exiting + # ------------------------------------------------------------------------- + def ask_exit(self): + """Ask the shell to exit. Can be overiden and used as a callback.""" + # TODO PyDev's console does not have support from the Python side to exit + # the console. If user forces the exit (with sys.exit()) then the console + # simply reports errors. e.g.: + # >>> import sys + # >>> sys.exit() + # Failed to create input stream: Connection refused + # >>> + # Console already exited with value: 0 while waiting for an answer. + # Error stream: + # Output stream: + # >>> + # + # Alternatively if you use the non-IPython shell this is what happens + # >>> exit() + # :None + # >>> + # :None + # >>> + # + super(PyDevTerminalInteractiveShell, self).ask_exit() + print("To exit the PyDev Console, terminate the console within IDE.") + + # ------------------------------------------------------------------------- + # Things related to magics + # ------------------------------------------------------------------------- + + def init_magics(self): + super(PyDevTerminalInteractiveShell, self).init_magics() + # TODO Any additional magics for PyDev? + + +InteractiveShellABC.register(PyDevTerminalInteractiveShell) # @UndefinedVariable + + +# ======================================================================================================================= +# _PyDevFrontEnd +# ======================================================================================================================= +class _PyDevFrontEnd: + version = release.__version__ + + def __init__(self): + # Create and initialize our IPython instance. + if hasattr(PyDevTerminalInteractiveShell, "_instance") and PyDevTerminalInteractiveShell._instance is not None: + self.ipython = PyDevTerminalInteractiveShell._instance + else: + self.ipython = PyDevTerminalInteractiveShell.instance() + + self._curr_exec_line = 0 + self._curr_exec_lines = [] + + def show_banner(self): + self.ipython.show_banner() + + def update(self, globals, locals): + ns = self.ipython.user_ns + + for key, value in list(ns.items()): + if key not in locals: + locals[key] = value + + self.ipython.user_global_ns.clear() + self.ipython.user_global_ns.update(globals) + self.ipython.user_ns = locals + + if hasattr(self.ipython, "history_manager") and hasattr(self.ipython.history_manager, "save_thread"): + self.ipython.history_manager.save_thread.pydev_do_not_trace = True # don't trace ipython history saving thread + + def complete(self, string): + try: + if string: + return self.ipython.complete(None, line=string, cursor_pos=string.__len__()) + else: + return self.ipython.complete(string, string, 0) + except: + # Silence completer exceptions + pass + + def is_complete(self, string): + # Based on IPython 0.10.1 + + if string in ("", "\n"): + # Prefiltering, eg through ipython0, may return an empty + # string although some operations have been accomplished. We + # thus want to consider an empty string as a complete + # statement. + return True + else: + try: + # Add line returns here, to make sure that the statement is + # complete (except if '\' was used). + # This should probably be done in a different place (like + # maybe 'prefilter_input' method? For now, this works. + clean_string = string.rstrip("\n") + if not clean_string.endswith("\\"): + clean_string += "\n\n" + + is_complete = codeop.compile_command(clean_string, "", "exec") + except Exception: + # XXX: Hack: return True so that the + # code gets executed and the error captured. + is_complete = True + return is_complete + + def getCompletions(self, text, act_tok): + # Get completions from IPython and from PyDev and merge the results + # IPython only gives context free list of completions, while PyDev + # gives detailed information about completions. + try: + TYPE_IPYTHON = "11" + TYPE_IPYTHON_MAGIC = "12" + _line, ipython_completions = self.complete(text) + + from _pydev_bundle._pydev_completer import Completer + + completer = Completer(self.get_namespace(), None) + ret = completer.complete(act_tok) + append = ret.append + ip = self.ipython + pydev_completions = set([f[0] for f in ret]) + for ipython_completion in ipython_completions: + # PyCharm was not expecting completions with '%'... + # Could be fixed in the backend, but it's probably better + # fixing it at PyCharm. + # if ipython_completion.startswith('%'): + # ipython_completion = ipython_completion[1:] + + if ipython_completion not in pydev_completions: + pydev_completions.add(ipython_completion) + inf = ip.object_inspect(ipython_completion) + if inf["type_name"] == "Magic function": + pydev_type = TYPE_IPYTHON_MAGIC + else: + pydev_type = TYPE_IPYTHON + pydev_doc = inf["docstring"] + if pydev_doc is None: + pydev_doc = "" + append((ipython_completion, pydev_doc, "", pydev_type)) + return ret + except: + import traceback + + traceback.print_exc() + return [] + + def get_namespace(self): + return self.ipython.user_ns + + def clear_buffer(self): + del self._curr_exec_lines[:] + + def add_exec(self, line): + if self._curr_exec_lines: + self._curr_exec_lines.append(line) + + buf = "\n".join(self._curr_exec_lines) + + if self.is_complete(buf): + self._curr_exec_line += 1 + self.ipython.run_cell(buf) + del self._curr_exec_lines[:] + return False # execute complete (no more) + + return True # needs more + else: + if not self.is_complete(line): + # Did not execute + self._curr_exec_lines.append(line) + return True # needs more + else: + self._curr_exec_line += 1 + self.ipython.run_cell(line, store_history=True) + # hist = self.ipython.history_manager.output_hist_reprs + # rep = hist.get(self._curr_exec_line, None) + # if rep is not None: + # print(rep) + return False # execute complete (no more) + + def is_automagic(self): + return self.ipython.automagic + + def get_greeting_msg(self): + return "PyDev console: using IPython %s\n" % self.version + + +class _PyDevFrontEndContainer: + _instance = None + _last_host_port = None + + +def get_pydev_frontend(pydev_host, pydev_client_port): + if _PyDevFrontEndContainer._instance is None: + _PyDevFrontEndContainer._instance = _PyDevFrontEnd() + + if _PyDevFrontEndContainer._last_host_port != (pydev_host, pydev_client_port): + _PyDevFrontEndContainer._last_host_port = pydev_host, pydev_client_port + + # Back channel to PyDev to open editors (in the future other + # info may go back this way. This is the same channel that is + # used to get stdin, see StdIn in pydev_console_utils) + _PyDevFrontEndContainer._instance.ipython.hooks["editor"] = create_editor_hook(pydev_host, pydev_client_port) + + # Note: setting the callback directly because setting it with set_hook would actually create a chain instead + # of ovewriting at each new call). + # _PyDevFrontEndContainer._instance.ipython.set_hook('editor', create_editor_hook(pydev_host, pydev_client_port)) + + return _PyDevFrontEndContainer._instance diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_is_thread_alive.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_is_thread_alive.py new file mode 100644 index 0000000..3f2483a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_is_thread_alive.py @@ -0,0 +1,30 @@ +from _pydev_bundle._pydev_saved_modules import threading + +# Hack for https://www.brainwy.com/tracker/PyDev/363 (i.e.: calling is_alive() can throw AssertionError under some +# circumstances). +# It is required to debug threads started by start_new_thread in Python 3.4 +_temp = threading.Thread() + +if hasattr(_temp, "_handle") and hasattr(_temp, "_started"): # Python 3.13 and later has this + + def is_thread_alive(t): + return not t._handle.is_done() + + +elif hasattr(_temp, "_is_stopped"): # Python 3.12 and earlier has this + + def is_thread_alive(t): + return not t._is_stopped + +elif hasattr(_temp, "_Thread__stopped"): # Python 2.x has this + + def is_thread_alive(t): + return not t._Thread__stopped + +else: + # Jython wraps a native java thread and thus only obeys the public API. + def is_thread_alive(t): + return t.is_alive() + + +del _temp diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_localhost.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_localhost.py new file mode 100644 index 0000000..d258092 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_localhost.py @@ -0,0 +1,68 @@ +from _pydev_bundle._pydev_saved_modules import socket +import sys + +IS_JYTHON = sys.platform.find("java") != -1 + +_cache = None + + +def get_localhost(): + """ + Should return 127.0.0.1 in ipv4 and ::1 in ipv6 + + localhost is not used because on windows vista/windows 7, there can be issues where the resolving doesn't work + properly and takes a lot of time (had this issue on the pyunit server). + + Using the IP directly solves the problem. + """ + # TODO: Needs better investigation! + + global _cache + if _cache is None: + try: + for addr_info in socket.getaddrinfo("localhost", 80, 0, 0, socket.SOL_TCP): + config = addr_info[4] + if config[0] == "127.0.0.1": + _cache = "127.0.0.1" + return _cache + except: + # Ok, some versions of Python don't have getaddrinfo or SOL_TCP... Just consider it 127.0.0.1 in this case. + _cache = "127.0.0.1" + else: + _cache = "localhost" + + return _cache + + +def get_socket_names(n_sockets, close=False): + socket_names = [] + sockets = [] + for _ in range(n_sockets): + if IS_JYTHON: + # Although the option which would be pure java *should* work for Jython, the socket being returned is still 0 + # (i.e.: it doesn't give the local port bound, only the original port, which was 0). + from java.net import ServerSocket + + sock = ServerSocket(0) + socket_name = get_localhost(), sock.getLocalPort() + else: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.bind((get_localhost(), 0)) + socket_name = sock.getsockname() + + sockets.append(sock) + socket_names.append(socket_name) + + if close: + for s in sockets: + s.close() + return socket_names + + +def get_socket_name(close=False): + return get_socket_names(1, close)[0] + + +if __name__ == "__main__": + print(get_socket_name()) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_log.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_log.py new file mode 100644 index 0000000..2fb0fc2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_log.py @@ -0,0 +1,284 @@ +from _pydevd_bundle.pydevd_constants import DebugInfoHolder, SHOW_COMPILE_CYTHON_COMMAND_LINE, NULL, LOG_TIME, ForkSafeLock +from contextlib import contextmanager +import traceback +import os +import sys + + +class _LoggingGlobals(object): + _warn_once_map = {} + _debug_stream_filename = None + _debug_stream = NULL + _debug_stream_initialized = False + _initialize_lock = ForkSafeLock() + + +def initialize_debug_stream(reinitialize=False): + """ + :param bool reinitialize: + Reinitialize is used to update the debug stream after a fork (thus, if it wasn't + initialized, we don't need to do anything, just wait for the first regular log call + to initialize). + """ + if reinitialize: + if not _LoggingGlobals._debug_stream_initialized: + return + else: + if _LoggingGlobals._debug_stream_initialized: + return + + with _LoggingGlobals._initialize_lock: + # Initialization is done lazilly, so, it's possible that multiple threads try to initialize + # logging. + + # Check initial conditions again after obtaining the lock. + if reinitialize: + if not _LoggingGlobals._debug_stream_initialized: + return + else: + if _LoggingGlobals._debug_stream_initialized: + return + + _LoggingGlobals._debug_stream_initialized = True + + # Note: we cannot initialize with sys.stderr because when forking we may end up logging things in 'os' calls. + _LoggingGlobals._debug_stream = NULL + _LoggingGlobals._debug_stream_filename = None + + if not DebugInfoHolder.PYDEVD_DEBUG_FILE: + _LoggingGlobals._debug_stream = sys.stderr + else: + # Add pid to the filename. + try: + target_file = DebugInfoHolder.PYDEVD_DEBUG_FILE + debug_file = _compute_filename_with_pid(target_file) + _LoggingGlobals._debug_stream = open(debug_file, "w") + _LoggingGlobals._debug_stream_filename = debug_file + except Exception: + _LoggingGlobals._debug_stream = sys.stderr + # Don't fail when trying to setup logging, just show the exception. + traceback.print_exc() + + +def _compute_filename_with_pid(target_file, pid=None): + # Note: used in tests. + dirname = os.path.dirname(target_file) + basename = os.path.basename(target_file) + try: + os.makedirs(dirname) + except Exception: + pass # Ignore error if it already exists. + + name, ext = os.path.splitext(basename) + if pid is None: + pid = os.getpid() + return os.path.join(dirname, "%s.%s%s" % (name, pid, ext)) + + +def log_to(log_file: str, log_level: int = 3) -> None: + with _LoggingGlobals._initialize_lock: + # Can be set directly. + DebugInfoHolder.DEBUG_TRACE_LEVEL = log_level + + if DebugInfoHolder.PYDEVD_DEBUG_FILE != log_file: + # Note that we don't need to reset it unless it actually changed + # (would be the case where it's set as an env var in a new process + # and a subprocess initializes logging to the same value). + _LoggingGlobals._debug_stream = NULL + _LoggingGlobals._debug_stream_filename = None + + DebugInfoHolder.PYDEVD_DEBUG_FILE = log_file + + _LoggingGlobals._debug_stream_initialized = False + + +def list_log_files(pydevd_debug_file): + log_files = [] + dirname = os.path.dirname(pydevd_debug_file) + basename = os.path.basename(pydevd_debug_file) + if os.path.isdir(dirname): + name, ext = os.path.splitext(basename) + for f in os.listdir(dirname): + if f.startswith(name) and f.endswith(ext): + log_files.append(os.path.join(dirname, f)) + return log_files + + +@contextmanager +def log_context(trace_level, stream): + """ + To be used to temporarily change the logging settings. + """ + with _LoggingGlobals._initialize_lock: + original_trace_level = DebugInfoHolder.DEBUG_TRACE_LEVEL + original_debug_stream = _LoggingGlobals._debug_stream + original_pydevd_debug_file = DebugInfoHolder.PYDEVD_DEBUG_FILE + original_debug_stream_filename = _LoggingGlobals._debug_stream_filename + original_initialized = _LoggingGlobals._debug_stream_initialized + + DebugInfoHolder.DEBUG_TRACE_LEVEL = trace_level + _LoggingGlobals._debug_stream = stream + _LoggingGlobals._debug_stream_initialized = True + try: + yield + finally: + with _LoggingGlobals._initialize_lock: + DebugInfoHolder.DEBUG_TRACE_LEVEL = original_trace_level + _LoggingGlobals._debug_stream = original_debug_stream + DebugInfoHolder.PYDEVD_DEBUG_FILE = original_pydevd_debug_file + _LoggingGlobals._debug_stream_filename = original_debug_stream_filename + _LoggingGlobals._debug_stream_initialized = original_initialized + + +import time + +_last_log_time = time.time() + +# Set to True to show pid in each logged message (usually the file has it, but sometimes it's handy). +_LOG_PID = False + + +def _pydevd_log(level, msg, *args): + """ + Levels are: + + 0 most serious warnings/errors (always printed) + 1 warnings/significant events + 2 informational trace + 3 verbose mode + """ + if level <= DebugInfoHolder.DEBUG_TRACE_LEVEL: + # yes, we can have errors printing if the console of the program has been finished (and we're still trying to print something) + try: + try: + if args: + msg = msg % args + except: + msg = "%s - %s" % (msg, args) + + if LOG_TIME: + global _last_log_time + new_log_time = time.time() + time_diff = new_log_time - _last_log_time + _last_log_time = new_log_time + msg = "%.2fs - %s\n" % ( + time_diff, + msg, + ) + else: + msg = "%s\n" % (msg,) + + if _LOG_PID: + msg = "<%s> - %s\n" % ( + os.getpid(), + msg, + ) + + try: + try: + initialize_debug_stream() # Do it as late as possible + _LoggingGlobals._debug_stream.write(msg) + except TypeError: + if isinstance(msg, bytes): + # Depending on the StringIO flavor, it may only accept unicode. + msg = msg.decode("utf-8", "replace") + _LoggingGlobals._debug_stream.write(msg) + except UnicodeEncodeError: + # When writing to the stream it's possible that the string can't be represented + # in the encoding expected (in this case, convert it to the stream encoding + # or ascii if we can't find one suitable using a suitable replace). + encoding = getattr(_LoggingGlobals._debug_stream, "encoding", "ascii") + msg = msg.encode(encoding, "backslashreplace") + msg = msg.decode(encoding) + _LoggingGlobals._debug_stream.write(msg) + + _LoggingGlobals._debug_stream.flush() + except: + pass + return True + + +def _pydevd_log_exception(msg="", *args): + if msg or args: + _pydevd_log(0, msg, *args) + try: + initialize_debug_stream() # Do it as late as possible + traceback.print_exc(file=_LoggingGlobals._debug_stream) + _LoggingGlobals._debug_stream.flush() + except: + raise + + +def verbose(msg, *args): + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 3: + _pydevd_log(3, msg, *args) + + +def debug(msg, *args): + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 2: + _pydevd_log(2, msg, *args) + + +def info(msg, *args): + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + _pydevd_log(1, msg, *args) + + +warn = info + + +def critical(msg, *args): + _pydevd_log(0, msg, *args) + + +def exception(msg="", *args): + try: + _pydevd_log_exception(msg, *args) + except: + pass # Should never fail (even at interpreter shutdown). + + +error = exception + + +def error_once(msg, *args): + try: + if args: + message = msg % args + else: + message = str(msg) + except: + message = "%s - %s" % (msg, args) + + if message not in _LoggingGlobals._warn_once_map: + _LoggingGlobals._warn_once_map[message] = True + critical(message) + + +def exception_once(msg, *args): + try: + if args: + message = msg % args + else: + message = str(msg) + except: + message = "%s - %s" % (msg, args) + + if message not in _LoggingGlobals._warn_once_map: + _LoggingGlobals._warn_once_map[message] = True + exception(message) + + +def debug_once(msg, *args): + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 3: + error_once(msg, *args) + + +def show_compile_cython_command_line(): + if SHOW_COMPILE_CYTHON_COMMAND_LINE: + dirname = os.path.dirname(os.path.dirname(__file__)) + error_once( + 'warning: Debugger speedups using cython not found. Run \'"%s" "%s" build_ext --inplace\' to build.', + sys.executable, + os.path.join(dirname, "setup_pydevd_cython.py"), + ) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py new file mode 100644 index 0000000..4c63c95 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py @@ -0,0 +1,1293 @@ +# License: EPL +import os +import re +import sys +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle.pydevd_constants import ( + get_global_debugger, + IS_WINDOWS, + IS_JYTHON, + get_current_thread_id, + sorted_dict_repr, + set_global_debugger, + DebugInfoHolder, + PYDEVD_USE_SYS_MONITORING, + IS_PY313_OR_GREATER, +) +from _pydev_bundle import pydev_log +from contextlib import contextmanager +from _pydevd_bundle import pydevd_constants, pydevd_defaults +from _pydevd_bundle.pydevd_defaults import PydevdCustomization +import ast +from pathlib import Path + +# =============================================================================== +# Things that are dependent on having the pydevd debugger +# =============================================================================== + +pydev_src_dir = os.path.dirname(os.path.dirname(__file__)) + +_arg_patch = threading.local() + + +@contextmanager +def skip_subprocess_arg_patch(): + _arg_patch.apply_arg_patching = False + try: + yield + finally: + _arg_patch.apply_arg_patching = True + + +def _get_apply_arg_patching(): + return getattr(_arg_patch, "apply_arg_patching", True) + + +def _get_setup_updated_with_protocol_and_ppid(setup, is_exec=False): + if setup is None: + setup = {} + setup = setup.copy() + # Discard anything related to the protocol (we'll set the the protocol based on the one + # currently set). + setup.pop(pydevd_constants.ARGUMENT_HTTP_JSON_PROTOCOL, None) + setup.pop(pydevd_constants.ARGUMENT_JSON_PROTOCOL, None) + setup.pop(pydevd_constants.ARGUMENT_QUOTED_LINE_PROTOCOL, None) + + if not is_exec: + # i.e.: The ppid for the subprocess is the current pid. + # If it's an exec, keep it what it was. + setup[pydevd_constants.ARGUMENT_PPID] = os.getpid() + + protocol = pydevd_constants.get_protocol() + if protocol == pydevd_constants.HTTP_JSON_PROTOCOL: + setup[pydevd_constants.ARGUMENT_HTTP_JSON_PROTOCOL] = True + + elif protocol == pydevd_constants.JSON_PROTOCOL: + setup[pydevd_constants.ARGUMENT_JSON_PROTOCOL] = True + + elif protocol == pydevd_constants.QUOTED_LINE_PROTOCOL: + setup[pydevd_constants.ARGUMENT_QUOTED_LINE_PROTOCOL] = True + + elif protocol == pydevd_constants.HTTP_PROTOCOL: + setup[pydevd_constants.ARGUMENT_HTTP_PROTOCOL] = True + + else: + pydev_log.debug("Unexpected protocol: %s", protocol) + + mode = pydevd_defaults.PydevdCustomization.DEBUG_MODE + if mode: + setup["debug-mode"] = mode + + preimport = pydevd_defaults.PydevdCustomization.PREIMPORT + if preimport: + setup["preimport"] = preimport + + if DebugInfoHolder.PYDEVD_DEBUG_FILE: + setup["log-file"] = DebugInfoHolder.PYDEVD_DEBUG_FILE + + if DebugInfoHolder.DEBUG_TRACE_LEVEL: + setup["log-level"] = DebugInfoHolder.DEBUG_TRACE_LEVEL + + return setup + + +class _LastFutureImportFinder(ast.NodeVisitor): + def __init__(self): + self.last_future_import_found = None + + def visit_ImportFrom(self, node): + if node.module == "__future__": + self.last_future_import_found = node + + +def _get_offset_from_line_col(code, line, col): + offset = 0 + for i, line_contents in enumerate(code.splitlines(True)): + if i == line: + offset += col + return offset + else: + offset += len(line_contents) + + return -1 + + +def _separate_future_imports(code): + """ + :param code: + The code from where we want to get the __future__ imports (note that it's possible that + there's no such entry). + + :return tuple(str, str): + The return is a tuple(future_import, code). + + If the future import is not available a return such as ('', code) is given, otherwise, the + future import will end with a ';' (so that it can be put right before the pydevd attach + code). + """ + try: + node = ast.parse(code, "", "exec") + visitor = _LastFutureImportFinder() + visitor.visit(node) + + if visitor.last_future_import_found is None: + return "", code + + node = visitor.last_future_import_found + offset = -1 + if hasattr(node, "end_lineno") and hasattr(node, "end_col_offset"): + # Python 3.8 onwards has these (so, use when possible). + line, col = node.end_lineno, node.end_col_offset + offset = _get_offset_from_line_col(code, line - 1, col) # ast lines are 1-based, make it 0-based. + + else: + # end line/col not available, let's just find the offset and then search + # for the alias from there. + line, col = node.lineno, node.col_offset + offset = _get_offset_from_line_col(code, line - 1, col) # ast lines are 1-based, make it 0-based. + if offset >= 0 and node.names: + from_future_import_name = node.names[-1].name + i = code.find(from_future_import_name, offset) + if i < 0: + offset = -1 + else: + offset = i + len(from_future_import_name) + + if offset >= 0: + for i in range(offset, len(code)): + if code[i] in (" ", "\t", ";", ")", "\n"): + offset += 1 + else: + break + + future_import = code[:offset] + code_remainder = code[offset:] + + # Now, put '\n' lines back into the code remainder (we had to search for + # `\n)`, but in case we just got the `\n`, it should be at the remainder, + # not at the future import. + while future_import.endswith("\n"): + future_import = future_import[:-1] + code_remainder = "\n" + code_remainder + + if not future_import.endswith(";"): + future_import += ";" + return future_import, code_remainder + + # This shouldn't happen... + pydev_log.info("Unable to find line %s in code:\n%r", line, code) + return "", code + + except: + pydev_log.exception("Error getting from __future__ imports from: %r", code) + return "", code + + +def _get_python_c_args(host, port, code, args, setup): + setup = _get_setup_updated_with_protocol_and_ppid(setup) + + # i.e.: We want to make the repr sorted so that it works in tests. + setup_repr = setup if setup is None else (sorted_dict_repr(setup)) + + future_imports = "" + if "__future__" in code: + # If the code has a __future__ import, we need to be able to strip the __future__ + # imports from the code and add them to the start of our code snippet. + future_imports, code = _separate_future_imports(code) + + return ( + "%simport sys; sys.path.insert(0, r'%s'); import pydevd; pydevd.config(%r, %r); " + "pydevd.settrace(host=%r, port=%s, suspend=False, trace_only_current_thread=False, patch_multiprocessing=True, access_token=%r, client_access_token=%r, __setup_holder__=%s); " + "%s" + ) % ( + future_imports, + pydev_src_dir, + pydevd_constants.get_protocol(), + PydevdCustomization.DEBUG_MODE, + host, + port, + setup.get("access-token"), + setup.get("client-access-token"), + setup_repr, + code, + ) + + +def _get_host_port(): + import pydevd + + host, port = pydevd.dispatch() + return host, port + + +def _is_managed_arg(arg): + pydevd_py = _get_str_type_compatible(arg, "pydevd.py") + if arg.endswith(pydevd_py): + return True + return False + + +def _on_forked_process(setup_tracing=True): + pydevd_constants.after_fork() + pydev_log.initialize_debug_stream(reinitialize=True) + + if setup_tracing: + pydev_log.debug("pydevd on forked process: %s", os.getpid()) + + import pydevd + + pydevd.threadingCurrentThread().__pydevd_main_thread = True + pydevd.settrace_forked(setup_tracing=setup_tracing) + + +def _on_set_trace_for_new_thread(global_debugger): + if global_debugger is not None: + if not PYDEVD_USE_SYS_MONITORING: + global_debugger.enable_tracing() + + +def _get_str_type_compatible(s, args): + """ + This method converts `args` to byte/unicode based on the `s' type. + """ + if isinstance(args, (list, tuple)): + ret = [] + for arg in args: + if type(s) == type(arg): + ret.append(arg) + else: + if isinstance(s, bytes): + ret.append(arg.encode("utf-8")) + else: + ret.append(arg.decode("utf-8")) + return ret + else: + if type(s) == type(args): + return args + else: + if isinstance(s, bytes): + return args.encode("utf-8") + else: + return args.decode("utf-8") + + +# =============================================================================== +# Things related to monkey-patching +# =============================================================================== +def is_python(path): + single_quote, double_quote = _get_str_type_compatible(path, ["'", '"']) + + if path.endswith(single_quote) or path.endswith(double_quote): + path = path[1 : len(path) - 1] + filename = os.path.basename(path).lower() + for name in _get_str_type_compatible(filename, ["python", "jython", "pypy"]): + if filename.find(name) != -1: + return True + + return False + + +class InvalidTypeInArgsException(Exception): + pass + + +def remove_quotes_from_args(args): + if sys.platform == "win32": + new_args = [] + + for x in args: + if isinstance(x, Path): + x = str(x) + else: + if not isinstance(x, (bytes, str)): + raise InvalidTypeInArgsException(str(type(x))) + + double_quote, two_double_quotes = _get_str_type_compatible(x, ['"', '""']) + + if x != two_double_quotes: + if len(x) > 1 and x.startswith(double_quote) and x.endswith(double_quote): + x = x[1:-1] + + new_args.append(x) + return new_args + else: + new_args = [] + for x in args: + if isinstance(x, Path): + x = x.as_posix() + else: + if not isinstance(x, (bytes, str)): + raise InvalidTypeInArgsException(str(type(x))) + new_args.append(x) + + return new_args + + +def quote_arg_win32(arg): + fix_type = lambda x: _get_str_type_compatible(arg, x) + + # See if we need to quote at all - empty strings need quoting, as do strings + # with whitespace or quotes in them. Backslashes do not need quoting. + if arg and not set(arg).intersection(fix_type(' "\t\n\v')): + return arg + + # Per https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw, + # the standard way to interpret arguments in double quotes is as follows: + # + # 2N backslashes followed by a quotation mark produce N backslashes followed by + # begin/end quote. This does not become part of the parsed argument, but toggles + # the "in quotes" mode. + # + # 2N+1 backslashes followed by a quotation mark again produce N backslashes followed + # by a quotation mark literal ("). This does not toggle the "in quotes" mode. + # + # N backslashes not followed by a quotation mark simply produce N backslashes. + # + # This code needs to do the reverse transformation, thus: + # + # N backslashes followed by " produce 2N+1 backslashes followed by " + # + # N backslashes at the end (i.e. where the closing " goes) produce 2N backslashes. + # + # N backslashes in any other position remain as is. + + arg = re.sub(fix_type(r"(\\*)\""), fix_type(r'\1\1\\"'), arg) + arg = re.sub(fix_type(r"(\\*)$"), fix_type(r"\1\1"), arg) + return fix_type('"') + arg + fix_type('"') + + +def quote_args(args): + if sys.platform == "win32": + return list(map(quote_arg_win32, args)) + else: + return args + + +def patch_args(args, is_exec=False): + """ + :param list args: + Arguments to patch. + + :param bool is_exec: + If it's an exec, the current process will be replaced (this means we have + to keep the same ppid). + """ + try: + pydev_log.debug("Patching args: %s", args) + original_args = args + try: + unquoted_args = remove_quotes_from_args(args) + except InvalidTypeInArgsException as e: + pydev_log.info("Unable to monkey-patch subprocess arguments because a type found in the args is invalid: %s", e) + return original_args + + # Internally we should reference original_args (if we want to return them) or unquoted_args + # to add to the list which will be then quoted in the end. + del args + + from pydevd import SetupHolder + + if not unquoted_args: + return original_args + + if not is_python(unquoted_args[0]): + pydev_log.debug("Process is not python, returning.") + return original_args + + # Note: we create a copy as string to help with analyzing the arguments, but + # the final list should have items from the unquoted_args as they were initially. + args_as_str = _get_str_type_compatible("", unquoted_args) + + params_with_value_in_separate_arg = ( + "--check-hash-based-pycs", + "--jit", # pypy option + ) + + # All short switches may be combined together. The ones below require a value and the + # value itself may be embedded in the arg. + # + # i.e.: Python accepts things as: + # + # python -OQold -qmtest + # + # Which is the same as: + # + # python -O -Q old -q -m test + # + # or even: + # + # python -OQold "-vcimport sys;print(sys)" + # + # Which is the same as: + # + # python -O -Q old -v -c "import sys;print(sys)" + + params_with_combinable_arg = set(("W", "X", "Q", "c", "m")) + + module_name = None + before_module_flag = "" + module_name_i_start = -1 + module_name_i_end = -1 + + code = None + code_i = -1 + code_i_end = -1 + code_flag = "" + + filename = None + filename_i = -1 + + ignore_next = True # start ignoring the first (the first entry is the python executable) + for i, arg_as_str in enumerate(args_as_str): + if ignore_next: + ignore_next = False + continue + + if arg_as_str.startswith("-"): + if arg_as_str == "-": + # Contents will be read from the stdin. This is not currently handled. + pydev_log.debug('Unable to fix arguments to attach debugger on subprocess when reading from stdin ("python ... -").') + return original_args + + if arg_as_str.startswith(params_with_value_in_separate_arg): + if arg_as_str in params_with_value_in_separate_arg: + ignore_next = True + continue + + break_out = False + for j, c in enumerate(arg_as_str): + # i.e.: Python supports -X faulthandler as well as -Xfaulthandler + # (in one case we have to ignore the next and in the other we don't + # have to ignore it). + if c in params_with_combinable_arg: + remainder = arg_as_str[j + 1 :] + if not remainder: + ignore_next = True + + if c == "m": + # i.e.: Something as + # python -qm test + # python -m test + # python -qmtest + before_module_flag = arg_as_str[:j] # before_module_flag would then be "-q" + if before_module_flag == "-": + before_module_flag = "" + module_name_i_start = i + if not remainder: + module_name = unquoted_args[i + 1] + module_name_i_end = i + 1 + else: + # i.e.: python -qmtest should provide 'test' as the module_name + module_name = unquoted_args[i][j + 1 :] + module_name_i_end = module_name_i_start + break_out = True + break + + elif c == "c": + # i.e.: Something as + # python -qc "import sys" + # python -c "import sys" + # python "-qcimport sys" + code_flag = arg_as_str[: j + 1] # code_flag would then be "-qc" + + if not remainder: + # arg_as_str is something as "-qc", "import sys" + code = unquoted_args[i + 1] + code_i_end = i + 2 + else: + # if arg_as_str is something as "-qcimport sys" + code = remainder # code would be "import sys" + code_i_end = i + 1 + code_i = i + break_out = True + break + + else: + break + + if break_out: + break + + else: + # It doesn't start with '-' and we didn't ignore this entry: + # this means that this is the file to be executed. + filename = unquoted_args[i] + + # Note that the filename is not validated here. + # There are cases where even a .exe is valid (xonsh.exe): + # https://github.com/microsoft/debugpy/issues/945 + # So, we should support whatever runpy.run_path + # supports in this case. + + filename_i = i + + if _is_managed_arg(filename): # no need to add pydevd twice + pydev_log.debug("Skipped monkey-patching as pydevd.py is in args already.") + return original_args + + break + else: + # We didn't find the filename (something is unexpected). + pydev_log.debug("Unable to fix arguments to attach debugger on subprocess (filename not found).") + return original_args + + if code_i != -1: + host, port = _get_host_port() + + if port is not None: + new_args = [] + new_args.extend(unquoted_args[:code_i]) + new_args.append(code_flag) + new_args.append(_get_python_c_args(host, port, code, unquoted_args, SetupHolder.setup)) + new_args.extend(unquoted_args[code_i_end:]) + + return quote_args(new_args) + + first_non_vm_index = max(filename_i, module_name_i_start) + if first_non_vm_index == -1: + pydev_log.debug("Unable to fix arguments to attach debugger on subprocess (could not resolve filename nor module name).") + return original_args + + # Original args should be something as: + # ['X:\\pysrc\\pydevd.py', '--multiprocess', '--print-in-debugger-startup', + # '--vm_type', 'python', '--client', '127.0.0.1', '--port', '56352', '--file', 'x:\\snippet1.py'] + from _pydevd_bundle.pydevd_command_line_handling import setup_to_argv + + new_args = [] + new_args.extend(unquoted_args[:first_non_vm_index]) + if before_module_flag: + new_args.append(before_module_flag) + + add_module_at = len(new_args) + 1 + + new_args.extend( + setup_to_argv( + _get_setup_updated_with_protocol_and_ppid(SetupHolder.setup, is_exec=is_exec), skip_names=set(("module", "cmd-line")) + ) + ) + new_args.append("--file") + + if module_name is not None: + assert module_name_i_start != -1 + assert module_name_i_end != -1 + # Always after 'pydevd' (i.e.: pydevd "--module" --multiprocess ...) + new_args.insert(add_module_at, "--module") + new_args.append(module_name) + new_args.extend(unquoted_args[module_name_i_end + 1 :]) + + elif filename is not None: + assert filename_i != -1 + new_args.append(filename) + new_args.extend(unquoted_args[filename_i + 1 :]) + + else: + raise AssertionError("Internal error (unexpected condition)") + + return quote_args(new_args) + except: + pydev_log.exception("Error patching args (debugger not attached to subprocess).") + return original_args + + +def str_to_args_windows(args): + # See https://docs.microsoft.com/en-us/cpp/c-language/parsing-c-command-line-arguments. + # + # Implemetation ported from DebugPlugin.parseArgumentsWindows: + # https://github.com/eclipse/eclipse.platform.debug/blob/master/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java + + result = [] + + DEFAULT = 0 + ARG = 1 + IN_DOUBLE_QUOTE = 2 + + state = DEFAULT + backslashes = 0 + buf = "" + + args_len = len(args) + for i in range(args_len): + ch = args[i] + if ch == "\\": + backslashes += 1 + continue + elif backslashes != 0: + if ch == '"': + while backslashes >= 2: + backslashes -= 2 + buf += "\\" + if backslashes == 1: + if state == DEFAULT: + state = ARG + + buf += '"' + backslashes = 0 + continue + # else fall through to switch + else: + # false alarm, treat passed backslashes literally... + if state == DEFAULT: + state = ARG + + while backslashes > 0: + backslashes -= 1 + buf += "\\" + # fall through to switch + if ch in (" ", "\t"): + if state == DEFAULT: + # skip + continue + elif state == ARG: + state = DEFAULT + result.append(buf) + buf = "" + continue + + if state in (DEFAULT, ARG): + if ch == '"': + state = IN_DOUBLE_QUOTE + else: + state = ARG + buf += ch + + elif state == IN_DOUBLE_QUOTE: + if ch == '"': + if i + 1 < args_len and args[i + 1] == '"': + # Undocumented feature in Windows: + # Two consecutive double quotes inside a double-quoted argument are interpreted as + # a single double quote. + buf += '"' + i += 1 + else: + state = ARG + else: + buf += ch + + else: + raise RuntimeError("Illegal condition") + + if len(buf) > 0 or state != DEFAULT: + result.append(buf) + + return result + + +def patch_arg_str_win(arg_str): + args = str_to_args_windows(arg_str) + # Fix https://youtrack.jetbrains.com/issue/PY-9767 (args may be empty) + if not args or not is_python(args[0]): + return arg_str + arg_str = " ".join(patch_args(args)) + pydev_log.debug("New args: %s", arg_str) + return arg_str + + +def monkey_patch_module(module, funcname, create_func): + if hasattr(module, funcname): + original_name = "original_" + funcname + if not hasattr(module, original_name): + setattr(module, original_name, getattr(module, funcname)) + setattr(module, funcname, create_func(original_name)) + + +def monkey_patch_os(funcname, create_func): + monkey_patch_module(os, funcname, create_func) + + +def warn_multiproc(): + pass # TODO: Provide logging as messages to the IDE. + # pydev_log.error_once( + # "pydev debugger: New process is launching (breakpoints won't work in the new process).\n" + # "pydev debugger: To debug that process please enable 'Attach to subprocess automatically while debugging?' option in the debugger settings.\n") + # + + +def create_warn_multiproc(original_name): + def new_warn_multiproc(*args, **kwargs): + import os + + warn_multiproc() + + return getattr(os, original_name)(*args, **kwargs) + + return new_warn_multiproc + + +def create_execl(original_name): + def new_execl(path, *args): + """ + os.execl(path, arg0, arg1, ...) + os.execle(path, arg0, arg1, ..., env) + os.execlp(file, arg0, arg1, ...) + os.execlpe(file, arg0, arg1, ..., env) + """ + if _get_apply_arg_patching(): + args = patch_args(args, is_exec=True) + send_process_created_message() + send_process_about_to_be_replaced() + + return getattr(os, original_name)(path, *args) + + return new_execl + + +def create_execv(original_name): + def new_execv(path, args): + """ + os.execv(path, args) + os.execvp(file, args) + """ + if _get_apply_arg_patching(): + args = patch_args(args, is_exec=True) + send_process_created_message() + send_process_about_to_be_replaced() + + return getattr(os, original_name)(path, args) + + return new_execv + + +def create_execve(original_name): + """ + os.execve(path, args, env) + os.execvpe(file, args, env) + """ + + def new_execve(path, args, env): + if _get_apply_arg_patching(): + args = patch_args(args, is_exec=True) + send_process_created_message() + send_process_about_to_be_replaced() + + return getattr(os, original_name)(path, args, env) + + return new_execve + + +def create_spawnl(original_name): + def new_spawnl(mode, path, *args): + """ + os.spawnl(mode, path, arg0, arg1, ...) + os.spawnlp(mode, file, arg0, arg1, ...) + """ + if _get_apply_arg_patching(): + args = patch_args(args) + send_process_created_message() + + return getattr(os, original_name)(mode, path, *args) + + return new_spawnl + + +def create_spawnv(original_name): + def new_spawnv(mode, path, args): + """ + os.spawnv(mode, path, args) + os.spawnvp(mode, file, args) + """ + if _get_apply_arg_patching(): + args = patch_args(args) + send_process_created_message() + + return getattr(os, original_name)(mode, path, args) + + return new_spawnv + + +def create_spawnve(original_name): + """ + os.spawnve(mode, path, args, env) + os.spawnvpe(mode, file, args, env) + """ + + def new_spawnve(mode, path, args, env): + if _get_apply_arg_patching(): + args = patch_args(args) + send_process_created_message() + + return getattr(os, original_name)(mode, path, args, env) + + return new_spawnve + + +def create_posix_spawn(original_name): + """ + os.posix_spawn(executable, args, env, **kwargs) + """ + + def new_posix_spawn(executable, args, env, **kwargs): + if _get_apply_arg_patching(): + args = patch_args(args) + send_process_created_message() + + return getattr(os, original_name)(executable, args, env, **kwargs) + + return new_posix_spawn + + +def create_fork_exec(original_name): + """ + _posixsubprocess.fork_exec(args, executable_list, close_fds, ... (13 more)) + """ + + def new_fork_exec(args, *other_args): + import _posixsubprocess # @UnresolvedImport + + if _get_apply_arg_patching(): + args = patch_args(args) + send_process_created_message() + + return getattr(_posixsubprocess, original_name)(args, *other_args) + + return new_fork_exec + + +def create_warn_fork_exec(original_name): + """ + _posixsubprocess.fork_exec(args, executable_list, close_fds, ... (13 more)) + """ + + def new_warn_fork_exec(*args): + try: + import _posixsubprocess + + warn_multiproc() + return getattr(_posixsubprocess, original_name)(*args) + except: + pass + + return new_warn_fork_exec + + +def create_subprocess_fork_exec(original_name): + """ + subprocess._fork_exec(args, executable_list, close_fds, ... (13 more)) + """ + + def new_fork_exec(args, *other_args): + import subprocess + + if _get_apply_arg_patching(): + args = patch_args(args) + send_process_created_message() + + return getattr(subprocess, original_name)(args, *other_args) + + return new_fork_exec + + +def create_subprocess_warn_fork_exec(original_name): + """ + subprocess._fork_exec(args, executable_list, close_fds, ... (13 more)) + """ + + def new_warn_fork_exec(*args): + try: + import subprocess + + warn_multiproc() + return getattr(subprocess, original_name)(*args) + except: + pass + + return new_warn_fork_exec + + +def create_CreateProcess(original_name): + """ + CreateProcess(*args, **kwargs) + """ + + def new_CreateProcess(app_name, cmd_line, *args): + try: + import _subprocess + except ImportError: + import _winapi as _subprocess + + if _get_apply_arg_patching(): + cmd_line = patch_arg_str_win(cmd_line) + send_process_created_message() + + return getattr(_subprocess, original_name)(app_name, cmd_line, *args) + + return new_CreateProcess + + +def create_CreateProcessWarnMultiproc(original_name): + """ + CreateProcess(*args, **kwargs) + """ + + def new_CreateProcess(*args): + try: + import _subprocess + except ImportError: + import _winapi as _subprocess + warn_multiproc() + return getattr(_subprocess, original_name)(*args) + + return new_CreateProcess + + +def create_fork(original_name): + def new_fork(): + # A simple fork will result in a new python process + is_new_python_process = True + frame = sys._getframe() + + apply_arg_patch = _get_apply_arg_patching() + + is_subprocess_fork = False + while frame is not None: + if frame.f_code.co_name == "_execute_child" and "subprocess" in frame.f_code.co_filename: + is_subprocess_fork = True + # If we're actually in subprocess.Popen creating a child, it may + # result in something which is not a Python process, (so, we + # don't want to connect with it in the forked version). + executable = frame.f_locals.get("executable") + if executable is not None: + is_new_python_process = False + if is_python(executable): + is_new_python_process = True + break + + frame = frame.f_back + frame = None # Just make sure we don't hold on to it. + + protocol = pydevd_constants.get_protocol() + debug_mode = PydevdCustomization.DEBUG_MODE + + child_process = getattr(os, original_name)() # fork + if not child_process: + if is_new_python_process: + PydevdCustomization.DEFAULT_PROTOCOL = protocol + PydevdCustomization.DEBUG_MODE = debug_mode + _on_forked_process(setup_tracing=apply_arg_patch and not is_subprocess_fork) + else: + set_global_debugger(None) + else: + if is_new_python_process: + send_process_created_message() + return child_process + + return new_fork + + +def send_process_created_message(): + py_db = get_global_debugger() + if py_db is not None: + py_db.send_process_created_message() + + +def send_process_about_to_be_replaced(): + py_db = get_global_debugger() + if py_db is not None: + py_db.send_process_about_to_be_replaced() + + +def patch_new_process_functions(): + # os.execl(path, arg0, arg1, ...) + # os.execle(path, arg0, arg1, ..., env) + # os.execlp(file, arg0, arg1, ...) + # os.execlpe(file, arg0, arg1, ..., env) + # os.execv(path, args) + # os.execve(path, args, env) + # os.execvp(file, args) + # os.execvpe(file, args, env) + monkey_patch_os("execl", create_execl) + monkey_patch_os("execle", create_execl) + monkey_patch_os("execlp", create_execl) + monkey_patch_os("execlpe", create_execl) + monkey_patch_os("execv", create_execv) + monkey_patch_os("execve", create_execve) + monkey_patch_os("execvp", create_execv) + monkey_patch_os("execvpe", create_execve) + + # os.spawnl(mode, path, ...) + # os.spawnle(mode, path, ..., env) + # os.spawnlp(mode, file, ...) + # os.spawnlpe(mode, file, ..., env) + # os.spawnv(mode, path, args) + # os.spawnve(mode, path, args, env) + # os.spawnvp(mode, file, args) + # os.spawnvpe(mode, file, args, env) + + monkey_patch_os("spawnl", create_spawnl) + monkey_patch_os("spawnle", create_spawnl) + monkey_patch_os("spawnlp", create_spawnl) + monkey_patch_os("spawnlpe", create_spawnl) + monkey_patch_os("spawnv", create_spawnv) + monkey_patch_os("spawnve", create_spawnve) + monkey_patch_os("spawnvp", create_spawnv) + monkey_patch_os("spawnvpe", create_spawnve) + monkey_patch_os("posix_spawn", create_posix_spawn) + + if not IS_JYTHON: + if not IS_WINDOWS: + monkey_patch_os("fork", create_fork) + try: + import _posixsubprocess + + monkey_patch_module(_posixsubprocess, "fork_exec", create_fork_exec) + except ImportError: + pass + + try: + import subprocess + + monkey_patch_module(subprocess, "_fork_exec", create_subprocess_fork_exec) + except AttributeError: + pass + else: + # Windows + try: + import _subprocess + except ImportError: + import _winapi as _subprocess + monkey_patch_module(_subprocess, "CreateProcess", create_CreateProcess) + + +def patch_new_process_functions_with_warning(): + monkey_patch_os("execl", create_warn_multiproc) + monkey_patch_os("execle", create_warn_multiproc) + monkey_patch_os("execlp", create_warn_multiproc) + monkey_patch_os("execlpe", create_warn_multiproc) + monkey_patch_os("execv", create_warn_multiproc) + monkey_patch_os("execve", create_warn_multiproc) + monkey_patch_os("execvp", create_warn_multiproc) + monkey_patch_os("execvpe", create_warn_multiproc) + monkey_patch_os("spawnl", create_warn_multiproc) + monkey_patch_os("spawnle", create_warn_multiproc) + monkey_patch_os("spawnlp", create_warn_multiproc) + monkey_patch_os("spawnlpe", create_warn_multiproc) + monkey_patch_os("spawnv", create_warn_multiproc) + monkey_patch_os("spawnve", create_warn_multiproc) + monkey_patch_os("spawnvp", create_warn_multiproc) + monkey_patch_os("spawnvpe", create_warn_multiproc) + monkey_patch_os("posix_spawn", create_warn_multiproc) + + if not IS_JYTHON: + if not IS_WINDOWS: + monkey_patch_os("fork", create_warn_multiproc) + try: + import _posixsubprocess + + monkey_patch_module(_posixsubprocess, "fork_exec", create_warn_fork_exec) + except ImportError: + pass + + try: + import subprocess + + monkey_patch_module(subprocess, "_fork_exec", create_subprocess_warn_fork_exec) + except AttributeError: + pass + + else: + # Windows + try: + import _subprocess + except ImportError: + import _winapi as _subprocess + monkey_patch_module(_subprocess, "CreateProcess", create_CreateProcessWarnMultiproc) + + +class _NewThreadStartupWithTrace: + def __init__(self, original_func, args, kwargs): + self.original_func = original_func + self.args = args + self.kwargs = kwargs + + def __call__(self): + # We monkey-patch the thread creation so that this function is called in the new thread. At this point + # we notify of its creation and start tracing it. + py_db = get_global_debugger() + + thread_id = None + if py_db is not None: + # Note: if this is a thread from threading.py, we're too early in the boostrap process (because we mocked + # the start_new_thread internal machinery and thread._bootstrap has not finished), so, the code below needs + # to make sure that we use the current thread bound to the original function and not use + # threading.current_thread() unless we're sure it's a dummy thread. + t = getattr(self.original_func, "__self__", getattr(self.original_func, "im_self", None)) + if not isinstance(t, threading.Thread): + # This is not a threading.Thread but a Dummy thread (so, get it as a dummy thread using + # currentThread). + t = threading.current_thread() + + if not getattr(t, "is_pydev_daemon_thread", False): + thread_id = get_current_thread_id(t) + py_db.notify_thread_created(thread_id, t) + _on_set_trace_for_new_thread(py_db) + + if getattr(py_db, "thread_analyser", None) is not None: + try: + from _pydevd_bundle.pydevd_concurrency_analyser.pydevd_concurrency_logger import log_new_thread + + log_new_thread(py_db, t) + except: + sys.stderr.write("Failed to detect new thread for visualization") + try: + ret = self.original_func(*self.args, **self.kwargs) + finally: + if thread_id is not None: + if py_db is not None: + # At thread shutdown we only have pydevd-related code running (which shouldn't + # be tracked). + py_db.disable_tracing() + py_db.notify_thread_not_alive(thread_id) + + return ret + + +class _NewThreadStartupWithoutTrace: + def __init__(self, original_func, args, kwargs): + self.original_func = original_func + self.args = args + self.kwargs = kwargs + + def __call__(self): + return self.original_func(*self.args, **self.kwargs) + + +_UseNewThreadStartup = _NewThreadStartupWithTrace + + +def _get_threading_modules_to_patch(): + threading_modules_to_patch = [] + + try: + import thread as _thread + except: + import _thread + threading_modules_to_patch.append(_thread) + threading_modules_to_patch.append(threading) + + return threading_modules_to_patch + + +threading_modules_to_patch = _get_threading_modules_to_patch() + + +def patch_thread_module(thread_module): + # Note: this is needed not just for the tracing, but to have an early way to + # notify that a thread was created (i.e.: tests_python.test_debugger_json.test_case_started_exited_threads_protocol) + start_thread_attrs = ["_start_new_thread", "start_new_thread", "start_new"] + start_joinable_attrs = ["start_joinable_thread", "_start_joinable_thread"] + check = start_thread_attrs + start_joinable_attrs + + replace_attrs = [] + for attr in check: + if hasattr(thread_module, attr): + replace_attrs.append(attr) + + if not replace_attrs: + return + + for attr in replace_attrs: + if attr in start_joinable_attrs: + if getattr(thread_module, "_original_start_joinable_thread", None) is None: + _original_start_joinable_thread = thread_module._original_start_joinable_thread = getattr(thread_module, attr) + else: + _original_start_joinable_thread = thread_module._original_start_joinable_thread + else: + if getattr(thread_module, "_original_start_new_thread", None) is None: + _original_start_new_thread = thread_module._original_start_new_thread = getattr(thread_module, attr) + else: + _original_start_new_thread = thread_module._original_start_new_thread + + class ClassWithPydevStartNewThread: + def pydev_start_new_thread(self, function, args=(), kwargs={}): + """ + We need to replace the original thread_module.start_new_thread with this function so that threads started + through it and not through the threading module are properly traced. + """ + return _original_start_new_thread(_UseNewThreadStartup(function, args, kwargs), ()) + + class ClassWithPydevStartJoinableThread: + def pydev_start_joinable_thread(self, function, *args, **kwargs): + """ + We need to replace the original thread_module._start_joinable_thread with this function so that threads started + through it and not through the threading module are properly traced. + """ + # Note: only handling the case from threading.py where the handle + # and daemon flags are passed explicitly. This will fail if some user library + # actually passes those without being a keyword argument! + handle = kwargs.pop("handle", None) + daemon = kwargs.pop("daemon", True) + return _original_start_joinable_thread(_UseNewThreadStartup(function, args, kwargs), handle=handle, daemon=daemon) + + # This is a hack for the situation where the thread_module.start_new_thread is declared inside a class, such as the one below + # class F(object): + # start_new_thread = thread_module.start_new_thread + # + # def start_it(self): + # self.start_new_thread(self.function, args, kwargs) + # So, if it's an already bound method, calling self.start_new_thread won't really receive a different 'self' -- it + # does work in the default case because in builtins self isn't passed either. + pydev_start_new_thread = ClassWithPydevStartNewThread().pydev_start_new_thread + pydev_start_joinable_thread = ClassWithPydevStartJoinableThread().pydev_start_joinable_thread + + # We need to replace the original thread_module.start_new_thread with this function so that threads started through + # it and not through the threading module are properly traced. + for attr in replace_attrs: + if attr in start_joinable_attrs: + setattr(thread_module, attr, pydev_start_joinable_thread) + else: + setattr(thread_module, attr, pydev_start_new_thread) + + +def patch_thread_modules(): + for t in threading_modules_to_patch: + patch_thread_module(t) + + +def undo_patch_thread_modules(): + for t in threading_modules_to_patch: + try: + t.start_new_thread = t._original_start_new_thread + except: + pass + + try: + t.start_new = t._original_start_new_thread + except: + pass + + try: + t._start_new_thread = t._original_start_new_thread + except: + pass + + try: + t._start_joinable_thread = t._original_start_joinable_thread + except: + pass + + try: + t.start_joinable_thread = t._original_start_joinable_thread + except: + pass + + +def disable_trace_thread_modules(): + """ + Can be used to temporarily stop tracing threads created with thread.start_new_thread. + """ + global _UseNewThreadStartup + _UseNewThreadStartup = _NewThreadStartupWithoutTrace + + +def enable_trace_thread_modules(): + """ + Can be used to start tracing threads created with thread.start_new_thread again. + """ + global _UseNewThreadStartup + _UseNewThreadStartup = _NewThreadStartupWithTrace + + +def get_original_start_new_thread(threading_module): + try: + return threading_module._original_start_new_thread + except: + return threading_module.start_new_thread diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey_qt.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey_qt.py new file mode 100644 index 0000000..5864e3c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey_qt.py @@ -0,0 +1,220 @@ +from __future__ import nested_scopes + +from _pydev_bundle._pydev_saved_modules import threading +import os +from _pydev_bundle import pydev_log + + +def set_trace_in_qt(): + from _pydevd_bundle.pydevd_comm import get_global_debugger + + py_db = get_global_debugger() + if py_db is not None: + threading.current_thread() # Create the dummy thread for qt. + py_db.enable_tracing() + + +_patched_qt = False + + +def patch_qt(qt_support_mode): + """ + This method patches qt (PySide2, PySide, PyQt4, PyQt5) so that we have hooks to set the tracing for QThread. + """ + if not qt_support_mode: + return + + if qt_support_mode is True or qt_support_mode == "True": + # do not break backward compatibility + qt_support_mode = "auto" + + if qt_support_mode == "auto": + qt_support_mode = os.getenv("PYDEVD_PYQT_MODE", "auto") + + # Avoid patching more than once + global _patched_qt + if _patched_qt: + return + + pydev_log.debug("Qt support mode: %s", qt_support_mode) + + _patched_qt = True + + if qt_support_mode == "auto": + patch_qt_on_import = None + try: + import PySide2 # @UnresolvedImport @UnusedImport + + qt_support_mode = "pyside2" + except: + try: + import Pyside # @UnresolvedImport @UnusedImport + + qt_support_mode = "pyside" + except: + try: + import PyQt5 # @UnresolvedImport @UnusedImport + + qt_support_mode = "pyqt5" + except: + try: + import PyQt4 # @UnresolvedImport @UnusedImport + + qt_support_mode = "pyqt4" + except: + return + + if qt_support_mode == "pyside2": + try: + import PySide2.QtCore # @UnresolvedImport + + _internal_patch_qt(PySide2.QtCore, qt_support_mode) + except: + return + + elif qt_support_mode == "pyside": + try: + import PySide.QtCore # @UnresolvedImport + + _internal_patch_qt(PySide.QtCore, qt_support_mode) + except: + return + + elif qt_support_mode == "pyqt5": + try: + import PyQt5.QtCore # @UnresolvedImport + + _internal_patch_qt(PyQt5.QtCore) + except: + return + + elif qt_support_mode == "pyqt4": + # Ok, we have an issue here: + # PyDev-452: Selecting PyQT API version using sip.setapi fails in debug mode + # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html + # Mostly, if the user uses a different API version (i.e.: v2 instead of v1), + # that has to be done before importing PyQt4 modules (PySide/PyQt5 don't have this issue + # as they only implements v2). + patch_qt_on_import = "PyQt4" + + def get_qt_core_module(): + import PyQt4.QtCore # @UnresolvedImport + + return PyQt4.QtCore + + _patch_import_to_patch_pyqt_on_import(patch_qt_on_import, get_qt_core_module) + + else: + raise ValueError("Unexpected qt support mode: %s" % (qt_support_mode,)) + + +def _patch_import_to_patch_pyqt_on_import(patch_qt_on_import, get_qt_core_module): + # I don't like this approach very much as we have to patch __import__, but I like even less + # asking the user to configure something in the client side... + # So, our approach is to patch PyQt4 right before the user tries to import it (at which + # point he should've set the sip api version properly already anyways). + + pydev_log.debug("Setting up Qt post-import monkeypatch.") + + dotted = patch_qt_on_import + "." + original_import = __import__ + + from _pydev_bundle._pydev_sys_patch import patch_sys_module, patch_reload, cancel_patches_in_sys_module + + patch_sys_module() + patch_reload() + + def patched_import(name, *args, **kwargs): + if patch_qt_on_import == name or name.startswith(dotted): + builtins.__import__ = original_import + cancel_patches_in_sys_module() + _internal_patch_qt(get_qt_core_module()) # Patch it only when the user would import the qt module + return original_import(name, *args, **kwargs) + + import builtins # Py3 + + builtins.__import__ = patched_import + + +def _internal_patch_qt(QtCore, qt_support_mode="auto"): + pydev_log.debug("Patching Qt: %s", QtCore) + + _original_thread_init = QtCore.QThread.__init__ + _original_runnable_init = QtCore.QRunnable.__init__ + _original_QThread = QtCore.QThread + + class FuncWrapper: + def __init__(self, original): + self._original = original + + def __call__(self, *args, **kwargs): + set_trace_in_qt() + return self._original(*args, **kwargs) + + class StartedSignalWrapper(QtCore.QObject): # Wrapper for the QThread.started signal + try: + _signal = QtCore.Signal() # @UndefinedVariable + except: + _signal = QtCore.pyqtSignal() # @UndefinedVariable + + def __init__(self, thread, original_started): + QtCore.QObject.__init__(self) + self.thread = thread + self.original_started = original_started + if qt_support_mode in ("pyside", "pyside2"): + self._signal = original_started + else: + self._signal.connect(self._on_call) + self.original_started.connect(self._signal) + + def connect(self, func, *args, **kwargs): + if qt_support_mode in ("pyside", "pyside2"): + return self._signal.connect(FuncWrapper(func), *args, **kwargs) + else: + return self._signal.connect(func, *args, **kwargs) + + def disconnect(self, *args, **kwargs): + return self._signal.disconnect(*args, **kwargs) + + def emit(self, *args, **kwargs): + return self._signal.emit(*args, **kwargs) + + def _on_call(self, *args, **kwargs): + set_trace_in_qt() + + class ThreadWrapper(QtCore.QThread): # Wrapper for QThread + def __init__(self, *args, **kwargs): + _original_thread_init(self, *args, **kwargs) + + # In PyQt5 the program hangs when we try to call original run method of QThread class. + # So we need to distinguish instances of QThread class and instances of QThread inheritors. + if self.__class__.run == _original_QThread.run: + self.run = self._exec_run + else: + self._original_run = self.run + self.run = self._new_run + self._original_started = self.started + self.started = StartedSignalWrapper(self, self.started) + + def _exec_run(self): + set_trace_in_qt() + self.exec_() + return None + + def _new_run(self): + set_trace_in_qt() + return self._original_run() + + class RunnableWrapper(QtCore.QRunnable): # Wrapper for QRunnable + def __init__(self, *args, **kwargs): + _original_runnable_init(self, *args, **kwargs) + + self._original_run = self.run + self.run = self._new_run + + def _new_run(self): + set_trace_in_qt() + return self._original_run() + + QtCore.QThread = ThreadWrapper + QtCore.QRunnable = RunnableWrapper diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_override.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_override.py new file mode 100644 index 0000000..ecf377e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_override.py @@ -0,0 +1,37 @@ +def overrides(method): + """ + Meant to be used as + + class B: + @overrides(A.m1) + def m1(self): + pass + """ + + def wrapper(func): + if func.__name__ != method.__name__: + msg = "Wrong @override: %r expected, but overwriting %r." + msg = msg % (func.__name__, method.__name__) + raise AssertionError(msg) + + if func.__doc__ is None: + func.__doc__ = method.__doc__ + + return func + + return wrapper + + +def implements(method): + def wrapper(func): + if func.__name__ != method.__name__: + msg = "Wrong @implements: %r expected, but implementing %r." + msg = msg % (func.__name__, method.__name__) + raise AssertionError(msg) + + if func.__doc__ is None: + func.__doc__ = method.__doc__ + + return func + + return wrapper diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_umd.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_umd.py new file mode 100644 index 0000000..d830491 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_umd.py @@ -0,0 +1,181 @@ +""" +The UserModuleDeleter and runfile methods are copied from +Spyder and carry their own license agreement. +http://code.google.com/p/spyderlib/source/browse/spyderlib/widgets/externalshell/sitecustomize.py + +Spyder License Agreement (MIT License) +-------------------------------------- + +Copyright (c) 2009-2012 Pierre Raybaut + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +""" + +import sys +import os +from _pydev_bundle._pydev_execfile import execfile + + +# The following classes and functions are mainly intended to be used from +# an interactive Python session +class UserModuleDeleter: + """ + User Module Deleter (UMD) aims at deleting user modules + to force Python to deeply reload them during import + + pathlist [list]: ignore list in terms of module path + namelist [list]: ignore list in terms of module name + """ + + def __init__(self, namelist=None, pathlist=None): + if namelist is None: + namelist = [] + self.namelist = namelist + if pathlist is None: + pathlist = [] + self.pathlist = pathlist + try: + # ignore all files in org.python.pydev/pysrc + import pydev_pysrc, inspect + + self.pathlist.append(os.path.dirname(pydev_pysrc.__file__)) + except: + pass + self.previous_modules = list(sys.modules.keys()) + + def is_module_ignored(self, modname, modpath): + for path in [sys.prefix] + self.pathlist: + if modpath.startswith(path): + return True + else: + return set(modname.split(".")) & set(self.namelist) + + def run(self, verbose=False): + """ + Del user modules to force Python to deeply reload them + + Do not del modules which are considered as system modules, i.e. + modules installed in subdirectories of Python interpreter's binary + Do not del C modules + """ + log = [] + modules_copy = dict(sys.modules) + for modname, module in modules_copy.items(): + if modname == "aaaaa": + print(modname, module) + print(self.previous_modules) + if modname not in self.previous_modules: + modpath = getattr(module, "__file__", None) + if modpath is None: + # *module* is a C module that is statically linked into the + # interpreter. There is no way to know its path, so we + # choose to ignore it. + continue + if not self.is_module_ignored(modname, modpath): + log.append(modname) + del sys.modules[modname] + if verbose and log: + print("\x1b[4;33m%s\x1b[24m%s\x1b[0m" % ("UMD has deleted", ": " + ", ".join(log))) + + +__umd__ = None + +_get_globals_callback = None + + +def _set_globals_function(get_globals): + global _get_globals_callback + _get_globals_callback = get_globals + + +def _get_globals(): + """Return current Python interpreter globals namespace""" + if _get_globals_callback is not None: + return _get_globals_callback() + else: + try: + from __main__ import __dict__ as namespace + except ImportError: + try: + # The import fails on IronPython + import __main__ + + namespace = __main__.__dict__ + except: + namespace + shell = namespace.get("__ipythonshell__") + if shell is not None and hasattr(shell, "user_ns"): + # IPython 0.12+ kernel + return shell.user_ns + else: + # Python interpreter + return namespace + return namespace + + +def runfile(filename, args=None, wdir=None, namespace=None): + """ + Run filename + args: command line arguments (string) + wdir: working directory + """ + try: + if hasattr(filename, "decode"): + filename = filename.decode("utf-8") + except (UnicodeError, TypeError): + pass + global __umd__ + if os.environ.get("PYDEV_UMD_ENABLED", "").lower() == "true": + if __umd__ is None: + namelist = os.environ.get("PYDEV_UMD_NAMELIST", None) + if namelist is not None: + namelist = namelist.split(",") + __umd__ = UserModuleDeleter(namelist=namelist) + else: + verbose = os.environ.get("PYDEV_UMD_VERBOSE", "").lower() == "true" + __umd__.run(verbose=verbose) + if args is not None and not isinstance(args, (bytes, str)): + raise TypeError("expected a character buffer object") + if namespace is None: + namespace = _get_globals() + if "__file__" in namespace: + old_file = namespace["__file__"] + else: + old_file = None + namespace["__file__"] = filename + sys.argv = [filename] + if args is not None: + for arg in args.split(): + sys.argv.append(arg) + if wdir is not None: + try: + if hasattr(wdir, "decode"): + wdir = wdir.decode("utf-8") + except (UnicodeError, TypeError): + pass + os.chdir(wdir) + execfile(filename, namespace) + sys.argv = [""] + if old_file is None: + del namespace["__file__"] + else: + namespace["__file__"] = old_file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_versioncheck.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_versioncheck.py new file mode 100644 index 0000000..fb7372d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_versioncheck.py @@ -0,0 +1,16 @@ +import sys + + +def versionok_for_gui(): + """Return True if running Python is suitable for GUI Event Integration and deeper IPython integration""" + # We require Python 2.6+ ... + if sys.hexversion < 0x02060000: + return False + # Or Python 3.2+ + if sys.hexversion >= 0x03000000 and sys.hexversion < 0x03020000: + return False + # Not supported under Jython nor IronPython + if sys.platform.startswith("java") or sys.platform.startswith("cli"): + return False + + return True diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e783518cbf1ebaef52b9497e02e2fd1e2e26d6d GIT binary patch literal 231 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_nose.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_nose.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20663e1b3e808d4caa0b265adf204bee4ffc9166 GIT binary patch literal 8641 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_parallel_client.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_parallel_client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ce4a67d4d265767449c1321bceb27986fa79d3a GIT binary patch literal 7855 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 JbhGjb`7c>YYNh}H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_pytest2.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_pytest2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a552732425d6f6605de626617897095dc69ba884 GIT binary patch literal 10132 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_xml_rpc.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/__pycache__/pydev_runfiles_xml_rpc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bea77ade3ec751a57322f625f8af2bad0709cb9d GIT binary patch literal 9494 zcmd5iZEO=~n(x?Sdty6rLL4U{kW7G(7(&cPOChB!ArvSqVYdVd*=whcXF_cJweL&- zr_OGALZ|eORa2=eTJ4?6YI|BZ&>jD_((R9a{J84wkKH6|-)v5|t7E0Re<_Ky6~FFz z-tml`)PdegSM96#nRnjzc|V`;XYy~gwQd6CUlSKDe}4xd|AjARag-{{-{lCoMPwp# zaWY~&xe<=N+eU2cX&IQ>ndYH{Lk{c#eCe&XGDBIYDIC4I&HoY)0dVPp-K^M(SCQ8+trS zgE@L+18em{Yi&hqBWtaLR$oP{pS9LQYlFhY;C9v)Yu13=DsQ;KjWo-RuyTv+2iPh% z0o*7D0Jh1^05{1k05@m2;Ku*KsfL1_-gH^f#-edW&8V7^P?C|998F#h+H|M%!wF?V z(QB?J;xrwJM@IphADW2Ab!YT)GDVfij^S}dgl^~)6DfHju82`pOpU6kxS}b2J0g|) z1roBd?1#rKq7Wn?5RU`G*+%$`Eoj$krE?0ss?d|ExUA60Lv9huNhO|EsHmnyZ9J@r z*A!7sCA&3oJbYCVwUjuaDq>i?98ZmgJ=@O z4y9=-rf366H98tsLWzu$yc&Y52&FUHcq+NCZ_nP48r76t>2Tyq__CsgWMy>Xayk=| zt}00xE>H$kS-C2QB=(f(M3RxhXtrJ@xMB%N(3j588rT{G$iZqIfE(mXo6R9C38Zer zo5yLri4ZX_92$US2|@l{-U#3p$r25oMv*MM47tk<1#QL}I5iO538x2wsE8!e27tO- zRW!+HrcKb$2|pEuc$yU3I&Yj=;9J-(s#723tCIS_kU)Qce8wK+b^rImG#rmB@u8F! z9g9Z7S~Qi6;MUDz9Yur|I0}~~lG#VHHh8Nz5N(96yTHr|1!yAce3)KVfzfzXiH}jd z4B7@j#RY)Xi~|DKM3YfXk|sA-+fAR@9mJ7%-*E82rWyXGr|55);eS$N9N*doU|5^p z3om&8F?g;m&|15HR*aHlWQW=z)rgxHrfn;KbHt zfpcs(5D}+38z6p}4L~E=boc3KJZ{MUP|&`1A8S@erlSa+fuD+o;sz=5g0U>NS6_BF z^puyCxia_3cBngK9-vcp0CdStfI`L<6m+k#t>fWHSXLsHM6w9Gfz7;{8#4ysK#Urb z73{1UniV7sNlCi^s5noF|JapJHdQWZvD_iVEy>!}{WJW6AhIK`5_Tsbx!|`v1YkX8 zi&e@L;9=2BgA0Z>%bDivUWt)8k|9CcknU$^$qXy1rVge+RwJ4s-?g)I=|AxoYV&>v&{PosFsuEm8EG z7N#0*dYyyr!Gl(#s5S5;U{F-IPdLIqK=&?yo7po3b}@#UU`>gk2eGDTsP0*LlH9w?+z@o?&Tu*nUX0!#F`rS9 zqGM80QDjBd9n2areL&GhGDQ&N4Q+>tKo^qAH3?0zZb!&N8(3e%{L+2!Hrc!mBb|m$ z^$Y+Imd2(Tq1f2`h;TK}%nTO2{|7oFe(z9@iSgt=NI!dHAWQ)zKhwj^`dZ zImhc9!XGdgF4dQv4#x$Kt8&L>7A>SOmy=g#graNya4yY@`F z#x*V79|}F@`eA@z1wvlEMjNL}7^5QHIn1ieLhHhqsSuIY5W5(Qj7}uwxI$mRHb1)a zk`Y=NassnZylRLxm}9NiLi{CJ8>1K;1)XKbK{ONno98DaX31{3t!!>Ml5E4dGz_>{i6JYmDdsJ%T9cy!n4MKpJj>nm z2l=7l;~kk4vtgSGb08rud#J{s>lqrEK@uWfFMsZf75Sd$(!fOO2cH-DVv6o6f0$B*UYAhT!Uu$ zRhWZ-=&58VD{w6nTW*VCEVrgSN&SGBZPzdqX2slPdA@S)-2yTW)eL;i0{AwvvB#1bAsPdOE(JHC(ENaiOoUeG;8x=tEAd*+Pp0Brzf63v0( zs-4B!_W(d9;U%my3)%&>)w!Mq%=ARV@#rMjX=ah>2q66w5kCMhO%`4Lf~zg>YRkE{ z7CpY4r)_ad_baD`;LFke?B(Xa~@l|7QL+nZ&%*i zRq*c2dv`8)cda8<_p2qI14OjrZF!;XH^Sz}EbsDZZQs!s$fqv^2Ak}w5&@{Om$*+vbeh4%#QUhWOUF?bUhv36N8i1-n20Bf+tJ<&d;uU{O7p24uH^dZU~W6+RJ zK^%8(-vg9V-dJx7O-v+Sg@=RxozJ?k8 zX~Oit|3F*t9$JsmDsJzucON3Z4h;BLOOq8($%a7zXcWk%o6#CEJxtnFHYU}=a0t$E zr8Pz7WScpIDNpB!R=JX8Fibo;1UzO*1h!TJDLlpCWdINj_iHwISRmP~2j)NPgyGoUyn_@OVw?n$76j&XNCc`wN zJB_>q_>UQ2C0blsov{Iq}S#Zzv}WJ*;V*9sJv-`I-*!o@#=NjhhOM zTl0-uZx813$on2xh#rkdll%A#00F8my9u~KP8Qc1aAOkL>}$HLKguc%O(qN@9_&&Pk~W z4bs_w%bsGS)Gm(ER6+z6g7!aY9IRM5?*CiwmejizO@MkIi>L4-YE&C%nm##^7=@3k zsWDLn`G7b{RN~>Zs>p1ELsSC7Kt7_Zw3%>VijI~ww^QeFtnM>!sC09B9lKjF)=Bt! zs;TsK92W)vN*;FewLAu!7eNtz>fZyHCMz3=&{X!ogu34`C#uS7ZLMvnY+bTB!I#>&^Um41jfZA@i>*8E9G+|KpQ(EYs|lO(!lr`Iofo?A z@OM%l{pfQocm7iD2bh+|_-Cyb=7F8w>mS%oKG_}^IK0|ySPsI6fK+x6p6VF<898Ag z*m(uHIo++Lv~XNvG(-hZ%G@$M1b>8|<%2clJe@hd6X274u>E=O{s)s!@WJS-FlhvS zRiR44aJDh}frBQ7a9F&AOFiY#|0zWNYYA4&Cwu@sG% zk%ff$1v&v3c9>FahYExjd_#fXoaZ+e_&s@kPk}#_=MVjQfZLg<(+nb!R1<}g#u~Lljiq?+?K)Ii?7U+i@$H~oonvP5&s{( z4sOGj1i+&J$8A}ub8_3?+rL8KvC_hEHM4;g0*{rtChh_^3my1e*?*90o^35Obmkj6 nR|vc;|A?#S+8^~g0kqTt5Ivml(Uw-I9fr1LnCi6gIpBW*w{>A$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles.py new file mode 100644 index 0000000..5d49d18 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles.py @@ -0,0 +1,884 @@ +from __future__ import nested_scopes + +import fnmatch +import os.path +from _pydev_runfiles.pydev_runfiles_coverage import start_coverage_support +from _pydevd_bundle.pydevd_constants import * # @UnusedWildImport +import re +import time +import json + + +# ======================================================================================================================= +# Configuration +# ======================================================================================================================= +class Configuration: + def __init__( + self, + files_or_dirs="", + verbosity=2, + include_tests=None, + tests=None, + port=None, + files_to_tests=None, + jobs=1, + split_jobs="tests", + coverage_output_dir=None, + coverage_include=None, + coverage_output_file=None, + exclude_files=None, + exclude_tests=None, + include_files=None, + django=False, + ): + self.files_or_dirs = files_or_dirs + self.verbosity = verbosity + self.include_tests = include_tests + self.tests = tests + self.port = port + self.files_to_tests = files_to_tests + self.jobs = jobs + self.split_jobs = split_jobs + self.django = django + + if include_tests: + assert isinstance(include_tests, (list, tuple)) + + if exclude_files: + assert isinstance(exclude_files, (list, tuple)) + + if exclude_tests: + assert isinstance(exclude_tests, (list, tuple)) + + self.exclude_files = exclude_files + self.include_files = include_files + self.exclude_tests = exclude_tests + + self.coverage_output_dir = coverage_output_dir + self.coverage_include = coverage_include + self.coverage_output_file = coverage_output_file + + def __str__(self): + return """Configuration + - files_or_dirs: %s + - verbosity: %s + - tests: %s + - port: %s + - files_to_tests: %s + - jobs: %s + - split_jobs: %s + + - include_files: %s + - include_tests: %s + + - exclude_files: %s + - exclude_tests: %s + + - coverage_output_dir: %s + - coverage_include_dir: %s + - coverage_output_file: %s + + - django: %s +""" % ( + self.files_or_dirs, + self.verbosity, + self.tests, + self.port, + self.files_to_tests, + self.jobs, + self.split_jobs, + self.include_files, + self.include_tests, + self.exclude_files, + self.exclude_tests, + self.coverage_output_dir, + self.coverage_include, + self.coverage_output_file, + self.django, + ) + + +# ======================================================================================================================= +# parse_cmdline +# ======================================================================================================================= +def parse_cmdline(argv=None): + """ + Parses command line and returns test directories, verbosity, test filter and test suites + + usage: + runfiles.py -v|--verbosity -t|--tests dirs|files + + Multiprocessing options: + jobs=number (with the number of jobs to be used to run the tests) + split_jobs='module'|'tests' + if == module, a given job will always receive all the tests from a module + if == tests, the tests will be split independently of their originating module (default) + + --exclude_files = comma-separated list of patterns with files to exclude (fnmatch style) + --include_files = comma-separated list of patterns with files to include (fnmatch style) + --exclude_tests = comma-separated list of patterns with test names to exclude (fnmatch style) + + Note: if --tests is given, --exclude_files, --include_files and --exclude_tests are ignored! + """ + if argv is None: + argv = sys.argv + + verbosity = 2 + include_tests = None + tests = None + port = None + jobs = 1 + split_jobs = "tests" + files_to_tests = {} + coverage_output_dir = None + coverage_include = None + exclude_files = None + exclude_tests = None + include_files = None + django = False + + from _pydev_bundle._pydev_getopt import gnu_getopt + + optlist, dirs = gnu_getopt( + argv[1:], + "", + [ + "verbosity=", + "tests=", + "port=", + "config_file=", + "jobs=", + "split_jobs=", + "include_tests=", + "include_files=", + "exclude_files=", + "exclude_tests=", + "coverage_output_dir=", + "coverage_include=", + "django=", + ], + ) + + for opt, value in optlist: + if opt in ("-v", "--verbosity"): + verbosity = value + + elif opt in ("-p", "--port"): + port = int(value) + + elif opt in ("-j", "--jobs"): + jobs = int(value) + + elif opt in ("-s", "--split_jobs"): + split_jobs = value + if split_jobs not in ("module", "tests"): + raise AssertionError('Expected split to be either "module" or "tests". Was :%s' % (split_jobs,)) + + elif opt in ( + "-d", + "--coverage_output_dir", + ): + coverage_output_dir = value.strip() + + elif opt in ( + "-i", + "--coverage_include", + ): + coverage_include = value.strip() + + elif opt in ("-I", "--include_tests"): + include_tests = value.split(",") + + elif opt in ("-E", "--exclude_files"): + exclude_files = value.split(",") + + elif opt in ("-F", "--include_files"): + include_files = value.split(",") + + elif opt in ("-e", "--exclude_tests"): + exclude_tests = value.split(",") + + elif opt in ("-t", "--tests"): + tests = value.split(",") + + elif opt in ("--django",): + django = value.strip() in ["true", "True", "1"] + + elif opt in ("-c", "--config_file"): + config_file = value.strip() + if os.path.exists(config_file): + f = open(config_file, "r") + try: + config_file_contents = f.read() + finally: + f.close() + + if config_file_contents: + config_file_contents = config_file_contents.strip() + + if config_file_contents: + for line in config_file_contents.splitlines(): + file_and_test = line.split("|") + if len(file_and_test) == 2: + file, test = file_and_test + if file in files_to_tests: + files_to_tests[file].append(test) + else: + files_to_tests[file] = [test] + + else: + sys.stderr.write("Could not find config file: %s\n" % (config_file,)) + + filter_tests_env_var = os.environ.get("PYDEV_RUNFILES_FILTER_TESTS", None) + if filter_tests_env_var: + loaded = json.loads(filter_tests_env_var) + include = loaded["include"] + for path, name in include: + existing = files_to_tests.get(path) + if not existing: + existing = files_to_tests[path] = [] + existing.append(name) + # Note: at this point exclude or `*` is not handled. + # Clients need to do all the filtering on their side (could + # change to have `exclude` and support `*` entries). + + if type([]) != type(dirs): + dirs = [dirs] + + ret_dirs = [] + for d in dirs: + if "|" in d: + # paths may come from the ide separated by | + ret_dirs.extend(d.split("|")) + else: + ret_dirs.append(d) + + verbosity = int(verbosity) + + if tests: + if verbosity > 4: + sys.stdout.write("--tests provided. Ignoring --exclude_files, --exclude_tests and --include_files\n") + exclude_files = exclude_tests = include_files = None + + config = Configuration( + ret_dirs, + verbosity, + include_tests, + tests, + port, + files_to_tests, + jobs, + split_jobs, + coverage_output_dir, + coverage_include, + exclude_files=exclude_files, + exclude_tests=exclude_tests, + include_files=include_files, + django=django, + ) + + if verbosity > 5: + sys.stdout.write(str(config) + "\n") + return config + + +# ======================================================================================================================= +# PydevTestRunner +# ======================================================================================================================= +class PydevTestRunner(object): + """finds and runs a file or directory of files as a unit test""" + + __py_extensions = ["*.py", "*.pyw"] + __exclude_files = ["__init__.*"] + + # Just to check that only this attributes will be written to this file + __slots__ = [ + "verbosity", # Always used + "files_to_tests", # If this one is given, the ones below are not used + "files_or_dirs", # Files or directories received in the command line + "include_tests", # The filter used to collect the tests + "tests", # Strings with the tests to be run + "jobs", # Integer with the number of jobs that should be used to run the test cases + "split_jobs", # String with 'tests' or 'module' (how should the jobs be split) + "configuration", + "coverage", + ] + + def __init__(self, configuration): + self.verbosity = configuration.verbosity + + self.jobs = configuration.jobs + self.split_jobs = configuration.split_jobs + + files_to_tests = configuration.files_to_tests + if files_to_tests: + self.files_to_tests = files_to_tests + self.files_or_dirs = list(files_to_tests.keys()) + self.tests = None + else: + self.files_to_tests = {} + self.files_or_dirs = configuration.files_or_dirs + self.tests = configuration.tests + + self.configuration = configuration + self.__adjust_path() + + def __adjust_path(self): + """add the current file or directory to the python path""" + path_to_append = None + for n in range(len(self.files_or_dirs)): + dir_name = self.__unixify(self.files_or_dirs[n]) + if os.path.isdir(dir_name): + if not dir_name.endswith("/"): + self.files_or_dirs[n] = dir_name + "/" + path_to_append = os.path.normpath(dir_name) + elif os.path.isfile(dir_name): + path_to_append = os.path.dirname(dir_name) + else: + if not os.path.exists(dir_name): + block_line = "*" * 120 + sys.stderr.write("\n%s\n* PyDev test runner error: %s does not exist.\n%s\n" % (block_line, dir_name, block_line)) + return + msg = "unknown type. \n%s\nshould be file or a directory.\n" % (dir_name) + raise RuntimeError(msg) + if path_to_append is not None: + # Add it as the last one (so, first things are resolved against the default dirs and + # if none resolves, then we try a relative import). + sys.path.append(path_to_append) + + def __is_valid_py_file(self, fname): + """tests that a particular file contains the proper file extension + and is not in the list of files to exclude""" + is_valid_fname = 0 + for invalid_fname in self.__class__.__exclude_files: + is_valid_fname += int(not fnmatch.fnmatch(fname, invalid_fname)) + if_valid_ext = 0 + for ext in self.__class__.__py_extensions: + if_valid_ext += int(fnmatch.fnmatch(fname, ext)) + return is_valid_fname > 0 and if_valid_ext > 0 + + def __unixify(self, s): + """stupid windows. converts the backslash to forwardslash for consistency""" + return os.path.normpath(s).replace(os.sep, "/") + + def __importify(self, s, dir=False): + """turns directory separators into dots and removes the ".py*" extension + so the string can be used as import statement""" + if not dir: + dirname, fname = os.path.split(s) + + if fname.count(".") > 1: + # if there's a file named xxx.xx.py, it is not a valid module, so, let's not load it... + return + + imp_stmt_pieces = [dirname.replace("\\", "/").replace("/", "."), os.path.splitext(fname)[0]] + + if len(imp_stmt_pieces[0]) == 0: + imp_stmt_pieces = imp_stmt_pieces[1:] + + return ".".join(imp_stmt_pieces) + + else: # handle dir + return s.replace("\\", "/").replace("/", ".") + + def __add_files(self, pyfiles, root, files): + """if files match, appends them to pyfiles. used by os.path.walk fcn""" + for fname in files: + if self.__is_valid_py_file(fname): + name_without_base_dir = self.__unixify(os.path.join(root, fname)) + pyfiles.append(name_without_base_dir) + + def find_import_files(self): + """return a list of files to import""" + if self.files_to_tests: + pyfiles = self.files_to_tests.keys() + else: + pyfiles = [] + + for base_dir in self.files_or_dirs: + if os.path.isdir(base_dir): + for root, dirs, files in os.walk(base_dir): + # Note: handling directories that should be excluded from the search because + # they don't have __init__.py + exclude = {} + for d in dirs: + for init in ["__init__.py", "__init__.pyo", "__init__.pyc", "__init__.pyw", "__init__$py.class"]: + if os.path.exists(os.path.join(root, d, init).replace("\\", "/")): + break + else: + exclude[d] = 1 + + if exclude: + new = [] + for d in dirs: + if d not in exclude: + new.append(d) + + dirs[:] = new + + self.__add_files(pyfiles, root, files) + + elif os.path.isfile(base_dir): + pyfiles.append(base_dir) + + if self.configuration.exclude_files or self.configuration.include_files: + ret = [] + for f in pyfiles: + add = True + basename = os.path.basename(f) + if self.configuration.include_files: + add = False + + for pat in self.configuration.include_files: + if fnmatch.fnmatchcase(basename, pat): + add = True + break + + if not add: + if self.verbosity > 3: + sys.stdout.write( + "Skipped file: %s (did not match any include_files pattern: %s)\n" % (f, self.configuration.include_files) + ) + + elif self.configuration.exclude_files: + for pat in self.configuration.exclude_files: + if fnmatch.fnmatchcase(basename, pat): + if self.verbosity > 3: + sys.stdout.write("Skipped file: %s (matched exclude_files pattern: %s)\n" % (f, pat)) + + elif self.verbosity > 2: + sys.stdout.write("Skipped file: %s\n" % (f,)) + + add = False + break + + if add: + if self.verbosity > 3: + sys.stdout.write("Adding file: %s for test discovery.\n" % (f,)) + ret.append(f) + + pyfiles = ret + + return pyfiles + + def __get_module_from_str(self, modname, print_exception, pyfile): + """Import the module in the given import path. + * Returns the "final" module, so importing "coilib40.subject.visu" + returns the "visu" module, not the "coilib40" as returned by __import__""" + try: + mod = __import__(modname) + for part in modname.split(".")[1:]: + mod = getattr(mod, part) + return mod + except: + if print_exception: + from _pydev_runfiles import pydev_runfiles_xml_rpc + from _pydevd_bundle import pydevd_io + + buf_err = pydevd_io.start_redirect(keep_original_redirection=True, std="stderr") + buf_out = pydevd_io.start_redirect(keep_original_redirection=True, std="stdout") + try: + import traceback + + traceback.print_exc() + sys.stderr.write("ERROR: Module: %s could not be imported (file: %s).\n" % (modname, pyfile)) + finally: + pydevd_io.end_redirect("stderr") + pydevd_io.end_redirect("stdout") + + pydev_runfiles_xml_rpc.notifyTest("error", buf_out.getvalue(), buf_err.getvalue(), pyfile, modname, 0) + + return None + + def remove_duplicates_keeping_order(self, seq): + seen = set() + seen_add = seen.add + return [x for x in seq if not (x in seen or seen_add(x))] + + def find_modules_from_files(self, pyfiles): + """returns a list of modules given a list of files""" + # let's make sure that the paths we want are in the pythonpath... + imports = [(s, self.__importify(s)) for s in pyfiles] + + sys_path = [os.path.normpath(path) for path in sys.path] + sys_path = self.remove_duplicates_keeping_order(sys_path) + + system_paths = [] + for s in sys_path: + system_paths.append(self.__importify(s, True)) + + ret = [] + for pyfile, imp in imports: + if imp is None: + continue # can happen if a file is not a valid module + choices = [] + for s in system_paths: + if imp.startswith(s): + add = imp[len(s) + 1 :] + if add: + choices.append(add) + # sys.stdout.write(' ' + add + ' ') + + if not choices: + sys.stdout.write("PYTHONPATH not found for file: %s\n" % imp) + else: + for i, import_str in enumerate(choices): + print_exception = i == len(choices) - 1 + mod = self.__get_module_from_str(import_str, print_exception, pyfile) + if mod is not None: + ret.append((pyfile, mod, import_str)) + break + + return ret + + # =================================================================================================================== + # GetTestCaseNames + # =================================================================================================================== + class GetTestCaseNames: + """Yes, we need a class for that (cannot use outer context on jython 2.1)""" + + def __init__(self, accepted_classes, accepted_methods): + self.accepted_classes = accepted_classes + self.accepted_methods = accepted_methods + + def __call__(self, testCaseClass): + """Return a sorted sequence of method names found within testCaseClass""" + testFnNames = [] + className = testCaseClass.__name__ + + if className in self.accepted_classes: + for attrname in dir(testCaseClass): + # If a class is chosen, we select all the 'test' methods' + if attrname.startswith("test") and hasattr(getattr(testCaseClass, attrname), "__call__"): + testFnNames.append(attrname) + + else: + for attrname in dir(testCaseClass): + # If we have the class+method name, we must do a full check and have an exact match. + if className + "." + attrname in self.accepted_methods: + if hasattr(getattr(testCaseClass, attrname), "__call__"): + testFnNames.append(attrname) + + # sorted() is not available in jython 2.1 + testFnNames.sort() + return testFnNames + + def _decorate_test_suite(self, suite, pyfile, module_name): + import unittest + + if isinstance(suite, unittest.TestSuite): + add = False + suite.__pydev_pyfile__ = pyfile + suite.__pydev_module_name__ = module_name + + for t in suite._tests: + t.__pydev_pyfile__ = pyfile + t.__pydev_module_name__ = module_name + if self._decorate_test_suite(t, pyfile, module_name): + add = True + + return add + + elif isinstance(suite, unittest.TestCase): + return True + + else: + return False + + def find_tests_from_modules(self, file_and_modules_and_module_name): + """returns the unittests given a list of modules""" + # Use our own suite! + from _pydev_runfiles import pydev_runfiles_unittest + import unittest + + unittest.TestLoader.suiteClass = pydev_runfiles_unittest.PydevTestSuite + loader = unittest.TestLoader() + + ret = [] + if self.files_to_tests: + for pyfile, m, module_name in file_and_modules_and_module_name: + accepted_classes = {} + accepted_methods = {} + tests = self.files_to_tests[pyfile] + for t in tests: + accepted_methods[t] = t + + loader.getTestCaseNames = self.GetTestCaseNames(accepted_classes, accepted_methods) + + suite = loader.loadTestsFromModule(m) + if self._decorate_test_suite(suite, pyfile, module_name): + ret.append(suite) + return ret + + if self.tests: + accepted_classes = {} + accepted_methods = {} + + for t in self.tests: + splitted = t.split(".") + if len(splitted) == 1: + accepted_classes[t] = t + + elif len(splitted) == 2: + accepted_methods[t] = t + + loader.getTestCaseNames = self.GetTestCaseNames(accepted_classes, accepted_methods) + + for pyfile, m, module_name in file_and_modules_and_module_name: + suite = loader.loadTestsFromModule(m) + if self._decorate_test_suite(suite, pyfile, module_name): + ret.append(suite) + + return ret + + def filter_tests(self, test_objs, internal_call=False): + """based on a filter name, only return those tests that have + the test case names that match""" + import unittest + + if not internal_call: + if not self.configuration.include_tests and not self.tests and not self.configuration.exclude_tests: + # No need to filter if we have nothing to filter! + return test_objs + + if self.verbosity > 1: + if self.configuration.include_tests: + sys.stdout.write("Tests to include: %s\n" % (self.configuration.include_tests,)) + + if self.tests: + sys.stdout.write("Tests to run: %s\n" % (self.tests,)) + + if self.configuration.exclude_tests: + sys.stdout.write("Tests to exclude: %s\n" % (self.configuration.exclude_tests,)) + + test_suite = [] + for test_obj in test_objs: + if isinstance(test_obj, unittest.TestSuite): + # Note: keep the suites as they are and just 'fix' the tests (so, don't use the iter_tests). + if test_obj._tests: + test_obj._tests = self.filter_tests(test_obj._tests, True) + if test_obj._tests: # Only add the suite if we still have tests there. + test_suite.append(test_obj) + + elif isinstance(test_obj, unittest.TestCase): + try: + testMethodName = test_obj._TestCase__testMethodName + except AttributeError: + # changed in python 2.5 + testMethodName = test_obj._testMethodName + + add = True + if self.configuration.exclude_tests: + for pat in self.configuration.exclude_tests: + if fnmatch.fnmatchcase(testMethodName, pat): + if self.verbosity > 3: + sys.stdout.write("Skipped test: %s (matched exclude_tests pattern: %s)\n" % (testMethodName, pat)) + + elif self.verbosity > 2: + sys.stdout.write("Skipped test: %s\n" % (testMethodName,)) + + add = False + break + + if add: + if self.__match_tests(self.tests, test_obj, testMethodName): + include = True + if self.configuration.include_tests: + include = False + for pat in self.configuration.include_tests: + if fnmatch.fnmatchcase(testMethodName, pat): + include = True + break + if include: + test_suite.append(test_obj) + else: + if self.verbosity > 3: + sys.stdout.write( + "Skipped test: %s (did not match any include_tests pattern %s)\n" + % ( + testMethodName, + self.configuration.include_tests, + ) + ) + return test_suite + + def iter_tests(self, test_objs): + # Note: not using yield because of Jython 2.1. + import unittest + + tests = [] + for test_obj in test_objs: + if isinstance(test_obj, unittest.TestSuite): + tests.extend(self.iter_tests(test_obj._tests)) + + elif isinstance(test_obj, unittest.TestCase): + tests.append(test_obj) + return tests + + def list_test_names(self, test_objs): + names = [] + for tc in self.iter_tests(test_objs): + try: + testMethodName = tc._TestCase__testMethodName + except AttributeError: + # changed in python 2.5 + testMethodName = tc._testMethodName + names.append(testMethodName) + return names + + def __match_tests(self, tests, test_case, test_method_name): + if not tests: + return 1 + + for t in tests: + class_and_method = t.split(".") + if len(class_and_method) == 1: + # only class name + if class_and_method[0] == test_case.__class__.__name__: + return 1 + + elif len(class_and_method) == 2: + if class_and_method[0] == test_case.__class__.__name__ and class_and_method[1] == test_method_name: + return 1 + + return 0 + + def __match(self, filter_list, name): + """returns whether a test name matches the test filter""" + if filter_list is None: + return 1 + for f in filter_list: + if re.match(f, name): + return 1 + return 0 + + def run_tests(self, handle_coverage=True): + """runs all tests""" + sys.stdout.write("Finding files... ") + files = self.find_import_files() + if self.verbosity > 3: + sys.stdout.write("%s ... done.\n" % (self.files_or_dirs)) + else: + sys.stdout.write("done.\n") + sys.stdout.write("Importing test modules ... ") + + if self.configuration.django: + import django + + if hasattr(django, "setup"): + django.setup() + + if handle_coverage: + coverage_files, coverage = start_coverage_support(self.configuration) + + file_and_modules_and_module_name = self.find_modules_from_files(files) + sys.stdout.write("done.\n") + + all_tests = self.find_tests_from_modules(file_and_modules_and_module_name) + all_tests = self.filter_tests(all_tests) + + from _pydev_runfiles import pydev_runfiles_unittest + + test_suite = pydev_runfiles_unittest.PydevTestSuite(all_tests) + from _pydev_runfiles import pydev_runfiles_xml_rpc + + pydev_runfiles_xml_rpc.notifyTestsCollected(test_suite.countTestCases()) + + start_time = time.time() + + def run_tests(): + executed_in_parallel = False + if self.jobs > 1: + from _pydev_runfiles import pydev_runfiles_parallel + + # What may happen is that the number of jobs needed is lower than the number of jobs requested + # (e.g.: 2 jobs were requested for running 1 test) -- in which case execute_tests_in_parallel will + # return False and won't run any tests. + executed_in_parallel = pydev_runfiles_parallel.execute_tests_in_parallel( + all_tests, self.jobs, self.split_jobs, self.verbosity, coverage_files, self.configuration.coverage_include + ) + + if not executed_in_parallel: + # If in coverage, we don't need to pass anything here (coverage is already enabled for this execution). + runner = pydev_runfiles_unittest.PydevTextTestRunner(stream=sys.stdout, descriptions=1, verbosity=self.verbosity) + sys.stdout.write("\n") + runner.run(test_suite) + + if self.configuration.django: + get_django_test_suite_runner()(run_tests).run_tests([]) + else: + run_tests() + + if handle_coverage: + coverage.stop() + coverage.save() + + total_time = "Finished in: %.2f secs." % (time.time() - start_time,) + pydev_runfiles_xml_rpc.notifyTestRunFinished(total_time) + + +DJANGO_TEST_SUITE_RUNNER = None + + +def get_django_test_suite_runner(): + global DJANGO_TEST_SUITE_RUNNER + if DJANGO_TEST_SUITE_RUNNER: + return DJANGO_TEST_SUITE_RUNNER + try: + # django >= 1.8 + import django + from django.test.runner import DiscoverRunner + + class MyDjangoTestSuiteRunner(DiscoverRunner): + def __init__(self, on_run_suite): + django.setup() + DiscoverRunner.__init__(self) + self.on_run_suite = on_run_suite + + def build_suite(self, *args, **kwargs): + pass + + def suite_result(self, *args, **kwargs): + pass + + def run_suite(self, *args, **kwargs): + self.on_run_suite() + + except: + # django < 1.8 + try: + from django.test.simple import DjangoTestSuiteRunner + except: + + class DjangoTestSuiteRunner: + def __init__(self): + pass + + def run_tests(self, *args, **kwargs): + raise AssertionError( + "Unable to run suite with django.test.runner.DiscoverRunner nor django.test.simple.DjangoTestSuiteRunner because it couldn't be imported." + ) + + class MyDjangoTestSuiteRunner(DjangoTestSuiteRunner): + def __init__(self, on_run_suite): + DjangoTestSuiteRunner.__init__(self) + self.on_run_suite = on_run_suite + + def build_suite(self, *args, **kwargs): + pass + + def suite_result(self, *args, **kwargs): + pass + + def run_suite(self, *args, **kwargs): + self.on_run_suite() + + DJANGO_TEST_SUITE_RUNNER = MyDjangoTestSuiteRunner + return DJANGO_TEST_SUITE_RUNNER + + +# ======================================================================================================================= +# main +# ======================================================================================================================= +def main(configuration): + PydevTestRunner(configuration).run_tests() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_coverage.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_coverage.py new file mode 100644 index 0000000..a088b42 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_coverage.py @@ -0,0 +1,77 @@ +import os.path +import sys +from _pydevd_bundle.pydevd_constants import Null + + +# ======================================================================================================================= +# get_coverage_files +# ======================================================================================================================= +def get_coverage_files(coverage_output_dir, number_of_files): + base_dir = coverage_output_dir + ret = [] + i = 0 + while len(ret) < number_of_files: + while True: + f = os.path.join(base_dir, ".coverage.%s" % i) + i += 1 + if not os.path.exists(f): + ret.append(f) + break # Break only inner for. + return ret + + +# ======================================================================================================================= +# start_coverage_support +# ======================================================================================================================= +def start_coverage_support(configuration): + return start_coverage_support_from_params( + configuration.coverage_output_dir, + configuration.coverage_output_file, + configuration.jobs, + configuration.coverage_include, + ) + + +# ======================================================================================================================= +# start_coverage_support_from_params +# ======================================================================================================================= +def start_coverage_support_from_params(coverage_output_dir, coverage_output_file, jobs, coverage_include): + coverage_files = [] + coverage_instance = Null() + if coverage_output_dir or coverage_output_file: + try: + import coverage # @UnresolvedImport + except: + sys.stderr.write("Error: coverage module could not be imported\n") + sys.stderr.write("Please make sure that the coverage module (http://nedbatchelder.com/code/coverage/)\n") + sys.stderr.write("is properly installed in your interpreter: %s\n" % (sys.executable,)) + + import traceback + + traceback.print_exc() + else: + if coverage_output_dir: + if not os.path.exists(coverage_output_dir): + sys.stderr.write("Error: directory for coverage output (%s) does not exist.\n" % (coverage_output_dir,)) + + elif not os.path.isdir(coverage_output_dir): + sys.stderr.write("Error: expected (%s) to be a directory.\n" % (coverage_output_dir,)) + + else: + n = jobs + if n <= 0: + n += 1 + n += 1 # Add 1 more for the current process (which will do the initial import). + coverage_files = get_coverage_files(coverage_output_dir, n) + os.environ["COVERAGE_FILE"] = coverage_files.pop(0) + + coverage_instance = coverage.coverage(source=[coverage_include]) + coverage_instance.start() + + elif coverage_output_file: + # Client of parallel run. + os.environ["COVERAGE_FILE"] = coverage_output_file + coverage_instance = coverage.coverage(source=[coverage_include]) + coverage_instance.start() + + return coverage_files, coverage_instance diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_nose.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_nose.py new file mode 100644 index 0000000..13a01b2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_nose.py @@ -0,0 +1,206 @@ +from nose.plugins.multiprocess import MultiProcessTestRunner # @UnresolvedImport +from nose.plugins.base import Plugin # @UnresolvedImport +import sys +from _pydev_runfiles import pydev_runfiles_xml_rpc +import time +from _pydev_runfiles.pydev_runfiles_coverage import start_coverage_support +from contextlib import contextmanager +from io import StringIO +import traceback + + +# ======================================================================================================================= +# PydevPlugin +# ======================================================================================================================= +class PydevPlugin(Plugin): + def __init__(self, configuration): + self.configuration = configuration + Plugin.__init__(self) + + def begin(self): + # Called before any test is run (it's always called, with multiprocess or not) + self.start_time = time.time() + self.coverage_files, self.coverage = start_coverage_support(self.configuration) + + def finalize(self, result): + # Called after all tests are run (it's always called, with multiprocess or not) + self.coverage.stop() + self.coverage.save() + + pydev_runfiles_xml_rpc.notifyTestRunFinished("Finished in: %.2f secs." % (time.time() - self.start_time,)) + + # =================================================================================================================== + # Methods below are not called with multiprocess (so, we monkey-patch MultiProcessTestRunner.consolidate + # so that they're called, but unfortunately we loose some info -- i.e.: the time for each test in this + # process). + # =================================================================================================================== + + class Sentinel(object): + pass + + @contextmanager + def _without_user_address(self, test): + # #PyDev-1095: Conflict between address in test and test.address() in PydevPlugin().report_cond() + user_test_instance = test.test + user_address = self.Sentinel + user_class_address = self.Sentinel + try: + if "address" in user_test_instance.__dict__: + user_address = user_test_instance.__dict__.pop("address") + except: + # Just ignore anything here. + pass + try: + user_class_address = user_test_instance.__class__.address + del user_test_instance.__class__.address + except: + # Just ignore anything here. + pass + + try: + yield + finally: + if user_address is not self.Sentinel: + user_test_instance.__dict__["address"] = user_address + + if user_class_address is not self.Sentinel: + user_test_instance.__class__.address = user_class_address + + def _get_test_address(self, test): + try: + if hasattr(test, "address"): + with self._without_user_address(test): + address = test.address() + + # test.address() is something as: + # ('D:\\workspaces\\temp\\test_workspace\\pytesting1\\src\\mod1\\hello.py', 'mod1.hello', 'TestCase.testMet1') + # + # and we must pass: location, test + # E.g.: ['D:\\src\\mod1\\hello.py', 'TestCase.testMet1'] + address = address[0], address[2] + else: + # multiprocess + try: + address = test[0], test[1] + except TypeError: + # It may be an error at setup, in which case it's not really a test, but a Context object. + f = test.context.__file__ + if f.endswith(".pyc"): + f = f[:-1] + elif f.endswith("$py.class"): + f = f[: -len("$py.class")] + ".py" + address = f, "?" + except: + sys.stderr.write("PyDev: Internal pydev error getting test address. Please report at the pydev bug tracker\n") + traceback.print_exc() + sys.stderr.write("\n\n\n") + address = "?", "?" + return address + + def report_cond(self, cond, test, captured_output, error=""): + """ + @param cond: fail, error, ok + """ + + address = self._get_test_address(test) + + error_contents = self.get_io_from_error(error) + try: + time_str = "%.2f" % (time.time() - test._pydev_start_time) + except: + time_str = "?" + + pydev_runfiles_xml_rpc.notifyTest(cond, captured_output, error_contents, address[0], address[1], time_str) + + def startTest(self, test): + test._pydev_start_time = time.time() + file, test = self._get_test_address(test) + pydev_runfiles_xml_rpc.notifyStartTest(file, test) + + def get_io_from_error(self, err): + if type(err) == type(()): + if len(err) != 3: + if len(err) == 2: + return err[1] # multiprocess + s = StringIO() + etype, value, tb = err + if isinstance(value, str): + return value + traceback.print_exception(etype, value, tb, file=s) + return s.getvalue() + return err + + def get_captured_output(self, test): + if hasattr(test, "capturedOutput") and test.capturedOutput: + return test.capturedOutput + return "" + + def addError(self, test, err): + self.report_cond( + "error", + test, + self.get_captured_output(test), + err, + ) + + def addFailure(self, test, err): + self.report_cond( + "fail", + test, + self.get_captured_output(test), + err, + ) + + def addSuccess(self, test): + self.report_cond( + "ok", + test, + self.get_captured_output(test), + "", + ) + + +PYDEV_NOSE_PLUGIN_SINGLETON = None + + +def start_pydev_nose_plugin_singleton(configuration): + global PYDEV_NOSE_PLUGIN_SINGLETON + PYDEV_NOSE_PLUGIN_SINGLETON = PydevPlugin(configuration) + return PYDEV_NOSE_PLUGIN_SINGLETON + + +original = MultiProcessTestRunner.consolidate + + +# ======================================================================================================================= +# new_consolidate +# ======================================================================================================================= +def new_consolidate(self, result, batch_result): + """ + Used so that it can work with the multiprocess plugin. + Monkeypatched because nose seems a bit unsupported at this time (ideally + the plugin would have this support by default). + """ + ret = original(self, result, batch_result) + + parent_frame = sys._getframe().f_back + # addr is something as D:\pytesting1\src\mod1\hello.py:TestCase.testMet4 + # so, convert it to what report_cond expects + addr = parent_frame.f_locals["addr"] + i = addr.rindex(":") + addr = [addr[:i], addr[i + 1 :]] + + output, testsRun, failures, errors, errorClasses = batch_result + if failures or errors: + for failure in failures: + PYDEV_NOSE_PLUGIN_SINGLETON.report_cond("fail", addr, output, failure) + + for error in errors: + PYDEV_NOSE_PLUGIN_SINGLETON.report_cond("error", addr, output, error) + else: + PYDEV_NOSE_PLUGIN_SINGLETON.report_cond("ok", addr, output) + + return ret + + +MultiProcessTestRunner.consolidate = new_consolidate diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel.py new file mode 100644 index 0000000..55a2134 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel.py @@ -0,0 +1,266 @@ +import unittest +from _pydev_bundle._pydev_saved_modules import thread +import queue as Queue +from _pydev_runfiles import pydev_runfiles_xml_rpc +import time +import os +import threading +import sys + + +# ======================================================================================================================= +# flatten_test_suite +# ======================================================================================================================= +def flatten_test_suite(test_suite, ret): + if isinstance(test_suite, unittest.TestSuite): + for t in test_suite._tests: + flatten_test_suite(t, ret) + + elif isinstance(test_suite, unittest.TestCase): + ret.append(test_suite) + + +# ======================================================================================================================= +# execute_tests_in_parallel +# ======================================================================================================================= +def execute_tests_in_parallel(tests, jobs, split, verbosity, coverage_files, coverage_include): + """ + @param tests: list(PydevTestSuite) + A list with the suites to be run + + @param split: str + Either 'module' or the number of tests that should be run in each batch + + @param coverage_files: list(file) + A list with the files that should be used for giving coverage information (if empty, coverage information + should not be gathered). + + @param coverage_include: str + The pattern that should be included in the coverage. + + @return: bool + Returns True if the tests were actually executed in parallel. If the tests were not executed because only 1 + should be used (e.g.: 2 jobs were requested for running 1 test), False will be returned and no tests will be + run. + + It may also return False if in debug mode (in which case, multi-processes are not accepted) + """ + try: + from _pydevd_bundle.pydevd_comm import get_global_debugger + + if get_global_debugger() is not None: + return False + except: + pass # Ignore any error here. + + # This queue will receive the tests to be run. Each entry in a queue is a list with the tests to be run together When + # split == 'tests', each list will have a single element, when split == 'module', each list will have all the tests + # from a given module. + tests_queue = [] + + queue_elements = [] + if split == "module": + module_to_tests = {} + for test in tests: + lst = [] + flatten_test_suite(test, lst) + for test in lst: + key = (test.__pydev_pyfile__, test.__pydev_module_name__) + module_to_tests.setdefault(key, []).append(test) + + for key, tests in module_to_tests.items(): + queue_elements.append(tests) + + if len(queue_elements) < jobs: + # Don't create jobs we will never use. + jobs = len(queue_elements) + + elif split == "tests": + for test in tests: + lst = [] + flatten_test_suite(test, lst) + for test in lst: + queue_elements.append([test]) + + if len(queue_elements) < jobs: + # Don't create jobs we will never use. + jobs = len(queue_elements) + + else: + raise AssertionError("Do not know how to handle: %s" % (split,)) + + for test_cases in queue_elements: + test_queue_elements = [] + for test_case in test_cases: + try: + test_name = test_case.__class__.__name__ + "." + test_case._testMethodName + except AttributeError: + # Support for jython 2.1 (__testMethodName is pseudo-private in the test case) + test_name = test_case.__class__.__name__ + "." + test_case._TestCase__testMethodName + + test_queue_elements.append(test_case.__pydev_pyfile__ + "|" + test_name) + + tests_queue.append(test_queue_elements) + + if jobs < 2: + return False + + sys.stdout.write("Running tests in parallel with: %s jobs.\n" % (jobs,)) + + queue = Queue.Queue() + for item in tests_queue: + queue.put(item, block=False) + + providers = [] + clients = [] + for i in range(jobs): + test_cases_provider = CommunicationThread(queue) + providers.append(test_cases_provider) + + test_cases_provider.start() + port = test_cases_provider.port + + if coverage_files: + clients.append(ClientThread(i, port, verbosity, coverage_files.pop(0), coverage_include)) + else: + clients.append(ClientThread(i, port, verbosity)) + + for client in clients: + client.start() + + client_alive = True + while client_alive: + client_alive = False + for client in clients: + # Wait for all the clients to exit. + if not client.finished: + client_alive = True + time.sleep(0.2) + break + + for provider in providers: + provider.shutdown() + + return True + + +# ======================================================================================================================= +# CommunicationThread +# ======================================================================================================================= +class CommunicationThread(threading.Thread): + def __init__(self, tests_queue): + threading.Thread.__init__(self) + self.daemon = True + self.queue = tests_queue + self.finished = False + from _pydev_bundle.pydev_imports import SimpleXMLRPCServer + from _pydev_bundle import pydev_localhost + + # Create server + server = SimpleXMLRPCServer((pydev_localhost.get_localhost(), 0), logRequests=False) + server.register_function(self.GetTestsToRun) + server.register_function(self.notifyStartTest) + server.register_function(self.notifyTest) + server.register_function(self.notifyCommands) + self.port = server.socket.getsockname()[1] + self.server = server + + def GetTestsToRun(self, job_id): + """ + @param job_id: + + @return: list(str) + Each entry is a string in the format: filename|Test.testName + """ + try: + ret = self.queue.get(block=False) + return ret + except: # Any exception getting from the queue (empty or not) means we finished our work on providing the tests. + self.finished = True + return [] + + def notifyCommands(self, job_id, commands): + # Batch notification. + for command in commands: + getattr(self, command[0])(job_id, *command[1], **command[2]) + + return True + + def notifyStartTest(self, job_id, *args, **kwargs): + pydev_runfiles_xml_rpc.notifyStartTest(*args, **kwargs) + return True + + def notifyTest(self, job_id, *args, **kwargs): + pydev_runfiles_xml_rpc.notifyTest(*args, **kwargs) + return True + + def shutdown(self): + if hasattr(self.server, "shutdown"): + self.server.shutdown() + else: + self._shutdown = True + + def run(self): + if hasattr(self.server, "shutdown"): + self.server.serve_forever() + else: + self._shutdown = False + while not self._shutdown: + self.server.handle_request() + + +# ======================================================================================================================= +# Client +# ======================================================================================================================= +class ClientThread(threading.Thread): + def __init__(self, job_id, port, verbosity, coverage_output_file=None, coverage_include=None): + threading.Thread.__init__(self) + self.daemon = True + self.port = port + self.job_id = job_id + self.verbosity = verbosity + self.finished = False + self.coverage_output_file = coverage_output_file + self.coverage_include = coverage_include + + def _reader_thread(self, pipe, target): + while True: + target.write(pipe.read(1)) + + def run(self): + try: + from _pydev_runfiles import pydev_runfiles_parallel_client + # TODO: Support Jython: + # + # For jython, instead of using sys.executable, we should use: + # r'D:\bin\jdk_1_5_09\bin\java.exe', + # '-classpath', + # 'D:/bin/jython-2.2.1/jython.jar', + # 'org.python.util.jython', + + args = [ + sys.executable, + pydev_runfiles_parallel_client.__file__, + str(self.job_id), + str(self.port), + str(self.verbosity), + ] + + if self.coverage_output_file and self.coverage_include: + args.append(self.coverage_output_file) + args.append(self.coverage_include) + + import subprocess + + if False: + proc = subprocess.Popen(args, env=os.environ, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + thread.start_new_thread(self._reader_thread, (proc.stdout, sys.stdout)) + + thread.start_new_thread(target=self._reader_thread, args=(proc.stderr, sys.stderr)) + else: + proc = subprocess.Popen(args, env=os.environ, shell=False) + proc.wait() + + finally: + self.finished = True diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel_client.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel_client.py new file mode 100644 index 0000000..0132b06 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel_client.py @@ -0,0 +1,194 @@ +from _pydev_bundle.pydev_imports import xmlrpclib, _queue + +Queue = _queue.Queue +import traceback +import sys +from _pydev_runfiles.pydev_runfiles_coverage import start_coverage_support_from_params +import threading + + +# ======================================================================================================================= +# ParallelNotification +# ======================================================================================================================= +class ParallelNotification(object): + def __init__(self, method, args, kwargs): + self.method = method + self.args = args + self.kwargs = kwargs + + def to_tuple(self): + return self.method, self.args, self.kwargs + + +# ======================================================================================================================= +# KillServer +# ======================================================================================================================= +class KillServer(object): + pass + + +# ======================================================================================================================= +# ServerComm +# ======================================================================================================================= +class ServerComm(threading.Thread): + def __init__(self, job_id, server): + self.notifications_queue = Queue() + threading.Thread.__init__(self) + self.setDaemon(False) # Wait for all the notifications to be passed before exiting! + assert job_id is not None + assert port is not None + self.job_id = job_id + + self.finished = False + self.server = server + + def run(self): + while True: + kill_found = False + commands = [] + command = self.notifications_queue.get(block=True) + if isinstance(command, KillServer): + kill_found = True + else: + assert isinstance(command, ParallelNotification) + commands.append(command.to_tuple()) + + try: + while True: + command = self.notifications_queue.get(block=False) # No block to create a batch. + if isinstance(command, KillServer): + kill_found = True + else: + assert isinstance(command, ParallelNotification) + commands.append(command.to_tuple()) + except: + pass # That's OK, we're getting it until it becomes empty so that we notify multiple at once. + + if commands: + try: + # Batch notification. + self.server.lock.acquire() + try: + self.server.notifyCommands(self.job_id, commands) + finally: + self.server.lock.release() + except: + traceback.print_exc() + + if kill_found: + self.finished = True + return + + +# ======================================================================================================================= +# ServerFacade +# ======================================================================================================================= +class ServerFacade(object): + def __init__(self, notifications_queue): + self.notifications_queue = notifications_queue + + def notifyTestsCollected(self, *args, **kwargs): + pass # This notification won't be passed + + def notifyTestRunFinished(self, *args, **kwargs): + pass # This notification won't be passed + + def notifyStartTest(self, *args, **kwargs): + self.notifications_queue.put_nowait(ParallelNotification("notifyStartTest", args, kwargs)) + + def notifyTest(self, *args, **kwargs): + self.notifications_queue.put_nowait(ParallelNotification("notifyTest", args, kwargs)) + + +# ======================================================================================================================= +# run_client +# ======================================================================================================================= +def run_client(job_id, port, verbosity, coverage_output_file, coverage_include): + job_id = int(job_id) + + from _pydev_bundle import pydev_localhost + + server = xmlrpclib.Server("http://%s:%s" % (pydev_localhost.get_localhost(), port)) + server.lock = threading.Lock() + + server_comm = ServerComm(job_id, server) + server_comm.start() + + try: + server_facade = ServerFacade(server_comm.notifications_queue) + from _pydev_runfiles import pydev_runfiles + from _pydev_runfiles import pydev_runfiles_xml_rpc + + pydev_runfiles_xml_rpc.set_server(server_facade) + + # Starts None and when the 1st test is gotten, it's started (because a server may be initiated and terminated + # before receiving any test -- which would mean a different process got all the tests to run). + coverage = None + + try: + tests_to_run = [1] + while tests_to_run: + # Investigate: is it dangerous to use the same xmlrpclib server from different threads? + # It seems it should be, as it creates a new connection for each request... + server.lock.acquire() + try: + tests_to_run = server.GetTestsToRun(job_id) + finally: + server.lock.release() + + if not tests_to_run: + break + + if coverage is None: + _coverage_files, coverage = start_coverage_support_from_params(None, coverage_output_file, 1, coverage_include) + + files_to_tests = {} + for test in tests_to_run: + filename_and_test = test.split("|") + if len(filename_and_test) == 2: + files_to_tests.setdefault(filename_and_test[0], []).append(filename_and_test[1]) + + configuration = pydev_runfiles.Configuration( + "", + verbosity, + None, + None, + None, + files_to_tests, + 1, # Always single job here + None, + # The coverage is handled in this loop. + coverage_output_file=None, + coverage_include=None, + ) + test_runner = pydev_runfiles.PydevTestRunner(configuration) + sys.stdout.flush() + test_runner.run_tests(handle_coverage=False) + finally: + if coverage is not None: + coverage.stop() + coverage.save() + + except: + traceback.print_exc() + server_comm.notifications_queue.put_nowait(KillServer()) + + +# ======================================================================================================================= +# main +# ======================================================================================================================= +if __name__ == "__main__": + if len(sys.argv) - 1 == 3: + job_id, port, verbosity = sys.argv[1:] + coverage_output_file, coverage_include = None, None + + elif len(sys.argv) - 1 == 5: + job_id, port, verbosity, coverage_output_file, coverage_include = sys.argv[1:] + + else: + raise AssertionError("Could not find out how to handle the parameters: " + sys.argv[1:]) + + job_id = int(job_id) + port = int(port) + verbosity = int(verbosity) + run_client(job_id, port, verbosity, coverage_output_file, coverage_include) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_pytest2.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_pytest2.py new file mode 100644 index 0000000..acd99c3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_pytest2.py @@ -0,0 +1,308 @@ +import base64 +import os +import pickle +import sys +import time +import zlib +from pathlib import Path + +import pytest +from pydevd_file_utils import canonical_normalized_path + +from _pydev_runfiles import pydev_runfiles_xml_rpc + +# ========================================================================= +# Load filters with tests we should skip +# ========================================================================= +py_test_accept_filter = None + + +def _load_filters(): + global py_test_accept_filter + if py_test_accept_filter is None: + py_test_accept_filter = os.environ.get("PYDEV_PYTEST_SKIP") + if py_test_accept_filter: + py_test_accept_filter = pickle.loads(zlib.decompress(base64.b64decode(py_test_accept_filter))) + + # Newer versions of pytest resolve symlinks, so, we + # may need to filter with a resolved path too. + new_dct = {} + for filename, value in py_test_accept_filter.items(): + new_dct[canonical_normalized_path(str(Path(filename).resolve()))] = value + + py_test_accept_filter.update(new_dct) + + else: + py_test_accept_filter = {} + + +def is_in_xdist_node(): + main_pid = os.environ.get("PYDEV_MAIN_PID") + if main_pid and main_pid != str(os.getpid()): + return True + return False + + +connected = False + + +def connect_to_server_for_communication_to_xml_rpc_on_xdist(): + global connected + if connected: + return + connected = True + if is_in_xdist_node(): + port = os.environ.get("PYDEV_PYTEST_SERVER") + if port == "None": + pass + elif not port: + sys.stderr.write("Error: no PYDEV_PYTEST_SERVER environment variable defined.\n") + else: + pydev_runfiles_xml_rpc.initialize_server(int(port), daemon=True) + + +PY2 = sys.version_info[0] <= 2 +PY3 = not PY2 + + +class State: + start_time = time.time() + buf_err = None + buf_out = None + + +def start_redirect(): + if State.buf_out is not None: + return + from _pydevd_bundle import pydevd_io + + State.buf_err = pydevd_io.start_redirect(keep_original_redirection=True, std="stderr") + State.buf_out = pydevd_io.start_redirect(keep_original_redirection=True, std="stdout") + + +def get_curr_output(): + buf_out = State.buf_out + buf_err = State.buf_err + return buf_out.getvalue() if buf_out is not None else "", buf_err.getvalue() if buf_err is not None else "" + + +def pytest_unconfigure(): + if is_in_xdist_node(): + return + # Only report that it finished when on the main node (we don't want to report + # the finish on each separate node). + pydev_runfiles_xml_rpc.notifyTestRunFinished("Finished in: %.2f secs." % (time.time() - State.start_time,)) + + +def pytest_collection_modifyitems(session, config, items): + # A note: in xdist, this is not called on the main process, only in the + # secondary nodes, so, we'll actually make the filter and report it multiple + # times. + connect_to_server_for_communication_to_xml_rpc_on_xdist() + + _load_filters() + if not py_test_accept_filter: + pydev_runfiles_xml_rpc.notifyTestsCollected(len(items)) + return # Keep on going (nothing to filter) + + new_items = [] + for item in items: + f = canonical_normalized_path(str(item.parent.fspath)) + name = item.name + + if f not in py_test_accept_filter: + # print('Skip file: %s' % (f,)) + continue # Skip the file + + i = name.find("[") + name_without_parametrize = None + if i > 0: + name_without_parametrize = name[:i] + + accept_tests = py_test_accept_filter[f] + + if item.cls is not None: + class_name = item.cls.__name__ + else: + class_name = None + for test in accept_tests: + if test == name: + # Direct match of the test (just go on with the default + # loading) + new_items.append(item) + break + + if name_without_parametrize is not None and test == name_without_parametrize: + # This happens when parameterizing pytest tests on older versions + # of pytest where the test name doesn't include the fixture name + # in it. + new_items.append(item) + break + + if class_name is not None: + if test == class_name + "." + name: + new_items.append(item) + break + + if name_without_parametrize is not None and test == class_name + "." + name_without_parametrize: + new_items.append(item) + break + + if class_name == test: + new_items.append(item) + break + else: + pass + # print('Skip test: %s.%s. Accept: %s' % (class_name, name, accept_tests)) + + # Modify the original list + items[:] = new_items + pydev_runfiles_xml_rpc.notifyTestsCollected(len(items)) + + +try: + """ + pytest > 5.4 uses own version of TerminalWriter based on py.io.TerminalWriter + and assumes there is a specific method TerminalWriter._write_source + so try load pytest version first or fallback to default one + """ + from _pytest._io import TerminalWriter +except ImportError: + from py.io import TerminalWriter + + +def _get_error_contents_from_report(report): + if report.longrepr is not None: + try: + tw = TerminalWriter(stringio=True) + stringio = tw.stringio + except TypeError: + import io + + stringio = io.StringIO() + tw = TerminalWriter(file=stringio) + tw.hasmarkup = False + report.toterminal(tw) + exc = stringio.getvalue() + s = exc.strip() + if s: + return s + + return "" + + +def pytest_collectreport(report): + error_contents = _get_error_contents_from_report(report) + if error_contents: + report_test("fail", "", "", "", error_contents, 0.0) + + +def append_strings(s1, s2): + if s1.__class__ == s2.__class__: + return s1 + s2 + + # Prefer str + if isinstance(s1, bytes): + s1 = s1.decode("utf-8", "replace") + + if isinstance(s2, bytes): + s2 = s2.decode("utf-8", "replace") + + return s1 + s2 + + +def pytest_runtest_logreport(report): + if is_in_xdist_node(): + # When running with xdist, we don't want the report to be called from the node, only + # from the main process. + return + report_duration = report.duration + report_when = report.when + report_outcome = report.outcome + + if hasattr(report, "wasxfail"): + if report_outcome != "skipped": + report_outcome = "passed" + + if report_outcome == "passed": + # passed on setup/teardown: no need to report if in setup or teardown + # (only on the actual test if it passed). + if report_when in ("setup", "teardown"): + return + + status = "ok" + + elif report_outcome == "skipped": + status = "skip" + + else: + # It has only passed, skipped and failed (no error), so, let's consider + # error if not on call. + if report_when in ("setup", "teardown"): + status = "error" + + else: + # any error in the call (not in setup or teardown) is considered a + # regular failure. + status = "fail" + + # This will work if pytest is not capturing it, if it is, nothing will + # come from here... + captured_output, error_contents = getattr(report, "pydev_captured_output", ""), getattr(report, "pydev_error_contents", "") + for type_section, value in report.sections: + if value: + if type_section in ("err", "stderr", "Captured stderr call"): + error_contents = append_strings(error_contents, value) + else: + captured_output = append_strings(error_contents, value) + + filename = getattr(report, "pydev_fspath_strpath", "") + test = report.location[2] + + if report_outcome != "skipped": + # On skipped, we'll have a traceback for the skip, which is not what we + # want. + exc = _get_error_contents_from_report(report) + if exc: + if error_contents: + error_contents = append_strings(error_contents, "----------------------------- Exceptions -----------------------------\n") + error_contents = append_strings(error_contents, exc) + + report_test(status, filename, test, captured_output, error_contents, report_duration) + + +def report_test(status, filename, test, captured_output, error_contents, duration): + """ + @param filename: 'D:\\src\\mod1\\hello.py' + @param test: 'TestCase.testMet1' + @param status: fail, error, ok + """ + time_str = "%.2f" % (duration,) + pydev_runfiles_xml_rpc.notifyTest(status, captured_output, error_contents, filename, test, time_str) + + +if not hasattr(pytest, "hookimpl"): + raise AssertionError("Please upgrade pytest (the current version of pytest: %s is unsupported)" % (pytest.__version__,)) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_runtest_makereport(item, call): + outcome = yield + report = outcome.get_result() + report.pydev_fspath_strpath = item.fspath.strpath + report.pydev_captured_output, report.pydev_error_contents = get_curr_output() + + +@pytest.mark.tryfirst +def pytest_runtest_setup(item): + """ + Note: with xdist will be on a secondary process. + """ + # We have our own redirection: if xdist does its redirection, we'll have + # nothing in our contents (which is OK), but if it does, we'll get nothing + # from pytest but will get our own here. + start_redirect() + filename = item.fspath.strpath + test = item.location[2] + + pydev_runfiles_xml_rpc.notifyStartTest(filename, test) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_unittest.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_unittest.py new file mode 100644 index 0000000..67f6a25 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_unittest.py @@ -0,0 +1,141 @@ +import unittest as python_unittest +from _pydev_runfiles import pydev_runfiles_xml_rpc +import time +from _pydevd_bundle import pydevd_io +import traceback +from _pydevd_bundle.pydevd_constants import * # @UnusedWildImport +from io import StringIO + + +# ======================================================================================================================= +# PydevTextTestRunner +# ======================================================================================================================= +class PydevTextTestRunner(python_unittest.TextTestRunner): + def _makeResult(self): + return PydevTestResult(self.stream, self.descriptions, self.verbosity) + + +_PythonTextTestResult = python_unittest.TextTestRunner()._makeResult().__class__ + + +# ======================================================================================================================= +# PydevTestResult +# ======================================================================================================================= +class PydevTestResult(_PythonTextTestResult): + def addSubTest(self, test, subtest, err): + """Called at the end of a subtest. + 'err' is None if the subtest ended successfully, otherwise it's a + tuple of values as returned by sys.exc_info(). + """ + _PythonTextTestResult.addSubTest(self, test, subtest, err) + if err is not None: + subdesc = subtest._subDescription() + error = (test, self._exc_info_to_string(err, test)) + self._reportErrors([error], [], "", "%s %s" % (self.get_test_name(test), subdesc)) + + def startTest(self, test): + _PythonTextTestResult.startTest(self, test) + self.buf = pydevd_io.start_redirect(keep_original_redirection=True, std="both") + self.start_time = time.time() + self._current_errors_stack = [] + self._current_failures_stack = [] + + try: + test_name = test.__class__.__name__ + "." + test._testMethodName + except AttributeError: + # Support for jython 2.1 (__testMethodName is pseudo-private in the test case) + test_name = test.__class__.__name__ + "." + test._TestCase__testMethodName + + pydev_runfiles_xml_rpc.notifyStartTest(test.__pydev_pyfile__, test_name) + + def get_test_name(self, test): + try: + try: + test_name = test.__class__.__name__ + "." + test._testMethodName + except AttributeError: + # Support for jython 2.1 (__testMethodName is pseudo-private in the test case) + try: + test_name = test.__class__.__name__ + "." + test._TestCase__testMethodName + # Support for class/module exceptions (test is instance of _ErrorHolder) + except: + test_name = test.description.split()[1][1:-1] + " <" + test.description.split()[0] + ">" + except: + traceback.print_exc() + return "" + return test_name + + def stopTest(self, test): + end_time = time.time() + pydevd_io.end_redirect(std="both") + + _PythonTextTestResult.stopTest(self, test) + + captured_output = self.buf.getvalue() + del self.buf + error_contents = "" + test_name = self.get_test_name(test) + + diff_time = "%.2f" % (end_time - self.start_time) + + skipped = False + outcome = getattr(test, "_outcome", None) + if outcome is not None: + skipped = bool(getattr(outcome, "skipped", None)) + + if skipped: + pydev_runfiles_xml_rpc.notifyTest("skip", captured_output, error_contents, test.__pydev_pyfile__, test_name, diff_time) + elif not self._current_errors_stack and not self._current_failures_stack: + pydev_runfiles_xml_rpc.notifyTest("ok", captured_output, error_contents, test.__pydev_pyfile__, test_name, diff_time) + else: + self._reportErrors(self._current_errors_stack, self._current_failures_stack, captured_output, test_name) + + def _reportErrors(self, errors, failures, captured_output, test_name, diff_time=""): + error_contents = [] + for test, s in errors + failures: + if type(s) == type((1,)): # If it's a tuple (for jython 2.1) + sio = StringIO() + traceback.print_exception(s[0], s[1], s[2], file=sio) + s = sio.getvalue() + error_contents.append(s) + + sep = "\n" + self.separator1 + error_contents = sep.join(error_contents) + + if errors and not failures: + try: + pydev_runfiles_xml_rpc.notifyTest("error", captured_output, error_contents, test.__pydev_pyfile__, test_name, diff_time) + except: + file_start = error_contents.find('File "') + file_end = error_contents.find('", ', file_start) + if file_start != -1 and file_end != -1: + file = error_contents[file_start + 6 : file_end] + else: + file = "" + pydev_runfiles_xml_rpc.notifyTest("error", captured_output, error_contents, file, test_name, diff_time) + + elif failures and not errors: + pydev_runfiles_xml_rpc.notifyTest("fail", captured_output, error_contents, test.__pydev_pyfile__, test_name, diff_time) + + else: # Ok, we got both, errors and failures. Let's mark it as an error in the end. + pydev_runfiles_xml_rpc.notifyTest("error", captured_output, error_contents, test.__pydev_pyfile__, test_name, diff_time) + + def addError(self, test, err): + _PythonTextTestResult.addError(self, test, err) + # Support for class/module exceptions (test is instance of _ErrorHolder) + if not hasattr(self, "_current_errors_stack") or test.__class__.__name__ == "_ErrorHolder": + # Not in start...end, so, report error now (i.e.: django pre/post-setup) + self._reportErrors([self.errors[-1]], [], "", self.get_test_name(test)) + else: + self._current_errors_stack.append(self.errors[-1]) + + def addFailure(self, test, err): + _PythonTextTestResult.addFailure(self, test, err) + if not hasattr(self, "_current_failures_stack"): + # Not in start...end, so, report error now (i.e.: django pre/post-setup) + self._reportErrors([], [self.failures[-1]], "", self.get_test_name(test)) + else: + self._current_failures_stack.append(self.failures[-1]) + + +class PydevTestSuite(python_unittest.TestSuite): + pass diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_xml_rpc.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_xml_rpc.py new file mode 100644 index 0000000..1ce2249 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_xml_rpc.py @@ -0,0 +1,260 @@ +import sys +import threading +import traceback +import warnings + +from _pydev_bundle._pydev_filesystem_encoding import getfilesystemencoding +from _pydev_bundle.pydev_imports import _queue, xmlrpclib +from _pydevd_bundle.pydevd_constants import Null + +Queue = _queue.Queue + +# This may happen in IronPython (in Python it shouldn't happen as there are +# 'fast' replacements that are used in xmlrpclib.py) +warnings.filterwarnings("ignore", "The xmllib module is obsolete.*", DeprecationWarning) + +file_system_encoding = getfilesystemencoding() + + +# ======================================================================================================================= +# _ServerHolder +# ======================================================================================================================= +class _ServerHolder: + """ + Helper so that we don't have to use a global here. + """ + + SERVER = None + + +# ======================================================================================================================= +# set_server +# ======================================================================================================================= +def set_server(server): + _ServerHolder.SERVER = server + + +# ======================================================================================================================= +# ParallelNotification +# ======================================================================================================================= +class ParallelNotification(object): + def __init__(self, method, args): + self.method = method + self.args = args + + def to_tuple(self): + return self.method, self.args + + +# ======================================================================================================================= +# KillServer +# ======================================================================================================================= +class KillServer(object): + pass + + +# ======================================================================================================================= +# ServerFacade +# ======================================================================================================================= +class ServerFacade(object): + def __init__(self, notifications_queue): + self.notifications_queue = notifications_queue + + def notifyTestsCollected(self, *args): + self.notifications_queue.put_nowait(ParallelNotification("notifyTestsCollected", args)) + + def notifyConnected(self, *args): + self.notifications_queue.put_nowait(ParallelNotification("notifyConnected", args)) + + def notifyTestRunFinished(self, *args): + self.notifications_queue.put_nowait(ParallelNotification("notifyTestRunFinished", args)) + + def notifyStartTest(self, *args): + self.notifications_queue.put_nowait(ParallelNotification("notifyStartTest", args)) + + def notifyTest(self, *args): + new_args = [] + for arg in args: + new_args.append(_encode_if_needed(arg)) + args = tuple(new_args) + self.notifications_queue.put_nowait(ParallelNotification("notifyTest", args)) + + +# ======================================================================================================================= +# ServerComm +# ======================================================================================================================= +class ServerComm(threading.Thread): + def __init__(self, notifications_queue, port, daemon=False): + # If daemon is False, wait for all the notifications to be passed before exiting! + threading.Thread.__init__(self, daemon=daemon) + self.finished = False + self.notifications_queue = notifications_queue + + from _pydev_bundle import pydev_localhost + + # It is necessary to specify an encoding, that matches + # the encoding of all bytes-strings passed into an + # XMLRPC call: "All 8-bit strings in the data structure are assumed to use the + # packet encoding. Unicode strings are automatically converted, + # where necessary." + # Byte strings most likely come from file names. + encoding = file_system_encoding + if encoding == "mbcs": + # Windos symbolic name for the system encoding CP_ACP. + # We need to convert it into a encoding that is recognized by Java. + # Unfortunately this is not always possible. You could use + # GetCPInfoEx and get a name similar to "windows-1251". Then + # you need a table to translate on a best effort basis. Much to complicated. + # ISO-8859-1 is good enough. + encoding = "ISO-8859-1" + + self.server = xmlrpclib.Server("http://%s:%s" % (pydev_localhost.get_localhost(), port), encoding=encoding) + + def run(self): + while True: + kill_found = False + commands = [] + command = self.notifications_queue.get(block=True) + if isinstance(command, KillServer): + kill_found = True + else: + assert isinstance(command, ParallelNotification) + commands.append(command.to_tuple()) + + try: + while True: + command = self.notifications_queue.get(block=False) # No block to create a batch. + if isinstance(command, KillServer): + kill_found = True + else: + assert isinstance(command, ParallelNotification) + commands.append(command.to_tuple()) + except: + pass # That's OK, we're getting it until it becomes empty so that we notify multiple at once. + + if commands: + try: + self.server.notifyCommands(commands) + except: + traceback.print_exc() + + if kill_found: + self.finished = True + return + + +# ======================================================================================================================= +# initialize_server +# ======================================================================================================================= +def initialize_server(port, daemon=False): + if _ServerHolder.SERVER is None: + if port is not None: + notifications_queue = Queue() + _ServerHolder.SERVER = ServerFacade(notifications_queue) + _ServerHolder.SERVER_COMM = ServerComm(notifications_queue, port, daemon) + _ServerHolder.SERVER_COMM.start() + else: + # Create a null server, so that we keep the interface even without any connection. + _ServerHolder.SERVER = Null() + _ServerHolder.SERVER_COMM = Null() + + try: + if _ServerHolder.SERVER is not None: + _ServerHolder.SERVER.notifyConnected() + except: + traceback.print_exc() + + +# ======================================================================================================================= +# notifyTest +# ======================================================================================================================= +def notifyTestsCollected(tests_count): + assert tests_count is not None + try: + if _ServerHolder.SERVER is not None: + _ServerHolder.SERVER.notifyTestsCollected(tests_count) + except: + traceback.print_exc() + + +# ======================================================================================================================= +# notifyStartTest +# ======================================================================================================================= +def notifyStartTest(file, test): + """ + @param file: the tests file (c:/temp/test.py) + @param test: the test ran (i.e.: TestCase.test1) + """ + assert file is not None + if test is None: + test = "" # Could happen if we have an import error importing module. + + try: + if _ServerHolder.SERVER is not None: + _ServerHolder.SERVER.notifyStartTest(file, test) + except: + traceback.print_exc() + + +def _encode_if_needed(obj): + # In the java side we expect strings to be ISO-8859-1 (org.python.pydev.debug.pyunit.PyUnitServer.initializeDispatches().new Dispatch() {...}.getAsStr(Object)) + if isinstance(obj, str): # Unicode in py3 + return xmlrpclib.Binary(obj.encode("ISO-8859-1", "xmlcharrefreplace")) + + elif isinstance(obj, bytes): + try: + return xmlrpclib.Binary(obj.decode(sys.stdin.encoding, "replace").encode("ISO-8859-1", "xmlcharrefreplace")) + except: + return xmlrpclib.Binary(obj) # bytes already + + return obj + + +# ======================================================================================================================= +# notifyTest +# ======================================================================================================================= +def notifyTest(cond, captured_output, error_contents, file, test, time): + """ + @param cond: ok, fail, error + @param captured_output: output captured from stdout + @param captured_output: output captured from stderr + @param file: the tests file (c:/temp/test.py) + @param test: the test ran (i.e.: TestCase.test1) + @param time: float with the number of seconds elapsed + """ + if _ServerHolder.SERVER is None: + return + + assert cond is not None + assert captured_output is not None + assert error_contents is not None + assert file is not None + if test is None: + test = "" # Could happen if we have an import error importing module. + assert time is not None + try: + captured_output = _encode_if_needed(captured_output) + error_contents = _encode_if_needed(error_contents) + + _ServerHolder.SERVER.notifyTest(cond, captured_output, error_contents, file, test, time) + except: + traceback.print_exc() + + +# ======================================================================================================================= +# notifyTestRunFinished +# ======================================================================================================================= +def notifyTestRunFinished(total_time): + assert total_time is not None + try: + if _ServerHolder.SERVER is not None: + _ServerHolder.SERVER.notifyTestRunFinished(total_time) + except: + traceback.print_exc() + + +# ======================================================================================================================= +# force_server_kill +# ======================================================================================================================= +def force_server_kill(): + _ServerHolder.SERVER_COMM.notifications_queue.put_nowait(KillServer()) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d861c3b1da4fd27a4adaa492fd468670af845a96 GIT binary patch literal 230 zcmZ8bK?=e!5Nxc12>pXs4|Y+nA_&E!H@$|oS!!&Xgd{EG0lvXE_!193!xu-3 z37XPM1xm{++PyG5s}O33qJ@fQpq#x(v58k}Fx=u&rFoeaXnM2B8|0geMg2><{9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevconsole_code.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevconsole_code.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64049cdd0bfe9afd72f503a06f7df0441a25cce3 GIT binary patch literal 20298 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 AIRF3v literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_additional_thread_info_regular.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_additional_thread_info_regular.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b59c785fc62b134f8a85a2e640f4eccb635bda7 GIT binary patch literal 7861 zcmb_BZEPIJb+h-)``{fvbs~@C9=}f#zbwg>r2`kHS~phe0y5wPP*W6%sa8~nDxm)39|b5%1p@&^ z``+yB9*;VvMbV-3cHYdJH#2YE*UbHMDC8$l{xSRYxmS-6@^6S(#a*sE)uD2iNJQc? zB+DhatRv~jI+M<B)MN-mEX_ve7|g*Msr`l1+d$TG$+yY?kWYBgqzMZM9m( zLseL`YW!iz5AXcD``P!A&-ZDmr-WKj3CJ~i*s`_HA2{^-Jr54327<88Fl%BBrgdWWeyRuC!IqioK`JL zF_T`Br@jopic@9bu#cmRJUs=KyF?~QP9jOi930sXxTI5Zz-C>N6QEmi0rW_2fL_T1 z(1*fL))jn-IwN|yaN*pzB&D^qk`psm*!m`Ovr3}f2$&00HBpm|u!YEZLDiJJamZ{? zXnHOUBcTy`Qd!BU-$RLbgNf%9Ej?Qh7SfrF(PlPD^I~pJ5vZ&xnI+j2rqOElrNm4I zT9m9XpU%yTFB#E2?dhDFmSn5PkK&?Y3WR6yDJ5rZMwkI%FXWXp9F+V{O3vdRjgZL) zj!hNkWFx39s(Cpl30fgWoXgOda4XOxu4 zws+Xvo|+Y@Cgeq?rONEADr=Sm&92mqbVd@&J)L_8m04?wuq4v7nA23FR}(3!ZyLm; z2quFU$c%QA%c2TmNGW-c5Tju>Vgzo&S(L@V6dV?RQ%r-H6(yhI_UJaMHhP7p-+|V< zM6rZ*%(qX&xtLP z3ox`vRaWmNpy1zIGeKzL`Cm{jQWU*Gmg|Poxh3#X(y-xXs(GIz zIw+n5#SKy12gT)6Ts6hTQd}d&rBPfF#f4CupW?I>&yC`gv;#pWf-VF+f;fV11U(3P z5%eMGM=*e35J3U~gf~Ku0=Ul^E>+IVs;EBv^B;_4bJ|F1yO~$vOT4O-t#K z3$nTZwm6cf%Dk+NgO{1f$RpW;oLd^nq-RF*1?`5CJ3c)2(ukVYmSH7}DT!!4b|aW<)xiFBm?7nYJJ-#}D$* z!xqU!*p>RP09MIXd+(ZS(-+mddhi?Dj*!74SnJh0dHl9Nj`!oYQ$I3--vPa!_4nw5 z#}Mz++uGM$AB6SM6NnD!9bNcs+ln!=!+KX7@tEGl@R;6z6!9LtJAvOW{pC~mJ+6

    0UK^ki))WB^kH46%MF4&2}Iw+=H?cQgJjl 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_bytecode_utils.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_bytecode_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03e3dc33202e9ae3755cea2087ca358106e626cc GIT binary patch literal 37592 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 BhY|n) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_bytecode_utils_py311.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_bytecode_utils_py311.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d2ba83da4f197756008529bf8a3ad582184c9ec GIT binary patch literal 4772 zcmb7HTTmO<89pm?S>0Fx!hkHoVw$>2Ktwk2g&}bO8B9WO#web#Q$>={SaIqQVJW7cIuf|GahuG_YXo>`iw1)6sY^n#uDyliFoHy`u5%n_2%3UB)udgZy5)G)A;|O6YPyHY(KLME#NLX7`=NedP zKqY=vtu*lAdpxtOIP28c=F)&_%>}lyX=dU~#BMk%`(U`AY>7czdtx{%n-Z~M7pTQF zR5J07WxrV;%!X%NrgpC37h-%L|wRXT8Mh_n=xuWf$|yci($=y<6`Z z(7FaTT?2PI_1L%;8~-e;Pt0i(bDOcbG85dX@(t*rs1}NDx}s%oo9+#3-thX0-t(f? z^WvuW#d2FGFzT)@&DFI&r*{u&-9wwMAz;0J?CLQ>iD})jO>Ybscb&)=cnnUUBplf% z#Rom}ApaeX1l(YXM;Ww2@iw@%RMxg)qsZZIu#qcGi)h6TpF?q5+R|pEutt?uMYpT= z;%JSUyMfS(Q+1|^-KPp~zf6wPD+*aNvjAVf>epJO)#_VuL#D1pRY$trqSsob!|FHI zW%*{c6uNf$d%SZjBd{|Me>*LmwRXj&y3(QA*y^oP*M1Iv!q&Lf!k+@H9_Yf7Xt`;=UT6)m!lZ{YTcQ)~v*aHXb>2G0A z{i+{&A40FWZpO`x&YIes?yqR8uYnq^A6NQ7ec`**`jr8z39!o4S!EhpWg1##8d_!k zr`3RR(DF(3sR8SB!mXQ7ne>qLuhur&J+-;EmT;Rtw4-Z9_&$L(wVy^2dIppH@fC?l zfDoK#5_nNi4A1n*(Kt7La_01zh|RE%k4{e;0a9~QGiOds&77VZ=VD*|2a16rdkr_q zS;<85l3=u3so`760JnjD!<&@2g;Yi$FvMu$Q?fyiRoM)ulrzbmlnkjtNr*|oaDp?- zi3}zO6b88*q#+~BfrFf!1(d?cijafMqDUNo79h)p8<0s#NlBuNN$@p1Ai`BMssks) zMZs_ZBcT``fH$19upq;Pn+acSj7fwy>}e?_f@dZRCTREam=$3X(9CKtbmX&e1Xj@(_TWSNzz)->n=v{^Az<>Vv>*JO0+|7q4C{bsydIA1!xwf5hBk3R7jKvtq8q z><2k>*rzdlCFXfD4DKl$-wyQ@-8%b%#=dYTq92&h4ouu@(GI-26?*LvqWojjnzI~e zzv;W-TR*RNN44(g#+AE!wz^+=5E$KUA`Fo0JA3tx=e3UK3n$9$&*<#~TKhm@V#hLG zJgWB{*7^=_GKb51*<#DBBgGRN=Sq8r)*Nez59l3>R-7vBjS|`ox*YB;?z=TrTr4h^ z!h|+|!~JFJp0&K*v0v-hztN>fUeY2j-Mw;e&sOUjh4HelQ}^{~zMhYrMf}OzAHTh^ z^qXJY$?JzFwZoJ5+W!*%Q@Hfg^Q8;CenHYMNTs*(yO0p5F&ki%-f`Q%5%R}vy9deI z?;b+I@FPS!LIqbj-1i8%+@ZqsHW*j+j_0(F=QgJG{xPk8?6YY-eqM`%)t0V5k3MJ{CnzzjFo7${ zYJPz(LIfL`_-Y6uj)|{qjj;k((e92SjXV;#aVA9&)e86Pe^vCZPzd84g(z4p|Zo+2sUI zB}7GL7bMIomjre(1sL9Z?6GDPjG79Da|xWtvI|fN!xf4GPsJ*M9nR&4lbM7p55Gys za&&?)lE>tm_2TC1#0;`k9TlxsmT#WQCO$*kmG;VM)*jH?fp8{ai?4 z_z5#0PJ?Ns>Zm9w!Z4ds_RH+z5;!d?g1`e)0+@lb5~5|6!x#RNmNo<;W)+;ev?ftunP&uOQ29r7yR ziXhLJ76N1wICHTo9vRMRB5_&#F6p!{&D%XX@4PopYD3-eP-LoT%Wu;xfU-9fA#f$ zX^pPE{$*=)L)mH_f-vUjEjT}K?cX?eXZEws(rXt=bMqzs(pGBLKBMQ`k6L)RlBX`&Q-Vemxwiahv?WB z$ny||9-@6aw13s{H&@Hrk4vGEE!Rt{_Fbo+3akfr5i}e8W70fg`>D=<{*3COf~JZ8 E0v6m$zW@LL literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_code_to_source.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_code_to_source.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9c3e21735bbedab9f85919e208946518fed477a GIT binary patch literal 27356 zcmchA32(3+vLfSbM2(Y*ZqhMbXD3Q_J65)xiQDb8?sVD(3}^u(%vNdLolTD&TGUQA z-nQG{|9b}>z$aNsJN<_E-h1DD{_pSOzqQ*f9NfR2ICFlfpX2@$eaOxvy{!M9j^nOz z0q!gp-~+mG{w$BDeq1-9Kda{{%rI`4FrGECcip(@tcj&7Ia`9KaojvndbX73blhPs zV0x1almspB>&3FqT6G-0q>9ek3clM*kM}rf=$!Nqo5*CEuNOXM0D+H&6U<84b#WEh640=C? zD_ZJ^8C@0BhvO@4_^9M z--MTIT#&JO)M|(7`tZ^ze-{2A?r!@}G_lk6av)b5Uk&W{$SsdIh{|+<7j> z`SB*Y8SXuvnpf&aPogwT@9{Z9Bse}Ap)$Omf2(_9GTJ@T{agg2(>)MG8gIW43WU1* zgOQ8T@KiU(Vk{W#os5LejR(6YW`dKKy2nH3x~FEM7s8W0T|0JmN6`6gQ)t-m`Cz1* zP0`d$xBpUbG7uJm0VKsR1iJm=(|>MyGJv9_uaR&d=#Pf|k?^!I66~6q$(j8a$WYYp zpLK}+?UDnii;+@z^IW#p6E}RbY@PZ!LSrC18Vfca`|xrNqcJAOsGeh#qR7Sg_oZ>= zxfxENYJ56@;Aze@JT-;R;L}E*`tZ522-WHJ3U&%GOif2F%vz<^(nmFdBUSL`xjSat z)w0WF8FNF@+^{rq+uSTT5K%CRN~8B8=203QP#S$2tsVT;-@(bP)=!0}1S>U!%{6PP zP=oJTi`>%iR4v83;9*D|l~=!V`70SmQ_|72+?;Z>Cd{p@t%E)j&C2BPM9}ZgS^WNq zaA10z-fe#WtJA~dVvJCRa)e6qsG9dUmRYQ~ghI(H$1g(Oo7`O;Z>+y-(iu0en|WiK zn3~cIjKEWzQF>e7g%|Z631Wu;CFw_v0RupdAz-APLP!ZHs|0>Yu;i?HhWDAVbB4kf zgOh^-P20c-RU$iO>|en!VeEPJ28!vU%Ho>l1#?V~SS4igWK8$9gHfflF|%A~{u$Ga zF`S$ap*MM{3Fd&Vpv1N)ttjRmoUHs4O8P=RgMAg9hhV@A0x*it+u!Z7<^Endm(n;I5|C%hp)0qA`j zg7ctsLtHd`aYNXY5DE*S=*)(Q;ZZ>54WZc0{_to~)zq*P!@@B?Y^o85W{sEeVrAm#9e3A+V> zZxl>HSZFdB3Cj0sw*y0O&(hkpj?LDd~6M&2wv2oU0*j zxMIy(%f1~-S{t*jx_JLLkKA$8B^+(5m37yiTzqo5Gt;~)*}N-VxjWm~w9xcuQ%Y@3p{O&MEr($>7Z7J)$Us2zk48U?_jZQNn2aS zwk2uXvVz!ce{JF_n||DzXnHJFu{UAcD^8m-H7H-1wr}C%QShq_4d;Lrw5GD3dl_(V zP8Z`f2VbX!5#%A~xhstZES%F4v0)U4*Dw;EnqecFGfhtgK;Py};`a3ECHh0a&MlGl zXoQv{cA7|uIL`;81zUR7C5?J<#4%)xJPi+szpNrt=1rD)Gi9yGver~tdt9G&c`~jY zN!O0M9ADZVKb*BWu0C`5nT6M`eP!`0w{2}}dIaBbRKzVCN1G5f+a�jEi0hqq$) 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_collect_bytecode_info.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_collect_bytecode_info.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6af44e382a2580d8ebb19e514544886940bc0b48 GIT binary patch literal 35204 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 SmDF?kebQ$s|3NR(V-!8NUp8>u zMb5{$IiJR-9n-iq>{sj7;#W7O3+UZ?4aMol41pYXPQd6kvUdaCO>Q&u=ZskbR<|`^ zbK3&B?%Y70J1<~&+XMOT{6K-bAW-No3>3MG0>$p)K#98~Q0guXINT1F*Em)dD0i1L zzjmy`U4gnxW0ip_cNGgWk5vb1+%)h)QUO2Ws(B5X9uO53m;C8#2zh>--KhF@+SEZdQI{xzX<(Md6Rqy&6oVj?@{BEn8EHR-G|*zxjpWu-CnoJZ{zd)xgi^J ze59n5eC{LuJQnveDMa~o4{N#YoUis}&gb;Ey{i*q+&&gshtT@8P(KT8KxkuH=uuzO z%bfd|uNm%f-x9bZz83eW&*eVB(zhc0QvaA-c7TPpA#|BPAcv0o+L1Hp>wtTbrC5#> zE7DRt<6DV1-nR;Fh^6R6iq&Z;!u}H9nwPnE#m{q3uvBZ2YF%2YQ!I2nLc7vJPy05Y z+-H3o;ZFKC!JR^Bo6|~r&bI}j5#J+lr+wXUpZ6W{ZGBnee!-{pp7He{Wq`L-eSW#4wVzwaCN?LeMC@b%;ETfUueXUv?>=i7zQv#f2q(Y8HlZTmJ09YE;b zw9r3fq5BZ}Xj5_zf1 zPLBDXb%w(H#Bg|m_qQQGD-Y4UA0gv@pA+Np*q+^JD28{RaXGg-WjD#mf#>RxTAymbB zFC&HOi}E2T{sGT;@F+&z$yyUW&XzOvm-93h2vzO(iNm#8C`9bJ!2^T)`UZN_3Rb>{ z`Uag(&@&YF4xeaCOXYNiCPK7&zriOd#h`^DfM0^dLUAFf-<34?^L_P>36I>rYs9ZW z?}**AMyRi6Pp>$cJ(&wd>7ECV2VmI*KqPhEHy>{^;2i6rdpcn}_@J*6Dwn@$t&n|i zsBfRAe_&{Dc4^8t2~G8kNRwqdjo$HRc>UvUiz1(LgMKY(^* z`|iD4yLY1^dA|v@it}fM2wex!_^p6SyOg|wPwBCvBV+!Kv5|3X(ZV7-g26s9`=i*QBCw=6-FL8i_W{64Pv2wvuzw8p@5L^ll;eLEyIqJ@ zVRpOeou<`Tn40US{Z+s@Xof4<#2Q7QNj1_qux?8)QK>OK^j^P&5D|o611yc4xDTul zp&9$M$NG9QK8uQ@io`aht?Wbl`_TnMdp$kaKlh5$ivWt4R9rArYR``Df$e?rL=+Q< z>w*#hJWxry`v>~ONO9`3$iCfsyHUvAUNLf|IJqg3dZuUZo_)LfhA<4`rpX%23R;Q1 zoIOH8z5V<9dWJlE4-D-)FeF4My$IaI?+pMJ2Qf#B!>Cd>%Igcb@rwUFnlxl0Cz zdQsC7XNz21aC~giDFnM%`@UL9LMke+Z~uO^@(}#Z%0v68Jz2#b2?Bi(yTfI%tdIUe65C$*#)jOs}k$;l@DJ$DPAKe}pzHvsl*49|W3# z=Yzbk64py!g6`P6|K6fA3x5z!BoR$m?0)_fK7-cY#5k5XCKXc8pb5WAo6?6z0{&Fq z5X1a1kwJ`%hbcuUIDEn%cIBq*y+rEt18Lh49P|14l%;>rbEtoyckiLWlo|e=j}PtG zJCHI`aQEPzR3SY39$&S_vvER5j}HKf07`m>`uFrW6&R#VlpCZgJJ*4{_!C%k1tJ?r@v*CfKe$FNN&#& zZ^-Wn4IlRhys2CGK()GLHTQVKas5{vP6tKG8x9m`TQQx zQ)8?yF#=>ClI2O|1w7%&lYW;eWfkfR1po$8Wkk_}B=-c5jAAW$2zv;5PWUHN)eN1R z^mva1Cos<#z3CY_>KXU@LAa(0M?xdx03|es(BGK*zLafnIC#>(Utk!d>=-pFPL4JV zVd?Ox>XDFVSO85@w*^4fihgvD@YSBN;IWkHXh>)VzQpX81`IFx9`;=xfgs0hMOY;* z2sx35rlS7{Xao;{V_HuD&kBLeMnzS=kr2&CA*tM$plq(S;Ub0z=aExIGg`x9M$41T5`Bzq!o36QL=S$3wl~@uXTj z={@T4V0H$G8-_(T?h&>L&+u3<jHav@a&#?3GgUaYh*&2QrI zr7WJKd@$e{1!)Svb8i9`=4m4`iAMPFxjbKG} z1Sb9Cr$9*@=@7QlRqZQQc7!lVmYu|k^d9qvI@q3daDPKTt#H|-FXwhz5B z?n6-`0HdC0KRL;7MWd!l(tEgF>iO3Z6>`Hl!zJxSQG0FFR10^(RF*K+#Y}axjdO;1 zQ+sl0?~H!l)N-@9Y({_1oOD#+$CfN^U~dg;DAM^^OZT zM`m}*HN1_;P%WG@+=9I>VP6`vFP+;FUDF?RKb3Hg$K2!d_F&W$6naHorN}^E$a>{T zc(C%hQT%2W z^zsm^&OeUXn#%PaC3FS^h=1giAE{X<>3qZClu1sN(JA{;+*DO&r(|~Z|A-VJ7aUBr zvZ^;Nmo161^|7+`UvL_8%gm0XtvF$;kJ;*HSKY8Jxurv(&_^=lLsqJi^-()K51l!j z^5v5pe-K$*S^@GD`+^=~r-@slfOWj1VV@bI3dNzOp_r=6_$sxW{}YmhNM3h_`onZs+@$6-_pI)5?z9H` z4(s{f(4qo}*8y?o`;b}y^LotdQz>1*`)ta%cd(DhFPA}>;`-3Yls{z=b{7w_rF7uI zq%?epmKKBT3<#tQSR7v8RAI*4U|}C2Vd#B0nCE$g3*}XphTeSg@{{rM)|s72d--M^2X~o5{3uEVX$=dq!`tRESP|sU#BC_|o-6=-SuAc3UmbxfS!<&)Ik-6TvzG&@A zIr*Yqms^=EF1y%&q5tB*g@GTgnhnp5#+IzR+8A%x5-)z_yyjL8S6qU!leYXK zrS6!m`a8Q9n>c&Xmv^eT;!3Q&+{(`!6^lCj-VG5p^+8q3)@ts*EP1fU+A@5IJVWKU zh;|UG>Z{LCpI)Aax`+<*5ZDvup{8svGHGjN+a&+?mp z!t)#Q@|2rRPE0wPk|{k=Lu_L5UWyxrJq9?R+=pTUmLsvWC_4J=?4X75xj_ zVl|s@#avk}=37DSXO%UWZw0mDe9Nues^LD=n78KYKD24zX3RJ0T{hqL19B3)^l7Fw z<_x$g$^3!&a%%HVil5eo<^2)(GK~fv%tL~y8^bd68kI*>NWoI+r1Y#7s}dvmq*^r8 zwg;Cb&o~WsW3<^Om7)CdnsXuS=XNDT^7#x>OZa8s0x1+}fdgbeQkzCgvSaYwIX&+kUGJ`?MqZ=t1*d&^Pq3)+9CHEDe;_t{tMW3$wP|4x0Z zJ+C>}jIW}P&w3C_sAJX>(Mdg~;gGi%yEOod}Y6Zgbq&D&eD5F7&QGR`PsSK=$Mk#!>S@J2rzWfuwfcVmf z%xBai)rpbQs?N4TUy+n%T8|Z?%v`-sn=$(gU#U%<4{1|z7^_-%Mwd!H!FG;5e)2+R_w!9 zz~f&F$_RK7wIRG*s_VtVaE2ZQOz$q`V>WMY3T@nIxvMe%hV?<& ze(5tsMoO2nDTM!)DczPWTc&DyyyHv4r2In+7bh4l5^syrwY$oBBF*?9IZu<*2`6P> z6{jj5z}U$X2r{XYQx+z436aP*rGqdvWgvmgN&K7~8wvBrsqB7oc2NZ;(qUj}iv%tw zSfL7IGi8Lr7co}(Fy)|Gk}Bx!+j?NTXJ~(SPoHOZ-@(4!soZ{O3+(mm>FXZoAK0GK z5f5F5T2pq3eI)UgbfL+RD@VZ5tm23;YC%uaB9)slQYk&y@u5`CaKJ}g1)=~6jgt^L zBe5j-iSeo8^r_G;hW=A7b4SIc&Q~XAyTAARLRsCL_RIEYi+8^42#~cz+1gmy+WE5e$+DU|yR}?y z=_`BB?u}M0zhPUk*stY~!qIx&(V8rC-gH!6eBr_i(IxBW9bF5}uDQk^wZ7B(Zd;;t zW2|-K)uC%E;;ntxys_3D@#g+ZR+giF_Q-Wd%gxH#*|mSXCE2$8M?2rydF8oyThFCE zH(T2-?fSg7es)v5cEy!Puh*_waJt^Mzh#du=jWZFq_Z*M+!AwcnRj+4oy~WSYBJjf zgb*oeS6;7O`I)n2F^8+JOH{3oRjt3;_}8sJX}uPhuNwNhGAAOcoNsQrylKucU%4XL zuw+g*S2(-=a_`ORx;GDBK0LR2zWSlTmwN9MgD|?(Ia@Yg)Ji?O;qr#r)A7m<^ledn zqNp=g)Ol5Ny=eVHarMQ$7xqRQyRUW57w@1ho4POshM6YrXg#lA)EWzhGz-HBZ%&4w|}?NW{5 zq~?npt)b}oINWL#xiwreiwAu~zx9X*oOJepV zab(pV&=^)yQr9B$elf1q8aCZFX$+5O*ypnb45M!Op`oScHV-FV$_B}n4pK3_-=Ic} zO5_6MaEgLGN#H1b9xE}!k<;ta(i&au`#L@WT- zkAkFLHka+>3wM6XP1z=qd^3#Bxp1RS!S(bB8{yfOyLmIu#hpDvy3LMv6|)1#I5mW`BE z_lElPV4P|daD48_Luv;*L0M1dCiMj7)%s6!?k(Eb7%3^wo>7^QR9fQ8QAQQad5JY| z9GF_pRtBlG2|8{##Q+gGDJT)e0@8#XGq5aMw#)*$13z~)mMPnwppVpIaQ>hv#Avpu zrhaIGK?>?@@%nr?3xS*gDA%}1yMO!`&JB!H+Nq6G`(?omPUjCOJ5HuHdG22bXbFeBng~VD9YoK{q?!!dt2{?tT#=v1uo^t|oaMH81>@XGG9yA!t7n5}iL^G93W*)nh20IqSO)OEeo zm0aHWW83?-#Pa^w^8WbpU0-lH1&1}U;VJ6r?ciI%MDylY^XBW0&4dCI z_xSlM&&`+h5I@;;*_0^jjFoj>8TzsNefPD(YeS!IxKVcKb0KAP$v|}96F179T+F3{ zfyFo~QS*&b*O!a=8sTFSw%VAjHtKxp*EY}H5b;}H>b3Ufb06h9db5NX)M*Uj9f9Y5 z$lrrl%3!C+Eag!`p0b`u8f23YBE2wWj3OSGhFWA}eN6h;kTr~I@<%_7sS|ad;cl92 zuh`B4DXNN@s^(2KY;VYvM-E`u`WHydlVpIuNDl2ZX^0NZ9|7AT{6#<}2FUlC`ubNuotP@ zvJ`&8Rw=gicK52-+@; z0rwyN_%b~|+2XP)c$FZtZSkac`U5nC1PqM6KV^87G*E%^6X%6#qw-5B+)7$+rv&Z3 zl##SkFba9ge)rfn5Z=)D$$5)GYb{YH`^|^z19w- z%)VePPgt8`)~2|1$=tf@R`7JHW_rJ~`(|Yg{RqgKJjAF)o-PORazD@&s>UXso(pN| zQA68E;-eq{lUkh3)J+wj=jcG4q6WH+bVq1!7EF;EMur#GK#hC11E+@-fV`^ucf;9g_p|m&S@cXEZoj z*(ANG36RidvKU56myYe9`}IR=P8XFLz~HB8&mOhi76N!5!~0dJ4u0q%HOazC65yiU zD!n?YLL(@&fYRsVM#7FC=Oi%(L^ThDyNU_|*d~U@NwhdD2`Ge;zD|BgSQBoQ`U?F5 zmI=P8O$t$d`L*|%*D69UWiBe>p3#*`S(49ZWGY9NFww#6QF20@bXWPdul`+99+zpV znw`xc%~_^pdz!Xip#H+4OWfbd98NE190M$id>p4WJtVjGHQ=ps=*#?uUkg6&aTeZ-aH%YDFX+=ONGUoT6 zl9Sj~znjaPN?nvIuri)*-I$Hfg7HblWrZ)|yc z=UY1yjeW7kKInp!bX_t*c91A*i119;MBbj1_FYi2|;i~E>%@pBMKiMe_Kq#1 zw7a2c4BAVYZ3gc5t9m-Px3;c>_op45ea*U$8f*LX+K+V__&?Tb`%H$9a}4CSYWiH< z$Mwu@&?5cEO)O2bj>28qZCc&OOR318X?5fpx^3Hwb)OVyw>!8`iZtXe){)=g*xr60 zw)z@0>wf5o+HNdCib0uu%(|?n-C6(e7{TdLP z58Ou7h)tsae|Dif@C$$jAH`v#AU~NZ2zXEUAt8nOy-1?)e}zN}H7a3sCLv8GYR8Df zsk#ghp+=bggvOx{<)-0wqM$6{SQc|EOE|W~99ypGKe2pZi92?Y8ZabFRWV!DrN`!N z%_`co1N`?<9teai67~|cek(cbJBrEYB!{3GPZLFzqP;>9|?kJCpyzWEonJm|^oK8V{ z!ZM3N(ocZ~kBsc_^@>hxs0w;GDooR`jMjwnrDg!{r@4OPq`u%`4U!AS%^k&bBc8Jlpbc$oLoIRqh2JOslpppc)^Onn(1Y{FWr zA#b6;@w)McmG7O17j(_!{H?X*jgh3SFk!2Pw(sks^R1h%K6As?{kH{WX`%16UDeFn zx^9~CUa_9Fo*%l@d4Bi2sV-^COPI=Irt(XT^QPKG3uh}lv**h@X3kdf1*bLSA)dHP z=itd*G$24^ux-uRYT-V#RBmm`+y>X z(#SLRymp#c4%*i^AGCO1(ay#I%Tb>i2&Zqk;p(mT6yiL5dx5N;(O>}WSI(C zkkKmrwBf^r+ z(}goRP;VadPZjkDWwE$nIz{UDO;z>;C&qkE99MKwtC*D@G>Mq@765pf>!}>!xC!Ig z(0XL&y$mODAU@2`umqtnIORO!((^xHAzoGiPmDC4@DFI}P|H)A5c>>h{^OjFW!!&S zTvbr!2S0+pM>EI9RFK3K$p1Zxn5U&T3lAOisG6;x>zp?&Khq6HI;{=!E2gui^9ARu zH%m${9=>q+RnJ+=jDE(K%wKh-_sW{91y?(-Hb?WiXLJju+?nCmb#w^khN)q}RPajP z*}U_ic~j-hs_Hj)T;B28PAtM1%lSSrF6wBTH!Zt~DvW21IDlm@kDAJXgklLIMZ#1W zGgU^bx~}%lo4T)Q8i`uaerT{QgeM zSChx-e~0aND(#khP)twjpKyZ|uJDW0I7Fi^DV_40u9_|Z#%TjaZ>f?-@+s=O1R6(| zN#V-xJ&1>DIX;tA6F{p7jMWd@`pgkMHW6-up%HdL}*09VKJgNoSq9<+;xH?r5 zY67(8VQIBrA+3(7=l+MUobqp!lo?;yF11_v^;t7ly}X6krW_)i7k3dtWIAXoQGh%o zyVyROLS2y5()we227d~^-_Q=8DrIN;$)L)>09iv3Z8ZFb@Th^QJaMn^(~dyfNPGHD zAyzI{fJ$6t3hd{9MaAdRMgbPTpyj>lH6hS!LuD-r~ z-MfL^rSiHZLv&1n%ueR;F_sRnnA8`bdG2rO&x{}t)} zo;Ipq!NEqQ&;8cGiv!W3mbu0&`g#58&r7P#3@q5I684suy=AU=E_~(Dzp}>dyN_n>y2{5(x5f*5 zW{hIH&L5gLRg>R*)_lJ6Qt^3gueDO#(7dTa+;=b4%xPvrb9KW0i_=mwrZ4X-<8mus z-yXF#f`w(sO_^-qSQ&DEdk50-uMqy(ebUR}i=~;n`ueM#*NW#&+t|KN6zT`7o3=G_ zA69m3>*9WD?bx2r{d7ae_9pJ5rQPeccX2;!v~OFh``H=|xn1_{xw=nm8gldP+v|0o z)M?0VvTt9j`(%xV+^&ip#X4b)K8xaq@h3kL6?&UsM3(&3$P6;*nL!2vlc(k|GYdw) z(QShK$doGShk-7B+&d=7N_&Lk^i%%{*c%I$bjM*Y0X8m=(cxpzJiZRW*dYMGkx6EP zM#4%(do@EqR6!j{M(2RHj_{;(Psf*snY~D6J1-Or_>~%tdr!fLThMug3|)~eMbVZX znF4}Q9Oz;Ui!$6$yAw5p{H#%g6svv(naqQ2AjlFeP`sdDAk=69!(++#iC{HzAmive zbtmB|w>PrxWX2ib6CS3;Cht8=jw^LP_BKdT#r>6&l`Hirv!F6cHdJx~ewab^@#j!l zD(3{u)Eo=FBb;mHH7J$`I>oVAIxov*ooHpelc^fjPnCt7Eoe`Oa0~F&%IhJx%uAM5 z;l~OsW&D`g+jp!2gH3Kb(gV*FFwUppxgUc~INtoMCRBsH{A^DREa50ky-r>kJBgN04o@fDGAY;jnky zbA&i(!c_7cnVf1-@4S0cwo^9};=|ZtuRMSD`PuTAz4f~N;GFMA!Upde8MID@c;R>r05SGXg{oO1HMVnERkOzq>J$gF*xrE&JOC;lN@&4HVKRZ+TdXlWsaee7 z@*OYk5ZXZ5)OSNCV$ya)1Jgv(VL#+xs7O!xNRt{E9;j384A{%+9v3yBGq(p?)NFeQ zv+_wNgAu!5%?1!O@Q;D07MHJHSgOp%kGuqxWh-%%uw3Q2!7TRhn^5;QoK9yww-qlq zT_r*}o?w4UKL-4oh#K`hr1ha6E$=5iG$ynalANaOQqOhC0L|y7>V&B|W@?5_gU7Gt zL{0my6<;^)`?M6!&9Z9jHMtAL&Q}MZ$!xwCHljdb(a@J&gkgwxv_Qq##K0{M!r41f zNrk6*G}Za=Cf^IicTwYM#F&uj-d4z5miJgI)EDk*Vj-$RVctT}l>RA$T8HLj)IoSY&<}({}0d`~o ziz511a<)=KiLd)IcUzldX!s&uV<^6zlVj)*AOoezV5!keV{n?Vulpf5Y64GMDsWGtkpjm?xNtRCa}OZ=qlOz<}nl+6C5a!xb-MJ6@_oZp2+0;x&b z0huz1e5Q-wQ8M$@=!ZkpR~wKRgKDuSER``!Wx}#FW?4GdJ@-u9vf@ln(rEiu4C_!1p@iSSxByuDFFq2{l4cbFNa0b#U`}cH zHUK{DDUNS}potb~)&rd{G@Txwt{g7-ONNJ(2?RP~nAVPP(>V`L`QTxhHb#su=0}VX z?NMzcM>(Amk%a&R5FS#MqS~OiM}HX zJ5GTc=$tB{5aE;sJ99$ECvYDAPf+^Q+OJT6TJEX#uamLMIn|tzevs@7i*2G~F+x+j zob^-2dS`okyVEi>Rh^MTYCr5JhK_@gF}40d(d=#n(n$B7JUKQ=HF(F_9T+&4Vwoxy z&c_HvQY01SDiOqMMxiYs{srp&-zVoIIH>~h#3~yHW=Az;!eN}iFwDuO^e}2VnKD2x zFA(BaP@Xg7&}Na!VRw3jc*tcCurhuz`x%!6b#HM}shlC>{9>2gTzxDLYC3(z6tZ-w8v!QkongD5W{d z6y-w1op#EPV1=o8MC4?NnS^sY9cb2JEacFCfrn_w6^71a9aN8MlGf6wwLV$VG_xyd zulQlZ+e_bqg}`OWqS8xCV?|BL<`s$NwXx>4P@Zevcy)iQ`H}N`laA*18h*6&oux6y z>SXikOV*oJHIV)-6ck^qyij?u_CoD!WxQb7Oit2T5Vck(m#w<;M6|6t3hDom+0xfW zV>Z{{S&J4NEeXepm}AA2mbhcX%#MX6t#3c~)^mv^Yhz2+#+R&5EZGuUvL(Kx8(iSr z0a$KoIB&glaG|(icH7*}c=1};hAJw)uqo*%qhs#T`jzvJRmrOAOT(A=OWQ7KK9`HH zi#s~6n&OT}lIyoztBkJO6D@PSS3h^~-PY@6tHCZt;kOF8{JPKVj?23i@||xLT_2se ze)@$)j$6{L{RfUK*sA@k07`rmb1WEbe&$9#|5-tm5b)GUwE4u1{4wYzv}CsVIBRpx zB`Xrn7Dbx}qK`fqYko578HqKI%;%3LUCW~R&7T)J6GbgCFvCmdi^X0ed77rqia8%*S_i{-7mS`^(p6wf;V{b%&g+>AXwIg!F9SNLa?9hJROAUI;#NbV9|VJj7$|X4dRjT5_||#LqJo5 zxHy4g&{(#(p)kkbC#z1ly#O}(kq6dKpt*o(80;RKWJQNy*7YPfz-Xt}sayo%5?H~* zq*)|AgzM6<-^RShkf&jA(qxcQ;uo?wSy={>I~ku<(}Gu&Q_@NMG@OgzSk@y=n@A4f zAjl`nu^ES&m{9Ct+&jX|*~1JC%ijbXE$ysN1PUk~tDKU!*RuRxItiDX#$qs@#;qB= z|0s#Nj>336v&1VXH=8_?3KfI&dOFUN(tC~u!Z^V%sA#ZZ0S{^nHn+!MhZ=MW40HQ@ zIP4jO^g*&yO%g!xly;(7Y}XL@yu0w4sT-nILevA9+k(JLuT@`6 zGV|k)X@?j_W;!vH#_pImtz9UszIfuo2^i@sZ6Wshf?#UzHS6rLSlKe-eqhJI56*ZC zeD`7p-pt9WC1i=WJn0|~i4DBRwrv_R!Yi6mMTPQ1vw+P%5*23XfXGP{k32tAITd6i zjFGPLyu3GOh9cGj&xKFxeMF7v`3_~y!lV{VkxKdnp?ct-vVxXU7cf+O3q8|0z{ZJ@ zmi45iFo0vOQ#&rGW=M}@F={#?2$ffZQWdQWwX;GIt&K2lSvMdphpM?bD9DMWWA(_2 zo76k_!-`U)34Gjy1`-tTbOiNDDYeX7*A0lK|6%RI0{|via)(A@0m(>6q#<9X#N*md zn6ZEZ6-t6v{2B^aO->!XYT!#50n(Xmr495}fH&Y!Cj$_L!G1D~ZV0$tHN)*#B-zvU*k$=YUnbr3FLzf0-7|Y} z3@}l=I##^;iZ@=oZl-Thn`$&&l;CXl-4HFQ4>ojH_Ox+7ZOiFdnW;2Jz=8pcQ}Eo6!}a1aXlbT{ z8Kk90jRk`VEJS9w(h|mvth5oyam33KczQZEGtwvmD<;alJjts2j51?H{*(rmMB0$R zS?#Z^Kf69^btY|g!AK4>L*4oI`nT54+sKR(1ULPV=Gf{On+hi&j|t7XxkXTKp$~qL ztfCn4!d|CHEwVU|D`>`(^F3-Au}Ebxh0U-{bE}H!mp3NtYh(7cal^V>+A={4ef=W& zZgooWtq>%}4NGrnb%ts>e%;1=0@sqtAEt#YJ>+L&`XM~&n}Bla0DwmS;yQL4fC64& zEFxl1*wE~aI)ObHH-jRoR&;I=DsK=GgBk#rwi(6}mjRwsE;=YrIgSiQxL(m9CVNA$ zY!186B)x#zX|8aqg>*%RnE|YnLof~}UYj`vAml&E&WxYqy$H6dC!f05_h;6ty-vL?`6!O5?TJAH#OWe+7d?Bb)##+RC+!%*Zyl0 z&Sr6@R)JY7k0ol9=Mfb2?>CRYV14mv%p<*`vIj=0JZmC3$`SUAP@13Y!Mw^*WL0U% zfy~N9yo|V}#mkIR#LK9xa{d9K3KE;6#>UK;m!(pBlwZtCqV?E=d1=U=m;4@diz`={ zgGF?7Z*Wide%whUUFFB`MFM^wIggUVw8qNCIY_t8z^DjaOyvn4Jqkosyhz8xE~J5Z zk&!WMhb)H8Q=V*m@Pp(Gk;7)4QJHnA9I+T%Mpl}J`~h-)fG@dc?@W~`laDn?oPsz` zbQqbEH2Wrz@jk!kR){7X` ztLvn2y1a0p?=hNYxEPBrpp}bPnSyfM07SnUng!oM!}xEL!{{#aQQWu8_-mr&%j{HM z%0x-C!InS{$udIqE|$q6GD8|#f?~ip%jYWSijizBBZ2n0Ng7Ds$rGTFG}Oq)28RvM z6k3$AtErMN?;;gFBvyLyhY%OZgCc~pI3fUK*rJ3-bP7beZweVw0)pw%Ae2m?Am;=4 zG{~dCCv`GJr;yqTBtoe)@3S81Yf-Aa!vbdMJaTK;o7^77Q~=TxN`--Rq9Mw96gbIt zV@MuPAcd<~p%!>D93#vu6_Cef8?3F;r8cW~;~f;w;2e#%6OTY3kdS+-Q9>Q>GgTQ1`6bO$QcnTE%S8UI zwwX;}mL`fCV?~WKy~(8=KicrlhMC@ZTT8OOnOMH$uZ4wD`gJZeK+ECn$+sqdu$jFh z{O!$e3I2sTA}bzy>#-j|iD=$dlU&w8zpcr(cKUTK)V9!X6+1TB6tgwq?vzCbXDer` z0(ast1Ql9i^2l6RT zcC=i4q{%yNI0pU!SrJiRmg@WgX<3nUR}F;#PeA{kEH8v)wSmb_b5xH?n$#qTKr3Vf zT&fN7y(T?c8eS@WMMSo`Hl3>&IUglbC+mUYfhCeVqIu6M^~`i0zIb_7GQ5tix;IR* z?GPqe40|AB&GXsb%Y9b_ph_zzHCYEag_8?UN?Zv#(1x$5mP%5SN=oDNB<9$(dD=2< z^%+L%q#Vkxa`I%fQ3;iN5p%>6u}YjIsfE)vNQv?1Gx|)g>yK%sbH<(2CZBoQ7M1~> zn!GY1oA1|fG;h+aew_Oo@z`D7RI7zROc$^?T;(oZ-H0n0VU-AqsiN(-E|v(_T!IE5 zTM$r0-Gr40>kf2DAg(8(H~!z^Q>Kg?{d8^3X12Tm*tQ`sWniK;7*)lsg{eZB^}XMZ zo6<-zda8S)1lWZ8Kb^~PB`9Nqi=27+0zko99@sU^TAp0gW}Iuq1(awCX%G*+qe&TY zH6dBMc2%X!P&mdNj^p7FPsWh=4z!7<>7=v;QZlhEsT|n02zbN%OO$GaKC?__JPC}W zkO%j;;bJO2Wh1_k)QD6my)n!cUnK{_z&50tWFJFH?ZG`>-jr#Vf079}1$ib^*@hXV z#{ZC7W|qG=l`k|%u^KKME1}uV6V5N(C6;$&g0OAL+(;T1qKeA1Fodj+ZiWTVY!?L? z#nI(M^pQo-QrXIo z%k5)U=xOSuJ%Z%2LdNFPJC}_m|A#2egk=``J$QhIS-66-1iLoo4D?tV5*2G=6>Fk; z2X>t^eGA6&XvMPkBJ;+L$^3>HL$YQ?qNX=i(;LNUMoUq`QW3LMoatFG=FNo8_s<(^ zl6eKMoH%>p4+As0oB4%j`WLnN23QcuF>lo*9k4;Z8gkBrV{6Q@HQIA9?l?5F1B~pN z=0x?zSoOwhMW6OXt2f50_tV`)TQ%p+$^7y}zB2})UwNW#ZLDtX)t+eG+IZa~H}bo2 zjTqA0DFf?fwmfcKdZu@wd}*S*D^}ihb?v9yVDRwM&GY5%sJ=9*H-BsQi@Ov0s+hj& zb@zLgE8Wqx{n5cg^VN^t&_Dj=odzzy3{{#7KC|WHyob5qw~H1NwcBW}TyQqLZF|f1 zgFKwLp6NMXb_s@2iZ3p?u;g`DqM|ca(Fv=>E!VcjE4IfAcg*x8>z7^`zP3K<^T*1M zM$3+!?S}wSXRb^Z9+>HYIY!Cs)x51SSyu7w{(lPfU?P3cRM~6gKIFQ3E4YuW=3a;H zqhc-jOEu(o=*VB8-Ik;KsJc6+uTlGPg9a}jH&$-b7(U)&fPWap$Pe~+_S|m9Pa1I~ z6GnbRhD0%k8SpKVAjo#*3fj9>m_l?M!Vh`d*aW)?-7AaUen+%Z#`y;(c@lRSpMF3S2dlqP*j8@3Km=iGo1see(VFVe@ zZf}8FTCG(3s8jMOzY$q2ZQ2ZkQ)LX&^4BZ*Bp(E##)$bn`H-xHdVtrNqpCQi+Q$*2 zf{rLHlF%8TgD3Q0L8!GZ-H00y^cJaI%CGA2T2-TAsDU>3tVilyx#yuKH%i(+S&x(s zU#?LzA2zx=D+695@|{ZH^lE`j%19@U*MgF~&ljy%DM|HT z7PZPy9>dF1dJIG;Wgs~upVFL2=@7&JF}029OjAc><6DBBe7VZ*+0M8LU9@*lHv`?u zsWP`L6jr?23RD3iss6M5=Z}H*U#MS}s2_;c55Okc`JszXU3dztfx~YdzS8^So$v32 z4JG>r_S-sb1F(?Vnf~+7(ovQ&TrQBTtUhnT;nd=?OQu)BR!A0C&sJYAZokr!SlJs} z*_&9oC$@4=^wFoTuYBspk??|}`jT(H<&k+u_j#pSPVhXk>NES2RR)X)uqHJ6^b zaN@jfp?P_tc~`7?*QY)4=6%up1~SzK!Q|_$iHeR`MaLE0l}DqyJ@XY$&*ys~w@l=( ziRG`k68`ZE@4xV==5IQq`v!lx{zm=**fT@Hi?C;w&p!1yu|^6@E_Ph#NEB{}6>hlN z``3GZvggxPzuNfojlbL+FLcY@a&A|q$c}D~{c^z$JWXqEk;~|e6_PpW!~gp59gaJu z*{Wqfz1l^N>(gx0-sZTX?OLHsc14D83GJ`JNHL(8yCKqhercO^TORkbyzY|i%{V-( zfjjVyF`KJ$iRR8$a_H!QDu3lWG)u@?P6JNIX~^DG^A~!9!MO+{%FbKb8bb>S?gSs> zZ!AXA4Ws+)h6Vwu3k$cu6n z9PAh5G%J{Fz`7?6 zA3aP{EPyl*!AFbBFYdaqYgQjGZkjz3E2di_%t--P#q~g!*1j4+h%Mb)?6{0 zDBk-X{-w#mrr9510p>`S8?qjRer2_xca1`3VBi`x6`}i> z5q4%(iPtohe*?;@zc+;{<|;2TlFAbs?LO_08EZ?$ zjamonOtOrnBVPF~ls)Ch#-O|eH@lp!l9YuG5{Oz&3em_ADLWxIU@QT1fkybVVSyuO zKI%C(7ChpGPNL~3Zl#AxYA96}CYBpS8!*6#L$MRMuUu|D^v~_>;&7k?4WP69>Gp1K#NHvBdCLY&L_rC z$Hq@bC#U}rBctil-V%Oj&)!CRwuC3FixsZBTKw15KdJsy7cbm>&u&hL0jy=IU3HGu_v8g8Am~QD)U rx39-FbZ`Xqp_Oj?7Zy`4NSYLtJW6 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_console.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e6b77c1eeff7ae45c59c6c785d56d98765f07a8 GIT binary patch literal 11557 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_constants.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_constants.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df1f66a7c57b172d3b115f823d9529157eb78b51 GIT binary patch literal 28982 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_custom_frames.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_custom_frames.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..355bc816137e861eab3022f275bbcecfce93f448 GIT binary patch literal 4912 zcmc&2U2hZF_0D+49y?9~31Lad$B--pZ`gP#%a(*?7YI!NL0Z@b6?f4v_Dqrqw#U6Q zCO9%Em3T-iRxMH`DsA}ztMm_4Jau{KN`0|6*#=F6Hfo=E3j`@uUfOf+%=jZjDt+or z=FGWw&OP_sbI;fHUmF`E1lnIR*QUv z;RzNv;M_Knw`?;riVImIX4Y1XtWL*cAxBb_EDS1&6H%0mspZp%M-}B4c{S~QX-To! zuACM~lDg$I){Qw$N>;yPyA-I7{YtK&Xh|hyW-_>0Pf_}9(ArmI14Z9@7|&$wcq%?& z>C}pk>b9Ph&rw4&;^%bhmTl(ZIcm=6_L;0@B-464Q_!=w<7p!q&lT)xGka|C=nvwS zVe9Yb)YL6?O1I*gp3G0>3ULM2(M+mqKnlv!;vf#bm1I7v0V}Upw}-)8fi{3#44}zc z`vBZ0YwcYnVei_Wee;*s+S=#G*Ln|?g&w-cC#^daG`9de8$|$*i0vN|@r};*43ZF~ zf*GV{6lb%haW$j9qYxWKWNinILH}EUe8rDbTp$*rBD~z4H6ykQ0XQO|$dtAqXhpzw z)CQQ-S*I8{M9*LpBWu_c)q-T!2LR^DYW(Ely=9?&SvayDB?Ip>w0}KFj=1RI*Af{z z^&|-6-wDUrDs?LJRkVSU)Y>t4UZB8(%QcKttv6NC1W;GB{V|(b=+SwT_y z!50a>pa*PgGpO8c4XDG9!#;1&9@-0QXsJbh(L0Oko@cs!it4*4qIK8M$klH?Hq+;0 z)wh2J94U$^UW?$LpXNC78R;WOiN($G9JvlB%aKClPT)G3BbfJ!VN{1w-+9tJtj~N?` zFy6yC71Eq5!!R4co&0oK2clfYv}|8Iwlr=i>+fiG8d8vofAXuZJO?cQYI^c-1y1zBjzGtq1&;b8|7KN$58Js>K8On>V#P31IS)?W8Q8m=Vsxm zr~p4Z?ApF(`XNvZ!DFofm?y7$Nu*~be6$=s`jRw@hgRDM|5#XwkCo$NOYsX!?H3oC zR)@w{hHjLHZj^4S-k6^KUNx>f%bY z^V?|WKU!nU0~4idKVKU7ymUiZ8n{_XPOT(!OUYb`&aTjVWqNNDgK4tZdWx*WGTJ#bXN5ZwCwvuS7Gl~RL#9g5n_+<#n2tlbN!lH18+bIcY{2Zk1 z6t7egC6p$D683r4g!Y{h%YL7(`mTm{4ev*!8rBOC)*;dS?|OiO2-21CI8fC@H9_u_ z3ac_)Cl8Wt>Ubli5HF>O<8%A+ISm5RHfKL*MQ9&vY)+oYs!-%(oP;}5HAGWAmsV5y zuuS`bEY?&L2VyWlvC^Rf2#z3N&dYoiGbyXhC@R_s>vvLm&Nj@fTk&G;8WZU;q^gv0 ztg3SYW?Hkb_^9#O)*Ym$CxGU2c&sM?pb!ps`%c>^p62R&uN>_xb)6`kyi)GEvK+m- z&P(Cm)t3I1mgD7?@Ej9N%+u!rs!0)7I;J254ed+gS%F(VbE<}TXxmD(ryTA1TlB!z<~!9% zTUIZ~|1dVPFYx5V*$)2C$GQRix?^ahO?=ua0{(QLIC3DA@_Yn{2|){Ee%kSW^3xix z*}+R^@T#+|73(~uX8v0ij#Z1_$?LWiQ@-W%VEI(fn74PZ{8;2Itl0_V%v_Dla?EBe zJPYr((YgbFdJ?{8;IRwTO-~e!H+JhGSM8u+ZQ%)=gotfU>~RfOHsd-K_s1V(8FJbK5Rf zThhnwPa~hu(?Ei{w|)!&k|W1`PbSJ_;yF40Jvse%5_wMg)}+RHaWg1!{VxfCS9_bd mPhY-ExUOZ=y%~&heJ=@sSKTsqXk(OX;!blLy&^z%OZyK(|1~rK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_cython_wrapper.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_cython_wrapper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c446d36067c994abbf4da86f8823622bd1f8ff7 GIT binary patch literal 1905 zcmZ`(Pi)gx7=O0&$NAHQG;L^7ipo-zhW;@$6|Gi=R@#j*BvgrQ5*E_K@q10(I<{v! zg>WkDz$S5EyNn4<+Y!{mcH7SDq)pnzUJrqXre)fRTLc%>UH06>Gns^=`1}2S-}k-u zzW06dZ+(4nK%ZY~A64Is0`Rv-{D<#?7q?jez61y$Mg<~>(I3UE%G6kqV*utb*ckPb z0*ex7D8byu8-eB{F+=q+p9NOzr}}uneI#b7KH;;#iUU+X5pW-ggH)gLSzyH+)n@|k zBk?fRPx>sd;t~I}j9BD8` zfJ0-zj4_>?4tH+)3b^~jb#Q~b0xTE_9petcJp34D%+7B4P|hX+H=2+`v9y5Kle1K=Ba*c?useukpq@UYZ?yzqFdOs6kRJFC7ji;NPllM z#5Ziy>lxu{IwFY+HA6S;cT7_^Nvb!LL@e8^%QoR?*JN^Nor)@^Es?R|l}CoGb-k`4XnEQ6k^@hU-h5r_B%nYy6SS3& zzzg~Y`(Fq(%@$ZH>E1J1cWQ~s?iYO7S@n%Vnjo|Ar^W^rK@&F8(udh!@%Z@(b(tD zbQ*isoTNwe2HL99cbj7v<|&A`LnF*wn+=5*{@@qeZ!c-{d+t&!2@$f7&4=zu~imv82#-Q2VTvaS4)X1?s^%MQr328Wu1 zlkVW81NwV%i{s7WdAE4p0i&(bRI_y1EnRlNcq^N0W{X~7yjhuX-VOQf7%hiXP<){Gxs!M zUSa0@V{W1RS^8z0Wy6J5D(~?5{l|&)_R5oJ?r}Q%Y3OBp0L+~F?&{9fAIr_fi|*pZ zUzdJgyyUE2ZmwQ)SFbrzWp7n>vErmRZoT(p;-r(A-G2W`JoEX9`{G{z#KVcbc=?m% z_B1`hzIBdX_?^hPdGOPGVmZw1vg|Ssc0-JZ!<>it*veUMw|{VXg55pNcz7bTJQd!Z MT1rv!^IM+uFTKGD8UO$Q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_daemon_thread.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_daemon_thread.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc98dde7b78aa104b5c305abe6827ec6b34bfa0b GIT binary patch literal 9683 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 E8-*sa5&!@I literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_defaults.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_defaults.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ca2f4db0102766122148c4be7807f760fd4c36d GIT binary patch literal 2673 zcmai0TTdHD6rS<=vIaXifdt6Sn+8fu1Ww4M)TC8OYzVp76hTs~wjm<6x4Q<=_EY-W_}@GLzq3xc*-Bt7NWlUSK@^Bkw4`9#616~vxfGYSMy)2crfgB0 z1@r^ab{mLxY=6iV=SLl)<2H!$8LN-aepE9&ArT?1h*K#nOeiUl2>JvT5>rH1(o#02 zONuNItm~3IPJ}T~2+vWCXo)(^9#`t|X3xrc8Jo{; z)DJR#@xtbK4NoxC*E@1$xDto~jGAER{765#8VQCB=ipFi;ObyxXgKV18azUBER7K| zY7i>!1jR0dZcN2eMUBS7)f`k99MLtS4xyMVE4sNo1R>4I^z7)q2WwPs-`5d-YXL+p2Gfg2Fug_loa=?8GS;LPj#N`@)JqN z9cnBw85_sMZ*IDp@uO)hi;9LtYRcB`N5v7Mn`xq*Kjkb`~BJEJV^u z#h2ja!4pf?hP#Pp))T9HKx6Z*OLw_v)}~bf>}$F;aEIiqjoR+=yac4E+~~ywY(v)O zs9XSgc^o7y6<7fxoIFOIpV7u*?GiWjIvU%xym3?RmZBIn^g+ zt=x_b$bh3e#kK>-44CCc!3?B4LfK0T(7g1VDz`29PFYiZinVi=dr)-EK`Pz%ZPlno zX;lBi>f4cZ*Y>A-58mIjdz(G^>cZLDQd;N`V`}zLud1dpf;q&JIt~=EnqlhUZ1dan zW}3))ulEjx2g3aUVM?Bql^J;pODoB`2Q@6ERYlVSLMz#TJ+IlB&=k+7W3xm}NxH_a zd)5=uG+HK#rnG7Z*+${mjHFKpBtw%?i~=m{S|%WDKp(Z9RdGVcqR`gUCP=d2+f&R| zW=6GALc?Y*$8evI5geLLV3pM*qlHXLDk4)vrP&ZEGKygx z1*EucT0ra?PAk*ca8_e>Rs!>JhE2^NF>dUlEQpaHb61SoQUzj#hp;Rw2!h6PhT)=% zq`5tgB$@8Dj}EobKe(1g?K$r+xP`p?_=@{@Wy-1N{OMQa`S0g?!ug)j<(|`}6JL<@WH;Wa+cdm)gV6+R?JB z?M`^{@+$9eQ!`Kf0zc0$)XmpDfDb;*dAe3D-0stbhQo_ruc$%r1 za}*X_d-E>uip!hpzMStKS?L~G60W~+eL^j%c7w3*ibs4)pA$Ul5JHE+<6X7E0C?Q& zWjJsobbxzufTQ@y;nqGo_tXZNbo%>xxTgU~CHoTpwtXiXlA`?9( z>%{!1Fx*9}Qt{T8As8#wwas9Cq~hfRy`t^@j53p7I=noR!!8|r4n literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_dont_trace.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_dont_trace.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c52e98c78ea9fc1a98bd5a6d533180c08edf9761 GIT binary patch literal 2705 zcmbtW-)|d59-m!%?e&i&PHXNii4(T965^6(b1e}90m7;qIF+VS8bCya)y6xv*Rglq z*>&1jYhfWCQW4z+@er5xA&+qIzzcr^54_m4QmiEpMfb!#nT7|{C%!Xl$Kkls>2xFQ z%=bIr?|i@CneTT#v)>L4g%PxG%5UZWIfT$ZDARAg9&xk=#2(Vn8qzq8FL7%e8~HU} z^R4-Kg!!V_Uo;ps{}-IctqD3>3uwZJXf3Gms;C8k3TZ*;!&`hxti2w-UaeG2VoN!b zNUCJ3dC4xQwxpIy<}FLIHuOqGH}aCXiHVe}8d+O64NJOJ&`Vg-@Om|$2l0IPN9u67 z7JfBj8ulttv$!U_cf&gOYL*`ah6JGL=8nc;b`ROdqGEr`$1?~yTz?yN-r*Y^9o2c8 zT41dh=u?C7#0sAs>d!mAzMTwu_wNYZ0N-_gU2ueAq^~m=HNLN14>$qMw{Zg@i`$uW z1mL)FR1ezGzP1zGq_Sr{ES=6`xPv20O)c4N)|LlcuI~RAp z^dpBKWYghT^r#r`M>ZIH=M!>59_8?x=r(8hIpl;W9YxnsN~paPmY}U*yGjgcl~l2$ z=b$omOUeHscsU^$Pf(cr(1C{lXnccwJJhQp{gi8`ylt0o- zl8U(FN)C$I0IP~^Dtg{93D%U7ZeYvx<+1ICD4kWa1?-Bzdy)_~s%1=68@v9TZfNds z=GyYAvbvJKbXi$Vzvf0)E-RVKm#(d(SFf$OLRq!51=k0T+~KSVE{Vk~8D=W%`m?5n z-BESjGD}q(9|zf*n4hl=yd}YfW({N6$ zmTbk#lqXOMrnx~95c$*aS#Lm+8tCURdP+WsUuefKv@T{I#4k6lc7pL%Fwu>pv5D=W z!`RqC>})%Bwv~MDL2PkbI803M;|Gbk$LJ5Cvv=OuUfRucV)4Du$DwBOli}@jXC$_p z{%Er^KGnS0B+c2~;Nj^r`)_}Ddag5fe)sDBOgoVPn`b@f0h2c@NnY!j=a#k`q`OwVy=^z1l^^(=|_n(-3XdUG;iLU=?*!`8E)HD0Bjq>+tNT$UesABGvtu z_C=59kbR8E#bfLpC=c`;q@pb@iQb3t7P{?w2i@XQd~J!{&Pye%61eESdo97$wBhAp zx6ix3m*8pgkU-5*5y2%>)z~9M>wGySxTC)>DEdsg;ViYzY!Mo)E3k{$3mHvrIdu8bbqIipwAbt}*>t*N~s2hz4(?17Le0p2#B&3!&22AMGftYBEiHG9U zp?LN{oNbG<55;p(Rg=?gaqO4o>(D>3XkZ^KETXUdFZi;(XB(yvq7cRMash}vKIJJjpg{{4}b0dnTUOisxcrMC+h&K(ZllmHC@ z08Xr-m(n|aiJ|d}&;#uD(!+ib3~BcGZ=np9OwFRd6M3vjgP(#F^Cx*={cnuqa?&ir z2kF0>ST+p|_`?tcESdQ{jrg}w^$M-XRAU&Tij8lRzt!&4nzIi^l8q?LOi3*?{y4C}1-dy7JvG)s RqmKil-1O1xDK5sG{R+*$v2p+a literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_dont_trace_files.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_dont_trace_files.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73bd95f9d441e09cea080b6788b05b5f92048eee GIT binary patch literal 6393 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 Nmi@~Z2oJ!8`ad=nj*kEU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_exec2.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_exec2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39904a425d76e6656c5dcb53c03c7652c0b1d603 GIT binary patch literal 451 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 RO@&7Moa0UOsG*Z({}1b+ZU6uP literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_filtering.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_filtering.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bfe41fe8ca9c07cb39c035d71eaadb44e515053 GIT binary patch literal 14722 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_frame.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_frame.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f176e6fbd85b98282e17eb05c39a0449fd375e5 GIT binary patch literal 36153 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 MZyaRsF|51wf2ruskN^Mx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_import_class.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_import_class.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7d35b4fe9e1caa3ed7c3a365c449e03386d26dd GIT binary patch literal 2139 zcma)8O>7%Q6rR~1$G_RNoy2LXl64!Ex>aM+7O2vwl}V`DN<=`?N{NIl$Fog0v3Jex zCaEJwxD^s91j(g`7*(i2NI;bfM1}CpC_eGVKQW1N=t%qK z@4Yu~=6m0>fAjg=2-+{{OOqQ8gr3kzqcQct#xM+)5kUl}&^RJa!hDFwF=59U8BKxJ z&PKTDLkQ_k!h;4L=fJ{IwQ!Oa==m&;xSmp@;bh|sI%|QCg>T~$rsuhk34N{Q&}w}= zf({@Ik>t=U($D1(VRC4STJ2~AH!Ql)0+YkndUAM*-=PFk!h#Pj$Eqhjf42MWVx z4aJm?W)jKi#H4IQi99hgnaM`uv$9GwT_&JP&eOAA2GLgZ-0l!*cOmC zv>8A#JcNH5`q}mS@jp)fda@*rF2>6LbG3rk#QocR1ojmZw|YxnsbbJ%x$gF%Ph;LU z4zc(4#(dD7wb*1z8QsQCda)`y@52D90VXI#nS~Zu%0Xab(1mi$Zd`1#7b7+BB3kAa z19QNN2FGgL2fhOPcjYqEUsE^D0jjW-6%x#h zIS_gD#2Hu*?OpViTm6O68`Cz!`TDBhNDoA5rEN_-SQguDC+ln9zPjl|VrS92l6)i_ zE;$cBxBVClLwk#{7494Nm+o(me?QvI zy5o=SLqB%J+Sq&hm{^$I1~Dy+FT7DOIBcDF8?g^^F9`N4I6`*PRKuHxXW?)-&yA(%f` z7Q2dl#bbrmXUNTWE^;>0;_3iAgI&b~Me|XhXK~PWqqfc)PP-ix>`vqr@)w?O`jGh2 zGsL($%0j4k;-SzDneh*cM9F4hv0~69yz4#1{2;`9{5>xQ8NtI5hfaTkY7gQ#KN3Ix z_L$|&q!Q+3O;76~x<{kGi#9-_>fI{Nfm(Gxt-lOw^hu4^K-etC82%Vw&xRv_!}ek1 n7V?fV>-cEk+Cbsehiqrr=g*%l(_3zEe*Vbjp#T>2gJAj}mZ0NB literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_io.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_io.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00ffdcb269d58ba42ee7a100a347ee125ccdb4fb GIT binary patch literal 11422 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34f60286a3b5330ae45cc784f4225be29671634a GIT binary patch literal 5762 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command_factory_json.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_net_command_factory_json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82a148472adc15747d942a2983a55938564f3a25 GIT binary patch literal 27935 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 QH(vX22!Bn3*C>+y4=35B@Bjb+ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_reload.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_reload.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4332d8dfbae625e2ee76795111ca4306d1f4a91 GIT binary patch literal 14294 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 T)_?g5Kk4Sr@eerm!;tuQa`e+n literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_resolver.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_resolver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65f1b556c4fe0b2c7ebed19b39270e46a5c6ea2b GIT binary patch literal 32630 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�yQ_nvO@Dk6*vA#>KCkgWkLA+OF|e z9+oL+rtulRYT*r@6TK6o_k_Ct;r2{yxw`%G_Fs-o{^Fjy_JLHAD&2HT_|Kld_xv|$ z@7G@6)$YsPldny@{6K1$-fLgW{H@fsP{N7z-!2?*a8mU{PUKhqlj#52-#}N}FTJuL aBjd3_dv?3YyI15s6RY+%3ZFIbi2oldM?^RP literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_safe_repr.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_safe_repr.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03ab8f444ff8a1aa30627d9c7a8c542e8e33e1f7 GIT binary patch literal 13335 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 Khr%nFMgI%9Skb%y literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_save_locals.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_save_locals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fc417b9b73fc343c72c74be5c4c84e055d92027 GIT binary patch literal 3907 zcmb7HO>7&-6`tAUlFNV6q9yCc(8h8k(?227h4TasgNAp>JkM ziE@n=9dKudZ{EClGxNRg&HgDI4j?Fh%>8KmR1BfNl0Wsr)f$^$Lt_ysD2)`XFj<_& z@Mg12j!mNlXfW3ldaMFLZBXHT)vYK5K#tc)i zq-jkb7qW&dWv$-8-^q~SBzBt4kBIMH>F?_o-?=2db!ljDbm$U@{rRGzPK#M%T&_~{YME5NXipe=e{bI_DND1}V|huQ zlEzglrKp+0c)pktr&V1sOjQ9@a9l}=?pw?hbOlV+{xx{kn=d;1G)rs{iPE&BWhI!} z41&J^2xNt!Dx=52_Ag$o1bZr;9@7sJxwhrdM92dV-IO#mU{kjHO2{S~M$4UA%fdx$ zlM%Fh81^H(4m4Ck^`pe72zmqnSD;lpQbzKE>3{&`w2?0g(^9seTEduVIvG{)36^sLdKMIc|w?w z6hRUcZEQ?6Roxb(JRFn+9Wy3039jgL#Gr5}SAdQjoP{78ih5MY6u>20Ad`XziYi%j zN<$YWj2Qu3B{PBnFk=aM$+R^on=Kv{bi;N%nwc=NYENy6$zIptBxJ+*20#s^c8ksSLA;dBZNSO524K(jWb0^no=$U~DQTU7uUwym0a9ZjIE zS{7gtzyc_dT&TF#1n87al@60^3YVOr6tXHn2!L#B0DIxQuB)a1>|~e_7}6LR2hi@; z5@w7-RuN>WV1YZjV92s$X@(9{Qr;PdF@R?UsBTJ73IJj^?p&+TNjoH6*;c2{P-#Y` zVIxgJBtls3#Fk+y#4%lHkl7Qk90h2b#JD4GOC!@IbM@K6&xo6S&th8Kac zuj5_3f=q%elfWX$m{HQEL`Q51Wj9dvHUx@07oqX1ujatrU4%)*y(e9&ALxDIsN-PQ zB6Rw!j2_0?mxdn14*VyF5}&BwqtN(_p?)*h@#Hp_g1A<8Rs;QHz0VZ|->HqNb1twc ztaX@fSCS#QO*Ar-s%$%)ECO35S-KC7S0?;nIT3e3qHTzTLM<|hP_FGwOXDit0Tjzu zkN+RL(=hHF7`Ftd$o_=dmX5EsA6afca(if{{gtoJ{_f&$F8(3@+jky>&d^Ou@(ybi zEhmvFXjxm+MHjQ84%BOzBrBV(q#`bx`=BDLCAm||Yfj?b;#tDc;zgR9M~$tU0K*%BUI&bIG;f-p`v>Tl<#b7wmf! zYF}?Vu-ewQ+}1bu!zvGq+tB;egTq}_FG?gUp+kT3wLvqMsCt52&m(^CdTZxuYjU|Y zx!O9g+&VB9`9}czhcMCUsqo#;s;^-#{E!cQS3L-gH9l00AwtqE;LOht3?4>z`L@A6 zboVeb*vsDSV+LPin(Xpc#`C-=Sqp&;qE$;3)sRpJ4Af`TvkBYKGD(p2Tv0Gs@!hGN3c2~f?)$F!bl!c>;2GrR z7`W!XS8qdHU+urFlS><+UsKH)aGRJ?izkGacioM8g`p2*HE#odldfa{0!g)pZ0Qk+ooC-dJr;E;lD{cYRe{X@33B!PnQKEtO~|#8}5mzZ$qTFwd`dbk3cd zAGz^%H3}o2>_L2VE!b2Ewu8>T{fpNYuFaiWZ))2>A%6zXovt#$a0ag>I+jKj-mY>) zSnWW3tm12b%s0&sJ>c7_EaE$!J#9gW{Ts*++SPz34r5x{mL?W{wsz>~68}Zht?)k| zw+I^uL(k*H{>9;i;Y!z!E9v(u;!jr-(sDxjuF8_me^uke#+F48c=rwV%_ws(>ObAY z-D~x~+2y%+0F!o?|8&@Q?`X?u-glqnKyshwKyp9KlJ*{=lZ-n)QB({Wl59IUu+H7z z6Y%jszA{AFpchcvqJ-;&U9H+jhl>%;%_)A$yrblPN6#`0ii<7&q|5sQ=J!B_q&rK63U&eGCk%riO4H#AimittW&fu47;b-79bqu;c^Kb2 hpPQE#a|^j&7%TDak1lLk@tuQnJ$&^V-1}NE7 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_source_mapping.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_source_mapping.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2eccc43060acb144cc24d33edfb1d5e157be2ae GIT binary patch literal 7766 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_stackless.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_stackless.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3971b9ce99ce1f879dc8ae2bde3a93f4114ab09a GIT binary patch literal 13538 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_suspended_frames.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_suspended_frames.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78784cc279127f897acd5520a8d8ffba69ded194 GIT binary patch literal 23913 zcmcJ1dvIG6-B~5+bhUj&+BjKHlXh@Lx`1xvS?**z)BMp6Eh@F6 zv@`vE=RN?Cpyh1ZBk|zebI<$neZTKJ-?@KYQexxael~jU($Hy+`zw0ToLLPlck>)~ ziwkifKFW>qLp)DmL)0*2z^^fC95oG@M$JR!(W0TE(c+=vQOl5pr7=aVqqZU2sC~%J zp3PBVv}CA+g^Qx4qmCiRsB_3US~gV1;)o{Gg>=T%fdpmZnS==estZ?y3vNA1{PNm^^P_UHS(N+JIsYjU*|%OaMSxn zrC&qMEY^wGvT(B=+Y%~&of~Rp?_7B2&Ux3yVk;0^nNv*SeCnt9Oq`_DH*Ho2{ zmrH}Ou|)WKVl*%oxD*x#d}i5tDV*?M6a%ASx%_nh;Mvmy{&T%2&i0@2_Z>YrC<}*T z;*~Rji{TTo;1#**aQ{I6>E6NqKL3gS0e|n{;A#Ir@5z3-CLW1~$AV%1wSYJl8M_qs zhr+>_7)ZoKpFwt09ajTlBrqHe<4qzEiN<9M#U>`l!)TZ_b~P-Dkx)49Gs+e5n3xEM z{DDM5j0{gC!g2qV@T6Qicl5L4LbmnwzI0fOO^k;{**q8- z4O5|(Q{#z9Y%CBBs!Njn6sZr(Ap~x5VQz>Iaafc5kP&|-{Fy@r%wd;+pCc?RE&^7p^K)F<#qE=3Eo;?=Z8x1Ys0T2WJez7B=0Mc%ly5=@q`!% zCeEqDIuJCd?VukD)B0Mjfp?2b@;3~}xNq@EKFRqJqqs@#J$?Y)GLKLCL&KOSQ#>5K zDAwU^oC@%IpM7uB=vZP?aMRg%Sd4Ev6i$T4ynUFb$fmw<{7ND=zG+;Hjf4}uWAO;) zcGKu&cWP_+;X8Y;0TCmaUuOkwkdocp!KMYc9Si6dse>FT7iizP6 zl47btoBZl54Nr`PP?Y)y9v3V1iT zjKiIBcvBWH{7gm7jOjbJWxU{mASk+{aPE+CBl@ds;0!0$;)xc~7}m~vyjYLNIOX+< z>)+oq{Erc##b)or37V#Cylz%4GJ4`GrU$z6eXOYVL3y*6+L*$@edZFsY) zot5f-R;Yv+z8DsXq)e?}tI;Yw(Ni{|)VLGg4eqg{Y_{cA$D19$@#`r|J?n*Ryf~VW zi&Y93q&{elcCa0P%b%kMxqW(HO)+gs=;`%1bCQ3pE6I;&{7EYfzac(kcwZfjq}i|M zT_d$IFSSW4C}|v_R;_Sa{e9epa*jKXTBeJpixVYUvZOg#lq}Zx2+!Sgo4ABSf6I-~ z2(56)WB9odD@s+FN#i}(*EXtM`Do#4y;eXpO?HFrFIuf+CnM)9PWA38iDz|3aa!RsN>k5p( z2yMv~EsNnSNU&d+Pq&jRsDXUMh(>5}%>+(^-! zlSK_`GmDgVN;zf@30gSOs-;hsYU2_TuJoZ@#i5d9X@p10QdYicq+Ls!{S8seE!qrY zj+|$>W{&4x;ckvxH@?DM<9&|6VQf~LS9Lw(0kB7JC=yI~v2%L#7xW&eU^I~MhOdu@ zgJ9L(;Yn}ea@Y%|>0J+A9q;kBUk+by@9_@DV$n`-yBN532F!fyk{ac+>BXt_sQWU% zn!(GFxEKGaY&C&5GUmN@ITF0gA~jG!iH5@{-zzE%JRIuso(n`HAupqR@%(bB3r*Jo ziQwg?PQ4)%Nv=r@k4Fo|UnY=J=tVFZ86S=X#88u7m~2G<56M=&<6y7WM9dGSjaG_8 zJb^ikc$CeSqM|_ z0*UYdn2KDkjYj;mMm$9#Lb5H3q-5u~7>5&=RoMJ2Iij1!+`O_ZJfNZhZqT*)XBc@m4M3aj5A zj0WOyzh5NoESG3~V4P9xpg1GIq>QN?2N3i}F8YJ9(Q)8F6ge(3Sm=*OW7m9TjQffk zsB9WhxiSs}sH6%`#1pYmmN+h(6NKPotNvOx5~4JsQ+eEaB9;HJKfIPgEd2hi!U;d+OoJD&H!eF+X)EHnz5J8?8~%w{P5cMuicrr z8=i09Gjnu7Xvs9S{;>V~?RPfZotSUhOHmCOPgmO0EqS`B=d`l*iwT#dbkV)FnEIFEgF!j)}B~!O<*1BZl zDyo6(GVc0Mi%o9ZjAcpS1ZUb_FWKu;c3-A_L%Myp)V_P>$n2|<(6VTErR)uvja$+i zk4PJj%x^q4b0k&adx(~9>|#Ml==dcDbm}+u-Tt+Q_H~)gUH3Xt8~W*8yCke%w3MVR zU6Q5ij(E5GUiE_IV8&53C|&Z3 zuLY%6r@VyH;&ym|Ql*XarOhczvw{V6bb^-@X5AP@08$1wqN71Xs4i(p8b9DQGz8QF z5og+zG>uTs6;9`XJaODOf3qrS3L1Fs462&se1-v^LD}tt$cXS+{D>_SHY+1S+b)|z zwz8fvxsOm9+kDChd1%+^ZxzT%$UHRFQFsRyN=p(#d@nq}`0Dy}b+=UAeb05jKULj5 zUw!NeXRtQT9L+d9X-A{vXqF> zF2YS4fxb-7!`cabZnV)Bi<11b8R*V*(Qt-C8D`9pCa{=2_%# zb|7qED62ea9?{Wiw)Ui5%Lhc;o3tg3S9!54L9@zSPPrw?lB6-ou-2HFLL^g9Beo#! zdtP1FzC?T80K(SCegvp|rNfwkuVFllBgFGoxcs)?V5`317}$~}A?{)h(!SYg;AzFeV!1%ECeke#$Ia%03&%CaAx z+`u5%Sb~&0km3D-P+&X}7Lh!bhy`O&x#Y~jQ!hbtbmr7)sEEWDkjYodHYPYalq&Aa z0TS)=kU?B_G6F_mJFm=x~C9?Ql)mS(kbt1GLWBQ90kRXFjkzYt%v-+=&6}0d2Fwk z4c!`fbL0md3-*nf%IcZJOMN`&th!y2as;h+&Akh$6JMM61ZK^P)lGB9?v|uHFV31D zxjc`Wx83cZZ|<2rk*R8)yZW$dW5(lMtZu#Id04$A<7s%e^zG8QiH|)SL2Bw6Q|ot0 zwYwg-ZN6JE-?sDi;mnS`sk+WPXCKyWTWs5LcS360d;9RBry=dxCwcazJ%=REq5H^v z61gktZVkLSFt`0dihy%rluoZ(RLd}XBJA!_XR%QnA% zG!~k`s`1N$pJ6lQO%@D`Z0<>a!FYk#P9egPVii2uL?Vp1g`R(nJjOI$rqC65?{TbN zwg^O`6wD*M7N>--bLhI@ywL{`bfZ7x_S`u6#AGnnKC$rT>L*3KxrV%TpBC-s&7L{S z9ryQ3mpBUFw|wM!P_oRz%Y6pk+_GF`GP{?Bc5|CjBUKi}pYAjgvP_N3Q6!T35X!`` z$-srp;i3^*!YiCc97CjJl&*i8-jCj&|$R$m9$`Ws`kfI~0E00hz7?)pX zTwo)dpO_?bld4Y6qD&vH1KG@!h1n${mxJhBf}$7XN+Wz?FH*9#ldCFF0 zksT}L8n*N%kS|VSsL>Q!K$;EmI!X)|C$QPMoizjii<-I_!Cyo>9=BK6tO%7LPzVEIY@16?&XT|72` zywt)Ku5ezhZPS*7UCWTPjOeN_Ee>i&HApIVD7MsoP8TPO`?&8~ziSHuPz4Pa0CAWC z4XQ2x7aK9xHw`xh6G0n_;|j9j;*j}+BCSl8zZd|=E}E0}WbqVgMm+_UOaytv%hZMo z0Tn`7r%Rw#D}Ajx;nG^4Rq%*bK&H~9p!d5JfJR7`vN}o=#LSsPZ3Pr-=urvY=*luJ zHD;z1@ip0JE%ZV0`|2KpvaV=^RNE_D(xJ5lFf0i0QFI2o9{uUh?ax1;Wrf>id0(X! zU#eY)m3EQf5Hv!GX}!kztOIg0gZy*=wl;);LVp9goTr5+qD7OlOzOZ~VJ!(gFA;HV zNX~HJUQFYHVn~yYV*+DhVmwC~|ID%{8W8wxK&?MLzY5Ppa8`<_8zkVK^rML#}=Na$Ws zUld;s#F;XOmX%ye%^;3R2VH0zFmCFK0$xKD=Z0Dm6UY=Xr1?^`M#m_T z(lCv@vy%XgAZx!0VLpr0Q*B>v{C^i|kTQ8{}()p%&Zad@$EUAppsRC(Zj_s@DB^rX(5OI042ul&lJMj(o+ zhIHjdsdD3;(2qvm8=0@%J!^biS$F%)yRW?c$~#|`y1ued`SPrB@x@*g@m};!{BHkk zN1thb3v)nH*3r^ zx2K!8OU>I;g7=Z5IkRc&6Rx;ym*n0sd+@gF_GqT6B~`Wgac%S5$%Wdjk2-g!dIsh@ zPrZF|v2*|Zy;A2(w@*H9=u&!pZ`*z2{lRqqd8z+=DmuBuaR&^C44=`@3B#w#&r@*0 zlZM$N8FyRSy-{*+ymR?u_s%5;>RhVhoJ}c9_*E;HBWfG8d?Z>I zCQJ+*+#aZ-_X20lxErQR5CkJ_2WE|9YX={boO1A? z9D`_2zM=tfCkl|=K}f5Y!UPv_^bA!pi5=oU!mDTeUhy0F1r=pt1d}RA*v%4E@gGwW zCejv*v-GAAm88*@trz{5qOoC6c-e9h_6kJnRiQZxMHTu=lvFNTMJ&aar~)E>;v3|B zo0652tR8?CKm_nrl-0787oGQ}PQ( z-BTO4eeb=&KOXwY(0un1N!T*eKiiXP*aFg;0`=R_yWlvmWH6R_AA4Ko&i+gL>`~Cu z+KuU&Ua6+{e#_4~9&~&ZN)29^uX&Y8pea||bV`oSJA-%QDM#nL3?vhXw}3C{1ZCJfBq@ zrSKSeG4hziOC&|KlgETtVr}BvW#!OKiOpW{M4up#NR?q%lKnwE0Ce=-Z|F~J>U1t+dERG4%W^f zUh9rv9J%Fl@N%SU9!53BkeTG>Aye248M`Q4Tu4=@QC!H_kfk*~p#4I&Hu#F=Qa>{) zI;V=(fXG=#VKzvA##-?AlB`LV)}=L2)ZB8_8osPzH&61Wa_QKs*rM2=U6;w zyRtHKByUDg%8|DjV7!LdIQ5BuT8{Kwl|P)i@ccQY z|3cw;(e1f)?9F3ocdO)XRgg%IFuk~1nEu$($`;K)9(JIyVRJT)0K*RWUFoLHS@V!W zGXw1fPsbpdVw~|QeVntUF+Qcs)o19yLt!)~1y&QQmMc}7%haGafCqVx1FJJu+rxM1b;k9)+ryGWZzSK3Q9arqv426bw+K_~` z9qd15h1hkT`37#2dy$u31B4Y05)s4~a_S*AkP zGa3=m%7K!?95gT$1ppQS(vXSBd&qnR*aYWdf)<0{BKAg6U3g4TYfPI%#UEI-k<%=M zFwPbxs)uw@9rir{j|HIJNY#pNQ{7gmQuNasJ{PtX6xvClg3%}d*Ftu@D>zdh2=A-g zg6xh)h{3IJS!DC}glYp^kCjBv&p{(Cz>ZXA}fH zRep9%Hz{JLLOou^g2k;Ehr+}nHV&H(|1d0MuKYDY{Xy|t@bkb3@e!KrFQKpzr;$$l zb$GxX{M8)PA>Kgb)Xo*8@yqIHVE3)-Xb!%ddSxi})$`IT7v>MXdP4z5i_D-C58w&o2widhFUUg%n!DSO>xSN-kq56&;Rwx)!wDc9DFyZYAg zH;>QsFXFYkMS`$VUP(5f>GD>oy!DNPnUeC^$itEbJ-SUQZ+qk5e=GO?WP7UdzSr8_wd#y70BsH)WbLP||$GXhs zZ9lgDf%T8U}vi6iHnfOI@9U zjCGCgB^ir;oH$Vsp2$xKnd=52p(Pcx_tcrS;exZB`mrg+{&4Azt0i8w4d5u|$sSGmC(4<9XUcoh zm3pLl%8D%^szHa-S*#T@KozCdg%tWR6RStZcCafl4ICN-{WptXNLOGsQSI0Jr`|g7 zt2bs8+lg`|)*lIx)dCwRxi&9u6si}$GG<66S7pO`4#dY%lb%R_5%&{O$0_ZKLTvsC z7&g#shD1WSvYFIHSL6o$L=&nW)o7jy(+Ia}Ehc-uuv2*kWK6X%r3zo#64HgQgG7;E zMGGJh_otSX$u`?cCw9=cdJETSqD%#-D)XhZ>C{7NCkw(wSA^7B>W}~d*Exrt3fdp zcz`I)u8w$H)|xgus`+C?lI&EY!o#v-wCc?GYcyI-NQ=>`Z%xSpv%S^=+?9`S6I@PI5X}l(A`2>>ZDoE1wHm_ z20F)ko~D|~uv{UtFl<00G^_>xT?~wosw&3+Vz6udLgxEVBU2K>Pp3O)Kxok3ai%HpxVaXHr)=-4W?W7 zNUeK53a5hOsq53Qm37*dU<7DWRx&Eo9fjGnl8$>VwSuM{ z5v%&WI*CaAE=5u3Hwo-yNUIxn=B^$JvnF~GSgVOib^w}f=mVsMT_&9zi!^0%Dn*+p z&C*%XCD*RlIn-2*WKB>b2??u>+$K4;rMeGEj>9R-VP!N;c&j;D60E6Hs18jvjA(Ci zezQ6Sk_uIQLP15^b`A;}<8?j`c?FvdwyK5Yr$Wa$&_XmMblx%|Xp$2mgc964>Zl`H=t|Y4y$9JuT-sOxm@rSlT zX{gONubXhYc)BPAEm8Iu4oXi$Gq(jB@fudgE0`~eQE$)~1JjsB8>3C|)SE3jhtI!* zGKf1ZDyoVw*rg$`i!l)|aG`|(i>_5SWtg&#-C9*K8p8|uh4*?1LwI8sH5jKLJQY58 z*VBcXixCk?P!Byot{#oyk=3bQu)!-GGI(*@htge&;M%6zZr|#*vFv{J?!_7%KYGzS z5F4Y;v%2A_ZNM;~!K^h3+C+ph7`Xkzu5+l(TOa8PclF>#5bQ-0Wa+A)P#X8Clgho( z9`6|dRaAj1K`8#37#q9PYs<^UFh z=pyevc|U=Niy?aF2x=+gD&juRWE>U~i4d-a$mVMzZp$dN``=S08*a^n!WRP*(S-OP zs3^t_|1E_`%E%f~$gMgh%z}>`e5h6@?x$S;4xVbjhPy0m;0SWs*;J@lva;~J$hGULsd0nE+D(ZE^mol+D;Njw=QX#;-3p#l^3MX8O`X2X1eqh5eGSKh=9)5-wz#J7@Y9 z1n*+Y`gF^Fsbzn<<+#*xJaytyDspAMC7Kc%7muCQa;7#Ml7z#V>J}JElpKax>*HD| z8s6CrakYE*tSRkmmz?c)ERu7}W9Pct39{lPEqHqCQEBVZ1?RC$AWW&cBxhIJIVd>? zQ)e$o&Q~+e*0i%za(3Q%dBM43aql5Yv{`a)zUz7D?16y<>LSs)dZz!g4e0%6Gz4rM zl*=T)(^u5D#rWYCb6-z!p1O;uBIACqD%`K&#bw6R3Zh}rX5~WcpT-O5V28<6Dol{f*O@2W$Pu!Nz)_k)AT1KuA-$ZRtbOY5Fu8kng3YRqO zq&#i}W&I<2_$M@75Ob_W*8eX1gCEHa=*AF8z+@n9lzSA(MXfnET-n~QQgcO9pi5lT3v+kx_ zV&DAsHy53ipB3YAi6hU#H8juk-8_{c1>bI|em8Eul??H-Rvc<+yR}bp_NARiBFH3HycmtAqm{JERbxB!T zXqJTLwBVBj--56Kaza|@l!VT-uvHSaE(qN$Ww6H@Gb}R_HK5ItbKBEqPO5QVe8vdQqzGmYO4(@>eVY9ifvp7$R z*6BqO zTPFJTo!YI&KQzBkoTuRW|1p625#p~rfNa~*0E&-kc7?^&=DY&dYh_YcYt71g0DNyJ_xfz=3 zT(K^`F!hgVsgRVNvsA3ss>Pah>6%?q&8~aZQq94c%zCMOeY(6)D(_QG2yP#p z`^Mel_p4IJ&Zk}tr7lh^8x5|~nS&tHwGA`JGp@?dTqy7}4&D>;6cF^CUTd${_`qxK zg|aA$`V|^dy23O{F82FFu^_IPGaD(=)QNva-bdv9C-P`nil30TNZwzO_dm#6aR~5l zD2}`rsmps2c%A#yU@%*rSZd8%pY#~aC-`NHV75J}!yO;G40MEFE^5T(phJAQdH0j` z1~W*C#bDmOY_XZEnDT;^7erCI19D?-`2>D)PXnOO&p!_^A*P6ZJ*b$S30T6`Q1R>f zg$JAmSlD?0oec<+HfXae&uE{}QTXUd<>OCz7?SE|yS0ne&otz$LFBO~^j>l7No%jJ zMK!KcWz(uxs5Qd|A|Zm6IxI!c+)%iIy1w~OY2;~RVX>)7Wa5h}O=@q+vINRe+?_2aYgSuIivCmPw8I(*ku9Hy-LB4tb&%_sP!oCDM9mMzD_lgd?b)zs=k ziY;a`7`|%&6MRij%(uFdoBhN^)pUN4lme3IRL@!y_WZnmL38;HGzN27UYRc6BbDz- zm+zO#A*!93FCUyK&e+RSxNz^PnHg9l+x5Lt^WJpxL8H2|LWspV~Qh9f7urM@~24vx;Z&a@7BT zFYEOf9(b(1E#?Q!Jp4S6L<@&4o?{5G#iMTkM5u1XLUCe>DbEV0EeKdc^FBl16xOJ& zBKit68-cNQd`X4uazUN(xf12GM)>-LdX^JcKVjmH;UI2|KD0tdah-UKPSV#ZUYJ;{ZjajS937P!qo~@n!&G%N*(@o_Gp(ka_Qk}!CNcF`Bu^D~EfDv@ zmK*~;iG1-1e5oL-^rFuq&>1yjZ<=Vuc6_Odm(>lOj|yAZcGU>MTATfaH8%T~$^4hJ z+c%8Fh*cnMMMq)_+0w^HTm#>MNPzfwIxTicfO*(vFRi zW8QNA#!;Vk zbVv?-WM%KX1E-@ee!*yc4Q2jntAH3fyW8{J@zR7-##q^ESwyWEA04oZe}jnpp`j#G zZC@}n>UJdM{4*MzEy$p9!cM8YGhMz}D&Ks!dcOPx#t892A6HezQJHqMNshL;$$7_? zlx556kujl|X8bK*hj*OgF*-RX#5s4g6(I7@4YzoL8(+k&ND0{d+%y^>`B%nk>KAJa z4BRqgtqm4Ix7C9s3ydhK7;()7m79n@Ysu_z{yX>i4epoa-Z}T&#C-Y28DIgUwJB3x z{q2*Bf-5Z$MEF=}{CwuH9{%6#Jn>s4J^ZYxmHS><5C6O6JB>d!_V7U(Jve866nKCwLN5@MI%>giD2KBnUEnm}0I?EyKQ3 z73-xC_aIhkxO%E}jfIw<%tC`kiv#QI^jFB>piQ#0r7c?|%a*&od#C3u`#*HufB8@9 zA6iZ+D~oo!=BNeqyxfE3dJDI;$kdt+P(@pIg=usMHUxTJdIdjU!;Vb~Ui2-y~kXIA2pMtq{$W4aTuT|op(4Lz|36r&hrV^zi zV5Jt?6EJ-y6L#hbev3hUN042=Rc08F`3@Y@&^Qp9=adDI#qNJaFP!jXtNy_;&75Cf z6*$$=r$4S3Mm$3ncJYzciAJKSu&Ks1mPc0MW2dF@dq@icZE#yX_=eT(ZQuUp<0|i4 z-$*%|9#_@e-u2e>%n@CzPuJ{`YWCcFWxnPxWOPSO%F&kbG{5V3+i}M-@7aPcfVey< zS4*bWJ9~l|Qtp)Mcc$xKkm_H!cXYn~(98hne9Ga=c-qpQEs}>8;LG!#L-`q9Ri7^z z3|7x$p+ecd3qm8iEmeu8eyj9=fqQcgya%OQ;s4Z7d7#EP0Il>W-mbhI#hBUO(To2> z9+UhRDMag3wMZ+;mXfeN$ofmc?d&nMf|?-}A-xk_XHGb(^BSKdc( z@v&R_G%haFu&?+e;>!9VBE?L=*cbIgTK5pY3+B8&8dW~hXQM=Qsu{KNiCv|1zxL^6 zc8g42SGXMQ5}|TYi`GB;Fwj~J)<3kTd{(d|uU=)Dm*!U_mQe$1^Af5JjEvHE0OKNw zZE|CNHf@9yD2CJEXq=tZY9)pIxqS`!l@xAje+7B8q~s!8NT;tdR~-chd8#VO5i zk;hJGnKFp2i~O~MYyHYcYF-p8u~_h*i{FF?d6VZq;adNavwddb_>%@e2KYbc`aa>d z{+#nmoc|N9`xCDD6RzzOuJaRa*U!1b5_k9$uJ&osAp_rbyXYxLzfVt_&hh-7RAu{9 zjsj0a1J7@GYU$(orc_1SQ;q^p2Mh-deAVo^ryTu0Jz+Y}^Pb!1{)VGpM%(`{K120> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_thread_lifecycle.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_thread_lifecycle.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a32071d8b32a6ddecc7c81bd8ca686a38c6f8a0 GIT binary patch literal 4463 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 OJnp|PbO|CqkN*K8t)CnK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_trace_dispatch.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_trace_dispatch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4446839649f3eccd0e79e396b9d49d475a980310 GIT binary patch literal 3638 zcmd5;T}&L;6~41GJ3ITs-!A{fFa|pq8`y?myN+C|*eq)k3~c~g-pZLSI~SPs{H*TG z^5ZUwTlK+6k&yFZqqahMiY-_2E02+rDwX=OcuQW886-McV7v~KDAn_iPh#K@j)atu{z+X4%gl|jSvxB2-nMgXJ@}=3bD0-_6Q=! z^Ip9A9isy*K6$FZ)o%H)IAPE=G|Nn*8TJ~QX4(Q@QT<>WYnP1x|u)l}WrGXU1R^=*vpP0h-9N>Yu9zQpdO1(>k# zzuC^^^N5j=isq2za*UFo-`|p+{TlQ=JTfRrSKrqhrk#F{dHqvq04qgPw zwjfCqP?BseX(+nQo0DlvQEiW^m=+k>KGTX5%bZrgOTfBZ81V#a#uT=BJOg&7%@fTc z7~7tq;RqoHAv|Trhv`@{^aO76kN{Ox6}Cx9!n&y#x+&3Bws|Z>N?MkVZhc zR2edc5EnQu_x+E=1_uqTk(Yw;o zn>!TAa`kJ6TRyJ&sOIB_j~cR_7qXG-xx?>exyB7wx!d=pQ1!gB`fmT7{%q69T;-`3 z$mQ*0ZudSb3oX1q|Ngz1)v{yvM;={&aDDmYYDdpndGN0Hj`w%XORbBoOYMv8+14K~ zTep3SvWm^dg0vsxqEGY@gI2>2rgWnzq~uJv&$2?`o7gbbc02KqhCMw2VWr0 z?OPKno(c_5goeL2oqTfoXB#Y2GR*v!Wxc))7Cvv8?ZExxs*dOh^eJ0GWmQijbf0z8 z$shUiEzo^_;^@T?`==lSvW>G#_nxvHoKTH1Cr~c32YT-<7qts520Ff(nv$vnAFpb9$1fD>PH`?8IRIz6%I_IuZI(w@V84QsHXkO9P=lrv%>hh?G;4!07O$!D#W7m%jt{ zk#ATfAFeb_;;9srmu3plLd6j(j#BXk6|Gbp17Wux47B&qB!VZ>YMj`C-38t5KG-)d z%L*kP4%wO{I4(RJ4Tp zpwUcF6&*i7n}CXl2x3b(s~K`y#plS6U`mhF{3i&=W`@}m5aatBO0J;fUs21tFR;)$ z-?|W<58o?X+wfxe{;^#BTRC6%Ezh&E%3FaKd^O|S=t5j5TYX}MJ@JxryZKE7;$;B2 zXP6akdOcM0tATZQWwy3+#of8rAkIADez74mxlg`yxxGGc^!mWjn_*UjU;c+jUYVhC zm|6GN-IJd9+yBL*P-C{SKNox_8+d2^2Tk(>U$6VCUm)*(2n-PNy3lpo`&8&!5xTw* ex;H{#wPn)c|Jd{9`7`M8nf43E*iTy-kpBa&#$B2K literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_trace_dispatch_regular.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_trace_dispatch_regular.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a436c5eb9a2d6537838730e65a51ae97b449d82d GIT binary patch literal 14504 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_traceproperty.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_traceproperty.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12266949072886436ad0324c690e19d760d7cefc GIT binary patch literal 3911 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_vars.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_vars.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c0786acee44a561ec7eef432c7f767ce1a041c2 GIT binary patch literal 32564 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_vm_type.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/__pycache__/pydevd_vm_type.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..267223ad5287719ffdc47164472b1468fb0ed369 GIT binary patch literal 1283 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 D{>yVI literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__main__pydevd_gen_debug_adapter_protocol.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__main__pydevd_gen_debug_adapter_protocol.py new file mode 100644 index 0000000..e2672a3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__main__pydevd_gen_debug_adapter_protocol.py @@ -0,0 +1,606 @@ +""" +Run this module to regenerate the `pydevd_schema.py` file. + +Note that it'll generate it based on the current debugProtocol.json. Erase it and rerun +to download the latest version. +""" + + +def is_variable_to_translate(cls_name, var_name): + if var_name in ("variablesReference", "frameId", "threadId"): + return True + + if cls_name == "StackFrame" and var_name == "id": + # It's frameId everywhere except on StackFrame. + return True + + if cls_name == "Thread" and var_name == "id": + # It's threadId everywhere except on Thread. + return True + + return False + + +def _get_noqa_for_var(prop_name): + return " # noqa (assign to builtin)" if prop_name in ("type", "format", "id", "hex", "breakpoint", "filter") else "" + + +class _OrderedSet(object): + # Not a good ordered set (just something to be small without adding any deps) + + def __init__(self, initial_contents=None): + self._contents = [] + self._contents_as_set = set() + if initial_contents is not None: + for x in initial_contents: + self.add(x) + + def add(self, x): + if x not in self._contents_as_set: + self._contents_as_set.add(x) + self._contents.append(x) + + def discard(self, x): + if x in self._contents_as_set: + self._contents_as_set.remove(x) + self._contents.remove(x) + + def copy(self): + return _OrderedSet(self._contents) + + def update(self, contents): + for x in contents: + self.add(x) + + def __iter__(self): + return iter(self._contents) + + def __contains__(self, item): + return item in self._contents_as_set + + def __len__(self): + return len(self._contents) + + def set_repr(self): + if len(self) == 0: + return "set()" + + lst = [repr(x) for x in self] + return "set([" + ", ".join(lst) + "])" + + +class Ref(object): + def __init__(self, ref, ref_data): + self.ref = ref + self.ref_data = ref_data + + def __str__(self): + return self.ref + + +def load_schema_data(): + import os.path + import json + + json_file = os.path.join(os.path.dirname(__file__), "debugProtocol.json") + if not os.path.exists(json_file): + import requests + + req = requests.get("https://raw.githubusercontent.com/microsoft/debug-adapter-protocol/gh-pages/debugAdapterProtocol.json") + assert req.status_code == 200 + with open(json_file, "wb") as stream: + stream.write(req.content) + + with open(json_file, "rb") as json_contents: + json_schema_data = json.loads(json_contents.read()) + return json_schema_data + + +def load_custom_schema_data(): + import os.path + import json + + json_file = os.path.join(os.path.dirname(__file__), "debugProtocolCustom.json") + + with open(json_file, "rb") as json_contents: + json_schema_data = json.loads(json_contents.read()) + return json_schema_data + + +def create_classes_to_generate_structure(json_schema_data): + definitions = json_schema_data["definitions"] + + class_to_generatees = {} + + for name, definition in definitions.items(): + all_of = definition.get("allOf") + description = definition.get("description") + is_enum = definition.get("type") == "string" and "enum" in definition + enum_values = None + if is_enum: + enum_values = definition["enum"] + properties = {} + properties.update(definition.get("properties", {})) + required = _OrderedSet(definition.get("required", _OrderedSet())) + base_definitions = [] + + if all_of is not None: + for definition in all_of: + ref = definition.get("$ref") + if ref is not None: + assert ref.startswith("#/definitions/") + ref = ref[len("#/definitions/") :] + base_definitions.append(ref) + else: + if not description: + description = definition.get("description") + properties.update(definition.get("properties", {})) + required.update(_OrderedSet(definition.get("required", _OrderedSet()))) + + if isinstance(description, (list, tuple)): + description = "\n".join(description) + + if name == "ModulesRequest": # Hack to accept modules request without arguments (ptvsd: 2050). + required.discard("arguments") + class_to_generatees[name] = dict( + name=name, + properties=properties, + base_definitions=base_definitions, + description=description, + required=required, + is_enum=is_enum, + enum_values=enum_values, + ) + return class_to_generatees + + +def collect_bases(curr_class, classes_to_generate, memo=None): + ret = [] + if memo is None: + memo = {} + + base_definitions = curr_class["base_definitions"] + for base_definition in base_definitions: + if base_definition not in memo: + ret.append(base_definition) + ret.extend(collect_bases(classes_to_generate[base_definition], classes_to_generate, memo)) + + return ret + + +def fill_properties_and_required_from_base(classes_to_generate): + # Now, resolve properties based on refs + for class_to_generate in classes_to_generate.values(): + dct = {} + s = _OrderedSet() + + for base_definition in reversed(collect_bases(class_to_generate, classes_to_generate)): + # Note: go from base to current so that the initial order of the properties has that + # same order. + dct.update(classes_to_generate[base_definition].get("properties", {})) + s.update(classes_to_generate[base_definition].get("required", _OrderedSet())) + + dct.update(class_to_generate["properties"]) + class_to_generate["properties"] = dct + + s.update(class_to_generate["required"]) + class_to_generate["required"] = s + + return class_to_generate + + +def update_class_to_generate_description(class_to_generate): + import textwrap + + description = class_to_generate["description"] + lines = [] + for line in description.splitlines(): + wrapped = textwrap.wrap(line.strip(), 100) + lines.extend(wrapped) + lines.append("") + + while lines and lines[-1] == "": + lines = lines[:-1] + + class_to_generate["description"] = " " + ("\n ".join(lines)) + + +def update_class_to_generate_type(classes_to_generate, class_to_generate): + properties = class_to_generate.get("properties") + for _prop_name, prop_val in properties.items(): + prop_type = prop_val.get("type", "") + if not prop_type: + prop_type = prop_val.pop("$ref", "") + if prop_type: + assert prop_type.startswith("#/definitions/") + prop_type = prop_type[len("#/definitions/") :] + prop_val["type"] = Ref(prop_type, classes_to_generate[prop_type]) + + +def update_class_to_generate_register_dec(classes_to_generate, class_to_generate): + # Default + class_to_generate["register_request"] = "" + class_to_generate["register_dec"] = "@register" + + properties = class_to_generate.get("properties") + enum_type = properties.get("type", {}).get("enum") + command = None + event = None + if enum_type and len(enum_type) == 1 and next(iter(enum_type)) in ("request", "response", "event"): + msg_type = next(iter(enum_type)) + if msg_type == "response": + # The actual command is typed in the request + response_name = class_to_generate["name"] + request_name = response_name[: -len("Response")] + "Request" + if request_name in classes_to_generate: + command = classes_to_generate[request_name]["properties"].get("command") + else: + if response_name == "ErrorResponse": + command = {"enum": ["error"]} + else: + raise AssertionError("Unhandled: %s" % (response_name,)) + + elif msg_type == "request": + command = properties.get("command") + + elif msg_type == "event": + command = properties.get("event") + + else: + raise AssertionError("Unexpected condition.") + + if command: + enum = command.get("enum") + if enum and len(enum) == 1: + class_to_generate["register_request"] = "@register_%s(%r)\n" % (msg_type, enum[0]) + + +def extract_prop_name_and_prop(class_to_generate): + properties = class_to_generate.get("properties") + required = _OrderedSet(class_to_generate.get("required", _OrderedSet())) + + # Sort so that required come first + prop_name_and_prop = list(properties.items()) + + def compute_sort_key(x): + key = x[0] + if key in required: + if key == "seq": + return 0.5 # seq when required is after the other required keys (to have a default of -1). + return 0 + return 1 + + prop_name_and_prop.sort(key=compute_sort_key) + + return prop_name_and_prop + + +def update_class_to_generate_to_json(class_to_generate): + required = _OrderedSet(class_to_generate.get("required", _OrderedSet())) + prop_name_and_prop = extract_prop_name_and_prop(class_to_generate) + + to_dict_body = ["def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused)"] + + translate_prop_names = [] + for prop_name, prop in prop_name_and_prop: + if is_variable_to_translate(class_to_generate["name"], prop_name): + translate_prop_names.append(prop_name) + + for prop_name, prop in prop_name_and_prop: + namespace = dict(prop_name=prop_name, noqa=_get_noqa_for_var(prop_name)) + to_dict_body.append(" %(prop_name)s = self.%(prop_name)s%(noqa)s" % namespace) + + if prop.get("type") == "array": + to_dict_body.append(' if %(prop_name)s and hasattr(%(prop_name)s[0], "to_dict"):' % namespace) + to_dict_body.append(" %(prop_name)s = [x.to_dict() for x in %(prop_name)s]" % namespace) + + if translate_prop_names: + to_dict_body.append(" if update_ids_to_dap:") + for prop_name in translate_prop_names: + namespace = dict(prop_name=prop_name, noqa=_get_noqa_for_var(prop_name)) + to_dict_body.append(" if %(prop_name)s is not None:" % namespace) + to_dict_body.append(" %(prop_name)s = self._translate_id_to_dap(%(prop_name)s)%(noqa)s" % namespace) + + if not translate_prop_names: + update_dict_ids_from_dap_body = [] + else: + update_dict_ids_from_dap_body = ["", "", "@classmethod", "def update_dict_ids_from_dap(cls, dct):"] + for prop_name in translate_prop_names: + namespace = dict(prop_name=prop_name) + update_dict_ids_from_dap_body.append(" if %(prop_name)r in dct:" % namespace) + update_dict_ids_from_dap_body.append(" dct[%(prop_name)r] = cls._translate_id_from_dap(dct[%(prop_name)r])" % namespace) + update_dict_ids_from_dap_body.append(" return dct") + + class_to_generate["update_dict_ids_from_dap"] = _indent_lines("\n".join(update_dict_ids_from_dap_body)) + + to_dict_body.append(" dct = {") + first_not_required = False + + for prop_name, prop in prop_name_and_prop: + use_to_dict = prop["type"].__class__ == Ref and not prop["type"].ref_data.get("is_enum", False) + is_array = prop["type"] == "array" + ref_array_cls_name = "" + if is_array: + ref = prop["items"].get("$ref") + if ref is not None: + ref_array_cls_name = ref.split("/")[-1] + + namespace = dict(prop_name=prop_name, ref_array_cls_name=ref_array_cls_name) + if prop_name in required: + if use_to_dict: + to_dict_body.append(" %(prop_name)r: %(prop_name)s.to_dict(update_ids_to_dap=update_ids_to_dap)," % namespace) + else: + if ref_array_cls_name: + to_dict_body.append( + " %(prop_name)r: [%(ref_array_cls_name)s.update_dict_ids_to_dap(o) for o in %(prop_name)s] if (update_ids_to_dap and %(prop_name)s) else %(prop_name)s," + % namespace + ) + else: + to_dict_body.append(" %(prop_name)r: %(prop_name)s," % namespace) + else: + if not first_not_required: + first_not_required = True + to_dict_body.append(" }") + + to_dict_body.append(" if %(prop_name)s is not None:" % namespace) + if use_to_dict: + to_dict_body.append(" dct[%(prop_name)r] = %(prop_name)s.to_dict(update_ids_to_dap=update_ids_to_dap)" % namespace) + else: + if ref_array_cls_name: + to_dict_body.append( + " dct[%(prop_name)r] = [%(ref_array_cls_name)s.update_dict_ids_to_dap(o) for o in %(prop_name)s] if (update_ids_to_dap and %(prop_name)s) else %(prop_name)s" + % namespace + ) + else: + to_dict_body.append(" dct[%(prop_name)r] = %(prop_name)s" % namespace) + + if not first_not_required: + first_not_required = True + to_dict_body.append(" }") + + to_dict_body.append(" dct.update(self.kwargs)") + to_dict_body.append(" return dct") + + class_to_generate["to_dict"] = _indent_lines("\n".join(to_dict_body)) + + if not translate_prop_names: + update_dict_ids_to_dap_body = [] + else: + update_dict_ids_to_dap_body = ["", "", "@classmethod", "def update_dict_ids_to_dap(cls, dct):"] + for prop_name in translate_prop_names: + namespace = dict(prop_name=prop_name) + update_dict_ids_to_dap_body.append(" if %(prop_name)r in dct:" % namespace) + update_dict_ids_to_dap_body.append(" dct[%(prop_name)r] = cls._translate_id_to_dap(dct[%(prop_name)r])" % namespace) + update_dict_ids_to_dap_body.append(" return dct") + + class_to_generate["update_dict_ids_to_dap"] = _indent_lines("\n".join(update_dict_ids_to_dap_body)) + + +def update_class_to_generate_init(class_to_generate): + args = [] + init_body = [] + docstring = [] + + required = _OrderedSet(class_to_generate.get("required", _OrderedSet())) + prop_name_and_prop = extract_prop_name_and_prop(class_to_generate) + + translate_prop_names = [] + for prop_name, prop in prop_name_and_prop: + if is_variable_to_translate(class_to_generate["name"], prop_name): + translate_prop_names.append(prop_name) + + enum = prop.get("enum") + if enum and len(enum) == 1: + init_body.append(" self.%(prop_name)s = %(enum)r" % dict(prop_name=prop_name, enum=next(iter(enum)))) + else: + if prop_name in required: + if prop_name == "seq": + args.append(prop_name + "=-1") + else: + args.append(prop_name) + else: + args.append(prop_name + "=None") + + if prop["type"].__class__ == Ref: + ref = prop["type"] + ref_data = ref.ref_data + if ref_data.get("is_enum", False): + init_body.append(" if %s is not None:" % (prop_name,)) + init_body.append(" assert %s in %s.VALID_VALUES" % (prop_name, str(ref))) + init_body.append(" self.%(prop_name)s = %(prop_name)s" % dict(prop_name=prop_name)) + else: + namespace = dict(prop_name=prop_name, ref_name=str(ref)) + init_body.append(" if %(prop_name)s is None:" % namespace) + init_body.append(" self.%(prop_name)s = %(ref_name)s()" % namespace) + init_body.append(" else:") + init_body.append( + " self.%(prop_name)s = %(ref_name)s(update_ids_from_dap=update_ids_from_dap, **%(prop_name)s) if %(prop_name)s.__class__ != %(ref_name)s else %(prop_name)s" + % namespace + ) + + else: + init_body.append(" self.%(prop_name)s = %(prop_name)s" % dict(prop_name=prop_name)) + + if prop["type"] == "array": + ref = prop["items"].get("$ref") + if ref is not None: + ref_array_cls_name = ref.split("/")[-1] + init_body.append(" if update_ids_from_dap and self.%(prop_name)s:" % dict(prop_name=prop_name)) + init_body.append(" for o in self.%(prop_name)s:" % dict(prop_name=prop_name)) + init_body.append( + " %(ref_array_cls_name)s.update_dict_ids_from_dap(o)" % dict(ref_array_cls_name=ref_array_cls_name) + ) + + prop_type = prop["type"] + prop_description = prop.get("description", "") + + if isinstance(prop_description, (list, tuple)): + prop_description = "\n ".join(prop_description) + + docstring.append( + ":param %(prop_type)s %(prop_name)s: %(prop_description)s" + % dict(prop_type=prop_type, prop_name=prop_name, prop_description=prop_description) + ) + + if translate_prop_names: + init_body.append(" if update_ids_from_dap:") + for prop_name in translate_prop_names: + init_body.append(" self.%(prop_name)s = self._translate_id_from_dap(self.%(prop_name)s)" % dict(prop_name=prop_name)) + + docstring = _indent_lines("\n".join(docstring)) + init_body = "\n".join(init_body) + + # Actually bundle the whole __init__ from the parts. + args = ", ".join(args) + if args: + args = ", " + args + + # Note: added kwargs because some messages are expected to be extended by the user (so, we'll actually + # make all extendable so that we don't have to worry about which ones -- we loose a little on typing, + # but may be better than doing a allow list based on something only pointed out in the documentation). + class_to_generate[ + "init" + ] = '''def __init__(self%(args)s, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ +%(docstring)s + """ +%(init_body)s + self.kwargs = kwargs +''' % dict(args=args, init_body=init_body, docstring=docstring) + + class_to_generate["init"] = _indent_lines(class_to_generate["init"]) + + +def update_class_to_generate_props(class_to_generate): + import json + + def default(o): + if isinstance(o, Ref): + return o.ref + raise AssertionError("Unhandled: %s" % (o,)) + + properties = class_to_generate["properties"] + class_to_generate["props"] = ( + " __props__ = %s" % _indent_lines(json.dumps(properties, indent=4, default=default).replace("true", "True")).strip() + ) + + +def update_class_to_generate_refs(class_to_generate): + properties = class_to_generate["properties"] + class_to_generate["refs"] = ( + " __refs__ = %s" % _OrderedSet(key for (key, val) in properties.items() if val["type"].__class__ == Ref).set_repr() + ) + + +def update_class_to_generate_enums(class_to_generate): + class_to_generate["enums"] = "" + if class_to_generate.get("is_enum", False): + enums = "" + for enum in class_to_generate["enum_values"]: + enums += " %s = %r\n" % (enum.upper(), enum) + enums += "\n" + enums += " VALID_VALUES = %s\n\n" % _OrderedSet(class_to_generate["enum_values"]).set_repr() + class_to_generate["enums"] = enums + + +def update_class_to_generate_objects(classes_to_generate, class_to_generate): + properties = class_to_generate["properties"] + for key, val in properties.items(): + if "type" not in val: + val["type"] = "TypeNA" + continue + + if val["type"] == "object": + create_new = val.copy() + create_new.update( + { + "name": "%s%s" % (class_to_generate["name"], key.title()), + "description": ' "%s" of %s' % (key, class_to_generate["name"]), + } + ) + if "properties" not in create_new: + create_new["properties"] = {} + + assert create_new["name"] not in classes_to_generate + classes_to_generate[create_new["name"]] = create_new + + update_class_to_generate_type(classes_to_generate, create_new) + update_class_to_generate_props(create_new) + + # Update nested object types + update_class_to_generate_objects(classes_to_generate, create_new) + + val["type"] = Ref(create_new["name"], classes_to_generate[create_new["name"]]) + val.pop("properties", None) + + +def gen_debugger_protocol(): + import os.path + import sys + + if sys.version_info[:2] < (3, 6): + raise AssertionError("Must be run with Python 3.6 onwards (to keep dict order).") + + classes_to_generate = create_classes_to_generate_structure(load_schema_data()) + classes_to_generate.update(create_classes_to_generate_structure(load_custom_schema_data())) + + class_to_generate = fill_properties_and_required_from_base(classes_to_generate) + + for class_to_generate in list(classes_to_generate.values()): + update_class_to_generate_description(class_to_generate) + update_class_to_generate_type(classes_to_generate, class_to_generate) + update_class_to_generate_props(class_to_generate) + update_class_to_generate_objects(classes_to_generate, class_to_generate) + + for class_to_generate in classes_to_generate.values(): + update_class_to_generate_refs(class_to_generate) + update_class_to_generate_init(class_to_generate) + update_class_to_generate_enums(class_to_generate) + update_class_to_generate_to_json(class_to_generate) + update_class_to_generate_register_dec(classes_to_generate, class_to_generate) + + class_template = ''' +%(register_request)s%(register_dec)s +class %(name)s(BaseSchema): + """ +%(description)s + + Note: automatically generated code. Do not edit manually. + """ + +%(enums)s%(props)s +%(refs)s + + __slots__ = list(__props__.keys()) + ['kwargs'] + +%(init)s%(update_dict_ids_from_dap)s + +%(to_dict)s%(update_dict_ids_to_dap)s +''' + + contents = [] + contents.append("# coding: utf-8") + contents.append("# Automatically generated code.") + contents.append("# Do not edit manually.") + contents.append("# Generated by running: %s" % os.path.basename(__file__)) + contents.append("from .pydevd_base_schema import BaseSchema, register, register_request, register_response, register_event") + contents.append("") + for class_to_generate in classes_to_generate.values(): + contents.append(class_template % class_to_generate) + + parent_dir = os.path.dirname(__file__) + schema = os.path.join(parent_dir, "pydevd_schema.py") + with open(schema, "w", encoding="utf-8") as stream: + stream.write("\n".join(contents)) + + +def _indent_lines(lines, indent=" "): + out_lines = [] + for line in lines.splitlines(keepends=True): + out_lines.append(indent + line) + + return "".join(out_lines) + + +if __name__ == "__main__": + gen_debugger_protocol() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e0dbebd6e25cc015f09913cebb562e0cf0e4040 GIT binary patch literal 245 zcmZ9GL5jja5Jl6Y!XS7Dw=T38-HIRtm+r=Gkyu4+O}d-zPN450c!s%&;4wUbWar9` z?&d?)|5ZGSx{XG|B(biH{p!Hj(MJ;QXcm3>)1NjuxB++ ztt1I4yOY-jjMYc>Yvp8KGE{+81EtKt1b@(KG5eW=lb)w0+n=(69T4YrVFF;oinL{l yC~-r8AIH2_6i?wB#EdfI*#e?e(j(4Hcz!P{O?AmDJBUw;Sgs3?o)E(JVtN4%vq$a# literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/__main__pydevd_gen_debug_adapter_protocol.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/__main__pydevd_gen_debug_adapter_protocol.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7de7a2489e6373344c7f275eddc40b9860a07ec0 GIT binary patch literal 27416 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_base_schema.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_base_schema.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9f73e9f51c4fb65b200fa6880feacbb3aad35fe GIT binary patch literal 6231 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_schema.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__pycache__/pydevd_schema.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e730f66f76cf576750e5ec0a354c7414885fc4e GIT binary patch literal 624791 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ίt-92}-V=fL!# z3dYe!XG1`kf*yHu)&a~Icr&DS$X(DXO{|W6U{eG&3xQHM5=RCj- zAdn`jFd9>p3}cAmI>TrV#80uT2;V_ZQXRtaz+R_&eADvd*rbnRll&#JKaNd08t;#f zTxV>OC8GQ)@Se`FHAr?W0ZJ08BwSor^aOs-9JExbFeiLh%Z0u`CtGhACKJ;NKK{5W z1-I<>Nh%(d;TI_{zJP0CD%ucI=~{Ncl8#?u7{ubYmu$YYWb3(IZi;%IV^sKCR@h40s;Fa!VFa&AEzu3WWGMTP*QVd7rIByMp4A@{B}96cRvf z<^XE5MCU!1L~}P|R!tOqwgxbsmH6n}CUU-QUq6AkcsX0eNR>q0F;XQ_9V3N^sbZX2 zBxjbK43_(SQ4y# z4-2|Q1Xl+xVcvGUIdC3o9q~^w?S}svr@>BVqieb&sO+#Rcl^{1g;fD`bJ04O#ti7D zFRn^QO-;6MO}1}M+;=q5zV%XjpA$s&(GRn_C2&CegnUJ-LatUeN=UG*Q)YY5uaO@A~f*)#r~e6YNsW(n}TXFE4w!5tZDY-V3-0L|!50${l%CwE~e> zj|N6wH6rqAL#D_pzI(7;;UfCs=C&)$(z5Vlc;z&EEX;|!pJE_C(W&pB%UZLNd-FL? zF)=Uv2tR$EyBU}lzQFT@blsqN0R{zQ47Uw1|9^Ye0vy$GWoJeM21$lN!i$gu42VBi z#tt?CY`!uEfiVWm&yGQ81PlmC8Ht~ajpNM+Z*W$s#4$;5LY&kFZ)%flWve#Xl(XLK zR)yWfsTl@aN;XNkoNVmM_r02|vd-3S_MF@O`n@-LqYvP9oI(Y+yQlm0?a%Gow{Lgf z#v;53eJp=aC=>-9+wDLB)Sp%;m|ToPp-3wfe9zO0MIV#)8mSkI%D^d;JI$ajF1G&a zg{g(r3zXCJ64$*bqYuBqAdaSpervb^*T<5l`^lfcsu=fLcr)rPTMA#-&`@)5A1;C& zP2wI}dy|+SmCGkkHQ<>D&(_9uEkXkfPT`77M-z=(UBBU^uMv5ao7c4nSFJ^G?_uOA z5C*>bq?aJ>*D`wteKQ0t0-uTPFO~RI2{*6usuKKHpss-mq2~5?@-3>{3b$YWvcb_O zJc#xjOrP)-$xXHX#aaLg4OSpf*9>zjCw*j&4C| z6V&}HN1HH8>lQ{`rEX!g_cqq!kPVf@95CjfSs22=989w?ge>AHMPbdt)WT$`)e8+A z)qg-Hfj70hDh033;i}XN1K-*jOuO(Wc&m$7Fbgo>eCDBa4v&#_xc9oA#)72qy)G_7 zQv@T~)vu$gU7Z8(bv=+7w@vFDT3wyPk?`B4bCBC!&^hE?_!>a%PzANal0s?+*4(Fd za8_?`?`@1vqFDV^1079m>sq$blxoMdJ*xF_5`lYE>lp^m61=mHYAGuw+y~K16MZK` zwV2vIZo}hWNtn07n`=#NH*;@P#X5WW?QKns$$d#&eOD*E%w>Fc8OP|8+Y;2DKB4L?$0TQ^LGE%a=3S2Jp4jb~7!T>k-p#uli?841K+ECp zO7C(!?=z>zZpCph>0S3Yn2><~IN0;v<6x3}NXNknQ-hw1pCd6mf%;s*kzAg`rHQ80 z#T#Cku<6BH&z1I6EX`Cb{o2ZxE0$#^&_q)wPKFKfR>zyMv6HP?&N65eb8pY~oROucVmHvO=-d|wjUm$pAaqoxn&s`0~z4xOn z3$yO#R=f`h{doY-e%;5jQ}4m?vizH=%H~HvZ~1uhi$mnii^!WRdt&dxo(YUt#_k|* zUUZ!|3v0e&-khRot^Vv-de_g6Q+wFO`PXQs0)6L{LVc_`?!U2%ui_5fmP97m_Tv6m zCTxUJyyBjU#hD5k#jCh8J7Ht`*keQFwi^dK{!3<)BKVtuxGk+y_g3A1Ros?H{s_74 z3n*4UZo9hma9eW|xxia0EB^x<{~HAFEN;7IINY|;ZA;k-2;i%~7%E>4=ocSf{pk?- z>QeI6$vv?}nb@MQ;r{Xx^3|o+`RZH3SEYA{&Q}ZdvF5A4W*0wk<&y071DV4e7jZXv z^NaVN8`D#9SEk~wuij?C2L6$yv#D^y-!$n_8wj!dmvrA z4QLO9*UAO5bwn=bC`Jxy8p3~7nRtBc)j0{D`v@9q7-t}O$D-t1RNtW}P29LY;+%sT z)-8%L&MgX97LCbUL*MKsCUrd`&0sx)8TzsWmkHFV1*bVVM5yPHOA&8K)8<Oa4jO}B58*?aiC8>m^|h5!-%}= z6a{m~1&7VpGstKC`V2vn={mgDwyw_6h?t+%uKO`q(u84))?*&&TB}=3-><@hIfrn& zR6kiy-;%h5^~SwAzK)${H*-9>1HFrq+j)?k=kyzr?ReO&KyedI?Tx9V(AtuCof9~U z!vRglJB+1mgP>nFrnGfxV;lAgWrLfU(IeImVRiAaEG6O%dt33SEqBKQvfSu7_&Yjv zi6kdfSyAMWA+HB3(iDO`$snl`GORo?C*KIcN=iv<}#_W05t=G*bodVDrtUC9A=< zo&+9fkj6N#`}CH;UQWEXy!vwdwx0O%4E~ibPnRxFmoM*~I1QGG#+Y~JOUh0!|6$d< zY}L)D>&|SzaWftgeyYS85!xBv6YklO%BKK$sV9gkj)#WS(3>D$+)V_PrYb1AkJ zEU_-K9?THufbr=_{b~Q(iD)Bb=IAwehHvHw>K!xSkb(Zgqw|H%$2zA~-B)_Nr&YZ- zr*vMv{U!HJA2SFYoI_AG;Y}aB--9!#dHwx3@(@-9ddQ0sQs8>UbHLPl>pLiU9Lf6= zjVyYm7A6`!Jx?LcoInmxG`TPG7_;Es-yF*#uU5?j<#-N-@+Ef9Ydj@oY1p}(H2pKX zKe0Q#eAC(8*-7`qSkveyHx6K|>7%Ukbb=WK3ka$SDhW9I2zZk-^M3r~Zd^>AlU}?# zGht6}e0F;A!gOn6zn1_vH#H<28>{VYSQ<55yPJzYVTZ`n%-JgSQwINo;AaGC26h?= z2|^M4=Mc(K!9A>Ni7@Tyo){F%+Akxs0@H-HX{)sVj)7Z!u5Mp4)!qT?(zv>ZU*z?3 z=WdugU2Mf<)`7_Y^Ik*zK+|!31P%6VaVT$J5=M>V$C7x9z3sgEhEOK$?M-(qG|wucts!9~oJSSWm3x?@dU=rcjLo})x;RF7p>vg^w%4s&4c5!?NG;5q&!Pe6hQAy$1a`2@KrCYJ-PN1Dm{!N&A0YI#Ir58nK4J+`R<7nmEG z&3$MtF1hzK58rPwLvZZN17Gp;X&!RGYuvhTaH7T+|6P5I0`9zc9PZhn$O zn4&VcxmvfKDd`=|x>pg>^MCFP!0^{%c#}M;-z0~XbP9HwaYr4-eb6fcBA$Q2D>Vs;Gb`tkB{ z>5@sk)zh$=8TI77y(L)q)bviPMQ}`}bjlU4Zpdy@1p8QsohXEd5ewr@krCrbI)@Rr zF+8!@E*UM1cl@A?_XezI%0@ekm$({%#{4<`^!6TvDnl{)vE904JLIXR!w{GpIp&%y zW5xiP=NQyj24e*8tgW3bhRgVlLE*t0d2@$5VoKO7IFVn3hBtepUF)Q#_#Sd`#=}BzOGBn8QW$NppDWd!kq`?5SCJsb(Pz*!J8sGjr2S zny{@4a}Q`%Pi#ddw&KNcFUMAM52!ADeG^EHV(?YU4|#tczB*zH?1Y8!|IwmjjxUNA zrhNyW*tgJ1Nf)~ZpM(zlJ3@{vOS$$e$v@8-&NV}rzbH{$xDZKbF8n1@#0OCaaABAE ze!pbGxqHrU_{zA?-uIQAm#dfe-g?(7Rm(1{JiGEU>prpW+4bqFWv4d)yjoiM{n*sc zHbV=!Gu#w@rMfA-W$Wch3wtK5&rDi>aplXCHfF1vUL7~dx*;kTnu|lh25rZNs+Yg{ zT6NQ48%AVUDS~d6JMZYz1n20}-RYaw^j59LX8gqA9(^iyI5v?qdixd}T>f(V;P^FA z$D==-e$VXPUV^H;ruNUM#)w?9?@3%@llnChd&e zTPBs2T^Ol7!HIC{S0ugP5Lf{1Mflaf7@nw$=UC`zuid>n*^=zoz5611E@ksmY8!o6 znGOHvRscK`g18eo83}xJXFwxVSbawD_)d;EeoOG5{mM8M2s$hJl~E6hmsrF;e#s(k zEUYDE??@MYgJ1m4`9gkb#HZ$uW0QXaZ8bXT%Nz8QhK?CGv(>milqh-b$_%!d2MrUk z#En8^vBVf5vaxfD+T8pXm&2maQPWN_2+1Ou_QCU;qr4hXfLC~ z`6#5f|I8O=`!B37KZm{fos0~@ep@6Eqp3%r{WfkmMl?ole>$88(mpVneGyL`O@4C0 z+oU%Y3k_k5(|f_&4S#v`N^H%6|pdiBLh7=OF#DVSDfn?(WS*_w&Fk!%BW3Pfcvd?AGTNx-%o&4QYX=~YWRMVK^eZa=q5FMKgHiTe4Wi$`9@Mo zB8fNBZU22W*^Hf0h#mRl+c&_5+b00C?8latonH3C%DLIf`KRliT8}N#9pQ(=J=^zZ zw(q}u=#fj?ACXPfEwZV)<>H!4u`SqCT@_iYH&yuspFXMjVRdb`dI9pdm)4o8d&*~I z%4b}jv-DE=Qd(!K$;7s&7uBa@+b!F z5boJ|FthXE<(5;IcAmP7x2|Fjr0-aljy-U3`=!_eD8ib^y`FttRg3ALLM6_yNP3I7 zDD+TxZ@A~dLzxE;U2Z*b>A@4{=4L9lrx$NX18&-Osd78AS`k?j;dce?jdP?I;eT!} zT5b3m3CO?!qkW*=;e&=(0IUAP4zQWlV4z~K6wyIbj2J9MB62Q@x9Ub7G~CoF%Mf>& zp)YwHpUB(5kC*DovpyY8R?@#>9q;vX!#IJ>x(RKL#&yn1#PjO!Kao_lH zR4rJ=J=4+o1oPsQv^#q9Lb4e5&6*@}C6Crp0kRQIX$;`**r*$Jc| zZ+dL-ia=i)D9{fkH&NgasUyn)+lE3r`j;`Gnq(M++m0u#?NF$EP2|<8MDO_7(7xPM zjNvzZLpc4wflPU_ciLSqp3IbOwa1PUjZ7IdGMCDiWydZbXqR~kv@)y0Mjy^{Gy=Q% zbBH;|GWmskJUv~Mh$cpyizLHWA?}Yf;(l@B29d;y6Qe{D8;yIb-$8*o4+ctNE017y zOC>w6ty1P9dqQm2{40H;5EoI4Ou_jxtARLv>8Ay!MHny-^+&yT=X>+#XT1@rHtkl* z{^{1%LsTMf#eQgm`~YP(exXX+2_s5x^UY4yHq|b{_T&-h!Ko^5!U?Lo=Xho&ocWNd z$UGBOhkoP-cVc1RQqAkJ-=_ywzozv~Dl<5+Xc0}6Cez+UrOD)i43+K1|G9?%3Nuu_ z^Hv0Q=WS_x!@pp*`bFK!Sl<*uWgFQjRfeitD(Z3?U42m$NK_nIw)?9ue5FS5mEh`Y zwlbf!zYQ6HtyIT*s&C6w-8W_sXrM>u2jc=HcA@wR;@AKj4i|u7?HL!2 zgAJ?;uOl0nRWAm$*AK;@_6Q8|F(aL2JaKHC9YxFipiGG~yScr+yB&MPhZ|CC`xILy z#pOf_i9;#wcBVK7rC9CMI)ZHkTqvYINbn(orwKkq@EpOn2{HsfAb5@7mjq*hJVoQs zsaXUI2<{=+NboSheu6dv8Zk_LnBWY-7YM#e@OK2?B=~27eA7U^c-Vf`tT&36>D7 zCRj_bj$kvvc7h!QdkOXv93bcFC4w&#e4XH*2);$|9fBVa{5!#G1ivQu4Z-gSBGh9P5!^`d zW0KEZ^sOV1hf$W%CvR(sjs8vsKS1yi0x_QQRr=n`ZhSw%w;0UQ_Y;E443@L4?UX?crU?Gf@1`a6Ff@r zVS+ORA0-gY!{_MxB7rPeMAh(32LF-Z+XRnr{Juc&62Z#^KPGsCpp?y2K~O_5k6<-H zJ;5%5MuI~Godh2uI8X2;f^QHsv4WihT?C&exJdAQf;R|8vNgU=@LhtR5ro-qeC<%) z_mVeQPR0?0LadlXi-H`C4!jn;k-kDzaMqyVR_nVS?WzeJP-Kf*j^`>Rm+KaTP${bY{I2tK@_6`)cyzAZBaJArMIl6XvipHdqtf(nptn0>X zc(SCun`u!Ex(4SIE6T9F2{>b2qqE^kN&6nAU6KpYHEFA?D8u#&;D~jVIAvJLv?v2z zlNM!Q*j_97j>?87O1=w`bZ#yL$E2*Zq6pe8s93D4G#j2I3GYNg^c5VFaIzIe(8kn+ zgeJ#DDn~dbA#y~}h8oVBa2JaS+;qK38MZ0u$`g(^O9X8UG~_rY8=fNd!B1z4 zb0KfSxD|C1nwH$D8qI$)23tbY zxe#4RW64i8j5=T}EzgE)B&&xIeHO{+nyjWBeD<1QBb?)~%f+Z6x*U$FA($nC)^SzC$!es)(FozQR|&$! z4tr#0kw5x65e(ApM3-l zH7GIG8Mf*bPSlAE2~NLCE_EoLm0`(!l|<3qN~X(ZWy7pj%38)ejd%?V*_&wumKPzS%#Nf!7)7KN}hH0pof=P5yQs3oM120 z?aGDdnl=L`VA!t5go{x*HyfTOMZ`2ne&(GV=gZ`1adJeDVoaO|(ttt28xZ07ZbgC8 zSJ9jO6*Y<3yh!V9UL-}(p<2!k=Q};Kh7~ar1}X|RcC%njG9AiB*HpCDiZX0t#l(sl z&Vgy1jKe#*gKr>cadJmR*D<%bIV{i(A<=8^P@QV1V;|F1=0bE0R?r8-HdbsttYB}% z>ScPs>S20pULXx@UV~ET2q=Bc3zQ5y)5*=*aILfo*f<-{%iM4AF?Zm)fXo6>)@H-E zNG=p*E}-N-5oduFH6l(~7idTcSZG8t5O33he|Vafq>a2B(zYV-*<`{HPn?m?8I>d5 z%&cr%jC6)&dM)chUn`1@{_%Wec5$~Bbsvb zQ$X@@1qetkS8&B_5qXiNPvpgX!mve=7iiZozk|6DU5%Drd$XV&x};s!Wmr50CRx09 ze1gRz=!{RPD%vf$s>9*(ra!^nSqm?hM}H#daCzclhX&&`T`J9sqWPK^UFtS(y3EKg z82@BiUakP1<>3k>B4idoMCtPB+3*Y@Tgn0Ckv{ogrcXWqi7Vk0^uoEyOGOY(JyZlS ziyS#X?&@0R2#u@@g+^Z;AvC&mbjcROo@DD~1|VAxGr%H}RO?$++FVr*k7mI))Y9vA zD`*j_~*>kdpv7%ZM6axghchoHrEU~wPCXOeSJH|inT7ukV~ z*%EXOLJTy9?V}jJW!+jP>5JTfq@B4C9Fr16ji8lM2+1Q^dc!-dh+&)M-C8D5I5~=Z zI3bgGaDu6G)zwFa$s8TxCt@@Qf=ZU{i%=jU9nzIzS@M%j8L7PcE=BWwIC_L+Xn(q< z^q_i%?OklxZb&awLiACV8@OTTsfLB4F~Vo#DF+}l4f_BxX2a4o2+^<%+ilXYn%DJ3 zNd8FbkUx_nC4y=UbZchT7un2A(WP`vreIMF+tBAm$}(k|CGS@;Yd2KU({6g|%BowhSo>rZOJ?Vr zej$Il({Hz)AJhOq(YylyCG!jb(Ge7TbOct!s0Yfs_59EmX=XQ~A?TWJ#86_`epran z)Dhwg$=fT{ppFQtMRK2r!mOlO>3gMPx1KHRNYsa(7U4+66fY2}lVg*9O5z4yFC?~>7KSGRh55oDXL~wLR!e>7$lw*dtAe@_r5JNl& zA;$&~ddCJ3dd3DNV75V^Q0%gmA>cGUNu0>hixaKt!8w#xrR2+Q^hv~MRaYYJ){~NA z0L6ZU;IbZsP==Bx253jSwW^~p!o?Gtimss>v=zf@QRQ|cYdB!5z6%M^1aNdW!e=-8 zyOHWqmdd9#MK>C?sfTU`MYx`s0V7?Fl3x2E|LpLf#!1&y5;z&QP9iO4)B2GZw8)CC z&Wc`ZSE)o(L(SEZ(Og@i%(kes#@FP~RGb^mZOKm-nKq)2GkRApL|11{uXPk-2GJBu zJ6*xl;txtDmC1u&I+KUR*+gmN`y!`wwsdv2^jdXLXCd4BpxWwUnO$ucy;ed+?}Yz! zeJ(^-e@(A-Ttz>`Xq1Ysj;7aoOhvZ>5oZp%I+|W9p{hhu0BRp8SR@6MOO_M(G;cX! zaXEqL1?p2cI$!v#ed^Ong%pmCgAYcH`5E{$rzeMdTl~S1Tp){bRKd}o!Kc)7V6dnZ zTZyiYrPtb^>Pd_s*C33`@!^tO2#)>^KC4buf)glnH502PbFIY<5fnDXXq1+&{+M11 zM+_LveE~L~*)Oo=932UtMU5gpy;*$;N5{cu?NM>qSzw;dM)bVf$|9alzr&xXnL(S)q0Qu_;Ek60Me6IJ%|v<;k;01 zz+9ksK+ut{Ig+UhqpNYyD`FTVD6I?Yi*Q9oO$S{`M*v+I!=ky3Wnx-cBZHZ06K60p zDbyy8B#82vlw5)`sacBZvt8Fw9 zv?z8uQn;(f@XDK5Ua`%+i!R8UX3^CrdTx|>ylF4^L>lwRo4bLPT!XG@Ey$Y;TXm}Y zKnLu;K*GQrN*$X|GO@U@Lvw(dNo+yn4U*)538c}fK!?xZNP(;feD+#oiOTC$yfifj zfYa1WiB&v;4!IC{XC87JV+*8WBzDT2Y(k$biZ*1};!X=HQLRb}N0$aZYneo?1Xp6i z(AAOjS~!`&FWEn+htoe6e^BdTHS&QtsA;C)v$?qt9Gxe8R-I~55GLuuAy?nrvx=ob zBwhU_y;i*{&1{t|932UtwM}IU=D{xmxd}N&eF2Vf588;;8Wi& zgvDJ5#E}iN0}HTYie@NLAX!aC+>$){ut*=smfCSf($yuRSM93xMP{gq!qJiNS)0_S z7#vh*!qIW?S=bdqu2?p4==;`D7S~aTL#nUL4gL)6*-xYGFzH!{tIUPqXl(FVTUD0$ zuAko2^W6oY3;b>sYRbV#SLaHv+P>%$1v_E`dzmQf3&c%UO$tY63ZKQj9n_wp0rCtK z4bWVq|G-vb9PkCk?L(Q_`E)f#dM&EFfpV(K7LJaD&*^>^6|ECkR8*01fz`(c?BKxf zI)R%cMOR~_*TShN7UvQ8`7K=?O|NxQMWcoVNr#Paus|bl>>w_1>_CQNo`Is=ZTJoy z0!J4HJ`4B2SX2-V^9-aNwhrQ)*0D(~4$XnYz07fK6rS1j`hR1akY7pwn?jerC4?Xfv{I9h{v^r;QG`KSIo?TF$6i~r6B4Jk zRq8EmDn;_CGi$F+fm}M4-+cS# zy|*)O-uw0^QS<^jzE8b7`iBF6-`RsbgeqA3g@Re20u?4fv@*jeq|aQEOYu=20uCUM zaNCacd7%oU0unxhDu08EI;kyR)4Nnh)J=Ui)qQM~XtGg#-oUb@Zeb(jUw{>?3JY8X zMMc$l2}B!Ix9YkCqk$}xJb$vKAqkrP{xlvt6&pc=>G;?bcWitA)MiCd(eU`Fk{&0S zaiS;($RvqZ!&)I-RPyw{_9NBK0%9qdz~7PTO9AKx5D=Q&%E&{)ysVJ}q?R;$llXWJ zCVaLT?M)L+1e9c100hOPkQSv}_1$n!Zq(P*#K=UnZi5Nu!p>~}&|j`U|oef~KMvLFIFfdMBt z2+q>GfZ%H5B!3o6z-RSYP|-{7p|UVeM)n_FW4A3@(mTb+_70b!Sccv*7uzd&O`-2( z&*?W!U$snZ#-xA$R9)#N^8jFEIk&fs(ckvDWh8%`oQl|}kRIjIfHnJl@G*1HaL9+D0E(*2oO zd@MGK4B4vtOjcGd(w(L;QmLtmE~>IpnU&#jU8SL_Cy%MI3_-YRq!{rFC>2wZ>Cpq3 ztSMN*a68>@1N|F6P*DJnT>g^S`WI;MgiGz=j|NJCwzp&TV)$u<$+sVZ>KuTuUua#8$0P~KJM}Lw((1?kzP?)I_{?Ut|;_2d+u&>G2ABf zhFve_jkliVjY~OzeS~p}HF8f?dYwZoMyat#okJ)`R9T017bF(7voN$5YkWaDhuwlT zY-=3Kafy(vtJvBkV+TJ%){P@T(g8Jm00ycJcq}TE`G(N5<^K zMH$^Oq9u{!$Bay^>cf79*rx`wqhOX3%#wi_Q(;C@crz8Ihu~No4bx^YJsGU&L_w2r ziO1}KxRnWZK!e>9?LXW`XERXwR8T{dAzE6;+o*O2GrK~CRqwz08cP1qbmZzgPgv!< zJe^M$q*LsiKT_)0HSH@kZk>yN(OqnmR>J!qgb&{jA6`7O9DZ$jz^+kNuTO$)4}y{V z!N`2`&%uN1BK2SAY0Om?c-6xy)=PD(fQoW`rEEm#em)KLwDJpY1bY0!x5wNRFZqR@ zCeKpH#c-?8v%@99At`8bX#;Pi4(7K1c0O%v#s^9~ZBZOCFw2JN97TlkpXp$ 0, the output contains objects which can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." + }, + "source": { + "$ref": "#/definitions/Source", + "description": "The source location where the output was produced." + }, + "line": { + "type": "integer", + "description": "The source location's line where the output was produced." + }, + "column": { + "type": "integer", + "description": "The position in `line` where the output was produced. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + }, + "data": { + "type": [ "array", "boolean", "integer", "null", "number" , "object", "string" ], + "description": "Additional data to report. For the `telemetry` category the data is sent to telemetry, for the other categories the data is shown in JSON format." + } + }, + "required": ["output"] + } + }, + "required": [ "event", "body" ] + }] + }, + + "BreakpointEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "The event indicates that some information about a breakpoint has changed.", + "properties": { + "event": { + "type": "string", + "enum": [ "breakpoint" ] + }, + "body": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "The reason for the event.", + "_enum": [ "changed", "new", "removed" ] + }, + "breakpoint": { + "$ref": "#/definitions/Breakpoint", + "description": "The `id` attribute is used to find the target breakpoint, the other attributes are used as the new values." + } + }, + "required": [ "reason", "breakpoint" ] + } + }, + "required": [ "event", "body" ] + }] + }, + + "ModuleEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "The event indicates that some information about a module has changed.", + "properties": { + "event": { + "type": "string", + "enum": [ "module" ] + }, + "body": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "The reason for the event.", + "enum": [ "new", "changed", "removed" ] + }, + "module": { + "$ref": "#/definitions/Module", + "description": "The new, changed, or removed module. In case of `removed` only the module id is used." + } + }, + "required": [ "reason", "module" ] + } + }, + "required": [ "event", "body" ] + }] + }, + + "LoadedSourceEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "The event indicates that some source has been added, changed, or removed from the set of all loaded sources.", + "properties": { + "event": { + "type": "string", + "enum": [ "loadedSource" ] + }, + "body": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "The reason for the event.", + "enum": [ "new", "changed", "removed" ] + }, + "source": { + "$ref": "#/definitions/Source", + "description": "The new, changed, or removed source." + } + }, + "required": [ "reason", "source" ] + } + }, + "required": [ "event", "body" ] + }] + }, + + "ProcessEvent": { + "allOf": [ + { "$ref": "#/definitions/Event" }, + { + "type": "object", + "description": "The event indicates that the debugger has begun debugging a new process. Either one that it has launched, or one that it has attached to.", + "properties": { + "event": { + "type": "string", + "enum": [ "process" ] + }, + "body": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The logical name of the process. This is usually the full path to process's executable file. Example: /home/example/myproj/program.js." + }, + "systemProcessId": { + "type": "integer", + "description": "The system process id of the debugged process. This property is missing for non-system processes." + }, + "isLocalProcess": { + "type": "boolean", + "description": "If true, the process is running on the same computer as the debug adapter." + }, + "startMethod": { + "type": "string", + "enum": [ "launch", "attach", "attachForSuspendedLaunch" ], + "description": "Describes how the debug engine started debugging this process.", + "enumDescriptions": [ + "Process was launched under the debugger.", + "Debugger attached to an existing process.", + "A project launcher component has launched a new process in a suspended state and then asked the debugger to attach." + ] + }, + "pointerSize": { + "type": "integer", + "description": "The size of a pointer or address for this process, in bits. This value may be used by clients when formatting addresses for display." + } + }, + "required": [ "name" ] + } + }, + "required": [ "event", "body" ] + } + ] + }, + + "CapabilitiesEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "The event indicates that one or more capabilities have changed.\nSince the capabilities are dependent on the client and its UI, it might not be possible to change that at random times (or too late).\nConsequently this event has a hint characteristic: a client can only be expected to make a 'best effort' in honoring individual capabilities but there are no guarantees.\nOnly changed capabilities need to be included, all other capabilities keep their values.", + "properties": { + "event": { + "type": "string", + "enum": [ "capabilities" ] + }, + "body": { + "type": "object", + "properties": { + "capabilities": { + "$ref": "#/definitions/Capabilities", + "description": "The set of updated capabilities." + } + }, + "required": [ "capabilities" ] + } + }, + "required": [ "event", "body" ] + }] + }, + + "ProgressStartEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "The event signals that a long running operation is about to start and provides additional information for the client to set up a corresponding progress and cancellation UI.\nThe client is free to delay the showing of the UI in order to reduce flicker.\nThis event should only be sent if the corresponding capability `supportsProgressReporting` is true.", + "properties": { + "event": { + "type": "string", + "enum": [ "progressStart" ] + }, + "body": { + "type": "object", + "properties": { + "progressId": { + "type": "string", + "description": "An ID that can be used in subsequent `progressUpdate` and `progressEnd` events to make them refer to the same progress reporting.\nIDs must be unique within a debug session." + }, + "title": { + "type": "string", + "description": "Short title of the progress reporting. Shown in the UI to describe the long running operation." + }, + "requestId": { + "type": "integer", + "description": "The request ID that this progress report is related to. If specified a debug adapter is expected to emit progress events for the long running request until the request has been either completed or cancelled.\nIf the request ID is omitted, the progress report is assumed to be related to some general activity of the debug adapter." + }, + "cancellable": { + "type": "boolean", + "description": "If true, the request that reports progress may be cancelled with a `cancel` request.\nSo this property basically controls whether the client should use UX that supports cancellation.\nClients that don't support cancellation are allowed to ignore the setting." + }, + "message": { + "type": "string", + "description": "More detailed progress message." + }, + "percentage": { + "type": "number", + "description": "Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown." + } + }, + "required": [ "progressId", "title" ] + } + }, + "required": [ "event", "body" ] + }] + }, + + "ProgressUpdateEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "The event signals that the progress reporting needs to be updated with a new message and/or percentage.\nThe client does not have to update the UI immediately, but the clients needs to keep track of the message and/or percentage values.\nThis event should only be sent if the corresponding capability `supportsProgressReporting` is true.", + "properties": { + "event": { + "type": "string", + "enum": [ "progressUpdate" ] + }, + "body": { + "type": "object", + "properties": { + "progressId": { + "type": "string", + "description": "The ID that was introduced in the initial `progressStart` event." + }, + "message": { + "type": "string", + "description": "More detailed progress message. If omitted, the previous message (if any) is used." + }, + "percentage": { + "type": "number", + "description": "Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown." + } + }, + "required": [ "progressId" ] + } + }, + "required": [ "event", "body" ] + }] + }, + + "ProgressEndEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "The event signals the end of the progress reporting with a final message.\nThis event should only be sent if the corresponding capability `supportsProgressReporting` is true.", + "properties": { + "event": { + "type": "string", + "enum": [ "progressEnd" ] + }, + "body": { + "type": "object", + "properties": { + "progressId": { + "type": "string", + "description": "The ID that was introduced in the initial `ProgressStartEvent`." + }, + "message": { + "type": "string", + "description": "More detailed progress message. If omitted, the previous message (if any) is used." + } + }, + "required": [ "progressId" ] + } + }, + "required": [ "event", "body" ] + }] + }, + + "InvalidatedEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "This event signals that some state in the debug adapter has changed and requires that the client needs to re-render the data snapshot previously requested.\nDebug adapters do not have to emit this event for runtime changes like stopped or thread events because in that case the client refetches the new state anyway. But the event can be used for example to refresh the UI after rendering formatting has changed in the debug adapter.\nThis event should only be sent if the corresponding capability `supportsInvalidatedEvent` is true.", + "properties": { + "event": { + "type": "string", + "enum": [ "invalidated" ] + }, + "body": { + "type": "object", + "properties": { + "areas": { + "type": "array", + "description": "Set of logical areas that got invalidated. This property has a hint characteristic: a client can only be expected to make a 'best effort' in honoring the areas but there are no guarantees. If this property is missing, empty, or if values are not understood, the client should assume a single value `all`.", + "items": { + "$ref": "#/definitions/InvalidatedAreas" + } + }, + "threadId": { + "type": "integer", + "description": "If specified, the client only needs to refetch data related to this thread." + }, + "stackFrameId": { + "type": "integer", + "description": "If specified, the client only needs to refetch data related to this stack frame (and the `threadId` is ignored)." + } + } + } + }, + "required": [ "event", "body" ] + }] + }, + + "MemoryEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "This event indicates that some memory range has been updated. It should only be sent if the corresponding capability `supportsMemoryEvent` is true.\nClients typically react to the event by re-issuing a `readMemory` request if they show the memory identified by the `memoryReference` and if the updated memory range overlaps the displayed range. Clients should not make assumptions how individual memory references relate to each other, so they should not assume that they are part of a single continuous address range and might overlap.\nDebug adapters can use this event to indicate that the contents of a memory range has changed due to some other request like `setVariable` or `setExpression`. Debug adapters are not expected to emit this event for each and every memory change of a running program, because that information is typically not available from debuggers and it would flood clients with too many events.", + "properties": { + "event": { + "type": "string", + "enum": [ "memory" ] + }, + "body": { + "type": "object", + "properties": { + "memoryReference": { + "type": "string", + "description": "Memory reference of a memory range that has been updated." + }, + "offset": { + "type": "integer", + "description": "Starting offset in bytes where memory has been updated. Can be negative." + }, + "count": { + "type": "integer", + "description": "Number of bytes updated." + } + }, + "required": [ "memoryReference", "offset", "count" ] + } + }, + "required": [ "event", "body" ] + }] + }, + + "RunInTerminalRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "title": "Reverse Requests", + "description": "This request is sent from the debug adapter to the client to run a command in a terminal.\nThis is typically used to launch the debuggee in a terminal provided by the client.\nThis request should only be called if the corresponding client capability `supportsRunInTerminalRequest` is true.\nClient implementations of `runInTerminal` are free to run the command however they choose including issuing the command to a command line interpreter (aka 'shell'). Argument strings passed to the `runInTerminal` request must arrive verbatim in the command to be run. As a consequence, clients which use a shell are responsible for escaping any special shell characters in the argument strings to prevent them from being interpreted (and modified) by the shell.\nSome users may wish to take advantage of shell processing in the argument strings. For clients which implement `runInTerminal` using an intermediary shell, the `argsCanBeInterpretedByShell` property can be set to true. In this case the client is requested not to escape any special shell characters in the argument strings.", + "properties": { + "command": { + "type": "string", + "enum": [ "runInTerminal" ] + }, + "arguments": { + "$ref": "#/definitions/RunInTerminalRequestArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "RunInTerminalRequestArguments": { + "type": "object", + "description": "Arguments for `runInTerminal` request.", + "properties": { + "kind": { + "type": "string", + "enum": [ "integrated", "external" ], + "description": "What kind of terminal to launch. Defaults to `integrated` if not specified." + }, + "title": { + "type": "string", + "description": "Title of the terminal." + }, + "cwd": { + "type": "string", + "description": "Working directory for the command. For non-empty, valid paths this typically results in execution of a change directory command." + }, + "args": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of arguments. The first argument is the command to run." + }, + "env": { + "type": "object", + "description": "Environment key-value pairs that are added to or removed from the default environment.", + "additionalProperties": { + "type": [ "string", "null" ], + "description": "A string is a proper value for an environment variable. The value `null` removes the variable from the environment." + } + }, + "argsCanBeInterpretedByShell": { + "type": "boolean", + "description": "This property should only be set if the corresponding capability `supportsArgsCanBeInterpretedByShell` is true. If the client uses an intermediary shell to launch the application, then the client must not attempt to escape characters with special meanings for the shell. The user is fully responsible for escaping as needed and that arguments using special characters may not be portable across shells." + } + }, + "required": [ "args", "cwd" ] + }, + "RunInTerminalResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `runInTerminal` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "processId": { + "type": "integer", + "description": "The process ID. The value should be less than or equal to 2147483647 (2^31-1)." + }, + "shellProcessId": { + "type": "integer", + "description": "The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1)." + } + } + } + }, + "required": [ "body" ] + }] + }, + "StartDebuggingRequest": { + "allOf": [ + { + "$ref": "#/definitions/Request" + }, + { + "type": "object", + "description": "This request is sent from the debug adapter to the client to start a new debug session of the same type as the caller.\nThis request should only be sent if the corresponding client capability `supportsStartDebuggingRequest` is true.\nA client implementation of `startDebugging` should start a new debug session (of the same type as the caller) in the same way that the caller's session was started. If the client supports hierarchical debug sessions, the newly created session can be treated as a child of the caller session.", + "properties": { + "command": { + "type": "string", + "enum": [ + "startDebugging" + ] + }, + "arguments": { + "$ref": "#/definitions/StartDebuggingRequestArguments" + } + }, + "required": [ + "command", + "arguments" + ] + } + ] + }, + "StartDebuggingRequestArguments": { + "type": "object", + "description": "Arguments for `startDebugging` request.", + "properties": { + "configuration": { + "type": "object", + "additionalProperties": true, + "description": "Arguments passed to the new debug session. The arguments must only contain properties understood by the `launch` or `attach` requests of the debug adapter and they must not contain any client-specific properties (e.g. `type`) or client-specific features (e.g. substitutable 'variables')." + }, + "request": { + "type": "string", + "enum": [ + "launch", + "attach" + ], + "description": "Indicates whether the new debug session should be started with a `launch` or `attach` request." + } + }, + "required": [ + "configuration", + "request" + ] + }, + "StartDebuggingResponse": { + "allOf": [ + { + "$ref": "#/definitions/Response" + }, + { + "type": "object", + "description": "Response to `startDebugging` request. This is just an acknowledgement, so no body field is required." + } + ] + }, + + "InitializeRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "title": "Requests", + "description": "The `initialize` request is sent as the first request from the client to the debug adapter in order to configure it with client capabilities and to retrieve capabilities from the debug adapter.\nUntil the debug adapter has responded with an `initialize` response, the client must not send any additional requests or events to the debug adapter.\nIn addition the debug adapter is not allowed to send any requests or events to the client until it has responded with an `initialize` response.\nThe `initialize` request may only be sent once.", + "properties": { + "command": { + "type": "string", + "enum": [ "initialize" ] + }, + "arguments": { + "$ref": "#/definitions/InitializeRequestArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "InitializeRequestArguments": { + "type": "object", + "description": "Arguments for `initialize` request.", + "properties": { + "clientID": { + "type": "string", + "description": "The ID of the client using this adapter." + }, + "clientName": { + "type": "string", + "description": "The human-readable name of the client using this adapter." + }, + "adapterID": { + "type": "string", + "description": "The ID of the debug adapter." + }, + "locale": { + "type": "string", + "description": "The ISO-639 locale of the client using this adapter, e.g. en-US or de-CH." + }, + "linesStartAt1": { + "type": "boolean", + "description": "If true all line numbers are 1-based (default)." + }, + "columnsStartAt1": { + "type": "boolean", + "description": "If true all column numbers are 1-based (default)." + }, + "pathFormat": { + "type": "string", + "_enum": [ "path", "uri" ], + "description": "Determines in what format paths are specified. The default is `path`, which is the native format." + }, + "supportsVariableType": { + "type": "boolean", + "description": "Client supports the `type` attribute for variables." + }, + "supportsVariablePaging": { + "type": "boolean", + "description": "Client supports the paging of variables." + }, + "supportsRunInTerminalRequest": { + "type": "boolean", + "description": "Client supports the `runInTerminal` request." + }, + "supportsMemoryReferences": { + "type": "boolean", + "description": "Client supports memory references." + }, + "supportsProgressReporting": { + "type": "boolean", + "description": "Client supports progress reporting." + }, + "supportsInvalidatedEvent": { + "type": "boolean", + "description": "Client supports the `invalidated` event." + }, + "supportsMemoryEvent": { + "type": "boolean", + "description": "Client supports the `memory` event." + }, + "supportsArgsCanBeInterpretedByShell": { + "type": "boolean", + "description": "Client supports the `argsCanBeInterpretedByShell` attribute on the `runInTerminal` request." + }, + "supportsStartDebuggingRequest": { + "type": "boolean", + "description": "Client supports the `startDebugging` request." + } + }, + "required": [ "adapterID" ] + }, + "InitializeResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `initialize` request.", + "properties": { + "body": { + "$ref": "#/definitions/Capabilities", + "description": "The capabilities of this debug adapter." + } + } + }] + }, + + "ConfigurationDoneRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "This request indicates that the client has finished initialization of the debug adapter.\nSo it is the last request in the sequence of configuration requests (which was started by the `initialized` event).\nClients should only call this request if the corresponding capability `supportsConfigurationDoneRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "configurationDone" ] + }, + "arguments": { + "$ref": "#/definitions/ConfigurationDoneArguments" + } + }, + "required": [ "command" ] + }] + }, + "ConfigurationDoneArguments": { + "type": "object", + "description": "Arguments for `configurationDone` request." + }, + "ConfigurationDoneResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `configurationDone` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "LaunchRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "This launch request is sent from the client to the debug adapter to start the debuggee with or without debugging (if `noDebug` is true).\nSince launching is debugger/runtime specific, the arguments for this request are not part of this specification.", + "properties": { + "command": { + "type": "string", + "enum": [ "launch" ] + }, + "arguments": { + "$ref": "#/definitions/LaunchRequestArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "LaunchRequestArguments": { + "type": "object", + "description": "Arguments for `launch` request. Additional attributes are implementation specific.", + "properties": { + "noDebug": { + "type": "boolean", + "description": "If true, the launch request should launch the program without enabling debugging." + }, + "__restart": { + "type": [ "array", "boolean", "integer", "null", "number", "object", "string" ], + "description": "Arbitrary data from the previous, restarted session.\nThe data is sent as the `restart` attribute of the `terminated` event.\nThe client should leave the data intact." + } + } + }, + "LaunchResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `launch` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "AttachRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The `attach` request is sent from the client to the debug adapter to attach to a debuggee that is already running.\nSince attaching is debugger/runtime specific, the arguments for this request are not part of this specification.", + "properties": { + "command": { + "type": "string", + "enum": [ "attach" ] + }, + "arguments": { + "$ref": "#/definitions/AttachRequestArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "AttachRequestArguments": { + "type": "object", + "description": "Arguments for `attach` request. Additional attributes are implementation specific.", + "properties": { + "__restart": { + "type": [ "array", "boolean", "integer", "null", "number", "object", "string" ], + "description": "Arbitrary data from the previous, restarted session.\nThe data is sent as the `restart` attribute of the `terminated` event.\nThe client should leave the data intact." + } + } + }, + "AttachResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `attach` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "RestartRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Restarts a debug session. Clients should only call this request if the corresponding capability `supportsRestartRequest` is true.\nIf the capability is missing or has the value false, a typical client emulates `restart` by terminating the debug adapter first and then launching it anew.", + "properties": { + "command": { + "type": "string", + "enum": [ "restart" ] + }, + "arguments": { + "$ref": "#/definitions/RestartArguments" + } + }, + "required": [ "command" ] + }] + }, + "RestartArguments": { + "type": "object", + "description": "Arguments for `restart` request.", + "properties": { + "arguments": { + "oneOf": [ + { "$ref": "#/definitions/LaunchRequestArguments" }, + { "$ref": "#/definitions/AttachRequestArguments" } + ], + "description": "The latest version of the `launch` or `attach` configuration." + } + } + }, + "RestartResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `restart` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "DisconnectRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The `disconnect` request asks the debug adapter to disconnect from the debuggee (thus ending the debug session) and then to shut down itself (the debug adapter).\nIn addition, the debug adapter must terminate the debuggee if it was started with the `launch` request. If an `attach` request was used to connect to the debuggee, then the debug adapter must not terminate the debuggee.\nThis implicit behavior of when to terminate the debuggee can be overridden with the `terminateDebuggee` argument (which is only supported by a debug adapter if the corresponding capability `supportTerminateDebuggee` is true).", + "properties": { + "command": { + "type": "string", + "enum": [ "disconnect" ] + }, + "arguments": { + "$ref": "#/definitions/DisconnectArguments" + } + }, + "required": [ "command" ] + }] + }, + "DisconnectArguments": { + "type": "object", + "description": "Arguments for `disconnect` request.", + "properties": { + "restart": { + "type": "boolean", + "description": "A value of true indicates that this `disconnect` request is part of a restart sequence." + }, + "terminateDebuggee": { + "type": "boolean", + "description": "Indicates whether the debuggee should be terminated when the debugger is disconnected.\nIf unspecified, the debug adapter is free to do whatever it thinks is best.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportTerminateDebuggee` is true." + }, + "suspendDebuggee": { + "type": "boolean", + "description": "Indicates whether the debuggee should stay suspended when the debugger is disconnected.\nIf unspecified, the debuggee should resume execution.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportSuspendDebuggee` is true." + } + } + }, + "DisconnectResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `disconnect` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "TerminateRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The `terminate` request is sent from the client to the debug adapter in order to shut down the debuggee gracefully. Clients should only call this request if the capability `supportsTerminateRequest` is true.\nTypically a debug adapter implements `terminate` by sending a software signal which the debuggee intercepts in order to clean things up properly before terminating itself.\nPlease note that this request does not directly affect the state of the debug session: if the debuggee decides to veto the graceful shutdown for any reason by not terminating itself, then the debug session just continues.\nClients can surface the `terminate` request as an explicit command or they can integrate it into a two stage Stop command that first sends `terminate` to request a graceful shutdown, and if that fails uses `disconnect` for a forceful shutdown.", + "properties": { + "command": { + "type": "string", + "enum": [ "terminate" ] + }, + "arguments": { + "$ref": "#/definitions/TerminateArguments" + } + }, + "required": [ "command" ] + }] + }, + "TerminateArguments": { + "type": "object", + "description": "Arguments for `terminate` request.", + "properties": { + "restart": { + "type": "boolean", + "description": "A value of true indicates that this `terminate` request is part of a restart sequence." + } + } + }, + "TerminateResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `terminate` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "BreakpointLocationsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The `breakpointLocations` request returns all possible locations for source breakpoints in a given range.\nClients should only call this request if the corresponding capability `supportsBreakpointLocationsRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "breakpointLocations" ] + }, + "arguments": { + "$ref": "#/definitions/BreakpointLocationsArguments" + } + }, + "required": [ "command" ] + }] + + }, + "BreakpointLocationsArguments": { + "type": "object", + "description": "Arguments for `breakpointLocations` request.", + "properties": { + "source": { + "$ref": "#/definitions/Source", + "description": "The source location of the breakpoints; either `source.path` or `source.sourceReference` must be specified." + }, + "line": { + "type": "integer", + "description": "Start line of range to search possible breakpoint locations in. If only the line is specified, the request returns all possible locations in that line." + }, + "column": { + "type": "integer", + "description": "Start position within `line` to search possible breakpoint locations in. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no column is given, the first position in the start line is assumed." + }, + "endLine": { + "type": "integer", + "description": "End line of range to search possible breakpoint locations in. If no end line is given, then the end line is assumed to be the start line." + }, + "endColumn": { + "type": "integer", + "description": "End position within `endLine` to search possible breakpoint locations in. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no end column is given, the last position in the end line is assumed." + } + }, + "required": [ "source", "line" ] + }, + "BreakpointLocationsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `breakpointLocations` request.\nContains possible locations for source breakpoints.", + "properties": { + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/BreakpointLocation" + }, + "description": "Sorted set of possible breakpoint locations." + } + }, + "required": [ "breakpoints" ] + } + }, + "required": [ "body" ] + }] + }, + + "SetBreakpointsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Sets multiple breakpoints for a single source and clears all previous breakpoints in that source.\nTo clear all breakpoint for a source, specify an empty array.\nWhen a breakpoint is hit, a `stopped` event (with reason `breakpoint`) is generated.", + "properties": { + "command": { + "type": "string", + "enum": [ "setBreakpoints" ] + }, + "arguments": { + "$ref": "#/definitions/SetBreakpointsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetBreakpointsArguments": { + "type": "object", + "description": "Arguments for `setBreakpoints` request.", + "properties": { + "source": { + "$ref": "#/definitions/Source", + "description": "The source location of the breakpoints; either `source.path` or `source.sourceReference` must be specified." + }, + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/SourceBreakpoint" + }, + "description": "The code locations of the breakpoints." + }, + "lines": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Deprecated: The code locations of the breakpoints." + }, + "sourceModified": { + "type": "boolean", + "description": "A value of true indicates that the underlying source has been modified which results in new breakpoint locations." + } + }, + "required": [ "source" ] + }, + "SetBreakpointsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `setBreakpoints` request.\nReturned is information about each breakpoint created by this request.\nThis includes the actual code location and whether the breakpoint could be verified.\nThe breakpoints returned are in the same order as the elements of the `breakpoints`\n(or the deprecated `lines`) array in the arguments.", + "properties": { + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/Breakpoint" + }, + "description": "Information about the breakpoints.\nThe array elements are in the same order as the elements of the `breakpoints` (or the deprecated `lines`) array in the arguments." + } + }, + "required": [ "breakpoints" ] + } + }, + "required": [ "body" ] + }] + }, + + "SetFunctionBreakpointsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Replaces all existing function breakpoints with new function breakpoints.\nTo clear all function breakpoints, specify an empty array.\nWhen a function breakpoint is hit, a `stopped` event (with reason `function breakpoint`) is generated.\nClients should only call this request if the corresponding capability `supportsFunctionBreakpoints` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "setFunctionBreakpoints" ] + }, + "arguments": { + "$ref": "#/definitions/SetFunctionBreakpointsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetFunctionBreakpointsArguments": { + "type": "object", + "description": "Arguments for `setFunctionBreakpoints` request.", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/FunctionBreakpoint" + }, + "description": "The function names of the breakpoints." + } + }, + "required": [ "breakpoints" ] + }, + "SetFunctionBreakpointsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `setFunctionBreakpoints` request.\nReturned is information about each breakpoint created by this request.", + "properties": { + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/Breakpoint" + }, + "description": "Information about the breakpoints. The array elements correspond to the elements of the `breakpoints` array." + } + }, + "required": [ "breakpoints" ] + } + }, + "required": [ "body" ] + }] + }, + + "SetExceptionBreakpointsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request configures the debugger's response to thrown exceptions.\nIf an exception is configured to break, a `stopped` event is fired (with reason `exception`).\nClients should only call this request if the corresponding capability `exceptionBreakpointFilters` returns one or more filters.", + "properties": { + "command": { + "type": "string", + "enum": [ "setExceptionBreakpoints" ] + }, + "arguments": { + "$ref": "#/definitions/SetExceptionBreakpointsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetExceptionBreakpointsArguments": { + "type": "object", + "description": "Arguments for `setExceptionBreakpoints` request.", + "properties": { + "filters": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Set of exception filters specified by their ID. The set of all possible exception filters is defined by the `exceptionBreakpointFilters` capability. The `filter` and `filterOptions` sets are additive." + }, + "filterOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/ExceptionFilterOptions" + }, + "description": "Set of exception filters and their options. The set of all possible exception filters is defined by the `exceptionBreakpointFilters` capability. This attribute is only honored by a debug adapter if the corresponding capability `supportsExceptionFilterOptions` is true. The `filter` and `filterOptions` sets are additive." + }, + "exceptionOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/ExceptionOptions" + }, + "description": "Configuration options for selected exceptions.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsExceptionOptions` is true." + } + }, + "required": [ "filters" ] + }, + "SetExceptionBreakpointsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `setExceptionBreakpoints` request.\nThe response contains an array of `Breakpoint` objects with information about each exception breakpoint or filter. The `Breakpoint` objects are in the same order as the elements of the `filters`, `filterOptions`, `exceptionOptions` arrays given as arguments. If both `filters` and `filterOptions` are given, the returned array must start with `filters` information first, followed by `filterOptions` information.\nThe `verified` property of a `Breakpoint` object signals whether the exception breakpoint or filter could be successfully created and whether the condition is valid. In case of an error the `message` property explains the problem. The `id` property can be used to introduce a unique ID for the exception breakpoint or filter so that it can be updated subsequently by sending breakpoint events.\nFor backward compatibility both the `breakpoints` array and the enclosing `body` are optional. If these elements are missing a client is not able to show problems for individual exception breakpoints or filters.", + "properties": { + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/Breakpoint" + }, + "description": "Information about the exception breakpoints or filters.\nThe breakpoints returned are in the same order as the elements of the `filters`, `filterOptions`, `exceptionOptions` arrays in the arguments. If both `filters` and `filterOptions` are given, the returned array must start with `filters` information first, followed by `filterOptions` information." + } + } + } + } + }] + }, + + "DataBreakpointInfoRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Obtains information on a possible data breakpoint that could be set on an expression or variable.\nClients should only call this request if the corresponding capability `supportsDataBreakpoints` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "dataBreakpointInfo" ] + }, + "arguments": { + "$ref": "#/definitions/DataBreakpointInfoArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "DataBreakpointInfoArguments": { + "type": "object", + "description": "Arguments for `dataBreakpointInfo` request.", + "properties": { + "variablesReference": { + "type": "integer", + "description": "Reference to the variable container if the data breakpoint is requested for a child of the container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." + }, + "name": { + "type": "string", + "description": "The name of the variable's child to obtain data breakpoint information for.\nIf `variablesReference` isn't specified, this can be an expression." + }, + "frameId": { + "type": "integer", + "description": "When `name` is an expression, evaluate it in the scope of this stack frame. If not specified, the expression is evaluated in the global scope. When `variablesReference` is specified, this property has no effect." + } + }, + "required": [ "name" ] + }, + "DataBreakpointInfoResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `dataBreakpointInfo` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "dataId": { + "type": [ "string", "null" ], + "description": "An identifier for the data on which a data breakpoint can be registered with the `setDataBreakpoints` request or null if no data breakpoint is available. If a `variablesReference` or `frameId` is passed, the `dataId` is valid in the current suspended state, otherwise it's valid indefinitely. See 'Lifetime of Object References' in the Overview section for details. Breakpoints set using the `dataId` in the `setDataBreakpoints` request may outlive the lifetime of the associated `dataId`." + }, + "description": { + "type": "string", + "description": "UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available." + }, + "accessTypes": { + "type": "array", + "items": { + "$ref": "#/definitions/DataBreakpointAccessType" + }, + "description": "Attribute lists the available access types for a potential data breakpoint. A UI client could surface this information." + }, + "canPersist": { + "type": "boolean", + "description": "Attribute indicates that a potential data breakpoint could be persisted across sessions." + } + }, + "required": [ "dataId", "description" ] + } + }, + "required": [ "body" ] + }] + }, + + "SetDataBreakpointsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Replaces all existing data breakpoints with new data breakpoints.\nTo clear all data breakpoints, specify an empty array.\nWhen a data breakpoint is hit, a `stopped` event (with reason `data breakpoint`) is generated.\nClients should only call this request if the corresponding capability `supportsDataBreakpoints` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "setDataBreakpoints" ] + }, + "arguments": { + "$ref": "#/definitions/SetDataBreakpointsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetDataBreakpointsArguments": { + "type": "object", + "description": "Arguments for `setDataBreakpoints` request.", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/DataBreakpoint" + }, + "description": "The contents of this array replaces all existing data breakpoints. An empty array clears all data breakpoints." + } + }, + "required": [ "breakpoints" ] + }, + "SetDataBreakpointsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `setDataBreakpoints` request.\nReturned is information about each breakpoint created by this request.", + "properties": { + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/Breakpoint" + }, + "description": "Information about the data breakpoints. The array elements correspond to the elements of the input argument `breakpoints` array." + } + }, + "required": [ "breakpoints" ] + } + }, + "required": [ "body" ] + }] + }, + + "SetInstructionBreakpointsRequest": { + "allOf": [ + { "$ref": "#/definitions/Request" }, + { + "type": "object", + "description": "Replaces all existing instruction breakpoints. Typically, instruction breakpoints would be set from a disassembly window. \nTo clear all instruction breakpoints, specify an empty array.\nWhen an instruction breakpoint is hit, a `stopped` event (with reason `instruction breakpoint`) is generated.\nClients should only call this request if the corresponding capability `supportsInstructionBreakpoints` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "setInstructionBreakpoints" ] + }, + "arguments": { + "$ref": "#/definitions/SetInstructionBreakpointsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetInstructionBreakpointsArguments": { + "type": "object", + "description": "Arguments for `setInstructionBreakpoints` request", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/InstructionBreakpoint" + }, + "description": "The instruction references of the breakpoints" + } + }, + "required": ["breakpoints"] + }, + "SetInstructionBreakpointsResponse": { + "allOf": [ + { "$ref": "#/definitions/Response" }, + { + "type": "object", + "description": "Response to `setInstructionBreakpoints` request", + "properties": { + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/Breakpoint" + }, + "description": "Information about the breakpoints. The array elements correspond to the elements of the `breakpoints` array." + } + }, + "required": [ "breakpoints" ] + } + }, + "required": [ "body" ] + }] + }, + + "ContinueRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request resumes execution of all threads. If the debug adapter supports single thread execution (see capability `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true resumes only the specified thread. If not all threads were resumed, the `allThreadsContinued` attribute of the response should be set to false.", + "properties": { + "command": { + "type": "string", + "enum": [ "continue" ] + }, + "arguments": { + "$ref": "#/definitions/ContinueArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "ContinueArguments": { + "type": "object", + "description": "Arguments for `continue` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Specifies the active thread. If the debug adapter supports single thread execution (see `supportsSingleThreadExecutionRequests`) and the argument `singleThread` is true, only the thread with this ID is resumed." + }, + "singleThread": { + "type": "boolean", + "description": "If this flag is true, execution is resumed only for the thread with given `threadId`." + } + }, + "required": [ "threadId" ] + }, + "ContinueResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `continue` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "allThreadsContinued": { + "type": "boolean", + "description": "The value true (or a missing property) signals to the client that all threads have been resumed. The value false indicates that not all threads were resumed." + } + } + } + }, + "required": [ "body" ] + }] + }, + + "NextRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request executes one step (in the given granularity) for the specified thread and allows all other threads to run freely by resuming them.\nIf the debug adapter supports single thread execution (see capability `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true prevents other suspended threads from resuming.\nThe debug adapter first sends the response and then a `stopped` event (with reason `step`) after the step has completed.", + "properties": { + "command": { + "type": "string", + "enum": [ "next" ] + }, + "arguments": { + "$ref": "#/definitions/NextArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "NextArguments": { + "type": "object", + "description": "Arguments for `next` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Specifies the thread for which to resume execution for one step (of the given granularity)." + }, + "singleThread": { + "type": "boolean", + "description": "If this flag is true, all other suspended threads are not resumed." + }, + "granularity": { + "$ref": "#/definitions/SteppingGranularity", + "description": "Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed." + } + }, + "required": [ "threadId" ] + }, + "NextResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `next` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "StepInRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request resumes the given thread to step into a function/method and allows all other threads to run freely by resuming them.\nIf the debug adapter supports single thread execution (see capability `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true prevents other suspended threads from resuming.\nIf the request cannot step into a target, `stepIn` behaves like the `next` request.\nThe debug adapter first sends the response and then a `stopped` event (with reason `step`) after the step has completed.\nIf there are multiple function/method calls (or other targets) on the source line,\nthe argument `targetId` can be used to control into which target the `stepIn` should occur.\nThe list of possible targets for a given source line can be retrieved via the `stepInTargets` request.", + "properties": { + "command": { + "type": "string", + "enum": [ "stepIn" ] + }, + "arguments": { + "$ref": "#/definitions/StepInArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "StepInArguments": { + "type": "object", + "description": "Arguments for `stepIn` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Specifies the thread for which to resume execution for one step-into (of the given granularity)." + }, + "singleThread": { + "type": "boolean", + "description": "If this flag is true, all other suspended threads are not resumed." + }, + "targetId": { + "type": "integer", + "description": "Id of the target to step into." + }, + "granularity": { + "$ref": "#/definitions/SteppingGranularity", + "description": "Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed." + } + }, + "required": [ "threadId" ] + }, + "StepInResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `stepIn` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "StepOutRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request resumes the given thread to step out (return) from a function/method and allows all other threads to run freely by resuming them.\nIf the debug adapter supports single thread execution (see capability `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true prevents other suspended threads from resuming.\nThe debug adapter first sends the response and then a `stopped` event (with reason `step`) after the step has completed.", + "properties": { + "command": { + "type": "string", + "enum": [ "stepOut" ] + }, + "arguments": { + "$ref": "#/definitions/StepOutArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "StepOutArguments": { + "type": "object", + "description": "Arguments for `stepOut` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Specifies the thread for which to resume execution for one step-out (of the given granularity)." + }, + "singleThread": { + "type": "boolean", + "description": "If this flag is true, all other suspended threads are not resumed." + }, + "granularity": { + "$ref": "#/definitions/SteppingGranularity", + "description": "Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed." + } + }, + "required": [ "threadId" ] + }, + "StepOutResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `stepOut` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "StepBackRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request executes one backward step (in the given granularity) for the specified thread and allows all other threads to run backward freely by resuming them.\nIf the debug adapter supports single thread execution (see capability `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true prevents other suspended threads from resuming.\nThe debug adapter first sends the response and then a `stopped` event (with reason `step`) after the step has completed.\nClients should only call this request if the corresponding capability `supportsStepBack` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "stepBack" ] + }, + "arguments": { + "$ref": "#/definitions/StepBackArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "StepBackArguments": { + "type": "object", + "description": "Arguments for `stepBack` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Specifies the thread for which to resume execution for one step backwards (of the given granularity)." + }, + "singleThread": { + "type": "boolean", + "description": "If this flag is true, all other suspended threads are not resumed." + }, + "granularity": { + "$ref": "#/definitions/SteppingGranularity", + "description": "Stepping granularity to step. If no granularity is specified, a granularity of `statement` is assumed." + } + }, + "required": [ "threadId" ] + }, + "StepBackResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `stepBack` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "ReverseContinueRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request resumes backward execution of all threads. If the debug adapter supports single thread execution (see capability `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true resumes only the specified thread. If not all threads were resumed, the `allThreadsContinued` attribute of the response should be set to false.\nClients should only call this request if the corresponding capability `supportsStepBack` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "reverseContinue" ] + }, + "arguments": { + "$ref": "#/definitions/ReverseContinueArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "ReverseContinueArguments": { + "type": "object", + "description": "Arguments for `reverseContinue` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Specifies the active thread. If the debug adapter supports single thread execution (see `supportsSingleThreadExecutionRequests`) and the `singleThread` argument is true, only the thread with this ID is resumed." + }, + "singleThread": { + "type": "boolean", + "description": "If this flag is true, backward execution is resumed only for the thread with given `threadId`." + } + + }, + "required": [ "threadId" ] + }, + "ReverseContinueResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `reverseContinue` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "RestartFrameRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request restarts execution of the specified stack frame.\nThe debug adapter first sends the response and then a `stopped` event (with reason `restart`) after the restart has completed.\nClients should only call this request if the corresponding capability `supportsRestartFrame` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "restartFrame" ] + }, + "arguments": { + "$ref": "#/definitions/RestartFrameArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "RestartFrameArguments": { + "type": "object", + "description": "Arguments for `restartFrame` request.", + "properties": { + "frameId": { + "type": "integer", + "description": "Restart the stack frame identified by `frameId`. The `frameId` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." + } + }, + "required": [ "frameId" ] + }, + "RestartFrameResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `restartFrame` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "GotoRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request sets the location where the debuggee will continue to run.\nThis makes it possible to skip the execution of code or to execute code again.\nThe code between the current location and the goto target is not executed but skipped.\nThe debug adapter first sends the response and then a `stopped` event with reason `goto`.\nClients should only call this request if the corresponding capability `supportsGotoTargetsRequest` is true (because only then goto targets exist that can be passed as arguments).", + "properties": { + "command": { + "type": "string", + "enum": [ "goto" ] + }, + "arguments": { + "$ref": "#/definitions/GotoArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "GotoArguments": { + "type": "object", + "description": "Arguments for `goto` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Set the goto target for this thread." + }, + "targetId": { + "type": "integer", + "description": "The location where the debuggee will continue to run." + } + }, + "required": [ "threadId", "targetId" ] + }, + "GotoResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `goto` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "PauseRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request suspends the debuggee.\nThe debug adapter first sends the response and then a `stopped` event (with reason `pause`) after the thread has been paused successfully.", + "properties": { + "command": { + "type": "string", + "enum": [ "pause" ] + }, + "arguments": { + "$ref": "#/definitions/PauseArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "PauseArguments": { + "type": "object", + "description": "Arguments for `pause` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Pause execution for this thread." + } + }, + "required": [ "threadId" ] + }, + "PauseResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `pause` request. This is just an acknowledgement, so no body field is required." + }] + }, + + "StackTraceRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request returns a stacktrace from the current execution state of a given thread.\nA client can request all stack frames by omitting the startFrame and levels arguments. For performance-conscious clients and if the corresponding capability `supportsDelayedStackTraceLoading` is true, stack frames can be retrieved in a piecemeal way with the `startFrame` and `levels` arguments. The response of the `stackTrace` request may contain a `totalFrames` property that hints at the total number of frames in the stack. If a client needs this total number upfront, it can issue a request for a single (first) frame and depending on the value of `totalFrames` decide how to proceed. In any case a client should be prepared to receive fewer frames than requested, which is an indication that the end of the stack has been reached.", + "properties": { + "command": { + "type": "string", + "enum": [ "stackTrace" ] + }, + "arguments": { + "$ref": "#/definitions/StackTraceArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "StackTraceArguments": { + "type": "object", + "description": "Arguments for `stackTrace` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Retrieve the stacktrace for this thread." + }, + "startFrame": { + "type": "integer", + "description": "The index of the first frame to return; if omitted frames start at 0." + }, + "levels": { + "type": "integer", + "description": "The maximum number of frames to return. If levels is not specified or 0, all frames are returned." + }, + "format": { + "$ref": "#/definitions/StackFrameFormat", + "description": "Specifies details on how to format the stack frames.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is true." + } + }, + "required": [ "threadId" ] + }, + "StackTraceResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `stackTrace` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "stackFrames": { + "type": "array", + "items": { + "$ref": "#/definitions/StackFrame" + }, + "description": "The frames of the stack frame. If the array has length zero, there are no stack frames available.\nThis means that there is no location information available." + }, + "totalFrames": { + "type": "integer", + "description": "The total number of frames available in the stack. If omitted or if `totalFrames` is larger than the available frames, a client is expected to request frames until a request returns less frames than requested (which indicates the end of the stack). Returning monotonically increasing `totalFrames` values for subsequent requests can be used to enforce paging in the client." + } + }, + "required": [ "stackFrames" ] + } + }, + "required": [ "body" ] + }] + }, + + "ScopesRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request returns the variable scopes for a given stack frame ID.", + "properties": { + "command": { + "type": "string", + "enum": [ "scopes" ] + }, + "arguments": { + "$ref": "#/definitions/ScopesArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "ScopesArguments": { + "type": "object", + "description": "Arguments for `scopes` request.", + "properties": { + "frameId": { + "type": "integer", + "description": "Retrieve the scopes for the stack frame identified by `frameId`. The `frameId` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." + } + }, + "required": [ "frameId" ] + }, + "ScopesResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `scopes` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "scopes": { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + }, + "description": "The scopes of the stack frame. If the array has length zero, there are no scopes available." + } + }, + "required": [ "scopes" ] + } + }, + "required": [ "body" ] + }] + }, + + "VariablesRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Retrieves all child variables for the given variable reference.\nA filter can be used to limit the fetched children to either named or indexed children.", + "properties": { + "command": { + "type": "string", + "enum": [ "variables" ] + }, + "arguments": { + "$ref": "#/definitions/VariablesArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "VariablesArguments": { + "type": "object", + "description": "Arguments for `variables` request.", + "properties": { + "variablesReference": { + "type": "integer", + "description": "The variable for which to retrieve its children. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." + }, + "filter": { + "type": "string", + "enum": [ "indexed", "named" ], + "description": "Filter to limit the child variables to either named or indexed. If omitted, both types are fetched." + }, + "start": { + "type": "integer", + "description": "The index of the first variable to return; if omitted children start at 0.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsVariablePaging` is true." + }, + "count": { + "type": "integer", + "description": "The number of variables to return. If count is missing or 0, all variables are returned.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsVariablePaging` is true." + }, + "format": { + "$ref": "#/definitions/ValueFormat", + "description": "Specifies details on how to format the Variable values.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is true." + } + }, + "required": [ "variablesReference" ] + }, + "VariablesResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `variables` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "variables": { + "type": "array", + "items": { + "$ref": "#/definitions/Variable" + }, + "description": "All (or a range) of variables for the given variable reference." + } + }, + "required": [ "variables" ] + } + }, + "required": [ "body" ] + }] + }, + + "SetVariableRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Set the variable with the given name in the variable container to a new value. Clients should only call this request if the corresponding capability `supportsSetVariable` is true.\nIf a debug adapter implements both `setVariable` and `setExpression`, a client will only use `setExpression` if the variable has an `evaluateName` property.", + "properties": { + "command": { + "type": "string", + "enum": [ "setVariable" ] + }, + "arguments": { + "$ref": "#/definitions/SetVariableArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetVariableArguments": { + "type": "object", + "description": "Arguments for `setVariable` request.", + "properties": { + "variablesReference": { + "type": "integer", + "description": "The reference of the variable container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." + }, + "name": { + "type": "string", + "description": "The name of the variable in the container." + }, + "value": { + "type": "string", + "description": "The value of the variable." + }, + "format": { + "$ref": "#/definitions/ValueFormat", + "description": "Specifies details on how to format the response value." + } + }, + "required": [ "variablesReference", "name", "value" ] + }, + "SetVariableResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `setVariable` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "The new value of the variable." + }, + "type": { + "type": "string", + "description": "The type of the new value. Typically shown in the UI when hovering over the value." + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the new value is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is true." + } + }, + "required": [ "value" ] + } + }, + "required": [ "body" ] + }] + }, + + "SourceRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request retrieves the source code for a given source reference.", + "properties": { + "command": { + "type": "string", + "enum": [ "source" ] + }, + "arguments": { + "$ref": "#/definitions/SourceArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SourceArguments": { + "type": "object", + "description": "Arguments for `source` request.", + "properties": { + "source": { + "$ref": "#/definitions/Source", + "description": "Specifies the source content to load. Either `source.path` or `source.sourceReference` must be specified." + }, + "sourceReference": { + "type": "integer", + "description": "The reference to the source. This is the same as `source.sourceReference`.\nThis is provided for backward compatibility since old clients do not understand the `source` attribute." + } + }, + "required": [ "sourceReference" ] + }, + "SourceResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `source` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "Content of the source reference." + }, + "mimeType": { + "type": "string", + "description": "Content type (MIME type) of the source." + } + }, + "required": [ "content" ] + } + }, + "required": [ "body" ] + }] + }, + + "ThreadsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request retrieves a list of all threads.", + "properties": { + "command": { + "type": "string", + "enum": [ "threads" ] + } + }, + "required": [ "command" ] + }] + }, + "ThreadsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `threads` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "threads": { + "type": "array", + "items": { + "$ref": "#/definitions/Thread" + }, + "description": "All threads." + } + }, + "required": [ "threads" ] + } + }, + "required": [ "body" ] + }] + }, + + "TerminateThreadsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request terminates the threads with the given ids.\nClients should only call this request if the corresponding capability `supportsTerminateThreadsRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "terminateThreads" ] + }, + "arguments": { + "$ref": "#/definitions/TerminateThreadsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "TerminateThreadsArguments": { + "type": "object", + "description": "Arguments for `terminateThreads` request.", + "properties": { + "threadIds": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Ids of threads to be terminated." + } + } + }, + "TerminateThreadsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `terminateThreads` request. This is just an acknowledgement, no body field is required." + }] + }, + + "ModulesRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Modules can be retrieved from the debug adapter with this request which can either return all modules or a range of modules to support paging.\nClients should only call this request if the corresponding capability `supportsModulesRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "modules" ] + }, + "arguments": { + "$ref": "#/definitions/ModulesArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "ModulesArguments": { + "type": "object", + "description": "Arguments for `modules` request.", + "properties": { + "startModule": { + "type": "integer", + "description": "The index of the first module to return; if omitted modules start at 0." + }, + "moduleCount": { + "type": "integer", + "description": "The number of modules to return. If `moduleCount` is not specified or 0, all modules are returned." + } + } + }, + "ModulesResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `modules` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "modules": { + "type": "array", + "items": { + "$ref": "#/definitions/Module" + }, + "description": "All modules or range of modules." + }, + "totalModules": { + "type": "integer", + "description": "The total number of modules available." + } + }, + "required": [ "modules" ] + } + }, + "required": [ "body" ] + }] + }, + + "LoadedSourcesRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Retrieves the set of all sources currently loaded by the debugged process.\nClients should only call this request if the corresponding capability `supportsLoadedSourcesRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "loadedSources" ] + }, + "arguments": { + "$ref": "#/definitions/LoadedSourcesArguments" + } + }, + "required": [ "command" ] + }] + }, + "LoadedSourcesArguments": { + "type": "object", + "description": "Arguments for `loadedSources` request." + }, + "LoadedSourcesResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `loadedSources` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "#/definitions/Source" + }, + "description": "Set of loaded sources." + } + }, + "required": [ "sources" ] + } + }, + "required": [ "body" ] + }] + }, + + "EvaluateRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Evaluates the given expression in the context of the topmost stack frame.\nThe expression has access to any variables and arguments that are in scope.", + "properties": { + "command": { + "type": "string", + "enum": [ "evaluate" ] + }, + "arguments": { + "$ref": "#/definitions/EvaluateArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "EvaluateArguments": { + "type": "object", + "description": "Arguments for `evaluate` request.", + "properties": { + "expression": { + "type": "string", + "description": "The expression to evaluate." + }, + "frameId": { + "type": "integer", + "description": "Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the global scope." + }, + "context": { + "type": "string", + "_enum": [ "watch", "repl", "hover", "clipboard", "variables" ], + "enumDescriptions": [ + "evaluate is called from a watch view context.", + "evaluate is called from a REPL context.", + "evaluate is called to generate the debug hover contents.\nThis value should only be used if the corresponding capability `supportsEvaluateForHovers` is true.", + "evaluate is called to generate clipboard contents.\nThis value should only be used if the corresponding capability `supportsClipboardContext` is true.", + "evaluate is called from a variables view context." + ], + "description": "The context in which the evaluate request is used." + }, + "format": { + "$ref": "#/definitions/ValueFormat", + "description": "Specifies details on how to format the result.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is true." + } + }, + "required": [ "expression" ] + }, + "EvaluateResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `evaluate` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "The result of the evaluate request." + }, + "type": { + "type": "string", + "description": "The type of the evaluate result.\nThis attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is true." + }, + "presentationHint": { + "$ref": "#/definitions/VariablePresentationHint", + "description": "Properties of an evaluate result that can be used to determine how to render the result in the UI." + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is true." + } + }, + "required": [ "result", "variablesReference" ] + } + }, + "required": [ "body" ] + }] + }, + + "SetExpressionRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Evaluates the given `value` expression and assigns it to the `expression` which must be a modifiable l-value.\nThe expressions have access to any variables and arguments that are in scope of the specified frame.\nClients should only call this request if the corresponding capability `supportsSetExpression` is true.\nIf a debug adapter implements both `setExpression` and `setVariable`, a client uses `setExpression` if the variable has an `evaluateName` property.", + "properties": { + "command": { + "type": "string", + "enum": [ "setExpression" ] + }, + "arguments": { + "$ref": "#/definitions/SetExpressionArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetExpressionArguments": { + "type": "object", + "description": "Arguments for `setExpression` request.", + "properties": { + "expression": { + "type": "string", + "description": "The l-value expression to assign to." + }, + "value": { + "type": "string", + "description": "The value expression to assign to the l-value expression." + }, + "frameId": { + "type": "integer", + "description": "Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in the global scope." + }, + "format": { + "$ref": "#/definitions/ValueFormat", + "description": "Specifies how the resulting value should be formatted." + } + }, + "required": [ "expression", "value" ] + }, + "SetExpressionResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `setExpression` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "The new value of the expression." + }, + "type": { + "type": "string", + "description": "The type of the value.\nThis attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is true." + }, + "presentationHint": { + "$ref": "#/definitions/VariablePresentationHint", + "description": "Properties of a value that can be used to determine how to render the result in the UI." + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is true." + } + }, + "required": [ "value" ] + } + }, + "required": [ "body" ] + }] + }, + + "StepInTargetsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "This request retrieves the possible step-in targets for the specified stack frame.\nThese targets can be used in the `stepIn` request.\nClients should only call this request if the corresponding capability `supportsStepInTargetsRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "stepInTargets" ] + }, + "arguments": { + "$ref": "#/definitions/StepInTargetsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "StepInTargetsArguments": { + "type": "object", + "description": "Arguments for `stepInTargets` request.", + "properties": { + "frameId": { + "type": "integer", + "description": "The stack frame for which to retrieve the possible step-in targets." + } + }, + "required": [ "frameId" ] + }, + "StepInTargetsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `stepInTargets` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "targets": { + "type": "array", + "items": { + "$ref": "#/definitions/StepInTarget" + }, + "description": "The possible step-in targets of the specified source location." + } + }, + "required": [ "targets" ] + } + }, + "required": [ "body" ] + }] + }, + + "GotoTargetsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "This request retrieves the possible goto targets for the specified source location.\nThese targets can be used in the `goto` request.\nClients should only call this request if the corresponding capability `supportsGotoTargetsRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "gotoTargets" ] + }, + "arguments": { + "$ref": "#/definitions/GotoTargetsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "GotoTargetsArguments": { + "type": "object", + "description": "Arguments for `gotoTargets` request.", + "properties": { + "source": { + "$ref": "#/definitions/Source", + "description": "The source location for which the goto targets are determined." + }, + "line": { + "type": "integer", + "description": "The line location for which the goto targets are determined." + }, + "column": { + "type": "integer", + "description": "The position within `line` for which the goto targets are determined. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + } + }, + "required": [ "source", "line" ] + }, + "GotoTargetsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `gotoTargets` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "targets": { + "type": "array", + "items": { + "$ref": "#/definitions/GotoTarget" + }, + "description": "The possible goto targets of the specified location." + } + }, + "required": [ "targets" ] + } + }, + "required": [ "body" ] + }] + }, + + "CompletionsRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Returns a list of possible completions for a given caret position and text.\nClients should only call this request if the corresponding capability `supportsCompletionsRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "completions" ] + }, + "arguments": { + "$ref": "#/definitions/CompletionsArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "CompletionsArguments": { + "type": "object", + "description": "Arguments for `completions` request.", + "properties": { + "frameId": { + "type": "integer", + "description": "Returns completions in the scope of this stack frame. If not specified, the completions are returned for the global scope." + }, + "text": { + "type": "string", + "description": "One or more source lines. Typically this is the text users have typed into the debug console before they asked for completion." + }, + "column": { + "type": "integer", + "description": "The position within `text` for which to determine the completion proposals. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + }, + "line": { + "type": "integer", + "description": "A line for which to determine the completion proposals. If missing the first line of the text is assumed." + } + }, + "required": [ "text", "column" ] + }, + "CompletionsResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `completions` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "targets": { + "type": "array", + "items": { + "$ref": "#/definitions/CompletionItem" + }, + "description": "The possible completions for ." + } + }, + "required": [ "targets" ] + } + }, + "required": [ "body" ] + }] + }, + + "ExceptionInfoRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Retrieves the details of the exception that caused this event to be raised.\nClients should only call this request if the corresponding capability `supportsExceptionInfoRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "exceptionInfo" ] + }, + "arguments": { + "$ref": "#/definitions/ExceptionInfoArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "ExceptionInfoArguments": { + "type": "object", + "description": "Arguments for `exceptionInfo` request.", + "properties": { + "threadId": { + "type": "integer", + "description": "Thread for which exception information should be retrieved." + } + }, + "required": [ "threadId" ] + }, + "ExceptionInfoResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `exceptionInfo` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "exceptionId": { + "type": "string", + "description": "ID of the exception that was thrown." + }, + "description": { + "type": "string", + "description": "Descriptive text for the exception." + }, + "breakMode": { + "$ref": "#/definitions/ExceptionBreakMode", + "description": "Mode that caused the exception notification to be raised." + }, + "details": { + "$ref": "#/definitions/ExceptionDetails", + "description": "Detailed information about the exception." + } + }, + "required": [ "exceptionId", "breakMode" ] + } + }, + "required": [ "body" ] + }] + }, + + "ReadMemoryRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Reads bytes from memory at the provided location.\nClients should only call this request if the corresponding capability `supportsReadMemoryRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "readMemory" ] + }, + "arguments": { + "$ref": "#/definitions/ReadMemoryArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "ReadMemoryArguments": { + "type": "object", + "description": "Arguments for `readMemory` request.", + "properties": { + "memoryReference": { + "type": "string", + "description": "Memory reference to the base location from which data should be read." + }, + "offset": { + "type": "integer", + "description": "Offset (in bytes) to be applied to the reference location before reading data. Can be negative." + }, + "count": { + "type": "integer", + "description": "Number of bytes to read at the specified location and offset." + } + }, + "required": [ "memoryReference", "count" ] + }, + "ReadMemoryResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `readMemory` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "The address of the first byte of data returned.\nTreated as a hex value if prefixed with `0x`, or as a decimal value otherwise." + }, + "unreadableBytes": { + "type": "integer", + "description": "The number of unreadable bytes encountered after the last successfully read byte.\nThis can be used to determine the number of bytes that should be skipped before a subsequent `readMemory` request succeeds." + }, + "data": { + "type": "string", + "description": "The bytes read from memory, encoded using base64. If the decoded length of `data` is less than the requested `count` in the original `readMemory` request, and `unreadableBytes` is zero or omitted, then the client should assume it's reached the end of readable memory." + } + }, + "required": [ "address" ] + } + } + }] + }, + + "WriteMemoryRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Writes bytes to memory at the provided location.\nClients should only call this request if the corresponding capability `supportsWriteMemoryRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "writeMemory" ] + }, + "arguments": { + "$ref": "#/definitions/WriteMemoryArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "WriteMemoryArguments": { + "type": "object", + "description": "Arguments for `writeMemory` request.", + "properties": { + "memoryReference": { + "type": "string", + "description": "Memory reference to the base location to which data should be written." + }, + "offset": { + "type": "integer", + "description": "Offset (in bytes) to be applied to the reference location before writing data. Can be negative." + }, + "allowPartial": { + "type": "boolean", + "description": "Property to control partial writes. If true, the debug adapter should attempt to write memory even if the entire memory region is not writable. In such a case the debug adapter should stop after hitting the first byte of memory that cannot be written and return the number of bytes written in the response via the `offset` and `bytesWritten` properties.\nIf false or missing, a debug adapter should attempt to verify the region is writable before writing, and fail the response if it is not." + }, + "data": { + "type": "string", + "description": "Bytes to write, encoded using base64." + } + }, + "required": [ "memoryReference", "data" ] + }, + "WriteMemoryResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `writeMemory` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "offset": { + "type": "integer", + "description": "Property that should be returned when `allowPartial` is true to indicate the offset of the first byte of data successfully written. Can be negative." + }, + "bytesWritten": { + "type": "integer", + "description": "Property that should be returned when `allowPartial` is true to indicate the number of bytes starting from address that were successfully written." + } + } + } + } + }] + }, + + "DisassembleRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "Disassembles code stored at the provided location.\nClients should only call this request if the corresponding capability `supportsDisassembleRequest` is true.", + "properties": { + "command": { + "type": "string", + "enum": [ "disassemble" ] + }, + "arguments": { + "$ref": "#/definitions/DisassembleArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "DisassembleArguments": { + "type": "object", + "description": "Arguments for `disassemble` request.", + "properties": { + "memoryReference": { + "type": "string", + "description": "Memory reference to the base location containing the instructions to disassemble." + }, + "offset": { + "type": "integer", + "description": "Offset (in bytes) to be applied to the reference location before disassembling. Can be negative." + }, + "instructionOffset": { + "type": "integer", + "description": "Offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be negative." + }, + "instructionCount": { + "type": "integer", + "description": "Number of instructions to disassemble starting at the specified location and offset.\nAn adapter must return exactly this number of instructions - any unavailable instructions should be replaced with an implementation-defined 'invalid instruction' value." + }, + "resolveSymbols": { + "type": "boolean", + "description": "If true, the adapter should attempt to resolve memory addresses and other values to symbolic names." + } + }, + "required": [ "memoryReference", "instructionCount" ] + }, + "DisassembleResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to `disassemble` request.", + "properties": { + "body": { + "type": "object", + "properties": { + "instructions": { + "type": "array", + "items": { + "$ref": "#/definitions/DisassembledInstruction" + }, + "description": "The list of disassembled instructions." + } + }, + "required": [ "instructions" ] + } + } + }] + }, + + "Capabilities": { + "type": "object", + "title": "Types", + "description": "Information about the capabilities of a debug adapter.", + "properties": { + "supportsConfigurationDoneRequest": { + "type": "boolean", + "description": "The debug adapter supports the `configurationDone` request." + }, + "supportsFunctionBreakpoints": { + "type": "boolean", + "description": "The debug adapter supports function breakpoints." + }, + "supportsConditionalBreakpoints": { + "type": "boolean", + "description": "The debug adapter supports conditional breakpoints." + }, + "supportsHitConditionalBreakpoints": { + "type": "boolean", + "description": "The debug adapter supports breakpoints that break execution after a specified number of hits." + }, + "supportsEvaluateForHovers": { + "type": "boolean", + "description": "The debug adapter supports a (side effect free) `evaluate` request for data hovers." + }, + "exceptionBreakpointFilters": { + "type": "array", + "items": { + "$ref": "#/definitions/ExceptionBreakpointsFilter" + }, + "description": "Available exception filter options for the `setExceptionBreakpoints` request." + }, + "supportsStepBack": { + "type": "boolean", + "description": "The debug adapter supports stepping back via the `stepBack` and `reverseContinue` requests." + }, + "supportsSetVariable": { + "type": "boolean", + "description": "The debug adapter supports setting a variable to a value." + }, + "supportsRestartFrame": { + "type": "boolean", + "description": "The debug adapter supports restarting a frame." + }, + "supportsGotoTargetsRequest": { + "type": "boolean", + "description": "The debug adapter supports the `gotoTargets` request." + }, + "supportsStepInTargetsRequest": { + "type": "boolean", + "description": "The debug adapter supports the `stepInTargets` request." + }, + "supportsCompletionsRequest": { + "type": "boolean", + "description": "The debug adapter supports the `completions` request." + }, + "completionTriggerCharacters": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the `.` character." + }, + "supportsModulesRequest": { + "type": "boolean", + "description": "The debug adapter supports the `modules` request." + }, + "additionalModuleColumns": { + "type": "array", + "items": { + "$ref": "#/definitions/ColumnDescriptor" + }, + "description": "The set of additional module information exposed by the debug adapter." + }, + "supportedChecksumAlgorithms": { + "type": "array", + "items": { + "$ref": "#/definitions/ChecksumAlgorithm" + }, + "description": "Checksum algorithms supported by the debug adapter." + }, + "supportsRestartRequest": { + "type": "boolean", + "description": "The debug adapter supports the `restart` request. In this case a client should not implement `restart` by terminating and relaunching the adapter but by calling the `restart` request." + }, + "supportsExceptionOptions": { + "type": "boolean", + "description": "The debug adapter supports `exceptionOptions` on the `setExceptionBreakpoints` request." + }, + "supportsValueFormattingOptions": { + "type": "boolean", + "description": "The debug adapter supports a `format` attribute on the `stackTrace`, `variables`, and `evaluate` requests." + }, + "supportsExceptionInfoRequest": { + "type": "boolean", + "description": "The debug adapter supports the `exceptionInfo` request." + }, + "supportTerminateDebuggee": { + "type": "boolean", + "description": "The debug adapter supports the `terminateDebuggee` attribute on the `disconnect` request." + }, + "supportSuspendDebuggee": { + "type": "boolean", + "description": "The debug adapter supports the `suspendDebuggee` attribute on the `disconnect` request." + }, + "supportsDelayedStackTraceLoading": { + "type": "boolean", + "description": "The debug adapter supports the delayed loading of parts of the stack, which requires that both the `startFrame` and `levels` arguments and the `totalFrames` result of the `stackTrace` request are supported." + }, + "supportsLoadedSourcesRequest": { + "type": "boolean", + "description": "The debug adapter supports the `loadedSources` request." + }, + "supportsLogPoints": { + "type": "boolean", + "description": "The debug adapter supports log points by interpreting the `logMessage` attribute of the `SourceBreakpoint`." + }, + "supportsTerminateThreadsRequest": { + "type": "boolean", + "description": "The debug adapter supports the `terminateThreads` request." + }, + "supportsSetExpression": { + "type": "boolean", + "description": "The debug adapter supports the `setExpression` request." + }, + "supportsTerminateRequest": { + "type": "boolean", + "description": "The debug adapter supports the `terminate` request." + }, + "supportsDataBreakpoints": { + "type": "boolean", + "description": "The debug adapter supports data breakpoints." + }, + "supportsReadMemoryRequest": { + "type": "boolean", + "description": "The debug adapter supports the `readMemory` request." + }, + "supportsWriteMemoryRequest": { + "type": "boolean", + "description": "The debug adapter supports the `writeMemory` request." + }, + "supportsDisassembleRequest": { + "type": "boolean", + "description": "The debug adapter supports the `disassemble` request." + }, + "supportsCancelRequest": { + "type": "boolean", + "description": "The debug adapter supports the `cancel` request." + }, + "supportsBreakpointLocationsRequest": { + "type": "boolean", + "description": "The debug adapter supports the `breakpointLocations` request." + }, + "supportsClipboardContext": { + "type": "boolean", + "description": "The debug adapter supports the `clipboard` context value in the `evaluate` request." + }, + "supportsSteppingGranularity": { + "type": "boolean", + "description": "The debug adapter supports stepping granularities (argument `granularity`) for the stepping requests." + }, + "supportsInstructionBreakpoints": { + "type": "boolean", + "description": "The debug adapter supports adding breakpoints based on instruction references." + }, + "supportsExceptionFilterOptions": { + "type": "boolean", + "description": "The debug adapter supports `filterOptions` as an argument on the `setExceptionBreakpoints` request." + }, + "supportsSingleThreadExecutionRequests": { + "type": "boolean", + "description": "The debug adapter supports the `singleThread` property on the execution requests (`continue`, `next`, `stepIn`, `stepOut`, `reverseContinue`, `stepBack`)." + } + } + }, + + "ExceptionBreakpointsFilter": { + "type": "object", + "description": "An `ExceptionBreakpointsFilter` is shown in the UI as an filter option for configuring how exceptions are dealt with.", + "properties": { + "filter": { + "type": "string", + "description": "The internal ID of the filter option. This value is passed to the `setExceptionBreakpoints` request." + }, + "label": { + "type": "string", + "description": "The name of the filter option. This is shown in the UI." + }, + "description": { + "type": "string", + "description": "A help text providing additional information about the exception filter. This string is typically shown as a hover and can be translated." + }, + "default": { + "type": "boolean", + "description": "Initial value of the filter option. If not specified a value false is assumed." + }, + "supportsCondition": { + "type": "boolean", + "description": "Controls whether a condition can be specified for this filter option. If false or missing, a condition can not be set." + }, + "conditionDescription": { + "type": "string", + "description": "A help text providing information about the condition. This string is shown as the placeholder text for a text box and can be translated." + } + }, + "required": [ "filter", "label" ] + }, + + "Message": { + "type": "object", + "description": "A structured message object. Used to return errors from requests.", + "properties": { + "id": { + "type": "integer", + "description": "Unique (within a debug adapter implementation) identifier for the message. The purpose of these error IDs is to help extension authors that have the requirement that every user visible error message needs a corresponding error number, so that users or customer support can find information about the specific error more easily." + }, + "format": { + "type": "string", + "description": "A format string for the message. Embedded variables have the form `{name}`.\nIf variable name starts with an underscore character, the variable does not contain user data (PII) and can be safely used for telemetry purposes." + }, + "variables": { + "type": "object", + "description": "An object used as a dictionary for looking up the variables in the format string.", + "additionalProperties": { + "type": "string", + "description": "All dictionary values must be strings." + } + }, + "sendTelemetry": { + "type": "boolean", + "description": "If true send to telemetry." + }, + "showUser": { + "type": "boolean", + "description": "If true show user." + }, + "url": { + "type": "string", + "description": "A url where additional information about this message can be found." + }, + "urlLabel": { + "type": "string", + "description": "A label that is presented to the user as the UI for opening the url." + } + }, + "required": [ "id", "format" ] + }, + + "Module": { + "type": "object", + "description": "A Module object represents a row in the modules view.\nThe `id` attribute identifies a module in the modules view and is used in a `module` event for identifying a module for adding, updating or deleting.\nThe `name` attribute is used to minimally render the module in the UI.\n\nAdditional attributes can be added to the module. They show up in the module view if they have a corresponding `ColumnDescriptor`.\n\nTo avoid an unnecessary proliferation of additional attributes with similar semantics but different names, we recommend to re-use attributes from the 'recommended' list below first, and only introduce new attributes if nothing appropriate could be found.", + "properties": { + "id": { + "type": ["integer", "string"], + "description": "Unique identifier for the module." + }, + "name": { + "type": "string", + "description": "A name of the module." + }, + "path": { + "type": "string", + "description": "Logical full path to the module. The exact definition is implementation defined, but usually this would be a full path to the on-disk file for the module." + }, + "isOptimized": { + "type": "boolean", + "description": "True if the module is optimized." + }, + "isUserCode": { + "type": "boolean", + "description": "True if the module is considered 'user code' by a debugger that supports 'Just My Code'." + }, + "version": { + "type": "string", + "description": "Version of Module." + }, + "symbolStatus": { + "type": "string", + "description": "User-understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not found', etc.)" + }, + "symbolFilePath": { + "type": "string", + "description": "Logical full path to the symbol file. The exact definition is implementation defined." + }, + "dateTimeStamp": { + "type": "string", + "description": "Module created or modified, encoded as a RFC 3339 timestamp." + }, + "addressRange": { + "type": "string", + "description": "Address range covered by this module." + } + }, + "required": [ "id", "name" ] + }, + + "ColumnDescriptor": { + "type": "object", + "description": "A `ColumnDescriptor` specifies what module attribute to show in a column of the modules view, how to format it,\nand what the column's label should be.\nIt is only used if the underlying UI actually supports this level of customization.", + "properties": { + "attributeName": { + "type": "string", + "description": "Name of the attribute rendered in this column." + }, + "label": { + "type": "string", + "description": "Header UI label of column." + }, + "format": { + "type": "string", + "description": "Format to use for the rendered values in this column. TBD how the format strings looks like." + }, + "type": { + "type": "string", + "enum": [ "string", "number", "boolean", "unixTimestampUTC" ], + "description": "Datatype of values in this column. Defaults to `string` if not specified." + }, + "width": { + "type": "integer", + "description": "Width of this column in characters (hint only)." + } + }, + "required": [ "attributeName", "label"] + }, + + "Thread": { + "type": "object", + "description": "A Thread", + "properties": { + "id": { + "type": "integer", + "description": "Unique identifier for the thread." + }, + "name": { + "type": "string", + "description": "The name of the thread." + } + }, + "required": [ "id", "name" ] + }, + + "Source": { + "type": "object", + "description": "A `Source` is a descriptor for source code.\nIt is returned from the debug adapter as part of a `StackFrame` and it is used by clients when specifying breakpoints.", + "properties": { + "name": { + "type": "string", + "description": "The short name of the source. Every source returned from the debug adapter has a name.\nWhen sending a source to the debug adapter this name is optional." + }, + "path": { + "type": "string", + "description": "The path of the source to be shown in the UI.\nIt is only used to locate and load the content of the source if no `sourceReference` is specified (or its value is 0)." + }, + "sourceReference": { + "type": "integer", + "description": "If the value > 0 the contents of the source must be retrieved through the `source` request (even if a path is specified).\nSince a `sourceReference` is only valid for a session, it can not be used to persist a source.\nThe value should be less than or equal to 2147483647 (2^31-1)." + }, + "presentationHint": { + "type": "string", + "description": "A hint for how to present the source in the UI.\nA value of `deemphasize` can be used to indicate that the source is not available or that it is skipped on stepping.", + "enum": [ "normal", "emphasize", "deemphasize" ] + }, + "origin": { + "type": "string", + "description": "The origin of this source. For example, 'internal module', 'inlined content from source map', etc." + }, + "sources": { + "type": "array", + "items": { + "$ref": "#/definitions/Source" + }, + "description": "A list of sources that are related to this source. These may be the source that generated this source." + }, + "adapterData": { + "type": [ "array", "boolean", "integer", "null", "number", "object", "string" ], + "description": "Additional data that a debug adapter might want to loop through the client.\nThe client should leave the data intact and persist it across sessions. The client should not interpret the data." + }, + "checksums": { + "type": "array", + "items": { + "$ref": "#/definitions/Checksum" + }, + "description": "The checksums associated with this file." + } + } + }, + + "StackFrame": { + "type": "object", + "description": "A Stackframe contains the source location.", + "properties": { + "id": { + "type": "integer", + "description": "An identifier for the stack frame. It must be unique across all threads.\nThis id can be used to retrieve the scopes of the frame with the `scopes` request or to restart the execution of a stack frame." + }, + "name": { + "type": "string", + "description": "The name of the stack frame, typically a method name." + }, + "source": { + "$ref": "#/definitions/Source", + "description": "The source of the frame." + }, + "line": { + "type": "integer", + "description": "The line within the source of the frame. If the source attribute is missing or doesn't exist, `line` is 0 and should be ignored by the client." + }, + "column": { + "type": "integer", + "description": "Start position of the range covered by the stack frame. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If attribute `source` is missing or doesn't exist, `column` is 0 and should be ignored by the client." + }, + "endLine": { + "type": "integer", + "description": "The end line of the range covered by the stack frame." + }, + "endColumn": { + "type": "integer", + "description": "End position of the range covered by the stack frame. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + }, + "canRestart": { + "type": "boolean", + "description": "Indicates whether this frame can be restarted with the `restart` request. Clients should only use this if the debug adapter supports the `restart` request and the corresponding capability `supportsRestartRequest` is true. If a debug adapter has this capability, then `canRestart` defaults to `true` if the property is absent." + }, + "instructionPointerReference": { + "type": "string", + "description": "A memory reference for the current instruction pointer in this frame." + }, + "moduleId": { + "type": ["integer", "string"], + "description": "The module associated with this frame, if any." + }, + "presentationHint": { + "type": "string", + "enum": [ "normal", "label", "subtle" ], + "description": "A hint for how to present this frame in the UI.\nA value of `label` can be used to indicate that the frame is an artificial frame that is used as a visual label or separator. A value of `subtle` can be used to change the appearance of a frame in a 'subtle' way." + } + }, + "required": [ "id", "name", "line", "column" ] + }, + + "Scope": { + "type": "object", + "description": "A `Scope` is a named container for variables. Optionally a scope can map to a source or a range within a source.", + "properties": { + "name": { + "type": "string", + "description": "Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This string is shown in the UI as is and can be translated." + }, + "presentationHint": { + "type": "string", + "description": "A hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with a generic UI.", + "_enum": [ "arguments", "locals", "registers" ], + "enumDescriptions": [ + "Scope contains method arguments.", + "Scope contains local variables.", + "Scope contains registers. Only a single `registers` scope should be returned from a `scopes` request." + ] + }, + "variablesReference": { + "type": "integer", + "description": "The variables of this scope can be retrieved by passing the value of `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." + }, + "namedVariables": { + "type": "integer", + "description": "The number of named variables in this scope.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks." + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed variables in this scope.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks." + }, + "expensive": { + "type": "boolean", + "description": "If true, the number of variables in this scope is large or expensive to retrieve." + }, + "source": { + "$ref": "#/definitions/Source", + "description": "The source for this scope." + }, + "line": { + "type": "integer", + "description": "The start line of the range covered by this scope." + }, + "column": { + "type": "integer", + "description": "Start position of the range covered by the scope. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + }, + "endLine": { + "type": "integer", + "description": "The end line of the range covered by this scope." + }, + "endColumn": { + "type": "integer", + "description": "End position of the range covered by the scope. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + } + }, + "required": [ "name", "variablesReference", "expensive" ] + }, + + "Variable": { + "type": "object", + "description": "A Variable is a name/value pair.\nThe `type` attribute is shown if space permits or when hovering over the variable's name.\nThe `kind` attribute is used to render additional properties of the variable, e.g. different icons can be used to indicate that a variable is public or private.\nIf the value is structured (has children), a handle is provided to retrieve the children with the `variables` request.\nIf the number of named or indexed children is large, the numbers should be returned via the `namedVariables` and `indexedVariables` attributes.\nThe client can use this information to present the children in a paged UI and fetch them in chunks.", + "properties": { + "name": { + "type": "string", + "description": "The variable's name." + }, + "value": { + "type": "string", + "description": "The variable's value.\nThis can be a multi-line text, e.g. for a function the body of a function.\nFor structured variables (which do not have a simple value), it is recommended to provide a one-line representation of the structured object. This helps to identify the structured object in the collapsed state when its children are not yet visible.\nAn empty string can be used if no value should be shown in the UI." + }, + "type": { + "type": "string", + "description": "The type of the variable's value. Typically shown in the UI when hovering over the value.\nThis attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is true." + }, + "presentationHint": { + "$ref": "#/definitions/VariablePresentationHint", + "description": "Properties of a variable that can be used to determine how to render the variable in the UI." + }, + "evaluateName": { + "type": "string", + "description": "The evaluatable name of this variable which can be passed to the `evaluate` request to fetch the variable's value." + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the variable is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the children in a paged UI and fetch them in chunks." + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the children in a paged UI and fetch them in chunks." + }, + "memoryReference": { + "type": "string", + "description": "A memory reference associated with this variable.\nFor pointer type variables, this is generally a reference to the memory address contained in the pointer.\nFor executable data, this reference may later be used in a `disassemble` request.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is true." + } + }, + "required": [ "name", "value", "variablesReference" ] + }, + + "VariablePresentationHint": { + "type": "object", + "description": "Properties of a variable that can be used to determine how to render the variable in the UI.", + "properties": { + "kind": { + "description": "The kind of variable. Before introducing additional values, try to use the listed values.", + "type": "string", + "_enum": [ "property", "method", "class", "data", "event", "baseClass", "innerClass", "interface", "mostDerivedClass", "virtual", "dataBreakpoint" ], + "enumDescriptions": [ + "Indicates that the object is a property.", + "Indicates that the object is a method.", + "Indicates that the object is a class.", + "Indicates that the object is data.", + "Indicates that the object is an event.", + "Indicates that the object is a base class.", + "Indicates that the object is an inner class.", + "Indicates that the object is an interface.", + "Indicates that the object is the most derived class.", + "Indicates that the object is virtual, that means it is a synthetic object introduced by the adapter for rendering purposes, e.g. an index range for large arrays.", + "Deprecated: Indicates that a data breakpoint is registered for the object. The `hasDataBreakpoint` attribute should generally be used instead." + ] + }, + "attributes": { + "description": "Set of attributes represented as an array of strings. Before introducing additional values, try to use the listed values.", + "type": "array", + "items": { + "type": "string", + "_enum": [ "static", "constant", "readOnly", "rawString", "hasObjectId", "canHaveObjectId", "hasSideEffects", "hasDataBreakpoint" ], + "enumDescriptions": [ + "Indicates that the object is static.", + "Indicates that the object is a constant.", + "Indicates that the object is read only.", + "Indicates that the object is a raw string.", + "Indicates that the object can have an Object ID created for it. This is a vestigial attribute that is used by some clients; 'Object ID's are not specified in the protocol.", + "Indicates that the object has an Object ID associated with it. This is a vestigial attribute that is used by some clients; 'Object ID's are not specified in the protocol.", + "Indicates that the evaluation had side effects.", + "Indicates that the object has its value tracked by a data breakpoint." + ] + } + }, + "visibility": { + "description": "Visibility of variable. Before introducing additional values, try to use the listed values.", + "type": "string", + "_enum": [ "public", "private", "protected", "internal", "final" ] + }, + "lazy": { + "description": "If true, clients can present the variable with a UI that supports a specific gesture to trigger its evaluation.\nThis mechanism can be used for properties that require executing code when retrieving their value and where the code execution can be expensive and/or produce side-effects. A typical example are properties based on a getter function.\nPlease note that in addition to the `lazy` flag, the variable's `variablesReference` is expected to refer to a variable that will provide the value through another `variable` request.", + "type": "boolean" + } + } + }, + + "BreakpointLocation": { + "type": "object", + "description": "Properties of a breakpoint location returned from the `breakpointLocations` request.", + "properties": { + "line": { + "type": "integer", + "description": "Start line of breakpoint location." + }, + "column": { + "type": "integer", + "description": "The start position of a breakpoint location. Position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + }, + "endLine": { + "type": "integer", + "description": "The end line of breakpoint location if the location covers a range." + }, + "endColumn": { + "type": "integer", + "description": "The end position of a breakpoint location (if the location covers a range). Position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + } + }, + "required": [ "line" ] + }, + + "SourceBreakpoint": { + "type": "object", + "description": "Properties of a breakpoint or logpoint passed to the `setBreakpoints` request.", + "properties": { + "line": { + "type": "integer", + "description": "The source line of the breakpoint or logpoint." + }, + "column": { + "type": "integer", + "description": "Start position within source line of the breakpoint or logpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + }, + "condition": { + "type": "string", + "description": "The expression for conditional breakpoints.\nIt is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is true." + }, + "hitCondition": { + "type": "string", + "description": "The expression that controls how many hits of the breakpoint are ignored.\nThe debug adapter is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is true.\nIf both this property and `condition` are specified, `hitCondition` should be evaluated only if the `condition` is met, and the debug adapter should stop only if both conditions are met." + }, + "logMessage": { + "type": "string", + "description": "If this attribute exists and is non-empty, the debug adapter must not 'break' (stop)\nbut log the message instead. Expressions within `{}` are interpolated.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsLogPoints` is true.\nIf either `hitCondition` or `condition` is specified, then the message should only be logged if those conditions are met." + } + }, + "required": [ "line" ] + }, + + "FunctionBreakpoint": { + "type": "object", + "description": "Properties of a breakpoint passed to the `setFunctionBreakpoints` request.", + "properties": { + "name": { + "type": "string", + "description": "The name of the function." + }, + "condition": { + "type": "string", + "description": "An expression for conditional breakpoints.\nIt is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is true." + }, + "hitCondition": { + "type": "string", + "description": "An expression that controls how many hits of the breakpoint are ignored.\nThe debug adapter is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is true." + } + }, + "required": [ "name" ] + }, + + "DataBreakpointAccessType": { + "type": "string", + "description": "This enumeration defines all possible access types for data breakpoints.", + "enum": [ "read", "write", "readWrite" ] + }, + + "DataBreakpoint": { + "type": "object", + "description": "Properties of a data breakpoint passed to the `setDataBreakpoints` request.", + "properties": { + "dataId": { + "type": "string", + "description": "An id representing the data. This id is returned from the `dataBreakpointInfo` request." + }, + "accessType": { + "$ref": "#/definitions/DataBreakpointAccessType", + "description": "The access type of the data." + }, + "condition": { + "type": "string", + "description": "An expression for conditional breakpoints." + }, + "hitCondition": { + "type": "string", + "description": "An expression that controls how many hits of the breakpoint are ignored.\nThe debug adapter is expected to interpret the expression as needed." + } + }, + "required": [ "dataId" ] + }, + + "InstructionBreakpoint": { + "type": "object", + "description": "Properties of a breakpoint passed to the `setInstructionBreakpoints` request", + "properties": { + "instructionReference": { + "type": "string", + "description": "The instruction reference of the breakpoint.\nThis should be a memory or instruction pointer reference from an `EvaluateResponse`, `Variable`, `StackFrame`, `GotoTarget`, or `Breakpoint`." + }, + "offset": { + "type": "integer", + "description": "The offset from the instruction reference in bytes.\nThis can be negative." + }, + "condition": { + "type": "string", + "description": "An expression for conditional breakpoints.\nIt is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is true." + }, + "hitCondition": { + "type": "string", + "description": "An expression that controls how many hits of the breakpoint are ignored.\nThe debug adapter is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is true." + } + }, + "required": [ "instructionReference" ] + }, + + "Breakpoint": { + "type": "object", + "description": "Information about a breakpoint created in `setBreakpoints`, `setFunctionBreakpoints`, `setInstructionBreakpoints`, or `setDataBreakpoints` requests.", + "properties": { + "id": { + "type": "integer", + "description": "The identifier for the breakpoint. It is needed if breakpoint events are used to update or remove breakpoints." + }, + "verified": { + "type": "boolean", + "description": "If true, the breakpoint could be set (but not necessarily at the desired location)." + }, + "message": { + "type": "string", + "description": "A message about the state of the breakpoint.\nThis is shown to the user and can be used to explain why a breakpoint could not be verified." + }, + "source": { + "$ref": "#/definitions/Source", + "description": "The source where the breakpoint is located." + }, + "line": { + "type": "integer", + "description": "The start line of the actual range covered by the breakpoint." + }, + "column": { + "type": "integer", + "description": "Start position of the source range covered by the breakpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + }, + "endLine": { + "type": "integer", + "description": "The end line of the actual range covered by the breakpoint." + }, + "endColumn": { + "type": "integer", + "description": "End position of the source range covered by the breakpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.\nIf no end line is given, then the end column is assumed to be in the start line." + }, + "instructionReference": { + "type": "string", + "description": "A memory reference to where the breakpoint is set." + }, + "offset": { + "type": "integer", + "description": "The offset from the instruction reference.\nThis can be negative." + }, + "reason": { + "type": "string", + "description": "A machine-readable explanation of why a breakpoint may not be verified. If a breakpoint is verified or a specific reason is not known, the adapter should omit this property. Possible values include:\n\n- `pending`: Indicates a breakpoint might be verified in the future, but the adapter cannot verify it in the current state.\n - `failed`: Indicates a breakpoint was not able to be verified, and the adapter does not believe it can be verified without intervention.", + "enum": [ "pending", "failed" ] + } + }, + "required": [ "verified" ] + }, + + "SteppingGranularity": { + "type": "string", + "description": "The granularity of one 'step' in the stepping requests `next`, `stepIn`, `stepOut`, and `stepBack`.", + "enum": [ "statement", "line", "instruction" ], + "enumDescriptions": [ + "The step should allow the program to run until the current statement has finished executing.\nThe meaning of a statement is determined by the adapter and it may be considered equivalent to a line.\nFor example 'for(int i = 0; i < 10; i++)' could be considered to have 3 statements 'int i = 0', 'i < 10', and 'i++'.", + "The step should allow the program to run until the current source line has executed.", + "The step should allow one instruction to execute (e.g. one x86 instruction)." + ] + }, + + "StepInTarget": { + "type": "object", + "description": "A `StepInTarget` can be used in the `stepIn` request and determines into which single target the `stepIn` request should step.", + "properties": { + "id": { + "type": "integer", + "description": "Unique identifier for a step-in target." + }, + "label": { + "type": "string", + "description": "The name of the step-in target (shown in the UI)." + }, + "line": { + "type": "integer", + "description": "The line of the step-in target." + }, + "column": { + "type": "integer", + "description": "Start position of the range covered by the step in target. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + }, + "endLine": { + "type": "integer", + "description": "The end line of the range covered by the step-in target." + }, + "endColumn": { + "type": "integer", + "description": "End position of the range covered by the step in target. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." + } + }, + "required": [ "id", "label" ] + }, + + "GotoTarget": { + "type": "object", + "description": "A `GotoTarget` describes a code location that can be used as a target in the `goto` request.\nThe possible goto targets can be determined via the `gotoTargets` request.", + "properties": { + "id": { + "type": "integer", + "description": "Unique identifier for a goto target. This is used in the `goto` request." + }, + "label": { + "type": "string", + "description": "The name of the goto target (shown in the UI)." + }, + "line": { + "type": "integer", + "description": "The line of the goto target." + }, + "column": { + "type": "integer", + "description": "The column of the goto target." + }, + "endLine": { + "type": "integer", + "description": "The end line of the range covered by the goto target." + }, + "endColumn": { + "type": "integer", + "description": "The end column of the range covered by the goto target." + }, + "instructionPointerReference": { + "type": "string", + "description": "A memory reference for the instruction pointer value represented by this target." + } + }, + "required": [ "id", "label", "line" ] + }, + + "CompletionItem": { + "type": "object", + "description": "`CompletionItems` are the suggestions returned from the `completions` request.", + "properties": { + "label": { + "type": "string", + "description": "The label of this completion item. By default this is also the text that is inserted when selecting this completion." + }, + "text": { + "type": "string", + "description": "If text is returned and not an empty string, then it is inserted instead of the label." + }, + "sortText": { + "type": "string", + "description": "A string that should be used when comparing this item with other items. If not returned or an empty string, the `label` is used instead." + }, + "detail": { + "type": "string", + "description": "A human-readable string with additional information about this item, like type or symbol information." + }, + "type": { + "$ref": "#/definitions/CompletionItemType", + "description": "The item's type. Typically the client uses this information to render the item in the UI with an icon." + }, + "start": { + "type": "integer", + "description": "Start position (within the `text` attribute of the `completions` request) where the completion text is added. The position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If the start position is omitted the text is added at the location specified by the `column` attribute of the `completions` request." + }, + "length": { + "type": "integer", + "description": "Length determines how many characters are overwritten by the completion text and it is measured in UTF-16 code units. If missing the value 0 is assumed which results in the completion text being inserted." + }, + "selectionStart": { + "type": "integer", + "description": "Determines the start of the new selection after the text has been inserted (or replaced). `selectionStart` is measured in UTF-16 code units and must be in the range 0 and length of the completion text. If omitted the selection starts at the end of the completion text." + }, + "selectionLength": { + "type": "integer", + "description": "Determines the length of the new selection after the text has been inserted (or replaced) and it is measured in UTF-16 code units. The selection can not extend beyond the bounds of the completion text. If omitted the length is assumed to be 0." + } + }, + "required": [ "label" ] + }, + + "CompletionItemType": { + "type": "string", + "description": "Some predefined types for the CompletionItem. Please note that not all clients have specific icons for all of them.", + "enum": [ "method", "function", "constructor", "field", "variable", "class", "interface", "module", "property", "unit", "value", "enum", "keyword", "snippet", "text", "color", "file", "reference", "customcolor" ] + }, + + "ChecksumAlgorithm": { + "type": "string", + "description": "Names of checksum algorithms that may be supported by a debug adapter.", + "enum": [ "MD5", "SHA1", "SHA256", "timestamp" ] + }, + + "Checksum": { + "type": "object", + "description": "The checksum of an item calculated by the specified algorithm.", + "properties": { + "algorithm": { + "$ref": "#/definitions/ChecksumAlgorithm", + "description": "The algorithm used to calculate this checksum." + }, + "checksum": { + "type": "string", + "description": "Value of the checksum, encoded as a hexadecimal value." + } + }, + "required": [ "algorithm", "checksum" ] + }, + + "ValueFormat": { + "type": "object", + "description": "Provides formatting information for a value.", + "properties": { + "hex": { + "type": "boolean", + "description": "Display the value in hex." + } + } + }, + + "StackFrameFormat": { + "allOf": [ { "$ref": "#/definitions/ValueFormat" }, { + "type": "object", + "description": "Provides formatting information for a stack frame.", + "properties": { + "parameters": { + "type": "boolean", + "description": "Displays parameters for the stack frame." + }, + "parameterTypes": { + "type": "boolean", + "description": "Displays the types of parameters for the stack frame." + }, + "parameterNames": { + "type": "boolean", + "description": "Displays the names of parameters for the stack frame." + }, + "parameterValues": { + "type": "boolean", + "description": "Displays the values of parameters for the stack frame." + }, + "line": { + "type": "boolean", + "description": "Displays the line number of the stack frame." + }, + "module": { + "type": "boolean", + "description": "Displays the module of the stack frame." + }, + "includeAll": { + "type": "boolean", + "description": "Includes all stack frames, including those the debug adapter might otherwise hide." + } + } + }] + }, + + "ExceptionFilterOptions": { + "type": "object", + "description": "An `ExceptionFilterOptions` is used to specify an exception filter together with a condition for the `setExceptionBreakpoints` request.", + "properties": { + "filterId": { + "type": "string", + "description": "ID of an exception filter returned by the `exceptionBreakpointFilters` capability." + }, + "condition": { + "type": "string", + "description": "An expression for conditional exceptions.\nThe exception breaks into the debugger if the result of the condition is true." + } + }, + "required": [ "filterId" ] + }, + + "ExceptionOptions": { + "type": "object", + "description": "An `ExceptionOptions` assigns configuration options to a set of exceptions.", + "properties": { + "path": { + "type": "array", + "items": { + "$ref": "#/definitions/ExceptionPathSegment" + }, + "description": "A path that selects a single or multiple exceptions in a tree. If `path` is missing, the whole tree is selected.\nBy convention the first segment of the path is a category that is used to group exceptions in the UI." + }, + "breakMode": { + "$ref": "#/definitions/ExceptionBreakMode", + "description": "Condition when a thrown exception should result in a break." + } + }, + "required": [ "breakMode" ] + }, + + "ExceptionBreakMode": { + "type": "string", + "description": "This enumeration defines all possible conditions when a thrown exception should result in a break.\nnever: never breaks,\nalways: always breaks,\nunhandled: breaks when exception unhandled,\nuserUnhandled: breaks if the exception is not handled by user code.", + "enum": [ "never", "always", "unhandled", "userUnhandled" ] + }, + + "ExceptionPathSegment": { + "type": "object", + "description": "An `ExceptionPathSegment` represents a segment in a path that is used to match leafs or nodes in a tree of exceptions.\nIf a segment consists of more than one name, it matches the names provided if `negate` is false or missing, or it matches anything except the names provided if `negate` is true.", + "properties": { + "negate": { + "type": "boolean", + "description": "If false or missing this segment matches the names provided, otherwise it matches anything except the names provided." + }, + "names": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Depending on the value of `negate` the names that should match or not match." + } + }, + "required": [ "names" ] + }, + + "ExceptionDetails": { + "type": "object", + "description": "Detailed information about an exception that has occurred.", + "properties": { + "message": { + "type": "string", + "description": "Message contained in the exception." + }, + "typeName": { + "type": "string", + "description": "Short type name of the exception object." + }, + "fullTypeName": { + "type": "string", + "description": "Fully-qualified type name of the exception object." + }, + "evaluateName": { + "type": "string", + "description": "An expression that can be evaluated in the current scope to obtain the exception object." + }, + "stackTrace": { + "type": "string", + "description": "Stack trace at the time the exception was thrown." + }, + "innerException": { + "type": "array", + "items": { + "$ref": "#/definitions/ExceptionDetails" + }, + "description": "Details of the exception contained by this exception, if any." + } + } + }, + + "DisassembledInstruction": { + "type": "object", + "description": "Represents a single disassembled instruction.", + "properties": { + "address": { + "type": "string", + "description": "The address of the instruction. Treated as a hex value if prefixed with `0x`, or as a decimal value otherwise." + }, + "instructionBytes": { + "type": "string", + "description": "Raw bytes representing the instruction and its operands, in an implementation-defined format." + }, + "instruction": { + "type": "string", + "description": "Text representing the instruction and its operands, in an implementation-defined format." + }, + "symbol": { + "type": "string", + "description": "Name of the symbol that corresponds with the location of this instruction, if any." + }, + "location": { + "$ref": "#/definitions/Source", + "description": "Source location that corresponds to this instruction, if any.\nShould always be set (if available) on the first instruction returned,\nbut can be omitted afterwards if this instruction maps to the same source file as the previous instruction." + }, + "line": { + "type": "integer", + "description": "The line within the source location that corresponds to this instruction, if any." + }, + "column": { + "type": "integer", + "description": "The column within the line that corresponds to this instruction, if any." + }, + "endLine": { + "type": "integer", + "description": "The end line of the range that corresponds to this instruction, if any." + }, + "endColumn": { + "type": "integer", + "description": "The end column of the range that corresponds to this instruction, if any." + }, + "presentationHint": { + "type": "string", + "description": "A hint for how to present the instruction in the UI.\n\nA value of `invalid` may be used to indicate this instruction is 'filler' and cannot be reached by the program. For example, unreadable memory addresses may be presented is 'invalid.'", + "enum": [ "normal", "invalid" ] + } + }, + "required": [ "address", "instruction" ] + }, + + "InvalidatedAreas": { + "type": "string", + "description": "Logical areas that can be invalidated by the `invalidated` event.", + "_enum": [ "all", "stacks", "threads", "variables" ], + "enumDescriptions": [ + "All previously fetched data has become invalid and needs to be refetched.", + "Previously fetched stack related data has become invalid and needs to be refetched.", + "Previously fetched thread related data has become invalid and needs to be refetched.", + "Previously fetched variable data has become invalid and needs to be refetched." + ] + } + + } +} diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocolCustom.json b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocolCustom.json new file mode 100644 index 0000000..a0a9b87 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocolCustom.json @@ -0,0 +1,325 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Custom Debug Adapter Protocol", + "description": "Extension to the DAP to support additional features.", + "type": "object", + + + "definitions": { + + "SetDebuggerPropertyRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request can be used to enable or disable debugger features.", + "properties": { + "command": { + "type": "string", + "enum": [ "setDebuggerProperty" ] + }, + "arguments": { + "$ref": "#/definitions/SetDebuggerPropertyArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetDebuggerPropertyArguments": { + "type": "object", + "description": "Arguments for 'setDebuggerProperty' request.", + "properties": { + "ideOS": { + "type": [ "string" ], + "description": "OS where the ide is running. Supported values [Windows, Linux]" + }, + "dontTraceStartPatterns": { + "type": [ "array" ], + "description": "Patterns to match with the start of the file paths. Matching paths will be added to a list of file where trace is ignored." + }, + "dontTraceEndPatterns": { + "type": [ "array" ], + "description": "Patterns to match with the end of the file paths. Matching paths will be added to a list of file where trace is ignored." + }, + "skipSuspendOnBreakpointException": { + "type": [ "array" ], + "description": "List of exceptions that should be skipped when doing condition evaluations." + }, + "skipPrintBreakpointException": { + "type": [ "array" ], + "description": "List of exceptions that should skip printing to stderr when doing condition evaluations." + }, + "multiThreadsSingleNotification": { + "type": [ "boolean" ], + "description": "If false then a notification is generated for each thread event. If true a single event is gnenerated, and all threads follow that behavior." + } + } + }, + "SetDebuggerPropertyResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to 'setDebuggerProperty' request. This is just an acknowledgement, so no body field is required." + }] + }, + + "PydevdInputRequestedEvent": { + "allOf": [ { "$ref": "#/definitions/Event" }, { + "type": "object", + "description": "The event indicates input was requested by debuggee.", + "properties": { + "event": { + "type": "string", + "enum": [ "pydevdInputRequested" ] + } + }, + "required": [ "event" ] + }] + }, + + "SetPydevdSourceMapRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": [ + "Sets multiple PydevdSourceMap for a single source and clears all previous PydevdSourceMap in that source.", + "i.e.: Maps paths and lines in a 1:N mapping (use case: map a single file in the IDE to multiple IPython cells).", + "To clear all PydevdSourceMap for a source, specify an empty array.", + "Interaction with breakpoints: When a new mapping is sent, breakpoints that match the source (or previously matched a source) are reapplied.", + "Interaction with launch pathMapping: both mappings are independent. This mapping is applied after the launch pathMapping." + ], + "properties": { + "command": { + "type": "string", + "enum": [ "setPydevdSourceMap" ] + }, + "arguments": { + "$ref": "#/definitions/SetPydevdSourceMapArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "SetPydevdSourceMapArguments": { + "type": "object", + "description": "Arguments for 'setPydevdSourceMap' request.", + "properties": { + "source": { + "$ref": "#/definitions/Source", + "description": "The source location of the PydevdSourceMap; 'source.path' must be specified (e.g.: for an ipython notebook this could be something as /home/notebook/note.py)." + }, + "pydevdSourceMaps": { + "type": "array", + "items": { + "$ref": "#/definitions/PydevdSourceMap" + }, + "description": "The PydevdSourceMaps to be set to the given source (provide an empty array to clear the source mappings for a given path)." + } + }, + "required": [ "source", "pydevdSourceMap" ] + }, + "SetPydevdSourceMapResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to 'setPydevdSourceMap' request. This is just an acknowledgement, so no body field is required." + }] + }, + + "PydevdSourceMap": { + "type": "object", + "description": "Information that allows mapping a local line to a remote source/line.", + "properties": { + "line": { + "type": "integer", + "description": "The local line to which the mapping should map to (e.g.: for an ipython notebook this would be the first line of the cell in the file)." + }, + "endLine": { + "type": "integer", + "description": "The end line." + }, + "runtimeSource": { + "$ref": "#/definitions/Source", + "description": "The path that the user has remotely -- 'source.path' must be specified (e.g.: for an ipython notebook this could be something as '')" + }, + "runtimeLine": { + "type": "integer", + "description": "The remote line to which the mapping should map to (e.g.: for an ipython notebook this would be always 1 as it'd map the start of the cell)." + } + }, + "required": ["line", "endLine", "runtimeSource", "runtimeLine"] + }, + + "PydevdSystemInfoRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "The request can be used retrieve system information, python version, etc.", + "properties": { + "command": { + "type": "string", + "enum": [ "pydevdSystemInfo" ] + }, + "arguments": { + "$ref": "#/definitions/PydevdSystemInfoArguments" + } + }, + "required": [ "command" ] + }] + }, + "PydevdSystemInfoArguments": { + "type": "object", + "description": "Arguments for 'pydevdSystemInfo' request." + }, + "PydevdSystemInfoResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to 'pydevdSystemInfo' request.", + "properties": { + "body": { + "type": "object", + "properties": { + "python": { + "$ref": "#/definitions/PydevdPythonInfo", + "description": "Information about the python version running in the current process." + }, + "platform": { + "$ref": "#/definitions/PydevdPlatformInfo", + "description": "Information about the plarforn on which the current process is running." + }, + "process": { + "$ref": "#/definitions/PydevdProcessInfo", + "description": "Information about the current process." + }, + "pydevd": { + "$ref": "#/definitions/PydevdInfo", + "description": "Information about pydevd." + } + }, + "required": [ "python", "platform", "process", "pydevd" ] + } + }, + "required": [ "body" ] + }] + }, + + "PydevdPythonInfo": { + "type": "object", + "description": "This object contains python version and implementation details.", + "properties": { + "version": { + "type": "string", + "description": "Python version as a string in semver format: ..." + }, + "implementation": { + "$ref": "#/definitions/PydevdPythonImplementationInfo", + "description": "Python version as a string in this format ..." + } + } + }, + "PydevdPythonImplementationInfo": { + "type": "object", + "description": "This object contains python implementation details.", + "properties": { + "name": { + "type": "string", + "description": "Python implementation name." + }, + "version": { + "type": "string", + "description": "Python version as a string in semver format: ..." + }, + "description": { + "type": "string", + "description": "Optional description for this python implementation." + } + } + }, + "PydevdPlatformInfo": { + "type": "object", + "description": "This object contains python version and implementation details.", + "properties": { + "name": { + "type": "string", + "description": "Name of the platform as returned by 'sys.platform'." + } + } + }, + "PydevdProcessInfo": { + "type": "object", + "description": "This object contains python process details.", + "properties": { + "pid": { + "type": "integer", + "description": "Process ID for the current process." + }, + "ppid": { + "type": "integer", + "description": "Parent Process ID for the current process." + }, + "executable": { + "type": "string", + "description": "Path to the executable as returned by 'sys.executable'." + }, + "bitness": { + "type": "integer", + "description": "Integer value indicating the bitness of the current process." + } + } + }, + "PydevdInfo": { + "type": "object", + "description": "This object contains details on pydevd.", + "properties": { + "usingCython": { + "type": "boolean", + "description": "Specifies whether the cython native module is being used." + }, + "usingFrameEval": { + "type": "boolean", + "description": "Specifies whether the frame eval native module is being used." + } + } + }, + "PydevdAuthorizeRequest": { + "allOf": [ { "$ref": "#/definitions/Request" }, { + "type": "object", + "description": "A request to authorize the ide to start accepting commands.", + "properties": { + "command": { + "type": "string", + "enum": [ "pydevdAuthorize" ] + }, + "arguments": { + "$ref": "#/definitions/PydevdAuthorizeArguments" + } + }, + "required": [ "command", "arguments" ] + }] + }, + "PydevdAuthorizeArguments": { + "type": "object", + "description": "Arguments for 'pydevdAuthorize' request.", + "properties": { + "debugServerAccessToken": { + "type": "string" , + "description": "The access token to access the debug server." + } + }, + "required": [ "command" ] + }, + "PydevdAuthorizeResponse": { + "allOf": [ { "$ref": "#/definitions/Response" }, { + "type": "object", + "description": "Response to 'pydevdAuthorize' request.", + "properties": { + "body": { + "type": "object", + "properties": { + "clientAccessToken": { + "type": "string", + "description": "The access token to access the client (i.e.: usually the IDE)." + } + }, + "required": [ "clientAccessToken" ] + } + }, + "required": [ "body" ] + }] + } + } +} \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_base_schema.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_base_schema.py new file mode 100644 index 0000000..e5078f0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_base_schema.py @@ -0,0 +1,143 @@ +from _pydevd_bundle._debug_adapter.pydevd_schema_log import debug_exception +import json +import itertools +from functools import partial + + +class BaseSchema(object): + @staticmethod + def initialize_ids_translation(): + BaseSchema._dap_id_to_obj_id = {0: 0, None: None} + BaseSchema._obj_id_to_dap_id = {0: 0, None: None} + BaseSchema._next_dap_id = partial(next, itertools.count(1)) + + def to_json(self): + return json.dumps(self.to_dict()) + + @staticmethod + def _translate_id_to_dap(obj_id): + if obj_id == "*": + return "*" + # Note: we don't invalidate ids, so, if some object starts using the same id + # of another object, the same id will be used. + dap_id = BaseSchema._obj_id_to_dap_id.get(obj_id) + if dap_id is None: + dap_id = BaseSchema._obj_id_to_dap_id[obj_id] = BaseSchema._next_dap_id() + BaseSchema._dap_id_to_obj_id[dap_id] = obj_id + return dap_id + + @staticmethod + def _translate_id_from_dap(dap_id): + if dap_id == "*": + return "*" + try: + return BaseSchema._dap_id_to_obj_id[dap_id] + except: + raise KeyError("Wrong ID sent from the client: %s" % (dap_id,)) + + @staticmethod + def update_dict_ids_to_dap(dct): + return dct + + @staticmethod + def update_dict_ids_from_dap(dct): + return dct + + +BaseSchema.initialize_ids_translation() + +_requests_to_types = {} +_responses_to_types = {} +_event_to_types = {} +_all_messages = {} + + +def register(cls): + _all_messages[cls.__name__] = cls + return cls + + +def register_request(command): + def do_register(cls): + _requests_to_types[command] = cls + return cls + + return do_register + + +def register_response(command): + def do_register(cls): + _responses_to_types[command] = cls + return cls + + return do_register + + +def register_event(event): + def do_register(cls): + _event_to_types[event] = cls + return cls + + return do_register + + +def from_dict(dct, update_ids_from_dap=False): + msg_type = dct.get("type") + if msg_type is None: + raise ValueError("Unable to make sense of message: %s" % (dct,)) + + if msg_type == "request": + to_type = _requests_to_types + use = dct["command"] + + elif msg_type == "response": + to_type = _responses_to_types + use = dct["command"] + + else: + to_type = _event_to_types + use = dct["event"] + + cls = to_type.get(use) + if cls is None: + raise ValueError("Unable to create message from dict: %s. %s not in %s" % (dct, use, sorted(to_type.keys()))) + try: + return cls(update_ids_from_dap=update_ids_from_dap, **dct) + except: + msg = "Error creating %s from %s" % (cls, dct) + debug_exception(msg) + raise + + +def from_json(json_msg, update_ids_from_dap=False, on_dict_loaded=lambda dct: None): + if isinstance(json_msg, bytes): + json_msg = json_msg.decode("utf-8") + + as_dict = json.loads(json_msg) + on_dict_loaded(as_dict) + try: + return from_dict(as_dict, update_ids_from_dap=update_ids_from_dap) + except: + if as_dict.get("type") == "response" and not as_dict.get("success"): + # Error messages may not have required body (return as a generic Response). + Response = _all_messages["Response"] + return Response(**as_dict) + else: + raise + + +def get_response_class(request): + if request.__class__ == dict: + return _responses_to_types[request["command"]] + return _responses_to_types[request.command] + + +def build_response(request, kwargs=None): + if kwargs is None: + kwargs = {"success": True} + else: + if "success" not in kwargs: + kwargs["success"] = True + response_class = _responses_to_types[request.command] + kwargs.setdefault("seq", -1) # To be overwritten before sending + return response_class(command=request.command, request_seq=request.seq, **kwargs) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema.py new file mode 100644 index 0000000..bdb66e1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema.py @@ -0,0 +1,17458 @@ +# coding: utf-8 +# Automatically generated code. +# Do not edit manually. +# Generated by running: __main__pydevd_gen_debug_adapter_protocol.py +from .pydevd_base_schema import BaseSchema, register, register_request, register_response, register_event + + +@register +class ProtocolMessage(BaseSchema): + """ + Base class of requests, responses, and events. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "description": "Message type.", "_enum": ["request", "response", "event"]}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, type, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: Message type. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = type + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + seq = self.seq + dct = { + "type": type, + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class Request(BaseSchema): + """ + A client or debug adapter initiated request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "description": "The command to execute."}, + "arguments": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Object containing arguments for the command.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, command, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: The command to execute. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] arguments: Object containing arguments for the command. + """ + self.type = "request" + self.command = command + self.seq = seq + self.arguments = arguments + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments + dct.update(self.kwargs) + return dct + + +@register +class Event(BaseSchema): + """ + A debug adapter initiated event. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "description": "Type of event."}, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Event-specific information.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, event, seq=-1, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: Type of event. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Event-specific information. + """ + self.type = "event" + self.event = event + self.seq = seq + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + seq = self.seq + body = self.body + dct = { + "type": type, + "event": event, + "seq": seq, + } + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register +class Response(BaseSchema): + """ + Response for a request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_response("error") +@register +class ErrorResponse(BaseSchema): + """ + On error (whenever `success` is false), the body can provide more details. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": {"error": {"$ref": "#/definitions/Message", "description": "A structured error message."}}, + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param ErrorResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = ErrorResponseBody() + else: + self.body = ErrorResponseBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ErrorResponseBody else body + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("cancel") +@register +class CancelRequest(BaseSchema): + """ + The `cancel` request is used by the client in two situations: + + - to indicate that it is no longer interested in the result produced by a specific request issued + earlier + + - to cancel a progress sequence. + + Clients should only call this request if the corresponding capability `supportsCancelRequest` is + true. + + This request has a hint characteristic: a debug adapter can only be expected to make a 'best effort' + in honoring this request but there are no guarantees. + + The `cancel` request may return an error if it could not cancel an operation but a client should + refrain from presenting this error to end users. + + The request that got cancelled still needs to send a response back. This can either be a normal + result (`success` attribute true) or an error response (`success` attribute false and the `message` + set to `cancelled`). + + Returning partial results from a cancelled request is possible but please note that a client has no + generic way for detecting that a response is partial or not. + + The progress that got cancelled still needs to send a `progressEnd` event back. + + A client should not assume that progress just got cancelled after sending the `cancel` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["cancel"]}, + "arguments": {"type": "CancelArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param CancelArguments arguments: + """ + self.type = "request" + self.command = "cancel" + self.seq = seq + if arguments is None: + self.arguments = CancelArguments() + else: + self.arguments = ( + CancelArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != CancelArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class CancelArguments(BaseSchema): + """ + Arguments for `cancel` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "requestId": { + "type": "integer", + "description": "The ID (attribute `seq`) of the request to cancel. If missing no request is cancelled.\nBoth a `requestId` and a `progressId` can be specified in one request.", + }, + "progressId": { + "type": "string", + "description": "The ID (attribute `progressId`) of the progress to cancel. If missing no progress is cancelled.\nBoth a `requestId` and a `progressId` can be specified in one request.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, requestId=None, progressId=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer requestId: The ID (attribute `seq`) of the request to cancel. If missing no request is cancelled. + Both a `requestId` and a `progressId` can be specified in one request. + :param string progressId: The ID (attribute `progressId`) of the progress to cancel. If missing no progress is cancelled. + Both a `requestId` and a `progressId` can be specified in one request. + """ + self.requestId = requestId + self.progressId = progressId + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + requestId = self.requestId + progressId = self.progressId + dct = {} + if requestId is not None: + dct["requestId"] = requestId + if progressId is not None: + dct["progressId"] = progressId + dct.update(self.kwargs) + return dct + + +@register_response("cancel") +@register +class CancelResponse(BaseSchema): + """ + Response to `cancel` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_event("initialized") +@register +class InitializedEvent(BaseSchema): + """ + This event indicates that the debug adapter is ready to accept configuration requests (e.g. + `setBreakpoints`, `setExceptionBreakpoints`). + + A debug adapter is expected to send this event when it is ready to accept configuration requests + (but not before the `initialize` request has finished). + + The sequence of events/requests is as follows: + + - adapters sends `initialized` event (after the `initialize` request has returned) + + - client sends zero or more `setBreakpoints` requests + + - client sends one `setFunctionBreakpoints` request (if corresponding capability + `supportsFunctionBreakpoints` is true) + + - client sends a `setExceptionBreakpoints` request if one or more `exceptionBreakpointFilters` have + been defined (or if `supportsConfigurationDoneRequest` is not true) + + - client sends other future configuration requests + + - client sends one `configurationDone` request to indicate the end of the configuration. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["initialized"]}, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Event-specific information.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Event-specific information. + """ + self.type = "event" + self.event = "initialized" + self.seq = seq + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + seq = self.seq + body = self.body + dct = { + "type": type, + "event": event, + "seq": seq, + } + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_event("stopped") +@register +class StoppedEvent(BaseSchema): + """ + The event indicates that the execution of the debuggee has stopped due to some condition. + + This can be caused by a breakpoint previously set, a stepping request has completed, by executing a + debugger statement etc. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["stopped"]}, + "body": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "The reason for the event.\nFor backward compatibility this string is shown in the UI if the `description` attribute is missing (but it must not be translated).", + "_enum": [ + "step", + "breakpoint", + "exception", + "pause", + "entry", + "goto", + "function breakpoint", + "data breakpoint", + "instruction breakpoint", + ], + }, + "description": { + "type": "string", + "description": "The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and can be translated.", + }, + "threadId": {"type": "integer", "description": "The thread which was stopped."}, + "preserveFocusHint": { + "type": "boolean", + "description": "A value of True hints to the client that this event should not change the focus.", + }, + "text": { + "type": "string", + "description": "Additional information. E.g. if reason is `exception`, text contains the exception name. This string is shown in the UI.", + }, + "allThreadsStopped": { + "type": "boolean", + "description": "If `allThreadsStopped` is True, a debug adapter can announce that all threads have stopped.\n- The client should use this information to enable that all threads can be expanded to access their stacktraces.\n- If the attribute is missing or false, only the thread with the given `threadId` can be expanded.", + }, + "hitBreakpointIds": { + "type": "array", + "items": {"type": "integer"}, + "description": "Ids of the breakpoints that triggered the event. In most cases there is only a single breakpoint but here are some examples for multiple breakpoints:\n- Different types of breakpoints map to the same location.\n- Multiple source breakpoints get collapsed to the same instruction by the compiler/runtime.\n- Multiple function breakpoints with different function names map to the same location.", + }, + }, + "required": ["reason"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param StoppedEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "stopped" + if body is None: + self.body = StoppedEventBody() + else: + self.body = StoppedEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != StoppedEventBody else body + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("continued") +@register +class ContinuedEvent(BaseSchema): + """ + The event indicates that the execution of the debuggee has continued. + + Please note: a debug adapter is not expected to send this event in response to a request that + implies that execution continues, e.g. `launch` or `continue`. + + It is only necessary to send a `continued` event if there was no previous request that implied this. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["continued"]}, + "body": { + "type": "object", + "properties": { + "threadId": {"type": "integer", "description": "The thread which was continued."}, + "allThreadsContinued": { + "type": "boolean", + "description": "If `allThreadsContinued` is True, a debug adapter can announce that all threads have continued.", + }, + }, + "required": ["threadId"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param ContinuedEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "continued" + if body is None: + self.body = ContinuedEventBody() + else: + self.body = ( + ContinuedEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ContinuedEventBody else body + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("exited") +@register +class ExitedEvent(BaseSchema): + """ + The event indicates that the debuggee has exited and returns its exit code. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["exited"]}, + "body": { + "type": "object", + "properties": {"exitCode": {"type": "integer", "description": "The exit code returned from the debuggee."}}, + "required": ["exitCode"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param ExitedEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "exited" + if body is None: + self.body = ExitedEventBody() + else: + self.body = ExitedEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ExitedEventBody else body + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("terminated") +@register +class TerminatedEvent(BaseSchema): + """ + The event indicates that debugging of the debuggee has terminated. This does **not** mean that the + debuggee itself has exited. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["terminated"]}, + "body": { + "type": "object", + "properties": { + "restart": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "A debug adapter may set `restart` to True (or to an arbitrary object) to request that the client restarts the session.\nThe value is not interpreted by the client and passed unmodified as an attribute `__restart` to the `launch` and `attach` requests.", + } + }, + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param TerminatedEventBody body: + """ + self.type = "event" + self.event = "terminated" + self.seq = seq + if body is None: + self.body = TerminatedEventBody() + else: + self.body = ( + TerminatedEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != TerminatedEventBody else body + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + seq = self.seq + body = self.body + dct = { + "type": type, + "event": event, + "seq": seq, + } + if body is not None: + dct["body"] = body.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register_event("thread") +@register +class ThreadEvent(BaseSchema): + """ + The event indicates that a thread has started or exited. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["thread"]}, + "body": { + "type": "object", + "properties": { + "reason": {"type": "string", "description": "The reason for the event.", "_enum": ["started", "exited"]}, + "threadId": {"type": "integer", "description": "The identifier of the thread."}, + }, + "required": ["reason", "threadId"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param ThreadEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "thread" + if body is None: + self.body = ThreadEventBody() + else: + self.body = ThreadEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ThreadEventBody else body + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("output") +@register +class OutputEvent(BaseSchema): + """ + The event indicates that the target has produced some output. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["output"]}, + "body": { + "type": "object", + "properties": { + "category": { + "type": "string", + "description": "The output category. If not specified or if the category is not understood by the client, `console` is assumed.", + "_enum": ["console", "important", "stdout", "stderr", "telemetry"], + "enumDescriptions": [ + "Show the output in the client's default message UI, e.g. a 'debug console'. This category should only be used for informational output from the debugger (as opposed to the debuggee).", + "A hint for the client to show the output in the client's UI for important and highly visible information, e.g. as a popup notification. This category should only be used for important messages from the debugger (as opposed to the debuggee). Since this category value is a hint, clients might ignore the hint and assume the `console` category.", + "Show the output as normal program output from the debuggee.", + "Show the output as error program output from the debuggee.", + "Send the output to telemetry instead of showing it to the user.", + ], + }, + "output": {"type": "string", "description": "The output to report."}, + "group": { + "type": "string", + "description": "Support for keeping an output log organized by grouping related messages.", + "enum": ["start", "startCollapsed", "end"], + "enumDescriptions": [ + "Start a new group in expanded mode. Subsequent output events are members of the group and should be shown indented.\nThe `output` attribute becomes the name of the group and is not indented.", + "Start a new group in collapsed mode. Subsequent output events are members of the group and should be shown indented (as soon as the group is expanded).\nThe `output` attribute becomes the name of the group and is not indented.", + "End the current group and decrease the indentation of subsequent output events.\nA non-empty `output` attribute is shown as the unindented end of the group.", + ], + }, + "variablesReference": { + "type": "integer", + "description": "If an attribute `variablesReference` exists and its value is > 0, the output contains objects which can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "source": {"$ref": "#/definitions/Source", "description": "The source location where the output was produced."}, + "line": {"type": "integer", "description": "The source location's line where the output was produced."}, + "column": { + "type": "integer", + "description": "The position in `line` where the output was produced. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "data": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Additional data to report. For the `telemetry` category the data is sent to telemetry, for the other categories the data is shown in JSON format.", + }, + }, + "required": ["output"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param OutputEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "output" + if body is None: + self.body = OutputEventBody() + else: + self.body = OutputEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != OutputEventBody else body + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("breakpoint") +@register +class BreakpointEvent(BaseSchema): + """ + The event indicates that some information about a breakpoint has changed. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["breakpoint"]}, + "body": { + "type": "object", + "properties": { + "reason": {"type": "string", "description": "The reason for the event.", "_enum": ["changed", "new", "removed"]}, + "breakpoint": { + "$ref": "#/definitions/Breakpoint", + "description": "The `id` attribute is used to find the target breakpoint, the other attributes are used as the new values.", + }, + }, + "required": ["reason", "breakpoint"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param BreakpointEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "breakpoint" + if body is None: + self.body = BreakpointEventBody() + else: + self.body = ( + BreakpointEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != BreakpointEventBody else body + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("module") +@register +class ModuleEvent(BaseSchema): + """ + The event indicates that some information about a module has changed. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["module"]}, + "body": { + "type": "object", + "properties": { + "reason": {"type": "string", "description": "The reason for the event.", "enum": ["new", "changed", "removed"]}, + "module": { + "$ref": "#/definitions/Module", + "description": "The new, changed, or removed module. In case of `removed` only the module id is used.", + }, + }, + "required": ["reason", "module"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param ModuleEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "module" + if body is None: + self.body = ModuleEventBody() + else: + self.body = ModuleEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ModuleEventBody else body + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("loadedSource") +@register +class LoadedSourceEvent(BaseSchema): + """ + The event indicates that some source has been added, changed, or removed from the set of all loaded + sources. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["loadedSource"]}, + "body": { + "type": "object", + "properties": { + "reason": {"type": "string", "description": "The reason for the event.", "enum": ["new", "changed", "removed"]}, + "source": {"$ref": "#/definitions/Source", "description": "The new, changed, or removed source."}, + }, + "required": ["reason", "source"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param LoadedSourceEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "loadedSource" + if body is None: + self.body = LoadedSourceEventBody() + else: + self.body = ( + LoadedSourceEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != LoadedSourceEventBody else body + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("process") +@register +class ProcessEvent(BaseSchema): + """ + The event indicates that the debugger has begun debugging a new process. Either one that it has + launched, or one that it has attached to. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["process"]}, + "body": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The logical name of the process. This is usually the full path to process's executable file. Example: /home/example/myproj/program.js.", + }, + "systemProcessId": { + "type": "integer", + "description": "The system process id of the debugged process. This property is missing for non-system processes.", + }, + "isLocalProcess": { + "type": "boolean", + "description": "If True, the process is running on the same computer as the debug adapter.", + }, + "startMethod": { + "type": "string", + "enum": ["launch", "attach", "attachForSuspendedLaunch"], + "description": "Describes how the debug engine started debugging this process.", + "enumDescriptions": [ + "Process was launched under the debugger.", + "Debugger attached to an existing process.", + "A project launcher component has launched a new process in a suspended state and then asked the debugger to attach.", + ], + }, + "pointerSize": { + "type": "integer", + "description": "The size of a pointer or address for this process, in bits. This value may be used by clients when formatting addresses for display.", + }, + }, + "required": ["name"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param ProcessEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "process" + if body is None: + self.body = ProcessEventBody() + else: + self.body = ProcessEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ProcessEventBody else body + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("capabilities") +@register +class CapabilitiesEvent(BaseSchema): + """ + The event indicates that one or more capabilities have changed. + + Since the capabilities are dependent on the client and its UI, it might not be possible to change + that at random times (or too late). + + Consequently this event has a hint characteristic: a client can only be expected to make a 'best + effort' in honoring individual capabilities but there are no guarantees. + + Only changed capabilities need to be included, all other capabilities keep their values. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["capabilities"]}, + "body": { + "type": "object", + "properties": {"capabilities": {"$ref": "#/definitions/Capabilities", "description": "The set of updated capabilities."}}, + "required": ["capabilities"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param CapabilitiesEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "capabilities" + if body is None: + self.body = CapabilitiesEventBody() + else: + self.body = ( + CapabilitiesEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != CapabilitiesEventBody else body + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("progressStart") +@register +class ProgressStartEvent(BaseSchema): + """ + The event signals that a long running operation is about to start and provides additional + information for the client to set up a corresponding progress and cancellation UI. + + The client is free to delay the showing of the UI in order to reduce flicker. + + This event should only be sent if the corresponding capability `supportsProgressReporting` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["progressStart"]}, + "body": { + "type": "object", + "properties": { + "progressId": { + "type": "string", + "description": "An ID that can be used in subsequent `progressUpdate` and `progressEnd` events to make them refer to the same progress reporting.\nIDs must be unique within a debug session.", + }, + "title": { + "type": "string", + "description": "Short title of the progress reporting. Shown in the UI to describe the long running operation.", + }, + "requestId": { + "type": "integer", + "description": "The request ID that this progress report is related to. If specified a debug adapter is expected to emit progress events for the long running request until the request has been either completed or cancelled.\nIf the request ID is omitted, the progress report is assumed to be related to some general activity of the debug adapter.", + }, + "cancellable": { + "type": "boolean", + "description": "If True, the request that reports progress may be cancelled with a `cancel` request.\nSo this property basically controls whether the client should use UX that supports cancellation.\nClients that don't support cancellation are allowed to ignore the setting.", + }, + "message": {"type": "string", "description": "More detailed progress message."}, + "percentage": { + "type": "number", + "description": "Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown.", + }, + }, + "required": ["progressId", "title"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param ProgressStartEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "progressStart" + if body is None: + self.body = ProgressStartEventBody() + else: + self.body = ( + ProgressStartEventBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != ProgressStartEventBody + else body + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("progressUpdate") +@register +class ProgressUpdateEvent(BaseSchema): + """ + The event signals that the progress reporting needs to be updated with a new message and/or + percentage. + + The client does not have to update the UI immediately, but the clients needs to keep track of the + message and/or percentage values. + + This event should only be sent if the corresponding capability `supportsProgressReporting` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["progressUpdate"]}, + "body": { + "type": "object", + "properties": { + "progressId": {"type": "string", "description": "The ID that was introduced in the initial `progressStart` event."}, + "message": { + "type": "string", + "description": "More detailed progress message. If omitted, the previous message (if any) is used.", + }, + "percentage": { + "type": "number", + "description": "Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown.", + }, + }, + "required": ["progressId"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param ProgressUpdateEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "progressUpdate" + if body is None: + self.body = ProgressUpdateEventBody() + else: + self.body = ( + ProgressUpdateEventBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != ProgressUpdateEventBody + else body + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("progressEnd") +@register +class ProgressEndEvent(BaseSchema): + """ + The event signals the end of the progress reporting with a final message. + + This event should only be sent if the corresponding capability `supportsProgressReporting` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["progressEnd"]}, + "body": { + "type": "object", + "properties": { + "progressId": {"type": "string", "description": "The ID that was introduced in the initial `ProgressStartEvent`."}, + "message": { + "type": "string", + "description": "More detailed progress message. If omitted, the previous message (if any) is used.", + }, + }, + "required": ["progressId"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param ProgressEndEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "progressEnd" + if body is None: + self.body = ProgressEndEventBody() + else: + self.body = ( + ProgressEndEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ProgressEndEventBody else body + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("invalidated") +@register +class InvalidatedEvent(BaseSchema): + """ + This event signals that some state in the debug adapter has changed and requires that the client + needs to re-render the data snapshot previously requested. + + Debug adapters do not have to emit this event for runtime changes like stopped or thread events + because in that case the client refetches the new state anyway. But the event can be used for + example to refresh the UI after rendering formatting has changed in the debug adapter. + + This event should only be sent if the corresponding capability `supportsInvalidatedEvent` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["invalidated"]}, + "body": { + "type": "object", + "properties": { + "areas": { + "type": "array", + "description": "Set of logical areas that got invalidated. This property has a hint characteristic: a client can only be expected to make a 'best effort' in honoring the areas but there are no guarantees. If this property is missing, empty, or if values are not understood, the client should assume a single value `all`.", + "items": {"$ref": "#/definitions/InvalidatedAreas"}, + }, + "threadId": { + "type": "integer", + "description": "If specified, the client only needs to refetch data related to this thread.", + }, + "stackFrameId": { + "type": "integer", + "description": "If specified, the client only needs to refetch data related to this stack frame (and the `threadId` is ignored).", + }, + }, + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param InvalidatedEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "invalidated" + if body is None: + self.body = InvalidatedEventBody() + else: + self.body = ( + InvalidatedEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != InvalidatedEventBody else body + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_event("memory") +@register +class MemoryEvent(BaseSchema): + """ + This event indicates that some memory range has been updated. It should only be sent if the + corresponding capability `supportsMemoryEvent` is true. + + Clients typically react to the event by re-issuing a `readMemory` request if they show the memory + identified by the `memoryReference` and if the updated memory range overlaps the displayed range. + Clients should not make assumptions how individual memory references relate to each other, so they + should not assume that they are part of a single continuous address range and might overlap. + + Debug adapters can use this event to indicate that the contents of a memory range has changed due to + some other request like `setVariable` or `setExpression`. Debug adapters are not expected to emit + this event for each and every memory change of a running program, because that information is + typically not available from debuggers and it would flood clients with too many events. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["memory"]}, + "body": { + "type": "object", + "properties": { + "memoryReference": {"type": "string", "description": "Memory reference of a memory range that has been updated."}, + "offset": {"type": "integer", "description": "Starting offset in bytes where memory has been updated. Can be negative."}, + "count": {"type": "integer", "description": "Number of bytes updated."}, + }, + "required": ["memoryReference", "offset", "count"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, body, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param MemoryEventBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "event" + self.event = "memory" + if body is None: + self.body = MemoryEventBody() + else: + self.body = MemoryEventBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != MemoryEventBody else body + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + body = self.body + seq = self.seq + dct = { + "type": type, + "event": event, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register_request("runInTerminal") +@register +class RunInTerminalRequest(BaseSchema): + """ + This request is sent from the debug adapter to the client to run a command in a terminal. + + This is typically used to launch the debuggee in a terminal provided by the client. + + This request should only be called if the corresponding client capability + `supportsRunInTerminalRequest` is true. + + Client implementations of `runInTerminal` are free to run the command however they choose including + issuing the command to a command line interpreter (aka 'shell'). Argument strings passed to the + `runInTerminal` request must arrive verbatim in the command to be run. As a consequence, clients + which use a shell are responsible for escaping any special shell characters in the argument strings + to prevent them from being interpreted (and modified) by the shell. + + Some users may wish to take advantage of shell processing in the argument strings. For clients which + implement `runInTerminal` using an intermediary shell, the `argsCanBeInterpretedByShell` property + can be set to true. In this case the client is requested not to escape any special shell characters + in the argument strings. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["runInTerminal"]}, + "arguments": {"type": "RunInTerminalRequestArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param RunInTerminalRequestArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "runInTerminal" + if arguments is None: + self.arguments = RunInTerminalRequestArguments() + else: + self.arguments = ( + RunInTerminalRequestArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != RunInTerminalRequestArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class RunInTerminalRequestArguments(BaseSchema): + """ + Arguments for `runInTerminal` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "kind": { + "type": "string", + "enum": ["integrated", "external"], + "description": "What kind of terminal to launch. Defaults to `integrated` if not specified.", + }, + "title": {"type": "string", "description": "Title of the terminal."}, + "cwd": { + "type": "string", + "description": "Working directory for the command. For non-empty, valid paths this typically results in execution of a change directory command.", + }, + "args": { + "type": "array", + "items": {"type": "string"}, + "description": "List of arguments. The first argument is the command to run.", + }, + "env": { + "type": "object", + "description": "Environment key-value pairs that are added to or removed from the default environment.", + "additionalProperties": { + "type": ["string", "null"], + "description": "A string is a proper value for an environment variable. The value `null` removes the variable from the environment.", + }, + }, + "argsCanBeInterpretedByShell": { + "type": "boolean", + "description": "This property should only be set if the corresponding capability `supportsArgsCanBeInterpretedByShell` is True. If the client uses an intermediary shell to launch the application, then the client must not attempt to escape characters with special meanings for the shell. The user is fully responsible for escaping as needed and that arguments using special characters may not be portable across shells.", + }, + } + __refs__ = set(["env"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, cwd, args, kind=None, title=None, env=None, argsCanBeInterpretedByShell=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string cwd: Working directory for the command. For non-empty, valid paths this typically results in execution of a change directory command. + :param array args: List of arguments. The first argument is the command to run. + :param string kind: What kind of terminal to launch. Defaults to `integrated` if not specified. + :param string title: Title of the terminal. + :param RunInTerminalRequestArgumentsEnv env: Environment key-value pairs that are added to or removed from the default environment. + :param boolean argsCanBeInterpretedByShell: This property should only be set if the corresponding capability `supportsArgsCanBeInterpretedByShell` is true. If the client uses an intermediary shell to launch the application, then the client must not attempt to escape characters with special meanings for the shell. The user is fully responsible for escaping as needed and that arguments using special characters may not be portable across shells. + """ + self.cwd = cwd + self.args = args + self.kind = kind + self.title = title + if env is None: + self.env = RunInTerminalRequestArgumentsEnv() + else: + self.env = ( + RunInTerminalRequestArgumentsEnv(update_ids_from_dap=update_ids_from_dap, **env) + if env.__class__ != RunInTerminalRequestArgumentsEnv + else env + ) + self.argsCanBeInterpretedByShell = argsCanBeInterpretedByShell + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + cwd = self.cwd + args = self.args + if args and hasattr(args[0], "to_dict"): + args = [x.to_dict() for x in args] + kind = self.kind + title = self.title + env = self.env + argsCanBeInterpretedByShell = self.argsCanBeInterpretedByShell + dct = { + "cwd": cwd, + "args": args, + } + if kind is not None: + dct["kind"] = kind + if title is not None: + dct["title"] = title + if env is not None: + dct["env"] = env.to_dict(update_ids_to_dap=update_ids_to_dap) + if argsCanBeInterpretedByShell is not None: + dct["argsCanBeInterpretedByShell"] = argsCanBeInterpretedByShell + dct.update(self.kwargs) + return dct + + +@register_response("runInTerminal") +@register +class RunInTerminalResponse(BaseSchema): + """ + Response to `runInTerminal` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "processId": { + "type": "integer", + "description": "The process ID. The value should be less than or equal to 2147483647 (2^31-1).", + }, + "shellProcessId": { + "type": "integer", + "description": "The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1).", + }, + }, + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param RunInTerminalResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = RunInTerminalResponseBody() + else: + self.body = ( + RunInTerminalResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != RunInTerminalResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("startDebugging") +@register +class StartDebuggingRequest(BaseSchema): + """ + This request is sent from the debug adapter to the client to start a new debug session of the same + type as the caller. + + This request should only be sent if the corresponding client capability + `supportsStartDebuggingRequest` is true. + + A client implementation of `startDebugging` should start a new debug session (of the same type as + the caller) in the same way that the caller's session was started. If the client supports + hierarchical debug sessions, the newly created session can be treated as a child of the caller + session. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["startDebugging"]}, + "arguments": {"type": "StartDebuggingRequestArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param StartDebuggingRequestArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "startDebugging" + if arguments is None: + self.arguments = StartDebuggingRequestArguments() + else: + self.arguments = ( + StartDebuggingRequestArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != StartDebuggingRequestArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class StartDebuggingRequestArguments(BaseSchema): + """ + Arguments for `startDebugging` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "configuration": { + "type": "object", + "additionalProperties": True, + "description": "Arguments passed to the new debug session. The arguments must only contain properties understood by the `launch` or `attach` requests of the debug adapter and they must not contain any client-specific properties (e.g. `type`) or client-specific features (e.g. substitutable 'variables').", + }, + "request": { + "type": "string", + "enum": ["launch", "attach"], + "description": "Indicates whether the new debug session should be started with a `launch` or `attach` request.", + }, + } + __refs__ = set(["configuration"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, configuration, request, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param StartDebuggingRequestArgumentsConfiguration configuration: Arguments passed to the new debug session. The arguments must only contain properties understood by the `launch` or `attach` requests of the debug adapter and they must not contain any client-specific properties (e.g. `type`) or client-specific features (e.g. substitutable 'variables'). + :param string request: Indicates whether the new debug session should be started with a `launch` or `attach` request. + """ + if configuration is None: + self.configuration = StartDebuggingRequestArgumentsConfiguration() + else: + self.configuration = ( + StartDebuggingRequestArgumentsConfiguration(update_ids_from_dap=update_ids_from_dap, **configuration) + if configuration.__class__ != StartDebuggingRequestArgumentsConfiguration + else configuration + ) + self.request = request + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + configuration = self.configuration + request = self.request + dct = { + "configuration": configuration.to_dict(update_ids_to_dap=update_ids_to_dap), + "request": request, + } + dct.update(self.kwargs) + return dct + + +@register_response("startDebugging") +@register +class StartDebuggingResponse(BaseSchema): + """ + Response to `startDebugging` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("initialize") +@register +class InitializeRequest(BaseSchema): + """ + The `initialize` request is sent as the first request from the client to the debug adapter in order + to configure it with client capabilities and to retrieve capabilities from the debug adapter. + + Until the debug adapter has responded with an `initialize` response, the client must not send any + additional requests or events to the debug adapter. + + In addition the debug adapter is not allowed to send any requests or events to the client until it + has responded with an `initialize` response. + + The `initialize` request may only be sent once. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["initialize"]}, + "arguments": {"type": "InitializeRequestArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param InitializeRequestArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "initialize" + if arguments is None: + self.arguments = InitializeRequestArguments() + else: + self.arguments = ( + InitializeRequestArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != InitializeRequestArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class InitializeRequestArguments(BaseSchema): + """ + Arguments for `initialize` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "clientID": {"type": "string", "description": "The ID of the client using this adapter."}, + "clientName": {"type": "string", "description": "The human-readable name of the client using this adapter."}, + "adapterID": {"type": "string", "description": "The ID of the debug adapter."}, + "locale": {"type": "string", "description": "The ISO-639 locale of the client using this adapter, e.g. en-US or de-CH."}, + "linesStartAt1": {"type": "boolean", "description": "If True all line numbers are 1-based (default)."}, + "columnsStartAt1": {"type": "boolean", "description": "If True all column numbers are 1-based (default)."}, + "pathFormat": { + "type": "string", + "_enum": ["path", "uri"], + "description": "Determines in what format paths are specified. The default is `path`, which is the native format.", + }, + "supportsVariableType": {"type": "boolean", "description": "Client supports the `type` attribute for variables."}, + "supportsVariablePaging": {"type": "boolean", "description": "Client supports the paging of variables."}, + "supportsRunInTerminalRequest": {"type": "boolean", "description": "Client supports the `runInTerminal` request."}, + "supportsMemoryReferences": {"type": "boolean", "description": "Client supports memory references."}, + "supportsProgressReporting": {"type": "boolean", "description": "Client supports progress reporting."}, + "supportsInvalidatedEvent": {"type": "boolean", "description": "Client supports the `invalidated` event."}, + "supportsMemoryEvent": {"type": "boolean", "description": "Client supports the `memory` event."}, + "supportsArgsCanBeInterpretedByShell": { + "type": "boolean", + "description": "Client supports the `argsCanBeInterpretedByShell` attribute on the `runInTerminal` request.", + }, + "supportsStartDebuggingRequest": {"type": "boolean", "description": "Client supports the `startDebugging` request."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + adapterID, + clientID=None, + clientName=None, + locale=None, + linesStartAt1=None, + columnsStartAt1=None, + pathFormat=None, + supportsVariableType=None, + supportsVariablePaging=None, + supportsRunInTerminalRequest=None, + supportsMemoryReferences=None, + supportsProgressReporting=None, + supportsInvalidatedEvent=None, + supportsMemoryEvent=None, + supportsArgsCanBeInterpretedByShell=None, + supportsStartDebuggingRequest=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string adapterID: The ID of the debug adapter. + :param string clientID: The ID of the client using this adapter. + :param string clientName: The human-readable name of the client using this adapter. + :param string locale: The ISO-639 locale of the client using this adapter, e.g. en-US or de-CH. + :param boolean linesStartAt1: If true all line numbers are 1-based (default). + :param boolean columnsStartAt1: If true all column numbers are 1-based (default). + :param string pathFormat: Determines in what format paths are specified. The default is `path`, which is the native format. + :param boolean supportsVariableType: Client supports the `type` attribute for variables. + :param boolean supportsVariablePaging: Client supports the paging of variables. + :param boolean supportsRunInTerminalRequest: Client supports the `runInTerminal` request. + :param boolean supportsMemoryReferences: Client supports memory references. + :param boolean supportsProgressReporting: Client supports progress reporting. + :param boolean supportsInvalidatedEvent: Client supports the `invalidated` event. + :param boolean supportsMemoryEvent: Client supports the `memory` event. + :param boolean supportsArgsCanBeInterpretedByShell: Client supports the `argsCanBeInterpretedByShell` attribute on the `runInTerminal` request. + :param boolean supportsStartDebuggingRequest: Client supports the `startDebugging` request. + """ + self.adapterID = adapterID + self.clientID = clientID + self.clientName = clientName + self.locale = locale + self.linesStartAt1 = linesStartAt1 + self.columnsStartAt1 = columnsStartAt1 + self.pathFormat = pathFormat + self.supportsVariableType = supportsVariableType + self.supportsVariablePaging = supportsVariablePaging + self.supportsRunInTerminalRequest = supportsRunInTerminalRequest + self.supportsMemoryReferences = supportsMemoryReferences + self.supportsProgressReporting = supportsProgressReporting + self.supportsInvalidatedEvent = supportsInvalidatedEvent + self.supportsMemoryEvent = supportsMemoryEvent + self.supportsArgsCanBeInterpretedByShell = supportsArgsCanBeInterpretedByShell + self.supportsStartDebuggingRequest = supportsStartDebuggingRequest + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + adapterID = self.adapterID + clientID = self.clientID + clientName = self.clientName + locale = self.locale + linesStartAt1 = self.linesStartAt1 + columnsStartAt1 = self.columnsStartAt1 + pathFormat = self.pathFormat + supportsVariableType = self.supportsVariableType + supportsVariablePaging = self.supportsVariablePaging + supportsRunInTerminalRequest = self.supportsRunInTerminalRequest + supportsMemoryReferences = self.supportsMemoryReferences + supportsProgressReporting = self.supportsProgressReporting + supportsInvalidatedEvent = self.supportsInvalidatedEvent + supportsMemoryEvent = self.supportsMemoryEvent + supportsArgsCanBeInterpretedByShell = self.supportsArgsCanBeInterpretedByShell + supportsStartDebuggingRequest = self.supportsStartDebuggingRequest + dct = { + "adapterID": adapterID, + } + if clientID is not None: + dct["clientID"] = clientID + if clientName is not None: + dct["clientName"] = clientName + if locale is not None: + dct["locale"] = locale + if linesStartAt1 is not None: + dct["linesStartAt1"] = linesStartAt1 + if columnsStartAt1 is not None: + dct["columnsStartAt1"] = columnsStartAt1 + if pathFormat is not None: + dct["pathFormat"] = pathFormat + if supportsVariableType is not None: + dct["supportsVariableType"] = supportsVariableType + if supportsVariablePaging is not None: + dct["supportsVariablePaging"] = supportsVariablePaging + if supportsRunInTerminalRequest is not None: + dct["supportsRunInTerminalRequest"] = supportsRunInTerminalRequest + if supportsMemoryReferences is not None: + dct["supportsMemoryReferences"] = supportsMemoryReferences + if supportsProgressReporting is not None: + dct["supportsProgressReporting"] = supportsProgressReporting + if supportsInvalidatedEvent is not None: + dct["supportsInvalidatedEvent"] = supportsInvalidatedEvent + if supportsMemoryEvent is not None: + dct["supportsMemoryEvent"] = supportsMemoryEvent + if supportsArgsCanBeInterpretedByShell is not None: + dct["supportsArgsCanBeInterpretedByShell"] = supportsArgsCanBeInterpretedByShell + if supportsStartDebuggingRequest is not None: + dct["supportsStartDebuggingRequest"] = supportsStartDebuggingRequest + dct.update(self.kwargs) + return dct + + +@register_response("initialize") +@register +class InitializeResponse(BaseSchema): + """ + Response to `initialize` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": {"description": "The capabilities of this debug adapter.", "type": "Capabilities"}, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param Capabilities body: The capabilities of this debug adapter. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + if body is None: + self.body = Capabilities() + else: + self.body = Capabilities(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != Capabilities else body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register_request("configurationDone") +@register +class ConfigurationDoneRequest(BaseSchema): + """ + This request indicates that the client has finished initialization of the debug adapter. + + So it is the last request in the sequence of configuration requests (which was started by the + `initialized` event). + + Clients should only call this request if the corresponding capability + `supportsConfigurationDoneRequest` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["configurationDone"]}, + "arguments": {"type": "ConfigurationDoneArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param ConfigurationDoneArguments arguments: + """ + self.type = "request" + self.command = "configurationDone" + self.seq = seq + if arguments is None: + self.arguments = ConfigurationDoneArguments() + else: + self.arguments = ( + ConfigurationDoneArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != ConfigurationDoneArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class ConfigurationDoneArguments(BaseSchema): + """ + Arguments for `configurationDone` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register_response("configurationDone") +@register +class ConfigurationDoneResponse(BaseSchema): + """ + Response to `configurationDone` request. This is just an acknowledgement, so no body field is + required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("launch") +@register +class LaunchRequest(BaseSchema): + """ + This launch request is sent from the client to the debug adapter to start the debuggee with or + without debugging (if `noDebug` is true). + + Since launching is debugger/runtime specific, the arguments for this request are not part of this + specification. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["launch"]}, + "arguments": {"type": "LaunchRequestArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param LaunchRequestArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "launch" + if arguments is None: + self.arguments = LaunchRequestArguments() + else: + self.arguments = ( + LaunchRequestArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != LaunchRequestArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class LaunchRequestArguments(BaseSchema): + """ + Arguments for `launch` request. Additional attributes are implementation specific. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "noDebug": {"type": "boolean", "description": "If True, the launch request should launch the program without enabling debugging."}, + "__restart": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Arbitrary data from the previous, restarted session.\nThe data is sent as the `restart` attribute of the `terminated` event.\nThe client should leave the data intact.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, noDebug=None, __restart=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param boolean noDebug: If true, the launch request should launch the program without enabling debugging. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] __restart: Arbitrary data from the previous, restarted session. + The data is sent as the `restart` attribute of the `terminated` event. + The client should leave the data intact. + """ + self.noDebug = noDebug + self.__restart = __restart + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + noDebug = self.noDebug + __restart = self.__restart + dct = {} + if noDebug is not None: + dct["noDebug"] = noDebug + if __restart is not None: + dct["__restart"] = __restart + dct.update(self.kwargs) + return dct + + +@register_response("launch") +@register +class LaunchResponse(BaseSchema): + """ + Response to `launch` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("attach") +@register +class AttachRequest(BaseSchema): + """ + The `attach` request is sent from the client to the debug adapter to attach to a debuggee that is + already running. + + Since attaching is debugger/runtime specific, the arguments for this request are not part of this + specification. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["attach"]}, + "arguments": {"type": "AttachRequestArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param AttachRequestArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "attach" + if arguments is None: + self.arguments = AttachRequestArguments() + else: + self.arguments = ( + AttachRequestArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != AttachRequestArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class AttachRequestArguments(BaseSchema): + """ + Arguments for `attach` request. Additional attributes are implementation specific. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "__restart": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Arbitrary data from the previous, restarted session.\nThe data is sent as the `restart` attribute of the `terminated` event.\nThe client should leave the data intact.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, __restart=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] __restart: Arbitrary data from the previous, restarted session. + The data is sent as the `restart` attribute of the `terminated` event. + The client should leave the data intact. + """ + self.__restart = __restart + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + __restart = self.__restart + dct = {} + if __restart is not None: + dct["__restart"] = __restart + dct.update(self.kwargs) + return dct + + +@register_response("attach") +@register +class AttachResponse(BaseSchema): + """ + Response to `attach` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("restart") +@register +class RestartRequest(BaseSchema): + """ + Restarts a debug session. Clients should only call this request if the corresponding capability + `supportsRestartRequest` is true. + + If the capability is missing or has the value false, a typical client emulates `restart` by + terminating the debug adapter first and then launching it anew. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["restart"]}, + "arguments": {"type": "RestartArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param RestartArguments arguments: + """ + self.type = "request" + self.command = "restart" + self.seq = seq + if arguments is None: + self.arguments = RestartArguments() + else: + self.arguments = ( + RestartArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != RestartArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class RestartArguments(BaseSchema): + """ + Arguments for `restart` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "arguments": { + "oneOf": [{"$ref": "#/definitions/LaunchRequestArguments"}, {"$ref": "#/definitions/AttachRequestArguments"}], + "description": "The latest version of the `launch` or `attach` configuration.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param TypeNA arguments: The latest version of the `launch` or `attach` configuration. + """ + self.arguments = arguments + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + arguments = self.arguments + dct = {} + if arguments is not None: + dct["arguments"] = arguments + dct.update(self.kwargs) + return dct + + +@register_response("restart") +@register +class RestartResponse(BaseSchema): + """ + Response to `restart` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("disconnect") +@register +class DisconnectRequest(BaseSchema): + """ + The `disconnect` request asks the debug adapter to disconnect from the debuggee (thus ending the + debug session) and then to shut down itself (the debug adapter). + + In addition, the debug adapter must terminate the debuggee if it was started with the `launch` + request. If an `attach` request was used to connect to the debuggee, then the debug adapter must not + terminate the debuggee. + + This implicit behavior of when to terminate the debuggee can be overridden with the + `terminateDebuggee` argument (which is only supported by a debug adapter if the corresponding + capability `supportTerminateDebuggee` is true). + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["disconnect"]}, + "arguments": {"type": "DisconnectArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param DisconnectArguments arguments: + """ + self.type = "request" + self.command = "disconnect" + self.seq = seq + if arguments is None: + self.arguments = DisconnectArguments() + else: + self.arguments = ( + DisconnectArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != DisconnectArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class DisconnectArguments(BaseSchema): + """ + Arguments for `disconnect` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "restart": { + "type": "boolean", + "description": "A value of True indicates that this `disconnect` request is part of a restart sequence.", + }, + "terminateDebuggee": { + "type": "boolean", + "description": "Indicates whether the debuggee should be terminated when the debugger is disconnected.\nIf unspecified, the debug adapter is free to do whatever it thinks is best.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportTerminateDebuggee` is True.", + }, + "suspendDebuggee": { + "type": "boolean", + "description": "Indicates whether the debuggee should stay suspended when the debugger is disconnected.\nIf unspecified, the debuggee should resume execution.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportSuspendDebuggee` is True.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, restart=None, terminateDebuggee=None, suspendDebuggee=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param boolean restart: A value of true indicates that this `disconnect` request is part of a restart sequence. + :param boolean terminateDebuggee: Indicates whether the debuggee should be terminated when the debugger is disconnected. + If unspecified, the debug adapter is free to do whatever it thinks is best. + The attribute is only honored by a debug adapter if the corresponding capability `supportTerminateDebuggee` is true. + :param boolean suspendDebuggee: Indicates whether the debuggee should stay suspended when the debugger is disconnected. + If unspecified, the debuggee should resume execution. + The attribute is only honored by a debug adapter if the corresponding capability `supportSuspendDebuggee` is true. + """ + self.restart = restart + self.terminateDebuggee = terminateDebuggee + self.suspendDebuggee = suspendDebuggee + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + restart = self.restart + terminateDebuggee = self.terminateDebuggee + suspendDebuggee = self.suspendDebuggee + dct = {} + if restart is not None: + dct["restart"] = restart + if terminateDebuggee is not None: + dct["terminateDebuggee"] = terminateDebuggee + if suspendDebuggee is not None: + dct["suspendDebuggee"] = suspendDebuggee + dct.update(self.kwargs) + return dct + + +@register_response("disconnect") +@register +class DisconnectResponse(BaseSchema): + """ + Response to `disconnect` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("terminate") +@register +class TerminateRequest(BaseSchema): + """ + The `terminate` request is sent from the client to the debug adapter in order to shut down the + debuggee gracefully. Clients should only call this request if the capability + `supportsTerminateRequest` is true. + + Typically a debug adapter implements `terminate` by sending a software signal which the debuggee + intercepts in order to clean things up properly before terminating itself. + + Please note that this request does not directly affect the state of the debug session: if the + debuggee decides to veto the graceful shutdown for any reason by not terminating itself, then the + debug session just continues. + + Clients can surface the `terminate` request as an explicit command or they can integrate it into a + two stage Stop command that first sends `terminate` to request a graceful shutdown, and if that + fails uses `disconnect` for a forceful shutdown. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["terminate"]}, + "arguments": {"type": "TerminateArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param TerminateArguments arguments: + """ + self.type = "request" + self.command = "terminate" + self.seq = seq + if arguments is None: + self.arguments = TerminateArguments() + else: + self.arguments = ( + TerminateArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != TerminateArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class TerminateArguments(BaseSchema): + """ + Arguments for `terminate` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "restart": { + "type": "boolean", + "description": "A value of True indicates that this `terminate` request is part of a restart sequence.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, restart=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param boolean restart: A value of true indicates that this `terminate` request is part of a restart sequence. + """ + self.restart = restart + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + restart = self.restart + dct = {} + if restart is not None: + dct["restart"] = restart + dct.update(self.kwargs) + return dct + + +@register_response("terminate") +@register +class TerminateResponse(BaseSchema): + """ + Response to `terminate` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("breakpointLocations") +@register +class BreakpointLocationsRequest(BaseSchema): + """ + The `breakpointLocations` request returns all possible locations for source breakpoints in a given + range. + + Clients should only call this request if the corresponding capability + `supportsBreakpointLocationsRequest` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["breakpointLocations"]}, + "arguments": {"type": "BreakpointLocationsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param BreakpointLocationsArguments arguments: + """ + self.type = "request" + self.command = "breakpointLocations" + self.seq = seq + if arguments is None: + self.arguments = BreakpointLocationsArguments() + else: + self.arguments = ( + BreakpointLocationsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != BreakpointLocationsArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class BreakpointLocationsArguments(BaseSchema): + """ + Arguments for `breakpointLocations` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "source": { + "description": "The source location of the breakpoints; either `source.path` or `source.sourceReference` must be specified.", + "type": "Source", + }, + "line": { + "type": "integer", + "description": "Start line of range to search possible breakpoint locations in. If only the line is specified, the request returns all possible locations in that line.", + }, + "column": { + "type": "integer", + "description": "Start position within `line` to search possible breakpoint locations in. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no column is given, the first position in the start line is assumed.", + }, + "endLine": { + "type": "integer", + "description": "End line of range to search possible breakpoint locations in. If no end line is given, then the end line is assumed to be the start line.", + }, + "endColumn": { + "type": "integer", + "description": "End position within `endLine` to search possible breakpoint locations in. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no end column is given, the last position in the end line is assumed.", + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, source, line, column=None, endLine=None, endColumn=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param Source source: The source location of the breakpoints; either `source.path` or `source.sourceReference` must be specified. + :param integer line: Start line of range to search possible breakpoint locations in. If only the line is specified, the request returns all possible locations in that line. + :param integer column: Start position within `line` to search possible breakpoint locations in. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no column is given, the first position in the start line is assumed. + :param integer endLine: End line of range to search possible breakpoint locations in. If no end line is given, then the end line is assumed to be the start line. + :param integer endColumn: End position within `endLine` to search possible breakpoint locations in. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no end column is given, the last position in the end line is assumed. + """ + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.line = line + self.column = column + self.endLine = endLine + self.endColumn = endColumn + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + source = self.source + line = self.line + column = self.column + endLine = self.endLine + endColumn = self.endColumn + dct = { + "source": source.to_dict(update_ids_to_dap=update_ids_to_dap), + "line": line, + } + if column is not None: + dct["column"] = column + if endLine is not None: + dct["endLine"] = endLine + if endColumn is not None: + dct["endColumn"] = endColumn + dct.update(self.kwargs) + return dct + + +@register_response("breakpointLocations") +@register +class BreakpointLocationsResponse(BaseSchema): + """ + Response to `breakpointLocations` request. + + Contains possible locations for source breakpoints. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/BreakpointLocation"}, + "description": "Sorted set of possible breakpoint locations.", + } + }, + "required": ["breakpoints"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param BreakpointLocationsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = BreakpointLocationsResponseBody() + else: + self.body = ( + BreakpointLocationsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != BreakpointLocationsResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("setBreakpoints") +@register +class SetBreakpointsRequest(BaseSchema): + """ + Sets multiple breakpoints for a single source and clears all previous breakpoints in that source. + + To clear all breakpoint for a source, specify an empty array. + + When a breakpoint is hit, a `stopped` event (with reason `breakpoint`) is generated. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setBreakpoints"]}, + "arguments": {"type": "SetBreakpointsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetBreakpointsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setBreakpoints" + if arguments is None: + self.arguments = SetBreakpointsArguments() + else: + self.arguments = ( + SetBreakpointsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetBreakpointsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetBreakpointsArguments(BaseSchema): + """ + Arguments for `setBreakpoints` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "source": { + "description": "The source location of the breakpoints; either `source.path` or `source.sourceReference` must be specified.", + "type": "Source", + }, + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/SourceBreakpoint"}, + "description": "The code locations of the breakpoints.", + }, + "lines": {"type": "array", "items": {"type": "integer"}, "description": "Deprecated: The code locations of the breakpoints."}, + "sourceModified": { + "type": "boolean", + "description": "A value of True indicates that the underlying source has been modified which results in new breakpoint locations.", + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, source, breakpoints=None, lines=None, sourceModified=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param Source source: The source location of the breakpoints; either `source.path` or `source.sourceReference` must be specified. + :param array breakpoints: The code locations of the breakpoints. + :param array lines: Deprecated: The code locations of the breakpoints. + :param boolean sourceModified: A value of true indicates that the underlying source has been modified which results in new breakpoint locations. + """ + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + SourceBreakpoint.update_dict_ids_from_dap(o) + self.lines = lines + self.sourceModified = sourceModified + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + source = self.source + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + lines = self.lines + if lines and hasattr(lines[0], "to_dict"): + lines = [x.to_dict() for x in lines] + sourceModified = self.sourceModified + dct = { + "source": source.to_dict(update_ids_to_dap=update_ids_to_dap), + } + if breakpoints is not None: + dct["breakpoints"] = ( + [SourceBreakpoint.update_dict_ids_to_dap(o) for o in breakpoints] if (update_ids_to_dap and breakpoints) else breakpoints + ) + if lines is not None: + dct["lines"] = lines + if sourceModified is not None: + dct["sourceModified"] = sourceModified + dct.update(self.kwargs) + return dct + + +@register_response("setBreakpoints") +@register +class SetBreakpointsResponse(BaseSchema): + """ + Response to `setBreakpoints` request. + + Returned is information about each breakpoint created by this request. + + This includes the actual code location and whether the breakpoint could be verified. + + The breakpoints returned are in the same order as the elements of the `breakpoints` + + (or the deprecated `lines`) array in the arguments. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the breakpoints.\nThe array elements are in the same order as the elements of the `breakpoints` (or the deprecated `lines`) array in the arguments.", + } + }, + "required": ["breakpoints"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param SetBreakpointsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = SetBreakpointsResponseBody() + else: + self.body = ( + SetBreakpointsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != SetBreakpointsResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("setFunctionBreakpoints") +@register +class SetFunctionBreakpointsRequest(BaseSchema): + """ + Replaces all existing function breakpoints with new function breakpoints. + + To clear all function breakpoints, specify an empty array. + + When a function breakpoint is hit, a `stopped` event (with reason `function breakpoint`) is + generated. + + Clients should only call this request if the corresponding capability `supportsFunctionBreakpoints` + is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setFunctionBreakpoints"]}, + "arguments": {"type": "SetFunctionBreakpointsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetFunctionBreakpointsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setFunctionBreakpoints" + if arguments is None: + self.arguments = SetFunctionBreakpointsArguments() + else: + self.arguments = ( + SetFunctionBreakpointsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetFunctionBreakpointsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetFunctionBreakpointsArguments(BaseSchema): + """ + Arguments for `setFunctionBreakpoints` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/FunctionBreakpoint"}, + "description": "The function names of the breakpoints.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: The function names of the breakpoints. + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + FunctionBreakpoint.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = { + "breakpoints": [FunctionBreakpoint.update_dict_ids_to_dap(o) for o in breakpoints] + if (update_ids_to_dap and breakpoints) + else breakpoints, + } + dct.update(self.kwargs) + return dct + + +@register_response("setFunctionBreakpoints") +@register +class SetFunctionBreakpointsResponse(BaseSchema): + """ + Response to `setFunctionBreakpoints` request. + + Returned is information about each breakpoint created by this request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the breakpoints. The array elements correspond to the elements of the `breakpoints` array.", + } + }, + "required": ["breakpoints"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param SetFunctionBreakpointsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = SetFunctionBreakpointsResponseBody() + else: + self.body = ( + SetFunctionBreakpointsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != SetFunctionBreakpointsResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("setExceptionBreakpoints") +@register +class SetExceptionBreakpointsRequest(BaseSchema): + """ + The request configures the debugger's response to thrown exceptions. + + If an exception is configured to break, a `stopped` event is fired (with reason `exception`). + + Clients should only call this request if the corresponding capability `exceptionBreakpointFilters` + returns one or more filters. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setExceptionBreakpoints"]}, + "arguments": {"type": "SetExceptionBreakpointsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetExceptionBreakpointsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setExceptionBreakpoints" + if arguments is None: + self.arguments = SetExceptionBreakpointsArguments() + else: + self.arguments = ( + SetExceptionBreakpointsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetExceptionBreakpointsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetExceptionBreakpointsArguments(BaseSchema): + """ + Arguments for `setExceptionBreakpoints` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "filters": { + "type": "array", + "items": {"type": "string"}, + "description": "Set of exception filters specified by their ID. The set of all possible exception filters is defined by the `exceptionBreakpointFilters` capability. The `filter` and `filterOptions` sets are additive.", + }, + "filterOptions": { + "type": "array", + "items": {"$ref": "#/definitions/ExceptionFilterOptions"}, + "description": "Set of exception filters and their options. The set of all possible exception filters is defined by the `exceptionBreakpointFilters` capability. This attribute is only honored by a debug adapter if the corresponding capability `supportsExceptionFilterOptions` is True. The `filter` and `filterOptions` sets are additive.", + }, + "exceptionOptions": { + "type": "array", + "items": {"$ref": "#/definitions/ExceptionOptions"}, + "description": "Configuration options for selected exceptions.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsExceptionOptions` is True.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, filters, filterOptions=None, exceptionOptions=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array filters: Set of exception filters specified by their ID. The set of all possible exception filters is defined by the `exceptionBreakpointFilters` capability. The `filter` and `filterOptions` sets are additive. + :param array filterOptions: Set of exception filters and their options. The set of all possible exception filters is defined by the `exceptionBreakpointFilters` capability. This attribute is only honored by a debug adapter if the corresponding capability `supportsExceptionFilterOptions` is true. The `filter` and `filterOptions` sets are additive. + :param array exceptionOptions: Configuration options for selected exceptions. + The attribute is only honored by a debug adapter if the corresponding capability `supportsExceptionOptions` is true. + """ + self.filters = filters + self.filterOptions = filterOptions + if update_ids_from_dap and self.filterOptions: + for o in self.filterOptions: + ExceptionFilterOptions.update_dict_ids_from_dap(o) + self.exceptionOptions = exceptionOptions + if update_ids_from_dap and self.exceptionOptions: + for o in self.exceptionOptions: + ExceptionOptions.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + filters = self.filters + if filters and hasattr(filters[0], "to_dict"): + filters = [x.to_dict() for x in filters] + filterOptions = self.filterOptions + if filterOptions and hasattr(filterOptions[0], "to_dict"): + filterOptions = [x.to_dict() for x in filterOptions] + exceptionOptions = self.exceptionOptions + if exceptionOptions and hasattr(exceptionOptions[0], "to_dict"): + exceptionOptions = [x.to_dict() for x in exceptionOptions] + dct = { + "filters": filters, + } + if filterOptions is not None: + dct["filterOptions"] = ( + [ExceptionFilterOptions.update_dict_ids_to_dap(o) for o in filterOptions] + if (update_ids_to_dap and filterOptions) + else filterOptions + ) + if exceptionOptions is not None: + dct["exceptionOptions"] = ( + [ExceptionOptions.update_dict_ids_to_dap(o) for o in exceptionOptions] + if (update_ids_to_dap and exceptionOptions) + else exceptionOptions + ) + dct.update(self.kwargs) + return dct + + +@register_response("setExceptionBreakpoints") +@register +class SetExceptionBreakpointsResponse(BaseSchema): + """ + Response to `setExceptionBreakpoints` request. + + The response contains an array of `Breakpoint` objects with information about each exception + breakpoint or filter. The `Breakpoint` objects are in the same order as the elements of the + `filters`, `filterOptions`, `exceptionOptions` arrays given as arguments. If both `filters` and + `filterOptions` are given, the returned array must start with `filters` information first, followed + by `filterOptions` information. + + The `verified` property of a `Breakpoint` object signals whether the exception breakpoint or filter + could be successfully created and whether the condition is valid. In case of an error the `message` + property explains the problem. The `id` property can be used to introduce a unique ID for the + exception breakpoint or filter so that it can be updated subsequently by sending breakpoint events. + + For backward compatibility both the `breakpoints` array and the enclosing `body` are optional. If + these elements are missing a client is not able to show problems for individual exception + breakpoints or filters. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the exception breakpoints or filters.\nThe breakpoints returned are in the same order as the elements of the `filters`, `filterOptions`, `exceptionOptions` arrays in the arguments. If both `filters` and `filterOptions` are given, the returned array must start with `filters` information first, followed by `filterOptions` information.", + } + }, + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param SetExceptionBreakpointsResponseBody body: + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + if body is None: + self.body = SetExceptionBreakpointsResponseBody() + else: + self.body = ( + SetExceptionBreakpointsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != SetExceptionBreakpointsResponseBody + else body + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register_request("dataBreakpointInfo") +@register +class DataBreakpointInfoRequest(BaseSchema): + """ + Obtains information on a possible data breakpoint that could be set on an expression or variable. + + Clients should only call this request if the corresponding capability `supportsDataBreakpoints` is + true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["dataBreakpointInfo"]}, + "arguments": {"type": "DataBreakpointInfoArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param DataBreakpointInfoArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "dataBreakpointInfo" + if arguments is None: + self.arguments = DataBreakpointInfoArguments() + else: + self.arguments = ( + DataBreakpointInfoArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != DataBreakpointInfoArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class DataBreakpointInfoArguments(BaseSchema): + """ + Arguments for `dataBreakpointInfo` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "variablesReference": { + "type": "integer", + "description": "Reference to the variable container if the data breakpoint is requested for a child of the container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details.", + }, + "name": { + "type": "string", + "description": "The name of the variable's child to obtain data breakpoint information for.\nIf `variablesReference` isn't specified, this can be an expression.", + }, + "frameId": { + "type": "integer", + "description": "When `name` is an expression, evaluate it in the scope of this stack frame. If not specified, the expression is evaluated in the global scope. When `variablesReference` is specified, this property has no effect.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, name, variablesReference=None, frameId=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string name: The name of the variable's child to obtain data breakpoint information for. + If `variablesReference` isn't specified, this can be an expression. + :param integer variablesReference: Reference to the variable container if the data breakpoint is requested for a child of the container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details. + :param integer frameId: When `name` is an expression, evaluate it in the scope of this stack frame. If not specified, the expression is evaluated in the global scope. When `variablesReference` is specified, this property has no effect. + """ + self.name = name + self.variablesReference = variablesReference + self.frameId = frameId + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.frameId = self._translate_id_from_dap(self.frameId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + if "frameId" in dct: + dct["frameId"] = cls._translate_id_from_dap(dct["frameId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + name = self.name + variablesReference = self.variablesReference + frameId = self.frameId + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + if frameId is not None: + frameId = self._translate_id_to_dap(frameId) + dct = { + "name": name, + } + if variablesReference is not None: + dct["variablesReference"] = variablesReference + if frameId is not None: + dct["frameId"] = frameId + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + if "frameId" in dct: + dct["frameId"] = cls._translate_id_to_dap(dct["frameId"]) + return dct + + +@register_response("dataBreakpointInfo") +@register +class DataBreakpointInfoResponse(BaseSchema): + """ + Response to `dataBreakpointInfo` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "dataId": { + "type": ["string", "null"], + "description": "An identifier for the data on which a data breakpoint can be registered with the `setDataBreakpoints` request or null if no data breakpoint is available. If a `variablesReference` or `frameId` is passed, the `dataId` is valid in the current suspended state, otherwise it's valid indefinitely. See 'Lifetime of Object References' in the Overview section for details. Breakpoints set using the `dataId` in the `setDataBreakpoints` request may outlive the lifetime of the associated `dataId`.", + }, + "description": { + "type": "string", + "description": "UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available.", + }, + "accessTypes": { + "type": "array", + "items": {"$ref": "#/definitions/DataBreakpointAccessType"}, + "description": "Attribute lists the available access types for a potential data breakpoint. A UI client could surface this information.", + }, + "canPersist": { + "type": "boolean", + "description": "Attribute indicates that a potential data breakpoint could be persisted across sessions.", + }, + }, + "required": ["dataId", "description"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param DataBreakpointInfoResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = DataBreakpointInfoResponseBody() + else: + self.body = ( + DataBreakpointInfoResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != DataBreakpointInfoResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("setDataBreakpoints") +@register +class SetDataBreakpointsRequest(BaseSchema): + """ + Replaces all existing data breakpoints with new data breakpoints. + + To clear all data breakpoints, specify an empty array. + + When a data breakpoint is hit, a `stopped` event (with reason `data breakpoint`) is generated. + + Clients should only call this request if the corresponding capability `supportsDataBreakpoints` is + true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setDataBreakpoints"]}, + "arguments": {"type": "SetDataBreakpointsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetDataBreakpointsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setDataBreakpoints" + if arguments is None: + self.arguments = SetDataBreakpointsArguments() + else: + self.arguments = ( + SetDataBreakpointsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetDataBreakpointsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetDataBreakpointsArguments(BaseSchema): + """ + Arguments for `setDataBreakpoints` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/DataBreakpoint"}, + "description": "The contents of this array replaces all existing data breakpoints. An empty array clears all data breakpoints.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: The contents of this array replaces all existing data breakpoints. An empty array clears all data breakpoints. + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + DataBreakpoint.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = { + "breakpoints": [DataBreakpoint.update_dict_ids_to_dap(o) for o in breakpoints] + if (update_ids_to_dap and breakpoints) + else breakpoints, + } + dct.update(self.kwargs) + return dct + + +@register_response("setDataBreakpoints") +@register +class SetDataBreakpointsResponse(BaseSchema): + """ + Response to `setDataBreakpoints` request. + + Returned is information about each breakpoint created by this request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the data breakpoints. The array elements correspond to the elements of the input argument `breakpoints` array.", + } + }, + "required": ["breakpoints"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param SetDataBreakpointsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = SetDataBreakpointsResponseBody() + else: + self.body = ( + SetDataBreakpointsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != SetDataBreakpointsResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("setInstructionBreakpoints") +@register +class SetInstructionBreakpointsRequest(BaseSchema): + """ + Replaces all existing instruction breakpoints. Typically, instruction breakpoints would be set from + a disassembly window. + + To clear all instruction breakpoints, specify an empty array. + + When an instruction breakpoint is hit, a `stopped` event (with reason `instruction breakpoint`) is + generated. + + Clients should only call this request if the corresponding capability + `supportsInstructionBreakpoints` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setInstructionBreakpoints"]}, + "arguments": {"type": "SetInstructionBreakpointsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetInstructionBreakpointsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setInstructionBreakpoints" + if arguments is None: + self.arguments = SetInstructionBreakpointsArguments() + else: + self.arguments = ( + SetInstructionBreakpointsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetInstructionBreakpointsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetInstructionBreakpointsArguments(BaseSchema): + """ + Arguments for `setInstructionBreakpoints` request + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/InstructionBreakpoint"}, + "description": "The instruction references of the breakpoints", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: The instruction references of the breakpoints + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + InstructionBreakpoint.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = { + "breakpoints": [InstructionBreakpoint.update_dict_ids_to_dap(o) for o in breakpoints] + if (update_ids_to_dap and breakpoints) + else breakpoints, + } + dct.update(self.kwargs) + return dct + + +@register_response("setInstructionBreakpoints") +@register +class SetInstructionBreakpointsResponse(BaseSchema): + """ + Response to `setInstructionBreakpoints` request + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the breakpoints. The array elements correspond to the elements of the `breakpoints` array.", + } + }, + "required": ["breakpoints"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param SetInstructionBreakpointsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = SetInstructionBreakpointsResponseBody() + else: + self.body = ( + SetInstructionBreakpointsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != SetInstructionBreakpointsResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("continue") +@register +class ContinueRequest(BaseSchema): + """ + The request resumes execution of all threads. If the debug adapter supports single thread execution + (see capability `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to + true resumes only the specified thread. If not all threads were resumed, the `allThreadsContinued` + attribute of the response should be set to false. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["continue"]}, + "arguments": {"type": "ContinueArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param ContinueArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "continue" + if arguments is None: + self.arguments = ContinueArguments() + else: + self.arguments = ( + ContinueArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != ContinueArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class ContinueArguments(BaseSchema): + """ + Arguments for `continue` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": { + "type": "integer", + "description": "Specifies the active thread. If the debug adapter supports single thread execution (see `supportsSingleThreadExecutionRequests`) and the argument `singleThread` is True, only the thread with this ID is resumed.", + }, + "singleThread": { + "type": "boolean", + "description": "If this flag is True, execution is resumed only for the thread with given `threadId`.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, singleThread=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Specifies the active thread. If the debug adapter supports single thread execution (see `supportsSingleThreadExecutionRequests`) and the argument `singleThread` is true, only the thread with this ID is resumed. + :param boolean singleThread: If this flag is true, execution is resumed only for the thread with given `threadId`. + """ + self.threadId = threadId + self.singleThread = singleThread + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + singleThread = self.singleThread + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + if singleThread is not None: + dct["singleThread"] = singleThread + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("continue") +@register +class ContinueResponse(BaseSchema): + """ + Response to `continue` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "allThreadsContinued": { + "type": "boolean", + "description": "The value True (or a missing property) signals to the client that all threads have been resumed. The value false indicates that not all threads were resumed.", + } + }, + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param ContinueResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = ContinueResponseBody() + else: + self.body = ( + ContinueResponseBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ContinueResponseBody else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("next") +@register +class NextRequest(BaseSchema): + """ + The request executes one step (in the given granularity) for the specified thread and allows all + other threads to run freely by resuming them. + + If the debug adapter supports single thread execution (see capability + `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true prevents other + suspended threads from resuming. + + The debug adapter first sends the response and then a `stopped` event (with reason `step`) after the + step has completed. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["next"]}, + "arguments": {"type": "NextArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param NextArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "next" + if arguments is None: + self.arguments = NextArguments() + else: + self.arguments = ( + NextArguments(update_ids_from_dap=update_ids_from_dap, **arguments) if arguments.__class__ != NextArguments else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class NextArguments(BaseSchema): + """ + Arguments for `next` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": { + "type": "integer", + "description": "Specifies the thread for which to resume execution for one step (of the given granularity).", + }, + "singleThread": {"type": "boolean", "description": "If this flag is True, all other suspended threads are not resumed."}, + "granularity": { + "description": "Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed.", + "type": "SteppingGranularity", + }, + } + __refs__ = set(["granularity"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, singleThread=None, granularity=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Specifies the thread for which to resume execution for one step (of the given granularity). + :param boolean singleThread: If this flag is true, all other suspended threads are not resumed. + :param SteppingGranularity granularity: Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed. + """ + self.threadId = threadId + self.singleThread = singleThread + if granularity is not None: + assert granularity in SteppingGranularity.VALID_VALUES + self.granularity = granularity + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + singleThread = self.singleThread + granularity = self.granularity + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + if singleThread is not None: + dct["singleThread"] = singleThread + if granularity is not None: + dct["granularity"] = granularity + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("next") +@register +class NextResponse(BaseSchema): + """ + Response to `next` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("stepIn") +@register +class StepInRequest(BaseSchema): + """ + The request resumes the given thread to step into a function/method and allows all other threads to + run freely by resuming them. + + If the debug adapter supports single thread execution (see capability + `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true prevents other + suspended threads from resuming. + + If the request cannot step into a target, `stepIn` behaves like the `next` request. + + The debug adapter first sends the response and then a `stopped` event (with reason `step`) after the + step has completed. + + If there are multiple function/method calls (or other targets) on the source line, + + the argument `targetId` can be used to control into which target the `stepIn` should occur. + + The list of possible targets for a given source line can be retrieved via the `stepInTargets` + request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["stepIn"]}, + "arguments": {"type": "StepInArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param StepInArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "stepIn" + if arguments is None: + self.arguments = StepInArguments() + else: + self.arguments = ( + StepInArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != StepInArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class StepInArguments(BaseSchema): + """ + Arguments for `stepIn` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": { + "type": "integer", + "description": "Specifies the thread for which to resume execution for one step-into (of the given granularity).", + }, + "singleThread": {"type": "boolean", "description": "If this flag is True, all other suspended threads are not resumed."}, + "targetId": {"type": "integer", "description": "Id of the target to step into."}, + "granularity": { + "description": "Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed.", + "type": "SteppingGranularity", + }, + } + __refs__ = set(["granularity"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, singleThread=None, targetId=None, granularity=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Specifies the thread for which to resume execution for one step-into (of the given granularity). + :param boolean singleThread: If this flag is true, all other suspended threads are not resumed. + :param integer targetId: Id of the target to step into. + :param SteppingGranularity granularity: Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed. + """ + self.threadId = threadId + self.singleThread = singleThread + self.targetId = targetId + if granularity is not None: + assert granularity in SteppingGranularity.VALID_VALUES + self.granularity = granularity + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + singleThread = self.singleThread + targetId = self.targetId + granularity = self.granularity + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + if singleThread is not None: + dct["singleThread"] = singleThread + if targetId is not None: + dct["targetId"] = targetId + if granularity is not None: + dct["granularity"] = granularity + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("stepIn") +@register +class StepInResponse(BaseSchema): + """ + Response to `stepIn` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("stepOut") +@register +class StepOutRequest(BaseSchema): + """ + The request resumes the given thread to step out (return) from a function/method and allows all + other threads to run freely by resuming them. + + If the debug adapter supports single thread execution (see capability + `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true prevents other + suspended threads from resuming. + + The debug adapter first sends the response and then a `stopped` event (with reason `step`) after the + step has completed. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["stepOut"]}, + "arguments": {"type": "StepOutArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param StepOutArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "stepOut" + if arguments is None: + self.arguments = StepOutArguments() + else: + self.arguments = ( + StepOutArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != StepOutArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class StepOutArguments(BaseSchema): + """ + Arguments for `stepOut` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": { + "type": "integer", + "description": "Specifies the thread for which to resume execution for one step-out (of the given granularity).", + }, + "singleThread": {"type": "boolean", "description": "If this flag is True, all other suspended threads are not resumed."}, + "granularity": { + "description": "Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed.", + "type": "SteppingGranularity", + }, + } + __refs__ = set(["granularity"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, singleThread=None, granularity=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Specifies the thread for which to resume execution for one step-out (of the given granularity). + :param boolean singleThread: If this flag is true, all other suspended threads are not resumed. + :param SteppingGranularity granularity: Stepping granularity. If no granularity is specified, a granularity of `statement` is assumed. + """ + self.threadId = threadId + self.singleThread = singleThread + if granularity is not None: + assert granularity in SteppingGranularity.VALID_VALUES + self.granularity = granularity + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + singleThread = self.singleThread + granularity = self.granularity + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + if singleThread is not None: + dct["singleThread"] = singleThread + if granularity is not None: + dct["granularity"] = granularity + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("stepOut") +@register +class StepOutResponse(BaseSchema): + """ + Response to `stepOut` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("stepBack") +@register +class StepBackRequest(BaseSchema): + """ + The request executes one backward step (in the given granularity) for the specified thread and + allows all other threads to run backward freely by resuming them. + + If the debug adapter supports single thread execution (see capability + `supportsSingleThreadExecutionRequests`), setting the `singleThread` argument to true prevents other + suspended threads from resuming. + + The debug adapter first sends the response and then a `stopped` event (with reason `step`) after the + step has completed. + + Clients should only call this request if the corresponding capability `supportsStepBack` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["stepBack"]}, + "arguments": {"type": "StepBackArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param StepBackArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "stepBack" + if arguments is None: + self.arguments = StepBackArguments() + else: + self.arguments = ( + StepBackArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != StepBackArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class StepBackArguments(BaseSchema): + """ + Arguments for `stepBack` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": { + "type": "integer", + "description": "Specifies the thread for which to resume execution for one step backwards (of the given granularity).", + }, + "singleThread": {"type": "boolean", "description": "If this flag is True, all other suspended threads are not resumed."}, + "granularity": { + "description": "Stepping granularity to step. If no granularity is specified, a granularity of `statement` is assumed.", + "type": "SteppingGranularity", + }, + } + __refs__ = set(["granularity"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, singleThread=None, granularity=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Specifies the thread for which to resume execution for one step backwards (of the given granularity). + :param boolean singleThread: If this flag is true, all other suspended threads are not resumed. + :param SteppingGranularity granularity: Stepping granularity to step. If no granularity is specified, a granularity of `statement` is assumed. + """ + self.threadId = threadId + self.singleThread = singleThread + if granularity is not None: + assert granularity in SteppingGranularity.VALID_VALUES + self.granularity = granularity + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + singleThread = self.singleThread + granularity = self.granularity + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + if singleThread is not None: + dct["singleThread"] = singleThread + if granularity is not None: + dct["granularity"] = granularity + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("stepBack") +@register +class StepBackResponse(BaseSchema): + """ + Response to `stepBack` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("reverseContinue") +@register +class ReverseContinueRequest(BaseSchema): + """ + The request resumes backward execution of all threads. If the debug adapter supports single thread + execution (see capability `supportsSingleThreadExecutionRequests`), setting the `singleThread` + argument to true resumes only the specified thread. If not all threads were resumed, the + `allThreadsContinued` attribute of the response should be set to false. + + Clients should only call this request if the corresponding capability `supportsStepBack` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["reverseContinue"]}, + "arguments": {"type": "ReverseContinueArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param ReverseContinueArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "reverseContinue" + if arguments is None: + self.arguments = ReverseContinueArguments() + else: + self.arguments = ( + ReverseContinueArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != ReverseContinueArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class ReverseContinueArguments(BaseSchema): + """ + Arguments for `reverseContinue` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": { + "type": "integer", + "description": "Specifies the active thread. If the debug adapter supports single thread execution (see `supportsSingleThreadExecutionRequests`) and the `singleThread` argument is True, only the thread with this ID is resumed.", + }, + "singleThread": { + "type": "boolean", + "description": "If this flag is True, backward execution is resumed only for the thread with given `threadId`.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, singleThread=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Specifies the active thread. If the debug adapter supports single thread execution (see `supportsSingleThreadExecutionRequests`) and the `singleThread` argument is true, only the thread with this ID is resumed. + :param boolean singleThread: If this flag is true, backward execution is resumed only for the thread with given `threadId`. + """ + self.threadId = threadId + self.singleThread = singleThread + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + singleThread = self.singleThread + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + if singleThread is not None: + dct["singleThread"] = singleThread + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("reverseContinue") +@register +class ReverseContinueResponse(BaseSchema): + """ + Response to `reverseContinue` request. This is just an acknowledgement, so no body field is + required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("restartFrame") +@register +class RestartFrameRequest(BaseSchema): + """ + The request restarts execution of the specified stack frame. + + The debug adapter first sends the response and then a `stopped` event (with reason `restart`) after + the restart has completed. + + Clients should only call this request if the corresponding capability `supportsRestartFrame` is + true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["restartFrame"]}, + "arguments": {"type": "RestartFrameArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param RestartFrameArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "restartFrame" + if arguments is None: + self.arguments = RestartFrameArguments() + else: + self.arguments = ( + RestartFrameArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != RestartFrameArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class RestartFrameArguments(BaseSchema): + """ + Arguments for `restartFrame` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "frameId": { + "type": "integer", + "description": "Restart the stack frame identified by `frameId`. The `frameId` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, frameId, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer frameId: Restart the stack frame identified by `frameId`. The `frameId` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details. + """ + self.frameId = frameId + if update_ids_from_dap: + self.frameId = self._translate_id_from_dap(self.frameId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_from_dap(dct["frameId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + frameId = self.frameId + if update_ids_to_dap: + if frameId is not None: + frameId = self._translate_id_to_dap(frameId) + dct = { + "frameId": frameId, + } + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_to_dap(dct["frameId"]) + return dct + + +@register_response("restartFrame") +@register +class RestartFrameResponse(BaseSchema): + """ + Response to `restartFrame` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("goto") +@register +class GotoRequest(BaseSchema): + """ + The request sets the location where the debuggee will continue to run. + + This makes it possible to skip the execution of code or to execute code again. + + The code between the current location and the goto target is not executed but skipped. + + The debug adapter first sends the response and then a `stopped` event with reason `goto`. + + Clients should only call this request if the corresponding capability `supportsGotoTargetsRequest` + is true (because only then goto targets exist that can be passed as arguments). + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["goto"]}, + "arguments": {"type": "GotoArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param GotoArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "goto" + if arguments is None: + self.arguments = GotoArguments() + else: + self.arguments = ( + GotoArguments(update_ids_from_dap=update_ids_from_dap, **arguments) if arguments.__class__ != GotoArguments else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class GotoArguments(BaseSchema): + """ + Arguments for `goto` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": {"type": "integer", "description": "Set the goto target for this thread."}, + "targetId": {"type": "integer", "description": "The location where the debuggee will continue to run."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, targetId, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Set the goto target for this thread. + :param integer targetId: The location where the debuggee will continue to run. + """ + self.threadId = threadId + self.targetId = targetId + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + targetId = self.targetId + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + "targetId": targetId, + } + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("goto") +@register +class GotoResponse(BaseSchema): + """ + Response to `goto` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("pause") +@register +class PauseRequest(BaseSchema): + """ + The request suspends the debuggee. + + The debug adapter first sends the response and then a `stopped` event (with reason `pause`) after + the thread has been paused successfully. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["pause"]}, + "arguments": {"type": "PauseArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param PauseArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "pause" + if arguments is None: + self.arguments = PauseArguments() + else: + self.arguments = ( + PauseArguments(update_ids_from_dap=update_ids_from_dap, **arguments) if arguments.__class__ != PauseArguments else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class PauseArguments(BaseSchema): + """ + Arguments for `pause` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"threadId": {"type": "integer", "description": "Pause execution for this thread."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Pause execution for this thread. + """ + self.threadId = threadId + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("pause") +@register +class PauseResponse(BaseSchema): + """ + Response to `pause` request. This is just an acknowledgement, so no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("stackTrace") +@register +class StackTraceRequest(BaseSchema): + """ + The request returns a stacktrace from the current execution state of a given thread. + + A client can request all stack frames by omitting the startFrame and levels arguments. For + performance-conscious clients and if the corresponding capability `supportsDelayedStackTraceLoading` + is true, stack frames can be retrieved in a piecemeal way with the `startFrame` and `levels` + arguments. The response of the `stackTrace` request may contain a `totalFrames` property that hints + at the total number of frames in the stack. If a client needs this total number upfront, it can + issue a request for a single (first) frame and depending on the value of `totalFrames` decide how to + proceed. In any case a client should be prepared to receive fewer frames than requested, which is an + indication that the end of the stack has been reached. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["stackTrace"]}, + "arguments": {"type": "StackTraceArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param StackTraceArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "stackTrace" + if arguments is None: + self.arguments = StackTraceArguments() + else: + self.arguments = ( + StackTraceArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != StackTraceArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class StackTraceArguments(BaseSchema): + """ + Arguments for `stackTrace` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": {"type": "integer", "description": "Retrieve the stacktrace for this thread."}, + "startFrame": {"type": "integer", "description": "The index of the first frame to return; if omitted frames start at 0."}, + "levels": { + "type": "integer", + "description": "The maximum number of frames to return. If levels is not specified or 0, all frames are returned.", + }, + "format": { + "description": "Specifies details on how to format the stack frames.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is True.", + "type": "StackFrameFormat", + }, + } + __refs__ = set(["format"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, startFrame=None, levels=None, format=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Retrieve the stacktrace for this thread. + :param integer startFrame: The index of the first frame to return; if omitted frames start at 0. + :param integer levels: The maximum number of frames to return. If levels is not specified or 0, all frames are returned. + :param StackFrameFormat format: Specifies details on how to format the stack frames. + The attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is true. + """ + self.threadId = threadId + self.startFrame = startFrame + self.levels = levels + if format is None: + self.format = StackFrameFormat() + else: + self.format = ( + StackFrameFormat(update_ids_from_dap=update_ids_from_dap, **format) if format.__class__ != StackFrameFormat else format + ) + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + startFrame = self.startFrame + levels = self.levels + format = self.format # noqa (assign to builtin) + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + if startFrame is not None: + dct["startFrame"] = startFrame + if levels is not None: + dct["levels"] = levels + if format is not None: + dct["format"] = format.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("stackTrace") +@register +class StackTraceResponse(BaseSchema): + """ + Response to `stackTrace` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "stackFrames": { + "type": "array", + "items": {"$ref": "#/definitions/StackFrame"}, + "description": "The frames of the stack frame. If the array has length zero, there are no stack frames available.\nThis means that there is no location information available.", + }, + "totalFrames": { + "type": "integer", + "description": "The total number of frames available in the stack. If omitted or if `totalFrames` is larger than the available frames, a client is expected to request frames until a request returns less frames than requested (which indicates the end of the stack). Returning monotonically increasing `totalFrames` values for subsequent requests can be used to enforce paging in the client.", + }, + }, + "required": ["stackFrames"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param StackTraceResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = StackTraceResponseBody() + else: + self.body = ( + StackTraceResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != StackTraceResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("scopes") +@register +class ScopesRequest(BaseSchema): + """ + The request returns the variable scopes for a given stack frame ID. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["scopes"]}, + "arguments": {"type": "ScopesArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param ScopesArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "scopes" + if arguments is None: + self.arguments = ScopesArguments() + else: + self.arguments = ( + ScopesArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != ScopesArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class ScopesArguments(BaseSchema): + """ + Arguments for `scopes` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "frameId": { + "type": "integer", + "description": "Retrieve the scopes for the stack frame identified by `frameId`. The `frameId` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, frameId, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer frameId: Retrieve the scopes for the stack frame identified by `frameId`. The `frameId` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details. + """ + self.frameId = frameId + if update_ids_from_dap: + self.frameId = self._translate_id_from_dap(self.frameId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_from_dap(dct["frameId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + frameId = self.frameId + if update_ids_to_dap: + if frameId is not None: + frameId = self._translate_id_to_dap(frameId) + dct = { + "frameId": frameId, + } + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_to_dap(dct["frameId"]) + return dct + + +@register_response("scopes") +@register +class ScopesResponse(BaseSchema): + """ + Response to `scopes` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "scopes": { + "type": "array", + "items": {"$ref": "#/definitions/Scope"}, + "description": "The scopes of the stack frame. If the array has length zero, there are no scopes available.", + } + }, + "required": ["scopes"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param ScopesResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = ScopesResponseBody() + else: + self.body = ( + ScopesResponseBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ScopesResponseBody else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("variables") +@register +class VariablesRequest(BaseSchema): + """ + Retrieves all child variables for the given variable reference. + + A filter can be used to limit the fetched children to either named or indexed children. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["variables"]}, + "arguments": {"type": "VariablesArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param VariablesArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "variables" + if arguments is None: + self.arguments = VariablesArguments() + else: + self.arguments = ( + VariablesArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != VariablesArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class VariablesArguments(BaseSchema): + """ + Arguments for `variables` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "variablesReference": { + "type": "integer", + "description": "The variable for which to retrieve its children. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details.", + }, + "filter": { + "type": "string", + "enum": ["indexed", "named"], + "description": "Filter to limit the child variables to either named or indexed. If omitted, both types are fetched.", + }, + "start": { + "type": "integer", + "description": "The index of the first variable to return; if omitted children start at 0.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsVariablePaging` is True.", + }, + "count": { + "type": "integer", + "description": "The number of variables to return. If count is missing or 0, all variables are returned.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsVariablePaging` is True.", + }, + "format": { + "description": "Specifies details on how to format the Variable values.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is True.", + "type": "ValueFormat", + }, + } + __refs__ = set(["format"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, variablesReference, filter=None, start=None, count=None, format=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer variablesReference: The variable for which to retrieve its children. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details. + :param string filter: Filter to limit the child variables to either named or indexed. If omitted, both types are fetched. + :param integer start: The index of the first variable to return; if omitted children start at 0. + The attribute is only honored by a debug adapter if the corresponding capability `supportsVariablePaging` is true. + :param integer count: The number of variables to return. If count is missing or 0, all variables are returned. + The attribute is only honored by a debug adapter if the corresponding capability `supportsVariablePaging` is true. + :param ValueFormat format: Specifies details on how to format the Variable values. + The attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is true. + """ + self.variablesReference = variablesReference + self.filter = filter + self.start = start + self.count = count + if format is None: + self.format = ValueFormat() + else: + self.format = ValueFormat(update_ids_from_dap=update_ids_from_dap, **format) if format.__class__ != ValueFormat else format + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + variablesReference = self.variablesReference + filter = self.filter # noqa (assign to builtin) + start = self.start + count = self.count + format = self.format # noqa (assign to builtin) + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + dct = { + "variablesReference": variablesReference, + } + if filter is not None: + dct["filter"] = filter + if start is not None: + dct["start"] = start + if count is not None: + dct["count"] = count + if format is not None: + dct["format"] = format.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + return dct + + +@register_response("variables") +@register +class VariablesResponse(BaseSchema): + """ + Response to `variables` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "variables": { + "type": "array", + "items": {"$ref": "#/definitions/Variable"}, + "description": "All (or a range) of variables for the given variable reference.", + } + }, + "required": ["variables"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param VariablesResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = VariablesResponseBody() + else: + self.body = ( + VariablesResponseBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != VariablesResponseBody else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("setVariable") +@register +class SetVariableRequest(BaseSchema): + """ + Set the variable with the given name in the variable container to a new value. Clients should only + call this request if the corresponding capability `supportsSetVariable` is true. + + If a debug adapter implements both `setVariable` and `setExpression`, a client will only use + `setExpression` if the variable has an `evaluateName` property. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setVariable"]}, + "arguments": {"type": "SetVariableArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetVariableArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setVariable" + if arguments is None: + self.arguments = SetVariableArguments() + else: + self.arguments = ( + SetVariableArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetVariableArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetVariableArguments(BaseSchema): + """ + Arguments for `setVariable` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "variablesReference": { + "type": "integer", + "description": "The reference of the variable container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details.", + }, + "name": {"type": "string", "description": "The name of the variable in the container."}, + "value": {"type": "string", "description": "The value of the variable."}, + "format": {"description": "Specifies details on how to format the response value.", "type": "ValueFormat"}, + } + __refs__ = set(["format"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, variablesReference, name, value, format=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer variablesReference: The reference of the variable container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details. + :param string name: The name of the variable in the container. + :param string value: The value of the variable. + :param ValueFormat format: Specifies details on how to format the response value. + """ + self.variablesReference = variablesReference + self.name = name + self.value = value + if format is None: + self.format = ValueFormat() + else: + self.format = ValueFormat(update_ids_from_dap=update_ids_from_dap, **format) if format.__class__ != ValueFormat else format + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + variablesReference = self.variablesReference + name = self.name + value = self.value + format = self.format # noqa (assign to builtin) + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + dct = { + "variablesReference": variablesReference, + "name": name, + "value": value, + } + if format is not None: + dct["format"] = format.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + return dct + + +@register_response("setVariable") +@register +class SetVariableResponse(BaseSchema): + """ + Response to `setVariable` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "value": {"type": "string", "description": "The new value of the variable."}, + "type": { + "type": "string", + "description": "The type of the new value. Typically shown in the UI when hovering over the value.", + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the new value is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is True.", + }, + }, + "required": ["value"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param SetVariableResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = SetVariableResponseBody() + else: + self.body = ( + SetVariableResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != SetVariableResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("source") +@register +class SourceRequest(BaseSchema): + """ + The request retrieves the source code for a given source reference. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["source"]}, + "arguments": {"type": "SourceArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SourceArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "source" + if arguments is None: + self.arguments = SourceArguments() + else: + self.arguments = ( + SourceArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SourceArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SourceArguments(BaseSchema): + """ + Arguments for `source` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "source": { + "description": "Specifies the source content to load. Either `source.path` or `source.sourceReference` must be specified.", + "type": "Source", + }, + "sourceReference": { + "type": "integer", + "description": "The reference to the source. This is the same as `source.sourceReference`.\nThis is provided for backward compatibility since old clients do not understand the `source` attribute.", + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, sourceReference, source=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer sourceReference: The reference to the source. This is the same as `source.sourceReference`. + This is provided for backward compatibility since old clients do not understand the `source` attribute. + :param Source source: Specifies the source content to load. Either `source.path` or `source.sourceReference` must be specified. + """ + self.sourceReference = sourceReference + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + sourceReference = self.sourceReference + source = self.source + dct = { + "sourceReference": sourceReference, + } + if source is not None: + dct["source"] = source.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register_response("source") +@register +class SourceResponse(BaseSchema): + """ + Response to `source` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "content": {"type": "string", "description": "Content of the source reference."}, + "mimeType": {"type": "string", "description": "Content type (MIME type) of the source."}, + }, + "required": ["content"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param SourceResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = SourceResponseBody() + else: + self.body = ( + SourceResponseBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != SourceResponseBody else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("threads") +@register +class ThreadsRequest(BaseSchema): + """ + The request retrieves a list of all threads. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["threads"]}, + "arguments": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Object containing arguments for the command.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] arguments: Object containing arguments for the command. + """ + self.type = "request" + self.command = "threads" + self.seq = seq + self.arguments = arguments + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments + dct.update(self.kwargs) + return dct + + +@register_response("threads") +@register +class ThreadsResponse(BaseSchema): + """ + Response to `threads` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": {"threads": {"type": "array", "items": {"$ref": "#/definitions/Thread"}, "description": "All threads."}}, + "required": ["threads"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param ThreadsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = ThreadsResponseBody() + else: + self.body = ( + ThreadsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ThreadsResponseBody else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("terminateThreads") +@register +class TerminateThreadsRequest(BaseSchema): + """ + The request terminates the threads with the given ids. + + Clients should only call this request if the corresponding capability + `supportsTerminateThreadsRequest` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["terminateThreads"]}, + "arguments": {"type": "TerminateThreadsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param TerminateThreadsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "terminateThreads" + if arguments is None: + self.arguments = TerminateThreadsArguments() + else: + self.arguments = ( + TerminateThreadsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != TerminateThreadsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class TerminateThreadsArguments(BaseSchema): + """ + Arguments for `terminateThreads` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"threadIds": {"type": "array", "items": {"type": "integer"}, "description": "Ids of threads to be terminated."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadIds=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array threadIds: Ids of threads to be terminated. + """ + self.threadIds = threadIds + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadIds = self.threadIds + if threadIds and hasattr(threadIds[0], "to_dict"): + threadIds = [x.to_dict() for x in threadIds] + dct = {} + if threadIds is not None: + dct["threadIds"] = threadIds + dct.update(self.kwargs) + return dct + + +@register_response("terminateThreads") +@register +class TerminateThreadsResponse(BaseSchema): + """ + Response to `terminateThreads` request. This is just an acknowledgement, no body field is required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("modules") +@register +class ModulesRequest(BaseSchema): + """ + Modules can be retrieved from the debug adapter with this request which can either return all + modules or a range of modules to support paging. + + Clients should only call this request if the corresponding capability `supportsModulesRequest` is + true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["modules"]}, + "arguments": {"type": "ModulesArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param ModulesArguments arguments: + """ + self.type = "request" + self.command = "modules" + self.seq = seq + if arguments is None: + self.arguments = ModulesArguments() + else: + self.arguments = ( + ModulesArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != ModulesArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class ModulesArguments(BaseSchema): + """ + Arguments for `modules` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "startModule": {"type": "integer", "description": "The index of the first module to return; if omitted modules start at 0."}, + "moduleCount": { + "type": "integer", + "description": "The number of modules to return. If `moduleCount` is not specified or 0, all modules are returned.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, startModule=None, moduleCount=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer startModule: The index of the first module to return; if omitted modules start at 0. + :param integer moduleCount: The number of modules to return. If `moduleCount` is not specified or 0, all modules are returned. + """ + self.startModule = startModule + self.moduleCount = moduleCount + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + startModule = self.startModule + moduleCount = self.moduleCount + dct = {} + if startModule is not None: + dct["startModule"] = startModule + if moduleCount is not None: + dct["moduleCount"] = moduleCount + dct.update(self.kwargs) + return dct + + +@register_response("modules") +@register +class ModulesResponse(BaseSchema): + """ + Response to `modules` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "modules": {"type": "array", "items": {"$ref": "#/definitions/Module"}, "description": "All modules or range of modules."}, + "totalModules": {"type": "integer", "description": "The total number of modules available."}, + }, + "required": ["modules"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param ModulesResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = ModulesResponseBody() + else: + self.body = ( + ModulesResponseBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != ModulesResponseBody else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("loadedSources") +@register +class LoadedSourcesRequest(BaseSchema): + """ + Retrieves the set of all sources currently loaded by the debugged process. + + Clients should only call this request if the corresponding capability `supportsLoadedSourcesRequest` + is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["loadedSources"]}, + "arguments": {"type": "LoadedSourcesArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param LoadedSourcesArguments arguments: + """ + self.type = "request" + self.command = "loadedSources" + self.seq = seq + if arguments is None: + self.arguments = LoadedSourcesArguments() + else: + self.arguments = ( + LoadedSourcesArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != LoadedSourcesArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class LoadedSourcesArguments(BaseSchema): + """ + Arguments for `loadedSources` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register_response("loadedSources") +@register +class LoadedSourcesResponse(BaseSchema): + """ + Response to `loadedSources` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "sources": {"type": "array", "items": {"$ref": "#/definitions/Source"}, "description": "Set of loaded sources."} + }, + "required": ["sources"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param LoadedSourcesResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = LoadedSourcesResponseBody() + else: + self.body = ( + LoadedSourcesResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != LoadedSourcesResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("evaluate") +@register +class EvaluateRequest(BaseSchema): + """ + Evaluates the given expression in the context of the topmost stack frame. + + The expression has access to any variables and arguments that are in scope. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["evaluate"]}, + "arguments": {"type": "EvaluateArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param EvaluateArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "evaluate" + if arguments is None: + self.arguments = EvaluateArguments() + else: + self.arguments = ( + EvaluateArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != EvaluateArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class EvaluateArguments(BaseSchema): + """ + Arguments for `evaluate` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "expression": {"type": "string", "description": "The expression to evaluate."}, + "frameId": { + "type": "integer", + "description": "Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the global scope.", + }, + "context": { + "type": "string", + "_enum": ["watch", "repl", "hover", "clipboard", "variables"], + "enumDescriptions": [ + "evaluate is called from a watch view context.", + "evaluate is called from a REPL context.", + "evaluate is called to generate the debug hover contents.\nThis value should only be used if the corresponding capability `supportsEvaluateForHovers` is True.", + "evaluate is called to generate clipboard contents.\nThis value should only be used if the corresponding capability `supportsClipboardContext` is True.", + "evaluate is called from a variables view context.", + ], + "description": "The context in which the evaluate request is used.", + }, + "format": { + "description": "Specifies details on how to format the result.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is True.", + "type": "ValueFormat", + }, + } + __refs__ = set(["format"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, expression, frameId=None, context=None, format=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string expression: The expression to evaluate. + :param integer frameId: Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the global scope. + :param string context: The context in which the evaluate request is used. + :param ValueFormat format: Specifies details on how to format the result. + The attribute is only honored by a debug adapter if the corresponding capability `supportsValueFormattingOptions` is true. + """ + self.expression = expression + self.frameId = frameId + self.context = context + if format is None: + self.format = ValueFormat() + else: + self.format = ValueFormat(update_ids_from_dap=update_ids_from_dap, **format) if format.__class__ != ValueFormat else format + if update_ids_from_dap: + self.frameId = self._translate_id_from_dap(self.frameId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_from_dap(dct["frameId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + expression = self.expression + frameId = self.frameId + context = self.context + format = self.format # noqa (assign to builtin) + if update_ids_to_dap: + if frameId is not None: + frameId = self._translate_id_to_dap(frameId) + dct = { + "expression": expression, + } + if frameId is not None: + dct["frameId"] = frameId + if context is not None: + dct["context"] = context + if format is not None: + dct["format"] = format.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_to_dap(dct["frameId"]) + return dct + + +@register_response("evaluate") +@register +class EvaluateResponse(BaseSchema): + """ + Response to `evaluate` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "result": {"type": "string", "description": "The result of the evaluate request."}, + "type": { + "type": "string", + "description": "The type of the evaluate result.\nThis attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is True.", + }, + "presentationHint": { + "$ref": "#/definitions/VariablePresentationHint", + "description": "Properties of an evaluate result that can be used to determine how to render the result in the UI.", + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is True.", + }, + }, + "required": ["result", "variablesReference"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param EvaluateResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = EvaluateResponseBody() + else: + self.body = ( + EvaluateResponseBody(update_ids_from_dap=update_ids_from_dap, **body) if body.__class__ != EvaluateResponseBody else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("setExpression") +@register +class SetExpressionRequest(BaseSchema): + """ + Evaluates the given `value` expression and assigns it to the `expression` which must be a modifiable + l-value. + + The expressions have access to any variables and arguments that are in scope of the specified frame. + + Clients should only call this request if the corresponding capability `supportsSetExpression` is + true. + + If a debug adapter implements both `setExpression` and `setVariable`, a client uses `setExpression` + if the variable has an `evaluateName` property. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setExpression"]}, + "arguments": {"type": "SetExpressionArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetExpressionArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setExpression" + if arguments is None: + self.arguments = SetExpressionArguments() + else: + self.arguments = ( + SetExpressionArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetExpressionArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetExpressionArguments(BaseSchema): + """ + Arguments for `setExpression` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "expression": {"type": "string", "description": "The l-value expression to assign to."}, + "value": {"type": "string", "description": "The value expression to assign to the l-value expression."}, + "frameId": { + "type": "integer", + "description": "Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in the global scope.", + }, + "format": {"description": "Specifies how the resulting value should be formatted.", "type": "ValueFormat"}, + } + __refs__ = set(["format"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, expression, value, frameId=None, format=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string expression: The l-value expression to assign to. + :param string value: The value expression to assign to the l-value expression. + :param integer frameId: Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in the global scope. + :param ValueFormat format: Specifies how the resulting value should be formatted. + """ + self.expression = expression + self.value = value + self.frameId = frameId + if format is None: + self.format = ValueFormat() + else: + self.format = ValueFormat(update_ids_from_dap=update_ids_from_dap, **format) if format.__class__ != ValueFormat else format + if update_ids_from_dap: + self.frameId = self._translate_id_from_dap(self.frameId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_from_dap(dct["frameId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + expression = self.expression + value = self.value + frameId = self.frameId + format = self.format # noqa (assign to builtin) + if update_ids_to_dap: + if frameId is not None: + frameId = self._translate_id_to_dap(frameId) + dct = { + "expression": expression, + "value": value, + } + if frameId is not None: + dct["frameId"] = frameId + if format is not None: + dct["format"] = format.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_to_dap(dct["frameId"]) + return dct + + +@register_response("setExpression") +@register +class SetExpressionResponse(BaseSchema): + """ + Response to `setExpression` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "value": {"type": "string", "description": "The new value of the expression."}, + "type": { + "type": "string", + "description": "The type of the value.\nThis attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is True.", + }, + "presentationHint": { + "$ref": "#/definitions/VariablePresentationHint", + "description": "Properties of a value that can be used to determine how to render the result in the UI.", + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is True.", + }, + }, + "required": ["value"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param SetExpressionResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = SetExpressionResponseBody() + else: + self.body = ( + SetExpressionResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != SetExpressionResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("stepInTargets") +@register +class StepInTargetsRequest(BaseSchema): + """ + This request retrieves the possible step-in targets for the specified stack frame. + + These targets can be used in the `stepIn` request. + + Clients should only call this request if the corresponding capability `supportsStepInTargetsRequest` + is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["stepInTargets"]}, + "arguments": {"type": "StepInTargetsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param StepInTargetsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "stepInTargets" + if arguments is None: + self.arguments = StepInTargetsArguments() + else: + self.arguments = ( + StepInTargetsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != StepInTargetsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class StepInTargetsArguments(BaseSchema): + """ + Arguments for `stepInTargets` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"frameId": {"type": "integer", "description": "The stack frame for which to retrieve the possible step-in targets."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, frameId, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer frameId: The stack frame for which to retrieve the possible step-in targets. + """ + self.frameId = frameId + if update_ids_from_dap: + self.frameId = self._translate_id_from_dap(self.frameId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_from_dap(dct["frameId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + frameId = self.frameId + if update_ids_to_dap: + if frameId is not None: + frameId = self._translate_id_to_dap(frameId) + dct = { + "frameId": frameId, + } + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_to_dap(dct["frameId"]) + return dct + + +@register_response("stepInTargets") +@register +class StepInTargetsResponse(BaseSchema): + """ + Response to `stepInTargets` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "targets": { + "type": "array", + "items": {"$ref": "#/definitions/StepInTarget"}, + "description": "The possible step-in targets of the specified source location.", + } + }, + "required": ["targets"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param StepInTargetsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = StepInTargetsResponseBody() + else: + self.body = ( + StepInTargetsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != StepInTargetsResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("gotoTargets") +@register +class GotoTargetsRequest(BaseSchema): + """ + This request retrieves the possible goto targets for the specified source location. + + These targets can be used in the `goto` request. + + Clients should only call this request if the corresponding capability `supportsGotoTargetsRequest` + is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["gotoTargets"]}, + "arguments": {"type": "GotoTargetsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param GotoTargetsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "gotoTargets" + if arguments is None: + self.arguments = GotoTargetsArguments() + else: + self.arguments = ( + GotoTargetsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != GotoTargetsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class GotoTargetsArguments(BaseSchema): + """ + Arguments for `gotoTargets` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "source": {"description": "The source location for which the goto targets are determined.", "type": "Source"}, + "line": {"type": "integer", "description": "The line location for which the goto targets are determined."}, + "column": { + "type": "integer", + "description": "The position within `line` for which the goto targets are determined. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, source, line, column=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param Source source: The source location for which the goto targets are determined. + :param integer line: The line location for which the goto targets are determined. + :param integer column: The position within `line` for which the goto targets are determined. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + """ + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.line = line + self.column = column + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + source = self.source + line = self.line + column = self.column + dct = { + "source": source.to_dict(update_ids_to_dap=update_ids_to_dap), + "line": line, + } + if column is not None: + dct["column"] = column + dct.update(self.kwargs) + return dct + + +@register_response("gotoTargets") +@register +class GotoTargetsResponse(BaseSchema): + """ + Response to `gotoTargets` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "targets": { + "type": "array", + "items": {"$ref": "#/definitions/GotoTarget"}, + "description": "The possible goto targets of the specified location.", + } + }, + "required": ["targets"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param GotoTargetsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = GotoTargetsResponseBody() + else: + self.body = ( + GotoTargetsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != GotoTargetsResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("completions") +@register +class CompletionsRequest(BaseSchema): + """ + Returns a list of possible completions for a given caret position and text. + + Clients should only call this request if the corresponding capability `supportsCompletionsRequest` + is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["completions"]}, + "arguments": {"type": "CompletionsArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param CompletionsArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "completions" + if arguments is None: + self.arguments = CompletionsArguments() + else: + self.arguments = ( + CompletionsArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != CompletionsArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class CompletionsArguments(BaseSchema): + """ + Arguments for `completions` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "frameId": { + "type": "integer", + "description": "Returns completions in the scope of this stack frame. If not specified, the completions are returned for the global scope.", + }, + "text": { + "type": "string", + "description": "One or more source lines. Typically this is the text users have typed into the debug console before they asked for completion.", + }, + "column": { + "type": "integer", + "description": "The position within `text` for which to determine the completion proposals. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "line": { + "type": "integer", + "description": "A line for which to determine the completion proposals. If missing the first line of the text is assumed.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, text, column, frameId=None, line=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string text: One or more source lines. Typically this is the text users have typed into the debug console before they asked for completion. + :param integer column: The position within `text` for which to determine the completion proposals. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + :param integer frameId: Returns completions in the scope of this stack frame. If not specified, the completions are returned for the global scope. + :param integer line: A line for which to determine the completion proposals. If missing the first line of the text is assumed. + """ + self.text = text + self.column = column + self.frameId = frameId + self.line = line + if update_ids_from_dap: + self.frameId = self._translate_id_from_dap(self.frameId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_from_dap(dct["frameId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + text = self.text + column = self.column + frameId = self.frameId + line = self.line + if update_ids_to_dap: + if frameId is not None: + frameId = self._translate_id_to_dap(frameId) + dct = { + "text": text, + "column": column, + } + if frameId is not None: + dct["frameId"] = frameId + if line is not None: + dct["line"] = line + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "frameId" in dct: + dct["frameId"] = cls._translate_id_to_dap(dct["frameId"]) + return dct + + +@register_response("completions") +@register +class CompletionsResponse(BaseSchema): + """ + Response to `completions` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "targets": { + "type": "array", + "items": {"$ref": "#/definitions/CompletionItem"}, + "description": "The possible completions for .", + } + }, + "required": ["targets"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param CompletionsResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = CompletionsResponseBody() + else: + self.body = ( + CompletionsResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != CompletionsResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("exceptionInfo") +@register +class ExceptionInfoRequest(BaseSchema): + """ + Retrieves the details of the exception that caused this event to be raised. + + Clients should only call this request if the corresponding capability `supportsExceptionInfoRequest` + is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["exceptionInfo"]}, + "arguments": {"type": "ExceptionInfoArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param ExceptionInfoArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "exceptionInfo" + if arguments is None: + self.arguments = ExceptionInfoArguments() + else: + self.arguments = ( + ExceptionInfoArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != ExceptionInfoArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class ExceptionInfoArguments(BaseSchema): + """ + Arguments for `exceptionInfo` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"threadId": {"type": "integer", "description": "Thread for which exception information should be retrieved."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: Thread for which exception information should be retrieved. + """ + self.threadId = threadId + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register_response("exceptionInfo") +@register +class ExceptionInfoResponse(BaseSchema): + """ + Response to `exceptionInfo` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "exceptionId": {"type": "string", "description": "ID of the exception that was thrown."}, + "description": {"type": "string", "description": "Descriptive text for the exception."}, + "breakMode": { + "$ref": "#/definitions/ExceptionBreakMode", + "description": "Mode that caused the exception notification to be raised.", + }, + "details": {"$ref": "#/definitions/ExceptionDetails", "description": "Detailed information about the exception."}, + }, + "required": ["exceptionId", "breakMode"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param ExceptionInfoResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = ExceptionInfoResponseBody() + else: + self.body = ( + ExceptionInfoResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != ExceptionInfoResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register_request("readMemory") +@register +class ReadMemoryRequest(BaseSchema): + """ + Reads bytes from memory at the provided location. + + Clients should only call this request if the corresponding capability `supportsReadMemoryRequest` is + true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["readMemory"]}, + "arguments": {"type": "ReadMemoryArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param ReadMemoryArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "readMemory" + if arguments is None: + self.arguments = ReadMemoryArguments() + else: + self.arguments = ( + ReadMemoryArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != ReadMemoryArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class ReadMemoryArguments(BaseSchema): + """ + Arguments for `readMemory` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "memoryReference": {"type": "string", "description": "Memory reference to the base location from which data should be read."}, + "offset": { + "type": "integer", + "description": "Offset (in bytes) to be applied to the reference location before reading data. Can be negative.", + }, + "count": {"type": "integer", "description": "Number of bytes to read at the specified location and offset."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, memoryReference, count, offset=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string memoryReference: Memory reference to the base location from which data should be read. + :param integer count: Number of bytes to read at the specified location and offset. + :param integer offset: Offset (in bytes) to be applied to the reference location before reading data. Can be negative. + """ + self.memoryReference = memoryReference + self.count = count + self.offset = offset + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + memoryReference = self.memoryReference + count = self.count + offset = self.offset + dct = { + "memoryReference": memoryReference, + "count": count, + } + if offset is not None: + dct["offset"] = offset + dct.update(self.kwargs) + return dct + + +@register_response("readMemory") +@register +class ReadMemoryResponse(BaseSchema): + """ + Response to `readMemory` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "The address of the first byte of data returned.\nTreated as a hex value if prefixed with `0x`, or as a decimal value otherwise.", + }, + "unreadableBytes": { + "type": "integer", + "description": "The number of unreadable bytes encountered after the last successfully read byte.\nThis can be used to determine the number of bytes that should be skipped before a subsequent `readMemory` request succeeds.", + }, + "data": { + "type": "string", + "description": "The bytes read from memory, encoded using base64. If the decoded length of `data` is less than the requested `count` in the original `readMemory` request, and `unreadableBytes` is zero or omitted, then the client should assume it's reached the end of readable memory.", + }, + }, + "required": ["address"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ReadMemoryResponseBody body: + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + if body is None: + self.body = ReadMemoryResponseBody() + else: + self.body = ( + ReadMemoryResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != ReadMemoryResponseBody + else body + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register_request("writeMemory") +@register +class WriteMemoryRequest(BaseSchema): + """ + Writes bytes to memory at the provided location. + + Clients should only call this request if the corresponding capability `supportsWriteMemoryRequest` + is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["writeMemory"]}, + "arguments": {"type": "WriteMemoryArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param WriteMemoryArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "writeMemory" + if arguments is None: + self.arguments = WriteMemoryArguments() + else: + self.arguments = ( + WriteMemoryArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != WriteMemoryArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class WriteMemoryArguments(BaseSchema): + """ + Arguments for `writeMemory` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "memoryReference": {"type": "string", "description": "Memory reference to the base location to which data should be written."}, + "offset": { + "type": "integer", + "description": "Offset (in bytes) to be applied to the reference location before writing data. Can be negative.", + }, + "allowPartial": { + "type": "boolean", + "description": "Property to control partial writes. If True, the debug adapter should attempt to write memory even if the entire memory region is not writable. In such a case the debug adapter should stop after hitting the first byte of memory that cannot be written and return the number of bytes written in the response via the `offset` and `bytesWritten` properties.\nIf false or missing, a debug adapter should attempt to verify the region is writable before writing, and fail the response if it is not.", + }, + "data": {"type": "string", "description": "Bytes to write, encoded using base64."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, memoryReference, data, offset=None, allowPartial=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string memoryReference: Memory reference to the base location to which data should be written. + :param string data: Bytes to write, encoded using base64. + :param integer offset: Offset (in bytes) to be applied to the reference location before writing data. Can be negative. + :param boolean allowPartial: Property to control partial writes. If true, the debug adapter should attempt to write memory even if the entire memory region is not writable. In such a case the debug adapter should stop after hitting the first byte of memory that cannot be written and return the number of bytes written in the response via the `offset` and `bytesWritten` properties. + If false or missing, a debug adapter should attempt to verify the region is writable before writing, and fail the response if it is not. + """ + self.memoryReference = memoryReference + self.data = data + self.offset = offset + self.allowPartial = allowPartial + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + memoryReference = self.memoryReference + data = self.data + offset = self.offset + allowPartial = self.allowPartial + dct = { + "memoryReference": memoryReference, + "data": data, + } + if offset is not None: + dct["offset"] = offset + if allowPartial is not None: + dct["allowPartial"] = allowPartial + dct.update(self.kwargs) + return dct + + +@register_response("writeMemory") +@register +class WriteMemoryResponse(BaseSchema): + """ + Response to `writeMemory` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "offset": { + "type": "integer", + "description": "Property that should be returned when `allowPartial` is True to indicate the offset of the first byte of data successfully written. Can be negative.", + }, + "bytesWritten": { + "type": "integer", + "description": "Property that should be returned when `allowPartial` is True to indicate the number of bytes starting from address that were successfully written.", + }, + }, + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param WriteMemoryResponseBody body: + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + if body is None: + self.body = WriteMemoryResponseBody() + else: + self.body = ( + WriteMemoryResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != WriteMemoryResponseBody + else body + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register_request("disassemble") +@register +class DisassembleRequest(BaseSchema): + """ + Disassembles code stored at the provided location. + + Clients should only call this request if the corresponding capability `supportsDisassembleRequest` + is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["disassemble"]}, + "arguments": {"type": "DisassembleArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param DisassembleArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "disassemble" + if arguments is None: + self.arguments = DisassembleArguments() + else: + self.arguments = ( + DisassembleArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != DisassembleArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class DisassembleArguments(BaseSchema): + """ + Arguments for `disassemble` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "memoryReference": { + "type": "string", + "description": "Memory reference to the base location containing the instructions to disassemble.", + }, + "offset": { + "type": "integer", + "description": "Offset (in bytes) to be applied to the reference location before disassembling. Can be negative.", + }, + "instructionOffset": { + "type": "integer", + "description": "Offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be negative.", + }, + "instructionCount": { + "type": "integer", + "description": "Number of instructions to disassemble starting at the specified location and offset.\nAn adapter must return exactly this number of instructions - any unavailable instructions should be replaced with an implementation-defined 'invalid instruction' value.", + }, + "resolveSymbols": { + "type": "boolean", + "description": "If True, the adapter should attempt to resolve memory addresses and other values to symbolic names.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + memoryReference, + instructionCount, + offset=None, + instructionOffset=None, + resolveSymbols=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string memoryReference: Memory reference to the base location containing the instructions to disassemble. + :param integer instructionCount: Number of instructions to disassemble starting at the specified location and offset. + An adapter must return exactly this number of instructions - any unavailable instructions should be replaced with an implementation-defined 'invalid instruction' value. + :param integer offset: Offset (in bytes) to be applied to the reference location before disassembling. Can be negative. + :param integer instructionOffset: Offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be negative. + :param boolean resolveSymbols: If true, the adapter should attempt to resolve memory addresses and other values to symbolic names. + """ + self.memoryReference = memoryReference + self.instructionCount = instructionCount + self.offset = offset + self.instructionOffset = instructionOffset + self.resolveSymbols = resolveSymbols + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + memoryReference = self.memoryReference + instructionCount = self.instructionCount + offset = self.offset + instructionOffset = self.instructionOffset + resolveSymbols = self.resolveSymbols + dct = { + "memoryReference": memoryReference, + "instructionCount": instructionCount, + } + if offset is not None: + dct["offset"] = offset + if instructionOffset is not None: + dct["instructionOffset"] = instructionOffset + if resolveSymbols is not None: + dct["resolveSymbols"] = resolveSymbols + dct.update(self.kwargs) + return dct + + +@register_response("disassemble") +@register +class DisassembleResponse(BaseSchema): + """ + Response to `disassemble` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "instructions": { + "type": "array", + "items": {"$ref": "#/definitions/DisassembledInstruction"}, + "description": "The list of disassembled instructions.", + } + }, + "required": ["instructions"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param DisassembleResponseBody body: + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + if body is None: + self.body = DisassembleResponseBody() + else: + self.body = ( + DisassembleResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != DisassembleResponseBody + else body + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class Capabilities(BaseSchema): + """ + Information about the capabilities of a debug adapter. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "supportsConfigurationDoneRequest": { + "type": "boolean", + "description": "The debug adapter supports the `configurationDone` request.", + }, + "supportsFunctionBreakpoints": {"type": "boolean", "description": "The debug adapter supports function breakpoints."}, + "supportsConditionalBreakpoints": {"type": "boolean", "description": "The debug adapter supports conditional breakpoints."}, + "supportsHitConditionalBreakpoints": { + "type": "boolean", + "description": "The debug adapter supports breakpoints that break execution after a specified number of hits.", + }, + "supportsEvaluateForHovers": { + "type": "boolean", + "description": "The debug adapter supports a (side effect free) `evaluate` request for data hovers.", + }, + "exceptionBreakpointFilters": { + "type": "array", + "items": {"$ref": "#/definitions/ExceptionBreakpointsFilter"}, + "description": "Available exception filter options for the `setExceptionBreakpoints` request.", + }, + "supportsStepBack": { + "type": "boolean", + "description": "The debug adapter supports stepping back via the `stepBack` and `reverseContinue` requests.", + }, + "supportsSetVariable": {"type": "boolean", "description": "The debug adapter supports setting a variable to a value."}, + "supportsRestartFrame": {"type": "boolean", "description": "The debug adapter supports restarting a frame."}, + "supportsGotoTargetsRequest": {"type": "boolean", "description": "The debug adapter supports the `gotoTargets` request."}, + "supportsStepInTargetsRequest": {"type": "boolean", "description": "The debug adapter supports the `stepInTargets` request."}, + "supportsCompletionsRequest": {"type": "boolean", "description": "The debug adapter supports the `completions` request."}, + "completionTriggerCharacters": { + "type": "array", + "items": {"type": "string"}, + "description": "The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the `.` character.", + }, + "supportsModulesRequest": {"type": "boolean", "description": "The debug adapter supports the `modules` request."}, + "additionalModuleColumns": { + "type": "array", + "items": {"$ref": "#/definitions/ColumnDescriptor"}, + "description": "The set of additional module information exposed by the debug adapter.", + }, + "supportedChecksumAlgorithms": { + "type": "array", + "items": {"$ref": "#/definitions/ChecksumAlgorithm"}, + "description": "Checksum algorithms supported by the debug adapter.", + }, + "supportsRestartRequest": { + "type": "boolean", + "description": "The debug adapter supports the `restart` request. In this case a client should not implement `restart` by terminating and relaunching the adapter but by calling the `restart` request.", + }, + "supportsExceptionOptions": { + "type": "boolean", + "description": "The debug adapter supports `exceptionOptions` on the `setExceptionBreakpoints` request.", + }, + "supportsValueFormattingOptions": { + "type": "boolean", + "description": "The debug adapter supports a `format` attribute on the `stackTrace`, `variables`, and `evaluate` requests.", + }, + "supportsExceptionInfoRequest": {"type": "boolean", "description": "The debug adapter supports the `exceptionInfo` request."}, + "supportTerminateDebuggee": { + "type": "boolean", + "description": "The debug adapter supports the `terminateDebuggee` attribute on the `disconnect` request.", + }, + "supportSuspendDebuggee": { + "type": "boolean", + "description": "The debug adapter supports the `suspendDebuggee` attribute on the `disconnect` request.", + }, + "supportsDelayedStackTraceLoading": { + "type": "boolean", + "description": "The debug adapter supports the delayed loading of parts of the stack, which requires that both the `startFrame` and `levels` arguments and the `totalFrames` result of the `stackTrace` request are supported.", + }, + "supportsLoadedSourcesRequest": {"type": "boolean", "description": "The debug adapter supports the `loadedSources` request."}, + "supportsLogPoints": { + "type": "boolean", + "description": "The debug adapter supports log points by interpreting the `logMessage` attribute of the `SourceBreakpoint`.", + }, + "supportsTerminateThreadsRequest": {"type": "boolean", "description": "The debug adapter supports the `terminateThreads` request."}, + "supportsSetExpression": {"type": "boolean", "description": "The debug adapter supports the `setExpression` request."}, + "supportsTerminateRequest": {"type": "boolean", "description": "The debug adapter supports the `terminate` request."}, + "supportsDataBreakpoints": {"type": "boolean", "description": "The debug adapter supports data breakpoints."}, + "supportsReadMemoryRequest": {"type": "boolean", "description": "The debug adapter supports the `readMemory` request."}, + "supportsWriteMemoryRequest": {"type": "boolean", "description": "The debug adapter supports the `writeMemory` request."}, + "supportsDisassembleRequest": {"type": "boolean", "description": "The debug adapter supports the `disassemble` request."}, + "supportsCancelRequest": {"type": "boolean", "description": "The debug adapter supports the `cancel` request."}, + "supportsBreakpointLocationsRequest": { + "type": "boolean", + "description": "The debug adapter supports the `breakpointLocations` request.", + }, + "supportsClipboardContext": { + "type": "boolean", + "description": "The debug adapter supports the `clipboard` context value in the `evaluate` request.", + }, + "supportsSteppingGranularity": { + "type": "boolean", + "description": "The debug adapter supports stepping granularities (argument `granularity`) for the stepping requests.", + }, + "supportsInstructionBreakpoints": { + "type": "boolean", + "description": "The debug adapter supports adding breakpoints based on instruction references.", + }, + "supportsExceptionFilterOptions": { + "type": "boolean", + "description": "The debug adapter supports `filterOptions` as an argument on the `setExceptionBreakpoints` request.", + }, + "supportsSingleThreadExecutionRequests": { + "type": "boolean", + "description": "The debug adapter supports the `singleThread` property on the execution requests (`continue`, `next`, `stepIn`, `stepOut`, `reverseContinue`, `stepBack`).", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + supportsConfigurationDoneRequest=None, + supportsFunctionBreakpoints=None, + supportsConditionalBreakpoints=None, + supportsHitConditionalBreakpoints=None, + supportsEvaluateForHovers=None, + exceptionBreakpointFilters=None, + supportsStepBack=None, + supportsSetVariable=None, + supportsRestartFrame=None, + supportsGotoTargetsRequest=None, + supportsStepInTargetsRequest=None, + supportsCompletionsRequest=None, + completionTriggerCharacters=None, + supportsModulesRequest=None, + additionalModuleColumns=None, + supportedChecksumAlgorithms=None, + supportsRestartRequest=None, + supportsExceptionOptions=None, + supportsValueFormattingOptions=None, + supportsExceptionInfoRequest=None, + supportTerminateDebuggee=None, + supportSuspendDebuggee=None, + supportsDelayedStackTraceLoading=None, + supportsLoadedSourcesRequest=None, + supportsLogPoints=None, + supportsTerminateThreadsRequest=None, + supportsSetExpression=None, + supportsTerminateRequest=None, + supportsDataBreakpoints=None, + supportsReadMemoryRequest=None, + supportsWriteMemoryRequest=None, + supportsDisassembleRequest=None, + supportsCancelRequest=None, + supportsBreakpointLocationsRequest=None, + supportsClipboardContext=None, + supportsSteppingGranularity=None, + supportsInstructionBreakpoints=None, + supportsExceptionFilterOptions=None, + supportsSingleThreadExecutionRequests=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param boolean supportsConfigurationDoneRequest: The debug adapter supports the `configurationDone` request. + :param boolean supportsFunctionBreakpoints: The debug adapter supports function breakpoints. + :param boolean supportsConditionalBreakpoints: The debug adapter supports conditional breakpoints. + :param boolean supportsHitConditionalBreakpoints: The debug adapter supports breakpoints that break execution after a specified number of hits. + :param boolean supportsEvaluateForHovers: The debug adapter supports a (side effect free) `evaluate` request for data hovers. + :param array exceptionBreakpointFilters: Available exception filter options for the `setExceptionBreakpoints` request. + :param boolean supportsStepBack: The debug adapter supports stepping back via the `stepBack` and `reverseContinue` requests. + :param boolean supportsSetVariable: The debug adapter supports setting a variable to a value. + :param boolean supportsRestartFrame: The debug adapter supports restarting a frame. + :param boolean supportsGotoTargetsRequest: The debug adapter supports the `gotoTargets` request. + :param boolean supportsStepInTargetsRequest: The debug adapter supports the `stepInTargets` request. + :param boolean supportsCompletionsRequest: The debug adapter supports the `completions` request. + :param array completionTriggerCharacters: The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the `.` character. + :param boolean supportsModulesRequest: The debug adapter supports the `modules` request. + :param array additionalModuleColumns: The set of additional module information exposed by the debug adapter. + :param array supportedChecksumAlgorithms: Checksum algorithms supported by the debug adapter. + :param boolean supportsRestartRequest: The debug adapter supports the `restart` request. In this case a client should not implement `restart` by terminating and relaunching the adapter but by calling the `restart` request. + :param boolean supportsExceptionOptions: The debug adapter supports `exceptionOptions` on the `setExceptionBreakpoints` request. + :param boolean supportsValueFormattingOptions: The debug adapter supports a `format` attribute on the `stackTrace`, `variables`, and `evaluate` requests. + :param boolean supportsExceptionInfoRequest: The debug adapter supports the `exceptionInfo` request. + :param boolean supportTerminateDebuggee: The debug adapter supports the `terminateDebuggee` attribute on the `disconnect` request. + :param boolean supportSuspendDebuggee: The debug adapter supports the `suspendDebuggee` attribute on the `disconnect` request. + :param boolean supportsDelayedStackTraceLoading: The debug adapter supports the delayed loading of parts of the stack, which requires that both the `startFrame` and `levels` arguments and the `totalFrames` result of the `stackTrace` request are supported. + :param boolean supportsLoadedSourcesRequest: The debug adapter supports the `loadedSources` request. + :param boolean supportsLogPoints: The debug adapter supports log points by interpreting the `logMessage` attribute of the `SourceBreakpoint`. + :param boolean supportsTerminateThreadsRequest: The debug adapter supports the `terminateThreads` request. + :param boolean supportsSetExpression: The debug adapter supports the `setExpression` request. + :param boolean supportsTerminateRequest: The debug adapter supports the `terminate` request. + :param boolean supportsDataBreakpoints: The debug adapter supports data breakpoints. + :param boolean supportsReadMemoryRequest: The debug adapter supports the `readMemory` request. + :param boolean supportsWriteMemoryRequest: The debug adapter supports the `writeMemory` request. + :param boolean supportsDisassembleRequest: The debug adapter supports the `disassemble` request. + :param boolean supportsCancelRequest: The debug adapter supports the `cancel` request. + :param boolean supportsBreakpointLocationsRequest: The debug adapter supports the `breakpointLocations` request. + :param boolean supportsClipboardContext: The debug adapter supports the `clipboard` context value in the `evaluate` request. + :param boolean supportsSteppingGranularity: The debug adapter supports stepping granularities (argument `granularity`) for the stepping requests. + :param boolean supportsInstructionBreakpoints: The debug adapter supports adding breakpoints based on instruction references. + :param boolean supportsExceptionFilterOptions: The debug adapter supports `filterOptions` as an argument on the `setExceptionBreakpoints` request. + :param boolean supportsSingleThreadExecutionRequests: The debug adapter supports the `singleThread` property on the execution requests (`continue`, `next`, `stepIn`, `stepOut`, `reverseContinue`, `stepBack`). + """ + self.supportsConfigurationDoneRequest = supportsConfigurationDoneRequest + self.supportsFunctionBreakpoints = supportsFunctionBreakpoints + self.supportsConditionalBreakpoints = supportsConditionalBreakpoints + self.supportsHitConditionalBreakpoints = supportsHitConditionalBreakpoints + self.supportsEvaluateForHovers = supportsEvaluateForHovers + self.exceptionBreakpointFilters = exceptionBreakpointFilters + if update_ids_from_dap and self.exceptionBreakpointFilters: + for o in self.exceptionBreakpointFilters: + ExceptionBreakpointsFilter.update_dict_ids_from_dap(o) + self.supportsStepBack = supportsStepBack + self.supportsSetVariable = supportsSetVariable + self.supportsRestartFrame = supportsRestartFrame + self.supportsGotoTargetsRequest = supportsGotoTargetsRequest + self.supportsStepInTargetsRequest = supportsStepInTargetsRequest + self.supportsCompletionsRequest = supportsCompletionsRequest + self.completionTriggerCharacters = completionTriggerCharacters + self.supportsModulesRequest = supportsModulesRequest + self.additionalModuleColumns = additionalModuleColumns + if update_ids_from_dap and self.additionalModuleColumns: + for o in self.additionalModuleColumns: + ColumnDescriptor.update_dict_ids_from_dap(o) + self.supportedChecksumAlgorithms = supportedChecksumAlgorithms + if update_ids_from_dap and self.supportedChecksumAlgorithms: + for o in self.supportedChecksumAlgorithms: + ChecksumAlgorithm.update_dict_ids_from_dap(o) + self.supportsRestartRequest = supportsRestartRequest + self.supportsExceptionOptions = supportsExceptionOptions + self.supportsValueFormattingOptions = supportsValueFormattingOptions + self.supportsExceptionInfoRequest = supportsExceptionInfoRequest + self.supportTerminateDebuggee = supportTerminateDebuggee + self.supportSuspendDebuggee = supportSuspendDebuggee + self.supportsDelayedStackTraceLoading = supportsDelayedStackTraceLoading + self.supportsLoadedSourcesRequest = supportsLoadedSourcesRequest + self.supportsLogPoints = supportsLogPoints + self.supportsTerminateThreadsRequest = supportsTerminateThreadsRequest + self.supportsSetExpression = supportsSetExpression + self.supportsTerminateRequest = supportsTerminateRequest + self.supportsDataBreakpoints = supportsDataBreakpoints + self.supportsReadMemoryRequest = supportsReadMemoryRequest + self.supportsWriteMemoryRequest = supportsWriteMemoryRequest + self.supportsDisassembleRequest = supportsDisassembleRequest + self.supportsCancelRequest = supportsCancelRequest + self.supportsBreakpointLocationsRequest = supportsBreakpointLocationsRequest + self.supportsClipboardContext = supportsClipboardContext + self.supportsSteppingGranularity = supportsSteppingGranularity + self.supportsInstructionBreakpoints = supportsInstructionBreakpoints + self.supportsExceptionFilterOptions = supportsExceptionFilterOptions + self.supportsSingleThreadExecutionRequests = supportsSingleThreadExecutionRequests + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + supportsConfigurationDoneRequest = self.supportsConfigurationDoneRequest + supportsFunctionBreakpoints = self.supportsFunctionBreakpoints + supportsConditionalBreakpoints = self.supportsConditionalBreakpoints + supportsHitConditionalBreakpoints = self.supportsHitConditionalBreakpoints + supportsEvaluateForHovers = self.supportsEvaluateForHovers + exceptionBreakpointFilters = self.exceptionBreakpointFilters + if exceptionBreakpointFilters and hasattr(exceptionBreakpointFilters[0], "to_dict"): + exceptionBreakpointFilters = [x.to_dict() for x in exceptionBreakpointFilters] + supportsStepBack = self.supportsStepBack + supportsSetVariable = self.supportsSetVariable + supportsRestartFrame = self.supportsRestartFrame + supportsGotoTargetsRequest = self.supportsGotoTargetsRequest + supportsStepInTargetsRequest = self.supportsStepInTargetsRequest + supportsCompletionsRequest = self.supportsCompletionsRequest + completionTriggerCharacters = self.completionTriggerCharacters + if completionTriggerCharacters and hasattr(completionTriggerCharacters[0], "to_dict"): + completionTriggerCharacters = [x.to_dict() for x in completionTriggerCharacters] + supportsModulesRequest = self.supportsModulesRequest + additionalModuleColumns = self.additionalModuleColumns + if additionalModuleColumns and hasattr(additionalModuleColumns[0], "to_dict"): + additionalModuleColumns = [x.to_dict() for x in additionalModuleColumns] + supportedChecksumAlgorithms = self.supportedChecksumAlgorithms + if supportedChecksumAlgorithms and hasattr(supportedChecksumAlgorithms[0], "to_dict"): + supportedChecksumAlgorithms = [x.to_dict() for x in supportedChecksumAlgorithms] + supportsRestartRequest = self.supportsRestartRequest + supportsExceptionOptions = self.supportsExceptionOptions + supportsValueFormattingOptions = self.supportsValueFormattingOptions + supportsExceptionInfoRequest = self.supportsExceptionInfoRequest + supportTerminateDebuggee = self.supportTerminateDebuggee + supportSuspendDebuggee = self.supportSuspendDebuggee + supportsDelayedStackTraceLoading = self.supportsDelayedStackTraceLoading + supportsLoadedSourcesRequest = self.supportsLoadedSourcesRequest + supportsLogPoints = self.supportsLogPoints + supportsTerminateThreadsRequest = self.supportsTerminateThreadsRequest + supportsSetExpression = self.supportsSetExpression + supportsTerminateRequest = self.supportsTerminateRequest + supportsDataBreakpoints = self.supportsDataBreakpoints + supportsReadMemoryRequest = self.supportsReadMemoryRequest + supportsWriteMemoryRequest = self.supportsWriteMemoryRequest + supportsDisassembleRequest = self.supportsDisassembleRequest + supportsCancelRequest = self.supportsCancelRequest + supportsBreakpointLocationsRequest = self.supportsBreakpointLocationsRequest + supportsClipboardContext = self.supportsClipboardContext + supportsSteppingGranularity = self.supportsSteppingGranularity + supportsInstructionBreakpoints = self.supportsInstructionBreakpoints + supportsExceptionFilterOptions = self.supportsExceptionFilterOptions + supportsSingleThreadExecutionRequests = self.supportsSingleThreadExecutionRequests + dct = {} + if supportsConfigurationDoneRequest is not None: + dct["supportsConfigurationDoneRequest"] = supportsConfigurationDoneRequest + if supportsFunctionBreakpoints is not None: + dct["supportsFunctionBreakpoints"] = supportsFunctionBreakpoints + if supportsConditionalBreakpoints is not None: + dct["supportsConditionalBreakpoints"] = supportsConditionalBreakpoints + if supportsHitConditionalBreakpoints is not None: + dct["supportsHitConditionalBreakpoints"] = supportsHitConditionalBreakpoints + if supportsEvaluateForHovers is not None: + dct["supportsEvaluateForHovers"] = supportsEvaluateForHovers + if exceptionBreakpointFilters is not None: + dct["exceptionBreakpointFilters"] = ( + [ExceptionBreakpointsFilter.update_dict_ids_to_dap(o) for o in exceptionBreakpointFilters] + if (update_ids_to_dap and exceptionBreakpointFilters) + else exceptionBreakpointFilters + ) + if supportsStepBack is not None: + dct["supportsStepBack"] = supportsStepBack + if supportsSetVariable is not None: + dct["supportsSetVariable"] = supportsSetVariable + if supportsRestartFrame is not None: + dct["supportsRestartFrame"] = supportsRestartFrame + if supportsGotoTargetsRequest is not None: + dct["supportsGotoTargetsRequest"] = supportsGotoTargetsRequest + if supportsStepInTargetsRequest is not None: + dct["supportsStepInTargetsRequest"] = supportsStepInTargetsRequest + if supportsCompletionsRequest is not None: + dct["supportsCompletionsRequest"] = supportsCompletionsRequest + if completionTriggerCharacters is not None: + dct["completionTriggerCharacters"] = completionTriggerCharacters + if supportsModulesRequest is not None: + dct["supportsModulesRequest"] = supportsModulesRequest + if additionalModuleColumns is not None: + dct["additionalModuleColumns"] = ( + [ColumnDescriptor.update_dict_ids_to_dap(o) for o in additionalModuleColumns] + if (update_ids_to_dap and additionalModuleColumns) + else additionalModuleColumns + ) + if supportedChecksumAlgorithms is not None: + dct["supportedChecksumAlgorithms"] = ( + [ChecksumAlgorithm.update_dict_ids_to_dap(o) for o in supportedChecksumAlgorithms] + if (update_ids_to_dap and supportedChecksumAlgorithms) + else supportedChecksumAlgorithms + ) + if supportsRestartRequest is not None: + dct["supportsRestartRequest"] = supportsRestartRequest + if supportsExceptionOptions is not None: + dct["supportsExceptionOptions"] = supportsExceptionOptions + if supportsValueFormattingOptions is not None: + dct["supportsValueFormattingOptions"] = supportsValueFormattingOptions + if supportsExceptionInfoRequest is not None: + dct["supportsExceptionInfoRequest"] = supportsExceptionInfoRequest + if supportTerminateDebuggee is not None: + dct["supportTerminateDebuggee"] = supportTerminateDebuggee + if supportSuspendDebuggee is not None: + dct["supportSuspendDebuggee"] = supportSuspendDebuggee + if supportsDelayedStackTraceLoading is not None: + dct["supportsDelayedStackTraceLoading"] = supportsDelayedStackTraceLoading + if supportsLoadedSourcesRequest is not None: + dct["supportsLoadedSourcesRequest"] = supportsLoadedSourcesRequest + if supportsLogPoints is not None: + dct["supportsLogPoints"] = supportsLogPoints + if supportsTerminateThreadsRequest is not None: + dct["supportsTerminateThreadsRequest"] = supportsTerminateThreadsRequest + if supportsSetExpression is not None: + dct["supportsSetExpression"] = supportsSetExpression + if supportsTerminateRequest is not None: + dct["supportsTerminateRequest"] = supportsTerminateRequest + if supportsDataBreakpoints is not None: + dct["supportsDataBreakpoints"] = supportsDataBreakpoints + if supportsReadMemoryRequest is not None: + dct["supportsReadMemoryRequest"] = supportsReadMemoryRequest + if supportsWriteMemoryRequest is not None: + dct["supportsWriteMemoryRequest"] = supportsWriteMemoryRequest + if supportsDisassembleRequest is not None: + dct["supportsDisassembleRequest"] = supportsDisassembleRequest + if supportsCancelRequest is not None: + dct["supportsCancelRequest"] = supportsCancelRequest + if supportsBreakpointLocationsRequest is not None: + dct["supportsBreakpointLocationsRequest"] = supportsBreakpointLocationsRequest + if supportsClipboardContext is not None: + dct["supportsClipboardContext"] = supportsClipboardContext + if supportsSteppingGranularity is not None: + dct["supportsSteppingGranularity"] = supportsSteppingGranularity + if supportsInstructionBreakpoints is not None: + dct["supportsInstructionBreakpoints"] = supportsInstructionBreakpoints + if supportsExceptionFilterOptions is not None: + dct["supportsExceptionFilterOptions"] = supportsExceptionFilterOptions + if supportsSingleThreadExecutionRequests is not None: + dct["supportsSingleThreadExecutionRequests"] = supportsSingleThreadExecutionRequests + dct.update(self.kwargs) + return dct + + +@register +class ExceptionBreakpointsFilter(BaseSchema): + """ + An `ExceptionBreakpointsFilter` is shown in the UI as an filter option for configuring how + exceptions are dealt with. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "filter": { + "type": "string", + "description": "The internal ID of the filter option. This value is passed to the `setExceptionBreakpoints` request.", + }, + "label": {"type": "string", "description": "The name of the filter option. This is shown in the UI."}, + "description": { + "type": "string", + "description": "A help text providing additional information about the exception filter. This string is typically shown as a hover and can be translated.", + }, + "default": {"type": "boolean", "description": "Initial value of the filter option. If not specified a value false is assumed."}, + "supportsCondition": { + "type": "boolean", + "description": "Controls whether a condition can be specified for this filter option. If false or missing, a condition can not be set.", + }, + "conditionDescription": { + "type": "string", + "description": "A help text providing information about the condition. This string is shown as the placeholder text for a text box and can be translated.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + filter, + label, + description=None, + default=None, + supportsCondition=None, + conditionDescription=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string filter: The internal ID of the filter option. This value is passed to the `setExceptionBreakpoints` request. + :param string label: The name of the filter option. This is shown in the UI. + :param string description: A help text providing additional information about the exception filter. This string is typically shown as a hover and can be translated. + :param boolean default: Initial value of the filter option. If not specified a value false is assumed. + :param boolean supportsCondition: Controls whether a condition can be specified for this filter option. If false or missing, a condition can not be set. + :param string conditionDescription: A help text providing information about the condition. This string is shown as the placeholder text for a text box and can be translated. + """ + self.filter = filter + self.label = label + self.description = description + self.default = default + self.supportsCondition = supportsCondition + self.conditionDescription = conditionDescription + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + filter = self.filter # noqa (assign to builtin) + label = self.label + description = self.description + default = self.default + supportsCondition = self.supportsCondition + conditionDescription = self.conditionDescription + dct = { + "filter": filter, + "label": label, + } + if description is not None: + dct["description"] = description + if default is not None: + dct["default"] = default + if supportsCondition is not None: + dct["supportsCondition"] = supportsCondition + if conditionDescription is not None: + dct["conditionDescription"] = conditionDescription + dct.update(self.kwargs) + return dct + + +@register +class Message(BaseSchema): + """ + A structured message object. Used to return errors from requests. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "id": { + "type": "integer", + "description": "Unique (within a debug adapter implementation) identifier for the message. The purpose of these error IDs is to help extension authors that have the requirement that every user visible error message needs a corresponding error number, so that users or customer support can find information about the specific error more easily.", + }, + "format": { + "type": "string", + "description": "A format string for the message. Embedded variables have the form `{name}`.\nIf variable name starts with an underscore character, the variable does not contain user data (PII) and can be safely used for telemetry purposes.", + }, + "variables": { + "type": "object", + "description": "An object used as a dictionary for looking up the variables in the format string.", + "additionalProperties": {"type": "string", "description": "All dictionary values must be strings."}, + }, + "sendTelemetry": {"type": "boolean", "description": "If True send to telemetry."}, + "showUser": {"type": "boolean", "description": "If True show user."}, + "url": {"type": "string", "description": "A url where additional information about this message can be found."}, + "urlLabel": {"type": "string", "description": "A label that is presented to the user as the UI for opening the url."}, + } + __refs__ = set(["variables"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, id, format, variables=None, sendTelemetry=None, showUser=None, url=None, urlLabel=None, update_ids_from_dap=False, **kwargs + ): # noqa (update_ids_from_dap may be unused) + """ + :param integer id: Unique (within a debug adapter implementation) identifier for the message. The purpose of these error IDs is to help extension authors that have the requirement that every user visible error message needs a corresponding error number, so that users or customer support can find information about the specific error more easily. + :param string format: A format string for the message. Embedded variables have the form `{name}`. + If variable name starts with an underscore character, the variable does not contain user data (PII) and can be safely used for telemetry purposes. + :param MessageVariables variables: An object used as a dictionary for looking up the variables in the format string. + :param boolean sendTelemetry: If true send to telemetry. + :param boolean showUser: If true show user. + :param string url: A url where additional information about this message can be found. + :param string urlLabel: A label that is presented to the user as the UI for opening the url. + """ + self.id = id + self.format = format + if variables is None: + self.variables = MessageVariables() + else: + self.variables = ( + MessageVariables(update_ids_from_dap=update_ids_from_dap, **variables) + if variables.__class__ != MessageVariables + else variables + ) + self.sendTelemetry = sendTelemetry + self.showUser = showUser + self.url = url + self.urlLabel = urlLabel + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + id = self.id # noqa (assign to builtin) + format = self.format # noqa (assign to builtin) + variables = self.variables + sendTelemetry = self.sendTelemetry + showUser = self.showUser + url = self.url + urlLabel = self.urlLabel + dct = { + "id": id, + "format": format, + } + if variables is not None: + dct["variables"] = variables.to_dict(update_ids_to_dap=update_ids_to_dap) + if sendTelemetry is not None: + dct["sendTelemetry"] = sendTelemetry + if showUser is not None: + dct["showUser"] = showUser + if url is not None: + dct["url"] = url + if urlLabel is not None: + dct["urlLabel"] = urlLabel + dct.update(self.kwargs) + return dct + + +@register +class Module(BaseSchema): + """ + A Module object represents a row in the modules view. + + The `id` attribute identifies a module in the modules view and is used in a `module` event for + identifying a module for adding, updating or deleting. + + The `name` attribute is used to minimally render the module in the UI. + + + Additional attributes can be added to the module. They show up in the module view if they have a + corresponding `ColumnDescriptor`. + + + To avoid an unnecessary proliferation of additional attributes with similar semantics but different + names, we recommend to re-use attributes from the 'recommended' list below first, and only introduce + new attributes if nothing appropriate could be found. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "id": {"type": ["integer", "string"], "description": "Unique identifier for the module."}, + "name": {"type": "string", "description": "A name of the module."}, + "path": { + "type": "string", + "description": "Logical full path to the module. The exact definition is implementation defined, but usually this would be a full path to the on-disk file for the module.", + }, + "isOptimized": {"type": "boolean", "description": "True if the module is optimized."}, + "isUserCode": { + "type": "boolean", + "description": "True if the module is considered 'user code' by a debugger that supports 'Just My Code'.", + }, + "version": {"type": "string", "description": "Version of Module."}, + "symbolStatus": { + "type": "string", + "description": "User-understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not found', etc.)", + }, + "symbolFilePath": { + "type": "string", + "description": "Logical full path to the symbol file. The exact definition is implementation defined.", + }, + "dateTimeStamp": {"type": "string", "description": "Module created or modified, encoded as a RFC 3339 timestamp."}, + "addressRange": {"type": "string", "description": "Address range covered by this module."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + id, + name, + path=None, + isOptimized=None, + isUserCode=None, + version=None, + symbolStatus=None, + symbolFilePath=None, + dateTimeStamp=None, + addressRange=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param ['integer', 'string'] id: Unique identifier for the module. + :param string name: A name of the module. + :param string path: Logical full path to the module. The exact definition is implementation defined, but usually this would be a full path to the on-disk file for the module. + :param boolean isOptimized: True if the module is optimized. + :param boolean isUserCode: True if the module is considered 'user code' by a debugger that supports 'Just My Code'. + :param string version: Version of Module. + :param string symbolStatus: User-understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not found', etc.) + :param string symbolFilePath: Logical full path to the symbol file. The exact definition is implementation defined. + :param string dateTimeStamp: Module created or modified, encoded as a RFC 3339 timestamp. + :param string addressRange: Address range covered by this module. + """ + self.id = id + self.name = name + self.path = path + self.isOptimized = isOptimized + self.isUserCode = isUserCode + self.version = version + self.symbolStatus = symbolStatus + self.symbolFilePath = symbolFilePath + self.dateTimeStamp = dateTimeStamp + self.addressRange = addressRange + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + id = self.id # noqa (assign to builtin) + name = self.name + path = self.path + isOptimized = self.isOptimized + isUserCode = self.isUserCode + version = self.version + symbolStatus = self.symbolStatus + symbolFilePath = self.symbolFilePath + dateTimeStamp = self.dateTimeStamp + addressRange = self.addressRange + dct = { + "id": id, + "name": name, + } + if path is not None: + dct["path"] = path + if isOptimized is not None: + dct["isOptimized"] = isOptimized + if isUserCode is not None: + dct["isUserCode"] = isUserCode + if version is not None: + dct["version"] = version + if symbolStatus is not None: + dct["symbolStatus"] = symbolStatus + if symbolFilePath is not None: + dct["symbolFilePath"] = symbolFilePath + if dateTimeStamp is not None: + dct["dateTimeStamp"] = dateTimeStamp + if addressRange is not None: + dct["addressRange"] = addressRange + dct.update(self.kwargs) + return dct + + +@register +class ColumnDescriptor(BaseSchema): + """ + A `ColumnDescriptor` specifies what module attribute to show in a column of the modules view, how to + format it, + + and what the column's label should be. + + It is only used if the underlying UI actually supports this level of customization. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "attributeName": {"type": "string", "description": "Name of the attribute rendered in this column."}, + "label": {"type": "string", "description": "Header UI label of column."}, + "format": { + "type": "string", + "description": "Format to use for the rendered values in this column. TBD how the format strings looks like.", + }, + "type": { + "type": "string", + "enum": ["string", "number", "boolean", "unixTimestampUTC"], + "description": "Datatype of values in this column. Defaults to `string` if not specified.", + }, + "width": {"type": "integer", "description": "Width of this column in characters (hint only)."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, attributeName, label, format=None, type=None, width=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string attributeName: Name of the attribute rendered in this column. + :param string label: Header UI label of column. + :param string format: Format to use for the rendered values in this column. TBD how the format strings looks like. + :param string type: Datatype of values in this column. Defaults to `string` if not specified. + :param integer width: Width of this column in characters (hint only). + """ + self.attributeName = attributeName + self.label = label + self.format = format + self.type = type + self.width = width + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + attributeName = self.attributeName + label = self.label + format = self.format # noqa (assign to builtin) + type = self.type # noqa (assign to builtin) + width = self.width + dct = { + "attributeName": attributeName, + "label": label, + } + if format is not None: + dct["format"] = format + if type is not None: + dct["type"] = type + if width is not None: + dct["width"] = width + dct.update(self.kwargs) + return dct + + +@register +class Thread(BaseSchema): + """ + A Thread + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "id": {"type": "integer", "description": "Unique identifier for the thread."}, + "name": {"type": "string", "description": "The name of the thread."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, id, name, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer id: Unique identifier for the thread. + :param string name: The name of the thread. + """ + self.id = id + self.name = name + if update_ids_from_dap: + self.id = self._translate_id_from_dap(self.id) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "id" in dct: + dct["id"] = cls._translate_id_from_dap(dct["id"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + id = self.id # noqa (assign to builtin) + name = self.name + if update_ids_to_dap: + if id is not None: + id = self._translate_id_to_dap(id) # noqa (assign to builtin) + dct = { + "id": id, + "name": name, + } + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "id" in dct: + dct["id"] = cls._translate_id_to_dap(dct["id"]) + return dct + + +@register +class Source(BaseSchema): + """ + A `Source` is a descriptor for source code. + + It is returned from the debug adapter as part of a `StackFrame` and it is used by clients when + specifying breakpoints. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "name": { + "type": "string", + "description": "The short name of the source. Every source returned from the debug adapter has a name.\nWhen sending a source to the debug adapter this name is optional.", + }, + "path": { + "type": "string", + "description": "The path of the source to be shown in the UI.\nIt is only used to locate and load the content of the source if no `sourceReference` is specified (or its value is 0).", + }, + "sourceReference": { + "type": "integer", + "description": "If the value > 0 the contents of the source must be retrieved through the `source` request (even if a path is specified).\nSince a `sourceReference` is only valid for a session, it can not be used to persist a source.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "presentationHint": { + "type": "string", + "description": "A hint for how to present the source in the UI.\nA value of `deemphasize` can be used to indicate that the source is not available or that it is skipped on stepping.", + "enum": ["normal", "emphasize", "deemphasize"], + }, + "origin": { + "type": "string", + "description": "The origin of this source. For example, 'internal module', 'inlined content from source map', etc.", + }, + "sources": { + "type": "array", + "items": {"$ref": "#/definitions/Source"}, + "description": "A list of sources that are related to this source. These may be the source that generated this source.", + }, + "adapterData": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Additional data that a debug adapter might want to loop through the client.\nThe client should leave the data intact and persist it across sessions. The client should not interpret the data.", + }, + "checksums": { + "type": "array", + "items": {"$ref": "#/definitions/Checksum"}, + "description": "The checksums associated with this file.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + name=None, + path=None, + sourceReference=None, + presentationHint=None, + origin=None, + sources=None, + adapterData=None, + checksums=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string name: The short name of the source. Every source returned from the debug adapter has a name. + When sending a source to the debug adapter this name is optional. + :param string path: The path of the source to be shown in the UI. + It is only used to locate and load the content of the source if no `sourceReference` is specified (or its value is 0). + :param integer sourceReference: If the value > 0 the contents of the source must be retrieved through the `source` request (even if a path is specified). + Since a `sourceReference` is only valid for a session, it can not be used to persist a source. + The value should be less than or equal to 2147483647 (2^31-1). + :param string presentationHint: A hint for how to present the source in the UI. + A value of `deemphasize` can be used to indicate that the source is not available or that it is skipped on stepping. + :param string origin: The origin of this source. For example, 'internal module', 'inlined content from source map', etc. + :param array sources: A list of sources that are related to this source. These may be the source that generated this source. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] adapterData: Additional data that a debug adapter might want to loop through the client. + The client should leave the data intact and persist it across sessions. The client should not interpret the data. + :param array checksums: The checksums associated with this file. + """ + self.name = name + self.path = path + self.sourceReference = sourceReference + self.presentationHint = presentationHint + self.origin = origin + self.sources = sources + if update_ids_from_dap and self.sources: + for o in self.sources: + Source.update_dict_ids_from_dap(o) + self.adapterData = adapterData + self.checksums = checksums + if update_ids_from_dap and self.checksums: + for o in self.checksums: + Checksum.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + name = self.name + path = self.path + sourceReference = self.sourceReference + presentationHint = self.presentationHint + origin = self.origin + sources = self.sources + if sources and hasattr(sources[0], "to_dict"): + sources = [x.to_dict() for x in sources] + adapterData = self.adapterData + checksums = self.checksums + if checksums and hasattr(checksums[0], "to_dict"): + checksums = [x.to_dict() for x in checksums] + dct = {} + if name is not None: + dct["name"] = name + if path is not None: + dct["path"] = path + if sourceReference is not None: + dct["sourceReference"] = sourceReference + if presentationHint is not None: + dct["presentationHint"] = presentationHint + if origin is not None: + dct["origin"] = origin + if sources is not None: + dct["sources"] = [Source.update_dict_ids_to_dap(o) for o in sources] if (update_ids_to_dap and sources) else sources + if adapterData is not None: + dct["adapterData"] = adapterData + if checksums is not None: + dct["checksums"] = [Checksum.update_dict_ids_to_dap(o) for o in checksums] if (update_ids_to_dap and checksums) else checksums + dct.update(self.kwargs) + return dct + + +@register +class StackFrame(BaseSchema): + """ + A Stackframe contains the source location. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "id": { + "type": "integer", + "description": "An identifier for the stack frame. It must be unique across all threads.\nThis id can be used to retrieve the scopes of the frame with the `scopes` request or to restart the execution of a stack frame.", + }, + "name": {"type": "string", "description": "The name of the stack frame, typically a method name."}, + "source": {"description": "The source of the frame.", "type": "Source"}, + "line": { + "type": "integer", + "description": "The line within the source of the frame. If the source attribute is missing or doesn't exist, `line` is 0 and should be ignored by the client.", + }, + "column": { + "type": "integer", + "description": "Start position of the range covered by the stack frame. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If attribute `source` is missing or doesn't exist, `column` is 0 and should be ignored by the client.", + }, + "endLine": {"type": "integer", "description": "The end line of the range covered by the stack frame."}, + "endColumn": { + "type": "integer", + "description": "End position of the range covered by the stack frame. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "canRestart": { + "type": "boolean", + "description": "Indicates whether this frame can be restarted with the `restart` request. Clients should only use this if the debug adapter supports the `restart` request and the corresponding capability `supportsRestartRequest` is True. If a debug adapter has this capability, then `canRestart` defaults to `True` if the property is absent.", + }, + "instructionPointerReference": { + "type": "string", + "description": "A memory reference for the current instruction pointer in this frame.", + }, + "moduleId": {"type": ["integer", "string"], "description": "The module associated with this frame, if any."}, + "presentationHint": { + "type": "string", + "enum": ["normal", "label", "subtle"], + "description": "A hint for how to present this frame in the UI.\nA value of `label` can be used to indicate that the frame is an artificial frame that is used as a visual label or separator. A value of `subtle` can be used to change the appearance of a frame in a 'subtle' way.", + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + id, + name, + line, + column, + source=None, + endLine=None, + endColumn=None, + canRestart=None, + instructionPointerReference=None, + moduleId=None, + presentationHint=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param integer id: An identifier for the stack frame. It must be unique across all threads. + This id can be used to retrieve the scopes of the frame with the `scopes` request or to restart the execution of a stack frame. + :param string name: The name of the stack frame, typically a method name. + :param integer line: The line within the source of the frame. If the source attribute is missing or doesn't exist, `line` is 0 and should be ignored by the client. + :param integer column: Start position of the range covered by the stack frame. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If attribute `source` is missing or doesn't exist, `column` is 0 and should be ignored by the client. + :param Source source: The source of the frame. + :param integer endLine: The end line of the range covered by the stack frame. + :param integer endColumn: End position of the range covered by the stack frame. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + :param boolean canRestart: Indicates whether this frame can be restarted with the `restart` request. Clients should only use this if the debug adapter supports the `restart` request and the corresponding capability `supportsRestartRequest` is true. If a debug adapter has this capability, then `canRestart` defaults to `true` if the property is absent. + :param string instructionPointerReference: A memory reference for the current instruction pointer in this frame. + :param ['integer', 'string'] moduleId: The module associated with this frame, if any. + :param string presentationHint: A hint for how to present this frame in the UI. + A value of `label` can be used to indicate that the frame is an artificial frame that is used as a visual label or separator. A value of `subtle` can be used to change the appearance of a frame in a 'subtle' way. + """ + self.id = id + self.name = name + self.line = line + self.column = column + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.endLine = endLine + self.endColumn = endColumn + self.canRestart = canRestart + self.instructionPointerReference = instructionPointerReference + self.moduleId = moduleId + self.presentationHint = presentationHint + if update_ids_from_dap: + self.id = self._translate_id_from_dap(self.id) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "id" in dct: + dct["id"] = cls._translate_id_from_dap(dct["id"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + id = self.id # noqa (assign to builtin) + name = self.name + line = self.line + column = self.column + source = self.source + endLine = self.endLine + endColumn = self.endColumn + canRestart = self.canRestart + instructionPointerReference = self.instructionPointerReference + moduleId = self.moduleId + presentationHint = self.presentationHint + if update_ids_to_dap: + if id is not None: + id = self._translate_id_to_dap(id) # noqa (assign to builtin) + dct = { + "id": id, + "name": name, + "line": line, + "column": column, + } + if source is not None: + dct["source"] = source.to_dict(update_ids_to_dap=update_ids_to_dap) + if endLine is not None: + dct["endLine"] = endLine + if endColumn is not None: + dct["endColumn"] = endColumn + if canRestart is not None: + dct["canRestart"] = canRestart + if instructionPointerReference is not None: + dct["instructionPointerReference"] = instructionPointerReference + if moduleId is not None: + dct["moduleId"] = moduleId + if presentationHint is not None: + dct["presentationHint"] = presentationHint + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "id" in dct: + dct["id"] = cls._translate_id_to_dap(dct["id"]) + return dct + + +@register +class Scope(BaseSchema): + """ + A `Scope` is a named container for variables. Optionally a scope can map to a source or a range + within a source. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "name": { + "type": "string", + "description": "Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This string is shown in the UI as is and can be translated.", + }, + "presentationHint": { + "type": "string", + "description": "A hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with a generic UI.", + "_enum": ["arguments", "locals", "registers"], + "enumDescriptions": [ + "Scope contains method arguments.", + "Scope contains local variables.", + "Scope contains registers. Only a single `registers` scope should be returned from a `scopes` request.", + ], + }, + "variablesReference": { + "type": "integer", + "description": "The variables of this scope can be retrieved by passing the value of `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "namedVariables": { + "type": "integer", + "description": "The number of named variables in this scope.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.", + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed variables in this scope.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.", + }, + "expensive": { + "type": "boolean", + "description": "If True, the number of variables in this scope is large or expensive to retrieve.", + }, + "source": {"description": "The source for this scope.", "type": "Source"}, + "line": {"type": "integer", "description": "The start line of the range covered by this scope."}, + "column": { + "type": "integer", + "description": "Start position of the range covered by the scope. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "endLine": {"type": "integer", "description": "The end line of the range covered by this scope."}, + "endColumn": { + "type": "integer", + "description": "End position of the range covered by the scope. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + name, + variablesReference, + expensive, + presentationHint=None, + namedVariables=None, + indexedVariables=None, + source=None, + line=None, + column=None, + endLine=None, + endColumn=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string name: Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This string is shown in the UI as is and can be translated. + :param integer variablesReference: The variables of this scope can be retrieved by passing the value of `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details. + :param boolean expensive: If true, the number of variables in this scope is large or expensive to retrieve. + :param string presentationHint: A hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with a generic UI. + :param integer namedVariables: The number of named variables in this scope. + The client can use this information to present the variables in a paged UI and fetch them in chunks. + :param integer indexedVariables: The number of indexed variables in this scope. + The client can use this information to present the variables in a paged UI and fetch them in chunks. + :param Source source: The source for this scope. + :param integer line: The start line of the range covered by this scope. + :param integer column: Start position of the range covered by the scope. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + :param integer endLine: The end line of the range covered by this scope. + :param integer endColumn: End position of the range covered by the scope. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + """ + self.name = name + self.variablesReference = variablesReference + self.expensive = expensive + self.presentationHint = presentationHint + self.namedVariables = namedVariables + self.indexedVariables = indexedVariables + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.line = line + self.column = column + self.endLine = endLine + self.endColumn = endColumn + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + name = self.name + variablesReference = self.variablesReference + expensive = self.expensive + presentationHint = self.presentationHint + namedVariables = self.namedVariables + indexedVariables = self.indexedVariables + source = self.source + line = self.line + column = self.column + endLine = self.endLine + endColumn = self.endColumn + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + dct = { + "name": name, + "variablesReference": variablesReference, + "expensive": expensive, + } + if presentationHint is not None: + dct["presentationHint"] = presentationHint + if namedVariables is not None: + dct["namedVariables"] = namedVariables + if indexedVariables is not None: + dct["indexedVariables"] = indexedVariables + if source is not None: + dct["source"] = source.to_dict(update_ids_to_dap=update_ids_to_dap) + if line is not None: + dct["line"] = line + if column is not None: + dct["column"] = column + if endLine is not None: + dct["endLine"] = endLine + if endColumn is not None: + dct["endColumn"] = endColumn + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + return dct + + +@register +class Variable(BaseSchema): + """ + A Variable is a name/value pair. + + The `type` attribute is shown if space permits or when hovering over the variable's name. + + The `kind` attribute is used to render additional properties of the variable, e.g. different icons + can be used to indicate that a variable is public or private. + + If the value is structured (has children), a handle is provided to retrieve the children with the + `variables` request. + + If the number of named or indexed children is large, the numbers should be returned via the + `namedVariables` and `indexedVariables` attributes. + + The client can use this information to present the children in a paged UI and fetch them in chunks. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "name": {"type": "string", "description": "The variable's name."}, + "value": { + "type": "string", + "description": "The variable's value.\nThis can be a multi-line text, e.g. for a function the body of a function.\nFor structured variables (which do not have a simple value), it is recommended to provide a one-line representation of the structured object. This helps to identify the structured object in the collapsed state when its children are not yet visible.\nAn empty string can be used if no value should be shown in the UI.", + }, + "type": { + "type": "string", + "description": "The type of the variable's value. Typically shown in the UI when hovering over the value.\nThis attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is True.", + }, + "presentationHint": { + "description": "Properties of a variable that can be used to determine how to render the variable in the UI.", + "type": "VariablePresentationHint", + }, + "evaluateName": { + "type": "string", + "description": "The evaluatable name of this variable which can be passed to the `evaluate` request to fetch the variable's value.", + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the variable is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the children in a paged UI and fetch them in chunks.", + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the children in a paged UI and fetch them in chunks.", + }, + "memoryReference": { + "type": "string", + "description": "A memory reference associated with this variable.\nFor pointer type variables, this is generally a reference to the memory address contained in the pointer.\nFor executable data, this reference may later be used in a `disassemble` request.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is True.", + }, + } + __refs__ = set(["presentationHint"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + name, + value, + variablesReference, + type=None, + presentationHint=None, + evaluateName=None, + namedVariables=None, + indexedVariables=None, + memoryReference=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string name: The variable's name. + :param string value: The variable's value. + This can be a multi-line text, e.g. for a function the body of a function. + For structured variables (which do not have a simple value), it is recommended to provide a one-line representation of the structured object. This helps to identify the structured object in the collapsed state when its children are not yet visible. + An empty string can be used if no value should be shown in the UI. + :param integer variablesReference: If `variablesReference` is > 0, the variable is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details. + :param string type: The type of the variable's value. Typically shown in the UI when hovering over the value. + This attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is true. + :param VariablePresentationHint presentationHint: Properties of a variable that can be used to determine how to render the variable in the UI. + :param string evaluateName: The evaluatable name of this variable which can be passed to the `evaluate` request to fetch the variable's value. + :param integer namedVariables: The number of named child variables. + The client can use this information to present the children in a paged UI and fetch them in chunks. + :param integer indexedVariables: The number of indexed child variables. + The client can use this information to present the children in a paged UI and fetch them in chunks. + :param string memoryReference: A memory reference associated with this variable. + For pointer type variables, this is generally a reference to the memory address contained in the pointer. + For executable data, this reference may later be used in a `disassemble` request. + This attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is true. + """ + self.name = name + self.value = value + self.variablesReference = variablesReference + self.type = type + if presentationHint is None: + self.presentationHint = VariablePresentationHint() + else: + self.presentationHint = ( + VariablePresentationHint(update_ids_from_dap=update_ids_from_dap, **presentationHint) + if presentationHint.__class__ != VariablePresentationHint + else presentationHint + ) + self.evaluateName = evaluateName + self.namedVariables = namedVariables + self.indexedVariables = indexedVariables + self.memoryReference = memoryReference + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + name = self.name + value = self.value + variablesReference = self.variablesReference + type = self.type # noqa (assign to builtin) + presentationHint = self.presentationHint + evaluateName = self.evaluateName + namedVariables = self.namedVariables + indexedVariables = self.indexedVariables + memoryReference = self.memoryReference + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + dct = { + "name": name, + "value": value, + "variablesReference": variablesReference, + } + if type is not None: + dct["type"] = type + if presentationHint is not None: + dct["presentationHint"] = presentationHint.to_dict(update_ids_to_dap=update_ids_to_dap) + if evaluateName is not None: + dct["evaluateName"] = evaluateName + if namedVariables is not None: + dct["namedVariables"] = namedVariables + if indexedVariables is not None: + dct["indexedVariables"] = indexedVariables + if memoryReference is not None: + dct["memoryReference"] = memoryReference + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + return dct + + +@register +class VariablePresentationHint(BaseSchema): + """ + Properties of a variable that can be used to determine how to render the variable in the UI. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "kind": { + "description": "The kind of variable. Before introducing additional values, try to use the listed values.", + "type": "string", + "_enum": [ + "property", + "method", + "class", + "data", + "event", + "baseClass", + "innerClass", + "interface", + "mostDerivedClass", + "virtual", + "dataBreakpoint", + ], + "enumDescriptions": [ + "Indicates that the object is a property.", + "Indicates that the object is a method.", + "Indicates that the object is a class.", + "Indicates that the object is data.", + "Indicates that the object is an event.", + "Indicates that the object is a base class.", + "Indicates that the object is an inner class.", + "Indicates that the object is an interface.", + "Indicates that the object is the most derived class.", + "Indicates that the object is virtual, that means it is a synthetic object introduced by the adapter for rendering purposes, e.g. an index range for large arrays.", + "Deprecated: Indicates that a data breakpoint is registered for the object. The `hasDataBreakpoint` attribute should generally be used instead.", + ], + }, + "attributes": { + "description": "Set of attributes represented as an array of strings. Before introducing additional values, try to use the listed values.", + "type": "array", + "items": { + "type": "string", + "_enum": [ + "static", + "constant", + "readOnly", + "rawString", + "hasObjectId", + "canHaveObjectId", + "hasSideEffects", + "hasDataBreakpoint", + ], + "enumDescriptions": [ + "Indicates that the object is static.", + "Indicates that the object is a constant.", + "Indicates that the object is read only.", + "Indicates that the object is a raw string.", + "Indicates that the object can have an Object ID created for it. This is a vestigial attribute that is used by some clients; 'Object ID's are not specified in the protocol.", + "Indicates that the object has an Object ID associated with it. This is a vestigial attribute that is used by some clients; 'Object ID's are not specified in the protocol.", + "Indicates that the evaluation had side effects.", + "Indicates that the object has its value tracked by a data breakpoint.", + ], + }, + }, + "visibility": { + "description": "Visibility of variable. Before introducing additional values, try to use the listed values.", + "type": "string", + "_enum": ["public", "private", "protected", "internal", "final"], + }, + "lazy": { + "description": "If True, clients can present the variable with a UI that supports a specific gesture to trigger its evaluation.\nThis mechanism can be used for properties that require executing code when retrieving their value and where the code execution can be expensive and/or produce side-effects. A typical example are properties based on a getter function.\nPlease note that in addition to the `lazy` flag, the variable's `variablesReference` is expected to refer to a variable that will provide the value through another `variable` request.", + "type": "boolean", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, kind=None, attributes=None, visibility=None, lazy=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string kind: The kind of variable. Before introducing additional values, try to use the listed values. + :param array attributes: Set of attributes represented as an array of strings. Before introducing additional values, try to use the listed values. + :param string visibility: Visibility of variable. Before introducing additional values, try to use the listed values. + :param boolean lazy: If true, clients can present the variable with a UI that supports a specific gesture to trigger its evaluation. + This mechanism can be used for properties that require executing code when retrieving their value and where the code execution can be expensive and/or produce side-effects. A typical example are properties based on a getter function. + Please note that in addition to the `lazy` flag, the variable's `variablesReference` is expected to refer to a variable that will provide the value through another `variable` request. + """ + self.kind = kind + self.attributes = attributes + self.visibility = visibility + self.lazy = lazy + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + kind = self.kind + attributes = self.attributes + if attributes and hasattr(attributes[0], "to_dict"): + attributes = [x.to_dict() for x in attributes] + visibility = self.visibility + lazy = self.lazy + dct = {} + if kind is not None: + dct["kind"] = kind + if attributes is not None: + dct["attributes"] = attributes + if visibility is not None: + dct["visibility"] = visibility + if lazy is not None: + dct["lazy"] = lazy + dct.update(self.kwargs) + return dct + + +@register +class BreakpointLocation(BaseSchema): + """ + Properties of a breakpoint location returned from the `breakpointLocations` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "line": {"type": "integer", "description": "Start line of breakpoint location."}, + "column": { + "type": "integer", + "description": "The start position of a breakpoint location. Position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "endLine": {"type": "integer", "description": "The end line of breakpoint location if the location covers a range."}, + "endColumn": { + "type": "integer", + "description": "The end position of a breakpoint location (if the location covers a range). Position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, line, column=None, endLine=None, endColumn=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer line: Start line of breakpoint location. + :param integer column: The start position of a breakpoint location. Position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + :param integer endLine: The end line of breakpoint location if the location covers a range. + :param integer endColumn: The end position of a breakpoint location (if the location covers a range). Position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + """ + self.line = line + self.column = column + self.endLine = endLine + self.endColumn = endColumn + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + line = self.line + column = self.column + endLine = self.endLine + endColumn = self.endColumn + dct = { + "line": line, + } + if column is not None: + dct["column"] = column + if endLine is not None: + dct["endLine"] = endLine + if endColumn is not None: + dct["endColumn"] = endColumn + dct.update(self.kwargs) + return dct + + +@register +class SourceBreakpoint(BaseSchema): + """ + Properties of a breakpoint or logpoint passed to the `setBreakpoints` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "line": {"type": "integer", "description": "The source line of the breakpoint or logpoint."}, + "column": { + "type": "integer", + "description": "Start position within source line of the breakpoint or logpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "condition": { + "type": "string", + "description": "The expression for conditional breakpoints.\nIt is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is True.", + }, + "hitCondition": { + "type": "string", + "description": "The expression that controls how many hits of the breakpoint are ignored.\nThe debug adapter is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is True.\nIf both this property and `condition` are specified, `hitCondition` should be evaluated only if the `condition` is met, and the debug adapter should stop only if both conditions are met.", + }, + "logMessage": { + "type": "string", + "description": "If this attribute exists and is non-empty, the debug adapter must not 'break' (stop)\nbut log the message instead. Expressions within `{}` are interpolated.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsLogPoints` is True.\nIf either `hitCondition` or `condition` is specified, then the message should only be logged if those conditions are met.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, line, column=None, condition=None, hitCondition=None, logMessage=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer line: The source line of the breakpoint or logpoint. + :param integer column: Start position within source line of the breakpoint or logpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + :param string condition: The expression for conditional breakpoints. + It is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is true. + :param string hitCondition: The expression that controls how many hits of the breakpoint are ignored. + The debug adapter is expected to interpret the expression as needed. + The attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is true. + If both this property and `condition` are specified, `hitCondition` should be evaluated only if the `condition` is met, and the debug adapter should stop only if both conditions are met. + :param string logMessage: If this attribute exists and is non-empty, the debug adapter must not 'break' (stop) + but log the message instead. Expressions within `{}` are interpolated. + The attribute is only honored by a debug adapter if the corresponding capability `supportsLogPoints` is true. + If either `hitCondition` or `condition` is specified, then the message should only be logged if those conditions are met. + """ + self.line = line + self.column = column + self.condition = condition + self.hitCondition = hitCondition + self.logMessage = logMessage + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + line = self.line + column = self.column + condition = self.condition + hitCondition = self.hitCondition + logMessage = self.logMessage + dct = { + "line": line, + } + if column is not None: + dct["column"] = column + if condition is not None: + dct["condition"] = condition + if hitCondition is not None: + dct["hitCondition"] = hitCondition + if logMessage is not None: + dct["logMessage"] = logMessage + dct.update(self.kwargs) + return dct + + +@register +class FunctionBreakpoint(BaseSchema): + """ + Properties of a breakpoint passed to the `setFunctionBreakpoints` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "name": {"type": "string", "description": "The name of the function."}, + "condition": { + "type": "string", + "description": "An expression for conditional breakpoints.\nIt is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is True.", + }, + "hitCondition": { + "type": "string", + "description": "An expression that controls how many hits of the breakpoint are ignored.\nThe debug adapter is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is True.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, name, condition=None, hitCondition=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string name: The name of the function. + :param string condition: An expression for conditional breakpoints. + It is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is true. + :param string hitCondition: An expression that controls how many hits of the breakpoint are ignored. + The debug adapter is expected to interpret the expression as needed. + The attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is true. + """ + self.name = name + self.condition = condition + self.hitCondition = hitCondition + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + name = self.name + condition = self.condition + hitCondition = self.hitCondition + dct = { + "name": name, + } + if condition is not None: + dct["condition"] = condition + if hitCondition is not None: + dct["hitCondition"] = hitCondition + dct.update(self.kwargs) + return dct + + +@register +class DataBreakpointAccessType(BaseSchema): + """ + This enumeration defines all possible access types for data breakpoints. + + Note: automatically generated code. Do not edit manually. + """ + + READ = "read" + WRITE = "write" + READWRITE = "readWrite" + + VALID_VALUES = set(["read", "write", "readWrite"]) + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register +class DataBreakpoint(BaseSchema): + """ + Properties of a data breakpoint passed to the `setDataBreakpoints` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "dataId": { + "type": "string", + "description": "An id representing the data. This id is returned from the `dataBreakpointInfo` request.", + }, + "accessType": {"description": "The access type of the data.", "type": "DataBreakpointAccessType"}, + "condition": {"type": "string", "description": "An expression for conditional breakpoints."}, + "hitCondition": { + "type": "string", + "description": "An expression that controls how many hits of the breakpoint are ignored.\nThe debug adapter is expected to interpret the expression as needed.", + }, + } + __refs__ = set(["accessType"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, dataId, accessType=None, condition=None, hitCondition=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string dataId: An id representing the data. This id is returned from the `dataBreakpointInfo` request. + :param DataBreakpointAccessType accessType: The access type of the data. + :param string condition: An expression for conditional breakpoints. + :param string hitCondition: An expression that controls how many hits of the breakpoint are ignored. + The debug adapter is expected to interpret the expression as needed. + """ + self.dataId = dataId + if accessType is not None: + assert accessType in DataBreakpointAccessType.VALID_VALUES + self.accessType = accessType + self.condition = condition + self.hitCondition = hitCondition + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dataId = self.dataId + accessType = self.accessType + condition = self.condition + hitCondition = self.hitCondition + dct = { + "dataId": dataId, + } + if accessType is not None: + dct["accessType"] = accessType + if condition is not None: + dct["condition"] = condition + if hitCondition is not None: + dct["hitCondition"] = hitCondition + dct.update(self.kwargs) + return dct + + +@register +class InstructionBreakpoint(BaseSchema): + """ + Properties of a breakpoint passed to the `setInstructionBreakpoints` request + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "instructionReference": { + "type": "string", + "description": "The instruction reference of the breakpoint.\nThis should be a memory or instruction pointer reference from an `EvaluateResponse`, `Variable`, `StackFrame`, `GotoTarget`, or `Breakpoint`.", + }, + "offset": {"type": "integer", "description": "The offset from the instruction reference in bytes.\nThis can be negative."}, + "condition": { + "type": "string", + "description": "An expression for conditional breakpoints.\nIt is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is True.", + }, + "hitCondition": { + "type": "string", + "description": "An expression that controls how many hits of the breakpoint are ignored.\nThe debug adapter is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is True.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, instructionReference, offset=None, condition=None, hitCondition=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string instructionReference: The instruction reference of the breakpoint. + This should be a memory or instruction pointer reference from an `EvaluateResponse`, `Variable`, `StackFrame`, `GotoTarget`, or `Breakpoint`. + :param integer offset: The offset from the instruction reference in bytes. + This can be negative. + :param string condition: An expression for conditional breakpoints. + It is only honored by a debug adapter if the corresponding capability `supportsConditionalBreakpoints` is true. + :param string hitCondition: An expression that controls how many hits of the breakpoint are ignored. + The debug adapter is expected to interpret the expression as needed. + The attribute is only honored by a debug adapter if the corresponding capability `supportsHitConditionalBreakpoints` is true. + """ + self.instructionReference = instructionReference + self.offset = offset + self.condition = condition + self.hitCondition = hitCondition + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + instructionReference = self.instructionReference + offset = self.offset + condition = self.condition + hitCondition = self.hitCondition + dct = { + "instructionReference": instructionReference, + } + if offset is not None: + dct["offset"] = offset + if condition is not None: + dct["condition"] = condition + if hitCondition is not None: + dct["hitCondition"] = hitCondition + dct.update(self.kwargs) + return dct + + +@register +class Breakpoint(BaseSchema): + """ + Information about a breakpoint created in `setBreakpoints`, `setFunctionBreakpoints`, + `setInstructionBreakpoints`, or `setDataBreakpoints` requests. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "id": { + "type": "integer", + "description": "The identifier for the breakpoint. It is needed if breakpoint events are used to update or remove breakpoints.", + }, + "verified": { + "type": "boolean", + "description": "If True, the breakpoint could be set (but not necessarily at the desired location).", + }, + "message": { + "type": "string", + "description": "A message about the state of the breakpoint.\nThis is shown to the user and can be used to explain why a breakpoint could not be verified.", + }, + "source": {"description": "The source where the breakpoint is located.", "type": "Source"}, + "line": {"type": "integer", "description": "The start line of the actual range covered by the breakpoint."}, + "column": { + "type": "integer", + "description": "Start position of the source range covered by the breakpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "endLine": {"type": "integer", "description": "The end line of the actual range covered by the breakpoint."}, + "endColumn": { + "type": "integer", + "description": "End position of the source range covered by the breakpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.\nIf no end line is given, then the end column is assumed to be in the start line.", + }, + "instructionReference": {"type": "string", "description": "A memory reference to where the breakpoint is set."}, + "offset": {"type": "integer", "description": "The offset from the instruction reference.\nThis can be negative."}, + "reason": { + "type": "string", + "description": "A machine-readable explanation of why a breakpoint may not be verified. If a breakpoint is verified or a specific reason is not known, the adapter should omit this property. Possible values include:\n\n- `pending`: Indicates a breakpoint might be verified in the future, but the adapter cannot verify it in the current state.\n - `failed`: Indicates a breakpoint was not able to be verified, and the adapter does not believe it can be verified without intervention.", + "enum": ["pending", "failed"], + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + verified, + id=None, + message=None, + source=None, + line=None, + column=None, + endLine=None, + endColumn=None, + instructionReference=None, + offset=None, + reason=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param boolean verified: If true, the breakpoint could be set (but not necessarily at the desired location). + :param integer id: The identifier for the breakpoint. It is needed if breakpoint events are used to update or remove breakpoints. + :param string message: A message about the state of the breakpoint. + This is shown to the user and can be used to explain why a breakpoint could not be verified. + :param Source source: The source where the breakpoint is located. + :param integer line: The start line of the actual range covered by the breakpoint. + :param integer column: Start position of the source range covered by the breakpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + :param integer endLine: The end line of the actual range covered by the breakpoint. + :param integer endColumn: End position of the source range covered by the breakpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + If no end line is given, then the end column is assumed to be in the start line. + :param string instructionReference: A memory reference to where the breakpoint is set. + :param integer offset: The offset from the instruction reference. + This can be negative. + :param string reason: A machine-readable explanation of why a breakpoint may not be verified. If a breakpoint is verified or a specific reason is not known, the adapter should omit this property. Possible values include: + + - `pending`: Indicates a breakpoint might be verified in the future, but the adapter cannot verify it in the current state. + - `failed`: Indicates a breakpoint was not able to be verified, and the adapter does not believe it can be verified without intervention. + """ + self.verified = verified + self.id = id + self.message = message + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.line = line + self.column = column + self.endLine = endLine + self.endColumn = endColumn + self.instructionReference = instructionReference + self.offset = offset + self.reason = reason + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + verified = self.verified + id = self.id # noqa (assign to builtin) + message = self.message + source = self.source + line = self.line + column = self.column + endLine = self.endLine + endColumn = self.endColumn + instructionReference = self.instructionReference + offset = self.offset + reason = self.reason + dct = { + "verified": verified, + } + if id is not None: + dct["id"] = id + if message is not None: + dct["message"] = message + if source is not None: + dct["source"] = source.to_dict(update_ids_to_dap=update_ids_to_dap) + if line is not None: + dct["line"] = line + if column is not None: + dct["column"] = column + if endLine is not None: + dct["endLine"] = endLine + if endColumn is not None: + dct["endColumn"] = endColumn + if instructionReference is not None: + dct["instructionReference"] = instructionReference + if offset is not None: + dct["offset"] = offset + if reason is not None: + dct["reason"] = reason + dct.update(self.kwargs) + return dct + + +@register +class SteppingGranularity(BaseSchema): + """ + The granularity of one 'step' in the stepping requests `next`, `stepIn`, `stepOut`, and `stepBack`. + + Note: automatically generated code. Do not edit manually. + """ + + STATEMENT = "statement" + LINE = "line" + INSTRUCTION = "instruction" + + VALID_VALUES = set(["statement", "line", "instruction"]) + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register +class StepInTarget(BaseSchema): + """ + A `StepInTarget` can be used in the `stepIn` request and determines into which single target the + `stepIn` request should step. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "id": {"type": "integer", "description": "Unique identifier for a step-in target."}, + "label": {"type": "string", "description": "The name of the step-in target (shown in the UI)."}, + "line": {"type": "integer", "description": "The line of the step-in target."}, + "column": { + "type": "integer", + "description": "Start position of the range covered by the step in target. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "endLine": {"type": "integer", "description": "The end line of the range covered by the step-in target."}, + "endColumn": { + "type": "integer", + "description": "End position of the range covered by the step in target. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, id, label, line=None, column=None, endLine=None, endColumn=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer id: Unique identifier for a step-in target. + :param string label: The name of the step-in target (shown in the UI). + :param integer line: The line of the step-in target. + :param integer column: Start position of the range covered by the step in target. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + :param integer endLine: The end line of the range covered by the step-in target. + :param integer endColumn: End position of the range covered by the step in target. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + """ + self.id = id + self.label = label + self.line = line + self.column = column + self.endLine = endLine + self.endColumn = endColumn + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + id = self.id # noqa (assign to builtin) + label = self.label + line = self.line + column = self.column + endLine = self.endLine + endColumn = self.endColumn + dct = { + "id": id, + "label": label, + } + if line is not None: + dct["line"] = line + if column is not None: + dct["column"] = column + if endLine is not None: + dct["endLine"] = endLine + if endColumn is not None: + dct["endColumn"] = endColumn + dct.update(self.kwargs) + return dct + + +@register +class GotoTarget(BaseSchema): + """ + A `GotoTarget` describes a code location that can be used as a target in the `goto` request. + + The possible goto targets can be determined via the `gotoTargets` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "id": {"type": "integer", "description": "Unique identifier for a goto target. This is used in the `goto` request."}, + "label": {"type": "string", "description": "The name of the goto target (shown in the UI)."}, + "line": {"type": "integer", "description": "The line of the goto target."}, + "column": {"type": "integer", "description": "The column of the goto target."}, + "endLine": {"type": "integer", "description": "The end line of the range covered by the goto target."}, + "endColumn": {"type": "integer", "description": "The end column of the range covered by the goto target."}, + "instructionPointerReference": { + "type": "string", + "description": "A memory reference for the instruction pointer value represented by this target.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + id, + label, + line, + column=None, + endLine=None, + endColumn=None, + instructionPointerReference=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param integer id: Unique identifier for a goto target. This is used in the `goto` request. + :param string label: The name of the goto target (shown in the UI). + :param integer line: The line of the goto target. + :param integer column: The column of the goto target. + :param integer endLine: The end line of the range covered by the goto target. + :param integer endColumn: The end column of the range covered by the goto target. + :param string instructionPointerReference: A memory reference for the instruction pointer value represented by this target. + """ + self.id = id + self.label = label + self.line = line + self.column = column + self.endLine = endLine + self.endColumn = endColumn + self.instructionPointerReference = instructionPointerReference + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + id = self.id # noqa (assign to builtin) + label = self.label + line = self.line + column = self.column + endLine = self.endLine + endColumn = self.endColumn + instructionPointerReference = self.instructionPointerReference + dct = { + "id": id, + "label": label, + "line": line, + } + if column is not None: + dct["column"] = column + if endLine is not None: + dct["endLine"] = endLine + if endColumn is not None: + dct["endColumn"] = endColumn + if instructionPointerReference is not None: + dct["instructionPointerReference"] = instructionPointerReference + dct.update(self.kwargs) + return dct + + +@register +class CompletionItem(BaseSchema): + """ + `CompletionItems` are the suggestions returned from the `completions` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "label": { + "type": "string", + "description": "The label of this completion item. By default this is also the text that is inserted when selecting this completion.", + }, + "text": {"type": "string", "description": "If text is returned and not an empty string, then it is inserted instead of the label."}, + "sortText": { + "type": "string", + "description": "A string that should be used when comparing this item with other items. If not returned or an empty string, the `label` is used instead.", + }, + "detail": { + "type": "string", + "description": "A human-readable string with additional information about this item, like type or symbol information.", + }, + "type": { + "description": "The item's type. Typically the client uses this information to render the item in the UI with an icon.", + "type": "CompletionItemType", + }, + "start": { + "type": "integer", + "description": "Start position (within the `text` attribute of the `completions` request) where the completion text is added. The position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If the start position is omitted the text is added at the location specified by the `column` attribute of the `completions` request.", + }, + "length": { + "type": "integer", + "description": "Length determines how many characters are overwritten by the completion text and it is measured in UTF-16 code units. If missing the value 0 is assumed which results in the completion text being inserted.", + }, + "selectionStart": { + "type": "integer", + "description": "Determines the start of the new selection after the text has been inserted (or replaced). `selectionStart` is measured in UTF-16 code units and must be in the range 0 and length of the completion text. If omitted the selection starts at the end of the completion text.", + }, + "selectionLength": { + "type": "integer", + "description": "Determines the length of the new selection after the text has been inserted (or replaced) and it is measured in UTF-16 code units. The selection can not extend beyond the bounds of the completion text. If omitted the length is assumed to be 0.", + }, + } + __refs__ = set(["type"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + label, + text=None, + sortText=None, + detail=None, + type=None, + start=None, + length=None, + selectionStart=None, + selectionLength=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string label: The label of this completion item. By default this is also the text that is inserted when selecting this completion. + :param string text: If text is returned and not an empty string, then it is inserted instead of the label. + :param string sortText: A string that should be used when comparing this item with other items. If not returned or an empty string, the `label` is used instead. + :param string detail: A human-readable string with additional information about this item, like type or symbol information. + :param CompletionItemType type: The item's type. Typically the client uses this information to render the item in the UI with an icon. + :param integer start: Start position (within the `text` attribute of the `completions` request) where the completion text is added. The position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If the start position is omitted the text is added at the location specified by the `column` attribute of the `completions` request. + :param integer length: Length determines how many characters are overwritten by the completion text and it is measured in UTF-16 code units. If missing the value 0 is assumed which results in the completion text being inserted. + :param integer selectionStart: Determines the start of the new selection after the text has been inserted (or replaced). `selectionStart` is measured in UTF-16 code units and must be in the range 0 and length of the completion text. If omitted the selection starts at the end of the completion text. + :param integer selectionLength: Determines the length of the new selection after the text has been inserted (or replaced) and it is measured in UTF-16 code units. The selection can not extend beyond the bounds of the completion text. If omitted the length is assumed to be 0. + """ + self.label = label + self.text = text + self.sortText = sortText + self.detail = detail + if type is not None: + assert type in CompletionItemType.VALID_VALUES + self.type = type + self.start = start + self.length = length + self.selectionStart = selectionStart + self.selectionLength = selectionLength + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + label = self.label + text = self.text + sortText = self.sortText + detail = self.detail + type = self.type # noqa (assign to builtin) + start = self.start + length = self.length + selectionStart = self.selectionStart + selectionLength = self.selectionLength + dct = { + "label": label, + } + if text is not None: + dct["text"] = text + if sortText is not None: + dct["sortText"] = sortText + if detail is not None: + dct["detail"] = detail + if type is not None: + dct["type"] = type + if start is not None: + dct["start"] = start + if length is not None: + dct["length"] = length + if selectionStart is not None: + dct["selectionStart"] = selectionStart + if selectionLength is not None: + dct["selectionLength"] = selectionLength + dct.update(self.kwargs) + return dct + + +@register +class CompletionItemType(BaseSchema): + """ + Some predefined types for the CompletionItem. Please note that not all clients have specific icons + for all of them. + + Note: automatically generated code. Do not edit manually. + """ + + METHOD = "method" + FUNCTION = "function" + CONSTRUCTOR = "constructor" + FIELD = "field" + VARIABLE = "variable" + CLASS = "class" + INTERFACE = "interface" + MODULE = "module" + PROPERTY = "property" + UNIT = "unit" + VALUE = "value" + ENUM = "enum" + KEYWORD = "keyword" + SNIPPET = "snippet" + TEXT = "text" + COLOR = "color" + FILE = "file" + REFERENCE = "reference" + CUSTOMCOLOR = "customcolor" + + VALID_VALUES = set( + [ + "method", + "function", + "constructor", + "field", + "variable", + "class", + "interface", + "module", + "property", + "unit", + "value", + "enum", + "keyword", + "snippet", + "text", + "color", + "file", + "reference", + "customcolor", + ] + ) + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register +class ChecksumAlgorithm(BaseSchema): + """ + Names of checksum algorithms that may be supported by a debug adapter. + + Note: automatically generated code. Do not edit manually. + """ + + MD5 = "MD5" + SHA1 = "SHA1" + SHA256 = "SHA256" + TIMESTAMP = "timestamp" + + VALID_VALUES = set(["MD5", "SHA1", "SHA256", "timestamp"]) + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register +class Checksum(BaseSchema): + """ + The checksum of an item calculated by the specified algorithm. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "algorithm": {"description": "The algorithm used to calculate this checksum.", "type": "ChecksumAlgorithm"}, + "checksum": {"type": "string", "description": "Value of the checksum, encoded as a hexadecimal value."}, + } + __refs__ = set(["algorithm"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, algorithm, checksum, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param ChecksumAlgorithm algorithm: The algorithm used to calculate this checksum. + :param string checksum: Value of the checksum, encoded as a hexadecimal value. + """ + if algorithm is not None: + assert algorithm in ChecksumAlgorithm.VALID_VALUES + self.algorithm = algorithm + self.checksum = checksum + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + algorithm = self.algorithm + checksum = self.checksum + dct = { + "algorithm": algorithm, + "checksum": checksum, + } + dct.update(self.kwargs) + return dct + + +@register +class ValueFormat(BaseSchema): + """ + Provides formatting information for a value. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"hex": {"type": "boolean", "description": "Display the value in hex."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, hex=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param boolean hex: Display the value in hex. + """ + self.hex = hex + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + hex = self.hex # noqa (assign to builtin) + dct = {} + if hex is not None: + dct["hex"] = hex + dct.update(self.kwargs) + return dct + + +@register +class StackFrameFormat(BaseSchema): + """ + Provides formatting information for a stack frame. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "hex": {"type": "boolean", "description": "Display the value in hex."}, + "parameters": {"type": "boolean", "description": "Displays parameters for the stack frame."}, + "parameterTypes": {"type": "boolean", "description": "Displays the types of parameters for the stack frame."}, + "parameterNames": {"type": "boolean", "description": "Displays the names of parameters for the stack frame."}, + "parameterValues": {"type": "boolean", "description": "Displays the values of parameters for the stack frame."}, + "line": {"type": "boolean", "description": "Displays the line number of the stack frame."}, + "module": {"type": "boolean", "description": "Displays the module of the stack frame."}, + "includeAll": { + "type": "boolean", + "description": "Includes all stack frames, including those the debug adapter might otherwise hide.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + hex=None, + parameters=None, + parameterTypes=None, + parameterNames=None, + parameterValues=None, + line=None, + module=None, + includeAll=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param boolean hex: Display the value in hex. + :param boolean parameters: Displays parameters for the stack frame. + :param boolean parameterTypes: Displays the types of parameters for the stack frame. + :param boolean parameterNames: Displays the names of parameters for the stack frame. + :param boolean parameterValues: Displays the values of parameters for the stack frame. + :param boolean line: Displays the line number of the stack frame. + :param boolean module: Displays the module of the stack frame. + :param boolean includeAll: Includes all stack frames, including those the debug adapter might otherwise hide. + """ + self.hex = hex + self.parameters = parameters + self.parameterTypes = parameterTypes + self.parameterNames = parameterNames + self.parameterValues = parameterValues + self.line = line + self.module = module + self.includeAll = includeAll + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + hex = self.hex # noqa (assign to builtin) + parameters = self.parameters + parameterTypes = self.parameterTypes + parameterNames = self.parameterNames + parameterValues = self.parameterValues + line = self.line + module = self.module + includeAll = self.includeAll + dct = {} + if hex is not None: + dct["hex"] = hex + if parameters is not None: + dct["parameters"] = parameters + if parameterTypes is not None: + dct["parameterTypes"] = parameterTypes + if parameterNames is not None: + dct["parameterNames"] = parameterNames + if parameterValues is not None: + dct["parameterValues"] = parameterValues + if line is not None: + dct["line"] = line + if module is not None: + dct["module"] = module + if includeAll is not None: + dct["includeAll"] = includeAll + dct.update(self.kwargs) + return dct + + +@register +class ExceptionFilterOptions(BaseSchema): + """ + An `ExceptionFilterOptions` is used to specify an exception filter together with a condition for the + `setExceptionBreakpoints` request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "filterId": {"type": "string", "description": "ID of an exception filter returned by the `exceptionBreakpointFilters` capability."}, + "condition": { + "type": "string", + "description": "An expression for conditional exceptions.\nThe exception breaks into the debugger if the result of the condition is True.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, filterId, condition=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string filterId: ID of an exception filter returned by the `exceptionBreakpointFilters` capability. + :param string condition: An expression for conditional exceptions. + The exception breaks into the debugger if the result of the condition is true. + """ + self.filterId = filterId + self.condition = condition + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + filterId = self.filterId + condition = self.condition + dct = { + "filterId": filterId, + } + if condition is not None: + dct["condition"] = condition + dct.update(self.kwargs) + return dct + + +@register +class ExceptionOptions(BaseSchema): + """ + An `ExceptionOptions` assigns configuration options to a set of exceptions. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "path": { + "type": "array", + "items": {"$ref": "#/definitions/ExceptionPathSegment"}, + "description": "A path that selects a single or multiple exceptions in a tree. If `path` is missing, the whole tree is selected.\nBy convention the first segment of the path is a category that is used to group exceptions in the UI.", + }, + "breakMode": {"description": "Condition when a thrown exception should result in a break.", "type": "ExceptionBreakMode"}, + } + __refs__ = set(["breakMode"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakMode, path=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param ExceptionBreakMode breakMode: Condition when a thrown exception should result in a break. + :param array path: A path that selects a single or multiple exceptions in a tree. If `path` is missing, the whole tree is selected. + By convention the first segment of the path is a category that is used to group exceptions in the UI. + """ + if breakMode is not None: + assert breakMode in ExceptionBreakMode.VALID_VALUES + self.breakMode = breakMode + self.path = path + if update_ids_from_dap and self.path: + for o in self.path: + ExceptionPathSegment.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakMode = self.breakMode + path = self.path + if path and hasattr(path[0], "to_dict"): + path = [x.to_dict() for x in path] + dct = { + "breakMode": breakMode, + } + if path is not None: + dct["path"] = [ExceptionPathSegment.update_dict_ids_to_dap(o) for o in path] if (update_ids_to_dap and path) else path + dct.update(self.kwargs) + return dct + + +@register +class ExceptionBreakMode(BaseSchema): + """ + This enumeration defines all possible conditions when a thrown exception should result in a break. + + never: never breaks, + + always: always breaks, + + unhandled: breaks when exception unhandled, + + userUnhandled: breaks if the exception is not handled by user code. + + Note: automatically generated code. Do not edit manually. + """ + + NEVER = "never" + ALWAYS = "always" + UNHANDLED = "unhandled" + USERUNHANDLED = "userUnhandled" + + VALID_VALUES = set(["never", "always", "unhandled", "userUnhandled"]) + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register +class ExceptionPathSegment(BaseSchema): + """ + An `ExceptionPathSegment` represents a segment in a path that is used to match leafs or nodes in a + tree of exceptions. + + If a segment consists of more than one name, it matches the names provided if `negate` is false or + missing, or it matches anything except the names provided if `negate` is true. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "negate": { + "type": "boolean", + "description": "If false or missing this segment matches the names provided, otherwise it matches anything except the names provided.", + }, + "names": { + "type": "array", + "items": {"type": "string"}, + "description": "Depending on the value of `negate` the names that should match or not match.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, names, negate=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array names: Depending on the value of `negate` the names that should match or not match. + :param boolean negate: If false or missing this segment matches the names provided, otherwise it matches anything except the names provided. + """ + self.names = names + self.negate = negate + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + names = self.names + if names and hasattr(names[0], "to_dict"): + names = [x.to_dict() for x in names] + negate = self.negate + dct = { + "names": names, + } + if negate is not None: + dct["negate"] = negate + dct.update(self.kwargs) + return dct + + +@register +class ExceptionDetails(BaseSchema): + """ + Detailed information about an exception that has occurred. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "message": {"type": "string", "description": "Message contained in the exception."}, + "typeName": {"type": "string", "description": "Short type name of the exception object."}, + "fullTypeName": {"type": "string", "description": "Fully-qualified type name of the exception object."}, + "evaluateName": { + "type": "string", + "description": "An expression that can be evaluated in the current scope to obtain the exception object.", + }, + "stackTrace": {"type": "string", "description": "Stack trace at the time the exception was thrown."}, + "innerException": { + "type": "array", + "items": {"$ref": "#/definitions/ExceptionDetails"}, + "description": "Details of the exception contained by this exception, if any.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + message=None, + typeName=None, + fullTypeName=None, + evaluateName=None, + stackTrace=None, + innerException=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string message: Message contained in the exception. + :param string typeName: Short type name of the exception object. + :param string fullTypeName: Fully-qualified type name of the exception object. + :param string evaluateName: An expression that can be evaluated in the current scope to obtain the exception object. + :param string stackTrace: Stack trace at the time the exception was thrown. + :param array innerException: Details of the exception contained by this exception, if any. + """ + self.message = message + self.typeName = typeName + self.fullTypeName = fullTypeName + self.evaluateName = evaluateName + self.stackTrace = stackTrace + self.innerException = innerException + if update_ids_from_dap and self.innerException: + for o in self.innerException: + ExceptionDetails.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + message = self.message + typeName = self.typeName + fullTypeName = self.fullTypeName + evaluateName = self.evaluateName + stackTrace = self.stackTrace + innerException = self.innerException + if innerException and hasattr(innerException[0], "to_dict"): + innerException = [x.to_dict() for x in innerException] + dct = {} + if message is not None: + dct["message"] = message + if typeName is not None: + dct["typeName"] = typeName + if fullTypeName is not None: + dct["fullTypeName"] = fullTypeName + if evaluateName is not None: + dct["evaluateName"] = evaluateName + if stackTrace is not None: + dct["stackTrace"] = stackTrace + if innerException is not None: + dct["innerException"] = ( + [ExceptionDetails.update_dict_ids_to_dap(o) for o in innerException] + if (update_ids_to_dap and innerException) + else innerException + ) + dct.update(self.kwargs) + return dct + + +@register +class DisassembledInstruction(BaseSchema): + """ + Represents a single disassembled instruction. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "address": { + "type": "string", + "description": "The address of the instruction. Treated as a hex value if prefixed with `0x`, or as a decimal value otherwise.", + }, + "instructionBytes": { + "type": "string", + "description": "Raw bytes representing the instruction and its operands, in an implementation-defined format.", + }, + "instruction": { + "type": "string", + "description": "Text representing the instruction and its operands, in an implementation-defined format.", + }, + "symbol": {"type": "string", "description": "Name of the symbol that corresponds with the location of this instruction, if any."}, + "location": { + "description": "Source location that corresponds to this instruction, if any.\nShould always be set (if available) on the first instruction returned,\nbut can be omitted afterwards if this instruction maps to the same source file as the previous instruction.", + "type": "Source", + }, + "line": {"type": "integer", "description": "The line within the source location that corresponds to this instruction, if any."}, + "column": {"type": "integer", "description": "The column within the line that corresponds to this instruction, if any."}, + "endLine": {"type": "integer", "description": "The end line of the range that corresponds to this instruction, if any."}, + "endColumn": {"type": "integer", "description": "The end column of the range that corresponds to this instruction, if any."}, + "presentationHint": { + "type": "string", + "description": "A hint for how to present the instruction in the UI.\n\nA value of `invalid` may be used to indicate this instruction is 'filler' and cannot be reached by the program. For example, unreadable memory addresses may be presented is 'invalid.'", + "enum": ["normal", "invalid"], + }, + } + __refs__ = set(["location"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + address, + instruction, + instructionBytes=None, + symbol=None, + location=None, + line=None, + column=None, + endLine=None, + endColumn=None, + presentationHint=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string address: The address of the instruction. Treated as a hex value if prefixed with `0x`, or as a decimal value otherwise. + :param string instruction: Text representing the instruction and its operands, in an implementation-defined format. + :param string instructionBytes: Raw bytes representing the instruction and its operands, in an implementation-defined format. + :param string symbol: Name of the symbol that corresponds with the location of this instruction, if any. + :param Source location: Source location that corresponds to this instruction, if any. + Should always be set (if available) on the first instruction returned, + but can be omitted afterwards if this instruction maps to the same source file as the previous instruction. + :param integer line: The line within the source location that corresponds to this instruction, if any. + :param integer column: The column within the line that corresponds to this instruction, if any. + :param integer endLine: The end line of the range that corresponds to this instruction, if any. + :param integer endColumn: The end column of the range that corresponds to this instruction, if any. + :param string presentationHint: A hint for how to present the instruction in the UI. + + A value of `invalid` may be used to indicate this instruction is 'filler' and cannot be reached by the program. For example, unreadable memory addresses may be presented is 'invalid.' + """ + self.address = address + self.instruction = instruction + self.instructionBytes = instructionBytes + self.symbol = symbol + if location is None: + self.location = Source() + else: + self.location = Source(update_ids_from_dap=update_ids_from_dap, **location) if location.__class__ != Source else location + self.line = line + self.column = column + self.endLine = endLine + self.endColumn = endColumn + self.presentationHint = presentationHint + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + address = self.address + instruction = self.instruction + instructionBytes = self.instructionBytes + symbol = self.symbol + location = self.location + line = self.line + column = self.column + endLine = self.endLine + endColumn = self.endColumn + presentationHint = self.presentationHint + dct = { + "address": address, + "instruction": instruction, + } + if instructionBytes is not None: + dct["instructionBytes"] = instructionBytes + if symbol is not None: + dct["symbol"] = symbol + if location is not None: + dct["location"] = location.to_dict(update_ids_to_dap=update_ids_to_dap) + if line is not None: + dct["line"] = line + if column is not None: + dct["column"] = column + if endLine is not None: + dct["endLine"] = endLine + if endColumn is not None: + dct["endColumn"] = endColumn + if presentationHint is not None: + dct["presentationHint"] = presentationHint + dct.update(self.kwargs) + return dct + + +@register +class InvalidatedAreas(BaseSchema): + """ + Logical areas that can be invalidated by the `invalidated` event. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register_request("setDebuggerProperty") +@register +class SetDebuggerPropertyRequest(BaseSchema): + """ + The request can be used to enable or disable debugger features. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setDebuggerProperty"]}, + "arguments": {"type": "SetDebuggerPropertyArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetDebuggerPropertyArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setDebuggerProperty" + if arguments is None: + self.arguments = SetDebuggerPropertyArguments() + else: + self.arguments = ( + SetDebuggerPropertyArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetDebuggerPropertyArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetDebuggerPropertyArguments(BaseSchema): + """ + Arguments for 'setDebuggerProperty' request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "ideOS": {"type": ["string"], "description": "OS where the ide is running. Supported values [Windows, Linux]"}, + "dontTraceStartPatterns": { + "type": ["array"], + "description": "Patterns to match with the start of the file paths. Matching paths will be added to a list of file where trace is ignored.", + }, + "dontTraceEndPatterns": { + "type": ["array"], + "description": "Patterns to match with the end of the file paths. Matching paths will be added to a list of file where trace is ignored.", + }, + "skipSuspendOnBreakpointException": { + "type": ["array"], + "description": "List of exceptions that should be skipped when doing condition evaluations.", + }, + "skipPrintBreakpointException": { + "type": ["array"], + "description": "List of exceptions that should skip printing to stderr when doing condition evaluations.", + }, + "multiThreadsSingleNotification": { + "type": ["boolean"], + "description": "If false then a notification is generated for each thread event. If True a single event is gnenerated, and all threads follow that behavior.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + ideOS=None, + dontTraceStartPatterns=None, + dontTraceEndPatterns=None, + skipSuspendOnBreakpointException=None, + skipPrintBreakpointException=None, + multiThreadsSingleNotification=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param ['string'] ideOS: OS where the ide is running. Supported values [Windows, Linux] + :param ['array'] dontTraceStartPatterns: Patterns to match with the start of the file paths. Matching paths will be added to a list of file where trace is ignored. + :param ['array'] dontTraceEndPatterns: Patterns to match with the end of the file paths. Matching paths will be added to a list of file where trace is ignored. + :param ['array'] skipSuspendOnBreakpointException: List of exceptions that should be skipped when doing condition evaluations. + :param ['array'] skipPrintBreakpointException: List of exceptions that should skip printing to stderr when doing condition evaluations. + :param ['boolean'] multiThreadsSingleNotification: If false then a notification is generated for each thread event. If true a single event is gnenerated, and all threads follow that behavior. + """ + self.ideOS = ideOS + self.dontTraceStartPatterns = dontTraceStartPatterns + self.dontTraceEndPatterns = dontTraceEndPatterns + self.skipSuspendOnBreakpointException = skipSuspendOnBreakpointException + self.skipPrintBreakpointException = skipPrintBreakpointException + self.multiThreadsSingleNotification = multiThreadsSingleNotification + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + ideOS = self.ideOS + dontTraceStartPatterns = self.dontTraceStartPatterns + dontTraceEndPatterns = self.dontTraceEndPatterns + skipSuspendOnBreakpointException = self.skipSuspendOnBreakpointException + skipPrintBreakpointException = self.skipPrintBreakpointException + multiThreadsSingleNotification = self.multiThreadsSingleNotification + dct = {} + if ideOS is not None: + dct["ideOS"] = ideOS + if dontTraceStartPatterns is not None: + dct["dontTraceStartPatterns"] = dontTraceStartPatterns + if dontTraceEndPatterns is not None: + dct["dontTraceEndPatterns"] = dontTraceEndPatterns + if skipSuspendOnBreakpointException is not None: + dct["skipSuspendOnBreakpointException"] = skipSuspendOnBreakpointException + if skipPrintBreakpointException is not None: + dct["skipPrintBreakpointException"] = skipPrintBreakpointException + if multiThreadsSingleNotification is not None: + dct["multiThreadsSingleNotification"] = multiThreadsSingleNotification + dct.update(self.kwargs) + return dct + + +@register_response("setDebuggerProperty") +@register +class SetDebuggerPropertyResponse(BaseSchema): + """ + Response to 'setDebuggerProperty' request. This is just an acknowledgement, so no body field is + required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_event("pydevdInputRequested") +@register +class PydevdInputRequestedEvent(BaseSchema): + """ + The event indicates input was requested by debuggee. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["event"]}, + "event": {"type": "string", "enum": ["pydevdInputRequested"]}, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Event-specific information.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string event: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Event-specific information. + """ + self.type = "event" + self.event = "pydevdInputRequested" + self.seq = seq + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + event = self.event + seq = self.seq + body = self.body + dct = { + "type": type, + "event": event, + "seq": seq, + } + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register_request("setPydevdSourceMap") +@register +class SetPydevdSourceMapRequest(BaseSchema): + """ + Sets multiple PydevdSourceMap for a single source and clears all previous PydevdSourceMap in that + source. + + i.e.: Maps paths and lines in a 1:N mapping (use case: map a single file in the IDE to multiple + IPython cells). + + To clear all PydevdSourceMap for a source, specify an empty array. + + Interaction with breakpoints: When a new mapping is sent, breakpoints that match the source (or + previously matched a source) are reapplied. + + Interaction with launch pathMapping: both mappings are independent. This mapping is applied after + the launch pathMapping. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["setPydevdSourceMap"]}, + "arguments": {"type": "SetPydevdSourceMapArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param SetPydevdSourceMapArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "setPydevdSourceMap" + if arguments is None: + self.arguments = SetPydevdSourceMapArguments() + else: + self.arguments = ( + SetPydevdSourceMapArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != SetPydevdSourceMapArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class SetPydevdSourceMapArguments(BaseSchema): + """ + Arguments for 'setPydevdSourceMap' request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "source": { + "description": "The source location of the PydevdSourceMap; 'source.path' must be specified (e.g.: for an ipython notebook this could be something as /home/notebook/note.py).", + "type": "Source", + }, + "pydevdSourceMaps": { + "type": "array", + "items": {"$ref": "#/definitions/PydevdSourceMap"}, + "description": "The PydevdSourceMaps to be set to the given source (provide an empty array to clear the source mappings for a given path).", + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, source, pydevdSourceMaps=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param Source source: The source location of the PydevdSourceMap; 'source.path' must be specified (e.g.: for an ipython notebook this could be something as /home/notebook/note.py). + :param array pydevdSourceMaps: The PydevdSourceMaps to be set to the given source (provide an empty array to clear the source mappings for a given path). + """ + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.pydevdSourceMaps = pydevdSourceMaps + if update_ids_from_dap and self.pydevdSourceMaps: + for o in self.pydevdSourceMaps: + PydevdSourceMap.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + source = self.source + pydevdSourceMaps = self.pydevdSourceMaps + if pydevdSourceMaps and hasattr(pydevdSourceMaps[0], "to_dict"): + pydevdSourceMaps = [x.to_dict() for x in pydevdSourceMaps] + dct = { + "source": source.to_dict(update_ids_to_dap=update_ids_to_dap), + } + if pydevdSourceMaps is not None: + dct["pydevdSourceMaps"] = ( + [PydevdSourceMap.update_dict_ids_to_dap(o) for o in pydevdSourceMaps] + if (update_ids_to_dap and pydevdSourceMaps) + else pydevdSourceMaps + ) + dct.update(self.kwargs) + return dct + + +@register_response("setPydevdSourceMap") +@register +class SetPydevdSourceMapResponse(BaseSchema): + """ + Response to 'setPydevdSourceMap' request. This is just an acknowledgement, so no body field is + required. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Contains request result if success is True and error details if success is false.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, seq=-1, message=None, body=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] body: Contains request result if success is true and error details if success is false. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + self.seq = seq + self.message = message + self.body = body + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + seq = self.seq + message = self.message + body = self.body + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "seq": seq, + } + if message is not None: + dct["message"] = message + if body is not None: + dct["body"] = body + dct.update(self.kwargs) + return dct + + +@register +class PydevdSourceMap(BaseSchema): + """ + Information that allows mapping a local line to a remote source/line. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "line": { + "type": "integer", + "description": "The local line to which the mapping should map to (e.g.: for an ipython notebook this would be the first line of the cell in the file).", + }, + "endLine": {"type": "integer", "description": "The end line."}, + "runtimeSource": { + "description": "The path that the user has remotely -- 'source.path' must be specified (e.g.: for an ipython notebook this could be something as '')", + "type": "Source", + }, + "runtimeLine": { + "type": "integer", + "description": "The remote line to which the mapping should map to (e.g.: for an ipython notebook this would be always 1 as it'd map the start of the cell).", + }, + } + __refs__ = set(["runtimeSource"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, line, endLine, runtimeSource, runtimeLine, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer line: The local line to which the mapping should map to (e.g.: for an ipython notebook this would be the first line of the cell in the file). + :param integer endLine: The end line. + :param Source runtimeSource: The path that the user has remotely -- 'source.path' must be specified (e.g.: for an ipython notebook this could be something as '') + :param integer runtimeLine: The remote line to which the mapping should map to (e.g.: for an ipython notebook this would be always 1 as it'd map the start of the cell). + """ + self.line = line + self.endLine = endLine + if runtimeSource is None: + self.runtimeSource = Source() + else: + self.runtimeSource = ( + Source(update_ids_from_dap=update_ids_from_dap, **runtimeSource) if runtimeSource.__class__ != Source else runtimeSource + ) + self.runtimeLine = runtimeLine + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + line = self.line + endLine = self.endLine + runtimeSource = self.runtimeSource + runtimeLine = self.runtimeLine + dct = { + "line": line, + "endLine": endLine, + "runtimeSource": runtimeSource.to_dict(update_ids_to_dap=update_ids_to_dap), + "runtimeLine": runtimeLine, + } + dct.update(self.kwargs) + return dct + + +@register_request("pydevdSystemInfo") +@register +class PydevdSystemInfoRequest(BaseSchema): + """ + The request can be used retrieve system information, python version, etc. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["pydevdSystemInfo"]}, + "arguments": {"type": "PydevdSystemInfoArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, seq=-1, arguments=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param PydevdSystemInfoArguments arguments: + """ + self.type = "request" + self.command = "pydevdSystemInfo" + self.seq = seq + if arguments is None: + self.arguments = PydevdSystemInfoArguments() + else: + self.arguments = ( + PydevdSystemInfoArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != PydevdSystemInfoArguments + else arguments + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + seq = self.seq + arguments = self.arguments + dct = { + "type": type, + "command": command, + "seq": seq, + } + if arguments is not None: + dct["arguments"] = arguments.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class PydevdSystemInfoArguments(BaseSchema): + """ + Arguments for 'pydevdSystemInfo' request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register_response("pydevdSystemInfo") +@register +class PydevdSystemInfoResponse(BaseSchema): + """ + Response to 'pydevdSystemInfo' request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "python": { + "$ref": "#/definitions/PydevdPythonInfo", + "description": "Information about the python version running in the current process.", + }, + "platform": { + "$ref": "#/definitions/PydevdPlatformInfo", + "description": "Information about the plarforn on which the current process is running.", + }, + "process": {"$ref": "#/definitions/PydevdProcessInfo", "description": "Information about the current process."}, + "pydevd": {"$ref": "#/definitions/PydevdInfo", "description": "Information about pydevd."}, + }, + "required": ["python", "platform", "process", "pydevd"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param PydevdSystemInfoResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = PydevdSystemInfoResponseBody() + else: + self.body = ( + PydevdSystemInfoResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != PydevdSystemInfoResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register +class PydevdPythonInfo(BaseSchema): + """ + This object contains python version and implementation details. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "version": { + "type": "string", + "description": "Python version as a string in semver format: ...", + }, + "implementation": { + "description": "Python version as a string in this format ...", + "type": "PydevdPythonImplementationInfo", + }, + } + __refs__ = set(["implementation"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, version=None, implementation=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string version: Python version as a string in semver format: ... + :param PydevdPythonImplementationInfo implementation: Python version as a string in this format ... + """ + self.version = version + if implementation is None: + self.implementation = PydevdPythonImplementationInfo() + else: + self.implementation = ( + PydevdPythonImplementationInfo(update_ids_from_dap=update_ids_from_dap, **implementation) + if implementation.__class__ != PydevdPythonImplementationInfo + else implementation + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + version = self.version + implementation = self.implementation + dct = {} + if version is not None: + dct["version"] = version + if implementation is not None: + dct["implementation"] = implementation.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class PydevdPythonImplementationInfo(BaseSchema): + """ + This object contains python implementation details. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "name": {"type": "string", "description": "Python implementation name."}, + "version": { + "type": "string", + "description": "Python version as a string in semver format: ...", + }, + "description": {"type": "string", "description": "Optional description for this python implementation."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, name=None, version=None, description=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string name: Python implementation name. + :param string version: Python version as a string in semver format: ... + :param string description: Optional description for this python implementation. + """ + self.name = name + self.version = version + self.description = description + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + name = self.name + version = self.version + description = self.description + dct = {} + if name is not None: + dct["name"] = name + if version is not None: + dct["version"] = version + if description is not None: + dct["description"] = description + dct.update(self.kwargs) + return dct + + +@register +class PydevdPlatformInfo(BaseSchema): + """ + This object contains python version and implementation details. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"name": {"type": "string", "description": "Name of the platform as returned by 'sys.platform'."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, name=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string name: Name of the platform as returned by 'sys.platform'. + """ + self.name = name + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + name = self.name + dct = {} + if name is not None: + dct["name"] = name + dct.update(self.kwargs) + return dct + + +@register +class PydevdProcessInfo(BaseSchema): + """ + This object contains python process details. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "pid": {"type": "integer", "description": "Process ID for the current process."}, + "ppid": {"type": "integer", "description": "Parent Process ID for the current process."}, + "executable": {"type": "string", "description": "Path to the executable as returned by 'sys.executable'."}, + "bitness": {"type": "integer", "description": "Integer value indicating the bitness of the current process."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, pid=None, ppid=None, executable=None, bitness=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer pid: Process ID for the current process. + :param integer ppid: Parent Process ID for the current process. + :param string executable: Path to the executable as returned by 'sys.executable'. + :param integer bitness: Integer value indicating the bitness of the current process. + """ + self.pid = pid + self.ppid = ppid + self.executable = executable + self.bitness = bitness + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + pid = self.pid + ppid = self.ppid + executable = self.executable + bitness = self.bitness + dct = {} + if pid is not None: + dct["pid"] = pid + if ppid is not None: + dct["ppid"] = ppid + if executable is not None: + dct["executable"] = executable + if bitness is not None: + dct["bitness"] = bitness + dct.update(self.kwargs) + return dct + + +@register +class PydevdInfo(BaseSchema): + """ + This object contains details on pydevd. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "usingCython": {"type": "boolean", "description": "Specifies whether the cython native module is being used."}, + "usingFrameEval": {"type": "boolean", "description": "Specifies whether the frame eval native module is being used."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, usingCython=None, usingFrameEval=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param boolean usingCython: Specifies whether the cython native module is being used. + :param boolean usingFrameEval: Specifies whether the frame eval native module is being used. + """ + self.usingCython = usingCython + self.usingFrameEval = usingFrameEval + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + usingCython = self.usingCython + usingFrameEval = self.usingFrameEval + dct = {} + if usingCython is not None: + dct["usingCython"] = usingCython + if usingFrameEval is not None: + dct["usingFrameEval"] = usingFrameEval + dct.update(self.kwargs) + return dct + + +@register_request("pydevdAuthorize") +@register +class PydevdAuthorizeRequest(BaseSchema): + """ + A request to authorize the ide to start accepting commands. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["request"]}, + "command": {"type": "string", "enum": ["pydevdAuthorize"]}, + "arguments": {"type": "PydevdAuthorizeArguments"}, + } + __refs__ = set(["arguments"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, arguments, seq=-1, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param string command: + :param PydevdAuthorizeArguments arguments: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + """ + self.type = "request" + self.command = "pydevdAuthorize" + if arguments is None: + self.arguments = PydevdAuthorizeArguments() + else: + self.arguments = ( + PydevdAuthorizeArguments(update_ids_from_dap=update_ids_from_dap, **arguments) + if arguments.__class__ != PydevdAuthorizeArguments + else arguments + ) + self.seq = seq + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + command = self.command + arguments = self.arguments + seq = self.seq + dct = { + "type": type, + "command": command, + "arguments": arguments.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + dct.update(self.kwargs) + return dct + + +@register +class PydevdAuthorizeArguments(BaseSchema): + """ + Arguments for 'pydevdAuthorize' request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"debugServerAccessToken": {"type": "string", "description": "The access token to access the debug server."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, debugServerAccessToken=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string debugServerAccessToken: The access token to access the debug server. + """ + self.debugServerAccessToken = debugServerAccessToken + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + debugServerAccessToken = self.debugServerAccessToken + dct = {} + if debugServerAccessToken is not None: + dct["debugServerAccessToken"] = debugServerAccessToken + dct.update(self.kwargs) + return dct + + +@register_response("pydevdAuthorize") +@register +class PydevdAuthorizeResponse(BaseSchema): + """ + Response to 'pydevdAuthorize' request. + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "seq": { + "type": "integer", + "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request.", + }, + "type": {"type": "string", "enum": ["response"]}, + "request_seq": {"type": "integer", "description": "Sequence number of the corresponding request."}, + "success": { + "type": "boolean", + "description": "Outcome of the request.\nIf True, the request was successful and the `body` attribute may contain the result of the request.\nIf the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`).", + }, + "command": {"type": "string", "description": "The command requested."}, + "message": { + "type": "string", + "description": "Contains the raw error in short form if `success` is false.\nThis raw error might be interpreted by the client and is not shown in the UI.\nSome predefined values exist.", + "_enum": ["cancelled", "notStopped"], + "enumDescriptions": ["the request was cancelled.", "the request may be retried once the adapter is in a 'stopped' state."], + }, + "body": { + "type": "object", + "properties": { + "clientAccessToken": {"type": "string", "description": "The access token to access the client (i.e.: usually the IDE)."} + }, + "required": ["clientAccessToken"], + }, + } + __refs__ = set(["body"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, request_seq, success, command, body, seq=-1, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string type: + :param integer request_seq: Sequence number of the corresponding request. + :param boolean success: Outcome of the request. + If true, the request was successful and the `body` attribute may contain the result of the request. + If the value is false, the attribute `message` contains the error in short form and the `body` may contain additional information (see `ErrorResponse.body.error`). + :param string command: The command requested. + :param PydevdAuthorizeResponseBody body: + :param integer seq: Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request. + :param string message: Contains the raw error in short form if `success` is false. + This raw error might be interpreted by the client and is not shown in the UI. + Some predefined values exist. + """ + self.type = "response" + self.request_seq = request_seq + self.success = success + self.command = command + if body is None: + self.body = PydevdAuthorizeResponseBody() + else: + self.body = ( + PydevdAuthorizeResponseBody(update_ids_from_dap=update_ids_from_dap, **body) + if body.__class__ != PydevdAuthorizeResponseBody + else body + ) + self.seq = seq + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + type = self.type # noqa (assign to builtin) + request_seq = self.request_seq + success = self.success + command = self.command + body = self.body + seq = self.seq + message = self.message + dct = { + "type": type, + "request_seq": request_seq, + "success": success, + "command": command, + "body": body.to_dict(update_ids_to_dap=update_ids_to_dap), + "seq": seq, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register +class ErrorResponseBody(BaseSchema): + """ + "body" of ErrorResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"error": {"description": "A structured error message.", "type": "Message"}} + __refs__ = set(["error"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, error=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param Message error: A structured error message. + """ + if error is None: + self.error = Message() + else: + self.error = Message(update_ids_from_dap=update_ids_from_dap, **error) if error.__class__ != Message else error + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + error = self.error + dct = {} + if error is not None: + dct["error"] = error.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class StoppedEventBody(BaseSchema): + """ + "body" of StoppedEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "reason": { + "type": "string", + "description": "The reason for the event.\nFor backward compatibility this string is shown in the UI if the `description` attribute is missing (but it must not be translated).", + "_enum": [ + "step", + "breakpoint", + "exception", + "pause", + "entry", + "goto", + "function breakpoint", + "data breakpoint", + "instruction breakpoint", + ], + }, + "description": { + "type": "string", + "description": "The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and can be translated.", + }, + "threadId": {"type": "integer", "description": "The thread which was stopped."}, + "preserveFocusHint": { + "type": "boolean", + "description": "A value of True hints to the client that this event should not change the focus.", + }, + "text": { + "type": "string", + "description": "Additional information. E.g. if reason is `exception`, text contains the exception name. This string is shown in the UI.", + }, + "allThreadsStopped": { + "type": "boolean", + "description": "If `allThreadsStopped` is True, a debug adapter can announce that all threads have stopped.\n- The client should use this information to enable that all threads can be expanded to access their stacktraces.\n- If the attribute is missing or false, only the thread with the given `threadId` can be expanded.", + }, + "hitBreakpointIds": { + "type": "array", + "items": {"type": "integer"}, + "description": "Ids of the breakpoints that triggered the event. In most cases there is only a single breakpoint but here are some examples for multiple breakpoints:\n- Different types of breakpoints map to the same location.\n- Multiple source breakpoints get collapsed to the same instruction by the compiler/runtime.\n- Multiple function breakpoints with different function names map to the same location.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + reason, + description=None, + threadId=None, + preserveFocusHint=None, + text=None, + allThreadsStopped=None, + hitBreakpointIds=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string reason: The reason for the event. + For backward compatibility this string is shown in the UI if the `description` attribute is missing (but it must not be translated). + :param string description: The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and can be translated. + :param integer threadId: The thread which was stopped. + :param boolean preserveFocusHint: A value of true hints to the client that this event should not change the focus. + :param string text: Additional information. E.g. if reason is `exception`, text contains the exception name. This string is shown in the UI. + :param boolean allThreadsStopped: If `allThreadsStopped` is true, a debug adapter can announce that all threads have stopped. + - The client should use this information to enable that all threads can be expanded to access their stacktraces. + - If the attribute is missing or false, only the thread with the given `threadId` can be expanded. + :param array hitBreakpointIds: Ids of the breakpoints that triggered the event. In most cases there is only a single breakpoint but here are some examples for multiple breakpoints: + - Different types of breakpoints map to the same location. + - Multiple source breakpoints get collapsed to the same instruction by the compiler/runtime. + - Multiple function breakpoints with different function names map to the same location. + """ + self.reason = reason + self.description = description + self.threadId = threadId + self.preserveFocusHint = preserveFocusHint + self.text = text + self.allThreadsStopped = allThreadsStopped + self.hitBreakpointIds = hitBreakpointIds + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + reason = self.reason + description = self.description + threadId = self.threadId + preserveFocusHint = self.preserveFocusHint + text = self.text + allThreadsStopped = self.allThreadsStopped + hitBreakpointIds = self.hitBreakpointIds + if hitBreakpointIds and hasattr(hitBreakpointIds[0], "to_dict"): + hitBreakpointIds = [x.to_dict() for x in hitBreakpointIds] + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "reason": reason, + } + if description is not None: + dct["description"] = description + if threadId is not None: + dct["threadId"] = threadId + if preserveFocusHint is not None: + dct["preserveFocusHint"] = preserveFocusHint + if text is not None: + dct["text"] = text + if allThreadsStopped is not None: + dct["allThreadsStopped"] = allThreadsStopped + if hitBreakpointIds is not None: + dct["hitBreakpointIds"] = hitBreakpointIds + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register +class ContinuedEventBody(BaseSchema): + """ + "body" of ContinuedEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "threadId": {"type": "integer", "description": "The thread which was continued."}, + "allThreadsContinued": { + "type": "boolean", + "description": "If `allThreadsContinued` is True, a debug adapter can announce that all threads have continued.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threadId, allThreadsContinued=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer threadId: The thread which was continued. + :param boolean allThreadsContinued: If `allThreadsContinued` is true, a debug adapter can announce that all threads have continued. + """ + self.threadId = threadId + self.allThreadsContinued = allThreadsContinued + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threadId = self.threadId + allThreadsContinued = self.allThreadsContinued + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "threadId": threadId, + } + if allThreadsContinued is not None: + dct["allThreadsContinued"] = allThreadsContinued + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register +class ExitedEventBody(BaseSchema): + """ + "body" of ExitedEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"exitCode": {"type": "integer", "description": "The exit code returned from the debuggee."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, exitCode, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer exitCode: The exit code returned from the debuggee. + """ + self.exitCode = exitCode + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + exitCode = self.exitCode + dct = { + "exitCode": exitCode, + } + dct.update(self.kwargs) + return dct + + +@register +class TerminatedEventBody(BaseSchema): + """ + "body" of TerminatedEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "restart": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "A debug adapter may set `restart` to True (or to an arbitrary object) to request that the client restarts the session.\nThe value is not interpreted by the client and passed unmodified as an attribute `__restart` to the `launch` and `attach` requests.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, restart=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] restart: A debug adapter may set `restart` to true (or to an arbitrary object) to request that the client restarts the session. + The value is not interpreted by the client and passed unmodified as an attribute `__restart` to the `launch` and `attach` requests. + """ + self.restart = restart + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + restart = self.restart + dct = {} + if restart is not None: + dct["restart"] = restart + dct.update(self.kwargs) + return dct + + +@register +class ThreadEventBody(BaseSchema): + """ + "body" of ThreadEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "reason": {"type": "string", "description": "The reason for the event.", "_enum": ["started", "exited"]}, + "threadId": {"type": "integer", "description": "The identifier of the thread."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, reason, threadId, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string reason: The reason for the event. + :param integer threadId: The identifier of the thread. + """ + self.reason = reason + self.threadId = threadId + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + reason = self.reason + threadId = self.threadId + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = { + "reason": reason, + "threadId": threadId, + } + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register +class OutputEventBody(BaseSchema): + """ + "body" of OutputEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "category": { + "type": "string", + "description": "The output category. If not specified or if the category is not understood by the client, `console` is assumed.", + "_enum": ["console", "important", "stdout", "stderr", "telemetry"], + "enumDescriptions": [ + "Show the output in the client's default message UI, e.g. a 'debug console'. This category should only be used for informational output from the debugger (as opposed to the debuggee).", + "A hint for the client to show the output in the client's UI for important and highly visible information, e.g. as a popup notification. This category should only be used for important messages from the debugger (as opposed to the debuggee). Since this category value is a hint, clients might ignore the hint and assume the `console` category.", + "Show the output as normal program output from the debuggee.", + "Show the output as error program output from the debuggee.", + "Send the output to telemetry instead of showing it to the user.", + ], + }, + "output": {"type": "string", "description": "The output to report."}, + "group": { + "type": "string", + "description": "Support for keeping an output log organized by grouping related messages.", + "enum": ["start", "startCollapsed", "end"], + "enumDescriptions": [ + "Start a new group in expanded mode. Subsequent output events are members of the group and should be shown indented.\nThe `output` attribute becomes the name of the group and is not indented.", + "Start a new group in collapsed mode. Subsequent output events are members of the group and should be shown indented (as soon as the group is expanded).\nThe `output` attribute becomes the name of the group and is not indented.", + "End the current group and decrease the indentation of subsequent output events.\nA non-empty `output` attribute is shown as the unindented end of the group.", + ], + }, + "variablesReference": { + "type": "integer", + "description": "If an attribute `variablesReference` exists and its value is > 0, the output contains objects which can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "source": {"description": "The source location where the output was produced.", "type": "Source"}, + "line": {"type": "integer", "description": "The source location's line where the output was produced."}, + "column": { + "type": "integer", + "description": "The position in `line` where the output was produced. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.", + }, + "data": { + "type": ["array", "boolean", "integer", "null", "number", "object", "string"], + "description": "Additional data to report. For the `telemetry` category the data is sent to telemetry, for the other categories the data is shown in JSON format.", + }, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + output, + category=None, + group=None, + variablesReference=None, + source=None, + line=None, + column=None, + data=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string output: The output to report. + :param string category: The output category. If not specified or if the category is not understood by the client, `console` is assumed. + :param string group: Support for keeping an output log organized by grouping related messages. + :param integer variablesReference: If an attribute `variablesReference` exists and its value is > 0, the output contains objects which can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details. + :param Source source: The source location where the output was produced. + :param integer line: The source location's line where the output was produced. + :param integer column: The position in `line` where the output was produced. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + :param ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'] data: Additional data to report. For the `telemetry` category the data is sent to telemetry, for the other categories the data is shown in JSON format. + """ + self.output = output + self.category = category + self.group = group + self.variablesReference = variablesReference + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.line = line + self.column = column + self.data = data + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + output = self.output + category = self.category + group = self.group + variablesReference = self.variablesReference + source = self.source + line = self.line + column = self.column + data = self.data + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + dct = { + "output": output, + } + if category is not None: + dct["category"] = category + if group is not None: + dct["group"] = group + if variablesReference is not None: + dct["variablesReference"] = variablesReference + if source is not None: + dct["source"] = source.to_dict(update_ids_to_dap=update_ids_to_dap) + if line is not None: + dct["line"] = line + if column is not None: + dct["column"] = column + if data is not None: + dct["data"] = data + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + return dct + + +@register +class BreakpointEventBody(BaseSchema): + """ + "body" of BreakpointEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "reason": {"type": "string", "description": "The reason for the event.", "_enum": ["changed", "new", "removed"]}, + "breakpoint": { + "description": "The `id` attribute is used to find the target breakpoint, the other attributes are used as the new values.", + "type": "Breakpoint", + }, + } + __refs__ = set(["breakpoint"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, reason, breakpoint, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string reason: The reason for the event. + :param Breakpoint breakpoint: The `id` attribute is used to find the target breakpoint, the other attributes are used as the new values. + """ + self.reason = reason + if breakpoint is None: + self.breakpoint = Breakpoint() + else: + self.breakpoint = ( + Breakpoint(update_ids_from_dap=update_ids_from_dap, **breakpoint) if breakpoint.__class__ != Breakpoint else breakpoint + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + reason = self.reason + breakpoint = self.breakpoint # noqa (assign to builtin) + dct = { + "reason": reason, + "breakpoint": breakpoint.to_dict(update_ids_to_dap=update_ids_to_dap), + } + dct.update(self.kwargs) + return dct + + +@register +class ModuleEventBody(BaseSchema): + """ + "body" of ModuleEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "reason": {"type": "string", "description": "The reason for the event.", "enum": ["new", "changed", "removed"]}, + "module": { + "description": "The new, changed, or removed module. In case of `removed` only the module id is used.", + "type": "Module", + }, + } + __refs__ = set(["module"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, reason, module, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string reason: The reason for the event. + :param Module module: The new, changed, or removed module. In case of `removed` only the module id is used. + """ + self.reason = reason + if module is None: + self.module = Module() + else: + self.module = Module(update_ids_from_dap=update_ids_from_dap, **module) if module.__class__ != Module else module + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + reason = self.reason + module = self.module + dct = { + "reason": reason, + "module": module.to_dict(update_ids_to_dap=update_ids_to_dap), + } + dct.update(self.kwargs) + return dct + + +@register +class LoadedSourceEventBody(BaseSchema): + """ + "body" of LoadedSourceEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "reason": {"type": "string", "description": "The reason for the event.", "enum": ["new", "changed", "removed"]}, + "source": {"description": "The new, changed, or removed source.", "type": "Source"}, + } + __refs__ = set(["source"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, reason, source, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string reason: The reason for the event. + :param Source source: The new, changed, or removed source. + """ + self.reason = reason + if source is None: + self.source = Source() + else: + self.source = Source(update_ids_from_dap=update_ids_from_dap, **source) if source.__class__ != Source else source + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + reason = self.reason + source = self.source + dct = { + "reason": reason, + "source": source.to_dict(update_ids_to_dap=update_ids_to_dap), + } + dct.update(self.kwargs) + return dct + + +@register +class ProcessEventBody(BaseSchema): + """ + "body" of ProcessEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "name": { + "type": "string", + "description": "The logical name of the process. This is usually the full path to process's executable file. Example: /home/example/myproj/program.js.", + }, + "systemProcessId": { + "type": "integer", + "description": "The system process id of the debugged process. This property is missing for non-system processes.", + }, + "isLocalProcess": {"type": "boolean", "description": "If True, the process is running on the same computer as the debug adapter."}, + "startMethod": { + "type": "string", + "enum": ["launch", "attach", "attachForSuspendedLaunch"], + "description": "Describes how the debug engine started debugging this process.", + "enumDescriptions": [ + "Process was launched under the debugger.", + "Debugger attached to an existing process.", + "A project launcher component has launched a new process in a suspended state and then asked the debugger to attach.", + ], + }, + "pointerSize": { + "type": "integer", + "description": "The size of a pointer or address for this process, in bits. This value may be used by clients when formatting addresses for display.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, name, systemProcessId=None, isLocalProcess=None, startMethod=None, pointerSize=None, update_ids_from_dap=False, **kwargs + ): # noqa (update_ids_from_dap may be unused) + """ + :param string name: The logical name of the process. This is usually the full path to process's executable file. Example: /home/example/myproj/program.js. + :param integer systemProcessId: The system process id of the debugged process. This property is missing for non-system processes. + :param boolean isLocalProcess: If true, the process is running on the same computer as the debug adapter. + :param string startMethod: Describes how the debug engine started debugging this process. + :param integer pointerSize: The size of a pointer or address for this process, in bits. This value may be used by clients when formatting addresses for display. + """ + self.name = name + self.systemProcessId = systemProcessId + self.isLocalProcess = isLocalProcess + self.startMethod = startMethod + self.pointerSize = pointerSize + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + name = self.name + systemProcessId = self.systemProcessId + isLocalProcess = self.isLocalProcess + startMethod = self.startMethod + pointerSize = self.pointerSize + dct = { + "name": name, + } + if systemProcessId is not None: + dct["systemProcessId"] = systemProcessId + if isLocalProcess is not None: + dct["isLocalProcess"] = isLocalProcess + if startMethod is not None: + dct["startMethod"] = startMethod + if pointerSize is not None: + dct["pointerSize"] = pointerSize + dct.update(self.kwargs) + return dct + + +@register +class CapabilitiesEventBody(BaseSchema): + """ + "body" of CapabilitiesEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"capabilities": {"description": "The set of updated capabilities.", "type": "Capabilities"}} + __refs__ = set(["capabilities"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, capabilities, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param Capabilities capabilities: The set of updated capabilities. + """ + if capabilities is None: + self.capabilities = Capabilities() + else: + self.capabilities = ( + Capabilities(update_ids_from_dap=update_ids_from_dap, **capabilities) + if capabilities.__class__ != Capabilities + else capabilities + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + capabilities = self.capabilities + dct = { + "capabilities": capabilities.to_dict(update_ids_to_dap=update_ids_to_dap), + } + dct.update(self.kwargs) + return dct + + +@register +class ProgressStartEventBody(BaseSchema): + """ + "body" of ProgressStartEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "progressId": { + "type": "string", + "description": "An ID that can be used in subsequent `progressUpdate` and `progressEnd` events to make them refer to the same progress reporting.\nIDs must be unique within a debug session.", + }, + "title": { + "type": "string", + "description": "Short title of the progress reporting. Shown in the UI to describe the long running operation.", + }, + "requestId": { + "type": "integer", + "description": "The request ID that this progress report is related to. If specified a debug adapter is expected to emit progress events for the long running request until the request has been either completed or cancelled.\nIf the request ID is omitted, the progress report is assumed to be related to some general activity of the debug adapter.", + }, + "cancellable": { + "type": "boolean", + "description": "If True, the request that reports progress may be cancelled with a `cancel` request.\nSo this property basically controls whether the client should use UX that supports cancellation.\nClients that don't support cancellation are allowed to ignore the setting.", + }, + "message": {"type": "string", "description": "More detailed progress message."}, + "percentage": { + "type": "number", + "description": "Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, progressId, title, requestId=None, cancellable=None, message=None, percentage=None, update_ids_from_dap=False, **kwargs + ): # noqa (update_ids_from_dap may be unused) + """ + :param string progressId: An ID that can be used in subsequent `progressUpdate` and `progressEnd` events to make them refer to the same progress reporting. + IDs must be unique within a debug session. + :param string title: Short title of the progress reporting. Shown in the UI to describe the long running operation. + :param integer requestId: The request ID that this progress report is related to. If specified a debug adapter is expected to emit progress events for the long running request until the request has been either completed or cancelled. + If the request ID is omitted, the progress report is assumed to be related to some general activity of the debug adapter. + :param boolean cancellable: If true, the request that reports progress may be cancelled with a `cancel` request. + So this property basically controls whether the client should use UX that supports cancellation. + Clients that don't support cancellation are allowed to ignore the setting. + :param string message: More detailed progress message. + :param number percentage: Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown. + """ + self.progressId = progressId + self.title = title + self.requestId = requestId + self.cancellable = cancellable + self.message = message + self.percentage = percentage + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + progressId = self.progressId + title = self.title + requestId = self.requestId + cancellable = self.cancellable + message = self.message + percentage = self.percentage + dct = { + "progressId": progressId, + "title": title, + } + if requestId is not None: + dct["requestId"] = requestId + if cancellable is not None: + dct["cancellable"] = cancellable + if message is not None: + dct["message"] = message + if percentage is not None: + dct["percentage"] = percentage + dct.update(self.kwargs) + return dct + + +@register +class ProgressUpdateEventBody(BaseSchema): + """ + "body" of ProgressUpdateEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "progressId": {"type": "string", "description": "The ID that was introduced in the initial `progressStart` event."}, + "message": {"type": "string", "description": "More detailed progress message. If omitted, the previous message (if any) is used."}, + "percentage": { + "type": "number", + "description": "Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, progressId, message=None, percentage=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string progressId: The ID that was introduced in the initial `progressStart` event. + :param string message: More detailed progress message. If omitted, the previous message (if any) is used. + :param number percentage: Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown. + """ + self.progressId = progressId + self.message = message + self.percentage = percentage + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + progressId = self.progressId + message = self.message + percentage = self.percentage + dct = { + "progressId": progressId, + } + if message is not None: + dct["message"] = message + if percentage is not None: + dct["percentage"] = percentage + dct.update(self.kwargs) + return dct + + +@register +class ProgressEndEventBody(BaseSchema): + """ + "body" of ProgressEndEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "progressId": {"type": "string", "description": "The ID that was introduced in the initial `ProgressStartEvent`."}, + "message": {"type": "string", "description": "More detailed progress message. If omitted, the previous message (if any) is used."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, progressId, message=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string progressId: The ID that was introduced in the initial `ProgressStartEvent`. + :param string message: More detailed progress message. If omitted, the previous message (if any) is used. + """ + self.progressId = progressId + self.message = message + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + progressId = self.progressId + message = self.message + dct = { + "progressId": progressId, + } + if message is not None: + dct["message"] = message + dct.update(self.kwargs) + return dct + + +@register +class InvalidatedEventBody(BaseSchema): + """ + "body" of InvalidatedEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "areas": { + "type": "array", + "description": "Set of logical areas that got invalidated. This property has a hint characteristic: a client can only be expected to make a 'best effort' in honoring the areas but there are no guarantees. If this property is missing, empty, or if values are not understood, the client should assume a single value `all`.", + "items": {"$ref": "#/definitions/InvalidatedAreas"}, + }, + "threadId": {"type": "integer", "description": "If specified, the client only needs to refetch data related to this thread."}, + "stackFrameId": { + "type": "integer", + "description": "If specified, the client only needs to refetch data related to this stack frame (and the `threadId` is ignored).", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, areas=None, threadId=None, stackFrameId=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array areas: Set of logical areas that got invalidated. This property has a hint characteristic: a client can only be expected to make a 'best effort' in honoring the areas but there are no guarantees. If this property is missing, empty, or if values are not understood, the client should assume a single value `all`. + :param integer threadId: If specified, the client only needs to refetch data related to this thread. + :param integer stackFrameId: If specified, the client only needs to refetch data related to this stack frame (and the `threadId` is ignored). + """ + self.areas = areas + if update_ids_from_dap and self.areas: + for o in self.areas: + InvalidatedAreas.update_dict_ids_from_dap(o) + self.threadId = threadId + self.stackFrameId = stackFrameId + if update_ids_from_dap: + self.threadId = self._translate_id_from_dap(self.threadId) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_from_dap(dct["threadId"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + areas = self.areas + if areas and hasattr(areas[0], "to_dict"): + areas = [x.to_dict() for x in areas] + threadId = self.threadId + stackFrameId = self.stackFrameId + if update_ids_to_dap: + if threadId is not None: + threadId = self._translate_id_to_dap(threadId) + dct = {} + if areas is not None: + dct["areas"] = [InvalidatedAreas.update_dict_ids_to_dap(o) for o in areas] if (update_ids_to_dap and areas) else areas + if threadId is not None: + dct["threadId"] = threadId + if stackFrameId is not None: + dct["stackFrameId"] = stackFrameId + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "threadId" in dct: + dct["threadId"] = cls._translate_id_to_dap(dct["threadId"]) + return dct + + +@register +class MemoryEventBody(BaseSchema): + """ + "body" of MemoryEvent + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "memoryReference": {"type": "string", "description": "Memory reference of a memory range that has been updated."}, + "offset": {"type": "integer", "description": "Starting offset in bytes where memory has been updated. Can be negative."}, + "count": {"type": "integer", "description": "Number of bytes updated."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, memoryReference, offset, count, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string memoryReference: Memory reference of a memory range that has been updated. + :param integer offset: Starting offset in bytes where memory has been updated. Can be negative. + :param integer count: Number of bytes updated. + """ + self.memoryReference = memoryReference + self.offset = offset + self.count = count + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + memoryReference = self.memoryReference + offset = self.offset + count = self.count + dct = { + "memoryReference": memoryReference, + "offset": offset, + "count": count, + } + dct.update(self.kwargs) + return dct + + +@register +class RunInTerminalRequestArgumentsEnv(BaseSchema): + """ + "env" of RunInTerminalRequestArguments + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register +class RunInTerminalResponseBody(BaseSchema): + """ + "body" of RunInTerminalResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "processId": {"type": "integer", "description": "The process ID. The value should be less than or equal to 2147483647 (2^31-1)."}, + "shellProcessId": { + "type": "integer", + "description": "The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1).", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, processId=None, shellProcessId=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer processId: The process ID. The value should be less than or equal to 2147483647 (2^31-1). + :param integer shellProcessId: The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1). + """ + self.processId = processId + self.shellProcessId = shellProcessId + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + processId = self.processId + shellProcessId = self.shellProcessId + dct = {} + if processId is not None: + dct["processId"] = processId + if shellProcessId is not None: + dct["shellProcessId"] = shellProcessId + dct.update(self.kwargs) + return dct + + +@register +class StartDebuggingRequestArgumentsConfiguration(BaseSchema): + """ + "configuration" of StartDebuggingRequestArguments + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register +class BreakpointLocationsResponseBody(BaseSchema): + """ + "body" of BreakpointLocationsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/BreakpointLocation"}, + "description": "Sorted set of possible breakpoint locations.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: Sorted set of possible breakpoint locations. + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + BreakpointLocation.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = { + "breakpoints": [BreakpointLocation.update_dict_ids_to_dap(o) for o in breakpoints] + if (update_ids_to_dap and breakpoints) + else breakpoints, + } + dct.update(self.kwargs) + return dct + + +@register +class SetBreakpointsResponseBody(BaseSchema): + """ + "body" of SetBreakpointsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the breakpoints.\nThe array elements are in the same order as the elements of the `breakpoints` (or the deprecated `lines`) array in the arguments.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: Information about the breakpoints. + The array elements are in the same order as the elements of the `breakpoints` (or the deprecated `lines`) array in the arguments. + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + Breakpoint.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = { + "breakpoints": [Breakpoint.update_dict_ids_to_dap(o) for o in breakpoints] + if (update_ids_to_dap and breakpoints) + else breakpoints, + } + dct.update(self.kwargs) + return dct + + +@register +class SetFunctionBreakpointsResponseBody(BaseSchema): + """ + "body" of SetFunctionBreakpointsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the breakpoints. The array elements correspond to the elements of the `breakpoints` array.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: Information about the breakpoints. The array elements correspond to the elements of the `breakpoints` array. + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + Breakpoint.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = { + "breakpoints": [Breakpoint.update_dict_ids_to_dap(o) for o in breakpoints] + if (update_ids_to_dap and breakpoints) + else breakpoints, + } + dct.update(self.kwargs) + return dct + + +@register +class SetExceptionBreakpointsResponseBody(BaseSchema): + """ + "body" of SetExceptionBreakpointsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the exception breakpoints or filters.\nThe breakpoints returned are in the same order as the elements of the `filters`, `filterOptions`, `exceptionOptions` arrays in the arguments. If both `filters` and `filterOptions` are given, the returned array must start with `filters` information first, followed by `filterOptions` information.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: Information about the exception breakpoints or filters. + The breakpoints returned are in the same order as the elements of the `filters`, `filterOptions`, `exceptionOptions` arrays in the arguments. If both `filters` and `filterOptions` are given, the returned array must start with `filters` information first, followed by `filterOptions` information. + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + Breakpoint.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = {} + if breakpoints is not None: + dct["breakpoints"] = ( + [Breakpoint.update_dict_ids_to_dap(o) for o in breakpoints] if (update_ids_to_dap and breakpoints) else breakpoints + ) + dct.update(self.kwargs) + return dct + + +@register +class DataBreakpointInfoResponseBody(BaseSchema): + """ + "body" of DataBreakpointInfoResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "dataId": { + "type": ["string", "null"], + "description": "An identifier for the data on which a data breakpoint can be registered with the `setDataBreakpoints` request or null if no data breakpoint is available. If a `variablesReference` or `frameId` is passed, the `dataId` is valid in the current suspended state, otherwise it's valid indefinitely. See 'Lifetime of Object References' in the Overview section for details. Breakpoints set using the `dataId` in the `setDataBreakpoints` request may outlive the lifetime of the associated `dataId`.", + }, + "description": { + "type": "string", + "description": "UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available.", + }, + "accessTypes": { + "type": "array", + "items": {"$ref": "#/definitions/DataBreakpointAccessType"}, + "description": "Attribute lists the available access types for a potential data breakpoint. A UI client could surface this information.", + }, + "canPersist": { + "type": "boolean", + "description": "Attribute indicates that a potential data breakpoint could be persisted across sessions.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, dataId, description, accessTypes=None, canPersist=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param ['string', 'null'] dataId: An identifier for the data on which a data breakpoint can be registered with the `setDataBreakpoints` request or null if no data breakpoint is available. If a `variablesReference` or `frameId` is passed, the `dataId` is valid in the current suspended state, otherwise it's valid indefinitely. See 'Lifetime of Object References' in the Overview section for details. Breakpoints set using the `dataId` in the `setDataBreakpoints` request may outlive the lifetime of the associated `dataId`. + :param string description: UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available. + :param array accessTypes: Attribute lists the available access types for a potential data breakpoint. A UI client could surface this information. + :param boolean canPersist: Attribute indicates that a potential data breakpoint could be persisted across sessions. + """ + self.dataId = dataId + self.description = description + self.accessTypes = accessTypes + if update_ids_from_dap and self.accessTypes: + for o in self.accessTypes: + DataBreakpointAccessType.update_dict_ids_from_dap(o) + self.canPersist = canPersist + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dataId = self.dataId + description = self.description + accessTypes = self.accessTypes + if accessTypes and hasattr(accessTypes[0], "to_dict"): + accessTypes = [x.to_dict() for x in accessTypes] + canPersist = self.canPersist + dct = { + "dataId": dataId, + "description": description, + } + if accessTypes is not None: + dct["accessTypes"] = ( + [DataBreakpointAccessType.update_dict_ids_to_dap(o) for o in accessTypes] + if (update_ids_to_dap and accessTypes) + else accessTypes + ) + if canPersist is not None: + dct["canPersist"] = canPersist + dct.update(self.kwargs) + return dct + + +@register +class SetDataBreakpointsResponseBody(BaseSchema): + """ + "body" of SetDataBreakpointsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the data breakpoints. The array elements correspond to the elements of the input argument `breakpoints` array.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: Information about the data breakpoints. The array elements correspond to the elements of the input argument `breakpoints` array. + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + Breakpoint.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = { + "breakpoints": [Breakpoint.update_dict_ids_to_dap(o) for o in breakpoints] + if (update_ids_to_dap and breakpoints) + else breakpoints, + } + dct.update(self.kwargs) + return dct + + +@register +class SetInstructionBreakpointsResponseBody(BaseSchema): + """ + "body" of SetInstructionBreakpointsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "breakpoints": { + "type": "array", + "items": {"$ref": "#/definitions/Breakpoint"}, + "description": "Information about the breakpoints. The array elements correspond to the elements of the `breakpoints` array.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, breakpoints, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array breakpoints: Information about the breakpoints. The array elements correspond to the elements of the `breakpoints` array. + """ + self.breakpoints = breakpoints + if update_ids_from_dap and self.breakpoints: + for o in self.breakpoints: + Breakpoint.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + breakpoints = self.breakpoints + if breakpoints and hasattr(breakpoints[0], "to_dict"): + breakpoints = [x.to_dict() for x in breakpoints] + dct = { + "breakpoints": [Breakpoint.update_dict_ids_to_dap(o) for o in breakpoints] + if (update_ids_to_dap and breakpoints) + else breakpoints, + } + dct.update(self.kwargs) + return dct + + +@register +class ContinueResponseBody(BaseSchema): + """ + "body" of ContinueResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "allThreadsContinued": { + "type": "boolean", + "description": "The value True (or a missing property) signals to the client that all threads have been resumed. The value false indicates that not all threads were resumed.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, allThreadsContinued=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param boolean allThreadsContinued: The value true (or a missing property) signals to the client that all threads have been resumed. The value false indicates that not all threads were resumed. + """ + self.allThreadsContinued = allThreadsContinued + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + allThreadsContinued = self.allThreadsContinued + dct = {} + if allThreadsContinued is not None: + dct["allThreadsContinued"] = allThreadsContinued + dct.update(self.kwargs) + return dct + + +@register +class StackTraceResponseBody(BaseSchema): + """ + "body" of StackTraceResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "stackFrames": { + "type": "array", + "items": {"$ref": "#/definitions/StackFrame"}, + "description": "The frames of the stack frame. If the array has length zero, there are no stack frames available.\nThis means that there is no location information available.", + }, + "totalFrames": { + "type": "integer", + "description": "The total number of frames available in the stack. If omitted or if `totalFrames` is larger than the available frames, a client is expected to request frames until a request returns less frames than requested (which indicates the end of the stack). Returning monotonically increasing `totalFrames` values for subsequent requests can be used to enforce paging in the client.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, stackFrames, totalFrames=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array stackFrames: The frames of the stack frame. If the array has length zero, there are no stack frames available. + This means that there is no location information available. + :param integer totalFrames: The total number of frames available in the stack. If omitted or if `totalFrames` is larger than the available frames, a client is expected to request frames until a request returns less frames than requested (which indicates the end of the stack). Returning monotonically increasing `totalFrames` values for subsequent requests can be used to enforce paging in the client. + """ + self.stackFrames = stackFrames + if update_ids_from_dap and self.stackFrames: + for o in self.stackFrames: + StackFrame.update_dict_ids_from_dap(o) + self.totalFrames = totalFrames + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + stackFrames = self.stackFrames + if stackFrames and hasattr(stackFrames[0], "to_dict"): + stackFrames = [x.to_dict() for x in stackFrames] + totalFrames = self.totalFrames + dct = { + "stackFrames": [StackFrame.update_dict_ids_to_dap(o) for o in stackFrames] + if (update_ids_to_dap and stackFrames) + else stackFrames, + } + if totalFrames is not None: + dct["totalFrames"] = totalFrames + dct.update(self.kwargs) + return dct + + +@register +class ScopesResponseBody(BaseSchema): + """ + "body" of ScopesResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "scopes": { + "type": "array", + "items": {"$ref": "#/definitions/Scope"}, + "description": "The scopes of the stack frame. If the array has length zero, there are no scopes available.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, scopes, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array scopes: The scopes of the stack frame. If the array has length zero, there are no scopes available. + """ + self.scopes = scopes + if update_ids_from_dap and self.scopes: + for o in self.scopes: + Scope.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + scopes = self.scopes + if scopes and hasattr(scopes[0], "to_dict"): + scopes = [x.to_dict() for x in scopes] + dct = { + "scopes": [Scope.update_dict_ids_to_dap(o) for o in scopes] if (update_ids_to_dap and scopes) else scopes, + } + dct.update(self.kwargs) + return dct + + +@register +class VariablesResponseBody(BaseSchema): + """ + "body" of VariablesResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "variables": { + "type": "array", + "items": {"$ref": "#/definitions/Variable"}, + "description": "All (or a range) of variables for the given variable reference.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, variables, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array variables: All (or a range) of variables for the given variable reference. + """ + self.variables = variables + if update_ids_from_dap and self.variables: + for o in self.variables: + Variable.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + variables = self.variables + if variables and hasattr(variables[0], "to_dict"): + variables = [x.to_dict() for x in variables] + dct = { + "variables": [Variable.update_dict_ids_to_dap(o) for o in variables] if (update_ids_to_dap and variables) else variables, + } + dct.update(self.kwargs) + return dct + + +@register +class SetVariableResponseBody(BaseSchema): + """ + "body" of SetVariableResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "value": {"type": "string", "description": "The new value of the variable."}, + "type": {"type": "string", "description": "The type of the new value. Typically shown in the UI when hovering over the value."}, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the new value is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is True.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + value, + type=None, + variablesReference=None, + namedVariables=None, + indexedVariables=None, + memoryReference=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string value: The new value of the variable. + :param string type: The type of the new value. Typically shown in the UI when hovering over the value. + :param integer variablesReference: If `variablesReference` is > 0, the new value is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details. + :param integer namedVariables: The number of named child variables. + The client can use this information to present the variables in a paged UI and fetch them in chunks. + The value should be less than or equal to 2147483647 (2^31-1). + :param integer indexedVariables: The number of indexed child variables. + The client can use this information to present the variables in a paged UI and fetch them in chunks. + The value should be less than or equal to 2147483647 (2^31-1). + :param string memoryReference: A memory reference to a location appropriate for this result. + For pointer type eval results, this is generally a reference to the memory address contained in the pointer. + This attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is true. + """ + self.value = value + self.type = type + self.variablesReference = variablesReference + self.namedVariables = namedVariables + self.indexedVariables = indexedVariables + self.memoryReference = memoryReference + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + value = self.value + type = self.type # noqa (assign to builtin) + variablesReference = self.variablesReference + namedVariables = self.namedVariables + indexedVariables = self.indexedVariables + memoryReference = self.memoryReference + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + dct = { + "value": value, + } + if type is not None: + dct["type"] = type + if variablesReference is not None: + dct["variablesReference"] = variablesReference + if namedVariables is not None: + dct["namedVariables"] = namedVariables + if indexedVariables is not None: + dct["indexedVariables"] = indexedVariables + if memoryReference is not None: + dct["memoryReference"] = memoryReference + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + return dct + + +@register +class SourceResponseBody(BaseSchema): + """ + "body" of SourceResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "content": {"type": "string", "description": "Content of the source reference."}, + "mimeType": {"type": "string", "description": "Content type (MIME type) of the source."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, content, mimeType=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string content: Content of the source reference. + :param string mimeType: Content type (MIME type) of the source. + """ + self.content = content + self.mimeType = mimeType + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + content = self.content + mimeType = self.mimeType + dct = { + "content": content, + } + if mimeType is not None: + dct["mimeType"] = mimeType + dct.update(self.kwargs) + return dct + + +@register +class ThreadsResponseBody(BaseSchema): + """ + "body" of ThreadsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"threads": {"type": "array", "items": {"$ref": "#/definitions/Thread"}, "description": "All threads."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, threads, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array threads: All threads. + """ + self.threads = threads + if update_ids_from_dap and self.threads: + for o in self.threads: + Thread.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + threads = self.threads + if threads and hasattr(threads[0], "to_dict"): + threads = [x.to_dict() for x in threads] + dct = { + "threads": [Thread.update_dict_ids_to_dap(o) for o in threads] if (update_ids_to_dap and threads) else threads, + } + dct.update(self.kwargs) + return dct + + +@register +class ModulesResponseBody(BaseSchema): + """ + "body" of ModulesResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "modules": {"type": "array", "items": {"$ref": "#/definitions/Module"}, "description": "All modules or range of modules."}, + "totalModules": {"type": "integer", "description": "The total number of modules available."}, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, modules, totalModules=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array modules: All modules or range of modules. + :param integer totalModules: The total number of modules available. + """ + self.modules = modules + if update_ids_from_dap and self.modules: + for o in self.modules: + Module.update_dict_ids_from_dap(o) + self.totalModules = totalModules + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + modules = self.modules + if modules and hasattr(modules[0], "to_dict"): + modules = [x.to_dict() for x in modules] + totalModules = self.totalModules + dct = { + "modules": [Module.update_dict_ids_to_dap(o) for o in modules] if (update_ids_to_dap and modules) else modules, + } + if totalModules is not None: + dct["totalModules"] = totalModules + dct.update(self.kwargs) + return dct + + +@register +class LoadedSourcesResponseBody(BaseSchema): + """ + "body" of LoadedSourcesResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"sources": {"type": "array", "items": {"$ref": "#/definitions/Source"}, "description": "Set of loaded sources."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, sources, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array sources: Set of loaded sources. + """ + self.sources = sources + if update_ids_from_dap and self.sources: + for o in self.sources: + Source.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + sources = self.sources + if sources and hasattr(sources[0], "to_dict"): + sources = [x.to_dict() for x in sources] + dct = { + "sources": [Source.update_dict_ids_to_dap(o) for o in sources] if (update_ids_to_dap and sources) else sources, + } + dct.update(self.kwargs) + return dct + + +@register +class EvaluateResponseBody(BaseSchema): + """ + "body" of EvaluateResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "result": {"type": "string", "description": "The result of the evaluate request."}, + "type": { + "type": "string", + "description": "The type of the evaluate result.\nThis attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is True.", + }, + "presentationHint": { + "description": "Properties of an evaluate result that can be used to determine how to render the result in the UI.", + "type": "VariablePresentationHint", + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is True.", + }, + } + __refs__ = set(["presentationHint"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + result, + variablesReference, + type=None, + presentationHint=None, + namedVariables=None, + indexedVariables=None, + memoryReference=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string result: The result of the evaluate request. + :param integer variablesReference: If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details. + :param string type: The type of the evaluate result. + This attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is true. + :param VariablePresentationHint presentationHint: Properties of an evaluate result that can be used to determine how to render the result in the UI. + :param integer namedVariables: The number of named child variables. + The client can use this information to present the variables in a paged UI and fetch them in chunks. + The value should be less than or equal to 2147483647 (2^31-1). + :param integer indexedVariables: The number of indexed child variables. + The client can use this information to present the variables in a paged UI and fetch them in chunks. + The value should be less than or equal to 2147483647 (2^31-1). + :param string memoryReference: A memory reference to a location appropriate for this result. + For pointer type eval results, this is generally a reference to the memory address contained in the pointer. + This attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is true. + """ + self.result = result + self.variablesReference = variablesReference + self.type = type + if presentationHint is None: + self.presentationHint = VariablePresentationHint() + else: + self.presentationHint = ( + VariablePresentationHint(update_ids_from_dap=update_ids_from_dap, **presentationHint) + if presentationHint.__class__ != VariablePresentationHint + else presentationHint + ) + self.namedVariables = namedVariables + self.indexedVariables = indexedVariables + self.memoryReference = memoryReference + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + result = self.result + variablesReference = self.variablesReference + type = self.type # noqa (assign to builtin) + presentationHint = self.presentationHint + namedVariables = self.namedVariables + indexedVariables = self.indexedVariables + memoryReference = self.memoryReference + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + dct = { + "result": result, + "variablesReference": variablesReference, + } + if type is not None: + dct["type"] = type + if presentationHint is not None: + dct["presentationHint"] = presentationHint.to_dict(update_ids_to_dap=update_ids_to_dap) + if namedVariables is not None: + dct["namedVariables"] = namedVariables + if indexedVariables is not None: + dct["indexedVariables"] = indexedVariables + if memoryReference is not None: + dct["memoryReference"] = memoryReference + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + return dct + + +@register +class SetExpressionResponseBody(BaseSchema): + """ + "body" of SetExpressionResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "value": {"type": "string", "description": "The new value of the expression."}, + "type": { + "type": "string", + "description": "The type of the value.\nThis attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is True.", + }, + "presentationHint": { + "description": "Properties of a value that can be used to determine how to render the result in the UI.", + "type": "VariablePresentationHint", + }, + "variablesReference": { + "type": "integer", + "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.", + }, + "namedVariables": { + "type": "integer", + "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "indexedVariables": { + "type": "integer", + "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1).", + }, + "memoryReference": { + "type": "string", + "description": "A memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is True.", + }, + } + __refs__ = set(["presentationHint"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__( + self, + value, + type=None, + presentationHint=None, + variablesReference=None, + namedVariables=None, + indexedVariables=None, + memoryReference=None, + update_ids_from_dap=False, + **kwargs, + ): # noqa (update_ids_from_dap may be unused) + """ + :param string value: The new value of the expression. + :param string type: The type of the value. + This attribute should only be returned by a debug adapter if the corresponding capability `supportsVariableType` is true. + :param VariablePresentationHint presentationHint: Properties of a value that can be used to determine how to render the result in the UI. + :param integer variablesReference: If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details. + :param integer namedVariables: The number of named child variables. + The client can use this information to present the variables in a paged UI and fetch them in chunks. + The value should be less than or equal to 2147483647 (2^31-1). + :param integer indexedVariables: The number of indexed child variables. + The client can use this information to present the variables in a paged UI and fetch them in chunks. + The value should be less than or equal to 2147483647 (2^31-1). + :param string memoryReference: A memory reference to a location appropriate for this result. + For pointer type eval results, this is generally a reference to the memory address contained in the pointer. + This attribute may be returned by a debug adapter if corresponding capability `supportsMemoryReferences` is true. + """ + self.value = value + self.type = type + if presentationHint is None: + self.presentationHint = VariablePresentationHint() + else: + self.presentationHint = ( + VariablePresentationHint(update_ids_from_dap=update_ids_from_dap, **presentationHint) + if presentationHint.__class__ != VariablePresentationHint + else presentationHint + ) + self.variablesReference = variablesReference + self.namedVariables = namedVariables + self.indexedVariables = indexedVariables + self.memoryReference = memoryReference + if update_ids_from_dap: + self.variablesReference = self._translate_id_from_dap(self.variablesReference) + self.kwargs = kwargs + + @classmethod + def update_dict_ids_from_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_from_dap(dct["variablesReference"]) + return dct + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + value = self.value + type = self.type # noqa (assign to builtin) + presentationHint = self.presentationHint + variablesReference = self.variablesReference + namedVariables = self.namedVariables + indexedVariables = self.indexedVariables + memoryReference = self.memoryReference + if update_ids_to_dap: + if variablesReference is not None: + variablesReference = self._translate_id_to_dap(variablesReference) + dct = { + "value": value, + } + if type is not None: + dct["type"] = type + if presentationHint is not None: + dct["presentationHint"] = presentationHint.to_dict(update_ids_to_dap=update_ids_to_dap) + if variablesReference is not None: + dct["variablesReference"] = variablesReference + if namedVariables is not None: + dct["namedVariables"] = namedVariables + if indexedVariables is not None: + dct["indexedVariables"] = indexedVariables + if memoryReference is not None: + dct["memoryReference"] = memoryReference + dct.update(self.kwargs) + return dct + + @classmethod + def update_dict_ids_to_dap(cls, dct): + if "variablesReference" in dct: + dct["variablesReference"] = cls._translate_id_to_dap(dct["variablesReference"]) + return dct + + +@register +class StepInTargetsResponseBody(BaseSchema): + """ + "body" of StepInTargetsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "targets": { + "type": "array", + "items": {"$ref": "#/definitions/StepInTarget"}, + "description": "The possible step-in targets of the specified source location.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, targets, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array targets: The possible step-in targets of the specified source location. + """ + self.targets = targets + if update_ids_from_dap and self.targets: + for o in self.targets: + StepInTarget.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + targets = self.targets + if targets and hasattr(targets[0], "to_dict"): + targets = [x.to_dict() for x in targets] + dct = { + "targets": [StepInTarget.update_dict_ids_to_dap(o) for o in targets] if (update_ids_to_dap and targets) else targets, + } + dct.update(self.kwargs) + return dct + + +@register +class GotoTargetsResponseBody(BaseSchema): + """ + "body" of GotoTargetsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "targets": { + "type": "array", + "items": {"$ref": "#/definitions/GotoTarget"}, + "description": "The possible goto targets of the specified location.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, targets, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array targets: The possible goto targets of the specified location. + """ + self.targets = targets + if update_ids_from_dap and self.targets: + for o in self.targets: + GotoTarget.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + targets = self.targets + if targets and hasattr(targets[0], "to_dict"): + targets = [x.to_dict() for x in targets] + dct = { + "targets": [GotoTarget.update_dict_ids_to_dap(o) for o in targets] if (update_ids_to_dap and targets) else targets, + } + dct.update(self.kwargs) + return dct + + +@register +class CompletionsResponseBody(BaseSchema): + """ + "body" of CompletionsResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "targets": {"type": "array", "items": {"$ref": "#/definitions/CompletionItem"}, "description": "The possible completions for ."} + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, targets, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array targets: The possible completions for . + """ + self.targets = targets + if update_ids_from_dap and self.targets: + for o in self.targets: + CompletionItem.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + targets = self.targets + if targets and hasattr(targets[0], "to_dict"): + targets = [x.to_dict() for x in targets] + dct = { + "targets": [CompletionItem.update_dict_ids_to_dap(o) for o in targets] if (update_ids_to_dap and targets) else targets, + } + dct.update(self.kwargs) + return dct + + +@register +class ExceptionInfoResponseBody(BaseSchema): + """ + "body" of ExceptionInfoResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "exceptionId": {"type": "string", "description": "ID of the exception that was thrown."}, + "description": {"type": "string", "description": "Descriptive text for the exception."}, + "breakMode": {"description": "Mode that caused the exception notification to be raised.", "type": "ExceptionBreakMode"}, + "details": {"description": "Detailed information about the exception.", "type": "ExceptionDetails"}, + } + __refs__ = set(["breakMode", "details"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, exceptionId, breakMode, description=None, details=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string exceptionId: ID of the exception that was thrown. + :param ExceptionBreakMode breakMode: Mode that caused the exception notification to be raised. + :param string description: Descriptive text for the exception. + :param ExceptionDetails details: Detailed information about the exception. + """ + self.exceptionId = exceptionId + if breakMode is not None: + assert breakMode in ExceptionBreakMode.VALID_VALUES + self.breakMode = breakMode + self.description = description + if details is None: + self.details = ExceptionDetails() + else: + self.details = ( + ExceptionDetails(update_ids_from_dap=update_ids_from_dap, **details) if details.__class__ != ExceptionDetails else details + ) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + exceptionId = self.exceptionId + breakMode = self.breakMode + description = self.description + details = self.details + dct = { + "exceptionId": exceptionId, + "breakMode": breakMode, + } + if description is not None: + dct["description"] = description + if details is not None: + dct["details"] = details.to_dict(update_ids_to_dap=update_ids_to_dap) + dct.update(self.kwargs) + return dct + + +@register +class ReadMemoryResponseBody(BaseSchema): + """ + "body" of ReadMemoryResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "address": { + "type": "string", + "description": "The address of the first byte of data returned.\nTreated as a hex value if prefixed with `0x`, or as a decimal value otherwise.", + }, + "unreadableBytes": { + "type": "integer", + "description": "The number of unreadable bytes encountered after the last successfully read byte.\nThis can be used to determine the number of bytes that should be skipped before a subsequent `readMemory` request succeeds.", + }, + "data": { + "type": "string", + "description": "The bytes read from memory, encoded using base64. If the decoded length of `data` is less than the requested `count` in the original `readMemory` request, and `unreadableBytes` is zero or omitted, then the client should assume it's reached the end of readable memory.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, address, unreadableBytes=None, data=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string address: The address of the first byte of data returned. + Treated as a hex value if prefixed with `0x`, or as a decimal value otherwise. + :param integer unreadableBytes: The number of unreadable bytes encountered after the last successfully read byte. + This can be used to determine the number of bytes that should be skipped before a subsequent `readMemory` request succeeds. + :param string data: The bytes read from memory, encoded using base64. If the decoded length of `data` is less than the requested `count` in the original `readMemory` request, and `unreadableBytes` is zero or omitted, then the client should assume it's reached the end of readable memory. + """ + self.address = address + self.unreadableBytes = unreadableBytes + self.data = data + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + address = self.address + unreadableBytes = self.unreadableBytes + data = self.data + dct = { + "address": address, + } + if unreadableBytes is not None: + dct["unreadableBytes"] = unreadableBytes + if data is not None: + dct["data"] = data + dct.update(self.kwargs) + return dct + + +@register +class WriteMemoryResponseBody(BaseSchema): + """ + "body" of WriteMemoryResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "offset": { + "type": "integer", + "description": "Property that should be returned when `allowPartial` is True to indicate the offset of the first byte of data successfully written. Can be negative.", + }, + "bytesWritten": { + "type": "integer", + "description": "Property that should be returned when `allowPartial` is True to indicate the number of bytes starting from address that were successfully written.", + }, + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, offset=None, bytesWritten=None, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param integer offset: Property that should be returned when `allowPartial` is true to indicate the offset of the first byte of data successfully written. Can be negative. + :param integer bytesWritten: Property that should be returned when `allowPartial` is true to indicate the number of bytes starting from address that were successfully written. + """ + self.offset = offset + self.bytesWritten = bytesWritten + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + offset = self.offset + bytesWritten = self.bytesWritten + dct = {} + if offset is not None: + dct["offset"] = offset + if bytesWritten is not None: + dct["bytesWritten"] = bytesWritten + dct.update(self.kwargs) + return dct + + +@register +class DisassembleResponseBody(BaseSchema): + """ + "body" of DisassembleResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "instructions": { + "type": "array", + "items": {"$ref": "#/definitions/DisassembledInstruction"}, + "description": "The list of disassembled instructions.", + } + } + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, instructions, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param array instructions: The list of disassembled instructions. + """ + self.instructions = instructions + if update_ids_from_dap and self.instructions: + for o in self.instructions: + DisassembledInstruction.update_dict_ids_from_dap(o) + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + instructions = self.instructions + if instructions and hasattr(instructions[0], "to_dict"): + instructions = [x.to_dict() for x in instructions] + dct = { + "instructions": [DisassembledInstruction.update_dict_ids_to_dap(o) for o in instructions] + if (update_ids_to_dap and instructions) + else instructions, + } + dct.update(self.kwargs) + return dct + + +@register +class MessageVariables(BaseSchema): + """ + "variables" of Message + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ """ + + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + dct = {} + dct.update(self.kwargs) + return dct + + +@register +class PydevdSystemInfoResponseBody(BaseSchema): + """ + "body" of PydevdSystemInfoResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = { + "python": {"description": "Information about the python version running in the current process.", "type": "PydevdPythonInfo"}, + "platform": { + "description": "Information about the plarforn on which the current process is running.", + "type": "PydevdPlatformInfo", + }, + "process": {"description": "Information about the current process.", "type": "PydevdProcessInfo"}, + "pydevd": {"description": "Information about pydevd.", "type": "PydevdInfo"}, + } + __refs__ = set(["python", "platform", "process", "pydevd"]) + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, python, platform, process, pydevd, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param PydevdPythonInfo python: Information about the python version running in the current process. + :param PydevdPlatformInfo platform: Information about the plarforn on which the current process is running. + :param PydevdProcessInfo process: Information about the current process. + :param PydevdInfo pydevd: Information about pydevd. + """ + if python is None: + self.python = PydevdPythonInfo() + else: + self.python = ( + PydevdPythonInfo(update_ids_from_dap=update_ids_from_dap, **python) if python.__class__ != PydevdPythonInfo else python + ) + if platform is None: + self.platform = PydevdPlatformInfo() + else: + self.platform = ( + PydevdPlatformInfo(update_ids_from_dap=update_ids_from_dap, **platform) + if platform.__class__ != PydevdPlatformInfo + else platform + ) + if process is None: + self.process = PydevdProcessInfo() + else: + self.process = ( + PydevdProcessInfo(update_ids_from_dap=update_ids_from_dap, **process) if process.__class__ != PydevdProcessInfo else process + ) + if pydevd is None: + self.pydevd = PydevdInfo() + else: + self.pydevd = PydevdInfo(update_ids_from_dap=update_ids_from_dap, **pydevd) if pydevd.__class__ != PydevdInfo else pydevd + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + python = self.python + platform = self.platform + process = self.process + pydevd = self.pydevd + dct = { + "python": python.to_dict(update_ids_to_dap=update_ids_to_dap), + "platform": platform.to_dict(update_ids_to_dap=update_ids_to_dap), + "process": process.to_dict(update_ids_to_dap=update_ids_to_dap), + "pydevd": pydevd.to_dict(update_ids_to_dap=update_ids_to_dap), + } + dct.update(self.kwargs) + return dct + + +@register +class PydevdAuthorizeResponseBody(BaseSchema): + """ + "body" of PydevdAuthorizeResponse + + Note: automatically generated code. Do not edit manually. + """ + + __props__ = {"clientAccessToken": {"type": "string", "description": "The access token to access the client (i.e.: usually the IDE)."}} + __refs__ = set() + + __slots__ = list(__props__.keys()) + ["kwargs"] + + def __init__(self, clientAccessToken, update_ids_from_dap=False, **kwargs): # noqa (update_ids_from_dap may be unused) + """ + :param string clientAccessToken: The access token to access the client (i.e.: usually the IDE). + """ + self.clientAccessToken = clientAccessToken + self.kwargs = kwargs + + def to_dict(self, update_ids_to_dap=False): # noqa (update_ids_to_dap may be unused) + clientAccessToken = self.clientAccessToken + dct = { + "clientAccessToken": clientAccessToken, + } + dct.update(self.kwargs) + return dct diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema_log.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema_log.py new file mode 100644 index 0000000..b3dda5a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema_log.py @@ -0,0 +1,45 @@ +import os +import traceback +from _pydevd_bundle.pydevd_constants import ForkSafeLock + +_pid = os.getpid() +_pid_msg = "%s: " % (_pid,) + +_debug_lock = ForkSafeLock() + +DEBUG = False +DEBUG_FILE = os.path.join(os.path.dirname(__file__), "__debug_output__.txt") + + +def debug(msg): + if DEBUG: + with _debug_lock: + _pid_prefix = _pid_msg + if isinstance(msg, bytes): + _pid_prefix = _pid_prefix.encode("utf-8") + + if not msg.endswith(b"\r") and not msg.endswith(b"\n"): + msg += b"\n" + mode = "a+b" + else: + if not msg.endswith("\r") and not msg.endswith("\n"): + msg += "\n" + mode = "a+" + with open(DEBUG_FILE, mode) as stream: + stream.write(_pid_prefix) + stream.write(msg) + + +def debug_exception(msg=None): + if DEBUG: + if msg: + debug(msg) + + with _debug_lock: + with open(DEBUG_FILE, "a+") as stream: + _pid_prefix = _pid_msg + if isinstance(msg, bytes): + _pid_prefix = _pid_prefix.encode("utf-8") + stream.write(_pid_prefix) + + traceback.print_exc(file=stream) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevconsole_code.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevconsole_code.py new file mode 100644 index 0000000..760036e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevconsole_code.py @@ -0,0 +1,553 @@ +""" +A copy of the code module in the standard library with some changes to work with +async evaluation. + +Utilities needed to emulate Python's interactive interpreter. +""" + +# Inspired by similar code by Jeff Epler and Fredrik Lundh. + +import sys +import traceback +import inspect + +# START --------------------------- from codeop import CommandCompiler, compile_command +# START --------------------------- from codeop import CommandCompiler, compile_command +# START --------------------------- from codeop import CommandCompiler, compile_command +# START --------------------------- from codeop import CommandCompiler, compile_command +# START --------------------------- from codeop import CommandCompiler, compile_command +r"""Utilities to compile possibly incomplete Python source code. + +This module provides two interfaces, broadly similar to the builtin +function compile(), which take program text, a filename and a 'mode' +and: + +- Return code object if the command is complete and valid +- Return None if the command is incomplete +- Raise SyntaxError, ValueError or OverflowError if the command is a + syntax error (OverflowError and ValueError can be produced by + malformed literals). + +Approach: + +First, check if the source consists entirely of blank lines and +comments; if so, replace it with 'pass', because the built-in +parser doesn't always do the right thing for these. + +Compile three times: as is, with \n, and with \n\n appended. If it +compiles as is, it's complete. If it compiles with one \n appended, +we expect more. If it doesn't compile either way, we compare the +error we get when compiling with \n or \n\n appended. If the errors +are the same, the code is broken. But if the errors are different, we +expect more. Not intuitive; not even guaranteed to hold in future +releases; but this matches the compiler's behavior from Python 1.4 +through 2.2, at least. + +Caveat: + +It is possible (but not likely) that the parser stops parsing with a +successful outcome before reaching the end of the source; in this +case, trailing symbols may be ignored instead of causing an error. +For example, a backslash followed by two newlines may be followed by +arbitrary garbage. This will be fixed once the API for the parser is +better. + +The two interfaces are: + +compile_command(source, filename, symbol): + + Compiles a single command in the manner described above. + +CommandCompiler(): + + Instances of this class have __call__ methods identical in + signature to compile_command; the difference is that if the + instance compiles program text containing a __future__ statement, + the instance 'remembers' and compiles all subsequent program texts + with the statement in force. + +The module also provides another class: + +Compile(): + + Instances of this class act like the built-in function compile, + but with 'memory' in the sense described above. +""" + +import __future__ + +_features = [getattr(__future__, fname) for fname in __future__.all_feature_names] + +__all__ = ["compile_command", "Compile", "CommandCompiler"] + +PyCF_DONT_IMPLY_DEDENT = 0x200 # Matches pythonrun.h + + +def _maybe_compile(compiler, source, filename, symbol): + # Check for source consisting of only blank lines and comments + for line in source.split("\n"): + line = line.strip() + if line and line[0] != "#": + break # Leave it alone + else: + if symbol != "eval": + source = "pass" # Replace it with a 'pass' statement + + err = err1 = err2 = None + code = code1 = code2 = None + + try: + code = compiler(source, filename, symbol) + except SyntaxError as err: + pass + + try: + code1 = compiler(source + "\n", filename, symbol) + except SyntaxError as e: + err1 = e + + try: + code2 = compiler(source + "\n\n", filename, symbol) + except SyntaxError as e: + err2 = e + + try: + if code: + return code + if not code1 and repr(err1) == repr(err2): + raise err1 + finally: + err1 = err2 = None + + +def _compile(source, filename, symbol): + return compile(source, filename, symbol, PyCF_DONT_IMPLY_DEDENT) + + +def compile_command(source, filename="", symbol="single"): + r"""Compile a command and determine whether it is incomplete. + + Arguments: + + source -- the source string; may contain \n characters + filename -- optional filename from which source was read; default + "" + symbol -- optional grammar start symbol; "single" (default) or "eval" + + Return value / exceptions raised: + + - Return a code object if the command is complete and valid + - Return None if the command is incomplete + - Raise SyntaxError, ValueError or OverflowError if the command is a + syntax error (OverflowError and ValueError can be produced by + malformed literals). + """ + return _maybe_compile(_compile, source, filename, symbol) + + +class Compile: + """Instances of this class behave much like the built-in compile + function, but if one is used to compile text containing a future + statement, it "remembers" and compiles all subsequent program texts + with the statement in force.""" + + def __init__(self): + self.flags = PyCF_DONT_IMPLY_DEDENT + + try: + from ast import PyCF_ALLOW_TOP_LEVEL_AWAIT + + self.flags |= PyCF_ALLOW_TOP_LEVEL_AWAIT + except: + pass + + def __call__(self, source, filename, symbol): + codeob = compile(source, filename, symbol, self.flags, 1) + for feature in _features: + if codeob.co_flags & feature.compiler_flag: + self.flags |= feature.compiler_flag + return codeob + + +class CommandCompiler: + """Instances of this class have __call__ methods identical in + signature to compile_command; the difference is that if the + instance compiles program text containing a __future__ statement, + the instance 'remembers' and compiles all subsequent program texts + with the statement in force.""" + + def __init__( + self, + ): + self.compiler = Compile() + + def __call__(self, source, filename="", symbol="single"): + r"""Compile a command and determine whether it is incomplete. + + Arguments: + + source -- the source string; may contain \n characters + filename -- optional filename from which source was read; + default "" + symbol -- optional grammar start symbol; "single" (default) or + "eval" + + Return value / exceptions raised: + + - Return a code object if the command is complete and valid + - Return None if the command is incomplete + - Raise SyntaxError, ValueError or OverflowError if the command is a + syntax error (OverflowError and ValueError can be produced by + malformed literals). + """ + return _maybe_compile(self.compiler, source, filename, symbol) + + +# END --------------------------- from codeop import CommandCompiler, compile_command +# END --------------------------- from codeop import CommandCompiler, compile_command +# END --------------------------- from codeop import CommandCompiler, compile_command +# END --------------------------- from codeop import CommandCompiler, compile_command +# END --------------------------- from codeop import CommandCompiler, compile_command + + +__all__ = ["InteractiveInterpreter", "InteractiveConsole", "interact", "compile_command"] + +from _pydev_bundle._pydev_saved_modules import threading + + +class _EvalAwaitInNewEventLoop(threading.Thread): + def __init__(self, compiled, updated_globals, updated_locals): + threading.Thread.__init__(self) + self.daemon = True + self._compiled = compiled + self._updated_globals = updated_globals + self._updated_locals = updated_locals + + # Output + self.evaluated_value = None + self.exc = None + + async def _async_func(self): + return await eval(self._compiled, self._updated_locals, self._updated_globals) + + def run(self): + try: + import asyncio + + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + self.evaluated_value = asyncio.run(self._async_func()) + except: + self.exc = sys.exc_info() + + +class InteractiveInterpreter: + """Base class for InteractiveConsole. + + This class deals with parsing and interpreter state (the user's + namespace); it doesn't deal with input buffering or prompting or + input file naming (the filename is always passed in explicitly). + + """ + + def __init__(self, locals=None): + """Constructor. + + The optional 'locals' argument specifies the dictionary in + which code will be executed; it defaults to a newly created + dictionary with key "__name__" set to "__console__" and key + "__doc__" set to None. + + """ + if locals is None: + locals = {"__name__": "__console__", "__doc__": None} + self.locals = locals + self.compile = CommandCompiler() + + def runsource(self, source, filename="", symbol="single"): + """Compile and run some source in the interpreter. + + Arguments are as for compile_command(). + + One of several things can happen: + + 1) The input is incorrect; compile_command() raised an + exception (SyntaxError or OverflowError). A syntax traceback + will be printed by calling the showsyntaxerror() method. + + 2) The input is incomplete, and more input is required; + compile_command() returned None. Nothing happens. + + 3) The input is complete; compile_command() returned a code + object. The code is executed by calling self.runcode() (which + also handles run-time exceptions, except for SystemExit). + + The return value is True in case 2, False in the other cases (unless + an exception is raised). The return value can be used to + decide whether to use sys.ps1 or sys.ps2 to prompt the next + line. + + """ + try: + code = self.compile(source, filename, symbol) + except (OverflowError, SyntaxError, ValueError): + # Case 1 + self.showsyntaxerror(filename) + return False + + if code is None: + # Case 2 + return True + + # Case 3 + self.runcode(code) + return False + + def runcode(self, code): + """Execute a code object. + + When an exception occurs, self.showtraceback() is called to + display a traceback. All exceptions are caught except + SystemExit, which is reraised. + + A note about KeyboardInterrupt: this exception may occur + elsewhere in this code, and may not always be caught. The + caller should be prepared to deal with it. + + """ + try: + is_async = False + if hasattr(inspect, "CO_COROUTINE"): + is_async = inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE + + if is_async: + t = _EvalAwaitInNewEventLoop(code, self.locals, None) + t.start() + t.join() + + if t.exc: + raise t.exc[1].with_traceback(t.exc[2]) + + else: + exec(code, self.locals) + except SystemExit: + raise + except: + self.showtraceback() + + def showsyntaxerror(self, filename=None): + """Display the syntax error that just occurred. + + This doesn't display a stack trace because there isn't one. + + If a filename is given, it is stuffed in the exception instead + of what was there before (because Python's parser always uses + "" when reading from a string). + + The output is written by self.write(), below. + + """ + type, value, tb = sys.exc_info() + sys.last_type = type + sys.last_value = value + sys.last_traceback = tb + if filename and type is SyntaxError: + # Work hard to stuff the correct filename in the exception + try: + msg, (dummy_filename, lineno, offset, line) = value.args + except ValueError: + # Not the format we expect; leave it alone + pass + else: + # Stuff in the right filename + value = SyntaxError(msg, (filename, lineno, offset, line)) + sys.last_value = value + if sys.excepthook is sys.__excepthook__: + lines = traceback.format_exception_only(type, value) + self.write("".join(lines)) + else: + # If someone has set sys.excepthook, we let that take precedence + # over self.write + sys.excepthook(type, value, tb) + + def showtraceback(self): + """Display the exception that just occurred. + + We remove the first stack item because it is our own code. + + The output is written by self.write(), below. + + """ + sys.last_type, sys.last_value, last_tb = ei = sys.exc_info() + sys.last_traceback = last_tb + try: + lines = traceback.format_exception(ei[0], ei[1], last_tb.tb_next) + if sys.excepthook is sys.__excepthook__: + self.write("".join(lines)) + else: + # If someone has set sys.excepthook, we let that take precedence + # over self.write + sys.excepthook(ei[0], ei[1], last_tb) + finally: + last_tb = ei = None + + def write(self, data): + """Write a string. + + The base implementation writes to sys.stderr; a subclass may + replace this with a different implementation. + + """ + sys.stderr.write(data) + + +class InteractiveConsole(InteractiveInterpreter): + """Closely emulate the behavior of the interactive Python interpreter. + + This class builds on InteractiveInterpreter and adds prompting + using the familiar sys.ps1 and sys.ps2, and input buffering. + + """ + + def __init__(self, locals=None, filename=""): + """Constructor. + + The optional locals argument will be passed to the + InteractiveInterpreter base class. + + The optional filename argument should specify the (file)name + of the input stream; it will show up in tracebacks. + + """ + InteractiveInterpreter.__init__(self, locals) + self.filename = filename + self.resetbuffer() + + def resetbuffer(self): + """Reset the input buffer.""" + self.buffer = [] + + def interact(self, banner=None, exitmsg=None): + """Closely emulate the interactive Python console. + + The optional banner argument specifies the banner to print + before the first interaction; by default it prints a banner + similar to the one printed by the real Python interpreter, + followed by the current class name in parentheses (so as not + to confuse this with the real interpreter -- since it's so + close!). + + The optional exitmsg argument specifies the exit message + printed when exiting. Pass the empty string to suppress + printing an exit message. If exitmsg is not given or None, + a default message is printed. + + """ + try: + sys.ps1 + except AttributeError: + sys.ps1 = ">>> " + try: + sys.ps2 + except AttributeError: + sys.ps2 = "... " + cprt = 'Type "help", "copyright", "credits" or "license" for more information.' + if banner is None: + self.write("Python %s on %s\n%s\n(%s)\n" % (sys.version, sys.platform, cprt, self.__class__.__name__)) + elif banner: + self.write("%s\n" % str(banner)) + more = 0 + while 1: + try: + if more: + prompt = sys.ps2 + else: + prompt = sys.ps1 + try: + line = self.raw_input(prompt) + except EOFError: + self.write("\n") + break + else: + more = self.push(line) + except KeyboardInterrupt: + self.write("\nKeyboardInterrupt\n") + self.resetbuffer() + more = 0 + if exitmsg is None: + self.write("now exiting %s...\n" % self.__class__.__name__) + elif exitmsg != "": + self.write("%s\n" % exitmsg) + + def push(self, line): + """Push a line to the interpreter. + + The line should not have a trailing newline; it may have + internal newlines. The line is appended to a buffer and the + interpreter's runsource() method is called with the + concatenated contents of the buffer as source. If this + indicates that the command was executed or invalid, the buffer + is reset; otherwise, the command is incomplete, and the buffer + is left as it was after the line was appended. The return + value is 1 if more input is required, 0 if the line was dealt + with in some way (this is the same as runsource()). + + """ + self.buffer.append(line) + source = "\n".join(self.buffer) + more = self.runsource(source, self.filename) + if not more: + self.resetbuffer() + return more + + def raw_input(self, prompt=""): + """Write a prompt and read a line. + + The returned line does not include the trailing newline. + When the user enters the EOF key sequence, EOFError is raised. + + The base implementation uses the built-in function + input(); a subclass may replace this with a different + implementation. + + """ + return input(prompt) + + +def interact(banner=None, readfunc=None, local=None, exitmsg=None): + """Closely emulate the interactive Python interpreter. + + This is a backwards compatible interface to the InteractiveConsole + class. When readfunc is not specified, it attempts to import the + readline module to enable GNU readline if it is available. + + Arguments (all optional, all default to None): + + banner -- passed to InteractiveConsole.interact() + readfunc -- if not None, replaces InteractiveConsole.raw_input() + local -- passed to InteractiveInterpreter.__init__() + exitmsg -- passed to InteractiveConsole.interact() + + """ + console = InteractiveConsole(local) + if readfunc is not None: + console.raw_input = readfunc + else: + try: + import readline + except ImportError: + pass + console.interact(banner, exitmsg) + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("-q", action="store_true", help="don't print version and copyright messages") + args = parser.parse_args() + if args.q or sys.flags.quiet: + banner = "" + else: + banner = None + interact(banner) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info.py new file mode 100644 index 0000000..8bfb1e4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info.py @@ -0,0 +1,41 @@ +# Defines which version of the PyDBAdditionalThreadInfo we'll use. +from _pydevd_bundle.pydevd_constants import ENV_FALSE_LOWER_VALUES, USE_CYTHON_FLAG, ENV_TRUE_LOWER_VALUES + +if USE_CYTHON_FLAG in ENV_TRUE_LOWER_VALUES: + # We must import the cython version if forcing cython + from _pydevd_bundle.pydevd_cython_wrapper import ( + PyDBAdditionalThreadInfo, + set_additional_thread_info, + _set_additional_thread_info_lock, # @UnusedImport + any_thread_stepping, + remove_additional_info, + ) # @UnusedImport + +elif USE_CYTHON_FLAG in ENV_FALSE_LOWER_VALUES: + # Use the regular version if not forcing cython + from _pydevd_bundle.pydevd_additional_thread_info_regular import ( + PyDBAdditionalThreadInfo, + set_additional_thread_info, + _set_additional_thread_info_lock, # @UnusedImport @Reimport + any_thread_stepping, + remove_additional_info, + ) # @UnusedImport @Reimport + +else: + # Regular: use fallback if not found (message is already given elsewhere). + try: + from _pydevd_bundle.pydevd_cython_wrapper import ( + PyDBAdditionalThreadInfo, + set_additional_thread_info, + _set_additional_thread_info_lock, + any_thread_stepping, + remove_additional_info, + ) + except ImportError: + from _pydevd_bundle.pydevd_additional_thread_info_regular import ( + PyDBAdditionalThreadInfo, + set_additional_thread_info, + _set_additional_thread_info_lock, # @UnusedImport + any_thread_stepping, + remove_additional_info, + ) # @UnusedImport diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info_regular.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info_regular.py new file mode 100644 index 0000000..5db804b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info_regular.py @@ -0,0 +1,328 @@ +from _pydevd_bundle.pydevd_constants import ( + STATE_RUN, + PYTHON_SUSPEND, + SUPPORT_GEVENT, + ForkSafeLock, + _current_frames, + STATE_SUSPEND, + get_global_debugger, + get_thread_id, +) +from _pydev_bundle import pydev_log +from _pydev_bundle._pydev_saved_modules import threading +from _pydev_bundle.pydev_is_thread_alive import is_thread_alive +import weakref + +version = 11 + + +# ======================================================================================================================= +# PyDBAdditionalThreadInfo +# ======================================================================================================================= +# fmt: off +# IFDEF CYTHON +# cdef class PyDBAdditionalThreadInfo: +# ELSE +class PyDBAdditionalThreadInfo(object): +# ENDIF +# fmt: on + + # Note: the params in cython are declared in pydevd_cython.pxd. + # fmt: off + # IFDEF CYTHON + # ELSE + __slots__ = [ + "pydev_state", + "pydev_step_stop", + "pydev_original_step_cmd", + "pydev_step_cmd", + "pydev_notify_kill", + "pydev_django_resolve_frame", + "pydev_call_from_jinja2", + "pydev_call_inside_jinja2", + "is_tracing", + "conditional_breakpoint_exception", + "pydev_message", + "suspend_type", + "pydev_next_line", + "pydev_func_name", + "suspended_at_unhandled", + "trace_suspend_type", + "top_level_thread_tracer_no_back_frames", + "top_level_thread_tracer_unhandled", + "thread_tracer", + "step_in_initial_location", + # Used for CMD_SMART_STEP_INTO (to know which smart step into variant to use) + "pydev_smart_parent_offset", + "pydev_smart_child_offset", + # Used for CMD_SMART_STEP_INTO (list[_pydevd_bundle.pydevd_bytecode_utils.Variant]) + # Filled when the cmd_get_smart_step_into_variants is requested (so, this is a copy + # of the last request for a given thread and pydev_smart_parent_offset/pydev_smart_child_offset relies on it). + "pydev_smart_step_into_variants", + "target_id_to_smart_step_into_variant", + "pydev_use_scoped_step_frame", + "weak_thread", + "is_in_wait_loop", + ] + # ENDIF + # fmt: on + + def __init__(self): + self.pydev_state = STATE_RUN # STATE_RUN or STATE_SUSPEND + self.pydev_step_stop = None + + # Note: we have `pydev_original_step_cmd` and `pydev_step_cmd` because the original is to + # say the action that started it and the other is to say what's the current tracing behavior + # (because it's possible that we start with a step over but may have to switch to a + # different step strategy -- for instance, if a step over is done and we return the current + # method the strategy is changed to a step in). + + self.pydev_original_step_cmd = -1 # Something as CMD_STEP_INTO, CMD_STEP_OVER, etc. + self.pydev_step_cmd = -1 # Something as CMD_STEP_INTO, CMD_STEP_OVER, etc. + + self.pydev_notify_kill = False + self.pydev_django_resolve_frame = False + self.pydev_call_from_jinja2 = None + self.pydev_call_inside_jinja2 = None + self.is_tracing = 0 + self.conditional_breakpoint_exception = None + self.pydev_message = "" + self.suspend_type = PYTHON_SUSPEND + self.pydev_next_line = -1 + self.pydev_func_name = ".invalid." # Must match the type in cython + self.suspended_at_unhandled = False + self.trace_suspend_type = "trace" # 'trace' or 'frame_eval' + self.top_level_thread_tracer_no_back_frames = [] + self.top_level_thread_tracer_unhandled = None + self.thread_tracer = None + self.step_in_initial_location = None + self.pydev_smart_parent_offset = -1 + self.pydev_smart_child_offset = -1 + self.pydev_smart_step_into_variants = () + self.target_id_to_smart_step_into_variant = {} + + # Flag to indicate ipython use-case where each line will be executed as a call/line/return + # in a new new frame but in practice we want to consider each new frame as if it was all + # part of the same frame. + # + # In practice this means that a step over shouldn't revert to a step in and we need some + # special logic to know when we should stop in a step over as we need to consider 2 + # different frames as being equal if they're logically the continuation of a frame + # being executed by ipython line by line. + # + # See: https://github.com/microsoft/debugpy/issues/869#issuecomment-1132141003 + self.pydev_use_scoped_step_frame = False + self.weak_thread = None + + # Purpose: detect if this thread is suspended and actually in the wait loop + # at this time (otherwise it may be suspended but still didn't reach a point. + # to pause). + self.is_in_wait_loop = False + + # fmt: off + # IFDEF CYTHON + # cpdef object _get_related_thread(self): + # ELSE + def _get_related_thread(self): + # ENDIF + # fmt: on + if self.pydev_notify_kill: # Already killed + return None + + if self.weak_thread is None: + return None + + thread = self.weak_thread() + if thread is None: + return False + + if not is_thread_alive(thread): + return None + + if thread._ident is None: # Can this happen? + pydev_log.critical("thread._ident is None in _get_related_thread!") + return None + + if threading._active.get(thread._ident) is not thread: + return None + + return thread + + # fmt: off + # IFDEF CYTHON + # cpdef bint _is_stepping(self): + # ELSE + def _is_stepping(self): + # ENDIF + # fmt: on + if self.pydev_state == STATE_RUN and self.pydev_step_cmd != -1: + # This means actually stepping in a step operation. + return True + + if self.pydev_state == STATE_SUSPEND and self.is_in_wait_loop: + # This means stepping because it was suspended but still didn't + # reach a suspension point. + return True + + return False + + # fmt: off + # IFDEF CYTHON + # cpdef get_topmost_frame(self, thread): + # ELSE + def get_topmost_frame(self, thread): + # ENDIF + # fmt: on + """ + Gets the topmost frame for the given thread. Note that it may be None + and callers should remove the reference to the frame as soon as possible + to avoid disturbing user code. + """ + # sys._current_frames(): dictionary with thread id -> topmost frame + current_frames = _current_frames() + topmost_frame = current_frames.get(thread._ident) + if topmost_frame is None: + # Note: this is expected for dummy threads (so, getting the topmost frame should be + # treated as optional). + pydev_log.info( + "Unable to get topmost frame for thread: %s, thread.ident: %s, id(thread): %s\nCurrent frames: %s.\n" "GEVENT_SUPPORT: %s", + thread, + thread.ident, + id(thread), + current_frames, + SUPPORT_GEVENT, + ) + + return topmost_frame + + # fmt: off + # IFDEF CYTHON + # cpdef update_stepping_info(self): + # ELSE + def update_stepping_info(self): + # ENDIF + # fmt: on + _update_stepping_info(self) + + def __str__(self): + return "State:%s Stop:%s Cmd: %s Kill:%s" % (self.pydev_state, self.pydev_step_stop, self.pydev_step_cmd, self.pydev_notify_kill) + + +_set_additional_thread_info_lock = ForkSafeLock() +_next_additional_info = [PyDBAdditionalThreadInfo()] + + +# fmt: off +# IFDEF CYTHON +# cpdef set_additional_thread_info(thread): +# ELSE +def set_additional_thread_info(thread): +# ENDIF +# fmt: on + try: + additional_info = thread.additional_info + if additional_info is None: + raise AttributeError() + except: + with _set_additional_thread_info_lock: + # If it's not there, set it within a lock to avoid any racing + # conditions. + try: + additional_info = thread.additional_info + except: + additional_info = None + + if additional_info is None: + # Note: don't call PyDBAdditionalThreadInfo constructor at this + # point as it can piggy-back into the debugger which could + # get here again, rather get the global ref which was pre-created + # and add a new entry only after we set thread.additional_info. + additional_info = _next_additional_info[0] + thread.additional_info = additional_info + additional_info.weak_thread = weakref.ref(thread) + add_additional_info(additional_info) + del _next_additional_info[:] + _next_additional_info.append(PyDBAdditionalThreadInfo()) + + return additional_info + + +# fmt: off +# IFDEF CYTHON +# cdef set _all_infos +# cdef set _infos_stepping +# cdef object _update_infos_lock +# ELSE +# ENDIF +# fmt: on + +_all_infos = set() +_infos_stepping = set() +_update_infos_lock = ForkSafeLock() + + +# fmt: off +# IFDEF CYTHON +# cdef _update_stepping_info(PyDBAdditionalThreadInfo info): +# ELSE +def _update_stepping_info(info): +# ENDIF +# fmt: on + + global _infos_stepping + global _all_infos + + with _update_infos_lock: + # Removes entries that are no longer valid. + new_all_infos = set() + for info in _all_infos: + if info._get_related_thread() is not None: + new_all_infos.add(info) + _all_infos = new_all_infos + + new_stepping = set() + for info in _all_infos: + if info._is_stepping(): + new_stepping.add(info) + _infos_stepping = new_stepping + + py_db = get_global_debugger() + if py_db is not None and not py_db.pydb_disposed: + thread = info.weak_thread() + if thread is not None: + thread_id = get_thread_id(thread) + _queue, event = py_db.get_internal_queue_and_event(thread_id) + event.set() + +# fmt: off +# IFDEF CYTHON +# cpdef add_additional_info(PyDBAdditionalThreadInfo info): +# ELSE +def add_additional_info(info): +# ENDIF +# fmt: on + with _update_infos_lock: + _all_infos.add(info) + if info._is_stepping(): + _infos_stepping.add(info) + +# fmt: off +# IFDEF CYTHON +# cpdef remove_additional_info(PyDBAdditionalThreadInfo info): +# ELSE +def remove_additional_info(info): +# ENDIF +# fmt: on + with _update_infos_lock: + _all_infos.discard(info) + _infos_stepping.discard(info) + + +# fmt: off +# IFDEF CYTHON +# cpdef bint any_thread_stepping(): +# ELSE +def any_thread_stepping(): +# ENDIF +# fmt: on + return bool(_infos_stepping) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_api.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_api.py new file mode 100644 index 0000000..c85ad0f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_api.py @@ -0,0 +1,1200 @@ +import sys +import bisect +import types + +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle import pydevd_utils, pydevd_source_mapping +from _pydevd_bundle.pydevd_additional_thread_info import set_additional_thread_info +from _pydevd_bundle.pydevd_comm import ( + InternalGetThreadStack, + internal_get_completions, + InternalSetNextStatementThread, + internal_reload_code, + InternalGetVariable, + InternalGetArray, + InternalLoadFullValue, + internal_get_description, + internal_get_frame, + internal_evaluate_expression, + InternalConsoleExec, + internal_get_variable_json, + internal_change_variable, + internal_change_variable_json, + internal_evaluate_expression_json, + internal_set_expression_json, + internal_get_exception_details_json, + internal_step_in_thread, + internal_smart_step_into, +) +from _pydevd_bundle.pydevd_comm_constants import ( + CMD_THREAD_SUSPEND, + file_system_encoding, + CMD_STEP_INTO_MY_CODE, + CMD_STOP_ON_START, + CMD_SMART_STEP_INTO, +) +from _pydevd_bundle.pydevd_constants import ( + get_current_thread_id, + set_protocol, + get_protocol, + HTTP_JSON_PROTOCOL, + JSON_PROTOCOL, + DebugInfoHolder, + IS_WINDOWS, + PYDEVD_USE_SYS_MONITORING, +) +from _pydevd_bundle.pydevd_net_command_factory_json import NetCommandFactoryJson +from _pydevd_bundle.pydevd_net_command_factory_xml import NetCommandFactory +import pydevd_file_utils +from _pydev_bundle import pydev_log +from _pydevd_bundle.pydevd_breakpoints import LineBreakpoint +from pydevd_tracing import get_exception_traceback_str +import os +import subprocess +import ctypes +from _pydevd_bundle.pydevd_collect_bytecode_info import code_to_bytecode_representation +import itertools +import linecache +from _pydevd_bundle.pydevd_utils import DAPGrouper, interrupt_main_thread +from _pydevd_bundle.pydevd_daemon_thread import run_as_pydevd_daemon_thread +from _pydevd_bundle.pydevd_thread_lifecycle import pydevd_find_thread_by_id, resume_threads +import tokenize +from _pydevd_sys_monitoring import pydevd_sys_monitoring + +try: + import dis +except ImportError: + + def _get_code_lines(code): + raise NotImplementedError + +else: + + def _get_code_lines(code): + if not isinstance(code, types.CodeType): + path = code + with tokenize.open(path) as f: + src = f.read() + code = compile(src, path, "exec", 0, dont_inherit=True) + return _get_code_lines(code) + + def iterate(): + # First, get all line starts for this code object. This does not include + # bodies of nested class and function definitions, as they have their + # own objects. + for _, lineno in dis.findlinestarts(code): + if lineno is not None: + yield lineno + + # For nested class and function definitions, their respective code objects + # are constants referenced by this object. + for const in code.co_consts: + if isinstance(const, types.CodeType) and const.co_filename == code.co_filename: + for lineno in _get_code_lines(const): + yield lineno + + return iterate() + + +class PyDevdAPI(object): + class VariablePresentation(object): + def __init__(self, special="group", function="group", class_="group", protected="inline"): + self._presentation = { + DAPGrouper.SCOPE_SPECIAL_VARS: special, + DAPGrouper.SCOPE_FUNCTION_VARS: function, + DAPGrouper.SCOPE_CLASS_VARS: class_, + DAPGrouper.SCOPE_PROTECTED_VARS: protected, + } + + def get_presentation(self, scope): + return self._presentation[scope] + + def run(self, py_db): + py_db.ready_to_run = True + + def notify_initialize(self, py_db): + py_db.on_initialize() + + def notify_configuration_done(self, py_db): + py_db.on_configuration_done() + + def notify_disconnect(self, py_db): + py_db.on_disconnect() + + def set_protocol(self, py_db, seq, protocol): + set_protocol(protocol.strip()) + if get_protocol() in (HTTP_JSON_PROTOCOL, JSON_PROTOCOL): + cmd_factory_class = NetCommandFactoryJson + else: + cmd_factory_class = NetCommandFactory + + if not isinstance(py_db.cmd_factory, cmd_factory_class): + py_db.cmd_factory = cmd_factory_class() + + return py_db.cmd_factory.make_protocol_set_message(seq) + + def set_ide_os_and_breakpoints_by(self, py_db, seq, ide_os, breakpoints_by): + """ + :param ide_os: 'WINDOWS' or 'UNIX' + :param breakpoints_by: 'ID' or 'LINE' + """ + if breakpoints_by == "ID": + py_db._set_breakpoints_with_id = True + else: + py_db._set_breakpoints_with_id = False + + self.set_ide_os(ide_os) + + return py_db.cmd_factory.make_version_message(seq) + + def set_ide_os(self, ide_os): + """ + :param ide_os: 'WINDOWS' or 'UNIX' + """ + pydevd_file_utils.set_ide_os(ide_os) + + def set_gui_event_loop(self, py_db, gui_event_loop): + py_db._gui_event_loop = gui_event_loop + + def send_error_message(self, py_db, msg): + cmd = py_db.cmd_factory.make_warning_message("pydevd: %s\n" % (msg,)) + py_db.writer.add_command(cmd) + + def set_show_return_values(self, py_db, show_return_values): + if show_return_values: + py_db.show_return_values = True + else: + if py_db.show_return_values: + # We should remove saved return values + py_db.remove_return_values_flag = True + py_db.show_return_values = False + pydev_log.debug("Show return values: %s", py_db.show_return_values) + + def list_threads(self, py_db, seq): + # Response is the command with the list of threads to be added to the writer thread. + return py_db.cmd_factory.make_list_threads_message(py_db, seq) + + def request_suspend_thread(self, py_db, thread_id="*"): + # Yes, thread suspend is done at this point, not through an internal command. + threads = [] + suspend_all = thread_id.strip() == "*" + if suspend_all: + threads = pydevd_utils.get_non_pydevd_threads() + + elif thread_id.startswith("__frame__:"): + sys.stderr.write("Can't suspend tasklet: %s\n" % (thread_id,)) + + else: + threads = [pydevd_find_thread_by_id(thread_id)] + + for t in threads: + if t is None: + continue + py_db.set_suspend( + t, + CMD_THREAD_SUSPEND, + suspend_other_threads=suspend_all, + is_pause=True, + ) + # Break here (even if it's suspend all) as py_db.set_suspend will + # take care of suspending other threads. + break + + def set_enable_thread_notifications(self, py_db, enable): + """ + When disabled, no thread notifications (for creation/removal) will be + issued until it's re-enabled. + + Note that when it's re-enabled, a creation notification will be sent for + all existing threads even if it was previously sent (this is meant to + be used on disconnect/reconnect). + """ + py_db.set_enable_thread_notifications(enable) + + def request_disconnect(self, py_db, resume_threads): + self.set_enable_thread_notifications(py_db, False) + self.remove_all_breakpoints(py_db, "*") + self.remove_all_exception_breakpoints(py_db) + self.notify_disconnect(py_db) + + if resume_threads: + self.request_resume_thread(thread_id="*") + + def request_resume_thread(self, thread_id): + resume_threads(thread_id) + + def request_completions(self, py_db, seq, thread_id, frame_id, act_tok, line=-1, column=-1): + py_db.post_method_as_internal_command( + thread_id, internal_get_completions, seq, thread_id, frame_id, act_tok, line=line, column=column + ) + + def request_stack(self, py_db, seq, thread_id, fmt=None, timeout=0.5, start_frame=0, levels=0): + # If it's already suspended, get it right away. + internal_get_thread_stack = InternalGetThreadStack( + seq, thread_id, py_db, set_additional_thread_info, fmt=fmt, timeout=timeout, start_frame=start_frame, levels=levels + ) + if internal_get_thread_stack.can_be_executed_by(get_current_thread_id(threading.current_thread())): + internal_get_thread_stack.do_it(py_db) + else: + py_db.post_internal_command(internal_get_thread_stack, "*") + + def request_exception_info_json(self, py_db, request, thread_id, thread, max_frames): + py_db.post_method_as_internal_command( + thread_id, + internal_get_exception_details_json, + request, + thread_id, + thread, + max_frames, + set_additional_thread_info=set_additional_thread_info, + iter_visible_frames_info=py_db.cmd_factory._iter_visible_frames_info, + ) + + def request_step(self, py_db, thread_id, step_cmd_id): + t = pydevd_find_thread_by_id(thread_id) + if t: + py_db.post_method_as_internal_command( + thread_id, + internal_step_in_thread, + thread_id, + step_cmd_id, + set_additional_thread_info=set_additional_thread_info, + ) + elif thread_id.startswith("__frame__:"): + sys.stderr.write("Can't make tasklet step command: %s\n" % (thread_id,)) + + def request_smart_step_into(self, py_db, seq, thread_id, offset, child_offset): + t = pydevd_find_thread_by_id(thread_id) + if t: + py_db.post_method_as_internal_command( + thread_id, internal_smart_step_into, thread_id, offset, child_offset, set_additional_thread_info=set_additional_thread_info + ) + elif thread_id.startswith("__frame__:"): + sys.stderr.write("Can't set next statement in tasklet: %s\n" % (thread_id,)) + + def request_smart_step_into_by_func_name(self, py_db, seq, thread_id, line, func_name): + # Same thing as set next, just with a different cmd id. + self.request_set_next(py_db, seq, thread_id, CMD_SMART_STEP_INTO, None, line, func_name) + + def request_set_next(self, py_db, seq, thread_id, set_next_cmd_id, original_filename, line, func_name): + """ + set_next_cmd_id may actually be one of: + + CMD_RUN_TO_LINE + CMD_SET_NEXT_STATEMENT + + CMD_SMART_STEP_INTO -- note: request_smart_step_into is preferred if it's possible + to work with bytecode offset. + + :param Optional[str] original_filename: + If available, the filename may be source translated, otherwise no translation will take + place (the set next just needs the line afterwards as it executes locally, but for + the Jupyter integration, the source mapping may change the actual lines and not only + the filename). + """ + t = pydevd_find_thread_by_id(thread_id) + if t: + if original_filename is not None: + translated_filename = self.filename_to_server(original_filename) # Apply user path mapping. + pydev_log.debug("Set next (after path translation) in: %s line: %s", translated_filename, line) + func_name = self.to_str(func_name) + + assert translated_filename.__class__ == str # i.e.: bytes on py2 and str on py3 + assert func_name.__class__ == str # i.e.: bytes on py2 and str on py3 + + # Apply source mapping (i.e.: ipython). + _source_mapped_filename, new_line, multi_mapping_applied = py_db.source_mapping.map_to_server(translated_filename, line) + if multi_mapping_applied: + pydev_log.debug("Set next (after source mapping) in: %s line: %s", translated_filename, line) + line = new_line + + int_cmd = InternalSetNextStatementThread(thread_id, set_next_cmd_id, line, func_name, seq=seq) + py_db.post_internal_command(int_cmd, thread_id) + elif thread_id.startswith("__frame__:"): + sys.stderr.write("Can't set next statement in tasklet: %s\n" % (thread_id,)) + + def request_reload_code(self, py_db, seq, module_name, filename): + """ + :param seq: if -1 no message will be sent back when the reload is done. + + Note: either module_name or filename may be None (but not both at the same time). + """ + thread_id = "*" # Any thread + # Note: not going for the main thread because in this case it'd only do the load + # when we stopped on a breakpoint. + py_db.post_method_as_internal_command(thread_id, internal_reload_code, seq, module_name, filename) + + def request_change_variable(self, py_db, seq, thread_id, frame_id, scope, attr, value): + """ + :param scope: 'FRAME' or 'GLOBAL' + """ + py_db.post_method_as_internal_command(thread_id, internal_change_variable, seq, thread_id, frame_id, scope, attr, value) + + def request_get_variable(self, py_db, seq, thread_id, frame_id, scope, attrs): + """ + :param scope: 'FRAME' or 'GLOBAL' + """ + int_cmd = InternalGetVariable(seq, thread_id, frame_id, scope, attrs) + py_db.post_internal_command(int_cmd, thread_id) + + def request_get_array(self, py_db, seq, roffset, coffset, rows, cols, fmt, thread_id, frame_id, scope, attrs): + int_cmd = InternalGetArray(seq, roffset, coffset, rows, cols, fmt, thread_id, frame_id, scope, attrs) + py_db.post_internal_command(int_cmd, thread_id) + + def request_load_full_value(self, py_db, seq, thread_id, frame_id, vars): + int_cmd = InternalLoadFullValue(seq, thread_id, frame_id, vars) + py_db.post_internal_command(int_cmd, thread_id) + + def request_get_description(self, py_db, seq, thread_id, frame_id, expression): + py_db.post_method_as_internal_command(thread_id, internal_get_description, seq, thread_id, frame_id, expression) + + def request_get_frame(self, py_db, seq, thread_id, frame_id): + py_db.post_method_as_internal_command(thread_id, internal_get_frame, seq, thread_id, frame_id) + + def to_str(self, s): + """ + -- in py3 raises an error if it's not str already. + """ + if s.__class__ != str: + raise AssertionError("Expected to have str on Python 3. Found: %s (%s)" % (s, s.__class__)) + return s + + def filename_to_str(self, filename): + """ + -- in py3 raises an error if it's not str already. + """ + if filename.__class__ != str: + raise AssertionError("Expected to have str on Python 3. Found: %s (%s)" % (filename, filename.__class__)) + return filename + + def filename_to_server(self, filename): + filename = self.filename_to_str(filename) + filename = pydevd_file_utils.map_file_to_server(filename) + return filename + + class _DummyFrame(object): + """ + Dummy frame to be used with PyDB.apply_files_filter (as we don't really have the + related frame as breakpoints are added before execution). + """ + + class _DummyCode(object): + def __init__(self, filename): + self.co_firstlineno = 1 + self.co_filename = filename + self.co_name = "invalid func name " + + def __init__(self, filename): + self.f_code = self._DummyCode(filename) + self.f_globals = {} + + ADD_BREAKPOINT_NO_ERROR = 0 + ADD_BREAKPOINT_FILE_NOT_FOUND = 1 + ADD_BREAKPOINT_FILE_EXCLUDED_BY_FILTERS = 2 + + # This means that the breakpoint couldn't be fully validated (more runtime + # information may be needed). + ADD_BREAKPOINT_LAZY_VALIDATION = 3 + ADD_BREAKPOINT_INVALID_LINE = 4 + + class _AddBreakpointResult(object): + # :see: ADD_BREAKPOINT_NO_ERROR = 0 + # :see: ADD_BREAKPOINT_FILE_NOT_FOUND = 1 + # :see: ADD_BREAKPOINT_FILE_EXCLUDED_BY_FILTERS = 2 + # :see: ADD_BREAKPOINT_LAZY_VALIDATION = 3 + # :see: ADD_BREAKPOINT_INVALID_LINE = 4 + + __slots__ = ["error_code", "breakpoint_id", "translated_filename", "translated_line", "original_line"] + + def __init__(self, breakpoint_id, translated_filename, translated_line, original_line): + self.error_code = PyDevdAPI.ADD_BREAKPOINT_NO_ERROR + self.breakpoint_id = breakpoint_id + self.translated_filename = translated_filename + self.translated_line = translated_line + self.original_line = original_line + + def add_breakpoint( + self, + py_db, + original_filename, + breakpoint_type, + breakpoint_id, + line, + condition, + func_name, + expression, + suspend_policy, + hit_condition, + is_logpoint, + adjust_line=False, + on_changed_breakpoint_state=None, + ): + """ + :param str original_filename: + Note: must be sent as it was received in the protocol. It may be translated in this + function and its final value will be available in the returned _AddBreakpointResult. + + :param str breakpoint_type: + One of: 'python-line', 'django-line', 'jinja2-line'. + + :param int breakpoint_id: + + :param int line: + Note: it's possible that a new line was actually used. If that's the case its + final value will be available in the returned _AddBreakpointResult. + + :param condition: + Either None or the condition to activate the breakpoint. + + :param str func_name: + If "None" (str), may hit in any context. + Empty string will hit only top level. + Any other value must match the scope of the method to be matched. + + :param str expression: + None or the expression to be evaluated. + + :param suspend_policy: + Either "NONE" (to suspend only the current thread when the breakpoint is hit) or + "ALL" (to suspend all threads when a breakpoint is hit). + + :param str hit_condition: + An expression where `@HIT@` will be replaced by the number of hits. + i.e.: `@HIT@ == x` or `@HIT@ >= x` + + :param bool is_logpoint: + If True and an expression is passed, pydevd will create an io message command with the + result of the evaluation. + + :param bool adjust_line: + If True, the breakpoint line should be adjusted if the current line doesn't really + match an executable line (if possible). + + :param callable on_changed_breakpoint_state: + This is called when something changed internally on the breakpoint after it was initially + added (for instance, template file_to_line_to_breakpoints could be signaled as invalid initially and later + when the related template is loaded, if the line is valid it could be marked as valid). + + The signature for the callback should be: + on_changed_breakpoint_state(breakpoint_id: int, add_breakpoint_result: _AddBreakpointResult) + + Note that the add_breakpoint_result should not be modified by the callback (the + implementation may internally reuse the same instance multiple times). + + :return _AddBreakpointResult: + """ + assert original_filename.__class__ == str, "Expected str, found: %s" % ( + original_filename.__class__, + ) # i.e.: bytes on py2 and str on py3 + + original_filename_normalized = pydevd_file_utils.normcase_from_client(original_filename) + + pydev_log.debug("Request for breakpoint in: %s line: %s", original_filename, line) + original_line = line + # Parameters to reapply breakpoint. + api_add_breakpoint_params = ( + original_filename, + breakpoint_type, + breakpoint_id, + line, + condition, + func_name, + expression, + suspend_policy, + hit_condition, + is_logpoint, + ) + + translated_filename = self.filename_to_server(original_filename) # Apply user path mapping. + pydev_log.debug("Breakpoint (after path translation) in: %s line: %s", translated_filename, line) + func_name = self.to_str(func_name) + + assert translated_filename.__class__ == str # i.e.: bytes on py2 and str on py3 + assert func_name.__class__ == str # i.e.: bytes on py2 and str on py3 + + # Apply source mapping (i.e.: ipython). + source_mapped_filename, new_line, multi_mapping_applied = py_db.source_mapping.map_to_server(translated_filename, line) + + if multi_mapping_applied: + pydev_log.debug("Breakpoint (after source mapping) in: %s line: %s", source_mapped_filename, new_line) + # Note that source mapping is internal and does not change the resulting filename nor line + # (we want the outside world to see the line in the original file and not in the ipython + # cell, otherwise the editor wouldn't be correct as the returned line is the line to + # which the breakpoint will be moved in the editor). + result = self._AddBreakpointResult(breakpoint_id, original_filename, line, original_line) + + # If a multi-mapping was applied, consider it the canonical / source mapped version (translated to ipython cell). + translated_absolute_filename = source_mapped_filename + canonical_normalized_filename = pydevd_file_utils.normcase(source_mapped_filename) + line = new_line + + else: + translated_absolute_filename = pydevd_file_utils.absolute_path(translated_filename) + canonical_normalized_filename = pydevd_file_utils.canonical_normalized_path(translated_filename) + + if adjust_line and not translated_absolute_filename.startswith("<"): + # Validate file_to_line_to_breakpoints and adjust their positions. + try: + lines = sorted(_get_code_lines(translated_absolute_filename)) + except Exception: + pass + else: + if line not in lines: + # Adjust to the first preceding valid line. + idx = bisect.bisect_left(lines, line) + if idx > 0: + line = lines[idx - 1] + + result = self._AddBreakpointResult(breakpoint_id, original_filename, line, original_line) + + py_db.api_received_breakpoints[(original_filename_normalized, breakpoint_id)] = ( + canonical_normalized_filename, + api_add_breakpoint_params, + ) + + if not translated_absolute_filename.startswith("<"): + # Note: if a mapping pointed to a file starting with '<', don't validate. + + if not pydevd_file_utils.exists(translated_absolute_filename): + result.error_code = self.ADD_BREAKPOINT_FILE_NOT_FOUND + return result + + if ( + py_db.is_files_filter_enabled + and not py_db.get_require_module_for_filters() + and py_db.apply_files_filter(self._DummyFrame(translated_absolute_filename), translated_absolute_filename, False) + ): + # Note that if `get_require_module_for_filters()` returns False, we don't do this check. + # This is because we don't have the module name given a file at this point (in + # runtime it's gotten from the frame.f_globals). + # An option could be calculate it based on the filename and current sys.path, + # but on some occasions that may be wrong (for instance with `__main__` or if + # the user dynamically changes the PYTHONPATH). + + # Note: depending on the use-case, filters may be changed, so, keep on going and add the + # breakpoint even with the error code. + result.error_code = self.ADD_BREAKPOINT_FILE_EXCLUDED_BY_FILTERS + + if breakpoint_type == "python-line": + added_breakpoint = LineBreakpoint( + breakpoint_id, line, condition, func_name, expression, suspend_policy, hit_condition=hit_condition, is_logpoint=is_logpoint + ) + + file_to_line_to_breakpoints = py_db.breakpoints + file_to_id_to_breakpoint = py_db.file_to_id_to_line_breakpoint + supported_type = True + + else: + add_plugin_breakpoint_result = None + plugin = py_db.get_plugin_lazy_init() + if plugin is not None: + add_plugin_breakpoint_result = plugin.add_breakpoint( + "add_line_breakpoint", + py_db, + breakpoint_type, + canonical_normalized_filename, + breakpoint_id, + line, + condition, + expression, + func_name, + hit_condition=hit_condition, + is_logpoint=is_logpoint, + add_breakpoint_result=result, + on_changed_breakpoint_state=on_changed_breakpoint_state, + ) + + if add_plugin_breakpoint_result is not None: + supported_type = True + added_breakpoint, file_to_line_to_breakpoints = add_plugin_breakpoint_result + file_to_id_to_breakpoint = py_db.file_to_id_to_plugin_breakpoint + else: + supported_type = False + + if not supported_type: + raise NameError(breakpoint_type) + + pydev_log.debug("Added breakpoint:%s - line:%s - func_name:%s\n", canonical_normalized_filename, line, func_name) + + if canonical_normalized_filename in file_to_id_to_breakpoint: + id_to_pybreakpoint = file_to_id_to_breakpoint[canonical_normalized_filename] + else: + id_to_pybreakpoint = file_to_id_to_breakpoint[canonical_normalized_filename] = {} + + id_to_pybreakpoint[breakpoint_id] = added_breakpoint + py_db.consolidate_breakpoints(canonical_normalized_filename, id_to_pybreakpoint, file_to_line_to_breakpoints) + if py_db.plugin is not None: + py_db.has_plugin_line_breaks = py_db.plugin.has_line_breaks(py_db) + py_db.plugin.after_breakpoints_consolidated( + py_db, canonical_normalized_filename, id_to_pybreakpoint, file_to_line_to_breakpoints + ) + + py_db.on_breakpoints_changed() + return result + + def reapply_breakpoints(self, py_db): + """ + Reapplies all the received breakpoints as they were received by the API (so, new + translations are applied). + """ + pydev_log.debug("Reapplying breakpoints.") + values = list(py_db.api_received_breakpoints.values()) # Create a copy with items to reapply. + self.remove_all_breakpoints(py_db, "*") + for val in values: + _new_filename, api_add_breakpoint_params = val + self.add_breakpoint(py_db, *api_add_breakpoint_params) + + def remove_all_breakpoints(self, py_db, received_filename): + """ + Removes all the breakpoints from a given file or from all files if received_filename == '*'. + + :param str received_filename: + Note: must be sent as it was received in the protocol. It may be translated in this + function. + """ + assert received_filename.__class__ == str # i.e.: bytes on py2 and str on py3 + changed = False + lst = [py_db.file_to_id_to_line_breakpoint, py_db.file_to_id_to_plugin_breakpoint, py_db.breakpoints] + if hasattr(py_db, "django_breakpoints"): + lst.append(py_db.django_breakpoints) + + if hasattr(py_db, "jinja2_breakpoints"): + lst.append(py_db.jinja2_breakpoints) + + if received_filename == "*": + py_db.api_received_breakpoints.clear() + + for file_to_id_to_breakpoint in lst: + if file_to_id_to_breakpoint: + file_to_id_to_breakpoint.clear() + changed = True + + else: + received_filename_normalized = pydevd_file_utils.normcase_from_client(received_filename) + items = list(py_db.api_received_breakpoints.items()) # Create a copy to remove items. + translated_filenames = [] + for key, val in items: + original_filename_normalized, _breakpoint_id = key + if original_filename_normalized == received_filename_normalized: + canonical_normalized_filename, _api_add_breakpoint_params = val + # Note: there can be actually 1:N mappings due to source mapping (i.e.: ipython). + translated_filenames.append(canonical_normalized_filename) + del py_db.api_received_breakpoints[key] + + for canonical_normalized_filename in translated_filenames: + for file_to_id_to_breakpoint in lst: + if canonical_normalized_filename in file_to_id_to_breakpoint: + file_to_id_to_breakpoint.pop(canonical_normalized_filename, None) + changed = True + + if changed: + py_db.on_breakpoints_changed(removed=True) + + def remove_breakpoint(self, py_db, received_filename, breakpoint_type, breakpoint_id): + """ + :param str received_filename: + Note: must be sent as it was received in the protocol. It may be translated in this + function. + + :param str breakpoint_type: + One of: 'python-line', 'django-line', 'jinja2-line'. + + :param int breakpoint_id: + """ + received_filename_normalized = pydevd_file_utils.normcase_from_client(received_filename) + for key, val in list(py_db.api_received_breakpoints.items()): + original_filename_normalized, existing_breakpoint_id = key + _new_filename, _api_add_breakpoint_params = val + if received_filename_normalized == original_filename_normalized and existing_breakpoint_id == breakpoint_id: + del py_db.api_received_breakpoints[key] + break + else: + pydev_log.info("Did not find breakpoint to remove: %s (breakpoint id: %s)", received_filename, breakpoint_id) + + file_to_id_to_breakpoint = None + received_filename = self.filename_to_server(received_filename) + canonical_normalized_filename = pydevd_file_utils.canonical_normalized_path(received_filename) + + if breakpoint_type == "python-line": + file_to_line_to_breakpoints = py_db.breakpoints + file_to_id_to_breakpoint = py_db.file_to_id_to_line_breakpoint + + elif py_db.plugin is not None: + result = py_db.plugin.get_breakpoints(py_db, breakpoint_type) + if result is not None: + file_to_id_to_breakpoint = py_db.file_to_id_to_plugin_breakpoint + file_to_line_to_breakpoints = result + + if file_to_id_to_breakpoint is None: + pydev_log.critical("Error removing breakpoint. Cannot handle breakpoint of type %s", breakpoint_type) + + else: + try: + id_to_pybreakpoint = file_to_id_to_breakpoint.get(canonical_normalized_filename, {}) + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + existing = id_to_pybreakpoint[breakpoint_id] + pydev_log.info( + "Removed breakpoint:%s - line:%s - func_name:%s (id: %s)\n" + % (canonical_normalized_filename, existing.line, existing.func_name, breakpoint_id) + ) + + del id_to_pybreakpoint[breakpoint_id] + py_db.consolidate_breakpoints(canonical_normalized_filename, id_to_pybreakpoint, file_to_line_to_breakpoints) + if py_db.plugin is not None: + py_db.has_plugin_line_breaks = py_db.plugin.has_line_breaks(py_db) + py_db.plugin.after_breakpoints_consolidated( + py_db, canonical_normalized_filename, id_to_pybreakpoint, file_to_line_to_breakpoints + ) + + except KeyError: + pydev_log.info( + "Error removing breakpoint: Breakpoint id not found: %s id: %s. Available ids: %s\n", + canonical_normalized_filename, + breakpoint_id, + list(id_to_pybreakpoint), + ) + + py_db.on_breakpoints_changed(removed=True) + + def set_function_breakpoints(self, py_db, function_breakpoints): + function_breakpoint_name_to_breakpoint = {} + for function_breakpoint in function_breakpoints: + function_breakpoint_name_to_breakpoint[function_breakpoint.func_name] = function_breakpoint + + py_db.function_breakpoint_name_to_breakpoint = function_breakpoint_name_to_breakpoint + py_db.on_breakpoints_changed() + + def request_exec_or_evaluate(self, py_db, seq, thread_id, frame_id, expression, is_exec, trim_if_too_big, attr_to_set_result): + py_db.post_method_as_internal_command( + thread_id, internal_evaluate_expression, seq, thread_id, frame_id, expression, is_exec, trim_if_too_big, attr_to_set_result + ) + + def request_exec_or_evaluate_json(self, py_db, request, thread_id): + py_db.post_method_as_internal_command(thread_id, internal_evaluate_expression_json, request, thread_id) + + def request_set_expression_json(self, py_db, request, thread_id): + py_db.post_method_as_internal_command(thread_id, internal_set_expression_json, request, thread_id) + + def request_console_exec(self, py_db, seq, thread_id, frame_id, expression): + int_cmd = InternalConsoleExec(seq, thread_id, frame_id, expression) + py_db.post_internal_command(int_cmd, thread_id) + + def request_load_source(self, py_db, seq, filename): + """ + :param str filename: + Note: must be sent as it was received in the protocol. It may be translated in this + function. + """ + try: + filename = self.filename_to_server(filename) + assert filename.__class__ == str # i.e.: bytes on py2 and str on py3 + + with tokenize.open(filename) as stream: + source = stream.read() + cmd = py_db.cmd_factory.make_load_source_message(seq, source) + except: + cmd = py_db.cmd_factory.make_error_message(seq, get_exception_traceback_str()) + + py_db.writer.add_command(cmd) + + def get_decompiled_source_from_frame_id(self, py_db, frame_id): + """ + :param py_db: + :param frame_id: + :throws Exception: + If unable to get the frame in the currently paused frames or if some error happened + when decompiling. + """ + variable = py_db.suspended_frames_manager.get_variable(int(frame_id)) + frame = variable.value + + # Check if it's in the linecache first. + lines = (linecache.getline(frame.f_code.co_filename, i) for i in itertools.count(1)) + lines = itertools.takewhile(bool, lines) # empty lines are '\n', EOF is '' + + source = "".join(lines) + if not source: + source = code_to_bytecode_representation(frame.f_code) + + return source + + def request_load_source_from_frame_id(self, py_db, seq, frame_id): + try: + source = self.get_decompiled_source_from_frame_id(py_db, frame_id) + cmd = py_db.cmd_factory.make_load_source_from_frame_id_message(seq, source) + except: + cmd = py_db.cmd_factory.make_error_message(seq, get_exception_traceback_str()) + + py_db.writer.add_command(cmd) + + def add_python_exception_breakpoint( + self, + py_db, + exception, + condition, + expression, + notify_on_handled_exceptions, + notify_on_unhandled_exceptions, + notify_on_user_unhandled_exceptions, + notify_on_first_raise_only, + ignore_libraries, + ): + exception_breakpoint = py_db.add_break_on_exception( + exception, + condition=condition, + expression=expression, + notify_on_handled_exceptions=notify_on_handled_exceptions, + notify_on_unhandled_exceptions=notify_on_unhandled_exceptions, + notify_on_user_unhandled_exceptions=notify_on_user_unhandled_exceptions, + notify_on_first_raise_only=notify_on_first_raise_only, + ignore_libraries=ignore_libraries, + ) + + if exception_breakpoint is not None: + py_db.on_breakpoints_changed() + + def add_plugins_exception_breakpoint(self, py_db, breakpoint_type, exception): + supported_type = False + plugin = py_db.get_plugin_lazy_init() + if plugin is not None: + supported_type = plugin.add_breakpoint("add_exception_breakpoint", py_db, breakpoint_type, exception) + + if supported_type: + py_db.has_plugin_exception_breaks = py_db.plugin.has_exception_breaks(py_db) + py_db.on_breakpoints_changed() + else: + raise NameError(breakpoint_type) + + def remove_python_exception_breakpoint(self, py_db, exception): + try: + cp = py_db.break_on_uncaught_exceptions.copy() + cp.pop(exception, None) + py_db.break_on_uncaught_exceptions = cp + + cp = py_db.break_on_caught_exceptions.copy() + cp.pop(exception, None) + py_db.break_on_caught_exceptions = cp + + cp = py_db.break_on_user_uncaught_exceptions.copy() + cp.pop(exception, None) + py_db.break_on_user_uncaught_exceptions = cp + except: + pydev_log.exception("Error while removing exception %s", sys.exc_info()[0]) + + py_db.on_breakpoints_changed(removed=True) + + def remove_plugins_exception_breakpoint(self, py_db, exception_type, exception): + # I.e.: no need to initialize lazy (if we didn't have it in the first place, we can't remove + # anything from it anyways). + plugin = py_db.plugin + if plugin is None: + return + + supported_type = plugin.remove_exception_breakpoint(py_db, exception_type, exception) + + if supported_type: + py_db.has_plugin_exception_breaks = py_db.plugin.has_exception_breaks(py_db) + else: + pydev_log.info("No exception of type: %s was previously registered.", exception_type) + + py_db.on_breakpoints_changed(removed=True) + + def remove_all_exception_breakpoints(self, py_db): + py_db.break_on_uncaught_exceptions = {} + py_db.break_on_caught_exceptions = {} + py_db.break_on_user_uncaught_exceptions = {} + + plugin = py_db.plugin + if plugin is not None: + plugin.remove_all_exception_breakpoints(py_db) + py_db.on_breakpoints_changed(removed=True) + + def set_project_roots(self, py_db, project_roots): + """ + :param str project_roots: + """ + py_db.set_project_roots(project_roots) + + def set_stepping_resumes_all_threads(self, py_db, stepping_resumes_all_threads): + py_db.stepping_resumes_all_threads = stepping_resumes_all_threads + + # Add it to the namespace so that it's available as PyDevdAPI.ExcludeFilter + from _pydevd_bundle.pydevd_filtering import ExcludeFilter # noqa + + def set_exclude_filters(self, py_db, exclude_filters): + """ + :param list(PyDevdAPI.ExcludeFilter) exclude_filters: + """ + py_db.set_exclude_filters(exclude_filters) + + def set_use_libraries_filter(self, py_db, use_libraries_filter): + py_db.set_use_libraries_filter(use_libraries_filter) + + def request_get_variable_json(self, py_db, request, thread_id): + """ + :param VariablesRequest request: + """ + py_db.post_method_as_internal_command(thread_id, internal_get_variable_json, request) + + def request_change_variable_json(self, py_db, request, thread_id): + """ + :param SetVariableRequest request: + """ + py_db.post_method_as_internal_command(thread_id, internal_change_variable_json, request) + + def set_dont_trace_start_end_patterns(self, py_db, start_patterns, end_patterns): + # Note: start/end patterns normalized internally. + start_patterns = tuple(pydevd_file_utils.normcase(x) for x in start_patterns) + end_patterns = tuple(pydevd_file_utils.normcase(x) for x in end_patterns) + + # After it's set the first time, we can still change it, but we need to reset the + # related caches. + reset_caches = False + dont_trace_start_end_patterns_previously_set = py_db.dont_trace_external_files.__name__ == "custom_dont_trace_external_files" + + if not dont_trace_start_end_patterns_previously_set and not start_patterns and not end_patterns: + # If it wasn't set previously and start and end patterns are empty we don't need to do anything. + return + + if not py_db.is_cache_file_type_empty(): + # i.e.: custom function set in set_dont_trace_start_end_patterns. + if dont_trace_start_end_patterns_previously_set: + reset_caches = ( + py_db.dont_trace_external_files.start_patterns != start_patterns + or py_db.dont_trace_external_files.end_patterns != end_patterns + ) + + else: + reset_caches = True + + def custom_dont_trace_external_files(abs_path): + normalized_abs_path = pydevd_file_utils.normcase(abs_path) + return normalized_abs_path.startswith(start_patterns) or normalized_abs_path.endswith(end_patterns) + + custom_dont_trace_external_files.start_patterns = start_patterns + custom_dont_trace_external_files.end_patterns = end_patterns + py_db.dont_trace_external_files = custom_dont_trace_external_files + + if reset_caches: + py_db.clear_dont_trace_start_end_patterns_caches() + + def stop_on_entry(self): + main_thread = pydevd_utils.get_main_thread() + if main_thread is None: + pydev_log.critical("Could not find main thread while setting Stop on Entry.") + else: + info = set_additional_thread_info(main_thread) + info.pydev_original_step_cmd = CMD_STOP_ON_START + info.pydev_step_cmd = CMD_STEP_INTO_MY_CODE + info.update_stepping_info() + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.update_monitor_events(suspend_requested=True) + pydevd_sys_monitoring.restart_events() + + def set_ignore_system_exit_codes(self, py_db, ignore_system_exit_codes): + py_db.set_ignore_system_exit_codes(ignore_system_exit_codes) + + SourceMappingEntry = pydevd_source_mapping.SourceMappingEntry + + def set_source_mapping(self, py_db, source_filename, mapping): + """ + :param str source_filename: + The filename for the source mapping (bytes on py2 and str on py3). + This filename will be made absolute in this function. + + :param list(SourceMappingEntry) mapping: + A list with the source mapping entries to be applied to the given filename. + + :return str: + An error message if it was not possible to set the mapping or an empty string if + everything is ok. + """ + source_filename = self.filename_to_server(source_filename) + absolute_source_filename = pydevd_file_utils.absolute_path(source_filename) + for map_entry in mapping: + map_entry.source_filename = absolute_source_filename + error_msg = py_db.source_mapping.set_source_mapping(absolute_source_filename, mapping) + if error_msg: + return error_msg + + self.reapply_breakpoints(py_db) + return "" + + def set_variable_presentation(self, py_db, variable_presentation): + assert isinstance(variable_presentation, self.VariablePresentation) + py_db.variable_presentation = variable_presentation + + def get_ppid(self): + """ + Provides the parent pid (even for older versions of Python on Windows). + """ + ppid = None + + try: + ppid = os.getppid() + except AttributeError: + pass + + if ppid is None and IS_WINDOWS: + ppid = self._get_windows_ppid() + + return ppid + + def _get_windows_ppid(self): + this_pid = os.getpid() + for ppid, pid in _list_ppid_and_pid(): + if pid == this_pid: + return ppid + + return None + + def _terminate_child_processes_windows(self, dont_terminate_child_pids): + this_pid = os.getpid() + for _ in range(50): # Try this at most 50 times before giving up. + # Note: we can't kill the process itself with taskkill, so, we + # list immediate children, kill that tree and then exit this process. + + children_pids = [] + for ppid, pid in _list_ppid_and_pid(): + if ppid == this_pid: + if pid not in dont_terminate_child_pids: + children_pids.append(pid) + + if not children_pids: + break + else: + for pid in children_pids: + self._call(["taskkill", "/F", "/PID", str(pid), "/T"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + del children_pids[:] + + def _terminate_child_processes_linux_and_mac(self, dont_terminate_child_pids): + this_pid = os.getpid() + + def list_children_and_stop_forking(initial_pid, stop=True): + children_pids = [] + if stop: + # Ask to stop forking (shouldn't be called for this process, only subprocesses). + self._call(["kill", "-STOP", str(initial_pid)], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + list_popen = self._popen(["pgrep", "-P", str(initial_pid)], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + if list_popen is not None: + stdout, _ = list_popen.communicate() + for line in stdout.splitlines(): + line = line.decode("ascii").strip() + if line: + pid = str(line) + if pid in dont_terminate_child_pids: + continue + children_pids.append(pid) + # Recursively get children. + children_pids.extend(list_children_and_stop_forking(pid)) + return children_pids + + previously_found = set() + + for _ in range(50): # Try this at most 50 times before giving up. + children_pids = list_children_and_stop_forking(this_pid, stop=False) + found_new = False + + for pid in children_pids: + if pid not in previously_found: + found_new = True + previously_found.add(pid) + self._call(["kill", "-KILL", str(pid)], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + if not found_new: + break + + def _popen(self, cmdline, **kwargs): + try: + return subprocess.Popen(cmdline, **kwargs) + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + pydev_log.exception("Error running: %s" % (" ".join(cmdline))) + return None + + def _call(self, cmdline, **kwargs): + try: + subprocess.check_call(cmdline, **kwargs) + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + pydev_log.exception("Error running: %s" % (" ".join(cmdline))) + + def set_terminate_child_processes(self, py_db, terminate_child_processes): + py_db.terminate_child_processes = terminate_child_processes + + def set_terminate_keyboard_interrupt(self, py_db, terminate_keyboard_interrupt): + py_db.terminate_keyboard_interrupt = terminate_keyboard_interrupt + + def terminate_process(self, py_db): + """ + Terminates the current process (and child processes if the option to also terminate + child processes is enabled). + """ + try: + if py_db.terminate_child_processes: + pydev_log.debug("Terminating child processes.") + if IS_WINDOWS: + self._terminate_child_processes_windows(py_db.dont_terminate_child_pids) + else: + self._terminate_child_processes_linux_and_mac(py_db.dont_terminate_child_pids) + finally: + pydev_log.debug("Exiting process (os._exit(0)).") + os._exit(0) + + def _terminate_if_commands_processed(self, py_db): + py_db.dispose_and_kill_all_pydevd_threads() + self.terminate_process(py_db) + + def request_terminate_process(self, py_db): + if py_db.terminate_keyboard_interrupt: + if not py_db.keyboard_interrupt_requested: + py_db.keyboard_interrupt_requested = True + interrupt_main_thread() + return + + # We mark with a terminate_requested to avoid that paused threads start running + # (we should terminate as is without letting any paused thread run). + py_db.terminate_requested = True + run_as_pydevd_daemon_thread(py_db, self._terminate_if_commands_processed, py_db) + + def setup_auto_reload_watcher(self, py_db, enable_auto_reload, watch_dirs, poll_target_time, exclude_patterns, include_patterns): + py_db.setup_auto_reload_watcher(enable_auto_reload, watch_dirs, poll_target_time, exclude_patterns, include_patterns) + + +def _list_ppid_and_pid(): + _TH32CS_SNAPPROCESS = 0x00000002 + + class PROCESSENTRY32(ctypes.Structure): + _fields_ = [ + ("dwSize", ctypes.c_uint32), + ("cntUsage", ctypes.c_uint32), + ("th32ProcessID", ctypes.c_uint32), + ("th32DefaultHeapID", ctypes.c_size_t), + ("th32ModuleID", ctypes.c_uint32), + ("cntThreads", ctypes.c_uint32), + ("th32ParentProcessID", ctypes.c_uint32), + ("pcPriClassBase", ctypes.c_long), + ("dwFlags", ctypes.c_uint32), + ("szExeFile", ctypes.c_char * 260), + ] + + kernel32 = ctypes.windll.kernel32 + snapshot = kernel32.CreateToolhelp32Snapshot(_TH32CS_SNAPPROCESS, 0) + ppid_and_pids = [] + try: + process_entry = PROCESSENTRY32() + process_entry.dwSize = ctypes.sizeof(PROCESSENTRY32) + if not kernel32.Process32First(ctypes.c_void_p(snapshot), ctypes.byref(process_entry)): + pydev_log.critical("Process32First failed (getting process from CreateToolhelp32Snapshot).") + else: + while True: + ppid_and_pids.append((process_entry.th32ParentProcessID, process_entry.th32ProcessID)) + if not kernel32.Process32Next(ctypes.c_void_p(snapshot), ctypes.byref(process_entry)): + break + finally: + kernel32.CloseHandle(snapshot) + + return ppid_and_pids diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_breakpoints.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_breakpoints.py new file mode 100644 index 0000000..7d4d022 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_breakpoints.py @@ -0,0 +1,181 @@ +from _pydev_bundle import pydev_log +from _pydevd_bundle import pydevd_import_class +from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame +from _pydev_bundle._pydev_saved_modules import threading + + +class ExceptionBreakpoint(object): + def __init__( + self, + qname, + condition, + expression, + notify_on_handled_exceptions, + notify_on_unhandled_exceptions, + notify_on_user_unhandled_exceptions, + notify_on_first_raise_only, + ignore_libraries, + ): + exctype = get_exception_class(qname) + self.qname = qname + if exctype is not None: + self.name = exctype.__name__ + else: + self.name = None + + self.condition = condition + self.expression = expression + self.notify_on_unhandled_exceptions = notify_on_unhandled_exceptions + self.notify_on_handled_exceptions = notify_on_handled_exceptions + self.notify_on_first_raise_only = notify_on_first_raise_only + self.notify_on_user_unhandled_exceptions = notify_on_user_unhandled_exceptions + self.ignore_libraries = ignore_libraries + + self.type = exctype + + def __str__(self): + return self.qname + + @property + def has_condition(self): + return self.condition is not None + + def handle_hit_condition(self, frame): + return False + + +class LineBreakpoint(object): + def __init__(self, breakpoint_id, line, condition, func_name, expression, suspend_policy="NONE", hit_condition=None, is_logpoint=False): + self.breakpoint_id = breakpoint_id + self.line = line + self.condition = condition + self.func_name = func_name + self.expression = expression + self.suspend_policy = suspend_policy + self.hit_condition = hit_condition + self._hit_count = 0 + self._hit_condition_lock = threading.Lock() + self.is_logpoint = is_logpoint + + @property + def has_condition(self): + return bool(self.condition) or bool(self.hit_condition) + + def handle_hit_condition(self, frame): + if not self.hit_condition: + return False + ret = False + with self._hit_condition_lock: + self._hit_count += 1 + expr = self.hit_condition.replace("@HIT@", str(self._hit_count)) + try: + ret = bool(eval(expr, frame.f_globals, frame.f_locals)) + except Exception: + ret = False + return ret + + +class FunctionBreakpoint(object): + def __init__(self, func_name, condition, expression, suspend_policy="NONE", hit_condition=None, is_logpoint=False): + self.condition = condition + self.func_name = func_name + self.expression = expression + self.suspend_policy = suspend_policy + self.hit_condition = hit_condition + self._hit_count = 0 + self._hit_condition_lock = threading.Lock() + self.is_logpoint = is_logpoint + + @property + def has_condition(self): + return bool(self.condition) or bool(self.hit_condition) + + def handle_hit_condition(self, frame): + if not self.hit_condition: + return False + ret = False + with self._hit_condition_lock: + self._hit_count += 1 + expr = self.hit_condition.replace("@HIT@", str(self._hit_count)) + try: + ret = bool(eval(expr, frame.f_globals, frame.f_locals)) + except Exception: + ret = False + return ret + + +def get_exception_breakpoint(exctype, exceptions): + if not exctype: + exception_full_qname = None + else: + exception_full_qname = str(exctype.__module__) + "." + exctype.__name__ + + exc = None + if exceptions is not None: + try: + return exceptions[exception_full_qname] + except KeyError: + for exception_breakpoint in exceptions.values(): + if exception_breakpoint.type is not None and issubclass(exctype, exception_breakpoint.type): + if exc is None or issubclass(exception_breakpoint.type, exc.type): + exc = exception_breakpoint + return exc + + +def stop_on_unhandled_exception(py_db, thread, additional_info, arg): + exctype, value, tb = arg + break_on_uncaught_exceptions = py_db.break_on_uncaught_exceptions + if break_on_uncaught_exceptions: + exception_breakpoint = py_db.get_exception_breakpoint(exctype, break_on_uncaught_exceptions) + else: + exception_breakpoint = None + + if not exception_breakpoint: + return + + if tb is None: # sometimes it can be None, e.g. with GTK + return + + if exctype is KeyboardInterrupt: + return + + if exctype is SystemExit and py_db.ignore_system_exit_code(value): + return + + frames = [] + user_frame = None + + while tb is not None: + if not py_db.exclude_exception_by_filter(exception_breakpoint, tb): + user_frame = tb.tb_frame + frames.append(tb.tb_frame) + tb = tb.tb_next + + if user_frame is None: + return + + frames_byid = dict([(id(frame), frame) for frame in frames]) + add_exception_to_frame(user_frame, arg) + if exception_breakpoint.condition is not None: + eval_result = py_db.handle_breakpoint_condition(additional_info, exception_breakpoint, user_frame) + if not eval_result: + return + + if exception_breakpoint.expression is not None: + py_db.handle_breakpoint_expression(exception_breakpoint, additional_info, user_frame) + + try: + additional_info.pydev_message = exception_breakpoint.qname + except: + additional_info.pydev_message = exception_breakpoint.qname.encode("utf-8") + + pydev_log.debug("Handling post-mortem stop on exception breakpoint %s" % (exception_breakpoint.qname,)) + + py_db.do_stop_on_unhandled_exception(thread, user_frame, frames_byid, arg) + + +def get_exception_class(kls): + try: + return eval(kls) + except: + return pydevd_import_class.import_name(kls) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils.py new file mode 100644 index 0000000..8a47044 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils.py @@ -0,0 +1,938 @@ +""" +Bytecode analysing utils. Originally added for using in smart step into. + +Note: not importable from Python 2. +""" + +from _pydev_bundle import pydev_log +from types import CodeType +from _pydevd_frame_eval.vendored.bytecode.instr import _Variable, Label +from _pydevd_frame_eval.vendored import bytecode +from _pydevd_frame_eval.vendored.bytecode import cfg as bytecode_cfg +import dis +import opcode as _opcode + +from _pydevd_bundle.pydevd_constants import KeyifyList, DebugInfoHolder, IS_PY311_OR_GREATER +from bisect import bisect +from collections import deque +import traceback + +# When True, throws errors on unknown bytecodes, when False, ignore those as if they didn't change the stack. +STRICT_MODE = False + +GO_INTO_INNER_CODES = True + +DEBUG = False + +_BINARY_OPS = set([opname for opname in dis.opname if opname.startswith("BINARY_")]) + +_BINARY_OP_MAP = { + "BINARY_POWER": "__pow__", + "BINARY_MULTIPLY": "__mul__", + "BINARY_MATRIX_MULTIPLY": "__matmul__", + "BINARY_FLOOR_DIVIDE": "__floordiv__", + "BINARY_TRUE_DIVIDE": "__div__", + "BINARY_MODULO": "__mod__", + "BINARY_ADD": "__add__", + "BINARY_SUBTRACT": "__sub__", + "BINARY_LSHIFT": "__lshift__", + "BINARY_RSHIFT": "__rshift__", + "BINARY_AND": "__and__", + "BINARY_OR": "__or__", + "BINARY_XOR": "__xor__", + "BINARY_SUBSCR": "__getitem__", + "BINARY_DIVIDE": "__div__", +} + +_COMP_OP_MAP = { + "<": "__lt__", + "<=": "__le__", + "==": "__eq__", + "!=": "__ne__", + ">": "__gt__", + ">=": "__ge__", + "in": "__contains__", + "not in": "__contains__", +} + + +class Target(object): + __slots__ = ["arg", "lineno", "endlineno", "startcol", "endcol", "offset", "children_targets"] + + def __init__( + self, + arg, + lineno, + offset, + children_targets=(), + # These are optional (only Python 3.11 onwards). + endlineno=-1, + startcol=-1, + endcol=-1, + ): + self.arg = arg + self.lineno = lineno + self.endlineno = endlineno + self.startcol = startcol + self.endcol = endcol + + self.offset = offset + self.children_targets = children_targets + + def __repr__(self): + ret = [] + for s in self.__slots__: + ret.append("%s: %s" % (s, getattr(self, s))) + return "Target(%s)" % ", ".join(ret) + + __str__ = __repr__ + + +class _TargetIdHashable(object): + def __init__(self, target): + self.target = target + + def __eq__(self, other): + if not hasattr(other, "target"): + return + return other.target is self.target + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return id(self.target) + + +class _StackInterpreter(object): + """ + Good reference: https://github.com/python/cpython/blob/fcb55c0037baab6f98f91ee38ce84b6f874f034a/Python/ceval.c + """ + + def __init__(self, bytecode): + self.bytecode = bytecode + self._stack = deque() + self.function_calls = [] + self.load_attrs = {} + self.func = set() + self.func_name_id_to_code_object = {} + + def __str__(self): + return "Stack:\nFunction calls:\n%s\nLoad attrs:\n%s\n" % (self.function_calls, list(self.load_attrs.values())) + + def _getname(self, instr): + if instr.opcode in _opcode.hascompare: + cmp_op = dis.cmp_op[instr.arg] + if cmp_op not in ("exception match", "BAD"): + return _COMP_OP_MAP.get(cmp_op, cmp_op) + return instr.arg + + def _getcallname(self, instr): + if instr.name == "BINARY_SUBSCR": + return "__getitem__().__call__" + if instr.name == "CALL_FUNCTION": + # Note: previously a '__call__().__call__' was returned, but this was a bit weird + # and on Python 3.9 this construct could appear for some internal things where + # it wouldn't be expected. + # Note: it'd be what we had in func()(). + return None + if instr.name == "MAKE_FUNCTION": + return "__func__().__call__" + if instr.name == "LOAD_ASSERTION_ERROR": + return "AssertionError" + name = self._getname(instr) + if isinstance(name, CodeType): + name = name.co_qualname # Note: only available for Python 3.11 + if isinstance(name, _Variable): + name = name.name + if isinstance(name, tuple): + # Load attr in Python 3.12 comes with (bool, name) + if len(name) == 2 and isinstance(name[0], bool) and isinstance(name[1], str): + name = name[1] + + if not isinstance(name, str): + return None + if name.endswith(">"): # xxx., xxx., ... + return name.split(".")[-1] + return name + + def _no_stack_change(self, instr): + pass # Can be aliased when the instruction does nothing. + + def on_LOAD_GLOBAL(self, instr): + self._stack.append(instr) + + def on_POP_TOP(self, instr): + try: + self._stack.pop() + except IndexError: + pass # Ok (in the end of blocks) + + def on_LOAD_ATTR(self, instr): + self.on_POP_TOP(instr) # replaces the current top + self._stack.append(instr) + self.load_attrs[_TargetIdHashable(instr)] = Target(self._getname(instr), instr.lineno, instr.offset) + + on_LOOKUP_METHOD = on_LOAD_ATTR # Improvement in PyPy + + def on_LOAD_CONST(self, instr): + self._stack.append(instr) + + on_LOAD_DEREF = on_LOAD_CONST + on_LOAD_NAME = on_LOAD_CONST + on_LOAD_CLOSURE = on_LOAD_CONST + on_LOAD_CLASSDEREF = on_LOAD_CONST + + # Although it actually changes the stack, it's inconsequential for us as a function call can't + # really be found there. + on_IMPORT_NAME = _no_stack_change + on_IMPORT_FROM = _no_stack_change + on_IMPORT_STAR = _no_stack_change + on_SETUP_ANNOTATIONS = _no_stack_change + + def on_STORE_FAST(self, instr): + try: + self._stack.pop() + except IndexError: + pass # Ok, we may have a block just with the store + + # Note: it stores in the locals and doesn't put anything in the stack. + + on_STORE_GLOBAL = on_STORE_FAST + on_STORE_DEREF = on_STORE_FAST + on_STORE_ATTR = on_STORE_FAST + on_STORE_NAME = on_STORE_FAST + + on_DELETE_NAME = on_POP_TOP + on_DELETE_ATTR = on_POP_TOP + on_DELETE_GLOBAL = on_POP_TOP + on_DELETE_FAST = on_POP_TOP + on_DELETE_DEREF = on_POP_TOP + + on_DICT_UPDATE = on_POP_TOP + on_SET_UPDATE = on_POP_TOP + + on_GEN_START = on_POP_TOP + + def on_NOP(self, instr): + pass + + def _handle_call_from_instr(self, func_name_instr, func_call_instr): + self.load_attrs.pop(_TargetIdHashable(func_name_instr), None) + call_name = self._getcallname(func_name_instr) + target = None + if not call_name: + pass # Ignore if we can't identify a name + elif call_name in ("", "", "", ""): + code_obj = self.func_name_id_to_code_object[_TargetIdHashable(func_name_instr)] + if code_obj is not None and GO_INTO_INNER_CODES: + children_targets = _get_smart_step_into_targets(code_obj) + if children_targets: + # i.e.: we have targets inside of a or . + # Note that to actually match this in the debugger we need to do matches on 2 frames, + # the one with the and then the actual target inside the . + target = Target(call_name, func_name_instr.lineno, func_call_instr.offset, children_targets) + self.function_calls.append(target) + + else: + # Ok, regular call + target = Target(call_name, func_name_instr.lineno, func_call_instr.offset) + self.function_calls.append(target) + + if DEBUG and target is not None: + print("Created target", target) + self._stack.append(func_call_instr) # Keep the func call as the result + + def on_COMPARE_OP(self, instr): + try: + _right = self._stack.pop() + except IndexError: + return + try: + _left = self._stack.pop() + except IndexError: + return + + cmp_op = dis.cmp_op[instr.arg] + if cmp_op not in ("exception match", "BAD"): + self.function_calls.append(Target(self._getname(instr), instr.lineno, instr.offset)) + + self._stack.append(instr) + + def on_IS_OP(self, instr): + try: + self._stack.pop() + except IndexError: + return + try: + self._stack.pop() + except IndexError: + return + + def on_BINARY_SUBSCR(self, instr): + try: + _sub = self._stack.pop() + except IndexError: + return + try: + _container = self._stack.pop() + except IndexError: + return + self.function_calls.append(Target(_BINARY_OP_MAP[instr.name], instr.lineno, instr.offset)) + self._stack.append(instr) + + on_BINARY_MATRIX_MULTIPLY = on_BINARY_SUBSCR + on_BINARY_POWER = on_BINARY_SUBSCR + on_BINARY_MULTIPLY = on_BINARY_SUBSCR + on_BINARY_FLOOR_DIVIDE = on_BINARY_SUBSCR + on_BINARY_TRUE_DIVIDE = on_BINARY_SUBSCR + on_BINARY_MODULO = on_BINARY_SUBSCR + on_BINARY_ADD = on_BINARY_SUBSCR + on_BINARY_SUBTRACT = on_BINARY_SUBSCR + on_BINARY_LSHIFT = on_BINARY_SUBSCR + on_BINARY_RSHIFT = on_BINARY_SUBSCR + on_BINARY_AND = on_BINARY_SUBSCR + on_BINARY_OR = on_BINARY_SUBSCR + on_BINARY_XOR = on_BINARY_SUBSCR + + def on_LOAD_METHOD(self, instr): + self.on_POP_TOP(instr) # Remove the previous as we're loading something from it. + self._stack.append(instr) + + def on_MAKE_FUNCTION(self, instr): + if not IS_PY311_OR_GREATER: + # The qualifier name is no longer put in the stack. + qualname = self._stack.pop() + code_obj_instr = self._stack.pop() + else: + # In 3.11 the code object has a co_qualname which we can use. + qualname = code_obj_instr = self._stack.pop() + + arg = instr.arg + if arg & 0x08: + _func_closure = self._stack.pop() + if arg & 0x04: + _func_annotations = self._stack.pop() + if arg & 0x02: + _func_kwdefaults = self._stack.pop() + if arg & 0x01: + _func_defaults = self._stack.pop() + + call_name = self._getcallname(qualname) + if call_name in ("", "", "", ""): + if isinstance(code_obj_instr.arg, CodeType): + self.func_name_id_to_code_object[_TargetIdHashable(qualname)] = code_obj_instr.arg + self._stack.append(qualname) + + def on_LOAD_FAST(self, instr): + self._stack.append(instr) + + on_LOAD_FAST_AND_CLEAR = on_LOAD_FAST + on_LOAD_FAST_CHECK = on_LOAD_FAST + + def on_LOAD_ASSERTION_ERROR(self, instr): + self._stack.append(instr) + + on_LOAD_BUILD_CLASS = on_LOAD_FAST + + def on_CALL_METHOD(self, instr): + # pop the actual args + for _ in range(instr.arg): + self._stack.pop() + + func_name_instr = self._stack.pop() + self._handle_call_from_instr(func_name_instr, instr) + + def on_CALL(self, instr): + # pop the actual args + for _ in range(instr.arg): + self._stack.pop() + + func_name_instr = self._stack.pop() + if self._getcallname(func_name_instr) is None: + func_name_instr = self._stack.pop() + + if self._stack: + peeked = self._stack[-1] + if peeked.name == "PUSH_NULL": + self._stack.pop() + + self._handle_call_from_instr(func_name_instr, instr) + + def on_CALL_INTRINSIC_1(self, instr): + try: + func_name_instr = self._stack.pop() + except IndexError: + return + + if self._stack: + peeked = self._stack[-1] + if peeked.name == "PUSH_NULL": + self._stack.pop() + + self._handle_call_from_instr(func_name_instr, instr) + + def on_PUSH_NULL(self, instr): + self._stack.append(instr) + + def on_KW_NAMES(self, instr): + return + + def on_RETURN_CONST(self, instr): + return + + def on_CALL_FUNCTION(self, instr): + arg = instr.arg + + argc = arg & 0xFF # positional args + argc += (arg >> 8) * 2 # keyword args + + # pop the actual args + for _ in range(argc): + try: + self._stack.pop() + except IndexError: + return + + try: + func_name_instr = self._stack.pop() + except IndexError: + return + self._handle_call_from_instr(func_name_instr, instr) + + def on_CALL_FUNCTION_KW(self, instr): + # names of kw args + _names_of_kw_args = self._stack.pop() + + # pop the actual args + arg = instr.arg + + argc = arg & 0xFF # positional args + argc += (arg >> 8) * 2 # keyword args + + for _ in range(argc): + self._stack.pop() + + func_name_instr = self._stack.pop() + self._handle_call_from_instr(func_name_instr, instr) + + def on_CALL_FUNCTION_VAR(self, instr): + # var name + _var_arg = self._stack.pop() + + # pop the actual args + arg = instr.arg + + argc = arg & 0xFF # positional args + argc += (arg >> 8) * 2 # keyword args + + for _ in range(argc): + self._stack.pop() + + func_name_instr = self._stack.pop() + self._handle_call_from_instr(func_name_instr, instr) + + def on_CALL_FUNCTION_VAR_KW(self, instr): + # names of kw args + _names_of_kw_args = self._stack.pop() + + arg = instr.arg + + argc = arg & 0xFF # positional args + argc += (arg >> 8) * 2 # keyword args + + # also pop **kwargs + self._stack.pop() + + # pop the actual args + for _ in range(argc): + self._stack.pop() + + func_name_instr = self._stack.pop() + self._handle_call_from_instr(func_name_instr, instr) + + def on_CALL_FUNCTION_EX(self, instr): + if instr.arg & 0x01: + _kwargs = self._stack.pop() + _callargs = self._stack.pop() + func_name_instr = self._stack.pop() + self._handle_call_from_instr(func_name_instr, instr) + + on_GET_AITER = _no_stack_change + on_GET_ANEXT = _no_stack_change + on_END_FOR = _no_stack_change + on_END_ASYNC_FOR = _no_stack_change + on_BEFORE_ASYNC_WITH = _no_stack_change + on_SETUP_ASYNC_WITH = _no_stack_change + on_YIELD_FROM = _no_stack_change + on_SETUP_LOOP = _no_stack_change + on_FOR_ITER = _no_stack_change + on_BREAK_LOOP = _no_stack_change + on_JUMP_ABSOLUTE = _no_stack_change + on_RERAISE = _no_stack_change + on_LIST_TO_TUPLE = _no_stack_change + on_CALL_FINALLY = _no_stack_change + on_POP_FINALLY = _no_stack_change + + def on_JUMP_IF_FALSE_OR_POP(self, instr): + try: + self._stack.pop() + except IndexError: + return + + on_JUMP_IF_TRUE_OR_POP = on_JUMP_IF_FALSE_OR_POP + + def on_JUMP_IF_NOT_EXC_MATCH(self, instr): + try: + self._stack.pop() + except IndexError: + return + try: + self._stack.pop() + except IndexError: + return + + def on_SWAP(self, instr): + i = instr.arg + try: + self._stack[-i], self._stack[-1] = self._stack[-1], self._stack[-i] + except: + pass + + def on_ROT_TWO(self, instr): + try: + p0 = self._stack.pop() + except IndexError: + return + + try: + p1 = self._stack.pop() + except: + self._stack.append(p0) + return + + self._stack.append(p0) + self._stack.append(p1) + + def on_ROT_THREE(self, instr): + try: + p0 = self._stack.pop() + except IndexError: + return + + try: + p1 = self._stack.pop() + except: + self._stack.append(p0) + return + + try: + p2 = self._stack.pop() + except: + self._stack.append(p0) + self._stack.append(p1) + return + + self._stack.append(p0) + self._stack.append(p1) + self._stack.append(p2) + + def on_ROT_FOUR(self, instr): + try: + p0 = self._stack.pop() + except IndexError: + return + + try: + p1 = self._stack.pop() + except: + self._stack.append(p0) + return + + try: + p2 = self._stack.pop() + except: + self._stack.append(p0) + self._stack.append(p1) + return + + try: + p3 = self._stack.pop() + except: + self._stack.append(p0) + self._stack.append(p1) + self._stack.append(p2) + return + + self._stack.append(p0) + self._stack.append(p1) + self._stack.append(p2) + self._stack.append(p3) + + def on_BUILD_LIST_FROM_ARG(self, instr): + self._stack.append(instr) + + def on_BUILD_MAP(self, instr): + for _i in range(instr.arg): + self._stack.pop() + self._stack.pop() + self._stack.append(instr) + + def on_BUILD_CONST_KEY_MAP(self, instr): + self.on_POP_TOP(instr) # keys + for _i in range(instr.arg): + self.on_POP_TOP(instr) # value + self._stack.append(instr) + + on_YIELD_VALUE = on_POP_TOP + on_RETURN_VALUE = on_POP_TOP + on_POP_JUMP_IF_FALSE = on_POP_TOP + on_POP_JUMP_IF_TRUE = on_POP_TOP + on_DICT_MERGE = on_POP_TOP + on_LIST_APPEND = on_POP_TOP + on_SET_ADD = on_POP_TOP + on_LIST_EXTEND = on_POP_TOP + on_UNPACK_EX = on_POP_TOP + + # ok: doesn't change the stack (converts top to getiter(top)) + on_GET_ITER = _no_stack_change + on_GET_AWAITABLE = _no_stack_change + on_GET_YIELD_FROM_ITER = _no_stack_change + + def on_RETURN_GENERATOR(self, instr): + self._stack.append(instr) + + on_RETURN_GENERATOR = _no_stack_change + on_RESUME = _no_stack_change + + def on_MAP_ADD(self, instr): + self.on_POP_TOP(instr) + self.on_POP_TOP(instr) + + def on_UNPACK_SEQUENCE(self, instr): + self._stack.pop() + for _i in range(instr.arg): + self._stack.append(instr) + + def on_BUILD_LIST(self, instr): + for _i in range(instr.arg): + self.on_POP_TOP(instr) + self._stack.append(instr) + + on_BUILD_TUPLE = on_BUILD_LIST + on_BUILD_STRING = on_BUILD_LIST + on_BUILD_TUPLE_UNPACK_WITH_CALL = on_BUILD_LIST + on_BUILD_TUPLE_UNPACK = on_BUILD_LIST + on_BUILD_LIST_UNPACK = on_BUILD_LIST + on_BUILD_MAP_UNPACK_WITH_CALL = on_BUILD_LIST + on_BUILD_MAP_UNPACK = on_BUILD_LIST + on_BUILD_SET = on_BUILD_LIST + on_BUILD_SET_UNPACK = on_BUILD_LIST + + on_SETUP_FINALLY = _no_stack_change + on_POP_FINALLY = _no_stack_change + on_BEGIN_FINALLY = _no_stack_change + on_END_FINALLY = _no_stack_change + + def on_RAISE_VARARGS(self, instr): + for _i in range(instr.arg): + self.on_POP_TOP(instr) + + on_POP_BLOCK = _no_stack_change + on_JUMP_FORWARD = _no_stack_change + on_JUMP_BACKWARD = _no_stack_change + on_JUMP_BACKWARD_NO_INTERRUPT = _no_stack_change + on_POP_EXCEPT = _no_stack_change + on_SETUP_EXCEPT = _no_stack_change + on_WITH_EXCEPT_START = _no_stack_change + + on_END_FINALLY = _no_stack_change + on_BEGIN_FINALLY = _no_stack_change + on_SETUP_WITH = _no_stack_change + on_WITH_CLEANUP_START = _no_stack_change + on_WITH_CLEANUP_FINISH = _no_stack_change + on_FORMAT_VALUE = _no_stack_change + on_EXTENDED_ARG = _no_stack_change + + def on_INPLACE_ADD(self, instr): + # This would actually pop 2 and leave the value in the stack. + # In a += 1 it pop `a` and `1` and leave the resulting value + # for a load. In our case, let's just pop the `1` and leave the `a` + # instead of leaving the INPLACE_ADD bytecode. + try: + self._stack.pop() + except IndexError: + pass + + on_INPLACE_POWER = on_INPLACE_ADD + on_INPLACE_MULTIPLY = on_INPLACE_ADD + on_INPLACE_MATRIX_MULTIPLY = on_INPLACE_ADD + on_INPLACE_TRUE_DIVIDE = on_INPLACE_ADD + on_INPLACE_FLOOR_DIVIDE = on_INPLACE_ADD + on_INPLACE_MODULO = on_INPLACE_ADD + on_INPLACE_SUBTRACT = on_INPLACE_ADD + on_INPLACE_RSHIFT = on_INPLACE_ADD + on_INPLACE_LSHIFT = on_INPLACE_ADD + on_INPLACE_AND = on_INPLACE_ADD + on_INPLACE_OR = on_INPLACE_ADD + on_INPLACE_XOR = on_INPLACE_ADD + + def on_DUP_TOP(self, instr): + try: + i = self._stack[-1] + except IndexError: + # ok (in the start of block) + self._stack.append(instr) + else: + self._stack.append(i) + + def on_DUP_TOP_TWO(self, instr): + if len(self._stack) == 0: + self._stack.append(instr) + return + + if len(self._stack) == 1: + i = self._stack[-1] + self._stack.append(i) + self._stack.append(instr) + return + + i = self._stack[-1] + j = self._stack[-2] + self._stack.append(j) + self._stack.append(i) + + def on_BUILD_SLICE(self, instr): + for _ in range(instr.arg): + try: + self._stack.pop() + except IndexError: + pass + self._stack.append(instr) + + def on_STORE_SUBSCR(self, instr): + try: + self._stack.pop() + self._stack.pop() + self._stack.pop() + except IndexError: + pass + + def on_DELETE_SUBSCR(self, instr): + try: + self._stack.pop() + self._stack.pop() + except IndexError: + pass + + # Note: on Python 3 this is only found on interactive mode to print the results of + # some evaluation. + on_PRINT_EXPR = on_POP_TOP + + on_LABEL = _no_stack_change + on_UNARY_POSITIVE = _no_stack_change + on_UNARY_NEGATIVE = _no_stack_change + on_UNARY_NOT = _no_stack_change + on_UNARY_INVERT = _no_stack_change + + on_CACHE = _no_stack_change + on_PRECALL = _no_stack_change + + +def _get_smart_step_into_targets(code): + """ + :return list(Target) + """ + b = bytecode.Bytecode.from_code(code) + cfg = bytecode_cfg.ControlFlowGraph.from_bytecode(b) + + ret = [] + + for block in cfg: + if DEBUG: + print("\nStart block----") + stack = _StackInterpreter(block) + for instr in block: + if isinstance(instr, (Label,)): + # No name for these + continue + try: + func_name = "on_%s" % (instr.name,) + func = getattr(stack, func_name, None) + + if func is None: + if STRICT_MODE: + raise AssertionError("%s not found." % (func_name,)) + else: + if DEBUG: + print("Skipping: %s." % (func_name,)) + + continue + func(instr) + + if DEBUG: + if instr.name != "CACHE": # Filter the ones we don't want to see. + print("\nHandled: ", instr, ">>", stack._getname(instr), "<<") + print("New stack:") + for entry in stack._stack: + print(" arg:", stack._getname(entry), "(", entry, ")") + except: + if STRICT_MODE: + raise # Error in strict mode. + else: + # In non-strict mode, log it (if in verbose mode) and keep on going. + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 2: + pydev_log.exception("Exception computing step into targets (handled).") + + ret.extend(stack.function_calls) + # No longer considering attr loads as calls (while in theory sometimes it's possible + # that something as `some.attr` can turn out to be a property which could be stepped + # in, it's not that common in practice and can be surprising for users, so, disabling + # step into from stepping into properties). + # ret.extend(stack.load_attrs.values()) + + if DEBUG: + print("\nEnd block----") + return ret + + +# Note that the offset is unique within the frame (so, we can use it as the target id). +# Also, as the offset is the instruction offset within the frame, it's possible to +# to inspect the parent frame for frame.f_lasti to know where we actually are (as the +# caller name may not always match the new frame name). +class Variant(object): + __slots__ = ["name", "is_visited", "line", "offset", "call_order", "children_variants", "parent", "endlineno", "startcol", "endcol"] + + def __init__(self, name, is_visited, line, offset, call_order, children_variants=None, endlineno=-1, startcol=-1, endcol=-1): + self.name = name + self.is_visited = is_visited + self.line = line + self.endlineno = endlineno + self.startcol = startcol + self.endcol = endcol + self.offset = offset + self.call_order = call_order + self.children_variants = children_variants + self.parent = None + if children_variants: + for variant in children_variants: + variant.parent = self + + def __repr__(self): + ret = [] + for s in self.__slots__: + if s == "parent": + try: + parent = self.parent + except AttributeError: + ret.append("%s: " % (s,)) + else: + if parent is None: + ret.append("parent: None") + else: + ret.append("parent: %s (%s)" % (parent.name, parent.offset)) + continue + + if s == "children_variants": + ret.append("children_variants: %s" % (len(self.children_variants) if self.children_variants else 0)) + continue + + try: + ret.append("%s= %s" % (s, getattr(self, s))) + except AttributeError: + ret.append("%s: " % (s,)) + return "Variant(%s)" % ", ".join(ret) + + __str__ = __repr__ + + +def _convert_target_to_variant(target, start_line, end_line, call_order_cache: dict, lasti: int, base: int): + name = target.arg + if not isinstance(name, str): + return + if target.lineno > end_line: + return + if target.lineno < start_line: + return + + call_order = call_order_cache.get(name, 0) + 1 + call_order_cache[name] = call_order + is_visited = target.offset <= lasti + + children_targets = target.children_targets + children_variants = None + if children_targets: + children_variants = [ + _convert_target_to_variant(child, start_line, end_line, call_order_cache, lasti, base) for child in target.children_targets + ] + + return Variant( + name, + is_visited, + target.lineno - base, + target.offset, + call_order, + children_variants, + # Only really matter in Python 3.11 + target.endlineno - base if target.endlineno >= 0 else -1, + target.startcol, + target.endcol, + ) + + +def calculate_smart_step_into_variants(frame, start_line, end_line, base=0): + """ + Calculate smart step into variants for the given line range. + :param frame: + :type frame: :py:class:`types.FrameType` + :param start_line: + :param end_line: + :return: A list of call names from the first to the last. + :note: it's guaranteed that the offsets appear in order. + :raise: :py:class:`RuntimeError` if failed to parse the bytecode or if dis cannot be used. + """ + if IS_PY311_OR_GREATER: + from . import pydevd_bytecode_utils_py311 + + return pydevd_bytecode_utils_py311.calculate_smart_step_into_variants(frame, start_line, end_line, base) + + variants = [] + code = frame.f_code + lasti = frame.f_lasti + + call_order_cache = {} + if DEBUG: + print("dis.dis:") + if IS_PY311_OR_GREATER: + dis.dis(code, show_caches=False) + else: + dis.dis(code) + + for target in _get_smart_step_into_targets(code): + variant = _convert_target_to_variant(target, start_line, end_line, call_order_cache, lasti, base) + if variant is None: + continue + variants.append(variant) + + return variants + + +def get_smart_step_into_variant_from_frame_offset(frame_f_lasti, variants): + """ + Given the frame.f_lasti, return the related `Variant`. + + :note: if the offset is found before any variant available or no variants are + available, None is returned. + + :rtype: Variant|NoneType + """ + if not variants: + return None + + i = bisect(KeyifyList(variants, lambda entry: entry.offset), frame_f_lasti) + + if i == 0: + return None + + else: + return variants[i - 1] diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils_py311.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils_py311.py new file mode 100644 index 0000000..7ebaa7f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils_py311.py @@ -0,0 +1,105 @@ +from _pydevd_bundle.pydevd_constants import IS_PY311_OR_GREATER +import dis +from types import CodeType +from collections import namedtuple + +DEBUG = False + +_Pos = namedtuple("_Pos", "lineno endlineno startcol endcol") + + +def _is_inside(item_pos: _Pos, container_pos: _Pos): + if item_pos.lineno < container_pos.lineno or item_pos.endlineno > container_pos.endlineno: + return False + + if item_pos.lineno == container_pos.lineno: + if item_pos.startcol < container_pos.startcol: + return False + + if item_pos.endlineno == container_pos.endlineno: + if item_pos.endcol > container_pos.endcol: + return False + + # Not outside, must be inside. + return True + + +def _get_smart_step_into_targets(code): + import linecache + from .pydevd_bytecode_utils import Target + + filename = code.co_filename + + targets_root = [] + children = [] + for instr in dis.Bytecode(code): + if instr.opname == "LOAD_CONST": + if isinstance(instr.argval, CodeType): + children.append(_get_smart_step_into_targets(instr.argval)) + + elif instr.opname in ("CALL", "CALL_INTRINSIC_1"): + positions = instr.positions + if positions.lineno is None: + continue + if positions.end_lineno is None: + continue + lines = [] + for lineno in range(positions.lineno, positions.end_lineno + 1): + lines.append(linecache.getline(filename, lineno)) + + startcol = positions.col_offset + endcol = positions.end_col_offset + + if positions.lineno == positions.end_lineno: + lines[0] = lines[0][startcol:endcol] + else: + lines[0] = lines[0][startcol:] + lines[-1] = lines[-1][:endcol] + + pos = _Pos(positions.lineno, positions.end_lineno, startcol, endcol) + targets_root.append(Target("".join(lines), positions.lineno, instr.offset, [], positions.end_lineno, startcol, endcol)) + + for targets in children: + for child_target in targets: + pos = _Pos(child_target.lineno, child_target.endlineno, child_target.startcol, child_target.endcol) + + for outer_target in targets_root: + outer_pos = _Pos(outer_target.lineno, outer_target.endlineno, outer_target.startcol, outer_target.endcol) + if _is_inside(pos, outer_pos): + outer_target.children_targets.append(child_target) + break + return targets_root + + +def calculate_smart_step_into_variants(frame, start_line, end_line, base=0): + """ + Calculate smart step into variants for the given line range. + :param frame: + :type frame: :py:class:`types.FrameType` + :param start_line: + :param end_line: + :return: A list of call names from the first to the last. + :note: it's guaranteed that the offsets appear in order. + :raise: :py:class:`RuntimeError` if failed to parse the bytecode or if dis cannot be used. + """ + from .pydevd_bytecode_utils import _convert_target_to_variant + + variants = [] + code = frame.f_code + lasti = frame.f_lasti + + call_order_cache = {} + if DEBUG: + print("dis.dis:") + if IS_PY311_OR_GREATER: + dis.dis(code, show_caches=False) + else: + dis.dis(code) + + for target in _get_smart_step_into_targets(code): + variant = _convert_target_to_variant(target, start_line, end_line, call_order_cache, lasti, base) + if variant is None: + continue + variants.append(variant) + + return variants diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_code_to_source.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_code_to_source.py new file mode 100644 index 0000000..9147fa0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_code_to_source.py @@ -0,0 +1,605 @@ +""" +Decompiler that can be used with the debugger (where statements correctly represent the +line numbers). + +Note: this is a work in progress / proof of concept / not ready to be used. +""" + +import dis + +from _pydevd_bundle.pydevd_collect_bytecode_info import iter_instructions +from _pydev_bundle import pydev_log +import sys +import inspect +from io import StringIO + + +class _Stack(object): + def __init__(self): + self._contents = [] + + def push(self, obj): + # print('push', obj) + self._contents.append(obj) + + def pop(self): + return self._contents.pop(-1) + + +INDENT_MARKER = object() +DEDENT_MARKER = object() +_SENTINEL = object() + +DEBUG = False + + +class _Token(object): + def __init__(self, i_line, instruction=None, tok=_SENTINEL, priority=0, after=None, end_of_line=False): + """ + :param i_line: + :param instruction: + :param tok: + :param priority: + :param after: + :param end_of_line: + Marker to signal only after all the other tokens have been written. + """ + self.i_line = i_line + if tok is not _SENTINEL: + self.tok = tok + else: + if instruction is not None: + if inspect.iscode(instruction.argval): + self.tok = "" + else: + self.tok = str(instruction.argval) + else: + raise AssertionError("Either the tok or the instruction is needed.") + self.instruction = instruction + self.priority = priority + self.end_of_line = end_of_line + self._after_tokens = set() + self._after_handler_tokens = set() + if after: + self.mark_after(after) + + def mark_after(self, v): + if isinstance(v, _Token): + self._after_tokens.add(v) + elif isinstance(v, _BaseHandler): + self._after_handler_tokens.add(v) + + else: + raise AssertionError("Unhandled: %s" % (v,)) + + def get_after_tokens(self): + ret = self._after_tokens.copy() + for handler in self._after_handler_tokens: + ret.update(handler.tokens) + return ret + + def __repr__(self): + return "Token(%s, after: %s)" % (self.tok, self.get_after_tokens()) + + __str__ = __repr__ + + +class _Writer(object): + def __init__(self): + self.line_to_contents = {} + self.all_tokens = set() + + def get_line(self, line): + lst = self.line_to_contents.get(line) + if lst is None: + lst = self.line_to_contents[line] = [] + return lst + + def indent(self, line): + self.get_line(line).append(INDENT_MARKER) + + def dedent(self, line): + self.get_line(line).append(DEDENT_MARKER) + + def write(self, line, token): + if token in self.all_tokens: + return + self.all_tokens.add(token) + assert isinstance(token, _Token) + lst = self.get_line(line) + lst.append(token) + + +class _BaseHandler(object): + def __init__(self, i_line, instruction, stack, writer, disassembler): + self.i_line = i_line + self.instruction = instruction + self.stack = stack + self.writer = writer + self.disassembler = disassembler + self.tokens = [] + self._handle() + + def _write_tokens(self): + for token in self.tokens: + self.writer.write(token.i_line, token) + + def _handle(self): + raise NotImplementedError(self) + + def __repr__(self, *args, **kwargs): + try: + return "%s line:%s" % (self.instruction, self.i_line) + except: + return object.__repr__(self) + + __str__ = __repr__ + + +_op_name_to_handler = {} + + +def _register(cls): + _op_name_to_handler[cls.opname] = cls + return cls + + +class _BasePushHandler(_BaseHandler): + def _handle(self): + self.stack.push(self) + + +class _BaseLoadHandler(_BasePushHandler): + def _handle(self): + _BasePushHandler._handle(self) + self.tokens = [_Token(self.i_line, self.instruction)] + + +@_register +class _LoadBuildClass(_BasePushHandler): + opname = "LOAD_BUILD_CLASS" + + +@_register +class _LoadConst(_BaseLoadHandler): + opname = "LOAD_CONST" + + +@_register +class _LoadName(_BaseLoadHandler): + opname = "LOAD_NAME" + + +@_register +class _LoadGlobal(_BaseLoadHandler): + opname = "LOAD_GLOBAL" + + +@_register +class _LoadFast(_BaseLoadHandler): + opname = "LOAD_FAST" + + +@_register +class _GetIter(_BaseHandler): + """ + Implements TOS = iter(TOS). + """ + + opname = "GET_ITER" + iter_target = None + + def _handle(self): + self.iter_target = self.stack.pop() + self.tokens.extend(self.iter_target.tokens) + self.stack.push(self) + + +@_register +class _ForIter(_BaseHandler): + """ + TOS is an iterator. Call its __next__() method. If this yields a new value, push it on the stack + (leaving the iterator below it). If the iterator indicates it is exhausted TOS is popped, and + the byte code counter is incremented by delta. + """ + + opname = "FOR_ITER" + + iter_in = None + + def _handle(self): + self.iter_in = self.stack.pop() + self.stack.push(self) + + def store_in_name(self, store_name): + for_token = _Token(self.i_line, None, "for ") + self.tokens.append(for_token) + prev = for_token + + t_name = _Token(store_name.i_line, store_name.instruction, after=prev) + self.tokens.append(t_name) + prev = t_name + + in_token = _Token(store_name.i_line, None, " in ", after=prev) + self.tokens.append(in_token) + prev = in_token + + max_line = store_name.i_line + if self.iter_in: + for t in self.iter_in.tokens: + t.mark_after(prev) + max_line = max(max_line, t.i_line) + prev = t + self.tokens.extend(self.iter_in.tokens) + + colon_token = _Token(self.i_line, None, ":", after=prev) + self.tokens.append(colon_token) + prev = for_token + + self._write_tokens() + + +@_register +class _StoreName(_BaseHandler): + """ + Implements name = TOS. namei is the index of name in the attribute co_names of the code object. + The compiler tries to use STORE_FAST or STORE_GLOBAL if possible. + """ + + opname = "STORE_NAME" + + def _handle(self): + v = self.stack.pop() + + if isinstance(v, _ForIter): + v.store_in_name(self) + else: + if not isinstance(v, _MakeFunction) or v.is_lambda: + line = self.i_line + for t in v.tokens: + line = min(line, t.i_line) + + t_name = _Token(line, self.instruction) + t_equal = _Token(line, None, "=", after=t_name) + + self.tokens.append(t_name) + self.tokens.append(t_equal) + + for t in v.tokens: + t.mark_after(t_equal) + self.tokens.extend(v.tokens) + + self._write_tokens() + + +@_register +class _ReturnValue(_BaseHandler): + """ + Returns with TOS to the caller of the function. + """ + + opname = "RETURN_VALUE" + + def _handle(self): + v = self.stack.pop() + return_token = _Token(self.i_line, None, "return ", end_of_line=True) + self.tokens.append(return_token) + for token in v.tokens: + token.mark_after(return_token) + self.tokens.extend(v.tokens) + + self._write_tokens() + + +@_register +class _CallFunction(_BaseHandler): + """ + + CALL_FUNCTION(argc) + + Calls a callable object with positional arguments. argc indicates the number of positional + arguments. The top of the stack contains positional arguments, with the right-most argument + on top. Below the arguments is a callable object to call. CALL_FUNCTION pops all arguments + and the callable object off the stack, calls the callable object with those arguments, and + pushes the return value returned by the callable object. + + Changed in version 3.6: This opcode is used only for calls with positional arguments. + + """ + + opname = "CALL_FUNCTION" + + def _handle(self): + args = [] + for _i in range(self.instruction.argval + 1): + arg = self.stack.pop() + args.append(arg) + it = reversed(args) + name = next(it) + max_line = name.i_line + for t in name.tokens: + self.tokens.append(t) + + tok_open_parens = _Token(name.i_line, None, "(", after=name) + self.tokens.append(tok_open_parens) + + prev = tok_open_parens + for i, arg in enumerate(it): + for t in arg.tokens: + t.mark_after(name) + t.mark_after(prev) + max_line = max(max_line, t.i_line) + self.tokens.append(t) + prev = arg + + if i > 0: + comma_token = _Token(prev.i_line, None, ",", after=prev) + self.tokens.append(comma_token) + prev = comma_token + + tok_close_parens = _Token(max_line, None, ")", after=prev) + self.tokens.append(tok_close_parens) + + self._write_tokens() + + self.stack.push(self) + + +@_register +class _MakeFunctionPy3(_BaseHandler): + """ + Pushes a new function object on the stack. From bottom to top, the consumed stack must consist + of values if the argument carries a specified flag value + + 0x01 a tuple of default values for positional-only and positional-or-keyword parameters in positional order + + 0x02 a dictionary of keyword-only parameters' default values + + 0x04 an annotation dictionary + + 0x08 a tuple containing cells for free variables, making a closure + + the code associated with the function (at TOS1) + + the qualified name of the function (at TOS) + """ + + opname = "MAKE_FUNCTION" + is_lambda = False + + def _handle(self): + stack = self.stack + self.qualified_name = stack.pop() + self.code = stack.pop() + + default_node = None + if self.instruction.argval & 0x01: + default_node = stack.pop() + + is_lambda = self.is_lambda = "" in [x.tok for x in self.qualified_name.tokens] + + if not is_lambda: + def_token = _Token(self.i_line, None, "def ") + self.tokens.append(def_token) + + for token in self.qualified_name.tokens: + self.tokens.append(token) + if not is_lambda: + token.mark_after(def_token) + prev = token + + open_parens_token = _Token(self.i_line, None, "(", after=prev) + self.tokens.append(open_parens_token) + prev = open_parens_token + + code = self.code.instruction.argval + + if default_node: + defaults = ([_SENTINEL] * (len(code.co_varnames) - len(default_node.instruction.argval))) + list( + default_node.instruction.argval + ) + else: + defaults = [_SENTINEL] * len(code.co_varnames) + + for i, arg in enumerate(code.co_varnames): + if i > 0: + comma_token = _Token(prev.i_line, None, ", ", after=prev) + self.tokens.append(comma_token) + prev = comma_token + + arg_token = _Token(self.i_line, None, arg, after=prev) + self.tokens.append(arg_token) + + default = defaults[i] + if default is not _SENTINEL: + eq_token = _Token(default_node.i_line, None, "=", after=prev) + self.tokens.append(eq_token) + prev = eq_token + + default_token = _Token(default_node.i_line, None, str(default), after=prev) + self.tokens.append(default_token) + prev = default_token + + tok_close_parens = _Token(prev.i_line, None, "):", after=prev) + self.tokens.append(tok_close_parens) + + self._write_tokens() + + stack.push(self) + self.writer.indent(prev.i_line + 1) + self.writer.dedent(max(self.disassembler.merge_code(code))) + + +_MakeFunction = _MakeFunctionPy3 + + +def _print_after_info(line_contents, stream=None): + if stream is None: + stream = sys.stdout + for token in line_contents: + after_tokens = token.get_after_tokens() + if after_tokens: + s = "%s after: %s\n" % (repr(token.tok), ('"' + '", "'.join(t.tok for t in token.get_after_tokens()) + '"')) + stream.write(s) + else: + stream.write("%s (NO REQUISITES)" % repr(token.tok)) + + +def _compose_line_contents(line_contents, previous_line_tokens): + lst = [] + handled = set() + + add_to_end_of_line = [] + delete_indexes = [] + for i, token in enumerate(line_contents): + if token.end_of_line: + add_to_end_of_line.append(token) + delete_indexes.append(i) + for i in reversed(delete_indexes): + del line_contents[i] + del delete_indexes + + while line_contents: + added = False + delete_indexes = [] + + for i, token in enumerate(line_contents): + after_tokens = token.get_after_tokens() + for after in after_tokens: + if after not in handled and after not in previous_line_tokens: + break + else: + added = True + previous_line_tokens.add(token) + handled.add(token) + lst.append(token.tok) + delete_indexes.append(i) + + for i in reversed(delete_indexes): + del line_contents[i] + + if not added: + if add_to_end_of_line: + line_contents.extend(add_to_end_of_line) + del add_to_end_of_line[:] + continue + + # Something is off, let's just add as is. + for token in line_contents: + if token not in handled: + lst.append(token.tok) + + stream = StringIO() + _print_after_info(line_contents, stream) + pydev_log.critical("Error. After markers are not correct:\n%s", stream.getvalue()) + break + return "".join(lst) + + +class _PyCodeToSource(object): + def __init__(self, co, memo=None): + if memo is None: + memo = {} + self.memo = memo + self.co = co + self.instructions = list(iter_instructions(co)) + self.stack = _Stack() + self.writer = _Writer() + + def _process_next(self, i_line): + instruction = self.instructions.pop(0) + handler_class = _op_name_to_handler.get(instruction.opname) + if handler_class is not None: + s = handler_class(i_line, instruction, self.stack, self.writer, self) + if DEBUG: + print(s) + + else: + if DEBUG: + print("UNHANDLED", instruction) + + def build_line_to_contents(self): + co = self.co + + op_offset_to_line = dict(dis.findlinestarts(co)) + curr_line_index = 0 + + instructions = self.instructions + while instructions: + instruction = instructions[0] + new_line_index = op_offset_to_line.get(instruction.offset) + if new_line_index is not None: + curr_line_index = new_line_index + + self._process_next(curr_line_index) + return self.writer.line_to_contents + + def merge_code(self, code): + if DEBUG: + print("merge code ----") + # for d in dir(code): + # if not d.startswith('_'): + # print(d, getattr(code, d)) + line_to_contents = _PyCodeToSource(code, self.memo).build_line_to_contents() + lines = [] + for line, contents in sorted(line_to_contents.items()): + lines.append(line) + self.writer.get_line(line).extend(contents) + if DEBUG: + print("end merge code ----") + return lines + + def disassemble(self): + show_lines = False + line_to_contents = self.build_line_to_contents() + stream = StringIO() + last_line = 0 + indent = "" + previous_line_tokens = set() + for i_line, contents in sorted(line_to_contents.items()): + while last_line < i_line - 1: + if show_lines: + stream.write("%s.\n" % (last_line + 1,)) + else: + stream.write("\n") + last_line += 1 + + line_contents = [] + dedents_found = 0 + for part in contents: + if part is INDENT_MARKER: + if DEBUG: + print("found indent", i_line) + indent += " " + continue + if part is DEDENT_MARKER: + if DEBUG: + print("found dedent", i_line) + dedents_found += 1 + continue + line_contents.append(part) + + s = indent + _compose_line_contents(line_contents, previous_line_tokens) + if show_lines: + stream.write("%s. %s\n" % (i_line, s)) + else: + stream.write("%s\n" % s) + + if dedents_found: + indent = indent[: -(4 * dedents_found)] + last_line = i_line + + return stream.getvalue() + + +def code_obj_to_source(co): + """ + Converts a code object to source code to provide a suitable representation for the compiler when + the actual source code is not found. + + This is a work in progress / proof of concept / not ready to be used. + """ + ret = _PyCodeToSource(co).disassemble() + if DEBUG: + print(ret) + return ret diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_collect_bytecode_info.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_collect_bytecode_info.py new file mode 100644 index 0000000..f6ed19c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_collect_bytecode_info.py @@ -0,0 +1,873 @@ +import dis +import inspect +import sys +from collections import namedtuple + +from _pydev_bundle import pydev_log +from opcode import EXTENDED_ARG, HAVE_ARGUMENT, cmp_op, hascompare, hasconst, hasfree, hasjrel, haslocal, hasname, opname + +from io import StringIO + + +class TryExceptInfo(object): + def __init__(self, try_line, ignore=False): + """ + :param try_line: + :param ignore: + Usually we should ignore any block that's not a try..except + (this can happen for finally blocks, with statements, etc, for + which we create temporary entries). + """ + self.try_line = try_line + self.ignore = ignore + self.except_line = -1 + self.except_end_line = -1 + self.raise_lines_in_except = [] + + # Note: these may not be available if generated from source instead of bytecode. + self.except_bytecode_offset = -1 + self.except_end_bytecode_offset = -1 + + def is_line_in_try_block(self, line): + return self.try_line <= line < self.except_line + + def is_line_in_except_block(self, line): + return self.except_line <= line <= self.except_end_line + + def __str__(self): + lst = [ + "{try:", + str(self.try_line), + " except ", + str(self.except_line), + " end block ", + str(self.except_end_line), + ] + if self.raise_lines_in_except: + lst.append(" raises: %s" % (", ".join(str(x) for x in self.raise_lines_in_except),)) + + lst.append("}") + return "".join(lst) + + __repr__ = __str__ + + +class ReturnInfo(object): + def __init__(self, return_line): + self.return_line = return_line + + def __str__(self): + return "{return: %s}" % (self.return_line,) + + __repr__ = __str__ + + +def _get_line(op_offset_to_line, op_offset, firstlineno, search=False): + op_offset_original = op_offset + while op_offset >= 0: + ret = op_offset_to_line.get(op_offset) + if ret is not None: + return ret - firstlineno + if not search: + return ret + else: + op_offset -= 1 + raise AssertionError("Unable to find line for offset: %s.Info: %s" % (op_offset_original, op_offset_to_line)) + + +def debug(s): + pass + + +_Instruction = namedtuple("_Instruction", "opname, opcode, starts_line, argval, is_jump_target, offset, argrepr") + + +def iter_instructions(co): + iter_in = dis.Bytecode(co) + iter_in = list(iter_in) + + bytecode_to_instruction = {} + for instruction in iter_in: + bytecode_to_instruction[instruction.offset] = instruction + + if iter_in: + for instruction in iter_in: + yield instruction + + +def collect_return_info(co, use_func_first_line=False): + if not hasattr(co, "co_lines") and not hasattr(co, "co_lnotab"): + return [] + + if use_func_first_line: + firstlineno = co.co_firstlineno + else: + firstlineno = 0 + + lst = [] + op_offset_to_line = dict(dis.findlinestarts(co)) + for instruction in iter_instructions(co): + curr_op_name = instruction.opname + if curr_op_name in ("RETURN_VALUE", "RETURN_CONST"): + lst.append(ReturnInfo(_get_line(op_offset_to_line, instruction.offset, firstlineno, search=True))) + + return lst + + +if sys.version_info[:2] <= (3, 9): + + class _TargetInfo(object): + def __init__(self, except_end_instruction, jump_if_not_exc_instruction=None): + self.except_end_instruction = except_end_instruction + self.jump_if_not_exc_instruction = jump_if_not_exc_instruction + + def __str__(self): + msg = ["_TargetInfo("] + msg.append(self.except_end_instruction.opname) + if self.jump_if_not_exc_instruction: + msg.append(" - ") + msg.append(self.jump_if_not_exc_instruction.opname) + msg.append("(") + msg.append(str(self.jump_if_not_exc_instruction.argval)) + msg.append(")") + msg.append(")") + return "".join(msg) + + def _get_except_target_info(instructions, exception_end_instruction_index, offset_to_instruction_idx): + next_3 = [ + j_instruction.opname for j_instruction in instructions[exception_end_instruction_index : exception_end_instruction_index + 3] + ] + # print('next_3:', [(j_instruction.opname, j_instruction.argval) for j_instruction in instructions[exception_end_instruction_index:exception_end_instruction_index + 3]]) + if next_3 == ["POP_TOP", "POP_TOP", "POP_TOP"]: # try..except without checking exception. + try: + jump_instruction = instructions[exception_end_instruction_index - 1] + if jump_instruction.opname not in ("JUMP_FORWARD", "JUMP_ABSOLUTE"): + return None + except IndexError: + pass + + if jump_instruction.opname == "JUMP_ABSOLUTE": + # On latest versions of Python 3 the interpreter has a go-backwards step, + # used to show the initial line of a for/while, etc (which is this + # JUMP_ABSOLUTE)... we're not really interested in it, but rather on where + # it points to. + except_end_instruction = instructions[offset_to_instruction_idx[jump_instruction.argval]] + idx = offset_to_instruction_idx[except_end_instruction.argval] + # Search for the POP_EXCEPT which should be at the end of the block. + for pop_except_instruction in reversed(instructions[:idx]): + if pop_except_instruction.opname == "POP_EXCEPT": + except_end_instruction = pop_except_instruction + return _TargetInfo(except_end_instruction) + else: + return None # i.e.: Continue outer loop + + else: + # JUMP_FORWARD + i = offset_to_instruction_idx[jump_instruction.argval] + try: + # i.e.: the jump is to the instruction after the block finishes (so, we need to + # get the previous instruction as that should be the place where the exception + # block finishes). + except_end_instruction = instructions[i - 1] + except: + pydev_log.critical("Error when computing try..except block end.") + return None + return _TargetInfo(except_end_instruction) + + elif next_3 and next_3[0] == "DUP_TOP": # try..except AssertionError. + iter_in = instructions[exception_end_instruction_index + 1 :] + for j, jump_if_not_exc_instruction in enumerate(iter_in): + if jump_if_not_exc_instruction.opname == "JUMP_IF_NOT_EXC_MATCH": + # Python 3.9 + except_end_instruction = instructions[offset_to_instruction_idx[jump_if_not_exc_instruction.argval]] + return _TargetInfo(except_end_instruction, jump_if_not_exc_instruction) + + elif jump_if_not_exc_instruction.opname == "COMPARE_OP" and jump_if_not_exc_instruction.argval == "exception match": + # Python 3.8 and before + try: + next_instruction = iter_in[j + 1] + except: + continue + if next_instruction.opname == "POP_JUMP_IF_FALSE": + except_end_instruction = instructions[offset_to_instruction_idx[next_instruction.argval]] + return _TargetInfo(except_end_instruction, next_instruction) + else: + return None # i.e.: Continue outer loop + + else: + # i.e.: we're not interested in try..finally statements, only try..except. + return None + + def collect_try_except_info(co, use_func_first_line=False): + # We no longer have 'END_FINALLY', so, we need to do things differently in Python 3.9 + if not hasattr(co, "co_lines") and not hasattr(co, "co_lnotab"): + return [] + + if use_func_first_line: + firstlineno = co.co_firstlineno + else: + firstlineno = 0 + + try_except_info_lst = [] + + op_offset_to_line = dict(entry for entry in dis.findlinestarts(co) if entry[1] is not None) + + offset_to_instruction_idx = {} + + instructions = list(iter_instructions(co)) + + for i, instruction in enumerate(instructions): + offset_to_instruction_idx[instruction.offset] = i + + for i, instruction in enumerate(instructions): + curr_op_name = instruction.opname + if curr_op_name in ("SETUP_FINALLY", "SETUP_EXCEPT"): # SETUP_EXCEPT before Python 3.8, SETUP_FINALLY Python 3.8 onwards. + exception_end_instruction_index = offset_to_instruction_idx[instruction.argval] + + jump_instruction = instructions[exception_end_instruction_index - 1] + if jump_instruction.opname not in ("JUMP_FORWARD", "JUMP_ABSOLUTE"): + continue + + except_end_instruction = None + indexes_checked = set() + indexes_checked.add(exception_end_instruction_index) + target_info = _get_except_target_info(instructions, exception_end_instruction_index, offset_to_instruction_idx) + while target_info is not None: + # Handle a try..except..except..except. + jump_instruction = target_info.jump_if_not_exc_instruction + except_end_instruction = target_info.except_end_instruction + + if jump_instruction is not None: + check_index = offset_to_instruction_idx[jump_instruction.argval] + if check_index in indexes_checked: + break + indexes_checked.add(check_index) + target_info = _get_except_target_info(instructions, check_index, offset_to_instruction_idx) + else: + break + + if except_end_instruction is not None: + try_except_info = TryExceptInfo( + _get_line(op_offset_to_line, instruction.offset, firstlineno, search=True), ignore=False + ) + try_except_info.except_bytecode_offset = instruction.argval + try_except_info.except_line = _get_line( + op_offset_to_line, try_except_info.except_bytecode_offset, firstlineno, search=True + ) + + try_except_info.except_end_bytecode_offset = except_end_instruction.offset + try_except_info.except_end_line = _get_line(op_offset_to_line, except_end_instruction.offset, firstlineno, search=True) + try_except_info_lst.append(try_except_info) + + for raise_instruction in instructions[i : offset_to_instruction_idx[try_except_info.except_end_bytecode_offset]]: + if raise_instruction.opname == "RAISE_VARARGS": + if raise_instruction.argval == 0: + try_except_info.raise_lines_in_except.append( + _get_line(op_offset_to_line, raise_instruction.offset, firstlineno, search=True) + ) + + return try_except_info_lst + +elif sys.version_info[:2] == (3, 10): + + class _TargetInfo(object): + def __init__(self, except_end_instruction, jump_if_not_exc_instruction=None): + self.except_end_instruction = except_end_instruction + self.jump_if_not_exc_instruction = jump_if_not_exc_instruction + + def __str__(self): + msg = ["_TargetInfo("] + msg.append(self.except_end_instruction.opname) + if self.jump_if_not_exc_instruction: + msg.append(" - ") + msg.append(self.jump_if_not_exc_instruction.opname) + msg.append("(") + msg.append(str(self.jump_if_not_exc_instruction.argval)) + msg.append(")") + msg.append(")") + return "".join(msg) + + def _get_except_target_info(instructions, exception_end_instruction_index, offset_to_instruction_idx): + next_3 = [ + j_instruction.opname for j_instruction in instructions[exception_end_instruction_index : exception_end_instruction_index + 3] + ] + # print('next_3:', [(j_instruction.opname, j_instruction.argval) for j_instruction in instructions[exception_end_instruction_index:exception_end_instruction_index + 3]]) + if next_3 == ["POP_TOP", "POP_TOP", "POP_TOP"]: # try..except without checking exception. + # Previously there was a jump which was able to point where the exception would end. This + # is no longer true, now a bare except doesn't really have any indication in the bytecode + # where the end would be expected if the exception wasn't raised, so, we just blindly + # search for a POP_EXCEPT from the current position. + for pop_except_instruction in instructions[exception_end_instruction_index + 3 :]: + if pop_except_instruction.opname == "POP_EXCEPT": + except_end_instruction = pop_except_instruction + return _TargetInfo(except_end_instruction) + + elif next_3 and next_3[0] == "DUP_TOP": # try..except AssertionError. + iter_in = instructions[exception_end_instruction_index + 1 :] + for jump_if_not_exc_instruction in iter_in: + if jump_if_not_exc_instruction.opname == "JUMP_IF_NOT_EXC_MATCH": + # Python 3.9 + except_end_instruction = instructions[offset_to_instruction_idx[jump_if_not_exc_instruction.argval]] + return _TargetInfo(except_end_instruction, jump_if_not_exc_instruction) + else: + return None # i.e.: Continue outer loop + + else: + # i.e.: we're not interested in try..finally statements, only try..except. + return None + + def collect_try_except_info(co, use_func_first_line=False): + # We no longer have 'END_FINALLY', so, we need to do things differently in Python 3.9 + if not hasattr(co, "co_lines") and not hasattr(co, "co_lnotab"): + return [] + + if use_func_first_line: + firstlineno = co.co_firstlineno + else: + firstlineno = 0 + + try_except_info_lst = [] + + op_offset_to_line = dict(entry for entry in dis.findlinestarts(co) if entry[1] is not None) + + offset_to_instruction_idx = {} + + instructions = list(iter_instructions(co)) + + for i, instruction in enumerate(instructions): + offset_to_instruction_idx[instruction.offset] = i + + for i, instruction in enumerate(instructions): + curr_op_name = instruction.opname + if curr_op_name == "SETUP_FINALLY": + exception_end_instruction_index = offset_to_instruction_idx[instruction.argval] + + jump_instruction = instructions[exception_end_instruction_index] + if jump_instruction.opname != "DUP_TOP": + continue + + except_end_instruction = None + indexes_checked = set() + indexes_checked.add(exception_end_instruction_index) + target_info = _get_except_target_info(instructions, exception_end_instruction_index, offset_to_instruction_idx) + while target_info is not None: + # Handle a try..except..except..except. + jump_instruction = target_info.jump_if_not_exc_instruction + except_end_instruction = target_info.except_end_instruction + + if jump_instruction is not None: + check_index = offset_to_instruction_idx[jump_instruction.argval] + if check_index in indexes_checked: + break + indexes_checked.add(check_index) + target_info = _get_except_target_info(instructions, check_index, offset_to_instruction_idx) + else: + break + + if except_end_instruction is not None: + try_except_info = TryExceptInfo( + _get_line(op_offset_to_line, instruction.offset, firstlineno, search=True), ignore=False + ) + try_except_info.except_bytecode_offset = instruction.argval + try_except_info.except_line = _get_line( + op_offset_to_line, try_except_info.except_bytecode_offset, firstlineno, search=True + ) + + try_except_info.except_end_bytecode_offset = except_end_instruction.offset + + # On Python 3.10 the final line of the except end isn't really correct, rather, + # it's engineered to be the same line of the except and not the end line of the + # block, so, the approach taken is to search for the biggest line between the + # except and the end instruction + except_end_line = -1 + start_i = offset_to_instruction_idx[try_except_info.except_bytecode_offset] + end_i = offset_to_instruction_idx[except_end_instruction.offset] + for instruction in instructions[start_i : end_i + 1]: + found_at_line = op_offset_to_line.get(instruction.offset) + if found_at_line is not None and found_at_line > except_end_line: + except_end_line = found_at_line + try_except_info.except_end_line = except_end_line - firstlineno + + try_except_info_lst.append(try_except_info) + + for raise_instruction in instructions[i : offset_to_instruction_idx[try_except_info.except_end_bytecode_offset]]: + if raise_instruction.opname == "RAISE_VARARGS": + if raise_instruction.argval == 0: + try_except_info.raise_lines_in_except.append( + _get_line(op_offset_to_line, raise_instruction.offset, firstlineno, search=True) + ) + + return try_except_info_lst + +elif sys.version_info[:2] >= (3, 11): + + def collect_try_except_info(co, use_func_first_line=False): + """ + Note: if the filename is available and we can get the source, + `collect_try_except_info_from_source` is preferred (this is kept as + a fallback for cases where sources aren't available). + """ + return [] + + +import ast as ast_module + + +class _Visitor(ast_module.NodeVisitor): + def __init__(self): + self.try_except_infos = [] + self._stack = [] + self._in_except_stack = [] + self.max_line = -1 + + def generic_visit(self, node): + if hasattr(node, "lineno"): + if node.lineno > self.max_line: + self.max_line = node.lineno + return ast_module.NodeVisitor.generic_visit(self, node) + + def visit_Try(self, node): + info = TryExceptInfo(node.lineno, ignore=True) + self._stack.append(info) + self.generic_visit(node) + assert info is self._stack.pop() + if not info.ignore: + self.try_except_infos.insert(0, info) + + if sys.version_info[0] < 3: + visit_TryExcept = visit_Try + + def visit_ExceptHandler(self, node): + info = self._stack[-1] + info.ignore = False + if info.except_line == -1: + info.except_line = node.lineno + self._in_except_stack.append(info) + self.generic_visit(node) + if hasattr(node, "end_lineno"): + info.except_end_line = node.end_lineno + else: + info.except_end_line = self.max_line + self._in_except_stack.pop() + + if sys.version_info[0] >= 3: + + def visit_Raise(self, node): + for info in self._in_except_stack: + if node.exc is None: + info.raise_lines_in_except.append(node.lineno) + self.generic_visit(node) + + else: + + def visit_Raise(self, node): + for info in self._in_except_stack: + if node.type is None and node.tback is None: + info.raise_lines_in_except.append(node.lineno) + self.generic_visit(node) + + +def collect_try_except_info_from_source(filename): + with open(filename, "rb") as stream: + contents = stream.read() + return collect_try_except_info_from_contents(contents, filename) + + +def collect_try_except_info_from_contents(contents, filename=""): + ast = ast_module.parse(contents, filename) + visitor = _Visitor() + visitor.visit(ast) + return visitor.try_except_infos + + +RESTART_FROM_LOOKAHEAD = object() +SEPARATOR = object() + + +class _MsgPart(object): + def __init__(self, line, tok): + assert line >= 0 + self.line = line + self.tok = tok + + def __str__(self) -> str: + return "_MsgPart(line: %s tok: %s)" % (self.line, self.tok) + + __repr__ = __str__ + + @classmethod + def add_to_line_to_contents(cls, obj, line_to_contents, line=None): + if isinstance(obj, (list, tuple)): + for o in obj: + cls.add_to_line_to_contents(o, line_to_contents, line=line) + return + + if isinstance(obj, str): + assert line is not None + line = int(line) + lst = line_to_contents.setdefault(line, []) + lst.append(obj) + return + + if isinstance(obj, _MsgPart): + if isinstance(obj.tok, (list, tuple)): + cls.add_to_line_to_contents(obj.tok, line_to_contents, line=obj.line) + return + + if isinstance(obj.tok, str): + lst = line_to_contents.setdefault(obj.line, []) + lst.append(obj.tok) + return + + raise AssertionError("Unhandled: %" % (obj,)) + + +class _Disassembler(object): + def __init__(self, co, firstlineno, level=0): + self.co = co + self.firstlineno = firstlineno + self.level = level + self.instructions = list(iter_instructions(co)) + op_offset_to_line = self.op_offset_to_line = dict(entry for entry in dis.findlinestarts(co) if entry[1] is not None) + + # Update offsets so that all offsets have the line index (and update it based on + # the passed firstlineno). + line_index = co.co_firstlineno - firstlineno + for instruction in self.instructions: + new_line_index = op_offset_to_line.get(instruction.offset) + if new_line_index is not None: + line_index = new_line_index - firstlineno + op_offset_to_line[instruction.offset] = line_index + else: + op_offset_to_line[instruction.offset] = line_index + + BIG_LINE_INT = 9999999 + SMALL_LINE_INT = -1 + + def min_line(self, *args): + m = self.BIG_LINE_INT + for arg in args: + if isinstance(arg, (list, tuple)): + m = min(m, self.min_line(*arg)) + + elif isinstance(arg, _MsgPart): + m = min(m, arg.line) + + elif hasattr(arg, "offset"): + m = min(m, self.op_offset_to_line[arg.offset]) + return m + + def max_line(self, *args): + m = self.SMALL_LINE_INT + for arg in args: + if isinstance(arg, (list, tuple)): + m = max(m, self.max_line(*arg)) + + elif isinstance(arg, _MsgPart): + m = max(m, arg.line) + + elif hasattr(arg, "offset"): + m = max(m, self.op_offset_to_line[arg.offset]) + return m + + def _lookahead(self): + """ + This handles and converts some common constructs from bytecode to actual source code. + + It may change the list of instructions. + """ + msg = self._create_msg_part + found = [] + fullrepr = None + + # Collect all the load instructions + for next_instruction in self.instructions: + if next_instruction.opname in ("LOAD_GLOBAL", "LOAD_FAST", "LOAD_CONST", "LOAD_NAME"): + found.append(next_instruction) + else: + break + + if not found: + return None + + if next_instruction.opname == "LOAD_ATTR": + prev_instruction = found[-1] + # Remove the current LOAD_ATTR + assert self.instructions.pop(len(found)) is next_instruction + + # Add the LOAD_ATTR to the previous LOAD + self.instructions[len(found) - 1] = _Instruction( + prev_instruction.opname, + prev_instruction.opcode, + prev_instruction.starts_line, + prev_instruction.argval, + False, # prev_instruction.is_jump_target, + prev_instruction.offset, + (msg(prev_instruction), msg(prev_instruction, "."), msg(next_instruction)), + ) + return RESTART_FROM_LOOKAHEAD + + if next_instruction.opname in ("CALL_FUNCTION", "PRECALL", "CALL"): + if len(found) == next_instruction.argval + 1: + force_restart = False + delta = 0 + else: + force_restart = True + if len(found) > next_instruction.argval + 1: + delta = len(found) - (next_instruction.argval + 1) + else: + return None # This is odd + + del_upto = delta + next_instruction.argval + 2 # +2 = NAME / CALL_FUNCTION + if next_instruction.opname == "PRECALL": + del_upto += 1 # Also remove the CALL right after the PRECALL. + del self.instructions[delta:del_upto] + + found = iter(found[delta:]) + call_func = next(found) + args = list(found) + fullrepr = [ + msg(call_func), + msg(call_func, "("), + ] + prev = call_func + for i, arg in enumerate(args): + if i > 0: + fullrepr.append(msg(prev, ", ")) + prev = arg + fullrepr.append(msg(arg)) + + fullrepr.append(msg(prev, ")")) + + if force_restart: + self.instructions.insert( + delta, + _Instruction( + call_func.opname, + call_func.opcode, + call_func.starts_line, + call_func.argval, + False, # call_func.is_jump_target, + call_func.offset, + tuple(fullrepr), + ), + ) + return RESTART_FROM_LOOKAHEAD + + elif next_instruction.opname == "BUILD_TUPLE": + if len(found) == next_instruction.argval: + force_restart = False + delta = 0 + else: + force_restart = True + if len(found) > next_instruction.argval: + delta = len(found) - (next_instruction.argval) + else: + return None # This is odd + + del self.instructions[delta : delta + next_instruction.argval + 1] # +1 = BUILD_TUPLE + + found = iter(found[delta:]) + + args = [instruction for instruction in found] + if args: + first_instruction = args[0] + else: + first_instruction = next_instruction + prev = first_instruction + + fullrepr = [] + fullrepr.append(msg(prev, "(")) + for i, arg in enumerate(args): + if i > 0: + fullrepr.append(msg(prev, ", ")) + prev = arg + fullrepr.append(msg(arg)) + + fullrepr.append(msg(prev, ")")) + + if force_restart: + self.instructions.insert( + delta, + _Instruction( + first_instruction.opname, + first_instruction.opcode, + first_instruction.starts_line, + first_instruction.argval, + False, # first_instruction.is_jump_target, + first_instruction.offset, + tuple(fullrepr), + ), + ) + return RESTART_FROM_LOOKAHEAD + + if fullrepr is not None and self.instructions: + if self.instructions[0].opname == "POP_TOP": + self.instructions.pop(0) + + if self.instructions[0].opname in ("STORE_FAST", "STORE_NAME"): + next_instruction = self.instructions.pop(0) + return msg(next_instruction), msg(next_instruction, " = "), fullrepr + + if self.instructions[0].opname == "RETURN_VALUE": + next_instruction = self.instructions.pop(0) + return msg(next_instruction, "return ", line=self.min_line(next_instruction, fullrepr)), fullrepr + + return fullrepr + + def _decorate_jump_target(self, instruction, instruction_repr): + if instruction.is_jump_target: + return ("|", str(instruction.offset), "|", instruction_repr) + + return instruction_repr + + def _create_msg_part(self, instruction, tok=None, line=None): + dec = self._decorate_jump_target + if line is None or line in (self.BIG_LINE_INT, self.SMALL_LINE_INT): + line = self.op_offset_to_line[instruction.offset] + + argrepr = instruction.argrepr + if isinstance(argrepr, str) and argrepr.startswith("NULL + "): + argrepr = argrepr[7:] + if isinstance(argrepr, str) and argrepr.endswith("+ NULL"): + argrepr = argrepr[:-7] + return _MsgPart(line, tok if tok is not None else dec(instruction, argrepr)) + + def _next_instruction_to_str(self, line_to_contents): + # indent = '' + # if self.level > 0: + # indent += ' ' * self.level + # print(indent, 'handle', self.instructions[0]) + + if self.instructions: + ret = self._lookahead() + if ret: + return ret + + msg = self._create_msg_part + + instruction = self.instructions.pop(0) + + if instruction.opname in ("RESUME", "NULL"): + return None + + if instruction.opname == "RETURN_CONST": + return (msg(instruction, "return ", line=self.min_line(instruction)), msg(instruction)) + + if instruction.opname in ("LOAD_GLOBAL", "LOAD_FAST", "LOAD_CONST", "LOAD_NAME"): + next_instruction = self.instructions[0] + if next_instruction.opname in ("STORE_FAST", "STORE_NAME"): + self.instructions.pop(0) + return (msg(next_instruction), msg(next_instruction, " = "), msg(instruction)) + + if next_instruction.opname == "RETURN_VALUE": + self.instructions.pop(0) + return (msg(instruction, "return ", line=self.min_line(instruction)), msg(instruction)) + + if next_instruction.opname == "RAISE_VARARGS" and next_instruction.argval == 1: + self.instructions.pop(0) + return (msg(instruction, "raise ", line=self.min_line(instruction)), msg(instruction)) + + if instruction.opname == "LOAD_CONST": + if inspect.iscode(instruction.argval): + code_line_to_contents = _Disassembler(instruction.argval, self.firstlineno, self.level + 1).build_line_to_contents() + + for contents in code_line_to_contents.values(): + contents.insert(0, " ") + for line, contents in code_line_to_contents.items(): + line_to_contents.setdefault(line, []).extend(contents) + return msg(instruction, "LOAD_CONST(code)") + + if instruction.opname == "RAISE_VARARGS": + if instruction.argval == 0: + return msg(instruction, "raise") + + if instruction.opname == "SETUP_FINALLY": + return msg(instruction, ("try(", instruction.argrepr, "):")) + + if instruction.argrepr: + return msg(instruction, (instruction.opname, "(", instruction.argrepr, ")")) + + if instruction.argval: + return msg( + instruction, + "%s{%s}" + % ( + instruction.opname, + instruction.argval, + ), + ) + + return msg(instruction, instruction.opname) + + def build_line_to_contents(self): + # print('----') + # for instruction in self.instructions: + # print(instruction) + # print('----\n\n') + + line_to_contents = {} + + instructions = self.instructions + while instructions: + s = self._next_instruction_to_str(line_to_contents) + if s is RESTART_FROM_LOOKAHEAD: + continue + if s is None: + continue + + _MsgPart.add_to_line_to_contents(s, line_to_contents) + m = self.max_line(s) + if m != self.SMALL_LINE_INT: + line_to_contents.setdefault(m, []).append(SEPARATOR) + return line_to_contents + + def disassemble(self): + line_to_contents = self.build_line_to_contents() + stream = StringIO() + last_line = 0 + show_lines = False + for line, contents in sorted(line_to_contents.items()): + while last_line < line - 1: + if show_lines: + stream.write("%s.\n" % (last_line + 1,)) + else: + stream.write("\n") + last_line += 1 + + if show_lines: + stream.write("%s. " % (line,)) + + for i, content in enumerate(contents): + if content == SEPARATOR: + if i != len(contents) - 1: + stream.write(", ") + else: + stream.write(content) + + stream.write("\n") + + last_line = line + + return stream.getvalue() + + +def code_to_bytecode_representation(co, use_func_first_line=False): + """ + A simple disassemble of bytecode. + + It does not attempt to provide the full Python source code, rather, it provides a low-level + representation of the bytecode, respecting the lines (so, its target is making the bytecode + easier to grasp and not providing the original source code). + + Note that it does show jump locations/targets and converts some common bytecode constructs to + Python code to make it a bit easier to understand. + """ + # Reference for bytecodes: + # https://docs.python.org/3/library/dis.html + if use_func_first_line: + firstlineno = co.co_firstlineno + else: + firstlineno = 0 + + return _Disassembler(co, firstlineno).disassemble() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm.py new file mode 100644 index 0000000..b70d7dc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm.py @@ -0,0 +1,1920 @@ +""" pydevd - a debugging daemon +This is the daemon you launch for python remote debugging. + +Protocol: +each command has a format: + id\tsequence-num\ttext + id: protocol command number + sequence-num: each request has a sequence number. Sequence numbers + originating at the debugger are odd, sequence numbers originating + at the daemon are even. Every response uses the same sequence number + as the request. + payload: it is protocol dependent. When response is a complex structure, it + is returned as XML. Each attribute value is urlencoded, and then the whole + payload is urlencoded again to prevent stray characters corrupting protocol/xml encodings + + Commands: + + NUMBER NAME FROM* ARGUMENTS RESPONSE NOTE +100 series: program execution + 101 RUN JAVA - - + 102 LIST_THREADS JAVA RETURN with XML listing of all threads + 103 THREAD_CREATE PYDB - XML with thread information + 104 THREAD_KILL JAVA id (or * to exit) kills the thread + PYDB id nofies JAVA that thread was killed + 105 THREAD_SUSPEND JAVA XML of the stack, suspends the thread + reason for suspension + PYDB id notifies JAVA that thread was suspended + + 106 CMD_THREAD_RUN JAVA id resume the thread + PYDB id \t reason notifies JAVA that thread was resumed + + 107 STEP_INTO JAVA thread_id + 108 STEP_OVER JAVA thread_id + 109 STEP_RETURN JAVA thread_id + + 110 GET_VARIABLE JAVA thread_id \t frame_id \t GET_VARIABLE with XML of var content + FRAME|GLOBAL \t attributes* + + 111 SET_BREAK JAVA file/line of the breakpoint + 112 REMOVE_BREAK JAVA file/line of the return + 113 CMD_EVALUATE_EXPRESSION JAVA expression result of evaluating the expression + 114 CMD_GET_FRAME JAVA request for frame contents + 115 CMD_EXEC_EXPRESSION JAVA + 116 CMD_WRITE_TO_CONSOLE PYDB + 117 CMD_CHANGE_VARIABLE + 118 CMD_RUN_TO_LINE + 119 CMD_RELOAD_CODE + 120 CMD_GET_COMPLETIONS JAVA + + 200 CMD_REDIRECT_OUTPUT JAVA streams to redirect as string - + 'STDOUT' (redirect only STDOUT) + 'STDERR' (redirect only STDERR) + 'STDOUT STDERR' (redirect both streams) + +500 series diagnostics/ok + 501 VERSION either Version string (1.0) Currently just used at startup + 502 RETURN either Depends on caller - + +900 series: errors + 901 ERROR either - This is reserved for unexpected errors. + + * JAVA - remote debugger, the java end + * PYDB - pydevd, the python end +""" + +import linecache +import os + +from _pydev_bundle.pydev_imports import _queue +from _pydev_bundle._pydev_saved_modules import time, ThreadingEvent +from _pydev_bundle._pydev_saved_modules import socket as socket_module +from _pydevd_bundle.pydevd_constants import ( + DebugInfoHolder, + IS_WINDOWS, + IS_JYTHON, + IS_WASM, + IS_PY36_OR_GREATER, + STATE_RUN, + ASYNC_EVAL_TIMEOUT_SEC, + get_global_debugger, + GetGlobalDebugger, + set_global_debugger, # Keep for backward compatibility @UnusedImport + silence_warnings_decorator, + filter_all_warnings, + IS_PY311_OR_GREATER, +) +from _pydev_bundle.pydev_override import overrides +import weakref +from _pydev_bundle._pydev_completer import extract_token_and_qualifier +from _pydevd_bundle._debug_adapter.pydevd_schema import ( + VariablesResponseBody, + SetVariableResponseBody, + StepInTarget, + StepInTargetsResponseBody, +) +from _pydevd_bundle._debug_adapter import pydevd_base_schema, pydevd_schema +from _pydevd_bundle.pydevd_net_command import NetCommand +from _pydevd_bundle.pydevd_xml import ExceptionOnEvaluate +from _pydevd_bundle.pydevd_constants import ForkSafeLock, NULL +from _pydevd_bundle.pydevd_daemon_thread import PyDBDaemonThread +from _pydevd_bundle.pydevd_thread_lifecycle import pydevd_find_thread_by_id, resume_threads +from _pydevd_bundle.pydevd_dont_trace_files import PYDEV_FILE +import dis +import pydevd_file_utils +import itertools +from urllib.parse import quote_plus, unquote_plus +import pydevconsole +from _pydevd_bundle import pydevd_vars, pydevd_io, pydevd_reload +from _pydevd_bundle import pydevd_bytecode_utils +from _pydevd_bundle import pydevd_xml +from _pydevd_bundle import pydevd_vm_type +import sys +import traceback +from _pydevd_bundle.pydevd_utils import ( + quote_smart as quote, + compare_object_attrs_key, + notify_about_gevent_if_needed, + isinstance_checked, + ScopeRequest, + getattr_checked, + Timer, + is_current_thread_main_thread, +) +from _pydev_bundle import pydev_log, fsnotify +from _pydev_bundle.pydev_log import exception as pydev_log_exception +from _pydev_bundle import _pydev_completer + +from pydevd_tracing import get_exception_traceback_str +from _pydevd_bundle import pydevd_console +from _pydev_bundle.pydev_monkey import disable_trace_thread_modules, enable_trace_thread_modules +from io import StringIO + +# CMD_XXX constants imported for backward compatibility +from _pydevd_bundle.pydevd_comm_constants import * # @UnusedWildImport + +# Socket import aliases: +AF_INET, AF_INET6, SOCK_STREAM, SHUT_WR, SOL_SOCKET, IPPROTO_TCP, socket = ( + socket_module.AF_INET, + socket_module.AF_INET6, + socket_module.SOCK_STREAM, + socket_module.SHUT_WR, + socket_module.SOL_SOCKET, + socket_module.IPPROTO_TCP, + socket_module.socket, +) + +if IS_WINDOWS and not IS_JYTHON: + SO_EXCLUSIVEADDRUSE = socket_module.SO_EXCLUSIVEADDRUSE +if not IS_WASM: + SO_REUSEADDR = socket_module.SO_REUSEADDR + + +class ReaderThread(PyDBDaemonThread): + """reader thread reads and dispatches commands in an infinite loop""" + + def __init__(self, sock, py_db, PyDevJsonCommandProcessor, process_net_command, terminate_on_socket_close=True): + assert sock is not None + PyDBDaemonThread.__init__(self, py_db) + self.__terminate_on_socket_close = terminate_on_socket_close + + self.sock = sock + self._buffer = b"" + self.name = "pydevd.Reader" + self.process_net_command = process_net_command + self.process_net_command_json = PyDevJsonCommandProcessor(self._from_json).process_net_command_json + + def _from_json(self, json_msg, update_ids_from_dap=False): + return pydevd_base_schema.from_json(json_msg, update_ids_from_dap, on_dict_loaded=self._on_dict_loaded) + + def _on_dict_loaded(self, dct): + for listener in self.py_db.dap_messages_listeners: + listener.after_receive(dct) + + @overrides(PyDBDaemonThread.do_kill_pydev_thread) + def do_kill_pydev_thread(self): + PyDBDaemonThread.do_kill_pydev_thread(self) + # Note that we no longer shutdown the reader, just the writer. The idea is that we shutdown + # the writer to send that the communication has finished, then, the client will shutdown its + # own writer when it receives an empty read, at which point this reader will also shutdown. + + # That way, we can *almost* guarantee that all messages have been properly sent -- it's not + # completely guaranteed because it's possible that the process exits before the whole + # message was sent as having this thread alive won't stop the process from exiting -- we + # have a timeout when exiting the process waiting for this thread to finish -- see: + # PyDB.dispose_and_kill_all_pydevd_threads()). + + # try: + # self.sock.shutdown(SHUT_RD) + # except: + # pass + # try: + # self.sock.close() + # except: + # pass + + def _read(self, size): + while True: + buffer_len = len(self._buffer) + if buffer_len == size: + ret = self._buffer + self._buffer = b"" + return ret + + if buffer_len > size: + ret = self._buffer[:size] + self._buffer = self._buffer[size:] + return ret + + try: + r = self.sock.recv(max(size - buffer_len, 1024)) + except OSError: + return b"" + if not r: + return b"" + self._buffer += r + + def _read_line(self): + while True: + i = self._buffer.find(b"\n") + if i != -1: + i += 1 # Add the newline to the return + ret = self._buffer[:i] + self._buffer = self._buffer[i:] + return ret + else: + try: + r = self.sock.recv(1024) + except OSError: + return b"" + if not r: + return b"" + self._buffer += r + + @overrides(PyDBDaemonThread._on_run) + def _on_run(self): + try: + content_len = -1 + + while True: + # i.e.: even if we received a kill, we should only exit the ReaderThread when the + # client itself closes the connection (although on kill received we stop actually + # processing anything read). + try: + notify_about_gevent_if_needed() + line = self._read_line() + + if len(line) == 0: + pydev_log.debug("ReaderThread: empty contents received (len(line) == 0).") + self._terminate_on_socket_close() + return # Finished communication. + + if self._kill_received: + continue + + if line.startswith(b"Content-Length:"): + content_len = int(line.strip().split(b":", 1)[1]) + continue + + if content_len != -1: + # If we previously received a content length, read until a '\r\n'. + if line == b"\r\n": + json_contents = self._read(content_len) + + content_len = -1 + + if len(json_contents) == 0: + pydev_log.debug("ReaderThread: empty contents received (len(json_contents) == 0).") + self._terminate_on_socket_close() + return # Finished communication. + + if self._kill_received: + continue + + # We just received a json message, let's process it. + self.process_net_command_json(self.py_db, json_contents) + + continue + else: + # No content len, regular line-based protocol message (remove trailing new-line). + if line.endswith(b"\n\n"): + line = line[:-2] + + elif line.endswith(b"\n"): + line = line[:-1] + + elif line.endswith(b"\r"): + line = line[:-1] + except: + if not self._kill_received: + pydev_log_exception() + self._terminate_on_socket_close() + return # Finished communication. + + # Note: the java backend is always expected to pass utf-8 encoded strings. We now work with str + # internally and thus, we may need to convert to the actual encoding where needed (i.e.: filenames + # on python 2 may need to be converted to the filesystem encoding). + if hasattr(line, "decode"): + line = line.decode("utf-8") + + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 3: + pydev_log.debug("debugger: received >>%s<<\n", line) + + args = line.split("\t", 2) + try: + cmd_id = int(args[0]) + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 3: + pydev_log.debug("Received command: %s %s\n", ID_TO_MEANING.get(str(cmd_id), "???"), line) + self.process_command(cmd_id, int(args[1]), args[2]) + except: + if sys is not None and pydev_log_exception is not None: # Could happen at interpreter shutdown + pydev_log_exception("Can't process net command: %s.", line) + + except: + if not self._kill_received: + if sys is not None and pydev_log_exception is not None: # Could happen at interpreter shutdown + pydev_log_exception() + + self._terminate_on_socket_close() + finally: + pydev_log.debug("ReaderThread: exit") + + def _terminate_on_socket_close(self): + if self.__terminate_on_socket_close: + self.py_db.dispose_and_kill_all_pydevd_threads() + + def process_command(self, cmd_id, seq, text): + self.process_net_command(self.py_db, cmd_id, seq, text) + + +class FSNotifyThread(PyDBDaemonThread): + def __init__(self, py_db, api, watch_dirs): + PyDBDaemonThread.__init__(self, py_db) + self.api = api + self.name = "pydevd.FSNotifyThread" + self.watcher = fsnotify.Watcher() + self.watch_dirs = watch_dirs + + @overrides(PyDBDaemonThread._on_run) + def _on_run(self): + try: + pydev_log.info("Watching directories for code reload:\n---\n%s\n---" % ("\n".join(sorted(self.watch_dirs)))) + + # i.e.: The first call to set_tracked_paths will do a full scan, so, do it in the thread + # too (after everything is configured). + self.watcher.set_tracked_paths(self.watch_dirs) + while not self._kill_received: + for change_enum, change_path in self.watcher.iter_changes(): + # We're only interested in modified events + if change_enum == fsnotify.Change.modified: + pydev_log.info("Modified: %s", change_path) + self.api.request_reload_code(self.py_db, -1, None, change_path) + else: + pydev_log.info("Ignored (add or remove) change in: %s", change_path) + except: + pydev_log.exception("Error when waiting for filesystem changes in FSNotifyThread.") + + @overrides(PyDBDaemonThread.do_kill_pydev_thread) + def do_kill_pydev_thread(self): + self.watcher.dispose() + PyDBDaemonThread.do_kill_pydev_thread(self) + + +class WriterThread(PyDBDaemonThread): + """writer thread writes out the commands in an infinite loop""" + + def __init__(self, sock, py_db, terminate_on_socket_close=True): + PyDBDaemonThread.__init__(self, py_db) + self.sock = sock + self.__terminate_on_socket_close = terminate_on_socket_close + self.name = "pydevd.Writer" + self._cmd_queue = _queue.Queue() + if pydevd_vm_type.get_vm_type() == "python": + self.timeout = 0 + else: + self.timeout = 0.1 + + def add_command(self, cmd): + """cmd is NetCommand""" + if not self._kill_received: # we don't take new data after everybody die + self._cmd_queue.put(cmd, False) + + @overrides(PyDBDaemonThread._on_run) + def _on_run(self): + """just loop and write responses""" + + try: + while True: + try: + try: + cmd = self._cmd_queue.get(True, 0.1) + except _queue.Empty: + if self._kill_received: + pydev_log.debug("WriterThread: kill_received (sock.shutdown(SHUT_WR))") + try: + self.sock.shutdown(SHUT_WR) + except: + pass + # Note: don't close the socket, just send the shutdown, + # then, when no data is received on the reader, it can close + # the socket. + # See: https://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable + + # try: + # self.sock.close() + # except: + # pass + + return # break if queue is empty and _kill_received + else: + continue + except: + # pydev_log.info('Finishing debug communication...(1)') + # when liberating the thread here, we could have errors because we were shutting down + # but the thread was still not liberated + return + + if cmd.as_dict is not None: + for listener in self.py_db.dap_messages_listeners: + listener.before_send(cmd.as_dict) + + notify_about_gevent_if_needed() + cmd.send(self.sock) + + if cmd.id == CMD_EXIT: + pydev_log.debug("WriterThread: CMD_EXIT received") + break + if time is None: + break # interpreter shutdown + time.sleep(self.timeout) + except Exception: + if self.__terminate_on_socket_close: + self.py_db.dispose_and_kill_all_pydevd_threads() + if DebugInfoHolder.DEBUG_TRACE_LEVEL > 0: + pydev_log_exception() + finally: + pydev_log.debug("WriterThread: exit") + + def empty(self): + return self._cmd_queue.empty() + + @overrides(PyDBDaemonThread.do_kill_pydev_thread) + def do_kill_pydev_thread(self): + if not self._kill_received: + # Add command before setting the kill flag (otherwise the command may not be added). + exit_cmd = self.py_db.cmd_factory.make_exit_command(self.py_db) + self.add_command(exit_cmd) + + PyDBDaemonThread.do_kill_pydev_thread(self) + + +def create_server_socket(host, port): + try: + server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) + if IS_WINDOWS and not IS_JYTHON: + server.setsockopt(SOL_SOCKET, SO_EXCLUSIVEADDRUSE, 1) + elif not IS_WASM: + server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) + + server.bind((host, port)) + server.settimeout(None) + except Exception: + server.close() + raise + + return server + + +def start_server(port): + """binds to a port, waits for the debugger to connect""" + s = create_server_socket(host="", port=port) + + try: + s.listen(1) + # Let the user know it's halted waiting for the connection. + host, port = s.getsockname() + msg = f"pydevd: waiting for connection at: {host}:{port}" + print(msg, file=sys.stderr) + pydev_log.info(msg) + + new_socket, _addr = s.accept() + pydev_log.info("Connection accepted") + # closing server socket is not necessary but we don't need it + s.close() + return new_socket + except: + pydev_log.exception("Could not bind to port: %s\n", port) + raise + + +def start_client(host, port): + """connects to a host/port""" + pydev_log.info("Connecting to %s:%s", host, port) + + address_family = AF_INET + for res in socket_module.getaddrinfo(host, port, 0, SOCK_STREAM): + if res[0] == AF_INET: + address_family = res[0] + # Prefer IPv4 addresses for backward compat. + break + if res[0] == AF_INET6: + # Don't break after this - if the socket is dual-stack prefer IPv4. + address_family = res[0] + + s = socket(address_family, SOCK_STREAM) + + # Set TCP keepalive on an open socket. + # It activates after 1 second (TCP_KEEPIDLE,) of idleness, + # then sends a keepalive ping once every 3 seconds (TCP_KEEPINTVL), + # and closes the connection after 5 failed ping (TCP_KEEPCNT), or 15 seconds + try: + s.setsockopt(SOL_SOCKET, socket_module.SO_KEEPALIVE, 1) + except (AttributeError, OSError): + pass # May not be available everywhere. + try: + s.setsockopt(socket_module.IPPROTO_TCP, socket_module.TCP_KEEPIDLE, 1) + except (AttributeError, OSError): + pass # May not be available everywhere. + try: + s.setsockopt(socket_module.IPPROTO_TCP, socket_module.TCP_KEEPINTVL, 3) + except (AttributeError, OSError): + pass # May not be available everywhere. + try: + s.setsockopt(socket_module.IPPROTO_TCP, socket_module.TCP_KEEPCNT, 5) + except (AttributeError, OSError): + pass # May not be available everywhere. + + try: + # 10 seconds default timeout + timeout = int(os.environ.get("PYDEVD_CONNECT_TIMEOUT", 10)) + s.settimeout(timeout) + s.connect((host, port)) + s.settimeout(None) # no timeout after connected + pydev_log.info(f"Connected to: {s}.") + return s + except: + pydev_log.exception("Could not connect to %s: %s", host, port) + raise + + +INTERNAL_TERMINATE_THREAD = 1 +INTERNAL_SUSPEND_THREAD = 2 + + +class InternalThreadCommand(object): + """internal commands are generated/executed by the debugger. + + The reason for their existence is that some commands have to be executed + on specific threads. These are the InternalThreadCommands that get + get posted to PyDB. + """ + + def __init__(self, thread_id, method=None, *args, **kwargs): + self.thread_id = thread_id + self.method = method + self.args = args + self.kwargs = kwargs + + def can_be_executed_by(self, thread_id): + """By default, it must be in the same thread to be executed""" + return self.thread_id == thread_id or self.thread_id.endswith("|" + thread_id) + + def do_it(self, dbg): + try: + if self.method is not None: + self.method(dbg, *self.args, **self.kwargs) + else: + raise NotImplementedError("you have to override do_it") + finally: + self.args = None + self.kwargs = None + + def __str__(self): + return "InternalThreadCommands(%s, %s, %s)" % (self.method, self.args, self.kwargs) + + __repr__ = __str__ + + +class InternalThreadCommandForAnyThread(InternalThreadCommand): + def __init__(self, thread_id, method=None, *args, **kwargs): + assert thread_id == "*" + + InternalThreadCommand.__init__(self, thread_id, method, *args, **kwargs) + + self.executed = False + self.lock = ForkSafeLock() + + def can_be_executed_by(self, thread_id): + return True # Can be executed by any thread. + + def do_it(self, dbg): + with self.lock: + if self.executed: + return + self.executed = True + + InternalThreadCommand.do_it(self, dbg) + + +def _send_io_message(py_db, s): + cmd = py_db.cmd_factory.make_io_message(s, 2) + if py_db.writer is not None: + py_db.writer.add_command(cmd) + + +def internal_reload_code(dbg, seq, module_name, filename): + try: + found_module_to_reload = False + if module_name is not None: + module_name = module_name + if module_name not in sys.modules: + if "." in module_name: + new_module_name = module_name.split(".")[-1] + if new_module_name in sys.modules: + module_name = new_module_name + + modules_to_reload = {} + module = sys.modules.get(module_name) + if module is not None: + modules_to_reload[id(module)] = (module, module_name) + + if filename: + filename = pydevd_file_utils.normcase(filename) + for module_name, module in sys.modules.copy().items(): + f = getattr_checked(module, "__file__") + if f is not None: + if f.endswith((".pyc", ".pyo")): + f = f[:-1] + + if pydevd_file_utils.normcase(f) == filename: + modules_to_reload[id(module)] = (module, module_name) + + if not modules_to_reload: + if filename and module_name: + _send_io_message(dbg, "code reload: Unable to find module %s to reload for path: %s\n" % (module_name, filename)) + elif filename: + _send_io_message(dbg, "code reload: Unable to find module to reload for path: %s\n" % (filename,)) + elif module_name: + _send_io_message(dbg, "code reload: Unable to find module to reload: %s\n" % (module_name,)) + + else: + # Too much info... + # _send_io_message(dbg, 'code reload: This usually means you are trying to reload the __main__ module (which cannot be reloaded).\n') + for module, module_name in modules_to_reload.values(): + _send_io_message(dbg, 'code reload: Start reloading module: "' + module_name + '" ... \n') + found_module_to_reload = True + + if pydevd_reload.xreload(module): + _send_io_message(dbg, "code reload: reload finished\n") + else: + _send_io_message(dbg, "code reload: reload finished without applying any change\n") + + cmd = dbg.cmd_factory.make_reloaded_code_message(seq, found_module_to_reload) + dbg.writer.add_command(cmd) + except: + pydev_log.exception("Error reloading code") + + +class InternalGetThreadStack(InternalThreadCommand): + """ + This command will either wait for a given thread to be paused to get its stack or will provide + it anyways after a timeout (in which case the stack will be gotten but local variables won't + be available and it'll not be possible to interact with the frame as it's not actually + stopped in a breakpoint). + """ + + def __init__(self, seq, thread_id, py_db, set_additional_thread_info, fmt, timeout=0.5, start_frame=0, levels=0): + InternalThreadCommand.__init__(self, thread_id) + self._py_db = weakref.ref(py_db) + self._timeout = time.time() + timeout + self.seq = seq + self._cmd = None + self._fmt = fmt + self._start_frame = start_frame + self._levels = levels + + # Note: receives set_additional_thread_info to avoid a circular import + # in this module. + self._set_additional_thread_info = set_additional_thread_info + + @overrides(InternalThreadCommand.can_be_executed_by) + def can_be_executed_by(self, _thread_id): + timed_out = time.time() >= self._timeout + + py_db = self._py_db() + t = pydevd_find_thread_by_id(self.thread_id) + frame = None + if t and not getattr(t, "pydev_do_not_trace", None): + additional_info = self._set_additional_thread_info(t) + frame = additional_info.get_topmost_frame(t) + try: + self._cmd = py_db.cmd_factory.make_get_thread_stack_message( + py_db, + self.seq, + self.thread_id, + frame, + self._fmt, + must_be_suspended=not timed_out, + start_frame=self._start_frame, + levels=self._levels, + ) + finally: + frame = None + t = None + + return self._cmd is not None or timed_out + + @overrides(InternalThreadCommand.do_it) + def do_it(self, dbg): + if self._cmd is not None: + dbg.writer.add_command(self._cmd) + self._cmd = None + + +def internal_step_in_thread(py_db, thread_id, cmd_id, set_additional_thread_info): + thread_to_step = pydevd_find_thread_by_id(thread_id) + if thread_to_step is not None: + info = set_additional_thread_info(thread_to_step) + info.pydev_original_step_cmd = cmd_id + info.pydev_step_cmd = cmd_id + info.pydev_step_stop = None + info.pydev_state = STATE_RUN + info.update_stepping_info() + + if py_db.stepping_resumes_all_threads: + resume_threads("*", except_thread=thread_to_step) + + +def internal_smart_step_into(py_db, thread_id, offset, child_offset, set_additional_thread_info): + thread_to_step = pydevd_find_thread_by_id(thread_id) + if thread_to_step is not None: + info = set_additional_thread_info(thread_to_step) + info.pydev_original_step_cmd = CMD_SMART_STEP_INTO + info.pydev_step_cmd = CMD_SMART_STEP_INTO + info.pydev_step_stop = None + info.pydev_smart_parent_offset = int(offset) + info.pydev_smart_child_offset = int(child_offset) + info.pydev_state = STATE_RUN + info.update_stepping_info() + + if py_db.stepping_resumes_all_threads: + resume_threads("*", except_thread=thread_to_step) + + +class InternalSetNextStatementThread(InternalThreadCommand): + def __init__(self, thread_id, cmd_id, line, func_name, seq=0): + """ + cmd_id may actually be one of: + + CMD_RUN_TO_LINE + CMD_SET_NEXT_STATEMENT + CMD_SMART_STEP_INTO + """ + self.thread_id = thread_id + self.cmd_id = cmd_id + self.line = line + self.seq = seq + + self.func_name = func_name + + def do_it(self, dbg): + t = pydevd_find_thread_by_id(self.thread_id) + if t is not None: + info = t.additional_info + info.pydev_original_step_cmd = self.cmd_id + info.pydev_step_cmd = self.cmd_id + info.pydev_step_stop = None + info.pydev_next_line = int(self.line) + info.pydev_func_name = self.func_name + info.pydev_message = str(self.seq) + info.pydev_smart_parent_offset = -1 + info.pydev_smart_child_offset = -1 + info.pydev_state = STATE_RUN + info.update_stepping_info() + + +@silence_warnings_decorator +def internal_get_variable_json(py_db, request): + """ + :param VariablesRequest request: + """ + arguments = request.arguments # : :type arguments: VariablesArguments + variables_reference = arguments.variablesReference + scope = None + if isinstance_checked(variables_reference, ScopeRequest): + scope = variables_reference + variables_reference = variables_reference.variable_reference + + fmt = arguments.format + if hasattr(fmt, "to_dict"): + fmt = fmt.to_dict() + + variables = [] + try: + try: + variable = py_db.suspended_frames_manager.get_variable(variables_reference) + except KeyError: + pass + else: + for child_var in variable.get_children_variables(fmt=fmt, scope=scope): + variables.append(child_var.get_var_data(fmt=fmt)) + except: + try: + exc, exc_type, tb = sys.exc_info() + err = "".join(traceback.format_exception(exc, exc_type, tb)) + variables = [{"name": "", "value": err, "type": "", "variablesReference": 0}] + except: + err = "" + pydev_log.exception(err) + variables = [] + + body = VariablesResponseBody(variables) + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + py_db.writer.add_command(NetCommand(CMD_RETURN, 0, variables_response, is_json=True)) + + +class InternalGetVariable(InternalThreadCommand): + """gets the value of a variable""" + + def __init__(self, seq, thread_id, frame_id, scope, attrs): + self.sequence = seq + self.thread_id = thread_id + self.frame_id = frame_id + self.scope = scope + self.attributes = attrs + + @silence_warnings_decorator + def do_it(self, dbg): + """Converts request into python variable""" + try: + xml = StringIO() + xml.write("") + type_name, val_dict = pydevd_vars.resolve_compound_variable_fields( + dbg, self.thread_id, self.frame_id, self.scope, self.attributes + ) + if val_dict is None: + val_dict = {} + + # assume properly ordered if resolver returns 'OrderedDict' + # check type as string to support OrderedDict backport for older Python + keys = list(val_dict) + if not (type_name == "OrderedDict" or val_dict.__class__.__name__ == "OrderedDict" or IS_PY36_OR_GREATER): + keys = sorted(keys, key=compare_object_attrs_key) + + timer = Timer() + for k in keys: + val = val_dict[k] + evaluate_full_value = pydevd_xml.should_evaluate_full_value(val) + xml.write(pydevd_xml.var_to_xml(val, k, evaluate_full_value=evaluate_full_value)) + timer.report_if_compute_repr_attr_slow(self.attributes, k, type(val)) + + xml.write("") + cmd = dbg.cmd_factory.make_get_variable_message(self.sequence, xml.getvalue()) + xml.close() + dbg.writer.add_command(cmd) + except Exception: + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error resolving variables %s" % (get_exception_traceback_str(),)) + dbg.writer.add_command(cmd) + + +class InternalGetArray(InternalThreadCommand): + def __init__(self, seq, roffset, coffset, rows, cols, format, thread_id, frame_id, scope, attrs): + self.sequence = seq + self.thread_id = thread_id + self.frame_id = frame_id + self.scope = scope + self.name = attrs.split("\t")[-1] + self.attrs = attrs + self.roffset = int(roffset) + self.coffset = int(coffset) + self.rows = int(rows) + self.cols = int(cols) + self.format = format + + def do_it(self, dbg): + try: + frame = dbg.find_frame(self.thread_id, self.frame_id) + var = pydevd_vars.eval_in_context(self.name, frame.f_globals, frame.f_locals, py_db=dbg) + xml = pydevd_vars.table_like_struct_to_xml(var, self.name, self.roffset, self.coffset, self.rows, self.cols, self.format) + cmd = dbg.cmd_factory.make_get_array_message(self.sequence, xml) + dbg.writer.add_command(cmd) + except: + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error resolving array: " + get_exception_traceback_str()) + dbg.writer.add_command(cmd) + + +def internal_change_variable(dbg, seq, thread_id, frame_id, scope, attr, value): + """Changes the value of a variable""" + try: + frame = dbg.find_frame(thread_id, frame_id) + if frame is not None: + result = pydevd_vars.change_attr_expression(frame, attr, value, dbg) + else: + result = None + xml = "" + xml += pydevd_xml.var_to_xml(result, "") + xml += "" + cmd = dbg.cmd_factory.make_variable_changed_message(seq, xml) + dbg.writer.add_command(cmd) + except Exception: + cmd = dbg.cmd_factory.make_error_message( + seq, "Error changing variable attr:%s expression:%s traceback:%s" % (attr, value, get_exception_traceback_str()) + ) + dbg.writer.add_command(cmd) + + +def internal_change_variable_json(py_db, request): + """ + The pydevd_vars.change_attr_expression(thread_id, frame_id, attr, value, dbg) can only + deal with changing at a frame level, so, currently changing the contents of something + in a different scope is currently not supported. + + :param SetVariableRequest request: + """ + # : :type arguments: SetVariableArguments + arguments = request.arguments + variables_reference = arguments.variablesReference + scope = None + if isinstance_checked(variables_reference, ScopeRequest): + scope = variables_reference + variables_reference = variables_reference.variable_reference + + fmt = arguments.format + if hasattr(fmt, "to_dict"): + fmt = fmt.to_dict() + + try: + variable = py_db.suspended_frames_manager.get_variable(variables_reference) + except KeyError: + variable = None + + if variable is None: + _write_variable_response( + py_db, request, value="", success=False, message="Unable to find variable container to change: %s." % (variables_reference,) + ) + return + + child_var = variable.change_variable(arguments.name, arguments.value, py_db, fmt=fmt) + + if child_var is None: + _write_variable_response(py_db, request, value="", success=False, message="Unable to change: %s." % (arguments.name,)) + return + + var_data = child_var.get_var_data(fmt=fmt) + body = SetVariableResponseBody( + value=var_data["value"], + type=var_data["type"], + variablesReference=var_data.get("variablesReference"), + namedVariables=var_data.get("namedVariables"), + indexedVariables=var_data.get("indexedVariables"), + ) + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + py_db.writer.add_command(NetCommand(CMD_RETURN, 0, variables_response, is_json=True)) + + +def _write_variable_response(py_db, request, value, success, message): + body = SetVariableResponseBody("") + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body, "success": False, "message": message}) + cmd = NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + py_db.writer.add_command(cmd) + + +@silence_warnings_decorator +def internal_get_frame(dbg, seq, thread_id, frame_id): + """Converts request into python variable""" + try: + frame = dbg.find_frame(thread_id, frame_id) + if frame is not None: + hidden_ns = pydevconsole.get_ipython_hidden_vars() + xml = "" + xml += pydevd_xml.frame_vars_to_xml(frame.f_locals, hidden_ns) + del frame + xml += "" + cmd = dbg.cmd_factory.make_get_frame_message(seq, xml) + dbg.writer.add_command(cmd) + else: + # pydevd_vars.dump_frames(thread_id) + # don't print this error: frame not found: means that the client is not synchronized (but that's ok) + cmd = dbg.cmd_factory.make_error_message(seq, "Frame not found: %s from thread: %s" % (frame_id, thread_id)) + dbg.writer.add_command(cmd) + except: + cmd = dbg.cmd_factory.make_error_message(seq, "Error resolving frame: %s from thread: %s" % (frame_id, thread_id)) + dbg.writer.add_command(cmd) + + +def internal_get_smart_step_into_variants(dbg, seq, thread_id, frame_id, start_line, end_line, set_additional_thread_info): + try: + thread = pydevd_find_thread_by_id(thread_id) + frame = dbg.find_frame(thread_id, frame_id) + + if thread is None or frame is None: + cmd = dbg.cmd_factory.make_error_message(seq, "Frame not found: %s from thread: %s" % (frame_id, thread_id)) + dbg.writer.add_command(cmd) + return + + if pydevd_bytecode_utils is None: + variants = [] + else: + variants = pydevd_bytecode_utils.calculate_smart_step_into_variants(frame, int(start_line), int(end_line)) + + info = set_additional_thread_info(thread) + + # Store the last request (may be used afterwards when stepping). + info.pydev_smart_step_into_variants = tuple(variants) + xml = "" + + for variant in variants: + if variant.children_variants: + for child_variant in variant.children_variants: + # If there are child variants, the current one is just an intermediary, so, + # just create variants for the child (notifying properly about the parent too). + xml += ( + '' + % ( + quote(child_variant.name), + str(child_variant.is_visited).lower(), + child_variant.line, + variant.offset, + child_variant.offset, + child_variant.call_order, + variant.endlineno, + variant.startcol, + variant.endcol, + ) + ) + else: + xml += ( + '' + % ( + quote(variant.name), + str(variant.is_visited).lower(), + variant.line, + variant.offset, + variant.call_order, + variant.endlineno, + variant.startcol, + variant.endcol, + ) + ) + + xml += "" + cmd = NetCommand(CMD_GET_SMART_STEP_INTO_VARIANTS, seq, xml) + dbg.writer.add_command(cmd) + except: + # Error is expected (if `dis` module cannot be used -- i.e.: Jython). + pydev_log.exception("Error calculating Smart Step Into Variants.") + cmd = dbg.cmd_factory.make_error_message( + seq, "Error getting smart step into variants for frame: %s from thread: %s" % (frame_id, thread_id) + ) + dbg.writer.add_command(cmd) + + +def internal_get_step_in_targets_json(dbg, seq, thread_id, frame_id, request, set_additional_thread_info): + try: + thread = pydevd_find_thread_by_id(thread_id) + frame = dbg.find_frame(thread_id, frame_id) + + if thread is None or frame is None: + body = StepInTargetsResponseBody([]) + variables_response = pydevd_base_schema.build_response( + request, kwargs={"body": body, "success": False, "message": "Thread to get step in targets seems to have resumed already."} + ) + cmd = NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + dbg.writer.add_command(cmd) + return + + start_line = 0 + end_line = 99999999 + if pydevd_bytecode_utils is None: + variants = [] + else: + variants = pydevd_bytecode_utils.calculate_smart_step_into_variants(frame, start_line, end_line) + + info = set_additional_thread_info(thread) + targets = [] + counter = itertools.count(0) + target_id_to_variant = {} + for variant in variants: + if not variant.is_visited: + if variant.children_variants: + for child_variant in variant.children_variants: + target_id = next(counter) + + if child_variant.call_order > 1: + targets.append( + StepInTarget( + id=target_id, + label="%s (call %s)" % (child_variant.name, child_variant.call_order), + ) + ) + else: + targets.append(StepInTarget(id=target_id, label=child_variant.name)) + target_id_to_variant[target_id] = child_variant + + if len(targets) >= 15: # Show at most 15 targets. + break + else: + target_id = next(counter) + if variant.call_order > 1: + targets.append( + StepInTarget( + id=target_id, + label="%s (call %s)" % (variant.name, variant.call_order), + ) + ) + else: + targets.append(StepInTarget(id=target_id, label=variant.name)) + target_id_to_variant[target_id] = variant + + if len(targets) >= 15: # Show at most 15 targets. + break + + # Store the last request (may be used afterwards when stepping). + info.pydev_smart_step_into_variants = tuple(variants) + info.target_id_to_smart_step_into_variant = target_id_to_variant + + body = StepInTargetsResponseBody(targets=targets) + response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + cmd = NetCommand(CMD_RETURN, 0, response, is_json=True) + dbg.writer.add_command(cmd) + except Exception as e: + # Error is expected (if `dis` module cannot be used -- i.e.: Jython). + pydev_log.exception("Error calculating Smart Step Into Variants.") + body = StepInTargetsResponseBody([]) + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body, "success": False, "message": str(e)}) + cmd = NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + dbg.writer.add_command(cmd) + + +def internal_get_next_statement_targets(dbg, seq, thread_id, frame_id): + """gets the valid line numbers for use with set next statement""" + try: + frame = dbg.find_frame(thread_id, frame_id) + if frame is not None: + code = frame.f_code + xml = "" + try: + linestarts = dis.findlinestarts(code) + except: + # i.e.: jython doesn't provide co_lnotab, so, we can only keep at the current line. + xml += "%d" % (frame.f_lineno,) + else: + for _, line in linestarts: + if line is not None: + xml += "%d" % (line,) + del frame + xml += "" + cmd = dbg.cmd_factory.make_get_next_statement_targets_message(seq, xml) + dbg.writer.add_command(cmd) + else: + cmd = dbg.cmd_factory.make_error_message(seq, "Frame not found: %s from thread: %s" % (frame_id, thread_id)) + dbg.writer.add_command(cmd) + except: + cmd = dbg.cmd_factory.make_error_message(seq, "Error resolving frame: %s from thread: %s" % (frame_id, thread_id)) + dbg.writer.add_command(cmd) + + +def _evaluate_response(py_db, request, result, error_message=""): + is_error = isinstance(result, ExceptionOnEvaluate) + if is_error: + result = result.result + if not error_message: + body = pydevd_schema.EvaluateResponseBody(result=result, variablesReference=0) + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + py_db.writer.add_command(NetCommand(CMD_RETURN, 0, variables_response, is_json=True)) + else: + body = pydevd_schema.EvaluateResponseBody(result=result, variablesReference=0) + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body, "success": False, "message": error_message}) + py_db.writer.add_command(NetCommand(CMD_RETURN, 0, variables_response, is_json=True)) + + +_global_frame = None + + +def internal_evaluate_expression_json(py_db, request, thread_id): + """ + :param EvaluateRequest request: + """ + global _global_frame + # : :type arguments: EvaluateArguments + + arguments = request.arguments + expression = arguments.expression + frame_id = arguments.frameId + context = arguments.context + fmt = arguments.format + if hasattr(fmt, "to_dict"): + fmt = fmt.to_dict() + + ctx = NULL + if context == "repl": + if not py_db.is_output_redirected: + ctx = pydevd_io.redirect_stream_to_pydb_io_messages_context() + else: + # If we're not in a repl (watch, hover, ...) don't show warnings. + ctx = filter_all_warnings() + + with ctx: + try_exec = False + if frame_id is None: + if _global_frame is None: + # Lazily create a frame to be used for evaluation with no frame id. + + def __create_frame(): + yield sys._getframe() + + _global_frame = next(__create_frame()) + + frame = _global_frame + try_exec = True # Always exec in this case + eval_result = None + else: + frame = py_db.find_frame(thread_id, frame_id) + + eval_result = pydevd_vars.evaluate_expression(py_db, frame, expression, is_exec=False) + is_error = isinstance_checked(eval_result, ExceptionOnEvaluate) + if is_error: + if context == "hover": # In a hover it doesn't make sense to do an exec. + _evaluate_response(py_db, request, result="", error_message="Exception occurred during evaluation.") + return + elif context == "watch": + # If it's a watch, don't show it as an exception object, rather, format + # it and show it as a string (with success=False). + msg = "%s: %s" % ( + eval_result.result.__class__.__name__, + eval_result.result, + ) + _evaluate_response(py_db, request, result=msg, error_message=msg) + return + else: + # We only try the exec if the failure we had was due to not being able + # to evaluate the expression. + try: + pydevd_vars.compile_as_eval(expression) + except Exception: + try_exec = context == "repl" + else: + try_exec = False + if context == "repl": + # In the repl we should show the exception to the user. + _evaluate_response_return_exception(py_db, request, eval_result.etype, eval_result.result, eval_result.tb) + return + + if try_exec: + try: + pydevd_vars.evaluate_expression(py_db, frame, expression, is_exec=True) + except (Exception, KeyboardInterrupt): + _evaluate_response_return_exception(py_db, request, *sys.exc_info()) + return + # No result on exec. + _evaluate_response(py_db, request, result="") + return + + # Ok, we have the result (could be an error), let's put it into the saved variables. + frame_tracker = py_db.suspended_frames_manager.get_frame_tracker(thread_id) + if frame_tracker is None: + # This is not really expected. + _evaluate_response(py_db, request, result="", error_message="Thread id: %s is not current thread id." % (thread_id,)) + return + + safe_repr_custom_attrs = {} + if context == "clipboard": + safe_repr_custom_attrs = dict( + maxstring_outer=2**64, + maxstring_inner=2**64, + maxother_outer=2**64, + maxother_inner=2**64, + ) + + if context == "repl" and eval_result is None: + # We don't want "None" to appear when typing in the repl. + body = pydevd_schema.EvaluateResponseBody( + result="", + variablesReference=0, + ) + + else: + variable = frame_tracker.obtain_as_variable(expression, eval_result, frame=frame) + var_data = variable.get_var_data(fmt=fmt, context=context, **safe_repr_custom_attrs) + + body = pydevd_schema.EvaluateResponseBody( + result=var_data["value"], + variablesReference=var_data.get("variablesReference", 0), + type=var_data.get("type"), + presentationHint=var_data.get("presentationHint"), + namedVariables=var_data.get("namedVariables"), + indexedVariables=var_data.get("indexedVariables"), + ) + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + py_db.writer.add_command(NetCommand(CMD_RETURN, 0, variables_response, is_json=True)) + + +def _evaluate_response_return_exception(py_db, request, exc_type, exc, initial_tb): + try: + tb = initial_tb + + # Show the traceback without pydevd frames. + temp_tb = tb + while temp_tb: + if py_db.get_file_type(temp_tb.tb_frame) == PYDEV_FILE: + tb = temp_tb.tb_next + temp_tb = temp_tb.tb_next + + if tb is None: + tb = initial_tb + err = "".join(traceback.format_exception(exc_type, exc, tb)) + + # Make sure we don't keep references to them. + exc = None + exc_type = None + tb = None + temp_tb = None + initial_tb = None + except: + err = "" + pydev_log.exception(err) + + # Currently there is an issue in VSC where returning success=false for an + # eval request, in repl context, VSC does not show the error response in + # the debug console. So return the error message in result as well. + _evaluate_response(py_db, request, result=err, error_message=err) + + +@silence_warnings_decorator +def internal_evaluate_expression(dbg, seq, thread_id, frame_id, expression, is_exec, trim_if_too_big, attr_to_set_result): + """gets the value of a variable""" + try: + frame = dbg.find_frame(thread_id, frame_id) + if frame is not None: + result = pydevd_vars.evaluate_expression(dbg, frame, expression, is_exec) + if attr_to_set_result != "": + pydevd_vars.change_attr_expression(frame, attr_to_set_result, expression, dbg, result) + else: + result = None + + xml = "" + xml += pydevd_xml.var_to_xml(result, expression, trim_if_too_big) + xml += "" + cmd = dbg.cmd_factory.make_evaluate_expression_message(seq, xml) + dbg.writer.add_command(cmd) + except: + exc = get_exception_traceback_str() + cmd = dbg.cmd_factory.make_error_message(seq, "Error evaluating expression " + exc) + dbg.writer.add_command(cmd) + + +def _set_expression_response(py_db, request, error_message): + body = pydevd_schema.SetExpressionResponseBody(value="") + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body, "success": False, "message": error_message}) + py_db.writer.add_command(NetCommand(CMD_RETURN, 0, variables_response, is_json=True)) + + +def internal_set_expression_json(py_db, request, thread_id): + # : :type arguments: SetExpressionArguments + + arguments = request.arguments + expression = arguments.expression + frame_id = arguments.frameId + value = arguments.value + fmt = arguments.format + if hasattr(fmt, "to_dict"): + fmt = fmt.to_dict() + + frame = py_db.find_frame(thread_id, frame_id) + exec_code = "%s = (%s)" % (expression, value) + try: + pydevd_vars.evaluate_expression(py_db, frame, exec_code, is_exec=True) + except (Exception, KeyboardInterrupt): + _set_expression_response(py_db, request, error_message="Error executing: %s" % (exec_code,)) + return + + # Ok, we have the result (could be an error), let's put it into the saved variables. + frame_tracker = py_db.suspended_frames_manager.get_frame_tracker(thread_id) + if frame_tracker is None: + # This is not really expected. + _set_expression_response(py_db, request, error_message="Thread id: %s is not current thread id." % (thread_id,)) + return + + # Now that the exec is done, get the actual value changed to return. + result = pydevd_vars.evaluate_expression(py_db, frame, expression, is_exec=False) + variable = frame_tracker.obtain_as_variable(expression, result, frame=frame) + var_data = variable.get_var_data(fmt=fmt) + + body = pydevd_schema.SetExpressionResponseBody( + value=var_data["value"], + variablesReference=var_data.get("variablesReference", 0), + type=var_data.get("type"), + presentationHint=var_data.get("presentationHint"), + namedVariables=var_data.get("namedVariables"), + indexedVariables=var_data.get("indexedVariables"), + ) + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + py_db.writer.add_command(NetCommand(CMD_RETURN, 0, variables_response, is_json=True)) + + +def internal_get_completions(dbg, seq, thread_id, frame_id, act_tok, line=-1, column=-1): + """ + Note that if the column is >= 0, the act_tok is considered text and the actual + activation token/qualifier is computed in this command. + """ + try: + remove_path = None + try: + qualifier = "" + if column >= 0: + token_and_qualifier = extract_token_and_qualifier(act_tok, line, column) + act_tok = token_and_qualifier[0] + if act_tok: + act_tok += "." + qualifier = token_and_qualifier[1] + + frame = dbg.find_frame(thread_id, frame_id) + if frame is not None: + completions = _pydev_completer.generate_completions(frame, act_tok) + + # Note that qualifier and start are only actually valid for the + # Debug Adapter Protocol (for the line-based protocol, the IDE + # is required to filter the completions returned). + cmd = dbg.cmd_factory.make_get_completions_message(seq, completions, qualifier, start=column - len(qualifier)) + dbg.writer.add_command(cmd) + else: + cmd = dbg.cmd_factory.make_error_message( + seq, "internal_get_completions: Frame not found: %s from thread: %s" % (frame_id, thread_id) + ) + dbg.writer.add_command(cmd) + + finally: + if remove_path is not None: + sys.path.remove(remove_path) + + except: + exc = get_exception_traceback_str() + sys.stderr.write("%s\n" % (exc,)) + cmd = dbg.cmd_factory.make_error_message(seq, "Error evaluating expression " + exc) + dbg.writer.add_command(cmd) + + +def internal_get_description(dbg, seq, thread_id, frame_id, expression): + """Fetch the variable description stub from the debug console""" + try: + frame = dbg.find_frame(thread_id, frame_id) + description = pydevd_console.get_description(frame, thread_id, frame_id, expression) + description = pydevd_xml.make_valid_xml_value(quote(description, "/>_= \t")) + description_xml = '' % description + cmd = dbg.cmd_factory.make_get_description_message(seq, description_xml) + dbg.writer.add_command(cmd) + except: + exc = get_exception_traceback_str() + cmd = dbg.cmd_factory.make_error_message(seq, "Error in fetching description" + exc) + dbg.writer.add_command(cmd) + + +def build_exception_info_response(dbg, thread_id, thread, request_seq, set_additional_thread_info, iter_visible_frames_info, max_frames): + """ + :return ExceptionInfoResponse + """ + additional_info = set_additional_thread_info(thread) + topmost_frame = additional_info.get_topmost_frame(thread) + + current_paused_frame_name = "" + + source_path = "" # This is an extra bit of data used by Visual Studio + stack_str_lst = [] + name = None + description = None + + if topmost_frame is not None: + try: + try: + frames_list = dbg.suspended_frames_manager.get_frames_list(thread_id) + while frames_list is not None and len(frames_list): + frames = [] + + frame = None + + if not name: + exc_type = frames_list.exc_type + if exc_type is not None: + try: + name = exc_type.__qualname__ + except: + try: + name = exc_type.__name__ + except: + try: + name = str(exc_type) + except: + pass + + if not description: + exc_desc = frames_list.exc_desc + if exc_desc is not None: + try: + description = str(exc_desc) + except: + pass + + for ( + frame_id, + frame, + method_name, + original_filename, + filename_in_utf8, + lineno, + _applied_mapping, + show_as_current_frame, + line_col_info, + ) in iter_visible_frames_info(dbg, frames_list): + line_text = linecache.getline(original_filename, lineno) + + # Never filter out plugin frames! + if not getattr(frame, "IS_PLUGIN_FRAME", False): + if dbg.is_files_filter_enabled and dbg.apply_files_filter(frame, original_filename, False): + continue + + if show_as_current_frame: + current_paused_frame_name = method_name + method_name += " (Current frame)" + frames.append((filename_in_utf8, lineno, method_name, line_text, line_col_info)) + + if not source_path and frames: + source_path = frames[0][0] + + if IS_PY311_OR_GREATER: + stack_summary = traceback.StackSummary() + for filename_in_utf8, lineno, method_name, line_text, line_col_info in frames[-max_frames:]: + frame_summary = traceback.FrameSummary(filename_in_utf8, lineno, method_name, line=line_text) + if line_col_info is not None: + frame_summary.end_lineno = line_col_info.end_lineno + frame_summary.colno = line_col_info.colno + frame_summary.end_colno = line_col_info.end_colno + stack_summary.append(frame_summary) + + stack_str = "".join(stack_summary.format()) + + else: + # Note: remove col info (just used in 3.11). + stack_str = "".join(traceback.format_list((x[:-1] for x in frames[-max_frames:]))) + + try: + stype = frames_list.exc_type.__qualname__ + smod = frames_list.exc_type.__module__ + if smod not in ("__main__", "builtins"): + if not isinstance(smod, str): + smod = "" + stype = smod + "." + stype + except Exception: + stype = "" + pydev_log.exception("Error getting exception type.") + + stack_str += "%s: %s\n" % (stype, frames_list.exc_desc) + stack_str += frames_list.exc_context_msg + stack_str_lst.append(stack_str) + + frames_list = frames_list.chained_frames_list + if frames_list is None or not frames_list: + break + + except: + pydev_log.exception("Error on build_exception_info_response.") + finally: + topmost_frame = None + full_stack_str = "".join(reversed(stack_str_lst)) + + if not name: + name = "exception: type unknown" + if not description: + description = "exception: no description" + + if current_paused_frame_name: + name += " (note: full exception trace is shown but execution is paused at: %s)" % (current_paused_frame_name,) + + if thread.stop_reason == CMD_STEP_CAUGHT_EXCEPTION: + break_mode = pydevd_schema.ExceptionBreakMode.ALWAYS + else: + break_mode = pydevd_schema.ExceptionBreakMode.UNHANDLED + + response = pydevd_schema.ExceptionInfoResponse( + request_seq=request_seq, + success=True, + command="exceptionInfo", + body=pydevd_schema.ExceptionInfoResponseBody( + exceptionId=name, + description=description, + breakMode=break_mode, + details=pydevd_schema.ExceptionDetails( + message=description, + typeName=name, + stackTrace=full_stack_str, + source=source_path, + # Note: ExceptionDetails actually accepts an 'innerException', but + # when passing it, VSCode is not showing the stack trace at all. + ), + ), + ) + return response + + +def internal_get_exception_details_json( + dbg, request, thread_id, thread, max_frames, set_additional_thread_info=None, iter_visible_frames_info=None +): + """Fetch exception details""" + try: + response = build_exception_info_response( + dbg, thread_id, thread, request.seq, set_additional_thread_info, iter_visible_frames_info, max_frames + ) + except: + exc = get_exception_traceback_str() + response = pydevd_base_schema.build_response(request, kwargs={"success": False, "message": exc, "body": {}}) + dbg.writer.add_command(NetCommand(CMD_RETURN, 0, response, is_json=True)) + + +class InternalGetBreakpointException(InternalThreadCommand): + """Send details of exception raised while evaluating conditional breakpoint""" + + def __init__(self, thread_id, exc_type, stacktrace): + self.sequence = 0 + self.thread_id = thread_id + self.stacktrace = stacktrace + self.exc_type = exc_type + + def do_it(self, dbg): + try: + callstack = "" + + makeValid = pydevd_xml.make_valid_xml_value + + for filename, line, methodname, methodobj in self.stacktrace: + if not filesystem_encoding_is_utf8 and hasattr(filename, "decode"): + # filename is a byte string encoded using the file system encoding + # convert it to utf8 + filename = filename.decode(file_system_encoding).encode("utf-8") + + callstack += '' % ( + self.thread_id, + makeValid(filename), + line, + makeValid(methodname), + makeValid(methodobj), + ) + callstack += "" + + cmd = dbg.cmd_factory.make_send_breakpoint_exception_message(self.sequence, self.exc_type + "\t" + callstack) + dbg.writer.add_command(cmd) + except: + exc = get_exception_traceback_str() + sys.stderr.write("%s\n" % (exc,)) + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error Sending Exception: " + exc) + dbg.writer.add_command(cmd) + + +class InternalSendCurrExceptionTrace(InternalThreadCommand): + """Send details of the exception that was caught and where we've broken in.""" + + def __init__(self, thread_id, arg, curr_frame_id): + """ + :param arg: exception type, description, traceback object + """ + self.sequence = 0 + self.thread_id = thread_id + self.curr_frame_id = curr_frame_id + self.arg = arg + + def do_it(self, dbg): + try: + cmd = dbg.cmd_factory.make_send_curr_exception_trace_message(dbg, self.sequence, self.thread_id, self.curr_frame_id, *self.arg) + del self.arg + dbg.writer.add_command(cmd) + except: + exc = get_exception_traceback_str() + sys.stderr.write("%s\n" % (exc,)) + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error Sending Current Exception Trace: " + exc) + dbg.writer.add_command(cmd) + + +class InternalSendCurrExceptionTraceProceeded(InternalThreadCommand): + """Send details of the exception that was caught and where we've broken in.""" + + def __init__(self, thread_id): + self.sequence = 0 + self.thread_id = thread_id + + def do_it(self, dbg): + try: + cmd = dbg.cmd_factory.make_send_curr_exception_trace_proceeded_message(self.sequence, self.thread_id) + dbg.writer.add_command(cmd) + except: + exc = get_exception_traceback_str() + sys.stderr.write("%s\n" % (exc,)) + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error Sending Current Exception Trace Proceeded: " + exc) + dbg.writer.add_command(cmd) + + +class InternalEvaluateConsoleExpression(InternalThreadCommand): + """Execute the given command in the debug console""" + + def __init__(self, seq, thread_id, frame_id, line, buffer_output=True): + self.sequence = seq + self.thread_id = thread_id + self.frame_id = frame_id + self.line = line + self.buffer_output = buffer_output + + def do_it(self, dbg): + """Create an XML for console output, error and more (true/false) + + + + true/false + + """ + try: + frame = dbg.find_frame(self.thread_id, self.frame_id) + if frame is not None: + console_message = pydevd_console.execute_console_command( + frame, self.thread_id, self.frame_id, self.line, self.buffer_output + ) + + cmd = dbg.cmd_factory.make_send_console_message(self.sequence, console_message.to_xml()) + else: + from _pydevd_bundle.pydevd_console import ConsoleMessage + + console_message = ConsoleMessage() + console_message.add_console_message( + pydevd_console.CONSOLE_ERROR, + "Select the valid frame in the debug view (thread: %s, frame: %s invalid)" % (self.thread_id, self.frame_id), + ) + cmd = dbg.cmd_factory.make_error_message(self.sequence, console_message.to_xml()) + except: + exc = get_exception_traceback_str() + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error evaluating expression " + exc) + dbg.writer.add_command(cmd) + + +class InternalRunCustomOperation(InternalThreadCommand): + """Run a custom command on an expression""" + + def __init__(self, seq, thread_id, frame_id, scope, attrs, style, encoded_code_or_file, fnname): + self.sequence = seq + self.thread_id = thread_id + self.frame_id = frame_id + self.scope = scope + self.attrs = attrs + self.style = style + self.code_or_file = unquote_plus(encoded_code_or_file) + self.fnname = fnname + + def do_it(self, dbg): + try: + res = pydevd_vars.custom_operation( + dbg, self.thread_id, self.frame_id, self.scope, self.attrs, self.style, self.code_or_file, self.fnname + ) + resEncoded = quote_plus(res) + cmd = dbg.cmd_factory.make_custom_operation_message(self.sequence, resEncoded) + dbg.writer.add_command(cmd) + except: + exc = get_exception_traceback_str() + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error in running custom operation" + exc) + dbg.writer.add_command(cmd) + + +class InternalConsoleGetCompletions(InternalThreadCommand): + """Fetch the completions in the debug console""" + + def __init__(self, seq, thread_id, frame_id, act_tok): + self.sequence = seq + self.thread_id = thread_id + self.frame_id = frame_id + self.act_tok = act_tok + + def do_it(self, dbg): + """Get completions and write back to the client""" + try: + frame = dbg.find_frame(self.thread_id, self.frame_id) + completions_xml = pydevd_console.get_completions(frame, self.act_tok) + cmd = dbg.cmd_factory.make_send_console_message(self.sequence, completions_xml) + dbg.writer.add_command(cmd) + except: + exc = get_exception_traceback_str() + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error in fetching completions" + exc) + dbg.writer.add_command(cmd) + + +class InternalConsoleExec(InternalThreadCommand): + """gets the value of a variable""" + + def __init__(self, seq, thread_id, frame_id, expression): + self.sequence = seq + self.thread_id = thread_id + self.frame_id = frame_id + self.expression = expression + + def init_matplotlib_in_debug_console(self, py_db): + # import hook and patches for matplotlib support in debug console + from _pydev_bundle.pydev_import_hook import import_hook_manager + + if is_current_thread_main_thread(): + for module in list(py_db.mpl_modules_for_patching): + import_hook_manager.add_module_name(module, py_db.mpl_modules_for_patching.pop(module)) + + def do_it(self, py_db): + if not py_db.mpl_hooks_in_debug_console and not py_db.gui_in_use: + # add import hooks for matplotlib patches if only debug console was started + try: + self.init_matplotlib_in_debug_console(py_db) + py_db.gui_in_use = True + except: + pydev_log.debug("Matplotlib support in debug console failed", traceback.format_exc()) + py_db.mpl_hooks_in_debug_console = True + + try: + try: + # Don't trace new threads created by console command. + disable_trace_thread_modules() + + result = pydevconsole.console_exec(self.thread_id, self.frame_id, self.expression, py_db) + xml = "" + xml += pydevd_xml.var_to_xml(result, "") + xml += "" + cmd = py_db.cmd_factory.make_evaluate_expression_message(self.sequence, xml) + py_db.writer.add_command(cmd) + except: + exc = get_exception_traceback_str() + sys.stderr.write("%s\n" % (exc,)) + cmd = py_db.cmd_factory.make_error_message(self.sequence, "Error evaluating console expression " + exc) + py_db.writer.add_command(cmd) + finally: + enable_trace_thread_modules() + + sys.stderr.flush() + sys.stdout.flush() + + +class InternalLoadFullValue(InternalThreadCommand): + """ + Loads values asynchronously + """ + + def __init__(self, seq, thread_id, frame_id, vars): + self.sequence = seq + self.thread_id = thread_id + self.frame_id = frame_id + self.vars = vars + + @silence_warnings_decorator + def do_it(self, dbg): + """Starts a thread that will load values asynchronously""" + try: + var_objects = [] + for variable in self.vars: + variable = variable.strip() + if len(variable) > 0: + if "\t" in variable: # there are attributes beyond scope + scope, attrs = variable.split("\t", 1) + name = attrs[0] + else: + scope, attrs = (variable, None) + name = scope + var_obj = pydevd_vars.getVariable(dbg, self.thread_id, self.frame_id, scope, attrs) + var_objects.append((var_obj, name)) + + t = GetValueAsyncThreadDebug(dbg, dbg, self.sequence, var_objects) + t.start() + except: + exc = get_exception_traceback_str() + sys.stderr.write("%s\n" % (exc,)) + cmd = dbg.cmd_factory.make_error_message(self.sequence, "Error evaluating variable %s " % exc) + dbg.writer.add_command(cmd) + + +class AbstractGetValueAsyncThread(PyDBDaemonThread): + """ + Abstract class for a thread, which evaluates values for async variables + """ + + def __init__(self, py_db, frame_accessor, seq, var_objects): + PyDBDaemonThread.__init__(self, py_db) + self.frame_accessor = frame_accessor + self.seq = seq + self.var_objs = var_objects + self.cancel_event = ThreadingEvent() + + def send_result(self, xml): + raise NotImplementedError() + + @overrides(PyDBDaemonThread._on_run) + def _on_run(self): + start = time.time() + xml = StringIO() + xml.write("") + for var_obj, name in self.var_objs: + current_time = time.time() + if current_time - start > ASYNC_EVAL_TIMEOUT_SEC or self.cancel_event.is_set(): + break + xml.write(pydevd_xml.var_to_xml(var_obj, name, evaluate_full_value=True)) + xml.write("") + self.send_result(xml) + xml.close() + + +class GetValueAsyncThreadDebug(AbstractGetValueAsyncThread): + """ + A thread for evaluation async values, which returns result for debugger + Create message and send it via writer thread + """ + + def send_result(self, xml): + if self.frame_accessor is not None: + cmd = self.frame_accessor.cmd_factory.make_load_full_value_message(self.seq, xml.getvalue()) + self.frame_accessor.writer.add_command(cmd) + + +class GetValueAsyncThreadConsole(AbstractGetValueAsyncThread): + """ + A thread for evaluation async values, which returns result for Console + Send result directly to Console's server + """ + + def send_result(self, xml): + if self.frame_accessor is not None: + self.frame_accessor.ReturnFullValue(self.seq, xml.getvalue()) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm_constants.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm_constants.py new file mode 100644 index 0000000..7de3d8e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm_constants.py @@ -0,0 +1,200 @@ +CMD_RUN = 101 +CMD_LIST_THREADS = 102 +CMD_THREAD_CREATE = 103 +CMD_THREAD_KILL = 104 +CMD_THREAD_SUSPEND = 105 +CMD_THREAD_RUN = 106 +CMD_STEP_INTO = 107 +CMD_STEP_OVER = 108 +CMD_STEP_RETURN = 109 +CMD_GET_VARIABLE = 110 +CMD_SET_BREAK = 111 +CMD_REMOVE_BREAK = 112 +CMD_EVALUATE_EXPRESSION = 113 +CMD_GET_FRAME = 114 +CMD_EXEC_EXPRESSION = 115 +CMD_WRITE_TO_CONSOLE = 116 +CMD_CHANGE_VARIABLE = 117 +CMD_RUN_TO_LINE = 118 +CMD_RELOAD_CODE = 119 +CMD_GET_COMPLETIONS = 120 + +# Note: renumbered (conflicted on merge) +CMD_CONSOLE_EXEC = 121 +CMD_ADD_EXCEPTION_BREAK = 122 +CMD_REMOVE_EXCEPTION_BREAK = 123 +CMD_LOAD_SOURCE = 124 +CMD_ADD_DJANGO_EXCEPTION_BREAK = 125 +CMD_REMOVE_DJANGO_EXCEPTION_BREAK = 126 +CMD_SET_NEXT_STATEMENT = 127 +CMD_SMART_STEP_INTO = 128 +CMD_EXIT = 129 +CMD_SIGNATURE_CALL_TRACE = 130 + +CMD_SET_PY_EXCEPTION = 131 +CMD_GET_FILE_CONTENTS = 132 +CMD_SET_PROPERTY_TRACE = 133 +# Pydev debug console commands +CMD_EVALUATE_CONSOLE_EXPRESSION = 134 +CMD_RUN_CUSTOM_OPERATION = 135 +CMD_GET_BREAKPOINT_EXCEPTION = 136 +CMD_STEP_CAUGHT_EXCEPTION = 137 +CMD_SEND_CURR_EXCEPTION_TRACE = 138 +CMD_SEND_CURR_EXCEPTION_TRACE_PROCEEDED = 139 +CMD_IGNORE_THROWN_EXCEPTION_AT = 140 +CMD_ENABLE_DONT_TRACE = 141 +CMD_SHOW_CONSOLE = 142 + +CMD_GET_ARRAY = 143 +CMD_STEP_INTO_MY_CODE = 144 +CMD_GET_CONCURRENCY_EVENT = 145 +CMD_SHOW_RETURN_VALUES = 146 +CMD_INPUT_REQUESTED = 147 +CMD_GET_DESCRIPTION = 148 + +CMD_PROCESS_CREATED = 149 +CMD_SHOW_CYTHON_WARNING = 150 +CMD_LOAD_FULL_VALUE = 151 + +CMD_GET_THREAD_STACK = 152 + +# This is mostly for unit-tests to diagnose errors on ci. +CMD_THREAD_DUMP_TO_STDERR = 153 + +# Sent from the client to signal that we should stop when we start executing user code. +CMD_STOP_ON_START = 154 + +# When the debugger is stopped in an exception, this command will provide the details of the current exception (in the current thread). +CMD_GET_EXCEPTION_DETAILS = 155 + +# Allows configuring pydevd settings (can be called multiple times and only keys +# available in the json will be configured -- keys not passed will not change the +# previous configuration). +CMD_PYDEVD_JSON_CONFIG = 156 + +CMD_THREAD_SUSPEND_SINGLE_NOTIFICATION = 157 +CMD_THREAD_RESUME_SINGLE_NOTIFICATION = 158 + +CMD_STEP_OVER_MY_CODE = 159 +CMD_STEP_RETURN_MY_CODE = 160 + +CMD_SET_PY_EXCEPTION_JSON = 161 +CMD_SET_PATH_MAPPING_JSON = 162 + +CMD_GET_SMART_STEP_INTO_VARIANTS = 163 # XXX: PyCharm has 160 for this (we're currently incompatible anyways). + +CMD_REDIRECT_OUTPUT = 200 +CMD_GET_NEXT_STATEMENT_TARGETS = 201 +CMD_SET_PROJECT_ROOTS = 202 + +CMD_MODULE_EVENT = 203 +CMD_PROCESS_EVENT = 204 + +CMD_AUTHENTICATE = 205 + +CMD_STEP_INTO_COROUTINE = 206 + +CMD_LOAD_SOURCE_FROM_FRAME_ID = 207 + +CMD_SET_FUNCTION_BREAK = 208 + +CMD_VERSION = 501 +CMD_RETURN = 502 +CMD_SET_PROTOCOL = 503 +CMD_ERROR = 901 + +# this number can be changed if there's need to do so +# if the io is too big, we'll not send all (could make the debugger too non-responsive) +MAX_IO_MSG_SIZE = 10000 + +VERSION_STRING = "@@BUILD_NUMBER@@" + +from _pydev_bundle._pydev_filesystem_encoding import getfilesystemencoding + +file_system_encoding = getfilesystemencoding() +filesystem_encoding_is_utf8 = file_system_encoding.lower() in ("utf-8", "utf_8", "utf8") + +ID_TO_MEANING = { + "101": "CMD_RUN", + "102": "CMD_LIST_THREADS", + "103": "CMD_THREAD_CREATE", + "104": "CMD_THREAD_KILL", + "105": "CMD_THREAD_SUSPEND", + "106": "CMD_THREAD_RUN", + "107": "CMD_STEP_INTO", + "108": "CMD_STEP_OVER", + "109": "CMD_STEP_RETURN", + "110": "CMD_GET_VARIABLE", + "111": "CMD_SET_BREAK", + "112": "CMD_REMOVE_BREAK", + "113": "CMD_EVALUATE_EXPRESSION", + "114": "CMD_GET_FRAME", + "115": "CMD_EXEC_EXPRESSION", + "116": "CMD_WRITE_TO_CONSOLE", + "117": "CMD_CHANGE_VARIABLE", + "118": "CMD_RUN_TO_LINE", + "119": "CMD_RELOAD_CODE", + "120": "CMD_GET_COMPLETIONS", + "121": "CMD_CONSOLE_EXEC", + "122": "CMD_ADD_EXCEPTION_BREAK", + "123": "CMD_REMOVE_EXCEPTION_BREAK", + "124": "CMD_LOAD_SOURCE", + "125": "CMD_ADD_DJANGO_EXCEPTION_BREAK", + "126": "CMD_REMOVE_DJANGO_EXCEPTION_BREAK", + "127": "CMD_SET_NEXT_STATEMENT", + "128": "CMD_SMART_STEP_INTO", + "129": "CMD_EXIT", + "130": "CMD_SIGNATURE_CALL_TRACE", + "131": "CMD_SET_PY_EXCEPTION", + "132": "CMD_GET_FILE_CONTENTS", + "133": "CMD_SET_PROPERTY_TRACE", + "134": "CMD_EVALUATE_CONSOLE_EXPRESSION", + "135": "CMD_RUN_CUSTOM_OPERATION", + "136": "CMD_GET_BREAKPOINT_EXCEPTION", + "137": "CMD_STEP_CAUGHT_EXCEPTION", + "138": "CMD_SEND_CURR_EXCEPTION_TRACE", + "139": "CMD_SEND_CURR_EXCEPTION_TRACE_PROCEEDED", + "140": "CMD_IGNORE_THROWN_EXCEPTION_AT", + "141": "CMD_ENABLE_DONT_TRACE", + "142": "CMD_SHOW_CONSOLE", + "143": "CMD_GET_ARRAY", + "144": "CMD_STEP_INTO_MY_CODE", + "145": "CMD_GET_CONCURRENCY_EVENT", + "146": "CMD_SHOW_RETURN_VALUES", + "147": "CMD_INPUT_REQUESTED", + "148": "CMD_GET_DESCRIPTION", + "149": "CMD_PROCESS_CREATED", # Note: this is actually a notification of a sub-process created. + "150": "CMD_SHOW_CYTHON_WARNING", + "151": "CMD_LOAD_FULL_VALUE", + "152": "CMD_GET_THREAD_STACK", + "153": "CMD_THREAD_DUMP_TO_STDERR", + "154": "CMD_STOP_ON_START", + "155": "CMD_GET_EXCEPTION_DETAILS", + "156": "CMD_PYDEVD_JSON_CONFIG", + "157": "CMD_THREAD_SUSPEND_SINGLE_NOTIFICATION", + "158": "CMD_THREAD_RESUME_SINGLE_NOTIFICATION", + "159": "CMD_STEP_OVER_MY_CODE", + "160": "CMD_STEP_RETURN_MY_CODE", + "161": "CMD_SET_PY_EXCEPTION_JSON", + "162": "CMD_SET_PATH_MAPPING_JSON", + "163": "CMD_GET_SMART_STEP_INTO_VARIANTS", + "200": "CMD_REDIRECT_OUTPUT", + "201": "CMD_GET_NEXT_STATEMENT_TARGETS", + "202": "CMD_SET_PROJECT_ROOTS", + "203": "CMD_MODULE_EVENT", + "204": "CMD_PROCESS_EVENT", # DAP process event. + "205": "CMD_AUTHENTICATE", + "206": "CMD_STEP_INTO_COROUTINE", + "207": "CMD_LOAD_SOURCE_FROM_FRAME_ID", + "501": "CMD_VERSION", + "502": "CMD_RETURN", + "503": "CMD_SET_PROTOCOL", + "901": "CMD_ERROR", +} + + +def constant_to_str(constant): + s = ID_TO_MEANING.get(str(constant)) + if not s: + s = "" % (constant,) + return s diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_command_line_handling.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_command_line_handling.py new file mode 100644 index 0000000..8fb3e03 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_command_line_handling.py @@ -0,0 +1,181 @@ +import os +import sys + + +class ArgHandlerWithParam: + """ + Handler for some arguments which needs a value + """ + + def __init__(self, arg_name, convert_val=None, default_val=None): + self.arg_name = arg_name + self.arg_v_rep = "--%s" % (arg_name,) + self.convert_val = convert_val + self.default_val = default_val + + def to_argv(self, lst, setup): + v = setup.get(self.arg_name) + if v is not None and v != self.default_val: + lst.append(self.arg_v_rep) + lst.append("%s" % (v,)) + + def handle_argv(self, argv, i, setup): + assert argv[i] == self.arg_v_rep + del argv[i] + + val = argv[i] + if self.convert_val: + val = self.convert_val(val) + + setup[self.arg_name] = val + del argv[i] + + +class ArgHandlerBool: + """ + If a given flag is received, mark it as 'True' in setup. + """ + + def __init__(self, arg_name, default_val=False): + self.arg_name = arg_name + self.arg_v_rep = "--%s" % (arg_name,) + self.default_val = default_val + + def to_argv(self, lst, setup): + v = setup.get(self.arg_name) + if v: + lst.append(self.arg_v_rep) + + def handle_argv(self, argv, i, setup): + assert argv[i] == self.arg_v_rep + del argv[i] + setup[self.arg_name] = True + + +def convert_ppid(ppid): + ret = int(ppid) + if ret != 0: + if ret == os.getpid(): + raise AssertionError("ppid passed is the same as the current process pid (%s)!" % (ret,)) + return ret + + +ACCEPTED_ARG_HANDLERS = [ + ArgHandlerWithParam("port", int, 0), + ArgHandlerWithParam("ppid", convert_ppid, 0), + ArgHandlerWithParam("vm_type"), + ArgHandlerWithParam("client"), + ArgHandlerWithParam("access-token"), + ArgHandlerWithParam("client-access-token"), + ArgHandlerWithParam("debug-mode"), + ArgHandlerWithParam("preimport"), + # Logging + ArgHandlerWithParam("log-file"), + ArgHandlerWithParam("log-level", int, None), + ArgHandlerBool("server"), + ArgHandlerBool("multiproc"), # Used by PyCharm (reuses connection: ssh tunneling) + ArgHandlerBool("multiprocess"), # Used by PyDev (creates new connection to ide) + ArgHandlerBool("save-signatures"), + ArgHandlerBool("save-threading"), + ArgHandlerBool("save-asyncio"), + ArgHandlerBool("print-in-debugger-startup"), + ArgHandlerBool("cmd-line"), + ArgHandlerBool("module"), + ArgHandlerBool("skip-notify-stdin"), + # The ones below should've been just one setting to specify the protocol, but for compatibility + # reasons they're passed as a flag but are mutually exclusive. + ArgHandlerBool("json-dap"), # Protocol used by ptvsd to communicate with pydevd (a single json message in each read) + ArgHandlerBool("json-dap-http"), # Actual DAP (json messages over http protocol). + ArgHandlerBool("protocol-quoted-line"), # Custom protocol with quoted lines. + ArgHandlerBool("protocol-http"), # Custom protocol with http. +] + +ARGV_REP_TO_HANDLER = {} +for handler in ACCEPTED_ARG_HANDLERS: + ARGV_REP_TO_HANDLER[handler.arg_v_rep] = handler + + +def get_pydevd_file(): + import pydevd + + f = pydevd.__file__ + if f.endswith(".pyc"): + f = f[:-1] + elif f.endswith("$py.class"): + f = f[: -len("$py.class")] + ".py" + return f + + +def setup_to_argv(setup, skip_names=None): + """ + :param dict setup: + A dict previously gotten from process_command_line. + + :param set skip_names: + The names in the setup which shouldn't be converted to argv. + + :note: does not handle --file nor --DEBUG. + """ + if skip_names is None: + skip_names = set() + ret = [get_pydevd_file()] + + for handler in ACCEPTED_ARG_HANDLERS: + if handler.arg_name in setup and handler.arg_name not in skip_names: + handler.to_argv(ret, setup) + return ret + + +def process_command_line(argv): + """parses the arguments. + removes our arguments from the command line""" + setup = {} + for handler in ACCEPTED_ARG_HANDLERS: + setup[handler.arg_name] = handler.default_val + setup["file"] = "" + setup["qt-support"] = "" + + initial_argv = tuple(argv) + + i = 0 + del argv[0] + while i < len(argv): + handler = ARGV_REP_TO_HANDLER.get(argv[i]) + if handler is not None: + handler.handle_argv(argv, i, setup) + + elif argv[i].startswith("--qt-support"): + # The --qt-support is special because we want to keep backward compatibility: + # Previously, just passing '--qt-support' meant that we should use the auto-discovery mode + # whereas now, if --qt-support is passed, it should be passed as --qt-support=, where + # mode can be one of 'auto', 'none', 'pyqt5', 'pyqt4', 'pyside', 'pyside2'. + if argv[i] == "--qt-support": + setup["qt-support"] = "auto" + + elif argv[i].startswith("--qt-support="): + qt_support = argv[i][len("--qt-support=") :] + valid_modes = ("none", "auto", "pyqt5", "pyqt4", "pyside", "pyside2") + if qt_support not in valid_modes: + raise ValueError("qt-support mode invalid: " + qt_support) + if qt_support == "none": + # On none, actually set an empty string to evaluate to False. + setup["qt-support"] = "" + else: + setup["qt-support"] = qt_support + else: + raise ValueError("Unexpected definition for qt-support flag: " + argv[i]) + + del argv[i] + + elif argv[i] == "--file": + # --file is special because it's the last one (so, no handler for it). + del argv[i] + setup["file"] = argv[i] + i = len(argv) # pop out, file is our last argument + + elif argv[i] == "--DEBUG": + sys.stderr.write("pydevd: --DEBUG parameter deprecated. Use `--debug-level=3` instead.\n") + + else: + raise ValueError("Unexpected option: %s when processing: %s" % (argv[i], initial_argv)) + return setup diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44e7f509a71a5fd362d58b700e893c14bac0c781 GIT binary patch literal 258 zcmZ8bL23d)5Zs9hLGTZ`dWcQpRfK?e^p;$Q-I->cxZ5-I%r4AJJbTPf0(pin5O1FB zB{`*_yQ-R^sh`RvZmdmlo#a!*a3VslG9Wu8Qw3NWWdqj?~#f0>< zVP_p|FdmW*5ZHfWdZXy72BFPJJv6R@kkj7Na`EyC(ItEir8$%}MzC0Qb;zK5BJDSWO{o9? literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/pydevd_concurrency_logger.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/pydevd_concurrency_logger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd269a65f60910424d5566692beafc5f1f492e73 GIT binary patch literal 16967 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 YhBXG-@e2yPUsWDa(~d7F^a-N>Z|2aOHUIzs literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/pydevd_thread_wrappers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__pycache__/pydevd_thread_wrappers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83698cc41e32a2b7fedb5edcd05e7e01a5fee38b GIT binary patch literal 3858 zcmb_f-A^0Y6~A{r>@nDYfsnEoV!oQX*)Zv{jry_5X1g@2)kdsZXxi|w!{8Z+!Hm6k z#tUF0T>GyL6E_`k_i192NKi`Iro^U8!2lpNj+UI1&}!RGzQ`U zc_6@gbd7u_lt@XK6<|GOl@{m(Nr>Y~KBG=_;6w?;2Fa7Bbo?n{a29fkDlh-6E?SP7 zRDWZe%vNuij%mfmSjtGLW2U{}WU^|OW#&!iJXmb{B~6isZS{T$dQ8#XO5bFK)o@1o7V@IT5HF`AZzUg0C~oBAnRzqm{MHNM zWWA&DUbv&jx#%9p&Sk|i{`k7b@N`P(UB3YQ$xBwWN z05nZ_ECZL*gjA=^m~$!1Rd^i;mi58hM1V!$!&*SN0cP5{w8Ji9Ba~sOIS&v0(6*7V z04znHj=~jyag`PI?7db1s%dq^>LHR(7(|o500DG$*w(qx`bF!OwAVKLynA44Y`c5( z$*rC4(Q*KXB40!{jlH(P!;bFF$%Ec&JH6Mw?znc?bE*8%;lfo!3jD zqvnqChkMO^-%5c<-*Fr1jBkf8ebW)!4#!^QNigEU7cUUs*4k_ERH*IP#vrZG6B~y5 z%J&*~SG!deMp-io#6$xYp#8eV*i{&7SmpcBaTcR~yu1Ztb!*gzGzKf@qXJYmfML!H zc!T;#qNs5W0?%Ws+M@|`@PRo~>aFtU!3}AeY2h2M!S$otcu+9BI)>* zA6vQD=-jH6AA_FHO-lIl*7erS<~?Ny@_+-SXGiHdP=zS_ z>H&(hzm{Td`K zK{!anAWkb32SYfXf2Xr=0Y?RQYv;|3grJNO|%n z*3)@iB2-Ord~&9I%WxxA8ulJho_}EcAm@4q#EfmFZ&rslnC1Paw??l#4ZI0Db}tA_ z16!iyx3^mcHm~or43xy9*4XC6ZfpOx((j!c{g)7G*&t_v=}J1(dS)H=bI^Vlt>ezX z`U^pj2O3gA=&zP4BYXv2^>43J#r=8Dm(LJ2Ev>3w^I~muK2Tk;S~FVaY*g~_f_L6^<9%oAmv;ktng&+9zk z@H63__@9IttX?Ybc;LLj#$XhWV' % (quote(my_file, "/>_= \t"), myLine)) + cmdTextList.append(variables) + cmdTextList.append("") + curFrame = curFrame.f_back + except: + pydev_log.exception() + + return cmdTextList + + +def send_concurrency_message(event_class, time, name, thread_id, type, event, file, line, frame, lock_id=0, parent=None): + dbg = GlobalDebuggerHolder.global_dbg + if dbg is None: + return + cmdTextList = [""] + + cmdTextList.append("<" + event_class) + cmdTextList.append(' time="%s"' % pydevd_xml.make_valid_xml_value(str(time))) + cmdTextList.append(' name="%s"' % pydevd_xml.make_valid_xml_value(name)) + cmdTextList.append(' thread_id="%s"' % pydevd_xml.make_valid_xml_value(thread_id)) + cmdTextList.append(' type="%s"' % pydevd_xml.make_valid_xml_value(type)) + if type == "lock": + cmdTextList.append(' lock_id="%s"' % pydevd_xml.make_valid_xml_value(str(lock_id))) + if parent is not None: + cmdTextList.append(' parent="%s"' % pydevd_xml.make_valid_xml_value(parent)) + cmdTextList.append(' event="%s"' % pydevd_xml.make_valid_xml_value(event)) + cmdTextList.append(' file="%s"' % pydevd_xml.make_valid_xml_value(file)) + cmdTextList.append(' line="%s"' % pydevd_xml.make_valid_xml_value(str(line))) + cmdTextList.append(">") + + cmdTextList += get_text_list_for_frame(frame) + cmdTextList.append("") + + text = "".join(cmdTextList) + if dbg.writer is not None: + dbg.writer.add_command(NetCommand(145, 0, text)) + + +def log_new_thread(global_debugger, t): + event_time = cur_time() - global_debugger.thread_analyser.start_time + send_concurrency_message( + "threading_event", event_time, t.name, get_thread_id(t), "thread", "start", "code_name", 0, None, parent=get_thread_id(t) + ) + + +class ThreadingLogger: + def __init__(self): + self.start_time = cur_time() + + def set_start_time(self, time): + self.start_time = time + + def log_event(self, frame): + write_log = False + self_obj = None + if "self" in frame.f_locals: + self_obj = frame.f_locals["self"] + if isinstance(self_obj, threading.Thread) or self_obj.__class__ == ObjectWrapper: + write_log = True + if hasattr(frame, "f_back") and frame.f_back is not None: + back = frame.f_back + if hasattr(back, "f_back") and back.f_back is not None: + back = back.f_back + if "self" in back.f_locals: + if isinstance(back.f_locals["self"], threading.Thread): + write_log = True + try: + if write_log: + t = threadingCurrentThread() + back = frame.f_back + if not back: + return + name, _, back_base = pydevd_file_utils.get_abs_path_real_path_and_base_from_frame(back) + event_time = cur_time() - self.start_time + method_name = frame.f_code.co_name + + if isinstance(self_obj, threading.Thread): + if not hasattr(self_obj, "_pydev_run_patched"): + wrap_attr(self_obj, "run") + if (method_name in THREAD_METHODS) and ( + back_base not in DONT_TRACE_THREADING or (method_name in INNER_METHODS and back_base in INNER_FILES) + ): + thread_id = get_thread_id(self_obj) + name = self_obj.getName() + real_method = frame.f_code.co_name + parent = None + if real_method == "_stop": + if back_base in INNER_FILES and back.f_code.co_name == "_wait_for_tstate_lock": + back = back.f_back.f_back + real_method = "stop" + if hasattr(self_obj, "_pydev_join_called"): + parent = get_thread_id(t) + elif real_method == "join": + # join called in the current thread, not in self object + if not self_obj.is_alive(): + return + thread_id = get_thread_id(t) + name = t.name + self_obj._pydev_join_called = True + + if real_method == "start": + parent = get_thread_id(t) + send_concurrency_message( + "threading_event", + event_time, + name, + thread_id, + "thread", + real_method, + back.f_code.co_filename, + back.f_lineno, + back, + parent=parent, + ) + # print(event_time, self_obj.getName(), thread_id, "thread", + # real_method, back.f_code.co_filename, back.f_lineno) + + if method_name == "pydev_after_run_call": + if hasattr(frame, "f_back") and frame.f_back is not None: + back = frame.f_back + if hasattr(back, "f_back") and back.f_back is not None: + back = back.f_back + if "self" in back.f_locals: + if isinstance(back.f_locals["self"], threading.Thread): + my_self_obj = frame.f_back.f_back.f_locals["self"] + my_back = frame.f_back.f_back + my_thread_id = get_thread_id(my_self_obj) + send_massage = True + if hasattr(my_self_obj, "_pydev_join_called"): + send_massage = False + # we can't detect stop after join in Python 2 yet + if send_massage: + send_concurrency_message( + "threading_event", + event_time, + "Thread", + my_thread_id, + "thread", + "stop", + my_back.f_code.co_filename, + my_back.f_lineno, + my_back, + parent=None, + ) + + if self_obj.__class__ == ObjectWrapper: + if back_base in DONT_TRACE_THREADING: + # do not trace methods called from threading + return + back_back_base = pydevd_file_utils.get_abs_path_real_path_and_base_from_frame(back.f_back)[2] + back = back.f_back + if back_back_base in DONT_TRACE_THREADING: + # back_back_base is the file, where the method was called froms + return + if method_name == "__init__": + send_concurrency_message( + "threading_event", + event_time, + t.name, + get_thread_id(t), + "lock", + method_name, + back.f_code.co_filename, + back.f_lineno, + back, + lock_id=str(id(frame.f_locals["self"])), + ) + if "attr" in frame.f_locals and (frame.f_locals["attr"] in LOCK_METHODS or frame.f_locals["attr"] in QUEUE_METHODS): + real_method = frame.f_locals["attr"] + if method_name == "call_begin": + real_method += "_begin" + elif method_name == "call_end": + real_method += "_end" + else: + return + if real_method == "release_end": + # do not log release end. Maybe use it later + return + send_concurrency_message( + "threading_event", + event_time, + t.name, + get_thread_id(t), + "lock", + real_method, + back.f_code.co_filename, + back.f_lineno, + back, + lock_id=str(id(self_obj)), + ) + + if real_method in ("put_end", "get_end"): + # fake release for queue, cause we don't call it directly + send_concurrency_message( + "threading_event", + event_time, + t.name, + get_thread_id(t), + "lock", + "release", + back.f_code.co_filename, + back.f_lineno, + back, + lock_id=str(id(self_obj)), + ) + # print(event_time, t.name, get_thread_id(t), "lock", + # real_method, back.f_code.co_filename, back.f_lineno) + + except Exception: + pydev_log.exception() + + +class NameManager: + def __init__(self, name_prefix): + self.tasks = {} + self.last = 0 + self.prefix = name_prefix + + def get(self, id): + if id not in self.tasks: + self.last += 1 + self.tasks[id] = self.prefix + "-" + str(self.last) + return self.tasks[id] + + +class AsyncioLogger: + def __init__(self): + self.task_mgr = NameManager("Task") + self.coro_mgr = NameManager("Coro") + self.start_time = cur_time() + + def get_task_id(self, frame): + asyncio = sys.modules.get("asyncio") + if asyncio is None: + # If asyncio was not imported, there's nothing to be done + # (also fixes issue where multiprocessing is imported due + # to asyncio). + return None + while frame is not None: + if "self" in frame.f_locals: + self_obj = frame.f_locals["self"] + if isinstance(self_obj, asyncio.Task): + method_name = frame.f_code.co_name + if method_name == "_step": + return id(self_obj) + frame = frame.f_back + return None + + def log_event(self, frame): + event_time = cur_time() - self.start_time + + # Debug loop iterations + # if isinstance(self_obj, asyncio.base_events.BaseEventLoop): + # if method_name == "_run_once": + # print("Loop iteration") + + if not hasattr(frame, "f_back") or frame.f_back is None: + return + + asyncio = sys.modules.get("asyncio") + if asyncio is None: + # If asyncio was not imported, there's nothing to be done + # (also fixes issue where multiprocessing is imported due + # to asyncio). + return + + back = frame.f_back + + if "self" in frame.f_locals: + self_obj = frame.f_locals["self"] + if isinstance(self_obj, asyncio.Task): + method_name = frame.f_code.co_name + if method_name == "set_result": + task_id = id(self_obj) + task_name = self.task_mgr.get(str(task_id)) + send_concurrency_message( + "asyncio_event", event_time, task_name, task_name, "thread", "stop", frame.f_code.co_filename, frame.f_lineno, frame + ) + + method_name = back.f_code.co_name + if method_name == "__init__": + task_id = id(self_obj) + task_name = self.task_mgr.get(str(task_id)) + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "thread", + "start", + frame.f_code.co_filename, + frame.f_lineno, + frame, + ) + + method_name = frame.f_code.co_name + if isinstance(self_obj, asyncio.Lock): + if method_name in ("acquire", "release"): + task_id = self.get_task_id(frame) + task_name = self.task_mgr.get(str(task_id)) + + if method_name == "acquire": + if not self_obj._waiters and not self_obj.locked(): + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "lock", + method_name + "_begin", + frame.f_code.co_filename, + frame.f_lineno, + frame, + lock_id=str(id(self_obj)), + ) + if self_obj.locked(): + method_name += "_begin" + else: + method_name += "_end" + elif method_name == "release": + method_name += "_end" + + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "lock", + method_name, + frame.f_code.co_filename, + frame.f_lineno, + frame, + lock_id=str(id(self_obj)), + ) + + if isinstance(self_obj, asyncio.Queue): + if method_name in ("put", "get", "_put", "_get"): + task_id = self.get_task_id(frame) + task_name = self.task_mgr.get(str(task_id)) + + if method_name == "put": + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "lock", + "acquire_begin", + frame.f_code.co_filename, + frame.f_lineno, + frame, + lock_id=str(id(self_obj)), + ) + elif method_name == "_put": + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "lock", + "acquire_end", + frame.f_code.co_filename, + frame.f_lineno, + frame, + lock_id=str(id(self_obj)), + ) + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "lock", + "release", + frame.f_code.co_filename, + frame.f_lineno, + frame, + lock_id=str(id(self_obj)), + ) + elif method_name == "get": + back = frame.f_back + if back.f_code.co_name != "send": + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "lock", + "acquire_begin", + frame.f_code.co_filename, + frame.f_lineno, + frame, + lock_id=str(id(self_obj)), + ) + else: + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "lock", + "acquire_end", + frame.f_code.co_filename, + frame.f_lineno, + frame, + lock_id=str(id(self_obj)), + ) + send_concurrency_message( + "asyncio_event", + event_time, + task_name, + task_name, + "lock", + "release", + frame.f_code.co_filename, + frame.f_lineno, + frame, + lock_id=str(id(self_obj)), + ) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_thread_wrappers.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_thread_wrappers.py new file mode 100644 index 0000000..e71f3e5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_thread_wrappers.py @@ -0,0 +1,82 @@ +from _pydev_bundle._pydev_saved_modules import threading + + +def wrapper(fun): + def pydev_after_run_call(): + pass + + def inner(*args, **kwargs): + fun(*args, **kwargs) + pydev_after_run_call() + + return inner + + +def wrap_attr(obj, attr): + t_save_start = getattr(obj, attr) + setattr(obj, attr, wrapper(t_save_start)) + obj._pydev_run_patched = True + + +class ObjectWrapper(object): + def __init__(self, obj): + self.wrapped_object = obj + try: + import functools + + functools.update_wrapper(self, obj) + except: + pass + + def __getattr__(self, attr): + orig_attr = getattr(self.wrapped_object, attr) # .__getattribute__(attr) + if callable(orig_attr): + + def patched_attr(*args, **kwargs): + self.call_begin(attr) + result = orig_attr(*args, **kwargs) + self.call_end(attr) + if result == self.wrapped_object: + return self + return result + + return patched_attr + else: + return orig_attr + + def call_begin(self, attr): + pass + + def call_end(self, attr): + pass + + def __enter__(self): + self.call_begin("__enter__") + self.wrapped_object.__enter__() + self.call_end("__enter__") + + def __exit__(self, exc_type, exc_val, exc_tb): + self.call_begin("__exit__") + self.wrapped_object.__exit__(exc_type, exc_val, exc_tb) + + +def factory_wrapper(fun): + def inner(*args, **kwargs): + obj = fun(*args, **kwargs) + return ObjectWrapper(obj) + + return inner + + +def wrap_threads(): + # TODO: add wrappers for thread and _thread + # import _thread as mod + # print("Thread imported") + # mod.start_new_thread = wrapper(mod.start_new_thread) + threading.Lock = factory_wrapper(threading.Lock) + threading.RLock = factory_wrapper(threading.RLock) + + # queue patching + import queue # @UnresolvedImport + + queue.Queue = factory_wrapper(queue.Queue) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_console.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_console.py new file mode 100644 index 0000000..9221f68 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_console.py @@ -0,0 +1,265 @@ +"""An helper file for the pydev debugger (REPL) console +""" +import sys +import traceback +from _pydevd_bundle.pydevconsole_code import InteractiveConsole, _EvalAwaitInNewEventLoop +from _pydev_bundle import _pydev_completer +from _pydev_bundle.pydev_console_utils import BaseInterpreterInterface, BaseStdIn +from _pydev_bundle.pydev_imports import Exec +from _pydev_bundle.pydev_override import overrides +from _pydevd_bundle import pydevd_save_locals +from _pydevd_bundle.pydevd_io import IOBuf +from pydevd_tracing import get_exception_traceback_str +from _pydevd_bundle.pydevd_xml import make_valid_xml_value +import inspect +from _pydevd_bundle.pydevd_save_locals import update_globals_and_locals + +CONSOLE_OUTPUT = "output" +CONSOLE_ERROR = "error" + + +# ======================================================================================================================= +# ConsoleMessage +# ======================================================================================================================= +class ConsoleMessage: + """Console Messages""" + + def __init__(self): + self.more = False + # List of tuple [('error', 'error_message'), ('message_list', 'output_message')] + self.console_messages = [] + + def add_console_message(self, message_type, message): + """add messages in the console_messages list""" + for m in message.split("\n"): + if m.strip(): + self.console_messages.append((message_type, m)) + + def update_more(self, more): + """more is set to true if further input is required from the user + else more is set to false + """ + self.more = more + + def to_xml(self): + """Create an XML for console message_list, error and more (true/false) + + console message_list + console error + true/false + + """ + makeValid = make_valid_xml_value + + xml = "%s" % (self.more) + + for message_type, message in self.console_messages: + xml += '<%s message="%s">' % (message_type, makeValid(message), message_type) + + xml += "" + + return xml + + +# ======================================================================================================================= +# _DebugConsoleStdIn +# ======================================================================================================================= +class _DebugConsoleStdIn(BaseStdIn): + @overrides(BaseStdIn.readline) + def readline(self, *args, **kwargs): + sys.stderr.write("Warning: Reading from stdin is still not supported in this console.\n") + return "\n" + + +# ======================================================================================================================= +# DebugConsole +# ======================================================================================================================= +class DebugConsole(InteractiveConsole, BaseInterpreterInterface): + """Wrapper around code.InteractiveConsole, in order to send + errors and outputs to the debug console + """ + + @overrides(BaseInterpreterInterface.create_std_in) + def create_std_in(self, *args, **kwargs): + try: + if not self.__buffer_output: + return sys.stdin + except: + pass + + return _DebugConsoleStdIn() # If buffered, raw_input is not supported in this console. + + @overrides(InteractiveConsole.push) + def push(self, line, frame, buffer_output=True): + """Change built-in stdout and stderr methods by the + new custom StdMessage. + execute the InteractiveConsole.push. + Change the stdout and stderr back be the original built-ins + + :param buffer_output: if False won't redirect the output. + + Return boolean (True if more input is required else False), + output_messages and input_messages + """ + self.__buffer_output = buffer_output + more = False + if buffer_output: + original_stdout = sys.stdout + original_stderr = sys.stderr + try: + try: + self.frame = frame + if buffer_output: + out = sys.stdout = IOBuf() + err = sys.stderr = IOBuf() + more = self.add_exec(line) + except Exception: + exc = get_exception_traceback_str() + if buffer_output: + err.buflist.append("Internal Error: %s" % (exc,)) + else: + sys.stderr.write("Internal Error: %s\n" % (exc,)) + finally: + # Remove frame references. + self.frame = None + frame = None + if buffer_output: + sys.stdout = original_stdout + sys.stderr = original_stderr + + if buffer_output: + return more, out.buflist, err.buflist + else: + return more, [], [] + + @overrides(BaseInterpreterInterface.do_add_exec) + def do_add_exec(self, line): + return InteractiveConsole.push(self, line) + + @overrides(InteractiveConsole.runcode) + def runcode(self, code): + """Execute a code object. + + When an exception occurs, self.showtraceback() is called to + display a traceback. All exceptions are caught except + SystemExit, which is reraised. + + A note about KeyboardInterrupt: this exception may occur + elsewhere in this code, and may not always be caught. The + caller should be prepared to deal with it. + + """ + try: + updated_globals = self.get_namespace() + initial_globals = updated_globals.copy() + + updated_locals = None + + is_async = False + if hasattr(inspect, "CO_COROUTINE"): + is_async = inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE + + if is_async: + t = _EvalAwaitInNewEventLoop(code, updated_globals, updated_locals) + t.start() + t.join() + + update_globals_and_locals(updated_globals, initial_globals, self.frame) + if t.exc: + raise t.exc[1].with_traceback(t.exc[2]) + + else: + try: + exec(code, updated_globals, updated_locals) + finally: + update_globals_and_locals(updated_globals, initial_globals, self.frame) + except SystemExit: + raise + except: + # In case sys.excepthook called, use original excepthook #PyDev-877: Debug console freezes with Python 3.5+ + # (showtraceback does it on python 3.5 onwards) + sys.excepthook = sys.__excepthook__ + try: + self.showtraceback() + finally: + sys.__excepthook__ = sys.excepthook + + def get_namespace(self): + dbg_namespace = {} + dbg_namespace.update(self.frame.f_globals) + dbg_namespace.update(self.frame.f_locals) # locals later because it has precedence over the actual globals + return dbg_namespace + + +# ======================================================================================================================= +# InteractiveConsoleCache +# ======================================================================================================================= +class InteractiveConsoleCache: + thread_id = None + frame_id = None + interactive_console_instance = None + + +# Note: On Jython 2.1 we can't use classmethod or staticmethod, so, just make the functions below free-functions. +def get_interactive_console(thread_id, frame_id, frame, console_message): + """returns the global interactive console. + interactive console should have been initialized by this time + :rtype: DebugConsole + """ + if InteractiveConsoleCache.thread_id == thread_id and InteractiveConsoleCache.frame_id == frame_id: + return InteractiveConsoleCache.interactive_console_instance + + InteractiveConsoleCache.interactive_console_instance = DebugConsole() + InteractiveConsoleCache.thread_id = thread_id + InteractiveConsoleCache.frame_id = frame_id + + console_stacktrace = traceback.extract_stack(frame, limit=1) + if console_stacktrace: + current_context = console_stacktrace[0] # top entry from stacktrace + context_message = 'File "%s", line %s, in %s' % (current_context[0], current_context[1], current_context[2]) + console_message.add_console_message(CONSOLE_OUTPUT, "[Current context]: %s" % (context_message,)) + return InteractiveConsoleCache.interactive_console_instance + + +def clear_interactive_console(): + InteractiveConsoleCache.thread_id = None + InteractiveConsoleCache.frame_id = None + InteractiveConsoleCache.interactive_console_instance = None + + +def execute_console_command(frame, thread_id, frame_id, line, buffer_output=True): + """fetch an interactive console instance from the cache and + push the received command to the console. + + create and return an instance of console_message + """ + console_message = ConsoleMessage() + + interpreter = get_interactive_console(thread_id, frame_id, frame, console_message) + more, output_messages, error_messages = interpreter.push(line, frame, buffer_output) + console_message.update_more(more) + + for message in output_messages: + console_message.add_console_message(CONSOLE_OUTPUT, message) + + for message in error_messages: + console_message.add_console_message(CONSOLE_ERROR, message) + + return console_message + + +def get_description(frame, thread_id, frame_id, expression): + console_message = ConsoleMessage() + interpreter = get_interactive_console(thread_id, frame_id, frame, console_message) + try: + interpreter.frame = frame + return interpreter.getDescription(expression) + finally: + interpreter.frame = None + + +def get_completions(frame, act_tok): + """fetch all completions, create xml for the same + return the completions xml + """ + return _pydev_completer.generate_completions_as_xml(frame, act_tok) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_constants.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_constants.py new file mode 100644 index 0000000..5a97a25 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_constants.py @@ -0,0 +1,847 @@ +""" +This module holds the constants used for specifying the states of the debugger. +""" + +from __future__ import nested_scopes +import platform +import weakref +import struct +import warnings +import functools +from contextlib import contextmanager + +STATE_RUN = 1 +STATE_SUSPEND = 2 + +PYTHON_SUSPEND = 1 +DJANGO_SUSPEND = 2 +JINJA2_SUSPEND = 3 + +int_types = (int,) + +# types does not include a MethodWrapperType +try: + MethodWrapperType = type([].__str__) +except: + MethodWrapperType = None + +import sys # Note: the sys import must be here anyways (others depend on it) + +# Preload codecs to avoid imports to them later on which can potentially halt the debugger. +import codecs as _codecs + +for _codec in ["ascii", "utf8", "utf-8", "latin1", "latin-1", "idna"]: + _codecs.lookup(_codec) + + +class DebugInfoHolder: + # we have to put it here because it can be set through the command line (so, the + # already imported references would not have it). + + # General information + DEBUG_TRACE_LEVEL = 0 # 0 = critical, 1 = info, 2 = debug, 3 = verbose + + PYDEVD_DEBUG_FILE = None + + +# Any filename that starts with these strings is not traced nor shown to the user. +# In Python 3.7 " ..." can appear and should be ignored for the user. +# has special heuristics to know whether it should be traced or not (it's part of +# user code when it's the used in python -c and part of the library otherwise). + +# Any filename that starts with these strings is considered user (project) code. Note +# that files for which we have a source mapping are also considered as a part of the project. +USER_CODE_BASENAMES_STARTING_WITH = (" (2**32) + +IS_JYTHON = pydevd_vm_type.get_vm_type() == pydevd_vm_type.PydevdVmType.JYTHON + +IS_PYPY = platform.python_implementation() == "PyPy" + +if IS_JYTHON: + import java.lang.System # @UnresolvedImport + + IS_WINDOWS = java.lang.System.getProperty("os.name").lower().startswith("windows") + +USE_CUSTOM_SYS_CURRENT_FRAMES = not hasattr(sys, "_current_frames") or IS_PYPY +USE_CUSTOM_SYS_CURRENT_FRAMES_MAP = USE_CUSTOM_SYS_CURRENT_FRAMES and (IS_PYPY or IS_IRONPYTHON) + +if USE_CUSTOM_SYS_CURRENT_FRAMES: + # Some versions of Jython don't have it (but we can provide a replacement) + if IS_JYTHON: + from java.lang import NoSuchFieldException + from org.python.core import ThreadStateMapping + + try: + cachedThreadState = ThreadStateMapping.getDeclaredField("globalThreadStates") # Dev version + except NoSuchFieldException: + cachedThreadState = ThreadStateMapping.getDeclaredField("cachedThreadState") # Release Jython 2.7.0 + cachedThreadState.accessible = True + thread_states = cachedThreadState.get(ThreadStateMapping) + + def _current_frames(): + as_array = thread_states.entrySet().toArray() + ret = {} + for thread_to_state in as_array: + thread = thread_to_state.getKey() + if thread is None: + continue + thread_state = thread_to_state.getValue() + if thread_state is None: + continue + + frame = thread_state.frame + if frame is None: + continue + + ret[thread.getId()] = frame + return ret + + elif USE_CUSTOM_SYS_CURRENT_FRAMES_MAP: + constructed_tid_to_last_frame = {} + + # IronPython doesn't have it. Let's use our workaround... + def _current_frames(): + return constructed_tid_to_last_frame + + else: + raise RuntimeError("Unable to proceed (sys._current_frames not available in this Python implementation).") +else: + _current_frames = sys._current_frames + +IS_PYTHON_STACKLESS = "stackless" in sys.version.lower() +CYTHON_SUPPORTED = False + +python_implementation = platform.python_implementation() +if python_implementation == "CPython": + # Only available for CPython! + CYTHON_SUPPORTED = True + +# ======================================================================================================================= +# Python 3? +# ======================================================================================================================= +IS_PY36_OR_GREATER = sys.version_info >= (3, 6) +IS_PY37_OR_GREATER = sys.version_info >= (3, 7) +IS_PY38_OR_GREATER = sys.version_info >= (3, 8) +IS_PY39_OR_GREATER = sys.version_info >= (3, 9) +IS_PY310_OR_GREATER = sys.version_info >= (3, 10) +IS_PY311_OR_GREATER = sys.version_info >= (3, 11) +IS_PY312_OR_GREATER = sys.version_info >= (3, 12) +IS_PY313_OR_GREATER = sys.version_info >= (3, 13) +IS_PY314_OR_GREATER = sys.version_info >= (3, 14) + +# Bug affecting Python 3.13.0 specifically makes some tests crash the interpreter! +# Hopefully it'll be fixed in 3.13.1. +IS_PY313_0 = sys.version_info[:3] == (3, 13, 0) + +# Mark tests that need to be fixed with this. +TODO_PY313_OR_GREATER = IS_PY313_OR_GREATER + +# Not currently supported in Python 3.14. +SUPPORT_ATTACH_TO_PID = not IS_PY314_OR_GREATER + + +def version_str(v): + return ".".join((str(x) for x in v[:3])) + "".join((str(x) for x in v[3:])) + + +PY_VERSION_STR = version_str(sys.version_info) +try: + PY_IMPL_VERSION_STR = version_str(sys.implementation.version) +except AttributeError: + PY_IMPL_VERSION_STR = "" + +try: + PY_IMPL_NAME = sys.implementation.name +except AttributeError: + PY_IMPL_NAME = "" + +ENV_TRUE_LOWER_VALUES = ("yes", "true", "1") +ENV_FALSE_LOWER_VALUES = ("no", "false", "0") + +PYDEVD_USE_SYS_MONITORING = IS_PY312_OR_GREATER and hasattr(sys, "monitoring") +if PYDEVD_USE_SYS_MONITORING: # Default gotten, let's see if it was somehow customize by the user. + _use_sys_monitoring_env_var = os.getenv("PYDEVD_USE_SYS_MONITORING", "").lower() + if _use_sys_monitoring_env_var: + # Check if the user specified something. + if _use_sys_monitoring_env_var in ENV_FALSE_LOWER_VALUES: + PYDEVD_USE_SYS_MONITORING = False + elif _use_sys_monitoring_env_var in ENV_TRUE_LOWER_VALUES: + PYDEVD_USE_SYS_MONITORING = True + else: + raise RuntimeError("Unrecognized value for PYDEVD_USE_SYS_MONITORING: %s" % (_use_sys_monitoring_env_var,)) + + +def is_true_in_env(env_key): + if isinstance(env_key, tuple): + # If a tuple, return True if any of those ends up being true. + for v in env_key: + if is_true_in_env(v): + return True + return False + else: + return os.getenv(env_key, "").lower() in ENV_TRUE_LOWER_VALUES + + +def as_float_in_env(env_key, default): + value = os.getenv(env_key) + if value is None: + return default + try: + return float(value) + except Exception: + raise RuntimeError("Error: expected the env variable: %s to be set to a float value. Found: %s" % (env_key, value)) + + +def as_int_in_env(env_key, default): + value = os.getenv(env_key) + if value is None: + return default + try: + return int(value) + except Exception: + raise RuntimeError("Error: expected the env variable: %s to be set to a int value. Found: %s" % (env_key, value)) + + +# If true in env, use gevent mode. +SUPPORT_GEVENT = is_true_in_env("GEVENT_SUPPORT") + +# Opt-in support to show gevent paused greenlets. False by default because if too many greenlets are +# paused the UI can slow-down (i.e.: if 1000 greenlets are paused, each one would be shown separate +# as a different thread, but if the UI isn't optimized for that the experience is lacking...). +GEVENT_SHOW_PAUSED_GREENLETS = is_true_in_env("GEVENT_SHOW_PAUSED_GREENLETS") + +DISABLE_FILE_VALIDATION = is_true_in_env("PYDEVD_DISABLE_FILE_VALIDATION") + +GEVENT_SUPPORT_NOT_SET_MSG = os.getenv( + "GEVENT_SUPPORT_NOT_SET_MSG", + "It seems that the gevent monkey-patching is being used.\n" + "Please set an environment variable with:\n" + "GEVENT_SUPPORT=True\n" + "to enable gevent support in the debugger.", +) + +USE_LIB_COPY = SUPPORT_GEVENT + +INTERACTIVE_MODE_AVAILABLE = sys.platform in ("darwin", "win32") or os.getenv("DISPLAY") is not None + +# If true in env, forces cython to be used (raises error if not available). +# If false in env, disables it. +# If not specified, uses default heuristic to determine if it should be loaded. +USE_CYTHON_FLAG = os.getenv("PYDEVD_USE_CYTHON") + +if USE_CYTHON_FLAG is not None: + USE_CYTHON_FLAG = USE_CYTHON_FLAG.lower() + if USE_CYTHON_FLAG not in ENV_TRUE_LOWER_VALUES and USE_CYTHON_FLAG not in ENV_FALSE_LOWER_VALUES: + raise RuntimeError( + "Unexpected value for PYDEVD_USE_CYTHON: %s (enable with one of: %s, disable with one of: %s)" + % (USE_CYTHON_FLAG, ENV_TRUE_LOWER_VALUES, ENV_FALSE_LOWER_VALUES) + ) + +else: + if not CYTHON_SUPPORTED: + USE_CYTHON_FLAG = "no" + +# If true in env, forces frame eval to be used (raises error if not available). +# If false in env, disables it. +# If not specified, uses default heuristic to determine if it should be loaded. +PYDEVD_USE_FRAME_EVAL = os.getenv("PYDEVD_USE_FRAME_EVAL", "").lower() + +# Values used to determine how much container items will be shown. +# PYDEVD_CONTAINER_INITIAL_EXPANDED_ITEMS: +# - Defines how many items will appear initially expanded after which a 'more...' will appear. +# +# PYDEVD_CONTAINER_BUCKET_SIZE +# - Defines the size of each bucket inside the 'more...' item +# i.e.: a bucket with size == 2 would show items such as: +# - [2:4] +# - [4:6] +# ... +# +# PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS +# - Defines the maximum number of items for dicts and sets. +# +PYDEVD_CONTAINER_INITIAL_EXPANDED_ITEMS = as_int_in_env("PYDEVD_CONTAINER_INITIAL_EXPANDED_ITEMS", 100) +PYDEVD_CONTAINER_BUCKET_SIZE = as_int_in_env("PYDEVD_CONTAINER_BUCKET_SIZE", 1000) +PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS = as_int_in_env("PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS", 500) +PYDEVD_CONTAINER_NUMPY_MAX_ITEMS = as_int_in_env("PYDEVD_CONTAINER_NUMPY_MAX_ITEMS", 500) + +PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING = is_true_in_env("PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING") + +# If specified in PYDEVD_IPYTHON_CONTEXT it must be a string with the basename +# and then the name of 2 methods in which the evaluate is done. +PYDEVD_IPYTHON_CONTEXT = ("interactiveshell.py", "run_code", "run_ast_nodes") +_ipython_ctx = os.getenv("PYDEVD_IPYTHON_CONTEXT") +if _ipython_ctx: + PYDEVD_IPYTHON_CONTEXT = tuple(x.strip() for x in _ipython_ctx.split(",")) + assert len(PYDEVD_IPYTHON_CONTEXT) == 3, "Invalid PYDEVD_IPYTHON_CONTEXT: %s" % (_ipython_ctx,) + +# Use to disable loading the lib to set tracing to all threads (default is using heuristics based on where we're running). +LOAD_NATIVE_LIB_FLAG = os.getenv("PYDEVD_LOAD_NATIVE_LIB", "").lower() + +LOG_TIME = os.getenv("PYDEVD_LOG_TIME", "true").lower() in ENV_TRUE_LOWER_VALUES + +SHOW_COMPILE_CYTHON_COMMAND_LINE = is_true_in_env("PYDEVD_SHOW_COMPILE_CYTHON_COMMAND_LINE") + +LOAD_VALUES_ASYNC = is_true_in_env("PYDEVD_LOAD_VALUES_ASYNC") +DEFAULT_VALUE = "__pydevd_value_async" +ASYNC_EVAL_TIMEOUT_SEC = 60 +NEXT_VALUE_SEPARATOR = "__pydev_val__" +BUILTINS_MODULE_NAME = "builtins" + +# Pandas customization. +PANDAS_MAX_ROWS = as_int_in_env("PYDEVD_PANDAS_MAX_ROWS", 60) +PANDAS_MAX_COLS = as_int_in_env("PYDEVD_PANDAS_MAX_COLS", 10) +PANDAS_MAX_COLWIDTH = as_int_in_env("PYDEVD_PANDAS_MAX_COLWIDTH", 50) + +# If getting an attribute or computing some value is too slow, let the user know if the given timeout elapses. +PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT = as_float_in_env("PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT", 0.50) + +# This timeout is used to track the time to send a message saying that the evaluation +# is taking too long and possible mitigations. +PYDEVD_WARN_EVALUATION_TIMEOUT = as_float_in_env("PYDEVD_WARN_EVALUATION_TIMEOUT", 3.0) + +# If True in env shows a thread dump when the evaluation times out. +PYDEVD_THREAD_DUMP_ON_WARN_EVALUATION_TIMEOUT = is_true_in_env("PYDEVD_THREAD_DUMP_ON_WARN_EVALUATION_TIMEOUT") + +# This timeout is used only when the mode that all threads are stopped/resumed at once is used +# (i.e.: multi_threads_single_notification) +# +# In this mode, if some evaluation doesn't finish until this timeout, we notify the user +# and then resume all threads until the evaluation finishes. +# +# A negative value will disable the timeout and a value of 0 will automatically run all threads +# (without any notification) when the evaluation is started and pause all threads when the +# evaluation is finished. A positive value will run run all threads after the timeout +# elapses. +PYDEVD_UNBLOCK_THREADS_TIMEOUT = as_float_in_env("PYDEVD_UNBLOCK_THREADS_TIMEOUT", -1.0) + +# Timeout to interrupt a thread (so, if some evaluation doesn't finish until this +# timeout, the thread doing the evaluation is interrupted). +# A value <= 0 means this is disabled. +# See: _pydevd_bundle.pydevd_timeout.create_interrupt_this_thread_callback for details +# on how the thread interruption works (there are some caveats related to it). +PYDEVD_INTERRUPT_THREAD_TIMEOUT = as_float_in_env("PYDEVD_INTERRUPT_THREAD_TIMEOUT", -1) + +# If PYDEVD_APPLY_PATCHING_TO_HIDE_PYDEVD_THREADS is set to False, the patching to hide pydevd threads won't be applied. +PYDEVD_APPLY_PATCHING_TO_HIDE_PYDEVD_THREADS = ( + os.getenv("PYDEVD_APPLY_PATCHING_TO_HIDE_PYDEVD_THREADS", "true").lower() in ENV_TRUE_LOWER_VALUES +) + +EXCEPTION_TYPE_UNHANDLED = "UNHANDLED" +EXCEPTION_TYPE_USER_UNHANDLED = "USER_UNHANDLED" +EXCEPTION_TYPE_HANDLED = "HANDLED" + +SHOW_DEBUG_INFO_ENV = is_true_in_env(("PYCHARM_DEBUG", "PYDEV_DEBUG", "PYDEVD_DEBUG")) + +if SHOW_DEBUG_INFO_ENV: + # show debug info before the debugger start + DebugInfoHolder.DEBUG_TRACE_LEVEL = 3 + +DebugInfoHolder.PYDEVD_DEBUG_FILE = os.getenv("PYDEVD_DEBUG_FILE") + + +def protect_libraries_from_patching(): + """ + In this function we delete some modules from `sys.modules` dictionary and import them again inside + `_pydev_saved_modules` in order to save their original copies there. After that we can use these + saved modules within the debugger to protect them from patching by external libraries (e.g. gevent). + """ + patched = [ + "threading", + "thread", + "_thread", + "time", + "socket", + "queue", + "select", + "xmlrpclib", + "SimpleXMLRPCServer", + "BaseHTTPServer", + "SocketServer", + "xmlrpc.client", + "xmlrpc.server", + "http.server", + "socketserver", + ] + + for name in patched: + try: + __import__(name) + except: + pass + + patched_modules = dict([(k, v) for k, v in sys.modules.items() if k in patched]) + + for name in patched_modules: + del sys.modules[name] + + # import for side effects + import _pydev_bundle._pydev_saved_modules + + for name in patched_modules: + sys.modules[name] = patched_modules[name] + + +if USE_LIB_COPY: + protect_libraries_from_patching() + +from _pydev_bundle._pydev_saved_modules import thread, threading + +_fork_safe_locks = [] + +if IS_JYTHON: + + def ForkSafeLock(rlock=False): + if rlock: + return threading.RLock() + else: + return threading.Lock() + +else: + + class ForkSafeLock(object): + """ + A lock which is fork-safe (when a fork is done, `pydevd_constants.after_fork()` + should be called to reset the locks in the new process to avoid deadlocks + from a lock which was locked during the fork). + + Note: + Unlike `threading.Lock` this class is not completely atomic, so, doing: + + lock = ForkSafeLock() + with lock: + ... + + is different than using `threading.Lock` directly because the tracing may + find an additional function call on `__enter__` and on `__exit__`, so, it's + not recommended to use this in all places, only where the forking may be important + (so, for instance, the locks on PyDB should not be changed to this lock because + of that -- and those should all be collected in the new process because PyDB itself + should be completely cleared anyways). + + It's possible to overcome this limitation by using `ForkSafeLock.acquire` and + `ForkSafeLock.release` instead of the context manager (as acquire/release are + bound to the original implementation, whereas __enter__/__exit__ is not due to Python + limitations). + """ + + def __init__(self, rlock=False): + self._rlock = rlock + self._init() + _fork_safe_locks.append(weakref.ref(self)) + + def __enter__(self): + return self._lock.__enter__() + + def __exit__(self, exc_type, exc_val, exc_tb): + return self._lock.__exit__(exc_type, exc_val, exc_tb) + + def _init(self): + if self._rlock: + self._lock = threading.RLock() + else: + self._lock = thread.allocate_lock() + + self.acquire = self._lock.acquire + self.release = self._lock.release + _fork_safe_locks.append(weakref.ref(self)) + + +def after_fork(): + """ + Must be called after a fork operation (will reset the ForkSafeLock). + """ + global _fork_safe_locks + locks = _fork_safe_locks[:] + _fork_safe_locks = [] + for lock in locks: + lock = lock() + if lock is not None: + lock._init() + + +_thread_id_lock = ForkSafeLock() +thread_get_ident = thread.get_ident + + +def as_str(s): + assert isinstance(s, str) + return s + + +@contextmanager +def filter_all_warnings(): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore") + yield + + +def silence_warnings_decorator(func): + @functools.wraps(func) + def new_func(*args, **kwargs): + with filter_all_warnings(): + return func(*args, **kwargs) + + return new_func + + +def sorted_dict_repr(d): + s = sorted(d.items(), key=lambda x: str(x[0])) + return "{" + ", ".join(("%r: %r" % x) for x in s) + "}" + + +def iter_chars(b): + # In Python 2, we can iterate bytes or str with individual characters, but Python 3 onwards + # changed that behavior so that when iterating bytes we actually get ints! + if isinstance(b, bytes): + # i.e.: do something as struct.unpack('3c', b) + return iter(struct.unpack(str(len(b)) + "c", b)) + return iter(b) + + +if IS_JYTHON or PYDEVD_USE_SYS_MONITORING: + + def NO_FTRACE(frame, event, arg): + return None + +else: + _curr_trace = sys.gettrace() + + # Set a temporary trace which does nothing for us to test (otherwise setting frame.f_trace has no + # effect). + def _temp_trace(frame, event, arg): + return None + + sys.settrace(_temp_trace) + + def _check_ftrace_set_none(): + """ + Will throw an error when executing a line event + """ + sys._getframe().f_trace = None + _line_event = 1 + _line_event = 2 + + try: + _check_ftrace_set_none() + + def NO_FTRACE(frame, event, arg): + frame.f_trace = None + return None + + except TypeError: + + def NO_FTRACE(frame, event, arg): + # In Python <= 2.6 and <= 3.4, if we're tracing a method, frame.f_trace may not be set + # to None, it must always be set to a tracing function. + # See: tests_python.test_tracing_gotchas.test_tracing_gotchas + # + # Note: Python 2.7 sometimes works and sometimes it doesn't depending on the minor + # version because of https://bugs.python.org/issue20041 (although bug reports didn't + # include the minor version, so, mark for any Python 2.7 as I'm not completely sure + # the fix in later 2.7 versions is the same one we're dealing with). + return None + + sys.settrace(_curr_trace) + + +# ======================================================================================================================= +# get_pid +# ======================================================================================================================= +def get_pid(): + try: + return os.getpid() + except AttributeError: + try: + # Jython does not have it! + import java.lang.management.ManagementFactory # @UnresolvedImport -- just for jython + + pid = java.lang.management.ManagementFactory.getRuntimeMXBean().getName() + return pid.replace("@", "_") + except: + # ok, no pid available (will be unable to debug multiple processes) + return "000001" + + +def clear_cached_thread_id(thread): + with _thread_id_lock: + try: + if thread.__pydevd_id__ != "console_main": + # The console_main is a special thread id used in the console and its id should never be reset + # (otherwise we may no longer be able to get its variables -- see: https://www.brainwy.com/tracker/PyDev/776). + del thread.__pydevd_id__ + except AttributeError: + pass + + +# Don't let threads be collected (so that id(thread) is guaranteed to be unique). +_thread_id_to_thread_found = {} + + +def _get_or_compute_thread_id_with_lock(thread, is_current_thread): + with _thread_id_lock: + # We do a new check with the lock in place just to be sure that nothing changed + tid = getattr(thread, "__pydevd_id__", None) + if tid is not None: + return tid + + _thread_id_to_thread_found[id(thread)] = thread + + # Note: don't use thread.ident because a new thread may have the + # same id from an old thread. + pid = get_pid() + tid = "pid_%s_id_%s" % (pid, id(thread)) + + thread.__pydevd_id__ = tid + + return tid + + +def get_current_thread_id(thread): + """ + Note: the difference from get_current_thread_id to get_thread_id is that + for the current thread we can get the thread id while the thread.ident + is still not set in the Thread instance. + """ + try: + # Fast path without getting lock. + tid = thread.__pydevd_id__ + if tid is None: + # Fix for https://www.brainwy.com/tracker/PyDev/645 + # if __pydevd_id__ is None, recalculate it... also, use an heuristic + # that gives us always the same id for the thread (using thread.ident or id(thread)). + raise AttributeError() + except AttributeError: + tid = _get_or_compute_thread_id_with_lock(thread, is_current_thread=True) + + return tid + + +def get_thread_id(thread): + try: + # Fast path without getting lock. + tid = thread.__pydevd_id__ + if tid is None: + # Fix for https://www.brainwy.com/tracker/PyDev/645 + # if __pydevd_id__ is None, recalculate it... also, use an heuristic + # that gives us always the same id for the thread (using thread.ident or id(thread)). + raise AttributeError() + except AttributeError: + tid = _get_or_compute_thread_id_with_lock(thread, is_current_thread=False) + + return tid + + +def set_thread_id(thread, thread_id): + with _thread_id_lock: + thread.__pydevd_id__ = thread_id + + +# ======================================================================================================================= +# Null +# ======================================================================================================================= +class Null: + """ + Gotten from: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/68205 + """ + + def __init__(self, *args, **kwargs): + return None + + def __call__(self, *args, **kwargs): + return self + + def __enter__(self, *args, **kwargs): + return self + + def __exit__(self, *args, **kwargs): + return self + + def __getattr__(self, mname): + if len(mname) > 4 and mname[:2] == "__" and mname[-2:] == "__": + # Don't pretend to implement special method names. + raise AttributeError(mname) + return self + + def __setattr__(self, name, value): + return self + + def __delattr__(self, name): + return self + + def __repr__(self): + return "" + + def __str__(self): + return "Null" + + def __len__(self): + return 0 + + def __getitem__(self): + return self + + def __setitem__(self, *args, **kwargs): + pass + + def write(self, *args, **kwargs): + pass + + def __nonzero__(self): + return 0 + + def __iter__(self): + return iter(()) + + +# Default instance +NULL = Null() + + +class KeyifyList(object): + def __init__(self, inner, key): + self.inner = inner + self.key = key + + def __len__(self): + return len(self.inner) + + def __getitem__(self, k): + return self.key(self.inner[k]) + + +def call_only_once(func): + """ + To be used as a decorator + + @call_only_once + def func(): + print 'Calling func only this time' + + Actually, in PyDev it must be called as: + + func = call_only_once(func) to support older versions of Python. + """ + + def new_func(*args, **kwargs): + if not new_func._called: + new_func._called = True + return func(*args, **kwargs) + + new_func._called = False + return new_func + + +# Protocol where each line is a new message (text is quoted to prevent new lines). +# payload is xml +QUOTED_LINE_PROTOCOL = "quoted-line" +ARGUMENT_QUOTED_LINE_PROTOCOL = "protocol-quoted-line" + +# Uses http protocol to provide a new message. +# i.e.: Content-Length:xxx\r\n\r\npayload +# payload is xml +HTTP_PROTOCOL = "http" +ARGUMENT_HTTP_PROTOCOL = "protocol-http" + +# Message is sent without any header. +# payload is json +JSON_PROTOCOL = "json" +ARGUMENT_JSON_PROTOCOL = "json-dap" + +# Same header as the HTTP_PROTOCOL +# payload is json +HTTP_JSON_PROTOCOL = "http_json" +ARGUMENT_HTTP_JSON_PROTOCOL = "json-dap-http" + +ARGUMENT_PPID = "ppid" + + +class _GlobalSettings: + protocol = QUOTED_LINE_PROTOCOL + + +def set_protocol(protocol): + expected = (HTTP_PROTOCOL, QUOTED_LINE_PROTOCOL, JSON_PROTOCOL, HTTP_JSON_PROTOCOL) + assert protocol in expected, "Protocol (%s) should be one of: %s" % (protocol, expected) + + _GlobalSettings.protocol = protocol + + +def get_protocol(): + return _GlobalSettings.protocol + + +def is_json_protocol(): + return _GlobalSettings.protocol in (JSON_PROTOCOL, HTTP_JSON_PROTOCOL) + + +class GlobalDebuggerHolder: + """ + Holder for the global debugger. + """ + + global_dbg = None # Note: don't rename (the name is used in our attach to process) + + +def get_global_debugger(): + return GlobalDebuggerHolder.global_dbg + + +GetGlobalDebugger = get_global_debugger # Backward-compatibility + + +def set_global_debugger(dbg): + GlobalDebuggerHolder.global_dbg = dbg + + +if __name__ == "__main__": + if Null(): + sys.stdout.write("here\n") diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_custom_frames.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_custom_frames.py new file mode 100644 index 0000000..65c83c4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_custom_frames.py @@ -0,0 +1,114 @@ +from _pydevd_bundle.pydevd_constants import get_current_thread_id, Null, ForkSafeLock +from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame +from _pydev_bundle._pydev_saved_modules import thread, threading +import sys +from _pydev_bundle import pydev_log + +DEBUG = False + + +class CustomFramesContainer: + # Actual Values initialized later on. + custom_frames_lock = None # : :type custom_frames_lock: threading.Lock + + custom_frames = None + + _next_frame_id = None + + _py_db_command_thread_event = None + + +def custom_frames_container_init(): # Note: no staticmethod on jython 2.1 (so, use free-function) + CustomFramesContainer.custom_frames_lock = ForkSafeLock() + + # custom_frames can only be accessed if properly locked with custom_frames_lock! + # Key is a string identifying the frame (as well as the thread it belongs to). + # Value is a CustomFrame. + # + CustomFramesContainer.custom_frames = {} + + # Only to be used in this module + CustomFramesContainer._next_frame_id = 0 + + # This is the event we must set to release an internal process events. It's later set by the actual debugger + # when we do create the debugger. + CustomFramesContainer._py_db_command_thread_event = Null() + + +# Initialize it the first time (it may be reinitialized later on when dealing with a fork). +custom_frames_container_init() + + +class CustomFrame: + def __init__(self, name, frame, thread_id): + # 0 = string with the representation of that frame + self.name = name + + # 1 = the frame to show + self.frame = frame + + # 2 = an integer identifying the last time the frame was changed. + self.mod_time = 0 + + # 3 = the thread id of the given frame + self.thread_id = thread_id + + +def add_custom_frame(frame, name, thread_id): + """ + It's possible to show paused frames by adding a custom frame through this API (it's + intended to be used for coroutines, but could potentially be used for generators too). + + :param frame: + The topmost frame to be shown paused when a thread with thread.ident == thread_id is paused. + + :param name: + The name to be shown for the custom thread in the UI. + + :param thread_id: + The thread id to which this frame is related (must match thread.ident). + + :return: str + Returns the custom thread id which will be used to show the given frame paused. + """ + with CustomFramesContainer.custom_frames_lock: + curr_thread_id = get_current_thread_id(threading.current_thread()) + next_id = CustomFramesContainer._next_frame_id = CustomFramesContainer._next_frame_id + 1 + + # Note: the frame id kept contains an id and thread information on the thread where the frame was added + # so that later on we can check if the frame is from the current thread by doing frame_id.endswith('|'+thread_id). + frame_custom_thread_id = "__frame__:%s|%s" % (next_id, curr_thread_id) + if DEBUG: + sys.stderr.write( + "add_custom_frame: %s (%s) %s %s\n" + % (frame_custom_thread_id, get_abs_path_real_path_and_base_from_frame(frame)[-1], frame.f_lineno, frame.f_code.co_name) + ) + + CustomFramesContainer.custom_frames[frame_custom_thread_id] = CustomFrame(name, frame, thread_id) + CustomFramesContainer._py_db_command_thread_event.set() + return frame_custom_thread_id + + +def update_custom_frame(frame_custom_thread_id, frame, thread_id, name=None): + with CustomFramesContainer.custom_frames_lock: + if DEBUG: + sys.stderr.write("update_custom_frame: %s\n" % frame_custom_thread_id) + try: + old = CustomFramesContainer.custom_frames[frame_custom_thread_id] + if name is not None: + old.name = name + old.mod_time += 1 + old.thread_id = thread_id + except: + sys.stderr.write("Unable to get frame to replace: %s\n" % (frame_custom_thread_id,)) + pydev_log.exception() + + CustomFramesContainer._py_db_command_thread_event.set() + + +def remove_custom_frame(frame_custom_thread_id): + with CustomFramesContainer.custom_frames_lock: + if DEBUG: + sys.stderr.write("remove_custom_frame: %s\n" % frame_custom_thread_id) + CustomFramesContainer.custom_frames.pop(frame_custom_thread_id, None) + CustomFramesContainer._py_db_command_thread_event.set() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.c b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.c new file mode 100644 index 0000000..95fb355 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.c @@ -0,0 +1,55557 @@ +/* Generated by Cython 3.0.11 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [], + "name": "_pydevd_bundle.pydevd_cython", + "sources": [ + "_pydevd_bundle/pydevd_cython.pyx" + ] + }, + "module_name": "_pydevd_bundle.pydevd_cython" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#if PY_VERSION_HEX >= 0x03090000 +#include "internal/pycore_gc.h" +#include "internal/pycore_interp.h" +#endif + +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_11" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x03000BF0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif + #undef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 0 +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif + #undef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 0 +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif + #undef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 0 +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 1 + #endif + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif + #ifndef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 0 + #endif +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif + #ifndef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #if PY_VERSION_HEX >= 0x030d00A4 + # define __Pyx_PyCFunctionFast PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords + #else + # define __Pyx_PyCFunctionFast _PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #endif +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE___pydevd_bundle__pydevd_cython +#define __PYX_HAVE_API___pydevd_bundle__pydevd_cython +/* Early includes */ +#include +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "_pydevd_bundle\\\\pydevd_cython.pyx", + "_pydevd_bundle\\\\pydevd_cython.pxd", + "", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* #### Code section: numeric_typedefs ### */ +/* #### Code section: complex_type_declarations ### */ +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj; +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame; +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper; +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions; +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame; +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer; + +/* "_pydevd_bundle/pydevd_cython.pxd":1 + * cdef class PyDBAdditionalThreadInfo: # <<<<<<<<<<<<<< + * cdef public int pydev_state + * cdef public object pydev_step_stop # Actually, it's a frame or None + */ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo { + PyObject_HEAD + struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_vtab; + int pydev_state; + PyObject *pydev_step_stop; + int pydev_original_step_cmd; + int pydev_step_cmd; + int pydev_notify_kill; + PyObject *pydev_smart_step_stop; + int pydev_django_resolve_frame; + PyObject *pydev_call_from_jinja2; + PyObject *pydev_call_inside_jinja2; + int is_tracing; + PyObject *conditional_breakpoint_exception; + PyObject *pydev_message; + int suspend_type; + int pydev_next_line; + PyObject *pydev_func_name; + int suspended_at_unhandled; + PyObject *trace_suspend_type; + PyObject *top_level_thread_tracer_no_back_frames; + PyObject *top_level_thread_tracer_unhandled; + PyObject *thread_tracer; + PyObject *step_in_initial_location; + int pydev_smart_parent_offset; + int pydev_smart_child_offset; + PyObject *pydev_smart_step_into_variants; + PyObject *target_id_to_smart_step_into_variant; + int pydev_use_scoped_step_frame; + PyObject *weak_thread; + int is_in_wait_loop; +}; + + +/* "_pydevd_bundle/pydevd_cython.pyx":435 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class _TryExceptContainerObj: # <<<<<<<<<<<<<< + * cdef public list try_except_infos; + * def __init__(self): + */ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj { + PyObject_HEAD + PyObject *try_except_infos; +}; + + +/* "_pydevd_bundle/pydevd_cython.pyx":455 + * # ======================================================================================================================= + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class PyDBFrame: # <<<<<<<<<<<<<< + * # ELSE + * # class PyDBFrame: + */ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame { + PyObject_HEAD + struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_vtab; + PyObject *_args; + int should_skip; + PyObject *exc_info; +}; + + +/* "_pydevd_bundle/pydevd_cython.pyx":1688 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class SafeCallWrapper: # <<<<<<<<<<<<<< + * cdef method_object + * def __init__(self, method_object): + */ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper { + PyObject_HEAD + PyObject *method_object; +}; + + +/* "_pydevd_bundle/pydevd_cython.pyx":1854 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class TopLevelThreadTracerOnlyUnhandledExceptions: # <<<<<<<<<<<<<< + * cdef public tuple _args; + * def __init__(self, tuple args): + */ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions { + PyObject_HEAD + PyObject *_args; +}; + + +/* "_pydevd_bundle/pydevd_cython.pyx":1885 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class TopLevelThreadTracerNoBackFrame: # <<<<<<<<<<<<<< + * cdef public object _frame_trace_dispatch; + * cdef public tuple _args; + */ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame { + PyObject_HEAD + PyObject *_frame_trace_dispatch; + PyObject *_args; + PyObject *try_except_infos; + PyObject *_last_exc_arg; + PyObject *_raise_lines; + int _last_raise_line; +}; + + +/* "_pydevd_bundle/pydevd_cython.pyx":1965 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class ThreadTracer: # <<<<<<<<<<<<<< + * cdef public tuple _args; + * def __init__(self, tuple args): + */ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer { + PyObject_HEAD + PyObject *_args; +}; + + + +/* "_pydevd_bundle/pydevd_cython.pyx":30 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class PyDBAdditionalThreadInfo: # <<<<<<<<<<<<<< + * # ELSE + * # class PyDBAdditionalThreadInfo(object): + */ + +struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo { + PyObject *(*get_topmost_frame)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, PyObject *, int __pyx_skip_dispatch); + PyObject *(*update_stepping_info)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch); + PyObject *(*_get_related_thread)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch); + int (*_is_stepping)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch); +}; +static struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; + + +/* "_pydevd_bundle/pydevd_cython.pyx":455 + * # ======================================================================================================================= + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class PyDBFrame: # <<<<<<<<<<<<<< + * # ELSE + * # class PyDBFrame: + */ + +struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame { + PyObject *(*get_func_name)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *); + PyObject *(*_show_return_values)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *); + PyObject *(*_remove_return_values)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *); + PyObject *(*_get_unfiltered_back_frame)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *); + PyObject *(*_is_same_frame)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *); + PyObject *(*trace_dispatch)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch); +}; +static struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBFrame; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* KeywordStringCheck.proto */ +static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* RaiseUnexpectedTypeError.proto */ +static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyObjectCallNoArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyObjectLookupSpecial.proto */ +#if CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS +#define __Pyx_PyObject_LookupSpecialNoError(obj, attr_name) __Pyx__PyObject_LookupSpecial(obj, attr_name, 0) +#define __Pyx_PyObject_LookupSpecial(obj, attr_name) __Pyx__PyObject_LookupSpecial(obj, attr_name, 1) +static CYTHON_INLINE PyObject* __Pyx__PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name, int with_error); +#else +#define __Pyx_PyObject_LookupSpecialNoError(o,n) __Pyx_PyObject_GetAttrStrNoError(o,n) +#define __Pyx_PyObject_LookupSpecial(o,n) __Pyx_PyObject_GetAttrStr(o,n) +#endif + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* PyObjectSetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o, n, NULL) +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value); +#else +#define __Pyx_PyObject_DelAttrStr(o,n) PyObject_DelAttr(o,n) +#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v) +#endif + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* SliceObject.proto */ +#define __Pyx_PyObject_DelSlice(obj, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound)\ + __Pyx_PyObject_SetSlice(obj, (PyObject*)NULL, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound) +static CYTHON_INLINE int __Pyx_PyObject_SetSlice( + PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* PyObjectCall2Args.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod1.proto */ +static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); + +/* append.proto */ +static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x); + +/* RaiseUnboundLocalError.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* set_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_set_iterator(PyObject* iterable, int is_set, + Py_ssize_t* p_orig_length, int* p_source_is_set); +static CYTHON_INLINE int __Pyx_set_iter_next( + PyObject* iter_obj, Py_ssize_t orig_length, + Py_ssize_t* ppos, PyObject **value, + int source_is_set); + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* pyfrozenset_new.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyFrozenSet_New(PyObject* it); + +/* py_set_discard.proto */ +static CYTHON_INLINE int __Pyx_PySet_Discard(PyObject *set, PyObject *key); + +/* PySetContains.proto */ +static CYTHON_INLINE int __Pyx_PySet_ContainsTF(PyObject* key, PyObject* set, int eq); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AndObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); +#else +#define __Pyx_PyInt_AndObjC(op1, op2, intval, inplace, zerodivision_check)\ + (inplace ? PyNumber_InPlaceAnd(op1, op2) : PyNumber_And(op1, op2)) +#endif + +/* dict_getitem_default.proto */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); + +/* UnpackUnboundCMethod.proto */ +typedef struct { + PyObject *type; + PyObject **method_name; + PyCFunction func; + PyObject *method; + int flag; +} __Pyx_CachedCFunction; + +/* CallUnboundCMethod1.proto */ +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#else +#define __Pyx_CallUnboundCMethod1(cfunc, self, arg) __Pyx__CallUnboundCMethod1(cfunc, self, arg) +#endif + +/* CallUnboundCMethod2.proto */ +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2); +#else +#define __Pyx_CallUnboundCMethod2(cfunc, self, arg1, arg2) __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2) +#endif + +/* PyObjectCallMethod0.proto */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); + +/* UnpackTupleError.proto */ +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); + +/* UnpackTuple2.proto */ +#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ + (likely(is_tuple || PyTuple_Check(tuple)) ?\ + (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ + __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ + (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ + __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); +static int __Pyx_unpack_tuple2_generic( + PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); + +/* dict_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_is_dict); +static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); + +/* PyDictContains.proto */ +static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { + int result = PyDict_Contains(dict, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* HasAttr.proto */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); + +/* py_dict_clear.proto */ +#define __Pyx_PyDict_Clear(d) (PyDict_Clear(d), 0) + +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); +#else +#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace, zerodivision_check)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) +#endif + +/* SliceTupleAndList.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_GetSlice(PyObject* src, Py_ssize_t start, Py_ssize_t stop); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_GetSlice(PyObject* src, Py_ssize_t start, Py_ssize_t stop); +#else +#define __Pyx_PyList_GetSlice(seq, start, stop) PySequence_GetSlice(seq, start, stop) +#define __Pyx_PyTuple_GetSlice(seq, start, stop) PySequence_GetSlice(seq, start, stop) +#endif + +/* PyIntCompare.proto */ +static CYTHON_INLINE int __Pyx_PyInt_BoolEqObjC(PyObject *op1, PyObject *op2, long intval, long inplace); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* ValidateBasesTuple.proto */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); +#endif + +/* PyType_Ready.proto */ +CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); + +/* GetVTable.proto */ +static void* __Pyx_GetVtable(PyTypeObject *type); + +/* MergeVTables.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type); +#endif + +/* SetupReduce.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce(PyObject* type_obj); +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_11 +#define __PYX_HAVE_RT_ImportType_proto_3_0_11 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_11(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_11(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_11 { + __Pyx_ImportType_CheckSize_Error_3_0_11 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_11 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_11 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_11(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_11 check_size); +#endif + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* FunctionExport.proto */ +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo__get_related_thread(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/ +static int __pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo__is_stepping(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_get_topmost_frame(CYTHON_UNUSED struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_thread, int __pyx_skip_dispatch); /* proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_update_stepping_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_get_func_name(CYTHON_UNUSED struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame); /* proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__show_return_values(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_arg); /* proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__remove_return_values(CYTHON_UNUSED struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_py_db, PyObject *__pyx_v_frame); /* proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__get_unfiltered_back_frame(CYTHON_UNUSED struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_py_db, PyObject *__pyx_v_frame); /* proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__is_same_frame(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_target_frame, PyObject *__pyx_v_current_frame); /* proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_trace_dispatch(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg, int __pyx_skip_dispatch); /* proto*/ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "_pydevd_bundle.pydevd_cython" */ +static PyObject *__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos = 0; +static PyObject *__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping = 0; +static PyObject *__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock = 0; +static PyObject *__pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in = 0; +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_set_additional_thread_info(PyObject *, int __pyx_skip_dispatch); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_add_additional_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_remove_additional_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch); /*proto*/ +static int __pyx_f_14_pydevd_bundle_13pydevd_cython_any_thread_stepping(int __pyx_skip_dispatch); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython__update_stepping_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_PyDBAdditionalThreadInfo__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, PyObject *); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle__TryExceptContainerObj__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *, PyObject *); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_PyDBFrame__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_SafeCallWrapper__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *, PyObject *); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *, PyObject *); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *, PyObject *); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_ThreadTracer__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *, PyObject *); /*proto*/ +/* #### Code section: typeinfo ### */ +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "_pydevd_bundle.pydevd_cython" +extern int __pyx_module_is_main__pydevd_bundle__pydevd_cython; +int __pyx_module_is_main__pydevd_bundle__pydevd_cython = 0; + +/* Implementation of "_pydevd_bundle.pydevd_cython" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_ImportError; +static PyObject *__pyx_builtin_NameError; +static PyObject *__pyx_builtin_StopIteration; +static PyObject *__pyx_builtin_id; +static PyObject *__pyx_builtin_AttributeError; +static PyObject *__pyx_builtin_KeyboardInterrupt; +static PyObject *__pyx_builtin_SystemExit; +static PyObject *__pyx_builtin_GeneratorExit; +static PyObject *__pyx_builtin_RuntimeError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_[] = ""; +static const char __pyx_k_1[] = "1"; +static const char __pyx_k_f[] = "f"; +static const char __pyx_k_i[] = "i"; +static const char __pyx_k_j[] = "j"; +static const char __pyx_k_t[] = "t"; +static const char __pyx_k__4[] = "?"; +static const char __pyx_k__8[] = "/"; +static const char __pyx_k__9[] = "\\"; +static const char __pyx_k_gc[] = "gc"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k_os[] = "os"; +static const char __pyx_k_re[] = "re"; +static const char __pyx_k_ALL[] = "ALL"; +static const char __pyx_k__10[] = "."; +static const char __pyx_k__19[] = "*"; +static const char __pyx_k_add[] = "add"; +static const char __pyx_k_arg[] = "arg"; +static const char __pyx_k_dis[] = "dis"; +static const char __pyx_k_get[] = "get"; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_pop[] = "pop"; +static const char __pyx_k_pyc[] = ".pyc"; +static const char __pyx_k_ref[] = "ref"; +static const char __pyx_k_ret[] = "ret"; +static const char __pyx_k_run[] = "run"; +static const char __pyx_k_s_s[] = "%s.%s"; +static const char __pyx_k_set[] = "set"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_None[] = "None"; +static const char __pyx_k_args[] = "args"; +static const char __pyx_k_call[] = "call"; +static const char __pyx_k_cell[] = "__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + Py_CLEAR(clear_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + Py_CLEAR(clear_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj); + Py_CLEAR(clear_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj); + Py_CLEAR(clear_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + Py_CLEAR(clear_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + Py_CLEAR(clear_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper); + Py_CLEAR(clear_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper); + Py_CLEAR(clear_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions); + Py_CLEAR(clear_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions); + Py_CLEAR(clear_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame); + Py_CLEAR(clear_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame); + Py_CLEAR(clear_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer); + Py_CLEAR(clear_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer); + Py_CLEAR(clear_module_state->__pyx_kp_s_); + Py_CLEAR(clear_module_state->__pyx_kp_s_1); + Py_CLEAR(clear_module_state->__pyx_n_s_ALL); + Py_CLEAR(clear_module_state->__pyx_n_s_AttributeError); + Py_CLEAR(clear_module_state->__pyx_n_s_CMD_SET_FUNCTION_BREAK); + Py_CLEAR(clear_module_state->__pyx_n_s_DEBUG_START); + Py_CLEAR(clear_module_state->__pyx_n_s_DEBUG_START_PY3K); + Py_CLEAR(clear_module_state->__pyx_n_s_EXCEPTION_TYPE_HANDLED); + Py_CLEAR(clear_module_state->__pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED); + Py_CLEAR(clear_module_state->__pyx_kp_s_Error_in_linecache_checkcache_r); + Py_CLEAR(clear_module_state->__pyx_kp_s_Error_in_linecache_getline_r_s_f); + Py_CLEAR(clear_module_state->__pyx_n_s_ForkSafeLock); + Py_CLEAR(clear_module_state->__pyx_n_s_GeneratorExit); + Py_CLEAR(clear_module_state->__pyx_n_s_IGNORE_EXCEPTION_TAG); + Py_CLEAR(clear_module_state->__pyx_kp_s_IgnoreException); + Py_CLEAR(clear_module_state->__pyx_kp_s_Ignore_exception_s_in_library_s); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_5); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_6); + Py_CLEAR(clear_module_state->__pyx_n_s_KeyboardInterrupt); + Py_CLEAR(clear_module_state->__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); + Py_CLEAR(clear_module_state->__pyx_n_s_NO_FTRACE); + Py_CLEAR(clear_module_state->__pyx_n_s_NameError); + Py_CLEAR(clear_module_state->__pyx_n_s_None); + Py_CLEAR(clear_module_state->__pyx_kp_s_Not_used_in_sys_monitoring_mode); + Py_CLEAR(clear_module_state->__pyx_n_s_PYDEVD_IPYTHON_CONTEXT); + Py_CLEAR(clear_module_state->__pyx_n_s_PYDEVD_USE_SYS_MONITORING); + Py_CLEAR(clear_module_state->__pyx_n_s_PYDEV_FILE); + Py_CLEAR(clear_module_state->__pyx_n_s_PYTHON_SUSPEND); + Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBAdditionalThreadInfo); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBAdditionalThreadInfo___reduc); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBAdditionalThreadInfo___setst); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBAdditionalThreadInfo__get_re); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBAdditionalThreadInfo__is_ste); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBAdditionalThreadInfo_get_top); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBAdditionalThreadInfo_update); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBFrame); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBFrame___reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBFrame___setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBFrame_do_wait_suspend); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBFrame_handle_user_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBFrame_set_suspend); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBFrame_trace_dispatch); + Py_CLEAR(clear_module_state->__pyx_n_s_PyDBFrame_trace_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_RETURN_VALUES_DICT); + Py_CLEAR(clear_module_state->__pyx_n_s_RuntimeError); + Py_CLEAR(clear_module_state->__pyx_n_s_STATE_RUN); + Py_CLEAR(clear_module_state->__pyx_n_s_STATE_SUSPEND); + Py_CLEAR(clear_module_state->__pyx_n_s_SUPPORT_GEVENT); + Py_CLEAR(clear_module_state->__pyx_n_s_SafeCallWrapper); + Py_CLEAR(clear_module_state->__pyx_n_s_SafeCallWrapper___reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_SafeCallWrapper___setstate_cytho); + Py_CLEAR(clear_module_state->__pyx_n_s_SafeCallWrapper_get_method_objec); + Py_CLEAR(clear_module_state->__pyx_kp_s_State_s_Stop_s_Cmd_s_Kill_s); + Py_CLEAR(clear_module_state->__pyx_n_s_StopAsyncIteration); + Py_CLEAR(clear_module_state->__pyx_n_s_StopIteration); + Py_CLEAR(clear_module_state->__pyx_kp_s_Stop_inside_ipython_call); + Py_CLEAR(clear_module_state->__pyx_n_s_SystemExit); + Py_CLEAR(clear_module_state->__pyx_n_s_TRACE_PROPERTY); + Py_CLEAR(clear_module_state->__pyx_n_s_Thread); + Py_CLEAR(clear_module_state->__pyx_n_s_ThreadTracer); + Py_CLEAR(clear_module_state->__pyx_n_s_ThreadTracer___reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_ThreadTracer___setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame_2); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame_3); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame_4); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame_5); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_2); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_3); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_4); + Py_CLEAR(clear_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_5); + Py_CLEAR(clear_module_state->__pyx_n_s_TryExceptContainerObj); + Py_CLEAR(clear_module_state->__pyx_n_s_TryExceptContainerObj___reduce); + Py_CLEAR(clear_module_state->__pyx_n_s_TryExceptContainerObj___setstat); + Py_CLEAR(clear_module_state->__pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA); + Py_CLEAR(clear_module_state->__pyx_kp_s_Unable_to_get_topmost_frame_for); + Py_CLEAR(clear_module_state->__pyx_kp_s__10); + Py_CLEAR(clear_module_state->__pyx_kp_u__10); + Py_CLEAR(clear_module_state->__pyx_n_s__19); + Py_CLEAR(clear_module_state->__pyx_kp_s__4); + Py_CLEAR(clear_module_state->__pyx_kp_s__8); + Py_CLEAR(clear_module_state->__pyx_kp_s__9); + Py_CLEAR(clear_module_state->__pyx_n_s_abs_real_path_and_base); + Py_CLEAR(clear_module_state->__pyx_n_s_absolute_filename); + Py_CLEAR(clear_module_state->__pyx_n_s_active); + Py_CLEAR(clear_module_state->__pyx_n_s_add); + Py_CLEAR(clear_module_state->__pyx_n_s_add_additional_info); + Py_CLEAR(clear_module_state->__pyx_n_s_add_command); + Py_CLEAR(clear_module_state->__pyx_n_s_add_exception_to_frame); + Py_CLEAR(clear_module_state->__pyx_n_s_additional_info); + Py_CLEAR(clear_module_state->__pyx_n_s_any_thread_stepping); + Py_CLEAR(clear_module_state->__pyx_n_s_append); + Py_CLEAR(clear_module_state->__pyx_n_s_apply_files_filter); + Py_CLEAR(clear_module_state->__pyx_n_s_apply_to_settrace); + Py_CLEAR(clear_module_state->__pyx_n_s_arg); + Py_CLEAR(clear_module_state->__pyx_n_s_args); + Py_CLEAR(clear_module_state->__pyx_n_s_args_2); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_basename); + Py_CLEAR(clear_module_state->__pyx_n_s_bootstrap); + Py_CLEAR(clear_module_state->__pyx_n_s_bootstrap_2); + Py_CLEAR(clear_module_state->__pyx_n_s_bootstrap_inner); + Py_CLEAR(clear_module_state->__pyx_n_s_bootstrap_inner_2); + Py_CLEAR(clear_module_state->__pyx_n_s_break_on_caught_exceptions); + Py_CLEAR(clear_module_state->__pyx_n_s_break_on_user_uncaught_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_breakpoints); + Py_CLEAR(clear_module_state->__pyx_n_s_call); + Py_CLEAR(clear_module_state->__pyx_n_s_call_2); + Py_CLEAR(clear_module_state->__pyx_n_s_can_skip); + Py_CLEAR(clear_module_state->__pyx_n_s_canonical_normalized_filename); + Py_CLEAR(clear_module_state->__pyx_kp_s_cell); + Py_CLEAR(clear_module_state->__pyx_n_s_check_excs); + Py_CLEAR(clear_module_state->__pyx_n_s_check_trace_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_checkcache); + Py_CLEAR(clear_module_state->__pyx_n_s_children_variants); + Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_cmd_factory); + Py_CLEAR(clear_module_state->__pyx_n_s_cmd_step_into); + Py_CLEAR(clear_module_state->__pyx_n_s_cmd_step_over); + Py_CLEAR(clear_module_state->__pyx_n_s_co_filename); + Py_CLEAR(clear_module_state->__pyx_n_s_co_firstlineno); + Py_CLEAR(clear_module_state->__pyx_n_s_co_flags); + Py_CLEAR(clear_module_state->__pyx_n_s_co_name); + Py_CLEAR(clear_module_state->__pyx_n_s_collect_return_info); + Py_CLEAR(clear_module_state->__pyx_n_s_collect_try_except_info); + Py_CLEAR(clear_module_state->__pyx_n_s_compile); + Py_CLEAR(clear_module_state->__pyx_n_s_condition); + Py_CLEAR(clear_module_state->__pyx_n_s_constant_to_str); + Py_CLEAR(clear_module_state->__pyx_n_s_constructed_tid_to_last_frame); + Py_CLEAR(clear_module_state->__pyx_n_s_container_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_critical); + Py_CLEAR(clear_module_state->__pyx_n_s_curr_stat); + Py_CLEAR(clear_module_state->__pyx_n_s_current_frames); + Py_CLEAR(clear_module_state->__pyx_n_s_custom_key); + Py_CLEAR(clear_module_state->__pyx_n_s_debug); + Py_CLEAR(clear_module_state->__pyx_n_s_dict); + Py_CLEAR(clear_module_state->__pyx_n_s_dict_2); + Py_CLEAR(clear_module_state->__pyx_n_s_dis); + Py_CLEAR(clear_module_state->__pyx_kp_u_disable); + Py_CLEAR(clear_module_state->__pyx_n_s_disable_tracing); + Py_CLEAR(clear_module_state->__pyx_n_s_do_wait_suspend); + Py_CLEAR(clear_module_state->__pyx_kp_u_enable); + Py_CLEAR(clear_module_state->__pyx_n_s_enable_tracing); + Py_CLEAR(clear_module_state->__pyx_n_s_encode); + Py_CLEAR(clear_module_state->__pyx_n_s_endswith); + Py_CLEAR(clear_module_state->__pyx_n_s_enter); + Py_CLEAR(clear_module_state->__pyx_n_s_event); + Py_CLEAR(clear_module_state->__pyx_n_s_exc_break); + Py_CLEAR(clear_module_state->__pyx_n_s_exc_break_caught); + Py_CLEAR(clear_module_state->__pyx_n_s_exc_break_user); + Py_CLEAR(clear_module_state->__pyx_n_s_exc_info); + Py_CLEAR(clear_module_state->__pyx_n_s_exc_lineno); + Py_CLEAR(clear_module_state->__pyx_n_s_except_line); + Py_CLEAR(clear_module_state->__pyx_n_s_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_exception_break); + Py_CLEAR(clear_module_state->__pyx_n_s_exception_breakpoint); + Py_CLEAR(clear_module_state->__pyx_n_s_exception_type); + Py_CLEAR(clear_module_state->__pyx_n_s_exclude_exception_by_filter); + Py_CLEAR(clear_module_state->__pyx_n_s_exec); + Py_CLEAR(clear_module_state->__pyx_n_s_execfile); + Py_CLEAR(clear_module_state->__pyx_n_s_exit); + Py_CLEAR(clear_module_state->__pyx_n_s_expression); + Py_CLEAR(clear_module_state->__pyx_n_s_f); + Py_CLEAR(clear_module_state->__pyx_n_s_f_back); + Py_CLEAR(clear_module_state->__pyx_n_s_f_code); + Py_CLEAR(clear_module_state->__pyx_n_s_f_globals); + Py_CLEAR(clear_module_state->__pyx_n_s_f_lasti); + Py_CLEAR(clear_module_state->__pyx_n_s_f_lineno); + Py_CLEAR(clear_module_state->__pyx_n_s_f_locals); + Py_CLEAR(clear_module_state->__pyx_n_s_f_trace); + Py_CLEAR(clear_module_state->__pyx_n_s_f_unhandled); + Py_CLEAR(clear_module_state->__pyx_n_s_filename); + Py_CLEAR(clear_module_state->__pyx_n_s_filename_to_lines_where_exceptio); + Py_CLEAR(clear_module_state->__pyx_n_s_filename_to_stat_info); + Py_CLEAR(clear_module_state->__pyx_n_s_findlinestarts); + Py_CLEAR(clear_module_state->__pyx_n_s_fix_top_level_trace_and_get_trac); + Py_CLEAR(clear_module_state->__pyx_n_s_force_only_unhandled_tracer); + Py_CLEAR(clear_module_state->__pyx_n_s_frame); + Py_CLEAR(clear_module_state->__pyx_n_s_frame_cache_key); + Py_CLEAR(clear_module_state->__pyx_n_s_frame_id_to_frame); + Py_CLEAR(clear_module_state->__pyx_n_s_frame_skips_cache); + Py_CLEAR(clear_module_state->__pyx_n_s_frame_trace_dispatch); + Py_CLEAR(clear_module_state->__pyx_n_s_from_user_input); + Py_CLEAR(clear_module_state->__pyx_n_s_func_name); + Py_CLEAR(clear_module_state->__pyx_n_s_function_breakpoint_name_to_brea); + Py_CLEAR(clear_module_state->__pyx_kp_u_gc); + Py_CLEAR(clear_module_state->__pyx_n_s_get); + Py_CLEAR(clear_module_state->__pyx_n_s_get_abs_path_real_path_and_base); + Py_CLEAR(clear_module_state->__pyx_n_s_get_breakpoint); + Py_CLEAR(clear_module_state->__pyx_n_s_get_clsname_for_code); + Py_CLEAR(clear_module_state->__pyx_n_s_get_current_thread_id); + Py_CLEAR(clear_module_state->__pyx_n_s_get_exception_breakpoint); + Py_CLEAR(clear_module_state->__pyx_n_s_get_file_type); + Py_CLEAR(clear_module_state->__pyx_n_s_get_global_debugger); + Py_CLEAR(clear_module_state->__pyx_n_s_get_internal_queue_and_event); + Py_CLEAR(clear_module_state->__pyx_n_s_get_method_object); + Py_CLEAR(clear_module_state->__pyx_n_s_get_related_thread); + Py_CLEAR(clear_module_state->__pyx_n_s_get_smart_step_into_variant_from); + Py_CLEAR(clear_module_state->__pyx_n_s_get_thread_id); + Py_CLEAR(clear_module_state->__pyx_n_s_get_topmost_frame); + Py_CLEAR(clear_module_state->__pyx_n_s_get_trace_dispatch_func); + Py_CLEAR(clear_module_state->__pyx_n_s_getline); + Py_CLEAR(clear_module_state->__pyx_n_s_getstate); + Py_CLEAR(clear_module_state->__pyx_n_s_global_cache_frame_skips); + Py_CLEAR(clear_module_state->__pyx_n_s_global_cache_skips); + Py_CLEAR(clear_module_state->__pyx_n_s_global_notify_skipped_step_in_l); + Py_CLEAR(clear_module_state->__pyx_n_s_handle_breakpoint_condition); + Py_CLEAR(clear_module_state->__pyx_n_s_handle_breakpoint_expression); + Py_CLEAR(clear_module_state->__pyx_n_s_handle_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_handle_user_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_has_condition); + Py_CLEAR(clear_module_state->__pyx_n_s_has_plugin_exception_breaks); + Py_CLEAR(clear_module_state->__pyx_n_s_has_plugin_line_breaks); + Py_CLEAR(clear_module_state->__pyx_n_s_i); + Py_CLEAR(clear_module_state->__pyx_n_s_id); + Py_CLEAR(clear_module_state->__pyx_n_s_ident); + Py_CLEAR(clear_module_state->__pyx_n_s_ident_2); + Py_CLEAR(clear_module_state->__pyx_n_s_ignore_exception_trace); + Py_CLEAR(clear_module_state->__pyx_n_s_ignore_exceptions_thrown_in_line); + Py_CLEAR(clear_module_state->__pyx_n_s_ignore_system_exit_code); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_in_project_scope); + Py_CLEAR(clear_module_state->__pyx_n_s_info); + Py_CLEAR(clear_module_state->__pyx_n_s_initial_trace_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_kp_s_invalid); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_n_s_is_files_filter_enabled); + Py_CLEAR(clear_module_state->__pyx_n_s_is_line_in_except_block); + Py_CLEAR(clear_module_state->__pyx_n_s_is_line_in_try_block); + Py_CLEAR(clear_module_state->__pyx_n_s_is_logpoint); + Py_CLEAR(clear_module_state->__pyx_n_s_is_stepping); + Py_CLEAR(clear_module_state->__pyx_n_s_is_thread_alive); + Py_CLEAR(clear_module_state->__pyx_n_s_is_unhandled_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_is_unwind); + Py_CLEAR(clear_module_state->__pyx_n_s_is_user_uncaught); + Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); + Py_CLEAR(clear_module_state->__pyx_n_s_j); + Py_CLEAR(clear_module_state->__pyx_n_s_just_raised); + Py_CLEAR(clear_module_state->__pyx_n_s_kwargs); + Py_CLEAR(clear_module_state->__pyx_kp_s_lambda); + Py_CLEAR(clear_module_state->__pyx_n_s_last_raise_line); + Py_CLEAR(clear_module_state->__pyx_n_s_last_stat); + Py_CLEAR(clear_module_state->__pyx_n_s_line); + Py_CLEAR(clear_module_state->__pyx_n_s_linecache); + Py_CLEAR(clear_module_state->__pyx_n_s_lines); + Py_CLEAR(clear_module_state->__pyx_n_s_lines_ignored); + Py_CLEAR(clear_module_state->__pyx_n_s_linesep); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_main_2); + Py_CLEAR(clear_module_state->__pyx_n_s_make_console_message); + Py_CLEAR(clear_module_state->__pyx_n_s_make_io_message); + Py_CLEAR(clear_module_state->__pyx_n_s_match); + Py_CLEAR(clear_module_state->__pyx_n_s_maybe_user_uncaught_exc_info); + Py_CLEAR(clear_module_state->__pyx_n_s_merged); + Py_CLEAR(clear_module_state->__pyx_n_s_method_object); + Py_CLEAR(clear_module_state->__pyx_kp_s_module); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_name_2); + Py_CLEAR(clear_module_state->__pyx_n_s_new); + Py_CLEAR(clear_module_state->__pyx_n_s_next_additional_info); + Py_CLEAR(clear_module_state->__pyx_n_s_notify_on_first_raise_only); + Py_CLEAR(clear_module_state->__pyx_n_s_notify_skipped_step_in_because_o); + Py_CLEAR(clear_module_state->__pyx_n_s_notify_thread_not_alive); + Py_CLEAR(clear_module_state->__pyx_n_s_original_call); + Py_CLEAR(clear_module_state->__pyx_n_s_original_step_cmd); + Py_CLEAR(clear_module_state->__pyx_n_s_os); + Py_CLEAR(clear_module_state->__pyx_n_s_os_path); + Py_CLEAR(clear_module_state->__pyx_n_s_path); + Py_CLEAR(clear_module_state->__pyx_n_s_pickle); + Py_CLEAR(clear_module_state->__pyx_n_s_plugin); + Py_CLEAR(clear_module_state->__pyx_n_s_pop); + Py_CLEAR(clear_module_state->__pyx_n_s_prev_user_uncaught_exc_info); + Py_CLEAR(clear_module_state->__pyx_n_s_py_db); + Py_CLEAR(clear_module_state->__pyx_kp_s_pyc); + Py_CLEAR(clear_module_state->__pyx_n_s_pydb_disposed); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_bundle); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_bundle__pydev_saved_modul); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_bundle_pydev_is_thread_al); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_bundle_pydev_log); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_do_not_trace); + Py_CLEAR(clear_module_state->__pyx_kp_s_pydev_execfile_py); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_log); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_log_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_monkey); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_bytecode_u); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_comm_const); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_constants); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_cython); + Py_CLEAR(clear_module_state->__pyx_kp_s_pydevd_bundle_pydevd_cython_pyx); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_frame_util); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_utils); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_dont_trace); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_file_utils); + Py_CLEAR(clear_module_state->__pyx_kp_s_pydevd_py); + Py_CLEAR(clear_module_state->__pyx_kp_s_pydevd_traceproperty_py); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_tracing); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_PyDBAdditionalThr); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_PyDBFrame); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_SafeCallWrapper); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_ThreadTracer); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_TopLevelThreadTra); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_TopLevelThreadTra_2); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle__TryExceptContain); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); + Py_CLEAR(clear_module_state->__pyx_n_s_qname); + Py_CLEAR(clear_module_state->__pyx_n_s_quitting); + Py_CLEAR(clear_module_state->__pyx_n_s_raise_lines); + Py_CLEAR(clear_module_state->__pyx_n_s_raise_lines_in_except); + Py_CLEAR(clear_module_state->__pyx_n_s_re); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); + Py_CLEAR(clear_module_state->__pyx_n_s_ref); + Py_CLEAR(clear_module_state->__pyx_n_s_remove_additional_info); + Py_CLEAR(clear_module_state->__pyx_n_s_remove_exception_from_frame); + Py_CLEAR(clear_module_state->__pyx_n_s_remove_return_values_flag); + Py_CLEAR(clear_module_state->__pyx_n_s_result); + Py_CLEAR(clear_module_state->__pyx_n_s_ret); + Py_CLEAR(clear_module_state->__pyx_n_s_return); + Py_CLEAR(clear_module_state->__pyx_n_s_return_line); + Py_CLEAR(clear_module_state->__pyx_n_s_returns); + Py_CLEAR(clear_module_state->__pyx_n_s_rfind); + Py_CLEAR(clear_module_state->__pyx_n_s_run); + Py_CLEAR(clear_module_state->__pyx_kp_s_s_raised_from_within_the_callba); + Py_CLEAR(clear_module_state->__pyx_kp_s_s_s); + Py_CLEAR(clear_module_state->__pyx_n_s_self); + Py_CLEAR(clear_module_state->__pyx_n_s_send_caught_exception_stack); + Py_CLEAR(clear_module_state->__pyx_n_s_send_caught_exception_stack_proc); + Py_CLEAR(clear_module_state->__pyx_n_s_set); + Py_CLEAR(clear_module_state->__pyx_n_s_set_additional_thread_info); + Py_CLEAR(clear_module_state->__pyx_n_s_set_additional_thread_info_lock); + Py_CLEAR(clear_module_state->__pyx_n_s_set_suspend); + Py_CLEAR(clear_module_state->__pyx_n_s_set_trace_for_frame_and_parents); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_should_stop); + Py_CLEAR(clear_module_state->__pyx_n_s_should_stop_on_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_should_trace_hook); + Py_CLEAR(clear_module_state->__pyx_n_s_show_return_values); + Py_CLEAR(clear_module_state->__pyx_n_s_skip_on_exceptions_thrown_in_sam); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_st_mtime); + Py_CLEAR(clear_module_state->__pyx_n_s_st_size); + Py_CLEAR(clear_module_state->__pyx_n_s_startswith); + Py_CLEAR(clear_module_state->__pyx_n_s_stat); + Py_CLEAR(clear_module_state->__pyx_n_s_state); + Py_CLEAR(clear_module_state->__pyx_n_s_stop); + Py_CLEAR(clear_module_state->__pyx_n_s_stop_on_unhandled_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_stopped); + Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); + Py_CLEAR(clear_module_state->__pyx_n_s_suspend); + Py_CLEAR(clear_module_state->__pyx_n_s_suspend_other_threads); + Py_CLEAR(clear_module_state->__pyx_n_s_suspend_policy); + Py_CLEAR(clear_module_state->__pyx_n_s_suspended_at_unhandled); + Py_CLEAR(clear_module_state->__pyx_n_s_sys); + Py_CLEAR(clear_module_state->__pyx_n_s_t); + Py_CLEAR(clear_module_state->__pyx_n_s_tb_frame); + Py_CLEAR(clear_module_state->__pyx_n_s_tb_lineno); + Py_CLEAR(clear_module_state->__pyx_n_s_tb_next); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_n_s_thread); + Py_CLEAR(clear_module_state->__pyx_kp_s_thread__ident_is_None_in__get_re); + Py_CLEAR(clear_module_state->__pyx_n_s_thread_trace_func); + Py_CLEAR(clear_module_state->__pyx_n_s_thread_tracer); + Py_CLEAR(clear_module_state->__pyx_n_s_threading); + Py_CLEAR(clear_module_state->__pyx_n_s_threading_active); + Py_CLEAR(clear_module_state->__pyx_n_s_threading_current_thread); + Py_CLEAR(clear_module_state->__pyx_n_s_threading_get_ident); + Py_CLEAR(clear_module_state->__pyx_n_s_top_level_thread_tracer); + Py_CLEAR(clear_module_state->__pyx_n_s_top_level_thread_tracer_no_back); + Py_CLEAR(clear_module_state->__pyx_n_s_top_level_thread_tracer_unhandle); + Py_CLEAR(clear_module_state->__pyx_n_s_trace); + Py_CLEAR(clear_module_state->__pyx_n_s_trace_dispatch); + Py_CLEAR(clear_module_state->__pyx_n_s_trace_dispatch_and_unhandled_exc); + Py_CLEAR(clear_module_state->__pyx_n_s_trace_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_trace_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_trace_unhandled_exceptions); + Py_CLEAR(clear_module_state->__pyx_n_s_try_exc_info); + Py_CLEAR(clear_module_state->__pyx_n_s_try_except_info); + Py_CLEAR(clear_module_state->__pyx_n_s_try_except_infos); + Py_CLEAR(clear_module_state->__pyx_n_s_update); + Py_CLEAR(clear_module_state->__pyx_n_s_update_stepping_info); + Py_CLEAR(clear_module_state->__pyx_n_s_use_setstate); + Py_CLEAR(clear_module_state->__pyx_kp_s_utf_8); + Py_CLEAR(clear_module_state->__pyx_n_s_valid_try_except_infos); + Py_CLEAR(clear_module_state->__pyx_n_s_value); + Py_CLEAR(clear_module_state->__pyx_n_s_values); + Py_CLEAR(clear_module_state->__pyx_n_s_version); + Py_CLEAR(clear_module_state->__pyx_n_s_was_just_raised); + Py_CLEAR(clear_module_state->__pyx_n_s_weak_thread); + Py_CLEAR(clear_module_state->__pyx_n_s_weakref); + Py_CLEAR(clear_module_state->__pyx_n_s_writer); + Py_CLEAR(clear_module_state->__pyx_int_0); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_int_2); + Py_CLEAR(clear_module_state->__pyx_int_11); + Py_CLEAR(clear_module_state->__pyx_int_111); + Py_CLEAR(clear_module_state->__pyx_int_137); + Py_CLEAR(clear_module_state->__pyx_int_160); + Py_CLEAR(clear_module_state->__pyx_int_2424557); + Py_CLEAR(clear_module_state->__pyx_int_16751766); + Py_CLEAR(clear_module_state->__pyx_int_18997755); + Py_CLEAR(clear_module_state->__pyx_int_61391470); + Py_CLEAR(clear_module_state->__pyx_int_63705258); + Py_CLEAR(clear_module_state->__pyx_int_64458794); + Py_CLEAR(clear_module_state->__pyx_int_66451433); + Py_CLEAR(clear_module_state->__pyx_int_70528507); + Py_CLEAR(clear_module_state->__pyx_int_84338306); + Py_CLEAR(clear_module_state->__pyx_int_125568891); + Py_CLEAR(clear_module_state->__pyx_int_169093275); + Py_CLEAR(clear_module_state->__pyx_int_171613889); + Py_CLEAR(clear_module_state->__pyx_int_192493205); + Py_CLEAR(clear_module_state->__pyx_int_210464433); + Py_CLEAR(clear_module_state->__pyx_int_221489684); + Py_CLEAR(clear_module_state->__pyx_int_230645316); + Py_CLEAR(clear_module_state->__pyx_int_232881363); + Py_CLEAR(clear_module_state->__pyx_int_255484337); + Py_CLEAR(clear_module_state->__pyx_int_neg_1); + Py_CLEAR(clear_module_state->__pyx_slice__2); + Py_CLEAR(clear_module_state->__pyx_slice__6); + Py_CLEAR(clear_module_state->__pyx_tuple__3); + Py_CLEAR(clear_module_state->__pyx_tuple__5); + Py_CLEAR(clear_module_state->__pyx_tuple__7); + Py_CLEAR(clear_module_state->__pyx_tuple__11); + Py_CLEAR(clear_module_state->__pyx_tuple__12); + Py_CLEAR(clear_module_state->__pyx_tuple__13); + Py_CLEAR(clear_module_state->__pyx_tuple__14); + Py_CLEAR(clear_module_state->__pyx_tuple__15); + Py_CLEAR(clear_module_state->__pyx_tuple__16); + Py_CLEAR(clear_module_state->__pyx_tuple__17); + Py_CLEAR(clear_module_state->__pyx_tuple__18); + Py_CLEAR(clear_module_state->__pyx_tuple__20); + Py_CLEAR(clear_module_state->__pyx_tuple__23); + Py_CLEAR(clear_module_state->__pyx_tuple__26); + Py_CLEAR(clear_module_state->__pyx_tuple__28); + Py_CLEAR(clear_module_state->__pyx_tuple__30); + Py_CLEAR(clear_module_state->__pyx_tuple__32); + Py_CLEAR(clear_module_state->__pyx_tuple__36); + Py_CLEAR(clear_module_state->__pyx_tuple__37); + Py_CLEAR(clear_module_state->__pyx_tuple__39); + Py_CLEAR(clear_module_state->__pyx_tuple__40); + Py_CLEAR(clear_module_state->__pyx_tuple__41); + Py_CLEAR(clear_module_state->__pyx_tuple__42); + Py_CLEAR(clear_module_state->__pyx_tuple__46); + Py_CLEAR(clear_module_state->__pyx_tuple__49); + Py_CLEAR(clear_module_state->__pyx_tuple__51); + Py_CLEAR(clear_module_state->__pyx_tuple__53); + Py_CLEAR(clear_module_state->__pyx_tuple__57); + Py_CLEAR(clear_module_state->__pyx_tuple__59); + Py_CLEAR(clear_module_state->__pyx_tuple__60); + Py_CLEAR(clear_module_state->__pyx_tuple__62); + Py_CLEAR(clear_module_state->__pyx_tuple__67); + Py_CLEAR(clear_module_state->__pyx_tuple__69); + Py_CLEAR(clear_module_state->__pyx_tuple__71); + Py_CLEAR(clear_module_state->__pyx_tuple__76); + Py_CLEAR(clear_module_state->__pyx_tuple__85); + Py_CLEAR(clear_module_state->__pyx_codeobj__21); + Py_CLEAR(clear_module_state->__pyx_codeobj__22); + Py_CLEAR(clear_module_state->__pyx_codeobj__24); + Py_CLEAR(clear_module_state->__pyx_codeobj__25); + Py_CLEAR(clear_module_state->__pyx_codeobj__27); + Py_CLEAR(clear_module_state->__pyx_codeobj__29); + Py_CLEAR(clear_module_state->__pyx_codeobj__31); + Py_CLEAR(clear_module_state->__pyx_codeobj__33); + Py_CLEAR(clear_module_state->__pyx_codeobj__34); + Py_CLEAR(clear_module_state->__pyx_codeobj__35); + Py_CLEAR(clear_module_state->__pyx_codeobj__38); + Py_CLEAR(clear_module_state->__pyx_codeobj__43); + Py_CLEAR(clear_module_state->__pyx_codeobj__44); + Py_CLEAR(clear_module_state->__pyx_codeobj__45); + Py_CLEAR(clear_module_state->__pyx_codeobj__47); + Py_CLEAR(clear_module_state->__pyx_codeobj__48); + Py_CLEAR(clear_module_state->__pyx_codeobj__50); + Py_CLEAR(clear_module_state->__pyx_codeobj__52); + Py_CLEAR(clear_module_state->__pyx_codeobj__54); + Py_CLEAR(clear_module_state->__pyx_codeobj__55); + Py_CLEAR(clear_module_state->__pyx_codeobj__56); + Py_CLEAR(clear_module_state->__pyx_codeobj__58); + Py_CLEAR(clear_module_state->__pyx_codeobj__61); + Py_CLEAR(clear_module_state->__pyx_codeobj__63); + Py_CLEAR(clear_module_state->__pyx_codeobj__64); + Py_CLEAR(clear_module_state->__pyx_codeobj__65); + Py_CLEAR(clear_module_state->__pyx_codeobj__66); + Py_CLEAR(clear_module_state->__pyx_codeobj__68); + Py_CLEAR(clear_module_state->__pyx_codeobj__70); + Py_CLEAR(clear_module_state->__pyx_codeobj__72); + Py_CLEAR(clear_module_state->__pyx_codeobj__73); + Py_CLEAR(clear_module_state->__pyx_codeobj__74); + Py_CLEAR(clear_module_state->__pyx_codeobj__75); + Py_CLEAR(clear_module_state->__pyx_codeobj__77); + Py_CLEAR(clear_module_state->__pyx_codeobj__78); + Py_CLEAR(clear_module_state->__pyx_codeobj__79); + Py_CLEAR(clear_module_state->__pyx_codeobj__80); + Py_CLEAR(clear_module_state->__pyx_codeobj__81); + Py_CLEAR(clear_module_state->__pyx_codeobj__82); + Py_CLEAR(clear_module_state->__pyx_codeobj__83); + Py_CLEAR(clear_module_state->__pyx_codeobj__84); + Py_CLEAR(clear_module_state->__pyx_codeobj__86); + Py_CLEAR(clear_module_state->__pyx_codeobj__87); + Py_CLEAR(clear_module_state->__pyx_codeobj__88); + Py_CLEAR(clear_module_state->__pyx_codeobj__89); + Py_CLEAR(clear_module_state->__pyx_codeobj__90); + Py_CLEAR(clear_module_state->__pyx_codeobj__91); + Py_CLEAR(clear_module_state->__pyx_codeobj__92); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + Py_VISIT(traverse_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + Py_VISIT(traverse_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj); + Py_VISIT(traverse_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj); + Py_VISIT(traverse_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + Py_VISIT(traverse_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + Py_VISIT(traverse_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper); + Py_VISIT(traverse_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper); + Py_VISIT(traverse_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions); + Py_VISIT(traverse_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions); + Py_VISIT(traverse_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame); + Py_VISIT(traverse_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame); + Py_VISIT(traverse_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer); + Py_VISIT(traverse_module_state->__pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer); + Py_VISIT(traverse_module_state->__pyx_kp_s_); + Py_VISIT(traverse_module_state->__pyx_kp_s_1); + Py_VISIT(traverse_module_state->__pyx_n_s_ALL); + Py_VISIT(traverse_module_state->__pyx_n_s_AttributeError); + Py_VISIT(traverse_module_state->__pyx_n_s_CMD_SET_FUNCTION_BREAK); + Py_VISIT(traverse_module_state->__pyx_n_s_DEBUG_START); + Py_VISIT(traverse_module_state->__pyx_n_s_DEBUG_START_PY3K); + Py_VISIT(traverse_module_state->__pyx_n_s_EXCEPTION_TYPE_HANDLED); + Py_VISIT(traverse_module_state->__pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED); + Py_VISIT(traverse_module_state->__pyx_kp_s_Error_in_linecache_checkcache_r); + Py_VISIT(traverse_module_state->__pyx_kp_s_Error_in_linecache_getline_r_s_f); + Py_VISIT(traverse_module_state->__pyx_n_s_ForkSafeLock); + Py_VISIT(traverse_module_state->__pyx_n_s_GeneratorExit); + Py_VISIT(traverse_module_state->__pyx_n_s_IGNORE_EXCEPTION_TAG); + Py_VISIT(traverse_module_state->__pyx_kp_s_IgnoreException); + Py_VISIT(traverse_module_state->__pyx_kp_s_Ignore_exception_s_in_library_s); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_5); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_6); + Py_VISIT(traverse_module_state->__pyx_n_s_KeyboardInterrupt); + Py_VISIT(traverse_module_state->__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); + Py_VISIT(traverse_module_state->__pyx_n_s_NO_FTRACE); + Py_VISIT(traverse_module_state->__pyx_n_s_NameError); + Py_VISIT(traverse_module_state->__pyx_n_s_None); + Py_VISIT(traverse_module_state->__pyx_kp_s_Not_used_in_sys_monitoring_mode); + Py_VISIT(traverse_module_state->__pyx_n_s_PYDEVD_IPYTHON_CONTEXT); + Py_VISIT(traverse_module_state->__pyx_n_s_PYDEVD_USE_SYS_MONITORING); + Py_VISIT(traverse_module_state->__pyx_n_s_PYDEV_FILE); + Py_VISIT(traverse_module_state->__pyx_n_s_PYTHON_SUSPEND); + Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBAdditionalThreadInfo); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBAdditionalThreadInfo___reduc); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBAdditionalThreadInfo___setst); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBAdditionalThreadInfo__get_re); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBAdditionalThreadInfo__is_ste); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBAdditionalThreadInfo_get_top); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBAdditionalThreadInfo_update); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBFrame); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBFrame___reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBFrame___setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBFrame_do_wait_suspend); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBFrame_handle_user_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBFrame_set_suspend); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBFrame_trace_dispatch); + Py_VISIT(traverse_module_state->__pyx_n_s_PyDBFrame_trace_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_RETURN_VALUES_DICT); + Py_VISIT(traverse_module_state->__pyx_n_s_RuntimeError); + Py_VISIT(traverse_module_state->__pyx_n_s_STATE_RUN); + Py_VISIT(traverse_module_state->__pyx_n_s_STATE_SUSPEND); + Py_VISIT(traverse_module_state->__pyx_n_s_SUPPORT_GEVENT); + Py_VISIT(traverse_module_state->__pyx_n_s_SafeCallWrapper); + Py_VISIT(traverse_module_state->__pyx_n_s_SafeCallWrapper___reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_SafeCallWrapper___setstate_cytho); + Py_VISIT(traverse_module_state->__pyx_n_s_SafeCallWrapper_get_method_objec); + Py_VISIT(traverse_module_state->__pyx_kp_s_State_s_Stop_s_Cmd_s_Kill_s); + Py_VISIT(traverse_module_state->__pyx_n_s_StopAsyncIteration); + Py_VISIT(traverse_module_state->__pyx_n_s_StopIteration); + Py_VISIT(traverse_module_state->__pyx_kp_s_Stop_inside_ipython_call); + Py_VISIT(traverse_module_state->__pyx_n_s_SystemExit); + Py_VISIT(traverse_module_state->__pyx_n_s_TRACE_PROPERTY); + Py_VISIT(traverse_module_state->__pyx_n_s_Thread); + Py_VISIT(traverse_module_state->__pyx_n_s_ThreadTracer); + Py_VISIT(traverse_module_state->__pyx_n_s_ThreadTracer___reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_ThreadTracer___setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame_2); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame_3); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame_4); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerNoBackFrame_5); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_2); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_3); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_4); + Py_VISIT(traverse_module_state->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_5); + Py_VISIT(traverse_module_state->__pyx_n_s_TryExceptContainerObj); + Py_VISIT(traverse_module_state->__pyx_n_s_TryExceptContainerObj___reduce); + Py_VISIT(traverse_module_state->__pyx_n_s_TryExceptContainerObj___setstat); + Py_VISIT(traverse_module_state->__pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA); + Py_VISIT(traverse_module_state->__pyx_kp_s_Unable_to_get_topmost_frame_for); + Py_VISIT(traverse_module_state->__pyx_kp_s__10); + Py_VISIT(traverse_module_state->__pyx_kp_u__10); + Py_VISIT(traverse_module_state->__pyx_n_s__19); + Py_VISIT(traverse_module_state->__pyx_kp_s__4); + Py_VISIT(traverse_module_state->__pyx_kp_s__8); + Py_VISIT(traverse_module_state->__pyx_kp_s__9); + Py_VISIT(traverse_module_state->__pyx_n_s_abs_real_path_and_base); + Py_VISIT(traverse_module_state->__pyx_n_s_absolute_filename); + Py_VISIT(traverse_module_state->__pyx_n_s_active); + Py_VISIT(traverse_module_state->__pyx_n_s_add); + Py_VISIT(traverse_module_state->__pyx_n_s_add_additional_info); + Py_VISIT(traverse_module_state->__pyx_n_s_add_command); + Py_VISIT(traverse_module_state->__pyx_n_s_add_exception_to_frame); + Py_VISIT(traverse_module_state->__pyx_n_s_additional_info); + Py_VISIT(traverse_module_state->__pyx_n_s_any_thread_stepping); + Py_VISIT(traverse_module_state->__pyx_n_s_append); + Py_VISIT(traverse_module_state->__pyx_n_s_apply_files_filter); + Py_VISIT(traverse_module_state->__pyx_n_s_apply_to_settrace); + Py_VISIT(traverse_module_state->__pyx_n_s_arg); + Py_VISIT(traverse_module_state->__pyx_n_s_args); + Py_VISIT(traverse_module_state->__pyx_n_s_args_2); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_basename); + Py_VISIT(traverse_module_state->__pyx_n_s_bootstrap); + Py_VISIT(traverse_module_state->__pyx_n_s_bootstrap_2); + Py_VISIT(traverse_module_state->__pyx_n_s_bootstrap_inner); + Py_VISIT(traverse_module_state->__pyx_n_s_bootstrap_inner_2); + Py_VISIT(traverse_module_state->__pyx_n_s_break_on_caught_exceptions); + Py_VISIT(traverse_module_state->__pyx_n_s_break_on_user_uncaught_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_breakpoints); + Py_VISIT(traverse_module_state->__pyx_n_s_call); + Py_VISIT(traverse_module_state->__pyx_n_s_call_2); + Py_VISIT(traverse_module_state->__pyx_n_s_can_skip); + Py_VISIT(traverse_module_state->__pyx_n_s_canonical_normalized_filename); + Py_VISIT(traverse_module_state->__pyx_kp_s_cell); + Py_VISIT(traverse_module_state->__pyx_n_s_check_excs); + Py_VISIT(traverse_module_state->__pyx_n_s_check_trace_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_checkcache); + Py_VISIT(traverse_module_state->__pyx_n_s_children_variants); + Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_cmd_factory); + Py_VISIT(traverse_module_state->__pyx_n_s_cmd_step_into); + Py_VISIT(traverse_module_state->__pyx_n_s_cmd_step_over); + Py_VISIT(traverse_module_state->__pyx_n_s_co_filename); + Py_VISIT(traverse_module_state->__pyx_n_s_co_firstlineno); + Py_VISIT(traverse_module_state->__pyx_n_s_co_flags); + Py_VISIT(traverse_module_state->__pyx_n_s_co_name); + Py_VISIT(traverse_module_state->__pyx_n_s_collect_return_info); + Py_VISIT(traverse_module_state->__pyx_n_s_collect_try_except_info); + Py_VISIT(traverse_module_state->__pyx_n_s_compile); + Py_VISIT(traverse_module_state->__pyx_n_s_condition); + Py_VISIT(traverse_module_state->__pyx_n_s_constant_to_str); + Py_VISIT(traverse_module_state->__pyx_n_s_constructed_tid_to_last_frame); + Py_VISIT(traverse_module_state->__pyx_n_s_container_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_critical); + Py_VISIT(traverse_module_state->__pyx_n_s_curr_stat); + Py_VISIT(traverse_module_state->__pyx_n_s_current_frames); + Py_VISIT(traverse_module_state->__pyx_n_s_custom_key); + Py_VISIT(traverse_module_state->__pyx_n_s_debug); + Py_VISIT(traverse_module_state->__pyx_n_s_dict); + Py_VISIT(traverse_module_state->__pyx_n_s_dict_2); + Py_VISIT(traverse_module_state->__pyx_n_s_dis); + Py_VISIT(traverse_module_state->__pyx_kp_u_disable); + Py_VISIT(traverse_module_state->__pyx_n_s_disable_tracing); + Py_VISIT(traverse_module_state->__pyx_n_s_do_wait_suspend); + Py_VISIT(traverse_module_state->__pyx_kp_u_enable); + Py_VISIT(traverse_module_state->__pyx_n_s_enable_tracing); + Py_VISIT(traverse_module_state->__pyx_n_s_encode); + Py_VISIT(traverse_module_state->__pyx_n_s_endswith); + Py_VISIT(traverse_module_state->__pyx_n_s_enter); + Py_VISIT(traverse_module_state->__pyx_n_s_event); + Py_VISIT(traverse_module_state->__pyx_n_s_exc_break); + Py_VISIT(traverse_module_state->__pyx_n_s_exc_break_caught); + Py_VISIT(traverse_module_state->__pyx_n_s_exc_break_user); + Py_VISIT(traverse_module_state->__pyx_n_s_exc_info); + Py_VISIT(traverse_module_state->__pyx_n_s_exc_lineno); + Py_VISIT(traverse_module_state->__pyx_n_s_except_line); + Py_VISIT(traverse_module_state->__pyx_n_s_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_exception_break); + Py_VISIT(traverse_module_state->__pyx_n_s_exception_breakpoint); + Py_VISIT(traverse_module_state->__pyx_n_s_exception_type); + Py_VISIT(traverse_module_state->__pyx_n_s_exclude_exception_by_filter); + Py_VISIT(traverse_module_state->__pyx_n_s_exec); + Py_VISIT(traverse_module_state->__pyx_n_s_execfile); + Py_VISIT(traverse_module_state->__pyx_n_s_exit); + Py_VISIT(traverse_module_state->__pyx_n_s_expression); + Py_VISIT(traverse_module_state->__pyx_n_s_f); + Py_VISIT(traverse_module_state->__pyx_n_s_f_back); + Py_VISIT(traverse_module_state->__pyx_n_s_f_code); + Py_VISIT(traverse_module_state->__pyx_n_s_f_globals); + Py_VISIT(traverse_module_state->__pyx_n_s_f_lasti); + Py_VISIT(traverse_module_state->__pyx_n_s_f_lineno); + Py_VISIT(traverse_module_state->__pyx_n_s_f_locals); + Py_VISIT(traverse_module_state->__pyx_n_s_f_trace); + Py_VISIT(traverse_module_state->__pyx_n_s_f_unhandled); + Py_VISIT(traverse_module_state->__pyx_n_s_filename); + Py_VISIT(traverse_module_state->__pyx_n_s_filename_to_lines_where_exceptio); + Py_VISIT(traverse_module_state->__pyx_n_s_filename_to_stat_info); + Py_VISIT(traverse_module_state->__pyx_n_s_findlinestarts); + Py_VISIT(traverse_module_state->__pyx_n_s_fix_top_level_trace_and_get_trac); + Py_VISIT(traverse_module_state->__pyx_n_s_force_only_unhandled_tracer); + Py_VISIT(traverse_module_state->__pyx_n_s_frame); + Py_VISIT(traverse_module_state->__pyx_n_s_frame_cache_key); + Py_VISIT(traverse_module_state->__pyx_n_s_frame_id_to_frame); + Py_VISIT(traverse_module_state->__pyx_n_s_frame_skips_cache); + Py_VISIT(traverse_module_state->__pyx_n_s_frame_trace_dispatch); + Py_VISIT(traverse_module_state->__pyx_n_s_from_user_input); + Py_VISIT(traverse_module_state->__pyx_n_s_func_name); + Py_VISIT(traverse_module_state->__pyx_n_s_function_breakpoint_name_to_brea); + Py_VISIT(traverse_module_state->__pyx_kp_u_gc); + Py_VISIT(traverse_module_state->__pyx_n_s_get); + Py_VISIT(traverse_module_state->__pyx_n_s_get_abs_path_real_path_and_base); + Py_VISIT(traverse_module_state->__pyx_n_s_get_breakpoint); + Py_VISIT(traverse_module_state->__pyx_n_s_get_clsname_for_code); + Py_VISIT(traverse_module_state->__pyx_n_s_get_current_thread_id); + Py_VISIT(traverse_module_state->__pyx_n_s_get_exception_breakpoint); + Py_VISIT(traverse_module_state->__pyx_n_s_get_file_type); + Py_VISIT(traverse_module_state->__pyx_n_s_get_global_debugger); + Py_VISIT(traverse_module_state->__pyx_n_s_get_internal_queue_and_event); + Py_VISIT(traverse_module_state->__pyx_n_s_get_method_object); + Py_VISIT(traverse_module_state->__pyx_n_s_get_related_thread); + Py_VISIT(traverse_module_state->__pyx_n_s_get_smart_step_into_variant_from); + Py_VISIT(traverse_module_state->__pyx_n_s_get_thread_id); + Py_VISIT(traverse_module_state->__pyx_n_s_get_topmost_frame); + Py_VISIT(traverse_module_state->__pyx_n_s_get_trace_dispatch_func); + Py_VISIT(traverse_module_state->__pyx_n_s_getline); + Py_VISIT(traverse_module_state->__pyx_n_s_getstate); + Py_VISIT(traverse_module_state->__pyx_n_s_global_cache_frame_skips); + Py_VISIT(traverse_module_state->__pyx_n_s_global_cache_skips); + Py_VISIT(traverse_module_state->__pyx_n_s_global_notify_skipped_step_in_l); + Py_VISIT(traverse_module_state->__pyx_n_s_handle_breakpoint_condition); + Py_VISIT(traverse_module_state->__pyx_n_s_handle_breakpoint_expression); + Py_VISIT(traverse_module_state->__pyx_n_s_handle_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_handle_user_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_has_condition); + Py_VISIT(traverse_module_state->__pyx_n_s_has_plugin_exception_breaks); + Py_VISIT(traverse_module_state->__pyx_n_s_has_plugin_line_breaks); + Py_VISIT(traverse_module_state->__pyx_n_s_i); + Py_VISIT(traverse_module_state->__pyx_n_s_id); + Py_VISIT(traverse_module_state->__pyx_n_s_ident); + Py_VISIT(traverse_module_state->__pyx_n_s_ident_2); + Py_VISIT(traverse_module_state->__pyx_n_s_ignore_exception_trace); + Py_VISIT(traverse_module_state->__pyx_n_s_ignore_exceptions_thrown_in_line); + Py_VISIT(traverse_module_state->__pyx_n_s_ignore_system_exit_code); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_in_project_scope); + Py_VISIT(traverse_module_state->__pyx_n_s_info); + Py_VISIT(traverse_module_state->__pyx_n_s_initial_trace_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_kp_s_invalid); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_n_s_is_files_filter_enabled); + Py_VISIT(traverse_module_state->__pyx_n_s_is_line_in_except_block); + Py_VISIT(traverse_module_state->__pyx_n_s_is_line_in_try_block); + Py_VISIT(traverse_module_state->__pyx_n_s_is_logpoint); + Py_VISIT(traverse_module_state->__pyx_n_s_is_stepping); + Py_VISIT(traverse_module_state->__pyx_n_s_is_thread_alive); + Py_VISIT(traverse_module_state->__pyx_n_s_is_unhandled_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_is_unwind); + Py_VISIT(traverse_module_state->__pyx_n_s_is_user_uncaught); + Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); + Py_VISIT(traverse_module_state->__pyx_n_s_j); + Py_VISIT(traverse_module_state->__pyx_n_s_just_raised); + Py_VISIT(traverse_module_state->__pyx_n_s_kwargs); + Py_VISIT(traverse_module_state->__pyx_kp_s_lambda); + Py_VISIT(traverse_module_state->__pyx_n_s_last_raise_line); + Py_VISIT(traverse_module_state->__pyx_n_s_last_stat); + Py_VISIT(traverse_module_state->__pyx_n_s_line); + Py_VISIT(traverse_module_state->__pyx_n_s_linecache); + Py_VISIT(traverse_module_state->__pyx_n_s_lines); + Py_VISIT(traverse_module_state->__pyx_n_s_lines_ignored); + Py_VISIT(traverse_module_state->__pyx_n_s_linesep); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_main_2); + Py_VISIT(traverse_module_state->__pyx_n_s_make_console_message); + Py_VISIT(traverse_module_state->__pyx_n_s_make_io_message); + Py_VISIT(traverse_module_state->__pyx_n_s_match); + Py_VISIT(traverse_module_state->__pyx_n_s_maybe_user_uncaught_exc_info); + Py_VISIT(traverse_module_state->__pyx_n_s_merged); + Py_VISIT(traverse_module_state->__pyx_n_s_method_object); + Py_VISIT(traverse_module_state->__pyx_kp_s_module); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_name_2); + Py_VISIT(traverse_module_state->__pyx_n_s_new); + Py_VISIT(traverse_module_state->__pyx_n_s_next_additional_info); + Py_VISIT(traverse_module_state->__pyx_n_s_notify_on_first_raise_only); + Py_VISIT(traverse_module_state->__pyx_n_s_notify_skipped_step_in_because_o); + Py_VISIT(traverse_module_state->__pyx_n_s_notify_thread_not_alive); + Py_VISIT(traverse_module_state->__pyx_n_s_original_call); + Py_VISIT(traverse_module_state->__pyx_n_s_original_step_cmd); + Py_VISIT(traverse_module_state->__pyx_n_s_os); + Py_VISIT(traverse_module_state->__pyx_n_s_os_path); + Py_VISIT(traverse_module_state->__pyx_n_s_path); + Py_VISIT(traverse_module_state->__pyx_n_s_pickle); + Py_VISIT(traverse_module_state->__pyx_n_s_plugin); + Py_VISIT(traverse_module_state->__pyx_n_s_pop); + Py_VISIT(traverse_module_state->__pyx_n_s_prev_user_uncaught_exc_info); + Py_VISIT(traverse_module_state->__pyx_n_s_py_db); + Py_VISIT(traverse_module_state->__pyx_kp_s_pyc); + Py_VISIT(traverse_module_state->__pyx_n_s_pydb_disposed); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_bundle); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_bundle__pydev_saved_modul); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_bundle_pydev_is_thread_al); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_bundle_pydev_log); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_do_not_trace); + Py_VISIT(traverse_module_state->__pyx_kp_s_pydev_execfile_py); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_log); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_log_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_monkey); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_bytecode_u); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_comm_const); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_constants); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_cython); + Py_VISIT(traverse_module_state->__pyx_kp_s_pydevd_bundle_pydevd_cython_pyx); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_frame_util); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_utils); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_dont_trace); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_file_utils); + Py_VISIT(traverse_module_state->__pyx_kp_s_pydevd_py); + Py_VISIT(traverse_module_state->__pyx_kp_s_pydevd_traceproperty_py); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_tracing); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_PyDBAdditionalThr); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_PyDBFrame); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_SafeCallWrapper); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_ThreadTracer); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_TopLevelThreadTra); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_TopLevelThreadTra_2); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle__TryExceptContain); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); + Py_VISIT(traverse_module_state->__pyx_n_s_qname); + Py_VISIT(traverse_module_state->__pyx_n_s_quitting); + Py_VISIT(traverse_module_state->__pyx_n_s_raise_lines); + Py_VISIT(traverse_module_state->__pyx_n_s_raise_lines_in_except); + Py_VISIT(traverse_module_state->__pyx_n_s_re); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); + Py_VISIT(traverse_module_state->__pyx_n_s_ref); + Py_VISIT(traverse_module_state->__pyx_n_s_remove_additional_info); + Py_VISIT(traverse_module_state->__pyx_n_s_remove_exception_from_frame); + Py_VISIT(traverse_module_state->__pyx_n_s_remove_return_values_flag); + Py_VISIT(traverse_module_state->__pyx_n_s_result); + Py_VISIT(traverse_module_state->__pyx_n_s_ret); + Py_VISIT(traverse_module_state->__pyx_n_s_return); + Py_VISIT(traverse_module_state->__pyx_n_s_return_line); + Py_VISIT(traverse_module_state->__pyx_n_s_returns); + Py_VISIT(traverse_module_state->__pyx_n_s_rfind); + Py_VISIT(traverse_module_state->__pyx_n_s_run); + Py_VISIT(traverse_module_state->__pyx_kp_s_s_raised_from_within_the_callba); + Py_VISIT(traverse_module_state->__pyx_kp_s_s_s); + Py_VISIT(traverse_module_state->__pyx_n_s_self); + Py_VISIT(traverse_module_state->__pyx_n_s_send_caught_exception_stack); + Py_VISIT(traverse_module_state->__pyx_n_s_send_caught_exception_stack_proc); + Py_VISIT(traverse_module_state->__pyx_n_s_set); + Py_VISIT(traverse_module_state->__pyx_n_s_set_additional_thread_info); + Py_VISIT(traverse_module_state->__pyx_n_s_set_additional_thread_info_lock); + Py_VISIT(traverse_module_state->__pyx_n_s_set_suspend); + Py_VISIT(traverse_module_state->__pyx_n_s_set_trace_for_frame_and_parents); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_should_stop); + Py_VISIT(traverse_module_state->__pyx_n_s_should_stop_on_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_should_trace_hook); + Py_VISIT(traverse_module_state->__pyx_n_s_show_return_values); + Py_VISIT(traverse_module_state->__pyx_n_s_skip_on_exceptions_thrown_in_sam); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_st_mtime); + Py_VISIT(traverse_module_state->__pyx_n_s_st_size); + Py_VISIT(traverse_module_state->__pyx_n_s_startswith); + Py_VISIT(traverse_module_state->__pyx_n_s_stat); + Py_VISIT(traverse_module_state->__pyx_n_s_state); + Py_VISIT(traverse_module_state->__pyx_n_s_stop); + Py_VISIT(traverse_module_state->__pyx_n_s_stop_on_unhandled_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_stopped); + Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); + Py_VISIT(traverse_module_state->__pyx_n_s_suspend); + Py_VISIT(traverse_module_state->__pyx_n_s_suspend_other_threads); + Py_VISIT(traverse_module_state->__pyx_n_s_suspend_policy); + Py_VISIT(traverse_module_state->__pyx_n_s_suspended_at_unhandled); + Py_VISIT(traverse_module_state->__pyx_n_s_sys); + Py_VISIT(traverse_module_state->__pyx_n_s_t); + Py_VISIT(traverse_module_state->__pyx_n_s_tb_frame); + Py_VISIT(traverse_module_state->__pyx_n_s_tb_lineno); + Py_VISIT(traverse_module_state->__pyx_n_s_tb_next); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_n_s_thread); + Py_VISIT(traverse_module_state->__pyx_kp_s_thread__ident_is_None_in__get_re); + Py_VISIT(traverse_module_state->__pyx_n_s_thread_trace_func); + Py_VISIT(traverse_module_state->__pyx_n_s_thread_tracer); + Py_VISIT(traverse_module_state->__pyx_n_s_threading); + Py_VISIT(traverse_module_state->__pyx_n_s_threading_active); + Py_VISIT(traverse_module_state->__pyx_n_s_threading_current_thread); + Py_VISIT(traverse_module_state->__pyx_n_s_threading_get_ident); + Py_VISIT(traverse_module_state->__pyx_n_s_top_level_thread_tracer); + Py_VISIT(traverse_module_state->__pyx_n_s_top_level_thread_tracer_no_back); + Py_VISIT(traverse_module_state->__pyx_n_s_top_level_thread_tracer_unhandle); + Py_VISIT(traverse_module_state->__pyx_n_s_trace); + Py_VISIT(traverse_module_state->__pyx_n_s_trace_dispatch); + Py_VISIT(traverse_module_state->__pyx_n_s_trace_dispatch_and_unhandled_exc); + Py_VISIT(traverse_module_state->__pyx_n_s_trace_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_trace_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_trace_unhandled_exceptions); + Py_VISIT(traverse_module_state->__pyx_n_s_try_exc_info); + Py_VISIT(traverse_module_state->__pyx_n_s_try_except_info); + Py_VISIT(traverse_module_state->__pyx_n_s_try_except_infos); + Py_VISIT(traverse_module_state->__pyx_n_s_update); + Py_VISIT(traverse_module_state->__pyx_n_s_update_stepping_info); + Py_VISIT(traverse_module_state->__pyx_n_s_use_setstate); + Py_VISIT(traverse_module_state->__pyx_kp_s_utf_8); + Py_VISIT(traverse_module_state->__pyx_n_s_valid_try_except_infos); + Py_VISIT(traverse_module_state->__pyx_n_s_value); + Py_VISIT(traverse_module_state->__pyx_n_s_values); + Py_VISIT(traverse_module_state->__pyx_n_s_version); + Py_VISIT(traverse_module_state->__pyx_n_s_was_just_raised); + Py_VISIT(traverse_module_state->__pyx_n_s_weak_thread); + Py_VISIT(traverse_module_state->__pyx_n_s_weakref); + Py_VISIT(traverse_module_state->__pyx_n_s_writer); + Py_VISIT(traverse_module_state->__pyx_int_0); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_int_2); + Py_VISIT(traverse_module_state->__pyx_int_11); + Py_VISIT(traverse_module_state->__pyx_int_111); + Py_VISIT(traverse_module_state->__pyx_int_137); + Py_VISIT(traverse_module_state->__pyx_int_160); + Py_VISIT(traverse_module_state->__pyx_int_2424557); + Py_VISIT(traverse_module_state->__pyx_int_16751766); + Py_VISIT(traverse_module_state->__pyx_int_18997755); + Py_VISIT(traverse_module_state->__pyx_int_61391470); + Py_VISIT(traverse_module_state->__pyx_int_63705258); + Py_VISIT(traverse_module_state->__pyx_int_64458794); + Py_VISIT(traverse_module_state->__pyx_int_66451433); + Py_VISIT(traverse_module_state->__pyx_int_70528507); + Py_VISIT(traverse_module_state->__pyx_int_84338306); + Py_VISIT(traverse_module_state->__pyx_int_125568891); + Py_VISIT(traverse_module_state->__pyx_int_169093275); + Py_VISIT(traverse_module_state->__pyx_int_171613889); + Py_VISIT(traverse_module_state->__pyx_int_192493205); + Py_VISIT(traverse_module_state->__pyx_int_210464433); + Py_VISIT(traverse_module_state->__pyx_int_221489684); + Py_VISIT(traverse_module_state->__pyx_int_230645316); + Py_VISIT(traverse_module_state->__pyx_int_232881363); + Py_VISIT(traverse_module_state->__pyx_int_255484337); + Py_VISIT(traverse_module_state->__pyx_int_neg_1); + Py_VISIT(traverse_module_state->__pyx_slice__2); + Py_VISIT(traverse_module_state->__pyx_slice__6); + Py_VISIT(traverse_module_state->__pyx_tuple__3); + Py_VISIT(traverse_module_state->__pyx_tuple__5); + Py_VISIT(traverse_module_state->__pyx_tuple__7); + Py_VISIT(traverse_module_state->__pyx_tuple__11); + Py_VISIT(traverse_module_state->__pyx_tuple__12); + Py_VISIT(traverse_module_state->__pyx_tuple__13); + Py_VISIT(traverse_module_state->__pyx_tuple__14); + Py_VISIT(traverse_module_state->__pyx_tuple__15); + Py_VISIT(traverse_module_state->__pyx_tuple__16); + Py_VISIT(traverse_module_state->__pyx_tuple__17); + Py_VISIT(traverse_module_state->__pyx_tuple__18); + Py_VISIT(traverse_module_state->__pyx_tuple__20); + Py_VISIT(traverse_module_state->__pyx_tuple__23); + Py_VISIT(traverse_module_state->__pyx_tuple__26); + Py_VISIT(traverse_module_state->__pyx_tuple__28); + Py_VISIT(traverse_module_state->__pyx_tuple__30); + Py_VISIT(traverse_module_state->__pyx_tuple__32); + Py_VISIT(traverse_module_state->__pyx_tuple__36); + Py_VISIT(traverse_module_state->__pyx_tuple__37); + Py_VISIT(traverse_module_state->__pyx_tuple__39); + Py_VISIT(traverse_module_state->__pyx_tuple__40); + Py_VISIT(traverse_module_state->__pyx_tuple__41); + Py_VISIT(traverse_module_state->__pyx_tuple__42); + Py_VISIT(traverse_module_state->__pyx_tuple__46); + Py_VISIT(traverse_module_state->__pyx_tuple__49); + Py_VISIT(traverse_module_state->__pyx_tuple__51); + Py_VISIT(traverse_module_state->__pyx_tuple__53); + Py_VISIT(traverse_module_state->__pyx_tuple__57); + Py_VISIT(traverse_module_state->__pyx_tuple__59); + Py_VISIT(traverse_module_state->__pyx_tuple__60); + Py_VISIT(traverse_module_state->__pyx_tuple__62); + Py_VISIT(traverse_module_state->__pyx_tuple__67); + Py_VISIT(traverse_module_state->__pyx_tuple__69); + Py_VISIT(traverse_module_state->__pyx_tuple__71); + Py_VISIT(traverse_module_state->__pyx_tuple__76); + Py_VISIT(traverse_module_state->__pyx_tuple__85); + Py_VISIT(traverse_module_state->__pyx_codeobj__21); + Py_VISIT(traverse_module_state->__pyx_codeobj__22); + Py_VISIT(traverse_module_state->__pyx_codeobj__24); + Py_VISIT(traverse_module_state->__pyx_codeobj__25); + Py_VISIT(traverse_module_state->__pyx_codeobj__27); + Py_VISIT(traverse_module_state->__pyx_codeobj__29); + Py_VISIT(traverse_module_state->__pyx_codeobj__31); + Py_VISIT(traverse_module_state->__pyx_codeobj__33); + Py_VISIT(traverse_module_state->__pyx_codeobj__34); + Py_VISIT(traverse_module_state->__pyx_codeobj__35); + Py_VISIT(traverse_module_state->__pyx_codeobj__38); + Py_VISIT(traverse_module_state->__pyx_codeobj__43); + Py_VISIT(traverse_module_state->__pyx_codeobj__44); + Py_VISIT(traverse_module_state->__pyx_codeobj__45); + Py_VISIT(traverse_module_state->__pyx_codeobj__47); + Py_VISIT(traverse_module_state->__pyx_codeobj__48); + Py_VISIT(traverse_module_state->__pyx_codeobj__50); + Py_VISIT(traverse_module_state->__pyx_codeobj__52); + Py_VISIT(traverse_module_state->__pyx_codeobj__54); + Py_VISIT(traverse_module_state->__pyx_codeobj__55); + Py_VISIT(traverse_module_state->__pyx_codeobj__56); + Py_VISIT(traverse_module_state->__pyx_codeobj__58); + Py_VISIT(traverse_module_state->__pyx_codeobj__61); + Py_VISIT(traverse_module_state->__pyx_codeobj__63); + Py_VISIT(traverse_module_state->__pyx_codeobj__64); + Py_VISIT(traverse_module_state->__pyx_codeobj__65); + Py_VISIT(traverse_module_state->__pyx_codeobj__66); + Py_VISIT(traverse_module_state->__pyx_codeobj__68); + Py_VISIT(traverse_module_state->__pyx_codeobj__70); + Py_VISIT(traverse_module_state->__pyx_codeobj__72); + Py_VISIT(traverse_module_state->__pyx_codeobj__73); + Py_VISIT(traverse_module_state->__pyx_codeobj__74); + Py_VISIT(traverse_module_state->__pyx_codeobj__75); + Py_VISIT(traverse_module_state->__pyx_codeobj__77); + Py_VISIT(traverse_module_state->__pyx_codeobj__78); + Py_VISIT(traverse_module_state->__pyx_codeobj__79); + Py_VISIT(traverse_module_state->__pyx_codeobj__80); + Py_VISIT(traverse_module_state->__pyx_codeobj__81); + Py_VISIT(traverse_module_state->__pyx_codeobj__82); + Py_VISIT(traverse_module_state->__pyx_codeobj__83); + Py_VISIT(traverse_module_state->__pyx_codeobj__84); + Py_VISIT(traverse_module_state->__pyx_codeobj__86); + Py_VISIT(traverse_module_state->__pyx_codeobj__87); + Py_VISIT(traverse_module_state->__pyx_codeobj__88); + Py_VISIT(traverse_module_state->__pyx_codeobj__89); + Py_VISIT(traverse_module_state->__pyx_codeobj__90); + Py_VISIT(traverse_module_state->__pyx_codeobj__91); + Py_VISIT(traverse_module_state->__pyx_codeobj__92); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#define __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo __pyx_mstate_global->__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo +#define __pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj __pyx_mstate_global->__pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj +#define __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame __pyx_mstate_global->__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame +#define __pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper __pyx_mstate_global->__pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper +#define __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions __pyx_mstate_global->__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions +#define __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame __pyx_mstate_global->__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame +#define __pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer __pyx_mstate_global->__pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer +#endif +#define __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo __pyx_mstate_global->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo +#define __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj __pyx_mstate_global->__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj +#define __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame __pyx_mstate_global->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame +#define __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper __pyx_mstate_global->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper +#define __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions __pyx_mstate_global->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions +#define __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame __pyx_mstate_global->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame +#define __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer __pyx_mstate_global->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer +#define __pyx_kp_s_ __pyx_mstate_global->__pyx_kp_s_ +#define __pyx_kp_s_1 __pyx_mstate_global->__pyx_kp_s_1 +#define __pyx_n_s_ALL __pyx_mstate_global->__pyx_n_s_ALL +#define __pyx_n_s_AttributeError __pyx_mstate_global->__pyx_n_s_AttributeError +#define __pyx_n_s_CMD_SET_FUNCTION_BREAK __pyx_mstate_global->__pyx_n_s_CMD_SET_FUNCTION_BREAK +#define __pyx_n_s_DEBUG_START __pyx_mstate_global->__pyx_n_s_DEBUG_START +#define __pyx_n_s_DEBUG_START_PY3K __pyx_mstate_global->__pyx_n_s_DEBUG_START_PY3K +#define __pyx_n_s_EXCEPTION_TYPE_HANDLED __pyx_mstate_global->__pyx_n_s_EXCEPTION_TYPE_HANDLED +#define __pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED __pyx_mstate_global->__pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED +#define __pyx_kp_s_Error_in_linecache_checkcache_r __pyx_mstate_global->__pyx_kp_s_Error_in_linecache_checkcache_r +#define __pyx_kp_s_Error_in_linecache_getline_r_s_f __pyx_mstate_global->__pyx_kp_s_Error_in_linecache_getline_r_s_f +#define __pyx_n_s_ForkSafeLock __pyx_mstate_global->__pyx_n_s_ForkSafeLock +#define __pyx_n_s_GeneratorExit __pyx_mstate_global->__pyx_n_s_GeneratorExit +#define __pyx_n_s_IGNORE_EXCEPTION_TAG __pyx_mstate_global->__pyx_n_s_IGNORE_EXCEPTION_TAG +#define __pyx_kp_s_IgnoreException __pyx_mstate_global->__pyx_kp_s_IgnoreException +#define __pyx_kp_s_Ignore_exception_s_in_library_s __pyx_mstate_global->__pyx_kp_s_Ignore_exception_s_in_library_s +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2 +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3 +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4 +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_5 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_5 +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_6 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_6 +#define __pyx_n_s_KeyboardInterrupt __pyx_mstate_global->__pyx_n_s_KeyboardInterrupt +#define __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER __pyx_mstate_global->__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER +#define __pyx_n_s_NO_FTRACE __pyx_mstate_global->__pyx_n_s_NO_FTRACE +#define __pyx_n_s_NameError __pyx_mstate_global->__pyx_n_s_NameError +#define __pyx_n_s_None __pyx_mstate_global->__pyx_n_s_None +#define __pyx_kp_s_Not_used_in_sys_monitoring_mode __pyx_mstate_global->__pyx_kp_s_Not_used_in_sys_monitoring_mode +#define __pyx_n_s_PYDEVD_IPYTHON_CONTEXT __pyx_mstate_global->__pyx_n_s_PYDEVD_IPYTHON_CONTEXT +#define __pyx_n_s_PYDEVD_USE_SYS_MONITORING __pyx_mstate_global->__pyx_n_s_PYDEVD_USE_SYS_MONITORING +#define __pyx_n_s_PYDEV_FILE __pyx_mstate_global->__pyx_n_s_PYDEV_FILE +#define __pyx_n_s_PYTHON_SUSPEND __pyx_mstate_global->__pyx_n_s_PYTHON_SUSPEND +#define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError +#define __pyx_n_s_PyDBAdditionalThreadInfo __pyx_mstate_global->__pyx_n_s_PyDBAdditionalThreadInfo +#define __pyx_n_s_PyDBAdditionalThreadInfo___reduc __pyx_mstate_global->__pyx_n_s_PyDBAdditionalThreadInfo___reduc +#define __pyx_n_s_PyDBAdditionalThreadInfo___setst __pyx_mstate_global->__pyx_n_s_PyDBAdditionalThreadInfo___setst +#define __pyx_n_s_PyDBAdditionalThreadInfo__get_re __pyx_mstate_global->__pyx_n_s_PyDBAdditionalThreadInfo__get_re +#define __pyx_n_s_PyDBAdditionalThreadInfo__is_ste __pyx_mstate_global->__pyx_n_s_PyDBAdditionalThreadInfo__is_ste +#define __pyx_n_s_PyDBAdditionalThreadInfo_get_top __pyx_mstate_global->__pyx_n_s_PyDBAdditionalThreadInfo_get_top +#define __pyx_n_s_PyDBAdditionalThreadInfo_update __pyx_mstate_global->__pyx_n_s_PyDBAdditionalThreadInfo_update +#define __pyx_n_s_PyDBFrame __pyx_mstate_global->__pyx_n_s_PyDBFrame +#define __pyx_n_s_PyDBFrame___reduce_cython __pyx_mstate_global->__pyx_n_s_PyDBFrame___reduce_cython +#define __pyx_n_s_PyDBFrame___setstate_cython __pyx_mstate_global->__pyx_n_s_PyDBFrame___setstate_cython +#define __pyx_n_s_PyDBFrame_do_wait_suspend __pyx_mstate_global->__pyx_n_s_PyDBFrame_do_wait_suspend +#define __pyx_n_s_PyDBFrame_handle_user_exception __pyx_mstate_global->__pyx_n_s_PyDBFrame_handle_user_exception +#define __pyx_n_s_PyDBFrame_set_suspend __pyx_mstate_global->__pyx_n_s_PyDBFrame_set_suspend +#define __pyx_n_s_PyDBFrame_trace_dispatch __pyx_mstate_global->__pyx_n_s_PyDBFrame_trace_dispatch +#define __pyx_n_s_PyDBFrame_trace_exception __pyx_mstate_global->__pyx_n_s_PyDBFrame_trace_exception +#define __pyx_n_s_RETURN_VALUES_DICT __pyx_mstate_global->__pyx_n_s_RETURN_VALUES_DICT +#define __pyx_n_s_RuntimeError __pyx_mstate_global->__pyx_n_s_RuntimeError +#define __pyx_n_s_STATE_RUN __pyx_mstate_global->__pyx_n_s_STATE_RUN +#define __pyx_n_s_STATE_SUSPEND __pyx_mstate_global->__pyx_n_s_STATE_SUSPEND +#define __pyx_n_s_SUPPORT_GEVENT __pyx_mstate_global->__pyx_n_s_SUPPORT_GEVENT +#define __pyx_n_s_SafeCallWrapper __pyx_mstate_global->__pyx_n_s_SafeCallWrapper +#define __pyx_n_s_SafeCallWrapper___reduce_cython __pyx_mstate_global->__pyx_n_s_SafeCallWrapper___reduce_cython +#define __pyx_n_s_SafeCallWrapper___setstate_cytho __pyx_mstate_global->__pyx_n_s_SafeCallWrapper___setstate_cytho +#define __pyx_n_s_SafeCallWrapper_get_method_objec __pyx_mstate_global->__pyx_n_s_SafeCallWrapper_get_method_objec +#define __pyx_kp_s_State_s_Stop_s_Cmd_s_Kill_s __pyx_mstate_global->__pyx_kp_s_State_s_Stop_s_Cmd_s_Kill_s +#define __pyx_n_s_StopAsyncIteration __pyx_mstate_global->__pyx_n_s_StopAsyncIteration +#define __pyx_n_s_StopIteration __pyx_mstate_global->__pyx_n_s_StopIteration +#define __pyx_kp_s_Stop_inside_ipython_call __pyx_mstate_global->__pyx_kp_s_Stop_inside_ipython_call +#define __pyx_n_s_SystemExit __pyx_mstate_global->__pyx_n_s_SystemExit +#define __pyx_n_s_TRACE_PROPERTY __pyx_mstate_global->__pyx_n_s_TRACE_PROPERTY +#define __pyx_n_s_Thread __pyx_mstate_global->__pyx_n_s_Thread +#define __pyx_n_s_ThreadTracer __pyx_mstate_global->__pyx_n_s_ThreadTracer +#define __pyx_n_s_ThreadTracer___reduce_cython __pyx_mstate_global->__pyx_n_s_ThreadTracer___reduce_cython +#define __pyx_n_s_ThreadTracer___setstate_cython __pyx_mstate_global->__pyx_n_s_ThreadTracer___setstate_cython +#define __pyx_n_s_TopLevelThreadTracerNoBackFrame __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerNoBackFrame +#define __pyx_n_s_TopLevelThreadTracerNoBackFrame_2 __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerNoBackFrame_2 +#define __pyx_n_s_TopLevelThreadTracerNoBackFrame_3 __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerNoBackFrame_3 +#define __pyx_n_s_TopLevelThreadTracerNoBackFrame_4 __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerNoBackFrame_4 +#define __pyx_n_s_TopLevelThreadTracerNoBackFrame_5 __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerNoBackFrame_5 +#define __pyx_n_s_TopLevelThreadTracerOnlyUnhandle __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle +#define __pyx_n_s_TopLevelThreadTracerOnlyUnhandle_2 __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_2 +#define __pyx_n_s_TopLevelThreadTracerOnlyUnhandle_3 __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_3 +#define __pyx_n_s_TopLevelThreadTracerOnlyUnhandle_4 __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_4 +#define __pyx_n_s_TopLevelThreadTracerOnlyUnhandle_5 __pyx_mstate_global->__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_5 +#define __pyx_n_s_TryExceptContainerObj __pyx_mstate_global->__pyx_n_s_TryExceptContainerObj +#define __pyx_n_s_TryExceptContainerObj___reduce __pyx_mstate_global->__pyx_n_s_TryExceptContainerObj___reduce +#define __pyx_n_s_TryExceptContainerObj___setstat __pyx_mstate_global->__pyx_n_s_TryExceptContainerObj___setstat +#define __pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA __pyx_mstate_global->__pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA +#define __pyx_kp_s_Unable_to_get_topmost_frame_for __pyx_mstate_global->__pyx_kp_s_Unable_to_get_topmost_frame_for +#define __pyx_kp_s__10 __pyx_mstate_global->__pyx_kp_s__10 +#define __pyx_kp_u__10 __pyx_mstate_global->__pyx_kp_u__10 +#define __pyx_n_s__19 __pyx_mstate_global->__pyx_n_s__19 +#define __pyx_kp_s__4 __pyx_mstate_global->__pyx_kp_s__4 +#define __pyx_kp_s__8 __pyx_mstate_global->__pyx_kp_s__8 +#define __pyx_kp_s__9 __pyx_mstate_global->__pyx_kp_s__9 +#define __pyx_n_s_abs_real_path_and_base __pyx_mstate_global->__pyx_n_s_abs_real_path_and_base +#define __pyx_n_s_absolute_filename __pyx_mstate_global->__pyx_n_s_absolute_filename +#define __pyx_n_s_active __pyx_mstate_global->__pyx_n_s_active +#define __pyx_n_s_add __pyx_mstate_global->__pyx_n_s_add +#define __pyx_n_s_add_additional_info __pyx_mstate_global->__pyx_n_s_add_additional_info +#define __pyx_n_s_add_command __pyx_mstate_global->__pyx_n_s_add_command +#define __pyx_n_s_add_exception_to_frame __pyx_mstate_global->__pyx_n_s_add_exception_to_frame +#define __pyx_n_s_additional_info __pyx_mstate_global->__pyx_n_s_additional_info +#define __pyx_n_s_any_thread_stepping __pyx_mstate_global->__pyx_n_s_any_thread_stepping +#define __pyx_n_s_append __pyx_mstate_global->__pyx_n_s_append +#define __pyx_n_s_apply_files_filter __pyx_mstate_global->__pyx_n_s_apply_files_filter +#define __pyx_n_s_apply_to_settrace __pyx_mstate_global->__pyx_n_s_apply_to_settrace +#define __pyx_n_s_arg __pyx_mstate_global->__pyx_n_s_arg +#define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args +#define __pyx_n_s_args_2 __pyx_mstate_global->__pyx_n_s_args_2 +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_basename __pyx_mstate_global->__pyx_n_s_basename +#define __pyx_n_s_bootstrap __pyx_mstate_global->__pyx_n_s_bootstrap +#define __pyx_n_s_bootstrap_2 __pyx_mstate_global->__pyx_n_s_bootstrap_2 +#define __pyx_n_s_bootstrap_inner __pyx_mstate_global->__pyx_n_s_bootstrap_inner +#define __pyx_n_s_bootstrap_inner_2 __pyx_mstate_global->__pyx_n_s_bootstrap_inner_2 +#define __pyx_n_s_break_on_caught_exceptions __pyx_mstate_global->__pyx_n_s_break_on_caught_exceptions +#define __pyx_n_s_break_on_user_uncaught_exception __pyx_mstate_global->__pyx_n_s_break_on_user_uncaught_exception +#define __pyx_n_s_breakpoints __pyx_mstate_global->__pyx_n_s_breakpoints +#define __pyx_n_s_call __pyx_mstate_global->__pyx_n_s_call +#define __pyx_n_s_call_2 __pyx_mstate_global->__pyx_n_s_call_2 +#define __pyx_n_s_can_skip __pyx_mstate_global->__pyx_n_s_can_skip +#define __pyx_n_s_canonical_normalized_filename __pyx_mstate_global->__pyx_n_s_canonical_normalized_filename +#define __pyx_kp_s_cell __pyx_mstate_global->__pyx_kp_s_cell +#define __pyx_n_s_check_excs __pyx_mstate_global->__pyx_n_s_check_excs +#define __pyx_n_s_check_trace_obj __pyx_mstate_global->__pyx_n_s_check_trace_obj +#define __pyx_n_s_checkcache __pyx_mstate_global->__pyx_n_s_checkcache +#define __pyx_n_s_children_variants __pyx_mstate_global->__pyx_n_s_children_variants +#define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_cmd_factory __pyx_mstate_global->__pyx_n_s_cmd_factory +#define __pyx_n_s_cmd_step_into __pyx_mstate_global->__pyx_n_s_cmd_step_into +#define __pyx_n_s_cmd_step_over __pyx_mstate_global->__pyx_n_s_cmd_step_over +#define __pyx_n_s_co_filename __pyx_mstate_global->__pyx_n_s_co_filename +#define __pyx_n_s_co_firstlineno __pyx_mstate_global->__pyx_n_s_co_firstlineno +#define __pyx_n_s_co_flags __pyx_mstate_global->__pyx_n_s_co_flags +#define __pyx_n_s_co_name __pyx_mstate_global->__pyx_n_s_co_name +#define __pyx_n_s_collect_return_info __pyx_mstate_global->__pyx_n_s_collect_return_info +#define __pyx_n_s_collect_try_except_info __pyx_mstate_global->__pyx_n_s_collect_try_except_info +#define __pyx_n_s_compile __pyx_mstate_global->__pyx_n_s_compile +#define __pyx_n_s_condition __pyx_mstate_global->__pyx_n_s_condition +#define __pyx_n_s_constant_to_str __pyx_mstate_global->__pyx_n_s_constant_to_str +#define __pyx_n_s_constructed_tid_to_last_frame __pyx_mstate_global->__pyx_n_s_constructed_tid_to_last_frame +#define __pyx_n_s_container_obj __pyx_mstate_global->__pyx_n_s_container_obj +#define __pyx_n_s_critical __pyx_mstate_global->__pyx_n_s_critical +#define __pyx_n_s_curr_stat __pyx_mstate_global->__pyx_n_s_curr_stat +#define __pyx_n_s_current_frames __pyx_mstate_global->__pyx_n_s_current_frames +#define __pyx_n_s_custom_key __pyx_mstate_global->__pyx_n_s_custom_key +#define __pyx_n_s_debug __pyx_mstate_global->__pyx_n_s_debug +#define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict +#define __pyx_n_s_dict_2 __pyx_mstate_global->__pyx_n_s_dict_2 +#define __pyx_n_s_dis __pyx_mstate_global->__pyx_n_s_dis +#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable +#define __pyx_n_s_disable_tracing __pyx_mstate_global->__pyx_n_s_disable_tracing +#define __pyx_n_s_do_wait_suspend __pyx_mstate_global->__pyx_n_s_do_wait_suspend +#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable +#define __pyx_n_s_enable_tracing __pyx_mstate_global->__pyx_n_s_enable_tracing +#define __pyx_n_s_encode __pyx_mstate_global->__pyx_n_s_encode +#define __pyx_n_s_endswith __pyx_mstate_global->__pyx_n_s_endswith +#define __pyx_n_s_enter __pyx_mstate_global->__pyx_n_s_enter +#define __pyx_n_s_event __pyx_mstate_global->__pyx_n_s_event +#define __pyx_n_s_exc_break __pyx_mstate_global->__pyx_n_s_exc_break +#define __pyx_n_s_exc_break_caught __pyx_mstate_global->__pyx_n_s_exc_break_caught +#define __pyx_n_s_exc_break_user __pyx_mstate_global->__pyx_n_s_exc_break_user +#define __pyx_n_s_exc_info __pyx_mstate_global->__pyx_n_s_exc_info +#define __pyx_n_s_exc_lineno __pyx_mstate_global->__pyx_n_s_exc_lineno +#define __pyx_n_s_except_line __pyx_mstate_global->__pyx_n_s_except_line +#define __pyx_n_s_exception __pyx_mstate_global->__pyx_n_s_exception +#define __pyx_n_s_exception_break __pyx_mstate_global->__pyx_n_s_exception_break +#define __pyx_n_s_exception_breakpoint __pyx_mstate_global->__pyx_n_s_exception_breakpoint +#define __pyx_n_s_exception_type __pyx_mstate_global->__pyx_n_s_exception_type +#define __pyx_n_s_exclude_exception_by_filter __pyx_mstate_global->__pyx_n_s_exclude_exception_by_filter +#define __pyx_n_s_exec __pyx_mstate_global->__pyx_n_s_exec +#define __pyx_n_s_execfile __pyx_mstate_global->__pyx_n_s_execfile +#define __pyx_n_s_exit __pyx_mstate_global->__pyx_n_s_exit +#define __pyx_n_s_expression __pyx_mstate_global->__pyx_n_s_expression +#define __pyx_n_s_f __pyx_mstate_global->__pyx_n_s_f +#define __pyx_n_s_f_back __pyx_mstate_global->__pyx_n_s_f_back +#define __pyx_n_s_f_code __pyx_mstate_global->__pyx_n_s_f_code +#define __pyx_n_s_f_globals __pyx_mstate_global->__pyx_n_s_f_globals +#define __pyx_n_s_f_lasti __pyx_mstate_global->__pyx_n_s_f_lasti +#define __pyx_n_s_f_lineno __pyx_mstate_global->__pyx_n_s_f_lineno +#define __pyx_n_s_f_locals __pyx_mstate_global->__pyx_n_s_f_locals +#define __pyx_n_s_f_trace __pyx_mstate_global->__pyx_n_s_f_trace +#define __pyx_n_s_f_unhandled __pyx_mstate_global->__pyx_n_s_f_unhandled +#define __pyx_n_s_filename __pyx_mstate_global->__pyx_n_s_filename +#define __pyx_n_s_filename_to_lines_where_exceptio __pyx_mstate_global->__pyx_n_s_filename_to_lines_where_exceptio +#define __pyx_n_s_filename_to_stat_info __pyx_mstate_global->__pyx_n_s_filename_to_stat_info +#define __pyx_n_s_findlinestarts __pyx_mstate_global->__pyx_n_s_findlinestarts +#define __pyx_n_s_fix_top_level_trace_and_get_trac __pyx_mstate_global->__pyx_n_s_fix_top_level_trace_and_get_trac +#define __pyx_n_s_force_only_unhandled_tracer __pyx_mstate_global->__pyx_n_s_force_only_unhandled_tracer +#define __pyx_n_s_frame __pyx_mstate_global->__pyx_n_s_frame +#define __pyx_n_s_frame_cache_key __pyx_mstate_global->__pyx_n_s_frame_cache_key +#define __pyx_n_s_frame_id_to_frame __pyx_mstate_global->__pyx_n_s_frame_id_to_frame +#define __pyx_n_s_frame_skips_cache __pyx_mstate_global->__pyx_n_s_frame_skips_cache +#define __pyx_n_s_frame_trace_dispatch __pyx_mstate_global->__pyx_n_s_frame_trace_dispatch +#define __pyx_n_s_from_user_input __pyx_mstate_global->__pyx_n_s_from_user_input +#define __pyx_n_s_func_name __pyx_mstate_global->__pyx_n_s_func_name +#define __pyx_n_s_function_breakpoint_name_to_brea __pyx_mstate_global->__pyx_n_s_function_breakpoint_name_to_brea +#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc +#define __pyx_n_s_get __pyx_mstate_global->__pyx_n_s_get +#define __pyx_n_s_get_abs_path_real_path_and_base __pyx_mstate_global->__pyx_n_s_get_abs_path_real_path_and_base +#define __pyx_n_s_get_breakpoint __pyx_mstate_global->__pyx_n_s_get_breakpoint +#define __pyx_n_s_get_clsname_for_code __pyx_mstate_global->__pyx_n_s_get_clsname_for_code +#define __pyx_n_s_get_current_thread_id __pyx_mstate_global->__pyx_n_s_get_current_thread_id +#define __pyx_n_s_get_exception_breakpoint __pyx_mstate_global->__pyx_n_s_get_exception_breakpoint +#define __pyx_n_s_get_file_type __pyx_mstate_global->__pyx_n_s_get_file_type +#define __pyx_n_s_get_global_debugger __pyx_mstate_global->__pyx_n_s_get_global_debugger +#define __pyx_n_s_get_internal_queue_and_event __pyx_mstate_global->__pyx_n_s_get_internal_queue_and_event +#define __pyx_n_s_get_method_object __pyx_mstate_global->__pyx_n_s_get_method_object +#define __pyx_n_s_get_related_thread __pyx_mstate_global->__pyx_n_s_get_related_thread +#define __pyx_n_s_get_smart_step_into_variant_from __pyx_mstate_global->__pyx_n_s_get_smart_step_into_variant_from +#define __pyx_n_s_get_thread_id __pyx_mstate_global->__pyx_n_s_get_thread_id +#define __pyx_n_s_get_topmost_frame __pyx_mstate_global->__pyx_n_s_get_topmost_frame +#define __pyx_n_s_get_trace_dispatch_func __pyx_mstate_global->__pyx_n_s_get_trace_dispatch_func +#define __pyx_n_s_getline __pyx_mstate_global->__pyx_n_s_getline +#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate +#define __pyx_n_s_global_cache_frame_skips __pyx_mstate_global->__pyx_n_s_global_cache_frame_skips +#define __pyx_n_s_global_cache_skips __pyx_mstate_global->__pyx_n_s_global_cache_skips +#define __pyx_n_s_global_notify_skipped_step_in_l __pyx_mstate_global->__pyx_n_s_global_notify_skipped_step_in_l +#define __pyx_n_s_handle_breakpoint_condition __pyx_mstate_global->__pyx_n_s_handle_breakpoint_condition +#define __pyx_n_s_handle_breakpoint_expression __pyx_mstate_global->__pyx_n_s_handle_breakpoint_expression +#define __pyx_n_s_handle_exception __pyx_mstate_global->__pyx_n_s_handle_exception +#define __pyx_n_s_handle_user_exception __pyx_mstate_global->__pyx_n_s_handle_user_exception +#define __pyx_n_s_has_condition __pyx_mstate_global->__pyx_n_s_has_condition +#define __pyx_n_s_has_plugin_exception_breaks __pyx_mstate_global->__pyx_n_s_has_plugin_exception_breaks +#define __pyx_n_s_has_plugin_line_breaks __pyx_mstate_global->__pyx_n_s_has_plugin_line_breaks +#define __pyx_n_s_i __pyx_mstate_global->__pyx_n_s_i +#define __pyx_n_s_id __pyx_mstate_global->__pyx_n_s_id +#define __pyx_n_s_ident __pyx_mstate_global->__pyx_n_s_ident +#define __pyx_n_s_ident_2 __pyx_mstate_global->__pyx_n_s_ident_2 +#define __pyx_n_s_ignore_exception_trace __pyx_mstate_global->__pyx_n_s_ignore_exception_trace +#define __pyx_n_s_ignore_exceptions_thrown_in_line __pyx_mstate_global->__pyx_n_s_ignore_exceptions_thrown_in_line +#define __pyx_n_s_ignore_system_exit_code __pyx_mstate_global->__pyx_n_s_ignore_system_exit_code +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_in_project_scope __pyx_mstate_global->__pyx_n_s_in_project_scope +#define __pyx_n_s_info __pyx_mstate_global->__pyx_n_s_info +#define __pyx_n_s_initial_trace_obj __pyx_mstate_global->__pyx_n_s_initial_trace_obj +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_kp_s_invalid __pyx_mstate_global->__pyx_kp_s_invalid +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_n_s_is_files_filter_enabled __pyx_mstate_global->__pyx_n_s_is_files_filter_enabled +#define __pyx_n_s_is_line_in_except_block __pyx_mstate_global->__pyx_n_s_is_line_in_except_block +#define __pyx_n_s_is_line_in_try_block __pyx_mstate_global->__pyx_n_s_is_line_in_try_block +#define __pyx_n_s_is_logpoint __pyx_mstate_global->__pyx_n_s_is_logpoint +#define __pyx_n_s_is_stepping __pyx_mstate_global->__pyx_n_s_is_stepping +#define __pyx_n_s_is_thread_alive __pyx_mstate_global->__pyx_n_s_is_thread_alive +#define __pyx_n_s_is_unhandled_exception __pyx_mstate_global->__pyx_n_s_is_unhandled_exception +#define __pyx_n_s_is_unwind __pyx_mstate_global->__pyx_n_s_is_unwind +#define __pyx_n_s_is_user_uncaught __pyx_mstate_global->__pyx_n_s_is_user_uncaught +#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled +#define __pyx_n_s_j __pyx_mstate_global->__pyx_n_s_j +#define __pyx_n_s_just_raised __pyx_mstate_global->__pyx_n_s_just_raised +#define __pyx_n_s_kwargs __pyx_mstate_global->__pyx_n_s_kwargs +#define __pyx_kp_s_lambda __pyx_mstate_global->__pyx_kp_s_lambda +#define __pyx_n_s_last_raise_line __pyx_mstate_global->__pyx_n_s_last_raise_line +#define __pyx_n_s_last_stat __pyx_mstate_global->__pyx_n_s_last_stat +#define __pyx_n_s_line __pyx_mstate_global->__pyx_n_s_line +#define __pyx_n_s_linecache __pyx_mstate_global->__pyx_n_s_linecache +#define __pyx_n_s_lines __pyx_mstate_global->__pyx_n_s_lines +#define __pyx_n_s_lines_ignored __pyx_mstate_global->__pyx_n_s_lines_ignored +#define __pyx_n_s_linesep __pyx_mstate_global->__pyx_n_s_linesep +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_main_2 __pyx_mstate_global->__pyx_n_s_main_2 +#define __pyx_n_s_make_console_message __pyx_mstate_global->__pyx_n_s_make_console_message +#define __pyx_n_s_make_io_message __pyx_mstate_global->__pyx_n_s_make_io_message +#define __pyx_n_s_match __pyx_mstate_global->__pyx_n_s_match +#define __pyx_n_s_maybe_user_uncaught_exc_info __pyx_mstate_global->__pyx_n_s_maybe_user_uncaught_exc_info +#define __pyx_n_s_merged __pyx_mstate_global->__pyx_n_s_merged +#define __pyx_n_s_method_object __pyx_mstate_global->__pyx_n_s_method_object +#define __pyx_kp_s_module __pyx_mstate_global->__pyx_kp_s_module +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_name_2 __pyx_mstate_global->__pyx_n_s_name_2 +#define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new +#define __pyx_n_s_next_additional_info __pyx_mstate_global->__pyx_n_s_next_additional_info +#define __pyx_n_s_notify_on_first_raise_only __pyx_mstate_global->__pyx_n_s_notify_on_first_raise_only +#define __pyx_n_s_notify_skipped_step_in_because_o __pyx_mstate_global->__pyx_n_s_notify_skipped_step_in_because_o +#define __pyx_n_s_notify_thread_not_alive __pyx_mstate_global->__pyx_n_s_notify_thread_not_alive +#define __pyx_n_s_original_call __pyx_mstate_global->__pyx_n_s_original_call +#define __pyx_n_s_original_step_cmd __pyx_mstate_global->__pyx_n_s_original_step_cmd +#define __pyx_n_s_os __pyx_mstate_global->__pyx_n_s_os +#define __pyx_n_s_os_path __pyx_mstate_global->__pyx_n_s_os_path +#define __pyx_n_s_path __pyx_mstate_global->__pyx_n_s_path +#define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle +#define __pyx_n_s_plugin __pyx_mstate_global->__pyx_n_s_plugin +#define __pyx_n_s_pop __pyx_mstate_global->__pyx_n_s_pop +#define __pyx_n_s_prev_user_uncaught_exc_info __pyx_mstate_global->__pyx_n_s_prev_user_uncaught_exc_info +#define __pyx_n_s_py_db __pyx_mstate_global->__pyx_n_s_py_db +#define __pyx_kp_s_pyc __pyx_mstate_global->__pyx_kp_s_pyc +#define __pyx_n_s_pydb_disposed __pyx_mstate_global->__pyx_n_s_pydb_disposed +#define __pyx_n_s_pydev_bundle __pyx_mstate_global->__pyx_n_s_pydev_bundle +#define __pyx_n_s_pydev_bundle__pydev_saved_modul __pyx_mstate_global->__pyx_n_s_pydev_bundle__pydev_saved_modul +#define __pyx_n_s_pydev_bundle_pydev_is_thread_al __pyx_mstate_global->__pyx_n_s_pydev_bundle_pydev_is_thread_al +#define __pyx_n_s_pydev_bundle_pydev_log __pyx_mstate_global->__pyx_n_s_pydev_bundle_pydev_log +#define __pyx_n_s_pydev_do_not_trace __pyx_mstate_global->__pyx_n_s_pydev_do_not_trace +#define __pyx_kp_s_pydev_execfile_py __pyx_mstate_global->__pyx_kp_s_pydev_execfile_py +#define __pyx_n_s_pydev_log __pyx_mstate_global->__pyx_n_s_pydev_log +#define __pyx_n_s_pydev_log_exception __pyx_mstate_global->__pyx_n_s_pydev_log_exception +#define __pyx_n_s_pydev_monkey __pyx_mstate_global->__pyx_n_s_pydev_monkey +#define __pyx_n_s_pydevd __pyx_mstate_global->__pyx_n_s_pydevd +#define __pyx_n_s_pydevd_bundle __pyx_mstate_global->__pyx_n_s_pydevd_bundle +#define __pyx_n_s_pydevd_bundle_pydevd_bytecode_u __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_bytecode_u +#define __pyx_n_s_pydevd_bundle_pydevd_comm_const __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_comm_const +#define __pyx_n_s_pydevd_bundle_pydevd_constants __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_constants +#define __pyx_n_s_pydevd_bundle_pydevd_cython __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_cython +#define __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx __pyx_mstate_global->__pyx_kp_s_pydevd_bundle_pydevd_cython_pyx +#define __pyx_n_s_pydevd_bundle_pydevd_frame_util __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_frame_util +#define __pyx_n_s_pydevd_bundle_pydevd_utils __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_utils +#define __pyx_n_s_pydevd_dont_trace __pyx_mstate_global->__pyx_n_s_pydevd_dont_trace +#define __pyx_n_s_pydevd_file_utils __pyx_mstate_global->__pyx_n_s_pydevd_file_utils +#define __pyx_kp_s_pydevd_py __pyx_mstate_global->__pyx_kp_s_pydevd_py +#define __pyx_kp_s_pydevd_traceproperty_py __pyx_mstate_global->__pyx_kp_s_pydevd_traceproperty_py +#define __pyx_n_s_pydevd_tracing __pyx_mstate_global->__pyx_n_s_pydevd_tracing +#define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError +#define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum +#define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result +#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state +#define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type +#define __pyx_n_s_pyx_unpickle_PyDBAdditionalThr __pyx_mstate_global->__pyx_n_s_pyx_unpickle_PyDBAdditionalThr +#define __pyx_n_s_pyx_unpickle_PyDBFrame __pyx_mstate_global->__pyx_n_s_pyx_unpickle_PyDBFrame +#define __pyx_n_s_pyx_unpickle_SafeCallWrapper __pyx_mstate_global->__pyx_n_s_pyx_unpickle_SafeCallWrapper +#define __pyx_n_s_pyx_unpickle_ThreadTracer __pyx_mstate_global->__pyx_n_s_pyx_unpickle_ThreadTracer +#define __pyx_n_s_pyx_unpickle_TopLevelThreadTra __pyx_mstate_global->__pyx_n_s_pyx_unpickle_TopLevelThreadTra +#define __pyx_n_s_pyx_unpickle_TopLevelThreadTra_2 __pyx_mstate_global->__pyx_n_s_pyx_unpickle_TopLevelThreadTra_2 +#define __pyx_n_s_pyx_unpickle__TryExceptContain __pyx_mstate_global->__pyx_n_s_pyx_unpickle__TryExceptContain +#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable +#define __pyx_n_s_qname __pyx_mstate_global->__pyx_n_s_qname +#define __pyx_n_s_quitting __pyx_mstate_global->__pyx_n_s_quitting +#define __pyx_n_s_raise_lines __pyx_mstate_global->__pyx_n_s_raise_lines +#define __pyx_n_s_raise_lines_in_except __pyx_mstate_global->__pyx_n_s_raise_lines_in_except +#define __pyx_n_s_re __pyx_mstate_global->__pyx_n_s_re +#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce +#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython +#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex +#define __pyx_n_s_ref __pyx_mstate_global->__pyx_n_s_ref +#define __pyx_n_s_remove_additional_info __pyx_mstate_global->__pyx_n_s_remove_additional_info +#define __pyx_n_s_remove_exception_from_frame __pyx_mstate_global->__pyx_n_s_remove_exception_from_frame +#define __pyx_n_s_remove_return_values_flag __pyx_mstate_global->__pyx_n_s_remove_return_values_flag +#define __pyx_n_s_result __pyx_mstate_global->__pyx_n_s_result +#define __pyx_n_s_ret __pyx_mstate_global->__pyx_n_s_ret +#define __pyx_n_s_return __pyx_mstate_global->__pyx_n_s_return +#define __pyx_n_s_return_line __pyx_mstate_global->__pyx_n_s_return_line +#define __pyx_n_s_returns __pyx_mstate_global->__pyx_n_s_returns +#define __pyx_n_s_rfind __pyx_mstate_global->__pyx_n_s_rfind +#define __pyx_n_s_run __pyx_mstate_global->__pyx_n_s_run +#define __pyx_kp_s_s_raised_from_within_the_callba __pyx_mstate_global->__pyx_kp_s_s_raised_from_within_the_callba +#define __pyx_kp_s_s_s __pyx_mstate_global->__pyx_kp_s_s_s +#define __pyx_n_s_self __pyx_mstate_global->__pyx_n_s_self +#define __pyx_n_s_send_caught_exception_stack __pyx_mstate_global->__pyx_n_s_send_caught_exception_stack +#define __pyx_n_s_send_caught_exception_stack_proc __pyx_mstate_global->__pyx_n_s_send_caught_exception_stack_proc +#define __pyx_n_s_set __pyx_mstate_global->__pyx_n_s_set +#define __pyx_n_s_set_additional_thread_info __pyx_mstate_global->__pyx_n_s_set_additional_thread_info +#define __pyx_n_s_set_additional_thread_info_lock __pyx_mstate_global->__pyx_n_s_set_additional_thread_info_lock +#define __pyx_n_s_set_suspend __pyx_mstate_global->__pyx_n_s_set_suspend +#define __pyx_n_s_set_trace_for_frame_and_parents __pyx_mstate_global->__pyx_n_s_set_trace_for_frame_and_parents +#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate +#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython +#define __pyx_n_s_should_stop __pyx_mstate_global->__pyx_n_s_should_stop +#define __pyx_n_s_should_stop_on_exception __pyx_mstate_global->__pyx_n_s_should_stop_on_exception +#define __pyx_n_s_should_trace_hook __pyx_mstate_global->__pyx_n_s_should_trace_hook +#define __pyx_n_s_show_return_values __pyx_mstate_global->__pyx_n_s_show_return_values +#define __pyx_n_s_skip_on_exceptions_thrown_in_sam __pyx_mstate_global->__pyx_n_s_skip_on_exceptions_thrown_in_sam +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_st_mtime __pyx_mstate_global->__pyx_n_s_st_mtime +#define __pyx_n_s_st_size __pyx_mstate_global->__pyx_n_s_st_size +#define __pyx_n_s_startswith __pyx_mstate_global->__pyx_n_s_startswith +#define __pyx_n_s_stat __pyx_mstate_global->__pyx_n_s_stat +#define __pyx_n_s_state __pyx_mstate_global->__pyx_n_s_state +#define __pyx_n_s_stop __pyx_mstate_global->__pyx_n_s_stop +#define __pyx_n_s_stop_on_unhandled_exception __pyx_mstate_global->__pyx_n_s_stop_on_unhandled_exception +#define __pyx_n_s_stopped __pyx_mstate_global->__pyx_n_s_stopped +#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource +#define __pyx_n_s_suspend __pyx_mstate_global->__pyx_n_s_suspend +#define __pyx_n_s_suspend_other_threads __pyx_mstate_global->__pyx_n_s_suspend_other_threads +#define __pyx_n_s_suspend_policy __pyx_mstate_global->__pyx_n_s_suspend_policy +#define __pyx_n_s_suspended_at_unhandled __pyx_mstate_global->__pyx_n_s_suspended_at_unhandled +#define __pyx_n_s_sys __pyx_mstate_global->__pyx_n_s_sys +#define __pyx_n_s_t __pyx_mstate_global->__pyx_n_s_t +#define __pyx_n_s_tb_frame __pyx_mstate_global->__pyx_n_s_tb_frame +#define __pyx_n_s_tb_lineno __pyx_mstate_global->__pyx_n_s_tb_lineno +#define __pyx_n_s_tb_next __pyx_mstate_global->__pyx_n_s_tb_next +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_n_s_thread __pyx_mstate_global->__pyx_n_s_thread +#define __pyx_kp_s_thread__ident_is_None_in__get_re __pyx_mstate_global->__pyx_kp_s_thread__ident_is_None_in__get_re +#define __pyx_n_s_thread_trace_func __pyx_mstate_global->__pyx_n_s_thread_trace_func +#define __pyx_n_s_thread_tracer __pyx_mstate_global->__pyx_n_s_thread_tracer +#define __pyx_n_s_threading __pyx_mstate_global->__pyx_n_s_threading +#define __pyx_n_s_threading_active __pyx_mstate_global->__pyx_n_s_threading_active +#define __pyx_n_s_threading_current_thread __pyx_mstate_global->__pyx_n_s_threading_current_thread +#define __pyx_n_s_threading_get_ident __pyx_mstate_global->__pyx_n_s_threading_get_ident +#define __pyx_n_s_top_level_thread_tracer __pyx_mstate_global->__pyx_n_s_top_level_thread_tracer +#define __pyx_n_s_top_level_thread_tracer_no_back __pyx_mstate_global->__pyx_n_s_top_level_thread_tracer_no_back +#define __pyx_n_s_top_level_thread_tracer_unhandle __pyx_mstate_global->__pyx_n_s_top_level_thread_tracer_unhandle +#define __pyx_n_s_trace __pyx_mstate_global->__pyx_n_s_trace +#define __pyx_n_s_trace_dispatch __pyx_mstate_global->__pyx_n_s_trace_dispatch +#define __pyx_n_s_trace_dispatch_and_unhandled_exc __pyx_mstate_global->__pyx_n_s_trace_dispatch_and_unhandled_exc +#define __pyx_n_s_trace_exception __pyx_mstate_global->__pyx_n_s_trace_exception +#define __pyx_n_s_trace_obj __pyx_mstate_global->__pyx_n_s_trace_obj +#define __pyx_n_s_trace_unhandled_exceptions __pyx_mstate_global->__pyx_n_s_trace_unhandled_exceptions +#define __pyx_n_s_try_exc_info __pyx_mstate_global->__pyx_n_s_try_exc_info +#define __pyx_n_s_try_except_info __pyx_mstate_global->__pyx_n_s_try_except_info +#define __pyx_n_s_try_except_infos __pyx_mstate_global->__pyx_n_s_try_except_infos +#define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update +#define __pyx_n_s_update_stepping_info __pyx_mstate_global->__pyx_n_s_update_stepping_info +#define __pyx_n_s_use_setstate __pyx_mstate_global->__pyx_n_s_use_setstate +#define __pyx_kp_s_utf_8 __pyx_mstate_global->__pyx_kp_s_utf_8 +#define __pyx_n_s_valid_try_except_infos __pyx_mstate_global->__pyx_n_s_valid_try_except_infos +#define __pyx_n_s_value __pyx_mstate_global->__pyx_n_s_value +#define __pyx_n_s_values __pyx_mstate_global->__pyx_n_s_values +#define __pyx_n_s_version __pyx_mstate_global->__pyx_n_s_version +#define __pyx_n_s_was_just_raised __pyx_mstate_global->__pyx_n_s_was_just_raised +#define __pyx_n_s_weak_thread __pyx_mstate_global->__pyx_n_s_weak_thread +#define __pyx_n_s_weakref __pyx_mstate_global->__pyx_n_s_weakref +#define __pyx_n_s_writer __pyx_mstate_global->__pyx_n_s_writer +#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0 +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_int_2 __pyx_mstate_global->__pyx_int_2 +#define __pyx_int_11 __pyx_mstate_global->__pyx_int_11 +#define __pyx_int_111 __pyx_mstate_global->__pyx_int_111 +#define __pyx_int_137 __pyx_mstate_global->__pyx_int_137 +#define __pyx_int_160 __pyx_mstate_global->__pyx_int_160 +#define __pyx_int_2424557 __pyx_mstate_global->__pyx_int_2424557 +#define __pyx_int_16751766 __pyx_mstate_global->__pyx_int_16751766 +#define __pyx_int_18997755 __pyx_mstate_global->__pyx_int_18997755 +#define __pyx_int_61391470 __pyx_mstate_global->__pyx_int_61391470 +#define __pyx_int_63705258 __pyx_mstate_global->__pyx_int_63705258 +#define __pyx_int_64458794 __pyx_mstate_global->__pyx_int_64458794 +#define __pyx_int_66451433 __pyx_mstate_global->__pyx_int_66451433 +#define __pyx_int_70528507 __pyx_mstate_global->__pyx_int_70528507 +#define __pyx_int_84338306 __pyx_mstate_global->__pyx_int_84338306 +#define __pyx_int_125568891 __pyx_mstate_global->__pyx_int_125568891 +#define __pyx_int_169093275 __pyx_mstate_global->__pyx_int_169093275 +#define __pyx_int_171613889 __pyx_mstate_global->__pyx_int_171613889 +#define __pyx_int_192493205 __pyx_mstate_global->__pyx_int_192493205 +#define __pyx_int_210464433 __pyx_mstate_global->__pyx_int_210464433 +#define __pyx_int_221489684 __pyx_mstate_global->__pyx_int_221489684 +#define __pyx_int_230645316 __pyx_mstate_global->__pyx_int_230645316 +#define __pyx_int_232881363 __pyx_mstate_global->__pyx_int_232881363 +#define __pyx_int_255484337 __pyx_mstate_global->__pyx_int_255484337 +#define __pyx_int_neg_1 __pyx_mstate_global->__pyx_int_neg_1 +#define __pyx_slice__2 __pyx_mstate_global->__pyx_slice__2 +#define __pyx_slice__6 __pyx_mstate_global->__pyx_slice__6 +#define __pyx_tuple__3 __pyx_mstate_global->__pyx_tuple__3 +#define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 +#define __pyx_tuple__7 __pyx_mstate_global->__pyx_tuple__7 +#define __pyx_tuple__11 __pyx_mstate_global->__pyx_tuple__11 +#define __pyx_tuple__12 __pyx_mstate_global->__pyx_tuple__12 +#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 +#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 +#define __pyx_tuple__15 __pyx_mstate_global->__pyx_tuple__15 +#define __pyx_tuple__16 __pyx_mstate_global->__pyx_tuple__16 +#define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17 +#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 +#define __pyx_tuple__20 __pyx_mstate_global->__pyx_tuple__20 +#define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23 +#define __pyx_tuple__26 __pyx_mstate_global->__pyx_tuple__26 +#define __pyx_tuple__28 __pyx_mstate_global->__pyx_tuple__28 +#define __pyx_tuple__30 __pyx_mstate_global->__pyx_tuple__30 +#define __pyx_tuple__32 __pyx_mstate_global->__pyx_tuple__32 +#define __pyx_tuple__36 __pyx_mstate_global->__pyx_tuple__36 +#define __pyx_tuple__37 __pyx_mstate_global->__pyx_tuple__37 +#define __pyx_tuple__39 __pyx_mstate_global->__pyx_tuple__39 +#define __pyx_tuple__40 __pyx_mstate_global->__pyx_tuple__40 +#define __pyx_tuple__41 __pyx_mstate_global->__pyx_tuple__41 +#define __pyx_tuple__42 __pyx_mstate_global->__pyx_tuple__42 +#define __pyx_tuple__46 __pyx_mstate_global->__pyx_tuple__46 +#define __pyx_tuple__49 __pyx_mstate_global->__pyx_tuple__49 +#define __pyx_tuple__51 __pyx_mstate_global->__pyx_tuple__51 +#define __pyx_tuple__53 __pyx_mstate_global->__pyx_tuple__53 +#define __pyx_tuple__57 __pyx_mstate_global->__pyx_tuple__57 +#define __pyx_tuple__59 __pyx_mstate_global->__pyx_tuple__59 +#define __pyx_tuple__60 __pyx_mstate_global->__pyx_tuple__60 +#define __pyx_tuple__62 __pyx_mstate_global->__pyx_tuple__62 +#define __pyx_tuple__67 __pyx_mstate_global->__pyx_tuple__67 +#define __pyx_tuple__69 __pyx_mstate_global->__pyx_tuple__69 +#define __pyx_tuple__71 __pyx_mstate_global->__pyx_tuple__71 +#define __pyx_tuple__76 __pyx_mstate_global->__pyx_tuple__76 +#define __pyx_tuple__85 __pyx_mstate_global->__pyx_tuple__85 +#define __pyx_codeobj__21 __pyx_mstate_global->__pyx_codeobj__21 +#define __pyx_codeobj__22 __pyx_mstate_global->__pyx_codeobj__22 +#define __pyx_codeobj__24 __pyx_mstate_global->__pyx_codeobj__24 +#define __pyx_codeobj__25 __pyx_mstate_global->__pyx_codeobj__25 +#define __pyx_codeobj__27 __pyx_mstate_global->__pyx_codeobj__27 +#define __pyx_codeobj__29 __pyx_mstate_global->__pyx_codeobj__29 +#define __pyx_codeobj__31 __pyx_mstate_global->__pyx_codeobj__31 +#define __pyx_codeobj__33 __pyx_mstate_global->__pyx_codeobj__33 +#define __pyx_codeobj__34 __pyx_mstate_global->__pyx_codeobj__34 +#define __pyx_codeobj__35 __pyx_mstate_global->__pyx_codeobj__35 +#define __pyx_codeobj__38 __pyx_mstate_global->__pyx_codeobj__38 +#define __pyx_codeobj__43 __pyx_mstate_global->__pyx_codeobj__43 +#define __pyx_codeobj__44 __pyx_mstate_global->__pyx_codeobj__44 +#define __pyx_codeobj__45 __pyx_mstate_global->__pyx_codeobj__45 +#define __pyx_codeobj__47 __pyx_mstate_global->__pyx_codeobj__47 +#define __pyx_codeobj__48 __pyx_mstate_global->__pyx_codeobj__48 +#define __pyx_codeobj__50 __pyx_mstate_global->__pyx_codeobj__50 +#define __pyx_codeobj__52 __pyx_mstate_global->__pyx_codeobj__52 +#define __pyx_codeobj__54 __pyx_mstate_global->__pyx_codeobj__54 +#define __pyx_codeobj__55 __pyx_mstate_global->__pyx_codeobj__55 +#define __pyx_codeobj__56 __pyx_mstate_global->__pyx_codeobj__56 +#define __pyx_codeobj__58 __pyx_mstate_global->__pyx_codeobj__58 +#define __pyx_codeobj__61 __pyx_mstate_global->__pyx_codeobj__61 +#define __pyx_codeobj__63 __pyx_mstate_global->__pyx_codeobj__63 +#define __pyx_codeobj__64 __pyx_mstate_global->__pyx_codeobj__64 +#define __pyx_codeobj__65 __pyx_mstate_global->__pyx_codeobj__65 +#define __pyx_codeobj__66 __pyx_mstate_global->__pyx_codeobj__66 +#define __pyx_codeobj__68 __pyx_mstate_global->__pyx_codeobj__68 +#define __pyx_codeobj__70 __pyx_mstate_global->__pyx_codeobj__70 +#define __pyx_codeobj__72 __pyx_mstate_global->__pyx_codeobj__72 +#define __pyx_codeobj__73 __pyx_mstate_global->__pyx_codeobj__73 +#define __pyx_codeobj__74 __pyx_mstate_global->__pyx_codeobj__74 +#define __pyx_codeobj__75 __pyx_mstate_global->__pyx_codeobj__75 +#define __pyx_codeobj__77 __pyx_mstate_global->__pyx_codeobj__77 +#define __pyx_codeobj__78 __pyx_mstate_global->__pyx_codeobj__78 +#define __pyx_codeobj__79 __pyx_mstate_global->__pyx_codeobj__79 +#define __pyx_codeobj__80 __pyx_mstate_global->__pyx_codeobj__80 +#define __pyx_codeobj__81 __pyx_mstate_global->__pyx_codeobj__81 +#define __pyx_codeobj__82 __pyx_mstate_global->__pyx_codeobj__82 +#define __pyx_codeobj__83 __pyx_mstate_global->__pyx_codeobj__83 +#define __pyx_codeobj__84 __pyx_mstate_global->__pyx_codeobj__84 +#define __pyx_codeobj__86 __pyx_mstate_global->__pyx_codeobj__86 +#define __pyx_codeobj__87 __pyx_mstate_global->__pyx_codeobj__87 +#define __pyx_codeobj__88 __pyx_mstate_global->__pyx_codeobj__88 +#define __pyx_codeobj__89 __pyx_mstate_global->__pyx_codeobj__89 +#define __pyx_codeobj__90 __pyx_mstate_global->__pyx_codeobj__90 +#define __pyx_codeobj__91 __pyx_mstate_global->__pyx_codeobj__91 +#define __pyx_codeobj__92 __pyx_mstate_global->__pyx_codeobj__92 +/* #### Code section: module_code ### */ + +/* "_pydevd_bundle/pydevd_cython.pyx":76 + * # fmt: on + * + * def __init__(self): # <<<<<<<<<<<<<< + * self.pydev_state = STATE_RUN # STATE_RUN or STATE_SUSPEND + * self.pydev_step_stop = None + */ + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, __pyx_nargs); return -1;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo___init__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo___init__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":77 + * + * def __init__(self): + * self.pydev_state = STATE_RUN # STATE_RUN or STATE_SUSPEND # <<<<<<<<<<<<<< + * self.pydev_step_stop = None + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_STATE_RUN); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 77, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 77, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_self->pydev_state = __pyx_t_2; + + /* "_pydevd_bundle/pydevd_cython.pyx":78 + * def __init__(self): + * self.pydev_state = STATE_RUN # STATE_RUN or STATE_SUSPEND + * self.pydev_step_stop = None # <<<<<<<<<<<<<< + * + * # Note: we have `pydev_original_step_cmd` and `pydev_step_cmd` because the original is to + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_step_stop); + __Pyx_DECREF(__pyx_v_self->pydev_step_stop); + __pyx_v_self->pydev_step_stop = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":86 + * # method the strategy is changed to a step in). + * + * self.pydev_original_step_cmd = -1 # Something as CMD_STEP_INTO, CMD_STEP_OVER, etc. # <<<<<<<<<<<<<< + * self.pydev_step_cmd = -1 # Something as CMD_STEP_INTO, CMD_STEP_OVER, etc. + * + */ + __pyx_v_self->pydev_original_step_cmd = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":87 + * + * self.pydev_original_step_cmd = -1 # Something as CMD_STEP_INTO, CMD_STEP_OVER, etc. + * self.pydev_step_cmd = -1 # Something as CMD_STEP_INTO, CMD_STEP_OVER, etc. # <<<<<<<<<<<<<< + * + * self.pydev_notify_kill = False + */ + __pyx_v_self->pydev_step_cmd = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":89 + * self.pydev_step_cmd = -1 # Something as CMD_STEP_INTO, CMD_STEP_OVER, etc. + * + * self.pydev_notify_kill = False # <<<<<<<<<<<<<< + * self.pydev_django_resolve_frame = False + * self.pydev_call_from_jinja2 = None + */ + __pyx_v_self->pydev_notify_kill = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":90 + * + * self.pydev_notify_kill = False + * self.pydev_django_resolve_frame = False # <<<<<<<<<<<<<< + * self.pydev_call_from_jinja2 = None + * self.pydev_call_inside_jinja2 = None + */ + __pyx_v_self->pydev_django_resolve_frame = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":91 + * self.pydev_notify_kill = False + * self.pydev_django_resolve_frame = False + * self.pydev_call_from_jinja2 = None # <<<<<<<<<<<<<< + * self.pydev_call_inside_jinja2 = None + * self.is_tracing = 0 + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_call_from_jinja2); + __Pyx_DECREF(__pyx_v_self->pydev_call_from_jinja2); + __pyx_v_self->pydev_call_from_jinja2 = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":92 + * self.pydev_django_resolve_frame = False + * self.pydev_call_from_jinja2 = None + * self.pydev_call_inside_jinja2 = None # <<<<<<<<<<<<<< + * self.is_tracing = 0 + * self.conditional_breakpoint_exception = None + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_call_inside_jinja2); + __Pyx_DECREF(__pyx_v_self->pydev_call_inside_jinja2); + __pyx_v_self->pydev_call_inside_jinja2 = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":93 + * self.pydev_call_from_jinja2 = None + * self.pydev_call_inside_jinja2 = None + * self.is_tracing = 0 # <<<<<<<<<<<<<< + * self.conditional_breakpoint_exception = None + * self.pydev_message = "" + */ + __pyx_v_self->is_tracing = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":94 + * self.pydev_call_inside_jinja2 = None + * self.is_tracing = 0 + * self.conditional_breakpoint_exception = None # <<<<<<<<<<<<<< + * self.pydev_message = "" + * self.suspend_type = PYTHON_SUSPEND + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->conditional_breakpoint_exception); + __Pyx_DECREF(__pyx_v_self->conditional_breakpoint_exception); + __pyx_v_self->conditional_breakpoint_exception = ((PyObject*)Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":95 + * self.is_tracing = 0 + * self.conditional_breakpoint_exception = None + * self.pydev_message = "" # <<<<<<<<<<<<<< + * self.suspend_type = PYTHON_SUSPEND + * self.pydev_next_line = -1 + */ + __Pyx_INCREF(__pyx_kp_s_); + __Pyx_GIVEREF(__pyx_kp_s_); + __Pyx_GOTREF(__pyx_v_self->pydev_message); + __Pyx_DECREF(__pyx_v_self->pydev_message); + __pyx_v_self->pydev_message = __pyx_kp_s_; + + /* "_pydevd_bundle/pydevd_cython.pyx":96 + * self.conditional_breakpoint_exception = None + * self.pydev_message = "" + * self.suspend_type = PYTHON_SUSPEND # <<<<<<<<<<<<<< + * self.pydev_next_line = -1 + * self.pydev_func_name = ".invalid." # Must match the type in cython + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_PYTHON_SUSPEND); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 96, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 96, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_self->suspend_type = __pyx_t_2; + + /* "_pydevd_bundle/pydevd_cython.pyx":97 + * self.pydev_message = "" + * self.suspend_type = PYTHON_SUSPEND + * self.pydev_next_line = -1 # <<<<<<<<<<<<<< + * self.pydev_func_name = ".invalid." # Must match the type in cython + * self.suspended_at_unhandled = False + */ + __pyx_v_self->pydev_next_line = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":98 + * self.suspend_type = PYTHON_SUSPEND + * self.pydev_next_line = -1 + * self.pydev_func_name = ".invalid." # Must match the type in cython # <<<<<<<<<<<<<< + * self.suspended_at_unhandled = False + * self.trace_suspend_type = "trace" # 'trace' or 'frame_eval' + */ + __Pyx_INCREF(__pyx_kp_s_invalid); + __Pyx_GIVEREF(__pyx_kp_s_invalid); + __Pyx_GOTREF(__pyx_v_self->pydev_func_name); + __Pyx_DECREF(__pyx_v_self->pydev_func_name); + __pyx_v_self->pydev_func_name = __pyx_kp_s_invalid; + + /* "_pydevd_bundle/pydevd_cython.pyx":99 + * self.pydev_next_line = -1 + * self.pydev_func_name = ".invalid." # Must match the type in cython + * self.suspended_at_unhandled = False # <<<<<<<<<<<<<< + * self.trace_suspend_type = "trace" # 'trace' or 'frame_eval' + * self.top_level_thread_tracer_no_back_frames = [] + */ + __pyx_v_self->suspended_at_unhandled = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":100 + * self.pydev_func_name = ".invalid." # Must match the type in cython + * self.suspended_at_unhandled = False + * self.trace_suspend_type = "trace" # 'trace' or 'frame_eval' # <<<<<<<<<<<<<< + * self.top_level_thread_tracer_no_back_frames = [] + * self.top_level_thread_tracer_unhandled = None + */ + __Pyx_INCREF(__pyx_n_s_trace); + __Pyx_GIVEREF(__pyx_n_s_trace); + __Pyx_GOTREF(__pyx_v_self->trace_suspend_type); + __Pyx_DECREF(__pyx_v_self->trace_suspend_type); + __pyx_v_self->trace_suspend_type = __pyx_n_s_trace; + + /* "_pydevd_bundle/pydevd_cython.pyx":101 + * self.suspended_at_unhandled = False + * self.trace_suspend_type = "trace" # 'trace' or 'frame_eval' + * self.top_level_thread_tracer_no_back_frames = [] # <<<<<<<<<<<<<< + * self.top_level_thread_tracer_unhandled = None + * self.thread_tracer = None + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + __Pyx_DECREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + __pyx_v_self->top_level_thread_tracer_no_back_frames = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":102 + * self.trace_suspend_type = "trace" # 'trace' or 'frame_eval' + * self.top_level_thread_tracer_no_back_frames = [] + * self.top_level_thread_tracer_unhandled = None # <<<<<<<<<<<<<< + * self.thread_tracer = None + * self.step_in_initial_location = None + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->top_level_thread_tracer_unhandled); + __Pyx_DECREF(__pyx_v_self->top_level_thread_tracer_unhandled); + __pyx_v_self->top_level_thread_tracer_unhandled = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":103 + * self.top_level_thread_tracer_no_back_frames = [] + * self.top_level_thread_tracer_unhandled = None + * self.thread_tracer = None # <<<<<<<<<<<<<< + * self.step_in_initial_location = None + * self.pydev_smart_parent_offset = -1 + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->thread_tracer); + __Pyx_DECREF(__pyx_v_self->thread_tracer); + __pyx_v_self->thread_tracer = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":104 + * self.top_level_thread_tracer_unhandled = None + * self.thread_tracer = None + * self.step_in_initial_location = None # <<<<<<<<<<<<<< + * self.pydev_smart_parent_offset = -1 + * self.pydev_smart_child_offset = -1 + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->step_in_initial_location); + __Pyx_DECREF(__pyx_v_self->step_in_initial_location); + __pyx_v_self->step_in_initial_location = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":105 + * self.thread_tracer = None + * self.step_in_initial_location = None + * self.pydev_smart_parent_offset = -1 # <<<<<<<<<<<<<< + * self.pydev_smart_child_offset = -1 + * self.pydev_smart_step_into_variants = () + */ + __pyx_v_self->pydev_smart_parent_offset = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":106 + * self.step_in_initial_location = None + * self.pydev_smart_parent_offset = -1 + * self.pydev_smart_child_offset = -1 # <<<<<<<<<<<<<< + * self.pydev_smart_step_into_variants = () + * self.target_id_to_smart_step_into_variant = {} + */ + __pyx_v_self->pydev_smart_child_offset = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":107 + * self.pydev_smart_parent_offset = -1 + * self.pydev_smart_child_offset = -1 + * self.pydev_smart_step_into_variants = () # <<<<<<<<<<<<<< + * self.target_id_to_smart_step_into_variant = {} + * + */ + __Pyx_INCREF(__pyx_empty_tuple); + __Pyx_GIVEREF(__pyx_empty_tuple); + __Pyx_GOTREF(__pyx_v_self->pydev_smart_step_into_variants); + __Pyx_DECREF(__pyx_v_self->pydev_smart_step_into_variants); + __pyx_v_self->pydev_smart_step_into_variants = __pyx_empty_tuple; + + /* "_pydevd_bundle/pydevd_cython.pyx":108 + * self.pydev_smart_child_offset = -1 + * self.pydev_smart_step_into_variants = () + * self.target_id_to_smart_step_into_variant = {} # <<<<<<<<<<<<<< + * + * # Flag to indicate ipython use-case where each line will be executed as a call/line/return + */ + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 108, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->target_id_to_smart_step_into_variant); + __Pyx_DECREF(__pyx_v_self->target_id_to_smart_step_into_variant); + __pyx_v_self->target_id_to_smart_step_into_variant = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":120 + * # + * # See: https://github.com/microsoft/debugpy/issues/869#issuecomment-1132141003 + * self.pydev_use_scoped_step_frame = False # <<<<<<<<<<<<<< + * self.weak_thread = None + * + */ + __pyx_v_self->pydev_use_scoped_step_frame = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":121 + * # See: https://github.com/microsoft/debugpy/issues/869#issuecomment-1132141003 + * self.pydev_use_scoped_step_frame = False + * self.weak_thread = None # <<<<<<<<<<<<<< + * + * # Purpose: detect if this thread is suspended and actually in the wait loop + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->weak_thread); + __Pyx_DECREF(__pyx_v_self->weak_thread); + __pyx_v_self->weak_thread = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":126 + * # at this time (otherwise it may be suspended but still didn't reach a point. + * # to pause). + * self.is_in_wait_loop = False # <<<<<<<<<<<<<< + * + * # fmt: off + */ + __pyx_v_self->is_in_wait_loop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":76 + * # fmt: on + * + * def __init__(self): # <<<<<<<<<<<<<< + * self.pydev_state = STATE_RUN # STATE_RUN or STATE_SUSPEND + * self.pydev_step_stop = None + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":130 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef object _get_related_thread(self): # <<<<<<<<<<<<<< + * # ELSE + * # def _get_related_thread(self): + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_3_get_related_thread(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo__get_related_thread(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, int __pyx_skip_dispatch) { + PyObject *__pyx_v_thread = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_get_related_thread", 1); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { + PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_related_thread); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_3_get_related_thread)) { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); + if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) { + __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } + + /* "_pydevd_bundle/pydevd_cython.pyx":135 + * # ENDIF + * # fmt: on + * if self.pydev_notify_kill: # Already killed # <<<<<<<<<<<<<< + * return None + * + */ + if (__pyx_v_self->pydev_notify_kill) { + + /* "_pydevd_bundle/pydevd_cython.pyx":136 + * # fmt: on + * if self.pydev_notify_kill: # Already killed + * return None # <<<<<<<<<<<<<< + * + * if self.weak_thread is None: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":135 + * # ENDIF + * # fmt: on + * if self.pydev_notify_kill: # Already killed # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":138 + * return None + * + * if self.weak_thread is None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_6 = (__pyx_v_self->weak_thread == Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":139 + * + * if self.weak_thread is None: + * return None # <<<<<<<<<<<<<< + * + * thread = self.weak_thread() + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":138 + * return None + * + * if self.weak_thread is None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":141 + * return None + * + * thread = self.weak_thread() # <<<<<<<<<<<<<< + * if thread is None: + * return False + */ + __Pyx_INCREF(__pyx_v_self->weak_thread); + __pyx_t_2 = __pyx_v_self->weak_thread; __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_thread = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":142 + * + * thread = self.weak_thread() + * if thread is None: # <<<<<<<<<<<<<< + * return False + * + */ + __pyx_t_6 = (__pyx_v_thread == Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":143 + * thread = self.weak_thread() + * if thread is None: + * return False # <<<<<<<<<<<<<< + * + * if not is_thread_alive(thread): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":142 + * + * thread = self.weak_thread() + * if thread is None: # <<<<<<<<<<<<<< + * return False + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":145 + * return False + * + * if not is_thread_alive(thread): # <<<<<<<<<<<<<< + * return None + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_is_thread_alive); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_thread}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_7 = (!__pyx_t_6); + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":146 + * + * if not is_thread_alive(thread): + * return None # <<<<<<<<<<<<<< + * + * if thread._ident is None: # Can this happen? + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":145 + * return False + * + * if not is_thread_alive(thread): # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":148 + * return None + * + * if thread._ident is None: # Can this happen? # <<<<<<<<<<<<<< + * pydev_log.critical("thread._ident is None in _get_related_thread!") + * return None + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_ident); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = (__pyx_t_1 == Py_None); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":149 + * + * if thread._ident is None: # Can this happen? + * pydev_log.critical("thread._ident is None in _get_related_thread!") # <<<<<<<<<<<<<< + * return None + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_critical); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_kp_s_thread__ident_is_None_in__get_re}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":150 + * if thread._ident is None: # Can this happen? + * pydev_log.critical("thread._ident is None in _get_related_thread!") + * return None # <<<<<<<<<<<<<< + * + * if threading._active.get(thread._ident) is not thread: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":148 + * return None + * + * if thread._ident is None: # Can this happen? # <<<<<<<<<<<<<< + * pydev_log.critical("thread._ident is None in _get_related_thread!") + * return None + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":152 + * return None + * + * if threading._active.get(thread._ident) is not thread: # <<<<<<<<<<<<<< + * return None + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_active); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_ident); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_t_7 = (__pyx_t_1 != __pyx_v_thread); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":153 + * + * if threading._active.get(thread._ident) is not thread: + * return None # <<<<<<<<<<<<<< + * + * return thread + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":152 + * return None + * + * if threading._active.get(thread._ident) is not thread: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":155 + * return None + * + * return thread # <<<<<<<<<<<<<< + * + * # fmt: off + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_thread); + __pyx_r = __pyx_v_thread; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":130 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef object _get_related_thread(self): # <<<<<<<<<<<<<< + * # ELSE + * # def _get_related_thread(self): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo._get_related_thread", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_thread); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_3_get_related_thread(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_3_get_related_thread = {"_get_related_thread", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_3_get_related_thread, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_3_get_related_thread(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_related_thread (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("_get_related_thread", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_get_related_thread", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_2_get_related_thread(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_2_get_related_thread(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_get_related_thread", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo__get_related_thread(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo._get_related_thread", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":159 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef bint _is_stepping(self): # <<<<<<<<<<<<<< + * # ELSE + * # def _is_stepping(self): + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_5_is_stepping(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static int __pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo__is_stepping(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, int __pyx_skip_dispatch) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_is_stepping", 1); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { + PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_stepping); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_5_is_stepping)) { + __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); + if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) { + __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } + + /* "_pydevd_bundle/pydevd_cython.pyx":164 + * # ENDIF + * # fmt: on + * if self.pydev_state == STATE_RUN and self.pydev_step_cmd != -1: # <<<<<<<<<<<<<< + * # This means actually stepping in a step operation. + * return True + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 164, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_STATE_RUN); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 164, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 164, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 164, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_7 = (__pyx_v_self->pydev_step_cmd != -1L); + __pyx_t_6 = __pyx_t_7; + __pyx_L4_bool_binop_done:; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":166 + * if self.pydev_state == STATE_RUN and self.pydev_step_cmd != -1: + * # This means actually stepping in a step operation. + * return True # <<<<<<<<<<<<<< + * + * if self.pydev_state == STATE_SUSPEND and self.is_in_wait_loop: + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":164 + * # ENDIF + * # fmt: on + * if self.pydev_state == STATE_RUN and self.pydev_step_cmd != -1: # <<<<<<<<<<<<<< + * # This means actually stepping in a step operation. + * return True + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":168 + * return True + * + * if self.pydev_state == STATE_SUSPEND and self.is_in_wait_loop: # <<<<<<<<<<<<<< + * # This means stepping because it was suspended but still didn't + * # reach a suspension point. + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 168, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_STATE_SUSPEND); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 168, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 168, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 168, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_6 = __pyx_v_self->is_in_wait_loop; + __pyx_L7_bool_binop_done:; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":171 + * # This means stepping because it was suspended but still didn't + * # reach a suspension point. + * return True # <<<<<<<<<<<<<< + * + * return False + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":168 + * return True + * + * if self.pydev_state == STATE_SUSPEND and self.is_in_wait_loop: # <<<<<<<<<<<<<< + * # This means stepping because it was suspended but still didn't + * # reach a suspension point. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":173 + * return True + * + * return False # <<<<<<<<<<<<<< + * + * # fmt: off + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":159 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef bint _is_stepping(self): # <<<<<<<<<<<<<< + * # ELSE + * # def _is_stepping(self): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo._is_stepping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_5_is_stepping(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_5_is_stepping = {"_is_stepping", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_5_is_stepping, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_5_is_stepping(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_is_stepping (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("_is_stepping", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_is_stepping", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_4_is_stepping(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_4_is_stepping(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_is_stepping", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo__is_stepping(__pyx_v_self, 1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo._is_stepping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":177 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef get_topmost_frame(self, thread): # <<<<<<<<<<<<<< + * # ELSE + * # def get_topmost_frame(self, thread): + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_7get_topmost_frame(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_get_topmost_frame(CYTHON_UNUSED struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_thread, int __pyx_skip_dispatch) { + PyObject *__pyx_v_current_frames = NULL; + PyObject *__pyx_v_topmost_frame = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_topmost_frame", 1); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { + PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_topmost_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_7get_topmost_frame)) { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_thread}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); + if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) { + __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } + + /* "_pydevd_bundle/pydevd_cython.pyx":188 + * """ + * # sys._current_frames(): dictionary with thread id -> topmost frame + * current_frames = _current_frames() # <<<<<<<<<<<<<< + * topmost_frame = current_frames.get(thread._ident) + * if topmost_frame is None: + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_current_frames); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 188, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 188, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_current_frames = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":189 + * # sys._current_frames(): dictionary with thread id -> topmost frame + * current_frames = _current_frames() + * topmost_frame = current_frames.get(thread._ident) # <<<<<<<<<<<<<< + * if topmost_frame is None: + * # Note: this is expected for dummy threads (so, getting the topmost frame should be + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_current_frames, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_ident); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_topmost_frame = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":190 + * current_frames = _current_frames() + * topmost_frame = current_frames.get(thread._ident) + * if topmost_frame is None: # <<<<<<<<<<<<<< + * # Note: this is expected for dummy threads (so, getting the topmost frame should be + * # treated as optional). + */ + __pyx_t_6 = (__pyx_v_topmost_frame == Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":193 + * # Note: this is expected for dummy threads (so, getting the topmost frame should be + * # treated as optional). + * pydev_log.info( # <<<<<<<<<<<<<< + * "Unable to get topmost frame for thread: %s, thread.ident: %s, id(thread): %s\nCurrent frames: %s.\n" "GEVENT_SUPPORT: %s", + * thread, + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_info); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":196 + * "Unable to get topmost frame for thread: %s, thread.ident: %s, id(thread): %s\nCurrent frames: %s.\n" "GEVENT_SUPPORT: %s", + * thread, + * thread.ident, # <<<<<<<<<<<<<< + * id(thread), + * current_frames, + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_ident_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "_pydevd_bundle/pydevd_cython.pyx":197 + * thread, + * thread.ident, + * id(thread), # <<<<<<<<<<<<<< + * current_frames, + * SUPPORT_GEVENT, + */ + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, __pyx_v_thread); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + + /* "_pydevd_bundle/pydevd_cython.pyx":199 + * id(thread), + * current_frames, + * SUPPORT_GEVENT, # <<<<<<<<<<<<<< + * ) + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_SUPPORT_GEVENT); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 199, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[7] = {__pyx_t_8, __pyx_kp_s_Unable_to_get_topmost_frame_for, __pyx_v_thread, __pyx_t_2, __pyx_t_4, __pyx_v_current_frames, __pyx_t_7}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 6+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":190 + * current_frames = _current_frames() + * topmost_frame = current_frames.get(thread._ident) + * if topmost_frame is None: # <<<<<<<<<<<<<< + * # Note: this is expected for dummy threads (so, getting the topmost frame should be + * # treated as optional). + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":202 + * ) + * + * return topmost_frame # <<<<<<<<<<<<<< + * + * # fmt: off + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_topmost_frame); + __pyx_r = __pyx_v_topmost_frame; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":177 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef get_topmost_frame(self, thread): # <<<<<<<<<<<<<< + * # ELSE + * # def get_topmost_frame(self, thread): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.get_topmost_frame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_current_frames); + __Pyx_XDECREF(__pyx_v_topmost_frame); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_7get_topmost_frame(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +PyDoc_STRVAR(__pyx_doc_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_6get_topmost_frame, "\n Gets the topmost frame for the given thread. Note that it may be None\n and callers should remove the reference to the frame as soon as possible\n to avoid disturbing user code.\n "); +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_7get_topmost_frame = {"get_topmost_frame", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_7get_topmost_frame, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_6get_topmost_frame}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_7get_topmost_frame(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_thread = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_topmost_frame (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_thread,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_thread)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 177, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "get_topmost_frame") < 0)) __PYX_ERR(0, 177, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_thread = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("get_topmost_frame", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 177, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.get_topmost_frame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_6get_topmost_frame(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), __pyx_v_thread); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_6get_topmost_frame(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_thread) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_topmost_frame", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_get_topmost_frame(__pyx_v_self, __pyx_v_thread, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.get_topmost_frame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":206 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef update_stepping_info(self): # <<<<<<<<<<<<<< + * # ELSE + * # def update_stepping_info(self): + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_9update_stepping_info(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_update_stepping_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, int __pyx_skip_dispatch) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("update_stepping_info", 1); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { + PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_update_stepping_info); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 206, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_9update_stepping_info)) { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 206, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); + if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) { + __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } + + /* "_pydevd_bundle/pydevd_cython.pyx":211 + * # ENDIF + * # fmt: on + * _update_stepping_info(self) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython__update_stepping_info(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":206 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef update_stepping_info(self): # <<<<<<<<<<<<<< + * # ELSE + * # def update_stepping_info(self): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.update_stepping_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_9update_stepping_info(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_9update_stepping_info = {"update_stepping_info", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_9update_stepping_info, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_9update_stepping_info(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("update_stepping_info (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("update_stepping_info", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "update_stepping_info", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_8update_stepping_info(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_8update_stepping_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("update_stepping_info", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_update_stepping_info(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 206, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.update_stepping_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":213 + * _update_stepping_info(self) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "State:%s Stop:%s Cmd: %s Kill:%s" % (self.pydev_state, self.pydev_step_stop, self.pydev_step_cmd, self.pydev_notify_kill) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11__str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11__str__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10__str__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10__str__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__str__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":214 + * + * def __str__(self): + * return "State:%s Stop:%s Cmd: %s Kill:%s" % (self.pydev_state, self.pydev_step_stop, self.pydev_step_cmd, self.pydev_notify_kill) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 214, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_step_cmd); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 214, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_self->pydev_notify_kill); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 214, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 214, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1)) __PYX_ERR(0, 214, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->pydev_step_stop); + __Pyx_GIVEREF(__pyx_v_self->pydev_step_stop); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_self->pydev_step_stop)) __PYX_ERR(0, 214, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2)) __PYX_ERR(0, 214, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3)) __PYX_ERR(0, 214, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_State_s_Stop_s_Cmd_s_Kill_s, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 214, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":213 + * _update_stepping_info(self) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "State:%s Stop:%s Cmd: %s Kill:%s" % (self.pydev_state, self.pydev_step_stop, self.pydev_step_cmd, self.pydev_notify_kill) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":2 + * cdef class PyDBAdditionalThreadInfo: + * cdef public int pydev_state # <<<<<<<<<<<<<< + * cdef public object pydev_step_stop # Actually, it's a frame or None + * cdef public int pydev_original_step_cmd + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_state.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 2, __pyx_L1_error) + __pyx_v_self->pydev_state = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_state.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":3 + * cdef class PyDBAdditionalThreadInfo: + * cdef public int pydev_state + * cdef public object pydev_step_stop # Actually, it's a frame or None # <<<<<<<<<<<<<< + * cdef public int pydev_original_step_cmd + * cdef public int pydev_step_cmd + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->pydev_step_stop); + __pyx_r = __pyx_v_self->pydev_step_stop; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->pydev_step_stop); + __Pyx_DECREF(__pyx_v_self->pydev_step_stop); + __pyx_v_self->pydev_step_stop = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_step_stop); + __Pyx_DECREF(__pyx_v_self->pydev_step_stop); + __pyx_v_self->pydev_step_stop = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":4 + * cdef public int pydev_state + * cdef public object pydev_step_stop # Actually, it's a frame or None + * cdef public int pydev_original_step_cmd # <<<<<<<<<<<<<< + * cdef public int pydev_step_cmd + * cdef public bint pydev_notify_kill + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_original_step_cmd); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_original_step_cmd.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 4, __pyx_L1_error) + __pyx_v_self->pydev_original_step_cmd = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_original_step_cmd.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":5 + * cdef public object pydev_step_stop # Actually, it's a frame or None + * cdef public int pydev_original_step_cmd + * cdef public int pydev_step_cmd # <<<<<<<<<<<<<< + * cdef public bint pydev_notify_kill + * cdef public object pydev_smart_step_stop # Actually, it's a frame or None + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_step_cmd); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_step_cmd.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 5, __pyx_L1_error) + __pyx_v_self->pydev_step_cmd = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_step_cmd.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":6 + * cdef public int pydev_original_step_cmd + * cdef public int pydev_step_cmd + * cdef public bint pydev_notify_kill # <<<<<<<<<<<<<< + * cdef public object pydev_smart_step_stop # Actually, it's a frame or None + * cdef public bint pydev_django_resolve_frame + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->pydev_notify_kill); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_notify_kill.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 6, __pyx_L1_error) + __pyx_v_self->pydev_notify_kill = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_notify_kill.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":7 + * cdef public int pydev_step_cmd + * cdef public bint pydev_notify_kill + * cdef public object pydev_smart_step_stop # Actually, it's a frame or None # <<<<<<<<<<<<<< + * cdef public bint pydev_django_resolve_frame + * cdef public object pydev_call_from_jinja2 + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->pydev_smart_step_stop); + __pyx_r = __pyx_v_self->pydev_smart_step_stop; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->pydev_smart_step_stop); + __Pyx_DECREF(__pyx_v_self->pydev_smart_step_stop); + __pyx_v_self->pydev_smart_step_stop = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_smart_step_stop); + __Pyx_DECREF(__pyx_v_self->pydev_smart_step_stop); + __pyx_v_self->pydev_smart_step_stop = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":8 + * cdef public bint pydev_notify_kill + * cdef public object pydev_smart_step_stop # Actually, it's a frame or None + * cdef public bint pydev_django_resolve_frame # <<<<<<<<<<<<<< + * cdef public object pydev_call_from_jinja2 + * cdef public object pydev_call_inside_jinja2 + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->pydev_django_resolve_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_django_resolve_frame.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 8, __pyx_L1_error) + __pyx_v_self->pydev_django_resolve_frame = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_django_resolve_frame.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":9 + * cdef public object pydev_smart_step_stop # Actually, it's a frame or None + * cdef public bint pydev_django_resolve_frame + * cdef public object pydev_call_from_jinja2 # <<<<<<<<<<<<<< + * cdef public object pydev_call_inside_jinja2 + * cdef public int is_tracing + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->pydev_call_from_jinja2); + __pyx_r = __pyx_v_self->pydev_call_from_jinja2; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->pydev_call_from_jinja2); + __Pyx_DECREF(__pyx_v_self->pydev_call_from_jinja2); + __pyx_v_self->pydev_call_from_jinja2 = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_call_from_jinja2); + __Pyx_DECREF(__pyx_v_self->pydev_call_from_jinja2); + __pyx_v_self->pydev_call_from_jinja2 = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":10 + * cdef public bint pydev_django_resolve_frame + * cdef public object pydev_call_from_jinja2 + * cdef public object pydev_call_inside_jinja2 # <<<<<<<<<<<<<< + * cdef public int is_tracing + * cdef public tuple conditional_breakpoint_exception + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->pydev_call_inside_jinja2); + __pyx_r = __pyx_v_self->pydev_call_inside_jinja2; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->pydev_call_inside_jinja2); + __Pyx_DECREF(__pyx_v_self->pydev_call_inside_jinja2); + __pyx_v_self->pydev_call_inside_jinja2 = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_call_inside_jinja2); + __Pyx_DECREF(__pyx_v_self->pydev_call_inside_jinja2); + __pyx_v_self->pydev_call_inside_jinja2 = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":11 + * cdef public object pydev_call_from_jinja2 + * cdef public object pydev_call_inside_jinja2 + * cdef public int is_tracing # <<<<<<<<<<<<<< + * cdef public tuple conditional_breakpoint_exception + * cdef public str pydev_message + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->is_tracing); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.is_tracing.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 11, __pyx_L1_error) + __pyx_v_self->is_tracing = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.is_tracing.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":12 + * cdef public object pydev_call_inside_jinja2 + * cdef public int is_tracing + * cdef public tuple conditional_breakpoint_exception # <<<<<<<<<<<<<< + * cdef public str pydev_message + * cdef public int suspend_type + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->conditional_breakpoint_exception); + __pyx_r = __pyx_v_self->conditional_breakpoint_exception; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyTuple_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_value))) __PYX_ERR(1, 12, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->conditional_breakpoint_exception); + __Pyx_DECREF(__pyx_v_self->conditional_breakpoint_exception); + __pyx_v_self->conditional_breakpoint_exception = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.conditional_breakpoint_exception.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->conditional_breakpoint_exception); + __Pyx_DECREF(__pyx_v_self->conditional_breakpoint_exception); + __pyx_v_self->conditional_breakpoint_exception = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":13 + * cdef public int is_tracing + * cdef public tuple conditional_breakpoint_exception + * cdef public str pydev_message # <<<<<<<<<<<<<< + * cdef public int suspend_type + * cdef public int pydev_next_line + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->pydev_message); + __pyx_r = __pyx_v_self->pydev_message; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_value))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->pydev_message); + __Pyx_DECREF(__pyx_v_self->pydev_message); + __pyx_v_self->pydev_message = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_message.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_message); + __Pyx_DECREF(__pyx_v_self->pydev_message); + __pyx_v_self->pydev_message = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":14 + * cdef public tuple conditional_breakpoint_exception + * cdef public str pydev_message + * cdef public int suspend_type # <<<<<<<<<<<<<< + * cdef public int pydev_next_line + * cdef public str pydev_func_name + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->suspend_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.suspend_type.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 14, __pyx_L1_error) + __pyx_v_self->suspend_type = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.suspend_type.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":15 + * cdef public str pydev_message + * cdef public int suspend_type + * cdef public int pydev_next_line # <<<<<<<<<<<<<< + * cdef public str pydev_func_name + * cdef public bint suspended_at_unhandled + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_next_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_next_line.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 15, __pyx_L1_error) + __pyx_v_self->pydev_next_line = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_next_line.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":16 + * cdef public int suspend_type + * cdef public int pydev_next_line + * cdef public str pydev_func_name # <<<<<<<<<<<<<< + * cdef public bint suspended_at_unhandled + * cdef public str trace_suspend_type + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->pydev_func_name); + __pyx_r = __pyx_v_self->pydev_func_name; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_value))) __PYX_ERR(1, 16, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->pydev_func_name); + __Pyx_DECREF(__pyx_v_self->pydev_func_name); + __pyx_v_self->pydev_func_name = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_func_name.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_func_name); + __Pyx_DECREF(__pyx_v_self->pydev_func_name); + __pyx_v_self->pydev_func_name = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":17 + * cdef public int pydev_next_line + * cdef public str pydev_func_name + * cdef public bint suspended_at_unhandled # <<<<<<<<<<<<<< + * cdef public str trace_suspend_type + * cdef public object top_level_thread_tracer_no_back_frames + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->suspended_at_unhandled); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.suspended_at_unhandled.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_v_self->suspended_at_unhandled = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.suspended_at_unhandled.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":18 + * cdef public str pydev_func_name + * cdef public bint suspended_at_unhandled + * cdef public str trace_suspend_type # <<<<<<<<<<<<<< + * cdef public object top_level_thread_tracer_no_back_frames + * cdef public object top_level_thread_tracer_unhandled + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->trace_suspend_type); + __pyx_r = __pyx_v_self->trace_suspend_type; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_value))) __PYX_ERR(1, 18, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->trace_suspend_type); + __Pyx_DECREF(__pyx_v_self->trace_suspend_type); + __pyx_v_self->trace_suspend_type = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.trace_suspend_type.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->trace_suspend_type); + __Pyx_DECREF(__pyx_v_self->trace_suspend_type); + __pyx_v_self->trace_suspend_type = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":19 + * cdef public bint suspended_at_unhandled + * cdef public str trace_suspend_type + * cdef public object top_level_thread_tracer_no_back_frames # <<<<<<<<<<<<<< + * cdef public object top_level_thread_tracer_unhandled + * cdef public object thread_tracer + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + __pyx_r = __pyx_v_self->top_level_thread_tracer_no_back_frames; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + __Pyx_DECREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + __pyx_v_self->top_level_thread_tracer_no_back_frames = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + __Pyx_DECREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + __pyx_v_self->top_level_thread_tracer_no_back_frames = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":20 + * cdef public str trace_suspend_type + * cdef public object top_level_thread_tracer_no_back_frames + * cdef public object top_level_thread_tracer_unhandled # <<<<<<<<<<<<<< + * cdef public object thread_tracer + * cdef public object step_in_initial_location + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->top_level_thread_tracer_unhandled); + __pyx_r = __pyx_v_self->top_level_thread_tracer_unhandled; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->top_level_thread_tracer_unhandled); + __Pyx_DECREF(__pyx_v_self->top_level_thread_tracer_unhandled); + __pyx_v_self->top_level_thread_tracer_unhandled = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->top_level_thread_tracer_unhandled); + __Pyx_DECREF(__pyx_v_self->top_level_thread_tracer_unhandled); + __pyx_v_self->top_level_thread_tracer_unhandled = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":21 + * cdef public object top_level_thread_tracer_no_back_frames + * cdef public object top_level_thread_tracer_unhandled + * cdef public object thread_tracer # <<<<<<<<<<<<<< + * cdef public object step_in_initial_location + * cdef public int pydev_smart_parent_offset + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->thread_tracer); + __pyx_r = __pyx_v_self->thread_tracer; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->thread_tracer); + __Pyx_DECREF(__pyx_v_self->thread_tracer); + __pyx_v_self->thread_tracer = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->thread_tracer); + __Pyx_DECREF(__pyx_v_self->thread_tracer); + __pyx_v_self->thread_tracer = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":22 + * cdef public object top_level_thread_tracer_unhandled + * cdef public object thread_tracer + * cdef public object step_in_initial_location # <<<<<<<<<<<<<< + * cdef public int pydev_smart_parent_offset + * cdef public int pydev_smart_child_offset + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->step_in_initial_location); + __pyx_r = __pyx_v_self->step_in_initial_location; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->step_in_initial_location); + __Pyx_DECREF(__pyx_v_self->step_in_initial_location); + __pyx_v_self->step_in_initial_location = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->step_in_initial_location); + __Pyx_DECREF(__pyx_v_self->step_in_initial_location); + __pyx_v_self->step_in_initial_location = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":23 + * cdef public object thread_tracer + * cdef public object step_in_initial_location + * cdef public int pydev_smart_parent_offset # <<<<<<<<<<<<<< + * cdef public int pydev_smart_child_offset + * cdef public tuple pydev_smart_step_into_variants + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_smart_parent_offset); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 23, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_smart_parent_offset.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 23, __pyx_L1_error) + __pyx_v_self->pydev_smart_parent_offset = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_smart_parent_offset.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":24 + * cdef public object step_in_initial_location + * cdef public int pydev_smart_parent_offset + * cdef public int pydev_smart_child_offset # <<<<<<<<<<<<<< + * cdef public tuple pydev_smart_step_into_variants + * cdef public dict target_id_to_smart_step_into_variant + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_smart_child_offset); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_smart_child_offset.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 24, __pyx_L1_error) + __pyx_v_self->pydev_smart_child_offset = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_smart_child_offset.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":25 + * cdef public int pydev_smart_parent_offset + * cdef public int pydev_smart_child_offset + * cdef public tuple pydev_smart_step_into_variants # <<<<<<<<<<<<<< + * cdef public dict target_id_to_smart_step_into_variant + * cdef public bint pydev_use_scoped_step_frame + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->pydev_smart_step_into_variants); + __pyx_r = __pyx_v_self->pydev_smart_step_into_variants; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyTuple_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_value))) __PYX_ERR(1, 25, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->pydev_smart_step_into_variants); + __Pyx_DECREF(__pyx_v_self->pydev_smart_step_into_variants); + __pyx_v_self->pydev_smart_step_into_variants = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_smart_step_into_variants.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->pydev_smart_step_into_variants); + __Pyx_DECREF(__pyx_v_self->pydev_smart_step_into_variants); + __pyx_v_self->pydev_smart_step_into_variants = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":26 + * cdef public int pydev_smart_child_offset + * cdef public tuple pydev_smart_step_into_variants + * cdef public dict target_id_to_smart_step_into_variant # <<<<<<<<<<<<<< + * cdef public bint pydev_use_scoped_step_frame + * cdef public object weak_thread + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->target_id_to_smart_step_into_variant); + __pyx_r = __pyx_v_self->target_id_to_smart_step_into_variant; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_v_value))) __PYX_ERR(1, 26, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->target_id_to_smart_step_into_variant); + __Pyx_DECREF(__pyx_v_self->target_id_to_smart_step_into_variant); + __pyx_v_self->target_id_to_smart_step_into_variant = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.target_id_to_smart_step_into_variant.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->target_id_to_smart_step_into_variant); + __Pyx_DECREF(__pyx_v_self->target_id_to_smart_step_into_variant); + __pyx_v_self->target_id_to_smart_step_into_variant = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":27 + * cdef public tuple pydev_smart_step_into_variants + * cdef public dict target_id_to_smart_step_into_variant + * cdef public bint pydev_use_scoped_step_frame # <<<<<<<<<<<<<< + * cdef public object weak_thread + * cdef public bint is_in_wait_loop + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->pydev_use_scoped_step_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 27, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_use_scoped_step_frame.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 27, __pyx_L1_error) + __pyx_v_self->pydev_use_scoped_step_frame = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.pydev_use_scoped_step_frame.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":28 + * cdef public dict target_id_to_smart_step_into_variant + * cdef public bint pydev_use_scoped_step_frame + * cdef public object weak_thread # <<<<<<<<<<<<<< + * cdef public bint is_in_wait_loop + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->weak_thread); + __pyx_r = __pyx_v_self->weak_thread; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->weak_thread); + __Pyx_DECREF(__pyx_v_self->weak_thread); + __pyx_v_self->weak_thread = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->weak_thread); + __Pyx_DECREF(__pyx_v_self->weak_thread); + __pyx_v_self->weak_thread = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pxd":29 + * cdef public bint pydev_use_scoped_step_frame + * cdef public object weak_thread + * cdef public bint is_in_wait_loop # <<<<<<<<<<<<<< + * + * cpdef get_topmost_frame(self, thread) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_in_wait_loop); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.is_in_wait_loop.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 29, __pyx_L1_error) + __pyx_v_self->is_in_wait_loop = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.is_in_wait_loop.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12__reduce_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12__reduce_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + int __pyx_t_15; + int __pyx_t_16; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.conditional_breakpoint_exception, self.is_in_wait_loop, self.is_tracing, self.pydev_call_from_jinja2, self.pydev_call_inside_jinja2, self.pydev_django_resolve_frame, self.pydev_func_name, self.pydev_message, self.pydev_next_line, self.pydev_notify_kill, self.pydev_original_step_cmd, self.pydev_smart_child_offset, self.pydev_smart_parent_offset, self.pydev_smart_step_into_variants, self.pydev_smart_step_stop, self.pydev_state, self.pydev_step_cmd, self.pydev_step_stop, self.pydev_use_scoped_step_frame, self.step_in_initial_location, self.suspend_type, self.suspended_at_unhandled, self.target_id_to_smart_step_into_variant, self.thread_tracer, self.top_level_thread_tracer_no_back_frames, self.top_level_thread_tracer_unhandled, self.trace_suspend_type, self.weak_thread) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_in_wait_loop); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->is_tracing); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_self->pydev_django_resolve_frame); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_next_line); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyBool_FromLong(__pyx_v_self->pydev_notify_kill); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_original_step_cmd); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_smart_child_offset); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_smart_parent_offset); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_state); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_self->pydev_step_cmd); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = __Pyx_PyBool_FromLong(__pyx_v_self->pydev_use_scoped_step_frame); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_12 = __Pyx_PyInt_From_int(__pyx_v_self->suspend_type); if (unlikely(!__pyx_t_12)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_13 = __Pyx_PyBool_FromLong(__pyx_v_self->suspended_at_unhandled); if (unlikely(!__pyx_t_13)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_14 = PyTuple_New(28); if (unlikely(!__pyx_t_14)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_INCREF(__pyx_v_self->conditional_breakpoint_exception); + __Pyx_GIVEREF(__pyx_v_self->conditional_breakpoint_exception); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_v_self->conditional_breakpoint_exception)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->pydev_call_from_jinja2); + __Pyx_GIVEREF(__pyx_v_self->pydev_call_from_jinja2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 3, __pyx_v_self->pydev_call_from_jinja2)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->pydev_call_inside_jinja2); + __Pyx_GIVEREF(__pyx_v_self->pydev_call_inside_jinja2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_v_self->pydev_call_inside_jinja2)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->pydev_func_name); + __Pyx_GIVEREF(__pyx_v_self->pydev_func_name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_v_self->pydev_func_name)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->pydev_message); + __Pyx_GIVEREF(__pyx_v_self->pydev_message); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 7, __pyx_v_self->pydev_message)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 8, __pyx_t_4)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 9, __pyx_t_5)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 10, __pyx_t_6)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 11, __pyx_t_7)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_8); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 12, __pyx_t_8)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->pydev_smart_step_into_variants); + __Pyx_GIVEREF(__pyx_v_self->pydev_smart_step_into_variants); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 13, __pyx_v_self->pydev_smart_step_into_variants)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->pydev_smart_step_stop); + __Pyx_GIVEREF(__pyx_v_self->pydev_smart_step_stop); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 14, __pyx_v_self->pydev_smart_step_stop)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_9); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 15, __pyx_t_9)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_10); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 16, __pyx_t_10)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->pydev_step_stop); + __Pyx_GIVEREF(__pyx_v_self->pydev_step_stop); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 17, __pyx_v_self->pydev_step_stop)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_11); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 18, __pyx_t_11)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->step_in_initial_location); + __Pyx_GIVEREF(__pyx_v_self->step_in_initial_location); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 19, __pyx_v_self->step_in_initial_location)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_12); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 20, __pyx_t_12)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_13); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 21, __pyx_t_13)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->target_id_to_smart_step_into_variant); + __Pyx_GIVEREF(__pyx_v_self->target_id_to_smart_step_into_variant); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 22, __pyx_v_self->target_id_to_smart_step_into_variant)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->thread_tracer); + __Pyx_GIVEREF(__pyx_v_self->thread_tracer); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 23, __pyx_v_self->thread_tracer)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + __Pyx_GIVEREF(__pyx_v_self->top_level_thread_tracer_no_back_frames); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 24, __pyx_v_self->top_level_thread_tracer_no_back_frames)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->top_level_thread_tracer_unhandled); + __Pyx_GIVEREF(__pyx_v_self->top_level_thread_tracer_unhandled); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 25, __pyx_v_self->top_level_thread_tracer_unhandled)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->trace_suspend_type); + __Pyx_GIVEREF(__pyx_v_self->trace_suspend_type); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 26, __pyx_v_self->trace_suspend_type)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->weak_thread); + __Pyx_GIVEREF(__pyx_v_self->weak_thread); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 27, __pyx_v_self->weak_thread)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_8 = 0; + __pyx_t_9 = 0; + __pyx_t_10 = 0; + __pyx_t_11 = 0; + __pyx_t_12 = 0; + __pyx_t_13 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_14); + __pyx_t_14 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.conditional_breakpoint_exception, self.is_in_wait_loop, self.is_tracing, self.pydev_call_from_jinja2, self.pydev_call_inside_jinja2, self.pydev_django_resolve_frame, self.pydev_func_name, self.pydev_message, self.pydev_next_line, self.pydev_notify_kill, self.pydev_original_step_cmd, self.pydev_smart_child_offset, self.pydev_smart_parent_offset, self.pydev_smart_step_into_variants, self.pydev_smart_step_stop, self.pydev_state, self.pydev_step_cmd, self.pydev_step_stop, self.pydev_use_scoped_step_frame, self.step_in_initial_location, self.suspend_type, self.suspended_at_unhandled, self.target_id_to_smart_step_into_variant, self.thread_tracer, self.top_level_thread_tracer_no_back_frames, self.top_level_thread_tracer_unhandled, self.trace_suspend_type, self.weak_thread) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_14 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_14)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_v__dict = __pyx_t_14; + __pyx_t_14 = 0; + + /* "(tree fragment)":7 + * state = (self.conditional_breakpoint_exception, self.is_in_wait_loop, self.is_tracing, self.pydev_call_from_jinja2, self.pydev_call_inside_jinja2, self.pydev_django_resolve_frame, self.pydev_func_name, self.pydev_message, self.pydev_next_line, self.pydev_notify_kill, self.pydev_original_step_cmd, self.pydev_smart_child_offset, self.pydev_smart_parent_offset, self.pydev_smart_step_into_variants, self.pydev_smart_step_stop, self.pydev_state, self.pydev_step_cmd, self.pydev_step_stop, self.pydev_use_scoped_step_frame, self.step_in_initial_location, self.suspend_type, self.suspended_at_unhandled, self.target_id_to_smart_step_into_variant, self.thread_tracer, self.top_level_thread_tracer_no_back_frames, self.top_level_thread_tracer_unhandled, self.trace_suspend_type, self.weak_thread) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_15 = (__pyx_v__dict != Py_None); + if (__pyx_t_15) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_v__dict)) __PYX_ERR(2, 8, __pyx_L1_error); + __pyx_t_13 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_14); if (unlikely(!__pyx_t_13)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_13)); + __pyx_t_13 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.conditional_breakpoint_exception is not None or self.pydev_call_from_jinja2 is not None or self.pydev_call_inside_jinja2 is not None or self.pydev_func_name is not None or self.pydev_message is not None or self.pydev_smart_step_into_variants is not None or self.pydev_smart_step_stop is not None or self.pydev_step_stop is not None or self.step_in_initial_location is not None or self.target_id_to_smart_step_into_variant is not None or self.thread_tracer is not None or self.top_level_thread_tracer_no_back_frames is not None or self.top_level_thread_tracer_unhandled is not None or self.trace_suspend_type is not None or self.weak_thread is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.conditional_breakpoint_exception, self.is_in_wait_loop, self.is_tracing, self.pydev_call_from_jinja2, self.pydev_call_inside_jinja2, self.pydev_django_resolve_frame, self.pydev_func_name, self.pydev_message, self.pydev_next_line, self.pydev_notify_kill, self.pydev_original_step_cmd, self.pydev_smart_child_offset, self.pydev_smart_parent_offset, self.pydev_smart_step_into_variants, self.pydev_smart_step_stop, self.pydev_state, self.pydev_step_cmd, self.pydev_step_stop, self.pydev_use_scoped_step_frame, self.step_in_initial_location, self.suspend_type, self.suspended_at_unhandled, self.target_id_to_smart_step_into_variant, self.thread_tracer, self.top_level_thread_tracer_no_back_frames, self.top_level_thread_tracer_unhandled, self.trace_suspend_type, self.weak_thread) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.conditional_breakpoint_exception is not None or self.pydev_call_from_jinja2 is not None or self.pydev_call_inside_jinja2 is not None or self.pydev_func_name is not None or self.pydev_message is not None or self.pydev_smart_step_into_variants is not None or self.pydev_smart_step_stop is not None or self.pydev_step_stop is not None or self.step_in_initial_location is not None or self.target_id_to_smart_step_into_variant is not None or self.thread_tracer is not None or self.top_level_thread_tracer_no_back_frames is not None or self.top_level_thread_tracer_unhandled is not None or self.trace_suspend_type is not None or self.weak_thread is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, None), state + */ + /*else*/ { + __pyx_t_16 = (__pyx_v_self->conditional_breakpoint_exception != ((PyObject*)Py_None)); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->pydev_call_from_jinja2 != Py_None); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->pydev_call_inside_jinja2 != Py_None); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->pydev_func_name != ((PyObject*)Py_None)); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->pydev_message != ((PyObject*)Py_None)); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->pydev_smart_step_into_variants != ((PyObject*)Py_None)); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->pydev_smart_step_stop != Py_None); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->pydev_step_stop != Py_None); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->step_in_initial_location != Py_None); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->target_id_to_smart_step_into_variant != ((PyObject*)Py_None)); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->thread_tracer != Py_None); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->top_level_thread_tracer_no_back_frames != Py_None); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->top_level_thread_tracer_unhandled != Py_None); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->trace_suspend_type != ((PyObject*)Py_None)); + if (!__pyx_t_16) { + } else { + __pyx_t_15 = __pyx_t_16; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_self->weak_thread != Py_None); + __pyx_t_15 = __pyx_t_16; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_15; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.conditional_breakpoint_exception is not None or self.pydev_call_from_jinja2 is not None or self.pydev_call_inside_jinja2 is not None or self.pydev_func_name is not None or self.pydev_message is not None or self.pydev_smart_step_into_variants is not None or self.pydev_smart_step_stop is not None or self.pydev_step_stop is not None or self.step_in_initial_location is not None or self.target_id_to_smart_step_into_variant is not None or self.thread_tracer is not None or self.top_level_thread_tracer_no_back_frames is not None or self.top_level_thread_tracer_unhandled is not None or self.trace_suspend_type is not None or self.weak_thread is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.conditional_breakpoint_exception is not None or self.pydev_call_from_jinja2 is not None or self.pydev_call_inside_jinja2 is not None or self.pydev_func_name is not None or self.pydev_message is not None or self.pydev_smart_step_into_variants is not None or self.pydev_smart_step_stop is not None or self.pydev_step_stop is not None or self.step_in_initial_location is not None or self.target_id_to_smart_step_into_variant is not None or self.thread_tracer is not None or self.top_level_thread_tracer_no_back_frames is not None or self.top_level_thread_tracer_unhandled is not None or self.trace_suspend_type is not None or self.weak_thread is not None + * if use_setstate: + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_n_s_pyx_unpickle_PyDBAdditionalThr); if (unlikely(!__pyx_t_13)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_14 = PyTuple_New(3); if (unlikely(!__pyx_t_14)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_221489684); + __Pyx_GIVEREF(__pyx_int_221489684); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_int_221489684)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 2, Py_None)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_GIVEREF(__pyx_t_13); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_13)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_14); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_14)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_v_state)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_13 = 0; + __pyx_t_14 = 0; + __pyx_r = __pyx_t_12; + __pyx_t_12 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.conditional_breakpoint_exception is not None or self.pydev_call_from_jinja2 is not None or self.pydev_call_inside_jinja2 is not None or self.pydev_func_name is not None or self.pydev_message is not None or self.pydev_smart_step_into_variants is not None or self.pydev_smart_step_stop is not None or self.pydev_step_stop is not None or self.step_in_initial_location is not None or self.target_id_to_smart_step_into_variant is not None or self.thread_tracer is not None or self.top_level_thread_tracer_no_back_frames is not None or self.top_level_thread_tracer_unhandled is not None or self.trace_suspend_type is not None or self.weak_thread is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, None), state + * else: + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_n_s_pyx_unpickle_PyDBAdditionalThr); if (unlikely(!__pyx_t_12)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_14 = PyTuple_New(3); if (unlikely(!__pyx_t_14)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_221489684); + __Pyx_GIVEREF(__pyx_int_221489684); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_int_221489684)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_v_state)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_13 = PyTuple_New(2); if (unlikely(!__pyx_t_13)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_12); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_14); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_14)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_12 = 0; + __pyx_t_14 = 0; + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(2, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(2, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14__setstate_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14__setstate_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_PyDBAdditionalThreadInfo__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":223 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef set_additional_thread_info(thread): # <<<<<<<<<<<<<< + * # ELSE + * # def set_additional_thread_info(thread): + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_1set_additional_thread_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_set_additional_thread_info(PyObject *__pyx_v_thread, CYTHON_UNUSED int __pyx_skip_dispatch) { + PyObject *__pyx_v_additional_info = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + unsigned int __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + PyObject *__pyx_t_18 = NULL; + PyObject *__pyx_t_19 = NULL; + int __pyx_t_20; + int __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("set_additional_thread_info", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":228 + * # ENDIF + * # fmt: on + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * if additional_info is None: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":229 + * # fmt: on + * try: + * additional_info = thread.additional_info # <<<<<<<<<<<<<< + * if additional_info is None: + * raise AttributeError() + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_additional_info); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 229, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_additional_info = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":230 + * try: + * additional_info = thread.additional_info + * if additional_info is None: # <<<<<<<<<<<<<< + * raise AttributeError() + * except: + */ + __pyx_t_5 = (__pyx_v_additional_info == Py_None); + if (unlikely(__pyx_t_5)) { + + /* "_pydevd_bundle/pydevd_cython.pyx":231 + * additional_info = thread.additional_info + * if additional_info is None: + * raise AttributeError() # <<<<<<<<<<<<<< + * except: + * with _set_additional_thread_info_lock: + */ + __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_builtin_AttributeError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 231, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(0, 231, __pyx_L3_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":230 + * try: + * additional_info = thread.additional_info + * if additional_info is None: # <<<<<<<<<<<<<< + * raise AttributeError() + * except: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":228 + * # ENDIF + * # fmt: on + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * if additional_info is None: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":232 + * if additional_info is None: + * raise AttributeError() + * except: # <<<<<<<<<<<<<< + * with _set_additional_thread_info_lock: + * # If it's not there, set it within a lock to avoid any racing + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.set_additional_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 232, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "_pydevd_bundle/pydevd_cython.pyx":233 + * raise AttributeError() + * except: + * with _set_additional_thread_info_lock: # <<<<<<<<<<<<<< + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + */ + /*with:*/ { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_set_additional_thread_info_lock); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 233, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = __Pyx_PyObject_LookupSpecial(__pyx_t_8, __pyx_n_s_exit); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 233, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_11 = __Pyx_PyObject_LookupSpecial(__pyx_t_8, __pyx_n_s_enter); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 233, __pyx_L12_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_12 = NULL; + __pyx_t_13 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_11))) { + __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_11); + if (likely(__pyx_t_12)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); + __Pyx_INCREF(__pyx_t_12); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_11, function); + __pyx_t_13 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_12, NULL}; + __pyx_t_10 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_13, 0+__pyx_t_13); + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 233, __pyx_L12_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + /*try:*/ { + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_14); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":236 + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * except: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19); + __Pyx_XGOTREF(__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_18); + __Pyx_XGOTREF(__pyx_t_19); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":237 + * # conditions. + * try: + * additional_info = thread.additional_info # <<<<<<<<<<<<<< + * except: + * additional_info = None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_additional_info); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 237, __pyx_L26_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_XDECREF_SET(__pyx_v_additional_info, __pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":236 + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * except: + */ + } + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; + __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0; + goto __pyx_L33_try_end; + __pyx_L26_error:; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":238 + * try: + * additional_info = thread.additional_info + * except: # <<<<<<<<<<<<<< + * additional_info = None + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.set_additional_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_10, &__pyx_t_11) < 0) __PYX_ERR(0, 238, __pyx_L28_except_error) + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + + /* "_pydevd_bundle/pydevd_cython.pyx":239 + * additional_info = thread.additional_info + * except: + * additional_info = None # <<<<<<<<<<<<<< + * + * if additional_info is None: + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_additional_info, Py_None); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + goto __pyx_L27_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":236 + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * except: + */ + __pyx_L28_except_error:; + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19); + goto __pyx_L18_error; + __pyx_L27_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19); + __pyx_L33_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":241 + * additional_info = None + * + * if additional_info is None: # <<<<<<<<<<<<<< + * # Note: don't call PyDBAdditionalThreadInfo constructor at this + * # point as it can piggy-back into the debugger which could + */ + __pyx_t_5 = (__pyx_v_additional_info == Py_None); + if (__pyx_t_5) { + + /* "_pydevd_bundle/pydevd_cython.pyx":246 + * # get here again, rather get the global ref which was pre-created + * # and add a new entry only after we set thread.additional_info. + * additional_info = _next_additional_info[0] # <<<<<<<<<<<<<< + * thread.additional_info = additional_info + * additional_info.weak_thread = weakref.ref(thread) + */ + __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_next_additional_info); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 246, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_11, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 246, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_DECREF_SET(__pyx_v_additional_info, __pyx_t_10); + __pyx_t_10 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":247 + * # and add a new entry only after we set thread.additional_info. + * additional_info = _next_additional_info[0] + * thread.additional_info = additional_info # <<<<<<<<<<<<<< + * additional_info.weak_thread = weakref.ref(thread) + * add_additional_info(additional_info) + */ + if (__Pyx_PyObject_SetAttrStr(__pyx_v_thread, __pyx_n_s_additional_info, __pyx_v_additional_info) < 0) __PYX_ERR(0, 247, __pyx_L18_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":248 + * additional_info = _next_additional_info[0] + * thread.additional_info = additional_info + * additional_info.weak_thread = weakref.ref(thread) # <<<<<<<<<<<<<< + * add_additional_info(additional_info) + * del _next_additional_info[:] + */ + __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_weakref); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 248, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_ref); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 248, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __pyx_t_11 = NULL; + __pyx_t_13 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_13 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_v_thread}; + __pyx_t_10 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_13, 1+__pyx_t_13); + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 248, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + if (__Pyx_PyObject_SetAttrStr(__pyx_v_additional_info, __pyx_n_s_weak_thread, __pyx_t_10) < 0) __PYX_ERR(0, 248, __pyx_L18_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":249 + * thread.additional_info = additional_info + * additional_info.weak_thread = weakref.ref(thread) + * add_additional_info(additional_info) # <<<<<<<<<<<<<< + * del _next_additional_info[:] + * _next_additional_info.append(PyDBAdditionalThreadInfo()) + */ + if (!(likely(((__pyx_v_additional_info) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_additional_info, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 249, __pyx_L18_error) + __pyx_t_10 = __pyx_f_14_pydevd_bundle_13pydevd_cython_add_additional_info(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_additional_info), 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 249, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":250 + * additional_info.weak_thread = weakref.ref(thread) + * add_additional_info(additional_info) + * del _next_additional_info[:] # <<<<<<<<<<<<<< + * _next_additional_info.append(PyDBAdditionalThreadInfo()) + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_next_additional_info); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 250, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_10); + if (__Pyx_PyObject_DelSlice(__pyx_t_10, 0, 0, NULL, NULL, &__pyx_slice__2, 0, 0, 1) < 0) __PYX_ERR(0, 250, __pyx_L18_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":251 + * add_additional_info(additional_info) + * del _next_additional_info[:] + * _next_additional_info.append(PyDBAdditionalThreadInfo()) # <<<<<<<<<<<<<< + * + * return additional_info + */ + __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_next_additional_info); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 251, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_8 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 251, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_20 = __Pyx_PyObject_Append(__pyx_t_10, __pyx_t_8); if (unlikely(__pyx_t_20 == ((int)-1))) __PYX_ERR(0, 251, __pyx_L18_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":241 + * additional_info = None + * + * if additional_info is None: # <<<<<<<<<<<<<< + * # Note: don't call PyDBAdditionalThreadInfo constructor at this + * # point as it can piggy-back into the debugger which could + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":233 + * raise AttributeError() + * except: + * with _set_additional_thread_info_lock: # <<<<<<<<<<<<<< + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + */ + } + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; + goto __pyx_L25_try_end; + __pyx_L18_error:; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.set_additional_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_10, &__pyx_t_11) < 0) __PYX_ERR(0, 233, __pyx_L20_except_error) + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __pyx_t_12 = PyTuple_Pack(3, __pyx_t_8, __pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 233, __pyx_L20_except_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_19 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_12, NULL); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 233, __pyx_L20_except_error) + __Pyx_GOTREF(__pyx_t_19); + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_19); + __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0; + if (__pyx_t_5 < 0) __PYX_ERR(0, 233, __pyx_L20_except_error) + __pyx_t_21 = (!__pyx_t_5); + if (unlikely(__pyx_t_21)) { + __Pyx_GIVEREF(__pyx_t_8); + __Pyx_GIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_ErrRestoreWithState(__pyx_t_8, __pyx_t_10, __pyx_t_11); + __pyx_t_8 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; + __PYX_ERR(0, 233, __pyx_L20_except_error) + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + goto __pyx_L19_exception_handled; + } + __pyx_L20_except_error:; + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); + goto __pyx_L5_except_error; + __pyx_L19_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); + __pyx_L25_try_end:; + } + } + /*finally:*/ { + /*normal exit:*/{ + if (__pyx_t_9) { + __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_tuple__3, NULL); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 233, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + goto __pyx_L17; + } + __pyx_L17:; + } + goto __pyx_L40; + __pyx_L12_error:; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L5_except_error; + __pyx_L40:; + } + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L4_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":228 + * # ENDIF + * # fmt: on + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * if additional_info is None: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L4_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L8_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":253 + * _next_additional_info.append(PyDBAdditionalThreadInfo()) + * + * return additional_info # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + if (unlikely(!__pyx_v_additional_info)) { __Pyx_RaiseUnboundLocalError("additional_info"); __PYX_ERR(0, 253, __pyx_L1_error) } + __Pyx_INCREF(__pyx_v_additional_info); + __pyx_r = __pyx_v_additional_info; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":223 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef set_additional_thread_info(thread): # <<<<<<<<<<<<<< + * # ELSE + * # def set_additional_thread_info(thread): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.set_additional_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_additional_info); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_1set_additional_thread_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_1set_additional_thread_info = {"set_additional_thread_info", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_1set_additional_thread_info, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_1set_additional_thread_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_thread = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("set_additional_thread_info (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_thread,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_thread)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 223, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_additional_thread_info") < 0)) __PYX_ERR(0, 223, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_thread = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("set_additional_thread_info", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 223, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.set_additional_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_set_additional_thread_info(__pyx_self, __pyx_v_thread); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_set_additional_thread_info(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_thread) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("set_additional_thread_info", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_set_additional_thread_info(__pyx_v_thread, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 223, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.set_additional_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":272 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _update_stepping_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def _update_stepping_info(info): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython__update_stepping_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info) { + PyObject *__pyx_v_new_all_infos = NULL; + PyObject *__pyx_v_new_stepping = NULL; + PyObject *__pyx_v_py_db = NULL; + PyObject *__pyx_v_thread = NULL; + PyObject *__pyx_v_thread_id = NULL; + CYTHON_UNUSED PyObject *__pyx_v__queue = NULL; + PyObject *__pyx_v_event = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + int __pyx_t_17; + int __pyx_t_18; + PyObject *(*__pyx_t_19)(PyObject *); + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_update_stepping_info", 0); + __Pyx_INCREF((PyObject *)__pyx_v_info); + + /* "_pydevd_bundle/pydevd_cython.pyx":281 + * global _all_infos + * + * with _update_infos_lock: # <<<<<<<<<<<<<< + * # Removes entries that are no longer valid. + * new_all_infos = set() + */ + /*with:*/ { + __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 281, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 281, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 281, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + /*try:*/ { + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":283 + * with _update_infos_lock: + * # Removes entries that are no longer valid. + * new_all_infos = set() # <<<<<<<<<<<<<< + * for info in _all_infos: + * if info._get_related_thread() is not None: + */ + __pyx_t_2 = PySet_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 283, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_new_all_infos = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":284 + * # Removes entries that are no longer valid. + * new_all_infos = set() + * for info in _all_infos: # <<<<<<<<<<<<<< + * if info._get_related_thread() is not None: + * new_all_infos.add(info) + */ + __pyx_t_9 = 0; + __pyx_t_3 = __Pyx_set_iterator(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos, 1, (&__pyx_t_10), (&__pyx_t_11)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 284, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_2); + __pyx_t_2 = __pyx_t_3; + __pyx_t_3 = 0; + while (1) { + __pyx_t_12 = __Pyx_set_iter_next(__pyx_t_2, __pyx_t_10, &__pyx_t_9, &__pyx_t_3, __pyx_t_11); + if (unlikely(__pyx_t_12 == 0)) break; + if (unlikely(__pyx_t_12 == -1)) __PYX_ERR(0, 284, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 284, __pyx_L7_error) + __Pyx_DECREF_SET(__pyx_v_info, ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":285 + * new_all_infos = set() + * for info in _all_infos: + * if info._get_related_thread() is not None: # <<<<<<<<<<<<<< + * new_all_infos.add(info) + * _all_infos = new_all_infos + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_info->__pyx_vtab)->_get_related_thread(__pyx_v_info, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 285, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_13 = (__pyx_t_3 != Py_None); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":286 + * for info in _all_infos: + * if info._get_related_thread() is not None: + * new_all_infos.add(info) # <<<<<<<<<<<<<< + * _all_infos = new_all_infos + * + */ + __pyx_t_14 = PySet_Add(__pyx_v_new_all_infos, ((PyObject *)__pyx_v_info)); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 286, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":285 + * new_all_infos = set() + * for info in _all_infos: + * if info._get_related_thread() is not None: # <<<<<<<<<<<<<< + * new_all_infos.add(info) + * _all_infos = new_all_infos + */ + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":287 + * if info._get_related_thread() is not None: + * new_all_infos.add(info) + * _all_infos = new_all_infos # <<<<<<<<<<<<<< + * + * new_stepping = set() + */ + __Pyx_INCREF(__pyx_v_new_all_infos); + __Pyx_XGOTREF(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos); + __Pyx_DECREF_SET(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos, __pyx_v_new_all_infos); + __Pyx_GIVEREF(__pyx_v_new_all_infos); + + /* "_pydevd_bundle/pydevd_cython.pyx":289 + * _all_infos = new_all_infos + * + * new_stepping = set() # <<<<<<<<<<<<<< + * for info in _all_infos: + * if info._is_stepping(): + */ + __pyx_t_2 = PySet_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 289, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_new_stepping = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":290 + * + * new_stepping = set() + * for info in _all_infos: # <<<<<<<<<<<<<< + * if info._is_stepping(): + * new_stepping.add(info) + */ + __pyx_t_10 = 0; + __pyx_t_3 = __Pyx_set_iterator(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos, 1, (&__pyx_t_9), (&__pyx_t_11)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 290, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_2); + __pyx_t_2 = __pyx_t_3; + __pyx_t_3 = 0; + while (1) { + __pyx_t_12 = __Pyx_set_iter_next(__pyx_t_2, __pyx_t_9, &__pyx_t_10, &__pyx_t_3, __pyx_t_11); + if (unlikely(__pyx_t_12 == 0)) break; + if (unlikely(__pyx_t_12 == -1)) __PYX_ERR(0, 290, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 290, __pyx_L7_error) + __Pyx_DECREF_SET(__pyx_v_info, ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":291 + * new_stepping = set() + * for info in _all_infos: + * if info._is_stepping(): # <<<<<<<<<<<<<< + * new_stepping.add(info) + * _infos_stepping = new_stepping + */ + __pyx_t_13 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_info->__pyx_vtab)->_is_stepping(__pyx_v_info, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 291, __pyx_L7_error) + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":292 + * for info in _all_infos: + * if info._is_stepping(): + * new_stepping.add(info) # <<<<<<<<<<<<<< + * _infos_stepping = new_stepping + * + */ + __pyx_t_14 = PySet_Add(__pyx_v_new_stepping, ((PyObject *)__pyx_v_info)); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 292, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":291 + * new_stepping = set() + * for info in _all_infos: + * if info._is_stepping(): # <<<<<<<<<<<<<< + * new_stepping.add(info) + * _infos_stepping = new_stepping + */ + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":293 + * if info._is_stepping(): + * new_stepping.add(info) + * _infos_stepping = new_stepping # <<<<<<<<<<<<<< + * + * py_db = get_global_debugger() + */ + __Pyx_INCREF(__pyx_v_new_stepping); + __Pyx_XGOTREF(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping); + __Pyx_DECREF_SET(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping, __pyx_v_new_stepping); + __Pyx_GIVEREF(__pyx_v_new_stepping); + + /* "_pydevd_bundle/pydevd_cython.pyx":281 + * global _all_infos + * + * with _update_infos_lock: # <<<<<<<<<<<<<< + * # Removes entries that are no longer valid. + * new_all_infos = set() + */ + } + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L12_try_end; + __pyx_L7_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython._update_stepping_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(0, 281, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __pyx_t_15 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 281, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_15, NULL); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 281, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_16); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + if (__pyx_t_13 < 0) __PYX_ERR(0, 281, __pyx_L9_except_error) + __pyx_t_17 = (!__pyx_t_13); + if (unlikely(__pyx_t_17)) { + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_3, __pyx_t_4); + __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; + __PYX_ERR(0, 281, __pyx_L9_except_error) + } + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L8_exception_handled; + } + __pyx_L9_except_error:; + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); + goto __pyx_L1_error; + __pyx_L8_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); + __pyx_L12_try_end:; + } + } + /*finally:*/ { + /*normal exit:*/{ + if (__pyx_t_1) { + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__3, NULL); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 281, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + goto __pyx_L6; + } + __pyx_L6:; + } + goto __pyx_L22; + __pyx_L3_error:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L1_error; + __pyx_L22:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":295 + * _infos_stepping = new_stepping + * + * py_db = get_global_debugger() # <<<<<<<<<<<<<< + * if py_db is not None and not py_db.pydb_disposed: + * thread = info.weak_thread() + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_get_global_debugger); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v_py_db = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":296 + * + * py_db = get_global_debugger() + * if py_db is not None and not py_db.pydb_disposed: # <<<<<<<<<<<<<< + * thread = info.weak_thread() + * if thread is not None: + */ + __pyx_t_13 = (__pyx_v_py_db != Py_None); + if (__pyx_t_13) { + } else { + __pyx_t_17 = __pyx_t_13; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_pydb_disposed); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_18 = (!__pyx_t_13); + __pyx_t_17 = __pyx_t_18; + __pyx_L24_bool_binop_done:; + if (__pyx_t_17) { + + /* "_pydevd_bundle/pydevd_cython.pyx":297 + * py_db = get_global_debugger() + * if py_db is not None and not py_db.pydb_disposed: + * thread = info.weak_thread() # <<<<<<<<<<<<<< + * if thread is not None: + * thread_id = get_thread_id(thread) + */ + __Pyx_INCREF(__pyx_v_info->weak_thread); + __pyx_t_3 = __pyx_v_info->weak_thread; __pyx_t_2 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 297, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v_thread = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":298 + * if py_db is not None and not py_db.pydb_disposed: + * thread = info.weak_thread() + * if thread is not None: # <<<<<<<<<<<<<< + * thread_id = get_thread_id(thread) + * _queue, event = py_db.get_internal_queue_and_event(thread_id) + */ + __pyx_t_17 = (__pyx_v_thread != Py_None); + if (__pyx_t_17) { + + /* "_pydevd_bundle/pydevd_cython.pyx":299 + * thread = info.weak_thread() + * if thread is not None: + * thread_id = get_thread_id(thread) # <<<<<<<<<<<<<< + * _queue, event = py_db.get_internal_queue_and_event(thread_id) + * event.set() + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_get_thread_id); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 299, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_thread}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 299, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v_thread_id = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":300 + * if thread is not None: + * thread_id = get_thread_id(thread) + * _queue, event = py_db.get_internal_queue_and_event(thread_id) # <<<<<<<<<<<<<< + * event.set() + * + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_get_internal_queue_and_event); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_thread_id}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) { + PyObject* sequence = __pyx_t_4; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 300, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_3 = PyList_GET_ITEM(sequence, 0); + __pyx_t_2 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + #endif + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_15 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_19 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_15); + index = 0; __pyx_t_3 = __pyx_t_19(__pyx_t_15); if (unlikely(!__pyx_t_3)) goto __pyx_L27_unpacking_failed; + __Pyx_GOTREF(__pyx_t_3); + index = 1; __pyx_t_2 = __pyx_t_19(__pyx_t_15); if (unlikely(!__pyx_t_2)) goto __pyx_L27_unpacking_failed; + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_15), 2) < 0) __PYX_ERR(0, 300, __pyx_L1_error) + __pyx_t_19 = NULL; + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + goto __pyx_L28_unpacking_done; + __pyx_L27_unpacking_failed:; + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_19 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 300, __pyx_L1_error) + __pyx_L28_unpacking_done:; + } + __pyx_v__queue = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_event = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":301 + * thread_id = get_thread_id(thread) + * _queue, event = py_db.get_internal_queue_and_event(thread_id) + * event.set() # <<<<<<<<<<<<<< + * + * # fmt: off + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_event, __pyx_n_s_set); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":298 + * if py_db is not None and not py_db.pydb_disposed: + * thread = info.weak_thread() + * if thread is not None: # <<<<<<<<<<<<<< + * thread_id = get_thread_id(thread) + * _queue, event = py_db.get_internal_queue_and_event(thread_id) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":296 + * + * py_db = get_global_debugger() + * if py_db is not None and not py_db.pydb_disposed: # <<<<<<<<<<<<<< + * thread = info.weak_thread() + * if thread is not None: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":272 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _update_stepping_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def _update_stepping_info(info): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_15); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython._update_stepping_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_new_all_infos); + __Pyx_XDECREF(__pyx_v_new_stepping); + __Pyx_XDECREF(__pyx_v_py_db); + __Pyx_XDECREF(__pyx_v_thread); + __Pyx_XDECREF(__pyx_v_thread_id); + __Pyx_XDECREF(__pyx_v__queue); + __Pyx_XDECREF(__pyx_v_event); + __Pyx_XDECREF((PyObject *)__pyx_v_info); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":305 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef add_additional_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def add_additional_info(info): + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_3add_additional_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_add_additional_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info, CYTHON_UNUSED int __pyx_skip_dispatch) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + int __pyx_t_13; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("add_additional_info", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":310 + * # ENDIF + * # fmt: on + * with _update_infos_lock: # <<<<<<<<<<<<<< + * _all_infos.add(info) + * if info._is_stepping(): + */ + /*with:*/ { + __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 310, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 310, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + /*try:*/ { + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":311 + * # fmt: on + * with _update_infos_lock: + * _all_infos.add(info) # <<<<<<<<<<<<<< + * if info._is_stepping(): + * _infos_stepping.add(info) + */ + if (unlikely(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "add"); + __PYX_ERR(0, 311, __pyx_L7_error) + } + __pyx_t_9 = PySet_Add(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos, ((PyObject *)__pyx_v_info)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 311, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":312 + * with _update_infos_lock: + * _all_infos.add(info) + * if info._is_stepping(): # <<<<<<<<<<<<<< + * _infos_stepping.add(info) + * + */ + __pyx_t_10 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_info->__pyx_vtab)->_is_stepping(__pyx_v_info, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 312, __pyx_L7_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":313 + * _all_infos.add(info) + * if info._is_stepping(): + * _infos_stepping.add(info) # <<<<<<<<<<<<<< + * + * # fmt: off + */ + if (unlikely(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "add"); + __PYX_ERR(0, 313, __pyx_L7_error) + } + __pyx_t_9 = PySet_Add(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping, ((PyObject *)__pyx_v_info)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 313, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":312 + * with _update_infos_lock: + * _all_infos.add(info) + * if info._is_stepping(): # <<<<<<<<<<<<<< + * _infos_stepping.add(info) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":310 + * # ENDIF + * # fmt: on + * with _update_infos_lock: # <<<<<<<<<<<<<< + * _all_infos.add(info) + * if info._is_stepping(): + */ + } + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L12_try_end; + __pyx_L7_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.add_additional_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(0, 310, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __pyx_t_11 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 310, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_11, NULL); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 310, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_12); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (__pyx_t_10 < 0) __PYX_ERR(0, 310, __pyx_L9_except_error) + __pyx_t_13 = (!__pyx_t_10); + if (unlikely(__pyx_t_13)) { + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_3, __pyx_t_4); + __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; + __PYX_ERR(0, 310, __pyx_L9_except_error) + } + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L8_exception_handled; + } + __pyx_L9_except_error:; + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); + goto __pyx_L1_error; + __pyx_L8_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); + __pyx_L12_try_end:; + } + } + /*finally:*/ { + /*normal exit:*/{ + if (__pyx_t_1) { + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__3, NULL); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + goto __pyx_L6; + } + __pyx_L6:; + } + goto __pyx_L17; + __pyx_L3_error:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L1_error; + __pyx_L17:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":305 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef add_additional_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def add_additional_info(info): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.add_additional_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_3add_additional_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_3add_additional_info = {"add_additional_info", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_3add_additional_info, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_3add_additional_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("add_additional_info (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_info,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_info)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 305, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_additional_info") < 0)) __PYX_ERR(0, 305, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)values[0]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("add_additional_info", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 305, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.add_additional_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_info), __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, 1, "info", 0))) __PYX_ERR(0, 305, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_2add_additional_info(__pyx_self, __pyx_v_info); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_2add_additional_info(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("add_additional_info", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_add_additional_info(__pyx_v_info, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.add_additional_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":317 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef remove_additional_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def remove_additional_info(info): + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_5remove_additional_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_remove_additional_info(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info, CYTHON_UNUSED int __pyx_skip_dispatch) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("remove_additional_info", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":322 + * # ENDIF + * # fmt: on + * with _update_infos_lock: # <<<<<<<<<<<<<< + * _all_infos.discard(info) + * _infos_stepping.discard(info) + */ + /*with:*/ { + __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 322, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 322, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 322, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + /*try:*/ { + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":323 + * # fmt: on + * with _update_infos_lock: + * _all_infos.discard(info) # <<<<<<<<<<<<<< + * _infos_stepping.discard(info) + * + */ + if (unlikely(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "discard"); + __PYX_ERR(0, 323, __pyx_L7_error) + } + __pyx_t_9 = __Pyx_PySet_Discard(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos, ((PyObject *)__pyx_v_info)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 323, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":324 + * with _update_infos_lock: + * _all_infos.discard(info) + * _infos_stepping.discard(info) # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "discard"); + __PYX_ERR(0, 324, __pyx_L7_error) + } + __pyx_t_9 = __Pyx_PySet_Discard(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping, ((PyObject *)__pyx_v_info)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 324, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":322 + * # ENDIF + * # fmt: on + * with _update_infos_lock: # <<<<<<<<<<<<<< + * _all_infos.discard(info) + * _infos_stepping.discard(info) + */ + } + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L12_try_end; + __pyx_L7_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.remove_additional_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(0, 322, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __pyx_t_10 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 322, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_10, NULL); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 322, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_11); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + if (__pyx_t_12 < 0) __PYX_ERR(0, 322, __pyx_L9_except_error) + __pyx_t_13 = (!__pyx_t_12); + if (unlikely(__pyx_t_13)) { + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_3, __pyx_t_4); + __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; + __PYX_ERR(0, 322, __pyx_L9_except_error) + } + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L8_exception_handled; + } + __pyx_L9_except_error:; + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); + goto __pyx_L1_error; + __pyx_L8_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); + __pyx_L12_try_end:; + } + } + /*finally:*/ { + /*normal exit:*/{ + if (__pyx_t_1) { + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__3, NULL); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 322, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + goto __pyx_L6; + } + __pyx_L6:; + } + goto __pyx_L16; + __pyx_L3_error:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L1_error; + __pyx_L16:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":317 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef remove_additional_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def remove_additional_info(info): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.remove_additional_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_5remove_additional_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_5remove_additional_info = {"remove_additional_info", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_5remove_additional_info, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_5remove_additional_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("remove_additional_info (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_info,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_info)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 317, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "remove_additional_info") < 0)) __PYX_ERR(0, 317, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)values[0]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("remove_additional_info", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 317, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.remove_additional_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_info), __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, 1, "info", 0))) __PYX_ERR(0, 317, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_4remove_additional_info(__pyx_self, __pyx_v_info); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_4remove_additional_info(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("remove_additional_info", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_remove_additional_info(__pyx_v_info, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 317, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.remove_additional_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":329 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef bint any_thread_stepping(): # <<<<<<<<<<<<<< + * # ELSE + * # def any_thread_stepping(): + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_7any_thread_stepping(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static int __pyx_f_14_pydevd_bundle_13pydevd_cython_any_thread_stepping(CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_r; + int __pyx_t_1; + + /* "_pydevd_bundle/pydevd_cython.pyx":334 + * # ENDIF + * # fmt: on + * return bool(_infos_stepping) # <<<<<<<<<<<<<< + * import linecache + * import os.path + */ + __pyx_t_1 = (__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping != Py_None)&&(PySet_GET_SIZE(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping) != 0); + __pyx_r = (!(!__pyx_t_1)); + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":329 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef bint any_thread_stepping(): # <<<<<<<<<<<<<< + * # ELSE + * # def any_thread_stepping(): + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_7any_thread_stepping(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_7any_thread_stepping = {"any_thread_stepping", (PyCFunction)__pyx_pw_14_pydevd_bundle_13pydevd_cython_7any_thread_stepping, METH_NOARGS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_7any_thread_stepping(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("any_thread_stepping (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_6any_thread_stepping(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_6any_thread_stepping(CYTHON_UNUSED PyObject *__pyx_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("any_thread_stepping", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_any_thread_stepping(0); if (unlikely(__pyx_t_1 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 329, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.any_thread_stepping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":359 + * except ImportError: + * + * def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): # <<<<<<<<<<<<<< + * return None + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9get_smart_step_into_variant_from_frame_offset(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_9get_smart_step_into_variant_from_frame_offset = {"get_smart_step_into_variant_from_frame_offset", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9get_smart_step_into_variant_from_frame_offset, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9get_smart_step_into_variant_from_frame_offset(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + CYTHON_UNUSED PyObject *__pyx_v_args = 0; + CYTHON_UNUSED PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_smart_step_into_variant_from_frame_offset (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "get_smart_step_into_variant_from_frame_offset", 1))) return NULL; + __Pyx_INCREF(__pyx_args); + __pyx_v_args = __pyx_args; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_8get_smart_step_into_variant_from_frame_offset(__pyx_self, __pyx_v_args, __pyx_v_kwargs); + + /* function exit code */ + __Pyx_DECREF(__pyx_v_args); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_8get_smart_step_into_variant_from_frame_offset(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_args, CYTHON_UNUSED PyObject *__pyx_v_kwargs) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_smart_step_into_variant_from_frame_offset", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":360 + * + * def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): + * return None # <<<<<<<<<<<<<< + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":359 + * except ImportError: + * + * def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): # <<<<<<<<<<<<<< + * return None + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":395 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def is_unhandled_exception(container_obj, py_db, frame, int last_raise_line, set raise_lines): # <<<<<<<<<<<<<< + * # ELSE + * # def is_unhandled_exception(container_obj, py_db, frame, last_raise_line, raise_lines): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_11is_unhandled_exception(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_11is_unhandled_exception = {"is_unhandled_exception", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_11is_unhandled_exception, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_11is_unhandled_exception(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_container_obj = 0; + PyObject *__pyx_v_py_db = 0; + PyObject *__pyx_v_frame = 0; + int __pyx_v_last_raise_line; + PyObject *__pyx_v_raise_lines = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_unhandled_exception (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_container_obj,&__pyx_n_s_py_db,&__pyx_n_s_frame,&__pyx_n_s_last_raise_line,&__pyx_n_s_raise_lines,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_container_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_py_db)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("is_unhandled_exception", 1, 5, 5, 1); __PYX_ERR(0, 395, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("is_unhandled_exception", 1, 5, 5, 2); __PYX_ERR(0, 395, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_last_raise_line)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("is_unhandled_exception", 1, 5, 5, 3); __PYX_ERR(0, 395, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_raise_lines)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("is_unhandled_exception", 1, 5, 5, 4); __PYX_ERR(0, 395, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "is_unhandled_exception") < 0)) __PYX_ERR(0, 395, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + } + __pyx_v_container_obj = values[0]; + __pyx_v_py_db = values[1]; + __pyx_v_frame = values[2]; + __pyx_v_last_raise_line = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_last_raise_line == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L3_error) + __pyx_v_raise_lines = ((PyObject*)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("is_unhandled_exception", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 395, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.is_unhandled_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_raise_lines), (&PySet_Type), 1, "raise_lines", 1))) __PYX_ERR(0, 395, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_10is_unhandled_exception(__pyx_self, __pyx_v_container_obj, __pyx_v_py_db, __pyx_v_frame, __pyx_v_last_raise_line, __pyx_v_raise_lines); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_10is_unhandled_exception(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_container_obj, PyObject *__pyx_v_py_db, PyObject *__pyx_v_frame, int __pyx_v_last_raise_line, PyObject *__pyx_v_raise_lines) { + PyObject *__pyx_v_try_except_infos = NULL; + PyObject *__pyx_v_valid_try_except_infos = NULL; + PyObject *__pyx_v_try_except_info = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + unsigned int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + PyObject *(*__pyx_t_9)(PyObject *); + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_unhandled_exception", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":399 + * # def is_unhandled_exception(container_obj, py_db, frame, last_raise_line, raise_lines): + * # ENDIF + * if frame.f_lineno in raise_lines: # <<<<<<<<<<<<<< + * return True + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 399, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely(__pyx_v_raise_lines == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 399, __pyx_L1_error) + } + __pyx_t_2 = (__Pyx_PySet_ContainsTF(__pyx_t_1, __pyx_v_raise_lines, Py_EQ)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 399, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":400 + * # ENDIF + * if frame.f_lineno in raise_lines: + * return True # <<<<<<<<<<<<<< + * + * else: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":399 + * # def is_unhandled_exception(container_obj, py_db, frame, last_raise_line, raise_lines): + * # ENDIF + * if frame.f_lineno in raise_lines: # <<<<<<<<<<<<<< + * return True + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":403 + * + * else: + * try_except_infos = container_obj.try_except_infos # <<<<<<<<<<<<<< + * if try_except_infos is None: + * container_obj.try_except_infos = try_except_infos = py_db.collect_try_except_info(frame.f_code) + */ + /*else*/ { + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_container_obj, __pyx_n_s_try_except_infos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 403, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_try_except_infos = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":404 + * else: + * try_except_infos = container_obj.try_except_infos + * if try_except_infos is None: # <<<<<<<<<<<<<< + * container_obj.try_except_infos = try_except_infos = py_db.collect_try_except_info(frame.f_code) + * + */ + __pyx_t_2 = (__pyx_v_try_except_infos == Py_None); + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":405 + * try_except_infos = container_obj.try_except_infos + * if try_except_infos is None: + * container_obj.try_except_infos = try_except_infos = py_db.collect_try_except_info(frame.f_code) # <<<<<<<<<<<<<< + * + * if not try_except_infos: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_collect_try_except_info); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 405, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 405, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 405, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + if (__Pyx_PyObject_SetAttrStr(__pyx_v_container_obj, __pyx_n_s_try_except_infos, __pyx_t_1) < 0) __PYX_ERR(0, 405, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_try_except_infos, __pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":404 + * else: + * try_except_infos = container_obj.try_except_infos + * if try_except_infos is None: # <<<<<<<<<<<<<< + * container_obj.try_except_infos = try_except_infos = py_db.collect_try_except_info(frame.f_code) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":407 + * container_obj.try_except_infos = try_except_infos = py_db.collect_try_except_info(frame.f_code) + * + * if not try_except_infos: # <<<<<<<<<<<<<< + * # Consider the last exception as unhandled because there's no try..except in it. + * return True + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_try_except_infos); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 407, __pyx_L1_error) + __pyx_t_7 = (!__pyx_t_2); + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":409 + * if not try_except_infos: + * # Consider the last exception as unhandled because there's no try..except in it. + * return True # <<<<<<<<<<<<<< + * else: + * # Now, consider only the try..except for the raise + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":407 + * container_obj.try_except_infos = try_except_infos = py_db.collect_try_except_info(frame.f_code) + * + * if not try_except_infos: # <<<<<<<<<<<<<< + * # Consider the last exception as unhandled because there's no try..except in it. + * return True + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":412 + * else: + * # Now, consider only the try..except for the raise + * valid_try_except_infos = [] # <<<<<<<<<<<<<< + * for try_except_info in try_except_infos: + * if try_except_info.is_line_in_try_block(last_raise_line): + */ + /*else*/ { + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 412, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_valid_try_except_infos = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":413 + * # Now, consider only the try..except for the raise + * valid_try_except_infos = [] + * for try_except_info in try_except_infos: # <<<<<<<<<<<<<< + * if try_except_info.is_line_in_try_block(last_raise_line): + * valid_try_except_infos.append(try_except_info) + */ + if (likely(PyList_CheckExact(__pyx_v_try_except_infos)) || PyTuple_CheckExact(__pyx_v_try_except_infos)) { + __pyx_t_1 = __pyx_v_try_except_infos; __Pyx_INCREF(__pyx_t_1); + __pyx_t_8 = 0; + __pyx_t_9 = NULL; + } else { + __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_try_except_infos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_9 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 413, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_9)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 413, __pyx_L1_error) + #endif + if (__pyx_t_8 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely((0 < 0))) __PYX_ERR(0, 413, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 413, __pyx_L1_error) + #endif + if (__pyx_t_8 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely((0 < 0))) __PYX_ERR(0, 413, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + } + } else { + __pyx_t_3 = __pyx_t_9(__pyx_t_1); + if (unlikely(!__pyx_t_3)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 413, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_try_except_info, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":414 + * valid_try_except_infos = [] + * for try_except_info in try_except_infos: + * if try_except_info.is_line_in_try_block(last_raise_line): # <<<<<<<<<<<<<< + * valid_try_except_infos.append(try_except_info) + * + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_try_except_info, __pyx_n_s_is_line_in_try_block); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 414, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_last_raise_line); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 414, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_10, __pyx_t_5}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 414, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 414, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":415 + * for try_except_info in try_except_infos: + * if try_except_info.is_line_in_try_block(last_raise_line): + * valid_try_except_infos.append(try_except_info) # <<<<<<<<<<<<<< + * + * if not valid_try_except_infos: + */ + __pyx_t_11 = __Pyx_PyList_Append(__pyx_v_valid_try_except_infos, __pyx_v_try_except_info); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(0, 415, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":414 + * valid_try_except_infos = [] + * for try_except_info in try_except_infos: + * if try_except_info.is_line_in_try_block(last_raise_line): # <<<<<<<<<<<<<< + * valid_try_except_infos.append(try_except_info) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":413 + * # Now, consider only the try..except for the raise + * valid_try_except_infos = [] + * for try_except_info in try_except_infos: # <<<<<<<<<<<<<< + * if try_except_info.is_line_in_try_block(last_raise_line): + * valid_try_except_infos.append(try_except_info) + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":417 + * valid_try_except_infos.append(try_except_info) + * + * if not valid_try_except_infos: # <<<<<<<<<<<<<< + * return True + * + */ + __pyx_t_7 = (PyList_GET_SIZE(__pyx_v_valid_try_except_infos) != 0); + __pyx_t_2 = (!__pyx_t_7); + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":418 + * + * if not valid_try_except_infos: + * return True # <<<<<<<<<<<<<< + * + * else: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":417 + * valid_try_except_infos.append(try_except_info) + * + * if not valid_try_except_infos: # <<<<<<<<<<<<<< + * return True + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":425 + * # where one try..except is inside the other with only a raise + * # and it's gotten in the except line. + * for try_except_info in try_except_infos: # <<<<<<<<<<<<<< + * if try_except_info.is_line_in_except_block(frame.f_lineno): + * if frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except: + */ + /*else*/ { + if (likely(PyList_CheckExact(__pyx_v_try_except_infos)) || PyTuple_CheckExact(__pyx_v_try_except_infos)) { + __pyx_t_1 = __pyx_v_try_except_infos; __Pyx_INCREF(__pyx_t_1); + __pyx_t_8 = 0; + __pyx_t_9 = NULL; + } else { + __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_try_except_infos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_9 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 425, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_9)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 425, __pyx_L1_error) + #endif + if (__pyx_t_8 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely((0 < 0))) __PYX_ERR(0, 425, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 425, __pyx_L1_error) + #endif + if (__pyx_t_8 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely((0 < 0))) __PYX_ERR(0, 425, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + } + } else { + __pyx_t_3 = __pyx_t_9(__pyx_t_1); + if (unlikely(!__pyx_t_3)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 425, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_try_except_info, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":426 + * # and it's gotten in the except line. + * for try_except_info in try_except_infos: + * if try_except_info.is_line_in_except_block(frame.f_lineno): # <<<<<<<<<<<<<< + * if frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except: + * # In a raise inside a try..except block or some except which doesn't + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_try_except_info, __pyx_n_s_is_line_in_except_block); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 426, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 426, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_10, __pyx_t_5}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 426, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 426, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":427 + * for try_except_info in try_except_infos: + * if try_except_info.is_line_in_except_block(frame.f_lineno): + * if frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except: # <<<<<<<<<<<<<< + * # In a raise inside a try..except block or some except which doesn't + * # match the raised exception. + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_try_except_info, __pyx_n_s_except_line); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!__pyx_t_7) { + } else { + __pyx_t_2 = __pyx_t_7; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_try_except_info, __pyx_n_s_raise_lines_in_except); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_t_5, __pyx_t_4, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_2 = __pyx_t_7; + __pyx_L15_bool_binop_done:; + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":430 + * # In a raise inside a try..except block or some except which doesn't + * # match the raised exception. + * return True # <<<<<<<<<<<<<< + * return False + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":427 + * for try_except_info in try_except_infos: + * if try_except_info.is_line_in_except_block(frame.f_lineno): + * if frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except: # <<<<<<<<<<<<<< + * # In a raise inside a try..except block or some except which doesn't + * # match the raised exception. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":426 + * # and it's gotten in the except line. + * for try_except_info in try_except_infos: + * if try_except_info.is_line_in_except_block(frame.f_lineno): # <<<<<<<<<<<<<< + * if frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except: + * # In a raise inside a try..except block or some except which doesn't + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":425 + * # where one try..except is inside the other with only a raise + * # and it's gotten in the except line. + * for try_except_info in try_except_infos: # <<<<<<<<<<<<<< + * if try_except_info.is_line_in_except_block(frame.f_lineno): + * if frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except: + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":431 + * # match the raised exception. + * return True + * return False # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":395 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def is_unhandled_exception(container_obj, py_db, frame, int last_raise_line, set raise_lines): # <<<<<<<<<<<<<< + * # ELSE + * # def is_unhandled_exception(container_obj, py_db, frame, last_raise_line, raise_lines): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.is_unhandled_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_try_except_infos); + __Pyx_XDECREF(__pyx_v_valid_try_except_infos); + __Pyx_XDECREF(__pyx_v_try_except_info); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":437 + * cdef class _TryExceptContainerObj: + * cdef public list try_except_infos; + * def __init__(self): # <<<<<<<<<<<<<< + * self.try_except_infos = None + * # ELSE + */ + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, __pyx_nargs); return -1;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj___init__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj___init__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":438 + * cdef public list try_except_infos; + * def __init__(self): + * self.try_except_infos = None # <<<<<<<<<<<<<< + * # ELSE + * # class _TryExceptContainerObj(object): + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->try_except_infos); + __Pyx_DECREF(__pyx_v_self->try_except_infos); + __pyx_v_self->try_except_infos = ((PyObject*)Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":437 + * cdef class _TryExceptContainerObj: + * cdef public list try_except_infos; + * def __init__(self): # <<<<<<<<<<<<<< + * self.try_except_infos = None + * # ELSE + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":436 + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class _TryExceptContainerObj: + * cdef public list try_except_infos; # <<<<<<<<<<<<<< + * def __init__(self): + * self.try_except_infos = None + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->try_except_infos); + __pyx_r = __pyx_v_self->try_except_infos; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyList_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("list", __pyx_v_value))) __PYX_ERR(0, 436, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->try_except_infos); + __Pyx_DECREF(__pyx_v_self->try_except_infos); + __pyx_v_self->try_except_infos = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython._TryExceptContainerObj.try_except_infos.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->try_except_infos); + __Pyx_DECREF(__pyx_v_self->try_except_infos); + __pyx_v_self->try_except_infos = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_3__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_3__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_2__reduce_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_2__reduce_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.try_except_infos,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->try_except_infos); + __Pyx_GIVEREF(__pyx_v_self->try_except_infos); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->try_except_infos)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.try_except_infos,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.try_except_infos,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(2, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.try_except_infos is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.try_except_infos,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.try_except_infos is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->try_except_infos != ((PyObject*)Py_None)); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.try_except_infos is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.try_except_infos is not None + * if use_setstate: + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle__TryExceptContain); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_230645316); + __Pyx_GIVEREF(__pyx_int_230645316); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_230645316)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.try_except_infos is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, None), state + * else: + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle__TryExceptContainerObj__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle__TryExceptContain); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_230645316); + __Pyx_GIVEREF(__pyx_int_230645316); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_230645316)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython._TryExceptContainerObj.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__TryExceptContainerObj__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_5__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_5__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(2, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(2, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython._TryExceptContainerObj.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_4__setstate_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_4__setstate_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle__TryExceptContainerObj__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle__TryExceptContainerObj__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__TryExceptContainerObj__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython._TryExceptContainerObj.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":469 + * cdef int should_skip + * cdef object exc_info + * def __init__(self, tuple args): # <<<<<<<<<<<<<< + * self._args = args # In the cython version we don't need to pass the frame + * self.should_skip = -1 # On cythonized version, put in instance. + */ + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_args = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_args,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 469, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 469, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_args = ((PyObject*)values[0]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 469, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyTuple_Type), 1, "args", 1))) __PYX_ERR(0, 469, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame___init__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self), __pyx_v_args); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame___init__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_args) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":470 + * cdef object exc_info + * def __init__(self, tuple args): + * self._args = args # In the cython version we don't need to pass the frame # <<<<<<<<<<<<<< + * self.should_skip = -1 # On cythonized version, put in instance. + * self.exc_info = () + */ + __Pyx_INCREF(__pyx_v_args); + __Pyx_GIVEREF(__pyx_v_args); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = __pyx_v_args; + + /* "_pydevd_bundle/pydevd_cython.pyx":471 + * def __init__(self, tuple args): + * self._args = args # In the cython version we don't need to pass the frame + * self.should_skip = -1 # On cythonized version, put in instance. # <<<<<<<<<<<<<< + * self.exc_info = () + * # ELSE + */ + __pyx_v_self->should_skip = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":472 + * self._args = args # In the cython version we don't need to pass the frame + * self.should_skip = -1 # On cythonized version, put in instance. + * self.exc_info = () # <<<<<<<<<<<<<< + * # ELSE + * # should_skip = -1 # Default value in class (put in instance on set). + */ + __Pyx_INCREF(__pyx_empty_tuple); + __Pyx_GIVEREF(__pyx_empty_tuple); + __Pyx_GOTREF(__pyx_v_self->exc_info); + __Pyx_DECREF(__pyx_v_self->exc_info); + __pyx_v_self->exc_info = __pyx_empty_tuple; + + /* "_pydevd_bundle/pydevd_cython.pyx":469 + * cdef int should_skip + * cdef object exc_info + * def __init__(self, tuple args): # <<<<<<<<<<<<<< + * self._args = args # In the cython version we don't need to pass the frame + * self.should_skip = -1 # On cythonized version, put in instance. + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":490 + * # ENDIF + * + * def set_suspend(self, *args, **kwargs): # <<<<<<<<<<<<<< + * self._args[0].set_suspend(*args, **kwargs) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_3set_suspend(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_3set_suspend = {"set_suspend", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_3set_suspend, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_3set_suspend(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("set_suspend (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "set_suspend", 1))) return NULL; + if (unlikely(__pyx_kwds)) { + __pyx_v_kwargs = __Pyx_KwargsAsDict_VARARGS(__pyx_kwds, __pyx_kwvalues); + if (unlikely(!__pyx_v_kwargs)) return NULL; + __Pyx_GOTREF(__pyx_v_kwargs); + } else { + __pyx_v_kwargs = PyDict_New(); + if (unlikely(!__pyx_v_kwargs)) return NULL; + __Pyx_GOTREF(__pyx_v_kwargs); + } + __Pyx_INCREF(__pyx_args); + __pyx_v_args = __pyx_args; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_2set_suspend(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs); + + /* function exit code */ + __Pyx_DECREF(__pyx_v_args); + __Pyx_DECREF(__pyx_v_kwargs); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_2set_suspend(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("set_suspend", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":491 + * + * def set_suspend(self, *args, **kwargs): + * self._args[0].set_suspend(*args, **kwargs) # <<<<<<<<<<<<<< + * + * def do_wait_suspend(self, *args, **kwargs): + */ + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 491, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 491, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_set_suspend); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 491, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyDict_Copy(__pyx_v_kwargs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 491, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_v_args, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 491, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":490 + * # ENDIF + * + * def set_suspend(self, *args, **kwargs): # <<<<<<<<<<<<<< + * self._args[0].set_suspend(*args, **kwargs) + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.set_suspend", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":493 + * self._args[0].set_suspend(*args, **kwargs) + * + * def do_wait_suspend(self, *args, **kwargs): # <<<<<<<<<<<<<< + * self._args[0].do_wait_suspend(*args, **kwargs) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_5do_wait_suspend(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_5do_wait_suspend = {"do_wait_suspend", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_5do_wait_suspend, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_5do_wait_suspend(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("do_wait_suspend (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "do_wait_suspend", 1))) return NULL; + if (unlikely(__pyx_kwds)) { + __pyx_v_kwargs = __Pyx_KwargsAsDict_VARARGS(__pyx_kwds, __pyx_kwvalues); + if (unlikely(!__pyx_v_kwargs)) return NULL; + __Pyx_GOTREF(__pyx_v_kwargs); + } else { + __pyx_v_kwargs = PyDict_New(); + if (unlikely(!__pyx_v_kwargs)) return NULL; + __Pyx_GOTREF(__pyx_v_kwargs); + } + __Pyx_INCREF(__pyx_args); + __pyx_v_args = __pyx_args; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_4do_wait_suspend(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs); + + /* function exit code */ + __Pyx_DECREF(__pyx_v_args); + __Pyx_DECREF(__pyx_v_kwargs); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_4do_wait_suspend(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("do_wait_suspend", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":494 + * + * def do_wait_suspend(self, *args, **kwargs): + * self._args[0].do_wait_suspend(*args, **kwargs) # <<<<<<<<<<<<<< + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 494, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 494, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_do_wait_suspend); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 494, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyDict_Copy(__pyx_v_kwargs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 494, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_v_args, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 494, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":493 + * self._args[0].set_suspend(*args, **kwargs) + * + * def do_wait_suspend(self, *args, **kwargs): # <<<<<<<<<<<<<< + * self._args[0].do_wait_suspend(*args, **kwargs) + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.do_wait_suspend", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":497 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def trace_exception(self, frame, str event, arg): # <<<<<<<<<<<<<< + * cdef bint should_stop; + * cdef tuple exc_info; + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_7trace_exception(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_7trace_exception = {"trace_exception", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_7trace_exception, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_7trace_exception(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_event = 0; + PyObject *__pyx_v_arg = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("trace_exception (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 497, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 497, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_exception", 1, 3, 3, 1); __PYX_ERR(0, 497, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 497, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_exception", 1, 3, 3, 2); __PYX_ERR(0, 497, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "trace_exception") < 0)) __PYX_ERR(0, 497, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_frame = values[0]; + __pyx_v_event = ((PyObject*)values[1]); + __pyx_v_arg = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("trace_exception", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 497, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.trace_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_event), (&PyString_Type), 1, "event", 1))) __PYX_ERR(0, 497, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_6trace_exception(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self), __pyx_v_frame, __pyx_v_event, __pyx_v_arg); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_6trace_exception(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) { + int __pyx_v_should_stop; + PyObject *__pyx_v_exc_info = 0; + PyObject *__pyx_v_frame_skips_cache = NULL; + PyObject *__pyx_v_frame_cache_key = NULL; + PyObject *__pyx_v_custom_key = NULL; + PyObject *__pyx_v_container_obj = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + unsigned int __pyx_t_8; + PyObject *(*__pyx_t_9)(PyObject *); + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trace_exception", 0); + __Pyx_INCREF(__pyx_v_frame); + + /* "_pydevd_bundle/pydevd_cython.pyx":503 + * # def trace_exception(self, frame, event, arg): + * # ENDIF + * if event == "exception": # <<<<<<<<<<<<<< + * should_stop, frame, exc_info = should_stop_on_exception(self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info) + * self.exc_info = exc_info + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_exception, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 503, __pyx_L1_error) + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":504 + * # ENDIF + * if event == "exception": + * should_stop, frame, exc_info = should_stop_on_exception(self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info) # <<<<<<<<<<<<<< + * self.exc_info = exc_info + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_should_stop_on_exception); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 504, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 504, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 504, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[7] = {__pyx_t_7, __pyx_t_4, __pyx_t_5, __pyx_v_frame, __pyx_t_6, __pyx_v_arg, __pyx_v_self->exc_info}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_8, 6+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 504, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 2); + } else { + __pyx_t_3 = PyList_GET_ITEM(sequence, 0); + __pyx_t_6 = PyList_GET_ITEM(sequence, 1); + __pyx_t_5 = PyList_GET_ITEM(sequence, 2); + } + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(__pyx_t_5); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_4 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_4); + index = 0; __pyx_t_3 = __pyx_t_9(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L4_unpacking_failed; + __Pyx_GOTREF(__pyx_t_3); + index = 1; __pyx_t_6 = __pyx_t_9(__pyx_t_4); if (unlikely(!__pyx_t_6)) goto __pyx_L4_unpacking_failed; + __Pyx_GOTREF(__pyx_t_6); + index = 2; __pyx_t_5 = __pyx_t_9(__pyx_t_4); if (unlikely(!__pyx_t_5)) goto __pyx_L4_unpacking_failed; + __Pyx_GOTREF(__pyx_t_5); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_4), 3) < 0) __PYX_ERR(0, 504, __pyx_L1_error) + __pyx_t_9 = NULL; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L5_unpacking_done; + __pyx_L4_unpacking_failed:; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_9 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 504, __pyx_L1_error) + __pyx_L5_unpacking_done:; + } + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (!(likely(PyTuple_CheckExact(__pyx_t_5))||((__pyx_t_5) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_5))) __PYX_ERR(0, 504, __pyx_L1_error) + __pyx_v_should_stop = __pyx_t_1; + __Pyx_DECREF_SET(__pyx_v_frame, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_v_exc_info = ((PyObject*)__pyx_t_5); + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":505 + * if event == "exception": + * should_stop, frame, exc_info = should_stop_on_exception(self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info) + * self.exc_info = exc_info # <<<<<<<<<<<<<< + * + * if should_stop: + */ + __Pyx_INCREF(__pyx_v_exc_info); + __Pyx_GIVEREF(__pyx_v_exc_info); + __Pyx_GOTREF(__pyx_v_self->exc_info); + __Pyx_DECREF(__pyx_v_self->exc_info); + __pyx_v_self->exc_info = __pyx_v_exc_info; + + /* "_pydevd_bundle/pydevd_cython.pyx":507 + * self.exc_info = exc_info + * + * if should_stop: # <<<<<<<<<<<<<< + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch + */ + if (__pyx_v_should_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":508 + * + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_handle_exception); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 508, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 508, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_EXCEPTION_TYPE_HANDLED); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[6] = {__pyx_t_7, __pyx_t_6, __pyx_t_3, __pyx_v_frame, __pyx_v_arg, __pyx_t_4}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 5+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 508, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":509 + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * elif event == "return": + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 509, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":508 + * + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":507 + * self.exc_info = exc_info + * + * if should_stop: # <<<<<<<<<<<<<< + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":503 + * # def trace_exception(self, frame, event, arg): + * # ENDIF + * if event == "exception": # <<<<<<<<<<<<<< + * should_stop, frame, exc_info = should_stop_on_exception(self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info) + * self.exc_info = exc_info + */ + goto __pyx_L3; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":511 + * return self.trace_dispatch + * + * elif event == "return": # <<<<<<<<<<<<<< + * exc_info = self.exc_info + * if exc_info and arg is None: + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_return, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 511, __pyx_L1_error) + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":512 + * + * elif event == "return": + * exc_info = self.exc_info # <<<<<<<<<<<<<< + * if exc_info and arg is None: + * frame_skips_cache, frame_cache_key = self._args[4], self._args[5] + */ + if (!(likely(PyTuple_CheckExact(__pyx_v_self->exc_info))||((__pyx_v_self->exc_info) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_self->exc_info))) __PYX_ERR(0, 512, __pyx_L1_error) + __pyx_t_2 = __pyx_v_self->exc_info; + __Pyx_INCREF(__pyx_t_2); + __pyx_v_exc_info = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":513 + * elif event == "return": + * exc_info = self.exc_info + * if exc_info and arg is None: # <<<<<<<<<<<<<< + * frame_skips_cache, frame_cache_key = self._args[4], self._args[5] + * custom_key = (frame_cache_key, "try_exc_info") + */ + __pyx_t_10 = (__pyx_v_exc_info != Py_None)&&(PyTuple_GET_SIZE(__pyx_v_exc_info) != 0); + if (__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = (__pyx_v_arg == Py_None); + __pyx_t_1 = __pyx_t_10; + __pyx_L9_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":514 + * exc_info = self.exc_info + * if exc_info and arg is None: + * frame_skips_cache, frame_cache_key = self._args[4], self._args[5] # <<<<<<<<<<<<<< + * custom_key = (frame_cache_key, "try_exc_info") + * container_obj = frame_skips_cache.get(custom_key) + */ + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 514, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 514, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_frame_skips_cache = __pyx_t_2; + __pyx_t_2 = 0; + __pyx_v_frame_cache_key = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":515 + * if exc_info and arg is None: + * frame_skips_cache, frame_cache_key = self._args[4], self._args[5] + * custom_key = (frame_cache_key, "try_exc_info") # <<<<<<<<<<<<<< + * container_obj = frame_skips_cache.get(custom_key) + * if container_obj is None: + */ + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 515, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_frame_cache_key); + __Pyx_GIVEREF(__pyx_v_frame_cache_key); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_frame_cache_key)) __PYX_ERR(0, 515, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_try_exc_info); + __Pyx_GIVEREF(__pyx_n_s_try_exc_info); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_n_s_try_exc_info)) __PYX_ERR(0, 515, __pyx_L1_error); + __pyx_v_custom_key = ((PyObject*)__pyx_t_5); + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":516 + * frame_skips_cache, frame_cache_key = self._args[4], self._args[5] + * custom_key = (frame_cache_key, "try_exc_info") + * container_obj = frame_skips_cache.get(custom_key) # <<<<<<<<<<<<<< + * if container_obj is None: + * container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame_skips_cache, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_custom_key}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_container_obj = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":517 + * custom_key = (frame_cache_key, "try_exc_info") + * container_obj = frame_skips_cache.get(custom_key) + * if container_obj is None: # <<<<<<<<<<<<<< + * container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + * if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( + */ + __pyx_t_1 = (__pyx_v_container_obj == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":518 + * container_obj = frame_skips_cache.get(custom_key) + * if container_obj is None: + * container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() # <<<<<<<<<<<<<< + * if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( + * frame + */ + __pyx_t_5 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 518, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_container_obj, __pyx_t_5); + if (unlikely((PyObject_SetItem(__pyx_v_frame_skips_cache, __pyx_v_custom_key, __pyx_t_5) < 0))) __PYX_ERR(0, 518, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":517 + * custom_key = (frame_cache_key, "try_exc_info") + * container_obj = frame_skips_cache.get(custom_key) + * if container_obj is None: # <<<<<<<<<<<<<< + * container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + * if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":519 + * if container_obj is None: + * container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + * if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( # <<<<<<<<<<<<<< + * frame + * ): + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_is_unhandled_exception); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 519, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely(__pyx_v_exc_info == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 519, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_GetItemInt_Tuple(__pyx_v_exc_info, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (unlikely(__pyx_v_exc_info == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 519, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v_exc_info, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[6] = {__pyx_t_7, __pyx_v_container_obj, __pyx_t_4, __pyx_v_frame, __pyx_t_3, __pyx_t_6}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 5+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L13_bool_binop_done; + } + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_handle_user_exception); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "_pydevd_bundle/pydevd_cython.pyx":520 + * container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + * if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( + * frame # <<<<<<<<<<<<<< + * ): + * return self.trace_dispatch + */ + __pyx_t_6 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_frame}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":519 + * if container_obj is None: + * container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + * if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( # <<<<<<<<<<<<<< + * frame + * ): + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 519, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_1 = __pyx_t_10; + __pyx_L13_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":522 + * frame + * ): + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * return self.trace_exception + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 522, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":519 + * if container_obj is None: + * container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + * if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( # <<<<<<<<<<<<<< + * frame + * ): + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":513 + * elif event == "return": + * exc_info = self.exc_info + * if exc_info and arg is None: # <<<<<<<<<<<<<< + * frame_skips_cache, frame_cache_key = self._args[4], self._args[5] + * custom_key = (frame_cache_key, "try_exc_info") + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":511 + * return self.trace_dispatch + * + * elif event == "return": # <<<<<<<<<<<<<< + * exc_info = self.exc_info + * if exc_info and arg is None: + */ + } + __pyx_L3:; + + /* "_pydevd_bundle/pydevd_cython.pyx":524 + * return self.trace_dispatch + * + * return self.trace_exception # <<<<<<<<<<<<<< + * + * def handle_user_exception(self, frame): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_exception); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 524, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":497 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def trace_exception(self, frame, str event, arg): # <<<<<<<<<<<<<< + * cdef bint should_stop; + * cdef tuple exc_info; + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.trace_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_exc_info); + __Pyx_XDECREF(__pyx_v_frame_skips_cache); + __Pyx_XDECREF(__pyx_v_frame_cache_key); + __Pyx_XDECREF(__pyx_v_custom_key); + __Pyx_XDECREF(__pyx_v_container_obj); + __Pyx_XDECREF(__pyx_v_frame); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":526 + * return self.trace_exception + * + * def handle_user_exception(self, frame): # <<<<<<<<<<<<<< + * exc_info = self.exc_info + * if exc_info: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_9handle_user_exception(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_9handle_user_exception = {"handle_user_exception", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_9handle_user_exception, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_9handle_user_exception(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_frame = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("handle_user_exception (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 526, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "handle_user_exception") < 0)) __PYX_ERR(0, 526, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_frame = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("handle_user_exception", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 526, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.handle_user_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_8handle_user_exception(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self), __pyx_v_frame); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_8handle_user_exception(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame) { + PyObject *__pyx_v_exc_info = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("handle_user_exception", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":527 + * + * def handle_user_exception(self, frame): + * exc_info = self.exc_info # <<<<<<<<<<<<<< + * if exc_info: + * return handle_exception(self._args[0], self._args[3], frame, exc_info[0], EXCEPTION_TYPE_USER_UNHANDLED) + */ + __pyx_t_1 = __pyx_v_self->exc_info; + __Pyx_INCREF(__pyx_t_1); + __pyx_v_exc_info = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":528 + * def handle_user_exception(self, frame): + * exc_info = self.exc_info + * if exc_info: # <<<<<<<<<<<<<< + * return handle_exception(self._args[0], self._args[3], frame, exc_info[0], EXCEPTION_TYPE_USER_UNHANDLED) + * return False + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_exc_info); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 528, __pyx_L1_error) + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":529 + * exc_info = self.exc_info + * if exc_info: + * return handle_exception(self._args[0], self._args[3], frame, exc_info[0], EXCEPTION_TYPE_USER_UNHANDLED) # <<<<<<<<<<<<<< + * return False + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_handle_exception); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 529, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 529, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 529, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 529, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 529, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_exc_info, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 529, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 529, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[6] = {__pyx_t_8, __pyx_t_4, __pyx_t_5, __pyx_v_frame, __pyx_t_6, __pyx_t_7}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_9, 5+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 529, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":528 + * def handle_user_exception(self, frame): + * exc_info = self.exc_info + * if exc_info: # <<<<<<<<<<<<<< + * return handle_exception(self._args[0], self._args[3], frame, exc_info[0], EXCEPTION_TYPE_USER_UNHANDLED) + * return False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":530 + * if exc_info: + * return handle_exception(self._args[0], self._args[3], frame, exc_info[0], EXCEPTION_TYPE_USER_UNHANDLED) + * return False # <<<<<<<<<<<<<< + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":526 + * return self.trace_exception + * + * def handle_user_exception(self, frame): # <<<<<<<<<<<<<< + * exc_info = self.exc_info + * if exc_info: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.handle_user_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_exc_info); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":533 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef get_func_name(self, frame): # <<<<<<<<<<<<<< + * cdef str func_name + * # ELSE + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_get_func_name(CYTHON_UNUSED struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame) { + PyObject *__pyx_v_func_name = 0; + PyObject *__pyx_v_code_obj = NULL; + PyObject *__pyx_v_cls_name = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + unsigned int __pyx_t_7; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_func_name", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":538 + * # def get_func_name(self, frame): + * # ENDIF + * code_obj = frame.f_code # <<<<<<<<<<<<<< + * func_name = code_obj.co_name + * try: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 538, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_code_obj = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":539 + * # ENDIF + * code_obj = frame.f_code + * func_name = code_obj.co_name # <<<<<<<<<<<<<< + * try: + * cls_name = get_clsname_for_code(code_obj, frame) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_code_obj, __pyx_n_s_co_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 539, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(0, 539, __pyx_L1_error) + __pyx_v_func_name = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":540 + * code_obj = frame.f_code + * func_name = code_obj.co_name + * try: # <<<<<<<<<<<<<< + * cls_name = get_clsname_for_code(code_obj, frame) + * if cls_name is not None: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":541 + * func_name = code_obj.co_name + * try: + * cls_name = get_clsname_for_code(code_obj, frame) # <<<<<<<<<<<<<< + * if cls_name is not None: + * return "%s.%s" % (cls_name, func_name) + */ + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_get_clsname_for_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 541, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_v_code_obj, __pyx_v_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 541, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_v_cls_name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":542 + * try: + * cls_name = get_clsname_for_code(code_obj, frame) + * if cls_name is not None: # <<<<<<<<<<<<<< + * return "%s.%s" % (cls_name, func_name) + * else: + */ + __pyx_t_8 = (__pyx_v_cls_name != Py_None); + if (__pyx_t_8) { + + /* "_pydevd_bundle/pydevd_cython.pyx":543 + * cls_name = get_clsname_for_code(code_obj, frame) + * if cls_name is not None: + * return "%s.%s" % (cls_name, func_name) # <<<<<<<<<<<<<< + * else: + * return func_name + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 543, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_cls_name); + __Pyx_GIVEREF(__pyx_v_cls_name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_cls_name)) __PYX_ERR(0, 543, __pyx_L3_error); + __Pyx_INCREF(__pyx_v_func_name); + __Pyx_GIVEREF(__pyx_v_func_name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_func_name)) __PYX_ERR(0, 543, __pyx_L3_error); + __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_s_s, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 543, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L7_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":542 + * try: + * cls_name = get_clsname_for_code(code_obj, frame) + * if cls_name is not None: # <<<<<<<<<<<<<< + * return "%s.%s" % (cls_name, func_name) + * else: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":545 + * return "%s.%s" % (cls_name, func_name) + * else: + * return func_name # <<<<<<<<<<<<<< + * except: + * pydev_log.exception() + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_func_name); + __pyx_r = __pyx_v_func_name; + goto __pyx_L7_try_return; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":540 + * code_obj = frame.f_code + * func_name = code_obj.co_name + * try: # <<<<<<<<<<<<<< + * cls_name = get_clsname_for_code(code_obj, frame) + * if cls_name is not None: + */ + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":546 + * else: + * return func_name + * except: # <<<<<<<<<<<<<< + * pydev_log.exception() + * return func_name + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.get_func_name", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_1, &__pyx_t_6) < 0) __PYX_ERR(0, 546, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_6); + + /* "_pydevd_bundle/pydevd_cython.pyx":547 + * return func_name + * except: + * pydev_log.exception() # <<<<<<<<<<<<<< + * return func_name + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 547, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_exception); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 547, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_11))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_11, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL}; + __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 547, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":548 + * except: + * pydev_log.exception() + * return func_name # <<<<<<<<<<<<<< + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_func_name); + __pyx_r = __pyx_v_func_name; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L6_except_return; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":540 + * code_obj = frame.f_code + * func_name = code_obj.co_name + * try: # <<<<<<<<<<<<<< + * cls_name = get_clsname_for_code(code_obj, frame) + * if cls_name is not None: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L7_try_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":533 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef get_func_name(self, frame): # <<<<<<<<<<<<<< + * cdef str func_name + * # ELSE + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.get_func_name", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_func_name); + __Pyx_XDECREF(__pyx_v_code_obj); + __Pyx_XDECREF(__pyx_v_cls_name); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":551 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _show_return_values(self, frame, arg): # <<<<<<<<<<<<<< + * # ELSE + * # def _show_return_values(self, frame, arg): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__show_return_values(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_arg) { + PyObject *__pyx_v_f_locals_back = NULL; + PyObject *__pyx_v_return_values_dict = NULL; + PyObject *__pyx_v_name = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + int __pyx_t_12; + int __pyx_t_13; + char const *__pyx_t_14; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_show_return_values", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":555 + * # def _show_return_values(self, frame, arg): + * # ENDIF + * try: # <<<<<<<<<<<<<< + * try: + * f_locals_back = getattr(frame.f_back, "f_locals", None) + */ + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":556 + * # ENDIF + * try: + * try: # <<<<<<<<<<<<<< + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":557 + * try: + * try: + * f_locals_back = getattr(frame.f_back, "f_locals", None) # <<<<<<<<<<<<<< + * if f_locals_back is not None: + * return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 557, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_GetAttr3(__pyx_t_4, __pyx_n_s_f_locals, Py_None); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 557, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_f_locals_back = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":558 + * try: + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: # <<<<<<<<<<<<<< + * return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + * if return_values_dict is None: + */ + __pyx_t_6 = (__pyx_v_f_locals_back != Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":559 + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: + * return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) # <<<<<<<<<<<<<< + * if return_values_dict is None: + * return_values_dict = {} + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_locals_back, __pyx_n_s_get); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 559, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_RETURN_VALUES_DICT); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 559, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_8, __pyx_t_7, Py_None}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_9, 2+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 559, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_v_return_values_dict = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":560 + * if f_locals_back is not None: + * return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + * if return_values_dict is None: # <<<<<<<<<<<<<< + * return_values_dict = {} + * f_locals_back[RETURN_VALUES_DICT] = return_values_dict + */ + __pyx_t_6 = (__pyx_v_return_values_dict == Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":561 + * return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + * if return_values_dict is None: + * return_values_dict = {} # <<<<<<<<<<<<<< + * f_locals_back[RETURN_VALUES_DICT] = return_values_dict + * name = self.get_func_name(frame) + */ + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 561, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_return_values_dict, __pyx_t_5); + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":562 + * if return_values_dict is None: + * return_values_dict = {} + * f_locals_back[RETURN_VALUES_DICT] = return_values_dict # <<<<<<<<<<<<<< + * name = self.get_func_name(frame) + * return_values_dict[name] = arg + */ + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_RETURN_VALUES_DICT); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 562, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely((PyObject_SetItem(__pyx_v_f_locals_back, __pyx_t_5, __pyx_v_return_values_dict) < 0))) __PYX_ERR(0, 562, __pyx_L6_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":560 + * if f_locals_back is not None: + * return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + * if return_values_dict is None: # <<<<<<<<<<<<<< + * return_values_dict = {} + * f_locals_back[RETURN_VALUES_DICT] = return_values_dict + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":563 + * return_values_dict = {} + * f_locals_back[RETURN_VALUES_DICT] = return_values_dict + * name = self.get_func_name(frame) # <<<<<<<<<<<<<< + * return_values_dict[name] = arg + * except: + */ + __pyx_t_5 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->get_func_name(__pyx_v_self, __pyx_v_frame); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 563, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_name = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":564 + * f_locals_back[RETURN_VALUES_DICT] = return_values_dict + * name = self.get_func_name(frame) + * return_values_dict[name] = arg # <<<<<<<<<<<<<< + * except: + * pydev_log.exception() + */ + if (unlikely((PyObject_SetItem(__pyx_v_return_values_dict, __pyx_v_name, __pyx_v_arg) < 0))) __PYX_ERR(0, 564, __pyx_L6_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":558 + * try: + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: # <<<<<<<<<<<<<< + * return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + * if return_values_dict is None: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":556 + * # ENDIF + * try: + * try: # <<<<<<<<<<<<<< + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L11_try_end; + __pyx_L6_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":565 + * name = self.get_func_name(frame) + * return_values_dict[name] = arg + * except: # <<<<<<<<<<<<<< + * pydev_log.exception() + * finally: + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame._show_return_values", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(0, 565, __pyx_L8_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_7); + + /* "_pydevd_bundle/pydevd_cython.pyx":566 + * return_values_dict[name] = arg + * except: + * pydev_log.exception() # <<<<<<<<<<<<<< + * finally: + * f_locals_back = None + */ + __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 566, __pyx_L8_except_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_exception); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 566, __pyx_L8_except_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_11))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_11, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_9, 0+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 566, __pyx_L8_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L7_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":556 + * # ENDIF + * try: + * try: # <<<<<<<<<<<<<< + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: + */ + __pyx_L8_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L4_error; + __pyx_L7_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L11_try_end:; + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":568 + * pydev_log.exception() + * finally: + * f_locals_back = None # <<<<<<<<<<<<<< + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + /*finally:*/ { + /*normal exit:*/{ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_f_locals_back, Py_None); + goto __pyx_L5; + } + __pyx_L4_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0)) __Pyx_ErrFetch(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_17); + __pyx_t_12 = __pyx_lineno; __pyx_t_13 = __pyx_clineno; __pyx_t_14 = __pyx_filename; + { + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_f_locals_back, Py_None); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); + } + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __pyx_lineno = __pyx_t_12; __pyx_clineno = __pyx_t_13; __pyx_filename = __pyx_t_14; + goto __pyx_L1_error; + } + __pyx_L5:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":551 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _show_return_values(self, frame, arg): # <<<<<<<<<<<<<< + * # ELSE + * # def _show_return_values(self, frame, arg): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame._show_return_values", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_f_locals_back); + __Pyx_XDECREF(__pyx_v_return_values_dict); + __Pyx_XDECREF(__pyx_v_name); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":571 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _remove_return_values(self, py_db, frame): # <<<<<<<<<<<<<< + * # ELSE + * # def _remove_return_values(self, py_db, frame): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__remove_return_values(CYTHON_UNUSED struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_py_db, PyObject *__pyx_v_frame) { + PyObject *__pyx_v_f_locals_back = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + unsigned int __pyx_t_8; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + int __pyx_t_12; + int __pyx_t_13; + char const *__pyx_t_14; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_remove_return_values", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":575 + * # def _remove_return_values(self, py_db, frame): + * # ENDIF + * try: # <<<<<<<<<<<<<< + * try: + * # Showing return values was turned off, we should remove them from locals dict. + */ + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":576 + * # ENDIF + * try: + * try: # <<<<<<<<<<<<<< + * # Showing return values was turned off, we should remove them from locals dict. + * # The values can be in the current frame or in the back one + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":579 + * # Showing return values was turned off, we should remove them from locals dict. + * # The values can be in the current frame or in the back one + * frame.f_locals.pop(RETURN_VALUES_DICT, None) # <<<<<<<<<<<<<< + * + * f_locals_back = getattr(frame.f_back, "f_locals", None) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_locals); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 579, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_pop); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 579, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_RETURN_VALUES_DICT); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 579, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_5, Py_None}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 579, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":581 + * frame.f_locals.pop(RETURN_VALUES_DICT, None) + * + * f_locals_back = getattr(frame.f_back, "f_locals", None) # <<<<<<<<<<<<<< + * if f_locals_back is not None: + * f_locals_back.pop(RETURN_VALUES_DICT, None) + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 581, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_GetAttr3(__pyx_t_4, __pyx_n_s_f_locals, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 581, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_f_locals_back = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":582 + * + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: # <<<<<<<<<<<<<< + * f_locals_back.pop(RETURN_VALUES_DICT, None) + * except: + */ + __pyx_t_9 = (__pyx_v_f_locals_back != Py_None); + if (__pyx_t_9) { + + /* "_pydevd_bundle/pydevd_cython.pyx":583 + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: + * f_locals_back.pop(RETURN_VALUES_DICT, None) # <<<<<<<<<<<<<< + * except: + * pydev_log.exception() + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_locals_back, __pyx_n_s_pop); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 583, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_RETURN_VALUES_DICT); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 583, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_5, Py_None}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 583, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":582 + * + * f_locals_back = getattr(frame.f_back, "f_locals", None) + * if f_locals_back is not None: # <<<<<<<<<<<<<< + * f_locals_back.pop(RETURN_VALUES_DICT, None) + * except: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":576 + * # ENDIF + * try: + * try: # <<<<<<<<<<<<<< + * # Showing return values was turned off, we should remove them from locals dict. + * # The values can be in the current frame or in the back one + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L11_try_end; + __pyx_L6_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":584 + * if f_locals_back is not None: + * f_locals_back.pop(RETURN_VALUES_DICT, None) + * except: # <<<<<<<<<<<<<< + * pydev_log.exception() + * finally: + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame._remove_return_values", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_4, &__pyx_t_5) < 0) __PYX_ERR(0, 584, __pyx_L8_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + + /* "_pydevd_bundle/pydevd_cython.pyx":585 + * f_locals_back.pop(RETURN_VALUES_DICT, None) + * except: + * pydev_log.exception() # <<<<<<<<<<<<<< + * finally: + * f_locals_back = None + */ + __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 585, __pyx_L8_except_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_exception); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 585, __pyx_L8_except_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_11))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_11, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 585, __pyx_L8_except_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L7_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":576 + * # ENDIF + * try: + * try: # <<<<<<<<<<<<<< + * # Showing return values was turned off, we should remove them from locals dict. + * # The values can be in the current frame or in the back one + */ + __pyx_L8_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L4_error; + __pyx_L7_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L11_try_end:; + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":587 + * pydev_log.exception() + * finally: + * f_locals_back = None # <<<<<<<<<<<<<< + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + /*finally:*/ { + /*normal exit:*/{ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_f_locals_back, Py_None); + goto __pyx_L5; + } + __pyx_L4_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0)) __Pyx_ErrFetch(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_17); + __pyx_t_12 = __pyx_lineno; __pyx_t_13 = __pyx_clineno; __pyx_t_14 = __pyx_filename; + { + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_f_locals_back, Py_None); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); + } + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __pyx_lineno = __pyx_t_12; __pyx_clineno = __pyx_t_13; __pyx_filename = __pyx_t_14; + goto __pyx_L1_error; + } + __pyx_L5:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":571 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _remove_return_values(self, py_db, frame): # <<<<<<<<<<<<<< + * # ELSE + * # def _remove_return_values(self, py_db, frame): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame._remove_return_values", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_f_locals_back); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":590 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _get_unfiltered_back_frame(self, py_db, frame): # <<<<<<<<<<<<<< + * # ELSE + * # def _get_unfiltered_back_frame(self, py_db, frame): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__get_unfiltered_back_frame(CYTHON_UNUSED struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_py_db, PyObject *__pyx_v_frame) { + PyObject *__pyx_v_f = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + unsigned int __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_get_unfiltered_back_frame", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":594 + * # def _get_unfiltered_back_frame(self, py_db, frame): + * # ENDIF + * f = frame.f_back # <<<<<<<<<<<<<< + * while f is not None: + * if not py_db.is_files_filter_enabled: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_f = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":595 + * # ENDIF + * f = frame.f_back + * while f is not None: # <<<<<<<<<<<<<< + * if not py_db.is_files_filter_enabled: + * return f + */ + while (1) { + __pyx_t_2 = (__pyx_v_f != Py_None); + if (!__pyx_t_2) break; + + /* "_pydevd_bundle/pydevd_cython.pyx":596 + * f = frame.f_back + * while f is not None: + * if not py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * return f + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_is_files_filter_enabled); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 596, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = (!__pyx_t_2); + if (__pyx_t_3) { + + /* "_pydevd_bundle/pydevd_cython.pyx":597 + * while f is not None: + * if not py_db.is_files_filter_enabled: + * return f # <<<<<<<<<<<<<< + * + * else: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_f); + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":596 + * f = frame.f_back + * while f is not None: + * if not py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * return f + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":600 + * + * else: + * if py_db.apply_files_filter(f, f.f_code.co_filename, False): # <<<<<<<<<<<<<< + * f = f.f_back + * + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 600, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 600, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 600, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_5, __pyx_v_f, __pyx_t_6, Py_False}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 3+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 600, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 600, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_3) { + + /* "_pydevd_bundle/pydevd_cython.pyx":601 + * else: + * if py_db.apply_files_filter(f, f.f_code.co_filename, False): + * f = f.f_back # <<<<<<<<<<<<<< + * + * else: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_back); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 601, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_f, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":600 + * + * else: + * if py_db.apply_files_filter(f, f.f_code.co_filename, False): # <<<<<<<<<<<<<< + * f = f.f_back + * + */ + goto __pyx_L6; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":604 + * + * else: + * return f # <<<<<<<<<<<<<< + * + * return f + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_f); + __pyx_r = __pyx_v_f; + goto __pyx_L0; + } + __pyx_L6:; + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":606 + * return f + * + * return f # <<<<<<<<<<<<<< + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_f); + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":590 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _get_unfiltered_back_frame(self, py_db, frame): # <<<<<<<<<<<<<< + * # ELSE + * # def _get_unfiltered_back_frame(self, py_db, frame): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame._get_unfiltered_back_frame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_f); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":609 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _is_same_frame(self, target_frame, current_frame): # <<<<<<<<<<<<<< + * cdef PyDBAdditionalThreadInfo info; + * # ELSE + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__is_same_frame(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_target_frame, PyObject *__pyx_v_current_frame) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info = 0; + PyObject *__pyx_v_f = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_is_same_frame", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":614 + * # def _is_same_frame(self, target_frame, current_frame): + * # ENDIF + * if target_frame is current_frame: # <<<<<<<<<<<<<< + * return True + * + */ + __pyx_t_1 = (__pyx_v_target_frame == __pyx_v_current_frame); + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":615 + * # ENDIF + * if target_frame is current_frame: + * return True # <<<<<<<<<<<<<< + * + * info = self._args[2] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":614 + * # def _is_same_frame(self, target_frame, current_frame): + * # ENDIF + * if target_frame is current_frame: # <<<<<<<<<<<<<< + * return True + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":617 + * return True + * + * info = self._args[2] # <<<<<<<<<<<<<< + * if info.pydev_use_scoped_step_frame: + * # If using scoped step we don't check the target, we just need to check + */ + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 617, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 617, __pyx_L1_error) + __pyx_v_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":618 + * + * info = self._args[2] + * if info.pydev_use_scoped_step_frame: # <<<<<<<<<<<<<< + * # If using scoped step we don't check the target, we just need to check + * # if the current matches the same heuristic where the target was defined. + */ + if (__pyx_v_info->pydev_use_scoped_step_frame) { + + /* "_pydevd_bundle/pydevd_cython.pyx":621 + * # If using scoped step we don't check the target, we just need to check + * # if the current matches the same heuristic where the target was defined. + * if target_frame is not None and current_frame is not None: # <<<<<<<<<<<<<< + * if target_frame.f_code.co_filename == current_frame.f_code.co_filename: + * # The co_name may be different (it may include the line number), but + */ + __pyx_t_3 = (__pyx_v_target_frame != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_current_frame != Py_None); + __pyx_t_1 = __pyx_t_3; + __pyx_L6_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":622 + * # if the current matches the same heuristic where the target was defined. + * if target_frame is not None and current_frame is not None: + * if target_frame.f_code.co_filename == current_frame.f_code.co_filename: # <<<<<<<<<<<<<< + * # The co_name may be different (it may include the line number), but + * # the filename must still be the same. + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_target_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 622, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 622, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_current_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 622, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 622, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 622, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 622, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":625 + * # The co_name may be different (it may include the line number), but + * # the filename must still be the same. + * f = current_frame.f_back # <<<<<<<<<<<<<< + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + * f = f.f_back + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_current_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 625, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_f = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":626 + * # the filename must still be the same. + * f = current_frame.f_back + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: # <<<<<<<<<<<<<< + * f = f.f_back + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + */ + __pyx_t_3 = (__pyx_v_f != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L10_bool_binop_done; + } + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 626, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co_name); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 626, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_PYDEVD_IPYTHON_CONTEXT); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 626, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 626, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_RichCompare(__pyx_t_5, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 626, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 626, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = __pyx_t_3; + __pyx_L10_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":627 + * f = current_frame.f_back + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + * f = f.f_back # <<<<<<<<<<<<<< + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + * return True + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_back); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 627, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF_SET(__pyx_v_f, __pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":628 + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + * f = f.f_back + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: # <<<<<<<<<<<<<< + * return True + * + */ + __pyx_t_3 = (__pyx_v_f != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L13_bool_binop_done; + } + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co_name); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_PYDEVD_IPYTHON_CONTEXT); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_2, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 628, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 628, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = __pyx_t_3; + __pyx_L13_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":629 + * f = f.f_back + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + * return True # <<<<<<<<<<<<<< + * + * return False + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":628 + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + * f = f.f_back + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: # <<<<<<<<<<<<<< + * return True + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":626 + * # the filename must still be the same. + * f = current_frame.f_back + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: # <<<<<<<<<<<<<< + * f = f.f_back + * if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":622 + * # if the current matches the same heuristic where the target was defined. + * if target_frame is not None and current_frame is not None: + * if target_frame.f_code.co_filename == current_frame.f_code.co_filename: # <<<<<<<<<<<<<< + * # The co_name may be different (it may include the line number), but + * # the filename must still be the same. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":621 + * # If using scoped step we don't check the target, we just need to check + * # if the current matches the same heuristic where the target was defined. + * if target_frame is not None and current_frame is not None: # <<<<<<<<<<<<<< + * if target_frame.f_code.co_filename == current_frame.f_code.co_filename: + * # The co_name may be different (it may include the line number), but + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":618 + * + * info = self._args[2] + * if info.pydev_use_scoped_step_frame: # <<<<<<<<<<<<<< + * # If using scoped step we don't check the target, we just need to check + * # if the current matches the same heuristic where the target was defined. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":631 + * return True + * + * return False # <<<<<<<<<<<<<< + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":609 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef _is_same_frame(self, target_frame, current_frame): # <<<<<<<<<<<<<< + * cdef PyDBAdditionalThreadInfo info; + * # ELSE + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame._is_same_frame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_info); + __Pyx_XDECREF(__pyx_v_f); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":634 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef trace_dispatch(self, frame, str event, arg): # <<<<<<<<<<<<<< + * cdef tuple abs_path_canonical_path_and_base; + * cdef bint is_exception_event; + */ + +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_11trace_dispatch(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_trace_dispatch(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg, int __pyx_skip_dispatch) { + PyObject *__pyx_v_abs_path_canonical_path_and_base = 0; + int __pyx_v_is_exception_event; + int __pyx_v_has_exception_breakpoints; + int __pyx_v_can_skip; + int __pyx_v_stop; + int __pyx_v_stop_on_plugin_breakpoint; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info = 0; + int __pyx_v_step_cmd; + int __pyx_v_line; + int __pyx_v_is_line; + int __pyx_v_is_call; + int __pyx_v_is_return; + int __pyx_v_should_stop; + PyObject *__pyx_v_breakpoints_for_file = 0; + PyObject *__pyx_v_stop_info = 0; + PyObject *__pyx_v_curr_func_name = 0; + PyObject *__pyx_v_frame_skips_cache = 0; + PyObject *__pyx_v_frame_cache_key = 0; + PyObject *__pyx_v_line_cache_key = 0; + int __pyx_v_breakpoints_in_line_cache; + int __pyx_v_breakpoints_in_frame_cache; + int __pyx_v_has_breakpoint_in_frame; + int __pyx_v_bp_line; + PyObject *__pyx_v_bp = 0; + int __pyx_v_pydev_smart_parent_offset; + int __pyx_v_pydev_smart_child_offset; + PyObject *__pyx_v_pydev_smart_step_into_variants = 0; + PyObject *__pyx_v_py_db = NULL; + PyObject *__pyx_v_thread = NULL; + PyObject *__pyx_v_plugin_manager = NULL; + PyObject *__pyx_v_stop_frame = NULL; + PyObject *__pyx_v_function_breakpoint_on_call_event = NULL; + PyObject *__pyx_v_returns_cache_key = NULL; + PyObject *__pyx_v_return_lines = NULL; + PyObject *__pyx_v_x = NULL; + PyObject *__pyx_v_f = NULL; + PyObject *__pyx_v_exc_info = NULL; + PyObject *__pyx_v_func_lines = NULL; + PyObject *__pyx_v_offset_and_lineno = NULL; + PyObject *__pyx_v_breakpoint = NULL; + PyObject *__pyx_v_stop_reason = NULL; + PyObject *__pyx_v_bp_type = NULL; + PyObject *__pyx_v_new_frame = NULL; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_eval_result = NULL; + PyObject *__pyx_v_cmd = NULL; + PyObject *__pyx_v_exc = NULL; + long __pyx_v_should_skip; + PyObject *__pyx_v_plugin_stop = NULL; + PyObject *__pyx_v_force_check_project_scope = NULL; + PyObject *__pyx_v_filename = NULL; + PyObject *__pyx_v_f2 = NULL; + PyObject *__pyx_v_back = NULL; + PyObject *__pyx_v_smart_step_into_variant = NULL; + PyObject *__pyx_v_children_variants = NULL; + PyObject *__pyx_v_f_code = NULL; + PyObject *__pyx_v_back_absolute_filename = NULL; + CYTHON_UNUSED PyObject *__pyx_v__ = NULL; + PyObject *__pyx_v_base = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + Py_ssize_t __pyx_t_13; + PyObject *(*__pyx_t_14)(PyObject *); + PyObject *(*__pyx_t_15)(PyObject *); + int __pyx_t_16; + PyObject *__pyx_t_17 = NULL; + PyObject *__pyx_t_18 = NULL; + PyObject *__pyx_t_19 = NULL; + int __pyx_t_20; + Py_ssize_t __pyx_t_21; + PyObject *__pyx_t_22 = NULL; + char const *__pyx_t_23; + PyObject *__pyx_t_24 = NULL; + PyObject *__pyx_t_25 = NULL; + PyObject *__pyx_t_26 = NULL; + PyObject *__pyx_t_27 = NULL; + PyObject *__pyx_t_28 = NULL; + PyObject *__pyx_t_29 = NULL; + char const *__pyx_t_30; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trace_dispatch", 0); + __Pyx_INCREF(__pyx_v_frame); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { + PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_11trace_dispatch)) { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_v_frame, __pyx_v_event, __pyx_v_arg}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); + if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) { + __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } + + /* "_pydevd_bundle/pydevd_cython.pyx":674 + * # generation be better split among what each part does). + * + * try: # <<<<<<<<<<<<<< + * # DEBUG = '_debugger_case_yield_from.py' in frame.f_code.co_filename + * py_db, abs_path_canonical_path_and_base, info, thread, frame_skips_cache, frame_cache_key = self._args + */ + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":676 + * try: + * # DEBUG = '_debugger_case_yield_from.py' in frame.f_code.co_filename + * py_db, abs_path_canonical_path_and_base, info, thread, frame_skips_cache, frame_cache_key = self._args # <<<<<<<<<<<<<< + * # if DEBUG: print('frame trace_dispatch %s %s %s %s %s %s, stop: %s' % (frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename, event, constant_to_str(info.pydev_step_cmd), arg, info.pydev_step_stop)) + * info.is_tracing += 1 + */ + __pyx_t_1 = __pyx_v_self->_args; + __Pyx_INCREF(__pyx_t_1); + if (likely(__pyx_t_1 != Py_None)) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 6)) { + if (size > 6) __Pyx_RaiseTooManyValuesError(6); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 676, __pyx_L4_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 3); + __pyx_t_7 = PyTuple_GET_ITEM(sequence, 4); + __pyx_t_8 = PyTuple_GET_ITEM(sequence, 5); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + #else + { + Py_ssize_t i; + PyObject** temps[6] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8}; + for (i=0; i < 6; i++) { + PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) __PYX_ERR(0, 676, __pyx_L4_error) + __Pyx_GOTREF(item); + *(temps[i]) = item; + } + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(0, 676, __pyx_L4_error) + } + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_3))) __PYX_ERR(0, 676, __pyx_L4_error) + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 676, __pyx_L4_error) + if (!(likely(PyDict_CheckExact(__pyx_t_7))||((__pyx_t_7) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_7))) __PYX_ERR(0, 676, __pyx_L4_error) + __pyx_v_py_db = __pyx_t_2; + __pyx_t_2 = 0; + __pyx_v_abs_path_canonical_path_and_base = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + __pyx_v_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_4); + __pyx_t_4 = 0; + __pyx_v_thread = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_v_frame_skips_cache = ((PyObject*)__pyx_t_7); + __pyx_t_7 = 0; + __pyx_v_frame_cache_key = __pyx_t_8; + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":678 + * py_db, abs_path_canonical_path_and_base, info, thread, frame_skips_cache, frame_cache_key = self._args + * # if DEBUG: print('frame trace_dispatch %s %s %s %s %s %s, stop: %s' % (frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename, event, constant_to_str(info.pydev_step_cmd), arg, info.pydev_step_stop)) + * info.is_tracing += 1 # <<<<<<<<<<<<<< + * + * # TODO: This shouldn't be needed. The fact that frame.f_lineno + */ + __pyx_v_info->is_tracing = (__pyx_v_info->is_tracing + 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":683 + * # is None seems like a bug in Python 3.11. + * # Reported in: https://github.com/python/cpython/issues/94485 + * line = frame.f_lineno or 0 # Workaround or case where frame.f_lineno is None # <<<<<<<<<<<<<< + * line_cache_key = (frame_cache_key, line) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 683, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 683, __pyx_L4_error) + if (!__pyx_t_10) { + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + __pyx_t_11 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 683, __pyx_L4_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L6_bool_binop_done:; + __pyx_v_line = __pyx_t_9; + + /* "_pydevd_bundle/pydevd_cython.pyx":684 + * # Reported in: https://github.com/python/cpython/issues/94485 + * line = frame.f_lineno or 0 # Workaround or case where frame.f_lineno is None + * line_cache_key = (frame_cache_key, line) # <<<<<<<<<<<<<< + * + * if py_db.pydb_disposed: + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 684, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 684, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_frame_cache_key); + __Pyx_GIVEREF(__pyx_v_frame_cache_key); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_frame_cache_key)) __PYX_ERR(0, 684, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1)) __PYX_ERR(0, 684, __pyx_L4_error); + __pyx_t_1 = 0; + __pyx_v_line_cache_key = ((PyObject*)__pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":686 + * line_cache_key = (frame_cache_key, line) + * + * if py_db.pydb_disposed: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_pydb_disposed); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 686, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 686, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":687 + * + * if py_db.pydb_disposed: + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * + * plugin_manager = py_db.plugin + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 687, __pyx_L4_error) + if (__pyx_t_10) { + __Pyx_INCREF(Py_None); + __pyx_t_8 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 687, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __pyx_t_1; + __pyx_t_1 = 0; + } + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":686 + * line_cache_key = (frame_cache_key, line) + * + * if py_db.pydb_disposed: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":689 + * return None if event == "call" else NO_FTRACE + * + * plugin_manager = py_db.plugin # <<<<<<<<<<<<<< + * has_exception_breakpoints = ( + * py_db.break_on_caught_exceptions or py_db.break_on_user_uncaught_exceptions or py_db.has_plugin_exception_breaks + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_plugin); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 689, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_v_plugin_manager = __pyx_t_8; + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":691 + * plugin_manager = py_db.plugin + * has_exception_breakpoints = ( + * py_db.break_on_caught_exceptions or py_db.break_on_user_uncaught_exceptions or py_db.has_plugin_exception_breaks # <<<<<<<<<<<<<< + * ) + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_break_on_caught_exceptions); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 691, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 691, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (!__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_break_on_user_uncaught_exception); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 691, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 691, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (!__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_has_plugin_exception_breaks); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 691, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 691, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_10 = __pyx_t_12; + __pyx_L9_bool_binop_done:; + __pyx_v_has_exception_breakpoints = __pyx_t_10; + + /* "_pydevd_bundle/pydevd_cython.pyx":694 + * ) + * + * stop_frame = info.pydev_step_stop # <<<<<<<<<<<<<< + * step_cmd = info.pydev_step_cmd + * function_breakpoint_on_call_event = None + */ + __pyx_t_8 = __pyx_v_info->pydev_step_stop; + __Pyx_INCREF(__pyx_t_8); + __pyx_v_stop_frame = __pyx_t_8; + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":695 + * + * stop_frame = info.pydev_step_stop + * step_cmd = info.pydev_step_cmd # <<<<<<<<<<<<<< + * function_breakpoint_on_call_event = None + * + */ + __pyx_t_9 = __pyx_v_info->pydev_step_cmd; + __pyx_v_step_cmd = __pyx_t_9; + + /* "_pydevd_bundle/pydevd_cython.pyx":696 + * stop_frame = info.pydev_step_stop + * step_cmd = info.pydev_step_cmd + * function_breakpoint_on_call_event = None # <<<<<<<<<<<<<< + * + * if frame.f_code.co_flags & 0xA0: # 0xa0 == CO_GENERATOR = 0x20 | CO_COROUTINE = 0x80 + */ + __Pyx_INCREF(Py_None); + __pyx_v_function_breakpoint_on_call_event = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":698 + * function_breakpoint_on_call_event = None + * + * if frame.f_code.co_flags & 0xA0: # 0xa0 == CO_GENERATOR = 0x20 | CO_COROUTINE = 0x80 # <<<<<<<<<<<<<< + * # Dealing with coroutines and generators: + * # When in a coroutine we change the perceived event to the debugger because + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 698, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_co_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 698, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = __Pyx_PyInt_AndObjC(__pyx_t_1, __pyx_int_160, 0xA0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 698, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 698, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":702 + * # When in a coroutine we change the perceived event to the debugger because + * # a call, StopIteration exception and return are usually just pausing/unpausing it. + * if event == "line": # <<<<<<<<<<<<<< + * is_line = True + * is_call = False + */ + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_line, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 702, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":703 + * # a call, StopIteration exception and return are usually just pausing/unpausing it. + * if event == "line": + * is_line = True # <<<<<<<<<<<<<< + * is_call = False + * is_return = False + */ + __pyx_v_is_line = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":704 + * if event == "line": + * is_line = True + * is_call = False # <<<<<<<<<<<<<< + * is_return = False + * is_exception_event = False + */ + __pyx_v_is_call = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":705 + * is_line = True + * is_call = False + * is_return = False # <<<<<<<<<<<<<< + * is_exception_event = False + * + */ + __pyx_v_is_return = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":706 + * is_call = False + * is_return = False + * is_exception_event = False # <<<<<<<<<<<<<< + * + * elif event == "return": + */ + __pyx_v_is_exception_event = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":702 + * # When in a coroutine we change the perceived event to the debugger because + * # a call, StopIteration exception and return are usually just pausing/unpausing it. + * if event == "line": # <<<<<<<<<<<<<< + * is_line = True + * is_call = False + */ + goto __pyx_L13; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":708 + * is_exception_event = False + * + * elif event == "return": # <<<<<<<<<<<<<< + * is_line = False + * is_call = False + */ + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_return, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 708, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":709 + * + * elif event == "return": + * is_line = False # <<<<<<<<<<<<<< + * is_call = False + * is_return = True + */ + __pyx_v_is_line = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":710 + * elif event == "return": + * is_line = False + * is_call = False # <<<<<<<<<<<<<< + * is_return = True + * is_exception_event = False + */ + __pyx_v_is_call = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":711 + * is_line = False + * is_call = False + * is_return = True # <<<<<<<<<<<<<< + * is_exception_event = False + * + */ + __pyx_v_is_return = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":712 + * is_call = False + * is_return = True + * is_exception_event = False # <<<<<<<<<<<<<< + * + * returns_cache_key = (frame_cache_key, "returns") + */ + __pyx_v_is_exception_event = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":714 + * is_exception_event = False + * + * returns_cache_key = (frame_cache_key, "returns") # <<<<<<<<<<<<<< + * return_lines = frame_skips_cache.get(returns_cache_key) + * if return_lines is None: + */ + __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 714, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_frame_cache_key); + __Pyx_GIVEREF(__pyx_v_frame_cache_key); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_frame_cache_key)) __PYX_ERR(0, 714, __pyx_L4_error); + __Pyx_INCREF(__pyx_n_s_returns); + __Pyx_GIVEREF(__pyx_n_s_returns); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_n_s_returns)) __PYX_ERR(0, 714, __pyx_L4_error); + __pyx_v_returns_cache_key = ((PyObject*)__pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":715 + * + * returns_cache_key = (frame_cache_key, "returns") + * return_lines = frame_skips_cache.get(returns_cache_key) # <<<<<<<<<<<<<< + * if return_lines is None: + * # Note: we're collecting the return lines by inspecting the bytecode as + */ + if (unlikely(__pyx_v_frame_skips_cache == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 715, __pyx_L4_error) + } + __pyx_t_8 = __Pyx_PyDict_GetItemDefault(__pyx_v_frame_skips_cache, __pyx_v_returns_cache_key, Py_None); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 715, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_v_return_lines = __pyx_t_8; + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":716 + * returns_cache_key = (frame_cache_key, "returns") + * return_lines = frame_skips_cache.get(returns_cache_key) + * if return_lines is None: # <<<<<<<<<<<<<< + * # Note: we're collecting the return lines by inspecting the bytecode as + * # there are multiple returns and multiple stop iterations when awaiting and + */ + __pyx_t_10 = (__pyx_v_return_lines == Py_None); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":721 + * # it doesn't give any clear indication when a coroutine or generator is + * # finishing or just pausing. + * return_lines = set() # <<<<<<<<<<<<<< + * for x in py_db.collect_return_info(frame.f_code): + * # Note: cython does not support closures in cpdefs (so we can't use + */ + __pyx_t_8 = PySet_New(0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 721, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF_SET(__pyx_v_return_lines, __pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":722 + * # finishing or just pausing. + * return_lines = set() + * for x in py_db.collect_return_info(frame.f_code): # <<<<<<<<<<<<<< + * # Note: cython does not support closures in cpdefs (so we can't use + * # a list comprehension). + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_collect_return_info); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 722, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 722, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_7}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 722, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + if (likely(PyList_CheckExact(__pyx_t_8)) || PyTuple_CheckExact(__pyx_t_8)) { + __pyx_t_1 = __pyx_t_8; __Pyx_INCREF(__pyx_t_1); + __pyx_t_13 = 0; + __pyx_t_14 = NULL; + } else { + __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 722, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_14 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 722, __pyx_L4_error) + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + for (;;) { + if (likely(!__pyx_t_14)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 722, __pyx_L4_error) + #endif + if (__pyx_t_13 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_8); __pyx_t_13++; if (unlikely((0 < 0))) __PYX_ERR(0, 722, __pyx_L4_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 722, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 722, __pyx_L4_error) + #endif + if (__pyx_t_13 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_8); __pyx_t_13++; if (unlikely((0 < 0))) __PYX_ERR(0, 722, __pyx_L4_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 722, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_14(__pyx_t_1); + if (unlikely(!__pyx_t_8)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 722, __pyx_L4_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_x, __pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":725 + * # Note: cython does not support closures in cpdefs (so we can't use + * # a list comprehension). + * return_lines.add(x.return_line) # <<<<<<<<<<<<<< + * + * frame_skips_cache[returns_cache_key] = return_lines + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_return_lines, __pyx_n_s_add); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 725, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_x, __pyx_n_s_return_line); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 725, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_6}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 725, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":722 + * # finishing or just pausing. + * return_lines = set() + * for x in py_db.collect_return_info(frame.f_code): # <<<<<<<<<<<<<< + * # Note: cython does not support closures in cpdefs (so we can't use + * # a list comprehension). + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":727 + * return_lines.add(x.return_line) + * + * frame_skips_cache[returns_cache_key] = return_lines # <<<<<<<<<<<<<< + * + * if line not in return_lines: + */ + if (unlikely(__pyx_v_frame_skips_cache == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 727, __pyx_L4_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_frame_skips_cache, __pyx_v_returns_cache_key, __pyx_v_return_lines) < 0))) __PYX_ERR(0, 727, __pyx_L4_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":716 + * returns_cache_key = (frame_cache_key, "returns") + * return_lines = frame_skips_cache.get(returns_cache_key) + * if return_lines is None: # <<<<<<<<<<<<<< + * # Note: we're collecting the return lines by inspecting the bytecode as + * # there are multiple returns and multiple stop iterations when awaiting and + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":729 + * frame_skips_cache[returns_cache_key] = return_lines + * + * if line not in return_lines: # <<<<<<<<<<<<<< + * # Not really a return (coroutine/generator paused). + * return self.trace_dispatch + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 729, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_10 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_v_return_lines, Py_NE)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 729, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":731 + * if line not in return_lines: + * # Not really a return (coroutine/generator paused). + * return self.trace_dispatch # <<<<<<<<<<<<<< + * else: + * if self.exc_info: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 731, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":729 + * frame_skips_cache[returns_cache_key] = return_lines + * + * if line not in return_lines: # <<<<<<<<<<<<<< + * # Not really a return (coroutine/generator paused). + * return self.trace_dispatch + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":733 + * return self.trace_dispatch + * else: + * if self.exc_info: # <<<<<<<<<<<<<< + * self.handle_user_exception(frame) + * return self.trace_dispatch + */ + /*else*/ { + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_self->exc_info); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 733, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":734 + * else: + * if self.exc_info: + * self.handle_user_exception(frame) # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_handle_user_exception); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 734, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_v_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 734, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":735 + * if self.exc_info: + * self.handle_user_exception(frame) + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * # Tricky handling: usually when we're on a frame which is about to exit + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 735, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":733 + * return self.trace_dispatch + * else: + * if self.exc_info: # <<<<<<<<<<<<<< + * self.handle_user_exception(frame) + * return self.trace_dispatch + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":753 + * # as the return shouldn't mean that we've actually completed executing a + * # frame in this case). + * if stop_frame is frame and not info.pydev_use_scoped_step_frame: # <<<<<<<<<<<<<< + * if step_cmd in (108, 159, 107, 144): + * f = self._get_unfiltered_back_frame(py_db, frame) + */ + __pyx_t_12 = (__pyx_v_stop_frame == __pyx_v_frame); + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L21_bool_binop_done; + } + __pyx_t_12 = (!__pyx_v_info->pydev_use_scoped_step_frame); + __pyx_t_10 = __pyx_t_12; + __pyx_L21_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":754 + * # frame in this case). + * if stop_frame is frame and not info.pydev_use_scoped_step_frame: + * if step_cmd in (108, 159, 107, 144): # <<<<<<<<<<<<<< + * f = self._get_unfiltered_back_frame(py_db, frame) + * if f is not None: + */ + switch (__pyx_v_step_cmd) { + case 0x6C: + case 0x9F: + case 0x6B: + case 0x90: + + /* "_pydevd_bundle/pydevd_cython.pyx":755 + * if stop_frame is frame and not info.pydev_use_scoped_step_frame: + * if step_cmd in (108, 159, 107, 144): + * f = self._get_unfiltered_back_frame(py_db, frame) # <<<<<<<<<<<<<< + * if f is not None: + * info.pydev_step_cmd = 206 + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_get_unfiltered_back_frame(__pyx_v_self, __pyx_v_py_db, __pyx_v_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 755, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_f = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":756 + * if step_cmd in (108, 159, 107, 144): + * f = self._get_unfiltered_back_frame(py_db, frame) + * if f is not None: # <<<<<<<<<<<<<< + * info.pydev_step_cmd = 206 + * info.pydev_step_stop = f + */ + __pyx_t_10 = (__pyx_v_f != Py_None); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":757 + * f = self._get_unfiltered_back_frame(py_db, frame) + * if f is not None: + * info.pydev_step_cmd = 206 # <<<<<<<<<<<<<< + * info.pydev_step_stop = f + * else: + */ + __pyx_v_info->pydev_step_cmd = 0xCE; + + /* "_pydevd_bundle/pydevd_cython.pyx":758 + * if f is not None: + * info.pydev_step_cmd = 206 + * info.pydev_step_stop = f # <<<<<<<<<<<<<< + * else: + * if step_cmd == 108: + */ + __Pyx_INCREF(__pyx_v_f); + __Pyx_GIVEREF(__pyx_v_f); + __Pyx_GOTREF(__pyx_v_info->pydev_step_stop); + __Pyx_DECREF(__pyx_v_info->pydev_step_stop); + __pyx_v_info->pydev_step_stop = __pyx_v_f; + + /* "_pydevd_bundle/pydevd_cython.pyx":756 + * if step_cmd in (108, 159, 107, 144): + * f = self._get_unfiltered_back_frame(py_db, frame) + * if f is not None: # <<<<<<<<<<<<<< + * info.pydev_step_cmd = 206 + * info.pydev_step_stop = f + */ + goto __pyx_L23; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":760 + * info.pydev_step_stop = f + * else: + * if step_cmd == 108: # <<<<<<<<<<<<<< + * info.pydev_step_cmd = 107 + * info.pydev_step_stop = None + */ + /*else*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":764 + * info.pydev_step_stop = None + * + * elif step_cmd == 159: # <<<<<<<<<<<<<< + * info.pydev_step_cmd = 144 + * info.pydev_step_stop = None + */ + switch (__pyx_v_step_cmd) { + case 0x6C: + + /* "_pydevd_bundle/pydevd_cython.pyx":761 + * else: + * if step_cmd == 108: + * info.pydev_step_cmd = 107 # <<<<<<<<<<<<<< + * info.pydev_step_stop = None + * + */ + __pyx_v_info->pydev_step_cmd = 0x6B; + + /* "_pydevd_bundle/pydevd_cython.pyx":762 + * if step_cmd == 108: + * info.pydev_step_cmd = 107 + * info.pydev_step_stop = None # <<<<<<<<<<<<<< + * + * elif step_cmd == 159: + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->pydev_step_stop); + __Pyx_DECREF(__pyx_v_info->pydev_step_stop); + __pyx_v_info->pydev_step_stop = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":760 + * info.pydev_step_stop = f + * else: + * if step_cmd == 108: # <<<<<<<<<<<<<< + * info.pydev_step_cmd = 107 + * info.pydev_step_stop = None + */ + break; + case 0x9F: + + /* "_pydevd_bundle/pydevd_cython.pyx":765 + * + * elif step_cmd == 159: + * info.pydev_step_cmd = 144 # <<<<<<<<<<<<<< + * info.pydev_step_stop = None + * + */ + __pyx_v_info->pydev_step_cmd = 0x90; + + /* "_pydevd_bundle/pydevd_cython.pyx":766 + * elif step_cmd == 159: + * info.pydev_step_cmd = 144 + * info.pydev_step_stop = None # <<<<<<<<<<<<<< + * + * elif step_cmd == 206: + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->pydev_step_stop); + __Pyx_DECREF(__pyx_v_info->pydev_step_stop); + __pyx_v_info->pydev_step_stop = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":764 + * info.pydev_step_stop = None + * + * elif step_cmd == 159: # <<<<<<<<<<<<<< + * info.pydev_step_cmd = 144 + * info.pydev_step_stop = None + */ + break; + default: break; + } + } + __pyx_L23:; + + /* "_pydevd_bundle/pydevd_cython.pyx":754 + * # frame in this case). + * if stop_frame is frame and not info.pydev_use_scoped_step_frame: + * if step_cmd in (108, 159, 107, 144): # <<<<<<<<<<<<<< + * f = self._get_unfiltered_back_frame(py_db, frame) + * if f is not None: + */ + break; + case 0xCE: + + /* "_pydevd_bundle/pydevd_cython.pyx":770 + * elif step_cmd == 206: + * # We're exiting this one, so, mark the new coroutine context. + * f = self._get_unfiltered_back_frame(py_db, frame) # <<<<<<<<<<<<<< + * if f is not None: + * info.pydev_step_stop = f + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_get_unfiltered_back_frame(__pyx_v_self, __pyx_v_py_db, __pyx_v_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 770, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_f = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":771 + * # We're exiting this one, so, mark the new coroutine context. + * f = self._get_unfiltered_back_frame(py_db, frame) + * if f is not None: # <<<<<<<<<<<<<< + * info.pydev_step_stop = f + * else: + */ + __pyx_t_10 = (__pyx_v_f != Py_None); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":772 + * f = self._get_unfiltered_back_frame(py_db, frame) + * if f is not None: + * info.pydev_step_stop = f # <<<<<<<<<<<<<< + * else: + * info.pydev_step_cmd = 107 + */ + __Pyx_INCREF(__pyx_v_f); + __Pyx_GIVEREF(__pyx_v_f); + __Pyx_GOTREF(__pyx_v_info->pydev_step_stop); + __Pyx_DECREF(__pyx_v_info->pydev_step_stop); + __pyx_v_info->pydev_step_stop = __pyx_v_f; + + /* "_pydevd_bundle/pydevd_cython.pyx":771 + * # We're exiting this one, so, mark the new coroutine context. + * f = self._get_unfiltered_back_frame(py_db, frame) + * if f is not None: # <<<<<<<<<<<<<< + * info.pydev_step_stop = f + * else: + */ + goto __pyx_L24; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":774 + * info.pydev_step_stop = f + * else: + * info.pydev_step_cmd = 107 # <<<<<<<<<<<<<< + * info.pydev_step_stop = None + * + */ + /*else*/ { + __pyx_v_info->pydev_step_cmd = 0x6B; + + /* "_pydevd_bundle/pydevd_cython.pyx":775 + * else: + * info.pydev_step_cmd = 107 + * info.pydev_step_stop = None # <<<<<<<<<<<<<< + * + * elif event == "exception": + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->pydev_step_stop); + __Pyx_DECREF(__pyx_v_info->pydev_step_stop); + __pyx_v_info->pydev_step_stop = Py_None; + } + __pyx_L24:; + + /* "_pydevd_bundle/pydevd_cython.pyx":768 + * info.pydev_step_stop = None + * + * elif step_cmd == 206: # <<<<<<<<<<<<<< + * # We're exiting this one, so, mark the new coroutine context. + * f = self._get_unfiltered_back_frame(py_db, frame) + */ + break; + default: break; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":753 + * # as the return shouldn't mean that we've actually completed executing a + * # frame in this case). + * if stop_frame is frame and not info.pydev_use_scoped_step_frame: # <<<<<<<<<<<<<< + * if step_cmd in (108, 159, 107, 144): + * f = self._get_unfiltered_back_frame(py_db, frame) + */ + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":708 + * is_exception_event = False + * + * elif event == "return": # <<<<<<<<<<<<<< + * is_line = False + * is_call = False + */ + goto __pyx_L13; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":777 + * info.pydev_step_stop = None + * + * elif event == "exception": # <<<<<<<<<<<<<< + * breakpoints_for_file = None + * if has_exception_breakpoints: + */ + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_exception, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 777, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":778 + * + * elif event == "exception": + * breakpoints_for_file = None # <<<<<<<<<<<<<< + * if has_exception_breakpoints: + * should_stop, frame, exc_info = should_stop_on_exception( + */ + __Pyx_INCREF(Py_None); + __pyx_v_breakpoints_for_file = ((PyObject*)Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":779 + * elif event == "exception": + * breakpoints_for_file = None + * if has_exception_breakpoints: # <<<<<<<<<<<<<< + * should_stop, frame, exc_info = should_stop_on_exception( + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + */ + if (__pyx_v_has_exception_breakpoints) { + + /* "_pydevd_bundle/pydevd_cython.pyx":780 + * breakpoints_for_file = None + * if has_exception_breakpoints: + * should_stop, frame, exc_info = should_stop_on_exception( # <<<<<<<<<<<<<< + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_should_stop_on_exception); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 780, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + + /* "_pydevd_bundle/pydevd_cython.pyx":781 + * if has_exception_breakpoints: + * should_stop, frame, exc_info = should_stop_on_exception( + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info # <<<<<<<<<<<<<< + * ) + * self.exc_info = exc_info + */ + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 781, __pyx_L4_error) + } + __pyx_t_7 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 781, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 781, __pyx_L4_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 781, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 781, __pyx_L4_error) + } + __pyx_t_4 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 781, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[7] = {__pyx_t_3, __pyx_t_7, __pyx_t_6, __pyx_v_frame, __pyx_t_4, __pyx_v_arg, __pyx_v_self->exc_info}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 6+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 780, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 780, __pyx_L4_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 2); + } else { + __pyx_t_8 = PyList_GET_ITEM(sequence, 0); + __pyx_t_4 = PyList_GET_ITEM(sequence, 1); + __pyx_t_6 = PyList_GET_ITEM(sequence, 2); + } + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_6); + #else + __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 780, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 780, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 780, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_7 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 780, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_7); + index = 0; __pyx_t_8 = __pyx_t_15(__pyx_t_7); if (unlikely(!__pyx_t_8)) goto __pyx_L26_unpacking_failed; + __Pyx_GOTREF(__pyx_t_8); + index = 1; __pyx_t_4 = __pyx_t_15(__pyx_t_7); if (unlikely(!__pyx_t_4)) goto __pyx_L26_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + index = 2; __pyx_t_6 = __pyx_t_15(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L26_unpacking_failed; + __Pyx_GOTREF(__pyx_t_6); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_7), 3) < 0) __PYX_ERR(0, 780, __pyx_L4_error) + __pyx_t_15 = NULL; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L27_unpacking_done; + __pyx_L26_unpacking_failed:; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_15 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 780, __pyx_L4_error) + __pyx_L27_unpacking_done:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":780 + * breakpoints_for_file = None + * if has_exception_breakpoints: + * should_stop, frame, exc_info = should_stop_on_exception( # <<<<<<<<<<<<<< + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + * ) + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 780, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_should_stop = __pyx_t_10; + __Pyx_DECREF_SET(__pyx_v_frame, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_v_exc_info = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":783 + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + * ) + * self.exc_info = exc_info # <<<<<<<<<<<<<< + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + */ + __Pyx_INCREF(__pyx_v_exc_info); + __Pyx_GIVEREF(__pyx_v_exc_info); + __Pyx_GOTREF(__pyx_v_self->exc_info); + __Pyx_DECREF(__pyx_v_self->exc_info); + __pyx_v_self->exc_info = __pyx_v_exc_info; + + /* "_pydevd_bundle/pydevd_cython.pyx":784 + * ) + * self.exc_info = exc_info + * if should_stop: # <<<<<<<<<<<<<< + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch + */ + if (__pyx_v_should_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":785 + * self.exc_info = exc_info + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_handle_exception); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 785, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 785, __pyx_L4_error) + } + __pyx_t_4 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 785, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 785, __pyx_L4_error) + } + __pyx_t_8 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 785, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_EXCEPTION_TYPE_HANDLED); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 785, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[6] = {__pyx_t_3, __pyx_t_4, __pyx_t_8, __pyx_v_frame, __pyx_v_arg, __pyx_t_7}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 5+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 785, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 785, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":786 + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * return self.trace_dispatch + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 786, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":785 + * self.exc_info = exc_info + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":784 + * ) + * self.exc_info = exc_info + * if should_stop: # <<<<<<<<<<<<<< + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":779 + * elif event == "exception": + * breakpoints_for_file = None + * if has_exception_breakpoints: # <<<<<<<<<<<<<< + * should_stop, frame, exc_info = should_stop_on_exception( + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":788 + * return self.trace_dispatch + * + * return self.trace_dispatch # <<<<<<<<<<<<<< + * else: + * # event == 'call' or event == 'c_XXX' + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 788, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":777 + * info.pydev_step_stop = None + * + * elif event == "exception": # <<<<<<<<<<<<<< + * breakpoints_for_file = None + * if has_exception_breakpoints: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":791 + * else: + * # event == 'call' or event == 'c_XXX' + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * else: # Not coroutine nor generator + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 791, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L3_return; + } + __pyx_L13:; + + /* "_pydevd_bundle/pydevd_cython.pyx":698 + * function_breakpoint_on_call_event = None + * + * if frame.f_code.co_flags & 0xA0: # 0xa0 == CO_GENERATOR = 0x20 | CO_COROUTINE = 0x80 # <<<<<<<<<<<<<< + * # Dealing with coroutines and generators: + * # When in a coroutine we change the perceived event to the debugger because + */ + goto __pyx_L12; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":794 + * + * else: # Not coroutine nor generator + * if event == "line": # <<<<<<<<<<<<<< + * is_line = True + * is_call = False + */ + /*else*/ { + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_line, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 794, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":795 + * else: # Not coroutine nor generator + * if event == "line": + * is_line = True # <<<<<<<<<<<<<< + * is_call = False + * is_return = False + */ + __pyx_v_is_line = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":796 + * if event == "line": + * is_line = True + * is_call = False # <<<<<<<<<<<<<< + * is_return = False + * is_exception_event = False + */ + __pyx_v_is_call = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":797 + * is_line = True + * is_call = False + * is_return = False # <<<<<<<<<<<<<< + * is_exception_event = False + * + */ + __pyx_v_is_return = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":798 + * is_call = False + * is_return = False + * is_exception_event = False # <<<<<<<<<<<<<< + * + * elif event == "return": + */ + __pyx_v_is_exception_event = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":794 + * + * else: # Not coroutine nor generator + * if event == "line": # <<<<<<<<<<<<<< + * is_line = True + * is_call = False + */ + goto __pyx_L30; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":800 + * is_exception_event = False + * + * elif event == "return": # <<<<<<<<<<<<<< + * is_line = False + * is_return = True + */ + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_return, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 800, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":801 + * + * elif event == "return": + * is_line = False # <<<<<<<<<<<<<< + * is_return = True + * is_call = False + */ + __pyx_v_is_line = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":802 + * elif event == "return": + * is_line = False + * is_return = True # <<<<<<<<<<<<<< + * is_call = False + * is_exception_event = False + */ + __pyx_v_is_return = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":803 + * is_line = False + * is_return = True + * is_call = False # <<<<<<<<<<<<<< + * is_exception_event = False + * + */ + __pyx_v_is_call = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":804 + * is_return = True + * is_call = False + * is_exception_event = False # <<<<<<<<<<<<<< + * + * # If we are in single step mode and something causes us to exit the current frame, we need to make sure we break + */ + __pyx_v_is_exception_event = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":813 + * # @DontTrace comment. + * if ( + * stop_frame is frame # <<<<<<<<<<<<<< + * and not info.pydev_use_scoped_step_frame + * and is_return + */ + __pyx_t_12 = (__pyx_v_stop_frame == __pyx_v_frame); + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L32_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":814 + * if ( + * stop_frame is frame + * and not info.pydev_use_scoped_step_frame # <<<<<<<<<<<<<< + * and is_return + * and step_cmd + */ + __pyx_t_12 = (!__pyx_v_info->pydev_use_scoped_step_frame); + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L32_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":815 + * stop_frame is frame + * and not info.pydev_use_scoped_step_frame + * and is_return # <<<<<<<<<<<<<< + * and step_cmd + * in (108, 109, 159, 160, 128) + */ + if (__pyx_v_is_return) { + } else { + __pyx_t_10 = __pyx_v_is_return; + goto __pyx_L32_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":817 + * and is_return + * and step_cmd + * in (108, 109, 159, 160, 128) # <<<<<<<<<<<<<< + * ): + * if step_cmd in (108, 109, 128): + */ + switch (__pyx_v_step_cmd) { + case 0x6C: + case 0x6D: + case 0x9F: + case 0xA0: + case 0x80: + __pyx_t_12 = 1; + break; + default: + __pyx_t_12 = 0; + break; + } + __pyx_t_16 = __pyx_t_12; + __pyx_t_10 = __pyx_t_16; + __pyx_L32_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":812 + * # Note: this is especially troublesome when we're skipping code with the + * # @DontTrace comment. + * if ( # <<<<<<<<<<<<<< + * stop_frame is frame + * and not info.pydev_use_scoped_step_frame + */ + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":819 + * in (108, 109, 159, 160, 128) + * ): + * if step_cmd in (108, 109, 128): # <<<<<<<<<<<<<< + * info.pydev_step_cmd = 107 + * else: + */ + switch (__pyx_v_step_cmd) { + case 0x6C: + case 0x6D: + case 0x80: + + /* "_pydevd_bundle/pydevd_cython.pyx":820 + * ): + * if step_cmd in (108, 109, 128): + * info.pydev_step_cmd = 107 # <<<<<<<<<<<<<< + * else: + * info.pydev_step_cmd = 144 + */ + __pyx_v_info->pydev_step_cmd = 0x6B; + + /* "_pydevd_bundle/pydevd_cython.pyx":819 + * in (108, 109, 159, 160, 128) + * ): + * if step_cmd in (108, 109, 128): # <<<<<<<<<<<<<< + * info.pydev_step_cmd = 107 + * else: + */ + break; + default: + + /* "_pydevd_bundle/pydevd_cython.pyx":822 + * info.pydev_step_cmd = 107 + * else: + * info.pydev_step_cmd = 144 # <<<<<<<<<<<<<< + * info.pydev_step_stop = None + * + */ + __pyx_v_info->pydev_step_cmd = 0x90; + break; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":823 + * else: + * info.pydev_step_cmd = 144 + * info.pydev_step_stop = None # <<<<<<<<<<<<<< + * + * if self.exc_info: + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->pydev_step_stop); + __Pyx_DECREF(__pyx_v_info->pydev_step_stop); + __pyx_v_info->pydev_step_stop = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":812 + * # Note: this is especially troublesome when we're skipping code with the + * # @DontTrace comment. + * if ( # <<<<<<<<<<<<<< + * stop_frame is frame + * and not info.pydev_use_scoped_step_frame + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":825 + * info.pydev_step_stop = None + * + * if self.exc_info: # <<<<<<<<<<<<<< + * if self.handle_user_exception(frame): + * return self.trace_dispatch + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_self->exc_info); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 825, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":826 + * + * if self.exc_info: + * if self.handle_user_exception(frame): # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_handle_user_exception); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 826, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_v_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 826, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 826, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":827 + * if self.exc_info: + * if self.handle_user_exception(frame): + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * elif event == "call": + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 827, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":826 + * + * if self.exc_info: + * if self.handle_user_exception(frame): # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":825 + * info.pydev_step_stop = None + * + * if self.exc_info: # <<<<<<<<<<<<<< + * if self.handle_user_exception(frame): + * return self.trace_dispatch + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":800 + * is_exception_event = False + * + * elif event == "return": # <<<<<<<<<<<<<< + * is_line = False + * is_return = True + */ + goto __pyx_L30; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":829 + * return self.trace_dispatch + * + * elif event == "call": # <<<<<<<<<<<<<< + * is_line = False + * is_call = True + */ + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 829, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":830 + * + * elif event == "call": + * is_line = False # <<<<<<<<<<<<<< + * is_call = True + * is_return = False + */ + __pyx_v_is_line = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":831 + * elif event == "call": + * is_line = False + * is_call = True # <<<<<<<<<<<<<< + * is_return = False + * is_exception_event = False + */ + __pyx_v_is_call = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":832 + * is_line = False + * is_call = True + * is_return = False # <<<<<<<<<<<<<< + * is_exception_event = False + * if frame.f_code.co_firstlineno == frame.f_lineno: # Check line to deal with async/await. + */ + __pyx_v_is_return = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":833 + * is_call = True + * is_return = False + * is_exception_event = False # <<<<<<<<<<<<<< + * if frame.f_code.co_firstlineno == frame.f_lineno: # Check line to deal with async/await. + * function_breakpoint_on_call_event = py_db.function_breakpoint_name_to_breakpoint.get(frame.f_code.co_name) + */ + __pyx_v_is_exception_event = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":834 + * is_return = False + * is_exception_event = False + * if frame.f_code.co_firstlineno == frame.f_lineno: # Check line to deal with async/await. # <<<<<<<<<<<<<< + * function_breakpoint_on_call_event = py_db.function_breakpoint_name_to_breakpoint.get(frame.f_code.co_name) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 834, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_co_firstlineno); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 834, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 834, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 834, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 834, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":835 + * is_exception_event = False + * if frame.f_code.co_firstlineno == frame.f_lineno: # Check line to deal with async/await. + * function_breakpoint_on_call_event = py_db.function_breakpoint_name_to_breakpoint.get(frame.f_code.co_name) # <<<<<<<<<<<<<< + * + * elif event == "exception": + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_function_breakpoint_name_to_brea); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 835, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_get); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 835, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 835, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_co_name); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 835, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_8}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 835, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF_SET(__pyx_v_function_breakpoint_on_call_event, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":834 + * is_return = False + * is_exception_event = False + * if frame.f_code.co_firstlineno == frame.f_lineno: # Check line to deal with async/await. # <<<<<<<<<<<<<< + * function_breakpoint_on_call_event = py_db.function_breakpoint_name_to_breakpoint.get(frame.f_code.co_name) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":829 + * return self.trace_dispatch + * + * elif event == "call": # <<<<<<<<<<<<<< + * is_line = False + * is_call = True + */ + goto __pyx_L30; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":837 + * function_breakpoint_on_call_event = py_db.function_breakpoint_name_to_breakpoint.get(frame.f_code.co_name) + * + * elif event == "exception": # <<<<<<<<<<<<<< + * is_exception_event = True + * breakpoints_for_file = None + */ + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_exception, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 837, __pyx_L4_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":838 + * + * elif event == "exception": + * is_exception_event = True # <<<<<<<<<<<<<< + * breakpoints_for_file = None + * if has_exception_breakpoints: + */ + __pyx_v_is_exception_event = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":839 + * elif event == "exception": + * is_exception_event = True + * breakpoints_for_file = None # <<<<<<<<<<<<<< + * if has_exception_breakpoints: + * should_stop, frame, exc_info = should_stop_on_exception( + */ + __Pyx_INCREF(Py_None); + __pyx_v_breakpoints_for_file = ((PyObject*)Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":840 + * is_exception_event = True + * breakpoints_for_file = None + * if has_exception_breakpoints: # <<<<<<<<<<<<<< + * should_stop, frame, exc_info = should_stop_on_exception( + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + */ + if (__pyx_v_has_exception_breakpoints) { + + /* "_pydevd_bundle/pydevd_cython.pyx":841 + * breakpoints_for_file = None + * if has_exception_breakpoints: + * should_stop, frame, exc_info = should_stop_on_exception( # <<<<<<<<<<<<<< + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_should_stop_on_exception); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 841, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "_pydevd_bundle/pydevd_cython.pyx":842 + * if has_exception_breakpoints: + * should_stop, frame, exc_info = should_stop_on_exception( + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info # <<<<<<<<<<<<<< + * ) + * self.exc_info = exc_info + */ + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 842, __pyx_L4_error) + } + __pyx_t_8 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 842, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 842, __pyx_L4_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 842, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 842, __pyx_L4_error) + } + __pyx_t_4 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 842, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[7] = {__pyx_t_3, __pyx_t_8, __pyx_t_1, __pyx_v_frame, __pyx_t_4, __pyx_v_arg, __pyx_v_self->exc_info}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 6+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 841, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_7))) || (PyList_CheckExact(__pyx_t_7))) { + PyObject* sequence = __pyx_t_7; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 841, __pyx_L4_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_1 = PyTuple_GET_ITEM(sequence, 2); + } else { + __pyx_t_6 = PyList_GET_ITEM(sequence, 0); + __pyx_t_4 = PyList_GET_ITEM(sequence, 1); + __pyx_t_1 = PyList_GET_ITEM(sequence, 2); + } + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_1); + #else + __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 841, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 841, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 841, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_8 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 841, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_8); + index = 0; __pyx_t_6 = __pyx_t_15(__pyx_t_8); if (unlikely(!__pyx_t_6)) goto __pyx_L40_unpacking_failed; + __Pyx_GOTREF(__pyx_t_6); + index = 1; __pyx_t_4 = __pyx_t_15(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L40_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + index = 2; __pyx_t_1 = __pyx_t_15(__pyx_t_8); if (unlikely(!__pyx_t_1)) goto __pyx_L40_unpacking_failed; + __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_8), 3) < 0) __PYX_ERR(0, 841, __pyx_L4_error) + __pyx_t_15 = NULL; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L41_unpacking_done; + __pyx_L40_unpacking_failed:; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_15 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 841, __pyx_L4_error) + __pyx_L41_unpacking_done:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":841 + * breakpoints_for_file = None + * if has_exception_breakpoints: + * should_stop, frame, exc_info = should_stop_on_exception( # <<<<<<<<<<<<<< + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + * ) + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 841, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_should_stop = __pyx_t_10; + __Pyx_DECREF_SET(__pyx_v_frame, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_v_exc_info = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":844 + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + * ) + * self.exc_info = exc_info # <<<<<<<<<<<<<< + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + */ + __Pyx_INCREF(__pyx_v_exc_info); + __Pyx_GIVEREF(__pyx_v_exc_info); + __Pyx_GOTREF(__pyx_v_self->exc_info); + __Pyx_DECREF(__pyx_v_self->exc_info); + __pyx_v_self->exc_info = __pyx_v_exc_info; + + /* "_pydevd_bundle/pydevd_cython.pyx":845 + * ) + * self.exc_info = exc_info + * if should_stop: # <<<<<<<<<<<<<< + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch + */ + if (__pyx_v_should_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":846 + * self.exc_info = exc_info + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): # <<<<<<<<<<<<<< + * return self.trace_dispatch + * is_line = False + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_handle_exception); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 846, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 846, __pyx_L4_error) + } + __pyx_t_4 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 846, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 846, __pyx_L4_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 846, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_EXCEPTION_TYPE_HANDLED); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 846, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[6] = {__pyx_t_3, __pyx_t_4, __pyx_t_6, __pyx_v_frame, __pyx_v_arg, __pyx_t_8}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 5+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 846, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 846, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":847 + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch # <<<<<<<<<<<<<< + * is_line = False + * is_return = False + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 847, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_r = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":846 + * self.exc_info = exc_info + * if should_stop: + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): # <<<<<<<<<<<<<< + * return self.trace_dispatch + * is_line = False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":845 + * ) + * self.exc_info = exc_info + * if should_stop: # <<<<<<<<<<<<<< + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":840 + * is_exception_event = True + * breakpoints_for_file = None + * if has_exception_breakpoints: # <<<<<<<<<<<<<< + * should_stop, frame, exc_info = should_stop_on_exception( + * self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":848 + * if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + * return self.trace_dispatch + * is_line = False # <<<<<<<<<<<<<< + * is_return = False + * is_call = False + */ + __pyx_v_is_line = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":849 + * return self.trace_dispatch + * is_line = False + * is_return = False # <<<<<<<<<<<<<< + * is_call = False + * + */ + __pyx_v_is_return = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":850 + * is_line = False + * is_return = False + * is_call = False # <<<<<<<<<<<<<< + * + * else: + */ + __pyx_v_is_call = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":837 + * function_breakpoint_on_call_event = py_db.function_breakpoint_name_to_breakpoint.get(frame.f_code.co_name) + * + * elif event == "exception": # <<<<<<<<<<<<<< + * is_exception_event = True + * breakpoints_for_file = None + */ + goto __pyx_L30; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":854 + * else: + * # Unexpected: just keep the same trace func (i.e.: event == 'c_XXX'). + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * if not is_exception_event: + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 854, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_r = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L3_return; + } + __pyx_L30:; + } + __pyx_L12:; + + /* "_pydevd_bundle/pydevd_cython.pyx":856 + * return self.trace_dispatch + * + * if not is_exception_event: # <<<<<<<<<<<<<< + * breakpoints_for_file = py_db.breakpoints.get(abs_path_canonical_path_and_base[1]) + * + */ + __pyx_t_10 = (!__pyx_v_is_exception_event); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":857 + * + * if not is_exception_event: + * breakpoints_for_file = py_db.breakpoints.get(abs_path_canonical_path_and_base[1]) # <<<<<<<<<<<<<< + * + * can_skip = False + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_breakpoints); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 857, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_get); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 857, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_abs_path_canonical_path_and_base == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 857, __pyx_L4_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v_abs_path_canonical_path_and_base, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 857, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_1}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 857, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + if (!(likely(PyDict_CheckExact(__pyx_t_7))||((__pyx_t_7) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_7))) __PYX_ERR(0, 857, __pyx_L4_error) + __Pyx_XDECREF_SET(__pyx_v_breakpoints_for_file, ((PyObject*)__pyx_t_7)); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":859 + * breakpoints_for_file = py_db.breakpoints.get(abs_path_canonical_path_and_base[1]) + * + * can_skip = False # <<<<<<<<<<<<<< + * + * if info.pydev_state == 1: # 1 = 1 + */ + __pyx_v_can_skip = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":861 + * can_skip = False + * + * if info.pydev_state == 1: # 1 = 1 # <<<<<<<<<<<<<< + * # we can skip if: + * # - we have no stop marked + */ + __pyx_t_10 = (__pyx_v_info->pydev_state == 1); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":866 + * # - we should make a step return/step over and we're not in the current frame + * # - we're stepping into a coroutine context and we're not in that context + * if step_cmd == -1: # <<<<<<<<<<<<<< + * can_skip = True + * + */ + __pyx_t_10 = (__pyx_v_step_cmd == -1L); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":867 + * # - we're stepping into a coroutine context and we're not in that context + * if step_cmd == -1: + * can_skip = True # <<<<<<<<<<<<<< + * + * elif step_cmd in ( + */ + __pyx_v_can_skip = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":866 + * # - we should make a step return/step over and we're not in the current frame + * # - we're stepping into a coroutine context and we're not in that context + * if step_cmd == -1: # <<<<<<<<<<<<<< + * can_skip = True + * + */ + goto __pyx_L46; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":869 + * can_skip = True + * + * elif step_cmd in ( # <<<<<<<<<<<<<< + * 108, + * 109, + */ + switch (__pyx_v_step_cmd) { + case 0x6C: + + /* "_pydevd_bundle/pydevd_cython.pyx":870 + * + * elif step_cmd in ( + * 108, # <<<<<<<<<<<<<< + * 109, + * 159, + */ + case 0x6D: + + /* "_pydevd_bundle/pydevd_cython.pyx":871 + * elif step_cmd in ( + * 108, + * 109, # <<<<<<<<<<<<<< + * 159, + * 160, + */ + case 0x9F: + + /* "_pydevd_bundle/pydevd_cython.pyx":872 + * 108, + * 109, + * 159, # <<<<<<<<<<<<<< + * 160, + * ) and not self._is_same_frame(stop_frame, frame): + */ + case 0xA0: + + /* "_pydevd_bundle/pydevd_cython.pyx":869 + * can_skip = True + * + * elif step_cmd in ( # <<<<<<<<<<<<<< + * 108, + * 109, + */ + __pyx_t_16 = 1; + break; + default: + __pyx_t_16 = 0; + break; + } + __pyx_t_12 = __pyx_t_16; + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L47_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":874 + * 159, + * 160, + * ) and not self._is_same_frame(stop_frame, frame): # <<<<<<<<<<<<<< + * can_skip = True + * + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_v_frame); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 874, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 874, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_16 = (!__pyx_t_12); + __pyx_t_10 = __pyx_t_16; + __pyx_L47_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":869 + * can_skip = True + * + * elif step_cmd in ( # <<<<<<<<<<<<<< + * 108, + * 109, + */ + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":875 + * 160, + * ) and not self._is_same_frame(stop_frame, frame): + * can_skip = True # <<<<<<<<<<<<<< + * + * elif step_cmd == 128 and ( + */ + __pyx_v_can_skip = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":869 + * can_skip = True + * + * elif step_cmd in ( # <<<<<<<<<<<<<< + * 108, + * 109, + */ + goto __pyx_L46; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":877 + * can_skip = True + * + * elif step_cmd == 128 and ( # <<<<<<<<<<<<<< + * stop_frame is not None + * and stop_frame is not frame + */ + __pyx_t_16 = (__pyx_v_step_cmd == 0x80); + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L49_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":878 + * + * elif step_cmd == 128 and ( + * stop_frame is not None # <<<<<<<<<<<<<< + * and stop_frame is not frame + * and stop_frame is not frame.f_back + */ + __pyx_t_16 = (__pyx_v_stop_frame != Py_None); + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L49_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":879 + * elif step_cmd == 128 and ( + * stop_frame is not None + * and stop_frame is not frame # <<<<<<<<<<<<<< + * and stop_frame is not frame.f_back + * and (frame.f_back is None or stop_frame is not frame.f_back.f_back) + */ + __pyx_t_16 = (__pyx_v_stop_frame != __pyx_v_frame); + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L49_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":880 + * stop_frame is not None + * and stop_frame is not frame + * and stop_frame is not frame.f_back # <<<<<<<<<<<<<< + * and (frame.f_back is None or stop_frame is not frame.f_back.f_back) + * ): + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 880, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_16 = (__pyx_v_stop_frame != __pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L49_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":881 + * and stop_frame is not frame + * and stop_frame is not frame.f_back + * and (frame.f_back is None or stop_frame is not frame.f_back.f_back) # <<<<<<<<<<<<<< + * ): + * can_skip = True + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 881, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_16 = (__pyx_t_7 == Py_None); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (!__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L49_bool_binop_done; + } + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 881, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_f_back); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 881, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_16 = (__pyx_v_stop_frame != __pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_10 = __pyx_t_16; + __pyx_L49_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":877 + * can_skip = True + * + * elif step_cmd == 128 and ( # <<<<<<<<<<<<<< + * stop_frame is not None + * and stop_frame is not frame + */ + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":883 + * and (frame.f_back is None or stop_frame is not frame.f_back.f_back) + * ): + * can_skip = True # <<<<<<<<<<<<<< + * + * elif step_cmd == 144: + */ + __pyx_v_can_skip = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":877 + * can_skip = True + * + * elif step_cmd == 128 and ( # <<<<<<<<<<<<<< + * stop_frame is not None + * and stop_frame is not frame + */ + goto __pyx_L46; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":885 + * can_skip = True + * + * elif step_cmd == 144: # <<<<<<<<<<<<<< + * if py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + */ + __pyx_t_10 = (__pyx_v_step_cmd == 0x90); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":886 + * + * elif step_cmd == 144: + * if py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( # <<<<<<<<<<<<<< + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + * ): + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 886, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 886, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 886, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_1, __pyx_v_frame, __pyx_t_6, Py_True}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 886, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 886, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L56_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":887 + * elif step_cmd == 144: + * if py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) # <<<<<<<<<<<<<< + * ): + * can_skip = True + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 887, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_16 = (__pyx_t_8 == Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (!__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L56_bool_binop_done; + } + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 887, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 887, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 887, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_f_code); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 887, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 887, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_t_6, __pyx_t_1, Py_True}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 887, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 887, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_10 = __pyx_t_16; + __pyx_L56_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":886 + * + * elif step_cmd == 144: + * if py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( # <<<<<<<<<<<<<< + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + * ): + */ + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":889 + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + * ): + * can_skip = True # <<<<<<<<<<<<<< + * + * elif step_cmd == 206: + */ + __pyx_v_can_skip = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":886 + * + * elif step_cmd == 144: + * if py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( # <<<<<<<<<<<<<< + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + * ): + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":885 + * can_skip = True + * + * elif step_cmd == 144: # <<<<<<<<<<<<<< + * if py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + */ + goto __pyx_L46; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":891 + * can_skip = True + * + * elif step_cmd == 206: # <<<<<<<<<<<<<< + * f = frame + * while f is not None: + */ + __pyx_t_10 = (__pyx_v_step_cmd == 0xCE); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":892 + * + * elif step_cmd == 206: + * f = frame # <<<<<<<<<<<<<< + * while f is not None: + * if self._is_same_frame(stop_frame, f): + */ + __Pyx_INCREF(__pyx_v_frame); + __Pyx_XDECREF_SET(__pyx_v_f, __pyx_v_frame); + + /* "_pydevd_bundle/pydevd_cython.pyx":893 + * elif step_cmd == 206: + * f = frame + * while f is not None: # <<<<<<<<<<<<<< + * if self._is_same_frame(stop_frame, f): + * break + */ + while (1) { + __pyx_t_10 = (__pyx_v_f != Py_None); + if (!__pyx_t_10) break; + + /* "_pydevd_bundle/pydevd_cython.pyx":894 + * f = frame + * while f is not None: + * if self._is_same_frame(stop_frame, f): # <<<<<<<<<<<<<< + * break + * f = f.f_back + */ + __pyx_t_8 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_v_f); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 894, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 894, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":895 + * while f is not None: + * if self._is_same_frame(stop_frame, f): + * break # <<<<<<<<<<<<<< + * f = f.f_back + * else: + */ + goto __pyx_L60_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":894 + * f = frame + * while f is not None: + * if self._is_same_frame(stop_frame, f): # <<<<<<<<<<<<<< + * break + * f = f.f_back + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":896 + * if self._is_same_frame(stop_frame, f): + * break + * f = f.f_back # <<<<<<<<<<<<<< + * else: + * can_skip = True + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_back); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 896, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF_SET(__pyx_v_f, __pyx_t_8); + __pyx_t_8 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":898 + * f = f.f_back + * else: + * can_skip = True # <<<<<<<<<<<<<< + * + * if can_skip: + */ + /*else*/ { + __pyx_v_can_skip = 1; + } + __pyx_L60_break:; + + /* "_pydevd_bundle/pydevd_cython.pyx":891 + * can_skip = True + * + * elif step_cmd == 206: # <<<<<<<<<<<<<< + * f = frame + * while f is not None: + */ + } + __pyx_L46:; + + /* "_pydevd_bundle/pydevd_cython.pyx":900 + * can_skip = True + * + * if can_skip: # <<<<<<<<<<<<<< + * if plugin_manager is not None and (py_db.has_plugin_line_breaks or py_db.has_plugin_exception_breaks): + * can_skip = plugin_manager.can_skip(py_db, frame) + */ + if (__pyx_v_can_skip) { + + /* "_pydevd_bundle/pydevd_cython.pyx":901 + * + * if can_skip: + * if plugin_manager is not None and (py_db.has_plugin_line_breaks or py_db.has_plugin_exception_breaks): # <<<<<<<<<<<<<< + * can_skip = plugin_manager.can_skip(py_db, frame) + * + */ + __pyx_t_16 = (__pyx_v_plugin_manager != Py_None); + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L64_bool_binop_done; + } + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_has_plugin_line_breaks); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 901, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 901, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (!__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L64_bool_binop_done; + } + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_has_plugin_exception_breaks); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 901, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 901, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_10 = __pyx_t_16; + __pyx_L64_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":902 + * if can_skip: + * if plugin_manager is not None and (py_db.has_plugin_line_breaks or py_db.has_plugin_exception_breaks): + * can_skip = plugin_manager.can_skip(py_db, frame) # <<<<<<<<<<<<<< + * + * if ( + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin_manager, __pyx_n_s_can_skip); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 902, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_1, __pyx_v_py_db, __pyx_v_frame}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 902, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 902, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_can_skip = __pyx_t_10; + + /* "_pydevd_bundle/pydevd_cython.pyx":901 + * + * if can_skip: + * if plugin_manager is not None and (py_db.has_plugin_line_breaks or py_db.has_plugin_exception_breaks): # <<<<<<<<<<<<<< + * can_skip = plugin_manager.can_skip(py_db, frame) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":905 + * + * if ( + * can_skip # <<<<<<<<<<<<<< + * and py_db.show_return_values + * and info.pydev_step_cmd in (108, 159) + */ + if (__pyx_v_can_skip) { + } else { + __pyx_t_10 = __pyx_v_can_skip; + goto __pyx_L68_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":906 + * if ( + * can_skip + * and py_db.show_return_values # <<<<<<<<<<<<<< + * and info.pydev_step_cmd in (108, 159) + * and self._is_same_frame(stop_frame, frame.f_back) + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_show_return_values); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 906, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 906, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L68_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":907 + * can_skip + * and py_db.show_return_values + * and info.pydev_step_cmd in (108, 159) # <<<<<<<<<<<<<< + * and self._is_same_frame(stop_frame, frame.f_back) + * ): + */ + switch (__pyx_v_info->pydev_step_cmd) { + case 0x6C: + case 0x9F: + __pyx_t_16 = 1; + break; + default: + __pyx_t_16 = 0; + break; + } + __pyx_t_12 = __pyx_t_16; + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L68_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":908 + * and py_db.show_return_values + * and info.pydev_step_cmd in (108, 159) + * and self._is_same_frame(stop_frame, frame.f_back) # <<<<<<<<<<<<<< + * ): + * # trace function for showing return values after step over + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 908, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 908, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 908, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_10 = __pyx_t_12; + __pyx_L68_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":904 + * can_skip = plugin_manager.can_skip(py_db, frame) + * + * if ( # <<<<<<<<<<<<<< + * can_skip + * and py_db.show_return_values + */ + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":911 + * ): + * # trace function for showing return values after step over + * can_skip = False # <<<<<<<<<<<<<< + * + * # Let's check to see if we are in a function that has a breakpoint. If we don't have a breakpoint, + */ + __pyx_v_can_skip = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":904 + * can_skip = plugin_manager.can_skip(py_db, frame) + * + * if ( # <<<<<<<<<<<<<< + * can_skip + * and py_db.show_return_values + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":900 + * can_skip = True + * + * if can_skip: # <<<<<<<<<<<<<< + * if plugin_manager is not None and (py_db.has_plugin_line_breaks or py_db.has_plugin_exception_breaks): + * can_skip = plugin_manager.can_skip(py_db, frame) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":861 + * can_skip = False + * + * if info.pydev_state == 1: # 1 = 1 # <<<<<<<<<<<<<< + * # we can skip if: + * # - we have no stop marked + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":918 + * # so, that's why the additional checks are there. + * + * if function_breakpoint_on_call_event: # <<<<<<<<<<<<<< + * pass # Do nothing here (just keep on going as we can't skip it). + * + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_function_breakpoint_on_call_event); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 918, __pyx_L4_error) + if (__pyx_t_10) { + goto __pyx_L72; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":921 + * pass # Do nothing here (just keep on going as we can't skip it). + * + * elif not breakpoints_for_file: # <<<<<<<<<<<<<< + * if can_skip: + * if has_exception_breakpoints: + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_breakpoints_for_file); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 921, __pyx_L4_error) + __pyx_t_12 = (!__pyx_t_10); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":922 + * + * elif not breakpoints_for_file: + * if can_skip: # <<<<<<<<<<<<<< + * if has_exception_breakpoints: + * return self.trace_exception + */ + if (__pyx_v_can_skip) { + + /* "_pydevd_bundle/pydevd_cython.pyx":923 + * elif not breakpoints_for_file: + * if can_skip: + * if has_exception_breakpoints: # <<<<<<<<<<<<<< + * return self.trace_exception + * else: + */ + if (__pyx_v_has_exception_breakpoints) { + + /* "_pydevd_bundle/pydevd_cython.pyx":924 + * if can_skip: + * if has_exception_breakpoints: + * return self.trace_exception # <<<<<<<<<<<<<< + * else: + * return None if is_call else NO_FTRACE + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_exception); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 924, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_r = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":923 + * elif not breakpoints_for_file: + * if can_skip: + * if has_exception_breakpoints: # <<<<<<<<<<<<<< + * return self.trace_exception + * else: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":926 + * return self.trace_exception + * else: + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * else: + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_7 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 926, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __pyx_t_8; + __pyx_t_8 = 0; + } + __pyx_r = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L3_return; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":922 + * + * elif not breakpoints_for_file: + * if can_skip: # <<<<<<<<<<<<<< + * if has_exception_breakpoints: + * return self.trace_exception + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":921 + * pass # Do nothing here (just keep on going as we can't skip it). + * + * elif not breakpoints_for_file: # <<<<<<<<<<<<<< + * if can_skip: + * if has_exception_breakpoints: + */ + goto __pyx_L72; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":930 + * else: + * # When cached, 0 means we don't have a breakpoint and 1 means we have. + * if can_skip: # <<<<<<<<<<<<<< + * breakpoints_in_line_cache = frame_skips_cache.get(line_cache_key, -1) + * if breakpoints_in_line_cache == 0: + */ + /*else*/ { + if (__pyx_v_can_skip) { + + /* "_pydevd_bundle/pydevd_cython.pyx":931 + * # When cached, 0 means we don't have a breakpoint and 1 means we have. + * if can_skip: + * breakpoints_in_line_cache = frame_skips_cache.get(line_cache_key, -1) # <<<<<<<<<<<<<< + * if breakpoints_in_line_cache == 0: + * return self.trace_dispatch + */ + if (unlikely(__pyx_v_frame_skips_cache == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 931, __pyx_L4_error) + } + __pyx_t_7 = __Pyx_PyDict_GetItemDefault(__pyx_v_frame_skips_cache, __pyx_v_line_cache_key, __pyx_int_neg_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 931, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_t_7); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 931, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_breakpoints_in_line_cache = __pyx_t_9; + + /* "_pydevd_bundle/pydevd_cython.pyx":932 + * if can_skip: + * breakpoints_in_line_cache = frame_skips_cache.get(line_cache_key, -1) + * if breakpoints_in_line_cache == 0: # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + __pyx_t_12 = (__pyx_v_breakpoints_in_line_cache == 0); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":933 + * breakpoints_in_line_cache = frame_skips_cache.get(line_cache_key, -1) + * if breakpoints_in_line_cache == 0: + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * breakpoints_in_frame_cache = frame_skips_cache.get(frame_cache_key, -1) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 933, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_r = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":932 + * if can_skip: + * breakpoints_in_line_cache = frame_skips_cache.get(line_cache_key, -1) + * if breakpoints_in_line_cache == 0: # <<<<<<<<<<<<<< + * return self.trace_dispatch + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":930 + * else: + * # When cached, 0 means we don't have a breakpoint and 1 means we have. + * if can_skip: # <<<<<<<<<<<<<< + * breakpoints_in_line_cache = frame_skips_cache.get(line_cache_key, -1) + * if breakpoints_in_line_cache == 0: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":935 + * return self.trace_dispatch + * + * breakpoints_in_frame_cache = frame_skips_cache.get(frame_cache_key, -1) # <<<<<<<<<<<<<< + * if breakpoints_in_frame_cache != -1: + * # Gotten from cache. + */ + if (unlikely(__pyx_v_frame_skips_cache == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 935, __pyx_L4_error) + } + __pyx_t_7 = __Pyx_PyDict_GetItemDefault(__pyx_v_frame_skips_cache, __pyx_v_frame_cache_key, __pyx_int_neg_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 935, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_t_7); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 935, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_breakpoints_in_frame_cache = __pyx_t_9; + + /* "_pydevd_bundle/pydevd_cython.pyx":936 + * + * breakpoints_in_frame_cache = frame_skips_cache.get(frame_cache_key, -1) + * if breakpoints_in_frame_cache != -1: # <<<<<<<<<<<<<< + * # Gotten from cache. + * has_breakpoint_in_frame = breakpoints_in_frame_cache == 1 + */ + __pyx_t_12 = (__pyx_v_breakpoints_in_frame_cache != -1L); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":938 + * if breakpoints_in_frame_cache != -1: + * # Gotten from cache. + * has_breakpoint_in_frame = breakpoints_in_frame_cache == 1 # <<<<<<<<<<<<<< + * + * else: + */ + __pyx_v_has_breakpoint_in_frame = (__pyx_v_breakpoints_in_frame_cache == 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":936 + * + * breakpoints_in_frame_cache = frame_skips_cache.get(frame_cache_key, -1) + * if breakpoints_in_frame_cache != -1: # <<<<<<<<<<<<<< + * # Gotten from cache. + * has_breakpoint_in_frame = breakpoints_in_frame_cache == 1 + */ + goto __pyx_L77; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":941 + * + * else: + * has_breakpoint_in_frame = False # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_has_breakpoint_in_frame = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":943 + * has_breakpoint_in_frame = False + * + * try: # <<<<<<<<<<<<<< + * func_lines = set() + * for offset_and_lineno in dis.findlinestarts(frame.f_code): + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19); + __Pyx_XGOTREF(__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_18); + __Pyx_XGOTREF(__pyx_t_19); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":944 + * + * try: + * func_lines = set() # <<<<<<<<<<<<<< + * for offset_and_lineno in dis.findlinestarts(frame.f_code): + * if offset_and_lineno[1] is not None: + */ + __pyx_t_7 = PySet_New(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 944, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_v_func_lines = ((PyObject*)__pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":945 + * try: + * func_lines = set() + * for offset_and_lineno in dis.findlinestarts(frame.f_code): # <<<<<<<<<<<<<< + * if offset_and_lineno[1] is not None: + * func_lines.add(offset_and_lineno[1]) + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_dis); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 945, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_findlinestarts); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 945, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 945, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_8}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 945, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + if (likely(PyList_CheckExact(__pyx_t_7)) || PyTuple_CheckExact(__pyx_t_7)) { + __pyx_t_1 = __pyx_t_7; __Pyx_INCREF(__pyx_t_1); + __pyx_t_13 = 0; + __pyx_t_14 = NULL; + } else { + __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 945, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_14 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 945, __pyx_L78_error) + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + for (;;) { + if (likely(!__pyx_t_14)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 945, __pyx_L78_error) + #endif + if (__pyx_t_13 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_7); __pyx_t_13++; if (unlikely((0 < 0))) __PYX_ERR(0, 945, __pyx_L78_error) + #else + __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 945, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 945, __pyx_L78_error) + #endif + if (__pyx_t_13 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_7); __pyx_t_13++; if (unlikely((0 < 0))) __PYX_ERR(0, 945, __pyx_L78_error) + #else + __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 945, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } + } else { + __pyx_t_7 = __pyx_t_14(__pyx_t_1); + if (unlikely(!__pyx_t_7)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 945, __pyx_L78_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_7); + } + __Pyx_XDECREF_SET(__pyx_v_offset_and_lineno, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":946 + * func_lines = set() + * for offset_and_lineno in dis.findlinestarts(frame.f_code): + * if offset_and_lineno[1] is not None: # <<<<<<<<<<<<<< + * func_lines.add(offset_and_lineno[1]) + * except: + */ + __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_offset_and_lineno, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 946, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_12 = (__pyx_t_7 != Py_None); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":947 + * for offset_and_lineno in dis.findlinestarts(frame.f_code): + * if offset_and_lineno[1] is not None: + * func_lines.add(offset_and_lineno[1]) # <<<<<<<<<<<<<< + * except: + * # This is a fallback for implementations where we can't get the function + */ + __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_offset_and_lineno, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 947, __pyx_L78_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_20 = PySet_Add(__pyx_v_func_lines, __pyx_t_7); if (unlikely(__pyx_t_20 == ((int)-1))) __PYX_ERR(0, 947, __pyx_L78_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":946 + * func_lines = set() + * for offset_and_lineno in dis.findlinestarts(frame.f_code): + * if offset_and_lineno[1] is not None: # <<<<<<<<<<<<<< + * func_lines.add(offset_and_lineno[1]) + * except: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":945 + * try: + * func_lines = set() + * for offset_and_lineno in dis.findlinestarts(frame.f_code): # <<<<<<<<<<<<<< + * if offset_and_lineno[1] is not None: + * func_lines.add(offset_and_lineno[1]) + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":943 + * has_breakpoint_in_frame = False + * + * try: # <<<<<<<<<<<<<< + * func_lines = set() + * for offset_and_lineno in dis.findlinestarts(frame.f_code): + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":967 + * break + * else: + * for bp_line in breakpoints_for_file: # iterate on keys # <<<<<<<<<<<<<< + * if bp_line in func_lines: + * has_breakpoint_in_frame = True + */ + /*else:*/ { + __pyx_t_13 = 0; + if (unlikely(__pyx_v_breakpoints_for_file == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 967, __pyx_L80_except_error) + } + __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_breakpoints_for_file, 1, ((PyObject *)NULL), (&__pyx_t_21), (&__pyx_t_9)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 967, __pyx_L80_except_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_1); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + while (1) { + __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_21, &__pyx_t_13, &__pyx_t_7, NULL, NULL, __pyx_t_9); + if (unlikely(__pyx_t_11 == 0)) break; + if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 967, __pyx_L80_except_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_11 = __Pyx_PyInt_As_int(__pyx_t_7); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 967, __pyx_L80_except_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_bp_line = __pyx_t_11; + + /* "_pydevd_bundle/pydevd_cython.pyx":968 + * else: + * for bp_line in breakpoints_for_file: # iterate on keys + * if bp_line in func_lines: # <<<<<<<<<<<<<< + * has_breakpoint_in_frame = True + * break + */ + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_bp_line); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 968, __pyx_L80_except_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_12 = (__Pyx_PySet_ContainsTF(__pyx_t_7, __pyx_v_func_lines, Py_EQ)); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 968, __pyx_L80_except_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":969 + * for bp_line in breakpoints_for_file: # iterate on keys + * if bp_line in func_lines: + * has_breakpoint_in_frame = True # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_has_breakpoint_in_frame = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":970 + * if bp_line in func_lines: + * has_breakpoint_in_frame = True + * break # <<<<<<<<<<<<<< + * + * # Cache the value (1 or 0 or -1 for default because of cython). + */ + goto __pyx_L89_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":968 + * else: + * for bp_line in breakpoints_for_file: # iterate on keys + * if bp_line in func_lines: # <<<<<<<<<<<<<< + * has_breakpoint_in_frame = True + * break + */ + } + } + __pyx_L89_break:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; + __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0; + goto __pyx_L83_try_end; + __pyx_L78_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":948 + * if offset_and_lineno[1] is not None: + * func_lines.add(offset_and_lineno[1]) + * except: # <<<<<<<<<<<<<< + * # This is a fallback for implementations where we can't get the function + * # lines -- i.e.: jython (in this case clients need to provide the function + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(0, 948, __pyx_L80_except_error) + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + + /* "_pydevd_bundle/pydevd_cython.pyx":955 + * + * # Checks the breakpoint to see if there is a context match in some function. + * curr_func_name = frame.f_code.co_name # <<<<<<<<<<<<<< + * + * # global context is set with an empty name + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 955, __pyx_L80_except_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_co_name); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 955, __pyx_L80_except_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyString_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_4))) __PYX_ERR(0, 955, __pyx_L80_except_error) + __pyx_v_curr_func_name = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":958 + * + * # global context is set with an empty name + * if curr_func_name in ("?", "", ""): # <<<<<<<<<<<<<< + * curr_func_name = "" + * + */ + __Pyx_INCREF(__pyx_v_curr_func_name); + __pyx_t_22 = __pyx_v_curr_func_name; + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_t_22, __pyx_kp_s__4, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 958, __pyx_L80_except_error) + if (!__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L94_bool_binop_done; + } + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_t_22, __pyx_kp_s_module, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 958, __pyx_L80_except_error) + if (!__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L94_bool_binop_done; + } + __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_t_22, __pyx_kp_s_lambda, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 958, __pyx_L80_except_error) + __pyx_t_12 = __pyx_t_10; + __pyx_L94_bool_binop_done:; + __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; + __pyx_t_10 = __pyx_t_12; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":959 + * # global context is set with an empty name + * if curr_func_name in ("?", "", ""): + * curr_func_name = "" # <<<<<<<<<<<<<< + * + * for bp in breakpoints_for_file.values(): + */ + __Pyx_INCREF(__pyx_kp_s_); + __Pyx_DECREF_SET(__pyx_v_curr_func_name, __pyx_kp_s_); + + /* "_pydevd_bundle/pydevd_cython.pyx":958 + * + * # global context is set with an empty name + * if curr_func_name in ("?", "", ""): # <<<<<<<<<<<<<< + * curr_func_name = "" + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":961 + * curr_func_name = "" + * + * for bp in breakpoints_for_file.values(): # <<<<<<<<<<<<<< + * # will match either global or some function + * if bp.func_name in ("None", curr_func_name): + */ + __pyx_t_21 = 0; + if (unlikely(__pyx_v_breakpoints_for_file == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 961, __pyx_L80_except_error) + } + __pyx_t_6 = __Pyx_dict_iterator(__pyx_v_breakpoints_for_file, 1, __pyx_n_s_values, (&__pyx_t_13), (&__pyx_t_9)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 961, __pyx_L80_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_4); + __pyx_t_4 = __pyx_t_6; + __pyx_t_6 = 0; + while (1) { + __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_4, __pyx_t_13, &__pyx_t_21, NULL, &__pyx_t_6, NULL, __pyx_t_9); + if (unlikely(__pyx_t_11 == 0)) break; + if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 961, __pyx_L80_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_bp, __pyx_t_6); + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":963 + * for bp in breakpoints_for_file.values(): + * # will match either global or some function + * if bp.func_name in ("None", curr_func_name): # <<<<<<<<<<<<<< + * has_breakpoint_in_frame = True + * break + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_bp, __pyx_n_s_func_name); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 963, __pyx_L80_except_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_12 = (__Pyx_PyString_Equals(__pyx_t_6, __pyx_n_s_None, Py_EQ)); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 963, __pyx_L80_except_error) + if (!__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L100_bool_binop_done; + } + __pyx_t_12 = (__Pyx_PyString_Equals(__pyx_t_6, __pyx_v_curr_func_name, Py_EQ)); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 963, __pyx_L80_except_error) + __pyx_t_10 = __pyx_t_12; + __pyx_L100_bool_binop_done:; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_12 = __pyx_t_10; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":964 + * # will match either global or some function + * if bp.func_name in ("None", curr_func_name): + * has_breakpoint_in_frame = True # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_v_has_breakpoint_in_frame = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":965 + * if bp.func_name in ("None", curr_func_name): + * has_breakpoint_in_frame = True + * break # <<<<<<<<<<<<<< + * else: + * for bp_line in breakpoints_for_file: # iterate on keys + */ + goto __pyx_L98_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":963 + * for bp in breakpoints_for_file.values(): + * # will match either global or some function + * if bp.func_name in ("None", curr_func_name): # <<<<<<<<<<<<<< + * has_breakpoint_in_frame = True + * break + */ + } + } + __pyx_L98_break:; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L79_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":943 + * has_breakpoint_in_frame = False + * + * try: # <<<<<<<<<<<<<< + * func_lines = set() + * for offset_and_lineno in dis.findlinestarts(frame.f_code): + */ + __pyx_L80_except_error:; + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19); + goto __pyx_L4_error; + __pyx_L79_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19); + __pyx_L83_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":973 + * + * # Cache the value (1 or 0 or -1 for default because of cython). + * if has_breakpoint_in_frame: # <<<<<<<<<<<<<< + * frame_skips_cache[frame_cache_key] = 1 + * else: + */ + if (__pyx_v_has_breakpoint_in_frame) { + + /* "_pydevd_bundle/pydevd_cython.pyx":974 + * # Cache the value (1 or 0 or -1 for default because of cython). + * if has_breakpoint_in_frame: + * frame_skips_cache[frame_cache_key] = 1 # <<<<<<<<<<<<<< + * else: + * frame_skips_cache[frame_cache_key] = 0 + */ + if (unlikely(__pyx_v_frame_skips_cache == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 974, __pyx_L4_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_frame_skips_cache, __pyx_v_frame_cache_key, __pyx_int_1) < 0))) __PYX_ERR(0, 974, __pyx_L4_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":973 + * + * # Cache the value (1 or 0 or -1 for default because of cython). + * if has_breakpoint_in_frame: # <<<<<<<<<<<<<< + * frame_skips_cache[frame_cache_key] = 1 + * else: + */ + goto __pyx_L102; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":976 + * frame_skips_cache[frame_cache_key] = 1 + * else: + * frame_skips_cache[frame_cache_key] = 0 # <<<<<<<<<<<<<< + * + * if can_skip and not has_breakpoint_in_frame: + */ + /*else*/ { + if (unlikely(__pyx_v_frame_skips_cache == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 976, __pyx_L4_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_frame_skips_cache, __pyx_v_frame_cache_key, __pyx_int_0) < 0))) __PYX_ERR(0, 976, __pyx_L4_error) + } + __pyx_L102:; + } + __pyx_L77:; + + /* "_pydevd_bundle/pydevd_cython.pyx":978 + * frame_skips_cache[frame_cache_key] = 0 + * + * if can_skip and not has_breakpoint_in_frame: # <<<<<<<<<<<<<< + * if has_exception_breakpoints: + * return self.trace_exception + */ + if (__pyx_v_can_skip) { + } else { + __pyx_t_12 = __pyx_v_can_skip; + goto __pyx_L104_bool_binop_done; + } + __pyx_t_10 = (!__pyx_v_has_breakpoint_in_frame); + __pyx_t_12 = __pyx_t_10; + __pyx_L104_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":979 + * + * if can_skip and not has_breakpoint_in_frame: + * if has_exception_breakpoints: # <<<<<<<<<<<<<< + * return self.trace_exception + * else: + */ + if (__pyx_v_has_exception_breakpoints) { + + /* "_pydevd_bundle/pydevd_cython.pyx":980 + * if can_skip and not has_breakpoint_in_frame: + * if has_exception_breakpoints: + * return self.trace_exception # <<<<<<<<<<<<<< + * else: + * return None if is_call else NO_FTRACE + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_exception); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 980, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":979 + * + * if can_skip and not has_breakpoint_in_frame: + * if has_exception_breakpoints: # <<<<<<<<<<<<<< + * return self.trace_exception + * else: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":982 + * return self.trace_exception + * else: + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * # We may have hit a breakpoint or we are already in step mode. Either way, let's check what we should do in this frame + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_8 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 982, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __pyx_t_7; + __pyx_t_7 = 0; + } + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L3_return; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":978 + * frame_skips_cache[frame_cache_key] = 0 + * + * if can_skip and not has_breakpoint_in_frame: # <<<<<<<<<<<<<< + * if has_exception_breakpoints: + * return self.trace_exception + */ + } + } + __pyx_L72:; + + /* "_pydevd_bundle/pydevd_cython.pyx":856 + * return self.trace_dispatch + * + * if not is_exception_event: # <<<<<<<<<<<<<< + * breakpoints_for_file = py_db.breakpoints.get(abs_path_canonical_path_and_base[1]) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":987 + * # if DEBUG: print('NOT skipped: %s %s %s %s' % (frame.f_lineno, frame.f_code.co_name, event, frame.__class__.__name__)) + * + * try: # <<<<<<<<<<<<<< + * stop_on_plugin_breakpoint = False + * # return is not taken into account for breakpoint hit because we'd have a double-hit in this case + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_19, &__pyx_t_18, &__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_19); + __Pyx_XGOTREF(__pyx_t_18); + __Pyx_XGOTREF(__pyx_t_17); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":988 + * + * try: + * stop_on_plugin_breakpoint = False # <<<<<<<<<<<<<< + * # return is not taken into account for breakpoint hit because we'd have a double-hit in this case + * # (one for the line and the other for the return). + */ + __pyx_v_stop_on_plugin_breakpoint = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":992 + * # (one for the line and the other for the return). + * + * stop_info = {} # <<<<<<<<<<<<<< + * breakpoint = None + * stop = False + */ + __pyx_t_8 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 992, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_v_stop_info = ((PyObject*)__pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":993 + * + * stop_info = {} + * breakpoint = None # <<<<<<<<<<<<<< + * stop = False + * stop_reason = 111 + */ + __Pyx_INCREF(Py_None); + __pyx_v_breakpoint = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":994 + * stop_info = {} + * breakpoint = None + * stop = False # <<<<<<<<<<<<<< + * stop_reason = 111 + * bp_type = None + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":995 + * breakpoint = None + * stop = False + * stop_reason = 111 # <<<<<<<<<<<<<< + * bp_type = None + * + */ + __Pyx_INCREF(__pyx_int_111); + __pyx_v_stop_reason = __pyx_int_111; + + /* "_pydevd_bundle/pydevd_cython.pyx":996 + * stop = False + * stop_reason = 111 + * bp_type = None # <<<<<<<<<<<<<< + * + * if function_breakpoint_on_call_event: + */ + __Pyx_INCREF(Py_None); + __pyx_v_bp_type = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":998 + * bp_type = None + * + * if function_breakpoint_on_call_event: # <<<<<<<<<<<<<< + * breakpoint = function_breakpoint_on_call_event + * stop = True + */ + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_function_breakpoint_on_call_event); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 998, __pyx_L107_error) + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":999 + * + * if function_breakpoint_on_call_event: + * breakpoint = function_breakpoint_on_call_event # <<<<<<<<<<<<<< + * stop = True + * new_frame = frame + */ + __Pyx_INCREF(__pyx_v_function_breakpoint_on_call_event); + __Pyx_DECREF_SET(__pyx_v_breakpoint, __pyx_v_function_breakpoint_on_call_event); + + /* "_pydevd_bundle/pydevd_cython.pyx":1000 + * if function_breakpoint_on_call_event: + * breakpoint = function_breakpoint_on_call_event + * stop = True # <<<<<<<<<<<<<< + * new_frame = frame + * stop_reason = CMD_SET_FUNCTION_BREAK + */ + __pyx_v_stop = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1001 + * breakpoint = function_breakpoint_on_call_event + * stop = True + * new_frame = frame # <<<<<<<<<<<<<< + * stop_reason = CMD_SET_FUNCTION_BREAK + * + */ + __Pyx_INCREF(__pyx_v_frame); + __pyx_v_new_frame = __pyx_v_frame; + + /* "_pydevd_bundle/pydevd_cython.pyx":1002 + * stop = True + * new_frame = frame + * stop_reason = CMD_SET_FUNCTION_BREAK # <<<<<<<<<<<<<< + * + * elif is_line and info.pydev_state != 2 and breakpoints_for_file is not None and line in breakpoints_for_file: + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_CMD_SET_FUNCTION_BREAK); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1002, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF_SET(__pyx_v_stop_reason, __pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":998 + * bp_type = None + * + * if function_breakpoint_on_call_event: # <<<<<<<<<<<<<< + * breakpoint = function_breakpoint_on_call_event + * stop = True + */ + goto __pyx_L113; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1004 + * stop_reason = CMD_SET_FUNCTION_BREAK + * + * elif is_line and info.pydev_state != 2 and breakpoints_for_file is not None and line in breakpoints_for_file: # <<<<<<<<<<<<<< + * breakpoint = breakpoints_for_file[line] + * new_frame = frame + */ + if (__pyx_v_is_line) { + } else { + __pyx_t_12 = __pyx_v_is_line; + goto __pyx_L114_bool_binop_done; + } + __pyx_t_10 = (__pyx_v_info->pydev_state != 2); + if (__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L114_bool_binop_done; + } + if (unlikely(!__pyx_v_breakpoints_for_file)) { __Pyx_RaiseUnboundLocalError("breakpoints_for_file"); __PYX_ERR(0, 1004, __pyx_L107_error) } + __pyx_t_10 = (__pyx_v_breakpoints_for_file != ((PyObject*)Py_None)); + if (__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L114_bool_binop_done; + } + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_line); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1004, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + if (unlikely(!__pyx_v_breakpoints_for_file)) { __Pyx_RaiseUnboundLocalError("breakpoints_for_file"); __PYX_ERR(0, 1004, __pyx_L107_error) } + if (unlikely(__pyx_v_breakpoints_for_file == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 1004, __pyx_L107_error) + } + __pyx_t_10 = (__Pyx_PyDict_ContainsTF(__pyx_t_8, __pyx_v_breakpoints_for_file, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1004, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = __pyx_t_10; + __pyx_L114_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1005 + * + * elif is_line and info.pydev_state != 2 and breakpoints_for_file is not None and line in breakpoints_for_file: + * breakpoint = breakpoints_for_file[line] # <<<<<<<<<<<<<< + * new_frame = frame + * stop = True + */ + if (unlikely(!__pyx_v_breakpoints_for_file)) { __Pyx_RaiseUnboundLocalError("breakpoints_for_file"); __PYX_ERR(0, 1005, __pyx_L107_error) } + if (unlikely(__pyx_v_breakpoints_for_file == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1005, __pyx_L107_error) + } + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_line); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1005, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __Pyx_PyDict_GetItem(__pyx_v_breakpoints_for_file, __pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1005, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_breakpoint, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1006 + * elif is_line and info.pydev_state != 2 and breakpoints_for_file is not None and line in breakpoints_for_file: + * breakpoint = breakpoints_for_file[line] + * new_frame = frame # <<<<<<<<<<<<<< + * stop = True + * + */ + __Pyx_INCREF(__pyx_v_frame); + __pyx_v_new_frame = __pyx_v_frame; + + /* "_pydevd_bundle/pydevd_cython.pyx":1007 + * breakpoint = breakpoints_for_file[line] + * new_frame = frame + * stop = True # <<<<<<<<<<<<<< + * + * elif plugin_manager is not None and py_db.has_plugin_line_breaks: + */ + __pyx_v_stop = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1004 + * stop_reason = CMD_SET_FUNCTION_BREAK + * + * elif is_line and info.pydev_state != 2 and breakpoints_for_file is not None and line in breakpoints_for_file: # <<<<<<<<<<<<<< + * breakpoint = breakpoints_for_file[line] + * new_frame = frame + */ + goto __pyx_L113; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1009 + * stop = True + * + * elif plugin_manager is not None and py_db.has_plugin_line_breaks: # <<<<<<<<<<<<<< + * result = plugin_manager.get_breakpoint(py_db, frame, event, self._args[2]) + * if result: + */ + __pyx_t_10 = (__pyx_v_plugin_manager != Py_None); + if (__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L118_bool_binop_done; + } + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_has_plugin_line_breaks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1009, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1009, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_12 = __pyx_t_10; + __pyx_L118_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1010 + * + * elif plugin_manager is not None and py_db.has_plugin_line_breaks: + * result = plugin_manager.get_breakpoint(py_db, frame, event, self._args[2]) # <<<<<<<<<<<<<< + * if result: + * stop_on_plugin_breakpoint = True + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin_manager, __pyx_n_s_get_breakpoint); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1010, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1010, __pyx_L107_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1010, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[5] = {__pyx_t_4, __pyx_v_py_db, __pyx_v_frame, __pyx_v_event, __pyx_t_1}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 4+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1010, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_v_result = __pyx_t_7; + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1011 + * elif plugin_manager is not None and py_db.has_plugin_line_breaks: + * result = plugin_manager.get_breakpoint(py_db, frame, event, self._args[2]) + * if result: # <<<<<<<<<<<<<< + * stop_on_plugin_breakpoint = True + * breakpoint, new_frame, bp_type = result + */ + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_result); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1011, __pyx_L107_error) + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1012 + * result = plugin_manager.get_breakpoint(py_db, frame, event, self._args[2]) + * if result: + * stop_on_plugin_breakpoint = True # <<<<<<<<<<<<<< + * breakpoint, new_frame, bp_type = result + * + */ + __pyx_v_stop_on_plugin_breakpoint = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1013 + * if result: + * stop_on_plugin_breakpoint = True + * breakpoint, new_frame, bp_type = result # <<<<<<<<<<<<<< + * + * if breakpoint: + */ + if ((likely(PyTuple_CheckExact(__pyx_v_result))) || (PyList_CheckExact(__pyx_v_result))) { + PyObject* sequence = __pyx_v_result; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1013, __pyx_L107_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_7 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_1 = PyTuple_GET_ITEM(sequence, 2); + } else { + __pyx_t_7 = PyList_GET_ITEM(sequence, 0); + __pyx_t_8 = PyList_GET_ITEM(sequence, 1); + __pyx_t_1 = PyList_GET_ITEM(sequence, 2); + } + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(__pyx_t_1); + #else + __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1013, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1013, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1013, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + Py_ssize_t index = -1; + __pyx_t_4 = PyObject_GetIter(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1013, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_4); + index = 0; __pyx_t_7 = __pyx_t_15(__pyx_t_4); if (unlikely(!__pyx_t_7)) goto __pyx_L121_unpacking_failed; + __Pyx_GOTREF(__pyx_t_7); + index = 1; __pyx_t_8 = __pyx_t_15(__pyx_t_4); if (unlikely(!__pyx_t_8)) goto __pyx_L121_unpacking_failed; + __Pyx_GOTREF(__pyx_t_8); + index = 2; __pyx_t_1 = __pyx_t_15(__pyx_t_4); if (unlikely(!__pyx_t_1)) goto __pyx_L121_unpacking_failed; + __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_4), 3) < 0) __PYX_ERR(0, 1013, __pyx_L107_error) + __pyx_t_15 = NULL; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L122_unpacking_done; + __pyx_L121_unpacking_failed:; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_15 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 1013, __pyx_L107_error) + __pyx_L122_unpacking_done:; + } + __Pyx_DECREF_SET(__pyx_v_breakpoint, __pyx_t_7); + __pyx_t_7 = 0; + __pyx_v_new_frame = __pyx_t_8; + __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_bp_type, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1011 + * elif plugin_manager is not None and py_db.has_plugin_line_breaks: + * result = plugin_manager.get_breakpoint(py_db, frame, event, self._args[2]) + * if result: # <<<<<<<<<<<<<< + * stop_on_plugin_breakpoint = True + * breakpoint, new_frame, bp_type = result + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1009 + * stop = True + * + * elif plugin_manager is not None and py_db.has_plugin_line_breaks: # <<<<<<<<<<<<<< + * result = plugin_manager.get_breakpoint(py_db, frame, event, self._args[2]) + * if result: + */ + } + __pyx_L113:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1015 + * breakpoint, new_frame, bp_type = result + * + * if breakpoint: # <<<<<<<<<<<<<< + * # ok, hit breakpoint, now, we have to discover if it is a conditional breakpoint + * # lets do the conditional stuff here + */ + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_breakpoint); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1015, __pyx_L107_error) + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1018 + * # ok, hit breakpoint, now, we have to discover if it is a conditional breakpoint + * # lets do the conditional stuff here + * if breakpoint.expression is not None: # <<<<<<<<<<<<<< + * py_db.handle_breakpoint_expression(breakpoint, info, new_frame) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_breakpoint, __pyx_n_s_expression); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1018, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_12 = (__pyx_t_1 != Py_None); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1019 + * # lets do the conditional stuff here + * if breakpoint.expression is not None: + * py_db.handle_breakpoint_expression(breakpoint, info, new_frame) # <<<<<<<<<<<<<< + * + * if stop or stop_on_plugin_breakpoint: + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_handle_breakpoint_expression); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1019, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + if (unlikely(!__pyx_v_new_frame)) { __Pyx_RaiseUnboundLocalError("new_frame"); __PYX_ERR(0, 1019, __pyx_L107_error) } + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_v_breakpoint, ((PyObject *)__pyx_v_info), __pyx_v_new_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1019, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1018 + * # ok, hit breakpoint, now, we have to discover if it is a conditional breakpoint + * # lets do the conditional stuff here + * if breakpoint.expression is not None: # <<<<<<<<<<<<<< + * py_db.handle_breakpoint_expression(breakpoint, info, new_frame) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1021 + * py_db.handle_breakpoint_expression(breakpoint, info, new_frame) + * + * if stop or stop_on_plugin_breakpoint: # <<<<<<<<<<<<<< + * eval_result = False + * if breakpoint.has_condition: + */ + if (!__pyx_v_stop) { + } else { + __pyx_t_12 = __pyx_v_stop; + goto __pyx_L126_bool_binop_done; + } + __pyx_t_12 = __pyx_v_stop_on_plugin_breakpoint; + __pyx_L126_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1022 + * + * if stop or stop_on_plugin_breakpoint: + * eval_result = False # <<<<<<<<<<<<<< + * if breakpoint.has_condition: + * eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) + */ + __Pyx_INCREF(Py_False); + __pyx_v_eval_result = Py_False; + + /* "_pydevd_bundle/pydevd_cython.pyx":1023 + * if stop or stop_on_plugin_breakpoint: + * eval_result = False + * if breakpoint.has_condition: # <<<<<<<<<<<<<< + * eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) + * if not eval_result: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_breakpoint, __pyx_n_s_has_condition); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1023, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1023, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1024 + * eval_result = False + * if breakpoint.has_condition: + * eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) # <<<<<<<<<<<<<< + * if not eval_result: + * stop = False + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_handle_breakpoint_condition); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1024, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + if (unlikely(!__pyx_v_new_frame)) { __Pyx_RaiseUnboundLocalError("new_frame"); __PYX_ERR(0, 1024, __pyx_L107_error) } + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_7, ((PyObject *)__pyx_v_info), __pyx_v_breakpoint, __pyx_v_new_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1024, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF_SET(__pyx_v_eval_result, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1025 + * if breakpoint.has_condition: + * eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) + * if not eval_result: # <<<<<<<<<<<<<< + * stop = False + * stop_on_plugin_breakpoint = False + */ + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_eval_result); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1025, __pyx_L107_error) + __pyx_t_10 = (!__pyx_t_12); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1026 + * eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) + * if not eval_result: + * stop = False # <<<<<<<<<<<<<< + * stop_on_plugin_breakpoint = False + * + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1027 + * if not eval_result: + * stop = False + * stop_on_plugin_breakpoint = False # <<<<<<<<<<<<<< + * + * if is_call and ( + */ + __pyx_v_stop_on_plugin_breakpoint = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1025 + * if breakpoint.has_condition: + * eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) + * if not eval_result: # <<<<<<<<<<<<<< + * stop = False + * stop_on_plugin_breakpoint = False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1023 + * if stop or stop_on_plugin_breakpoint: + * eval_result = False + * if breakpoint.has_condition: # <<<<<<<<<<<<<< + * eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) + * if not eval_result: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1021 + * py_db.handle_breakpoint_expression(breakpoint, info, new_frame) + * + * if stop or stop_on_plugin_breakpoint: # <<<<<<<<<<<<<< + * eval_result = False + * if breakpoint.has_condition: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1029 + * stop_on_plugin_breakpoint = False + * + * if is_call and ( # <<<<<<<<<<<<<< + * frame.f_code.co_name in ("", "") or (line == 1 and frame.f_code.co_name.startswith("", "") or (line == 1 and frame.f_code.co_name.startswith("", "") or (line == 1 and frame.f_code.co_name.startswith(". + * + * return self.trace_dispatch # <<<<<<<<<<<<<< + * + * # Handle logpoint (on a logpoint we should never stop). + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1043, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L111_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1029 + * stop_on_plugin_breakpoint = False + * + * if is_call and ( # <<<<<<<<<<<<<< + * frame.f_code.co_name in ("", "") or (line == 1 and frame.f_code.co_name.startswith(" 0: + */ + __pyx_v_stop_on_plugin_breakpoint = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1050 + * stop_on_plugin_breakpoint = False + * + * if info.pydev_message is not None and len(info.pydev_message) > 0: # <<<<<<<<<<<<<< + * cmd = py_db.cmd_factory.make_io_message(info.pydev_message + os.linesep, "1") + * py_db.writer.add_command(cmd) + */ + __pyx_t_16 = (__pyx_v_info->pydev_message != ((PyObject*)Py_None)); + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L142_bool_binop_done; + } + __pyx_t_8 = __pyx_v_info->pydev_message; + __Pyx_INCREF(__pyx_t_8); + __pyx_t_13 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_13 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1050, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_16 = (__pyx_t_13 > 0); + __pyx_t_10 = __pyx_t_16; + __pyx_L142_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1051 + * + * if info.pydev_message is not None and len(info.pydev_message) > 0: + * cmd = py_db.cmd_factory.make_io_message(info.pydev_message + os.linesep, "1") # <<<<<<<<<<<<<< + * py_db.writer.add_command(cmd) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_cmd_factory); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1051, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_make_io_message); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1051, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_os); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1051, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_linesep); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1051, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyNumber_Add(__pyx_v_info->pydev_message, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1051, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_1, __pyx_kp_s_1}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1051, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_v_cmd = __pyx_t_8; + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1052 + * if info.pydev_message is not None and len(info.pydev_message) > 0: + * cmd = py_db.cmd_factory.make_io_message(info.pydev_message + os.linesep, "1") + * py_db.writer.add_command(cmd) # <<<<<<<<<<<<<< + * + * if py_db.show_return_values: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_writer); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1052, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_add_command); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1052, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_v_cmd}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1052, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1050 + * stop_on_plugin_breakpoint = False + * + * if info.pydev_message is not None and len(info.pydev_message) > 0: # <<<<<<<<<<<<<< + * cmd = py_db.cmd_factory.make_io_message(info.pydev_message + os.linesep, "1") + * py_db.writer.add_command(cmd) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1046 + * + * # Handle logpoint (on a logpoint we should never stop). + * if (stop or stop_on_plugin_breakpoint) and breakpoint.is_logpoint: # <<<<<<<<<<<<<< + * stop = False + * stop_on_plugin_breakpoint = False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1015 + * breakpoint, new_frame, bp_type = result + * + * if breakpoint: # <<<<<<<<<<<<<< + * # ok, hit breakpoint, now, we have to discover if it is a conditional breakpoint + * # lets do the conditional stuff here + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1054 + * py_db.writer.add_command(cmd) + * + * if py_db.show_return_values: # <<<<<<<<<<<<<< + * if is_return and ( + * ( + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_show_return_values); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1054, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1054, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1055 + * + * if py_db.show_return_values: + * if is_return and ( # <<<<<<<<<<<<<< + * ( + * info.pydev_step_cmd in (108, 159, 128) + */ + if (__pyx_v_is_return) { + } else { + __pyx_t_10 = __pyx_v_is_return; + goto __pyx_L146_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1057 + * if is_return and ( + * ( + * info.pydev_step_cmd in (108, 159, 128) # <<<<<<<<<<<<<< + * and (self._is_same_frame(stop_frame, frame.f_back)) + * ) + */ + switch (__pyx_v_info->pydev_step_cmd) { + case 0x6C: + case 0x9F: + case 0x80: + __pyx_t_16 = 1; + break; + default: + __pyx_t_16 = 0; + break; + } + __pyx_t_12 = __pyx_t_16; + if (!__pyx_t_12) { + goto __pyx_L148_next_or; + } else { + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1058 + * ( + * info.pydev_step_cmd in (108, 159, 128) + * and (self._is_same_frame(stop_frame, frame.f_back)) # <<<<<<<<<<<<<< + * ) + * or (info.pydev_step_cmd in (109, 160) and (self._is_same_frame(stop_frame, frame))) + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1058, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1058, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1058, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L146_bool_binop_done; + } + __pyx_L148_next_or:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1060 + * and (self._is_same_frame(stop_frame, frame.f_back)) + * ) + * or (info.pydev_step_cmd in (109, 160) and (self._is_same_frame(stop_frame, frame))) # <<<<<<<<<<<<<< + * or (info.pydev_step_cmd in (107, 206)) + * or ( + */ + switch (__pyx_v_info->pydev_step_cmd) { + case 0x6D: + case 0xA0: + __pyx_t_12 = 1; + break; + default: + __pyx_t_12 = 0; + break; + } + __pyx_t_16 = __pyx_t_12; + if (!__pyx_t_16) { + goto __pyx_L150_next_or; + } else { + } + __pyx_t_1 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_v_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1060, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1060, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L146_bool_binop_done; + } + __pyx_L150_next_or:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1061 + * ) + * or (info.pydev_step_cmd in (109, 160) and (self._is_same_frame(stop_frame, frame))) + * or (info.pydev_step_cmd in (107, 206)) # <<<<<<<<<<<<<< + * or ( + * info.pydev_step_cmd == 144 + */ + switch (__pyx_v_info->pydev_step_cmd) { + case 0x6B: + case 0xCE: + __pyx_t_16 = 1; + break; + default: + __pyx_t_16 = 0; + break; + } + __pyx_t_12 = __pyx_t_16; + if (!__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L146_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1063 + * or (info.pydev_step_cmd in (107, 206)) + * or ( + * info.pydev_step_cmd == 144 # <<<<<<<<<<<<<< + * and frame.f_back is not None + * and not py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + */ + __pyx_t_12 = (__pyx_v_info->pydev_step_cmd == 0x90); + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L146_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1064 + * or ( + * info.pydev_step_cmd == 144 + * and frame.f_back is not None # <<<<<<<<<<<<<< + * and not py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + * ) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1064, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_12 = (__pyx_t_1 != Py_None); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L146_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1065 + * info.pydev_step_cmd == 144 + * and frame.f_back is not None + * and not py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) # <<<<<<<<<<<<<< + * ) + * ): + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1065, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1065, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1065, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_f_code); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1065, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1065, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_6, __pyx_t_7, __pyx_t_4, Py_True}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1065, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1065, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_16 = (!__pyx_t_12); + __pyx_t_10 = __pyx_t_16; + __pyx_L146_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1055 + * + * if py_db.show_return_values: + * if is_return and ( # <<<<<<<<<<<<<< + * ( + * info.pydev_step_cmd in (108, 159, 128) + */ + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1068 + * ) + * ): + * self._show_return_values(frame, arg) # <<<<<<<<<<<<<< + * + * elif py_db.remove_return_values_flag: + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_show_return_values(__pyx_v_self, __pyx_v_frame, __pyx_v_arg); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1068, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1055 + * + * if py_db.show_return_values: + * if is_return and ( # <<<<<<<<<<<<<< + * ( + * info.pydev_step_cmd in (108, 159, 128) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1054 + * py_db.writer.add_command(cmd) + * + * if py_db.show_return_values: # <<<<<<<<<<<<<< + * if is_return and ( + * ( + */ + goto __pyx_L144; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1070 + * self._show_return_values(frame, arg) + * + * elif py_db.remove_return_values_flag: # <<<<<<<<<<<<<< + * try: + * self._remove_return_values(py_db, frame) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_remove_return_values_flag); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1070, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1070, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1071 + * + * elif py_db.remove_return_values_flag: + * try: # <<<<<<<<<<<<<< + * self._remove_return_values(py_db, frame) + * finally: + */ + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1072 + * elif py_db.remove_return_values_flag: + * try: + * self._remove_return_values(py_db, frame) # <<<<<<<<<<<<<< + * finally: + * py_db.remove_return_values_flag = False + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_remove_return_values(__pyx_v_self, __pyx_v_py_db, __pyx_v_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1072, __pyx_L156_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1074 + * self._remove_return_values(py_db, frame) + * finally: + * py_db.remove_return_values_flag = False # <<<<<<<<<<<<<< + * + * if stop: + */ + /*finally:*/ { + /*normal exit:*/{ + if (__Pyx_PyObject_SetAttrStr(__pyx_v_py_db, __pyx_n_s_remove_return_values_flag, Py_False) < 0) __PYX_ERR(0, 1074, __pyx_L107_error) + goto __pyx_L157; + } + __pyx_L156_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_24 = 0; __pyx_t_25 = 0; __pyx_t_26 = 0; __pyx_t_27 = 0; __pyx_t_28 = 0; __pyx_t_29 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_22); __pyx_t_22 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_27, &__pyx_t_28, &__pyx_t_29); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_24, &__pyx_t_25, &__pyx_t_26) < 0)) __Pyx_ErrFetch(&__pyx_t_24, &__pyx_t_25, &__pyx_t_26); + __Pyx_XGOTREF(__pyx_t_24); + __Pyx_XGOTREF(__pyx_t_25); + __Pyx_XGOTREF(__pyx_t_26); + __Pyx_XGOTREF(__pyx_t_27); + __Pyx_XGOTREF(__pyx_t_28); + __Pyx_XGOTREF(__pyx_t_29); + __pyx_t_9 = __pyx_lineno; __pyx_t_11 = __pyx_clineno; __pyx_t_23 = __pyx_filename; + { + if (__Pyx_PyObject_SetAttrStr(__pyx_v_py_db, __pyx_n_s_remove_return_values_flag, Py_False) < 0) __PYX_ERR(0, 1074, __pyx_L159_error) + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_27); + __Pyx_XGIVEREF(__pyx_t_28); + __Pyx_XGIVEREF(__pyx_t_29); + __Pyx_ExceptionReset(__pyx_t_27, __pyx_t_28, __pyx_t_29); + } + __Pyx_XGIVEREF(__pyx_t_24); + __Pyx_XGIVEREF(__pyx_t_25); + __Pyx_XGIVEREF(__pyx_t_26); + __Pyx_ErrRestore(__pyx_t_24, __pyx_t_25, __pyx_t_26); + __pyx_t_24 = 0; __pyx_t_25 = 0; __pyx_t_26 = 0; __pyx_t_27 = 0; __pyx_t_28 = 0; __pyx_t_29 = 0; + __pyx_lineno = __pyx_t_9; __pyx_clineno = __pyx_t_11; __pyx_filename = __pyx_t_23; + goto __pyx_L107_error; + __pyx_L159_error:; + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_27); + __Pyx_XGIVEREF(__pyx_t_28); + __Pyx_XGIVEREF(__pyx_t_29); + __Pyx_ExceptionReset(__pyx_t_27, __pyx_t_28, __pyx_t_29); + } + __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0; + __Pyx_XDECREF(__pyx_t_25); __pyx_t_25 = 0; + __Pyx_XDECREF(__pyx_t_26); __pyx_t_26 = 0; + __pyx_t_27 = 0; __pyx_t_28 = 0; __pyx_t_29 = 0; + goto __pyx_L107_error; + } + __pyx_L157:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1070 + * self._show_return_values(frame, arg) + * + * elif py_db.remove_return_values_flag: # <<<<<<<<<<<<<< + * try: + * self._remove_return_values(py_db, frame) + */ + } + __pyx_L144:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1076 + * py_db.remove_return_values_flag = False + * + * if stop: # <<<<<<<<<<<<<< + * self.set_suspend( + * thread, + */ + if (__pyx_v_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1077 + * + * if stop: + * self.set_suspend( # <<<<<<<<<<<<<< + * thread, + * stop_reason, + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_suspend); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1077, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1079 + * self.set_suspend( + * thread, + * stop_reason, # <<<<<<<<<<<<<< + * suspend_other_threads=breakpoint and breakpoint.suspend_policy == "ALL", + * ) + */ + __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1077, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_thread); + __Pyx_GIVEREF(__pyx_v_thread); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_thread)) __PYX_ERR(0, 1077, __pyx_L107_error); + __Pyx_INCREF(__pyx_v_stop_reason); + __Pyx_GIVEREF(__pyx_v_stop_reason); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_stop_reason)) __PYX_ERR(0, 1077, __pyx_L107_error); + + /* "_pydevd_bundle/pydevd_cython.pyx":1080 + * thread, + * stop_reason, + * suspend_other_threads=breakpoint and breakpoint.suspend_policy == "ALL", # <<<<<<<<<<<<<< + * ) + * + */ + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1080, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_breakpoint); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1080, __pyx_L107_error) + if (__pyx_t_10) { + } else { + __Pyx_INCREF(__pyx_v_breakpoint); + __pyx_t_7 = __pyx_v_breakpoint; + goto __pyx_L161_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_breakpoint, __pyx_n_s_suspend_policy); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1080, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_3 = PyObject_RichCompare(__pyx_t_6, __pyx_n_s_ALL, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1080, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_t_3); + __pyx_t_7 = __pyx_t_3; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_L161_bool_binop_done:; + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_suspend_other_threads, __pyx_t_7) < 0) __PYX_ERR(0, 1080, __pyx_L107_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1077 + * + * if stop: + * self.set_suspend( # <<<<<<<<<<<<<< + * thread, + * stop_reason, + */ + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_8, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1077, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1076 + * py_db.remove_return_values_flag = False + * + * if stop: # <<<<<<<<<<<<<< + * self.set_suspend( + * thread, + */ + goto __pyx_L160; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1083 + * ) + * + * elif stop_on_plugin_breakpoint and plugin_manager is not None: # <<<<<<<<<<<<<< + * result = plugin_manager.suspend(py_db, thread, frame, bp_type) + * if result: + */ + if (__pyx_v_stop_on_plugin_breakpoint) { + } else { + __pyx_t_10 = __pyx_v_stop_on_plugin_breakpoint; + goto __pyx_L163_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_plugin_manager != Py_None); + __pyx_t_10 = __pyx_t_16; + __pyx_L163_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1084 + * + * elif stop_on_plugin_breakpoint and plugin_manager is not None: + * result = plugin_manager.suspend(py_db, thread, frame, bp_type) # <<<<<<<<<<<<<< + * if result: + * frame = result + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin_manager, __pyx_n_s_suspend); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1084, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[5] = {__pyx_t_8, __pyx_v_py_db, __pyx_v_thread, __pyx_v_frame, __pyx_v_bp_type}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 4+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1084, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_result, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1085 + * elif stop_on_plugin_breakpoint and plugin_manager is not None: + * result = plugin_manager.suspend(py_db, thread, frame, bp_type) + * if result: # <<<<<<<<<<<<<< + * frame = result + * + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_result); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1085, __pyx_L107_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1086 + * result = plugin_manager.suspend(py_db, thread, frame, bp_type) + * if result: + * frame = result # <<<<<<<<<<<<<< + * + * # if thread has a suspend flag, we suspend with a busy wait + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_DECREF_SET(__pyx_v_frame, __pyx_v_result); + + /* "_pydevd_bundle/pydevd_cython.pyx":1085 + * elif stop_on_plugin_breakpoint and plugin_manager is not None: + * result = plugin_manager.suspend(py_db, thread, frame, bp_type) + * if result: # <<<<<<<<<<<<<< + * frame = result + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1083 + * ) + * + * elif stop_on_plugin_breakpoint and plugin_manager is not None: # <<<<<<<<<<<<<< + * result = plugin_manager.suspend(py_db, thread, frame, bp_type) + * if result: + */ + } + __pyx_L160:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1089 + * + * # if thread has a suspend flag, we suspend with a busy wait + * if info.pydev_state == 2: # <<<<<<<<<<<<<< + * self.do_wait_suspend(thread, frame, event, arg) + * return self.trace_dispatch + */ + __pyx_t_10 = (__pyx_v_info->pydev_state == 2); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1090 + * # if thread has a suspend flag, we suspend with a busy wait + * if info.pydev_state == 2: + * self.do_wait_suspend(thread, frame, event, arg) # <<<<<<<<<<<<<< + * return self.trace_dispatch + * else: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_do_wait_suspend); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1090, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[5] = {__pyx_t_8, __pyx_v_thread, __pyx_v_frame, __pyx_v_event, __pyx_v_arg}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 4+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1090, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1091 + * if info.pydev_state == 2: + * self.do_wait_suspend(thread, frame, event, arg) + * return self.trace_dispatch # <<<<<<<<<<<<<< + * else: + * if not breakpoint and is_line: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1091, __pyx_L107_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_r = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L111_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1089 + * + * # if thread has a suspend flag, we suspend with a busy wait + * if info.pydev_state == 2: # <<<<<<<<<<<<<< + * self.do_wait_suspend(thread, frame, event, arg) + * return self.trace_dispatch + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1093 + * return self.trace_dispatch + * else: + * if not breakpoint and is_line: # <<<<<<<<<<<<<< + * # No stop from anyone and no breakpoint found in line (cache that). + * frame_skips_cache[line_cache_key] = 0 + */ + /*else*/ { + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_v_breakpoint); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1093, __pyx_L107_error) + __pyx_t_12 = (!__pyx_t_16); + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L168_bool_binop_done; + } + __pyx_t_10 = __pyx_v_is_line; + __pyx_L168_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1095 + * if not breakpoint and is_line: + * # No stop from anyone and no breakpoint found in line (cache that). + * frame_skips_cache[line_cache_key] = 0 # <<<<<<<<<<<<<< + * + * except: + */ + if (unlikely(__pyx_v_frame_skips_cache == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1095, __pyx_L107_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_frame_skips_cache, __pyx_v_line_cache_key, __pyx_int_0) < 0))) __PYX_ERR(0, 1095, __pyx_L107_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1093 + * return self.trace_dispatch + * else: + * if not breakpoint and is_line: # <<<<<<<<<<<<<< + * # No stop from anyone and no breakpoint found in line (cache that). + * frame_skips_cache[line_cache_key] = 0 + */ + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":987 + * # if DEBUG: print('NOT skipped: %s %s %s %s' % (frame.f_lineno, frame.f_code.co_name, event, frame.__class__.__name__)) + * + * try: # <<<<<<<<<<<<<< + * stop_on_plugin_breakpoint = False + * # return is not taken into account for breakpoint hit because we'd have a double-hit in this case + */ + } + __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0; + __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + goto __pyx_L112_try_end; + __pyx_L107_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_22); __pyx_t_22 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1097 + * frame_skips_cache[line_cache_key] = 0 + * + * except: # <<<<<<<<<<<<<< + * # Unfortunately Python itself stops the tracing when it originates from + * # the tracing function, so, we can't do much about it (just let the user know). + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_4, &__pyx_t_8) < 0) __PYX_ERR(0, 1097, __pyx_L109_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_8); + + /* "_pydevd_bundle/pydevd_cython.pyx":1100 + * # Unfortunately Python itself stops the tracing when it originates from + * # the tracing function, so, we can't do much about it (just let the user know). + * exc = sys.exc_info()[0] # <<<<<<<<<<<<<< + * cmd = py_db.cmd_factory.make_console_message( + * "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_sys); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1100, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_exc_info); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1100, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1100, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1100, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_exc = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1101 + * # the tracing function, so, we can't do much about it (just let the user know). + * exc = sys.exc_info()[0] + * cmd = py_db.cmd_factory.make_console_message( # <<<<<<<<<<<<<< + * "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + * % ( + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_cmd_factory); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1101, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_make_console_message); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1101, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1104 + * "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + * % ( + * exc, # <<<<<<<<<<<<<< + * thread, + * ) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1104, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_exc); + __Pyx_GIVEREF(__pyx_v_exc); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_exc)) __PYX_ERR(0, 1104, __pyx_L109_except_error); + __Pyx_INCREF(__pyx_v_thread); + __Pyx_GIVEREF(__pyx_v_thread); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_thread)) __PYX_ERR(0, 1104, __pyx_L109_except_error); + + /* "_pydevd_bundle/pydevd_cython.pyx":1103 + * cmd = py_db.cmd_factory.make_console_message( + * "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + * % ( # <<<<<<<<<<<<<< + * exc, + * thread, + */ + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_s_raised_from_within_the_callba, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1103, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_2}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1101, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_cmd, __pyx_t_6); + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1108 + * ) + * ) + * py_db.writer.add_command(cmd) # <<<<<<<<<<<<<< + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + * pydev_log.exception() + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_writer); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1108, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_add_command); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1108, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_cmd}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1108, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1109 + * ) + * py_db.writer.add_command(cmd) + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): # <<<<<<<<<<<<<< + * pydev_log.exception() + * + */ + __pyx_t_10 = PyObject_IsSubclass(__pyx_v_exc, __pyx_tuple__5); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 1109, __pyx_L109_except_error) + __pyx_t_12 = (!__pyx_t_10); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1110 + * py_db.writer.add_command(cmd) + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + * pydev_log.exception() # <<<<<<<<<<<<<< + * + * raise + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1110, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_exception); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1110, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1110, __pyx_L109_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1109 + * ) + * py_db.writer.add_command(cmd) + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): # <<<<<<<<<<<<<< + * pydev_log.exception() + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1112 + * pydev_log.exception() + * + * raise # <<<<<<<<<<<<<< + * + * # step handling. We stop when we hit the right frame + */ + __Pyx_GIVEREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ErrRestoreWithState(__pyx_t_7, __pyx_t_4, __pyx_t_8); + __pyx_t_7 = 0; __pyx_t_4 = 0; __pyx_t_8 = 0; + __PYX_ERR(0, 1112, __pyx_L109_except_error) + } + + /* "_pydevd_bundle/pydevd_cython.pyx":987 + * # if DEBUG: print('NOT skipped: %s %s %s %s' % (frame.f_lineno, frame.f_code.co_name, event, frame.__class__.__name__)) + * + * try: # <<<<<<<<<<<<<< + * stop_on_plugin_breakpoint = False + * # return is not taken into account for breakpoint hit because we'd have a double-hit in this case + */ + __pyx_L109_except_error:; + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_19, __pyx_t_18, __pyx_t_17); + goto __pyx_L4_error; + __pyx_L111_try_return:; + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_19, __pyx_t_18, __pyx_t_17); + goto __pyx_L3_return; + __pyx_L112_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1115 + * + * # step handling. We stop when we hit the right frame + * try: # <<<<<<<<<<<<<< + * should_skip = 0 + * if pydevd_dont_trace.should_trace_hook is not None: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19); + __Pyx_XGOTREF(__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_18); + __Pyx_XGOTREF(__pyx_t_19); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1116 + * # step handling. We stop when we hit the right frame + * try: + * should_skip = 0 # <<<<<<<<<<<<<< + * if pydevd_dont_trace.should_trace_hook is not None: + * if self.should_skip == -1: + */ + __pyx_v_should_skip = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1117 + * try: + * should_skip = 0 + * if pydevd_dont_trace.should_trace_hook is not None: # <<<<<<<<<<<<<< + * if self.should_skip == -1: + * # I.e.: cache the result on self.should_skip (no need to evaluate the same frame multiple times). + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_pydevd_dont_trace); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1117, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_should_trace_hook); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1117, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = (__pyx_t_4 != Py_None); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1118 + * should_skip = 0 + * if pydevd_dont_trace.should_trace_hook is not None: + * if self.should_skip == -1: # <<<<<<<<<<<<<< + * # I.e.: cache the result on self.should_skip (no need to evaluate the same frame multiple times). + * # Note that on a code reload, we won't re-evaluate this because in practice, the frame.f_code + */ + __pyx_t_12 = (__pyx_v_self->should_skip == -1L); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1122 + * # Note that on a code reload, we won't re-evaluate this because in practice, the frame.f_code + * # Which will be handled by this frame is read-only, so, we can cache it safely. + * if not pydevd_dont_trace.should_trace_hook(frame.f_code, abs_path_canonical_path_and_base[0]): # <<<<<<<<<<<<<< + * # -1, 0, 1 to be Cython-friendly + * should_skip = self.should_skip = 1 + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_pydevd_dont_trace); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1122, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_should_trace_hook); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1122, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1122, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + if (unlikely(__pyx_v_abs_path_canonical_path_and_base == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1122, __pyx_L173_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v_abs_path_canonical_path_and_base, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1122, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_8, __pyx_t_6}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1122, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1122, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_10 = (!__pyx_t_12); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1124 + * if not pydevd_dont_trace.should_trace_hook(frame.f_code, abs_path_canonical_path_and_base[0]): + * # -1, 0, 1 to be Cython-friendly + * should_skip = self.should_skip = 1 # <<<<<<<<<<<<<< + * else: + * should_skip = self.should_skip = 0 + */ + __pyx_v_should_skip = 1; + __pyx_v_self->should_skip = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1122 + * # Note that on a code reload, we won't re-evaluate this because in practice, the frame.f_code + * # Which will be handled by this frame is read-only, so, we can cache it safely. + * if not pydevd_dont_trace.should_trace_hook(frame.f_code, abs_path_canonical_path_and_base[0]): # <<<<<<<<<<<<<< + * # -1, 0, 1 to be Cython-friendly + * should_skip = self.should_skip = 1 + */ + goto __pyx_L181; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1126 + * should_skip = self.should_skip = 1 + * else: + * should_skip = self.should_skip = 0 # <<<<<<<<<<<<<< + * else: + * should_skip = self.should_skip + */ + /*else*/ { + __pyx_v_should_skip = 0; + __pyx_v_self->should_skip = 0; + } + __pyx_L181:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1118 + * should_skip = 0 + * if pydevd_dont_trace.should_trace_hook is not None: + * if self.should_skip == -1: # <<<<<<<<<<<<<< + * # I.e.: cache the result on self.should_skip (no need to evaluate the same frame multiple times). + * # Note that on a code reload, we won't re-evaluate this because in practice, the frame.f_code + */ + goto __pyx_L180; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1128 + * should_skip = self.should_skip = 0 + * else: + * should_skip = self.should_skip # <<<<<<<<<<<<<< + * + * plugin_stop = False + */ + /*else*/ { + __pyx_t_11 = __pyx_v_self->should_skip; + __pyx_v_should_skip = __pyx_t_11; + } + __pyx_L180:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1117 + * try: + * should_skip = 0 + * if pydevd_dont_trace.should_trace_hook is not None: # <<<<<<<<<<<<<< + * if self.should_skip == -1: + * # I.e.: cache the result on self.should_skip (no need to evaluate the same frame multiple times). + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1130 + * should_skip = self.should_skip + * + * plugin_stop = False # <<<<<<<<<<<<<< + * if should_skip: + * stop = False + */ + __Pyx_INCREF(Py_False); + __pyx_v_plugin_stop = Py_False; + + /* "_pydevd_bundle/pydevd_cython.pyx":1131 + * + * plugin_stop = False + * if should_skip: # <<<<<<<<<<<<<< + * stop = False + * + */ + __pyx_t_10 = (__pyx_v_should_skip != 0); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1132 + * plugin_stop = False + * if should_skip: + * stop = False # <<<<<<<<<<<<<< + * + * elif step_cmd in (107, 144, 206): + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1131 + * + * plugin_stop = False + * if should_skip: # <<<<<<<<<<<<<< + * stop = False + * + */ + goto __pyx_L182; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1134 + * stop = False + * + * elif step_cmd in (107, 144, 206): # <<<<<<<<<<<<<< + * force_check_project_scope = step_cmd == 144 + * if is_line: + */ + switch (__pyx_v_step_cmd) { + case 0x6B: + case 0x90: + case 0xCE: + __pyx_t_10 = 1; + break; + default: + __pyx_t_10 = 0; + break; + } + __pyx_t_12 = __pyx_t_10; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1135 + * + * elif step_cmd in (107, 144, 206): + * force_check_project_scope = step_cmd == 144 # <<<<<<<<<<<<<< + * if is_line: + * if not info.pydev_use_scoped_step_frame: + */ + __pyx_t_4 = __Pyx_PyBool_FromLong((__pyx_v_step_cmd == 0x90)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1135, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_force_check_project_scope = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1136 + * elif step_cmd in (107, 144, 206): + * force_check_project_scope = step_cmd == 144 + * if is_line: # <<<<<<<<<<<<<< + * if not info.pydev_use_scoped_step_frame: + * if force_check_project_scope or py_db.is_files_filter_enabled: + */ + if (__pyx_v_is_line) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1137 + * force_check_project_scope = step_cmd == 144 + * if is_line: + * if not info.pydev_use_scoped_step_frame: # <<<<<<<<<<<<<< + * if force_check_project_scope or py_db.is_files_filter_enabled: + * stop = not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope) + */ + __pyx_t_12 = (!__pyx_v_info->pydev_use_scoped_step_frame); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1138 + * if is_line: + * if not info.pydev_use_scoped_step_frame: + * if force_check_project_scope or py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * stop = not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope) + * else: + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_force_check_project_scope); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1138, __pyx_L173_error) + if (!__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L186_bool_binop_done; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_is_files_filter_enabled); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1138, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1138, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_12 = __pyx_t_10; + __pyx_L186_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1139 + * if not info.pydev_use_scoped_step_frame: + * if force_check_project_scope or py_db.is_files_filter_enabled: + * stop = not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope) # <<<<<<<<<<<<<< + * else: + * stop = True + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1139, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1139, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1139, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_6, __pyx_v_frame, __pyx_t_8, __pyx_v_force_check_project_scope}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1139, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1139, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_stop = (!__pyx_t_12); + + /* "_pydevd_bundle/pydevd_cython.pyx":1138 + * if is_line: + * if not info.pydev_use_scoped_step_frame: + * if force_check_project_scope or py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * stop = not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope) + * else: + */ + goto __pyx_L185; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1141 + * stop = not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope) + * else: + * stop = True # <<<<<<<<<<<<<< + * else: + * if force_check_project_scope or py_db.is_files_filter_enabled: + */ + /*else*/ { + __pyx_v_stop = 1; + } + __pyx_L185:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1137 + * force_check_project_scope = step_cmd == 144 + * if is_line: + * if not info.pydev_use_scoped_step_frame: # <<<<<<<<<<<<<< + * if force_check_project_scope or py_db.is_files_filter_enabled: + * stop = not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope) + */ + goto __pyx_L184; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1143 + * stop = True + * else: + * if force_check_project_scope or py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * # Make sure we check the filtering inside ipython calls too... + * if not not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope): + */ + /*else*/ { + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_force_check_project_scope); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1143, __pyx_L173_error) + if (!__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L189_bool_binop_done; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_is_files_filter_enabled); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1143, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1143, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_12 = __pyx_t_10; + __pyx_L189_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1145 + * if force_check_project_scope or py_db.is_files_filter_enabled: + * # Make sure we check the filtering inside ipython calls too... + * if not not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope): # <<<<<<<<<<<<<< + * return None if is_call else NO_FTRACE + * + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1145, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1145, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1145, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_8, __pyx_v_frame, __pyx_t_6, __pyx_v_force_check_project_scope}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1145, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1145, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_10 = (!(!__pyx_t_12)); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1146 + * # Make sure we check the filtering inside ipython calls too... + * if not not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope): + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * # We can only stop inside the ipython call. + */ + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_4 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1146, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_t_7; + __pyx_t_7 = 0; + } + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L177_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1145 + * if force_check_project_scope or py_db.is_files_filter_enabled: + * # Make sure we check the filtering inside ipython calls too... + * if not not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope): # <<<<<<<<<<<<<< + * return None if is_call else NO_FTRACE + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1143 + * stop = True + * else: + * if force_check_project_scope or py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * # Make sure we check the filtering inside ipython calls too... + * if not not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope): + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1149 + * + * # We can only stop inside the ipython call. + * filename = frame.f_code.co_filename # <<<<<<<<<<<<<< + * if filename.endswith(".pyc"): + * filename = filename[:-1] + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1149, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1149, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_filename = __pyx_t_7; + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1150 + * # We can only stop inside the ipython call. + * filename = frame.f_code.co_filename + * if filename.endswith(".pyc"): # <<<<<<<<<<<<<< + * filename = filename[:-1] + * + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_filename, __pyx_n_s_endswith); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1150, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s_pyc}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1150, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1150, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1151 + * filename = frame.f_code.co_filename + * if filename.endswith(".pyc"): + * filename = filename[:-1] # <<<<<<<<<<<<<< + * + * if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): + */ + __pyx_t_7 = __Pyx_PyObject_GetSlice(__pyx_v_filename, 0, -1L, NULL, NULL, &__pyx_slice__6, 0, 1, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1151, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF_SET(__pyx_v_filename, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1150 + * # We can only stop inside the ipython call. + * filename = frame.f_code.co_filename + * if filename.endswith(".pyc"): # <<<<<<<<<<<<<< + * filename = filename[:-1] + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1153 + * filename = filename[:-1] + * + * if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): # <<<<<<<<<<<<<< + * f = frame.f_back + * while f is not None: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_filename, __pyx_n_s_endswith); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1153, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_PYDEVD_IPYTHON_CONTEXT); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1153, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_6, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1153, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_8}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1153, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1153, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_12 = (!__pyx_t_10); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1154 + * + * if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): + * f = frame.f_back # <<<<<<<<<<<<<< + * while f is not None: + * if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1154, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XDECREF_SET(__pyx_v_f, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1155 + * if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): + * f = frame.f_back + * while f is not None: # <<<<<<<<<<<<<< + * if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + * f2 = f.f_back + */ + while (1) { + __pyx_t_12 = (__pyx_v_f != Py_None); + if (!__pyx_t_12) break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1156 + * f = frame.f_back + * while f is not None: + * if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: # <<<<<<<<<<<<<< + * f2 = f.f_back + * if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_code); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1156, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_co_name); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1156, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_PYDEVD_IPYTHON_CONTEXT); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1156, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_7, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1156, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = PyObject_RichCompare(__pyx_t_4, __pyx_t_8, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1156, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1156, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1157 + * while f is not None: + * if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + * f2 = f.f_back # <<<<<<<<<<<<<< + * if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + * pydev_log.debug("Stop inside ipython call") + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1157, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XDECREF_SET(__pyx_v_f2, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1158 + * if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + * f2 = f.f_back + * if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: # <<<<<<<<<<<<<< + * pydev_log.debug("Stop inside ipython call") + * stop = True + */ + __pyx_t_10 = (__pyx_v_f2 != Py_None); + if (__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L198_bool_binop_done; + } + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_f2, __pyx_n_s_f_code); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1158, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_co_name); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1158, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_PYDEVD_IPYTHON_CONTEXT); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1158, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_7, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1158, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = PyObject_RichCompare(__pyx_t_8, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1158, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1158, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_12 = __pyx_t_10; + __pyx_L198_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1159 + * f2 = f.f_back + * if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + * pydev_log.debug("Stop inside ipython call") # <<<<<<<<<<<<<< + * stop = True + * break + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1159, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_debug); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1159, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_s_Stop_inside_ipython_call}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1159, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1160 + * if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + * pydev_log.debug("Stop inside ipython call") + * stop = True # <<<<<<<<<<<<<< + * break + * f = f.f_back + */ + __pyx_v_stop = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1161 + * pydev_log.debug("Stop inside ipython call") + * stop = True + * break # <<<<<<<<<<<<<< + * f = f.f_back + * + */ + goto __pyx_L195_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1158 + * if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + * f2 = f.f_back + * if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: # <<<<<<<<<<<<<< + * pydev_log.debug("Stop inside ipython call") + * stop = True + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1156 + * f = frame.f_back + * while f is not None: + * if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: # <<<<<<<<<<<<<< + * f2 = f.f_back + * if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1162 + * stop = True + * break + * f = f.f_back # <<<<<<<<<<<<<< + * + * del f + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1162, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF_SET(__pyx_v_f, __pyx_t_7); + __pyx_t_7 = 0; + } + __pyx_L195_break:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1164 + * f = f.f_back + * + * del f # <<<<<<<<<<<<<< + * + * if not stop: + */ + __Pyx_DECREF(__pyx_v_f); __pyx_v_f = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1153 + * filename = filename[:-1] + * + * if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): # <<<<<<<<<<<<<< + * f = frame.f_back + * while f is not None: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1166 + * del f + * + * if not stop: # <<<<<<<<<<<<<< + * # In scoped mode if step in didn't work in this context it won't work + * # afterwards anyways. + */ + __pyx_t_12 = (!__pyx_v_stop); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1169 + * # In scoped mode if step in didn't work in this context it won't work + * # afterwards anyways. + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * elif is_return and frame.f_back is not None and not info.pydev_use_scoped_step_frame: + */ + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_7 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1169, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __pyx_t_8; + __pyx_t_8 = 0; + } + __pyx_r = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L177_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1166 + * del f + * + * if not stop: # <<<<<<<<<<<<<< + * # In scoped mode if step in didn't work in this context it won't work + * # afterwards anyways. + */ + } + } + __pyx_L184:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1136 + * elif step_cmd in (107, 144, 206): + * force_check_project_scope = step_cmd == 144 + * if is_line: # <<<<<<<<<<<<<< + * if not info.pydev_use_scoped_step_frame: + * if force_check_project_scope or py_db.is_files_filter_enabled: + */ + goto __pyx_L183; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1171 + * return None if is_call else NO_FTRACE + * + * elif is_return and frame.f_back is not None and not info.pydev_use_scoped_step_frame: # <<<<<<<<<<<<<< + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + * stop = False + */ + if (__pyx_v_is_return) { + } else { + __pyx_t_12 = __pyx_v_is_return; + goto __pyx_L201_bool_binop_done; + } + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1171, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_10 = (__pyx_t_7 != Py_None); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L201_bool_binop_done; + } + __pyx_t_10 = (!__pyx_v_info->pydev_use_scoped_step_frame); + __pyx_t_12 = __pyx_t_10; + __pyx_L201_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1172 + * + * elif is_return and frame.f_back is not None and not info.pydev_use_scoped_step_frame: + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: # <<<<<<<<<<<<<< + * stop = False + * else: + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_get_file_type); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1172, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1172, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_4}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1172, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_PYDEV_FILE); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1172, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_7, __pyx_t_8, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1172, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1172, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1173 + * elif is_return and frame.f_back is not None and not info.pydev_use_scoped_step_frame: + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + * stop = False # <<<<<<<<<<<<<< + * else: + * if force_check_project_scope or py_db.is_files_filter_enabled: + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1172 + * + * elif is_return and frame.f_back is not None and not info.pydev_use_scoped_step_frame: + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: # <<<<<<<<<<<<<< + * stop = False + * else: + */ + goto __pyx_L204; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1175 + * stop = False + * else: + * if force_check_project_scope or py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * stop = not py_db.apply_files_filter( + * frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope + */ + /*else*/ { + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_force_check_project_scope); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1175, __pyx_L173_error) + if (!__pyx_t_10) { + } else { + __pyx_t_12 = __pyx_t_10; + goto __pyx_L206_bool_binop_done; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_is_files_filter_enabled); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1175, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1175, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_12 = __pyx_t_10; + __pyx_L206_bool_binop_done:; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1176 + * else: + * if force_check_project_scope or py_db.is_files_filter_enabled: + * stop = not py_db.apply_files_filter( # <<<<<<<<<<<<<< + * frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope + * ) + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1176, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + + /* "_pydevd_bundle/pydevd_cython.pyx":1177 + * if force_check_project_scope or py_db.is_files_filter_enabled: + * stop = not py_db.apply_files_filter( + * frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope # <<<<<<<<<<<<<< + * ) + * if stop: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1177, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1177, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_f_code); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1177, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1177, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_3, __pyx_t_7, __pyx_t_6, __pyx_v_force_check_project_scope}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1176, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1176 + * else: + * if force_check_project_scope or py_db.is_files_filter_enabled: + * stop = not py_db.apply_files_filter( # <<<<<<<<<<<<<< + * frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope + * ) + */ + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1176, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_stop = (!__pyx_t_12); + + /* "_pydevd_bundle/pydevd_cython.pyx":1179 + * frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope + * ) + * if stop: # <<<<<<<<<<<<<< + * # Prevent stopping in a return to the same location we were initially + * # (i.e.: double-stop at the same place due to some filtering). + */ + if (__pyx_v_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1182 + * # Prevent stopping in a return to the same location we were initially + * # (i.e.: double-stop at the same place due to some filtering). + * if info.step_in_initial_location == (frame.f_back, frame.f_back.f_lineno): # <<<<<<<<<<<<<< + * stop = False + * else: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1182, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1182, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1182, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1182, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4)) __PYX_ERR(0, 1182, __pyx_L173_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6)) __PYX_ERR(0, 1182, __pyx_L173_error); + __pyx_t_4 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = PyObject_RichCompare(__pyx_v_info->step_in_initial_location, __pyx_t_8, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1182, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1182, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1183 + * # (i.e.: double-stop at the same place due to some filtering). + * if info.step_in_initial_location == (frame.f_back, frame.f_back.f_lineno): + * stop = False # <<<<<<<<<<<<<< + * else: + * stop = True + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1182 + * # Prevent stopping in a return to the same location we were initially + * # (i.e.: double-stop at the same place due to some filtering). + * if info.step_in_initial_location == (frame.f_back, frame.f_back.f_lineno): # <<<<<<<<<<<<<< + * stop = False + * else: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1179 + * frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope + * ) + * if stop: # <<<<<<<<<<<<<< + * # Prevent stopping in a return to the same location we were initially + * # (i.e.: double-stop at the same place due to some filtering). + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1175 + * stop = False + * else: + * if force_check_project_scope or py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * stop = not py_db.apply_files_filter( + * frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope + */ + goto __pyx_L205; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1185 + * stop = False + * else: + * stop = True # <<<<<<<<<<<<<< + * else: + * stop = False + */ + /*else*/ { + __pyx_v_stop = 1; + } + __pyx_L205:; + } + __pyx_L204:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1171 + * return None if is_call else NO_FTRACE + * + * elif is_return and frame.f_back is not None and not info.pydev_use_scoped_step_frame: # <<<<<<<<<<<<<< + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + * stop = False + */ + goto __pyx_L183; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1187 + * stop = True + * else: + * stop = False # <<<<<<<<<<<<<< + * + * if stop: + */ + /*else*/ { + __pyx_v_stop = 0; + } + __pyx_L183:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1189 + * stop = False + * + * if stop: # <<<<<<<<<<<<<< + * if step_cmd == 206: + * # i.e.: Check if we're stepping into the proper context. + */ + if (__pyx_v_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1190 + * + * if stop: + * if step_cmd == 206: # <<<<<<<<<<<<<< + * # i.e.: Check if we're stepping into the proper context. + * f = frame + */ + __pyx_t_12 = (__pyx_v_step_cmd == 0xCE); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1192 + * if step_cmd == 206: + * # i.e.: Check if we're stepping into the proper context. + * f = frame # <<<<<<<<<<<<<< + * while f is not None: + * if self._is_same_frame(stop_frame, f): + */ + __Pyx_INCREF(__pyx_v_frame); + __Pyx_XDECREF_SET(__pyx_v_f, __pyx_v_frame); + + /* "_pydevd_bundle/pydevd_cython.pyx":1193 + * # i.e.: Check if we're stepping into the proper context. + * f = frame + * while f is not None: # <<<<<<<<<<<<<< + * if self._is_same_frame(stop_frame, f): + * break + */ + while (1) { + __pyx_t_12 = (__pyx_v_f != Py_None); + if (!__pyx_t_12) break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1194 + * f = frame + * while f is not None: + * if self._is_same_frame(stop_frame, f): # <<<<<<<<<<<<<< + * break + * f = f.f_back + */ + __pyx_t_6 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_v_f); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1194, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1194, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1195 + * while f is not None: + * if self._is_same_frame(stop_frame, f): + * break # <<<<<<<<<<<<<< + * f = f.f_back + * else: + */ + goto __pyx_L213_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1194 + * f = frame + * while f is not None: + * if self._is_same_frame(stop_frame, f): # <<<<<<<<<<<<<< + * break + * f = f.f_back + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1196 + * if self._is_same_frame(stop_frame, f): + * break + * f = f.f_back # <<<<<<<<<<<<<< + * else: + * stop = False + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_back); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1196, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_f, __pyx_t_6); + __pyx_t_6 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1198 + * f = f.f_back + * else: + * stop = False # <<<<<<<<<<<<<< + * + * if plugin_manager is not None: + */ + /*else*/ { + __pyx_v_stop = 0; + } + __pyx_L213_break:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1190 + * + * if stop: + * if step_cmd == 206: # <<<<<<<<<<<<<< + * # i.e.: Check if we're stepping into the proper context. + * f = frame + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1189 + * stop = False + * + * if stop: # <<<<<<<<<<<<<< + * if step_cmd == 206: + * # i.e.: Check if we're stepping into the proper context. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1200 + * stop = False + * + * if plugin_manager is not None: # <<<<<<<<<<<<<< + * result = plugin_manager.cmd_step_into(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: + */ + __pyx_t_12 = (__pyx_v_plugin_manager != Py_None); + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1201 + * + * if plugin_manager is not None: + * result = plugin_manager.cmd_step_into(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) # <<<<<<<<<<<<<< + * if result: + * stop, plugin_stop = result + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin_manager, __pyx_n_s_cmd_step_into); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1201, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1201, __pyx_L173_error) + } + __pyx_t_4 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1201, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1201, __pyx_L173_error) + } + __pyx_t_7 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1201, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_stop); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1201, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[8] = {__pyx_t_2, __pyx_v_py_db, __pyx_v_frame, __pyx_v_event, __pyx_t_4, __pyx_t_7, __pyx_v_stop_info, __pyx_t_3}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 7+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1201, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_result, __pyx_t_6); + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1202 + * if plugin_manager is not None: + * result = plugin_manager.cmd_step_into(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: # <<<<<<<<<<<<<< + * stop, plugin_stop = result + * + */ + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_result); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1202, __pyx_L173_error) + if (__pyx_t_12) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1203 + * result = plugin_manager.cmd_step_into(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: + * stop, plugin_stop = result # <<<<<<<<<<<<<< + * + * elif step_cmd in (108, 159): + */ + if ((likely(PyTuple_CheckExact(__pyx_v_result))) || (PyList_CheckExact(__pyx_v_result))) { + PyObject* sequence = __pyx_v_result; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1203, __pyx_L173_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_6 = PyList_GET_ITEM(sequence, 0); + __pyx_t_8 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(__pyx_t_8); + #else + __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1203, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1203, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + Py_ssize_t index = -1; + __pyx_t_3 = PyObject_GetIter(__pyx_v_result); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1203, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_3); + index = 0; __pyx_t_6 = __pyx_t_15(__pyx_t_3); if (unlikely(!__pyx_t_6)) goto __pyx_L217_unpacking_failed; + __Pyx_GOTREF(__pyx_t_6); + index = 1; __pyx_t_8 = __pyx_t_15(__pyx_t_3); if (unlikely(!__pyx_t_8)) goto __pyx_L217_unpacking_failed; + __Pyx_GOTREF(__pyx_t_8); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_3), 2) < 0) __PYX_ERR(0, 1203, __pyx_L173_error) + __pyx_t_15 = NULL; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L218_unpacking_done; + __pyx_L217_unpacking_failed:; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_15 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 1203, __pyx_L173_error) + __pyx_L218_unpacking_done:; + } + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1203, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_stop = __pyx_t_12; + __Pyx_DECREF_SET(__pyx_v_plugin_stop, __pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1202 + * if plugin_manager is not None: + * result = plugin_manager.cmd_step_into(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: # <<<<<<<<<<<<<< + * stop, plugin_stop = result + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1200 + * stop = False + * + * if plugin_manager is not None: # <<<<<<<<<<<<<< + * result = plugin_manager.cmd_step_into(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1134 + * stop = False + * + * elif step_cmd in (107, 144, 206): # <<<<<<<<<<<<<< + * force_check_project_scope = step_cmd == 144 + * if is_line: + */ + goto __pyx_L182; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1205 + * stop, plugin_stop = result + * + * elif step_cmd in (108, 159): # <<<<<<<<<<<<<< + * # Note: when dealing with a step over my code it's the same as a step over (the + * # difference is that when we return from a frame in one we go to regular step + */ + switch (__pyx_v_step_cmd) { + case 0x6C: + case 0x9F: + __pyx_t_12 = 1; + break; + default: + __pyx_t_12 = 0; + break; + } + __pyx_t_10 = __pyx_t_12; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1209 + * # difference is that when we return from a frame in one we go to regular step + * # into and in the other we go to a step into my code). + * stop = self._is_same_frame(stop_frame, frame) and is_line # <<<<<<<<<<<<<< + * # Note: don't stop on a return for step over, only for line events + * # i.e.: don't stop in: (stop_frame is frame.f_back and is_return) as we'd stop twice in that line. + */ + __pyx_t_8 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_v_frame); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1209, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1209, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L219_bool_binop_done; + } + __pyx_t_10 = __pyx_v_is_line; + __pyx_L219_bool_binop_done:; + __pyx_v_stop = __pyx_t_10; + + /* "_pydevd_bundle/pydevd_cython.pyx":1213 + * # i.e.: don't stop in: (stop_frame is frame.f_back and is_return) as we'd stop twice in that line. + * + * if plugin_manager is not None: # <<<<<<<<<<<<<< + * result = plugin_manager.cmd_step_over(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: + */ + __pyx_t_10 = (__pyx_v_plugin_manager != Py_None); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1214 + * + * if plugin_manager is not None: + * result = plugin_manager.cmd_step_over(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) # <<<<<<<<<<<<<< + * if result: + * stop, plugin_stop = result + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin_manager, __pyx_n_s_cmd_step_over); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1214, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1214, __pyx_L173_error) + } + __pyx_t_3 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1214, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_3); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1214, __pyx_L173_error) + } + __pyx_t_7 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1214, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_stop); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1214, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[8] = {__pyx_t_2, __pyx_v_py_db, __pyx_v_frame, __pyx_v_event, __pyx_t_3, __pyx_t_7, __pyx_v_stop_info, __pyx_t_4}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 7+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1214, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_result, __pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1215 + * if plugin_manager is not None: + * result = plugin_manager.cmd_step_over(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: # <<<<<<<<<<<<<< + * stop, plugin_stop = result + * + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_result); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1215, __pyx_L173_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1216 + * result = plugin_manager.cmd_step_over(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: + * stop, plugin_stop = result # <<<<<<<<<<<<<< + * + * elif step_cmd == 128: + */ + if ((likely(PyTuple_CheckExact(__pyx_v_result))) || (PyList_CheckExact(__pyx_v_result))) { + PyObject* sequence = __pyx_v_result; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1216, __pyx_L173_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_8 = PyList_GET_ITEM(sequence, 0); + __pyx_t_6 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(__pyx_t_6); + #else + __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1216, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1216, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + } else { + Py_ssize_t index = -1; + __pyx_t_4 = PyObject_GetIter(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1216, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_4); + index = 0; __pyx_t_8 = __pyx_t_15(__pyx_t_4); if (unlikely(!__pyx_t_8)) goto __pyx_L223_unpacking_failed; + __Pyx_GOTREF(__pyx_t_8); + index = 1; __pyx_t_6 = __pyx_t_15(__pyx_t_4); if (unlikely(!__pyx_t_6)) goto __pyx_L223_unpacking_failed; + __Pyx_GOTREF(__pyx_t_6); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_4), 2) < 0) __PYX_ERR(0, 1216, __pyx_L173_error) + __pyx_t_15 = NULL; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L224_unpacking_done; + __pyx_L223_unpacking_failed:; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_15 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 1216, __pyx_L173_error) + __pyx_L224_unpacking_done:; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1216, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_stop = __pyx_t_10; + __Pyx_DECREF_SET(__pyx_v_plugin_stop, __pyx_t_6); + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1215 + * if plugin_manager is not None: + * result = plugin_manager.cmd_step_over(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: # <<<<<<<<<<<<<< + * stop, plugin_stop = result + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1213 + * # i.e.: don't stop in: (stop_frame is frame.f_back and is_return) as we'd stop twice in that line. + * + * if plugin_manager is not None: # <<<<<<<<<<<<<< + * result = plugin_manager.cmd_step_over(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + * if result: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1205 + * stop, plugin_stop = result + * + * elif step_cmd in (108, 159): # <<<<<<<<<<<<<< + * # Note: when dealing with a step over my code it's the same as a step over (the + * # difference is that when we return from a frame in one we go to regular step + */ + goto __pyx_L182; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1218 + * stop, plugin_stop = result + * + * elif step_cmd == 128: # <<<<<<<<<<<<<< + * stop = False + * back = frame.f_back + */ + __pyx_t_10 = (__pyx_v_step_cmd == 0x80); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1219 + * + * elif step_cmd == 128: + * stop = False # <<<<<<<<<<<<<< + * back = frame.f_back + * if self._is_same_frame(stop_frame, frame) and is_return: + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1220 + * elif step_cmd == 128: + * stop = False + * back = frame.f_back # <<<<<<<<<<<<<< + * if self._is_same_frame(stop_frame, frame) and is_return: + * # We're exiting the smart step into initial frame (so, we probably didn't find our target). + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1220, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_back = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1221 + * stop = False + * back = frame.f_back + * if self._is_same_frame(stop_frame, frame) and is_return: # <<<<<<<<<<<<<< + * # We're exiting the smart step into initial frame (so, we probably didn't find our target). + * stop = True + */ + __pyx_t_6 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_v_frame); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1221, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1221, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L226_bool_binop_done; + } + __pyx_t_10 = __pyx_v_is_return; + __pyx_L226_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1223 + * if self._is_same_frame(stop_frame, frame) and is_return: + * # We're exiting the smart step into initial frame (so, we probably didn't find our target). + * stop = True # <<<<<<<<<<<<<< + * + * elif self._is_same_frame(stop_frame, back) and is_line: + */ + __pyx_v_stop = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1221 + * stop = False + * back = frame.f_back + * if self._is_same_frame(stop_frame, frame) and is_return: # <<<<<<<<<<<<<< + * # We're exiting the smart step into initial frame (so, we probably didn't find our target). + * stop = True + */ + goto __pyx_L225; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1225 + * stop = True + * + * elif self._is_same_frame(stop_frame, back) and is_line: # <<<<<<<<<<<<<< + * if info.pydev_smart_child_offset != -1: + * # i.e.: in this case, we're not interested in the pause in the parent, rather + */ + __pyx_t_6 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_v_back); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1225, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 1225, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L228_bool_binop_done; + } + __pyx_t_10 = __pyx_v_is_line; + __pyx_L228_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1226 + * + * elif self._is_same_frame(stop_frame, back) and is_line: + * if info.pydev_smart_child_offset != -1: # <<<<<<<<<<<<<< + * # i.e.: in this case, we're not interested in the pause in the parent, rather + * # we're interested in the pause in the child (when the parent is at the proper place). + */ + __pyx_t_10 = (__pyx_v_info->pydev_smart_child_offset != -1L); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1229 + * # i.e.: in this case, we're not interested in the pause in the parent, rather + * # we're interested in the pause in the child (when the parent is at the proper place). + * stop = False # <<<<<<<<<<<<<< + * + * else: + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1226 + * + * elif self._is_same_frame(stop_frame, back) and is_line: + * if info.pydev_smart_child_offset != -1: # <<<<<<<<<<<<<< + * # i.e.: in this case, we're not interested in the pause in the parent, rather + * # we're interested in the pause in the child (when the parent is at the proper place). + */ + goto __pyx_L230; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1232 + * + * else: + * pydev_smart_parent_offset = info.pydev_smart_parent_offset # <<<<<<<<<<<<<< + * + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + */ + /*else*/ { + __pyx_t_11 = __pyx_v_info->pydev_smart_parent_offset; + __pyx_v_pydev_smart_parent_offset = __pyx_t_11; + + /* "_pydevd_bundle/pydevd_cython.pyx":1234 + * pydev_smart_parent_offset = info.pydev_smart_parent_offset + * + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants # <<<<<<<<<<<<<< + * if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: + * # Preferred mode (when the smart step into variants are available + */ + __pyx_t_6 = __pyx_v_info->pydev_smart_step_into_variants; + __Pyx_INCREF(__pyx_t_6); + __pyx_v_pydev_smart_step_into_variants = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1235 + * + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + * if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: # <<<<<<<<<<<<<< + * # Preferred mode (when the smart step into variants are available + * # and the offset is set). + */ + __pyx_t_12 = (__pyx_v_pydev_smart_parent_offset >= 0); + if (__pyx_t_12) { + } else { + __pyx_t_10 = __pyx_t_12; + goto __pyx_L232_bool_binop_done; + } + __pyx_t_12 = (__pyx_v_pydev_smart_step_into_variants != Py_None)&&(PyTuple_GET_SIZE(__pyx_v_pydev_smart_step_into_variants) != 0); + __pyx_t_10 = __pyx_t_12; + __pyx_L232_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1238 + * # Preferred mode (when the smart step into variants are available + * # and the offset is set). + * stop = get_smart_step_into_variant_from_frame_offset( # <<<<<<<<<<<<<< + * back.f_lasti, pydev_smart_step_into_variants + * ) is get_smart_step_into_variant_from_frame_offset( + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_get_smart_step_into_variant_from); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1238, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + + /* "_pydevd_bundle/pydevd_cython.pyx":1239 + * # and the offset is set). + * stop = get_smart_step_into_variant_from_frame_offset( + * back.f_lasti, pydev_smart_step_into_variants # <<<<<<<<<<<<<< + * ) is get_smart_step_into_variant_from_frame_offset( + * pydev_smart_parent_offset, pydev_smart_step_into_variants + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_back, __pyx_n_s_f_lasti); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1239, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_4, __pyx_v_pydev_smart_step_into_variants}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1238, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1240 + * stop = get_smart_step_into_variant_from_frame_offset( + * back.f_lasti, pydev_smart_step_into_variants + * ) is get_smart_step_into_variant_from_frame_offset( # <<<<<<<<<<<<<< + * pydev_smart_parent_offset, pydev_smart_step_into_variants + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_get_smart_step_into_variant_from); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1240, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + + /* "_pydevd_bundle/pydevd_cython.pyx":1241 + * back.f_lasti, pydev_smart_step_into_variants + * ) is get_smart_step_into_variant_from_frame_offset( + * pydev_smart_parent_offset, pydev_smart_step_into_variants # <<<<<<<<<<<<<< + * ) + * + */ + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_pydev_smart_parent_offset); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1241, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_7, __pyx_v_pydev_smart_step_into_variants}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1240, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_10 = (__pyx_t_6 == __pyx_t_8); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_stop = __pyx_t_10; + + /* "_pydevd_bundle/pydevd_cython.pyx":1235 + * + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + * if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: # <<<<<<<<<<<<<< + * # Preferred mode (when the smart step into variants are available + * # and the offset is set). + */ + goto __pyx_L231; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1246 + * else: + * # Only the name/line is available, so, check that. + * curr_func_name = frame.f_code.co_name # <<<<<<<<<<<<<< + * + * # global context is set with an empty name + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1246, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_co_name); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1246, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (!(likely(PyString_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_6))) __PYX_ERR(0, 1246, __pyx_L173_error) + __Pyx_XDECREF_SET(__pyx_v_curr_func_name, ((PyObject*)__pyx_t_6)); + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1249 + * + * # global context is set with an empty name + * if curr_func_name in ("?", "") or curr_func_name is None: # <<<<<<<<<<<<<< + * curr_func_name = "" + * if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: + */ + __Pyx_INCREF(__pyx_v_curr_func_name); + __pyx_t_22 = __pyx_v_curr_func_name; + __pyx_t_16 = (__Pyx_PyString_Equals(__pyx_t_22, __pyx_kp_s__4, Py_EQ)); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1249, __pyx_L173_error) + if (!__pyx_t_16) { + } else { + __pyx_t_12 = __pyx_t_16; + goto __pyx_L237_bool_binop_done; + } + __pyx_t_16 = (__Pyx_PyString_Equals(__pyx_t_22, __pyx_kp_s_module, Py_EQ)); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1249, __pyx_L173_error) + __pyx_t_12 = __pyx_t_16; + __pyx_L237_bool_binop_done:; + __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; + __pyx_t_16 = __pyx_t_12; + if (!__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L235_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_curr_func_name == ((PyObject*)Py_None)); + __pyx_t_10 = __pyx_t_16; + __pyx_L235_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1250 + * # global context is set with an empty name + * if curr_func_name in ("?", "") or curr_func_name is None: + * curr_func_name = "" # <<<<<<<<<<<<<< + * if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: + * stop = True + */ + __Pyx_INCREF(__pyx_kp_s_); + __Pyx_DECREF_SET(__pyx_v_curr_func_name, __pyx_kp_s_); + + /* "_pydevd_bundle/pydevd_cython.pyx":1249 + * + * # global context is set with an empty name + * if curr_func_name in ("?", "") or curr_func_name is None: # <<<<<<<<<<<<<< + * curr_func_name = "" + * if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1251 + * if curr_func_name in ("?", "") or curr_func_name is None: + * curr_func_name = "" + * if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: # <<<<<<<<<<<<<< + * stop = True + * + */ + __pyx_t_16 = (__Pyx_PyString_Equals(__pyx_v_curr_func_name, __pyx_v_info->pydev_func_name, Py_EQ)); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1251, __pyx_L173_error) + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L240_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_stop_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1251, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_info->pydev_next_line); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1251, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_6, __pyx_t_8, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1251, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1251, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_10 = __pyx_t_16; + __pyx_L240_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1252 + * curr_func_name = "" + * if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: + * stop = True # <<<<<<<<<<<<<< + * + * if not stop: + */ + __pyx_v_stop = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1251 + * if curr_func_name in ("?", "") or curr_func_name is None: + * curr_func_name = "" + * if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: # <<<<<<<<<<<<<< + * stop = True + * + */ + } + } + __pyx_L231:; + } + __pyx_L230:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1254 + * stop = True + * + * if not stop: # <<<<<<<<<<<<<< + * # In smart step into, if we didn't hit it in this frame once, that'll + * # not be the case next time either, so, disable tracing for this frame. + */ + __pyx_t_10 = (!__pyx_v_stop); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1257 + * # In smart step into, if we didn't hit it in this frame once, that'll + * # not be the case next time either, so, disable tracing for this frame. + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * elif back is not None and self._is_same_frame(stop_frame, back.f_back) and is_line: + */ + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_4 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1257, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_4 = __pyx_t_8; + __pyx_t_8 = 0; + } + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L177_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1254 + * stop = True + * + * if not stop: # <<<<<<<<<<<<<< + * # In smart step into, if we didn't hit it in this frame once, that'll + * # not be the case next time either, so, disable tracing for this frame. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1225 + * stop = True + * + * elif self._is_same_frame(stop_frame, back) and is_line: # <<<<<<<<<<<<<< + * if info.pydev_smart_child_offset != -1: + * # i.e.: in this case, we're not interested in the pause in the parent, rather + */ + goto __pyx_L225; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1259 + * return None if is_call else NO_FTRACE + * + * elif back is not None and self._is_same_frame(stop_frame, back.f_back) and is_line: # <<<<<<<<<<<<<< + * # Ok, we have to track 2 stops at this point, the parent and the child offset. + * # This happens when handling a step into which targets a function inside a list comprehension + */ + __pyx_t_16 = (__pyx_v_back != Py_None); + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L243_bool_binop_done; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_back, __pyx_n_s_f_back); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1259, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_t_4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1259, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1259, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L243_bool_binop_done; + } + __pyx_t_10 = __pyx_v_is_line; + __pyx_L243_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1263 + * # This happens when handling a step into which targets a function inside a list comprehension + * # or generator (in which case an intermediary frame is created due to an internal function call). + * pydev_smart_parent_offset = info.pydev_smart_parent_offset # <<<<<<<<<<<<<< + * pydev_smart_child_offset = info.pydev_smart_child_offset + * # print('matched back frame', pydev_smart_parent_offset, pydev_smart_child_offset) + */ + __pyx_t_11 = __pyx_v_info->pydev_smart_parent_offset; + __pyx_v_pydev_smart_parent_offset = __pyx_t_11; + + /* "_pydevd_bundle/pydevd_cython.pyx":1264 + * # or generator (in which case an intermediary frame is created due to an internal function call). + * pydev_smart_parent_offset = info.pydev_smart_parent_offset + * pydev_smart_child_offset = info.pydev_smart_child_offset # <<<<<<<<<<<<<< + * # print('matched back frame', pydev_smart_parent_offset, pydev_smart_child_offset) + * # print('parent f_lasti', back.f_back.f_lasti) + */ + __pyx_t_11 = __pyx_v_info->pydev_smart_child_offset; + __pyx_v_pydev_smart_child_offset = __pyx_t_11; + + /* "_pydevd_bundle/pydevd_cython.pyx":1268 + * # print('parent f_lasti', back.f_back.f_lasti) + * # print('child f_lasti', back.f_lasti) + * stop = False # <<<<<<<<<<<<<< + * if pydev_smart_child_offset >= 0 and pydev_smart_child_offset >= 0: + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1269 + * # print('child f_lasti', back.f_lasti) + * stop = False + * if pydev_smart_child_offset >= 0 and pydev_smart_child_offset >= 0: # <<<<<<<<<<<<<< + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + * + */ + __pyx_t_16 = (__pyx_v_pydev_smart_child_offset >= 0); + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L247_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_pydev_smart_child_offset >= 0); + __pyx_t_10 = __pyx_t_16; + __pyx_L247_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1270 + * stop = False + * if pydev_smart_child_offset >= 0 and pydev_smart_child_offset >= 0: + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants # <<<<<<<<<<<<<< + * + * if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: + */ + __pyx_t_8 = __pyx_v_info->pydev_smart_step_into_variants; + __Pyx_INCREF(__pyx_t_8); + __pyx_v_pydev_smart_step_into_variants = ((PyObject*)__pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1272 + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + * + * if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: # <<<<<<<<<<<<<< + * # Note that we don't really check the parent offset, only the offset of + * # the child (because this is a generator, the parent may have moved forward + */ + __pyx_t_16 = (__pyx_v_pydev_smart_parent_offset >= 0); + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L250_bool_binop_done; + } + __pyx_t_16 = (__pyx_v_pydev_smart_step_into_variants != Py_None)&&(PyTuple_GET_SIZE(__pyx_v_pydev_smart_step_into_variants) != 0); + __pyx_t_10 = __pyx_t_16; + __pyx_L250_bool_binop_done:; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1277 + * # already -- and that's ok, so, we just check that the parent frame + * # matches in this case). + * smart_step_into_variant = get_smart_step_into_variant_from_frame_offset( # <<<<<<<<<<<<<< + * pydev_smart_parent_offset, pydev_smart_step_into_variants + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_get_smart_step_into_variant_from); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1277, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + + /* "_pydevd_bundle/pydevd_cython.pyx":1278 + * # matches in this case). + * smart_step_into_variant = get_smart_step_into_variant_from_frame_offset( + * pydev_smart_parent_offset, pydev_smart_step_into_variants # <<<<<<<<<<<<<< + * ) + * # print('matched parent offset', pydev_smart_parent_offset) + */ + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_pydev_smart_parent_offset); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1278, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_pydev_smart_step_into_variants}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1277, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_v_smart_step_into_variant = __pyx_t_8; + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1282 + * # print('matched parent offset', pydev_smart_parent_offset) + * # Ok, now, check the child variant + * children_variants = smart_step_into_variant.children_variants # <<<<<<<<<<<<<< + * stop = children_variants and ( + * get_smart_step_into_variant_from_frame_offset(back.f_lasti, children_variants) + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_smart_step_into_variant, __pyx_n_s_children_variants); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1282, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_v_children_variants = __pyx_t_8; + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1283 + * # Ok, now, check the child variant + * children_variants = smart_step_into_variant.children_variants + * stop = children_variants and ( # <<<<<<<<<<<<<< + * get_smart_step_into_variant_from_frame_offset(back.f_lasti, children_variants) + * is get_smart_step_into_variant_from_frame_offset(pydev_smart_child_offset, children_variants) + */ + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_v_children_variants); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1283, __pyx_L173_error) + if (__pyx_t_16) { + } else { + __pyx_t_10 = __pyx_t_16; + goto __pyx_L252_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1284 + * children_variants = smart_step_into_variant.children_variants + * stop = children_variants and ( + * get_smart_step_into_variant_from_frame_offset(back.f_lasti, children_variants) # <<<<<<<<<<<<<< + * is get_smart_step_into_variant_from_frame_offset(pydev_smart_child_offset, children_variants) + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_get_smart_step_into_variant_from); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1284, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_back, __pyx_n_s_f_lasti); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1284, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_children_variants}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1284, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1285 + * stop = children_variants and ( + * get_smart_step_into_variant_from_frame_offset(back.f_lasti, children_variants) + * is get_smart_step_into_variant_from_frame_offset(pydev_smart_child_offset, children_variants) # <<<<<<<<<<<<<< + * ) + * # print('stop at child', stop) + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_get_smart_step_into_variant_from); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1285, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_pydev_smart_child_offset); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1285, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_7, __pyx_v_children_variants}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1285, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_16 = (__pyx_t_8 == __pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_10 = __pyx_t_16; + __pyx_L252_bool_binop_done:; + __pyx_v_stop = __pyx_t_10; + + /* "_pydevd_bundle/pydevd_cython.pyx":1272 + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + * + * if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: # <<<<<<<<<<<<<< + * # Note that we don't really check the parent offset, only the offset of + * # the child (because this is a generator, the parent may have moved forward + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1269 + * # print('child f_lasti', back.f_lasti) + * stop = False + * if pydev_smart_child_offset >= 0 and pydev_smart_child_offset >= 0: # <<<<<<<<<<<<<< + * pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1289 + * # print('stop at child', stop) + * + * if not stop: # <<<<<<<<<<<<<< + * # In smart step into, if we didn't hit it in this frame once, that'll + * # not be the case next time either, so, disable tracing for this frame. + */ + __pyx_t_10 = (!__pyx_v_stop); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1292 + * # In smart step into, if we didn't hit it in this frame once, that'll + * # not be the case next time either, so, disable tracing for this frame. + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * elif step_cmd in (109, 160): + */ + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_4 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1292, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_4 = __pyx_t_8; + __pyx_t_8 = 0; + } + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L177_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1289 + * # print('stop at child', stop) + * + * if not stop: # <<<<<<<<<<<<<< + * # In smart step into, if we didn't hit it in this frame once, that'll + * # not be the case next time either, so, disable tracing for this frame. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1259 + * return None if is_call else NO_FTRACE + * + * elif back is not None and self._is_same_frame(stop_frame, back.f_back) and is_line: # <<<<<<<<<<<<<< + * # Ok, we have to track 2 stops at this point, the parent and the child offset. + * # This happens when handling a step into which targets a function inside a list comprehension + */ + } + __pyx_L225:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1218 + * stop, plugin_stop = result + * + * elif step_cmd == 128: # <<<<<<<<<<<<<< + * stop = False + * back = frame.f_back + */ + goto __pyx_L182; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1294 + * return None if is_call else NO_FTRACE + * + * elif step_cmd in (109, 160): # <<<<<<<<<<<<<< + * stop = is_return and self._is_same_frame(stop_frame, frame) + * + */ + switch (__pyx_v_step_cmd) { + case 0x6D: + case 0xA0: + __pyx_t_10 = 1; + break; + default: + __pyx_t_10 = 0; + break; + } + __pyx_t_16 = __pyx_t_10; + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1295 + * + * elif step_cmd in (109, 160): + * stop = is_return and self._is_same_frame(stop_frame, frame) # <<<<<<<<<<<<<< + * + * else: + */ + if (__pyx_v_is_return) { + } else { + __pyx_t_16 = __pyx_v_is_return; + goto __pyx_L255_bool_binop_done; + } + __pyx_t_4 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self->__pyx_vtab)->_is_same_frame(__pyx_v_self, __pyx_v_stop_frame, __pyx_v_frame); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1295, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1295, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_16 = __pyx_t_10; + __pyx_L255_bool_binop_done:; + __pyx_v_stop = __pyx_t_16; + + /* "_pydevd_bundle/pydevd_cython.pyx":1294 + * return None if is_call else NO_FTRACE + * + * elif step_cmd in (109, 160): # <<<<<<<<<<<<<< + * stop = is_return and self._is_same_frame(stop_frame, frame) + * + */ + goto __pyx_L182; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1298 + * + * else: + * stop = False # <<<<<<<<<<<<<< + * + * if stop and step_cmd != -1 and is_return and hasattr(frame, "f_back"): + */ + /*else*/ { + __pyx_v_stop = 0; + } + __pyx_L182:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1300 + * stop = False + * + * if stop and step_cmd != -1 and is_return and hasattr(frame, "f_back"): # <<<<<<<<<<<<<< + * f_code = getattr(frame.f_back, "f_code", None) + * if f_code is not None: + */ + if (__pyx_v_stop) { + } else { + __pyx_t_16 = __pyx_v_stop; + goto __pyx_L258_bool_binop_done; + } + __pyx_t_10 = (__pyx_v_step_cmd != -1L); + if (__pyx_t_10) { + } else { + __pyx_t_16 = __pyx_t_10; + goto __pyx_L258_bool_binop_done; + } + if (__pyx_v_is_return) { + } else { + __pyx_t_16 = __pyx_v_is_return; + goto __pyx_L258_bool_binop_done; + } + __pyx_t_10 = __Pyx_HasAttr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 1300, __pyx_L173_error) + __pyx_t_16 = __pyx_t_10; + __pyx_L258_bool_binop_done:; + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1301 + * + * if stop and step_cmd != -1 and is_return and hasattr(frame, "f_back"): + * f_code = getattr(frame.f_back, "f_code", None) # <<<<<<<<<<<<<< + * if f_code is not None: + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1301, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = __Pyx_GetAttr3(__pyx_t_4, __pyx_n_s_f_code, Py_None); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1301, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_f_code = __pyx_t_8; + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1302 + * if stop and step_cmd != -1 and is_return and hasattr(frame, "f_back"): + * f_code = getattr(frame.f_back, "f_code", None) + * if f_code is not None: # <<<<<<<<<<<<<< + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + * stop = False + */ + __pyx_t_16 = (__pyx_v_f_code != Py_None); + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1303 + * f_code = getattr(frame.f_back, "f_code", None) + * if f_code is not None: + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: # <<<<<<<<<<<<<< + * stop = False + * + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_get_file_type); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1303, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1303, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_6}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1303, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_PYDEV_FILE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1303, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1303, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1303, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1304 + * if f_code is not None: + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + * stop = False # <<<<<<<<<<<<<< + * + * if plugin_stop: + */ + __pyx_v_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1303 + * f_code = getattr(frame.f_back, "f_code", None) + * if f_code is not None: + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: # <<<<<<<<<<<<<< + * stop = False + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1302 + * if stop and step_cmd != -1 and is_return and hasattr(frame, "f_back"): + * f_code = getattr(frame.f_back, "f_code", None) + * if f_code is not None: # <<<<<<<<<<<<<< + * if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + * stop = False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1300 + * stop = False + * + * if stop and step_cmd != -1 and is_return and hasattr(frame, "f_back"): # <<<<<<<<<<<<<< + * f_code = getattr(frame.f_back, "f_code", None) + * if f_code is not None: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1306 + * stop = False + * + * if plugin_stop: # <<<<<<<<<<<<<< + * plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) + * elif stop: + */ + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_v_plugin_stop); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1306, __pyx_L173_error) + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1307 + * + * if plugin_stop: + * plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) # <<<<<<<<<<<<<< + * elif stop: + * if is_line: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin_manager, __pyx_n_s_stop); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1307, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1307, __pyx_L173_error) + } + __pyx_t_8 = __Pyx_GetItemInt_Tuple(__pyx_v_self->_args, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1307, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_step_cmd); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1307, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[8] = {__pyx_t_3, __pyx_v_py_db, __pyx_v_frame, __pyx_v_event, __pyx_t_8, __pyx_v_stop_info, __pyx_v_arg, __pyx_t_7}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 7+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1307, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1306 + * stop = False + * + * if plugin_stop: # <<<<<<<<<<<<<< + * plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) + * elif stop: + */ + goto __pyx_L264; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1308 + * if plugin_stop: + * plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) + * elif stop: # <<<<<<<<<<<<<< + * if is_line: + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + */ + if (__pyx_v_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1309 + * plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) + * elif stop: + * if is_line: # <<<<<<<<<<<<<< + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + * self.do_wait_suspend(thread, frame, event, arg) + */ + if (__pyx_v_is_line) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1310 + * elif stop: + * if is_line: + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) # <<<<<<<<<<<<<< + * self.do_wait_suspend(thread, frame, event, arg) + * elif is_return: # return event + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_suspend); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1310, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_step_cmd); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1310, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1310, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_INCREF(__pyx_v_thread); + __Pyx_GIVEREF(__pyx_v_thread); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_thread)) __PYX_ERR(0, 1310, __pyx_L173_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_4)) __PYX_ERR(0, 1310, __pyx_L173_error); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1310, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_info->pydev_original_step_cmd); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1310, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_original_step_cmd, __pyx_t_8) < 0) __PYX_ERR(0, 1310, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_7, __pyx_t_4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1310, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1311 + * if is_line: + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + * self.do_wait_suspend(thread, frame, event, arg) # <<<<<<<<<<<<<< + * elif is_return: # return event + * back = frame.f_back + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_do_wait_suspend); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1311, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[5] = {__pyx_t_7, __pyx_v_thread, __pyx_v_frame, __pyx_v_event, __pyx_v_arg}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 4+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1311, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1309 + * plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) + * elif stop: + * if is_line: # <<<<<<<<<<<<<< + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + * self.do_wait_suspend(thread, frame, event, arg) + */ + goto __pyx_L265; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1312 + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + * self.do_wait_suspend(thread, frame, event, arg) + * elif is_return: # return event # <<<<<<<<<<<<<< + * back = frame.f_back + * if back is not None: + */ + if (__pyx_v_is_return) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1313 + * self.do_wait_suspend(thread, frame, event, arg) + * elif is_return: # return event + * back = frame.f_back # <<<<<<<<<<<<<< + * if back is not None: + * # When we get to the pydevd run function, the debugging has actually finished for the main thread + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1313, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_XDECREF_SET(__pyx_v_back, __pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1314 + * elif is_return: # return event + * back = frame.f_back + * if back is not None: # <<<<<<<<<<<<<< + * # When we get to the pydevd run function, the debugging has actually finished for the main thread + * # (note that it can still go on for other threads, but for this one, we just make it finish) + */ + __pyx_t_16 = (__pyx_v_back != Py_None); + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1318 + * # (note that it can still go on for other threads, but for this one, we just make it finish) + * # So, just setting it to None should be OK + * back_absolute_filename, _, base = get_abs_path_real_path_and_base_from_frame(back) # <<<<<<<<<<<<<< + * if (base, back.f_code.co_name) in (DEBUG_START, DEBUG_START_PY3K): + * back = None + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_get_abs_path_real_path_and_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1318, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_v_back}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1318, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_8))) || (PyList_CheckExact(__pyx_t_8))) { + PyObject* sequence = __pyx_t_8; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1318, __pyx_L173_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 2); + } else { + __pyx_t_4 = PyList_GET_ITEM(sequence, 0); + __pyx_t_7 = PyList_GET_ITEM(sequence, 1); + __pyx_t_6 = PyList_GET_ITEM(sequence, 2); + } + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1318, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1318, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1318, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_3 = PyObject_GetIter(__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1318, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_3); + index = 0; __pyx_t_4 = __pyx_t_15(__pyx_t_3); if (unlikely(!__pyx_t_4)) goto __pyx_L267_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + index = 1; __pyx_t_7 = __pyx_t_15(__pyx_t_3); if (unlikely(!__pyx_t_7)) goto __pyx_L267_unpacking_failed; + __Pyx_GOTREF(__pyx_t_7); + index = 2; __pyx_t_6 = __pyx_t_15(__pyx_t_3); if (unlikely(!__pyx_t_6)) goto __pyx_L267_unpacking_failed; + __Pyx_GOTREF(__pyx_t_6); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_3), 3) < 0) __PYX_ERR(0, 1318, __pyx_L173_error) + __pyx_t_15 = NULL; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L268_unpacking_done; + __pyx_L267_unpacking_failed:; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_15 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 1318, __pyx_L173_error) + __pyx_L268_unpacking_done:; + } + __pyx_v_back_absolute_filename = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_v__ = __pyx_t_7; + __pyx_t_7 = 0; + __pyx_v_base = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1319 + * # So, just setting it to None should be OK + * back_absolute_filename, _, base = get_abs_path_real_path_and_base_from_frame(back) + * if (base, back.f_code.co_name) in (DEBUG_START, DEBUG_START_PY3K): # <<<<<<<<<<<<<< + * back = None + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_back, __pyx_n_s_f_code); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_co_name); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_base); + __Pyx_GIVEREF(__pyx_v_base); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_base)) __PYX_ERR(0, 1319, __pyx_L173_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L173_error); + __pyx_t_6 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_DEBUG_START); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyObject_RichCompare(__pyx_t_8, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (!__pyx_t_10) { + } else { + __pyx_t_16 = __pyx_t_10; + goto __pyx_L270_bool_binop_done; + } + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_DEBUG_START_PY3K); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_7, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1319, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_16 = __pyx_t_10; + __pyx_L270_bool_binop_done:; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_10 = __pyx_t_16; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1320 + * back_absolute_filename, _, base = get_abs_path_real_path_and_base_from_frame(back) + * if (base, back.f_code.co_name) in (DEBUG_START, DEBUG_START_PY3K): + * back = None # <<<<<<<<<<<<<< + * + * elif base == TRACE_PROPERTY: + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_back, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1319 + * # So, just setting it to None should be OK + * back_absolute_filename, _, base = get_abs_path_real_path_and_base_from_frame(back) + * if (base, back.f_code.co_name) in (DEBUG_START, DEBUG_START_PY3K): # <<<<<<<<<<<<<< + * back = None + * + */ + goto __pyx_L269; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1322 + * back = None + * + * elif base == TRACE_PROPERTY: # <<<<<<<<<<<<<< + * # We dont want to trace the return event of pydevd_traceproperty (custom property for debugging) + * # if we're in a return, we want it to appear to the user in the previous frame! + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_TRACE_PROPERTY); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1322, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = PyObject_RichCompare(__pyx_v_base, __pyx_t_8, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1322, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1322, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1325 + * # We dont want to trace the return event of pydevd_traceproperty (custom property for debugging) + * # if we're in a return, we want it to appear to the user in the previous frame! + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * elif pydevd_dont_trace.should_trace_hook is not None: + */ + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_6 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1325, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = __pyx_t_8; + __pyx_t_8 = 0; + } + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L177_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1322 + * back = None + * + * elif base == TRACE_PROPERTY: # <<<<<<<<<<<<<< + * # We dont want to trace the return event of pydevd_traceproperty (custom property for debugging) + * # if we're in a return, we want it to appear to the user in the previous frame! + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1327 + * return None if is_call else NO_FTRACE + * + * elif pydevd_dont_trace.should_trace_hook is not None: # <<<<<<<<<<<<<< + * if not pydevd_dont_trace.should_trace_hook(back.f_code, back_absolute_filename): + * # In this case, we'll have to skip the previous one because it shouldn't be traced. + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pydevd_dont_trace); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1327, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_should_trace_hook); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1327, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_10 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1328 + * + * elif pydevd_dont_trace.should_trace_hook is not None: + * if not pydevd_dont_trace.should_trace_hook(back.f_code, back_absolute_filename): # <<<<<<<<<<<<<< + * # In this case, we'll have to skip the previous one because it shouldn't be traced. + * # Also, we have to reset the tracing, because if the parent's parent (or some + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pydevd_dont_trace); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1328, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_should_trace_hook); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1328, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_back, __pyx_n_s_f_code); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1328, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_6, __pyx_v_back_absolute_filename}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1328, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1328, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_16 = (!__pyx_t_10); + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1334 + * # we should anymore (so, a step in/over/return may not stop anywhere if no parent is traced). + * # Related test: _debugger_case17a.py + * py_db.set_trace_for_frame_and_parents(thread.ident, back) # <<<<<<<<<<<<<< + * return None if is_call else NO_FTRACE + * + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_set_trace_for_frame_and_parents); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1334, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_ident_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1334, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_6, __pyx_v_back}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1334, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1335 + * # Related test: _debugger_case17a.py + * py_db.set_trace_for_frame_and_parents(thread.ident, back) + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * if back is not None: + */ + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_8 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1335, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __pyx_t_7; + __pyx_t_7 = 0; + } + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L177_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1328 + * + * elif pydevd_dont_trace.should_trace_hook is not None: + * if not pydevd_dont_trace.should_trace_hook(back.f_code, back_absolute_filename): # <<<<<<<<<<<<<< + * # In this case, we'll have to skip the previous one because it shouldn't be traced. + * # Also, we have to reset the tracing, because if the parent's parent (or some + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1327 + * return None if is_call else NO_FTRACE + * + * elif pydevd_dont_trace.should_trace_hook is not None: # <<<<<<<<<<<<<< + * if not pydevd_dont_trace.should_trace_hook(back.f_code, back_absolute_filename): + * # In this case, we'll have to skip the previous one because it shouldn't be traced. + */ + } + __pyx_L269:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1314 + * elif is_return: # return event + * back = frame.f_back + * if back is not None: # <<<<<<<<<<<<<< + * # When we get to the pydevd run function, the debugging has actually finished for the main thread + * # (note that it can still go on for other threads, but for this one, we just make it finish) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1337 + * return None if is_call else NO_FTRACE + * + * if back is not None: # <<<<<<<<<<<<<< + * # if we're in a return, we want it to appear to the user in the previous frame! + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + */ + __pyx_t_16 = (__pyx_v_back != Py_None); + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1339 + * if back is not None: + * # if we're in a return, we want it to appear to the user in the previous frame! + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) # <<<<<<<<<<<<<< + * self.do_wait_suspend(thread, back, event, arg) + * else: + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_suspend); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1339, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_step_cmd); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1339, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1339, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_v_thread); + __Pyx_GIVEREF(__pyx_v_thread); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_thread)) __PYX_ERR(0, 1339, __pyx_L173_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7)) __PYX_ERR(0, 1339, __pyx_L173_error); + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1339, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_info->pydev_original_step_cmd); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1339, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_original_step_cmd, __pyx_t_4) < 0) __PYX_ERR(0, 1339, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_6, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1339, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1340 + * # if we're in a return, we want it to appear to the user in the previous frame! + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + * self.do_wait_suspend(thread, back, event, arg) # <<<<<<<<<<<<<< + * else: + * # in jython we may not have a back frame + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_do_wait_suspend); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1340, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[5] = {__pyx_t_6, __pyx_v_thread, __pyx_v_back, __pyx_v_event, __pyx_v_arg}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 4+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1340, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1337 + * return None if is_call else NO_FTRACE + * + * if back is not None: # <<<<<<<<<<<<<< + * # if we're in a return, we want it to appear to the user in the previous frame! + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + */ + goto __pyx_L273; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1343 + * else: + * # in jython we may not have a back frame + * info.pydev_step_stop = None # <<<<<<<<<<<<<< + * info.pydev_original_step_cmd = -1 + * info.pydev_step_cmd = -1 + */ + /*else*/ { + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->pydev_step_stop); + __Pyx_DECREF(__pyx_v_info->pydev_step_stop); + __pyx_v_info->pydev_step_stop = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":1344 + * # in jython we may not have a back frame + * info.pydev_step_stop = None + * info.pydev_original_step_cmd = -1 # <<<<<<<<<<<<<< + * info.pydev_step_cmd = -1 + * info.pydev_state = 1 + */ + __pyx_v_info->pydev_original_step_cmd = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1345 + * info.pydev_step_stop = None + * info.pydev_original_step_cmd = -1 + * info.pydev_step_cmd = -1 # <<<<<<<<<<<<<< + * info.pydev_state = 1 + * info.update_stepping_info() + */ + __pyx_v_info->pydev_step_cmd = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1346 + * info.pydev_original_step_cmd = -1 + * info.pydev_step_cmd = -1 + * info.pydev_state = 1 # <<<<<<<<<<<<<< + * info.update_stepping_info() + * + */ + __pyx_v_info->pydev_state = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1347 + * info.pydev_step_cmd = -1 + * info.pydev_state = 1 + * info.update_stepping_info() # <<<<<<<<<<<<<< + * + * # if we are quitting, let's stop the tracing + */ + __pyx_t_4 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v_info->__pyx_vtab)->update_stepping_info(__pyx_v_info, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1347, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_L273:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1312 + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + * self.do_wait_suspend(thread, frame, event, arg) + * elif is_return: # return event # <<<<<<<<<<<<<< + * back = frame.f_back + * if back is not None: + */ + } + __pyx_L265:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1308 + * if plugin_stop: + * plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) + * elif stop: # <<<<<<<<<<<<<< + * if is_line: + * self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + */ + } + __pyx_L264:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1350 + * + * # if we are quitting, let's stop the tracing + * if py_db.quitting: # <<<<<<<<<<<<<< + * return None if is_call else NO_FTRACE + * + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_quitting); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1350, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1350, __pyx_L173_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_16) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1351 + * # if we are quitting, let's stop the tracing + * if py_db.quitting: + * return None if is_call else NO_FTRACE # <<<<<<<<<<<<<< + * + * return self.trace_dispatch + */ + __Pyx_XDECREF(__pyx_r); + if (__pyx_v_is_call) { + __Pyx_INCREF(Py_None); + __pyx_t_4 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1351, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_t_7; + __pyx_t_7 = 0; + } + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L177_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1350 + * + * # if we are quitting, let's stop the tracing + * if py_db.quitting: # <<<<<<<<<<<<<< + * return None if is_call else NO_FTRACE + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1353 + * return None if is_call else NO_FTRACE + * + * return self.trace_dispatch # <<<<<<<<<<<<<< + * except: + * # Unfortunately Python itself stops the tracing when it originates from + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1353, __pyx_L173_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L177_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1115 + * + * # step handling. We stop when we hit the right frame + * try: # <<<<<<<<<<<<<< + * should_skip = 0 + * if pydevd_dont_trace.should_trace_hook is not None: + */ + } + __pyx_L173_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_22); __pyx_t_22 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1354 + * + * return self.trace_dispatch + * except: # <<<<<<<<<<<<<< + * # Unfortunately Python itself stops the tracing when it originates from + * # the tracing function, so, we can't do much about it (just let the user know). + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_7, &__pyx_t_6) < 0) __PYX_ERR(0, 1354, __pyx_L175_except_error) + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_6); + + /* "_pydevd_bundle/pydevd_cython.pyx":1357 + * # Unfortunately Python itself stops the tracing when it originates from + * # the tracing function, so, we can't do much about it (just let the user know). + * exc = sys.exc_info()[0] # <<<<<<<<<<<<<< + * cmd = py_db.cmd_factory.make_console_message( + * "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_sys); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1357, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_exc_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1357, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1357, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1357, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_exc = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1358 + * # the tracing function, so, we can't do much about it (just let the user know). + * exc = sys.exc_info()[0] + * cmd = py_db.cmd_factory.make_console_message( # <<<<<<<<<<<<<< + * "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + * % ( + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_cmd_factory); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1358, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_make_console_message); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1358, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1361 + * "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + * % ( + * exc, # <<<<<<<<<<<<<< + * thread, + * ) + */ + __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1361, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_exc); + __Pyx_GIVEREF(__pyx_v_exc); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_exc)) __PYX_ERR(0, 1361, __pyx_L175_except_error); + __Pyx_INCREF(__pyx_v_thread); + __Pyx_GIVEREF(__pyx_v_thread); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_thread)) __PYX_ERR(0, 1361, __pyx_L175_except_error); + + /* "_pydevd_bundle/pydevd_cython.pyx":1360 + * cmd = py_db.cmd_factory.make_console_message( + * "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + * % ( # <<<<<<<<<<<<<< + * exc, + * thread, + */ + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s_raised_from_within_the_callba, __pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1360, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_1}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1358, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_cmd, __pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1365 + * ) + * ) + * py_db.writer.add_command(cmd) # <<<<<<<<<<<<<< + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + * pydev_log.exception() + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_writer); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1365, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_add_command); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1365, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_cmd}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1365, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1366 + * ) + * py_db.writer.add_command(cmd) + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): # <<<<<<<<<<<<<< + * pydev_log.exception() + * raise + */ + __pyx_t_16 = PyObject_IsSubclass(__pyx_v_exc, __pyx_tuple__7); if (unlikely(__pyx_t_16 == ((int)-1))) __PYX_ERR(0, 1366, __pyx_L175_except_error) + __pyx_t_10 = (!__pyx_t_16); + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1367 + * py_db.writer.add_command(cmd) + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + * pydev_log.exception() # <<<<<<<<<<<<<< + * raise + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1367, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_exception); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1367, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1367, __pyx_L175_except_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1366 + * ) + * py_db.writer.add_command(cmd) + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): # <<<<<<<<<<<<<< + * pydev_log.exception() + * raise + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1368 + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + * pydev_log.exception() + * raise # <<<<<<<<<<<<<< + * + * finally: + */ + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ErrRestoreWithState(__pyx_t_4, __pyx_t_7, __pyx_t_6); + __pyx_t_4 = 0; __pyx_t_7 = 0; __pyx_t_6 = 0; + __PYX_ERR(0, 1368, __pyx_L175_except_error) + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1115 + * + * # step handling. We stop when we hit the right frame + * try: # <<<<<<<<<<<<<< + * should_skip = 0 + * if pydevd_dont_trace.should_trace_hook is not None: + */ + __pyx_L175_except_error:; + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19); + goto __pyx_L4_error; + __pyx_L177_try_return:; + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19); + goto __pyx_L3_return; + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1371 + * + * finally: + * info.is_tracing -= 1 # <<<<<<<<<<<<<< + * + * # end trace_dispatch + */ + /*finally:*/ { + __pyx_L4_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_19 = 0; __pyx_t_18 = 0; __pyx_t_17 = 0; __pyx_t_29 = 0; __pyx_t_28 = 0; __pyx_t_27 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_22); __pyx_t_22 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_29, &__pyx_t_28, &__pyx_t_27); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_19, &__pyx_t_18, &__pyx_t_17) < 0)) __Pyx_ErrFetch(&__pyx_t_19, &__pyx_t_18, &__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_19); + __Pyx_XGOTREF(__pyx_t_18); + __Pyx_XGOTREF(__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_29); + __Pyx_XGOTREF(__pyx_t_28); + __Pyx_XGOTREF(__pyx_t_27); + __pyx_t_11 = __pyx_lineno; __pyx_t_9 = __pyx_clineno; __pyx_t_30 = __pyx_filename; + { + if (unlikely(!__pyx_v_info)) { __Pyx_RaiseUnboundLocalError("info"); __PYX_ERR(0, 1371, __pyx_L279_error) } + if (unlikely(!__pyx_v_info)) { __Pyx_RaiseUnboundLocalError("info"); __PYX_ERR(0, 1371, __pyx_L279_error) } + __pyx_v_info->is_tracing = (__pyx_v_info->is_tracing - 1); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_29); + __Pyx_XGIVEREF(__pyx_t_28); + __Pyx_XGIVEREF(__pyx_t_27); + __Pyx_ExceptionReset(__pyx_t_29, __pyx_t_28, __pyx_t_27); + } + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ErrRestore(__pyx_t_19, __pyx_t_18, __pyx_t_17); + __pyx_t_19 = 0; __pyx_t_18 = 0; __pyx_t_17 = 0; __pyx_t_29 = 0; __pyx_t_28 = 0; __pyx_t_27 = 0; + __pyx_lineno = __pyx_t_11; __pyx_clineno = __pyx_t_9; __pyx_filename = __pyx_t_30; + goto __pyx_L1_error; + __pyx_L279_error:; + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_29); + __Pyx_XGIVEREF(__pyx_t_28); + __Pyx_XGIVEREF(__pyx_t_27); + __Pyx_ExceptionReset(__pyx_t_29, __pyx_t_28, __pyx_t_27); + } + __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0; + __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + __pyx_t_29 = 0; __pyx_t_28 = 0; __pyx_t_27 = 0; + goto __pyx_L1_error; + } + __pyx_L3_return: { + __pyx_t_27 = __pyx_r; + __pyx_r = 0; + __pyx_v_info->is_tracing = (__pyx_v_info->is_tracing - 1); + __pyx_r = __pyx_t_27; + __pyx_t_27 = 0; + goto __pyx_L0; + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":634 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef trace_dispatch(self, frame, str event, arg): # <<<<<<<<<<<<<< + * cdef tuple abs_path_canonical_path_and_base; + * cdef bint is_exception_event; + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_22); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_abs_path_canonical_path_and_base); + __Pyx_XDECREF((PyObject *)__pyx_v_info); + __Pyx_XDECREF(__pyx_v_breakpoints_for_file); + __Pyx_XDECREF(__pyx_v_stop_info); + __Pyx_XDECREF(__pyx_v_curr_func_name); + __Pyx_XDECREF(__pyx_v_frame_skips_cache); + __Pyx_XDECREF(__pyx_v_frame_cache_key); + __Pyx_XDECREF(__pyx_v_line_cache_key); + __Pyx_XDECREF(__pyx_v_bp); + __Pyx_XDECREF(__pyx_v_pydev_smart_step_into_variants); + __Pyx_XDECREF(__pyx_v_py_db); + __Pyx_XDECREF(__pyx_v_thread); + __Pyx_XDECREF(__pyx_v_plugin_manager); + __Pyx_XDECREF(__pyx_v_stop_frame); + __Pyx_XDECREF(__pyx_v_function_breakpoint_on_call_event); + __Pyx_XDECREF(__pyx_v_returns_cache_key); + __Pyx_XDECREF(__pyx_v_return_lines); + __Pyx_XDECREF(__pyx_v_x); + __Pyx_XDECREF(__pyx_v_f); + __Pyx_XDECREF(__pyx_v_exc_info); + __Pyx_XDECREF(__pyx_v_func_lines); + __Pyx_XDECREF(__pyx_v_offset_and_lineno); + __Pyx_XDECREF(__pyx_v_breakpoint); + __Pyx_XDECREF(__pyx_v_stop_reason); + __Pyx_XDECREF(__pyx_v_bp_type); + __Pyx_XDECREF(__pyx_v_new_frame); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_eval_result); + __Pyx_XDECREF(__pyx_v_cmd); + __Pyx_XDECREF(__pyx_v_exc); + __Pyx_XDECREF(__pyx_v_plugin_stop); + __Pyx_XDECREF(__pyx_v_force_check_project_scope); + __Pyx_XDECREF(__pyx_v_filename); + __Pyx_XDECREF(__pyx_v_f2); + __Pyx_XDECREF(__pyx_v_back); + __Pyx_XDECREF(__pyx_v_smart_step_into_variant); + __Pyx_XDECREF(__pyx_v_children_variants); + __Pyx_XDECREF(__pyx_v_f_code); + __Pyx_XDECREF(__pyx_v_back_absolute_filename); + __Pyx_XDECREF(__pyx_v__); + __Pyx_XDECREF(__pyx_v_base); + __Pyx_XDECREF(__pyx_v_frame); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_11trace_dispatch(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_11trace_dispatch = {"trace_dispatch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_11trace_dispatch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_11trace_dispatch(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_event = 0; + PyObject *__pyx_v_arg = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("trace_dispatch (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 634, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 634, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_dispatch", 1, 3, 3, 1); __PYX_ERR(0, 634, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 634, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_dispatch", 1, 3, 3, 2); __PYX_ERR(0, 634, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "trace_dispatch") < 0)) __PYX_ERR(0, 634, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_frame = values[0]; + __pyx_v_event = ((PyObject*)values[1]); + __pyx_v_arg = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("trace_dispatch", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 634, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_event), (&PyString_Type), 1, "event", 1))) __PYX_ERR(0, 634, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_10trace_dispatch(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self), __pyx_v_frame, __pyx_v_event, __pyx_v_arg); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_10trace_dispatch(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trace_dispatch", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_trace_dispatch(__pyx_v_self, __pyx_v_frame, __pyx_v_event, __pyx_v_arg, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_13__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_13__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_13__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_13__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_12__reduce_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_12__reduce_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self._args, self.exc_info, self.should_skip) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->should_skip); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_self->_args); + __Pyx_GIVEREF(__pyx_v_self->_args); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->_args)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->exc_info); + __Pyx_GIVEREF(__pyx_v_self->exc_info); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->exc_info)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self._args, self.exc_info, self.should_skip) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v__dict = __pyx_t_2; + __pyx_t_2 = 0; + + /* "(tree fragment)":7 + * state = (self._args, self.exc_info, self.should_skip) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_3 = (__pyx_v__dict != Py_None); + if (__pyx_t_3) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict)) __PYX_ERR(2, 8, __pyx_L1_error); + __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self._args is not None or self.exc_info is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self._args, self.exc_info, self.should_skip) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self._args is not None or self.exc_info is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, None), state + */ + /*else*/ { + __pyx_t_4 = (__pyx_v_self->_args != ((PyObject*)Py_None)); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = (__pyx_v_self->exc_info != Py_None); + __pyx_t_3 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_3; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self._args is not None or self.exc_info is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self._args is not None or self.exc_info is not None + * if use_setstate: + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle_PyDBFrame); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_61391470); + __Pyx_GIVEREF(__pyx_int_61391470); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_61391470)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self._args is not None or self.exc_info is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, None), state + * else: + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_PyDBFrame__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_PyDBFrame); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_61391470); + __Pyx_GIVEREF(__pyx_int_61391470); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_61391470)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_5 = 0; + __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBFrame__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_15__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_15__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_15__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_15__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(2, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(2, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_14__setstate_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_14__setstate_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_PyDBFrame__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_PyDBFrame__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBFrame__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.PyDBFrame.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1377 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def should_stop_on_exception(py_db, PyDBAdditionalThreadInfo info, frame, thread, arg, prev_user_uncaught_exc_info, is_unwind=False): # <<<<<<<<<<<<<< + * cdef bint should_stop; + * cdef bint was_just_raised; + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_13should_stop_on_exception(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_13should_stop_on_exception = {"should_stop_on_exception", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_13should_stop_on_exception, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_13should_stop_on_exception(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_py_db = 0; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info = 0; + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_thread = 0; + PyObject *__pyx_v_arg = 0; + PyObject *__pyx_v_prev_user_uncaught_exc_info = 0; + PyObject *__pyx_v_is_unwind = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[7] = {0,0,0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("should_stop_on_exception (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_py_db,&__pyx_n_s_info,&__pyx_n_s_frame,&__pyx_n_s_thread,&__pyx_n_s_arg,&__pyx_n_s_prev_user_uncaught_exc_info,&__pyx_n_s_is_unwind,0}; + values[6] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)((PyObject *)Py_False))); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6); + CYTHON_FALLTHROUGH; + case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_py_db)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_info)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("should_stop_on_exception", 0, 6, 7, 1); __PYX_ERR(0, 1377, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("should_stop_on_exception", 0, 6, 7, 2); __PYX_ERR(0, 1377, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_thread)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("should_stop_on_exception", 0, 6, 7, 3); __PYX_ERR(0, 1377, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("should_stop_on_exception", 0, 6, 7, 4); __PYX_ERR(0, 1377, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 5: + if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_prev_user_uncaught_exc_info)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[5]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("should_stop_on_exception", 0, 6, 7, 5); __PYX_ERR(0, 1377, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 6: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_is_unwind); + if (value) { values[6] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "should_stop_on_exception") < 0)) __PYX_ERR(0, 1377, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6); + CYTHON_FALLTHROUGH; + case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5); + values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_py_db = values[0]; + __pyx_v_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)values[1]); + __pyx_v_frame = values[2]; + __pyx_v_thread = values[3]; + __pyx_v_arg = values[4]; + __pyx_v_prev_user_uncaught_exc_info = values[5]; + __pyx_v_is_unwind = values[6]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("should_stop_on_exception", 0, 6, 7, __pyx_nargs); __PYX_ERR(0, 1377, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.should_stop_on_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_info), __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, 1, "info", 0))) __PYX_ERR(0, 1377, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_12should_stop_on_exception(__pyx_self, __pyx_v_py_db, __pyx_v_info, __pyx_v_frame, __pyx_v_thread, __pyx_v_arg, __pyx_v_prev_user_uncaught_exc_info, __pyx_v_is_unwind); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_12should_stop_on_exception(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_py_db, struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_info, PyObject *__pyx_v_frame, PyObject *__pyx_v_thread, PyObject *__pyx_v_arg, PyObject *__pyx_v_prev_user_uncaught_exc_info, PyObject *__pyx_v_is_unwind) { + int __pyx_v_should_stop; + int __pyx_v_was_just_raised; + PyObject *__pyx_v_check_excs = 0; + PyObject *__pyx_v_maybe_user_uncaught_exc_info = NULL; + PyObject *__pyx_v_exception = NULL; + PyObject *__pyx_v_value = NULL; + PyObject *__pyx_v_trace = NULL; + PyObject *__pyx_v_exception_breakpoint = NULL; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_exc_break_user = NULL; + PyObject *__pyx_v_exc_break_caught = NULL; + PyObject *__pyx_v_exc_break = NULL; + PyObject *__pyx_v_is_user_uncaught = NULL; + PyObject *__pyx_v_exc_info = NULL; + PyObject *__pyx_v_lines = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *(*__pyx_t_6)(PyObject *); + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + unsigned int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + PyObject *__pyx_t_17 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("should_stop_on_exception", 0); + __Pyx_INCREF(__pyx_v_frame); + + /* "_pydevd_bundle/pydevd_cython.pyx":1385 + * # ENDIF + * + * should_stop = False # <<<<<<<<<<<<<< + * maybe_user_uncaught_exc_info = prev_user_uncaught_exc_info + * + */ + __pyx_v_should_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1386 + * + * should_stop = False + * maybe_user_uncaught_exc_info = prev_user_uncaught_exc_info # <<<<<<<<<<<<<< + * + * # 2 = 2 + */ + __Pyx_INCREF(__pyx_v_prev_user_uncaught_exc_info); + __pyx_v_maybe_user_uncaught_exc_info = __pyx_v_prev_user_uncaught_exc_info; + + /* "_pydevd_bundle/pydevd_cython.pyx":1389 + * + * # 2 = 2 + * if info.pydev_state != 2: # and breakpoint is not None: # <<<<<<<<<<<<<< + * exception, value, trace = arg + * + */ + __pyx_t_1 = (__pyx_v_info->pydev_state != 2); + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1390 + * # 2 = 2 + * if info.pydev_state != 2: # and breakpoint is not None: + * exception, value, trace = arg # <<<<<<<<<<<<<< + * + * if trace is not None and hasattr(trace, "tb_next"): + */ + if ((likely(PyTuple_CheckExact(__pyx_v_arg))) || (PyList_CheckExact(__pyx_v_arg))) { + PyObject* sequence = __pyx_v_arg; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1390, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); + } else { + __pyx_t_2 = PyList_GET_ITEM(sequence, 0); + __pyx_t_3 = PyList_GET_ITEM(sequence, 1); + __pyx_t_4 = PyList_GET_ITEM(sequence, 2); + } + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1390, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1390, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1390, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + Py_ssize_t index = -1; + __pyx_t_5 = PyObject_GetIter(__pyx_v_arg); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1390, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_5); + index = 0; __pyx_t_2 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_2)) goto __pyx_L4_unpacking_failed; + __Pyx_GOTREF(__pyx_t_2); + index = 1; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L4_unpacking_failed; + __Pyx_GOTREF(__pyx_t_3); + index = 2; __pyx_t_4 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L4_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 3) < 0) __PYX_ERR(0, 1390, __pyx_L1_error) + __pyx_t_6 = NULL; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L5_unpacking_done; + __pyx_L4_unpacking_failed:; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 1390, __pyx_L1_error) + __pyx_L5_unpacking_done:; + } + __pyx_v_exception = __pyx_t_2; + __pyx_t_2 = 0; + __pyx_v_value = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_trace = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1392 + * exception, value, trace = arg + * + * if trace is not None and hasattr(trace, "tb_next"): # <<<<<<<<<<<<<< + * # on jython trace is None on the first event and it may not have a tb_next. + * + */ + __pyx_t_7 = (__pyx_v_trace != Py_None); + if (__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_7 = __Pyx_HasAttr(__pyx_v_trace, __pyx_n_s_tb_next); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(0, 1392, __pyx_L1_error) + __pyx_t_1 = __pyx_t_7; + __pyx_L7_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1395 + * # on jython trace is None on the first event and it may not have a tb_next. + * + * should_stop = False # <<<<<<<<<<<<<< + * exception_breakpoint = None + * try: + */ + __pyx_v_should_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1396 + * + * should_stop = False + * exception_breakpoint = None # <<<<<<<<<<<<<< + * try: + * if py_db.plugin is not None: + */ + __Pyx_INCREF(Py_None); + __pyx_v_exception_breakpoint = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":1397 + * should_stop = False + * exception_breakpoint = None + * try: # <<<<<<<<<<<<<< + * if py_db.plugin is not None: + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1398 + * exception_breakpoint = None + * try: + * if py_db.plugin is not None: # <<<<<<<<<<<<<< + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + * if result: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_plugin); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1398, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = (__pyx_t_4 != Py_None); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1399 + * try: + * if py_db.plugin is not None: + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) # <<<<<<<<<<<<<< + * if result: + * should_stop, frame = result + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_plugin); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1399, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_exception_break); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1399, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[6] = {__pyx_t_3, __pyx_v_py_db, __pyx_v_frame, __pyx_v_thread, __pyx_v_arg, __pyx_v_is_unwind}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_11, 5+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1399, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_result = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1400 + * if py_db.plugin is not None: + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + * if result: # <<<<<<<<<<<<<< + * should_stop, frame = result + * except: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_result); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1400, __pyx_L9_error) + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1401 + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + * if result: + * should_stop, frame = result # <<<<<<<<<<<<<< + * except: + * pydev_log.exception() + */ + if ((likely(PyTuple_CheckExact(__pyx_v_result))) || (PyList_CheckExact(__pyx_v_result))) { + PyObject* sequence = __pyx_v_result; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1401, __pyx_L9_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_4 = PyList_GET_ITEM(sequence, 0); + __pyx_t_2 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_2); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1401, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1401, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_2); + #endif + } else { + Py_ssize_t index = -1; + __pyx_t_3 = PyObject_GetIter(__pyx_v_result); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1401, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_3); + index = 0; __pyx_t_4 = __pyx_t_6(__pyx_t_3); if (unlikely(!__pyx_t_4)) goto __pyx_L17_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + index = 1; __pyx_t_2 = __pyx_t_6(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L17_unpacking_failed; + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_3), 2) < 0) __PYX_ERR(0, 1401, __pyx_L9_error) + __pyx_t_6 = NULL; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L18_unpacking_done; + __pyx_L17_unpacking_failed:; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 1401, __pyx_L9_error) + __pyx_L18_unpacking_done:; + } + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1401, __pyx_L9_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_should_stop = __pyx_t_1; + __Pyx_DECREF_SET(__pyx_v_frame, __pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1400 + * if py_db.plugin is not None: + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + * if result: # <<<<<<<<<<<<<< + * should_stop, frame = result + * except: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1398 + * exception_breakpoint = None + * try: + * if py_db.plugin is not None: # <<<<<<<<<<<<<< + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + * if result: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1397 + * should_stop = False + * exception_breakpoint = None + * try: # <<<<<<<<<<<<<< + * if py_db.plugin is not None: + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + */ + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L14_try_end; + __pyx_L9_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1402 + * if result: + * should_stop, frame = result + * except: # <<<<<<<<<<<<<< + * pydev_log.exception() + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.should_stop_on_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_4, &__pyx_t_3) < 0) __PYX_ERR(0, 1402, __pyx_L11_except_error) + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_3); + + /* "_pydevd_bundle/pydevd_cython.pyx":1403 + * should_stop, frame = result + * except: + * pydev_log.exception() # <<<<<<<<<<<<<< + * + * if not should_stop: + */ + __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1403, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_exception); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1403, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_t_12 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_13))) { + __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13); + if (likely(__pyx_t_12)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13); + __Pyx_INCREF(__pyx_t_12); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_13, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_12, NULL}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_13, __pyx_callargs+1-__pyx_t_11, 0+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1403, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L10_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1397 + * should_stop = False + * exception_breakpoint = None + * try: # <<<<<<<<<<<<<< + * if py_db.plugin is not None: + * result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + */ + __pyx_L11_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L10_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L14_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1405 + * pydev_log.exception() + * + * if not should_stop: # <<<<<<<<<<<<<< + * # Apply checks that don't need the exception breakpoint (where we shouldn't ever stop). + * if exception == SystemExit and py_db.ignore_system_exit_code(value): + */ + __pyx_t_1 = (!__pyx_v_should_stop); + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1407 + * if not should_stop: + * # Apply checks that don't need the exception breakpoint (where we shouldn't ever stop). + * if exception == SystemExit and py_db.ignore_system_exit_code(value): # <<<<<<<<<<<<<< + * pass + * + */ + __pyx_t_3 = PyObject_RichCompare(__pyx_v_exception, __pyx_builtin_SystemExit, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1407, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1407, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L23_bool_binop_done; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_ignore_system_exit_code); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1407, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_value}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_11, 1+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1407, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1407, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_1 = __pyx_t_7; + __pyx_L23_bool_binop_done:; + if (__pyx_t_1) { + goto __pyx_L22; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1410 + * pass + * + * elif exception in (GeneratorExit, StopIteration, StopAsyncIteration): # <<<<<<<<<<<<<< + * # These exceptions are control-flow related (they work as a generator + * # pause), so, we shouldn't stop on them. + */ + __Pyx_INCREF(__pyx_v_exception); + __pyx_t_3 = __pyx_v_exception; + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_builtin_GeneratorExit, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1410, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1410, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L25_bool_binop_done; + } + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_builtin_StopIteration, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1410, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1410, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L25_bool_binop_done; + } + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_StopAsyncIteration); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1410, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1410, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1410, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = __pyx_t_7; + __pyx_L25_bool_binop_done:; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_7 = __pyx_t_1; + if (__pyx_t_7) { + goto __pyx_L22; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1415 + * pass + * + * elif ignore_exception_trace(trace): # <<<<<<<<<<<<<< + * pass + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ignore_exception_trace); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_trace}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_11, 1+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1415, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_7) { + goto __pyx_L22; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1419 + * + * else: + * was_just_raised = trace.tb_next is None # <<<<<<<<<<<<<< + * + * # It was not handled by any plugin, lets check exception breakpoints. + */ + /*else*/ { + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_trace, __pyx_n_s_tb_next); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1419, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = (__pyx_t_3 == Py_None); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_was_just_raised = __pyx_t_7; + + /* "_pydevd_bundle/pydevd_cython.pyx":1422 + * + * # It was not handled by any plugin, lets check exception breakpoints. + * check_excs = [] # <<<<<<<<<<<<<< + * + * # Note: check user unhandled before regular exceptions. + */ + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1422, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_check_excs = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1425 + * + * # Note: check user unhandled before regular exceptions. + * exc_break_user = py_db.get_exception_breakpoint(exception, py_db.break_on_user_uncaught_exceptions) # <<<<<<<<<<<<<< + * if exc_break_user is not None: + * check_excs.append((exc_break_user, True)) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_get_exception_breakpoint); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_break_on_user_uncaught_exception); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_v_exception, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_11, 2+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_exc_break_user = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1426 + * # Note: check user unhandled before regular exceptions. + * exc_break_user = py_db.get_exception_breakpoint(exception, py_db.break_on_user_uncaught_exceptions) + * if exc_break_user is not None: # <<<<<<<<<<<<<< + * check_excs.append((exc_break_user, True)) + * + */ + __pyx_t_7 = (__pyx_v_exc_break_user != Py_None); + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1427 + * exc_break_user = py_db.get_exception_breakpoint(exception, py_db.break_on_user_uncaught_exceptions) + * if exc_break_user is not None: + * check_excs.append((exc_break_user, True)) # <<<<<<<<<<<<<< + * + * exc_break_caught = py_db.get_exception_breakpoint(exception, py_db.break_on_caught_exceptions) + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_exc_break_user); + __Pyx_GIVEREF(__pyx_v_exc_break_user); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_exc_break_user)) __PYX_ERR(0, 1427, __pyx_L1_error); + __Pyx_INCREF(Py_True); + __Pyx_GIVEREF(Py_True); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, Py_True)) __PYX_ERR(0, 1427, __pyx_L1_error); + __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_check_excs, __pyx_t_3); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 1427, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1426 + * # Note: check user unhandled before regular exceptions. + * exc_break_user = py_db.get_exception_breakpoint(exception, py_db.break_on_user_uncaught_exceptions) + * if exc_break_user is not None: # <<<<<<<<<<<<<< + * check_excs.append((exc_break_user, True)) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1429 + * check_excs.append((exc_break_user, True)) + * + * exc_break_caught = py_db.get_exception_breakpoint(exception, py_db.break_on_caught_exceptions) # <<<<<<<<<<<<<< + * if exc_break_caught is not None: + * check_excs.append((exc_break_caught, False)) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_get_exception_breakpoint); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_break_on_caught_exceptions); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_v_exception, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_11, 2+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_exc_break_caught = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1430 + * + * exc_break_caught = py_db.get_exception_breakpoint(exception, py_db.break_on_caught_exceptions) + * if exc_break_caught is not None: # <<<<<<<<<<<<<< + * check_excs.append((exc_break_caught, False)) + * + */ + __pyx_t_7 = (__pyx_v_exc_break_caught != Py_None); + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1431 + * exc_break_caught = py_db.get_exception_breakpoint(exception, py_db.break_on_caught_exceptions) + * if exc_break_caught is not None: + * check_excs.append((exc_break_caught, False)) # <<<<<<<<<<<<<< + * + * for exc_break, is_user_uncaught in check_excs: + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_exc_break_caught); + __Pyx_GIVEREF(__pyx_v_exc_break_caught); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_exc_break_caught)) __PYX_ERR(0, 1431, __pyx_L1_error); + __Pyx_INCREF(Py_False); + __Pyx_GIVEREF(Py_False); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, Py_False)) __PYX_ERR(0, 1431, __pyx_L1_error); + __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_check_excs, __pyx_t_3); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 1431, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1430 + * + * exc_break_caught = py_db.get_exception_breakpoint(exception, py_db.break_on_caught_exceptions) + * if exc_break_caught is not None: # <<<<<<<<<<<<<< + * check_excs.append((exc_break_caught, False)) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1433 + * check_excs.append((exc_break_caught, False)) + * + * for exc_break, is_user_uncaught in check_excs: # <<<<<<<<<<<<<< + * # Initially mark that it should stop and then go into exclusions. + * should_stop = True + */ + __pyx_t_3 = __pyx_v_check_excs; __Pyx_INCREF(__pyx_t_3); + __pyx_t_15 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_3); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 1433, __pyx_L1_error) + #endif + if (__pyx_t_15 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_15); __Pyx_INCREF(__pyx_t_2); __pyx_t_15++; if (unlikely((0 < 0))) __PYX_ERR(0, 1433, __pyx_L1_error) + #else + __pyx_t_2 = __Pyx_PySequence_ITEM(__pyx_t_3, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + #endif + if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1433, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_4 = PyList_GET_ITEM(sequence, 0); + __pyx_t_5 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_13 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_13); + index = 0; __pyx_t_4 = __pyx_t_6(__pyx_t_13); if (unlikely(!__pyx_t_4)) goto __pyx_L32_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + index = 1; __pyx_t_5 = __pyx_t_6(__pyx_t_13); if (unlikely(!__pyx_t_5)) goto __pyx_L32_unpacking_failed; + __Pyx_GOTREF(__pyx_t_5); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_13), 2) < 0) __PYX_ERR(0, 1433, __pyx_L1_error) + __pyx_t_6 = NULL; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L33_unpacking_done; + __pyx_L32_unpacking_failed:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_6 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 1433, __pyx_L1_error) + __pyx_L33_unpacking_done:; + } + __Pyx_XDECREF_SET(__pyx_v_exc_break, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_XDECREF_SET(__pyx_v_is_user_uncaught, __pyx_t_5); + __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1435 + * for exc_break, is_user_uncaught in check_excs: + * # Initially mark that it should stop and then go into exclusions. + * should_stop = True # <<<<<<<<<<<<<< + * + * if py_db.exclude_exception_by_filter(exc_break, trace): + */ + __pyx_v_should_stop = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1437 + * should_stop = True + * + * if py_db.exclude_exception_by_filter(exc_break, trace): # <<<<<<<<<<<<<< + * pydev_log.debug( + * "Ignore exception %s in library %s -- (%s)" % (exception, frame.f_code.co_filename, frame.f_code.co_name) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_exclude_exception_by_filter); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1437, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_v_exc_break, __pyx_v_trace}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_11, 2+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1437, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1437, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1438 + * + * if py_db.exclude_exception_by_filter(exc_break, trace): + * pydev_log.debug( # <<<<<<<<<<<<<< + * "Ignore exception %s in library %s -- (%s)" % (exception, frame.f_code.co_filename, frame.f_code.co_name) + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1438, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_debug); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1438, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1439 + * if py_db.exclude_exception_by_filter(exc_break, trace): + * pydev_log.debug( + * "Ignore exception %s in library %s -- (%s)" % (exception, frame.f_code.co_filename, frame.f_code.co_name) # <<<<<<<<<<<<<< + * ) + * should_stop = False + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1439, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1439, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1439, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_co_name); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1439, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1439, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_exception); + __Pyx_GIVEREF(__pyx_v_exception); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_exception)) __PYX_ERR(0, 1439, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_13); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_13)) __PYX_ERR(0, 1439, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_12); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_12)) __PYX_ERR(0, 1439, __pyx_L1_error); + __pyx_t_13 = 0; + __pyx_t_12 = 0; + __pyx_t_12 = __Pyx_PyString_Format(__pyx_kp_s_Ignore_exception_s_in_library_s, __pyx_t_5); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1439, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_12}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_11, 1+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1438, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1441 + * "Ignore exception %s in library %s -- (%s)" % (exception, frame.f_code.co_filename, frame.f_code.co_name) + * ) + * should_stop = False # <<<<<<<<<<<<<< + * + * elif exc_break.condition is not None and not py_db.handle_breakpoint_condition(info, exc_break, frame): + */ + __pyx_v_should_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1437 + * should_stop = True + * + * if py_db.exclude_exception_by_filter(exc_break, trace): # <<<<<<<<<<<<<< + * pydev_log.debug( + * "Ignore exception %s in library %s -- (%s)" % (exception, frame.f_code.co_filename, frame.f_code.co_name) + */ + goto __pyx_L34; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1443 + * should_stop = False + * + * elif exc_break.condition is not None and not py_db.handle_breakpoint_condition(info, exc_break, frame): # <<<<<<<<<<<<<< + * should_stop = False + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_exc_break, __pyx_n_s_condition); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1443, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = (__pyx_t_2 != Py_None); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_1) { + } else { + __pyx_t_7 = __pyx_t_1; + goto __pyx_L35_bool_binop_done; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_handle_breakpoint_condition); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1443, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_12 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_12)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_12); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_12, ((PyObject *)__pyx_v_info), __pyx_v_exc_break, __pyx_v_frame}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_11, 3+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1443, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1443, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_16 = (!__pyx_t_1); + __pyx_t_7 = __pyx_t_16; + __pyx_L35_bool_binop_done:; + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1444 + * + * elif exc_break.condition is not None and not py_db.handle_breakpoint_condition(info, exc_break, frame): + * should_stop = False # <<<<<<<<<<<<<< + * + * elif is_user_uncaught: + */ + __pyx_v_should_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1443 + * should_stop = False + * + * elif exc_break.condition is not None and not py_db.handle_breakpoint_condition(info, exc_break, frame): # <<<<<<<<<<<<<< + * should_stop = False + * + */ + goto __pyx_L34; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1446 + * should_stop = False + * + * elif is_user_uncaught: # <<<<<<<<<<<<<< + * # Note: we don't stop here, we just collect the exc_info to use later on... + * should_stop = False + */ + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_is_user_uncaught); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1446, __pyx_L1_error) + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1448 + * elif is_user_uncaught: + * # Note: we don't stop here, we just collect the exc_info to use later on... + * should_stop = False # <<<<<<<<<<<<<< + * if not py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + */ + __pyx_v_should_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1449 + * # Note: we don't stop here, we just collect the exc_info to use later on... + * should_stop = False + * if not py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( # <<<<<<<<<<<<<< + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + * ): + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_t_12 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_12)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_12); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_12, __pyx_v_frame, __pyx_t_5, Py_True}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_11, 3+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1449, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = (!__pyx_t_16); + if (__pyx_t_1) { + } else { + __pyx_t_7 = __pyx_t_1; + goto __pyx_L38_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1450 + * should_stop = False + * if not py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) # <<<<<<<<<<<<<< + * ): + * # User uncaught means that we're currently in user code but the code + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = (__pyx_t_2 == Py_None); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_1) { + } else { + __pyx_t_7 = __pyx_t_1; + goto __pyx_L38_bool_binop_done; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_f_code); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_13, __pyx_t_5, __pyx_t_12, Py_True}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_11, 3+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1450, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_7 = __pyx_t_1; + __pyx_L38_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1449 + * # Note: we don't stop here, we just collect the exc_info to use later on... + * should_stop = False + * if not py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( # <<<<<<<<<<<<<< + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + * ): + */ + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1454 + * # User uncaught means that we're currently in user code but the code + * # up the stack is library code. + * exc_info = prev_user_uncaught_exc_info # <<<<<<<<<<<<<< + * if not exc_info: + * exc_info = (arg, frame.f_lineno, set([frame.f_lineno])) + */ + __Pyx_INCREF(__pyx_v_prev_user_uncaught_exc_info); + __Pyx_XDECREF_SET(__pyx_v_exc_info, __pyx_v_prev_user_uncaught_exc_info); + + /* "_pydevd_bundle/pydevd_cython.pyx":1455 + * # up the stack is library code. + * exc_info = prev_user_uncaught_exc_info + * if not exc_info: # <<<<<<<<<<<<<< + * exc_info = (arg, frame.f_lineno, set([frame.f_lineno])) + * else: + */ + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_exc_info); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1455, __pyx_L1_error) + __pyx_t_1 = (!__pyx_t_7); + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1456 + * exc_info = prev_user_uncaught_exc_info + * if not exc_info: + * exc_info = (arg, frame.f_lineno, set([frame.f_lineno])) # <<<<<<<<<<<<<< + * else: + * lines = exc_info[2] + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1456, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1456, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_12 = PySet_New(0); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1456, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + if (PySet_Add(__pyx_t_12, __pyx_t_4) < 0) __PYX_ERR(0, 1456, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1456, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_arg); + __Pyx_GIVEREF(__pyx_v_arg); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_arg)) __PYX_ERR(0, 1456, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2)) __PYX_ERR(0, 1456, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_12); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_12)) __PYX_ERR(0, 1456, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_12 = 0; + __Pyx_DECREF_SET(__pyx_v_exc_info, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1455 + * # up the stack is library code. + * exc_info = prev_user_uncaught_exc_info + * if not exc_info: # <<<<<<<<<<<<<< + * exc_info = (arg, frame.f_lineno, set([frame.f_lineno])) + * else: + */ + goto __pyx_L41; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1458 + * exc_info = (arg, frame.f_lineno, set([frame.f_lineno])) + * else: + * lines = exc_info[2] # <<<<<<<<<<<<<< + * lines.add(frame.f_lineno) + * exc_info = (arg, frame.f_lineno, lines) + */ + /*else*/ { + __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_exc_info, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1458, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_lines, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1459 + * else: + * lines = exc_info[2] + * lines.add(frame.f_lineno) # <<<<<<<<<<<<<< + * exc_info = (arg, frame.f_lineno, lines) + * maybe_user_uncaught_exc_info = exc_info + */ + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_lines, __pyx_n_s_add); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1459, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1459, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_12))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_12); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_12, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_2}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_11, 1+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1459, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1460 + * lines = exc_info[2] + * lines.add(frame.f_lineno) + * exc_info = (arg, frame.f_lineno, lines) # <<<<<<<<<<<<<< + * maybe_user_uncaught_exc_info = exc_info + * else: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1460, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1460, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_INCREF(__pyx_v_arg); + __Pyx_GIVEREF(__pyx_v_arg); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_arg)) __PYX_ERR(0, 1460, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_4)) __PYX_ERR(0, 1460, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_lines); + __Pyx_GIVEREF(__pyx_v_lines); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_v_lines)) __PYX_ERR(0, 1460, __pyx_L1_error); + __pyx_t_4 = 0; + __Pyx_DECREF_SET(__pyx_v_exc_info, __pyx_t_12); + __pyx_t_12 = 0; + } + __pyx_L41:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1461 + * lines.add(frame.f_lineno) + * exc_info = (arg, frame.f_lineno, lines) + * maybe_user_uncaught_exc_info = exc_info # <<<<<<<<<<<<<< + * else: + * # I.e.: these are only checked if we're not dealing with user uncaught exceptions. + */ + __Pyx_INCREF(__pyx_v_exc_info); + __Pyx_DECREF_SET(__pyx_v_maybe_user_uncaught_exc_info, __pyx_v_exc_info); + + /* "_pydevd_bundle/pydevd_cython.pyx":1449 + * # Note: we don't stop here, we just collect the exc_info to use later on... + * should_stop = False + * if not py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( # <<<<<<<<<<<<<< + * frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + * ): + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1446 + * should_stop = False + * + * elif is_user_uncaught: # <<<<<<<<<<<<<< + * # Note: we don't stop here, we just collect the exc_info to use later on... + * should_stop = False + */ + goto __pyx_L34; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1464 + * else: + * # I.e.: these are only checked if we're not dealing with user uncaught exceptions. + * if ( # <<<<<<<<<<<<<< + * exc_break.notify_on_first_raise_only + * and py_db.skip_on_exceptions_thrown_in_same_context + */ + /*else*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1465 + * # I.e.: these are only checked if we're not dealing with user uncaught exceptions. + * if ( + * exc_break.notify_on_first_raise_only # <<<<<<<<<<<<<< + * and py_db.skip_on_exceptions_thrown_in_same_context + * and not was_just_raised + */ + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_exc_break, __pyx_n_s_notify_on_first_raise_only); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1465, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1465, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L43_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1466 + * if ( + * exc_break.notify_on_first_raise_only + * and py_db.skip_on_exceptions_thrown_in_same_context # <<<<<<<<<<<<<< + * and not was_just_raised + * and not just_raised(trace.tb_next) + */ + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_skip_on_exceptions_thrown_in_sam); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1466, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1466, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L43_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1467 + * exc_break.notify_on_first_raise_only + * and py_db.skip_on_exceptions_thrown_in_same_context + * and not was_just_raised # <<<<<<<<<<<<<< + * and not just_raised(trace.tb_next) + * ): + */ + __pyx_t_7 = (!__pyx_v_was_just_raised); + if (__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L43_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1468 + * and py_db.skip_on_exceptions_thrown_in_same_context + * and not was_just_raised + * and not just_raised(trace.tb_next) # <<<<<<<<<<<<<< + * ): + * # In this case we never stop if it was just raised, so, to know if it was the first we + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_just_raised); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1468, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_trace, __pyx_n_s_tb_next); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1468, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_2}; + __pyx_t_12 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_11, 1+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1468, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1468, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_t_16 = (!__pyx_t_7); + __pyx_t_1 = __pyx_t_16; + __pyx_L43_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1464 + * else: + * # I.e.: these are only checked if we're not dealing with user uncaught exceptions. + * if ( # <<<<<<<<<<<<<< + * exc_break.notify_on_first_raise_only + * and py_db.skip_on_exceptions_thrown_in_same_context + */ + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1472 + * # In this case we never stop if it was just raised, so, to know if it was the first we + * # need to check if we're in the 2nd method. + * should_stop = False # I.e.: we stop only when we're at the caller of a method that throws an exception # <<<<<<<<<<<<<< + * + * elif ( + */ + __pyx_v_should_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1464 + * else: + * # I.e.: these are only checked if we're not dealing with user uncaught exceptions. + * if ( # <<<<<<<<<<<<<< + * exc_break.notify_on_first_raise_only + * and py_db.skip_on_exceptions_thrown_in_same_context + */ + goto __pyx_L42; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1475 + * + * elif ( + * exc_break.notify_on_first_raise_only # <<<<<<<<<<<<<< + * and not py_db.skip_on_exceptions_thrown_in_same_context + * and not was_just_raised + */ + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_exc_break, __pyx_n_s_notify_on_first_raise_only); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1475, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1475, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (__pyx_t_16) { + } else { + __pyx_t_1 = __pyx_t_16; + goto __pyx_L47_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1476 + * elif ( + * exc_break.notify_on_first_raise_only + * and not py_db.skip_on_exceptions_thrown_in_same_context # <<<<<<<<<<<<<< + * and not was_just_raised + * ): + */ + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_skip_on_exceptions_thrown_in_sam); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1476, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 1476, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_t_7 = (!__pyx_t_16); + if (__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L47_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1477 + * exc_break.notify_on_first_raise_only + * and not py_db.skip_on_exceptions_thrown_in_same_context + * and not was_just_raised # <<<<<<<<<<<<<< + * ): + * should_stop = False # I.e.: we stop only when it was just raised + */ + __pyx_t_7 = (!__pyx_v_was_just_raised); + __pyx_t_1 = __pyx_t_7; + __pyx_L47_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1474 + * should_stop = False # I.e.: we stop only when we're at the caller of a method that throws an exception + * + * elif ( # <<<<<<<<<<<<<< + * exc_break.notify_on_first_raise_only + * and not py_db.skip_on_exceptions_thrown_in_same_context + */ + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1479 + * and not was_just_raised + * ): + * should_stop = False # I.e.: we stop only when it was just raised # <<<<<<<<<<<<<< + * + * elif was_just_raised and py_db.skip_on_exceptions_thrown_in_same_context: + */ + __pyx_v_should_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1474 + * should_stop = False # I.e.: we stop only when we're at the caller of a method that throws an exception + * + * elif ( # <<<<<<<<<<<<<< + * exc_break.notify_on_first_raise_only + * and not py_db.skip_on_exceptions_thrown_in_same_context + */ + goto __pyx_L42; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1481 + * should_stop = False # I.e.: we stop only when it was just raised + * + * elif was_just_raised and py_db.skip_on_exceptions_thrown_in_same_context: # <<<<<<<<<<<<<< + * # Option: Don't break if an exception is caught in the same function from which it is thrown + * should_stop = False + */ + if (__pyx_v_was_just_raised) { + } else { + __pyx_t_1 = __pyx_v_was_just_raised; + goto __pyx_L50_bool_binop_done; + } + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_skip_on_exceptions_thrown_in_sam); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1481, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1481, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_t_1 = __pyx_t_7; + __pyx_L50_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1483 + * elif was_just_raised and py_db.skip_on_exceptions_thrown_in_same_context: + * # Option: Don't break if an exception is caught in the same function from which it is thrown + * should_stop = False # <<<<<<<<<<<<<< + * + * if should_stop: + */ + __pyx_v_should_stop = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1481 + * should_stop = False # I.e.: we stop only when it was just raised + * + * elif was_just_raised and py_db.skip_on_exceptions_thrown_in_same_context: # <<<<<<<<<<<<<< + * # Option: Don't break if an exception is caught in the same function from which it is thrown + * should_stop = False + */ + } + __pyx_L42:; + } + __pyx_L34:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1485 + * should_stop = False + * + * if should_stop: # <<<<<<<<<<<<<< + * exception_breakpoint = exc_break + * try: + */ + if (__pyx_v_should_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1486 + * + * if should_stop: + * exception_breakpoint = exc_break # <<<<<<<<<<<<<< + * try: + * info.pydev_message = exc_break.qname + */ + __Pyx_INCREF(__pyx_v_exc_break); + __Pyx_DECREF_SET(__pyx_v_exception_breakpoint, __pyx_v_exc_break); + + /* "_pydevd_bundle/pydevd_cython.pyx":1487 + * if should_stop: + * exception_breakpoint = exc_break + * try: # <<<<<<<<<<<<<< + * info.pydev_message = exc_break.qname + * except: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_8); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1488 + * exception_breakpoint = exc_break + * try: + * info.pydev_message = exc_break.qname # <<<<<<<<<<<<<< + * except: + * info.pydev_message = exc_break.qname.encode("utf-8") + */ + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_exc_break, __pyx_n_s_qname); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1488, __pyx_L53_error) + __Pyx_GOTREF(__pyx_t_12); + if (!(likely(PyString_CheckExact(__pyx_t_12))||((__pyx_t_12) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_12))) __PYX_ERR(0, 1488, __pyx_L53_error) + __Pyx_GIVEREF(__pyx_t_12); + __Pyx_GOTREF(__pyx_v_info->pydev_message); + __Pyx_DECREF(__pyx_v_info->pydev_message); + __pyx_v_info->pydev_message = ((PyObject*)__pyx_t_12); + __pyx_t_12 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1487 + * if should_stop: + * exception_breakpoint = exc_break + * try: # <<<<<<<<<<<<<< + * info.pydev_message = exc_break.qname + * except: + */ + } + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L60_try_end; + __pyx_L53_error:; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1489 + * try: + * info.pydev_message = exc_break.qname + * except: # <<<<<<<<<<<<<< + * info.pydev_message = exc_break.qname.encode("utf-8") + * break + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.should_stop_on_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_12, &__pyx_t_4, &__pyx_t_2) < 0) __PYX_ERR(0, 1489, __pyx_L55_except_error) + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + + /* "_pydevd_bundle/pydevd_cython.pyx":1490 + * info.pydev_message = exc_break.qname + * except: + * info.pydev_message = exc_break.qname.encode("utf-8") # <<<<<<<<<<<<<< + * break + * + */ + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_exc_break, __pyx_n_s_qname); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1490, __pyx_L55_except_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_encode); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 1490, __pyx_L55_except_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_17))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_17); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_17); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_17, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_13, __pyx_kp_s_utf_8}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_17, __pyx_callargs+1-__pyx_t_11, 1+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1490, __pyx_L55_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + } + if (!(likely(PyString_CheckExact(__pyx_t_5))||((__pyx_t_5) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_5))) __PYX_ERR(0, 1490, __pyx_L55_except_error) + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_v_info->pydev_message); + __Pyx_DECREF(__pyx_v_info->pydev_message); + __pyx_v_info->pydev_message = ((PyObject*)__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L54_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1487 + * if should_stop: + * exception_breakpoint = exc_break + * try: # <<<<<<<<<<<<<< + * info.pydev_message = exc_break.qname + * except: + */ + __pyx_L55_except_error:; + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_9, __pyx_t_8); + goto __pyx_L1_error; + __pyx_L54_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_9, __pyx_t_8); + __pyx_L60_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1491 + * except: + * info.pydev_message = exc_break.qname.encode("utf-8") + * break # <<<<<<<<<<<<<< + * + * if should_stop: + */ + goto __pyx_L31_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1485 + * should_stop = False + * + * if should_stop: # <<<<<<<<<<<<<< + * exception_breakpoint = exc_break + * try: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1433 + * check_excs.append((exc_break_caught, False)) + * + * for exc_break, is_user_uncaught in check_excs: # <<<<<<<<<<<<<< + * # Initially mark that it should stop and then go into exclusions. + * should_stop = True + */ + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L63_for_end; + __pyx_L31_break:; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L63_for_end; + __pyx_L63_for_end:; + } + __pyx_L22:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1405 + * pydev_log.exception() + * + * if not should_stop: # <<<<<<<<<<<<<< + * # Apply checks that don't need the exception breakpoint (where we shouldn't ever stop). + * if exception == SystemExit and py_db.ignore_system_exit_code(value): + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1493 + * break + * + * if should_stop: # <<<<<<<<<<<<<< + * # Always add exception to frame (must remove later after we proceed). + * add_exception_to_frame(frame, (exception, value, trace)) + */ + if (__pyx_v_should_stop) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1495 + * if should_stop: + * # Always add exception to frame (must remove later after we proceed). + * add_exception_to_frame(frame, (exception, value, trace)) # <<<<<<<<<<<<<< + * + * if exception_breakpoint is not None and exception_breakpoint.expression is not None: + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_add_exception_to_frame); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1495, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1495, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_exception); + __Pyx_GIVEREF(__pyx_v_exception); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_exception)) __PYX_ERR(0, 1495, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_value)) __PYX_ERR(0, 1495, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_trace); + __Pyx_GIVEREF(__pyx_v_trace); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_trace)) __PYX_ERR(0, 1495, __pyx_L1_error); + __pyx_t_12 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_12)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_12); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_12, __pyx_v_frame, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_11, 2+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1495, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1497 + * add_exception_to_frame(frame, (exception, value, trace)) + * + * if exception_breakpoint is not None and exception_breakpoint.expression is not None: # <<<<<<<<<<<<<< + * py_db.handle_breakpoint_expression(exception_breakpoint, info, frame) + * + */ + __pyx_t_7 = (__pyx_v_exception_breakpoint != Py_None); + if (__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L66_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_exception_breakpoint, __pyx_n_s_expression); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1497, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = (__pyx_t_3 != Py_None); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_1 = __pyx_t_7; + __pyx_L66_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1498 + * + * if exception_breakpoint is not None and exception_breakpoint.expression is not None: + * py_db.handle_breakpoint_expression(exception_breakpoint, info, frame) # <<<<<<<<<<<<<< + * + * return should_stop, frame, maybe_user_uncaught_exc_info + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_handle_breakpoint_expression); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1498, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + __pyx_t_11 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_11 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_v_exception_breakpoint, ((PyObject *)__pyx_v_info), __pyx_v_frame}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_11, 3+__pyx_t_11); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1498, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1497 + * add_exception_to_frame(frame, (exception, value, trace)) + * + * if exception_breakpoint is not None and exception_breakpoint.expression is not None: # <<<<<<<<<<<<<< + * py_db.handle_breakpoint_expression(exception_breakpoint, info, frame) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1493 + * break + * + * if should_stop: # <<<<<<<<<<<<<< + * # Always add exception to frame (must remove later after we proceed). + * add_exception_to_frame(frame, (exception, value, trace)) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1392 + * exception, value, trace = arg + * + * if trace is not None and hasattr(trace, "tb_next"): # <<<<<<<<<<<<<< + * # on jython trace is None on the first event and it may not have a tb_next. + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1389 + * + * # 2 = 2 + * if info.pydev_state != 2: # and breakpoint is not None: # <<<<<<<<<<<<<< + * exception, value, trace = arg + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1500 + * py_db.handle_breakpoint_expression(exception_breakpoint, info, frame) + * + * return should_stop, frame, maybe_user_uncaught_exc_info # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_should_stop); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1500, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1500, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3)) __PYX_ERR(0, 1500, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_frame); + __Pyx_GIVEREF(__pyx_v_frame); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_frame)) __PYX_ERR(0, 1500, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_maybe_user_uncaught_exc_info); + __Pyx_GIVEREF(__pyx_v_maybe_user_uncaught_exc_info); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_maybe_user_uncaught_exc_info)) __PYX_ERR(0, 1500, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1377 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def should_stop_on_exception(py_db, PyDBAdditionalThreadInfo info, frame, thread, arg, prev_user_uncaught_exc_info, is_unwind=False): # <<<<<<<<<<<<<< + * cdef bint should_stop; + * cdef bint was_just_raised; + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.should_stop_on_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_check_excs); + __Pyx_XDECREF(__pyx_v_maybe_user_uncaught_exc_info); + __Pyx_XDECREF(__pyx_v_exception); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF(__pyx_v_trace); + __Pyx_XDECREF(__pyx_v_exception_breakpoint); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_exc_break_user); + __Pyx_XDECREF(__pyx_v_exc_break_caught); + __Pyx_XDECREF(__pyx_v_exc_break); + __Pyx_XDECREF(__pyx_v_is_user_uncaught); + __Pyx_XDECREF(__pyx_v_exc_info); + __Pyx_XDECREF(__pyx_v_lines); + __Pyx_XDECREF(__pyx_v_frame); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1510 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def handle_exception(py_db, thread, frame, arg, str exception_type): # <<<<<<<<<<<<<< + * cdef bint stopped; + * cdef tuple abs_real_path_and_base; + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15handle_exception(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_15handle_exception = {"handle_exception", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15handle_exception, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15handle_exception(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_py_db = 0; + PyObject *__pyx_v_thread = 0; + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_arg = 0; + PyObject *__pyx_v_exception_type = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("handle_exception (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_py_db,&__pyx_n_s_thread,&__pyx_n_s_frame,&__pyx_n_s_arg,&__pyx_n_s_exception_type,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_py_db)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1510, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_thread)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1510, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("handle_exception", 1, 5, 5, 1); __PYX_ERR(0, 1510, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1510, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("handle_exception", 1, 5, 5, 2); __PYX_ERR(0, 1510, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1510, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("handle_exception", 1, 5, 5, 3); __PYX_ERR(0, 1510, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_exception_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1510, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("handle_exception", 1, 5, 5, 4); __PYX_ERR(0, 1510, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "handle_exception") < 0)) __PYX_ERR(0, 1510, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + } + __pyx_v_py_db = values[0]; + __pyx_v_thread = values[1]; + __pyx_v_frame = values[2]; + __pyx_v_arg = values[3]; + __pyx_v_exception_type = ((PyObject*)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("handle_exception", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 1510, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.handle_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_exception_type), (&PyString_Type), 1, "exception_type", 1))) __PYX_ERR(0, 1510, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_14handle_exception(__pyx_self, __pyx_v_py_db, __pyx_v_thread, __pyx_v_frame, __pyx_v_arg, __pyx_v_exception_type); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_14handle_exception(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_py_db, PyObject *__pyx_v_thread, PyObject *__pyx_v_frame, PyObject *__pyx_v_arg, PyObject *__pyx_v_exception_type) { + int __pyx_v_stopped; + PyObject *__pyx_v_abs_real_path_and_base = 0; + PyObject *__pyx_v_absolute_filename = 0; + PyObject *__pyx_v_canonical_normalized_filename = 0; + PyObject *__pyx_v_lines_ignored = 0; + PyObject *__pyx_v_frame_id_to_frame = 0; + PyObject *__pyx_v_merged = 0; + PyObject *__pyx_v_trace_obj = 0; + PyObject *__pyx_v_initial_trace_obj = NULL; + PyObject *__pyx_v_check_trace_obj = NULL; + PyObject *__pyx_v_curr_stat = NULL; + PyObject *__pyx_v_last_stat = NULL; + PyObject *__pyx_v_from_user_input = NULL; + PyObject *__pyx_v_exc_lineno = NULL; + PyObject *__pyx_v_line = NULL; + PyObject *__pyx_v_f = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + int __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + int __pyx_t_16; + int __pyx_t_17; + char const *__pyx_t_18; + PyObject *__pyx_t_19 = NULL; + PyObject *__pyx_t_20 = NULL; + PyObject *__pyx_t_21 = NULL; + PyObject *__pyx_t_22 = NULL; + PyObject *__pyx_t_23 = NULL; + PyObject *__pyx_t_24 = NULL; + char const *__pyx_t_25; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("handle_exception", 0); + __Pyx_INCREF(__pyx_v_py_db); + __Pyx_INCREF(__pyx_v_thread); + __Pyx_INCREF(__pyx_v_frame); + + /* "_pydevd_bundle/pydevd_cython.pyx":1522 + * # def handle_exception(py_db, thread, frame, arg, exception_type): + * # ENDIF + * stopped = False # <<<<<<<<<<<<<< + * try: + * # print('handle_exception', frame.f_lineno, frame.f_code.co_name) + */ + __pyx_v_stopped = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1523 + * # ENDIF + * stopped = False + * try: # <<<<<<<<<<<<<< + * # print('handle_exception', frame.f_lineno, frame.f_code.co_name) + * + */ + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1527 + * + * # We have 3 things in arg: exception type, description, traceback object + * trace_obj = arg[2] # <<<<<<<<<<<<<< + * + * initial_trace_obj = trace_obj + */ + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_arg, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1527, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_trace_obj = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1529 + * trace_obj = arg[2] + * + * initial_trace_obj = trace_obj # <<<<<<<<<<<<<< + * if trace_obj.tb_next is None and trace_obj.tb_frame is frame: + * # I.e.: tb_next should be only None in the context it was thrown (trace_obj.tb_frame is frame is just a double check). + */ + __Pyx_INCREF(__pyx_v_trace_obj); + __pyx_v_initial_trace_obj = __pyx_v_trace_obj; + + /* "_pydevd_bundle/pydevd_cython.pyx":1530 + * + * initial_trace_obj = trace_obj + * if trace_obj.tb_next is None and trace_obj.tb_frame is frame: # <<<<<<<<<<<<<< + * # I.e.: tb_next should be only None in the context it was thrown (trace_obj.tb_frame is frame is just a double check). + * pass + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_trace_obj, __pyx_n_s_tb_next); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1530, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_t_1 == Py_None); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_trace_obj, __pyx_n_s_tb_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1530, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_t_1 == __pyx_v_frame); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_2 = __pyx_t_3; + __pyx_L7_bool_binop_done:; + if (__pyx_t_2) { + goto __pyx_L6; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1535 + * else: + * # Get the trace_obj from where the exception was raised... + * while trace_obj.tb_next is not None: # <<<<<<<<<<<<<< + * trace_obj = trace_obj.tb_next + * + */ + /*else*/ { + while (1) { + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_trace_obj, __pyx_n_s_tb_next); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1535, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__pyx_t_1 != Py_None); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!__pyx_t_2) break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1536 + * # Get the trace_obj from where the exception was raised... + * while trace_obj.tb_next is not None: + * trace_obj = trace_obj.tb_next # <<<<<<<<<<<<<< + * + * if py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_trace_obj, __pyx_n_s_tb_next); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1536, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_trace_obj, __pyx_t_1); + __pyx_t_1 = 0; + } + } + __pyx_L6:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1538 + * trace_obj = trace_obj.tb_next + * + * if py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception: # <<<<<<<<<<<<<< + * for check_trace_obj in (initial_trace_obj, trace_obj): + * abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_ignore_exceptions_thrown_in_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1538, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1538, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1539 + * + * if py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception: + * for check_trace_obj in (initial_trace_obj, trace_obj): # <<<<<<<<<<<<<< + * abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) + * absolute_filename = abs_real_path_and_base[0] + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1539, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_initial_trace_obj); + __Pyx_GIVEREF(__pyx_v_initial_trace_obj); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_initial_trace_obj)) __PYX_ERR(0, 1539, __pyx_L4_error); + __Pyx_INCREF(__pyx_v_trace_obj); + __Pyx_GIVEREF(__pyx_v_trace_obj); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_trace_obj)) __PYX_ERR(0, 1539, __pyx_L4_error); + __pyx_t_4 = __pyx_t_1; __Pyx_INCREF(__pyx_t_4); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 1539, __pyx_L4_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1539, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_check_trace_obj, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1540 + * if py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception: + * for check_trace_obj in (initial_trace_obj, trace_obj): + * abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) # <<<<<<<<<<<<<< + * absolute_filename = abs_real_path_and_base[0] + * canonical_normalized_filename = abs_real_path_and_base[1] + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_get_abs_path_real_path_and_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1540, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_check_trace_obj, __pyx_n_s_tb_frame); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1540, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_7}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1540, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(0, 1540, __pyx_L4_error) + __Pyx_XDECREF_SET(__pyx_v_abs_real_path_and_base, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1541 + * for check_trace_obj in (initial_trace_obj, trace_obj): + * abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) + * absolute_filename = abs_real_path_and_base[0] # <<<<<<<<<<<<<< + * canonical_normalized_filename = abs_real_path_and_base[1] + * + */ + if (unlikely(__pyx_v_abs_real_path_and_base == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1541, __pyx_L4_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v_abs_real_path_and_base, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1541, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(0, 1541, __pyx_L4_error) + __Pyx_XDECREF_SET(__pyx_v_absolute_filename, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1542 + * abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) + * absolute_filename = abs_real_path_and_base[0] + * canonical_normalized_filename = abs_real_path_and_base[1] # <<<<<<<<<<<<<< + * + * lines_ignored = filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + */ + if (unlikely(__pyx_v_abs_real_path_and_base == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1542, __pyx_L4_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v_abs_real_path_and_base, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1542, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(0, 1542, __pyx_L4_error) + __Pyx_XDECREF_SET(__pyx_v_canonical_normalized_filename, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1544 + * canonical_normalized_filename = abs_real_path_and_base[1] + * + * lines_ignored = filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) # <<<<<<<<<<<<<< + * if lines_ignored is None: + * lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_filename_to_lines_where_exceptio); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1544, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_get); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1544, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_canonical_normalized_filename}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1544, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + if (!(likely(PyDict_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_1))) __PYX_ERR(0, 1544, __pyx_L4_error) + __Pyx_XDECREF_SET(__pyx_v_lines_ignored, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1545 + * + * lines_ignored = filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + * if lines_ignored is None: # <<<<<<<<<<<<<< + * lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + * + */ + __pyx_t_2 = (__pyx_v_lines_ignored == ((PyObject*)Py_None)); + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1546 + * lines_ignored = filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + * if lines_ignored is None: + * lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} # <<<<<<<<<<<<<< + * + * try: + */ + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1546, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_lines_ignored, __pyx_t_1); + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_filename_to_lines_where_exceptio); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1546, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + if (unlikely((PyObject_SetItem(__pyx_t_7, __pyx_v_canonical_normalized_filename, __pyx_t_1) < 0))) __PYX_ERR(0, 1546, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1545 + * + * lines_ignored = filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + * if lines_ignored is None: # <<<<<<<<<<<<<< + * lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1548 + * lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + * + * try: # <<<<<<<<<<<<<< + * curr_stat = os.stat(absolute_filename) + * curr_stat = (curr_stat.st_size, curr_stat.st_mtime) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1549 + * + * try: + * curr_stat = os.stat(absolute_filename) # <<<<<<<<<<<<<< + * curr_stat = (curr_stat.st_size, curr_stat.st_mtime) + * except: + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_os); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1549, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_stat); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1549, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_v_absolute_filename}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1549, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_curr_stat, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1550 + * try: + * curr_stat = os.stat(absolute_filename) + * curr_stat = (curr_stat.st_size, curr_stat.st_mtime) # <<<<<<<<<<<<<< + * except: + * curr_stat = None + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_curr_stat, __pyx_n_s_st_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1550, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_curr_stat, __pyx_n_s_st_mtime); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1550, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1550, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_1)) __PYX_ERR(0, 1550, __pyx_L15_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6)) __PYX_ERR(0, 1550, __pyx_L15_error); + __pyx_t_1 = 0; + __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_curr_stat, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1548 + * lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + * + * try: # <<<<<<<<<<<<<< + * curr_stat = os.stat(absolute_filename) + * curr_stat = (curr_stat.st_size, curr_stat.st_mtime) + */ + } + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + goto __pyx_L22_try_end; + __pyx_L15_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1551 + * curr_stat = os.stat(absolute_filename) + * curr_stat = (curr_stat.st_size, curr_stat.st_mtime) + * except: # <<<<<<<<<<<<<< + * curr_stat = None + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.handle_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_6, &__pyx_t_1) < 0) __PYX_ERR(0, 1551, __pyx_L17_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1552 + * curr_stat = (curr_stat.st_size, curr_stat.st_mtime) + * except: + * curr_stat = None # <<<<<<<<<<<<<< + * + * last_stat = filename_to_stat_info.get(absolute_filename) + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_curr_stat, Py_None); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L16_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1548 + * lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + * + * try: # <<<<<<<<<<<<<< + * curr_stat = os.stat(absolute_filename) + * curr_stat = (curr_stat.st_size, curr_stat.st_mtime) + */ + __pyx_L17_except_error:; + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + goto __pyx_L4_error; + __pyx_L16_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + __pyx_L22_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1554 + * curr_stat = None + * + * last_stat = filename_to_stat_info.get(absolute_filename) # <<<<<<<<<<<<<< + * if last_stat != curr_stat: + * filename_to_stat_info[absolute_filename] = curr_stat + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_filename_to_stat_info); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1554, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_get); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1554, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_absolute_filename}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1554, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_last_stat, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1555 + * + * last_stat = filename_to_stat_info.get(absolute_filename) + * if last_stat != curr_stat: # <<<<<<<<<<<<<< + * filename_to_stat_info[absolute_filename] = curr_stat + * lines_ignored.clear() + */ + __pyx_t_1 = PyObject_RichCompare(__pyx_v_last_stat, __pyx_v_curr_stat, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1555, __pyx_L4_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1555, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1556 + * last_stat = filename_to_stat_info.get(absolute_filename) + * if last_stat != curr_stat: + * filename_to_stat_info[absolute_filename] = curr_stat # <<<<<<<<<<<<<< + * lines_ignored.clear() + * try: + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_filename_to_stat_info); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1556, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely((PyObject_SetItem(__pyx_t_1, __pyx_v_absolute_filename, __pyx_v_curr_stat) < 0))) __PYX_ERR(0, 1556, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1557 + * if last_stat != curr_stat: + * filename_to_stat_info[absolute_filename] = curr_stat + * lines_ignored.clear() # <<<<<<<<<<<<<< + * try: + * linecache.checkcache(absolute_filename) + */ + if (unlikely(__pyx_v_lines_ignored == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "clear"); + __PYX_ERR(0, 1557, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_PyDict_Clear(__pyx_v_lines_ignored); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 1557, __pyx_L4_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1558 + * filename_to_stat_info[absolute_filename] = curr_stat + * lines_ignored.clear() + * try: # <<<<<<<<<<<<<< + * linecache.checkcache(absolute_filename) + * except: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1559 + * lines_ignored.clear() + * try: + * linecache.checkcache(absolute_filename) # <<<<<<<<<<<<<< + * except: + * pydev_log.exception("Error in linecache.checkcache(%r)", absolute_filename) + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_linecache); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1559, __pyx_L26_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_checkcache); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1559, __pyx_L26_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_v_absolute_filename}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1559, __pyx_L26_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1558 + * filename_to_stat_info[absolute_filename] = curr_stat + * lines_ignored.clear() + * try: # <<<<<<<<<<<<<< + * linecache.checkcache(absolute_filename) + * except: + */ + } + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L33_try_end; + __pyx_L26_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1560 + * try: + * linecache.checkcache(absolute_filename) + * except: # <<<<<<<<<<<<<< + * pydev_log.exception("Error in linecache.checkcache(%r)", absolute_filename) + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.handle_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 1560, __pyx_L28_except_error) + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "_pydevd_bundle/pydevd_cython.pyx":1561 + * linecache.checkcache(absolute_filename) + * except: + * pydev_log.exception("Error in linecache.checkcache(%r)", absolute_filename) # <<<<<<<<<<<<<< + * + * from_user_input = py_db.filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + */ + __Pyx_GetModuleGlobalName(__pyx_t_14, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1561, __pyx_L28_except_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_14, __pyx_n_s_exception); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 1561, __pyx_L28_except_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_14 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_15))) { + __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_15); + if (likely(__pyx_t_14)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_15); + __Pyx_INCREF(__pyx_t_14); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_15, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_14, __pyx_kp_s_Error_in_linecache_checkcache_r, __pyx_v_absolute_filename}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_15, __pyx_callargs+1-__pyx_t_9, 2+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1561, __pyx_L28_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L27_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1558 + * filename_to_stat_info[absolute_filename] = curr_stat + * lines_ignored.clear() + * try: # <<<<<<<<<<<<<< + * linecache.checkcache(absolute_filename) + * except: + */ + __pyx_L28_except_error:; + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_11, __pyx_t_10); + goto __pyx_L4_error; + __pyx_L27_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_11, __pyx_t_10); + __pyx_L33_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1555 + * + * last_stat = filename_to_stat_info.get(absolute_filename) + * if last_stat != curr_stat: # <<<<<<<<<<<<<< + * filename_to_stat_info[absolute_filename] = curr_stat + * lines_ignored.clear() + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1563 + * pydev_log.exception("Error in linecache.checkcache(%r)", absolute_filename) + * + * from_user_input = py_db.filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) # <<<<<<<<<<<<<< + * if from_user_input: + * merged = {} + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_filename_to_lines_where_exceptio); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1563, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_get); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1563, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_canonical_normalized_filename}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1563, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_from_user_input, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1564 + * + * from_user_input = py_db.filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + * if from_user_input: # <<<<<<<<<<<<<< + * merged = {} + * merged.update(lines_ignored) + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_user_input); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1564, __pyx_L4_error) + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1565 + * from_user_input = py_db.filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + * if from_user_input: + * merged = {} # <<<<<<<<<<<<<< + * merged.update(lines_ignored) + * # Override what we have with the related entries that the user entered + */ + __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1565, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XDECREF_SET(__pyx_v_merged, ((PyObject*)__pyx_t_7)); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1566 + * if from_user_input: + * merged = {} + * merged.update(lines_ignored) # <<<<<<<<<<<<<< + * # Override what we have with the related entries that the user entered + * merged.update(from_user_input) + */ + __pyx_t_7 = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_update, __pyx_v_merged, __pyx_v_lines_ignored); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1566, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1568 + * merged.update(lines_ignored) + * # Override what we have with the related entries that the user entered + * merged.update(from_user_input) # <<<<<<<<<<<<<< + * else: + * merged = lines_ignored + */ + __pyx_t_7 = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_update, __pyx_v_merged, __pyx_v_from_user_input); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1568, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1564 + * + * from_user_input = py_db.filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + * if from_user_input: # <<<<<<<<<<<<<< + * merged = {} + * merged.update(lines_ignored) + */ + goto __pyx_L36; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1570 + * merged.update(from_user_input) + * else: + * merged = lines_ignored # <<<<<<<<<<<<<< + * + * exc_lineno = check_trace_obj.tb_lineno + */ + /*else*/ { + __Pyx_INCREF(__pyx_v_lines_ignored); + __Pyx_XDECREF_SET(__pyx_v_merged, __pyx_v_lines_ignored); + } + __pyx_L36:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1572 + * merged = lines_ignored + * + * exc_lineno = check_trace_obj.tb_lineno # <<<<<<<<<<<<<< + * + * # print ('lines ignored', lines_ignored) + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_check_trace_obj, __pyx_n_s_tb_lineno); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1572, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XDECREF_SET(__pyx_v_exc_lineno, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1578 + * # print ('merged', merged, 'curr', exc_lineno) + * + * if exc_lineno not in merged: # Note: check on merged but update lines_ignored. # <<<<<<<<<<<<<< + * try: + * line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + */ + if (unlikely(__pyx_v_merged == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 1578, __pyx_L4_error) + } + __pyx_t_2 = (__Pyx_PyDict_ContainsTF(__pyx_v_exc_lineno, __pyx_v_merged, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1578, __pyx_L4_error) + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1579 + * + * if exc_lineno not in merged: # Note: check on merged but update lines_ignored. + * try: # <<<<<<<<<<<<<< + * line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + * except: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1580 + * if exc_lineno not in merged: # Note: check on merged but update lines_ignored. + * try: + * line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) # <<<<<<<<<<<<<< + * except: + * pydev_log.exception("Error in linecache.getline(%r, %s, f_globals)", absolute_filename, exc_lineno) + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_linecache); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1580, __pyx_L38_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_getline); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1580, __pyx_L38_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_check_trace_obj, __pyx_n_s_tb_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1580, __pyx_L38_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_f_globals); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1580, __pyx_L38_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_1, __pyx_v_absolute_filename, __pyx_v_exc_lineno, __pyx_t_8}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_9, 3+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1580, __pyx_L38_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_line, __pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1579 + * + * if exc_lineno not in merged: # Note: check on merged but update lines_ignored. + * try: # <<<<<<<<<<<<<< + * line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + * except: + */ + } + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + goto __pyx_L45_try_end; + __pyx_L38_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1581 + * try: + * line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + * except: # <<<<<<<<<<<<<< + * pydev_log.exception("Error in linecache.getline(%r, %s, f_globals)", absolute_filename, exc_lineno) + * line = "" + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.handle_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_6, &__pyx_t_8) < 0) __PYX_ERR(0, 1581, __pyx_L40_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_8); + + /* "_pydevd_bundle/pydevd_cython.pyx":1582 + * line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + * except: + * pydev_log.exception("Error in linecache.getline(%r, %s, f_globals)", absolute_filename, exc_lineno) # <<<<<<<<<<<<<< + * line = "" + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_15, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 1582, __pyx_L40_except_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_15, __pyx_n_s_exception); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1582, __pyx_L40_except_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_15 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_14))) { + __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_14); + if (likely(__pyx_t_15)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14); + __Pyx_INCREF(__pyx_t_15); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_14, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_15, __pyx_kp_s_Error_in_linecache_getline_r_s_f, __pyx_v_absolute_filename, __pyx_v_exc_lineno}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_14, __pyx_callargs+1-__pyx_t_9, 3+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1582, __pyx_L40_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1583 + * except: + * pydev_log.exception("Error in linecache.getline(%r, %s, f_globals)", absolute_filename, exc_lineno) + * line = "" # <<<<<<<<<<<<<< + * + * if IGNORE_EXCEPTION_TAG.match(line) is not None: + */ + __Pyx_INCREF(__pyx_kp_s_); + __Pyx_XDECREF_SET(__pyx_v_line, __pyx_kp_s_); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L39_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1579 + * + * if exc_lineno not in merged: # Note: check on merged but update lines_ignored. + * try: # <<<<<<<<<<<<<< + * line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + * except: + */ + __pyx_L40_except_error:; + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + goto __pyx_L4_error; + __pyx_L39_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + __pyx_L45_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1585 + * line = "" + * + * if IGNORE_EXCEPTION_TAG.match(line) is not None: # <<<<<<<<<<<<<< + * lines_ignored[exc_lineno] = 1 + * return False + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_IGNORE_EXCEPTION_TAG); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1585, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_match); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1585, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_line}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1585, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_t_2 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1586 + * + * if IGNORE_EXCEPTION_TAG.match(line) is not None: + * lines_ignored[exc_lineno] = 1 # <<<<<<<<<<<<<< + * return False + * else: + */ + if (unlikely(__pyx_v_lines_ignored == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1586, __pyx_L4_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_lines_ignored, __pyx_v_exc_lineno, __pyx_int_1) < 0))) __PYX_ERR(0, 1586, __pyx_L4_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1587 + * if IGNORE_EXCEPTION_TAG.match(line) is not None: + * lines_ignored[exc_lineno] = 1 + * return False # <<<<<<<<<<<<<< + * else: + * # Put in the cache saying not to ignore + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1585 + * line = "" + * + * if IGNORE_EXCEPTION_TAG.match(line) is not None: # <<<<<<<<<<<<<< + * lines_ignored[exc_lineno] = 1 + * return False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1590 + * else: + * # Put in the cache saying not to ignore + * lines_ignored[exc_lineno] = 0 # <<<<<<<<<<<<<< + * else: + * # Ok, dict has it already cached, so, let's check it... + */ + /*else*/ { + if (unlikely(__pyx_v_lines_ignored == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1590, __pyx_L4_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_lines_ignored, __pyx_v_exc_lineno, __pyx_int_0) < 0))) __PYX_ERR(0, 1590, __pyx_L4_error) + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1578 + * # print ('merged', merged, 'curr', exc_lineno) + * + * if exc_lineno not in merged: # Note: check on merged but update lines_ignored. # <<<<<<<<<<<<<< + * try: + * line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + */ + goto __pyx_L37; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1593 + * else: + * # Ok, dict has it already cached, so, let's check it... + * if merged.get(exc_lineno, 0): # <<<<<<<<<<<<<< + * return False + * + */ + /*else*/ { + if (unlikely(__pyx_v_merged == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 1593, __pyx_L4_error) + } + __pyx_t_8 = __Pyx_PyDict_GetItemDefault(__pyx_v_merged, __pyx_v_exc_lineno, __pyx_int_0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1593, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1593, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1594 + * # Ok, dict has it already cached, so, let's check it... + * if merged.get(exc_lineno, 0): + * return False # <<<<<<<<<<<<<< + * + * try: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L3_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1593 + * else: + * # Ok, dict has it already cached, so, let's check it... + * if merged.get(exc_lineno, 0): # <<<<<<<<<<<<<< + * return False + * + */ + } + } + __pyx_L37:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1539 + * + * if py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception: + * for check_trace_obj in (initial_trace_obj, trace_obj): # <<<<<<<<<<<<<< + * abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) + * absolute_filename = abs_real_path_and_base[0] + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1538 + * trace_obj = trace_obj.tb_next + * + * if py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception: # <<<<<<<<<<<<<< + * for check_trace_obj in (initial_trace_obj, trace_obj): + * abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1596 + * return False + * + * try: # <<<<<<<<<<<<<< + * frame_id_to_frame = {} + * frame_id_to_frame[id(frame)] = frame + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1597 + * + * try: + * frame_id_to_frame = {} # <<<<<<<<<<<<<< + * frame_id_to_frame[id(frame)] = frame + * f = trace_obj.tb_frame + */ + __pyx_t_4 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1597, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_frame_id_to_frame = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1598 + * try: + * frame_id_to_frame = {} + * frame_id_to_frame[id(frame)] = frame # <<<<<<<<<<<<<< + * f = trace_obj.tb_frame + * while f is not None: + */ + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, __pyx_v_frame); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1598, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely((PyDict_SetItem(__pyx_v_frame_id_to_frame, __pyx_t_4, __pyx_v_frame) < 0))) __PYX_ERR(0, 1598, __pyx_L51_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1599 + * frame_id_to_frame = {} + * frame_id_to_frame[id(frame)] = frame + * f = trace_obj.tb_frame # <<<<<<<<<<<<<< + * while f is not None: + * frame_id_to_frame[id(f)] = f + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_trace_obj, __pyx_n_s_tb_frame); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1599, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_f = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1600 + * frame_id_to_frame[id(frame)] = frame + * f = trace_obj.tb_frame + * while f is not None: # <<<<<<<<<<<<<< + * frame_id_to_frame[id(f)] = f + * f = f.f_back + */ + while (1) { + __pyx_t_2 = (__pyx_v_f != Py_None); + if (!__pyx_t_2) break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1601 + * f = trace_obj.tb_frame + * while f is not None: + * frame_id_to_frame[id(f)] = f # <<<<<<<<<<<<<< + * f = f.f_back + * f = None + */ + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, __pyx_v_f); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1601, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely((PyDict_SetItem(__pyx_v_frame_id_to_frame, __pyx_t_4, __pyx_v_f) < 0))) __PYX_ERR(0, 1601, __pyx_L51_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1602 + * while f is not None: + * frame_id_to_frame[id(f)] = f + * f = f.f_back # <<<<<<<<<<<<<< + * f = None + * + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_f, __pyx_n_s_f_back); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1602, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF_SET(__pyx_v_f, __pyx_t_4); + __pyx_t_4 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1603 + * frame_id_to_frame[id(f)] = f + * f = f.f_back + * f = None # <<<<<<<<<<<<<< + * + * stopped = True + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_f, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1605 + * f = None + * + * stopped = True # <<<<<<<<<<<<<< + * py_db.send_caught_exception_stack(thread, arg, id(frame)) + * try: + */ + __pyx_v_stopped = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1606 + * + * stopped = True + * py_db.send_caught_exception_stack(thread, arg, id(frame)) # <<<<<<<<<<<<<< + * try: + * py_db.set_suspend(thread, 137) + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_send_caught_exception_stack); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1606, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, __pyx_v_frame); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1606, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_6, __pyx_v_thread, __pyx_v_arg, __pyx_t_7}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_9, 3+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1606, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1607 + * stopped = True + * py_db.send_caught_exception_stack(thread, arg, id(frame)) + * try: # <<<<<<<<<<<<<< + * py_db.set_suspend(thread, 137) + * py_db.do_wait_suspend(thread, frame, "exception", arg, exception_type=exception_type) + */ + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1608 + * py_db.send_caught_exception_stack(thread, arg, id(frame)) + * try: + * py_db.set_suspend(thread, 137) # <<<<<<<<<<<<<< + * py_db.do_wait_suspend(thread, frame, "exception", arg, exception_type=exception_type) + * finally: + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_set_suspend); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1608, __pyx_L60_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_v_thread, __pyx_int_137}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_9, 2+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1608, __pyx_L60_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1609 + * try: + * py_db.set_suspend(thread, 137) + * py_db.do_wait_suspend(thread, frame, "exception", arg, exception_type=exception_type) # <<<<<<<<<<<<<< + * finally: + * py_db.send_caught_exception_stack_proceeded(thread) + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_do_wait_suspend); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1609, __pyx_L60_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1609, __pyx_L60_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_thread); + __Pyx_GIVEREF(__pyx_v_thread); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_thread)) __PYX_ERR(0, 1609, __pyx_L60_error); + __Pyx_INCREF(__pyx_v_frame); + __Pyx_GIVEREF(__pyx_v_frame); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_frame)) __PYX_ERR(0, 1609, __pyx_L60_error); + __Pyx_INCREF(__pyx_n_s_exception); + __Pyx_GIVEREF(__pyx_n_s_exception); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_n_s_exception)) __PYX_ERR(0, 1609, __pyx_L60_error); + __Pyx_INCREF(__pyx_v_arg); + __Pyx_GIVEREF(__pyx_v_arg); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_v_arg)) __PYX_ERR(0, 1609, __pyx_L60_error); + __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1609, __pyx_L60_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_exception_type, __pyx_v_exception_type) < 0) __PYX_ERR(0, 1609, __pyx_L60_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_8, __pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1609, __pyx_L60_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1611 + * py_db.do_wait_suspend(thread, frame, "exception", arg, exception_type=exception_type) + * finally: + * py_db.send_caught_exception_stack_proceeded(thread) # <<<<<<<<<<<<<< + * except: + * pydev_log.exception() + */ + /*finally:*/ { + /*normal exit:*/{ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_send_caught_exception_stack_proc); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1611, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_v_thread}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1611, __pyx_L51_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L61; + } + __pyx_L60_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; __pyx_t_24 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_22, &__pyx_t_23, &__pyx_t_24); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_19, &__pyx_t_20, &__pyx_t_21) < 0)) __Pyx_ErrFetch(&__pyx_t_19, &__pyx_t_20, &__pyx_t_21); + __Pyx_XGOTREF(__pyx_t_19); + __Pyx_XGOTREF(__pyx_t_20); + __Pyx_XGOTREF(__pyx_t_21); + __Pyx_XGOTREF(__pyx_t_22); + __Pyx_XGOTREF(__pyx_t_23); + __Pyx_XGOTREF(__pyx_t_24); + __pyx_t_16 = __pyx_lineno; __pyx_t_17 = __pyx_clineno; __pyx_t_18 = __pyx_filename; + { + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_send_caught_exception_stack_proc); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1611, __pyx_L63_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_v_thread}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1611, __pyx_L63_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_22); + __Pyx_XGIVEREF(__pyx_t_23); + __Pyx_XGIVEREF(__pyx_t_24); + __Pyx_ExceptionReset(__pyx_t_22, __pyx_t_23, __pyx_t_24); + } + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_XGIVEREF(__pyx_t_20); + __Pyx_XGIVEREF(__pyx_t_21); + __Pyx_ErrRestore(__pyx_t_19, __pyx_t_20, __pyx_t_21); + __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; __pyx_t_24 = 0; + __pyx_lineno = __pyx_t_16; __pyx_clineno = __pyx_t_17; __pyx_filename = __pyx_t_18; + goto __pyx_L51_error; + __pyx_L63_error:; + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_22); + __Pyx_XGIVEREF(__pyx_t_23); + __Pyx_XGIVEREF(__pyx_t_24); + __Pyx_ExceptionReset(__pyx_t_22, __pyx_t_23, __pyx_t_24); + } + __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0; + __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0; + __Pyx_XDECREF(__pyx_t_21); __pyx_t_21 = 0; + __pyx_t_22 = 0; __pyx_t_23 = 0; __pyx_t_24 = 0; + goto __pyx_L51_error; + } + __pyx_L61:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1596 + * return False + * + * try: # <<<<<<<<<<<<<< + * frame_id_to_frame = {} + * frame_id_to_frame[id(frame)] = frame + */ + } + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L56_try_end; + __pyx_L51_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1612 + * finally: + * py_db.send_caught_exception_stack_proceeded(thread) + * except: # <<<<<<<<<<<<<< + * pydev_log.exception() + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.handle_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(0, 1612, __pyx_L53_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + + /* "_pydevd_bundle/pydevd_cython.pyx":1613 + * py_db.send_caught_exception_stack_proceeded(thread) + * except: + * pydev_log.exception() # <<<<<<<<<<<<<< + * + * py_db.set_trace_for_frame_and_parents(thread.ident, frame) + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1613, __pyx_L53_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_exception); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1613, __pyx_L53_except_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_14))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_14); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_14, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_14, __pyx_callargs+1-__pyx_t_9, 0+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1613, __pyx_L53_except_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L52_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1596 + * return False + * + * try: # <<<<<<<<<<<<<< + * frame_id_to_frame = {} + * frame_id_to_frame[id(frame)] = frame + */ + __pyx_L53_except_error:; + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_11, __pyx_t_10); + goto __pyx_L4_error; + __pyx_L52_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_11, __pyx_t_10); + __pyx_L56_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1615 + * pydev_log.exception() + * + * py_db.set_trace_for_frame_and_parents(thread.ident, frame) # <<<<<<<<<<<<<< + * finally: + * # Make sure the user cannot see the '__exception__' we added after we leave the suspend state. + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_set_trace_for_frame_and_parents); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1615, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_ident_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1615, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_6, __pyx_v_frame}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 2+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1615, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1618 + * finally: + * # Make sure the user cannot see the '__exception__' we added after we leave the suspend state. + * remove_exception_from_frame(frame) # <<<<<<<<<<<<<< + * # Clear some local variables... + * frame = None + */ + /*finally:*/ { + /*normal exit:*/{ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_remove_exception_from_frame); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_frame}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1620 + * remove_exception_from_frame(frame) + * # Clear some local variables... + * frame = None # <<<<<<<<<<<<<< + * trace_obj = None + * initial_trace_obj = None + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_frame, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1621 + * # Clear some local variables... + * frame = None + * trace_obj = None # <<<<<<<<<<<<<< + * initial_trace_obj = None + * check_trace_obj = None + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1622 + * frame = None + * trace_obj = None + * initial_trace_obj = None # <<<<<<<<<<<<<< + * check_trace_obj = None + * f = None + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_initial_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1623 + * trace_obj = None + * initial_trace_obj = None + * check_trace_obj = None # <<<<<<<<<<<<<< + * f = None + * frame_id_to_frame = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_check_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1624 + * initial_trace_obj = None + * check_trace_obj = None + * f = None # <<<<<<<<<<<<<< + * frame_id_to_frame = None + * py_db = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_f, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1625 + * check_trace_obj = None + * f = None + * frame_id_to_frame = None # <<<<<<<<<<<<<< + * py_db = None + * thread = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_frame_id_to_frame, ((PyObject*)Py_None)); + + /* "_pydevd_bundle/pydevd_cython.pyx":1626 + * f = None + * frame_id_to_frame = None + * py_db = None # <<<<<<<<<<<<<< + * thread = None + * + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_py_db, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1627 + * frame_id_to_frame = None + * py_db = None + * thread = None # <<<<<<<<<<<<<< + * + * return stopped + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_thread, Py_None); + goto __pyx_L5; + } + __pyx_L4_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_24 = 0; __pyx_t_23 = 0; __pyx_t_22 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_24, &__pyx_t_23, &__pyx_t_22); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12) < 0)) __Pyx_ErrFetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_24); + __Pyx_XGOTREF(__pyx_t_23); + __Pyx_XGOTREF(__pyx_t_22); + __pyx_t_17 = __pyx_lineno; __pyx_t_16 = __pyx_clineno; __pyx_t_25 = __pyx_filename; + { + + /* "_pydevd_bundle/pydevd_cython.pyx":1618 + * finally: + * # Make sure the user cannot see the '__exception__' we added after we leave the suspend state. + * remove_exception_from_frame(frame) # <<<<<<<<<<<<<< + * # Clear some local variables... + * frame = None + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_remove_exception_from_frame); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1618, __pyx_L67_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_frame}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1618, __pyx_L67_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1620 + * remove_exception_from_frame(frame) + * # Clear some local variables... + * frame = None # <<<<<<<<<<<<<< + * trace_obj = None + * initial_trace_obj = None + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_frame, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1621 + * # Clear some local variables... + * frame = None + * trace_obj = None # <<<<<<<<<<<<<< + * initial_trace_obj = None + * check_trace_obj = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1622 + * frame = None + * trace_obj = None + * initial_trace_obj = None # <<<<<<<<<<<<<< + * check_trace_obj = None + * f = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_initial_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1623 + * trace_obj = None + * initial_trace_obj = None + * check_trace_obj = None # <<<<<<<<<<<<<< + * f = None + * frame_id_to_frame = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_check_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1624 + * initial_trace_obj = None + * check_trace_obj = None + * f = None # <<<<<<<<<<<<<< + * frame_id_to_frame = None + * py_db = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_f, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1625 + * check_trace_obj = None + * f = None + * frame_id_to_frame = None # <<<<<<<<<<<<<< + * py_db = None + * thread = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_frame_id_to_frame, ((PyObject*)Py_None)); + + /* "_pydevd_bundle/pydevd_cython.pyx":1626 + * f = None + * frame_id_to_frame = None + * py_db = None # <<<<<<<<<<<<<< + * thread = None + * + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_py_db, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1627 + * frame_id_to_frame = None + * py_db = None + * thread = None # <<<<<<<<<<<<<< + * + * return stopped + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_thread, Py_None); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_24); + __Pyx_XGIVEREF(__pyx_t_23); + __Pyx_XGIVEREF(__pyx_t_22); + __Pyx_ExceptionReset(__pyx_t_24, __pyx_t_23, __pyx_t_22); + } + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ErrRestore(__pyx_t_10, __pyx_t_11, __pyx_t_12); + __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_24 = 0; __pyx_t_23 = 0; __pyx_t_22 = 0; + __pyx_lineno = __pyx_t_17; __pyx_clineno = __pyx_t_16; __pyx_filename = __pyx_t_25; + goto __pyx_L1_error; + __pyx_L67_error:; + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_24); + __Pyx_XGIVEREF(__pyx_t_23); + __Pyx_XGIVEREF(__pyx_t_22); + __Pyx_ExceptionReset(__pyx_t_24, __pyx_t_23, __pyx_t_22); + } + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_t_24 = 0; __pyx_t_23 = 0; __pyx_t_22 = 0; + goto __pyx_L1_error; + } + __pyx_L3_return: { + __pyx_t_22 = __pyx_r; + __pyx_r = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1618 + * finally: + * # Make sure the user cannot see the '__exception__' we added after we leave the suspend state. + * remove_exception_from_frame(frame) # <<<<<<<<<<<<<< + * # Clear some local variables... + * frame = None + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_remove_exception_from_frame); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_frame}; + __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1620 + * remove_exception_from_frame(frame) + * # Clear some local variables... + * frame = None # <<<<<<<<<<<<<< + * trace_obj = None + * initial_trace_obj = None + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_frame, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1621 + * # Clear some local variables... + * frame = None + * trace_obj = None # <<<<<<<<<<<<<< + * initial_trace_obj = None + * check_trace_obj = None + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1622 + * frame = None + * trace_obj = None + * initial_trace_obj = None # <<<<<<<<<<<<<< + * check_trace_obj = None + * f = None + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_initial_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1623 + * trace_obj = None + * initial_trace_obj = None + * check_trace_obj = None # <<<<<<<<<<<<<< + * f = None + * frame_id_to_frame = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_check_trace_obj, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1624 + * initial_trace_obj = None + * check_trace_obj = None + * f = None # <<<<<<<<<<<<<< + * frame_id_to_frame = None + * py_db = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_f, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1625 + * check_trace_obj = None + * f = None + * frame_id_to_frame = None # <<<<<<<<<<<<<< + * py_db = None + * thread = None + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_frame_id_to_frame, ((PyObject*)Py_None)); + + /* "_pydevd_bundle/pydevd_cython.pyx":1626 + * f = None + * frame_id_to_frame = None + * py_db = None # <<<<<<<<<<<<<< + * thread = None + * + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_py_db, Py_None); + + /* "_pydevd_bundle/pydevd_cython.pyx":1627 + * frame_id_to_frame = None + * py_db = None + * thread = None # <<<<<<<<<<<<<< + * + * return stopped + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_thread, Py_None); + __pyx_r = __pyx_t_22; + __pyx_t_22 = 0; + goto __pyx_L0; + } + __pyx_L5:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1629 + * thread = None + * + * return stopped # <<<<<<<<<<<<<< + * from _pydev_bundle.pydev_is_thread_alive import is_thread_alive + * from _pydev_bundle.pydev_log import exception as pydev_log_exception + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_8 = __Pyx_PyBool_FromLong(__pyx_v_stopped); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1629, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1510 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def handle_exception(py_db, thread, frame, arg, str exception_type): # <<<<<<<<<<<<<< + * cdef bint stopped; + * cdef tuple abs_real_path_and_base; + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.handle_exception", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_abs_real_path_and_base); + __Pyx_XDECREF(__pyx_v_absolute_filename); + __Pyx_XDECREF(__pyx_v_canonical_normalized_filename); + __Pyx_XDECREF(__pyx_v_lines_ignored); + __Pyx_XDECREF(__pyx_v_frame_id_to_frame); + __Pyx_XDECREF(__pyx_v_merged); + __Pyx_XDECREF(__pyx_v_trace_obj); + __Pyx_XDECREF(__pyx_v_initial_trace_obj); + __Pyx_XDECREF(__pyx_v_check_trace_obj); + __Pyx_XDECREF(__pyx_v_curr_stat); + __Pyx_XDECREF(__pyx_v_last_stat); + __Pyx_XDECREF(__pyx_v_from_user_input); + __Pyx_XDECREF(__pyx_v_exc_lineno); + __Pyx_XDECREF(__pyx_v_line); + __Pyx_XDECREF(__pyx_v_f); + __Pyx_XDECREF(__pyx_v_py_db); + __Pyx_XDECREF(__pyx_v_thread); + __Pyx_XDECREF(__pyx_v_frame); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1674 + * + * + * def notify_skipped_step_in_because_of_filters(py_db, frame): # <<<<<<<<<<<<<< + * global _global_notify_skipped_step_in + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_17notify_skipped_step_in_because_of_filters(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_17notify_skipped_step_in_because_of_filters = {"notify_skipped_step_in_because_of_filters", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_17notify_skipped_step_in_because_of_filters, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_17notify_skipped_step_in_because_of_filters(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_py_db = 0; + PyObject *__pyx_v_frame = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("notify_skipped_step_in_because_of_filters (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_py_db,&__pyx_n_s_frame,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_py_db)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1674, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1674, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("notify_skipped_step_in_because_of_filters", 1, 2, 2, 1); __PYX_ERR(0, 1674, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "notify_skipped_step_in_because_of_filters") < 0)) __PYX_ERR(0, 1674, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_py_db = values[0]; + __pyx_v_frame = values[1]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("notify_skipped_step_in_because_of_filters", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 1674, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.notify_skipped_step_in_because_of_filters", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_16notify_skipped_step_in_because_of_filters(__pyx_self, __pyx_v_py_db, __pyx_v_frame); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_16notify_skipped_step_in_because_of_filters(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_py_db, PyObject *__pyx_v_frame) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + unsigned int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + int __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("notify_skipped_step_in_because_of_filters", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1677 + * global _global_notify_skipped_step_in + * + * with _global_notify_skipped_step_in_lock: # <<<<<<<<<<<<<< + * if _global_notify_skipped_step_in: + * # Check with lock in place (callers should actually have checked + */ + /*with:*/ { + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_global_notify_skipped_step_in_l); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_exit); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_enter); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1677, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1677, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + /*try:*/ { + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1678 + * + * with _global_notify_skipped_step_in_lock: + * if _global_notify_skipped_step_in: # <<<<<<<<<<<<<< + * # Check with lock in place (callers should actually have checked + * # before without the lock in place due to performance). + */ + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(0, 1678, __pyx_L7_error) + if (__pyx_t_10) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1681 + * # Check with lock in place (callers should actually have checked + * # before without the lock in place due to performance). + * return # <<<<<<<<<<<<<< + * _global_notify_skipped_step_in = True + * py_db.notify_skipped_step_in_because_of_filters(frame) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":1678 + * + * with _global_notify_skipped_step_in_lock: + * if _global_notify_skipped_step_in: # <<<<<<<<<<<<<< + * # Check with lock in place (callers should actually have checked + * # before without the lock in place due to performance). + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1682 + * # before without the lock in place due to performance). + * return + * _global_notify_skipped_step_in = True # <<<<<<<<<<<<<< + * py_db.notify_skipped_step_in_because_of_filters(frame) + * + */ + __Pyx_INCREF(Py_True); + __Pyx_XGOTREF(__pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in); + __Pyx_DECREF_SET(__pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in, ((PyObject*)Py_True)); + __Pyx_GIVEREF(Py_True); + + /* "_pydevd_bundle/pydevd_cython.pyx":1683 + * return + * _global_notify_skipped_step_in = True + * py_db.notify_skipped_step_in_because_of_filters(frame) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_notify_skipped_step_in_because_o); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1683, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1683, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1677 + * global _global_notify_skipped_step_in + * + * with _global_notify_skipped_step_in_lock: # <<<<<<<<<<<<<< + * if _global_notify_skipped_step_in: + * # Check with lock in place (callers should actually have checked + */ + } + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L12_try_end; + __pyx_L7_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.notify_skipped_step_in_because_of_filters", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(0, 1677, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_Pack(3, __pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1677, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1677, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + if (__pyx_t_10 < 0) __PYX_ERR(0, 1677, __pyx_L9_except_error) + __pyx_t_12 = (!__pyx_t_10); + if (unlikely(__pyx_t_12)) { + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ErrRestoreWithState(__pyx_t_1, __pyx_t_3, __pyx_t_4); + __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; + __PYX_ERR(0, 1677, __pyx_L9_except_error) + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L8_exception_handled; + } + __pyx_L9_except_error:; + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9); + goto __pyx_L1_error; + __pyx_L11_try_return:; + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9); + goto __pyx_L4_return; + __pyx_L8_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9); + __pyx_L12_try_end:; + } + } + /*finally:*/ { + /*normal exit:*/{ + if (__pyx_t_2) { + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__3, NULL); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + goto __pyx_L6; + } + __pyx_L4_return: { + __pyx_t_9 = __pyx_r; + __pyx_r = 0; + if (__pyx_t_2) { + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__3, NULL); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_r = __pyx_t_9; + __pyx_t_9 = 0; + goto __pyx_L0; + } + __pyx_L6:; + } + goto __pyx_L17; + __pyx_L3_error:; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L1_error; + __pyx_L17:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1674 + * + * + * def notify_skipped_step_in_because_of_filters(py_db, frame): # <<<<<<<<<<<<<< + * global _global_notify_skipped_step_in + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.notify_skipped_step_in_because_of_filters", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1690 + * cdef class SafeCallWrapper: + * cdef method_object + * def __init__(self, method_object): # <<<<<<<<<<<<<< + * self.method_object = method_object + * def __call__(self, *args): + */ + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_method_object = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method_object,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method_object)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1690, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 1690, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_method_object = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 1690, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.SafeCallWrapper.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper___init__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)__pyx_v_self), __pyx_v_method_object); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper___init__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *__pyx_v_self, PyObject *__pyx_v_method_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1691 + * cdef method_object + * def __init__(self, method_object): + * self.method_object = method_object # <<<<<<<<<<<<<< + * def __call__(self, *args): + * #Cannot use 'self' once inside the delegate call since we are borrowing the self reference f_trace field + */ + __Pyx_INCREF(__pyx_v_method_object); + __Pyx_GIVEREF(__pyx_v_method_object); + __Pyx_GOTREF(__pyx_v_self->method_object); + __Pyx_DECREF(__pyx_v_self->method_object); + __pyx_v_self->method_object = __pyx_v_method_object; + + /* "_pydevd_bundle/pydevd_cython.pyx":1690 + * cdef class SafeCallWrapper: + * cdef method_object + * def __init__(self, method_object): # <<<<<<<<<<<<<< + * self.method_object = method_object + * def __call__(self, *args): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1692 + * def __init__(self, method_object): + * self.method_object = method_object + * def __call__(self, *args): # <<<<<<<<<<<<<< + * #Cannot use 'self' once inside the delegate call since we are borrowing the self reference f_trace field + * #in the frame, and that reference might get destroyed by set trace on frame and parents + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_args = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 0))) return NULL; + __Pyx_INCREF(__pyx_args); + __pyx_v_args = __pyx_args; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_2__call__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)__pyx_v_self), __pyx_v_args); + + /* function exit code */ + __Pyx_DECREF(__pyx_v_args); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_2__call__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *__pyx_v_self, PyObject *__pyx_v_args) { + PyObject *__pyx_v_method_obj; + PyObject *__pyx_v_ret = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__call__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1695 + * #Cannot use 'self' once inside the delegate call since we are borrowing the self reference f_trace field + * #in the frame, and that reference might get destroyed by set trace on frame and parents + * cdef PyObject* method_obj = self.method_object # <<<<<<<<<<<<<< + * Py_INCREF(method_obj) + * ret = (method_obj)(*args) + */ + __pyx_v_method_obj = ((PyObject *)__pyx_v_self->method_object); + + /* "_pydevd_bundle/pydevd_cython.pyx":1696 + * #in the frame, and that reference might get destroyed by set trace on frame and parents + * cdef PyObject* method_obj = self.method_object + * Py_INCREF(method_obj) # <<<<<<<<<<<<<< + * ret = (method_obj)(*args) + * Py_XDECREF (method_obj) + */ + Py_INCREF(((PyObject *)__pyx_v_method_obj)); + + /* "_pydevd_bundle/pydevd_cython.pyx":1697 + * cdef PyObject* method_obj = self.method_object + * Py_INCREF(method_obj) + * ret = (method_obj)(*args) # <<<<<<<<<<<<<< + * Py_XDECREF (method_obj) + * return SafeCallWrapper(ret) if ret is not None else None + */ + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_method_obj), __pyx_v_args, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1697, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ret = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1698 + * Py_INCREF(method_obj) + * ret = (method_obj)(*args) + * Py_XDECREF (method_obj) # <<<<<<<<<<<<<< + * return SafeCallWrapper(ret) if ret is not None else None + * def get_method_object(self): + */ + Py_XDECREF(__pyx_v_method_obj); + + /* "_pydevd_bundle/pydevd_cython.pyx":1699 + * ret = (method_obj)(*args) + * Py_XDECREF (method_obj) + * return SafeCallWrapper(ret) if ret is not None else None # <<<<<<<<<<<<<< + * def get_method_object(self): + * return self.method_object + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = (__pyx_v_ret != Py_None); + if (__pyx_t_2) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper), __pyx_v_ret); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1699, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __pyx_t_3; + __pyx_t_3 = 0; + } else { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1692 + * def __init__(self, method_object): + * self.method_object = method_object + * def __call__(self, *args): # <<<<<<<<<<<<<< + * #Cannot use 'self' once inside the delegate call since we are borrowing the self reference f_trace field + * #in the frame, and that reference might get destroyed by set trace on frame and parents + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.SafeCallWrapper.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_ret); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1700 + * Py_XDECREF (method_obj) + * return SafeCallWrapper(ret) if ret is not None else None + * def get_method_object(self): # <<<<<<<<<<<<<< + * return self.method_object + * # ELSE + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_5get_method_object(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_5get_method_object = {"get_method_object", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_5get_method_object, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_5get_method_object(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_method_object (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("get_method_object", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "get_method_object", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_4get_method_object(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_4get_method_object(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_method_object", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1701 + * return SafeCallWrapper(ret) if ret is not None else None + * def get_method_object(self): + * return self.method_object # <<<<<<<<<<<<<< + * # ELSE + * # ENDIF + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->method_object); + __pyx_r = __pyx_v_self->method_object; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1700 + * Py_XDECREF (method_obj) + * return SafeCallWrapper(ret) if ret is not None else None + * def get_method_object(self): # <<<<<<<<<<<<<< + * return self.method_object + * # ELSE + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_7__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_7__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_6__reduce_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_6__reduce_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.method_object,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->method_object); + __Pyx_GIVEREF(__pyx_v_self->method_object); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->method_object)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.method_object,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.method_object,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(2, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.method_object is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.method_object,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.method_object is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->method_object != Py_None); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.method_object is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.method_object is not None + * if use_setstate: + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_SafeCallWrapper); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_169093275); + __Pyx_GIVEREF(__pyx_int_169093275); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_169093275)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.method_object is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, None), state + * else: + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_SafeCallWrapper__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_SafeCallWrapper); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_169093275); + __Pyx_GIVEREF(__pyx_int_169093275); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_169093275)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.SafeCallWrapper.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_SafeCallWrapper__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_9__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_9__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(2, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(2, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.SafeCallWrapper.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_8__setstate_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_8__setstate_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_SafeCallWrapper__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_SafeCallWrapper__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_SafeCallWrapper__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.SafeCallWrapper.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1707 + * + * + * def fix_top_level_trace_and_get_trace_func(py_db, frame): # <<<<<<<<<<<<<< + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_19fix_top_level_trace_and_get_trace_func(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_19fix_top_level_trace_and_get_trace_func = {"fix_top_level_trace_and_get_trace_func", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_19fix_top_level_trace_and_get_trace_func, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_19fix_top_level_trace_and_get_trace_func(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_py_db = 0; + PyObject *__pyx_v_frame = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("fix_top_level_trace_and_get_trace_func (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_py_db,&__pyx_n_s_frame,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_py_db)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1707, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1707, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("fix_top_level_trace_and_get_trace_func", 1, 2, 2, 1); __PYX_ERR(0, 1707, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "fix_top_level_trace_and_get_trace_func") < 0)) __PYX_ERR(0, 1707, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_py_db = values[0]; + __pyx_v_frame = values[1]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("fix_top_level_trace_and_get_trace_func", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 1707, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.fix_top_level_trace_and_get_trace_func", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_18fix_top_level_trace_and_get_trace_func(__pyx_self, __pyx_v_py_db, __pyx_v_frame); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_18fix_top_level_trace_and_get_trace_func(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_py_db, PyObject *__pyx_v_frame) { + PyObject *__pyx_v_name = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_thread = NULL; + PyObject *__pyx_v_f_unhandled = NULL; + int __pyx_v_force_only_unhandled_tracer; + PyObject *__pyx_v_i = NULL; + PyObject *__pyx_v_j = NULL; + PyObject *__pyx_v_t = NULL; + PyObject *__pyx_v_additional_info = NULL; + PyObject *__pyx_v_top_level_thread_tracer = NULL; + PyObject *__pyx_v_f_trace = NULL; + PyObject *__pyx_v_thread_tracer = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + unsigned int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + int __pyx_t_15; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("fix_top_level_trace_and_get_trace_func", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1720 + * # where more information is cached (and will also setup the tracing for + * # frames where we should deal with unhandled exceptions). + * thread = None # <<<<<<<<<<<<<< + * # Cache the frame which should be traced to deal with unhandled exceptions. + * # (i.e.: thread entry-points). + */ + __Pyx_INCREF(Py_None); + __pyx_v_thread = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":1724 + * # (i.e.: thread entry-points). + * + * f_unhandled = frame # <<<<<<<<<<<<<< + * # print('called at', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + * force_only_unhandled_tracer = False + */ + __Pyx_INCREF(__pyx_v_frame); + __pyx_v_f_unhandled = __pyx_v_frame; + + /* "_pydevd_bundle/pydevd_cython.pyx":1726 + * f_unhandled = frame + * # print('called at', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + * force_only_unhandled_tracer = False # <<<<<<<<<<<<<< + * while f_unhandled is not None: + * # name = splitext(basename(f_unhandled.f_code.co_filename))[0] + */ + __pyx_v_force_only_unhandled_tracer = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1727 + * # print('called at', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + * force_only_unhandled_tracer = False + * while f_unhandled is not None: # <<<<<<<<<<<<<< + * # name = splitext(basename(f_unhandled.f_code.co_filename))[0] + * + */ + while (1) { + __pyx_t_1 = (__pyx_v_f_unhandled != Py_None); + if (!__pyx_t_1) break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1730 + * # name = splitext(basename(f_unhandled.f_code.co_filename))[0] + * + * name = f_unhandled.f_code.co_filename # <<<<<<<<<<<<<< + * # basename + * i = name.rfind("/") + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1730, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1730, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(PyString_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_3))) __PYX_ERR(0, 1730, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_name, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1732 + * name = f_unhandled.f_code.co_filename + * # basename + * i = name.rfind("/") # <<<<<<<<<<<<<< + * j = name.rfind("\\") + * if j > i: + */ + __pyx_t_3 = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyString_Type_rfind, __pyx_v_name, __pyx_kp_s__8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1732, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1733 + * # basename + * i = name.rfind("/") + * j = name.rfind("\\") # <<<<<<<<<<<<<< + * if j > i: + * i = j + */ + __pyx_t_3 = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyString_Type_rfind, __pyx_v_name, __pyx_kp_s__9); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1733, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_j, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1734 + * i = name.rfind("/") + * j = name.rfind("\\") + * if j > i: # <<<<<<<<<<<<<< + * i = j + * if i >= 0: + */ + __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_v_i, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1734, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1734, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1735 + * j = name.rfind("\\") + * if j > i: + * i = j # <<<<<<<<<<<<<< + * if i >= 0: + * name = name[i + 1 :] + */ + __Pyx_INCREF(__pyx_v_j); + __Pyx_DECREF_SET(__pyx_v_i, __pyx_v_j); + + /* "_pydevd_bundle/pydevd_cython.pyx":1734 + * i = name.rfind("/") + * j = name.rfind("\\") + * if j > i: # <<<<<<<<<<<<<< + * i = j + * if i >= 0: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1736 + * if j > i: + * i = j + * if i >= 0: # <<<<<<<<<<<<<< + * name = name[i + 1 :] + * # remove ext + */ + __pyx_t_3 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1736, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1736, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1737 + * i = j + * if i >= 0: + * name = name[i + 1 :] # <<<<<<<<<<<<<< + * # remove ext + * i = name.rfind(".") + */ + if (unlikely(__pyx_v_name == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1737, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyInt_AddObjC(__pyx_v_i, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1737, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = (__pyx_t_3 == Py_None); + if (__pyx_t_1) { + __pyx_t_4 = 0; + } else { + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1737, __pyx_L1_error) + __pyx_t_4 = __pyx_t_5; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PySequence_GetSlice(__pyx_v_name, __pyx_t_4, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1737, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_name, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1736 + * if j > i: + * i = j + * if i >= 0: # <<<<<<<<<<<<<< + * name = name[i + 1 :] + * # remove ext + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1739 + * name = name[i + 1 :] + * # remove ext + * i = name.rfind(".") # <<<<<<<<<<<<<< + * if i >= 0: + * name = name[:i] + */ + __pyx_t_3 = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyString_Type_rfind, __pyx_v_name, __pyx_kp_s__10); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1739, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_i, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1740 + * # remove ext + * i = name.rfind(".") + * if i >= 0: # <<<<<<<<<<<<<< + * name = name[:i] + * + */ + __pyx_t_3 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1740, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1740, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1741 + * i = name.rfind(".") + * if i >= 0: + * name = name[:i] # <<<<<<<<<<<<<< + * + * if name == "threading": + */ + if (unlikely(__pyx_v_name == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1741, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_i); + __pyx_t_3 = __pyx_v_i; + __pyx_t_1 = (__pyx_t_3 == Py_None); + if (__pyx_t_1) { + __pyx_t_4 = PY_SSIZE_T_MAX; + } else { + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1741, __pyx_L1_error) + __pyx_t_4 = __pyx_t_5; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PySequence_GetSlice(__pyx_v_name, 0, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_name, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1740 + * # remove ext + * i = name.rfind(".") + * if i >= 0: # <<<<<<<<<<<<<< + * name = name[:i] + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1743 + * name = name[:i] + * + * if name == "threading": # <<<<<<<<<<<<<< + * if f_unhandled.f_code.co_name in ("__bootstrap", "_bootstrap"): + * # We need __bootstrap_inner, not __bootstrap. + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_name, __pyx_n_s_threading, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1743, __pyx_L1_error) + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1744 + * + * if name == "threading": + * if f_unhandled.f_code.co_name in ("__bootstrap", "_bootstrap"): # <<<<<<<<<<<<<< + * # We need __bootstrap_inner, not __bootstrap. + * return None, False + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_code); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1744, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_co_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1744, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_t_2, __pyx_n_s_bootstrap, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 1744, __pyx_L1_error) + if (!__pyx_t_6) { + } else { + __pyx_t_1 = __pyx_t_6; + goto __pyx_L10_bool_binop_done; + } + __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_t_2, __pyx_n_s_bootstrap_2, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 1744, __pyx_L1_error) + __pyx_t_1 = __pyx_t_6; + __pyx_L10_bool_binop_done:; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_6 = __pyx_t_1; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1746 + * if f_unhandled.f_code.co_name in ("__bootstrap", "_bootstrap"): + * # We need __bootstrap_inner, not __bootstrap. + * return None, False # <<<<<<<<<<<<<< + * + * elif f_unhandled.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner"): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_tuple__11); + __pyx_r = __pyx_tuple__11; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1744 + * + * if name == "threading": + * if f_unhandled.f_code.co_name in ("__bootstrap", "_bootstrap"): # <<<<<<<<<<<<<< + * # We need __bootstrap_inner, not __bootstrap. + * return None, False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1748 + * return None, False + * + * elif f_unhandled.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner"): # <<<<<<<<<<<<<< + * # Note: be careful not to use threading.currentThread to avoid creating a dummy thread. + * t = f_unhandled.f_locals.get("self") + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1748, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co_name); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1748, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_t_3, __pyx_n_s_bootstrap_inner, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1748, __pyx_L1_error) + if (!__pyx_t_1) { + } else { + __pyx_t_6 = __pyx_t_1; + goto __pyx_L12_bool_binop_done; + } + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_t_3, __pyx_n_s_bootstrap_inner_2, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1748, __pyx_L1_error) + __pyx_t_6 = __pyx_t_1; + __pyx_L12_bool_binop_done:; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_1 = __pyx_t_6; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1750 + * elif f_unhandled.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner"): + * # Note: be careful not to use threading.currentThread to avoid creating a dummy thread. + * t = f_unhandled.f_locals.get("self") # <<<<<<<<<<<<<< + * force_only_unhandled_tracer = True + * if t is not None and isinstance(t, threading.Thread): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_locals); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1750, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1750, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_n_s_self}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1750, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1751 + * # Note: be careful not to use threading.currentThread to avoid creating a dummy thread. + * t = f_unhandled.f_locals.get("self") + * force_only_unhandled_tracer = True # <<<<<<<<<<<<<< + * if t is not None and isinstance(t, threading.Thread): + * thread = t + */ + __pyx_v_force_only_unhandled_tracer = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1752 + * t = f_unhandled.f_locals.get("self") + * force_only_unhandled_tracer = True + * if t is not None and isinstance(t, threading.Thread): # <<<<<<<<<<<<<< + * thread = t + * break + */ + __pyx_t_6 = (__pyx_v_t != Py_None); + if (__pyx_t_6) { + } else { + __pyx_t_1 = __pyx_t_6; + goto __pyx_L15_bool_binop_done; + } + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1752, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_Thread); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1752, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = PyObject_IsInstance(__pyx_v_t, __pyx_t_7); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 1752, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_1 = __pyx_t_6; + __pyx_L15_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1753 + * force_only_unhandled_tracer = True + * if t is not None and isinstance(t, threading.Thread): + * thread = t # <<<<<<<<<<<<<< + * break + * + */ + __Pyx_INCREF(__pyx_v_t); + __Pyx_DECREF_SET(__pyx_v_thread, __pyx_v_t); + + /* "_pydevd_bundle/pydevd_cython.pyx":1754 + * if t is not None and isinstance(t, threading.Thread): + * thread = t + * break # <<<<<<<<<<<<<< + * + * elif name == "pydev_monkey": + */ + goto __pyx_L4_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1752 + * t = f_unhandled.f_locals.get("self") + * force_only_unhandled_tracer = True + * if t is not None and isinstance(t, threading.Thread): # <<<<<<<<<<<<<< + * thread = t + * break + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1748 + * return None, False + * + * elif f_unhandled.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner"): # <<<<<<<<<<<<<< + * # Note: be careful not to use threading.currentThread to avoid creating a dummy thread. + * t = f_unhandled.f_locals.get("self") + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1743 + * name = name[:i] + * + * if name == "threading": # <<<<<<<<<<<<<< + * if f_unhandled.f_code.co_name in ("__bootstrap", "_bootstrap"): + * # We need __bootstrap_inner, not __bootstrap. + */ + goto __pyx_L8; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1756 + * break + * + * elif name == "pydev_monkey": # <<<<<<<<<<<<<< + * if f_unhandled.f_code.co_name == "__call__": + * force_only_unhandled_tracer = True + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_name, __pyx_n_s_pydev_monkey, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1756, __pyx_L1_error) + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1757 + * + * elif name == "pydev_monkey": + * if f_unhandled.f_code.co_name == "__call__": # <<<<<<<<<<<<<< + * force_only_unhandled_tracer = True + * break + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_code); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1757, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_co_name); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1757, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_t_3, __pyx_n_s_call_2, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1757, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1758 + * elif name == "pydev_monkey": + * if f_unhandled.f_code.co_name == "__call__": + * force_only_unhandled_tracer = True # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_force_only_unhandled_tracer = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1759 + * if f_unhandled.f_code.co_name == "__call__": + * force_only_unhandled_tracer = True + * break # <<<<<<<<<<<<<< + * + * elif name == "pydevd": + */ + goto __pyx_L4_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1757 + * + * elif name == "pydev_monkey": + * if f_unhandled.f_code.co_name == "__call__": # <<<<<<<<<<<<<< + * force_only_unhandled_tracer = True + * break + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1756 + * break + * + * elif name == "pydev_monkey": # <<<<<<<<<<<<<< + * if f_unhandled.f_code.co_name == "__call__": + * force_only_unhandled_tracer = True + */ + goto __pyx_L8; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1761 + * break + * + * elif name == "pydevd": # <<<<<<<<<<<<<< + * if f_unhandled.f_code.co_name in ("run", "main"): + * # We need to get to _exec + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_name, __pyx_n_s_pydevd, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1761, __pyx_L1_error) + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1762 + * + * elif name == "pydevd": + * if f_unhandled.f_code.co_name in ("run", "main"): # <<<<<<<<<<<<<< + * # We need to get to _exec + * return None, False + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_code); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1762, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_co_name); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1762, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_t_7, __pyx_n_s_run, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 1762, __pyx_L1_error) + if (!__pyx_t_6) { + } else { + __pyx_t_1 = __pyx_t_6; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_t_7, __pyx_n_s_main, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 1762, __pyx_L1_error) + __pyx_t_1 = __pyx_t_6; + __pyx_L19_bool_binop_done:; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_6 = __pyx_t_1; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1764 + * if f_unhandled.f_code.co_name in ("run", "main"): + * # We need to get to _exec + * return None, False # <<<<<<<<<<<<<< + * + * if f_unhandled.f_code.co_name == "_exec": + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_tuple__11); + __pyx_r = __pyx_tuple__11; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1762 + * + * elif name == "pydevd": + * if f_unhandled.f_code.co_name in ("run", "main"): # <<<<<<<<<<<<<< + * # We need to get to _exec + * return None, False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1766 + * return None, False + * + * if f_unhandled.f_code.co_name == "_exec": # <<<<<<<<<<<<<< + * force_only_unhandled_tracer = True + * break + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_code); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_co_name); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_t_3, __pyx_n_s_exec, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 1766, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1767 + * + * if f_unhandled.f_code.co_name == "_exec": + * force_only_unhandled_tracer = True # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_force_only_unhandled_tracer = 1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1768 + * if f_unhandled.f_code.co_name == "_exec": + * force_only_unhandled_tracer = True + * break # <<<<<<<<<<<<<< + * + * elif name == "pydevd_tracing": + */ + goto __pyx_L4_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1766 + * return None, False + * + * if f_unhandled.f_code.co_name == "_exec": # <<<<<<<<<<<<<< + * force_only_unhandled_tracer = True + * break + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1761 + * break + * + * elif name == "pydevd": # <<<<<<<<<<<<<< + * if f_unhandled.f_code.co_name in ("run", "main"): + * # We need to get to _exec + */ + goto __pyx_L8; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1770 + * break + * + * elif name == "pydevd_tracing": # <<<<<<<<<<<<<< + * return None, False + * + */ + __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_v_name, __pyx_n_s_pydevd_tracing, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 1770, __pyx_L1_error) + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1771 + * + * elif name == "pydevd_tracing": + * return None, False # <<<<<<<<<<<<<< + * + * elif f_unhandled.f_back is None: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_tuple__11); + __pyx_r = __pyx_tuple__11; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1770 + * break + * + * elif name == "pydevd_tracing": # <<<<<<<<<<<<<< + * return None, False + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1773 + * return None, False + * + * elif f_unhandled.f_back is None: # <<<<<<<<<<<<<< + * break + * + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_back); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1773, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = (__pyx_t_3 == Py_None); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1774 + * + * elif f_unhandled.f_back is None: + * break # <<<<<<<<<<<<<< + * + * f_unhandled = f_unhandled.f_back + */ + goto __pyx_L4_break; + + /* "_pydevd_bundle/pydevd_cython.pyx":1773 + * return None, False + * + * elif f_unhandled.f_back is None: # <<<<<<<<<<<<<< + * break + * + */ + } + __pyx_L8:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1776 + * break + * + * f_unhandled = f_unhandled.f_back # <<<<<<<<<<<<<< + * + * if thread is None: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_back); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_f_unhandled, __pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L4_break:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1778 + * f_unhandled = f_unhandled.f_back + * + * if thread is None: # <<<<<<<<<<<<<< + * # Important: don't call threadingCurrentThread if we're in the threading module + * # to avoid creating dummy threads. + */ + __pyx_t_6 = (__pyx_v_thread == Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1781 + * # Important: don't call threadingCurrentThread if we're in the threading module + * # to avoid creating dummy threads. + * if py_db.threading_get_ident is not None: # <<<<<<<<<<<<<< + * thread = py_db.threading_active.get(py_db.threading_get_ident()) + * if thread is None: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_threading_get_ident); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1781, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = (__pyx_t_3 != Py_None); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1782 + * # to avoid creating dummy threads. + * if py_db.threading_get_ident is not None: + * thread = py_db.threading_active.get(py_db.threading_get_ident()) # <<<<<<<<<<<<<< + * if thread is None: + * return None, False + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_threading_active); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_threading_get_ident); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_9))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_9, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __pyx_t_9 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_9)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_9); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_7}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF_SET(__pyx_v_thread, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1783 + * if py_db.threading_get_ident is not None: + * thread = py_db.threading_active.get(py_db.threading_get_ident()) + * if thread is None: # <<<<<<<<<<<<<< + * return None, False + * else: + */ + __pyx_t_6 = (__pyx_v_thread == Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1784 + * thread = py_db.threading_active.get(py_db.threading_get_ident()) + * if thread is None: + * return None, False # <<<<<<<<<<<<<< + * else: + * # Jython does not have threading.get_ident(). + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_tuple__11); + __pyx_r = __pyx_tuple__11; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1783 + * if py_db.threading_get_ident is not None: + * thread = py_db.threading_active.get(py_db.threading_get_ident()) + * if thread is None: # <<<<<<<<<<<<<< + * return None, False + * else: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1781 + * # Important: don't call threadingCurrentThread if we're in the threading module + * # to avoid creating dummy threads. + * if py_db.threading_get_ident is not None: # <<<<<<<<<<<<<< + * thread = py_db.threading_active.get(py_db.threading_get_ident()) + * if thread is None: + */ + goto __pyx_L23; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1787 + * else: + * # Jython does not have threading.get_ident(). + * thread = py_db.threading_current_thread() # <<<<<<<<<<<<<< + * + * if getattr(thread, "pydev_do_not_trace", None): + */ + /*else*/ { + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_threading_current_thread); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1787, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1787, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF_SET(__pyx_v_thread, __pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L23:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1778 + * f_unhandled = f_unhandled.f_back + * + * if thread is None: # <<<<<<<<<<<<<< + * # Important: don't call threadingCurrentThread if we're in the threading module + * # to avoid creating dummy threads. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1789 + * thread = py_db.threading_current_thread() + * + * if getattr(thread, "pydev_do_not_trace", None): # <<<<<<<<<<<<<< + * py_db.disable_tracing() + * return None, False + */ + __pyx_t_3 = __Pyx_GetAttr3(__pyx_v_thread, __pyx_n_s_pydev_do_not_trace, Py_None); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1789, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 1789, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1790 + * + * if getattr(thread, "pydev_do_not_trace", None): + * py_db.disable_tracing() # <<<<<<<<<<<<<< + * return None, False + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_disable_tracing); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1790, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1790, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1791 + * if getattr(thread, "pydev_do_not_trace", None): + * py_db.disable_tracing() + * return None, False # <<<<<<<<<<<<<< + * + * try: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_tuple__11); + __pyx_r = __pyx_tuple__11; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1789 + * thread = py_db.threading_current_thread() + * + * if getattr(thread, "pydev_do_not_trace", None): # <<<<<<<<<<<<<< + * py_db.disable_tracing() + * return None, False + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1793 + * return None, False + * + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * if additional_info is None: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_13); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1794 + * + * try: + * additional_info = thread.additional_info # <<<<<<<<<<<<<< + * if additional_info is None: + * raise AttributeError() + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_additional_info); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1794, __pyx_L26_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_additional_info = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1795 + * try: + * additional_info = thread.additional_info + * if additional_info is None: # <<<<<<<<<<<<<< + * raise AttributeError() + * except: + */ + __pyx_t_6 = (__pyx_v_additional_info == Py_None); + if (unlikely(__pyx_t_6)) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1796 + * additional_info = thread.additional_info + * if additional_info is None: + * raise AttributeError() # <<<<<<<<<<<<<< + * except: + * additional_info = py_db.set_additional_thread_info(thread) + */ + __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_builtin_AttributeError); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1796, __pyx_L26_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(0, 1796, __pyx_L26_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1795 + * try: + * additional_info = thread.additional_info + * if additional_info is None: # <<<<<<<<<<<<<< + * raise AttributeError() + * except: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1793 + * return None, False + * + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * if additional_info is None: + */ + } + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L31_try_end; + __pyx_L26_error:; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1797 + * if additional_info is None: + * raise AttributeError() + * except: # <<<<<<<<<<<<<< + * additional_info = py_db.set_additional_thread_info(thread) + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.fix_top_level_trace_and_get_trace_func", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_7) < 0) __PYX_ERR(0, 1797, __pyx_L28_except_error) + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_7); + + /* "_pydevd_bundle/pydevd_cython.pyx":1798 + * raise AttributeError() + * except: + * additional_info = py_db.set_additional_thread_info(thread) # <<<<<<<<<<<<<< + * + * # print('enter thread tracer', thread, get_current_thread_id(thread)) + */ + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_set_additional_thread_info); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 1798, __pyx_L28_except_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_14 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_10))) { + __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_10); + if (likely(__pyx_t_14)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); + __Pyx_INCREF(__pyx_t_14); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_10, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_14, __pyx_v_thread}; + __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1798, __pyx_L28_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_additional_info, __pyx_t_9); + __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L27_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1793 + * return None, False + * + * try: # <<<<<<<<<<<<<< + * additional_info = thread.additional_info + * if additional_info is None: + */ + __pyx_L28_except_error:; + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_13); + __Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13); + goto __pyx_L1_error; + __pyx_L27_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_13); + __Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13); + __pyx_L31_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1801 + * + * # print('enter thread tracer', thread, get_current_thread_id(thread)) + * args = (py_db, thread, additional_info, global_cache_skips, global_cache_frame_skips) # <<<<<<<<<<<<<< + * + * if f_unhandled is not None: + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_global_cache_skips); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1801, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_global_cache_frame_skips); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1801, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1801, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_py_db); + __Pyx_GIVEREF(__pyx_v_py_db); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_py_db)) __PYX_ERR(0, 1801, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_thread); + __Pyx_GIVEREF(__pyx_v_thread); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_thread)) __PYX_ERR(0, 1801, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_additional_info); + __Pyx_GIVEREF(__pyx_v_additional_info); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_additional_info)) __PYX_ERR(0, 1801, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_t_7)) __PYX_ERR(0, 1801, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_t_2)) __PYX_ERR(0, 1801, __pyx_L1_error); + __pyx_t_7 = 0; + __pyx_t_2 = 0; + __pyx_v_args = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1803 + * args = (py_db, thread, additional_info, global_cache_skips, global_cache_frame_skips) + * + * if f_unhandled is not None: # <<<<<<<<<<<<<< + * if f_unhandled.f_back is None and not force_only_unhandled_tracer: + * # Happens when we attach to a running program (cannot reuse instance because it's mutable). + */ + __pyx_t_6 = (__pyx_v_f_unhandled != Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1804 + * + * if f_unhandled is not None: + * if f_unhandled.f_back is None and not force_only_unhandled_tracer: # <<<<<<<<<<<<<< + * # Happens when we attach to a running program (cannot reuse instance because it's mutable). + * top_level_thread_tracer = TopLevelThreadTracerNoBackFrame(ThreadTracer(args), args) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_back); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1804, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = (__pyx_t_3 == Py_None); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_1) { + } else { + __pyx_t_6 = __pyx_t_1; + goto __pyx_L37_bool_binop_done; + } + __pyx_t_1 = (!__pyx_v_force_only_unhandled_tracer); + __pyx_t_6 = __pyx_t_1; + __pyx_L37_bool_binop_done:; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1806 + * if f_unhandled.f_back is None and not force_only_unhandled_tracer: + * # Happens when we attach to a running program (cannot reuse instance because it's mutable). + * top_level_thread_tracer = TopLevelThreadTracerNoBackFrame(ThreadTracer(args), args) # <<<<<<<<<<<<<< + * additional_info.top_level_thread_tracer_no_back_frames.append( + * top_level_thread_tracer + */ + __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer), __pyx_v_args); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1806, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1806, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3)) __PYX_ERR(0, 1806, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_args); + __Pyx_GIVEREF(__pyx_v_args); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_args)) __PYX_ERR(0, 1806, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame), __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1806, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_top_level_thread_tracer = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1807 + * # Happens when we attach to a running program (cannot reuse instance because it's mutable). + * top_level_thread_tracer = TopLevelThreadTracerNoBackFrame(ThreadTracer(args), args) + * additional_info.top_level_thread_tracer_no_back_frames.append( # <<<<<<<<<<<<<< + * top_level_thread_tracer + * ) # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_additional_info, __pyx_n_s_top_level_thread_tracer_no_back); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + + /* "_pydevd_bundle/pydevd_cython.pyx":1808 + * top_level_thread_tracer = TopLevelThreadTracerNoBackFrame(ThreadTracer(args), args) + * additional_info.top_level_thread_tracer_no_back_frames.append( + * top_level_thread_tracer # <<<<<<<<<<<<<< + * ) # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). + * else: + */ + __pyx_t_15 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_v_top_level_thread_tracer); if (unlikely(__pyx_t_15 == ((int)-1))) __PYX_ERR(0, 1807, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1804 + * + * if f_unhandled is not None: + * if f_unhandled.f_back is None and not force_only_unhandled_tracer: # <<<<<<<<<<<<<< + * # Happens when we attach to a running program (cannot reuse instance because it's mutable). + * top_level_thread_tracer = TopLevelThreadTracerNoBackFrame(ThreadTracer(args), args) + */ + goto __pyx_L36; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1811 + * ) # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). + * else: + * top_level_thread_tracer = additional_info.top_level_thread_tracer_unhandled # <<<<<<<<<<<<<< + * if top_level_thread_tracer is None: + * # Stop in some internal place to report about unhandled exceptions + */ + /*else*/ { + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_additional_info, __pyx_n_s_top_level_thread_tracer_unhandle); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1811, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_top_level_thread_tracer = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1812 + * else: + * top_level_thread_tracer = additional_info.top_level_thread_tracer_unhandled + * if top_level_thread_tracer is None: # <<<<<<<<<<<<<< + * # Stop in some internal place to report about unhandled exceptions + * top_level_thread_tracer = TopLevelThreadTracerOnlyUnhandledExceptions(args) + */ + __pyx_t_6 = (__pyx_v_top_level_thread_tracer == Py_None); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1814 + * if top_level_thread_tracer is None: + * # Stop in some internal place to report about unhandled exceptions + * top_level_thread_tracer = TopLevelThreadTracerOnlyUnhandledExceptions(args) # <<<<<<<<<<<<<< + * additional_info.top_level_thread_tracer_unhandled = top_level_thread_tracer # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). + * + */ + __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions), __pyx_v_args); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_top_level_thread_tracer, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1815 + * # Stop in some internal place to report about unhandled exceptions + * top_level_thread_tracer = TopLevelThreadTracerOnlyUnhandledExceptions(args) + * additional_info.top_level_thread_tracer_unhandled = top_level_thread_tracer # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). # <<<<<<<<<<<<<< + * + * # print(' --> found to trace unhandled', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + */ + if (__Pyx_PyObject_SetAttrStr(__pyx_v_additional_info, __pyx_n_s_top_level_thread_tracer_unhandle, __pyx_v_top_level_thread_tracer) < 0) __PYX_ERR(0, 1815, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1812 + * else: + * top_level_thread_tracer = additional_info.top_level_thread_tracer_unhandled + * if top_level_thread_tracer is None: # <<<<<<<<<<<<<< + * # Stop in some internal place to report about unhandled exceptions + * top_level_thread_tracer = TopLevelThreadTracerOnlyUnhandledExceptions(args) + */ + } + } + __pyx_L36:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1818 + * + * # print(' --> found to trace unhandled', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + * f_trace = top_level_thread_tracer.get_trace_dispatch_func() # <<<<<<<<<<<<<< + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_top_level_thread_tracer, __pyx_n_s_get_trace_dispatch_func); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1818, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1818, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_f_trace = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1821 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * f_trace = SafeCallWrapper(f_trace) # <<<<<<<<<<<<<< + * # ENDIF + * # fmt: on + */ + __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper), __pyx_v_f_trace); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1821, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_f_trace, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1824 + * # ENDIF + * # fmt: on + * f_unhandled.f_trace = f_trace # <<<<<<<<<<<<<< + * + * if frame is f_unhandled: + */ + if (__Pyx_PyObject_SetAttrStr(__pyx_v_f_unhandled, __pyx_n_s_f_trace, __pyx_v_f_trace) < 0) __PYX_ERR(0, 1824, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1826 + * f_unhandled.f_trace = f_trace + * + * if frame is f_unhandled: # <<<<<<<<<<<<<< + * return f_trace, False + * + */ + __pyx_t_6 = (__pyx_v_frame == __pyx_v_f_unhandled); + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1827 + * + * if frame is f_unhandled: + * return f_trace, False # <<<<<<<<<<<<<< + * + * thread_tracer = additional_info.thread_tracer + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1827, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_f_trace); + __Pyx_GIVEREF(__pyx_v_f_trace); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_f_trace)) __PYX_ERR(0, 1827, __pyx_L1_error); + __Pyx_INCREF(Py_False); + __Pyx_GIVEREF(Py_False); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, Py_False)) __PYX_ERR(0, 1827, __pyx_L1_error); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1826 + * f_unhandled.f_trace = f_trace + * + * if frame is f_unhandled: # <<<<<<<<<<<<<< + * return f_trace, False + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1803 + * args = (py_db, thread, additional_info, global_cache_skips, global_cache_frame_skips) + * + * if f_unhandled is not None: # <<<<<<<<<<<<<< + * if f_unhandled.f_back is None and not force_only_unhandled_tracer: + * # Happens when we attach to a running program (cannot reuse instance because it's mutable). + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1829 + * return f_trace, False + * + * thread_tracer = additional_info.thread_tracer # <<<<<<<<<<<<<< + * if thread_tracer is None or thread_tracer._args[0] is not py_db: + * thread_tracer = ThreadTracer(args) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_additional_info, __pyx_n_s_thread_tracer); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1829, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_thread_tracer = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1830 + * + * thread_tracer = additional_info.thread_tracer + * if thread_tracer is None or thread_tracer._args[0] is not py_db: # <<<<<<<<<<<<<< + * thread_tracer = ThreadTracer(args) + * additional_info.thread_tracer = thread_tracer + */ + __pyx_t_1 = (__pyx_v_thread_tracer == Py_None); + if (!__pyx_t_1) { + } else { + __pyx_t_6 = __pyx_t_1; + goto __pyx_L42_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread_tracer, __pyx_n_s_args_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1830, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1830, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_1 = (__pyx_t_2 != __pyx_v_py_db); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_6 = __pyx_t_1; + __pyx_L42_bool_binop_done:; + if (__pyx_t_6) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1831 + * thread_tracer = additional_info.thread_tracer + * if thread_tracer is None or thread_tracer._args[0] is not py_db: + * thread_tracer = ThreadTracer(args) # <<<<<<<<<<<<<< + * additional_info.thread_tracer = thread_tracer + * + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer), __pyx_v_args); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1831, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF_SET(__pyx_v_thread_tracer, __pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1832 + * if thread_tracer is None or thread_tracer._args[0] is not py_db: + * thread_tracer = ThreadTracer(args) + * additional_info.thread_tracer = thread_tracer # <<<<<<<<<<<<<< + * + * # fmt: off + */ + if (__Pyx_PyObject_SetAttrStr(__pyx_v_additional_info, __pyx_n_s_thread_tracer, __pyx_v_thread_tracer) < 0) __PYX_ERR(0, 1832, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1830 + * + * thread_tracer = additional_info.thread_tracer + * if thread_tracer is None or thread_tracer._args[0] is not py_db: # <<<<<<<<<<<<<< + * thread_tracer = ThreadTracer(args) + * additional_info.thread_tracer = thread_tracer + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1836 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * return SafeCallWrapper(thread_tracer), True # <<<<<<<<<<<<<< + * # ELSE + * # return thread_tracer, True + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper), __pyx_v_thread_tracer); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1836, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1836, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2)) __PYX_ERR(0, 1836, __pyx_L1_error); + __Pyx_INCREF(Py_True); + __Pyx_GIVEREF(Py_True); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, Py_True)) __PYX_ERR(0, 1836, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1707 + * + * + * def fix_top_level_trace_and_get_trace_func(py_db, frame): # <<<<<<<<<<<<<< + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.fix_top_level_trace_and_get_trace_func", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_name); + __Pyx_XDECREF(__pyx_v_args); + __Pyx_XDECREF(__pyx_v_thread); + __Pyx_XDECREF(__pyx_v_f_unhandled); + __Pyx_XDECREF(__pyx_v_i); + __Pyx_XDECREF(__pyx_v_j); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_XDECREF(__pyx_v_additional_info); + __Pyx_XDECREF(__pyx_v_top_level_thread_tracer); + __Pyx_XDECREF(__pyx_v_f_trace); + __Pyx_XDECREF(__pyx_v_thread_tracer); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1843 + * + * + * def trace_dispatch(py_db, frame, event, arg): # <<<<<<<<<<<<<< + * thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + * if thread_trace_func is None: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_21trace_dispatch(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_21trace_dispatch = {"trace_dispatch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_21trace_dispatch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_21trace_dispatch(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_py_db = 0; + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_event = 0; + PyObject *__pyx_v_arg = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("trace_dispatch (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_py_db,&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_py_db)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1843, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1843, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_dispatch", 1, 4, 4, 1); __PYX_ERR(0, 1843, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1843, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_dispatch", 1, 4, 4, 2); __PYX_ERR(0, 1843, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1843, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_dispatch", 1, 4, 4, 3); __PYX_ERR(0, 1843, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "trace_dispatch") < 0)) __PYX_ERR(0, 1843, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + } + __pyx_v_py_db = values[0]; + __pyx_v_frame = values[1]; + __pyx_v_event = values[2]; + __pyx_v_arg = values[3]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("trace_dispatch", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 1843, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_20trace_dispatch(__pyx_self, __pyx_v_py_db, __pyx_v_frame, __pyx_v_event, __pyx_v_arg); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_20trace_dispatch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_py_db, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) { + PyObject *__pyx_v_thread_trace_func = NULL; + PyObject *__pyx_v_apply_to_settrace = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + unsigned int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *(*__pyx_t_6)(PyObject *); + int __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trace_dispatch", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1844 + * + * def trace_dispatch(py_db, frame, event, arg): + * thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) # <<<<<<<<<<<<<< + * if thread_trace_func is None: + * return None if event == "call" else NO_FTRACE + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_fix_top_level_trace_and_get_trac); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_v_py_db, __pyx_v_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1844, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_2 = PyList_GET_ITEM(sequence, 0); + __pyx_t_3 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + #else + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_5 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_5); + index = 0; __pyx_t_2 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed; + __Pyx_GOTREF(__pyx_t_2); + index = 1; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed; + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 2) < 0) __PYX_ERR(0, 1844, __pyx_L1_error) + __pyx_t_6 = NULL; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L4_unpacking_done; + __pyx_L3_unpacking_failed:; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 1844, __pyx_L1_error) + __pyx_L4_unpacking_done:; + } + __pyx_v_thread_trace_func = __pyx_t_2; + __pyx_t_2 = 0; + __pyx_v_apply_to_settrace = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1845 + * def trace_dispatch(py_db, frame, event, arg): + * thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + * if thread_trace_func is None: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * if apply_to_settrace: + */ + __pyx_t_7 = (__pyx_v_thread_trace_func == Py_None); + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1846 + * thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + * if thread_trace_func is None: + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * if apply_to_settrace: + * py_db.enable_tracing(thread_trace_func) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1846, __pyx_L1_error) + if (__pyx_t_7) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1846, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1845 + * def trace_dispatch(py_db, frame, event, arg): + * thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + * if thread_trace_func is None: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * if apply_to_settrace: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1847 + * if thread_trace_func is None: + * return None if event == "call" else NO_FTRACE + * if apply_to_settrace: # <<<<<<<<<<<<<< + * py_db.enable_tracing(thread_trace_func) + * return thread_trace_func(frame, event, arg) + */ + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_apply_to_settrace); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 1847, __pyx_L1_error) + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1848 + * return None if event == "call" else NO_FTRACE + * if apply_to_settrace: + * py_db.enable_tracing(thread_trace_func) # <<<<<<<<<<<<<< + * return thread_trace_func(frame, event, arg) + * + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_enable_tracing); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1848, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_thread_trace_func}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1848, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1847 + * if thread_trace_func is None: + * return None if event == "call" else NO_FTRACE + * if apply_to_settrace: # <<<<<<<<<<<<<< + * py_db.enable_tracing(thread_trace_func) + * return thread_trace_func(frame, event, arg) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1849 + * if apply_to_settrace: + * py_db.enable_tracing(thread_trace_func) + * return thread_trace_func(frame, event, arg) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_thread_trace_func); + __pyx_t_3 = __pyx_v_thread_trace_func; __pyx_t_2 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_2, __pyx_v_frame, __pyx_v_event, __pyx_v_arg}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1849, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1843 + * + * + * def trace_dispatch(py_db, frame, event, arg): # <<<<<<<<<<<<<< + * thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + * if thread_trace_func is None: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_thread_trace_func); + __Pyx_XDECREF(__pyx_v_apply_to_settrace); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1856 + * cdef class TopLevelThreadTracerOnlyUnhandledExceptions: + * cdef public tuple _args; + * def __init__(self, tuple args): # <<<<<<<<<<<<<< + * self._args = args + * # ELSE + */ + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_args = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_args,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1856, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 1856, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_args = ((PyObject*)values[0]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 1856, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyTuple_Type), 1, "args", 1))) __PYX_ERR(0, 1856, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions___init__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v_self), __pyx_v_args); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions___init__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v_self, PyObject *__pyx_v_args) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1857 + * cdef public tuple _args; + * def __init__(self, tuple args): + * self._args = args # <<<<<<<<<<<<<< + * # ELSE + * # class TopLevelThreadTracerOnlyUnhandledExceptions(object): + */ + __Pyx_INCREF(__pyx_v_args); + __Pyx_GIVEREF(__pyx_v_args); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = __pyx_v_args; + + /* "_pydevd_bundle/pydevd_cython.pyx":1856 + * cdef class TopLevelThreadTracerOnlyUnhandledExceptions: + * cdef public tuple _args; + * def __init__(self, tuple args): # <<<<<<<<<<<<<< + * self._args = args + * # ELSE + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1866 + * # fmt: on + * + * def trace_unhandled_exceptions(self, frame, event, arg): # <<<<<<<<<<<<<< + * # Note that we ignore the frame as this tracing method should only be put in topmost frames already. + * # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_3trace_unhandled_exceptions(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_3trace_unhandled_exceptions = {"trace_unhandled_exceptions", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_3trace_unhandled_exceptions, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_3trace_unhandled_exceptions(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_event = 0; + PyObject *__pyx_v_arg = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("trace_unhandled_exceptions (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1866, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1866, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_unhandled_exceptions", 1, 3, 3, 1); __PYX_ERR(0, 1866, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1866, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_unhandled_exceptions", 1, 3, 3, 2); __PYX_ERR(0, 1866, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "trace_unhandled_exceptions") < 0)) __PYX_ERR(0, 1866, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_frame = values[0]; + __pyx_v_event = values[1]; + __pyx_v_arg = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("trace_unhandled_exceptions", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 1866, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions.trace_unhandled_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_2trace_unhandled_exceptions(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v_self), __pyx_v_frame, __pyx_v_event, __pyx_v_arg); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_2trace_unhandled_exceptions(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) { + PyObject *__pyx_v_py_db = NULL; + PyObject *__pyx_v_t = NULL; + PyObject *__pyx_v_additional_info = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + unsigned int __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trace_unhandled_exceptions", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1869 + * # Note that we ignore the frame as this tracing method should only be put in topmost frames already. + * # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + * if event == "exception" and arg is not None: # <<<<<<<<<<<<<< + * py_db, t, additional_info = self._args[0:3] + * if arg is not None: + */ + __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_exception, Py_EQ)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1869, __pyx_L1_error) + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_arg != Py_None); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1870 + * # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + * if event == "exception" and arg is not None: + * py_db, t, additional_info = self._args[0:3] # <<<<<<<<<<<<<< + * if arg is not None: + * if not additional_info.suspended_at_unhandled: + */ + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1870, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GetSlice(__pyx_v_self->_args, 0, 3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1870, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (1) { + PyObject* sequence = __pyx_t_3; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1870, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1870, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1870, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1870, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v_py_db = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_v_t = __pyx_t_5; + __pyx_t_5 = 0; + __pyx_v_additional_info = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1871 + * if event == "exception" and arg is not None: + * py_db, t, additional_info = self._args[0:3] + * if arg is not None: # <<<<<<<<<<<<<< + * if not additional_info.suspended_at_unhandled: + * additional_info.suspended_at_unhandled = True + */ + __pyx_t_1 = (__pyx_v_arg != Py_None); + if (__pyx_t_1) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1872 + * py_db, t, additional_info = self._args[0:3] + * if arg is not None: + * if not additional_info.suspended_at_unhandled: # <<<<<<<<<<<<<< + * additional_info.suspended_at_unhandled = True + * + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_additional_info, __pyx_n_s_suspended_at_unhandled); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1872, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1872, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1873 + * if arg is not None: + * if not additional_info.suspended_at_unhandled: + * additional_info.suspended_at_unhandled = True # <<<<<<<<<<<<<< + * + * py_db.stop_on_unhandled_exception(py_db, t, additional_info, arg) + */ + if (__Pyx_PyObject_SetAttrStr(__pyx_v_additional_info, __pyx_n_s_suspended_at_unhandled, Py_True) < 0) __PYX_ERR(0, 1873, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1875 + * additional_info.suspended_at_unhandled = True + * + * py_db.stop_on_unhandled_exception(py_db, t, additional_info, arg) # <<<<<<<<<<<<<< + * + * # No need to reset frame.f_trace to keep the same trace function. + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_stop_on_unhandled_exception); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1875, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[5] = {__pyx_t_5, __pyx_v_py_db, __pyx_v_t, __pyx_v_additional_info, __pyx_v_arg}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_7, 4+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1875, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1872 + * py_db, t, additional_info = self._args[0:3] + * if arg is not None: + * if not additional_info.suspended_at_unhandled: # <<<<<<<<<<<<<< + * additional_info.suspended_at_unhandled = True + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1871 + * if event == "exception" and arg is not None: + * py_db, t, additional_info = self._args[0:3] + * if arg is not None: # <<<<<<<<<<<<<< + * if not additional_info.suspended_at_unhandled: + * additional_info.suspended_at_unhandled = True + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1869 + * # Note that we ignore the frame as this tracing method should only be put in topmost frames already. + * # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + * if event == "exception" and arg is not None: # <<<<<<<<<<<<<< + * py_db, t, additional_info = self._args[0:3] + * if arg is not None: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1878 + * + * # No need to reset frame.f_trace to keep the same trace function. + * return self.trace_unhandled_exceptions # <<<<<<<<<<<<<< + * + * def get_trace_dispatch_func(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_unhandled_exceptions); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1878, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1866 + * # fmt: on + * + * def trace_unhandled_exceptions(self, frame, event, arg): # <<<<<<<<<<<<<< + * # Note that we ignore the frame as this tracing method should only be put in topmost frames already. + * # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions.trace_unhandled_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_py_db); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_XDECREF(__pyx_v_additional_info); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1880 + * return self.trace_unhandled_exceptions + * + * def get_trace_dispatch_func(self): # <<<<<<<<<<<<<< + * return self.trace_unhandled_exceptions + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5get_trace_dispatch_func(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5get_trace_dispatch_func = {"get_trace_dispatch_func", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5get_trace_dispatch_func, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5get_trace_dispatch_func(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_trace_dispatch_func (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("get_trace_dispatch_func", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "get_trace_dispatch_func", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_4get_trace_dispatch_func(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_4get_trace_dispatch_func(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_trace_dispatch_func", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1881 + * + * def get_trace_dispatch_func(self): + * return self.trace_unhandled_exceptions # <<<<<<<<<<<<<< + * + * # fmt: off + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_unhandled_exceptions); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1881, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1880 + * return self.trace_unhandled_exceptions + * + * def get_trace_dispatch_func(self): # <<<<<<<<<<<<<< + * return self.trace_unhandled_exceptions + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions.get_trace_dispatch_func", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1855 + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class TopLevelThreadTracerOnlyUnhandledExceptions: + * cdef public tuple _args; # <<<<<<<<<<<<<< + * def __init__(self, tuple args): + * self._args = args + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_args); + __pyx_r = __pyx_v_self->_args; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyTuple_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_value))) __PYX_ERR(0, 1855, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions._args.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_7__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_7__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_6__reduce_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_6__reduce_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self._args,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->_args); + __Pyx_GIVEREF(__pyx_v_self->_args); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->_args)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self._args,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self._args,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(2, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self._args is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self._args,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self._args is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->_args != ((PyObject*)Py_None)); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self._args is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self._args is not None + * if use_setstate: + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_TopLevelThreadTra); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_18997755); + __Pyx_GIVEREF(__pyx_int_18997755); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_18997755)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self._args is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, None), state + * else: + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_TopLevelThreadTra); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_18997755); + __Pyx_GIVEREF(__pyx_int_18997755); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_18997755)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_9__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_9__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(2, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(2, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_8__setstate_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_8__setstate_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1892 + * cdef public set _raise_lines; + * cdef public int _last_raise_line; + * def __init__(self, frame_trace_dispatch, tuple args): # <<<<<<<<<<<<<< + * self._frame_trace_dispatch = frame_trace_dispatch + * self._args = args + */ + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_frame_trace_dispatch = 0; + PyObject *__pyx_v_args = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame_trace_dispatch,&__pyx_n_s_args,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame_trace_dispatch)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1892, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1892, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 1892, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 1892, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_frame_trace_dispatch = values[0]; + __pyx_v_args = ((PyObject*)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 1892, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyTuple_Type), 1, "args", 1))) __PYX_ERR(0, 1892, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame___init__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), __pyx_v_frame_trace_dispatch, __pyx_v_args); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame___init__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v_frame_trace_dispatch, PyObject *__pyx_v_args) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1893 + * cdef public int _last_raise_line; + * def __init__(self, frame_trace_dispatch, tuple args): + * self._frame_trace_dispatch = frame_trace_dispatch # <<<<<<<<<<<<<< + * self._args = args + * self.try_except_infos = None + */ + __Pyx_INCREF(__pyx_v_frame_trace_dispatch); + __Pyx_GIVEREF(__pyx_v_frame_trace_dispatch); + __Pyx_GOTREF(__pyx_v_self->_frame_trace_dispatch); + __Pyx_DECREF(__pyx_v_self->_frame_trace_dispatch); + __pyx_v_self->_frame_trace_dispatch = __pyx_v_frame_trace_dispatch; + + /* "_pydevd_bundle/pydevd_cython.pyx":1894 + * def __init__(self, frame_trace_dispatch, tuple args): + * self._frame_trace_dispatch = frame_trace_dispatch + * self._args = args # <<<<<<<<<<<<<< + * self.try_except_infos = None + * self._last_exc_arg = None + */ + __Pyx_INCREF(__pyx_v_args); + __Pyx_GIVEREF(__pyx_v_args); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = __pyx_v_args; + + /* "_pydevd_bundle/pydevd_cython.pyx":1895 + * self._frame_trace_dispatch = frame_trace_dispatch + * self._args = args + * self.try_except_infos = None # <<<<<<<<<<<<<< + * self._last_exc_arg = None + * self._raise_lines = set() + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->try_except_infos); + __Pyx_DECREF(__pyx_v_self->try_except_infos); + __pyx_v_self->try_except_infos = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":1896 + * self._args = args + * self.try_except_infos = None + * self._last_exc_arg = None # <<<<<<<<<<<<<< + * self._raise_lines = set() + * self._last_raise_line = -1 + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_last_exc_arg); + __Pyx_DECREF(__pyx_v_self->_last_exc_arg); + __pyx_v_self->_last_exc_arg = Py_None; + + /* "_pydevd_bundle/pydevd_cython.pyx":1897 + * self.try_except_infos = None + * self._last_exc_arg = None + * self._raise_lines = set() # <<<<<<<<<<<<<< + * self._last_raise_line = -1 + * # ELSE + */ + __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1897, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_raise_lines); + __Pyx_DECREF(__pyx_v_self->_raise_lines); + __pyx_v_self->_raise_lines = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1898 + * self._last_exc_arg = None + * self._raise_lines = set() + * self._last_raise_line = -1 # <<<<<<<<<<<<<< + * # ELSE + * # class TopLevelThreadTracerNoBackFrame(object): + */ + __pyx_v_self->_last_raise_line = -1; + + /* "_pydevd_bundle/pydevd_cython.pyx":1892 + * cdef public set _raise_lines; + * cdef public int _last_raise_line; + * def __init__(self, frame_trace_dispatch, tuple args): # <<<<<<<<<<<<<< + * self._frame_trace_dispatch = frame_trace_dispatch + * self._args = args + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1924 + * # fmt: on + * + * def trace_dispatch_and_unhandled_exceptions(self, frame, event, arg): # <<<<<<<<<<<<<< + * # DEBUG = 'code_to_debug' in frame.f_code.co_filename + * # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_3trace_dispatch_and_unhandled_exceptions(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_3trace_dispatch_and_unhandled_exceptions = {"trace_dispatch_and_unhandled_exceptions", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_3trace_dispatch_and_unhandled_exceptions, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_3trace_dispatch_and_unhandled_exceptions(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_event = 0; + PyObject *__pyx_v_arg = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("trace_dispatch_and_unhandled_exceptions (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1924, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1924, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_dispatch_and_unhandled_exceptions", 1, 3, 3, 1); __PYX_ERR(0, 1924, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1924, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("trace_dispatch_and_unhandled_exceptions", 1, 3, 3, 2); __PYX_ERR(0, 1924, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "trace_dispatch_and_unhandled_exceptions") < 0)) __PYX_ERR(0, 1924, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_frame = values[0]; + __pyx_v_event = values[1]; + __pyx_v_arg = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("trace_dispatch_and_unhandled_exceptions", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 1924, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame.trace_dispatch_and_unhandled_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_2trace_dispatch_and_unhandled_exceptions(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), __pyx_v_frame, __pyx_v_event, __pyx_v_arg); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_2trace_dispatch_and_unhandled_exceptions(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) { + PyObject *__pyx_v_frame_trace_dispatch = NULL; + PyObject *__pyx_v_py_db = NULL; + PyObject *__pyx_v_t = NULL; + PyObject *__pyx_v_additional_info = NULL; + PyObject *__pyx_v_ret = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + int __pyx_t_10; + char const *__pyx_t_11; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trace_dispatch_and_unhandled_exceptions", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1927 + * # DEBUG = 'code_to_debug' in frame.f_code.co_filename + * # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + * frame_trace_dispatch = self._frame_trace_dispatch # <<<<<<<<<<<<<< + * if frame_trace_dispatch is not None: + * self._frame_trace_dispatch = frame_trace_dispatch(frame, event, arg) + */ + __pyx_t_1 = __pyx_v_self->_frame_trace_dispatch; + __Pyx_INCREF(__pyx_t_1); + __pyx_v_frame_trace_dispatch = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1928 + * # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + * frame_trace_dispatch = self._frame_trace_dispatch + * if frame_trace_dispatch is not None: # <<<<<<<<<<<<<< + * self._frame_trace_dispatch = frame_trace_dispatch(frame, event, arg) + * + */ + __pyx_t_2 = (__pyx_v_frame_trace_dispatch != Py_None); + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1929 + * frame_trace_dispatch = self._frame_trace_dispatch + * if frame_trace_dispatch is not None: + * self._frame_trace_dispatch = frame_trace_dispatch(frame, event, arg) # <<<<<<<<<<<<<< + * + * if event == "exception": + */ + __Pyx_INCREF(__pyx_v_frame_trace_dispatch); + __pyx_t_3 = __pyx_v_frame_trace_dispatch; __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_v_frame, __pyx_v_event, __pyx_v_arg}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1929, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_frame_trace_dispatch); + __Pyx_DECREF(__pyx_v_self->_frame_trace_dispatch); + __pyx_v_self->_frame_trace_dispatch = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1928 + * # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + * frame_trace_dispatch = self._frame_trace_dispatch + * if frame_trace_dispatch is not None: # <<<<<<<<<<<<<< + * self._frame_trace_dispatch = frame_trace_dispatch(frame, event, arg) + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1931 + * self._frame_trace_dispatch = frame_trace_dispatch(frame, event, arg) + * + * if event == "exception": # <<<<<<<<<<<<<< + * self._last_exc_arg = arg + * self._raise_lines.add(frame.f_lineno) + */ + __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_exception, Py_EQ)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1931, __pyx_L1_error) + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1932 + * + * if event == "exception": + * self._last_exc_arg = arg # <<<<<<<<<<<<<< + * self._raise_lines.add(frame.f_lineno) + * self._last_raise_line = frame.f_lineno + */ + __Pyx_INCREF(__pyx_v_arg); + __Pyx_GIVEREF(__pyx_v_arg); + __Pyx_GOTREF(__pyx_v_self->_last_exc_arg); + __Pyx_DECREF(__pyx_v_self->_last_exc_arg); + __pyx_v_self->_last_exc_arg = __pyx_v_arg; + + /* "_pydevd_bundle/pydevd_cython.pyx":1933 + * if event == "exception": + * self._last_exc_arg = arg + * self._raise_lines.add(frame.f_lineno) # <<<<<<<<<<<<<< + * self._last_raise_line = frame.f_lineno + * + */ + if (unlikely(__pyx_v_self->_raise_lines == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "add"); + __PYX_ERR(0, 1933, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1933, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PySet_Add(__pyx_v_self->_raise_lines, __pyx_t_1); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 1933, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1934 + * self._last_exc_arg = arg + * self._raise_lines.add(frame.f_lineno) + * self._last_raise_line = frame.f_lineno # <<<<<<<<<<<<<< + * + * elif event == "return" and self._last_exc_arg is not None: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_lineno); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1934, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1934, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_self->_last_raise_line = __pyx_t_7; + + /* "_pydevd_bundle/pydevd_cython.pyx":1931 + * self._frame_trace_dispatch = frame_trace_dispatch(frame, event, arg) + * + * if event == "exception": # <<<<<<<<<<<<<< + * self._last_exc_arg = arg + * self._raise_lines.add(frame.f_lineno) + */ + goto __pyx_L4; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1936 + * self._last_raise_line = frame.f_lineno + * + * elif event == "return" and self._last_exc_arg is not None: # <<<<<<<<<<<<<< + * # For unhandled exceptions we actually track the return when at the topmost level. + * try: + */ + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_return, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 1936, __pyx_L1_error) + if (__pyx_t_8) { + } else { + __pyx_t_2 = __pyx_t_8; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_8 = (__pyx_v_self->_last_exc_arg != Py_None); + __pyx_t_2 = __pyx_t_8; + __pyx_L5_bool_binop_done:; + if (__pyx_t_2) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1938 + * elif event == "return" and self._last_exc_arg is not None: + * # For unhandled exceptions we actually track the return when at the topmost level. + * try: # <<<<<<<<<<<<<< + * py_db, t, additional_info = self._args[0:3] + * if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. + */ + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":1939 + * # For unhandled exceptions we actually track the return when at the topmost level. + * try: + * py_db, t, additional_info = self._args[0:3] # <<<<<<<<<<<<<< + * if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. + * if is_unhandled_exception(self, py_db, frame, self._last_raise_line, self._raise_lines): + */ + if (unlikely(__pyx_v_self->_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 1939, __pyx_L8_error) + } + __pyx_t_1 = __Pyx_PyTuple_GetSlice(__pyx_v_self->_args, 0, 3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1939, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_1); + if (1) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 1939, __pyx_L8_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_9); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1939, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1939, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_9 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1939, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_v_py_db = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_t = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_v_additional_info = __pyx_t_9; + __pyx_t_9 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1940 + * try: + * py_db, t, additional_info = self._args[0:3] + * if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. # <<<<<<<<<<<<<< + * if is_unhandled_exception(self, py_db, frame, self._last_raise_line, self._raise_lines): + * py_db.stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_additional_info, __pyx_n_s_suspended_at_unhandled); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1940, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1940, __pyx_L8_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_8 = (!__pyx_t_2); + if (__pyx_t_8) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1941 + * py_db, t, additional_info = self._args[0:3] + * if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. + * if is_unhandled_exception(self, py_db, frame, self._last_raise_line, self._raise_lines): # <<<<<<<<<<<<<< + * py_db.stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) + * finally: + */ + __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_is_unhandled_exception); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1941, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->_last_raise_line); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1941, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_9))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_9); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_9, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[6] = {__pyx_t_3, ((PyObject *)__pyx_v_self), __pyx_v_py_db, __pyx_v_frame, __pyx_t_4, __pyx_v_self->_raise_lines}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_5, 5+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1941, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 1941, __pyx_L8_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_8) { + + /* "_pydevd_bundle/pydevd_cython.pyx":1942 + * if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. + * if is_unhandled_exception(self, py_db, frame, self._last_raise_line, self._raise_lines): + * py_db.stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) # <<<<<<<<<<<<<< + * finally: + * # Remove reference to exception after handling it. + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_stop_on_unhandled_exception); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1942, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_9))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_9); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_9, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[5] = {__pyx_t_4, __pyx_v_py_db, __pyx_v_t, __pyx_v_additional_info, __pyx_v_self->_last_exc_arg}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_5, 4+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1942, __pyx_L8_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1941 + * py_db, t, additional_info = self._args[0:3] + * if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. + * if is_unhandled_exception(self, py_db, frame, self._last_raise_line, self._raise_lines): # <<<<<<<<<<<<<< + * py_db.stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) + * finally: + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1940 + * try: + * py_db, t, additional_info = self._args[0:3] + * if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. # <<<<<<<<<<<<<< + * if is_unhandled_exception(self, py_db, frame, self._last_raise_line, self._raise_lines): + * py_db.stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) + */ + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1945 + * finally: + * # Remove reference to exception after handling it. + * self._last_exc_arg = None # <<<<<<<<<<<<<< + * + * ret = self.trace_dispatch_and_unhandled_exceptions + */ + /*finally:*/ { + /*normal exit:*/{ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_last_exc_arg); + __Pyx_DECREF(__pyx_v_self->_last_exc_arg); + __pyx_v_self->_last_exc_arg = Py_None; + goto __pyx_L9; + } + __pyx_L8_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14) < 0)) __Pyx_ErrFetch(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14); + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XGOTREF(__pyx_t_14); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_17); + __pyx_t_7 = __pyx_lineno; __pyx_t_10 = __pyx_clineno; __pyx_t_11 = __pyx_filename; + { + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_last_exc_arg); + __Pyx_DECREF(__pyx_v_self->_last_exc_arg); + __pyx_v_self->_last_exc_arg = Py_None; + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); + } + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_13); + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_ErrRestore(__pyx_t_12, __pyx_t_13, __pyx_t_14); + __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __pyx_lineno = __pyx_t_7; __pyx_clineno = __pyx_t_10; __pyx_filename = __pyx_t_11; + goto __pyx_L1_error; + } + __pyx_L9:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1936 + * self._last_raise_line = frame.f_lineno + * + * elif event == "return" and self._last_exc_arg is not None: # <<<<<<<<<<<<<< + * # For unhandled exceptions we actually track the return when at the topmost level. + * try: + */ + } + __pyx_L4:; + + /* "_pydevd_bundle/pydevd_cython.pyx":1947 + * self._last_exc_arg = None + * + * ret = self.trace_dispatch_and_unhandled_exceptions # <<<<<<<<<<<<<< + * + * # Need to reset (the call to _frame_trace_dispatch may have changed it). + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch_and_unhandled_exc); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1947, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ret = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1952 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * frame.f_trace = SafeCallWrapper(ret) # <<<<<<<<<<<<<< + * # ELSE + * # frame.f_trace = ret + */ + __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper), __pyx_v_ret); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1952, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_1) < 0) __PYX_ERR(0, 1952, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1957 + * # ENDIF + * # fmt: on + * return ret # <<<<<<<<<<<<<< + * + * def get_trace_dispatch_func(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_ret); + __pyx_r = __pyx_v_ret; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1924 + * # fmt: on + * + * def trace_dispatch_and_unhandled_exceptions(self, frame, event, arg): # <<<<<<<<<<<<<< + * # DEBUG = 'code_to_debug' in frame.f_code.co_filename + * # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame.trace_dispatch_and_unhandled_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_frame_trace_dispatch); + __Pyx_XDECREF(__pyx_v_py_db); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_XDECREF(__pyx_v_additional_info); + __Pyx_XDECREF(__pyx_v_ret); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1959 + * return ret + * + * def get_trace_dispatch_func(self): # <<<<<<<<<<<<<< + * return self.trace_dispatch_and_unhandled_exceptions + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5get_trace_dispatch_func(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5get_trace_dispatch_func = {"get_trace_dispatch_func", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5get_trace_dispatch_func, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5get_trace_dispatch_func(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_trace_dispatch_func (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("get_trace_dispatch_func", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "get_trace_dispatch_func", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_4get_trace_dispatch_func(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_4get_trace_dispatch_func(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_trace_dispatch_func", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1960 + * + * def get_trace_dispatch_func(self): + * return self.trace_dispatch_and_unhandled_exceptions # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_dispatch_and_unhandled_exc); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1960, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1959 + * return ret + * + * def get_trace_dispatch_func(self): # <<<<<<<<<<<<<< + * return self.trace_dispatch_and_unhandled_exceptions + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame.get_trace_dispatch_func", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1886 + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class TopLevelThreadTracerNoBackFrame: + * cdef public object _frame_trace_dispatch; # <<<<<<<<<<<<<< + * cdef public tuple _args; + * cdef public object try_except_infos; + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_frame_trace_dispatch); + __pyx_r = __pyx_v_self->_frame_trace_dispatch; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->_frame_trace_dispatch); + __Pyx_DECREF(__pyx_v_self->_frame_trace_dispatch); + __pyx_v_self->_frame_trace_dispatch = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_frame_trace_dispatch); + __Pyx_DECREF(__pyx_v_self->_frame_trace_dispatch); + __pyx_v_self->_frame_trace_dispatch = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1887 + * cdef class TopLevelThreadTracerNoBackFrame: + * cdef public object _frame_trace_dispatch; + * cdef public tuple _args; # <<<<<<<<<<<<<< + * cdef public object try_except_infos; + * cdef public object _last_exc_arg; + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_args); + __pyx_r = __pyx_v_self->_args; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyTuple_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_value))) __PYX_ERR(0, 1887, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame._args.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1888 + * cdef public object _frame_trace_dispatch; + * cdef public tuple _args; + * cdef public object try_except_infos; # <<<<<<<<<<<<<< + * cdef public object _last_exc_arg; + * cdef public set _raise_lines; + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->try_except_infos); + __pyx_r = __pyx_v_self->try_except_infos; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->try_except_infos); + __Pyx_DECREF(__pyx_v_self->try_except_infos); + __pyx_v_self->try_except_infos = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->try_except_infos); + __Pyx_DECREF(__pyx_v_self->try_except_infos); + __pyx_v_self->try_except_infos = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1889 + * cdef public tuple _args; + * cdef public object try_except_infos; + * cdef public object _last_exc_arg; # <<<<<<<<<<<<<< + * cdef public set _raise_lines; + * cdef public int _last_raise_line; + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_last_exc_arg); + __pyx_r = __pyx_v_self->_last_exc_arg; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->_last_exc_arg); + __Pyx_DECREF(__pyx_v_self->_last_exc_arg); + __pyx_v_self->_last_exc_arg = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_last_exc_arg); + __Pyx_DECREF(__pyx_v_self->_last_exc_arg); + __pyx_v_self->_last_exc_arg = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1890 + * cdef public object try_except_infos; + * cdef public object _last_exc_arg; + * cdef public set _raise_lines; # <<<<<<<<<<<<<< + * cdef public int _last_raise_line; + * def __init__(self, frame_trace_dispatch, tuple args): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_raise_lines); + __pyx_r = __pyx_v_self->_raise_lines; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("set", __pyx_v_value))) __PYX_ERR(0, 1890, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_raise_lines); + __Pyx_DECREF(__pyx_v_self->_raise_lines); + __pyx_v_self->_raise_lines = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame._raise_lines.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_raise_lines); + __Pyx_DECREF(__pyx_v_self->_raise_lines); + __pyx_v_self->_raise_lines = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1891 + * cdef public object _last_exc_arg; + * cdef public set _raise_lines; + * cdef public int _last_raise_line; # <<<<<<<<<<<<<< + * def __init__(self, frame_trace_dispatch, tuple args): + * self._frame_trace_dispatch = frame_trace_dispatch + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_last_raise_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1891, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame._last_raise_line.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1891, __pyx_L1_error) + __pyx_v_self->_last_raise_line = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame._last_raise_line.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_7__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_7__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_6__reduce_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_6__reduce_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self._args, self._frame_trace_dispatch, self._last_exc_arg, self._last_raise_line, self._raise_lines, self.try_except_infos) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_last_raise_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(6); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_self->_args); + __Pyx_GIVEREF(__pyx_v_self->_args); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->_args)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->_frame_trace_dispatch); + __Pyx_GIVEREF(__pyx_v_self->_frame_trace_dispatch); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->_frame_trace_dispatch)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->_last_exc_arg); + __Pyx_GIVEREF(__pyx_v_self->_last_exc_arg); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->_last_exc_arg)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->_raise_lines); + __Pyx_GIVEREF(__pyx_v_self->_raise_lines); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_v_self->_raise_lines)) __PYX_ERR(2, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->try_except_infos); + __Pyx_GIVEREF(__pyx_v_self->try_except_infos); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 5, __pyx_v_self->try_except_infos)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self._args, self._frame_trace_dispatch, self._last_exc_arg, self._last_raise_line, self._raise_lines, self.try_except_infos) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v__dict = __pyx_t_2; + __pyx_t_2 = 0; + + /* "(tree fragment)":7 + * state = (self._args, self._frame_trace_dispatch, self._last_exc_arg, self._last_raise_line, self._raise_lines, self.try_except_infos) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_3 = (__pyx_v__dict != Py_None); + if (__pyx_t_3) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict)) __PYX_ERR(2, 8, __pyx_L1_error); + __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self._args is not None or self._frame_trace_dispatch is not None or self._last_exc_arg is not None or self._raise_lines is not None or self.try_except_infos is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self._args, self._frame_trace_dispatch, self._last_exc_arg, self._last_raise_line, self._raise_lines, self.try_except_infos) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self._args is not None or self._frame_trace_dispatch is not None or self._last_exc_arg is not None or self._raise_lines is not None or self.try_except_infos is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, None), state + */ + /*else*/ { + __pyx_t_4 = (__pyx_v_self->_args != ((PyObject*)Py_None)); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = (__pyx_v_self->_frame_trace_dispatch != Py_None); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = (__pyx_v_self->_last_exc_arg != Py_None); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = (__pyx_v_self->_raise_lines != ((PyObject*)Py_None)); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = (__pyx_v_self->try_except_infos != Py_None); + __pyx_t_3 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_3; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self._args is not None or self._frame_trace_dispatch is not None or self._last_exc_arg is not None or self._raise_lines is not None or self.try_except_infos is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self._args is not None or self._frame_trace_dispatch is not None or self._last_exc_arg is not None or self._raise_lines is not None or self.try_except_infos is not None + * if use_setstate: + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle_TopLevelThreadTra_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_66451433); + __Pyx_GIVEREF(__pyx_int_66451433); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_66451433)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self._args is not None or self._frame_trace_dispatch is not None or self._last_exc_arg is not None or self._raise_lines is not None or self.try_except_infos is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, None), state + * else: + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_TopLevelThreadTra_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_66451433); + __Pyx_GIVEREF(__pyx_int_66451433); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_66451433)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_5 = 0; + __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_9__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_9__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(2, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(2, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_8__setstate_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_8__setstate_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1967 + * cdef class ThreadTracer: + * cdef public tuple _args; + * def __init__(self, tuple args): # <<<<<<<<<<<<<< + * self._args = args + * # ELSE + */ + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_args = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_args,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1967, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 1967, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_args = ((PyObject*)values[0]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 1967, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyTuple_Type), 1, "args", 1))) __PYX_ERR(0, 1967, __pyx_L1_error) + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer___init__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)__pyx_v_self), __pyx_v_args); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer___init__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *__pyx_v_self, PyObject *__pyx_v_args) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":1968 + * cdef public tuple _args; + * def __init__(self, tuple args): + * self._args = args # <<<<<<<<<<<<<< + * # ELSE + * # class ThreadTracer(object): + */ + __Pyx_INCREF(__pyx_v_args); + __Pyx_GIVEREF(__pyx_v_args); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = __pyx_v_args; + + /* "_pydevd_bundle/pydevd_cython.pyx":1967 + * cdef class ThreadTracer: + * cdef public tuple _args; + * def __init__(self, tuple args): # <<<<<<<<<<<<<< + * self._args = args + * # ELSE + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1977 + * # fmt: on + * + * def __call__(self, frame, event, arg): # <<<<<<<<<<<<<< + * """This is the callback used when we enter some context in the debugger. + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +PyDoc_STRVAR(__pyx_doc_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_2__call__, "This is the callback used when we enter some context in the debugger.\n\n We also decorate the thread we are in with info about the debugging.\n The attributes added are:\n pydev_state\n pydev_step_stop\n pydev_step_cmd\n pydev_notify_kill\n\n :param PyDB py_db:\n This is the global debugger (this method should actually be added as a method to it).\n "); +#if CYTHON_UPDATE_DESCRIPTOR_DOC +struct wrapperbase __pyx_wrapperbase_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_2__call__; +#endif +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_event = 0; + PyObject *__pyx_v_arg = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1977, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1977, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__call__", 1, 3, 3, 1); __PYX_ERR(0, 1977, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1977, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__call__", 1, 3, 3, 2); __PYX_ERR(0, 1977, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__call__") < 0)) __PYX_ERR(0, 1977, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_frame = values[0]; + __pyx_v_event = values[1]; + __pyx_v_arg = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__call__", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 1977, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_2__call__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)__pyx_v_self), __pyx_v_frame, __pyx_v_event, __pyx_v_arg); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_2__call__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) { + int __pyx_v_pydev_step_cmd; + PyObject *__pyx_v_frame_cache_key = 0; + PyObject *__pyx_v_cache_skips = 0; + int __pyx_v_is_stepping; + PyObject *__pyx_v_abs_path_canonical_path_and_base = 0; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_additional_info = 0; + PyObject *__pyx_v_py_db = NULL; + PyObject *__pyx_v_t = NULL; + PyObject *__pyx_v_frame_skips_cache = NULL; + PyObject *__pyx_v_back_frame = NULL; + PyObject *__pyx_v_back_frame_cache_key = NULL; + PyObject *__pyx_v_file_type = NULL; + PyObject *__pyx_v_ret = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + unsigned int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + int __pyx_t_18; + char const *__pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__call__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":2005 + * # DEBUG = 'code_to_debug' in frame.f_code.co_filename + * # if DEBUG: print('ENTER: trace_dispatch: %s %s %s %s' % (frame.f_code.co_filename, frame.f_lineno, event, frame.f_code.co_name)) + * py_db, t, additional_info, cache_skips, frame_skips_cache = self._args # <<<<<<<<<<<<<< + * if additional_info.is_tracing: + * return None if event == "call" else NO_FTRACE # we don't wan't to trace code invoked from pydevd_frame.trace_dispatch + */ + __pyx_t_1 = __pyx_v_self->_args; + __Pyx_INCREF(__pyx_t_1); + if (likely(__pyx_t_1 != Py_None)) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 5)) { + if (size > 5) __Pyx_RaiseTooManyValuesError(5); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 2005, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 4); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + #else + { + Py_ssize_t i; + PyObject** temps[5] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6}; + for (i=0; i < 5; i++) { + PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) __PYX_ERR(0, 2005, __pyx_L1_error) + __Pyx_GOTREF(item); + *(temps[i]) = item; + } + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(0, 2005, __pyx_L1_error) + } + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 2005, __pyx_L1_error) + if (!(likely(PyDict_CheckExact(__pyx_t_5))||((__pyx_t_5) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_5))) __PYX_ERR(0, 2005, __pyx_L1_error) + __pyx_v_py_db = __pyx_t_2; + __pyx_t_2 = 0; + __pyx_v_t = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_4); + __pyx_t_4 = 0; + __pyx_v_cache_skips = ((PyObject*)__pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_frame_skips_cache = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2006 + * # if DEBUG: print('ENTER: trace_dispatch: %s %s %s %s' % (frame.f_code.co_filename, frame.f_lineno, event, frame.f_code.co_name)) + * py_db, t, additional_info, cache_skips, frame_skips_cache = self._args + * if additional_info.is_tracing: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE # we don't wan't to trace code invoked from pydevd_frame.trace_dispatch + * + */ + __pyx_t_7 = (__pyx_v_additional_info->is_tracing != 0); + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2007 + * py_db, t, additional_info, cache_skips, frame_skips_cache = self._args + * if additional_info.is_tracing: + * return None if event == "call" else NO_FTRACE # we don't wan't to trace code invoked from pydevd_frame.trace_dispatch # <<<<<<<<<<<<<< + * + * additional_info.is_tracing += 1 + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 2007, __pyx_L1_error) + if (__pyx_t_7) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2007, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __pyx_t_6; + __pyx_t_6 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2006 + * # if DEBUG: print('ENTER: trace_dispatch: %s %s %s %s' % (frame.f_code.co_filename, frame.f_lineno, event, frame.f_code.co_name)) + * py_db, t, additional_info, cache_skips, frame_skips_cache = self._args + * if additional_info.is_tracing: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE # we don't wan't to trace code invoked from pydevd_frame.trace_dispatch + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2009 + * return None if event == "call" else NO_FTRACE # we don't wan't to trace code invoked from pydevd_frame.trace_dispatch + * + * additional_info.is_tracing += 1 # <<<<<<<<<<<<<< + * try: + * pydev_step_cmd = additional_info.pydev_step_cmd + */ + __pyx_v_additional_info->is_tracing = (__pyx_v_additional_info->is_tracing + 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":2010 + * + * additional_info.is_tracing += 1 + * try: # <<<<<<<<<<<<<< + * pydev_step_cmd = additional_info.pydev_step_cmd + * is_stepping = pydev_step_cmd != -1 + */ + /*try:*/ { + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":2011 + * additional_info.is_tracing += 1 + * try: + * pydev_step_cmd = additional_info.pydev_step_cmd # <<<<<<<<<<<<<< + * is_stepping = pydev_step_cmd != -1 + * if py_db.pydb_disposed: + */ + __pyx_t_11 = __pyx_v_additional_info->pydev_step_cmd; + __pyx_v_pydev_step_cmd = __pyx_t_11; + + /* "_pydevd_bundle/pydevd_cython.pyx":2012 + * try: + * pydev_step_cmd = additional_info.pydev_step_cmd + * is_stepping = pydev_step_cmd != -1 # <<<<<<<<<<<<<< + * if py_db.pydb_disposed: + * return None if event == "call" else NO_FTRACE + */ + __pyx_v_is_stepping = (__pyx_v_pydev_step_cmd != -1L); + + /* "_pydevd_bundle/pydevd_cython.pyx":2013 + * pydev_step_cmd = additional_info.pydev_step_cmd + * is_stepping = pydev_step_cmd != -1 + * if py_db.pydb_disposed: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_pydb_disposed); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2013, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 2013, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_7) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2014 + * is_stepping = pydev_step_cmd != -1 + * if py_db.pydb_disposed: + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * + * # if thread is not alive, cancel trace_dispatch processing + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 2014, __pyx_L7_error) + if (__pyx_t_7) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2014, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __pyx_t_6; + __pyx_t_6 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2013 + * pydev_step_cmd = additional_info.pydev_step_cmd + * is_stepping = pydev_step_cmd != -1 + * if py_db.pydb_disposed: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2017 + * + * # if thread is not alive, cancel trace_dispatch processing + * if not is_thread_alive(t): # <<<<<<<<<<<<<< + * py_db.notify_thread_not_alive(get_current_thread_id(t)) + * return None if event == "call" else NO_FTRACE + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_is_thread_alive); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2017, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_v_t}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2017, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 2017, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_13 = (!__pyx_t_7); + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2018 + * # if thread is not alive, cancel trace_dispatch processing + * if not is_thread_alive(t): + * py_db.notify_thread_not_alive(get_current_thread_id(t)) # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_notify_thread_not_alive); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2018, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_get_current_thread_id); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2018, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_t}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2018, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_4 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2018, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2019 + * if not is_thread_alive(t): + * py_db.notify_thread_not_alive(get_current_thread_id(t)) + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * + * # Note: it's important that the context name is also given because we may hit something once + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_13 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2019, __pyx_L7_error) + if (__pyx_t_13) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2019, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __pyx_t_6; + __pyx_t_6 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2017 + * + * # if thread is not alive, cancel trace_dispatch processing + * if not is_thread_alive(t): # <<<<<<<<<<<<<< + * py_db.notify_thread_not_alive(get_current_thread_id(t)) + * return None if event == "call" else NO_FTRACE + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2023 + * # Note: it's important that the context name is also given because we may hit something once + * # in the global context and another in the local context. + * frame_cache_key = frame.f_code # <<<<<<<<<<<<<< + * if frame_cache_key in cache_skips: + * if not is_stepping: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2023, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_frame_cache_key = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2024 + * # in the global context and another in the local context. + * frame_cache_key = frame.f_code + * if frame_cache_key in cache_skips: # <<<<<<<<<<<<<< + * if not is_stepping: + * # if DEBUG: print('skipped: trace_dispatch (cache hit)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + */ + if (unlikely(__pyx_v_cache_skips == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 2024, __pyx_L7_error) + } + __pyx_t_13 = (__Pyx_PyDict_ContainsTF(__pyx_v_frame_cache_key, __pyx_v_cache_skips, Py_EQ)); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2024, __pyx_L7_error) + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2025 + * frame_cache_key = frame.f_code + * if frame_cache_key in cache_skips: + * if not is_stepping: # <<<<<<<<<<<<<< + * # if DEBUG: print('skipped: trace_dispatch (cache hit)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE + */ + __pyx_t_13 = (!__pyx_v_is_stepping); + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2027 + * if not is_stepping: + * # if DEBUG: print('skipped: trace_dispatch (cache hit)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * else: + * # When stepping we can't take into account caching based on the breakpoints (only global filtering). + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_13 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2027, __pyx_L7_error) + if (__pyx_t_13) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2027, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __pyx_t_6; + __pyx_t_6 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2025 + * frame_cache_key = frame.f_code + * if frame_cache_key in cache_skips: + * if not is_stepping: # <<<<<<<<<<<<<< + * # if DEBUG: print('skipped: trace_dispatch (cache hit)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2030 + * else: + * # When stepping we can't take into account caching based on the breakpoints (only global filtering). + * if cache_skips.get(frame_cache_key) == 1: # <<<<<<<<<<<<<< + * if ( + * additional_info.pydev_original_step_cmd in (107, 144) + */ + /*else*/ { + if (unlikely(__pyx_v_cache_skips == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 2030, __pyx_L7_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItemDefault(__pyx_v_cache_skips, __pyx_v_frame_cache_key, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2030, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = (__Pyx_PyInt_BoolEqObjC(__pyx_t_1, __pyx_int_1, 1, 0)); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2030, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2032 + * if cache_skips.get(frame_cache_key) == 1: + * if ( + * additional_info.pydev_original_step_cmd in (107, 144) # <<<<<<<<<<<<<< + * and not _global_notify_skipped_step_in + * ): + */ + switch (__pyx_v_additional_info->pydev_original_step_cmd) { + case 0x6B: + case 0x90: + __pyx_t_7 = 1; + break; + default: + __pyx_t_7 = 0; + break; + } + __pyx_t_14 = __pyx_t_7; + if (__pyx_t_14) { + } else { + __pyx_t_13 = __pyx_t_14; + goto __pyx_L19_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2033 + * if ( + * additional_info.pydev_original_step_cmd in (107, 144) + * and not _global_notify_skipped_step_in # <<<<<<<<<<<<<< + * ): + * notify_skipped_step_in_because_of_filters(py_db, frame) + */ + __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2033, __pyx_L7_error) + __pyx_t_7 = (!__pyx_t_14); + __pyx_t_13 = __pyx_t_7; + __pyx_L19_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":2031 + * # When stepping we can't take into account caching based on the breakpoints (only global filtering). + * if cache_skips.get(frame_cache_key) == 1: + * if ( # <<<<<<<<<<<<<< + * additional_info.pydev_original_step_cmd in (107, 144) + * and not _global_notify_skipped_step_in + */ + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2035 + * and not _global_notify_skipped_step_in + * ): + * notify_skipped_step_in_because_of_filters(py_db, frame) # <<<<<<<<<<<<<< + * + * back_frame = frame.f_back + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_notify_skipped_step_in_because_o); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2035, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_v_py_db, __pyx_v_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_12, 2+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2035, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2031 + * # When stepping we can't take into account caching based on the breakpoints (only global filtering). + * if cache_skips.get(frame_cache_key) == 1: + * if ( # <<<<<<<<<<<<<< + * additional_info.pydev_original_step_cmd in (107, 144) + * and not _global_notify_skipped_step_in + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2037 + * notify_skipped_step_in_because_of_filters(py_db, frame) + * + * back_frame = frame.f_back # <<<<<<<<<<<<<< + * if back_frame is not None and pydev_step_cmd in ( + * 107, + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2037, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_back_frame = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2038 + * + * back_frame = frame.f_back + * if back_frame is not None and pydev_step_cmd in ( # <<<<<<<<<<<<<< + * 107, + * 144, + */ + __pyx_t_7 = (__pyx_v_back_frame != Py_None); + if (__pyx_t_7) { + } else { + __pyx_t_13 = __pyx_t_7; + goto __pyx_L22_bool_binop_done; + } + switch (__pyx_v_pydev_step_cmd) { + case 0x6B: + + /* "_pydevd_bundle/pydevd_cython.pyx":2039 + * back_frame = frame.f_back + * if back_frame is not None and pydev_step_cmd in ( + * 107, # <<<<<<<<<<<<<< + * 144, + * 109, + */ + case 0x90: + + /* "_pydevd_bundle/pydevd_cython.pyx":2040 + * if back_frame is not None and pydev_step_cmd in ( + * 107, + * 144, # <<<<<<<<<<<<<< + * 109, + * 160, + */ + case 0x6D: + + /* "_pydevd_bundle/pydevd_cython.pyx":2041 + * 107, + * 144, + * 109, # <<<<<<<<<<<<<< + * 160, + * ): + */ + case 0xA0: + + /* "_pydevd_bundle/pydevd_cython.pyx":2038 + * + * back_frame = frame.f_back + * if back_frame is not None and pydev_step_cmd in ( # <<<<<<<<<<<<<< + * 107, + * 144, + */ + __pyx_t_7 = 1; + break; + default: + __pyx_t_7 = 0; + break; + } + __pyx_t_14 = __pyx_t_7; + __pyx_t_13 = __pyx_t_14; + __pyx_L22_bool_binop_done:; + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2044 + * 160, + * ): + * back_frame_cache_key = back_frame.f_code # <<<<<<<<<<<<<< + * if cache_skips.get(back_frame_cache_key) == 1: + * # if DEBUG: print('skipped: trace_dispatch (cache hit: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_back_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2044, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_back_frame_cache_key = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2045 + * ): + * back_frame_cache_key = back_frame.f_code + * if cache_skips.get(back_frame_cache_key) == 1: # <<<<<<<<<<<<<< + * # if DEBUG: print('skipped: trace_dispatch (cache hit: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE + */ + if (unlikely(__pyx_v_cache_skips == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 2045, __pyx_L7_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItemDefault(__pyx_v_cache_skips, __pyx_v_back_frame_cache_key, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2045, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = (__Pyx_PyInt_BoolEqObjC(__pyx_t_1, __pyx_int_1, 1, 0)); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2045, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2047 + * if cache_skips.get(back_frame_cache_key) == 1: + * # if DEBUG: print('skipped: trace_dispatch (cache hit: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * else: + * # if DEBUG: print('skipped: trace_dispatch (cache hit: 2)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_13 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2047, __pyx_L7_error) + if (__pyx_t_13) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2047, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __pyx_t_6; + __pyx_t_6 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2045 + * ): + * back_frame_cache_key = back_frame.f_code + * if cache_skips.get(back_frame_cache_key) == 1: # <<<<<<<<<<<<<< + * # if DEBUG: print('skipped: trace_dispatch (cache hit: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2038 + * + * back_frame = frame.f_back + * if back_frame is not None and pydev_step_cmd in ( # <<<<<<<<<<<<<< + * 107, + * 144, + */ + goto __pyx_L21; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2050 + * else: + * # if DEBUG: print('skipped: trace_dispatch (cache hit: 2)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_13 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2050, __pyx_L7_error) + if (__pyx_t_13) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2050, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __pyx_t_6; + __pyx_t_6 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + } + __pyx_L21:; + + /* "_pydevd_bundle/pydevd_cython.pyx":2030 + * else: + * # When stepping we can't take into account caching based on the breakpoints (only global filtering). + * if cache_skips.get(frame_cache_key) == 1: # <<<<<<<<<<<<<< + * if ( + * additional_info.pydev_original_step_cmd in (107, 144) + */ + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2024 + * # in the global context and another in the local context. + * frame_cache_key = frame.f_code + * if frame_cache_key in cache_skips: # <<<<<<<<<<<<<< + * if not is_stepping: + * # if DEBUG: print('skipped: trace_dispatch (cache hit)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2052 + * return None if event == "call" else NO_FTRACE + * + * try: # <<<<<<<<<<<<<< + * # Make fast path faster! + * abs_path_canonical_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_17); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":2054 + * try: + * # Make fast path faster! + * abs_path_canonical_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] # <<<<<<<<<<<<<< + * except: + * abs_path_canonical_path_and_base = get_abs_path_real_path_and_base_from_frame(frame) + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2054, __pyx_L25_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2054, __pyx_L25_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2054, __pyx_L25_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2054, __pyx_L25_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(PyTuple_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_6))) __PYX_ERR(0, 2054, __pyx_L25_error) + __pyx_v_abs_path_canonical_path_and_base = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2052 + * return None if event == "call" else NO_FTRACE + * + * try: # <<<<<<<<<<<<<< + * # Make fast path faster! + * abs_path_canonical_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + */ + } + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + goto __pyx_L30_try_end; + __pyx_L25_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2055 + * # Make fast path faster! + * abs_path_canonical_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + * except: # <<<<<<<<<<<<<< + * abs_path_canonical_path_and_base = get_abs_path_real_path_and_base_from_frame(frame) + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(0, 2055, __pyx_L27_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + + /* "_pydevd_bundle/pydevd_cython.pyx":2056 + * abs_path_canonical_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + * except: + * abs_path_canonical_path_and_base = get_abs_path_real_path_and_base_from_frame(frame) # <<<<<<<<<<<<<< + * + * file_type = py_db.get_file_type( + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_get_abs_path_real_path_and_base); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2056, __pyx_L27_except_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_frame}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2056, __pyx_L27_except_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + if (!(likely(PyTuple_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_4))) __PYX_ERR(0, 2056, __pyx_L27_except_error) + __Pyx_XDECREF_SET(__pyx_v_abs_path_canonical_path_and_base, ((PyObject*)__pyx_t_4)); + __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L26_exception_handled; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2052 + * return None if event == "call" else NO_FTRACE + * + * try: # <<<<<<<<<<<<<< + * # Make fast path faster! + * abs_path_canonical_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + */ + __pyx_L27_except_error:; + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); + goto __pyx_L7_error; + __pyx_L26_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); + __pyx_L30_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2058 + * abs_path_canonical_path_and_base = get_abs_path_real_path_and_base_from_frame(frame) + * + * file_type = py_db.get_file_type( # <<<<<<<<<<<<<< + * frame, abs_path_canonical_path_and_base + * ) # we don't want to debug threading or anything related to pydevd + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_get_file_type); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2058, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + + /* "_pydevd_bundle/pydevd_cython.pyx":2059 + * + * file_type = py_db.get_file_type( + * frame, abs_path_canonical_path_and_base # <<<<<<<<<<<<<< + * ) # we don't want to debug threading or anything related to pydevd + * + */ + __pyx_t_6 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_v_frame, __pyx_v_abs_path_canonical_path_and_base}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_12, 2+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2058, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_v_file_type = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2062 + * ) # we don't want to debug threading or anything related to pydevd + * + * if file_type is not None: # <<<<<<<<<<<<<< + * if file_type == 1: # inlining LIB_FILE = 1 + * if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): + */ + __pyx_t_13 = (__pyx_v_file_type != Py_None); + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2063 + * + * if file_type is not None: + * if file_type == 1: # inlining LIB_FILE = 1 # <<<<<<<<<<<<<< + * if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): + * # if DEBUG: print('skipped: trace_dispatch (not in scope)', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + */ + __pyx_t_13 = (__Pyx_PyInt_BoolEqObjC(__pyx_v_file_type, __pyx_int_1, 1, 0)); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2063, __pyx_L7_error) + if (__pyx_t_13) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2064 + * if file_type is not None: + * if file_type == 1: # inlining LIB_FILE = 1 + * if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): # <<<<<<<<<<<<<< + * # if DEBUG: print('skipped: trace_dispatch (not in scope)', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + * cache_skips[frame_cache_key] = 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_in_project_scope); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2064, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__pyx_v_abs_path_canonical_path_and_base == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 2064, __pyx_L7_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v_abs_path_canonical_path_and_base, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2064, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_v_frame, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_12, 2+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2064, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 2064, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_14 = (!__pyx_t_13); + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2066 + * if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): + * # if DEBUG: print('skipped: trace_dispatch (not in scope)', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + * cache_skips[frame_cache_key] = 1 # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * else: + */ + if (unlikely(__pyx_v_cache_skips == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 2066, __pyx_L7_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_cache_skips, __pyx_v_frame_cache_key, __pyx_int_1) < 0))) __PYX_ERR(0, 2066, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":2067 + * # if DEBUG: print('skipped: trace_dispatch (not in scope)', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + * cache_skips[frame_cache_key] = 1 + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * else: + * # if DEBUG: print('skipped: trace_dispatch', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2067, __pyx_L7_error) + if (__pyx_t_14) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2067, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __pyx_t_5; + __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2064 + * if file_type is not None: + * if file_type == 1: # inlining LIB_FILE = 1 + * if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): # <<<<<<<<<<<<<< + * # if DEBUG: print('skipped: trace_dispatch (not in scope)', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + * cache_skips[frame_cache_key] = 1 + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2063 + * + * if file_type is not None: + * if file_type == 1: # inlining LIB_FILE = 1 # <<<<<<<<<<<<<< + * if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): + * # if DEBUG: print('skipped: trace_dispatch (not in scope)', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + */ + goto __pyx_L34; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2070 + * else: + * # if DEBUG: print('skipped: trace_dispatch', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + * cache_skips[frame_cache_key] = 1 # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * + */ + /*else*/ { + if (unlikely(__pyx_v_cache_skips == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 2070, __pyx_L7_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_cache_skips, __pyx_v_frame_cache_key, __pyx_int_1) < 0))) __PYX_ERR(0, 2070, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":2071 + * # if DEBUG: print('skipped: trace_dispatch', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + * cache_skips[frame_cache_key] = 1 + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * + * if py_db.is_files_filter_enabled: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2071, __pyx_L7_error) + if (__pyx_t_14) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2071, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __pyx_t_5; + __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + } + __pyx_L34:; + + /* "_pydevd_bundle/pydevd_cython.pyx":2062 + * ) # we don't want to debug threading or anything related to pydevd + * + * if file_type is not None: # <<<<<<<<<<<<<< + * if file_type == 1: # inlining LIB_FILE = 1 + * if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2073 + * return None if event == "call" else NO_FTRACE + * + * if py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * if py_db.apply_files_filter(frame, abs_path_canonical_path_and_base[0], False): + * cache_skips[frame_cache_key] = 1 + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_is_files_filter_enabled); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2073, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2073, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2074 + * + * if py_db.is_files_filter_enabled: + * if py_db.apply_files_filter(frame, abs_path_canonical_path_and_base[0], False): # <<<<<<<<<<<<<< + * cache_skips[frame_cache_key] = 1 + * + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2074, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__pyx_v_abs_path_canonical_path_and_base == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 2074, __pyx_L7_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v_abs_path_canonical_path_and_base, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2074, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_v_frame, __pyx_t_6, Py_False}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_12, 3+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2074, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2074, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2075 + * if py_db.is_files_filter_enabled: + * if py_db.apply_files_filter(frame, abs_path_canonical_path_and_base[0], False): + * cache_skips[frame_cache_key] = 1 # <<<<<<<<<<<<<< + * + * if ( + */ + if (unlikely(__pyx_v_cache_skips == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 2075, __pyx_L7_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_cache_skips, __pyx_v_frame_cache_key, __pyx_int_1) < 0))) __PYX_ERR(0, 2075, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":2078 + * + * if ( + * is_stepping # <<<<<<<<<<<<<< + * and additional_info.pydev_original_step_cmd in (107, 144) + * and not _global_notify_skipped_step_in + */ + if (__pyx_v_is_stepping) { + } else { + __pyx_t_14 = __pyx_v_is_stepping; + goto __pyx_L39_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2079 + * if ( + * is_stepping + * and additional_info.pydev_original_step_cmd in (107, 144) # <<<<<<<<<<<<<< + * and not _global_notify_skipped_step_in + * ): + */ + switch (__pyx_v_additional_info->pydev_original_step_cmd) { + case 0x6B: + case 0x90: + __pyx_t_13 = 1; + break; + default: + __pyx_t_13 = 0; + break; + } + __pyx_t_7 = __pyx_t_13; + if (__pyx_t_7) { + } else { + __pyx_t_14 = __pyx_t_7; + goto __pyx_L39_bool_binop_done; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2080 + * is_stepping + * and additional_info.pydev_original_step_cmd in (107, 144) + * and not _global_notify_skipped_step_in # <<<<<<<<<<<<<< + * ): + * notify_skipped_step_in_because_of_filters(py_db, frame) + */ + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 2080, __pyx_L7_error) + __pyx_t_13 = (!__pyx_t_7); + __pyx_t_14 = __pyx_t_13; + __pyx_L39_bool_binop_done:; + + /* "_pydevd_bundle/pydevd_cython.pyx":2077 + * cache_skips[frame_cache_key] = 1 + * + * if ( # <<<<<<<<<<<<<< + * is_stepping + * and additional_info.pydev_original_step_cmd in (107, 144) + */ + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2082 + * and not _global_notify_skipped_step_in + * ): + * notify_skipped_step_in_because_of_filters(py_db, frame) # <<<<<<<<<<<<<< + * + * # A little gotcha, sometimes when we're stepping in we have to stop in a + */ + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_notify_skipped_step_in_because_o); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2082, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_v_py_db, __pyx_v_frame}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_12, 2+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2082, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2077 + * cache_skips[frame_cache_key] = 1 + * + * if ( # <<<<<<<<<<<<<< + * is_stepping + * and additional_info.pydev_original_step_cmd in (107, 144) + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2087 + * # return event showing the back frame as the current frame, so, we need + * # to check not only the current frame but the back frame too. + * back_frame = frame.f_back # <<<<<<<<<<<<<< + * if back_frame is not None and pydev_step_cmd in ( + * 107, + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2087, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_back_frame, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2088 + * # to check not only the current frame but the back frame too. + * back_frame = frame.f_back + * if back_frame is not None and pydev_step_cmd in ( # <<<<<<<<<<<<<< + * 107, + * 144, + */ + __pyx_t_13 = (__pyx_v_back_frame != Py_None); + if (__pyx_t_13) { + } else { + __pyx_t_14 = __pyx_t_13; + goto __pyx_L43_bool_binop_done; + } + switch (__pyx_v_pydev_step_cmd) { + case 0x6B: + + /* "_pydevd_bundle/pydevd_cython.pyx":2089 + * back_frame = frame.f_back + * if back_frame is not None and pydev_step_cmd in ( + * 107, # <<<<<<<<<<<<<< + * 144, + * 109, + */ + case 0x90: + + /* "_pydevd_bundle/pydevd_cython.pyx":2090 + * if back_frame is not None and pydev_step_cmd in ( + * 107, + * 144, # <<<<<<<<<<<<<< + * 109, + * 160, + */ + case 0x6D: + + /* "_pydevd_bundle/pydevd_cython.pyx":2091 + * 107, + * 144, + * 109, # <<<<<<<<<<<<<< + * 160, + * ): + */ + case 0xA0: + + /* "_pydevd_bundle/pydevd_cython.pyx":2088 + * # to check not only the current frame but the back frame too. + * back_frame = frame.f_back + * if back_frame is not None and pydev_step_cmd in ( # <<<<<<<<<<<<<< + * 107, + * 144, + */ + __pyx_t_13 = 1; + break; + default: + __pyx_t_13 = 0; + break; + } + __pyx_t_7 = __pyx_t_13; + __pyx_t_14 = __pyx_t_7; + __pyx_L43_bool_binop_done:; + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2094 + * 160, + * ): + * if py_db.apply_files_filter(back_frame, back_frame.f_code.co_filename, False): # <<<<<<<<<<<<<< + * back_frame_cache_key = back_frame.f_code + * cache_skips[back_frame_cache_key] = 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_apply_files_filter); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2094, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_back_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2094, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_co_filename); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2094, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_6, __pyx_v_back_frame, __pyx_t_4, Py_False}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_12, 3+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2094, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2094, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2095 + * ): + * if py_db.apply_files_filter(back_frame, back_frame.f_code.co_filename, False): + * back_frame_cache_key = back_frame.f_code # <<<<<<<<<<<<<< + * cache_skips[back_frame_cache_key] = 1 + * # if DEBUG: print('skipped: trace_dispatch (filtered out: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_back_frame, __pyx_n_s_f_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2095, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_back_frame_cache_key, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2096 + * if py_db.apply_files_filter(back_frame, back_frame.f_code.co_filename, False): + * back_frame_cache_key = back_frame.f_code + * cache_skips[back_frame_cache_key] = 1 # <<<<<<<<<<<<<< + * # if DEBUG: print('skipped: trace_dispatch (filtered out: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE + */ + if (unlikely(__pyx_v_cache_skips == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 2096, __pyx_L7_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_cache_skips, __pyx_v_back_frame_cache_key, __pyx_int_1) < 0))) __PYX_ERR(0, 2096, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":2098 + * cache_skips[back_frame_cache_key] = 1 + * # if DEBUG: print('skipped: trace_dispatch (filtered out: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * else: + * # if DEBUG: print('skipped: trace_dispatch (filtered out: 2)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2098, __pyx_L7_error) + if (__pyx_t_14) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2098, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __pyx_t_5; + __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2094 + * 160, + * ): + * if py_db.apply_files_filter(back_frame, back_frame.f_code.co_filename, False): # <<<<<<<<<<<<<< + * back_frame_cache_key = back_frame.f_code + * cache_skips[back_frame_cache_key] = 1 + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2088 + * # to check not only the current frame but the back frame too. + * back_frame = frame.f_back + * if back_frame is not None and pydev_step_cmd in ( # <<<<<<<<<<<<<< + * 107, + * 144, + */ + goto __pyx_L42; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2101 + * else: + * # if DEBUG: print('skipped: trace_dispatch (filtered out: 2)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * + * # if DEBUG: print('trace_dispatch', filename, frame.f_lineno, event, frame.f_code.co_name, file_type) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2101, __pyx_L7_error) + if (__pyx_t_14) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2101, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __pyx_t_5; + __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + } + __pyx_L42:; + + /* "_pydevd_bundle/pydevd_cython.pyx":2074 + * + * if py_db.is_files_filter_enabled: + * if py_db.apply_files_filter(frame, abs_path_canonical_path_and_base[0], False): # <<<<<<<<<<<<<< + * cache_skips[frame_cache_key] = 1 + * + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2073 + * return None if event == "call" else NO_FTRACE + * + * if py_db.is_files_filter_enabled: # <<<<<<<<<<<<<< + * if py_db.apply_files_filter(frame, abs_path_canonical_path_and_base[0], False): + * cache_skips[frame_cache_key] = 1 + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2109 + * ret = PyDBFrame( + * ( + * py_db, # <<<<<<<<<<<<<< + * abs_path_canonical_path_and_base, + * additional_info, + */ + __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2109, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_py_db); + __Pyx_GIVEREF(__pyx_v_py_db); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_py_db)) __PYX_ERR(0, 2109, __pyx_L7_error); + __Pyx_INCREF(__pyx_v_abs_path_canonical_path_and_base); + __Pyx_GIVEREF(__pyx_v_abs_path_canonical_path_and_base); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_abs_path_canonical_path_and_base)) __PYX_ERR(0, 2109, __pyx_L7_error); + __Pyx_INCREF((PyObject *)__pyx_v_additional_info); + __Pyx_GIVEREF((PyObject *)__pyx_v_additional_info); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_v_additional_info))) __PYX_ERR(0, 2109, __pyx_L7_error); + __Pyx_INCREF(__pyx_v_t); + __Pyx_GIVEREF(__pyx_v_t); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_t)) __PYX_ERR(0, 2109, __pyx_L7_error); + __Pyx_INCREF(__pyx_v_frame_skips_cache); + __Pyx_GIVEREF(__pyx_v_frame_skips_cache); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_frame_skips_cache)) __PYX_ERR(0, 2109, __pyx_L7_error); + __Pyx_INCREF(__pyx_v_frame_cache_key); + __Pyx_GIVEREF(__pyx_v_frame_cache_key); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_v_frame_cache_key)) __PYX_ERR(0, 2109, __pyx_L7_error); + + /* "_pydevd_bundle/pydevd_cython.pyx":2107 + * # Just create PyDBFrame directly (removed support for Python versions < 2.5, which required keeping a weak + * # reference to the frame). + * ret = PyDBFrame( # <<<<<<<<<<<<<< + * ( + * py_db, + */ + __pyx_t_5 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame), __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2107, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2116 + * frame_cache_key, + * ) + * ).trace_dispatch(frame, event, arg) # <<<<<<<<<<<<<< + * if ret is None: + * # 1 means skipped because of filters. + */ + if (!(likely(PyString_CheckExact(__pyx_v_event))||((__pyx_v_event) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_event))) __PYX_ERR(0, 2116, __pyx_L7_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_t_5)->__pyx_vtab)->trace_dispatch(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_t_5), __pyx_v_frame, ((PyObject*)__pyx_v_event), __pyx_v_arg, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2116, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_ret = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2117 + * ) + * ).trace_dispatch(frame, event, arg) + * if ret is None: # <<<<<<<<<<<<<< + * # 1 means skipped because of filters. + * # 2 means skipped because no breakpoints were hit. + */ + __pyx_t_14 = (__pyx_v_ret == Py_None); + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2120 + * # 1 means skipped because of filters. + * # 2 means skipped because no breakpoints were hit. + * cache_skips[frame_cache_key] = 2 # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * + */ + if (unlikely(__pyx_v_cache_skips == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 2120, __pyx_L7_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_cache_skips, __pyx_v_frame_cache_key, __pyx_int_2) < 0))) __PYX_ERR(0, 2120, __pyx_L7_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":2121 + * # 2 means skipped because no breakpoints were hit. + * cache_skips[frame_cache_key] = 2 + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * + * # fmt: off + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2121, __pyx_L7_error) + if (__pyx_t_14) { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2121, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __pyx_t_5; + __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2117 + * ) + * ).trace_dispatch(frame, event, arg) + * if ret is None: # <<<<<<<<<<<<<< + * # 1 means skipped because of filters. + * # 2 means skipped because no breakpoints were hit. + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2125 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * frame.f_trace = SafeCallWrapper(ret) # Make sure we keep the returned tracer. # <<<<<<<<<<<<<< + * # ELSE + * # frame.f_trace = ret # Make sure we keep the returned tracer. + */ + __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper), __pyx_v_ret); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2125, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_1) < 0) __PYX_ERR(0, 2125, __pyx_L7_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2130 + * # ENDIF + * # fmt: on + * return ret # <<<<<<<<<<<<<< + * + * except SystemExit: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_ret); + __pyx_r = __pyx_v_ret; + goto __pyx_L11_try_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2010 + * + * additional_info.is_tracing += 1 + * try: # <<<<<<<<<<<<<< + * pydev_step_cmd = additional_info.pydev_step_cmd + * is_stepping = pydev_step_cmd != -1 + */ + } + __pyx_L7_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2132 + * return ret + * + * except SystemExit: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE + * + */ + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_SystemExit); + if (__pyx_t_11) { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_5, &__pyx_t_4) < 0) __PYX_ERR(0, 2132, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + + /* "_pydevd_bundle/pydevd_cython.pyx":2133 + * + * except SystemExit: + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * + * except Exception: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2133, __pyx_L9_except_error) + if (__pyx_t_14) { + __Pyx_INCREF(Py_None); + __pyx_t_6 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2133, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L10_except_return; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2135 + * return None if event == "call" else NO_FTRACE + * + * except Exception: # <<<<<<<<<<<<<< + * if py_db.pydb_disposed: + * return None if event == "call" else NO_FTRACE # Don't log errors when we're shutting down. + */ + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_11) { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(0, 2135, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + + /* "_pydevd_bundle/pydevd_cython.pyx":2136 + * + * except Exception: + * if py_db.pydb_disposed: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE # Don't log errors when we're shutting down. + * # Log it + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_py_db, __pyx_n_s_pydb_disposed); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2136, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2136, __pyx_L9_except_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2137 + * except Exception: + * if py_db.pydb_disposed: + * return None if event == "call" else NO_FTRACE # Don't log errors when we're shutting down. # <<<<<<<<<<<<<< + * # Log it + * try: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2137, __pyx_L9_except_error) + if (__pyx_t_14) { + __Pyx_INCREF(Py_None); + __pyx_t_6 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2137, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L10_except_return; + + /* "_pydevd_bundle/pydevd_cython.pyx":2136 + * + * except Exception: + * if py_db.pydb_disposed: # <<<<<<<<<<<<<< + * return None if event == "call" else NO_FTRACE # Don't log errors when we're shutting down. + * # Log it + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2139 + * return None if event == "call" else NO_FTRACE # Don't log errors when we're shutting down. + * # Log it + * try: # <<<<<<<<<<<<<< + * if pydev_log_exception is not None: + * # This can actually happen during the interpreter shutdown in Python 2.7 + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_17, &__pyx_t_16, &__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_15); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":2140 + * # Log it + * try: + * if pydev_log_exception is not None: # <<<<<<<<<<<<<< + * # This can actually happen during the interpreter shutdown in Python 2.7 + * pydev_log_exception() + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pydev_log_exception); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2140, __pyx_L52_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_14 = (__pyx_t_6 != Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_14) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2142 + * if pydev_log_exception is not None: + * # This can actually happen during the interpreter shutdown in Python 2.7 + * pydev_log_exception() # <<<<<<<<<<<<<< + * except: + * # Error logging? We're really in the interpreter shutdown... + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pydev_log_exception); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2142, __pyx_L52_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_12, 0+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2142, __pyx_L52_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2140 + * # Log it + * try: + * if pydev_log_exception is not None: # <<<<<<<<<<<<<< + * # This can actually happen during the interpreter shutdown in Python 2.7 + * pydev_log_exception() + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2139 + * return None if event == "call" else NO_FTRACE # Don't log errors when we're shutting down. + * # Log it + * try: # <<<<<<<<<<<<<< + * if pydev_log_exception is not None: + * # This can actually happen during the interpreter shutdown in Python 2.7 + */ + } + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + goto __pyx_L59_try_end; + __pyx_L52_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2143 + * # This can actually happen during the interpreter shutdown in Python 2.7 + * pydev_log_exception() + * except: # <<<<<<<<<<<<<< + * # Error logging? We're really in the interpreter shutdown... + * # (https://github.com/fabioz/PyDev.Debugger/issues/8) + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L53_exception_handled; + } + __pyx_L53_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_16, __pyx_t_15); + __pyx_L59_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2147 + * # (https://github.com/fabioz/PyDev.Debugger/issues/8) + * pass + * return None if event == "call" else NO_FTRACE # <<<<<<<<<<<<<< + * finally: + * additional_info.is_tracing -= 1 + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_14 < 0))) __PYX_ERR(0, 2147, __pyx_L9_except_error) + if (__pyx_t_14) { + __Pyx_INCREF(Py_None); + __pyx_t_6 = Py_None; + } else { + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2147, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L10_except_return; + } + goto __pyx_L9_except_error; + + /* "_pydevd_bundle/pydevd_cython.pyx":2010 + * + * additional_info.is_tracing += 1 + * try: # <<<<<<<<<<<<<< + * pydev_step_cmd = additional_info.pydev_step_cmd + * is_stepping = pydev_step_cmd != -1 + */ + __pyx_L9_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L5_error; + __pyx_L11_try_return:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L4_return; + __pyx_L10_except_return:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L4_return; + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2149 + * return None if event == "call" else NO_FTRACE + * finally: + * additional_info.is_tracing -= 1 # <<<<<<<<<<<<<< + * + * + */ + /*finally:*/ { + __pyx_L5_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_10 = 0; __pyx_t_9 = 0; __pyx_t_8 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8) < 0)) __Pyx_ErrFetch(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_17); + __pyx_t_11 = __pyx_lineno; __pyx_t_18 = __pyx_clineno; __pyx_t_19 = __pyx_filename; + { + __pyx_v_additional_info->is_tracing = (__pyx_v_additional_info->is_tracing - 1); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); + } + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ErrRestore(__pyx_t_10, __pyx_t_9, __pyx_t_8); + __pyx_t_10 = 0; __pyx_t_9 = 0; __pyx_t_8 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __pyx_lineno = __pyx_t_11; __pyx_clineno = __pyx_t_18; __pyx_filename = __pyx_t_19; + goto __pyx_L1_error; + } + __pyx_L4_return: { + __pyx_t_17 = __pyx_r; + __pyx_r = 0; + __pyx_v_additional_info->is_tracing = (__pyx_v_additional_info->is_tracing - 1); + __pyx_r = __pyx_t_17; + __pyx_t_17 = 0; + goto __pyx_L0; + } + } + + /* "_pydevd_bundle/pydevd_cython.pyx":1977 + * # fmt: on + * + * def __call__(self, frame, event, arg): # <<<<<<<<<<<<<< + * """This is the callback used when we enter some context in the debugger. + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_frame_cache_key); + __Pyx_XDECREF(__pyx_v_cache_skips); + __Pyx_XDECREF(__pyx_v_abs_path_canonical_path_and_base); + __Pyx_XDECREF((PyObject *)__pyx_v_additional_info); + __Pyx_XDECREF(__pyx_v_py_db); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_XDECREF(__pyx_v_frame_skips_cache); + __Pyx_XDECREF(__pyx_v_back_frame); + __Pyx_XDECREF(__pyx_v_back_frame_cache_key); + __Pyx_XDECREF(__pyx_v_file_type); + __Pyx_XDECREF(__pyx_v_ret); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":1966 + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cdef class ThreadTracer: + * cdef public tuple _args; # <<<<<<<<<<<<<< + * def __init__(self, tuple args): + * self._args = args + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args___get__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args___get__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_args); + __pyx_r = __pyx_v_self->_args; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_2__set__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_2__set__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyTuple_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_value))) __PYX_ERR(0, 1966, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer._args.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_4__del__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_4__del__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_args); + __Pyx_DECREF(__pyx_v_self->_args); + __pyx_v_self->_args = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_4__reduce_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_4__reduce_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self._args,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->_args); + __Pyx_GIVEREF(__pyx_v_self->_args); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->_args)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self._args,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self._args,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(2, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self._args is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self._args,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self._args is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->_args != ((PyObject*)Py_None)); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self._args is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self._args is not None + * if use_setstate: + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_ThreadTracer); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_18997755); + __Pyx_GIVEREF(__pyx_int_18997755); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_18997755)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(2, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self._args is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, None), state + * else: + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_ThreadTracer__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_ThreadTracer); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_18997755); + __Pyx_GIVEREF(__pyx_int_18997755); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_18997755)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadTracer__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_7__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_7__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(2, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(2, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_6__setstate_cython__(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_6__setstate_cython__(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_ThreadTracer__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_ThreadTracer__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadTracer__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.ThreadTracer.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":2164 + * _original_call = ThreadTracer.__call__ + * + * def __call__(self, frame, event, arg): # <<<<<<<<<<<<<< + * constructed_tid_to_last_frame[self._args[1].ident] = frame + * return _original_call(self, frame, event, arg) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_23__call__(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_23__call__ = {"__call__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_23__call__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_23__call__(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_self = 0; + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_event = 0; + PyObject *__pyx_v_arg = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 2164, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 2164, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__call__", 1, 4, 4, 1); __PYX_ERR(0, 2164, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 2164, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__call__", 1, 4, 4, 2); __PYX_ERR(0, 2164, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 2164, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__call__", 1, 4, 4, 3); __PYX_ERR(0, 2164, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__call__") < 0)) __PYX_ERR(0, 2164, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + } + __pyx_v_self = values[0]; + __pyx_v_frame = values[1]; + __pyx_v_event = values[2]; + __pyx_v_arg = values[3]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__call__", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 2164, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_22__call__(__pyx_self, __pyx_v_self, __pyx_v_frame, __pyx_v_event, __pyx_v_arg); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_22__call__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + unsigned int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__call__", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":2165 + * + * def __call__(self, frame, event, arg): + * constructed_tid_to_last_frame[self._args[1].ident] = frame # <<<<<<<<<<<<<< + * return _original_call(self, frame, event, arg) + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_constructed_tid_to_last_frame); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_args_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ident_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely((PyObject_SetItem(__pyx_t_1, __pyx_t_2, __pyx_v_frame) < 0))) __PYX_ERR(0, 2165, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2166 + * def __call__(self, frame, event, arg): + * constructed_tid_to_last_frame[self._args[1].ident] = frame + * return _original_call(self, frame, event, arg) # <<<<<<<<<<<<<< + * + * ThreadTracer.__call__ = __call__ + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_original_call); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2166, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[5] = {__pyx_t_3, __pyx_v_self, __pyx_v_frame, __pyx_v_event, __pyx_v_arg}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 4+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2166, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2164 + * _original_call = ThreadTracer.__call__ + * + * def __call__(self, frame, event, arg): # <<<<<<<<<<<<<< + * constructed_tid_to_last_frame[self._args[1].ident] = frame + * return _original_call(self, frame, event, arg) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_bundle/pydevd_cython.pyx":2172 + * if PYDEVD_USE_SYS_MONITORING: + * + * def fix_top_level_trace_and_get_trace_func(*args, **kwargs): # <<<<<<<<<<<<<< + * raise RuntimeError("Not used in sys.monitoring mode.") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_25fix_top_level_trace_and_get_trace_func(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_25fix_top_level_trace_and_get_trace_func = {"fix_top_level_trace_and_get_trace_func", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_25fix_top_level_trace_and_get_trace_func, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_25fix_top_level_trace_and_get_trace_func(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + CYTHON_UNUSED PyObject *__pyx_v_args = 0; + CYTHON_UNUSED PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("fix_top_level_trace_and_get_trace_func (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "fix_top_level_trace_and_get_trace_func", 1))) return NULL; + __Pyx_INCREF(__pyx_args); + __pyx_v_args = __pyx_args; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_24fix_top_level_trace_and_get_trace_func(__pyx_self, __pyx_v_args, __pyx_v_kwargs); + + /* function exit code */ + __Pyx_DECREF(__pyx_v_args); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_24fix_top_level_trace_and_get_trace_func(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_args, CYTHON_UNUSED PyObject *__pyx_v_kwargs) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("fix_top_level_trace_and_get_trace_func", 1); + + /* "_pydevd_bundle/pydevd_cython.pyx":2173 + * + * def fix_top_level_trace_and_get_trace_func(*args, **kwargs): + * raise RuntimeError("Not used in sys.monitoring mode.") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2173, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 2173, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":2172 + * if PYDEVD_USE_SYS_MONITORING: + * + * def fix_top_level_trace_and_get_trace_func(*args, **kwargs): # <<<<<<<<<<<<<< + * raise RuntimeError("Not used in sys.monitoring mode.") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.fix_top_level_trace_and_get_trace_func", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_PyDBAdditionalThreadInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_27__pyx_unpickle_PyDBAdditionalThreadInfo(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_27__pyx_unpickle_PyDBAdditionalThreadInfo = {"__pyx_unpickle_PyDBAdditionalThreadInfo", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_27__pyx_unpickle_PyDBAdditionalThreadInfo, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_27__pyx_unpickle_PyDBAdditionalThreadInfo(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_PyDBAdditionalThreadInfo (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_PyDBAdditionalThreadInfo", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_PyDBAdditionalThreadInfo", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_PyDBAdditionalThreadInfo") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_PyDBAdditionalThreadInfo", 1, 3, 3, __pyx_nargs); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_PyDBAdditionalThreadInfo", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_26__pyx_unpickle_PyDBAdditionalThreadInfo(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_26__pyx_unpickle_PyDBAdditionalThreadInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_PyDBAdditionalThreadInfo", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xd33aa14, 0x024feed, 0x4342dfb): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xd33aa14, 0x024feed, 0x4342dfb) = (conditional_breakpoint_exception, is_in_wait_loop, is_tracing, pydev_call_from_jinja2, pydev_call_inside_jinja2, pydev_django_resolve_frame, pydev_func_name, pydev_message, pydev_next_line, pydev_notify_kill, pydev_original_step_cmd, pydev_smart_child_offset, pydev_smart_parent_offset, pydev_smart_step_into_variants, pydev_smart_step_stop, pydev_state, pydev_step_cmd, pydev_step_stop, pydev_use_scoped_step_frame, step_in_initial_location, suspend_type, suspended_at_unhandled, target_id_to_smart_step_into_variant, thread_tracer, top_level_thread_tracer_no_back_frames, top_level_thread_tracer_unhandled, trace_suspend_type, weak_thread))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__13, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0xd33aa14, 0x024feed, 0x4342dfb): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xd33aa14, 0x024feed, 0x4342dfb) = (conditional_breakpoint_exception, is_in_wait_loop, is_tracing, pydev_call_from_jinja2, pydev_call_inside_jinja2, pydev_django_resolve_frame, pydev_func_name, pydev_message, pydev_next_line, pydev_notify_kill, pydev_original_step_cmd, pydev_smart_child_offset, pydev_smart_parent_offset, pydev_smart_step_into_variants, pydev_smart_step_stop, pydev_state, pydev_step_cmd, pydev_step_stop, pydev_use_scoped_step_frame, step_in_initial_location, suspend_type, suspended_at_unhandled, target_id_to_smart_step_into_variant, thread_tracer, top_level_thread_tracer_no_back_frames, top_level_thread_tracer_unhandled, trace_suspend_type, weak_thread))" % __pyx_checksum + * __pyx_result = PyDBAdditionalThreadInfo.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0xd33aa14, 0x024feed, 0x4342dfb): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xd33aa14, 0x024feed, 0x4342dfb) = (conditional_breakpoint_exception, is_in_wait_loop, is_tracing, pydev_call_from_jinja2, pydev_call_inside_jinja2, pydev_django_resolve_frame, pydev_func_name, pydev_message, pydev_next_line, pydev_notify_kill, pydev_original_step_cmd, pydev_smart_child_offset, pydev_smart_parent_offset, pydev_smart_step_into_variants, pydev_smart_step_stop, pydev_state, pydev_step_cmd, pydev_step_stop, pydev_use_scoped_step_frame, step_in_initial_location, suspend_type, suspended_at_unhandled, target_id_to_smart_step_into_variant, thread_tracer, top_level_thread_tracer_no_back_frames, top_level_thread_tracer_unhandled, trace_suspend_type, weak_thread))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = PyDBAdditionalThreadInfo.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xd33aa14, 0x024feed, 0x4342dfb): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xd33aa14, 0x024feed, 0x4342dfb) = (conditional_breakpoint_exception, is_in_wait_loop, is_tracing, pydev_call_from_jinja2, pydev_call_inside_jinja2, pydev_django_resolve_frame, pydev_func_name, pydev_message, pydev_next_line, pydev_notify_kill, pydev_original_step_cmd, pydev_smart_child_offset, pydev_smart_parent_offset, pydev_smart_step_into_variants, pydev_smart_step_stop, pydev_state, pydev_step_cmd, pydev_step_stop, pydev_use_scoped_step_frame, step_in_initial_location, suspend_type, suspended_at_unhandled, target_id_to_smart_step_into_variant, thread_tracer, top_level_thread_tracer_no_back_frames, top_level_thread_tracer_unhandled, trace_suspend_type, weak_thread))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xd33aa14, 0x024feed, 0x4342dfb) = (conditional_breakpoint_exception, is_in_wait_loop, is_tracing, pydev_call_from_jinja2, pydev_call_inside_jinja2, pydev_django_resolve_frame, pydev_func_name, pydev_message, pydev_next_line, pydev_notify_kill, pydev_original_step_cmd, pydev_smart_child_offset, pydev_smart_parent_offset, pydev_smart_step_into_variants, pydev_smart_step_stop, pydev_state, pydev_step_cmd, pydev_step_stop, pydev_use_scoped_step_frame, step_in_initial_location, suspend_type, suspended_at_unhandled, target_id_to_smart_step_into_variant, thread_tracer, top_level_thread_tracer_no_back_frames, top_level_thread_tracer_unhandled, trace_suspend_type, weak_thread))" % __pyx_checksum + * __pyx_result = PyDBAdditionalThreadInfo.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xd33aa14, 0x024feed, 0x4342dfb) = (conditional_breakpoint_exception, is_in_wait_loop, is_tracing, pydev_call_from_jinja2, pydev_call_inside_jinja2, pydev_django_resolve_frame, pydev_func_name, pydev_message, pydev_next_line, pydev_notify_kill, pydev_original_step_cmd, pydev_smart_child_offset, pydev_smart_parent_offset, pydev_smart_step_into_variants, pydev_smart_step_stop, pydev_state, pydev_step_cmd, pydev_step_stop, pydev_use_scoped_step_frame, step_in_initial_location, suspend_type, suspended_at_unhandled, target_id_to_smart_step_into_variant, thread_tracer, top_level_thread_tracer_no_back_frames, top_level_thread_tracer_unhandled, trace_suspend_type, weak_thread))" % __pyx_checksum + * __pyx_result = PyDBAdditionalThreadInfo.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = PyDBAdditionalThreadInfo.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(PyDBAdditionalThreadInfo __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_PyDBAdditionalThreadInfo__set_state(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xd33aa14, 0x024feed, 0x4342dfb) = (conditional_breakpoint_exception, is_in_wait_loop, is_tracing, pydev_call_from_jinja2, pydev_call_inside_jinja2, pydev_django_resolve_frame, pydev_func_name, pydev_message, pydev_next_line, pydev_notify_kill, pydev_original_step_cmd, pydev_smart_child_offset, pydev_smart_parent_offset, pydev_smart_step_into_variants, pydev_smart_step_stop, pydev_state, pydev_step_cmd, pydev_step_stop, pydev_use_scoped_step_frame, step_in_initial_location, suspend_type, suspended_at_unhandled, target_id_to_smart_step_into_variant, thread_tracer, top_level_thread_tracer_no_back_frames, top_level_thread_tracer_unhandled, trace_suspend_type, weak_thread))" % __pyx_checksum + * __pyx_result = PyDBAdditionalThreadInfo.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(PyDBAdditionalThreadInfo __pyx_result, tuple __pyx_state): + * __pyx_result.conditional_breakpoint_exception = __pyx_state[0]; __pyx_result.is_in_wait_loop = __pyx_state[1]; __pyx_result.is_tracing = __pyx_state[2]; __pyx_result.pydev_call_from_jinja2 = __pyx_state[3]; __pyx_result.pydev_call_inside_jinja2 = __pyx_state[4]; __pyx_result.pydev_django_resolve_frame = __pyx_state[5]; __pyx_result.pydev_func_name = __pyx_state[6]; __pyx_result.pydev_message = __pyx_state[7]; __pyx_result.pydev_next_line = __pyx_state[8]; __pyx_result.pydev_notify_kill = __pyx_state[9]; __pyx_result.pydev_original_step_cmd = __pyx_state[10]; __pyx_result.pydev_smart_child_offset = __pyx_state[11]; __pyx_result.pydev_smart_parent_offset = __pyx_state[12]; __pyx_result.pydev_smart_step_into_variants = __pyx_state[13]; __pyx_result.pydev_smart_step_stop = __pyx_state[14]; __pyx_result.pydev_state = __pyx_state[15]; __pyx_result.pydev_step_cmd = __pyx_state[16]; __pyx_result.pydev_step_stop = __pyx_state[17]; __pyx_result.pydev_use_scoped_step_frame = __pyx_state[18]; __pyx_result.step_in_initial_location = __pyx_state[19]; __pyx_result.suspend_type = __pyx_state[20]; __pyx_result.suspended_at_unhandled = __pyx_state[21]; __pyx_result.target_id_to_smart_step_into_variant = __pyx_state[22]; __pyx_result.thread_tracer = __pyx_state[23]; __pyx_result.top_level_thread_tracer_no_back_frames = __pyx_state[24]; __pyx_result.top_level_thread_tracer_unhandled = __pyx_state[25]; __pyx_result.trace_suspend_type = __pyx_state[26]; __pyx_result.weak_thread = __pyx_state[27] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_PyDBAdditionalThreadInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_PyDBAdditionalThreadInfo", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(PyDBAdditionalThreadInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.conditional_breakpoint_exception = __pyx_state[0]; __pyx_result.is_in_wait_loop = __pyx_state[1]; __pyx_result.is_tracing = __pyx_state[2]; __pyx_result.pydev_call_from_jinja2 = __pyx_state[3]; __pyx_result.pydev_call_inside_jinja2 = __pyx_state[4]; __pyx_result.pydev_django_resolve_frame = __pyx_state[5]; __pyx_result.pydev_func_name = __pyx_state[6]; __pyx_result.pydev_message = __pyx_state[7]; __pyx_result.pydev_next_line = __pyx_state[8]; __pyx_result.pydev_notify_kill = __pyx_state[9]; __pyx_result.pydev_original_step_cmd = __pyx_state[10]; __pyx_result.pydev_smart_child_offset = __pyx_state[11]; __pyx_result.pydev_smart_parent_offset = __pyx_state[12]; __pyx_result.pydev_smart_step_into_variants = __pyx_state[13]; __pyx_result.pydev_smart_step_stop = __pyx_state[14]; __pyx_result.pydev_state = __pyx_state[15]; __pyx_result.pydev_step_cmd = __pyx_state[16]; __pyx_result.pydev_step_stop = __pyx_state[17]; __pyx_result.pydev_use_scoped_step_frame = __pyx_state[18]; __pyx_result.step_in_initial_location = __pyx_state[19]; __pyx_result.suspend_type = __pyx_state[20]; __pyx_result.suspended_at_unhandled = __pyx_state[21]; __pyx_result.target_id_to_smart_step_into_variant = __pyx_state[22]; __pyx_result.thread_tracer = __pyx_state[23]; __pyx_result.top_level_thread_tracer_no_back_frames = __pyx_state[24]; __pyx_result.top_level_thread_tracer_unhandled = __pyx_state[25]; __pyx_result.trace_suspend_type = __pyx_state[26]; __pyx_result.weak_thread = __pyx_state[27] + * if len(__pyx_state) > 28 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_PyDBAdditionalThreadInfo__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_PyDBAdditionalThreadInfo__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(PyDBAdditionalThreadInfo __pyx_result, tuple __pyx_state): + * __pyx_result.conditional_breakpoint_exception = __pyx_state[0]; __pyx_result.is_in_wait_loop = __pyx_state[1]; __pyx_result.is_tracing = __pyx_state[2]; __pyx_result.pydev_call_from_jinja2 = __pyx_state[3]; __pyx_result.pydev_call_inside_jinja2 = __pyx_state[4]; __pyx_result.pydev_django_resolve_frame = __pyx_state[5]; __pyx_result.pydev_func_name = __pyx_state[6]; __pyx_result.pydev_message = __pyx_state[7]; __pyx_result.pydev_next_line = __pyx_state[8]; __pyx_result.pydev_notify_kill = __pyx_state[9]; __pyx_result.pydev_original_step_cmd = __pyx_state[10]; __pyx_result.pydev_smart_child_offset = __pyx_state[11]; __pyx_result.pydev_smart_parent_offset = __pyx_state[12]; __pyx_result.pydev_smart_step_into_variants = __pyx_state[13]; __pyx_result.pydev_smart_step_stop = __pyx_state[14]; __pyx_result.pydev_state = __pyx_state[15]; __pyx_result.pydev_step_cmd = __pyx_state[16]; __pyx_result.pydev_step_stop = __pyx_state[17]; __pyx_result.pydev_use_scoped_step_frame = __pyx_state[18]; __pyx_result.step_in_initial_location = __pyx_state[19]; __pyx_result.suspend_type = __pyx_state[20]; __pyx_result.suspended_at_unhandled = __pyx_state[21]; __pyx_result.target_id_to_smart_step_into_variant = __pyx_state[22]; __pyx_result.thread_tracer = __pyx_state[23]; __pyx_result.top_level_thread_tracer_no_back_frames = __pyx_state[24]; __pyx_result.top_level_thread_tracer_unhandled = __pyx_state[25]; __pyx_result.trace_suspend_type = __pyx_state[26]; __pyx_result.weak_thread = __pyx_state[27] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 28 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[28]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->conditional_breakpoint_exception); + __Pyx_DECREF(__pyx_v___pyx_result->conditional_breakpoint_exception); + __pyx_v___pyx_result->conditional_breakpoint_exception = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->is_in_wait_loop = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->is_tracing = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->pydev_call_from_jinja2); + __Pyx_DECREF(__pyx_v___pyx_result->pydev_call_from_jinja2); + __pyx_v___pyx_result->pydev_call_from_jinja2 = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->pydev_call_inside_jinja2); + __Pyx_DECREF(__pyx_v___pyx_result->pydev_call_inside_jinja2); + __pyx_v___pyx_result->pydev_call_inside_jinja2 = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_django_resolve_frame = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->pydev_func_name); + __Pyx_DECREF(__pyx_v___pyx_result->pydev_func_name); + __pyx_v___pyx_result->pydev_func_name = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->pydev_message); + __Pyx_DECREF(__pyx_v___pyx_result->pydev_message); + __pyx_v___pyx_result->pydev_message = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_next_line = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_notify_kill = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 10, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_original_step_cmd = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 11, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_smart_child_offset = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 12, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_smart_parent_offset = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 13, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->pydev_smart_step_into_variants); + __Pyx_DECREF(__pyx_v___pyx_result->pydev_smart_step_into_variants); + __pyx_v___pyx_result->pydev_smart_step_into_variants = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 14, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->pydev_smart_step_stop); + __Pyx_DECREF(__pyx_v___pyx_result->pydev_smart_step_stop); + __pyx_v___pyx_result->pydev_smart_step_stop = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 15, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_state = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 16, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_step_cmd = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 17, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->pydev_step_stop); + __Pyx_DECREF(__pyx_v___pyx_result->pydev_step_stop); + __pyx_v___pyx_result->pydev_step_stop = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 18, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->pydev_use_scoped_step_frame = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 19, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->step_in_initial_location); + __Pyx_DECREF(__pyx_v___pyx_result->step_in_initial_location); + __pyx_v___pyx_result->step_in_initial_location = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 20, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->suspend_type = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 21, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->suspended_at_unhandled = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 22, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyDict_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->target_id_to_smart_step_into_variant); + __Pyx_DECREF(__pyx_v___pyx_result->target_id_to_smart_step_into_variant); + __pyx_v___pyx_result->target_id_to_smart_step_into_variant = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 23, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->thread_tracer); + __Pyx_DECREF(__pyx_v___pyx_result->thread_tracer); + __pyx_v___pyx_result->thread_tracer = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 24, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->top_level_thread_tracer_no_back_frames); + __Pyx_DECREF(__pyx_v___pyx_result->top_level_thread_tracer_no_back_frames); + __pyx_v___pyx_result->top_level_thread_tracer_no_back_frames = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 25, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->top_level_thread_tracer_unhandled); + __Pyx_DECREF(__pyx_v___pyx_result->top_level_thread_tracer_unhandled); + __pyx_v___pyx_result->top_level_thread_tracer_unhandled = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 26, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->trace_suspend_type); + __Pyx_DECREF(__pyx_v___pyx_result->trace_suspend_type); + __pyx_v___pyx_result->trace_suspend_type = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 27, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->weak_thread); + __Pyx_DECREF(__pyx_v___pyx_result->weak_thread); + __pyx_v___pyx_result->weak_thread = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(PyDBAdditionalThreadInfo __pyx_result, tuple __pyx_state): + * __pyx_result.conditional_breakpoint_exception = __pyx_state[0]; __pyx_result.is_in_wait_loop = __pyx_state[1]; __pyx_result.is_tracing = __pyx_state[2]; __pyx_result.pydev_call_from_jinja2 = __pyx_state[3]; __pyx_result.pydev_call_inside_jinja2 = __pyx_state[4]; __pyx_result.pydev_django_resolve_frame = __pyx_state[5]; __pyx_result.pydev_func_name = __pyx_state[6]; __pyx_result.pydev_message = __pyx_state[7]; __pyx_result.pydev_next_line = __pyx_state[8]; __pyx_result.pydev_notify_kill = __pyx_state[9]; __pyx_result.pydev_original_step_cmd = __pyx_state[10]; __pyx_result.pydev_smart_child_offset = __pyx_state[11]; __pyx_result.pydev_smart_parent_offset = __pyx_state[12]; __pyx_result.pydev_smart_step_into_variants = __pyx_state[13]; __pyx_result.pydev_smart_step_stop = __pyx_state[14]; __pyx_result.pydev_state = __pyx_state[15]; __pyx_result.pydev_step_cmd = __pyx_state[16]; __pyx_result.pydev_step_stop = __pyx_state[17]; __pyx_result.pydev_use_scoped_step_frame = __pyx_state[18]; __pyx_result.step_in_initial_location = __pyx_state[19]; __pyx_result.suspend_type = __pyx_state[20]; __pyx_result.suspended_at_unhandled = __pyx_state[21]; __pyx_result.target_id_to_smart_step_into_variant = __pyx_state[22]; __pyx_result.thread_tracer = __pyx_state[23]; __pyx_result.top_level_thread_tracer_no_back_frames = __pyx_state[24]; __pyx_result.top_level_thread_tracer_unhandled = __pyx_state[25]; __pyx_result.trace_suspend_type = __pyx_state[26]; __pyx_result.weak_thread = __pyx_state[27] + * if len(__pyx_state) > 28 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[28]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 13, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 > 28); + if (__pyx_t_5) { + } else { + __pyx_t_2 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.conditional_breakpoint_exception = __pyx_state[0]; __pyx_result.is_in_wait_loop = __pyx_state[1]; __pyx_result.is_tracing = __pyx_state[2]; __pyx_result.pydev_call_from_jinja2 = __pyx_state[3]; __pyx_result.pydev_call_inside_jinja2 = __pyx_state[4]; __pyx_result.pydev_django_resolve_frame = __pyx_state[5]; __pyx_result.pydev_func_name = __pyx_state[6]; __pyx_result.pydev_message = __pyx_state[7]; __pyx_result.pydev_next_line = __pyx_state[8]; __pyx_result.pydev_notify_kill = __pyx_state[9]; __pyx_result.pydev_original_step_cmd = __pyx_state[10]; __pyx_result.pydev_smart_child_offset = __pyx_state[11]; __pyx_result.pydev_smart_parent_offset = __pyx_state[12]; __pyx_result.pydev_smart_step_into_variants = __pyx_state[13]; __pyx_result.pydev_smart_step_stop = __pyx_state[14]; __pyx_result.pydev_state = __pyx_state[15]; __pyx_result.pydev_step_cmd = __pyx_state[16]; __pyx_result.pydev_step_stop = __pyx_state[17]; __pyx_result.pydev_use_scoped_step_frame = __pyx_state[18]; __pyx_result.step_in_initial_location = __pyx_state[19]; __pyx_result.suspend_type = __pyx_state[20]; __pyx_result.suspended_at_unhandled = __pyx_state[21]; __pyx_result.target_id_to_smart_step_into_variant = __pyx_state[22]; __pyx_result.thread_tracer = __pyx_state[23]; __pyx_result.top_level_thread_tracer_no_back_frames = __pyx_state[24]; __pyx_result.top_level_thread_tracer_unhandled = __pyx_state[25]; __pyx_result.trace_suspend_type = __pyx_state[26]; __pyx_result.weak_thread = __pyx_state[27] + * if len(__pyx_state) > 28 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[28]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 28, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(PyDBAdditionalThreadInfo __pyx_result, tuple __pyx_state): + * __pyx_result.conditional_breakpoint_exception = __pyx_state[0]; __pyx_result.is_in_wait_loop = __pyx_state[1]; __pyx_result.is_tracing = __pyx_state[2]; __pyx_result.pydev_call_from_jinja2 = __pyx_state[3]; __pyx_result.pydev_call_inside_jinja2 = __pyx_state[4]; __pyx_result.pydev_django_resolve_frame = __pyx_state[5]; __pyx_result.pydev_func_name = __pyx_state[6]; __pyx_result.pydev_message = __pyx_state[7]; __pyx_result.pydev_next_line = __pyx_state[8]; __pyx_result.pydev_notify_kill = __pyx_state[9]; __pyx_result.pydev_original_step_cmd = __pyx_state[10]; __pyx_result.pydev_smart_child_offset = __pyx_state[11]; __pyx_result.pydev_smart_parent_offset = __pyx_state[12]; __pyx_result.pydev_smart_step_into_variants = __pyx_state[13]; __pyx_result.pydev_smart_step_stop = __pyx_state[14]; __pyx_result.pydev_state = __pyx_state[15]; __pyx_result.pydev_step_cmd = __pyx_state[16]; __pyx_result.pydev_step_stop = __pyx_state[17]; __pyx_result.pydev_use_scoped_step_frame = __pyx_state[18]; __pyx_result.step_in_initial_location = __pyx_state[19]; __pyx_result.suspend_type = __pyx_state[20]; __pyx_result.suspended_at_unhandled = __pyx_state[21]; __pyx_result.target_id_to_smart_step_into_variant = __pyx_state[22]; __pyx_result.thread_tracer = __pyx_state[23]; __pyx_result.top_level_thread_tracer_no_back_frames = __pyx_state[24]; __pyx_result.top_level_thread_tracer_unhandled = __pyx_state[25]; __pyx_result.trace_suspend_type = __pyx_state[26]; __pyx_result.weak_thread = __pyx_state[27] + * if len(__pyx_state) > 28 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[28]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(PyDBAdditionalThreadInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.conditional_breakpoint_exception = __pyx_state[0]; __pyx_result.is_in_wait_loop = __pyx_state[1]; __pyx_result.is_tracing = __pyx_state[2]; __pyx_result.pydev_call_from_jinja2 = __pyx_state[3]; __pyx_result.pydev_call_inside_jinja2 = __pyx_state[4]; __pyx_result.pydev_django_resolve_frame = __pyx_state[5]; __pyx_result.pydev_func_name = __pyx_state[6]; __pyx_result.pydev_message = __pyx_state[7]; __pyx_result.pydev_next_line = __pyx_state[8]; __pyx_result.pydev_notify_kill = __pyx_state[9]; __pyx_result.pydev_original_step_cmd = __pyx_state[10]; __pyx_result.pydev_smart_child_offset = __pyx_state[11]; __pyx_result.pydev_smart_parent_offset = __pyx_state[12]; __pyx_result.pydev_smart_step_into_variants = __pyx_state[13]; __pyx_result.pydev_smart_step_stop = __pyx_state[14]; __pyx_result.pydev_state = __pyx_state[15]; __pyx_result.pydev_step_cmd = __pyx_state[16]; __pyx_result.pydev_step_stop = __pyx_state[17]; __pyx_result.pydev_use_scoped_step_frame = __pyx_state[18]; __pyx_result.step_in_initial_location = __pyx_state[19]; __pyx_result.suspend_type = __pyx_state[20]; __pyx_result.suspended_at_unhandled = __pyx_state[21]; __pyx_result.target_id_to_smart_step_into_variant = __pyx_state[22]; __pyx_result.thread_tracer = __pyx_state[23]; __pyx_result.top_level_thread_tracer_no_back_frames = __pyx_state[24]; __pyx_result.top_level_thread_tracer_unhandled = __pyx_state[25]; __pyx_result.trace_suspend_type = __pyx_state[26]; __pyx_result.weak_thread = __pyx_state[27] + * if len(__pyx_state) > 28 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_PyDBAdditionalThreadInfo__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle__TryExceptContainerObj(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_29__pyx_unpickle__TryExceptContainerObj(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_29__pyx_unpickle__TryExceptContainerObj = {"__pyx_unpickle__TryExceptContainerObj", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_29__pyx_unpickle__TryExceptContainerObj, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_29__pyx_unpickle__TryExceptContainerObj(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle__TryExceptContainerObj (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__TryExceptContainerObj", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__TryExceptContainerObj", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle__TryExceptContainerObj") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__TryExceptContainerObj", 1, 3, 3, __pyx_nargs); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle__TryExceptContainerObj", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_28__pyx_unpickle__TryExceptContainerObj(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_28__pyx_unpickle__TryExceptContainerObj(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle__TryExceptContainerObj", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xdbf5e44, 0xde17cd3, 0xc8b6eb1): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xdbf5e44, 0xde17cd3, 0xc8b6eb1) = (try_except_infos))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__14, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0xdbf5e44, 0xde17cd3, 0xc8b6eb1): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xdbf5e44, 0xde17cd3, 0xc8b6eb1) = (try_except_infos))" % __pyx_checksum + * __pyx_result = _TryExceptContainerObj.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0xdbf5e44, 0xde17cd3, 0xc8b6eb1): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xdbf5e44, 0xde17cd3, 0xc8b6eb1) = (try_except_infos))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = _TryExceptContainerObj.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xdbf5e44, 0xde17cd3, 0xc8b6eb1): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xdbf5e44, 0xde17cd3, 0xc8b6eb1) = (try_except_infos))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xdbf5e44, 0xde17cd3, 0xc8b6eb1) = (try_except_infos))" % __pyx_checksum + * __pyx_result = _TryExceptContainerObj.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle__TryExceptContainerObj__set_state(<_TryExceptContainerObj> __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xdbf5e44, 0xde17cd3, 0xc8b6eb1) = (try_except_infos))" % __pyx_checksum + * __pyx_result = _TryExceptContainerObj.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle__TryExceptContainerObj__set_state(<_TryExceptContainerObj> __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = _TryExceptContainerObj.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle__TryExceptContainerObj__set_state(<_TryExceptContainerObj> __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle__TryExceptContainerObj__set_state(_TryExceptContainerObj __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle__TryExceptContainerObj__set_state(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xdbf5e44, 0xde17cd3, 0xc8b6eb1) = (try_except_infos))" % __pyx_checksum + * __pyx_result = _TryExceptContainerObj.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle__TryExceptContainerObj__set_state(<_TryExceptContainerObj> __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle__TryExceptContainerObj__set_state(<_TryExceptContainerObj> __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle__TryExceptContainerObj__set_state(_TryExceptContainerObj __pyx_result, tuple __pyx_state): + * __pyx_result.try_except_infos = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle__TryExceptContainerObj(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle__TryExceptContainerObj", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle__TryExceptContainerObj__set_state(<_TryExceptContainerObj> __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle__TryExceptContainerObj__set_state(_TryExceptContainerObj __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.try_except_infos = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle__TryExceptContainerObj__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + unsigned int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle__TryExceptContainerObj__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle__TryExceptContainerObj__set_state(_TryExceptContainerObj __pyx_result, tuple __pyx_state): + * __pyx_result.try_except_infos = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyList_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("list", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->try_except_infos); + __Pyx_DECREF(__pyx_v___pyx_result->try_except_infos); + __pyx_v___pyx_result->try_except_infos = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle__TryExceptContainerObj__set_state(_TryExceptContainerObj __pyx_result, tuple __pyx_state): + * __pyx_result.try_except_infos = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.try_except_infos = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle__TryExceptContainerObj__set_state(_TryExceptContainerObj __pyx_result, tuple __pyx_state): + * __pyx_result.try_except_infos = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle__TryExceptContainerObj__set_state(<_TryExceptContainerObj> __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle__TryExceptContainerObj__set_state(_TryExceptContainerObj __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.try_except_infos = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle__TryExceptContainerObj__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_PyDBFrame(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31__pyx_unpickle_PyDBFrame(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_31__pyx_unpickle_PyDBFrame = {"__pyx_unpickle_PyDBFrame", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31__pyx_unpickle_PyDBFrame, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_31__pyx_unpickle_PyDBFrame(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_PyDBFrame (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_PyDBFrame", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_PyDBFrame", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_PyDBFrame") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_PyDBFrame", 1, 3, 3, __pyx_nargs); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_PyDBFrame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_30__pyx_unpickle_PyDBFrame(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_30__pyx_unpickle_PyDBFrame(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_PyDBFrame", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x3a8c26e, 0xb793695, 0x506e682): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3a8c26e, 0xb793695, 0x506e682) = (_args, exc_info, should_skip))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__15, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x3a8c26e, 0xb793695, 0x506e682): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3a8c26e, 0xb793695, 0x506e682) = (_args, exc_info, should_skip))" % __pyx_checksum + * __pyx_result = PyDBFrame.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x3a8c26e, 0xb793695, 0x506e682): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3a8c26e, 0xb793695, 0x506e682) = (_args, exc_info, should_skip))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = PyDBFrame.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x3a8c26e, 0xb793695, 0x506e682): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3a8c26e, 0xb793695, 0x506e682) = (_args, exc_info, should_skip))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3a8c26e, 0xb793695, 0x506e682) = (_args, exc_info, should_skip))" % __pyx_checksum + * __pyx_result = PyDBFrame.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_PyDBFrame__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3a8c26e, 0xb793695, 0x506e682) = (_args, exc_info, should_skip))" % __pyx_checksum + * __pyx_result = PyDBFrame.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = PyDBFrame.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_PyDBFrame__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_PyDBFrame__set_state(PyDBFrame __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_PyDBFrame__set_state(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3a8c26e, 0xb793695, 0x506e682) = (_args, exc_info, should_skip))" % __pyx_checksum + * __pyx_result = PyDBFrame.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_PyDBFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_PyDBFrame__set_state(PyDBFrame __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0]; __pyx_result.exc_info = __pyx_state[1]; __pyx_result.should_skip = __pyx_state[2] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_PyDBFrame(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_PyDBFrame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_PyDBFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_PyDBFrame__set_state(PyDBFrame __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0]; __pyx_result.exc_info = __pyx_state[1]; __pyx_result.should_skip = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_PyDBFrame__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_PyDBFrame__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_PyDBFrame__set_state(PyDBFrame __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0]; __pyx_result.exc_info = __pyx_state[1]; __pyx_result.should_skip = __pyx_state[2] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[3]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->_args); + __Pyx_DECREF(__pyx_v___pyx_result->_args); + __pyx_v___pyx_result->_args = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->exc_info); + __Pyx_DECREF(__pyx_v___pyx_result->exc_info); + __pyx_v___pyx_result->exc_info = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->should_skip = __pyx_t_2; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_PyDBFrame__set_state(PyDBFrame __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0]; __pyx_result.exc_info = __pyx_state[1]; __pyx_result.should_skip = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[3]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 13, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 > 3); + if (__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_3 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_3) { + + /* "(tree fragment)":14 + * __pyx_result._args = __pyx_state[0]; __pyx_result.exc_info = __pyx_state[1]; __pyx_result.should_skip = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[3]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_PyDBFrame__set_state(PyDBFrame __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0]; __pyx_result.exc_info = __pyx_state[1]; __pyx_result.should_skip = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[3]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_PyDBFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_PyDBFrame__set_state(PyDBFrame __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0]; __pyx_result.exc_info = __pyx_state[1]; __pyx_result.should_skip = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_PyDBFrame__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_SafeCallWrapper(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_33__pyx_unpickle_SafeCallWrapper(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_33__pyx_unpickle_SafeCallWrapper = {"__pyx_unpickle_SafeCallWrapper", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_33__pyx_unpickle_SafeCallWrapper, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_33__pyx_unpickle_SafeCallWrapper(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_SafeCallWrapper (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_SafeCallWrapper", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_SafeCallWrapper", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_SafeCallWrapper") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_SafeCallWrapper", 1, 3, 3, __pyx_nargs); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_SafeCallWrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_32__pyx_unpickle_SafeCallWrapper(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_32__pyx_unpickle_SafeCallWrapper(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_SafeCallWrapper", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xa14289b, 0x3cc10aa, 0x77c077b): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa14289b, 0x3cc10aa, 0x77c077b) = (method_object))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__16, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0xa14289b, 0x3cc10aa, 0x77c077b): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa14289b, 0x3cc10aa, 0x77c077b) = (method_object))" % __pyx_checksum + * __pyx_result = SafeCallWrapper.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0xa14289b, 0x3cc10aa, 0x77c077b): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa14289b, 0x3cc10aa, 0x77c077b) = (method_object))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = SafeCallWrapper.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xa14289b, 0x3cc10aa, 0x77c077b): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa14289b, 0x3cc10aa, 0x77c077b) = (method_object))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa14289b, 0x3cc10aa, 0x77c077b) = (method_object))" % __pyx_checksum + * __pyx_result = SafeCallWrapper.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_SafeCallWrapper__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa14289b, 0x3cc10aa, 0x77c077b) = (method_object))" % __pyx_checksum + * __pyx_result = SafeCallWrapper.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_SafeCallWrapper__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = SafeCallWrapper.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_SafeCallWrapper__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_SafeCallWrapper__set_state(SafeCallWrapper __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_SafeCallWrapper__set_state(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa14289b, 0x3cc10aa, 0x77c077b) = (method_object))" % __pyx_checksum + * __pyx_result = SafeCallWrapper.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_SafeCallWrapper__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_SafeCallWrapper__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_SafeCallWrapper__set_state(SafeCallWrapper __pyx_result, tuple __pyx_state): + * __pyx_result.method_object = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_SafeCallWrapper(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_SafeCallWrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_SafeCallWrapper__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_SafeCallWrapper__set_state(SafeCallWrapper __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.method_object = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_SafeCallWrapper__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + unsigned int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_SafeCallWrapper__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_SafeCallWrapper__set_state(SafeCallWrapper __pyx_result, tuple __pyx_state): + * __pyx_result.method_object = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->method_object); + __Pyx_DECREF(__pyx_v___pyx_result->method_object); + __pyx_v___pyx_result->method_object = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_SafeCallWrapper__set_state(SafeCallWrapper __pyx_result, tuple __pyx_state): + * __pyx_result.method_object = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.method_object = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_SafeCallWrapper__set_state(SafeCallWrapper __pyx_result, tuple __pyx_state): + * __pyx_result.method_object = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_SafeCallWrapper__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_SafeCallWrapper__set_state(SafeCallWrapper __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.method_object = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_SafeCallWrapper__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_35__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_35__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions = {"__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_35__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_35__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions", 1, 3, 3, __pyx_nargs); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_34__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_34__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x121e1fb, 0xf3a61b1, 0x3d7902a): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__17, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x121e1fb, 0xf3a61b1, 0x3d7902a): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + * __pyx_result = TopLevelThreadTracerOnlyUnhandledExceptions.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x121e1fb, 0xf3a61b1, 0x3d7902a): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = TopLevelThreadTracerOnlyUnhandledExceptions.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_5, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x121e1fb, 0xf3a61b1, 0x3d7902a): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + * __pyx_result = TopLevelThreadTracerOnlyUnhandledExceptions.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + * __pyx_result = TopLevelThreadTracerOnlyUnhandledExceptions.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = TopLevelThreadTracerOnlyUnhandledExceptions.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(TopLevelThreadTracerOnlyUnhandledExceptions __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + * __pyx_result = TopLevelThreadTracerOnlyUnhandledExceptions.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(TopLevelThreadTracerOnlyUnhandledExceptions __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(TopLevelThreadTracerOnlyUnhandledExceptions __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + unsigned int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(TopLevelThreadTracerOnlyUnhandledExceptions __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->_args); + __Pyx_DECREF(__pyx_v___pyx_result->_args); + __pyx_v___pyx_result->_args = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(TopLevelThreadTracerOnlyUnhandledExceptions __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(TopLevelThreadTracerOnlyUnhandledExceptions __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(TopLevelThreadTracerOnlyUnhandledExceptions __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_TopLevelThreadTracerNoBackFrame(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_37__pyx_unpickle_TopLevelThreadTracerNoBackFrame(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_37__pyx_unpickle_TopLevelThreadTracerNoBackFrame = {"__pyx_unpickle_TopLevelThreadTracerNoBackFrame", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_37__pyx_unpickle_TopLevelThreadTracerNoBackFrame, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_37__pyx_unpickle_TopLevelThreadTracerNoBackFrame(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_TopLevelThreadTracerNoBackFrame (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_TopLevelThreadTracerNoBackFrame", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_TopLevelThreadTracerNoBackFrame", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_TopLevelThreadTracerNoBackFrame") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_TopLevelThreadTracerNoBackFrame", 1, 3, 3, __pyx_nargs); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_TopLevelThreadTracerNoBackFrame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_36__pyx_unpickle_TopLevelThreadTracerNoBackFrame(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_36__pyx_unpickle_TopLevelThreadTracerNoBackFrame(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_TopLevelThreadTracerNoBackFrame", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1) = (_args, _frame_trace_dispatch, _last_exc_arg, _last_raise_line, _raise_lines, try_except_infos))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__18, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1) = (_args, _frame_trace_dispatch, _last_exc_arg, _last_raise_line, _raise_lines, try_except_infos))" % __pyx_checksum + * __pyx_result = TopLevelThreadTracerNoBackFrame.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1) = (_args, _frame_trace_dispatch, _last_exc_arg, _last_raise_line, _raise_lines, try_except_infos))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = TopLevelThreadTracerNoBackFrame.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_6, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1) = (_args, _frame_trace_dispatch, _last_exc_arg, _last_raise_line, _raise_lines, try_except_infos))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1) = (_args, _frame_trace_dispatch, _last_exc_arg, _last_raise_line, _raise_lines, try_except_infos))" % __pyx_checksum + * __pyx_result = TopLevelThreadTracerNoBackFrame.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1) = (_args, _frame_trace_dispatch, _last_exc_arg, _last_raise_line, _raise_lines, try_except_infos))" % __pyx_checksum + * __pyx_result = TopLevelThreadTracerNoBackFrame.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = TopLevelThreadTracerNoBackFrame.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(TopLevelThreadTracerNoBackFrame __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x3f5f7e9, 0x0ff9c96, 0xa3a9ec1) = (_args, _frame_trace_dispatch, _last_exc_arg, _last_raise_line, _raise_lines, try_except_infos))" % __pyx_checksum + * __pyx_result = TopLevelThreadTracerNoBackFrame.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(TopLevelThreadTracerNoBackFrame __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0]; __pyx_result._frame_trace_dispatch = __pyx_state[1]; __pyx_result._last_exc_arg = __pyx_state[2]; __pyx_result._last_raise_line = __pyx_state[3]; __pyx_result._raise_lines = __pyx_state[4]; __pyx_result.try_except_infos = __pyx_state[5] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_TopLevelThreadTracerNoBackFrame(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_TopLevelThreadTracerNoBackFrame", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(TopLevelThreadTracerNoBackFrame __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0]; __pyx_result._frame_trace_dispatch = __pyx_state[1]; __pyx_result._last_exc_arg = __pyx_state[2]; __pyx_result._last_raise_line = __pyx_state[3]; __pyx_result._raise_lines = __pyx_state[4]; __pyx_result.try_except_infos = __pyx_state[5] + * if len(__pyx_state) > 6 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(TopLevelThreadTracerNoBackFrame __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0]; __pyx_result._frame_trace_dispatch = __pyx_state[1]; __pyx_result._last_exc_arg = __pyx_state[2]; __pyx_result._last_raise_line = __pyx_state[3]; __pyx_result._raise_lines = __pyx_state[4]; __pyx_result.try_except_infos = __pyx_state[5] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 6 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[6]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->_args); + __Pyx_DECREF(__pyx_v___pyx_result->_args); + __pyx_v___pyx_result->_args = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->_frame_trace_dispatch); + __Pyx_DECREF(__pyx_v___pyx_result->_frame_trace_dispatch); + __pyx_v___pyx_result->_frame_trace_dispatch = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->_last_exc_arg); + __Pyx_DECREF(__pyx_v___pyx_result->_last_exc_arg); + __pyx_v___pyx_result->_last_exc_arg = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->_last_raise_line = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PySet_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("set", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->_raise_lines); + __Pyx_DECREF(__pyx_v___pyx_result->_raise_lines); + __pyx_v___pyx_result->_raise_lines = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->try_except_infos); + __Pyx_DECREF(__pyx_v___pyx_result->try_except_infos); + __pyx_v___pyx_result->try_except_infos = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(TopLevelThreadTracerNoBackFrame __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0]; __pyx_result._frame_trace_dispatch = __pyx_state[1]; __pyx_result._last_exc_arg = __pyx_state[2]; __pyx_result._last_raise_line = __pyx_state[3]; __pyx_result._raise_lines = __pyx_state[4]; __pyx_result.try_except_infos = __pyx_state[5] + * if len(__pyx_state) > 6 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[6]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 13, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 > 6); + if (__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_3 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_3) { + + /* "(tree fragment)":14 + * __pyx_result._args = __pyx_state[0]; __pyx_result._frame_trace_dispatch = __pyx_state[1]; __pyx_result._last_exc_arg = __pyx_state[2]; __pyx_result._last_raise_line = __pyx_state[3]; __pyx_result._raise_lines = __pyx_state[4]; __pyx_result.try_except_infos = __pyx_state[5] + * if len(__pyx_state) > 6 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[6]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(TopLevelThreadTracerNoBackFrame __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0]; __pyx_result._frame_trace_dispatch = __pyx_state[1]; __pyx_result._last_exc_arg = __pyx_state[2]; __pyx_result._last_raise_line = __pyx_state[3]; __pyx_result._raise_lines = __pyx_state[4]; __pyx_result.try_except_infos = __pyx_state[5] + * if len(__pyx_state) > 6 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[6]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(TopLevelThreadTracerNoBackFrame __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0]; __pyx_result._frame_trace_dispatch = __pyx_state[1]; __pyx_result._last_exc_arg = __pyx_state[2]; __pyx_result._last_raise_line = __pyx_state[3]; __pyx_result._raise_lines = __pyx_state[4]; __pyx_result.try_except_infos = __pyx_state[5] + * if len(__pyx_state) > 6 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_ThreadTracer(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_39__pyx_unpickle_ThreadTracer(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14_pydevd_bundle_13pydevd_cython_39__pyx_unpickle_ThreadTracer = {"__pyx_unpickle_ThreadTracer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_39__pyx_unpickle_ThreadTracer, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14_pydevd_bundle_13pydevd_cython_39__pyx_unpickle_ThreadTracer(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_ThreadTracer (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ThreadTracer", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ThreadTracer", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_ThreadTracer") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ThreadTracer", 1, 3, 3, __pyx_nargs); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_ThreadTracer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_14_pydevd_bundle_13pydevd_cython_38__pyx_unpickle_ThreadTracer(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14_pydevd_bundle_13pydevd_cython_38__pyx_unpickle_ThreadTracer(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_ThreadTracer", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x121e1fb, 0xf3a61b1, 0x3d7902a): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__17, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x121e1fb, 0xf3a61b1, 0x3d7902a): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + * __pyx_result = ThreadTracer.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(2, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x121e1fb, 0xf3a61b1, 0x3d7902a): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = ThreadTracer.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_5, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x121e1fb, 0xf3a61b1, 0x3d7902a): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + * __pyx_result = ThreadTracer.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_ThreadTracer__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + * __pyx_result = ThreadTracer.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadTracer__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = ThreadTracer.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_ThreadTracer__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_ThreadTracer__set_state(ThreadTracer __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_ThreadTracer__set_state(((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x121e1fb, 0xf3a61b1, 0x3d7902a) = (_args))" % __pyx_checksum + * __pyx_result = ThreadTracer.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadTracer__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_ThreadTracer__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_ThreadTracer__set_state(ThreadTracer __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_ThreadTracer(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_ThreadTracer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_ThreadTracer__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_ThreadTracer__set_state(ThreadTracer __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_14_pydevd_bundle_13pydevd_cython___pyx_unpickle_ThreadTracer__set_state(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + unsigned int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_ThreadTracer__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_ThreadTracer__set_state(ThreadTracer __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->_args); + __Pyx_DECREF(__pyx_v___pyx_result->_args); + __pyx_v___pyx_result->_args = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_ThreadTracer__set_state(ThreadTracer __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_ThreadTracer__set_state(ThreadTracer __pyx_result, tuple __pyx_state): + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_ThreadTracer__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_ThreadTracer__set_state(ThreadTracer __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython.__pyx_unpickle_ThreadTracer__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; + +static PyObject *__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)o); + p->__pyx_vtab = __pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; + p->pydev_step_stop = Py_None; Py_INCREF(Py_None); + p->pydev_smart_step_stop = Py_None; Py_INCREF(Py_None); + p->pydev_call_from_jinja2 = Py_None; Py_INCREF(Py_None); + p->pydev_call_inside_jinja2 = Py_None; Py_INCREF(Py_None); + p->conditional_breakpoint_exception = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->pydev_message = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->pydev_func_name = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->trace_suspend_type = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->top_level_thread_tracer_no_back_frames = Py_None; Py_INCREF(Py_None); + p->top_level_thread_tracer_unhandled = Py_None; Py_INCREF(Py_None); + p->thread_tracer = Py_None; Py_INCREF(Py_None); + p->step_in_initial_location = Py_None; Py_INCREF(Py_None); + p->pydev_smart_step_into_variants = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->target_id_to_smart_step_into_variant = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->weak_thread = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo(PyObject *o) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->pydev_step_stop); + Py_CLEAR(p->pydev_smart_step_stop); + Py_CLEAR(p->pydev_call_from_jinja2); + Py_CLEAR(p->pydev_call_inside_jinja2); + Py_CLEAR(p->conditional_breakpoint_exception); + Py_CLEAR(p->pydev_message); + Py_CLEAR(p->pydev_func_name); + Py_CLEAR(p->trace_suspend_type); + Py_CLEAR(p->top_level_thread_tracer_no_back_frames); + Py_CLEAR(p->top_level_thread_tracer_unhandled); + Py_CLEAR(p->thread_tracer); + Py_CLEAR(p->step_in_initial_location); + Py_CLEAR(p->pydev_smart_step_into_variants); + Py_CLEAR(p->target_id_to_smart_step_into_variant); + Py_CLEAR(p->weak_thread); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)o; + if (p->pydev_step_stop) { + e = (*v)(p->pydev_step_stop, a); if (e) return e; + } + if (p->pydev_smart_step_stop) { + e = (*v)(p->pydev_smart_step_stop, a); if (e) return e; + } + if (p->pydev_call_from_jinja2) { + e = (*v)(p->pydev_call_from_jinja2, a); if (e) return e; + } + if (p->pydev_call_inside_jinja2) { + e = (*v)(p->pydev_call_inside_jinja2, a); if (e) return e; + } + if (p->conditional_breakpoint_exception) { + e = (*v)(p->conditional_breakpoint_exception, a); if (e) return e; + } + if (p->top_level_thread_tracer_no_back_frames) { + e = (*v)(p->top_level_thread_tracer_no_back_frames, a); if (e) return e; + } + if (p->top_level_thread_tracer_unhandled) { + e = (*v)(p->top_level_thread_tracer_unhandled, a); if (e) return e; + } + if (p->thread_tracer) { + e = (*v)(p->thread_tracer, a); if (e) return e; + } + if (p->step_in_initial_location) { + e = (*v)(p->step_in_initial_location, a); if (e) return e; + } + if (p->pydev_smart_step_into_variants) { + e = (*v)(p->pydev_smart_step_into_variants, a); if (e) return e; + } + if (p->target_id_to_smart_step_into_variant) { + e = (*v)(p->target_id_to_smart_step_into_variant, a); if (e) return e; + } + if (p->weak_thread) { + e = (*v)(p->weak_thread, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)o; + tmp = ((PyObject*)p->pydev_step_stop); + p->pydev_step_stop = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->pydev_smart_step_stop); + p->pydev_smart_step_stop = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->pydev_call_from_jinja2); + p->pydev_call_from_jinja2 = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->pydev_call_inside_jinja2); + p->pydev_call_inside_jinja2 = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->conditional_breakpoint_exception); + p->conditional_breakpoint_exception = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->top_level_thread_tracer_no_back_frames); + p->top_level_thread_tracer_no_back_frames = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->top_level_thread_tracer_unhandled); + p->top_level_thread_tracer_unhandled = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->thread_tracer); + p->thread_tracer = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->step_in_initial_location); + p->step_in_initial_location = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->pydev_smart_step_into_variants); + p->pydev_smart_step_into_variants = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->target_id_to_smart_step_into_variant); + p->target_id_to_smart_step_into_variant = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->weak_thread); + p->weak_thread = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_state(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_state(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11pydev_state_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_step_stop(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_step_stop(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_step_stop_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_original_step_cmd(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_original_step_cmd(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_23pydev_original_step_cmd_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_step_cmd(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_step_cmd(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_14pydev_step_cmd_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_notify_kill(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_notify_kill(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_17pydev_notify_kill_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_step_stop(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_step_stop(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_21pydev_smart_step_stop_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_django_resolve_frame(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_django_resolve_frame(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_26pydev_django_resolve_frame_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_call_from_jinja2(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_call_from_jinja2(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22pydev_call_from_jinja2_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_call_inside_jinja2(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_call_inside_jinja2(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_call_inside_jinja2_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_is_tracing(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_is_tracing(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_10is_tracing_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_conditional_breakpoint_exception(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_conditional_breakpoint_exception(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_32conditional_breakpoint_exception_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_message(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_message(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13pydev_message_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_suspend_type(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_suspend_type(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_12suspend_type_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_next_line(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_next_line(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_next_line_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_func_name(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_func_name(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15pydev_func_name_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_suspended_at_unhandled(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_suspended_at_unhandled(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_22suspended_at_unhandled_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_trace_suspend_type(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_trace_suspend_type(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_18trace_suspend_type_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_top_level_thread_tracer_no_back_frames(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_top_level_thread_tracer_no_back_frames(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_38top_level_thread_tracer_no_back_frames_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_top_level_thread_tracer_unhandled(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_top_level_thread_tracer_unhandled(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_33top_level_thread_tracer_unhandled_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_thread_tracer(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_thread_tracer(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13thread_tracer_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_step_in_initial_location(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_step_in_initial_location(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24step_in_initial_location_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_parent_offset(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_parent_offset(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_25pydev_smart_parent_offset_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_child_offset(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_child_offset(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_24pydev_smart_child_offset_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_step_into_variants(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_step_into_variants(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_30pydev_smart_step_into_variants_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_target_id_to_smart_step_into_variant(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_target_id_to_smart_step_into_variant(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_36target_id_to_smart_step_into_variant_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_use_scoped_step_frame(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_use_scoped_step_frame(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_27pydev_use_scoped_step_frame_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_weak_thread(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_weak_thread(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11weak_thread_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_is_in_wait_loop(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_is_in_wait_loop(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15is_in_wait_loop_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyMethodDef __pyx_methods_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo[] = { + {(char *)"pydev_state", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_state, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_state, (char *)0, 0}, + {(char *)"pydev_step_stop", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_step_stop, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_step_stop, (char *)0, 0}, + {(char *)"pydev_original_step_cmd", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_original_step_cmd, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_original_step_cmd, (char *)0, 0}, + {(char *)"pydev_step_cmd", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_step_cmd, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_step_cmd, (char *)0, 0}, + {(char *)"pydev_notify_kill", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_notify_kill, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_notify_kill, (char *)0, 0}, + {(char *)"pydev_smart_step_stop", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_step_stop, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_step_stop, (char *)0, 0}, + {(char *)"pydev_django_resolve_frame", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_django_resolve_frame, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_django_resolve_frame, (char *)0, 0}, + {(char *)"pydev_call_from_jinja2", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_call_from_jinja2, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_call_from_jinja2, (char *)0, 0}, + {(char *)"pydev_call_inside_jinja2", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_call_inside_jinja2, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_call_inside_jinja2, (char *)0, 0}, + {(char *)"is_tracing", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_is_tracing, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_is_tracing, (char *)0, 0}, + {(char *)"conditional_breakpoint_exception", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_conditional_breakpoint_exception, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_conditional_breakpoint_exception, (char *)0, 0}, + {(char *)"pydev_message", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_message, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_message, (char *)0, 0}, + {(char *)"suspend_type", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_suspend_type, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_suspend_type, (char *)0, 0}, + {(char *)"pydev_next_line", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_next_line, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_next_line, (char *)0, 0}, + {(char *)"pydev_func_name", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_func_name, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_func_name, (char *)0, 0}, + {(char *)"suspended_at_unhandled", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_suspended_at_unhandled, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_suspended_at_unhandled, (char *)0, 0}, + {(char *)"trace_suspend_type", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_trace_suspend_type, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_trace_suspend_type, (char *)0, 0}, + {(char *)"top_level_thread_tracer_no_back_frames", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_top_level_thread_tracer_no_back_frames, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_top_level_thread_tracer_no_back_frames, (char *)0, 0}, + {(char *)"top_level_thread_tracer_unhandled", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_top_level_thread_tracer_unhandled, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_top_level_thread_tracer_unhandled, (char *)0, 0}, + {(char *)"thread_tracer", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_thread_tracer, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_thread_tracer, (char *)0, 0}, + {(char *)"step_in_initial_location", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_step_in_initial_location, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_step_in_initial_location, (char *)0, 0}, + {(char *)"pydev_smart_parent_offset", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_parent_offset, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_parent_offset, (char *)0, 0}, + {(char *)"pydev_smart_child_offset", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_child_offset, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_child_offset, (char *)0, 0}, + {(char *)"pydev_smart_step_into_variants", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_step_into_variants, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_smart_step_into_variants, (char *)0, 0}, + {(char *)"target_id_to_smart_step_into_variant", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_target_id_to_smart_step_into_variant, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_target_id_to_smart_step_into_variant, (char *)0, 0}, + {(char *)"pydev_use_scoped_step_frame", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_use_scoped_step_frame, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_pydev_use_scoped_step_frame, (char *)0, 0}, + {(char *)"weak_thread", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_weak_thread, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_weak_thread, (char *)0, 0}, + {(char *)"is_in_wait_loop", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_is_in_wait_loop, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_is_in_wait_loop, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo}, + {Py_tp_str, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11__str__}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo}, + {Py_tp_clear, (void *)__pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo}, + {Py_tp_methods, (void *)__pyx_methods_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo}, + {Py_tp_getset, (void *)__pyx_getsets_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo}, + {Py_tp_init, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo}, + {0, 0}, +}; +static PyType_Spec __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo_spec = { + "_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo", + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo_slots, +}; +#else + +static PyTypeObject __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_bundle.pydevd_cython.""PyDBAdditionalThreadInfo", /*tp_name*/ + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_11__str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, /*tp_traverse*/ + __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)o); + p->try_except_infos = ((PyObject*)Py_None); Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj(PyObject *o) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->try_except_infos); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)o; + if (p->try_except_infos) { + e = (*v)(p->try_except_infos, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj *)o; + tmp = ((PyObject*)p->try_except_infos); + p->try_except_infos = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_try_except_infos(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_try_except_infos(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_16try_except_infos_5__del__(o); + } +} + +static PyMethodDef __pyx_methods_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj[] = { + {(char *)"try_except_infos", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_try_except_infos, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_try_except_infos, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj}, + {Py_tp_clear, (void *)__pyx_tp_clear_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj}, + {Py_tp_methods, (void *)__pyx_methods_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj}, + {Py_tp_getset, (void *)__pyx_getsets_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj}, + {Py_tp_init, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj}, + {0, 0}, +}; +static PyType_Spec __pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj_spec = { + "_pydevd_bundle.pydevd_cython._TryExceptContainerObj", + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj_slots, +}; +#else + +static PyTypeObject __pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_bundle.pydevd_cython.""_TryExceptContainerObj", /*tp_name*/ + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj, /*tp_traverse*/ + __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBFrame __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBFrame; + +static PyObject *__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_PyDBFrame(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)o); + p->__pyx_vtab = __pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBFrame; + p->_args = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->exc_info = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_PyDBFrame(PyObject *o) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_PyDBFrame) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->_args); + Py_CLEAR(p->exc_info); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_PyDBFrame(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)o; + if (p->_args) { + e = (*v)(p->_args, a); if (e) return e; + } + if (p->exc_info) { + e = (*v)(p->exc_info, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_PyDBFrame(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *)o; + tmp = ((PyObject*)p->_args); + p->_args = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->exc_info); + p->exc_info = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyMethodDef __pyx_methods_14_pydevd_bundle_13pydevd_cython_PyDBFrame[] = { + {"set_suspend", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_3set_suspend, METH_VARARGS|METH_KEYWORDS, 0}, + {"do_wait_suspend", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_5do_wait_suspend, METH_VARARGS|METH_KEYWORDS, 0}, + {"trace_exception", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_7trace_exception, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"handle_user_exception", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_9handle_user_exception, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_13__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_15__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_PyDBFrame}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_PyDBFrame}, + {Py_tp_clear, (void *)__pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_PyDBFrame}, + {Py_tp_methods, (void *)__pyx_methods_14_pydevd_bundle_13pydevd_cython_PyDBFrame}, + {Py_tp_init, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_PyDBFrame}, + {0, 0}, +}; +static PyType_Spec __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame_spec = { + "_pydevd_bundle.pydevd_cython.PyDBFrame", + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame_slots, +}; +#else + +static PyTypeObject __pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_bundle.pydevd_cython.""PyDBFrame", /*tp_name*/ + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_PyDBFrame, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_PyDBFrame, /*tp_traverse*/ + __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_PyDBFrame, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_14_pydevd_bundle_13pydevd_cython_PyDBFrame, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_14_pydevd_bundle_13pydevd_cython_PyDBFrame, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)o); + p->method_object = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper(PyObject *o) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->method_object); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)o; + if (p->method_object) { + e = (*v)(p->method_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper *)o; + tmp = ((PyObject*)p->method_object); + p->method_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyMethodDef __pyx_methods_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper[] = { + {"get_method_object", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_5get_method_object, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper}, + {Py_tp_call, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_3__call__}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper}, + {Py_tp_clear, (void *)__pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper}, + {Py_tp_methods, (void *)__pyx_methods_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper}, + {Py_tp_init, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper}, + {0, 0}, +}; +static PyType_Spec __pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper_spec = { + "_pydevd_bundle.pydevd_cython.SafeCallWrapper", + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper_slots, +}; +#else + +static PyTypeObject __pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_bundle.pydevd_cython.""SafeCallWrapper", /*tp_name*/ + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + __pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_3__call__, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper, /*tp_traverse*/ + __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)o); + p->_args = ((PyObject*)Py_None); Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions(PyObject *o) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->_args); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)o; + if (p->_args) { + e = (*v)(p->_args, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions *)o; + tmp = ((PyObject*)p->_args); + p->_args = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions__args(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions__args(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5_args_5__del__(o); + } +} + +static PyMethodDef __pyx_methods_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions[] = { + {"trace_unhandled_exceptions", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_3trace_unhandled_exceptions, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"get_trace_dispatch_func", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5get_trace_dispatch_func, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions[] = { + {(char *)"_args", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions__args, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions__args, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions}, + {Py_tp_clear, (void *)__pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions}, + {Py_tp_methods, (void *)__pyx_methods_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions}, + {Py_tp_getset, (void *)__pyx_getsets_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions}, + {Py_tp_init, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions}, + {0, 0}, +}; +static PyType_Spec __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions_spec = { + "_pydevd_bundle.pydevd_cython.TopLevelThreadTracerOnlyUnhandledExceptions", + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions_slots, +}; +#else + +static PyTypeObject __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_bundle.pydevd_cython.""TopLevelThreadTracerOnlyUnhandledExceptions", /*tp_name*/ + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, /*tp_traverse*/ + __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)o); + p->_frame_trace_dispatch = Py_None; Py_INCREF(Py_None); + p->_args = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->try_except_infos = Py_None; Py_INCREF(Py_None); + p->_last_exc_arg = Py_None; Py_INCREF(Py_None); + p->_raise_lines = ((PyObject*)Py_None); Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame(PyObject *o) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->_frame_trace_dispatch); + Py_CLEAR(p->_args); + Py_CLEAR(p->try_except_infos); + Py_CLEAR(p->_last_exc_arg); + Py_CLEAR(p->_raise_lines); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)o; + if (p->_frame_trace_dispatch) { + e = (*v)(p->_frame_trace_dispatch, a); if (e) return e; + } + if (p->_args) { + e = (*v)(p->_args, a); if (e) return e; + } + if (p->try_except_infos) { + e = (*v)(p->try_except_infos, a); if (e) return e; + } + if (p->_last_exc_arg) { + e = (*v)(p->_last_exc_arg, a); if (e) return e; + } + if (p->_raise_lines) { + e = (*v)(p->_raise_lines, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame *)o; + tmp = ((PyObject*)p->_frame_trace_dispatch); + p->_frame_trace_dispatch = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_args); + p->_args = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->try_except_infos); + p->try_except_infos = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_last_exc_arg); + p->_last_exc_arg = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_raise_lines); + p->_raise_lines = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__frame_trace_dispatch(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__frame_trace_dispatch(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_21_frame_trace_dispatch_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__args(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__args(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5_args_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_try_except_infos(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_try_except_infos(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16try_except_infos_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__last_exc_arg(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__last_exc_arg(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_13_last_exc_arg_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__raise_lines(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__raise_lines(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_12_raise_lines_5__del__(o); + } +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__last_raise_line(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__last_raise_line(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_16_last_raise_line_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyMethodDef __pyx_methods_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame[] = { + {"trace_dispatch_and_unhandled_exceptions", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_3trace_dispatch_and_unhandled_exceptions, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"get_trace_dispatch_func", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5get_trace_dispatch_func, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame[] = { + {(char *)"_frame_trace_dispatch", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__frame_trace_dispatch, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__frame_trace_dispatch, (char *)0, 0}, + {(char *)"_args", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__args, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__args, (char *)0, 0}, + {(char *)"try_except_infos", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_try_except_infos, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_try_except_infos, (char *)0, 0}, + {(char *)"_last_exc_arg", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__last_exc_arg, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__last_exc_arg, (char *)0, 0}, + {(char *)"_raise_lines", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__raise_lines, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__raise_lines, (char *)0, 0}, + {(char *)"_last_raise_line", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__last_raise_line, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame__last_raise_line, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame}, + {Py_tp_clear, (void *)__pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame}, + {Py_tp_methods, (void *)__pyx_methods_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame}, + {Py_tp_getset, (void *)__pyx_getsets_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame}, + {Py_tp_init, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame}, + {0, 0}, +}; +static PyType_Spec __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame_spec = { + "_pydevd_bundle.pydevd_cython.TopLevelThreadTracerNoBackFrame", + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame_slots, +}; +#else + +static PyTypeObject __pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_bundle.pydevd_cython.""TopLevelThreadTracerNoBackFrame", /*tp_name*/ + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, /*tp_traverse*/ + __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_ThreadTracer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)o); + p->_args = ((PyObject*)Py_None); Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_ThreadTracer(PyObject *o) { + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_ThreadTracer) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->_args); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_ThreadTracer(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)o; + if (p->_args) { + e = (*v)(p->_args, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_ThreadTracer(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *p = (struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer *)o; + tmp = ((PyObject*)p->_args); + p->_args = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_14_pydevd_bundle_13pydevd_cython_12ThreadTracer__args(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_1__get__(o); +} + +static int __pyx_setprop_14_pydevd_bundle_13pydevd_cython_12ThreadTracer__args(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_3__set__(o, v); + } + else { + return __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5_args_5__del__(o); + } +} + +static PyMethodDef __pyx_methods_14_pydevd_bundle_13pydevd_cython_ThreadTracer[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_14_pydevd_bundle_13pydevd_cython_ThreadTracer[] = { + {(char *)"_args", __pyx_getprop_14_pydevd_bundle_13pydevd_cython_12ThreadTracer__args, __pyx_setprop_14_pydevd_bundle_13pydevd_cython_12ThreadTracer__args, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_ThreadTracer}, + {Py_tp_call, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_3__call__}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_ThreadTracer}, + {Py_tp_clear, (void *)__pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_ThreadTracer}, + {Py_tp_methods, (void *)__pyx_methods_14_pydevd_bundle_13pydevd_cython_ThreadTracer}, + {Py_tp_getset, (void *)__pyx_getsets_14_pydevd_bundle_13pydevd_cython_ThreadTracer}, + {Py_tp_init, (void *)__pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_ThreadTracer}, + {0, 0}, +}; +static PyType_Spec __pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer_spec = { + "_pydevd_bundle.pydevd_cython.ThreadTracer", + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer_slots, +}; +#else + +static PyTypeObject __pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_bundle.pydevd_cython.""ThreadTracer", /*tp_name*/ + sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_ThreadTracer), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_14_pydevd_bundle_13pydevd_cython_ThreadTracer, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_3__call__, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_14_pydevd_bundle_13pydevd_cython_ThreadTracer, /*tp_traverse*/ + __pyx_tp_clear_14_pydevd_bundle_13pydevd_cython_ThreadTracer, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_14_pydevd_bundle_13pydevd_cython_ThreadTracer, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_14_pydevd_bundle_13pydevd_cython_ThreadTracer, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_14_pydevd_bundle_13pydevd_cython_ThreadTracer, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_s_, __pyx_k_, sizeof(__pyx_k_), 0, 0, 1, 0}, + {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0}, + {&__pyx_n_s_ALL, __pyx_k_ALL, sizeof(__pyx_k_ALL), 0, 0, 1, 1}, + {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, + {&__pyx_n_s_CMD_SET_FUNCTION_BREAK, __pyx_k_CMD_SET_FUNCTION_BREAK, sizeof(__pyx_k_CMD_SET_FUNCTION_BREAK), 0, 0, 1, 1}, + {&__pyx_n_s_DEBUG_START, __pyx_k_DEBUG_START, sizeof(__pyx_k_DEBUG_START), 0, 0, 1, 1}, + {&__pyx_n_s_DEBUG_START_PY3K, __pyx_k_DEBUG_START_PY3K, sizeof(__pyx_k_DEBUG_START_PY3K), 0, 0, 1, 1}, + {&__pyx_n_s_EXCEPTION_TYPE_HANDLED, __pyx_k_EXCEPTION_TYPE_HANDLED, sizeof(__pyx_k_EXCEPTION_TYPE_HANDLED), 0, 0, 1, 1}, + {&__pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED, __pyx_k_EXCEPTION_TYPE_USER_UNHANDLED, sizeof(__pyx_k_EXCEPTION_TYPE_USER_UNHANDLED), 0, 0, 1, 1}, + {&__pyx_kp_s_Error_in_linecache_checkcache_r, __pyx_k_Error_in_linecache_checkcache_r, sizeof(__pyx_k_Error_in_linecache_checkcache_r), 0, 0, 1, 0}, + {&__pyx_kp_s_Error_in_linecache_getline_r_s_f, __pyx_k_Error_in_linecache_getline_r_s_f, sizeof(__pyx_k_Error_in_linecache_getline_r_s_f), 0, 0, 1, 0}, + {&__pyx_n_s_ForkSafeLock, __pyx_k_ForkSafeLock, sizeof(__pyx_k_ForkSafeLock), 0, 0, 1, 1}, + {&__pyx_n_s_GeneratorExit, __pyx_k_GeneratorExit, sizeof(__pyx_k_GeneratorExit), 0, 0, 1, 1}, + {&__pyx_n_s_IGNORE_EXCEPTION_TAG, __pyx_k_IGNORE_EXCEPTION_TAG, sizeof(__pyx_k_IGNORE_EXCEPTION_TAG), 0, 0, 1, 1}, + {&__pyx_kp_s_IgnoreException, __pyx_k_IgnoreException, sizeof(__pyx_k_IgnoreException), 0, 0, 1, 0}, + {&__pyx_kp_s_Ignore_exception_s_in_library_s, __pyx_k_Ignore_exception_s_in_library_s, sizeof(__pyx_k_Ignore_exception_s_in_library_s), 0, 0, 1, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_k_Incompatible_checksums_0x_x_vs_0_2, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_2), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3, __pyx_k_Incompatible_checksums_0x_x_vs_0_3, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_3), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4, __pyx_k_Incompatible_checksums_0x_x_vs_0_4, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_4), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_5, __pyx_k_Incompatible_checksums_0x_x_vs_0_5, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_5), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_6, __pyx_k_Incompatible_checksums_0x_x_vs_0_6, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_6), 0, 0, 1, 0}, + {&__pyx_n_s_KeyboardInterrupt, __pyx_k_KeyboardInterrupt, sizeof(__pyx_k_KeyboardInterrupt), 0, 0, 1, 1}, + {&__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER, __pyx_k_NORM_PATHS_AND_BASE_CONTAINER, sizeof(__pyx_k_NORM_PATHS_AND_BASE_CONTAINER), 0, 0, 1, 1}, + {&__pyx_n_s_NO_FTRACE, __pyx_k_NO_FTRACE, sizeof(__pyx_k_NO_FTRACE), 0, 0, 1, 1}, + {&__pyx_n_s_NameError, __pyx_k_NameError, sizeof(__pyx_k_NameError), 0, 0, 1, 1}, + {&__pyx_n_s_None, __pyx_k_None, sizeof(__pyx_k_None), 0, 0, 1, 1}, + {&__pyx_kp_s_Not_used_in_sys_monitoring_mode, __pyx_k_Not_used_in_sys_monitoring_mode, sizeof(__pyx_k_Not_used_in_sys_monitoring_mode), 0, 0, 1, 0}, + {&__pyx_n_s_PYDEVD_IPYTHON_CONTEXT, __pyx_k_PYDEVD_IPYTHON_CONTEXT, sizeof(__pyx_k_PYDEVD_IPYTHON_CONTEXT), 0, 0, 1, 1}, + {&__pyx_n_s_PYDEVD_USE_SYS_MONITORING, __pyx_k_PYDEVD_USE_SYS_MONITORING, sizeof(__pyx_k_PYDEVD_USE_SYS_MONITORING), 0, 0, 1, 1}, + {&__pyx_n_s_PYDEV_FILE, __pyx_k_PYDEV_FILE, sizeof(__pyx_k_PYDEV_FILE), 0, 0, 1, 1}, + {&__pyx_n_s_PYTHON_SUSPEND, __pyx_k_PYTHON_SUSPEND, sizeof(__pyx_k_PYTHON_SUSPEND), 0, 0, 1, 1}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBAdditionalThreadInfo, __pyx_k_PyDBAdditionalThreadInfo, sizeof(__pyx_k_PyDBAdditionalThreadInfo), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBAdditionalThreadInfo___reduc, __pyx_k_PyDBAdditionalThreadInfo___reduc, sizeof(__pyx_k_PyDBAdditionalThreadInfo___reduc), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBAdditionalThreadInfo___setst, __pyx_k_PyDBAdditionalThreadInfo___setst, sizeof(__pyx_k_PyDBAdditionalThreadInfo___setst), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBAdditionalThreadInfo__get_re, __pyx_k_PyDBAdditionalThreadInfo__get_re, sizeof(__pyx_k_PyDBAdditionalThreadInfo__get_re), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBAdditionalThreadInfo__is_ste, __pyx_k_PyDBAdditionalThreadInfo__is_ste, sizeof(__pyx_k_PyDBAdditionalThreadInfo__is_ste), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBAdditionalThreadInfo_get_top, __pyx_k_PyDBAdditionalThreadInfo_get_top, sizeof(__pyx_k_PyDBAdditionalThreadInfo_get_top), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBAdditionalThreadInfo_update, __pyx_k_PyDBAdditionalThreadInfo_update, sizeof(__pyx_k_PyDBAdditionalThreadInfo_update), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBFrame, __pyx_k_PyDBFrame, sizeof(__pyx_k_PyDBFrame), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBFrame___reduce_cython, __pyx_k_PyDBFrame___reduce_cython, sizeof(__pyx_k_PyDBFrame___reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBFrame___setstate_cython, __pyx_k_PyDBFrame___setstate_cython, sizeof(__pyx_k_PyDBFrame___setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBFrame_do_wait_suspend, __pyx_k_PyDBFrame_do_wait_suspend, sizeof(__pyx_k_PyDBFrame_do_wait_suspend), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBFrame_handle_user_exception, __pyx_k_PyDBFrame_handle_user_exception, sizeof(__pyx_k_PyDBFrame_handle_user_exception), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBFrame_set_suspend, __pyx_k_PyDBFrame_set_suspend, sizeof(__pyx_k_PyDBFrame_set_suspend), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBFrame_trace_dispatch, __pyx_k_PyDBFrame_trace_dispatch, sizeof(__pyx_k_PyDBFrame_trace_dispatch), 0, 0, 1, 1}, + {&__pyx_n_s_PyDBFrame_trace_exception, __pyx_k_PyDBFrame_trace_exception, sizeof(__pyx_k_PyDBFrame_trace_exception), 0, 0, 1, 1}, + {&__pyx_n_s_RETURN_VALUES_DICT, __pyx_k_RETURN_VALUES_DICT, sizeof(__pyx_k_RETURN_VALUES_DICT), 0, 0, 1, 1}, + {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, + {&__pyx_n_s_STATE_RUN, __pyx_k_STATE_RUN, sizeof(__pyx_k_STATE_RUN), 0, 0, 1, 1}, + {&__pyx_n_s_STATE_SUSPEND, __pyx_k_STATE_SUSPEND, sizeof(__pyx_k_STATE_SUSPEND), 0, 0, 1, 1}, + {&__pyx_n_s_SUPPORT_GEVENT, __pyx_k_SUPPORT_GEVENT, sizeof(__pyx_k_SUPPORT_GEVENT), 0, 0, 1, 1}, + {&__pyx_n_s_SafeCallWrapper, __pyx_k_SafeCallWrapper, sizeof(__pyx_k_SafeCallWrapper), 0, 0, 1, 1}, + {&__pyx_n_s_SafeCallWrapper___reduce_cython, __pyx_k_SafeCallWrapper___reduce_cython, sizeof(__pyx_k_SafeCallWrapper___reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_SafeCallWrapper___setstate_cytho, __pyx_k_SafeCallWrapper___setstate_cytho, sizeof(__pyx_k_SafeCallWrapper___setstate_cytho), 0, 0, 1, 1}, + {&__pyx_n_s_SafeCallWrapper_get_method_objec, __pyx_k_SafeCallWrapper_get_method_objec, sizeof(__pyx_k_SafeCallWrapper_get_method_objec), 0, 0, 1, 1}, + {&__pyx_kp_s_State_s_Stop_s_Cmd_s_Kill_s, __pyx_k_State_s_Stop_s_Cmd_s_Kill_s, sizeof(__pyx_k_State_s_Stop_s_Cmd_s_Kill_s), 0, 0, 1, 0}, + {&__pyx_n_s_StopAsyncIteration, __pyx_k_StopAsyncIteration, sizeof(__pyx_k_StopAsyncIteration), 0, 0, 1, 1}, + {&__pyx_n_s_StopIteration, __pyx_k_StopIteration, sizeof(__pyx_k_StopIteration), 0, 0, 1, 1}, + {&__pyx_kp_s_Stop_inside_ipython_call, __pyx_k_Stop_inside_ipython_call, sizeof(__pyx_k_Stop_inside_ipython_call), 0, 0, 1, 0}, + {&__pyx_n_s_SystemExit, __pyx_k_SystemExit, sizeof(__pyx_k_SystemExit), 0, 0, 1, 1}, + {&__pyx_n_s_TRACE_PROPERTY, __pyx_k_TRACE_PROPERTY, sizeof(__pyx_k_TRACE_PROPERTY), 0, 0, 1, 1}, + {&__pyx_n_s_Thread, __pyx_k_Thread, sizeof(__pyx_k_Thread), 0, 0, 1, 1}, + {&__pyx_n_s_ThreadTracer, __pyx_k_ThreadTracer, sizeof(__pyx_k_ThreadTracer), 0, 0, 1, 1}, + {&__pyx_n_s_ThreadTracer___reduce_cython, __pyx_k_ThreadTracer___reduce_cython, sizeof(__pyx_k_ThreadTracer___reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_ThreadTracer___setstate_cython, __pyx_k_ThreadTracer___setstate_cython, sizeof(__pyx_k_ThreadTracer___setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerNoBackFrame, __pyx_k_TopLevelThreadTracerNoBackFrame, sizeof(__pyx_k_TopLevelThreadTracerNoBackFrame), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerNoBackFrame_2, __pyx_k_TopLevelThreadTracerNoBackFrame_2, sizeof(__pyx_k_TopLevelThreadTracerNoBackFrame_2), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerNoBackFrame_3, __pyx_k_TopLevelThreadTracerNoBackFrame_3, sizeof(__pyx_k_TopLevelThreadTracerNoBackFrame_3), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerNoBackFrame_4, __pyx_k_TopLevelThreadTracerNoBackFrame_4, sizeof(__pyx_k_TopLevelThreadTracerNoBackFrame_4), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerNoBackFrame_5, __pyx_k_TopLevelThreadTracerNoBackFrame_5, sizeof(__pyx_k_TopLevelThreadTracerNoBackFrame_5), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerOnlyUnhandle, __pyx_k_TopLevelThreadTracerOnlyUnhandle, sizeof(__pyx_k_TopLevelThreadTracerOnlyUnhandle), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_2, __pyx_k_TopLevelThreadTracerOnlyUnhandle_2, sizeof(__pyx_k_TopLevelThreadTracerOnlyUnhandle_2), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_3, __pyx_k_TopLevelThreadTracerOnlyUnhandle_3, sizeof(__pyx_k_TopLevelThreadTracerOnlyUnhandle_3), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_4, __pyx_k_TopLevelThreadTracerOnlyUnhandle_4, sizeof(__pyx_k_TopLevelThreadTracerOnlyUnhandle_4), 0, 0, 1, 1}, + {&__pyx_n_s_TopLevelThreadTracerOnlyUnhandle_5, __pyx_k_TopLevelThreadTracerOnlyUnhandle_5, sizeof(__pyx_k_TopLevelThreadTracerOnlyUnhandle_5), 0, 0, 1, 1}, + {&__pyx_n_s_TryExceptContainerObj, __pyx_k_TryExceptContainerObj, sizeof(__pyx_k_TryExceptContainerObj), 0, 0, 1, 1}, + {&__pyx_n_s_TryExceptContainerObj___reduce, __pyx_k_TryExceptContainerObj___reduce, sizeof(__pyx_k_TryExceptContainerObj___reduce), 0, 0, 1, 1}, + {&__pyx_n_s_TryExceptContainerObj___setstat, __pyx_k_TryExceptContainerObj___setstat, sizeof(__pyx_k_TryExceptContainerObj___setstat), 0, 0, 1, 1}, + {&__pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA, __pyx_k_USE_CUSTOM_SYS_CURRENT_FRAMES_MA, sizeof(__pyx_k_USE_CUSTOM_SYS_CURRENT_FRAMES_MA), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_get_topmost_frame_for, __pyx_k_Unable_to_get_topmost_frame_for, sizeof(__pyx_k_Unable_to_get_topmost_frame_for), 0, 0, 1, 0}, + {&__pyx_kp_s__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 0, 1, 0}, + {&__pyx_kp_u__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 1, 0, 0}, + {&__pyx_n_s__19, __pyx_k__19, sizeof(__pyx_k__19), 0, 0, 1, 1}, + {&__pyx_kp_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 0}, + {&__pyx_kp_s__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 0, 1, 0}, + {&__pyx_kp_s__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 0, 1, 0}, + {&__pyx_n_s_abs_real_path_and_base, __pyx_k_abs_real_path_and_base, sizeof(__pyx_k_abs_real_path_and_base), 0, 0, 1, 1}, + {&__pyx_n_s_absolute_filename, __pyx_k_absolute_filename, sizeof(__pyx_k_absolute_filename), 0, 0, 1, 1}, + {&__pyx_n_s_active, __pyx_k_active, sizeof(__pyx_k_active), 0, 0, 1, 1}, + {&__pyx_n_s_add, __pyx_k_add, sizeof(__pyx_k_add), 0, 0, 1, 1}, + {&__pyx_n_s_add_additional_info, __pyx_k_add_additional_info, sizeof(__pyx_k_add_additional_info), 0, 0, 1, 1}, + {&__pyx_n_s_add_command, __pyx_k_add_command, sizeof(__pyx_k_add_command), 0, 0, 1, 1}, + {&__pyx_n_s_add_exception_to_frame, __pyx_k_add_exception_to_frame, sizeof(__pyx_k_add_exception_to_frame), 0, 0, 1, 1}, + {&__pyx_n_s_additional_info, __pyx_k_additional_info, sizeof(__pyx_k_additional_info), 0, 0, 1, 1}, + {&__pyx_n_s_any_thread_stepping, __pyx_k_any_thread_stepping, sizeof(__pyx_k_any_thread_stepping), 0, 0, 1, 1}, + {&__pyx_n_s_append, __pyx_k_append, sizeof(__pyx_k_append), 0, 0, 1, 1}, + {&__pyx_n_s_apply_files_filter, __pyx_k_apply_files_filter, sizeof(__pyx_k_apply_files_filter), 0, 0, 1, 1}, + {&__pyx_n_s_apply_to_settrace, __pyx_k_apply_to_settrace, sizeof(__pyx_k_apply_to_settrace), 0, 0, 1, 1}, + {&__pyx_n_s_arg, __pyx_k_arg, sizeof(__pyx_k_arg), 0, 0, 1, 1}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, + {&__pyx_n_s_args_2, __pyx_k_args_2, sizeof(__pyx_k_args_2), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_basename, __pyx_k_basename, sizeof(__pyx_k_basename), 0, 0, 1, 1}, + {&__pyx_n_s_bootstrap, __pyx_k_bootstrap, sizeof(__pyx_k_bootstrap), 0, 0, 1, 1}, + {&__pyx_n_s_bootstrap_2, __pyx_k_bootstrap_2, sizeof(__pyx_k_bootstrap_2), 0, 0, 1, 1}, + {&__pyx_n_s_bootstrap_inner, __pyx_k_bootstrap_inner, sizeof(__pyx_k_bootstrap_inner), 0, 0, 1, 1}, + {&__pyx_n_s_bootstrap_inner_2, __pyx_k_bootstrap_inner_2, sizeof(__pyx_k_bootstrap_inner_2), 0, 0, 1, 1}, + {&__pyx_n_s_break_on_caught_exceptions, __pyx_k_break_on_caught_exceptions, sizeof(__pyx_k_break_on_caught_exceptions), 0, 0, 1, 1}, + {&__pyx_n_s_break_on_user_uncaught_exception, __pyx_k_break_on_user_uncaught_exception, sizeof(__pyx_k_break_on_user_uncaught_exception), 0, 0, 1, 1}, + {&__pyx_n_s_breakpoints, __pyx_k_breakpoints, sizeof(__pyx_k_breakpoints), 0, 0, 1, 1}, + {&__pyx_n_s_call, __pyx_k_call, sizeof(__pyx_k_call), 0, 0, 1, 1}, + {&__pyx_n_s_call_2, __pyx_k_call_2, sizeof(__pyx_k_call_2), 0, 0, 1, 1}, + {&__pyx_n_s_can_skip, __pyx_k_can_skip, sizeof(__pyx_k_can_skip), 0, 0, 1, 1}, + {&__pyx_n_s_canonical_normalized_filename, __pyx_k_canonical_normalized_filename, sizeof(__pyx_k_canonical_normalized_filename), 0, 0, 1, 1}, + {&__pyx_kp_s_cell, __pyx_k_cell, sizeof(__pyx_k_cell), 0, 0, 1, 0}, + {&__pyx_n_s_check_excs, __pyx_k_check_excs, sizeof(__pyx_k_check_excs), 0, 0, 1, 1}, + {&__pyx_n_s_check_trace_obj, __pyx_k_check_trace_obj, sizeof(__pyx_k_check_trace_obj), 0, 0, 1, 1}, + {&__pyx_n_s_checkcache, __pyx_k_checkcache, sizeof(__pyx_k_checkcache), 0, 0, 1, 1}, + {&__pyx_n_s_children_variants, __pyx_k_children_variants, sizeof(__pyx_k_children_variants), 0, 0, 1, 1}, + {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_cmd_factory, __pyx_k_cmd_factory, sizeof(__pyx_k_cmd_factory), 0, 0, 1, 1}, + {&__pyx_n_s_cmd_step_into, __pyx_k_cmd_step_into, sizeof(__pyx_k_cmd_step_into), 0, 0, 1, 1}, + {&__pyx_n_s_cmd_step_over, __pyx_k_cmd_step_over, sizeof(__pyx_k_cmd_step_over), 0, 0, 1, 1}, + {&__pyx_n_s_co_filename, __pyx_k_co_filename, sizeof(__pyx_k_co_filename), 0, 0, 1, 1}, + {&__pyx_n_s_co_firstlineno, __pyx_k_co_firstlineno, sizeof(__pyx_k_co_firstlineno), 0, 0, 1, 1}, + {&__pyx_n_s_co_flags, __pyx_k_co_flags, sizeof(__pyx_k_co_flags), 0, 0, 1, 1}, + {&__pyx_n_s_co_name, __pyx_k_co_name, sizeof(__pyx_k_co_name), 0, 0, 1, 1}, + {&__pyx_n_s_collect_return_info, __pyx_k_collect_return_info, sizeof(__pyx_k_collect_return_info), 0, 0, 1, 1}, + {&__pyx_n_s_collect_try_except_info, __pyx_k_collect_try_except_info, sizeof(__pyx_k_collect_try_except_info), 0, 0, 1, 1}, + {&__pyx_n_s_compile, __pyx_k_compile, sizeof(__pyx_k_compile), 0, 0, 1, 1}, + {&__pyx_n_s_condition, __pyx_k_condition, sizeof(__pyx_k_condition), 0, 0, 1, 1}, + {&__pyx_n_s_constant_to_str, __pyx_k_constant_to_str, sizeof(__pyx_k_constant_to_str), 0, 0, 1, 1}, + {&__pyx_n_s_constructed_tid_to_last_frame, __pyx_k_constructed_tid_to_last_frame, sizeof(__pyx_k_constructed_tid_to_last_frame), 0, 0, 1, 1}, + {&__pyx_n_s_container_obj, __pyx_k_container_obj, sizeof(__pyx_k_container_obj), 0, 0, 1, 1}, + {&__pyx_n_s_critical, __pyx_k_critical, sizeof(__pyx_k_critical), 0, 0, 1, 1}, + {&__pyx_n_s_curr_stat, __pyx_k_curr_stat, sizeof(__pyx_k_curr_stat), 0, 0, 1, 1}, + {&__pyx_n_s_current_frames, __pyx_k_current_frames, sizeof(__pyx_k_current_frames), 0, 0, 1, 1}, + {&__pyx_n_s_custom_key, __pyx_k_custom_key, sizeof(__pyx_k_custom_key), 0, 0, 1, 1}, + {&__pyx_n_s_debug, __pyx_k_debug, sizeof(__pyx_k_debug), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_n_s_dict_2, __pyx_k_dict_2, sizeof(__pyx_k_dict_2), 0, 0, 1, 1}, + {&__pyx_n_s_dis, __pyx_k_dis, sizeof(__pyx_k_dis), 0, 0, 1, 1}, + {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, + {&__pyx_n_s_disable_tracing, __pyx_k_disable_tracing, sizeof(__pyx_k_disable_tracing), 0, 0, 1, 1}, + {&__pyx_n_s_do_wait_suspend, __pyx_k_do_wait_suspend, sizeof(__pyx_k_do_wait_suspend), 0, 0, 1, 1}, + {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, + {&__pyx_n_s_enable_tracing, __pyx_k_enable_tracing, sizeof(__pyx_k_enable_tracing), 0, 0, 1, 1}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_endswith, __pyx_k_endswith, sizeof(__pyx_k_endswith), 0, 0, 1, 1}, + {&__pyx_n_s_enter, __pyx_k_enter, sizeof(__pyx_k_enter), 0, 0, 1, 1}, + {&__pyx_n_s_event, __pyx_k_event, sizeof(__pyx_k_event), 0, 0, 1, 1}, + {&__pyx_n_s_exc_break, __pyx_k_exc_break, sizeof(__pyx_k_exc_break), 0, 0, 1, 1}, + {&__pyx_n_s_exc_break_caught, __pyx_k_exc_break_caught, sizeof(__pyx_k_exc_break_caught), 0, 0, 1, 1}, + {&__pyx_n_s_exc_break_user, __pyx_k_exc_break_user, sizeof(__pyx_k_exc_break_user), 0, 0, 1, 1}, + {&__pyx_n_s_exc_info, __pyx_k_exc_info, sizeof(__pyx_k_exc_info), 0, 0, 1, 1}, + {&__pyx_n_s_exc_lineno, __pyx_k_exc_lineno, sizeof(__pyx_k_exc_lineno), 0, 0, 1, 1}, + {&__pyx_n_s_except_line, __pyx_k_except_line, sizeof(__pyx_k_except_line), 0, 0, 1, 1}, + {&__pyx_n_s_exception, __pyx_k_exception, sizeof(__pyx_k_exception), 0, 0, 1, 1}, + {&__pyx_n_s_exception_break, __pyx_k_exception_break, sizeof(__pyx_k_exception_break), 0, 0, 1, 1}, + {&__pyx_n_s_exception_breakpoint, __pyx_k_exception_breakpoint, sizeof(__pyx_k_exception_breakpoint), 0, 0, 1, 1}, + {&__pyx_n_s_exception_type, __pyx_k_exception_type, sizeof(__pyx_k_exception_type), 0, 0, 1, 1}, + {&__pyx_n_s_exclude_exception_by_filter, __pyx_k_exclude_exception_by_filter, sizeof(__pyx_k_exclude_exception_by_filter), 0, 0, 1, 1}, + {&__pyx_n_s_exec, __pyx_k_exec, sizeof(__pyx_k_exec), 0, 0, 1, 1}, + {&__pyx_n_s_execfile, __pyx_k_execfile, sizeof(__pyx_k_execfile), 0, 0, 1, 1}, + {&__pyx_n_s_exit, __pyx_k_exit, sizeof(__pyx_k_exit), 0, 0, 1, 1}, + {&__pyx_n_s_expression, __pyx_k_expression, sizeof(__pyx_k_expression), 0, 0, 1, 1}, + {&__pyx_n_s_f, __pyx_k_f, sizeof(__pyx_k_f), 0, 0, 1, 1}, + {&__pyx_n_s_f_back, __pyx_k_f_back, sizeof(__pyx_k_f_back), 0, 0, 1, 1}, + {&__pyx_n_s_f_code, __pyx_k_f_code, sizeof(__pyx_k_f_code), 0, 0, 1, 1}, + {&__pyx_n_s_f_globals, __pyx_k_f_globals, sizeof(__pyx_k_f_globals), 0, 0, 1, 1}, + {&__pyx_n_s_f_lasti, __pyx_k_f_lasti, sizeof(__pyx_k_f_lasti), 0, 0, 1, 1}, + {&__pyx_n_s_f_lineno, __pyx_k_f_lineno, sizeof(__pyx_k_f_lineno), 0, 0, 1, 1}, + {&__pyx_n_s_f_locals, __pyx_k_f_locals, sizeof(__pyx_k_f_locals), 0, 0, 1, 1}, + {&__pyx_n_s_f_trace, __pyx_k_f_trace, sizeof(__pyx_k_f_trace), 0, 0, 1, 1}, + {&__pyx_n_s_f_unhandled, __pyx_k_f_unhandled, sizeof(__pyx_k_f_unhandled), 0, 0, 1, 1}, + {&__pyx_n_s_filename, __pyx_k_filename, sizeof(__pyx_k_filename), 0, 0, 1, 1}, + {&__pyx_n_s_filename_to_lines_where_exceptio, __pyx_k_filename_to_lines_where_exceptio, sizeof(__pyx_k_filename_to_lines_where_exceptio), 0, 0, 1, 1}, + {&__pyx_n_s_filename_to_stat_info, __pyx_k_filename_to_stat_info, sizeof(__pyx_k_filename_to_stat_info), 0, 0, 1, 1}, + {&__pyx_n_s_findlinestarts, __pyx_k_findlinestarts, sizeof(__pyx_k_findlinestarts), 0, 0, 1, 1}, + {&__pyx_n_s_fix_top_level_trace_and_get_trac, __pyx_k_fix_top_level_trace_and_get_trac, sizeof(__pyx_k_fix_top_level_trace_and_get_trac), 0, 0, 1, 1}, + {&__pyx_n_s_force_only_unhandled_tracer, __pyx_k_force_only_unhandled_tracer, sizeof(__pyx_k_force_only_unhandled_tracer), 0, 0, 1, 1}, + {&__pyx_n_s_frame, __pyx_k_frame, sizeof(__pyx_k_frame), 0, 0, 1, 1}, + {&__pyx_n_s_frame_cache_key, __pyx_k_frame_cache_key, sizeof(__pyx_k_frame_cache_key), 0, 0, 1, 1}, + {&__pyx_n_s_frame_id_to_frame, __pyx_k_frame_id_to_frame, sizeof(__pyx_k_frame_id_to_frame), 0, 0, 1, 1}, + {&__pyx_n_s_frame_skips_cache, __pyx_k_frame_skips_cache, sizeof(__pyx_k_frame_skips_cache), 0, 0, 1, 1}, + {&__pyx_n_s_frame_trace_dispatch, __pyx_k_frame_trace_dispatch, sizeof(__pyx_k_frame_trace_dispatch), 0, 0, 1, 1}, + {&__pyx_n_s_from_user_input, __pyx_k_from_user_input, sizeof(__pyx_k_from_user_input), 0, 0, 1, 1}, + {&__pyx_n_s_func_name, __pyx_k_func_name, sizeof(__pyx_k_func_name), 0, 0, 1, 1}, + {&__pyx_n_s_function_breakpoint_name_to_brea, __pyx_k_function_breakpoint_name_to_brea, sizeof(__pyx_k_function_breakpoint_name_to_brea), 0, 0, 1, 1}, + {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, + {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1}, + {&__pyx_n_s_get_abs_path_real_path_and_base, __pyx_k_get_abs_path_real_path_and_base, sizeof(__pyx_k_get_abs_path_real_path_and_base), 0, 0, 1, 1}, + {&__pyx_n_s_get_breakpoint, __pyx_k_get_breakpoint, sizeof(__pyx_k_get_breakpoint), 0, 0, 1, 1}, + {&__pyx_n_s_get_clsname_for_code, __pyx_k_get_clsname_for_code, sizeof(__pyx_k_get_clsname_for_code), 0, 0, 1, 1}, + {&__pyx_n_s_get_current_thread_id, __pyx_k_get_current_thread_id, sizeof(__pyx_k_get_current_thread_id), 0, 0, 1, 1}, + {&__pyx_n_s_get_exception_breakpoint, __pyx_k_get_exception_breakpoint, sizeof(__pyx_k_get_exception_breakpoint), 0, 0, 1, 1}, + {&__pyx_n_s_get_file_type, __pyx_k_get_file_type, sizeof(__pyx_k_get_file_type), 0, 0, 1, 1}, + {&__pyx_n_s_get_global_debugger, __pyx_k_get_global_debugger, sizeof(__pyx_k_get_global_debugger), 0, 0, 1, 1}, + {&__pyx_n_s_get_internal_queue_and_event, __pyx_k_get_internal_queue_and_event, sizeof(__pyx_k_get_internal_queue_and_event), 0, 0, 1, 1}, + {&__pyx_n_s_get_method_object, __pyx_k_get_method_object, sizeof(__pyx_k_get_method_object), 0, 0, 1, 1}, + {&__pyx_n_s_get_related_thread, __pyx_k_get_related_thread, sizeof(__pyx_k_get_related_thread), 0, 0, 1, 1}, + {&__pyx_n_s_get_smart_step_into_variant_from, __pyx_k_get_smart_step_into_variant_from, sizeof(__pyx_k_get_smart_step_into_variant_from), 0, 0, 1, 1}, + {&__pyx_n_s_get_thread_id, __pyx_k_get_thread_id, sizeof(__pyx_k_get_thread_id), 0, 0, 1, 1}, + {&__pyx_n_s_get_topmost_frame, __pyx_k_get_topmost_frame, sizeof(__pyx_k_get_topmost_frame), 0, 0, 1, 1}, + {&__pyx_n_s_get_trace_dispatch_func, __pyx_k_get_trace_dispatch_func, sizeof(__pyx_k_get_trace_dispatch_func), 0, 0, 1, 1}, + {&__pyx_n_s_getline, __pyx_k_getline, sizeof(__pyx_k_getline), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_n_s_global_cache_frame_skips, __pyx_k_global_cache_frame_skips, sizeof(__pyx_k_global_cache_frame_skips), 0, 0, 1, 1}, + {&__pyx_n_s_global_cache_skips, __pyx_k_global_cache_skips, sizeof(__pyx_k_global_cache_skips), 0, 0, 1, 1}, + {&__pyx_n_s_global_notify_skipped_step_in_l, __pyx_k_global_notify_skipped_step_in_l, sizeof(__pyx_k_global_notify_skipped_step_in_l), 0, 0, 1, 1}, + {&__pyx_n_s_handle_breakpoint_condition, __pyx_k_handle_breakpoint_condition, sizeof(__pyx_k_handle_breakpoint_condition), 0, 0, 1, 1}, + {&__pyx_n_s_handle_breakpoint_expression, __pyx_k_handle_breakpoint_expression, sizeof(__pyx_k_handle_breakpoint_expression), 0, 0, 1, 1}, + {&__pyx_n_s_handle_exception, __pyx_k_handle_exception, sizeof(__pyx_k_handle_exception), 0, 0, 1, 1}, + {&__pyx_n_s_handle_user_exception, __pyx_k_handle_user_exception, sizeof(__pyx_k_handle_user_exception), 0, 0, 1, 1}, + {&__pyx_n_s_has_condition, __pyx_k_has_condition, sizeof(__pyx_k_has_condition), 0, 0, 1, 1}, + {&__pyx_n_s_has_plugin_exception_breaks, __pyx_k_has_plugin_exception_breaks, sizeof(__pyx_k_has_plugin_exception_breaks), 0, 0, 1, 1}, + {&__pyx_n_s_has_plugin_line_breaks, __pyx_k_has_plugin_line_breaks, sizeof(__pyx_k_has_plugin_line_breaks), 0, 0, 1, 1}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_ident, __pyx_k_ident, sizeof(__pyx_k_ident), 0, 0, 1, 1}, + {&__pyx_n_s_ident_2, __pyx_k_ident_2, sizeof(__pyx_k_ident_2), 0, 0, 1, 1}, + {&__pyx_n_s_ignore_exception_trace, __pyx_k_ignore_exception_trace, sizeof(__pyx_k_ignore_exception_trace), 0, 0, 1, 1}, + {&__pyx_n_s_ignore_exceptions_thrown_in_line, __pyx_k_ignore_exceptions_thrown_in_line, sizeof(__pyx_k_ignore_exceptions_thrown_in_line), 0, 0, 1, 1}, + {&__pyx_n_s_ignore_system_exit_code, __pyx_k_ignore_system_exit_code, sizeof(__pyx_k_ignore_system_exit_code), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_in_project_scope, __pyx_k_in_project_scope, sizeof(__pyx_k_in_project_scope), 0, 0, 1, 1}, + {&__pyx_n_s_info, __pyx_k_info, sizeof(__pyx_k_info), 0, 0, 1, 1}, + {&__pyx_n_s_initial_trace_obj, __pyx_k_initial_trace_obj, sizeof(__pyx_k_initial_trace_obj), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_kp_s_invalid, __pyx_k_invalid, sizeof(__pyx_k_invalid), 0, 0, 1, 0}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_n_s_is_files_filter_enabled, __pyx_k_is_files_filter_enabled, sizeof(__pyx_k_is_files_filter_enabled), 0, 0, 1, 1}, + {&__pyx_n_s_is_line_in_except_block, __pyx_k_is_line_in_except_block, sizeof(__pyx_k_is_line_in_except_block), 0, 0, 1, 1}, + {&__pyx_n_s_is_line_in_try_block, __pyx_k_is_line_in_try_block, sizeof(__pyx_k_is_line_in_try_block), 0, 0, 1, 1}, + {&__pyx_n_s_is_logpoint, __pyx_k_is_logpoint, sizeof(__pyx_k_is_logpoint), 0, 0, 1, 1}, + {&__pyx_n_s_is_stepping, __pyx_k_is_stepping, sizeof(__pyx_k_is_stepping), 0, 0, 1, 1}, + {&__pyx_n_s_is_thread_alive, __pyx_k_is_thread_alive, sizeof(__pyx_k_is_thread_alive), 0, 0, 1, 1}, + {&__pyx_n_s_is_unhandled_exception, __pyx_k_is_unhandled_exception, sizeof(__pyx_k_is_unhandled_exception), 0, 0, 1, 1}, + {&__pyx_n_s_is_unwind, __pyx_k_is_unwind, sizeof(__pyx_k_is_unwind), 0, 0, 1, 1}, + {&__pyx_n_s_is_user_uncaught, __pyx_k_is_user_uncaught, sizeof(__pyx_k_is_user_uncaught), 0, 0, 1, 1}, + {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, + {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, + {&__pyx_n_s_just_raised, __pyx_k_just_raised, sizeof(__pyx_k_just_raised), 0, 0, 1, 1}, + {&__pyx_n_s_kwargs, __pyx_k_kwargs, sizeof(__pyx_k_kwargs), 0, 0, 1, 1}, + {&__pyx_kp_s_lambda, __pyx_k_lambda, sizeof(__pyx_k_lambda), 0, 0, 1, 0}, + {&__pyx_n_s_last_raise_line, __pyx_k_last_raise_line, sizeof(__pyx_k_last_raise_line), 0, 0, 1, 1}, + {&__pyx_n_s_last_stat, __pyx_k_last_stat, sizeof(__pyx_k_last_stat), 0, 0, 1, 1}, + {&__pyx_n_s_line, __pyx_k_line, sizeof(__pyx_k_line), 0, 0, 1, 1}, + {&__pyx_n_s_linecache, __pyx_k_linecache, sizeof(__pyx_k_linecache), 0, 0, 1, 1}, + {&__pyx_n_s_lines, __pyx_k_lines, sizeof(__pyx_k_lines), 0, 0, 1, 1}, + {&__pyx_n_s_lines_ignored, __pyx_k_lines_ignored, sizeof(__pyx_k_lines_ignored), 0, 0, 1, 1}, + {&__pyx_n_s_linesep, __pyx_k_linesep, sizeof(__pyx_k_linesep), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_main_2, __pyx_k_main_2, sizeof(__pyx_k_main_2), 0, 0, 1, 1}, + {&__pyx_n_s_make_console_message, __pyx_k_make_console_message, sizeof(__pyx_k_make_console_message), 0, 0, 1, 1}, + {&__pyx_n_s_make_io_message, __pyx_k_make_io_message, sizeof(__pyx_k_make_io_message), 0, 0, 1, 1}, + {&__pyx_n_s_match, __pyx_k_match, sizeof(__pyx_k_match), 0, 0, 1, 1}, + {&__pyx_n_s_maybe_user_uncaught_exc_info, __pyx_k_maybe_user_uncaught_exc_info, sizeof(__pyx_k_maybe_user_uncaught_exc_info), 0, 0, 1, 1}, + {&__pyx_n_s_merged, __pyx_k_merged, sizeof(__pyx_k_merged), 0, 0, 1, 1}, + {&__pyx_n_s_method_object, __pyx_k_method_object, sizeof(__pyx_k_method_object), 0, 0, 1, 1}, + {&__pyx_kp_s_module, __pyx_k_module, sizeof(__pyx_k_module), 0, 0, 1, 0}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_n_s_next_additional_info, __pyx_k_next_additional_info, sizeof(__pyx_k_next_additional_info), 0, 0, 1, 1}, + {&__pyx_n_s_notify_on_first_raise_only, __pyx_k_notify_on_first_raise_only, sizeof(__pyx_k_notify_on_first_raise_only), 0, 0, 1, 1}, + {&__pyx_n_s_notify_skipped_step_in_because_o, __pyx_k_notify_skipped_step_in_because_o, sizeof(__pyx_k_notify_skipped_step_in_because_o), 0, 0, 1, 1}, + {&__pyx_n_s_notify_thread_not_alive, __pyx_k_notify_thread_not_alive, sizeof(__pyx_k_notify_thread_not_alive), 0, 0, 1, 1}, + {&__pyx_n_s_original_call, __pyx_k_original_call, sizeof(__pyx_k_original_call), 0, 0, 1, 1}, + {&__pyx_n_s_original_step_cmd, __pyx_k_original_step_cmd, sizeof(__pyx_k_original_step_cmd), 0, 0, 1, 1}, + {&__pyx_n_s_os, __pyx_k_os, sizeof(__pyx_k_os), 0, 0, 1, 1}, + {&__pyx_n_s_os_path, __pyx_k_os_path, sizeof(__pyx_k_os_path), 0, 0, 1, 1}, + {&__pyx_n_s_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_plugin, __pyx_k_plugin, sizeof(__pyx_k_plugin), 0, 0, 1, 1}, + {&__pyx_n_s_pop, __pyx_k_pop, sizeof(__pyx_k_pop), 0, 0, 1, 1}, + {&__pyx_n_s_prev_user_uncaught_exc_info, __pyx_k_prev_user_uncaught_exc_info, sizeof(__pyx_k_prev_user_uncaught_exc_info), 0, 0, 1, 1}, + {&__pyx_n_s_py_db, __pyx_k_py_db, sizeof(__pyx_k_py_db), 0, 0, 1, 1}, + {&__pyx_kp_s_pyc, __pyx_k_pyc, sizeof(__pyx_k_pyc), 0, 0, 1, 0}, + {&__pyx_n_s_pydb_disposed, __pyx_k_pydb_disposed, sizeof(__pyx_k_pydb_disposed), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_bundle, __pyx_k_pydev_bundle, sizeof(__pyx_k_pydev_bundle), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_bundle__pydev_saved_modul, __pyx_k_pydev_bundle__pydev_saved_modul, sizeof(__pyx_k_pydev_bundle__pydev_saved_modul), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_bundle_pydev_is_thread_al, __pyx_k_pydev_bundle_pydev_is_thread_al, sizeof(__pyx_k_pydev_bundle_pydev_is_thread_al), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_bundle_pydev_log, __pyx_k_pydev_bundle_pydev_log, sizeof(__pyx_k_pydev_bundle_pydev_log), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_do_not_trace, __pyx_k_pydev_do_not_trace, sizeof(__pyx_k_pydev_do_not_trace), 0, 0, 1, 1}, + {&__pyx_kp_s_pydev_execfile_py, __pyx_k_pydev_execfile_py, sizeof(__pyx_k_pydev_execfile_py), 0, 0, 1, 0}, + {&__pyx_n_s_pydev_log, __pyx_k_pydev_log, sizeof(__pyx_k_pydev_log), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_log_exception, __pyx_k_pydev_log_exception, sizeof(__pyx_k_pydev_log_exception), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_monkey, __pyx_k_pydev_monkey, sizeof(__pyx_k_pydev_monkey), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd, __pyx_k_pydevd, sizeof(__pyx_k_pydevd), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle, __pyx_k_pydevd_bundle, sizeof(__pyx_k_pydevd_bundle), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle_pydevd_bytecode_u, __pyx_k_pydevd_bundle_pydevd_bytecode_u, sizeof(__pyx_k_pydevd_bundle_pydevd_bytecode_u), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle_pydevd_comm_const, __pyx_k_pydevd_bundle_pydevd_comm_const, sizeof(__pyx_k_pydevd_bundle_pydevd_comm_const), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle_pydevd_constants, __pyx_k_pydevd_bundle_pydevd_constants, sizeof(__pyx_k_pydevd_bundle_pydevd_constants), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_k_pydevd_bundle_pydevd_cython, sizeof(__pyx_k_pydevd_bundle_pydevd_cython), 0, 0, 1, 1}, + {&__pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_k_pydevd_bundle_pydevd_cython_pyx, sizeof(__pyx_k_pydevd_bundle_pydevd_cython_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_pydevd_bundle_pydevd_frame_util, __pyx_k_pydevd_bundle_pydevd_frame_util, sizeof(__pyx_k_pydevd_bundle_pydevd_frame_util), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle_pydevd_utils, __pyx_k_pydevd_bundle_pydevd_utils, sizeof(__pyx_k_pydevd_bundle_pydevd_utils), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_dont_trace, __pyx_k_pydevd_dont_trace, sizeof(__pyx_k_pydevd_dont_trace), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_file_utils, __pyx_k_pydevd_file_utils, sizeof(__pyx_k_pydevd_file_utils), 0, 0, 1, 1}, + {&__pyx_kp_s_pydevd_py, __pyx_k_pydevd_py, sizeof(__pyx_k_pydevd_py), 0, 0, 1, 0}, + {&__pyx_kp_s_pydevd_traceproperty_py, __pyx_k_pydevd_traceproperty_py, sizeof(__pyx_k_pydevd_traceproperty_py), 0, 0, 1, 0}, + {&__pyx_n_s_pydevd_tracing, __pyx_k_pydevd_tracing, sizeof(__pyx_k_pydevd_tracing), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_PyDBAdditionalThr, __pyx_k_pyx_unpickle_PyDBAdditionalThr, sizeof(__pyx_k_pyx_unpickle_PyDBAdditionalThr), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_PyDBFrame, __pyx_k_pyx_unpickle_PyDBFrame, sizeof(__pyx_k_pyx_unpickle_PyDBFrame), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_SafeCallWrapper, __pyx_k_pyx_unpickle_SafeCallWrapper, sizeof(__pyx_k_pyx_unpickle_SafeCallWrapper), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_ThreadTracer, __pyx_k_pyx_unpickle_ThreadTracer, sizeof(__pyx_k_pyx_unpickle_ThreadTracer), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_TopLevelThreadTra, __pyx_k_pyx_unpickle_TopLevelThreadTra, sizeof(__pyx_k_pyx_unpickle_TopLevelThreadTra), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_TopLevelThreadTra_2, __pyx_k_pyx_unpickle_TopLevelThreadTra_2, sizeof(__pyx_k_pyx_unpickle_TopLevelThreadTra_2), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle__TryExceptContain, __pyx_k_pyx_unpickle__TryExceptContain, sizeof(__pyx_k_pyx_unpickle__TryExceptContain), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_qname, __pyx_k_qname, sizeof(__pyx_k_qname), 0, 0, 1, 1}, + {&__pyx_n_s_quitting, __pyx_k_quitting, sizeof(__pyx_k_quitting), 0, 0, 1, 1}, + {&__pyx_n_s_raise_lines, __pyx_k_raise_lines, sizeof(__pyx_k_raise_lines), 0, 0, 1, 1}, + {&__pyx_n_s_raise_lines_in_except, __pyx_k_raise_lines_in_except, sizeof(__pyx_k_raise_lines_in_except), 0, 0, 1, 1}, + {&__pyx_n_s_re, __pyx_k_re, sizeof(__pyx_k_re), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_ref, __pyx_k_ref, sizeof(__pyx_k_ref), 0, 0, 1, 1}, + {&__pyx_n_s_remove_additional_info, __pyx_k_remove_additional_info, sizeof(__pyx_k_remove_additional_info), 0, 0, 1, 1}, + {&__pyx_n_s_remove_exception_from_frame, __pyx_k_remove_exception_from_frame, sizeof(__pyx_k_remove_exception_from_frame), 0, 0, 1, 1}, + {&__pyx_n_s_remove_return_values_flag, __pyx_k_remove_return_values_flag, sizeof(__pyx_k_remove_return_values_flag), 0, 0, 1, 1}, + {&__pyx_n_s_result, __pyx_k_result, sizeof(__pyx_k_result), 0, 0, 1, 1}, + {&__pyx_n_s_ret, __pyx_k_ret, sizeof(__pyx_k_ret), 0, 0, 1, 1}, + {&__pyx_n_s_return, __pyx_k_return, sizeof(__pyx_k_return), 0, 0, 1, 1}, + {&__pyx_n_s_return_line, __pyx_k_return_line, sizeof(__pyx_k_return_line), 0, 0, 1, 1}, + {&__pyx_n_s_returns, __pyx_k_returns, sizeof(__pyx_k_returns), 0, 0, 1, 1}, + {&__pyx_n_s_rfind, __pyx_k_rfind, sizeof(__pyx_k_rfind), 0, 0, 1, 1}, + {&__pyx_n_s_run, __pyx_k_run, sizeof(__pyx_k_run), 0, 0, 1, 1}, + {&__pyx_kp_s_s_raised_from_within_the_callba, __pyx_k_s_raised_from_within_the_callba, sizeof(__pyx_k_s_raised_from_within_the_callba), 0, 0, 1, 0}, + {&__pyx_kp_s_s_s, __pyx_k_s_s, sizeof(__pyx_k_s_s), 0, 0, 1, 0}, + {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1}, + {&__pyx_n_s_send_caught_exception_stack, __pyx_k_send_caught_exception_stack, sizeof(__pyx_k_send_caught_exception_stack), 0, 0, 1, 1}, + {&__pyx_n_s_send_caught_exception_stack_proc, __pyx_k_send_caught_exception_stack_proc, sizeof(__pyx_k_send_caught_exception_stack_proc), 0, 0, 1, 1}, + {&__pyx_n_s_set, __pyx_k_set, sizeof(__pyx_k_set), 0, 0, 1, 1}, + {&__pyx_n_s_set_additional_thread_info, __pyx_k_set_additional_thread_info, sizeof(__pyx_k_set_additional_thread_info), 0, 0, 1, 1}, + {&__pyx_n_s_set_additional_thread_info_lock, __pyx_k_set_additional_thread_info_lock, sizeof(__pyx_k_set_additional_thread_info_lock), 0, 0, 1, 1}, + {&__pyx_n_s_set_suspend, __pyx_k_set_suspend, sizeof(__pyx_k_set_suspend), 0, 0, 1, 1}, + {&__pyx_n_s_set_trace_for_frame_and_parents, __pyx_k_set_trace_for_frame_and_parents, sizeof(__pyx_k_set_trace_for_frame_and_parents), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_should_stop, __pyx_k_should_stop, sizeof(__pyx_k_should_stop), 0, 0, 1, 1}, + {&__pyx_n_s_should_stop_on_exception, __pyx_k_should_stop_on_exception, sizeof(__pyx_k_should_stop_on_exception), 0, 0, 1, 1}, + {&__pyx_n_s_should_trace_hook, __pyx_k_should_trace_hook, sizeof(__pyx_k_should_trace_hook), 0, 0, 1, 1}, + {&__pyx_n_s_show_return_values, __pyx_k_show_return_values, sizeof(__pyx_k_show_return_values), 0, 0, 1, 1}, + {&__pyx_n_s_skip_on_exceptions_thrown_in_sam, __pyx_k_skip_on_exceptions_thrown_in_sam, sizeof(__pyx_k_skip_on_exceptions_thrown_in_sam), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_st_mtime, __pyx_k_st_mtime, sizeof(__pyx_k_st_mtime), 0, 0, 1, 1}, + {&__pyx_n_s_st_size, __pyx_k_st_size, sizeof(__pyx_k_st_size), 0, 0, 1, 1}, + {&__pyx_n_s_startswith, __pyx_k_startswith, sizeof(__pyx_k_startswith), 0, 0, 1, 1}, + {&__pyx_n_s_stat, __pyx_k_stat, sizeof(__pyx_k_stat), 0, 0, 1, 1}, + {&__pyx_n_s_state, __pyx_k_state, sizeof(__pyx_k_state), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_n_s_stop_on_unhandled_exception, __pyx_k_stop_on_unhandled_exception, sizeof(__pyx_k_stop_on_unhandled_exception), 0, 0, 1, 1}, + {&__pyx_n_s_stopped, __pyx_k_stopped, sizeof(__pyx_k_stopped), 0, 0, 1, 1}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_suspend, __pyx_k_suspend, sizeof(__pyx_k_suspend), 0, 0, 1, 1}, + {&__pyx_n_s_suspend_other_threads, __pyx_k_suspend_other_threads, sizeof(__pyx_k_suspend_other_threads), 0, 0, 1, 1}, + {&__pyx_n_s_suspend_policy, __pyx_k_suspend_policy, sizeof(__pyx_k_suspend_policy), 0, 0, 1, 1}, + {&__pyx_n_s_suspended_at_unhandled, __pyx_k_suspended_at_unhandled, sizeof(__pyx_k_suspended_at_unhandled), 0, 0, 1, 1}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_t, __pyx_k_t, sizeof(__pyx_k_t), 0, 0, 1, 1}, + {&__pyx_n_s_tb_frame, __pyx_k_tb_frame, sizeof(__pyx_k_tb_frame), 0, 0, 1, 1}, + {&__pyx_n_s_tb_lineno, __pyx_k_tb_lineno, sizeof(__pyx_k_tb_lineno), 0, 0, 1, 1}, + {&__pyx_n_s_tb_next, __pyx_k_tb_next, sizeof(__pyx_k_tb_next), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_thread, __pyx_k_thread, sizeof(__pyx_k_thread), 0, 0, 1, 1}, + {&__pyx_kp_s_thread__ident_is_None_in__get_re, __pyx_k_thread__ident_is_None_in__get_re, sizeof(__pyx_k_thread__ident_is_None_in__get_re), 0, 0, 1, 0}, + {&__pyx_n_s_thread_trace_func, __pyx_k_thread_trace_func, sizeof(__pyx_k_thread_trace_func), 0, 0, 1, 1}, + {&__pyx_n_s_thread_tracer, __pyx_k_thread_tracer, sizeof(__pyx_k_thread_tracer), 0, 0, 1, 1}, + {&__pyx_n_s_threading, __pyx_k_threading, sizeof(__pyx_k_threading), 0, 0, 1, 1}, + {&__pyx_n_s_threading_active, __pyx_k_threading_active, sizeof(__pyx_k_threading_active), 0, 0, 1, 1}, + {&__pyx_n_s_threading_current_thread, __pyx_k_threading_current_thread, sizeof(__pyx_k_threading_current_thread), 0, 0, 1, 1}, + {&__pyx_n_s_threading_get_ident, __pyx_k_threading_get_ident, sizeof(__pyx_k_threading_get_ident), 0, 0, 1, 1}, + {&__pyx_n_s_top_level_thread_tracer, __pyx_k_top_level_thread_tracer, sizeof(__pyx_k_top_level_thread_tracer), 0, 0, 1, 1}, + {&__pyx_n_s_top_level_thread_tracer_no_back, __pyx_k_top_level_thread_tracer_no_back, sizeof(__pyx_k_top_level_thread_tracer_no_back), 0, 0, 1, 1}, + {&__pyx_n_s_top_level_thread_tracer_unhandle, __pyx_k_top_level_thread_tracer_unhandle, sizeof(__pyx_k_top_level_thread_tracer_unhandle), 0, 0, 1, 1}, + {&__pyx_n_s_trace, __pyx_k_trace, sizeof(__pyx_k_trace), 0, 0, 1, 1}, + {&__pyx_n_s_trace_dispatch, __pyx_k_trace_dispatch, sizeof(__pyx_k_trace_dispatch), 0, 0, 1, 1}, + {&__pyx_n_s_trace_dispatch_and_unhandled_exc, __pyx_k_trace_dispatch_and_unhandled_exc, sizeof(__pyx_k_trace_dispatch_and_unhandled_exc), 0, 0, 1, 1}, + {&__pyx_n_s_trace_exception, __pyx_k_trace_exception, sizeof(__pyx_k_trace_exception), 0, 0, 1, 1}, + {&__pyx_n_s_trace_obj, __pyx_k_trace_obj, sizeof(__pyx_k_trace_obj), 0, 0, 1, 1}, + {&__pyx_n_s_trace_unhandled_exceptions, __pyx_k_trace_unhandled_exceptions, sizeof(__pyx_k_trace_unhandled_exceptions), 0, 0, 1, 1}, + {&__pyx_n_s_try_exc_info, __pyx_k_try_exc_info, sizeof(__pyx_k_try_exc_info), 0, 0, 1, 1}, + {&__pyx_n_s_try_except_info, __pyx_k_try_except_info, sizeof(__pyx_k_try_except_info), 0, 0, 1, 1}, + {&__pyx_n_s_try_except_infos, __pyx_k_try_except_infos, sizeof(__pyx_k_try_except_infos), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_update_stepping_info, __pyx_k_update_stepping_info, sizeof(__pyx_k_update_stepping_info), 0, 0, 1, 1}, + {&__pyx_n_s_use_setstate, __pyx_k_use_setstate, sizeof(__pyx_k_use_setstate), 0, 0, 1, 1}, + {&__pyx_kp_s_utf_8, __pyx_k_utf_8, sizeof(__pyx_k_utf_8), 0, 0, 1, 0}, + {&__pyx_n_s_valid_try_except_infos, __pyx_k_valid_try_except_infos, sizeof(__pyx_k_valid_try_except_infos), 0, 0, 1, 1}, + {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1}, + {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1}, + {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1}, + {&__pyx_n_s_was_just_raised, __pyx_k_was_just_raised, sizeof(__pyx_k_was_just_raised), 0, 0, 1, 1}, + {&__pyx_n_s_weak_thread, __pyx_k_weak_thread, sizeof(__pyx_k_weak_thread), 0, 0, 1, 1}, + {&__pyx_n_s_weakref, __pyx_k_weakref, sizeof(__pyx_k_weakref), 0, 0, 1, 1}, + {&__pyx_n_s_writer, __pyx_k_writer, sizeof(__pyx_k_writer), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(0, 357, __pyx_L1_error) + __pyx_builtin_NameError = __Pyx_GetBuiltinName(__pyx_n_s_NameError); if (!__pyx_builtin_NameError) __PYX_ERR(0, 390, __pyx_L1_error) + __pyx_builtin_StopIteration = __Pyx_GetBuiltinName(__pyx_n_s_StopIteration); if (!__pyx_builtin_StopIteration) __PYX_ERR(0, 391, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(0, 197, __pyx_L1_error) + __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 231, __pyx_L1_error) + __pyx_builtin_KeyboardInterrupt = __Pyx_GetBuiltinName(__pyx_n_s_KeyboardInterrupt); if (!__pyx_builtin_KeyboardInterrupt) __PYX_ERR(0, 1109, __pyx_L1_error) + __pyx_builtin_SystemExit = __Pyx_GetBuiltinName(__pyx_n_s_SystemExit); if (!__pyx_builtin_SystemExit) __PYX_ERR(0, 1109, __pyx_L1_error) + __pyx_builtin_GeneratorExit = __Pyx_GetBuiltinName(__pyx_n_s_GeneratorExit); if (!__pyx_builtin_GeneratorExit) __PYX_ERR(0, 1410, __pyx_L1_error) + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(0, 2173, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "_pydevd_bundle/pydevd_cython.pyx":250 + * additional_info.weak_thread = weakref.ref(thread) + * add_additional_info(additional_info) + * del _next_additional_info[:] # <<<<<<<<<<<<<< + * _next_additional_info.append(PyDBAdditionalThreadInfo()) + * + */ + __pyx_slice__2 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__2)) __PYX_ERR(0, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__2); + __Pyx_GIVEREF(__pyx_slice__2); + + /* "_pydevd_bundle/pydevd_cython.pyx":233 + * raise AttributeError() + * except: + * with _set_additional_thread_info_lock: # <<<<<<<<<<<<<< + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + */ + __pyx_tuple__3 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "_pydevd_bundle/pydevd_cython.pyx":1109 + * ) + * py_db.writer.add_command(cmd) + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): # <<<<<<<<<<<<<< + * pydev_log.exception() + * + */ + __pyx_tuple__5 = PyTuple_Pack(2, __pyx_builtin_KeyboardInterrupt, __pyx_builtin_SystemExit); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 1109, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "_pydevd_bundle/pydevd_cython.pyx":1151 + * filename = frame.f_code.co_filename + * if filename.endswith(".pyc"): + * filename = filename[:-1] # <<<<<<<<<<<<<< + * + * if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): + */ + __pyx_slice__6 = PySlice_New(Py_None, __pyx_int_neg_1, Py_None); if (unlikely(!__pyx_slice__6)) __PYX_ERR(0, 1151, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__6); + __Pyx_GIVEREF(__pyx_slice__6); + + /* "_pydevd_bundle/pydevd_cython.pyx":1366 + * ) + * py_db.writer.add_command(cmd) + * if not issubclass(exc, (KeyboardInterrupt, SystemExit)): # <<<<<<<<<<<<<< + * pydev_log.exception() + * raise + */ + __pyx_tuple__7 = PyTuple_Pack(2, __pyx_builtin_KeyboardInterrupt, __pyx_builtin_SystemExit); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 1366, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + + /* "_pydevd_bundle/pydevd_cython.pyx":1746 + * if f_unhandled.f_code.co_name in ("__bootstrap", "_bootstrap"): + * # We need __bootstrap_inner, not __bootstrap. + * return None, False # <<<<<<<<<<<<<< + * + * elif f_unhandled.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner"): + */ + __pyx_tuple__11 = PyTuple_Pack(2, Py_None, Py_False); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 1746, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + + /* "_pydevd_bundle/pydevd_cython.pyx":2173 + * + * def fix_top_level_trace_and_get_trace_func(*args, **kwargs): + * raise RuntimeError("Not used in sys.monitoring mode.") # <<<<<<<<<<<<<< + */ + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_Not_used_in_sys_monitoring_mode); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 2173, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xd33aa14, 0x024feed, 0x4342dfb): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xd33aa14, 0x024feed, 0x4342dfb) = (conditional_breakpoint_exception, is_in_wait_loop, is_tracing, pydev_call_from_jinja2, pydev_call_inside_jinja2, pydev_django_resolve_frame, pydev_func_name, pydev_message, pydev_next_line, pydev_notify_kill, pydev_original_step_cmd, pydev_smart_child_offset, pydev_smart_parent_offset, pydev_smart_step_into_variants, pydev_smart_step_stop, pydev_state, pydev_step_cmd, pydev_step_stop, pydev_use_scoped_step_frame, step_in_initial_location, suspend_type, suspended_at_unhandled, target_id_to_smart_step_into_variant, thread_tracer, top_level_thread_tracer_no_back_frames, top_level_thread_tracer_unhandled, trace_suspend_type, weak_thread))" % __pyx_checksum + */ + __pyx_tuple__13 = PyTuple_Pack(3, __pyx_int_221489684, __pyx_int_2424557, __pyx_int_70528507); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_tuple__14 = PyTuple_Pack(3, __pyx_int_230645316, __pyx_int_232881363, __pyx_int_210464433); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + __pyx_tuple__15 = PyTuple_Pack(3, __pyx_int_61391470, __pyx_int_192493205, __pyx_int_84338306); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + __pyx_tuple__16 = PyTuple_Pack(3, __pyx_int_169093275, __pyx_int_63705258, __pyx_int_125568891); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_tuple__17 = PyTuple_Pack(3, __pyx_int_18997755, __pyx_int_255484337, __pyx_int_64458794); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + __pyx_tuple__18 = PyTuple_Pack(3, __pyx_int_66451433, __pyx_int_16751766, __pyx_int_171613889); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "_pydevd_bundle/pydevd_cython.pyx":130 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef object _get_related_thread(self): # <<<<<<<<<<<<<< + * # ELSE + * # def _get_related_thread(self): + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_get_related_thread, 130, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) __PYX_ERR(0, 130, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":159 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef bint _is_stepping(self): # <<<<<<<<<<<<<< + * # ELSE + * # def _is_stepping(self): + */ + __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_is_stepping, 159, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(0, 159, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":177 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef get_topmost_frame(self, thread): # <<<<<<<<<<<<<< + * # ELSE + * # def get_topmost_frame(self, thread): + */ + __pyx_tuple__23 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_thread); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_get_topmost_frame, 177, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 177, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":206 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef update_stepping_info(self): # <<<<<<<<<<<<<< + * # ELSE + * # def update_stepping_info(self): + */ + __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_update_stepping_info, 206, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(0, 206, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_tuple__26 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_state, __pyx_n_s_dict_2, __pyx_n_s_use_setstate); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(2, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(self, __pyx_state) + */ + __pyx_tuple__28 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_pyx_state); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); + __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(2, 16, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":223 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef set_additional_thread_info(thread): # <<<<<<<<<<<<<< + * # ELSE + * # def set_additional_thread_info(thread): + */ + __pyx_tuple__30 = PyTuple_Pack(1, __pyx_n_s_thread); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 223, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__30); + __Pyx_GIVEREF(__pyx_tuple__30); + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_set_additional_thread_info, 223, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 223, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":305 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef add_additional_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def add_additional_info(info): + */ + __pyx_tuple__32 = PyTuple_Pack(1, __pyx_n_s_info); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__32); + __Pyx_GIVEREF(__pyx_tuple__32); + __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_add_additional_info, 305, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 305, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":317 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef remove_additional_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def remove_additional_info(info): + */ + __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_remove_additional_info, 317, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 317, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":329 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef bint any_thread_stepping(): # <<<<<<<<<<<<<< + * # ELSE + * # def any_thread_stepping(): + */ + __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_any_thread_stepping, 329, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(0, 329, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":336 + * return bool(_infos_stepping) + * import linecache + * import os.path # <<<<<<<<<<<<<< + * import re + * + */ + __pyx_tuple__36 = PyTuple_Pack(2, __pyx_n_s_os, __pyx_n_s_path); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 336, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__36); + __Pyx_GIVEREF(__pyx_tuple__36); + + /* "_pydevd_bundle/pydevd_cython.pyx":359 + * except ImportError: + * + * def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_tuple__37 = PyTuple_Pack(2, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 359, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__37); + __Pyx_GIVEREF(__pyx_tuple__37); + __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__37, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_get_smart_step_into_variant_from, 359, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) __PYX_ERR(0, 359, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":381 + * basename = os.path.basename + * + * IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") # <<<<<<<<<<<<<< + * DEBUG_START = ("pydevd.py", "run") + * DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") + */ + __pyx_tuple__39 = PyTuple_Pack(1, __pyx_kp_s_IgnoreException); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 381, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__39); + __Pyx_GIVEREF(__pyx_tuple__39); + + /* "_pydevd_bundle/pydevd_cython.pyx":382 + * + * IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") + * DEBUG_START = ("pydevd.py", "run") # <<<<<<<<<<<<<< + * DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") + * TRACE_PROPERTY = "pydevd_traceproperty.py" + */ + __pyx_tuple__40 = PyTuple_Pack(2, __pyx_kp_s_pydevd_py, __pyx_n_s_run); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 382, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__40); + __Pyx_GIVEREF(__pyx_tuple__40); + + /* "_pydevd_bundle/pydevd_cython.pyx":383 + * IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") + * DEBUG_START = ("pydevd.py", "run") + * DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") # <<<<<<<<<<<<<< + * TRACE_PROPERTY = "pydevd_traceproperty.py" + * + */ + __pyx_tuple__41 = PyTuple_Pack(2, __pyx_kp_s_pydev_execfile_py, __pyx_n_s_execfile); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__41); + __Pyx_GIVEREF(__pyx_tuple__41); + + /* "_pydevd_bundle/pydevd_cython.pyx":395 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def is_unhandled_exception(container_obj, py_db, frame, int last_raise_line, set raise_lines): # <<<<<<<<<<<<<< + * # ELSE + * # def is_unhandled_exception(container_obj, py_db, frame, last_raise_line, raise_lines): + */ + __pyx_tuple__42 = PyTuple_Pack(8, __pyx_n_s_container_obj, __pyx_n_s_py_db, __pyx_n_s_frame, __pyx_n_s_last_raise_line, __pyx_n_s_raise_lines, __pyx_n_s_try_except_infos, __pyx_n_s_valid_try_except_infos, __pyx_n_s_try_except_info); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(0, 395, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__42); + __Pyx_GIVEREF(__pyx_tuple__42); + __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__42, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_is_unhandled_exception, 395, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(0, 395, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(2, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__TryExceptContainerObj__set_state(self, __pyx_state) + */ + __pyx_codeobj__45 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__45)) __PYX_ERR(2, 16, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":490 + * # ENDIF + * + * def set_suspend(self, *args, **kwargs): # <<<<<<<<<<<<<< + * self._args[0].set_suspend(*args, **kwargs) + * + */ + __pyx_tuple__46 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(0, 490, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__46); + __Pyx_GIVEREF(__pyx_tuple__46); + __pyx_codeobj__47 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__46, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_set_suspend, 490, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__47)) __PYX_ERR(0, 490, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":493 + * self._args[0].set_suspend(*args, **kwargs) + * + * def do_wait_suspend(self, *args, **kwargs): # <<<<<<<<<<<<<< + * self._args[0].do_wait_suspend(*args, **kwargs) + * + */ + __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__46, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_do_wait_suspend, 493, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) __PYX_ERR(0, 493, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":497 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def trace_exception(self, frame, str event, arg): # <<<<<<<<<<<<<< + * cdef bint should_stop; + * cdef tuple exc_info; + */ + __pyx_tuple__49 = PyTuple_Pack(10, __pyx_n_s_self, __pyx_n_s_frame, __pyx_n_s_event, __pyx_n_s_arg, __pyx_n_s_should_stop, __pyx_n_s_exc_info, __pyx_n_s_frame_skips_cache, __pyx_n_s_frame_cache_key, __pyx_n_s_custom_key, __pyx_n_s_container_obj); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(0, 497, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__49); + __Pyx_GIVEREF(__pyx_tuple__49); + __pyx_codeobj__50 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_trace_exception, 497, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__50)) __PYX_ERR(0, 497, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":526 + * return self.trace_exception + * + * def handle_user_exception(self, frame): # <<<<<<<<<<<<<< + * exc_info = self.exc_info + * if exc_info: + */ + __pyx_tuple__51 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_frame, __pyx_n_s_exc_info); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(0, 526, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__51); + __Pyx_GIVEREF(__pyx_tuple__51); + __pyx_codeobj__52 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__51, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_handle_user_exception, 526, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__52)) __PYX_ERR(0, 526, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":634 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef trace_dispatch(self, frame, str event, arg): # <<<<<<<<<<<<<< + * cdef tuple abs_path_canonical_path_and_base; + * cdef bint is_exception_event; + */ + __pyx_tuple__53 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_frame, __pyx_n_s_event, __pyx_n_s_arg); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(0, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__53); + __Pyx_GIVEREF(__pyx_tuple__53); + __pyx_codeobj__54 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__53, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_trace_dispatch, 634, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__54)) __PYX_ERR(0, 634, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__55 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__55)) __PYX_ERR(2, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBFrame__set_state(self, __pyx_state) + */ + __pyx_codeobj__56 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__56)) __PYX_ERR(2, 16, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1377 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def should_stop_on_exception(py_db, PyDBAdditionalThreadInfo info, frame, thread, arg, prev_user_uncaught_exc_info, is_unwind=False): # <<<<<<<<<<<<<< + * cdef bint should_stop; + * cdef bint was_just_raised; + */ + __pyx_tuple__57 = PyTuple_Pack(22, __pyx_n_s_py_db, __pyx_n_s_info, __pyx_n_s_frame, __pyx_n_s_thread, __pyx_n_s_arg, __pyx_n_s_prev_user_uncaught_exc_info, __pyx_n_s_is_unwind, __pyx_n_s_should_stop, __pyx_n_s_was_just_raised, __pyx_n_s_check_excs, __pyx_n_s_maybe_user_uncaught_exc_info, __pyx_n_s_exception, __pyx_n_s_value, __pyx_n_s_trace, __pyx_n_s_exception_breakpoint, __pyx_n_s_result, __pyx_n_s_exc_break_user, __pyx_n_s_exc_break_caught, __pyx_n_s_exc_break, __pyx_n_s_is_user_uncaught, __pyx_n_s_exc_info, __pyx_n_s_lines); if (unlikely(!__pyx_tuple__57)) __PYX_ERR(0, 1377, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__57); + __Pyx_GIVEREF(__pyx_tuple__57); + __pyx_codeobj__58 = (PyObject*)__Pyx_PyCode_New(7, 0, 0, 22, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__57, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_should_stop_on_exception, 1377, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__58)) __PYX_ERR(0, 1377, __pyx_L1_error) + __pyx_tuple__59 = PyTuple_Pack(1, ((PyObject *)Py_False)); if (unlikely(!__pyx_tuple__59)) __PYX_ERR(0, 1377, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__59); + __Pyx_GIVEREF(__pyx_tuple__59); + + /* "_pydevd_bundle/pydevd_cython.pyx":1510 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def handle_exception(py_db, thread, frame, arg, str exception_type): # <<<<<<<<<<<<<< + * cdef bint stopped; + * cdef tuple abs_real_path_and_base; + */ + __pyx_tuple__60 = PyTuple_Pack(21, __pyx_n_s_py_db, __pyx_n_s_thread, __pyx_n_s_frame, __pyx_n_s_arg, __pyx_n_s_exception_type, __pyx_n_s_stopped, __pyx_n_s_abs_real_path_and_base, __pyx_n_s_absolute_filename, __pyx_n_s_canonical_normalized_filename, __pyx_n_s_lines_ignored, __pyx_n_s_frame_id_to_frame, __pyx_n_s_merged, __pyx_n_s_trace_obj, __pyx_n_s_initial_trace_obj, __pyx_n_s_check_trace_obj, __pyx_n_s_curr_stat, __pyx_n_s_last_stat, __pyx_n_s_from_user_input, __pyx_n_s_exc_lineno, __pyx_n_s_line, __pyx_n_s_f); if (unlikely(!__pyx_tuple__60)) __PYX_ERR(0, 1510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__60); + __Pyx_GIVEREF(__pyx_tuple__60); + __pyx_codeobj__61 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 21, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__60, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_handle_exception, 1510, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__61)) __PYX_ERR(0, 1510, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1674 + * + * + * def notify_skipped_step_in_because_of_filters(py_db, frame): # <<<<<<<<<<<<<< + * global _global_notify_skipped_step_in + * + */ + __pyx_tuple__62 = PyTuple_Pack(2, __pyx_n_s_py_db, __pyx_n_s_frame); if (unlikely(!__pyx_tuple__62)) __PYX_ERR(0, 1674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__62); + __Pyx_GIVEREF(__pyx_tuple__62); + __pyx_codeobj__63 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__62, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_notify_skipped_step_in_because_o, 1674, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__63)) __PYX_ERR(0, 1674, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1700 + * Py_XDECREF (method_obj) + * return SafeCallWrapper(ret) if ret is not None else None + * def get_method_object(self): # <<<<<<<<<<<<<< + * return self.method_object + * # ELSE + */ + __pyx_codeobj__64 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_get_method_object, 1700, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__64)) __PYX_ERR(0, 1700, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__65 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__65)) __PYX_ERR(2, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_SafeCallWrapper__set_state(self, __pyx_state) + */ + __pyx_codeobj__66 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__66)) __PYX_ERR(2, 16, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1707 + * + * + * def fix_top_level_trace_and_get_trace_func(py_db, frame): # <<<<<<<<<<<<<< + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + __pyx_tuple__67 = PyTuple_Pack(15, __pyx_n_s_py_db, __pyx_n_s_frame, __pyx_n_s_filename, __pyx_n_s_name_2, __pyx_n_s_args, __pyx_n_s_thread, __pyx_n_s_f_unhandled, __pyx_n_s_force_only_unhandled_tracer, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_t, __pyx_n_s_additional_info, __pyx_n_s_top_level_thread_tracer, __pyx_n_s_f_trace, __pyx_n_s_thread_tracer); if (unlikely(!__pyx_tuple__67)) __PYX_ERR(0, 1707, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__67); + __Pyx_GIVEREF(__pyx_tuple__67); + __pyx_codeobj__68 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 15, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__67, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_fix_top_level_trace_and_get_trac, 1707, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__68)) __PYX_ERR(0, 1707, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1843 + * + * + * def trace_dispatch(py_db, frame, event, arg): # <<<<<<<<<<<<<< + * thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + * if thread_trace_func is None: + */ + __pyx_tuple__69 = PyTuple_Pack(6, __pyx_n_s_py_db, __pyx_n_s_frame, __pyx_n_s_event, __pyx_n_s_arg, __pyx_n_s_thread_trace_func, __pyx_n_s_apply_to_settrace); if (unlikely(!__pyx_tuple__69)) __PYX_ERR(0, 1843, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__69); + __Pyx_GIVEREF(__pyx_tuple__69); + __pyx_codeobj__70 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__69, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_trace_dispatch, 1843, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__70)) __PYX_ERR(0, 1843, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1866 + * # fmt: on + * + * def trace_unhandled_exceptions(self, frame, event, arg): # <<<<<<<<<<<<<< + * # Note that we ignore the frame as this tracing method should only be put in topmost frames already. + * # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + */ + __pyx_tuple__71 = PyTuple_Pack(7, __pyx_n_s_self, __pyx_n_s_frame, __pyx_n_s_event, __pyx_n_s_arg, __pyx_n_s_py_db, __pyx_n_s_t, __pyx_n_s_additional_info); if (unlikely(!__pyx_tuple__71)) __PYX_ERR(0, 1866, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__71); + __Pyx_GIVEREF(__pyx_tuple__71); + __pyx_codeobj__72 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__71, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_trace_unhandled_exceptions, 1866, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__72)) __PYX_ERR(0, 1866, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1880 + * return self.trace_unhandled_exceptions + * + * def get_trace_dispatch_func(self): # <<<<<<<<<<<<<< + * return self.trace_unhandled_exceptions + * + */ + __pyx_codeobj__73 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_get_trace_dispatch_func, 1880, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__73)) __PYX_ERR(0, 1880, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__74 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__74)) __PYX_ERR(2, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(self, __pyx_state) + */ + __pyx_codeobj__75 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__75)) __PYX_ERR(2, 16, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1924 + * # fmt: on + * + * def trace_dispatch_and_unhandled_exceptions(self, frame, event, arg): # <<<<<<<<<<<<<< + * # DEBUG = 'code_to_debug' in frame.f_code.co_filename + * # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + */ + __pyx_tuple__76 = PyTuple_Pack(9, __pyx_n_s_self, __pyx_n_s_frame, __pyx_n_s_event, __pyx_n_s_arg, __pyx_n_s_frame_trace_dispatch, __pyx_n_s_py_db, __pyx_n_s_t, __pyx_n_s_additional_info, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__76)) __PYX_ERR(0, 1924, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__76); + __Pyx_GIVEREF(__pyx_tuple__76); + __pyx_codeobj__77 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 9, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__76, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_trace_dispatch_and_unhandled_exc, 1924, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__77)) __PYX_ERR(0, 1924, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":1959 + * return ret + * + * def get_trace_dispatch_func(self): # <<<<<<<<<<<<<< + * return self.trace_dispatch_and_unhandled_exceptions + * + */ + __pyx_codeobj__78 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_get_trace_dispatch_func, 1959, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__78)) __PYX_ERR(0, 1959, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__79 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__79)) __PYX_ERR(2, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(self, __pyx_state) + */ + __pyx_codeobj__80 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__80)) __PYX_ERR(2, 16, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__81 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__81)) __PYX_ERR(2, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadTracer__set_state(self, __pyx_state) + */ + __pyx_codeobj__82 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__82)) __PYX_ERR(2, 16, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":2164 + * _original_call = ThreadTracer.__call__ + * + * def __call__(self, frame, event, arg): # <<<<<<<<<<<<<< + * constructed_tid_to_last_frame[self._args[1].ident] = frame + * return _original_call(self, frame, event, arg) + */ + __pyx_codeobj__83 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__53, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_call_2, 2164, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__83)) __PYX_ERR(0, 2164, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":2172 + * if PYDEVD_USE_SYS_MONITORING: + * + * def fix_top_level_trace_and_get_trace_func(*args, **kwargs): # <<<<<<<<<<<<<< + * raise RuntimeError("Not used in sys.monitoring mode.") + */ + __pyx_codeobj__84 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__37, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_bundle_pydevd_cython_pyx, __pyx_n_s_fix_top_level_trace_and_get_trac, 2172, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__84)) __PYX_ERR(0, 2172, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __pyx_unpickle_PyDBAdditionalThreadInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__85 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__85)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__85); + __Pyx_GIVEREF(__pyx_tuple__85); + __pyx_codeobj__86 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__85, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_PyDBAdditionalThr, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__86)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_codeobj__87 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__85, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__TryExceptContain, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__87)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_codeobj__88 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__85, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_PyDBFrame, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__88)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_codeobj__89 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__85, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_SafeCallWrapper, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__89)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_codeobj__90 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__85, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_TopLevelThreadTra, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__90)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_codeobj__91 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__85, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_TopLevelThreadTra_2, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__91)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_codeobj__92 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__85, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_ThreadTracer, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__92)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + __pyx_umethod_PyDict_Type_get.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_get.method_name = &__pyx_n_s_get; + __pyx_umethod_PyDict_Type_update.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_update.method_name = &__pyx_n_s_update; + __pyx_umethod_PyString_Type_rfind.type = (PyObject*)&PyString_Type; + __pyx_umethod_PyString_Type_rfind.method_name = &__pyx_n_s_rfind; + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_11 = PyInt_FromLong(11); if (unlikely(!__pyx_int_11)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_111 = PyInt_FromLong(111); if (unlikely(!__pyx_int_111)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_137 = PyInt_FromLong(137); if (unlikely(!__pyx_int_137)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_160 = PyInt_FromLong(160); if (unlikely(!__pyx_int_160)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2424557 = PyInt_FromLong(2424557L); if (unlikely(!__pyx_int_2424557)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_16751766 = PyInt_FromLong(16751766L); if (unlikely(!__pyx_int_16751766)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_18997755 = PyInt_FromLong(18997755L); if (unlikely(!__pyx_int_18997755)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_61391470 = PyInt_FromLong(61391470L); if (unlikely(!__pyx_int_61391470)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_63705258 = PyInt_FromLong(63705258L); if (unlikely(!__pyx_int_63705258)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_64458794 = PyInt_FromLong(64458794L); if (unlikely(!__pyx_int_64458794)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_66451433 = PyInt_FromLong(66451433L); if (unlikely(!__pyx_int_66451433)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_70528507 = PyInt_FromLong(70528507L); if (unlikely(!__pyx_int_70528507)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_84338306 = PyInt_FromLong(84338306L); if (unlikely(!__pyx_int_84338306)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_125568891 = PyInt_FromLong(125568891L); if (unlikely(!__pyx_int_125568891)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_169093275 = PyInt_FromLong(169093275L); if (unlikely(!__pyx_int_169093275)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_171613889 = PyInt_FromLong(171613889L); if (unlikely(!__pyx_int_171613889)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_192493205 = PyInt_FromLong(192493205L); if (unlikely(!__pyx_int_192493205)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_210464433 = PyInt_FromLong(210464433L); if (unlikely(!__pyx_int_210464433)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_221489684 = PyInt_FromLong(221489684L); if (unlikely(!__pyx_int_221489684)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_230645316 = PyInt_FromLong(230645316L); if (unlikely(!__pyx_int_230645316)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_232881363 = PyInt_FromLong(232881363L); if (unlikely(!__pyx_int_232881363)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_255484337 = PyInt_FromLong(255484337L); if (unlikely(!__pyx_int_255484337)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + return 0; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos = ((PyObject*)Py_None); Py_INCREF(Py_None); + __pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping = ((PyObject*)Py_None); Py_INCREF(Py_None); + __pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock = Py_None; Py_INCREF(Py_None); + __pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in = ((PyObject*)Py_None); Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + if (__Pyx_ExportFunction("set_additional_thread_info", (void (*)(void))__pyx_f_14_pydevd_bundle_13pydevd_cython_set_additional_thread_info, "PyObject *(PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ExportFunction("add_additional_info", (void (*)(void))__pyx_f_14_pydevd_bundle_13pydevd_cython_add_additional_info, "PyObject *(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ExportFunction("remove_additional_info", (void (*)(void))__pyx_f_14_pydevd_bundle_13pydevd_cython_remove_additional_info, "PyObject *(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ExportFunction("any_thread_stepping", (void (*)(void))__pyx_f_14_pydevd_bundle_13pydevd_cython_any_thread_stepping, "int (int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo = &__pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo.get_topmost_frame = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, PyObject *, int __pyx_skip_dispatch))__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_get_topmost_frame; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo.update_stepping_info = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch))__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_update_stepping_info; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo._get_related_thread = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch))__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo__get_related_thread; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo._is_stepping = (int (*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch))__pyx_f_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo__is_stepping; + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo_spec, NULL); if (unlikely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo)) __PYX_ERR(0, 30, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo_spec, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + #else + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo = &__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo->tp_dictoffset && __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, __pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_PyDBAdditionalThreadInfo, (PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj_spec, NULL); if (unlikely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj)) __PYX_ERR(0, 435, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj_spec, __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj) < 0) __PYX_ERR(0, 435, __pyx_L1_error) + #else + __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj = &__pyx_type_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj) < 0) __PYX_ERR(0, 435, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj->tp_dictoffset && __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_TryExceptContainerObj, (PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj) < 0) __PYX_ERR(0, 435, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj) < 0) __PYX_ERR(0, 435, __pyx_L1_error) + #endif + __pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBFrame = &__pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBFrame; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBFrame.get_func_name = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *))__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_get_func_name; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBFrame._show_return_values = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *))__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__show_return_values; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBFrame._remove_return_values = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *))__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__remove_return_values; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBFrame._get_unfiltered_back_frame = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *))__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__get_unfiltered_back_frame; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBFrame._is_same_frame = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *))__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame__is_same_frame; + __pyx_vtable_14_pydevd_bundle_13pydevd_cython_PyDBFrame.trace_dispatch = (PyObject *(*)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBFrame *, PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch))__pyx_f_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_trace_dispatch; + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame_spec, NULL); if (unlikely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame)) __PYX_ERR(0, 455, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame_spec, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame) < 0) __PYX_ERR(0, 455, __pyx_L1_error) + #else + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame = &__pyx_type_14_pydevd_bundle_13pydevd_cython_PyDBFrame; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame) < 0) __PYX_ERR(0, 455, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame->tp_dictoffset && __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame, __pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBFrame) < 0) __PYX_ERR(0, 455, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame) < 0) __PYX_ERR(0, 455, __pyx_L1_error) + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_PyDBFrame, (PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame) < 0) __PYX_ERR(0, 455, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame) < 0) __PYX_ERR(0, 455, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper_spec, NULL); if (unlikely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper)) __PYX_ERR(0, 1688, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper_spec, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper) < 0) __PYX_ERR(0, 1688, __pyx_L1_error) + #else + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper = &__pyx_type_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper) < 0) __PYX_ERR(0, 1688, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper->tp_dictoffset && __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SafeCallWrapper, (PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper) < 0) __PYX_ERR(0, 1688, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper) < 0) __PYX_ERR(0, 1688, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions_spec, NULL); if (unlikely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions)) __PYX_ERR(0, 1854, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions_spec, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions) < 0) __PYX_ERR(0, 1854, __pyx_L1_error) + #else + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions = &__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions) < 0) __PYX_ERR(0, 1854, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions->tp_dictoffset && __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_TopLevelThreadTracerOnlyUnhandle, (PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions) < 0) __PYX_ERR(0, 1854, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions) < 0) __PYX_ERR(0, 1854, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame_spec, NULL); if (unlikely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame)) __PYX_ERR(0, 1885, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame_spec, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame) < 0) __PYX_ERR(0, 1885, __pyx_L1_error) + #else + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame = &__pyx_type_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame) < 0) __PYX_ERR(0, 1885, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame->tp_dictoffset && __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_TopLevelThreadTracerNoBackFrame, (PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame) < 0) __PYX_ERR(0, 1885, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame) < 0) __PYX_ERR(0, 1885, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer_spec, NULL); if (unlikely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer)) __PYX_ERR(0, 1965, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer_spec, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer) < 0) __PYX_ERR(0, 1965, __pyx_L1_error) + #else + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer = &__pyx_type_14_pydevd_bundle_13pydevd_cython_ThreadTracer; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer) < 0) __PYX_ERR(0, 1965, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer->tp_dictoffset && __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + #if CYTHON_UPDATE_DESCRIPTOR_DOC + { + PyObject *wrapper = PyObject_GetAttrString((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer, "__call__"); if (unlikely(!wrapper)) __PYX_ERR(0, 1965, __pyx_L1_error) + if (__Pyx_IS_TYPE(wrapper, &PyWrapperDescr_Type)) { + __pyx_wrapperbase_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_2__call__ = *((PyWrapperDescrObject *)wrapper)->d_base; + __pyx_wrapperbase_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_2__call__.doc = __pyx_doc_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_2__call__; + ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_2__call__; + } + } + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ThreadTracer, (PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer) < 0) __PYX_ERR(0, 1965, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer) < 0) __PYX_ERR(0, 1965, __pyx_L1_error) + #endif + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_11(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_11); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_pydevd_cython(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_pydevd_cython}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "pydevd_cython", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initpydevd_cython(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initpydevd_cython(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_pydevd_cython(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_pydevd_cython(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_pydevd_cython(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'pydevd_cython' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("pydevd_cython", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "pydevd_cython" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_pydevd_cython(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main__pydevd_bundle__pydevd_cython) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "_pydevd_bundle.pydevd_cython")) { + if (unlikely((PyDict_SetItemString(modules, "_pydevd_bundle.pydevd_cython", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + if (unlikely((__Pyx_modinit_function_export_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "_pydevd_bundle/pydevd_cython.pyx":8 + * # DO NOT edit manually! + * from _pydevd_bundle.pydevd_constants import ( + * STATE_RUN, # <<<<<<<<<<<<<< + * PYTHON_SUSPEND, + * SUPPORT_GEVENT, + */ + __pyx_t_2 = PyList_New(8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_STATE_RUN); + __Pyx_GIVEREF(__pyx_n_s_STATE_RUN); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_STATE_RUN)) __PYX_ERR(0, 8, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_PYTHON_SUSPEND); + __Pyx_GIVEREF(__pyx_n_s_PYTHON_SUSPEND); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_PYTHON_SUSPEND)) __PYX_ERR(0, 8, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_SUPPORT_GEVENT); + __Pyx_GIVEREF(__pyx_n_s_SUPPORT_GEVENT); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_SUPPORT_GEVENT)) __PYX_ERR(0, 8, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_ForkSafeLock); + __Pyx_GIVEREF(__pyx_n_s_ForkSafeLock); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_ForkSafeLock)) __PYX_ERR(0, 8, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_current_frames); + __Pyx_GIVEREF(__pyx_n_s_current_frames); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_current_frames)) __PYX_ERR(0, 8, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_STATE_SUSPEND); + __Pyx_GIVEREF(__pyx_n_s_STATE_SUSPEND); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_STATE_SUSPEND)) __PYX_ERR(0, 8, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_get_global_debugger); + __Pyx_GIVEREF(__pyx_n_s_get_global_debugger); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 6, __pyx_n_s_get_global_debugger)) __PYX_ERR(0, 8, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_get_thread_id); + __Pyx_GIVEREF(__pyx_n_s_get_thread_id); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 7, __pyx_n_s_get_thread_id)) __PYX_ERR(0, 8, __pyx_L1_error); + + /* "_pydevd_bundle/pydevd_cython.pyx":7 + * # DO NOT edit manually! + * # DO NOT edit manually! + * from _pydevd_bundle.pydevd_constants import ( # <<<<<<<<<<<<<< + * STATE_RUN, + * PYTHON_SUSPEND, + */ + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_constants, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_STATE_RUN); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_STATE_RUN, __pyx_t_2) < 0) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PYTHON_SUSPEND); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_PYTHON_SUSPEND, __pyx_t_2) < 0) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_SUPPORT_GEVENT); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_SUPPORT_GEVENT, __pyx_t_2) < 0) __PYX_ERR(0, 10, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_ForkSafeLock); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ForkSafeLock, __pyx_t_2) < 0) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_current_frames); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_current_frames, __pyx_t_2) < 0) __PYX_ERR(0, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_STATE_SUSPEND); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_STATE_SUSPEND, __pyx_t_2) < 0) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_get_global_debugger); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_global_debugger, __pyx_t_2) < 0) __PYX_ERR(0, 14, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_get_thread_id); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_thread_id, __pyx_t_2) < 0) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":17 + * get_thread_id, + * ) + * from _pydev_bundle import pydev_log # <<<<<<<<<<<<<< + * from _pydev_bundle._pydev_saved_modules import threading + * from _pydev_bundle.pydev_is_thread_alive import is_thread_alive + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_pydev_log); + __Pyx_GIVEREF(__pyx_n_s_pydev_log); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_pydev_log)) __PYX_ERR(0, 17, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydev_bundle, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pydev_log, __pyx_t_3) < 0) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":18 + * ) + * from _pydev_bundle import pydev_log + * from _pydev_bundle._pydev_saved_modules import threading # <<<<<<<<<<<<<< + * from _pydev_bundle.pydev_is_thread_alive import is_thread_alive + * import weakref + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_threading); + __Pyx_GIVEREF(__pyx_n_s_threading); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_threading)) __PYX_ERR(0, 18, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydev_bundle__pydev_saved_modul, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_threading, __pyx_t_2) < 0) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":19 + * from _pydev_bundle import pydev_log + * from _pydev_bundle._pydev_saved_modules import threading + * from _pydev_bundle.pydev_is_thread_alive import is_thread_alive # <<<<<<<<<<<<<< + * import weakref + * + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_is_thread_alive); + __Pyx_GIVEREF(__pyx_n_s_is_thread_alive); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_is_thread_alive)) __PYX_ERR(0, 19, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydev_bundle_pydev_is_thread_al, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_is_thread_alive); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_thread_alive, __pyx_t_3) < 0) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":20 + * from _pydev_bundle._pydev_saved_modules import threading + * from _pydev_bundle.pydev_is_thread_alive import is_thread_alive + * import weakref # <<<<<<<<<<<<<< + * + * version = 11 + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_weakref, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_weakref, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":22 + * import weakref + * + * version = 11 # <<<<<<<<<<<<<< + * + * + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_version, __pyx_int_11) < 0) __PYX_ERR(0, 22, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":130 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef object _get_related_thread(self): # <<<<<<<<<<<<<< + * # ELSE + * # def _get_related_thread(self): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_3_get_related_thread, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBAdditionalThreadInfo__get_re, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__21)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, __pyx_n_s_get_related_thread, __pyx_t_2) < 0) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + + /* "_pydevd_bundle/pydevd_cython.pyx":159 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef bint _is_stepping(self): # <<<<<<<<<<<<<< + * # ELSE + * # def _is_stepping(self): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_5_is_stepping, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBAdditionalThreadInfo__is_ste, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__22)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, __pyx_n_s_is_stepping, __pyx_t_2) < 0) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + + /* "_pydevd_bundle/pydevd_cython.pyx":177 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef get_topmost_frame(self, thread): # <<<<<<<<<<<<<< + * # ELSE + * # def get_topmost_frame(self, thread): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_7get_topmost_frame, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBAdditionalThreadInfo_get_top, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__24)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, __pyx_n_s_get_topmost_frame, __pyx_t_2) < 0) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + + /* "_pydevd_bundle/pydevd_cython.pyx":206 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef update_stepping_info(self): # <<<<<<<<<<<<<< + * # ELSE + * # def update_stepping_info(self): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_9update_stepping_info, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBAdditionalThreadInfo_update, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__25)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 206, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, __pyx_n_s_update_stepping_info, __pyx_t_2) < 0) __PYX_ERR(0, 206, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_13__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBAdditionalThreadInfo___reduc, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_PyDBAdditionalThreadInfo, (type(self), 0xd33aa14, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(self, __pyx_state) + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_24PyDBAdditionalThreadInfo_15__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBAdditionalThreadInfo___setst, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + + /* "_pydevd_bundle/pydevd_cython.pyx":217 + * + * + * _set_additional_thread_info_lock = ForkSafeLock() # <<<<<<<<<<<<<< + * _next_additional_info = [PyDBAdditionalThreadInfo()] + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ForkSafeLock); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_additional_thread_info_lock, __pyx_t_3) < 0) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":218 + * + * _set_additional_thread_info_lock = ForkSafeLock() + * _next_additional_info = [PyDBAdditionalThreadInfo()] # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error); + __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_next_additional_info, __pyx_t_2) < 0) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":223 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef set_additional_thread_info(thread): # <<<<<<<<<<<<<< + * # ELSE + * # def set_additional_thread_info(thread): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_1set_additional_thread_info, 0, __pyx_n_s_set_additional_thread_info, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 223, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_additional_thread_info, __pyx_t_2) < 0) __PYX_ERR(0, 223, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":265 + * # fmt: on + * + * _all_infos = set() # <<<<<<<<<<<<<< + * _infos_stepping = set() + * _update_infos_lock = ForkSafeLock() + */ + __pyx_t_2 = PySet_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos); + __Pyx_DECREF_SET(__pyx_v_14_pydevd_bundle_13pydevd_cython__all_infos, ((PyObject*)__pyx_t_2)); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":266 + * + * _all_infos = set() + * _infos_stepping = set() # <<<<<<<<<<<<<< + * _update_infos_lock = ForkSafeLock() + * + */ + __pyx_t_2 = PySet_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 266, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping); + __Pyx_DECREF_SET(__pyx_v_14_pydevd_bundle_13pydevd_cython__infos_stepping, ((PyObject*)__pyx_t_2)); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":267 + * _all_infos = set() + * _infos_stepping = set() + * _update_infos_lock = ForkSafeLock() # <<<<<<<<<<<<<< + * + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ForkSafeLock); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XGOTREF(__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock); + __Pyx_DECREF_SET(__pyx_v_14_pydevd_bundle_13pydevd_cython__update_infos_lock, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":305 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef add_additional_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def add_additional_info(info): + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_3add_additional_info, 0, __pyx_n_s_add_additional_info, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_add_additional_info, __pyx_t_3) < 0) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":317 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef remove_additional_info(PyDBAdditionalThreadInfo info): # <<<<<<<<<<<<<< + * # ELSE + * # def remove_additional_info(info): + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_5remove_additional_info, 0, __pyx_n_s_remove_additional_info, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 317, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_remove_additional_info, __pyx_t_3) < 0) __PYX_ERR(0, 317, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":329 + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef bint any_thread_stepping(): # <<<<<<<<<<<<<< + * # ELSE + * # def any_thread_stepping(): + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_7any_thread_stepping, 0, __pyx_n_s_any_thread_stepping, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 329, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_any_thread_stepping, __pyx_t_3) < 0) __PYX_ERR(0, 329, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":335 + * # fmt: on + * return bool(_infos_stepping) + * import linecache # <<<<<<<<<<<<<< + * import os.path + * import re + */ + __pyx_t_3 = __Pyx_ImportDottedModule(__pyx_n_s_linecache, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 335, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_linecache, __pyx_t_3) < 0) __PYX_ERR(0, 335, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":336 + * return bool(_infos_stepping) + * import linecache + * import os.path # <<<<<<<<<<<<<< + * import re + * + */ + __pyx_t_3 = __Pyx_Import(__pyx_n_s_os_path, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 336, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_os, __pyx_t_3) < 0) __PYX_ERR(0, 336, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":337 + * import linecache + * import os.path + * import re # <<<<<<<<<<<<<< + * + * from _pydev_bundle import pydev_log + */ + __pyx_t_3 = __Pyx_ImportDottedModule(__pyx_n_s_re, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_re, __pyx_t_3) < 0) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":339 + * import re + * + * from _pydev_bundle import pydev_log # <<<<<<<<<<<<<< + * from _pydevd_bundle import pydevd_dont_trace + * from _pydevd_bundle.pydevd_constants import ( + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 339, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_pydev_log); + __Pyx_GIVEREF(__pyx_n_s_pydev_log); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_pydev_log)) __PYX_ERR(0, 339, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydev_bundle, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 339, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_pydev_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 339, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pydev_log, __pyx_t_3) < 0) __PYX_ERR(0, 339, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":340 + * + * from _pydev_bundle import pydev_log + * from _pydevd_bundle import pydevd_dont_trace # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_constants import ( + * RETURN_VALUES_DICT, + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 340, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_pydevd_dont_trace); + __Pyx_GIVEREF(__pyx_n_s_pydevd_dont_trace); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_pydevd_dont_trace)) __PYX_ERR(0, 340, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_bundle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 340, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_pydevd_dont_trace); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 340, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pydevd_dont_trace, __pyx_t_2) < 0) __PYX_ERR(0, 340, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":342 + * from _pydevd_bundle import pydevd_dont_trace + * from _pydevd_bundle.pydevd_constants import ( + * RETURN_VALUES_DICT, # <<<<<<<<<<<<<< + * NO_FTRACE, + * EXCEPTION_TYPE_HANDLED, + */ + __pyx_t_3 = PyList_New(6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 342, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_RETURN_VALUES_DICT); + __Pyx_GIVEREF(__pyx_n_s_RETURN_VALUES_DICT); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_RETURN_VALUES_DICT)) __PYX_ERR(0, 342, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_NO_FTRACE); + __Pyx_GIVEREF(__pyx_n_s_NO_FTRACE); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_NO_FTRACE)) __PYX_ERR(0, 342, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_EXCEPTION_TYPE_HANDLED); + __Pyx_GIVEREF(__pyx_n_s_EXCEPTION_TYPE_HANDLED); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 2, __pyx_n_s_EXCEPTION_TYPE_HANDLED)) __PYX_ERR(0, 342, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED); + __Pyx_GIVEREF(__pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 3, __pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED)) __PYX_ERR(0, 342, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_PYDEVD_IPYTHON_CONTEXT); + __Pyx_GIVEREF(__pyx_n_s_PYDEVD_IPYTHON_CONTEXT); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 4, __pyx_n_s_PYDEVD_IPYTHON_CONTEXT)) __PYX_ERR(0, 342, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_PYDEVD_USE_SYS_MONITORING); + __Pyx_GIVEREF(__pyx_n_s_PYDEVD_USE_SYS_MONITORING); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 5, __pyx_n_s_PYDEVD_USE_SYS_MONITORING)) __PYX_ERR(0, 342, __pyx_L1_error); + + /* "_pydevd_bundle/pydevd_cython.pyx":341 + * from _pydev_bundle import pydev_log + * from _pydevd_bundle import pydevd_dont_trace + * from _pydevd_bundle.pydevd_constants import ( # <<<<<<<<<<<<<< + * RETURN_VALUES_DICT, + * NO_FTRACE, + */ + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_constants, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_RETURN_VALUES_DICT); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_RETURN_VALUES_DICT, __pyx_t_3) < 0) __PYX_ERR(0, 342, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_FTRACE, __pyx_t_3) < 0) __PYX_ERR(0, 343, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_EXCEPTION_TYPE_HANDLED); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_EXCEPTION_TYPE_HANDLED, __pyx_t_3) < 0) __PYX_ERR(0, 344, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_EXCEPTION_TYPE_USER_UNHANDLED, __pyx_t_3) < 0) __PYX_ERR(0, 345, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_PYDEVD_IPYTHON_CONTEXT); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_PYDEVD_IPYTHON_CONTEXT, __pyx_t_3) < 0) __PYX_ERR(0, 346, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_PYDEVD_USE_SYS_MONITORING); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_PYDEVD_USE_SYS_MONITORING, __pyx_t_3) < 0) __PYX_ERR(0, 347, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":349 + * PYDEVD_USE_SYS_MONITORING, + * ) + * from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame, just_raised, remove_exception_from_frame, ignore_exception_trace # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_utils import get_clsname_for_code + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame + */ + __pyx_t_2 = PyList_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_add_exception_to_frame); + __Pyx_GIVEREF(__pyx_n_s_add_exception_to_frame); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_add_exception_to_frame)) __PYX_ERR(0, 349, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_just_raised); + __Pyx_GIVEREF(__pyx_n_s_just_raised); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_just_raised)) __PYX_ERR(0, 349, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_remove_exception_from_frame); + __Pyx_GIVEREF(__pyx_n_s_remove_exception_from_frame); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_remove_exception_from_frame)) __PYX_ERR(0, 349, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_ignore_exception_trace); + __Pyx_GIVEREF(__pyx_n_s_ignore_exception_trace); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_ignore_exception_trace)) __PYX_ERR(0, 349, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_frame_util, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_add_exception_to_frame); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_add_exception_to_frame, __pyx_t_2) < 0) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_just_raised); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_just_raised, __pyx_t_2) < 0) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_remove_exception_from_frame); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_remove_exception_from_frame, __pyx_t_2) < 0) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_ignore_exception_trace); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ignore_exception_trace, __pyx_t_2) < 0) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":350 + * ) + * from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame, just_raised, remove_exception_from_frame, ignore_exception_trace + * from _pydevd_bundle.pydevd_utils import get_clsname_for_code # <<<<<<<<<<<<<< + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame + * from _pydevd_bundle.pydevd_comm_constants import constant_to_str, CMD_SET_FUNCTION_BREAK + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 350, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_get_clsname_for_code); + __Pyx_GIVEREF(__pyx_n_s_get_clsname_for_code); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_get_clsname_for_code)) __PYX_ERR(0, 350, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_utils, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 350, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_get_clsname_for_code); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 350, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_clsname_for_code, __pyx_t_3) < 0) __PYX_ERR(0, 350, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":351 + * from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame, just_raised, remove_exception_from_frame, ignore_exception_trace + * from _pydevd_bundle.pydevd_utils import get_clsname_for_code + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_comm_constants import constant_to_str, CMD_SET_FUNCTION_BREAK + * import sys + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_get_abs_path_real_path_and_base); + __Pyx_GIVEREF(__pyx_n_s_get_abs_path_real_path_and_base); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_get_abs_path_real_path_and_base)) __PYX_ERR(0, 351, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_file_utils, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_get_abs_path_real_path_and_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_abs_path_real_path_and_base, __pyx_t_2) < 0) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":352 + * from _pydevd_bundle.pydevd_utils import get_clsname_for_code + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame + * from _pydevd_bundle.pydevd_comm_constants import constant_to_str, CMD_SET_FUNCTION_BREAK # <<<<<<<<<<<<<< + * import sys + * + */ + __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_constant_to_str); + __Pyx_GIVEREF(__pyx_n_s_constant_to_str); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_constant_to_str)) __PYX_ERR(0, 352, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_CMD_SET_FUNCTION_BREAK); + __Pyx_GIVEREF(__pyx_n_s_CMD_SET_FUNCTION_BREAK); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_CMD_SET_FUNCTION_BREAK)) __PYX_ERR(0, 352, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_comm_const, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_constant_to_str); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_constant_to_str, __pyx_t_3) < 0) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CMD_SET_FUNCTION_BREAK); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_CMD_SET_FUNCTION_BREAK, __pyx_t_3) < 0) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":353 + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame + * from _pydevd_bundle.pydevd_comm_constants import constant_to_str, CMD_SET_FUNCTION_BREAK + * import sys # <<<<<<<<<<<<<< + * + * try: + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_sys, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 353, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_2) < 0) __PYX_ERR(0, 353, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":355 + * import sys + * + * try: # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_bytecode_utils import get_smart_step_into_variant_from_frame_offset + * except ImportError: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":356 + * + * try: + * from _pydevd_bundle.pydevd_bytecode_utils import get_smart_step_into_variant_from_frame_offset # <<<<<<<<<<<<<< + * except ImportError: + * + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 356, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_get_smart_step_into_variant_from); + __Pyx_GIVEREF(__pyx_n_s_get_smart_step_into_variant_from); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_get_smart_step_into_variant_from)) __PYX_ERR(0, 356, __pyx_L2_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_bytecode_u, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 356, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_get_smart_step_into_variant_from); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 356, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_smart_step_into_variant_from, __pyx_t_2) < 0) __PYX_ERR(0, 356, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":355 + * import sys + * + * try: # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_bytecode_utils import get_smart_step_into_variant_from_frame_offset + * except ImportError: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L7_try_end; + __pyx_L2_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":357 + * try: + * from _pydevd_bundle.pydevd_bytecode_utils import get_smart_step_into_variant_from_frame_offset + * except ImportError: # <<<<<<<<<<<<<< + * + * def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): + */ + __pyx_t_6 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_ImportError); + if (__pyx_t_6) { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_7) < 0) __PYX_ERR(0, 357, __pyx_L4_except_error) + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_7); + + /* "_pydevd_bundle/pydevd_cython.pyx":359 + * except ImportError: + * + * def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_8 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_9get_smart_step_into_variant_from_frame_offset, 0, __pyx_n_s_get_smart_step_into_variant_from, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 359, __pyx_L4_except_error) + __Pyx_GOTREF(__pyx_t_8); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_smart_step_into_variant_from, __pyx_t_8) < 0) __PYX_ERR(0, 359, __pyx_L4_except_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L3_exception_handled; + } + goto __pyx_L4_except_error; + + /* "_pydevd_bundle/pydevd_cython.pyx":355 + * import sys + * + * try: # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_bytecode_utils import get_smart_step_into_variant_from_frame_offset + * except ImportError: + */ + __pyx_L4_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_4, __pyx_t_5); + __pyx_L7_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":379 + * # ENDIF + * + * basename = os.path.basename # <<<<<<<<<<<<<< + * + * IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_os); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_path); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_basename); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_basename, __pyx_t_7) < 0) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":381 + * basename = os.path.basename + * + * IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") # <<<<<<<<<<<<<< + * DEBUG_START = ("pydevd.py", "run") + * DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_re); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 381, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_compile); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 381, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_IGNORE_EXCEPTION_TAG, __pyx_t_7) < 0) __PYX_ERR(0, 381, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":382 + * + * IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") + * DEBUG_START = ("pydevd.py", "run") # <<<<<<<<<<<<<< + * DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") + * TRACE_PROPERTY = "pydevd_traceproperty.py" + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG_START, __pyx_tuple__40) < 0) __PYX_ERR(0, 382, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":383 + * IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") + * DEBUG_START = ("pydevd.py", "run") + * DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") # <<<<<<<<<<<<<< + * TRACE_PROPERTY = "pydevd_traceproperty.py" + * + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG_START_PY3K, __pyx_tuple__41) < 0) __PYX_ERR(0, 383, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":384 + * DEBUG_START = ("pydevd.py", "run") + * DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") + * TRACE_PROPERTY = "pydevd_traceproperty.py" # <<<<<<<<<<<<<< + * + * import dis + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_TRACE_PROPERTY, __pyx_kp_s_pydevd_traceproperty_py) < 0) __PYX_ERR(0, 384, __pyx_L1_error) + + /* "_pydevd_bundle/pydevd_cython.pyx":386 + * TRACE_PROPERTY = "pydevd_traceproperty.py" + * + * import dis # <<<<<<<<<<<<<< + * + * try: + */ + __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_dis, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 386, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_dis, __pyx_t_7) < 0) __PYX_ERR(0, 386, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":388 + * import dis + * + * try: # <<<<<<<<<<<<<< + * StopAsyncIteration + * except NameError: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_4, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "_pydevd_bundle/pydevd_cython.pyx":389 + * + * try: + * StopAsyncIteration # <<<<<<<<<<<<<< + * except NameError: + * StopAsyncIteration = StopIteration + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_StopAsyncIteration); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 389, __pyx_L10_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":388 + * import dis + * + * try: # <<<<<<<<<<<<<< + * StopAsyncIteration + * except NameError: + */ + } + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L15_try_end; + __pyx_L10_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":390 + * try: + * StopAsyncIteration + * except NameError: # <<<<<<<<<<<<<< + * StopAsyncIteration = StopIteration + * + */ + __pyx_t_6 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_NameError); + if (__pyx_t_6) { + __Pyx_AddTraceback("_pydevd_bundle.pydevd_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_2, &__pyx_t_3) < 0) __PYX_ERR(0, 390, __pyx_L12_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + + /* "_pydevd_bundle/pydevd_cython.pyx":391 + * StopAsyncIteration + * except NameError: + * StopAsyncIteration = StopIteration # <<<<<<<<<<<<<< + * + * + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_StopAsyncIteration, __pyx_builtin_StopIteration) < 0) __PYX_ERR(0, 391, __pyx_L12_except_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L11_exception_handled; + } + goto __pyx_L12_except_error; + + /* "_pydevd_bundle/pydevd_cython.pyx":388 + * import dis + * + * try: # <<<<<<<<<<<<<< + * StopAsyncIteration + * except NameError: + */ + __pyx_L12_except_error:; + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_4, __pyx_t_1); + goto __pyx_L1_error; + __pyx_L11_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_4, __pyx_t_1); + __pyx_L15_try_end:; + } + + /* "_pydevd_bundle/pydevd_cython.pyx":395 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def is_unhandled_exception(container_obj, py_db, frame, int last_raise_line, set raise_lines): # <<<<<<<<<<<<<< + * # ELSE + * # def is_unhandled_exception(container_obj, py_db, frame, last_raise_line, raise_lines): + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_11is_unhandled_exception, 0, __pyx_n_s_is_unhandled_exception, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 395, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_unhandled_exception, __pyx_t_3) < 0) __PYX_ERR(0, 395, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TryExceptContainerObj___reduce, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__TryExceptContainerObj, (type(self), 0xdbf5e44, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__TryExceptContainerObj__set_state(self, __pyx_state) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_22_TryExceptContainerObj_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TryExceptContainerObj___setstat, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__45)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython__TryExceptContainerObj); + + /* "_pydevd_bundle/pydevd_cython.pyx":490 + * # ENDIF + * + * def set_suspend(self, *args, **kwargs): # <<<<<<<<<<<<<< + * self._args[0].set_suspend(*args, **kwargs) + * + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_3set_suspend, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBFrame_set_suspend, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__47)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 490, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame, __pyx_n_s_set_suspend, __pyx_t_3) < 0) __PYX_ERR(0, 490, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + + /* "_pydevd_bundle/pydevd_cython.pyx":493 + * self._args[0].set_suspend(*args, **kwargs) + * + * def do_wait_suspend(self, *args, **kwargs): # <<<<<<<<<<<<<< + * self._args[0].do_wait_suspend(*args, **kwargs) + * + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_5do_wait_suspend, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBFrame_do_wait_suspend, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 493, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame, __pyx_n_s_do_wait_suspend, __pyx_t_3) < 0) __PYX_ERR(0, 493, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + + /* "_pydevd_bundle/pydevd_cython.pyx":497 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def trace_exception(self, frame, str event, arg): # <<<<<<<<<<<<<< + * cdef bint should_stop; + * cdef tuple exc_info; + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_7trace_exception, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBFrame_trace_exception, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 497, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame, __pyx_n_s_trace_exception, __pyx_t_3) < 0) __PYX_ERR(0, 497, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + + /* "_pydevd_bundle/pydevd_cython.pyx":526 + * return self.trace_exception + * + * def handle_user_exception(self, frame): # <<<<<<<<<<<<<< + * exc_info = self.exc_info + * if exc_info: + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_9handle_user_exception, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBFrame_handle_user_exception, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 526, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame, __pyx_n_s_handle_user_exception, __pyx_t_3) < 0) __PYX_ERR(0, 526, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + + /* "_pydevd_bundle/pydevd_cython.pyx":634 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * cpdef trace_dispatch(self, frame, str event, arg): # <<<<<<<<<<<<<< + * cdef tuple abs_path_canonical_path_and_base; + * cdef bint is_exception_event; + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_11trace_dispatch, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBFrame_trace_dispatch, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__54)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame, __pyx_n_s_trace_dispatch, __pyx_t_3) < 0) __PYX_ERR(0, 634, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_13__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBFrame___reduce_cython, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__55)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_PyDBFrame, (type(self), 0x3a8c26e, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_PyDBFrame__set_state(self, __pyx_state) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_9PyDBFrame_15__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PyDBFrame___setstate_cython, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__56)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBFrame); + + /* "_pydevd_bundle/pydevd_cython.pyx":1377 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def should_stop_on_exception(py_db, PyDBAdditionalThreadInfo info, frame, thread, arg, prev_user_uncaught_exc_info, is_unwind=False): # <<<<<<<<<<<<<< + * cdef bint should_stop; + * cdef bint was_just_raised; + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_13should_stop_on_exception, 0, __pyx_n_s_should_stop_on_exception, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__58)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1377, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_3, __pyx_tuple__59); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_should_stop_on_exception, __pyx_t_3) < 0) __PYX_ERR(0, 1377, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1505 + * # Same thing in the main debugger but only considering the file contents, while the one in the main debugger + * # considers the user input (so, the actual result must be a join of both). + * filename_to_lines_where_exceptions_are_ignored: dict = {} # <<<<<<<<<<<<<< + * filename_to_stat_info: dict = {} + * + */ + __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_filename_to_lines_where_exceptio, __pyx_t_3) < 0) __PYX_ERR(0, 1505, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1506 + * # considers the user input (so, the actual result must be a join of both). + * filename_to_lines_where_exceptions_are_ignored: dict = {} + * filename_to_stat_info: dict = {} # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1506, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_filename_to_stat_info, __pyx_t_3) < 0) __PYX_ERR(0, 1506, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1510 + * + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + * def handle_exception(py_db, thread, frame, arg, str exception_type): # <<<<<<<<<<<<<< + * cdef bint stopped; + * cdef tuple abs_real_path_and_base; + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_15handle_exception, 0, __pyx_n_s_handle_exception, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__61)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_exception, __pyx_t_3) < 0) __PYX_ERR(0, 1510, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1630 + * + * return stopped + * from _pydev_bundle.pydev_is_thread_alive import is_thread_alive # <<<<<<<<<<<<<< + * from _pydev_bundle.pydev_log import exception as pydev_log_exception + * from _pydev_bundle._pydev_saved_modules import threading + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1630, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_is_thread_alive); + __Pyx_GIVEREF(__pyx_n_s_is_thread_alive); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_is_thread_alive)) __PYX_ERR(0, 1630, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydev_bundle_pydev_is_thread_al, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1630, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_is_thread_alive); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1630, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_thread_alive, __pyx_t_3) < 0) __PYX_ERR(0, 1630, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1631 + * return stopped + * from _pydev_bundle.pydev_is_thread_alive import is_thread_alive + * from _pydev_bundle.pydev_log import exception as pydev_log_exception # <<<<<<<<<<<<<< + * from _pydev_bundle._pydev_saved_modules import threading + * from _pydevd_bundle.pydevd_constants import ( + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1631, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_exception); + __Pyx_GIVEREF(__pyx_n_s_exception); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_exception)) __PYX_ERR(0, 1631, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydev_bundle_pydev_log, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1631, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_exception); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1631, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pydev_log_exception, __pyx_t_2) < 0) __PYX_ERR(0, 1631, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1632 + * from _pydev_bundle.pydev_is_thread_alive import is_thread_alive + * from _pydev_bundle.pydev_log import exception as pydev_log_exception + * from _pydev_bundle._pydev_saved_modules import threading # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_constants import ( + * get_current_thread_id, + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1632, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_threading); + __Pyx_GIVEREF(__pyx_n_s_threading); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_threading)) __PYX_ERR(0, 1632, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydev_bundle__pydev_saved_modul, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1632, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1632, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_threading, __pyx_t_3) < 0) __PYX_ERR(0, 1632, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1634 + * from _pydev_bundle._pydev_saved_modules import threading + * from _pydevd_bundle.pydevd_constants import ( + * get_current_thread_id, # <<<<<<<<<<<<<< + * NO_FTRACE, + * USE_CUSTOM_SYS_CURRENT_FRAMES_MAP, + */ + __pyx_t_2 = PyList_New(5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_get_current_thread_id); + __Pyx_GIVEREF(__pyx_n_s_get_current_thread_id); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_get_current_thread_id)) __PYX_ERR(0, 1634, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_NO_FTRACE); + __Pyx_GIVEREF(__pyx_n_s_NO_FTRACE); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_NO_FTRACE)) __PYX_ERR(0, 1634, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA); + __Pyx_GIVEREF(__pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA)) __PYX_ERR(0, 1634, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_ForkSafeLock); + __Pyx_GIVEREF(__pyx_n_s_ForkSafeLock); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_ForkSafeLock)) __PYX_ERR(0, 1634, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_PYDEVD_USE_SYS_MONITORING); + __Pyx_GIVEREF(__pyx_n_s_PYDEVD_USE_SYS_MONITORING); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_PYDEVD_USE_SYS_MONITORING)) __PYX_ERR(0, 1634, __pyx_L1_error); + + /* "_pydevd_bundle/pydevd_cython.pyx":1633 + * from _pydev_bundle.pydev_log import exception as pydev_log_exception + * from _pydev_bundle._pydev_saved_modules import threading + * from _pydevd_bundle.pydevd_constants import ( # <<<<<<<<<<<<<< + * get_current_thread_id, + * NO_FTRACE, + */ + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_constants, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1633, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_get_current_thread_id); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1633, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_current_thread_id, __pyx_t_2) < 0) __PYX_ERR(0, 1634, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_NO_FTRACE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1633, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_FTRACE, __pyx_t_2) < 0) __PYX_ERR(0, 1635, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1633, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA, __pyx_t_2) < 0) __PYX_ERR(0, 1636, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_ForkSafeLock); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1633, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ForkSafeLock, __pyx_t_2) < 0) __PYX_ERR(0, 1637, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PYDEVD_USE_SYS_MONITORING); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1633, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_PYDEVD_USE_SYS_MONITORING, __pyx_t_2) < 0) __PYX_ERR(0, 1638, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1640 + * PYDEVD_USE_SYS_MONITORING, + * ) + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER # <<<<<<<<<<<<<< + * + * # fmt: off + */ + __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1640, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_get_abs_path_real_path_and_base); + __Pyx_GIVEREF(__pyx_n_s_get_abs_path_real_path_and_base); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_get_abs_path_real_path_and_base)) __PYX_ERR(0, 1640, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); + __Pyx_GIVEREF(__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER)) __PYX_ERR(0, 1640, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_file_utils, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1640, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_get_abs_path_real_path_and_base); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1640, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_abs_path_real_path_and_base, __pyx_t_3) < 0) __PYX_ERR(0, 1640, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1640, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER, __pyx_t_3) < 0) __PYX_ERR(0, 1640, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1667 + * # - Breakpoints are changed + * # It can be used when running regularly (without step over/step in/step return) + * global_cache_skips = {} # <<<<<<<<<<<<<< + * global_cache_frame_skips = {} + * + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1667, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_global_cache_skips, __pyx_t_2) < 0) __PYX_ERR(0, 1667, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1668 + * # It can be used when running regularly (without step over/step in/step return) + * global_cache_skips = {} + * global_cache_frame_skips = {} # <<<<<<<<<<<<<< + * + * _global_notify_skipped_step_in = False + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1668, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_global_cache_frame_skips, __pyx_t_2) < 0) __PYX_ERR(0, 1668, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1670 + * global_cache_frame_skips = {} + * + * _global_notify_skipped_step_in = False # <<<<<<<<<<<<<< + * _global_notify_skipped_step_in_lock = ForkSafeLock() + * + */ + __Pyx_INCREF(Py_False); + __Pyx_XGOTREF(__pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in); + __Pyx_DECREF_SET(__pyx_v_14_pydevd_bundle_13pydevd_cython__global_notify_skipped_step_in, ((PyObject*)Py_False)); + __Pyx_GIVEREF(Py_False); + + /* "_pydevd_bundle/pydevd_cython.pyx":1671 + * + * _global_notify_skipped_step_in = False + * _global_notify_skipped_step_in_lock = ForkSafeLock() # <<<<<<<<<<<<<< + * + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ForkSafeLock); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1671, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1671, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_global_notify_skipped_step_in_l, __pyx_t_3) < 0) __PYX_ERR(0, 1671, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1674 + * + * + * def notify_skipped_step_in_because_of_filters(py_db, frame): # <<<<<<<<<<<<<< + * global _global_notify_skipped_step_in + * + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_17notify_skipped_step_in_because_of_filters, 0, __pyx_n_s_notify_skipped_step_in_because_o, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__63)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_notify_skipped_step_in_because_o, __pyx_t_3) < 0) __PYX_ERR(0, 1674, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1700 + * Py_XDECREF (method_obj) + * return SafeCallWrapper(ret) if ret is not None else None + * def get_method_object(self): # <<<<<<<<<<<<<< + * return self.method_object + * # ELSE + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_5get_method_object, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SafeCallWrapper_get_method_objec, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__64)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1700, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper, __pyx_n_s_get_method_object, __pyx_t_3) < 0) __PYX_ERR(0, 1700, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper); + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SafeCallWrapper___reduce_cython, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__65)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_SafeCallWrapper, (type(self), 0xa14289b, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_SafeCallWrapper__set_state(self, __pyx_state) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_15SafeCallWrapper_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SafeCallWrapper___setstate_cytho, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__66)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_SafeCallWrapper); + + /* "_pydevd_bundle/pydevd_cython.pyx":1707 + * + * + * def fix_top_level_trace_and_get_trace_func(py_db, frame): # <<<<<<<<<<<<<< + * # fmt: off + * # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_19fix_top_level_trace_and_get_trace_func, 0, __pyx_n_s_fix_top_level_trace_and_get_trac, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__68)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1707, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fix_top_level_trace_and_get_trac, __pyx_t_3) < 0) __PYX_ERR(0, 1707, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1843 + * + * + * def trace_dispatch(py_db, frame, event, arg): # <<<<<<<<<<<<<< + * thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + * if thread_trace_func is None: + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_21trace_dispatch, 0, __pyx_n_s_trace_dispatch, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__70)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1843, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_trace_dispatch, __pyx_t_3) < 0) __PYX_ERR(0, 1843, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1866 + * # fmt: on + * + * def trace_unhandled_exceptions(self, frame, event, arg): # <<<<<<<<<<<<<< + * # Note that we ignore the frame as this tracing method should only be put in topmost frames already. + * # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_3trace_unhandled_exceptions, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TopLevelThreadTracerOnlyUnhandle_2, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__72)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1866, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, __pyx_n_s_trace_unhandled_exceptions, __pyx_t_3) < 0) __PYX_ERR(0, 1866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions); + + /* "_pydevd_bundle/pydevd_cython.pyx":1880 + * return self.trace_unhandled_exceptions + * + * def get_trace_dispatch_func(self): # <<<<<<<<<<<<<< + * return self.trace_unhandled_exceptions + * + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_5get_trace_dispatch_func, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TopLevelThreadTracerOnlyUnhandle_3, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__73)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1880, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, __pyx_n_s_get_trace_dispatch_func, __pyx_t_3) < 0) __PYX_ERR(0, 1880, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions); + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TopLevelThreadTracerOnlyUnhandle_4, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__74)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(self, __pyx_state) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_43TopLevelThreadTracerOnlyUnhandledExceptions_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TopLevelThreadTracerOnlyUnhandle_5, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__75)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerOnlyUnhandledExceptions); + + /* "_pydevd_bundle/pydevd_cython.pyx":1924 + * # fmt: on + * + * def trace_dispatch_and_unhandled_exceptions(self, frame, event, arg): # <<<<<<<<<<<<<< + * # DEBUG = 'code_to_debug' in frame.f_code.co_filename + * # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_3trace_dispatch_and_unhandled_exceptions, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TopLevelThreadTracerNoBackFrame_2, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__77)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1924, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, __pyx_n_s_trace_dispatch_and_unhandled_exc, __pyx_t_3) < 0) __PYX_ERR(0, 1924, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame); + + /* "_pydevd_bundle/pydevd_cython.pyx":1959 + * return ret + * + * def get_trace_dispatch_func(self): # <<<<<<<<<<<<<< + * return self.trace_dispatch_and_unhandled_exceptions + * + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_5get_trace_dispatch_func, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TopLevelThreadTracerNoBackFrame_3, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__78)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1959, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, __pyx_n_s_get_trace_dispatch_func, __pyx_t_3) < 0) __PYX_ERR(0, 1959, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame); + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TopLevelThreadTracerNoBackFrame_4, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__79)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_TopLevelThreadTracerNoBackFrame, (type(self), 0x3f5f7e9, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_TopLevelThreadTracerNoBackFrame__set_state(self, __pyx_state) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_31TopLevelThreadTracerNoBackFrame_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_TopLevelThreadTracerNoBackFrame_5, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__80)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_TopLevelThreadTracerNoBackFrame); + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ThreadTracer___reduce_cython, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__81)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_ThreadTracer, (type(self), 0x121e1fb, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadTracer__set_state(self, __pyx_state) + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_12ThreadTracer_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ThreadTracer___setstate_cython, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__82)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(2, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyType_Modified(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer); + + /* "_pydevd_bundle/pydevd_cython.pyx":2152 + * + * + * if USE_CUSTOM_SYS_CURRENT_FRAMES_MAP: # <<<<<<<<<<<<<< + * # This is far from ideal, as we'll leak frames (we'll always have the last created frame, not really + * # the last topmost frame saved -- this should be Ok for our usage, but it may leak frames and things + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_USE_CUSTOM_SYS_CURRENT_FRAMES_MA); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 2152, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_9) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2160 + * # + * # See: https://github.com/IronLanguages/main/issues/1630 + * from _pydevd_bundle.pydevd_constants import constructed_tid_to_last_frame # <<<<<<<<<<<<<< + * + * _original_call = ThreadTracer.__call__ + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_constructed_tid_to_last_frame); + __Pyx_GIVEREF(__pyx_n_s_constructed_tid_to_last_frame); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_constructed_tid_to_last_frame)) __PYX_ERR(0, 2160, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_constants, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_constructed_tid_to_last_frame); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_constructed_tid_to_last_frame, __pyx_t_3) < 0) __PYX_ERR(0, 2160, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2162 + * from _pydevd_bundle.pydevd_constants import constructed_tid_to_last_frame + * + * _original_call = ThreadTracer.__call__ # <<<<<<<<<<<<<< + * + * def __call__(self, frame, event, arg): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer), __pyx_n_s_call_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2162, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_original_call, __pyx_t_2) < 0) __PYX_ERR(0, 2162, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2164 + * _original_call = ThreadTracer.__call__ + * + * def __call__(self, frame, event, arg): # <<<<<<<<<<<<<< + * constructed_tid_to_last_frame[self._args[1].ident] = frame + * return _original_call(self, frame, event, arg) + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_23__call__, 0, __pyx_n_s_call_2, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__83)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2164, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_call_2, __pyx_t_2) < 0) __PYX_ERR(0, 2164, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2168 + * return _original_call(self, frame, event, arg) + * + * ThreadTracer.__call__ = __call__ # <<<<<<<<<<<<<< + * + * if PYDEVD_USE_SYS_MONITORING: + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_call_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2168, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_ThreadTracer), __pyx_n_s_call_2, __pyx_t_2) < 0) __PYX_ERR(0, 2168, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2152 + * + * + * if USE_CUSTOM_SYS_CURRENT_FRAMES_MAP: # <<<<<<<<<<<<<< + * # This is far from ideal, as we'll leak frames (we'll always have the last created frame, not really + * # the last topmost frame saved -- this should be Ok for our usage, but it may leak frames and things + */ + } + + /* "_pydevd_bundle/pydevd_cython.pyx":2170 + * ThreadTracer.__call__ = __call__ + * + * if PYDEVD_USE_SYS_MONITORING: # <<<<<<<<<<<<<< + * + * def fix_top_level_trace_and_get_trace_func(*args, **kwargs): + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_PYDEVD_USE_SYS_MONITORING); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2170, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 2170, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_9) { + + /* "_pydevd_bundle/pydevd_cython.pyx":2172 + * if PYDEVD_USE_SYS_MONITORING: + * + * def fix_top_level_trace_and_get_trace_func(*args, **kwargs): # <<<<<<<<<<<<<< + * raise RuntimeError("Not used in sys.monitoring mode.") + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_25fix_top_level_trace_and_get_trace_func, 0, __pyx_n_s_fix_top_level_trace_and_get_trac, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__84)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fix_top_level_trace_and_get_trac, __pyx_t_2) < 0) __PYX_ERR(0, 2172, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":2170 + * ThreadTracer.__call__ = __call__ + * + * if PYDEVD_USE_SYS_MONITORING: # <<<<<<<<<<<<<< + * + * def fix_top_level_trace_and_get_trace_func(*args, **kwargs): + */ + } + + /* "(tree fragment)":1 + * def __pyx_unpickle_PyDBAdditionalThreadInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_27__pyx_unpickle_PyDBAdditionalThreadInfo, 0, __pyx_n_s_pyx_unpickle_PyDBAdditionalThr, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__86)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_PyDBAdditionalThr, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":11 + * __pyx_unpickle_PyDBAdditionalThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_PyDBAdditionalThreadInfo__set_state(PyDBAdditionalThreadInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.conditional_breakpoint_exception = __pyx_state[0]; __pyx_result.is_in_wait_loop = __pyx_state[1]; __pyx_result.is_tracing = __pyx_state[2]; __pyx_result.pydev_call_from_jinja2 = __pyx_state[3]; __pyx_result.pydev_call_inside_jinja2 = __pyx_state[4]; __pyx_result.pydev_django_resolve_frame = __pyx_state[5]; __pyx_result.pydev_func_name = __pyx_state[6]; __pyx_result.pydev_message = __pyx_state[7]; __pyx_result.pydev_next_line = __pyx_state[8]; __pyx_result.pydev_notify_kill = __pyx_state[9]; __pyx_result.pydev_original_step_cmd = __pyx_state[10]; __pyx_result.pydev_smart_child_offset = __pyx_state[11]; __pyx_result.pydev_smart_parent_offset = __pyx_state[12]; __pyx_result.pydev_smart_step_into_variants = __pyx_state[13]; __pyx_result.pydev_smart_step_stop = __pyx_state[14]; __pyx_result.pydev_state = __pyx_state[15]; __pyx_result.pydev_step_cmd = __pyx_state[16]; __pyx_result.pydev_step_stop = __pyx_state[17]; __pyx_result.pydev_use_scoped_step_frame = __pyx_state[18]; __pyx_result.step_in_initial_location = __pyx_state[19]; __pyx_result.suspend_type = __pyx_state[20]; __pyx_result.suspended_at_unhandled = __pyx_state[21]; __pyx_result.target_id_to_smart_step_into_variant = __pyx_state[22]; __pyx_result.thread_tracer = __pyx_state[23]; __pyx_result.top_level_thread_tracer_no_back_frames = __pyx_state[24]; __pyx_result.top_level_thread_tracer_unhandled = __pyx_state[25]; __pyx_result.trace_suspend_type = __pyx_state[26]; __pyx_result.weak_thread = __pyx_state[27] + * if len(__pyx_state) > 28 and hasattr(__pyx_result, '__dict__'): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_29__pyx_unpickle__TryExceptContainerObj, 0, __pyx_n_s_pyx_unpickle__TryExceptContain, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__87)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle__TryExceptContain, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_PyDBFrame(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_31__pyx_unpickle_PyDBFrame, 0, __pyx_n_s_pyx_unpickle_PyDBFrame, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__88)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_PyDBFrame, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":11 + * __pyx_unpickle_PyDBFrame__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_PyDBFrame__set_state(PyDBFrame __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0]; __pyx_result.exc_info = __pyx_state[1]; __pyx_result.should_skip = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_33__pyx_unpickle_SafeCallWrapper, 0, __pyx_n_s_pyx_unpickle_SafeCallWrapper, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__89)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_SafeCallWrapper, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_35__pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions, 0, __pyx_n_s_pyx_unpickle_TopLevelThreadTra, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__90)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_TopLevelThreadTra, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":11 + * __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_TopLevelThreadTracerOnlyUnhandledExceptions__set_state(TopLevelThreadTracerOnlyUnhandledExceptions __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._args = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_37__pyx_unpickle_TopLevelThreadTracerNoBackFrame, 0, __pyx_n_s_pyx_unpickle_TopLevelThreadTra_2, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__91)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_TopLevelThreadTra_2, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_ThreadTracer(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14_pydevd_bundle_13pydevd_cython_39__pyx_unpickle_ThreadTracer, 0, __pyx_n_s_pyx_unpickle_ThreadTracer, NULL, __pyx_n_s_pydevd_bundle_pydevd_cython, __pyx_d, ((PyObject *)__pyx_codeobj__92)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_ThreadTracer, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_bundle/pydevd_cython.pyx":1 + * from __future__ import print_function # <<<<<<<<<<<<<< + * + * # Important: Autogenerated file. + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init _pydevd_bundle.pydevd_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init _pydevd_bundle.pydevd_cython"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* TupleAndListFromArray */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; itp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ +#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* PyObjectCallOneArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* RaiseUnexpectedTypeError */ +static int +__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) +{ + __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, + expected, obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* GetAttr3 */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +#endif +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + int res = PyObject_GetOptionalAttr(o, n, &r); + return (res != 0) ? r : __Pyx_NewRef(d); +#else + #if CYTHON_USE_TYPE_SLOTS + if (likely(PyString_Check(n))) { + r = __Pyx_PyObject_GetAttrStrNoError(o, n); + if (unlikely(!r) && likely(!PyErr_Occurred())) { + r = __Pyx_NewRef(d); + } + return r; + } + #endif + r = PyObject_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +#endif +} + +/* PyObjectCallNoArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { + PyObject *arg[2] = {NULL, NULL}; + return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* PyObjectLookupSpecial */ +#if CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx__PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name, int with_error) { + PyObject *res; + PyTypeObject *tp = Py_TYPE(obj); +#if PY_MAJOR_VERSION < 3 + if (unlikely(PyInstance_Check(obj))) + return with_error ? __Pyx_PyObject_GetAttrStr(obj, attr_name) : __Pyx_PyObject_GetAttrStrNoError(obj, attr_name); +#endif + res = _PyType_Lookup(tp, attr_name); + if (likely(res)) { + descrgetfunc f = Py_TYPE(res)->tp_descr_get; + if (!f) { + Py_INCREF(res); + } else { + res = f(res, obj, (PyObject *)tp); + } + } else if (with_error) { + PyErr_SetObject(PyExc_AttributeError, attr_name); + } + return res; +} +#endif + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (unlikely(!j)) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_subscript) { + PyObject *r, *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return NULL; + r = mm->mp_subscript(o, key); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return sm->sq_item(o, i); + } + } +#else + if (is_list || !PyMapping_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* PyObjectSetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_setattro)) + return tp->tp_setattro(obj, attr_name, value); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_setattr)) + return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value); +#endif + return PyObject_SetAttr(obj, attr_name, value); +} +#endif + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* SliceObject */ +static CYTHON_INLINE int __Pyx_PyObject_SetSlice(PyObject* obj, PyObject* value, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, int wraparound) { + __Pyx_TypeName obj_type_name; +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_ass_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_ass_slice(obj, cstart, cstop, value); + } +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_ass_subscript)) +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + { + int result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_ass_subscript(obj, py_slice, value); +#else + result = value ? PyObject_SetItem(obj, py_slice, value) : PyObject_DelItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object does not support slice %.10s", + obj_type_name, value ? "assignment" : "deletion"); + __Pyx_DECREF_TypeName(obj_type_name); +bad: + return -1; +} + +/* PyObjectCall2Args */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { + PyObject *args[3] = {NULL, arg1, arg2}; + return __Pyx_PyObject_FastCall(function, args+1, 2 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* PyObjectGetMethod */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + __Pyx_TypeName type_name; + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR + if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) +#elif PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (likely(descr != NULL)) { + *method = descr; + return 0; + } + type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod1 */ +#if !(CYTHON_VECTORCALL && __PYX_LIMITED_VERSION_HEX >= 0x030C00A2) +static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) { + PyObject *result = __Pyx_PyObject_CallOneArg(method, arg); + Py_DECREF(method); + return result; +} +#endif +static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) { +#if CYTHON_VECTORCALL && __PYX_LIMITED_VERSION_HEX >= 0x030C00A2 + PyObject *args[2] = {obj, arg}; + (void) __Pyx_PyObject_GetMethod; + (void) __Pyx_PyObject_CallOneArg; + (void) __Pyx_PyObject_Call2Args; + return PyObject_VectorcallMethod(method_name, args, 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +#else + PyObject *method = NULL, *result; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_Call2Args(method, obj, arg); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) return NULL; + return __Pyx__PyObject_CallMethod1(method, arg); +#endif +} + +/* append */ +static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x) { + if (likely(PyList_CheckExact(L))) { + if (unlikely(__Pyx_PyList_Append(L, x) < 0)) return -1; + } else { + PyObject* retval = __Pyx_PyObject_CallMethod1(L, __pyx_n_s_append, x); + if (unlikely(!retval)) + return -1; + Py_DECREF(retval); + } + return 0; +} + +/* RaiseUnboundLocalError */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* IterFinish */ +static CYTHON_INLINE int __Pyx_IterFinish(void) { + PyObject* exc_type; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + exc_type = __Pyx_PyErr_CurrentExceptionType(); + if (unlikely(exc_type)) { + if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) + return -1; + __Pyx_PyErr_Clear(); + return 0; + } + return 0; +} + +/* set_iter */ +static CYTHON_INLINE PyObject* __Pyx_set_iterator(PyObject* iterable, int is_set, + Py_ssize_t* p_orig_length, int* p_source_is_set) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 + is_set = is_set || likely(PySet_CheckExact(iterable) || PyFrozenSet_CheckExact(iterable)); + *p_source_is_set = is_set; + if (likely(is_set)) { + *p_orig_length = PySet_Size(iterable); + Py_INCREF(iterable); + return iterable; + } +#else + CYTHON_UNUSED_VAR(is_set); + *p_source_is_set = 0; +#endif + *p_orig_length = 0; + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_set_iter_next( + PyObject* iter_obj, Py_ssize_t orig_length, + Py_ssize_t* ppos, PyObject **value, + int source_is_set) { + if (!CYTHON_COMPILING_IN_CPYTHON || PY_VERSION_HEX >= 0x030d0000 || unlikely(!source_is_set)) { + *value = PyIter_Next(iter_obj); + if (unlikely(!*value)) { + return __Pyx_IterFinish(); + } + CYTHON_UNUSED_VAR(orig_length); + CYTHON_UNUSED_VAR(ppos); + return 1; + } +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 + if (unlikely(PySet_GET_SIZE(iter_obj) != orig_length)) { + PyErr_SetString( + PyExc_RuntimeError, + "set changed size during iteration"); + return -1; + } + { + Py_hash_t hash; + int ret = _PySet_NextEntry(iter_obj, ppos, value, &hash); + assert (ret != -1); + if (likely(ret)) { + Py_INCREF(*value); + return 1; + } + } +#endif + return 0; +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* UnpackItemEndCheck */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } + return __Pyx_IterFinish(); +} + +/* ArgTypeTest */ +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* pyfrozenset_new */ +static CYTHON_INLINE PyObject* __Pyx_PyFrozenSet_New(PyObject* it) { + if (it) { + PyObject* result; +#if CYTHON_COMPILING_IN_PYPY + PyObject* args; + args = PyTuple_Pack(1, it); + if (unlikely(!args)) + return NULL; + result = PyObject_Call((PyObject*)&PyFrozenSet_Type, args, NULL); + Py_DECREF(args); + return result; +#else + if (PyFrozenSet_CheckExact(it)) { + Py_INCREF(it); + return it; + } + result = PyFrozenSet_New(it); + if (unlikely(!result)) + return NULL; + if ((PY_VERSION_HEX >= 0x031000A1) || likely(PySet_GET_SIZE(result))) + return result; + Py_DECREF(result); +#endif + } +#if CYTHON_USE_TYPE_SLOTS + return PyFrozenSet_Type.tp_new(&PyFrozenSet_Type, __pyx_empty_tuple, NULL); +#else + return PyObject_Call((PyObject*)&PyFrozenSet_Type, __pyx_empty_tuple, NULL); +#endif +} + +/* py_set_discard_unhashable */ +static int __Pyx_PySet_DiscardUnhashable(PyObject *set, PyObject *key) { + PyObject *tmpkey; + int rv; + if (likely(!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))) + return -1; + PyErr_Clear(); + tmpkey = __Pyx_PyFrozenSet_New(key); + if (tmpkey == NULL) + return -1; + rv = PySet_Discard(set, tmpkey); + Py_DECREF(tmpkey); + return rv; +} + +/* py_set_discard */ +static CYTHON_INLINE int __Pyx_PySet_Discard(PyObject *set, PyObject *key) { + int found = PySet_Discard(set, key); + if (unlikely(found < 0)) { + found = __Pyx_PySet_DiscardUnhashable(set, key); + } + return found; +} + +/* PySetContains */ +static int __Pyx_PySet_ContainsUnhashable(PyObject *set, PyObject *key) { + int result = -1; + if (PySet_Check(key) && PyErr_ExceptionMatches(PyExc_TypeError)) { + PyObject *tmpkey; + PyErr_Clear(); + tmpkey = __Pyx_PyFrozenSet_New(key); + if (tmpkey != NULL) { + result = PySet_Contains(set, tmpkey); + Py_DECREF(tmpkey); + } + } + return result; +} +static CYTHON_INLINE int __Pyx_PySet_ContainsTF(PyObject* key, PyObject* set, int eq) { + int result = PySet_Contains(set, key); + if (unlikely(result < 0)) { + result = __Pyx_PySet_ContainsUnhashable(set, key); + } + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_value = exc_info->exc_value; + exc_info->exc_value = *value; + if (tmp_value == NULL || tmp_value == Py_None) { + Py_XDECREF(tmp_value); + tmp_value = NULL; + tmp_type = NULL; + tmp_tb = NULL; + } else { + tmp_type = (PyObject*) Py_TYPE(tmp_value); + Py_INCREF(tmp_type); + #if CYTHON_COMPILING_IN_CPYTHON + tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; + Py_XINCREF(tmp_tb); + #else + tmp_tb = PyException_GetTraceback(tmp_value); + #endif + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* PyIntBinop */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AndObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) { + CYTHON_MAYBE_UNUSED_VAR(intval); + CYTHON_MAYBE_UNUSED_VAR(inplace); + CYTHON_UNUSED_VAR(zerodivision_check); + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long a = PyInt_AS_LONG(op1); + + return PyInt_FromLong(a & b); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + if ((intval & PyLong_MASK) == intval) { + long last_digit = (long) __Pyx_PyLong_Digits(op1)[0]; + long result = intval & (likely(__Pyx_PyLong_IsPos(op1)) ? last_digit : (PyLong_MASK - last_digit + 1)); + return PyLong_FromLong(result); + } + if (unlikely(__Pyx_PyLong_IsZero(op1))) { + return __Pyx_NewRef(op1); + } + if (likely(__Pyx_PyLong_IsCompact(op1))) { + a = __Pyx_PyLong_CompactValue(op1); + } else { + const digit* digits = __Pyx_PyLong_Digits(op1); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1); + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_and(op1, op2); + } + } + x = a & b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla & llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + return (inplace ? PyNumber_InPlaceAnd : PyNumber_And)(op1, op2); +} +#endif + +/* UnpackUnboundCMethod */ +static PyObject *__Pyx_SelflessCall(PyObject *method, PyObject *args, PyObject *kwargs) { + PyObject *result; + PyObject *selfless_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); + if (unlikely(!selfless_args)) return NULL; + result = PyObject_Call(method, selfless_args, kwargs); + Py_DECREF(selfless_args); + return result; +} +static PyMethodDef __Pyx_UnboundCMethod_Def = { + "CythonUnboundCMethod", + __PYX_REINTERPRET_FUNCION(PyCFunction, __Pyx_SelflessCall), + METH_VARARGS | METH_KEYWORDS, + NULL +}; +static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) { + PyObject *method; + method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name); + if (unlikely(!method)) + return -1; + target->method = method; +#if CYTHON_COMPILING_IN_CPYTHON + #if PY_MAJOR_VERSION >= 3 + if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type))) + #else + if (likely(!__Pyx_CyOrPyCFunction_Check(method))) + #endif + { + PyMethodDescrObject *descr = (PyMethodDescrObject*) method; + target->func = descr->d_method->ml_meth; + target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS); + } else +#endif +#if CYTHON_COMPILING_IN_PYPY +#else + if (PyCFunction_Check(method)) +#endif + { + PyObject *self; + int self_found; +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + self = PyObject_GetAttrString(method, "__self__"); + if (!self) { + PyErr_Clear(); + } +#else + self = PyCFunction_GET_SELF(method); +#endif + self_found = (self && self != Py_None); +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + Py_XDECREF(self); +#endif + if (self_found) { + PyObject *unbound_method = PyCFunction_New(&__Pyx_UnboundCMethod_Def, method); + if (unlikely(!unbound_method)) return -1; + Py_DECREF(method); + target->method = unbound_method; + } + } + return 0; +} + +/* CallUnboundCMethod1 */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg) { + if (likely(cfunc->func)) { + int flag = cfunc->flag; + if (flag == METH_O) { + return (*(cfunc->func))(self, arg); + } else if ((PY_VERSION_HEX >= 0x030600B1) && flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + #endif + } else if ((PY_VERSION_HEX >= 0x030700A0) && flag == (METH_FASTCALL | METH_KEYWORDS)) { + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + } + } + return __Pyx__CallUnboundCMethod1(cfunc, self, arg); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 1, arg); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(2, self, arg); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* CallUnboundCMethod2 */ +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2) { + if (likely(cfunc->func)) { + PyObject *args[2] = {arg1, arg2}; + if (cfunc->flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + #if PY_VERSION_HEX >= 0x030700A0 + if (cfunc->flag == (METH_FASTCALL | METH_KEYWORDS)) + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + return __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(3); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 1, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 2, arg2); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(3, self, arg1, arg2); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* dict_getitem_default */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) { + PyObject* value; +#if PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (unlikely(PyErr_Occurred())) + return NULL; + value = default_value; + } + Py_INCREF(value); + if ((1)); +#else + if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) { + value = PyDict_GetItem(d, key); + if (unlikely(!value)) { + value = default_value; + } + Py_INCREF(value); + } +#endif + else { + if (default_value == Py_None) + value = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_get, d, key); + else + value = __Pyx_CallUnboundCMethod2(&__pyx_umethod_PyDict_Type_get, d, key, default_value); + } + return value; +} + +/* PyObjectCallMethod0 */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { + PyObject *method = NULL, *result = NULL; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_CallOneArg(method, obj); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) goto bad; + result = __Pyx_PyObject_CallNoArg(method); + Py_DECREF(method); +bad: + return result; +} + +/* UnpackTupleError */ +static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(index); + } +} + +/* UnpackTuple2 */ +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { + PyObject *value1 = NULL, *value2 = NULL; +#if CYTHON_COMPILING_IN_PYPY + value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; + value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; +#else + value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); + value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); +#endif + if (decref_tuple) { + Py_DECREF(tuple); + } + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +#if CYTHON_COMPILING_IN_PYPY +bad: + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +#endif +} +static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, + int has_known_size, int decref_tuple) { + Py_ssize_t index; + PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; + iternextfunc iternext; + iter = PyObject_GetIter(tuple); + if (unlikely(!iter)) goto bad; + if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } + iternext = __Pyx_PyObject_GetIterNextFunc(iter); + value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } + value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } + if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; + Py_DECREF(iter); + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +unpacking_failed: + if (!has_known_size && __Pyx_IterFinish() == 0) + __Pyx_RaiseNeedMoreValuesError(index); +bad: + Py_XDECREF(iter); + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +} + +/* dict_iter */ +#if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +#include +#endif +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_source_is_dict) { + is_dict = is_dict || likely(PyDict_CheckExact(iterable)); + *p_source_is_dict = is_dict; + if (is_dict) { +#if !CYTHON_COMPILING_IN_PYPY + *p_orig_length = PyDict_Size(iterable); + Py_INCREF(iterable); + return iterable; +#elif PY_MAJOR_VERSION >= 3 + static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; + PyObject **pp = NULL; + if (method_name) { + const char *name = PyUnicode_AsUTF8(method_name); + if (strcmp(name, "iteritems") == 0) pp = &py_items; + else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; + else if (strcmp(name, "itervalues") == 0) pp = &py_values; + if (pp) { + if (!*pp) { + *pp = PyUnicode_FromString(name + 4); + if (!*pp) + return NULL; + } + method_name = *pp; + } + } +#endif + } + *p_orig_length = 0; + if (method_name) { + PyObject* iter; + iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); + if (!iterable) + return NULL; +#if !CYTHON_COMPILING_IN_PYPY + if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) + return iterable; +#endif + iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + return iter; + } + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_dict_iter_next( + PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { + PyObject* next_item; +#if !CYTHON_COMPILING_IN_PYPY + if (source_is_dict) { + PyObject *key, *value; + if (unlikely(orig_length != PyDict_Size(iter_obj))) { + PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); + return -1; + } + if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { + return 0; + } + if (pitem) { + PyObject* tuple = PyTuple_New(2); + if (unlikely(!tuple)) { + return -1; + } + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(tuple, 0, key); + PyTuple_SET_ITEM(tuple, 1, value); + *pitem = tuple; + } else { + if (pkey) { + Py_INCREF(key); + *pkey = key; + } + if (pvalue) { + Py_INCREF(value); + *pvalue = value; + } + } + return 1; + } else if (PyTuple_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyTuple_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else if (PyList_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyList_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else +#endif + { + next_item = PyIter_Next(iter_obj); + if (unlikely(!next_item)) { + return __Pyx_IterFinish(); + } + } + if (pitem) { + *pitem = next_item; + } else if (pkey && pvalue) { + if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) + return -1; + } else if (pkey) { + *pkey = next_item; + } else { + *pvalue = next_item; + } + return 1; +} + +/* DictGetItem */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* SliceObject */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, int wraparound) { + __Pyx_TypeName obj_type_name; +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is unsliceable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); +bad: + return NULL; +} + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* HasAttr */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (!r) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} + +/* PyIntBinop */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) { + CYTHON_MAYBE_UNUSED_VAR(intval); + CYTHON_MAYBE_UNUSED_VAR(inplace); + CYTHON_UNUSED_VAR(zerodivision_check); + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + + x = (long)((unsigned long)a + (unsigned long)b); + if (likely((x^a) >= 0 || (x^b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + if (unlikely(__Pyx_PyLong_IsZero(op1))) { + return __Pyx_NewRef(op2); + } + if (likely(__Pyx_PyLong_IsCompact(op1))) { + a = __Pyx_PyLong_CompactValue(op1); + } else { + const digit* digits = __Pyx_PyLong_Digits(op1); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1); + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + } + x = a + b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla + llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; +#if CYTHON_COMPILING_IN_LIMITED_API + double a = __pyx_PyFloat_AsDouble(op1); +#else + double a = PyFloat_AS_DOUBLE(op1); +#endif + double result; + + PyFPE_START_PROTECT("add", return NULL) + result = ((double)a) + (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); +} +#endif + +/* SliceTupleAndList */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_crop_slice(Py_ssize_t* _start, Py_ssize_t* _stop, Py_ssize_t* _length) { + Py_ssize_t start = *_start, stop = *_stop, length = *_length; + if (start < 0) { + start += length; + if (start < 0) + start = 0; + } + if (stop < 0) + stop += length; + else if (stop > length) + stop = length; + *_length = stop - start; + *_start = start; + *_stop = stop; +} +static CYTHON_INLINE PyObject* __Pyx_PyList_GetSlice( + PyObject* src, Py_ssize_t start, Py_ssize_t stop) { + Py_ssize_t length = PyList_GET_SIZE(src); + __Pyx_crop_slice(&start, &stop, &length); + if (length <= 0) { + return PyList_New(0); + } + return __Pyx_PyList_FromArray(((PyListObject*)src)->ob_item + start, length); +} +static CYTHON_INLINE PyObject* __Pyx_PyTuple_GetSlice( + PyObject* src, Py_ssize_t start, Py_ssize_t stop) { + Py_ssize_t length = PyTuple_GET_SIZE(src); + __Pyx_crop_slice(&start, &stop, &length); + return __Pyx_PyTuple_FromArray(((PyTupleObject*)src)->ob_item + start, length); +} +#endif + +/* PyIntCompare */ +static CYTHON_INLINE int __Pyx_PyInt_BoolEqObjC(PyObject *op1, PyObject *op2, long intval, long inplace) { + CYTHON_MAYBE_UNUSED_VAR(intval); + CYTHON_UNUSED_VAR(inplace); + if (op1 == op2) { + return 1; + } + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long a = PyInt_AS_LONG(op1); + return (a == b); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + int unequal; + unsigned long uintval; + Py_ssize_t size = __Pyx_PyLong_DigitCount(op1); + const digit* digits = __Pyx_PyLong_Digits(op1); + if (intval == 0) { + return (__Pyx_PyLong_IsZero(op1) == 1); + } else if (intval < 0) { + if (__Pyx_PyLong_IsNonNeg(op1)) + return 0; + intval = -intval; + } else { + if (__Pyx_PyLong_IsNeg(op1)) + return 0; + } + uintval = (unsigned long) intval; +#if PyLong_SHIFT * 4 < SIZEOF_LONG*8 + if (uintval >> (PyLong_SHIFT * 4)) { + unequal = (size != 5) || (digits[0] != (uintval & (unsigned long) PyLong_MASK)) + | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[3] != ((uintval >> (3 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[4] != ((uintval >> (4 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)); + } else +#endif +#if PyLong_SHIFT * 3 < SIZEOF_LONG*8 + if (uintval >> (PyLong_SHIFT * 3)) { + unequal = (size != 4) || (digits[0] != (uintval & (unsigned long) PyLong_MASK)) + | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[3] != ((uintval >> (3 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)); + } else +#endif +#if PyLong_SHIFT * 2 < SIZEOF_LONG*8 + if (uintval >> (PyLong_SHIFT * 2)) { + unequal = (size != 3) || (digits[0] != (uintval & (unsigned long) PyLong_MASK)) + | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)); + } else +#endif +#if PyLong_SHIFT * 1 < SIZEOF_LONG*8 + if (uintval >> (PyLong_SHIFT * 1)) { + unequal = (size != 2) || (digits[0] != (uintval & (unsigned long) PyLong_MASK)) + | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)); + } else +#endif + unequal = (size != 1) || (((unsigned long) digits[0]) != (uintval & (unsigned long) PyLong_MASK)); + return (unequal == 0); + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; +#if CYTHON_COMPILING_IN_LIMITED_API + double a = __pyx_PyFloat_AsDouble(op1); +#else + double a = PyFloat_AS_DOUBLE(op1); +#endif + return ((double)a == (double)b); + } + return __Pyx_PyObject_IsTrueAndDecref( + PyObject_RichCompare(op1, op2, Py_EQ)); +} + +/* ObjectGetItem */ +#if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) { + PyObject *runerr = NULL; + Py_ssize_t key_value; + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index)); + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, + "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name); + __Pyx_DECREF_TypeName(index_type_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) { + __Pyx_TypeName obj_type_name; + if (likely(PyType_Check(obj))) { + PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem); + if (!meth) { + PyErr_Clear(); + } else { + PyObject *result = __Pyx_PyObject_CallOneArg(meth, key); + Py_DECREF(meth); + return result; + } + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) { + PyTypeObject *tp = Py_TYPE(obj); + PyMappingMethods *mm = tp->tp_as_mapping; + PySequenceMethods *sm = tp->tp_as_sequence; + if (likely(mm && mm->mp_subscript)) { + return mm->mp_subscript(obj, key); + } + if (likely(sm && sm->sq_item)) { + return __Pyx_PyObject_GetIndex(obj, key); + } + return __Pyx_PyObject_GetItem_Slow(obj, key); +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + const char* module_name_str = 0; + PyObject* module_name = 0; + PyObject* module_dot = 0; + PyObject* full_name = 0; + PyErr_Clear(); + module_name_str = PyModule_GetName(module); + if (unlikely(!module_name_str)) { goto modbad; } + module_name = PyUnicode_FromString(module_name_str); + if (unlikely(!module_name)) { goto modbad; } + module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__10); + if (unlikely(!module_dot)) { goto modbad; } + full_name = PyUnicode_Concat(module_dot, name); + if (unlikely(!full_name)) { goto modbad; } + #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + { + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + goto modbad; + value = PyObject_GetItem(modules, full_name); + } + #else + value = PyImport_GetModule(full_name); + #endif + modbad: + Py_XDECREF(full_name); + Py_XDECREF(module_dot); + Py_XDECREF(module_name); + } + if (unlikely(!value)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* FixUpExtensionType */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* ValidateBasesTuple */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { + Py_ssize_t i, n; +#if CYTHON_ASSUME_SAFE_MACROS + n = PyTuple_GET_SIZE(bases); +#else + n = PyTuple_Size(bases); + if (n < 0) return -1; +#endif + for (i = 1; i < n; i++) + { +#if CYTHON_AVOID_BORROWED_REFS + PyObject *b0 = PySequence_GetItem(bases, i); + if (!b0) return -1; +#elif CYTHON_ASSUME_SAFE_MACROS + PyObject *b0 = PyTuple_GET_ITEM(bases, i); +#else + PyObject *b0 = PyTuple_GetItem(bases, i); + if (!b0) return -1; +#endif + PyTypeObject *b; +#if PY_MAJOR_VERSION < 3 + if (PyClass_Check(b0)) + { + PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", + PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } +#endif + b = (PyTypeObject*) b0; + if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); + __Pyx_DECREF_TypeName(b_name); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + if (dictoffset == 0) + { + Py_ssize_t b_dictoffset = 0; +#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + b_dictoffset = b->tp_dictoffset; +#else + PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); + if (!py_b_dictoffset) goto dictoffset_return; + b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); + Py_DECREF(py_b_dictoffset); + if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; +#endif + if (b_dictoffset) { + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "extension type '%.200s' has no __dict__ slot, " + "but base type '" __Pyx_FMT_TYPENAME "' has: " + "either add 'cdef dict __dict__' to the extension type " + "or add '__slots__ = [...]' to the base type", + type_name, b_name); + __Pyx_DECREF_TypeName(b_name); + } +#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) + dictoffset_return: +#endif +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + } +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + } + return 0; +} +#endif + +/* PyType_Ready */ +static int __Pyx_PyType_Ready(PyTypeObject *t) { +#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) + (void)__Pyx_PyObject_CallMethod0; +#if CYTHON_USE_TYPE_SPECS + (void)__Pyx_validate_bases_tuple; +#endif + return PyType_Ready(t); +#else + int r; + PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); + if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) + return -1; +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + { + int gc_was_enabled; + #if PY_VERSION_HEX >= 0x030A00b1 + gc_was_enabled = PyGC_Disable(); + (void)__Pyx_PyObject_CallMethod0; + #else + PyObject *ret, *py_status; + PyObject *gc = NULL; + #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) + gc = PyImport_GetModule(__pyx_kp_u_gc); + #endif + if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); + if (unlikely(!gc)) return -1; + py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); + if (unlikely(!py_status)) { + Py_DECREF(gc); + return -1; + } + gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); + Py_DECREF(py_status); + if (gc_was_enabled > 0) { + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); + if (unlikely(!ret)) { + Py_DECREF(gc); + return -1; + } + Py_DECREF(ret); + } else if (unlikely(gc_was_enabled == -1)) { + Py_DECREF(gc); + return -1; + } + #endif + t->tp_flags |= Py_TPFLAGS_HEAPTYPE; +#if PY_VERSION_HEX >= 0x030A0000 + t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; +#endif +#else + (void)__Pyx_PyObject_CallMethod0; +#endif + r = PyType_Ready(t); +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + #if PY_VERSION_HEX >= 0x030A00b1 + if (gc_was_enabled) + PyGC_Enable(); + #else + if (gc_was_enabled) { + PyObject *tp, *v, *tb; + PyErr_Fetch(&tp, &v, &tb); + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); + if (likely(ret || r == -1)) { + Py_XDECREF(ret); + PyErr_Restore(tp, v, tb); + } else { + Py_XDECREF(tp); + Py_XDECREF(v); + Py_XDECREF(tb); + r = -1; + } + } + Py_DECREF(gc); + #endif + } +#endif + return r; +#endif +} + +/* PyObject_GenericGetAttrNoDict */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, attr_name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(attr_name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* SetVTable */ +static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { + PyObject *ob = PyCapsule_New(vtable, 0, 0); + if (unlikely(!ob)) + goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) +#else + if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) +#endif + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* GetVTable */ +static void* __Pyx_GetVtable(PyTypeObject *type) { + void* ptr; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); +#else + PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); +#endif + if (!ob) + goto bad; + ptr = PyCapsule_GetPointer(ob, 0); + if (!ptr && !PyErr_Occurred()) + PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); + Py_DECREF(ob); + return ptr; +bad: + Py_XDECREF(ob); + return NULL; +} + +/* MergeVTables */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type) { + int i; + void** base_vtables; + __Pyx_TypeName tp_base_name; + __Pyx_TypeName base_name; + void* unknown = (void*)-1; + PyObject* bases = type->tp_bases; + int base_depth = 0; + { + PyTypeObject* base = type->tp_base; + while (base) { + base_depth += 1; + base = base->tp_base; + } + } + base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); + base_vtables[0] = unknown; + for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { + void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); + if (base_vtable != NULL) { + int j; + PyTypeObject* base = type->tp_base; + for (j = 0; j < base_depth; j++) { + if (base_vtables[j] == unknown) { + base_vtables[j] = __Pyx_GetVtable(base); + base_vtables[j + 1] = unknown; + } + if (base_vtables[j] == base_vtable) { + break; + } else if (base_vtables[j] == NULL) { + goto bad; + } + base = base->tp_base; + } + } + } + PyErr_Clear(); + free(base_vtables); + return 0; +bad: + tp_base_name = __Pyx_PyType_GetName(type->tp_base); + base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); + PyErr_Format(PyExc_TypeError, + "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); + __Pyx_DECREF_TypeName(tp_base_name); + __Pyx_DECREF_TypeName(base_name); + free(base_vtables); + return -1; +} +#endif + +/* SetupReduce */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; + PyObject *getstate = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); +#else + getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); + if (!getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (getstate) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); +#else + object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); + if (!object_getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (object_getstate != getstate) { + goto __PYX_GOOD; + } + } +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) { + __Pyx_TypeName type_obj_name = + __Pyx_PyType_GetName((PyTypeObject*)type_obj); + PyErr_Format(PyExc_RuntimeError, + "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); + __Pyx_DECREF_TypeName(type_obj_name); + } + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); + Py_XDECREF(object_getstate); + Py_XDECREF(getstate); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} +#endif + +/* TypeImport */ +#ifndef __PYX_HAVE_RT_ImportType_3_0_11 +#define __PYX_HAVE_RT_ImportType_3_0_11 +static PyTypeObject *__Pyx_ImportType_3_0_11(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_11 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_11 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_11 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* ImportDottedModule */ +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__19; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FetchSharedCythonModule */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ +static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ +#if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if PY_VERSION_HEX >= 0x030d00A4 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* CLineInTraceback */ +#ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +/* CIntFromPyVerify */ +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4 + if (is_unsigned) { + return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1); + } else { + return PyLong_FromNativeBytes(bytes, sizeof(value), -1); + } +#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + int one = 1; int little = (int)*(unsigned char *)&one; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + int one = 1; int little = (int)*(unsigned char *)&one; + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } +#endif + if (unlikely(!PyLong_Check(x))) { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + int ret = -1; +#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API + Py_ssize_t bytes_copied = PyLong_AsNativeBytes( + x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0)); + if (unlikely(bytes_copied == -1)) { + } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) { + goto raise_overflow; + } else { + ret = 0; + } +#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)x, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *v; + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (likely(PyLong_CheckExact(x))) { + v = __Pyx_NewRef(x); + } else { + v = PyNumber_Long(x); + if (unlikely(!v)) return (int) -1; + assert(PyLong_CheckExact(v)); + } + { + int result = PyObject_RichCompareBool(v, Py_False, Py_LT); + if (unlikely(result < 0)) { + Py_DECREF(v); + return (int) -1; + } + is_negative = result == 1; + } + if (is_unsigned && unlikely(is_negative)) { + Py_DECREF(v); + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + Py_DECREF(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = v; + } + v = NULL; + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + long idigit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + val |= ((int) idigit) << bits; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + } + Py_DECREF(shift); shift = NULL; + Py_DECREF(mask); mask = NULL; + { + long idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + } + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + if (unlikely(ret)) + return (int) -1; + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } +#endif + if (unlikely(!PyLong_Check(x))) { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + int ret = -1; +#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API + Py_ssize_t bytes_copied = PyLong_AsNativeBytes( + x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0)); + if (unlikely(bytes_copied == -1)) { + } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) { + goto raise_overflow; + } else { + ret = 0; + } +#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)x, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *v; + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (likely(PyLong_CheckExact(x))) { + v = __Pyx_NewRef(x); + } else { + v = PyNumber_Long(x); + if (unlikely(!v)) return (long) -1; + assert(PyLong_CheckExact(v)); + } + { + int result = PyObject_RichCompareBool(v, Py_False, Py_LT); + if (unlikely(result < 0)) { + Py_DECREF(v); + return (long) -1; + } + is_negative = result == 1; + } + if (is_unsigned && unlikely(is_negative)) { + Py_DECREF(v); + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + Py_DECREF(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = v; + } + v = NULL; + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + long idigit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + val |= ((long) idigit) << bits; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + } + Py_DECREF(shift); shift = NULL; + Py_DECREF(mask); mask = NULL; + { + long idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + } + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + if (unlikely(ret)) + return (long) -1; + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4 + if (is_unsigned) { + return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1); + } else { + return PyLong_FromNativeBytes(bytes, sizeof(value), -1); + } +#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + int one = 1; int little = (int)*(unsigned char *)&one; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + int one = 1; int little = (int)*(unsigned char *)&one; + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* FormatTypeName */ +#if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_kp_s__4); + } + return name; +} +#endif + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* FunctionExport */ +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) { + PyObject *d = 0; + PyObject *cobj = 0; + union { + void (*fp)(void); + void *p; + } tmp; + d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__"); + if (!d) { + PyErr_Clear(); + d = PyDict_New(); + if (!d) + goto bad; + Py_INCREF(d); + if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0) + goto bad; + } + tmp.fp = f; + cobj = PyCapsule_New(tmp.p, sig, 0); + if (!cobj) + goto bad; + if (PyDict_SetItemString(d, name, cobj) < 0) + goto bad; + Py_DECREF(cobj); + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(cobj); + Py_XDECREF(d); + return -1; +} + +/* InitStrings */ +#if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.cpython-312-x86_64-linux-gnu.so b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.cpython-312-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..0bcb94669924f4b3ca2e191e996c0bac57506342 GIT binary patch literal 4988896 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

    FaVB-gya3d&i*0I2}n33s<2C8@AxCUTwUh0N;< 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

    xgcgZ_5fuD#bbxil*2)Qia*xb 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

    G_&`-&6f!rX*5zXRAfzyT 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�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%0DBUz|OIahPVLO&dNn@ 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

    5Zc#DhS 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%0AcJ?6thVKM(Qf3n5h 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�R%2!MjlSBhvK|6S#g_Skp)^$& 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

    (U2D=33e&f1 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 topmost frame + current_frames = _current_frames() + topmost_frame = current_frames.get(thread._ident) + if topmost_frame is None: + # Note: this is expected for dummy threads (so, getting the topmost frame should be + # treated as optional). + pydev_log.info( + "Unable to get topmost frame for thread: %s, thread.ident: %s, id(thread): %s\nCurrent frames: %s.\n" "GEVENT_SUPPORT: %s", + thread, + thread.ident, + id(thread), + current_frames, + SUPPORT_GEVENT, + ) + + return topmost_frame + + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cpdef update_stepping_info(self): + # ELSE +# def update_stepping_info(self): + # ENDIF + # fmt: on + _update_stepping_info(self) + + def __str__(self): + return "State:%s Stop:%s Cmd: %s Kill:%s" % (self.pydev_state, self.pydev_step_stop, self.pydev_step_cmd, self.pydev_notify_kill) + + +_set_additional_thread_info_lock = ForkSafeLock() +_next_additional_info = [PyDBAdditionalThreadInfo()] + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef set_additional_thread_info(thread): +# ELSE +# def set_additional_thread_info(thread): +# ENDIF +# fmt: on + try: + additional_info = thread.additional_info + if additional_info is None: + raise AttributeError() + except: + with _set_additional_thread_info_lock: + # If it's not there, set it within a lock to avoid any racing + # conditions. + try: + additional_info = thread.additional_info + except: + additional_info = None + + if additional_info is None: + # Note: don't call PyDBAdditionalThreadInfo constructor at this + # point as it can piggy-back into the debugger which could + # get here again, rather get the global ref which was pre-created + # and add a new entry only after we set thread.additional_info. + additional_info = _next_additional_info[0] + thread.additional_info = additional_info + additional_info.weak_thread = weakref.ref(thread) + add_additional_info(additional_info) + del _next_additional_info[:] + _next_additional_info.append(PyDBAdditionalThreadInfo()) + + return additional_info + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef set _all_infos +cdef set _infos_stepping +cdef object _update_infos_lock +# ELSE +# ENDIF +# fmt: on + +_all_infos = set() +_infos_stepping = set() +_update_infos_lock = ForkSafeLock() + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _update_stepping_info(PyDBAdditionalThreadInfo info): +# ELSE +# def _update_stepping_info(info): +# ENDIF +# fmt: on + + global _infos_stepping + global _all_infos + + with _update_infos_lock: + # Removes entries that are no longer valid. + new_all_infos = set() + for info in _all_infos: + if info._get_related_thread() is not None: + new_all_infos.add(info) + _all_infos = new_all_infos + + new_stepping = set() + for info in _all_infos: + if info._is_stepping(): + new_stepping.add(info) + _infos_stepping = new_stepping + + py_db = get_global_debugger() + if py_db is not None and not py_db.pydb_disposed: + thread = info.weak_thread() + if thread is not None: + thread_id = get_thread_id(thread) + _queue, event = py_db.get_internal_queue_and_event(thread_id) + event.set() + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef add_additional_info(PyDBAdditionalThreadInfo info): +# ELSE +# def add_additional_info(info): +# ENDIF +# fmt: on + with _update_infos_lock: + _all_infos.add(info) + if info._is_stepping(): + _infos_stepping.add(info) + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef remove_additional_info(PyDBAdditionalThreadInfo info): +# ELSE +# def remove_additional_info(info): +# ENDIF +# fmt: on + with _update_infos_lock: + _all_infos.discard(info) + _infos_stepping.discard(info) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef bint any_thread_stepping(): +# ELSE +# def any_thread_stepping(): +# ENDIF +# fmt: on + return bool(_infos_stepping) +import linecache +import os.path +import re + +from _pydev_bundle import pydev_log +from _pydevd_bundle import pydevd_dont_trace +from _pydevd_bundle.pydevd_constants import ( + RETURN_VALUES_DICT, + NO_FTRACE, + EXCEPTION_TYPE_HANDLED, + EXCEPTION_TYPE_USER_UNHANDLED, + PYDEVD_IPYTHON_CONTEXT, + PYDEVD_USE_SYS_MONITORING, +) +from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame, just_raised, remove_exception_from_frame, ignore_exception_trace +from _pydevd_bundle.pydevd_utils import get_clsname_for_code +from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame +from _pydevd_bundle.pydevd_comm_constants import constant_to_str, CMD_SET_FUNCTION_BREAK +import sys + +try: + from _pydevd_bundle.pydevd_bytecode_utils import get_smart_step_into_variant_from_frame_offset +except ImportError: + + def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): + return None + +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +# ELSE +# # Note: those are now inlined on cython. +# 107 = 107 +# 144 = 144 +# 109 = 109 +# 160 = 160 +# 108 = 108 +# 159 = 159 +# 137 = 137 +# 111 = 111 +# 128 = 128 +# 206 = 206 +# 1 = 1 +# 2 = 2 +# ENDIF + +basename = os.path.basename + +IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") +DEBUG_START = ("pydevd.py", "run") +DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") +TRACE_PROPERTY = "pydevd_traceproperty.py" + +import dis + +try: + StopAsyncIteration +except NameError: + StopAsyncIteration = StopIteration + + +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +def is_unhandled_exception(container_obj, py_db, frame, int last_raise_line, set raise_lines): +# ELSE +# def is_unhandled_exception(container_obj, py_db, frame, last_raise_line, raise_lines): + # ENDIF + if frame.f_lineno in raise_lines: + return True + + else: + try_except_infos = container_obj.try_except_infos + if try_except_infos is None: + container_obj.try_except_infos = try_except_infos = py_db.collect_try_except_info(frame.f_code) + + if not try_except_infos: + # Consider the last exception as unhandled because there's no try..except in it. + return True + else: + # Now, consider only the try..except for the raise + valid_try_except_infos = [] + for try_except_info in try_except_infos: + if try_except_info.is_line_in_try_block(last_raise_line): + valid_try_except_infos.append(try_except_info) + + if not valid_try_except_infos: + return True + + else: + # Note: check all, not only the "valid" ones to cover the case + # in "tests_python.test_tracing_on_top_level.raise_unhandled10" + # where one try..except is inside the other with only a raise + # and it's gotten in the except line. + for try_except_info in try_except_infos: + if try_except_info.is_line_in_except_block(frame.f_lineno): + if frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except: + # In a raise inside a try..except block or some except which doesn't + # match the raised exception. + return True + return False + + +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class _TryExceptContainerObj: + cdef public list try_except_infos; + def __init__(self): + self.try_except_infos = None +# ELSE +# class _TryExceptContainerObj(object): +# """ +# A dumb container object just to contain the try..except info when needed. Meant to be +# persistent among multiple PyDBFrames to the same code object. +# """ +# +# try_except_infos = None +# +# ENDIF + + +# ======================================================================================================================= +# PyDBFrame +# ======================================================================================================================= +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class PyDBFrame: +# ELSE +# class PyDBFrame: +# """This makes the tracing for a given frame, so, the trace_dispatch +# is used initially when we enter into a new context ('call') and then +# is reused for the entire context. +# """ +# + # ENDIF + + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef tuple _args + cdef int should_skip + cdef object exc_info + def __init__(self, tuple args): + self._args = args # In the cython version we don't need to pass the frame + self.should_skip = -1 # On cythonized version, put in instance. + self.exc_info = () + # ELSE +# should_skip = -1 # Default value in class (put in instance on set). +# exc_info = () # Default value in class (put in instance on set). +# +# if PYDEVD_USE_SYS_MONITORING: +# +# def __init__(self, *args, **kwargs): +# raise RuntimeError("Not expected to be used in sys.monitoring.") +# +# else: +# +# def __init__(self, args): +# # args = py_db, abs_path_canonical_path_and_base, base, info, t, frame +# # yeap, much faster than putting in self and then getting it from self later on +# self._args = args + # ENDIF + + def set_suspend(self, *args, **kwargs): + self._args[0].set_suspend(*args, **kwargs) + + def do_wait_suspend(self, *args, **kwargs): + self._args[0].do_wait_suspend(*args, **kwargs) + + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + def trace_exception(self, frame, str event, arg): + cdef bint should_stop; + cdef tuple exc_info; + # ELSE +# def trace_exception(self, frame, event, arg): + # ENDIF + if event == "exception": + should_stop, frame, exc_info = should_stop_on_exception(self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info) + self.exc_info = exc_info + + if should_stop: + if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + return self.trace_dispatch + + elif event == "return": + exc_info = self.exc_info + if exc_info and arg is None: + frame_skips_cache, frame_cache_key = self._args[4], self._args[5] + custom_key = (frame_cache_key, "try_exc_info") + container_obj = frame_skips_cache.get(custom_key) + if container_obj is None: + container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( + frame + ): + return self.trace_dispatch + + return self.trace_exception + + def handle_user_exception(self, frame): + exc_info = self.exc_info + if exc_info: + return handle_exception(self._args[0], self._args[3], frame, exc_info[0], EXCEPTION_TYPE_USER_UNHANDLED) + return False + + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef get_func_name(self, frame): + cdef str func_name + # ELSE +# def get_func_name(self, frame): + # ENDIF + code_obj = frame.f_code + func_name = code_obj.co_name + try: + cls_name = get_clsname_for_code(code_obj, frame) + if cls_name is not None: + return "%s.%s" % (cls_name, func_name) + else: + return func_name + except: + pydev_log.exception() + return func_name + + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef _show_return_values(self, frame, arg): + # ELSE +# def _show_return_values(self, frame, arg): + # ENDIF + try: + try: + f_locals_back = getattr(frame.f_back, "f_locals", None) + if f_locals_back is not None: + return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + if return_values_dict is None: + return_values_dict = {} + f_locals_back[RETURN_VALUES_DICT] = return_values_dict + name = self.get_func_name(frame) + return_values_dict[name] = arg + except: + pydev_log.exception() + finally: + f_locals_back = None + + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef _remove_return_values(self, py_db, frame): + # ELSE +# def _remove_return_values(self, py_db, frame): + # ENDIF + try: + try: + # Showing return values was turned off, we should remove them from locals dict. + # The values can be in the current frame or in the back one + frame.f_locals.pop(RETURN_VALUES_DICT, None) + + f_locals_back = getattr(frame.f_back, "f_locals", None) + if f_locals_back is not None: + f_locals_back.pop(RETURN_VALUES_DICT, None) + except: + pydev_log.exception() + finally: + f_locals_back = None + + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef _get_unfiltered_back_frame(self, py_db, frame): + # ELSE +# def _get_unfiltered_back_frame(self, py_db, frame): + # ENDIF + f = frame.f_back + while f is not None: + if not py_db.is_files_filter_enabled: + return f + + else: + if py_db.apply_files_filter(f, f.f_code.co_filename, False): + f = f.f_back + + else: + return f + + return f + + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef _is_same_frame(self, target_frame, current_frame): + cdef PyDBAdditionalThreadInfo info; + # ELSE +# def _is_same_frame(self, target_frame, current_frame): + # ENDIF + if target_frame is current_frame: + return True + + info = self._args[2] + if info.pydev_use_scoped_step_frame: + # If using scoped step we don't check the target, we just need to check + # if the current matches the same heuristic where the target was defined. + if target_frame is not None and current_frame is not None: + if target_frame.f_code.co_filename == current_frame.f_code.co_filename: + # The co_name may be different (it may include the line number), but + # the filename must still be the same. + f = current_frame.f_back + if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + f = f.f_back + if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + return True + + return False + + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cpdef trace_dispatch(self, frame, str event, arg): + cdef tuple abs_path_canonical_path_and_base; + cdef bint is_exception_event; + cdef bint has_exception_breakpoints; + cdef bint can_skip; + cdef bint stop; + cdef bint stop_on_plugin_breakpoint; + cdef PyDBAdditionalThreadInfo info; + cdef int step_cmd; + cdef int line; + cdef bint is_line; + cdef bint is_call; + cdef bint is_return; + cdef bint should_stop; + cdef dict breakpoints_for_file; + cdef dict stop_info; + cdef str curr_func_name; + cdef dict frame_skips_cache; + cdef object frame_cache_key; + cdef tuple line_cache_key; + cdef int breakpoints_in_line_cache; + cdef int breakpoints_in_frame_cache; + cdef bint has_breakpoint_in_frame; + cdef bint is_coroutine_or_generator; + cdef int bp_line; + cdef object bp; + cdef int pydev_smart_parent_offset + cdef int pydev_smart_child_offset + cdef tuple pydev_smart_step_into_variants + # ELSE +# def trace_dispatch(self, frame, event, arg): + # ENDIF + # Note: this is a big function because most of the logic related to hitting a breakpoint and + # stepping is contained in it. Ideally this could be split among multiple functions, but the + # problem in this case is that in pure-python function calls are expensive and even more so + # when tracing is on (because each function call will get an additional tracing call). We + # try to address this by using the info.is_tracing for the fastest possible return, but the + # cost is still high (maybe we could use code-generation in the future and make the code + # generation be better split among what each part does). + + try: + # DEBUG = '_debugger_case_yield_from.py' in frame.f_code.co_filename + py_db, abs_path_canonical_path_and_base, info, thread, frame_skips_cache, frame_cache_key = self._args + # if DEBUG: print('frame trace_dispatch %s %s %s %s %s %s, stop: %s' % (frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename, event, constant_to_str(info.pydev_step_cmd), arg, info.pydev_step_stop)) + info.is_tracing += 1 + + # TODO: This shouldn't be needed. The fact that frame.f_lineno + # is None seems like a bug in Python 3.11. + # Reported in: https://github.com/python/cpython/issues/94485 + line = frame.f_lineno or 0 # Workaround or case where frame.f_lineno is None + line_cache_key = (frame_cache_key, line) + + if py_db.pydb_disposed: + return None if event == "call" else NO_FTRACE + + plugin_manager = py_db.plugin + has_exception_breakpoints = ( + py_db.break_on_caught_exceptions or py_db.break_on_user_uncaught_exceptions or py_db.has_plugin_exception_breaks + ) + + stop_frame = info.pydev_step_stop + step_cmd = info.pydev_step_cmd + function_breakpoint_on_call_event = None + + if frame.f_code.co_flags & 0xA0: # 0xa0 == CO_GENERATOR = 0x20 | CO_COROUTINE = 0x80 + # Dealing with coroutines and generators: + # When in a coroutine we change the perceived event to the debugger because + # a call, StopIteration exception and return are usually just pausing/unpausing it. + if event == "line": + is_line = True + is_call = False + is_return = False + is_exception_event = False + + elif event == "return": + is_line = False + is_call = False + is_return = True + is_exception_event = False + + returns_cache_key = (frame_cache_key, "returns") + return_lines = frame_skips_cache.get(returns_cache_key) + if return_lines is None: + # Note: we're collecting the return lines by inspecting the bytecode as + # there are multiple returns and multiple stop iterations when awaiting and + # it doesn't give any clear indication when a coroutine or generator is + # finishing or just pausing. + return_lines = set() + for x in py_db.collect_return_info(frame.f_code): + # Note: cython does not support closures in cpdefs (so we can't use + # a list comprehension). + return_lines.add(x.return_line) + + frame_skips_cache[returns_cache_key] = return_lines + + if line not in return_lines: + # Not really a return (coroutine/generator paused). + return self.trace_dispatch + else: + if self.exc_info: + self.handle_user_exception(frame) + return self.trace_dispatch + + # Tricky handling: usually when we're on a frame which is about to exit + # we set the step mode to step into, but in this case we'd end up in the + # asyncio internal machinery, which is not what we want, so, we just + # ask the stop frame to be a level up. + # + # Note that there's an issue here which we may want to fix in the future: if + # the back frame is a frame which is filtered, we won't stop properly. + # Solving this may not be trivial as we'd need to put a scope in the step + # in, but we may have to do it anyways to have a step in which doesn't end + # up in asyncio). + # + # Note2: we don't revert to a step in if we're doing scoped stepping + # (because on scoped stepping we're always receiving a call/line/return + # event for each line in ipython, so, we can't revert to step in on return + # as the return shouldn't mean that we've actually completed executing a + # frame in this case). + if stop_frame is frame and not info.pydev_use_scoped_step_frame: + if step_cmd in (108, 159, 107, 144): + f = self._get_unfiltered_back_frame(py_db, frame) + if f is not None: + info.pydev_step_cmd = 206 + info.pydev_step_stop = f + else: + if step_cmd == 108: + info.pydev_step_cmd = 107 + info.pydev_step_stop = None + + elif step_cmd == 159: + info.pydev_step_cmd = 144 + info.pydev_step_stop = None + + elif step_cmd == 206: + # We're exiting this one, so, mark the new coroutine context. + f = self._get_unfiltered_back_frame(py_db, frame) + if f is not None: + info.pydev_step_stop = f + else: + info.pydev_step_cmd = 107 + info.pydev_step_stop = None + + elif event == "exception": + breakpoints_for_file = None + if has_exception_breakpoints: + should_stop, frame, exc_info = should_stop_on_exception( + self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + ) + self.exc_info = exc_info + if should_stop: + if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + return self.trace_dispatch + + return self.trace_dispatch + else: + # event == 'call' or event == 'c_XXX' + return self.trace_dispatch + + else: # Not coroutine nor generator + if event == "line": + is_line = True + is_call = False + is_return = False + is_exception_event = False + + elif event == "return": + is_line = False + is_return = True + is_call = False + is_exception_event = False + + # If we are in single step mode and something causes us to exit the current frame, we need to make sure we break + # eventually. Force the step mode to step into and the step stop frame to None. + # I.e.: F6 in the end of a function should stop in the next possible position (instead of forcing the user + # to make a step in or step over at that location). + # Note: this is especially troublesome when we're skipping code with the + # @DontTrace comment. + if ( + stop_frame is frame + and not info.pydev_use_scoped_step_frame + and is_return + and step_cmd + in (108, 109, 159, 160, 128) + ): + if step_cmd in (108, 109, 128): + info.pydev_step_cmd = 107 + else: + info.pydev_step_cmd = 144 + info.pydev_step_stop = None + + if self.exc_info: + if self.handle_user_exception(frame): + return self.trace_dispatch + + elif event == "call": + is_line = False + is_call = True + is_return = False + is_exception_event = False + if frame.f_code.co_firstlineno == frame.f_lineno: # Check line to deal with async/await. + function_breakpoint_on_call_event = py_db.function_breakpoint_name_to_breakpoint.get(frame.f_code.co_name) + + elif event == "exception": + is_exception_event = True + breakpoints_for_file = None + if has_exception_breakpoints: + should_stop, frame, exc_info = should_stop_on_exception( + self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + ) + self.exc_info = exc_info + if should_stop: + if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + return self.trace_dispatch + is_line = False + is_return = False + is_call = False + + else: + # Unexpected: just keep the same trace func (i.e.: event == 'c_XXX'). + return self.trace_dispatch + + if not is_exception_event: + breakpoints_for_file = py_db.breakpoints.get(abs_path_canonical_path_and_base[1]) + + can_skip = False + + if info.pydev_state == 1: # 1 = 1 + # we can skip if: + # - we have no stop marked + # - we should make a step return/step over and we're not in the current frame + # - we're stepping into a coroutine context and we're not in that context + if step_cmd == -1: + can_skip = True + + elif step_cmd in ( + 108, + 109, + 159, + 160, + ) and not self._is_same_frame(stop_frame, frame): + can_skip = True + + elif step_cmd == 128 and ( + stop_frame is not None + and stop_frame is not frame + and stop_frame is not frame.f_back + and (frame.f_back is None or stop_frame is not frame.f_back.f_back) + ): + can_skip = True + + elif step_cmd == 144: + if py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + ): + can_skip = True + + elif step_cmd == 206: + f = frame + while f is not None: + if self._is_same_frame(stop_frame, f): + break + f = f.f_back + else: + can_skip = True + + if can_skip: + if plugin_manager is not None and (py_db.has_plugin_line_breaks or py_db.has_plugin_exception_breaks): + can_skip = plugin_manager.can_skip(py_db, frame) + + if ( + can_skip + and py_db.show_return_values + and info.pydev_step_cmd in (108, 159) + and self._is_same_frame(stop_frame, frame.f_back) + ): + # trace function for showing return values after step over + can_skip = False + + # Let's check to see if we are in a function that has a breakpoint. If we don't have a breakpoint, + # we will return nothing for the next trace + # also, after we hit a breakpoint and go to some other debugging state, we have to force the set trace anyway, + # so, that's why the additional checks are there. + + if function_breakpoint_on_call_event: + pass # Do nothing here (just keep on going as we can't skip it). + + elif not breakpoints_for_file: + if can_skip: + if has_exception_breakpoints: + return self.trace_exception + else: + return None if is_call else NO_FTRACE + + else: + # When cached, 0 means we don't have a breakpoint and 1 means we have. + if can_skip: + breakpoints_in_line_cache = frame_skips_cache.get(line_cache_key, -1) + if breakpoints_in_line_cache == 0: + return self.trace_dispatch + + breakpoints_in_frame_cache = frame_skips_cache.get(frame_cache_key, -1) + if breakpoints_in_frame_cache != -1: + # Gotten from cache. + has_breakpoint_in_frame = breakpoints_in_frame_cache == 1 + + else: + has_breakpoint_in_frame = False + + try: + func_lines = set() + for offset_and_lineno in dis.findlinestarts(frame.f_code): + if offset_and_lineno[1] is not None: + func_lines.add(offset_and_lineno[1]) + except: + # This is a fallback for implementations where we can't get the function + # lines -- i.e.: jython (in this case clients need to provide the function + # name to decide on the skip or we won't be able to skip the function + # completely). + + # Checks the breakpoint to see if there is a context match in some function. + curr_func_name = frame.f_code.co_name + + # global context is set with an empty name + if curr_func_name in ("?", "", ""): + curr_func_name = "" + + for bp in breakpoints_for_file.values(): + # will match either global or some function + if bp.func_name in ("None", curr_func_name): + has_breakpoint_in_frame = True + break + else: + for bp_line in breakpoints_for_file: # iterate on keys + if bp_line in func_lines: + has_breakpoint_in_frame = True + break + + # Cache the value (1 or 0 or -1 for default because of cython). + if has_breakpoint_in_frame: + frame_skips_cache[frame_cache_key] = 1 + else: + frame_skips_cache[frame_cache_key] = 0 + + if can_skip and not has_breakpoint_in_frame: + if has_exception_breakpoints: + return self.trace_exception + else: + return None if is_call else NO_FTRACE + + # We may have hit a breakpoint or we are already in step mode. Either way, let's check what we should do in this frame + # if DEBUG: print('NOT skipped: %s %s %s %s' % (frame.f_lineno, frame.f_code.co_name, event, frame.__class__.__name__)) + + try: + stop_on_plugin_breakpoint = False + # return is not taken into account for breakpoint hit because we'd have a double-hit in this case + # (one for the line and the other for the return). + + stop_info = {} + breakpoint = None + stop = False + stop_reason = 111 + bp_type = None + + if function_breakpoint_on_call_event: + breakpoint = function_breakpoint_on_call_event + stop = True + new_frame = frame + stop_reason = CMD_SET_FUNCTION_BREAK + + elif is_line and info.pydev_state != 2 and breakpoints_for_file is not None and line in breakpoints_for_file: + breakpoint = breakpoints_for_file[line] + new_frame = frame + stop = True + + elif plugin_manager is not None and py_db.has_plugin_line_breaks: + result = plugin_manager.get_breakpoint(py_db, frame, event, self._args[2]) + if result: + stop_on_plugin_breakpoint = True + breakpoint, new_frame, bp_type = result + + if breakpoint: + # ok, hit breakpoint, now, we have to discover if it is a conditional breakpoint + # lets do the conditional stuff here + if breakpoint.expression is not None: + py_db.handle_breakpoint_expression(breakpoint, info, new_frame) + + if stop or stop_on_plugin_breakpoint: + eval_result = False + if breakpoint.has_condition: + eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) + if not eval_result: + stop = False + stop_on_plugin_breakpoint = False + + if is_call and ( + frame.f_code.co_name in ("", "") or (line == 1 and frame.f_code.co_name.startswith(" may be executed having each line compiled as a new + # module, so it's the same case as . + + return self.trace_dispatch + + # Handle logpoint (on a logpoint we should never stop). + if (stop or stop_on_plugin_breakpoint) and breakpoint.is_logpoint: + stop = False + stop_on_plugin_breakpoint = False + + if info.pydev_message is not None and len(info.pydev_message) > 0: + cmd = py_db.cmd_factory.make_io_message(info.pydev_message + os.linesep, "1") + py_db.writer.add_command(cmd) + + if py_db.show_return_values: + if is_return and ( + ( + info.pydev_step_cmd in (108, 159, 128) + and (self._is_same_frame(stop_frame, frame.f_back)) + ) + or (info.pydev_step_cmd in (109, 160) and (self._is_same_frame(stop_frame, frame))) + or (info.pydev_step_cmd in (107, 206)) + or ( + info.pydev_step_cmd == 144 + and frame.f_back is not None + and not py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + ) + ): + self._show_return_values(frame, arg) + + elif py_db.remove_return_values_flag: + try: + self._remove_return_values(py_db, frame) + finally: + py_db.remove_return_values_flag = False + + if stop: + self.set_suspend( + thread, + stop_reason, + suspend_other_threads=breakpoint and breakpoint.suspend_policy == "ALL", + ) + + elif stop_on_plugin_breakpoint and plugin_manager is not None: + result = plugin_manager.suspend(py_db, thread, frame, bp_type) + if result: + frame = result + + # if thread has a suspend flag, we suspend with a busy wait + if info.pydev_state == 2: + self.do_wait_suspend(thread, frame, event, arg) + return self.trace_dispatch + else: + if not breakpoint and is_line: + # No stop from anyone and no breakpoint found in line (cache that). + frame_skips_cache[line_cache_key] = 0 + + except: + # Unfortunately Python itself stops the tracing when it originates from + # the tracing function, so, we can't do much about it (just let the user know). + exc = sys.exc_info()[0] + cmd = py_db.cmd_factory.make_console_message( + "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + % ( + exc, + thread, + ) + ) + py_db.writer.add_command(cmd) + if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + pydev_log.exception() + + raise + + # step handling. We stop when we hit the right frame + try: + should_skip = 0 + if pydevd_dont_trace.should_trace_hook is not None: + if self.should_skip == -1: + # I.e.: cache the result on self.should_skip (no need to evaluate the same frame multiple times). + # Note that on a code reload, we won't re-evaluate this because in practice, the frame.f_code + # Which will be handled by this frame is read-only, so, we can cache it safely. + if not pydevd_dont_trace.should_trace_hook(frame.f_code, abs_path_canonical_path_and_base[0]): + # -1, 0, 1 to be Cython-friendly + should_skip = self.should_skip = 1 + else: + should_skip = self.should_skip = 0 + else: + should_skip = self.should_skip + + plugin_stop = False + if should_skip: + stop = False + + elif step_cmd in (107, 144, 206): + force_check_project_scope = step_cmd == 144 + if is_line: + if not info.pydev_use_scoped_step_frame: + if force_check_project_scope or py_db.is_files_filter_enabled: + stop = not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope) + else: + stop = True + else: + if force_check_project_scope or py_db.is_files_filter_enabled: + # Make sure we check the filtering inside ipython calls too... + if not not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope): + return None if is_call else NO_FTRACE + + # We can only stop inside the ipython call. + filename = frame.f_code.co_filename + if filename.endswith(".pyc"): + filename = filename[:-1] + + if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): + f = frame.f_back + while f is not None: + if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + f2 = f.f_back + if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + pydev_log.debug("Stop inside ipython call") + stop = True + break + f = f.f_back + + del f + + if not stop: + # In scoped mode if step in didn't work in this context it won't work + # afterwards anyways. + return None if is_call else NO_FTRACE + + elif is_return and frame.f_back is not None and not info.pydev_use_scoped_step_frame: + if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + stop = False + else: + if force_check_project_scope or py_db.is_files_filter_enabled: + stop = not py_db.apply_files_filter( + frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope + ) + if stop: + # Prevent stopping in a return to the same location we were initially + # (i.e.: double-stop at the same place due to some filtering). + if info.step_in_initial_location == (frame.f_back, frame.f_back.f_lineno): + stop = False + else: + stop = True + else: + stop = False + + if stop: + if step_cmd == 206: + # i.e.: Check if we're stepping into the proper context. + f = frame + while f is not None: + if self._is_same_frame(stop_frame, f): + break + f = f.f_back + else: + stop = False + + if plugin_manager is not None: + result = plugin_manager.cmd_step_into(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + if result: + stop, plugin_stop = result + + elif step_cmd in (108, 159): + # Note: when dealing with a step over my code it's the same as a step over (the + # difference is that when we return from a frame in one we go to regular step + # into and in the other we go to a step into my code). + stop = self._is_same_frame(stop_frame, frame) and is_line + # Note: don't stop on a return for step over, only for line events + # i.e.: don't stop in: (stop_frame is frame.f_back and is_return) as we'd stop twice in that line. + + if plugin_manager is not None: + result = plugin_manager.cmd_step_over(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + if result: + stop, plugin_stop = result + + elif step_cmd == 128: + stop = False + back = frame.f_back + if self._is_same_frame(stop_frame, frame) and is_return: + # We're exiting the smart step into initial frame (so, we probably didn't find our target). + stop = True + + elif self._is_same_frame(stop_frame, back) and is_line: + if info.pydev_smart_child_offset != -1: + # i.e.: in this case, we're not interested in the pause in the parent, rather + # we're interested in the pause in the child (when the parent is at the proper place). + stop = False + + else: + pydev_smart_parent_offset = info.pydev_smart_parent_offset + + pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: + # Preferred mode (when the smart step into variants are available + # and the offset is set). + stop = get_smart_step_into_variant_from_frame_offset( + back.f_lasti, pydev_smart_step_into_variants + ) is get_smart_step_into_variant_from_frame_offset( + pydev_smart_parent_offset, pydev_smart_step_into_variants + ) + + else: + # Only the name/line is available, so, check that. + curr_func_name = frame.f_code.co_name + + # global context is set with an empty name + if curr_func_name in ("?", "") or curr_func_name is None: + curr_func_name = "" + if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: + stop = True + + if not stop: + # In smart step into, if we didn't hit it in this frame once, that'll + # not be the case next time either, so, disable tracing for this frame. + return None if is_call else NO_FTRACE + + elif back is not None and self._is_same_frame(stop_frame, back.f_back) and is_line: + # Ok, we have to track 2 stops at this point, the parent and the child offset. + # This happens when handling a step into which targets a function inside a list comprehension + # or generator (in which case an intermediary frame is created due to an internal function call). + pydev_smart_parent_offset = info.pydev_smart_parent_offset + pydev_smart_child_offset = info.pydev_smart_child_offset + # print('matched back frame', pydev_smart_parent_offset, pydev_smart_child_offset) + # print('parent f_lasti', back.f_back.f_lasti) + # print('child f_lasti', back.f_lasti) + stop = False + if pydev_smart_child_offset >= 0 and pydev_smart_child_offset >= 0: + pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + + if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: + # Note that we don't really check the parent offset, only the offset of + # the child (because this is a generator, the parent may have moved forward + # already -- and that's ok, so, we just check that the parent frame + # matches in this case). + smart_step_into_variant = get_smart_step_into_variant_from_frame_offset( + pydev_smart_parent_offset, pydev_smart_step_into_variants + ) + # print('matched parent offset', pydev_smart_parent_offset) + # Ok, now, check the child variant + children_variants = smart_step_into_variant.children_variants + stop = children_variants and ( + get_smart_step_into_variant_from_frame_offset(back.f_lasti, children_variants) + is get_smart_step_into_variant_from_frame_offset(pydev_smart_child_offset, children_variants) + ) + # print('stop at child', stop) + + if not stop: + # In smart step into, if we didn't hit it in this frame once, that'll + # not be the case next time either, so, disable tracing for this frame. + return None if is_call else NO_FTRACE + + elif step_cmd in (109, 160): + stop = is_return and self._is_same_frame(stop_frame, frame) + + else: + stop = False + + if stop and step_cmd != -1 and is_return and hasattr(frame, "f_back"): + f_code = getattr(frame.f_back, "f_code", None) + if f_code is not None: + if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + stop = False + + if plugin_stop: + plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) + elif stop: + if is_line: + self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + self.do_wait_suspend(thread, frame, event, arg) + elif is_return: # return event + back = frame.f_back + if back is not None: + # When we get to the pydevd run function, the debugging has actually finished for the main thread + # (note that it can still go on for other threads, but for this one, we just make it finish) + # So, just setting it to None should be OK + back_absolute_filename, _, base = get_abs_path_real_path_and_base_from_frame(back) + if (base, back.f_code.co_name) in (DEBUG_START, DEBUG_START_PY3K): + back = None + + elif base == TRACE_PROPERTY: + # We dont want to trace the return event of pydevd_traceproperty (custom property for debugging) + # if we're in a return, we want it to appear to the user in the previous frame! + return None if is_call else NO_FTRACE + + elif pydevd_dont_trace.should_trace_hook is not None: + if not pydevd_dont_trace.should_trace_hook(back.f_code, back_absolute_filename): + # In this case, we'll have to skip the previous one because it shouldn't be traced. + # Also, we have to reset the tracing, because if the parent's parent (or some + # other parent) has to be traced and it's not currently, we wouldn't stop where + # we should anymore (so, a step in/over/return may not stop anywhere if no parent is traced). + # Related test: _debugger_case17a.py + py_db.set_trace_for_frame_and_parents(thread.ident, back) + return None if is_call else NO_FTRACE + + if back is not None: + # if we're in a return, we want it to appear to the user in the previous frame! + self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + self.do_wait_suspend(thread, back, event, arg) + else: + # in jython we may not have a back frame + info.pydev_step_stop = None + info.pydev_original_step_cmd = -1 + info.pydev_step_cmd = -1 + info.pydev_state = 1 + info.update_stepping_info() + + # if we are quitting, let's stop the tracing + if py_db.quitting: + return None if is_call else NO_FTRACE + + return self.trace_dispatch + except: + # Unfortunately Python itself stops the tracing when it originates from + # the tracing function, so, we can't do much about it (just let the user know). + exc = sys.exc_info()[0] + cmd = py_db.cmd_factory.make_console_message( + "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + % ( + exc, + thread, + ) + ) + py_db.writer.add_command(cmd) + if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + pydev_log.exception() + raise + + finally: + info.is_tracing -= 1 + + # end trace_dispatch + + +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +def should_stop_on_exception(py_db, PyDBAdditionalThreadInfo info, frame, thread, arg, prev_user_uncaught_exc_info, is_unwind=False): + cdef bint should_stop; + cdef bint was_just_raised; + cdef list check_excs; +# ELSE +# def should_stop_on_exception(py_db, info, frame, thread, arg, prev_user_uncaught_exc_info, is_unwind=False): + # ENDIF + + should_stop = False + maybe_user_uncaught_exc_info = prev_user_uncaught_exc_info + + # 2 = 2 + if info.pydev_state != 2: # and breakpoint is not None: + exception, value, trace = arg + + if trace is not None and hasattr(trace, "tb_next"): + # on jython trace is None on the first event and it may not have a tb_next. + + should_stop = False + exception_breakpoint = None + try: + if py_db.plugin is not None: + result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + if result: + should_stop, frame = result + except: + pydev_log.exception() + + if not should_stop: + # Apply checks that don't need the exception breakpoint (where we shouldn't ever stop). + if exception == SystemExit and py_db.ignore_system_exit_code(value): + pass + + elif exception in (GeneratorExit, StopIteration, StopAsyncIteration): + # These exceptions are control-flow related (they work as a generator + # pause), so, we shouldn't stop on them. + pass + + elif ignore_exception_trace(trace): + pass + + else: + was_just_raised = trace.tb_next is None + + # It was not handled by any plugin, lets check exception breakpoints. + check_excs = [] + + # Note: check user unhandled before regular exceptions. + exc_break_user = py_db.get_exception_breakpoint(exception, py_db.break_on_user_uncaught_exceptions) + if exc_break_user is not None: + check_excs.append((exc_break_user, True)) + + exc_break_caught = py_db.get_exception_breakpoint(exception, py_db.break_on_caught_exceptions) + if exc_break_caught is not None: + check_excs.append((exc_break_caught, False)) + + for exc_break, is_user_uncaught in check_excs: + # Initially mark that it should stop and then go into exclusions. + should_stop = True + + if py_db.exclude_exception_by_filter(exc_break, trace): + pydev_log.debug( + "Ignore exception %s in library %s -- (%s)" % (exception, frame.f_code.co_filename, frame.f_code.co_name) + ) + should_stop = False + + elif exc_break.condition is not None and not py_db.handle_breakpoint_condition(info, exc_break, frame): + should_stop = False + + elif is_user_uncaught: + # Note: we don't stop here, we just collect the exc_info to use later on... + should_stop = False + if not py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + ): + # User uncaught means that we're currently in user code but the code + # up the stack is library code. + exc_info = prev_user_uncaught_exc_info + if not exc_info: + exc_info = (arg, frame.f_lineno, set([frame.f_lineno])) + else: + lines = exc_info[2] + lines.add(frame.f_lineno) + exc_info = (arg, frame.f_lineno, lines) + maybe_user_uncaught_exc_info = exc_info + else: + # I.e.: these are only checked if we're not dealing with user uncaught exceptions. + if ( + exc_break.notify_on_first_raise_only + and py_db.skip_on_exceptions_thrown_in_same_context + and not was_just_raised + and not just_raised(trace.tb_next) + ): + # In this case we never stop if it was just raised, so, to know if it was the first we + # need to check if we're in the 2nd method. + should_stop = False # I.e.: we stop only when we're at the caller of a method that throws an exception + + elif ( + exc_break.notify_on_first_raise_only + and not py_db.skip_on_exceptions_thrown_in_same_context + and not was_just_raised + ): + should_stop = False # I.e.: we stop only when it was just raised + + elif was_just_raised and py_db.skip_on_exceptions_thrown_in_same_context: + # Option: Don't break if an exception is caught in the same function from which it is thrown + should_stop = False + + if should_stop: + exception_breakpoint = exc_break + try: + info.pydev_message = exc_break.qname + except: + info.pydev_message = exc_break.qname.encode("utf-8") + break + + if should_stop: + # Always add exception to frame (must remove later after we proceed). + add_exception_to_frame(frame, (exception, value, trace)) + + if exception_breakpoint is not None and exception_breakpoint.expression is not None: + py_db.handle_breakpoint_expression(exception_breakpoint, info, frame) + + return should_stop, frame, maybe_user_uncaught_exc_info + + +# Same thing in the main debugger but only considering the file contents, while the one in the main debugger +# considers the user input (so, the actual result must be a join of both). +filename_to_lines_where_exceptions_are_ignored: dict = {} +filename_to_stat_info: dict = {} + + +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +def handle_exception(py_db, thread, frame, arg, str exception_type): + cdef bint stopped; + cdef tuple abs_real_path_and_base; + cdef str absolute_filename; + cdef str canonical_normalized_filename; + cdef dict lines_ignored; + cdef dict frame_id_to_frame; + cdef dict merged; + cdef object trace_obj; +# ELSE +# def handle_exception(py_db, thread, frame, arg, exception_type): + # ENDIF + stopped = False + try: + # print('handle_exception', frame.f_lineno, frame.f_code.co_name) + + # We have 3 things in arg: exception type, description, traceback object + trace_obj = arg[2] + + initial_trace_obj = trace_obj + if trace_obj.tb_next is None and trace_obj.tb_frame is frame: + # I.e.: tb_next should be only None in the context it was thrown (trace_obj.tb_frame is frame is just a double check). + pass + else: + # Get the trace_obj from where the exception was raised... + while trace_obj.tb_next is not None: + trace_obj = trace_obj.tb_next + + if py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception: + for check_trace_obj in (initial_trace_obj, trace_obj): + abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) + absolute_filename = abs_real_path_and_base[0] + canonical_normalized_filename = abs_real_path_and_base[1] + + lines_ignored = filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + if lines_ignored is None: + lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + + try: + curr_stat = os.stat(absolute_filename) + curr_stat = (curr_stat.st_size, curr_stat.st_mtime) + except: + curr_stat = None + + last_stat = filename_to_stat_info.get(absolute_filename) + if last_stat != curr_stat: + filename_to_stat_info[absolute_filename] = curr_stat + lines_ignored.clear() + try: + linecache.checkcache(absolute_filename) + except: + pydev_log.exception("Error in linecache.checkcache(%r)", absolute_filename) + + from_user_input = py_db.filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + if from_user_input: + merged = {} + merged.update(lines_ignored) + # Override what we have with the related entries that the user entered + merged.update(from_user_input) + else: + merged = lines_ignored + + exc_lineno = check_trace_obj.tb_lineno + + # print ('lines ignored', lines_ignored) + # print ('user input', from_user_input) + # print ('merged', merged, 'curr', exc_lineno) + + if exc_lineno not in merged: # Note: check on merged but update lines_ignored. + try: + line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + except: + pydev_log.exception("Error in linecache.getline(%r, %s, f_globals)", absolute_filename, exc_lineno) + line = "" + + if IGNORE_EXCEPTION_TAG.match(line) is not None: + lines_ignored[exc_lineno] = 1 + return False + else: + # Put in the cache saying not to ignore + lines_ignored[exc_lineno] = 0 + else: + # Ok, dict has it already cached, so, let's check it... + if merged.get(exc_lineno, 0): + return False + + try: + frame_id_to_frame = {} + frame_id_to_frame[id(frame)] = frame + f = trace_obj.tb_frame + while f is not None: + frame_id_to_frame[id(f)] = f + f = f.f_back + f = None + + stopped = True + py_db.send_caught_exception_stack(thread, arg, id(frame)) + try: + py_db.set_suspend(thread, 137) + py_db.do_wait_suspend(thread, frame, "exception", arg, exception_type=exception_type) + finally: + py_db.send_caught_exception_stack_proceeded(thread) + except: + pydev_log.exception() + + py_db.set_trace_for_frame_and_parents(thread.ident, frame) + finally: + # Make sure the user cannot see the '__exception__' we added after we leave the suspend state. + remove_exception_from_frame(frame) + # Clear some local variables... + frame = None + trace_obj = None + initial_trace_obj = None + check_trace_obj = None + f = None + frame_id_to_frame = None + py_db = None + thread = None + + return stopped +from _pydev_bundle.pydev_is_thread_alive import is_thread_alive +from _pydev_bundle.pydev_log import exception as pydev_log_exception +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle.pydevd_constants import ( + get_current_thread_id, + NO_FTRACE, + USE_CUSTOM_SYS_CURRENT_FRAMES_MAP, + ForkSafeLock, + PYDEVD_USE_SYS_MONITORING, +) +from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +from cpython.object cimport PyObject +from cpython.ref cimport Py_INCREF, Py_XDECREF +# ELSE +# from _pydevd_bundle.pydevd_frame import PyDBFrame, is_unhandled_exception +# ENDIF +# fmt: on + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef dict _global_notify_skipped_step_in +# ELSE +# # Note: those are now inlined on cython. +# 107 = 107 +# 144 = 144 +# 109 = 109 +# 160 = 160 +# ENDIF +# fmt: on + +# Cache where we should keep that we completely skipped entering some context. +# It needs to be invalidated when: +# - Breakpoints are changed +# It can be used when running regularly (without step over/step in/step return) +global_cache_skips = {} +global_cache_frame_skips = {} + +_global_notify_skipped_step_in = False +_global_notify_skipped_step_in_lock = ForkSafeLock() + + +def notify_skipped_step_in_because_of_filters(py_db, frame): + global _global_notify_skipped_step_in + + with _global_notify_skipped_step_in_lock: + if _global_notify_skipped_step_in: + # Check with lock in place (callers should actually have checked + # before without the lock in place due to performance). + return + _global_notify_skipped_step_in = True + py_db.notify_skipped_step_in_because_of_filters(frame) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class SafeCallWrapper: + cdef method_object + def __init__(self, method_object): + self.method_object = method_object + def __call__(self, *args): + #Cannot use 'self' once inside the delegate call since we are borrowing the self reference f_trace field + #in the frame, and that reference might get destroyed by set trace on frame and parents + cdef PyObject* method_obj = self.method_object + Py_INCREF(method_obj) + ret = (method_obj)(*args) + Py_XDECREF (method_obj) + return SafeCallWrapper(ret) if ret is not None else None + def get_method_object(self): + return self.method_object +# ELSE +# ENDIF +# fmt: on + + +def fix_top_level_trace_and_get_trace_func(py_db, frame): + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef str filename; + cdef str name; + cdef tuple args; + # ENDIF + # fmt: on + + # Note: this is always the first entry-point in the tracing for any thread. + # After entering here we'll set a new tracing function for this thread + # where more information is cached (and will also setup the tracing for + # frames where we should deal with unhandled exceptions). + thread = None + # Cache the frame which should be traced to deal with unhandled exceptions. + # (i.e.: thread entry-points). + + f_unhandled = frame + # print('called at', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + force_only_unhandled_tracer = False + while f_unhandled is not None: + # name = splitext(basename(f_unhandled.f_code.co_filename))[0] + + name = f_unhandled.f_code.co_filename + # basename + i = name.rfind("/") + j = name.rfind("\\") + if j > i: + i = j + if i >= 0: + name = name[i + 1 :] + # remove ext + i = name.rfind(".") + if i >= 0: + name = name[:i] + + if name == "threading": + if f_unhandled.f_code.co_name in ("__bootstrap", "_bootstrap"): + # We need __bootstrap_inner, not __bootstrap. + return None, False + + elif f_unhandled.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner"): + # Note: be careful not to use threading.currentThread to avoid creating a dummy thread. + t = f_unhandled.f_locals.get("self") + force_only_unhandled_tracer = True + if t is not None and isinstance(t, threading.Thread): + thread = t + break + + elif name == "pydev_monkey": + if f_unhandled.f_code.co_name == "__call__": + force_only_unhandled_tracer = True + break + + elif name == "pydevd": + if f_unhandled.f_code.co_name in ("run", "main"): + # We need to get to _exec + return None, False + + if f_unhandled.f_code.co_name == "_exec": + force_only_unhandled_tracer = True + break + + elif name == "pydevd_tracing": + return None, False + + elif f_unhandled.f_back is None: + break + + f_unhandled = f_unhandled.f_back + + if thread is None: + # Important: don't call threadingCurrentThread if we're in the threading module + # to avoid creating dummy threads. + if py_db.threading_get_ident is not None: + thread = py_db.threading_active.get(py_db.threading_get_ident()) + if thread is None: + return None, False + else: + # Jython does not have threading.get_ident(). + thread = py_db.threading_current_thread() + + if getattr(thread, "pydev_do_not_trace", None): + py_db.disable_tracing() + return None, False + + try: + additional_info = thread.additional_info + if additional_info is None: + raise AttributeError() + except: + additional_info = py_db.set_additional_thread_info(thread) + + # print('enter thread tracer', thread, get_current_thread_id(thread)) + args = (py_db, thread, additional_info, global_cache_skips, global_cache_frame_skips) + + if f_unhandled is not None: + if f_unhandled.f_back is None and not force_only_unhandled_tracer: + # Happens when we attach to a running program (cannot reuse instance because it's mutable). + top_level_thread_tracer = TopLevelThreadTracerNoBackFrame(ThreadTracer(args), args) + additional_info.top_level_thread_tracer_no_back_frames.append( + top_level_thread_tracer + ) # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). + else: + top_level_thread_tracer = additional_info.top_level_thread_tracer_unhandled + if top_level_thread_tracer is None: + # Stop in some internal place to report about unhandled exceptions + top_level_thread_tracer = TopLevelThreadTracerOnlyUnhandledExceptions(args) + additional_info.top_level_thread_tracer_unhandled = top_level_thread_tracer # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). + + # print(' --> found to trace unhandled', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + f_trace = top_level_thread_tracer.get_trace_dispatch_func() + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + f_trace = SafeCallWrapper(f_trace) + # ENDIF + # fmt: on + f_unhandled.f_trace = f_trace + + if frame is f_unhandled: + return f_trace, False + + thread_tracer = additional_info.thread_tracer + if thread_tracer is None or thread_tracer._args[0] is not py_db: + thread_tracer = ThreadTracer(args) + additional_info.thread_tracer = thread_tracer + + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + return SafeCallWrapper(thread_tracer), True + # ELSE +# return thread_tracer, True + # ENDIF + # fmt: on + + +def trace_dispatch(py_db, frame, event, arg): + thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + if thread_trace_func is None: + return None if event == "call" else NO_FTRACE + if apply_to_settrace: + py_db.enable_tracing(thread_trace_func) + return thread_trace_func(frame, event, arg) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class TopLevelThreadTracerOnlyUnhandledExceptions: + cdef public tuple _args; + def __init__(self, tuple args): + self._args = args +# ELSE +# class TopLevelThreadTracerOnlyUnhandledExceptions(object): +# def __init__(self, args): +# self._args = args +# +# ENDIF +# fmt: on + + def trace_unhandled_exceptions(self, frame, event, arg): + # Note that we ignore the frame as this tracing method should only be put in topmost frames already. + # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + if event == "exception" and arg is not None: + py_db, t, additional_info = self._args[0:3] + if arg is not None: + if not additional_info.suspended_at_unhandled: + additional_info.suspended_at_unhandled = True + + py_db.stop_on_unhandled_exception(py_db, t, additional_info, arg) + + # No need to reset frame.f_trace to keep the same trace function. + return self.trace_unhandled_exceptions + + def get_trace_dispatch_func(self): + return self.trace_unhandled_exceptions + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class TopLevelThreadTracerNoBackFrame: + cdef public object _frame_trace_dispatch; + cdef public tuple _args; + cdef public object try_except_infos; + cdef public object _last_exc_arg; + cdef public set _raise_lines; + cdef public int _last_raise_line; + def __init__(self, frame_trace_dispatch, tuple args): + self._frame_trace_dispatch = frame_trace_dispatch + self._args = args + self.try_except_infos = None + self._last_exc_arg = None + self._raise_lines = set() + self._last_raise_line = -1 +# ELSE +# class TopLevelThreadTracerNoBackFrame(object): +# """ +# This tracer is pretty special in that it's dealing with a frame without f_back (i.e.: top frame +# on remote attach or QThread). +# +# This means that we have to carefully inspect exceptions to discover whether the exception will +# be unhandled or not (if we're dealing with an unhandled exception we need to stop as unhandled, +# otherwise we need to use the regular tracer -- unfortunately the debugger has little info to +# work with in the tracing -- see: https://bugs.python.org/issue34099, so, we inspect bytecode to +# determine if some exception will be traced or not... note that if this is not available -- such +# as on Jython -- we consider any top-level exception to be unnhandled). +# """ +# +# def __init__(self, frame_trace_dispatch, args): +# self._frame_trace_dispatch = frame_trace_dispatch +# self._args = args +# self.try_except_infos = None +# self._last_exc_arg = None +# self._raise_lines = set() +# self._last_raise_line = -1 +# +# ENDIF +# fmt: on + + def trace_dispatch_and_unhandled_exceptions(self, frame, event, arg): + # DEBUG = 'code_to_debug' in frame.f_code.co_filename + # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + frame_trace_dispatch = self._frame_trace_dispatch + if frame_trace_dispatch is not None: + self._frame_trace_dispatch = frame_trace_dispatch(frame, event, arg) + + if event == "exception": + self._last_exc_arg = arg + self._raise_lines.add(frame.f_lineno) + self._last_raise_line = frame.f_lineno + + elif event == "return" and self._last_exc_arg is not None: + # For unhandled exceptions we actually track the return when at the topmost level. + try: + py_db, t, additional_info = self._args[0:3] + if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. + if is_unhandled_exception(self, py_db, frame, self._last_raise_line, self._raise_lines): + py_db.stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) + finally: + # Remove reference to exception after handling it. + self._last_exc_arg = None + + ret = self.trace_dispatch_and_unhandled_exceptions + + # Need to reset (the call to _frame_trace_dispatch may have changed it). + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + frame.f_trace = SafeCallWrapper(ret) + # ELSE +# frame.f_trace = ret + # ENDIF + # fmt: on + return ret + + def get_trace_dispatch_func(self): + return self.trace_dispatch_and_unhandled_exceptions + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class ThreadTracer: + cdef public tuple _args; + def __init__(self, tuple args): + self._args = args +# ELSE +# class ThreadTracer(object): +# def __init__(self, args): +# self._args = args +# +# ENDIF +# fmt: on + + def __call__(self, frame, event, arg): + """This is the callback used when we enter some context in the debugger. + + We also decorate the thread we are in with info about the debugging. + The attributes added are: + pydev_state + pydev_step_stop + pydev_step_cmd + pydev_notify_kill + + :param PyDB py_db: + This is the global debugger (this method should actually be added as a method to it). + """ + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef str filename; + cdef str base; + cdef int pydev_step_cmd; + cdef object frame_cache_key; + cdef dict cache_skips; + cdef bint is_stepping; + cdef tuple abs_path_canonical_path_and_base; + cdef PyDBAdditionalThreadInfo additional_info; + # ENDIF + # fmt: on + + # DEBUG = 'code_to_debug' in frame.f_code.co_filename + # if DEBUG: print('ENTER: trace_dispatch: %s %s %s %s' % (frame.f_code.co_filename, frame.f_lineno, event, frame.f_code.co_name)) + py_db, t, additional_info, cache_skips, frame_skips_cache = self._args + if additional_info.is_tracing: + return None if event == "call" else NO_FTRACE # we don't wan't to trace code invoked from pydevd_frame.trace_dispatch + + additional_info.is_tracing += 1 + try: + pydev_step_cmd = additional_info.pydev_step_cmd + is_stepping = pydev_step_cmd != -1 + if py_db.pydb_disposed: + return None if event == "call" else NO_FTRACE + + # if thread is not alive, cancel trace_dispatch processing + if not is_thread_alive(t): + py_db.notify_thread_not_alive(get_current_thread_id(t)) + return None if event == "call" else NO_FTRACE + + # Note: it's important that the context name is also given because we may hit something once + # in the global context and another in the local context. + frame_cache_key = frame.f_code + if frame_cache_key in cache_skips: + if not is_stepping: + # if DEBUG: print('skipped: trace_dispatch (cache hit)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + else: + # When stepping we can't take into account caching based on the breakpoints (only global filtering). + if cache_skips.get(frame_cache_key) == 1: + if ( + additional_info.pydev_original_step_cmd in (107, 144) + and not _global_notify_skipped_step_in + ): + notify_skipped_step_in_because_of_filters(py_db, frame) + + back_frame = frame.f_back + if back_frame is not None and pydev_step_cmd in ( + 107, + 144, + 109, + 160, + ): + back_frame_cache_key = back_frame.f_code + if cache_skips.get(back_frame_cache_key) == 1: + # if DEBUG: print('skipped: trace_dispatch (cache hit: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + else: + # if DEBUG: print('skipped: trace_dispatch (cache hit: 2)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + + try: + # Make fast path faster! + abs_path_canonical_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + except: + abs_path_canonical_path_and_base = get_abs_path_real_path_and_base_from_frame(frame) + + file_type = py_db.get_file_type( + frame, abs_path_canonical_path_and_base + ) # we don't want to debug threading or anything related to pydevd + + if file_type is not None: + if file_type == 1: # inlining LIB_FILE = 1 + if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): + # if DEBUG: print('skipped: trace_dispatch (not in scope)', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + cache_skips[frame_cache_key] = 1 + return None if event == "call" else NO_FTRACE + else: + # if DEBUG: print('skipped: trace_dispatch', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + cache_skips[frame_cache_key] = 1 + return None if event == "call" else NO_FTRACE + + if py_db.is_files_filter_enabled: + if py_db.apply_files_filter(frame, abs_path_canonical_path_and_base[0], False): + cache_skips[frame_cache_key] = 1 + + if ( + is_stepping + and additional_info.pydev_original_step_cmd in (107, 144) + and not _global_notify_skipped_step_in + ): + notify_skipped_step_in_because_of_filters(py_db, frame) + + # A little gotcha, sometimes when we're stepping in we have to stop in a + # return event showing the back frame as the current frame, so, we need + # to check not only the current frame but the back frame too. + back_frame = frame.f_back + if back_frame is not None and pydev_step_cmd in ( + 107, + 144, + 109, + 160, + ): + if py_db.apply_files_filter(back_frame, back_frame.f_code.co_filename, False): + back_frame_cache_key = back_frame.f_code + cache_skips[back_frame_cache_key] = 1 + # if DEBUG: print('skipped: trace_dispatch (filtered out: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + else: + # if DEBUG: print('skipped: trace_dispatch (filtered out: 2)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + + # if DEBUG: print('trace_dispatch', filename, frame.f_lineno, event, frame.f_code.co_name, file_type) + + # Just create PyDBFrame directly (removed support for Python versions < 2.5, which required keeping a weak + # reference to the frame). + ret = PyDBFrame( + ( + py_db, + abs_path_canonical_path_and_base, + additional_info, + t, + frame_skips_cache, + frame_cache_key, + ) + ).trace_dispatch(frame, event, arg) + if ret is None: + # 1 means skipped because of filters. + # 2 means skipped because no breakpoints were hit. + cache_skips[frame_cache_key] = 2 + return None if event == "call" else NO_FTRACE + + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + frame.f_trace = SafeCallWrapper(ret) # Make sure we keep the returned tracer. + # ELSE +# frame.f_trace = ret # Make sure we keep the returned tracer. + # ENDIF + # fmt: on + return ret + + except SystemExit: + return None if event == "call" else NO_FTRACE + + except Exception: + if py_db.pydb_disposed: + return None if event == "call" else NO_FTRACE # Don't log errors when we're shutting down. + # Log it + try: + if pydev_log_exception is not None: + # This can actually happen during the interpreter shutdown in Python 2.7 + pydev_log_exception() + except: + # Error logging? We're really in the interpreter shutdown... + # (https://github.com/fabioz/PyDev.Debugger/issues/8) + pass + return None if event == "call" else NO_FTRACE + finally: + additional_info.is_tracing -= 1 + + +if USE_CUSTOM_SYS_CURRENT_FRAMES_MAP: + # This is far from ideal, as we'll leak frames (we'll always have the last created frame, not really + # the last topmost frame saved -- this should be Ok for our usage, but it may leak frames and things + # may live longer... as IronPython is garbage-collected, things should live longer anyways, so, it + # shouldn't be an issue as big as it's in CPython -- it may still be annoying, but this should + # be a reasonable workaround until IronPython itself is able to provide that functionality). + # + # See: https://github.com/IronLanguages/main/issues/1630 + from _pydevd_bundle.pydevd_constants import constructed_tid_to_last_frame + + _original_call = ThreadTracer.__call__ + + def __call__(self, frame, event, arg): + constructed_tid_to_last_frame[self._args[1].ident] = frame + return _original_call(self, frame, event, arg) + + ThreadTracer.__call__ = __call__ + +if PYDEVD_USE_SYS_MONITORING: + + def fix_top_level_trace_and_get_trace_func(*args, **kwargs): + raise RuntimeError("Not used in sys.monitoring mode.") diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython_wrapper.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython_wrapper.py new file mode 100644 index 0000000..4d5038c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython_wrapper.py @@ -0,0 +1,63 @@ +import sys + +try: + try: + from _pydevd_bundle_ext import pydevd_cython as mod + + except ImportError: + from _pydevd_bundle import pydevd_cython as mod + +except ImportError: + import struct + + try: + is_python_64bit = struct.calcsize("P") == 8 + except: + # In Jython this call fails, but this is Ok, we don't support Jython for speedups anyways. + raise ImportError + plat = "32" + if is_python_64bit: + plat = "64" + + # We also accept things as: + # + # _pydevd_bundle.pydevd_cython_win32_27_32 + # _pydevd_bundle.pydevd_cython_win32_34_64 + # + # to have multiple pre-compiled pyds distributed along the IDE + # (generated by build_tools/build_binaries_windows.py). + + mod_name = "pydevd_cython_%s_%s%s_%s" % (sys.platform, sys.version_info[0], sys.version_info[1], plat) + check_name = "_pydevd_bundle.%s" % (mod_name,) + mod = getattr(__import__(check_name), mod_name) + +# Regardless of how it was found, make sure it's later available as the +# initial name so that the expected types from cython in frame eval +# are valid. +sys.modules["_pydevd_bundle.pydevd_cython"] = mod + +trace_dispatch = mod.trace_dispatch + +PyDBAdditionalThreadInfo = mod.PyDBAdditionalThreadInfo + +set_additional_thread_info = mod.set_additional_thread_info + +any_thread_stepping = mod.any_thread_stepping + +remove_additional_info = mod.remove_additional_info + +global_cache_skips = mod.global_cache_skips + +global_cache_frame_skips = mod.global_cache_frame_skips + +_set_additional_thread_info_lock = mod._set_additional_thread_info_lock + +fix_top_level_trace_and_get_trace_func = mod.fix_top_level_trace_and_get_trace_func + +handle_exception = mod.handle_exception + +should_stop_on_exception = mod.should_stop_on_exception + +is_unhandled_exception = mod.is_unhandled_exception + +version = getattr(mod, "version", 0) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py new file mode 100644 index 0000000..8b50c22 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py @@ -0,0 +1,202 @@ +from _pydev_bundle._pydev_saved_modules import threading +from _pydev_bundle import _pydev_saved_modules +from _pydevd_bundle.pydevd_utils import notify_about_gevent_if_needed +import weakref +from _pydevd_bundle.pydevd_constants import ( + IS_JYTHON, + IS_IRONPYTHON, + PYDEVD_APPLY_PATCHING_TO_HIDE_PYDEVD_THREADS, + PYDEVD_USE_SYS_MONITORING, +) +from _pydev_bundle.pydev_log import exception as pydev_log_exception +import sys +from _pydev_bundle import pydev_log +import pydevd_tracing +from _pydevd_bundle.pydevd_collect_bytecode_info import iter_instructions +from _pydevd_sys_monitoring import pydevd_sys_monitoring + +if IS_JYTHON: + import org.python.core as JyCore # @UnresolvedImport + + +class PyDBDaemonThread(threading.Thread): + def __init__(self, py_db, target_and_args=None): + """ + :param target_and_args: + tuple(func, args, kwargs) if this should be a function and args to run. + -- Note: use through run_as_pydevd_daemon_thread(). + """ + threading.Thread.__init__(self) + notify_about_gevent_if_needed() + self._py_db = weakref.ref(py_db) + self._kill_received = False + mark_as_pydevd_daemon_thread(self) + self._target_and_args = target_and_args + + @property + def py_db(self): + return self._py_db() + + def run(self): + created_pydb_daemon = self.py_db.created_pydb_daemon_threads + created_pydb_daemon[self] = 1 + try: + try: + if IS_JYTHON and not isinstance(threading.current_thread(), threading._MainThread): + # we shouldn't update sys.modules for the main thread, cause it leads to the second importing 'threading' + # module, and the new instance of main thread is created + ss = JyCore.PySystemState() + # Note: Py.setSystemState() affects only the current thread. + JyCore.Py.setSystemState(ss) + + self._stop_trace() + self._on_run() + except: + if sys is not None and pydev_log_exception is not None: + pydev_log_exception() + finally: + del created_pydb_daemon[self] + + def _on_run(self): + if self._target_and_args is not None: + target, args, kwargs = self._target_and_args + target(*args, **kwargs) + else: + raise NotImplementedError("Should be reimplemented by: %s" % self.__class__) + + def do_kill_pydev_thread(self): + if not self._kill_received: + pydev_log.debug("%s received kill signal", self.name) + self._kill_received = True + + def _stop_trace(self): + if self.pydev_do_not_trace: + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.stop_monitoring(all_threads=False) + return + pydevd_tracing.SetTrace(None) # no debugging on this thread + + +def _collect_load_names(func): + found_load_names = set() + for instruction in iter_instructions(func.__code__): + if instruction.opname in ("LOAD_GLOBAL", "LOAD_ATTR", "LOAD_METHOD"): + found_load_names.add(instruction.argrepr) + return found_load_names + + +def _patch_threading_to_hide_pydevd_threads(): + """ + Patches the needed functions on the `threading` module so that the pydevd threads are hidden. + + Note that we patch the functions __code__ to avoid issues if some code had already imported those + variables prior to the patching. + """ + found_load_names = _collect_load_names(threading.enumerate) + # i.e.: we'll only apply the patching if the function seems to be what we expect. + + new_threading_enumerate = None + + if found_load_names in ( + {"_active_limbo_lock", "_limbo", "_active", "values", "list"}, + {"_active_limbo_lock", "_limbo", "_active", "values", "NULL + list"}, + {"NULL + list", "_active", "_active_limbo_lock", "NULL|self + values", "_limbo"}, + {"_active_limbo_lock", "values + NULL|self", "_limbo", "_active", "list + NULL"}, + ): + pydev_log.debug("Applying patching to hide pydevd threads (Py3 version).") + + def new_threading_enumerate(): + with _active_limbo_lock: + ret = list(_active.values()) + list(_limbo.values()) + + return [t for t in ret if not getattr(t, "is_pydev_daemon_thread", False)] + + elif found_load_names == set(("_active_limbo_lock", "_limbo", "_active", "values")): + pydev_log.debug("Applying patching to hide pydevd threads (Py2 version).") + + def new_threading_enumerate(): + with _active_limbo_lock: + ret = _active.values() + _limbo.values() + + return [t for t in ret if not getattr(t, "is_pydev_daemon_thread", False)] + + else: + pydev_log.info("Unable to hide pydevd threads. Found names in threading.enumerate: %s", found_load_names) + + if new_threading_enumerate is not None: + + def pydevd_saved_threading_enumerate(): + with threading._active_limbo_lock: + return list(threading._active.values()) + list(threading._limbo.values()) + + _pydev_saved_modules.pydevd_saved_threading_enumerate = pydevd_saved_threading_enumerate + + threading.enumerate.__code__ = new_threading_enumerate.__code__ + + # We also need to patch the active count (to match what we have in the enumerate). + def new_active_count(): + # Note: as this will be executed in the `threading` module, `enumerate` will + # actually be threading.enumerate. + return len(enumerate()) + + threading.active_count.__code__ = new_active_count.__code__ + + # When shutting down, Python (on some versions) may do something as: + # + # def _pickSomeNonDaemonThread(): + # for t in enumerate(): + # if not t.daemon and t.is_alive(): + # return t + # return None + # + # But in this particular case, we do want threads with `is_pydev_daemon_thread` to appear + # explicitly due to the pydevd `CheckAliveThread` (because we want the shutdown to wait on it). + # So, it can't rely on the `enumerate` for that anymore as it's patched to not return pydevd threads. + if hasattr(threading, "_pickSomeNonDaemonThread"): + + def new_pick_some_non_daemon_thread(): + with _active_limbo_lock: + # Ok for py2 and py3. + threads = list(_active.values()) + list(_limbo.values()) + + for t in threads: + if not t.daemon and t.is_alive(): + return t + return None + + threading._pickSomeNonDaemonThread.__code__ = new_pick_some_non_daemon_thread.__code__ + + +_patched_threading_to_hide_pydevd_threads = False + + +def mark_as_pydevd_daemon_thread(thread): + if not IS_JYTHON and not IS_IRONPYTHON and PYDEVD_APPLY_PATCHING_TO_HIDE_PYDEVD_THREADS: + global _patched_threading_to_hide_pydevd_threads + if not _patched_threading_to_hide_pydevd_threads: + # When we mark the first thread as a pydevd daemon thread, we also change the threading + # functions to hide pydevd threads. + # Note: we don't just "hide" the pydevd threads from the threading module by not using it + # (i.e.: just using the `thread.start_new_thread` instead of `threading.Thread`) + # because there's 1 thread (the `CheckAliveThread`) which is a pydevd thread but + # isn't really a daemon thread (so, we need CPython to wait on it for shutdown, + # in which case it needs to be in `threading` and the patching would be needed anyways). + _patched_threading_to_hide_pydevd_threads = True + try: + _patch_threading_to_hide_pydevd_threads() + except: + pydev_log.exception("Error applying patching to hide pydevd threads.") + + thread.pydev_do_not_trace = True + thread.is_pydev_daemon_thread = True + thread.daemon = True + + +def run_as_pydevd_daemon_thread(py_db, func, *args, **kwargs): + """ + Runs a function as a pydevd daemon thread (without any tracing in place). + """ + t = PyDBDaemonThread(py_db, target_and_args=(func, args, kwargs)) + t.name = "%s (pydevd daemon thread)" % (func.__name__,) + t.start() + return t diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_defaults.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_defaults.py new file mode 100644 index 0000000..b32576b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_defaults.py @@ -0,0 +1,64 @@ +""" +This module holds the customization settings for the debugger. +""" + +from _pydevd_bundle.pydevd_constants import QUOTED_LINE_PROTOCOL +from _pydev_bundle import pydev_log +import sys + + +class PydevdCustomization(object): + DEFAULT_PROTOCOL: str = QUOTED_LINE_PROTOCOL + + # Debug mode may be set to 'debugpy-dap'. + # + # In 'debugpy-dap' mode the following settings are done to PyDB: + # + # py_db.skip_suspend_on_breakpoint_exception = (BaseException,) + # py_db.skip_print_breakpoint_exception = (NameError,) + # py_db.multi_threads_single_notification = True + DEBUG_MODE: str = "" + + # This may be a ; to be pre-imported + # Something as: 'c:/temp/foo;my_module.bar' + # + # What's done in this case is something as: + # + # sys.path.insert(0, ) + # try: + # import + # finally: + # del sys.path[0] + # + # If the pre-import fails an output message is + # sent (but apart from that debugger execution + # should continue). + PREIMPORT: str = "" + + +def on_pydb_init(py_db): + if PydevdCustomization.DEBUG_MODE == "debugpy-dap": + pydev_log.debug("Apply debug mode: debugpy-dap") + py_db.skip_suspend_on_breakpoint_exception = (BaseException,) + py_db.skip_print_breakpoint_exception = (NameError,) + py_db.multi_threads_single_notification = True + elif not PydevdCustomization.DEBUG_MODE: + pydev_log.debug("Apply debug mode: default") + else: + pydev_log.debug("WARNING: unknown debug mode: %s", PydevdCustomization.DEBUG_MODE) + + if PydevdCustomization.PREIMPORT: + pydev_log.debug("Preimport: %s", PydevdCustomization.PREIMPORT) + try: + sys_path_entry, module_name = PydevdCustomization.PREIMPORT.rsplit(";", maxsplit=1) + except Exception: + pydev_log.exception("Expected ';' in %s" % (PydevdCustomization.PREIMPORT,)) + else: + try: + sys.path.insert(0, sys_path_entry) + try: + __import__(module_name) + finally: + sys.path.remove(sys_path_entry) + except Exception: + pydev_log.exception("Error importing %s (with sys.path entry: %s)" % (module_name, sys_path_entry)) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace.py new file mode 100644 index 0000000..500cbce --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace.py @@ -0,0 +1,123 @@ +""" +Support for a tag that allows skipping over functions while debugging. +""" +import linecache +import re + +# To suppress tracing a method, add the tag @DontTrace +# to a comment either preceding or on the same line as +# the method definition +# +# E.g.: +# #@DontTrace +# def test1(): +# pass +# +# ... or ... +# +# def test2(): #@DontTrace +# pass +DONT_TRACE_TAG = "@DontTrace" + +# Regular expression to match a decorator (at the beginning +# of a line). +RE_DECORATOR = re.compile(r"^\s*@") + +# Mapping from code object to bool. +# If the key exists, the value is the cached result of should_trace_hook +_filename_to_ignored_lines = {} + + +def default_should_trace_hook(code, absolute_filename): + """ + Return True if this frame should be traced, False if tracing should be blocked. + """ + # First, check whether this code object has a cached value + ignored_lines = _filename_to_ignored_lines.get(absolute_filename) + if ignored_lines is None: + # Now, look up that line of code and check for a @DontTrace + # preceding or on the same line as the method. + # E.g.: + # #@DontTrace + # def test(): + # pass + # ... or ... + # def test(): #@DontTrace + # pass + ignored_lines = {} + lines = linecache.getlines(absolute_filename) + for i_line, line in enumerate(lines): + j = line.find("#") + if j >= 0: + comment = line[j:] + if DONT_TRACE_TAG in comment: + ignored_lines[i_line] = 1 + + # Note: when it's found in the comment, mark it up and down for the decorator lines found. + k = i_line - 1 + while k >= 0: + if RE_DECORATOR.match(lines[k]): + ignored_lines[k] = 1 + k -= 1 + else: + break + + k = i_line + 1 + while k <= len(lines): + if RE_DECORATOR.match(lines[k]): + ignored_lines[k] = 1 + k += 1 + else: + break + + _filename_to_ignored_lines[absolute_filename] = ignored_lines + + func_line = code.co_firstlineno - 1 # co_firstlineno is 1-based, so -1 is needed + return not ( + func_line - 1 in ignored_lines # -1 to get line before method + or func_line in ignored_lines + ) # method line + + +should_trace_hook = None + + +def clear_trace_filter_cache(): + """ + Clear the trace filter cache. + Call this after reloading. + """ + global should_trace_hook + try: + # Need to temporarily disable a hook because otherwise + # _filename_to_ignored_lines.clear() will never complete. + old_hook = should_trace_hook + should_trace_hook = None + + # Clear the linecache + linecache.clearcache() + _filename_to_ignored_lines.clear() + + finally: + should_trace_hook = old_hook + + +def trace_filter(mode): + """ + Set the trace filter mode. + + mode: Whether to enable the trace hook. + True: Trace filtering on (skipping methods tagged @DontTrace) + False: Trace filtering off (trace methods tagged @DontTrace) + None/default: Toggle trace filtering. + """ + global should_trace_hook + if mode is None: + mode = should_trace_hook is None + + if mode: + should_trace_hook = default_should_trace_hook + else: + should_trace_hook = None + + return mode diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace_files.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace_files.py new file mode 100644 index 0000000..7fe1981 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace_files.py @@ -0,0 +1,178 @@ +# Important: Autogenerated file. + +# fmt: off +# DO NOT edit manually! +# DO NOT edit manually! + +LIB_FILE = 1 +PYDEV_FILE = 2 + +DONT_TRACE_DIRS = { + '_pydev_bundle': PYDEV_FILE, + '_pydev_runfiles': PYDEV_FILE, + '_pydevd_bundle': PYDEV_FILE, + '_pydevd_frame_eval': PYDEV_FILE, + '_pydevd_sys_monitoring': PYDEV_FILE, + 'pydev_ipython': LIB_FILE, + 'pydev_sitecustomize': PYDEV_FILE, + 'pydevd_attach_to_process': PYDEV_FILE, + 'pydevd_concurrency_analyser': PYDEV_FILE, + 'pydevd_plugins': PYDEV_FILE, + 'test_pydevd_reload': PYDEV_FILE, +} + +LIB_FILES_IN_DONT_TRACE_DIRS = { + '__init__.py', + 'inputhook.py', + 'inputhookglut.py', + 'inputhookgtk.py', + 'inputhookgtk3.py', + 'inputhookpyglet.py', + 'inputhookqt4.py', + 'inputhookqt5.py', + 'inputhookqt6.py', + 'inputhooktk.py', + 'inputhookwx.py', + 'matplotlibtools.py', + 'qt.py', + 'qt_for_kernel.py', + 'qt_loaders.py', + 'version.py', +} + +DONT_TRACE = { + # commonly used things from the stdlib that we don't want to trace + 'Queue.py':LIB_FILE, + 'queue.py':LIB_FILE, + 'socket.py':LIB_FILE, + 'weakref.py':LIB_FILE, + '_weakrefset.py':LIB_FILE, + 'linecache.py':LIB_FILE, + 'threading.py':LIB_FILE, + 'dis.py':LIB_FILE, + + # things from pydev that we don't want to trace + '__main__pydevd_gen_debug_adapter_protocol.py': PYDEV_FILE, + '_pydev_calltip_util.py': PYDEV_FILE, + '_pydev_completer.py': PYDEV_FILE, + '_pydev_execfile.py': PYDEV_FILE, + '_pydev_filesystem_encoding.py': PYDEV_FILE, + '_pydev_getopt.py': PYDEV_FILE, + '_pydev_imports_tipper.py': PYDEV_FILE, + '_pydev_jy_imports_tipper.py': PYDEV_FILE, + '_pydev_log.py': PYDEV_FILE, + '_pydev_saved_modules.py': PYDEV_FILE, + '_pydev_sys_patch.py': PYDEV_FILE, + '_pydev_tipper_common.py': PYDEV_FILE, + '_pydevd_sys_monitoring.py': PYDEV_FILE, + 'django_debug.py': PYDEV_FILE, + 'jinja2_debug.py': PYDEV_FILE, + 'pycompletionserver.py': PYDEV_FILE, + 'pydev_app_engine_debug_startup.py': PYDEV_FILE, + 'pydev_console_utils.py': PYDEV_FILE, + 'pydev_import_hook.py': PYDEV_FILE, + 'pydev_imports.py': PYDEV_FILE, + 'pydev_ipython_console.py': PYDEV_FILE, + 'pydev_ipython_console_011.py': PYDEV_FILE, + 'pydev_is_thread_alive.py': PYDEV_FILE, + 'pydev_localhost.py': PYDEV_FILE, + 'pydev_log.py': PYDEV_FILE, + 'pydev_monkey.py': PYDEV_FILE, + 'pydev_monkey_qt.py': PYDEV_FILE, + 'pydev_override.py': PYDEV_FILE, + 'pydev_run_in_console.py': PYDEV_FILE, + 'pydev_runfiles.py': PYDEV_FILE, + 'pydev_runfiles_coverage.py': PYDEV_FILE, + 'pydev_runfiles_nose.py': PYDEV_FILE, + 'pydev_runfiles_parallel.py': PYDEV_FILE, + 'pydev_runfiles_parallel_client.py': PYDEV_FILE, + 'pydev_runfiles_pytest2.py': PYDEV_FILE, + 'pydev_runfiles_unittest.py': PYDEV_FILE, + 'pydev_runfiles_xml_rpc.py': PYDEV_FILE, + 'pydev_umd.py': PYDEV_FILE, + 'pydev_versioncheck.py': PYDEV_FILE, + 'pydevconsole.py': PYDEV_FILE, + 'pydevconsole_code.py': PYDEV_FILE, + 'pydevd.py': PYDEV_FILE, + 'pydevd_additional_thread_info.py': PYDEV_FILE, + 'pydevd_additional_thread_info_regular.py': PYDEV_FILE, + 'pydevd_api.py': PYDEV_FILE, + 'pydevd_base_schema.py': PYDEV_FILE, + 'pydevd_breakpoints.py': PYDEV_FILE, + 'pydevd_bytecode_utils.py': PYDEV_FILE, + 'pydevd_bytecode_utils_py311.py': PYDEV_FILE, + 'pydevd_code_to_source.py': PYDEV_FILE, + 'pydevd_collect_bytecode_info.py': PYDEV_FILE, + 'pydevd_comm.py': PYDEV_FILE, + 'pydevd_comm_constants.py': PYDEV_FILE, + 'pydevd_command_line_handling.py': PYDEV_FILE, + 'pydevd_concurrency_logger.py': PYDEV_FILE, + 'pydevd_console.py': PYDEV_FILE, + 'pydevd_constants.py': PYDEV_FILE, + 'pydevd_custom_frames.py': PYDEV_FILE, + 'pydevd_cython_wrapper.py': PYDEV_FILE, + 'pydevd_daemon_thread.py': PYDEV_FILE, + 'pydevd_defaults.py': PYDEV_FILE, + 'pydevd_dont_trace.py': PYDEV_FILE, + 'pydevd_dont_trace_files.py': PYDEV_FILE, + 'pydevd_exec2.py': PYDEV_FILE, + 'pydevd_extension_api.py': PYDEV_FILE, + 'pydevd_extension_utils.py': PYDEV_FILE, + 'pydevd_file_utils.py': PYDEV_FILE, + 'pydevd_filtering.py': PYDEV_FILE, + 'pydevd_frame.py': PYDEV_FILE, + 'pydevd_frame_eval_cython_wrapper.py': PYDEV_FILE, + 'pydevd_frame_eval_main.py': PYDEV_FILE, + 'pydevd_frame_tracing.py': PYDEV_FILE, + 'pydevd_frame_utils.py': PYDEV_FILE, + 'pydevd_gevent_integration.py': PYDEV_FILE, + 'pydevd_helpers.py': PYDEV_FILE, + 'pydevd_import_class.py': PYDEV_FILE, + 'pydevd_io.py': PYDEV_FILE, + 'pydevd_json_debug_options.py': PYDEV_FILE, + 'pydevd_line_validation.py': PYDEV_FILE, + 'pydevd_modify_bytecode.py': PYDEV_FILE, + 'pydevd_net_command.py': PYDEV_FILE, + 'pydevd_net_command_factory_json.py': PYDEV_FILE, + 'pydevd_net_command_factory_xml.py': PYDEV_FILE, + 'pydevd_plugin_numpy_types.py': PYDEV_FILE, + 'pydevd_plugin_pandas_types.py': PYDEV_FILE, + 'pydevd_plugin_utils.py': PYDEV_FILE, + 'pydevd_plugins_django_form_str.py': PYDEV_FILE, + 'pydevd_process_net_command.py': PYDEV_FILE, + 'pydevd_process_net_command_json.py': PYDEV_FILE, + 'pydevd_referrers.py': PYDEV_FILE, + 'pydevd_reload.py': PYDEV_FILE, + 'pydevd_resolver.py': PYDEV_FILE, + 'pydevd_runpy.py': PYDEV_FILE, + 'pydevd_safe_repr.py': PYDEV_FILE, + 'pydevd_save_locals.py': PYDEV_FILE, + 'pydevd_schema.py': PYDEV_FILE, + 'pydevd_schema_log.py': PYDEV_FILE, + 'pydevd_signature.py': PYDEV_FILE, + 'pydevd_source_mapping.py': PYDEV_FILE, + 'pydevd_stackless.py': PYDEV_FILE, + 'pydevd_suspended_frames.py': PYDEV_FILE, + 'pydevd_sys_monitoring.py': PYDEV_FILE, + 'pydevd_thread_lifecycle.py': PYDEV_FILE, + 'pydevd_thread_wrappers.py': PYDEV_FILE, + 'pydevd_timeout.py': PYDEV_FILE, + 'pydevd_trace_dispatch.py': PYDEV_FILE, + 'pydevd_trace_dispatch_regular.py': PYDEV_FILE, + 'pydevd_traceproperty.py': PYDEV_FILE, + 'pydevd_tracing.py': PYDEV_FILE, + 'pydevd_utils.py': PYDEV_FILE, + 'pydevd_vars.py': PYDEV_FILE, + 'pydevd_vm_type.py': PYDEV_FILE, + 'pydevd_xml.py': PYDEV_FILE, +} + +# if we try to trace io.py it seems it can get halted (see http://bugs.python.org/issue4716) +DONT_TRACE['io.py'] = LIB_FILE + +# Don't trace common encodings too +DONT_TRACE['cp1252.py'] = LIB_FILE +DONT_TRACE['utf_8.py'] = LIB_FILE +DONT_TRACE['codecs.py'] = LIB_FILE + +# fmt: on diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_exec2.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_exec2.py new file mode 100644 index 0000000..486e8eb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_exec2.py @@ -0,0 +1,5 @@ +def Exec(exp, global_vars, local_vars=None): + if local_vars is not None: + exec(exp, global_vars, local_vars) + else: + exec(exp, global_vars) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_api.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_api.py new file mode 100644 index 0000000..8cabe79 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_api.py @@ -0,0 +1,107 @@ +import abc +from typing import Any + + +# borrowed from from six +def _with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + return type.__new__(metaclass, "temporary_class", (), {}) + + +# ======================================================================================================================= +# AbstractResolver +# ======================================================================================================================= +class _AbstractResolver(_with_metaclass(abc.ABCMeta)): + """ + This class exists only for documentation purposes to explain how to create a resolver. + + Some examples on how to resolve things: + - list: get_dictionary could return a dict with index->item and use the index to resolve it later + - set: get_dictionary could return a dict with id(object)->object and reiterate in that array to resolve it later + - arbitrary instance: get_dictionary could return dict with attr_name->attr and use getattr to resolve it later + """ + + @abc.abstractmethod + def resolve(self, var, attribute): + """ + In this method, we'll resolve some child item given the string representation of the item in the key + representing the previously asked dictionary. + + :param var: this is the actual variable to be resolved. + :param attribute: this is the string representation of a key previously returned in get_dictionary. + """ + raise NotImplementedError + + @abc.abstractmethod + def get_dictionary(self, var): + """ + :param var: this is the variable that should have its children gotten. + + :return: a dictionary where each pair key, value should be shown to the user as children items + in the variables view for the given var. + """ + raise NotImplementedError + + +class _AbstractProvider(_with_metaclass(abc.ABCMeta)): + @abc.abstractmethod + def can_provide(self, type_object, type_name): + raise NotImplementedError + + +# ======================================================================================================================= +# API CLASSES: +# ======================================================================================================================= + + +class TypeResolveProvider(_AbstractResolver, _AbstractProvider): + """ + Implement this in an extension to provide a custom resolver, see _AbstractResolver + """ + + +class StrPresentationProvider(_AbstractProvider): + """ + Implement this in an extension to provide a str presentation for a type + """ + + def get_str_in_context(self, val: Any, context: str): + """ + :param val: + This is the object for which we want a string representation. + + :param context: + This is the context in which the variable is being requested. Valid values: + "watch", + "repl", + "hover", + "clipboard" + + :note: this method is not required (if it's not available, get_str is called directly, + so, it's only needed if the string representation needs to be converted based on + the context). + """ + return self.get_str(val) + + @abc.abstractmethod + def get_str(self, val): + raise NotImplementedError + + +class DebuggerEventHandler(_with_metaclass(abc.ABCMeta)): + """ + Implement this to receive lifecycle events from the debugger + """ + + def on_debugger_modules_loaded(self, **kwargs): + """ + This method invoked after all debugger modules are loaded. Useful for importing and/or patching debugger + modules at a safe time + :param kwargs: This is intended to be flexible dict passed from the debugger. + Currently passes the debugger version + """ diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_utils.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_utils.py new file mode 100644 index 0000000..e10b69b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_utils.py @@ -0,0 +1,65 @@ +import pkgutil +import sys +from _pydev_bundle import pydev_log + +try: + import pydevd_plugins.extensions as extensions +except: + pydev_log.exception() + extensions = None + + +class ExtensionManager(object): + def __init__(self): + self.loaded_extensions = None + self.type_to_instance = {} + + def _load_modules(self): + self.loaded_extensions = [] + if extensions: + for module_loader, name, ispkg in pkgutil.walk_packages(extensions.__path__, extensions.__name__ + "."): + mod_name = name.split(".")[-1] + if not ispkg and mod_name.startswith("pydevd_plugin"): + try: + __import__(name) + module = sys.modules[name] + self.loaded_extensions.append(module) + except ImportError: + pydev_log.critical("Unable to load extension: %s", name) + + def _ensure_loaded(self): + if self.loaded_extensions is None: + self._load_modules() + + def _iter_attr(self): + for extension in self.loaded_extensions: + dunder_all = getattr(extension, "__all__", None) + for attr_name in dir(extension): + if not attr_name.startswith("_"): + if dunder_all is None or attr_name in dunder_all: + yield attr_name, getattr(extension, attr_name) + + def get_extension_classes(self, extension_type): + self._ensure_loaded() + if extension_type in self.type_to_instance: + return self.type_to_instance[extension_type] + handlers = self.type_to_instance.setdefault(extension_type, []) + for attr_name, attr in self._iter_attr(): + if isinstance(attr, type) and issubclass(attr, extension_type) and attr is not extension_type: + try: + handlers.append(attr()) + except: + pydev_log.exception("Unable to load extension class: %s", attr_name) + return handlers + + +EXTENSION_MANAGER_INSTANCE = ExtensionManager() + + +def extensions_of_type(extension_type): + """ + + :param T extension_type: The type of the extension hook + :rtype: list[T] + """ + return EXTENSION_MANAGER_INSTANCE.get_extension_classes(extension_type) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py new file mode 100644 index 0000000..c0cf395 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py @@ -0,0 +1,338 @@ +import fnmatch +import glob +import os.path +import sys + +from _pydev_bundle import pydev_log +import pydevd_file_utils +import json +from collections import namedtuple +from _pydev_bundle._pydev_saved_modules import threading +from pydevd_file_utils import normcase +from _pydevd_bundle.pydevd_constants import USER_CODE_BASENAMES_STARTING_WITH, LIBRARY_CODE_BASENAMES_STARTING_WITH, IS_PYPY, IS_WINDOWS +from _pydevd_bundle import pydevd_constants +from _pydevd_bundle.pydevd_constants import is_true_in_env + +ExcludeFilter = namedtuple("ExcludeFilter", "name, exclude, is_path") + + +def _convert_to_str_and_clear_empty(roots): + new_roots = [] + for root in roots: + assert isinstance(root, str), "%s not str (found: %s)" % (root, type(root)) + if root: + new_roots.append(root) + return new_roots + + +def _check_matches(patterns, paths): + if not patterns and not paths: + # Matched to the end. + return True + + if (not patterns and paths) or (patterns and not paths): + return False + + pattern = normcase(patterns[0]) + path = normcase(paths[0]) + + if not glob.has_magic(pattern): + if pattern != path: + return False + + elif pattern == "**": + if len(patterns) == 1: + return True # if ** is the last one it matches anything to the right. + + for i in range(len(paths)): + # Recursively check the remaining patterns as the + # current pattern could match any number of paths. + if _check_matches(patterns[1:], paths[i:]): + return True + + elif not fnmatch.fnmatch(path, pattern): + # Current part doesn't match. + return False + + return _check_matches(patterns[1:], paths[1:]) + + +def glob_matches_path(path, pattern, sep=os.sep, altsep=os.altsep): + if altsep: + pattern = pattern.replace(altsep, sep) + path = path.replace(altsep, sep) + + drive = "" + if len(path) > 1 and path[1] == ":": + drive, path = path[0], path[2:] + + if drive and len(pattern) > 1: + if pattern[1] == ":": + if drive.lower() != pattern[0].lower(): + return False + pattern = pattern[2:] + + patterns = pattern.split(sep) + paths = path.split(sep) + if paths: + if paths[0] == "": + paths = paths[1:] + if patterns: + if patterns[0] == "": + patterns = patterns[1:] + + return _check_matches(patterns, paths) + + +class FilesFiltering(object): + """ + Note: calls at FilesFiltering are uncached. + + The actual API used should be through PyDB. + """ + + def __init__(self): + self._exclude_filters = [] + self._project_roots = [] + self._library_roots = [] + + # Filter out libraries? + self._use_libraries_filter = False + self.require_module = False # True if some exclude filter filters by the module. + + self.set_use_libraries_filter(is_true_in_env("PYDEVD_FILTER_LIBRARIES")) + + project_roots = os.getenv("IDE_PROJECT_ROOTS", None) + if project_roots is not None: + project_roots = project_roots.split(os.pathsep) + else: + project_roots = [] + self.set_project_roots(project_roots) + + library_roots = os.getenv("LIBRARY_ROOTS", None) + if library_roots is not None: + library_roots = library_roots.split(os.pathsep) + else: + library_roots = self._get_default_library_roots() + self.set_library_roots(library_roots) + + # Stepping filters. + pydevd_filters = os.getenv("PYDEVD_FILTERS", "") + # To filter out it's something as: {'**/not_my_code/**': True} + if pydevd_filters: + pydev_log.debug("PYDEVD_FILTERS %s", (pydevd_filters,)) + if pydevd_filters.startswith("{"): + # dict(glob_pattern (str) -> exclude(True or False)) + exclude_filters = [] + for key, val in json.loads(pydevd_filters).items(): + exclude_filters.append(ExcludeFilter(key, val, True)) + self._exclude_filters = exclude_filters + else: + # A ';' separated list of strings with globs for the + # list of excludes. + filters = pydevd_filters.split(";") + new_filters = [] + for new_filter in filters: + if new_filter.strip(): + new_filters.append(ExcludeFilter(new_filter.strip(), True, True)) + self._exclude_filters = new_filters + + @classmethod + def _get_default_library_roots(cls): + pydev_log.debug("Collecting default library roots.") + # Provide sensible defaults if not in env vars. + import site + + roots = [] + + try: + import sysconfig # Python 2.7 onwards only. + except ImportError: + pass + else: + for path_name in set(("stdlib", "platstdlib", "purelib", "platlib")) & set(sysconfig.get_path_names()): + roots.append(sysconfig.get_path(path_name)) + + # Make sure we always get at least the standard library location (based on the `os` and + # `threading` modules -- it's a bit weird that it may be different on the ci, but it happens). + roots.append(os.path.dirname(os.__file__)) + roots.append(os.path.dirname(threading.__file__)) + if IS_PYPY: + # On PyPy 3.6 (7.3.1) it wrongly says that sysconfig.get_path('stdlib') is + # /lib-pypy when the installed version is /lib_pypy. + try: + import _pypy_wait + except ImportError: + pydev_log.debug("Unable to import _pypy_wait on PyPy when collecting default library roots.") + else: + pypy_lib_dir = os.path.dirname(_pypy_wait.__file__) + pydev_log.debug("Adding %s to default library roots.", pypy_lib_dir) + roots.append(pypy_lib_dir) + + if hasattr(site, "getusersitepackages"): + site_paths = site.getusersitepackages() + if isinstance(site_paths, (list, tuple)): + for site_path in site_paths: + roots.append(site_path) + else: + roots.append(site_paths) + + if hasattr(site, "getsitepackages"): + site_paths = site.getsitepackages() + if isinstance(site_paths, (list, tuple)): + for site_path in site_paths: + roots.append(site_path) + else: + roots.append(site_paths) + + for path in sys.path: + if os.path.exists(path) and os.path.basename(path) in ("site-packages", "pip-global"): + roots.append(path) + + # On WASM some of the roots may not exist, filter those out. + roots = [path for path in roots if path is not None] + roots.extend([os.path.realpath(path) for path in roots]) + + return sorted(set(roots)) + + def _fix_roots(self, roots): + roots = _convert_to_str_and_clear_empty(roots) + new_roots = [] + for root in roots: + path = self._absolute_normalized_path(root) + if pydevd_constants.IS_WINDOWS: + new_roots.append(path + "\\") + else: + new_roots.append(path + "/") + return new_roots + + def _absolute_normalized_path(self, filename): + """ + Provides a version of the filename that's absolute and normalized. + """ + return normcase(pydevd_file_utils.absolute_path(filename)) + + def set_project_roots(self, project_roots): + self._project_roots = self._fix_roots(project_roots) + pydev_log.debug("IDE_PROJECT_ROOTS %s\n" % project_roots) + + def _get_project_roots(self): + return self._project_roots + + def set_library_roots(self, roots): + self._library_roots = self._fix_roots(roots) + pydev_log.debug("LIBRARY_ROOTS %s\n" % roots) + + def _get_library_roots(self): + return self._library_roots + + def in_project_roots(self, received_filename): + """ + Note: don't call directly. Use PyDb.in_project_scope (there's no caching here and it doesn't + handle all possibilities for knowing whether a project is actually in the scope, it + just handles the heuristics based on the absolute_normalized_filename without the actual frame). + """ + DEBUG = False + + if received_filename.startswith(USER_CODE_BASENAMES_STARTING_WITH): + if DEBUG: + pydev_log.debug( + "In in_project_roots - user basenames - starts with %s (%s)", received_filename, USER_CODE_BASENAMES_STARTING_WITH + ) + return True + + if received_filename.startswith(LIBRARY_CODE_BASENAMES_STARTING_WITH): + if DEBUG: + pydev_log.debug( + "Not in in_project_roots - library basenames - starts with %s (%s)", + received_filename, + LIBRARY_CODE_BASENAMES_STARTING_WITH, + ) + return False + + project_roots = self._get_project_roots() # roots are absolute/normalized. + + absolute_normalized_filename = self._absolute_normalized_path(received_filename) + absolute_normalized_filename_as_dir = absolute_normalized_filename + ("\\" if IS_WINDOWS else "/") + + found_in_project = [] + for root in project_roots: + if root and (absolute_normalized_filename.startswith(root) or root == absolute_normalized_filename_as_dir): + if DEBUG: + pydev_log.debug("In project: %s (%s)", absolute_normalized_filename, root) + found_in_project.append(root) + + found_in_library = [] + library_roots = self._get_library_roots() + for root in library_roots: + if root and (absolute_normalized_filename.startswith(root) or root == absolute_normalized_filename_as_dir): + found_in_library.append(root) + if DEBUG: + pydev_log.debug("In library: %s (%s)", absolute_normalized_filename, root) + else: + if DEBUG: + pydev_log.debug("Not in library: %s (%s)", absolute_normalized_filename, root) + + if not project_roots: + # If we have no project roots configured, consider it being in the project + # roots if it's not found in site-packages (because we have defaults for those + # and not the other way around). + in_project = not found_in_library + if DEBUG: + pydev_log.debug("Final in project (no project roots): %s (%s)", absolute_normalized_filename, in_project) + + else: + in_project = False + if found_in_project: + if not found_in_library: + if DEBUG: + pydev_log.debug("Final in project (in_project and not found_in_library): %s (True)", absolute_normalized_filename) + in_project = True + else: + # Found in both, let's see which one has the bigger path matched. + if max(len(x) for x in found_in_project) > max(len(x) for x in found_in_library): + in_project = True + if DEBUG: + pydev_log.debug("Final in project (found in both): %s (%s)", absolute_normalized_filename, in_project) + + return in_project + + def use_libraries_filter(self): + """ + Should we debug only what's inside project folders? + """ + return self._use_libraries_filter + + def set_use_libraries_filter(self, use): + pydev_log.debug("pydevd: Use libraries filter: %s\n" % use) + self._use_libraries_filter = use + + def use_exclude_filters(self): + # Enabled if we have any filters registered. + return len(self._exclude_filters) > 0 + + def exclude_by_filter(self, absolute_filename, module_name): + """ + :return: True if it should be excluded, False if it should be included and None + if no rule matched the given file. + """ + for exclude_filter in self._exclude_filters: # : :type exclude_filter: ExcludeFilter + if exclude_filter.is_path: + if glob_matches_path(absolute_filename, exclude_filter.name): + return exclude_filter.exclude + else: + # Module filter. + if exclude_filter.name == module_name or module_name.startswith(exclude_filter.name + "."): + return exclude_filter.exclude + return None + + def set_exclude_filters(self, exclude_filters): + """ + :param list(ExcludeFilter) exclude_filters: + """ + self._exclude_filters = exclude_filters + self.require_module = False + for exclude_filter in exclude_filters: + if not exclude_filter.is_path: + self.require_module = True + break diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py new file mode 100644 index 0000000..0ca23e8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py @@ -0,0 +1,1307 @@ +import linecache +import os.path +import re + +from _pydev_bundle import pydev_log +from _pydevd_bundle import pydevd_dont_trace +from _pydevd_bundle.pydevd_constants import ( + RETURN_VALUES_DICT, + NO_FTRACE, + EXCEPTION_TYPE_HANDLED, + EXCEPTION_TYPE_USER_UNHANDLED, + PYDEVD_IPYTHON_CONTEXT, + PYDEVD_USE_SYS_MONITORING, +) +from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame, just_raised, remove_exception_from_frame, ignore_exception_trace +from _pydevd_bundle.pydevd_utils import get_clsname_for_code +from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame +from _pydevd_bundle.pydevd_comm_constants import constant_to_str, CMD_SET_FUNCTION_BREAK +import sys + +try: + from _pydevd_bundle.pydevd_bytecode_utils import get_smart_step_into_variant_from_frame_offset +except ImportError: + + def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): + return None + +# IFDEF CYTHON +# cython_inline_constant: CMD_STEP_INTO = 107 +# cython_inline_constant: CMD_STEP_INTO_MY_CODE = 144 +# cython_inline_constant: CMD_STEP_RETURN = 109 +# cython_inline_constant: CMD_STEP_RETURN_MY_CODE = 160 +# cython_inline_constant: CMD_STEP_OVER = 108 +# cython_inline_constant: CMD_STEP_OVER_MY_CODE = 159 +# cython_inline_constant: CMD_STEP_CAUGHT_EXCEPTION = 137 +# cython_inline_constant: CMD_SET_BREAK = 111 +# cython_inline_constant: CMD_SMART_STEP_INTO = 128 +# cython_inline_constant: CMD_STEP_INTO_COROUTINE = 206 +# cython_inline_constant: STATE_RUN = 1 +# cython_inline_constant: STATE_SUSPEND = 2 +# ELSE +# Note: those are now inlined on cython. +CMD_STEP_INTO = 107 +CMD_STEP_INTO_MY_CODE = 144 +CMD_STEP_RETURN = 109 +CMD_STEP_RETURN_MY_CODE = 160 +CMD_STEP_OVER = 108 +CMD_STEP_OVER_MY_CODE = 159 +CMD_STEP_CAUGHT_EXCEPTION = 137 +CMD_SET_BREAK = 111 +CMD_SMART_STEP_INTO = 128 +CMD_STEP_INTO_COROUTINE = 206 +STATE_RUN = 1 +STATE_SUSPEND = 2 +# ENDIF + +basename = os.path.basename + +IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") +DEBUG_START = ("pydevd.py", "run") +DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") +TRACE_PROPERTY = "pydevd_traceproperty.py" + +import dis + +try: + StopAsyncIteration +except NameError: + StopAsyncIteration = StopIteration + + +# IFDEF CYTHON +# def is_unhandled_exception(container_obj, py_db, frame, int last_raise_line, set raise_lines): +# ELSE +def is_unhandled_exception(container_obj, py_db, frame, last_raise_line, raise_lines): + # ENDIF + if frame.f_lineno in raise_lines: + return True + + else: + try_except_infos = container_obj.try_except_infos + if try_except_infos is None: + container_obj.try_except_infos = try_except_infos = py_db.collect_try_except_info(frame.f_code) + + if not try_except_infos: + # Consider the last exception as unhandled because there's no try..except in it. + return True + else: + # Now, consider only the try..except for the raise + valid_try_except_infos = [] + for try_except_info in try_except_infos: + if try_except_info.is_line_in_try_block(last_raise_line): + valid_try_except_infos.append(try_except_info) + + if not valid_try_except_infos: + return True + + else: + # Note: check all, not only the "valid" ones to cover the case + # in "tests_python.test_tracing_on_top_level.raise_unhandled10" + # where one try..except is inside the other with only a raise + # and it's gotten in the except line. + for try_except_info in try_except_infos: + if try_except_info.is_line_in_except_block(frame.f_lineno): + if frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except: + # In a raise inside a try..except block or some except which doesn't + # match the raised exception. + return True + return False + + +# IFDEF CYTHON +# cdef class _TryExceptContainerObj: +# cdef public list try_except_infos; +# def __init__(self): +# self.try_except_infos = None +# ELSE +class _TryExceptContainerObj(object): + """ + A dumb container object just to contain the try..except info when needed. Meant to be + persistent among multiple PyDBFrames to the same code object. + """ + + try_except_infos = None + +# ENDIF + + +# ======================================================================================================================= +# PyDBFrame +# ======================================================================================================================= +# IFDEF CYTHON +# cdef class PyDBFrame: +# ELSE +class PyDBFrame: + """This makes the tracing for a given frame, so, the trace_dispatch + is used initially when we enter into a new context ('call') and then + is reused for the entire context. + """ + + # ENDIF + + # IFDEF CYTHON + # cdef tuple _args + # cdef int should_skip + # cdef object exc_info + # def __init__(self, tuple args): + # self._args = args # In the cython version we don't need to pass the frame + # self.should_skip = -1 # On cythonized version, put in instance. + # self.exc_info = () + # ELSE + should_skip = -1 # Default value in class (put in instance on set). + exc_info = () # Default value in class (put in instance on set). + + if PYDEVD_USE_SYS_MONITORING: + + def __init__(self, *args, **kwargs): + raise RuntimeError("Not expected to be used in sys.monitoring.") + + else: + + def __init__(self, args): + # args = py_db, abs_path_canonical_path_and_base, base, info, t, frame + # yeap, much faster than putting in self and then getting it from self later on + self._args = args + # ENDIF + + def set_suspend(self, *args, **kwargs): + self._args[0].set_suspend(*args, **kwargs) + + def do_wait_suspend(self, *args, **kwargs): + self._args[0].do_wait_suspend(*args, **kwargs) + + # IFDEF CYTHON + # def trace_exception(self, frame, str event, arg): + # cdef bint should_stop; + # cdef tuple exc_info; + # ELSE + def trace_exception(self, frame, event, arg): + # ENDIF + if event == "exception": + should_stop, frame, exc_info = should_stop_on_exception(self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info) + self.exc_info = exc_info + + if should_stop: + if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + return self.trace_dispatch + + elif event == "return": + exc_info = self.exc_info + if exc_info and arg is None: + frame_skips_cache, frame_cache_key = self._args[4], self._args[5] + custom_key = (frame_cache_key, "try_exc_info") + container_obj = frame_skips_cache.get(custom_key) + if container_obj is None: + container_obj = frame_skips_cache[custom_key] = _TryExceptContainerObj() + if is_unhandled_exception(container_obj, self._args[0], frame, exc_info[1], exc_info[2]) and self.handle_user_exception( + frame + ): + return self.trace_dispatch + + return self.trace_exception + + def handle_user_exception(self, frame): + exc_info = self.exc_info + if exc_info: + return handle_exception(self._args[0], self._args[3], frame, exc_info[0], EXCEPTION_TYPE_USER_UNHANDLED) + return False + + # IFDEF CYTHON + # cdef get_func_name(self, frame): + # cdef str func_name + # ELSE + def get_func_name(self, frame): + # ENDIF + code_obj = frame.f_code + func_name = code_obj.co_name + try: + cls_name = get_clsname_for_code(code_obj, frame) + if cls_name is not None: + return "%s.%s" % (cls_name, func_name) + else: + return func_name + except: + pydev_log.exception() + return func_name + + # IFDEF CYTHON + # cdef _show_return_values(self, frame, arg): + # ELSE + def _show_return_values(self, frame, arg): + # ENDIF + try: + try: + f_locals_back = getattr(frame.f_back, "f_locals", None) + if f_locals_back is not None: + return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + if return_values_dict is None: + return_values_dict = {} + f_locals_back[RETURN_VALUES_DICT] = return_values_dict + name = self.get_func_name(frame) + return_values_dict[name] = arg + except: + pydev_log.exception() + finally: + f_locals_back = None + + # IFDEF CYTHON + # cdef _remove_return_values(self, py_db, frame): + # ELSE + def _remove_return_values(self, py_db, frame): + # ENDIF + try: + try: + # Showing return values was turned off, we should remove them from locals dict. + # The values can be in the current frame or in the back one + frame.f_locals.pop(RETURN_VALUES_DICT, None) + + f_locals_back = getattr(frame.f_back, "f_locals", None) + if f_locals_back is not None: + f_locals_back.pop(RETURN_VALUES_DICT, None) + except: + pydev_log.exception() + finally: + f_locals_back = None + + # IFDEF CYTHON + # cdef _get_unfiltered_back_frame(self, py_db, frame): + # ELSE + def _get_unfiltered_back_frame(self, py_db, frame): + # ENDIF + f = frame.f_back + while f is not None: + if not py_db.is_files_filter_enabled: + return f + + else: + if py_db.apply_files_filter(f, f.f_code.co_filename, False): + f = f.f_back + + else: + return f + + return f + + # IFDEF CYTHON + # cdef _is_same_frame(self, target_frame, current_frame): + # cdef PyDBAdditionalThreadInfo info; + # ELSE + def _is_same_frame(self, target_frame, current_frame): + # ENDIF + if target_frame is current_frame: + return True + + info = self._args[2] + if info.pydev_use_scoped_step_frame: + # If using scoped step we don't check the target, we just need to check + # if the current matches the same heuristic where the target was defined. + if target_frame is not None and current_frame is not None: + if target_frame.f_code.co_filename == current_frame.f_code.co_filename: + # The co_name may be different (it may include the line number), but + # the filename must still be the same. + f = current_frame.f_back + if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + f = f.f_back + if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + return True + + return False + + # IFDEF CYTHON + # cpdef trace_dispatch(self, frame, str event, arg): + # cdef tuple abs_path_canonical_path_and_base; + # cdef bint is_exception_event; + # cdef bint has_exception_breakpoints; + # cdef bint can_skip; + # cdef bint stop; + # cdef bint stop_on_plugin_breakpoint; + # cdef PyDBAdditionalThreadInfo info; + # cdef int step_cmd; + # cdef int line; + # cdef bint is_line; + # cdef bint is_call; + # cdef bint is_return; + # cdef bint should_stop; + # cdef dict breakpoints_for_file; + # cdef dict stop_info; + # cdef str curr_func_name; + # cdef dict frame_skips_cache; + # cdef object frame_cache_key; + # cdef tuple line_cache_key; + # cdef int breakpoints_in_line_cache; + # cdef int breakpoints_in_frame_cache; + # cdef bint has_breakpoint_in_frame; + # cdef bint is_coroutine_or_generator; + # cdef int bp_line; + # cdef object bp; + # cdef int pydev_smart_parent_offset + # cdef int pydev_smart_child_offset + # cdef tuple pydev_smart_step_into_variants + # ELSE + def trace_dispatch(self, frame, event, arg): + # ENDIF + # Note: this is a big function because most of the logic related to hitting a breakpoint and + # stepping is contained in it. Ideally this could be split among multiple functions, but the + # problem in this case is that in pure-python function calls are expensive and even more so + # when tracing is on (because each function call will get an additional tracing call). We + # try to address this by using the info.is_tracing for the fastest possible return, but the + # cost is still high (maybe we could use code-generation in the future and make the code + # generation be better split among what each part does). + + try: + # DEBUG = '_debugger_case_yield_from.py' in frame.f_code.co_filename + py_db, abs_path_canonical_path_and_base, info, thread, frame_skips_cache, frame_cache_key = self._args + # if DEBUG: print('frame trace_dispatch %s %s %s %s %s %s, stop: %s' % (frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename, event, constant_to_str(info.pydev_step_cmd), arg, info.pydev_step_stop)) + info.is_tracing += 1 + + # TODO: This shouldn't be needed. The fact that frame.f_lineno + # is None seems like a bug in Python 3.11. + # Reported in: https://github.com/python/cpython/issues/94485 + line = frame.f_lineno or 0 # Workaround or case where frame.f_lineno is None + line_cache_key = (frame_cache_key, line) + + if py_db.pydb_disposed: + return None if event == "call" else NO_FTRACE + + plugin_manager = py_db.plugin + has_exception_breakpoints = ( + py_db.break_on_caught_exceptions or py_db.break_on_user_uncaught_exceptions or py_db.has_plugin_exception_breaks + ) + + stop_frame = info.pydev_step_stop + step_cmd = info.pydev_step_cmd + function_breakpoint_on_call_event = None + + if frame.f_code.co_flags & 0xA0: # 0xa0 == CO_GENERATOR = 0x20 | CO_COROUTINE = 0x80 + # Dealing with coroutines and generators: + # When in a coroutine we change the perceived event to the debugger because + # a call, StopIteration exception and return are usually just pausing/unpausing it. + if event == "line": + is_line = True + is_call = False + is_return = False + is_exception_event = False + + elif event == "return": + is_line = False + is_call = False + is_return = True + is_exception_event = False + + returns_cache_key = (frame_cache_key, "returns") + return_lines = frame_skips_cache.get(returns_cache_key) + if return_lines is None: + # Note: we're collecting the return lines by inspecting the bytecode as + # there are multiple returns and multiple stop iterations when awaiting and + # it doesn't give any clear indication when a coroutine or generator is + # finishing or just pausing. + return_lines = set() + for x in py_db.collect_return_info(frame.f_code): + # Note: cython does not support closures in cpdefs (so we can't use + # a list comprehension). + return_lines.add(x.return_line) + + frame_skips_cache[returns_cache_key] = return_lines + + if line not in return_lines: + # Not really a return (coroutine/generator paused). + return self.trace_dispatch + else: + if self.exc_info: + self.handle_user_exception(frame) + return self.trace_dispatch + + # Tricky handling: usually when we're on a frame which is about to exit + # we set the step mode to step into, but in this case we'd end up in the + # asyncio internal machinery, which is not what we want, so, we just + # ask the stop frame to be a level up. + # + # Note that there's an issue here which we may want to fix in the future: if + # the back frame is a frame which is filtered, we won't stop properly. + # Solving this may not be trivial as we'd need to put a scope in the step + # in, but we may have to do it anyways to have a step in which doesn't end + # up in asyncio). + # + # Note2: we don't revert to a step in if we're doing scoped stepping + # (because on scoped stepping we're always receiving a call/line/return + # event for each line in ipython, so, we can't revert to step in on return + # as the return shouldn't mean that we've actually completed executing a + # frame in this case). + if stop_frame is frame and not info.pydev_use_scoped_step_frame: + if step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE, CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE): + f = self._get_unfiltered_back_frame(py_db, frame) + if f is not None: + info.pydev_step_cmd = CMD_STEP_INTO_COROUTINE + info.pydev_step_stop = f + else: + if step_cmd == CMD_STEP_OVER: + info.pydev_step_cmd = CMD_STEP_INTO + info.pydev_step_stop = None + + elif step_cmd == CMD_STEP_OVER_MY_CODE: + info.pydev_step_cmd = CMD_STEP_INTO_MY_CODE + info.pydev_step_stop = None + + elif step_cmd == CMD_STEP_INTO_COROUTINE: + # We're exiting this one, so, mark the new coroutine context. + f = self._get_unfiltered_back_frame(py_db, frame) + if f is not None: + info.pydev_step_stop = f + else: + info.pydev_step_cmd = CMD_STEP_INTO + info.pydev_step_stop = None + + elif event == "exception": + breakpoints_for_file = None + if has_exception_breakpoints: + should_stop, frame, exc_info = should_stop_on_exception( + self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + ) + self.exc_info = exc_info + if should_stop: + if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + return self.trace_dispatch + + return self.trace_dispatch + else: + # event == 'call' or event == 'c_XXX' + return self.trace_dispatch + + else: # Not coroutine nor generator + if event == "line": + is_line = True + is_call = False + is_return = False + is_exception_event = False + + elif event == "return": + is_line = False + is_return = True + is_call = False + is_exception_event = False + + # If we are in single step mode and something causes us to exit the current frame, we need to make sure we break + # eventually. Force the step mode to step into and the step stop frame to None. + # I.e.: F6 in the end of a function should stop in the next possible position (instead of forcing the user + # to make a step in or step over at that location). + # Note: this is especially troublesome when we're skipping code with the + # @DontTrace comment. + if ( + stop_frame is frame + and not info.pydev_use_scoped_step_frame + and is_return + and step_cmd + in (CMD_STEP_OVER, CMD_STEP_RETURN, CMD_STEP_OVER_MY_CODE, CMD_STEP_RETURN_MY_CODE, CMD_SMART_STEP_INTO) + ): + if step_cmd in (CMD_STEP_OVER, CMD_STEP_RETURN, CMD_SMART_STEP_INTO): + info.pydev_step_cmd = CMD_STEP_INTO + else: + info.pydev_step_cmd = CMD_STEP_INTO_MY_CODE + info.pydev_step_stop = None + + if self.exc_info: + if self.handle_user_exception(frame): + return self.trace_dispatch + + elif event == "call": + is_line = False + is_call = True + is_return = False + is_exception_event = False + if frame.f_code.co_firstlineno == frame.f_lineno: # Check line to deal with async/await. + function_breakpoint_on_call_event = py_db.function_breakpoint_name_to_breakpoint.get(frame.f_code.co_name) + + elif event == "exception": + is_exception_event = True + breakpoints_for_file = None + if has_exception_breakpoints: + should_stop, frame, exc_info = should_stop_on_exception( + self._args[0], self._args[2], frame, self._args[3], arg, self.exc_info + ) + self.exc_info = exc_info + if should_stop: + if handle_exception(self._args[0], self._args[3], frame, arg, EXCEPTION_TYPE_HANDLED): + return self.trace_dispatch + is_line = False + is_return = False + is_call = False + + else: + # Unexpected: just keep the same trace func (i.e.: event == 'c_XXX'). + return self.trace_dispatch + + if not is_exception_event: + breakpoints_for_file = py_db.breakpoints.get(abs_path_canonical_path_and_base[1]) + + can_skip = False + + if info.pydev_state == 1: # STATE_RUN = 1 + # we can skip if: + # - we have no stop marked + # - we should make a step return/step over and we're not in the current frame + # - we're stepping into a coroutine context and we're not in that context + if step_cmd == -1: + can_skip = True + + elif step_cmd in ( + CMD_STEP_OVER, + CMD_STEP_RETURN, + CMD_STEP_OVER_MY_CODE, + CMD_STEP_RETURN_MY_CODE, + ) and not self._is_same_frame(stop_frame, frame): + can_skip = True + + elif step_cmd == CMD_SMART_STEP_INTO and ( + stop_frame is not None + and stop_frame is not frame + and stop_frame is not frame.f_back + and (frame.f_back is None or stop_frame is not frame.f_back.f_back) + ): + can_skip = True + + elif step_cmd == CMD_STEP_INTO_MY_CODE: + if py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + ): + can_skip = True + + elif step_cmd == CMD_STEP_INTO_COROUTINE: + f = frame + while f is not None: + if self._is_same_frame(stop_frame, f): + break + f = f.f_back + else: + can_skip = True + + if can_skip: + if plugin_manager is not None and (py_db.has_plugin_line_breaks or py_db.has_plugin_exception_breaks): + can_skip = plugin_manager.can_skip(py_db, frame) + + if ( + can_skip + and py_db.show_return_values + and info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) + and self._is_same_frame(stop_frame, frame.f_back) + ): + # trace function for showing return values after step over + can_skip = False + + # Let's check to see if we are in a function that has a breakpoint. If we don't have a breakpoint, + # we will return nothing for the next trace + # also, after we hit a breakpoint and go to some other debugging state, we have to force the set trace anyway, + # so, that's why the additional checks are there. + + if function_breakpoint_on_call_event: + pass # Do nothing here (just keep on going as we can't skip it). + + elif not breakpoints_for_file: + if can_skip: + if has_exception_breakpoints: + return self.trace_exception + else: + return None if is_call else NO_FTRACE + + else: + # When cached, 0 means we don't have a breakpoint and 1 means we have. + if can_skip: + breakpoints_in_line_cache = frame_skips_cache.get(line_cache_key, -1) + if breakpoints_in_line_cache == 0: + return self.trace_dispatch + + breakpoints_in_frame_cache = frame_skips_cache.get(frame_cache_key, -1) + if breakpoints_in_frame_cache != -1: + # Gotten from cache. + has_breakpoint_in_frame = breakpoints_in_frame_cache == 1 + + else: + has_breakpoint_in_frame = False + + try: + func_lines = set() + for offset_and_lineno in dis.findlinestarts(frame.f_code): + if offset_and_lineno[1] is not None: + func_lines.add(offset_and_lineno[1]) + except: + # This is a fallback for implementations where we can't get the function + # lines -- i.e.: jython (in this case clients need to provide the function + # name to decide on the skip or we won't be able to skip the function + # completely). + + # Checks the breakpoint to see if there is a context match in some function. + curr_func_name = frame.f_code.co_name + + # global context is set with an empty name + if curr_func_name in ("?", "", ""): + curr_func_name = "" + + for bp in breakpoints_for_file.values(): + # will match either global or some function + if bp.func_name in ("None", curr_func_name): + has_breakpoint_in_frame = True + break + else: + for bp_line in breakpoints_for_file: # iterate on keys + if bp_line in func_lines: + has_breakpoint_in_frame = True + break + + # Cache the value (1 or 0 or -1 for default because of cython). + if has_breakpoint_in_frame: + frame_skips_cache[frame_cache_key] = 1 + else: + frame_skips_cache[frame_cache_key] = 0 + + if can_skip and not has_breakpoint_in_frame: + if has_exception_breakpoints: + return self.trace_exception + else: + return None if is_call else NO_FTRACE + + # We may have hit a breakpoint or we are already in step mode. Either way, let's check what we should do in this frame + # if DEBUG: print('NOT skipped: %s %s %s %s' % (frame.f_lineno, frame.f_code.co_name, event, frame.__class__.__name__)) + + try: + stop_on_plugin_breakpoint = False + # return is not taken into account for breakpoint hit because we'd have a double-hit in this case + # (one for the line and the other for the return). + + stop_info = {} + breakpoint = None + stop = False + stop_reason = CMD_SET_BREAK + bp_type = None + + if function_breakpoint_on_call_event: + breakpoint = function_breakpoint_on_call_event + stop = True + new_frame = frame + stop_reason = CMD_SET_FUNCTION_BREAK + + elif is_line and info.pydev_state != STATE_SUSPEND and breakpoints_for_file is not None and line in breakpoints_for_file: + breakpoint = breakpoints_for_file[line] + new_frame = frame + stop = True + + elif plugin_manager is not None and py_db.has_plugin_line_breaks: + result = plugin_manager.get_breakpoint(py_db, frame, event, self._args[2]) + if result: + stop_on_plugin_breakpoint = True + breakpoint, new_frame, bp_type = result + + if breakpoint: + # ok, hit breakpoint, now, we have to discover if it is a conditional breakpoint + # lets do the conditional stuff here + if breakpoint.expression is not None: + py_db.handle_breakpoint_expression(breakpoint, info, new_frame) + + if stop or stop_on_plugin_breakpoint: + eval_result = False + if breakpoint.has_condition: + eval_result = py_db.handle_breakpoint_condition(info, breakpoint, new_frame) + if not eval_result: + stop = False + stop_on_plugin_breakpoint = False + + if is_call and ( + frame.f_code.co_name in ("", "") or (line == 1 and frame.f_code.co_name.startswith(" may be executed having each line compiled as a new + # module, so it's the same case as . + + return self.trace_dispatch + + # Handle logpoint (on a logpoint we should never stop). + if (stop or stop_on_plugin_breakpoint) and breakpoint.is_logpoint: + stop = False + stop_on_plugin_breakpoint = False + + if info.pydev_message is not None and len(info.pydev_message) > 0: + cmd = py_db.cmd_factory.make_io_message(info.pydev_message + os.linesep, "1") + py_db.writer.add_command(cmd) + + if py_db.show_return_values: + if is_return and ( + ( + info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE, CMD_SMART_STEP_INTO) + and (self._is_same_frame(stop_frame, frame.f_back)) + ) + or (info.pydev_step_cmd in (CMD_STEP_RETURN, CMD_STEP_RETURN_MY_CODE) and (self._is_same_frame(stop_frame, frame))) + or (info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_COROUTINE)) + or ( + info.pydev_step_cmd == CMD_STEP_INTO_MY_CODE + and frame.f_back is not None + and not py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + ) + ): + self._show_return_values(frame, arg) + + elif py_db.remove_return_values_flag: + try: + self._remove_return_values(py_db, frame) + finally: + py_db.remove_return_values_flag = False + + if stop: + self.set_suspend( + thread, + stop_reason, + suspend_other_threads=breakpoint and breakpoint.suspend_policy == "ALL", + ) + + elif stop_on_plugin_breakpoint and plugin_manager is not None: + result = plugin_manager.suspend(py_db, thread, frame, bp_type) + if result: + frame = result + + # if thread has a suspend flag, we suspend with a busy wait + if info.pydev_state == STATE_SUSPEND: + self.do_wait_suspend(thread, frame, event, arg) + return self.trace_dispatch + else: + if not breakpoint and is_line: + # No stop from anyone and no breakpoint found in line (cache that). + frame_skips_cache[line_cache_key] = 0 + + except: + # Unfortunately Python itself stops the tracing when it originates from + # the tracing function, so, we can't do much about it (just let the user know). + exc = sys.exc_info()[0] + cmd = py_db.cmd_factory.make_console_message( + "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + % ( + exc, + thread, + ) + ) + py_db.writer.add_command(cmd) + if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + pydev_log.exception() + + raise + + # step handling. We stop when we hit the right frame + try: + should_skip = 0 + if pydevd_dont_trace.should_trace_hook is not None: + if self.should_skip == -1: + # I.e.: cache the result on self.should_skip (no need to evaluate the same frame multiple times). + # Note that on a code reload, we won't re-evaluate this because in practice, the frame.f_code + # Which will be handled by this frame is read-only, so, we can cache it safely. + if not pydevd_dont_trace.should_trace_hook(frame.f_code, abs_path_canonical_path_and_base[0]): + # -1, 0, 1 to be Cython-friendly + should_skip = self.should_skip = 1 + else: + should_skip = self.should_skip = 0 + else: + should_skip = self.should_skip + + plugin_stop = False + if should_skip: + stop = False + + elif step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE): + force_check_project_scope = step_cmd == CMD_STEP_INTO_MY_CODE + if is_line: + if not info.pydev_use_scoped_step_frame: + if force_check_project_scope or py_db.is_files_filter_enabled: + stop = not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope) + else: + stop = True + else: + if force_check_project_scope or py_db.is_files_filter_enabled: + # Make sure we check the filtering inside ipython calls too... + if not not py_db.apply_files_filter(frame, frame.f_code.co_filename, force_check_project_scope): + return None if is_call else NO_FTRACE + + # We can only stop inside the ipython call. + filename = frame.f_code.co_filename + if filename.endswith(".pyc"): + filename = filename[:-1] + + if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): + f = frame.f_back + while f is not None: + if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + f2 = f.f_back + if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + pydev_log.debug("Stop inside ipython call") + stop = True + break + f = f.f_back + + del f + + if not stop: + # In scoped mode if step in didn't work in this context it won't work + # afterwards anyways. + return None if is_call else NO_FTRACE + + elif is_return and frame.f_back is not None and not info.pydev_use_scoped_step_frame: + if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + stop = False + else: + if force_check_project_scope or py_db.is_files_filter_enabled: + stop = not py_db.apply_files_filter( + frame.f_back, frame.f_back.f_code.co_filename, force_check_project_scope + ) + if stop: + # Prevent stopping in a return to the same location we were initially + # (i.e.: double-stop at the same place due to some filtering). + if info.step_in_initial_location == (frame.f_back, frame.f_back.f_lineno): + stop = False + else: + stop = True + else: + stop = False + + if stop: + if step_cmd == CMD_STEP_INTO_COROUTINE: + # i.e.: Check if we're stepping into the proper context. + f = frame + while f is not None: + if self._is_same_frame(stop_frame, f): + break + f = f.f_back + else: + stop = False + + if plugin_manager is not None: + result = plugin_manager.cmd_step_into(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + if result: + stop, plugin_stop = result + + elif step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE): + # Note: when dealing with a step over my code it's the same as a step over (the + # difference is that when we return from a frame in one we go to regular step + # into and in the other we go to a step into my code). + stop = self._is_same_frame(stop_frame, frame) and is_line + # Note: don't stop on a return for step over, only for line events + # i.e.: don't stop in: (stop_frame is frame.f_back and is_return) as we'd stop twice in that line. + + if plugin_manager is not None: + result = plugin_manager.cmd_step_over(py_db, frame, event, self._args[2], self._args[3], stop_info, stop) + if result: + stop, plugin_stop = result + + elif step_cmd == CMD_SMART_STEP_INTO: + stop = False + back = frame.f_back + if self._is_same_frame(stop_frame, frame) and is_return: + # We're exiting the smart step into initial frame (so, we probably didn't find our target). + stop = True + + elif self._is_same_frame(stop_frame, back) and is_line: + if info.pydev_smart_child_offset != -1: + # i.e.: in this case, we're not interested in the pause in the parent, rather + # we're interested in the pause in the child (when the parent is at the proper place). + stop = False + + else: + pydev_smart_parent_offset = info.pydev_smart_parent_offset + + pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: + # Preferred mode (when the smart step into variants are available + # and the offset is set). + stop = get_smart_step_into_variant_from_frame_offset( + back.f_lasti, pydev_smart_step_into_variants + ) is get_smart_step_into_variant_from_frame_offset( + pydev_smart_parent_offset, pydev_smart_step_into_variants + ) + + else: + # Only the name/line is available, so, check that. + curr_func_name = frame.f_code.co_name + + # global context is set with an empty name + if curr_func_name in ("?", "") or curr_func_name is None: + curr_func_name = "" + if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: + stop = True + + if not stop: + # In smart step into, if we didn't hit it in this frame once, that'll + # not be the case next time either, so, disable tracing for this frame. + return None if is_call else NO_FTRACE + + elif back is not None and self._is_same_frame(stop_frame, back.f_back) and is_line: + # Ok, we have to track 2 stops at this point, the parent and the child offset. + # This happens when handling a step into which targets a function inside a list comprehension + # or generator (in which case an intermediary frame is created due to an internal function call). + pydev_smart_parent_offset = info.pydev_smart_parent_offset + pydev_smart_child_offset = info.pydev_smart_child_offset + # print('matched back frame', pydev_smart_parent_offset, pydev_smart_child_offset) + # print('parent f_lasti', back.f_back.f_lasti) + # print('child f_lasti', back.f_lasti) + stop = False + if pydev_smart_child_offset >= 0 and pydev_smart_child_offset >= 0: + pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + + if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: + # Note that we don't really check the parent offset, only the offset of + # the child (because this is a generator, the parent may have moved forward + # already -- and that's ok, so, we just check that the parent frame + # matches in this case). + smart_step_into_variant = get_smart_step_into_variant_from_frame_offset( + pydev_smart_parent_offset, pydev_smart_step_into_variants + ) + # print('matched parent offset', pydev_smart_parent_offset) + # Ok, now, check the child variant + children_variants = smart_step_into_variant.children_variants + stop = children_variants and ( + get_smart_step_into_variant_from_frame_offset(back.f_lasti, children_variants) + is get_smart_step_into_variant_from_frame_offset(pydev_smart_child_offset, children_variants) + ) + # print('stop at child', stop) + + if not stop: + # In smart step into, if we didn't hit it in this frame once, that'll + # not be the case next time either, so, disable tracing for this frame. + return None if is_call else NO_FTRACE + + elif step_cmd in (CMD_STEP_RETURN, CMD_STEP_RETURN_MY_CODE): + stop = is_return and self._is_same_frame(stop_frame, frame) + + else: + stop = False + + if stop and step_cmd != -1 and is_return and hasattr(frame, "f_back"): + f_code = getattr(frame.f_back, "f_code", None) + if f_code is not None: + if py_db.get_file_type(frame.f_back) == py_db.PYDEV_FILE: + stop = False + + if plugin_stop: + plugin_manager.stop(py_db, frame, event, self._args[3], stop_info, arg, step_cmd) + elif stop: + if is_line: + self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + self.do_wait_suspend(thread, frame, event, arg) + elif is_return: # return event + back = frame.f_back + if back is not None: + # When we get to the pydevd run function, the debugging has actually finished for the main thread + # (note that it can still go on for other threads, but for this one, we just make it finish) + # So, just setting it to None should be OK + back_absolute_filename, _, base = get_abs_path_real_path_and_base_from_frame(back) + if (base, back.f_code.co_name) in (DEBUG_START, DEBUG_START_PY3K): + back = None + + elif base == TRACE_PROPERTY: + # We dont want to trace the return event of pydevd_traceproperty (custom property for debugging) + # if we're in a return, we want it to appear to the user in the previous frame! + return None if is_call else NO_FTRACE + + elif pydevd_dont_trace.should_trace_hook is not None: + if not pydevd_dont_trace.should_trace_hook(back.f_code, back_absolute_filename): + # In this case, we'll have to skip the previous one because it shouldn't be traced. + # Also, we have to reset the tracing, because if the parent's parent (or some + # other parent) has to be traced and it's not currently, we wouldn't stop where + # we should anymore (so, a step in/over/return may not stop anywhere if no parent is traced). + # Related test: _debugger_case17a.py + py_db.set_trace_for_frame_and_parents(thread.ident, back) + return None if is_call else NO_FTRACE + + if back is not None: + # if we're in a return, we want it to appear to the user in the previous frame! + self.set_suspend(thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + self.do_wait_suspend(thread, back, event, arg) + else: + # in jython we may not have a back frame + info.pydev_step_stop = None + info.pydev_original_step_cmd = -1 + info.pydev_step_cmd = -1 + info.pydev_state = STATE_RUN + info.update_stepping_info() + + # if we are quitting, let's stop the tracing + if py_db.quitting: + return None if is_call else NO_FTRACE + + return self.trace_dispatch + except: + # Unfortunately Python itself stops the tracing when it originates from + # the tracing function, so, we can't do much about it (just let the user know). + exc = sys.exc_info()[0] + cmd = py_db.cmd_factory.make_console_message( + "%s raised from within the callback set in sys.settrace.\nDebugging will be disabled for this thread (%s).\n" + % ( + exc, + thread, + ) + ) + py_db.writer.add_command(cmd) + if not issubclass(exc, (KeyboardInterrupt, SystemExit)): + pydev_log.exception() + raise + + finally: + info.is_tracing -= 1 + + # end trace_dispatch + + +# IFDEF CYTHON +# def should_stop_on_exception(py_db, PyDBAdditionalThreadInfo info, frame, thread, arg, prev_user_uncaught_exc_info, is_unwind=False): +# cdef bint should_stop; +# cdef bint was_just_raised; +# cdef list check_excs; +# ELSE +def should_stop_on_exception(py_db, info, frame, thread, arg, prev_user_uncaught_exc_info, is_unwind=False): + # ENDIF + + should_stop = False + maybe_user_uncaught_exc_info = prev_user_uncaught_exc_info + + # STATE_SUSPEND = 2 + if info.pydev_state != 2: # and breakpoint is not None: + exception, value, trace = arg + + if trace is not None and hasattr(trace, "tb_next"): + # on jython trace is None on the first event and it may not have a tb_next. + + should_stop = False + exception_breakpoint = None + try: + if py_db.plugin is not None: + result = py_db.plugin.exception_break(py_db, frame, thread, arg, is_unwind) + if result: + should_stop, frame = result + except: + pydev_log.exception() + + if not should_stop: + # Apply checks that don't need the exception breakpoint (where we shouldn't ever stop). + if exception == SystemExit and py_db.ignore_system_exit_code(value): + pass + + elif exception in (GeneratorExit, StopIteration, StopAsyncIteration): + # These exceptions are control-flow related (they work as a generator + # pause), so, we shouldn't stop on them. + pass + + elif ignore_exception_trace(trace): + pass + + else: + was_just_raised = trace.tb_next is None + + # It was not handled by any plugin, lets check exception breakpoints. + check_excs = [] + + # Note: check user unhandled before regular exceptions. + exc_break_user = py_db.get_exception_breakpoint(exception, py_db.break_on_user_uncaught_exceptions) + if exc_break_user is not None: + check_excs.append((exc_break_user, True)) + + exc_break_caught = py_db.get_exception_breakpoint(exception, py_db.break_on_caught_exceptions) + if exc_break_caught is not None: + check_excs.append((exc_break_caught, False)) + + for exc_break, is_user_uncaught in check_excs: + # Initially mark that it should stop and then go into exclusions. + should_stop = True + + if py_db.exclude_exception_by_filter(exc_break, trace): + pydev_log.debug( + "Ignore exception %s in library %s -- (%s)" % (exception, frame.f_code.co_filename, frame.f_code.co_name) + ) + should_stop = False + + elif exc_break.condition is not None and not py_db.handle_breakpoint_condition(info, exc_break, frame): + should_stop = False + + elif is_user_uncaught: + # Note: we don't stop here, we just collect the exc_info to use later on... + should_stop = False + if not py_db.apply_files_filter(frame, frame.f_code.co_filename, True) and ( + frame.f_back is None or py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + ): + # User uncaught means that we're currently in user code but the code + # up the stack is library code. + exc_info = prev_user_uncaught_exc_info + if not exc_info: + exc_info = (arg, frame.f_lineno, set([frame.f_lineno])) + else: + lines = exc_info[2] + lines.add(frame.f_lineno) + exc_info = (arg, frame.f_lineno, lines) + maybe_user_uncaught_exc_info = exc_info + else: + # I.e.: these are only checked if we're not dealing with user uncaught exceptions. + if ( + exc_break.notify_on_first_raise_only + and py_db.skip_on_exceptions_thrown_in_same_context + and not was_just_raised + and not just_raised(trace.tb_next) + ): + # In this case we never stop if it was just raised, so, to know if it was the first we + # need to check if we're in the 2nd method. + should_stop = False # I.e.: we stop only when we're at the caller of a method that throws an exception + + elif ( + exc_break.notify_on_first_raise_only + and not py_db.skip_on_exceptions_thrown_in_same_context + and not was_just_raised + ): + should_stop = False # I.e.: we stop only when it was just raised + + elif was_just_raised and py_db.skip_on_exceptions_thrown_in_same_context: + # Option: Don't break if an exception is caught in the same function from which it is thrown + should_stop = False + + if should_stop: + exception_breakpoint = exc_break + try: + info.pydev_message = exc_break.qname + except: + info.pydev_message = exc_break.qname.encode("utf-8") + break + + if should_stop: + # Always add exception to frame (must remove later after we proceed). + add_exception_to_frame(frame, (exception, value, trace)) + + if exception_breakpoint is not None and exception_breakpoint.expression is not None: + py_db.handle_breakpoint_expression(exception_breakpoint, info, frame) + + return should_stop, frame, maybe_user_uncaught_exc_info + + +# Same thing in the main debugger but only considering the file contents, while the one in the main debugger +# considers the user input (so, the actual result must be a join of both). +filename_to_lines_where_exceptions_are_ignored: dict = {} +filename_to_stat_info: dict = {} + + +# IFDEF CYTHON +# def handle_exception(py_db, thread, frame, arg, str exception_type): +# cdef bint stopped; +# cdef tuple abs_real_path_and_base; +# cdef str absolute_filename; +# cdef str canonical_normalized_filename; +# cdef dict lines_ignored; +# cdef dict frame_id_to_frame; +# cdef dict merged; +# cdef object trace_obj; +# ELSE +def handle_exception(py_db, thread, frame, arg, exception_type): + # ENDIF + stopped = False + try: + # print('handle_exception', frame.f_lineno, frame.f_code.co_name) + + # We have 3 things in arg: exception type, description, traceback object + trace_obj = arg[2] + + initial_trace_obj = trace_obj + if trace_obj.tb_next is None and trace_obj.tb_frame is frame: + # I.e.: tb_next should be only None in the context it was thrown (trace_obj.tb_frame is frame is just a double check). + pass + else: + # Get the trace_obj from where the exception was raised... + while trace_obj.tb_next is not None: + trace_obj = trace_obj.tb_next + + if py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception: + for check_trace_obj in (initial_trace_obj, trace_obj): + abs_real_path_and_base = get_abs_path_real_path_and_base_from_frame(check_trace_obj.tb_frame) + absolute_filename = abs_real_path_and_base[0] + canonical_normalized_filename = abs_real_path_and_base[1] + + lines_ignored = filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + if lines_ignored is None: + lines_ignored = filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + + try: + curr_stat = os.stat(absolute_filename) + curr_stat = (curr_stat.st_size, curr_stat.st_mtime) + except: + curr_stat = None + + last_stat = filename_to_stat_info.get(absolute_filename) + if last_stat != curr_stat: + filename_to_stat_info[absolute_filename] = curr_stat + lines_ignored.clear() + try: + linecache.checkcache(absolute_filename) + except: + pydev_log.exception("Error in linecache.checkcache(%r)", absolute_filename) + + from_user_input = py_db.filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + if from_user_input: + merged = {} + merged.update(lines_ignored) + # Override what we have with the related entries that the user entered + merged.update(from_user_input) + else: + merged = lines_ignored + + exc_lineno = check_trace_obj.tb_lineno + + # print ('lines ignored', lines_ignored) + # print ('user input', from_user_input) + # print ('merged', merged, 'curr', exc_lineno) + + if exc_lineno not in merged: # Note: check on merged but update lines_ignored. + try: + line = linecache.getline(absolute_filename, exc_lineno, check_trace_obj.tb_frame.f_globals) + except: + pydev_log.exception("Error in linecache.getline(%r, %s, f_globals)", absolute_filename, exc_lineno) + line = "" + + if IGNORE_EXCEPTION_TAG.match(line) is not None: + lines_ignored[exc_lineno] = 1 + return False + else: + # Put in the cache saying not to ignore + lines_ignored[exc_lineno] = 0 + else: + # Ok, dict has it already cached, so, let's check it... + if merged.get(exc_lineno, 0): + return False + + try: + frame_id_to_frame = {} + frame_id_to_frame[id(frame)] = frame + f = trace_obj.tb_frame + while f is not None: + frame_id_to_frame[id(f)] = f + f = f.f_back + f = None + + stopped = True + py_db.send_caught_exception_stack(thread, arg, id(frame)) + try: + py_db.set_suspend(thread, CMD_STEP_CAUGHT_EXCEPTION) + py_db.do_wait_suspend(thread, frame, "exception", arg, exception_type=exception_type) + finally: + py_db.send_caught_exception_stack_proceeded(thread) + except: + pydev_log.exception() + + py_db.set_trace_for_frame_and_parents(thread.ident, frame) + finally: + # Make sure the user cannot see the '__exception__' we added after we leave the suspend state. + remove_exception_from_frame(frame) + # Clear some local variables... + frame = None + trace_obj = None + initial_trace_obj = None + check_trace_obj = None + f = None + frame_id_to_frame = None + py_db = None + thread = None + + return stopped diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame_utils.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame_utils.py new file mode 100644 index 0000000..07c45c7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame_utils.py @@ -0,0 +1,445 @@ +from _pydevd_bundle.pydevd_constants import EXCEPTION_TYPE_USER_UNHANDLED, EXCEPTION_TYPE_UNHANDLED, IS_PY311_OR_GREATER, IS_PY313_0 +from _pydev_bundle import pydev_log +import itertools +from typing import Any, Dict +from os.path import basename, splitext + + +class Frame(object): + def __init__(self, f_back, f_fileno, f_code, f_locals, f_globals=None, f_trace=None): + self.f_back = f_back + self.f_lineno = f_fileno + self.f_code = f_code + self.f_locals = f_locals + self.f_globals = f_globals + self.f_trace = f_trace + + if self.f_globals is None: + self.f_globals = {} + + +class FCode(object): + def __init__(self, name, filename): + self.co_name = name + self.co_filename = filename + self.co_firstlineno = 1 + self.co_flags = 0 + + def co_lines(self): + return () + + +def add_exception_to_frame(frame, exception_info): + frame.f_locals["__exception__"] = exception_info + + +def remove_exception_from_frame(frame): + if IS_PY313_0: + # In 3.13.0 frame.f_locals became a proxy for a dict, It does not + # have methods to allow items to be removed, only added. So just set the item to None. + # Should be fixed in 3.13.1 in PR: https://github.com/python/cpython/pull/125616 + frame.f_locals["__exception__"] = None + else: + frame.f_locals.pop("__exception__", None) + + +FILES_WITH_IMPORT_HOOKS = ["pydev_monkey_qt.py", "pydev_import_hook.py"] + + +def just_raised(trace): + if trace is None: + return False + + return trace.tb_next is None + + +def short_tb(exc_tb): + traceback = [] + while exc_tb: + traceback.append("{%r, %r, %r}" % (exc_tb.tb_frame.f_code.co_filename, exc_tb.tb_frame.f_code.co_name, exc_tb.tb_lineno)) + exc_tb = exc_tb.tb_next + return "Traceback: %s\n" % (" -> ".join(traceback)) + + +def short_frame(frame): + if frame is None: + return "None" + + filename = frame.f_code.co_filename + name = splitext(basename(filename))[0] + line = hasattr(frame, "f_lineno") and frame.f_lineno or 1 + return "%s::%s %s" % (name, frame.f_code.co_name, line) + + +def short_stack(frame): + stack = [] + while frame: + stack.append(short_frame(frame)) + frame = frame.f_back if hasattr(frame, "f_back") else None + return "Stack: %s\n" % (" -> ".join(stack)) + + +def ignore_exception_trace(trace): + while trace is not None: + filename = trace.tb_frame.f_code.co_filename + if filename in ("", ""): + # Do not stop on inner exceptions in py3 while importing + return True + + # ImportError should appear in a user's code, not inside debugger + for file in FILES_WITH_IMPORT_HOOKS: + if filename.endswith(file): + return True + + trace = trace.tb_next + + return False + + +def cached_call(obj, func, *args): + cached_name = "_cached_" + func.__name__ + if not hasattr(obj, cached_name): + setattr(obj, cached_name, func(*args)) + + return getattr(obj, cached_name) + + +class _LineColInfo: + def __init__(self, lineno, end_lineno, colno, end_colno): + self.lineno = lineno + self.end_lineno = end_lineno + self.colno = colno + self.end_colno = end_colno + + def map_columns_to_line(self, original_line: str): + """ + The columns internally are actually based on bytes. + + Also, the position isn't always the ideal one as the start may not be + what we want (if the user has many subscripts in the line the start + will always be the same and only the end would change). + For more details see: + https://github.com/microsoft/debugpy/issues/1099#issuecomment-1303403995 + + So, this function maps the start/end columns to the position to be shown in the editor. + """ + colno = _utf8_byte_offset_to_character_offset(original_line, self.colno) + end_colno = _utf8_byte_offset_to_character_offset(original_line, self.end_colno) + + if self.lineno == self.end_lineno: + try: + ret = _extract_caret_anchors_in_bytes_from_line_segment(original_line[colno:end_colno]) + if ret is not None: + return ( + _utf8_byte_offset_to_character_offset(original_line, ret[0] + self.colno), + _utf8_byte_offset_to_character_offset(original_line, ret[1] + self.colno), + ) + except Exception: + pass # Suppress exception + + return colno, end_colno + + +_utf8_with_2_bytes = 0x80 +_utf8_with_3_bytes = 0x800 +_utf8_with_4_bytes = 0x10000 + + +def _utf8_byte_offset_to_character_offset(s: str, offset: int): + byte_offset = 0 + char_offset = 0 + offset = offset or 0 + + for char_offset, character in enumerate(s): + byte_offset += 1 + + codepoint = ord(character) + + if codepoint >= _utf8_with_4_bytes: + byte_offset += 3 + + elif codepoint >= _utf8_with_3_bytes: + byte_offset += 2 + + elif codepoint >= _utf8_with_2_bytes: + byte_offset += 1 + + if byte_offset > offset: + break + else: + char_offset += 1 + + return char_offset + + +# Based on traceback._extract_caret_anchors_in_bytes_from_line_segment (Python 3.11.0) +def _extract_caret_anchors_in_bytes_from_line_segment(segment: str): + import ast + + try: + segment = segment.encode("utf-8") + except UnicodeEncodeError: + return None + try: + tree = ast.parse(segment) + except SyntaxError: + return None + + if len(tree.body) != 1: + return None + + statement = tree.body[0] + if isinstance(statement, ast.Expr): + expr = statement.value + if isinstance(expr, ast.BinOp): + operator_str = segment[expr.left.end_col_offset : expr.right.col_offset] + operator_offset = len(operator_str) - len(operator_str.lstrip()) + + left_anchor = expr.left.end_col_offset + operator_offset + right_anchor = left_anchor + 1 + if operator_offset + 1 < len(operator_str) and not operator_str[operator_offset + 1] == ord(b" "): + right_anchor += 1 + return left_anchor, right_anchor + if isinstance(expr, ast.Subscript): + return expr.value.end_col_offset, expr.slice.end_col_offset + 1 + + return None + + +class FramesList(object): + def __init__(self): + self._frames = [] + + # If available, the line number for the frame will be gotten from this dict, + # otherwise frame.f_lineno will be used (needed for unhandled exceptions as + # the place where we report may be different from the place where it's raised). + self.frame_id_to_lineno = {} + self.frame_id_to_line_col_info: Dict[Any, _LineColInfo] = {} + + self.exc_type = None + self.exc_desc = None + self.trace_obj = None + + # This may be set to set the current frame (for the case where we have + # an unhandled exception where we want to show the root bu we have a different + # executing frame). + self.current_frame = None + + # This is to know whether an exception was extracted from a __cause__ or __context__. + self.exc_context_msg = "" + + self.chained_frames_list = None + + def append(self, frame): + self._frames.append(frame) + + def last_frame(self): + return self._frames[-1] + + def __len__(self): + return len(self._frames) + + def __iter__(self): + return iter(self._frames) + + def __repr__(self): + lst = ["FramesList("] + + lst.append("\n exc_type: ") + lst.append(str(self.exc_type)) + + lst.append("\n exc_desc: ") + lst.append(str(self.exc_desc)) + + lst.append("\n trace_obj: ") + lst.append(str(self.trace_obj)) + + lst.append("\n current_frame: ") + lst.append(str(self.current_frame)) + + for frame in self._frames: + lst.append("\n ") + lst.append(repr(frame)) + lst.append(",") + + if self.chained_frames_list is not None: + lst.append("\n--- Chained ---\n") + lst.append(str(self.chained_frames_list)) + + lst.append("\n)") + + return "".join(lst) + + __str__ = __repr__ + + +class _DummyFrameWrapper(object): + def __init__(self, frame, f_lineno, f_back): + self._base_frame = frame + self.f_lineno = f_lineno + self.f_back = f_back + self.f_trace = None + original_code = frame.f_code + name = original_code.co_name + self.f_code = FCode(name, original_code.co_filename) + + @property + def f_locals(self): + return self._base_frame.f_locals + + @property + def f_globals(self): + return self._base_frame.f_globals + + def __str__(self): + return "<_DummyFrameWrapper, file '%s', line %s, %s" % (self.f_code.co_filename, self.f_lineno, self.f_code.co_name) + + __repr__ = __str__ + + +_cause_message = "\nThe above exception was the direct cause " "of the following exception:\n\n" + +_context_message = "\nDuring handling of the above exception, " "another exception occurred:\n\n" + + +def create_frames_list_from_exception_cause(trace_obj, frame, exc_type, exc_desc, memo): + lst = [] + msg = "" + try: + exc_cause = getattr(exc_desc, "__cause__", None) + msg = _cause_message + except Exception: + exc_cause = None + + if exc_cause is None: + try: + exc_cause = getattr(exc_desc, "__context__", None) + msg = _context_message + except Exception: + exc_cause = None + + if exc_cause is None or id(exc_cause) in memo: + return None + + # The traceback module does this, so, let's play safe here too... + memo.add(id(exc_cause)) + + tb = exc_cause.__traceback__ + frames_list = FramesList() + frames_list.exc_type = type(exc_cause) + frames_list.exc_desc = exc_cause + frames_list.trace_obj = tb + frames_list.exc_context_msg = msg + + while tb is not None: + # Note: we don't use the actual tb.tb_frame because if the cause of the exception + # uses the same frame object, the id(frame) would be the same and the frame_id_to_lineno + # would be wrong as the same frame needs to appear with 2 different lines. + lst.append((_DummyFrameWrapper(tb.tb_frame, tb.tb_lineno, None), tb.tb_lineno, _get_line_col_info_from_tb(tb))) + tb = tb.tb_next + + for tb_frame, tb_lineno, line_col_info in lst: + frames_list.append(tb_frame) + frames_list.frame_id_to_lineno[id(tb_frame)] = tb_lineno + frames_list.frame_id_to_line_col_info[id(tb_frame)] = line_col_info + + return frames_list + + +if IS_PY311_OR_GREATER: + + def _get_code_position(code, instruction_index): + if instruction_index < 0: + return (None, None, None, None) + positions_gen = code.co_positions() + # Note: some or all of the tuple elements can be None... + return next(itertools.islice(positions_gen, instruction_index // 2, None)) + + def _get_line_col_info_from_tb(tb): + positions = _get_code_position(tb.tb_frame.f_code, tb.tb_lasti) + if positions[0] is None: + return _LineColInfo(tb.tb_lineno, *positions[1:]) + else: + return _LineColInfo(*positions) + +else: + + def _get_line_col_info_from_tb(tb): + # Not available on older versions of Python. + return None + + +def create_frames_list_from_traceback(trace_obj, frame, exc_type, exc_desc, exception_type=None): + """ + :param trace_obj: + This is the traceback from which the list should be created. + + :param frame: + This is the first frame to be considered (i.e.: topmost frame). If None is passed, all + the frames from the traceback are shown (so, None should be passed for unhandled exceptions). + + :param exception_type: + If this is an unhandled exception or user unhandled exception, we'll not trim the stack to create from the passed + frame, rather, we'll just mark the frame in the frames list. + """ + lst = [] + + tb = trace_obj + if tb is not None and tb.tb_frame is not None: + f = tb.tb_frame.f_back + while f is not None: + lst.insert(0, (f, f.f_lineno, None)) + f = f.f_back + + while tb is not None: + lst.append((tb.tb_frame, tb.tb_lineno, _get_line_col_info_from_tb(tb))) + tb = tb.tb_next + + frames_list = None + + for tb_frame, tb_lineno, line_col_info in reversed(lst): + if frames_list is None and ((frame is tb_frame) or (frame is None) or (exception_type == EXCEPTION_TYPE_USER_UNHANDLED)): + frames_list = FramesList() + + if frames_list is not None: + frames_list.append(tb_frame) + frames_list.frame_id_to_lineno[id(tb_frame)] = tb_lineno + frames_list.frame_id_to_line_col_info[id(tb_frame)] = line_col_info + + if frames_list is None and frame is not None: + # Fallback (shouldn't happen in practice). + pydev_log.info("create_frames_list_from_traceback did not find topmost frame in list.") + frames_list = create_frames_list_from_frame(frame) + + frames_list.exc_type = exc_type + frames_list.exc_desc = exc_desc + frames_list.trace_obj = trace_obj + + if exception_type == EXCEPTION_TYPE_USER_UNHANDLED: + frames_list.current_frame = frame + elif exception_type == EXCEPTION_TYPE_UNHANDLED: + if len(frames_list) > 0: + frames_list.current_frame = frames_list.last_frame() + + curr = frames_list + memo = set() + memo.add(id(exc_desc)) + + while True: + chained = create_frames_list_from_exception_cause(None, None, None, curr.exc_desc, memo) + if chained is None: + break + else: + curr.chained_frames_list = chained + curr = chained + + return frames_list + + +def create_frames_list_from_frame(frame): + lst = FramesList() + while frame is not None: + lst.append(frame) + frame = frame.f_back + + return lst diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_gevent_integration.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_gevent_integration.py new file mode 100644 index 0000000..ee5acc2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_gevent_integration.py @@ -0,0 +1,91 @@ +import pydevd_tracing +import greenlet +import gevent +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle.pydevd_custom_frames import add_custom_frame, update_custom_frame, remove_custom_frame +from _pydevd_bundle.pydevd_constants import GEVENT_SHOW_PAUSED_GREENLETS, get_global_debugger, thread_get_ident +from _pydev_bundle import pydev_log +from pydevd_file_utils import basename + +_saved_greenlets_to_custom_frame_thread_id = {} + +if GEVENT_SHOW_PAUSED_GREENLETS: + + def _get_paused_name(py_db, g): + frame = g.gr_frame + use_frame = frame + + # i.e.: Show in the description of the greenlet the last user-code found. + while use_frame is not None: + if py_db.apply_files_filter(use_frame, use_frame.f_code.co_filename, True): + frame = use_frame + use_frame = use_frame.f_back + else: + break + + if use_frame is None: + use_frame = frame + + return "%s: %s - %s" % (type(g).__name__, use_frame.f_code.co_name, basename(use_frame.f_code.co_filename)) + + def greenlet_events(event, args): + if event in ("switch", "throw"): + py_db = get_global_debugger() + origin, target = args + + if not origin.dead and origin.gr_frame is not None: + frame_custom_thread_id = _saved_greenlets_to_custom_frame_thread_id.get(origin) + if frame_custom_thread_id is None: + _saved_greenlets_to_custom_frame_thread_id[origin] = add_custom_frame( + origin.gr_frame, _get_paused_name(py_db, origin), thread_get_ident() + ) + else: + update_custom_frame(frame_custom_thread_id, origin.gr_frame, _get_paused_name(py_db, origin), thread_get_ident()) + else: + frame_custom_thread_id = _saved_greenlets_to_custom_frame_thread_id.pop(origin, None) + if frame_custom_thread_id is not None: + remove_custom_frame(frame_custom_thread_id) + + # This one will be resumed, so, remove custom frame from it. + frame_custom_thread_id = _saved_greenlets_to_custom_frame_thread_id.pop(target, None) + if frame_custom_thread_id is not None: + remove_custom_frame(frame_custom_thread_id) + + # The tracing needs to be reapplied for each greenlet as gevent + # clears the tracing set through sys.settrace for each greenlet. + pydevd_tracing.reapply_settrace() + +else: + # i.e.: no logic related to showing paused greenlets is needed. + def greenlet_events(event, args): + pydevd_tracing.reapply_settrace() + + +def enable_gevent_integration(): + # References: + # https://greenlet.readthedocs.io/en/latest/api.html#greenlet.settrace + # https://greenlet.readthedocs.io/en/latest/tracing.html + + # Note: gevent.version_info is WRONG (gevent.__version__ must be used). + try: + if tuple(int(x) for x in gevent.__version__.split(".")[:2]) <= (20, 0): + if not GEVENT_SHOW_PAUSED_GREENLETS: + return + + if not hasattr(greenlet, "settrace"): + # In older versions it was optional. + # We still try to use if available though. + pydev_log.debug("greenlet.settrace not available. GEVENT_SHOW_PAUSED_GREENLETS will have no effect.") + return + try: + greenlet.settrace(greenlet_events) + except: + pydev_log.exception("Error with greenlet.settrace.") + except: + pydev_log.exception("Error setting up gevent %s.", gevent.__version__) + + +def log_gevent_debug_info(): + pydev_log.debug("Greenlet version: %s", greenlet.__version__) + pydev_log.debug("Gevent version: %s", gevent.__version__) + pydev_log.debug("Gevent install location: %s", gevent.__file__) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_import_class.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_import_class.py new file mode 100644 index 0000000..a655e47 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_import_class.py @@ -0,0 +1,70 @@ +# Note: code gotten from _pydev_imports_tipper. + +import sys + + +def _imp(name, log=None): + try: + return __import__(name) + except: + if "." in name: + sub = name[0 : name.rfind(".")] + + if log is not None: + log.add_content("Unable to import", name, "trying with", sub) + log.add_exception() + + return _imp(sub, log) + else: + s = "Unable to import module: %s - sys.path: %s" % (str(name), sys.path) + if log is not None: + log.add_content(s) + log.add_exception() + + raise ImportError(s) + + +IS_IPY = False +if sys.platform == "cli": + IS_IPY = True + _old_imp = _imp + + def _imp(name, log=None): + # We must add a reference in clr for .Net + import clr # @UnresolvedImport + + initial_name = name + while "." in name: + try: + clr.AddReference(name) + break # If it worked, that's OK. + except: + name = name[0 : name.rfind(".")] + else: + try: + clr.AddReference(name) + except: + pass # That's OK (not dot net module). + + return _old_imp(initial_name, log) + + +def import_name(name, log=None): + mod = _imp(name, log) + + components = name.split(".") + + old_comp = None + for comp in components[1:]: + try: + # this happens in the following case: + # we have mx.DateTime.mxDateTime.mxDateTime.pyd + # but after importing it, mx.DateTime.mxDateTime shadows access to mxDateTime.pyd + mod = getattr(mod, comp) + except AttributeError: + if old_comp != comp: + raise + + old_comp = comp + + return mod diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_io.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_io.py new file mode 100644 index 0000000..7d3bffb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_io.py @@ -0,0 +1,256 @@ +from _pydevd_bundle.pydevd_constants import ForkSafeLock, get_global_debugger +import os +import sys +from contextlib import contextmanager + + +class IORedirector: + """ + This class works to wrap a stream (stdout/stderr) with an additional redirect. + """ + + def __init__(self, original, new_redirect, wrap_buffer=False): + """ + :param stream original: + The stream to be wrapped (usually stdout/stderr, but could be None). + + :param stream new_redirect: + Usually IOBuf (below). + + :param bool wrap_buffer: + Whether to create a buffer attribute (needed to mimick python 3 s + tdout/stderr which has a buffer to write binary data). + """ + self._lock = ForkSafeLock(rlock=True) + self._writing = False + self._redirect_to = (original, new_redirect) + if wrap_buffer and hasattr(original, "buffer"): + self.buffer = IORedirector(original.buffer, new_redirect.buffer, False) + + def write(self, s): + # Note that writing to the original stream may fail for some reasons + # (such as trying to write something that's not a string or having it closed). + with self._lock: + if self._writing: + return + self._writing = True + try: + for r in self._redirect_to: + if hasattr(r, "write"): + r.write(s) + finally: + self._writing = False + + def isatty(self): + for r in self._redirect_to: + if hasattr(r, "isatty"): + return r.isatty() + return False + + def flush(self): + for r in self._redirect_to: + if hasattr(r, "flush"): + r.flush() + + def __getattr__(self, name): + for r in self._redirect_to: + if hasattr(r, name): + return getattr(r, name) + raise AttributeError(name) + + +class RedirectToPyDBIoMessages(object): + def __init__(self, out_ctx, wrap_stream, wrap_buffer, on_write=None): + """ + :param out_ctx: + 1=stdout and 2=stderr + + :param wrap_stream: + Either sys.stdout or sys.stderr. + + :param bool wrap_buffer: + If True the buffer attribute (which wraps writing bytes) should be + wrapped. + + :param callable(str) on_write: + May be a custom callable to be called when to write something. + If not passed the default implementation will create an io message + and send it through the debugger. + """ + encoding = getattr(wrap_stream, "encoding", None) + if not encoding: + encoding = os.environ.get("PYTHONIOENCODING", "utf-8") + self.encoding = encoding + self._out_ctx = out_ctx + if wrap_buffer: + self.buffer = RedirectToPyDBIoMessages(out_ctx, wrap_stream, wrap_buffer=False, on_write=on_write) + self._on_write = on_write + + def get_pydb(self): + # Note: separate method for mocking on tests. + return get_global_debugger() + + def flush(self): + pass # no-op here + + def write(self, s): + if self._on_write is not None: + self._on_write(s) + return + + if s: + # Need s in str + if isinstance(s, bytes): + s = s.decode(self.encoding, errors="replace") + + py_db = self.get_pydb() + if py_db is not None: + # Note that the actual message contents will be a xml with utf-8, although + # the entry is str on py3 and bytes on py2. + cmd = py_db.cmd_factory.make_io_message(s, self._out_ctx) + if py_db.writer is not None: + py_db.writer.add_command(cmd) + + +class IOBuf: + """This class works as a replacement for stdio and stderr. + It is a buffer and when its contents are requested, it will erase what + it has so far so that the next return will not return the same contents again. + """ + + def __init__(self): + self.buflist = [] + import os + + self.encoding = os.environ.get("PYTHONIOENCODING", "utf-8") + + def getvalue(self): + b = self.buflist + self.buflist = [] # clear it + return "".join(b) # bytes on py2, str on py3. + + def write(self, s): + if isinstance(s, bytes): + s = s.decode(self.encoding, errors="replace") + self.buflist.append(s) + + def isatty(self): + return False + + def flush(self): + pass + + def empty(self): + return len(self.buflist) == 0 + + +class _RedirectInfo(object): + def __init__(self, original, redirect_to): + self.original = original + self.redirect_to = redirect_to + + +class _RedirectionsHolder: + _lock = ForkSafeLock(rlock=True) + _stack_stdout = [] + _stack_stderr = [] + + _pydevd_stdout_redirect_ = None + _pydevd_stderr_redirect_ = None + + +def start_redirect(keep_original_redirection=False, std="stdout", redirect_to=None): + """ + @param std: 'stdout', 'stderr', or 'both' + """ + with _RedirectionsHolder._lock: + if redirect_to is None: + redirect_to = IOBuf() + + if std == "both": + config_stds = ["stdout", "stderr"] + else: + config_stds = [std] + + for std in config_stds: + original = getattr(sys, std) + stack = getattr(_RedirectionsHolder, "_stack_%s" % std) + + if keep_original_redirection: + wrap_buffer = True if hasattr(redirect_to, "buffer") else False + new_std_instance = IORedirector(getattr(sys, std), redirect_to, wrap_buffer=wrap_buffer) + setattr(sys, std, new_std_instance) + else: + new_std_instance = redirect_to + setattr(sys, std, redirect_to) + + stack.append(_RedirectInfo(original, new_std_instance)) + + return redirect_to + + +def end_redirect(std="stdout"): + with _RedirectionsHolder._lock: + if std == "both": + config_stds = ["stdout", "stderr"] + else: + config_stds = [std] + for std in config_stds: + stack = getattr(_RedirectionsHolder, "_stack_%s" % std) + redirect_info = stack.pop() + setattr(sys, std, redirect_info.original) + + +def redirect_stream_to_pydb_io_messages(std): + """ + :param std: + 'stdout' or 'stderr' + """ + with _RedirectionsHolder._lock: + redirect_to_name = "_pydevd_%s_redirect_" % (std,) + if getattr(_RedirectionsHolder, redirect_to_name) is None: + wrap_buffer = True + original = getattr(sys, std) + + redirect_to = RedirectToPyDBIoMessages(1 if std == "stdout" else 2, original, wrap_buffer) + start_redirect(keep_original_redirection=True, std=std, redirect_to=redirect_to) + + stack = getattr(_RedirectionsHolder, "_stack_%s" % std) + setattr(_RedirectionsHolder, redirect_to_name, stack[-1]) + return True + + return False + + +def stop_redirect_stream_to_pydb_io_messages(std): + """ + :param std: + 'stdout' or 'stderr' + """ + with _RedirectionsHolder._lock: + redirect_to_name = "_pydevd_%s_redirect_" % (std,) + redirect_info = getattr(_RedirectionsHolder, redirect_to_name) + if redirect_info is not None: # :type redirect_info: _RedirectInfo + setattr(_RedirectionsHolder, redirect_to_name, None) + + stack = getattr(_RedirectionsHolder, "_stack_%s" % std) + prev_info = stack.pop() + + curr = getattr(sys, std) + if curr is redirect_info.redirect_to: + setattr(sys, std, redirect_info.original) + + +@contextmanager +def redirect_stream_to_pydb_io_messages_context(): + with _RedirectionsHolder._lock: + redirecting = [] + for std in ("stdout", "stderr"): + if redirect_stream_to_pydb_io_messages(std): + redirecting.append(std) + + try: + yield + finally: + for std in redirecting: + stop_redirect_stream_to_pydb_io_messages(std) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_json_debug_options.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_json_debug_options.py new file mode 100644 index 0000000..d8f93c1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_json_debug_options.py @@ -0,0 +1,200 @@ +import json +import urllib.parse as urllib_parse + + +class DebugOptions(object): + __slots__ = [ + "just_my_code", + "redirect_output", + "show_return_value", + "break_system_exit_zero", + "django_debug", + "flask_debug", + "stop_on_entry", + "max_exception_stack_frames", + "gui_event_loop", + "client_os", + ] + + def __init__(self): + self.just_my_code = True + self.redirect_output = False + self.show_return_value = False + self.break_system_exit_zero = False + self.django_debug = False + self.flask_debug = False + self.stop_on_entry = False + self.max_exception_stack_frames = 0 + self.gui_event_loop = "matplotlib" + self.client_os = None + + def to_json(self): + dct = {} + for s in self.__slots__: + dct[s] = getattr(self, s) + return json.dumps(dct) + + def update_fom_debug_options(self, debug_options): + if "DEBUG_STDLIB" in debug_options: + self.just_my_code = not debug_options.get("DEBUG_STDLIB") + + if "REDIRECT_OUTPUT" in debug_options: + self.redirect_output = debug_options.get("REDIRECT_OUTPUT") + + if "SHOW_RETURN_VALUE" in debug_options: + self.show_return_value = debug_options.get("SHOW_RETURN_VALUE") + + if "BREAK_SYSTEMEXIT_ZERO" in debug_options: + self.break_system_exit_zero = debug_options.get("BREAK_SYSTEMEXIT_ZERO") + + if "DJANGO_DEBUG" in debug_options: + self.django_debug = debug_options.get("DJANGO_DEBUG") + + if "FLASK_DEBUG" in debug_options: + self.flask_debug = debug_options.get("FLASK_DEBUG") + + if "STOP_ON_ENTRY" in debug_options: + self.stop_on_entry = debug_options.get("STOP_ON_ENTRY") + + if "CLIENT_OS_TYPE" in debug_options: + self.client_os = debug_options.get("CLIENT_OS_TYPE") + + # Note: _max_exception_stack_frames cannot be set by debug options. + + def update_from_args(self, args): + if "justMyCode" in args: + self.just_my_code = bool_parser(args["justMyCode"]) + else: + # i.e.: if justMyCode is provided, don't check the deprecated value + if "debugStdLib" in args: + self.just_my_code = not bool_parser(args["debugStdLib"]) + + if "redirectOutput" in args: + self.redirect_output = bool_parser(args["redirectOutput"]) + + if "showReturnValue" in args: + self.show_return_value = bool_parser(args["showReturnValue"]) + + if "breakOnSystemExitZero" in args: + self.break_system_exit_zero = bool_parser(args["breakOnSystemExitZero"]) + + if "django" in args: + self.django_debug = bool_parser(args["django"]) + + if "flask" in args: + self.flask_debug = bool_parser(args["flask"]) + + if "jinja" in args: + self.flask_debug = bool_parser(args["jinja"]) + + if "stopOnEntry" in args: + self.stop_on_entry = bool_parser(args["stopOnEntry"]) + + self.max_exception_stack_frames = int_parser(args.get("maxExceptionStackFrames", 0)) + + if "guiEventLoop" in args: + self.gui_event_loop = str(args["guiEventLoop"]) + + if "clientOS" in args: + self.client_os = str(args["clientOS"]).upper() + + +def int_parser(s, default_value=0): + try: + return int(s) + except Exception: + return default_value + + +def bool_parser(s): + return s in ("True", "true", "1", True, 1) + + +def unquote(s): + return None if s is None else urllib_parse.unquote(s) + + +DEBUG_OPTIONS_PARSER = { + "WAIT_ON_ABNORMAL_EXIT": bool_parser, + "WAIT_ON_NORMAL_EXIT": bool_parser, + "BREAK_SYSTEMEXIT_ZERO": bool_parser, + "REDIRECT_OUTPUT": bool_parser, + "DJANGO_DEBUG": bool_parser, + "FLASK_DEBUG": bool_parser, + "FIX_FILE_PATH_CASE": bool_parser, + "CLIENT_OS_TYPE": unquote, + "DEBUG_STDLIB": bool_parser, + "STOP_ON_ENTRY": bool_parser, + "SHOW_RETURN_VALUE": bool_parser, + "MULTIPROCESS": bool_parser, +} + +DEBUG_OPTIONS_BY_FLAG = { + "RedirectOutput": "REDIRECT_OUTPUT=True", + "WaitOnNormalExit": "WAIT_ON_NORMAL_EXIT=True", + "WaitOnAbnormalExit": "WAIT_ON_ABNORMAL_EXIT=True", + "BreakOnSystemExitZero": "BREAK_SYSTEMEXIT_ZERO=True", + "Django": "DJANGO_DEBUG=True", + "Flask": "FLASK_DEBUG=True", + "Jinja": "FLASK_DEBUG=True", + "FixFilePathCase": "FIX_FILE_PATH_CASE=True", + "DebugStdLib": "DEBUG_STDLIB=True", + "WindowsClient": "CLIENT_OS_TYPE=WINDOWS", + "UnixClient": "CLIENT_OS_TYPE=UNIX", + "StopOnEntry": "STOP_ON_ENTRY=True", + "ShowReturnValue": "SHOW_RETURN_VALUE=True", + "Multiprocess": "MULTIPROCESS=True", +} + + +def _build_debug_options(flags): + """Build string representation of debug options from the launch config.""" + return ";".join(DEBUG_OPTIONS_BY_FLAG[flag] for flag in flags or [] if flag in DEBUG_OPTIONS_BY_FLAG) + + +def _parse_debug_options(opts): + """Debug options are semicolon separated key=value pairs""" + options = {} + if not opts: + return options + + for opt in opts.split(";"): + try: + key, value = opt.split("=") + except ValueError: + continue + try: + options[key] = DEBUG_OPTIONS_PARSER[key](value) + except KeyError: + continue + + return options + + +def _extract_debug_options(opts, flags=None): + """Return the debug options encoded in the given value. + + "opts" is a semicolon-separated string of "key=value" pairs. + "flags" is a list of strings. + + If flags is provided then it is used as a fallback. + + The values come from the launch config: + + { + type:'python', + request:'launch'|'attach', + name:'friendly name for debug config', + debugOptions:[ + 'RedirectOutput', 'Django' + ], + options:'REDIRECT_OUTPUT=True;DJANGO_DEBUG=True' + } + + Further information can be found here: + + https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes + """ + if not opts: + opts = _build_debug_options(flags) + return _parse_debug_options(opts) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command.py new file mode 100644 index 0000000..cc345f1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command.py @@ -0,0 +1,147 @@ +from _pydevd_bundle.pydevd_constants import ( + DebugInfoHolder, + get_global_debugger, + GetGlobalDebugger, + set_global_debugger, +) # Keep for backward compatibility @UnusedImport +from _pydevd_bundle.pydevd_utils import quote_smart as quote, to_string +from _pydevd_bundle.pydevd_comm_constants import ID_TO_MEANING, CMD_EXIT +from _pydevd_bundle.pydevd_constants import HTTP_PROTOCOL, HTTP_JSON_PROTOCOL, get_protocol, IS_JYTHON, ForkSafeLock +import json +from _pydev_bundle import pydev_log + + +class _BaseNetCommand(object): + # Command id. Should be set in instance. + id = -1 + + # Dict representation of the command to be set in instance. Only set for json commands. + as_dict = None + + def send(self, *args, **kwargs): + pass + + def call_after_send(self, callback): + pass + + +class _NullNetCommand(_BaseNetCommand): + pass + + +class _NullExitCommand(_NullNetCommand): + id = CMD_EXIT + + +# Constant meant to be passed to the writer when the command is meant to be ignored. +NULL_NET_COMMAND = _NullNetCommand() + +# Exit command -- only internal (we don't want/need to send this to the IDE). +NULL_EXIT_COMMAND = _NullExitCommand() + + +class NetCommand(_BaseNetCommand): + """ + Commands received/sent over the network. + + Command can represent command received from the debugger, + or one to be sent by daemon. + """ + + next_seq = 0 # sequence numbers + + _showing_debug_info = 0 + _show_debug_info_lock = ForkSafeLock(rlock=True) + + _after_send = None + + def __init__(self, cmd_id, seq, text, is_json=False): + """ + If sequence is 0, new sequence will be generated (otherwise, this was the response + to a command from the client). + """ + protocol = get_protocol() + self.id = cmd_id + if seq == 0: + NetCommand.next_seq += 2 + seq = NetCommand.next_seq + + self.seq = seq + + if is_json: + if hasattr(text, "to_dict"): + as_dict = text.to_dict(update_ids_to_dap=True) + else: + assert isinstance(text, dict) + as_dict = text + as_dict["pydevd_cmd_id"] = cmd_id + as_dict["seq"] = seq + self.as_dict = as_dict + text = json.dumps(as_dict) + + assert isinstance(text, str) + + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + self._show_debug_info(cmd_id, seq, text) + + if is_json: + msg = text + else: + if protocol not in (HTTP_PROTOCOL, HTTP_JSON_PROTOCOL): + encoded = quote(to_string(text), '/<>_=" \t') + msg = "%s\t%s\t%s\n" % (cmd_id, seq, encoded) + + else: + msg = "%s\t%s\t%s" % (cmd_id, seq, text) + + if isinstance(msg, str): + msg = msg.encode("utf-8") + + assert isinstance(msg, bytes) + as_bytes = msg + self._as_bytes = as_bytes + + def send(self, sock): + as_bytes = self._as_bytes + try: + if get_protocol() in (HTTP_PROTOCOL, HTTP_JSON_PROTOCOL): + sock.sendall(("Content-Length: %s\r\n\r\n" % len(as_bytes)).encode("ascii")) + sock.sendall(as_bytes) + if self._after_send: + for method in self._after_send: + method(sock) + except: + if IS_JYTHON: + # Ignore errors in sock.sendall in Jython (seems to be common for Jython to + # give spurious exceptions at interpreter shutdown here). + pass + else: + raise + + def call_after_send(self, callback): + if not self._after_send: + self._after_send = [callback] + else: + self._after_send.append(callback) + + @classmethod + def _show_debug_info(cls, cmd_id, seq, text): + with cls._show_debug_info_lock: + # Only one thread each time (rlock). + if cls._showing_debug_info: + # avoid recursing in the same thread (just printing could create + # a new command when redirecting output). + return + + cls._showing_debug_info += 1 + try: + out_message = "sending cmd (%s) --> " % (get_protocol(),) + out_message += "%20s" % ID_TO_MEANING.get(str(cmd_id), "UNKNOWN") + out_message += " " + out_message += text.replace("\n", " ") + try: + pydev_log.critical("%s\n", out_message) + except: + pass + finally: + cls._showing_debug_info -= 1 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_json.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_json.py new file mode 100644 index 0000000..7715ddb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_json.py @@ -0,0 +1,586 @@ +from functools import partial +import itertools +import os +import sys +import socket as socket_module + +from _pydev_bundle._pydev_imports_tipper import TYPE_IMPORT, TYPE_CLASS, TYPE_FUNCTION, TYPE_ATTR, TYPE_BUILTIN, TYPE_PARAM +from _pydev_bundle.pydev_is_thread_alive import is_thread_alive +from _pydev_bundle.pydev_override import overrides +from _pydevd_bundle._debug_adapter import pydevd_schema +from _pydevd_bundle._debug_adapter.pydevd_schema import ( + ModuleEvent, + ModuleEventBody, + Module, + OutputEventBody, + OutputEvent, + ContinuedEventBody, + ExitedEventBody, + ExitedEvent, +) +from _pydevd_bundle.pydevd_comm_constants import ( + CMD_THREAD_CREATE, + CMD_RETURN, + CMD_MODULE_EVENT, + CMD_WRITE_TO_CONSOLE, + CMD_STEP_INTO, + CMD_STEP_INTO_MY_CODE, + CMD_STEP_OVER, + CMD_STEP_OVER_MY_CODE, + CMD_STEP_RETURN, + CMD_STEP_CAUGHT_EXCEPTION, + CMD_ADD_EXCEPTION_BREAK, + CMD_SET_BREAK, + CMD_SET_NEXT_STATEMENT, + CMD_THREAD_SUSPEND_SINGLE_NOTIFICATION, + CMD_THREAD_RESUME_SINGLE_NOTIFICATION, + CMD_THREAD_KILL, + CMD_STOP_ON_START, + CMD_INPUT_REQUESTED, + CMD_EXIT, + CMD_STEP_INTO_COROUTINE, + CMD_STEP_RETURN_MY_CODE, + CMD_SMART_STEP_INTO, + CMD_SET_FUNCTION_BREAK, + CMD_THREAD_RUN, +) +from _pydevd_bundle.pydevd_constants import get_thread_id, ForkSafeLock, DebugInfoHolder +from _pydevd_bundle.pydevd_net_command import NetCommand, NULL_NET_COMMAND +from _pydevd_bundle.pydevd_net_command_factory_xml import NetCommandFactory +from _pydevd_bundle.pydevd_utils import get_non_pydevd_threads +import pydevd_file_utils +from _pydevd_bundle.pydevd_comm import build_exception_info_response +from _pydevd_bundle.pydevd_additional_thread_info import set_additional_thread_info +from _pydevd_bundle import pydevd_frame_utils, pydevd_constants, pydevd_utils +import linecache +from io import StringIO +from _pydev_bundle import pydev_log + + +class ModulesManager(object): + def __init__(self): + self._lock = ForkSafeLock() + self._modules = {} + self._next_id = partial(next, itertools.count(0)) + + def track_module(self, filename_in_utf8, module_name, frame): + """ + :return list(NetCommand): + Returns a list with the module events to be sent. + """ + if filename_in_utf8 in self._modules: + return [] + + module_events = [] + with self._lock: + # Must check again after getting the lock. + if filename_in_utf8 in self._modules: + return + + try: + version = str(frame.f_globals.get("__version__", "")) + except: + version = "" + + try: + package_name = str(frame.f_globals.get("__package__", "")) + except: + package_name = "" + + module_id = self._next_id() + + module = Module(module_id, module_name, filename_in_utf8) + if version: + module.version = version + + if package_name: + # Note: package doesn't appear in the docs but seems to be expected? + module.kwargs["package"] = package_name + + module_event = ModuleEvent(ModuleEventBody("new", module)) + + module_events.append(NetCommand(CMD_MODULE_EVENT, 0, module_event, is_json=True)) + + self._modules[filename_in_utf8] = module.to_dict() + return module_events + + def get_modules_info(self): + """ + :return list(Module) + """ + with self._lock: + return list(self._modules.values()) + + +class NetCommandFactoryJson(NetCommandFactory): + """ + Factory for commands which will provide messages as json (they should be + similar to the debug adapter where possible, although some differences + are currently Ok). + + Note that it currently overrides the xml version so that messages + can be done one at a time (any message not overridden will currently + use the xml version) -- after having all messages handled, it should + no longer use NetCommandFactory as the base class. + """ + + def __init__(self): + NetCommandFactory.__init__(self) + self.modules_manager = ModulesManager() + + @overrides(NetCommandFactory.make_version_message) + def make_version_message(self, seq): + return NULL_NET_COMMAND # Not a part of the debug adapter protocol + + @overrides(NetCommandFactory.make_protocol_set_message) + def make_protocol_set_message(self, seq): + return NULL_NET_COMMAND # Not a part of the debug adapter protocol + + @overrides(NetCommandFactory.make_thread_created_message) + def make_thread_created_message(self, thread): + # Note: the thread id for the debug adapter must be an int + # (make the actual id from get_thread_id respect that later on). + msg = pydevd_schema.ThreadEvent( + pydevd_schema.ThreadEventBody("started", get_thread_id(thread)), + ) + + return NetCommand(CMD_THREAD_CREATE, 0, msg, is_json=True) + + @overrides(NetCommandFactory.make_custom_frame_created_message) + def make_custom_frame_created_message(self, frame_id, frame_description): + self._additional_thread_id_to_thread_name[frame_id] = frame_description + msg = pydevd_schema.ThreadEvent( + pydevd_schema.ThreadEventBody("started", frame_id), + ) + + return NetCommand(CMD_THREAD_CREATE, 0, msg, is_json=True) + + @overrides(NetCommandFactory.make_thread_killed_message) + def make_thread_killed_message(self, tid): + self._additional_thread_id_to_thread_name.pop(tid, None) + msg = pydevd_schema.ThreadEvent( + pydevd_schema.ThreadEventBody("exited", tid), + ) + + return NetCommand(CMD_THREAD_KILL, 0, msg, is_json=True) + + @overrides(NetCommandFactory.make_list_threads_message) + def make_list_threads_message(self, py_db, seq): + threads = [] + for thread in get_non_pydevd_threads(): + if is_thread_alive(thread): + thread_id = get_thread_id(thread) + + # Notify that it's created (no-op if we already notified before). + py_db.notify_thread_created(thread_id, thread) + + thread_schema = pydevd_schema.Thread(id=thread_id, name=thread.name) + threads.append(thread_schema.to_dict()) + + for thread_id, thread_name in list(self._additional_thread_id_to_thread_name.items()): + thread_schema = pydevd_schema.Thread(id=thread_id, name=thread_name) + threads.append(thread_schema.to_dict()) + + body = pydevd_schema.ThreadsResponseBody(threads) + response = pydevd_schema.ThreadsResponse(request_seq=seq, success=True, command="threads", body=body) + + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + @overrides(NetCommandFactory.make_get_completions_message) + def make_get_completions_message(self, seq, completions, qualifier, start): + COMPLETION_TYPE_LOOK_UP = { + TYPE_IMPORT: pydevd_schema.CompletionItemType.MODULE, + TYPE_CLASS: pydevd_schema.CompletionItemType.CLASS, + TYPE_FUNCTION: pydevd_schema.CompletionItemType.FUNCTION, + TYPE_ATTR: pydevd_schema.CompletionItemType.FIELD, + TYPE_BUILTIN: pydevd_schema.CompletionItemType.KEYWORD, + TYPE_PARAM: pydevd_schema.CompletionItemType.VARIABLE, + } + + qualifier = qualifier.lower() + qualifier_len = len(qualifier) + targets = [] + for completion in completions: + label = completion[0] + if label.lower().startswith(qualifier): + completion = pydevd_schema.CompletionItem( + label=label, type=COMPLETION_TYPE_LOOK_UP[completion[3]], start=start, length=qualifier_len + ) + targets.append(completion.to_dict()) + + body = pydevd_schema.CompletionsResponseBody(targets) + response = pydevd_schema.CompletionsResponse(request_seq=seq, success=True, command="completions", body=body) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def _format_frame_name(self, fmt, initial_name, module_name, line, path): + if fmt is None: + return initial_name + frame_name = initial_name + if fmt.get("module", False): + if module_name: + if initial_name == "": + frame_name = module_name + else: + frame_name = "%s.%s" % (module_name, initial_name) + else: + basename = os.path.basename(path) + basename = basename[0:-3] if basename.lower().endswith(".py") else basename + if initial_name == "": + frame_name = "%s in %s" % (initial_name, basename) + else: + frame_name = "%s.%s" % (basename, initial_name) + + if fmt.get("line", False): + frame_name = "%s : %d" % (frame_name, line) + + return frame_name + + @overrides(NetCommandFactory.make_get_thread_stack_message) + def make_get_thread_stack_message(self, py_db, seq, thread_id, topmost_frame, fmt, must_be_suspended=False, start_frame=0, levels=0): + frames = [] + module_events = [] + + try: + # : :type suspended_frames_manager: SuspendedFramesManager + suspended_frames_manager = py_db.suspended_frames_manager + frames_list = suspended_frames_manager.get_frames_list(thread_id) + if frames_list is None: + # Could not find stack of suspended frame... + if must_be_suspended: + return None + else: + frames_list = pydevd_frame_utils.create_frames_list_from_frame(topmost_frame) + + for ( + frame_id, + frame, + method_name, + original_filename, + filename_in_utf8, + lineno, + applied_mapping, + show_as_current_frame, + line_col_info, + ) in self._iter_visible_frames_info(py_db, frames_list, flatten_chained=True): + try: + module_name = str(frame.f_globals.get("__name__", "")) + except: + module_name = "" + + module_events.extend(self.modules_manager.track_module(filename_in_utf8, module_name, frame)) + + presentation_hint = None + if not getattr(frame, "IS_PLUGIN_FRAME", False): # Never filter out plugin frames! + if py_db.is_files_filter_enabled and py_db.apply_files_filter(frame, original_filename, False): + continue + + if not py_db.in_project_scope(frame): + presentation_hint = "subtle" + + formatted_name = self._format_frame_name(fmt, method_name, module_name, lineno, filename_in_utf8) + if show_as_current_frame: + formatted_name += " (Current frame)" + source_reference = pydevd_file_utils.get_client_filename_source_reference(filename_in_utf8) + + if not source_reference and not applied_mapping and not os.path.exists(original_filename): + if getattr(frame.f_code, "co_lines", None) or getattr(frame.f_code, "co_lnotab", None): + # Create a source-reference to be used where we provide the source by decompiling the code. + # Note: When the time comes to retrieve the source reference in this case, we'll + # check the linecache first (see: get_decompiled_source_from_frame_id). + source_reference = pydevd_file_utils.create_source_reference_for_frame_id(frame_id, original_filename) + else: + # Check if someone added a source reference to the linecache (Python attrs does this). + if linecache.getline(original_filename, 1): + source_reference = pydevd_file_utils.create_source_reference_for_linecache(original_filename) + + column = 1 + endcol = None + if line_col_info is not None: + try: + line_text = linecache.getline(original_filename, lineno) + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 2: + pydev_log.exception("Unable to get line from linecache for file: %s", original_filename) + else: + if line_text: + colno, endcolno = line_col_info.map_columns_to_line(line_text) + column = colno + 1 + if line_col_info.lineno == line_col_info.end_lineno: + endcol = endcolno + 1 + + frames.append( + pydevd_schema.StackFrame( + frame_id, + formatted_name, + lineno, + column=column, + endColumn=endcol, + source={ + "path": filename_in_utf8, + "sourceReference": source_reference, + }, + presentationHint=presentation_hint, + ).to_dict() + ) + finally: + topmost_frame = None + + for module_event in module_events: + py_db.writer.add_command(module_event) + + total_frames = len(frames) + stack_frames = frames + if bool(levels): + start = start_frame + end = min(start + levels, total_frames) + stack_frames = frames[start:end] + + response = pydevd_schema.StackTraceResponse( + request_seq=seq, + success=True, + command="stackTrace", + body=pydevd_schema.StackTraceResponseBody(stackFrames=stack_frames, totalFrames=total_frames), + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + @overrides(NetCommandFactory.make_warning_message) + def make_warning_message(self, msg): + category = "important" + body = OutputEventBody(msg, category) + event = OutputEvent(body) + return NetCommand(CMD_WRITE_TO_CONSOLE, 0, event, is_json=True) + + @overrides(NetCommandFactory.make_io_message) + def make_io_message(self, msg, ctx): + category = "stdout" if int(ctx) == 1 else "stderr" + body = OutputEventBody(msg, category) + event = OutputEvent(body) + return NetCommand(CMD_WRITE_TO_CONSOLE, 0, event, is_json=True) + + @overrides(NetCommandFactory.make_console_message) + def make_console_message(self, msg): + category = "console" + body = OutputEventBody(msg, category) + event = OutputEvent(body) + return NetCommand(CMD_WRITE_TO_CONSOLE, 0, event, is_json=True) + + _STEP_REASONS = set( + [ + CMD_STEP_INTO, + CMD_STEP_INTO_MY_CODE, + CMD_STEP_OVER, + CMD_STEP_OVER_MY_CODE, + CMD_STEP_RETURN, + CMD_STEP_RETURN_MY_CODE, + CMD_STEP_INTO_MY_CODE, + CMD_STOP_ON_START, + CMD_STEP_INTO_COROUTINE, + CMD_SMART_STEP_INTO, + ] + ) + _EXCEPTION_REASONS = set( + [ + CMD_STEP_CAUGHT_EXCEPTION, + CMD_ADD_EXCEPTION_BREAK, + ] + ) + + @overrides(NetCommandFactory.make_thread_suspend_single_notification) + def make_thread_suspend_single_notification(self, py_db, thread_id, thread, stop_reason): + exc_desc = None + exc_name = None + info = set_additional_thread_info(thread) + + preserve_focus_hint = False + if stop_reason in self._STEP_REASONS: + if info.pydev_original_step_cmd == CMD_STOP_ON_START: + # Just to make sure that's not set as the original reason anymore. + info.pydev_original_step_cmd = -1 + stop_reason = "entry" + else: + stop_reason = "step" + elif stop_reason in self._EXCEPTION_REASONS: + stop_reason = "exception" + elif stop_reason == CMD_SET_BREAK: + stop_reason = "breakpoint" + elif stop_reason == CMD_SET_FUNCTION_BREAK: + stop_reason = "function breakpoint" + elif stop_reason == CMD_SET_NEXT_STATEMENT: + stop_reason = "goto" + else: + stop_reason = "pause" + preserve_focus_hint = True + + if stop_reason == "exception": + exception_info_response = build_exception_info_response( + py_db, thread_id, thread, -1, set_additional_thread_info, self._iter_visible_frames_info, max_frames=-1 + ) + exception_info_response + + exc_name = exception_info_response.body.exceptionId + exc_desc = exception_info_response.body.description + + body = pydevd_schema.StoppedEventBody( + reason=stop_reason, + description=exc_desc, + threadId=thread_id, + text=exc_name, + allThreadsStopped=True, + preserveFocusHint=preserve_focus_hint, + ) + event = pydevd_schema.StoppedEvent(body) + return NetCommand(CMD_THREAD_SUSPEND_SINGLE_NOTIFICATION, 0, event, is_json=True) + + @overrides(NetCommandFactory.make_thread_resume_single_notification) + def make_thread_resume_single_notification(self, thread_id): + body = ContinuedEventBody(threadId=thread_id, allThreadsContinued=True) + event = pydevd_schema.ContinuedEvent(body) + return NetCommand(CMD_THREAD_RESUME_SINGLE_NOTIFICATION, 0, event, is_json=True) + + @overrides(NetCommandFactory.make_set_next_stmnt_status_message) + def make_set_next_stmnt_status_message(self, seq, is_success, exception_msg): + response = pydevd_schema.GotoResponse( + request_seq=int(seq), success=is_success, command="goto", body={}, message=(None if is_success else exception_msg) + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + @overrides(NetCommandFactory.make_send_curr_exception_trace_message) + def make_send_curr_exception_trace_message(self, *args, **kwargs): + return NULL_NET_COMMAND # Not a part of the debug adapter protocol + + @overrides(NetCommandFactory.make_send_curr_exception_trace_proceeded_message) + def make_send_curr_exception_trace_proceeded_message(self, *args, **kwargs): + return NULL_NET_COMMAND # Not a part of the debug adapter protocol + + @overrides(NetCommandFactory.make_send_breakpoint_exception_message) + def make_send_breakpoint_exception_message(self, *args, **kwargs): + return NULL_NET_COMMAND # Not a part of the debug adapter protocol + + @overrides(NetCommandFactory.make_process_created_message) + def make_process_created_message(self, *args, **kwargs): + return NULL_NET_COMMAND # Not a part of the debug adapter protocol + + @overrides(NetCommandFactory.make_process_about_to_be_replaced_message) + def make_process_about_to_be_replaced_message(self): + event = ExitedEvent(ExitedEventBody(-1, pydevdReason="processReplaced")) + + cmd = NetCommand(CMD_RETURN, 0, event, is_json=True) + + def after_send(socket): + socket.setsockopt(socket_module.IPPROTO_TCP, socket_module.TCP_NODELAY, 1) + + cmd.call_after_send(after_send) + return cmd + + @overrides(NetCommandFactory.make_thread_suspend_message) + def make_thread_suspend_message(self, py_db, thread_id, frames_list, stop_reason, message, trace_suspend_type, thread, info): + from _pydevd_bundle.pydevd_comm_constants import CMD_THREAD_SUSPEND + + if py_db.multi_threads_single_notification: + pydev_log.debug("Skipping per-thread thread suspend notification.") + return NULL_NET_COMMAND # Don't send per-thread, send a single one. + pydev_log.debug("Sending per-thread thread suspend notification (stop_reason: %s)", stop_reason) + + exc_desc = None + exc_name = None + preserve_focus_hint = False + if stop_reason in self._STEP_REASONS: + if info.pydev_original_step_cmd == CMD_STOP_ON_START: + # Just to make sure that's not set as the original reason anymore. + info.pydev_original_step_cmd = -1 + stop_reason = "entry" + else: + stop_reason = "step" + elif stop_reason in self._EXCEPTION_REASONS: + stop_reason = "exception" + elif stop_reason == CMD_SET_BREAK: + stop_reason = "breakpoint" + elif stop_reason == CMD_SET_FUNCTION_BREAK: + stop_reason = "function breakpoint" + elif stop_reason == CMD_SET_NEXT_STATEMENT: + stop_reason = "goto" + else: + stop_reason = "pause" + preserve_focus_hint = True + + if stop_reason == "exception": + exception_info_response = build_exception_info_response( + py_db, thread_id, thread, -1, set_additional_thread_info, self._iter_visible_frames_info, max_frames=-1 + ) + exception_info_response + + exc_name = exception_info_response.body.exceptionId + exc_desc = exception_info_response.body.description + + body = pydevd_schema.StoppedEventBody( + reason=stop_reason, + description=exc_desc, + threadId=thread_id, + text=exc_name, + allThreadsStopped=False, + preserveFocusHint=preserve_focus_hint, + ) + event = pydevd_schema.StoppedEvent(body) + return NetCommand(CMD_THREAD_SUSPEND, 0, event, is_json=True) + + @overrides(NetCommandFactory.make_thread_run_message) + def make_thread_run_message(self, py_db, thread_id, reason): + if py_db.multi_threads_single_notification: + return NULL_NET_COMMAND # Don't send per-thread, send a single one. + body = ContinuedEventBody(threadId=thread_id, allThreadsContinued=False) + event = pydevd_schema.ContinuedEvent(body) + return NetCommand(CMD_THREAD_RUN, 0, event, is_json=True) + + @overrides(NetCommandFactory.make_reloaded_code_message) + def make_reloaded_code_message(self, *args, **kwargs): + return NULL_NET_COMMAND # Not a part of the debug adapter protocol + + @overrides(NetCommandFactory.make_input_requested_message) + def make_input_requested_message(self, started): + event = pydevd_schema.PydevdInputRequestedEvent(body={}) + return NetCommand(CMD_INPUT_REQUESTED, 0, event, is_json=True) + + @overrides(NetCommandFactory.make_skipped_step_in_because_of_filters) + def make_skipped_step_in_because_of_filters(self, py_db, frame): + msg = "Frame skipped from debugging during step-in." + if py_db.get_use_libraries_filter(): + msg += ( + '\nNote: may have been skipped because of "justMyCode" option (default == true). ' + 'Try setting "justMyCode": false in the debug configuration (e.g., launch.json).\n' + ) + return self.make_warning_message(msg) + + @overrides(NetCommandFactory.make_evaluation_timeout_msg) + def make_evaluation_timeout_msg(self, py_db, expression, curr_thread): + msg = """Evaluating: %s did not finish after %.2f seconds. +This may mean a number of things: +- This evaluation is really slow and this is expected. + In this case it's possible to silence this error by raising the timeout, setting the + PYDEVD_WARN_EVALUATION_TIMEOUT environment variable to a bigger value. + +- The evaluation may need other threads running while it's running: + In this case, it's possible to set the PYDEVD_UNBLOCK_THREADS_TIMEOUT + environment variable so that if after a given timeout an evaluation doesn't finish, + other threads are unblocked or you can manually resume all threads. + + Alternatively, it's also possible to skip breaking on a particular thread by setting a + `pydev_do_not_trace = True` attribute in the related threading.Thread instance + (if some thread should always be running and no breakpoints are expected to be hit in it). + +- The evaluation is deadlocked: + In this case you may set the PYDEVD_THREAD_DUMP_ON_WARN_EVALUATION_TIMEOUT + environment variable to true so that a thread dump is shown along with this message and + optionally, set the PYDEVD_INTERRUPT_THREAD_TIMEOUT to some value so that the debugger + tries to interrupt the evaluation (if possible) when this happens. +""" % (expression, pydevd_constants.PYDEVD_WARN_EVALUATION_TIMEOUT) + + if pydevd_constants.PYDEVD_THREAD_DUMP_ON_WARN_EVALUATION_TIMEOUT: + stream = StringIO() + pydevd_utils.dump_threads(stream, show_pydevd_threads=False) + msg += "\n\n%s\n" % stream.getvalue() + return self.make_warning_message(msg) + + @overrides(NetCommandFactory.make_exit_command) + def make_exit_command(self, py_db): + event = pydevd_schema.TerminatedEvent(pydevd_schema.TerminatedEventBody()) + return NetCommand(CMD_EXIT, 0, event, is_json=True) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_xml.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_xml.py new file mode 100644 index 0000000..a9c3ad5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_xml.py @@ -0,0 +1,558 @@ +import json + +from _pydev_bundle.pydev_is_thread_alive import is_thread_alive +from _pydev_bundle._pydev_saved_modules import thread +from _pydevd_bundle import pydevd_xml, pydevd_frame_utils, pydevd_constants, pydevd_utils +from _pydevd_bundle.pydevd_comm_constants import ( + CMD_THREAD_CREATE, + CMD_THREAD_KILL, + CMD_THREAD_SUSPEND, + CMD_THREAD_RUN, + CMD_GET_VARIABLE, + CMD_EVALUATE_EXPRESSION, + CMD_GET_FRAME, + CMD_WRITE_TO_CONSOLE, + CMD_GET_COMPLETIONS, + CMD_LOAD_SOURCE, + CMD_SET_NEXT_STATEMENT, + CMD_EXIT, + CMD_GET_FILE_CONTENTS, + CMD_EVALUATE_CONSOLE_EXPRESSION, + CMD_RUN_CUSTOM_OPERATION, + CMD_GET_BREAKPOINT_EXCEPTION, + CMD_SEND_CURR_EXCEPTION_TRACE, + CMD_SEND_CURR_EXCEPTION_TRACE_PROCEEDED, + CMD_SHOW_CONSOLE, + CMD_GET_ARRAY, + CMD_INPUT_REQUESTED, + CMD_GET_DESCRIPTION, + CMD_PROCESS_CREATED, + CMD_SHOW_CYTHON_WARNING, + CMD_LOAD_FULL_VALUE, + CMD_GET_THREAD_STACK, + CMD_GET_EXCEPTION_DETAILS, + CMD_THREAD_SUSPEND_SINGLE_NOTIFICATION, + CMD_THREAD_RESUME_SINGLE_NOTIFICATION, + CMD_GET_NEXT_STATEMENT_TARGETS, + CMD_VERSION, + CMD_RETURN, + CMD_SET_PROTOCOL, + CMD_ERROR, + MAX_IO_MSG_SIZE, + VERSION_STRING, + CMD_RELOAD_CODE, + CMD_LOAD_SOURCE_FROM_FRAME_ID, +) +from _pydevd_bundle.pydevd_constants import ( + DebugInfoHolder, + get_thread_id, + get_global_debugger, + GetGlobalDebugger, + set_global_debugger, +) # Keep for backward compatibility @UnusedImport +from _pydevd_bundle.pydevd_net_command import NetCommand, NULL_NET_COMMAND, NULL_EXIT_COMMAND +from _pydevd_bundle.pydevd_utils import quote_smart as quote, get_non_pydevd_threads +from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame +import pydevd_file_utils +from pydevd_tracing import get_exception_traceback_str +from _pydev_bundle._pydev_completer import completions_to_xml +from _pydev_bundle import pydev_log +from _pydevd_bundle.pydevd_frame_utils import FramesList +from io import StringIO + + +# ======================================================================================================================= +# NetCommandFactory +# ======================================================================================================================= +class NetCommandFactory(object): + def __init__(self): + self._additional_thread_id_to_thread_name = {} + + def _thread_to_xml(self, thread): + """thread information as XML""" + name = pydevd_xml.make_valid_xml_value(thread.name) + cmd_text = '' % (quote(name), get_thread_id(thread)) + return cmd_text + + def make_error_message(self, seq, text): + cmd = NetCommand(CMD_ERROR, seq, text) + if DebugInfoHolder.DEBUG_TRACE_LEVEL > 2: + pydev_log.error("Error: %s" % (text,)) + return cmd + + def make_protocol_set_message(self, seq): + return NetCommand(CMD_SET_PROTOCOL, seq, "") + + def make_thread_created_message(self, thread): + cmdText = "" + self._thread_to_xml(thread) + "" + return NetCommand(CMD_THREAD_CREATE, 0, cmdText) + + def make_process_created_message(self): + cmdText = "" + return NetCommand(CMD_PROCESS_CREATED, 0, cmdText) + + def make_process_about_to_be_replaced_message(self): + return NULL_NET_COMMAND + + def make_show_cython_warning_message(self): + try: + return NetCommand(CMD_SHOW_CYTHON_WARNING, 0, "") + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_custom_frame_created_message(self, frame_id, frame_description): + self._additional_thread_id_to_thread_name[frame_id] = frame_description + frame_description = pydevd_xml.make_valid_xml_value(frame_description) + return NetCommand(CMD_THREAD_CREATE, 0, '' % (frame_description, frame_id)) + + def make_list_threads_message(self, py_db, seq): + """returns thread listing as XML""" + try: + threads = get_non_pydevd_threads() + cmd_text = [""] + append = cmd_text.append + for thread in threads: + if is_thread_alive(thread): + append(self._thread_to_xml(thread)) + + for thread_id, thread_name in list(self._additional_thread_id_to_thread_name.items()): + name = pydevd_xml.make_valid_xml_value(thread_name) + append('' % (quote(name), thread_id)) + + append("") + return NetCommand(CMD_RETURN, seq, "".join(cmd_text)) + except: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_get_thread_stack_message(self, py_db, seq, thread_id, topmost_frame, fmt, must_be_suspended=False, start_frame=0, levels=0): + """ + Returns thread stack as XML. + + :param must_be_suspended: If True and the thread is not suspended, returns None. + """ + try: + # If frame is None, the return is an empty frame list. + cmd_text = ['' % (thread_id,)] + + if topmost_frame is not None: + try: + # : :type suspended_frames_manager: SuspendedFramesManager + suspended_frames_manager = py_db.suspended_frames_manager + frames_list = suspended_frames_manager.get_frames_list(thread_id) + if frames_list is None: + # Could not find stack of suspended frame... + if must_be_suspended: + return None + else: + frames_list = pydevd_frame_utils.create_frames_list_from_frame(topmost_frame) + + cmd_text.append(self.make_thread_stack_str(py_db, frames_list)) + finally: + topmost_frame = None + cmd_text.append("") + return NetCommand(CMD_GET_THREAD_STACK, seq, "".join(cmd_text)) + except: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_variable_changed_message(self, seq, payload): + # notify debugger that value was changed successfully + return NetCommand(CMD_RETURN, seq, payload) + + def make_warning_message(self, msg): + return self.make_io_message(msg, 2) + + def make_console_message(self, msg): + return self.make_io_message(msg, 2) + + def make_io_message(self, msg, ctx): + """ + @param msg: the message to pass to the debug server + @param ctx: 1 for stdio 2 for stderr + """ + try: + msg = pydevd_constants.as_str(msg) + + if len(msg) > MAX_IO_MSG_SIZE: + msg = msg[0:MAX_IO_MSG_SIZE] + msg += "..." + + msg = pydevd_xml.make_valid_xml_value(quote(msg, "/>_= ")) + return NetCommand(str(CMD_WRITE_TO_CONSOLE), 0, '' % (msg, ctx)) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_version_message(self, seq): + try: + return NetCommand(CMD_VERSION, seq, VERSION_STRING) + except: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_thread_killed_message(self, tid): + self._additional_thread_id_to_thread_name.pop(tid, None) + try: + return NetCommand(CMD_THREAD_KILL, 0, str(tid)) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def _iter_visible_frames_info(self, py_db, frames_list, flatten_chained=False): + assert frames_list.__class__ == FramesList + is_chained = False + while True: + for frame in frames_list: + show_as_current_frame = frame is frames_list.current_frame + if frame.f_code is None: + pydev_log.info("Frame without f_code: %s", frame) + continue # IronPython sometimes does not have it! + + method_name = frame.f_code.co_name # method name (if in method) or ? if global + if method_name is None: + pydev_log.info("Frame without co_name: %s", frame) + continue # IronPython sometimes does not have it! + + if is_chained: + method_name = "[Chained Exc: %s] %s" % (frames_list.exc_desc, method_name) + + abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(frame) + if py_db.get_file_type(frame, abs_path_real_path_and_base) == py_db.PYDEV_FILE: + # Skip pydevd files. + frame = frame.f_back + continue + + frame_id = id(frame) + lineno = frames_list.frame_id_to_lineno.get(frame_id, frame.f_lineno) + line_col_info = frames_list.frame_id_to_line_col_info.get(frame_id) + + filename_in_utf8, lineno, changed = py_db.source_mapping.map_to_client(abs_path_real_path_and_base[0], lineno) + new_filename_in_utf8, applied_mapping = pydevd_file_utils.map_file_to_client(filename_in_utf8) + applied_mapping = applied_mapping or changed + + yield ( + frame_id, + frame, + method_name, + abs_path_real_path_and_base[0], + new_filename_in_utf8, + lineno, + applied_mapping, + show_as_current_frame, + line_col_info, + ) + + if not flatten_chained: + break + + frames_list = frames_list.chained_frames_list + if frames_list is None or len(frames_list) == 0: + break + is_chained = True + + def make_thread_stack_str(self, py_db, frames_list): + assert frames_list.__class__ == FramesList + make_valid_xml_value = pydevd_xml.make_valid_xml_value + cmd_text_list = [] + append = cmd_text_list.append + + try: + for ( + frame_id, + frame, + method_name, + _original_filename, + filename_in_utf8, + lineno, + _applied_mapping, + _show_as_current_frame, + line_col_info, + ) in self._iter_visible_frames_info(py_db, frames_list, flatten_chained=True): + # print("file is ", filename_in_utf8) + # print("line is ", lineno) + + # Note: variables are all gotten 'on-demand'. + append('' % (quote(make_valid_xml_value(filename_in_utf8), "/>_= \t"), lineno)) + append("") + except: + pydev_log.exception() + + return "".join(cmd_text_list) + + def make_thread_suspend_str( + self, + py_db, + thread_id, + frames_list, + stop_reason=None, + message=None, + trace_suspend_type="trace", + ): + """ + :return tuple(str,str): + Returns tuple(thread_suspended_str, thread_stack_str). + + i.e.: + ( + ''' + + + + + + + ''' + , + ''' + + + ''' + ) + """ + assert frames_list.__class__ == FramesList + make_valid_xml_value = pydevd_xml.make_valid_xml_value + cmd_text_list = [] + append = cmd_text_list.append + + cmd_text_list.append("") + if message: + message = make_valid_xml_value(message) + + append('") + thread_stack_str = self.make_thread_stack_str(py_db, frames_list) + append(thread_stack_str) + append("") + + return "".join(cmd_text_list), thread_stack_str + + def make_thread_suspend_message(self, py_db, thread_id, frames_list, stop_reason, message, trace_suspend_type, thread, additional_info): + try: + thread_suspend_str, thread_stack_str = self.make_thread_suspend_str( + py_db, thread_id, frames_list, stop_reason, message, trace_suspend_type + ) + cmd = NetCommand(CMD_THREAD_SUSPEND, 0, thread_suspend_str) + cmd.thread_stack_str = thread_stack_str + cmd.thread_suspend_str = thread_suspend_str + return cmd + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_thread_suspend_single_notification(self, py_db, thread_id, thread, stop_reason): + try: + return NetCommand(CMD_THREAD_SUSPEND_SINGLE_NOTIFICATION, 0, json.dumps({"thread_id": thread_id, "stop_reason": stop_reason})) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_thread_resume_single_notification(self, thread_id): + try: + return NetCommand(CMD_THREAD_RESUME_SINGLE_NOTIFICATION, 0, json.dumps({"thread_id": thread_id})) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_thread_run_message(self, py_db, thread_id, reason): + try: + return NetCommand(CMD_THREAD_RUN, 0, "%s\t%s" % (thread_id, reason)) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_get_variable_message(self, seq, payload): + try: + return NetCommand(CMD_GET_VARIABLE, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_get_array_message(self, seq, payload): + try: + return NetCommand(CMD_GET_ARRAY, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_get_description_message(self, seq, payload): + try: + return NetCommand(CMD_GET_DESCRIPTION, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_get_frame_message(self, seq, payload): + try: + return NetCommand(CMD_GET_FRAME, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_evaluate_expression_message(self, seq, payload): + try: + return NetCommand(CMD_EVALUATE_EXPRESSION, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_get_completions_message(self, seq, completions, qualifier, start): + try: + payload = completions_to_xml(completions) + return NetCommand(CMD_GET_COMPLETIONS, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_get_file_contents(self, seq, payload): + try: + return NetCommand(CMD_GET_FILE_CONTENTS, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_reloaded_code_message(self, seq, reloaded_ok): + try: + return NetCommand(CMD_RELOAD_CODE, seq, '' % reloaded_ok) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_send_breakpoint_exception_message(self, seq, payload): + try: + return NetCommand(CMD_GET_BREAKPOINT_EXCEPTION, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def _make_send_curr_exception_trace_str(self, py_db, thread_id, exc_type, exc_desc, trace_obj): + frames_list = pydevd_frame_utils.create_frames_list_from_traceback(trace_obj, None, exc_type, exc_desc) + + exc_type = pydevd_xml.make_valid_xml_value(str(exc_type)).replace("\t", " ") or "exception: type unknown" + exc_desc = pydevd_xml.make_valid_xml_value(str(exc_desc)).replace("\t", " ") or "exception: no description" + + thread_suspend_str, thread_stack_str = self.make_thread_suspend_str( + py_db, thread_id, frames_list, CMD_SEND_CURR_EXCEPTION_TRACE, "" + ) + return exc_type, exc_desc, thread_suspend_str, thread_stack_str + + def make_send_curr_exception_trace_message(self, py_db, seq, thread_id, curr_frame_id, exc_type, exc_desc, trace_obj): + try: + exc_type, exc_desc, thread_suspend_str, _thread_stack_str = self._make_send_curr_exception_trace_str( + py_db, thread_id, exc_type, exc_desc, trace_obj + ) + payload = str(curr_frame_id) + "\t" + exc_type + "\t" + exc_desc + "\t" + thread_suspend_str + return NetCommand(CMD_SEND_CURR_EXCEPTION_TRACE, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_get_exception_details_message(self, py_db, seq, thread_id, topmost_frame): + """Returns exception details as XML""" + try: + # If the debugger is not suspended, just return the thread and its id. + cmd_text = ['") + cmd_text.append(thread_stack_str) + break + frame = frame.f_back + else: + cmd_text.append(">") + finally: + frame = None + cmd_text.append("") + return NetCommand(CMD_GET_EXCEPTION_DETAILS, seq, "".join(cmd_text)) + except: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_send_curr_exception_trace_proceeded_message(self, seq, thread_id): + try: + return NetCommand(CMD_SEND_CURR_EXCEPTION_TRACE_PROCEEDED, 0, str(thread_id)) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_send_console_message(self, seq, payload): + try: + return NetCommand(CMD_EVALUATE_CONSOLE_EXPRESSION, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_custom_operation_message(self, seq, payload): + try: + return NetCommand(CMD_RUN_CUSTOM_OPERATION, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_load_source_message(self, seq, source): + return NetCommand(CMD_LOAD_SOURCE, seq, source) + + def make_load_source_from_frame_id_message(self, seq, source): + return NetCommand(CMD_LOAD_SOURCE_FROM_FRAME_ID, seq, source) + + def make_show_console_message(self, py_db, thread_id, frame): + try: + frames_list = pydevd_frame_utils.create_frames_list_from_frame(frame) + thread_suspended_str, _thread_stack_str = self.make_thread_suspend_str(py_db, thread_id, frames_list, CMD_SHOW_CONSOLE, "") + return NetCommand(CMD_SHOW_CONSOLE, 0, thread_suspended_str) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_input_requested_message(self, started): + try: + return NetCommand(CMD_INPUT_REQUESTED, 0, str(started)) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_set_next_stmnt_status_message(self, seq, is_success, exception_msg): + try: + message = str(is_success) + "\t" + exception_msg + return NetCommand(CMD_SET_NEXT_STATEMENT, int(seq), message) + except: + return self.make_error_message(0, get_exception_traceback_str()) + + def make_load_full_value_message(self, seq, payload): + try: + return NetCommand(CMD_LOAD_FULL_VALUE, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_get_next_statement_targets_message(self, seq, payload): + try: + return NetCommand(CMD_GET_NEXT_STATEMENT_TARGETS, seq, payload) + except Exception: + return self.make_error_message(seq, get_exception_traceback_str()) + + def make_skipped_step_in_because_of_filters(self, py_db, frame): + return NULL_NET_COMMAND # Not a part of the xml protocol + + def make_evaluation_timeout_msg(self, py_db, expression, thread): + msg = """pydevd: Evaluating: %s did not finish after %.2f seconds. +This may mean a number of things: +- This evaluation is really slow and this is expected. + In this case it's possible to silence this error by raising the timeout, setting the + PYDEVD_WARN_EVALUATION_TIMEOUT environment variable to a bigger value. + +- The evaluation may need other threads running while it's running: + In this case, you may need to manually let other paused threads continue. + + Alternatively, it's also possible to skip breaking on a particular thread by setting a + `pydev_do_not_trace = True` attribute in the related threading.Thread instance + (if some thread should always be running and no breakpoints are expected to be hit in it). + +- The evaluation is deadlocked: + In this case you may set the PYDEVD_THREAD_DUMP_ON_WARN_EVALUATION_TIMEOUT + environment variable to true so that a thread dump is shown along with this message and + optionally, set the PYDEVD_INTERRUPT_THREAD_TIMEOUT to some value so that the debugger + tries to interrupt the evaluation (if possible) when this happens. +""" % (expression, pydevd_constants.PYDEVD_WARN_EVALUATION_TIMEOUT) + + if pydevd_constants.PYDEVD_THREAD_DUMP_ON_WARN_EVALUATION_TIMEOUT: + stream = StringIO() + pydevd_utils.dump_threads(stream, show_pydevd_threads=False) + msg += "\n\n%s\n" % stream.getvalue() + return self.make_warning_message(msg) + + def make_exit_command(self, py_db): + return NULL_EXIT_COMMAND diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_plugin_utils.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_plugin_utils.py new file mode 100644 index 0000000..df1f50c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_plugin_utils.py @@ -0,0 +1,208 @@ +import types + +from _pydev_bundle import pydev_log +from typing import Tuple, Literal + +try: + from pydevd_plugins import django_debug +except: + django_debug = None + pydev_log.debug("Unable to load django_debug plugin") + +try: + from pydevd_plugins import jinja2_debug +except: + jinja2_debug = None + pydev_log.debug("Unable to load jinja2_debug plugin") + + +def load_plugins(): + plugins = [] + if django_debug is not None: + plugins.append(django_debug) + + if jinja2_debug is not None: + plugins.append(jinja2_debug) + return plugins + + +def bind_func_to_method(func, obj, method_name): + bound_method = types.MethodType(func, obj) + + setattr(obj, method_name, bound_method) + return bound_method + + +class PluginManager(object): + EMPTY_SENTINEL = object() + + def __init__(self, main_debugger): + self.plugins = load_plugins() + + # When some breakpoint is added for a given plugin it becomes active. + self.active_plugins = [] + + self.main_debugger = main_debugger + + def add_breakpoint(self, func_name, *args, **kwargs): + # add breakpoint for plugin + for plugin in self.plugins: + if hasattr(plugin, func_name): + func = getattr(plugin, func_name) + result = func(*args, **kwargs) + if result: + self.activate(plugin) + return result + return None + + def activate(self, plugin): + if plugin not in self.active_plugins: + self.active_plugins.append(plugin) + + # These are not a part of the API, rather, `add_breakpoint` should be used with `add_line_breakpoint` or `add_exception_breakpoint` + # which will call it for all plugins and then if it's valid it'll be activated. + # + # def add_line_breakpoint(self, py_db, type, canonical_normalized_filename, breakpoint_id, line, condition, expression, func_name, hit_condition=None, is_logpoint=False, add_breakpoint_result=None, on_changed_breakpoint_state=None): + # def add_exception_breakpoint(plugin, py_db, type, exception): + + def after_breakpoints_consolidated(self, py_db, canonical_normalized_filename, id_to_pybreakpoint, file_to_line_to_breakpoints): + for plugin in self.active_plugins: + plugin.after_breakpoints_consolidated(py_db, canonical_normalized_filename, id_to_pybreakpoint, file_to_line_to_breakpoints) + + def remove_exception_breakpoint(self, py_db, exception_type, exception): + """ + :param exception_type: 'django', 'jinja2' (can be extended) + """ + for plugin in self.active_plugins: + ret = plugin.remove_exception_breakpoint(py_db, exception_type, exception) + if ret: + return ret + + return None + + def remove_all_exception_breakpoints(self, py_db): + for plugin in self.active_plugins: + plugin.remove_all_exception_breakpoints(py_db) + + def get_breakpoints(self, py_db, breakpoint_type): + """ + :param breakpoint_type: 'django-line', 'jinja2-line' + """ + for plugin in self.active_plugins: + ret = plugin.get_breakpoints(py_db, breakpoint_type) + if ret: + return ret + + def can_skip(self, py_db, frame): + for plugin in self.active_plugins: + if not plugin.can_skip(py_db, frame): + return False + return True + + def required_events_breakpoint(self) -> Tuple[Literal["line", "call"], ...]: + ret = () + for plugin in self.active_plugins: + new = plugin.required_events_breakpoint() + if new: + ret += new + + return ret + + def required_events_stepping(self) -> Tuple[Literal["line", "call", "return"], ...]: + ret = () + for plugin in self.active_plugins: + new = plugin.required_events_stepping() + if new: + ret += new + + return ret + + def is_tracked_frame(self, frame) -> bool: + for plugin in self.active_plugins: + if plugin.is_tracked_frame(frame): + return True + return False + + def has_exception_breaks(self, py_db) -> bool: + for plugin in self.active_plugins: + if plugin.has_exception_breaks(py_db): + return True + return False + + def has_line_breaks(self, py_db) -> bool: + for plugin in self.active_plugins: + if plugin.has_line_breaks(py_db): + return True + return False + + def cmd_step_into(self, py_db, frame, event, info, thread, stop_info, stop: bool): + """ + :param stop_info: in/out information. If it should stop then it'll be + filled by the plugin. + :param stop: whether the stop has already been flagged for this frame. + :returns: + tuple(stop, plugin_stop) + """ + plugin_stop = False + for plugin in self.active_plugins: + stop, plugin_stop = plugin.cmd_step_into(py_db, frame, event, info, thread, stop_info, stop) + if plugin_stop: + return stop, plugin_stop + return stop, plugin_stop + + def cmd_step_over(self, py_db, frame, event, info, thread, stop_info, stop): + plugin_stop = False + for plugin in self.active_plugins: + stop, plugin_stop = plugin.cmd_step_over(py_db, frame, event, info, thread, stop_info, stop) + if plugin_stop: + return stop, plugin_stop + return stop, plugin_stop + + def stop(self, py_db, frame, event, thread, stop_info, arg, step_cmd): + """ + The way this works is that the `cmd_step_into` or `cmd_step_over` + is called which then fills the `stop_info` and then this method + is called to do the actual stop. + """ + for plugin in self.active_plugins: + stopped = plugin.stop(py_db, frame, event, thread, stop_info, arg, step_cmd) + if stopped: + return stopped + return False + + def get_breakpoint(self, py_db, frame, event, info): + for plugin in self.active_plugins: + ret = plugin.get_breakpoint(py_db, frame, event, info) + if ret: + return ret + return None + + def suspend(self, py_db, thread, frame, bp_type): + """ + :param bp_type: 'django' or 'jinja2' + + :return: + The frame for the suspend or None if it should not be suspended. + """ + for plugin in self.active_plugins: + ret = plugin.suspend(py_db, thread, frame, bp_type) + if ret is not None: + return ret + + return None + + def exception_break(self, py_db, frame, thread, arg, is_unwind=False): + for plugin in self.active_plugins: + ret = plugin.exception_break(py_db, frame, thread, arg, is_unwind) + if ret is not None: + return ret + + return None + + def change_variable(self, frame, attr, expression): + for plugin in self.active_plugins: + ret = plugin.change_variable(frame, attr, expression, self.EMPTY_SENTINEL) + if ret is not self.EMPTY_SENTINEL: + return ret + + return self.EMPTY_SENTINEL diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command.py new file mode 100644 index 0000000..92902ed --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command.py @@ -0,0 +1,805 @@ +import json +import os +import sys +import traceback + +from _pydev_bundle import pydev_log +from _pydev_bundle.pydev_log import exception as pydev_log_exception +from _pydevd_bundle import pydevd_traceproperty, pydevd_dont_trace, pydevd_utils +from _pydevd_bundle.pydevd_additional_thread_info import set_additional_thread_info +from _pydevd_bundle.pydevd_breakpoints import get_exception_class +from _pydevd_bundle.pydevd_comm import ( + InternalEvaluateConsoleExpression, + InternalConsoleGetCompletions, + InternalRunCustomOperation, + internal_get_next_statement_targets, + internal_get_smart_step_into_variants, +) +from _pydevd_bundle.pydevd_constants import NEXT_VALUE_SEPARATOR, IS_WINDOWS, NULL +from _pydevd_bundle.pydevd_comm_constants import ID_TO_MEANING, CMD_EXEC_EXPRESSION, CMD_AUTHENTICATE +from _pydevd_bundle.pydevd_api import PyDevdAPI +from io import StringIO +from _pydevd_bundle.pydevd_net_command import NetCommand +from _pydevd_bundle.pydevd_thread_lifecycle import pydevd_find_thread_by_id +import pydevd_file_utils + + +class _PyDevCommandProcessor(object): + def __init__(self): + self.api = PyDevdAPI() + + def process_net_command(self, py_db, cmd_id, seq, text): + """Processes a command received from the Java side + + @param cmd_id: the id of the command + @param seq: the sequence of the command + @param text: the text received in the command + """ + + # We can only proceed if the client is already authenticated or if it's the + # command to authenticate. + if cmd_id != CMD_AUTHENTICATE and not py_db.authentication.is_authenticated(): + cmd = py_db.cmd_factory.make_error_message(seq, "Client not authenticated.") + py_db.writer.add_command(cmd) + return + + meaning = ID_TO_MEANING[str(cmd_id)] + + # print('Handling %s (%s)' % (meaning, text)) + + method_name = meaning.lower() + + on_command = getattr(self, method_name.lower(), None) + if on_command is None: + # I have no idea what this is all about + cmd = py_db.cmd_factory.make_error_message(seq, "unexpected command " + str(cmd_id)) + py_db.writer.add_command(cmd) + return + + lock = py_db._main_lock + if method_name == "cmd_thread_dump_to_stderr": + # We can skip the main debugger locks for cases where we know it's not needed. + lock = NULL + + with lock: + try: + cmd = on_command(py_db, cmd_id, seq, text) + if cmd is not None: + py_db.writer.add_command(cmd) + except: + if traceback is not None and sys is not None and pydev_log_exception is not None: + pydev_log_exception() + + stream = StringIO() + traceback.print_exc(file=stream) + cmd = py_db.cmd_factory.make_error_message( + seq, + "Unexpected exception in process_net_command.\nInitial params: %s. Exception: %s" + % (((cmd_id, seq, text), stream.getvalue())), + ) + if cmd is not None: + py_db.writer.add_command(cmd) + + def cmd_authenticate(self, py_db, cmd_id, seq, text): + access_token = text + py_db.authentication.login(access_token) + if py_db.authentication.is_authenticated(): + return NetCommand(cmd_id, seq, py_db.authentication.client_access_token) + + return py_db.cmd_factory.make_error_message(seq, "Client not authenticated.") + + def cmd_run(self, py_db, cmd_id, seq, text): + return self.api.run(py_db) + + def cmd_list_threads(self, py_db, cmd_id, seq, text): + return self.api.list_threads(py_db, seq) + + def cmd_get_completions(self, py_db, cmd_id, seq, text): + # we received some command to get a variable + # the text is: thread_id\tframe_id\tactivation token + thread_id, frame_id, _scope, act_tok = text.split("\t", 3) + + return self.api.request_completions(py_db, seq, thread_id, frame_id, act_tok) + + def cmd_get_thread_stack(self, py_db, cmd_id, seq, text): + # Receives a thread_id and a given timeout, which is the time we should + # wait to the provide the stack if a given thread is still not suspended. + if "\t" in text: + thread_id, timeout = text.split("\t") + timeout = float(timeout) + else: + thread_id = text + timeout = 0.5 # Default timeout is .5 seconds + + return self.api.request_stack(py_db, seq, thread_id, fmt={}, timeout=timeout) + + def cmd_set_protocol(self, py_db, cmd_id, seq, text): + return self.api.set_protocol(py_db, seq, text.strip()) + + def cmd_thread_suspend(self, py_db, cmd_id, seq, text): + return self.api.request_suspend_thread(py_db, text.strip()) + + def cmd_version(self, py_db, cmd_id, seq, text): + # Default based on server process (although ideally the IDE should + # provide it). + if IS_WINDOWS: + ide_os = "WINDOWS" + else: + ide_os = "UNIX" + + # Breakpoints can be grouped by 'LINE' or by 'ID'. + breakpoints_by = "LINE" + + splitted = text.split("\t") + if len(splitted) == 1: + _local_version = splitted + + elif len(splitted) == 2: + _local_version, ide_os = splitted + + elif len(splitted) == 3: + _local_version, ide_os, breakpoints_by = splitted + + version_msg = self.api.set_ide_os_and_breakpoints_by(py_db, seq, ide_os, breakpoints_by) + + # Enable thread notifications after the version command is completed. + self.api.set_enable_thread_notifications(py_db, True) + + return version_msg + + def cmd_thread_run(self, py_db, cmd_id, seq, text): + return self.api.request_resume_thread(text.strip()) + + def _cmd_step(self, py_db, cmd_id, seq, text): + return self.api.request_step(py_db, text.strip(), cmd_id) + + cmd_step_into = _cmd_step + cmd_step_into_my_code = _cmd_step + cmd_step_over = _cmd_step + cmd_step_over_my_code = _cmd_step + cmd_step_return = _cmd_step + cmd_step_return_my_code = _cmd_step + + def _cmd_set_next(self, py_db, cmd_id, seq, text): + thread_id, line, func_name = text.split("\t", 2) + return self.api.request_set_next(py_db, seq, thread_id, cmd_id, None, line, func_name) + + cmd_run_to_line = _cmd_set_next + cmd_set_next_statement = _cmd_set_next + + def cmd_smart_step_into(self, py_db, cmd_id, seq, text): + thread_id, line_or_bytecode_offset, func_name = text.split("\t", 2) + if line_or_bytecode_offset.startswith("offset="): + # In this case we request the smart step into to stop given the parent frame + # and the location of the parent frame bytecode offset and not just the func_name + # (this implies that `CMD_GET_SMART_STEP_INTO_VARIANTS` was previously used + # to know what are the valid stop points). + + temp = line_or_bytecode_offset[len("offset=") :] + if ";" in temp: + offset, child_offset = temp.split(";") + offset = int(offset) + child_offset = int(child_offset) + else: + child_offset = -1 + offset = int(temp) + return self.api.request_smart_step_into(py_db, seq, thread_id, offset, child_offset) + else: + # If the offset wasn't passed, just use the line/func_name to do the stop. + return self.api.request_smart_step_into_by_func_name(py_db, seq, thread_id, line_or_bytecode_offset, func_name) + + def cmd_reload_code(self, py_db, cmd_id, seq, text): + text = text.strip() + if "\t" not in text: + module_name = text.strip() + filename = None + else: + module_name, filename = text.split("\t", 1) + self.api.request_reload_code(py_db, seq, module_name, filename) + + def cmd_change_variable(self, py_db, cmd_id, seq, text): + # the text is: thread\tstackframe\tFRAME|GLOBAL\tattribute_to_change\tvalue_to_change + thread_id, frame_id, scope, attr_and_value = text.split("\t", 3) + + tab_index = attr_and_value.rindex("\t") + attr = attr_and_value[0:tab_index].replace("\t", ".") + value = attr_and_value[tab_index + 1 :] + self.api.request_change_variable(py_db, seq, thread_id, frame_id, scope, attr, value) + + def cmd_get_variable(self, py_db, cmd_id, seq, text): + # we received some command to get a variable + # the text is: thread_id\tframe_id\tFRAME|GLOBAL\tattributes* + thread_id, frame_id, scopeattrs = text.split("\t", 2) + + if scopeattrs.find("\t") != -1: # there are attributes beyond scope + scope, attrs = scopeattrs.split("\t", 1) + else: + scope, attrs = (scopeattrs, None) + + self.api.request_get_variable(py_db, seq, thread_id, frame_id, scope, attrs) + + def cmd_get_array(self, py_db, cmd_id, seq, text): + # Note: untested and unused in pydev + # we received some command to get an array variable + # the text is: thread_id\tframe_id\tFRAME|GLOBAL\tname\ttemp\troffs\tcoffs\trows\tcols\tformat + roffset, coffset, rows, cols, format, thread_id, frame_id, scopeattrs = text.split("\t", 7) + + if scopeattrs.find("\t") != -1: # there are attributes beyond scope + scope, attrs = scopeattrs.split("\t", 1) + else: + scope, attrs = (scopeattrs, None) + + self.api.request_get_array(py_db, seq, roffset, coffset, rows, cols, format, thread_id, frame_id, scope, attrs) + + def cmd_show_return_values(self, py_db, cmd_id, seq, text): + show_return_values = text.split("\t")[1] + self.api.set_show_return_values(py_db, int(show_return_values) == 1) + + def cmd_load_full_value(self, py_db, cmd_id, seq, text): + # Note: untested and unused in pydev + thread_id, frame_id, scopeattrs = text.split("\t", 2) + vars = scopeattrs.split(NEXT_VALUE_SEPARATOR) + + self.api.request_load_full_value(py_db, seq, thread_id, frame_id, vars) + + def cmd_get_description(self, py_db, cmd_id, seq, text): + # Note: untested and unused in pydev + thread_id, frame_id, expression = text.split("\t", 2) + self.api.request_get_description(py_db, seq, thread_id, frame_id, expression) + + def cmd_get_frame(self, py_db, cmd_id, seq, text): + thread_id, frame_id, scope = text.split("\t", 2) + self.api.request_get_frame(py_db, seq, thread_id, frame_id) + + def cmd_set_break(self, py_db, cmd_id, seq, text): + # func name: 'None': match anything. Empty: match global, specified: only method context. + # command to add some breakpoint. + # text is filename\tline. Add to breakpoints dictionary + suspend_policy = "NONE" # Can be 'NONE' or 'ALL' + is_logpoint = False + hit_condition = None + if py_db._set_breakpoints_with_id: + try: + try: + ( + breakpoint_id, + btype, + filename, + line, + func_name, + condition, + expression, + hit_condition, + is_logpoint, + suspend_policy, + ) = text.split("\t", 9) + except ValueError: # not enough values to unpack + # No suspend_policy passed (use default). + breakpoint_id, btype, filename, line, func_name, condition, expression, hit_condition, is_logpoint = text.split("\t", 8) + is_logpoint = is_logpoint == "True" + except ValueError: # not enough values to unpack + breakpoint_id, btype, filename, line, func_name, condition, expression = text.split("\t", 6) + + breakpoint_id = int(breakpoint_id) + line = int(line) + + # We must restore new lines and tabs as done in + # AbstractDebugTarget.breakpointAdded + condition = condition.replace("@_@NEW_LINE_CHAR@_@", "\n").replace("@_@TAB_CHAR@_@", "\t").strip() + + expression = expression.replace("@_@NEW_LINE_CHAR@_@", "\n").replace("@_@TAB_CHAR@_@", "\t").strip() + else: + # Note: this else should be removed after PyCharm migrates to setting + # breakpoints by id (and ideally also provides func_name). + btype, filename, line, func_name, suspend_policy, condition, expression = text.split("\t", 6) + # If we don't have an id given for each breakpoint, consider + # the id to be the line. + breakpoint_id = line = int(line) + + condition = condition.replace("@_@NEW_LINE_CHAR@_@", "\n").replace("@_@TAB_CHAR@_@", "\t").strip() + + expression = expression.replace("@_@NEW_LINE_CHAR@_@", "\n").replace("@_@TAB_CHAR@_@", "\t").strip() + + if condition is not None and (len(condition) <= 0 or condition == "None"): + condition = None + + if expression is not None and (len(expression) <= 0 or expression == "None"): + expression = None + + if hit_condition is not None and (len(hit_condition) <= 0 or hit_condition == "None"): + hit_condition = None + + def on_changed_breakpoint_state(breakpoint_id, add_breakpoint_result): + error_code = add_breakpoint_result.error_code + + translated_line = add_breakpoint_result.translated_line + translated_filename = add_breakpoint_result.translated_filename + msg = "" + if error_code: + if error_code == self.api.ADD_BREAKPOINT_FILE_NOT_FOUND: + msg = "pydev debugger: Trying to add breakpoint to file that does not exist: %s (will have no effect).\n" % ( + translated_filename, + ) + + elif error_code == self.api.ADD_BREAKPOINT_FILE_EXCLUDED_BY_FILTERS: + msg = "pydev debugger: Trying to add breakpoint to file that is excluded by filters: %s (will have no effect).\n" % ( + translated_filename, + ) + + elif error_code == self.api.ADD_BREAKPOINT_LAZY_VALIDATION: + msg = "" # Ignore this here (if/when loaded, it'll call on_changed_breakpoint_state again accordingly). + + elif error_code == self.api.ADD_BREAKPOINT_INVALID_LINE: + msg = "pydev debugger: Trying to add breakpoint to line (%s) that is not valid in: %s.\n" % ( + translated_line, + translated_filename, + ) + + else: + # Shouldn't get here. + msg = "pydev debugger: Breakpoint not validated (reason unknown -- please report as error): %s (%s).\n" % ( + translated_filename, + translated_line, + ) + + else: + if add_breakpoint_result.original_line != translated_line: + msg = "pydev debugger (info): Breakpoint in line: %s moved to line: %s (in %s).\n" % ( + add_breakpoint_result.original_line, + translated_line, + translated_filename, + ) + + if msg: + py_db.writer.add_command(py_db.cmd_factory.make_warning_message(msg)) + + result = self.api.add_breakpoint( + py_db, + self.api.filename_to_str(filename), + btype, + breakpoint_id, + line, + condition, + func_name, + expression, + suspend_policy, + hit_condition, + is_logpoint, + on_changed_breakpoint_state=on_changed_breakpoint_state, + ) + + on_changed_breakpoint_state(breakpoint_id, result) + + def cmd_remove_break(self, py_db, cmd_id, seq, text): + # command to remove some breakpoint + # text is type\file\tid. Remove from breakpoints dictionary + breakpoint_type, filename, breakpoint_id = text.split("\t", 2) + + filename = self.api.filename_to_str(filename) + + try: + breakpoint_id = int(breakpoint_id) + except ValueError: + pydev_log.critical("Error removing breakpoint. Expected breakpoint_id to be an int. Found: %s", breakpoint_id) + + else: + self.api.remove_breakpoint(py_db, filename, breakpoint_type, breakpoint_id) + + def _cmd_exec_or_evaluate_expression(self, py_db, cmd_id, seq, text): + # command to evaluate the given expression + # text is: thread\tstackframe\tLOCAL\texpression + attr_to_set_result = "" + try: + thread_id, frame_id, scope, expression, trim, attr_to_set_result = text.split("\t", 5) + except ValueError: + thread_id, frame_id, scope, expression, trim = text.split("\t", 4) + is_exec = cmd_id == CMD_EXEC_EXPRESSION + trim_if_too_big = int(trim) == 1 + + self.api.request_exec_or_evaluate(py_db, seq, thread_id, frame_id, expression, is_exec, trim_if_too_big, attr_to_set_result) + + cmd_evaluate_expression = _cmd_exec_or_evaluate_expression + cmd_exec_expression = _cmd_exec_or_evaluate_expression + + def cmd_console_exec(self, py_db, cmd_id, seq, text): + # command to exec expression in console, in case expression is only partially valid 'False' is returned + # text is: thread\tstackframe\tLOCAL\texpression + + thread_id, frame_id, scope, expression = text.split("\t", 3) + self.api.request_console_exec(py_db, seq, thread_id, frame_id, expression) + + def cmd_set_path_mapping_json(self, py_db, cmd_id, seq, text): + """ + :param text: + Json text. Something as: + + { + "pathMappings": [ + { + "localRoot": "c:/temp", + "remoteRoot": "/usr/temp" + } + ], + "debug": true, + "force": false + } + """ + as_json = json.loads(text) + force = as_json.get("force", False) + + path_mappings = [] + for pathMapping in as_json.get("pathMappings", []): + localRoot = pathMapping.get("localRoot", "") + remoteRoot = pathMapping.get("remoteRoot", "") + if (localRoot != "") and (remoteRoot != ""): + path_mappings.append((localRoot, remoteRoot)) + + if bool(path_mappings) or force: + pydevd_file_utils.setup_client_server_paths(path_mappings) + + debug = as_json.get("debug", False) + if debug or force: + pydevd_file_utils.DEBUG_CLIENT_SERVER_TRANSLATION = debug + + def cmd_set_py_exception_json(self, py_db, cmd_id, seq, text): + # This API is optional and works 'in bulk' -- it's possible + # to get finer-grained control with CMD_ADD_EXCEPTION_BREAK/CMD_REMOVE_EXCEPTION_BREAK + # which allows setting caught/uncaught per exception, although global settings such as: + # - skip_on_exceptions_thrown_in_same_context + # - ignore_exceptions_thrown_in_lines_with_ignore_exception + # must still be set through this API (before anything else as this clears all existing + # exception breakpoints). + try: + py_db.break_on_uncaught_exceptions = {} + py_db.break_on_caught_exceptions = {} + py_db.break_on_user_uncaught_exceptions = {} + + as_json = json.loads(text) + break_on_uncaught = as_json.get("break_on_uncaught", False) + break_on_caught = as_json.get("break_on_caught", False) + break_on_user_caught = as_json.get("break_on_user_caught", False) + py_db.skip_on_exceptions_thrown_in_same_context = as_json.get("skip_on_exceptions_thrown_in_same_context", False) + py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception = as_json.get( + "ignore_exceptions_thrown_in_lines_with_ignore_exception", False + ) + ignore_libraries = as_json.get("ignore_libraries", False) + exception_types = as_json.get("exception_types", []) + + for exception_type in exception_types: + if not exception_type: + continue + + py_db.add_break_on_exception( + exception_type, + condition=None, + expression=None, + notify_on_handled_exceptions=break_on_caught, + notify_on_unhandled_exceptions=break_on_uncaught, + notify_on_user_unhandled_exceptions=break_on_user_caught, + notify_on_first_raise_only=True, + ignore_libraries=ignore_libraries, + ) + + py_db.on_breakpoints_changed() + except: + pydev_log.exception("Error when setting exception list. Received: %s", text) + + def cmd_set_py_exception(self, py_db, cmd_id, seq, text): + # DEPRECATED. Use cmd_set_py_exception_json instead. + try: + splitted = text.split(";") + py_db.break_on_uncaught_exceptions = {} + py_db.break_on_caught_exceptions = {} + py_db.break_on_user_uncaught_exceptions = {} + if len(splitted) >= 5: + if splitted[0] == "true": + break_on_uncaught = True + else: + break_on_uncaught = False + + if splitted[1] == "true": + break_on_caught = True + else: + break_on_caught = False + + if splitted[2] == "true": + py_db.skip_on_exceptions_thrown_in_same_context = True + else: + py_db.skip_on_exceptions_thrown_in_same_context = False + + if splitted[3] == "true": + py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception = True + else: + py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception = False + + if splitted[4] == "true": + ignore_libraries = True + else: + ignore_libraries = False + + for exception_type in splitted[5:]: + exception_type = exception_type.strip() + if not exception_type: + continue + + py_db.add_break_on_exception( + exception_type, + condition=None, + expression=None, + notify_on_handled_exceptions=break_on_caught, + notify_on_unhandled_exceptions=break_on_uncaught, + notify_on_user_unhandled_exceptions=False, # TODO (not currently supported in this API). + notify_on_first_raise_only=True, + ignore_libraries=ignore_libraries, + ) + else: + pydev_log.exception("Expected to have at least 5 ';' separated items. Received: %s", text) + + except: + pydev_log.exception("Error when setting exception list. Received: %s", text) + + def _load_source(self, py_db, cmd_id, seq, text): + filename = text + filename = self.api.filename_to_str(filename) + self.api.request_load_source(py_db, seq, filename) + + cmd_load_source = _load_source + cmd_get_file_contents = _load_source + + def cmd_load_source_from_frame_id(self, py_db, cmd_id, seq, text): + frame_id = text + self.api.request_load_source_from_frame_id(py_db, seq, frame_id) + + def cmd_set_property_trace(self, py_db, cmd_id, seq, text): + # Command which receives whether to trace property getter/setter/deleter + # text is feature_state(true/false);disable_getter/disable_setter/disable_deleter + if text: + splitted = text.split(";") + if len(splitted) >= 3: + if not py_db.disable_property_trace and splitted[0] == "true": + # Replacing property by custom property only when the debugger starts + pydevd_traceproperty.replace_builtin_property() + py_db.disable_property_trace = True + # Enable/Disable tracing of the property getter + if splitted[1] == "true": + py_db.disable_property_getter_trace = True + else: + py_db.disable_property_getter_trace = False + # Enable/Disable tracing of the property setter + if splitted[2] == "true": + py_db.disable_property_setter_trace = True + else: + py_db.disable_property_setter_trace = False + # Enable/Disable tracing of the property deleter + if splitted[3] == "true": + py_db.disable_property_deleter_trace = True + else: + py_db.disable_property_deleter_trace = False + + def cmd_add_exception_break(self, py_db, cmd_id, seq, text): + # Note that this message has some idiosyncrasies... + # + # notify_on_handled_exceptions can be 0, 1 or 2 + # 0 means we should not stop on handled exceptions. + # 1 means we should stop on handled exceptions showing it on all frames where the exception passes. + # 2 means we should stop on handled exceptions but we should only notify about it once. + # + # To ignore_libraries properly, besides setting ignore_libraries to 1, the IDE_PROJECT_ROOTS environment + # variable must be set (so, we'll ignore anything not below IDE_PROJECT_ROOTS) -- this is not ideal as + # the environment variable may not be properly set if it didn't start from the debugger (we should + # create a custom message for that). + # + # There are 2 global settings which can only be set in CMD_SET_PY_EXCEPTION. Namely: + # + # py_db.skip_on_exceptions_thrown_in_same_context + # - If True, we should only show the exception in a caller, not where it was first raised. + # + # py_db.ignore_exceptions_thrown_in_lines_with_ignore_exception + # - If True exceptions thrown in lines with '@IgnoreException' will not be shown. + + condition = "" + expression = "" + if text.find("\t") != -1: + try: + ( + exception, + condition, + expression, + notify_on_handled_exceptions, + notify_on_unhandled_exceptions, + ignore_libraries, + ) = text.split("\t", 5) + except: + exception, notify_on_handled_exceptions, notify_on_unhandled_exceptions, ignore_libraries = text.split("\t", 3) + else: + exception, notify_on_handled_exceptions, notify_on_unhandled_exceptions, ignore_libraries = text, 0, 0, 0 + + condition = condition.replace("@_@NEW_LINE_CHAR@_@", "\n").replace("@_@TAB_CHAR@_@", "\t").strip() + + if condition is not None and (len(condition) == 0 or condition == "None"): + condition = None + + expression = expression.replace("@_@NEW_LINE_CHAR@_@", "\n").replace("@_@TAB_CHAR@_@", "\t").strip() + + if expression is not None and (len(expression) == 0 or expression == "None"): + expression = None + + if exception.find("-") != -1: + breakpoint_type, exception = exception.split("-") + else: + breakpoint_type = "python" + + if breakpoint_type == "python": + self.api.add_python_exception_breakpoint( + py_db, + exception, + condition, + expression, + notify_on_handled_exceptions=int(notify_on_handled_exceptions) > 0, + notify_on_unhandled_exceptions=int(notify_on_unhandled_exceptions) == 1, + notify_on_user_unhandled_exceptions=0, # TODO (not currently supported in this API). + notify_on_first_raise_only=int(notify_on_handled_exceptions) == 2, + ignore_libraries=int(ignore_libraries) > 0, + ) + else: + self.api.add_plugins_exception_breakpoint(py_db, breakpoint_type, exception) + + def cmd_remove_exception_break(self, py_db, cmd_id, seq, text): + exception = text + if exception.find("-") != -1: + exception_type, exception = exception.split("-") + else: + exception_type = "python" + + if exception_type == "python": + self.api.remove_python_exception_breakpoint(py_db, exception) + else: + self.api.remove_plugins_exception_breakpoint(py_db, exception_type, exception) + + def cmd_add_django_exception_break(self, py_db, cmd_id, seq, text): + self.api.add_plugins_exception_breakpoint(py_db, breakpoint_type="django", exception=text) + + def cmd_remove_django_exception_break(self, py_db, cmd_id, seq, text): + self.api.remove_plugins_exception_breakpoint(py_db, exception_type="django", exception=text) + + def cmd_evaluate_console_expression(self, py_db, cmd_id, seq, text): + # Command which takes care for the debug console communication + if text != "": + thread_id, frame_id, console_command = text.split("\t", 2) + console_command, line = console_command.split("\t") + + if console_command == "EVALUATE": + int_cmd = InternalEvaluateConsoleExpression(seq, thread_id, frame_id, line, buffer_output=True) + + elif console_command == "EVALUATE_UNBUFFERED": + int_cmd = InternalEvaluateConsoleExpression(seq, thread_id, frame_id, line, buffer_output=False) + + elif console_command == "GET_COMPLETIONS": + int_cmd = InternalConsoleGetCompletions(seq, thread_id, frame_id, line) + + else: + raise ValueError("Unrecognized command: %s" % (console_command,)) + + py_db.post_internal_command(int_cmd, thread_id) + + def cmd_run_custom_operation(self, py_db, cmd_id, seq, text): + # Command which runs a custom operation + if text != "": + try: + location, custom = text.split("||", 1) + except: + sys.stderr.write("Custom operation now needs a || separator. Found: %s\n" % (text,)) + raise + + thread_id, frame_id, scopeattrs = location.split("\t", 2) + + if scopeattrs.find("\t") != -1: # there are attributes beyond scope + scope, attrs = scopeattrs.split("\t", 1) + else: + scope, attrs = (scopeattrs, None) + + # : style: EXECFILE or EXEC + # : encoded_code_or_file: file to execute or code + # : fname: name of function to be executed in the resulting namespace + style, encoded_code_or_file, fnname = custom.split("\t", 3) + int_cmd = InternalRunCustomOperation(seq, thread_id, frame_id, scope, attrs, style, encoded_code_or_file, fnname) + py_db.post_internal_command(int_cmd, thread_id) + + def cmd_ignore_thrown_exception_at(self, py_db, cmd_id, seq, text): + if text: + replace = "REPLACE:" # Not all 3.x versions support u'REPLACE:', so, doing workaround. + if text.startswith(replace): + text = text[8:] + py_db.filename_to_lines_where_exceptions_are_ignored.clear() + + if text: + for line in text.split("||"): # Can be bulk-created (one in each line) + original_filename, line_number = line.split("|") + original_filename = self.api.filename_to_server(original_filename) + + canonical_normalized_filename = pydevd_file_utils.canonical_normalized_path(original_filename) + absolute_filename = pydevd_file_utils.absolute_path(original_filename) + + if os.path.exists(absolute_filename): + lines_ignored = py_db.filename_to_lines_where_exceptions_are_ignored.get(canonical_normalized_filename) + if lines_ignored is None: + lines_ignored = py_db.filename_to_lines_where_exceptions_are_ignored[canonical_normalized_filename] = {} + lines_ignored[int(line_number)] = 1 + else: + sys.stderr.write( + "pydev debugger: warning: trying to ignore exception thrown" + " on file that does not exist: %s (will have no effect)\n" % (absolute_filename,) + ) + + def cmd_enable_dont_trace(self, py_db, cmd_id, seq, text): + if text: + true_str = "true" # Not all 3.x versions support u'str', so, doing workaround. + mode = text.strip() == true_str + pydevd_dont_trace.trace_filter(mode) + + def cmd_redirect_output(self, py_db, cmd_id, seq, text): + if text: + py_db.enable_output_redirection("STDOUT" in text, "STDERR" in text) + + def cmd_get_next_statement_targets(self, py_db, cmd_id, seq, text): + thread_id, frame_id = text.split("\t", 1) + + py_db.post_method_as_internal_command(thread_id, internal_get_next_statement_targets, seq, thread_id, frame_id) + + def cmd_get_smart_step_into_variants(self, py_db, cmd_id, seq, text): + thread_id, frame_id, start_line, end_line = text.split("\t", 3) + + py_db.post_method_as_internal_command( + thread_id, + internal_get_smart_step_into_variants, + seq, + thread_id, + frame_id, + start_line, + end_line, + set_additional_thread_info=set_additional_thread_info, + ) + + def cmd_set_project_roots(self, py_db, cmd_id, seq, text): + self.api.set_project_roots(py_db, text.split("\t")) + + def cmd_thread_dump_to_stderr(self, py_db, cmd_id, seq, text): + pydevd_utils.dump_threads() + + def cmd_stop_on_start(self, py_db, cmd_id, seq, text): + if text.strip() in ("True", "true", "1"): + self.api.stop_on_entry() + + def cmd_pydevd_json_config(self, py_db, cmd_id, seq, text): + # Expected to receive a json string as: + # { + # 'skip_suspend_on_breakpoint_exception': [], + # 'skip_print_breakpoint_exception': [], + # 'multi_threads_single_notification': bool, + # } + msg = json.loads(text.strip()) + if "skip_suspend_on_breakpoint_exception" in msg: + py_db.skip_suspend_on_breakpoint_exception = tuple(get_exception_class(x) for x in msg["skip_suspend_on_breakpoint_exception"]) + + if "skip_print_breakpoint_exception" in msg: + py_db.skip_print_breakpoint_exception = tuple(get_exception_class(x) for x in msg["skip_print_breakpoint_exception"]) + + if "multi_threads_single_notification" in msg: + py_db.multi_threads_single_notification = msg["multi_threads_single_notification"] + + def cmd_get_exception_details(self, py_db, cmd_id, seq, text): + thread_id = text + t = pydevd_find_thread_by_id(thread_id) + frame = None + if t is not None and not getattr(t, "pydev_do_not_trace", None): + additional_info = set_additional_thread_info(t) + frame = additional_info.get_topmost_frame(t) + try: + # Note: provide the return even if the thread is empty. + return py_db.cmd_factory.make_get_exception_details_message(py_db, seq, thread_id, frame) + finally: + frame = None + t = None + + +process_net_command = _PyDevCommandProcessor().process_net_command diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py new file mode 100644 index 0000000..9e11819 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py @@ -0,0 +1,1354 @@ +import itertools +import json +import linecache +import os +import platform +import sys +from functools import partial + +import pydevd_file_utils +from _pydev_bundle import pydev_log +from _pydevd_bundle._debug_adapter import pydevd_base_schema, pydevd_schema +from _pydevd_bundle._debug_adapter.pydevd_schema import ( + CompletionsResponseBody, + EvaluateResponseBody, + ExceptionOptions, + GotoTargetsResponseBody, + ModulesResponseBody, + ProcessEventBody, + ProcessEvent, + Scope, + ScopesResponseBody, + SetExpressionResponseBody, + SetVariableResponseBody, + SourceBreakpoint, + SourceResponseBody, + VariablesResponseBody, + SetBreakpointsResponseBody, + Response, + Capabilities, + PydevdAuthorizeRequest, + Request, + StepInTargetsResponseBody, + SetFunctionBreakpointsResponseBody, + BreakpointEvent, + BreakpointEventBody, + InitializedEvent, +) +from _pydevd_bundle.pydevd_api import PyDevdAPI +from _pydevd_bundle.pydevd_breakpoints import get_exception_class, FunctionBreakpoint +from _pydevd_bundle.pydevd_comm_constants import ( + CMD_PROCESS_EVENT, + CMD_RETURN, + CMD_SET_NEXT_STATEMENT, + CMD_STEP_INTO, + CMD_STEP_INTO_MY_CODE, + CMD_STEP_OVER, + CMD_STEP_OVER_MY_CODE, + file_system_encoding, + CMD_STEP_RETURN_MY_CODE, + CMD_STEP_RETURN, +) +from _pydevd_bundle.pydevd_filtering import ExcludeFilter +from _pydevd_bundle.pydevd_json_debug_options import _extract_debug_options, DebugOptions +from _pydevd_bundle.pydevd_net_command import NetCommand +from _pydevd_bundle.pydevd_utils import convert_dap_log_message_to_expression, ScopeRequest +from _pydevd_bundle.pydevd_constants import PY_IMPL_NAME, DebugInfoHolder, PY_VERSION_STR, PY_IMPL_VERSION_STR, IS_64BIT_PROCESS +from _pydevd_bundle.pydevd_trace_dispatch import USING_CYTHON +from _pydevd_frame_eval.pydevd_frame_eval_main import USING_FRAME_EVAL +from _pydevd_bundle.pydevd_comm import internal_get_step_in_targets_json +from _pydevd_bundle.pydevd_additional_thread_info import set_additional_thread_info +from _pydevd_bundle.pydevd_thread_lifecycle import pydevd_find_thread_by_id + + +def _convert_rules_to_exclude_filters(rules, on_error): + exclude_filters = [] + if not isinstance(rules, list): + on_error('Invalid "rules" (expected list of dicts). Found: %s' % (rules,)) + + else: + directory_exclude_filters = [] + module_exclude_filters = [] + glob_exclude_filters = [] + + for rule in rules: + if not isinstance(rule, dict): + on_error('Invalid "rules" (expected list of dicts). Found: %s' % (rules,)) + continue + + include = rule.get("include") + if include is None: + on_error('Invalid "rule" (expected dict with "include"). Found: %s' % (rule,)) + continue + + path = rule.get("path") + module = rule.get("module") + if path is None and module is None: + on_error('Invalid "rule" (expected dict with "path" or "module"). Found: %s' % (rule,)) + continue + + if path is not None: + glob_pattern = path + if "*" not in path and "?" not in path: + if os.path.isdir(glob_pattern): + # If a directory was specified, add a '/**' + # to be consistent with the glob pattern required + # by pydevd. + if not glob_pattern.endswith("/") and not glob_pattern.endswith("\\"): + glob_pattern += "/" + glob_pattern += "**" + directory_exclude_filters.append(ExcludeFilter(glob_pattern, not include, True)) + else: + glob_exclude_filters.append(ExcludeFilter(glob_pattern, not include, True)) + + elif module is not None: + module_exclude_filters.append(ExcludeFilter(module, not include, False)) + + else: + on_error("Internal error: expected path or module to be specified.") + + # Note that we have to sort the directory/module exclude filters so that the biggest + # paths match first. + # i.e.: if we have: + # /sub1/sub2/sub3 + # a rule with /sub1/sub2 would match before a rule only with /sub1. + directory_exclude_filters = sorted(directory_exclude_filters, key=lambda exclude_filter: -len(exclude_filter.name)) + module_exclude_filters = sorted(module_exclude_filters, key=lambda exclude_filter: -len(exclude_filter.name)) + exclude_filters = directory_exclude_filters + glob_exclude_filters + module_exclude_filters + + return exclude_filters + + +class IDMap(object): + def __init__(self): + self._value_to_key = {} + self._key_to_value = {} + self._next_id = partial(next, itertools.count(0)) + + def obtain_value(self, key): + return self._key_to_value[key] + + def obtain_key(self, value): + try: + key = self._value_to_key[value] + except KeyError: + key = self._next_id() + self._key_to_value[key] = value + self._value_to_key[value] = key + return key + + +class PyDevJsonCommandProcessor(object): + def __init__(self, from_json): + self.from_json = from_json + self.api = PyDevdAPI() + self._options = DebugOptions() + self._next_breakpoint_id = partial(next, itertools.count(0)) + self._goto_targets_map = IDMap() + self._launch_or_attach_request_done = False + + def process_net_command_json(self, py_db, json_contents, send_response=True): + """ + Processes a debug adapter protocol json command. + """ + + DEBUG = False + + try: + if isinstance(json_contents, bytes): + json_contents = json_contents.decode("utf-8") + + request = self.from_json(json_contents, update_ids_from_dap=True) + except Exception as e: + try: + loaded_json = json.loads(json_contents) + request = Request(loaded_json.get("command", ""), loaded_json["seq"]) + except: + # There's not much we can do in this case... + pydev_log.exception("Error loading json: %s", json_contents) + return + + error_msg = str(e) + if error_msg.startswith("'") and error_msg.endswith("'"): + error_msg = error_msg[1:-1] + + # This means a failure processing the request (but we were able to load the seq, + # so, answer with a failure response). + def on_request(py_db, request): + error_response = { + "type": "response", + "request_seq": request.seq, + "success": False, + "command": request.command, + "message": error_msg, + } + return NetCommand(CMD_RETURN, 0, error_response, is_json=True) + + else: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + pydev_log.info( + "Process %s: %s\n" + % ( + request.__class__.__name__, + json.dumps(request.to_dict(update_ids_to_dap=True), indent=4, sort_keys=True), + ) + ) + + assert request.type == "request" + method_name = "on_%s_request" % (request.command.lower(),) + on_request = getattr(self, method_name, None) + if on_request is None: + print("Unhandled: %s not available in PyDevJsonCommandProcessor.\n" % (method_name,)) + return + + if DEBUG: + print("Handled in pydevd: %s (in PyDevJsonCommandProcessor).\n" % (method_name,)) + + with py_db._main_lock: + if request.__class__ == PydevdAuthorizeRequest: + authorize_request = request # : :type authorize_request: PydevdAuthorizeRequest + access_token = authorize_request.arguments.debugServerAccessToken + py_db.authentication.login(access_token) + + if not py_db.authentication.is_authenticated(): + response = Response(request.seq, success=False, command=request.command, message="Client not authenticated.", body={}) + cmd = NetCommand(CMD_RETURN, 0, response, is_json=True) + py_db.writer.add_command(cmd) + return + + cmd = on_request(py_db, request) + if cmd is not None and send_response: + py_db.writer.add_command(cmd) + + def on_pydevdauthorize_request(self, py_db, request): + client_access_token = py_db.authentication.client_access_token + body = {"clientAccessToken": None} + if client_access_token: + body["clientAccessToken"] = client_access_token + + response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_initialize_request(self, py_db, request): + body = Capabilities( + # Supported. + supportsConfigurationDoneRequest=True, + supportsConditionalBreakpoints=True, + supportsHitConditionalBreakpoints=True, + supportsEvaluateForHovers=True, + supportsSetVariable=True, + supportsGotoTargetsRequest=True, + supportsCompletionsRequest=True, + supportsModulesRequest=True, + supportsExceptionOptions=True, + supportsValueFormattingOptions=True, + supportsExceptionInfoRequest=True, + supportTerminateDebuggee=True, + supportsDelayedStackTraceLoading=True, + supportsLogPoints=True, + supportsSetExpression=True, + supportsTerminateRequest=True, + supportsClipboardContext=True, + supportsFunctionBreakpoints=True, + exceptionBreakpointFilters=[ + {"filter": "raised", "label": "Raised Exceptions", "default": False}, + {"filter": "uncaught", "label": "Uncaught Exceptions", "default": True}, + {"filter": "userUnhandled", "label": "User Uncaught Exceptions", "default": False}, + ], + # Not supported. + supportsStepBack=False, + supportsRestartFrame=False, + supportsStepInTargetsRequest=True, + supportsRestartRequest=False, + supportsLoadedSourcesRequest=False, + supportsTerminateThreadsRequest=False, + supportsDataBreakpoints=False, + supportsReadMemoryRequest=False, + supportsDisassembleRequest=False, + additionalModuleColumns=[], + completionTriggerCharacters=[], + supportedChecksumAlgorithms=[], + ).to_dict() + + # Non-standard capabilities/info below. + body["supportsDebuggerProperties"] = True + + body["pydevd"] = pydevd_info = {} + pydevd_info["processId"] = os.getpid() + self.api.notify_initialize(py_db) + response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_configurationdone_request(self, py_db, request): + """ + :param ConfigurationDoneRequest request: + """ + if not self._launch_or_attach_request_done: + pydev_log.critical("Missing launch request or attach request before configuration done request.") + + self.api.run(py_db) + self.api.notify_configuration_done(py_db) + + configuration_done_response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, configuration_done_response, is_json=True) + + def on_threads_request(self, py_db, request): + """ + :param ThreadsRequest request: + """ + return self.api.list_threads(py_db, request.seq) + + def on_terminate_request(self, py_db, request): + """ + :param TerminateRequest request: + """ + self._request_terminate_process(py_db) + response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def _request_terminate_process(self, py_db): + self.api.request_terminate_process(py_db) + + def on_completions_request(self, py_db, request): + """ + :param CompletionsRequest request: + """ + arguments = request.arguments # : :type arguments: CompletionsArguments + seq = request.seq + text = arguments.text + frame_id = arguments.frameId + thread_id = py_db.suspended_frames_manager.get_thread_id_for_variable_reference(frame_id) + + if thread_id is None: + body = CompletionsResponseBody([]) + variables_response = pydevd_base_schema.build_response( + request, kwargs={"body": body, "success": False, "message": "Thread to get completions seems to have resumed already."} + ) + return NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + + # Note: line and column are 1-based (convert to 0-based for pydevd). + column = arguments.column - 1 + + if arguments.line is None: + # line is optional + line = -1 + else: + line = arguments.line - 1 + + self.api.request_completions(py_db, seq, thread_id, frame_id, text, line=line, column=column) + + def _resolve_remote_root(self, local_root, remote_root): + if remote_root == ".": + cwd = os.getcwd() + append_pathsep = local_root.endswith("\\") or local_root.endswith("/") + return cwd + (os.path.sep if append_pathsep else "") + return remote_root + + def _set_debug_options(self, py_db, args, start_reason): + rules = args.get("rules") + stepping_resumes_all_threads = args.get("steppingResumesAllThreads", True) + self.api.set_stepping_resumes_all_threads(py_db, stepping_resumes_all_threads) + + terminate_child_processes = args.get("terminateChildProcesses", True) + self.api.set_terminate_child_processes(py_db, terminate_child_processes) + + terminate_keyboard_interrupt = args.get("onTerminate", "kill") == "KeyboardInterrupt" + self.api.set_terminate_keyboard_interrupt(py_db, terminate_keyboard_interrupt) + + variable_presentation = args.get("variablePresentation", None) + if isinstance(variable_presentation, dict): + + def get_variable_presentation(setting, default): + value = variable_presentation.get(setting, default) + if value not in ("group", "inline", "hide"): + pydev_log.info( + 'The value set for "%s" (%s) in the variablePresentation is not valid. Valid values are: "group", "inline", "hide"' + % ( + setting, + value, + ) + ) + value = default + + return value + + default = get_variable_presentation("all", "group") + + special_presentation = get_variable_presentation("special", default) + function_presentation = get_variable_presentation("function", default) + class_presentation = get_variable_presentation("class", default) + protected_presentation = get_variable_presentation("protected", default) + + self.api.set_variable_presentation( + py_db, + self.api.VariablePresentation(special_presentation, function_presentation, class_presentation, protected_presentation), + ) + + exclude_filters = [] + + if rules is not None: + exclude_filters = _convert_rules_to_exclude_filters(rules, lambda msg: self.api.send_error_message(py_db, msg)) + + self.api.set_exclude_filters(py_db, exclude_filters) + + debug_options = _extract_debug_options( + args.get("options"), + args.get("debugOptions"), + ) + self._options.update_fom_debug_options(debug_options) + self._options.update_from_args(args) + + self.api.set_use_libraries_filter(py_db, self._options.just_my_code) + + if self._options.client_os: + self.api.set_ide_os(self._options.client_os) + + path_mappings = [] + for pathMapping in args.get("pathMappings", []): + localRoot = pathMapping.get("localRoot", "") + remoteRoot = pathMapping.get("remoteRoot", "") + remoteRoot = self._resolve_remote_root(localRoot, remoteRoot) + if (localRoot != "") and (remoteRoot != ""): + path_mappings.append((localRoot, remoteRoot)) + + if bool(path_mappings): + pydevd_file_utils.setup_client_server_paths(path_mappings) + + resolve_symlinks = args.get("resolveSymlinks", None) + if resolve_symlinks is not None: + pydevd_file_utils.set_resolve_symlinks(resolve_symlinks) + + redirecting = args.get("isOutputRedirected") + if self._options.redirect_output: + py_db.enable_output_redirection(True, True) + redirecting = True + else: + py_db.enable_output_redirection(False, False) + + py_db.is_output_redirected = redirecting + + self.api.set_show_return_values(py_db, self._options.show_return_value) + + if not self._options.break_system_exit_zero: + ignore_system_exit_codes = [0, None] + if self._options.django_debug or self._options.flask_debug: + ignore_system_exit_codes += [3] + + self.api.set_ignore_system_exit_codes(py_db, ignore_system_exit_codes) + + auto_reload = args.get("autoReload", {}) + if not isinstance(auto_reload, dict): + pydev_log.info("Expected autoReload to be a dict. Received: %s" % (auto_reload,)) + auto_reload = {} + + enable_auto_reload = auto_reload.get("enable", False) + watch_dirs = auto_reload.get("watchDirectories") + if not watch_dirs: + watch_dirs = [] + # Note: by default this is no longer done because on some cases there are entries in the PYTHONPATH + # such as the home directory or /python/x64, where the site packages are in /python/x64/libs, so, + # we only watch the current working directory as well as executed script. + # check = getattr(sys, 'path', [])[:] + # # By default only watch directories that are in the project roots / + # # program dir (if available), sys.argv[0], as well as the current dir (we don't want to + # # listen to the whole site-packages by default as it can be huge). + # watch_dirs = [pydevd_file_utils.absolute_path(w) for w in check] + # watch_dirs = [w for w in watch_dirs if py_db.in_project_roots_filename_uncached(w) and os.path.isdir(w)] + + program = args.get("program") + if program: + if os.path.isdir(program): + watch_dirs.append(program) + else: + watch_dirs.append(os.path.dirname(program)) + watch_dirs.append(os.path.abspath(".")) + + argv = getattr(sys, "argv", []) + if argv: + f = argv[0] + if f: # argv[0] could be None (https://github.com/microsoft/debugpy/issues/987) + if os.path.isdir(f): + watch_dirs.append(f) + else: + watch_dirs.append(os.path.dirname(f)) + + if not isinstance(watch_dirs, (list, set, tuple)): + watch_dirs = (watch_dirs,) + new_watch_dirs = set() + for w in watch_dirs: + try: + new_watch_dirs.add(pydevd_file_utils.get_path_with_real_case(pydevd_file_utils.absolute_path(w))) + except Exception: + pydev_log.exception("Error adding watch dir: %s", w) + watch_dirs = new_watch_dirs + + poll_target_time = auto_reload.get("pollingInterval", 1) + exclude_patterns = auto_reload.get( + "exclude", ("**/.git/**", "**/__pycache__/**", "**/node_modules/**", "**/.metadata/**", "**/site-packages/**") + ) + include_patterns = auto_reload.get("include", ("**/*.py", "**/*.pyw")) + self.api.setup_auto_reload_watcher(py_db, enable_auto_reload, watch_dirs, poll_target_time, exclude_patterns, include_patterns) + + if self._options.stop_on_entry and start_reason == "launch": + self.api.stop_on_entry() + + self.api.set_gui_event_loop(py_db, self._options.gui_event_loop) + + def _send_process_event(self, py_db, start_method): + argv = getattr(sys, "argv", []) + if len(argv) > 0: + name = argv[0] + else: + name = "" + + if isinstance(name, bytes): + name = name.decode(file_system_encoding, "replace") + name = name.encode("utf-8") + + body = ProcessEventBody( + name=name, + systemProcessId=os.getpid(), + isLocalProcess=True, + startMethod=start_method, + ) + event = ProcessEvent(body) + py_db.writer.add_command(NetCommand(CMD_PROCESS_EVENT, 0, event, is_json=True)) + + def _handle_launch_or_attach_request(self, py_db, request, start_reason): + self._send_process_event(py_db, start_reason) + self._launch_or_attach_request_done = True + self.api.set_enable_thread_notifications(py_db, True) + self._set_debug_options(py_db, request.arguments.kwargs, start_reason=start_reason) + response = pydevd_base_schema.build_response(request) + + initialized_event = InitializedEvent() + py_db.writer.add_command(NetCommand(CMD_RETURN, 0, initialized_event, is_json=True)) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_launch_request(self, py_db, request): + """ + :param LaunchRequest request: + """ + return self._handle_launch_or_attach_request(py_db, request, start_reason="launch") + + def on_attach_request(self, py_db, request): + """ + :param AttachRequest request: + """ + return self._handle_launch_or_attach_request(py_db, request, start_reason="attach") + + def on_pause_request(self, py_db, request): + """ + :param PauseRequest request: + """ + arguments = request.arguments # : :type arguments: PauseArguments + thread_id = arguments.threadId + + self.api.request_suspend_thread(py_db, thread_id=thread_id) + + response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_continue_request(self, py_db, request): + """ + :param ContinueRequest request: + """ + arguments = request.arguments # : :type arguments: ContinueArguments + thread_id = arguments.threadId + + def on_resumed(): + body = {"allThreadsContinued": thread_id == "*"} + response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + cmd = NetCommand(CMD_RETURN, 0, response, is_json=True) + py_db.writer.add_command(cmd) + + if py_db.multi_threads_single_notification: + # Only send resumed notification when it has actually resumed! + # (otherwise the user could send a continue, receive the notification and then + # request a new pause which would be paused without sending any notification as + # it didn't really run in the first place). + py_db.threads_suspended_single_notification.add_on_resumed_callback(on_resumed) + self.api.request_resume_thread(thread_id) + else: + # Only send resumed notification when it has actually resumed! + # (otherwise the user could send a continue, receive the notification and then + # request a new pause which would be paused without sending any notification as + # it didn't really run in the first place). + self.api.request_resume_thread(thread_id) + on_resumed() + + def on_next_request(self, py_db, request): + """ + :param NextRequest request: + """ + arguments = request.arguments # : :type arguments: NextArguments + thread_id = arguments.threadId + + if py_db.get_use_libraries_filter(): + step_cmd_id = CMD_STEP_OVER_MY_CODE + else: + step_cmd_id = CMD_STEP_OVER + + self.api.request_step(py_db, thread_id, step_cmd_id) + + response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_stepin_request(self, py_db, request): + """ + :param StepInRequest request: + """ + arguments = request.arguments # : :type arguments: StepInArguments + thread_id = arguments.threadId + + target_id = arguments.targetId + if target_id is not None: + thread = pydevd_find_thread_by_id(thread_id) + if thread is None: + response = Response( + request_seq=request.seq, + success=False, + command=request.command, + message="Unable to find thread from thread_id: %s" % (thread_id,), + body={}, + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + info = set_additional_thread_info(thread) + target_id_to_smart_step_into_variant = info.target_id_to_smart_step_into_variant + if not target_id_to_smart_step_into_variant: + variables_response = pydevd_base_schema.build_response( + request, kwargs={"success": False, "message": "Unable to step into target (no targets are saved in the thread info)."} + ) + return NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + + variant = target_id_to_smart_step_into_variant.get(target_id) + if variant is not None: + parent = variant.parent + if parent is not None: + self.api.request_smart_step_into(py_db, request.seq, thread_id, parent.offset, variant.offset) + else: + self.api.request_smart_step_into(py_db, request.seq, thread_id, variant.offset, -1) + else: + variables_response = pydevd_base_schema.build_response( + request, + kwargs={ + "success": False, + "message": "Unable to find step into target %s. Available targets: %s" + % (target_id, target_id_to_smart_step_into_variant), + }, + ) + return NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + + else: + if py_db.get_use_libraries_filter(): + step_cmd_id = CMD_STEP_INTO_MY_CODE + else: + step_cmd_id = CMD_STEP_INTO + + self.api.request_step(py_db, thread_id, step_cmd_id) + + response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_stepintargets_request(self, py_db, request): + """ + :param StepInTargetsRequest request: + """ + frame_id = request.arguments.frameId + thread_id = py_db.suspended_frames_manager.get_thread_id_for_variable_reference(frame_id) + + if thread_id is None: + body = StepInTargetsResponseBody([]) + variables_response = pydevd_base_schema.build_response( + request, + kwargs={ + "body": body, + "success": False, + "message": "Unable to get thread_id from frame_id (thread to get step in targets seems to have resumed already).", + }, + ) + return NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + + py_db.post_method_as_internal_command( + thread_id, internal_get_step_in_targets_json, request.seq, thread_id, frame_id, request, set_additional_thread_info + ) + + def on_stepout_request(self, py_db, request): + """ + :param StepOutRequest request: + """ + arguments = request.arguments # : :type arguments: StepOutArguments + thread_id = arguments.threadId + + if py_db.get_use_libraries_filter(): + step_cmd_id = CMD_STEP_RETURN_MY_CODE + else: + step_cmd_id = CMD_STEP_RETURN + + self.api.request_step(py_db, thread_id, step_cmd_id) + + response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def _get_hit_condition_expression(self, hit_condition): + """Following hit condition values are supported + + * x or == x when breakpoint is hit x times + * >= x when breakpoint is hit more than or equal to x times + * % x when breakpoint is hit multiple of x times + + Returns '@HIT@ == x' where @HIT@ will be replaced by number of hits + """ + if not hit_condition: + return None + + expr = hit_condition.strip() + try: + int(expr) + return "@HIT@ == {}".format(expr) + except ValueError: + pass + + if expr.startswith("%"): + return "@HIT@ {} == 0".format(expr) + + if expr.startswith("==") or expr.startswith(">") or expr.startswith("<"): + return "@HIT@ {}".format(expr) + + return hit_condition + + def on_disconnect_request(self, py_db, request): + """ + :param DisconnectRequest request: + """ + if request.arguments.terminateDebuggee: + self._request_terminate_process(py_db) + response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + self._launch_or_attach_request_done = False + py_db.enable_output_redirection(False, False) + self.api.request_disconnect(py_db, resume_threads=True) + + response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def _verify_launch_or_attach_done(self, request): + if not self._launch_or_attach_request_done: + # Note that to validate the breakpoints we need the launch request to be done already + # (otherwise the filters wouldn't be set for the breakpoint validation). + if request.command == "setFunctionBreakpoints": + body = SetFunctionBreakpointsResponseBody([]) + else: + body = SetBreakpointsResponseBody([]) + response = pydevd_base_schema.build_response( + request, + kwargs={"body": body, "success": False, "message": "Breakpoints may only be set after the launch request is received."}, + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_setfunctionbreakpoints_request(self, py_db, request): + """ + :param SetFunctionBreakpointsRequest request: + """ + response = self._verify_launch_or_attach_done(request) + if response is not None: + return response + + arguments = request.arguments # : :type arguments: SetFunctionBreakpointsArguments + function_breakpoints = [] + suspend_policy = "ALL" if py_db.multi_threads_single_notification else "NONE" + + # Not currently covered by the DAP. + is_logpoint = False + expression = None + + breakpoints_set = [] + arguments.breakpoints = arguments.breakpoints or [] + for bp in arguments.breakpoints: + hit_condition = self._get_hit_condition_expression(bp.get("hitCondition")) + condition = bp.get("condition") + + function_breakpoints.append(FunctionBreakpoint(bp["name"], condition, expression, suspend_policy, hit_condition, is_logpoint)) + + # Note: always succeeds. + breakpoints_set.append(pydevd_schema.Breakpoint(verified=True, id=self._next_breakpoint_id()).to_dict()) + + self.api.set_function_breakpoints(py_db, function_breakpoints) + + body = {"breakpoints": breakpoints_set} + set_breakpoints_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + return NetCommand(CMD_RETURN, 0, set_breakpoints_response, is_json=True) + + def on_setbreakpoints_request(self, py_db, request): + """ + :param SetBreakpointsRequest request: + """ + response = self._verify_launch_or_attach_done(request) + if response is not None: + return response + + arguments = request.arguments # : :type arguments: SetBreakpointsArguments + # TODO: Path is optional here it could be source reference. + filename = self.api.filename_to_str(arguments.source.path) + func_name = "None" + + self.api.remove_all_breakpoints(py_db, filename) + + btype = "python-line" + suspend_policy = "ALL" if py_db.multi_threads_single_notification else "NONE" + + if not filename.lower().endswith(".py"): # Note: check based on original file, not mapping. + if self._options.django_debug: + btype = "django-line" + elif self._options.flask_debug: + btype = "jinja2-line" + + breakpoints_set = [] + arguments.breakpoints = arguments.breakpoints or [] + for source_breakpoint in arguments.breakpoints: + source_breakpoint = SourceBreakpoint(**source_breakpoint) + line = source_breakpoint.line + condition = source_breakpoint.condition + breakpoint_id = self._next_breakpoint_id() + + hit_condition = self._get_hit_condition_expression(source_breakpoint.hitCondition) + log_message = source_breakpoint.logMessage + if not log_message: + is_logpoint = None + expression = None + else: + is_logpoint = True + expression = convert_dap_log_message_to_expression(log_message) + + on_changed_breakpoint_state = partial(self._on_changed_breakpoint_state, py_db, arguments.source) + result = self.api.add_breakpoint( + py_db, + filename, + btype, + breakpoint_id, + line, + condition, + func_name, + expression, + suspend_policy, + hit_condition, + is_logpoint, + adjust_line=True, + on_changed_breakpoint_state=on_changed_breakpoint_state, + ) + + bp = self._create_breakpoint_from_add_breakpoint_result(py_db, arguments.source, breakpoint_id, result) + breakpoints_set.append(bp) + + body = {"breakpoints": breakpoints_set} + set_breakpoints_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + return NetCommand(CMD_RETURN, 0, set_breakpoints_response, is_json=True) + + def _on_changed_breakpoint_state(self, py_db, source, breakpoint_id, result): + bp = self._create_breakpoint_from_add_breakpoint_result(py_db, source, breakpoint_id, result) + body = BreakpointEventBody( + reason="changed", + breakpoint=bp, + ) + event = BreakpointEvent(body) + event_id = 0 # Actually ignored in this case + py_db.writer.add_command(NetCommand(event_id, 0, event, is_json=True)) + + def _create_breakpoint_from_add_breakpoint_result(self, py_db, source, breakpoint_id, result): + error_code = result.error_code + + if error_code: + if error_code == self.api.ADD_BREAKPOINT_FILE_NOT_FOUND: + error_msg = "Breakpoint in file that does not exist." + + elif error_code == self.api.ADD_BREAKPOINT_FILE_EXCLUDED_BY_FILTERS: + error_msg = "Breakpoint in file excluded by filters." + if py_db.get_use_libraries_filter(): + error_msg += ( + '\nNote: may be excluded because of "justMyCode" option (default == true).' + 'Try setting "justMyCode": false in the debug configuration (e.g., launch.json).\n' + ) + + elif error_code == self.api.ADD_BREAKPOINT_LAZY_VALIDATION: + error_msg = "Waiting for code to be loaded to verify breakpoint." + + elif error_code == self.api.ADD_BREAKPOINT_INVALID_LINE: + error_msg = "Breakpoint added to invalid line." + + else: + # Shouldn't get here. + error_msg = "Breakpoint not validated (reason unknown -- please report as bug)." + + return pydevd_schema.Breakpoint( + verified=False, id=breakpoint_id, line=result.translated_line, message=error_msg, source=source + ).to_dict() + else: + return pydevd_schema.Breakpoint(verified=True, id=breakpoint_id, line=result.translated_line, source=source).to_dict() + + def on_setexceptionbreakpoints_request(self, py_db, request): + """ + :param SetExceptionBreakpointsRequest request: + """ + # : :type arguments: SetExceptionBreakpointsArguments + arguments = request.arguments + filters = arguments.filters + exception_options = arguments.exceptionOptions + self.api.remove_all_exception_breakpoints(py_db) + + # Can't set these in the DAP. + condition = None + expression = None + notify_on_first_raise_only = False + + ignore_libraries = 1 if py_db.get_use_libraries_filter() else 0 + + if exception_options: + break_raised = False + break_uncaught = False + + for option in exception_options: + option = ExceptionOptions(**option) + if not option.path: + continue + + # never: never breaks + # + # always: always breaks + # + # unhandled: breaks when exception unhandled + # + # userUnhandled: breaks if the exception is not handled by user code + + notify_on_handled_exceptions = 1 if option.breakMode == "always" else 0 + notify_on_unhandled_exceptions = 1 if option.breakMode == "unhandled" else 0 + notify_on_user_unhandled_exceptions = 1 if option.breakMode == "userUnhandled" else 0 + exception_paths = option.path + break_raised |= notify_on_handled_exceptions + break_uncaught |= notify_on_unhandled_exceptions + + exception_names = [] + if len(exception_paths) == 0: + continue + + elif len(exception_paths) == 1: + if "Python Exceptions" in exception_paths[0]["names"]: + exception_names = ["BaseException"] + + else: + path_iterator = iter(exception_paths) + if "Python Exceptions" in next(path_iterator)["names"]: + for path in path_iterator: + for ex_name in path["names"]: + exception_names.append(ex_name) + + for exception_name in exception_names: + self.api.add_python_exception_breakpoint( + py_db, + exception_name, + condition, + expression, + notify_on_handled_exceptions, + notify_on_unhandled_exceptions, + notify_on_user_unhandled_exceptions, + notify_on_first_raise_only, + ignore_libraries, + ) + + else: + break_raised = "raised" in filters + break_uncaught = "uncaught" in filters + break_user = "userUnhandled" in filters + if break_raised or break_uncaught or break_user: + notify_on_handled_exceptions = 1 if break_raised else 0 + notify_on_unhandled_exceptions = 1 if break_uncaught else 0 + notify_on_user_unhandled_exceptions = 1 if break_user else 0 + exception = "BaseException" + + self.api.add_python_exception_breakpoint( + py_db, + exception, + condition, + expression, + notify_on_handled_exceptions, + notify_on_unhandled_exceptions, + notify_on_user_unhandled_exceptions, + notify_on_first_raise_only, + ignore_libraries, + ) + + if break_raised: + btype = None + if self._options.django_debug: + btype = "django" + elif self._options.flask_debug: + btype = "jinja2" + + if btype: + self.api.add_plugins_exception_breakpoint(py_db, btype, "BaseException") # Note: Exception name could be anything here. + + # Note: no body required on success. + set_breakpoints_response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, set_breakpoints_response, is_json=True) + + def on_stacktrace_request(self, py_db, request): + """ + :param StackTraceRequest request: + """ + # : :type stack_trace_arguments: StackTraceArguments + stack_trace_arguments = request.arguments + thread_id = stack_trace_arguments.threadId + + if stack_trace_arguments.startFrame: + start_frame = int(stack_trace_arguments.startFrame) + else: + start_frame = 0 + + if stack_trace_arguments.levels: + levels = int(stack_trace_arguments.levels) + else: + levels = 0 + + fmt = stack_trace_arguments.format + if hasattr(fmt, "to_dict"): + fmt = fmt.to_dict() + self.api.request_stack(py_db, request.seq, thread_id, fmt=fmt, start_frame=start_frame, levels=levels) + + def on_exceptioninfo_request(self, py_db, request): + """ + :param ExceptionInfoRequest request: + """ + # : :type exception_into_arguments: ExceptionInfoArguments + exception_into_arguments = request.arguments + thread_id = exception_into_arguments.threadId + max_frames = self._options.max_exception_stack_frames + thread = pydevd_find_thread_by_id(thread_id) + if thread is not None: + self.api.request_exception_info_json(py_db, request, thread_id, thread, max_frames) + else: + response = Response( + request_seq=request.seq, + success=False, + command=request.command, + message="Unable to find thread from thread_id: %s" % (thread_id,), + body={}, + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_scopes_request(self, py_db, request): + """ + Scopes are the top-level items which appear for a frame (so, we receive the frame id + and provide the scopes it has). + + :param ScopesRequest request: + """ + frame_id = request.arguments.frameId + + variables_reference = frame_id + scopes = [ + Scope("Locals", ScopeRequest(int(variables_reference), "locals"), False, presentationHint="locals"), + Scope("Globals", ScopeRequest(int(variables_reference), "globals"), False), + ] + body = ScopesResponseBody(scopes) + scopes_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + return NetCommand(CMD_RETURN, 0, scopes_response, is_json=True) + + def on_evaluate_request(self, py_db, request): + """ + :param EvaluateRequest request: + """ + # : :type arguments: EvaluateArguments + arguments = request.arguments + + if arguments.frameId is None: + self.api.request_exec_or_evaluate_json(py_db, request, thread_id="*") + else: + thread_id = py_db.suspended_frames_manager.get_thread_id_for_variable_reference(arguments.frameId) + + if thread_id is not None: + self.api.request_exec_or_evaluate_json(py_db, request, thread_id) + else: + body = EvaluateResponseBody("", 0) + response = pydevd_base_schema.build_response( + request, kwargs={"body": body, "success": False, "message": "Unable to find thread for evaluation."} + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_setexpression_request(self, py_db, request): + # : :type arguments: SetExpressionArguments + arguments = request.arguments + + thread_id = py_db.suspended_frames_manager.get_thread_id_for_variable_reference(arguments.frameId) + + if thread_id is not None: + self.api.request_set_expression_json(py_db, request, thread_id) + else: + body = SetExpressionResponseBody("") + response = pydevd_base_schema.build_response( + request, kwargs={"body": body, "success": False, "message": "Unable to find thread to set expression."} + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_variables_request(self, py_db, request): + """ + Variables can be asked whenever some place returned a variables reference (so, it + can be a scope gotten from on_scopes_request, the result of some evaluation, etc.). + + Note that in the DAP the variables reference requires a unique int... the way this works for + pydevd is that an instance is generated for that specific variable reference and we use its + id(instance) to identify it to make sure all items are unique (and the actual {id->instance} + is added to a dict which is only valid while the thread is suspended and later cleared when + the related thread resumes execution). + + see: SuspendedFramesManager + + :param VariablesRequest request: + """ + arguments = request.arguments # : :type arguments: VariablesArguments + variables_reference = arguments.variablesReference + + if isinstance(variables_reference, ScopeRequest): + variables_reference = variables_reference.variable_reference + + thread_id = py_db.suspended_frames_manager.get_thread_id_for_variable_reference(variables_reference) + if thread_id is not None: + self.api.request_get_variable_json(py_db, request, thread_id) + else: + variables = [] + body = VariablesResponseBody(variables) + variables_response = pydevd_base_schema.build_response( + request, kwargs={"body": body, "success": False, "message": "Unable to find thread to evaluate variable reference."} + ) + return NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + + def on_setvariable_request(self, py_db, request): + arguments = request.arguments # : :type arguments: SetVariableArguments + variables_reference = arguments.variablesReference + + if isinstance(variables_reference, ScopeRequest): + variables_reference = variables_reference.variable_reference + + if arguments.name.startswith("(return) "): + response = pydevd_base_schema.build_response( + request, kwargs={"body": SetVariableResponseBody(""), "success": False, "message": "Cannot change return value"} + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + thread_id = py_db.suspended_frames_manager.get_thread_id_for_variable_reference(variables_reference) + + if thread_id is not None: + self.api.request_change_variable_json(py_db, request, thread_id) + else: + response = pydevd_base_schema.build_response( + request, + kwargs={ + "body": SetVariableResponseBody(""), + "success": False, + "message": "Unable to find thread to evaluate variable reference.", + }, + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_modules_request(self, py_db, request): + modules_manager = py_db.cmd_factory.modules_manager # : :type modules_manager: ModulesManager + modules_info = modules_manager.get_modules_info() + body = ModulesResponseBody(modules_info) + variables_response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + return NetCommand(CMD_RETURN, 0, variables_response, is_json=True) + + def on_source_request(self, py_db, request): + """ + :param SourceRequest request: + """ + source_reference = request.arguments.sourceReference + server_filename = None + content = None + + if source_reference != 0: + server_filename = pydevd_file_utils.get_server_filename_from_source_reference(source_reference) + if not server_filename: + server_filename = pydevd_file_utils.get_source_reference_filename_from_linecache(source_reference) + + if server_filename: + # Try direct file access first - it's much faster when available. + try: + with open(server_filename, "r") as stream: + content = stream.read() + except: + pass + + if content is None: + # File might not exist at all, or we might not have a permission to read it, + # but it might also be inside a zipfile, or an IPython cell. In this case, + # linecache might still be able to retrieve the source. + lines = (linecache.getline(server_filename, i) for i in itertools.count(1)) + lines = itertools.takewhile(bool, lines) # empty lines are '\n', EOF is '' + + # If we didn't get at least one line back, reset it to None so that it's + # reported as error below, and not as an empty file. + content = "".join(lines) or None + + if content is None: + frame_id = pydevd_file_utils.get_frame_id_from_source_reference(source_reference) + pydev_log.debug("Found frame id: %s for source reference: %s", frame_id, source_reference) + if frame_id is not None: + try: + content = self.api.get_decompiled_source_from_frame_id(py_db, frame_id) + except Exception: + pydev_log.exception("Error getting source for frame id: %s", frame_id) + content = None + + body = SourceResponseBody(content or "") + response_args = {"body": body} + + if content is None: + if source_reference == 0: + message = "Source unavailable" + elif server_filename: + message = "Unable to retrieve source for %s" % (server_filename,) + else: + message = "Invalid sourceReference %d" % (source_reference,) + response_args.update({"success": False, "message": message}) + + response = pydevd_base_schema.build_response(request, kwargs=response_args) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_gototargets_request(self, py_db, request): + path = request.arguments.source.path + line = request.arguments.line + target_id = self._goto_targets_map.obtain_key((path, line)) + target = {"id": target_id, "label": "%s:%s" % (path, line), "line": line} + body = GotoTargetsResponseBody(targets=[target]) + response_args = {"body": body} + response = pydevd_base_schema.build_response(request, kwargs=response_args) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_goto_request(self, py_db, request): + target_id = int(request.arguments.targetId) + thread_id = request.arguments.threadId + try: + path, line = self._goto_targets_map.obtain_value(target_id) + except KeyError: + response = pydevd_base_schema.build_response( + request, + kwargs={ + "body": {}, + "success": False, + "message": "Unknown goto target id: %d" % (target_id,), + }, + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + self.api.request_set_next(py_db, request.seq, thread_id, CMD_SET_NEXT_STATEMENT, path, line, "*") + # See 'NetCommandFactoryJson.make_set_next_stmnt_status_message' for response + return None + + def on_setdebuggerproperty_request(self, py_db, request): + args = request.arguments # : :type args: SetDebuggerPropertyArguments + if args.ideOS is not None: + self.api.set_ide_os(args.ideOS) + + if args.dontTraceStartPatterns is not None and args.dontTraceEndPatterns is not None: + start_patterns = tuple(args.dontTraceStartPatterns) + end_patterns = tuple(args.dontTraceEndPatterns) + self.api.set_dont_trace_start_end_patterns(py_db, start_patterns, end_patterns) + + if args.skipSuspendOnBreakpointException is not None: + py_db.skip_suspend_on_breakpoint_exception = tuple(get_exception_class(x) for x in args.skipSuspendOnBreakpointException) + + if args.skipPrintBreakpointException is not None: + py_db.skip_print_breakpoint_exception = tuple(get_exception_class(x) for x in args.skipPrintBreakpointException) + + if args.multiThreadsSingleNotification is not None: + py_db.multi_threads_single_notification = args.multiThreadsSingleNotification + + # TODO: Support other common settings. Note that not all of these might be relevant to python. + # JustMyCodeStepping: 0 or 1 + # AllowOutOfProcessSymbols: 0 or 1 + # DisableJITOptimization: 0 or 1 + # InterpreterOptions: 0 or 1 + # StopOnExceptionCrossingManagedBoundary: 0 or 1 + # WarnIfNoUserCodeOnLaunch: 0 or 1 + # EnableStepFiltering: true of false + + response = pydevd_base_schema.build_response(request, kwargs={"body": {}}) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_pydevdsysteminfo_request(self, py_db, request): + try: + pid = os.getpid() + except AttributeError: + pid = None + + # It's possible to have the ppid reported from args. In this case, use that instead of the + # real ppid (athough we're using `ppid`, what we want in meaning is the `launcher_pid` -- + # so, if a python process is launched from another python process, consider that process the + # parent and not any intermediary stubs). + + ppid = py_db.get_arg_ppid() or self.api.get_ppid() + + try: + impl_desc = platform.python_implementation() + except AttributeError: + impl_desc = PY_IMPL_NAME + + py_info = pydevd_schema.PydevdPythonInfo( + version=PY_VERSION_STR, + implementation=pydevd_schema.PydevdPythonImplementationInfo( + name=PY_IMPL_NAME, + version=PY_IMPL_VERSION_STR, + description=impl_desc, + ), + ) + platform_info = pydevd_schema.PydevdPlatformInfo(name=sys.platform) + process_info = pydevd_schema.PydevdProcessInfo( + pid=pid, + ppid=ppid, + executable=sys.executable, + bitness=64 if IS_64BIT_PROCESS else 32, + ) + pydevd_info = pydevd_schema.PydevdInfo( + usingCython=USING_CYTHON, + usingFrameEval=USING_FRAME_EVAL, + ) + body = { + "python": py_info, + "platform": platform_info, + "process": process_info, + "pydevd": pydevd_info, + } + response = pydevd_base_schema.build_response(request, kwargs={"body": body}) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + def on_setpydevdsourcemap_request(self, py_db, request): + args = request.arguments # : :type args: SetPydevdSourceMapArguments + SourceMappingEntry = self.api.SourceMappingEntry + + path = args.source.path + source_maps = args.pydevdSourceMaps + # : :type source_map: PydevdSourceMap + new_mappings = [ + SourceMappingEntry( + source_map["line"], + source_map["endLine"], + source_map["runtimeLine"], + self.api.filename_to_str(source_map["runtimeSource"]["path"]), + ) + for source_map in source_maps + ] + + error_msg = self.api.set_source_mapping(py_db, path, new_mappings) + if error_msg: + response = pydevd_base_schema.build_response( + request, + kwargs={ + "body": {}, + "success": False, + "message": error_msg, + }, + ) + return NetCommand(CMD_RETURN, 0, response, is_json=True) + + response = pydevd_base_schema.build_response(request) + return NetCommand(CMD_RETURN, 0, response, is_json=True) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_referrers.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_referrers.py new file mode 100644 index 0000000..9f8a29c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_referrers.py @@ -0,0 +1,252 @@ +import sys +from _pydevd_bundle import pydevd_xml +from os.path import basename +from _pydev_bundle import pydev_log +from urllib.parse import unquote_plus +from _pydevd_bundle.pydevd_constants import IS_PY311_OR_GREATER + + +# =================================================================================================== +# print_var_node +# =================================================================================================== +def print_var_node(xml_node, stream): + name = xml_node.getAttribute("name") + value = xml_node.getAttribute("value") + val_type = xml_node.getAttribute("type") + + found_as = xml_node.getAttribute("found_as") + stream.write("Name: ") + stream.write(unquote_plus(name)) + stream.write(", Value: ") + stream.write(unquote_plus(value)) + stream.write(", Type: ") + stream.write(unquote_plus(val_type)) + if found_as: + stream.write(", Found as: %s" % (unquote_plus(found_as),)) + stream.write("\n") + + +# =================================================================================================== +# print_referrers +# =================================================================================================== +def print_referrers(obj, stream=None): + if stream is None: + stream = sys.stdout + result = get_referrer_info(obj) + from xml.dom.minidom import parseString + + dom = parseString(result) + + xml = dom.getElementsByTagName("xml")[0] + for node in xml.childNodes: + if node.nodeType == node.TEXT_NODE: + continue + + if node.localName == "for": + stream.write("Searching references for: ") + for child in node.childNodes: + if child.nodeType == node.TEXT_NODE: + continue + print_var_node(child, stream) + + elif node.localName == "var": + stream.write("Referrer found: ") + print_var_node(node, stream) + + else: + sys.stderr.write("Unhandled node: %s\n" % (node,)) + + return result + + +# =================================================================================================== +# get_referrer_info +# =================================================================================================== +def get_referrer_info(searched_obj): + DEBUG = 0 + if DEBUG: + sys.stderr.write("Getting referrers info.\n") + try: + try: + if searched_obj is None: + ret = ["\n"] + + ret.append("\n") + ret.append( + pydevd_xml.var_to_xml( + searched_obj, "Skipping getting referrers for None", additional_in_xml=' id="%s"' % (id(searched_obj),) + ) + ) + ret.append("\n") + ret.append("") + ret = "".join(ret) + return ret + + obj_id = id(searched_obj) + + try: + if DEBUG: + sys.stderr.write("Getting referrers...\n") + import gc + + referrers = gc.get_referrers(searched_obj) + except: + pydev_log.exception() + ret = ["\n"] + + ret.append("\n") + ret.append( + pydevd_xml.var_to_xml( + searched_obj, "Exception raised while trying to get_referrers.", additional_in_xml=' id="%s"' % (id(searched_obj),) + ) + ) + ret.append("\n") + ret.append("") + ret = "".join(ret) + return ret + + if DEBUG: + sys.stderr.write("Found %s referrers.\n" % (len(referrers),)) + + curr_frame = sys._getframe() + frame_type = type(curr_frame) + + # Ignore this frame and any caller frame of this frame + + ignore_frames = {} # Should be a set, but it's not available on all python versions. + while curr_frame is not None: + if basename(curr_frame.f_code.co_filename).startswith("pydev"): + ignore_frames[curr_frame] = 1 + curr_frame = curr_frame.f_back + + ret = ["\n"] + + ret.append("\n") + if DEBUG: + sys.stderr.write('Searching Referrers of obj with id="%s"\n' % (obj_id,)) + + ret.append(pydevd_xml.var_to_xml(searched_obj, 'Referrers of obj with id="%s"' % (obj_id,))) + ret.append("\n") + + curr_frame = sys._getframe() + all_objects = None + + for r in referrers: + try: + if r in ignore_frames: + continue # Skip the references we may add ourselves + except: + pass # Ok: unhashable type checked... + + if r is referrers: + continue + + if r is curr_frame.f_locals: + continue + + r_type = type(r) + r_id = str(id(r)) + + representation = str(r_type) + + found_as = "" + if r_type == frame_type: + if DEBUG: + sys.stderr.write("Found frame referrer: %r\n" % (r,)) + for key, val in r.f_locals.items(): + if val is searched_obj: + found_as = key + break + + elif r_type == dict: + if DEBUG: + sys.stderr.write("Found dict referrer: %r\n" % (r,)) + + # Try to check if it's a value in the dict (and under which key it was found) + for key, val in r.items(): + if val is searched_obj: + found_as = key + if DEBUG: + sys.stderr.write(" Found as %r in dict\n" % (found_as,)) + break + + # Ok, there's one annoying thing: many times we find it in a dict from an instance, + # but with this we don't directly have the class, only the dict, so, to workaround that + # we iterate over all reachable objects ad check if one of those has the given dict. + if all_objects is None: + all_objects = gc.get_objects() + + for x in all_objects: + try: + if getattr(x, "__dict__", None) is r: + r = x + r_type = type(x) + r_id = str(id(r)) + representation = str(r_type) + break + except: + pass # Just ignore any error here (i.e.: ReferenceError, etc.) + + elif r_type in (tuple, list): + if DEBUG: + sys.stderr.write("Found tuple referrer: %r\n" % (r,)) + + for i, x in enumerate(r): + if x is searched_obj: + found_as = "%s[%s]" % (r_type.__name__, i) + if DEBUG: + sys.stderr.write(" Found as %s in tuple: \n" % (found_as,)) + break + + elif IS_PY311_OR_GREATER: + # Up to Python 3.10, gc.get_referrers for an instance actually returned the + # object.__dict__, but on Python 3.11 it returns the actual object, so, + # handling is a bit easier (we don't need the workaround from the dict + # case to find the actual instance, we just need to find the attribute name). + if DEBUG: + sys.stderr.write("Found dict referrer: %r\n" % (r,)) + + dct = getattr(r, "__dict__", None) + if dct: + # Try to check if it's a value in the dict (and under which key it was found) + for key, val in dct.items(): + if val is searched_obj: + found_as = key + if DEBUG: + sys.stderr.write(" Found as %r in object instance\n" % (found_as,)) + break + + if found_as: + if not isinstance(found_as, str): + found_as = str(found_as) + found_as = ' found_as="%s"' % (pydevd_xml.make_valid_xml_value(found_as),) + + ret.append(pydevd_xml.var_to_xml(r, representation, additional_in_xml=' id="%s"%s' % (r_id, found_as))) + finally: + if DEBUG: + sys.stderr.write("Done searching for references.\n") + + # If we have any exceptions, don't keep dangling references from this frame to any of our objects. + all_objects = None + referrers = None + searched_obj = None + r = None + x = None + key = None + val = None + curr_frame = None + ignore_frames = None + except: + pydev_log.exception() + ret = ["\n"] + + ret.append("\n") + ret.append(pydevd_xml.var_to_xml(searched_obj, "Error getting referrers for:", additional_in_xml=' id="%s"' % (id(searched_obj),))) + ret.append("\n") + ret.append("") + ret = "".join(ret) + return ret + + ret.append("") + ret = "".join(ret) + return ret diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_reload.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_reload.py new file mode 100644 index 0000000..60131a7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_reload.py @@ -0,0 +1,433 @@ +""" +Based on the python xreload. + +Changes +====================== + +1. we don't recreate the old namespace from new classes. Rather, we keep the existing namespace, +load a new version of it and update only some of the things we can inplace. That way, we don't break +things such as singletons or end up with a second representation of the same class in memory. + +2. If we find it to be a __metaclass__, we try to update it as a regular class. + +3. We don't remove old attributes (and leave them lying around even if they're no longer used). + +4. Reload hooks were changed + +These changes make it more stable, especially in the common case (where in a debug session only the +contents of a function are changed), besides providing flexibility for users that want to extend +on it. + + + +Hooks +====================== + +Classes/modules can be specially crafted to work with the reload (so that it can, for instance, +update some constant which was changed). + +1. To participate in the change of some attribute: + + In a module: + + __xreload_old_new__(namespace, name, old, new) + + in a class: + + @classmethod + __xreload_old_new__(cls, name, old, new) + + A class or module may include a method called '__xreload_old_new__' which is called when we're + unable to reload a given attribute. + + + +2. To do something after the whole reload is finished: + + In a module: + + __xreload_after_reload_update__(namespace): + + In a class: + + @classmethod + __xreload_after_reload_update__(cls): + + + A class or module may include a method called '__xreload_after_reload_update__' which is called + after the reload finishes. + + +Important: when providing a hook, always use the namespace or cls provided and not anything in the global +namespace, as the global namespace are only temporarily created during the reload and may not reflect the +actual application state (while the cls and namespace passed are). + + +Current limitations +====================== + + +- Attributes/constants are added, but not changed (so singletons and the application state is not + broken -- use provided hooks to workaround it). + +- Code using metaclasses may not always work. + +- Functions and methods using decorators (other than classmethod and staticmethod) are not handled + correctly. + +- Renamings are not handled correctly. + +- Dependent modules are not reloaded. + +- New __slots__ can't be added to existing classes. + + +Info +====================== + +Original: http://svn.python.org/projects/sandbox/trunk/xreload/xreload.py +Note: it seems https://github.com/plone/plone.reload/blob/master/plone/reload/xreload.py enhances it (to check later) + +Interesting alternative: https://code.google.com/p/reimport/ + +Alternative to reload(). + +This works by executing the module in a scratch namespace, and then patching classes, methods and +functions in place. This avoids the need to patch instances. New objects are copied into the +target namespace. + +""" + +from _pydev_bundle.pydev_imports import execfile +from _pydevd_bundle import pydevd_dont_trace +import types +from _pydev_bundle import pydev_log +from _pydevd_bundle.pydevd_constants import get_global_debugger + +NO_DEBUG = 0 +LEVEL1 = 1 +LEVEL2 = 2 + +DEBUG = NO_DEBUG + + +def write_err(*args): + py_db = get_global_debugger() + if py_db is not None: + new_lst = [] + for a in args: + new_lst.append(str(a)) + + msg = " ".join(new_lst) + s = "code reload: %s\n" % (msg,) + cmd = py_db.cmd_factory.make_io_message(s, 2) + if py_db.writer is not None: + py_db.writer.add_command(cmd) + + +def notify_info0(*args): + write_err(*args) + + +def notify_info(*args): + if DEBUG >= LEVEL1: + write_err(*args) + + +def notify_info2(*args): + if DEBUG >= LEVEL2: + write_err(*args) + + +def notify_error(*args): + write_err(*args) + + +# ======================================================================================================================= +# code_objects_equal +# ======================================================================================================================= +def code_objects_equal(code0, code1): + for d in dir(code0): + if d.startswith("_") or "line" in d or d in ("replace", "co_positions", "co_qualname"): + continue + if getattr(code0, d) != getattr(code1, d): + return False + return True + + +# ======================================================================================================================= +# xreload +# ======================================================================================================================= +def xreload(mod): + """Reload a module in place, updating classes, methods and functions. + + mod: a module object + + Returns a boolean indicating whether a change was done. + """ + r = Reload(mod) + r.apply() + found_change = r.found_change + r = None + pydevd_dont_trace.clear_trace_filter_cache() + return found_change + + +# This isn't actually used... Initially I planned to reload variables which are immutable on the +# namespace, but this can destroy places where we're saving state, which may not be what we want, +# so, we're being conservative and giving the user hooks if he wants to do a reload. +# +# immutable_types = [int, str, float, tuple] #That should be common to all Python versions +# +# for name in 'long basestr unicode frozenset'.split(): +# try: +# immutable_types.append(__builtins__[name]) +# except: +# pass #Just ignore: not all python versions are created equal. +# immutable_types = tuple(immutable_types) + + +# ======================================================================================================================= +# Reload +# ======================================================================================================================= +class Reload: + def __init__(self, mod, mod_name=None, mod_filename=None): + self.mod = mod + if mod_name: + self.mod_name = mod_name + else: + self.mod_name = mod.__name__ if mod is not None else None + + if mod_filename: + self.mod_filename = mod_filename + else: + self.mod_filename = mod.__file__ if mod is not None else None + + self.found_change = False + + def apply(self): + mod = self.mod + self._on_finish_callbacks = [] + try: + # Get the module namespace (dict) early; this is part of the type check + modns = mod.__dict__ + + # Execute the code. We copy the module dict to a temporary; then + # clear the module dict; then execute the new code in the module + # dict; then swap things back and around. This trick (due to + # Glyph Lefkowitz) ensures that the (readonly) __globals__ + # attribute of methods and functions is set to the correct dict + # object. + new_namespace = modns.copy() + new_namespace.clear() + if self.mod_filename: + new_namespace["__file__"] = self.mod_filename + try: + new_namespace["__builtins__"] = __builtins__ + except NameError: + raise # Ok if not there. + + if self.mod_name: + new_namespace["__name__"] = self.mod_name + if new_namespace["__name__"] == "__main__": + # We do this because usually the __main__ starts-up the program, guarded by + # the if __name__ == '__main__', but we don't want to start the program again + # on a reload. + new_namespace["__name__"] = "__main_reloaded__" + + execfile(self.mod_filename, new_namespace, new_namespace) + # Now we get to the hard part + oldnames = set(modns) + newnames = set(new_namespace) + + # Create new tokens (note: not deleting existing) + for name in newnames - oldnames: + notify_info0("Added:", name, "to namespace") + self.found_change = True + modns[name] = new_namespace[name] + + # Update in-place what we can + for name in oldnames & newnames: + self._update(modns, name, modns[name], new_namespace[name]) + + self._handle_namespace(modns) + + for c in self._on_finish_callbacks: + c() + del self._on_finish_callbacks[:] + except: + pydev_log.exception() + + def _handle_namespace(self, namespace, is_class_namespace=False): + on_finish = None + if is_class_namespace: + xreload_after_update = getattr(namespace, "__xreload_after_reload_update__", None) + if xreload_after_update is not None: + self.found_change = True + on_finish = lambda: xreload_after_update() + + elif "__xreload_after_reload_update__" in namespace: + xreload_after_update = namespace["__xreload_after_reload_update__"] + self.found_change = True + on_finish = lambda: xreload_after_update(namespace) + + if on_finish is not None: + # If a client wants to know about it, give him a chance. + self._on_finish_callbacks.append(on_finish) + + def _update(self, namespace, name, oldobj, newobj, is_class_namespace=False): + """Update oldobj, if possible in place, with newobj. + + If oldobj is immutable, this simply returns newobj. + + Args: + oldobj: the object to be updated + newobj: the object used as the source for the update + """ + try: + notify_info2("Updating: ", oldobj) + if oldobj is newobj: + # Probably something imported + return + + if type(oldobj) is not type(newobj): + # Cop-out: if the type changed, give up + if name not in ("__builtins__",): + notify_error("Type of: %s (old: %s != new: %s) changed... Skipping." % (name, type(oldobj), type(newobj))) + return + + if isinstance(newobj, types.FunctionType): + self._update_function(oldobj, newobj) + return + + if isinstance(newobj, types.MethodType): + self._update_method(oldobj, newobj) + return + + if isinstance(newobj, classmethod): + self._update_classmethod(oldobj, newobj) + return + + if isinstance(newobj, staticmethod): + self._update_staticmethod(oldobj, newobj) + return + + if hasattr(types, "ClassType"): + classtype = (types.ClassType, type) # object is not instance of types.ClassType. + else: + classtype = type + + if isinstance(newobj, classtype): + self._update_class(oldobj, newobj) + return + + # New: dealing with metaclasses. + if hasattr(newobj, "__metaclass__") and hasattr(newobj, "__class__") and newobj.__metaclass__ == newobj.__class__: + self._update_class(oldobj, newobj) + return + + if namespace is not None: + # Check for the `__xreload_old_new__` protocol (don't even compare things + # as even doing a comparison may break things -- see: https://github.com/microsoft/debugpy/issues/615). + xreload_old_new = None + if is_class_namespace: + xreload_old_new = getattr(namespace, "__xreload_old_new__", None) + if xreload_old_new is not None: + self.found_change = True + xreload_old_new(name, oldobj, newobj) + + elif "__xreload_old_new__" in namespace: + xreload_old_new = namespace["__xreload_old_new__"] + xreload_old_new(namespace, name, oldobj, newobj) + self.found_change = True + + # Too much information to the user... + # else: + # notify_info0('%s NOT updated. Create __xreload_old_new__(name, old, new) for custom reload' % (name,)) + + except: + notify_error("Exception found when updating %s. Proceeding for other items." % (name,)) + pydev_log.exception() + + # All of the following functions have the same signature as _update() + + def _update_function(self, oldfunc, newfunc): + """Update a function object.""" + oldfunc.__doc__ = newfunc.__doc__ + oldfunc.__dict__.update(newfunc.__dict__) + + try: + newfunc.__code__ + attr_name = "__code__" + except AttributeError: + newfunc.func_code + attr_name = "func_code" + + old_code = getattr(oldfunc, attr_name) + new_code = getattr(newfunc, attr_name) + if not code_objects_equal(old_code, new_code): + notify_info0("Updated function code:", oldfunc) + setattr(oldfunc, attr_name, new_code) + self.found_change = True + + try: + oldfunc.__defaults__ = newfunc.__defaults__ + except AttributeError: + oldfunc.func_defaults = newfunc.func_defaults + + return oldfunc + + def _update_method(self, oldmeth, newmeth): + """Update a method object.""" + # XXX What if im_func is not a function? + if hasattr(oldmeth, "im_func") and hasattr(newmeth, "im_func"): + self._update(None, None, oldmeth.im_func, newmeth.im_func) + elif hasattr(oldmeth, "__func__") and hasattr(newmeth, "__func__"): + self._update(None, None, oldmeth.__func__, newmeth.__func__) + return oldmeth + + def _update_class(self, oldclass, newclass): + """Update a class object.""" + olddict = oldclass.__dict__ + newdict = newclass.__dict__ + + oldnames = set(olddict) + newnames = set(newdict) + + for name in newnames - oldnames: + setattr(oldclass, name, newdict[name]) + notify_info0("Added:", name, "to", oldclass) + self.found_change = True + + # Note: not removing old things... + # for name in oldnames - newnames: + # notify_info('Removed:', name, 'from', oldclass) + # delattr(oldclass, name) + + for name in (oldnames & newnames) - set(["__dict__", "__doc__"]): + self._update(oldclass, name, olddict[name], newdict[name], is_class_namespace=True) + + old_bases = getattr(oldclass, "__bases__", None) + new_bases = getattr(newclass, "__bases__", None) + if str(old_bases) != str(new_bases): + notify_error("Changing the hierarchy of a class is not supported. %s may be inconsistent." % (oldclass,)) + + self._handle_namespace(oldclass, is_class_namespace=True) + + def _update_classmethod(self, oldcm, newcm): + """Update a classmethod update.""" + # While we can't modify the classmethod object itself (it has no + # mutable attributes), we *can* extract the underlying function + # (by calling __get__(), which returns a method object) and update + # it in-place. We don't have the class available to pass to + # __get__() but any object except None will do. + self._update(None, None, oldcm.__get__(0), newcm.__get__(0)) + + def _update_staticmethod(self, oldsm, newsm): + """Update a staticmethod update.""" + # While we can't modify the staticmethod object itself (it has no + # mutable attributes), we *can* extract the underlying function + # (by calling __get__(), which returns it) and update it in-place. + # We don't have the class available to pass to __get__() but any + # object except None will do. + self._update(None, None, oldsm.__get__(0), newsm.__get__(0)) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py new file mode 100644 index 0000000..20a7351 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py @@ -0,0 +1,830 @@ +from _pydev_bundle import pydev_log +from _pydevd_bundle.pydevd_utils import hasattr_checked, DAPGrouper, Timer +from io import StringIO +import traceback +from os.path import basename + +from functools import partial +from _pydevd_bundle.pydevd_constants import ( + IS_PY36_OR_GREATER, + MethodWrapperType, + RETURN_VALUES_DICT, + DebugInfoHolder, + IS_PYPY, + GENERATED_LEN_ATTR_NAME, +) +from _pydevd_bundle.pydevd_safe_repr import SafeRepr +from _pydevd_bundle import pydevd_constants + +TOO_LARGE_MSG = "Maximum number of items (%s) reached. To show more items customize the value of the PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS environment variable." +TOO_LARGE_ATTR = "Unable to handle:" + + +# ======================================================================================================================= +# UnableToResolveVariableException +# ======================================================================================================================= +class UnableToResolveVariableException(Exception): + pass + + +try: + from collections import OrderedDict +except: + OrderedDict = dict + +try: + import java.lang # @UnresolvedImport +except: + pass + +# ======================================================================================================================= +# See: pydevd_extension_api module for resolver interface +# ======================================================================================================================= + + +def sorted_attributes_key(attr_name): + if attr_name.startswith("__"): + if attr_name.endswith("__"): + # __ double under before and after __ + return (3, attr_name) + else: + # __ double under before + return (2, attr_name) + elif attr_name.startswith("_"): + # _ single under + return (1, attr_name) + else: + # Regular (Before anything) + return (0, attr_name) + + +# ======================================================================================================================= +# DefaultResolver +# ======================================================================================================================= +class DefaultResolver: + """ + DefaultResolver is the class that'll actually resolve how to show some variable. + """ + + def resolve(self, var, attribute): + return getattr(var, attribute) + + def get_contents_debug_adapter_protocol(self, obj, fmt=None): + if MethodWrapperType: + dct, used___dict__ = self._get_py_dictionary(obj) + else: + dct = self._get_jy_dictionary(obj)[0] + + lst = sorted(dct.items(), key=lambda tup: sorted_attributes_key(tup[0])) + if used___dict__: + eval_name = ".__dict__[%s]" + else: + eval_name = ".%s" + + ret = [] + for attr_name, attr_value in lst: + entry = (attr_name, attr_value, eval_name % attr_name) + ret.append(entry) + + return ret + + def get_dictionary(self, var, names=None, used___dict__=False): + if MethodWrapperType: + return self._get_py_dictionary(var, names, used___dict__=used___dict__)[0] + else: + return self._get_jy_dictionary(var)[0] + + def _get_jy_dictionary(self, obj): + ret = {} + found = java.util.HashMap() + + original = obj + if hasattr_checked(obj, "__class__") and obj.__class__ == java.lang.Class: + # get info about superclasses + classes = [] + classes.append(obj) + c = obj.getSuperclass() + while c != None: + classes.append(c) + c = c.getSuperclass() + + # get info about interfaces + interfs = [] + for obj in classes: + interfs.extend(obj.getInterfaces()) + classes.extend(interfs) + + # now is the time when we actually get info on the declared methods and fields + for obj in classes: + declaredMethods = obj.getDeclaredMethods() + declaredFields = obj.getDeclaredFields() + for i in range(len(declaredMethods)): + name = declaredMethods[i].getName() + ret[name] = declaredMethods[i].toString() + found.put(name, 1) + + for i in range(len(declaredFields)): + name = declaredFields[i].getName() + found.put(name, 1) + # if declaredFields[i].isAccessible(): + declaredFields[i].setAccessible(True) + # ret[name] = declaredFields[i].get( declaredFields[i] ) + try: + ret[name] = declaredFields[i].get(original) + except: + ret[name] = declaredFields[i].toString() + + # this simple dir does not always get all the info, that's why we have the part before + # (e.g.: if we do a dir on String, some methods that are from other interfaces such as + # charAt don't appear) + try: + d = dir(original) + for name in d: + if found.get(name) != 1: + ret[name] = getattr(original, name) + except: + # sometimes we're unable to do a dir + pass + + return ret + + def get_names(self, var): + used___dict__ = False + try: + names = dir(var) + except Exception: + names = [] + if not names: + if hasattr_checked(var, "__dict__"): + names = list(var.__dict__) + used___dict__ = True + return names, used___dict__ + + def _get_py_dictionary(self, var, names=None, used___dict__=False): + """ + :return tuple(names, used___dict__), where used___dict__ means we have to access + using obj.__dict__[name] instead of getattr(obj, name) + """ + + # On PyPy we never show functions. This is because of a corner case where PyPy becomes + # absurdly slow -- it takes almost half a second to introspect a single numpy function (so, + # the related test, "test_case_16_resolve_numpy_array", times out... this probably isn't + # specific to numpy, but to any library where the CPython bridge is used, but as we + # can't be sure in the debugger, we play it safe and don't show it at all). + filter_function = IS_PYPY + + if not names: + names, used___dict__ = self.get_names(var) + d = {} + + # Be aware that the order in which the filters are applied attempts to + # optimize the operation by removing as many items as possible in the + # first filters, leaving fewer items for later filters + + timer = Timer() + cls = type(var) + for name in names: + try: + name_as_str = name + if name_as_str.__class__ != str: + name_as_str = "%r" % (name_as_str,) + + if not used___dict__: + attr = getattr(var, name) + else: + attr = var.__dict__[name] + + # filter functions? + if filter_function: + if inspect.isroutine(attr) or isinstance(attr, MethodWrapperType): + continue + except: + # if some error occurs getting it, let's put it to the user. + strIO = StringIO() + traceback.print_exc(file=strIO) + attr = strIO.getvalue() + + finally: + timer.report_if_getting_attr_slow(cls, name_as_str) + + d[name_as_str] = attr + + return d, used___dict__ + + +class DAPGrouperResolver: + def get_contents_debug_adapter_protocol(self, obj, fmt=None): + return obj.get_contents_debug_adapter_protocol() + + +_basic_immutable_types = (int, float, complex, str, bytes, type(None), bool, frozenset) + + +def _does_obj_repr_evaluate_to_obj(obj): + """ + If obj is an object where evaluating its representation leads to + the same object, return True, otherwise, return False. + """ + try: + if isinstance(obj, tuple): + for o in obj: + if not _does_obj_repr_evaluate_to_obj(o): + return False + return True + else: + return isinstance(obj, _basic_immutable_types) + except: + return False + + +# ======================================================================================================================= +# DictResolver +# ======================================================================================================================= +class DictResolver: + sort_keys = not IS_PY36_OR_GREATER + + def resolve(self, dct, key): + if key in (GENERATED_LEN_ATTR_NAME, TOO_LARGE_ATTR): + return None + + if "(" not in key: + # we have to treat that because the dict resolver is also used to directly resolve the global and local + # scopes (which already have the items directly) + try: + return dct[key] + except: + return getattr(dct, key) + + # ok, we have to iterate over the items to find the one that matches the id, because that's the only way + # to actually find the reference from the string we have before. + expected_id = int(key.split("(")[-1][:-1]) + for key, val in dct.items(): + if id(key) == expected_id: + return val + + raise UnableToResolveVariableException() + + def key_to_str(self, key, fmt=None): + if fmt is not None: + if fmt.get("hex", False): + safe_repr = SafeRepr() + safe_repr.convert_to_hex = True + return safe_repr(key) + return "%r" % (key,) + + def init_dict(self): + return {} + + def get_contents_debug_adapter_protocol(self, dct, fmt=None): + """ + This method is to be used in the case where the variables are all saved by its id (and as + such don't need to have the `resolve` method called later on, so, keys don't need to + embed the reference in the key). + + Note that the return should be ordered. + + :return list(tuple(name:str, value:object, evaluateName:str)) + """ + ret = [] + + i = 0 + + found_representations = set() + + for key, val in dct.items(): + i += 1 + key_as_str = self.key_to_str(key, fmt) + + if key_as_str not in found_representations: + found_representations.add(key_as_str) + else: + # If the key would be a duplicate, add the key id (otherwise + # VSCode won't show all keys correctly). + # See: https://github.com/microsoft/debugpy/issues/148 + key_as_str = "%s (id: %s)" % (key_as_str, id(key)) + found_representations.add(key_as_str) + + if _does_obj_repr_evaluate_to_obj(key): + s = self.key_to_str(key) # do not format the key + eval_key_str = "[%s]" % (s,) + else: + eval_key_str = None + ret.append((key_as_str, val, eval_key_str)) + if i >= pydevd_constants.PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS: + ret.append((TOO_LARGE_ATTR, TOO_LARGE_MSG % (pydevd_constants.PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS,), None)) + break + + # in case the class extends built-in type and has some additional fields + from_default_resolver = defaultResolver.get_contents_debug_adapter_protocol(dct, fmt) + + if from_default_resolver: + ret = from_default_resolver + ret + + if self.sort_keys: + ret = sorted(ret, key=lambda tup: sorted_attributes_key(tup[0])) + + ret.append((GENERATED_LEN_ATTR_NAME, len(dct), partial(_apply_evaluate_name, evaluate_name="len(%s)"))) + return ret + + def get_dictionary(self, dct): + ret = self.init_dict() + + i = 0 + for key, val in dct.items(): + i += 1 + # we need to add the id because otherwise we cannot find the real object to get its contents later on. + key = "%s (%s)" % (self.key_to_str(key), id(key)) + ret[key] = val + if i >= pydevd_constants.PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS: + ret[TOO_LARGE_ATTR] = TOO_LARGE_MSG % (pydevd_constants.PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS,) + break + + # in case if the class extends built-in type and has some additional fields + additional_fields = defaultResolver.get_dictionary(dct) + ret.update(additional_fields) + ret[GENERATED_LEN_ATTR_NAME] = len(dct) + return ret + + +def _apply_evaluate_name(parent_name, evaluate_name): + return evaluate_name % (parent_name,) + + +class MoreItemsRange: + def __init__(self, value, from_i, to_i): + self.value = value + self.from_i = from_i + self.to_i = to_i + + def get_contents_debug_adapter_protocol(self, _self, fmt=None): + l = len(self.value) + ret = [] + + format_str = "%0" + str(int(len(str(l - 1)))) + "d" + if fmt is not None and fmt.get("hex", False): + format_str = "0x%0" + str(int(len(hex(l).lstrip("0x")))) + "x" + + for i, item in enumerate(self.value[self.from_i : self.to_i]): + i += self.from_i + ret.append((format_str % i, item, "[%s]" % i)) + return ret + + def get_dictionary(self, _self, fmt=None): + dct = {} + for key, obj, _ in self.get_contents_debug_adapter_protocol(self, fmt): + dct[key] = obj + return dct + + def resolve(self, attribute): + """ + :param var: that's the original object we're dealing with. + :param attribute: that's the key to resolve + -- either the dict key in get_dictionary or the name in the dap protocol. + """ + return self.value[int(attribute)] + + def __eq__(self, o): + return isinstance(o, MoreItemsRange) and self.value is o.value and self.from_i == o.from_i and self.to_i == o.to_i + + def __str__(self): + return "[%s:%s]" % (self.from_i, self.to_i) + + __repr__ = __str__ + + +class MoreItems: + def __init__(self, value, handled_items): + self.value = value + self.handled_items = handled_items + + def get_contents_debug_adapter_protocol(self, _self, fmt=None): + total_items = len(self.value) + remaining = total_items - self.handled_items + bucket_size = pydevd_constants.PYDEVD_CONTAINER_BUCKET_SIZE + + from_i = self.handled_items + to_i = from_i + min(bucket_size, remaining) + + ret = [] + while remaining > 0: + remaining -= bucket_size + more_items_range = MoreItemsRange(self.value, from_i, to_i) + ret.append((str(more_items_range), more_items_range, None)) + + from_i = to_i + to_i = from_i + min(bucket_size, remaining) + + return ret + + def get_dictionary(self, _self, fmt=None): + dct = {} + for key, obj, _ in self.get_contents_debug_adapter_protocol(self, fmt): + dct[key] = obj + return dct + + def resolve(self, attribute): + from_i, to_i = attribute[1:-1].split(":") + from_i = int(from_i) + to_i = int(to_i) + return MoreItemsRange(self.value, from_i, to_i) + + def __eq__(self, o): + return isinstance(o, MoreItems) and self.value is o.value + + def __str__(self): + return "..." + + __repr__ = __str__ + + +class ForwardInternalResolverToObject: + """ + To be used when we provide some internal object that'll actually do the resolution. + """ + + def get_contents_debug_adapter_protocol(self, obj, fmt=None): + return obj.get_contents_debug_adapter_protocol(fmt) + + def get_dictionary(self, var, fmt={}): + return var.get_dictionary(var, fmt) + + def resolve(self, var, attribute): + return var.resolve(attribute) + + +class TupleResolver: # to enumerate tuples and lists + def resolve(self, var, attribute): + """ + :param var: that's the original object we're dealing with. + :param attribute: that's the key to resolve + -- either the dict key in get_dictionary or the name in the dap protocol. + """ + if attribute in (GENERATED_LEN_ATTR_NAME, TOO_LARGE_ATTR): + return None + try: + return var[int(attribute)] + except: + if attribute == "more": + return MoreItems(var, pydevd_constants.PYDEVD_CONTAINER_INITIAL_EXPANDED_ITEMS) + + return getattr(var, attribute) + + def get_contents_debug_adapter_protocol(self, lst, fmt=None): + """ + This method is to be used in the case where the variables are all saved by its id (and as + such don't need to have the `resolve` method called later on, so, keys don't need to + embed the reference in the key). + + Note that the return should be ordered. + + :return list(tuple(name:str, value:object, evaluateName:str)) + """ + lst_len = len(lst) + ret = [] + + format_str = "%0" + str(int(len(str(lst_len - 1)))) + "d" + if fmt is not None and fmt.get("hex", False): + format_str = "0x%0" + str(int(len(hex(lst_len).lstrip("0x")))) + "x" + + initial_expanded = pydevd_constants.PYDEVD_CONTAINER_INITIAL_EXPANDED_ITEMS + for i, item in enumerate(lst): + ret.append((format_str % i, item, "[%s]" % i)) + + if i >= initial_expanded - 1: + if (lst_len - initial_expanded) < pydevd_constants.PYDEVD_CONTAINER_BUCKET_SIZE: + # Special case: if we have just 1 more bucket just put it inline. + item = MoreItemsRange(lst, initial_expanded, lst_len) + + else: + # Multiple buckets + item = MoreItems(lst, initial_expanded) + ret.append(("more", item, None)) + break + + # Needed in case the class extends the built-in type and has some additional fields. + from_default_resolver = defaultResolver.get_contents_debug_adapter_protocol(lst, fmt=fmt) + if from_default_resolver: + ret = from_default_resolver + ret + + ret.append((GENERATED_LEN_ATTR_NAME, len(lst), partial(_apply_evaluate_name, evaluate_name="len(%s)"))) + return ret + + def get_dictionary(self, var, fmt={}): + l = len(var) + d = {} + + format_str = "%0" + str(int(len(str(l - 1)))) + "d" + if fmt is not None and fmt.get("hex", False): + format_str = "0x%0" + str(int(len(hex(l).lstrip("0x")))) + "x" + + initial_expanded = pydevd_constants.PYDEVD_CONTAINER_INITIAL_EXPANDED_ITEMS + for i, item in enumerate(var): + d[format_str % i] = item + + if i >= initial_expanded - 1: + item = MoreItems(var, initial_expanded) + d["more"] = item + break + + # in case if the class extends built-in type and has some additional fields + additional_fields = defaultResolver.get_dictionary(var) + d.update(additional_fields) + d[GENERATED_LEN_ATTR_NAME] = len(var) + return d + + +# ======================================================================================================================= +# SetResolver +# ======================================================================================================================= +class SetResolver: + """ + Resolves a set as dict id(object)->object + """ + + def get_contents_debug_adapter_protocol(self, obj, fmt=None): + ret = [] + + for i, item in enumerate(obj): + ret.append((str(id(item)), item, None)) + + if i >= pydevd_constants.PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS: + ret.append((TOO_LARGE_ATTR, TOO_LARGE_MSG % (pydevd_constants.PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS,), None)) + break + + # Needed in case the class extends the built-in type and has some additional fields. + from_default_resolver = defaultResolver.get_contents_debug_adapter_protocol(obj, fmt=fmt) + if from_default_resolver: + ret = from_default_resolver + ret + ret.append((GENERATED_LEN_ATTR_NAME, len(obj), partial(_apply_evaluate_name, evaluate_name="len(%s)"))) + return ret + + def resolve(self, var, attribute): + if attribute in (GENERATED_LEN_ATTR_NAME, TOO_LARGE_ATTR): + return None + + try: + attribute = int(attribute) + except: + return getattr(var, attribute) + + for v in var: + if id(v) == attribute: + return v + + raise UnableToResolveVariableException("Unable to resolve %s in %s" % (attribute, var)) + + def get_dictionary(self, var): + d = {} + for i, item in enumerate(var): + d[str(id(item))] = item + + if i >= pydevd_constants.PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS: + d[TOO_LARGE_ATTR] = TOO_LARGE_MSG % (pydevd_constants.PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS,) + break + + # in case if the class extends built-in type and has some additional fields + additional_fields = defaultResolver.get_dictionary(var) + d.update(additional_fields) + d[GENERATED_LEN_ATTR_NAME] = len(var) + return d + + def change_var_from_name(self, container, name, new_value): + # The name given in this case must be the id(item), so, we can actually + # iterate in the set and see which item matches the given id. + + try: + # Check that the new value can actually be added to a set (i.e.: it's hashable/comparable). + set().add(new_value) + except: + return None + + for item in container: + if str(id(item)) == name: + container.remove(item) + container.add(new_value) + return str(id(new_value)) + + return None + + +# ======================================================================================================================= +# InstanceResolver +# ======================================================================================================================= +class InstanceResolver: + def resolve(self, var, attribute): + field = var.__class__.getDeclaredField(attribute) + field.setAccessible(True) + return field.get(var) + + def get_dictionary(self, obj): + ret = {} + + declaredFields = obj.__class__.getDeclaredFields() + for i in range(len(declaredFields)): + name = declaredFields[i].getName() + try: + declaredFields[i].setAccessible(True) + ret[name] = declaredFields[i].get(obj) + except: + pydev_log.exception() + + return ret + + +# ======================================================================================================================= +# JyArrayResolver +# ======================================================================================================================= +class JyArrayResolver: + """ + This resolves a regular Object[] array from java + """ + + def resolve(self, var, attribute): + if attribute == GENERATED_LEN_ATTR_NAME: + return None + return var[int(attribute)] + + def get_dictionary(self, obj): + ret = {} + + for i in range(len(obj)): + ret[i] = obj[i] + + ret[GENERATED_LEN_ATTR_NAME] = len(obj) + return ret + + +# ======================================================================================================================= +# MultiValueDictResolver +# ======================================================================================================================= +class MultiValueDictResolver(DictResolver): + def resolve(self, dct, key): + if key in (GENERATED_LEN_ATTR_NAME, TOO_LARGE_ATTR): + return None + + # ok, we have to iterate over the items to find the one that matches the id, because that's the only way + # to actually find the reference from the string we have before. + expected_id = int(key.split("(")[-1][:-1]) + for key in list(dct.keys()): + val = dct.getlist(key) + if id(key) == expected_id: + return val + + raise UnableToResolveVariableException() + + +# ======================================================================================================================= +# DjangoFormResolver +# ======================================================================================================================= +class DjangoFormResolver(DefaultResolver): + def get_dictionary(self, var, names=None): + # Do not call self.errors because it is a property and has side effects. + names, used___dict__ = self.get_names(var) + + has_errors_attr = False + if "errors" in names: + has_errors_attr = True + names.remove("errors") + + d = defaultResolver.get_dictionary(var, names=names, used___dict__=used___dict__) + if has_errors_attr: + try: + errors_attr = getattr(var, "_errors") + except: + errors_attr = None + d["errors"] = errors_attr + return d + + +# ======================================================================================================================= +# DequeResolver +# ======================================================================================================================= +class DequeResolver(TupleResolver): + def get_dictionary(self, var): + d = TupleResolver.get_dictionary(self, var) + d["maxlen"] = getattr(var, "maxlen", None) + return d + + +# ======================================================================================================================= +# OrderedDictResolver +# ======================================================================================================================= +class OrderedDictResolver(DictResolver): + sort_keys = False + + def init_dict(self): + return OrderedDict() + + +# ======================================================================================================================= +# FrameResolver +# ======================================================================================================================= +class FrameResolver: + """ + This resolves a frame. + """ + + def resolve(self, obj, attribute): + if attribute == "__internals__": + return defaultResolver.get_dictionary(obj) + + if attribute == "stack": + return self.get_frame_stack(obj) + + if attribute == "f_locals": + return obj.f_locals + + return None + + def get_dictionary(self, obj): + ret = {} + ret["__internals__"] = defaultResolver.get_dictionary(obj) + ret["stack"] = self.get_frame_stack(obj) + ret["f_locals"] = obj.f_locals + return ret + + def get_frame_stack(self, frame): + ret = [] + if frame is not None: + ret.append(self.get_frame_name(frame)) + + while frame.f_back: + frame = frame.f_back + ret.append(self.get_frame_name(frame)) + + return ret + + def get_frame_name(self, frame): + if frame is None: + return "None" + try: + name = basename(frame.f_code.co_filename) + return "frame: %s [%s:%s] id:%s" % (frame.f_code.co_name, name, frame.f_lineno, id(frame)) + except: + return "frame object" + + +defaultResolver = DefaultResolver() +dictResolver = DictResolver() +tupleResolver = TupleResolver() +instanceResolver = InstanceResolver() +jyArrayResolver = JyArrayResolver() +setResolver = SetResolver() +multiValueDictResolver = MultiValueDictResolver() +djangoFormResolver = DjangoFormResolver() +dequeResolver = DequeResolver() +orderedDictResolver = OrderedDictResolver() +frameResolver = FrameResolver() +dapGrouperResolver = DAPGrouperResolver() +forwardInternalResolverToObject = ForwardInternalResolverToObject() + + +class InspectStub: + def isbuiltin(self, _args): + return False + + def isroutine(self, object): + return False + + +try: + import inspect +except: + inspect = InspectStub() + + +def get_var_scope(attr_name, attr_value, evaluate_name, handle_return_values): + if attr_name.startswith("'"): + if attr_name.endswith("'"): + # i.e.: strings denote that it is a regular value in some container. + return "" + else: + i = attr_name.find("__' (") + if i >= 0: + # Handle attr_name such as: >>'__name__' (1732494379184)<< + attr_name = attr_name[1 : i + 2] + + if handle_return_values and attr_name == RETURN_VALUES_DICT: + return "" + + elif attr_name == GENERATED_LEN_ATTR_NAME: + return "" + + if attr_name.startswith("__") and attr_name.endswith("__"): + return DAPGrouper.SCOPE_SPECIAL_VARS + + if attr_name.startswith("_") or attr_name.endswith("__"): + return DAPGrouper.SCOPE_PROTECTED_VARS + + try: + if inspect.isroutine(attr_value) or isinstance(attr_value, MethodWrapperType): + return DAPGrouper.SCOPE_FUNCTION_VARS + + elif inspect.isclass(attr_value): + return DAPGrouper.SCOPE_CLASS_VARS + except: + # It's possible that isinstance throws an exception when dealing with user-code. + if DebugInfoHolder.DEBUG_TRACE_LEVEL > 0: + pydev_log.exception() + + return "" diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py new file mode 100644 index 0000000..ba8f7af --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py @@ -0,0 +1,339 @@ +""" +Vendored copy of runpy from the standard library. + +It's vendored so that we can properly ignore it when used to start user code +while still making it possible for the user to debug runpy itself. + +runpy.py - locating and running Python code using the module namespace + +Provides support for locating and running Python scripts using the Python +module namespace instead of the native filesystem. + +This allows Python code to play nicely with non-filesystem based PEP 302 +importers when locating support scripts as well as when importing modules. +""" +# Written by Nick Coghlan +# to implement PEP 338 (Executing Modules as Scripts) + +import sys +import importlib.machinery # importlib first so we can test #15386 via -m +import importlib.util +import io +import types +import os + +__all__ = [ + "run_module", + "run_path", +] + + +# Note: fabioz: Don't use pkgutil (when handling caught exceptions we could end up +# showing exceptions in pkgutil.get_imported (specifically the KeyError), so, +# create a copy of the function we need to properly ignore this exception when +# running the program. +def pkgutil_get_importer(path_item): + """Retrieve a finder for the given path item + + The returned finder is cached in sys.path_importer_cache + if it was newly created by a path hook. + + The cache (or part of it) can be cleared manually if a + rescan of sys.path_hooks is necessary. + """ + try: + importer = sys.path_importer_cache[path_item] + except KeyError: + for path_hook in sys.path_hooks: + try: + importer = path_hook(path_item) + sys.path_importer_cache.setdefault(path_item, importer) + break + except ImportError: + pass + else: + importer = None + return importer + + +class _TempModule(object): + """Temporarily replace a module in sys.modules with an empty namespace""" + + def __init__(self, mod_name): + self.mod_name = mod_name + self.module = types.ModuleType(mod_name) + self._saved_module = [] + + def __enter__(self): + mod_name = self.mod_name + try: + self._saved_module.append(sys.modules[mod_name]) + except KeyError: + pass + sys.modules[mod_name] = self.module + return self + + def __exit__(self, *args): + if self._saved_module: + sys.modules[self.mod_name] = self._saved_module[0] + else: + del sys.modules[self.mod_name] + self._saved_module = [] + + +class _ModifiedArgv0(object): + def __init__(self, value): + self.value = value + self._saved_value = self._sentinel = object() + + def __enter__(self): + if self._saved_value is not self._sentinel: + raise RuntimeError("Already preserving saved value") + self._saved_value = sys.argv[0] + sys.argv[0] = self.value + + def __exit__(self, *args): + self.value = self._sentinel + sys.argv[0] = self._saved_value + + +# TODO: Replace these helpers with importlib._bootstrap_external functions. +def _run_code(code, run_globals, init_globals=None, mod_name=None, mod_spec=None, pkg_name=None, script_name=None): + """Helper to run code in nominated namespace""" + if init_globals is not None: + run_globals.update(init_globals) + if mod_spec is None: + loader = None + fname = script_name + cached = None + else: + loader = mod_spec.loader + fname = mod_spec.origin + cached = mod_spec.cached + if pkg_name is None: + pkg_name = mod_spec.parent + run_globals.update( + __name__=mod_name, __file__=fname, __cached__=cached, __doc__=None, __loader__=loader, __package__=pkg_name, __spec__=mod_spec + ) + exec(code, run_globals) + return run_globals + + +def _run_module_code(code, init_globals=None, mod_name=None, mod_spec=None, pkg_name=None, script_name=None): + """Helper to run code in new namespace with sys modified""" + fname = script_name if mod_spec is None else mod_spec.origin + with _TempModule(mod_name) as temp_module, _ModifiedArgv0(fname): + mod_globals = temp_module.module.__dict__ + _run_code(code, mod_globals, init_globals, mod_name, mod_spec, pkg_name, script_name) + # Copy the globals of the temporary module, as they + # may be cleared when the temporary module goes away + return mod_globals.copy() + + +# Helper to get the full name, spec and code for a module +def _get_module_details(mod_name, error=ImportError): + if mod_name.startswith("."): + raise error("Relative module names not supported") + pkg_name, _, _ = mod_name.rpartition(".") + if pkg_name: + # Try importing the parent to avoid catching initialization errors + try: + __import__(pkg_name) + except ImportError as e: + # If the parent or higher ancestor package is missing, let the + # error be raised by find_spec() below and then be caught. But do + # not allow other errors to be caught. + if e.name is None or (e.name != pkg_name and not pkg_name.startswith(e.name + ".")): + raise + # Warn if the module has already been imported under its normal name + existing = sys.modules.get(mod_name) + if existing is not None and not hasattr(existing, "__path__"): + from warnings import warn + + msg = ( + "{mod_name!r} found in sys.modules after import of " + "package {pkg_name!r}, but prior to execution of " + "{mod_name!r}; this may result in unpredictable " + "behaviour".format(mod_name=mod_name, pkg_name=pkg_name) + ) + warn(RuntimeWarning(msg)) + + try: + spec = importlib.util.find_spec(mod_name) + except (ImportError, AttributeError, TypeError, ValueError) as ex: + # This hack fixes an impedance mismatch between pkgutil and + # importlib, where the latter raises other errors for cases where + # pkgutil previously raised ImportError + msg = "Error while finding module specification for {!r} ({}: {})" + if mod_name.endswith(".py"): + msg += f". Try using '{mod_name[:-3]}' instead of " f"'{mod_name}' as the module name." + raise error(msg.format(mod_name, type(ex).__name__, ex)) from ex + if spec is None: + raise error("No module named %s" % mod_name) + if spec.submodule_search_locations is not None: + if mod_name == "__main__" or mod_name.endswith(".__main__"): + raise error("Cannot use package as __main__ module") + try: + pkg_main_name = mod_name + ".__main__" + return _get_module_details(pkg_main_name, error) + except error as e: + if mod_name not in sys.modules: + raise # No module loaded; being a package is irrelevant + raise error(("%s; %r is a package and cannot " + "be directly executed") % (e, mod_name)) + loader = spec.loader + if loader is None: + raise error("%r is a namespace package and cannot be executed" % mod_name) + try: + code = loader.get_code(mod_name) + except ImportError as e: + raise error(format(e)) from e + if code is None: + raise error("No code object available for %s" % mod_name) + return mod_name, spec, code + + +class _Error(Exception): + """Error that _run_module_as_main() should report without a traceback""" + + +# XXX ncoghlan: Should this be documented and made public? +# (Current thoughts: don't repeat the mistake that lead to its +# creation when run_module() no longer met the needs of +# mainmodule.c, but couldn't be changed because it was public) +def _run_module_as_main(mod_name, alter_argv=True): + """Runs the designated module in the __main__ namespace + + Note that the executed module will have full access to the + __main__ namespace. If this is not desirable, the run_module() + function should be used to run the module code in a fresh namespace. + + At the very least, these variables in __main__ will be overwritten: + __name__ + __file__ + __cached__ + __loader__ + __package__ + """ + try: + if alter_argv or mod_name != "__main__": # i.e. -m switch + mod_name, mod_spec, code = _get_module_details(mod_name, _Error) + else: # i.e. directory or zipfile execution + mod_name, mod_spec, code = _get_main_module_details(_Error) + except _Error as exc: + msg = "%s: %s" % (sys.executable, exc) + sys.exit(msg) + main_globals = sys.modules["__main__"].__dict__ + if alter_argv: + sys.argv[0] = mod_spec.origin + return _run_code(code, main_globals, None, "__main__", mod_spec) + + +def run_module(mod_name, init_globals=None, run_name=None, alter_sys=False): + """Execute a module's code without importing it + + Returns the resulting top level namespace dictionary + """ + mod_name, mod_spec, code = _get_module_details(mod_name) + if run_name is None: + run_name = mod_name + if alter_sys: + return _run_module_code(code, init_globals, run_name, mod_spec) + else: + # Leave the sys module alone + return _run_code(code, {}, init_globals, run_name, mod_spec) + + +def _get_main_module_details(error=ImportError): + # Helper that gives a nicer error message when attempting to + # execute a zipfile or directory by invoking __main__.py + # Also moves the standard __main__ out of the way so that the + # preexisting __loader__ entry doesn't cause issues + main_name = "__main__" + saved_main = sys.modules[main_name] + del sys.modules[main_name] + try: + return _get_module_details(main_name) + except ImportError as exc: + if main_name in str(exc): + raise error("can't find %r module in %r" % (main_name, sys.path[0])) from exc + raise + finally: + sys.modules[main_name] = saved_main + + +try: + io_open_code = io.open_code +except AttributeError: + # Compatibility with Python 3.6/3.7 + import tokenize + + io_open_code = tokenize.open + + +def _get_code_from_file(run_name, fname): + # Check for a compiled file first + from pkgutil import read_code + + decoded_path = os.path.abspath(os.fsdecode(fname)) + with io_open_code(decoded_path) as f: + code = read_code(f) + if code is None: + # That didn't work, so try it as normal source code + with io_open_code(decoded_path) as f: + code = compile(f.read(), fname, "exec") + return code, fname + + +def run_path(path_name, init_globals=None, run_name=None): + """Execute code located at the specified filesystem location + + Returns the resulting top level namespace dictionary + + The file path may refer directly to a Python script (i.e. + one that could be directly executed with execfile) or else + it may refer to a zipfile or directory containing a top + level __main__.py script. + """ + if run_name is None: + run_name = "" + pkg_name = run_name.rpartition(".")[0] + importer = pkgutil_get_importer(path_name) + # Trying to avoid importing imp so as to not consume the deprecation warning. + is_NullImporter = False + if type(importer).__module__ == "imp": + if type(importer).__name__ == "NullImporter": + is_NullImporter = True + if isinstance(importer, type(None)) or is_NullImporter: + # Not a valid sys.path entry, so run the code directly + # execfile() doesn't help as we want to allow compiled files + code, fname = _get_code_from_file(run_name, path_name) + return _run_module_code(code, init_globals, run_name, pkg_name=pkg_name, script_name=fname) + else: + # Finder is defined for path, so add it to + # the start of sys.path + sys.path.insert(0, path_name) + try: + # Here's where things are a little different from the run_module + # case. There, we only had to replace the module in sys while the + # code was running and doing so was somewhat optional. Here, we + # have no choice and we have to remove it even while we read the + # code. If we don't do this, a __loader__ attribute in the + # existing __main__ module may prevent location of the new module. + mod_name, mod_spec, code = _get_main_module_details() + with _TempModule(run_name) as temp_module, _ModifiedArgv0(path_name): + mod_globals = temp_module.module.__dict__ + return _run_code(code, mod_globals, init_globals, run_name, mod_spec, pkg_name).copy() + finally: + try: + sys.path.remove(path_name) + except ValueError: + pass + + +if __name__ == "__main__": + # Run the module specified as the next command line argument + if len(sys.argv) < 2: + print("No module specified for execution", file=sys.stderr) + else: + del sys.argv[0] # Make the requested module sys.argv[0] + _run_module_as_main(sys.argv[0]) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_safe_repr.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_safe_repr.py new file mode 100644 index 0000000..df5e8f4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_safe_repr.py @@ -0,0 +1,395 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +# Gotten from ptvsd for supporting the format expected there. +import sys +from _pydevd_bundle.pydevd_constants import IS_PY36_OR_GREATER +import locale +from _pydev_bundle import pydev_log + + +class SafeRepr(object): + # Can be used to override the encoding from locale.getpreferredencoding() + locale_preferred_encoding = None + + # Can be used to override the encoding used for sys.stdout.encoding + sys_stdout_encoding = None + + # String types are truncated to maxstring_outer when at the outer- + # most level, and truncated to maxstring_inner characters inside + # collections. + maxstring_outer = 2**16 + maxstring_inner = 128 + string_types = (str, bytes) + bytes = bytes + set_info = (set, "{", "}", False) + frozenset_info = (frozenset, "frozenset({", "})", False) + int_types = (int,) + long_iter_types = (list, tuple, bytearray, range, dict, set, frozenset) + + # Collection types are recursively iterated for each limit in + # maxcollection. + maxcollection = (60, 20) + + # Specifies type, prefix string, suffix string, and whether to include a + # comma if there is only one element. (Using a sequence rather than a + # mapping because we use isinstance() to determine the matching type.) + collection_types = [ + (tuple, "(", ")", True), + (list, "[", "]", False), + frozenset_info, + set_info, + ] + try: + from collections import deque + + collection_types.append((deque, "deque([", "])", False)) + except Exception: + pass + + # type, prefix string, suffix string, item prefix string, + # item key/value separator, item suffix string + dict_types = [(dict, "{", "}", "", ": ", "")] + try: + from collections import OrderedDict + + dict_types.append((OrderedDict, "OrderedDict([", "])", "(", ", ", ")")) + except Exception: + pass + + # All other types are treated identically to strings, but using + # different limits. + maxother_outer = 2**16 + maxother_inner = 128 + + convert_to_hex = False + raw_value = False + + def __call__(self, obj): + """ + :param object obj: + The object for which we want a representation. + + :return str: + Returns bytes encoded as utf-8 on py2 and str on py3. + """ + try: + return "".join(self._repr(obj, 0)) + except Exception: + try: + return "An exception was raised: %r" % sys.exc_info()[1] + except Exception: + return "An exception was raised" + + def _repr(self, obj, level): + """Returns an iterable of the parts in the final repr string.""" + + try: + obj_repr = type(obj).__repr__ + except Exception: + obj_repr = None + + def has_obj_repr(t): + r = t.__repr__ + try: + return obj_repr == r + except Exception: + return obj_repr is r + + for t, prefix, suffix, comma in self.collection_types: + if isinstance(obj, t) and has_obj_repr(t): + return self._repr_iter(obj, level, prefix, suffix, comma) + + for t, prefix, suffix, item_prefix, item_sep, item_suffix in self.dict_types: # noqa + if isinstance(obj, t) and has_obj_repr(t): + return self._repr_dict(obj, level, prefix, suffix, item_prefix, item_sep, item_suffix) + + for t in self.string_types: + if isinstance(obj, t) and has_obj_repr(t): + return self._repr_str(obj, level) + + if self._is_long_iter(obj): + return self._repr_long_iter(obj) + + return self._repr_other(obj, level) + + # Determines whether an iterable exceeds the limits set in + # maxlimits, and is therefore unsafe to repr(). + def _is_long_iter(self, obj, level=0): + try: + # Strings have their own limits (and do not nest). Because + # they don't have __iter__ in 2.x, this check goes before + # the next one. + if isinstance(obj, self.string_types): + return len(obj) > self.maxstring_inner + + # If it's not an iterable (and not a string), it's fine. + if not hasattr(obj, "__iter__"): + return False + + # If it's not an instance of these collection types then it + # is fine. Note: this is a fix for + # https://github.com/Microsoft/ptvsd/issues/406 + if not isinstance(obj, self.long_iter_types): + return False + + # Iterable is its own iterator - this is a one-off iterable + # like generator or enumerate(). We can't really count that, + # but repr() for these should not include any elements anyway, + # so we can treat it the same as non-iterables. + if obj is iter(obj): + return False + + # range reprs fine regardless of length. + if isinstance(obj, range): + return False + + # numpy and scipy collections (ndarray etc) have + # self-truncating repr, so they're always safe. + try: + module = type(obj).__module__.partition(".")[0] + if module in ("numpy", "scipy"): + return False + except Exception: + pass + + # Iterables that nest too deep are considered long. + if level >= len(self.maxcollection): + return True + + # It is too long if the length exceeds the limit, or any + # of its elements are long iterables. + if hasattr(obj, "__len__"): + try: + size = len(obj) + except Exception: + size = None + if size is not None and size > self.maxcollection[level]: + return True + return any((self._is_long_iter(item, level + 1) for item in obj)) # noqa + return any(i > self.maxcollection[level] or self._is_long_iter(item, level + 1) for i, item in enumerate(obj)) # noqa + + except Exception: + # If anything breaks, assume the worst case. + return True + + def _repr_iter(self, obj, level, prefix, suffix, comma_after_single_element=False): + yield prefix + + if level >= len(self.maxcollection): + yield "..." + else: + count = self.maxcollection[level] + yield_comma = False + for item in obj: + if yield_comma: + yield ", " + yield_comma = True + + count -= 1 + if count <= 0: + yield "..." + break + + for p in self._repr(item, 100 if item is obj else level + 1): + yield p + else: + if comma_after_single_element: + if count == self.maxcollection[level] - 1: + yield "," + yield suffix + + def _repr_long_iter(self, obj): + try: + length = hex(len(obj)) if self.convert_to_hex else len(obj) + obj_repr = "<%s, len() = %s>" % (type(obj).__name__, length) + except Exception: + try: + obj_repr = "<" + type(obj).__name__ + ">" + except Exception: + obj_repr = "" + yield obj_repr + + def _repr_dict(self, obj, level, prefix, suffix, item_prefix, item_sep, item_suffix): + if not obj: + yield prefix + suffix + return + if level >= len(self.maxcollection): + yield prefix + "..." + suffix + return + + yield prefix + + count = self.maxcollection[level] + yield_comma = False + + if IS_PY36_OR_GREATER: + # On Python 3.6 (onwards) dictionaries now keep + # insertion order. + sorted_keys = list(obj) + else: + try: + sorted_keys = sorted(obj) + except Exception: + sorted_keys = list(obj) + + for key in sorted_keys: + if yield_comma: + yield ", " + yield_comma = True + + count -= 1 + if count <= 0: + yield "..." + break + + yield item_prefix + for p in self._repr(key, level + 1): + yield p + + yield item_sep + + try: + item = obj[key] + except Exception: + yield "" + else: + for p in self._repr(item, 100 if item is obj else level + 1): + yield p + yield item_suffix + + yield suffix + + def _repr_str(self, obj, level): + try: + if self.raw_value: + # For raw value retrieval, ignore all limits. + if isinstance(obj, bytes): + yield obj.decode("latin-1") + else: + yield obj + return + + limit_inner = self.maxother_inner + limit_outer = self.maxother_outer + limit = limit_inner if level > 0 else limit_outer + if len(obj) <= limit: + # Note that we check the limit before doing the repr (so, the final string + # may actually be considerably bigger on some cases, as besides + # the additional u, b, ' chars, some chars may be escaped in repr, so + # even a single char such as \U0010ffff may end up adding more + # chars than expected). + yield self._convert_to_unicode_or_bytes_repr(repr(obj)) + return + + # Slightly imprecise calculations - we may end up with a string that is + # up to 6 characters longer than limit. If you need precise formatting, + # you are using the wrong class. + left_count, right_count = max(1, int(2 * limit / 3)), max(1, int(limit / 3)) # noqa + + # Important: only do repr after slicing to avoid duplicating a byte array that could be + # huge. + + # Note: we don't deal with high surrogates here because we're not dealing with the + # repr() of a random object. + # i.e.: A high surrogate unicode char may be splitted on Py2, but as we do a `repr` + # afterwards, that's ok. + + # Also, we just show the unicode/string/bytes repr() directly to make clear what the + # input type was (so, on py2 a unicode would start with u' and on py3 a bytes would + # start with b'). + + part1 = obj[:left_count] + part1 = repr(part1) + part1 = part1[: part1.rindex("'")] # Remove the last ' + + part2 = obj[-right_count:] + part2 = repr(part2) + part2 = part2[part2.index("'") + 1 :] # Remove the first ' (and possibly u or b). + + yield part1 + yield "..." + yield part2 + except: + # This shouldn't really happen, but let's play it safe. + pydev_log.exception("Error getting string representation to show.") + for part in self._repr_obj(obj, level, self.maxother_inner, self.maxother_outer): + yield part + + def _repr_other(self, obj, level): + return self._repr_obj(obj, level, self.maxother_inner, self.maxother_outer) + + def _repr_obj(self, obj, level, limit_inner, limit_outer): + try: + if self.raw_value: + # For raw value retrieval, ignore all limits. + if isinstance(obj, bytes): + yield obj.decode("latin-1") + return + + try: + mv = memoryview(obj) + except Exception: + yield self._convert_to_unicode_or_bytes_repr(repr(obj)) + return + else: + # Map bytes to Unicode codepoints with same values. + yield mv.tobytes().decode("latin-1") + return + elif self.convert_to_hex and isinstance(obj, self.int_types): + obj_repr = hex(obj) + else: + obj_repr = repr(obj) + except Exception: + try: + obj_repr = object.__repr__(obj) + except Exception: + try: + obj_repr = "" # noqa + except Exception: + obj_repr = "" + + limit = limit_inner if level > 0 else limit_outer + + if limit >= len(obj_repr): + yield self._convert_to_unicode_or_bytes_repr(obj_repr) + return + + # Slightly imprecise calculations - we may end up with a string that is + # up to 3 characters longer than limit. If you need precise formatting, + # you are using the wrong class. + left_count, right_count = max(1, int(2 * limit / 3)), max(1, int(limit / 3)) # noqa + + yield obj_repr[:left_count] + yield "..." + yield obj_repr[-right_count:] + + def _convert_to_unicode_or_bytes_repr(self, obj_repr): + return obj_repr + + def _bytes_as_unicode_if_possible(self, obj_repr): + # We try to decode with 3 possible encoding (sys.stdout.encoding, + # locale.getpreferredencoding() and 'utf-8). If no encoding can decode + # the input, we return the original bytes. + try_encodings = [] + encoding = self.sys_stdout_encoding or getattr(sys.stdout, "encoding", "") + if encoding: + try_encodings.append(encoding.lower()) + + preferred_encoding = self.locale_preferred_encoding or locale.getpreferredencoding() + if preferred_encoding: + preferred_encoding = preferred_encoding.lower() + if preferred_encoding not in try_encodings: + try_encodings.append(preferred_encoding) + + if "utf-8" not in try_encodings: + try_encodings.append("utf-8") + + for encoding in try_encodings: + try: + return obj_repr.decode(encoding) + except UnicodeDecodeError: + pass + + return obj_repr # Return the original version (in bytes) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_save_locals.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_save_locals.py new file mode 100644 index 0000000..8a02fa6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_save_locals.py @@ -0,0 +1,130 @@ +""" +Utility for saving locals. +""" +import sys +from _pydevd_bundle.pydevd_constants import IS_PY313_OR_GREATER +from _pydev_bundle import pydev_log + +try: + import types + + frame_type = types.FrameType +except: + frame_type = type(sys._getframe()) + + +def is_save_locals_available(): + return save_locals_impl is not None + + +def save_locals(frame): + """ + Copy values from locals_dict into the fast stack slots in the given frame. + + Note: the 'save_locals' branch had a different approach wrapping the frame (much more code, but it gives ideas + on how to save things partially, not the 'whole' locals). + """ + if not isinstance(frame, frame_type): + # Fix exception when changing Django variable (receiving DjangoTemplateFrame) + return + + if save_locals_impl is not None: + try: + save_locals_impl(frame) + except: + pass + + +def make_save_locals_impl(): + """ + Factory for the 'save_locals_impl' method. This may seem like a complicated pattern but it is essential that the method is created at + module load time. Inner imports after module load time would cause an occasional debugger deadlock due to the importer lock and debugger + lock being taken in different order in different threads. + """ + try: + if "__pypy__" in sys.builtin_module_names: + import __pypy__ # @UnresolvedImport + + save_locals = __pypy__.locals_to_fast + except: + pass + else: + if "__pypy__" in sys.builtin_module_names: + + def save_locals_pypy_impl(frame): + save_locals(frame) + + return save_locals_pypy_impl + + if IS_PY313_OR_GREATER: + # No longer needed in Python 3.13 (deprecated) + # See PEP 667 + return None + + try: + import ctypes + + locals_to_fast = ctypes.pythonapi.PyFrame_LocalsToFast + except: + pass + else: + + def save_locals_ctypes_impl(frame): + locals_to_fast(ctypes.py_object(frame), ctypes.c_int(0)) + + return save_locals_ctypes_impl + + return None + + +save_locals_impl = make_save_locals_impl() + +_SENTINEL = [] # Any mutable will do. + + +def update_globals_and_locals(updated_globals, initial_globals, frame): + # We don't have the locals and passed all in globals, so, we have to + # manually choose how to update the variables. + # + # Note that the current implementation is a bit tricky: it does work in general + # but if we do something as 'some_var = 10' and 'some_var' is already defined to have + # the value '10' in the globals, we won't actually put that value in the locals + # (which means that the frame locals won't be updated). + # Still, the approach to have a single namespace was chosen because it was the only + # one that enabled creating and using variables during the same evaluation. + assert updated_globals is not None + f_locals = None + + removed = set(initial_globals).difference(updated_globals) + + for key, val in updated_globals.items(): + if val is not initial_globals.get(key, _SENTINEL): + if f_locals is None: + # Note: we call f_locals only once because each time + # we call it the values may be reset. + f_locals = frame.f_locals + + f_locals[key] = val + + if removed: + if f_locals is None: + # Note: we call f_locals only once because each time + # we call it the values may be reset. + f_locals = frame.f_locals + + for key in removed: + try: + del f_locals[key] + except Exception: + # Python 3.13.0 has issues here: + # https://github.com/python/cpython/pull/125616 + # This should be backported from the pull request + # but we still need to handle it in this version + try: + if key in f_locals: + f_locals[key] = None + except Exception as e: + pydev_log.info("Unable to remove key: %s from locals. Exception: %s", key, e) + + if f_locals is not None: + save_locals(frame) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_signature.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_signature.py new file mode 100644 index 0000000..9664364 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_signature.py @@ -0,0 +1,201 @@ +from _pydev_bundle import pydev_log + +try: + import trace +except ImportError: + pass +else: + trace._warn = lambda *args: None # workaround for http://bugs.python.org/issue17143 (PY-8706) + +import os +from _pydevd_bundle.pydevd_comm import CMD_SIGNATURE_CALL_TRACE, NetCommand +from _pydevd_bundle import pydevd_xml +from _pydevd_bundle.pydevd_utils import get_clsname_for_code + + +class Signature(object): + def __init__(self, file, name): + self.file = file + self.name = name + self.args = [] + self.args_str = [] + self.return_type = None + + def add_arg(self, name, type): + self.args.append((name, type)) + self.args_str.append("%s:%s" % (name, type)) + + def set_args(self, frame, recursive=False): + self.args = [] + + code = frame.f_code + locals = frame.f_locals + + for i in range(0, code.co_argcount): + name = code.co_varnames[i] + class_name = get_type_of_value(locals[name], recursive=recursive) + + self.add_arg(name, class_name) + + def __str__(self): + return "%s %s(%s)" % (self.file, self.name, ", ".join(self.args_str)) + + +def get_type_of_value(value, ignore_module_name=("__main__", "__builtin__", "builtins"), recursive=False): + tp = type(value) + class_name = tp.__name__ + if class_name == "instance": # old-style classes + tp = value.__class__ + class_name = tp.__name__ + + if hasattr(tp, "__module__") and tp.__module__ and tp.__module__ not in ignore_module_name: + class_name = "%s.%s" % (tp.__module__, class_name) + + if class_name == "list": + class_name = "List" + if len(value) > 0 and recursive: + class_name += "[%s]" % get_type_of_value(value[0], recursive=recursive) + return class_name + + if class_name == "dict": + class_name = "Dict" + if len(value) > 0 and recursive: + for k, v in value.items(): + class_name += "[%s, %s]" % (get_type_of_value(k, recursive=recursive), get_type_of_value(v, recursive=recursive)) + break + return class_name + + if class_name == "tuple": + class_name = "Tuple" + if len(value) > 0 and recursive: + class_name += "[" + class_name += ", ".join(get_type_of_value(v, recursive=recursive) for v in value) + class_name += "]" + + return class_name + + +def _modname(path): + """Return a plausible module name for the path""" + base = os.path.basename(path) + filename, ext = os.path.splitext(base) + return filename + + +class SignatureFactory(object): + def __init__(self): + self._caller_cache = {} + self.cache = CallSignatureCache() + + def create_signature(self, frame, filename, with_args=True): + try: + _, modulename, funcname = self.file_module_function_of(frame) + signature = Signature(filename, funcname) + if with_args: + signature.set_args(frame, recursive=True) + return signature + except: + pydev_log.exception() + + def file_module_function_of(self, frame): # this code is take from trace module and fixed to work with new-style classes + code = frame.f_code + filename = code.co_filename + if filename: + modulename = _modname(filename) + else: + modulename = None + + funcname = code.co_name + clsname = None + if code in self._caller_cache: + if self._caller_cache[code] is not None: + clsname = self._caller_cache[code] + else: + self._caller_cache[code] = None + clsname = get_clsname_for_code(code, frame) + if clsname is not None: + # cache the result - assumption is that new.* is + # not called later to disturb this relationship + # _caller_cache could be flushed if functions in + # the new module get called. + self._caller_cache[code] = clsname + + if clsname is not None: + funcname = "%s.%s" % (clsname, funcname) + + return filename, modulename, funcname + + +def get_signature_info(signature): + return signature.file, signature.name, " ".join([arg[1] for arg in signature.args]) + + +def get_frame_info(frame): + co = frame.f_code + return co.co_name, frame.f_lineno, co.co_filename + + +class CallSignatureCache(object): + def __init__(self): + self.cache = {} + + def add(self, signature): + filename, name, args_type = get_signature_info(signature) + calls_from_file = self.cache.setdefault(filename, {}) + name_calls = calls_from_file.setdefault(name, {}) + name_calls[args_type] = None + + def is_in_cache(self, signature): + filename, name, args_type = get_signature_info(signature) + if args_type in self.cache.get(filename, {}).get(name, {}): + return True + return False + + +def create_signature_message(signature): + cmdTextList = [""] + + cmdTextList.append( + '' + % (pydevd_xml.make_valid_xml_value(signature.file), pydevd_xml.make_valid_xml_value(signature.name)) + ) + + for arg in signature.args: + cmdTextList.append( + '' % (pydevd_xml.make_valid_xml_value(arg[0]), pydevd_xml.make_valid_xml_value(arg[1])) + ) + + if signature.return_type is not None: + cmdTextList.append('' % (pydevd_xml.make_valid_xml_value(signature.return_type))) + + cmdTextList.append("") + cmdText = "".join(cmdTextList) + return NetCommand(CMD_SIGNATURE_CALL_TRACE, 0, cmdText) + + +def send_signature_call_trace(dbg, frame, filename): + if dbg.signature_factory and dbg.in_project_scope(frame): + signature = dbg.signature_factory.create_signature(frame, filename) + if signature is not None: + if dbg.signature_factory.cache is not None: + if not dbg.signature_factory.cache.is_in_cache(signature): + dbg.signature_factory.cache.add(signature) + dbg.writer.add_command(create_signature_message(signature)) + return True + else: + # we don't send signature if it is cached + return False + else: + dbg.writer.add_command(create_signature_message(signature)) + return True + return False + + +def send_signature_return_trace(dbg, frame, filename, return_value): + if dbg.signature_factory and dbg.in_project_scope(frame): + signature = dbg.signature_factory.create_signature(frame, filename, with_args=False) + signature.return_type = get_type_of_value(return_value, recursive=True) + dbg.writer.add_command(create_signature_message(signature)) + return True + + return False diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_source_mapping.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_source_mapping.py new file mode 100644 index 0000000..7e75c82 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_source_mapping.py @@ -0,0 +1,152 @@ +import bisect +from _pydevd_bundle.pydevd_constants import NULL, KeyifyList +import pydevd_file_utils + + +class SourceMappingEntry(object): + __slots__ = ["source_filename", "line", "end_line", "runtime_line", "runtime_source"] + + def __init__(self, line, end_line, runtime_line, runtime_source): + assert isinstance(runtime_source, str) + + self.line = int(line) + self.end_line = int(end_line) + self.runtime_line = int(runtime_line) + self.runtime_source = runtime_source # Something as + + # Should be set after translated to server (absolute_source_filename). + # This is what's sent to the client afterwards (so, its case should not be normalized). + self.source_filename = None + + def contains_line(self, i): + return self.line <= i <= self.end_line + + def contains_runtime_line(self, i): + line_count = self.end_line + self.line + runtime_end_line = self.runtime_line + line_count + return self.runtime_line <= i <= runtime_end_line + + def __str__(self): + return "SourceMappingEntry(%s)" % (", ".join("%s=%r" % (attr, getattr(self, attr)) for attr in self.__slots__)) + + __repr__ = __str__ + + +class SourceMapping(object): + def __init__(self, on_source_mapping_changed=NULL): + self._mappings_to_server = {} # dict(normalized(file.py) to [SourceMappingEntry]) + self._mappings_to_client = {} # dict( to File.py) + self._cache = {} + self._on_source_mapping_changed = on_source_mapping_changed + + def set_source_mapping(self, absolute_filename, mapping): + """ + :param str absolute_filename: + The filename for the source mapping (bytes on py2 and str on py3). + + :param list(SourceMappingEntry) mapping: + A list with the source mapping entries to be applied to the given filename. + + :return str: + An error message if it was not possible to set the mapping or an empty string if + everything is ok. + """ + # Let's first validate if it's ok to apply that mapping. + # File mappings must be 1:N, not M:N (i.e.: if there's a mapping from file1.py to , + # there can be no other mapping from any other file to ). + # This is a limitation to make it easier to remove existing breakpoints when new breakpoints are + # set to a file (so, any file matching that breakpoint can be removed instead of needing to check + # which lines are corresponding to that file). + for map_entry in mapping: + existing_source_filename = self._mappings_to_client.get(map_entry.runtime_source) + if existing_source_filename and existing_source_filename != absolute_filename: + return "Cannot apply mapping from %s to %s (it conflicts with mapping: %s to %s)" % ( + absolute_filename, + map_entry.runtime_source, + existing_source_filename, + map_entry.runtime_source, + ) + + try: + absolute_normalized_filename = pydevd_file_utils.normcase(absolute_filename) + current_mapping = self._mappings_to_server.get(absolute_normalized_filename, []) + for map_entry in current_mapping: + del self._mappings_to_client[map_entry.runtime_source] + + self._mappings_to_server[absolute_normalized_filename] = sorted(mapping, key=lambda entry: entry.line) + + for map_entry in mapping: + self._mappings_to_client[map_entry.runtime_source] = absolute_filename + finally: + self._cache.clear() + self._on_source_mapping_changed() + return "" + + def map_to_client(self, runtime_source_filename, lineno): + key = (lineno, "client", runtime_source_filename) + try: + return self._cache[key] + except KeyError: + for _, mapping in list(self._mappings_to_server.items()): + for map_entry in mapping: + if map_entry.runtime_source == runtime_source_filename: # + if map_entry.contains_runtime_line(lineno): # matches line range + self._cache[key] = (map_entry.source_filename, map_entry.line + (lineno - map_entry.runtime_line), True) + return self._cache[key] + + self._cache[key] = (runtime_source_filename, lineno, False) # Mark that no translation happened in the cache. + return self._cache[key] + + def has_mapping_entry(self, runtime_source_filename): + """ + :param runtime_source_filename: + Something as + """ + # Note that we're not interested in the line here, just on knowing if a given filename + # (from the server) has a mapping for it. + key = ("has_entry", runtime_source_filename) + try: + return self._cache[key] + except KeyError: + for _absolute_normalized_filename, mapping in list(self._mappings_to_server.items()): + for map_entry in mapping: + if map_entry.runtime_source == runtime_source_filename: + self._cache[key] = True + return self._cache[key] + + self._cache[key] = False + return self._cache[key] + + def map_to_server(self, absolute_filename, lineno): + """ + Convert something as 'file1.py' at line 10 to '' at line 2. + + Note that the name should be already normalized at this point. + """ + absolute_normalized_filename = pydevd_file_utils.normcase(absolute_filename) + + changed = False + mappings = self._mappings_to_server.get(absolute_normalized_filename) + if mappings: + i = bisect.bisect(KeyifyList(mappings, lambda entry: entry.line), lineno) + if i >= len(mappings): + i -= 1 + + if i == 0: + entry = mappings[i] + + else: + entry = mappings[i - 1] + + if not entry.contains_line(lineno): + entry = mappings[i] + if not entry.contains_line(lineno): + entry = None + + if entry is not None: + lineno = entry.runtime_line + (lineno - entry.line) + + absolute_filename = entry.runtime_source + changed = True + + return absolute_filename, lineno, changed diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_stackless.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_stackless.py new file mode 100644 index 0000000..ba574e9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_stackless.py @@ -0,0 +1,412 @@ +from __future__ import nested_scopes + +import weakref +import sys + +from _pydevd_bundle.pydevd_comm import get_global_debugger +from _pydevd_bundle.pydevd_constants import call_only_once +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle.pydevd_custom_frames import update_custom_frame, remove_custom_frame, add_custom_frame +import stackless # @UnresolvedImport +from _pydev_bundle import pydev_log + + +# Used so that we don't loose the id (because we'll remove when it's not alive and would generate a new id for the +# same tasklet). +class TaskletToLastId: + """ + So, why not a WeakKeyDictionary? + The problem is that removals from the WeakKeyDictionary will create a new tasklet (as it adds a callback to + remove the key when it's garbage-collected), so, we can get into a recursion. + """ + + def __init__(self): + self.tasklet_ref_to_last_id = {} + self._i = 0 + + def get(self, tasklet): + return self.tasklet_ref_to_last_id.get(weakref.ref(tasklet)) + + def __setitem__(self, tasklet, last_id): + self.tasklet_ref_to_last_id[weakref.ref(tasklet)] = last_id + self._i += 1 + if self._i % 100 == 0: # Collect at each 100 additions to the dict (no need to rush). + for tasklet_ref in list(self.tasklet_ref_to_last_id.keys()): + if tasklet_ref() is None: + del self.tasklet_ref_to_last_id[tasklet_ref] + + +_tasklet_to_last_id = TaskletToLastId() + + +# ======================================================================================================================= +# _TaskletInfo +# ======================================================================================================================= +class _TaskletInfo: + _last_id = 0 + + def __init__(self, tasklet_weakref, tasklet): + self.frame_id = None + self.tasklet_weakref = tasklet_weakref + + last_id = _tasklet_to_last_id.get(tasklet) + if last_id is None: + _TaskletInfo._last_id += 1 + last_id = _TaskletInfo._last_id + _tasklet_to_last_id[tasklet] = last_id + + self._tasklet_id = last_id + + self.update_name() + + def update_name(self): + tasklet = self.tasklet_weakref() + if tasklet: + if tasklet.blocked: + state = "blocked" + elif tasklet.paused: + state = "paused" + elif tasklet.scheduled: + state = "scheduled" + else: + state = "" + + try: + name = tasklet.name + except AttributeError: + if tasklet.is_main: + name = "MainTasklet" + else: + name = "Tasklet-%s" % (self._tasklet_id,) + + thread_id = tasklet.thread_id + if thread_id != -1: + for thread in threading.enumerate(): + if thread.ident == thread_id: + if thread.name: + thread_name = "of %s" % (thread.name,) + else: + thread_name = "of Thread-%s" % (thread.name or str(thread_id),) + break + else: + # should not happen. + thread_name = "of Thread-%s" % (str(thread_id),) + thread = None + else: + # tasklet is no longer bound to a thread, because its thread ended + thread_name = "without thread" + + tid = id(tasklet) + tasklet = None + else: + state = "dead" + name = "Tasklet-%s" % (self._tasklet_id,) + thread_name = "" + tid = "-" + self.tasklet_name = "%s %s %s (%s)" % (state, name, thread_name, tid) + + if not hasattr(stackless.tasklet, "trace_function"): + # bug https://bitbucket.org/stackless-dev/stackless/issue/42 + # is not fixed. Stackless releases before 2014 + def update_name(self): + tasklet = self.tasklet_weakref() + if tasklet: + try: + name = tasklet.name + except AttributeError: + if tasklet.is_main: + name = "MainTasklet" + else: + name = "Tasklet-%s" % (self._tasklet_id,) + + thread_id = tasklet.thread_id + for thread in threading.enumerate(): + if thread.ident == thread_id: + if thread.name: + thread_name = "of %s" % (thread.name,) + else: + thread_name = "of Thread-%s" % (thread.name or str(thread_id),) + break + else: + # should not happen. + thread_name = "of Thread-%s" % (str(thread_id),) + thread = None + + tid = id(tasklet) + tasklet = None + else: + name = "Tasklet-%s" % (self._tasklet_id,) + thread_name = "" + tid = "-" + self.tasklet_name = "%s %s (%s)" % (name, thread_name, tid) + + +_weak_tasklet_registered_to_info = {} + + +# ======================================================================================================================= +# get_tasklet_info +# ======================================================================================================================= +def get_tasklet_info(tasklet): + return register_tasklet_info(tasklet) + + +# ======================================================================================================================= +# register_tasklet_info +# ======================================================================================================================= +def register_tasklet_info(tasklet): + r = weakref.ref(tasklet) + info = _weak_tasklet_registered_to_info.get(r) + if info is None: + info = _weak_tasklet_registered_to_info[r] = _TaskletInfo(r, tasklet) + + return info + + +_application_set_schedule_callback = None + + +# ======================================================================================================================= +# _schedule_callback +# ======================================================================================================================= +def _schedule_callback(prev, next): + """ + Called when a context is stopped or a new context is made runnable. + """ + try: + if not prev and not next: + return + + current_frame = sys._getframe() + + if next: + register_tasklet_info(next) + + # Ok, making next runnable: set the tracing facility in it. + debugger = get_global_debugger() + if debugger is not None: + next.trace_function = debugger.get_thread_local_trace_func() + frame = next.frame + if frame is current_frame: + frame = frame.f_back + if hasattr(frame, "f_trace"): # Note: can be None (but hasattr should cover for that too). + frame.f_trace = debugger.get_thread_local_trace_func() + + debugger = None + + if prev: + register_tasklet_info(prev) + + try: + for tasklet_ref, tasklet_info in list(_weak_tasklet_registered_to_info.items()): # Make sure it's a copy! + tasklet = tasklet_ref() + if tasklet is None or not tasklet.alive: + # Garbage-collected already! + try: + del _weak_tasklet_registered_to_info[tasklet_ref] + except KeyError: + pass + if tasklet_info.frame_id is not None: + remove_custom_frame(tasklet_info.frame_id) + else: + is_running = stackless.get_thread_info(tasklet.thread_id)[1] is tasklet + if tasklet is prev or (tasklet is not next and not is_running): + # the tasklet won't run after this scheduler action: + # - the tasklet is the previous tasklet + # - it is not the next tasklet and it is not an already running tasklet + frame = tasklet.frame + if frame is current_frame: + frame = frame.f_back + if frame is not None: + # print >>sys.stderr, "SchedCB: %r, %d, '%s', '%s'" % (tasklet, frame.f_lineno, _filename, base) + debugger = get_global_debugger() + if debugger is not None and debugger.get_file_type(frame) is None: + tasklet_info.update_name() + if tasklet_info.frame_id is None: + tasklet_info.frame_id = add_custom_frame(frame, tasklet_info.tasklet_name, tasklet.thread_id) + else: + update_custom_frame(tasklet_info.frame_id, frame, tasklet.thread_id, name=tasklet_info.tasklet_name) + debugger = None + + elif tasklet is next or is_running: + if tasklet_info.frame_id is not None: + # Remove info about stackless suspended when it starts to run. + remove_custom_frame(tasklet_info.frame_id) + tasklet_info.frame_id = None + + finally: + tasklet = None + tasklet_info = None + frame = None + + except: + pydev_log.exception() + + if _application_set_schedule_callback is not None: + return _application_set_schedule_callback(prev, next) + + +if not hasattr(stackless.tasklet, "trace_function"): + # Older versions of Stackless, released before 2014 + # This code does not work reliable! It is affected by several + # stackless bugs: Stackless issues #44, #42, #40 + def _schedule_callback(prev, next): + """ + Called when a context is stopped or a new context is made runnable. + """ + try: + if not prev and not next: + return + + if next: + register_tasklet_info(next) + + # Ok, making next runnable: set the tracing facility in it. + debugger = get_global_debugger() + if debugger is not None and next.frame: + if hasattr(next.frame, "f_trace"): + next.frame.f_trace = debugger.get_thread_local_trace_func() + debugger = None + + if prev: + register_tasklet_info(prev) + + try: + for tasklet_ref, tasklet_info in list(_weak_tasklet_registered_to_info.items()): # Make sure it's a copy! + tasklet = tasklet_ref() + if tasklet is None or not tasklet.alive: + # Garbage-collected already! + try: + del _weak_tasklet_registered_to_info[tasklet_ref] + except KeyError: + pass + if tasklet_info.frame_id is not None: + remove_custom_frame(tasklet_info.frame_id) + else: + if tasklet.paused or tasklet.blocked or tasklet.scheduled: + if tasklet.frame and tasklet.frame.f_back: + f_back = tasklet.frame.f_back + debugger = get_global_debugger() + if debugger is not None and debugger.get_file_type(f_back) is None: + if tasklet_info.frame_id is None: + tasklet_info.frame_id = add_custom_frame(f_back, tasklet_info.tasklet_name, tasklet.thread_id) + else: + update_custom_frame(tasklet_info.frame_id, f_back, tasklet.thread_id) + debugger = None + + elif tasklet.is_current: + if tasklet_info.frame_id is not None: + # Remove info about stackless suspended when it starts to run. + remove_custom_frame(tasklet_info.frame_id) + tasklet_info.frame_id = None + + finally: + tasklet = None + tasklet_info = None + f_back = None + + except: + pydev_log.exception() + + if _application_set_schedule_callback is not None: + return _application_set_schedule_callback(prev, next) + + _original_setup = stackless.tasklet.setup + + # ======================================================================================================================= + # setup + # ======================================================================================================================= + def setup(self, *args, **kwargs): + """ + Called to run a new tasklet: rebind the creation so that we can trace it. + """ + + f = self.tempval + + def new_f(old_f, args, kwargs): + debugger = get_global_debugger() + if debugger is not None: + debugger.enable_tracing() + + debugger = None + + # Remove our own traces :) + self.tempval = old_f + register_tasklet_info(self) + + # Hover old_f to see the stackless being created and *args and **kwargs to see its parameters. + return old_f(*args, **kwargs) + + # This is the way to tell stackless that the function it should execute is our function, not the original one. Note: + # setting tempval is the same as calling bind(new_f), but it seems that there's no other way to get the currently + # bound function, so, keeping on using tempval instead of calling bind (which is actually the same thing in a better + # API). + + self.tempval = new_f + + return _original_setup(self, f, args, kwargs) + + # ======================================================================================================================= + # __call__ + # ======================================================================================================================= + def __call__(self, *args, **kwargs): + """ + Called to run a new tasklet: rebind the creation so that we can trace it. + """ + + return setup(self, *args, **kwargs) + + _original_run = stackless.run + + # ======================================================================================================================= + # run + # ======================================================================================================================= + def run(*args, **kwargs): + debugger = get_global_debugger() + if debugger is not None: + debugger.enable_tracing() + debugger = None + + return _original_run(*args, **kwargs) + + +# ======================================================================================================================= +# patch_stackless +# ======================================================================================================================= +def patch_stackless(): + """ + This function should be called to patch the stackless module so that new tasklets are properly tracked in the + debugger. + """ + global _application_set_schedule_callback + _application_set_schedule_callback = stackless.set_schedule_callback(_schedule_callback) + + def set_schedule_callback(callable): + global _application_set_schedule_callback + old = _application_set_schedule_callback + _application_set_schedule_callback = callable + return old + + def get_schedule_callback(): + global _application_set_schedule_callback + return _application_set_schedule_callback + + set_schedule_callback.__doc__ = stackless.set_schedule_callback.__doc__ + if hasattr(stackless, "get_schedule_callback"): + get_schedule_callback.__doc__ = stackless.get_schedule_callback.__doc__ + stackless.set_schedule_callback = set_schedule_callback + stackless.get_schedule_callback = get_schedule_callback + + if not hasattr(stackless.tasklet, "trace_function"): + # Older versions of Stackless, released before 2014 + __call__.__doc__ = stackless.tasklet.__call__.__doc__ + stackless.tasklet.__call__ = __call__ + + setup.__doc__ = stackless.tasklet.setup.__doc__ + stackless.tasklet.setup = setup + + run.__doc__ = stackless.run.__doc__ + stackless.run = run + + +patch_stackless = call_only_once(patch_stackless) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_suspended_frames.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_suspended_frames.py new file mode 100644 index 0000000..b828232 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_suspended_frames.py @@ -0,0 +1,544 @@ +from contextlib import contextmanager +import sys + +from _pydevd_bundle.pydevd_constants import get_frame, RETURN_VALUES_DICT, ForkSafeLock, GENERATED_LEN_ATTR_NAME, silence_warnings_decorator +from _pydevd_bundle.pydevd_xml import get_variable_details, get_type +from _pydev_bundle.pydev_override import overrides +from _pydevd_bundle.pydevd_resolver import sorted_attributes_key, TOO_LARGE_ATTR, get_var_scope +from _pydevd_bundle.pydevd_safe_repr import SafeRepr +from _pydev_bundle import pydev_log +from _pydevd_bundle import pydevd_vars +from _pydev_bundle.pydev_imports import Exec +from _pydevd_bundle.pydevd_frame_utils import FramesList +from _pydevd_bundle.pydevd_utils import ScopeRequest, DAPGrouper, Timer +from typing import Optional + + +class _AbstractVariable(object): + # Default attributes in class, set in instance. + + name = None + value = None + evaluate_name = None + + def __init__(self, py_db): + assert py_db is not None + self.py_db = py_db + + def get_name(self): + return self.name + + def get_value(self): + return self.value + + def get_variable_reference(self): + return id(self.value) + + def get_var_data(self, fmt: Optional[dict] = None, context: Optional[str] = None, **safe_repr_custom_attrs): + """ + :param dict fmt: + Format expected by the DAP (keys: 'hex': bool, 'rawString': bool) + + :param context: + This is the context in which the variable is being requested. Valid values: + "watch", + "repl", + "hover", + "clipboard" + """ + timer = Timer() + safe_repr = SafeRepr() + if fmt is not None: + safe_repr.convert_to_hex = fmt.get("hex", False) + safe_repr.raw_value = fmt.get("rawString", False) + for key, val in safe_repr_custom_attrs.items(): + setattr(safe_repr, key, val) + + type_name, _type_qualifier, _is_exception_on_eval, resolver, value = get_variable_details( + self.value, to_string=safe_repr, context=context + ) + + is_raw_string = type_name in ("str", "bytes", "bytearray") + + attributes = [] + + if is_raw_string: + attributes.append("rawString") + + name = self.name + + if self._is_return_value: + attributes.append("readOnly") + name = "(return) %s" % (name,) + + elif name in (TOO_LARGE_ATTR, GENERATED_LEN_ATTR_NAME): + attributes.append("readOnly") + + try: + if self.value.__class__ == DAPGrouper: + type_name = "" + except: + pass # Ignore errors accessing __class__. + + var_data = { + "name": name, + "value": value, + "type": type_name, + } + + if self.evaluate_name is not None: + var_data["evaluateName"] = self.evaluate_name + + if resolver is not None: # I.e.: it's a container + var_data["variablesReference"] = self.get_variable_reference() + else: + var_data["variablesReference"] = 0 # It's mandatory (although if == 0 it doesn't have children). + + if len(attributes) > 0: + var_data["presentationHint"] = {"attributes": attributes} + + timer.report_if_compute_repr_attr_slow("", name, type_name) + return var_data + + def get_children_variables(self, fmt=None, scope=None): + raise NotImplementedError() + + def get_child_variable_named(self, name, fmt=None, scope=None): + for child_var in self.get_children_variables(fmt=fmt, scope=scope): + if child_var.get_name() == name: + return child_var + return None + + def _group_entries(self, lst, handle_return_values): + scope_to_grouper = {} + + group_entries = [] + if isinstance(self.value, DAPGrouper): + new_lst = lst + else: + new_lst = [] + get_presentation = self.py_db.variable_presentation.get_presentation + # Now that we have the contents, group items. + for attr_name, attr_value, evaluate_name in lst: + scope = get_var_scope(attr_name, attr_value, evaluate_name, handle_return_values) + + entry = (attr_name, attr_value, evaluate_name) + if scope: + presentation = get_presentation(scope) + if presentation == "hide": + continue + + elif presentation == "inline": + new_lst.append(entry) + + else: # group + if scope not in scope_to_grouper: + grouper = DAPGrouper(scope) + scope_to_grouper[scope] = grouper + else: + grouper = scope_to_grouper[scope] + + grouper.contents_debug_adapter_protocol.append(entry) + + else: + new_lst.append(entry) + + for scope in DAPGrouper.SCOPES_SORTED: + grouper = scope_to_grouper.get(scope) + if grouper is not None: + group_entries.append((scope, grouper, None)) + + return new_lst, group_entries + + +class _ObjectVariable(_AbstractVariable): + def __init__(self, py_db, name, value, register_variable, is_return_value=False, evaluate_name=None, frame=None): + _AbstractVariable.__init__(self, py_db) + self.frame = frame + self.name = name + self.value = value + self._register_variable = register_variable + self._register_variable(self) + self._is_return_value = is_return_value + self.evaluate_name = evaluate_name + + @silence_warnings_decorator + @overrides(_AbstractVariable.get_children_variables) + def get_children_variables(self, fmt=None, scope=None): + _type, _type_name, resolver = get_type(self.value) + + children_variables = [] + if resolver is not None: # i.e.: it's a container. + if hasattr(resolver, "get_contents_debug_adapter_protocol"): + # The get_contents_debug_adapter_protocol needs to return sorted. + lst = resolver.get_contents_debug_adapter_protocol(self.value, fmt=fmt) + else: + # If there's no special implementation, the default is sorting the keys. + dct = resolver.get_dictionary(self.value) + lst = sorted(dct.items(), key=lambda tup: sorted_attributes_key(tup[0])) + # No evaluate name in this case. + lst = [(key, value, None) for (key, value) in lst] + + lst, group_entries = self._group_entries(lst, handle_return_values=False) + if group_entries: + lst = group_entries + lst + parent_evaluate_name = self.evaluate_name + if parent_evaluate_name: + for key, val, evaluate_name in lst: + if evaluate_name is not None: + if callable(evaluate_name): + evaluate_name = evaluate_name(parent_evaluate_name) + else: + evaluate_name = parent_evaluate_name + evaluate_name + variable = _ObjectVariable(self.py_db, key, val, self._register_variable, evaluate_name=evaluate_name, frame=self.frame) + children_variables.append(variable) + else: + for key, val, evaluate_name in lst: + # No evaluate name + variable = _ObjectVariable(self.py_db, key, val, self._register_variable, frame=self.frame) + children_variables.append(variable) + + return children_variables + + def change_variable(self, name, value, py_db, fmt=None): + children_variable = self.get_child_variable_named(name) + if children_variable is None: + return None + + var_data = children_variable.get_var_data() + evaluate_name = var_data.get("evaluateName") + + if not evaluate_name: + # Note: right now we only pass control to the resolver in the cases where + # there's no evaluate name (the idea being that if we can evaluate it, + # we can use that evaluation to set the value too -- if in the future + # a case where this isn't true is found this logic may need to be changed). + _type, _type_name, container_resolver = get_type(self.value) + if hasattr(container_resolver, "change_var_from_name"): + try: + new_value = eval(value) + except: + return None + new_key = container_resolver.change_var_from_name(self.value, name, new_value) + if new_key is not None: + return _ObjectVariable(self.py_db, new_key, new_value, self._register_variable, evaluate_name=None, frame=self.frame) + + return None + else: + return None + + frame = self.frame + if frame is None: + return None + + try: + # This handles the simple cases (such as dict, list, object) + Exec("%s=%s" % (evaluate_name, value), frame.f_globals, frame.f_locals) + except: + return None + + return self.get_child_variable_named(name, fmt=fmt) + + +def sorted_variables_key(obj): + return sorted_attributes_key(obj.name) + + +class _FrameVariable(_AbstractVariable): + def __init__(self, py_db, frame, register_variable): + _AbstractVariable.__init__(self, py_db) + self.frame = frame + + self.name = self.frame.f_code.co_name + self.value = frame + + self._register_variable = register_variable + self._register_variable(self) + + def change_variable(self, name, value, py_db, fmt=None): + frame = self.frame + + pydevd_vars.change_attr_expression(frame, name, value, py_db) + + return self.get_child_variable_named(name, fmt=fmt) + + @silence_warnings_decorator + @overrides(_AbstractVariable.get_children_variables) + def get_children_variables(self, fmt=None, scope=None): + children_variables = [] + if scope is not None: + assert isinstance(scope, ScopeRequest) + scope = scope.scope + + if scope in ("locals", None): + dct = self.frame.f_locals + elif scope == "globals": + dct = self.frame.f_globals + else: + raise AssertionError("Unexpected scope: %s" % (scope,)) + + lst, group_entries = self._group_entries( + [(x[0], x[1], None) for x in list(dct.items()) if x[0] != "_pydev_stop_at_break"], handle_return_values=True + ) + group_variables = [] + + for key, val, _ in group_entries: + # Make sure that the contents in the group are also sorted. + val.contents_debug_adapter_protocol.sort(key=lambda v: sorted_attributes_key(v[0])) + variable = _ObjectVariable(self.py_db, key, val, self._register_variable, False, key, frame=self.frame) + group_variables.append(variable) + + for key, val, _ in lst: + is_return_value = key == RETURN_VALUES_DICT + if is_return_value: + for return_key, return_value in val.items(): + variable = _ObjectVariable( + self.py_db, + return_key, + return_value, + self._register_variable, + is_return_value, + "%s[%r]" % (key, return_key), + frame=self.frame, + ) + children_variables.append(variable) + else: + variable = _ObjectVariable(self.py_db, key, val, self._register_variable, is_return_value, key, frame=self.frame) + children_variables.append(variable) + + # Frame variables always sorted. + children_variables.sort(key=sorted_variables_key) + if group_variables: + # Groups have priority over other variables. + children_variables = group_variables + children_variables + + return children_variables + + +class _FramesTracker(object): + """ + This is a helper class to be used to track frames when a thread becomes suspended. + """ + + def __init__(self, suspended_frames_manager, py_db): + self._suspended_frames_manager = suspended_frames_manager + self.py_db = py_db + self._frame_id_to_frame = {} + + # Note that a given frame may appear in multiple threads when we have custom + # frames added, but as those are coroutines, this map will point to the actual + # main thread (which is the one that needs to be suspended for us to get the + # variables). + self._frame_id_to_main_thread_id = {} + + # A map of the suspended thread id -> list(frames ids) -- note that + # frame ids are kept in order (the first one is the suspended frame). + self._thread_id_to_frame_ids = {} + + self._thread_id_to_frames_list = {} + + # The main suspended thread (if this is a coroutine this isn't the id of the + # coroutine thread, it's the id of the actual suspended thread). + self._main_thread_id = None + + # Helper to know if it was already untracked. + self._untracked = False + + # We need to be thread-safe! + self._lock = ForkSafeLock(rlock=True) + + self._variable_reference_to_variable = {} + + def _register_variable(self, variable): + variable_reference = variable.get_variable_reference() + self._variable_reference_to_variable[variable_reference] = variable + + def obtain_as_variable(self, name, value, evaluate_name=None, frame=None): + if evaluate_name is None: + evaluate_name = name + + variable_reference = id(value) + variable = self._variable_reference_to_variable.get(variable_reference) + if variable is not None: + return variable + + # Still not created, let's do it now. + return _ObjectVariable( + self.py_db, name, value, self._register_variable, is_return_value=False, evaluate_name=evaluate_name, frame=frame + ) + + def get_main_thread_id(self): + return self._main_thread_id + + def get_variable(self, variable_reference): + return self._variable_reference_to_variable[variable_reference] + + def track(self, thread_id, frames_list, frame_custom_thread_id=None): + """ + :param thread_id: + The thread id to be used for this frame. + + :param FramesList frames_list: + A list of frames to be tracked (the first is the topmost frame which is suspended at the given thread). + + :param frame_custom_thread_id: + If None this this is the id of the thread id for the custom frame (i.e.: coroutine). + """ + assert frames_list.__class__ == FramesList + with self._lock: + coroutine_or_main_thread_id = frame_custom_thread_id or thread_id + + if coroutine_or_main_thread_id in self._suspended_frames_manager._thread_id_to_tracker: + sys.stderr.write("pydevd: Something is wrong. Tracker being added twice to the same thread id.\n") + + self._suspended_frames_manager._thread_id_to_tracker[coroutine_or_main_thread_id] = self + self._main_thread_id = thread_id + + frame_ids_from_thread = self._thread_id_to_frame_ids.setdefault(coroutine_or_main_thread_id, []) + + self._thread_id_to_frames_list[coroutine_or_main_thread_id] = frames_list + for frame in frames_list: + frame_id = id(frame) + self._frame_id_to_frame[frame_id] = frame + _FrameVariable(self.py_db, frame, self._register_variable) # Instancing is enough to register. + self._suspended_frames_manager._variable_reference_to_frames_tracker[frame_id] = self + frame_ids_from_thread.append(frame_id) + + self._frame_id_to_main_thread_id[frame_id] = thread_id + + frame = None + + def untrack_all(self): + with self._lock: + if self._untracked: + # Calling multiple times is expected for the set next statement. + return + self._untracked = True + for thread_id in self._thread_id_to_frame_ids: + self._suspended_frames_manager._thread_id_to_tracker.pop(thread_id, None) + + for frame_id in self._frame_id_to_frame: + del self._suspended_frames_manager._variable_reference_to_frames_tracker[frame_id] + + self._frame_id_to_frame.clear() + self._frame_id_to_main_thread_id.clear() + self._thread_id_to_frame_ids.clear() + self._thread_id_to_frames_list.clear() + self._main_thread_id = None + self._suspended_frames_manager = None + self._variable_reference_to_variable.clear() + + def get_frames_list(self, thread_id): + with self._lock: + return self._thread_id_to_frames_list.get(thread_id) + + def find_frame(self, thread_id, frame_id): + with self._lock: + return self._frame_id_to_frame.get(frame_id) + + def create_thread_suspend_command(self, thread_id, stop_reason, message, trace_suspend_type, thread, additional_info): + with self._lock: + # First one is topmost frame suspended. + frames_list = self._thread_id_to_frames_list[thread_id] + + cmd = self.py_db.cmd_factory.make_thread_suspend_message( + self.py_db, thread_id, frames_list, stop_reason, message, trace_suspend_type, thread, additional_info + ) + + frames_list = None + return cmd + + +class SuspendedFramesManager(object): + def __init__(self): + self._thread_id_to_fake_frames = {} + self._thread_id_to_tracker = {} + + # Mappings + self._variable_reference_to_frames_tracker = {} + + def _get_tracker_for_variable_reference(self, variable_reference): + tracker = self._variable_reference_to_frames_tracker.get(variable_reference) + if tracker is not None: + return tracker + + for _thread_id, tracker in self._thread_id_to_tracker.items(): + try: + tracker.get_variable(variable_reference) + except KeyError: + pass + else: + return tracker + + return None + + def get_thread_id_for_variable_reference(self, variable_reference): + """ + We can't evaluate variable references values on any thread, only in the suspended + thread (the main reason for this is that in UI frameworks inspecting a UI object + from a different thread can potentially crash the application). + + :param int variable_reference: + The variable reference (can be either a frame id or a reference to a previously + gotten variable). + + :return str: + The thread id for the thread to be used to inspect the given variable reference or + None if the thread was already resumed. + """ + frames_tracker = self._get_tracker_for_variable_reference(variable_reference) + if frames_tracker is not None: + return frames_tracker.get_main_thread_id() + return None + + def get_frame_tracker(self, thread_id): + return self._thread_id_to_tracker.get(thread_id) + + def get_variable(self, variable_reference): + """ + :raises KeyError + """ + frames_tracker = self._get_tracker_for_variable_reference(variable_reference) + if frames_tracker is None: + raise KeyError() + return frames_tracker.get_variable(variable_reference) + + def get_frames_list(self, thread_id): + tracker = self._thread_id_to_tracker.get(thread_id) + if tracker is None: + return None + return tracker.get_frames_list(thread_id) + + @contextmanager + def track_frames(self, py_db): + tracker = _FramesTracker(self, py_db) + try: + yield tracker + finally: + tracker.untrack_all() + + def add_fake_frame(self, thread_id, frame_id, frame): + self._thread_id_to_fake_frames.setdefault(thread_id, {})[int(frame_id)] = frame + + def find_frame(self, thread_id, frame_id): + try: + if frame_id == "*": + return get_frame() # any frame is specified with "*" + frame_id = int(frame_id) + + fake_frames = self._thread_id_to_fake_frames.get(thread_id) + if fake_frames is not None: + frame = fake_frames.get(frame_id) + if frame is not None: + return frame + + frames_tracker = self._thread_id_to_tracker.get(thread_id) + if frames_tracker is not None: + frame = frames_tracker.find_frame(thread_id, frame_id) + if frame is not None: + return frame + + return None + except: + pydev_log.exception() + return None diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_thread_lifecycle.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_thread_lifecycle.py new file mode 100644 index 0000000..2d205c1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_thread_lifecycle.py @@ -0,0 +1,106 @@ +from _pydevd_bundle import pydevd_utils +from _pydevd_bundle.pydevd_additional_thread_info import set_additional_thread_info +from _pydevd_bundle.pydevd_comm_constants import CMD_STEP_INTO, CMD_THREAD_SUSPEND +from _pydevd_bundle.pydevd_constants import PYTHON_SUSPEND, STATE_SUSPEND, get_thread_id, STATE_RUN, PYDEVD_USE_SYS_MONITORING +from _pydev_bundle._pydev_saved_modules import threading +from _pydev_bundle import pydev_log +import sys +from _pydevd_sys_monitoring import pydevd_sys_monitoring + + +def pydevd_find_thread_by_id(thread_id): + try: + threads = threading.enumerate() + for i in threads: + tid = get_thread_id(i) + if thread_id == tid or thread_id.endswith("|" + tid): + return i + + # This can happen when a request comes for a thread which was previously removed. + pydev_log.info("Could not find thread %s.", thread_id) + pydev_log.info("Available: %s.", ([get_thread_id(t) for t in threads],)) + except: + pydev_log.exception() + + return None + + +def mark_thread_suspended(thread, stop_reason: int, original_step_cmd: int = -1): + info = set_additional_thread_info(thread) + info.suspend_type = PYTHON_SUSPEND + if original_step_cmd != -1: + stop_reason = original_step_cmd + thread.stop_reason = stop_reason + + # Note: don't set the 'pydev_original_step_cmd' here if unset. + + if info.pydev_step_cmd == -1: + # If the step command is not specified, set it to step into + # to make sure it'll break as soon as possible. + info.pydev_step_cmd = CMD_STEP_INTO + info.pydev_step_stop = None + + # Mark as suspended as the last thing. + info.pydev_state = STATE_SUSPEND + info.update_stepping_info() + return info + + +def internal_run_thread(thread, set_additional_thread_info): + info = set_additional_thread_info(thread) + info.pydev_original_step_cmd = -1 + info.pydev_step_cmd = -1 + info.pydev_step_stop = None + info.pydev_state = STATE_RUN + info.update_stepping_info() + + +def resume_threads(thread_id, except_thread=None): + pydev_log.info("Resuming threads: %s (except thread: %s)", thread_id, except_thread) + threads = [] + if thread_id == "*": + threads = pydevd_utils.get_non_pydevd_threads() + + elif thread_id.startswith("__frame__:"): + pydev_log.critical("Can't make tasklet run: %s", thread_id) + + else: + threads = [pydevd_find_thread_by_id(thread_id)] + + for t in threads: + if t is None or t is except_thread: + pydev_log.info("Skipped resuming thread: %s", t) + continue + + internal_run_thread(t, set_additional_thread_info=set_additional_thread_info) + + +def suspend_all_threads(py_db, except_thread): + """ + Suspend all except the one passed as a parameter. + :param except_thread: + """ + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.update_monitor_events(suspend_requested=True) + + pydev_log.info("Suspending all threads except: %s", except_thread) + all_threads = pydevd_utils.get_non_pydevd_threads() + for t in all_threads: + if getattr(t, "pydev_do_not_trace", None): + pass # skip some other threads, i.e. ipython history saving thread from debug console + else: + if t is except_thread: + continue + info = mark_thread_suspended(t, CMD_THREAD_SUSPEND) + frame = info.get_topmost_frame(t) + + # Reset the tracing as in this case as it could've set scopes to be untraced. + if frame is not None: + try: + py_db.set_trace_for_frame_and_parents(t.ident, frame) + finally: + frame = None + + if PYDEVD_USE_SYS_MONITORING: + # After suspending the frames we need the monitoring to be reset. + pydevd_sys_monitoring.restart_events() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_timeout.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_timeout.py new file mode 100644 index 0000000..e9c30bc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_timeout.py @@ -0,0 +1,237 @@ +from _pydev_bundle._pydev_saved_modules import ThreadingEvent, ThreadingLock, threading_current_thread +from _pydevd_bundle.pydevd_daemon_thread import PyDBDaemonThread +from _pydevd_bundle.pydevd_constants import thread_get_ident, IS_CPYTHON, NULL +import ctypes +import time +from _pydev_bundle import pydev_log +import weakref +from _pydevd_bundle.pydevd_utils import is_current_thread_main_thread +from _pydevd_bundle import pydevd_utils + +_DEBUG = False # Default should be False as this can be very verbose. + + +class _TimeoutThread(PyDBDaemonThread): + """ + The idea in this class is that it should be usually stopped waiting + for the next event to be called (paused in a threading.Event.wait). + + When a new handle is added it sets the event so that it processes the handles and + then keeps on waiting as needed again. + + This is done so that it's a bit more optimized than creating many Timer threads. + """ + + def __init__(self, py_db): + PyDBDaemonThread.__init__(self, py_db) + self._event = ThreadingEvent() + self._handles = [] + + # We could probably do things valid without this lock so that it's possible to add + # handles while processing, but the implementation would also be harder to follow, + # so, for now, we're either processing or adding handles, not both at the same time. + self._lock = ThreadingLock() + + def _on_run(self): + wait_time = None + while not self._kill_received: + if _DEBUG: + if wait_time is None: + pydev_log.critical("pydevd_timeout: Wait until a new handle is added.") + else: + pydev_log.critical("pydevd_timeout: Next wait time: %s.", wait_time) + self._event.wait(wait_time) + + if self._kill_received: + self._handles = [] + return + + wait_time = self.process_handles() + + def process_handles(self): + """ + :return int: + Returns the time we should be waiting for to process the next event properly. + """ + with self._lock: + if _DEBUG: + pydev_log.critical("pydevd_timeout: Processing handles") + self._event.clear() + handles = self._handles + new_handles = self._handles = [] + + # Do all the processing based on this time (we want to consider snapshots + # of processing time -- anything not processed now may be processed at the + # next snapshot). + curtime = time.time() + + min_handle_timeout = None + + for handle in handles: + if curtime < handle.abs_timeout and not handle.disposed: + # It still didn't time out. + if _DEBUG: + pydev_log.critical("pydevd_timeout: Handle NOT processed: %s", handle) + new_handles.append(handle) + if min_handle_timeout is None: + min_handle_timeout = handle.abs_timeout + + elif handle.abs_timeout < min_handle_timeout: + min_handle_timeout = handle.abs_timeout + + else: + if _DEBUG: + pydev_log.critical("pydevd_timeout: Handle processed: %s", handle) + # Timed out (or disposed), so, let's execute it (should be no-op if disposed). + handle.exec_on_timeout() + + if min_handle_timeout is None: + return None + else: + timeout = min_handle_timeout - curtime + if timeout <= 0: + pydev_log.critical("pydevd_timeout: Expected timeout to be > 0. Found: %s", timeout) + + return timeout + + def do_kill_pydev_thread(self): + PyDBDaemonThread.do_kill_pydev_thread(self) + with self._lock: + self._event.set() + + def add_on_timeout_handle(self, handle): + with self._lock: + self._handles.append(handle) + self._event.set() + + +class _OnTimeoutHandle(object): + def __init__(self, tracker, abs_timeout, on_timeout, kwargs): + self._str = "_OnTimeoutHandle(%s)" % (on_timeout,) + + self._tracker = weakref.ref(tracker) + self.abs_timeout = abs_timeout + self.on_timeout = on_timeout + if kwargs is None: + kwargs = {} + self.kwargs = kwargs + self.disposed = False + + def exec_on_timeout(self): + # Note: lock should already be obtained when executing this function. + kwargs = self.kwargs + on_timeout = self.on_timeout + + if not self.disposed: + self.disposed = True + self.kwargs = None + self.on_timeout = None + + try: + if _DEBUG: + pydev_log.critical("pydevd_timeout: Calling on timeout: %s with kwargs: %s", on_timeout, kwargs) + + on_timeout(**kwargs) + except Exception: + pydev_log.exception("pydevd_timeout: Exception on callback timeout.") + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + tracker = self._tracker() + + if tracker is None: + lock = NULL + else: + lock = tracker._lock + + with lock: + self.disposed = True + self.kwargs = None + self.on_timeout = None + + def __str__(self): + return self._str + + __repr__ = __str__ + + +class TimeoutTracker(object): + """ + This is a helper class to track the timeout of something. + """ + + def __init__(self, py_db): + self._thread = None + self._lock = ThreadingLock() + self._py_db = weakref.ref(py_db) + + def call_on_timeout(self, timeout, on_timeout, kwargs=None): + """ + This can be called regularly to always execute the given function after a given timeout: + + call_on_timeout(py_db, 10, on_timeout) + + + Or as a context manager to stop the method from being called if it finishes before the timeout + elapses: + + with call_on_timeout(py_db, 10, on_timeout): + ... + + Note: the callback will be called from a PyDBDaemonThread. + """ + with self._lock: + if self._thread is None: + if _DEBUG: + pydev_log.critical("pydevd_timeout: Created _TimeoutThread.") + + self._thread = _TimeoutThread(self._py_db()) + self._thread.start() + + curtime = time.time() + handle = _OnTimeoutHandle(self, curtime + timeout, on_timeout, kwargs) + if _DEBUG: + pydev_log.critical("pydevd_timeout: Added handle: %s.", handle) + self._thread.add_on_timeout_handle(handle) + return handle + + +def create_interrupt_this_thread_callback(): + """ + The idea here is returning a callback that when called will generate a KeyboardInterrupt + in the thread that called this function. + + If this is the main thread, this means that it'll emulate a Ctrl+C (which may stop I/O + and sleep operations). + + For other threads, this will call PyThreadState_SetAsyncExc to raise + a KeyboardInterrupt before the next instruction (so, it won't really interrupt I/O or + sleep operations). + + :return callable: + Returns a callback that will interrupt the current thread (this may be called + from an auxiliary thread). + """ + tid = thread_get_ident() + + if is_current_thread_main_thread(): + main_thread = threading_current_thread() + + def raise_on_this_thread(): + pydev_log.debug("Callback to interrupt main thread.") + pydevd_utils.interrupt_main_thread(main_thread) + + else: + # Note: this works in the sense that it can stop some cpu-intensive slow operation, + # but we can't really interrupt the thread out of some sleep or I/O operation + # (this will only be raised when Python is about to execute the next instruction). + def raise_on_this_thread(): + if IS_CPYTHON: + pydev_log.debug("Interrupt thread: %s", tid) + ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(KeyboardInterrupt)) + else: + pydev_log.debug("It is only possible to interrupt non-main threads in CPython.") + + return raise_on_this_thread diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch.py new file mode 100644 index 0000000..19b83e3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch.py @@ -0,0 +1,92 @@ +# Defines which version of the trace_dispatch we'll use. +# Should give warning only here if cython is not available but supported. + +import os +from _pydevd_bundle.pydevd_constants import USE_CYTHON_FLAG, ENV_TRUE_LOWER_VALUES, ENV_FALSE_LOWER_VALUES +from _pydev_bundle import pydev_log + +dirname = os.path.dirname(os.path.dirname(__file__)) +USING_CYTHON = False + + +def delete_old_compiled_extensions(): + import _pydevd_bundle + + cython_extensions_dir = os.path.dirname(os.path.dirname(_pydevd_bundle.__file__)) + _pydevd_bundle_ext_dir = os.path.dirname(_pydevd_bundle.__file__) + _pydevd_frame_eval_ext_dir = os.path.join(cython_extensions_dir, "_pydevd_frame_eval_ext") + try: + import shutil + + for file in os.listdir(_pydevd_bundle_ext_dir): + if file.startswith("pydevd") and file.endswith(".so"): + os.remove(os.path.join(_pydevd_bundle_ext_dir, file)) + for file in os.listdir(_pydevd_frame_eval_ext_dir): + if file.startswith("pydevd") and file.endswith(".so"): + os.remove(os.path.join(_pydevd_frame_eval_ext_dir, file)) + build_dir = os.path.join(cython_extensions_dir, "build") + if os.path.exists(build_dir): + shutil.rmtree(os.path.join(cython_extensions_dir, "build")) + except OSError: + pydev_log.error_once( + "warning: failed to delete old cython speedups. Please delete all *.so files from the directories " + '"%s" and "%s"' % (_pydevd_bundle_ext_dir, _pydevd_frame_eval_ext_dir) + ) + + +if USE_CYTHON_FLAG in ENV_TRUE_LOWER_VALUES: + # We must import the cython version if forcing cython + from _pydevd_bundle.pydevd_cython_wrapper import ( + trace_dispatch, + global_cache_skips, + global_cache_frame_skips, + fix_top_level_trace_and_get_trace_func, + ) + from _pydevd_bundle.pydevd_cython_wrapper import should_stop_on_exception, handle_exception, is_unhandled_exception + + USING_CYTHON = True + +elif USE_CYTHON_FLAG in ENV_FALSE_LOWER_VALUES: + # Use the regular version if not forcing cython + from _pydevd_bundle.pydevd_trace_dispatch_regular import ( + trace_dispatch, + global_cache_skips, + global_cache_frame_skips, + fix_top_level_trace_and_get_trace_func, + ) # @UnusedImport + from .pydevd_frame import should_stop_on_exception, handle_exception, is_unhandled_exception + +else: + # Regular: use fallback if not found and give message to user + try: + from _pydevd_bundle.pydevd_cython_wrapper import ( + trace_dispatch, + global_cache_skips, + global_cache_frame_skips, + fix_top_level_trace_and_get_trace_func, + ) + from _pydevd_bundle.pydevd_cython_wrapper import should_stop_on_exception, handle_exception, is_unhandled_exception + + # This version number is always available + from _pydevd_bundle.pydevd_additional_thread_info_regular import version as regular_version + + # This version number from the already compiled cython extension + from _pydevd_bundle.pydevd_cython_wrapper import version as cython_version + + if cython_version != regular_version: + # delete_old_compiled_extensions() -- would be ok in dev mode but we don't want to erase + # files from other python versions on release, so, just raise import error here. + raise ImportError("Cython version of speedups does not match.") + else: + USING_CYTHON = True + + except ImportError: + from _pydevd_bundle.pydevd_trace_dispatch_regular import ( + trace_dispatch, + global_cache_skips, + global_cache_frame_skips, + fix_top_level_trace_and_get_trace_func, + ) # @UnusedImport + from .pydevd_frame import should_stop_on_exception, handle_exception, is_unhandled_exception + + pydev_log.show_compile_cython_command_line() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch_regular.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch_regular.py new file mode 100644 index 0000000..091149c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch_regular.py @@ -0,0 +1,550 @@ +from _pydev_bundle.pydev_is_thread_alive import is_thread_alive +from _pydev_bundle.pydev_log import exception as pydev_log_exception +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle.pydevd_constants import ( + get_current_thread_id, + NO_FTRACE, + USE_CUSTOM_SYS_CURRENT_FRAMES_MAP, + ForkSafeLock, + PYDEVD_USE_SYS_MONITORING, +) +from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER + +# fmt: off +# IFDEF CYTHON +# from cpython.object cimport PyObject +# from cpython.ref cimport Py_INCREF, Py_XDECREF +# ELSE +from _pydevd_bundle.pydevd_frame import PyDBFrame, is_unhandled_exception +# ENDIF +# fmt: on + +# fmt: off +# IFDEF CYTHON +# cdef dict _global_notify_skipped_step_in +# cython_inline_constant: CMD_STEP_INTO = 107 +# cython_inline_constant: CMD_STEP_INTO_MY_CODE = 144 +# cython_inline_constant: CMD_STEP_RETURN = 109 +# cython_inline_constant: CMD_STEP_RETURN_MY_CODE = 160 +# ELSE +# Note: those are now inlined on cython. +CMD_STEP_INTO = 107 +CMD_STEP_INTO_MY_CODE = 144 +CMD_STEP_RETURN = 109 +CMD_STEP_RETURN_MY_CODE = 160 +# ENDIF +# fmt: on + +# Cache where we should keep that we completely skipped entering some context. +# It needs to be invalidated when: +# - Breakpoints are changed +# It can be used when running regularly (without step over/step in/step return) +global_cache_skips = {} +global_cache_frame_skips = {} + +_global_notify_skipped_step_in = False +_global_notify_skipped_step_in_lock = ForkSafeLock() + + +def notify_skipped_step_in_because_of_filters(py_db, frame): + global _global_notify_skipped_step_in + + with _global_notify_skipped_step_in_lock: + if _global_notify_skipped_step_in: + # Check with lock in place (callers should actually have checked + # before without the lock in place due to performance). + return + _global_notify_skipped_step_in = True + py_db.notify_skipped_step_in_because_of_filters(frame) + + +# fmt: off +# IFDEF CYTHON +# cdef class SafeCallWrapper: +# cdef method_object +# def __init__(self, method_object): +# self.method_object = method_object +# def __call__(self, *args): +# #Cannot use 'self' once inside the delegate call since we are borrowing the self reference f_trace field +# #in the frame, and that reference might get destroyed by set trace on frame and parents +# cdef PyObject* method_obj = self.method_object +# Py_INCREF(method_obj) +# ret = (method_obj)(*args) +# Py_XDECREF (method_obj) +# return SafeCallWrapper(ret) if ret is not None else None +# def get_method_object(self): +# return self.method_object +# ELSE +# ENDIF +# fmt: on + + +def fix_top_level_trace_and_get_trace_func(py_db, frame): + # fmt: off + # IFDEF CYTHON + # cdef str filename; + # cdef str name; + # cdef tuple args; + # ENDIF + # fmt: on + + # Note: this is always the first entry-point in the tracing for any thread. + # After entering here we'll set a new tracing function for this thread + # where more information is cached (and will also setup the tracing for + # frames where we should deal with unhandled exceptions). + thread = None + # Cache the frame which should be traced to deal with unhandled exceptions. + # (i.e.: thread entry-points). + + f_unhandled = frame + # print('called at', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + force_only_unhandled_tracer = False + while f_unhandled is not None: + # name = splitext(basename(f_unhandled.f_code.co_filename))[0] + + name = f_unhandled.f_code.co_filename + # basename + i = name.rfind("/") + j = name.rfind("\\") + if j > i: + i = j + if i >= 0: + name = name[i + 1 :] + # remove ext + i = name.rfind(".") + if i >= 0: + name = name[:i] + + if name == "threading": + if f_unhandled.f_code.co_name in ("__bootstrap", "_bootstrap"): + # We need __bootstrap_inner, not __bootstrap. + return None, False + + elif f_unhandled.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner"): + # Note: be careful not to use threading.currentThread to avoid creating a dummy thread. + t = f_unhandled.f_locals.get("self") + force_only_unhandled_tracer = True + if t is not None and isinstance(t, threading.Thread): + thread = t + break + + elif name == "pydev_monkey": + if f_unhandled.f_code.co_name == "__call__": + force_only_unhandled_tracer = True + break + + elif name == "pydevd": + if f_unhandled.f_code.co_name in ("run", "main"): + # We need to get to _exec + return None, False + + if f_unhandled.f_code.co_name == "_exec": + force_only_unhandled_tracer = True + break + + elif name == "pydevd_tracing": + return None, False + + elif f_unhandled.f_back is None: + break + + f_unhandled = f_unhandled.f_back + + if thread is None: + # Important: don't call threadingCurrentThread if we're in the threading module + # to avoid creating dummy threads. + if py_db.threading_get_ident is not None: + thread = py_db.threading_active.get(py_db.threading_get_ident()) + if thread is None: + return None, False + else: + # Jython does not have threading.get_ident(). + thread = py_db.threading_current_thread() + + if getattr(thread, "pydev_do_not_trace", None): + py_db.disable_tracing() + return None, False + + try: + additional_info = thread.additional_info + if additional_info is None: + raise AttributeError() + except: + additional_info = py_db.set_additional_thread_info(thread) + + # print('enter thread tracer', thread, get_current_thread_id(thread)) + args = (py_db, thread, additional_info, global_cache_skips, global_cache_frame_skips) + + if f_unhandled is not None: + if f_unhandled.f_back is None and not force_only_unhandled_tracer: + # Happens when we attach to a running program (cannot reuse instance because it's mutable). + top_level_thread_tracer = TopLevelThreadTracerNoBackFrame(ThreadTracer(args), args) + additional_info.top_level_thread_tracer_no_back_frames.append( + top_level_thread_tracer + ) # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). + else: + top_level_thread_tracer = additional_info.top_level_thread_tracer_unhandled + if top_level_thread_tracer is None: + # Stop in some internal place to report about unhandled exceptions + top_level_thread_tracer = TopLevelThreadTracerOnlyUnhandledExceptions(args) + additional_info.top_level_thread_tracer_unhandled = top_level_thread_tracer # Hack for cython to keep it alive while the thread is alive (just the method in the SetTrace is not enough). + + # print(' --> found to trace unhandled', f_unhandled.f_code.co_name, f_unhandled.f_code.co_filename, f_unhandled.f_code.co_firstlineno) + f_trace = top_level_thread_tracer.get_trace_dispatch_func() + # fmt: off + # IFDEF CYTHON + # f_trace = SafeCallWrapper(f_trace) + # ENDIF + # fmt: on + f_unhandled.f_trace = f_trace + + if frame is f_unhandled: + return f_trace, False + + thread_tracer = additional_info.thread_tracer + if thread_tracer is None or thread_tracer._args[0] is not py_db: + thread_tracer = ThreadTracer(args) + additional_info.thread_tracer = thread_tracer + + # fmt: off + # IFDEF CYTHON + # return SafeCallWrapper(thread_tracer), True + # ELSE + return thread_tracer, True + # ENDIF + # fmt: on + + +def trace_dispatch(py_db, frame, event, arg): + thread_trace_func, apply_to_settrace = py_db.fix_top_level_trace_and_get_trace_func(py_db, frame) + if thread_trace_func is None: + return None if event == "call" else NO_FTRACE + if apply_to_settrace: + py_db.enable_tracing(thread_trace_func) + return thread_trace_func(frame, event, arg) + + +# fmt: off +# IFDEF CYTHON +# cdef class TopLevelThreadTracerOnlyUnhandledExceptions: +# cdef public tuple _args; +# def __init__(self, tuple args): +# self._args = args +# ELSE +class TopLevelThreadTracerOnlyUnhandledExceptions(object): + def __init__(self, args): + self._args = args + +# ENDIF +# fmt: on + + def trace_unhandled_exceptions(self, frame, event, arg): + # Note that we ignore the frame as this tracing method should only be put in topmost frames already. + # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) + if event == "exception" and arg is not None: + py_db, t, additional_info = self._args[0:3] + if arg is not None: + if not additional_info.suspended_at_unhandled: + additional_info.suspended_at_unhandled = True + + py_db.stop_on_unhandled_exception(py_db, t, additional_info, arg) + + # No need to reset frame.f_trace to keep the same trace function. + return self.trace_unhandled_exceptions + + def get_trace_dispatch_func(self): + return self.trace_unhandled_exceptions + +# fmt: off +# IFDEF CYTHON +# cdef class TopLevelThreadTracerNoBackFrame: +# +# cdef public object _frame_trace_dispatch; +# cdef public tuple _args; +# cdef public object try_except_infos; +# cdef public object _last_exc_arg; +# cdef public set _raise_lines; +# cdef public int _last_raise_line; +# +# def __init__(self, frame_trace_dispatch, tuple args): +# self._frame_trace_dispatch = frame_trace_dispatch +# self._args = args +# self.try_except_infos = None +# self._last_exc_arg = None +# self._raise_lines = set() +# self._last_raise_line = -1 +# ELSE +class TopLevelThreadTracerNoBackFrame(object): + """ + This tracer is pretty special in that it's dealing with a frame without f_back (i.e.: top frame + on remote attach or QThread). + + This means that we have to carefully inspect exceptions to discover whether the exception will + be unhandled or not (if we're dealing with an unhandled exception we need to stop as unhandled, + otherwise we need to use the regular tracer -- unfortunately the debugger has little info to + work with in the tracing -- see: https://bugs.python.org/issue34099, so, we inspect bytecode to + determine if some exception will be traced or not... note that if this is not available -- such + as on Jython -- we consider any top-level exception to be unnhandled). + """ + + def __init__(self, frame_trace_dispatch, args): + self._frame_trace_dispatch = frame_trace_dispatch + self._args = args + self.try_except_infos = None + self._last_exc_arg = None + self._raise_lines = set() + self._last_raise_line = -1 + +# ENDIF +# fmt: on + + def trace_dispatch_and_unhandled_exceptions(self, frame, event, arg): + # DEBUG = 'code_to_debug' in frame.f_code.co_filename + # if DEBUG: print('trace_dispatch_and_unhandled_exceptions: %s %s %s %s %s %s' % (event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno, self._frame_trace_dispatch, frame.f_lineno)) + frame_trace_dispatch = self._frame_trace_dispatch + if frame_trace_dispatch is not None: + self._frame_trace_dispatch = frame_trace_dispatch(frame, event, arg) + + if event == "exception": + self._last_exc_arg = arg + self._raise_lines.add(frame.f_lineno) + self._last_raise_line = frame.f_lineno + + elif event == "return" and self._last_exc_arg is not None: + # For unhandled exceptions we actually track the return when at the topmost level. + try: + py_db, t, additional_info = self._args[0:3] + if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. + if is_unhandled_exception(self, py_db, frame, self._last_raise_line, self._raise_lines): + py_db.stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) + finally: + # Remove reference to exception after handling it. + self._last_exc_arg = None + + ret = self.trace_dispatch_and_unhandled_exceptions + + # Need to reset (the call to _frame_trace_dispatch may have changed it). + # fmt: off + # IFDEF CYTHON + # frame.f_trace = SafeCallWrapper(ret) + # ELSE + frame.f_trace = ret + # ENDIF + # fmt: on + return ret + + def get_trace_dispatch_func(self): + return self.trace_dispatch_and_unhandled_exceptions + + +# fmt: off +# IFDEF CYTHON +# cdef class ThreadTracer: +# cdef public tuple _args; +# def __init__(self, tuple args): +# self._args = args +# ELSE +class ThreadTracer(object): + def __init__(self, args): + self._args = args + +# ENDIF +# fmt: on + + def __call__(self, frame, event, arg): + """This is the callback used when we enter some context in the debugger. + + We also decorate the thread we are in with info about the debugging. + The attributes added are: + pydev_state + pydev_step_stop + pydev_step_cmd + pydev_notify_kill + + :param PyDB py_db: + This is the global debugger (this method should actually be added as a method to it). + """ + # fmt: off + # IFDEF CYTHON + # cdef str filename; + # cdef str base; + # cdef int pydev_step_cmd; + # cdef object frame_cache_key; + # cdef dict cache_skips; + # cdef bint is_stepping; + # cdef tuple abs_path_canonical_path_and_base; + # cdef PyDBAdditionalThreadInfo additional_info; + # ENDIF + # fmt: on + + # DEBUG = 'code_to_debug' in frame.f_code.co_filename + # if DEBUG: print('ENTER: trace_dispatch: %s %s %s %s' % (frame.f_code.co_filename, frame.f_lineno, event, frame.f_code.co_name)) + py_db, t, additional_info, cache_skips, frame_skips_cache = self._args + if additional_info.is_tracing: + return None if event == "call" else NO_FTRACE # we don't wan't to trace code invoked from pydevd_frame.trace_dispatch + + additional_info.is_tracing += 1 + try: + pydev_step_cmd = additional_info.pydev_step_cmd + is_stepping = pydev_step_cmd != -1 + if py_db.pydb_disposed: + return None if event == "call" else NO_FTRACE + + # if thread is not alive, cancel trace_dispatch processing + if not is_thread_alive(t): + py_db.notify_thread_not_alive(get_current_thread_id(t)) + return None if event == "call" else NO_FTRACE + + # Note: it's important that the context name is also given because we may hit something once + # in the global context and another in the local context. + frame_cache_key = frame.f_code + if frame_cache_key in cache_skips: + if not is_stepping: + # if DEBUG: print('skipped: trace_dispatch (cache hit)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + else: + # When stepping we can't take into account caching based on the breakpoints (only global filtering). + if cache_skips.get(frame_cache_key) == 1: + if ( + additional_info.pydev_original_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE) + and not _global_notify_skipped_step_in + ): + notify_skipped_step_in_because_of_filters(py_db, frame) + + back_frame = frame.f_back + if back_frame is not None and pydev_step_cmd in ( + CMD_STEP_INTO, + CMD_STEP_INTO_MY_CODE, + CMD_STEP_RETURN, + CMD_STEP_RETURN_MY_CODE, + ): + back_frame_cache_key = back_frame.f_code + if cache_skips.get(back_frame_cache_key) == 1: + # if DEBUG: print('skipped: trace_dispatch (cache hit: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + else: + # if DEBUG: print('skipped: trace_dispatch (cache hit: 2)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + + try: + # Make fast path faster! + abs_path_canonical_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + except: + abs_path_canonical_path_and_base = get_abs_path_real_path_and_base_from_frame(frame) + + file_type = py_db.get_file_type( + frame, abs_path_canonical_path_and_base + ) # we don't want to debug threading or anything related to pydevd + + if file_type is not None: + if file_type == 1: # inlining LIB_FILE = 1 + if not py_db.in_project_scope(frame, abs_path_canonical_path_and_base[0]): + # if DEBUG: print('skipped: trace_dispatch (not in scope)', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + cache_skips[frame_cache_key] = 1 + return None if event == "call" else NO_FTRACE + else: + # if DEBUG: print('skipped: trace_dispatch', abs_path_canonical_path_and_base[2], frame.f_lineno, event, frame.f_code.co_name, file_type) + cache_skips[frame_cache_key] = 1 + return None if event == "call" else NO_FTRACE + + if py_db.is_files_filter_enabled: + if py_db.apply_files_filter(frame, abs_path_canonical_path_and_base[0], False): + cache_skips[frame_cache_key] = 1 + + if ( + is_stepping + and additional_info.pydev_original_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE) + and not _global_notify_skipped_step_in + ): + notify_skipped_step_in_because_of_filters(py_db, frame) + + # A little gotcha, sometimes when we're stepping in we have to stop in a + # return event showing the back frame as the current frame, so, we need + # to check not only the current frame but the back frame too. + back_frame = frame.f_back + if back_frame is not None and pydev_step_cmd in ( + CMD_STEP_INTO, + CMD_STEP_INTO_MY_CODE, + CMD_STEP_RETURN, + CMD_STEP_RETURN_MY_CODE, + ): + if py_db.apply_files_filter(back_frame, back_frame.f_code.co_filename, False): + back_frame_cache_key = back_frame.f_code + cache_skips[back_frame_cache_key] = 1 + # if DEBUG: print('skipped: trace_dispatch (filtered out: 1)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + else: + # if DEBUG: print('skipped: trace_dispatch (filtered out: 2)', frame_cache_key, frame.f_lineno, event, frame.f_code.co_name) + return None if event == "call" else NO_FTRACE + + # if DEBUG: print('trace_dispatch', filename, frame.f_lineno, event, frame.f_code.co_name, file_type) + + # Just create PyDBFrame directly (removed support for Python versions < 2.5, which required keeping a weak + # reference to the frame). + ret = PyDBFrame( + ( + py_db, + abs_path_canonical_path_and_base, + additional_info, + t, + frame_skips_cache, + frame_cache_key, + ) + ).trace_dispatch(frame, event, arg) + if ret is None: + # 1 means skipped because of filters. + # 2 means skipped because no breakpoints were hit. + cache_skips[frame_cache_key] = 2 + return None if event == "call" else NO_FTRACE + + # fmt: off + # IFDEF CYTHON + # frame.f_trace = SafeCallWrapper(ret) # Make sure we keep the returned tracer. + # ELSE + frame.f_trace = ret # Make sure we keep the returned tracer. + # ENDIF + # fmt: on + return ret + + except SystemExit: + return None if event == "call" else NO_FTRACE + + except Exception: + if py_db.pydb_disposed: + return None if event == "call" else NO_FTRACE # Don't log errors when we're shutting down. + # Log it + try: + if pydev_log_exception is not None: + # This can actually happen during the interpreter shutdown in Python 2.7 + pydev_log_exception() + except: + # Error logging? We're really in the interpreter shutdown... + # (https://github.com/fabioz/PyDev.Debugger/issues/8) + pass + return None if event == "call" else NO_FTRACE + finally: + additional_info.is_tracing -= 1 + + +if USE_CUSTOM_SYS_CURRENT_FRAMES_MAP: + # This is far from ideal, as we'll leak frames (we'll always have the last created frame, not really + # the last topmost frame saved -- this should be Ok for our usage, but it may leak frames and things + # may live longer... as IronPython is garbage-collected, things should live longer anyways, so, it + # shouldn't be an issue as big as it's in CPython -- it may still be annoying, but this should + # be a reasonable workaround until IronPython itself is able to provide that functionality). + # + # See: https://github.com/IronLanguages/main/issues/1630 + from _pydevd_bundle.pydevd_constants import constructed_tid_to_last_frame + + _original_call = ThreadTracer.__call__ + + def __call__(self, frame, event, arg): + constructed_tid_to_last_frame[self._args[1].ident] = frame + return _original_call(self, frame, event, arg) + + ThreadTracer.__call__ = __call__ + +if PYDEVD_USE_SYS_MONITORING: + + def fix_top_level_trace_and_get_trace_func(*args, **kwargs): + raise RuntimeError("Not used in sys.monitoring mode.") diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_traceproperty.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_traceproperty.py new file mode 100644 index 0000000..c07e953 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_traceproperty.py @@ -0,0 +1,89 @@ +"""For debug purpose we are replacing actual builtin property by the debug property +""" +from _pydevd_bundle.pydevd_comm import get_global_debugger +from _pydev_bundle import pydev_log + + +# ======================================================================================================================= +# replace_builtin_property +# ======================================================================================================================= +def replace_builtin_property(new_property=None): + if new_property is None: + new_property = DebugProperty + original = property + try: + import builtins + + builtins.__dict__["property"] = new_property + except: + pydev_log.exception() # @Reimport + return original + + +# ======================================================================================================================= +# DebugProperty +# ======================================================================================================================= +class DebugProperty(object): + """A custom property which allows python property to get + controlled by the debugger and selectively disable/re-enable + the tracing. + """ + + def __init__(self, fget=None, fset=None, fdel=None, doc=None): + self.fget = fget + self.fset = fset + self.fdel = fdel + self.__doc__ = doc + + def __get__(self, obj, objtype=None): + if obj is None: + return self + global_debugger = get_global_debugger() + try: + if global_debugger is not None and global_debugger.disable_property_getter_trace: + global_debugger.disable_tracing() + if self.fget is None: + raise AttributeError("unreadable attribute") + return self.fget(obj) + finally: + if global_debugger is not None: + global_debugger.enable_tracing() + + def __set__(self, obj, value): + global_debugger = get_global_debugger() + try: + if global_debugger is not None and global_debugger.disable_property_setter_trace: + global_debugger.disable_tracing() + if self.fset is None: + raise AttributeError("can't set attribute") + self.fset(obj, value) + finally: + if global_debugger is not None: + global_debugger.enable_tracing() + + def __delete__(self, obj): + global_debugger = get_global_debugger() + try: + if global_debugger is not None and global_debugger.disable_property_deleter_trace: + global_debugger.disable_tracing() + if self.fdel is None: + raise AttributeError("can't delete attribute") + self.fdel(obj) + finally: + if global_debugger is not None: + global_debugger.enable_tracing() + + def getter(self, fget): + """Overriding getter decorator for the property""" + self.fget = fget + return self + + def setter(self, fset): + """Overriding setter decorator for the property""" + self.fset = fset + return self + + def deleter(self, fdel): + """Overriding deleter decorator for the property""" + self.fdel = fdel + return self diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_utils.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_utils.py new file mode 100644 index 0000000..4ac447d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_utils.py @@ -0,0 +1,517 @@ +from __future__ import nested_scopes +import traceback +import warnings +from _pydev_bundle import pydev_log +from _pydev_bundle._pydev_saved_modules import thread, threading +from _pydev_bundle import _pydev_saved_modules +import signal +import os +import ctypes +from importlib import import_module +from importlib.util import module_from_spec, spec_from_file_location +from urllib.parse import quote # @UnresolvedImport +import time +import inspect +import sys +from _pydevd_bundle.pydevd_constants import ( + USE_CUSTOM_SYS_CURRENT_FRAMES, + IS_PYPY, + SUPPORT_GEVENT, + GEVENT_SUPPORT_NOT_SET_MSG, + GENERATED_LEN_ATTR_NAME, + PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT, + get_global_debugger, +) + + +def save_main_module(file, module_name): + # patch provided by: Scott Schlesier - when script is run, it does not + # use globals from pydevd: + # This will prevent the pydevd script from contaminating the namespace for the script to be debugged + # pretend pydevd is not the main module, and + # convince the file to be debugged that it was loaded as main + m = sys.modules[module_name] = sys.modules["__main__"] + m.__name__ = module_name + loader = m.__loader__ if hasattr(m, "__loader__") else None + spec = spec_from_file_location("__main__", file, loader=loader) + m = module_from_spec(spec) + sys.modules["__main__"] = m + return m + + +def is_current_thread_main_thread(): + if hasattr(threading, "main_thread"): + return threading.current_thread() is threading.main_thread() + else: + return isinstance(threading.current_thread(), threading._MainThread) + + +def get_main_thread(): + if hasattr(threading, "main_thread"): + return threading.main_thread() + else: + for t in threading.enumerate(): + if isinstance(t, threading._MainThread): + return t + return None + + +def to_number(x): + if is_string(x): + try: + n = float(x) + return n + except ValueError: + pass + + l = x.find("(") + if l != -1: + y = x[0 : l - 1] + # print y + try: + n = float(y) + return n + except ValueError: + pass + return None + + +def compare_object_attrs_key(x): + if GENERATED_LEN_ATTR_NAME == x: + as_number = to_number(x) + if as_number is None: + as_number = 99999999 + # len() should appear after other attributes in a list. + return (1, as_number) + else: + return (-1, to_string(x)) + + +def is_string(x): + return isinstance(x, str) + + +def to_string(x): + if isinstance(x, str): + return x + else: + return str(x) + + +def print_exc(): + if traceback: + traceback.print_exc() + + +def quote_smart(s, safe="/"): + return quote(s, safe) + + +def get_clsname_for_code(code, frame): + clsname = None + if len(code.co_varnames) > 0: + # We are checking the first argument of the function + # (`self` or `cls` for methods). + first_arg_name = code.co_varnames[0] + if first_arg_name in frame.f_locals: + first_arg_obj = frame.f_locals[first_arg_name] + if inspect.isclass(first_arg_obj): # class method + first_arg_class = first_arg_obj + else: # instance method + if hasattr(first_arg_obj, "__class__"): + first_arg_class = first_arg_obj.__class__ + else: # old style class, fall back on type + first_arg_class = type(first_arg_obj) + func_name = code.co_name + if hasattr(first_arg_class, func_name): + method = getattr(first_arg_class, func_name) + func_code = None + if hasattr(method, "func_code"): # Python2 + func_code = method.func_code + elif hasattr(method, "__code__"): # Python3 + func_code = method.__code__ + if func_code and func_code == code: + clsname = first_arg_class.__name__ + + return clsname + + +def get_non_pydevd_threads(): + threads = threading.enumerate() + return [t for t in threads if t and not getattr(t, "is_pydev_daemon_thread", False)] + + +if USE_CUSTOM_SYS_CURRENT_FRAMES and IS_PYPY: + # On PyPy we can use its fake_frames to get the traceback + # (instead of the actual real frames that need the tracing to be correct). + _tid_to_frame_for_dump_threads = sys._current_frames +else: + from _pydevd_bundle.pydevd_constants import _current_frames as _tid_to_frame_for_dump_threads + + +def dump_threads(stream=None, show_pydevd_threads=True): + """ + Helper to dump thread info. + """ + if stream is None: + stream = sys.stderr + thread_id_to_name_and_is_pydevd_thread = {} + try: + threading_enumerate = _pydev_saved_modules.pydevd_saved_threading_enumerate + if threading_enumerate is None: + threading_enumerate = threading.enumerate + + for t in threading_enumerate(): + is_pydevd_thread = getattr(t, "is_pydev_daemon_thread", False) + thread_id_to_name_and_is_pydevd_thread[t.ident] = ( + "%s (daemon: %s, pydevd thread: %s)" % (t.name, t.daemon, is_pydevd_thread), + is_pydevd_thread, + ) + except: + pass + + stream.write("===============================================================================\n") + stream.write("Threads running\n") + stream.write("================================= Thread Dump =================================\n") + stream.flush() + + for thread_id, frame in _tid_to_frame_for_dump_threads().items(): + name, is_pydevd_thread = thread_id_to_name_and_is_pydevd_thread.get(thread_id, (thread_id, False)) + if not show_pydevd_threads and is_pydevd_thread: + continue + + stream.write("\n-------------------------------------------------------------------------------\n") + stream.write(" Thread %s" % (name,)) + stream.write("\n\n") + + for i, (filename, lineno, name, line) in enumerate(traceback.extract_stack(frame)): + stream.write(' File "%s", line %d, in %s\n' % (filename, lineno, name)) + if line: + stream.write(" %s\n" % (line.strip())) + + if i == 0 and "self" in frame.f_locals: + stream.write(" self: ") + try: + stream.write(str(frame.f_locals["self"])) + except: + stream.write("Unable to get str of: %s" % (type(frame.f_locals["self"]),)) + stream.write("\n") + stream.flush() + + stream.write("\n=============================== END Thread Dump ===============================") + stream.flush() + + +def _extract_variable_nested_braces(char_iter): + expression = [] + level = 0 + for c in char_iter: + if c == "{": + level += 1 + if c == "}": + level -= 1 + if level == -1: + return "".join(expression).strip() + expression.append(c) + raise SyntaxError("Unbalanced braces in expression.") + + +def _extract_expression_list(log_message): + # Note: not using re because of nested braces. + expression = [] + expression_vars = [] + char_iter = iter(log_message) + for c in char_iter: + if c == "{": + expression_var = _extract_variable_nested_braces(char_iter) + if expression_var: + expression.append("%s") + expression_vars.append(expression_var) + else: + expression.append(c) + + expression = "".join(expression) + return expression, expression_vars + + +def convert_dap_log_message_to_expression(log_message): + try: + expression, expression_vars = _extract_expression_list(log_message) + except SyntaxError: + return repr("Unbalanced braces in: %s" % (log_message)) + if not expression_vars: + return repr(expression) + # Note: use '%' to be compatible with Python 2.6. + return repr(expression) + " % (" + ", ".join(str(x) for x in expression_vars) + ",)" + + +def notify_about_gevent_if_needed(stream=None): + """ + When debugging with gevent check that the gevent flag is used if the user uses the gevent + monkey-patching. + + :return bool: + Returns True if a message had to be shown to the user and False otherwise. + """ + stream = stream if stream is not None else sys.stderr + if not SUPPORT_GEVENT: + gevent_monkey = sys.modules.get("gevent.monkey") + if gevent_monkey is not None: + try: + saved = gevent_monkey.saved + except AttributeError: + pydev_log.exception_once("Error checking for gevent monkey-patching.") + return False + + if saved: + # Note: print to stderr as it may deadlock the debugger. + sys.stderr.write("%s\n" % (GEVENT_SUPPORT_NOT_SET_MSG,)) + return True + + return False + + +def hasattr_checked(obj, name): + try: + getattr(obj, name) + except: + # i.e.: Handle any exception, not only AttributeError. + return False + else: + return True + + +def getattr_checked(obj, name): + try: + return getattr(obj, name) + except: + # i.e.: Handle any exception, not only AttributeError. + return None + + +def dir_checked(obj): + try: + return dir(obj) + except: + return [] + + +def isinstance_checked(obj, cls): + try: + return isinstance(obj, cls) + except: + return False + + +class ScopeRequest(object): + __slots__ = ["variable_reference", "scope"] + + def __init__(self, variable_reference, scope): + assert scope in ("globals", "locals") + self.variable_reference = variable_reference + self.scope = scope + + def __eq__(self, o): + if isinstance(o, ScopeRequest): + return self.variable_reference == o.variable_reference and self.scope == o.scope + + return False + + def __ne__(self, o): + return not self == o + + def __hash__(self): + return hash((self.variable_reference, self.scope)) + + +class DAPGrouper(object): + """ + Note: this is a helper class to group variables on the debug adapter protocol (DAP). For + the xml protocol the type is just added to each variable and the UI can group/hide it as needed. + """ + + SCOPE_SPECIAL_VARS = "special variables" + SCOPE_PROTECTED_VARS = "protected variables" + SCOPE_FUNCTION_VARS = "function variables" + SCOPE_CLASS_VARS = "class variables" + + SCOPES_SORTED = [ + SCOPE_SPECIAL_VARS, + SCOPE_PROTECTED_VARS, + SCOPE_FUNCTION_VARS, + SCOPE_CLASS_VARS, + ] + + __slots__ = ["variable_reference", "scope", "contents_debug_adapter_protocol"] + + def __init__(self, scope): + self.variable_reference = id(self) + self.scope = scope + self.contents_debug_adapter_protocol = [] + + def get_contents_debug_adapter_protocol(self): + return self.contents_debug_adapter_protocol[:] + + def __eq__(self, o): + if isinstance(o, ScopeRequest): + return self.variable_reference == o.variable_reference and self.scope == o.scope + + return False + + def __ne__(self, o): + return not self == o + + def __hash__(self): + return hash((self.variable_reference, self.scope)) + + def __repr__(self): + return "" + + def __str__(self): + return "" + + +def interrupt_main_thread(main_thread=None): + """ + Generates a KeyboardInterrupt in the main thread by sending a Ctrl+C + or by calling thread.interrupt_main(). + + :param main_thread: + Needed because Jython needs main_thread._thread.interrupt() to be called. + + Note: if unable to send a Ctrl+C, the KeyboardInterrupt will only be raised + when the next Python instruction is about to be executed (so, it won't interrupt + a sleep(1000)). + """ + if main_thread is None: + main_thread = threading.main_thread() + + pydev_log.debug("Interrupt main thread.") + called = False + try: + if os.name == "posix": + # On Linux we can't interrupt 0 as in Windows because it's + # actually owned by a process -- on the good side, signals + # work much better on Linux! + os.kill(os.getpid(), signal.SIGINT) + called = True + + elif os.name == "nt": + # This generates a Ctrl+C only for the current process and not + # to the process group! + # Note: there doesn't seem to be any public documentation for this + # function (although it seems to be present from Windows Server 2003 SP1 onwards + # according to: https://www.geoffchappell.com/studies/windows/win32/kernel32/api/index.htm) + ctypes.windll.kernel32.CtrlRoutine(0) + + # The code below is deprecated because it actually sends a Ctrl+C + # to the process group, so, if this was a process created without + # passing `CREATE_NEW_PROCESS_GROUP` the signal may be sent to the + # parent process and to sub-processes too (which is not ideal -- + # for instance, when using pytest-xdist, it'll actually stop the + # testing, even when called in the subprocess). + + # if hasattr_checked(signal, 'CTRL_C_EVENT'): + # os.kill(0, signal.CTRL_C_EVENT) + # else: + # # Python 2.6 + # ctypes.windll.kernel32.GenerateConsoleCtrlEvent(0, 0) + called = True + + except: + # If something went wrong, fallback to interrupting when the next + # Python instruction is being called. + pydev_log.exception("Error interrupting main thread (using fallback).") + + if not called: + try: + # In this case, we don't really interrupt a sleep() nor IO operations + # (this makes the KeyboardInterrupt be sent only when the next Python + # instruction is about to be executed). + if hasattr(thread, "interrupt_main"): + thread.interrupt_main() + else: + main_thread._thread.interrupt() # Jython + except: + pydev_log.exception("Error on interrupt main thread fallback.") + + +class Timer(object): + def __init__(self, min_diff=PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT): + self.min_diff = min_diff + self._curr_time = time.time() + + def print_time(self, msg="Elapsed:"): + old = self._curr_time + new = self._curr_time = time.time() + diff = new - old + if diff >= self.min_diff: + print("%s: %.2fs" % (msg, diff)) + + def _report_slow(self, compute_msg, *args): + old = self._curr_time + new = self._curr_time = time.time() + diff = new - old + if diff >= self.min_diff: + py_db = get_global_debugger() + if py_db is not None: + msg = compute_msg(diff, *args) + py_db.writer.add_command(py_db.cmd_factory.make_warning_message(msg)) + + def report_if_compute_repr_attr_slow(self, attrs_tab_separated, attr_name, attr_type): + self._report_slow(self._compute_repr_slow, attrs_tab_separated, attr_name, attr_type) + + def _compute_repr_slow(self, diff, attrs_tab_separated, attr_name, attr_type): + try: + attr_type = attr_type.__name__ + except: + pass + if attrs_tab_separated: + return ( + "pydevd warning: Computing repr of %s.%s (%s) was slow (took %.2fs).\n" + "Customize report timeout by setting the `PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT` environment variable to a higher timeout (default is: %ss)\n" + ) % (attrs_tab_separated.replace("\t", "."), attr_name, attr_type, diff, PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT) + else: + return ( + "pydevd warning: Computing repr of %s (%s) was slow (took %.2fs)\n" + "Customize report timeout by setting the `PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT` environment variable to a higher timeout (default is: %ss)\n" + ) % (attr_name, attr_type, diff, PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT) + + def report_if_getting_attr_slow(self, cls, attr_name): + self._report_slow(self._compute_get_attr_slow, cls, attr_name) + + def _compute_get_attr_slow(self, diff, cls, attr_name): + try: + cls = cls.__name__ + except: + pass + return ( + "pydevd warning: Getting attribute %s.%s was slow (took %.2fs)\n" + "Customize report timeout by setting the `PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT` environment variable to a higher timeout (default is: %ss)\n" + ) % (cls, attr_name, diff, PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT) + + +def import_attr_from_module(import_with_attr_access): + if "." not in import_with_attr_access: + # We need at least one '.' (we don't support just the module import, we need the attribute access too). + raise ImportError("Unable to import module with attr access: %s" % (import_with_attr_access,)) + + module_name, attr_name = import_with_attr_access.rsplit(".", 1) + + while True: + try: + mod = import_module(module_name) + except ImportError: + if "." not in module_name: + raise ImportError("Unable to import module with attr access: %s" % (import_with_attr_access,)) + + module_name, new_attr_part = module_name.rsplit(".", 1) + attr_name = new_attr_part + "." + attr_name + else: + # Ok, we got the base module, now, get the attribute we need. + try: + for attr in attr_name.split("."): + mod = getattr(mod, attr) + return mod + except: + raise ImportError("Unable to import module with attr access: %s" % (import_with_attr_access,)) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vars.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vars.py new file mode 100644 index 0000000..8ec4dec --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vars.py @@ -0,0 +1,852 @@ +""" pydevd_vars deals with variables: + resolution/conversion to XML. +""" +import pickle +from _pydevd_bundle.pydevd_constants import get_frame, get_current_thread_id, iter_chars, silence_warnings_decorator, get_global_debugger + +from _pydevd_bundle.pydevd_xml import ExceptionOnEvaluate, get_type, var_to_xml +from _pydev_bundle import pydev_log +import functools +from _pydevd_bundle.pydevd_thread_lifecycle import resume_threads, mark_thread_suspended, suspend_all_threads +from _pydevd_bundle.pydevd_comm_constants import CMD_SET_BREAK + +import sys # @Reimport + +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle import pydevd_save_locals, pydevd_timeout, pydevd_constants +from _pydev_bundle.pydev_imports import Exec, execfile +from _pydevd_bundle.pydevd_utils import to_string +import inspect +from _pydevd_bundle.pydevd_daemon_thread import PyDBDaemonThread +from _pydevd_bundle.pydevd_save_locals import update_globals_and_locals +from functools import lru_cache + +SENTINEL_VALUE = [] + + +class VariableError(RuntimeError): + pass + + +def iter_frames(frame): + while frame is not None: + yield frame + frame = frame.f_back + frame = None + + +def dump_frames(thread_id): + sys.stdout.write("dumping frames\n") + if thread_id != get_current_thread_id(threading.current_thread()): + raise VariableError("find_frame: must execute on same thread") + + frame = get_frame() + for frame in iter_frames(frame): + sys.stdout.write("%s\n" % pickle.dumps(frame)) + + +@silence_warnings_decorator +def getVariable(dbg, thread_id, frame_id, scope, locator): + """ + returns the value of a variable + + :scope: can be BY_ID, EXPRESSION, GLOBAL, LOCAL, FRAME + + BY_ID means we'll traverse the list of all objects alive to get the object. + + :locator: after reaching the proper scope, we have to get the attributes until we find + the proper location (i.e.: obj\tattr1\tattr2) + + :note: when BY_ID is used, the frame_id is considered the id of the object to find and + not the frame (as we don't care about the frame in this case). + """ + if scope == "BY_ID": + if thread_id != get_current_thread_id(threading.current_thread()): + raise VariableError("getVariable: must execute on same thread") + + try: + import gc + + objects = gc.get_objects() + except: + pass # Not all python variants have it. + else: + frame_id = int(frame_id) + for var in objects: + if id(var) == frame_id: + if locator is not None: + locator_parts = locator.split("\t") + for k in locator_parts: + _type, _type_name, resolver = get_type(var) + var = resolver.resolve(var, k) + + return var + + # If it didn't return previously, we coudn't find it by id (i.e.: already garbage collected). + sys.stderr.write("Unable to find object with id: %s\n" % (frame_id,)) + return None + + frame = dbg.find_frame(thread_id, frame_id) + if frame is None: + return {} + + if locator is not None: + locator_parts = locator.split("\t") + else: + locator_parts = [] + + for attr in locator_parts: + attr.replace("@_@TAB_CHAR@_@", "\t") + + if scope == "EXPRESSION": + for count in range(len(locator_parts)): + if count == 0: + # An Expression can be in any scope (globals/locals), therefore it needs to evaluated as an expression + var = evaluate_expression(dbg, frame, locator_parts[count], False) + else: + _type, _type_name, resolver = get_type(var) + var = resolver.resolve(var, locator_parts[count]) + else: + if scope == "GLOBAL": + var = frame.f_globals + del locator_parts[0] # globals are special, and they get a single dummy unused attribute + else: + # in a frame access both locals and globals as Python does + var = {} + var.update(frame.f_globals) + var.update(frame.f_locals) + + for k in locator_parts: + _type, _type_name, resolver = get_type(var) + var = resolver.resolve(var, k) + + return var + + +def resolve_compound_variable_fields(dbg, thread_id, frame_id, scope, attrs): + """ + Resolve compound variable in debugger scopes by its name and attributes + + :param thread_id: id of the variable's thread + :param frame_id: id of the variable's frame + :param scope: can be BY_ID, EXPRESSION, GLOBAL, LOCAL, FRAME + :param attrs: after reaching the proper scope, we have to get the attributes until we find + the proper location (i.e.: obj\tattr1\tattr2) + :return: a dictionary of variables's fields + """ + + var = getVariable(dbg, thread_id, frame_id, scope, attrs) + + try: + _type, type_name, resolver = get_type(var) + return type_name, resolver.get_dictionary(var) + except: + pydev_log.exception("Error evaluating: thread_id: %s\nframe_id: %s\nscope: %s\nattrs: %s.", thread_id, frame_id, scope, attrs) + + +def resolve_var_object(var, attrs): + """ + Resolve variable's attribute + + :param var: an object of variable + :param attrs: a sequence of variable's attributes separated by \t (i.e.: obj\tattr1\tattr2) + :return: a value of resolved variable's attribute + """ + if attrs is not None: + attr_list = attrs.split("\t") + else: + attr_list = [] + for k in attr_list: + type, _type_name, resolver = get_type(var) + var = resolver.resolve(var, k) + return var + + +def resolve_compound_var_object_fields(var, attrs): + """ + Resolve compound variable by its object and attributes + + :param var: an object of variable + :param attrs: a sequence of variable's attributes separated by \t (i.e.: obj\tattr1\tattr2) + :return: a dictionary of variables's fields + """ + attr_list = attrs.split("\t") + + for k in attr_list: + type, _type_name, resolver = get_type(var) + var = resolver.resolve(var, k) + + try: + type, _type_name, resolver = get_type(var) + return resolver.get_dictionary(var) + except: + pydev_log.exception() + + +def custom_operation(dbg, thread_id, frame_id, scope, attrs, style, code_or_file, operation_fn_name): + """ + We'll execute the code_or_file and then search in the namespace the operation_fn_name to execute with the given var. + + code_or_file: either some code (i.e.: from pprint import pprint) or a file to be executed. + operation_fn_name: the name of the operation to execute after the exec (i.e.: pprint) + """ + expressionValue = getVariable(dbg, thread_id, frame_id, scope, attrs) + + try: + namespace = {"__name__": ""} + if style == "EXECFILE": + namespace["__file__"] = code_or_file + execfile(code_or_file, namespace, namespace) + else: # style == EXEC + namespace["__file__"] = "" + Exec(code_or_file, namespace, namespace) + + return str(namespace[operation_fn_name](expressionValue)) + except: + pydev_log.exception() + + +@lru_cache(3) +def _expression_to_evaluate(expression): + keepends = True + lines = expression.splitlines(keepends) + # find first non-empty line + chars_to_strip = 0 + for line in lines: + if line.strip(): # i.e.: check first non-empty line + for c in iter_chars(line): + if c.isspace(): + chars_to_strip += 1 + else: + break + break + + if chars_to_strip: + # I.e.: check that the chars we'll remove are really only whitespaces. + proceed = True + new_lines = [] + for line in lines: + if not proceed: + break + for c in iter_chars(line[:chars_to_strip]): + if not c.isspace(): + proceed = False + break + + new_lines.append(line[chars_to_strip:]) + + if proceed: + if isinstance(expression, bytes): + expression = b"".join(new_lines) + else: + expression = "".join(new_lines) + + return expression + + +def eval_in_context(expression, global_vars, local_vars, py_db=None): + result = None + try: + compiled = compile_as_eval(expression) + is_async = inspect.CO_COROUTINE & compiled.co_flags == inspect.CO_COROUTINE + + if is_async: + if py_db is None: + py_db = get_global_debugger() + if py_db is None: + raise RuntimeError("Cannot evaluate async without py_db.") + t = _EvalAwaitInNewEventLoop(py_db, compiled, global_vars, local_vars) + t.start() + t.join() + + if t.exc: + raise t.exc[1].with_traceback(t.exc[2]) + else: + result = t.evaluated_value + else: + result = eval(compiled, global_vars, local_vars) + except (Exception, KeyboardInterrupt): + etype, result, tb = sys.exc_info() + result = ExceptionOnEvaluate(result, etype, tb) + + # Ok, we have the initial error message, but let's see if we're dealing with a name mangling error... + try: + if ".__" in expression: + # Try to handle '__' name mangling (for simple cases such as self.__variable.__another_var). + split = expression.split(".") + entry = split[0] + + if local_vars is None: + local_vars = global_vars + curr = local_vars[entry] # Note: we want the KeyError if it's not there. + for entry in split[1:]: + if entry.startswith("__") and not hasattr(curr, entry): + entry = "_%s%s" % (curr.__class__.__name__, entry) + curr = getattr(curr, entry) + + result = curr + except: + pass + return result + + +def _run_with_interrupt_thread(original_func, py_db, curr_thread, frame, expression, is_exec): + on_interrupt_threads = None + timeout_tracker = py_db.timeout_tracker # : :type timeout_tracker: TimeoutTracker + + interrupt_thread_timeout = pydevd_constants.PYDEVD_INTERRUPT_THREAD_TIMEOUT + + if interrupt_thread_timeout > 0: + on_interrupt_threads = pydevd_timeout.create_interrupt_this_thread_callback() + pydev_log.info("Doing evaluate with interrupt threads timeout: %s.", interrupt_thread_timeout) + + if on_interrupt_threads is None: + return original_func(py_db, frame, expression, is_exec) + else: + with timeout_tracker.call_on_timeout(interrupt_thread_timeout, on_interrupt_threads): + return original_func(py_db, frame, expression, is_exec) + + +def _run_with_unblock_threads(original_func, py_db, curr_thread, frame, expression, is_exec): + on_timeout_unblock_threads = None + timeout_tracker = py_db.timeout_tracker # : :type timeout_tracker: TimeoutTracker + + if py_db.multi_threads_single_notification: + unblock_threads_timeout = pydevd_constants.PYDEVD_UNBLOCK_THREADS_TIMEOUT + else: + unblock_threads_timeout = -1 # Don't use this if threads are managed individually. + + if unblock_threads_timeout >= 0: + pydev_log.info("Doing evaluate with unblock threads timeout: %s.", unblock_threads_timeout) + tid = get_current_thread_id(curr_thread) + + def on_timeout_unblock_threads(): + on_timeout_unblock_threads.called = True + pydev_log.info("Resuming threads after evaluate timeout.") + resume_threads("*", except_thread=curr_thread) + py_db.threads_suspended_single_notification.on_thread_resume(tid, curr_thread) + + on_timeout_unblock_threads.called = False + + try: + if on_timeout_unblock_threads is None: + return _run_with_interrupt_thread(original_func, py_db, curr_thread, frame, expression, is_exec) + else: + with timeout_tracker.call_on_timeout(unblock_threads_timeout, on_timeout_unblock_threads): + return _run_with_interrupt_thread(original_func, py_db, curr_thread, frame, expression, is_exec) + + finally: + if on_timeout_unblock_threads is not None and on_timeout_unblock_threads.called: + mark_thread_suspended(curr_thread, CMD_SET_BREAK) + py_db.threads_suspended_single_notification.increment_suspend_time() + suspend_all_threads(py_db, except_thread=curr_thread) + py_db.threads_suspended_single_notification.on_thread_suspend(tid, curr_thread, CMD_SET_BREAK) + + +def _evaluate_with_timeouts(original_func): + """ + Provides a decorator that wraps the original evaluate to deal with slow evaluates. + + If some evaluation is too slow, we may show a message, resume threads or interrupt them + as needed (based on the related configurations). + """ + + @functools.wraps(original_func) + def new_func(py_db, frame, expression, is_exec): + if py_db is None: + # Only for testing... + pydev_log.critical("_evaluate_with_timeouts called without py_db!") + return original_func(py_db, frame, expression, is_exec) + warn_evaluation_timeout = pydevd_constants.PYDEVD_WARN_EVALUATION_TIMEOUT + curr_thread = threading.current_thread() + + def on_warn_evaluation_timeout(): + py_db.writer.add_command(py_db.cmd_factory.make_evaluation_timeout_msg(py_db, expression, curr_thread)) + + timeout_tracker = py_db.timeout_tracker # : :type timeout_tracker: TimeoutTracker + with timeout_tracker.call_on_timeout(warn_evaluation_timeout, on_warn_evaluation_timeout): + return _run_with_unblock_threads(original_func, py_db, curr_thread, frame, expression, is_exec) + + return new_func + + +_ASYNC_COMPILE_FLAGS = None +try: + from ast import PyCF_ALLOW_TOP_LEVEL_AWAIT + + _ASYNC_COMPILE_FLAGS = PyCF_ALLOW_TOP_LEVEL_AWAIT +except: + pass + + +def compile_as_eval(expression): + """ + + :param expression: + The expression to be _compiled. + + :return: code object + + :raises Exception if the expression cannot be evaluated. + """ + expression_to_evaluate = _expression_to_evaluate(expression) + if _ASYNC_COMPILE_FLAGS is not None: + return compile(expression_to_evaluate, "", "eval", _ASYNC_COMPILE_FLAGS) + else: + return compile(expression_to_evaluate, "", "eval") + + +def _compile_as_exec(expression): + """ + + :param expression: + The expression to be _compiled. + + :return: code object + + :raises Exception if the expression cannot be evaluated. + """ + expression_to_evaluate = _expression_to_evaluate(expression) + if _ASYNC_COMPILE_FLAGS is not None: + return compile(expression_to_evaluate, "", "exec", _ASYNC_COMPILE_FLAGS) + else: + return compile(expression_to_evaluate, "", "exec") + + +class _EvalAwaitInNewEventLoop(PyDBDaemonThread): + def __init__(self, py_db, compiled, updated_globals, updated_locals): + PyDBDaemonThread.__init__(self, py_db) + self._compiled = compiled + self._updated_globals = updated_globals + self._updated_locals = updated_locals + + # Output + self.evaluated_value = None + self.exc = None + + async def _async_func(self): + return await eval(self._compiled, self._updated_locals, self._updated_globals) + + def _on_run(self): + try: + import asyncio + + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + self.evaluated_value = asyncio.run(self._async_func()) + except: + self.exc = sys.exc_info() + + +@_evaluate_with_timeouts +def evaluate_expression(py_db, frame, expression, is_exec): + """ + :param str expression: + The expression to be evaluated. + + Note that if the expression is indented it's automatically dedented (based on the indentation + found on the first non-empty line). + + i.e.: something as: + + ` + def method(): + a = 1 + ` + + becomes: + + ` + def method(): + a = 1 + ` + + Also, it's possible to evaluate calls with a top-level await (currently this is done by + creating a new event loop in a new thread and making the evaluate at that thread -- note + that this is still done synchronously so the evaluation has to finish before this + function returns). + + :param is_exec: determines if we should do an exec or an eval. + There are some changes in this function depending on whether it's an exec or an eval. + + When it's an exec (i.e.: is_exec==True): + This function returns None. + Any exception that happens during the evaluation is reraised. + If the expression could actually be evaluated, the variable is printed to the console if not None. + + When it's an eval (i.e.: is_exec==False): + This function returns the result from the evaluation. + If some exception happens in this case, the exception is caught and a ExceptionOnEvaluate is returned. + Also, in this case we try to resolve name-mangling (i.e.: to be able to add a self.__my_var watch). + + :param py_db: + The debugger. Only needed if some top-level await is detected (for creating a + PyDBDaemonThread). + """ + if frame is None: + return + + # This is very tricky. Some statements can change locals and use them in the same + # call (see https://github.com/microsoft/debugpy/issues/815), also, if locals and globals are + # passed separately, it's possible that one gets updated but apparently Python will still + # try to load from the other, so, what's done is that we merge all in a single dict and + # then go on and update the frame with the results afterwards. + + # -- see tests in test_evaluate_expression.py + + # This doesn't work because the variables aren't updated in the locals in case the + # evaluation tries to set a variable and use it in the same expression. + # updated_globals = frame.f_globals + # updated_locals = frame.f_locals + + # This doesn't work because the variables aren't updated in the locals in case the + # evaluation tries to set a variable and use it in the same expression. + # updated_globals = {} + # updated_globals.update(frame.f_globals) + # updated_globals.update(frame.f_locals) + # + # updated_locals = frame.f_locals + + # This doesn't work either in the case where the evaluation tries to set a variable and use + # it in the same expression (I really don't know why as it seems like this *should* work + # in theory but doesn't in practice). + # updated_globals = {} + # updated_globals.update(frame.f_globals) + # + # updated_locals = {} + # updated_globals.update(frame.f_locals) + + # This is the only case that worked consistently to run the tests in test_evaluate_expression.py + # It's a bit unfortunate because although the exec works in this case, we have to manually + # put the updates in the frame locals afterwards. + updated_globals = {} + updated_globals.update(frame.f_globals) + updated_globals.update(frame.f_locals) + if "globals" not in updated_globals: + # If the user explicitly uses 'globals()' then we provide the + # frame globals (unless he has shadowed it already). + updated_globals["globals"] = lambda: frame.f_globals + + initial_globals = updated_globals.copy() + + updated_locals = None + + try: + expression = expression.replace("@LINE@", "\n") + + if is_exec: + try: + # Try to make it an eval (if it is an eval we can print it, otherwise we'll exec it and + # it will have whatever the user actually did) + compiled = compile_as_eval(expression) + except Exception: + compiled = None + + if compiled is None: + try: + compiled = _compile_as_exec(expression) + is_async = inspect.CO_COROUTINE & compiled.co_flags == inspect.CO_COROUTINE + if is_async: + t = _EvalAwaitInNewEventLoop(py_db, compiled, updated_globals, updated_locals) + t.start() + t.join() + + if t.exc: + raise t.exc[1].with_traceback(t.exc[2]) + else: + Exec(compiled, updated_globals, updated_locals) + finally: + # Update the globals even if it errored as it may have partially worked. + update_globals_and_locals(updated_globals, initial_globals, frame) + else: + is_async = inspect.CO_COROUTINE & compiled.co_flags == inspect.CO_COROUTINE + if is_async: + t = _EvalAwaitInNewEventLoop(py_db, compiled, updated_globals, updated_locals) + t.start() + t.join() + + if t.exc: + raise t.exc[1].with_traceback(t.exc[2]) + else: + result = t.evaluated_value + else: + result = eval(compiled, updated_globals, updated_locals) + if result is not None: # Only print if it's not None (as python does) + sys.stdout.write("%s\n" % (result,)) + return + + else: + ret = eval_in_context(expression, updated_globals, updated_locals, py_db) + try: + is_exception_returned = ret.__class__ == ExceptionOnEvaluate + except: + pass + else: + if not is_exception_returned: + # i.e.: by using a walrus assignment (:=), expressions can change the locals, + # so, make sure that we save the locals back to the frame. + update_globals_and_locals(updated_globals, initial_globals, frame) + return ret + finally: + # Should not be kept alive if an exception happens and this frame is kept in the stack. + del updated_globals + del updated_locals + del initial_globals + del frame + + +def change_attr_expression(frame, attr, expression, dbg, value=SENTINEL_VALUE): + """Changes some attribute in a given frame.""" + if frame is None: + return + + try: + expression = expression.replace("@LINE@", "\n") + + if dbg.plugin and value is SENTINEL_VALUE: + result = dbg.plugin.change_variable(frame, attr, expression) + if result is not dbg.plugin.EMPTY_SENTINEL: + return result + + if attr[:7] == "Globals": + attr = attr[8:] + if attr in frame.f_globals: + if value is SENTINEL_VALUE: + value = eval(expression, frame.f_globals, frame.f_locals) + frame.f_globals[attr] = value + return frame.f_globals[attr] + else: + if "." not in attr: # i.e.: if we have a '.', we're changing some attribute of a local var. + if pydevd_save_locals.is_save_locals_available(): + if value is SENTINEL_VALUE: + value = eval(expression, frame.f_globals, frame.f_locals) + frame.f_locals[attr] = value + pydevd_save_locals.save_locals(frame) + return frame.f_locals[attr] + + # i.e.: case with '.' or save locals not available (just exec the assignment in the frame). + if value is SENTINEL_VALUE: + value = eval(expression, frame.f_globals, frame.f_locals) + result = value + Exec("%s=%s" % (attr, expression), frame.f_globals, frame.f_locals) + return result + + except Exception: + pydev_log.exception() + + +MAXIMUM_ARRAY_SIZE = 100 +MAX_SLICE_SIZE = 1000 + + +def table_like_struct_to_xml(array, name, roffset, coffset, rows, cols, format): + _, type_name, _ = get_type(array) + if type_name == "ndarray": + array, metaxml, r, c, f = array_to_meta_xml(array, name, format) + xml = metaxml + format = "%" + f + if rows == -1 and cols == -1: + rows = r + cols = c + xml += array_to_xml(array, roffset, coffset, rows, cols, format) + elif type_name == "DataFrame": + xml = dataframe_to_xml(array, name, roffset, coffset, rows, cols, format) + else: + raise VariableError("Do not know how to convert type %s to table" % (type_name)) + + return "%s" % xml + + +def array_to_xml(array, roffset, coffset, rows, cols, format): + xml = "" + rows = min(rows, MAXIMUM_ARRAY_SIZE) + cols = min(cols, MAXIMUM_ARRAY_SIZE) + + # there is no obvious rule for slicing (at least 5 choices) + if len(array) == 1 and (rows > 1 or cols > 1): + array = array[0] + if array.size > len(array): + array = array[roffset:, coffset:] + rows = min(rows, len(array)) + cols = min(cols, len(array[0])) + if len(array) == 1: + array = array[0] + elif array.size == len(array): + if roffset == 0 and rows == 1: + array = array[coffset:] + cols = min(cols, len(array)) + elif coffset == 0 and cols == 1: + array = array[roffset:] + rows = min(rows, len(array)) + + xml += '' % (rows, cols) + for row in range(rows): + xml += '' % to_string(row) + for col in range(cols): + value = array + if rows == 1 or cols == 1: + if rows == 1 and cols == 1: + value = array[0] + else: + if rows == 1: + dim = col + else: + dim = row + value = array[dim] + if "ndarray" in str(type(value)): + value = value[0] + else: + value = array[row][col] + value = format % value + xml += var_to_xml(value, "") + return xml + + +def array_to_meta_xml(array, name, format): + type = array.dtype.kind + slice = name + l = len(array.shape) + + # initial load, compute slice + if format == "%": + if l > 2: + slice += "[0]" * (l - 2) + for r in range(l - 2): + array = array[0] + if type == "f": + format = ".5f" + elif type == "i" or type == "u": + format = "d" + else: + format = "s" + else: + format = format.replace("%", "") + + l = len(array.shape) + reslice = "" + if l > 2: + raise Exception("%s has more than 2 dimensions." % slice) + elif l == 1: + # special case with 1D arrays arr[i, :] - row, but arr[:, i] - column with equal shape and ndim + # http://stackoverflow.com/questions/16837946/numpy-a-2-rows-1-column-file-loadtxt-returns-1row-2-columns + # explanation: http://stackoverflow.com/questions/15165170/how-do-i-maintain-row-column-orientation-of-vectors-in-numpy?rq=1 + # we use kind of a hack - get information about memory from C_CONTIGUOUS + is_row = array.flags["C_CONTIGUOUS"] + + if is_row: + rows = 1 + cols = min(len(array), MAX_SLICE_SIZE) + if cols < len(array): + reslice = "[0:%s]" % (cols) + array = array[0:cols] + else: + cols = 1 + rows = min(len(array), MAX_SLICE_SIZE) + if rows < len(array): + reslice = "[0:%s]" % (rows) + array = array[0:rows] + elif l == 2: + rows = min(array.shape[-2], MAX_SLICE_SIZE) + cols = min(array.shape[-1], MAX_SLICE_SIZE) + if cols < array.shape[-1] or rows < array.shape[-2]: + reslice = "[0:%s, 0:%s]" % (rows, cols) + array = array[0:rows, 0:cols] + + # avoid slice duplication + if not slice.endswith(reslice): + slice += reslice + + bounds = (0, 0) + if type in "biufc": + bounds = (array.min(), array.max()) + xml = '' % ( + slice, + rows, + cols, + format, + type, + bounds[1], + bounds[0], + ) + return array, xml, rows, cols, format + + +def dataframe_to_xml(df, name, roffset, coffset, rows, cols, format): + """ + :type df: pandas.core.frame.DataFrame + :type name: str + :type coffset: int + :type roffset: int + :type rows: int + :type cols: int + :type format: str + + + """ + num_rows = min(df.shape[0], MAX_SLICE_SIZE) + num_cols = min(df.shape[1], MAX_SLICE_SIZE) + if (num_rows, num_cols) != df.shape: + df = df.iloc[0:num_rows, 0:num_cols] + slice = ".iloc[0:%s, 0:%s]" % (num_rows, num_cols) + else: + slice = "" + slice = name + slice + xml = '\n' % (slice, num_rows, num_cols) + + if (rows, cols) == (-1, -1): + rows, cols = num_rows, num_cols + + rows = min(rows, MAXIMUM_ARRAY_SIZE) + cols = min(min(cols, MAXIMUM_ARRAY_SIZE), num_cols) + # need to precompute column bounds here before slicing! + col_bounds = [None] * cols + for col in range(cols): + dtype = df.dtypes.iloc[coffset + col].kind + if dtype in "biufc": + cvalues = df.iloc[:, coffset + col] + bounds = (cvalues.min(), cvalues.max()) + else: + bounds = (0, 0) + col_bounds[col] = bounds + + df = df.iloc[roffset : roffset + rows, coffset : coffset + cols] + rows, cols = df.shape + + xml += '\n' % (rows, cols) + format = format.replace("%", "") + col_formats = [] + + get_label = lambda label: str(label) if not isinstance(label, tuple) else "/".join(map(str, label)) + + for col in range(cols): + dtype = df.dtypes.iloc[col].kind + if dtype == "f" and format: + fmt = format + elif dtype == "f": + fmt = ".5f" + elif dtype == "i" or dtype == "u": + fmt = "d" + else: + fmt = "s" + col_formats.append("%" + fmt) + bounds = col_bounds[col] + + xml += '\n' % ( + str(col), + get_label(df.axes[1].values[col]), + dtype, + fmt, + bounds[1], + bounds[0], + ) + for row, label in enumerate(iter(df.axes[0])): + xml += '\n' % (str(row), get_label(label)) + xml += "\n" + xml += '\n' % (rows, cols) + for row in range(rows): + xml += '\n' % str(row) + for col in range(cols): + value = df.iat[row, col] + value = col_formats[col] % value + xml += var_to_xml(value, "") + return xml diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vm_type.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vm_type.py new file mode 100644 index 0000000..aaca38e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vm_type.py @@ -0,0 +1,40 @@ +import sys + + +# ======================================================================================================================= +# PydevdVmType +# ======================================================================================================================= +class PydevdVmType: + PYTHON = "python" + JYTHON = "jython" + vm_type = None + + +# ======================================================================================================================= +# set_vm_type +# ======================================================================================================================= +def set_vm_type(vm_type): + PydevdVmType.vm_type = vm_type + + +# ======================================================================================================================= +# get_vm_type +# ======================================================================================================================= +def get_vm_type(): + if PydevdVmType.vm_type is None: + setup_type() + return PydevdVmType.vm_type + + +# ======================================================================================================================= +# setup_type +# ======================================================================================================================= +def setup_type(str=None): + if str is not None: + PydevdVmType.vm_type = str + return + + if sys.platform.startswith("java"): + PydevdVmType.vm_type = PydevdVmType.JYTHON + else: + PydevdVmType.vm_type = PydevdVmType.PYTHON diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_xml.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_xml.py new file mode 100644 index 0000000..af8ad0f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_xml.py @@ -0,0 +1,434 @@ +from _pydev_bundle import pydev_log +from _pydevd_bundle import pydevd_extension_utils +from _pydevd_bundle import pydevd_resolver +import sys +from _pydevd_bundle.pydevd_constants import ( + BUILTINS_MODULE_NAME, + MAXIMUM_VARIABLE_REPRESENTATION_SIZE, + RETURN_VALUES_DICT, + LOAD_VALUES_ASYNC, + DEFAULT_VALUE, +) +from _pydev_bundle.pydev_imports import quote +from _pydevd_bundle.pydevd_extension_api import TypeResolveProvider, StrPresentationProvider +from _pydevd_bundle.pydevd_utils import isinstance_checked, hasattr_checked, DAPGrouper +from _pydevd_bundle.pydevd_resolver import get_var_scope, MoreItems, MoreItemsRange +from typing import Optional + +try: + import types + + frame_type = types.FrameType +except: + frame_type = None + + +def make_valid_xml_value(s): + # Same thing as xml.sax.saxutils.escape but also escaping double quotes. + return s.replace("&", "&").replace("<", "<").replace(">", ">").replace('"', """) + + +class ExceptionOnEvaluate: + def __init__(self, result, etype, tb): + self.result = result + self.etype = etype + self.tb = tb + + +_IS_JYTHON = sys.platform.startswith("java") + + +def _create_default_type_map(): + default_type_map = [ + # None means that it should not be treated as a compound variable + # isintance does not accept a tuple on some versions of python, so, we must declare it expanded + ( + type(None), + None, + ), + (int, None), + (float, None), + (complex, None), + (str, None), + (tuple, pydevd_resolver.tupleResolver), + (list, pydevd_resolver.tupleResolver), + (dict, pydevd_resolver.dictResolver), + ] + try: + from collections import OrderedDict + + default_type_map.insert(0, (OrderedDict, pydevd_resolver.orderedDictResolver)) + # we should put it before dict + except: + pass + + try: + default_type_map.append((long, None)) # @UndefinedVariable + except: + pass # not available on all python versions + + default_type_map.append((DAPGrouper, pydevd_resolver.dapGrouperResolver)) + default_type_map.append((MoreItems, pydevd_resolver.forwardInternalResolverToObject)) + default_type_map.append((MoreItemsRange, pydevd_resolver.forwardInternalResolverToObject)) + + try: + default_type_map.append((set, pydevd_resolver.setResolver)) + except: + pass # not available on all python versions + + try: + default_type_map.append((frozenset, pydevd_resolver.setResolver)) + except: + pass # not available on all python versions + + try: + from django.utils.datastructures import MultiValueDict + + default_type_map.insert(0, (MultiValueDict, pydevd_resolver.multiValueDictResolver)) + # we should put it before dict + except: + pass # django may not be installed + + try: + from django.forms import BaseForm + + default_type_map.insert(0, (BaseForm, pydevd_resolver.djangoFormResolver)) + # we should put it before instance resolver + except: + pass # django may not be installed + + try: + from collections import deque + + default_type_map.append((deque, pydevd_resolver.dequeResolver)) + except: + pass + + try: + from ctypes import Array + + default_type_map.append((Array, pydevd_resolver.tupleResolver)) + except: + pass + + if frame_type is not None: + default_type_map.append((frame_type, pydevd_resolver.frameResolver)) + + if _IS_JYTHON: + from org.python import core # @UnresolvedImport + + default_type_map.append((core.PyNone, None)) + default_type_map.append((core.PyInteger, None)) + default_type_map.append((core.PyLong, None)) + default_type_map.append((core.PyFloat, None)) + default_type_map.append((core.PyComplex, None)) + default_type_map.append((core.PyString, None)) + default_type_map.append((core.PyTuple, pydevd_resolver.tupleResolver)) + default_type_map.append((core.PyList, pydevd_resolver.tupleResolver)) + default_type_map.append((core.PyDictionary, pydevd_resolver.dictResolver)) + default_type_map.append((core.PyStringMap, pydevd_resolver.dictResolver)) + + if hasattr(core, "PyJavaInstance"): + # Jython 2.5b3 removed it. + default_type_map.append((core.PyJavaInstance, pydevd_resolver.instanceResolver)) + + return default_type_map + + +class TypeResolveHandler(object): + NO_PROVIDER = [] # Sentinel value (any mutable object to be used as a constant would be valid). + + def __init__(self): + # Note: don't initialize with the types we already know about so that the extensions can override + # the default resolvers that are already available if they want. + self._type_to_resolver_cache = {} + self._type_to_str_provider_cache = {} + self._initialized = False + + def _initialize(self): + self._default_type_map = _create_default_type_map() + self._resolve_providers = pydevd_extension_utils.extensions_of_type(TypeResolveProvider) + self._str_providers = pydevd_extension_utils.extensions_of_type(StrPresentationProvider) + self._initialized = True + + def get_type(self, o): + try: + try: + # Faster than type(o) as we don't need the function call. + type_object = o.__class__ # could fail here + type_name = type_object.__name__ + return self._get_type(o, type_object, type_name) # could fail here + except: + # Not all objects have __class__ (i.e.: there are bad bindings around). + type_object = type(o) + type_name = type_object.__name__ + + try: + return self._get_type(o, type_object, type_name) + except: + if isinstance(type_object, type): + # If it's still something manageable, use the default resolver, otherwise + # fallback to saying that it wasn't possible to get any info on it. + return type_object, str(type_name), pydevd_resolver.defaultResolver + + return "Unable to get Type", "Unable to get Type", None + except: + # This happens for org.python.core.InitModule + return "Unable to get Type", "Unable to get Type", None + + def _get_type(self, o, type_object, type_name): + # Note: we could have an exception here if the type_object is not hashable... + resolver = self._type_to_resolver_cache.get(type_object) + if resolver is not None: + return type_object, type_name, resolver + + if not self._initialized: + self._initialize() + + try: + for resolver in self._resolve_providers: + if resolver.can_provide(type_object, type_name): + # Cache it + self._type_to_resolver_cache[type_object] = resolver + return type_object, type_name, resolver + + for t in self._default_type_map: + if isinstance_checked(o, t[0]): + # Cache it + resolver = t[1] + self._type_to_resolver_cache[type_object] = resolver + return (type_object, type_name, resolver) + except: + pydev_log.exception() + + # No match return default (and cache it). + resolver = pydevd_resolver.defaultResolver + self._type_to_resolver_cache[type_object] = resolver + return type_object, type_name, resolver + + if _IS_JYTHON: + _base_get_type = _get_type + + def _get_type(self, o, type_object, type_name): + if type_name == "org.python.core.PyJavaInstance": + return type_object, type_name, pydevd_resolver.instanceResolver + + if type_name == "org.python.core.PyArray": + return type_object, type_name, pydevd_resolver.jyArrayResolver + + return self._base_get_type(o, type_object, type_name) + + def _get_str_from_provider(self, provider, o, context: Optional[str] = None): + if context is not None: + get_str_in_context = getattr(provider, "get_str_in_context", None) + if get_str_in_context is not None: + return get_str_in_context(o, context) + + return provider.get_str(o) + + def str_from_providers(self, o, type_object, type_name, context: Optional[str] = None): + provider = self._type_to_str_provider_cache.get(type_object) + + if provider is self.NO_PROVIDER: + return None + + if provider is not None: + return self._get_str_from_provider(provider, o, context) + + if not self._initialized: + self._initialize() + + for provider in self._str_providers: + if provider.can_provide(type_object, type_name): + self._type_to_str_provider_cache[type_object] = provider + try: + return self._get_str_from_provider(provider, o, context) + except: + pydev_log.exception("Error when getting str with custom provider: %s." % (provider,)) + + self._type_to_str_provider_cache[type_object] = self.NO_PROVIDER + return None + + +_TYPE_RESOLVE_HANDLER = TypeResolveHandler() + +""" +def get_type(o): + Receives object and returns a triple (type_object, type_string, resolver). + + resolver != None means that variable is a container, and should be displayed as a hierarchy. + + Use the resolver to get its attributes. + + All container objects (i.e.: dict, list, tuple, object, etc) should have a resolver. +""" +get_type = _TYPE_RESOLVE_HANDLER.get_type + +_str_from_providers = _TYPE_RESOLVE_HANDLER.str_from_providers + + +def is_builtin(x): + return getattr(x, "__module__", None) == BUILTINS_MODULE_NAME + + +def should_evaluate_full_value(val): + return not LOAD_VALUES_ASYNC or (is_builtin(type(val)) and not isinstance_checked(val, (list, tuple, dict))) + + +def return_values_from_dict_to_xml(return_dict): + res = [] + for name, val in return_dict.items(): + res.append(var_to_xml(val, name, additional_in_xml=' isRetVal="True"')) + return "".join(res) + + +def frame_vars_to_xml(frame_f_locals, hidden_ns=None): + """dumps frame variables to XML + + """ + xml = [] + + keys = sorted(frame_f_locals) + + return_values_xml = [] + + for k in keys: + try: + v = frame_f_locals[k] + eval_full_val = should_evaluate_full_value(v) + + if k == "_pydev_stop_at_break": + continue + + if k == RETURN_VALUES_DICT: + for name, val in v.items(): + return_values_xml.append(var_to_xml(val, name, additional_in_xml=' isRetVal="True"')) + + else: + if hidden_ns is not None and k in hidden_ns: + xml.append(var_to_xml(v, str(k), additional_in_xml=' isIPythonHidden="True"', evaluate_full_value=eval_full_val)) + else: + xml.append(var_to_xml(v, str(k), evaluate_full_value=eval_full_val)) + except Exception: + pydev_log.exception("Unexpected error, recovered safely.") + + # Show return values as the first entry. + return_values_xml.extend(xml) + return "".join(return_values_xml) + + +def get_variable_details(val, evaluate_full_value=True, to_string=None, context: Optional[str] = None): + """ + :param context: + This is the context in which the variable is being requested. Valid values: + "watch", + "repl", + "hover", + "clipboard" + """ + try: + # This should be faster than isinstance (but we have to protect against not having a '__class__' attribute). + is_exception_on_eval = val.__class__ == ExceptionOnEvaluate + except: + is_exception_on_eval = False + + if is_exception_on_eval: + v = val.result + else: + v = val + + _type, type_name, resolver = get_type(v) + type_qualifier = getattr(_type, "__module__", "") + if not evaluate_full_value: + value = DEFAULT_VALUE + else: + try: + str_from_provider = _str_from_providers(v, _type, type_name, context) + if str_from_provider is not None: + value = str_from_provider + + elif to_string is not None: + value = to_string(v) + + elif hasattr_checked(v, "__class__"): + if v.__class__ == frame_type: + value = pydevd_resolver.frameResolver.get_frame_name(v) + + elif v.__class__ in (list, tuple): + if len(v) > 300: + value = "%s: %s" % (str(v.__class__), "" % (len(v),)) + else: + value = "%s: %s" % (str(v.__class__), v) + else: + try: + cName = str(v.__class__) + if cName.find(".") != -1: + cName = cName.split(".")[-1] + + elif cName.find("'") != -1: # does not have '.' (could be something like ) + cName = cName[cName.index("'") + 1 :] + + if cName.endswith("'>"): + cName = cName[:-2] + except: + cName = str(v.__class__) + + value = "%s: %s" % (cName, v) + else: + value = str(v) + except: + try: + value = repr(v) + except: + value = "Unable to get repr for %s" % v.__class__ + + # fix to work with unicode values + try: + if value.__class__ == bytes: + value = value.decode("utf-8", "replace") + except TypeError: + pass + + return type_name, type_qualifier, is_exception_on_eval, resolver, value + + +def var_to_xml(val, name, trim_if_too_big=True, additional_in_xml="", evaluate_full_value=True): + """single variable or dictionary to xml representation""" + + type_name, type_qualifier, is_exception_on_eval, resolver, value = get_variable_details(val, evaluate_full_value) + + scope = get_var_scope(name, val, "", True) + try: + name = quote(name, "/>_= ") # TODO: Fix PY-5834 without using quote + except: + pass + + xml = ' MAXIMUM_VARIABLE_REPRESENTATION_SIZE and trim_if_too_big: + value = value[0:MAXIMUM_VARIABLE_REPRESENTATION_SIZE] + value += "..." + + xml_value = ' value="%s"' % (make_valid_xml_value(quote(value, "/>_= "))) + else: + xml_value = "" + + if is_exception_on_eval: + xml_container = ' isErrorOnEval="True"' + else: + if resolver is not None: + xml_container = ' isContainer="True"' + else: + xml_container = "" + + if scope: + return "".join((xml, xml_qualifier, xml_value, xml_container, additional_in_xml, ' scope="', scope, '"', " />\n")) + else: + return "".join((xml, xml_qualifier, xml_value, xml_container, additional_in_xml, " />\n")) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/.gitignore b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/.gitignore new file mode 100644 index 0000000..b1a6718 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/.gitignore @@ -0,0 +1,3 @@ +/pydevd_frame_evaluator.*.so +/pydevd_frame_evaluator.*.pyd +/pydevd_frame_evaluator.pyx diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfc52da1da6debd85698061d2b0c3121c86fcd8b GIT binary patch literal 234 zcmZ8bI|{-;6wDe05xj$~g?Xs02tu&5({@SRXI$MMyPLos!4r4}&*CvWf!L*TgPjBO zX67-)Jjdfv67iIWs?%3@{_*L@&piprls} zUA;D7tiGV%D91~IAOorf1TVn^f7WW5%@^Rf$C)XP*P=oP49mJQ0ceAYX^SjY88!^) oPwB}P5-B!?07|*yp3=;OcDRz7)dJUc5SNii*O_-p2(f8&U%oCwsQ>@~ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_eval_cython_wrapper.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_eval_cython_wrapper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..080ab0b8c8fabaf260f3deefbfa70bf327ace112 GIT binary patch literal 1408 zcmZ`$&2QX96rZuzYwt(AsdqO{7bQe(iWH^9BrQ?JN5v{zlyZO*s4z&X)n=oVVqsFl>%dH=J$T@&3nK1 z=JD8A7SQ$B`Dp8H4uC&nBU!=_JpTa#@FmF5&jcp4fdf?r0>tc0C!wQLEl_@DWG6@+ zr~H+~8lCDT%FmAM1gR3`UrDUdsTP~eRe;!8fHQEQCpFNs20njp5A3sRU=I!>_TfM? zV{uV?%$S@im}z=fN^XqKBWUu}QyMV| zGQnjEkKq4!g@Kpe7LMT8yqYsJC`S>a<{5y-Q2r5}dAwAH+9G05?h%tPZg$uoeT4@g z>6!NbOM>UJPvhV@NGANIi5jN1iFF5QsG-|+J@oMVHao}$Qh+cwmI$+algR%as}ZO@ zjpf`gY8N6F=1OGZBCVnQ5XU75>v$%~-F18qhj%dcFp(~X6E%Sy1I>S2HYlBzC%fhOPIe}Mo1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_eval_main.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_eval_main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1a3cc84334e2101c76584a705870d4c1aec3860 GIT binary patch literal 1387 zcmaJ>O>g5w7#=5fKArD0>9)J2qD3M?)LR14R$7qK)(H{WB+3_xFC#aew%PUA*4RnO zjUxx{`x_9yV!7@m;Q+x134}Os%hE$pPt2r=TJ5eFX`Y$)@$=66&O0-H8Ht1dZ7*^6 z?Ass!e==j$_~qnsmjmEA(16D2Kw+at=defdaBS|?y_i?{#hlj#>{EQ$ulR953E-d- z#33bw!%7&7iijgh1V@!9jwvy!=ae|@3EGpir%(j>N5Bps-(utuPdq3}yqch-#~cdV zJQ9h3LiUP@puh-_1d7=)nukwc!*L~!6G{Rnl_X9nDH_AieAx;pNK#Z853-#9M?2=m z+zvpQT|m+t@Brj_y0xxn9yujM#5XpJ>Ag1UJ|4YAXz z)XMOv*Z#a-%Z1!nrzI~fSgIDwZbq(kVX0W9bhZAa+=Sg?wIjFOHO9A_o!97Or3D+k zd;!**u-uf3ZMo?#xkq=oXsgp`)SGQsmb-GT?WPufED6|Z7mvQE$}JkB(L0vA$B^Yz zY8Ic!P^Qt{oh4mqEV712^(T#DyK-2S;jw(!DVOPvmJ8q#>8mT%w z9U6T%W;><@Z&^334KW@=hp2r7wSjG^PXFA^_I0EZ=$sRzYP5KL>OU|}&310x^_aFB zfj4D685)|7h?f@I-M!&7cth?j6xwSm6Ly!~cit}Tn}+SEhGP?fs)&z)pFw~DeHDPP zM?%63Lsc=xC*+CRPnvsDXjL1D7;5xPC5S!;$(@$411KO2|RR_Awb~1L+vq z&*&*g7BQb9r)b!N6CFu-jEs?_4^AX&5k9}S|B+-59Q2{3_MfR|$d)v8GCZ@!5*#5z zGYQhDlwNL4dUIFHFLzEFVs&89&0Yr{V^bUI=rgiK^Q33x{eO$lt34-quP?$%-I+M?RVEw^_y7})- z-~D9Hhk^%J9w8E?qDYjAws)uE{rMW$DNOwL{+(w)eDfc`1rKIo;hW0OVqq#4ei9$i by#x=gZFUJ>ycaDNz>7lWFy{Rs%2E6eyx@`* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_tracing.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/__pycache__/pydevd_frame_tracing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6c4f2e3864e06abad5578def04181293bfcf0f8 GIT binary patch literal 4900 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 2**32 + except: + # In Jython this call fails, but this is Ok, we don't support Jython for speedups anyways. + raise ImportError + plat = "32" + if is_64bits: + plat = "64" + + # We also accept things as: + # + # _pydevd_frame_eval.pydevd_frame_evaluator_win32_27_32 + # _pydevd_frame_eval.pydevd_frame_evaluator_win32_34_64 + # + # to have multiple pre-compiled pyds distributed along the IDE + # (generated by build_tools/build_binaries_windows.py). + + mod_name = "pydevd_frame_evaluator_%s_%s%s_%s" % (sys.platform, sys.version_info[0], sys.version_info[1], plat) + check_name = "_pydevd_frame_eval.%s" % (mod_name,) + mod = __import__(check_name) + mod = getattr(mod, mod_name) + except ImportError: + raise + +frame_eval_func = mod.frame_eval_func + +stop_frame_eval = mod.stop_frame_eval + +dummy_trace_dispatch = mod.dummy_trace_dispatch + +get_thread_info_py = mod.get_thread_info_py + +clear_thread_local_info = mod.clear_thread_local_info diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_main.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_main.py new file mode 100644 index 0000000..1049be0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_main.py @@ -0,0 +1,71 @@ +import os + +from _pydev_bundle import pydev_log +from _pydevd_bundle.pydevd_trace_dispatch import USING_CYTHON +from _pydevd_bundle.pydevd_constants import ( + USE_CYTHON_FLAG, + ENV_FALSE_LOWER_VALUES, + ENV_TRUE_LOWER_VALUES, + IS_PY36_OR_GREATER, + IS_PY38_OR_GREATER, + SUPPORT_GEVENT, + IS_PYTHON_STACKLESS, + PYDEVD_USE_FRAME_EVAL, + PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING, + IS_PY311_OR_GREATER, +) + +frame_eval_func = None +stop_frame_eval = None +dummy_trace_dispatch = None +clear_thread_local_info = None + +# "NO" means we should not use frame evaluation, 'YES' we should use it (and fail if not there) and unspecified uses if possible. +if ( + PYDEVD_USE_FRAME_EVAL in ENV_FALSE_LOWER_VALUES + or USE_CYTHON_FLAG in ENV_FALSE_LOWER_VALUES + or not USING_CYTHON + or + # Frame eval mode does not work with ipython compatible debugging (this happens because the + # way that frame eval works is run untraced and set tracing only for the frames with + # breakpoints, but ipython compatible debugging creates separate frames for what's logically + # the same frame). + PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING +): + USING_FRAME_EVAL = False + +elif SUPPORT_GEVENT or (IS_PYTHON_STACKLESS and not IS_PY38_OR_GREATER): + USING_FRAME_EVAL = False + # i.e gevent and frame eval mode don't get along very well. + # https://github.com/microsoft/debugpy/issues/189 + # Same problem with Stackless. + # https://github.com/stackless-dev/stackless/issues/240 + +elif PYDEVD_USE_FRAME_EVAL in ENV_TRUE_LOWER_VALUES and not IS_PY311_OR_GREATER: + # Python 3.11 onwards doesn't have frame eval mode implemented + # Fail if unable to use + from _pydevd_frame_eval.pydevd_frame_eval_cython_wrapper import ( + frame_eval_func, + stop_frame_eval, + dummy_trace_dispatch, + clear_thread_local_info, + ) + + USING_FRAME_EVAL = True + +else: + USING_FRAME_EVAL = False + # Try to use if possible + if IS_PY36_OR_GREATER and not IS_PY311_OR_GREATER: + # Python 3.11 onwards doesn't have frame eval mode implemented + try: + from _pydevd_frame_eval.pydevd_frame_eval_cython_wrapper import ( + frame_eval_func, + stop_frame_eval, + dummy_trace_dispatch, + clear_thread_local_info, + ) + + USING_FRAME_EVAL = True + except ImportError: + pydev_log.show_compile_cython_command_line() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.c b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.c new file mode 100644 index 0000000..aebeeab --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.c @@ -0,0 +1,26454 @@ +/* Generated by Cython 3.0.11 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "_pydevd_frame_eval/release_mem.h" + ], + "include_dirs": [ + "_pydevd_frame_eval" + ], + "name": "_pydevd_frame_eval.pydevd_frame_evaluator", + "sources": [ + "_pydevd_frame_eval/pydevd_frame_evaluator.pyx" + ] + }, + "module_name": "_pydevd_frame_eval.pydevd_frame_evaluator" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#if PY_VERSION_HEX >= 0x03090000 +#include "internal/pycore_gc.h" +#include "internal/pycore_interp.h" +#endif + +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_11" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x03000BF0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif + #undef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 0 +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif + #undef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 0 +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif + #undef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 0 +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 1 + #endif + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif + #ifndef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 0 + #endif +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif + #ifndef CYTHON_USE_FREELISTS + #define CYTHON_USE_FREELISTS 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #if PY_VERSION_HEX >= 0x030d00A4 + # define __Pyx_PyCFunctionFast PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords + #else + # define __Pyx_PyCFunctionFast _PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #endif +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE___pydevd_frame_eval__pydevd_frame_evaluator +#define __PYX_HAVE_API___pydevd_frame_eval__pydevd_frame_evaluator +/* Early includes */ +#include "frameobject.h" +#include "release_mem.h" +#include "code.h" +#include "pystate.h" +#if PY_VERSION_HEX >= 0x03080000 +#include "internal/pycore_pystate.h" +#endif + +#include "ceval.h" + +#if PY_VERSION_HEX >= 0x03090000 +PyObject * noop(PyFrameObject *frame, int exc) { + return NULL; +} +#define CALL_EvalFrameDefault_38(a, b) noop(a, b) +#define CALL_EvalFrameDefault_39(a, b, c) _PyEval_EvalFrameDefault(a, b, c) +#else +PyObject * noop(PyThreadState* tstate, PyFrameObject *frame, int exc) { + return NULL; +} +#define CALL_EvalFrameDefault_39(a, b, c) noop(a, b, c) +#define CALL_EvalFrameDefault_38(a, b) _PyEval_EvalFrameDefault(a, b) +#endif + +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "_pydevd_frame_eval\\\\pydevd_frame_evaluator.pyx", + "", + "_pydevd_bundle\\\\pydevd_cython.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* #### Code section: numeric_typedefs ### */ +/* #### Code section: complex_type_declarations ### */ +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; +struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo; +struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo; +struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo; +struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue; + +/* "_pydevd_bundle/pydevd_cython.pxd":1 + * cdef class PyDBAdditionalThreadInfo: # <<<<<<<<<<<<<< + * cdef public int pydev_state + * cdef public object pydev_step_stop # Actually, it's a frame or None + */ +struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo { + PyObject_HEAD + struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_vtab; + int pydev_state; + PyObject *pydev_step_stop; + int pydev_original_step_cmd; + int pydev_step_cmd; + int pydev_notify_kill; + PyObject *pydev_smart_step_stop; + int pydev_django_resolve_frame; + PyObject *pydev_call_from_jinja2; + PyObject *pydev_call_inside_jinja2; + int is_tracing; + PyObject *conditional_breakpoint_exception; + PyObject *pydev_message; + int suspend_type; + int pydev_next_line; + PyObject *pydev_func_name; + int suspended_at_unhandled; + PyObject *trace_suspend_type; + PyObject *top_level_thread_tracer_no_back_frames; + PyObject *top_level_thread_tracer_unhandled; + PyObject *thread_tracer; + PyObject *step_in_initial_location; + int pydev_smart_parent_offset; + int pydev_smart_child_offset; + PyObject *pydev_smart_step_into_variants; + PyObject *target_id_to_smart_step_into_variant; + int pydev_use_scoped_step_frame; + PyObject *weak_thread; + int is_in_wait_loop; +}; + + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":24 + * + * + * cdef class ThreadInfo: # <<<<<<<<<<<<<< + * + * cdef public PyDBAdditionalThreadInfo additional_info + */ +struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo { + PyObject_HEAD + struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_vtab; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *additional_info; + int is_pydevd_thread; + int inside_frame_eval; + int fully_initialized; + PyObject *thread_trace_func; + int _can_create_dummy_thread; + int force_stay_in_untraced_mode; +}; + + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":125 + * + * + * cdef class FuncCodeInfo: # <<<<<<<<<<<<<< + * + * cdef public str co_filename + */ +struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo { + PyObject_HEAD + PyObject *co_filename; + PyObject *co_name; + PyObject *canonical_normalized_filename; + int always_skip_code; + int breakpoint_found; + PyObject *new_code; + int breakpoints_mtime; +}; + + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":316 + * + * + * cdef class _CodeLineInfo: # <<<<<<<<<<<<<< + * + * cdef public dict line_to_offset + */ +struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo { + PyObject_HEAD + PyObject *line_to_offset; + int first_line; + int last_line; +}; + + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":361 + * + * + * cdef class _CacheValue(object): # <<<<<<<<<<<<<< + * + * cdef public object code_obj_py + */ +struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue { + PyObject_HEAD + struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_vtab; + PyObject *code_obj_py; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *code_line_info; + PyObject *breakpoints_hit_at_lines; + PyObject *code_lines_as_set; +}; + + + +/* "_pydevd_bundle/pydevd_cython.pxd":1 + * cdef class PyDBAdditionalThreadInfo: # <<<<<<<<<<<<<< + * cdef public int pydev_state + * cdef public object pydev_step_stop # Actually, it's a frame or None + */ + +struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo { + PyObject *(*get_topmost_frame)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, PyObject *, int __pyx_skip_dispatch); + PyObject *(*update_stepping_info)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch); + PyObject *(*_get_related_thread)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch); + int (*_is_stepping)(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *, int __pyx_skip_dispatch); +}; +static struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; + + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":24 + * + * + * cdef class ThreadInfo: # <<<<<<<<<<<<<< + * + * cdef public PyDBAdditionalThreadInfo additional_info + */ + +struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo { + PyObject *(*initialize)(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *, PyFrameObject *); + PyObject *(*initialize_if_possible)(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *); +}; +static struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_vtabptr_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo; + + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":361 + * + * + * cdef class _CacheValue(object): # <<<<<<<<<<<<<< + * + * cdef public object code_obj_py + */ + +struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue { + PyObject *(*compute_force_stay_in_untraced_mode)(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *, PyObject *, int __pyx_skip_dispatch); +}; +static struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_vtabptr_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* AssertionsEnabled.proto */ +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (1) +#elif CYTHON_COMPILING_IN_LIMITED_API || (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000) + static int __pyx_assertions_enabled_flag; + #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag) + static int __Pyx_init_assertions_enabled(void) { + PyObject *builtins, *debug, *debug_str; + int flag; + builtins = PyEval_GetBuiltins(); + if (!builtins) goto bad; + debug_str = PyUnicode_FromStringAndSize("__debug__", 9); + if (!debug_str) goto bad; + debug = PyObject_GetItem(builtins, debug_str); + Py_DECREF(debug_str); + if (!debug) goto bad; + flag = PyObject_IsTrue(debug); + Py_DECREF(debug); + if (flag == -1) goto bad; + __pyx_assertions_enabled_flag = flag; + return 0; + bad: + __pyx_assertions_enabled_flag = 1; + return -1; + } +#else + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (!Py_OptimizeFlag) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); +#else +#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace, zerodivision_check)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) +#endif + +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyObjectCallNoArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyObjectLookupSpecial.proto */ +#if CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS +#define __Pyx_PyObject_LookupSpecialNoError(obj, attr_name) __Pyx__PyObject_LookupSpecial(obj, attr_name, 0) +#define __Pyx_PyObject_LookupSpecial(obj, attr_name) __Pyx__PyObject_LookupSpecial(obj, attr_name, 1) +static CYTHON_INLINE PyObject* __Pyx__PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name, int with_error); +#else +#define __Pyx_PyObject_LookupSpecialNoError(o,n) __Pyx_PyObject_GetAttrStrNoError(o,n) +#define __Pyx_PyObject_LookupSpecial(o,n) __Pyx_PyObject_GetAttrStr(o,n) +#endif + +/* PyObjectSetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o, n, NULL) +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value); +#else +#define __Pyx_PyObject_DelAttrStr(o,n) PyObject_DelAttr(o,n) +#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v) +#endif + +/* RaiseUnboundLocalError.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* KeywordStringCheck.proto */ +static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* RaiseUnexpectedTypeError.proto */ +static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod0.proto */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* UnpackTupleError.proto */ +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); + +/* UnpackTuple2.proto */ +#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ + (likely(is_tuple || PyTuple_Check(tuple)) ?\ + (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ + __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ + (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ + __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); +static int __Pyx_unpack_tuple2_generic( + PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); + +/* dict_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_is_dict); +static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); + +/* PyDictContains.proto */ +static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { + int result = PyDict_Contains(dict, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* HasAttr.proto */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* ValidateBasesTuple.proto */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); +#endif + +/* PyType_Ready.proto */ +CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); + +/* GetVTable.proto */ +static void* __Pyx_GetVtable(PyTypeObject *type); + +/* MergeVTables.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type); +#endif + +/* SetupReduce.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce(PyObject* type_obj); +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_11 +#define __PYX_HAVE_RT_ImportType_proto_3_0_11 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_11(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_11(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_11 { + __Pyx_ImportType_CheckSize_Error_3_0_11 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_11 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_11 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_11(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_11 check_size); +#endif + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_initialize(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyFrameObject *__pyx_v_frame_obj); /* proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_initialize_if_possible(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_compute_force_stay_in_untraced_mode(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_breakpoints, int __pyx_skip_dispatch); /* proto*/ + +/* Module declarations from "cpython.mem" */ + +/* Module declarations from "_pydevd_bundle.pydevd_cython" */ + +/* Module declarations from "_pydevd_frame_eval.pydevd_frame_evaluator" */ +static int __pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator__code_extra_index; +static int __pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator_IS_PY_39_OWNARDS; +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_thread_info(PyFrameObject *); /*proto*/ +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_func_code_info(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *, PyFrameObject *, PyCodeObject *); /*proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_generate_code_with_breakpoints(PyObject *, PyObject *); /*proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval_38(PyFrameObject *, int); /*proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval_39(PyThreadState *, PyFrameObject *, int); /*proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_ThreadInfo__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *, PyObject *); /*proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_FuncCodeInfo__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *, PyObject *); /*proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle__CodeLineInfo__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *, PyObject *); /*proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle__CacheValue__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *, PyObject *); /*proto*/ +/* #### Code section: typeinfo ### */ +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "_pydevd_frame_eval.pydevd_frame_evaluator" +extern int __pyx_module_is_main__pydevd_frame_eval__pydevd_frame_evaluator; +int __pyx_module_is_main__pydevd_frame_eval__pydevd_frame_evaluator = 0; + +/* Implementation of "_pydevd_frame_eval.pydevd_frame_evaluator" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_AssertionError; +static PyObject *__pyx_builtin_AttributeError; +static PyObject *__pyx_builtin_min; +static PyObject *__pyx_builtin_max; +/* #### Code section: string_decls ### */ +static const char __pyx_k_[] = "/"; +static const char __pyx_k__2[] = "\\"; +static const char __pyx_k__3[] = "."; +static const char __pyx_k__5[] = ""; +static const char __pyx_k_gc[] = "gc"; +static const char __pyx_k__10[] = "*"; +static const char __pyx_k__47[] = "?"; +static const char __pyx_k_arg[] = "arg"; +static const char __pyx_k_dis[] = "dis"; +static const char __pyx_k_get[] = "get"; +static const char __pyx_k_max[] = "max"; +static const char __pyx_k_min[] = "min"; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_run[] = "run"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_call[] = "__call__"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_exec[] = "_exec"; +static const char __pyx_k_exit[] = "__exit__"; +static const char __pyx_k_line[] = "line"; +static const char __pyx_k_main[] = "main"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_self[] = "self"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_cache[] = "_cache"; +static const char __pyx_k_enter[] = "__enter__"; +static const char __pyx_k_event[] = "event"; +static const char __pyx_k_frame[] = "frame"; +static const char __pyx_k_local[] = "local"; +static const char __pyx_k_mtime[] = "mtime"; +static const char __pyx_k_rfind[] = "rfind"; +static const char __pyx_k_state[] = "state"; +static const char __pyx_k_active[] = "_active"; +static const char __pyx_k_call_2[] = "call"; +static const char __pyx_k_dict_2[] = "_dict"; +static const char __pyx_k_enable[] = "enable"; +static const char __pyx_k_f_back[] = "f_back"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_main_2[] = "__main__"; +static const char __pyx_k_offset[] = "offset"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_plugin[] = "plugin"; +static const char __pyx_k_pydevd[] = "pydevd"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_return[] = "return"; +static const char __pyx_k_thread[] = "thread"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_disable[] = "disable"; +static const char __pyx_k_f_trace[] = "f_trace"; +static const char __pyx_k_SetTrace[] = "SetTrace"; +static const char __pyx_k_can_skip[] = "can_skip"; +static const char __pyx_k_code_obj[] = "code_obj"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_bootstrap[] = "__bootstrap"; +static const char __pyx_k_decref_py[] = "decref_py"; +static const char __pyx_k_get_ident[] = "_get_ident"; +static const char __pyx_k_isenabled[] = "isenabled"; +static const char __pyx_k_last_line[] = "last_line"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_threading[] = "threading"; +static const char __pyx_k_CacheValue[] = "_CacheValue"; +static const char __pyx_k_ThreadInfo[] = "ThreadInfo"; +static const char __pyx_k_first_line[] = "first_line"; +static const char __pyx_k_global_dbg[] = "global_dbg"; +static const char __pyx_k_issuperset[] = "issuperset"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_DebugHelper[] = "DebugHelper"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_bootstrap_2[] = "_bootstrap"; +static const char __pyx_k_breakpoints[] = "breakpoints"; +static const char __pyx_k_code_obj_py[] = "code_obj_py"; +static const char __pyx_k_get_ident_2[] = "get_ident"; +static const char __pyx_k_thread_info[] = "thread_info"; +static const char __pyx_k_CodeLineInfo[] = "_CodeLineInfo"; +static const char __pyx_k_FuncCodeInfo[] = "FuncCodeInfo"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_intersection[] = "intersection"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_pydev_monkey[] = "pydev_monkey"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = ""; +static const char __pyx_k_use_setstate[] = "use_setstate"; +static const char __pyx_k_version_info[] = "version_info"; +static const char __pyx_k_get_file_type[] = "get_file_type"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_thread_active[] = "_thread_active"; +static const char __pyx_k_AssertionError[] = "AssertionError"; +static const char __pyx_k_AttributeError[] = "AttributeError"; +static const char __pyx_k_code_line_info[] = "code_line_info"; +static const char __pyx_k_current_thread[] = "current_thread"; +static const char __pyx_k_findlinestarts[] = "findlinestarts"; +static const char __pyx_k_line_to_offset[] = "line_to_offset"; +static const char __pyx_k_pydevd_tracing[] = "pydevd_tracing"; +static const char __pyx_k_set_trace_func[] = "set_trace_func"; +static const char __pyx_k_trace_dispatch[] = "trace_dispatch"; +static const char __pyx_k_additional_info[] = "additional_info"; +static const char __pyx_k_bootstrap_inner[] = "__bootstrap_inner"; +static const char __pyx_k_frame_eval_func[] = "frame_eval_func"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_stop_frame_eval[] = "stop_frame_eval"; +static const char __pyx_k_bootstrap_inner_2[] = "_bootstrap_inner"; +static const char __pyx_k_pydevd_file_utils[] = "pydevd_file_utils"; +static const char __pyx_k_signature_factory[] = "signature_factory"; +static const char __pyx_k_thread_local_info[] = "_thread_local_info"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_get_code_line_info[] = "_get_code_line_info"; +static const char __pyx_k_get_thread_info_py[] = "get_thread_info_py"; +static const char __pyx_k_show_return_values[] = "show_return_values"; +static const char __pyx_k_get_cache_file_type[] = "get_cache_file_type"; +static const char __pyx_k_update_globals_dict[] = "update_globals_dict"; +static const char __pyx_k_GlobalDebuggerHolder[] = "GlobalDebuggerHolder"; +static const char __pyx_k_dummy_trace_dispatch[] = "dummy_trace_dispatch"; +static const char __pyx_k_dummy_tracing_holder[] = "dummy_tracing_holder"; +static const char __pyx_k_insert_pydevd_breaks[] = "insert_pydevd_breaks"; +static const char __pyx_k_get_func_code_info_py[] = "get_func_code_info_py"; +static const char __pyx_k_has_plugin_line_breaks[] = "has_plugin_line_breaks"; +static const char __pyx_k_is_pydev_daemon_thread[] = "is_pydev_daemon_thread"; +static const char __pyx_k_clear_thread_local_info[] = "clear_thread_local_info"; +static const char __pyx_k_pyx_unpickle_ThreadInfo[] = "__pyx_unpickle_ThreadInfo"; +static const char __pyx_k_breakpoints_hit_at_lines[] = "breakpoints_hit_at_lines"; +static const char __pyx_k_pyx_unpickle__CacheValue[] = "__pyx_unpickle__CacheValue"; +static const char __pyx_k_pyx_unpickle_FuncCodeInfo[] = "__pyx_unpickle_FuncCodeInfo"; +static const char __pyx_k_CacheValue___reduce_cython[] = "_CacheValue.__reduce_cython__"; +static const char __pyx_k_ThreadInfo___reduce_cython[] = "ThreadInfo.__reduce_cython__"; +static const char __pyx_k_break_on_caught_exceptions[] = "break_on_caught_exceptions"; +static const char __pyx_k_pyx_unpickle__CodeLineInfo[] = "__pyx_unpickle__CodeLineInfo"; +static const char __pyx_k_get_cached_code_obj_info_py[] = "get_cached_code_obj_info_py"; +static const char __pyx_k_has_plugin_exception_breaks[] = "has_plugin_exception_breaks"; +static const char __pyx_k_CacheValue___setstate_cython[] = "_CacheValue.__setstate_cython__"; +static const char __pyx_k_CodeLineInfo___reduce_cython[] = "_CodeLineInfo.__reduce_cython__"; +static const char __pyx_k_FuncCodeInfo___reduce_cython[] = "FuncCodeInfo.__reduce_cython__"; +static const char __pyx_k_ThreadInfo___setstate_cython[] = "ThreadInfo.__setstate_cython__"; +static const char __pyx_k_NORM_PATHS_AND_BASE_CONTAINER[] = "NORM_PATHS_AND_BASE_CONTAINER"; +static const char __pyx_k_CodeLineInfo___setstate_cython[] = "_CodeLineInfo.__setstate_cython__"; +static const char __pyx_k_FuncCodeInfo___setstate_cython[] = "FuncCodeInfo.__setstate_cython__"; +static const char __pyx_k_pydevd_bundle_pydevd_constants[] = "_pydevd_bundle.pydevd_constants"; +static const char __pyx_k_pydevd_frame_eval_pydevd_frame[] = "_pydevd_frame_eval.pydevd_frame_tracing"; +static const char __pyx_k_CacheValue_compute_force_stay_i[] = "_CacheValue.compute_force_stay_in_untraced_mode"; +static const char __pyx_k_If_a_code_object_is_cached_that[] = "If a code object is cached, that same code object must be reused."; +static const char __pyx_k_get_abs_path_real_path_and_base[] = "get_abs_path_real_path_and_base_from_frame"; +static const char __pyx_k_pydev_bundle__pydev_saved_modul[] = "_pydev_bundle._pydev_saved_modules"; +static const char __pyx_k_pydevd_bundle_pydevd_additional[] = "_pydevd_bundle.pydevd_additional_thread_info"; +static const char __pyx_k_pydevd_bundle_pydevd_trace_disp[] = "_pydevd_bundle.pydevd_trace_dispatch"; +static const char __pyx_k_pydevd_frame_eval_pydevd_modify[] = "_pydevd_frame_eval.pydevd_modify_bytecode"; +static const char __pyx_k_set_additional_thread_info_lock[] = "_set_additional_thread_info_lock"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))"; +static const char __pyx_k_break_on_user_uncaught_exception[] = "break_on_user_uncaught_exceptions"; +static const char __pyx_k_compute_force_stay_in_untraced_m[] = "compute_force_stay_in_untraced_mode"; +static const char __pyx_k_fix_top_level_trace_and_get_trac[] = "fix_top_level_trace_and_get_trace_func"; +static const char __pyx_k_function_breakpoint_name_to_brea[] = "function_breakpoint_name_to_breakpoint"; +static const char __pyx_k_generate_code_with_breakpoints_p[] = "generate_code_with_breakpoints_py"; +static const char __pyx_k_pydevd_frame_eval_pydevd_frame_2[] = "_pydevd_frame_eval/pydevd_frame_evaluator.pyx"; +static const char __pyx_k_pydevd_frame_eval_pydevd_frame_3[] = "_pydevd_frame_eval.pydevd_frame_evaluator"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0_2[] = "Incompatible checksums (0x%x vs (0x450d2d6, 0x956dcaa, 0xb3ee05d) = (always_skip_code, breakpoint_found, breakpoints_mtime, canonical_normalized_filename, co_filename, co_name, new_code))"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0_3[] = "Incompatible checksums (0x%x vs (0x5a9bcd5, 0x0267473, 0x3fbbd02) = (first_line, last_line, line_to_offset))"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0_4[] = "Incompatible checksums (0x%x vs (0xac42a46, 0xedff7c3, 0x3d481b9) = (breakpoints_hit_at_lines, code_line_info, code_lines_as_set, code_obj_py))"; +/* #### Code section: decls ### */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_clear_thread_local_info(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo___reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_2__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_2__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_4__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2dummy_trace_dispatch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg); /* proto */ +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4get_thread_info_py(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj); /* proto */ +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_thread_info, PyObject *__pyx_v_frame, PyObject *__pyx_v_code_obj); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v_line_to_offset, int __pyx_v_first_line, int __pyx_v_last_line); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_2__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_4__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10_get_code_line_info(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12get_cached_code_obj_info_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj_py); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_code_obj_py, struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_code_line_info, PyObject *__pyx_v_breakpoints_hit_at_lines); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_2compute_force_stay_in_untraced_mode(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_breakpoints); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_4__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_6__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_14generate_code_with_breakpoints_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj_py, PyObject *__pyx_v_breakpoints); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_16frame_eval_func(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_18stop_frame_eval(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_20__pyx_unpickle_ThreadInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_22__pyx_unpickle_FuncCodeInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_24__pyx_unpickle__CodeLineInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_26__pyx_unpickle__CacheValue(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo; + #if CYTHON_USE_MODULE_STATE + PyObject *__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo; + PyObject *__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo; + PyObject *__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo; + PyObject *__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue; + #endif + PyTypeObject *__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo; + PyTypeObject *__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo; + PyTypeObject *__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo; + PyTypeObject *__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue; + PyObject *__pyx_kp_s_; + PyObject *__pyx_n_s_AssertionError; + PyObject *__pyx_n_s_AttributeError; + PyObject *__pyx_n_s_CacheValue; + PyObject *__pyx_n_s_CacheValue___reduce_cython; + PyObject *__pyx_n_s_CacheValue___setstate_cython; + PyObject *__pyx_n_s_CacheValue_compute_force_stay_i; + PyObject *__pyx_n_s_CodeLineInfo; + PyObject *__pyx_n_s_CodeLineInfo___reduce_cython; + PyObject *__pyx_n_s_CodeLineInfo___setstate_cython; + PyObject *__pyx_n_s_DebugHelper; + PyObject *__pyx_n_s_FuncCodeInfo; + PyObject *__pyx_n_s_FuncCodeInfo___reduce_cython; + PyObject *__pyx_n_s_FuncCodeInfo___setstate_cython; + PyObject *__pyx_n_s_GlobalDebuggerHolder; + PyObject *__pyx_kp_s_If_a_code_object_is_cached_that; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4; + PyObject *__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER; + PyObject *__pyx_n_s_PickleError; + PyObject *__pyx_n_s_SetTrace; + PyObject *__pyx_n_s_ThreadInfo; + PyObject *__pyx_n_s_ThreadInfo___reduce_cython; + PyObject *__pyx_n_s_ThreadInfo___setstate_cython; + PyObject *__pyx_n_s__10; + PyObject *__pyx_kp_s__2; + PyObject *__pyx_kp_s__3; + PyObject *__pyx_kp_u__3; + PyObject *__pyx_n_s__47; + PyObject *__pyx_kp_s__5; + PyObject *__pyx_n_s_active; + PyObject *__pyx_n_s_additional_info; + PyObject *__pyx_n_s_arg; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_bootstrap; + PyObject *__pyx_n_s_bootstrap_2; + PyObject *__pyx_n_s_bootstrap_inner; + PyObject *__pyx_n_s_bootstrap_inner_2; + PyObject *__pyx_n_s_break_on_caught_exceptions; + PyObject *__pyx_n_s_break_on_user_uncaught_exception; + PyObject *__pyx_n_s_breakpoints; + PyObject *__pyx_n_s_breakpoints_hit_at_lines; + PyObject *__pyx_n_s_cache; + PyObject *__pyx_n_s_call; + PyObject *__pyx_n_s_call_2; + PyObject *__pyx_n_s_can_skip; + PyObject *__pyx_n_s_clear_thread_local_info; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_code_line_info; + PyObject *__pyx_n_s_code_obj; + PyObject *__pyx_n_s_code_obj_py; + PyObject *__pyx_n_s_compute_force_stay_in_untraced_m; + PyObject *__pyx_n_s_current_thread; + PyObject *__pyx_n_s_decref_py; + PyObject *__pyx_n_s_dict; + PyObject *__pyx_n_s_dict_2; + PyObject *__pyx_n_s_dis; + PyObject *__pyx_kp_u_disable; + PyObject *__pyx_n_s_dummy_trace_dispatch; + PyObject *__pyx_n_s_dummy_tracing_holder; + PyObject *__pyx_kp_u_enable; + PyObject *__pyx_n_s_enter; + PyObject *__pyx_n_s_event; + PyObject *__pyx_n_s_exec; + PyObject *__pyx_n_s_exit; + PyObject *__pyx_n_s_f_back; + PyObject *__pyx_n_s_f_trace; + PyObject *__pyx_n_s_findlinestarts; + PyObject *__pyx_n_s_first_line; + PyObject *__pyx_n_s_fix_top_level_trace_and_get_trac; + PyObject *__pyx_n_s_frame; + PyObject *__pyx_n_s_frame_eval_func; + PyObject *__pyx_n_s_function_breakpoint_name_to_brea; + PyObject *__pyx_kp_u_gc; + PyObject *__pyx_n_s_generate_code_with_breakpoints_p; + PyObject *__pyx_n_s_get; + PyObject *__pyx_n_s_get_abs_path_real_path_and_base; + PyObject *__pyx_n_s_get_cache_file_type; + PyObject *__pyx_n_s_get_cached_code_obj_info_py; + PyObject *__pyx_n_s_get_code_line_info; + PyObject *__pyx_n_s_get_file_type; + PyObject *__pyx_n_s_get_func_code_info_py; + PyObject *__pyx_n_s_get_ident; + PyObject *__pyx_n_s_get_ident_2; + PyObject *__pyx_n_s_get_thread_info_py; + PyObject *__pyx_n_s_getstate; + PyObject *__pyx_n_s_global_dbg; + PyObject *__pyx_n_s_has_plugin_exception_breaks; + PyObject *__pyx_n_s_has_plugin_line_breaks; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_insert_pydevd_breaks; + PyObject *__pyx_n_s_intersection; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_n_s_is_pydev_daemon_thread; + PyObject *__pyx_kp_u_isenabled; + PyObject *__pyx_n_s_issuperset; + PyObject *__pyx_n_s_last_line; + PyObject *__pyx_n_s_line; + PyObject *__pyx_n_s_line_to_offset; + PyObject *__pyx_n_s_local; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_main_2; + PyObject *__pyx_n_s_max; + PyObject *__pyx_n_s_min; + PyObject *__pyx_n_s_mtime; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_s_new; + PyObject *__pyx_n_s_obj; + PyObject *__pyx_n_s_offset; + PyObject *__pyx_n_s_pickle; + PyObject *__pyx_n_s_plugin; + PyObject *__pyx_n_s_pydev_bundle__pydev_saved_modul; + PyObject *__pyx_n_s_pydev_monkey; + PyObject *__pyx_n_s_pydevd; + PyObject *__pyx_n_s_pydevd_bundle_pydevd_additional; + PyObject *__pyx_n_s_pydevd_bundle_pydevd_constants; + PyObject *__pyx_n_s_pydevd_bundle_pydevd_trace_disp; + PyObject *__pyx_n_s_pydevd_file_utils; + PyObject *__pyx_n_s_pydevd_frame_eval_pydevd_frame; + PyObject *__pyx_kp_s_pydevd_frame_eval_pydevd_frame_2; + PyObject *__pyx_n_s_pydevd_frame_eval_pydevd_frame_3; + PyObject *__pyx_n_s_pydevd_frame_eval_pydevd_modify; + PyObject *__pyx_n_s_pydevd_tracing; + PyObject *__pyx_n_s_pyx_PickleError; + PyObject *__pyx_n_s_pyx_checksum; + PyObject *__pyx_n_s_pyx_result; + PyObject *__pyx_n_s_pyx_state; + PyObject *__pyx_n_s_pyx_type; + PyObject *__pyx_n_s_pyx_unpickle_FuncCodeInfo; + PyObject *__pyx_n_s_pyx_unpickle_ThreadInfo; + PyObject *__pyx_n_s_pyx_unpickle__CacheValue; + PyObject *__pyx_n_s_pyx_unpickle__CodeLineInfo; + PyObject *__pyx_n_s_pyx_vtable; + PyObject *__pyx_n_s_reduce; + PyObject *__pyx_n_s_reduce_cython; + PyObject *__pyx_n_s_reduce_ex; + PyObject *__pyx_n_s_return; + PyObject *__pyx_n_s_rfind; + PyObject *__pyx_n_s_run; + PyObject *__pyx_n_s_self; + PyObject *__pyx_n_s_set_additional_thread_info_lock; + PyObject *__pyx_n_s_set_trace_func; + PyObject *__pyx_n_s_setstate; + PyObject *__pyx_n_s_setstate_cython; + PyObject *__pyx_n_s_show_return_values; + PyObject *__pyx_n_s_signature_factory; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_state; + PyObject *__pyx_n_s_stop_frame_eval; + PyObject *__pyx_kp_s_stringsource; + PyObject *__pyx_n_s_sys; + PyObject *__pyx_n_s_test; + PyObject *__pyx_n_s_thread; + PyObject *__pyx_n_s_thread_active; + PyObject *__pyx_n_s_thread_info; + PyObject *__pyx_n_s_thread_local_info; + PyObject *__pyx_n_s_threading; + PyObject *__pyx_n_s_trace_dispatch; + PyObject *__pyx_n_s_update; + PyObject *__pyx_n_s_update_globals_dict; + PyObject *__pyx_n_s_use_setstate; + PyObject *__pyx_n_s_version_info; + PyObject *__pyx_int_0; + PyObject *__pyx_int_1; + PyObject *__pyx_int_2; + PyObject *__pyx_int_3; + PyObject *__pyx_int_9; + PyObject *__pyx_int_2520179; + PyObject *__pyx_int_11485321; + PyObject *__pyx_int_64258489; + PyObject *__pyx_int_66829570; + PyObject *__pyx_int_72405718; + PyObject *__pyx_int_95010005; + PyObject *__pyx_int_156687530; + PyObject *__pyx_int_180628038; + PyObject *__pyx_int_188670045; + PyObject *__pyx_int_193022138; + PyObject *__pyx_int_240343912; + PyObject *__pyx_int_249558979; + PyObject *__pyx_tuple__4; + PyObject *__pyx_tuple__6; + PyObject *__pyx_tuple__7; + PyObject *__pyx_tuple__8; + PyObject *__pyx_tuple__9; + PyObject *__pyx_slice__37; + PyObject *__pyx_tuple__12; + PyObject *__pyx_tuple__14; + PyObject *__pyx_tuple__18; + PyObject *__pyx_tuple__21; + PyObject *__pyx_tuple__23; + PyObject *__pyx_tuple__27; + PyObject *__pyx_tuple__29; + PyObject *__pyx_tuple__31; + PyObject *__pyx_tuple__35; + PyObject *__pyx_tuple__38; + PyObject *__pyx_tuple__39; + PyObject *__pyx_tuple__42; + PyObject *__pyx_codeobj__11; + PyObject *__pyx_codeobj__13; + PyObject *__pyx_codeobj__15; + PyObject *__pyx_codeobj__16; + PyObject *__pyx_codeobj__17; + PyObject *__pyx_codeobj__19; + PyObject *__pyx_codeobj__20; + PyObject *__pyx_codeobj__22; + PyObject *__pyx_codeobj__24; + PyObject *__pyx_codeobj__25; + PyObject *__pyx_codeobj__26; + PyObject *__pyx_codeobj__28; + PyObject *__pyx_codeobj__30; + PyObject *__pyx_codeobj__32; + PyObject *__pyx_codeobj__33; + PyObject *__pyx_codeobj__34; + PyObject *__pyx_codeobj__36; + PyObject *__pyx_codeobj__40; + PyObject *__pyx_codeobj__41; + PyObject *__pyx_codeobj__43; + PyObject *__pyx_codeobj__44; + PyObject *__pyx_codeobj__45; + PyObject *__pyx_codeobj__46; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + Py_CLEAR(clear_module_state->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo); + Py_CLEAR(clear_module_state->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo); + Py_CLEAR(clear_module_state->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo); + Py_CLEAR(clear_module_state->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo); + Py_CLEAR(clear_module_state->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo); + Py_CLEAR(clear_module_state->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo); + Py_CLEAR(clear_module_state->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue); + Py_CLEAR(clear_module_state->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue); + Py_CLEAR(clear_module_state->__pyx_kp_s_); + Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); + Py_CLEAR(clear_module_state->__pyx_n_s_AttributeError); + Py_CLEAR(clear_module_state->__pyx_n_s_CacheValue); + Py_CLEAR(clear_module_state->__pyx_n_s_CacheValue___reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_CacheValue___setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_CacheValue_compute_force_stay_i); + Py_CLEAR(clear_module_state->__pyx_n_s_CodeLineInfo); + Py_CLEAR(clear_module_state->__pyx_n_s_CodeLineInfo___reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_CodeLineInfo___setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_DebugHelper); + Py_CLEAR(clear_module_state->__pyx_n_s_FuncCodeInfo); + Py_CLEAR(clear_module_state->__pyx_n_s_FuncCodeInfo___reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_FuncCodeInfo___setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_GlobalDebuggerHolder); + Py_CLEAR(clear_module_state->__pyx_kp_s_If_a_code_object_is_cached_that); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4); + Py_CLEAR(clear_module_state->__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); + Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_SetTrace); + Py_CLEAR(clear_module_state->__pyx_n_s_ThreadInfo); + Py_CLEAR(clear_module_state->__pyx_n_s_ThreadInfo___reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_ThreadInfo___setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s__10); + Py_CLEAR(clear_module_state->__pyx_kp_s__2); + Py_CLEAR(clear_module_state->__pyx_kp_s__3); + Py_CLEAR(clear_module_state->__pyx_kp_u__3); + Py_CLEAR(clear_module_state->__pyx_n_s__47); + Py_CLEAR(clear_module_state->__pyx_kp_s__5); + Py_CLEAR(clear_module_state->__pyx_n_s_active); + Py_CLEAR(clear_module_state->__pyx_n_s_additional_info); + Py_CLEAR(clear_module_state->__pyx_n_s_arg); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_bootstrap); + Py_CLEAR(clear_module_state->__pyx_n_s_bootstrap_2); + Py_CLEAR(clear_module_state->__pyx_n_s_bootstrap_inner); + Py_CLEAR(clear_module_state->__pyx_n_s_bootstrap_inner_2); + Py_CLEAR(clear_module_state->__pyx_n_s_break_on_caught_exceptions); + Py_CLEAR(clear_module_state->__pyx_n_s_break_on_user_uncaught_exception); + Py_CLEAR(clear_module_state->__pyx_n_s_breakpoints); + Py_CLEAR(clear_module_state->__pyx_n_s_breakpoints_hit_at_lines); + Py_CLEAR(clear_module_state->__pyx_n_s_cache); + Py_CLEAR(clear_module_state->__pyx_n_s_call); + Py_CLEAR(clear_module_state->__pyx_n_s_call_2); + Py_CLEAR(clear_module_state->__pyx_n_s_can_skip); + Py_CLEAR(clear_module_state->__pyx_n_s_clear_thread_local_info); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_code_line_info); + Py_CLEAR(clear_module_state->__pyx_n_s_code_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_code_obj_py); + Py_CLEAR(clear_module_state->__pyx_n_s_compute_force_stay_in_untraced_m); + Py_CLEAR(clear_module_state->__pyx_n_s_current_thread); + Py_CLEAR(clear_module_state->__pyx_n_s_decref_py); + Py_CLEAR(clear_module_state->__pyx_n_s_dict); + Py_CLEAR(clear_module_state->__pyx_n_s_dict_2); + Py_CLEAR(clear_module_state->__pyx_n_s_dis); + Py_CLEAR(clear_module_state->__pyx_kp_u_disable); + Py_CLEAR(clear_module_state->__pyx_n_s_dummy_trace_dispatch); + Py_CLEAR(clear_module_state->__pyx_n_s_dummy_tracing_holder); + Py_CLEAR(clear_module_state->__pyx_kp_u_enable); + Py_CLEAR(clear_module_state->__pyx_n_s_enter); + Py_CLEAR(clear_module_state->__pyx_n_s_event); + Py_CLEAR(clear_module_state->__pyx_n_s_exec); + Py_CLEAR(clear_module_state->__pyx_n_s_exit); + Py_CLEAR(clear_module_state->__pyx_n_s_f_back); + Py_CLEAR(clear_module_state->__pyx_n_s_f_trace); + Py_CLEAR(clear_module_state->__pyx_n_s_findlinestarts); + Py_CLEAR(clear_module_state->__pyx_n_s_first_line); + Py_CLEAR(clear_module_state->__pyx_n_s_fix_top_level_trace_and_get_trac); + Py_CLEAR(clear_module_state->__pyx_n_s_frame); + Py_CLEAR(clear_module_state->__pyx_n_s_frame_eval_func); + Py_CLEAR(clear_module_state->__pyx_n_s_function_breakpoint_name_to_brea); + Py_CLEAR(clear_module_state->__pyx_kp_u_gc); + Py_CLEAR(clear_module_state->__pyx_n_s_generate_code_with_breakpoints_p); + Py_CLEAR(clear_module_state->__pyx_n_s_get); + Py_CLEAR(clear_module_state->__pyx_n_s_get_abs_path_real_path_and_base); + Py_CLEAR(clear_module_state->__pyx_n_s_get_cache_file_type); + Py_CLEAR(clear_module_state->__pyx_n_s_get_cached_code_obj_info_py); + Py_CLEAR(clear_module_state->__pyx_n_s_get_code_line_info); + Py_CLEAR(clear_module_state->__pyx_n_s_get_file_type); + Py_CLEAR(clear_module_state->__pyx_n_s_get_func_code_info_py); + Py_CLEAR(clear_module_state->__pyx_n_s_get_ident); + Py_CLEAR(clear_module_state->__pyx_n_s_get_ident_2); + Py_CLEAR(clear_module_state->__pyx_n_s_get_thread_info_py); + Py_CLEAR(clear_module_state->__pyx_n_s_getstate); + Py_CLEAR(clear_module_state->__pyx_n_s_global_dbg); + Py_CLEAR(clear_module_state->__pyx_n_s_has_plugin_exception_breaks); + Py_CLEAR(clear_module_state->__pyx_n_s_has_plugin_line_breaks); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_insert_pydevd_breaks); + Py_CLEAR(clear_module_state->__pyx_n_s_intersection); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_n_s_is_pydev_daemon_thread); + Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); + Py_CLEAR(clear_module_state->__pyx_n_s_issuperset); + Py_CLEAR(clear_module_state->__pyx_n_s_last_line); + Py_CLEAR(clear_module_state->__pyx_n_s_line); + Py_CLEAR(clear_module_state->__pyx_n_s_line_to_offset); + Py_CLEAR(clear_module_state->__pyx_n_s_local); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_main_2); + Py_CLEAR(clear_module_state->__pyx_n_s_max); + Py_CLEAR(clear_module_state->__pyx_n_s_min); + Py_CLEAR(clear_module_state->__pyx_n_s_mtime); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_new); + Py_CLEAR(clear_module_state->__pyx_n_s_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_offset); + Py_CLEAR(clear_module_state->__pyx_n_s_pickle); + Py_CLEAR(clear_module_state->__pyx_n_s_plugin); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_bundle__pydev_saved_modul); + Py_CLEAR(clear_module_state->__pyx_n_s_pydev_monkey); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_additional); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_constants); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_bundle_pydevd_trace_disp); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_file_utils); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_frame_eval_pydevd_frame); + Py_CLEAR(clear_module_state->__pyx_kp_s_pydevd_frame_eval_pydevd_frame_2); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_frame_eval_pydevd_frame_3); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_frame_eval_pydevd_modify); + Py_CLEAR(clear_module_state->__pyx_n_s_pydevd_tracing); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_FuncCodeInfo); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_ThreadInfo); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle__CacheValue); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle__CodeLineInfo); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); + Py_CLEAR(clear_module_state->__pyx_n_s_return); + Py_CLEAR(clear_module_state->__pyx_n_s_rfind); + Py_CLEAR(clear_module_state->__pyx_n_s_run); + Py_CLEAR(clear_module_state->__pyx_n_s_self); + Py_CLEAR(clear_module_state->__pyx_n_s_set_additional_thread_info_lock); + Py_CLEAR(clear_module_state->__pyx_n_s_set_trace_func); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_show_return_values); + Py_CLEAR(clear_module_state->__pyx_n_s_signature_factory); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_state); + Py_CLEAR(clear_module_state->__pyx_n_s_stop_frame_eval); + Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); + Py_CLEAR(clear_module_state->__pyx_n_s_sys); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_n_s_thread); + Py_CLEAR(clear_module_state->__pyx_n_s_thread_active); + Py_CLEAR(clear_module_state->__pyx_n_s_thread_info); + Py_CLEAR(clear_module_state->__pyx_n_s_thread_local_info); + Py_CLEAR(clear_module_state->__pyx_n_s_threading); + Py_CLEAR(clear_module_state->__pyx_n_s_trace_dispatch); + Py_CLEAR(clear_module_state->__pyx_n_s_update); + Py_CLEAR(clear_module_state->__pyx_n_s_update_globals_dict); + Py_CLEAR(clear_module_state->__pyx_n_s_use_setstate); + Py_CLEAR(clear_module_state->__pyx_n_s_version_info); + Py_CLEAR(clear_module_state->__pyx_int_0); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_int_2); + Py_CLEAR(clear_module_state->__pyx_int_3); + Py_CLEAR(clear_module_state->__pyx_int_9); + Py_CLEAR(clear_module_state->__pyx_int_2520179); + Py_CLEAR(clear_module_state->__pyx_int_11485321); + Py_CLEAR(clear_module_state->__pyx_int_64258489); + Py_CLEAR(clear_module_state->__pyx_int_66829570); + Py_CLEAR(clear_module_state->__pyx_int_72405718); + Py_CLEAR(clear_module_state->__pyx_int_95010005); + Py_CLEAR(clear_module_state->__pyx_int_156687530); + Py_CLEAR(clear_module_state->__pyx_int_180628038); + Py_CLEAR(clear_module_state->__pyx_int_188670045); + Py_CLEAR(clear_module_state->__pyx_int_193022138); + Py_CLEAR(clear_module_state->__pyx_int_240343912); + Py_CLEAR(clear_module_state->__pyx_int_249558979); + Py_CLEAR(clear_module_state->__pyx_tuple__4); + Py_CLEAR(clear_module_state->__pyx_tuple__6); + Py_CLEAR(clear_module_state->__pyx_tuple__7); + Py_CLEAR(clear_module_state->__pyx_tuple__8); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_slice__37); + Py_CLEAR(clear_module_state->__pyx_tuple__12); + Py_CLEAR(clear_module_state->__pyx_tuple__14); + Py_CLEAR(clear_module_state->__pyx_tuple__18); + Py_CLEAR(clear_module_state->__pyx_tuple__21); + Py_CLEAR(clear_module_state->__pyx_tuple__23); + Py_CLEAR(clear_module_state->__pyx_tuple__27); + Py_CLEAR(clear_module_state->__pyx_tuple__29); + Py_CLEAR(clear_module_state->__pyx_tuple__31); + Py_CLEAR(clear_module_state->__pyx_tuple__35); + Py_CLEAR(clear_module_state->__pyx_tuple__38); + Py_CLEAR(clear_module_state->__pyx_tuple__39); + Py_CLEAR(clear_module_state->__pyx_tuple__42); + Py_CLEAR(clear_module_state->__pyx_codeobj__11); + Py_CLEAR(clear_module_state->__pyx_codeobj__13); + Py_CLEAR(clear_module_state->__pyx_codeobj__15); + Py_CLEAR(clear_module_state->__pyx_codeobj__16); + Py_CLEAR(clear_module_state->__pyx_codeobj__17); + Py_CLEAR(clear_module_state->__pyx_codeobj__19); + Py_CLEAR(clear_module_state->__pyx_codeobj__20); + Py_CLEAR(clear_module_state->__pyx_codeobj__22); + Py_CLEAR(clear_module_state->__pyx_codeobj__24); + Py_CLEAR(clear_module_state->__pyx_codeobj__25); + Py_CLEAR(clear_module_state->__pyx_codeobj__26); + Py_CLEAR(clear_module_state->__pyx_codeobj__28); + Py_CLEAR(clear_module_state->__pyx_codeobj__30); + Py_CLEAR(clear_module_state->__pyx_codeobj__32); + Py_CLEAR(clear_module_state->__pyx_codeobj__33); + Py_CLEAR(clear_module_state->__pyx_codeobj__34); + Py_CLEAR(clear_module_state->__pyx_codeobj__36); + Py_CLEAR(clear_module_state->__pyx_codeobj__40); + Py_CLEAR(clear_module_state->__pyx_codeobj__41); + Py_CLEAR(clear_module_state->__pyx_codeobj__43); + Py_CLEAR(clear_module_state->__pyx_codeobj__44); + Py_CLEAR(clear_module_state->__pyx_codeobj__45); + Py_CLEAR(clear_module_state->__pyx_codeobj__46); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); + Py_VISIT(traverse_module_state->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo); + Py_VISIT(traverse_module_state->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo); + Py_VISIT(traverse_module_state->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo); + Py_VISIT(traverse_module_state->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo); + Py_VISIT(traverse_module_state->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo); + Py_VISIT(traverse_module_state->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo); + Py_VISIT(traverse_module_state->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue); + Py_VISIT(traverse_module_state->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue); + Py_VISIT(traverse_module_state->__pyx_kp_s_); + Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); + Py_VISIT(traverse_module_state->__pyx_n_s_AttributeError); + Py_VISIT(traverse_module_state->__pyx_n_s_CacheValue); + Py_VISIT(traverse_module_state->__pyx_n_s_CacheValue___reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_CacheValue___setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_CacheValue_compute_force_stay_i); + Py_VISIT(traverse_module_state->__pyx_n_s_CodeLineInfo); + Py_VISIT(traverse_module_state->__pyx_n_s_CodeLineInfo___reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_CodeLineInfo___setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_DebugHelper); + Py_VISIT(traverse_module_state->__pyx_n_s_FuncCodeInfo); + Py_VISIT(traverse_module_state->__pyx_n_s_FuncCodeInfo___reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_FuncCodeInfo___setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_GlobalDebuggerHolder); + Py_VISIT(traverse_module_state->__pyx_kp_s_If_a_code_object_is_cached_that); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4); + Py_VISIT(traverse_module_state->__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); + Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_SetTrace); + Py_VISIT(traverse_module_state->__pyx_n_s_ThreadInfo); + Py_VISIT(traverse_module_state->__pyx_n_s_ThreadInfo___reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_ThreadInfo___setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s__10); + Py_VISIT(traverse_module_state->__pyx_kp_s__2); + Py_VISIT(traverse_module_state->__pyx_kp_s__3); + Py_VISIT(traverse_module_state->__pyx_kp_u__3); + Py_VISIT(traverse_module_state->__pyx_n_s__47); + Py_VISIT(traverse_module_state->__pyx_kp_s__5); + Py_VISIT(traverse_module_state->__pyx_n_s_active); + Py_VISIT(traverse_module_state->__pyx_n_s_additional_info); + Py_VISIT(traverse_module_state->__pyx_n_s_arg); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_bootstrap); + Py_VISIT(traverse_module_state->__pyx_n_s_bootstrap_2); + Py_VISIT(traverse_module_state->__pyx_n_s_bootstrap_inner); + Py_VISIT(traverse_module_state->__pyx_n_s_bootstrap_inner_2); + Py_VISIT(traverse_module_state->__pyx_n_s_break_on_caught_exceptions); + Py_VISIT(traverse_module_state->__pyx_n_s_break_on_user_uncaught_exception); + Py_VISIT(traverse_module_state->__pyx_n_s_breakpoints); + Py_VISIT(traverse_module_state->__pyx_n_s_breakpoints_hit_at_lines); + Py_VISIT(traverse_module_state->__pyx_n_s_cache); + Py_VISIT(traverse_module_state->__pyx_n_s_call); + Py_VISIT(traverse_module_state->__pyx_n_s_call_2); + Py_VISIT(traverse_module_state->__pyx_n_s_can_skip); + Py_VISIT(traverse_module_state->__pyx_n_s_clear_thread_local_info); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_code_line_info); + Py_VISIT(traverse_module_state->__pyx_n_s_code_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_code_obj_py); + Py_VISIT(traverse_module_state->__pyx_n_s_compute_force_stay_in_untraced_m); + Py_VISIT(traverse_module_state->__pyx_n_s_current_thread); + Py_VISIT(traverse_module_state->__pyx_n_s_decref_py); + Py_VISIT(traverse_module_state->__pyx_n_s_dict); + Py_VISIT(traverse_module_state->__pyx_n_s_dict_2); + Py_VISIT(traverse_module_state->__pyx_n_s_dis); + Py_VISIT(traverse_module_state->__pyx_kp_u_disable); + Py_VISIT(traverse_module_state->__pyx_n_s_dummy_trace_dispatch); + Py_VISIT(traverse_module_state->__pyx_n_s_dummy_tracing_holder); + Py_VISIT(traverse_module_state->__pyx_kp_u_enable); + Py_VISIT(traverse_module_state->__pyx_n_s_enter); + Py_VISIT(traverse_module_state->__pyx_n_s_event); + Py_VISIT(traverse_module_state->__pyx_n_s_exec); + Py_VISIT(traverse_module_state->__pyx_n_s_exit); + Py_VISIT(traverse_module_state->__pyx_n_s_f_back); + Py_VISIT(traverse_module_state->__pyx_n_s_f_trace); + Py_VISIT(traverse_module_state->__pyx_n_s_findlinestarts); + Py_VISIT(traverse_module_state->__pyx_n_s_first_line); + Py_VISIT(traverse_module_state->__pyx_n_s_fix_top_level_trace_and_get_trac); + Py_VISIT(traverse_module_state->__pyx_n_s_frame); + Py_VISIT(traverse_module_state->__pyx_n_s_frame_eval_func); + Py_VISIT(traverse_module_state->__pyx_n_s_function_breakpoint_name_to_brea); + Py_VISIT(traverse_module_state->__pyx_kp_u_gc); + Py_VISIT(traverse_module_state->__pyx_n_s_generate_code_with_breakpoints_p); + Py_VISIT(traverse_module_state->__pyx_n_s_get); + Py_VISIT(traverse_module_state->__pyx_n_s_get_abs_path_real_path_and_base); + Py_VISIT(traverse_module_state->__pyx_n_s_get_cache_file_type); + Py_VISIT(traverse_module_state->__pyx_n_s_get_cached_code_obj_info_py); + Py_VISIT(traverse_module_state->__pyx_n_s_get_code_line_info); + Py_VISIT(traverse_module_state->__pyx_n_s_get_file_type); + Py_VISIT(traverse_module_state->__pyx_n_s_get_func_code_info_py); + Py_VISIT(traverse_module_state->__pyx_n_s_get_ident); + Py_VISIT(traverse_module_state->__pyx_n_s_get_ident_2); + Py_VISIT(traverse_module_state->__pyx_n_s_get_thread_info_py); + Py_VISIT(traverse_module_state->__pyx_n_s_getstate); + Py_VISIT(traverse_module_state->__pyx_n_s_global_dbg); + Py_VISIT(traverse_module_state->__pyx_n_s_has_plugin_exception_breaks); + Py_VISIT(traverse_module_state->__pyx_n_s_has_plugin_line_breaks); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_insert_pydevd_breaks); + Py_VISIT(traverse_module_state->__pyx_n_s_intersection); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_n_s_is_pydev_daemon_thread); + Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); + Py_VISIT(traverse_module_state->__pyx_n_s_issuperset); + Py_VISIT(traverse_module_state->__pyx_n_s_last_line); + Py_VISIT(traverse_module_state->__pyx_n_s_line); + Py_VISIT(traverse_module_state->__pyx_n_s_line_to_offset); + Py_VISIT(traverse_module_state->__pyx_n_s_local); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_main_2); + Py_VISIT(traverse_module_state->__pyx_n_s_max); + Py_VISIT(traverse_module_state->__pyx_n_s_min); + Py_VISIT(traverse_module_state->__pyx_n_s_mtime); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_new); + Py_VISIT(traverse_module_state->__pyx_n_s_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_offset); + Py_VISIT(traverse_module_state->__pyx_n_s_pickle); + Py_VISIT(traverse_module_state->__pyx_n_s_plugin); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_bundle__pydev_saved_modul); + Py_VISIT(traverse_module_state->__pyx_n_s_pydev_monkey); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_additional); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_constants); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_bundle_pydevd_trace_disp); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_file_utils); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_frame_eval_pydevd_frame); + Py_VISIT(traverse_module_state->__pyx_kp_s_pydevd_frame_eval_pydevd_frame_2); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_frame_eval_pydevd_frame_3); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_frame_eval_pydevd_modify); + Py_VISIT(traverse_module_state->__pyx_n_s_pydevd_tracing); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_FuncCodeInfo); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_ThreadInfo); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle__CacheValue); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle__CodeLineInfo); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); + Py_VISIT(traverse_module_state->__pyx_n_s_return); + Py_VISIT(traverse_module_state->__pyx_n_s_rfind); + Py_VISIT(traverse_module_state->__pyx_n_s_run); + Py_VISIT(traverse_module_state->__pyx_n_s_self); + Py_VISIT(traverse_module_state->__pyx_n_s_set_additional_thread_info_lock); + Py_VISIT(traverse_module_state->__pyx_n_s_set_trace_func); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_show_return_values); + Py_VISIT(traverse_module_state->__pyx_n_s_signature_factory); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_state); + Py_VISIT(traverse_module_state->__pyx_n_s_stop_frame_eval); + Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); + Py_VISIT(traverse_module_state->__pyx_n_s_sys); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_n_s_thread); + Py_VISIT(traverse_module_state->__pyx_n_s_thread_active); + Py_VISIT(traverse_module_state->__pyx_n_s_thread_info); + Py_VISIT(traverse_module_state->__pyx_n_s_thread_local_info); + Py_VISIT(traverse_module_state->__pyx_n_s_threading); + Py_VISIT(traverse_module_state->__pyx_n_s_trace_dispatch); + Py_VISIT(traverse_module_state->__pyx_n_s_update); + Py_VISIT(traverse_module_state->__pyx_n_s_update_globals_dict); + Py_VISIT(traverse_module_state->__pyx_n_s_use_setstate); + Py_VISIT(traverse_module_state->__pyx_n_s_version_info); + Py_VISIT(traverse_module_state->__pyx_int_0); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_int_2); + Py_VISIT(traverse_module_state->__pyx_int_3); + Py_VISIT(traverse_module_state->__pyx_int_9); + Py_VISIT(traverse_module_state->__pyx_int_2520179); + Py_VISIT(traverse_module_state->__pyx_int_11485321); + Py_VISIT(traverse_module_state->__pyx_int_64258489); + Py_VISIT(traverse_module_state->__pyx_int_66829570); + Py_VISIT(traverse_module_state->__pyx_int_72405718); + Py_VISIT(traverse_module_state->__pyx_int_95010005); + Py_VISIT(traverse_module_state->__pyx_int_156687530); + Py_VISIT(traverse_module_state->__pyx_int_180628038); + Py_VISIT(traverse_module_state->__pyx_int_188670045); + Py_VISIT(traverse_module_state->__pyx_int_193022138); + Py_VISIT(traverse_module_state->__pyx_int_240343912); + Py_VISIT(traverse_module_state->__pyx_int_249558979); + Py_VISIT(traverse_module_state->__pyx_tuple__4); + Py_VISIT(traverse_module_state->__pyx_tuple__6); + Py_VISIT(traverse_module_state->__pyx_tuple__7); + Py_VISIT(traverse_module_state->__pyx_tuple__8); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_slice__37); + Py_VISIT(traverse_module_state->__pyx_tuple__12); + Py_VISIT(traverse_module_state->__pyx_tuple__14); + Py_VISIT(traverse_module_state->__pyx_tuple__18); + Py_VISIT(traverse_module_state->__pyx_tuple__21); + Py_VISIT(traverse_module_state->__pyx_tuple__23); + Py_VISIT(traverse_module_state->__pyx_tuple__27); + Py_VISIT(traverse_module_state->__pyx_tuple__29); + Py_VISIT(traverse_module_state->__pyx_tuple__31); + Py_VISIT(traverse_module_state->__pyx_tuple__35); + Py_VISIT(traverse_module_state->__pyx_tuple__38); + Py_VISIT(traverse_module_state->__pyx_tuple__39); + Py_VISIT(traverse_module_state->__pyx_tuple__42); + Py_VISIT(traverse_module_state->__pyx_codeobj__11); + Py_VISIT(traverse_module_state->__pyx_codeobj__13); + Py_VISIT(traverse_module_state->__pyx_codeobj__15); + Py_VISIT(traverse_module_state->__pyx_codeobj__16); + Py_VISIT(traverse_module_state->__pyx_codeobj__17); + Py_VISIT(traverse_module_state->__pyx_codeobj__19); + Py_VISIT(traverse_module_state->__pyx_codeobj__20); + Py_VISIT(traverse_module_state->__pyx_codeobj__22); + Py_VISIT(traverse_module_state->__pyx_codeobj__24); + Py_VISIT(traverse_module_state->__pyx_codeobj__25); + Py_VISIT(traverse_module_state->__pyx_codeobj__26); + Py_VISIT(traverse_module_state->__pyx_codeobj__28); + Py_VISIT(traverse_module_state->__pyx_codeobj__30); + Py_VISIT(traverse_module_state->__pyx_codeobj__32); + Py_VISIT(traverse_module_state->__pyx_codeobj__33); + Py_VISIT(traverse_module_state->__pyx_codeobj__34); + Py_VISIT(traverse_module_state->__pyx_codeobj__36); + Py_VISIT(traverse_module_state->__pyx_codeobj__40); + Py_VISIT(traverse_module_state->__pyx_codeobj__41); + Py_VISIT(traverse_module_state->__pyx_codeobj__43); + Py_VISIT(traverse_module_state->__pyx_codeobj__44); + Py_VISIT(traverse_module_state->__pyx_codeobj__45); + Py_VISIT(traverse_module_state->__pyx_codeobj__46); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo __pyx_mstate_global->__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo +#if CYTHON_USE_MODULE_STATE +#define __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo __pyx_mstate_global->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo +#define __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo __pyx_mstate_global->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo +#define __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo __pyx_mstate_global->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo +#define __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue __pyx_mstate_global->__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue +#endif +#define __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo __pyx_mstate_global->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo +#define __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo __pyx_mstate_global->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo +#define __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo __pyx_mstate_global->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo +#define __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue __pyx_mstate_global->__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue +#define __pyx_kp_s_ __pyx_mstate_global->__pyx_kp_s_ +#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError +#define __pyx_n_s_AttributeError __pyx_mstate_global->__pyx_n_s_AttributeError +#define __pyx_n_s_CacheValue __pyx_mstate_global->__pyx_n_s_CacheValue +#define __pyx_n_s_CacheValue___reduce_cython __pyx_mstate_global->__pyx_n_s_CacheValue___reduce_cython +#define __pyx_n_s_CacheValue___setstate_cython __pyx_mstate_global->__pyx_n_s_CacheValue___setstate_cython +#define __pyx_n_s_CacheValue_compute_force_stay_i __pyx_mstate_global->__pyx_n_s_CacheValue_compute_force_stay_i +#define __pyx_n_s_CodeLineInfo __pyx_mstate_global->__pyx_n_s_CodeLineInfo +#define __pyx_n_s_CodeLineInfo___reduce_cython __pyx_mstate_global->__pyx_n_s_CodeLineInfo___reduce_cython +#define __pyx_n_s_CodeLineInfo___setstate_cython __pyx_mstate_global->__pyx_n_s_CodeLineInfo___setstate_cython +#define __pyx_n_s_DebugHelper __pyx_mstate_global->__pyx_n_s_DebugHelper +#define __pyx_n_s_FuncCodeInfo __pyx_mstate_global->__pyx_n_s_FuncCodeInfo +#define __pyx_n_s_FuncCodeInfo___reduce_cython __pyx_mstate_global->__pyx_n_s_FuncCodeInfo___reduce_cython +#define __pyx_n_s_FuncCodeInfo___setstate_cython __pyx_mstate_global->__pyx_n_s_FuncCodeInfo___setstate_cython +#define __pyx_n_s_GlobalDebuggerHolder __pyx_mstate_global->__pyx_n_s_GlobalDebuggerHolder +#define __pyx_kp_s_If_a_code_object_is_cached_that __pyx_mstate_global->__pyx_kp_s_If_a_code_object_is_cached_that +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2 +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3 +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4 +#define __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER __pyx_mstate_global->__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER +#define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError +#define __pyx_n_s_SetTrace __pyx_mstate_global->__pyx_n_s_SetTrace +#define __pyx_n_s_ThreadInfo __pyx_mstate_global->__pyx_n_s_ThreadInfo +#define __pyx_n_s_ThreadInfo___reduce_cython __pyx_mstate_global->__pyx_n_s_ThreadInfo___reduce_cython +#define __pyx_n_s_ThreadInfo___setstate_cython __pyx_mstate_global->__pyx_n_s_ThreadInfo___setstate_cython +#define __pyx_n_s__10 __pyx_mstate_global->__pyx_n_s__10 +#define __pyx_kp_s__2 __pyx_mstate_global->__pyx_kp_s__2 +#define __pyx_kp_s__3 __pyx_mstate_global->__pyx_kp_s__3 +#define __pyx_kp_u__3 __pyx_mstate_global->__pyx_kp_u__3 +#define __pyx_n_s__47 __pyx_mstate_global->__pyx_n_s__47 +#define __pyx_kp_s__5 __pyx_mstate_global->__pyx_kp_s__5 +#define __pyx_n_s_active __pyx_mstate_global->__pyx_n_s_active +#define __pyx_n_s_additional_info __pyx_mstate_global->__pyx_n_s_additional_info +#define __pyx_n_s_arg __pyx_mstate_global->__pyx_n_s_arg +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_bootstrap __pyx_mstate_global->__pyx_n_s_bootstrap +#define __pyx_n_s_bootstrap_2 __pyx_mstate_global->__pyx_n_s_bootstrap_2 +#define __pyx_n_s_bootstrap_inner __pyx_mstate_global->__pyx_n_s_bootstrap_inner +#define __pyx_n_s_bootstrap_inner_2 __pyx_mstate_global->__pyx_n_s_bootstrap_inner_2 +#define __pyx_n_s_break_on_caught_exceptions __pyx_mstate_global->__pyx_n_s_break_on_caught_exceptions +#define __pyx_n_s_break_on_user_uncaught_exception __pyx_mstate_global->__pyx_n_s_break_on_user_uncaught_exception +#define __pyx_n_s_breakpoints __pyx_mstate_global->__pyx_n_s_breakpoints +#define __pyx_n_s_breakpoints_hit_at_lines __pyx_mstate_global->__pyx_n_s_breakpoints_hit_at_lines +#define __pyx_n_s_cache __pyx_mstate_global->__pyx_n_s_cache +#define __pyx_n_s_call __pyx_mstate_global->__pyx_n_s_call +#define __pyx_n_s_call_2 __pyx_mstate_global->__pyx_n_s_call_2 +#define __pyx_n_s_can_skip __pyx_mstate_global->__pyx_n_s_can_skip +#define __pyx_n_s_clear_thread_local_info __pyx_mstate_global->__pyx_n_s_clear_thread_local_info +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_code_line_info __pyx_mstate_global->__pyx_n_s_code_line_info +#define __pyx_n_s_code_obj __pyx_mstate_global->__pyx_n_s_code_obj +#define __pyx_n_s_code_obj_py __pyx_mstate_global->__pyx_n_s_code_obj_py +#define __pyx_n_s_compute_force_stay_in_untraced_m __pyx_mstate_global->__pyx_n_s_compute_force_stay_in_untraced_m +#define __pyx_n_s_current_thread __pyx_mstate_global->__pyx_n_s_current_thread +#define __pyx_n_s_decref_py __pyx_mstate_global->__pyx_n_s_decref_py +#define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict +#define __pyx_n_s_dict_2 __pyx_mstate_global->__pyx_n_s_dict_2 +#define __pyx_n_s_dis __pyx_mstate_global->__pyx_n_s_dis +#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable +#define __pyx_n_s_dummy_trace_dispatch __pyx_mstate_global->__pyx_n_s_dummy_trace_dispatch +#define __pyx_n_s_dummy_tracing_holder __pyx_mstate_global->__pyx_n_s_dummy_tracing_holder +#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable +#define __pyx_n_s_enter __pyx_mstate_global->__pyx_n_s_enter +#define __pyx_n_s_event __pyx_mstate_global->__pyx_n_s_event +#define __pyx_n_s_exec __pyx_mstate_global->__pyx_n_s_exec +#define __pyx_n_s_exit __pyx_mstate_global->__pyx_n_s_exit +#define __pyx_n_s_f_back __pyx_mstate_global->__pyx_n_s_f_back +#define __pyx_n_s_f_trace __pyx_mstate_global->__pyx_n_s_f_trace +#define __pyx_n_s_findlinestarts __pyx_mstate_global->__pyx_n_s_findlinestarts +#define __pyx_n_s_first_line __pyx_mstate_global->__pyx_n_s_first_line +#define __pyx_n_s_fix_top_level_trace_and_get_trac __pyx_mstate_global->__pyx_n_s_fix_top_level_trace_and_get_trac +#define __pyx_n_s_frame __pyx_mstate_global->__pyx_n_s_frame +#define __pyx_n_s_frame_eval_func __pyx_mstate_global->__pyx_n_s_frame_eval_func +#define __pyx_n_s_function_breakpoint_name_to_brea __pyx_mstate_global->__pyx_n_s_function_breakpoint_name_to_brea +#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc +#define __pyx_n_s_generate_code_with_breakpoints_p __pyx_mstate_global->__pyx_n_s_generate_code_with_breakpoints_p +#define __pyx_n_s_get __pyx_mstate_global->__pyx_n_s_get +#define __pyx_n_s_get_abs_path_real_path_and_base __pyx_mstate_global->__pyx_n_s_get_abs_path_real_path_and_base +#define __pyx_n_s_get_cache_file_type __pyx_mstate_global->__pyx_n_s_get_cache_file_type +#define __pyx_n_s_get_cached_code_obj_info_py __pyx_mstate_global->__pyx_n_s_get_cached_code_obj_info_py +#define __pyx_n_s_get_code_line_info __pyx_mstate_global->__pyx_n_s_get_code_line_info +#define __pyx_n_s_get_file_type __pyx_mstate_global->__pyx_n_s_get_file_type +#define __pyx_n_s_get_func_code_info_py __pyx_mstate_global->__pyx_n_s_get_func_code_info_py +#define __pyx_n_s_get_ident __pyx_mstate_global->__pyx_n_s_get_ident +#define __pyx_n_s_get_ident_2 __pyx_mstate_global->__pyx_n_s_get_ident_2 +#define __pyx_n_s_get_thread_info_py __pyx_mstate_global->__pyx_n_s_get_thread_info_py +#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate +#define __pyx_n_s_global_dbg __pyx_mstate_global->__pyx_n_s_global_dbg +#define __pyx_n_s_has_plugin_exception_breaks __pyx_mstate_global->__pyx_n_s_has_plugin_exception_breaks +#define __pyx_n_s_has_plugin_line_breaks __pyx_mstate_global->__pyx_n_s_has_plugin_line_breaks +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_insert_pydevd_breaks __pyx_mstate_global->__pyx_n_s_insert_pydevd_breaks +#define __pyx_n_s_intersection __pyx_mstate_global->__pyx_n_s_intersection +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_n_s_is_pydev_daemon_thread __pyx_mstate_global->__pyx_n_s_is_pydev_daemon_thread +#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled +#define __pyx_n_s_issuperset __pyx_mstate_global->__pyx_n_s_issuperset +#define __pyx_n_s_last_line __pyx_mstate_global->__pyx_n_s_last_line +#define __pyx_n_s_line __pyx_mstate_global->__pyx_n_s_line +#define __pyx_n_s_line_to_offset __pyx_mstate_global->__pyx_n_s_line_to_offset +#define __pyx_n_s_local __pyx_mstate_global->__pyx_n_s_local +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_main_2 __pyx_mstate_global->__pyx_n_s_main_2 +#define __pyx_n_s_max __pyx_mstate_global->__pyx_n_s_max +#define __pyx_n_s_min __pyx_mstate_global->__pyx_n_s_min +#define __pyx_n_s_mtime __pyx_mstate_global->__pyx_n_s_mtime +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new +#define __pyx_n_s_obj __pyx_mstate_global->__pyx_n_s_obj +#define __pyx_n_s_offset __pyx_mstate_global->__pyx_n_s_offset +#define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle +#define __pyx_n_s_plugin __pyx_mstate_global->__pyx_n_s_plugin +#define __pyx_n_s_pydev_bundle__pydev_saved_modul __pyx_mstate_global->__pyx_n_s_pydev_bundle__pydev_saved_modul +#define __pyx_n_s_pydev_monkey __pyx_mstate_global->__pyx_n_s_pydev_monkey +#define __pyx_n_s_pydevd __pyx_mstate_global->__pyx_n_s_pydevd +#define __pyx_n_s_pydevd_bundle_pydevd_additional __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_additional +#define __pyx_n_s_pydevd_bundle_pydevd_constants __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_constants +#define __pyx_n_s_pydevd_bundle_pydevd_trace_disp __pyx_mstate_global->__pyx_n_s_pydevd_bundle_pydevd_trace_disp +#define __pyx_n_s_pydevd_file_utils __pyx_mstate_global->__pyx_n_s_pydevd_file_utils +#define __pyx_n_s_pydevd_frame_eval_pydevd_frame __pyx_mstate_global->__pyx_n_s_pydevd_frame_eval_pydevd_frame +#define __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2 __pyx_mstate_global->__pyx_kp_s_pydevd_frame_eval_pydevd_frame_2 +#define __pyx_n_s_pydevd_frame_eval_pydevd_frame_3 __pyx_mstate_global->__pyx_n_s_pydevd_frame_eval_pydevd_frame_3 +#define __pyx_n_s_pydevd_frame_eval_pydevd_modify __pyx_mstate_global->__pyx_n_s_pydevd_frame_eval_pydevd_modify +#define __pyx_n_s_pydevd_tracing __pyx_mstate_global->__pyx_n_s_pydevd_tracing +#define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError +#define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum +#define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result +#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state +#define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type +#define __pyx_n_s_pyx_unpickle_FuncCodeInfo __pyx_mstate_global->__pyx_n_s_pyx_unpickle_FuncCodeInfo +#define __pyx_n_s_pyx_unpickle_ThreadInfo __pyx_mstate_global->__pyx_n_s_pyx_unpickle_ThreadInfo +#define __pyx_n_s_pyx_unpickle__CacheValue __pyx_mstate_global->__pyx_n_s_pyx_unpickle__CacheValue +#define __pyx_n_s_pyx_unpickle__CodeLineInfo __pyx_mstate_global->__pyx_n_s_pyx_unpickle__CodeLineInfo +#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable +#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce +#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython +#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex +#define __pyx_n_s_return __pyx_mstate_global->__pyx_n_s_return +#define __pyx_n_s_rfind __pyx_mstate_global->__pyx_n_s_rfind +#define __pyx_n_s_run __pyx_mstate_global->__pyx_n_s_run +#define __pyx_n_s_self __pyx_mstate_global->__pyx_n_s_self +#define __pyx_n_s_set_additional_thread_info_lock __pyx_mstate_global->__pyx_n_s_set_additional_thread_info_lock +#define __pyx_n_s_set_trace_func __pyx_mstate_global->__pyx_n_s_set_trace_func +#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate +#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython +#define __pyx_n_s_show_return_values __pyx_mstate_global->__pyx_n_s_show_return_values +#define __pyx_n_s_signature_factory __pyx_mstate_global->__pyx_n_s_signature_factory +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_state __pyx_mstate_global->__pyx_n_s_state +#define __pyx_n_s_stop_frame_eval __pyx_mstate_global->__pyx_n_s_stop_frame_eval +#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource +#define __pyx_n_s_sys __pyx_mstate_global->__pyx_n_s_sys +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_n_s_thread __pyx_mstate_global->__pyx_n_s_thread +#define __pyx_n_s_thread_active __pyx_mstate_global->__pyx_n_s_thread_active +#define __pyx_n_s_thread_info __pyx_mstate_global->__pyx_n_s_thread_info +#define __pyx_n_s_thread_local_info __pyx_mstate_global->__pyx_n_s_thread_local_info +#define __pyx_n_s_threading __pyx_mstate_global->__pyx_n_s_threading +#define __pyx_n_s_trace_dispatch __pyx_mstate_global->__pyx_n_s_trace_dispatch +#define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update +#define __pyx_n_s_update_globals_dict __pyx_mstate_global->__pyx_n_s_update_globals_dict +#define __pyx_n_s_use_setstate __pyx_mstate_global->__pyx_n_s_use_setstate +#define __pyx_n_s_version_info __pyx_mstate_global->__pyx_n_s_version_info +#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0 +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_int_2 __pyx_mstate_global->__pyx_int_2 +#define __pyx_int_3 __pyx_mstate_global->__pyx_int_3 +#define __pyx_int_9 __pyx_mstate_global->__pyx_int_9 +#define __pyx_int_2520179 __pyx_mstate_global->__pyx_int_2520179 +#define __pyx_int_11485321 __pyx_mstate_global->__pyx_int_11485321 +#define __pyx_int_64258489 __pyx_mstate_global->__pyx_int_64258489 +#define __pyx_int_66829570 __pyx_mstate_global->__pyx_int_66829570 +#define __pyx_int_72405718 __pyx_mstate_global->__pyx_int_72405718 +#define __pyx_int_95010005 __pyx_mstate_global->__pyx_int_95010005 +#define __pyx_int_156687530 __pyx_mstate_global->__pyx_int_156687530 +#define __pyx_int_180628038 __pyx_mstate_global->__pyx_int_180628038 +#define __pyx_int_188670045 __pyx_mstate_global->__pyx_int_188670045 +#define __pyx_int_193022138 __pyx_mstate_global->__pyx_int_193022138 +#define __pyx_int_240343912 __pyx_mstate_global->__pyx_int_240343912 +#define __pyx_int_249558979 __pyx_mstate_global->__pyx_int_249558979 +#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 +#define __pyx_tuple__6 __pyx_mstate_global->__pyx_tuple__6 +#define __pyx_tuple__7 __pyx_mstate_global->__pyx_tuple__7 +#define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_slice__37 __pyx_mstate_global->__pyx_slice__37 +#define __pyx_tuple__12 __pyx_mstate_global->__pyx_tuple__12 +#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 +#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 +#define __pyx_tuple__21 __pyx_mstate_global->__pyx_tuple__21 +#define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23 +#define __pyx_tuple__27 __pyx_mstate_global->__pyx_tuple__27 +#define __pyx_tuple__29 __pyx_mstate_global->__pyx_tuple__29 +#define __pyx_tuple__31 __pyx_mstate_global->__pyx_tuple__31 +#define __pyx_tuple__35 __pyx_mstate_global->__pyx_tuple__35 +#define __pyx_tuple__38 __pyx_mstate_global->__pyx_tuple__38 +#define __pyx_tuple__39 __pyx_mstate_global->__pyx_tuple__39 +#define __pyx_tuple__42 __pyx_mstate_global->__pyx_tuple__42 +#define __pyx_codeobj__11 __pyx_mstate_global->__pyx_codeobj__11 +#define __pyx_codeobj__13 __pyx_mstate_global->__pyx_codeobj__13 +#define __pyx_codeobj__15 __pyx_mstate_global->__pyx_codeobj__15 +#define __pyx_codeobj__16 __pyx_mstate_global->__pyx_codeobj__16 +#define __pyx_codeobj__17 __pyx_mstate_global->__pyx_codeobj__17 +#define __pyx_codeobj__19 __pyx_mstate_global->__pyx_codeobj__19 +#define __pyx_codeobj__20 __pyx_mstate_global->__pyx_codeobj__20 +#define __pyx_codeobj__22 __pyx_mstate_global->__pyx_codeobj__22 +#define __pyx_codeobj__24 __pyx_mstate_global->__pyx_codeobj__24 +#define __pyx_codeobj__25 __pyx_mstate_global->__pyx_codeobj__25 +#define __pyx_codeobj__26 __pyx_mstate_global->__pyx_codeobj__26 +#define __pyx_codeobj__28 __pyx_mstate_global->__pyx_codeobj__28 +#define __pyx_codeobj__30 __pyx_mstate_global->__pyx_codeobj__30 +#define __pyx_codeobj__32 __pyx_mstate_global->__pyx_codeobj__32 +#define __pyx_codeobj__33 __pyx_mstate_global->__pyx_codeobj__33 +#define __pyx_codeobj__34 __pyx_mstate_global->__pyx_codeobj__34 +#define __pyx_codeobj__36 __pyx_mstate_global->__pyx_codeobj__36 +#define __pyx_codeobj__40 __pyx_mstate_global->__pyx_codeobj__40 +#define __pyx_codeobj__41 __pyx_mstate_global->__pyx_codeobj__41 +#define __pyx_codeobj__43 __pyx_mstate_global->__pyx_codeobj__43 +#define __pyx_codeobj__44 __pyx_mstate_global->__pyx_codeobj__44 +#define __pyx_codeobj__45 __pyx_mstate_global->__pyx_codeobj__45 +#define __pyx_codeobj__46 __pyx_mstate_global->__pyx_codeobj__46 +/* #### Code section: module_code ### */ + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":19 + * _thread_active = threading._active + * + * def clear_thread_local_info(): # <<<<<<<<<<<<<< + * global _thread_local_info + * _thread_local_info = threading.local() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_1clear_thread_local_info(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_1clear_thread_local_info = {"clear_thread_local_info", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_1clear_thread_local_info, METH_NOARGS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_1clear_thread_local_info(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("clear_thread_local_info (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_clear_thread_local_info(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_clear_thread_local_info(CYTHON_UNUSED PyObject *__pyx_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + unsigned int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("clear_thread_local_info", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":21 + * def clear_thread_local_info(): + * global _thread_local_info + * _thread_local_info = threading.local() # <<<<<<<<<<<<<< + * + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_local); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + if (PyDict_SetItem(__pyx_d, __pyx_n_s_thread_local_info, __pyx_t_1) < 0) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":19 + * _thread_active = threading._active + * + * def clear_thread_local_info(): # <<<<<<<<<<<<<< + * global _thread_local_info + * _thread_local_info = threading.local() + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.clear_thread_local_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":39 + * cdef public bint force_stay_in_untraced_mode + * + * cdef initialize(self, PyFrameObject * frame_obj): # <<<<<<<<<<<<<< + * # Places that create a ThreadInfo should verify that + * # a current Python frame is being executed! + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_initialize(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyFrameObject *__pyx_v_frame_obj) { + PyObject *__pyx_v_basename = NULL; + PyObject *__pyx_v_i = NULL; + PyObject *__pyx_v_j = NULL; + PyObject *__pyx_v_co_name = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyFrameObject *__pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + unsigned int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("initialize", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":42 + * # Places that create a ThreadInfo should verify that + * # a current Python frame is being executed! + * assert frame_obj != NULL # <<<<<<<<<<<<<< + * + * self.additional_info = None + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_1 = (__pyx_v_frame_obj != NULL); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(0, 42, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(0, 42, __pyx_L1_error) + #endif + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":44 + * assert frame_obj != NULL + * + * self.additional_info = None # <<<<<<<<<<<<<< + * self.is_pydevd_thread = False + * self.inside_frame_eval = 0 + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF((PyObject *)__pyx_v_self->additional_info); + __Pyx_DECREF((PyObject *)__pyx_v_self->additional_info); + __pyx_v_self->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)Py_None); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":45 + * + * self.additional_info = None + * self.is_pydevd_thread = False # <<<<<<<<<<<<<< + * self.inside_frame_eval = 0 + * self.fully_initialized = False + */ + __pyx_v_self->is_pydevd_thread = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":46 + * self.additional_info = None + * self.is_pydevd_thread = False + * self.inside_frame_eval = 0 # <<<<<<<<<<<<<< + * self.fully_initialized = False + * self.thread_trace_func = None + */ + __pyx_v_self->inside_frame_eval = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":47 + * self.is_pydevd_thread = False + * self.inside_frame_eval = 0 + * self.fully_initialized = False # <<<<<<<<<<<<<< + * self.thread_trace_func = None + * + */ + __pyx_v_self->fully_initialized = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":48 + * self.inside_frame_eval = 0 + * self.fully_initialized = False + * self.thread_trace_func = None # <<<<<<<<<<<<<< + * + * # Get the root (if it's not a Thread initialized from the threading + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->thread_trace_func); + __Pyx_DECREF(__pyx_v_self->thread_trace_func); + __pyx_v_self->thread_trace_func = Py_None; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":54 + * # otherwise, we have to wait for the threading module itself to + * # create the Thread entry). + * while frame_obj.f_back != NULL: # <<<<<<<<<<<<<< + * frame_obj = frame_obj.f_back + * + */ + while (1) { + __pyx_t_1 = (__pyx_v_frame_obj->f_back != NULL); + if (!__pyx_t_1) break; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":55 + * # create the Thread entry). + * while frame_obj.f_back != NULL: + * frame_obj = frame_obj.f_back # <<<<<<<<<<<<<< + * + * basename = frame_obj.f_code.co_filename + */ + __pyx_t_2 = __pyx_v_frame_obj->f_back; + __pyx_v_frame_obj = __pyx_t_2; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":57 + * frame_obj = frame_obj.f_back + * + * basename = frame_obj.f_code.co_filename # <<<<<<<<<<<<<< + * i = basename.rfind('/') + * j = basename.rfind('\\') + */ + __pyx_t_3 = ((PyObject *)__pyx_v_frame_obj->f_code->co_filename); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_basename = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":58 + * + * basename = frame_obj.f_code.co_filename + * i = basename.rfind('/') # <<<<<<<<<<<<<< + * j = basename.rfind('\\') + * if j > i: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_basename, __pyx_n_s_rfind); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_kp_s_}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_v_i = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":59 + * basename = frame_obj.f_code.co_filename + * i = basename.rfind('/') + * j = basename.rfind('\\') # <<<<<<<<<<<<<< + * if j > i: + * i = j + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_basename, __pyx_n_s_rfind); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 59, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_kp_s__2}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 59, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_v_j = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":60 + * i = basename.rfind('/') + * j = basename.rfind('\\') + * if j > i: # <<<<<<<<<<<<<< + * i = j + * if i >= 0: + */ + __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_v_i, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 60, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 60, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":61 + * j = basename.rfind('\\') + * if j > i: + * i = j # <<<<<<<<<<<<<< + * if i >= 0: + * basename = basename[i + 1:] + */ + __Pyx_INCREF(__pyx_v_j); + __Pyx_DECREF_SET(__pyx_v_i, __pyx_v_j); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":60 + * i = basename.rfind('/') + * j = basename.rfind('\\') + * if j > i: # <<<<<<<<<<<<<< + * i = j + * if i >= 0: + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":62 + * if j > i: + * i = j + * if i >= 0: # <<<<<<<<<<<<<< + * basename = basename[i + 1:] + * # remove ext + */ + __pyx_t_3 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":63 + * i = j + * if i >= 0: + * basename = basename[i + 1:] # <<<<<<<<<<<<<< + * # remove ext + * i = basename.rfind('.') + */ + __pyx_t_3 = __Pyx_PyInt_AddObjC(__pyx_v_i, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 63, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_basename, 0, 0, &__pyx_t_3, NULL, NULL, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 63, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_basename, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":62 + * if j > i: + * i = j + * if i >= 0: # <<<<<<<<<<<<<< + * basename = basename[i + 1:] + * # remove ext + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":65 + * basename = basename[i + 1:] + * # remove ext + * i = basename.rfind('.') # <<<<<<<<<<<<<< + * if i >= 0: + * basename = basename[:i] + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_basename, __pyx_n_s_rfind); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 65, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_kp_s__3}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 65, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF_SET(__pyx_v_i, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":66 + * # remove ext + * i = basename.rfind('.') + * if i >= 0: # <<<<<<<<<<<<<< + * basename = basename[:i] + * + */ + __pyx_t_4 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 66, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":67 + * i = basename.rfind('.') + * if i >= 0: + * basename = basename[:i] # <<<<<<<<<<<<<< + * + * co_name = frame_obj.f_code.co_name + */ + __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_basename, 0, 0, NULL, &__pyx_v_i, NULL, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF_SET(__pyx_v_basename, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":66 + * # remove ext + * i = basename.rfind('.') + * if i >= 0: # <<<<<<<<<<<<<< + * basename = basename[:i] + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":69 + * basename = basename[:i] + * + * co_name = frame_obj.f_code.co_name # <<<<<<<<<<<<<< + * + * # In these cases we cannot create a dummy thread (an actual + */ + __pyx_t_4 = ((PyObject *)__pyx_v_frame_obj->f_code->co_name); + __Pyx_INCREF(__pyx_t_4); + __pyx_v_co_name = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":73 + * # In these cases we cannot create a dummy thread (an actual + * # thread will be created later or tracing will already be set). + * if basename == 'threading' and co_name in ('__bootstrap', '_bootstrap', '__bootstrap_inner', '_bootstrap_inner'): # <<<<<<<<<<<<<< + * self._can_create_dummy_thread = False + * elif basename == 'pydev_monkey' and co_name == '__call__': + */ + __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_v_basename, __pyx_n_s_threading, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 73, __pyx_L1_error) + if (__pyx_t_7) { + } else { + __pyx_t_1 = __pyx_t_7; + goto __pyx_L9_bool_binop_done; + } + __Pyx_INCREF(__pyx_v_co_name); + __pyx_t_4 = __pyx_v_co_name; + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_t_4, __pyx_n_s_bootstrap, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 73, __pyx_L1_error) + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_t_4, __pyx_n_s_bootstrap_2, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 73, __pyx_L1_error) + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_t_4, __pyx_n_s_bootstrap_inner, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 73, __pyx_L1_error) + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_t_4, __pyx_n_s_bootstrap_inner_2, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 73, __pyx_L1_error) + __pyx_t_7 = __pyx_t_8; + __pyx_L11_bool_binop_done:; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_8 = __pyx_t_7; + __pyx_t_1 = __pyx_t_8; + __pyx_L9_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":74 + * # thread will be created later or tracing will already be set). + * if basename == 'threading' and co_name in ('__bootstrap', '_bootstrap', '__bootstrap_inner', '_bootstrap_inner'): + * self._can_create_dummy_thread = False # <<<<<<<<<<<<<< + * elif basename == 'pydev_monkey' and co_name == '__call__': + * self._can_create_dummy_thread = False + */ + __pyx_v_self->_can_create_dummy_thread = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":73 + * # In these cases we cannot create a dummy thread (an actual + * # thread will be created later or tracing will already be set). + * if basename == 'threading' and co_name in ('__bootstrap', '_bootstrap', '__bootstrap_inner', '_bootstrap_inner'): # <<<<<<<<<<<<<< + * self._can_create_dummy_thread = False + * elif basename == 'pydev_monkey' and co_name == '__call__': + */ + goto __pyx_L8; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":75 + * if basename == 'threading' and co_name in ('__bootstrap', '_bootstrap', '__bootstrap_inner', '_bootstrap_inner'): + * self._can_create_dummy_thread = False + * elif basename == 'pydev_monkey' and co_name == '__call__': # <<<<<<<<<<<<<< + * self._can_create_dummy_thread = False + * elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): + */ + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_v_basename, __pyx_n_s_pydev_monkey, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 75, __pyx_L1_error) + if (__pyx_t_8) { + } else { + __pyx_t_1 = __pyx_t_8; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_v_co_name, __pyx_n_s_call, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 75, __pyx_L1_error) + __pyx_t_1 = __pyx_t_8; + __pyx_L15_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":76 + * self._can_create_dummy_thread = False + * elif basename == 'pydev_monkey' and co_name == '__call__': + * self._can_create_dummy_thread = False # <<<<<<<<<<<<<< + * elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): + * self._can_create_dummy_thread = False + */ + __pyx_v_self->_can_create_dummy_thread = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":75 + * if basename == 'threading' and co_name in ('__bootstrap', '_bootstrap', '__bootstrap_inner', '_bootstrap_inner'): + * self._can_create_dummy_thread = False + * elif basename == 'pydev_monkey' and co_name == '__call__': # <<<<<<<<<<<<<< + * self._can_create_dummy_thread = False + * elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): + */ + goto __pyx_L8; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":77 + * elif basename == 'pydev_monkey' and co_name == '__call__': + * self._can_create_dummy_thread = False + * elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): # <<<<<<<<<<<<<< + * self._can_create_dummy_thread = False + * elif basename == 'pydevd_tracing': + */ + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_v_basename, __pyx_n_s_pydevd, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 77, __pyx_L1_error) + if (__pyx_t_8) { + } else { + __pyx_t_1 = __pyx_t_8; + goto __pyx_L17_bool_binop_done; + } + __Pyx_INCREF(__pyx_v_co_name); + __pyx_t_4 = __pyx_v_co_name; + __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_t_4, __pyx_n_s_run, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 77, __pyx_L1_error) + if (!__pyx_t_7) { + } else { + __pyx_t_8 = __pyx_t_7; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_t_4, __pyx_n_s_main, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 77, __pyx_L1_error) + if (!__pyx_t_7) { + } else { + __pyx_t_8 = __pyx_t_7; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_t_4, __pyx_n_s_exec, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 77, __pyx_L1_error) + __pyx_t_8 = __pyx_t_7; + __pyx_L19_bool_binop_done:; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_7 = __pyx_t_8; + __pyx_t_1 = __pyx_t_7; + __pyx_L17_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":78 + * self._can_create_dummy_thread = False + * elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): + * self._can_create_dummy_thread = False # <<<<<<<<<<<<<< + * elif basename == 'pydevd_tracing': + * self._can_create_dummy_thread = False + */ + __pyx_v_self->_can_create_dummy_thread = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":77 + * elif basename == 'pydev_monkey' and co_name == '__call__': + * self._can_create_dummy_thread = False + * elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): # <<<<<<<<<<<<<< + * self._can_create_dummy_thread = False + * elif basename == 'pydevd_tracing': + */ + goto __pyx_L8; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":79 + * elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): + * self._can_create_dummy_thread = False + * elif basename == 'pydevd_tracing': # <<<<<<<<<<<<<< + * self._can_create_dummy_thread = False + * else: + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_basename, __pyx_n_s_pydevd_tracing, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 79, __pyx_L1_error) + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":80 + * self._can_create_dummy_thread = False + * elif basename == 'pydevd_tracing': + * self._can_create_dummy_thread = False # <<<<<<<<<<<<<< + * else: + * self._can_create_dummy_thread = True + */ + __pyx_v_self->_can_create_dummy_thread = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":79 + * elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): + * self._can_create_dummy_thread = False + * elif basename == 'pydevd_tracing': # <<<<<<<<<<<<<< + * self._can_create_dummy_thread = False + * else: + */ + goto __pyx_L8; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":82 + * self._can_create_dummy_thread = False + * else: + * self._can_create_dummy_thread = True # <<<<<<<<<<<<<< + * + * # print('Can create dummy thread for thread started in: %s %s' % (basename, co_name)) + */ + /*else*/ { + __pyx_v_self->_can_create_dummy_thread = 1; + } + __pyx_L8:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":39 + * cdef public bint force_stay_in_untraced_mode + * + * cdef initialize(self, PyFrameObject * frame_obj): # <<<<<<<<<<<<<< + * # Places that create a ThreadInfo should verify that + * # a current Python frame is being executed! + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.initialize", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_basename); + __Pyx_XDECREF(__pyx_v_i); + __Pyx_XDECREF(__pyx_v_j); + __Pyx_XDECREF(__pyx_v_co_name); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":86 + * # print('Can create dummy thread for thread started in: %s %s' % (basename, co_name)) + * + * cdef initialize_if_possible(self): # <<<<<<<<<<<<<< + * # Don't call threading.currentThread because if we're too early in the process + * # we may create a dummy thread. + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_initialize_if_possible(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + PyObject *__pyx_v_thread_ident = NULL; + PyObject *__pyx_v_t = NULL; + PyObject *__pyx_v_additional_info = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + unsigned int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + int __pyx_t_18; + int __pyx_t_19; + int __pyx_t_20; + char const *__pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("initialize_if_possible", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":89 + * # Don't call threading.currentThread because if we're too early in the process + * # we may create a dummy thread. + * self.inside_frame_eval += 1 # <<<<<<<<<<<<<< + * + * try: + */ + __pyx_v_self->inside_frame_eval = (__pyx_v_self->inside_frame_eval + 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":91 + * self.inside_frame_eval += 1 + * + * try: # <<<<<<<<<<<<<< + * thread_ident = _get_ident() + * t = _thread_active.get(thread_ident) + */ + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":92 + * + * try: + * thread_ident = _get_ident() # <<<<<<<<<<<<<< + * t = _thread_active.get(thread_ident) + * if t is None: + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_get_ident); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 92, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_v_thread_ident = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":93 + * try: + * thread_ident = _get_ident() + * t = _thread_active.get(thread_ident) # <<<<<<<<<<<<<< + * if t is None: + * if self._can_create_dummy_thread: + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_thread_active); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 93, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_thread_ident}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v_t = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":94 + * thread_ident = _get_ident() + * t = _thread_active.get(thread_ident) + * if t is None: # <<<<<<<<<<<<<< + * if self._can_create_dummy_thread: + * # Initialize the dummy thread and set the tracing (both are needed to + */ + __pyx_t_5 = (__pyx_v_t == Py_None); + if (__pyx_t_5) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":95 + * t = _thread_active.get(thread_ident) + * if t is None: + * if self._can_create_dummy_thread: # <<<<<<<<<<<<<< + * # Initialize the dummy thread and set the tracing (both are needed to + * # actually stop on breakpoints). + */ + if (__pyx_v_self->_can_create_dummy_thread) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":98 + * # Initialize the dummy thread and set the tracing (both are needed to + * # actually stop on breakpoints). + * t = threading.current_thread() # <<<<<<<<<<<<<< + * SetTrace(dummy_trace_dispatch) + * else: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 98, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_current_thread); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 98, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF_SET(__pyx_v_t, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":99 + * # actually stop on breakpoints). + * t = threading.current_thread() + * SetTrace(dummy_trace_dispatch) # <<<<<<<<<<<<<< + * else: + * return # Cannot initialize until thread becomes active. + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_SetTrace); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 99, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_dummy_trace_dispatch); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 99, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":95 + * t = _thread_active.get(thread_ident) + * if t is None: + * if self._can_create_dummy_thread: # <<<<<<<<<<<<<< + * # Initialize the dummy thread and set the tracing (both are needed to + * # actually stop on breakpoints). + */ + goto __pyx_L7; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":101 + * SetTrace(dummy_trace_dispatch) + * else: + * return # Cannot initialize until thread becomes active. # <<<<<<<<<<<<<< + * + * if getattr(t, 'is_pydev_daemon_thread', False): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L3_return; + } + __pyx_L7:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":94 + * thread_ident = _get_ident() + * t = _thread_active.get(thread_ident) + * if t is None: # <<<<<<<<<<<<<< + * if self._can_create_dummy_thread: + * # Initialize the dummy thread and set the tracing (both are needed to + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":103 + * return # Cannot initialize until thread becomes active. + * + * if getattr(t, 'is_pydev_daemon_thread', False): # <<<<<<<<<<<<<< + * self.is_pydevd_thread = True + * self.fully_initialized = True + */ + __pyx_t_1 = __Pyx_GetAttr3(__pyx_v_t, __pyx_n_s_is_pydev_daemon_thread, Py_False); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 103, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(0, 103, __pyx_L4_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_5) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":104 + * + * if getattr(t, 'is_pydev_daemon_thread', False): + * self.is_pydevd_thread = True # <<<<<<<<<<<<<< + * self.fully_initialized = True + * else: + */ + __pyx_v_self->is_pydevd_thread = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":105 + * if getattr(t, 'is_pydev_daemon_thread', False): + * self.is_pydevd_thread = True + * self.fully_initialized = True # <<<<<<<<<<<<<< + * else: + * try: + */ + __pyx_v_self->fully_initialized = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":103 + * return # Cannot initialize until thread becomes active. + * + * if getattr(t, 'is_pydev_daemon_thread', False): # <<<<<<<<<<<<<< + * self.is_pydevd_thread = True + * self.fully_initialized = True + */ + goto __pyx_L8; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":107 + * self.fully_initialized = True + * else: + * try: # <<<<<<<<<<<<<< + * additional_info = t.additional_info + * if additional_info is None: + */ + /*else*/ { + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":108 + * else: + * try: + * additional_info = t.additional_info # <<<<<<<<<<<<<< + * if additional_info is None: + * raise AttributeError() + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_t, __pyx_n_s_additional_info); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 108, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_additional_info = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":109 + * try: + * additional_info = t.additional_info + * if additional_info is None: # <<<<<<<<<<<<<< + * raise AttributeError() + * except: + */ + __pyx_t_5 = (__pyx_v_additional_info == Py_None); + if (unlikely(__pyx_t_5)) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":110 + * additional_info = t.additional_info + * if additional_info is None: + * raise AttributeError() # <<<<<<<<<<<<<< + * except: + * with _set_additional_thread_info_lock: + */ + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_builtin_AttributeError); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 110, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 110, __pyx_L9_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":109 + * try: + * additional_info = t.additional_info + * if additional_info is None: # <<<<<<<<<<<<<< + * raise AttributeError() + * except: + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":107 + * self.fully_initialized = True + * else: + * try: # <<<<<<<<<<<<<< + * additional_info = t.additional_info + * if additional_info is None: + */ + } + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L14_try_end; + __pyx_L9_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":111 + * if additional_info is None: + * raise AttributeError() + * except: # <<<<<<<<<<<<<< + * with _set_additional_thread_info_lock: + * # If it's not there, set it within a lock to avoid any racing + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.initialize_if_possible", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) __PYX_ERR(0, 111, __pyx_L11_except_error) + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":112 + * raise AttributeError() + * except: + * with _set_additional_thread_info_lock: # <<<<<<<<<<<<<< + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + */ + /*with:*/ { + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_set_additional_thread_info_lock); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 112, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_10 = __Pyx_PyObject_LookupSpecial(__pyx_t_6, __pyx_n_s_exit); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 112, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_12 = __Pyx_PyObject_LookupSpecial(__pyx_t_6, __pyx_n_s_enter); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 112, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_13 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_12))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_12); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_12, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_13, NULL}; + __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 112, __pyx_L18_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + } + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + /*try:*/ { + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_14); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":115 + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + * additional_info = getattr(thread, 'additional_info', None) # <<<<<<<<<<<<<< + * if additional_info is None: + * additional_info = PyDBAdditionalThreadInfo() + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_thread); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 115, __pyx_L24_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_11 = __Pyx_GetAttr3(__pyx_t_6, __pyx_n_s_additional_info, Py_None); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 115, __pyx_L24_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF_SET(__pyx_v_additional_info, __pyx_t_11); + __pyx_t_11 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":116 + * # conditions. + * additional_info = getattr(thread, 'additional_info', None) + * if additional_info is None: # <<<<<<<<<<<<<< + * additional_info = PyDBAdditionalThreadInfo() + * t.additional_info = additional_info + */ + __pyx_t_5 = (__pyx_v_additional_info == Py_None); + if (__pyx_t_5) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":117 + * additional_info = getattr(thread, 'additional_info', None) + * if additional_info is None: + * additional_info = PyDBAdditionalThreadInfo() # <<<<<<<<<<<<<< + * t.additional_info = additional_info + * self.additional_info = additional_info + */ + __pyx_t_11 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 117, __pyx_L24_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF_SET(__pyx_v_additional_info, __pyx_t_11); + __pyx_t_11 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":116 + * # conditions. + * additional_info = getattr(thread, 'additional_info', None) + * if additional_info is None: # <<<<<<<<<<<<<< + * additional_info = PyDBAdditionalThreadInfo() + * t.additional_info = additional_info + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":118 + * if additional_info is None: + * additional_info = PyDBAdditionalThreadInfo() + * t.additional_info = additional_info # <<<<<<<<<<<<<< + * self.additional_info = additional_info + * self.fully_initialized = True + */ + if (__Pyx_PyObject_SetAttrStr(__pyx_v_t, __pyx_n_s_additional_info, __pyx_v_additional_info) < 0) __PYX_ERR(0, 118, __pyx_L24_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":112 + * raise AttributeError() + * except: + * with _set_additional_thread_info_lock: # <<<<<<<<<<<<<< + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + */ + } + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; + goto __pyx_L31_try_end; + __pyx_L24_error:; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + /*except:*/ { + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.initialize_if_possible", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_6, &__pyx_t_12) < 0) __PYX_ERR(0, 112, __pyx_L26_except_error) + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_12); + __pyx_t_13 = PyTuple_Pack(3, __pyx_t_11, __pyx_t_6, __pyx_t_12); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 112, __pyx_L26_except_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_17 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_13, NULL); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 112, __pyx_L26_except_error) + __Pyx_GOTREF(__pyx_t_17); + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_17); + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + if (__pyx_t_5 < 0) __PYX_ERR(0, 112, __pyx_L26_except_error) + __pyx_t_18 = (!__pyx_t_5); + if (unlikely(__pyx_t_18)) { + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ErrRestoreWithState(__pyx_t_11, __pyx_t_6, __pyx_t_12); + __pyx_t_11 = 0; __pyx_t_6 = 0; __pyx_t_12 = 0; + __PYX_ERR(0, 112, __pyx_L26_except_error) + } + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + goto __pyx_L25_exception_handled; + } + __pyx_L26_except_error:; + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); + goto __pyx_L11_except_error; + __pyx_L25_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); + __pyx_L31_try_end:; + } + } + /*finally:*/ { + /*normal exit:*/{ + if (__pyx_t_10) { + __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_tuple__4, NULL); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 112, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + goto __pyx_L23; + } + __pyx_L23:; + } + goto __pyx_L36; + __pyx_L18_error:; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L11_except_error; + __pyx_L36:; + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L10_exception_handled; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":107 + * self.fully_initialized = True + * else: + * try: # <<<<<<<<<<<<<< + * additional_info = t.additional_info + * if additional_info is None: + */ + __pyx_L11_except_error:; + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9); + goto __pyx_L4_error; + __pyx_L10_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9); + __pyx_L14_try_end:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":119 + * additional_info = PyDBAdditionalThreadInfo() + * t.additional_info = additional_info + * self.additional_info = additional_info # <<<<<<<<<<<<<< + * self.fully_initialized = True + * finally: + */ + if (unlikely(!__pyx_v_additional_info)) { __Pyx_RaiseUnboundLocalError("additional_info"); __PYX_ERR(0, 119, __pyx_L4_error) } + if (!(likely(((__pyx_v_additional_info) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_additional_info, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 119, __pyx_L4_error) + __pyx_t_3 = __pyx_v_additional_info; + __Pyx_INCREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_GOTREF((PyObject *)__pyx_v_self->additional_info); + __Pyx_DECREF((PyObject *)__pyx_v_self->additional_info); + __pyx_v_self->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":120 + * t.additional_info = additional_info + * self.additional_info = additional_info + * self.fully_initialized = True # <<<<<<<<<<<<<< + * finally: + * self.inside_frame_eval -= 1 + */ + __pyx_v_self->fully_initialized = 1; + } + __pyx_L8:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":122 + * self.fully_initialized = True + * finally: + * self.inside_frame_eval -= 1 # <<<<<<<<<<<<<< + * + * + */ + /*finally:*/ { + /*normal exit:*/{ + __pyx_v_self->inside_frame_eval = (__pyx_v_self->inside_frame_eval - 1); + goto __pyx_L5; + } + __pyx_L4_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_9 = 0; __pyx_t_8 = 0; __pyx_t_7 = 0; __pyx_t_10 = 0; __pyx_t_16 = 0; __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_16, &__pyx_t_15); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_9, &__pyx_t_8, &__pyx_t_7) < 0)) __Pyx_ErrFetch(&__pyx_t_9, &__pyx_t_8, &__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_15); + __pyx_t_19 = __pyx_lineno; __pyx_t_20 = __pyx_clineno; __pyx_t_21 = __pyx_filename; + { + __pyx_v_self->inside_frame_eval = (__pyx_v_self->inside_frame_eval - 1); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_16, __pyx_t_15); + } + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_ErrRestore(__pyx_t_9, __pyx_t_8, __pyx_t_7); + __pyx_t_9 = 0; __pyx_t_8 = 0; __pyx_t_7 = 0; __pyx_t_10 = 0; __pyx_t_16 = 0; __pyx_t_15 = 0; + __pyx_lineno = __pyx_t_19; __pyx_clineno = __pyx_t_20; __pyx_filename = __pyx_t_21; + goto __pyx_L1_error; + } + __pyx_L3_return: { + __pyx_t_15 = __pyx_r; + __pyx_r = 0; + __pyx_v_self->inside_frame_eval = (__pyx_v_self->inside_frame_eval - 1); + __pyx_r = __pyx_t_15; + __pyx_t_15 = 0; + goto __pyx_L0; + } + __pyx_L5:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":86 + * # print('Can create dummy thread for thread started in: %s %s' % (basename, co_name)) + * + * cdef initialize_if_possible(self): # <<<<<<<<<<<<<< + * # Don't call threading.currentThread because if we're too early in the process + * # we may create a dummy thread. + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.initialize_if_possible", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_thread_ident); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_XDECREF(__pyx_v_additional_info); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":26 + * cdef class ThreadInfo: + * + * cdef public PyDBAdditionalThreadInfo additional_info # <<<<<<<<<<<<<< + * cdef public bint is_pydevd_thread + * cdef public int inside_frame_eval + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_self->additional_info); + __pyx_r = ((PyObject *)__pyx_v_self->additional_info); + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 26, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF((PyObject *)__pyx_v_self->additional_info); + __Pyx_DECREF((PyObject *)__pyx_v_self->additional_info); + __pyx_v_self->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.additional_info.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF((PyObject *)__pyx_v_self->additional_info); + __Pyx_DECREF((PyObject *)__pyx_v_self->additional_info); + __pyx_v_self->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":27 + * + * cdef public PyDBAdditionalThreadInfo additional_info + * cdef public bint is_pydevd_thread # <<<<<<<<<<<<<< + * cdef public int inside_frame_eval + * cdef public bint fully_initialized + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_pydevd_thread); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 27, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.is_pydevd_thread.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 27, __pyx_L1_error) + __pyx_v_self->is_pydevd_thread = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.is_pydevd_thread.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":28 + * cdef public PyDBAdditionalThreadInfo additional_info + * cdef public bint is_pydevd_thread + * cdef public int inside_frame_eval # <<<<<<<<<<<<<< + * cdef public bint fully_initialized + * cdef public object thread_trace_func + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->inside_frame_eval); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.inside_frame_eval.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 28, __pyx_L1_error) + __pyx_v_self->inside_frame_eval = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.inside_frame_eval.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":29 + * cdef public bint is_pydevd_thread + * cdef public int inside_frame_eval + * cdef public bint fully_initialized # <<<<<<<<<<<<<< + * cdef public object thread_trace_func + * cdef bint _can_create_dummy_thread + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->fully_initialized); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.fully_initialized.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 29, __pyx_L1_error) + __pyx_v_self->fully_initialized = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.fully_initialized.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":30 + * cdef public int inside_frame_eval + * cdef public bint fully_initialized + * cdef public object thread_trace_func # <<<<<<<<<<<<<< + * cdef bint _can_create_dummy_thread + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->thread_trace_func); + __pyx_r = __pyx_v_self->thread_trace_func; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->thread_trace_func); + __Pyx_DECREF(__pyx_v_self->thread_trace_func); + __pyx_v_self->thread_trace_func = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->thread_trace_func); + __Pyx_DECREF(__pyx_v_self->thread_trace_func); + __pyx_v_self->thread_trace_func = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":37 + * # If True the debugger should not go into trace mode even if the new + * # code for a function is None and there are breakpoints. + * cdef public bint force_stay_in_untraced_mode # <<<<<<<<<<<<<< + * + * cdef initialize(self, PyFrameObject * frame_obj): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->force_stay_in_untraced_mode); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.force_stay_in_untraced_mode.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 37, __pyx_L1_error) + __pyx_v_self->force_stay_in_untraced_mode = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.force_stay_in_untraced_mode.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo___reduce_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo___reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self._can_create_dummy_thread, self.additional_info, self.force_stay_in_untraced_mode, self.fully_initialized, self.inside_frame_eval, self.is_pydevd_thread, self.thread_trace_func) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->_can_create_dummy_thread); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->force_stay_in_untraced_mode); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_self->fully_initialized); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->inside_frame_eval); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyBool_FromLong(__pyx_v_self->is_pydevd_thread); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(7); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_self->additional_info); + __Pyx_GIVEREF((PyObject *)__pyx_v_self->additional_info); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_v_self->additional_info))) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 4, __pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 5, __pyx_t_5)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->thread_trace_func); + __Pyx_GIVEREF(__pyx_v_self->thread_trace_func); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 6, __pyx_v_self->thread_trace_func)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self._can_create_dummy_thread, self.additional_info, self.force_stay_in_untraced_mode, self.fully_initialized, self.inside_frame_eval, self.is_pydevd_thread, self.thread_trace_func) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_6 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v__dict = __pyx_t_6; + __pyx_t_6 = 0; + + /* "(tree fragment)":7 + * state = (self._can_create_dummy_thread, self.additional_info, self.force_stay_in_untraced_mode, self.fully_initialized, self.inside_frame_eval, self.is_pydevd_thread, self.thread_trace_func) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_7 = (__pyx_v__dict != Py_None); + if (__pyx_t_7) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_5)); + __pyx_t_5 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.additional_info is not None or self.thread_trace_func is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self._can_create_dummy_thread, self.additional_info, self.force_stay_in_untraced_mode, self.fully_initialized, self.inside_frame_eval, self.is_pydevd_thread, self.thread_trace_func) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.additional_info is not None or self.thread_trace_func is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, None), state + */ + /*else*/ { + __pyx_t_8 = (((PyObject *)__pyx_v_self->additional_info) != Py_None); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_8 = (__pyx_v_self->thread_trace_func != Py_None); + __pyx_t_7 = __pyx_t_8; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_7; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.additional_info is not None or self.thread_trace_func is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.additional_info is not None or self.thread_trace_func is not None + * if use_setstate: + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_ThreadInfo); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_240343912); + __Pyx_GIVEREF(__pyx_int_240343912); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_240343912)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.additional_info is not None or self.thread_trace_func is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, None), state + * else: + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_ThreadInfo); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_240343912); + __Pyx_GIVEREF(__pyx_int_240343912); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_240343912)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_6 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_2__setstate_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_2__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_ThreadInfo__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":139 + * cdef public int breakpoints_mtime + * + * def __init__(self): # <<<<<<<<<<<<<< + * self.co_filename = '' + * self.canonical_normalized_filename = '' + */ + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, __pyx_nargs); return -1;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo___init__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":140 + * + * def __init__(self): + * self.co_filename = '' # <<<<<<<<<<<<<< + * self.canonical_normalized_filename = '' + * self.always_skip_code = False + */ + __Pyx_INCREF(__pyx_kp_s__5); + __Pyx_GIVEREF(__pyx_kp_s__5); + __Pyx_GOTREF(__pyx_v_self->co_filename); + __Pyx_DECREF(__pyx_v_self->co_filename); + __pyx_v_self->co_filename = __pyx_kp_s__5; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":141 + * def __init__(self): + * self.co_filename = '' + * self.canonical_normalized_filename = '' # <<<<<<<<<<<<<< + * self.always_skip_code = False + * + */ + __Pyx_INCREF(__pyx_kp_s__5); + __Pyx_GIVEREF(__pyx_kp_s__5); + __Pyx_GOTREF(__pyx_v_self->canonical_normalized_filename); + __Pyx_DECREF(__pyx_v_self->canonical_normalized_filename); + __pyx_v_self->canonical_normalized_filename = __pyx_kp_s__5; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":142 + * self.co_filename = '' + * self.canonical_normalized_filename = '' + * self.always_skip_code = False # <<<<<<<<<<<<<< + * + * # If breakpoints are found but new_code is None, + */ + __pyx_v_self->always_skip_code = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":147 + * # this means we weren't able to actually add the code + * # where needed, so, fallback to tracing. + * self.breakpoint_found = False # <<<<<<<<<<<<<< + * self.new_code = None + * self.breakpoints_mtime = -1 + */ + __pyx_v_self->breakpoint_found = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":148 + * # where needed, so, fallback to tracing. + * self.breakpoint_found = False + * self.new_code = None # <<<<<<<<<<<<<< + * self.breakpoints_mtime = -1 + * + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->new_code); + __Pyx_DECREF(__pyx_v_self->new_code); + __pyx_v_self->new_code = Py_None; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":149 + * self.breakpoint_found = False + * self.new_code = None + * self.breakpoints_mtime = -1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_self->breakpoints_mtime = -1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":139 + * cdef public int breakpoints_mtime + * + * def __init__(self): # <<<<<<<<<<<<<< + * self.co_filename = '' + * self.canonical_normalized_filename = '' + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":127 + * cdef class FuncCodeInfo: + * + * cdef public str co_filename # <<<<<<<<<<<<<< + * cdef public str co_name + * cdef public str canonical_normalized_filename + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->co_filename); + __pyx_r = __pyx_v_self->co_filename; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_value))) __PYX_ERR(0, 127, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->co_filename); + __Pyx_DECREF(__pyx_v_self->co_filename); + __pyx_v_self->co_filename = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.co_filename.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->co_filename); + __Pyx_DECREF(__pyx_v_self->co_filename); + __pyx_v_self->co_filename = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":128 + * + * cdef public str co_filename + * cdef public str co_name # <<<<<<<<<<<<<< + * cdef public str canonical_normalized_filename + * cdef bint always_skip_code + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->co_name); + __pyx_r = __pyx_v_self->co_name; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_value))) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->co_name); + __Pyx_DECREF(__pyx_v_self->co_name); + __pyx_v_self->co_name = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.co_name.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->co_name); + __Pyx_DECREF(__pyx_v_self->co_name); + __pyx_v_self->co_name = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":129 + * cdef public str co_filename + * cdef public str co_name + * cdef public str canonical_normalized_filename # <<<<<<<<<<<<<< + * cdef bint always_skip_code + * cdef public bint breakpoint_found + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->canonical_normalized_filename); + __pyx_r = __pyx_v_self->canonical_normalized_filename; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_value))) __PYX_ERR(0, 129, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->canonical_normalized_filename); + __Pyx_DECREF(__pyx_v_self->canonical_normalized_filename); + __pyx_v_self->canonical_normalized_filename = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.canonical_normalized_filename.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->canonical_normalized_filename); + __Pyx_DECREF(__pyx_v_self->canonical_normalized_filename); + __pyx_v_self->canonical_normalized_filename = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":131 + * cdef public str canonical_normalized_filename + * cdef bint always_skip_code + * cdef public bint breakpoint_found # <<<<<<<<<<<<<< + * cdef public object new_code + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->breakpoint_found); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 131, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoint_found.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 131, __pyx_L1_error) + __pyx_v_self->breakpoint_found = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoint_found.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":132 + * cdef bint always_skip_code + * cdef public bint breakpoint_found + * cdef public object new_code # <<<<<<<<<<<<<< + * + * # When breakpoints_mtime != PyDb.mtime the validity of breakpoints have + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->new_code); + __pyx_r = __pyx_v_self->new_code; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->new_code); + __Pyx_DECREF(__pyx_v_self->new_code); + __pyx_v_self->new_code = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->new_code); + __Pyx_DECREF(__pyx_v_self->new_code); + __pyx_v_self->new_code = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":137 + * # to be re-evaluated (if invalid a new FuncCodeInfo must be created and + * # tracing can't be disabled for the related frames). + * cdef public int breakpoints_mtime # <<<<<<<<<<<<<< + * + * def __init__(self): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->breakpoints_mtime); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoints_mtime.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 137, __pyx_L1_error) + __pyx_v_self->breakpoints_mtime = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoints_mtime.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_3__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_3__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_2__reduce_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_2__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.always_skip_code, self.breakpoint_found, self.breakpoints_mtime, self.canonical_normalized_filename, self.co_filename, self.co_name, self.new_code) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->always_skip_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->breakpoint_found); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->breakpoints_mtime); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->canonical_normalized_filename); + __Pyx_GIVEREF(__pyx_v_self->canonical_normalized_filename); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_self->canonical_normalized_filename)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->co_filename); + __Pyx_GIVEREF(__pyx_v_self->co_filename); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_v_self->co_filename)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->co_name); + __Pyx_GIVEREF(__pyx_v_self->co_name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 5, __pyx_v_self->co_name)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->new_code); + __Pyx_GIVEREF(__pyx_v_self->new_code); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 6, __pyx_v_self->new_code)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.always_skip_code, self.breakpoint_found, self.breakpoints_mtime, self.canonical_normalized_filename, self.co_filename, self.co_name, self.new_code) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_4 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_v__dict = __pyx_t_4; + __pyx_t_4 = 0; + + /* "(tree fragment)":7 + * state = (self.always_skip_code, self.breakpoint_found, self.breakpoints_mtime, self.canonical_normalized_filename, self.co_filename, self.co_name, self.new_code) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_5 = (__pyx_v__dict != Py_None); + if (__pyx_t_5) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.canonical_normalized_filename is not None or self.co_filename is not None or self.co_name is not None or self.new_code is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.always_skip_code, self.breakpoint_found, self.breakpoints_mtime, self.canonical_normalized_filename, self.co_filename, self.co_name, self.new_code) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.canonical_normalized_filename is not None or self.co_filename is not None or self.co_name is not None or self.new_code is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, None), state + */ + /*else*/ { + __pyx_t_6 = (__pyx_v_self->canonical_normalized_filename != ((PyObject*)Py_None)); + if (!__pyx_t_6) { + } else { + __pyx_t_5 = __pyx_t_6; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_6 = (__pyx_v_self->co_filename != ((PyObject*)Py_None)); + if (!__pyx_t_6) { + } else { + __pyx_t_5 = __pyx_t_6; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_6 = (__pyx_v_self->co_name != ((PyObject*)Py_None)); + if (!__pyx_t_6) { + } else { + __pyx_t_5 = __pyx_t_6; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_6 = (__pyx_v_self->new_code != Py_None); + __pyx_t_5 = __pyx_t_6; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_5; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.canonical_normalized_filename is not None or self.co_filename is not None or self.co_name is not None or self.new_code is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.canonical_normalized_filename is not None or self.co_filename is not None or self.co_name is not None or self.new_code is not None + * if use_setstate: + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_FuncCodeInfo); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_72405718); + __Pyx_GIVEREF(__pyx_int_72405718); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_72405718)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.canonical_normalized_filename is not None or self.co_filename is not None or self.co_name is not None or self.new_code is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, None), state + * else: + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pyx_unpickle_FuncCodeInfo); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_72405718); + __Pyx_GIVEREF(__pyx_int_72405718); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_72405718)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_4 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_5__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_5__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_4__setstate_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_4__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_FuncCodeInfo__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":152 + * + * + * def dummy_trace_dispatch(frame, str event, arg): # <<<<<<<<<<<<<< + * if event == 'call': + * if frame.f_trace is not None: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch = {"dummy_trace_dispatch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_event = 0; + PyObject *__pyx_v_arg = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("dummy_trace_dispatch (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 152, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 152, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, 1); __PYX_ERR(0, 152, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arg)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 152, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, 2); __PYX_ERR(0, 152, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "dummy_trace_dispatch") < 0)) __PYX_ERR(0, 152, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_frame = values[0]; + __pyx_v_event = ((PyObject*)values[1]); + __pyx_v_arg = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 152, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.dummy_trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_event), (&PyString_Type), 1, "event", 1))) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2dummy_trace_dispatch(__pyx_self, __pyx_v_frame, __pyx_v_event, __pyx_v_arg); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2dummy_trace_dispatch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("dummy_trace_dispatch", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":153 + * + * def dummy_trace_dispatch(frame, str event, arg): + * if event == 'call': # <<<<<<<<<<<<<< + * if frame.f_trace is not None: + * return frame.f_trace(frame, event, arg) + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call_2, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 153, __pyx_L1_error) + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":154 + * def dummy_trace_dispatch(frame, str event, arg): + * if event == 'call': + * if frame.f_trace is not None: # <<<<<<<<<<<<<< + * return frame.f_trace(frame, event, arg) + * return None + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = (__pyx_t_2 != Py_None); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":155 + * if event == 'call': + * if frame.f_trace is not None: + * return frame.f_trace(frame, event, arg) # <<<<<<<<<<<<<< + * return None + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 155, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_v_frame, __pyx_v_event, __pyx_v_arg}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 155, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":154 + * def dummy_trace_dispatch(frame, str event, arg): + * if event == 'call': + * if frame.f_trace is not None: # <<<<<<<<<<<<<< + * return frame.f_trace(frame, event, arg) + * return None + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":153 + * + * def dummy_trace_dispatch(frame, str event, arg): + * if event == 'call': # <<<<<<<<<<<<<< + * if frame.f_trace is not None: + * return frame.f_trace(frame, event, arg) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":156 + * if frame.f_trace is not None: + * return frame.f_trace(frame, event, arg) + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":152 + * + * + * def dummy_trace_dispatch(frame, str event, arg): # <<<<<<<<<<<<<< + * if event == 'call': + * if frame.f_trace is not None: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.dummy_trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":159 + * + * + * def get_thread_info_py() -> ThreadInfo: # <<<<<<<<<<<<<< + * return get_thread_info(PyEval_GetFrame()) + * + */ + +/* Python wrapper */ +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py = {"get_thread_info_py", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py, METH_NOARGS, 0}; +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_thread_info_py (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4get_thread_info_py(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4get_thread_info_py(CYTHON_UNUSED PyObject *__pyx_self) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_thread_info_py", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":160 + * + * def get_thread_info_py() -> ThreadInfo: + * return get_thread_info(PyEval_GetFrame()) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_thread_info(PyEval_GetFrame())); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_1); + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":159 + * + * + * def get_thread_info_py() -> ThreadInfo: # <<<<<<<<<<<<<< + * return get_thread_info(PyEval_GetFrame()) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_thread_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":163 + * + * + * cdef ThreadInfo get_thread_info(PyFrameObject * frame_obj): # <<<<<<<<<<<<<< + * ''' + * Provides thread-related info. + */ + +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_thread_info(PyFrameObject *__pyx_v_frame_obj) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_thread_info = 0; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + char const *__pyx_t_11; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_thread_info", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":170 + * ''' + * cdef ThreadInfo thread_info + * try: # <<<<<<<<<<<<<< + * # Note: changing to a `dict[thread.ident] = thread_info` had almost no + * # effect in the performance. + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":173 + * # Note: changing to a `dict[thread.ident] = thread_info` had almost no + * # effect in the performance. + * thread_info = _thread_local_info.thread_info # <<<<<<<<<<<<<< + * except: + * if frame_obj == NULL: + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 173, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_thread_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 173, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo))))) __PYX_ERR(0, 173, __pyx_L3_error) + __pyx_v_thread_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_5); + __pyx_t_5 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":170 + * ''' + * cdef ThreadInfo thread_info + * try: # <<<<<<<<<<<<<< + * # Note: changing to a `dict[thread.ident] = thread_info` had almost no + * # effect in the performance. + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":174 + * # effect in the performance. + * thread_info = _thread_local_info.thread_info + * except: # <<<<<<<<<<<<<< + * if frame_obj == NULL: + * return None + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_6) < 0) __PYX_ERR(0, 174, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_6); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":175 + * thread_info = _thread_local_info.thread_info + * except: + * if frame_obj == NULL: # <<<<<<<<<<<<<< + * return None + * thread_info = ThreadInfo() + */ + __pyx_t_7 = (__pyx_v_frame_obj == NULL); + if (__pyx_t_7) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":176 + * except: + * if frame_obj == NULL: + * return None # <<<<<<<<<<<<<< + * thread_info = ThreadInfo() + * thread_info.initialize(frame_obj) + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_r = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)Py_None); __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L6_except_return; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":175 + * thread_info = _thread_local_info.thread_info + * except: + * if frame_obj == NULL: # <<<<<<<<<<<<<< + * return None + * thread_info = ThreadInfo() + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":177 + * if frame_obj == NULL: + * return None + * thread_info = ThreadInfo() # <<<<<<<<<<<<<< + * thread_info.initialize(frame_obj) + * thread_info.inside_frame_eval += 1 + */ + __pyx_t_8 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 177, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_XDECREF_SET(__pyx_v_thread_info, ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_8)); + __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":178 + * return None + * thread_info = ThreadInfo() + * thread_info.initialize(frame_obj) # <<<<<<<<<<<<<< + * thread_info.inside_frame_eval += 1 + * try: + */ + __pyx_t_8 = ((struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_thread_info->__pyx_vtab)->initialize(__pyx_v_thread_info, __pyx_v_frame_obj); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 178, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":179 + * thread_info = ThreadInfo() + * thread_info.initialize(frame_obj) + * thread_info.inside_frame_eval += 1 # <<<<<<<<<<<<<< + * try: + * _thread_local_info.thread_info = thread_info + */ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval + 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":180 + * thread_info.initialize(frame_obj) + * thread_info.inside_frame_eval += 1 + * try: # <<<<<<<<<<<<<< + * _thread_local_info.thread_info = thread_info + * + */ + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":181 + * thread_info.inside_frame_eval += 1 + * try: + * _thread_local_info.thread_info = thread_info # <<<<<<<<<<<<<< + * + * # Note: _code_extra_index is not actually thread-related, + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 181, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_8); + if (__Pyx_PyObject_SetAttrStr(__pyx_t_8, __pyx_n_s_thread_info, ((PyObject *)__pyx_v_thread_info)) < 0) __PYX_ERR(0, 181, __pyx_L15_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":186 + * # but this is a good point to initialize it. + * global _code_extra_index + * if _code_extra_index == -1: # <<<<<<<<<<<<<< + * _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra) + * + */ + __pyx_t_7 = (__pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator__code_extra_index == -1L); + if (__pyx_t_7) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":187 + * global _code_extra_index + * if _code_extra_index == -1: + * _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra) # <<<<<<<<<<<<<< + * + * thread_info.initialize_if_possible() + */ + __pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator__code_extra_index = ((int)_PyEval_RequestCodeExtraIndex(release_co_extra)); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":186 + * # but this is a good point to initialize it. + * global _code_extra_index + * if _code_extra_index == -1: # <<<<<<<<<<<<<< + * _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra) + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":189 + * _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra) + * + * thread_info.initialize_if_possible() # <<<<<<<<<<<<<< + * finally: + * thread_info.inside_frame_eval -= 1 + */ + __pyx_t_8 = ((struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_thread_info->__pyx_vtab)->initialize_if_possible(__pyx_v_thread_info); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 189, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":191 + * thread_info.initialize_if_possible() + * finally: + * thread_info.inside_frame_eval -= 1 # <<<<<<<<<<<<<< + * + * return thread_info + */ + /*finally:*/ { + /*normal exit:*/{ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1); + goto __pyx_L16; + } + __pyx_L15_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14) < 0)) __Pyx_ErrFetch(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14); + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XGOTREF(__pyx_t_14); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_17); + __pyx_t_9 = __pyx_lineno; __pyx_t_10 = __pyx_clineno; __pyx_t_11 = __pyx_filename; + { + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); + } + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_13); + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_ErrRestore(__pyx_t_12, __pyx_t_13, __pyx_t_14); + __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; + __pyx_lineno = __pyx_t_9; __pyx_clineno = __pyx_t_10; __pyx_filename = __pyx_t_11; + goto __pyx_L5_except_error; + } + __pyx_L16:; + } + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L4_exception_handled; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":170 + * ''' + * cdef ThreadInfo thread_info + * try: # <<<<<<<<<<<<<< + * # Note: changing to a `dict[thread.ident] = thread_info` had almost no + * # effect in the performance. + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L0; + __pyx_L4_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L8_try_end:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":193 + * thread_info.inside_frame_eval -= 1 + * + * return thread_info # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_thread_info); + __pyx_r = __pyx_v_thread_info; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":163 + * + * + * cdef ThreadInfo get_thread_info(PyFrameObject * frame_obj): # <<<<<<<<<<<<<< + * ''' + * Provides thread-related info. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_thread_info); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":196 + * + * + * def decref_py(obj): # <<<<<<<<<<<<<< + * ''' + * Helper to be called from Python. + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +PyDoc_STRVAR(__pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py, "\n Helper to be called from Python.\n "); +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py = {"decref_py", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_obj = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("decref_py (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 196, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "decref_py") < 0)) __PYX_ERR(0, 196, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_obj = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("decref_py", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 196, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.decref_py", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py(__pyx_self, __pyx_v_obj); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("decref_py", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":200 + * Helper to be called from Python. + * ''' + * Py_DECREF(obj) # <<<<<<<<<<<<<< + * + * + */ + Py_DECREF(__pyx_v_obj); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":196 + * + * + * def decref_py(obj): # <<<<<<<<<<<<<< + * ''' + * Helper to be called from Python. + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":203 + * + * + * def get_func_code_info_py(thread_info, frame, code_obj) -> FuncCodeInfo: # <<<<<<<<<<<<<< + * ''' + * Helper to be called from Python. + */ + +/* Python wrapper */ +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +PyDoc_STRVAR(__pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py, "\n Helper to be called from Python.\n "); +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py = {"get_func_code_info_py", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py}; +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_thread_info = 0; + PyObject *__pyx_v_frame = 0; + PyObject *__pyx_v_code_obj = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_func_code_info_py (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_thread_info,&__pyx_n_s_frame,&__pyx_n_s_code_obj,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_thread_info)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 203, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frame)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 203, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("get_func_code_info_py", 1, 3, 3, 1); __PYX_ERR(0, 203, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 203, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("get_func_code_info_py", 1, 3, 3, 2); __PYX_ERR(0, 203, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "get_func_code_info_py") < 0)) __PYX_ERR(0, 203, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_thread_info = values[0]; + __pyx_v_frame = values[1]; + __pyx_v_code_obj = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("get_func_code_info_py", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 203, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_func_code_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(__pyx_self, __pyx_v_thread_info, __pyx_v_frame, __pyx_v_code_obj); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_thread_info, PyObject *__pyx_v_frame, PyObject *__pyx_v_code_obj) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_func_code_info_py", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":207 + * Helper to be called from Python. + * ''' + * return get_func_code_info( thread_info, frame, code_obj) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_func_code_info(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_thread_info), ((PyFrameObject *)__pyx_v_frame), ((PyCodeObject *)__pyx_v_code_obj))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_t_1); + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":203 + * + * + * def get_func_code_info_py(thread_info, frame, code_obj) -> FuncCodeInfo: # <<<<<<<<<<<<<< + * ''' + * Helper to be called from Python. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_func_code_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":212 + * cdef int _code_extra_index = -1 + * + * cdef FuncCodeInfo get_func_code_info(ThreadInfo thread_info, PyFrameObject * frame_obj, PyCodeObject * code_obj): # <<<<<<<<<<<<<< + * ''' + * Provides code-object related info. + */ + +static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_func_code_info(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_thread_info, PyFrameObject *__pyx_v_frame_obj, PyCodeObject *__pyx_v_code_obj) { + PyObject *__pyx_v_main_debugger = 0; + PyObject *__pyx_v_extra; + PyObject *__pyx_v_extra_obj; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_func_code_info_obj = NULL; + PyObject *__pyx_v_co_filename = 0; + PyObject *__pyx_v_co_name = 0; + PyObject *__pyx_v_cache_file_type = 0; + PyObject *__pyx_v_cache_file_type_key = 0; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_func_code_info = NULL; + PyObject *__pyx_v_abs_path_real_path_and_base = NULL; + PyObject *__pyx_v_file_type = NULL; + PyObject *__pyx_v_breakpoints = 0; + PyObject *__pyx_v_function_breakpoint = 0; + PyObject *__pyx_v_code_obj_py = 0; + PyObject *__pyx_v_cached_code_obj_info = 0; + PyObject *__pyx_v_breakpoint_found = NULL; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + unsigned int __pyx_t_12; + PyObject *(*__pyx_t_13)(PyObject *); + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_func_code_info", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":228 + * # print('get_func_code_info', f_code.co_name, f_code.co_filename) + * + * cdef object main_debugger = GlobalDebuggerHolder.global_dbg # <<<<<<<<<<<<<< + * thread_info.force_stay_in_untraced_mode = False # This is an output value of the function. + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 228, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_global_dbg); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 228, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_main_debugger = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":229 + * + * cdef object main_debugger = GlobalDebuggerHolder.global_dbg + * thread_info.force_stay_in_untraced_mode = False # This is an output value of the function. # <<<<<<<<<<<<<< + * + * cdef PyObject * extra + */ + __pyx_v_thread_info->force_stay_in_untraced_mode = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":232 + * + * cdef PyObject * extra + * _PyCode_GetExtra( code_obj, _code_extra_index, & extra) # <<<<<<<<<<<<<< + * if extra is not NULL: + * extra_obj = extra + */ + (void)(_PyCode_GetExtra(((PyObject *)__pyx_v_code_obj), __pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator__code_extra_index, (&__pyx_v_extra))); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":233 + * cdef PyObject * extra + * _PyCode_GetExtra( code_obj, _code_extra_index, & extra) + * if extra is not NULL: # <<<<<<<<<<<<<< + * extra_obj = extra + * if extra_obj is not NULL: + */ + __pyx_t_3 = (__pyx_v_extra != NULL); + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":234 + * _PyCode_GetExtra( code_obj, _code_extra_index, & extra) + * if extra is not NULL: + * extra_obj = extra # <<<<<<<<<<<<<< + * if extra_obj is not NULL: + * func_code_info_obj = extra_obj + */ + __pyx_v_extra_obj = ((PyObject *)__pyx_v_extra); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":235 + * if extra is not NULL: + * extra_obj = extra + * if extra_obj is not NULL: # <<<<<<<<<<<<<< + * func_code_info_obj = extra_obj + * if func_code_info_obj.breakpoints_mtime == main_debugger.mtime: + */ + __pyx_t_3 = (__pyx_v_extra_obj != NULL); + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":236 + * extra_obj = extra + * if extra_obj is not NULL: + * func_code_info_obj = extra_obj # <<<<<<<<<<<<<< + * if func_code_info_obj.breakpoints_mtime == main_debugger.mtime: + * # if DEBUG: + */ + __pyx_t_2 = ((PyObject *)__pyx_v_extra_obj); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_func_code_info_obj = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":237 + * if extra_obj is not NULL: + * func_code_info_obj = extra_obj + * if func_code_info_obj.breakpoints_mtime == main_debugger.mtime: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_func_code_info: matched mtime', f_code.co_name, f_code.co_filename) + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_func_code_info_obj->breakpoints_mtime); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_mtime); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":241 + * # print('get_func_code_info: matched mtime', f_code.co_name, f_code.co_filename) + * + * return func_code_info_obj # <<<<<<<<<<<<<< + * + * cdef str co_filename = code_obj.co_filename + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_func_code_info_obj); + __pyx_r = __pyx_v_func_code_info_obj; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":237 + * if extra_obj is not NULL: + * func_code_info_obj = extra_obj + * if func_code_info_obj.breakpoints_mtime == main_debugger.mtime: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_func_code_info: matched mtime', f_code.co_name, f_code.co_filename) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":235 + * if extra is not NULL: + * extra_obj = extra + * if extra_obj is not NULL: # <<<<<<<<<<<<<< + * func_code_info_obj = extra_obj + * if func_code_info_obj.breakpoints_mtime == main_debugger.mtime: + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":233 + * cdef PyObject * extra + * _PyCode_GetExtra( code_obj, _code_extra_index, & extra) + * if extra is not NULL: # <<<<<<<<<<<<<< + * extra_obj = extra + * if extra_obj is not NULL: + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":243 + * return func_code_info_obj + * + * cdef str co_filename = code_obj.co_filename # <<<<<<<<<<<<<< + * cdef str co_name = code_obj.co_name + * cdef dict cache_file_type + */ + __pyx_t_4 = ((PyObject *)__pyx_v_code_obj->co_filename); + __Pyx_INCREF(__pyx_t_4); + __pyx_v_co_filename = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":244 + * + * cdef str co_filename = code_obj.co_filename + * cdef str co_name = code_obj.co_name # <<<<<<<<<<<<<< + * cdef dict cache_file_type + * cdef tuple cache_file_type_key + */ + __pyx_t_4 = ((PyObject *)__pyx_v_code_obj->co_name); + __Pyx_INCREF(__pyx_t_4); + __pyx_v_co_name = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":248 + * cdef tuple cache_file_type_key + * + * func_code_info = FuncCodeInfo() # <<<<<<<<<<<<<< + * func_code_info.breakpoints_mtime = main_debugger.mtime + * + */ + __pyx_t_4 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_func_code_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":249 + * + * func_code_info = FuncCodeInfo() + * func_code_info.breakpoints_mtime = main_debugger.mtime # <<<<<<<<<<<<<< + * + * func_code_info.co_filename = co_filename + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_mtime); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_func_code_info->breakpoints_mtime = __pyx_t_5; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":251 + * func_code_info.breakpoints_mtime = main_debugger.mtime + * + * func_code_info.co_filename = co_filename # <<<<<<<<<<<<<< + * func_code_info.co_name = co_name + * + */ + __Pyx_INCREF(__pyx_v_co_filename); + __Pyx_GIVEREF(__pyx_v_co_filename); + __Pyx_GOTREF(__pyx_v_func_code_info->co_filename); + __Pyx_DECREF(__pyx_v_func_code_info->co_filename); + __pyx_v_func_code_info->co_filename = __pyx_v_co_filename; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":252 + * + * func_code_info.co_filename = co_filename + * func_code_info.co_name = co_name # <<<<<<<<<<<<<< + * + * if not func_code_info.always_skip_code: + */ + __Pyx_INCREF(__pyx_v_co_name); + __Pyx_GIVEREF(__pyx_v_co_name); + __Pyx_GOTREF(__pyx_v_func_code_info->co_name); + __Pyx_DECREF(__pyx_v_func_code_info->co_name); + __pyx_v_func_code_info->co_name = __pyx_v_co_name; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":254 + * func_code_info.co_name = co_name + * + * if not func_code_info.always_skip_code: # <<<<<<<<<<<<<< + * try: + * abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + */ + __pyx_t_3 = (!__pyx_v_func_code_info->always_skip_code); + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":255 + * + * if not func_code_info.always_skip_code: + * try: # <<<<<<<<<<<<<< + * abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + * except: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":256 + * if not func_code_info.always_skip_code: + * try: + * abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] # <<<<<<<<<<<<<< + * except: + * abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(frame_obj) + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 256, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = __Pyx_PyObject_Dict_GetItem(__pyx_t_4, __pyx_v_co_filename); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 256, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_abs_path_real_path_and_base = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":255 + * + * if not func_code_info.always_skip_code: + * try: # <<<<<<<<<<<<<< + * abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + * except: + */ + } + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L12_try_end; + __pyx_L7_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":257 + * try: + * abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + * except: # <<<<<<<<<<<<<< + * abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(frame_obj) + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_func_code_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_4, &__pyx_t_2) < 0) __PYX_ERR(0, 257, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":258 + * abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + * except: + * abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(frame_obj) # <<<<<<<<<<<<<< + * + * func_code_info.canonical_normalized_filename = abs_path_real_path_and_base[1] + */ + __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_get_abs_path_real_path_and_base); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 258, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_10))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_10); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_10, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_11, ((PyObject *)__pyx_v_frame_obj)}; + __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 258, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_abs_path_real_path_and_base, __pyx_t_9); + __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L8_exception_handled; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":255 + * + * if not func_code_info.always_skip_code: + * try: # <<<<<<<<<<<<<< + * abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + * except: + */ + __pyx_L9_except_error:; + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); + goto __pyx_L1_error; + __pyx_L8_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); + __pyx_L12_try_end:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":260 + * abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(frame_obj) + * + * func_code_info.canonical_normalized_filename = abs_path_real_path_and_base[1] # <<<<<<<<<<<<<< + * + * cache_file_type = main_debugger.get_cache_file_type() + */ + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_abs_path_real_path_and_base, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 260, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_2))) __PYX_ERR(0, 260, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_func_code_info->canonical_normalized_filename); + __Pyx_DECREF(__pyx_v_func_code_info->canonical_normalized_filename); + __pyx_v_func_code_info->canonical_normalized_filename = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":262 + * func_code_info.canonical_normalized_filename = abs_path_real_path_and_base[1] + * + * cache_file_type = main_debugger.get_cache_file_type() # <<<<<<<<<<<<<< + * # Note: this cache key must be the same from PyDB.get_file_type() -- see it for comments + * # on the cache. + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_get_cache_file_type); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 262, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_12, 0+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 262, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(PyDict_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_2))) __PYX_ERR(0, 262, __pyx_L1_error) + __pyx_v_cache_file_type = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":265 + * # Note: this cache key must be the same from PyDB.get_file_type() -- see it for comments + * # on the cache. + * cache_file_type_key = (frame_obj.f_code.co_firstlineno, abs_path_real_path_and_base[0], frame_obj.f_code) # <<<<<<<<<<<<<< + * try: + * file_type = cache_file_type[cache_file_type_key] # Make it faster + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_frame_obj->f_code->co_firstlineno); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_abs_path_real_path_and_base, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2)) __PYX_ERR(0, 265, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4)) __PYX_ERR(0, 265, __pyx_L1_error); + __Pyx_INCREF(((PyObject *)__pyx_v_frame_obj->f_code)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_frame_obj->f_code)); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_v_frame_obj->f_code))) __PYX_ERR(0, 265, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_4 = 0; + __pyx_v_cache_file_type_key = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":266 + * # on the cache. + * cache_file_type_key = (frame_obj.f_code.co_firstlineno, abs_path_real_path_and_base[0], frame_obj.f_code) + * try: # <<<<<<<<<<<<<< + * file_type = cache_file_type[cache_file_type_key] # Make it faster + * except: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_7, &__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_6); + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":267 + * cache_file_type_key = (frame_obj.f_code.co_firstlineno, abs_path_real_path_and_base[0], frame_obj.f_code) + * try: + * file_type = cache_file_type[cache_file_type_key] # Make it faster # <<<<<<<<<<<<<< + * except: + * file_type = main_debugger.get_file_type(frame_obj, abs_path_real_path_and_base) # we don't want to debug anything related to pydevd + */ + if (unlikely(__pyx_v_cache_file_type == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 267, __pyx_L15_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_cache_file_type, __pyx_v_cache_file_type_key); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 267, __pyx_L15_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_file_type = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":266 + * # on the cache. + * cache_file_type_key = (frame_obj.f_code.co_firstlineno, abs_path_real_path_and_base[0], frame_obj.f_code) + * try: # <<<<<<<<<<<<<< + * file_type = cache_file_type[cache_file_type_key] # Make it faster + * except: + */ + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L20_try_end; + __pyx_L15_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":268 + * try: + * file_type = cache_file_type[cache_file_type_key] # Make it faster + * except: # <<<<<<<<<<<<<< + * file_type = main_debugger.get_file_type(frame_obj, abs_path_real_path_and_base) # we don't want to debug anything related to pydevd + * + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_func_code_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_4, &__pyx_t_2) < 0) __PYX_ERR(0, 268, __pyx_L17_except_error) + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":269 + * file_type = cache_file_type[cache_file_type_key] # Make it faster + * except: + * file_type = main_debugger.get_file_type(frame_obj, abs_path_real_path_and_base) # we don't want to debug anything related to pydevd # <<<<<<<<<<<<<< + * + * if file_type is not None: + */ + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_get_file_type); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 269, __pyx_L17_except_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_10))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_10); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_10, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_11, ((PyObject *)__pyx_v_frame_obj), __pyx_v_abs_path_real_path_and_base}; + __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+1-__pyx_t_12, 2+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 269, __pyx_L17_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_file_type, __pyx_t_9); + __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L16_exception_handled; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":266 + * # on the cache. + * cache_file_type_key = (frame_obj.f_code.co_firstlineno, abs_path_real_path_and_base[0], frame_obj.f_code) + * try: # <<<<<<<<<<<<<< + * file_type = cache_file_type[cache_file_type_key] # Make it faster + * except: + */ + __pyx_L17_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_7, __pyx_t_6); + goto __pyx_L1_error; + __pyx_L16_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_7, __pyx_t_6); + __pyx_L20_try_end:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":271 + * file_type = main_debugger.get_file_type(frame_obj, abs_path_real_path_and_base) # we don't want to debug anything related to pydevd + * + * if file_type is not None: # <<<<<<<<<<<<<< + * func_code_info.always_skip_code = True + * + */ + __pyx_t_3 = (__pyx_v_file_type != Py_None); + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":272 + * + * if file_type is not None: + * func_code_info.always_skip_code = True # <<<<<<<<<<<<<< + * + * if not func_code_info.always_skip_code: + */ + __pyx_v_func_code_info->always_skip_code = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":271 + * file_type = main_debugger.get_file_type(frame_obj, abs_path_real_path_and_base) # we don't want to debug anything related to pydevd + * + * if file_type is not None: # <<<<<<<<<<<<<< + * func_code_info.always_skip_code = True + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":254 + * func_code_info.co_name = co_name + * + * if not func_code_info.always_skip_code: # <<<<<<<<<<<<<< + * try: + * abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":274 + * func_code_info.always_skip_code = True + * + * if not func_code_info.always_skip_code: # <<<<<<<<<<<<<< + * if main_debugger is not None: + * + */ + __pyx_t_3 = (!__pyx_v_func_code_info->always_skip_code); + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":275 + * + * if not func_code_info.always_skip_code: + * if main_debugger is not None: # <<<<<<<<<<<<<< + * + * breakpoints: dict = main_debugger.breakpoints.get(func_code_info.canonical_normalized_filename) + */ + __pyx_t_3 = (__pyx_v_main_debugger != Py_None); + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":277 + * if main_debugger is not None: + * + * breakpoints: dict = main_debugger.breakpoints.get(func_code_info.canonical_normalized_filename) # <<<<<<<<<<<<<< + * function_breakpoint: object = main_debugger.function_breakpoint_name_to_breakpoint.get(func_code_info.co_name) + * # print('\n---') + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_breakpoints); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 277, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_get); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 277, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_func_code_info->canonical_normalized_filename}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 277, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + if (!(likely(PyDict_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_2))) __PYX_ERR(0, 277, __pyx_L1_error) + __pyx_v_breakpoints = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":278 + * + * breakpoints: dict = main_debugger.breakpoints.get(func_code_info.canonical_normalized_filename) + * function_breakpoint: object = main_debugger.function_breakpoint_name_to_breakpoint.get(func_code_info.co_name) # <<<<<<<<<<<<<< + * # print('\n---') + * # print(main_debugger.breakpoints) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_function_breakpoint_name_to_brea); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_get); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_v_func_code_info->co_name}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_v_function_breakpoint = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":283 + * # print(func_code_info.canonical_normalized_filename) + * # print(main_debugger.breakpoints.get(func_code_info.canonical_normalized_filename)) + * code_obj_py: object = code_obj # <<<<<<<<<<<<<< + * cached_code_obj_info: object = _cache.get(code_obj_py) + * if cached_code_obj_info: + */ + __pyx_t_2 = ((PyObject *)__pyx_v_code_obj); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_code_obj_py = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":284 + * # print(main_debugger.breakpoints.get(func_code_info.canonical_normalized_filename)) + * code_obj_py: object = code_obj + * cached_code_obj_info: object = _cache.get(code_obj_py) # <<<<<<<<<<<<<< + * if cached_code_obj_info: + * # The cache is for new code objects, so, in this case it's already + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_cache); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 284, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_get); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 284, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_code_obj_py}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 284, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_v_cached_code_obj_info = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":285 + * code_obj_py: object = code_obj + * cached_code_obj_info: object = _cache.get(code_obj_py) + * if cached_code_obj_info: # <<<<<<<<<<<<<< + * # The cache is for new code objects, so, in this case it's already + * # using the new code and we can't change it as this is a generator! + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_cached_code_obj_info); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 285, __pyx_L1_error) + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":291 + * # we may not want to go into tracing mode (as would usually happen + * # when the new_code is None). + * func_code_info.new_code = None # <<<<<<<<<<<<<< + * breakpoint_found, thread_info.force_stay_in_untraced_mode = \ + * cached_code_obj_info.compute_force_stay_in_untraced_mode(breakpoints) + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_func_code_info->new_code); + __Pyx_DECREF(__pyx_v_func_code_info->new_code); + __pyx_v_func_code_info->new_code = Py_None; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":293 + * func_code_info.new_code = None + * breakpoint_found, thread_info.force_stay_in_untraced_mode = \ + * cached_code_obj_info.compute_force_stay_in_untraced_mode(breakpoints) # <<<<<<<<<<<<<< + * func_code_info.breakpoint_found = breakpoint_found + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_cached_code_obj_info, __pyx_n_s_compute_force_stay_in_untraced_m); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 293, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = NULL; + __pyx_t_12 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_12 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_breakpoints}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 293, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 292, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_1 = PyList_GET_ITEM(sequence, 0); + __pyx_t_4 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 292, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 292, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_9 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 292, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_13 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_9); + index = 0; __pyx_t_1 = __pyx_t_13(__pyx_t_9); if (unlikely(!__pyx_t_1)) goto __pyx_L27_unpacking_failed; + __Pyx_GOTREF(__pyx_t_1); + index = 1; __pyx_t_4 = __pyx_t_13(__pyx_t_9); if (unlikely(!__pyx_t_4)) goto __pyx_L27_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_9), 2) < 0) __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_t_13 = NULL; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L28_unpacking_done; + __pyx_L27_unpacking_failed:; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_13 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_L28_unpacking_done:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":292 + * # when the new_code is None). + * func_code_info.new_code = None + * breakpoint_found, thread_info.force_stay_in_untraced_mode = \ # <<<<<<<<<<<<<< + * cached_code_obj_info.compute_force_stay_in_untraced_mode(breakpoints) + * func_code_info.breakpoint_found = breakpoint_found + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 292, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_breakpoint_found = __pyx_t_1; + __pyx_t_1 = 0; + __pyx_v_thread_info->force_stay_in_untraced_mode = __pyx_t_3; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":294 + * breakpoint_found, thread_info.force_stay_in_untraced_mode = \ + * cached_code_obj_info.compute_force_stay_in_untraced_mode(breakpoints) + * func_code_info.breakpoint_found = breakpoint_found # <<<<<<<<<<<<<< + * + * elif function_breakpoint: + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_breakpoint_found); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 294, __pyx_L1_error) + __pyx_v_func_code_info->breakpoint_found = __pyx_t_3; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":285 + * code_obj_py: object = code_obj + * cached_code_obj_info: object = _cache.get(code_obj_py) + * if cached_code_obj_info: # <<<<<<<<<<<<<< + * # The cache is for new code objects, so, in this case it's already + * # using the new code and we can't change it as this is a generator! + */ + goto __pyx_L26; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":296 + * func_code_info.breakpoint_found = breakpoint_found + * + * elif function_breakpoint: # <<<<<<<<<<<<<< + * # Go directly into tracing mode + * func_code_info.breakpoint_found = True + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_function_breakpoint); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 296, __pyx_L1_error) + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":298 + * elif function_breakpoint: + * # Go directly into tracing mode + * func_code_info.breakpoint_found = True # <<<<<<<<<<<<<< + * func_code_info.new_code = None + * + */ + __pyx_v_func_code_info->breakpoint_found = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":299 + * # Go directly into tracing mode + * func_code_info.breakpoint_found = True + * func_code_info.new_code = None # <<<<<<<<<<<<<< + * + * elif breakpoints: + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_func_code_info->new_code); + __Pyx_DECREF(__pyx_v_func_code_info->new_code); + __pyx_v_func_code_info->new_code = Py_None; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":296 + * func_code_info.breakpoint_found = breakpoint_found + * + * elif function_breakpoint: # <<<<<<<<<<<<<< + * # Go directly into tracing mode + * func_code_info.breakpoint_found = True + */ + goto __pyx_L26; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":301 + * func_code_info.new_code = None + * + * elif breakpoints: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('found breakpoints', code_obj_py.co_name, breakpoints) + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_breakpoints); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 301, __pyx_L1_error) + if (__pyx_t_3) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":307 + * # Note: new_code can be None if unable to generate. + * # It should automatically put the new code object in the cache. + * breakpoint_found, func_code_info.new_code = generate_code_with_breakpoints(code_obj_py, breakpoints) # <<<<<<<<<<<<<< + * func_code_info.breakpoint_found = breakpoint_found + * + */ + __pyx_t_2 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_generate_code_with_breakpoints(__pyx_v_code_obj_py, __pyx_v_breakpoints); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 307, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_4 = PyList_GET_ITEM(sequence, 0); + __pyx_t_1 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_1); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_9 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_13 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_9); + index = 0; __pyx_t_4 = __pyx_t_13(__pyx_t_9); if (unlikely(!__pyx_t_4)) goto __pyx_L29_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + index = 1; __pyx_t_1 = __pyx_t_13(__pyx_t_9); if (unlikely(!__pyx_t_1)) goto __pyx_L29_unpacking_failed; + __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_9), 2) < 0) __PYX_ERR(0, 307, __pyx_L1_error) + __pyx_t_13 = NULL; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L30_unpacking_done; + __pyx_L29_unpacking_failed:; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_13 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 307, __pyx_L1_error) + __pyx_L30_unpacking_done:; + } + __pyx_v_breakpoint_found = __pyx_t_4; + __pyx_t_4 = 0; + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_func_code_info->new_code); + __Pyx_DECREF(__pyx_v_func_code_info->new_code); + __pyx_v_func_code_info->new_code = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":308 + * # It should automatically put the new code object in the cache. + * breakpoint_found, func_code_info.new_code = generate_code_with_breakpoints(code_obj_py, breakpoints) + * func_code_info.breakpoint_found = breakpoint_found # <<<<<<<<<<<<<< + * + * Py_INCREF(func_code_info) + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_breakpoint_found); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L1_error) + __pyx_v_func_code_info->breakpoint_found = __pyx_t_3; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":301 + * func_code_info.new_code = None + * + * elif breakpoints: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('found breakpoints', code_obj_py.co_name, breakpoints) + */ + } + __pyx_L26:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":275 + * + * if not func_code_info.always_skip_code: + * if main_debugger is not None: # <<<<<<<<<<<<<< + * + * breakpoints: dict = main_debugger.breakpoints.get(func_code_info.canonical_normalized_filename) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":274 + * func_code_info.always_skip_code = True + * + * if not func_code_info.always_skip_code: # <<<<<<<<<<<<<< + * if main_debugger is not None: + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":310 + * func_code_info.breakpoint_found = breakpoint_found + * + * Py_INCREF(func_code_info) # <<<<<<<<<<<<<< + * _PyCode_SetExtra( code_obj, _code_extra_index, func_code_info) + * + */ + Py_INCREF(((PyObject *)__pyx_v_func_code_info)); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":311 + * + * Py_INCREF(func_code_info) + * _PyCode_SetExtra( code_obj, _code_extra_index, func_code_info) # <<<<<<<<<<<<<< + * + * return func_code_info + */ + (void)(_PyCode_SetExtra(((PyObject *)__pyx_v_code_obj), __pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator__code_extra_index, ((PyObject *)__pyx_v_func_code_info))); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":313 + * _PyCode_SetExtra( code_obj, _code_extra_index, func_code_info) + * + * return func_code_info # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_func_code_info); + __pyx_r = __pyx_v_func_code_info; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":212 + * cdef int _code_extra_index = -1 + * + * cdef FuncCodeInfo get_func_code_info(ThreadInfo thread_info, PyFrameObject * frame_obj, PyCodeObject * code_obj): # <<<<<<<<<<<<<< + * ''' + * Provides code-object related info. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_func_code_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_main_debugger); + __Pyx_XDECREF((PyObject *)__pyx_v_func_code_info_obj); + __Pyx_XDECREF(__pyx_v_co_filename); + __Pyx_XDECREF(__pyx_v_co_name); + __Pyx_XDECREF(__pyx_v_cache_file_type); + __Pyx_XDECREF(__pyx_v_cache_file_type_key); + __Pyx_XDECREF((PyObject *)__pyx_v_func_code_info); + __Pyx_XDECREF(__pyx_v_abs_path_real_path_and_base); + __Pyx_XDECREF(__pyx_v_file_type); + __Pyx_XDECREF(__pyx_v_breakpoints); + __Pyx_XDECREF(__pyx_v_function_breakpoint); + __Pyx_XDECREF(__pyx_v_code_obj_py); + __Pyx_XDECREF(__pyx_v_cached_code_obj_info); + __Pyx_XDECREF(__pyx_v_breakpoint_found); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":322 + * cdef public int last_line + * + * def __init__(self, dict line_to_offset, int first_line, int last_line): # <<<<<<<<<<<<<< + * self.line_to_offset = line_to_offset + * self.first_line = first_line + */ + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_line_to_offset = 0; + int __pyx_v_first_line; + int __pyx_v_last_line; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_line_to_offset,&__pyx_n_s_first_line,&__pyx_n_s_last_line,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_line_to_offset)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 322, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_first_line)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 322, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, 1); __PYX_ERR(0, 322, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_last_line)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 322, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, 2); __PYX_ERR(0, 322, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 322, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_line_to_offset = ((PyObject*)values[0]); + __pyx_v_first_line = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_first_line == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 322, __pyx_L3_error) + __pyx_v_last_line = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_last_line == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 322, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 322, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_line_to_offset), (&PyDict_Type), 1, "line_to_offset", 1))) __PYX_ERR(0, 322, __pyx_L1_error) + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo___init__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self), __pyx_v_line_to_offset, __pyx_v_first_line, __pyx_v_last_line); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v_line_to_offset, int __pyx_v_first_line, int __pyx_v_last_line) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":323 + * + * def __init__(self, dict line_to_offset, int first_line, int last_line): + * self.line_to_offset = line_to_offset # <<<<<<<<<<<<<< + * self.first_line = first_line + * self.last_line = last_line + */ + __Pyx_INCREF(__pyx_v_line_to_offset); + __Pyx_GIVEREF(__pyx_v_line_to_offset); + __Pyx_GOTREF(__pyx_v_self->line_to_offset); + __Pyx_DECREF(__pyx_v_self->line_to_offset); + __pyx_v_self->line_to_offset = __pyx_v_line_to_offset; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":324 + * def __init__(self, dict line_to_offset, int first_line, int last_line): + * self.line_to_offset = line_to_offset + * self.first_line = first_line # <<<<<<<<<<<<<< + * self.last_line = last_line + * + */ + __pyx_v_self->first_line = __pyx_v_first_line; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":325 + * self.line_to_offset = line_to_offset + * self.first_line = first_line + * self.last_line = last_line # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_self->last_line = __pyx_v_last_line; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":322 + * cdef public int last_line + * + * def __init__(self, dict line_to_offset, int first_line, int last_line): # <<<<<<<<<<<<<< + * self.line_to_offset = line_to_offset + * self.first_line = first_line + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":318 + * cdef class _CodeLineInfo: + * + * cdef public dict line_to_offset # <<<<<<<<<<<<<< + * cdef public int first_line + * cdef public int last_line + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->line_to_offset); + __pyx_r = __pyx_v_self->line_to_offset; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_v_value))) __PYX_ERR(0, 318, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->line_to_offset); + __Pyx_DECREF(__pyx_v_self->line_to_offset); + __pyx_v_self->line_to_offset = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.line_to_offset.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->line_to_offset); + __Pyx_DECREF(__pyx_v_self->line_to_offset); + __pyx_v_self->line_to_offset = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":319 + * + * cdef public dict line_to_offset + * cdef public int first_line # <<<<<<<<<<<<<< + * cdef public int last_line + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->first_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 319, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.first_line.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 319, __pyx_L1_error) + __pyx_v_self->first_line = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.first_line.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":320 + * cdef public dict line_to_offset + * cdef public int first_line + * cdef public int last_line # <<<<<<<<<<<<<< + * + * def __init__(self, dict line_to_offset, int first_line, int last_line): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->last_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.last_line.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 320, __pyx_L1_error) + __pyx_v_self->last_line = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.last_line.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_3__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_3__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_2__reduce_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_2__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.first_line, self.last_line, self.line_to_offset) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->first_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->last_line); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->line_to_offset); + __Pyx_GIVEREF(__pyx_v_self->line_to_offset); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_self->line_to_offset)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.first_line, self.last_line, self.line_to_offset) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_3 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v__dict = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":7 + * state = (self.first_line, self.last_line, self.line_to_offset) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_4 = (__pyx_v__dict != Py_None); + if (__pyx_t_4) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_2)); + __pyx_t_2 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.line_to_offset is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.first_line, self.last_line, self.line_to_offset) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.line_to_offset is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, None), state + */ + /*else*/ { + __pyx_t_4 = (__pyx_v_self->line_to_offset != ((PyObject*)Py_None)); + __pyx_v_use_setstate = __pyx_t_4; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.line_to_offset is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.line_to_offset is not None + * if use_setstate: + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pyx_unpickle__CodeLineInfo); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_95010005); + __Pyx_GIVEREF(__pyx_int_95010005); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_95010005)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.line_to_offset is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, None), state + * else: + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle__CodeLineInfo__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle__CodeLineInfo); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_95010005); + __Pyx_GIVEREF(__pyx_int_95010005); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_95010005)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__CodeLineInfo__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_5__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_5__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_4__setstate_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_4__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle__CodeLineInfo__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle__CodeLineInfo__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__CodeLineInfo__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":329 + * + * # Note: this method has a version in pure-python too. + * def _get_code_line_info(code_obj): # <<<<<<<<<<<<<< + * line_to_offset: dict = {} + * first_line: int = None + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_get_code_line_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_get_code_line_info = {"_get_code_line_info", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_get_code_line_info, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_get_code_line_info(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_code_obj = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_code_line_info (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code_obj,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 329, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_get_code_line_info") < 0)) __PYX_ERR(0, 329, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_code_obj = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("_get_code_line_info", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 329, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._get_code_line_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10_get_code_line_info(__pyx_self, __pyx_v_code_obj); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10_get_code_line_info(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj) { + PyObject *__pyx_v_line_to_offset = 0; + PyObject *__pyx_v_first_line = 0; + PyObject *__pyx_v_last_line = 0; + int __pyx_v_offset; + int __pyx_v_line; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + unsigned int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *(*__pyx_t_6)(PyObject *); + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *(*__pyx_t_9)(PyObject *); + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_get_code_line_info", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":330 + * # Note: this method has a version in pure-python too. + * def _get_code_line_info(code_obj): + * line_to_offset: dict = {} # <<<<<<<<<<<<<< + * first_line: int = None + * last_line: int = None + */ + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 330, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_line_to_offset = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":331 + * def _get_code_line_info(code_obj): + * line_to_offset: dict = {} + * first_line: int = None # <<<<<<<<<<<<<< + * last_line: int = None + * + */ + __Pyx_INCREF(Py_None); + __pyx_v_first_line = ((PyObject*)Py_None); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":332 + * line_to_offset: dict = {} + * first_line: int = None + * last_line: int = None # <<<<<<<<<<<<<< + * + * cdef int offset + */ + __Pyx_INCREF(Py_None); + __pyx_v_last_line = ((PyObject*)Py_None); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":337 + * cdef int line + * + * for offset, line in dis.findlinestarts(code_obj): # <<<<<<<<<<<<<< + * line_to_offset[line] = offset + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_dis); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_findlinestarts); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_code_obj}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) { + __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); + __pyx_t_5 = 0; + __pyx_t_6 = NULL; + } else { + __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 337, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (likely(!__pyx_t_6)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_3); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 337, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 337, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_3); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 337, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 337, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } + } else { + __pyx_t_1 = __pyx_t_6(__pyx_t_3); + if (unlikely(!__pyx_t_1)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 337, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 337, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_2 = PyList_GET_ITEM(sequence, 0); + __pyx_t_7 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_7); + #else + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_8 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_9 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_8); + index = 0; __pyx_t_2 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_2)) goto __pyx_L5_unpacking_failed; + __Pyx_GOTREF(__pyx_t_2); + index = 1; __pyx_t_7 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_7)) goto __pyx_L5_unpacking_failed; + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) __PYX_ERR(0, 337, __pyx_L1_error) + __pyx_t_9 = NULL; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L6_unpacking_done; + __pyx_L5_unpacking_failed:; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_9 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 337, __pyx_L1_error) + __pyx_L6_unpacking_done:; + } + __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_11 = __Pyx_PyInt_As_int(__pyx_t_7); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_offset = __pyx_t_10; + __pyx_v_line = __pyx_t_11; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":338 + * + * for offset, line in dis.findlinestarts(code_obj): + * line_to_offset[line] = offset # <<<<<<<<<<<<<< + * + * if line_to_offset: + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_offset); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 338, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_line); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 338, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (unlikely((PyDict_SetItem(__pyx_v_line_to_offset, __pyx_t_7, __pyx_t_1) < 0))) __PYX_ERR(0, 338, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":337 + * cdef int line + * + * for offset, line in dis.findlinestarts(code_obj): # <<<<<<<<<<<<<< + * line_to_offset[line] = offset + * + */ + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":340 + * line_to_offset[line] = offset + * + * if line_to_offset: # <<<<<<<<<<<<<< + * first_line = min(line_to_offset) + * last_line = max(line_to_offset) + */ + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_line_to_offset); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 340, __pyx_L1_error) + if (__pyx_t_12) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":341 + * + * if line_to_offset: + * first_line = min(line_to_offset) # <<<<<<<<<<<<<< + * last_line = max(line_to_offset) + * return _CodeLineInfo(line_to_offset, first_line, last_line) + */ + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_min, __pyx_v_line_to_offset); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(__Pyx_Py3Int_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("int", __pyx_t_3))) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_DECREF_SET(__pyx_v_first_line, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":342 + * if line_to_offset: + * first_line = min(line_to_offset) + * last_line = max(line_to_offset) # <<<<<<<<<<<<<< + * return _CodeLineInfo(line_to_offset, first_line, last_line) + * + */ + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_max, __pyx_v_line_to_offset); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 342, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(__Pyx_Py3Int_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("int", __pyx_t_3))) __PYX_ERR(0, 342, __pyx_L1_error) + __Pyx_DECREF_SET(__pyx_v_last_line, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":340 + * line_to_offset[line] = offset + * + * if line_to_offset: # <<<<<<<<<<<<<< + * first_line = min(line_to_offset) + * last_line = max(line_to_offset) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":343 + * first_line = min(line_to_offset) + * last_line = max(line_to_offset) + * return _CodeLineInfo(line_to_offset, first_line, last_line) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 343, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_line_to_offset); + __Pyx_GIVEREF(__pyx_v_line_to_offset); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_line_to_offset)) __PYX_ERR(0, 343, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_first_line); + __Pyx_GIVEREF(__pyx_v_first_line); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_first_line)) __PYX_ERR(0, 343, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_last_line); + __Pyx_GIVEREF(__pyx_v_last_line); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_last_line)) __PYX_ERR(0, 343, __pyx_L1_error); + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo), __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 343, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":329 + * + * # Note: this method has a version in pure-python too. + * def _get_code_line_info(code_obj): # <<<<<<<<<<<<<< + * line_to_offset: dict = {} + * first_line: int = None + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._get_code_line_info", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_line_to_offset); + __Pyx_XDECREF(__pyx_v_first_line); + __Pyx_XDECREF(__pyx_v_last_line); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":353 + * _cache: dict = {} + * + * def get_cached_code_obj_info_py(code_obj_py): # <<<<<<<<<<<<<< + * ''' + * :return _CacheValue: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13get_cached_code_obj_info_py(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +PyDoc_STRVAR(__pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_12get_cached_code_obj_info_py, "\n :return _CacheValue:\n :note: on cython use _cache.get(code_obj_py) directly.\n "); +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_13get_cached_code_obj_info_py = {"get_cached_code_obj_info_py", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13get_cached_code_obj_info_py, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_12get_cached_code_obj_info_py}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13get_cached_code_obj_info_py(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_code_obj_py = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_cached_code_obj_info_py (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code_obj_py,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code_obj_py)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 353, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "get_cached_code_obj_info_py") < 0)) __PYX_ERR(0, 353, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_code_obj_py = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("get_cached_code_obj_info_py", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 353, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_cached_code_obj_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12get_cached_code_obj_info_py(__pyx_self, __pyx_v_code_obj_py); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12get_cached_code_obj_info_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj_py) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + unsigned int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_cached_code_obj_info_py", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":358 + * :note: on cython use _cache.get(code_obj_py) directly. + * ''' + * return _cache.get(code_obj_py) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_cache); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 358, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_4 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_4 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_code_obj_py}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":353 + * _cache: dict = {} + * + * def get_cached_code_obj_info_py(code_obj_py): # <<<<<<<<<<<<<< + * ''' + * :return _CacheValue: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_cached_code_obj_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":368 + * cdef public set code_lines_as_set + * + * def __init__(self, object code_obj_py, _CodeLineInfo code_line_info, set breakpoints_hit_at_lines): # <<<<<<<<<<<<<< + * ''' + * :param code_obj_py: + */ + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +PyDoc_STRVAR(__pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__, "\n :param code_obj_py:\n :param _CodeLineInfo code_line_info:\n :param set[int] breakpoints_hit_at_lines:\n "); +#if CYTHON_UPDATE_DESCRIPTOR_DOC +struct wrapperbase __pyx_wrapperbase_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__; +#endif +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_code_obj_py = 0; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_code_line_info = 0; + PyObject *__pyx_v_breakpoints_hit_at_lines = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code_obj_py,&__pyx_n_s_code_line_info,&__pyx_n_s_breakpoints_hit_at_lines,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code_obj_py)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 368, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code_line_info)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 368, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, 1); __PYX_ERR(0, 368, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_breakpoints_hit_at_lines)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 368, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, 2); __PYX_ERR(0, 368, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 368, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_code_obj_py = values[0]; + __pyx_v_code_line_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)values[1]); + __pyx_v_breakpoints_hit_at_lines = ((PyObject*)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 368, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_code_line_info), __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, 1, "code_line_info", 0))) __PYX_ERR(0, 368, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_breakpoints_hit_at_lines), (&PySet_Type), 1, "breakpoints_hit_at_lines", 1))) __PYX_ERR(0, 368, __pyx_L1_error) + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self), __pyx_v_code_obj_py, __pyx_v_code_line_info, __pyx_v_breakpoints_hit_at_lines); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_code_obj_py, struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v_code_line_info, PyObject *__pyx_v_breakpoints_hit_at_lines) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":374 + * :param set[int] breakpoints_hit_at_lines: + * ''' + * self.code_obj_py = code_obj_py # <<<<<<<<<<<<<< + * self.code_line_info = code_line_info + * self.breakpoints_hit_at_lines = breakpoints_hit_at_lines + */ + __Pyx_INCREF(__pyx_v_code_obj_py); + __Pyx_GIVEREF(__pyx_v_code_obj_py); + __Pyx_GOTREF(__pyx_v_self->code_obj_py); + __Pyx_DECREF(__pyx_v_self->code_obj_py); + __pyx_v_self->code_obj_py = __pyx_v_code_obj_py; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":375 + * ''' + * self.code_obj_py = code_obj_py + * self.code_line_info = code_line_info # <<<<<<<<<<<<<< + * self.breakpoints_hit_at_lines = breakpoints_hit_at_lines + * self.code_lines_as_set = set(code_line_info.line_to_offset) + */ + __Pyx_INCREF((PyObject *)__pyx_v_code_line_info); + __Pyx_GIVEREF((PyObject *)__pyx_v_code_line_info); + __Pyx_GOTREF((PyObject *)__pyx_v_self->code_line_info); + __Pyx_DECREF((PyObject *)__pyx_v_self->code_line_info); + __pyx_v_self->code_line_info = __pyx_v_code_line_info; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":376 + * self.code_obj_py = code_obj_py + * self.code_line_info = code_line_info + * self.breakpoints_hit_at_lines = breakpoints_hit_at_lines # <<<<<<<<<<<<<< + * self.code_lines_as_set = set(code_line_info.line_to_offset) + * + */ + __Pyx_INCREF(__pyx_v_breakpoints_hit_at_lines); + __Pyx_GIVEREF(__pyx_v_breakpoints_hit_at_lines); + __Pyx_GOTREF(__pyx_v_self->breakpoints_hit_at_lines); + __Pyx_DECREF(__pyx_v_self->breakpoints_hit_at_lines); + __pyx_v_self->breakpoints_hit_at_lines = __pyx_v_breakpoints_hit_at_lines; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":377 + * self.code_line_info = code_line_info + * self.breakpoints_hit_at_lines = breakpoints_hit_at_lines + * self.code_lines_as_set = set(code_line_info.line_to_offset) # <<<<<<<<<<<<<< + * + * cpdef compute_force_stay_in_untraced_mode(self, breakpoints): + */ + __pyx_t_1 = PySet_New(__pyx_v_code_line_info->line_to_offset); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 377, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->code_lines_as_set); + __Pyx_DECREF(__pyx_v_self->code_lines_as_set); + __pyx_v_self->code_lines_as_set = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":368 + * cdef public set code_lines_as_set + * + * def __init__(self, object code_obj_py, _CodeLineInfo code_line_info, set breakpoints_hit_at_lines): # <<<<<<<<<<<<<< + * ''' + * :param code_obj_py: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":379 + * self.code_lines_as_set = set(code_line_info.line_to_offset) + * + * cpdef compute_force_stay_in_untraced_mode(self, breakpoints): # <<<<<<<<<<<<<< + * ''' + * :param breakpoints: + */ + +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_3compute_force_stay_in_untraced_mode(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_compute_force_stay_in_untraced_mode(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_breakpoints, int __pyx_skip_dispatch) { + int __pyx_v_force_stay_in_untraced_mode; + int __pyx_v_breakpoint_found; + PyObject *__pyx_v_target_breakpoints = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("compute_force_stay_in_untraced_mode", 1); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { + PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_compute_force_stay_in_untraced_m); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_3compute_force_stay_in_untraced_mode)) { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_breakpoints}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); + if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) { + __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":389 + * cdef set target_breakpoints + * + * force_stay_in_untraced_mode = False # <<<<<<<<<<<<<< + * + * target_breakpoints = self.code_lines_as_set.intersection(breakpoints) + */ + __pyx_v_force_stay_in_untraced_mode = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":391 + * force_stay_in_untraced_mode = False + * + * target_breakpoints = self.code_lines_as_set.intersection(breakpoints) # <<<<<<<<<<<<<< + * breakpoint_found = bool(target_breakpoints) + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->code_lines_as_set, __pyx_n_s_intersection); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_breakpoints}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + if (!(likely(PySet_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("set", __pyx_t_1))) __PYX_ERR(0, 391, __pyx_L1_error) + __pyx_v_target_breakpoints = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":392 + * + * target_breakpoints = self.code_lines_as_set.intersection(breakpoints) + * breakpoint_found = bool(target_breakpoints) # <<<<<<<<<<<<<< + * + * if not breakpoint_found: + */ + __pyx_t_6 = (__pyx_v_target_breakpoints != Py_None)&&(PySet_GET_SIZE(__pyx_v_target_breakpoints) != 0); + __pyx_v_breakpoint_found = (!(!__pyx_t_6)); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":394 + * breakpoint_found = bool(target_breakpoints) + * + * if not breakpoint_found: # <<<<<<<<<<<<<< + * force_stay_in_untraced_mode = True + * else: + */ + __pyx_t_6 = (!__pyx_v_breakpoint_found); + if (__pyx_t_6) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":395 + * + * if not breakpoint_found: + * force_stay_in_untraced_mode = True # <<<<<<<<<<<<<< + * else: + * force_stay_in_untraced_mode = self.breakpoints_hit_at_lines.issuperset(set(breakpoints)) + */ + __pyx_v_force_stay_in_untraced_mode = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":394 + * breakpoint_found = bool(target_breakpoints) + * + * if not breakpoint_found: # <<<<<<<<<<<<<< + * force_stay_in_untraced_mode = True + * else: + */ + goto __pyx_L3; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":397 + * force_stay_in_untraced_mode = True + * else: + * force_stay_in_untraced_mode = self.breakpoints_hit_at_lines.issuperset(set(breakpoints)) # <<<<<<<<<<<<<< + * + * return breakpoint_found, force_stay_in_untraced_mode + */ + /*else*/ { + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->breakpoints_hit_at_lines, __pyx_n_s_issuperset); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 397, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySet_New(__pyx_v_breakpoints); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 397, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 397, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 397, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_force_stay_in_untraced_mode = __pyx_t_6; + } + __pyx_L3:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":399 + * force_stay_in_untraced_mode = self.breakpoints_hit_at_lines.issuperset(set(breakpoints)) + * + * return breakpoint_found, force_stay_in_untraced_mode # <<<<<<<<<<<<<< + * + * def generate_code_with_breakpoints_py(object code_obj_py, dict breakpoints): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_breakpoint_found); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 399, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_force_stay_in_untraced_mode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 399, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 399, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(0, 399, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(0, 399, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":379 + * self.code_lines_as_set = set(code_line_info.line_to_offset) + * + * cpdef compute_force_stay_in_untraced_mode(self, breakpoints): # <<<<<<<<<<<<<< + * ''' + * :param breakpoints: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.compute_force_stay_in_untraced_mode", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_target_breakpoints); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_3compute_force_stay_in_untraced_mode(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +PyDoc_STRVAR(__pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_2compute_force_stay_in_untraced_mode, "\n :param breakpoints:\n set(breakpoint_lines) or dict(breakpoint_line->breakpoint info)\n :return tuple(breakpoint_found, force_stay_in_untraced_mode)\n "); +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_3compute_force_stay_in_untraced_mode = {"compute_force_stay_in_untraced_mode", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_3compute_force_stay_in_untraced_mode, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_2compute_force_stay_in_untraced_mode}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_3compute_force_stay_in_untraced_mode(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_breakpoints = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("compute_force_stay_in_untraced_mode (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_breakpoints,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_breakpoints)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 379, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "compute_force_stay_in_untraced_mode") < 0)) __PYX_ERR(0, 379, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_breakpoints = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("compute_force_stay_in_untraced_mode", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 379, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.compute_force_stay_in_untraced_mode", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_2compute_force_stay_in_untraced_mode(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self), __pyx_v_breakpoints); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_2compute_force_stay_in_untraced_mode(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_breakpoints) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("compute_force_stay_in_untraced_mode", 1); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_compute_force_stay_in_untraced_mode(__pyx_v_self, __pyx_v_breakpoints, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.compute_force_stay_in_untraced_mode", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":363 + * cdef class _CacheValue(object): + * + * cdef public object code_obj_py # <<<<<<<<<<<<<< + * cdef public _CodeLineInfo code_line_info + * cdef public set breakpoints_hit_at_lines + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->code_obj_py); + __pyx_r = __pyx_v_self->code_obj_py; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->code_obj_py); + __Pyx_DECREF(__pyx_v_self->code_obj_py); + __pyx_v_self->code_obj_py = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->code_obj_py); + __Pyx_DECREF(__pyx_v_self->code_obj_py); + __pyx_v_self->code_obj_py = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":364 + * + * cdef public object code_obj_py + * cdef public _CodeLineInfo code_line_info # <<<<<<<<<<<<<< + * cdef public set breakpoints_hit_at_lines + * cdef public set code_lines_as_set + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_self->code_line_info); + __pyx_r = ((PyObject *)__pyx_v_self->code_line_info); + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo))))) __PYX_ERR(0, 364, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF((PyObject *)__pyx_v_self->code_line_info); + __Pyx_DECREF((PyObject *)__pyx_v_self->code_line_info); + __pyx_v_self->code_line_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.code_line_info.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF((PyObject *)__pyx_v_self->code_line_info); + __Pyx_DECREF((PyObject *)__pyx_v_self->code_line_info); + __pyx_v_self->code_line_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":365 + * cdef public object code_obj_py + * cdef public _CodeLineInfo code_line_info + * cdef public set breakpoints_hit_at_lines # <<<<<<<<<<<<<< + * cdef public set code_lines_as_set + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->breakpoints_hit_at_lines); + __pyx_r = __pyx_v_self->breakpoints_hit_at_lines; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("set", __pyx_v_value))) __PYX_ERR(0, 365, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->breakpoints_hit_at_lines); + __Pyx_DECREF(__pyx_v_self->breakpoints_hit_at_lines); + __pyx_v_self->breakpoints_hit_at_lines = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.breakpoints_hit_at_lines.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->breakpoints_hit_at_lines); + __Pyx_DECREF(__pyx_v_self->breakpoints_hit_at_lines); + __pyx_v_self->breakpoints_hit_at_lines = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":366 + * cdef public _CodeLineInfo code_line_info + * cdef public set breakpoints_hit_at_lines + * cdef public set code_lines_as_set # <<<<<<<<<<<<<< + * + * def __init__(self, object code_obj_py, _CodeLineInfo code_line_info, set breakpoints_hit_at_lines): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 1); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->code_lines_as_set); + __pyx_r = __pyx_v_self->code_lines_as_set; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 1); + if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("set", __pyx_v_value))) __PYX_ERR(0, 366, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->code_lines_as_set); + __Pyx_DECREF(__pyx_v_self->code_lines_as_set); + __pyx_v_self->code_lines_as_set = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.code_lines_as_set.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_5__del__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->code_lines_as_set); + __Pyx_DECREF(__pyx_v_self->code_lines_as_set); + __pyx_v_self->code_lines_as_set = ((PyObject*)Py_None); + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_5__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_5__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_4__reduce_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_4__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.breakpoints_hit_at_lines, self.code_line_info, self.code_lines_as_set, self.code_obj_py) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->breakpoints_hit_at_lines); + __Pyx_GIVEREF(__pyx_v_self->breakpoints_hit_at_lines); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->breakpoints_hit_at_lines)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_self->code_line_info); + __Pyx_GIVEREF((PyObject *)__pyx_v_self->code_line_info); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_self->code_line_info))) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->code_lines_as_set); + __Pyx_GIVEREF(__pyx_v_self->code_lines_as_set); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_self->code_lines_as_set)) __PYX_ERR(1, 5, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_self->code_obj_py); + __Pyx_GIVEREF(__pyx_v_self->code_obj_py); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_self->code_obj_py)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.breakpoints_hit_at_lines, self.code_line_info, self.code_lines_as_set, self.code_obj_py) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.breakpoints_hit_at_lines, self.code_line_info, self.code_lines_as_set, self.code_obj_py) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.breakpoints_hit_at_lines is not None or self.code_line_info is not None or self.code_lines_as_set is not None or self.code_obj_py is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.breakpoints_hit_at_lines, self.code_line_info, self.code_lines_as_set, self.code_obj_py) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.breakpoints_hit_at_lines is not None or self.code_line_info is not None or self.code_lines_as_set is not None or self.code_obj_py is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, None), state + */ + /*else*/ { + __pyx_t_4 = (__pyx_v_self->breakpoints_hit_at_lines != ((PyObject*)Py_None)); + if (!__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = (((PyObject *)__pyx_v_self->code_line_info) != Py_None); + if (!__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = (__pyx_v_self->code_lines_as_set != ((PyObject*)Py_None)); + if (!__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = (__pyx_v_self->code_obj_py != Py_None); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.breakpoints_hit_at_lines is not None or self.code_line_info is not None or self.code_lines_as_set is not None or self.code_obj_py is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.breakpoints_hit_at_lines is not None or self.code_line_info is not None or self.code_lines_as_set is not None or self.code_obj_py is not None + * if use_setstate: + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle__CacheValue); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_180628038); + __Pyx_GIVEREF(__pyx_int_180628038); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_180628038)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.breakpoints_hit_at_lines is not None or self.code_line_info is not None or self.code_lines_as_set is not None or self.code_obj_py is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, None), state + * else: + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle__CacheValue__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle__CacheValue); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_180628038); + __Pyx_GIVEREF(__pyx_int_180628038); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_180628038)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_5 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__CacheValue__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_7__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_7__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_6__setstate_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_6__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle__CacheValue__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle__CacheValue__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__CacheValue__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":401 + * return breakpoint_found, force_stay_in_untraced_mode + * + * def generate_code_with_breakpoints_py(object code_obj_py, dict breakpoints): # <<<<<<<<<<<<<< + * return generate_code_with_breakpoints(code_obj_py, breakpoints) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_15generate_code_with_breakpoints_py(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_15generate_code_with_breakpoints_py = {"generate_code_with_breakpoints_py", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_15generate_code_with_breakpoints_py, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_15generate_code_with_breakpoints_py(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v_code_obj_py = 0; + PyObject *__pyx_v_breakpoints = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("generate_code_with_breakpoints_py (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code_obj_py,&__pyx_n_s_breakpoints,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code_obj_py)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 401, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_breakpoints)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 401, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("generate_code_with_breakpoints_py", 1, 2, 2, 1); __PYX_ERR(0, 401, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "generate_code_with_breakpoints_py") < 0)) __PYX_ERR(0, 401, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_code_obj_py = values[0]; + __pyx_v_breakpoints = ((PyObject*)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("generate_code_with_breakpoints_py", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 401, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.generate_code_with_breakpoints_py", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_breakpoints), (&PyDict_Type), 1, "breakpoints", 1))) __PYX_ERR(0, 401, __pyx_L1_error) + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_14generate_code_with_breakpoints_py(__pyx_self, __pyx_v_code_obj_py, __pyx_v_breakpoints); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_14generate_code_with_breakpoints_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj_py, PyObject *__pyx_v_breakpoints) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("generate_code_with_breakpoints_py", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":402 + * + * def generate_code_with_breakpoints_py(object code_obj_py, dict breakpoints): + * return generate_code_with_breakpoints(code_obj_py, breakpoints) # <<<<<<<<<<<<<< + * + * # DEBUG = True + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_generate_code_with_breakpoints(__pyx_v_code_obj_py, __pyx_v_breakpoints); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":401 + * return breakpoint_found, force_stay_in_untraced_mode + * + * def generate_code_with_breakpoints_py(object code_obj_py, dict breakpoints): # <<<<<<<<<<<<<< + * return generate_code_with_breakpoints(code_obj_py, breakpoints) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.generate_code_with_breakpoints_py", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":407 + * # debug_helper = DebugHelper() + * + * cdef generate_code_with_breakpoints(object code_obj_py, dict breakpoints): # <<<<<<<<<<<<<< + * ''' + * :param breakpoints: + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_generate_code_with_breakpoints(PyObject *__pyx_v_code_obj_py, PyObject *__pyx_v_breakpoints) { + int __pyx_v_success; + int __pyx_v_breakpoint_line; + int __pyx_v_breakpoint_found; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v_cache_value = 0; + PyObject *__pyx_v_breakpoints_hit_at_lines = 0; + PyObject *__pyx_v_line_to_offset = 0; + PyObject *__pyx_v_code_line_info = NULL; + PyObject *__pyx_v_new_code = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + Py_ssize_t __pyx_t_6; + Py_ssize_t __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + PyObject *(*__pyx_t_12)(PyObject *); + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("generate_code_with_breakpoints", 0); + __Pyx_INCREF(__pyx_v_code_obj_py); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":424 + * cdef dict line_to_offset + * + * assert code_obj_py not in _cache, 'If a code object is cached, that same code object must be reused.' # <<<<<<<<<<<<<< + * + * # if DEBUG: + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_cache); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_v_code_obj_py, __pyx_t_1, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 424, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_2)) { + __Pyx_Raise(__pyx_builtin_AssertionError, __pyx_kp_s_If_a_code_object_is_cached_that, 0, 0); + __PYX_ERR(0, 424, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(0, 424, __pyx_L1_error) + #endif + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":429 + * # initial_code_obj_py = code_obj_py + * + * code_line_info = _get_code_line_info(code_obj_py) # <<<<<<<<<<<<<< + * + * success = True + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_get_code_line_info); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_code_obj_py}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v_code_line_info = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":431 + * code_line_info = _get_code_line_info(code_obj_py) + * + * success = True # <<<<<<<<<<<<<< + * + * breakpoints_hit_at_lines = set() + */ + __pyx_v_success = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":433 + * success = True + * + * breakpoints_hit_at_lines = set() # <<<<<<<<<<<<<< + * line_to_offset = code_line_info.line_to_offset + * + */ + __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_breakpoints_hit_at_lines = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":434 + * + * breakpoints_hit_at_lines = set() + * line_to_offset = code_line_info.line_to_offset # <<<<<<<<<<<<<< + * + * for breakpoint_line in breakpoints: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_code_line_info, __pyx_n_s_line_to_offset); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 434, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyDict_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_1))) __PYX_ERR(0, 434, __pyx_L1_error) + __pyx_v_line_to_offset = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":436 + * line_to_offset = code_line_info.line_to_offset + * + * for breakpoint_line in breakpoints: # <<<<<<<<<<<<<< + * if breakpoint_line in line_to_offset: + * breakpoints_hit_at_lines.add(breakpoint_line) + */ + __pyx_t_6 = 0; + if (unlikely(__pyx_v_breakpoints == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 436, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_breakpoints, 1, ((PyObject *)NULL), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 436, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_1); + __pyx_t_1 = __pyx_t_3; + __pyx_t_3 = 0; + while (1) { + __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_7, &__pyx_t_6, &__pyx_t_3, NULL, NULL, __pyx_t_8); + if (unlikely(__pyx_t_9 == 0)) break; + if (unlikely(__pyx_t_9 == -1)) __PYX_ERR(0, 436, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 436, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_breakpoint_line = __pyx_t_9; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":437 + * + * for breakpoint_line in breakpoints: + * if breakpoint_line in line_to_offset: # <<<<<<<<<<<<<< + * breakpoints_hit_at_lines.add(breakpoint_line) + * + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_breakpoint_line); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 437, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (unlikely(__pyx_v_line_to_offset == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 437, __pyx_L1_error) + } + __pyx_t_2 = (__Pyx_PyDict_ContainsTF(__pyx_t_3, __pyx_v_line_to_offset, Py_EQ)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 437, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_2) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":438 + * for breakpoint_line in breakpoints: + * if breakpoint_line in line_to_offset: + * breakpoints_hit_at_lines.add(breakpoint_line) # <<<<<<<<<<<<<< + * + * if breakpoints_hit_at_lines: + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_breakpoint_line); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 438, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_10 = PySet_Add(__pyx_v_breakpoints_hit_at_lines, __pyx_t_3); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 438, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":437 + * + * for breakpoint_line in breakpoints: + * if breakpoint_line in line_to_offset: # <<<<<<<<<<<<<< + * breakpoints_hit_at_lines.add(breakpoint_line) + * + */ + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":440 + * breakpoints_hit_at_lines.add(breakpoint_line) + * + * if breakpoints_hit_at_lines: # <<<<<<<<<<<<<< + * success, new_code = insert_pydevd_breaks( + * code_obj_py, + */ + __pyx_t_2 = (PySet_GET_SIZE(__pyx_v_breakpoints_hit_at_lines) != 0); + if (__pyx_t_2) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":441 + * + * if breakpoints_hit_at_lines: + * success, new_code = insert_pydevd_breaks( # <<<<<<<<<<<<<< + * code_obj_py, + * breakpoints_hit_at_lines, + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_insert_pydevd_breaks); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":444 + * code_obj_py, + * breakpoints_hit_at_lines, + * code_line_info # <<<<<<<<<<<<<< + * ) + * + */ + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_v_code_obj_py, __pyx_v_breakpoints_hit_at_lines, __pyx_v_code_line_info}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 441, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_3 = PyList_GET_ITEM(sequence, 0); + __pyx_t_4 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_12 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_11); + index = 0; __pyx_t_3 = __pyx_t_12(__pyx_t_11); if (unlikely(!__pyx_t_3)) goto __pyx_L7_unpacking_failed; + __Pyx_GOTREF(__pyx_t_3); + index = 1; __pyx_t_4 = __pyx_t_12(__pyx_t_11); if (unlikely(!__pyx_t_4)) goto __pyx_L7_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 2) < 0) __PYX_ERR(0, 441, __pyx_L1_error) + __pyx_t_12 = NULL; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + goto __pyx_L8_unpacking_done; + __pyx_L7_unpacking_failed:; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __pyx_t_12 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 441, __pyx_L1_error) + __pyx_L8_unpacking_done:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":441 + * + * if breakpoints_hit_at_lines: + * success, new_code = insert_pydevd_breaks( # <<<<<<<<<<<<<< + * code_obj_py, + * breakpoints_hit_at_lines, + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_success = __pyx_t_2; + __pyx_v_new_code = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":447 + * ) + * + * if not success: # <<<<<<<<<<<<<< + * code_obj_py = None + * else: + */ + __pyx_t_2 = (!__pyx_v_success); + if (__pyx_t_2) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":448 + * + * if not success: + * code_obj_py = None # <<<<<<<<<<<<<< + * else: + * code_obj_py = new_code + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_code_obj_py, Py_None); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":447 + * ) + * + * if not success: # <<<<<<<<<<<<<< + * code_obj_py = None + * else: + */ + goto __pyx_L9; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":450 + * code_obj_py = None + * else: + * code_obj_py = new_code # <<<<<<<<<<<<<< + * + * breakpoint_found = bool(breakpoints_hit_at_lines) + */ + /*else*/ { + __Pyx_INCREF(__pyx_v_new_code); + __Pyx_DECREF_SET(__pyx_v_code_obj_py, __pyx_v_new_code); + } + __pyx_L9:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":440 + * breakpoints_hit_at_lines.add(breakpoint_line) + * + * if breakpoints_hit_at_lines: # <<<<<<<<<<<<<< + * success, new_code = insert_pydevd_breaks( + * code_obj_py, + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":452 + * code_obj_py = new_code + * + * breakpoint_found = bool(breakpoints_hit_at_lines) # <<<<<<<<<<<<<< + * if breakpoint_found and success: + * # if DEBUG: + */ + __pyx_t_2 = (PySet_GET_SIZE(__pyx_v_breakpoints_hit_at_lines) != 0); + __pyx_v_breakpoint_found = (!(!__pyx_t_2)); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":453 + * + * breakpoint_found = bool(breakpoints_hit_at_lines) + * if breakpoint_found and success: # <<<<<<<<<<<<<< + * # if DEBUG: + * # op_number = debug_helper.write_dis( + */ + if (__pyx_v_breakpoint_found) { + } else { + __pyx_t_2 = __pyx_v_breakpoint_found; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_2 = __pyx_v_success; + __pyx_L11_bool_binop_done:; + if (__pyx_t_2) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":466 + * # ) + * + * cache_value = _CacheValue(code_obj_py, code_line_info, breakpoints_hit_at_lines) # <<<<<<<<<<<<<< + * _cache[code_obj_py] = cache_value + * + */ + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 466, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_code_obj_py); + __Pyx_GIVEREF(__pyx_v_code_obj_py); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_code_obj_py)) __PYX_ERR(0, 466, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_code_line_info); + __Pyx_GIVEREF(__pyx_v_code_line_info); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_code_line_info)) __PYX_ERR(0, 466, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_breakpoints_hit_at_lines); + __Pyx_GIVEREF(__pyx_v_breakpoints_hit_at_lines); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_breakpoints_hit_at_lines)) __PYX_ERR(0, 466, __pyx_L1_error); + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue), __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 466, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_cache_value = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_t_4); + __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":467 + * + * cache_value = _CacheValue(code_obj_py, code_line_info, breakpoints_hit_at_lines) + * _cache[code_obj_py] = cache_value # <<<<<<<<<<<<<< + * + * return breakpoint_found, code_obj_py + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_cache); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 467, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (unlikely((PyObject_SetItem(__pyx_t_4, __pyx_v_code_obj_py, ((PyObject *)__pyx_v_cache_value)) < 0))) __PYX_ERR(0, 467, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":453 + * + * breakpoint_found = bool(breakpoints_hit_at_lines) + * if breakpoint_found and success: # <<<<<<<<<<<<<< + * # if DEBUG: + * # op_number = debug_helper.write_dis( + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":469 + * _cache[code_obj_py] = cache_value + * + * return breakpoint_found, code_obj_py # <<<<<<<<<<<<<< + * + * import sys + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_breakpoint_found); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 469, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 469, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4)) __PYX_ERR(0, 469, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_code_obj_py); + __Pyx_GIVEREF(__pyx_v_code_obj_py); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_code_obj_py)) __PYX_ERR(0, 469, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":407 + * # debug_helper = DebugHelper() + * + * cdef generate_code_with_breakpoints(object code_obj_py, dict breakpoints): # <<<<<<<<<<<<<< + * ''' + * :param breakpoints: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.generate_code_with_breakpoints", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_cache_value); + __Pyx_XDECREF(__pyx_v_breakpoints_hit_at_lines); + __Pyx_XDECREF(__pyx_v_line_to_offset); + __Pyx_XDECREF(__pyx_v_code_line_info); + __Pyx_XDECREF(__pyx_v_new_code); + __Pyx_XDECREF(__pyx_v_code_obj_py); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":475 + * cdef bint IS_PY_39_OWNARDS = sys.version_info[:2] >= (3, 9) + * + * def frame_eval_func(): # <<<<<<<<<<<<<< + * cdef PyThreadState *state = PyThreadState_Get() + * if IS_PY_39_OWNARDS: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_17frame_eval_func(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_17frame_eval_func = {"frame_eval_func", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_17frame_eval_func, METH_NOARGS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_17frame_eval_func(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("frame_eval_func (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_16frame_eval_func(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_16frame_eval_func(CYTHON_UNUSED PyObject *__pyx_self) { + PyThreadState *__pyx_v_state; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("frame_eval_func", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":476 + * + * def frame_eval_func(): + * cdef PyThreadState *state = PyThreadState_Get() # <<<<<<<<<<<<<< + * if IS_PY_39_OWNARDS: + * state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_39 + */ + __pyx_v_state = PyThreadState_Get(); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":477 + * def frame_eval_func(): + * cdef PyThreadState *state = PyThreadState_Get() + * if IS_PY_39_OWNARDS: # <<<<<<<<<<<<<< + * state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_39 + * else: + */ + if (__pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator_IS_PY_39_OWNARDS) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":478 + * cdef PyThreadState *state = PyThreadState_Get() + * if IS_PY_39_OWNARDS: + * state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_39 # <<<<<<<<<<<<<< + * else: + * state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_38 + */ + __pyx_v_state->interp->eval_frame = ((_PyFrameEvalFunction *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval_39); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":477 + * def frame_eval_func(): + * cdef PyThreadState *state = PyThreadState_Get() + * if IS_PY_39_OWNARDS: # <<<<<<<<<<<<<< + * state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_39 + * else: + */ + goto __pyx_L3; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":480 + * state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_39 + * else: + * state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_38 # <<<<<<<<<<<<<< + * dummy_tracing_holder.set_trace_func(dummy_trace_dispatch) + * + */ + /*else*/ { + __pyx_v_state->interp->eval_frame = ((_PyFrameEvalFunction *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval_38); + } + __pyx_L3:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":481 + * else: + * state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_38 + * dummy_tracing_holder.set_trace_func(dummy_trace_dispatch) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_dummy_tracing_holder); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 481, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_set_trace_func); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 481, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_dummy_trace_dispatch); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 481, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 481, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":475 + * cdef bint IS_PY_39_OWNARDS = sys.version_info[:2] >= (3, 9) + * + * def frame_eval_func(): # <<<<<<<<<<<<<< + * cdef PyThreadState *state = PyThreadState_Get() + * if IS_PY_39_OWNARDS: + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.frame_eval_func", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":484 + * + * + * def stop_frame_eval(): # <<<<<<<<<<<<<< + * cdef PyThreadState *state = PyThreadState_Get() + * state.interp.eval_frame = _PyEval_EvalFrameDefault + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_19stop_frame_eval(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_19stop_frame_eval = {"stop_frame_eval", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_19stop_frame_eval, METH_NOARGS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_19stop_frame_eval(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("stop_frame_eval (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_18stop_frame_eval(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_18stop_frame_eval(CYTHON_UNUSED PyObject *__pyx_self) { + PyThreadState *__pyx_v_state; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("stop_frame_eval", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":485 + * + * def stop_frame_eval(): + * cdef PyThreadState *state = PyThreadState_Get() # <<<<<<<<<<<<<< + * state.interp.eval_frame = _PyEval_EvalFrameDefault + * + */ + __pyx_v_state = PyThreadState_Get(); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":486 + * def stop_frame_eval(): + * cdef PyThreadState *state = PyThreadState_Get() + * state.interp.eval_frame = _PyEval_EvalFrameDefault # <<<<<<<<<<<<<< + * + * # During the build we'll generate 2 versions of the code below so that we're compatible with + */ + __pyx_v_state->interp->eval_frame = _PyEval_EvalFrameDefault; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":484 + * + * + * def stop_frame_eval(): # <<<<<<<<<<<<<< + * cdef PyThreadState *state = PyThreadState_Get() + * state.interp.eval_frame = _PyEval_EvalFrameDefault + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":494 + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * cdef PyObject * get_bytecode_while_frame_eval_38(PyFrameObject * frame_obj, int exc): # <<<<<<<<<<<<<< + * ''' + * This function makes the actual evaluation and changes the bytecode to a version + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval_38(PyFrameObject *__pyx_v_frame_obj, int __pyx_v_exc) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_thread_info = 0; + CYTHON_UNUSED int __pyx_v_STATE_SUSPEND; + int __pyx_v_CMD_STEP_INTO; + int __pyx_v_CMD_STEP_OVER; + int __pyx_v_CMD_STEP_OVER_MY_CODE; + int __pyx_v_CMD_STEP_INTO_MY_CODE; + int __pyx_v_CMD_STEP_INTO_COROUTINE; + int __pyx_v_CMD_SMART_STEP_INTO; + int __pyx_v_can_skip; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_additional_info = 0; + PyObject *__pyx_v_main_debugger = 0; + PyObject *__pyx_v_frame = NULL; + PyObject *__pyx_v_trace_func = NULL; + PyObject *__pyx_v_apply_to_global = NULL; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_func_code_info = 0; + PyObject *__pyx_v_old = NULL; + PyObject *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + unsigned int __pyx_t_10; + PyObject *(*__pyx_t_11)(PyObject *); + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + char const *__pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + PyObject *__pyx_t_18 = NULL; + PyObject *__pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_bytecode_while_frame_eval_38", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":499 + * where programmatic breakpoints are added. + * ''' + * if GlobalDebuggerHolder is None or _thread_local_info is None or exc: # <<<<<<<<<<<<<< + * # Sometimes during process shutdown these global variables become None + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 499, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = (__pyx_t_2 == Py_None); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 499, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = (__pyx_t_2 == Py_None); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_exc != 0); + __pyx_t_1 = __pyx_t_3; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":501 + * if GlobalDebuggerHolder is None or _thread_local_info is None or exc: + * # Sometimes during process shutdown these global variables become None + * return CALL_EvalFrameDefault_38(frame_obj, exc) # <<<<<<<<<<<<<< + * + * # co_filename: str = frame_obj.f_code.co_filename + */ + __pyx_r = CALL_EvalFrameDefault_38(__pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":499 + * where programmatic breakpoints are added. + * ''' + * if GlobalDebuggerHolder is None or _thread_local_info is None or exc: # <<<<<<<<<<<<<< + * # Sometimes during process shutdown these global variables become None + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":508 + * + * cdef ThreadInfo thread_info + * cdef int STATE_SUSPEND = 2 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_INTO = 107 + * cdef int CMD_STEP_OVER = 108 + */ + __pyx_v_STATE_SUSPEND = 2; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":509 + * cdef ThreadInfo thread_info + * cdef int STATE_SUSPEND = 2 + * cdef int CMD_STEP_INTO = 107 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_OVER = 108 + * cdef int CMD_STEP_OVER_MY_CODE = 159 + */ + __pyx_v_CMD_STEP_INTO = 0x6B; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":510 + * cdef int STATE_SUSPEND = 2 + * cdef int CMD_STEP_INTO = 107 + * cdef int CMD_STEP_OVER = 108 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_OVER_MY_CODE = 159 + * cdef int CMD_STEP_INTO_MY_CODE = 144 + */ + __pyx_v_CMD_STEP_OVER = 0x6C; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":511 + * cdef int CMD_STEP_INTO = 107 + * cdef int CMD_STEP_OVER = 108 + * cdef int CMD_STEP_OVER_MY_CODE = 159 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_INTO_MY_CODE = 144 + * cdef int CMD_STEP_INTO_COROUTINE = 206 + */ + __pyx_v_CMD_STEP_OVER_MY_CODE = 0x9F; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":512 + * cdef int CMD_STEP_OVER = 108 + * cdef int CMD_STEP_OVER_MY_CODE = 159 + * cdef int CMD_STEP_INTO_MY_CODE = 144 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_INTO_COROUTINE = 206 + * cdef int CMD_SMART_STEP_INTO = 128 + */ + __pyx_v_CMD_STEP_INTO_MY_CODE = 0x90; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":513 + * cdef int CMD_STEP_OVER_MY_CODE = 159 + * cdef int CMD_STEP_INTO_MY_CODE = 144 + * cdef int CMD_STEP_INTO_COROUTINE = 206 # <<<<<<<<<<<<<< + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True + */ + __pyx_v_CMD_STEP_INTO_COROUTINE = 0xCE; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":514 + * cdef int CMD_STEP_INTO_MY_CODE = 144 + * cdef int CMD_STEP_INTO_COROUTINE = 206 + * cdef int CMD_SMART_STEP_INTO = 128 # <<<<<<<<<<<<<< + * cdef bint can_skip = True + * try: + */ + __pyx_v_CMD_SMART_STEP_INTO = 0x80; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":515 + * cdef int CMD_STEP_INTO_COROUTINE = 206 + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True # <<<<<<<<<<<<<< + * try: + * thread_info = _thread_local_info.thread_info + */ + __pyx_v_can_skip = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":516 + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True + * try: # <<<<<<<<<<<<<< + * thread_info = _thread_local_info.thread_info + * except: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":517 + * cdef bint can_skip = True + * try: + * thread_info = _thread_local_info.thread_info # <<<<<<<<<<<<<< + * except: + * thread_info = get_thread_info(frame_obj) + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 517, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_thread_info); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 517, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo))))) __PYX_ERR(0, 517, __pyx_L7_error) + __pyx_v_thread_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":516 + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True + * try: # <<<<<<<<<<<<<< + * thread_info = _thread_local_info.thread_info + * except: + */ + } + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L12_try_end; + __pyx_L7_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":518 + * try: + * thread_info = _thread_local_info.thread_info + * except: # <<<<<<<<<<<<<< + * thread_info = get_thread_info(frame_obj) + * if thread_info is None: + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_bytecode_while_frame_eval_38", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_2, &__pyx_t_8) < 0) __PYX_ERR(0, 518, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_8); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":519 + * thread_info = _thread_local_info.thread_info + * except: + * thread_info = get_thread_info(frame_obj) # <<<<<<<<<<<<<< + * if thread_info is None: + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + __pyx_t_9 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_thread_info(__pyx_v_frame_obj)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 519, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_XDECREF_SET(__pyx_v_thread_info, ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_9)); + __pyx_t_9 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":520 + * except: + * thread_info = get_thread_info(frame_obj) + * if thread_info is None: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + */ + __pyx_t_1 = (((PyObject *)__pyx_v_thread_info) == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":521 + * thread_info = get_thread_info(frame_obj) + * if thread_info is None: + * return CALL_EvalFrameDefault_38(frame_obj, exc) # <<<<<<<<<<<<<< + * + * if thread_info.inside_frame_eval: + */ + __pyx_r = CALL_EvalFrameDefault_38(__pyx_v_frame_obj, __pyx_v_exc); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L10_except_return; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":520 + * except: + * thread_info = get_thread_info(frame_obj) + * if thread_info is None: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + */ + } + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L8_exception_handled; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":516 + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True + * try: # <<<<<<<<<<<<<< + * thread_info = _thread_local_info.thread_info + * except: + */ + __pyx_L9_except_error:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + goto __pyx_L1_error; + __pyx_L10_except_return:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + goto __pyx_L0; + __pyx_L8_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + __pyx_L12_try_end:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":523 + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + * if thread_info.inside_frame_eval: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + */ + __pyx_t_1 = (__pyx_v_thread_info->inside_frame_eval != 0); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":524 + * + * if thread_info.inside_frame_eval: + * return CALL_EvalFrameDefault_38(frame_obj, exc) # <<<<<<<<<<<<<< + * + * if not thread_info.fully_initialized: + */ + __pyx_r = CALL_EvalFrameDefault_38(__pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":523 + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + * if thread_info.inside_frame_eval: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":526 + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + * if not thread_info.fully_initialized: # <<<<<<<<<<<<<< + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: + */ + __pyx_t_1 = (!__pyx_v_thread_info->fully_initialized); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":527 + * + * if not thread_info.fully_initialized: + * thread_info.initialize_if_possible() # <<<<<<<<<<<<<< + * if not thread_info.fully_initialized: + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + __pyx_t_8 = ((struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_thread_info->__pyx_vtab)->initialize_if_possible(__pyx_v_thread_info); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 527, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":528 + * if not thread_info.fully_initialized: + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + */ + __pyx_t_1 = (!__pyx_v_thread_info->fully_initialized); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":529 + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: + * return CALL_EvalFrameDefault_38(frame_obj, exc) # <<<<<<<<<<<<<< + * + * # Can only get additional_info when fully initialized. + */ + __pyx_r = CALL_EvalFrameDefault_38(__pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":528 + * if not thread_info.fully_initialized: + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":526 + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * + * if not thread_info.fully_initialized: # <<<<<<<<<<<<<< + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":532 + * + * # Can only get additional_info when fully initialized. + * cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info # <<<<<<<<<<<<<< + * if thread_info.is_pydevd_thread or additional_info.is_tracing: + * # Make sure that we don't trace pydevd threads or inside our own calls. + */ + __pyx_t_8 = ((PyObject *)__pyx_v_thread_info->additional_info); + __Pyx_INCREF(__pyx_t_8); + __pyx_v_additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":533 + * # Can only get additional_info when fully initialized. + * cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info + * if thread_info.is_pydevd_thread or additional_info.is_tracing: # <<<<<<<<<<<<<< + * # Make sure that we don't trace pydevd threads or inside our own calls. + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + if (!__pyx_v_thread_info->is_pydevd_thread) { + } else { + __pyx_t_1 = __pyx_v_thread_info->is_pydevd_thread; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_additional_info->is_tracing != 0); + __pyx_t_1 = __pyx_t_3; + __pyx_L20_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":535 + * if thread_info.is_pydevd_thread or additional_info.is_tracing: + * # Make sure that we don't trace pydevd threads or inside our own calls. + * return CALL_EvalFrameDefault_38(frame_obj, exc) # <<<<<<<<<<<<<< + * + * # frame = frame_obj + */ + __pyx_r = CALL_EvalFrameDefault_38(__pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":533 + * # Can only get additional_info when fully initialized. + * cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info + * if thread_info.is_pydevd_thread or additional_info.is_tracing: # <<<<<<<<<<<<<< + * # Make sure that we don't trace pydevd threads or inside our own calls. + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":542 + * # print('get_bytecode_while_frame_eval', frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename) + * + * thread_info.inside_frame_eval += 1 # <<<<<<<<<<<<<< + * additional_info.is_tracing = True + * try: + */ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval + 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":543 + * + * thread_info.inside_frame_eval += 1 + * additional_info.is_tracing = True # <<<<<<<<<<<<<< + * try: + * main_debugger: object = GlobalDebuggerHolder.global_dbg + */ + __pyx_v_additional_info->is_tracing = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":544 + * thread_info.inside_frame_eval += 1 + * additional_info.is_tracing = True + * try: # <<<<<<<<<<<<<< + * main_debugger: object = GlobalDebuggerHolder.global_dbg + * if main_debugger is None: + */ + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":545 + * additional_info.is_tracing = True + * try: + * main_debugger: object = GlobalDebuggerHolder.global_dbg # <<<<<<<<<<<<<< + * if main_debugger is None: + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 545, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_global_dbg); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 545, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_main_debugger = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":546 + * try: + * main_debugger: object = GlobalDebuggerHolder.global_dbg + * if main_debugger is None: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * frame = frame_obj + */ + __pyx_t_1 = (__pyx_v_main_debugger == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":547 + * main_debugger: object = GlobalDebuggerHolder.global_dbg + * if main_debugger is None: + * return CALL_EvalFrameDefault_38(frame_obj, exc) # <<<<<<<<<<<<<< + * frame = frame_obj + * + */ + __pyx_r = CALL_EvalFrameDefault_38(__pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L22_return; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":546 + * try: + * main_debugger: object = GlobalDebuggerHolder.global_dbg + * if main_debugger is None: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * frame = frame_obj + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":548 + * if main_debugger is None: + * return CALL_EvalFrameDefault_38(frame_obj, exc) + * frame = frame_obj # <<<<<<<<<<<<<< + * + * if thread_info.thread_trace_func is None: + */ + __pyx_t_2 = ((PyObject *)__pyx_v_frame_obj); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_frame = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":550 + * frame = frame_obj + * + * if thread_info.thread_trace_func is None: # <<<<<<<<<<<<<< + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: + */ + __pyx_t_1 = (__pyx_v_thread_info->thread_trace_func == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":551 + * + * if thread_info.thread_trace_func is None: + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) # <<<<<<<<<<<<<< + * if apply_to_global: + * thread_info.thread_trace_func = trace_func + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_fix_top_level_trace_and_get_trac); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 551, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = NULL; + __pyx_t_10 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_10 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_v_main_debugger, __pyx_v_frame}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 551, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 551, __pyx_L23_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_8 = PyList_GET_ITEM(sequence, 0); + __pyx_t_7 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + #else + __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 551, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 551, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_9 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 551, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_11 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_9); + index = 0; __pyx_t_8 = __pyx_t_11(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L27_unpacking_failed; + __Pyx_GOTREF(__pyx_t_8); + index = 1; __pyx_t_7 = __pyx_t_11(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L27_unpacking_failed; + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_9), 2) < 0) __PYX_ERR(0, 551, __pyx_L23_error) + __pyx_t_11 = NULL; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L28_unpacking_done; + __pyx_L27_unpacking_failed:; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_11 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 551, __pyx_L23_error) + __pyx_L28_unpacking_done:; + } + __pyx_v_trace_func = __pyx_t_8; + __pyx_t_8 = 0; + __pyx_v_apply_to_global = __pyx_t_7; + __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":552 + * if thread_info.thread_trace_func is None: + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: # <<<<<<<<<<<<<< + * thread_info.thread_trace_func = trace_func + * + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_apply_to_global); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 552, __pyx_L23_error) + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":553 + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: + * thread_info.thread_trace_func = trace_func # <<<<<<<<<<<<<< + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ + */ + __Pyx_INCREF(__pyx_v_trace_func); + __Pyx_GIVEREF(__pyx_v_trace_func); + __Pyx_GOTREF(__pyx_v_thread_info->thread_trace_func); + __Pyx_DECREF(__pyx_v_thread_info->thread_trace_func); + __pyx_v_thread_info->thread_trace_func = __pyx_v_trace_func; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":552 + * if thread_info.thread_trace_func is None: + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: # <<<<<<<<<<<<<< + * thread_info.thread_trace_func = trace_func + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":550 + * frame = frame_obj + * + * if thread_info.thread_trace_func is None: # <<<<<<<<<<<<<< + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":555 + * thread_info.thread_trace_func = trace_func + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ # <<<<<<<<<<<<<< + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ + */ + __pyx_t_12 = __pyx_v_additional_info->pydev_step_cmd; + __pyx_t_13 = (__pyx_t_12 == __pyx_v_CMD_STEP_INTO); + if (!__pyx_t_13) { + } else { + __pyx_t_3 = __pyx_t_13; + goto __pyx_L33_bool_binop_done; + } + __pyx_t_13 = (__pyx_t_12 == __pyx_v_CMD_STEP_INTO_MY_CODE); + if (!__pyx_t_13) { + } else { + __pyx_t_3 = __pyx_t_13; + goto __pyx_L33_bool_binop_done; + } + __pyx_t_13 = (__pyx_t_12 == __pyx_v_CMD_STEP_INTO_COROUTINE); + if (!__pyx_t_13) { + } else { + __pyx_t_3 = __pyx_t_13; + goto __pyx_L33_bool_binop_done; + } + __pyx_t_13 = (__pyx_t_12 == __pyx_v_CMD_SMART_STEP_INTO); + __pyx_t_3 = __pyx_t_13; + __pyx_L33_bool_binop_done:; + __pyx_t_13 = __pyx_t_3; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":556 + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ + * main_debugger.break_on_caught_exceptions or \ # <<<<<<<<<<<<<< + * main_debugger.break_on_user_uncaught_exceptions or \ + * main_debugger.has_plugin_exception_breaks or \ + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_break_on_caught_exceptions); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 556, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 556, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":557 + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ # <<<<<<<<<<<<<< + * main_debugger.has_plugin_exception_breaks or \ + * main_debugger.signature_factory or \ + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_break_on_user_uncaught_exception); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 557, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 557, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":558 + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ + * main_debugger.has_plugin_exception_breaks or \ # <<<<<<<<<<<<<< + * main_debugger.signature_factory or \ + * additional_info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop: + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_has_plugin_exception_breaks); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 558, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 558, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":559 + * main_debugger.break_on_user_uncaught_exceptions or \ + * main_debugger.has_plugin_exception_breaks or \ + * main_debugger.signature_factory or \ # <<<<<<<<<<<<<< + * additional_info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop: + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_signature_factory); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 559, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 559, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":560 + * main_debugger.has_plugin_exception_breaks or \ + * main_debugger.signature_factory or \ + * additional_info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop: # <<<<<<<<<<<<<< + * + * # if DEBUG: + */ + __pyx_t_12 = __pyx_v_additional_info->pydev_step_cmd; + __pyx_t_3 = (__pyx_t_12 == __pyx_v_CMD_STEP_OVER); + if (!__pyx_t_3) { + } else { + __pyx_t_13 = __pyx_t_3; + goto __pyx_L42_bool_binop_done; + } + __pyx_t_3 = (__pyx_t_12 == __pyx_v_CMD_STEP_OVER_MY_CODE); + __pyx_t_13 = __pyx_t_3; + __pyx_L42_bool_binop_done:; + __pyx_t_3 = __pyx_t_13; + if (__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_show_return_values); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 560, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 560, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 560, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = (__pyx_t_2 == __pyx_v_additional_info->pydev_step_stop); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = __pyx_t_3; + __pyx_L31_bool_binop_done:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":555 + * thread_info.thread_trace_func = trace_func + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ # <<<<<<<<<<<<<< + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ + */ + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":564 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval enabled trace') + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + __pyx_t_1 = (__pyx_v_thread_info->thread_trace_func != Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":565 + * # print('get_bytecode_while_frame_eval enabled trace') + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func # <<<<<<<<<<<<<< + * else: + * frame.f_trace = main_debugger.trace_dispatch + */ + __pyx_t_2 = __pyx_v_thread_info->thread_trace_func; + __Pyx_INCREF(__pyx_t_2); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_2) < 0) __PYX_ERR(0, 565, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":564 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval enabled trace') + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + goto __pyx_L45; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":567 + * frame.f_trace = thread_info.thread_trace_func + * else: + * frame.f_trace = main_debugger.trace_dispatch # <<<<<<<<<<<<<< + * else: + * func_code_info: FuncCodeInfo = get_func_code_info(thread_info, frame_obj, frame_obj.f_code) + */ + /*else*/ { + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 567, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __pyx_t_2; + __Pyx_INCREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_7) < 0) __PYX_ERR(0, 567, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_L45:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":555 + * thread_info.thread_trace_func = trace_func + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ # <<<<<<<<<<<<<< + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ + */ + goto __pyx_L30; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":569 + * frame.f_trace = main_debugger.trace_dispatch + * else: + * func_code_info: FuncCodeInfo = get_func_code_info(thread_info, frame_obj, frame_obj.f_code) # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code) + */ + /*else*/ { + __pyx_t_7 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_func_code_info(__pyx_v_thread_info, __pyx_v_frame_obj, __pyx_v_frame_obj->f_code)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 569, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_v_func_code_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":572 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code) + * if not func_code_info.always_skip_code: # <<<<<<<<<<<<<< + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: + */ + __pyx_t_1 = (!__pyx_v_func_code_info->always_skip_code); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":574 + * if not func_code_info.always_skip_code: + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: # <<<<<<<<<<<<<< + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + * + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_has_plugin_line_breaks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 574, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 574, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L48_bool_binop_done; + } + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_has_plugin_exception_breaks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 574, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 574, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_1 = __pyx_t_3; + __pyx_L48_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":575 + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) # <<<<<<<<<<<<<< + * + * if not can_skip: + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_plugin); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 575, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_can_skip); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 575, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_10 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_10 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_main_debugger, ((PyObject *)__pyx_v_frame_obj)}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 575, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 575, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_can_skip = __pyx_t_1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":577 + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + * + * if not can_skip: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval not can_skip') + */ + __pyx_t_1 = (!__pyx_v_can_skip); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":580 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval not can_skip') + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + __pyx_t_1 = (__pyx_v_thread_info->thread_trace_func != Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":581 + * # print('get_bytecode_while_frame_eval not can_skip') + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func # <<<<<<<<<<<<<< + * else: + * frame.f_trace = main_debugger.trace_dispatch + */ + __pyx_t_7 = __pyx_v_thread_info->thread_trace_func; + __Pyx_INCREF(__pyx_t_7); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_7) < 0) __PYX_ERR(0, 581, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":580 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval not can_skip') + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + goto __pyx_L51; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":583 + * frame.f_trace = thread_info.thread_trace_func + * else: + * frame.f_trace = main_debugger.trace_dispatch # <<<<<<<<<<<<<< + * + * if can_skip and func_code_info.breakpoint_found: + */ + /*else*/ { + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 583, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __pyx_t_7; + __Pyx_INCREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_8) < 0) __PYX_ERR(0, 583, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_L51:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":577 + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + * + * if not can_skip: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval not can_skip') + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":574 + * if not func_code_info.always_skip_code: + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: # <<<<<<<<<<<<<< + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":585 + * frame.f_trace = main_debugger.trace_dispatch + * + * if can_skip and func_code_info.breakpoint_found: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + */ + if (__pyx_v_can_skip) { + } else { + __pyx_t_1 = __pyx_v_can_skip; + goto __pyx_L53_bool_binop_done; + } + __pyx_t_1 = __pyx_v_func_code_info->breakpoint_found; + __pyx_L53_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":588 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + * if not thread_info.force_stay_in_untraced_mode: # <<<<<<<<<<<<<< + * # If breakpoints are found but new_code is None, + * # this means we weren't able to actually add the code + */ + __pyx_t_1 = (!__pyx_v_thread_info->force_stay_in_untraced_mode); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":592 + * # this means we weren't able to actually add the code + * # where needed, so, fallback to tracing. + * if func_code_info.new_code is None: # <<<<<<<<<<<<<< + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func + */ + __pyx_t_1 = (__pyx_v_func_code_info->new_code == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":593 + * # where needed, so, fallback to tracing. + * if func_code_info.new_code is None: + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + __pyx_t_1 = (__pyx_v_thread_info->thread_trace_func != Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":594 + * if func_code_info.new_code is None: + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func # <<<<<<<<<<<<<< + * else: + * frame.f_trace = main_debugger.trace_dispatch + */ + __pyx_t_8 = __pyx_v_thread_info->thread_trace_func; + __Pyx_INCREF(__pyx_t_8); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_8) < 0) __PYX_ERR(0, 594, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":593 + * # where needed, so, fallback to tracing. + * if func_code_info.new_code is None: + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + goto __pyx_L57; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":596 + * frame.f_trace = thread_info.thread_trace_func + * else: + * frame.f_trace = main_debugger.trace_dispatch # <<<<<<<<<<<<<< + * else: + * # print('Using frame eval break for', frame_obj.f_code.co_name) + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 596, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __pyx_t_8; + __Pyx_INCREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_7) < 0) __PYX_ERR(0, 596, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_L57:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":592 + * # this means we weren't able to actually add the code + * # where needed, so, fallback to tracing. + * if func_code_info.new_code is None: # <<<<<<<<<<<<<< + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func + */ + goto __pyx_L56; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":599 + * else: + * # print('Using frame eval break for', frame_obj.f_code.co_name) + * update_globals_dict( frame_obj.f_globals) # <<<<<<<<<<<<<< + * Py_INCREF(func_code_info.new_code) + * old = frame_obj.f_code + */ + /*else*/ { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_update_globals_dict); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_2 = NULL; + __pyx_t_10 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_10 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, ((PyObject *)__pyx_v_frame_obj->f_globals)}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 599, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":600 + * # print('Using frame eval break for', frame_obj.f_code.co_name) + * update_globals_dict( frame_obj.f_globals) + * Py_INCREF(func_code_info.new_code) # <<<<<<<<<<<<<< + * old = frame_obj.f_code + * frame_obj.f_code = func_code_info.new_code + */ + __pyx_t_7 = __pyx_v_func_code_info->new_code; + __Pyx_INCREF(__pyx_t_7); + Py_INCREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":601 + * update_globals_dict( frame_obj.f_globals) + * Py_INCREF(func_code_info.new_code) + * old = frame_obj.f_code # <<<<<<<<<<<<<< + * frame_obj.f_code = func_code_info.new_code + * Py_DECREF(old) + */ + __pyx_t_7 = ((PyObject *)__pyx_v_frame_obj->f_code); + __Pyx_INCREF(__pyx_t_7); + __pyx_v_old = __pyx_t_7; + __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":602 + * Py_INCREF(func_code_info.new_code) + * old = frame_obj.f_code + * frame_obj.f_code = func_code_info.new_code # <<<<<<<<<<<<<< + * Py_DECREF(old) + * else: + */ + __pyx_v_frame_obj->f_code = ((PyCodeObject *)__pyx_v_func_code_info->new_code); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":603 + * old = frame_obj.f_code + * frame_obj.f_code = func_code_info.new_code + * Py_DECREF(old) # <<<<<<<<<<<<<< + * else: + * # When we're forcing to stay in traced mode we need to + */ + Py_DECREF(__pyx_v_old); + } + __pyx_L56:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":588 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + * if not thread_info.force_stay_in_untraced_mode: # <<<<<<<<<<<<<< + * # If breakpoints are found but new_code is None, + * # this means we weren't able to actually add the code + */ + goto __pyx_L55; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":608 + * # update the globals dict (because this means that we're reusing + * # a previous code which had breakpoints added in a new frame). + * update_globals_dict( frame_obj.f_globals) # <<<<<<<<<<<<<< + * + * finally: + */ + /*else*/ { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_update_globals_dict); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 608, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_2 = NULL; + __pyx_t_10 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_10 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, ((PyObject *)__pyx_v_frame_obj->f_globals)}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 608, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_L55:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":585 + * frame.f_trace = main_debugger.trace_dispatch + * + * if can_skip and func_code_info.breakpoint_found: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":572 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code) + * if not func_code_info.always_skip_code: # <<<<<<<<<<<<<< + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: + */ + } + } + __pyx_L30:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":611 + * + * finally: + * thread_info.inside_frame_eval -= 1 # <<<<<<<<<<<<<< + * additional_info.is_tracing = False + * + */ + /*finally:*/ { + /*normal exit:*/{ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":612 + * finally: + * thread_info.inside_frame_eval -= 1 + * additional_info.is_tracing = False # <<<<<<<<<<<<<< + * + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + __pyx_v_additional_info->is_tracing = 0; + goto __pyx_L24; + } + __pyx_L23_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_6 = 0; __pyx_t_5 = 0; __pyx_t_4 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_4) < 0)) __Pyx_ErrFetch(&__pyx_t_6, &__pyx_t_5, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_18); + __pyx_t_12 = __pyx_lineno; __pyx_t_14 = __pyx_clineno; __pyx_t_15 = __pyx_filename; + { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":611 + * + * finally: + * thread_info.inside_frame_eval -= 1 # <<<<<<<<<<<<<< + * additional_info.is_tracing = False + * + */ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":612 + * finally: + * thread_info.inside_frame_eval -= 1 + * additional_info.is_tracing = False # <<<<<<<<<<<<<< + * + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + __pyx_v_additional_info->is_tracing = 0; + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_ExceptionReset(__pyx_t_16, __pyx_t_17, __pyx_t_18); + } + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ErrRestore(__pyx_t_6, __pyx_t_5, __pyx_t_4); + __pyx_t_6 = 0; __pyx_t_5 = 0; __pyx_t_4 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; + __pyx_lineno = __pyx_t_12; __pyx_clineno = __pyx_t_14; __pyx_filename = __pyx_t_15; + goto __pyx_L1_error; + } + __pyx_L22_return: { + __pyx_t_19 = __pyx_r; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":611 + * + * finally: + * thread_info.inside_frame_eval -= 1 # <<<<<<<<<<<<<< + * additional_info.is_tracing = False + * + */ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":612 + * finally: + * thread_info.inside_frame_eval -= 1 + * additional_info.is_tracing = False # <<<<<<<<<<<<<< + * + * return CALL_EvalFrameDefault_38(frame_obj, exc) + */ + __pyx_v_additional_info->is_tracing = 0; + __pyx_r = __pyx_t_19; + goto __pyx_L0; + } + __pyx_L24:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":614 + * additional_info.is_tracing = False + * + * return CALL_EvalFrameDefault_38(frame_obj, exc) # <<<<<<<<<<<<<< + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * ### WARNING: GENERATED CODE, DO NOT EDIT! + */ + __pyx_r = CALL_EvalFrameDefault_38(__pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":494 + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * cdef PyObject * get_bytecode_while_frame_eval_38(PyFrameObject * frame_obj, int exc): # <<<<<<<<<<<<<< + * ''' + * This function makes the actual evaluation and changes the bytecode to a version + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_bytecode_while_frame_eval_38", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_thread_info); + __Pyx_XDECREF((PyObject *)__pyx_v_additional_info); + __Pyx_XDECREF(__pyx_v_main_debugger); + __Pyx_XDECREF(__pyx_v_frame); + __Pyx_XDECREF(__pyx_v_trace_func); + __Pyx_XDECREF(__pyx_v_apply_to_global); + __Pyx_XDECREF((PyObject *)__pyx_v_func_code_info); + __Pyx_XDECREF(__pyx_v_old); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":623 + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * cdef PyObject * get_bytecode_while_frame_eval_39(PyThreadState* tstate, PyFrameObject * frame_obj, int exc): # <<<<<<<<<<<<<< + * ''' + * This function makes the actual evaluation and changes the bytecode to a version + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval_39(PyThreadState *__pyx_v_tstate, PyFrameObject *__pyx_v_frame_obj, int __pyx_v_exc) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_thread_info = 0; + CYTHON_UNUSED int __pyx_v_STATE_SUSPEND; + int __pyx_v_CMD_STEP_INTO; + int __pyx_v_CMD_STEP_OVER; + int __pyx_v_CMD_STEP_OVER_MY_CODE; + int __pyx_v_CMD_STEP_INTO_MY_CODE; + int __pyx_v_CMD_STEP_INTO_COROUTINE; + int __pyx_v_CMD_SMART_STEP_INTO; + int __pyx_v_can_skip; + struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_additional_info = 0; + PyObject *__pyx_v_main_debugger = 0; + PyObject *__pyx_v_frame = NULL; + PyObject *__pyx_v_trace_func = NULL; + PyObject *__pyx_v_apply_to_global = NULL; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_func_code_info = 0; + PyObject *__pyx_v_old = NULL; + PyObject *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + unsigned int __pyx_t_10; + PyObject *(*__pyx_t_11)(PyObject *); + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + char const *__pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + PyObject *__pyx_t_18 = NULL; + PyObject *__pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_bytecode_while_frame_eval_39", 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":628 + * where programmatic breakpoints are added. + * ''' + * if GlobalDebuggerHolder is None or _thread_local_info is None or exc: # <<<<<<<<<<<<<< + * # Sometimes during process shutdown these global variables become None + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = (__pyx_t_2 == Py_None); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = (__pyx_t_2 == Py_None); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_exc != 0); + __pyx_t_1 = __pyx_t_3; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":630 + * if GlobalDebuggerHolder is None or _thread_local_info is None or exc: + * # Sometimes during process shutdown these global variables become None + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) # <<<<<<<<<<<<<< + * + * # co_filename: str = frame_obj.f_code.co_filename + */ + __pyx_r = CALL_EvalFrameDefault_39(__pyx_v_tstate, __pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":628 + * where programmatic breakpoints are added. + * ''' + * if GlobalDebuggerHolder is None or _thread_local_info is None or exc: # <<<<<<<<<<<<<< + * # Sometimes during process shutdown these global variables become None + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":637 + * + * cdef ThreadInfo thread_info + * cdef int STATE_SUSPEND = 2 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_INTO = 107 + * cdef int CMD_STEP_OVER = 108 + */ + __pyx_v_STATE_SUSPEND = 2; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":638 + * cdef ThreadInfo thread_info + * cdef int STATE_SUSPEND = 2 + * cdef int CMD_STEP_INTO = 107 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_OVER = 108 + * cdef int CMD_STEP_OVER_MY_CODE = 159 + */ + __pyx_v_CMD_STEP_INTO = 0x6B; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":639 + * cdef int STATE_SUSPEND = 2 + * cdef int CMD_STEP_INTO = 107 + * cdef int CMD_STEP_OVER = 108 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_OVER_MY_CODE = 159 + * cdef int CMD_STEP_INTO_MY_CODE = 144 + */ + __pyx_v_CMD_STEP_OVER = 0x6C; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":640 + * cdef int CMD_STEP_INTO = 107 + * cdef int CMD_STEP_OVER = 108 + * cdef int CMD_STEP_OVER_MY_CODE = 159 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_INTO_MY_CODE = 144 + * cdef int CMD_STEP_INTO_COROUTINE = 206 + */ + __pyx_v_CMD_STEP_OVER_MY_CODE = 0x9F; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":641 + * cdef int CMD_STEP_OVER = 108 + * cdef int CMD_STEP_OVER_MY_CODE = 159 + * cdef int CMD_STEP_INTO_MY_CODE = 144 # <<<<<<<<<<<<<< + * cdef int CMD_STEP_INTO_COROUTINE = 206 + * cdef int CMD_SMART_STEP_INTO = 128 + */ + __pyx_v_CMD_STEP_INTO_MY_CODE = 0x90; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":642 + * cdef int CMD_STEP_OVER_MY_CODE = 159 + * cdef int CMD_STEP_INTO_MY_CODE = 144 + * cdef int CMD_STEP_INTO_COROUTINE = 206 # <<<<<<<<<<<<<< + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True + */ + __pyx_v_CMD_STEP_INTO_COROUTINE = 0xCE; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":643 + * cdef int CMD_STEP_INTO_MY_CODE = 144 + * cdef int CMD_STEP_INTO_COROUTINE = 206 + * cdef int CMD_SMART_STEP_INTO = 128 # <<<<<<<<<<<<<< + * cdef bint can_skip = True + * try: + */ + __pyx_v_CMD_SMART_STEP_INTO = 0x80; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":644 + * cdef int CMD_STEP_INTO_COROUTINE = 206 + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True # <<<<<<<<<<<<<< + * try: + * thread_info = _thread_local_info.thread_info + */ + __pyx_v_can_skip = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":645 + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True + * try: # <<<<<<<<<<<<<< + * thread_info = _thread_local_info.thread_info + * except: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":646 + * cdef bint can_skip = True + * try: + * thread_info = _thread_local_info.thread_info # <<<<<<<<<<<<<< + * except: + * thread_info = get_thread_info(frame_obj) + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 646, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_thread_info); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 646, __pyx_L7_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo))))) __PYX_ERR(0, 646, __pyx_L7_error) + __pyx_v_thread_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":645 + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True + * try: # <<<<<<<<<<<<<< + * thread_info = _thread_local_info.thread_info + * except: + */ + } + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L12_try_end; + __pyx_L7_error:; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":647 + * try: + * thread_info = _thread_local_info.thread_info + * except: # <<<<<<<<<<<<<< + * thread_info = get_thread_info(frame_obj) + * if thread_info is None: + */ + /*except:*/ { + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_bytecode_while_frame_eval_39", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_2, &__pyx_t_8) < 0) __PYX_ERR(0, 647, __pyx_L9_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_8); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":648 + * thread_info = _thread_local_info.thread_info + * except: + * thread_info = get_thread_info(frame_obj) # <<<<<<<<<<<<<< + * if thread_info is None: + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + __pyx_t_9 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_thread_info(__pyx_v_frame_obj)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 648, __pyx_L9_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_XDECREF_SET(__pyx_v_thread_info, ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_9)); + __pyx_t_9 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":649 + * except: + * thread_info = get_thread_info(frame_obj) + * if thread_info is None: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + */ + __pyx_t_1 = (((PyObject *)__pyx_v_thread_info) == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":650 + * thread_info = get_thread_info(frame_obj) + * if thread_info is None: + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) # <<<<<<<<<<<<<< + * + * if thread_info.inside_frame_eval: + */ + __pyx_r = CALL_EvalFrameDefault_39(__pyx_v_tstate, __pyx_v_frame_obj, __pyx_v_exc); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L10_except_return; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":649 + * except: + * thread_info = get_thread_info(frame_obj) + * if thread_info is None: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + */ + } + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L8_exception_handled; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":645 + * cdef int CMD_SMART_STEP_INTO = 128 + * cdef bint can_skip = True + * try: # <<<<<<<<<<<<<< + * thread_info = _thread_local_info.thread_info + * except: + */ + __pyx_L9_except_error:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + goto __pyx_L1_error; + __pyx_L10_except_return:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + goto __pyx_L0; + __pyx_L8_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + __pyx_L12_try_end:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":652 + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + * if thread_info.inside_frame_eval: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + */ + __pyx_t_1 = (__pyx_v_thread_info->inside_frame_eval != 0); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":653 + * + * if thread_info.inside_frame_eval: + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) # <<<<<<<<<<<<<< + * + * if not thread_info.fully_initialized: + */ + __pyx_r = CALL_EvalFrameDefault_39(__pyx_v_tstate, __pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":652 + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + * if thread_info.inside_frame_eval: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":655 + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + * if not thread_info.fully_initialized: # <<<<<<<<<<<<<< + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: + */ + __pyx_t_1 = (!__pyx_v_thread_info->fully_initialized); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":656 + * + * if not thread_info.fully_initialized: + * thread_info.initialize_if_possible() # <<<<<<<<<<<<<< + * if not thread_info.fully_initialized: + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + __pyx_t_8 = ((struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_thread_info->__pyx_vtab)->initialize_if_possible(__pyx_v_thread_info); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 656, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":657 + * if not thread_info.fully_initialized: + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + */ + __pyx_t_1 = (!__pyx_v_thread_info->fully_initialized); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":658 + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) # <<<<<<<<<<<<<< + * + * # Can only get additional_info when fully initialized. + */ + __pyx_r = CALL_EvalFrameDefault_39(__pyx_v_tstate, __pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":657 + * if not thread_info.fully_initialized: + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":655 + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * + * if not thread_info.fully_initialized: # <<<<<<<<<<<<<< + * thread_info.initialize_if_possible() + * if not thread_info.fully_initialized: + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":661 + * + * # Can only get additional_info when fully initialized. + * cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info # <<<<<<<<<<<<<< + * if thread_info.is_pydevd_thread or additional_info.is_tracing: + * # Make sure that we don't trace pydevd threads or inside our own calls. + */ + __pyx_t_8 = ((PyObject *)__pyx_v_thread_info->additional_info); + __Pyx_INCREF(__pyx_t_8); + __pyx_v_additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_8); + __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":662 + * # Can only get additional_info when fully initialized. + * cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info + * if thread_info.is_pydevd_thread or additional_info.is_tracing: # <<<<<<<<<<<<<< + * # Make sure that we don't trace pydevd threads or inside our own calls. + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + if (!__pyx_v_thread_info->is_pydevd_thread) { + } else { + __pyx_t_1 = __pyx_v_thread_info->is_pydevd_thread; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_additional_info->is_tracing != 0); + __pyx_t_1 = __pyx_t_3; + __pyx_L20_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":664 + * if thread_info.is_pydevd_thread or additional_info.is_tracing: + * # Make sure that we don't trace pydevd threads or inside our own calls. + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) # <<<<<<<<<<<<<< + * + * # frame = frame_obj + */ + __pyx_r = CALL_EvalFrameDefault_39(__pyx_v_tstate, __pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":662 + * # Can only get additional_info when fully initialized. + * cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info + * if thread_info.is_pydevd_thread or additional_info.is_tracing: # <<<<<<<<<<<<<< + * # Make sure that we don't trace pydevd threads or inside our own calls. + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":671 + * # print('get_bytecode_while_frame_eval', frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename) + * + * thread_info.inside_frame_eval += 1 # <<<<<<<<<<<<<< + * additional_info.is_tracing = True + * try: + */ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval + 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":672 + * + * thread_info.inside_frame_eval += 1 + * additional_info.is_tracing = True # <<<<<<<<<<<<<< + * try: + * main_debugger: object = GlobalDebuggerHolder.global_dbg + */ + __pyx_v_additional_info->is_tracing = 1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":673 + * thread_info.inside_frame_eval += 1 + * additional_info.is_tracing = True + * try: # <<<<<<<<<<<<<< + * main_debugger: object = GlobalDebuggerHolder.global_dbg + * if main_debugger is None: + */ + /*try:*/ { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":674 + * additional_info.is_tracing = True + * try: + * main_debugger: object = GlobalDebuggerHolder.global_dbg # <<<<<<<<<<<<<< + * if main_debugger is None: + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 674, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_global_dbg); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 674, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_main_debugger = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":675 + * try: + * main_debugger: object = GlobalDebuggerHolder.global_dbg + * if main_debugger is None: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * frame = frame_obj + */ + __pyx_t_1 = (__pyx_v_main_debugger == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":676 + * main_debugger: object = GlobalDebuggerHolder.global_dbg + * if main_debugger is None: + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) # <<<<<<<<<<<<<< + * frame = frame_obj + * + */ + __pyx_r = CALL_EvalFrameDefault_39(__pyx_v_tstate, __pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L22_return; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":675 + * try: + * main_debugger: object = GlobalDebuggerHolder.global_dbg + * if main_debugger is None: # <<<<<<<<<<<<<< + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * frame = frame_obj + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":677 + * if main_debugger is None: + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + * frame = frame_obj # <<<<<<<<<<<<<< + * + * if thread_info.thread_trace_func is None: + */ + __pyx_t_2 = ((PyObject *)__pyx_v_frame_obj); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_frame = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":679 + * frame = frame_obj + * + * if thread_info.thread_trace_func is None: # <<<<<<<<<<<<<< + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: + */ + __pyx_t_1 = (__pyx_v_thread_info->thread_trace_func == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":680 + * + * if thread_info.thread_trace_func is None: + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) # <<<<<<<<<<<<<< + * if apply_to_global: + * thread_info.thread_trace_func = trace_func + */ + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_fix_top_level_trace_and_get_trac); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 680, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = NULL; + __pyx_t_10 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_10 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_v_main_debugger, __pyx_v_frame}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 680, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 680, __pyx_L23_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_8 = PyList_GET_ITEM(sequence, 0); + __pyx_t_7 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(__pyx_t_7); + #else + __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 680, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 680, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_9 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 680, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_11 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_9); + index = 0; __pyx_t_8 = __pyx_t_11(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L27_unpacking_failed; + __Pyx_GOTREF(__pyx_t_8); + index = 1; __pyx_t_7 = __pyx_t_11(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L27_unpacking_failed; + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_9), 2) < 0) __PYX_ERR(0, 680, __pyx_L23_error) + __pyx_t_11 = NULL; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L28_unpacking_done; + __pyx_L27_unpacking_failed:; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_11 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 680, __pyx_L23_error) + __pyx_L28_unpacking_done:; + } + __pyx_v_trace_func = __pyx_t_8; + __pyx_t_8 = 0; + __pyx_v_apply_to_global = __pyx_t_7; + __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":681 + * if thread_info.thread_trace_func is None: + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: # <<<<<<<<<<<<<< + * thread_info.thread_trace_func = trace_func + * + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_apply_to_global); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 681, __pyx_L23_error) + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":682 + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: + * thread_info.thread_trace_func = trace_func # <<<<<<<<<<<<<< + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ + */ + __Pyx_INCREF(__pyx_v_trace_func); + __Pyx_GIVEREF(__pyx_v_trace_func); + __Pyx_GOTREF(__pyx_v_thread_info->thread_trace_func); + __Pyx_DECREF(__pyx_v_thread_info->thread_trace_func); + __pyx_v_thread_info->thread_trace_func = __pyx_v_trace_func; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":681 + * if thread_info.thread_trace_func is None: + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: # <<<<<<<<<<<<<< + * thread_info.thread_trace_func = trace_func + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":679 + * frame = frame_obj + * + * if thread_info.thread_trace_func is None: # <<<<<<<<<<<<<< + * trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + * if apply_to_global: + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":684 + * thread_info.thread_trace_func = trace_func + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ # <<<<<<<<<<<<<< + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ + */ + __pyx_t_12 = __pyx_v_additional_info->pydev_step_cmd; + __pyx_t_13 = (__pyx_t_12 == __pyx_v_CMD_STEP_INTO); + if (!__pyx_t_13) { + } else { + __pyx_t_3 = __pyx_t_13; + goto __pyx_L33_bool_binop_done; + } + __pyx_t_13 = (__pyx_t_12 == __pyx_v_CMD_STEP_INTO_MY_CODE); + if (!__pyx_t_13) { + } else { + __pyx_t_3 = __pyx_t_13; + goto __pyx_L33_bool_binop_done; + } + __pyx_t_13 = (__pyx_t_12 == __pyx_v_CMD_STEP_INTO_COROUTINE); + if (!__pyx_t_13) { + } else { + __pyx_t_3 = __pyx_t_13; + goto __pyx_L33_bool_binop_done; + } + __pyx_t_13 = (__pyx_t_12 == __pyx_v_CMD_SMART_STEP_INTO); + __pyx_t_3 = __pyx_t_13; + __pyx_L33_bool_binop_done:; + __pyx_t_13 = __pyx_t_3; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":685 + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ + * main_debugger.break_on_caught_exceptions or \ # <<<<<<<<<<<<<< + * main_debugger.break_on_user_uncaught_exceptions or \ + * main_debugger.has_plugin_exception_breaks or \ + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_break_on_caught_exceptions); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 685, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 685, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":686 + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ # <<<<<<<<<<<<<< + * main_debugger.has_plugin_exception_breaks or \ + * main_debugger.signature_factory or \ + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_break_on_user_uncaught_exception); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 686, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 686, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":687 + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ + * main_debugger.has_plugin_exception_breaks or \ # <<<<<<<<<<<<<< + * main_debugger.signature_factory or \ + * additional_info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop: + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_has_plugin_exception_breaks); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 687, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 687, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":688 + * main_debugger.break_on_user_uncaught_exceptions or \ + * main_debugger.has_plugin_exception_breaks or \ + * main_debugger.signature_factory or \ # <<<<<<<<<<<<<< + * additional_info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop: + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_signature_factory); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 688, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 688, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_13) { + } else { + __pyx_t_1 = __pyx_t_13; + goto __pyx_L31_bool_binop_done; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":689 + * main_debugger.has_plugin_exception_breaks or \ + * main_debugger.signature_factory or \ + * additional_info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop: # <<<<<<<<<<<<<< + * + * # if DEBUG: + */ + __pyx_t_12 = __pyx_v_additional_info->pydev_step_cmd; + __pyx_t_3 = (__pyx_t_12 == __pyx_v_CMD_STEP_OVER); + if (!__pyx_t_3) { + } else { + __pyx_t_13 = __pyx_t_3; + goto __pyx_L42_bool_binop_done; + } + __pyx_t_3 = (__pyx_t_12 == __pyx_v_CMD_STEP_OVER_MY_CODE); + __pyx_t_13 = __pyx_t_3; + __pyx_L42_bool_binop_done:; + __pyx_t_3 = __pyx_t_13; + if (__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_show_return_values); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 689, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 689, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 689, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = (__pyx_t_2 == __pyx_v_additional_info->pydev_step_stop); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = __pyx_t_3; + __pyx_L31_bool_binop_done:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":684 + * thread_info.thread_trace_func = trace_func + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ # <<<<<<<<<<<<<< + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ + */ + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":693 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval enabled trace') + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + __pyx_t_1 = (__pyx_v_thread_info->thread_trace_func != Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":694 + * # print('get_bytecode_while_frame_eval enabled trace') + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func # <<<<<<<<<<<<<< + * else: + * frame.f_trace = main_debugger.trace_dispatch + */ + __pyx_t_2 = __pyx_v_thread_info->thread_trace_func; + __Pyx_INCREF(__pyx_t_2); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_2) < 0) __PYX_ERR(0, 694, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":693 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval enabled trace') + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + goto __pyx_L45; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":696 + * frame.f_trace = thread_info.thread_trace_func + * else: + * frame.f_trace = main_debugger.trace_dispatch # <<<<<<<<<<<<<< + * else: + * func_code_info: FuncCodeInfo = get_func_code_info(thread_info, frame_obj, frame_obj.f_code) + */ + /*else*/ { + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 696, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __pyx_t_2; + __Pyx_INCREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_7) < 0) __PYX_ERR(0, 696, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_L45:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":684 + * thread_info.thread_trace_func = trace_func + * + * if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ # <<<<<<<<<<<<<< + * main_debugger.break_on_caught_exceptions or \ + * main_debugger.break_on_user_uncaught_exceptions or \ + */ + goto __pyx_L30; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":698 + * frame.f_trace = main_debugger.trace_dispatch + * else: + * func_code_info: FuncCodeInfo = get_func_code_info(thread_info, frame_obj, frame_obj.f_code) # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code) + */ + /*else*/ { + __pyx_t_7 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_func_code_info(__pyx_v_thread_info, __pyx_v_frame_obj, __pyx_v_frame_obj->f_code)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 698, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_v_func_code_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_t_7); + __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":701 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code) + * if not func_code_info.always_skip_code: # <<<<<<<<<<<<<< + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: + */ + __pyx_t_1 = (!__pyx_v_func_code_info->always_skip_code); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":703 + * if not func_code_info.always_skip_code: + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: # <<<<<<<<<<<<<< + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + * + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_has_plugin_line_breaks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 703, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 703, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L48_bool_binop_done; + } + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_has_plugin_exception_breaks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 703, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 703, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_1 = __pyx_t_3; + __pyx_L48_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":704 + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) # <<<<<<<<<<<<<< + * + * if not can_skip: + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_plugin); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 704, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_can_skip); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 704, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_10 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_10 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_main_debugger, ((PyObject *)__pyx_v_frame_obj)}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 704, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 704, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_can_skip = __pyx_t_1; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":706 + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + * + * if not can_skip: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval not can_skip') + */ + __pyx_t_1 = (!__pyx_v_can_skip); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":709 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval not can_skip') + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + __pyx_t_1 = (__pyx_v_thread_info->thread_trace_func != Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":710 + * # print('get_bytecode_while_frame_eval not can_skip') + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func # <<<<<<<<<<<<<< + * else: + * frame.f_trace = main_debugger.trace_dispatch + */ + __pyx_t_7 = __pyx_v_thread_info->thread_trace_func; + __Pyx_INCREF(__pyx_t_7); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_7) < 0) __PYX_ERR(0, 710, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":709 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval not can_skip') + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + goto __pyx_L51; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":712 + * frame.f_trace = thread_info.thread_trace_func + * else: + * frame.f_trace = main_debugger.trace_dispatch # <<<<<<<<<<<<<< + * + * if can_skip and func_code_info.breakpoint_found: + */ + /*else*/ { + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 712, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __pyx_t_7; + __Pyx_INCREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_8) < 0) __PYX_ERR(0, 712, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_L51:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":706 + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + * + * if not can_skip: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval not can_skip') + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":703 + * if not func_code_info.always_skip_code: + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: # <<<<<<<<<<<<<< + * can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + * + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":714 + * frame.f_trace = main_debugger.trace_dispatch + * + * if can_skip and func_code_info.breakpoint_found: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + */ + if (__pyx_v_can_skip) { + } else { + __pyx_t_1 = __pyx_v_can_skip; + goto __pyx_L53_bool_binop_done; + } + __pyx_t_1 = __pyx_v_func_code_info->breakpoint_found; + __pyx_L53_bool_binop_done:; + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":717 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + * if not thread_info.force_stay_in_untraced_mode: # <<<<<<<<<<<<<< + * # If breakpoints are found but new_code is None, + * # this means we weren't able to actually add the code + */ + __pyx_t_1 = (!__pyx_v_thread_info->force_stay_in_untraced_mode); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":721 + * # this means we weren't able to actually add the code + * # where needed, so, fallback to tracing. + * if func_code_info.new_code is None: # <<<<<<<<<<<<<< + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func + */ + __pyx_t_1 = (__pyx_v_func_code_info->new_code == Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":722 + * # where needed, so, fallback to tracing. + * if func_code_info.new_code is None: + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + __pyx_t_1 = (__pyx_v_thread_info->thread_trace_func != Py_None); + if (__pyx_t_1) { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":723 + * if func_code_info.new_code is None: + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func # <<<<<<<<<<<<<< + * else: + * frame.f_trace = main_debugger.trace_dispatch + */ + __pyx_t_8 = __pyx_v_thread_info->thread_trace_func; + __Pyx_INCREF(__pyx_t_8); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_8) < 0) __PYX_ERR(0, 723, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":722 + * # where needed, so, fallback to tracing. + * if func_code_info.new_code is None: + * if thread_info.thread_trace_func is not None: # <<<<<<<<<<<<<< + * frame.f_trace = thread_info.thread_trace_func + * else: + */ + goto __pyx_L57; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":725 + * frame.f_trace = thread_info.thread_trace_func + * else: + * frame.f_trace = main_debugger.trace_dispatch # <<<<<<<<<<<<<< + * else: + * # print('Using frame eval break for', frame_obj.f_code.co_name) + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 725, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __pyx_t_8; + __Pyx_INCREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_7) < 0) __PYX_ERR(0, 725, __pyx_L23_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_L57:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":721 + * # this means we weren't able to actually add the code + * # where needed, so, fallback to tracing. + * if func_code_info.new_code is None: # <<<<<<<<<<<<<< + * if thread_info.thread_trace_func is not None: + * frame.f_trace = thread_info.thread_trace_func + */ + goto __pyx_L56; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":728 + * else: + * # print('Using frame eval break for', frame_obj.f_code.co_name) + * update_globals_dict( frame_obj.f_globals) # <<<<<<<<<<<<<< + * Py_INCREF(func_code_info.new_code) + * old = frame_obj.f_code + */ + /*else*/ { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_update_globals_dict); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 728, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_2 = NULL; + __pyx_t_10 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_10 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, ((PyObject *)__pyx_v_frame_obj->f_globals)}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 728, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":729 + * # print('Using frame eval break for', frame_obj.f_code.co_name) + * update_globals_dict( frame_obj.f_globals) + * Py_INCREF(func_code_info.new_code) # <<<<<<<<<<<<<< + * old = frame_obj.f_code + * frame_obj.f_code = func_code_info.new_code + */ + __pyx_t_7 = __pyx_v_func_code_info->new_code; + __Pyx_INCREF(__pyx_t_7); + Py_INCREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":730 + * update_globals_dict( frame_obj.f_globals) + * Py_INCREF(func_code_info.new_code) + * old = frame_obj.f_code # <<<<<<<<<<<<<< + * frame_obj.f_code = func_code_info.new_code + * Py_DECREF(old) + */ + __pyx_t_7 = ((PyObject *)__pyx_v_frame_obj->f_code); + __Pyx_INCREF(__pyx_t_7); + __pyx_v_old = __pyx_t_7; + __pyx_t_7 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":731 + * Py_INCREF(func_code_info.new_code) + * old = frame_obj.f_code + * frame_obj.f_code = func_code_info.new_code # <<<<<<<<<<<<<< + * Py_DECREF(old) + * else: + */ + __pyx_v_frame_obj->f_code = ((PyCodeObject *)__pyx_v_func_code_info->new_code); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":732 + * old = frame_obj.f_code + * frame_obj.f_code = func_code_info.new_code + * Py_DECREF(old) # <<<<<<<<<<<<<< + * else: + * # When we're forcing to stay in traced mode we need to + */ + Py_DECREF(__pyx_v_old); + } + __pyx_L56:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":717 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + * if not thread_info.force_stay_in_untraced_mode: # <<<<<<<<<<<<<< + * # If breakpoints are found but new_code is None, + * # this means we weren't able to actually add the code + */ + goto __pyx_L55; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":737 + * # update the globals dict (because this means that we're reusing + * # a previous code which had breakpoints added in a new frame). + * update_globals_dict( frame_obj.f_globals) # <<<<<<<<<<<<<< + * + * finally: + */ + /*else*/ { + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_update_globals_dict); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 737, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_2 = NULL; + __pyx_t_10 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + __pyx_t_10 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, ((PyObject *)__pyx_v_frame_obj->f_globals)}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 737, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __pyx_L55:; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":714 + * frame.f_trace = main_debugger.trace_dispatch + * + * if can_skip and func_code_info.breakpoint_found: # <<<<<<<<<<<<<< + * # if DEBUG: + * # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + */ + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":701 + * # if DEBUG: + * # print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code) + * if not func_code_info.always_skip_code: # <<<<<<<<<<<<<< + * + * if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: + */ + } + } + __pyx_L30:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":740 + * + * finally: + * thread_info.inside_frame_eval -= 1 # <<<<<<<<<<<<<< + * additional_info.is_tracing = False + * + */ + /*finally:*/ { + /*normal exit:*/{ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":741 + * finally: + * thread_info.inside_frame_eval -= 1 + * additional_info.is_tracing = False # <<<<<<<<<<<<<< + * + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + __pyx_v_additional_info->is_tracing = 0; + goto __pyx_L24; + } + __pyx_L23_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_6 = 0; __pyx_t_5 = 0; __pyx_t_4 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_4) < 0)) __Pyx_ErrFetch(&__pyx_t_6, &__pyx_t_5, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_16); + __Pyx_XGOTREF(__pyx_t_17); + __Pyx_XGOTREF(__pyx_t_18); + __pyx_t_12 = __pyx_lineno; __pyx_t_14 = __pyx_clineno; __pyx_t_15 = __pyx_filename; + { + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":740 + * + * finally: + * thread_info.inside_frame_eval -= 1 # <<<<<<<<<<<<<< + * additional_info.is_tracing = False + * + */ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":741 + * finally: + * thread_info.inside_frame_eval -= 1 + * additional_info.is_tracing = False # <<<<<<<<<<<<<< + * + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + __pyx_v_additional_info->is_tracing = 0; + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_XGIVEREF(__pyx_t_17); + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_ExceptionReset(__pyx_t_16, __pyx_t_17, __pyx_t_18); + } + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ErrRestore(__pyx_t_6, __pyx_t_5, __pyx_t_4); + __pyx_t_6 = 0; __pyx_t_5 = 0; __pyx_t_4 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; + __pyx_lineno = __pyx_t_12; __pyx_clineno = __pyx_t_14; __pyx_filename = __pyx_t_15; + goto __pyx_L1_error; + } + __pyx_L22_return: { + __pyx_t_19 = __pyx_r; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":740 + * + * finally: + * thread_info.inside_frame_eval -= 1 # <<<<<<<<<<<<<< + * additional_info.is_tracing = False + * + */ + __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":741 + * finally: + * thread_info.inside_frame_eval -= 1 + * additional_info.is_tracing = False # <<<<<<<<<<<<<< + * + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) + */ + __pyx_v_additional_info->is_tracing = 0; + __pyx_r = __pyx_t_19; + goto __pyx_L0; + } + __pyx_L24:; + } + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":743 + * additional_info.is_tracing = False + * + * return CALL_EvalFrameDefault_39(tstate, frame_obj, exc) # <<<<<<<<<<<<<< + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * ### WARNING: GENERATED CODE, DO NOT EDIT! + */ + __pyx_r = CALL_EvalFrameDefault_39(__pyx_v_tstate, __pyx_v_frame_obj, __pyx_v_exc); + goto __pyx_L0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":623 + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * ### WARNING: GENERATED CODE, DO NOT EDIT! + * cdef PyObject * get_bytecode_while_frame_eval_39(PyThreadState* tstate, PyFrameObject * frame_obj, int exc): # <<<<<<<<<<<<<< + * ''' + * This function makes the actual evaluation and changes the bytecode to a version + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_bytecode_while_frame_eval_39", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_thread_info); + __Pyx_XDECREF((PyObject *)__pyx_v_additional_info); + __Pyx_XDECREF(__pyx_v_main_debugger); + __Pyx_XDECREF(__pyx_v_frame); + __Pyx_XDECREF(__pyx_v_trace_func); + __Pyx_XDECREF(__pyx_v_apply_to_global); + __Pyx_XDECREF((PyObject *)__pyx_v_func_code_info); + __Pyx_XDECREF(__pyx_v_old); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_ThreadInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_21__pyx_unpickle_ThreadInfo(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_21__pyx_unpickle_ThreadInfo = {"__pyx_unpickle_ThreadInfo", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_21__pyx_unpickle_ThreadInfo, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_21__pyx_unpickle_ThreadInfo(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_ThreadInfo (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ThreadInfo", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ThreadInfo", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_ThreadInfo") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ThreadInfo", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle_ThreadInfo", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_20__pyx_unpickle_ThreadInfo(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_20__pyx_unpickle_ThreadInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_ThreadInfo", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xe535b68, 0xb8148ba, 0x0af4089): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__6, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0xe535b68, 0xb8148ba, 0x0af4089): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))" % __pyx_checksum + * __pyx_result = ThreadInfo.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0xe535b68, 0xb8148ba, 0x0af4089): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = ThreadInfo.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xe535b68, 0xb8148ba, 0x0af4089): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))" % __pyx_checksum + * __pyx_result = ThreadInfo.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_ThreadInfo__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))" % __pyx_checksum + * __pyx_result = ThreadInfo.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = ThreadInfo.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_ThreadInfo__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_ThreadInfo__set_state(ThreadInfo __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_ThreadInfo__set_state(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))" % __pyx_checksum + * __pyx_result = ThreadInfo.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_ThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_ThreadInfo__set_state(ThreadInfo __pyx_result, tuple __pyx_state): + * __pyx_result._can_create_dummy_thread = __pyx_state[0]; __pyx_result.additional_info = __pyx_state[1]; __pyx_result.force_stay_in_untraced_mode = __pyx_state[2]; __pyx_result.fully_initialized = __pyx_state[3]; __pyx_result.inside_frame_eval = __pyx_state[4]; __pyx_result.is_pydevd_thread = __pyx_state[5]; __pyx_result.thread_trace_func = __pyx_state[6] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_ThreadInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle_ThreadInfo", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_ThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_ThreadInfo__set_state(ThreadInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._can_create_dummy_thread = __pyx_state[0]; __pyx_result.additional_info = __pyx_state[1]; __pyx_result.force_stay_in_untraced_mode = __pyx_state[2]; __pyx_result.fully_initialized = __pyx_state[3]; __pyx_result.inside_frame_eval = __pyx_state[4]; __pyx_result.is_pydevd_thread = __pyx_state[5]; __pyx_result.thread_trace_func = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_ThreadInfo__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_ThreadInfo__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_ThreadInfo__set_state(ThreadInfo __pyx_result, tuple __pyx_state): + * __pyx_result._can_create_dummy_thread = __pyx_state[0]; __pyx_result.additional_info = __pyx_state[1]; __pyx_result.force_stay_in_untraced_mode = __pyx_state[2]; __pyx_result.fully_initialized = __pyx_state[3]; __pyx_result.inside_frame_eval = __pyx_state[4]; __pyx_result.is_pydevd_thread = __pyx_state[5]; __pyx_result.thread_trace_func = __pyx_state[6] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->_can_create_dummy_thread = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF((PyObject *)__pyx_v___pyx_result->additional_info); + __Pyx_DECREF((PyObject *)__pyx_v___pyx_result->additional_info); + __pyx_v___pyx_result->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->force_stay_in_untraced_mode = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->fully_initialized = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->inside_frame_eval = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->is_pydevd_thread = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->thread_trace_func); + __Pyx_DECREF(__pyx_v___pyx_result->thread_trace_func); + __pyx_v___pyx_result->thread_trace_func = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_ThreadInfo__set_state(ThreadInfo __pyx_result, tuple __pyx_state): + * __pyx_result._can_create_dummy_thread = __pyx_state[0]; __pyx_result.additional_info = __pyx_state[1]; __pyx_result.force_stay_in_untraced_mode = __pyx_state[2]; __pyx_result.fully_initialized = __pyx_state[3]; __pyx_result.inside_frame_eval = __pyx_state[4]; __pyx_result.is_pydevd_thread = __pyx_state[5]; __pyx_result.thread_trace_func = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 > 7); + if (__pyx_t_5) { + } else { + __pyx_t_2 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result._can_create_dummy_thread = __pyx_state[0]; __pyx_result.additional_info = __pyx_state[1]; __pyx_result.force_stay_in_untraced_mode = __pyx_state[2]; __pyx_result.fully_initialized = __pyx_state[3]; __pyx_result.inside_frame_eval = __pyx_state[4]; __pyx_result.is_pydevd_thread = __pyx_state[5]; __pyx_result.thread_trace_func = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[7]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_ThreadInfo__set_state(ThreadInfo __pyx_result, tuple __pyx_state): + * __pyx_result._can_create_dummy_thread = __pyx_state[0]; __pyx_result.additional_info = __pyx_state[1]; __pyx_result.force_stay_in_untraced_mode = __pyx_state[2]; __pyx_result.fully_initialized = __pyx_state[3]; __pyx_result.inside_frame_eval = __pyx_state[4]; __pyx_result.is_pydevd_thread = __pyx_state[5]; __pyx_result.thread_trace_func = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_ThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_ThreadInfo__set_state(ThreadInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._can_create_dummy_thread = __pyx_state[0]; __pyx_result.additional_info = __pyx_state[1]; __pyx_result.force_stay_in_untraced_mode = __pyx_state[2]; __pyx_result.fully_initialized = __pyx_state[3]; __pyx_result.inside_frame_eval = __pyx_state[4]; __pyx_result.is_pydevd_thread = __pyx_state[5]; __pyx_result.thread_trace_func = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle_ThreadInfo__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_FuncCodeInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_23__pyx_unpickle_FuncCodeInfo(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_23__pyx_unpickle_FuncCodeInfo = {"__pyx_unpickle_FuncCodeInfo", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_23__pyx_unpickle_FuncCodeInfo, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_23__pyx_unpickle_FuncCodeInfo(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_FuncCodeInfo (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FuncCodeInfo", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FuncCodeInfo", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_FuncCodeInfo") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FuncCodeInfo", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle_FuncCodeInfo", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_22__pyx_unpickle_FuncCodeInfo(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_22__pyx_unpickle_FuncCodeInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_FuncCodeInfo", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x450d2d6, 0x956dcaa, 0xb3ee05d): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x450d2d6, 0x956dcaa, 0xb3ee05d) = (always_skip_code, breakpoint_found, breakpoints_mtime, canonical_normalized_filename, co_filename, co_name, new_code))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__7, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x450d2d6, 0x956dcaa, 0xb3ee05d): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x450d2d6, 0x956dcaa, 0xb3ee05d) = (always_skip_code, breakpoint_found, breakpoints_mtime, canonical_normalized_filename, co_filename, co_name, new_code))" % __pyx_checksum + * __pyx_result = FuncCodeInfo.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x450d2d6, 0x956dcaa, 0xb3ee05d): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x450d2d6, 0x956dcaa, 0xb3ee05d) = (always_skip_code, breakpoint_found, breakpoints_mtime, canonical_normalized_filename, co_filename, co_name, new_code))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = FuncCodeInfo.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x450d2d6, 0x956dcaa, 0xb3ee05d): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x450d2d6, 0x956dcaa, 0xb3ee05d) = (always_skip_code, breakpoint_found, breakpoints_mtime, canonical_normalized_filename, co_filename, co_name, new_code))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x450d2d6, 0x956dcaa, 0xb3ee05d) = (always_skip_code, breakpoint_found, breakpoints_mtime, canonical_normalized_filename, co_filename, co_name, new_code))" % __pyx_checksum + * __pyx_result = FuncCodeInfo.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_FuncCodeInfo__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x450d2d6, 0x956dcaa, 0xb3ee05d) = (always_skip_code, breakpoint_found, breakpoints_mtime, canonical_normalized_filename, co_filename, co_name, new_code))" % __pyx_checksum + * __pyx_result = FuncCodeInfo.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_FuncCodeInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = FuncCodeInfo.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_FuncCodeInfo__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_FuncCodeInfo__set_state(FuncCodeInfo __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_FuncCodeInfo__set_state(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x450d2d6, 0x956dcaa, 0xb3ee05d) = (always_skip_code, breakpoint_found, breakpoints_mtime, canonical_normalized_filename, co_filename, co_name, new_code))" % __pyx_checksum + * __pyx_result = FuncCodeInfo.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_FuncCodeInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_FuncCodeInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_FuncCodeInfo__set_state(FuncCodeInfo __pyx_result, tuple __pyx_state): + * __pyx_result.always_skip_code = __pyx_state[0]; __pyx_result.breakpoint_found = __pyx_state[1]; __pyx_result.breakpoints_mtime = __pyx_state[2]; __pyx_result.canonical_normalized_filename = __pyx_state[3]; __pyx_result.co_filename = __pyx_state[4]; __pyx_result.co_name = __pyx_state[5]; __pyx_result.new_code = __pyx_state[6] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_FuncCodeInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle_FuncCodeInfo", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_FuncCodeInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_FuncCodeInfo__set_state(FuncCodeInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.always_skip_code = __pyx_state[0]; __pyx_result.breakpoint_found = __pyx_state[1]; __pyx_result.breakpoints_mtime = __pyx_state[2]; __pyx_result.canonical_normalized_filename = __pyx_state[3]; __pyx_result.co_filename = __pyx_state[4]; __pyx_result.co_name = __pyx_state[5]; __pyx_result.new_code = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_FuncCodeInfo__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_FuncCodeInfo__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_FuncCodeInfo__set_state(FuncCodeInfo __pyx_result, tuple __pyx_state): + * __pyx_result.always_skip_code = __pyx_state[0]; __pyx_result.breakpoint_found = __pyx_state[1]; __pyx_result.breakpoints_mtime = __pyx_state[2]; __pyx_result.canonical_normalized_filename = __pyx_state[3]; __pyx_result.co_filename = __pyx_state[4]; __pyx_result.co_name = __pyx_state[5]; __pyx_result.new_code = __pyx_state[6] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->always_skip_code = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->breakpoint_found = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->breakpoints_mtime = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->canonical_normalized_filename); + __Pyx_DECREF(__pyx_v___pyx_result->canonical_normalized_filename); + __pyx_v___pyx_result->canonical_normalized_filename = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->co_filename); + __Pyx_DECREF(__pyx_v___pyx_result->co_filename); + __pyx_v___pyx_result->co_filename = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->co_name); + __Pyx_DECREF(__pyx_v___pyx_result->co_name); + __pyx_v___pyx_result->co_name = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->new_code); + __Pyx_DECREF(__pyx_v___pyx_result->new_code); + __pyx_v___pyx_result->new_code = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_FuncCodeInfo__set_state(FuncCodeInfo __pyx_result, tuple __pyx_state): + * __pyx_result.always_skip_code = __pyx_state[0]; __pyx_result.breakpoint_found = __pyx_state[1]; __pyx_result.breakpoints_mtime = __pyx_state[2]; __pyx_result.canonical_normalized_filename = __pyx_state[3]; __pyx_result.co_filename = __pyx_state[4]; __pyx_result.co_name = __pyx_state[5]; __pyx_result.new_code = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 > 7); + if (__pyx_t_5) { + } else { + __pyx_t_2 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.always_skip_code = __pyx_state[0]; __pyx_result.breakpoint_found = __pyx_state[1]; __pyx_result.breakpoints_mtime = __pyx_state[2]; __pyx_result.canonical_normalized_filename = __pyx_state[3]; __pyx_result.co_filename = __pyx_state[4]; __pyx_result.co_name = __pyx_state[5]; __pyx_result.new_code = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[7]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_FuncCodeInfo__set_state(FuncCodeInfo __pyx_result, tuple __pyx_state): + * __pyx_result.always_skip_code = __pyx_state[0]; __pyx_result.breakpoint_found = __pyx_state[1]; __pyx_result.breakpoints_mtime = __pyx_state[2]; __pyx_result.canonical_normalized_filename = __pyx_state[3]; __pyx_result.co_filename = __pyx_state[4]; __pyx_result.co_name = __pyx_state[5]; __pyx_result.new_code = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_FuncCodeInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_FuncCodeInfo__set_state(FuncCodeInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.always_skip_code = __pyx_state[0]; __pyx_result.breakpoint_found = __pyx_state[1]; __pyx_result.breakpoints_mtime = __pyx_state[2]; __pyx_result.canonical_normalized_filename = __pyx_state[3]; __pyx_result.co_filename = __pyx_state[4]; __pyx_result.co_name = __pyx_state[5]; __pyx_result.new_code = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle_FuncCodeInfo__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle__CodeLineInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_25__pyx_unpickle__CodeLineInfo(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_25__pyx_unpickle__CodeLineInfo = {"__pyx_unpickle__CodeLineInfo", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_25__pyx_unpickle__CodeLineInfo, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_25__pyx_unpickle__CodeLineInfo(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle__CodeLineInfo (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__CodeLineInfo", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__CodeLineInfo", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle__CodeLineInfo") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__CodeLineInfo", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle__CodeLineInfo", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_24__pyx_unpickle__CodeLineInfo(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_24__pyx_unpickle__CodeLineInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle__CodeLineInfo", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x5a9bcd5, 0x0267473, 0x3fbbd02): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x5a9bcd5, 0x0267473, 0x3fbbd02) = (first_line, last_line, line_to_offset))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__8, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x5a9bcd5, 0x0267473, 0x3fbbd02): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x5a9bcd5, 0x0267473, 0x3fbbd02) = (first_line, last_line, line_to_offset))" % __pyx_checksum + * __pyx_result = _CodeLineInfo.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x5a9bcd5, 0x0267473, 0x3fbbd02): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x5a9bcd5, 0x0267473, 0x3fbbd02) = (first_line, last_line, line_to_offset))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = _CodeLineInfo.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x5a9bcd5, 0x0267473, 0x3fbbd02): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x5a9bcd5, 0x0267473, 0x3fbbd02) = (first_line, last_line, line_to_offset))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x5a9bcd5, 0x0267473, 0x3fbbd02) = (first_line, last_line, line_to_offset))" % __pyx_checksum + * __pyx_result = _CodeLineInfo.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle__CodeLineInfo__set_state(<_CodeLineInfo> __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x5a9bcd5, 0x0267473, 0x3fbbd02) = (first_line, last_line, line_to_offset))" % __pyx_checksum + * __pyx_result = _CodeLineInfo.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle__CodeLineInfo__set_state(<_CodeLineInfo> __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = _CodeLineInfo.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle__CodeLineInfo__set_state(<_CodeLineInfo> __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle__CodeLineInfo__set_state(_CodeLineInfo __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle__CodeLineInfo__set_state(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x5a9bcd5, 0x0267473, 0x3fbbd02) = (first_line, last_line, line_to_offset))" % __pyx_checksum + * __pyx_result = _CodeLineInfo.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle__CodeLineInfo__set_state(<_CodeLineInfo> __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle__CodeLineInfo__set_state(<_CodeLineInfo> __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle__CodeLineInfo__set_state(_CodeLineInfo __pyx_result, tuple __pyx_state): + * __pyx_result.first_line = __pyx_state[0]; __pyx_result.last_line = __pyx_state[1]; __pyx_result.line_to_offset = __pyx_state[2] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle__CodeLineInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle__CodeLineInfo", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle__CodeLineInfo__set_state(<_CodeLineInfo> __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle__CodeLineInfo__set_state(_CodeLineInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.first_line = __pyx_state[0]; __pyx_result.last_line = __pyx_state[1]; __pyx_result.line_to_offset = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle__CodeLineInfo__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + unsigned int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle__CodeLineInfo__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle__CodeLineInfo__set_state(_CodeLineInfo __pyx_result, tuple __pyx_state): + * __pyx_result.first_line = __pyx_state[0]; __pyx_result.last_line = __pyx_state[1]; __pyx_result.line_to_offset = __pyx_state[2] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[3]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->first_line = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->last_line = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyDict_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->line_to_offset); + __Pyx_DECREF(__pyx_v___pyx_result->line_to_offset); + __pyx_v___pyx_result->line_to_offset = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle__CodeLineInfo__set_state(_CodeLineInfo __pyx_result, tuple __pyx_state): + * __pyx_result.first_line = __pyx_state[0]; __pyx_result.last_line = __pyx_state[1]; __pyx_result.line_to_offset = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[3]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 > 3); + if (__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_3 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_3) { + + /* "(tree fragment)":14 + * __pyx_result.first_line = __pyx_state[0]; __pyx_result.last_line = __pyx_state[1]; __pyx_result.line_to_offset = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[3]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + __pyx_t_9 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_9 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle__CodeLineInfo__set_state(_CodeLineInfo __pyx_result, tuple __pyx_state): + * __pyx_result.first_line = __pyx_state[0]; __pyx_result.last_line = __pyx_state[1]; __pyx_result.line_to_offset = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[3]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle__CodeLineInfo__set_state(<_CodeLineInfo> __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle__CodeLineInfo__set_state(_CodeLineInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.first_line = __pyx_state[0]; __pyx_result.last_line = __pyx_state[1]; __pyx_result.line_to_offset = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle__CodeLineInfo__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle__CacheValue(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_27__pyx_unpickle__CacheValue(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_27__pyx_unpickle__CacheValue = {"__pyx_unpickle__CacheValue", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_27__pyx_unpickle__CacheValue, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_27__pyx_unpickle__CacheValue(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle__CacheValue (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__CacheValue", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__CacheValue", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle__CacheValue") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__CacheValue", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle__CacheValue", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_26__pyx_unpickle__CacheValue(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_26__pyx_unpickle__CacheValue(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + unsigned int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle__CacheValue", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xac42a46, 0xedff7c3, 0x3d481b9): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xac42a46, 0xedff7c3, 0x3d481b9) = (breakpoints_hit_at_lines, code_line_info, code_lines_as_set, code_obj_py))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__9, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0xac42a46, 0xedff7c3, 0x3d481b9): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xac42a46, 0xedff7c3, 0x3d481b9) = (breakpoints_hit_at_lines, code_line_info, code_lines_as_set, code_obj_py))" % __pyx_checksum + * __pyx_result = _CacheValue.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0xac42a46, 0xedff7c3, 0x3d481b9): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xac42a46, 0xedff7c3, 0x3d481b9) = (breakpoints_hit_at_lines, code_line_info, code_lines_as_set, code_obj_py))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = _CacheValue.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xac42a46, 0xedff7c3, 0x3d481b9): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xac42a46, 0xedff7c3, 0x3d481b9) = (breakpoints_hit_at_lines, code_line_info, code_lines_as_set, code_obj_py))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xac42a46, 0xedff7c3, 0x3d481b9) = (breakpoints_hit_at_lines, code_line_info, code_lines_as_set, code_obj_py))" % __pyx_checksum + * __pyx_result = _CacheValue.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle__CacheValue__set_state(<_CacheValue> __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xac42a46, 0xedff7c3, 0x3d481b9) = (breakpoints_hit_at_lines, code_line_info, code_lines_as_set, code_obj_py))" % __pyx_checksum + * __pyx_result = _CacheValue.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle__CacheValue__set_state(<_CacheValue> __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = _CacheValue.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle__CacheValue__set_state(<_CacheValue> __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle__CacheValue__set_state(_CacheValue __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle__CacheValue__set_state(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xac42a46, 0xedff7c3, 0x3d481b9) = (breakpoints_hit_at_lines, code_line_info, code_lines_as_set, code_obj_py))" % __pyx_checksum + * __pyx_result = _CacheValue.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle__CacheValue__set_state(<_CacheValue> __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle__CacheValue__set_state(<_CacheValue> __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle__CacheValue__set_state(_CacheValue __pyx_result, tuple __pyx_state): + * __pyx_result.breakpoints_hit_at_lines = __pyx_state[0]; __pyx_result.code_line_info = __pyx_state[1]; __pyx_result.code_lines_as_set = __pyx_state[2]; __pyx_result.code_obj_py = __pyx_state[3] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle__CacheValue(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle__CacheValue", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle__CacheValue__set_state(<_CacheValue> __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle__CacheValue__set_state(_CacheValue __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.breakpoints_hit_at_lines = __pyx_state[0]; __pyx_result.code_line_info = __pyx_state[1]; __pyx_result.code_lines_as_set = __pyx_state[2]; __pyx_result.code_obj_py = __pyx_state[3] + * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle__CacheValue__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + unsigned int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle__CacheValue__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle__CacheValue__set_state(_CacheValue __pyx_result, tuple __pyx_state): + * __pyx_result.breakpoints_hit_at_lines = __pyx_state[0]; __pyx_result.code_line_info = __pyx_state[1]; __pyx_result.code_lines_as_set = __pyx_state[2]; __pyx_result.code_obj_py = __pyx_state[3] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[4]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PySet_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("set", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->breakpoints_hit_at_lines); + __Pyx_DECREF(__pyx_v___pyx_result->breakpoints_hit_at_lines); + __pyx_v___pyx_result->breakpoints_hit_at_lines = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo))))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF((PyObject *)__pyx_v___pyx_result->code_line_info); + __Pyx_DECREF((PyObject *)__pyx_v___pyx_result->code_line_info); + __pyx_v___pyx_result->code_line_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PySet_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("set", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->code_lines_as_set); + __Pyx_DECREF(__pyx_v___pyx_result->code_lines_as_set); + __pyx_v___pyx_result->code_lines_as_set = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->code_obj_py); + __Pyx_DECREF(__pyx_v___pyx_result->code_obj_py); + __pyx_v___pyx_result->code_obj_py = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle__CacheValue__set_state(_CacheValue __pyx_result, tuple __pyx_state): + * __pyx_result.breakpoints_hit_at_lines = __pyx_state[0]; __pyx_result.code_line_info = __pyx_state[1]; __pyx_result.code_lines_as_set = __pyx_state[2]; __pyx_result.code_obj_py = __pyx_state[3] + * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[4]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 4); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.breakpoints_hit_at_lines = __pyx_state[0]; __pyx_result.code_line_info = __pyx_state[1]; __pyx_result.code_lines_as_set = __pyx_state[2]; __pyx_result.code_obj_py = __pyx_state[3] + * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[4]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle__CacheValue__set_state(_CacheValue __pyx_result, tuple __pyx_state): + * __pyx_result.breakpoints_hit_at_lines = __pyx_state[0]; __pyx_result.code_line_info = __pyx_state[1]; __pyx_result.code_lines_as_set = __pyx_state[2]; __pyx_result.code_obj_py = __pyx_state[3] + * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[4]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle__CacheValue__set_state(<_CacheValue> __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle__CacheValue__set_state(_CacheValue __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.breakpoints_hit_at_lines = __pyx_state[0]; __pyx_result.code_line_info = __pyx_state[1]; __pyx_result.code_lines_as_set = __pyx_state[2]; __pyx_result.code_obj_py = __pyx_state[3] + * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.__pyx_unpickle__CacheValue__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo __pyx_vtable_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo; + +static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)o); + p->__pyx_vtab = __pyx_vtabptr_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo; + p->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)Py_None); Py_INCREF(Py_None); + p->thread_trace_func = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo(PyObject *o) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->additional_info); + Py_CLEAR(p->thread_trace_func); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)o; + if (p->additional_info) { + e = (*v)(((PyObject *)p->additional_info), a); if (e) return e; + } + if (p->thread_trace_func) { + e = (*v)(p->thread_trace_func, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)o; + tmp = ((PyObject*)p->additional_info); + p->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->thread_trace_func); + p->thread_trace_func = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_additional_info(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_additional_info(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_is_pydevd_thread(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_is_pydevd_thread(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_inside_frame_eval(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_inside_frame_eval(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_fully_initialized(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_fully_initialized(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_thread_trace_func(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_thread_trace_func(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_force_stay_in_untraced_mode(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_force_stay_in_untraced_mode(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_27force_stay_in_untraced_mode_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyMethodDef __pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo[] = { + {(char *)"additional_info", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_additional_info, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_additional_info, (char *)0, 0}, + {(char *)"is_pydevd_thread", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_is_pydevd_thread, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_is_pydevd_thread, (char *)0, 0}, + {(char *)"inside_frame_eval", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_inside_frame_eval, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_inside_frame_eval, (char *)0, 0}, + {(char *)"fully_initialized", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_fully_initialized, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_fully_initialized, (char *)0, 0}, + {(char *)"thread_trace_func", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_thread_trace_func, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_thread_trace_func, (char *)0, 0}, + {(char *)"force_stay_in_untraced_mode", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_force_stay_in_untraced_mode, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_force_stay_in_untraced_mode, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo}, + {Py_tp_clear, (void *)__pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo}, + {Py_tp_methods, (void *)__pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo}, + {Py_tp_getset, (void *)__pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo}, + {Py_tp_new, (void *)__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo}, + {0, 0}, +}; +static PyType_Spec __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo_spec = { + "_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo", + sizeof(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo_slots, +}; +#else + +static PyTypeObject __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_frame_eval.pydevd_frame_evaluator.""ThreadInfo", /*tp_name*/ + sizeof(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, /*tp_traverse*/ + __pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)o); + p->co_filename = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->co_name = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->canonical_normalized_filename = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->new_code = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo(PyObject *o) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->co_filename); + Py_CLEAR(p->co_name); + Py_CLEAR(p->canonical_normalized_filename); + Py_CLEAR(p->new_code); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)o; + if (p->new_code) { + e = (*v)(p->new_code, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)o; + tmp = ((PyObject*)p->new_code); + p->new_code = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_co_filename(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_co_filename(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_co_name(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_co_name(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_7co_name_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_canonical_normalized_filename(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_canonical_normalized_filename(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_29canonical_normalized_filename_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_breakpoint_found(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_breakpoint_found(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_new_code(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_new_code(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_breakpoints_mtime(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_breakpoints_mtime(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyMethodDef __pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo[] = { + {(char *)"co_filename", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_co_filename, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_co_filename, (char *)0, 0}, + {(char *)"co_name", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_co_name, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_co_name, (char *)0, 0}, + {(char *)"canonical_normalized_filename", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_canonical_normalized_filename, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_canonical_normalized_filename, (char *)0, 0}, + {(char *)"breakpoint_found", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_breakpoint_found, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_breakpoint_found, (char *)0, 0}, + {(char *)"new_code", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_new_code, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_new_code, (char *)0, 0}, + {(char *)"breakpoints_mtime", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_breakpoints_mtime, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_breakpoints_mtime, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo}, + {Py_tp_clear, (void *)__pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo}, + {Py_tp_methods, (void *)__pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo}, + {Py_tp_getset, (void *)__pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo}, + {Py_tp_init, (void *)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo}, + {0, 0}, +}; +static PyType_Spec __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo_spec = { + "_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo", + sizeof(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo_slots, +}; +#else + +static PyTypeObject __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_frame_eval.pydevd_frame_evaluator.""FuncCodeInfo", /*tp_name*/ + sizeof(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo, /*tp_traverse*/ + __pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)o); + p->line_to_offset = ((PyObject*)Py_None); Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo(PyObject *o) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->line_to_offset); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)o; + if (p->line_to_offset) { + e = (*v)(p->line_to_offset, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)o; + tmp = ((PyObject*)p->line_to_offset); + p->line_to_offset = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_line_to_offset(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_line_to_offset(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_14line_to_offset_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_first_line(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_first_line(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_10first_line_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_last_line(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_last_line(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_9last_line_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyMethodDef __pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo[] = { + {(char *)"line_to_offset", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_line_to_offset, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_line_to_offset, (char *)0, 0}, + {(char *)"first_line", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_first_line, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_first_line, (char *)0, 0}, + {(char *)"last_line", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_last_line, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_last_line, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo}, + {Py_tp_clear, (void *)__pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo}, + {Py_tp_methods, (void *)__pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo}, + {Py_tp_getset, (void *)__pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo}, + {Py_tp_init, (void *)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo}, + {0, 0}, +}; +static PyType_Spec __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo_spec = { + "_pydevd_frame_eval.pydevd_frame_evaluator._CodeLineInfo", + sizeof(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo_slots, +}; +#else + +static PyTypeObject __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_frame_eval.pydevd_frame_evaluator.""_CodeLineInfo", /*tp_name*/ + sizeof(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, /*tp_traverse*/ + __pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue __pyx_vtable_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue; + +static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)o); + p->__pyx_vtab = __pyx_vtabptr_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue; + p->code_obj_py = Py_None; Py_INCREF(Py_None); + p->code_line_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)Py_None); Py_INCREF(Py_None); + p->breakpoints_hit_at_lines = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->code_lines_as_set = ((PyObject*)Py_None); Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue(PyObject *o) { + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->code_obj_py); + Py_CLEAR(p->code_line_info); + Py_CLEAR(p->breakpoints_hit_at_lines); + Py_CLEAR(p->code_lines_as_set); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)o; + if (p->code_obj_py) { + e = (*v)(p->code_obj_py, a); if (e) return e; + } + if (p->code_line_info) { + e = (*v)(((PyObject *)p->code_line_info), a); if (e) return e; + } + if (p->breakpoints_hit_at_lines) { + e = (*v)(p->breakpoints_hit_at_lines, a); if (e) return e; + } + if (p->code_lines_as_set) { + e = (*v)(p->code_lines_as_set, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *p = (struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *)o; + tmp = ((PyObject*)p->code_obj_py); + p->code_obj_py = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->code_line_info); + p->code_line_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo *)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->breakpoints_hit_at_lines); + p->breakpoints_hit_at_lines = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->code_lines_as_set); + p->code_lines_as_set = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_obj_py(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_obj_py(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_11code_obj_py_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_line_info(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_line_info(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_14code_line_info_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_breakpoints_hit_at_lines(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_breakpoints_hit_at_lines(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_24breakpoints_hit_at_lines_5__del__(o); + } +} + +static PyObject *__pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_lines_as_set(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_1__get__(o); +} + +static int __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_lines_as_set(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_3__set__(o, v); + } + else { + return __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_17code_lines_as_set_5__del__(o); + } +} + +static PyMethodDef __pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue[] = { + {(char *)"code_obj_py", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_obj_py, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_obj_py, (char *)0, 0}, + {(char *)"code_line_info", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_line_info, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_line_info, (char *)0, 0}, + {(char *)"breakpoints_hit_at_lines", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_breakpoints_hit_at_lines, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_breakpoints_hit_at_lines, (char *)0, 0}, + {(char *)"code_lines_as_set", __pyx_getprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_lines_as_set, __pyx_setprop_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_code_lines_as_set, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue}, + {Py_tp_clear, (void *)__pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue}, + {Py_tp_methods, (void *)__pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue}, + {Py_tp_getset, (void *)__pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue}, + {Py_tp_init, (void *)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_1__init__}, + {Py_tp_new, (void *)__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue}, + {0, 0}, +}; +static PyType_Spec __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue_spec = { + "_pydevd_frame_eval.pydevd_frame_evaluator._CacheValue", + sizeof(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue_slots, +}; +#else + +static PyTypeObject __pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue = { + PyVarObject_HEAD_INIT(0, 0) + "_pydevd_frame_eval.pydevd_frame_evaluator.""_CacheValue", /*tp_name*/ + sizeof(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, /*tp_traverse*/ + __pyx_tp_clear_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if PY_VERSION_HEX >= 0x030d00A4 + 0, /*tp_versions_used*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_s_, __pyx_k_, sizeof(__pyx_k_), 0, 0, 1, 0}, + {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, + {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, + {&__pyx_n_s_CacheValue, __pyx_k_CacheValue, sizeof(__pyx_k_CacheValue), 0, 0, 1, 1}, + {&__pyx_n_s_CacheValue___reduce_cython, __pyx_k_CacheValue___reduce_cython, sizeof(__pyx_k_CacheValue___reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_CacheValue___setstate_cython, __pyx_k_CacheValue___setstate_cython, sizeof(__pyx_k_CacheValue___setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_CacheValue_compute_force_stay_i, __pyx_k_CacheValue_compute_force_stay_i, sizeof(__pyx_k_CacheValue_compute_force_stay_i), 0, 0, 1, 1}, + {&__pyx_n_s_CodeLineInfo, __pyx_k_CodeLineInfo, sizeof(__pyx_k_CodeLineInfo), 0, 0, 1, 1}, + {&__pyx_n_s_CodeLineInfo___reduce_cython, __pyx_k_CodeLineInfo___reduce_cython, sizeof(__pyx_k_CodeLineInfo___reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_CodeLineInfo___setstate_cython, __pyx_k_CodeLineInfo___setstate_cython, sizeof(__pyx_k_CodeLineInfo___setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_DebugHelper, __pyx_k_DebugHelper, sizeof(__pyx_k_DebugHelper), 0, 0, 1, 1}, + {&__pyx_n_s_FuncCodeInfo, __pyx_k_FuncCodeInfo, sizeof(__pyx_k_FuncCodeInfo), 0, 0, 1, 1}, + {&__pyx_n_s_FuncCodeInfo___reduce_cython, __pyx_k_FuncCodeInfo___reduce_cython, sizeof(__pyx_k_FuncCodeInfo___reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_FuncCodeInfo___setstate_cython, __pyx_k_FuncCodeInfo___setstate_cython, sizeof(__pyx_k_FuncCodeInfo___setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_GlobalDebuggerHolder, __pyx_k_GlobalDebuggerHolder, sizeof(__pyx_k_GlobalDebuggerHolder), 0, 0, 1, 1}, + {&__pyx_kp_s_If_a_code_object_is_cached_that, __pyx_k_If_a_code_object_is_cached_that, sizeof(__pyx_k_If_a_code_object_is_cached_that), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_k_Incompatible_checksums_0x_x_vs_0_2, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_2), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_3, __pyx_k_Incompatible_checksums_0x_x_vs_0_3, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_3), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_4, __pyx_k_Incompatible_checksums_0x_x_vs_0_4, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_4), 0, 0, 1, 0}, + {&__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER, __pyx_k_NORM_PATHS_AND_BASE_CONTAINER, sizeof(__pyx_k_NORM_PATHS_AND_BASE_CONTAINER), 0, 0, 1, 1}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_SetTrace, __pyx_k_SetTrace, sizeof(__pyx_k_SetTrace), 0, 0, 1, 1}, + {&__pyx_n_s_ThreadInfo, __pyx_k_ThreadInfo, sizeof(__pyx_k_ThreadInfo), 0, 0, 1, 1}, + {&__pyx_n_s_ThreadInfo___reduce_cython, __pyx_k_ThreadInfo___reduce_cython, sizeof(__pyx_k_ThreadInfo___reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_ThreadInfo___setstate_cython, __pyx_k_ThreadInfo___setstate_cython, sizeof(__pyx_k_ThreadInfo___setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 0, 1, 1}, + {&__pyx_kp_s__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 0, 1, 0}, + {&__pyx_kp_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 0}, + {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, + {&__pyx_n_s__47, __pyx_k__47, sizeof(__pyx_k__47), 0, 0, 1, 1}, + {&__pyx_kp_s__5, __pyx_k__5, sizeof(__pyx_k__5), 0, 0, 1, 0}, + {&__pyx_n_s_active, __pyx_k_active, sizeof(__pyx_k_active), 0, 0, 1, 1}, + {&__pyx_n_s_additional_info, __pyx_k_additional_info, sizeof(__pyx_k_additional_info), 0, 0, 1, 1}, + {&__pyx_n_s_arg, __pyx_k_arg, sizeof(__pyx_k_arg), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_bootstrap, __pyx_k_bootstrap, sizeof(__pyx_k_bootstrap), 0, 0, 1, 1}, + {&__pyx_n_s_bootstrap_2, __pyx_k_bootstrap_2, sizeof(__pyx_k_bootstrap_2), 0, 0, 1, 1}, + {&__pyx_n_s_bootstrap_inner, __pyx_k_bootstrap_inner, sizeof(__pyx_k_bootstrap_inner), 0, 0, 1, 1}, + {&__pyx_n_s_bootstrap_inner_2, __pyx_k_bootstrap_inner_2, sizeof(__pyx_k_bootstrap_inner_2), 0, 0, 1, 1}, + {&__pyx_n_s_break_on_caught_exceptions, __pyx_k_break_on_caught_exceptions, sizeof(__pyx_k_break_on_caught_exceptions), 0, 0, 1, 1}, + {&__pyx_n_s_break_on_user_uncaught_exception, __pyx_k_break_on_user_uncaught_exception, sizeof(__pyx_k_break_on_user_uncaught_exception), 0, 0, 1, 1}, + {&__pyx_n_s_breakpoints, __pyx_k_breakpoints, sizeof(__pyx_k_breakpoints), 0, 0, 1, 1}, + {&__pyx_n_s_breakpoints_hit_at_lines, __pyx_k_breakpoints_hit_at_lines, sizeof(__pyx_k_breakpoints_hit_at_lines), 0, 0, 1, 1}, + {&__pyx_n_s_cache, __pyx_k_cache, sizeof(__pyx_k_cache), 0, 0, 1, 1}, + {&__pyx_n_s_call, __pyx_k_call, sizeof(__pyx_k_call), 0, 0, 1, 1}, + {&__pyx_n_s_call_2, __pyx_k_call_2, sizeof(__pyx_k_call_2), 0, 0, 1, 1}, + {&__pyx_n_s_can_skip, __pyx_k_can_skip, sizeof(__pyx_k_can_skip), 0, 0, 1, 1}, + {&__pyx_n_s_clear_thread_local_info, __pyx_k_clear_thread_local_info, sizeof(__pyx_k_clear_thread_local_info), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_code_line_info, __pyx_k_code_line_info, sizeof(__pyx_k_code_line_info), 0, 0, 1, 1}, + {&__pyx_n_s_code_obj, __pyx_k_code_obj, sizeof(__pyx_k_code_obj), 0, 0, 1, 1}, + {&__pyx_n_s_code_obj_py, __pyx_k_code_obj_py, sizeof(__pyx_k_code_obj_py), 0, 0, 1, 1}, + {&__pyx_n_s_compute_force_stay_in_untraced_m, __pyx_k_compute_force_stay_in_untraced_m, sizeof(__pyx_k_compute_force_stay_in_untraced_m), 0, 0, 1, 1}, + {&__pyx_n_s_current_thread, __pyx_k_current_thread, sizeof(__pyx_k_current_thread), 0, 0, 1, 1}, + {&__pyx_n_s_decref_py, __pyx_k_decref_py, sizeof(__pyx_k_decref_py), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_n_s_dict_2, __pyx_k_dict_2, sizeof(__pyx_k_dict_2), 0, 0, 1, 1}, + {&__pyx_n_s_dis, __pyx_k_dis, sizeof(__pyx_k_dis), 0, 0, 1, 1}, + {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, + {&__pyx_n_s_dummy_trace_dispatch, __pyx_k_dummy_trace_dispatch, sizeof(__pyx_k_dummy_trace_dispatch), 0, 0, 1, 1}, + {&__pyx_n_s_dummy_tracing_holder, __pyx_k_dummy_tracing_holder, sizeof(__pyx_k_dummy_tracing_holder), 0, 0, 1, 1}, + {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, + {&__pyx_n_s_enter, __pyx_k_enter, sizeof(__pyx_k_enter), 0, 0, 1, 1}, + {&__pyx_n_s_event, __pyx_k_event, sizeof(__pyx_k_event), 0, 0, 1, 1}, + {&__pyx_n_s_exec, __pyx_k_exec, sizeof(__pyx_k_exec), 0, 0, 1, 1}, + {&__pyx_n_s_exit, __pyx_k_exit, sizeof(__pyx_k_exit), 0, 0, 1, 1}, + {&__pyx_n_s_f_back, __pyx_k_f_back, sizeof(__pyx_k_f_back), 0, 0, 1, 1}, + {&__pyx_n_s_f_trace, __pyx_k_f_trace, sizeof(__pyx_k_f_trace), 0, 0, 1, 1}, + {&__pyx_n_s_findlinestarts, __pyx_k_findlinestarts, sizeof(__pyx_k_findlinestarts), 0, 0, 1, 1}, + {&__pyx_n_s_first_line, __pyx_k_first_line, sizeof(__pyx_k_first_line), 0, 0, 1, 1}, + {&__pyx_n_s_fix_top_level_trace_and_get_trac, __pyx_k_fix_top_level_trace_and_get_trac, sizeof(__pyx_k_fix_top_level_trace_and_get_trac), 0, 0, 1, 1}, + {&__pyx_n_s_frame, __pyx_k_frame, sizeof(__pyx_k_frame), 0, 0, 1, 1}, + {&__pyx_n_s_frame_eval_func, __pyx_k_frame_eval_func, sizeof(__pyx_k_frame_eval_func), 0, 0, 1, 1}, + {&__pyx_n_s_function_breakpoint_name_to_brea, __pyx_k_function_breakpoint_name_to_brea, sizeof(__pyx_k_function_breakpoint_name_to_brea), 0, 0, 1, 1}, + {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, + {&__pyx_n_s_generate_code_with_breakpoints_p, __pyx_k_generate_code_with_breakpoints_p, sizeof(__pyx_k_generate_code_with_breakpoints_p), 0, 0, 1, 1}, + {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1}, + {&__pyx_n_s_get_abs_path_real_path_and_base, __pyx_k_get_abs_path_real_path_and_base, sizeof(__pyx_k_get_abs_path_real_path_and_base), 0, 0, 1, 1}, + {&__pyx_n_s_get_cache_file_type, __pyx_k_get_cache_file_type, sizeof(__pyx_k_get_cache_file_type), 0, 0, 1, 1}, + {&__pyx_n_s_get_cached_code_obj_info_py, __pyx_k_get_cached_code_obj_info_py, sizeof(__pyx_k_get_cached_code_obj_info_py), 0, 0, 1, 1}, + {&__pyx_n_s_get_code_line_info, __pyx_k_get_code_line_info, sizeof(__pyx_k_get_code_line_info), 0, 0, 1, 1}, + {&__pyx_n_s_get_file_type, __pyx_k_get_file_type, sizeof(__pyx_k_get_file_type), 0, 0, 1, 1}, + {&__pyx_n_s_get_func_code_info_py, __pyx_k_get_func_code_info_py, sizeof(__pyx_k_get_func_code_info_py), 0, 0, 1, 1}, + {&__pyx_n_s_get_ident, __pyx_k_get_ident, sizeof(__pyx_k_get_ident), 0, 0, 1, 1}, + {&__pyx_n_s_get_ident_2, __pyx_k_get_ident_2, sizeof(__pyx_k_get_ident_2), 0, 0, 1, 1}, + {&__pyx_n_s_get_thread_info_py, __pyx_k_get_thread_info_py, sizeof(__pyx_k_get_thread_info_py), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_n_s_global_dbg, __pyx_k_global_dbg, sizeof(__pyx_k_global_dbg), 0, 0, 1, 1}, + {&__pyx_n_s_has_plugin_exception_breaks, __pyx_k_has_plugin_exception_breaks, sizeof(__pyx_k_has_plugin_exception_breaks), 0, 0, 1, 1}, + {&__pyx_n_s_has_plugin_line_breaks, __pyx_k_has_plugin_line_breaks, sizeof(__pyx_k_has_plugin_line_breaks), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_insert_pydevd_breaks, __pyx_k_insert_pydevd_breaks, sizeof(__pyx_k_insert_pydevd_breaks), 0, 0, 1, 1}, + {&__pyx_n_s_intersection, __pyx_k_intersection, sizeof(__pyx_k_intersection), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_n_s_is_pydev_daemon_thread, __pyx_k_is_pydev_daemon_thread, sizeof(__pyx_k_is_pydev_daemon_thread), 0, 0, 1, 1}, + {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, + {&__pyx_n_s_issuperset, __pyx_k_issuperset, sizeof(__pyx_k_issuperset), 0, 0, 1, 1}, + {&__pyx_n_s_last_line, __pyx_k_last_line, sizeof(__pyx_k_last_line), 0, 0, 1, 1}, + {&__pyx_n_s_line, __pyx_k_line, sizeof(__pyx_k_line), 0, 0, 1, 1}, + {&__pyx_n_s_line_to_offset, __pyx_k_line_to_offset, sizeof(__pyx_k_line_to_offset), 0, 0, 1, 1}, + {&__pyx_n_s_local, __pyx_k_local, sizeof(__pyx_k_local), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_main_2, __pyx_k_main_2, sizeof(__pyx_k_main_2), 0, 0, 1, 1}, + {&__pyx_n_s_max, __pyx_k_max, sizeof(__pyx_k_max), 0, 0, 1, 1}, + {&__pyx_n_s_min, __pyx_k_min, sizeof(__pyx_k_min), 0, 0, 1, 1}, + {&__pyx_n_s_mtime, __pyx_k_mtime, sizeof(__pyx_k_mtime), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_offset, __pyx_k_offset, sizeof(__pyx_k_offset), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_plugin, __pyx_k_plugin, sizeof(__pyx_k_plugin), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_bundle__pydev_saved_modul, __pyx_k_pydev_bundle__pydev_saved_modul, sizeof(__pyx_k_pydev_bundle__pydev_saved_modul), 0, 0, 1, 1}, + {&__pyx_n_s_pydev_monkey, __pyx_k_pydev_monkey, sizeof(__pyx_k_pydev_monkey), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd, __pyx_k_pydevd, sizeof(__pyx_k_pydevd), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle_pydevd_additional, __pyx_k_pydevd_bundle_pydevd_additional, sizeof(__pyx_k_pydevd_bundle_pydevd_additional), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle_pydevd_constants, __pyx_k_pydevd_bundle_pydevd_constants, sizeof(__pyx_k_pydevd_bundle_pydevd_constants), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_bundle_pydevd_trace_disp, __pyx_k_pydevd_bundle_pydevd_trace_disp, sizeof(__pyx_k_pydevd_bundle_pydevd_trace_disp), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_file_utils, __pyx_k_pydevd_file_utils, sizeof(__pyx_k_pydevd_file_utils), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_frame_eval_pydevd_frame, __pyx_k_pydevd_frame_eval_pydevd_frame, sizeof(__pyx_k_pydevd_frame_eval_pydevd_frame), 0, 0, 1, 1}, + {&__pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_k_pydevd_frame_eval_pydevd_frame_2, sizeof(__pyx_k_pydevd_frame_eval_pydevd_frame_2), 0, 0, 1, 0}, + {&__pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_k_pydevd_frame_eval_pydevd_frame_3, sizeof(__pyx_k_pydevd_frame_eval_pydevd_frame_3), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_frame_eval_pydevd_modify, __pyx_k_pydevd_frame_eval_pydevd_modify, sizeof(__pyx_k_pydevd_frame_eval_pydevd_modify), 0, 0, 1, 1}, + {&__pyx_n_s_pydevd_tracing, __pyx_k_pydevd_tracing, sizeof(__pyx_k_pydevd_tracing), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_FuncCodeInfo, __pyx_k_pyx_unpickle_FuncCodeInfo, sizeof(__pyx_k_pyx_unpickle_FuncCodeInfo), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_ThreadInfo, __pyx_k_pyx_unpickle_ThreadInfo, sizeof(__pyx_k_pyx_unpickle_ThreadInfo), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle__CacheValue, __pyx_k_pyx_unpickle__CacheValue, sizeof(__pyx_k_pyx_unpickle__CacheValue), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle__CodeLineInfo, __pyx_k_pyx_unpickle__CodeLineInfo, sizeof(__pyx_k_pyx_unpickle__CodeLineInfo), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_return, __pyx_k_return, sizeof(__pyx_k_return), 0, 0, 1, 1}, + {&__pyx_n_s_rfind, __pyx_k_rfind, sizeof(__pyx_k_rfind), 0, 0, 1, 1}, + {&__pyx_n_s_run, __pyx_k_run, sizeof(__pyx_k_run), 0, 0, 1, 1}, + {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1}, + {&__pyx_n_s_set_additional_thread_info_lock, __pyx_k_set_additional_thread_info_lock, sizeof(__pyx_k_set_additional_thread_info_lock), 0, 0, 1, 1}, + {&__pyx_n_s_set_trace_func, __pyx_k_set_trace_func, sizeof(__pyx_k_set_trace_func), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_show_return_values, __pyx_k_show_return_values, sizeof(__pyx_k_show_return_values), 0, 0, 1, 1}, + {&__pyx_n_s_signature_factory, __pyx_k_signature_factory, sizeof(__pyx_k_signature_factory), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_state, __pyx_k_state, sizeof(__pyx_k_state), 0, 0, 1, 1}, + {&__pyx_n_s_stop_frame_eval, __pyx_k_stop_frame_eval, sizeof(__pyx_k_stop_frame_eval), 0, 0, 1, 1}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_thread, __pyx_k_thread, sizeof(__pyx_k_thread), 0, 0, 1, 1}, + {&__pyx_n_s_thread_active, __pyx_k_thread_active, sizeof(__pyx_k_thread_active), 0, 0, 1, 1}, + {&__pyx_n_s_thread_info, __pyx_k_thread_info, sizeof(__pyx_k_thread_info), 0, 0, 1, 1}, + {&__pyx_n_s_thread_local_info, __pyx_k_thread_local_info, sizeof(__pyx_k_thread_local_info), 0, 0, 1, 1}, + {&__pyx_n_s_threading, __pyx_k_threading, sizeof(__pyx_k_threading), 0, 0, 1, 1}, + {&__pyx_n_s_trace_dispatch, __pyx_k_trace_dispatch, sizeof(__pyx_k_trace_dispatch), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_update_globals_dict, __pyx_k_update_globals_dict, sizeof(__pyx_k_update_globals_dict), 0, 0, 1, 1}, + {&__pyx_n_s_use_setstate, __pyx_k_use_setstate, sizeof(__pyx_k_use_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_version_info, __pyx_k_version_info, sizeof(__pyx_k_version_info), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(0, 42, __pyx_L1_error) + __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_builtin_min = __Pyx_GetBuiltinName(__pyx_n_s_min); if (!__pyx_builtin_min) __PYX_ERR(0, 341, __pyx_L1_error) + __pyx_builtin_max = __Pyx_GetBuiltinName(__pyx_n_s_max); if (!__pyx_builtin_max) __PYX_ERR(0, 342, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":112 + * raise AttributeError() + * except: + * with _set_additional_thread_info_lock: # <<<<<<<<<<<<<< + * # If it's not there, set it within a lock to avoid any racing + * # conditions. + */ + __pyx_tuple__4 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0xe535b68, 0xb8148ba, 0x0af4089): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe535b68, 0xb8148ba, 0x0af4089) = (_can_create_dummy_thread, additional_info, force_stay_in_untraced_mode, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))" % __pyx_checksum + */ + __pyx_tuple__6 = PyTuple_Pack(3, __pyx_int_240343912, __pyx_int_193022138, __pyx_int_11485321); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + __pyx_tuple__7 = PyTuple_Pack(3, __pyx_int_72405718, __pyx_int_156687530, __pyx_int_188670045); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + __pyx_tuple__8 = PyTuple_Pack(3, __pyx_int_95010005, __pyx_int_2520179, __pyx_int_66829570); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + __pyx_tuple__9 = PyTuple_Pack(3, __pyx_int_180628038, __pyx_int_249558979, __pyx_int_64258489); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":19 + * _thread_active = threading._active + * + * def clear_thread_local_info(): # <<<<<<<<<<<<<< + * global _thread_local_info + * _thread_local_info = threading.local() + */ + __pyx_codeobj__11 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_clear_thread_local_info, 19, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__11)) __PYX_ERR(0, 19, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_tuple__12 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_state, __pyx_n_s_dict_2, __pyx_n_s_use_setstate); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + __pyx_codeobj__13 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__13)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state) + */ + __pyx_tuple__14 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_pyx_state); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(1, 16, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state) + */ + __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(1, 16, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":152 + * + * + * def dummy_trace_dispatch(frame, str event, arg): # <<<<<<<<<<<<<< + * if event == 'call': + * if frame.f_trace is not None: + */ + __pyx_tuple__18 = PyTuple_Pack(3, __pyx_n_s_frame, __pyx_n_s_event, __pyx_n_s_arg); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_dummy_trace_dispatch, 152, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) __PYX_ERR(0, 152, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":159 + * + * + * def get_thread_info_py() -> ThreadInfo: # <<<<<<<<<<<<<< + * return get_thread_info(PyEval_GetFrame()) + * + */ + __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_get_thread_info_py, 159, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) __PYX_ERR(0, 159, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":196 + * + * + * def decref_py(obj): # <<<<<<<<<<<<<< + * ''' + * Helper to be called from Python. + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_decref_py, 196, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(0, 196, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":203 + * + * + * def get_func_code_info_py(thread_info, frame, code_obj) -> FuncCodeInfo: # <<<<<<<<<<<<<< + * ''' + * Helper to be called from Python. + */ + __pyx_tuple__23 = PyTuple_Pack(3, __pyx_n_s_thread_info, __pyx_n_s_frame, __pyx_n_s_code_obj); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 203, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_get_func_code_info_py, 203, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 203, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__CodeLineInfo__set_state(self, __pyx_state) + */ + __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(1, 16, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":329 + * + * # Note: this method has a version in pure-python too. + * def _get_code_line_info(code_obj): # <<<<<<<<<<<<<< + * line_to_offset: dict = {} + * first_line: int = None + */ + __pyx_tuple__27 = PyTuple_Pack(6, __pyx_n_s_code_obj, __pyx_n_s_line_to_offset, __pyx_n_s_first_line, __pyx_n_s_last_line, __pyx_n_s_offset, __pyx_n_s_line); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 329, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_GIVEREF(__pyx_tuple__27); + __pyx_codeobj__28 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_get_code_line_info, 329, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__28)) __PYX_ERR(0, 329, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":353 + * _cache: dict = {} + * + * def get_cached_code_obj_info_py(code_obj_py): # <<<<<<<<<<<<<< + * ''' + * :return _CacheValue: + */ + __pyx_tuple__29 = PyTuple_Pack(1, __pyx_n_s_code_obj_py); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 353, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__29); + __Pyx_GIVEREF(__pyx_tuple__29); + __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_get_cached_code_obj_info_py, 353, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 353, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":379 + * self.code_lines_as_set = set(code_line_info.line_to_offset) + * + * cpdef compute_force_stay_in_untraced_mode(self, breakpoints): # <<<<<<<<<<<<<< + * ''' + * :param breakpoints: + */ + __pyx_tuple__31 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_breakpoints); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__31); + __Pyx_GIVEREF(__pyx_tuple__31); + __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_compute_force_stay_in_untraced_m, 379, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 379, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__CacheValue__set_state(self, __pyx_state) + */ + __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(1, 16, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":401 + * return breakpoint_found, force_stay_in_untraced_mode + * + * def generate_code_with_breakpoints_py(object code_obj_py, dict breakpoints): # <<<<<<<<<<<<<< + * return generate_code_with_breakpoints(code_obj_py, breakpoints) + * + */ + __pyx_tuple__35 = PyTuple_Pack(2, __pyx_n_s_code_obj_py, __pyx_n_s_breakpoints); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__35); + __Pyx_GIVEREF(__pyx_tuple__35); + __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__35, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_generate_code_with_breakpoints_p, 401, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) __PYX_ERR(0, 401, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":473 + * import sys + * + * cdef bint IS_PY_39_OWNARDS = sys.version_info[:2] >= (3, 9) # <<<<<<<<<<<<<< + * + * def frame_eval_func(): + */ + __pyx_slice__37 = PySlice_New(Py_None, __pyx_int_2, Py_None); if (unlikely(!__pyx_slice__37)) __PYX_ERR(0, 473, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__37); + __Pyx_GIVEREF(__pyx_slice__37); + __pyx_tuple__38 = PyTuple_Pack(2, __pyx_int_3, __pyx_int_9); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 473, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__38); + __Pyx_GIVEREF(__pyx_tuple__38); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":475 + * cdef bint IS_PY_39_OWNARDS = sys.version_info[:2] >= (3, 9) + * + * def frame_eval_func(): # <<<<<<<<<<<<<< + * cdef PyThreadState *state = PyThreadState_Get() + * if IS_PY_39_OWNARDS: + */ + __pyx_tuple__39 = PyTuple_Pack(1, __pyx_n_s_state); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 475, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__39); + __Pyx_GIVEREF(__pyx_tuple__39); + __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__39, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_frame_eval_func, 475, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) __PYX_ERR(0, 475, __pyx_L1_error) + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":484 + * + * + * def stop_frame_eval(): # <<<<<<<<<<<<<< + * cdef PyThreadState *state = PyThreadState_Get() + * state.interp.eval_frame = _PyEval_EvalFrameDefault + */ + __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__39, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_stop_frame_eval, 484, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 484, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __pyx_unpickle_ThreadInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__42 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__42); + __Pyx_GIVEREF(__pyx_tuple__42); + __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__42, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_ThreadInfo, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(1, 1, __pyx_L1_error) + __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__42, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_FuncCodeInfo, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(1, 1, __pyx_L1_error) + __pyx_codeobj__45 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__42, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__CodeLineInfo, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__45)) __PYX_ERR(1, 1, __pyx_L1_error) + __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__42, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__CacheValue, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_9 = PyInt_FromLong(9); if (unlikely(!__pyx_int_9)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2520179 = PyInt_FromLong(2520179L); if (unlikely(!__pyx_int_2520179)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_11485321 = PyInt_FromLong(11485321L); if (unlikely(!__pyx_int_11485321)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_64258489 = PyInt_FromLong(64258489L); if (unlikely(!__pyx_int_64258489)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_66829570 = PyInt_FromLong(66829570L); if (unlikely(!__pyx_int_66829570)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_72405718 = PyInt_FromLong(72405718L); if (unlikely(!__pyx_int_72405718)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_95010005 = PyInt_FromLong(95010005L); if (unlikely(!__pyx_int_95010005)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_156687530 = PyInt_FromLong(156687530L); if (unlikely(!__pyx_int_156687530)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_180628038 = PyInt_FromLong(180628038L); if (unlikely(!__pyx_int_180628038)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_188670045 = PyInt_FromLong(188670045L); if (unlikely(!__pyx_int_188670045)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_193022138 = PyInt_FromLong(193022138L); if (unlikely(!__pyx_int_193022138)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_240343912 = PyInt_FromLong(240343912L); if (unlikely(!__pyx_int_240343912)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_249558979 = PyInt_FromLong(249558979L); if (unlikely(!__pyx_int_249558979)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* AssertionsEnabled.init */ + if (likely(__Pyx_init_assertions_enabled() == 0)); else + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo = &__pyx_vtable_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo; + __pyx_vtable_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo.initialize = (PyObject *(*)(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *, PyFrameObject *))__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_initialize; + __pyx_vtable_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo.initialize_if_possible = (PyObject *(*)(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *))__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_initialize_if_possible; + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo_spec, NULL); if (unlikely(!__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo)) __PYX_ERR(0, 24, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo_spec, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo) < 0) __PYX_ERR(0, 24, __pyx_L1_error) + #else + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo = &__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo) < 0) __PYX_ERR(0, 24, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo->tp_dictoffset && __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, __pyx_vtabptr_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo) < 0) __PYX_ERR(0, 24, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo) < 0) __PYX_ERR(0, 24, __pyx_L1_error) + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ThreadInfo, (PyObject *) __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo) < 0) __PYX_ERR(0, 24, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo) < 0) __PYX_ERR(0, 24, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo_spec, NULL); if (unlikely(!__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo)) __PYX_ERR(0, 125, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo_spec, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo) < 0) __PYX_ERR(0, 125, __pyx_L1_error) + #else + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo = &__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo) < 0) __PYX_ERR(0, 125, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo->tp_dictoffset && __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_FuncCodeInfo, (PyObject *) __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo) < 0) __PYX_ERR(0, 125, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo) < 0) __PYX_ERR(0, 125, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo_spec, NULL); if (unlikely(!__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo)) __PYX_ERR(0, 316, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo_spec, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo) < 0) __PYX_ERR(0, 316, __pyx_L1_error) + #else + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo = &__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo) < 0) __PYX_ERR(0, 316, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo->tp_dictoffset && __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CodeLineInfo, (PyObject *) __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo) < 0) __PYX_ERR(0, 316, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo) < 0) __PYX_ERR(0, 316, __pyx_L1_error) + #endif + __pyx_vtabptr_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue = &__pyx_vtable_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue; + __pyx_vtable_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue.compute_force_stay_in_untraced_mode = (PyObject *(*)(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue *, PyObject *, int __pyx_skip_dispatch))__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_compute_force_stay_in_untraced_mode; + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue_spec, NULL); if (unlikely(!__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue)) __PYX_ERR(0, 361, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue_spec, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue) < 0) __PYX_ERR(0, 361, __pyx_L1_error) + #else + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue = &__pyx_type_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue) < 0) __PYX_ERR(0, 361, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue->tp_dictoffset && __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + #if CYTHON_UPDATE_DESCRIPTOR_DOC + { + PyObject *wrapper = PyObject_GetAttrString((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, "__init__"); if (unlikely(!wrapper)) __PYX_ERR(0, 361, __pyx_L1_error) + if (__Pyx_IS_TYPE(wrapper, &PyWrapperDescr_Type)) { + __pyx_wrapperbase_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__ = *((PyWrapperDescrObject *)wrapper)->d_base; + __pyx_wrapperbase_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__.doc = __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__; + ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue___init__; + } + } + #endif + if (__Pyx_SetVtable(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, __pyx_vtabptr_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue) < 0) __PYX_ERR(0, 361, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue) < 0) __PYX_ERR(0, 361, __pyx_L1_error) + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CacheValue, (PyObject *) __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue) < 0) __PYX_ERR(0, 361, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue) < 0) __PYX_ERR(0, 361, __pyx_L1_error) + #endif + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule("_pydevd_bundle.pydevd_cython"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo = __Pyx_ImportType_3_0_11(__pyx_t_1, "_pydevd_bundle.pydevd_cython", "PyDBAdditionalThreadInfo", sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo),__Pyx_ImportType_CheckSize_Warn_3_0_11); if (!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo = (struct __pyx_vtabstruct_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo*)__Pyx_GetVtable(__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo); if (unlikely(!__pyx_vtabptr_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_pydevd_frame_evaluator(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_pydevd_frame_evaluator}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "pydevd_frame_evaluator", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initpydevd_frame_evaluator(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initpydevd_frame_evaluator(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_pydevd_frame_evaluator(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_pydevd_frame_evaluator(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_pydevd_frame_evaluator(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'pydevd_frame_evaluator' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("pydevd_frame_evaluator", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "pydevd_frame_evaluator" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_pydevd_frame_evaluator(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main__pydevd_frame_eval__pydevd_frame_evaluator) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "_pydevd_frame_eval.pydevd_frame_evaluator")) { + if (unlikely((PyDict_SetItemString(modules, "_pydevd_frame_eval.pydevd_frame_evaluator", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":2 + * from __future__ import print_function + * from _pydev_bundle._pydev_saved_modules import threading, thread # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_constants import GlobalDebuggerHolder + * import dis + */ + __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_threading); + __Pyx_GIVEREF(__pyx_n_s_threading); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_threading)) __PYX_ERR(0, 2, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_thread); + __Pyx_GIVEREF(__pyx_n_s_thread); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_thread)) __PYX_ERR(0, 2, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydev_bundle__pydev_saved_modul, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_threading, __pyx_t_2) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_thread); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_thread, __pyx_t_2) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":3 + * from __future__ import print_function + * from _pydev_bundle._pydev_saved_modules import threading, thread + * from _pydevd_bundle.pydevd_constants import GlobalDebuggerHolder # <<<<<<<<<<<<<< + * import dis + * import sys + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_GlobalDebuggerHolder); + __Pyx_GIVEREF(__pyx_n_s_GlobalDebuggerHolder); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_GlobalDebuggerHolder)) __PYX_ERR(0, 3, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_constants, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_GlobalDebuggerHolder, __pyx_t_3) < 0) __PYX_ERR(0, 3, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":4 + * from _pydev_bundle._pydev_saved_modules import threading, thread + * from _pydevd_bundle.pydevd_constants import GlobalDebuggerHolder + * import dis # <<<<<<<<<<<<<< + * import sys + * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_dis, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_dis, __pyx_t_2) < 0) __PYX_ERR(0, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":5 + * from _pydevd_bundle.pydevd_constants import GlobalDebuggerHolder + * import dis + * import sys # <<<<<<<<<<<<<< + * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder + * from _pydevd_frame_eval.pydevd_modify_bytecode import DebugHelper, insert_pydevd_breaks + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_sys, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_2) < 0) __PYX_ERR(0, 5, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":6 + * import dis + * import sys + * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder # <<<<<<<<<<<<<< + * from _pydevd_frame_eval.pydevd_modify_bytecode import DebugHelper, insert_pydevd_breaks + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER + */ + __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_update_globals_dict); + __Pyx_GIVEREF(__pyx_n_s_update_globals_dict); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_update_globals_dict)) __PYX_ERR(0, 6, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_dummy_tracing_holder); + __Pyx_GIVEREF(__pyx_n_s_dummy_tracing_holder); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_dummy_tracing_holder)) __PYX_ERR(0, 6, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_frame_eval_pydevd_frame, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_update_globals_dict); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_update_globals_dict, __pyx_t_2) < 0) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_dummy_tracing_holder); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_dummy_tracing_holder, __pyx_t_2) < 0) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":7 + * import sys + * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder + * from _pydevd_frame_eval.pydevd_modify_bytecode import DebugHelper, insert_pydevd_breaks # <<<<<<<<<<<<<< + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER + * from _pydevd_bundle.pydevd_trace_dispatch import fix_top_level_trace_and_get_trace_func + */ + __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_DebugHelper); + __Pyx_GIVEREF(__pyx_n_s_DebugHelper); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_DebugHelper)) __PYX_ERR(0, 7, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_insert_pydevd_breaks); + __Pyx_GIVEREF(__pyx_n_s_insert_pydevd_breaks); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_insert_pydevd_breaks)) __PYX_ERR(0, 7, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_frame_eval_pydevd_modify, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_DebugHelper); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DebugHelper, __pyx_t_3) < 0) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_insert_pydevd_breaks); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_insert_pydevd_breaks, __pyx_t_3) < 0) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":8 + * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder + * from _pydevd_frame_eval.pydevd_modify_bytecode import DebugHelper, insert_pydevd_breaks + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_trace_dispatch import fix_top_level_trace_and_get_trace_func + * + */ + __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_get_abs_path_real_path_and_base); + __Pyx_GIVEREF(__pyx_n_s_get_abs_path_real_path_and_base); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_get_abs_path_real_path_and_base)) __PYX_ERR(0, 8, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); + __Pyx_GIVEREF(__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER)) __PYX_ERR(0, 8, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_file_utils, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_get_abs_path_real_path_and_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_abs_path_real_path_and_base, __pyx_t_2) < 0) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER, __pyx_t_2) < 0) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":9 + * from _pydevd_frame_eval.pydevd_modify_bytecode import DebugHelper, insert_pydevd_breaks + * from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER + * from _pydevd_bundle.pydevd_trace_dispatch import fix_top_level_trace_and_get_trace_func # <<<<<<<<<<<<<< + * + * from _pydevd_bundle.pydevd_additional_thread_info import _set_additional_thread_info_lock + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_fix_top_level_trace_and_get_trac); + __Pyx_GIVEREF(__pyx_n_s_fix_top_level_trace_and_get_trac); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_fix_top_level_trace_and_get_trac)) __PYX_ERR(0, 9, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_trace_disp, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_fix_top_level_trace_and_get_trac); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fix_top_level_trace_and_get_trac, __pyx_t_3) < 0) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":11 + * from _pydevd_bundle.pydevd_trace_dispatch import fix_top_level_trace_and_get_trace_func + * + * from _pydevd_bundle.pydevd_additional_thread_info import _set_additional_thread_info_lock # <<<<<<<<<<<<<< + * from _pydevd_bundle.pydevd_cython cimport PyDBAdditionalThreadInfo + * from pydevd_tracing import SetTrace + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_set_additional_thread_info_lock); + __Pyx_GIVEREF(__pyx_n_s_set_additional_thread_info_lock); + if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_set_additional_thread_info_lock)) __PYX_ERR(0, 11, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_additional, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_set_additional_thread_info_lock); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_additional_thread_info_lock, __pyx_t_2) < 0) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":13 + * from _pydevd_bundle.pydevd_additional_thread_info import _set_additional_thread_info_lock + * from _pydevd_bundle.pydevd_cython cimport PyDBAdditionalThreadInfo + * from pydevd_tracing import SetTrace # <<<<<<<<<<<<<< + * + * _get_ident = threading.get_ident # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed. + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_SetTrace); + __Pyx_GIVEREF(__pyx_n_s_SetTrace); + if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_SetTrace)) __PYX_ERR(0, 13, __pyx_L1_error); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_tracing, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_SetTrace); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_SetTrace, __pyx_t_3) < 0) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":15 + * from pydevd_tracing import SetTrace + * + * _get_ident = threading.get_ident # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed. # <<<<<<<<<<<<<< + * _thread_local_info = threading.local() + * _thread_active = threading._active + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get_ident_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_ident, __pyx_t_3) < 0) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":16 + * + * _get_ident = threading.get_ident # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed. + * _thread_local_info = threading.local() # <<<<<<<<<<<<<< + * _thread_active = threading._active + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_local); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_thread_local_info, __pyx_t_3) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":17 + * _get_ident = threading.get_ident # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed. + * _thread_local_info = threading.local() + * _thread_active = threading._active # <<<<<<<<<<<<<< + * + * def clear_thread_local_info(): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_active); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_thread_active, __pyx_t_2) < 0) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":19 + * _thread_active = threading._active + * + * def clear_thread_local_info(): # <<<<<<<<<<<<<< + * global _thread_local_info + * _thread_local_info = threading.local() + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_1clear_thread_local_info, 0, __pyx_n_s_clear_thread_local_info, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__11)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clear_thread_local_info, __pyx_t_2) < 0) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ThreadInfo___reduce_cython, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__13)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_ThreadInfo, (type(self), 0xe535b68, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state) + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ThreadInfo___setstate_cython, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__15)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo); + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_FuncCodeInfo___reduce_cython, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__16)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_FuncCodeInfo, (type(self), 0x450d2d6, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state) + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_FuncCodeInfo___setstate_cython, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__17)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":152 + * + * + * def dummy_trace_dispatch(frame, str event, arg): # <<<<<<<<<<<<<< + * if event == 'call': + * if frame.f_trace is not None: + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch, 0, __pyx_n_s_dummy_trace_dispatch, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__19)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_dummy_trace_dispatch, __pyx_t_2) < 0) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":159 + * + * + * def get_thread_info_py() -> ThreadInfo: # <<<<<<<<<<<<<< + * return get_thread_info(PyEval_GetFrame()) + * + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_s_ThreadInfo) < 0) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py, 0, __pyx_n_s_get_thread_info_py, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__20)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_3, __pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_thread_info_py, __pyx_t_3) < 0) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":196 + * + * + * def decref_py(obj): # <<<<<<<<<<<<<< + * ''' + * Helper to be called from Python. + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py, 0, __pyx_n_s_decref_py, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__22)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_decref_py, __pyx_t_3) < 0) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":203 + * + * + * def get_func_code_info_py(thread_info, frame, code_obj) -> FuncCodeInfo: # <<<<<<<<<<<<<< + * ''' + * Helper to be called from Python. + */ + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 203, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_return, __pyx_n_s_FuncCodeInfo) < 0) __PYX_ERR(0, 203, __pyx_L1_error) + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py, 0, __pyx_n_s_get_func_code_info_py, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__24)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 203, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_func_code_info_py, __pyx_t_2) < 0) __PYX_ERR(0, 203, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":210 + * + * + * cdef int _code_extra_index = -1 # <<<<<<<<<<<<<< + * + * cdef FuncCodeInfo get_func_code_info(ThreadInfo thread_info, PyFrameObject * frame_obj, PyCodeObject * code_obj): + */ + __pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator__code_extra_index = -1; + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CodeLineInfo___reduce_cython, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__25)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__CodeLineInfo, (type(self), 0x5a9bcd5, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__CodeLineInfo__set_state(self, __pyx_state) + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_13_CodeLineInfo_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CodeLineInfo___setstate_cython, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__26)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CodeLineInfo); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":329 + * + * # Note: this method has a version in pure-python too. + * def _get_code_line_info(code_obj): # <<<<<<<<<<<<<< + * line_to_offset: dict = {} + * first_line: int = None + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_get_code_line_info, 0, __pyx_n_s_get_code_line_info, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__28)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 329, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_code_line_info, __pyx_t_2) < 0) __PYX_ERR(0, 329, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":351 + * # handled by the cython side in `FuncCodeInfo get_func_code_info` by providing the + * # same code info if the debugger mtime is still the same). + * _cache: dict = {} # <<<<<<<<<<<<<< + * + * def get_cached_code_obj_info_py(code_obj_py): + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cache, __pyx_t_2) < 0) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":353 + * _cache: dict = {} + * + * def get_cached_code_obj_info_py(code_obj_py): # <<<<<<<<<<<<<< + * ''' + * :return _CacheValue: + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_13get_cached_code_obj_info_py, 0, __pyx_n_s_get_cached_code_obj_info_py, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 353, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_cached_code_obj_info_py, __pyx_t_2) < 0) __PYX_ERR(0, 353, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":379 + * self.code_lines_as_set = set(code_line_info.line_to_offset) + * + * cpdef compute_force_stay_in_untraced_mode(self, breakpoints): # <<<<<<<<<<<<<< + * ''' + * :param breakpoints: + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_3compute_force_stay_in_untraced_mode, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CacheValue_compute_force_stay_i, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__32)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, __pyx_n_s_compute_force_stay_in_untraced_m, __pyx_t_2) < 0) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue); + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CacheValue___reduce_cython, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue); + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle__CacheValue, (type(self), 0xac42a46, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle__CacheValue__set_state(self, __pyx_state) + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11_CacheValue_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CacheValue___setstate_cython, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(1, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator__CacheValue); + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":401 + * return breakpoint_found, force_stay_in_untraced_mode + * + * def generate_code_with_breakpoints_py(object code_obj_py, dict breakpoints): # <<<<<<<<<<<<<< + * return generate_code_with_breakpoints(code_obj_py, breakpoints) + * + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_15generate_code_with_breakpoints_py, 0, __pyx_n_s_generate_code_with_breakpoints_p, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_generate_code_with_breakpoints_p, __pyx_t_2) < 0) __PYX_ERR(0, 401, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":471 + * return breakpoint_found, code_obj_py + * + * import sys # <<<<<<<<<<<<<< + * + * cdef bint IS_PY_39_OWNARDS = sys.version_info[:2] >= (3, 9) + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_sys, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 471, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_2) < 0) __PYX_ERR(0, 471, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":473 + * import sys + * + * cdef bint IS_PY_39_OWNARDS = sys.version_info[:2] >= (3, 9) # <<<<<<<<<<<<<< + * + * def frame_eval_func(): + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_sys); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 473, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_version_info); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 473, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetSlice(__pyx_t_3, 0, 2, NULL, NULL, &__pyx_slice__37, 0, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 473, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_tuple__38, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 473, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 473, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_18_pydevd_frame_eval_22pydevd_frame_evaluator_IS_PY_39_OWNARDS = __pyx_t_4; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":475 + * cdef bint IS_PY_39_OWNARDS = sys.version_info[:2] >= (3, 9) + * + * def frame_eval_func(): # <<<<<<<<<<<<<< + * cdef PyThreadState *state = PyThreadState_Get() + * if IS_PY_39_OWNARDS: + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_17frame_eval_func, 0, __pyx_n_s_frame_eval_func, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 475, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frame_eval_func, __pyx_t_3) < 0) __PYX_ERR(0, 475, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":484 + * + * + * def stop_frame_eval(): # <<<<<<<<<<<<<< + * cdef PyThreadState *state = PyThreadState_Get() + * state.interp.eval_frame = _PyEval_EvalFrameDefault + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_19stop_frame_eval, 0, __pyx_n_s_stop_frame_eval, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__41)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 484, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_stop_frame_eval, __pyx_t_3) < 0) __PYX_ERR(0, 484, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_ThreadInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_21__pyx_unpickle_ThreadInfo, 0, __pyx_n_s_pyx_unpickle_ThreadInfo, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_ThreadInfo, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":11 + * __pyx_unpickle_ThreadInfo__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_ThreadInfo__set_state(ThreadInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result._can_create_dummy_thread = __pyx_state[0]; __pyx_result.additional_info = __pyx_state[1]; __pyx_result.force_stay_in_untraced_mode = __pyx_state[2]; __pyx_result.fully_initialized = __pyx_state[3]; __pyx_result.inside_frame_eval = __pyx_state[4]; __pyx_result.is_pydevd_thread = __pyx_state[5]; __pyx_result.thread_trace_func = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_23__pyx_unpickle_FuncCodeInfo, 0, __pyx_n_s_pyx_unpickle_FuncCodeInfo, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_FuncCodeInfo, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":1 + * def __pyx_unpickle__CodeLineInfo(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_25__pyx_unpickle__CodeLineInfo, 0, __pyx_n_s_pyx_unpickle__CodeLineInfo, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__45)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle__CodeLineInfo, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":11 + * __pyx_unpickle__CodeLineInfo__set_state(<_CodeLineInfo> __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle__CodeLineInfo__set_state(_CodeLineInfo __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.first_line = __pyx_state[0]; __pyx_result.last_line = __pyx_state[1]; __pyx_result.line_to_offset = __pyx_state[2] + * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): + */ + __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_27__pyx_unpickle__CacheValue, 0, __pyx_n_s_pyx_unpickle__CacheValue, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle__CacheValue, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":1 + * from __future__ import print_function # <<<<<<<<<<<<<< + * from _pydev_bundle._pydev_saved_modules import threading, thread + * from _pydevd_bundle.pydevd_constants import GlobalDebuggerHolder + */ + __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init _pydevd_frame_eval.pydevd_frame_evaluator", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init _pydevd_frame_eval.pydevd_frame_evaluator"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* TupleAndListFromArray */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; itp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ +#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* PyIntBinop */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) { + CYTHON_MAYBE_UNUSED_VAR(intval); + CYTHON_MAYBE_UNUSED_VAR(inplace); + CYTHON_UNUSED_VAR(zerodivision_check); + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + + x = (long)((unsigned long)a + (unsigned long)b); + if (likely((x^a) >= 0 || (x^b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + if (unlikely(__Pyx_PyLong_IsZero(op1))) { + return __Pyx_NewRef(op2); + } + if (likely(__Pyx_PyLong_IsCompact(op1))) { + a = __Pyx_PyLong_CompactValue(op1); + } else { + const digit* digits = __Pyx_PyLong_Digits(op1); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1); + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + } + x = a + b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla + llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; +#if CYTHON_COMPILING_IN_LIMITED_API + double a = __pyx_PyFloat_AsDouble(op1); +#else + double a = PyFloat_AS_DOUBLE(op1); +#endif + double result; + + PyFPE_START_PROTECT("add", return NULL) + result = ((double)a) + (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); +} +#endif + +/* SliceObject */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, int wraparound) { + __Pyx_TypeName obj_type_name; +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is unsliceable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); +bad: + return NULL; +} + +/* GetAttr3 */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +#endif +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + int res = PyObject_GetOptionalAttr(o, n, &r); + return (res != 0) ? r : __Pyx_NewRef(d); +#else + #if CYTHON_USE_TYPE_SLOTS + if (likely(PyString_Check(n))) { + r = __Pyx_PyObject_GetAttrStrNoError(o, n); + if (unlikely(!r) && likely(!PyErr_Occurred())) { + r = __Pyx_NewRef(d); + } + return r; + } + #endif + r = PyObject_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +#endif +} + +/* PyObjectCallNoArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { + PyObject *arg[2] = {NULL, NULL}; + return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* PyObjectLookupSpecial */ +#if CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx__PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name, int with_error) { + PyObject *res; + PyTypeObject *tp = Py_TYPE(obj); +#if PY_MAJOR_VERSION < 3 + if (unlikely(PyInstance_Check(obj))) + return with_error ? __Pyx_PyObject_GetAttrStr(obj, attr_name) : __Pyx_PyObject_GetAttrStrNoError(obj, attr_name); +#endif + res = _PyType_Lookup(tp, attr_name); + if (likely(res)) { + descrgetfunc f = Py_TYPE(res)->tp_descr_get; + if (!f) { + Py_INCREF(res); + } else { + res = f(res, obj, (PyObject *)tp); + } + } else if (with_error) { + PyErr_SetObject(PyExc_AttributeError, attr_name); + } + return res; +} +#endif + +/* PyObjectSetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_setattro)) + return tp->tp_setattro(obj, attr_name, value); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_setattr)) + return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value); +#endif + return PyObject_SetAttr(obj, attr_name, value); +} +#endif + +/* RaiseUnboundLocalError */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_value = exc_info->exc_value; + exc_info->exc_value = *value; + if (tmp_value == NULL || tmp_value == Py_None) { + Py_XDECREF(tmp_value); + tmp_value = NULL; + tmp_type = NULL; + tmp_tb = NULL; + } else { + tmp_type = (PyObject*) Py_TYPE(tmp_value); + Py_INCREF(tmp_type); + #if CYTHON_COMPILING_IN_CPYTHON + tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; + Py_XINCREF(tmp_tb); + #else + tmp_tb = PyException_GetTraceback(tmp_value); + #endif + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* KeywordStringCheck */ +static int __Pyx_CheckKeywordStrings( + PyObject *kw, + const char* function_name, + int kw_allowed) +{ + PyObject* key = 0; + Py_ssize_t pos = 0; +#if CYTHON_COMPILING_IN_PYPY + if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) + goto invalid_keyword; + return 1; +#else + if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { + Py_ssize_t kwsize; +#if CYTHON_ASSUME_SAFE_MACROS + kwsize = PyTuple_GET_SIZE(kw); +#else + kwsize = PyTuple_Size(kw); + if (kwsize < 0) return 0; +#endif + if (unlikely(kwsize == 0)) + return 1; + if (!kw_allowed) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, 0); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + goto invalid_keyword; + } +#if PY_VERSION_HEX < 0x03090000 + for (pos = 0; pos < kwsize; pos++) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, pos); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } +#endif + return 1; + } + while (PyDict_Next(kw, &pos, &key, 0)) { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_Check(key))) + #endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } + if (!kw_allowed && unlikely(key)) + goto invalid_keyword; + return 1; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + return 0; +#endif +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif + return 0; +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* RaiseUnexpectedTypeError */ +static int +__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) +{ + __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, + expected, obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* ArgTypeTest */ +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* DictGetItem */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (unlikely(!j)) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_subscript) { + PyObject *r, *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return NULL; + r = mm->mp_subscript(o, key); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return sm->sq_item(o, i); + } + } +#else + if (is_list || !PyMapping_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* IterFinish */ +static CYTHON_INLINE int __Pyx_IterFinish(void) { + PyObject* exc_type; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + exc_type = __Pyx_PyErr_CurrentExceptionType(); + if (unlikely(exc_type)) { + if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) + return -1; + __Pyx_PyErr_Clear(); + return 0; + } + return 0; +} + +/* UnpackItemEndCheck */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } + return __Pyx_IterFinish(); +} + +/* PyObjectCallOneArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* PyObjectGetMethod */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + __Pyx_TypeName type_name; + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR + if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) +#elif PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (likely(descr != NULL)) { + *method = descr; + return 0; + } + type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod0 */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { + PyObject *method = NULL, *result = NULL; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_CallOneArg(method, obj); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) goto bad; + result = __Pyx_PyObject_CallNoArg(method); + Py_DECREF(method); +bad: + return result; +} + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* UnpackTupleError */ +static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(index); + } +} + +/* UnpackTuple2 */ +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { + PyObject *value1 = NULL, *value2 = NULL; +#if CYTHON_COMPILING_IN_PYPY + value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; + value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; +#else + value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); + value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); +#endif + if (decref_tuple) { + Py_DECREF(tuple); + } + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +#if CYTHON_COMPILING_IN_PYPY +bad: + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +#endif +} +static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, + int has_known_size, int decref_tuple) { + Py_ssize_t index; + PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; + iternextfunc iternext; + iter = PyObject_GetIter(tuple); + if (unlikely(!iter)) goto bad; + if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } + iternext = __Pyx_PyObject_GetIterNextFunc(iter); + value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } + value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } + if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; + Py_DECREF(iter); + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +unpacking_failed: + if (!has_known_size && __Pyx_IterFinish() == 0) + __Pyx_RaiseNeedMoreValuesError(index); +bad: + Py_XDECREF(iter); + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +} + +/* dict_iter */ +#if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +#include +#endif +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_source_is_dict) { + is_dict = is_dict || likely(PyDict_CheckExact(iterable)); + *p_source_is_dict = is_dict; + if (is_dict) { +#if !CYTHON_COMPILING_IN_PYPY + *p_orig_length = PyDict_Size(iterable); + Py_INCREF(iterable); + return iterable; +#elif PY_MAJOR_VERSION >= 3 + static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; + PyObject **pp = NULL; + if (method_name) { + const char *name = PyUnicode_AsUTF8(method_name); + if (strcmp(name, "iteritems") == 0) pp = &py_items; + else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; + else if (strcmp(name, "itervalues") == 0) pp = &py_values; + if (pp) { + if (!*pp) { + *pp = PyUnicode_FromString(name + 4); + if (!*pp) + return NULL; + } + method_name = *pp; + } + } +#endif + } + *p_orig_length = 0; + if (method_name) { + PyObject* iter; + iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); + if (!iterable) + return NULL; +#if !CYTHON_COMPILING_IN_PYPY + if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) + return iterable; +#endif + iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + return iter; + } + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_dict_iter_next( + PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { + PyObject* next_item; +#if !CYTHON_COMPILING_IN_PYPY + if (source_is_dict) { + PyObject *key, *value; + if (unlikely(orig_length != PyDict_Size(iter_obj))) { + PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); + return -1; + } + if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { + return 0; + } + if (pitem) { + PyObject* tuple = PyTuple_New(2); + if (unlikely(!tuple)) { + return -1; + } + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(tuple, 0, key); + PyTuple_SET_ITEM(tuple, 1, value); + *pitem = tuple; + } else { + if (pkey) { + Py_INCREF(key); + *pkey = key; + } + if (pvalue) { + Py_INCREF(value); + *pvalue = value; + } + } + return 1; + } else if (PyTuple_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyTuple_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else if (PyList_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyList_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else +#endif + { + next_item = PyIter_Next(iter_obj); + if (unlikely(!next_item)) { + return __Pyx_IterFinish(); + } + } + if (pitem) { + *pitem = next_item; + } else if (pkey && pvalue) { + if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) + return -1; + } else if (pkey) { + *pkey = next_item; + } else { + *pvalue = next_item; + } + return 1; +} + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + const char* module_name_str = 0; + PyObject* module_name = 0; + PyObject* module_dot = 0; + PyObject* full_name = 0; + PyErr_Clear(); + module_name_str = PyModule_GetName(module); + if (unlikely(!module_name_str)) { goto modbad; } + module_name = PyUnicode_FromString(module_name_str); + if (unlikely(!module_name)) { goto modbad; } + module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__3); + if (unlikely(!module_dot)) { goto modbad; } + full_name = PyUnicode_Concat(module_dot, name); + if (unlikely(!full_name)) { goto modbad; } + #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + { + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + goto modbad; + value = PyObject_GetItem(modules, full_name); + } + #else + value = PyImport_GetModule(full_name); + #endif + modbad: + Py_XDECREF(full_name); + Py_XDECREF(module_dot); + Py_XDECREF(module_name); + } + if (unlikely(!value)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* HasAttr */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (!r) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} + +/* FixUpExtensionType */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* ValidateBasesTuple */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { + Py_ssize_t i, n; +#if CYTHON_ASSUME_SAFE_MACROS + n = PyTuple_GET_SIZE(bases); +#else + n = PyTuple_Size(bases); + if (n < 0) return -1; +#endif + for (i = 1; i < n; i++) + { +#if CYTHON_AVOID_BORROWED_REFS + PyObject *b0 = PySequence_GetItem(bases, i); + if (!b0) return -1; +#elif CYTHON_ASSUME_SAFE_MACROS + PyObject *b0 = PyTuple_GET_ITEM(bases, i); +#else + PyObject *b0 = PyTuple_GetItem(bases, i); + if (!b0) return -1; +#endif + PyTypeObject *b; +#if PY_MAJOR_VERSION < 3 + if (PyClass_Check(b0)) + { + PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", + PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } +#endif + b = (PyTypeObject*) b0; + if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); + __Pyx_DECREF_TypeName(b_name); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + if (dictoffset == 0) + { + Py_ssize_t b_dictoffset = 0; +#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + b_dictoffset = b->tp_dictoffset; +#else + PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); + if (!py_b_dictoffset) goto dictoffset_return; + b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); + Py_DECREF(py_b_dictoffset); + if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; +#endif + if (b_dictoffset) { + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "extension type '%.200s' has no __dict__ slot, " + "but base type '" __Pyx_FMT_TYPENAME "' has: " + "either add 'cdef dict __dict__' to the extension type " + "or add '__slots__ = [...]' to the base type", + type_name, b_name); + __Pyx_DECREF_TypeName(b_name); + } +#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) + dictoffset_return: +#endif +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + } +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + } + return 0; +} +#endif + +/* PyType_Ready */ +static int __Pyx_PyType_Ready(PyTypeObject *t) { +#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) + (void)__Pyx_PyObject_CallMethod0; +#if CYTHON_USE_TYPE_SPECS + (void)__Pyx_validate_bases_tuple; +#endif + return PyType_Ready(t); +#else + int r; + PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); + if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) + return -1; +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + { + int gc_was_enabled; + #if PY_VERSION_HEX >= 0x030A00b1 + gc_was_enabled = PyGC_Disable(); + (void)__Pyx_PyObject_CallMethod0; + #else + PyObject *ret, *py_status; + PyObject *gc = NULL; + #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) + gc = PyImport_GetModule(__pyx_kp_u_gc); + #endif + if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); + if (unlikely(!gc)) return -1; + py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); + if (unlikely(!py_status)) { + Py_DECREF(gc); + return -1; + } + gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); + Py_DECREF(py_status); + if (gc_was_enabled > 0) { + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); + if (unlikely(!ret)) { + Py_DECREF(gc); + return -1; + } + Py_DECREF(ret); + } else if (unlikely(gc_was_enabled == -1)) { + Py_DECREF(gc); + return -1; + } + #endif + t->tp_flags |= Py_TPFLAGS_HEAPTYPE; +#if PY_VERSION_HEX >= 0x030A0000 + t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; +#endif +#else + (void)__Pyx_PyObject_CallMethod0; +#endif + r = PyType_Ready(t); +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + #if PY_VERSION_HEX >= 0x030A00b1 + if (gc_was_enabled) + PyGC_Enable(); + #else + if (gc_was_enabled) { + PyObject *tp, *v, *tb; + PyErr_Fetch(&tp, &v, &tb); + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); + if (likely(ret || r == -1)) { + Py_XDECREF(ret); + PyErr_Restore(tp, v, tb); + } else { + Py_XDECREF(tp); + Py_XDECREF(v); + Py_XDECREF(tb); + r = -1; + } + } + Py_DECREF(gc); + #endif + } +#endif + return r; +#endif +} + +/* PyObject_GenericGetAttrNoDict */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, attr_name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(attr_name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* SetVTable */ +static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { + PyObject *ob = PyCapsule_New(vtable, 0, 0); + if (unlikely(!ob)) + goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) +#else + if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) +#endif + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* GetVTable */ +static void* __Pyx_GetVtable(PyTypeObject *type) { + void* ptr; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); +#else + PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); +#endif + if (!ob) + goto bad; + ptr = PyCapsule_GetPointer(ob, 0); + if (!ptr && !PyErr_Occurred()) + PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); + Py_DECREF(ob); + return ptr; +bad: + Py_XDECREF(ob); + return NULL; +} + +/* MergeVTables */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type) { + int i; + void** base_vtables; + __Pyx_TypeName tp_base_name; + __Pyx_TypeName base_name; + void* unknown = (void*)-1; + PyObject* bases = type->tp_bases; + int base_depth = 0; + { + PyTypeObject* base = type->tp_base; + while (base) { + base_depth += 1; + base = base->tp_base; + } + } + base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); + base_vtables[0] = unknown; + for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { + void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); + if (base_vtable != NULL) { + int j; + PyTypeObject* base = type->tp_base; + for (j = 0; j < base_depth; j++) { + if (base_vtables[j] == unknown) { + base_vtables[j] = __Pyx_GetVtable(base); + base_vtables[j + 1] = unknown; + } + if (base_vtables[j] == base_vtable) { + break; + } else if (base_vtables[j] == NULL) { + goto bad; + } + base = base->tp_base; + } + } + } + PyErr_Clear(); + free(base_vtables); + return 0; +bad: + tp_base_name = __Pyx_PyType_GetName(type->tp_base); + base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); + PyErr_Format(PyExc_TypeError, + "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); + __Pyx_DECREF_TypeName(tp_base_name); + __Pyx_DECREF_TypeName(base_name); + free(base_vtables); + return -1; +} +#endif + +/* SetupReduce */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; + PyObject *getstate = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); +#else + getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); + if (!getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (getstate) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); +#else + object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); + if (!object_getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (object_getstate != getstate) { + goto __PYX_GOOD; + } + } +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) { + __Pyx_TypeName type_obj_name = + __Pyx_PyType_GetName((PyTypeObject*)type_obj); + PyErr_Format(PyExc_RuntimeError, + "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); + __Pyx_DECREF_TypeName(type_obj_name); + } + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); + Py_XDECREF(object_getstate); + Py_XDECREF(getstate); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} +#endif + +/* TypeImport */ +#ifndef __PYX_HAVE_RT_ImportType_3_0_11 +#define __PYX_HAVE_RT_ImportType_3_0_11 +static PyTypeObject *__Pyx_ImportType_3_0_11(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_11 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_11 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_11 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* ImportDottedModule */ +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__10; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FetchSharedCythonModule */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ +static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ +#if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if PY_VERSION_HEX >= 0x030d00A4 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* CLineInTraceback */ +#ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +/* CIntFromPyVerify */ +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4 + if (is_unsigned) { + return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1); + } else { + return PyLong_FromNativeBytes(bytes, sizeof(value), -1); + } +#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + int one = 1; int little = (int)*(unsigned char *)&one; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + int one = 1; int little = (int)*(unsigned char *)&one; + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } +#endif + if (unlikely(!PyLong_Check(x))) { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + int ret = -1; +#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API + Py_ssize_t bytes_copied = PyLong_AsNativeBytes( + x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0)); + if (unlikely(bytes_copied == -1)) { + } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) { + goto raise_overflow; + } else { + ret = 0; + } +#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)x, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *v; + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (likely(PyLong_CheckExact(x))) { + v = __Pyx_NewRef(x); + } else { + v = PyNumber_Long(x); + if (unlikely(!v)) return (int) -1; + assert(PyLong_CheckExact(v)); + } + { + int result = PyObject_RichCompareBool(v, Py_False, Py_LT); + if (unlikely(result < 0)) { + Py_DECREF(v); + return (int) -1; + } + is_negative = result == 1; + } + if (is_unsigned && unlikely(is_negative)) { + Py_DECREF(v); + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + Py_DECREF(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = v; + } + v = NULL; + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + long idigit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + val |= ((int) idigit) << bits; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + } + Py_DECREF(shift); shift = NULL; + Py_DECREF(mask); mask = NULL; + { + long idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + } + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + if (unlikely(ret)) + return (int) -1; + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } +#endif + if (unlikely(!PyLong_Check(x))) { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + int ret = -1; +#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API + Py_ssize_t bytes_copied = PyLong_AsNativeBytes( + x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0)); + if (unlikely(bytes_copied == -1)) { + } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) { + goto raise_overflow; + } else { + ret = 0; + } +#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)x, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *v; + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (likely(PyLong_CheckExact(x))) { + v = __Pyx_NewRef(x); + } else { + v = PyNumber_Long(x); + if (unlikely(!v)) return (long) -1; + assert(PyLong_CheckExact(v)); + } + { + int result = PyObject_RichCompareBool(v, Py_False, Py_LT); + if (unlikely(result < 0)) { + Py_DECREF(v); + return (long) -1; + } + is_negative = result == 1; + } + if (is_unsigned && unlikely(is_negative)) { + Py_DECREF(v); + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + Py_DECREF(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = v; + } + v = NULL; + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + long idigit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + val |= ((long) idigit) << bits; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + } + Py_DECREF(shift); shift = NULL; + Py_DECREF(mask); mask = NULL; + { + long idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + } + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + if (unlikely(ret)) + return (long) -1; + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4 + if (is_unsigned) { + return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1); + } else { + return PyLong_FromNativeBytes(bytes, sizeof(value), -1); + } +#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + int one = 1; int little = (int)*(unsigned char *)&one; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + int one = 1; int little = (int)*(unsigned char *)&one; + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* FormatTypeName */ +#if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__47); + } + return name; +} +#endif + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ +#if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd new file mode 100644 index 0000000..d8fb5f2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd @@ -0,0 +1,131 @@ +from cpython.mem cimport PyMem_Malloc, PyMem_Free + +cdef extern from *: + ctypedef void PyObject + ctypedef struct PyCodeObject: + int co_argcount; # arguments, except *args */ + int co_kwonlyargcount; # keyword only arguments */ + int co_nlocals; # local variables */ + int co_stacksize; # entries needed for evaluation stack */ + int co_flags; # CO_..., see below */ + int co_firstlineno; # first source line number */ + PyObject *co_code; # instruction opcodes */ + PyObject *co_consts; # list (constants used) */ + PyObject *co_names; # list of strings (names used) */ + PyObject *co_varnames; # tuple of strings (local variable names) */ + PyObject *co_freevars; # tuple of strings (free variable names) */ + PyObject *co_cellvars; # tuple of strings (cell variable names) */ + unsigned char *co_cell2arg; # Maps cell vars which are arguments. */ + PyObject *co_filename; # unicode (where it was loaded from) */ + PyObject *co_name; # unicode (name, for reference) */ + PyObject *co_lnotab; # string (encoding addr<->lineno mapping) See + # Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; # for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; # to support weakrefs to code objects */ + void *co_extra; + +cdef extern from "frameobject.h": + ctypedef struct PyFrameObject: + PyFrameObject *f_back + PyCodeObject *f_code # code segment + PyObject *f_builtins # builtin symbol table (PyDictObject) + PyObject *f_globals # global symbol table (PyDictObject) */ + PyObject *f_locals # local symbol table (any mapping) */ + PyObject **f_valuestack # + PyObject **f_stacktop + PyObject *f_trace # Trace function */ + PyObject *f_exc_type + PyObject *f_exc_value + PyObject *f_exc_traceback + PyObject *f_gen; + + int f_lasti; #/* Last instruction if called */ + int f_lineno; #/* Current line number */ + int f_iblock; #/* index in f_blockstack */ + char f_executing; #/* whether the frame is still executing */ + PyObject *f_localsplus[1]; + +cdef extern from "release_mem.h": + void release_co_extra(void *) + +cdef extern from "code.h": + ctypedef void freefunc(void *) + int _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra) + int _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) + +# TODO: Things are in a different place for Python 3.11. +# cdef extern from "cpython/code.h": +# ctypedef void freefunc(void *) +# int _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra) +# int _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) + +cdef extern from "Python.h": + void Py_INCREF(object o) + void Py_DECREF(object o) + object PyImport_ImportModule(char *name) + PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...) + object PyObject_GetAttrString(object o, char *attr_name) + +cdef extern from "pystate.h": + # ctypedef PyObject* _PyFrameEvalFunction(PyThreadState* tstate, PyFrameObject *frame, int exc) + # ctypedef PyObject* _PyFrameEvalFunction(PyFrameObject *frame, int exc) + ctypedef PyObject* _PyFrameEvalFunction(...) + + ctypedef struct PyInterpreterState: + PyInterpreterState *next + PyInterpreterState *tstate_head + + PyObject *modules + + PyObject *modules_by_index + PyObject *sysdict + PyObject *builtins + PyObject *importlib + + PyObject *codec_search_path + PyObject *codec_search_cache + PyObject *codec_error_registry + int codecs_initialized + int fscodec_initialized + + int dlopenflags + + PyObject *builtins_copy + PyObject *import_func + # Initialized to PyEval_EvalFrameDefault(). + _PyFrameEvalFunction eval_frame + + ctypedef struct PyThreadState: + PyThreadState *prev + PyThreadState *next + PyInterpreterState *interp + # ... + + PyThreadState *PyThreadState_Get() + +cdef extern from "ceval.h": + ''' +#if PY_VERSION_HEX >= 0x03090000 +PyObject * noop(PyFrameObject *frame, int exc) { + return NULL; +} +#define CALL_EvalFrameDefault_38(a, b) noop(a, b) +#define CALL_EvalFrameDefault_39(a, b, c) _PyEval_EvalFrameDefault(a, b, c) +#else +PyObject * noop(PyThreadState* tstate, PyFrameObject *frame, int exc) { + return NULL; +} +#define CALL_EvalFrameDefault_39(a, b, c) noop(a, b, c) +#define CALL_EvalFrameDefault_38(a, b) _PyEval_EvalFrameDefault(a, b) +#endif + ''' + + int _PyEval_RequestCodeExtraIndex(freefunc) + PyFrameObject *PyEval_GetFrame() + PyObject* PyEval_CallFunction(PyObject *callable, const char *format, ...) + + # PyObject* _PyEval_EvalFrameDefault(PyThreadState* tstate, PyFrameObject *frame, int exc) + # PyObject* _PyEval_EvalFrameDefault(PyFrameObject *frame, int exc) + PyObject* _PyEval_EvalFrameDefault(...) + PyObject* CALL_EvalFrameDefault_38(PyFrameObject *frame, int exc) # Actually a macro. + PyObject* CALL_EvalFrameDefault_39(PyThreadState* tstate, PyFrameObject *frame, int exc) # Actually a macro. diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx new file mode 100644 index 0000000..1bbf9f8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx @@ -0,0 +1,613 @@ +from __future__ import print_function +from _pydev_bundle._pydev_saved_modules import threading, thread +from _pydevd_bundle.pydevd_constants import GlobalDebuggerHolder +import dis +import sys +from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder +from _pydevd_frame_eval.pydevd_modify_bytecode import DebugHelper, insert_pydevd_breaks +from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER +from _pydevd_bundle.pydevd_trace_dispatch import fix_top_level_trace_and_get_trace_func + +from _pydevd_bundle.pydevd_additional_thread_info import _set_additional_thread_info_lock +from _pydevd_bundle.pydevd_cython cimport PyDBAdditionalThreadInfo +from pydevd_tracing import SetTrace + +_get_ident = threading.get_ident # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed. +_thread_local_info = threading.local() +_thread_active = threading._active + +def clear_thread_local_info(): + global _thread_local_info + _thread_local_info = threading.local() + + +cdef class ThreadInfo: + + cdef public PyDBAdditionalThreadInfo additional_info + cdef public bint is_pydevd_thread + cdef public int inside_frame_eval + cdef public bint fully_initialized + cdef public object thread_trace_func + cdef bint _can_create_dummy_thread + + # Note: whenever get_func_code_info is called, this value is reset (we're using + # it as a thread-local value info). + # If True the debugger should not go into trace mode even if the new + # code for a function is None and there are breakpoints. + cdef public bint force_stay_in_untraced_mode + + cdef initialize(self, PyFrameObject * frame_obj): + # Places that create a ThreadInfo should verify that + # a current Python frame is being executed! + assert frame_obj != NULL + + self.additional_info = None + self.is_pydevd_thread = False + self.inside_frame_eval = 0 + self.fully_initialized = False + self.thread_trace_func = None + + # Get the root (if it's not a Thread initialized from the threading + # module, create the dummy thread entry so that we can debug it -- + # otherwise, we have to wait for the threading module itself to + # create the Thread entry). + while frame_obj.f_back != NULL: + frame_obj = frame_obj.f_back + + basename = frame_obj.f_code.co_filename + i = basename.rfind('/') + j = basename.rfind('\\') + if j > i: + i = j + if i >= 0: + basename = basename[i + 1:] + # remove ext + i = basename.rfind('.') + if i >= 0: + basename = basename[:i] + + co_name = frame_obj.f_code.co_name + + # In these cases we cannot create a dummy thread (an actual + # thread will be created later or tracing will already be set). + if basename == 'threading' and co_name in ('__bootstrap', '_bootstrap', '__bootstrap_inner', '_bootstrap_inner'): + self._can_create_dummy_thread = False + elif basename == 'pydev_monkey' and co_name == '__call__': + self._can_create_dummy_thread = False + elif basename == 'pydevd' and co_name in ('run', 'main', '_exec'): + self._can_create_dummy_thread = False + elif basename == 'pydevd_tracing': + self._can_create_dummy_thread = False + else: + self._can_create_dummy_thread = True + + # print('Can create dummy thread for thread started in: %s %s' % (basename, co_name)) + + cdef initialize_if_possible(self): + # Don't call threading.currentThread because if we're too early in the process + # we may create a dummy thread. + self.inside_frame_eval += 1 + + try: + thread_ident = _get_ident() + t = _thread_active.get(thread_ident) + if t is None: + if self._can_create_dummy_thread: + # Initialize the dummy thread and set the tracing (both are needed to + # actually stop on breakpoints). + t = threading.current_thread() + SetTrace(dummy_trace_dispatch) + else: + return # Cannot initialize until thread becomes active. + + if getattr(t, 'is_pydev_daemon_thread', False): + self.is_pydevd_thread = True + self.fully_initialized = True + else: + try: + additional_info = t.additional_info + if additional_info is None: + raise AttributeError() + except: + with _set_additional_thread_info_lock: + # If it's not there, set it within a lock to avoid any racing + # conditions. + additional_info = getattr(thread, 'additional_info', None) + if additional_info is None: + additional_info = PyDBAdditionalThreadInfo() + t.additional_info = additional_info + self.additional_info = additional_info + self.fully_initialized = True + finally: + self.inside_frame_eval -= 1 + + +cdef class FuncCodeInfo: + + cdef public str co_filename + cdef public str co_name + cdef public str canonical_normalized_filename + cdef bint always_skip_code + cdef public bint breakpoint_found + cdef public object new_code + + # When breakpoints_mtime != PyDb.mtime the validity of breakpoints have + # to be re-evaluated (if invalid a new FuncCodeInfo must be created and + # tracing can't be disabled for the related frames). + cdef public int breakpoints_mtime + + def __init__(self): + self.co_filename = '' + self.canonical_normalized_filename = '' + self.always_skip_code = False + + # If breakpoints are found but new_code is None, + # this means we weren't able to actually add the code + # where needed, so, fallback to tracing. + self.breakpoint_found = False + self.new_code = None + self.breakpoints_mtime = -1 + + +def dummy_trace_dispatch(frame, str event, arg): + if event == 'call': + if frame.f_trace is not None: + return frame.f_trace(frame, event, arg) + return None + + +def get_thread_info_py() -> ThreadInfo: + return get_thread_info(PyEval_GetFrame()) + + +cdef ThreadInfo get_thread_info(PyFrameObject * frame_obj): + ''' + Provides thread-related info. + + May return None if the thread is still not active. + ''' + cdef ThreadInfo thread_info + try: + # Note: changing to a `dict[thread.ident] = thread_info` had almost no + # effect in the performance. + thread_info = _thread_local_info.thread_info + except: + if frame_obj == NULL: + return None + thread_info = ThreadInfo() + thread_info.initialize(frame_obj) + thread_info.inside_frame_eval += 1 + try: + _thread_local_info.thread_info = thread_info + + # Note: _code_extra_index is not actually thread-related, + # but this is a good point to initialize it. + global _code_extra_index + if _code_extra_index == -1: + _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra) + + thread_info.initialize_if_possible() + finally: + thread_info.inside_frame_eval -= 1 + + return thread_info + + +def decref_py(obj): + ''' + Helper to be called from Python. + ''' + Py_DECREF(obj) + + +def get_func_code_info_py(thread_info, frame, code_obj) -> FuncCodeInfo: + ''' + Helper to be called from Python. + ''' + return get_func_code_info( thread_info, frame, code_obj) + + +cdef int _code_extra_index = -1 + +cdef FuncCodeInfo get_func_code_info(ThreadInfo thread_info, PyFrameObject * frame_obj, PyCodeObject * code_obj): + ''' + Provides code-object related info. + + Stores the gathered info in a cache in the code object itself. Note that + multiple threads can get the same info. + + get_thread_info() *must* be called at least once before get_func_code_info() + to initialize _code_extra_index. + + ''' + # f_code = code_obj + # DEBUG = f_code.co_filename.endswith('_debugger_case_multiprocessing.py') + # if DEBUG: + # print('get_func_code_info', f_code.co_name, f_code.co_filename) + + cdef object main_debugger = GlobalDebuggerHolder.global_dbg + thread_info.force_stay_in_untraced_mode = False # This is an output value of the function. + + cdef PyObject * extra + _PyCode_GetExtra( code_obj, _code_extra_index, & extra) + if extra is not NULL: + extra_obj = extra + if extra_obj is not NULL: + func_code_info_obj = extra_obj + if func_code_info_obj.breakpoints_mtime == main_debugger.mtime: + # if DEBUG: + # print('get_func_code_info: matched mtime', f_code.co_name, f_code.co_filename) + + return func_code_info_obj + + cdef str co_filename = code_obj.co_filename + cdef str co_name = code_obj.co_name + cdef dict cache_file_type + cdef tuple cache_file_type_key + + func_code_info = FuncCodeInfo() + func_code_info.breakpoints_mtime = main_debugger.mtime + + func_code_info.co_filename = co_filename + func_code_info.co_name = co_name + + if not func_code_info.always_skip_code: + try: + abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + except: + abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(frame_obj) + + func_code_info.canonical_normalized_filename = abs_path_real_path_and_base[1] + + cache_file_type = main_debugger.get_cache_file_type() + # Note: this cache key must be the same from PyDB.get_file_type() -- see it for comments + # on the cache. + cache_file_type_key = (frame_obj.f_code.co_firstlineno, abs_path_real_path_and_base[0], frame_obj.f_code) + try: + file_type = cache_file_type[cache_file_type_key] # Make it faster + except: + file_type = main_debugger.get_file_type(frame_obj, abs_path_real_path_and_base) # we don't want to debug anything related to pydevd + + if file_type is not None: + func_code_info.always_skip_code = True + + if not func_code_info.always_skip_code: + if main_debugger is not None: + + breakpoints: dict = main_debugger.breakpoints.get(func_code_info.canonical_normalized_filename) + function_breakpoint: object = main_debugger.function_breakpoint_name_to_breakpoint.get(func_code_info.co_name) + # print('\n---') + # print(main_debugger.breakpoints) + # print(func_code_info.canonical_normalized_filename) + # print(main_debugger.breakpoints.get(func_code_info.canonical_normalized_filename)) + code_obj_py: object = code_obj + cached_code_obj_info: object = _cache.get(code_obj_py) + if cached_code_obj_info: + # The cache is for new code objects, so, in this case it's already + # using the new code and we can't change it as this is a generator! + # There's still a catch though: even though we don't replace the code, + # we may not want to go into tracing mode (as would usually happen + # when the new_code is None). + func_code_info.new_code = None + breakpoint_found, thread_info.force_stay_in_untraced_mode = \ + cached_code_obj_info.compute_force_stay_in_untraced_mode(breakpoints) + func_code_info.breakpoint_found = breakpoint_found + + elif function_breakpoint: + # Go directly into tracing mode + func_code_info.breakpoint_found = True + func_code_info.new_code = None + + elif breakpoints: + # if DEBUG: + # print('found breakpoints', code_obj_py.co_name, breakpoints) + + # Note: new_code can be None if unable to generate. + # It should automatically put the new code object in the cache. + breakpoint_found, func_code_info.new_code = generate_code_with_breakpoints(code_obj_py, breakpoints) + func_code_info.breakpoint_found = breakpoint_found + + Py_INCREF(func_code_info) + _PyCode_SetExtra( code_obj, _code_extra_index, func_code_info) + + return func_code_info + + +cdef class _CodeLineInfo: + + cdef public dict line_to_offset + cdef public int first_line + cdef public int last_line + + def __init__(self, dict line_to_offset, int first_line, int last_line): + self.line_to_offset = line_to_offset + self.first_line = first_line + self.last_line = last_line + + +# Note: this method has a version in pure-python too. +def _get_code_line_info(code_obj): + line_to_offset: dict = {} + first_line: int = None + last_line: int = None + + cdef int offset + cdef int line + + for offset, line in dis.findlinestarts(code_obj): + line_to_offset[line] = offset + + if line_to_offset: + first_line = min(line_to_offset) + last_line = max(line_to_offset) + return _CodeLineInfo(line_to_offset, first_line, last_line) + + +# Note: this is a cache where the key is the code objects we create ourselves so that +# we always return the same code object for generators. +# (so, we don't have a cache from the old code to the new info -- that's actually +# handled by the cython side in `FuncCodeInfo get_func_code_info` by providing the +# same code info if the debugger mtime is still the same). +_cache: dict = {} + +def get_cached_code_obj_info_py(code_obj_py): + ''' + :return _CacheValue: + :note: on cython use _cache.get(code_obj_py) directly. + ''' + return _cache.get(code_obj_py) + + +cdef class _CacheValue(object): + + cdef public object code_obj_py + cdef public _CodeLineInfo code_line_info + cdef public set breakpoints_hit_at_lines + cdef public set code_lines_as_set + + def __init__(self, object code_obj_py, _CodeLineInfo code_line_info, set breakpoints_hit_at_lines): + ''' + :param code_obj_py: + :param _CodeLineInfo code_line_info: + :param set[int] breakpoints_hit_at_lines: + ''' + self.code_obj_py = code_obj_py + self.code_line_info = code_line_info + self.breakpoints_hit_at_lines = breakpoints_hit_at_lines + self.code_lines_as_set = set(code_line_info.line_to_offset) + + cpdef compute_force_stay_in_untraced_mode(self, breakpoints): + ''' + :param breakpoints: + set(breakpoint_lines) or dict(breakpoint_line->breakpoint info) + :return tuple(breakpoint_found, force_stay_in_untraced_mode) + ''' + cdef bint force_stay_in_untraced_mode + cdef bint breakpoint_found + cdef set target_breakpoints + + force_stay_in_untraced_mode = False + + target_breakpoints = self.code_lines_as_set.intersection(breakpoints) + breakpoint_found = bool(target_breakpoints) + + if not breakpoint_found: + force_stay_in_untraced_mode = True + else: + force_stay_in_untraced_mode = self.breakpoints_hit_at_lines.issuperset(set(breakpoints)) + + return breakpoint_found, force_stay_in_untraced_mode + +def generate_code_with_breakpoints_py(object code_obj_py, dict breakpoints): + return generate_code_with_breakpoints(code_obj_py, breakpoints) + +# DEBUG = True +# debug_helper = DebugHelper() + +cdef generate_code_with_breakpoints(object code_obj_py, dict breakpoints): + ''' + :param breakpoints: + dict where the keys are the breakpoint lines. + :return tuple(breakpoint_found, new_code) + ''' + # The cache is needed for generator functions, because after each yield a new frame + # is created but the former code object is used (so, check if code_to_modify is + # already there and if not cache based on the new code generated). + + cdef bint success + cdef int breakpoint_line + cdef bint breakpoint_found + cdef _CacheValue cache_value + cdef set breakpoints_hit_at_lines + cdef dict line_to_offset + + assert code_obj_py not in _cache, 'If a code object is cached, that same code object must be reused.' + +# if DEBUG: +# initial_code_obj_py = code_obj_py + + code_line_info = _get_code_line_info(code_obj_py) + + success = True + + breakpoints_hit_at_lines = set() + line_to_offset = code_line_info.line_to_offset + + for breakpoint_line in breakpoints: + if breakpoint_line in line_to_offset: + breakpoints_hit_at_lines.add(breakpoint_line) + + if breakpoints_hit_at_lines: + success, new_code = insert_pydevd_breaks( + code_obj_py, + breakpoints_hit_at_lines, + code_line_info + ) + + if not success: + code_obj_py = None + else: + code_obj_py = new_code + + breakpoint_found = bool(breakpoints_hit_at_lines) + if breakpoint_found and success: +# if DEBUG: +# op_number = debug_helper.write_dis( +# 'inserting code, breaks at: %s' % (list(breakpoints),), +# initial_code_obj_py +# ) +# +# debug_helper.write_dis( +# 'after inserting code, breaks at: %s' % (list(breakpoints,)), +# code_obj_py, +# op_number=op_number, +# ) + + cache_value = _CacheValue(code_obj_py, code_line_info, breakpoints_hit_at_lines) + _cache[code_obj_py] = cache_value + + return breakpoint_found, code_obj_py + +import sys + +cdef bint IS_PY_39_OWNARDS = sys.version_info[:2] >= (3, 9) + +def frame_eval_func(): + cdef PyThreadState *state = PyThreadState_Get() + if IS_PY_39_OWNARDS: + state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_39 + else: + state.interp.eval_frame = <_PyFrameEvalFunction *> get_bytecode_while_frame_eval_38 + dummy_tracing_holder.set_trace_func(dummy_trace_dispatch) + + +def stop_frame_eval(): + cdef PyThreadState *state = PyThreadState_Get() + state.interp.eval_frame = _PyEval_EvalFrameDefault + +# During the build we'll generate 2 versions of the code below so that we're compatible with +# Python 3.9, which receives a "PyThreadState* tstate" as the first parameter and Python 3.6-3.8 +# which doesn't. +### TEMPLATE_START +cdef PyObject * get_bytecode_while_frame_eval(PyFrameObject * frame_obj, int exc): + ''' + This function makes the actual evaluation and changes the bytecode to a version + where programmatic breakpoints are added. + ''' + if GlobalDebuggerHolder is None or _thread_local_info is None or exc: + # Sometimes during process shutdown these global variables become None + return CALL_EvalFrameDefault + + # co_filename: str = frame_obj.f_code.co_filename + # if co_filename.endswith('threading.py'): + # return CALL_EvalFrameDefault + + cdef ThreadInfo thread_info + cdef int STATE_SUSPEND = 2 + cdef int CMD_STEP_INTO = 107 + cdef int CMD_STEP_OVER = 108 + cdef int CMD_STEP_OVER_MY_CODE = 159 + cdef int CMD_STEP_INTO_MY_CODE = 144 + cdef int CMD_STEP_INTO_COROUTINE = 206 + cdef int CMD_SMART_STEP_INTO = 128 + cdef bint can_skip = True + try: + thread_info = _thread_local_info.thread_info + except: + thread_info = get_thread_info(frame_obj) + if thread_info is None: + return CALL_EvalFrameDefault + + if thread_info.inside_frame_eval: + return CALL_EvalFrameDefault + + if not thread_info.fully_initialized: + thread_info.initialize_if_possible() + if not thread_info.fully_initialized: + return CALL_EvalFrameDefault + + # Can only get additional_info when fully initialized. + cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info + if thread_info.is_pydevd_thread or additional_info.is_tracing: + # Make sure that we don't trace pydevd threads or inside our own calls. + return CALL_EvalFrameDefault + + # frame = frame_obj + # DEBUG = frame.f_code.co_filename.endswith('_debugger_case_tracing.py') + # if DEBUG: + # print('get_bytecode_while_frame_eval', frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename) + + thread_info.inside_frame_eval += 1 + additional_info.is_tracing = True + try: + main_debugger: object = GlobalDebuggerHolder.global_dbg + if main_debugger is None: + return CALL_EvalFrameDefault + frame = frame_obj + + if thread_info.thread_trace_func is None: + trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame) + if apply_to_global: + thread_info.thread_trace_func = trace_func + + if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or \ + main_debugger.break_on_caught_exceptions or \ + main_debugger.break_on_user_uncaught_exceptions or \ + main_debugger.has_plugin_exception_breaks or \ + main_debugger.signature_factory or \ + additional_info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop: + + # if DEBUG: + # print('get_bytecode_while_frame_eval enabled trace') + if thread_info.thread_trace_func is not None: + frame.f_trace = thread_info.thread_trace_func + else: + frame.f_trace = main_debugger.trace_dispatch + else: + func_code_info: FuncCodeInfo = get_func_code_info(thread_info, frame_obj, frame_obj.f_code) + # if DEBUG: + # print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code) + if not func_code_info.always_skip_code: + + if main_debugger.has_plugin_line_breaks or main_debugger.has_plugin_exception_breaks: + can_skip = main_debugger.plugin.can_skip(main_debugger, frame_obj) + + if not can_skip: + # if DEBUG: + # print('get_bytecode_while_frame_eval not can_skip') + if thread_info.thread_trace_func is not None: + frame.f_trace = thread_info.thread_trace_func + else: + frame.f_trace = main_debugger.trace_dispatch + + if can_skip and func_code_info.breakpoint_found: + # if DEBUG: + # print('get_bytecode_while_frame_eval new_code', func_code_info.new_code) + if not thread_info.force_stay_in_untraced_mode: + # If breakpoints are found but new_code is None, + # this means we weren't able to actually add the code + # where needed, so, fallback to tracing. + if func_code_info.new_code is None: + if thread_info.thread_trace_func is not None: + frame.f_trace = thread_info.thread_trace_func + else: + frame.f_trace = main_debugger.trace_dispatch + else: + # print('Using frame eval break for', frame_obj.f_code.co_name) + update_globals_dict( frame_obj.f_globals) + Py_INCREF(func_code_info.new_code) + old = frame_obj.f_code + frame_obj.f_code = func_code_info.new_code + Py_DECREF(old) + else: + # When we're forcing to stay in traced mode we need to + # update the globals dict (because this means that we're reusing + # a previous code which had breakpoints added in a new frame). + update_globals_dict( frame_obj.f_globals) + + finally: + thread_info.inside_frame_eval -= 1 + additional_info.is_tracing = False + + return CALL_EvalFrameDefault +### TEMPLATE_END diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_tracing.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_tracing.py new file mode 100644 index 0000000..a14f999 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_tracing.py @@ -0,0 +1,121 @@ +import sys + +from _pydev_bundle import pydev_log +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle.pydevd_comm import get_global_debugger +from pydevd_file_utils import get_abs_path_real_path_and_base_from_frame, NORM_PATHS_AND_BASE_CONTAINER +from _pydevd_bundle.pydevd_additional_thread_info import set_additional_thread_info + + +class DummyTracingHolder: + dummy_trace_func = None + + def set_trace_func(self, trace_func): + self.dummy_trace_func = trace_func + + +dummy_tracing_holder = DummyTracingHolder() + + +def update_globals_dict(globals_dict): + new_globals = {"_pydev_stop_at_break": _pydev_stop_at_break} + globals_dict.update(new_globals) + + +def _get_line_for_frame(frame): + # it's absolutely necessary to reset tracing function for frame in order to get the real line number + tracing_func = frame.f_trace + frame.f_trace = None + line = frame.f_lineno + frame.f_trace = tracing_func + return line + + +def _pydev_stop_at_break(line): + frame = sys._getframe(1) + # print('pydevd SET TRACING at ', line, 'curr line', frame.f_lineno) + t = threading.current_thread() + try: + additional_info = t.additional_info + except: + additional_info = set_additional_thread_info(t) + + if additional_info.is_tracing: + return + + additional_info.is_tracing += 1 + try: + py_db = get_global_debugger() + if py_db is None: + return + + pydev_log.debug("Setting f_trace due to frame eval mode in file: %s on line %s", frame.f_code.co_filename, line) + additional_info.trace_suspend_type = "frame_eval" + + pydevd_frame_eval_cython_wrapper = sys.modules["_pydevd_frame_eval.pydevd_frame_eval_cython_wrapper"] + thread_info = pydevd_frame_eval_cython_wrapper.get_thread_info_py() + if thread_info.thread_trace_func is not None: + frame.f_trace = thread_info.thread_trace_func + else: + frame.f_trace = py_db.get_thread_local_trace_func() + finally: + additional_info.is_tracing -= 1 + + +def _pydev_needs_stop_at_break(line): + """ + We separate the functionality into 2 functions so that we can generate a bytecode which + generates a spurious line change so that we can do: + + if _pydev_needs_stop_at_break(): + # Set line to line -1 + _pydev_stop_at_break() + # then, proceed to go to the current line + # (which will then trigger a line event). + """ + t = threading.current_thread() + try: + additional_info = t.additional_info + except: + additional_info = set_additional_thread_info(t) + + if additional_info.is_tracing: + return False + + additional_info.is_tracing += 1 + try: + frame = sys._getframe(1) + # print('pydev needs stop at break?', line, 'curr line', frame.f_lineno, 'curr trace', frame.f_trace) + if frame.f_trace is not None: + # i.e.: this frame is already being traced, thus, we don't need to use programmatic breakpoints. + return False + + py_db = get_global_debugger() + if py_db is None: + return False + + try: + abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + except: + abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(frame) + canonical_normalized_filename = abs_path_real_path_and_base[1] + + try: + python_breakpoint = py_db.breakpoints[canonical_normalized_filename][line] + except: + # print("Couldn't find breakpoint in the file %s on line %s" % (frame.f_code.co_filename, line)) + # Could be KeyError if line is not there or TypeError if breakpoints_for_file is None. + # Note: using catch-all exception for performance reasons (if the user adds a breakpoint + # and then removes it after hitting it once, this method added for the programmatic + # breakpoint will keep on being called and one of those exceptions will always be raised + # here). + return False + + if python_breakpoint: + # print('YES') + return True + + finally: + additional_info.is_tracing -= 1 + + return False diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_modify_bytecode.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_modify_bytecode.py new file mode 100644 index 0000000..336cdc8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_modify_bytecode.py @@ -0,0 +1,363 @@ +from collections import namedtuple +import dis +from functools import partial +import itertools +import os.path +import sys + +from _pydevd_frame_eval.vendored import bytecode +from _pydevd_frame_eval.vendored.bytecode.instr import Instr, Label +from _pydev_bundle import pydev_log +from _pydevd_frame_eval.pydevd_frame_tracing import _pydev_stop_at_break, _pydev_needs_stop_at_break + +DEBUG = False + + +class DebugHelper(object): + def __init__(self): + self._debug_dir = os.path.join(os.path.dirname(__file__), "debug_info") + try: + os.makedirs(self._debug_dir) + except: + pass + self._next = partial(next, itertools.count(0)) + + def _get_filename(self, op_number=None, prefix=""): + if op_number is None: + op_number = self._next() + name = "%03d_before.txt" % op_number + else: + name = "%03d_change.txt" % op_number + + filename = os.path.join(self._debug_dir, prefix + name) + return filename, op_number + + def write_bytecode(self, b, op_number=None, prefix=""): + filename, op_number = self._get_filename(op_number, prefix) + with open(filename, "w") as stream: + bytecode.dump_bytecode(b, stream=stream, lineno=True) + return op_number + + def write_dis(self, code_to_modify, op_number=None, prefix=""): + filename, op_number = self._get_filename(op_number, prefix) + with open(filename, "w") as stream: + stream.write("-------- ") + stream.write("-------- ") + stream.write("id(code_to_modify): %s" % id(code_to_modify)) + stream.write("\n\n") + dis.dis(code_to_modify, file=stream) + return op_number + + +_CodeLineInfo = namedtuple("_CodeLineInfo", "line_to_offset, first_line, last_line") + + +# Note: this method has a version in cython too (that one is usually used, this is just for tests). +def _get_code_line_info(code_obj): + line_to_offset = {} + first_line = None + last_line = None + + for offset, line in dis.findlinestarts(code_obj): + if line is not None: + line_to_offset[line] = offset + + if line_to_offset: + first_line = min(line_to_offset) + last_line = max(line_to_offset) + return _CodeLineInfo(line_to_offset, first_line, last_line) + + +if DEBUG: + debug_helper = DebugHelper() + + +def get_instructions_to_add(stop_at_line, _pydev_stop_at_break=_pydev_stop_at_break, _pydev_needs_stop_at_break=_pydev_needs_stop_at_break): + """ + This is the bytecode for something as: + + if _pydev_needs_stop_at_break(): + _pydev_stop_at_break() + + but with some special handling for lines. + """ + # Good reference to how things work regarding line numbers and jumps: + # https://github.com/python/cpython/blob/3.6/Objects/lnotab_notes.txt + + # Usually use a stop line -1, but if that'd be 0, using line +1 is ok too. + spurious_line = stop_at_line - 1 + if spurious_line <= 0: + spurious_line = stop_at_line + 1 + + label = Label() + return [ + # -- if _pydev_needs_stop_at_break(): + Instr("LOAD_CONST", _pydev_needs_stop_at_break, lineno=stop_at_line), + Instr("LOAD_CONST", stop_at_line, lineno=stop_at_line), + Instr("CALL_FUNCTION", 1, lineno=stop_at_line), + Instr("POP_JUMP_IF_FALSE", label, lineno=stop_at_line), + # -- _pydev_stop_at_break() + # + # Note that this has line numbers -1 so that when the NOP just below + # is executed we have a spurious line event. + Instr("LOAD_CONST", _pydev_stop_at_break, lineno=spurious_line), + Instr("LOAD_CONST", stop_at_line, lineno=spurious_line), + Instr("CALL_FUNCTION", 1, lineno=spurious_line), + Instr("POP_TOP", lineno=spurious_line), + # Reason for the NOP: Python will give us a 'line' trace event whenever we forward jump to + # the first instruction of a line, so, in the case where we haven't added a programmatic + # breakpoint (either because we didn't hit a breakpoint anymore or because it was already + # tracing), we don't want the spurious line event due to the line change, so, we make a jump + # to the instruction right after the NOP so that the spurious line event is NOT generated in + # this case (otherwise we'd have a line event even if the line didn't change). + Instr("NOP", lineno=stop_at_line), + label, + ] + + +class _Node(object): + def __init__(self, data): + self.prev = None + self.next = None + self.data = data + + def append(self, data): + node = _Node(data) + + curr_next = self.next + + node.next = self.next + node.prev = self + self.next = node + + if curr_next is not None: + curr_next.prev = node + + return node + + def prepend(self, data): + node = _Node(data) + + curr_prev = self.prev + + node.prev = self.prev + node.next = self + self.prev = node + + if curr_prev is not None: + curr_prev.next = node + + return node + + +class _HelperBytecodeList(object): + """ + A helper double-linked list to make the manipulation a bit easier (so that we don't need + to keep track of indices that change) and performant (because adding multiple items to + the middle of a regular list isn't ideal). + """ + + def __init__(self, lst=None): + self._head = None + self._tail = None + if lst: + node = self + for item in lst: + node = node.append(item) + + def append(self, data): + if self._tail is None: + node = _Node(data) + self._head = self._tail = node + return node + else: + node = self._tail = self.tail.append(data) + return node + + @property + def head(self): + node = self._head + # Manipulating the node directly may make it unsynchronized. + while node.prev: + self._head = node = node.prev + return node + + @property + def tail(self): + node = self._tail + # Manipulating the node directly may make it unsynchronized. + while node.next: + self._tail = node = node.next + return node + + def __iter__(self): + node = self.head + + while node: + yield node.data + node = node.next + + +_PREDICT_TABLE = { + "LIST_APPEND": ("JUMP_ABSOLUTE",), + "SET_ADD": ("JUMP_ABSOLUTE",), + "GET_ANEXT": ("LOAD_CONST",), + "GET_AWAITABLE": ("LOAD_CONST",), + "DICT_MERGE": ("CALL_FUNCTION_EX",), + "MAP_ADD": ("JUMP_ABSOLUTE",), + "COMPARE_OP": ( + "POP_JUMP_IF_FALSE", + "POP_JUMP_IF_TRUE", + ), + "IS_OP": ( + "POP_JUMP_IF_FALSE", + "POP_JUMP_IF_TRUE", + ), + "CONTAINS_OP": ( + "POP_JUMP_IF_FALSE", + "POP_JUMP_IF_TRUE", + ), + # Note: there are some others with PREDICT on ceval, but they have more logic + # and it needs more experimentation to know how it behaves in the static generated + # code (and it's only an issue for us if there's actually a line change between + # those, so, we don't have to really handle all the cases, only the one where + # the line number actually changes from one instruction to the predicted one). +} + +# 3.10 optimizations include copying code branches multiple times (for instance +# if the body of a finally has a single assign statement it can copy the assign to the case +# where an exception happens and doesn't happen for optimization purposes) and as such +# we need to add the programmatic breakpoint multiple times. +TRACK_MULTIPLE_BRANCHES = sys.version_info[:2] >= (3, 10) + +# When tracking multiple branches, we try to fix the bytecodes which would be PREDICTED in the +# Python eval loop so that we don't have spurious line events that wouldn't usually be issued +# in the tracing as they're ignored due to the eval prediction (even though they're in the bytecode). +FIX_PREDICT = sys.version_info[:2] >= (3, 10) + + +def insert_pydevd_breaks( + code_to_modify, + breakpoint_lines, + code_line_info=None, + _pydev_stop_at_break=_pydev_stop_at_break, + _pydev_needs_stop_at_break=_pydev_needs_stop_at_break, +): + """ + Inserts pydevd programmatic breaks into the code (at the given lines). + + :param breakpoint_lines: set with the lines where we should add breakpoints. + :return: tuple(boolean flag whether insertion was successful, modified code). + """ + if code_line_info is None: + code_line_info = _get_code_line_info(code_to_modify) + + if not code_line_info.line_to_offset: + return False, code_to_modify + + # Create a copy (and make sure we're dealing with a set). + breakpoint_lines = set(breakpoint_lines) + + # Note that we can even generate breakpoints on the first line of code + # now, since we generate a spurious line event -- it may be a bit pointless + # as we'll stop in the first line and we don't currently stop the tracing after the + # user resumes, but in the future, if we do that, this would be a nice + # improvement. + # if code_to_modify.co_firstlineno in breakpoint_lines: + # return False, code_to_modify + + for line in breakpoint_lines: + if line <= 0: + # The first line is line 1, so, a break at line 0 is not valid. + pydev_log.info("Trying to add breakpoint in invalid line: %s", line) + return False, code_to_modify + + try: + b = bytecode.Bytecode.from_code(code_to_modify) + + if DEBUG: + op_number_bytecode = debug_helper.write_bytecode(b, prefix="bytecode.") + + helper_list = _HelperBytecodeList(b) + + modified_breakpoint_lines = breakpoint_lines.copy() + + curr_node = helper_list.head + added_breaks_in_lines = set() + last_lineno = None + while curr_node is not None: + instruction = curr_node.data + instruction_lineno = getattr(instruction, "lineno", None) + curr_name = getattr(instruction, "name", None) + + if FIX_PREDICT: + predict_targets = _PREDICT_TABLE.get(curr_name) + if predict_targets: + # Odd case: the next instruction may have a line number but it doesn't really + # appear in the tracing due to the PREDICT() in ceval, so, fix the bytecode so + # that it does things the way that ceval actually interprets it. + # See: https://mail.python.org/archives/list/python-dev@python.org/thread/CP2PTFCMTK57KM3M3DLJNWGO66R5RVPB/ + next_instruction = curr_node.next.data + next_name = getattr(next_instruction, "name", None) + if next_name in predict_targets: + next_instruction_lineno = getattr(next_instruction, "lineno", None) + if next_instruction_lineno: + next_instruction.lineno = None + + if instruction_lineno is not None: + if TRACK_MULTIPLE_BRANCHES: + if last_lineno is None: + last_lineno = instruction_lineno + else: + if last_lineno == instruction_lineno: + # If the previous is a label, someone may jump into it, so, we need to add + # the break even if it's in the same line. + if curr_node.prev.data.__class__ != Label: + # Skip adding this as the line is still the same. + curr_node = curr_node.next + continue + last_lineno = instruction_lineno + else: + if instruction_lineno in added_breaks_in_lines: + curr_node = curr_node.next + continue + + if instruction_lineno in modified_breakpoint_lines: + added_breaks_in_lines.add(instruction_lineno) + if curr_node.prev is not None and curr_node.prev.data.__class__ == Label and curr_name == "POP_TOP": + # If we have a SETUP_FINALLY where the target is a POP_TOP, we can't change + # the target to be the breakpoint instruction (this can crash the interpreter). + + for new_instruction in get_instructions_to_add( + instruction_lineno, + _pydev_stop_at_break=_pydev_stop_at_break, + _pydev_needs_stop_at_break=_pydev_needs_stop_at_break, + ): + curr_node = curr_node.append(new_instruction) + + else: + for new_instruction in get_instructions_to_add( + instruction_lineno, + _pydev_stop_at_break=_pydev_stop_at_break, + _pydev_needs_stop_at_break=_pydev_needs_stop_at_break, + ): + curr_node.prepend(new_instruction) + + curr_node = curr_node.next + + b[:] = helper_list + + if DEBUG: + debug_helper.write_bytecode(b, op_number_bytecode, prefix="bytecode.") + + new_code = b.to_code() + + except: + pydev_log.exception("Error inserting pydevd breaks.") + return False, code_to_modify + + if DEBUG: + op_number = debug_helper.write_dis(code_to_modify) + debug_helper.write_dis(new_code, op_number) + + return True, new_code diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/release_mem.h b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/release_mem.h new file mode 100644 index 0000000..cc6e3d9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/release_mem.h @@ -0,0 +1,5 @@ +#include "Python.h" + +void release_co_extra(void *obj) { + Py_XDECREF(obj); +} diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/README.txt b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/README.txt new file mode 100644 index 0000000..d15aa20 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/README.txt @@ -0,0 +1,18 @@ +This folder contains vendored dependencies of the debugger. + +Right now this means the 'bytecode' library (MIT license). + +To update the version remove the bytecode* contents from this folder and then use: + +pip install bytecode --target . + +or from master (if needed for some early bugfix): + +python -m pip install https://github.com/MatthieuDartiailh/bytecode/archive/main.zip --target . + +Then run 'pydevd_fix_code.py' to fix the imports on the vendored file, run its tests (to see +if things are still ok) and commit. + +Then, to finish, apply the patch to add the offset to the instructions (bcb8a28669e9178f96f5d71af7259e0674acc47c) + +Note: commit the egg-info as a note of the license (force if needed). \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa9fe6a9ad4df21d4ca7fd88bb8beef61733e2fb GIT binary patch literal 243 zcmZ9GJqp4=5QVcwL4@4F*1`;GD}oR#?X+DIcZ_SYKkTl7y@riv@GKs~6G%EMHwYF! zn0ar8uXv9n8AU-4u`fG+cI#hlKYVVHk0xY$k4!IIZO6Q?Af$r>>?|4!8+0hgnc<8> zhPHA_gEs1nZY?b@Y6Rg?Hc;~dw09>Z7wK#cmOGs4{7~g3T3}dQO6`F*D48bW3yoIn%TvG zu~iOjMJ1%qmJjJlZw_LKRSp@Do!$ShBzcwicLa336Mg}Ob_z8yMCuOiINae zqr%X%j)zqVCw%5oj7>{8E{P!$jA9YTgAsomE0RjE{vZ@R=XgCrY^tB{jp(<@mj){BqrrOtH@TSlxjzI#N9u1PQ zU=0~ygAT(PQ1}AUh8hZ(%atM zD1fZ>=0I=9jjk6ViNmU*=|M%;ES%o~2Z+U^fZ`2Q^i>Sl^AuCuD*(q4lPjqHyV=(Cj}~?<@9khK*o@)h33FqW5og z_FnJ2-qmgtL%>AWCS`pDESw=Zf)%)K!wI?Q7*Zj$x(ru7V37u_(YhC4?4$!xMGp)I zZfS5|fvXrCgf=2ea-a=sW4am(#E3eI^(%@d4@GbwI*pZhAR-S101hso*?;;>K$CUc z6blZI1;bbim{$^;4nPUyOASnE6$YNK#=t%kF(gmH6-d}0n>I=ct3nbU2$?p7_BlLe z(a&7TFP_r7@z3I!qji~v-puU}Gog|75XpwfTs-H|W;_1TH)KxT$%x^MI=-&XWYrm} zPtJC1+R@=7d4w~WvptzxcQQDofjoLUe-aCp`o)mcaN!uiLJ+6`C5!c^8(ziH!Z zxViT>-Kes5sXtrMG}p1=Dx1CW3<5*L^kI!6n3z;G4+I8;m!~R}LJk5yErx7fQ2Cu~;vJU)&V}=uY-=rji zQ)5^$xKUMxCy<;(Xhj)(jL3>^@RJ0{!&gMgsgNV8sv8_YYw%G5RE-=3IiWRd*fky8 zqlA{O;a2b@C2N!5G}>pB&dfm$Q3Ea-loe73Q(6?77pTJ|4QTq~!eU>#Z>f8wZ@F(p zTo%9S&z-!KJNC{Na`DYsXVn}xC*5n`@RZ$6e3n>vZLuz0m-Df zoJr4onY!1p&4T1lI}(~!`|nTXPF%j{-YBbCNao7kcv4=q(6IFG%C+TdE1k=o_sc>5 z`sK&vSDsWITNqjlr^AbpbY%7H{mR_&mItl5s>=ZHZGL!lqw@HoJMCT?d|Y`3@V(8Z z{Anpf{FH~xwwqWXHF}ul Z%~ObT&n13ftA65~pIqH!5m#-3{0(m7j)DLH literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/COPYING b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/COPYING new file mode 100644 index 0000000..81d7e37 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/COPYING @@ -0,0 +1,21 @@ +The MIT License (MIT) +Copyright (c) 2016 Red Hat. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/INSTALLER b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/METADATA b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/METADATA new file mode 100644 index 0000000..e1d5e01 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/METADATA @@ -0,0 +1,77 @@ +Metadata-Version: 2.1 +Name: bytecode +Version: 0.13.0.dev0 +Summary: Python module to generate and modify bytecode +Home-page: https://github.com/MatthieuDartiailh/bytecode +Author: Victor Stinner +Author-email: victor.stinner@gmail.com +Maintainer: Matthieu C. Dartiailh +Maintainer-email: m.dartiailh@gmail.com +License: MIT license +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.6 + +******** +bytecode +******** + +.. image:: https://img.shields.io/pypi/v/bytecode.svg + :alt: Latest release on the Python Cheeseshop (PyPI) + :target: https://pypi.python.org/pypi/bytecode + +.. image:: https://github.com/MatthieuDartiailh/bytecode/workflows/Continuous%20Integration/badge.svg + :target: https://github.com/MatthieuDartiailh/bytecode/actions + :alt: Continuous integration + +.. image:: https://github.com/MatthieuDartiailh/bytecode/workflows/Documentation%20building/badge.svg + :target: https://github.com/MatthieuDartiailh/bytecode/actions + :alt: Documentation building + +.. image:: https://img.shields.io/codecov/c/github/MatthieuDartiailh/bytecode/master.svg + :alt: Code coverage of bytecode on codecov.io + :target: https://codecov.io/github/MatthieuDartiailh/bytecode + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :alt: Code formatted using Black + :target: https://github.com/psf/black + +``bytecode`` is a Python module to generate and modify bytecode. + +* `bytecode project homepage at GitHub + `_ (code, bugs) +* `bytecode documentation + `_ +* `Download latest bytecode release at the Python Cheeseshop (PyPI) + `_ + +Install bytecode: ``python3 -m pip install bytecode``. It requires Python 3.6 +or newer. The latest release that supports Python 3.5 is 0.12.0. For Python 2.7 +support, have a look at `dead-bytecode +`_ instead. + +Example executing ``print('Hello World!')``: + +.. code:: python + + from bytecode import Instr, Bytecode + + bytecode = Bytecode([Instr("LOAD_NAME", 'print'), + Instr("LOAD_CONST", 'Hello World!'), + Instr("CALL_FUNCTION", 1), + Instr("POP_TOP"), + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE")]) + code = bytecode.to_code() + exec(code) + diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/RECORD b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/RECORD new file mode 100644 index 0000000..3890ece --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/RECORD @@ -0,0 +1,42 @@ +bytecode-0.13.0.dev0.dist-info/COPYING,sha256=baWkm-Te2LLURwK7TL0zOkMSVjVCU_ezvObHBo298Tk,1074 +bytecode-0.13.0.dev0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +bytecode-0.13.0.dev0.dist-info/METADATA,sha256=9XadDK6YTQ-FPowYI5DS4ieA7hRGnRP_fM5Z9ioPkEQ,2929 +bytecode-0.13.0.dev0.dist-info/RECORD,, +bytecode-0.13.0.dev0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +bytecode-0.13.0.dev0.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +bytecode-0.13.0.dev0.dist-info/direct_url.json,sha256=s58Rb4KXRlMKxk-mzpvr_tJRQ-Hx8-DHsU6NdohCnAg,93 +bytecode-0.13.0.dev0.dist-info/top_level.txt,sha256=9BhdB7HqYZ-PvHNoWX6ilwLYWQqcgEOLwdb3aXm5Gys,9 +bytecode/__init__.py,sha256=d-yk4Xh4SwOWq9NgoD2rmBLG6RhUFNljeqs-NjMNSYM,3885 +bytecode/__pycache__/__init__.cpython-38.pyc,, +bytecode/__pycache__/bytecode.cpython-38.pyc,, +bytecode/__pycache__/cfg.cpython-38.pyc,, +bytecode/__pycache__/concrete.cpython-38.pyc,, +bytecode/__pycache__/flags.cpython-38.pyc,, +bytecode/__pycache__/instr.cpython-38.pyc,, +bytecode/__pycache__/peephole_opt.cpython-38.pyc,, +bytecode/bytecode.py,sha256=IMCcatHMtQ7M31nwj4r3drcvQuGVJAOP0d7C0O8P_SE,6894 +bytecode/cfg.py,sha256=RmJGJqwCxR-XYaPH9YGY4wNDycdtLvIBJb1OGSmxcN0,15274 +bytecode/concrete.py,sha256=0eb6Yh_NDLmzJNcMs2TFom0EqFVSM1cO3inMH90YE-s,21683 +bytecode/flags.py,sha256=hAvM_B2yQKRw44leHP0oCae0aaJraAbDDTpqIf4I1CM,5987 +bytecode/instr.py,sha256=HYc65LjNSOB3GCWkNkCSkee1rRzUyr89rgdjbKBaTpE,11616 +bytecode/peephole_opt.py,sha256=W-cFVPOZN-JKfDV3aImsYenDSZkSNBDTVQqeMrGPU18,15712 +bytecode/tests/__init__.py,sha256=BAdOXXNRdMVX4D8TuRYPlG9PHU7Cb0bzvyfA9s435kM,4968 +bytecode/tests/__pycache__/__init__.cpython-38.pyc,, +bytecode/tests/__pycache__/test_bytecode.cpython-38.pyc,, +bytecode/tests/__pycache__/test_cfg.cpython-38.pyc,, +bytecode/tests/__pycache__/test_code.cpython-38.pyc,, +bytecode/tests/__pycache__/test_concrete.cpython-38.pyc,, +bytecode/tests/__pycache__/test_flags.cpython-38.pyc,, +bytecode/tests/__pycache__/test_instr.cpython-38.pyc,, +bytecode/tests/__pycache__/test_misc.cpython-38.pyc,, +bytecode/tests/__pycache__/test_peephole_opt.cpython-38.pyc,, +bytecode/tests/__pycache__/util_annotation.cpython-38.pyc,, +bytecode/tests/test_bytecode.py,sha256=buvtlDC0NwoQ3zuZ7OENIIDngSqtiO9WkAa2-UvxGkI,15584 +bytecode/tests/test_cfg.py,sha256=c0xT8OfV-mDHu-DIDWr6LVlZQyK4GfgLSmT5AsodbMk,28194 +bytecode/tests/test_code.py,sha256=XCOH29rOXSoQz130s-AIC62r23e9qNjk8Y2xDB2LmSc,2100 +bytecode/tests/test_concrete.py,sha256=qT2qvabkF0yC7inniNx53cMSDN-2Qi0IE3pwBZSzF8g,49253 +bytecode/tests/test_flags.py,sha256=DY9U3c6tJdxJFm0jEm_To1Cc0I99EidQv_0guud-4oE,5684 +bytecode/tests/test_instr.py,sha256=rYeF8u-L0aW8bLPBxTUSy_T7KP6SaXyJKv9OhC8k6aA,11295 +bytecode/tests/test_misc.py,sha256=wyK1wpVPHRfaXgo-EqUI-F1nyB9-UACerHsHbExAo1U,6758 +bytecode/tests/test_peephole_opt.py,sha256=niUfhgEbiFR7IAmdQ_N9Qgh7D3wdRQ_zS0V8mKC4EzI,32640 +bytecode/tests/util_annotation.py,sha256=wKq6yPWrzkNlholl5Y10b3VjuCkoiYVgvcIjk_8jzf8,485 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/REQUESTED b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/WHEEL new file mode 100644 index 0000000..385faab --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/direct_url.json b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/direct_url.json new file mode 100644 index 0000000..3c32b57 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/direct_url.json @@ -0,0 +1 @@ +{"archive_info": {}, "url": "https://github.com/MatthieuDartiailh/bytecode/archive/main.zip"} \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/top_level.txt b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/top_level.txt new file mode 100644 index 0000000..b37707e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode-0.13.0.dev0.dist-info/top_level.txt @@ -0,0 +1 @@ +bytecode diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__init__.py new file mode 100644 index 0000000..a68ddcc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__init__.py @@ -0,0 +1,131 @@ +__version__ = "0.13.0.dev" + +__all__ = [ + "Label", + "Instr", + "SetLineno", + "Bytecode", + "ConcreteInstr", + "ConcreteBytecode", + "ControlFlowGraph", + "CompilerFlags", + "Compare", +] + +from _pydevd_frame_eval.vendored.bytecode.flags import CompilerFlags +from _pydevd_frame_eval.vendored.bytecode.instr import ( + UNSET, + Label, + SetLineno, + Instr, + CellVar, + FreeVar, # noqa + Compare, +) +from _pydevd_frame_eval.vendored.bytecode.bytecode import ( + BaseBytecode, + _BaseBytecodeList, + _InstrList, + Bytecode, +) # noqa +from _pydevd_frame_eval.vendored.bytecode.concrete import ( + ConcreteInstr, + ConcreteBytecode, # noqa + # import needed to use it in bytecode.py + _ConvertBytecodeToConcrete, +) +from _pydevd_frame_eval.vendored.bytecode.cfg import BasicBlock, ControlFlowGraph # noqa +import sys + + +def dump_bytecode(bytecode, *, lineno=False, stream=sys.stdout): + def format_line(index, line): + nonlocal cur_lineno, prev_lineno + if lineno: + if cur_lineno != prev_lineno: + line = "L.% 3s % 3s: %s" % (cur_lineno, index, line) + prev_lineno = cur_lineno + else: + line = " % 3s: %s" % (index, line) + else: + line = line + return line + + def format_instr(instr, labels=None): + text = instr.name + arg = instr._arg + if arg is not UNSET: + if isinstance(arg, Label): + try: + arg = "<%s>" % labels[arg] + except KeyError: + arg = "" + elif isinstance(arg, BasicBlock): + try: + arg = "<%s>" % labels[id(arg)] + except KeyError: + arg = "" + else: + arg = repr(arg) + text = "%s %s" % (text, arg) + return text + + indent = " " * 4 + + cur_lineno = bytecode.first_lineno + prev_lineno = None + + if isinstance(bytecode, ConcreteBytecode): + offset = 0 + for instr in bytecode: + fields = [] + if instr.lineno is not None: + cur_lineno = instr.lineno + if lineno: + fields.append(format_instr(instr)) + line = "".join(fields) + line = format_line(offset, line) + else: + fields.append("% 3s %s" % (offset, format_instr(instr))) + line = "".join(fields) + print(line, file=stream) + + offset += instr.size + elif isinstance(bytecode, Bytecode): + labels = {} + for index, instr in enumerate(bytecode): + if isinstance(instr, Label): + labels[instr] = "label_instr%s" % index + + for index, instr in enumerate(bytecode): + if isinstance(instr, Label): + label = labels[instr] + line = "%s:" % label + if index != 0: + print(file=stream) + else: + if instr.lineno is not None: + cur_lineno = instr.lineno + line = format_instr(instr, labels) + line = indent + format_line(index, line) + print(line, file=stream) + print(file=stream) + elif isinstance(bytecode, ControlFlowGraph): + labels = {} + for block_index, block in enumerate(bytecode, 1): + labels[id(block)] = "block%s" % block_index + + for block_index, block in enumerate(bytecode, 1): + print("%s:" % labels[id(block)], file=stream) + prev_lineno = None + for index, instr in enumerate(block): + if instr.lineno is not None: + cur_lineno = instr.lineno + line = format_instr(instr, labels) + line = indent + format_line(index, line) + print(line, file=stream) + if block.next_block is not None: + print(indent + "-> %s" % labels[id(block.next_block)], file=stream) + print(file=stream) + else: + raise TypeError("unknown bytecode class") diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6734d22cd099a47d7491563470c0711c6db5af0b GIT binary patch literal 4644 zcmc&2U2Id=`P@JMT|2h(XA?p&2?=olJ0yit7EvH1YXLE-&`R?fYvoX?s}T0->W~FZ<55ZxV-e zVoy5{=bU@acfSAgec!o%_IO+f+F#^X$Da2g^mp=MHKsOM{UuChk$_@o3<=bSRE!d6 zfstsLi7^y{IV-U;7vp4G%qH7ocG(eg$j+EkcEwyWALC6JPIAkhm`84iHOStWSN6qx z=DJPt%Z;%{xhd8pH^-XIHM`Uzx5irKKrCQ>JEUMNC^*Gny5C}MeH2{RXn}u|j6%@Jxv7L)ZTD!y?)s{P2qmsktRHEYBbVW-F~ws znKgn>acO=ND17P;3!>nJlZ!&ga24x=XhY0>G6Ji@pW#rKiP<+X=R9fUV#boVuIfFF18x zU@tuf{&8f3W{6&Dwxp1C34x!DfF8ZTf8fHy7SDKrSY?y2foBZ@Jb-eAdYYCc%6`8rIu*DV&0HO9#aI z^|x;W#yVSH`K@{Hc39*EkA>?eRM>kqSqpFGHVI}#m8&m9_fuvTO*44cG(BB)aKAuJ z(*jLGhz`jVMpmaFeAo)Gei`QHAY9e$umy^&>Qr?M+s@|cGm*#i(SgTQC{G^=twFLKfrVctVP1aHjQc_wx z9?4D`{AdQt3C-j>-znteY}|s23_^}eNb1qZ2AF3+EcFz0-%O#u@&1Z;+uRQpy}e)V zJM;(c_u4|>WQnbG^p^M)7xFb1`4unng;yPD-+|k^7Xr_f*cDrKok7jP;>n7)smQMa zHdJS1qC3;by%3>hA=hn{5eqb|Z*&cU23mp9nf2V5qwx1MlGV)yJ0xYB&5B&u<%CL1 zr*y{h+ybLS>dv^IIMY-;qj{|zeJw+6z`|?(C-;Fr`YHvE$&kDTQqbp67t&l79g{Iz`cYgD*1qDM75Jj-|zcaML z!0g`-T~97PR=a@9-#Cul8l`NBY!;%1!KO1Q#o)3yrDz7Lrt+d$2^&sP$;l#4XjP+|H7?#m zcy%dY)VRrr;XFT?6-{3V`wfT1gh>In5P~7n?I*`)w$Exn-sdFfN3?KQtq%b?Wp#?EX^kQv1Fo`~Hf*v1qHb z?0A4Y&RxafN=u+PLL5+^))%~cDmywqc5==}fsKdl$kkkW@!G{D=bnncsc2hn@4kL9CF_(MaQ{pOt_PN|l z0fKo`aPIg!N0ytn&5hq}?zz_#oE@AQTxi-`+12x__8aY`Q(pwSt`E;2S`739bYRB~ zet!7Yvx}j_<-p+*Ta)Ild-qBJ=sgS~XG7`GT}Rupv#IprQb%OT8LbM^xp)4>TZzTa z!*JD{hs*Ac;_11TN+>*k8YC!=yw_h6-+lhC?j3OdKnxq|+P4PJJ9pOL3AygMo{t)@ z5C39YxovN`aqq33JMQNzZGdhWkaaJH`W_(86P|IGxKa+J``^UzwUmVGt#^IBD?A`s zaU);L=iZ%V@6HA9-euSvotv0%{e-@C@biJ8^1#qy-^p@#xV&??+&cWHkvqO~gu(H< z?vDGQjhzqMkT|1O&u;4g=cM)gZZt!u)>R3%>lz7~*$Kwe}g2^*aX7-4c*(28V zi;R*twE1R!$^&MgF{Ayaw>2hpIVMjf^G$8+e=7PGBbekxOdd~|T-It}c{&uy+8>1V z_c(3@6h`k;F_0V`Gjo#}wG2j`R1J8N3z?i|#sW+#T~pC!xOnUslrut35|3h1(vU!_ zo`(*6jG`(HZBzUM*2U9P_OFA88m1o64vKz+pu11HM~xgsuOjFkxuLsXogwOF>PzH; XI%m(mTSLD)b^FxUC`M8JCe{A{+)`Yz literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/bytecode.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/bytecode.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d195790223d3b7f53146d48b43f1b317b14312c6 GIT binary patch literal 10751 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

    1G1 z);tWTO>t^0Tp5i)UZH73D04ty#@%wS=*W#sn*ohfFv?2P^g%97CfP9esNlJYaws$^=v31O^r}W~SA8N@gEts$P;1_oovc1DUJctW8g8s;)9~2BEo%rVzgTufr{+6JBijF;pnU+u> zEn`PH?)50B0EdoP7Df=#oJcpSGIEXtflO^CWGQqHUe?I|{e|#r3frE=bsi(*xqmyr zMAXBSkqM;MDD*OUHEx_;I4d0*Up8+?TG~u%H~i}gx>ebg^leGGx8CE7mLMPNgE4%% zvO}!wNL6l%9m%?Df9~|Il~5X4sWl`Uo=*;(O};!R4h)J7=ThZEN!!p}oSBp<5XHVZ z?QR#{?J4(0T)ca2p`BIfT>C`ld-6`OHE2Qo&|jL`NiiM9Sag~-D-$6S~gKxigNsGBrY-!qgM zYwy*U7`@O6lB&UE^yX9q2;Fmb8#muO$5$Jx9_)Z8sRXF1j#}Xjsy0ntCwUvmTO#jW z^1gtVtzG{=Zo1_EaU;pTKc{RPACj$02BI#epp}51XfBBxDxnZ#R0x?$Jc^Yg|3$BcXZGUUx_+w$$9UYjC{)j t=d(P&JAUv1N6!bNy5lCkDtNIPzJi{x_J1e)IqU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/flags.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/flags.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f491bc21a1d3cbbc5f495f75e0a0790b91005ec2 GIT binary patch literal 5197 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 IA|zz@-$;PuVgLXD literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/peephole_opt.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__pycache__/peephole_opt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8532ee9fd3b6bf822ffa489f68bff4bb8e6d7378 GIT binary patch literal 21613 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 L*Rak3Fr@xpZ=eIE literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/bytecode.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/bytecode.py new file mode 100644 index 0000000..8680659 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/bytecode.py @@ -0,0 +1,208 @@ +# alias to keep the 'bytecode' variable free +import sys +from _pydevd_frame_eval.vendored import bytecode as _bytecode +from _pydevd_frame_eval.vendored.bytecode.instr import UNSET, Label, SetLineno, Instr +from _pydevd_frame_eval.vendored.bytecode.flags import infer_flags + + +class BaseBytecode: + def __init__(self): + self.argcount = 0 + if sys.version_info > (3, 8): + self.posonlyargcount = 0 + self.kwonlyargcount = 0 + self.first_lineno = 1 + self.name = "" + self.filename = "" + self.docstring = UNSET + self.cellvars = [] + # we cannot recreate freevars from instructions because of super() + # special-case + self.freevars = [] + self._flags = _bytecode.CompilerFlags(0) + + def _copy_attr_from(self, bytecode): + self.argcount = bytecode.argcount + if sys.version_info > (3, 8): + self.posonlyargcount = bytecode.posonlyargcount + self.kwonlyargcount = bytecode.kwonlyargcount + self.flags = bytecode.flags + self.first_lineno = bytecode.first_lineno + self.name = bytecode.name + self.filename = bytecode.filename + self.docstring = bytecode.docstring + self.cellvars = list(bytecode.cellvars) + self.freevars = list(bytecode.freevars) + + def __eq__(self, other): + if type(self) != type(other): + return False + + if self.argcount != other.argcount: + return False + if sys.version_info > (3, 8): + if self.posonlyargcount != other.posonlyargcount: + return False + if self.kwonlyargcount != other.kwonlyargcount: + return False + if self.flags != other.flags: + return False + if self.first_lineno != other.first_lineno: + return False + if self.filename != other.filename: + return False + if self.name != other.name: + return False + if self.docstring != other.docstring: + return False + if self.cellvars != other.cellvars: + return False + if self.freevars != other.freevars: + return False + if self.compute_stacksize() != other.compute_stacksize(): + return False + + return True + + @property + def flags(self): + return self._flags + + @flags.setter + def flags(self, value): + if not isinstance(value, _bytecode.CompilerFlags): + value = _bytecode.CompilerFlags(value) + self._flags = value + + def update_flags(self, *, is_async=None): + self.flags = infer_flags(self, is_async) + + +class _BaseBytecodeList(BaseBytecode, list): + """List subclass providing type stable slicing and copying.""" + + def __getitem__(self, index): + value = super().__getitem__(index) + if isinstance(index, slice): + value = type(self)(value) + value._copy_attr_from(self) + + return value + + def copy(self): + new = type(self)(super().copy()) + new._copy_attr_from(self) + return new + + def legalize(self): + """Check that all the element of the list are valid and remove SetLineno.""" + lineno_pos = [] + set_lineno = None + current_lineno = self.first_lineno + + for pos, instr in enumerate(self): + if isinstance(instr, SetLineno): + set_lineno = instr.lineno + lineno_pos.append(pos) + continue + # Filter out Labels + if not isinstance(instr, Instr): + continue + if set_lineno is not None: + instr.lineno = set_lineno + elif instr.lineno is None: + instr.lineno = current_lineno + else: + current_lineno = instr.lineno + + for i in reversed(lineno_pos): + del self[i] + + def __iter__(self): + instructions = super().__iter__() + for instr in instructions: + self._check_instr(instr) + yield instr + + def _check_instr(self, instr): + raise NotImplementedError() + + +class _InstrList(list): + def _flat(self): + instructions = [] + labels = {} + jumps = [] + + offset = 0 + for index, instr in enumerate(self): + if isinstance(instr, Label): + instructions.append("label_instr%s" % index) + labels[instr] = offset + else: + if isinstance(instr, Instr) and isinstance(instr.arg, Label): + target_label = instr.arg + instr = _bytecode.ConcreteInstr(instr.name, 0, lineno=instr.lineno) + jumps.append((target_label, instr)) + instructions.append(instr) + offset += 1 + + for target_label, instr in jumps: + instr.arg = labels[target_label] + + return instructions + + def __eq__(self, other): + if not isinstance(other, _InstrList): + other = _InstrList(other) + + return self._flat() == other._flat() + + +class Bytecode(_InstrList, _BaseBytecodeList): + def __init__(self, instructions=()): + BaseBytecode.__init__(self) + self.argnames = [] + for instr in instructions: + self._check_instr(instr) + self.extend(instructions) + + def __iter__(self): + instructions = super().__iter__() + for instr in instructions: + self._check_instr(instr) + yield instr + + def _check_instr(self, instr): + if not isinstance(instr, (Label, SetLineno, Instr)): + raise ValueError( + "Bytecode must only contain Label, " "SetLineno, and Instr objects, " "but %s was found" % type(instr).__name__ + ) + + def _copy_attr_from(self, bytecode): + super()._copy_attr_from(bytecode) + if isinstance(bytecode, Bytecode): + self.argnames = bytecode.argnames + + @staticmethod + def from_code(code): + if sys.version_info[:2] >= (3, 11): + raise RuntimeError("This is not updated for Python 3.11 onwards, use only up to Python 3.10!!") + concrete = _bytecode.ConcreteBytecode.from_code(code) + return concrete.to_bytecode() + + def compute_stacksize(self, *, check_pre_and_post=True): + cfg = _bytecode.ControlFlowGraph.from_bytecode(self) + return cfg.compute_stacksize(check_pre_and_post=check_pre_and_post) + + def to_code(self, compute_jumps_passes=None, stacksize=None, *, check_pre_and_post=True): + # Prevent reconverting the concrete bytecode to bytecode and cfg to do the + # calculation if we need to do it. + if stacksize is None: + stacksize = self.compute_stacksize(check_pre_and_post=check_pre_and_post) + bc = self.to_concrete_bytecode(compute_jumps_passes=compute_jumps_passes) + return bc.to_code(stacksize=stacksize) + + def to_concrete_bytecode(self, compute_jumps_passes=None): + converter = _bytecode._ConvertBytecodeToConcrete(self) + return converter.to_concrete_bytecode(compute_jumps_passes=compute_jumps_passes) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/cfg.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/cfg.py new file mode 100644 index 0000000..6024c4f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/cfg.py @@ -0,0 +1,443 @@ +import sys + +# alias to keep the 'bytecode' variable free +from _pydevd_frame_eval.vendored import bytecode as _bytecode +from _pydevd_frame_eval.vendored.bytecode.concrete import ConcreteInstr +from _pydevd_frame_eval.vendored.bytecode.flags import CompilerFlags +from _pydevd_frame_eval.vendored.bytecode.instr import Label, SetLineno, Instr + + +class BasicBlock(_bytecode._InstrList): + def __init__(self, instructions=None): + # a BasicBlock object, or None + self.next_block = None + if instructions: + super().__init__(instructions) + + def __iter__(self): + index = 0 + while index < len(self): + instr = self[index] + index += 1 + + if not isinstance(instr, (SetLineno, Instr)): + raise ValueError("BasicBlock must only contain SetLineno and Instr objects, " "but %s was found" % instr.__class__.__name__) + + if isinstance(instr, Instr) and instr.has_jump(): + if index < len(self): + raise ValueError("Only the last instruction of a basic " "block can be a jump") + + if not isinstance(instr.arg, BasicBlock): + raise ValueError( + "Jump target must a BasicBlock, got %s", + type(instr.arg).__name__, + ) + + yield instr + + def __getitem__(self, index): + value = super().__getitem__(index) + if isinstance(index, slice): + value = type(self)(value) + value.next_block = self.next_block + + return value + + def copy(self): + new = type(self)(super().copy()) + new.next_block = self.next_block + return new + + def legalize(self, first_lineno): + """Check that all the element of the list are valid and remove SetLineno.""" + lineno_pos = [] + set_lineno = None + current_lineno = first_lineno + + for pos, instr in enumerate(self): + if isinstance(instr, SetLineno): + set_lineno = current_lineno = instr.lineno + lineno_pos.append(pos) + continue + if set_lineno is not None: + instr.lineno = set_lineno + elif instr.lineno is None: + instr.lineno = current_lineno + else: + current_lineno = instr.lineno + + for i in reversed(lineno_pos): + del self[i] + + return current_lineno + + def get_jump(self): + if not self: + return None + + last_instr = self[-1] + if not (isinstance(last_instr, Instr) and last_instr.has_jump()): + return None + + target_block = last_instr.arg + assert isinstance(target_block, BasicBlock) + return target_block + + +def _compute_stack_size(block, size, maxsize, *, check_pre_and_post=True): + """Generator used to reduce the use of function stacks. + + This allows to avoid nested recursion and allow to treat more cases. + + HOW-TO: + Following the methods of Trampoline + (see https://en.wikipedia.org/wiki/Trampoline_(computing)), + + We yield either: + + - the arguments that would be used in the recursive calls, i.e, + 'yield block, size, maxsize' instead of making a recursive call + '_compute_stack_size(block, size, maxsize)', if we encounter an + instruction jumping to another block or if the block is linked to + another one (ie `next_block` is set) + - the required stack from the stack if we went through all the instructions + or encountered an unconditional jump. + + In the first case, the calling function is then responsible for creating a + new generator with those arguments, iterating over it till exhaustion to + determine the stacksize required by the block and resuming this function + with the determined stacksize. + + """ + # If the block is currently being visited (seen = True) or if it was visited + # previously by using a larger starting size than the one in use, return the + # maxsize. + if block.seen or block.startsize >= size: + yield maxsize + + def update_size(pre_delta, post_delta, size, maxsize): + size += pre_delta + if size < 0: + msg = "Failed to compute stacksize, got negative size" + raise RuntimeError(msg) + size += post_delta + maxsize = max(maxsize, size) + return size, maxsize + + # Prevent recursive visit of block if two blocks are nested (jump from one + # to the other). + block.seen = True + block.startsize = size + + for instr in block: + # Ignore SetLineno + if isinstance(instr, SetLineno): + continue + + # For instructions with a jump first compute the stacksize required when the + # jump is taken. + if instr.has_jump(): + effect = instr.pre_and_post_stack_effect(jump=True) if check_pre_and_post else (instr.stack_effect(jump=True), 0) + taken_size, maxsize = update_size(*effect, size, maxsize) + # Yield the parameters required to compute the stacksize required + # by the block to which the jumnp points to and resume when we now + # the maxsize. + maxsize = yield instr.arg, taken_size, maxsize + + # For unconditional jumps abort early since the other instruction will + # never be seen. + if instr.is_uncond_jump(): + block.seen = False + yield maxsize + + # jump=False: non-taken path of jumps, or any non-jump + effect = instr.pre_and_post_stack_effect(jump=False) if check_pre_and_post else (instr.stack_effect(jump=False), 0) + size, maxsize = update_size(*effect, size, maxsize) + + if block.next_block: + maxsize = yield block.next_block, size, maxsize + + block.seen = False + yield maxsize + + +class ControlFlowGraph(_bytecode.BaseBytecode): + def __init__(self): + super().__init__() + self._blocks = [] + self._block_index = {} + self.argnames = [] + + self.add_block() + + def legalize(self): + """Legalize all blocks.""" + current_lineno = self.first_lineno + for block in self._blocks: + current_lineno = block.legalize(current_lineno) + + def get_block_index(self, block): + try: + return self._block_index[id(block)] + except KeyError: + raise ValueError("the block is not part of this bytecode") + + def _add_block(self, block): + block_index = len(self._blocks) + self._blocks.append(block) + self._block_index[id(block)] = block_index + + def add_block(self, instructions=None): + block = BasicBlock(instructions) + self._add_block(block) + return block + + def compute_stacksize(self, *, check_pre_and_post=True): + """Compute the stack size by iterating through the blocks + + The implementation make use of a generator function to avoid issue with + deeply nested recursions. + + """ + # In the absence of any block return 0 + if not self: + return 0 + + # Ensure that previous calculation do not impact this one. + for block in self: + block.seen = False + block.startsize = -32768 # INT_MIN + + # Starting with Python 3.10, generator and coroutines start with one object + # on the stack (None, anything is an error). + initial_stack_size = 0 + if sys.version_info >= (3, 10) and self.flags & (CompilerFlags.GENERATOR | CompilerFlags.COROUTINE | CompilerFlags.ASYNC_GENERATOR): + initial_stack_size = 1 + + # Create a generator/coroutine responsible of dealing with the first block + coro = _compute_stack_size(self[0], initial_stack_size, 0, check_pre_and_post=check_pre_and_post) + + # Create a list of generator that have not yet been exhausted + coroutines = [] + + push_coroutine = coroutines.append + pop_coroutine = coroutines.pop + args = None + + try: + while True: + args = coro.send(None) + + # Consume the stored generators as long as they return a simple + # interger that is to be used to resume the last stored generator. + while isinstance(args, int): + coro = pop_coroutine() + args = coro.send(args) + + # Otherwise we enter a new block and we store the generator under + # use and create a new one to process the new block + push_coroutine(coro) + coro = _compute_stack_size(*args, check_pre_and_post=check_pre_and_post) + + except IndexError: + # The exception occurs when all the generators have been exhausted + # in which case teh last yielded value is the stacksize. + assert args is not None + return args + + def __repr__(self): + return "" % len(self._blocks) + + def get_instructions(self): + instructions = [] + jumps = [] + + for block in self: + target_block = block.get_jump() + if target_block is not None: + instr = block[-1] + instr = ConcreteInstr(instr.name, 0, lineno=instr.lineno) + jumps.append((target_block, instr)) + + instructions.extend(block[:-1]) + instructions.append(instr) + else: + instructions.extend(block) + + for target_block, instr in jumps: + instr.arg = self.get_block_index(target_block) + + return instructions + + def __eq__(self, other): + if type(self) != type(other): + return False + + if self.argnames != other.argnames: + return False + + instrs1 = self.get_instructions() + instrs2 = other.get_instructions() + if instrs1 != instrs2: + return False + # FIXME: compare block.next_block + + return super().__eq__(other) + + def __len__(self): + return len(self._blocks) + + def __iter__(self): + return iter(self._blocks) + + def __getitem__(self, index): + if isinstance(index, BasicBlock): + index = self.get_block_index(index) + return self._blocks[index] + + def __delitem__(self, index): + if isinstance(index, BasicBlock): + index = self.get_block_index(index) + block = self._blocks[index] + del self._blocks[index] + del self._block_index[id(block)] + for index in range(index, len(self)): + block = self._blocks[index] + self._block_index[id(block)] -= 1 + + def split_block(self, block, index): + if not isinstance(block, BasicBlock): + raise TypeError("expected block") + block_index = self.get_block_index(block) + + if index < 0: + raise ValueError("index must be positive") + + block = self._blocks[block_index] + if index == 0: + return block + + if index > len(block): + raise ValueError("index out of the block") + + instructions = block[index:] + if not instructions: + if block_index + 1 < len(self): + return self[block_index + 1] + + del block[index:] + + block2 = BasicBlock(instructions) + block.next_block = block2 + + for block in self[block_index + 1 :]: + self._block_index[id(block)] += 1 + + self._blocks.insert(block_index + 1, block2) + self._block_index[id(block2)] = block_index + 1 + + return block2 + + @staticmethod + def from_bytecode(bytecode): + # label => instruction index + label_to_block_index = {} + jumps = [] + block_starts = {} + for index, instr in enumerate(bytecode): + if isinstance(instr, Label): + label_to_block_index[instr] = index + else: + if isinstance(instr, Instr) and isinstance(instr.arg, Label): + jumps.append((index, instr.arg)) + + for target_index, target_label in jumps: + target_index = label_to_block_index[target_label] + block_starts[target_index] = target_label + + bytecode_blocks = _bytecode.ControlFlowGraph() + bytecode_blocks._copy_attr_from(bytecode) + bytecode_blocks.argnames = list(bytecode.argnames) + + # copy instructions, convert labels to block labels + block = bytecode_blocks[0] + labels = {} + jumps = [] + for index, instr in enumerate(bytecode): + if index in block_starts: + old_label = block_starts[index] + if index != 0: + new_block = bytecode_blocks.add_block() + if not block[-1].is_final(): + block.next_block = new_block + block = new_block + if old_label is not None: + labels[old_label] = block + elif block and isinstance(block[-1], Instr): + if block[-1].is_final(): + block = bytecode_blocks.add_block() + elif block[-1].has_jump(): + new_block = bytecode_blocks.add_block() + block.next_block = new_block + block = new_block + + if isinstance(instr, Label): + continue + + # don't copy SetLineno objects + if isinstance(instr, Instr): + instr = instr.copy() + if isinstance(instr.arg, Label): + jumps.append(instr) + block.append(instr) + + for instr in jumps: + label = instr.arg + instr.arg = labels[label] + + return bytecode_blocks + + def to_bytecode(self): + """Convert to Bytecode.""" + + used_blocks = set() + for block in self: + target_block = block.get_jump() + if target_block is not None: + used_blocks.add(id(target_block)) + + labels = {} + jumps = [] + instructions = [] + + for block in self: + if id(block) in used_blocks: + new_label = Label() + labels[id(block)] = new_label + instructions.append(new_label) + + for instr in block: + # don't copy SetLineno objects + if isinstance(instr, Instr): + instr = instr.copy() + if isinstance(instr.arg, BasicBlock): + jumps.append(instr) + instructions.append(instr) + + # Map to new labels + for instr in jumps: + instr.arg = labels[id(instr.arg)] + + bytecode = _bytecode.Bytecode() + bytecode._copy_attr_from(self) + bytecode.argnames = list(self.argnames) + bytecode[:] = instructions + + return bytecode + + def to_code(self, stacksize=None): + """Convert to code.""" + if stacksize is None: + stacksize = self.compute_stacksize() + bc = self.to_bytecode() + return bc.to_code(stacksize=stacksize) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/concrete.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/concrete.py new file mode 100644 index 0000000..63ec614 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/concrete.py @@ -0,0 +1,658 @@ +import dis +import inspect +import opcode as _opcode +import struct +import sys +import types + +# alias to keep the 'bytecode' variable free +from _pydevd_frame_eval.vendored import bytecode as _bytecode +from _pydevd_frame_eval.vendored.bytecode.instr import ( + UNSET, + Instr, + Label, + SetLineno, + FreeVar, + CellVar, + Compare, + const_key, + _check_arg_int, +) + +# - jumps use instruction +# - lineno use bytes (dis.findlinestarts(code)) +# - dis displays bytes +OFFSET_AS_INSTRUCTION = sys.version_info >= (3, 10) + + +def _set_docstring(code, consts): + if not consts: + return + first_const = consts[0] + if isinstance(first_const, str) or first_const is None: + code.docstring = first_const + + +class ConcreteInstr(Instr): + """Concrete instruction. + + arg must be an integer in the range 0..2147483647. + + It has a read-only size attribute. + """ + + __slots__ = ("_size", "_extended_args", "offset") + + def __init__(self, name, arg=UNSET, *, lineno=None, extended_args=None, offset=None): + # Allow to remember a potentially meaningless EXTENDED_ARG emitted by + # Python to properly compute the size and avoid messing up the jump + # targets + self._extended_args = extended_args + self._set(name, arg, lineno) + self.offset = offset + + def _check_arg(self, name, opcode, arg): + if opcode >= _opcode.HAVE_ARGUMENT: + if arg is UNSET: + raise ValueError("operation %s requires an argument" % name) + + _check_arg_int(name, arg) + else: + if arg is not UNSET: + raise ValueError("operation %s has no argument" % name) + + def _set(self, name, arg, lineno): + super()._set(name, arg, lineno) + size = 2 + if arg is not UNSET: + while arg > 0xFF: + size += 2 + arg >>= 8 + if self._extended_args is not None: + size = 2 + 2 * self._extended_args + self._size = size + + @property + def size(self): + return self._size + + def _cmp_key(self, labels=None): + return (self._lineno, self._name, self._arg) + + def get_jump_target(self, instr_offset): + if self._opcode in _opcode.hasjrel: + s = (self._size // 2) if OFFSET_AS_INSTRUCTION else self._size + return instr_offset + s + self._arg + if self._opcode in _opcode.hasjabs: + return self._arg + return None + + def assemble(self): + if self._arg is UNSET: + return bytes((self._opcode, 0)) + + arg = self._arg + b = [self._opcode, arg & 0xFF] + while arg > 0xFF: + arg >>= 8 + b[:0] = [_opcode.EXTENDED_ARG, arg & 0xFF] + + if self._extended_args: + while len(b) < self._size: + b[:0] = [_opcode.EXTENDED_ARG, 0x00] + + return bytes(b) + + @classmethod + def disassemble(cls, lineno, code, offset): + index = 2 * offset if OFFSET_AS_INSTRUCTION else offset + op = code[index] + if op >= _opcode.HAVE_ARGUMENT: + arg = code[index + 1] + else: + arg = UNSET + name = _opcode.opname[op] + # fabioz: added offset to ConcreteBytecode + # Need to keep an eye on https://github.com/MatthieuDartiailh/bytecode/issues/48 in + # case the library decides to add this in some other way. + return cls(name, arg, lineno=lineno, offset=index) + + +class ConcreteBytecode(_bytecode._BaseBytecodeList): + def __init__(self, instructions=(), *, consts=(), names=(), varnames=()): + super().__init__() + self.consts = list(consts) + self.names = list(names) + self.varnames = list(varnames) + for instr in instructions: + self._check_instr(instr) + self.extend(instructions) + + def __iter__(self): + instructions = super().__iter__() + for instr in instructions: + self._check_instr(instr) + yield instr + + def _check_instr(self, instr): + if not isinstance(instr, (ConcreteInstr, SetLineno)): + raise ValueError( + "ConcreteBytecode must only contain " "ConcreteInstr and SetLineno objects, " "but %s was found" % type(instr).__name__ + ) + + def _copy_attr_from(self, bytecode): + super()._copy_attr_from(bytecode) + if isinstance(bytecode, ConcreteBytecode): + self.consts = bytecode.consts + self.names = bytecode.names + self.varnames = bytecode.varnames + + def __repr__(self): + return "" % len(self) + + def __eq__(self, other): + if type(self) != type(other): + return False + + const_keys1 = list(map(const_key, self.consts)) + const_keys2 = list(map(const_key, other.consts)) + if const_keys1 != const_keys2: + return False + + if self.names != other.names: + return False + if self.varnames != other.varnames: + return False + + return super().__eq__(other) + + @staticmethod + def from_code(code, *, extended_arg=False): + line_starts = dict(entry for entry in dis.findlinestarts(code) if entry[1] is not None) + + # find block starts + instructions = [] + offset = 0 + lineno = code.co_firstlineno + while offset < (len(code.co_code) // (2 if OFFSET_AS_INSTRUCTION else 1)): + lineno_off = (2 * offset) if OFFSET_AS_INSTRUCTION else offset + if lineno_off in line_starts: + lineno = line_starts[lineno_off] + + instr = ConcreteInstr.disassemble(lineno, code.co_code, offset) + + instructions.append(instr) + offset += (instr.size // 2) if OFFSET_AS_INSTRUCTION else instr.size + + bytecode = ConcreteBytecode() + + # replace jump targets with blocks + # HINT : in some cases Python generate useless EXTENDED_ARG opcode + # with a value of zero. Such opcodes do not increases the size of the + # following opcode the way a normal EXTENDED_ARG does. As a + # consequence, they need to be tracked manually as otherwise the + # offsets in jump targets can end up being wrong. + if not extended_arg: + # The list is modified in place + bytecode._remove_extended_args(instructions) + + bytecode.name = code.co_name + bytecode.filename = code.co_filename + bytecode.flags = code.co_flags + bytecode.argcount = code.co_argcount + if sys.version_info >= (3, 8): + bytecode.posonlyargcount = code.co_posonlyargcount + bytecode.kwonlyargcount = code.co_kwonlyargcount + bytecode.first_lineno = code.co_firstlineno + bytecode.names = list(code.co_names) + bytecode.consts = list(code.co_consts) + bytecode.varnames = list(code.co_varnames) + bytecode.freevars = list(code.co_freevars) + bytecode.cellvars = list(code.co_cellvars) + _set_docstring(bytecode, code.co_consts) + + bytecode[:] = instructions + return bytecode + + @staticmethod + def _normalize_lineno(instructions, first_lineno): + lineno = first_lineno + for instr in instructions: + # if instr.lineno is not set, it's inherited from the previous + # instruction, or from self.first_lineno + if instr.lineno is not None: + lineno = instr.lineno + + if isinstance(instr, ConcreteInstr): + yield (lineno, instr) + + def _assemble_code(self): + offset = 0 + code_str = [] + linenos = [] + for lineno, instr in self._normalize_lineno(self, self.first_lineno): + code_str.append(instr.assemble()) + i_size = instr.size + linenos.append(((offset * 2) if OFFSET_AS_INSTRUCTION else offset, i_size, lineno)) + offset += (i_size // 2) if OFFSET_AS_INSTRUCTION else i_size + code_str = b"".join(code_str) + return (code_str, linenos) + + @staticmethod + def _assemble_lnotab(first_lineno, linenos): + lnotab = [] + old_offset = 0 + old_lineno = first_lineno + for offset, _, lineno in linenos: + dlineno = lineno - old_lineno + if dlineno == 0: + continue + # FIXME: be kind, force monotonic line numbers? add an option? + if dlineno < 0 and sys.version_info < (3, 6): + raise ValueError("negative line number delta is not supported " "on Python < 3.6") + old_lineno = lineno + + doff = offset - old_offset + old_offset = offset + + while doff > 255: + lnotab.append(b"\xff\x00") + doff -= 255 + + while dlineno < -128: + lnotab.append(struct.pack("Bb", doff, -128)) + doff = 0 + dlineno -= -128 + + while dlineno > 127: + lnotab.append(struct.pack("Bb", doff, 127)) + doff = 0 + dlineno -= 127 + + assert 0 <= doff <= 255 + assert -128 <= dlineno <= 127 + + lnotab.append(struct.pack("Bb", doff, dlineno)) + + return b"".join(lnotab) + + @staticmethod + def _pack_linetable(doff, dlineno, linetable): + while dlineno < -127: + linetable.append(struct.pack("Bb", 0, -127)) + dlineno -= -127 + + while dlineno > 127: + linetable.append(struct.pack("Bb", 0, 127)) + dlineno -= 127 + + if doff > 254: + linetable.append(struct.pack("Bb", 254, dlineno)) + doff -= 254 + + while doff > 254: + linetable.append(b"\xfe\x00") + doff -= 254 + linetable.append(struct.pack("Bb", doff, 0)) + + else: + linetable.append(struct.pack("Bb", doff, dlineno)) + + assert 0 <= doff <= 254 + assert -127 <= dlineno <= 127 + + def _assemble_linestable(self, first_lineno, linenos): + if not linenos: + return b"" + + linetable = [] + old_offset = 0 + + iter_in = iter(linenos) + + offset, i_size, old_lineno = next(iter_in) + old_dlineno = old_lineno - first_lineno + for offset, i_size, lineno in iter_in: + dlineno = lineno - old_lineno + if dlineno == 0: + continue + old_lineno = lineno + + doff = offset - old_offset + old_offset = offset + + self._pack_linetable(doff, old_dlineno, linetable) + old_dlineno = dlineno + + # Pack the line of the last instruction. + doff = offset + i_size - old_offset + self._pack_linetable(doff, old_dlineno, linetable) + + return b"".join(linetable) + + @staticmethod + def _remove_extended_args(instructions): + # replace jump targets with blocks + # HINT : in some cases Python generate useless EXTENDED_ARG opcode + # with a value of zero. Such opcodes do not increases the size of the + # following opcode the way a normal EXTENDED_ARG does. As a + # consequence, they need to be tracked manually as otherwise the + # offsets in jump targets can end up being wrong. + nb_extended_args = 0 + extended_arg = None + index = 0 + while index < len(instructions): + instr = instructions[index] + + # Skip SetLineno meta instruction + if isinstance(instr, SetLineno): + index += 1 + continue + + if instr.name == "EXTENDED_ARG": + nb_extended_args += 1 + if extended_arg is not None: + extended_arg = (extended_arg << 8) + instr.arg + else: + extended_arg = instr.arg + + del instructions[index] + continue + + if extended_arg is not None: + arg = (extended_arg << 8) + instr.arg + extended_arg = None + + instr = ConcreteInstr( + instr.name, + arg, + lineno=instr.lineno, + extended_args=nb_extended_args, + offset=instr.offset, + ) + instructions[index] = instr + nb_extended_args = 0 + + index += 1 + + if extended_arg is not None: + raise ValueError("EXTENDED_ARG at the end of the code") + + def compute_stacksize(self, *, check_pre_and_post=True): + bytecode = self.to_bytecode() + cfg = _bytecode.ControlFlowGraph.from_bytecode(bytecode) + return cfg.compute_stacksize(check_pre_and_post=check_pre_and_post) + + def to_code(self, stacksize=None, *, check_pre_and_post=True): + code_str, linenos = self._assemble_code() + lnotab = ( + self._assemble_linestable(self.first_lineno, linenos) + if sys.version_info >= (3, 10) + else self._assemble_lnotab(self.first_lineno, linenos) + ) + nlocals = len(self.varnames) + if stacksize is None: + stacksize = self.compute_stacksize(check_pre_and_post=check_pre_and_post) + + if sys.version_info < (3, 8): + return types.CodeType( + self.argcount, + self.kwonlyargcount, + nlocals, + stacksize, + int(self.flags), + code_str, + tuple(self.consts), + tuple(self.names), + tuple(self.varnames), + self.filename, + self.name, + self.first_lineno, + lnotab, + tuple(self.freevars), + tuple(self.cellvars), + ) + else: + return types.CodeType( + self.argcount, + self.posonlyargcount, + self.kwonlyargcount, + nlocals, + stacksize, + int(self.flags), + code_str, + tuple(self.consts), + tuple(self.names), + tuple(self.varnames), + self.filename, + self.name, + self.first_lineno, + lnotab, + tuple(self.freevars), + tuple(self.cellvars), + ) + + def to_bytecode(self): + # Copy instruction and remove extended args if any (in-place) + c_instructions = self[:] + self._remove_extended_args(c_instructions) + + # find jump targets + jump_targets = set() + offset = 0 + for instr in c_instructions: + if isinstance(instr, SetLineno): + continue + target = instr.get_jump_target(offset) + if target is not None: + jump_targets.add(target) + offset += (instr.size // 2) if OFFSET_AS_INSTRUCTION else instr.size + + # create labels + jumps = [] + instructions = [] + labels = {} + offset = 0 + ncells = len(self.cellvars) + + for lineno, instr in self._normalize_lineno(c_instructions, self.first_lineno): + if offset in jump_targets: + label = Label() + labels[offset] = label + instructions.append(label) + + jump_target = instr.get_jump_target(offset) + size = instr.size + + arg = instr.arg + # FIXME: better error reporting + if instr.opcode in _opcode.hasconst: + arg = self.consts[arg] + elif instr.opcode in _opcode.haslocal: + arg = self.varnames[arg] + elif instr.opcode in _opcode.hasname: + arg = self.names[arg] + elif instr.opcode in _opcode.hasfree: + if arg < ncells: + name = self.cellvars[arg] + arg = CellVar(name) + else: + name = self.freevars[arg - ncells] + arg = FreeVar(name) + elif instr.opcode in _opcode.hascompare: + arg = Compare(arg) + + if jump_target is None: + instr = Instr(instr.name, arg, lineno=lineno, offset=instr.offset) + else: + instr_index = len(instructions) + instructions.append(instr) + offset += (size // 2) if OFFSET_AS_INSTRUCTION else size + + if jump_target is not None: + jumps.append((instr_index, jump_target)) + + # replace jump targets with labels + for index, jump_target in jumps: + instr = instructions[index] + # FIXME: better error reporting on missing label + label = labels[jump_target] + instructions[index] = Instr(instr.name, label, lineno=instr.lineno, offset=instr.offset) + + bytecode = _bytecode.Bytecode() + bytecode._copy_attr_from(self) + + nargs = bytecode.argcount + bytecode.kwonlyargcount + if sys.version_info > (3, 8): + nargs += bytecode.posonlyargcount + if bytecode.flags & inspect.CO_VARARGS: + nargs += 1 + if bytecode.flags & inspect.CO_VARKEYWORDS: + nargs += 1 + bytecode.argnames = self.varnames[:nargs] + _set_docstring(bytecode, self.consts) + + bytecode.extend(instructions) + return bytecode + + +class _ConvertBytecodeToConcrete: + # Default number of passes of compute_jumps() before giving up. Refer to + # assemble_jump_offsets() in compile.c for background. + _compute_jumps_passes = 10 + + def __init__(self, code): + assert isinstance(code, _bytecode.Bytecode) + self.bytecode = code + + # temporary variables + self.instructions = [] + self.jumps = [] + self.labels = {} + + # used to build ConcreteBytecode() object + self.consts_indices = {} + self.consts_list = [] + self.names = [] + self.varnames = [] + + def add_const(self, value): + key = const_key(value) + if key in self.consts_indices: + return self.consts_indices[key] + index = len(self.consts_indices) + self.consts_indices[key] = index + self.consts_list.append(value) + return index + + @staticmethod + def add(names, name): + try: + index = names.index(name) + except ValueError: + index = len(names) + names.append(name) + return index + + def concrete_instructions(self): + ncells = len(self.bytecode.cellvars) + lineno = self.bytecode.first_lineno + + for instr in self.bytecode: + if isinstance(instr, Label): + self.labels[instr] = len(self.instructions) + continue + + if isinstance(instr, SetLineno): + lineno = instr.lineno + continue + + if isinstance(instr, ConcreteInstr): + instr = instr.copy() + else: + assert isinstance(instr, Instr) + + if instr.lineno is not None: + lineno = instr.lineno + + arg = instr.arg + is_jump = isinstance(arg, Label) + if is_jump: + label = arg + # fake value, real value is set in compute_jumps() + arg = 0 + elif instr.opcode in _opcode.hasconst: + arg = self.add_const(arg) + elif instr.opcode in _opcode.haslocal: + arg = self.add(self.varnames, arg) + elif instr.opcode in _opcode.hasname: + arg = self.add(self.names, arg) + elif instr.opcode in _opcode.hasfree: + if isinstance(arg, CellVar): + arg = self.bytecode.cellvars.index(arg.name) + else: + assert isinstance(arg, FreeVar) + arg = ncells + self.bytecode.freevars.index(arg.name) + elif instr.opcode in _opcode.hascompare: + if isinstance(arg, Compare): + arg = arg.value + + instr = ConcreteInstr(instr.name, arg, lineno=lineno) + if is_jump: + self.jumps.append((len(self.instructions), label, instr)) + + self.instructions.append(instr) + + def compute_jumps(self): + offsets = [] + offset = 0 + for index, instr in enumerate(self.instructions): + offsets.append(offset) + offset += instr.size // 2 if OFFSET_AS_INSTRUCTION else instr.size + # needed if a label is at the end + offsets.append(offset) + + # fix argument of jump instructions: resolve labels + modified = False + for index, label, instr in self.jumps: + target_index = self.labels[label] + target_offset = offsets[target_index] + + if instr.opcode in _opcode.hasjrel: + instr_offset = offsets[index] + target_offset -= instr_offset + (instr.size // 2 if OFFSET_AS_INSTRUCTION else instr.size) + + old_size = instr.size + # FIXME: better error report if target_offset is negative + instr.arg = target_offset + if instr.size != old_size: + modified = True + + return modified + + def to_concrete_bytecode(self, compute_jumps_passes=None): + if compute_jumps_passes is None: + compute_jumps_passes = self._compute_jumps_passes + + first_const = self.bytecode.docstring + if first_const is not UNSET: + self.add_const(first_const) + + self.varnames.extend(self.bytecode.argnames) + + self.concrete_instructions() + for pas in range(0, compute_jumps_passes): + modified = self.compute_jumps() + if not modified: + break + else: + raise RuntimeError("compute_jumps() failed to converge after" " %d passes" % (pas + 1)) + + concrete = ConcreteBytecode( + self.instructions, + consts=self.consts_list.copy(), + names=self.names, + varnames=self.varnames, + ) + concrete._copy_attr_from(self.bytecode) + return concrete diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/flags.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/flags.py new file mode 100644 index 0000000..ea72f9e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/flags.py @@ -0,0 +1,162 @@ +# alias to keep the 'bytecode' variable free +import sys +from enum import IntFlag +from _pydevd_frame_eval.vendored import bytecode as _bytecode + + +class CompilerFlags(IntFlag): + """Possible values of the co_flags attribute of Code object. + + Note: We do not rely on inspect values here as some of them are missing and + furthermore would be version dependent. + + """ + + OPTIMIZED = 0x00001 # noqa + NEWLOCALS = 0x00002 # noqa + VARARGS = 0x00004 # noqa + VARKEYWORDS = 0x00008 # noqa + NESTED = 0x00010 # noqa + GENERATOR = 0x00020 # noqa + NOFREE = 0x00040 # noqa + # New in Python 3.5 + # Used for coroutines defined using async def ie native coroutine + COROUTINE = 0x00080 # noqa + # Used for coroutines defined as a generator and then decorated using + # types.coroutine + ITERABLE_COROUTINE = 0x00100 # noqa + # New in Python 3.6 + # Generator defined in an async def function + ASYNC_GENERATOR = 0x00200 # noqa + + # __future__ flags + # future flags changed in Python 3.9 + if sys.version_info < (3, 9): + FUTURE_GENERATOR_STOP = 0x80000 # noqa + if sys.version_info > (3, 6): + FUTURE_ANNOTATIONS = 0x100000 + else: + FUTURE_GENERATOR_STOP = 0x800000 # noqa + FUTURE_ANNOTATIONS = 0x1000000 + + +def infer_flags(bytecode, is_async=None): + """Infer the proper flags for a bytecode based on the instructions. + + Because the bytecode does not have enough context to guess if a function + is asynchronous the algorithm tries to be conservative and will never turn + a previously async code into a sync one. + + Parameters + ---------- + bytecode : Bytecode | ConcreteBytecode | ControlFlowGraph + Bytecode for which to infer the proper flags + is_async : bool | None, optional + Force the code to be marked as asynchronous if True, prevent it from + being marked as asynchronous if False and simply infer the best + solution based on the opcode and the existing flag if None. + + """ + flags = CompilerFlags(0) + if not isinstance( + bytecode, + (_bytecode.Bytecode, _bytecode.ConcreteBytecode, _bytecode.ControlFlowGraph), + ): + msg = "Expected a Bytecode, ConcreteBytecode or ControlFlowGraph " "instance not %s" + raise ValueError(msg % bytecode) + + instructions = bytecode.get_instructions() if isinstance(bytecode, _bytecode.ControlFlowGraph) else bytecode + instr_names = {i.name for i in instructions if not isinstance(i, (_bytecode.SetLineno, _bytecode.Label))} + + # Identify optimized code + if not (instr_names & {"STORE_NAME", "LOAD_NAME", "DELETE_NAME"}): + flags |= CompilerFlags.OPTIMIZED + + # Check for free variables + if not ( + instr_names + & { + "LOAD_CLOSURE", + "LOAD_DEREF", + "STORE_DEREF", + "DELETE_DEREF", + "LOAD_CLASSDEREF", + } + ): + flags |= CompilerFlags.NOFREE + + # Copy flags for which we cannot infer the right value + flags |= bytecode.flags & (CompilerFlags.NEWLOCALS | CompilerFlags.VARARGS | CompilerFlags.VARKEYWORDS | CompilerFlags.NESTED) + + sure_generator = instr_names & {"YIELD_VALUE"} + maybe_generator = instr_names & {"YIELD_VALUE", "YIELD_FROM"} + + sure_async = instr_names & { + "GET_AWAITABLE", + "GET_AITER", + "GET_ANEXT", + "BEFORE_ASYNC_WITH", + "SETUP_ASYNC_WITH", + "END_ASYNC_FOR", + } + + # If performing inference or forcing an async behavior, first inspect + # the flags since this is the only way to identify iterable coroutines + if is_async in (None, True): + if bytecode.flags & CompilerFlags.COROUTINE: + if sure_generator: + flags |= CompilerFlags.ASYNC_GENERATOR + else: + flags |= CompilerFlags.COROUTINE + elif bytecode.flags & CompilerFlags.ITERABLE_COROUTINE: + if sure_async: + msg = ( + "The ITERABLE_COROUTINE flag is set but bytecode that" + "can only be used in async functions have been " + "detected. Please unset that flag before performing " + "inference." + ) + raise ValueError(msg) + flags |= CompilerFlags.ITERABLE_COROUTINE + elif bytecode.flags & CompilerFlags.ASYNC_GENERATOR: + if not sure_generator: + flags |= CompilerFlags.COROUTINE + else: + flags |= CompilerFlags.ASYNC_GENERATOR + + # If the code was not asynchronous before determine if it should now be + # asynchronous based on the opcode and the is_async argument. + else: + if sure_async: + # YIELD_FROM is not allowed in async generator + if sure_generator: + flags |= CompilerFlags.ASYNC_GENERATOR + else: + flags |= CompilerFlags.COROUTINE + + elif maybe_generator: + if is_async: + if sure_generator: + flags |= CompilerFlags.ASYNC_GENERATOR + else: + flags |= CompilerFlags.COROUTINE + else: + flags |= CompilerFlags.GENERATOR + + elif is_async: + flags |= CompilerFlags.COROUTINE + + # If the code should not be asynchronous, check first it is possible and + # next set the GENERATOR flag if relevant + else: + if sure_async: + raise ValueError( + "The is_async argument is False but bytecodes " "that can only be used in async functions have " "been detected." + ) + + if maybe_generator: + flags |= CompilerFlags.GENERATOR + + flags |= bytecode.flags & CompilerFlags.FUTURE_GENERATOR_STOP + + return flags diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/instr.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/instr.py new file mode 100644 index 0000000..a25bea8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/instr.py @@ -0,0 +1,372 @@ +import enum +import dis +import opcode as _opcode +import sys +from marshal import dumps as _dumps + +from _pydevd_frame_eval.vendored import bytecode as _bytecode + + +@enum.unique +class Compare(enum.IntEnum): + LT = 0 + LE = 1 + EQ = 2 + NE = 3 + GT = 4 + GE = 5 + IN = 6 + NOT_IN = 7 + IS = 8 + IS_NOT = 9 + EXC_MATCH = 10 + + +UNSET = object() + + +def const_key(obj): + try: + return _dumps(obj) + except ValueError: + # For other types, we use the object identifier as an unique identifier + # to ensure that they are seen as unequal. + return (type(obj), id(obj)) + + +def _pushes_back(opname): + if opname in ["CALL_FINALLY"]: + # CALL_FINALLY pushes the address of the "finally" block instead of a + # value, hence we don't treat it as pushing back op + return False + return ( + opname.startswith("UNARY_") + or opname.startswith("GET_") + # BUILD_XXX_UNPACK have been removed in 3.9 + or opname.startswith("BINARY_") + or opname.startswith("INPLACE_") + or opname.startswith("BUILD_") + or opname.startswith("CALL_") + ) or opname in ( + "LIST_TO_TUPLE", + "LIST_EXTEND", + "SET_UPDATE", + "DICT_UPDATE", + "DICT_MERGE", + "IS_OP", + "CONTAINS_OP", + "FORMAT_VALUE", + "MAKE_FUNCTION", + "IMPORT_NAME", + # technically, these three do not push back, but leave the container + # object on TOS + "SET_ADD", + "LIST_APPEND", + "MAP_ADD", + "LOAD_ATTR", + ) + + +def _check_lineno(lineno): + if not isinstance(lineno, int): + raise TypeError("lineno must be an int") + if lineno < 1: + raise ValueError("invalid lineno") + + +class SetLineno: + __slots__ = ("_lineno",) + + def __init__(self, lineno): + _check_lineno(lineno) + self._lineno = lineno + + @property + def lineno(self): + return self._lineno + + def __eq__(self, other): + if not isinstance(other, SetLineno): + return False + return self._lineno == other._lineno + + +class Label: + __slots__ = () + + +class _Variable: + __slots__ = ("name",) + + def __init__(self, name): + self.name = name + + def __eq__(self, other): + if type(self) != type(other): + return False + return self.name == other.name + + def __str__(self): + return self.name + + def __repr__(self): + return "<%s %r>" % (self.__class__.__name__, self.name) + + +class CellVar(_Variable): + __slots__ = () + + +class FreeVar(_Variable): + __slots__ = () + + +def _check_arg_int(name, arg): + if not isinstance(arg, int): + raise TypeError("operation %s argument must be an int, " "got %s" % (name, type(arg).__name__)) + + if not (0 <= arg <= 2147483647): + raise ValueError("operation %s argument must be in " "the range 0..2,147,483,647" % name) + + +if sys.version_info < (3, 8): + _stack_effects = { + # NOTE: the entries are all 2-tuples. Entry[0/False] is non-taken jumps. + # Entry[1/True] is for taken jumps. + # opcodes not in dis.stack_effect + _opcode.opmap["EXTENDED_ARG"]: (0, 0), + _opcode.opmap["NOP"]: (0, 0), + # Jump taken/not-taken are different: + _opcode.opmap["JUMP_IF_TRUE_OR_POP"]: (-1, 0), + _opcode.opmap["JUMP_IF_FALSE_OR_POP"]: (-1, 0), + _opcode.opmap["FOR_ITER"]: (1, -1), + _opcode.opmap["SETUP_WITH"]: (1, 6), + _opcode.opmap["SETUP_ASYNC_WITH"]: (0, 5), + _opcode.opmap["SETUP_EXCEPT"]: (0, 6), # as of 3.7, below for <=3.6 + _opcode.opmap["SETUP_FINALLY"]: (0, 6), # as of 3.7, below for <=3.6 + } + + # More stack effect values that are unique to the version of Python. + if sys.version_info < (3, 7): + _stack_effects.update( + { + _opcode.opmap["SETUP_WITH"]: (7, 7), + _opcode.opmap["SETUP_EXCEPT"]: (6, 9), + _opcode.opmap["SETUP_FINALLY"]: (6, 9), + } + ) + + +class Instr: + """Abstract instruction.""" + + __slots__ = ("_name", "_opcode", "_arg", "_lineno", "offset") + + def __init__(self, name, arg=UNSET, *, lineno=None, offset=None): + self._set(name, arg, lineno) + self.offset = offset + + def _check_arg(self, name, opcode, arg): + if name == "EXTENDED_ARG": + raise ValueError( + "only concrete instruction can contain EXTENDED_ARG, " "highlevel instruction can represent arbitrary argument without it" + ) + + if opcode >= _opcode.HAVE_ARGUMENT: + if arg is UNSET: + raise ValueError("operation %s requires an argument" % name) + else: + if arg is not UNSET: + raise ValueError("operation %s has no argument" % name) + + if self._has_jump(opcode): + if not isinstance(arg, (Label, _bytecode.BasicBlock)): + raise TypeError("operation %s argument type must be " "Label or BasicBlock, got %s" % (name, type(arg).__name__)) + + elif opcode in _opcode.hasfree: + if not isinstance(arg, (CellVar, FreeVar)): + raise TypeError("operation %s argument must be CellVar " "or FreeVar, got %s" % (name, type(arg).__name__)) + + elif opcode in _opcode.haslocal or opcode in _opcode.hasname: + if not isinstance(arg, str): + raise TypeError("operation %s argument must be a str, " "got %s" % (name, type(arg).__name__)) + + elif opcode in _opcode.hasconst: + if isinstance(arg, Label): + raise ValueError("label argument cannot be used " "in %s operation" % name) + if isinstance(arg, _bytecode.BasicBlock): + raise ValueError("block argument cannot be used " "in %s operation" % name) + + elif opcode in _opcode.hascompare: + if not isinstance(arg, Compare): + raise TypeError("operation %s argument type must be " "Compare, got %s" % (name, type(arg).__name__)) + + elif opcode >= _opcode.HAVE_ARGUMENT: + _check_arg_int(name, arg) + + def _set(self, name, arg, lineno): + if not isinstance(name, str): + raise TypeError("operation name must be a str") + try: + opcode = _opcode.opmap[name] + except KeyError: + raise ValueError("invalid operation name") + + # check lineno + if lineno is not None: + _check_lineno(lineno) + + self._check_arg(name, opcode, arg) + + self._name = name + self._opcode = opcode + self._arg = arg + self._lineno = lineno + + def set(self, name, arg=UNSET): + """Modify the instruction in-place. + + Replace name and arg attributes. Don't modify lineno. + """ + self._set(name, arg, self._lineno) + + def require_arg(self): + """Does the instruction require an argument?""" + return self._opcode >= _opcode.HAVE_ARGUMENT + + @property + def name(self): + return self._name + + @name.setter + def name(self, name): + self._set(name, self._arg, self._lineno) + + @property + def opcode(self): + return self._opcode + + @opcode.setter + def opcode(self, op): + if not isinstance(op, int): + raise TypeError("operator code must be an int") + if 0 <= op <= 255: + name = _opcode.opname[op] + valid = name != "<%r>" % op + else: + valid = False + if not valid: + raise ValueError("invalid operator code") + + self._set(name, self._arg, self._lineno) + + @property + def arg(self): + return self._arg + + @arg.setter + def arg(self, arg): + self._set(self._name, arg, self._lineno) + + @property + def lineno(self): + return self._lineno + + @lineno.setter + def lineno(self, lineno): + self._set(self._name, self._arg, lineno) + + def stack_effect(self, jump=None): + if self._opcode < _opcode.HAVE_ARGUMENT: + arg = None + elif not isinstance(self._arg, int) or self._opcode in _opcode.hasconst: + # Argument is either a non-integer or an integer constant, + # not oparg. + arg = 0 + else: + arg = self._arg + + if sys.version_info < (3, 8): + effect = _stack_effects.get(self._opcode, None) + if effect is not None: + return max(effect) if jump is None else effect[jump] + return dis.stack_effect(self._opcode, arg) + else: + return dis.stack_effect(self._opcode, arg, jump=jump) + + def pre_and_post_stack_effect(self, jump=None): + _effect = self.stack_effect(jump=jump) + + # To compute pre size and post size to avoid segfault cause by not enough + # stack element + _opname = _opcode.opname[self._opcode] + if _opname.startswith("DUP_TOP"): + return _effect * -1, _effect * 2 + if _pushes_back(_opname): + # if the op pushes value back to the stack, then the stack effect given + # by dis.stack_effect actually equals pre + post effect, therefore we need + # -1 from the stack effect as a pre condition + return _effect - 1, 1 + if _opname.startswith("UNPACK_"): + # Instr(UNPACK_* , n) pops 1 and pushes n + # _effect = n - 1 + # hence we return -1, _effect + 1 + return -1, _effect + 1 + if _opname == "FOR_ITER" and not jump: + # Since FOR_ITER needs TOS to be an iterator, which basically means + # a prerequisite of 1 on the stack + return -1, 2 + if _opname == "ROT_N": + return (-self._arg, self._arg) + return {"ROT_TWO": (-2, 2), "ROT_THREE": (-3, 3), "ROT_FOUR": (-4, 4)}.get(_opname, (_effect, 0)) + + def copy(self): + return self.__class__(self._name, self._arg, lineno=self._lineno, offset=self.offset) + + def __repr__(self): + if self._arg is not UNSET: + return "<%s arg=%r lineno=%s>" % (self._name, self._arg, self._lineno) + else: + return "<%s lineno=%s>" % (self._name, self._lineno) + + def _cmp_key(self, labels=None): + arg = self._arg + if self._opcode in _opcode.hasconst: + arg = const_key(arg) + elif isinstance(arg, Label) and labels is not None: + arg = labels[arg] + return (self._lineno, self._name, arg) + + def __eq__(self, other): + if type(self) != type(other): + return False + return self._cmp_key() == other._cmp_key() + + @staticmethod + def _has_jump(opcode): + return opcode in _opcode.hasjrel or opcode in _opcode.hasjabs + + def has_jump(self): + return self._has_jump(self._opcode) + + def is_cond_jump(self): + """Is a conditional jump?""" + # Ex: POP_JUMP_IF_TRUE, JUMP_IF_FALSE_OR_POP + return "JUMP_IF_" in self._name + + def is_uncond_jump(self): + """Is an unconditional jump?""" + return self.name in {"JUMP_FORWARD", "JUMP_ABSOLUTE"} + + def is_final(self): + if self._name in { + "RETURN_VALUE", + "RAISE_VARARGS", + "RERAISE", + "BREAK_LOOP", + "CONTINUE_LOOP", + }: + return True + if self.is_uncond_jump(): + return True + return False diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/peephole_opt.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/peephole_opt.py new file mode 100644 index 0000000..4ed147f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/peephole_opt.py @@ -0,0 +1,488 @@ +""" +Peephole optimizer of CPython 3.6 reimplemented in pure Python using +the bytecode module. +""" +import opcode +import operator +import sys +from _pydevd_frame_eval.vendored.bytecode import Instr, Bytecode, ControlFlowGraph, BasicBlock, Compare + +JUMPS_ON_TRUE = frozenset( + ( + "POP_JUMP_IF_TRUE", + "JUMP_IF_TRUE_OR_POP", + ) +) + +NOT_COMPARE = { + Compare.IN: Compare.NOT_IN, + Compare.NOT_IN: Compare.IN, + Compare.IS: Compare.IS_NOT, + Compare.IS_NOT: Compare.IS, +} + +MAX_SIZE = 20 + + +class ExitUnchanged(Exception): + """Exception used to skip the peephole optimizer""" + + pass + + +class PeepholeOptimizer: + """Python reimplementation of the peephole optimizer. + + Copy of the C comment: + + Perform basic peephole optimizations to components of a code object. + The consts object should still be in list form to allow new constants + to be appended. + + To keep the optimizer simple, it bails out (does nothing) for code that + has a length over 32,700, and does not calculate extended arguments. + That allows us to avoid overflow and sign issues. Likewise, it bails when + the lineno table has complex encoding for gaps >= 255. EXTENDED_ARG can + appear before MAKE_FUNCTION; in this case both opcodes are skipped. + EXTENDED_ARG preceding any other opcode causes the optimizer to bail. + + Optimizations are restricted to simple transformations occuring within a + single basic block. All transformations keep the code size the same or + smaller. For those that reduce size, the gaps are initially filled with + NOPs. Later those NOPs are removed and the jump addresses retargeted in + a single pass. Code offset is adjusted accordingly. + """ + + def __init__(self): + # bytecode.ControlFlowGraph instance + self.code = None + self.const_stack = None + self.block_index = None + self.block = None + # index of the current instruction in self.block instructions + self.index = None + # whether we are in a LOAD_CONST sequence + self.in_consts = False + + def check_result(self, value): + try: + size = len(value) + except TypeError: + return True + return size <= MAX_SIZE + + def replace_load_const(self, nconst, instr, result): + # FIXME: remove temporary computed constants? + # FIXME: or at least reuse existing constants? + + self.in_consts = True + + load_const = Instr("LOAD_CONST", result, lineno=instr.lineno) + start = self.index - nconst - 1 + self.block[start : self.index] = (load_const,) + self.index -= nconst + + if nconst: + del self.const_stack[-nconst:] + self.const_stack.append(result) + self.in_consts = True + + def eval_LOAD_CONST(self, instr): + self.in_consts = True + value = instr.arg + self.const_stack.append(value) + self.in_consts = True + + def unaryop(self, op, instr): + try: + value = self.const_stack[-1] + result = op(value) + except IndexError: + return + + if not self.check_result(result): + return + + self.replace_load_const(1, instr, result) + + def eval_UNARY_POSITIVE(self, instr): + return self.unaryop(operator.pos, instr) + + def eval_UNARY_NEGATIVE(self, instr): + return self.unaryop(operator.neg, instr) + + def eval_UNARY_INVERT(self, instr): + return self.unaryop(operator.invert, instr) + + def get_next_instr(self, name): + try: + next_instr = self.block[self.index] + except IndexError: + return None + if next_instr.name == name: + return next_instr + return None + + def eval_UNARY_NOT(self, instr): + # Note: UNARY_NOT is not optimized + + next_instr = self.get_next_instr("POP_JUMP_IF_FALSE") + if next_instr is None: + return None + + # Replace UNARY_NOT+POP_JUMP_IF_FALSE with POP_JUMP_IF_TRUE + instr.set("POP_JUMP_IF_TRUE", next_instr.arg) + del self.block[self.index] + + def binop(self, op, instr): + try: + left = self.const_stack[-2] + right = self.const_stack[-1] + except IndexError: + return + + try: + result = op(left, right) + except Exception: + return + + if not self.check_result(result): + return + + self.replace_load_const(2, instr, result) + + def eval_BINARY_ADD(self, instr): + return self.binop(operator.add, instr) + + def eval_BINARY_SUBTRACT(self, instr): + return self.binop(operator.sub, instr) + + def eval_BINARY_MULTIPLY(self, instr): + return self.binop(operator.mul, instr) + + def eval_BINARY_TRUE_DIVIDE(self, instr): + return self.binop(operator.truediv, instr) + + def eval_BINARY_FLOOR_DIVIDE(self, instr): + return self.binop(operator.floordiv, instr) + + def eval_BINARY_MODULO(self, instr): + return self.binop(operator.mod, instr) + + def eval_BINARY_POWER(self, instr): + return self.binop(operator.pow, instr) + + def eval_BINARY_LSHIFT(self, instr): + return self.binop(operator.lshift, instr) + + def eval_BINARY_RSHIFT(self, instr): + return self.binop(operator.rshift, instr) + + def eval_BINARY_AND(self, instr): + return self.binop(operator.and_, instr) + + def eval_BINARY_OR(self, instr): + return self.binop(operator.or_, instr) + + def eval_BINARY_XOR(self, instr): + return self.binop(operator.xor, instr) + + def eval_BINARY_SUBSCR(self, instr): + return self.binop(operator.getitem, instr) + + def replace_container_of_consts(self, instr, container_type): + items = self.const_stack[-instr.arg :] + value = container_type(items) + self.replace_load_const(instr.arg, instr, value) + + def build_tuple_unpack_seq(self, instr): + next_instr = self.get_next_instr("UNPACK_SEQUENCE") + if next_instr is None or next_instr.arg != instr.arg: + return + + if instr.arg < 1: + return + + if self.const_stack and instr.arg <= len(self.const_stack): + nconst = instr.arg + start = self.index - 1 + + # Rewrite LOAD_CONST instructions in the reverse order + load_consts = self.block[start - nconst : start] + self.block[start - nconst : start] = reversed(load_consts) + + # Remove BUILD_TUPLE+UNPACK_SEQUENCE + self.block[start : start + 2] = () + self.index -= 2 + self.const_stack.clear() + return + + if instr.arg == 1: + # Replace BUILD_TUPLE 1 + UNPACK_SEQUENCE 1 with NOP + del self.block[self.index - 1 : self.index + 1] + elif instr.arg == 2: + # Replace BUILD_TUPLE 2 + UNPACK_SEQUENCE 2 with ROT_TWO + rot2 = Instr("ROT_TWO", lineno=instr.lineno) + self.block[self.index - 1 : self.index + 1] = (rot2,) + self.index -= 1 + self.const_stack.clear() + elif instr.arg == 3: + # Replace BUILD_TUPLE 3 + UNPACK_SEQUENCE 3 + # with ROT_THREE + ROT_TWO + rot3 = Instr("ROT_THREE", lineno=instr.lineno) + rot2 = Instr("ROT_TWO", lineno=instr.lineno) + self.block[self.index - 1 : self.index + 1] = (rot3, rot2) + self.index -= 1 + self.const_stack.clear() + + def build_tuple(self, instr, container_type): + if instr.arg > len(self.const_stack): + return + + next_instr = self.get_next_instr("COMPARE_OP") + if next_instr is None or next_instr.arg not in (Compare.IN, Compare.NOT_IN): + return + + self.replace_container_of_consts(instr, container_type) + return True + + def eval_BUILD_TUPLE(self, instr): + if not instr.arg: + return + + if instr.arg <= len(self.const_stack): + self.replace_container_of_consts(instr, tuple) + else: + self.build_tuple_unpack_seq(instr) + + def eval_BUILD_LIST(self, instr): + if not instr.arg: + return + + if not self.build_tuple(instr, tuple): + self.build_tuple_unpack_seq(instr) + + def eval_BUILD_SET(self, instr): + if not instr.arg: + return + + self.build_tuple(instr, frozenset) + + # Note: BUILD_SLICE is not optimized + + def eval_COMPARE_OP(self, instr): + # Note: COMPARE_OP: 2 < 3 is not optimized + + try: + new_arg = NOT_COMPARE[instr.arg] + except KeyError: + return + + if self.get_next_instr("UNARY_NOT") is None: + return + + # not (a is b) --> a is not b + # not (a in b) --> a not in b + # not (a is not b) --> a is b + # not (a not in b) --> a in b + instr.arg = new_arg + self.block[self.index - 1 : self.index + 1] = (instr,) + + def jump_if_or_pop(self, instr): + # Simplify conditional jump to conditional jump where the + # result of the first test implies the success of a similar + # test or the failure of the opposite test. + # + # Arises in code like: + # "if a and b:" + # "if a or b:" + # "a and b or c" + # "(a and b) and c" + # + # x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z + # --> x:JUMP_IF_FALSE_OR_POP z + # + # x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z + # --> x:POP_JUMP_IF_FALSE y+3 + # where y+3 is the instruction following the second test. + target_block = instr.arg + try: + target_instr = target_block[0] + except IndexError: + return + + if not target_instr.is_cond_jump(): + self.optimize_jump_to_cond_jump(instr) + return + + if (target_instr.name in JUMPS_ON_TRUE) == (instr.name in JUMPS_ON_TRUE): + # The second jump will be taken iff the first is. + + target2 = target_instr.arg + # The current opcode inherits its target's stack behaviour + instr.name = target_instr.name + instr.arg = target2 + self.block[self.index - 1] = instr + self.index -= 1 + else: + # The second jump is not taken if the first is (so jump past it), + # and all conditional jumps pop their argument when they're not + # taken (so change the first jump to pop its argument when it's + # taken). + if instr.name in JUMPS_ON_TRUE: + name = "POP_JUMP_IF_TRUE" + else: + name = "POP_JUMP_IF_FALSE" + + new_label = self.code.split_block(target_block, 1) + + instr.name = name + instr.arg = new_label + self.block[self.index - 1] = instr + self.index -= 1 + + def eval_JUMP_IF_FALSE_OR_POP(self, instr): + self.jump_if_or_pop(instr) + + def eval_JUMP_IF_TRUE_OR_POP(self, instr): + self.jump_if_or_pop(instr) + + def eval_NOP(self, instr): + # Remove NOP + del self.block[self.index - 1] + self.index -= 1 + + def optimize_jump_to_cond_jump(self, instr): + # Replace jumps to unconditional jumps + jump_label = instr.arg + assert isinstance(jump_label, BasicBlock), jump_label + + try: + target_instr = jump_label[0] + except IndexError: + return + + if instr.is_uncond_jump() and target_instr.name == "RETURN_VALUE": + # Replace JUMP_ABSOLUTE => RETURN_VALUE with RETURN_VALUE + self.block[self.index - 1] = target_instr + + elif target_instr.is_uncond_jump(): + # Replace JUMP_FORWARD t1 jumping to JUMP_FORWARD t2 + # with JUMP_ABSOLUTE t2 + jump_target2 = target_instr.arg + + name = instr.name + if instr.name == "JUMP_FORWARD": + name = "JUMP_ABSOLUTE" + else: + # FIXME: reimplement this check + # if jump_target2 < 0: + # # No backward relative jumps + # return + + # FIXME: remove this workaround and implement comment code ^^ + if instr.opcode in opcode.hasjrel: + return + + instr.name = name + instr.arg = jump_target2 + self.block[self.index - 1] = instr + + def optimize_jump(self, instr): + if instr.is_uncond_jump() and self.index == len(self.block): + # JUMP_ABSOLUTE at the end of a block which points to the + # following block: remove the jump, link the current block + # to the following block + block_index = self.block_index + target_block = instr.arg + target_block_index = self.code.get_block_index(target_block) + if target_block_index == block_index: + del self.block[self.index - 1] + self.block.next_block = target_block + return + + self.optimize_jump_to_cond_jump(instr) + + def iterblock(self, block): + self.block = block + self.index = 0 + while self.index < len(block): + instr = self.block[self.index] + self.index += 1 + yield instr + + def optimize_block(self, block): + self.const_stack.clear() + self.in_consts = False + + for instr in self.iterblock(block): + if not self.in_consts: + self.const_stack.clear() + self.in_consts = False + + meth_name = "eval_%s" % instr.name + meth = getattr(self, meth_name, None) + if meth is not None: + meth(instr) + elif instr.has_jump(): + self.optimize_jump(instr) + + # Note: Skipping over LOAD_CONST trueconst; POP_JUMP_IF_FALSE + # is not implemented, since it looks like the optimization + # is never trigerred in practice. The compiler already optimizes if + # and while statements. + + def remove_dead_blocks(self): + # FIXME: remove empty blocks? + + used_blocks = {id(self.code[0])} + for block in self.code: + if block.next_block is not None: + used_blocks.add(id(block.next_block)) + for instr in block: + if isinstance(instr, Instr) and isinstance(instr.arg, BasicBlock): + used_blocks.add(id(instr.arg)) + + block_index = 0 + while block_index < len(self.code): + block = self.code[block_index] + if id(block) not in used_blocks: + del self.code[block_index] + else: + block_index += 1 + + # FIXME: merge following blocks if block1 does not contain any + # jump and block1.next_block is block2 + + def optimize_cfg(self, cfg): + self.code = cfg + self.const_stack = [] + + self.remove_dead_blocks() + + self.block_index = 0 + while self.block_index < len(self.code): + block = self.code[self.block_index] + self.block_index += 1 + self.optimize_block(block) + + def optimize(self, code_obj): + bytecode = Bytecode.from_code(code_obj) + cfg = ControlFlowGraph.from_bytecode(bytecode) + + self.optimize_cfg(cfg) + + bytecode = cfg.to_bytecode() + code = bytecode.to_code() + return code + + +# Code transformer for the PEP 511 +class CodeTransformer: + name = "pyopt" + + def code_transformer(self, code, context): + if sys.flags.verbose: + print("Optimize %s:%s: %s" % (code.co_filename, code.co_firstlineno, code.co_name)) + optimizer = PeepholeOptimizer() + return optimizer.optimize(code) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__init__.py new file mode 100644 index 0000000..cc33b30 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__init__.py @@ -0,0 +1,150 @@ +import sys +import textwrap +import types +import unittest + +from _pydevd_frame_eval.vendored.bytecode import ( + UNSET, + Label, + Instr, + ConcreteInstr, + BasicBlock, # noqa + Bytecode, + ControlFlowGraph, + ConcreteBytecode, +) + + +def _format_instr_list(block, labels, lineno): + instr_list = [] + for instr in block: + if not isinstance(instr, Label): + if isinstance(instr, ConcreteInstr): + cls_name = "ConcreteInstr" + else: + cls_name = "Instr" + arg = instr.arg + if arg is not UNSET: + if isinstance(arg, Label): + arg = labels[arg] + elif isinstance(arg, BasicBlock): + arg = labels[id(arg)] + else: + arg = repr(arg) + if lineno: + text = "%s(%r, %s, lineno=%s)" % ( + cls_name, + instr.name, + arg, + instr.lineno, + ) + else: + text = "%s(%r, %s)" % (cls_name, instr.name, arg) + else: + if lineno: + text = "%s(%r, lineno=%s)" % (cls_name, instr.name, instr.lineno) + else: + text = "%s(%r)" % (cls_name, instr.name) + else: + text = labels[instr] + instr_list.append(text) + return "[%s]" % ",\n ".join(instr_list) + + +def dump_bytecode(code, lineno=False): + """ + Use this function to write unit tests: copy/paste its output to + write a self.assertBlocksEqual() check. + """ + print() + + if isinstance(code, (Bytecode, ConcreteBytecode)): + is_concrete = isinstance(code, ConcreteBytecode) + if is_concrete: + block = list(code) + else: + block = code + + indent = " " * 8 + labels = {} + for index, instr in enumerate(block): + if isinstance(instr, Label): + name = "label_instr%s" % index + labels[instr] = name + + if is_concrete: + name = "ConcreteBytecode" + print(indent + "code = %s()" % name) + if code.argcount: + print(indent + "code.argcount = %s" % code.argcount) + if sys.version_info > (3, 8): + if code.posonlyargcount: + print(indent + "code.posonlyargcount = %s" % code.posonlyargcount) + if code.kwonlyargcount: + print(indent + "code.kwargonlycount = %s" % code.kwonlyargcount) + print(indent + "code.flags = %#x" % code.flags) + if code.consts: + print(indent + "code.consts = %r" % code.consts) + if code.names: + print(indent + "code.names = %r" % code.names) + if code.varnames: + print(indent + "code.varnames = %r" % code.varnames) + + for name in sorted(labels.values()): + print(indent + "%s = Label()" % name) + + if is_concrete: + text = indent + "code.extend(" + indent = " " * len(text) + else: + text = indent + "code = Bytecode(" + indent = " " * len(text) + + lines = _format_instr_list(code, labels, lineno).splitlines() + last_line = len(lines) - 1 + for index, line in enumerate(lines): + if index == 0: + print(text + lines[0]) + elif index == last_line: + print(indent + line + ")") + else: + print(indent + line) + + print() + else: + assert isinstance(code, ControlFlowGraph) + labels = {} + for block_index, block in enumerate(code): + labels[id(block)] = "code[%s]" % block_index + + for block_index, block in enumerate(code): + text = _format_instr_list(block, labels, lineno) + if block_index != len(code) - 1: + text += "," + print(text) + print() + + +def get_code(source, *, filename="", function=False): + source = textwrap.dedent(source).strip() + code = compile(source, filename, "exec") + if function: + sub_code = [const for const in code.co_consts if isinstance(const, types.CodeType)] + if len(sub_code) != 1: + raise ValueError("unable to find function code") + code = sub_code[0] + return code + + +def disassemble(source, *, filename="", function=False): + code = get_code(source, filename=filename, function=function) + return Bytecode.from_code(code) + + +class TestCase(unittest.TestCase): + def assertBlocksEqual(self, code, *expected_blocks): + self.assertEqual(len(code), len(expected_blocks)) + + for block1, block2 in zip(code, expected_blocks): + block_index = code.get_block_index(block1) + self.assertListEqual(list(block1), block2, "Block #%s is different" % block_index) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3fd388b34aad037d5b586e20cede35372d89f28 GIT binary patch literal 6501 zcma)ATWlNGnVuQW42L(9A}NWIEQ_`z%d{2I*Z5LPt|Llrtw2c|%jnYe5;SL|P~vT8 zMz+Na3!(4>ovH}g6fg}rD2o_a72XF0eQ;A^*{eP|2hBVJLiu!o0)*`Pw}fW@45)$e^EvMm|9`82!(qDPw-@n2x>VQ zBypVzQaCpR4UkhYI?e={I2&Z+#-K6I1-ZB>Xo{PI=C~zjiCcqKlHd(@h@g$P^2{AF zxQAzXnm0b6caBHrgWFclN=0D6v;zmPy_KD|YA`wpQ!|TB*BY_gA|P=ecKH2Xb81*?!NL_hm<`cISisvb|@+)m?}@ zJXLY|s-51V>;94a=tgT#(eN->X*~)}51qx)PuuVN^P|r@_Z6gNUvBgZSI1vH-m0hj z7v^QN>ghry>$3HQiP_th54_w%44zz_dK~<9@b|7#*H}LAKduh-__@!=eslRhFaLr0 zv-OYGQrA>I@YezVYU|_9Uw4+e&gTQqT(Io?a5hlooaO@{e|m!F$_Yz7$L0A z-1xnT{6x{b<~~xk94XO9HbHt~JW}^mP(vz-Jsbt4dql%$JVLbak%V0LhzcRsy_k$f z;%}PLeM*iJuWg~O)94f#3T)XbBfpA2h0v`eV@Oa6_*d|Wbd<<2vZYQ_x1<1Z-AfQZ zM7|enx@jh(Y}KjtnIv+lou?EQSzm@zIE7J+=YeSH08J=VjuemZh78w`SE0dkafmt% zRQjq&LLp}N=)4=b*tKOOvpdyJZgSmc?&ckNb}j&>JpkO?jk)yFwmFTvQ|+7+=-PB1 zjeHw7Zg;Ak+_uPVf>E9ZPrbBr6wr0*y^Va^8qB*>?aFO$gNt6;#?1oUcA?sp+diE~ zBj3i&3fy*~+R07cuk%ot*FteNUwg*fG_P5omv2b}%E(xnEVteV zQeLcEu2o@q=iDLCbZ3(`nG`ecM6q|P{VjDXtYX zt{!fot;v@V@?l-#x-X$F6F(-md8N9K0NKF4uvfBy|8grfq!kJyzoGMKU;*rbJg|y} zcWdS|+~Cu6E{5iF$(R&d)9%+tYr8*p8g`XYOnhq^uwBN~v>SE(0FPeBt@??=-dv!G zg*IP%dftqJJp_2K{C-sOPR}PIax|In%1Q4n5hAyD9zv}b$K7+@ND?ABRF=HS zc{w!?ok`3?BM*BeAvQe}mH;xy7?4Y2|27|v9rAf2?+cN+AxxX*bc~UZ86wQR*uMR?;1~Kb4e{iP*vxva|h1TtksH#0FDB1 zbLchc)wlwIe&0Cs6*>$N#bgn|@id1!Zwv znGHv4Zo1TSVwHa!|14ha87;SsRvdv1yK~*%1K_iG@QM9U)z!Z48hGLw*l>3g4wiaH ze(PSpI8}yU?^L;Ss^Y#1+}7;}p4bo6_?`VcuzvoXGW>epDYv~-alDIHQ0jVPm40mg z%v|m|S9YGOSigmq@xg~5)P@~f4LqLsY@*zAq1<+%;`lb|O@ElK^&VY4`S{#t=gK|9 z<+kC9W8|NU@Z8;5c=H#-_lK7+03dxykf!7MK8&mc%3Vjx&ZAGQ$6gqq<7*agR7YX5 z>^ckpx7G9DL_uCYn-AR`2iRNMJ5+WJZE4SrKX)7`o?K~LZCi7kS$B+<9iwZGF#z}O z_5$IGHcrC>MKsIb;0Z`oZ1AO+R3WjT_81)_`+22*!>^mlTRH7;dW5)J!$F1 zq88+Qycj9B`JOrsKSu|I8lF1(Uf6)mD+giP^HbweV&Zd63uM`5;p4TaK>mzaM{MKT>tL3x>QUN29~+Tbh9Er^l{9xAZa~q* z%*d}Om79)&xuQ!Vr@Qos9tM!}LH9{~5%553^F?45^=|tbuzgm4L~5eYgGz>w5m)>v zghKLlZ~@OKl=ywPVk3vP?F$ee(GhBfh)~yi5RhpKm2?BAmxbFx+xcXq*OL)QFYX?V)}1nN<$mqHn=tlgjb}a(F6(P9>!pBguFQ4n;LZlE^he zn899NW#okvxL0lzoaYrNiYI`RYQBoR?wBYhMIVcN@w^C60~er6{5DEXAtDCzQ8{V; z2C(D>3EjY&ogz0Q$hb$Ggq}tCO9(+N5*xPGk3x4tg{y0}zIEH-vhDDiZE$gX!{W@n zSvXU?x@H+%418grl{O#DEPW^f0zek>)4gPGbjrRYtHi}>-nm^y+GdmAWK&*_Qi?6zcdl9E*3s2AxIO4^B2DdT|a@pv>y`KN{cHuUi`u5T*Y#6F#xr7 zOLy7QUEtR&y(PLA+hznP>z{6in<(<#BLo6HzQV&R2@k1;1 zUFg4A!Qw)n!0;ZbX*oE6EAp+n=8z`wPW^k;Q z9~TjD-(gHG8e_ab4b-MP^@G|8c=Lz_4+%U#an^OtQ|3GmT!kyk9S=uW>}!2zD%{!U z`}P<6ptA4GOM)_m$h(u-@!WW|bKiRBP`Ptx<>p%Fo7st~)v<2%maX20?&9>Pdsl9j zPQO$7{`Krbu!`Za?FVkMjO(JB|hFM6SnY7T|sNq#;iK-n4!Aq(JfINMG3M{l|z>UbT?4@c0S(?>CbmV zbx?+ETYKI_I;TC5BE8a(E{2i_|6`Pi5u9eR$l$a^hEWLxJG}7M+<8sJ5fN=P(st=z zAb|i&l3x<$FA4jXgcZ`i(I%4m8v)5CN?v;QlY^VzAuo}n`^6QCI54;>ydpT#@uH3B f_kZ5{ilE58S7w$Bk=fhpc5m74{XYWL@YMeRtUk3N literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_bytecode.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_bytecode.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aac3270e056673780d5ff2681db63acb9beaf8de GIT binary patch literal 21270 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_cfg.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_cfg.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98d1d9bbf3e5001340b146ea07880bb08d856721 GIT binary patch literal 39072 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 J7P3zEzW}CjD4YNQ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_flags.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/test_flags.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..250ffbe91ce6ddf111624caed00502630c191fd7 GIT binary patch literal 8752 zcmds6TWk|o8a^|=WbBM%n}jwY5S&|yx!8mxlt2UPB+g|aHcAW?W~-6OOsI`7>C6O3 zl&n~(s|~xXpi;F^38|?Tsjc9l57nx#RbMLYK4fYmqbaLhsl0Tb5@3bI)Bb11Gj^QG zt?gFYJ+l9E=A8dOm;apq|IX#F4u>5<_*?4i#VfBO^d0`tf~Amnh6sdiBNnkl5=C)L zCW#aoB~zxTiNN2cq&a1YS_s6U1g(h|0fvqpO5Kfs9E>K~0>6My&aPqimG&!=u9Q3KCJ>1R5lg*`SQ}?cv}kP= z1pxpOxkn2$J60E4189e ziwT*u*CIRmGO5XUlH&)Gv5SK2>dU0Zc~0bdr$uf&!*ZBG%^6M$A}>>V0cI8XOmZNZ zxiZMdCf~;G$I}xW&rIOD#TBtuqaBh#JebJVo9K8)&$hTnt@tb z3(yMI3Y40z@KUl}>0X2rL}6U33s-1`KUVFtG?3e979~ncArA+!Fs%sPFO+scheU0e z!Sd4bl}Uw#r7Z-Q0@RG!kw9D_33LvmaL!fJIdp~alA-T$bzYN9#{_}n#nD(?-~`!z zHkO>?f;^w$dAuk=FJ^&DP6(LW^YYLBR9f_p`_F)g;2!{8r#=0AoQ?bYIpLC+neW(n9<~lJlpgx%6d!GJe57smx-BulP5T$=LX%*hNn8v)qNLi<8rS<}#ON zGd#xvE6ZJG{frtj6MQViG2G=?(yy~zD9o^5#9CFTI&r?qX}J++GUD_k$AD0rjfwG0 znt`7(!CZQro7rES65od0)i88nKagwak;9#LG)RtyyE9qG-epAC>L1gu-XU&;UYH>L z0%s_>F9iw&{zUIH-M4gBteEx+C{U(-KTP6nBOI#%q`osf&A&6!zmB5Rq zER>Yu#>>JCv|GZVc(9c$WgG@Rsf?p)r9A$^95XctjgyQ%u2~}CUd^eE78di57*&a^ z!H7yq4MtN^x@~p;N=jio<)Nh1KnoKU{pc+(LUSY-H6TQJ5bLxY(2c=7&yq8sJYH5~W zNzJhp^|9u-n>D#&T%z;;rE!~B^XhSLWKl3j>ubPp)&0QL@Z(zA^a`0qUQ0-}k43_x zK_(O!3GyzOT)9%s=nswt2foLq; zm5?|YJojdJw0}&thG6dz?3cF>oQa%)`Uiud;AjAvVxaodGCeg3D8i`_1I*!p(O^)v zg-=I@M~0&yXIDWq!cTFs`9da>@OJPxP8`qEVt7m9|ZSdB-*nwp>zW?`z6}H z(0pKN8*;dBhOdY3_Ak_YyyK%CpTs_D$nHG&kZxb929D>o$W{A?nR)YL zSN)y-tgCU}f`{k4?!0ThbLQS#`PMfi`0aWlTicVPj+d2nORe3~uI_B@(HwOQmsMV` ze1BwN|7S$D=1`96SW#)7s+FkPyES*Xd#U_uJrevHda`xLbJU5=ReRtwcebV@M|A?b zt}7*7sF?jQ@j>E2Pkvvo1iyyfY+YZD>Nn&#A?-UMHJr%S{o)}Ncm{KfjJFm40xMW+ zTamyUkFsF2mn^zia5dP3%7O+x1m3mcgYX4bNZ4x3AoMGk^*M6R^b=}n-L*3NvuSqL zWV{}3%$ngm<28rm%5%fPQ~k`@z^OAq*)bT5Fo8D%!;wJmsi16E%LYcnBi>3L?~D0X zOz@)RJ(ytp;#)Am{IDD!)aDETS$wXYHxT}-g zxX7_(PP|2N;xS=5JjC>gVAo}1yes4g6->yKmwl_!hf#+XUjbC+(Td8J=LRIy5NAf$n zrJdc2^wCF-y1PC3`a@Fvp+&l5$zs|GuAZ`WUq3k?n7;~ruW89vx6b!JqFpynUO#!) zv5?8u9?sFP7c*kn+O{0+g^WDCOQLt>=-s%m6eQl38V_f8zW$Itvh0S+d3-rx>>$4Y zoo&TIvcv;@u`3QwKYT+Ig&^uq65NZy=}Xj4Cr0kjc!7iQ7o~JZp|yw*xCe6yhk=_d zxQ7cHx(9>vnTYo$N?60x4cx;|p{X^^omI@;5{i6E$dqO}{C?;n?*rnstJdwo83s1Z z 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 N+Oz5uTr~v${tv2>SCIe! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/util_annotation.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__pycache__/util_annotation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f0d060ef2441d5a2e525bdcac41ae97416c88f2 GIT binary patch literal 1080 zcmZ8f&2Jk;6rb4-dt=8nB%qd(Qnx~?TtZfW_!1#fA;|@)2R?Fei&pEM7qiZKcQrGc z#$jDWh(jtW6}Z#~4sZgL3x5CydPG!eAOgaWo_gx7BI<#jc;jY?)F;jFy_w(JH^15U zeyPK$?rB98P z)i;{uyZYlMRaHNZ6Y0w^iN*PKXI4la#+|vvrlFkWFoM|c0Y+II=#&68jLbkR<3bH| z{}`TLC$iv3SF?{;PPPvCuKfsw+pUA60g<}u$a0cXMz;=LIWTjBznhy~r{E9$Jh^5C zMu!B(hbIXcSh8Ahxh2PoxO=3C4*k}FQbDgilUrXHS5H}FU}J^Hi=5mpbTeb+RYG`G zP8J+93+@w|+st|j3Djx6he{}}fpv*A?eoflH3;tN=dVv?vEPoMA(O^(7_&z4V;e!j zfNM3)igF~Z$xGZ%Rfz$ESSnk$B~|4h>802dH5MdZfE|-URYDPB;KuJ*uZ1k+rcj15rY*F|r5WxxHAr zf%|~~F5E?s5I5#|$U=7>#EMK(H|0qe*L&!_WsZ~Q!Kxp*|EIM360|l~0zTc%WEgpe z^E;FFmD2$^lFyH!d_7BI9btp))t4JW-+1TWf5ylY7pc(mcY~gMt8CpkWg#|g zRq?##OlBNBkL&T~V;brjwCeB4J|f{q5gs_Ry@X{E%<(DQ>KPKp5$>6k(%a") + self.assertEqual(code.filename, "") + self.assertEqual(code.flags, 0) + self.assertEqual(code, []) + + def test_invalid_types(self): + code = Bytecode() + code.append(123) + with self.assertRaises(ValueError): + list(code) + with self.assertRaises(ValueError): + code.legalize() + with self.assertRaises(ValueError): + Bytecode([123]) + + def test_legalize(self): + code = Bytecode() + code.first_lineno = 3 + code.extend( + [ + Instr("LOAD_CONST", 7), + Instr("STORE_NAME", "x"), + Instr("LOAD_CONST", 8, lineno=4), + Instr("STORE_NAME", "y"), + Label(), + SetLineno(5), + Instr("LOAD_CONST", 9, lineno=6), + Instr("STORE_NAME", "z"), + ] + ) + + code.legalize() + self.assertListEqual( + code, + [ + Instr("LOAD_CONST", 7, lineno=3), + Instr("STORE_NAME", "x", lineno=3), + Instr("LOAD_CONST", 8, lineno=4), + Instr("STORE_NAME", "y", lineno=4), + Label(), + Instr("LOAD_CONST", 9, lineno=5), + Instr("STORE_NAME", "z", lineno=5), + ], + ) + + def test_slice(self): + code = Bytecode() + code.first_lineno = 3 + code.extend( + [ + Instr("LOAD_CONST", 7), + Instr("STORE_NAME", "x"), + SetLineno(4), + Instr("LOAD_CONST", 8), + Instr("STORE_NAME", "y"), + SetLineno(5), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "z"), + ] + ) + sliced_code = code[:] + self.assertEqual(code, sliced_code) + for name in ( + "argcount", + "posonlyargcount", + "kwonlyargcount", + "first_lineno", + "name", + "filename", + "docstring", + "cellvars", + "freevars", + "argnames", + ): + self.assertEqual(getattr(code, name, None), getattr(sliced_code, name, None)) + + def test_copy(self): + code = Bytecode() + code.first_lineno = 3 + code.extend( + [ + Instr("LOAD_CONST", 7), + Instr("STORE_NAME", "x"), + SetLineno(4), + Instr("LOAD_CONST", 8), + Instr("STORE_NAME", "y"), + SetLineno(5), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "z"), + ] + ) + + copy_code = code.copy() + self.assertEqual(code, copy_code) + for name in ( + "argcount", + "posonlyargcount", + "kwonlyargcount", + "first_lineno", + "name", + "filename", + "docstring", + "cellvars", + "freevars", + "argnames", + ): + self.assertEqual(getattr(code, name, None), getattr(copy_code, name, None)) + + def test_from_code(self): + code = get_code( + """ + if test: + x = 1 + else: + x = 2 + """ + ) + bytecode = Bytecode.from_code(code) + label_else = Label() + label_exit = Label() + if sys.version_info < (3, 10): + self.assertEqual( + bytecode, + [ + Instr("LOAD_NAME", "test", lineno=1), + Instr("POP_JUMP_IF_FALSE", label_else, lineno=1), + Instr("LOAD_CONST", 1, lineno=2), + Instr("STORE_NAME", "x", lineno=2), + Instr("JUMP_FORWARD", label_exit, lineno=2), + label_else, + Instr("LOAD_CONST", 2, lineno=4), + Instr("STORE_NAME", "x", lineno=4), + label_exit, + Instr("LOAD_CONST", None, lineno=4), + Instr("RETURN_VALUE", lineno=4), + ], + ) + # Control flow handling appears to have changed under Python 3.10 + else: + self.assertEqual( + bytecode, + [ + Instr("LOAD_NAME", "test", lineno=1), + Instr("POP_JUMP_IF_FALSE", label_else, lineno=1), + Instr("LOAD_CONST", 1, lineno=2), + Instr("STORE_NAME", "x", lineno=2), + Instr("LOAD_CONST", None, lineno=2), + Instr("RETURN_VALUE", lineno=2), + label_else, + Instr("LOAD_CONST", 2, lineno=4), + Instr("STORE_NAME", "x", lineno=4), + Instr("LOAD_CONST", None, lineno=4), + Instr("RETURN_VALUE", lineno=4), + ], + ) + + def test_from_code_freevars(self): + ns = {} + exec( + textwrap.dedent( + """ + def create_func(): + x = 1 + def func(): + return x + return func + + func = create_func() + """ + ), + ns, + ns, + ) + code = ns["func"].__code__ + + bytecode = Bytecode.from_code(code) + self.assertEqual( + bytecode, + [ + Instr("LOAD_DEREF", FreeVar("x"), lineno=5), + Instr("RETURN_VALUE", lineno=5), + ], + ) + + def test_from_code_load_fast(self): + code = get_code( + """ + def func(): + x = 33 + y = x + """, + function=True, + ) + code = Bytecode.from_code(code) + self.assertEqual( + code, + [ + Instr("LOAD_CONST", 33, lineno=2), + Instr("STORE_FAST", "x", lineno=2), + Instr("LOAD_FAST", "x", lineno=3), + Instr("STORE_FAST", "y", lineno=3), + Instr("LOAD_CONST", None, lineno=3), + Instr("RETURN_VALUE", lineno=3), + ], + ) + + def test_setlineno(self): + # x = 7 + # y = 8 + # z = 9 + code = Bytecode() + code.first_lineno = 3 + code.extend( + [ + Instr("LOAD_CONST", 7), + Instr("STORE_NAME", "x"), + SetLineno(4), + Instr("LOAD_CONST", 8), + Instr("STORE_NAME", "y"), + SetLineno(5), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "z"), + ] + ) + + concrete = code.to_concrete_bytecode() + self.assertEqual(concrete.consts, [7, 8, 9]) + self.assertEqual(concrete.names, ["x", "y", "z"]) + self.assertListEqual( + list(concrete), + [ + ConcreteInstr("LOAD_CONST", 0, lineno=3), + ConcreteInstr("STORE_NAME", 0, lineno=3), + ConcreteInstr("LOAD_CONST", 1, lineno=4), + ConcreteInstr("STORE_NAME", 1, lineno=4), + ConcreteInstr("LOAD_CONST", 2, lineno=5), + ConcreteInstr("STORE_NAME", 2, lineno=5), + ], + ) + + def test_to_code(self): + code = Bytecode() + code.first_lineno = 50 + code.extend( + [ + Instr("LOAD_NAME", "print"), + Instr("LOAD_CONST", "%s"), + Instr("LOAD_GLOBAL", "a"), + Instr("BINARY_MODULO"), + Instr("CALL_FUNCTION", 1), + Instr("RETURN_VALUE"), + ] + ) + co = code.to_code() + # hopefully this is obvious from inspection? :-) + self.assertEqual(co.co_stacksize, 3) + + co = code.to_code(stacksize=42) + self.assertEqual(co.co_stacksize, 42) + + def test_negative_size_unary(self): + opnames = ( + "UNARY_POSITIVE", + "UNARY_NEGATIVE", + "UNARY_NOT", + "UNARY_INVERT", + ) + for opname in opnames: + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr(opname)]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_negative_size_unary_with_disable_check_of_pre_and_post(self): + opnames = ( + "UNARY_POSITIVE", + "UNARY_NEGATIVE", + "UNARY_NOT", + "UNARY_INVERT", + ) + for opname in opnames: + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr(opname)]) + co = code.to_code(check_pre_and_post=False) + self.assertEqual(co.co_stacksize, 0) + + def test_negative_size_binary(self): + opnames = ( + "BINARY_POWER", + "BINARY_MULTIPLY", + "BINARY_MATRIX_MULTIPLY", + "BINARY_FLOOR_DIVIDE", + "BINARY_TRUE_DIVIDE", + "BINARY_MODULO", + "BINARY_ADD", + "BINARY_SUBTRACT", + "BINARY_SUBSCR", + "BINARY_LSHIFT", + "BINARY_RSHIFT", + "BINARY_AND", + "BINARY_XOR", + "BINARY_OR", + ) + for opname in opnames: + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", 1), Instr(opname)]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_negative_size_binary_with_disable_check_of_pre_and_post(self): + opnames = ( + "BINARY_POWER", + "BINARY_MULTIPLY", + "BINARY_MATRIX_MULTIPLY", + "BINARY_FLOOR_DIVIDE", + "BINARY_TRUE_DIVIDE", + "BINARY_MODULO", + "BINARY_ADD", + "BINARY_SUBTRACT", + "BINARY_SUBSCR", + "BINARY_LSHIFT", + "BINARY_RSHIFT", + "BINARY_AND", + "BINARY_XOR", + "BINARY_OR", + ) + for opname in opnames: + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", 1), Instr(opname)]) + co = code.to_code(check_pre_and_post=False) + self.assertEqual(co.co_stacksize, 1) + + def test_negative_size_call(self): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("CALL_FUNCTION", 0)]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_negative_size_unpack(self): + opnames = ( + "UNPACK_SEQUENCE", + "UNPACK_EX", + ) + for opname in opnames: + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr(opname, 1)]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_negative_size_build(self): + opnames = ( + "BUILD_TUPLE", + "BUILD_LIST", + "BUILD_SET", + ) + if sys.version_info >= (3, 6): + opnames = (*opnames, "BUILD_STRING") + + for opname in opnames: + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr(opname, 1)]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_negative_size_build_map(self): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", 1), Instr("BUILD_MAP", 1)]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_negative_size_build_map_with_disable_check_of_pre_and_post(self): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", 1), Instr("BUILD_MAP", 1)]) + co = code.to_code(check_pre_and_post=False) + self.assertEqual(co.co_stacksize, 1) + + @unittest.skipIf(sys.version_info < (3, 6), "Inexistent opcode") + def test_negative_size_build_const_map(self): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", ("a",)), Instr("BUILD_CONST_KEY_MAP", 1)]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + @unittest.skipIf(sys.version_info < (3, 6), "Inexistent opcode") + def test_negative_size_build_const_map_with_disable_check_of_pre_and_post(self): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", ("a",)), Instr("BUILD_CONST_KEY_MAP", 1)]) + co = code.to_code(check_pre_and_post=False) + self.assertEqual(co.co_stacksize, 1) + + def test_empty_dup(self): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("DUP_TOP")]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_not_enough_dup(self): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", 1), Instr("DUP_TOP_TWO")]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_not_enough_rot(self): + opnames = ["ROT_TWO", "ROT_THREE"] + if sys.version_info >= (3, 8): + opnames.append("ROT_FOUR") + for opname in opnames: + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", 1), Instr(opname)]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_not_enough_rot_with_disable_check_of_pre_and_post(self): + opnames = ["ROT_TWO", "ROT_THREE"] + if sys.version_info >= (3, 8): + opnames.append("ROT_FOUR") + for opname in opnames: + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + code.extend([Instr("LOAD_CONST", 1), Instr(opname)]) + co = code.to_code(check_pre_and_post=False) + self.assertEqual(co.co_stacksize, 1) + + def test_for_iter_stack_effect_computation(self): + with self.subTest(): + code = Bytecode() + code.first_lineno = 1 + lab1 = Label() + lab2 = Label() + code.extend( + [ + lab1, + Instr("FOR_ITER", lab2), + Instr("STORE_FAST", "i"), + Instr("JUMP_ABSOLUTE", lab1), + lab2, + ] + ) + with self.assertRaises(RuntimeError): + # Use compute_stacksize since the code is so broken that conversion + # to from concrete is actually broken + code.compute_stacksize(check_pre_and_post=False) + + +if __name__ == "__main__": + unittest.main() # pragma: no cover diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py new file mode 100644 index 0000000..6cc731a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py @@ -0,0 +1,816 @@ +import pytest +from tests_python.debugger_unittest import IS_PY36_OR_GREATER, IS_CPYTHON +from tests_python.debug_constants import TEST_CYTHON + +pytestmark = pytest.mark.skipif(not IS_PY36_OR_GREATER or not IS_CPYTHON or not TEST_CYTHON, reason="Requires CPython >= 3.6") +#!/usr/bin/env python3 +import io +import sys +import unittest +import contextlib +from _pydevd_frame_eval.vendored.bytecode import ( + Label, + Compare, + SetLineno, + Instr, + Bytecode, + BasicBlock, + ControlFlowGraph, +) +from _pydevd_frame_eval.vendored.bytecode.concrete import OFFSET_AS_INSTRUCTION +from _pydevd_frame_eval.vendored.bytecode.tests import disassemble as _disassemble, TestCase + + +def disassemble(source, *, filename="", function=False, remove_last_return_none=False): + code = _disassemble(source, filename=filename, function=function) + blocks = ControlFlowGraph.from_bytecode(code) + if remove_last_return_none: + # drop LOAD_CONST+RETURN_VALUE to only keep 2 instructions, + # to make unit tests shorter + block = blocks[-1] + test = block[-2].name == "LOAD_CONST" and block[-2].arg is None and block[-1].name == "RETURN_VALUE" + if not test: + raise ValueError("unable to find implicit RETURN_VALUE : %s" % block[-2:]) + del block[-2:] + return blocks + + +class BlockTests(unittest.TestCase): + def test_iter_invalid_types(self): + # Labels are not allowed in basic blocks + block = BasicBlock() + block.append(Label()) + with self.assertRaises(ValueError): + list(block) + with self.assertRaises(ValueError): + block.legalize(1) + + # Only one jump allowed and only at the end + block = BasicBlock() + block2 = BasicBlock() + block.extend([Instr("JUMP_ABSOLUTE", block2), Instr("NOP")]) + with self.assertRaises(ValueError): + list(block) + with self.assertRaises(ValueError): + block.legalize(1) + + # jump target must be a BasicBlock + block = BasicBlock() + label = Label() + block.extend([Instr("JUMP_ABSOLUTE", label)]) + with self.assertRaises(ValueError): + list(block) + with self.assertRaises(ValueError): + block.legalize(1) + + def test_slice(self): + block = BasicBlock([Instr("NOP")]) + next_block = BasicBlock() + block.next_block = next_block + self.assertEqual(block, block[:]) + self.assertIs(next_block, block[:].next_block) + + def test_copy(self): + block = BasicBlock([Instr("NOP")]) + next_block = BasicBlock() + block.next_block = next_block + self.assertEqual(block, block.copy()) + self.assertIs(next_block, block.copy().next_block) + + +class BytecodeBlocksTests(TestCase): + maxDiff = 80 * 100 + + def test_constructor(self): + code = ControlFlowGraph() + self.assertEqual(code.name, "") + self.assertEqual(code.filename, "") + self.assertEqual(code.flags, 0) + self.assertBlocksEqual(code, []) + + def test_attr(self): + source = """ + first_line = 1 + + def func(arg1, arg2, *, arg3): + x = 1 + y = 2 + return arg1 + """ + code = disassemble(source, filename="hello.py", function=True) + self.assertEqual(code.argcount, 2) + self.assertEqual(code.filename, "hello.py") + self.assertEqual(code.first_lineno, 3) + if sys.version_info > (3, 8): + self.assertEqual(code.posonlyargcount, 0) + self.assertEqual(code.kwonlyargcount, 1) + self.assertEqual(code.name, "func") + self.assertEqual(code.cellvars, []) + + code.name = "name" + code.filename = "filename" + code.flags = 123 + self.assertEqual(code.name, "name") + self.assertEqual(code.filename, "filename") + self.assertEqual(code.flags, 123) + + # FIXME: test non-empty cellvars + + def test_add_del_block(self): + code = ControlFlowGraph() + code[0].append(Instr("LOAD_CONST", 0)) + + block = code.add_block() + self.assertEqual(len(code), 2) + self.assertIs(block, code[1]) + + code[1].append(Instr("LOAD_CONST", 2)) + self.assertBlocksEqual(code, [Instr("LOAD_CONST", 0)], [Instr("LOAD_CONST", 2)]) + + del code[0] + self.assertBlocksEqual(code, [Instr("LOAD_CONST", 2)]) + + del code[0] + self.assertEqual(len(code), 0) + + def test_setlineno(self): + # x = 7 + # y = 8 + # z = 9 + code = Bytecode() + code.first_lineno = 3 + code.extend( + [ + Instr("LOAD_CONST", 7), + Instr("STORE_NAME", "x"), + SetLineno(4), + Instr("LOAD_CONST", 8), + Instr("STORE_NAME", "y"), + SetLineno(5), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "z"), + ] + ) + + blocks = ControlFlowGraph.from_bytecode(code) + self.assertBlocksEqual( + blocks, + [ + Instr("LOAD_CONST", 7), + Instr("STORE_NAME", "x"), + SetLineno(4), + Instr("LOAD_CONST", 8), + Instr("STORE_NAME", "y"), + SetLineno(5), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "z"), + ], + ) + + def test_legalize(self): + code = Bytecode() + code.first_lineno = 3 + code.extend( + [ + Instr("LOAD_CONST", 7), + Instr("STORE_NAME", "x"), + Instr("LOAD_CONST", 8, lineno=4), + Instr("STORE_NAME", "y"), + SetLineno(5), + Instr("LOAD_CONST", 9, lineno=6), + Instr("STORE_NAME", "z"), + ] + ) + + blocks = ControlFlowGraph.from_bytecode(code) + blocks.legalize() + self.assertBlocksEqual( + blocks, + [ + Instr("LOAD_CONST", 7, lineno=3), + Instr("STORE_NAME", "x", lineno=3), + Instr("LOAD_CONST", 8, lineno=4), + Instr("STORE_NAME", "y", lineno=4), + Instr("LOAD_CONST", 9, lineno=5), + Instr("STORE_NAME", "z", lineno=5), + ], + ) + + def test_repr(self): + r = repr(ControlFlowGraph()) + self.assertIn("ControlFlowGraph", r) + self.assertIn("1", r) + + def test_to_bytecode(self): + # if test: + # x = 2 + # x = 5 + blocks = ControlFlowGraph() + blocks.add_block() + blocks.add_block() + blocks[0].extend( + [ + Instr("LOAD_NAME", "test", lineno=1), + Instr("POP_JUMP_IF_FALSE", blocks[2], lineno=1), + ] + ) + + blocks[1].extend( + [ + Instr("LOAD_CONST", 5, lineno=2), + Instr("STORE_NAME", "x", lineno=2), + Instr("JUMP_FORWARD", blocks[2], lineno=2), + ] + ) + + blocks[2].extend( + [ + Instr("LOAD_CONST", 7, lineno=3), + Instr("STORE_NAME", "x", lineno=3), + Instr("LOAD_CONST", None, lineno=3), + Instr("RETURN_VALUE", lineno=3), + ] + ) + + bytecode = blocks.to_bytecode() + label = Label() + self.assertEqual( + bytecode, + [ + Instr("LOAD_NAME", "test", lineno=1), + Instr("POP_JUMP_IF_FALSE", label, lineno=1), + Instr("LOAD_CONST", 5, lineno=2), + Instr("STORE_NAME", "x", lineno=2), + Instr("JUMP_FORWARD", label, lineno=2), + label, + Instr("LOAD_CONST", 7, lineno=3), + Instr("STORE_NAME", "x", lineno=3), + Instr("LOAD_CONST", None, lineno=3), + Instr("RETURN_VALUE", lineno=3), + ], + ) + # FIXME: test other attributes + + def test_label_at_the_end(self): + label = Label() + code = Bytecode( + [ + Instr("LOAD_NAME", "x"), + Instr("UNARY_NOT"), + Instr("POP_JUMP_IF_FALSE", label), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "y"), + label, + ] + ) + + cfg = ControlFlowGraph.from_bytecode(code) + self.assertBlocksEqual( + cfg, + [ + Instr("LOAD_NAME", "x"), + Instr("UNARY_NOT"), + Instr("POP_JUMP_IF_FALSE", cfg[2]), + ], + [Instr("LOAD_CONST", 9), Instr("STORE_NAME", "y")], + [], + ) + + def test_from_bytecode(self): + bytecode = Bytecode() + label = Label() + bytecode.extend( + [ + Instr("LOAD_NAME", "test", lineno=1), + Instr("POP_JUMP_IF_FALSE", label, lineno=1), + Instr("LOAD_CONST", 5, lineno=2), + Instr("STORE_NAME", "x", lineno=2), + Instr("JUMP_FORWARD", label, lineno=2), + # dead code! + Instr("LOAD_CONST", 7, lineno=4), + Instr("STORE_NAME", "x", lineno=4), + Label(), # unused label + label, + Label(), # unused label + Instr("LOAD_CONST", None, lineno=4), + Instr("RETURN_VALUE", lineno=4), + ] + ) + + blocks = ControlFlowGraph.from_bytecode(bytecode) + label2 = blocks[3] + self.assertBlocksEqual( + blocks, + [ + Instr("LOAD_NAME", "test", lineno=1), + Instr("POP_JUMP_IF_FALSE", label2, lineno=1), + ], + [ + Instr("LOAD_CONST", 5, lineno=2), + Instr("STORE_NAME", "x", lineno=2), + Instr("JUMP_FORWARD", label2, lineno=2), + ], + [Instr("LOAD_CONST", 7, lineno=4), Instr("STORE_NAME", "x", lineno=4)], + [Instr("LOAD_CONST", None, lineno=4), Instr("RETURN_VALUE", lineno=4)], + ) + # FIXME: test other attributes + + def test_from_bytecode_loop(self): + # for x in (1, 2, 3): + # if x == 2: + # break + # continue + + if sys.version_info < (3, 8): + label_loop_start = Label() + label_loop_exit = Label() + label_loop_end = Label() + + code = Bytecode() + code.extend( + ( + Instr("SETUP_LOOP", label_loop_end, lineno=1), + Instr("LOAD_CONST", (1, 2, 3), lineno=1), + Instr("GET_ITER", lineno=1), + label_loop_start, + Instr("FOR_ITER", label_loop_exit, lineno=1), + Instr("STORE_NAME", "x", lineno=1), + Instr("LOAD_NAME", "x", lineno=2), + Instr("LOAD_CONST", 2, lineno=2), + Instr("COMPARE_OP", Compare.EQ, lineno=2), + Instr("POP_JUMP_IF_FALSE", label_loop_start, lineno=2), + Instr("BREAK_LOOP", lineno=3), + Instr("JUMP_ABSOLUTE", label_loop_start, lineno=4), + Instr("JUMP_ABSOLUTE", label_loop_start, lineno=4), + label_loop_exit, + Instr("POP_BLOCK", lineno=4), + label_loop_end, + Instr("LOAD_CONST", None, lineno=4), + Instr("RETURN_VALUE", lineno=4), + ) + ) + blocks = ControlFlowGraph.from_bytecode(code) + + expected = [ + [Instr("SETUP_LOOP", blocks[8], lineno=1)], + [Instr("LOAD_CONST", (1, 2, 3), lineno=1), Instr("GET_ITER", lineno=1)], + [Instr("FOR_ITER", blocks[7], lineno=1)], + [ + Instr("STORE_NAME", "x", lineno=1), + Instr("LOAD_NAME", "x", lineno=2), + Instr("LOAD_CONST", 2, lineno=2), + Instr("COMPARE_OP", Compare.EQ, lineno=2), + Instr("POP_JUMP_IF_FALSE", blocks[2], lineno=2), + ], + [Instr("BREAK_LOOP", lineno=3)], + [Instr("JUMP_ABSOLUTE", blocks[2], lineno=4)], + [Instr("JUMP_ABSOLUTE", blocks[2], lineno=4)], + [Instr("POP_BLOCK", lineno=4)], + [Instr("LOAD_CONST", None, lineno=4), Instr("RETURN_VALUE", lineno=4)], + ] + self.assertBlocksEqual(blocks, *expected) + else: + label_loop_start = Label() + label_loop_exit = Label() + + code = Bytecode() + code.extend( + ( + Instr("LOAD_CONST", (1, 2, 3), lineno=1), + Instr("GET_ITER", lineno=1), + label_loop_start, + Instr("FOR_ITER", label_loop_exit, lineno=1), + Instr("STORE_NAME", "x", lineno=1), + Instr("LOAD_NAME", "x", lineno=2), + Instr("LOAD_CONST", 2, lineno=2), + Instr("COMPARE_OP", Compare.EQ, lineno=2), + Instr("POP_JUMP_IF_FALSE", label_loop_start, lineno=2), + Instr("JUMP_ABSOLUTE", label_loop_exit, lineno=3), + Instr("JUMP_ABSOLUTE", label_loop_start, lineno=4), + Instr("JUMP_ABSOLUTE", label_loop_start, lineno=4), + label_loop_exit, + Instr("LOAD_CONST", None, lineno=4), + Instr("RETURN_VALUE", lineno=4), + ) + ) + blocks = ControlFlowGraph.from_bytecode(code) + + expected = [ + [Instr("LOAD_CONST", (1, 2, 3), lineno=1), Instr("GET_ITER", lineno=1)], + [Instr("FOR_ITER", blocks[6], lineno=1)], + [ + Instr("STORE_NAME", "x", lineno=1), + Instr("LOAD_NAME", "x", lineno=2), + Instr("LOAD_CONST", 2, lineno=2), + Instr("COMPARE_OP", Compare.EQ, lineno=2), + Instr("POP_JUMP_IF_FALSE", blocks[1], lineno=2), + ], + [Instr("JUMP_ABSOLUTE", blocks[6], lineno=3)], + [Instr("JUMP_ABSOLUTE", blocks[1], lineno=4)], + [Instr("JUMP_ABSOLUTE", blocks[1], lineno=4)], + [Instr("LOAD_CONST", None, lineno=4), Instr("RETURN_VALUE", lineno=4)], + ] + self.assertBlocksEqual(blocks, *expected) + + +class BytecodeBlocksFunctionalTests(TestCase): + def test_eq(self): + # compare codes with multiple blocks and labels, + # Code.__eq__() renumbers labels to get equal labels + source = "x = 1 if test else 2" + code1 = disassemble(source) + code2 = disassemble(source) + self.assertEqual(code1, code2) + + # Type mismatch + self.assertFalse(code1 == 1) + + # argnames mismatch + cfg = ControlFlowGraph() + cfg.argnames = 10 + self.assertFalse(code1 == cfg) + + # instr mismatch + cfg = ControlFlowGraph() + cfg.argnames = code1.argnames + self.assertFalse(code1 == cfg) + + def check_getitem(self, code): + # check internal Code block indexes (index by index, index by label) + for block_index, block in enumerate(code): + self.assertIs(code[block_index], block) + self.assertIs(code[block], block) + self.assertEqual(code.get_block_index(block), block_index) + + def test_delitem(self): + cfg = ControlFlowGraph() + b = cfg.add_block() + del cfg[b] + self.assertEqual(len(cfg.get_instructions()), 0) + + def sample_code(self): + code = disassemble("x = 1", remove_last_return_none=True) + self.assertBlocksEqual(code, [Instr("LOAD_CONST", 1, lineno=1), Instr("STORE_NAME", "x", lineno=1)]) + return code + + def test_split_block(self): + code = self.sample_code() + code[0].append(Instr("NOP", lineno=1)) + + label = code.split_block(code[0], 2) + self.assertIs(label, code[1]) + self.assertBlocksEqual( + code, + [Instr("LOAD_CONST", 1, lineno=1), Instr("STORE_NAME", "x", lineno=1)], + [Instr("NOP", lineno=1)], + ) + self.check_getitem(code) + + label2 = code.split_block(code[0], 1) + self.assertIs(label2, code[1]) + self.assertBlocksEqual( + code, + [Instr("LOAD_CONST", 1, lineno=1)], + [Instr("STORE_NAME", "x", lineno=1)], + [Instr("NOP", lineno=1)], + ) + self.check_getitem(code) + + with self.assertRaises(TypeError): + code.split_block(1, 1) + + with self.assertRaises(ValueError) as e: + code.split_block(code[0], -2) + self.assertIn("positive", e.exception.args[0]) + + def test_split_block_end(self): + code = self.sample_code() + + # split at the end of the last block requires to add a new empty block + label = code.split_block(code[0], 2) + self.assertIs(label, code[1]) + self.assertBlocksEqual( + code, + [Instr("LOAD_CONST", 1, lineno=1), Instr("STORE_NAME", "x", lineno=1)], + [], + ) + self.check_getitem(code) + + # split at the end of a block which is not the end doesn't require to + # add a new block + label = code.split_block(code[0], 2) + self.assertIs(label, code[1]) + self.assertBlocksEqual( + code, + [Instr("LOAD_CONST", 1, lineno=1), Instr("STORE_NAME", "x", lineno=1)], + [], + ) + + def test_split_block_dont_split(self): + code = self.sample_code() + + # FIXME: is it really useful to support that? + block = code.split_block(code[0], 0) + self.assertIs(block, code[0]) + self.assertBlocksEqual(code, [Instr("LOAD_CONST", 1, lineno=1), Instr("STORE_NAME", "x", lineno=1)]) + + def test_split_block_error(self): + code = self.sample_code() + + with self.assertRaises(ValueError): + # invalid index + code.split_block(code[0], 3) + + def test_to_code(self): + # test resolution of jump labels + bytecode = ControlFlowGraph() + bytecode.first_lineno = 3 + bytecode.argcount = 3 + if sys.version_info > (3, 8): + bytecode.posonlyargcount = 0 + bytecode.kwonlyargcount = 2 + bytecode.name = "func" + bytecode.filename = "hello.py" + bytecode.flags = 0x43 + bytecode.argnames = ("arg", "arg2", "arg3", "kwonly", "kwonly2") + bytecode.docstring = None + block0 = bytecode[0] + block1 = bytecode.add_block() + block2 = bytecode.add_block() + block0.extend( + [ + Instr("LOAD_FAST", "x", lineno=4), + Instr("POP_JUMP_IF_FALSE", block2, lineno=4), + ] + ) + block1.extend([Instr("LOAD_FAST", "arg", lineno=5), Instr("STORE_FAST", "x", lineno=5)]) + block2.extend( + [ + Instr("LOAD_CONST", 3, lineno=6), + Instr("STORE_FAST", "x", lineno=6), + Instr("LOAD_FAST", "x", lineno=7), + Instr("RETURN_VALUE", lineno=7), + ] + ) + + if OFFSET_AS_INSTRUCTION: + # The argument of the jump is divided by 2 + expected = b"|\x05" b"r\x04" b"|\x00" b"}\x05" b"d\x01" b"}\x05" b"|\x05" b"S\x00" + else: + expected = b"|\x05" b"r\x08" b"|\x00" b"}\x05" b"d\x01" b"}\x05" b"|\x05" b"S\x00" + + code = bytecode.to_code() + self.assertEqual(code.co_consts, (None, 3)) + self.assertEqual(code.co_argcount, 3) + if sys.version_info > (3, 8): + self.assertEqual(code.co_posonlyargcount, 0) + self.assertEqual(code.co_kwonlyargcount, 2) + self.assertEqual(code.co_nlocals, 6) + self.assertEqual(code.co_stacksize, 1) + # FIXME: don't use hardcoded constants + self.assertEqual(code.co_flags, 0x43) + self.assertEqual(code.co_code, expected) + self.assertEqual(code.co_names, ()) + self.assertEqual(code.co_varnames, ("arg", "arg2", "arg3", "kwonly", "kwonly2", "x")) + self.assertEqual(code.co_filename, "hello.py") + self.assertEqual(code.co_name, "func") + self.assertEqual(code.co_firstlineno, 3) + + # verify stacksize argument is honored + explicit_stacksize = code.co_stacksize + 42 + code = bytecode.to_code(stacksize=explicit_stacksize) + self.assertEqual(code.co_stacksize, explicit_stacksize) + + def test_get_block_index(self): + blocks = ControlFlowGraph() + block0 = blocks[0] + block1 = blocks.add_block() + block2 = blocks.add_block() + self.assertEqual(blocks.get_block_index(block0), 0) + self.assertEqual(blocks.get_block_index(block1), 1) + self.assertEqual(blocks.get_block_index(block2), 2) + + other_block = BasicBlock() + self.assertRaises(ValueError, blocks.get_block_index, other_block) + + +class CFGStacksizeComputationTests(TestCase): + def check_stack_size(self, func): + code = func.__code__ + bytecode = Bytecode.from_code(code) + cfg = ControlFlowGraph.from_bytecode(bytecode) + self.assertEqual(code.co_stacksize, cfg.compute_stacksize()) + + def test_empty_code(self): + cfg = ControlFlowGraph() + del cfg[0] + self.assertEqual(cfg.compute_stacksize(), 0) + + def test_handling_of_set_lineno(self): + code = Bytecode() + code.first_lineno = 3 + code.extend( + [ + Instr("LOAD_CONST", 7), + Instr("STORE_NAME", "x"), + SetLineno(4), + Instr("LOAD_CONST", 8), + Instr("STORE_NAME", "y"), + SetLineno(5), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "z"), + ] + ) + self.assertEqual(code.compute_stacksize(), 1) + + def test_invalid_stacksize(self): + code = Bytecode() + code.extend([Instr("STORE_NAME", "x")]) + with self.assertRaises(RuntimeError): + code.compute_stacksize() + + def test_stack_size_computation_and(self): + def test(arg1, *args, **kwargs): # pragma: no cover + return arg1 and args # Test JUMP_IF_FALSE_OR_POP + + self.check_stack_size(test) + + def test_stack_size_computation_or(self): + def test(arg1, *args, **kwargs): # pragma: no cover + return arg1 or args # Test JUMP_IF_TRUE_OR_POP + + self.check_stack_size(test) + + def test_stack_size_computation_if_else(self): + def test(arg1, *args, **kwargs): # pragma: no cover + if args: + return 0 + elif kwargs: + return 1 + else: + return 2 + + self.check_stack_size(test) + + def test_stack_size_computation_for_loop_continue(self): + def test(arg1, *args, **kwargs): # pragma: no cover + for k in kwargs: + if k in args: + continue + else: + return 1 + + self.check_stack_size(test) + + def test_stack_size_computation_while_loop_break(self): + def test(arg1, *args, **kwargs): # pragma: no cover + while True: + if arg1: + break + + self.check_stack_size(test) + + def test_stack_size_computation_with(self): + def test(arg1, *args, **kwargs): # pragma: no cover + with open(arg1) as f: + return f.read() + + self.check_stack_size(test) + + def test_stack_size_computation_try_except(self): + def test(arg1, *args, **kwargs): # pragma: no cover + try: + return args[0] + except Exception: + return 2 + + self.check_stack_size(test) + + def test_stack_size_computation_try_finally(self): + def test(arg1, *args, **kwargs): # pragma: no cover + try: + return args[0] + finally: + return 2 + + self.check_stack_size(test) + + def test_stack_size_computation_try_except_finally(self): + def test(arg1, *args, **kwargs): # pragma: no cover + try: + return args[0] + except Exception: + return 2 + finally: + print("Interrupt") + + self.check_stack_size(test) + + def test_stack_size_computation_try_except_else_finally(self): + def test(arg1, *args, **kwargs): # pragma: no cover + try: + return args[0] + except Exception: + return 2 + else: + return arg1 + finally: + print("Interrupt") + + self.check_stack_size(test) + + def test_stack_size_computation_nested_try_except_finally(self): + def test(arg1, *args, **kwargs): # pragma: no cover + k = 1 + try: + getattr(arg1, k) + except AttributeError: + pass + except Exception: + try: + assert False + except Exception: + return 2 + finally: + print("unexpected") + finally: + print("attempted to get {}".format(k)) + + self.check_stack_size(test) + + def test_stack_size_computation_nested_try_except_else_finally(self): + def test(*args, **kwargs): + try: + v = args[1] + except IndexError: + try: + w = kwargs["value"] + except KeyError: + return -1 + else: + return w + finally: + print("second finally") + else: + return v + finally: + print("first finally") + + # A direct comparison of the stack depth fails because CPython + # generate dead code that is used in stack computation. + cpython_stacksize = test.__code__.co_stacksize + test.__code__ = Bytecode.from_code(test.__code__).to_code() + self.assertLessEqual(test.__code__.co_stacksize, cpython_stacksize) + with contextlib.redirect_stdout(io.StringIO()) as stdout: + self.assertEqual(test(1, 4), 4) + self.assertEqual(stdout.getvalue(), "first finally\n") + + with contextlib.redirect_stdout(io.StringIO()) as stdout: + self.assertEqual(test([], value=3), 3) + self.assertEqual(stdout.getvalue(), "second finally\nfirst finally\n") + + with contextlib.redirect_stdout(io.StringIO()) as stdout: + self.assertEqual(test([], name=None), -1) + self.assertEqual(stdout.getvalue(), "second finally\nfirst finally\n") + + def test_stack_size_with_dead_code(self): + # Simply demonstrate more directly the previously mentioned issue. + def test(*args): # pragma: no cover + return 0 + try: + a = args[0] + except IndexError: + return -1 + else: + return a + + test.__code__ = Bytecode.from_code(test.__code__).to_code() + self.assertEqual(test.__code__.co_stacksize, 1) + self.assertEqual(test(1), 0) + + def test_huge_code_with_numerous_blocks(self): + def base_func(x): + pass + + def mk_if_then_else(depth): + instructions = [] + for i in range(depth): + label_else = Label() + instructions.extend( + [ + Instr("LOAD_FAST", "x"), + Instr("POP_JUMP_IF_FALSE", label_else), + Instr("LOAD_GLOBAL", "f{}".format(i)), + Instr("RETURN_VALUE"), + label_else, + ] + ) + instructions.extend([Instr("LOAD_CONST", None), Instr("RETURN_VALUE")]) + return instructions + + bytecode = Bytecode(mk_if_then_else(5000)) + bytecode.compute_stacksize() + + +if __name__ == "__main__": + unittest.main() # pragma: no cover diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py new file mode 100644 index 0000000..4820e87 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py @@ -0,0 +1,93 @@ +import pytest +from tests_python.debugger_unittest import IS_PY36_OR_GREATER, IS_CPYTHON +from tests_python.debug_constants import TEST_CYTHON + +pytestmark = pytest.mark.skipif(not IS_PY36_OR_GREATER or not IS_CPYTHON or not TEST_CYTHON, reason="Requires CPython >= 3.6") +import unittest + +from _pydevd_frame_eval.vendored.bytecode import ConcreteBytecode, Bytecode, ControlFlowGraph +from _pydevd_frame_eval.vendored.bytecode.tests import get_code + + +class CodeTests(unittest.TestCase): + """Check that bytecode.from_code(code).to_code() returns code.""" + + def check(self, source, function=False): + ref_code = get_code(source, function=function) + + code = ConcreteBytecode.from_code(ref_code).to_code() + self.assertEqual(code, ref_code) + + code = Bytecode.from_code(ref_code).to_code() + self.assertEqual(code, ref_code) + + bytecode = Bytecode.from_code(ref_code) + blocks = ControlFlowGraph.from_bytecode(bytecode) + code = blocks.to_bytecode().to_code() + self.assertEqual(code, ref_code) + + def test_loop(self): + self.check( + """ + for x in range(1, 10): + x += 1 + if x == 3: + continue + x -= 1 + if x > 7: + break + x = 0 + print(x) + """ + ) + + def test_varargs(self): + self.check( + """ + def func(a, b, *varargs): + pass + """, + function=True, + ) + + def test_kwargs(self): + self.check( + """ + def func(a, b, **kwargs): + pass + """, + function=True, + ) + + def test_kwonlyargs(self): + self.check( + """ + def func(*, arg, arg2): + pass + """, + function=True, + ) + + # Added because Python 3.10 added some special beahavior with respect to + # generators in term of stack size + def test_generator_func(self): + self.check( + """ + def func(arg, arg2): + yield + """, + function=True, + ) + + def test_async_func(self): + self.check( + """ + async def func(arg, arg2): + pass + """, + function=True, + ) + + +if __name__ == "__main__": + unittest.main() # pragma: no cover diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py new file mode 100644 index 0000000..f1fe5e6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py @@ -0,0 +1,1486 @@ +import pytest +from tests_python.debugger_unittest import IS_PY36_OR_GREATER, IS_CPYTHON +from tests_python.debug_constants import TEST_CYTHON + +pytestmark = pytest.mark.skipif(not IS_PY36_OR_GREATER or not IS_CPYTHON or not TEST_CYTHON, reason="Requires CPython >= 3.6") +#!/usr/bin/env python3 +import opcode +import sys +import textwrap +import types +import unittest + +from _pydevd_frame_eval.vendored.bytecode import ( + UNSET, + Label, + Instr, + SetLineno, + Bytecode, + CellVar, + FreeVar, + CompilerFlags, + ConcreteInstr, + ConcreteBytecode, +) +from _pydevd_frame_eval.vendored.bytecode.concrete import OFFSET_AS_INSTRUCTION +from _pydevd_frame_eval.vendored.bytecode.tests import get_code, TestCase + + +class ConcreteInstrTests(TestCase): + def test_constructor(self): + with self.assertRaises(ValueError): + # need an argument + ConcreteInstr("LOAD_CONST") + with self.assertRaises(ValueError): + # must not have an argument + ConcreteInstr("ROT_TWO", 33) + + # invalid argument + with self.assertRaises(TypeError): + ConcreteInstr("LOAD_CONST", 1.0) + with self.assertRaises(ValueError): + ConcreteInstr("LOAD_CONST", -1) + with self.assertRaises(TypeError): + ConcreteInstr("LOAD_CONST", 5, lineno=1.0) + with self.assertRaises(ValueError): + ConcreteInstr("LOAD_CONST", 5, lineno=-1) + + # test maximum argument + with self.assertRaises(ValueError): + ConcreteInstr("LOAD_CONST", 2147483647 + 1) + instr = ConcreteInstr("LOAD_CONST", 2147483647) + self.assertEqual(instr.arg, 2147483647) + + # test meaningless extended args + instr = ConcreteInstr("LOAD_FAST", 8, lineno=3, extended_args=1) + self.assertEqual(instr.name, "LOAD_FAST") + self.assertEqual(instr.arg, 8) + self.assertEqual(instr.lineno, 3) + self.assertEqual(instr.size, 4) + + def test_attr(self): + instr = ConcreteInstr("LOAD_CONST", 5, lineno=12) + self.assertEqual(instr.name, "LOAD_CONST") + self.assertEqual(instr.opcode, 100) + self.assertEqual(instr.arg, 5) + self.assertEqual(instr.lineno, 12) + self.assertEqual(instr.size, 2) + + def test_set(self): + instr = ConcreteInstr("LOAD_CONST", 5, lineno=3) + + instr.set("NOP") + self.assertEqual(instr.name, "NOP") + self.assertIs(instr.arg, UNSET) + self.assertEqual(instr.lineno, 3) + + instr.set("LOAD_FAST", 8) + self.assertEqual(instr.name, "LOAD_FAST") + self.assertEqual(instr.arg, 8) + self.assertEqual(instr.lineno, 3) + + # invalid + with self.assertRaises(ValueError): + instr.set("LOAD_CONST") + with self.assertRaises(ValueError): + instr.set("NOP", 5) + + def test_set_attr(self): + instr = ConcreteInstr("LOAD_CONST", 5, lineno=12) + + # operator name + instr.name = "LOAD_FAST" + self.assertEqual(instr.name, "LOAD_FAST") + self.assertEqual(instr.opcode, 124) + self.assertRaises(TypeError, setattr, instr, "name", 3) + self.assertRaises(ValueError, setattr, instr, "name", "xxx") + + # operator code + instr.opcode = 100 + self.assertEqual(instr.name, "LOAD_CONST") + self.assertEqual(instr.opcode, 100) + self.assertRaises(ValueError, setattr, instr, "opcode", -12) + self.assertRaises(TypeError, setattr, instr, "opcode", "abc") + + # extended argument + instr.arg = 0x1234ABCD + self.assertEqual(instr.arg, 0x1234ABCD) + self.assertEqual(instr.size, 8) + + # small argument + instr.arg = 0 + self.assertEqual(instr.arg, 0) + self.assertEqual(instr.size, 2) + + # invalid argument + self.assertRaises(ValueError, setattr, instr, "arg", -1) + self.assertRaises(ValueError, setattr, instr, "arg", 2147483647 + 1) + + # size attribute is read-only + self.assertRaises(AttributeError, setattr, instr, "size", 3) + + # lineno + instr.lineno = 33 + self.assertEqual(instr.lineno, 33) + self.assertRaises(TypeError, setattr, instr, "lineno", 1.0) + self.assertRaises(ValueError, setattr, instr, "lineno", -1) + + def test_size(self): + self.assertEqual(ConcreteInstr("ROT_TWO").size, 2) + self.assertEqual(ConcreteInstr("LOAD_CONST", 3).size, 2) + self.assertEqual(ConcreteInstr("LOAD_CONST", 0x1234ABCD).size, 8) + + def test_disassemble(self): + code = b"\t\x00d\x03" + instr = ConcreteInstr.disassemble(1, code, 0) + self.assertEqual(instr, ConcreteInstr("NOP", lineno=1)) + + instr = ConcreteInstr.disassemble(2, code, 1 if OFFSET_AS_INSTRUCTION else 2) + self.assertEqual(instr, ConcreteInstr("LOAD_CONST", 3, lineno=2)) + + code = b"\x90\x12\x904\x90\xabd\xcd" + + instr = ConcreteInstr.disassemble(3, code, 0) + self.assertEqual(instr, ConcreteInstr("EXTENDED_ARG", 0x12, lineno=3)) + + def test_assemble(self): + instr = ConcreteInstr("NOP") + self.assertEqual(instr.assemble(), b"\t\x00") + + instr = ConcreteInstr("LOAD_CONST", 3) + self.assertEqual(instr.assemble(), b"d\x03") + + instr = ConcreteInstr("LOAD_CONST", 0x1234ABCD) + self.assertEqual( + instr.assemble(), + (b"\x90\x12\x904\x90\xabd\xcd"), + ) + + instr = ConcreteInstr("LOAD_CONST", 3, extended_args=1) + self.assertEqual( + instr.assemble(), + (b"\x90\x00d\x03"), + ) + + def test_get_jump_target(self): + jump_abs = ConcreteInstr("JUMP_ABSOLUTE", 3) + self.assertEqual(jump_abs.get_jump_target(100), 3) + + jump_forward = ConcreteInstr("JUMP_FORWARD", 5) + self.assertEqual(jump_forward.get_jump_target(10), 16 if OFFSET_AS_INSTRUCTION else 17) + + +class ConcreteBytecodeTests(TestCase): + def test_repr(self): + r = repr(ConcreteBytecode()) + self.assertIn("ConcreteBytecode", r) + self.assertIn("0", r) + + def test_eq(self): + code = ConcreteBytecode() + self.assertFalse(code == 1) + + for name, val in ( + ("names", ["a"]), + ("varnames", ["a"]), + ("consts", [1]), + ("argcount", 1), + ("kwonlyargcount", 2), + ("flags", CompilerFlags(CompilerFlags.GENERATOR)), + ("first_lineno", 10), + ("filename", "xxxx.py"), + ("name", "__x"), + ("docstring", "x-x-x"), + ("cellvars", [CellVar("x")]), + ("freevars", [FreeVar("x")]), + ): + c = ConcreteBytecode() + setattr(c, name, val) + # For obscure reasons using assertNotEqual here fail + self.assertFalse(code == c) + + if sys.version_info > (3, 8): + c = ConcreteBytecode() + c.posonlyargcount = 10 + self.assertFalse(code == c) + + c = ConcreteBytecode() + c.consts = [1] + code.consts = [1] + c.append(ConcreteInstr("LOAD_CONST", 0)) + self.assertFalse(code == c) + + def test_attr(self): + code_obj = get_code("x = 5") + code = ConcreteBytecode.from_code(code_obj) + self.assertEqual(code.consts, [5, None]) + self.assertEqual(code.names, ["x"]) + self.assertEqual(code.varnames, []) + self.assertEqual(code.freevars, []) + self.assertListEqual( + list(code), + [ + ConcreteInstr("LOAD_CONST", 0, lineno=1), + ConcreteInstr("STORE_NAME", 0, lineno=1), + ConcreteInstr("LOAD_CONST", 1, lineno=1), + ConcreteInstr("RETURN_VALUE", lineno=1), + ], + ) + # FIXME: test other attributes + + def test_invalid_types(self): + code = ConcreteBytecode() + code.append(Label()) + with self.assertRaises(ValueError): + list(code) + with self.assertRaises(ValueError): + code.legalize() + with self.assertRaises(ValueError): + ConcreteBytecode([Label()]) + + def test_to_code_lnotab(self): + # We use an actual function for the simple case to + # ensure we get lnotab right + def f(): + # + # + x = 7 # noqa + y = 8 # noqa + z = 9 # noqa + + fl = f.__code__.co_firstlineno + concrete = ConcreteBytecode() + concrete.consts = [None, 7, 8, 9] + concrete.varnames = ["x", "y", "z"] + concrete.first_lineno = fl + concrete.extend( + [ + SetLineno(fl + 3), + ConcreteInstr("LOAD_CONST", 1), + ConcreteInstr("STORE_FAST", 0), + SetLineno(fl + 4), + ConcreteInstr("LOAD_CONST", 2), + ConcreteInstr("STORE_FAST", 1), + SetLineno(fl + 5), + ConcreteInstr("LOAD_CONST", 3), + ConcreteInstr("STORE_FAST", 2), + ConcreteInstr("LOAD_CONST", 0), + ConcreteInstr("RETURN_VALUE"), + ] + ) + + code = concrete.to_code() + self.assertEqual(code.co_code, f.__code__.co_code) + self.assertEqual(code.co_lnotab, f.__code__.co_lnotab) + if sys.version_info >= (3, 10): + self.assertEqual(code.co_linetable, f.__code__.co_linetable) + + def test_negative_lnotab(self): + # x = 7 + # y = 8 + concrete = ConcreteBytecode( + [ + ConcreteInstr("LOAD_CONST", 0), + ConcreteInstr("STORE_NAME", 0), + # line number goes backward! + SetLineno(2), + ConcreteInstr("LOAD_CONST", 1), + ConcreteInstr("STORE_NAME", 1), + ] + ) + concrete.consts = [7, 8] + concrete.names = ["x", "y"] + concrete.first_lineno = 5 + + code = concrete.to_code() + expected = b"d\x00Z\x00d\x01Z\x01" + self.assertEqual(code.co_code, expected) + self.assertEqual(code.co_firstlineno, 5) + self.assertEqual(code.co_lnotab, b"\x04\xfd") + + def test_extended_lnotab(self): + # x = 7 + # 200 blank lines + # y = 8 + concrete = ConcreteBytecode( + [ + ConcreteInstr("LOAD_CONST", 0), + SetLineno(1 + 128), + ConcreteInstr("STORE_NAME", 0), + # line number goes backward! + SetLineno(1 + 129), + ConcreteInstr("LOAD_CONST", 1), + SetLineno(1), + ConcreteInstr("STORE_NAME", 1), + ] + ) + concrete.consts = [7, 8] + concrete.names = ["x", "y"] + concrete.first_lineno = 1 + + code = concrete.to_code() + expected = b"d\x00Z\x00d\x01Z\x01" + self.assertEqual(code.co_code, expected) + self.assertEqual(code.co_firstlineno, 1) + self.assertEqual(code.co_lnotab, b"\x02\x7f\x00\x01\x02\x01\x02\x80\x00\xff") + + def test_extended_lnotab2(self): + # x = 7 + # 200 blank lines + # y = 8 + base_code = compile("x = 7" + "\n" * 200 + "y = 8", "", "exec") + concrete = ConcreteBytecode( + [ + ConcreteInstr("LOAD_CONST", 0), + ConcreteInstr("STORE_NAME", 0), + SetLineno(201), + ConcreteInstr("LOAD_CONST", 1), + ConcreteInstr("STORE_NAME", 1), + ConcreteInstr("LOAD_CONST", 2), + ConcreteInstr("RETURN_VALUE"), + ] + ) + concrete.consts = [None, 7, 8] + concrete.names = ["x", "y"] + concrete.first_lineno = 1 + + code = concrete.to_code() + self.assertEqual(code.co_code, base_code.co_code) + self.assertEqual(code.co_firstlineno, base_code.co_firstlineno) + self.assertEqual(code.co_lnotab, base_code.co_lnotab) + if sys.version_info >= (3, 10): + self.assertEqual(code.co_linetable, base_code.co_linetable) + + def test_to_bytecode_consts(self): + # x = -0.0 + # x = +0.0 + # + # code optimized by the CPython 3.6 peephole optimizer which emits + # duplicated constants (0.0 is twice in consts). + code = ConcreteBytecode() + code.consts = [0.0, None, -0.0, 0.0] + code.names = ["x", "y"] + code.extend( + [ + ConcreteInstr("LOAD_CONST", 2, lineno=1), + ConcreteInstr("STORE_NAME", 0, lineno=1), + ConcreteInstr("LOAD_CONST", 3, lineno=2), + ConcreteInstr("STORE_NAME", 1, lineno=2), + ConcreteInstr("LOAD_CONST", 1, lineno=2), + ConcreteInstr("RETURN_VALUE", lineno=2), + ] + ) + + code = code.to_bytecode().to_concrete_bytecode() + # the conversion changes the constant order: the order comes from + # the order of LOAD_CONST instructions + self.assertEqual(code.consts, [-0.0, 0.0, None]) + code.names = ["x", "y"] + self.assertListEqual( + list(code), + [ + ConcreteInstr("LOAD_CONST", 0, lineno=1), + ConcreteInstr("STORE_NAME", 0, lineno=1), + ConcreteInstr("LOAD_CONST", 1, lineno=2), + ConcreteInstr("STORE_NAME", 1, lineno=2), + ConcreteInstr("LOAD_CONST", 2, lineno=2), + ConcreteInstr("RETURN_VALUE", lineno=2), + ], + ) + + def test_cellvar(self): + concrete = ConcreteBytecode() + concrete.cellvars = ["x"] + concrete.append(ConcreteInstr("LOAD_DEREF", 0)) + code = concrete.to_code() + + concrete = ConcreteBytecode.from_code(code) + self.assertEqual(concrete.cellvars, ["x"]) + self.assertEqual(concrete.freevars, []) + self.assertEqual(list(concrete), [ConcreteInstr("LOAD_DEREF", 0, lineno=1)]) + + bytecode = concrete.to_bytecode() + self.assertEqual(bytecode.cellvars, ["x"]) + self.assertEqual(list(bytecode), [Instr("LOAD_DEREF", CellVar("x"), lineno=1)]) + + def test_freevar(self): + concrete = ConcreteBytecode() + concrete.freevars = ["x"] + concrete.append(ConcreteInstr("LOAD_DEREF", 0)) + code = concrete.to_code() + + concrete = ConcreteBytecode.from_code(code) + self.assertEqual(concrete.cellvars, []) + self.assertEqual(concrete.freevars, ["x"]) + self.assertEqual(list(concrete), [ConcreteInstr("LOAD_DEREF", 0, lineno=1)]) + + bytecode = concrete.to_bytecode() + self.assertEqual(bytecode.cellvars, []) + self.assertEqual(list(bytecode), [Instr("LOAD_DEREF", FreeVar("x"), lineno=1)]) + + def test_cellvar_freevar(self): + concrete = ConcreteBytecode() + concrete.cellvars = ["cell"] + concrete.freevars = ["free"] + concrete.append(ConcreteInstr("LOAD_DEREF", 0)) + concrete.append(ConcreteInstr("LOAD_DEREF", 1)) + code = concrete.to_code() + + concrete = ConcreteBytecode.from_code(code) + self.assertEqual(concrete.cellvars, ["cell"]) + self.assertEqual(concrete.freevars, ["free"]) + self.assertEqual( + list(concrete), + [ + ConcreteInstr("LOAD_DEREF", 0, lineno=1), + ConcreteInstr("LOAD_DEREF", 1, lineno=1), + ], + ) + + bytecode = concrete.to_bytecode() + self.assertEqual(bytecode.cellvars, ["cell"]) + self.assertEqual( + list(bytecode), + [ + Instr("LOAD_DEREF", CellVar("cell"), lineno=1), + Instr("LOAD_DEREF", FreeVar("free"), lineno=1), + ], + ) + + def test_load_classderef(self): + concrete = ConcreteBytecode() + concrete.cellvars = ["__class__"] + concrete.freevars = ["__class__"] + concrete.extend([ConcreteInstr("LOAD_CLASSDEREF", 1), ConcreteInstr("STORE_DEREF", 1)]) + + bytecode = concrete.to_bytecode() + self.assertEqual(bytecode.freevars, ["__class__"]) + self.assertEqual(bytecode.cellvars, ["__class__"]) + self.assertEqual( + list(bytecode), + [ + Instr("LOAD_CLASSDEREF", FreeVar("__class__"), lineno=1), + Instr("STORE_DEREF", FreeVar("__class__"), lineno=1), + ], + ) + + concrete = bytecode.to_concrete_bytecode() + self.assertEqual(concrete.freevars, ["__class__"]) + self.assertEqual(concrete.cellvars, ["__class__"]) + self.assertEqual( + list(concrete), + [ + ConcreteInstr("LOAD_CLASSDEREF", 1, lineno=1), + ConcreteInstr("STORE_DEREF", 1, lineno=1), + ], + ) + + code = concrete.to_code() + self.assertEqual(code.co_freevars, ("__class__",)) + self.assertEqual(code.co_cellvars, ("__class__",)) + self.assertEqual( + code.co_code, + b"\x94\x01\x89\x01", + ) + + def test_explicit_stacksize(self): + # Passing stacksize=... to ConcreteBytecode.to_code should result in a + # code object with the specified stacksize. We pass some silly values + # and assert that they are honored. + code_obj = get_code("print('%s' % (a,b,c))") + original_stacksize = code_obj.co_stacksize + concrete = ConcreteBytecode.from_code(code_obj) + + # First with something bigger than necessary. + explicit_stacksize = original_stacksize + 42 + new_code_obj = concrete.to_code(stacksize=explicit_stacksize) + self.assertEqual(new_code_obj.co_stacksize, explicit_stacksize) + + # Then with something bogus. We probably don't want to advertise this + # in the documentation. If this fails then decide if it's for good + # reason, and remove if so. + explicit_stacksize = 0 + new_code_obj = concrete.to_code(stacksize=explicit_stacksize) + self.assertEqual(new_code_obj.co_stacksize, explicit_stacksize) + + def test_legalize(self): + concrete = ConcreteBytecode() + concrete.first_lineno = 3 + concrete.consts = [7, 8, 9] + concrete.names = ["x", "y", "z"] + concrete.extend( + [ + ConcreteInstr("LOAD_CONST", 0), + ConcreteInstr("STORE_NAME", 0), + ConcreteInstr("LOAD_CONST", 1, lineno=4), + ConcreteInstr("STORE_NAME", 1), + SetLineno(5), + ConcreteInstr("LOAD_CONST", 2, lineno=6), + ConcreteInstr("STORE_NAME", 2), + ] + ) + + concrete.legalize() + self.assertListEqual( + list(concrete), + [ + ConcreteInstr("LOAD_CONST", 0, lineno=3), + ConcreteInstr("STORE_NAME", 0, lineno=3), + ConcreteInstr("LOAD_CONST", 1, lineno=4), + ConcreteInstr("STORE_NAME", 1, lineno=4), + ConcreteInstr("LOAD_CONST", 2, lineno=5), + ConcreteInstr("STORE_NAME", 2, lineno=5), + ], + ) + + def test_slice(self): + concrete = ConcreteBytecode() + concrete.first_lineno = 3 + concrete.consts = [7, 8, 9] + concrete.names = ["x", "y", "z"] + concrete.extend( + [ + ConcreteInstr("LOAD_CONST", 0), + ConcreteInstr("STORE_NAME", 0), + SetLineno(4), + ConcreteInstr("LOAD_CONST", 1), + ConcreteInstr("STORE_NAME", 1), + SetLineno(5), + ConcreteInstr("LOAD_CONST", 2), + ConcreteInstr("STORE_NAME", 2), + ] + ) + self.assertEqual(concrete, concrete[:]) + + def test_copy(self): + concrete = ConcreteBytecode() + concrete.first_lineno = 3 + concrete.consts = [7, 8, 9] + concrete.names = ["x", "y", "z"] + concrete.extend( + [ + ConcreteInstr("LOAD_CONST", 0), + ConcreteInstr("STORE_NAME", 0), + SetLineno(4), + ConcreteInstr("LOAD_CONST", 1), + ConcreteInstr("STORE_NAME", 1), + SetLineno(5), + ConcreteInstr("LOAD_CONST", 2), + ConcreteInstr("STORE_NAME", 2), + ] + ) + self.assertEqual(concrete, concrete.copy()) + + +class ConcreteFromCodeTests(TestCase): + def test_extended_arg(self): + # Create a code object from arbitrary bytecode + co_code = b"\x90\x12\x904\x90\xabd\xcd" + code = get_code("x=1") + args = (code.co_argcount,) if sys.version_info < (3, 8) else (code.co_argcount, code.co_posonlyargcount) + args += ( + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + code.co_name, + code.co_firstlineno, + code.co_linetable if sys.version_info >= (3, 10) else code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + code = types.CodeType(*args) + + # without EXTENDED_ARG opcode + bytecode = ConcreteBytecode.from_code(code) + self.assertListEqual(list(bytecode), [ConcreteInstr("LOAD_CONST", 0x1234ABCD, lineno=1)]) + + # with EXTENDED_ARG opcode + bytecode = ConcreteBytecode.from_code(code, extended_arg=True) + expected = [ + ConcreteInstr("EXTENDED_ARG", 0x12, lineno=1), + ConcreteInstr("EXTENDED_ARG", 0x34, lineno=1), + ConcreteInstr("EXTENDED_ARG", 0xAB, lineno=1), + ConcreteInstr("LOAD_CONST", 0xCD, lineno=1), + ] + self.assertListEqual(list(bytecode), expected) + + def test_extended_arg_make_function(self): + if (3, 9) <= sys.version_info < (3, 10): + from _pydevd_frame_eval.vendored.bytecode.tests.util_annotation import get_code as get_code_future + + code_obj = get_code_future( + """ + def foo(x: int, y: int): + pass + """ + ) + else: + code_obj = get_code( + """ + def foo(x: int, y: int): + pass + """ + ) + + # without EXTENDED_ARG + concrete = ConcreteBytecode.from_code(code_obj) + if sys.version_info >= (3, 10): + func_code = concrete.consts[2] + names = ["int", "foo"] + consts = ["x", "y", func_code, "foo", None] + const_offset = 1 + name_offset = 1 + first_instrs = [ + ConcreteInstr("LOAD_CONST", 0, lineno=1), + ConcreteInstr("LOAD_NAME", 0, lineno=1), + ConcreteInstr("LOAD_CONST", 1, lineno=1), + ConcreteInstr("LOAD_NAME", 0, lineno=1), + ConcreteInstr("BUILD_TUPLE", 4, lineno=1), + ] + elif sys.version_info >= (3, 7) and concrete.flags & CompilerFlags.FUTURE_ANNOTATIONS: + func_code = concrete.consts[2] + names = ["foo"] + consts = ["int", ("x", "y"), func_code, "foo", None] + const_offset = 1 + name_offset = 0 + first_instrs = [ + ConcreteInstr("LOAD_CONST", 0, lineno=1), + ConcreteInstr("LOAD_CONST", 0, lineno=1), + ConcreteInstr("LOAD_CONST", 0 + const_offset, lineno=1), + ConcreteInstr("BUILD_CONST_KEY_MAP", 2, lineno=1), + ] + else: + func_code = concrete.consts[1] + names = ["int", "foo"] + consts = [("x", "y"), func_code, "foo", None] + const_offset = 0 + name_offset = 1 + first_instrs = [ + ConcreteInstr("LOAD_NAME", 0, lineno=1), + ConcreteInstr("LOAD_NAME", 0, lineno=1), + ConcreteInstr("LOAD_CONST", 0 + const_offset, lineno=1), + ConcreteInstr("BUILD_CONST_KEY_MAP", 2, lineno=1), + ] + + self.assertEqual(concrete.names, names) + self.assertEqual(concrete.consts, consts) + expected = first_instrs + [ + ConcreteInstr("LOAD_CONST", 1 + const_offset, lineno=1), + ConcreteInstr("LOAD_CONST", 2 + const_offset, lineno=1), + ConcreteInstr("MAKE_FUNCTION", 4, lineno=1), + ConcreteInstr("STORE_NAME", name_offset, lineno=1), + ConcreteInstr("LOAD_CONST", 3 + const_offset, lineno=1), + ConcreteInstr("RETURN_VALUE", lineno=1), + ] + self.assertListEqual(list(concrete), expected) + + # with EXTENDED_ARG + concrete = ConcreteBytecode.from_code(code_obj, extended_arg=True) + # With future annotation the int annotation is stringified and + # stored as constant this the default behavior under Python 3.10 + if sys.version_info >= (3, 10): + func_code = concrete.consts[2] + names = ["int", "foo"] + consts = ["x", "y", func_code, "foo", None] + elif concrete.flags & CompilerFlags.FUTURE_ANNOTATIONS: + func_code = concrete.consts[2] + names = ["foo"] + consts = ["int", ("x", "y"), func_code, "foo", None] + else: + func_code = concrete.consts[1] + names = ["int", "foo"] + consts = [("x", "y"), func_code, "foo", None] + + self.assertEqual(concrete.names, names) + self.assertEqual(concrete.consts, consts) + self.assertListEqual(list(concrete), expected) + + # The next three tests ensure we can round trip ConcreteBytecode generated + # with extended_args=True + + def test_extended_arg_unpack_ex(self): + def test(): + p = [1, 2, 3, 4, 5, 6] + q, r, *s, t = p + return q, r, s, t + + cpython_stacksize = test.__code__.co_stacksize + test.__code__ = ConcreteBytecode.from_code(test.__code__, extended_arg=True).to_code() + self.assertEqual(test.__code__.co_stacksize, cpython_stacksize) + self.assertEqual(test(), (1, 2, [3, 4, 5], 6)) + + def test_expected_arg_with_many_consts(self): + def test(): + var = 0 + var = 1 + var = 2 + var = 3 + var = 4 + var = 5 + var = 6 + var = 7 + var = 8 + var = 9 + var = 10 + var = 11 + var = 12 + var = 13 + var = 14 + var = 15 + var = 16 + var = 17 + var = 18 + var = 19 + var = 20 + var = 21 + var = 22 + var = 23 + var = 24 + var = 25 + var = 26 + var = 27 + var = 28 + var = 29 + var = 30 + var = 31 + var = 32 + var = 33 + var = 34 + var = 35 + var = 36 + var = 37 + var = 38 + var = 39 + var = 40 + var = 41 + var = 42 + var = 43 + var = 44 + var = 45 + var = 46 + var = 47 + var = 48 + var = 49 + var = 50 + var = 51 + var = 52 + var = 53 + var = 54 + var = 55 + var = 56 + var = 57 + var = 58 + var = 59 + var = 60 + var = 61 + var = 62 + var = 63 + var = 64 + var = 65 + var = 66 + var = 67 + var = 68 + var = 69 + var = 70 + var = 71 + var = 72 + var = 73 + var = 74 + var = 75 + var = 76 + var = 77 + var = 78 + var = 79 + var = 80 + var = 81 + var = 82 + var = 83 + var = 84 + var = 85 + var = 86 + var = 87 + var = 88 + var = 89 + var = 90 + var = 91 + var = 92 + var = 93 + var = 94 + var = 95 + var = 96 + var = 97 + var = 98 + var = 99 + var = 100 + var = 101 + var = 102 + var = 103 + var = 104 + var = 105 + var = 106 + var = 107 + var = 108 + var = 109 + var = 110 + var = 111 + var = 112 + var = 113 + var = 114 + var = 115 + var = 116 + var = 117 + var = 118 + var = 119 + var = 120 + var = 121 + var = 122 + var = 123 + var = 124 + var = 125 + var = 126 + var = 127 + var = 128 + var = 129 + var = 130 + var = 131 + var = 132 + var = 133 + var = 134 + var = 135 + var = 136 + var = 137 + var = 138 + var = 139 + var = 140 + var = 141 + var = 142 + var = 143 + var = 144 + var = 145 + var = 146 + var = 147 + var = 148 + var = 149 + var = 150 + var = 151 + var = 152 + var = 153 + var = 154 + var = 155 + var = 156 + var = 157 + var = 158 + var = 159 + var = 160 + var = 161 + var = 162 + var = 163 + var = 164 + var = 165 + var = 166 + var = 167 + var = 168 + var = 169 + var = 170 + var = 171 + var = 172 + var = 173 + var = 174 + var = 175 + var = 176 + var = 177 + var = 178 + var = 179 + var = 180 + var = 181 + var = 182 + var = 183 + var = 184 + var = 185 + var = 186 + var = 187 + var = 188 + var = 189 + var = 190 + var = 191 + var = 192 + var = 193 + var = 194 + var = 195 + var = 196 + var = 197 + var = 198 + var = 199 + var = 200 + var = 201 + var = 202 + var = 203 + var = 204 + var = 205 + var = 206 + var = 207 + var = 208 + var = 209 + var = 210 + var = 211 + var = 212 + var = 213 + var = 214 + var = 215 + var = 216 + var = 217 + var = 218 + var = 219 + var = 220 + var = 221 + var = 222 + var = 223 + var = 224 + var = 225 + var = 226 + var = 227 + var = 228 + var = 229 + var = 230 + var = 231 + var = 232 + var = 233 + var = 234 + var = 235 + var = 236 + var = 237 + var = 238 + var = 239 + var = 240 + var = 241 + var = 242 + var = 243 + var = 244 + var = 245 + var = 246 + var = 247 + var = 248 + var = 249 + var = 250 + var = 251 + var = 252 + var = 253 + var = 254 + var = 255 + var = 256 + var = 257 + var = 258 + var = 259 + + return var + + test.__code__ = ConcreteBytecode.from_code(test.__code__, extended_arg=True).to_code() + self.assertEqual(test.__code__.co_stacksize, 1) + self.assertEqual(test(), 259) + + if sys.version_info >= (3, 6): + + def test_fail_extended_arg_jump(self): + def test(): + var = None + for _ in range(0, 1): + var = 0 + var = 1 + var = 2 + var = 3 + var = 4 + var = 5 + var = 6 + var = 7 + var = 8 + var = 9 + var = 10 + var = 11 + var = 12 + var = 13 + var = 14 + var = 15 + var = 16 + var = 17 + var = 18 + var = 19 + var = 20 + var = 21 + var = 22 + var = 23 + var = 24 + var = 25 + var = 26 + var = 27 + var = 28 + var = 29 + var = 30 + var = 31 + var = 32 + var = 33 + var = 34 + var = 35 + var = 36 + var = 37 + var = 38 + var = 39 + var = 40 + var = 41 + var = 42 + var = 43 + var = 44 + var = 45 + var = 46 + var = 47 + var = 48 + var = 49 + var = 50 + var = 51 + var = 52 + var = 53 + var = 54 + var = 55 + var = 56 + var = 57 + var = 58 + var = 59 + var = 60 + var = 61 + var = 62 + var = 63 + var = 64 + var = 65 + var = 66 + var = 67 + var = 68 + var = 69 + var = 70 + return var + + # Generate the bytecode with extended arguments + bytecode = ConcreteBytecode.from_code(test.__code__, extended_arg=True) + bytecode.to_code() + + +class BytecodeToConcreteTests(TestCase): + def test_label(self): + code = Bytecode() + label = Label() + code.extend( + [ + Instr("LOAD_CONST", "hello", lineno=1), + Instr("JUMP_FORWARD", label, lineno=1), + label, + Instr("POP_TOP", lineno=1), + ] + ) + + code = code.to_concrete_bytecode() + expected = [ + ConcreteInstr("LOAD_CONST", 0, lineno=1), + ConcreteInstr("JUMP_FORWARD", 0, lineno=1), + ConcreteInstr("POP_TOP", lineno=1), + ] + self.assertListEqual(list(code), expected) + self.assertListEqual(code.consts, ["hello"]) + + def test_label2(self): + bytecode = Bytecode() + label = Label() + bytecode.extend( + [ + Instr("LOAD_NAME", "test", lineno=1), + Instr("POP_JUMP_IF_FALSE", label), + Instr("LOAD_CONST", 5, lineno=2), + Instr("STORE_NAME", "x"), + Instr("JUMP_FORWARD", label), + Instr("LOAD_CONST", 7, lineno=4), + Instr("STORE_NAME", "x"), + label, + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + + concrete = bytecode.to_concrete_bytecode() + expected = [ + ConcreteInstr("LOAD_NAME", 0, lineno=1), + ConcreteInstr("POP_JUMP_IF_FALSE", 7 if OFFSET_AS_INSTRUCTION else 14, lineno=1), + ConcreteInstr("LOAD_CONST", 0, lineno=2), + ConcreteInstr("STORE_NAME", 1, lineno=2), + ConcreteInstr("JUMP_FORWARD", 2 if OFFSET_AS_INSTRUCTION else 4, lineno=2), + ConcreteInstr("LOAD_CONST", 1, lineno=4), + ConcreteInstr("STORE_NAME", 1, lineno=4), + ConcreteInstr("LOAD_CONST", 2, lineno=4), + ConcreteInstr("RETURN_VALUE", lineno=4), + ] + self.assertListEqual(list(concrete), expected) + self.assertListEqual(concrete.consts, [5, 7, None]) + self.assertListEqual(concrete.names, ["test", "x"]) + self.assertListEqual(concrete.varnames, []) + + def test_label3(self): + """ + CPython generates useless EXTENDED_ARG 0 in some cases. We need to + properly track them as otherwise we can end up with broken offset for + jumps. + """ + source = """ + def func(x): + if x == 1: + return x + 0 + elif x == 2: + return x + 1 + elif x == 3: + return x + 2 + elif x == 4: + return x + 3 + elif x == 5: + return x + 4 + elif x == 6: + return x + 5 + elif x == 7: + return x + 6 + elif x == 8: + return x + 7 + elif x == 9: + return x + 8 + elif x == 10: + return x + 9 + elif x == 11: + return x + 10 + elif x == 12: + return x + 11 + elif x == 13: + return x + 12 + elif x == 14: + return x + 13 + elif x == 15: + return x + 14 + elif x == 16: + return x + 15 + elif x == 17: + return x + 16 + return -1 + """ + code = get_code(source, function=True) + bcode = Bytecode.from_code(code) + concrete = bcode.to_concrete_bytecode() + self.assertIsInstance(concrete, ConcreteBytecode) + + # Ensure that we do not generate broken code + loc = {} + exec(textwrap.dedent(source), loc) + func = loc["func"] + func.__code__ = bcode.to_code() + for i, x in enumerate(range(1, 18)): + self.assertEqual(func(x), x + i) + self.assertEqual(func(18), -1) + + # Ensure that we properly round trip in such cases + self.assertEqual(ConcreteBytecode.from_code(code).to_code().co_code, code.co_code) + + def test_setlineno(self): + # x = 7 + # y = 8 + # z = 9 + concrete = ConcreteBytecode() + concrete.consts = [7, 8, 9] + concrete.names = ["x", "y", "z"] + concrete.first_lineno = 3 + concrete.extend( + [ + ConcreteInstr("LOAD_CONST", 0), + ConcreteInstr("STORE_NAME", 0), + SetLineno(4), + ConcreteInstr("LOAD_CONST", 1), + ConcreteInstr("STORE_NAME", 1), + SetLineno(5), + ConcreteInstr("LOAD_CONST", 2), + ConcreteInstr("STORE_NAME", 2), + ] + ) + + code = concrete.to_bytecode() + self.assertEqual( + code, + [ + Instr("LOAD_CONST", 7, lineno=3), + Instr("STORE_NAME", "x", lineno=3), + Instr("LOAD_CONST", 8, lineno=4), + Instr("STORE_NAME", "y", lineno=4), + Instr("LOAD_CONST", 9, lineno=5), + Instr("STORE_NAME", "z", lineno=5), + ], + ) + + def test_extended_jump(self): + NOP = bytes((opcode.opmap["NOP"],)) + + class BigInstr(ConcreteInstr): + def __init__(self, size): + super().__init__("NOP") + self._size = size + + def copy(self): + return self + + def assemble(self): + return NOP * self._size + + # (invalid) code using jumps > 0xffff to test extended arg + label = Label() + nb_nop = 2**16 + code = Bytecode( + [ + Instr("JUMP_ABSOLUTE", label), + BigInstr(nb_nop), + label, + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + + code_obj = code.to_code() + if OFFSET_AS_INSTRUCTION: + expected = b"\x90\x80q\x02" + NOP * nb_nop + b"d\x00S\x00" + else: + expected = b"\x90\x01\x90\x00q\x06" + NOP * nb_nop + b"d\x00S\x00" + self.assertEqual(code_obj.co_code, expected) + + def test_jumps(self): + # if test: + # x = 12 + # else: + # x = 37 + code = Bytecode() + label_else = Label() + label_return = Label() + code.extend( + [ + Instr("LOAD_NAME", "test", lineno=1), + Instr("POP_JUMP_IF_FALSE", label_else), + Instr("LOAD_CONST", 12, lineno=2), + Instr("STORE_NAME", "x"), + Instr("JUMP_FORWARD", label_return), + label_else, + Instr("LOAD_CONST", 37, lineno=4), + Instr("STORE_NAME", "x"), + label_return, + Instr("LOAD_CONST", None, lineno=4), + Instr("RETURN_VALUE"), + ] + ) + + code = code.to_concrete_bytecode() + expected = [ + ConcreteInstr("LOAD_NAME", 0, lineno=1), + ConcreteInstr("POP_JUMP_IF_FALSE", 5 if OFFSET_AS_INSTRUCTION else 10, lineno=1), + ConcreteInstr("LOAD_CONST", 0, lineno=2), + ConcreteInstr("STORE_NAME", 1, lineno=2), + ConcreteInstr("JUMP_FORWARD", 2 if OFFSET_AS_INSTRUCTION else 4, lineno=2), + ConcreteInstr("LOAD_CONST", 1, lineno=4), + ConcreteInstr("STORE_NAME", 1, lineno=4), + ConcreteInstr("LOAD_CONST", 2, lineno=4), + ConcreteInstr("RETURN_VALUE", lineno=4), + ] + self.assertListEqual(list(code), expected) + self.assertListEqual(code.consts, [12, 37, None]) + self.assertListEqual(code.names, ["test", "x"]) + self.assertListEqual(code.varnames, []) + + def test_dont_merge_constants(self): + # test two constants which are equal but have a different type + code = Bytecode() + code.extend( + [ + Instr("LOAD_CONST", 5, lineno=1), + Instr("LOAD_CONST", 5.0, lineno=1), + Instr("LOAD_CONST", -0.0, lineno=1), + Instr("LOAD_CONST", +0.0, lineno=1), + ] + ) + + code = code.to_concrete_bytecode() + expected = [ + ConcreteInstr("LOAD_CONST", 0, lineno=1), + ConcreteInstr("LOAD_CONST", 1, lineno=1), + ConcreteInstr("LOAD_CONST", 2, lineno=1), + ConcreteInstr("LOAD_CONST", 3, lineno=1), + ] + self.assertListEqual(list(code), expected) + self.assertListEqual(code.consts, [5, 5.0, -0.0, +0.0]) + + def test_cellvars(self): + code = Bytecode() + code.cellvars = ["x"] + code.freevars = ["y"] + code.extend( + [ + Instr("LOAD_DEREF", CellVar("x"), lineno=1), + Instr("LOAD_DEREF", FreeVar("y"), lineno=1), + ] + ) + concrete = code.to_concrete_bytecode() + self.assertEqual(concrete.cellvars, ["x"]) + self.assertEqual(concrete.freevars, ["y"]) + code.extend( + [ + ConcreteInstr("LOAD_DEREF", 0, lineno=1), + ConcreteInstr("LOAD_DEREF", 1, lineno=1), + ] + ) + + def test_compute_jumps_convergence(self): + # Consider the following sequence of instructions: + # + # JUMP_ABSOLUTE Label1 + # JUMP_ABSOLUTE Label2 + # ...126 instructions... + # Label1: Offset 254 on first pass, 256 second pass + # NOP + # ... many more instructions ... + # Label2: Offset > 256 on first pass + # + # On first pass of compute_jumps(), Label2 will be at address 254, so + # that value encodes into the single byte arg of JUMP_ABSOLUTE. + # + # On second pass compute_jumps() the instr at Label1 will have offset + # of 256 so will also be given an EXTENDED_ARG. + # + # Thus we need to make an additional pass. This test only verifies + # case where 2 passes is insufficient but three is enough. + # + # On Python > 3.10 we need to double the number since the offset is now + # in term of instructions and not bytes. + + # Create code from comment above. + code = Bytecode() + label1 = Label() + label2 = Label() + nop = "NOP" + code.append(Instr("JUMP_ABSOLUTE", label1)) + code.append(Instr("JUMP_ABSOLUTE", label2)) + # Need 254 * 2 + 2 since the arg will change by 1 instruction rather than 2 + # bytes. + for x in range(4, 510 if OFFSET_AS_INSTRUCTION else 254, 2): + code.append(Instr(nop)) + code.append(label1) + code.append(Instr(nop)) + for x in range( + 514 if OFFSET_AS_INSTRUCTION else 256, + 600 if OFFSET_AS_INSTRUCTION else 300, + 2, + ): + code.append(Instr(nop)) + code.append(label2) + code.append(Instr(nop)) + + # This should pass by default. + code.to_code() + + # Try with max of two passes: it should raise + with self.assertRaises(RuntimeError): + code.to_code(compute_jumps_passes=2) + + def test_extreme_compute_jumps_convergence(self): + """Test of compute_jumps() requiring absurd number of passes. + + NOTE: This test also serves to demonstrate that there is no worst + case: the number of passes can be unlimited (or, actually, limited by + the size of the provided code). + + This is an extension of test_compute_jumps_convergence. Instead of + two jumps, where the earlier gets extended after the latter, we + instead generate a series of many jumps. Each pass of compute_jumps() + extends one more instruction, which in turn causes the one behind it + to be extended on the next pass. + + """ + + # N: the number of unextended instructions that can be squeezed into a + # set of bytes adressable by the arg of an unextended instruction. + # The answer is "128", but here's how we arrive at it. + max_unextended_offset = 1 << 8 + unextended_branch_instr_size = 2 + N = max_unextended_offset // unextended_branch_instr_size + + # When using instruction rather than bytes in the offset multiply by 2 + if OFFSET_AS_INSTRUCTION: + N *= 2 + + nop = "UNARY_POSITIVE" # don't use NOP, dis.stack_effect will raise + + # The number of jumps will be equal to the number of labels. The + # number of passes of compute_jumps() required will be one greater + # than this. + labels = [Label() for x in range(0, 3 * N)] + + code = Bytecode() + code.extend(Instr("JUMP_FORWARD", labels[len(labels) - x - 1]) for x in range(0, len(labels))) + end_of_jumps = len(code) + code.extend(Instr(nop) for x in range(0, N)) + + # Now insert the labels. The first is N instructions (i.e. 256 + # bytes) after the last jump. Then they proceed to earlier positions + # 4 bytes at a time. While the targets are in the range of the nop + # instructions, 4 bytes is two instructions. When the targets are in + # the range of JUMP_FORWARD instructions we have to allow for the fact + # that the instructions will have been extended to four bytes each, so + # working backwards 4 bytes per label means just one instruction per + # label. + offset = end_of_jumps + N + for index in range(0, len(labels)): + code.insert(offset, labels[index]) + if offset <= end_of_jumps: + offset -= 1 + else: + offset -= 2 + + code.insert(0, Instr("LOAD_CONST", 0)) + del end_of_jumps + code.append(Instr("RETURN_VALUE")) + + code.to_code(compute_jumps_passes=(len(labels) + 1)) + + def test_general_constants(self): + """Test if general object could be linked as constants.""" + + class CustomObject: + pass + + class UnHashableCustomObject: + __hash__ = None + + obj1 = [1, 2, 3] + obj2 = {1, 2, 3} + obj3 = CustomObject() + obj4 = UnHashableCustomObject() + code = Bytecode( + [ + Instr("LOAD_CONST", obj1, lineno=1), + Instr("LOAD_CONST", obj2, lineno=1), + Instr("LOAD_CONST", obj3, lineno=1), + Instr("LOAD_CONST", obj4, lineno=1), + Instr("BUILD_TUPLE", 4, lineno=1), + Instr("RETURN_VALUE", lineno=1), + ] + ) + self.assertEqual(code.to_code().co_consts, (obj1, obj2, obj3, obj4)) + + def f(): + return # pragma: no cover + + f.__code__ = code.to_code() + self.assertEqual(f(), (obj1, obj2, obj3, obj4)) + + +if __name__ == "__main__": + unittest.main() # pragma: no cover diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py new file mode 100644 index 0000000..08c7cb2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py @@ -0,0 +1,157 @@ +import pytest +from tests_python.debugger_unittest import IS_PY36_OR_GREATER, IS_CPYTHON +from tests_python.debug_constants import TEST_CYTHON + +pytestmark = pytest.mark.skipif(not IS_PY36_OR_GREATER or not IS_CPYTHON or not TEST_CYTHON, reason="Requires CPython >= 3.6") +#!/usr/bin/env python3 +import unittest +from _pydevd_frame_eval.vendored.bytecode import ( + CompilerFlags, + ConcreteBytecode, + ConcreteInstr, + Bytecode, + ControlFlowGraph, +) +from _pydevd_frame_eval.vendored.bytecode.flags import infer_flags + + +class FlagsTests(unittest.TestCase): + def test_type_validation_on_inference(self): + with self.assertRaises(ValueError): + infer_flags(1) + + def test_flag_inference(self): + # Check no loss of non-infered flags + code = ControlFlowGraph() + code.flags |= ( + CompilerFlags.NEWLOCALS + | CompilerFlags.VARARGS + | CompilerFlags.VARKEYWORDS + | CompilerFlags.NESTED + | CompilerFlags.FUTURE_GENERATOR_STOP + ) + code.update_flags() + for f in ( + CompilerFlags.NEWLOCALS, + CompilerFlags.VARARGS, + CompilerFlags.VARKEYWORDS, + CompilerFlags.NESTED, + CompilerFlags.NOFREE, + CompilerFlags.OPTIMIZED, + CompilerFlags.FUTURE_GENERATOR_STOP, + ): + self.assertTrue(bool(code.flags & f)) + + # Infer optimized and nofree + code = Bytecode() + flags = infer_flags(code) + self.assertTrue(bool(flags & CompilerFlags.OPTIMIZED)) + self.assertTrue(bool(flags & CompilerFlags.NOFREE)) + code.append(ConcreteInstr("STORE_NAME", 1)) + flags = infer_flags(code) + self.assertFalse(bool(flags & CompilerFlags.OPTIMIZED)) + self.assertTrue(bool(flags & CompilerFlags.NOFREE)) + code.append(ConcreteInstr("STORE_DEREF", 2)) + code.update_flags() + self.assertFalse(bool(code.flags & CompilerFlags.OPTIMIZED)) + self.assertFalse(bool(code.flags & CompilerFlags.NOFREE)) + + def test_async_gen_no_flag_is_async_None(self): + # Test inference in the absence of any flag set on the bytecode + + # Infer generator + code = ConcreteBytecode() + code.append(ConcreteInstr("YIELD_VALUE")) + code.update_flags() + self.assertTrue(bool(code.flags & CompilerFlags.GENERATOR)) + + # Infer coroutine + code = ConcreteBytecode() + code.append(ConcreteInstr("GET_AWAITABLE")) + code.update_flags() + self.assertTrue(bool(code.flags & CompilerFlags.COROUTINE)) + + # Infer coroutine or async generator + for i, expected in ( + ("YIELD_VALUE", CompilerFlags.ASYNC_GENERATOR), + ("YIELD_FROM", CompilerFlags.COROUTINE), + ): + code = ConcreteBytecode() + code.append(ConcreteInstr("GET_AWAITABLE")) + code.append(ConcreteInstr(i)) + code.update_flags() + self.assertTrue(bool(code.flags & expected)) + + def test_async_gen_no_flag_is_async_True(self): + # Test inference when we request an async function + + # Force coroutine + code = ConcreteBytecode() + code.update_flags(is_async=True) + self.assertTrue(bool(code.flags & CompilerFlags.COROUTINE)) + + # Infer coroutine or async generator + for i, expected in ( + ("YIELD_VALUE", CompilerFlags.ASYNC_GENERATOR), + ("YIELD_FROM", CompilerFlags.COROUTINE), + ): + code = ConcreteBytecode() + code.append(ConcreteInstr(i)) + code.update_flags(is_async=True) + self.assertTrue(bool(code.flags & expected)) + + def test_async_gen_no_flag_is_async_False(self): + # Test inference when we request a non-async function + + # Infer generator + code = ConcreteBytecode() + code.append(ConcreteInstr("YIELD_VALUE")) + code.flags = CompilerFlags(CompilerFlags.COROUTINE) + code.update_flags(is_async=False) + self.assertTrue(bool(code.flags & CompilerFlags.GENERATOR)) + + # Abort on coroutine + code = ConcreteBytecode() + code.append(ConcreteInstr("GET_AWAITABLE")) + code.flags = CompilerFlags(CompilerFlags.COROUTINE) + with self.assertRaises(ValueError): + code.update_flags(is_async=False) + + def test_async_gen_flags(self): + # Test inference in the presence of pre-existing flags + + for is_async in (None, True): + # Infer generator + code = ConcreteBytecode() + code.append(ConcreteInstr("YIELD_VALUE")) + for f, expected in ( + (CompilerFlags.COROUTINE, CompilerFlags.ASYNC_GENERATOR), + (CompilerFlags.ASYNC_GENERATOR, CompilerFlags.ASYNC_GENERATOR), + (CompilerFlags.ITERABLE_COROUTINE, CompilerFlags.ITERABLE_COROUTINE), + ): + code.flags = CompilerFlags(f) + code.update_flags(is_async=is_async) + self.assertTrue(bool(code.flags & expected)) + + # Infer coroutine + code = ConcreteBytecode() + code.append(ConcreteInstr("YIELD_FROM")) + for f, expected in ( + (CompilerFlags.COROUTINE, CompilerFlags.COROUTINE), + (CompilerFlags.ASYNC_GENERATOR, CompilerFlags.COROUTINE), + (CompilerFlags.ITERABLE_COROUTINE, CompilerFlags.ITERABLE_COROUTINE), + ): + code.flags = CompilerFlags(f) + code.update_flags(is_async=is_async) + self.assertTrue(bool(code.flags & expected)) + + # Crash on ITERABLE_COROUTINE with async bytecode + code = ConcreteBytecode() + code.append(ConcreteInstr("GET_AWAITABLE")) + code.flags = CompilerFlags(CompilerFlags.ITERABLE_COROUTINE) + with self.assertRaises(ValueError): + code.update_flags(is_async=is_async) + + +if __name__ == "__main__": + unittest.main() # pragma: no cover diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py new file mode 100644 index 0000000..bc5db52 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py @@ -0,0 +1,351 @@ +import pytest +from tests_python.debugger_unittest import IS_PY36_OR_GREATER, IS_CPYTHON +from tests_python.debug_constants import TEST_CYTHON + +pytestmark = pytest.mark.skipif(not IS_PY36_OR_GREATER or not IS_CPYTHON or not TEST_CYTHON, reason="Requires CPython >= 3.6") +#!/usr/bin/env python3 +import opcode +import unittest +from _pydevd_frame_eval.vendored.bytecode import ( + UNSET, + Label, + Instr, + CellVar, + FreeVar, + BasicBlock, + SetLineno, + Compare, +) +from _pydevd_frame_eval.vendored.bytecode.tests import TestCase + + +class SetLinenoTests(TestCase): + def test_lineno(self): + lineno = SetLineno(1) + self.assertEqual(lineno.lineno, 1) + + def test_equality(self): + lineno = SetLineno(1) + self.assertNotEqual(lineno, 1) + self.assertEqual(lineno, SetLineno(1)) + self.assertNotEqual(lineno, SetLineno(2)) + + +class VariableTests(TestCase): + def test_str(self): + for cls in (CellVar, FreeVar): + var = cls("a") + self.assertEqual(str(var), "a") + + def test_repr(self): + for cls in (CellVar, FreeVar): + var = cls("_a_x_a_") + r = repr(var) + self.assertIn("_a_x_a_", r) + self.assertIn(cls.__name__, r) + + def test_eq(self): + f1 = FreeVar("a") + f2 = FreeVar("b") + c1 = CellVar("a") + c2 = CellVar("b") + + for v1, v2, eq in ( + (f1, f1, True), + (f1, f2, False), + (f1, c1, False), + (c1, c1, True), + (c1, c2, False), + ): + if eq: + self.assertEqual(v1, v2) + else: + self.assertNotEqual(v1, v2) + + +class InstrTests(TestCase): + def test_constructor(self): + # invalid line number + with self.assertRaises(TypeError): + Instr("NOP", lineno="x") + with self.assertRaises(ValueError): + Instr("NOP", lineno=0) + + # invalid name + with self.assertRaises(TypeError): + Instr(1) + with self.assertRaises(ValueError): + Instr("xxx") + + def test_repr(self): + # No arg + r = repr(Instr("NOP", lineno=10)) + self.assertIn("NOP", r) + self.assertIn("10", r) + self.assertIn("lineno", r) + + # Arg + r = repr(Instr("LOAD_FAST", "_x_", lineno=10)) + self.assertIn("LOAD_FAST", r) + self.assertIn("lineno", r) + self.assertIn("10", r) + self.assertIn("arg", r) + self.assertIn("_x_", r) + + def test_invalid_arg(self): + label = Label() + block = BasicBlock() + + # EXTENDED_ARG + self.assertRaises(ValueError, Instr, "EXTENDED_ARG", 0) + + # has_jump() + self.assertRaises(TypeError, Instr, "JUMP_ABSOLUTE", 1) + self.assertRaises(TypeError, Instr, "JUMP_ABSOLUTE", 1.0) + Instr("JUMP_ABSOLUTE", label) + Instr("JUMP_ABSOLUTE", block) + + # hasfree + self.assertRaises(TypeError, Instr, "LOAD_DEREF", "x") + Instr("LOAD_DEREF", CellVar("x")) + Instr("LOAD_DEREF", FreeVar("x")) + + # haslocal + self.assertRaises(TypeError, Instr, "LOAD_FAST", 1) + Instr("LOAD_FAST", "x") + + # hasname + self.assertRaises(TypeError, Instr, "LOAD_NAME", 1) + Instr("LOAD_NAME", "x") + + # hasconst + self.assertRaises(ValueError, Instr, "LOAD_CONST") # UNSET + self.assertRaises(ValueError, Instr, "LOAD_CONST", label) + self.assertRaises(ValueError, Instr, "LOAD_CONST", block) + Instr("LOAD_CONST", 1.0) + Instr("LOAD_CONST", object()) + + # hascompare + self.assertRaises(TypeError, Instr, "COMPARE_OP", 1) + Instr("COMPARE_OP", Compare.EQ) + + # HAVE_ARGUMENT + self.assertRaises(ValueError, Instr, "CALL_FUNCTION", -1) + self.assertRaises(TypeError, Instr, "CALL_FUNCTION", 3.0) + Instr("CALL_FUNCTION", 3) + + # test maximum argument + self.assertRaises(ValueError, Instr, "CALL_FUNCTION", 2147483647 + 1) + instr = Instr("CALL_FUNCTION", 2147483647) + self.assertEqual(instr.arg, 2147483647) + + # not HAVE_ARGUMENT + self.assertRaises(ValueError, Instr, "NOP", 0) + Instr("NOP") + + def test_require_arg(self): + i = Instr("CALL_FUNCTION", 3) + self.assertTrue(i.require_arg()) + i = Instr("NOP") + self.assertFalse(i.require_arg()) + + def test_attr(self): + instr = Instr("LOAD_CONST", 3, lineno=5) + self.assertEqual(instr.name, "LOAD_CONST") + self.assertEqual(instr.opcode, 100) + self.assertEqual(instr.arg, 3) + self.assertEqual(instr.lineno, 5) + + # invalid values/types + self.assertRaises(ValueError, setattr, instr, "lineno", 0) + self.assertRaises(TypeError, setattr, instr, "lineno", 1.0) + self.assertRaises(TypeError, setattr, instr, "name", 5) + self.assertRaises(TypeError, setattr, instr, "opcode", 1.0) + self.assertRaises(ValueError, setattr, instr, "opcode", -1) + self.assertRaises(ValueError, setattr, instr, "opcode", 255) + + # arg can take any attribute but cannot be deleted + instr.arg = -8 + instr.arg = object() + self.assertRaises(AttributeError, delattr, instr, "arg") + + # no argument + instr = Instr("ROT_TWO") + self.assertIs(instr.arg, UNSET) + + def test_modify_op(self): + instr = Instr("LOAD_NAME", "x") + load_fast = opcode.opmap["LOAD_FAST"] + instr.opcode = load_fast + self.assertEqual(instr.name, "LOAD_FAST") + self.assertEqual(instr.opcode, load_fast) + + def test_extended_arg(self): + instr = Instr("LOAD_CONST", 0x1234ABCD) + self.assertEqual(instr.arg, 0x1234ABCD) + + def test_slots(self): + instr = Instr("NOP") + with self.assertRaises(AttributeError): + instr.myattr = 1 + + def test_compare(self): + instr = Instr("LOAD_CONST", 3, lineno=7) + self.assertEqual(instr, Instr("LOAD_CONST", 3, lineno=7)) + self.assertNotEqual(instr, 1) + + # different lineno + self.assertNotEqual(instr, Instr("LOAD_CONST", 3)) + self.assertNotEqual(instr, Instr("LOAD_CONST", 3, lineno=6)) + # different op + self.assertNotEqual(instr, Instr("LOAD_FAST", "x", lineno=7)) + # different arg + self.assertNotEqual(instr, Instr("LOAD_CONST", 4, lineno=7)) + + def test_has_jump(self): + label = Label() + jump = Instr("JUMP_ABSOLUTE", label) + self.assertTrue(jump.has_jump()) + + instr = Instr("LOAD_FAST", "x") + self.assertFalse(instr.has_jump()) + + def test_is_cond_jump(self): + label = Label() + jump = Instr("POP_JUMP_IF_TRUE", label) + self.assertTrue(jump.is_cond_jump()) + + instr = Instr("LOAD_FAST", "x") + self.assertFalse(instr.is_cond_jump()) + + def test_is_uncond_jump(self): + label = Label() + jump = Instr("JUMP_ABSOLUTE", label) + self.assertTrue(jump.is_uncond_jump()) + + instr = Instr("POP_JUMP_IF_TRUE", label) + self.assertFalse(instr.is_uncond_jump()) + + def test_const_key_not_equal(self): + def check(value): + self.assertEqual(Instr("LOAD_CONST", value), Instr("LOAD_CONST", value)) + + def func(): + pass + + check(None) + check(0) + check(0.0) + check(b"bytes") + check("text") + check(Ellipsis) + check((1, 2, 3)) + check(frozenset({1, 2, 3})) + check(func.__code__) + check(object()) + + def test_const_key_equal(self): + neg_zero = -0.0 + pos_zero = +0.0 + + # int and float: 0 == 0.0 + self.assertNotEqual(Instr("LOAD_CONST", 0), Instr("LOAD_CONST", 0.0)) + + # float: -0.0 == +0.0 + self.assertNotEqual(Instr("LOAD_CONST", neg_zero), Instr("LOAD_CONST", pos_zero)) + + # complex + self.assertNotEqual( + Instr("LOAD_CONST", complex(neg_zero, 1.0)), + Instr("LOAD_CONST", complex(pos_zero, 1.0)), + ) + self.assertNotEqual( + Instr("LOAD_CONST", complex(1.0, neg_zero)), + Instr("LOAD_CONST", complex(1.0, pos_zero)), + ) + + # tuple + self.assertNotEqual(Instr("LOAD_CONST", (0,)), Instr("LOAD_CONST", (0.0,))) + nested_tuple1 = (0,) + nested_tuple1 = (nested_tuple1,) + nested_tuple2 = (0.0,) + nested_tuple2 = (nested_tuple2,) + self.assertNotEqual(Instr("LOAD_CONST", nested_tuple1), Instr("LOAD_CONST", nested_tuple2)) + + # frozenset + self.assertNotEqual(Instr("LOAD_CONST", frozenset({0})), Instr("LOAD_CONST", frozenset({0.0}))) + + def test_stack_effects(self): + # Verify all opcodes are handled and that "jump=None" really returns + # the max of the other cases. + from _pydevd_frame_eval.vendored.bytecode.concrete import ConcreteInstr + + def check(instr): + jump = instr.stack_effect(jump=True) + no_jump = instr.stack_effect(jump=False) + max_effect = instr.stack_effect(jump=None) + self.assertEqual(instr.stack_effect(), max_effect) + self.assertEqual(max_effect, max(jump, no_jump)) + + if not instr.has_jump(): + self.assertEqual(jump, no_jump) + + for name, op in opcode.opmap.items(): + with self.subTest(name): + # Use ConcreteInstr instead of Instr because it doesn't care + # what kind of argument it is constructed with. + if op < opcode.HAVE_ARGUMENT: + check(ConcreteInstr(name)) + else: + for arg in range(256): + check(ConcreteInstr(name, arg)) + + # LOAD_CONST uses a concrete python object as its oparg, however, in + # dis.stack_effect(opcode.opmap['LOAD_CONST'], oparg), + # oparg should be the index of that python object in the constants. + # + # Fortunately, for an instruction whose oparg isn't equivalent to its + # form in binary files(pyc format), the stack effect is a + # constant which does not depend on its oparg. + # + # The second argument of dis.stack_effect cannot be + # more than 2**31 - 1. If stack effect of an instruction is + # independent of its oparg, we pass 0 as the second argument + # of dis.stack_effect. + # (As a result we can calculate stack_effect for + # any LOAD_CONST instructions, even for large integers) + + for arg in 2**31, 2**32, 2**63, 2**64, -1: + self.assertEqual(Instr("LOAD_CONST", arg).stack_effect(), 1) + + def test_code_object_containing_mutable_data(self): + from _pydevd_frame_eval.vendored.bytecode import Bytecode, Instr + from types import CodeType + + def f(): + def g(): + return "value" + + return g + + f_code = Bytecode.from_code(f.__code__) + instr_load_code = None + mutable_datum = [4, 2] + + for each in f_code: + if isinstance(each, Instr) and each.name == "LOAD_CONST" and isinstance(each.arg, CodeType): + instr_load_code = each + break + + self.assertIsNotNone(instr_load_code) + + g_code = Bytecode.from_code(instr_load_code.arg) + g_code[0].arg = mutable_datum + instr_load_code.arg = g_code.to_code() + f.__code__ = f_code.to_code() + + self.assertIs(f()(), mutable_datum) + + +if __name__ == "__main__": + unittest.main() # pragma: no cover diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py new file mode 100644 index 0000000..6a700e9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py @@ -0,0 +1,258 @@ +import pytest +from tests_python.debugger_unittest import IS_PY36_OR_GREATER, IS_CPYTHON +from tests_python.debug_constants import TEST_CYTHON + +pytestmark = pytest.mark.skipif(not IS_PY36_OR_GREATER or not IS_CPYTHON or not TEST_CYTHON, reason="Requires CPython >= 3.6") +#!/usr/bin/env python3 +import contextlib +import io +import sys +import textwrap +import unittest + +from _pydevd_frame_eval.vendored import bytecode +from _pydevd_frame_eval.vendored.bytecode import Label, Instr, Bytecode, BasicBlock, ControlFlowGraph +from _pydevd_frame_eval.vendored.bytecode.concrete import OFFSET_AS_INSTRUCTION +from _pydevd_frame_eval.vendored.bytecode.tests import disassemble + + +class DumpCodeTests(unittest.TestCase): + maxDiff = 80 * 100 + + def check_dump_bytecode(self, code, expected, lineno=None): + with contextlib.redirect_stdout(io.StringIO()) as stderr: + if lineno is not None: + bytecode.dump_bytecode(code, lineno=True) + else: + bytecode.dump_bytecode(code) + output = stderr.getvalue() + + self.assertEqual(output, expected) + + def test_bytecode(self): + source = """ + def func(test): + if test == 1: + return 1 + elif test == 2: + return 2 + return 3 + """ + code = disassemble(source, function=True) + + # without line numbers + enum_repr = "" + expected = f""" + LOAD_FAST 'test' + LOAD_CONST 1 + COMPARE_OP {enum_repr} + POP_JUMP_IF_FALSE + LOAD_CONST 1 + RETURN_VALUE + +label_instr6: + LOAD_FAST 'test' + LOAD_CONST 2 + COMPARE_OP {enum_repr} + POP_JUMP_IF_FALSE + LOAD_CONST 2 + RETURN_VALUE + +label_instr13: + LOAD_CONST 3 + RETURN_VALUE + + """[1:].rstrip(" ") + self.check_dump_bytecode(code, expected) + + # with line numbers + expected = f""" + L. 2 0: LOAD_FAST 'test' + 1: LOAD_CONST 1 + 2: COMPARE_OP {enum_repr} + 3: POP_JUMP_IF_FALSE + L. 3 4: LOAD_CONST 1 + 5: RETURN_VALUE + +label_instr6: + L. 4 7: LOAD_FAST 'test' + 8: LOAD_CONST 2 + 9: COMPARE_OP {enum_repr} + 10: POP_JUMP_IF_FALSE + L. 5 11: LOAD_CONST 2 + 12: RETURN_VALUE + +label_instr13: + L. 6 14: LOAD_CONST 3 + 15: RETURN_VALUE + + """[1:].rstrip(" ") + self.check_dump_bytecode(code, expected, lineno=True) + + def test_bytecode_broken_label(self): + label = Label() + code = Bytecode([Instr("JUMP_ABSOLUTE", label)]) + + expected = " JUMP_ABSOLUTE \n\n" + self.check_dump_bytecode(code, expected) + + def test_blocks_broken_jump(self): + block = BasicBlock() + code = ControlFlowGraph() + code[0].append(Instr("JUMP_ABSOLUTE", block)) + + expected = textwrap.dedent( + """ + block1: + JUMP_ABSOLUTE + + """ + ).lstrip("\n") + self.check_dump_bytecode(code, expected) + + def test_bytecode_blocks(self): + source = """ + def func(test): + if test == 1: + return 1 + elif test == 2: + return 2 + return 3 + """ + code = disassemble(source, function=True) + code = ControlFlowGraph.from_bytecode(code) + + # without line numbers + enum_repr = "" + expected = textwrap.dedent( + f""" + block1: + LOAD_FAST 'test' + LOAD_CONST 1 + COMPARE_OP {enum_repr} + POP_JUMP_IF_FALSE + -> block2 + + block2: + LOAD_CONST 1 + RETURN_VALUE + + block3: + LOAD_FAST 'test' + LOAD_CONST 2 + COMPARE_OP {enum_repr} + POP_JUMP_IF_FALSE + -> block4 + + block4: + LOAD_CONST 2 + RETURN_VALUE + + block5: + LOAD_CONST 3 + RETURN_VALUE + + """ + ).lstrip() + self.check_dump_bytecode(code, expected) + + # with line numbers + expected = textwrap.dedent( + f""" + block1: + L. 2 0: LOAD_FAST 'test' + 1: LOAD_CONST 1 + 2: COMPARE_OP {enum_repr} + 3: POP_JUMP_IF_FALSE + -> block2 + + block2: + L. 3 0: LOAD_CONST 1 + 1: RETURN_VALUE + + block3: + L. 4 0: LOAD_FAST 'test' + 1: LOAD_CONST 2 + 2: COMPARE_OP {enum_repr} + 3: POP_JUMP_IF_FALSE + -> block4 + + block4: + L. 5 0: LOAD_CONST 2 + 1: RETURN_VALUE + + block5: + L. 6 0: LOAD_CONST 3 + 1: RETURN_VALUE + + """ + ).lstrip() + self.check_dump_bytecode(code, expected, lineno=True) + + def test_concrete_bytecode(self): + source = """ + def func(test): + if test == 1: + return 1 + elif test == 2: + return 2 + return 3 + """ + code = disassemble(source, function=True) + code = code.to_concrete_bytecode() + + # without line numbers + expected = f""" + 0 LOAD_FAST 0 + 2 LOAD_CONST 1 + 4 COMPARE_OP 2 + 6 POP_JUMP_IF_FALSE {6 if OFFSET_AS_INSTRUCTION else 12} + 8 LOAD_CONST 1 + 10 RETURN_VALUE + 12 LOAD_FAST 0 + 14 LOAD_CONST 2 + 16 COMPARE_OP 2 + 18 POP_JUMP_IF_FALSE {12 if OFFSET_AS_INSTRUCTION else 24} + 20 LOAD_CONST 2 + 22 RETURN_VALUE + 24 LOAD_CONST 3 + 26 RETURN_VALUE +""".lstrip("\n") + self.check_dump_bytecode(code, expected) + + # with line numbers + expected = f""" +L. 2 0: LOAD_FAST 0 + 2: LOAD_CONST 1 + 4: COMPARE_OP 2 + 6: POP_JUMP_IF_FALSE {6 if OFFSET_AS_INSTRUCTION else 12} +L. 3 8: LOAD_CONST 1 + 10: RETURN_VALUE +L. 4 12: LOAD_FAST 0 + 14: LOAD_CONST 2 + 16: COMPARE_OP 2 + 18: POP_JUMP_IF_FALSE {12 if OFFSET_AS_INSTRUCTION else 24} +L. 5 20: LOAD_CONST 2 + 22: RETURN_VALUE +L. 6 24: LOAD_CONST 3 + 26: RETURN_VALUE +""".lstrip("\n") + self.check_dump_bytecode(code, expected, lineno=True) + + def test_type_validation(self): + class T: + first_lineno = 1 + + with self.assertRaises(TypeError): + bytecode.dump_bytecode(T()) + + +class MiscTests(unittest.TestCase): + def skip_test_version(self): + import setup + + self.assertEqual(bytecode.__version__, setup.VERSION) + + +if __name__ == "__main__": + unittest.main() # pragma: no cover diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py new file mode 100644 index 0000000..4689b28 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py @@ -0,0 +1,974 @@ +import pytest +from tests_python.debugger_unittest import IS_PY36_OR_GREATER, IS_CPYTHON +from tests_python.debug_constants import TEST_CYTHON + +pytestmark = pytest.mark.skipif(not IS_PY36_OR_GREATER or not IS_CPYTHON or not TEST_CYTHON, reason="Requires CPython >= 3.6") +import sys +import unittest +from _pydevd_frame_eval.vendored.bytecode import Label, Instr, Compare, Bytecode, ControlFlowGraph +from _pydevd_frame_eval.vendored.bytecode import peephole_opt +from _pydevd_frame_eval.vendored.bytecode.tests import TestCase, dump_bytecode +from unittest import mock + + +class Tests(TestCase): + maxDiff = 80 * 100 + + def optimize_blocks(self, code): + if isinstance(code, Bytecode): + code = ControlFlowGraph.from_bytecode(code) + optimizer = peephole_opt.PeepholeOptimizer() + optimizer.optimize_cfg(code) + return code + + def check(self, code, *expected): + if isinstance(code, Bytecode): + code = ControlFlowGraph.from_bytecode(code) + optimizer = peephole_opt.PeepholeOptimizer() + optimizer.optimize_cfg(code) + code = code.to_bytecode() + + try: + self.assertEqual(code, expected) + except AssertionError: + print("Optimized code:") + dump_bytecode(code) + + print("Expected code:") + for instr in expected: + print(instr) + + raise + + def check_dont_optimize(self, code): + code = ControlFlowGraph.from_bytecode(code) + noopt = code.to_bytecode() + + optim = self.optimize_blocks(code) + optim = optim.to_bytecode() + self.assertEqual(optim, noopt) + + def test_unary_op(self): + def check_unary_op(op, value, result): + code = Bytecode([Instr("LOAD_CONST", value), Instr(op), Instr("STORE_NAME", "x")]) + self.check(code, Instr("LOAD_CONST", result), Instr("STORE_NAME", "x")) + + check_unary_op("UNARY_POSITIVE", 2, 2) + check_unary_op("UNARY_NEGATIVE", 3, -3) + check_unary_op("UNARY_INVERT", 5, -6) + + def test_binary_op(self): + def check_bin_op(left, op, right, result): + code = Bytecode( + [ + Instr("LOAD_CONST", left), + Instr("LOAD_CONST", right), + Instr(op), + Instr("STORE_NAME", "x"), + ] + ) + self.check(code, Instr("LOAD_CONST", result), Instr("STORE_NAME", "x")) + + check_bin_op(10, "BINARY_ADD", 20, 30) + check_bin_op(5, "BINARY_SUBTRACT", 1, 4) + check_bin_op(5, "BINARY_MULTIPLY", 3, 15) + check_bin_op(10, "BINARY_TRUE_DIVIDE", 3, 10 / 3) + check_bin_op(10, "BINARY_FLOOR_DIVIDE", 3, 3) + check_bin_op(10, "BINARY_MODULO", 3, 1) + check_bin_op(2, "BINARY_POWER", 8, 256) + check_bin_op(1, "BINARY_LSHIFT", 3, 8) + check_bin_op(16, "BINARY_RSHIFT", 3, 2) + check_bin_op(10, "BINARY_AND", 3, 2) + check_bin_op(2, "BINARY_OR", 3, 3) + check_bin_op(2, "BINARY_XOR", 3, 1) + + def test_combined_unary_bin_ops(self): + # x = 1 + 3 + 7 + code = Bytecode( + [ + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", 3), + Instr("BINARY_ADD"), + Instr("LOAD_CONST", 7), + Instr("BINARY_ADD"), + Instr("STORE_NAME", "x"), + ] + ) + self.check(code, Instr("LOAD_CONST", 11), Instr("STORE_NAME", "x")) + + # x = ~(~(5)) + code = Bytecode( + [ + Instr("LOAD_CONST", 5), + Instr("UNARY_INVERT"), + Instr("UNARY_INVERT"), + Instr("STORE_NAME", "x"), + ] + ) + self.check(code, Instr("LOAD_CONST", 5), Instr("STORE_NAME", "x")) + + # "events = [(0, 'call'), (1, 'line'), (-(3), 'call')]" + code = Bytecode( + [ + Instr("LOAD_CONST", 0), + Instr("LOAD_CONST", "call"), + Instr("BUILD_TUPLE", 2), + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", "line"), + Instr("BUILD_TUPLE", 2), + Instr("LOAD_CONST", 3), + Instr("UNARY_NEGATIVE"), + Instr("LOAD_CONST", "call"), + Instr("BUILD_TUPLE", 2), + Instr("BUILD_LIST", 3), + Instr("STORE_NAME", "events"), + ] + ) + self.check( + code, + Instr("LOAD_CONST", (0, "call")), + Instr("LOAD_CONST", (1, "line")), + Instr("LOAD_CONST", (-3, "call")), + Instr("BUILD_LIST", 3), + Instr("STORE_NAME", "events"), + ) + + # 'x = (1,) + (0,) * 8' + code = Bytecode( + [ + Instr("LOAD_CONST", 1), + Instr("BUILD_TUPLE", 1), + Instr("LOAD_CONST", 0), + Instr("BUILD_TUPLE", 1), + Instr("LOAD_CONST", 8), + Instr("BINARY_MULTIPLY"), + Instr("BINARY_ADD"), + Instr("STORE_NAME", "x"), + ] + ) + zeros = (0,) * 8 + result = (1,) + zeros + self.check(code, Instr("LOAD_CONST", result), Instr("STORE_NAME", "x")) + + def test_max_size(self): + max_size = 3 + with mock.patch.object(peephole_opt, "MAX_SIZE", max_size): + # optimized binary operation: size <= maximum size + # + # (9,) * size + size = max_size + result = (9,) * size + code = Bytecode( + [ + Instr("LOAD_CONST", 9), + Instr("BUILD_TUPLE", 1), + Instr("LOAD_CONST", size), + Instr("BINARY_MULTIPLY"), + Instr("STORE_NAME", "x"), + ] + ) + self.check(code, Instr("LOAD_CONST", result), Instr("STORE_NAME", "x")) + + # don't optimize binary operation: size > maximum size + # + # x = (9,) * size + size = max_size + 1 + code = Bytecode( + [ + Instr("LOAD_CONST", 9), + Instr("BUILD_TUPLE", 1), + Instr("LOAD_CONST", size), + Instr("BINARY_MULTIPLY"), + Instr("STORE_NAME", "x"), + ] + ) + self.check( + code, + Instr("LOAD_CONST", (9,)), + Instr("LOAD_CONST", size), + Instr("BINARY_MULTIPLY"), + Instr("STORE_NAME", "x"), + ) + + def test_bin_op_dont_optimize(self): + # 1 / 0 + code = Bytecode( + [ + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", 0), + Instr("BINARY_TRUE_DIVIDE"), + Instr("POP_TOP"), + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + self.check_dont_optimize(code) + + # 1 // 0 + code = Bytecode( + [ + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", 0), + Instr("BINARY_FLOOR_DIVIDE"), + Instr("POP_TOP"), + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + self.check_dont_optimize(code) + + # 1 % 0 + code = Bytecode( + [ + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", 0), + Instr("BINARY_MODULO"), + Instr("POP_TOP"), + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + self.check_dont_optimize(code) + + # 1 % 1j + code = Bytecode( + [ + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", 1j), + Instr("BINARY_MODULO"), + Instr("POP_TOP"), + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + self.check_dont_optimize(code) + + def test_build_tuple(self): + # x = (1, 2, 3) + code = Bytecode( + [ + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", 2), + Instr("LOAD_CONST", 3), + Instr("BUILD_TUPLE", 3), + Instr("STORE_NAME", "x"), + ] + ) + self.check(code, Instr("LOAD_CONST", (1, 2, 3)), Instr("STORE_NAME", "x")) + + def test_build_list(self): + # test = x in [1, 2, 3] + code = Bytecode( + [ + Instr("LOAD_NAME", "x"), + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", 2), + Instr("LOAD_CONST", 3), + Instr("BUILD_LIST", 3), + Instr("COMPARE_OP", Compare.IN), + Instr("STORE_NAME", "test"), + ] + ) + + self.check( + code, + Instr("LOAD_NAME", "x"), + Instr("LOAD_CONST", (1, 2, 3)), + Instr("COMPARE_OP", Compare.IN), + Instr("STORE_NAME", "test"), + ) + + def test_build_list_unpack_seq(self): + for build_list in ("BUILD_TUPLE", "BUILD_LIST"): + # x, = [a] + code = Bytecode( + [ + Instr("LOAD_NAME", "a"), + Instr(build_list, 1), + Instr("UNPACK_SEQUENCE", 1), + Instr("STORE_NAME", "x"), + ] + ) + self.check(code, Instr("LOAD_NAME", "a"), Instr("STORE_NAME", "x")) + + # x, y = [a, b] + code = Bytecode( + [ + Instr("LOAD_NAME", "a"), + Instr("LOAD_NAME", "b"), + Instr(build_list, 2), + Instr("UNPACK_SEQUENCE", 2), + Instr("STORE_NAME", "x"), + Instr("STORE_NAME", "y"), + ] + ) + self.check( + code, + Instr("LOAD_NAME", "a"), + Instr("LOAD_NAME", "b"), + Instr("ROT_TWO"), + Instr("STORE_NAME", "x"), + Instr("STORE_NAME", "y"), + ) + + # x, y, z = [a, b, c] + code = Bytecode( + [ + Instr("LOAD_NAME", "a"), + Instr("LOAD_NAME", "b"), + Instr("LOAD_NAME", "c"), + Instr(build_list, 3), + Instr("UNPACK_SEQUENCE", 3), + Instr("STORE_NAME", "x"), + Instr("STORE_NAME", "y"), + Instr("STORE_NAME", "z"), + ] + ) + self.check( + code, + Instr("LOAD_NAME", "a"), + Instr("LOAD_NAME", "b"), + Instr("LOAD_NAME", "c"), + Instr("ROT_THREE"), + Instr("ROT_TWO"), + Instr("STORE_NAME", "x"), + Instr("STORE_NAME", "y"), + Instr("STORE_NAME", "z"), + ) + + def test_build_tuple_unpack_seq_const(self): + # x, y = (3, 4) + code = Bytecode( + [ + Instr("LOAD_CONST", 3), + Instr("LOAD_CONST", 4), + Instr("BUILD_TUPLE", 2), + Instr("UNPACK_SEQUENCE", 2), + Instr("STORE_NAME", "x"), + Instr("STORE_NAME", "y"), + ] + ) + self.check( + code, + Instr("LOAD_CONST", (3, 4)), + Instr("UNPACK_SEQUENCE", 2), + Instr("STORE_NAME", "x"), + Instr("STORE_NAME", "y"), + ) + + def test_build_list_unpack_seq_const(self): + # x, y, z = [3, 4, 5] + code = Bytecode( + [ + Instr("LOAD_CONST", 3), + Instr("LOAD_CONST", 4), + Instr("LOAD_CONST", 5), + Instr("BUILD_LIST", 3), + Instr("UNPACK_SEQUENCE", 3), + Instr("STORE_NAME", "x"), + Instr("STORE_NAME", "y"), + Instr("STORE_NAME", "z"), + ] + ) + self.check( + code, + Instr("LOAD_CONST", 5), + Instr("LOAD_CONST", 4), + Instr("LOAD_CONST", 3), + Instr("STORE_NAME", "x"), + Instr("STORE_NAME", "y"), + Instr("STORE_NAME", "z"), + ) + + def test_build_set(self): + # test = x in {1, 2, 3} + code = Bytecode( + [ + Instr("LOAD_NAME", "x"), + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", 2), + Instr("LOAD_CONST", 3), + Instr("BUILD_SET", 3), + Instr("COMPARE_OP", Compare.IN), + Instr("STORE_NAME", "test"), + ] + ) + + self.check( + code, + Instr("LOAD_NAME", "x"), + Instr("LOAD_CONST", frozenset((1, 2, 3))), + Instr("COMPARE_OP", Compare.IN), + Instr("STORE_NAME", "test"), + ) + + def test_compare_op_unary_not(self): + for op, not_op in ( + (Compare.IN, Compare.NOT_IN), # in => not in + (Compare.NOT_IN, Compare.IN), # not in => in + (Compare.IS, Compare.IS_NOT), # is => is not + (Compare.IS_NOT, Compare.IS), # is not => is + ): + code = Bytecode( + [ + Instr("LOAD_NAME", "a"), + Instr("LOAD_NAME", "b"), + Instr("COMPARE_OP", op), + Instr("UNARY_NOT"), + Instr("STORE_NAME", "x"), + ] + ) + self.check( + code, + Instr("LOAD_NAME", "a"), + Instr("LOAD_NAME", "b"), + Instr("COMPARE_OP", not_op), + Instr("STORE_NAME", "x"), + ) + + # don't optimize: + # x = not (a and b is True) + label_instr5 = Label() + code = Bytecode( + [ + Instr("LOAD_NAME", "a"), + Instr("JUMP_IF_FALSE_OR_POP", label_instr5), + Instr("LOAD_NAME", "b"), + Instr("LOAD_CONST", True), + Instr("COMPARE_OP", Compare.IS), + label_instr5, + Instr("UNARY_NOT"), + Instr("STORE_NAME", "x"), + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + self.check_dont_optimize(code) + + def test_dont_optimize(self): + # x = 3 < 5 + code = Bytecode( + [ + Instr("LOAD_CONST", 3), + Instr("LOAD_CONST", 5), + Instr("COMPARE_OP", Compare.LT), + Instr("STORE_NAME", "x"), + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + self.check_dont_optimize(code) + + # x = (10, 20, 30)[1:] + code = Bytecode( + [ + Instr("LOAD_CONST", (10, 20, 30)), + Instr("LOAD_CONST", 1), + Instr("LOAD_CONST", None), + Instr("BUILD_SLICE", 2), + Instr("BINARY_SUBSCR"), + Instr("STORE_NAME", "x"), + ] + ) + self.check_dont_optimize(code) + + def test_optimize_code_obj(self): + # Test optimize() method with a code object + # + # x = 3 + 5 => x = 8 + noopt = Bytecode( + [ + Instr("LOAD_CONST", 3), + Instr("LOAD_CONST", 5), + Instr("BINARY_ADD"), + Instr("STORE_NAME", "x"), + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + noopt = noopt.to_code() + + optimizer = peephole_opt.PeepholeOptimizer() + optim = optimizer.optimize(noopt) + + code = Bytecode.from_code(optim) + self.assertEqual( + code, + [ + Instr("LOAD_CONST", 8, lineno=1), + Instr("STORE_NAME", "x", lineno=1), + Instr("LOAD_CONST", None, lineno=1), + Instr("RETURN_VALUE", lineno=1), + ], + ) + + def test_return_value(self): + # return+return: remove second return + # + # def func(): + # return 4 + # return 5 + code = Bytecode( + [ + Instr("LOAD_CONST", 4, lineno=2), + Instr("RETURN_VALUE", lineno=2), + Instr("LOAD_CONST", 5, lineno=3), + Instr("RETURN_VALUE", lineno=3), + ] + ) + code = ControlFlowGraph.from_bytecode(code) + self.check(code, Instr("LOAD_CONST", 4, lineno=2), Instr("RETURN_VALUE", lineno=2)) + + # return+return + return+return: remove second and fourth return + # + # def func(): + # return 4 + # return 5 + # return 6 + # return 7 + code = Bytecode( + [ + Instr("LOAD_CONST", 4, lineno=2), + Instr("RETURN_VALUE", lineno=2), + Instr("LOAD_CONST", 5, lineno=3), + Instr("RETURN_VALUE", lineno=3), + Instr("LOAD_CONST", 6, lineno=4), + Instr("RETURN_VALUE", lineno=4), + Instr("LOAD_CONST", 7, lineno=5), + Instr("RETURN_VALUE", lineno=5), + ] + ) + code = ControlFlowGraph.from_bytecode(code) + self.check(code, Instr("LOAD_CONST", 4, lineno=2), Instr("RETURN_VALUE", lineno=2)) + + # return + JUMP_ABSOLUTE: remove JUMP_ABSOLUTE + # while 1: + # return 7 + if sys.version_info < (3, 8): + setup_loop = Label() + return_label = Label() + code = Bytecode( + [ + setup_loop, + Instr("SETUP_LOOP", return_label, lineno=2), + Instr("LOAD_CONST", 7, lineno=3), + Instr("RETURN_VALUE", lineno=3), + Instr("JUMP_ABSOLUTE", setup_loop, lineno=3), + Instr("POP_BLOCK", lineno=3), + return_label, + Instr("LOAD_CONST", None, lineno=3), + Instr("RETURN_VALUE", lineno=3), + ] + ) + code = ControlFlowGraph.from_bytecode(code) + + end_loop = Label() + self.check( + code, + Instr("SETUP_LOOP", end_loop, lineno=2), + Instr("LOAD_CONST", 7, lineno=3), + Instr("RETURN_VALUE", lineno=3), + end_loop, + Instr("LOAD_CONST", None, lineno=3), + Instr("RETURN_VALUE", lineno=3), + ) + else: + setup_loop = Label() + return_label = Label() + code = Bytecode( + [ + setup_loop, + Instr("LOAD_CONST", 7, lineno=3), + Instr("RETURN_VALUE", lineno=3), + Instr("JUMP_ABSOLUTE", setup_loop, lineno=3), + Instr("LOAD_CONST", None, lineno=3), + Instr("RETURN_VALUE", lineno=3), + ] + ) + code = ControlFlowGraph.from_bytecode(code) + + self.check(code, Instr("LOAD_CONST", 7, lineno=3), Instr("RETURN_VALUE", lineno=3)) + + def test_not_jump_if_false(self): + # Replace UNARY_NOT+POP_JUMP_IF_FALSE with POP_JUMP_IF_TRUE + # + # if not x: + # y = 9 + label = Label() + code = Bytecode( + [ + Instr("LOAD_NAME", "x"), + Instr("UNARY_NOT"), + Instr("POP_JUMP_IF_FALSE", label), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "y"), + label, + ] + ) + + code = self.optimize_blocks(code) + label = Label() + self.check( + code, + Instr("LOAD_NAME", "x"), + Instr("POP_JUMP_IF_TRUE", label), + Instr("LOAD_CONST", 9), + Instr("STORE_NAME", "y"), + label, + ) + + def test_unconditional_jump_to_return(self): + # def func(): + # if test: + # if test2: + # x = 10 + # else: + # x = 20 + # else: + # x = 30 + + label_instr11 = Label() + label_instr14 = Label() + label_instr7 = Label() + code = Bytecode( + [ + Instr("LOAD_GLOBAL", "test", lineno=2), + Instr("POP_JUMP_IF_FALSE", label_instr11, lineno=2), + Instr("LOAD_GLOBAL", "test2", lineno=3), + Instr("POP_JUMP_IF_FALSE", label_instr7, lineno=3), + Instr("LOAD_CONST", 10, lineno=4), + Instr("STORE_FAST", "x", lineno=4), + Instr("JUMP_ABSOLUTE", label_instr14, lineno=4), + label_instr7, + Instr("LOAD_CONST", 20, lineno=6), + Instr("STORE_FAST", "x", lineno=6), + Instr("JUMP_FORWARD", label_instr14, lineno=6), + label_instr11, + Instr("LOAD_CONST", 30, lineno=8), + Instr("STORE_FAST", "x", lineno=8), + label_instr14, + Instr("LOAD_CONST", None, lineno=8), + Instr("RETURN_VALUE", lineno=8), + ] + ) + + label1 = Label() + label3 = Label() + label4 = Label() + self.check( + code, + Instr("LOAD_GLOBAL", "test", lineno=2), + Instr("POP_JUMP_IF_FALSE", label3, lineno=2), + Instr("LOAD_GLOBAL", "test2", lineno=3), + Instr("POP_JUMP_IF_FALSE", label1, lineno=3), + Instr("LOAD_CONST", 10, lineno=4), + Instr("STORE_FAST", "x", lineno=4), + Instr("JUMP_ABSOLUTE", label4, lineno=4), + label1, + Instr("LOAD_CONST", 20, lineno=6), + Instr("STORE_FAST", "x", lineno=6), + Instr("JUMP_FORWARD", label4, lineno=6), + label3, + Instr("LOAD_CONST", 30, lineno=8), + Instr("STORE_FAST", "x", lineno=8), + label4, + Instr("LOAD_CONST", None, lineno=8), + Instr("RETURN_VALUE", lineno=8), + ) + + def test_unconditional_jumps(self): + # def func(): + # if x: + # if y: + # func() + label_instr7 = Label() + code = Bytecode( + [ + Instr("LOAD_GLOBAL", "x", lineno=2), + Instr("POP_JUMP_IF_FALSE", label_instr7, lineno=2), + Instr("LOAD_GLOBAL", "y", lineno=3), + Instr("POP_JUMP_IF_FALSE", label_instr7, lineno=3), + Instr("LOAD_GLOBAL", "func", lineno=4), + Instr("CALL_FUNCTION", 0, lineno=4), + Instr("POP_TOP", lineno=4), + label_instr7, + Instr("LOAD_CONST", None, lineno=4), + Instr("RETURN_VALUE", lineno=4), + ] + ) + + label_return = Label() + self.check( + code, + Instr("LOAD_GLOBAL", "x", lineno=2), + Instr("POP_JUMP_IF_FALSE", label_return, lineno=2), + Instr("LOAD_GLOBAL", "y", lineno=3), + Instr("POP_JUMP_IF_FALSE", label_return, lineno=3), + Instr("LOAD_GLOBAL", "func", lineno=4), + Instr("CALL_FUNCTION", 0, lineno=4), + Instr("POP_TOP", lineno=4), + label_return, + Instr("LOAD_CONST", None, lineno=4), + Instr("RETURN_VALUE", lineno=4), + ) + + def test_jump_to_return(self): + # def func(condition): + # return 'yes' if condition else 'no' + label_instr4 = Label() + label_instr6 = Label() + code = Bytecode( + [ + Instr("LOAD_FAST", "condition"), + Instr("POP_JUMP_IF_FALSE", label_instr4), + Instr("LOAD_CONST", "yes"), + Instr("JUMP_FORWARD", label_instr6), + label_instr4, + Instr("LOAD_CONST", "no"), + label_instr6, + Instr("RETURN_VALUE"), + ] + ) + + label = Label() + self.check( + code, + Instr("LOAD_FAST", "condition"), + Instr("POP_JUMP_IF_FALSE", label), + Instr("LOAD_CONST", "yes"), + Instr("RETURN_VALUE"), + label, + Instr("LOAD_CONST", "no"), + Instr("RETURN_VALUE"), + ) + + def test_jump_if_true_to_jump_if_false(self): + # Replace JUMP_IF_TRUE_OR_POP jumping to POP_JUMP_IF_FALSE + # with POP_JUMP_IF_TRUE + # + # if x or y: + # z = 1 + + label_instr3 = Label() + label_instr7 = Label() + code = Bytecode( + [ + Instr("LOAD_NAME", "x"), + Instr("JUMP_IF_TRUE_OR_POP", label_instr3), + Instr("LOAD_NAME", "y"), + label_instr3, + Instr("POP_JUMP_IF_FALSE", label_instr7), + Instr("LOAD_CONST", 1), + Instr("STORE_NAME", "z"), + label_instr7, + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ] + ) + + label_instr4 = Label() + label_instr7 = Label() + self.check( + code, + Instr("LOAD_NAME", "x"), + Instr("POP_JUMP_IF_TRUE", label_instr4), + Instr("LOAD_NAME", "y"), + Instr("POP_JUMP_IF_FALSE", label_instr7), + label_instr4, + Instr("LOAD_CONST", 1), + Instr("STORE_NAME", "z"), + label_instr7, + Instr("LOAD_CONST", None), + Instr("RETURN_VALUE"), + ) + + def test_jump_if_false_to_jump_if_false(self): + # Replace JUMP_IF_FALSE_OR_POP jumping to POP_JUMP_IF_FALSE ZmZv1 ze==Z32QP}DE`5hL)bX_@$IWth@DjV`dI|)GFRYk)-4 zF69~_M?kt?6RJKE?%nGLouz>N{%mC|U=Q|I`y-ljXjoF}UzD-aor&QQ&0VCpvl$!P zxyZV#P3M;Ym!|_Mg!#`SB}MBqWrw^1LzboGi9K_M;LW}as#K%tQ_ukYeyi8jbb4P*+Vh)NjV6X7 zP_U6+%DFim@B2C&@cIFEC^zaTlYY|buq{2V+R#Sx_GXUIt~nG!Q;?2mKa+h$rH4>@`D^0WT+I<#3wazzl0#rn=TagYkRyT zCG2o?u+`q{SExZ}t?Yz2bV@-G@^(}ZH&G3XQZ>B^E;F`dVkUgR4~s{~^q%JIC= zou@KRDj<1XpDzzhrgr=xvYlsyFx%fz`is|kDasHw-eA4-?$@`1YfDT22OqM4rJ6`s zj`4S;mr=f~2j1oU0^V3kZgT#SO1egz!eTcw}i`}7O*m+~f@hd>((6m`aYzmO&%Qrzp>^@wARAx!s`G?D$ zKcV~iqr8y`6NJs*u?zEh@lb#{+6Pm8F;kuCz(^|GzJPbqyHs&eV!*$(oX*3WQTrzX z%Z*7WN@#&OhFTckPS#$)f_`>KMCxEYFHYy$fFe@R zp!eb!x#Kya)SJaB9AF|A>te2lm9P)+3Xf#lB%d%KMq(>>eQ zX{5NPYBIT%gq>iK*DzWwxQ)#$>yQAA?uvIpcJB2IDw!!tT^d)+1LkotGSKech=1d$HaG!gd<}++DC1uRAu?{~i`MR#uX4-0{RW7=9Qr@EEBv;b4tAUDrdi3B zc^_QNq-JVn&x=6d{00yRD~~vCUQ9)vf8^XH2b@h%Mn$jZ#<+jSR8W*YLQyn>ijy_8A{qSHpXp z3dqg>7GxJArlwDXMqy{Ura-cENjv;7tE;a0z@@(_(x0MZiS!Z?N#_eDWwqzs#maJv zV~JRz-vqg(g=J^60{ohcLw#3DZ=FEI-0Qbj0;Ag)LTry?V`PL1cwI8xz^Bf);S8~b5SC$Ox|li#$$msk#G zL5+JVN7lqx@@p9pl^bhbX7)rKXmX(ao<7))zjYyV{c`Z}0w2qR_cj%GXPPoEXZ^Bs zjCI~r<)`D>Cm{jbtsY_OF(#W>bG?2VxI~-#BOl(MRl7#NDlXyIwmN#aQd}3VgMZsg zT#~mAo=A~+_Gw!8e=)dgc88%N36X}e)zt?`LBgsEo$x_^iPM4-=fgy?WZJm5=0CXc z$ojDh*AGLvAoiy6xpN#-#>fhp@^6+^D9xsKx8ke9zQiRz!N`HI*jvIP^_q#nnu+<0 z`F5_*S#U|fcj;4s&*a8J$L+BI#J}#DgJZ1&@uk@g#Iwi>p?{pL_Og2y*VYY;DL~mG z@9ULc(0t-?D{2J}faM5eMd=v9DXJKbmEu0g&3c!w7Lhtv}b zK9=als$O;JMSd@4(_8<~P{FO-Rg7m_HO14>dc2XCoBX{+8VBjuVf?b2!^Z?(Rh)w9 z3Uax(8`(Od<4g{FE)DDYak)R54PS7?Rvne?5R}ao(*Gaoq$-@HkI${xDgzd{k@bi_6hKpsZFTJh+|$!6r~VV-nYWRl zs9FAxT(T~38<@#TAvkAm* z0mXhi_10?bX7uY_PM3A*=jf2jMy|KLxMo(L{!trzXsE(_2>sijQXg&BUSUYA^;~;% z5Sm^;YtL<9);a;WG;0#mHFmBN_a;+gCLiGsB&y**LGsqHFj)yq)_Nye7X?43f8Kz6 z?Xs5B-gAe17Rj8c%^8$b0t;Al3}_`L1|^0=P)w$@_@WYL1| zJ@r7AmYlon-Bh*Nv-(b~`hTYtdTc*;$UDv4>g*j+kLOyCi@X(M0CgZ#S_JCz5vWFp zU#g-sCVwv~mV_yvo>oQ0yE&Nhbpc0C+ruNla`5+nZr@k%3s~+*!L-S*j{SZbZ#VXT zQn%#Tvwx;|A>Ce}eppoM@Ysl@u7-;J{Udv>=I@=;0AL>JB?p>)v=ji_&?xKCv6D-# zN3oQGU-@U4uGxDEqO}0u8FLm-D%y6svoGzvbkDyBX>RDZ8qOpq{JZe@EjjdP+V_w= zQVoB+E1R2+c0}1HDqBxkBY&i~H~Un#8K^Xg?pFY!_b6%p(fW0-eqEqnx9OK&W+@3# z_9R+&lW}`6=}QS$QF5^P^fX#PsfPa)#S2i!APY(LxTtKVec2)oyg_B}QoF}fR?$;G zJjIQ(!ruY*{@pm zN7MgJreVTg@`bu4&++KXf=Rjli)%tJfblOTuOzaw0~}aDeJce6fpQ?l`@Qeq90C6&r4)Qb9g(q1*p-!Eo&7=`84wj= zPQUk|*Q`$lWnA93%Y*S|zp~`jF8M=CM&0s`JlQD@mG*j%At}2_Z<>CHZn+5a)pcbZ z{D-3AyF|rxq-$E7w^@{?w8iDG)R3W&Y>&*OH%BwC6EqK?r;!L%Ds$-$t@b} z8$hoqp};*5Lm4s+cZdIjcqm7o2!VIRxET1Ow8V*HHqSI%*`0ZR z=w;$be-%pxam@DA$p3#959Okh!~wcWn)zSELwWZa^p=4i7sWBdnj35o)gEqc-svZx zjM8v%Jd}S?-^D{Y!hZeNcqmQAW&a29P_AX1wmp)MM|N#rMAVu5(mWrO>HmuVhJ7@N z3$p_tSIp#TZfS<`PzHYwwPrAYa-T$ZNL0__NRBt#wAItWB~QHJv>!brGleE}vUK^` z|D$*)^N-J)jQn^g+qQ`3YEDvfEj~$uBvR zylF2$aAqu-RW?>~3CUF{oasj-&<5yhuq8{N-Kc!M@w?mGE~Z|_Ni=S+%u|+xoTne| zUQo@|CSNA3)>vzvTG6FL{4gBp&=T*#AB?w6ydt)9eO0B&=(mG2p~~fVhxR+(w@hSu zryi2WqU6^m{zwYpuc&y<-}8#Q2H@Uz=LW=V>r}g19F!>6&~gzRd#RfE50hgaM!LU- zhtY=4-^;br_(#{qs)kJcY*qq@)1G-8MA?Rx{nz=&8tD#Z2)qk_9?J@&Z%D7vW7$oh z85|C&cH*#C;74Zika*aiXaX~3+h-&XIY};fj;)4F#dUP=XYgjkpu@S3_pln|H8y)e zV&L3(Y;uXXjI8=d;e_jt%@VT+SFVJTT2VjnRi11F zY>nJr&dtSvJcncry{o9Axd;D3H!pYap9esT163`8V!UL@nAcOm=QhCHzRzWuh~(=L86HLd7bZtq3OBpUgta2J;$dIACMOm zF{6^W9emYi_KzOt+nH~BoNqUN=yAUC_`t8m?J8<$9BdIj=h%aMr-D`R5QOy9YkZ+U zmTnwa1SHv892WGxeHo}C6y|rlZ_h!E&MA3+`LDTod_nWrCAnbSv-xva?ll}0PG94Z zOx-n9akDnme%X>JGrX;x%v|GT?peNZ$BIzpC{r|pt0=4)JPd&Nn?8-dk%0ED5w$3L zGHPn}P|@Ct{L+0Os0osyMQ;mhTc7H{e@Am4`2&HZ<(cf!s(BqXCq)mZ^=(KmmS1p7 zk2%Omt#{WExre@*UjigGRjEN#`?nWp$jF<3k{68PEKFY_UH?LQZ5MCSd~REq+=-vK zC$xI`a=n!}_HJ<1%l)1Xrn@#2RGMRgkiR&yB%ATmv-+=ND-tzqW2>CVfivgVPnxl-N`5rSo zfran^Kr8^si%m@R+3o?cY3>5p^c|J~7Msk5rvBe0x@Pv9MC-V8PM_%vZN$UhnF zhdoKhqW1Ql`6%r~-NHV5(kB2h<85}7@j$=DeM#JJ}xOop~N{(9+T^lM{Fp6CKEvUyYkA9vGNYWlcVzH&nMS;Ks@JO z&02w{*aZ}{S+f}%$5(K7AaH{ch}YT@Yb{(NGAV39_hvN6*>dtr4&kf4tIDyo5P0i% zf1<=Ia!{rN^D0p$#kSarXQ{n#|g-QB1tq z+{g7lqD$6uyr*y@ZnZLvlnGcj7ZU7(Qf@yN%5SRueV2>mGu8ff%y=N#0!Y%jzdaTR z(fRCssp63AV#OsrXtG&p`jkfhGxOJh2R=7O_?^ogYT zXY!BJ>sxwU{3(<&Ta)M{C`l4a2dCwV_X%!YS+DG(Uf&ujBTWQSKdPP->E^b&tNkWzgKe zhAxn5{>}O2?^FJp%5O-|f`38~XDGeRAuA~|CbkCl3fpq&xeel2Df&iu0?%tl9YhOq z4QRh$UQKmP`%L|_P!~);L@??IQzE&7h~^?x>G>i6<>NDV7UpS`3{on+N!4-|pnwFC zNoI4vlL_6C1`c=!^I*nQs>qQ z2$j)B%$y5*L2Y&Emm*_n6W_MMOI>4Y&o&7&m=XqEgm$g&-FivbCEPc8DxZJ&&p}_3 zG!&9cZJDoq@)jvffkJXIOcXApiUr-7Xc3w1Q7kmxuM1>+3P zp;0h~&}FEQbQ9YK&bpbXN7D;g2w(rR)@$i#i_`+NQEksY!0-fIp+GZQpZT~)8v)6U zzS_PG@Xp*(h%ntT1ji1ll6MGq(kymH(iAVQivQYP+tB@4`kMhjF3{E)=?a$M{5aRa zUU?)%Fk(Htgw9)P7QWx5!$@`xv#av#$DK%YTV;>okIH8Daps)`A0c2~vXRyv$CBdx z@Vozk{dgMKh#CTavI@-;M5D&Qjy`O&`ji{<=ol zS$*`Rk4fGH*SVAD*KClJp?lDQ!^ws!z0B43UL5Y^p^HS+!5b9TSI-AiKOof9iPX<- zLRD#T){xdEqD$tjOV{%Snc~0Eo%4)x@0A11AF>=)>+X*ubCOz}Myk)IRPZ-sE=8OY z98d8LSw0&wkv~(nJRgAey7Zk$OK9^F7&=-|3B_U_P2!nKlczbxa3ZvUZJ2R~E%ytN z>`rpxTs)r-xe;wC=$_%j*3pLaciC#;%SzYrhk46_Q!(9-;x z_MB#zJv4Fo7gHFvhB90wXG(F95ExA=<4RUF>F?ZRl}s%9PesQX*LQ{`0&6Wc+8uBz zj$Qi{CCpO0R6aR+8YQ)9Ilp8(9LF}EZm=CZw{fwV*94M zZFV?yq$Sl&{F3(sd(UUEX5Ty=*GTM}xp=2$C*4&56xm5fOU@_vqrBQ!zN`4c-XJ_x zaA)?%&&q*2S|?_Lo9l4)g5+@Nqt_l_cO}lM8ovB@uHNoJJ*>Oj2iRRTM#pwOOddkv z)o4N=z0gyw5388kDVC~|7xcvMW3em$t@)Vgb><61{tQs8E2psG!+lUrwoAQUP>^_| zD|IG*PeaSVfCzsbjLSx}j_X`l#|ENsS#ky#g}f^$i~OHfXf`6S zGG$LRIxq(dgan#NVjypu9pLt=>hCVCc7^?Q#BW>u;j?xL{fXJv0s>guL#+*}9m5~2 zWP0w#?3(K*2JM4q#aFb7;b&E`Ni6i)F&NCv{1r3+cExi3`1vj*UWmRx-A}f#;$_BH zD^{4C{Jp)033VK9)Z2BEE>$^uSVN{uzlbKNERe4-K`Ql#FBS`5;tGL^-ZQrFXkd! z)DAYYnmvs!nkEU)qW_cion#7X-qBbO| zFeh4oF#pRrsRIuoihfIlr27o1Wp-Iz^Jy3I?Gec|W5F{FuC1%$nS=WihO{pI?y$`M zqvM&wcRNE|9v|slGPO&GBafT-J(RA2oK6LZCG`uOQgAg^kel4{&okKz(Z<_$sHN01 zpQFK;%|hNLx@!9SVhX!VQV7zM@DR8x-r=1w{$^ZNAGdc5$& zH%%4X6?Ifbiwvez#Gk+~bvNvG_^;%>&aIF+B`<2R5h0^Q(3y^wf$cIO3|u}-OL?I& zOZq})hb_)UYtH1|qzAl4A|jdXY_29ZA$!8(&TB?@<+SYZDAwq>1kTn~78xNp?;DDK zxptXzT^M!Ti#BpAI?G zOglX14!2SpkW-(j;xV*$Nlb5}g4nIZf1?e-NA2f!C#haiWZbmgbQUDh(&NjQ!)ZLD z6VqG4x(dV8k;;5B?VoY(O+21zP0^@qBl8+R(%+8R%i)*c5ZBRI!@#*5b0P>Xq0jn( zbL_0_0#=DY46~Ga+x}6jurtdai+0R;*>O~L=VhDPFFP;OyWD1$s8@I_ETWLB&b8ti z2vPyHWAlPVK#u+rLf-+I0;$yx{4|#QNgp9mq`pH353s~(JSU=)xl15Cd0XwPR#A-n zF4#3DNudn2ODUDohs7-Z@2vu}bLrMx$*7yTY@53E=K8zhpl$mGb|S`;FVzM-`C7Oi zSm#Y6&Hp<5UgS;H_dNIg-|6`mW;BOy==r=eOVP9FSoFLne{=Ng_WA#Xo|~xh-|6`% zN;!J2XG(JP{Fo_&c4{Bc^U16yj-Go!*?IJ=cNiT#SMw{R=ck#096f&{0?N^IS5<+Q zM;R?&BNEb76R9So<@u*eMAaPnB1?NqkFEG~M#o4tT{>SR-E(WL0p@IT49pWhDtm@# z`DkB3n4O$~j_1*k=(tOA#<;N|4WCv>!^iHEqhZAnfrf9Pnxo<2_A5B4m!S>%O>KZU z(nyPFww%R51KEg1j9){#jj7d$ZhJt*g>;LXvC7k=890N5gYzRWqL*{r%Ia2+So2;8 z&Ts{ZrK1=iIh>>Dwg|8b>{(k9Agvk zqZ1q6Rh0BTgT!s3K7|(Q=FVkM>-@FA?!6f1v`Xt>8~xsoa%~K>&eSewS&?!Oe`YDz zi?@BDZS->3^Hk2OdtCQYu&!huU=~?ihQEO!=dm8FEH^n*zenX zNuk;PN<$FYSqum$$q!t`Zf`VCP!c)0E~sct)5#UH~WZ-*is z{IB^Zhi@m!E))_Z%KRk=Ciev6$KgTt-OezP)33dYtUsyS+79@~B8p^{!Xj4T9c_91 z@(0pU5MH*z8yY2dv1E%{iz=+StPb*Mj!%C+&1KIAmHq*sFFQuRYE2UWk5M3xv5|kk ztFOUK>~7E7-~0p8*Wu=+iuUh}77ehYX@JX^RsRRNRXn+H z7vWtuK-gxBWBVO9)V^FbF!>6BlzZn=0t}SftuZ%G@wU!1nMW~d+d9+6Gj#`@_>b~W zXrIpOZ(Hjx!s^a+bt>=WVhDfV&H(a?uHIXqMMb}(Xuekhk7<78@5bPZW>TRy^ICbt zT44u~*VKD7Wn;U6OdH!$WKv$G2|*>WV&R0t&6Qt9O>KC_TYQdO4N1$fl9r;6@!mld z?Y2Dr)}`Rz$4(N$*-+(5ZyRHbuuB+v99w8I*tB@tt?6XTbg-9ld%XeL?xudnoX4Lz z-X`Y#__O9?1ypV)^s9RP63raN1`BviVQB^bW)&m;!3$l`^M4$wpqM%tXsNA34;30X zVZ%;ALkTtH-Lf9~F0J9!Sx=Lg@=$FE&+N_YsGDqhpO-q?t)Ir&?!BiAYv*XZ<}Xq`yJg-&hEg?>L#*c z?=cB!h1I4T|KHHxA5M!ubAn2{S(ovrqiJGhfL)EWbITD1ScNOHxr-*vyQaSr0ZuY$ za?Ewj+sx=N?r#AGz7N3g-}bj3i})3P=8{~kvuvcS1rWh@)-N;oTmX~tjkiGn4r~qfTgWTo2BXsg z`Uq*_k+Og${=%{tfP9~I{wYekevUBvaM zcv~k15r5_fRo>a86Qwc%?Mk~yUWtHZ1;`caL@}dhSZTBsIZIrYX=)N5sLC<=POl7H zcStzM3g`vs-YbunUFw}!>KaNrzHpB&V$*G~V$L}Hyc#p(a9Y12~8xNH~K#U_A`3hte$5q)4;!3=F!G(&40 zg4}Vdrfh{029Cm9*u*c6hJr`pn3d;Tf|=}ZQ88xa!b`&$X}p-(n0~BggHtM*>d*eY zn~fJK%WO2BF0YDFFuTn3!AzV1lW5>|ax+WeaS3^@^uB@reGbi8b8CiVr2))pONhrfey0Y}9=98HdB2Gzo_(i(~lC9(o7O`TJ0FQhX$jaIfQvs=KHp zmqwQCQ!6xGm{&x4vX=1G%f95d|Gg!@Wqx*Dn2frKKX)8=q0Ase?@{@3Z+0IC(6yJ? zWSzw(d{Cb$f{NKt;GmuxXmA5xi>0=s1ei3x2r!5a1#ag@EvrNsZr)mG_#@VXTbG-+^MbALDZ0YrBaXY937ii~J>LCy31G z{Xsm!#bn{dode_Dy_m`HRxvFmWA>(z?B4*#Kiir^kMfm` zFJrxWwuV#o(^2$hqk0q~FtGih)=HD$mHRfrS87a!H1d`nueVYU0{Y|+P8~lEP_q9} z=d1XY=ieH>Z+p5>6TEMG8^2xf@i(CF&_{s~f51=}1O5F=u{vOX2kN|cv2@Z>7z6!i z;Kvk0dR`3lD}~7*%-g>i1-J54u72PzvE+2V9SFk>gqeoI4*(&Lit5s*vxdK7E-ZMj zyuGVd*6vjl<;*9RB#0$)0q>a57>;PT0y+$wa?W<_Ow6{EwBxJ>n&n3Z(Z65h16%s$ z1<}8s{A)N*-c|r*thfv2GvL1SNLg#U1#Ulhl%9!4KEv3a?ucs3`#rT%e>K(kh#)bB(am{vDMM{NM-!aJ^vy))pRXm^xLw$2( zl6&;lTKpNZi(15-woey#U@}7oCQ-oqyp#8a^hNFBs+--WbS$;*3>&s$a`GR)&Fy#D zkb2X0f%MOV7|q^Yb8(X)XS<7p92e?zDNqK2RE|9XZp_8bkmJ=@0Y@4qP@o7YBcRHj z8%-=gid?2fR0>DtXw#5B!399CPeVYTG3yZlftH;Ev{=0P*X5(7sG^R1V$Hf85Rwq< z8Y5w*13tz-qPypH)Xi66Ue468U{c-Wn31o*PxRwOP zKZgp4e||SDa(~6%pB;rph)O~HbJbD&^RGLZ{pgQm_!7#Y-JYG9NBw}?QrDC3?OpBA znk5K~2-f>4p?3I87MDRFN1LZL)PuggYw?&?V3>X?N)p!A@2ov43VU@Rnf`!()qPQGe2UJj0@B=Z761 z0cd#eTG;WvBN4gDKa%1%7{o(0Pnf{2i#kIxPIeUBp>a2P{{A)8b|yr$Ep12Zm9&vE z=E@&!A9KC$cSK&!cl6$n_Tz20(k||TZX8bT2H^xdHg2dL>TPy1d2!3~8$;j3$7w@y zX!&B-PWDjRuz28LV9Dbm|Jn|W9meuJG=BeQ$4`9I6RZ<&8)c)B60`iWr1T^ddlRracy0}dWbTjP-D?`pn`gl#^)}YV97dRk|p#S)@ zxRZd*XKBKJ9k2{00Ge+ADbtrs@W!$#Nh6c9Www^gek&}*x4#95RP%}z@4!)8q|g$> z|Lidven-Lf#rKR|&cD`xtNtF1BPlCz-TBLA_O8nu;+$V7LPfkK2Ik_NO9dv*`78FC zOL90R;9qw=F1=}$w+NF>!6UP~TN^wwn~QV40Y-q5an2X9*HXl+FwXgld_yV;HGE~z zuu%UP>A9z9+xSAV`!x*7aLFnPE`=SxgEp5(ps)V%&#bBcAK$NEK0>Qb?tc9ReCO`h zr|$f}d%wO$y|wf_mPbDk+E4N4P*kgF{obQ>+3T8=U7#qii;(GloHc&z&igqNY2{ve&W3Ee{;Y7jp2;^|7Z8>H?NZL zlG=^VnVJ!g-8hR^f|Z z#xprsic{YmEUh_MzwB`I0eX<*RPs*!z}m^aMS!LEsq!j!aA2Yg8LazM#dU+KaPOtJ z67-;Faz6>B)RK#L&}Oij)DGSrjMG+cyI)@oLH_#v`V+~8ig$h(YQ?pO-?h!SV0yb^ z>-pc^uOC1YQk%Br3K9aO`Bt@-!3)|ShIk6}8V%KjBRHcnZ!+@l*UxMa&((BRb1gkr zKNPap>7XThf(BEs1+C?{;5OkWgR$Fx<9~z{O0-*I&lrPs=ZlZ*A2e=$wKvrV!s_IN(b2yFIv;dzWwynDCN5XOvQ zvA`eJyhnH+pf-Rw7P$c&jiZ^rm1f)l=!M$!PzgmFO&X}_o(P5I8VQp zW3vJWv+=?E0FPU}oLkuhR1fK8>@nEDj+K>eyiNIRxhoaX%I0!a0BSdmOz(T^#oPG( zq@L#01m)Pk^u7TRm@PbZUJ&pfSgK1p#;mf8l2MyKBa8jhLwEx)+I45-?Vq08)>c;o z_F#Yw_D?b~uyY^dRK}W3Jltx|K6TFKN;0e%-0lqJ8l-q`l)-F6Sk`F`K$Rq^kAbxlo zf-|wye9+3@1`$^ni1@pUBsAfxCT%}XpGJ*4xhzNpB z{AZNO46atSgJ|0uwkoes_-gef=1+Tx4rH*EU`aVb{-1`s96>%zA?N4Ft8}yLg*hlc zmOPX6U}G!;RR7uWB#dPHxxrEz%7MOvl%$vRa=E4&D8wkOd$-A9i-tbc=x>P&fY?7jK^{VX>JZS z29>QB0r6}iqKi2F3y|ahewZ0WSpCuj5rZ()0$lT%v>_l*fR+Ow^H}+7N}5uf2}_b?a*OblSqwGK|+XB9b{T)Gprh&i^`iI)IOl!3X62! z$Ra0BsK|K&Rm75iQG3o%F|q?Wfc`n&b0cA=zZ+Fc2FP==xZ)G!YU6@SWz=F_nik)* z43ky47NIR#JOOqLMBk=WVP|!y!|3Lg#oN1enax4~>(ZOWk}Z~D;odjNWo&|nux0Qz za9w8OT*k(+C(^QMMje{F`g31Zu12MpR4fVW`@26RuXkOS#cX0(dtq z5BNpLahz1%l=y@t$b_`&4)W6B2dZ7(yS_~)^o5gxryH<#9?B{a=B znZjl|efh;8eY~VprT-|~DV0|nkC5e`Xqq+Oyw8gv>Q>TZi1KNlf~3FdHLDzw+kJCx zQ7-{Nm~uNNJHu)yiD8uMz|4XzM0(P)qVj)eU;YFeb(5IR{MHKEU%!3%1M|x-Qu~0S z{p4l>USF9_tNdC@O+q12eqWn|ycu{rDB3qbzD)yD<2RU&r!`yk@a#l)QayUWAbM#~ zjpggRpr=L4G^YFTHP$dtqopbu96x118Xv$fjP^*!V z>4bK=>6NVwVgbGI;GYNU1^PdB<{3Si#~(Qzvw3Cy_1&4XQTtx$-LCHq`PRr28u?(2 ze1K@SFaNJLMbf*NV#0DlI2bG(43N0)%l}!QK#Sd8`t3Gq{%adYGggj!)C>R+|4N{M zRu)bEU+#Ugse^*Pl?fEg37P!A+`qso;{o|w<9IY^;n&Bp3C-jQs1kC=?}{D4l-AaB zg!S_!9>N9078x0fN>nsEmP$%s!-Mpp8l)Kq$jnRl( zYR`I*?F|Dr1>Ad5b}!C_#^_v#E>_x22yf9xX1Hx0gDUBcSdQI+YH1cu=r_5)sr6>m65h3g>p=|4RF_Z^`L>;FcLwr z-1U#lR)`(U10=mem=AZ8ifc^hntG1I>6*#$+QDUNm&!HK*m&#r3pGddXwJ_*WG(UAeCVgypWu%7VOInvc+)iM0L0HQH| z!>jYk3{#=L!7B|XR^tT97JOcqPLhT4t{zues&ifPv(!r zx++wez~dKF+I*%F`eC9{{N+>tC?H91!vGuA!9dGn$*b+|UaCphbbb54T@tpgK#tn}J+UJBc55xrsH~OTlWkdTTlksc^f|zf(ew zFbq6)4EMu~x@!BMC`y&5Bg;=;@9cL(u6p={RY&*IG+<`wahi}*$D%ANZhnQIzmXGB zQHAlbn}>a#8MeqDGZPsM!1&JcvSnpJ(`sbrWK|RMlgNyyPVCIlX`mrPRW}Ay zg;dk1psE`k0Re%DxN@b4v|5IjX`|9NqPv#_wDz>%$N zFSaFGwD+%=mTGO{X7l+Qi~d2O{x5(H7=I<6aQS*DUCxJ+ga^bzy%haW#z`hrdv6jV z$3|wtD-?8^0A^Nv&s+_TC3h8=gUWW?+m^ZrLGGB~wY>s8AeQ<8v1n$%Rs1N~;WypI zigaxqI#xutS1--I=>=oR=>nI{SP5`X;gP>w?EqYWG;ocD0QNeBKtWs*k?YvO^-(u9hR!Bj;Do8> zLK3e!rd_@35_(-Co9H#|WinwW=O4!Y2_ww3f*P;RCoR1$3)f)@w%79rTnlPOq} zii?a;kx0XmP-$1BvS3@G^0sJs6JJZ|c(z*ec_F`=QnkZ4D)zycE77vPGZ@ zX-x^IC|^V@FzFD;vGWm=#hU10wpZztTW1g#H%s1y6X>Kw>OJk&>AKwi0i282AJ%sJ zPhHpm-miH{=-09OwXc4SlgJO-@c#gVM8aSj@*V5$NK-bR?6Xj?-$oq+-m#*u%Q5X| zcV+w8T`g`XAyN8EqNLypLE_ek)Aa;Mx`YV(ie{r?PK4D`)^2aGj(cM|voIkN&^8qB zfM2ZbNOF5aMhfBq6!3>4^&&{twH~)W0Lb0T{|XikEIq}`kTW=yQ{Cn%m@(6)Y2O)} z_5~G&{-E&)($+K7#m(yC8WY}H*V;Nc3|IRz4Dm{v8l}AwrQH~%eLz|c?r0Hh{e623 z?$l0jwQi$Q$pSo|6i#j71h#J4zUbRLT_J)xSN`eRe_d-4s&SHT*7jJ=7PzZCH3=h1 zOOJ)zX&0|lBx1u}z^kp_9-_=Pfabuy_9iI%Q3tPj$i~ z!ON<{c0#D?LlZ`aw#2epZf0w03H|(Uma(6!XMWpe9e!jntQ}wXw&t!p*Ah||?@|pZ zy|7d+JEp_Mj-_+Q5E%T|a=HHXJ?$F!BByfihed&EV=%A=G(V({GliV~W0}%IqIUFr zvN$(nrUJ3tS{tEnJCmn18<>BOsaMC)X)>!$`4#FWybr_PLWGg2Sr(M7mdq>nMirH1 z@Fue98F^OLuMhJI*SdAd!j=rP0UXdvV6u?0tnEokhPCPt3thryJJT^bckCuLe@srU zp+9e64bZ-M1KIQTW6fW>Wq3yu#EG3}N?wmgI=>|89Exmj!aGjzqNqwU>V9;9BBwV- zU=|r3o)&h=bPFdho0mgta}DJ-$U@`YEx}wsOz=J+xIL|1Gz69=wPZ^w>)2zQLMsB5 zfYg7AO4ZC?Z^1&h%j#P&18Hlz1pT5NGhtdm!o~}p=DU=cCO= z`0K`UZ~ia8nDj)ME-;k){q1^PKAa-y)`f!e8g)L(I`2}|`uPyyk?D1sRGZzF;S{;W}j z=MVnvTD#!Z>QJV(eym|!t6_ZeX+h2Dg*BVQl`OOjcz?43a7bSJ*B7^sov8Ki>Oy|W zA`zQ3|F85_IQNFrzqK#<6MCP`ed}aRI~-X)O>aN@Lj`W;;$HOxncy&=J?e9)@x&og z)XBiEwt1cnO{cIZtU6cTs4<30HoXi&K{L-t`ww)jqV1g~v%-7iCn20)f@8c@GaNeB zP2+>9J)yQ>v{p-NJVHTaB&5r=Ok-T)C4#6T4kXc_f0Jbv>}wXN-HC%*&Dy;I}K68Pm_kN2FcFK7FBN~!)D zH8X|l^9gip`iL61njUk@fY5^-13L3Zu?LSzooaBAx4gM-;#wr;*Xq8aRjso?ZE<7G99)j{onwC5kS7J4F1RDdKZyl zMB)#S@+G0{ofM`0$rQ3YUKFo9BJjj3{>h7lIJN+))hDVoiCQH%=kciC{3Yrt*qdLX&|q;qB2au- zZA0OgHY)>Yaj?de5In;L*(m>HZSvI>^D|1nUF857jD{@l<28;sa)Q3X>iA`h#?9W= z)HMm&+B3qtOzVju zmHIz@q9K8spoyr-*2~qEiNb|eM%?z#586>j>!)hVB>clFSBMht4eoXqE+hdq-ZI98 z{%o6q=Y==bis}=LSKFoWB1&xiL4DbxIE228e6ezCGMPv-HIv7kfV9vtT|N_gxE)qLs1n*Mv-F6%kc0=LO;CkzEw}X@7bPB zduFsbpZ%^$ISm*Q>jo}rTu&=U>L0914cLQl-dr+{b4Lp;x8vw|_|!jD!k1%-@mymghXlF)S{ zl<^Y}kRgPqqq%WDL}7dWLFb{P%)ze4hNzejMQY%g+K4c73C%_{U~_ew(N(r)6Bso= z;|j-SJHHpjx>PU3IA~Na_`mN*FT{GByRD|VwuwIt13$vJsuyD{R3!(jAH`DL=o6<+ zuQ;l5FP$@nR5T1P##AjJV2$cqk4vT^Uakw8k!?10QSO|!heko@QBJbgRS*u%yGx`k zX(jBXZUZhwzD#~*?bZB6N;lKr%lml*+kvpl5ZU7?9(ZTIOT*s1a|#N%YjjHkjGD0I zY_aBPyhw}v9WOG96JHa6(!4W46yBLTksf$wlI7h*d@U;!==urs&fKU%gEIUVcxN_p zaaP`$T^V05w@bp=z{=Hj2MCFl%4kkQ$IMZA!yH!a9oi;MLj_YagecpKjfy3gh{`iH z{cSMeeKs8Vx*IT{OszwA2k`$K#l20g{5q8-u0#vG!cJZbnd&$@NEX|P3S-SD>N|8R z7|Dk+YV`fS9wbJ2k z>LH^I4%iU{Afk~bGh+e1QK#(42EOb^rThoVGaIJoGq~V*og;UOl}M{>mlk=JCgfQf z0v8D`gR=M*^98{Pd^j0j>raIe6 z$4{Bsr&tZVfAij72396y!J=i$A6g52YNd_m9a|As2*&_XNt&G@rQgw~5N7GU!XH3|irACl_#GDbxn6{y zYgY+i{Bu~7*LfR$sTF&cpTMcg`7wGweId<$J$$8gbd3%Az0Sc@e+!Yy8> z*2*BvZehiK)~qCqb99d2Nysx?aU0bs0@*_J7S`2!jQDgcmgzTF_zrtF3wzryy#QU5{x3h#m_e_DQhq>u57cW9LVWMRJbU+(Q0 z;Y8c)e?04)}>m9`sbM2NhHK$bZ+ z#G3Eqr)dRRoGdW&F7jz{i&>#4xXPSeB!o-lZclE>c+S7K47)85S<&m#oR|Gubkfq} zoC&&8{+|5fYtNs^t-Q%-ORV9NA@5+j^nDpH1)hHj$F$yFa2~6KTvb~ zNu9$Hb9M`Gr11v}kuAHnIu{PeE)TWzSn+3ERUZ{XTWY_$0y7LXO_X{Y07(>yjXk=# zst))1Kki&rcc+eXRsGM8i00tB5st6UMfC@MQtt?=4tg7u)npFxWE3NhcLjik7gY)it2_e7eEd#P(#a9C?NHFF%sN?f{^v`#iA zeJWtmUqkho5Vp5WvJBURw=h*k6J*vq^RyVw{I%ZvKWPpC{GrAwHIM0V9qzdQ3FpUf zu2a{t46xi%6VWR{PS$mB$c5PgSqwJ*0F+TE3HtREWgI>5U%_z*g*K#$i0Jd z#&-S_e6>ChHDKW$S_j$pe`t^)7LcvYc0{sjx*C7#_2}D(N3_(JAx0>QfNT$$zcDmy zGx|9pOKnDbf*2i^ZXgl*CP4Vp0-GWT)~vODM`F}?ymdy&x%1_l?S_3VO=}Ip6vsx) zkDK2Pzr44hB4N_>GPK-6nX|f^>&9@DlMax2FN--F&OvJ>JRHFj4L067D}OS49BafX zUPqwun{+I4fNs3vvg;~^*cHaKwBIQg?pT45Px!w+sIV!x?`TRMg&8 z=0FvRM7pg)#jWffkrWkjj-Z)xV@)|In}J^y^7} zacaZPQe+}M;RPmAhjt?>c!?OrzHjFD?gy_RnDxP4rRkSitu>7YbkhB}HE5?fhe2&@ z!beYs+&lP9v}3>rxIDHH1M@|G#|gIg;2q;9=*Hhpr*BL-g~`9cjQHTO^sqViAs+@B z7Hd}mCk7qlSapHR{o`k~QDvbtRBEfE2y=BgCk9i$KGZ}3pKT}eWy99SzIIL`y|Q&a z_>Q-}Dr7Ub3jc9C;zht^w?TUNw}&Lp+kASBi; z|9Vb2ycG~RTy+zz`}c~r#HT@PZyMYSqA|XPeDofmB{fpvw}KMyHa`7TM#`^xldKmg z$DeQL3e7Vy^CTROjq>-}x|i#p;fc)o_Ji%RS!m8@%iLI1=^tsXM>!dDU@)diH>Qwz zZHRttu)^d7N#eJPuYjNOc`n3P(00f>uI-PVklAX3$dy0>tEJ{Y=Z9198e+yD&k_-0 zt@R^%kGH-Nq3kwmLpA~F>aE`uWgiPXb(!S;*-&~Kg#H*_b}4ID5}wiKKGP zU_`S1<-uZt|Bf{x;R)?JMQJrX*io$G-W{I{OsP)Swb)@WbbAJFBF$A95*lfxt}2;V zyf|oP4HS3}10Dy>51wJn_Ob#vxr652)-yi)Wo$Uf%NPIFT4G}QDRjoTZF>B(Aa%PM zESb~vejvI1(=9ni)Yg5-yhRxD$IzVgmpIimExhR#&aDX>n=1dA;8?Sw^)|-xTe80w z?QxFfzh=se-4N~TEqO0bBJ?$>ZSCq;wcm$1clM*a_>;l=>hqse&{TISL|hx>B_>0+ zfwOm?Z!sC#=lR`1WTy7#9reeZna%i6I<|YK`!H&{^CXKBsGzW@M_=xy6}{l~vkV%N zotY`3mz|bjTUU=kSc73KXnSkj$n<$+C+jjzm*MN`4c6r>Te(NjQq*M^?z)w2-i-?O za_2bdVUT;?>*}WRo9#`fSn%jE(EBr}=?uPoWCf|9b_DeXEd{~H@*q@v0>wq?V-POe zA@7v!-(tZ4D^Ersc1|-|hm@yrER>li@3`Y0nk#(H^Z{yyNJ&r^JG<-h?=}Iojrm>f zo!8~x3%cagY<&mg5UX$m$1Q8UZj@(pWLVq^?IjP3;rU$mT{LqA=W}(G6p(YxDd!-* z+N143n7GbGV_5*8iguPa%macJW|_fsTWcZOI@IYN%ca!EDPLC1JD}(w6iRZNlAVoK z;Y^R6Au=fQ#41g~2nI-4Qf~5ZXWZJ|#qJ~;$JY^JEdFFT(Cv3_H_-9`%$arrYyDi` zTWUY8YoOzBIp8V;y_~gBGNF4_T_%nqr8`5I`fFYR+4%!sO5ajyD3^AFpGAtZO$X1k zchocOuX$2`$WSiF`ws+8zV+9CE+~~lR zDu=`}hETwsfFT}uSew!A+zjK_q zos4-#3*cO^iq$0hidyINsl)PnoP1~DFrO3I#Imo2x$OnmENB7gTk6TRd1Nu2dW_ye zNabQO{z=XV6^;&VR}0TJ9&21u1=L2*vF0uK=@^A)4!ZLJU8lJr6Mqv!1vg}VV3d(P z+4zXXRRt<3P>;4!PO0TLy79mWTH!6fLwifT=V>cgB{*3(mEnU8M z5L_nP)Y%wr`3K_6g(fjnh0Z~V2_CCG6pNOPcsY6_If3-zRCu$X5=Ldq73!xBe z9;AJ(38!wc)b4ypfV_s)&&^>hy&Y-(uKW|kC5d3KPp`;&;fQ?Bn<&9JyvHD7(cPxZ zkT>UgnFU>7bv`zg1gQ=F|2WY7tIpKZ#y5^dzffF5{!yPuymbuU}p$aRZ7_5c#hTMMKiV)}JHFnaD z?@gZH8m8aj(!Kj3x&ROByzF(N1zR{%3)mAnc(cDmz}{e7FFF8g!)eRkER;iYy}|lk z6}0;XbjI@LKWqnbQuwm#qGsx8#?iOZJ4Gn$AEkRYSp8Z4qq+KJQ8~r;4f%t?E`zEx zhFMp3Z$(3TcD6dIaxzsMoY6bfA_MrQ0q2_>-*gCmvfkwuBpgvti*5o)`8~X4 zcdPWzyV&a$F(Vdl3F>c0Cem*mswV?7o#YpXEWj8bTo7iwK2x(dt^;U3V{{H5MDE^AJRkV6CGZA_ ze7w4eTfxLyts^@EO{nvqL8)TZ;!3cFd)*;F^D=_-H5gRWi4W&3MQp^H-Sm~hk4cd& zilb^BL3N~3@}Dw;*b#87`6M+NM*m8U)E5txW4Q2keuZ^`A6nOHNe`r?G-k#)fx$7x zB!}1G7!&YOIL1r3W>b2M`_XJT#yONK9^>`W>%zh9KqT1Q;11DOY9Iwl4DQb)YjB-3 zgm&lKjqHkfL%lNZAm2G2D|Git@6wMtB0wzSO!7MXI*Qeu4>cLiH*HYuq#yHus-3Q{ z)TZ=~s~d4*Bi9-WGNyO1%_D7Fz>@HJtWjnG7u#lgrYYXmI+%Z-*_+?~C6PYD2B9OU z1;g8IAq=|>!qPnYI4Yltx&~CVT2!?7rQAGRZB*1Xr}}k`CGFTQ9L)0^6&i+PsdCgr z!fX0UN&bW;qs8hQy3|T`v^7*XIQjR9IusoYl1Kn40H4<@M-nv#u*2)qxNejti9HNp zx7A%vsbZ4YTYZNlv2h6SIMMq)`by~zRtb_gEr72A_yBAQfO$hu)k5;ymzg%iCD0>4 z+`TX65O-h+D#!@75OG(1A0h5{kTHmRL@CLQ^#S6hL+3)=#@0|F;trvqkO6OFO~^6e zwS4)1=AS4|*&1)GYbo7_WI{q4x%7iv0##)%iNo*(D;~hzRzo>!{x8Hmx2Si8yOaB& z!;(&|caXtrz`O~}!T88yWU#57b24Y*m*0kxF){Z7N&L9@@yO|QUO9dEXCqN3m!&5RsB>6zo7d-4cv0WC-5SinEGGlozY^e@3b&Du_dWH51c zKn5bm+6VQO`X>MyITp@(6ZP6lruUdhG0|~gt5C$2y8&!#18@&Od}b8-97;nhNmTvZ z06NvD-wsF_g^TA$y!T$vQmBVWbl^Z-qAeJ3u_698?E*v2n)Y4ZP-;HWSL#NfL#};a zyp-IijgDNohZrH&o(z!QGE>7GA9n}3eBL?;a5(oc$nP;o3Wd@JN*nl|#mVWpdk6{d zf=Uhz>Uo$_l51(y%zhf+k>J7xNTg{Zf;3-ltrkXwd?`=K@7lPL*zx47Pg{XO0`(7FnxCCzH!FETK{f(CN? zmw4Ntf|3+#ZjqW~o*GhU<$7)wwuRKDAzwQYfQ<0to4w7ww3f2i<*eB|}F#v8@Zp?r<#SXymw6q*X}#M|Dsfeq9I zmphP$2J=aMRXz+T;%)zkCdJpA(0S|6Do9-AZnMcdG{TcVA-9i+=KuL%{7E-{=|ujf zKwg(#8E^YA2MYJtZT>!mh@$yhJyG*#LL#**P+6q~Q6;D)n87~u>>q61JN$bS=-9p4 z>-Nc+{C59g?K-*`i*C>RBDvAxtl<1J2dIh7ARE!uLAmDgVrf552MaKHim=h#IZ$Ha9N5jZW)HlX4%{!#Mf_>XDAJD!g->BC|sBdgw+` z4^6(^v@()!6U7{Z`m`w}d7(a_(>ZXaqsZp8>gDYUow59%q2%3%q1R>3uFPBU0O8b4 z90=v!7nenxoIFHLK^1z!bfvd|fWDyuw|~h_X46Tr3aML#(L(p?m(eiZ19H^J@05~! zSsx&D9qg8VULv3y9Te{c?x3j@f!i*&)465d$795#j<`mU7H``(F8Q_}b^U)E+6S9F zU2P=b=r!JUw$1mRDwMK9HlOjf@s{3S>1XHC>(k%G+wQk46VxR51d*pcA zA=a+sta(eo54YxeI@AW<)Pes*C9gdTJ#OacHQqMD%2~~cMzdCqX>e-HofNiJ-v7w( zz0kW()pvq^G*wA`jIrZsN7xsTV1#`uiLoc&u?Ro$wy&+1KM1}jP27E#OZWs(yg_Q{ zKeQ?cch|>ZaG|5%So4=1paV&;MOMx5bDs_TC`&N#Z=oG4^f75UJU&QryzQ7=IYk_a zw;h*D$OIJ)?@nO*okLI=%t zV-=1o$*Lwk^q&qk#)m(~hCjxHKSqZ?>}=Y*uMJAh^f_udTM=Xyz6XQHMC+g417mx` z;{YpTsXv-7#kCIffTekz6!z>o%nZ>1=r0>0Xn2Av?+{G43!}?)1o>MMOI}10g*)KQ zQ}CLfE)WIhRPJijpt7q!M}VX}3wXFJc+t;$iV*~6$>a)C{&lC9Q_j)FK0kJ^4eS)+ zqHf?9vE)W*ec_?lM}UpCmk;&}+;Y;nEp-__m-6{$FP=niX3P6od2TO$A4DA<3qL?9 zxA`%nx1JNgL)b!Gl%4K_a0}n@Ffi9=F6w0mt~#&6dQ#7m2!XELwcx^WHyOdkgoXy& zsBLE3+_C}7x^$2M@MReQ`8&rhKeaqwbvqLt*w2$ykMN=B9ZK|`Vc(%KjV>0x-=NY6 z(02aJ_e&Ax{spMjFu)jImYHGcfoFhs3zTW(<}&+ zNhs!IC#w}NPYm=Mdk_fcI!`3`x*m_ngVHWCtt0;|Y-=T5u%x9cs6}FpU{%e)JLK4DPhV5q|4?%SU4=m?-VQSm8xWJ2JfTFm7tXm7|;0e@^M5fKKt0SlZ;oT(D z64y22@S|zn)~V^;#`W?pVEFZ!8*SFCMyOx6+2qBuf34%-<732RK2QyM-!)~lRY)e2 zf`ZY+=b^f8;ODXA-(Y!jkrB2AYt0(qJ&XdVHEVzX7!1NfsIfB<(}r#eVz!tq`f&FO z#{g$VwpTcykJ|3Yo?Od`^!}Az9I4)}b-`!5{K>l92*yOU#ZqR3_#l4(x>-D^EU{FC zwCffwGa4zYDCiwL22op|Mz)r?#W0BmOIn#S#&LFE&2H&L2h$0~(w(TQYc$UQF@22h z={!1Zr-dWutGrKPcW!k-DEC;Y)l8AWT|zN?`(AB zBHJ)PUDCKkUB<3fVOaPaHwHb7aSOSWM4K>KOTqTKbRA_7Z+cRw`0z!6GfEoyCX>Pa zs22dF@Fmg=!Iv1aqrPs5%n{`}+W3DsI~O>ur|thwWi%*H5#|sEgHRNWGZ}NtqtXmB zEgH@;<%T4->;BcLZ#pPv-bD)Jo9w? zU;pRzs`>7{*WP>Wwbx#2?X_<=R89cWMRxScpK+4q9RFzyghrX;__Oh$aEVFxymw)5 z>yAaWo&*unu=y}aisVbj63}Rzk;b1~qba1U_gN(EMnLnghv+VypBw3GCM|2`CSv>& zOhl7Q-c<&W80h|Cngk~Wk2>%U8laz!IZ7hc^Y=0SdPi|>f~gq);lR|YRs|2bd8xVt z>TA>J<-|li(>#ih+P#5*k0jvaOWNJSfhg?2hCtd1E z|DXo8OruCWOHBJU(|JJQD%IXzPi4Qt{Nn6@-w*Rn^t!plb>!i}a!td{ZZEt-!s z%)+9ZvdjGk>BhLd-b+u?xC3Npw%s9#{HX*ja!cYTDWi&xsOxmLIZz7%j$~FbAvHw6 zynixS+dBqny+=ZMa_u$;x+hSoRl2FzJ#7?5l>VOS)!Zs_1e}>QI>~RL`u}?<@I{p zbzU#2xNV(BVGF^qy=Lr2%*Py9hY(C^tglY>qAXwJ^fzL~--Q3{9h~=BBs2Tezk=DY z_i_;Aqz*Qy|6gWo-f);jtIro{wl#AKv~K+oTDyTB%K(^jWYJM^xa`(&$T=gq*mxKq zu*qHjyssM%zbVUb@jhds_5c=qrr_;Tc6MQN$&a4O;JplnzW2;U?(pGaWHbvbKO2+Q zUZ&OPV1aTlquMwU_P7nghq8kc+cxhyrUQJPKkpih=GMH+?dsdsG=Haf8qtYM?9Co8 zef^83tr=s!v>xmdO1w<-#Ilv|b{oW@~u5%zU zqK04N{~LafLa-*`*AU~^kfmQQv4kRPln0Vv-Rj-@uxyC;Wk=ht^>ZMHQGc91x)(=>k%6x9aY6QkZC$sv}y2Skeq|b|EHb~ePQcM$+S#Q{w6tV*oy5g3- z(`8=wanetGiE7=XpFEAk*Z`BwS>zqcznC}|dd#xQi?Z4PK#F$ddX`Xx(4UrxfgO0AUNwe;-8~$56|-EHsadx! zEPvnU^;I)04?!~oPNU|Rbav>@sV*W{dgVKkw6J4i@F4uJ5Dy1US<`^!V|HR1Q1;V= zhv1BLQq8lGb!MTj@Vc{kTk851qcpi2pv6eQO1z&+QBlXEd!~3b4`Pp%qItZ2`r2M! zJL+p+eQl|)JCG3G#`>DUm;6vF_Ew5DznMvqKM3Px4+!IVtkJ*qwlKaVLU;*QvtYh{_P_U$ovy|o_;WR7n zhRWfLBOUk3d=Gu2SM1Lql?S`o0Uf+xKZ1zHnlomXkNwITsq3x4g*$oBxK6e20O@4} z@e(dKB9){v6FB4HpTK{1vIiu+P60@nuUmNWW_aJxdjA}QS?r|PVq#2$`Bg@^HQpi($zpAfqKDg?4O{h?qorN^f%(7ul+2LhbF8Z&heQ_10ok`vM*>T0ow0HD+(; z7_g#n42zO7n~Jxei173Mp2ad4^c=Q7*!Lfi`*l{^!D!f5uNKFT|cTeS&>b$FXboa(()~jT*pxw}t@bvsJaTzK(rW+a;FKAhpwzGLbsQh04kb0+_5kc<^E??2 zlOP|eB$eq*npp;^NvkwyRC_QFl$FrD%!ZYXq@eIAd4-3-{yYP;%QOSPQ}O`)@A7eM z$WMJo;vn|n?UJ7=8I(xvnxEQesmZFpx+jkStF7wr;XmD^X=IugK-G&s16s8K%3Z~{ zzDhUaVpa{spLnPHtbN2BRZV;F$F6044#Cql9Fp?d1t&?LTP#_z4SdjqrY%7Pnv6Y_ z4n;7J{j#y9PhW~lWsV@mKaT%w-A1cQbztFt#jHfaXb%PEX^OIwzV6o7*7`bJUz_M_ zdwp%7uOBsS>A;scI*k(=b8edKU$31jl1J&8zlbS+6@F*IMBX`IF3~05xWAYiC)@Uy z;8_HK9f|$Pz2I>^?i_DW04r~}|FvKb7pxk)^o^kS(gP@drHW4(k819A2CMSIr; zctmrxVNvw4M0=xPVwBj}?jpm5Cn8bNXw8cmz^KTIKTtMcwz&HhVARr`9C*bN{3ED;gWPx{B6n(Qr2bk7I(WhHwiX%_f~^ zf|XQFlHBETwP>B8`9UtEPPd&W*&(mJKa)OI?+l=KqOLiC0qB(@?U_gVPa+67Ko5I4 zzm6))@Dfl-uB;(yp#G+uwkK0$BYB39`AqT9W0!f4426g*2o}+Ky;pS zV@k0x3(A-ulcW;w?-y#8tJv(E;8LZHsLm-^1bC?viQchyfbGvZES_DA;OUE+3^e2* zQWz$E(Tyw^p(*|I%tV==54L4Husvk2tgCW2g$j~p6xuhTd%wKhO0K44oFY=mR=kev z7lED*v;l;gx-Zbx{=yfyvHyBs+f=~6uBtygCUimVna+JmN=Z(*-YzxUgG$!z%z{rjn>ZD|y|k)SuygtF?U zvN}};0(1QBO>nR94nD``FU`AX3(v&)9U2F$WSM|~HL<`&Hj-YWx!2JqE<^Hvle{XS zeEHSP;LnXp@-IzNs9G0E(&IaVWQnuBUB7azh%3LV3Y7nU-;EQPZ;7W5zbs zoHVz5?6>~ENQj`ilcnFRrkXKx%Tt-XO~e`a*spZ-jtLueFFYVOW_5YPfS*#$b1{SJ z0&Jt!C$AsU-XDS9;>2#DL; z4g${hu_NIcLTt7>Xn_p43t@du;eSFNRvS98+8(al%twHP`%UCmiFSC{Dg0~a%YRC* zr!s%CB@ynHwx>#HS!4E75vWcC($ZYLS96}7W3;8z+XWsw@9O2e)1CQtGj&brPzpv* z+r0ho;Ngw&=4;)rqA543yeW4U5_O%*@I)~X&Ny8gyi78GbmauN0igEf8G+1zjPl*H3C&bsR^Ra?>b zmcYE>a@tFP<)NtE3k$WKWiGvN@#k!D;cQzv)qTHmT;qRZNj>z5_hYmLn_4r+aHVOq z@)PaZH-U;0_I9|*jh4Rf0M1QZB)}Igb$_=W{a;hN|2(LE!yLX!>}ysTPg8Fq-l(bF zK{1&!1u$&;f`Dyj%<8$rbj#brkP3SF0&Bb9`)>WRklZJ0TUZioojS*^PZcV~9a#Gi3~ZC5hH|9Pm8f%6>_Y&PZ(mp^pA%MCQt3Oy=SpDJGO?0YE|ekUZ!vn-KJ^*Mk3KF&ekB7ZMt+(1^50-QEtMhyb}oYa(bQ32v*q&HLVgxs z580P{t(S%o^SWX(PbvVh-@h?D)G+A>>Z;Fe%zHQZdi37S#;HtC%F{uP<{FcowUz7- z^yXtFg%tEHQ`LBrW_GQ4UvI@B&WehL|Jy}|zb^1DBz+&^81}mvhNsC^$<;oA?DK{t zYJ8PuBNNw8*4SKF<4Z;8f4oEW-On{bmw5-1Cv3$WD|5>|Ig8|;SQNh?HyQ>Uhnjhc zR7uD$_1~QO$z~O>Vd9Lr^^^N|vi>)dNe6!Gv@dd~_re*0!Gzq!9P$oZria~NltL-k z0i=*$>6Swdr>7Sp%}iBIG_@4%;bNsWmHCvuV2}47K+=vERlUXuvf#|)CN6EcVlrh4 z!0Bt?^k5tN5Ti$Q1#yF}Ab!pI7I~AFTE@k};$2lvyCw^6%YPeQkzSf-s7)2;oXE>- z-r^f#fwl*u&}o|sVbPGTGfeWxMZ#<(I^-rYE)I6h9adSP^U^4seapSuKv-0&2=zwS z4TPB{h9{2e<(*A^VKRe&tMM(lYQ97-FFCuF>@sgNQx za=K-y_?I0T@Gnaib0BNs=>9e&M{3epS~9RHL&sF}@itR`+nX>2Ie!=dll%DB6y6K} zjD?qZBNd+M(lvmGDtvSZzr?Fk_>?gHHLtJ2V_evqV}jGn(B=!7twr}#a1$P`XI(iP z8UyK;VX`bxi4p-?c`m$@8^n zxxyQ#^d%Nq;^i2HrtOxh=v<$TDXcNOGTl;n1bu`k$C{&kbd>pA!+y2ll$xaLmCX|` z5B%;5IQkaSuaqi90;8PKP;{^G*DwLI@~QczR&^YbdNgzp3q)P4UKL97w{uMz#gk5(P08!PdwcI}-=1(sN6Vra33*`JF_Tq{BKA9CbpX6NMLR@jq)@xXb?Nd zK(rn8(e=6wIlHVUxTB2AEi%0kqLL%8NU)#@$H+yx7`gGh87wAMyy+*~^viASOidaq zhmehXt;?K3NX@$PY7jb#z^Ex<6WoYQw_K``XwBK2-WxT=&f)1k!C?Hd?e{Y7;7Db* zb52-qDfDUx45XDN=JU_zR$AP^vc_yrt}0nvpS$rR*lx|jM&@y*bzVqid|)(Ca04z@ z3ST5?>X*t4Mor{Jvu>HnG!@3Cnvb+7vU=WWZX-iqsUzQnAo3wK>4(V033Gm7F3!c? zMLB5kE`eabx4lZsX>4T08{>8jF8$nob4mHGgHPm7YVZQa*gY+ZsTy0sA6r&AQG654 zZY1RTy`OH$hU9eg^Rbe3=k-RqEA0W!!#4|b0{Z|Ti3FY)+Z<4~@T(~Lwn`3G#Ki#r`s{9=d z%L(*TiMJB5h4%I35~jR{?0YmV-SSd|QbXQ;R99HKh(Ncb~O%Zk@+&C`tS1m0Y(K=#SDPX=eWP zdk8Voor7iR?L~lI&Rz^H{hW0l<0{=UKcapG_fClJbE23HiE-uAM#pD0ROtrssnWOU zmbnr1M=X|NL9F(g7G=f@ugbzj>7*4 z`E;?jK;gGt*n1y7H-3{Q|0ZUG=HpO6COzI3LNXNn+e`;d&^Snp9rh6I38oRs{SvyhSMACQ43jK^q*LcValc5+&KF`I7b^AP=P!3Yd=Mj1@4V(uCGLT2P>apClXd z1@3dl#@g_}!+s69<3es+H=!Hz?fD_hTpQ3WQi<-4U0o|L$Lp=lU_BoJ5RCgp(GVI) zed^qgqL_Zf7{N+KuvbK|Gohh+r!R6X2slsl6{jbD%bSh)#{k$%D*zle>Kcmv*M z1czSvn>8{57w|gF@|`!p9u^JHCD;@O(8Nu9alGUQj zt44vhSey=5i*A}I3fSe5nfoIO*oDZb_;JB<%Tgp3CQxz-HpE2|yyP0ZiKr=8cU4u>r~VPS@o?7m z`R!qS;jA6YfpDI1y##_Iz`gda`N!qeO0b;0KB~uh&3VI`Mc?|G+GSQ81=rr2ESRTA zb5N73an#W`n9OMFr6q+m-LiANa>kJuqr&v(z8ruOvdpr8tNP);YTOdM2H?-Gad;!hl#4XHcDY(8OhdY^bkd$hR4;`}|lGuC859SbCqB-H}-(7ad5!*3W z*PFccwmfp7Ifi9Wo;dCt?M!Ga;ltix-&5*2uGs|74h z+Kmry&}DMn+8cZK251PiLNu1>1S%LPO+T?gMsEua$~6rd%-YP*a32bb**tEACA7)G zC>gKEg=7qNhlGUrppPoh(oy0j@e-bNOaH0Pi^uA%RxX`gmD6Fn9QdOlfMWo7~9}qFByIyQJh#BqiEnuy! z}1S`g1$0eXV6#veW-M_i!+W|e{FK*TF<6idaGxm zZsns~r7NaFALvmbIDyZiTZp$cYD$(C+kvdqqK?!ZgHAvI73qYhMeE63|I$U4{A_#k z?&(b+@truwgpd(~*OqaA`Aib9;s>D??I;S%^X4!JTI-(avZl6gq`xP5DKDZ;M8wvb z17$$(QJglB5@oKqSRP09Tx!yr`qZ9aR&tu>6OhePt*J;~@5&3EF;p%0UtfPJso{NG zc{APvIe92CT1GCLg&;;{@ecWm=G1fj_hP@8w+CfvD~%Ut@2QTjf~^Z>tdZ(x+J*FK{BsC?J1?Sk|Q|2j8mbodAP zE4)ro`jq_iWnK&SSOv0}TcQ|}PKEoUASn601+bdm+xd^w9W4r1g<;M=D_lnyVAtV) zC&u-)u9Xym0ViBcf~X&G!YrDSNIkAts`>T%dIO^(XOjuB^XHcs6I-U8OtFO>w_8w) zndtGCwBnD{IiM;QOrc-qSObYnpiKk59oyCW@O*UW5$`8>bpYrsFwddYRA)h?{G0cGq;|aAD_Bs+`_<8 zZeF69>&zo1>_YjK)Z@jZRjY*3O7_rG1~y@PQ%n zp|M9jl8{BDsb~DZ%)5CEgJEAB4Bq2#tXY`-sY=TLv-&$`9TzCbW<3ZPaYH1Eqgos$ zt#38aY>c{dNVF3ha5X+l!ImQc2LG*!u6K9xW*j%|ILx??1rxfEf0w|Ry_ zUHoOxFdIhcmR*8|734XaJeni;A3@XvwN#3GNpqD|8LINN4a$KUl&k+tn=92jKj>?p zWRb03QH~8qVN$GdQ7^>w{~GLCFERwSw_F$uc}!*EEh@~!BkToN9WuBRRxJ9^ zeXOMkO6tWhEAcO&R<9o|P~LI=LW!7d)u0-ajW7oj@rt}{aP=oLy~rC7Ose6Tq24d> zfxg)J7<9L$O~-Gm!B*R2CS(4Y8ppUmgnP0#w`6A;h5L8B6evU`O#)G|e`cQqXrX;y zk0~#{`=3L#j{ya<{hHceZi81Lg$>Vi>V|om{}IQGV^G<*spc7_l&OivG(Nod8IQqL zuDb__7-j|HV4);aLPXl0px&AhgWXW?t)eZf+D_@UCG1J?uHUO2jlN0L7tv_xISCp~ z2x;`^1ZW|Rj@!mz@js_xjRq7=#ooHLJ&i6SE~L?Xnb)FG8z0^?a6mw#U;jsET~|S- zgh(|SadBBdqsPxJ*0Lrz78N(Ylsgz(@1XPLve!(FMDyq@alf-FLd7 z{X2ZrBT3|%+Q)BcPoraq3u#oP=88tW`S7lX0|FZDyrV;;7#~d+l7)QqnN%wrTUWwQ zAJz6@oOMya4@}?PRW5(5Q0cXESdI7oR4t}*qcTiivbEA_YQ$1Eo+WaH9s*a&tszt) zH;uN0fQsQLDgO>3-Kc!1xmCu?oB9bSqrIyx(dEtz_mBYh??A4a((nJN+Gq3ifPKv>`w#CQ zP@=96&GhF(w(19vH#=K4$);q}r5|ka&R;QqN{tOEp}jp{83t9?vI$c5)p{Ig$V1@Q zN<-k>2!S1A1hxzj=n)_=B0^xdUDtxZt$-#F7*ivggthr4-hq#z@{(=emNJ|RBXH&O zOh5<4h4{kxKf+zK;`3a1y4@8N5Bang~`AZTJ2w+xAVUHYVK!NuxN&bXz%#G`1gO9r)kDNGe zWXae=?bLXEO;_)4CWraD&Ax0i^qid`(SUdHYwH7jQRe-J0S2y$EgMh$%l}L_HnRg02QO4^rOrvy-oG?qQ1K5YdcMI%-ZNWy1l7TBYm2y zJ?cp$(<{4)xgG0=`u1!~cOo?sO_h`@K8dvQ9}-Z7?EN}x_k}Gw$kAoz zC!otyySAsxn(fspYKe%FI=MY{p9-N0ahaZ6_6Tt*1iCW-GC5OI``fieiE=;Dp&|DE z76DP-;KTcn!50vv>3>+Q|5B!etTD^}6%orw^LCMT4Kb;lZY<=J;9ZtriR0A zvjkvalP|S2H965~g+Tk8;GbTpLK#rA|0>c13MjDP&mu0Q%SNU!pv!uEc=yod0bO3( ziTrDscYUk0gu*iF913;_K(iW6WySU)N_#JMa>}fJV(TQ+xD}xiwX3FdGlv!jkzTn* z2%19sfPtikXEF=<(DsWCpeS{=Q67HLQ$F?C&3JpKS3Z7HdmETL0p(DCVjcI>SZ} z4lOS#Y|ivuj3QgHqVL_gQvpS;u*3pIvGTYiYdg{<0SnvvfEDsPtbJ@y(*zN$rgq8I z?TB&%Q2|lT2pRiCG4@OJvxstzVk553C(6D`OK`P_vZAZtMU)puwr|mJE3I}B%iUf! zu$CF}uDRPLs){(}(_;%bW!D5$AyNKoy!JbsvN~YMNscIQ(00S;&X? zH2o~1e5BZr+2R-SY$!dUv;t0XH-;7tr3b9b%{FiZc-o4s{q{kqbGljBfvFp~Jg%^G znrGDU797)_z*mPLg`}yogmA*Q7W?{?04U&>XRZ=yV!wkMN5>NzP^Y6trl|9abi|Ex zxTur#Rn-?z=N;1#nM&25AMlx#f$9%E8MDreJQm;g*2K!G(6%2O0 zI~^kw?XI<5Xg^xo?+o^Hg95CxYHB~fvK>*bBPt-u-U1d;_Ta;Nk$x6YHcl2%z|K9D zmgp1Un`f>koQ-S7_4ekBC}`4m)k?1Y;XbHx#dZZ$X|==xZu#iQ_S|w|0pfPP=zE zRpXr~2vxvVhE?P!X~=fuM33SUMVWDPmMd#ZcuPjoWGgEnO7At?sy=5-s;)DGx}q`r zn@gV?q&JZs;_z>m^c+c%)zgP`xBjGy3>fpT0#tZ3V1Jjf!EoXffv$=AksA!$4KT_$ zn=}1;Dr2IBCESj08P#FA($);s+98OARq}%lVdF0KeNKQ|mn6`1CX0L7OL86c#S6Xk zzqX!^Q=hB^E?mCM%u_%!ua*vy3AwIcsPJIfUN2nSL9{Kr>0yos2-r(6^*iCcy1}jx zpFFfv{p4vcPcb-mJBr#>=Y6%C)_Udt2zrpWP`nGCh@Fa#S_PKe4nim~T-s5PbZsk` zVD-IiCrIz?uQ+vW0o8W4!a_|}Q@b9Ga~f*q#E5f8klTjzA$)j0F_J{3-4(kQ&fQ;W z33e0pzbX~H<}p7W(S9sGvxib^cVe~Pn`YK}f)OvXL}%DWa&E)JdWQK+P z9MRi(Cz`CC`B^;Gd{fKbf4P#m}1w$0CSX<&j8JvT9wv* z@DK40B}RjlR@?VZ7~sh*3q<q&+4huje|z*9Yo zF~FgKMGUafp~V=WtJR%<)T&_nQM~{B7n^uR4A6~M7BIk!OQVM0Bw#VX6h6Ek={~jf z=wuNEO8so56)?ai!8#%B2me9_SiYgrq4Vu9z!O^(Fu+VpERX3px)1ASMv)VzK z%5=lZ(Umd8u-xT$e^dU!sD$#CI^AyiHkjUBrU!WtqL}&Lcpn^JVB_y^sloiD zKyA$H>2k{7xg9M^st`BeU%5Ey?6|1mKO74sl55#9lgodP_{5^Y%`JnmGE zKIFAxKLsK08bw|65nma7P321!tOQ7wbY1IaLq(4f!VE=|Tv#2qFo2=j)=dD5XjL5k zBx6*{6#T}&58q$#VP^(S+pq|Uy8y>RI(Ar@H?zqdBlHgxg&rs5?ya$G*!thS+1oc)n z^7XU6zSGxhT$Sf7(bp#*I{dq-UxWI)7wPMj;OIT29654$59w=b-8Nc4%s-Jg-Lk(} zeSwXZQ56fe8l&wh;ueYs-cntwUNBE=4#ct8eLxynGFWR?*Rer93 z88wlgZMfB2H2`~6>5or!vU&owg%-_qYeQ`#OK`$YM5&9=uz~4~;TVD9hbASW*9K|x z#b_#%wUTOA{sWzPNsj^)8!WLvXTGz)E5($GMD?i&s6x|uwavnRM{(|J1q5#rf^~JG zHM(8+zI)Xg2^{3Rs@2bEJc16HIIdSos`+618p+oX>m;2hsp&fY0#m_!?QUPDf@gP7 zZq}ML%@UQ$yptGk(oZ)K!yW4>tIgJ#n>G08^W8D7G{t?ev+Jg)_3NpSn$nG2`Ft%n zUv)lT_B#7}tR{G&zdq>XRrG-B>8>!ghLuua_w1syL_@(R9cjX)SAh+h&@u*|w+BUy zcvfa!nfnx%C?wiwLmSv@V<$XSXfJQ-BkfCk+B|MhBHSp!byrU)E>U7&fZRYuc8tUS z+e_>%-Tz>Tk+G5pC%+QtmfFu4*1L13yg!7m)*}oAB9-|20^*e`WhlpDqzW42{OMPv zerEeRs-dJ^E$KYv+rg4%`3IB4kgD+B9D=Cl!=FP;WDRu!qfkD#rt_7|(UeoD#9jj( zv0hT9ZXL*}GTIs10`~`S6^aXGf4)33o8i(TaOFkdju2czkMvrr9_dp6*?+B&of43( zC*-&NxFT&|_;QRx>+bpR#T5SCz)RjAMSIdM2dG!Zh};EYet4XGu4*Vq9u_AbLbBIo zKX_rh6jeuk{XguXirb^;7(gZlAR7cA6X=-`WD5r}2@s7zuTv!D zoZ`^M>}xapHz2S1yv6z|R6lQfST+`aEC3s_Y%`prxUdP4^lP`x@Sz9t${N$; z%872;Ix;FFkattomAr%VHQl;vo)b;8f)1GTxa8C0V(zCH?|5OgTH6T2G2MD<43YsP zPBfnJ2*=-d>>OKfT-zg?#Vdz(<7E zGx^n=Tm-G!u$n;2JZqH|gWMQM@0B_#`z)-Z^|Sm6&L~pB2jCbX^lCo*X+_{44&htB z$OkS~_@yGi0O9mYfKzqr^89RP26dGAhXf^8xBjp;kliAX6@a8$;>^FiKuxdhLrv4D zNqVVgFrd1*A!+(}AyC%X)@>|*F}?P$5JsbN`+Q7_!QVVLLBQ>PAO3XU#o}8eSbS3u zw-L8_9*bWXvv?J`+`#?vPa%t6`!#KTpP;|jf5LWMVeKl$jBn3L;F-zCvl#rGBpojQ zefaAW@S^`f!=#v%bt;e&eicIfdrb|)ae82WHOCa;zurOSPix8C!RDNAwBDI7JP#$G z-w8l(hM;txp*r)nB2XVf6{X!$B<*?9TK`Exy2VQT+iXfaT_rAM7hW(RGnPJ7HC_w6 zdUohrQR+i+?(;~s+w!Ia=u9nA<$(ZsWvb#52PI0*wn9v&>>3vGBFWz3y#aj308Jb9 zm<7V8o0U9H2z~ZEK+g$i(2p^dRbyP|2C2{;)mORAHHV@-+HSxyjYnZKo{?c z8nC&5Hie~&4*ysy9bSNT<`}!}9Wswq<{|nzU0;e*PgmiqiQ3b;?jd3oR=-O8E6APn zRg7(vufiFSp;daXmQHI*-y3aq5?@p7%iI+cNHdG+0zNcWUSO;Q7E@p4TZ^0edZi@{ zRWscxtkG5Hvg=Y4SpVntxIC;WXHDsW5iaY*xLiq^;ljZd!=*aL#iq4u!R3iy8aqJ( zn4fI8cpkgmcqmjrk*9$wG~-q&F43a3TXG-YR#@VgT?>r41Cu2M_MGN?*-rj~bwgGNk#dW6C*^M z41AJszXfoKg5FDlhVSoytNmSxiG{=dah6lb(pn#fYe7Xt?8P`W+I0?#*qa#D_s1B$ z-a_w-Jwfkj5?e=F3Om6{{GVEr^&J~0{F2wy6XJxANbvrtvi@o!LK}!~rl;a@>Gpk9 zXe8%qy@|L8N0h`<@Zf2n%(pgf6JA2^DGCi{Xs!sG9*=)4dzM2>F4IW2NG*@-m#6$cgGCzCNny5V(lVX94t98v(sJrn;{&+*`a)xw?F~^ zH{`nLeO^qX=}?u!8tGkv{wUBF5A`6%cy5G3S$p>wI3hN6=I2#)WSsCQ398_bIO=AioMk?gGTr3!^~J8zo%m~fQ$>tT2nQ3Uel@$YzpED zD%(XO_f~dZDpLx!EG_;C}Ax^=sBe&gpXa|_IR*~dZ?G7 zX9~sQFxUbF~gD~m1l@6$_(#YLc|O=Gf9l7 z5HQ0K;=<5%PH#(~SW$JeDk{V57rTN-JcBdn`lkY|I{S7%v_bvO^awV&Pss zl{e(5!>-1A%~rnxWD6?U-^$adP1H0fJG!?Srh2+67}Mc&Dj1 zvcoI9E?>7tY-^ySM=3gTY2#}&0miMsh!QvOZrm{246+#Z6jRg(qq&arvp9|MfSWwg zQ)-~aeK)K(D&tW6?%QD;*B87`(vKW#{-ctHiZkl9E4)tkfYk%ao|Rv4?Z!(>L>xf| zm0EAZmYrKckyUfqQ)UdCyeG1T?5_Aap5?T=sXxIf+gQ`}ni1g;=sJ+kkO$QCfkSh;I6?cuTKeqgOyh5t#%MK0Pke|xzue!2d@y4Wo6BbJ}K%l?Q`0M_F!s`t` zpqtw3ybp<0?~k)Bt&;=8b3zg6dYz^H&boEA0aa~gTxxpVbdq<4U!V=XQ4KYv-{Aar zGOF}$K12STPpXONHa_HH`R}fgn7YDnGwU^9Db7cewg{!*M1{5tt+l)esN)*Q^@0OLk7Q%?({a(SKla8xBN_OWiuRhSEjFa z0`w#@1sBEDdG8Tpn#}J?G|Xl4!kZICcTp9G?Iy)F&;Q42gYoWBIa3LE&-F&LYa9T< z%J_E;+>Z?r>+0E3H&g=~(ZJ|#D;>tc&}YHLCZmp)JmqMTP1gu^7;^@qNO$OV2xXfI zj*R+ga@P^9Tr4)Z_T?AYuMGp%d6$Q#ldfFc*y-M2)v4o{OQEw9n5pJ1!OKTX(Y6)d zSG~adU#p__a}z{kh zXE(zsk+^B@MpKO9kl4un+|x#4Xy5j!_+WC^ZCFT!a@WlXDOZoJWj$_0OJ#L?BlPlr zq#~^nFW37oA&utl==vEiSt>J+^%kQwY@?mh$o8hzqGzv;`J3?hmkYC!CdPA zPpQG(prXHi+*ftp>K#Jnp74vPh%$ZdG2q*76>VgK)2I>}1%b|;?Fdxw?HCwh2t{kf zTc(9Yq6a|56st_ z`+uQPs6&U^?V#p&pcN(y^wP2zcMn?P?@c2h3O9y>OxsleKF6Ws5`U@~T2_Vk@GcH5 zXE^w?S130YiMMeuo@JYiO~XjuHeWb4sJAlOCW#{2%TAM1na|Z_hmt#x6GOcxwhv17 zb%s99<39(elU5t52t;Zi{6fL=>_hbYd1Ut|>Dq#O`NiwIPS94$+~NS|MgT7s2N()~x4tUdg3642 zPT<2^u^mxog!PNsFX!P|u6%C@=wX1cY&T@@f%kYjQ+Uk5vd>>+he%+bH;+{DEwH9_ z=po4}KCmio3%cW}sUn5s_G#4P^o?Ffat(ejzdd253Cbjj2<6A}P(GO?YoH#cfn!=9 z$uB}(;MW19w1Prt83w~-5_#Yoo1K#!?65!v-qQGqmRJ^Ld zGVfXima+ifI>=D9%>^^aCiltdxX0E0YVS0_)c$HeWpQqi{xD+A!Ew0!=;0V@O~)mj zM@ezQK5@cPc?q>~LfTMPoj+|8)_Fdgghb8t42*O4?0*PQY<($NL1_%|%l&~D=3f+J zNZtb|@~Yn~|LlLOT@3lwZ_H<8B`zQXX@`>LT@+RQl7Yek?nK!MBuHkBvtwm;vdghW zPvG1^uk71?$}+v}^#|IYYJvIQj+WKU3jODaREy?X{hW<2@$0EyMBi-z2>e<>&iCdA zP56qCHDO26Vsg%oGjBlVIAKO@LYUQ;{P>-SEr>7UW_s?uY5l)|2UzvBo6NZN--i!ZM!PqNX`LG9nSM{Q+WX^#nR)o! z8znDCSx;}ScMLkAdw;cCT!`w0wxpKHmC4un1 zfA`*I)xdLPmaRxmQK#U2l7;pH(@hRV5^6usdqESan(a4fWEPVtB@j&T_D1r`%5$?& zld3Onlq~LULL9F=nq^}5Xn6BfJa0`5Bo0`vaX!0ru5%OiYk0!4Gp|m`4&ksRZp^}G z@78Btte2%;)qi?3O7@f<&3;}F)Nm~w8-exqU0?R*@n9T#@XFm&c#r?2Gg8_noSj?v zH0I~bsO^RH-k@7((N9t$))HpEUCdvfYQS(fzvm>z|% zm!7PIi7zl)_&ISIzPfsS4G`0t7*Wha0eoNLi`sbr!v}`AUpkA1_O4~Bs&pBi&F+ykv-mfGbvQm)A94*lCc{Br`LhXyq!0f^cK8Gr`O=@d)#Pm${)g%;BfcP zRyA)k;sLdR(P`{vJZUMB*3J9Gp!o_4D_w7hD1d-#7%-5x>pmrOLv93bSkUkuG&9$! zDR-X96kMx$_xMvoYSO-Nu+<`|VS9HQc%(E_L$oA|r>8aNz zKdS%{-N=Fejp`V?RU!wJST36Igde_CB&eSAGdg%je}_=buHf|p?(6<-4UZ<7h~?=8 zSg%l!UP&F!N0*xPF;hs@*C1iqypWJ=($$-xJ?9Y!-#4)Fq{wS6lDb~=-ck7UFwFY} zVC2mq(yI0sGwF=pACO+wg92fBY>092*GKT{P*NWJuL*b##Y@8LR+1wb{ygaLfPzSa z_swZMSmR_#`*GXFbgKDx>H9Bi>BL}b+K=1v0M^E>vG1nDGc3pg6j)4#PyaHhE>PDr7oUJKhm+Y9S5M@BnEoL>@Md*g&4nH z?^-;jbOJ-YBbR9u81nfz->51y8c(75g-+s6wR%#s<;w#D`Mffa&+nUj-tu9^>#-?{ zUhF;1*cX#-8c5>XFhGP32NLTlc!j9kdz0=oYSS|}+VWxTyC*Rzyk&7bZayMDJP9t* z3HH2)xrz8jt1=QoEM^{IBgwSAJtiq_Kens*aAXMT#&~zfz9nN(Q1iWkO020`wXe0O zX~1tmdtPFxgZK{=pV9kTP}%#UoLhhGaiO#giF~Qh7jmgXTdWIee_{8p_vRvr2De&p zv}q|_e>q@q8AKwePW)P(_$i1sWWO1eS~g4lSZ&Xc!#LxSBa!s7x5l}khu$M84QeFW zYvaS6sdUBHx|UM%~PQ2=;6Yp)NG97IV zt9Bu={l3n2Zpg0jm*G$e-ggZ&;N;WVX}}YxD^}}!i)~I^>3s&dSqw6HIFdMbWP=u! zc^7UPNCN9oUa41l$Su8c-Lx*!F>8GPu1Ge^G!hh;lTLLXSnl0ql0iyJ9KnK^^gms= z4Vases{(>k}<5pAq*V z4)4mi6JfwZSzrknu-?R3>7;!SMiG zR(gf_G2p*-mj?W|X3SR3RL_6c^}pT2cU_G|FEV_r<@OeBz1R`^WSRE}fB~agiZLqV zb(wcPDd5&f?Y7vdX;LclwFFLX%RPyONqMYjF|VQ4<0cCAhYB4|R=?RIY1d+}Ug2xP z@Y`Os!n?V!?A~4q@8!bMM|&mo3*{Npt^*8GsLa29xhms6ceps1k~N=+<0%*?{od!X z@tJz>Ha%nF5qbsX*Fo8DMEl8Iy}QgWJoVvDyf21X=l>P&U;g-NrYj4kYj?wV@$7Gc zjg`_zYNP4ed+50)2}rvS=Ve0Nhm)MH5&j?3H7(wX5g28!In4rz>F{-U{hQ|^j3Jah z&t_^iI-CsZ=xe$Lh-r05QD|8`FT^xs)uGu!QzHZGG66Z0cH~V=xOPwRO^VN4ssJ5y z#Kum&q3f49wmgEiL2D4a@g6a!gW*48xY7xZfC1QxC%r6OJ}#GXVgLud~$5@ z92^pfb%OR&rR$)zxW4FO+r1<*)6q(WrVVBfn;AdN5`G$kJuaCR9q-!BxOkpcp|rM< zn$)VL2(v>G z-2&BTj6n0UqcMilGfI!7<7WN=K6DiK{}%EgbNGh65OxsQA4$QK=Z&+fqaOQ9zCG>v zjjX36#VOaogQm{h~jR(PH`1 zGb=3D=}_K3#&Qi}C)ONRg20vvKl7IxNt7>V`R4c^ zxqOlpGtRV5RW%J+-xUBsKO)bR^o+}+#HQ>I^1{u65&RFVz&hHMp1G;vw^;Ic2CJ1$ z9&Z=m_xGTm=(ls$gFc(MaMZEs89o`)Gs`K&Kaf&kb?^+DG2;hIR1JPV;iLI#FO_q) zqo1Tpxx$`KK8k;YUV28Sm`{I!^Ah8S`K^?o4U$D=(fB6LzsInj03%2tc(X|L=Q#b5 zp3x&JkvjZ)jGgNY?nc2iyZY;MQp8JQ6_=;qsw4eY=k(i|ADey?qg+Piqoz2OF5T$Q zgL7yv?hsxtlsDQ5M{g%X+9qqnX(Mxm|4-vG=mtH4@gFwL@1=rc`C&?nq9i01bCp`d>=ImL5htYcNAe6g6H_#1gOWZ$Nh8bYO^Iyx0tJv%yo7zCyA)UCA4oiwWp> z(f;c~#Wx6O@Ir?RB0?dq8nbi6eaE^krN2Wt{ddt;&zq^EdK$TVE2_6e$;Rz$k#9@( zY(}JaIZ{-7H;h1_70SFb1BD=Gq<_{@ZMFC&J>y17QV~)K{z|k}dd7tjR{jFUWklga z87@$`K6gw+;b^y6d;0DrzeD!Jn2P?!?CP^ikz5PW#sVK7BRPwx^h`Zom7ehnrI>4)ReQhSfy1`BMWf#+|D}Ji!GgC2{U(`Ef0@6_ zJ4>LE#g|lO8*`Is)|{HOiN3Ld(=(|NEVRJYoj9h~V>S&Y(1}N>52v=GF9)yI+Fmhx zd>vJA*$e8+!ZoQ0s!}Iq>vM%GFB?*ijx;uF#ZjI4wK~9U`su~U|@w&_f7+|hBLBK_lT1Iw)es9CiWkbs);>&+ITc<7aD{j=m`?$@8~5hvL1KSu1}2i zc$YrgM}rHyqG7DwZ}+ zRWy^#3j98dS81h%kW6|CRr7G=1OR_XojtrldI}s;n|7(hsGXhK321G)p9Fx^)lkKZ zOzqUOGPTpumFIXLy8WYcHLSbt#N3B_aTmld4s_Qa=zzl z7>S&#*j4D*g^r)~))(C=x8EikD!%z!nBBSkGWSwlLvCMgpensekj=Ln{~Xe-e&Vkk zQ_WA?atyT09aRAt0|kyQw^y-Q=kC;4Q~SKDg0BngYgXB8{E1A%iMdrVnS&J20>)ul z=k8hQ-PTcT+p|&|QTl4RvAH)O-rL5_L9_|0O^8Nwq^I{8AsGU9z290R;eHz4UCjq1 z-6s6D%JFt8`zLgyzn>H(ygizDe*gjO)#BsyX((ai^cYz$jMKp-vC!>gqqO$V>;Uk( zE|5FkiP;^A4;&LLEUod*rJ9hlPcrgp19ULVI%}A%@jhG~pcuvn!*4F}46#dgQ7_Hn ztG|8O@Oz#n5_6PdGSd`b_?-lag7ejnQCEA>qq|eBNmrRqV2StVHB=Fap651ErrOCY ze0$aNo%_L@orY92kP-Sx)Js0v9L|szN^!CU``4<09J=Zztx!*Lzm;V~~+_gXz_R^VP zS=gHmt{Lk`O`Nr(8f#5#mK(XI&lifxj8lLnehVr=6HhjL3!8WfC8~*;FKpqV>-}VJ z81M>j#Nq0dvDeF6rM?W*-?2ugD(z#DN52D`@WQidH(65Yt`uNrVoc@r4OCv$W<+P1 zK9$bff%I7AjU^W<&aIkHBY=)W1%@h*Rr5%62P*Fob+a@I#&JUB?QYt~sk}3s%KHKF zWqxk8gS|;-kE=*++8ax@Gz${wI~LRd4fNa@(sO&G=f+o_6Y9uN6?)$5w&q@+U8m9; zf0%AcEFDZ4vg*{>zLCPK+Ewi{g~tV1cQP*ML$e0jkZ!TRl*|79Ln4Z;mJCke{lIh4 zL1$|Ht6{*u(La2!JYenI zBu%W6%_!X$VJrc)*)JkvGLcos{*wKeO_*c*;W1Eqn)f5FDR+sp$^J>eY_d@ygJMvu zQz<5A2md;iHilD^>OilMMd60y6)mew_Sg?*jDd>ya8&ASb`l!?@-J%o&`a+W$WE)z zcEMfbF7A|5qaxtfF_j}Vj^NcZD#v+4UK4{#IC&p%W1|FUMSYH(Og>o7!B#00p$!^& z8u?FHj}`9u%Nh4b!lu*|yYFou;zmtzOHX!4(amJ8m*_B<*XnH=V`s^1_g*Ty7c*YJ zp8q2Mk`rp%xg4FxZVuW}&v|DrSHH;EQs>lcx%GCz=-BeDZKKigXUr(lRw^cQvI6o* zg%;YXpA%iH5i$(U61SWWB&##)H0E=QSMy{cqs&ibMj$T5DBt{)C@q}Y9AmQ77-a}{ z`|$*u!sjbKAYjXNr-VF0Fpo#Du~L)n0;xhCK`7j>XyXxV^;zal!iw%rOXYNiPsWQ+ za8R;KH)NH*`K$t30gH@JvPffgnwj-p&sTy~KCw@QyrT~u^qZ{EJf`W}JWKsh9WL;| zzq&%Ufu`7T&>ImqFh?*$W!GoM?*G*sIW_5BxgLxoI;5IkHUkybU~VB1Cho5AuJ{41 z0++ICLzJe-{@nnYe|C+(irw>}e*!%gXFG^&agP50HpO;NtH?bpO(lIre8g`shgVLL zzsw4?UM+{sV*BJ4Om(cU5p~!ni>4>-6Bxm_8GxI-%CfArTHHL>EX#gImi(ptGZ_+v z%DYj+q^3_(g%o7hKk>)e&8xPK7~9u&M`_=W^daAk6!0#vph(qAXJ_Z7CV7T#p(fvo z;>}p8#q$@9Q8^MCvahLAzLne6Iz`*RJ|VkU;Z|&2 ziMR0z*-dl($K1M4+ukZi9+;(1Yrf>2_oH=Ms`(<74OW*w9&M0lZbHYnSr)BIPybUm zuXnu=EJk)7a|j}@-3sL<;^^j{An)(Of5E&Tl_z*Y0yL9d-_z(G&2lt@C z!HAAiNn1K8_O~UltP8QUbAds!E{TK=aVm5|$wwDEJG5^NCpp;W--(Ad}Qb^-pB|Kl=OzW+xzPV6SN!{hZj zt(!fCeea#l;L%yd%^W`%oQH%D@VD@FxQv6au*-ElaLaW{{O7Twjh`k_mtTt;()ekO zH%{ThtPGH6{;TkC7gkRXSNNYUY~>$hYiQDsaDwrp*B=5`Qo8eAB(!L&H z`rlnT{pOXZ+y~uyoa+7d8^Tw(aBN`ukHHm@JZalsbQfRxTOhI2KU#KRI|3TWdz2Ei z*nmk$oPU1IPin^$m4CG>-`dgN*6^$yVxnH&H8!A}cp3W#<+HT}NH5R#$n5pK_Fc4c+fZ@ar(+aie=v z_P^@t;hOQ#m^J=v=xg+p&&Ei4LsaS`=995}B&MhPYKIVp3cilvj&kk$N0eiRAG9y8 z9{(6BaqSb|jr$7x_6f(sYu;#uw{T(MKV0E+U0D6M1{MC6q%0_1F zV;|8w={5gt%qgVtC2;if&VU0|kR;oN*~py*iAOU`oneE~WXqtK_*WW`RfdDF&%fPp ztF~HXhDv$v1ap`LotpH57Fj~$<{1KpW0?KXFC~S7iG_coV55nuKY|{NsF$98bVSy} z>4(VPk^l0q2g(A#i#&;w#~6ygGT$xT=0ZvMuIbs5@LKUr4PL-Z^yba5C?;2(aVe>} z>VC7lqfF8P(AF6?gd3hS$KyLx()Ra=CA2~qOfBmqyAWVw5MW>XVgHX?Lrz2S6_3h#TV;ef#BH?Gk{Ha&LnG!TegL453uqB(0X2d5ds0%g){vfl zS5)Ir8rL>MZQWNioMCH&-=wGC8$xJrMIe;?YNJHqtb8{rR-eV(>t9ai(G_iPsNg{= z_%*UNp|uiH?d&mI^z{8yiGlplDp{38c$WVbrb)QkA6slO?^m{l6fVXHKj z>4ica7+V%?B(?1Y{BuK8{AH$#3+K1@edY#YVt#uKBMfmRqI8pjbmsZR?E$q_Cn0$j z7%@$)STuDdUnH7L&|9}kKGlgR_5N_`izUIy%t4$az&Jn> z%tWQN4N~jt)%uALgP}^e)xvi&AZ*!dTMa(x9dZ8o7W-pz0I%`CMTjyeKj>C4D9;-g zcIdU%Y3({RMV(FAFRVgFId%IN+ptem;9p1SZJmXu`cp`}V`KHRLPywC3=5M7-tN3w zV={pIFZOJhxJo+rk#og#pP+XCZI`4}l?pqjc((;}r*XX{f%LEgw&%dZ>FGN|029{| znQrOtY}5bmw`~zh1%D7YrExjXgp=5G+6L289cIYkEZc?M1mQJS#+bxsvI9Z9{XPk5 z^y|oHEWE8cA#ChAVO1do{C9~7%C}KTCEwXHT41aMY#@EV4Yo6`ME|@+A$E>v!8E$V zn7=qAIy@f}?BIZ4?>>b3Jbi6kHs(C&*3L)tz3MbHwb+x(+UUwyXp zY6l;*NF&qVhor#Ts_+JV98%zHC}2XC`VK#j>t{rI!w}cQF&DEpf7~=T2d0pqgHzc{ zX`DX{ZpMuCPe9qL#dn~5M#Xb=`5nUjF~hQN1>0j5sFQNrFJ&1Yx6$5O;>Hjd*}xED z*W4H0ub(pZ5s#VI@zhXyya3c-*SJ+3yoX$nFu&VVBhdSB8|usrd*3JSU5S3Umxw|a z(u-K3RQzwmITg=gg*vM93hLB3RF(B5OC(X9of>ijv86d&Bky{ys@XEf6<^HyL2$ej z0+>hma-s@%cOR>&YpSm7itcLm z%|hDbuT}S3ETLQaNtePJ|3i#+Tnrp4{Yyagma$GoLG>rD_R8R;u)(`G?#yn#zIk6fSrMjva8BYDBE_G}jFy`Aqvx+(I$ zN+KCIbZs|p&Ma$=Q20OA&I7)xBKzZ^M5BT)79vj)wMUQk;pS3QtVUewZ6nrSpiw92$ZzrB)3`M?j8b6oDg>1zbHv80WYN&kE zkKRoD1W<2sVO)Ay{J`To9Z#ub?+M17@mjsGU;}Gh-T{xx|D0JVC;?c!Jav3?`rtG% z?=Fd98|h`~qh)!fg8K$G)Z1P+@m8RRG^DvPldVEBpPWpSs#MXo?G4Rs+vaVB-s(+V z_yF?mO=b81=NRTM#uX3ZT_4nsIJ?5TctOtgR8a=5UM8;Ye~XNuJ8xNrxa4iz5rZqd z2j9{F=uQz~`eVr%lycUn(s|;mj_qmDX+qIn4=c@+lUOa(jN349*vGDIqblV0K6_I@ zd4f3qT~!+1{a}9TYo1i2BN0|sYvsaXeN0*pKoD7sJBdQ<2US9gaRPPP+X1LlD{N?N zFx@RYGqgynNGt?Qwl$O!D}(Vw2dTNsw4B{lzd*BrnE~4jk|FDadz3kAM=mi*Eu*Er zZEZbHVh44c;bACL3=ZOn1b&tl#5l`WxR+`qV!E7-$cK`Z z$aEuI%T1icSHcdlOt~u^^+?dG(Uv;BzpeM9xbw|q`!(9i$D3QY`p>NG?VY&L+ zYN}1Sk*L|HI4j6q&Rss;Rk7o{eE7f~SsmQvUN_mI5^Ml;V4s)NgTxM7ulHdu; z)l|D95=;po1^Aw+PcOcypBAF-*ViH7mVqm|p1JuJn*F{jE1y>BC&w%P65aTi*JIUS)_m znjKu~ja2&IE-jCCn9{-i0HqU3PYLrm|E=^BVVd)QN{e?@jBZAr7NF40p-Xh*(q((Bc8}2`DD@rBaD9ouQYW}`V-ktw!LqdC{cX7cF zBBggWAbTXLA8CDL1O9;OYd0NDPG*I27^*1z!?9s@^!`?N?f zfIxxKP++9u+QYp!UotX`h72PW%^vPwMX}sC){wrg_XHqQYaF#ks}@z6&v-Yus^h3S zx*_9=2?TJ+_760fP+j>A9n?Rppng=ZU#^~a@GEAIW2yf!(8wkqe_6EUIrU_nqxEt) zB(t17IpBvG=Bdy8KiXvfWCn~VzWGU6TlIR3*#pyjU3=N_CC7KlIkQ^v#c!_U*pGM7 z6z9r@^ZC6sZRzj4uZI4(aDnT^t{}NyU;W&LF}a5lq3iV>@@-z6bG>vDp?E?cUSBj^ zK7uBNcLPSxHnmy<(Z-$18)U2Teu_s|yKzmD+(!(I#5|I1JuFA8{iH2<4b=Mcs}5N_ z>{|L5B9l(Mvmt!no&AV8@Jr4i=~=lYG!%ANR=tA{RyrGGfCT}s@oV~MzVJ^ z1(b6mzurl=*~UJ2;dR-Hd6X{q*}#BzbooY~=TQYamv4a)rY^dagZ)qTzH~15=CSlo zHm3G^khgrEYa^nn@~^bMJj<5KlOP~mtFPWb^Pz9O%dYQa0fiC*&4bh5X2*nN$Mof~ zYi^P6!y*c_@aZ08eeVgn7Q?p zws5e}J4>03B!Yf~Ys<&Gg#|a68cHG4Xn#Lmn;#q^Z8Y-#0Z(jR$$9s8zwg4ws)BNw zN3@x_cKr0Vej%`zYhv(_#0M!Y3Y7Vq5c!|vWiYuq_IZ>+WO7k^nc%e%e0Baea++Na z+Sz~?k!|XGP|{fhfXSj9B)|}C#jS%e#NVD3G@aLf(Z9(^=kU*-FSdDsmG00&tPs2W zXN*t?IQ!F{h84T8a$tVY3*I87_i<_Ezo_(aP|5t17ra)bcMRyHZJEr&yt{a5(=C6J z=xLERT_V8H6dDVQH+4l$^J7alI=LOVF;lF-FvuL-&TH@3o1;_Uw_EddM%fN~pY1UM z0(~A32p+@b-yyc)Id&L#)3=%*L|PEE@vTZ zkxrYP0)tb)Akoz0&Jp^leqTRkqOZo-WfzLrZ;RNO(sC7~e!?G$L*?pcHwwuCp+GsJ zTiBfy7f^o=raqE58AV(w&>n(zpduKo822$qs zg!(x3amc1}j-z-&eVUaA9o8v!m@nsDL;r>#GL{Q~ZelBA-B0{dUijKdxGOu$y;J8n z16Hn$+p}YhgRG^(o#JDGYO%`isHqviXzwiUN(y3q<*{VVX4biT*P?UrOI)l^xW|(3 z^tQIb9;$m4-VHN@HeC=m2xsmMkm4nX)eW1%cx-pxbrk(uU?+HL(_g5MFDSuacsVR^ z(Z2x(zL10$1B&Qhsxs==%}_pEWLpObfn_hUg6@rK%CYRc9Xepy(@z$$?C;brX4y+n zqnKqIZm#Ya%Vy}8iIaW%x751XeJa-r$CBSw8W}a_lzUG=dyU;8%SLY9o^T#58OsK( z60&R#RL`;O%RgD?x~OxPT%2Q>MV8MeQxV!gF1=4@1TC68!q$g7;MJkvSlr>^!rRRX zpVY5)?u}S#TjN#f+e_8CO5+tf9VPnjndtMxtnkTLW2-fULmw`=QT|?lYKk#atFDTA za8rX$`t^Jn1cJqgi~5omG_2pS;d2e4?nha}rz#OD!g1EHQB@7k-KsrNcY;-Fc=E<- zxcb|kT6!Qdd;=c?%TabI*2gKyP?HHQ9t9%)@s7cjl-`npEGRmjEN-)WKLWNf8?G38F6-%3I+>X^Fr1sph3(Id%`MA%U;%l&6$uV z^raudDbUCoau#Tm!6&+C@Kdd-T^VZ}L%m`FUho%D(Om-kLte}MGJ#ZuEi*qP(7s1| zx=yfng-o7k?+Vp*JnxDxti8mjUAshbJS(l)ud}N!DAb)P{qYk9WnGG!959H6(+lOW zaGhM~`Rfpfe}`pHM4xY{SKHDIe6xU)oOhsaiS$1-|Sr(V(Od%m_)#C|V^;;~l&?{5om(Xu# zjgLvr-E>D>V$qM)KEIruAZ|XDZX>3}eYb=J(1;4Z3LxhHFZ5b@=eNA478ZIBDlwle zg66@Bzd$SVuH&_gv9Y_%zcBbBYKKE)2kQh1PW}IeHs*^w$lUNe2Q$FtgY2e9(p)$v z)+FxAC2)D=+#R@{@K2;Qjyinj>$;jk-y{3y5eQNUd+Jv!?B1-Uo)ow<*+&XM{<6X# zv)c75;$%025*>J!a)jxaNOR`LT>@H#eGoF{H|e1cdA05>$7K?jgnt0%ADl^>h@fCZ zxG_NsjhWgOR>7UcsJ|dLh;U;ntABYTh>BErw-TMUfvaHL-vet}JnruT^kO@6CGUc9 zpMla={cNCovrO-6FXLcZEcvVwXwtPPPkM%J#JRXvpmgC7g6}jGSn*8L96FyFFkC0A zmQj&@rFKQ7SoTuG$XZ~G#DjksRMT{lGVF3W8ecKA3Qh1&bfqEvRzv!E8z5LNm$4}K4o^jf zU2E{ERx|9~1H$;Pq$U)=~S%o zLwzzi44=J0LS}d8$1uCkkO<=J98{2D`!w4>Fa=deVo79O`Y5$Rdg?!eO^B{9+X8)M zv&-+izN}VTuXKHx+h;TtkFmsmpCdsay>P8B`~DGhQSEuLsyRfG|_Q-tyYjvJhY^>1mF+cl5fpnGz`22n}#()N@ zlWLfs@Adqh6kgBn>{XJ3Gu)fTX@SsIOe3;D=9iu2_yyZIuO~k=73K`=VS$c9cVZQr zu2-MeMHLr%$5BTVc5$MYHWSqD4V>?ZZi=W$aBsyOWIzpfx5*ins4LIg$jLPp+T+Y+ zY1G$L+uiOkNbuZV=Epk0OQK%ZLg}fi$TOPVw2yrfts)%s8q$y3CR{z)=I#{sdfuPFpY?EdCE~SWzJl;hh4umT z?=}A&+2l2BQvf<5Q@$wBgD||a1Y=n23;&mv2=DMEOE%6YGDAk|I8yRz-X=2pvayMT zVq5TOo;m0X+veqH{YABMA`grO*jVxzD=kMUQ@ya0!4>~i) z@>uc=q8HprxD1KVJUVbumtCoOFveXZV$V;jRb>mX#X1VzLPa?B0htL9zrIEvD>{u* zgG0`*Ny2Wmi9S}utu~zk&a=JU27t?;wU}-kx9=1U=Z&$_7PyV+FC;SVl99xgb2Nju z88Ekzxc$<`=NlR$K38~s*U-*jB+JG+b%#w55$?8EeluDz0Z2gE;;Bp>o5nj5fU z0Nz?40r+tp5^iHexwr6vU@Q+pvKfOK@yjl(on1Y{3i~#Y&|Xq==#4&ShAhK2zl{dyj=G+y37B1lGPs2 z7l5}|q}{i=)I026xh@W?<7-sI_8A0C4}zXE>}}zG!Li$m;70|q@uQ@PwmJAf=7(%$ z-)FuUv4;|PM+Z+~{`e%Ov2hsH>NCZkrK{$xLV@L!hhE)`C`-L7M&%|dqxva}FN1oY zl_5g?do6uSEo@J}sqyhI(xipnk<YA<0I zfj9T`9H4=ehQgf#3ZKNZg-c6}i$~K&dqCr<5Kx#<>bKrccjqW93tYVSveDiZQ{Cfj zM-*Nc{z2iTZ>s;RDglMRzfae`+1HNNq#Nx?yck)~2klc!cz|NJ8(EfmeU5hm&gR9| zSTb&zIZP64%jOE$I;vnz$LWjO{d|2p-L2;p44=V*ocT`KpGH7}6(2!2$Bjf&bc6AM zcM%&Ym_*&c@QS-~!yCk4x`-J~)qksl@8;YMyC279V;#4(6_qXT$@$}tGakU#lfDbB z?I&Y$*48}eJt)C27Dedyr0sA7wiTla%uDfyI<_XzUL2t>;a#x&K!iS6ejq}B7~X0_ z|L*-kot@@Ngn{xpv@dYK6)3;U8j1{}eeC`Q4tJp)sl#j$SL;Q4B2c*jpf`2s-!UxV zduv(OH1Y&N@+r<1MqL|yXJ8Jk04%?dz84RO-D$D7Ywt0y?P&4g9YQ?~{Y!_xuCBeL zgd4TWy`$lQQPC|ve1#)bOv4EPmEvC^Un^6+4yxyTq^pn37t4DzoTX<3D-&l=1yC^8 zYEVuGD-%Z=wxv(MCaexnBE;$iXqSi89RMiCsxK!+gw@5+Eka^b3zbX@1!mo!n=ruxFQ@% z3zw73^|^d2jo!%B*0zooZTPlZipTPfZuh2pa%?KRBe~Dd00q)q8B1O#k9fp*oT8)e zaGatQJUuJHyt&pq=CJ!(i@2RP9EYXzLHE^dM}anVe~H?v6v^_t{gk@R2T&U!g}Pjk z=d?`s{Br|m%bYBA`=6boZWs1AO^*{gy8>VLGD}{#&N8k8@7+0o<{(C%h>>p@Lx;4i zJeGQ!$7q702eYhtK#@ep>Y4Zg7Dyd+ltjpdOdpX($Obz9xAOLUediF!iR9ad+`NYi zvS8UwWVMT?z8*wVVFA%pR<}UTt(v_W@W*^P@yBfGECC^|>fL%{#-6;hwK5zrTPv${eePxxD5xvZiUeoN zO7$)xw>f@C8q|_dg3Zg_+{zX5aAV#TJNZ5BUF{QWRPnCCxewRMCRwPp^o5t`p{Le9=P#HcL%KnlU6))jnJwoDr`rklB{Dm&M;?3uc{}G8Cj7;e{ zFBZ^bPFEwvNZuB2lKu^(if}pcSvf5U9lv||1sO(}g{B@`)k5Q@>ec${l^qAxML(yQ zQjwHeFxev3l>OvLNTXnt$_-KdGXLe*EFi=(X1Uj$-Y7WYA5M>0nES!sXkpNODcol_ z1$ydVY_B1VUcVl_PKTvMtX6x?lYeJXe2)Oi)-WmR{M1!6sIL%Pc6dg3E%Xki5&tmY z6VtLT?7<7`!j<-NwpXJPgFsB7oc{*DPs;tH!JK$x%L*`BafkG#r(F{Rh#D1v?)C>k z@AW)l9RrA|L=vuc|aX4M_-L0O!~A=QV4JS)8K?(ia4dNkn-j9zORgj+Ik~FVnpPM({{DIa7R=`r z+RxP9_zWAq`>|YzRgN-q0?;E z=AP(;buV_}_r%i676$7TiShC@!@v`CN?oH$6Wes<%hau9WN{&IHCRNLH^xkF_wAkO z9Ud$wZ2oi?Cp9+VTnxEZW_){YpR91uYJYrh&?#?|Jp z+va$*({=FZaknnxZKcGgh(lHrV;S(E+nvsjx~+F|r2Taegt)nY{_I}_Y_|9DwbVb2 zP01#HGXHPz#ykmsReQbAjSADF*9*8@M#lFE%YMPTO&|{7rGbFZ-j!BXGUgL&w+WbD zpA)^#whzItS0G_4uJB*X3>1ESHjry5DHmFmBqH`ePegfxKiJS&a|A!|Anv-xscE@C z+SU*kdROzt|0fAWr7l+D93=|WX^`8&Y@(k%RSLTX3cF&W@-^~b2sJyppl2%%^4=%g zfgJM(LGA^X#{Wni&$!xAEHG^E2fmh#+;Hcdd}aO6?w?%Hkwc0)a#d)oh5t%)WYZaW9f2@c{y}&zP0thCudfQl_Kv{kaIPu-|5F9N z?lHDSv-^17a{CRJsDyI-dwYc~X1tncjW71b)2`n~)~c82DJ}Om*FO9ZESez|JvPsR zPOV;H-FO3Aklo~HT39cr8#;#hnx{s8ziGZ&Fz*%<`UvZj*{Gg}wVZ&f$&AQi_Es zAKw1zyvd0o%yF`_JFO|U)sM*9*E5(PCy!Hutgn5H3q+w$LmS)#|bhP;=%{ibHRsFmzJfrjfXI?+r9(K7`P zTchA%DS~)ID@ScY>;zWiRtmLIsh`6FC=uYUES|wjzvQ8BM=ph1)LUnhh%U37v4OCRc9!z&kqoU%KRd zc(9^|t)?^+Hs`&ft|mv`$Cpcd#P2|SbV*dff^t$d2B&ApR9n!wDi?LNUb1O0uZLl< zd3sUQm2aCwOU2W@(~fsh*GgeQbc6jW%j@MP>PQfEJquKdJ37SP6-v{&)(M$`A~8Ho z8R0k}-RBg}b+${lv=NUwFB0}(SzbxZ*l}d5W+gleBVkHAqxG+;8skEX?f=Y-%4T2? zR?B-%!2us0UfA)R)ebV3IewjEH-uyj2khlGY-^%1p@WYXe0q4$w0Y}49 z)D=C{2{Sz`FBX=4tQchBfD;bUD+cx8X?aky8y=lE3ik;y`u)T12H+@fe%DL!9QKiq zl^J69RXq;*o2t8PBMnu2Y@aLGj@#Gf+4Z=uo5lb*i2)zJm(UY+%$yvRWxs& zKV0;t@Y)o`Z!)Y99jR^=+^z7gAd?v)J}z(k=UBcpTi`#*lg+KTLHrE|K!O&0>R~0wszxfNl97eDk)Nh|F{Z-^vdocVy(aO{k-mxh)03m zPQBPQ7ffHSu-$dDy_CcA~O?J`a1e5GtHuj(4oKQ?5J>fMJ+HX;Cj@YfM(Rqn4sZ^sqemy&jC*S9@mBj+@mT@jx|sd?I0wY2KlSXO!%oiXXtNFF6YTP3u&G}EV~GlB1{Y~ z_0pj<^u5?lRHNeGU|K@f2bAlkH^$B3l z=L2*2Tn7x-(zE%QMO4U8N<_5R*%!l-PA46p{S29f4v&cwowr=>Ul^cZHs62kQ=^#* zRd|O5g)0273XLKC9-RI$63y&9*?`@Pb;)q?zmS@{EngL0w+Lcm5yb4Yd>DO7_)qYo zk;s7M#N=Ad$3ks^a4joT`+&Q-Lo2fA?&vvoRj-bd2;Xes2mc>y@FGz-r>}d zJ%vUl6aF2}&k4V|qLu!StO!{+$N$3ChM zZnqBUn zB+CL67PGj6wXWiTQMFYdLX+vD5Q1z;XKr%_Fw@2A44XBAjk#^!&;gxFTnKM}0L4

    ZwrN{?m3EDakpZ}F~nlUidN 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 z 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

  1. hsL%(f= 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

    } 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 l;j~+L@H3 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 z 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%0D%I8??~(tVH85Mvl*ZuFcG2cIhjrq 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%0D(eJ(M{w9x;#baAi@rYhYIYG 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


    qYNRe3BxX8F4_*6@ouup-M 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�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

    UrLl@Uyn4va)- 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 |@KQQh4Ckl`mKVzR=beE#S>Y>I2@JNrE3Swia*~ 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

    VFPDS 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 z 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 mapping) See + # Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; # for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; # to support weakrefs to code objects */ + void *co_extra; + +cdef extern from "frameobject.h": + ctypedef struct PyFrameObject: + PyFrameObject *f_back + PyCodeObject *f_code # code segment + PyObject *f_builtins # builtin symbol table (PyDictObject) + PyObject *f_globals # global symbol table (PyDictObject) */ + PyObject *f_locals # local symbol table (any mapping) */ + PyObject **f_valuestack # + PyObject **f_stacktop + PyObject *f_trace # Trace function */ + PyObject *f_exc_type + PyObject *f_exc_value + PyObject *f_exc_traceback + PyObject *f_gen; + + int f_lasti; #/* Last instruction if called */ + int f_lineno; #/* Current line number */ + int f_iblock; #/* index in f_blockstack */ + char f_executing; #/* whether the frame is still executing */ + PyObject *f_localsplus[1]; diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pyx b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pyx new file mode 100644 index 0000000..0841fd2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pyx @@ -0,0 +1,1973 @@ +from __future__ import print_function + +# Important: Autogenerated file. + +# DO NOT edit manually! +# DO NOT edit manually! +# Copyright: Brainwy Software +# +# License: EPL + +from collections import namedtuple +import dis +import os +import re +import sys +from _pydev_bundle._pydev_saved_modules import threading +from types import CodeType, FrameType +from typing import Dict, Optional, Tuple, Any +from os.path import basename, splitext + +from _pydev_bundle import pydev_log +from _pydevd_bundle import pydevd_dont_trace +from _pydevd_bundle.pydevd_constants import ( + IS_PY313_OR_GREATER, + GlobalDebuggerHolder, + ForkSafeLock, + PYDEVD_IPYTHON_CONTEXT, + EXCEPTION_TYPE_USER_UNHANDLED, + RETURN_VALUES_DICT, + PYTHON_SUSPEND, +) +from pydevd_file_utils import ( + NORM_PATHS_AND_BASE_CONTAINER, + get_abs_path_real_path_and_base_from_file, + get_abs_path_real_path_and_base_from_frame, +) +from _pydevd_bundle.pydevd_trace_dispatch import should_stop_on_exception, handle_exception +from _pydevd_bundle.pydevd_constants import EXCEPTION_TYPE_HANDLED +from _pydevd_bundle.pydevd_trace_dispatch import is_unhandled_exception +from _pydevd_bundle.pydevd_breakpoints import stop_on_unhandled_exception +from _pydevd_bundle.pydevd_utils import get_clsname_for_code + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +import cython +from _pydevd_bundle.pydevd_cython cimport set_additional_thread_info, any_thread_stepping, PyDBAdditionalThreadInfo +# ELSE +# from _pydevd_bundle.pydevd_additional_thread_info import set_additional_thread_info, any_thread_stepping, PyDBAdditionalThreadInfo +# ENDIF +# fmt: on + +try: + from _pydevd_bundle.pydevd_bytecode_utils import get_smart_step_into_variant_from_frame_offset +except ImportError: + + def get_smart_step_into_variant_from_frame_offset(*args, **kwargs): + return None + + +if hasattr(sys, "monitoring"): + DEBUGGER_ID = sys.monitoring.DEBUGGER_ID + monitor = sys.monitoring + +_thread_local_info = threading.local() +_get_ident = threading.get_ident +_thread_active = threading._active # noqa + +CMD_STEP_INTO: int = 107 +CMD_STEP_OVER: int = 108 +CMD_STEP_INTO_MY_CODE: int = 144 +CMD_STEP_INTO_COROUTINE: int = 206 +CMD_SMART_STEP_INTO: int = 128 +can_skip: bool = True +CMD_STEP_RETURN: int = 109 +CMD_STEP_OVER_MY_CODE: int = 159 +CMD_STEP_RETURN_MY_CODE: int = 160 +CMD_SET_BREAK: int = 111 +CMD_SET_FUNCTION_BREAK: int = 208 +STATE_RUN: int = 1 +STATE_SUSPEND: int = 2 + +IGNORE_EXCEPTION_TAG = re.compile("[^#]*#.*@IgnoreException") +DEBUG_START = ("pydevd.py", "run") +DEBUG_START_PY3K = ("_pydev_execfile.py", "execfile") +TRACE_PROPERTY = "pydevd_traceproperty.py" + +_global_notify_skipped_step_in = False +_global_notify_skipped_step_in_lock = ForkSafeLock() + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _notify_skipped_step_in_because_of_filters(py_db, frame): +# ELSE +# def _notify_skipped_step_in_because_of_filters(py_db, frame): +# ENDIF +# fmt: on + global _global_notify_skipped_step_in + + with _global_notify_skipped_step_in_lock: + if _global_notify_skipped_step_in: + # Check with lock in place (callers should actually have checked + # before without the lock in place due to performance). + return + _global_notify_skipped_step_in = True + py_db.notify_skipped_step_in_because_of_filters(frame) + + +# Easy for cython: always get the one at level 0 as that's the caller frame +# (on Python we have to control the depth to get the first user frame). +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +@cython.cfunc +def _getframe(depth=0): + return sys._getframe() +# ELSE +# _getframe = sys._getframe +# ENDIF +# fmt: on + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _get_bootstrap_frame(depth): +# ELSE +# def _get_bootstrap_frame(depth: int) -> Tuple[Optional[FrameType], bool]: +# ENDIF +# fmt: on + try: + return _thread_local_info.f_bootstrap, _thread_local_info.is_bootstrap_frame_internal + except: + frame = _getframe(depth) + f_bootstrap = frame + # print('called at', f_bootstrap.f_code.co_name, f_bootstrap.f_code.co_filename, f_bootstrap.f_code.co_firstlineno) + is_bootstrap_frame_internal = False + while f_bootstrap is not None: + filename = f_bootstrap.f_code.co_filename + name = splitext(basename(filename))[0] + + if name == "threading": + if f_bootstrap.f_code.co_name in ("__bootstrap", "_bootstrap"): + # We need __bootstrap_inner, not __bootstrap. + return None, False + + elif f_bootstrap.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner", "is_alive"): + # Note: be careful not to use threading.current_thread to avoid creating a dummy thread. + is_bootstrap_frame_internal = True + break + + elif name == "pydev_monkey": + if f_bootstrap.f_code.co_name == "__call__": + is_bootstrap_frame_internal = True + break + + elif name == "pydevd": + if f_bootstrap.f_code.co_name in ("run", "main"): + # We need to get to _exec + return None, False + + if f_bootstrap.f_code.co_name == "_exec": + is_bootstrap_frame_internal = True + break + + elif f_bootstrap.f_back is None: + break + + f_bootstrap = f_bootstrap.f_back + + if f_bootstrap is not None: + _thread_local_info.is_bootstrap_frame_internal = is_bootstrap_frame_internal + _thread_local_info.f_bootstrap = f_bootstrap + return _thread_local_info.f_bootstrap, _thread_local_info.is_bootstrap_frame_internal + + return f_bootstrap, is_bootstrap_frame_internal + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _get_unhandled_exception_frame(exc, int depth): +# ELSE +# def _get_unhandled_exception_frame(exc, depth: int) -> Optional[FrameType]: +# ENDIF +# fmt: on + try: + # Unhandled frame has to be from the same exception. + if _thread_local_info.f_unhandled_exc is exc: + return _thread_local_info.f_unhandled_frame + else: + del _thread_local_info.f_unhandled_frame + del _thread_local_info.f_unhandled_exc + raise AttributeError('Not the same exception') + except: + f_unhandled = _getframe(depth) + + while f_unhandled is not None and f_unhandled.f_back is not None: + f_back = f_unhandled.f_back + filename = f_back.f_code.co_filename + name = splitext(basename(filename))[0] + + # When the back frame is the bootstrap (or if we have no back + # frame) then use this frame as the one to track. + if name == "threading": + if f_back.f_code.co_name in ("__bootstrap", "_bootstrap", "__bootstrap_inner", "_bootstrap_inner", "run"): + break + + elif name == "pydev_monkey": + if f_back.f_code.co_name == "__call__": + break + + elif name == "pydevd": + if f_back.f_code.co_name in ("_exec", "run", "main"): + break + + elif name == "pydevd_runpy": + if f_back.f_code.co_name.startswith(("run", "_run")): + break + + elif name == "": + if f_back.f_code.co_name.startswith(("run", "_run")): + break + + elif name == "runpy": + if f_back.f_code.co_name.startswith(("run", "_run")): + break + + f_unhandled = f_back + + if f_unhandled is not None: + _thread_local_info.f_unhandled_frame = f_unhandled + _thread_local_info.f_unhandled_exc = exc + return _thread_local_info.f_unhandled_frame + + return f_unhandled + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class ThreadInfo: + cdef unsigned long thread_ident + cdef PyDBAdditionalThreadInfo additional_info + thread: threading.Thread + trace: bool + _use_is_stopped: bool +# ELSE +# class ThreadInfo: +# additional_info: PyDBAdditionalThreadInfo +# thread_ident: int +# thread: threading.Thread +# trace: bool +# ENDIF +# fmt: on + + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + def __init__(self, thread, unsigned long thread_ident, bint trace, PyDBAdditionalThreadInfo additional_info): + # ELSE +# def __init__(self, thread: threading.Thread, thread_ident: int, trace: bool, additional_info: PyDBAdditionalThreadInfo): + # ENDIF + # fmt: on + self.thread = thread + self.thread_ident = thread_ident + self.additional_info = additional_info + self.trace = trace + self._use_is_stopped = hasattr(thread, '_is_stopped') + + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef bint is_thread_alive(self): + # ELSE +# def is_thread_alive(self): + # ENDIF + # fmt: on + if self._use_is_stopped: + return not self.thread._is_stopped + else: + return not self.thread._handle.is_done() + + +class _DeleteDummyThreadOnDel: + """ + Helper class to remove a dummy thread from threading._active on __del__. + """ + + def __init__(self, dummy_thread): + self._dummy_thread = dummy_thread + self._tident = dummy_thread.ident + # Put the thread on a thread local variable so that when + # the related thread finishes this instance is collected. + # + # Note: no other references to this instance may be created. + # If any client code creates a reference to this instance, + # the related _DummyThread will be kept forever! + _thread_local_info._track_dummy_thread_ref = self + + def __del__(self): + with threading._active_limbo_lock: + if _thread_active.get(self._tident) is self._dummy_thread: + _thread_active.pop(self._tident, None) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _create_thread_info(depth): + cdef unsigned long thread_ident +# ELSE +# def _create_thread_info(depth): +# ENDIF +# fmt: on + # Don't call threading.currentThread because if we're too early in the process + # we may create a dummy thread. + thread_ident = _get_ident() + + f_bootstrap_frame, is_bootstrap_frame_internal = _get_bootstrap_frame(depth + 1) + if f_bootstrap_frame is None: + return None # Case for threading when it's still in bootstrap or early in pydevd. + + if is_bootstrap_frame_internal: + t = None + if f_bootstrap_frame.f_code.co_name in ("__bootstrap_inner", "_bootstrap_inner", "is_alive"): + # Note: be careful not to use threading.current_thread to avoid creating a dummy thread. + t = f_bootstrap_frame.f_locals.get("self") + if not isinstance(t, threading.Thread): + t = None + + elif f_bootstrap_frame.f_code.co_name in ("_exec", "__call__"): + # Note: be careful not to use threading.current_thread to avoid creating a dummy thread. + t = f_bootstrap_frame.f_locals.get("t") + if not isinstance(t, threading.Thread): + t = None + + else: + # This means that the first frame is not in threading nor in pydevd. + # In practice this means it's some unmanaged thread, so, creating + # a dummy thread is ok in this use-case. + t = threading.current_thread() + + if t is None: + t = _thread_active.get(thread_ident) + + if isinstance(t, threading._DummyThread) and not IS_PY313_OR_GREATER: + _thread_local_info._ref = _DeleteDummyThreadOnDel(t) + + if t is None: + return None + + if getattr(t, "is_pydev_daemon_thread", False): + return ThreadInfo(t, thread_ident, False, None) + else: + try: + additional_info = t.additional_info + if additional_info is None: + raise AttributeError() + except: + additional_info = set_additional_thread_info(t) + return ThreadInfo(t, thread_ident, True, additional_info) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class FuncCodeInfo: + cdef str co_filename + cdef str canonical_normalized_filename + cdef str abs_path_filename + cdef bint always_skip_code + cdef bint breakpoint_found + cdef bint function_breakpoint_found + cdef bint plugin_line_breakpoint_found + cdef bint plugin_call_breakpoint_found + cdef bint plugin_line_stepping + cdef bint plugin_call_stepping + cdef bint plugin_return_stepping + cdef int pydb_mtime + cdef dict bp_line_to_breakpoint + cdef object function_breakpoint + cdef bint always_filtered_out + cdef bint filtered_out_force_checked + cdef object try_except_container_obj + cdef object code_obj + cdef str co_name +# ELSE +# class FuncCodeInfo: +# +# ENDIF +# fmt: on + def __init__(self): + self.co_filename: str = "" + self.canonical_normalized_filename: str = "" + self.abs_path_filename: str = "" + + # These is never seen and we never stop, even if it's a callback coming + # from user code (these are completely invisible to the debugging tracing). + self.always_skip_code: bool = False + + self.breakpoint_found: bool = False + self.function_breakpoint_found: bool = False + + # A plugin can choose whether to stop on function calls or line events. + self.plugin_line_breakpoint_found: bool = False + self.plugin_call_breakpoint_found: bool = False + + self.plugin_line_stepping: bool = False + self.plugin_call_stepping: bool = False + self.plugin_return_stepping: bool = False + + # When pydb_mtime != PyDb.mtime the validity of breakpoints have + # to be re-evaluated (if invalid a new FuncCodeInfo must be created and + # tracing can't be disabled for the related frames). + self.pydb_mtime: int = -1 + + self.bp_line_to_breakpoint: Dict[int, Any] = {} + self.function_breakpoint = None + + # This means some file is globally filtered out during debugging. Note + # that we may still need to pause in it (in a step return to user code, + # we may need to track this one). + self.always_filtered_out: bool = False + + # This should be used to filter code in a CMD_STEP_INTO_MY_CODE + # (and other XXX_MY_CODE variants). + self.filtered_out_force_checked: bool = False + + self.try_except_container_obj: Optional[_TryExceptContainerObj] = None + self.code_obj: CodeType = None + self.co_name: str = "" + + def get_line_of_offset(self, offset): + for start, end, line in self.code_obj.co_lines(): + if start is not None and end is not None and line is not None: + if offset >= start and offset <= end: + return line + return -1 + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _get_thread_info(bint create, int depth): +# ELSE +# def _get_thread_info(create: bool, depth: int) -> Optional[ThreadInfo]: +# ENDIF +# fmt: on + """ + Provides thread-related info. + + May return None if the thread is still not active. + """ + try: + # Note: changing to a `dict[thread.ident] = thread_info` had almost no + # effect in the performance. + return _thread_local_info.thread_info + except: + if not create: + return None + thread_info = _create_thread_info(depth + 1) + if thread_info is None: + return None + + _thread_local_info.thread_info = thread_info + return _thread_local_info.thread_info + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class _CodeLineInfo: + cdef dict line_to_offset + cdef int first_line + cdef int last_line +# ELSE +# class _CodeLineInfo: +# line_to_offset: Dict[int, Any] +# first_line: int +# last_line: int +# ENDIF +# fmt: on + + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + def __init__(self, dict line_to_offset, int first_line, int last_line): + self.line_to_offset = line_to_offset + self.first_line = first_line + self.last_line = last_line + # ELSE +# def __init__(self, line_to_offset, first_line, last_line): +# self.line_to_offset = line_to_offset +# self.first_line = first_line +# self.last_line = last_line +# + # ENDIF + # fmt: on + +# Note: this method has a version in cython too +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _CodeLineInfo _get_code_line_info(code_obj, _cache={}): +# ELSE +# def _get_code_line_info(code_obj, _cache={}) -> _CodeLineInfo: +# ENDIF +# fmt: on + try: + return _cache[code_obj] + except: + line_to_offset = {} + first_line = None + last_line = None + + for offset, line in dis.findlinestarts(code_obj): + if line is not None: + line_to_offset[line] = offset + + if len(line_to_offset): + first_line = min(line_to_offset) + last_line = max(line_to_offset) + ret = _CodeLineInfo(line_to_offset, first_line, last_line) + _cache[code_obj] = ret + return ret + + +_code_to_func_code_info_cache: Dict[CodeType, "FuncCodeInfo"] = {} + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef FuncCodeInfo _get_func_code_info(code_obj, frame_or_depth): + cdef FuncCodeInfo func_code_info +# ELSE +# def _get_func_code_info(code_obj, frame_or_depth) -> FuncCodeInfo: +# ENDIF +# fmt: on + """ + Provides code-object related info. + + Note that it contains informations on the breakpoints for a given function. + If breakpoints change a new FuncCodeInfo instance will be created. + + Note that this can be called by any thread. + """ + py_db = GlobalDebuggerHolder.global_dbg + if py_db is None: + return None + + func_code_info = _code_to_func_code_info_cache.get(code_obj) + if func_code_info is not None: + if func_code_info.pydb_mtime == py_db.mtime: + # if DEBUG: + # print('_get_func_code_info: matched mtime', key, code_obj) + return func_code_info + + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + cdef dict cache_file_type + cdef tuple cache_file_type_key + cdef PyCodeObject * code + cdef str co_filename + cdef str co_name + code = code_obj + co_filename = code.co_filename + co_name = code.co_name + # ELSE +# cache_file_type: dict +# cache_file_type_key: tuple +# code = code_obj +# co_filename: str = code.co_filename +# co_name: str = code.co_name + # ENDIF + # fmt: on + + # print('_get_func_code_info: new (mtime did not match)', key, code_obj) + + func_code_info = FuncCodeInfo() + func_code_info.code_obj = code_obj + code_line_info = _get_code_line_info(code_obj) + line_to_offset = code_line_info.line_to_offset + func_code_info.pydb_mtime = py_db.mtime + + func_code_info.co_filename = co_filename + func_code_info.co_name = co_name + + # Compute whether to always skip this. + try: + abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename] + except: + abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_file(co_filename) + + func_code_info.abs_path_filename = abs_path_real_path_and_base[0] + func_code_info.canonical_normalized_filename = abs_path_real_path_and_base[1] + + frame = None + cache_file_type = py_db.get_cache_file_type() + # Note: this cache key must be the same from PyDB.get_file_type() -- see it for comments + # on the cache. + cache_file_type_key = (code.co_firstlineno, abs_path_real_path_and_base[0], code_obj) + try: + file_type = cache_file_type[cache_file_type_key] # Make it faster + except: + if frame is None: + if frame_or_depth.__class__ == int: + frame = _getframe(frame_or_depth + 1) + else: + frame = frame_or_depth + assert frame.f_code is code_obj, "%s != %s" % (frame.f_code, code_obj) + + file_type = py_db.get_file_type(frame, abs_path_real_path_and_base) # we don't want to debug anything related to pydevd + + if file_type is not None: + func_code_info.always_skip_code = True + func_code_info.always_filtered_out = True + _code_to_func_code_info_cache[code_obj] = func_code_info + return func_code_info + + # still not set, check for dont trace comments. + if pydevd_dont_trace.should_trace_hook is not None: + # I.e.: cache the result skip (no need to evaluate the same frame multiple times). + # Note that on a code reload, we won't re-evaluate this because in practice, the frame.f_code + # Which will be handled by this frame is read-only, so, we can cache it safely. + if not pydevd_dont_trace.should_trace_hook(code_obj, func_code_info.abs_path_filename): + if frame is None: + if frame_or_depth.__class__ == int: + frame = _getframe(frame_or_depth + 1) + else: + frame = frame_or_depth + assert frame.f_code is code_obj + + func_code_info.always_filtered_out = True + _code_to_func_code_info_cache[code_obj] = func_code_info + return func_code_info + + if frame is None: + if frame_or_depth.__class__ == int: + frame = _getframe(frame_or_depth + 1) + else: + frame = frame_or_depth + assert frame.f_code is code_obj + + func_code_info.filtered_out_force_checked = py_db.apply_files_filter(frame, func_code_info.abs_path_filename, True) + + if py_db.is_files_filter_enabled: + func_code_info.always_filtered_out = func_code_info.filtered_out_force_checked + if func_code_info.always_filtered_out: + _code_to_func_code_info_cache[code_obj] = func_code_info + return func_code_info + + else: + func_code_info.always_filtered_out = False + + # Handle regular breakpoints + breakpoints: dict = py_db.breakpoints.get(func_code_info.canonical_normalized_filename) + function_breakpoint: object = py_db.function_breakpoint_name_to_breakpoint.get(func_code_info.co_name) + # print('\n---') + # print(py_db.breakpoints) + # print(func_code_info.canonical_normalized_filename) + # print(py_db.breakpoints.get(func_code_info.canonical_normalized_filename)) + if function_breakpoint: + # Go directly into tracing mode + func_code_info.function_breakpoint_found = True + func_code_info.function_breakpoint = function_breakpoint + + if breakpoints: + # if DEBUG: + # print('found breakpoints', code_obj_py.co_name, breakpoints) + + bp_line_to_breakpoint = {} + + for breakpoint_line, bp in breakpoints.items(): + if breakpoint_line in line_to_offset: + bp_line_to_breakpoint[breakpoint_line] = bp + + func_code_info.breakpoint_found = bool(bp_line_to_breakpoint) + func_code_info.bp_line_to_breakpoint = bp_line_to_breakpoint + + if py_db.plugin: + plugin_manager = py_db.plugin + is_tracked_frame = plugin_manager.is_tracked_frame(frame) + + if is_tracked_frame: + if py_db.has_plugin_line_breaks: + required_events_breakpoint = plugin_manager.required_events_breakpoint() + func_code_info.plugin_line_breakpoint_found = "line" in required_events_breakpoint + func_code_info.plugin_call_breakpoint_found = "call" in required_events_breakpoint + + required_events_stepping = plugin_manager.required_events_stepping() + func_code_info.plugin_line_stepping: bool = "line" in required_events_stepping + func_code_info.plugin_call_stepping: bool = "call" in required_events_stepping + func_code_info.plugin_return_stepping: bool = "return" in required_events_stepping + + _code_to_func_code_info_cache[code_obj] = func_code_info + return func_code_info + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _enable_line_tracing(code): +# ELSE +# def _enable_line_tracing(code): +# ENDIF +# fmt: on + # print('enable line tracing', code) + _ensure_monitoring() + events = monitor.get_local_events(DEBUGGER_ID, code) + monitor.set_local_events(DEBUGGER_ID, code, events | monitor.events.LINE | monitor.events.JUMP) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _enable_return_tracing(code): +# ELSE +# def _enable_return_tracing(code): +# ENDIF +# fmt: on + # print('enable return tracing', code) + _ensure_monitoring() + events = monitor.get_local_events(DEBUGGER_ID, code) + monitor.set_local_events(DEBUGGER_ID, code, events | monitor.events.PY_RETURN) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef disable_code_tracing(code): +# ELSE +# def disable_code_tracing(code): +# ENDIF +# fmt: on + _ensure_monitoring() + monitor.set_local_events(DEBUGGER_ID, code, 0) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef enable_code_tracing(unsigned long thread_ident, code, frame): +# ELSE +# def enable_code_tracing(thread_ident: Optional[int], code, frame) -> bool: +# ENDIF +# fmt: on + """ + Note: this must enable code tracing for the given code/frame. + + The frame can be from any thread! + + :return: Whether code tracing was added in this function to the given code. + """ + # DEBUG = False # 'my_code.py' in code.co_filename or 'other.py' in code.co_filename + # if DEBUG: + # print('==== enable code tracing', code.co_filename[-30:], code.co_name) + py_db: object = GlobalDebuggerHolder.global_dbg + if py_db is None or py_db.pydb_disposed: + return False + + func_code_info: FuncCodeInfo = _get_func_code_info(code, frame) + if func_code_info.always_skip_code: + # if DEBUG: + # print('disable (always skip)') + return False + + try: + thread = threading._active.get(thread_ident) + if thread is None: + return False + additional_info = set_additional_thread_info(thread) + except: + # Cannot set based on stepping + return False + + return _enable_code_tracing(py_db, additional_info, func_code_info, code, frame, False) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef bint _enable_code_tracing(py_db, PyDBAdditionalThreadInfo additional_info, FuncCodeInfo func_code_info, code, frame, bint warn_on_filtered_out): + cdef int step_cmd + cdef bint is_stepping + cdef bint code_tracing_added +# ELSE +# def _enable_code_tracing(py_db, additional_info, func_code_info: FuncCodeInfo, code, frame, warn_on_filtered_out) -> bool: +# ENDIF +# fmt: on + """ + :return: Whether code tracing was added in this function to the given code. + """ + # DEBUG = False # 'my_code.py' in code.co_filename or 'other.py' in code.co_filename + step_cmd = additional_info.pydev_step_cmd + is_stepping = step_cmd != -1 + code_tracing_added = False + + if func_code_info.always_filtered_out: + # if DEBUG: + # print('disable (always filtered out)') + if ( + warn_on_filtered_out + and is_stepping + and additional_info.pydev_original_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE) + and not _global_notify_skipped_step_in + ): + _notify_skipped_step_in_because_of_filters(py_db, frame) + + if is_stepping: + # Tracing may be needed for return value + _enable_step_tracing(py_db, code, step_cmd, additional_info, frame) + code_tracing_added = True + return code_tracing_added + + if func_code_info.breakpoint_found or func_code_info.plugin_line_breakpoint_found: + _enable_line_tracing(code) + code_tracing_added = True + + if is_stepping: + _enable_step_tracing(py_db, code, step_cmd, additional_info, frame) + code_tracing_added = True + + return code_tracing_added + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _enable_step_tracing(py_db, code, step_cmd, PyDBAdditionalThreadInfo info, frame): +# ELSE +# def _enable_step_tracing(py_db, code, step_cmd, info, frame): +# ENDIF +# fmt: on + if step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO): + # Stepping (must have line/return tracing enabled). + _enable_line_tracing(code) + _enable_return_tracing(code) + + elif step_cmd in (CMD_STEP_RETURN, CMD_STEP_RETURN_MY_CODE) and _is_same_frame(info, info.pydev_step_stop, frame): + _enable_return_tracing(code) + + elif step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE): + if _is_same_frame(info, info.pydev_step_stop, frame): + _enable_line_tracing(code) + + # Wee need to enable return tracing because if we have a return during a step over + # we need to stop too. + _enable_return_tracing(code) + elif py_db.show_return_values and _is_same_frame(info, info.pydev_step_stop, frame.f_back): + # Show return values on step over. + _enable_return_tracing(code) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef class _TryExceptContainerObj: + cdef list try_except_infos +# ELSE +# class _TryExceptContainerObj: +# ENDIF +# fmt: on + """ + A dumb container object just to contain the try..except info when needed. Meant to be + persistent among multiple PyDBFrames to the same code object. + """ + + # fmt: off + # IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) + def __init__(self, list try_except_infos): + self.try_except_infos = try_except_infos + # ELSE +# def __init__(self, try_except_infos): +# self.try_except_infos = try_except_infos +# + # ENDIF + # fmt: on + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _unwind_event(code, instruction, exc): + cdef ThreadInfo thread_info + cdef FuncCodeInfo func_code_info +# ELSE +# def _unwind_event(code, instruction, exc): +# ENDIF +# fmt: on + try: + thread_info = _thread_local_info.thread_info + except: + thread_info = _get_thread_info(True, 1) + if thread_info is None: + return + + py_db: object = GlobalDebuggerHolder.global_dbg + if py_db is None or py_db.pydb_disposed: + return + + if not thread_info.trace or not thread_info.is_thread_alive(): + # For thread-related stuff we can't disable the code tracing because other + # threads may still want it... + return + + func_code_info: FuncCodeInfo = _get_func_code_info(code, 1) + if func_code_info.always_skip_code: + return + + # print('_unwind_event', code, exc) + frame = _getframe(1) + arg = (type(exc), exc, exc.__traceback__) + + has_caught_exception_breakpoint_in_pydb = ( + py_db.break_on_caught_exceptions or py_db.break_on_user_uncaught_exceptions or py_db.has_plugin_exception_breaks + ) + + if has_caught_exception_breakpoint_in_pydb: + _should_stop, frame, user_uncaught_exc_info = should_stop_on_exception( + py_db, thread_info.additional_info, frame, thread_info.thread, arg, None, is_unwind=True + ) + if user_uncaught_exc_info: + # TODO: Check: this may no longer be needed as in the unwind we know it's + # an exception bubbling up (wait for all tests to pass to check it). + if func_code_info.try_except_container_obj is None: + container_obj = _TryExceptContainerObj(py_db.collect_try_except_info(frame.f_code)) + func_code_info.try_except_container_obj = container_obj + + is_unhandled = is_unhandled_exception( + func_code_info.try_except_container_obj, py_db, frame, user_uncaught_exc_info[1], user_uncaught_exc_info[2] + ) + + if is_unhandled: + handle_exception(py_db, thread_info.thread, frame, user_uncaught_exc_info[0], EXCEPTION_TYPE_USER_UNHANDLED) + return + + break_on_uncaught_exceptions = py_db.break_on_uncaught_exceptions + if break_on_uncaught_exceptions: + if frame is _get_unhandled_exception_frame(exc, 1): + stop_on_unhandled_exception(py_db, thread_info.thread, thread_info.additional_info, arg) + return + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _raise_event(code, instruction, exc): + cdef ThreadInfo thread_info + cdef FuncCodeInfo func_code_info +# ELSE +# def _raise_event(code, instruction, exc): +# ENDIF +# fmt: on + """ + The way this should work is the following: when the user is using + pydevd to do the launch and we're on a managed stack, we should consider + unhandled only if it gets into a pydevd. If it's a thread, if it stops + inside the threading and if it's an unmanaged thread (i.e.: QThread) + then stop if it doesn't have a back frame. + + Note: unlike other events, this one is global and not per-code (so, + it cannot be individually enabled/disabled for a given code object). + """ + try: + thread_info = _thread_local_info.thread_info + except: + thread_info = _get_thread_info(True, 1) + if thread_info is None: + return + + py_db: object = GlobalDebuggerHolder.global_dbg + if py_db is None or py_db.pydb_disposed: + return + + if not thread_info.trace or not thread_info.is_thread_alive(): + # For thread-related stuff we can't disable the code tracing because other + # threads may still want it... + return + + func_code_info: FuncCodeInfo = _get_func_code_info(code, 1) + if func_code_info.always_skip_code: + return + + frame = _getframe(1) + arg = (type(exc), exc, exc.__traceback__) + + # Compute the previous exception info (if any). We use it to check if the exception + # should be stopped + prev_exc_info = _thread_local_info._user_uncaught_exc_info if hasattr(_thread_local_info, "_user_uncaught_exc_info") else None + should_stop, frame, _user_uncaught_exc_info = should_stop_on_exception( + py_db, thread_info.additional_info, frame, thread_info.thread, arg, prev_exc_info + ) + + # Save the current exception info for the next raise event. + _thread_local_info._user_uncaught_exc_info = _user_uncaught_exc_info + + # print('!!!! should_stop (in raise)', should_stop) + if should_stop: + handle_exception(py_db, thread_info.thread, frame, arg, EXCEPTION_TYPE_HANDLED) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef str get_func_name(frame): + cdef str func_name +# ELSE +# def get_func_name(frame): +# ENDIF +# fmt: on + code_obj = frame.f_code + func_name = code_obj.co_name + try: + cls_name = get_clsname_for_code(code_obj, frame) + if cls_name is not None: + return "%s.%s" % (cls_name, func_name) + else: + return func_name + except: + pydev_log.exception() + return func_name + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _show_return_values(frame, arg): +# ELSE +# def _show_return_values(frame, arg): +# ENDIF +# fmt: on + try: + try: + f_locals_back = getattr(frame.f_back, "f_locals", None) + if f_locals_back is not None: + return_values_dict = f_locals_back.get(RETURN_VALUES_DICT, None) + if return_values_dict is None: + return_values_dict = {} + f_locals_back[RETURN_VALUES_DICT] = return_values_dict + name = get_func_name(frame) + return_values_dict[name] = arg + except: + pydev_log.exception() + finally: + f_locals_back = None + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _remove_return_values(py_db, frame): +# ELSE +# def _remove_return_values(py_db, frame): +# ENDIF +# fmt: on + try: + try: + # Showing return values was turned off, we should remove them from locals dict. + # The values can be in the current frame or in the back one + frame.f_locals.pop(RETURN_VALUES_DICT, None) + + f_locals_back = getattr(frame.f_back, "f_locals", None) + if f_locals_back is not None: + f_locals_back.pop(RETURN_VALUES_DICT, None) + except: + pydev_log.exception() + finally: + f_locals_back = None + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _return_event(code, instruction, retval): + cdef ThreadInfo thread_info + cdef FuncCodeInfo func_code_info + cdef PyDBAdditionalThreadInfo info + cdef int step_cmd +# ELSE +# def _return_event(code, instruction, retval): +# ENDIF +# fmt: on + try: + thread_info = _thread_local_info.thread_info + except: + thread_info = _get_thread_info(True, 1) + if thread_info is None: + return + + py_db: object = GlobalDebuggerHolder.global_dbg + if py_db is None or py_db.pydb_disposed: + return monitor.DISABLE + + if not thread_info.trace or not thread_info.is_thread_alive(): + # For thread-related stuff we can't disable the code tracing because other + # threads may still want it... + return + + func_code_info: FuncCodeInfo = _get_func_code_info(code, 1) + if func_code_info.always_skip_code: + return monitor.DISABLE + + info = thread_info.additional_info + + # We know the frame depth. + frame = _getframe(1) + + step_cmd = info.pydev_step_cmd + if step_cmd == -1: + return + + if info.suspend_type != PYTHON_SUSPEND: + # Plugin stepping + if func_code_info.plugin_return_stepping: + _plugin_stepping(py_db, step_cmd, "return", frame, thread_info) + return + + # Python line stepping + stop_frame = info.pydev_step_stop + if step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE): + force_check_project_scope = step_cmd == CMD_STEP_INTO_MY_CODE + if frame.f_back is not None and not info.pydev_use_scoped_step_frame: + back_func_code_info = _get_func_code_info(frame.f_back.f_code, frame.f_back) + if ( + # Not filtered out. + not back_func_code_info.always_skip_code + and not back_func_code_info.always_filtered_out + and not (force_check_project_scope and back_func_code_info.filtered_out_force_checked) + # Prevent stopping in a return to the same location we were initially + # (i.e.: double-stop at the same place due to some filtering). + and info.step_in_initial_location != (frame.f_back, frame.f_back.f_lineno) + ): + if py_db.show_return_values: + _show_return_values(frame, retval) + + _stop_on_return(py_db, thread_info, info, step_cmd, frame, retval) + return + + if step_cmd in (CMD_STEP_RETURN, CMD_STEP_RETURN_MY_CODE) and _is_same_frame(info, stop_frame, frame): + if py_db.show_return_values: + _show_return_values(frame, retval) + + _stop_on_return(py_db, thread_info, info, step_cmd, frame, retval) + return + + elif ( + step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE) + and not info.pydev_use_scoped_step_frame + and _is_same_frame(info, stop_frame, frame) + ): + # This isn't in the sys.settrace version: on a step over, if we return and the return is valid, show + # as a step return instead of going back to step into mode (but if the back frame is not valid, then + # go to step into mode). + f_back = frame.f_back + if f_back is not None: + back_func_code_info = _get_func_code_info(f_back.f_code, 2) + force_check_project_scope = step_cmd == CMD_STEP_OVER_MY_CODE + + if ( + back_func_code_info is not None + and not back_func_code_info.always_skip_code + and not back_func_code_info.always_filtered_out + and not (force_check_project_scope and back_func_code_info.filtered_out_force_checked) + ): + if py_db.show_return_values: + _show_return_values(frame, retval) + + _stop_on_return(py_db, thread_info, info, step_cmd, frame, retval) + return + + elif step_cmd == CMD_SMART_STEP_INTO: + if _is_same_frame(info, stop_frame, frame): + # We're exiting the smart step into initial frame (so, we probably didn't find our target). + if py_db.show_return_values: + _show_return_values(frame, retval) + + _stop_on_return(py_db, thread_info, info, step_cmd, frame, retval) + return + + if py_db.show_return_values: + if ( + ( + info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE, CMD_SMART_STEP_INTO) + and (_is_same_frame(info, stop_frame, frame.f_back)) + ) + or (info.pydev_step_cmd in (CMD_STEP_RETURN, CMD_STEP_RETURN_MY_CODE) and (info, _is_same_frame(info, stop_frame, frame))) + or (info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_COROUTINE)) + or ( + info.pydev_step_cmd == CMD_STEP_INTO_MY_CODE + and frame.f_back is not None + and not py_db.apply_files_filter(frame.f_back, frame.f_back.f_code.co_filename, True) + ) + ): + _show_return_values(frame, retval) + + if step_cmd in (CMD_STEP_OVER, CMD_STEP_RETURN, CMD_STEP_OVER_MY_CODE, CMD_STEP_RETURN_MY_CODE, CMD_SMART_STEP_INTO): + # If we are in single step mode and something causes us to exit the current frame, we need to make sure we break + # eventually. Force the step mode to step into and the step stop frame to None. + # I.e.: F6 in the end of a function should stop in the next possible position (instead of forcing the user + # to make a step in or step over at that location). + # Note: this is especially troublesome when we're skipping code with the + # @DontTrace comment. + stop_frame = info.pydev_step_stop + if stop_frame is frame and not info.pydev_use_scoped_step_frame: + if step_cmd in (CMD_STEP_OVER, CMD_STEP_RETURN, CMD_SMART_STEP_INTO): + info.pydev_step_cmd = CMD_STEP_INTO + else: + info.pydev_step_cmd = CMD_STEP_INTO_MY_CODE + info.pydev_step_stop = None + _enable_code_tracing_for_frame_and_parents(thread_info, stop_frame.f_back) + if py_db.show_return_values: + _show_return_values(frame, retval) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _enable_code_tracing_for_frame_and_parents(ThreadInfo thread_info, frame): + cdef FuncCodeInfo func_code_info +# ELSE +# def _enable_code_tracing_for_frame_and_parents(thread_info, frame): +# ENDIF +# fmt: on + py_db: object = GlobalDebuggerHolder.global_dbg + if py_db is None or py_db.pydb_disposed: + return + + while frame is not None: + func_code_info: FuncCodeInfo = _get_func_code_info(frame.f_code, frame) + if func_code_info.always_skip_code: + frame = frame.f_back + continue + + _enable_code_tracing(py_db, thread_info.additional_info, func_code_info, frame.f_code, frame, False) + frame = frame.f_back + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _stop_on_return(py_db, ThreadInfo thread_info, PyDBAdditionalThreadInfo info, int step_cmd, frame, retval): +# ELSE +# def _stop_on_return(py_db, thread_info, info, step_cmd, frame, retval): +# ENDIF +# fmt: on + back = frame.f_back + if back is not None: + # When we get to the pydevd run function, the debugging has actually finished for the main thread + # (note that it can still go on for other threads, but for this one, we just make it finish) + # So, just setting it to None should be OK + back_absolute_filename, _, base = get_abs_path_real_path_and_base_from_frame(back) + if (base, back.f_code.co_name) in (DEBUG_START, DEBUG_START_PY3K): + back = None + + elif base == TRACE_PROPERTY: + # We dont want to trace the return event of pydevd_traceproperty (custom property for debugging) + # if we're in a return, we want it to appear to the user in the previous frame! + return + + elif pydevd_dont_trace.should_trace_hook is not None: + if not pydevd_dont_trace.should_trace_hook(back.f_code, back_absolute_filename): + # In this case, we'll have to skip the previous one because it shouldn't be traced. + # Also, we have to reset the tracing, because if the parent's parent (or some + # other parent) has to be traced and it's not currently, we wouldn't stop where + # we should anymore (so, a step in/over/return may not stop anywhere if no parent is traced). + # Related test: _debugger_case17a.py + py_db.set_trace_for_frame_and_parents(thread_info.thread_ident, back) + return + + if back is not None: + # if we're in a return, we want it to appear to the user in the previous frame! + py_db.set_suspend(thread_info.thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + _do_wait_suspend(py_db, thread_info, back, "return", retval) + else: + # in jython we may not have a back frame + info.pydev_step_stop = None + info.pydev_original_step_cmd = -1 + info.pydev_step_cmd = -1 + info.pydev_state = STATE_RUN + info.update_stepping_info() + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _stop_on_breakpoint(py_db, ThreadInfo thread_info, int stop_reason, bp, frame, new_frame, bint stop, bint stop_on_plugin_breakpoint, str bp_type): + cdef PyDBAdditionalThreadInfo additional_info +# ELSE +# def _stop_on_breakpoint( +# py_db, thread_info: ThreadInfo, stop_reason: int, bp, frame, new_frame, stop: bool, stop_on_plugin_breakpoint: bool, bp_type: str +# ): +# ENDIF +# fmt: on + """ + :param bp: the breakpoint hit (additional conditions will be checked now). + :param frame: the actual frame + :param new_frame: either the actual frame or the frame provided by the plugins. + :param stop: whether we should do a regular line breakpoint. + :param stop_on_plugin_breakpoint: whether we should stop in a plugin breakpoint. + + :return: + True if the breakpoint was suspended inside this function and False otherwise. + Note that even if False is returned, it's still possible + """ + additional_info = thread_info.additional_info + # ok, hit breakpoint, now, we have to discover if it is a conditional breakpoint + # lets do the conditional stuff here + if bp.expression is not None: + # If it has an expression, it's always handled even if we don't stop. + py_db.handle_breakpoint_expression(bp, additional_info, new_frame) + + if stop or stop_on_plugin_breakpoint: + if bp.has_condition: + eval_result = py_db.handle_breakpoint_condition(additional_info, bp, new_frame) + if not eval_result: + stop = False + stop_on_plugin_breakpoint = False + + # Handle logpoint (on a logpoint we should never stop). + if (stop or stop_on_plugin_breakpoint) and bp.is_logpoint: + stop = False + stop_on_plugin_breakpoint = False + + if additional_info.pydev_message is not None and len(additional_info.pydev_message) > 0: + cmd = py_db.cmd_factory.make_io_message(additional_info.pydev_message + os.linesep, "1") + py_db.writer.add_command(cmd) + + if stop: + py_db.set_suspend( + thread_info.thread, + stop_reason, + suspend_other_threads=bp and bp.suspend_policy == "ALL", + ) + # print('suspend on breakpoint...') + _do_wait_suspend(py_db, thread_info, frame, "line", None) + return True + + elif stop_on_plugin_breakpoint: + stop_at_frame = py_db.plugin.suspend(py_db, thread_info.thread, frame, bp_type) + if stop_at_frame and thread_info.additional_info.pydev_state == STATE_SUSPEND: + _do_wait_suspend(py_db, thread_info, stop_at_frame, "line", None) + return + + return False + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _plugin_stepping(py_db, int step_cmd, event, frame, ThreadInfo thread_info): + cdef bint stop + cdef dict stop_info +# ELSE +# def _plugin_stepping(py_db, step_cmd, event, frame, thread_info): +# ENDIF +# fmt: on + plugin_manager = py_db.plugin + # Step return makes no sense for plugins (I guess?!?), so, just handle as step into. + if step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE, CMD_SMART_STEP_INTO) or step_cmd in ( + CMD_STEP_RETURN, + CMD_STEP_RETURN_MY_CODE, + ): + stop_info = {} + stop = False + result = plugin_manager.cmd_step_into(py_db, frame, event, thread_info.additional_info, thread_info.thread, stop_info, stop) + if result: + stop, plugin_stop = result + if plugin_stop: + plugin_manager.stop(py_db, frame, event, thread_info.thread, stop_info, None, step_cmd) + return + + elif step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE): + if plugin_manager is not None: + stop_info = {} + stop = False + result = plugin_manager.cmd_step_over(py_db, frame, event, thread_info.additional_info, thread_info.thread, stop_info, stop) + if result: + stop, plugin_stop = result + if plugin_stop: + plugin_manager.stop(py_db, frame, event, thread_info.thread, stop_info, None, step_cmd) + return + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _jump_event(code, int from_offset, int to_offset): + cdef ThreadInfo thread_info + cdef FuncCodeInfo func_code_info + cdef int from_line + cdef int to_line +# ELSE +# def _jump_event(code, from_offset, to_offset): +# ENDIF +# fmt: on + # A bunch of things have to be repeated especially because in the sys.monitoring + # everything is global, yet, when we start tracing something for stepping that + # needs to be per-thread. + try: + thread_info = _thread_local_info.thread_info + except: + thread_info = _get_thread_info(True, 1) + if thread_info is None: + return + + py_db: object = GlobalDebuggerHolder.global_dbg + if py_db is None or py_db.pydb_disposed: + return monitor.DISABLE + + # If we get another jump event, remove the extra check for the line event + if hasattr(_thread_local_info, "f_disable_next_line_if_match"): + del _thread_local_info.f_disable_next_line_if_match + + if not thread_info.trace or not thread_info.is_thread_alive(): + # For thread-related stuff we can't disable the code tracing because other + # threads may still want it... + return + + func_code_info: FuncCodeInfo = _get_func_code_info(code, 1) + if func_code_info.always_skip_code or func_code_info.always_filtered_out: + return monitor.DISABLE + + # Same logic as "sys_trace_jump_func" in https://github.com/python/cpython/blob/main/Python/legacy_tracing.c + + # Ignore forward jump. + # print('jump event', code.co_name, 'from offset', from_offset, 'to offset', to_offset) + if to_offset > from_offset: + return monitor.DISABLE + + from_line = func_code_info.get_line_of_offset(from_offset or 0) + to_line = func_code_info.get_line_of_offset(to_offset or 0) + + if from_line != to_line: + # I.e.: use case: "yield from [j for j in a if j % 2 == 0]" + return monitor.DISABLE + + # We know the frame depth. + frame = _getframe(1) + + # Disable the next line event as we're jumping to a line. The line event will be redundant. + _thread_local_info.f_disable_next_line_if_match = (func_code_info.co_filename, frame.f_lineno) + # pydev_log.debug('_jump_event', code.co_name, 'from line', from_line, 'to line', frame.f_lineno) + + return _internal_line_event(func_code_info, frame, frame.f_lineno) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _line_event(code, int line): + cdef ThreadInfo thread_info + cdef FuncCodeInfo func_code_info +# ELSE +# def _line_event(code, line): +# ENDIF +# fmt: on + + # A bunch of things have to be repeated especially because in the sys.monitoring + # everything is global, yet, when we start tracing something for stepping that + # needs to be per-thread. + try: + thread_info = _thread_local_info.thread_info + except: + thread_info = _get_thread_info(True, 1) + if thread_info is None: + return + + py_db: object = GlobalDebuggerHolder.global_dbg + if py_db is None or py_db.pydb_disposed: + return monitor.DISABLE + + # If we get another line event, remove the extra check for the line event + if hasattr(_thread_local_info, "f_disable_next_line_if_match"): + (co_filename, line_to_skip) = _thread_local_info.f_disable_next_line_if_match + del _thread_local_info.f_disable_next_line_if_match + if line_to_skip is line and co_filename == code.co_filename: + # The last jump already jumped to this line and we haven't had any + # line events or jumps since then. We don't want to consider this line twice + # pydev_log.debug('_line_event skipped', line) + return + + if not thread_info.trace or not thread_info.is_thread_alive(): + # For thread-related stuff we can't disable the code tracing because other + # threads may still want it... + return + + func_code_info: FuncCodeInfo = _get_func_code_info(code, 1) + if func_code_info.always_skip_code or func_code_info.always_filtered_out: + return monitor.DISABLE + + # pydev_log.debug('_line_event', code.co_name, line) + + # We know the frame depth. + frame = _getframe(1) + return _internal_line_event(func_code_info, frame, line) + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _internal_line_event(FuncCodeInfo func_code_info, frame, int line): + cdef ThreadInfo thread_info + cdef PyDBAdditionalThreadInfo info + cdef int step_cmd + cdef bint stop + cdef bint stop_on_plugin_breakpoint + cdef int stop_reason + cdef bint force_check_project_scope +# ELSE +# def _internal_line_event(func_code_info, frame, line): +# ENDIF +# fmt: on + py_db: object = GlobalDebuggerHolder.global_dbg + thread_info = _thread_local_info.thread_info + info = thread_info.additional_info + + step_cmd = info.pydev_step_cmd + + # print('line event', info, id(info), thread_info.thread.name) + # print('line event', info.pydev_state, line, threading.current_thread(), code) + # If we reached here, it was not filtered out. + + if func_code_info.breakpoint_found: + bp = None + stop = False + stop_on_plugin_breakpoint = False + + stop_info = {} + stop_reason = CMD_SET_BREAK + bp_type = None + + bp = func_code_info.bp_line_to_breakpoint.get(line) + if bp is not None: + new_frame = frame + stop = True + + if bp: + if _stop_on_breakpoint(py_db, thread_info, stop_reason, bp, frame, new_frame, stop, stop_on_plugin_breakpoint, "python-line"): + return + + if func_code_info.plugin_line_breakpoint_found: + result = py_db.plugin.get_breakpoint(py_db, frame, "line", info) + if result: + stop_reason = CMD_SET_BREAK + stop = False + stop_on_plugin_breakpoint = True + bp, new_frame, bp_type = result + _stop_on_breakpoint(py_db, thread_info, stop_reason, bp, frame, new_frame, stop, stop_on_plugin_breakpoint, bp_type) + return + + if info.pydev_state == STATE_SUSPEND: + # Note: it's possible that it was suspended with a pause (and we'd stop here too). + # print('suspend (pause)...') + _do_wait_suspend(py_db, thread_info, frame, "line", None) + return + + # Ok, did not suspend due to a breakpoint, let's see if we're stepping. + stop_frame = info.pydev_step_stop + if step_cmd == -1: + if func_code_info.breakpoint_found or func_code_info.plugin_line_breakpoint_found or any_thread_stepping(): + return None + + return monitor.DISABLE + + if info.suspend_type != PYTHON_SUSPEND: + # Plugin stepping + if func_code_info.plugin_line_stepping: + _plugin_stepping(py_db, step_cmd, "line", frame, thread_info) + return + + # Python stepping now + if step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_STEP_INTO_COROUTINE): + force_check_project_scope = step_cmd == CMD_STEP_INTO_MY_CODE + if not info.pydev_use_scoped_step_frame: + if func_code_info.always_filtered_out or (force_check_project_scope and func_code_info.filtered_out_force_checked): + return + + py_db.set_suspend(thread_info.thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + _do_wait_suspend(py_db, thread_info, frame, "line", None) + return + else: + # Make sure we check the filtering inside ipython calls too... + if func_code_info.always_filtered_out or (force_check_project_scope and func_code_info.filtered_out_force_checked): + return + + stop = False + # We can only stop inside the ipython call. + filename = frame.f_code.co_filename + if filename.endswith(".pyc"): + filename = filename[:-1] + + if not filename.endswith(PYDEVD_IPYTHON_CONTEXT[0]): + f = frame.f_back + while f is not None: + if f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + f2 = f.f_back + if f2 is not None and f2.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + pydev_log.debug("Stop inside ipython call") + py_db.set_suspend(thread_info.thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + thread_info.additional_info.trace_suspend_type = "sys_monitor" + _do_wait_suspend(py_db, thread_info, frame, "line", None) + break + f = f.f_back + + del f + + # In scoped mode if step in didn't work in this context it won't work + # afterwards anyways. + return + + elif step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE): + # Note: when dealing with a step over my code it's the same as a step over (the + # difference is that when we return from a frame in one we go to regular step + # into and in the other we go to a step into my code). + if _is_same_frame(info, stop_frame, frame): + py_db.set_suspend(thread_info.thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + _do_wait_suspend(py_db, thread_info, frame, "line", None) + return + + elif step_cmd == CMD_SMART_STEP_INTO: + stop = False + back = frame.f_back + if _is_same_frame(info, stop_frame, back): + if info.pydev_smart_child_offset != -1: + # i.e.: in this case, we're not interested in the pause in the parent, rather + # we're interested in the pause in the child (when the parent is at the proper place). + stop = False + + else: + pydev_smart_parent_offset = info.pydev_smart_parent_offset + + pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: + # Preferred mode (when the smart step into variants are available + # and the offset is set). + stop = get_smart_step_into_variant_from_frame_offset( + back.f_lasti, pydev_smart_step_into_variants + ) is get_smart_step_into_variant_from_frame_offset(pydev_smart_parent_offset, pydev_smart_step_into_variants) + + else: + # Only the name/line is available, so, check that. + curr_func_name = frame.f_code.co_name + + # global context is set with an empty name + if curr_func_name in ("?", "") or curr_func_name is None: + curr_func_name = "" + if curr_func_name == info.pydev_func_name and stop_frame.f_lineno == info.pydev_next_line: + stop = True + + if not stop: + # In smart step into, if we didn't hit it in this frame once, that'll + # not be the case next time either, so, disable tracing for this frame. + return + + elif back is not None and _is_same_frame(info, stop_frame, back.f_back): + # Ok, we have to track 2 stops at this point, the parent and the child offset. + # This happens when handling a step into which targets a function inside a list comprehension + # or generator (in which case an intermediary frame is created due to an internal function call). + pydev_smart_parent_offset = info.pydev_smart_parent_offset + pydev_smart_child_offset = info.pydev_smart_child_offset + # print('matched back frame', pydev_smart_parent_offset, pydev_smart_child_offset) + # print('parent f_lasti', back.f_back.f_lasti) + # print('child f_lasti', back.f_lasti) + stop = False + if pydev_smart_child_offset >= 0 and pydev_smart_child_offset >= 0: + pydev_smart_step_into_variants = info.pydev_smart_step_into_variants + + if pydev_smart_parent_offset >= 0 and pydev_smart_step_into_variants: + # Note that we don't really check the parent offset, only the offset of + # the child (because this is a generator, the parent may have moved forward + # already -- and that's ok, so, we just check that the parent frame + # matches in this case). + smart_step_into_variant = get_smart_step_into_variant_from_frame_offset( + pydev_smart_parent_offset, pydev_smart_step_into_variants + ) + # print('matched parent offset', pydev_smart_parent_offset) + # Ok, now, check the child variant + children_variants = smart_step_into_variant.children_variants + stop = children_variants and ( + get_smart_step_into_variant_from_frame_offset(back.f_lasti, children_variants) + is get_smart_step_into_variant_from_frame_offset(pydev_smart_child_offset, children_variants) + ) + # print('stop at child', stop) + + if not stop: + # In smart step into, if we didn't hit it in this frame once, that'll + # not be the case next time either, so, disable tracing for this frame. + return + + if stop: + py_db.set_suspend(thread_info.thread, step_cmd, original_step_cmd=info.pydev_original_step_cmd) + _do_wait_suspend(py_db, thread_info, frame, "line", None) + return + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _start_method_event(code, instruction_offset): + cdef ThreadInfo thread_info + cdef FuncCodeInfo func_code_info + cdef bint stop + cdef int stop_reason + cdef bint stop_on_plugin_breakpoint + cdef PyDBAdditionalThreadInfo info + cdef int step_cmd + cdef bint code_tracing_added +# ELSE +# def _start_method_event(code, instruction_offset): +# ENDIF +# fmt: on + try: + thread_info = _thread_local_info.thread_info + except: + thread_info = _get_thread_info(True, 1) + if thread_info is None: + return + + py_db: object = GlobalDebuggerHolder.global_dbg + if py_db is None or py_db.pydb_disposed: + return monitor.DISABLE + + if not thread_info.trace or not thread_info.is_thread_alive(): + # For thread-related stuff we can't disable the code tracing because other + # threads may still want it... + return + + frame = _getframe(1) + func_code_info = _get_func_code_info(code, frame) + if func_code_info.always_skip_code: + # if DEBUG: + # print('disable (always skip)') + return monitor.DISABLE + + keep_enabled: bool = _enable_code_tracing(py_db, thread_info.additional_info, func_code_info, code, frame, True) + + if func_code_info.function_breakpoint_found: + bp = func_code_info.function_breakpoint + stop = True + new_frame = frame + stop_reason = CMD_SET_FUNCTION_BREAK + stop_on_plugin_breakpoint = False + + _stop_on_breakpoint(py_db, thread_info, stop_reason, bp, frame, new_frame, stop, stop_on_plugin_breakpoint, "python-function") + return + + if py_db.plugin: + plugin_manager = py_db.plugin + + # Check breaking on breakpoints in a 'call' + info = thread_info.additional_info + if func_code_info.plugin_call_breakpoint_found: + result = plugin_manager.get_breakpoint(py_db, frame, "call", info) + if result: + stop_reason = CMD_SET_BREAK + stop = False + stop_on_plugin_breakpoint = True + bp, new_frame, bp_type = result + _stop_on_breakpoint(py_db, thread_info, stop_reason, bp, frame, new_frame, stop, stop_on_plugin_breakpoint, bp_type) + return + + keep_enabled = True + + # Check breaking on line stepping in a 'call' + step_cmd = info.pydev_step_cmd + if step_cmd != -1 and func_code_info.plugin_call_stepping and info.suspend_type != PYTHON_SUSPEND: + _plugin_stepping(py_db, step_cmd, "call", frame, thread_info) + return + + if keep_enabled or any_thread_stepping(): + return None + + return monitor.DISABLE + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef _ensure_monitoring(): +# ELSE +# def _ensure_monitoring(): +# ENDIF +# fmt: on + DEBUGGER_ID = monitor.DEBUGGER_ID + if not monitor.get_tool(DEBUGGER_ID): + monitor.use_tool_id(DEBUGGER_ID, "pydevd") + update_monitor_events() + restart_events() + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef start_monitoring(bint all_threads=False): + cdef ThreadInfo thread_info +# ELSE +# def start_monitoring(all_threads=False): +# ENDIF +# fmt: on + if all_threads: + # print('start monitoring, all_threads=', all_threads) + DEBUGGER_ID = monitor.DEBUGGER_ID + if not monitor.get_tool(DEBUGGER_ID): + monitor.use_tool_id(DEBUGGER_ID, "pydevd") + update_monitor_events() + restart_events() + else: + try: + thread_info = _thread_local_info.thread_info + except: + # code=None means we can already get the threading.current_thread. + thread_info = _get_thread_info(True, 1) + if thread_info is None: + # print('start monitoring, thread=', None) + return + # print('start monitoring, thread=', thread_info.thread) + thread_info.trace = True + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cpdef stop_monitoring(all_threads=False): + cdef ThreadInfo thread_info +# ELSE +# def stop_monitoring(all_threads=False): +# ENDIF +# fmt: on + if all_threads: + # print('stop monitoring, all_threads=', all_threads) + if monitor.get_tool(monitor.DEBUGGER_ID) == "pydevd": + monitor.set_events(monitor.DEBUGGER_ID, 0) + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_START, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_RESUME, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.LINE, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.JUMP, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_RETURN, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.RAISE, None) + monitor.free_tool_id(monitor.DEBUGGER_ID) + else: + try: + thread_info = _thread_local_info.thread_info + except: + thread_info = _get_thread_info(False, 1) + if thread_info is None: + return + # print('stop monitoring, thread=', thread_info.thread) + thread_info.trace = False + + +def update_monitor_events(suspend_requested: Optional[bool]=None) -> None: + """ + This should be called when breakpoints change. + + :param suspend: means the user requested threads to be suspended + """ + if monitor.get_tool(monitor.DEBUGGER_ID) != "pydevd": + # It is still not initialized. + return + + # When breakpoints change we need to update what we want to track based + # on the breakpoints. + py_db = GlobalDebuggerHolder.global_dbg + if py_db is None: + return + + if suspend_requested is None: + suspend_requested = False + + for t in threading.enumerate(): + if getattr(t, "pydev_do_not_trace", False): + continue + try: + additional_info = t.additional_info + if additional_info is None: + # i.e.: if we don't have it then it makes no sense to check if it was suspended or is stepping + continue + except AttributeError: + continue + if additional_info.pydev_step_cmd != -1 or additional_info.pydev_state == 2: + suspend_requested = True + break + + required_events = 0 + + has_caught_exception_breakpoint_in_pydb = ( + py_db.break_on_caught_exceptions or py_db.break_on_user_uncaught_exceptions or py_db.has_plugin_exception_breaks + ) + + break_on_uncaught_exceptions = py_db.break_on_uncaught_exceptions + + if has_caught_exception_breakpoint_in_pydb: + required_events |= monitor.events.RAISE | monitor.events.PY_UNWIND + # print('track RAISE') + monitor.register_callback(DEBUGGER_ID, monitor.events.RAISE, _raise_event) + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_UNWIND, _unwind_event) + else: + if break_on_uncaught_exceptions: + required_events |= monitor.events.PY_UNWIND + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_UNWIND, _unwind_event) + else: + monitor.register_callback(DEBUGGER_ID, monitor.events.RAISE, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_UNWIND, None) + + has_breaks = py_db.has_plugin_line_breaks + if not has_breaks: + if py_db.function_breakpoint_name_to_breakpoint: + has_breaks = True + else: + file_to_line_to_breakpoints = py_db.breakpoints + for line_to_breakpoints in file_to_line_to_breakpoints.values(): + if line_to_breakpoints: + has_breaks = True + break + + if has_breaks or suspend_requested: + # print('track PY_START|PY_RESUME, suspend_requested=', suspend_requested) + required_events |= monitor.events.PY_START | monitor.events.PY_RESUME + + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_START, _start_method_event) + # monitor.register_callback(DEBUGGER_ID, monitor.events.PY_RESUME, _resume_method_event) + monitor.register_callback(DEBUGGER_ID, monitor.events.LINE, _line_event) + if not IS_PY313_OR_GREATER: + # In Python 3.13+ jump_events aren't necessary as we have a line_event for every + # jump location. + monitor.register_callback(DEBUGGER_ID, monitor.events.JUMP, _jump_event) + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_RETURN, _return_event) + + else: + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_START, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_RESUME, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.LINE, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.JUMP, None) + monitor.register_callback(DEBUGGER_ID, monitor.events.PY_RETURN, None) + + monitor.set_events(DEBUGGER_ID, required_events) + + +def restart_events() -> None: + # Note: if breakpoints change, update_monitor_events usually needs to be + # called first, then the line event tracing must be set for existing frames + # and then this function must be called at the end. + monitor.restart_events() + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +cdef _is_same_frame(PyDBAdditionalThreadInfo info, target_frame, current_frame): +# ELSE +# def _is_same_frame(info, target_frame, current_frame): +# ENDIF +# fmt: on + if target_frame is current_frame: + return True + + if info.pydev_use_scoped_step_frame: + # If using scoped step we don't check the target, we just need to check + # if the current matches the same heuristic where the target was defined. + if target_frame is not None and current_frame is not None: + if target_frame.f_code.co_filename == current_frame.f_code.co_filename: + # The co_name may be different (it may include the line number), but + # the filename must still be the same. + f = current_frame.f_back + if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + f = f.f_back + if f is not None and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + return True + + return False + + +# fmt: off +# IFDEF CYTHON -- DONT EDIT THIS FILE (it is automatically generated) +def _do_wait_suspend(py_db, ThreadInfo thread_info, frame, event, arg): +# ELSE +# def _do_wait_suspend(py_db, thread_info, frame, event, arg): +# ENDIF +# fmt: on + thread_info.additional_info.trace_suspend_type = "sys_monitor" + py_db.do_wait_suspend(thread_info.thread, frame, event, arg) + +# This can be used to diagnose exceptions inside of the debugger itself. +# +# import types +# import functools +# +# +# def safe_func(method): +# +# @functools.wraps(method) +# def new_method(*args, **kwargs): +# try: +# return method(*args, **kwargs) +# except: +# import traceback;traceback.print_exc() +# raise +# +# return new_method +# +# +# for name, obj in list(globals().items()): +# if name.endswith('_event'): +# if isinstance(obj, types.FunctionType): +# globals()[name] = safe_func(obj) +# +# +# def _getframe(depth): +# return sys._getframe(depth + 1) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/pydevd_sys_monitoring.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/pydevd_sys_monitoring.py new file mode 100644 index 0000000..3378a7e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/pydevd_sys_monitoring.py @@ -0,0 +1,16 @@ +from _pydevd_bundle.pydevd_constants import USE_CYTHON_FLAG, ENV_TRUE_LOWER_VALUES, ENV_FALSE_LOWER_VALUES, IS_PY312_OR_GREATER + +if IS_PY312_OR_GREATER: + if USE_CYTHON_FLAG in ENV_TRUE_LOWER_VALUES: + from ._pydevd_sys_monitoring_cython import * + + elif USE_CYTHON_FLAG in ENV_FALSE_LOWER_VALUES: + from ._pydevd_sys_monitoring import * + + else: + try: + from ._pydevd_sys_monitoring_cython import * + except: + from ._pydevd_sys_monitoring import * +else: + from ._pydevd_sys_monitoring import * diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_app_engine_debug_startup.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_app_engine_debug_startup.py new file mode 100644 index 0000000..7325d1a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_app_engine_debug_startup.py @@ -0,0 +1,22 @@ +if False: + config = None + + +# See: https://docs.google.com/document/d/1CCSaRiIWCLgbD3OwmuKsRoHHDfBffbROWyVWWL0ZXN4/edit +if ":" not in config.version_id: + # The default server version_id does not contain ':' + import json + import os + import sys + + startup = config.python_config.startup_args + if not startup: + raise AssertionError("Expected --python_startup_args to be passed from the pydev debugger.") + + setup = json.loads(startup) + pydevd_path = setup["pydevd"] + sys.path.append(os.path.dirname(pydevd_path)) + + import pydevd + + pydevd.settrace(setup["client"], port=setup["port"], suspend=False, trace_only_current_thread=False) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_coverage.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_coverage.py new file mode 100644 index 0000000..77324c8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_coverage.py @@ -0,0 +1,92 @@ +""" +Entry point module to run code-coverage. +""" + + +def is_valid_py_file(path): + """ + Checks whether the file can be read by the coverage module. This is especially + needed for .pyx files and .py files with syntax errors. + """ + import os + + is_valid = False + if os.path.isfile(path) and not os.path.splitext(path)[1] == ".pyx": + try: + with open(path, "rb") as f: + compile(f.read(), path, "exec") + is_valid = True + except: + pass + return is_valid + + +def execute(): + import os + import sys + + files = None + if "combine" not in sys.argv: + if "--pydev-analyze" in sys.argv: + # Ok, what we want here is having the files passed through stdin (because + # there may be too many files for passing in the command line -- we could + # just pass a dir and make the find files here, but as that's already + # given in the java side, let's just gather that info here). + sys.argv.remove("--pydev-analyze") + s = input() + s = s.replace("\r", "") + s = s.replace("\n", "") + + files = [] + invalid_files = [] + for v in s.split("|"): + if is_valid_py_file(v): + files.append(v) + else: + invalid_files.append(v) + if invalid_files: + sys.stderr.write("Invalid files not passed to coverage: %s\n" % ", ".join(invalid_files)) + + # Note that in this case we'll already be in the working dir with the coverage files, + # so, the coverage file location is not passed. + + else: + # For all commands, the coverage file is configured in pydev, and passed as the first + # argument in the command line, so, let's make sure this gets to the coverage module. + os.environ["COVERAGE_FILE"] = sys.argv[1] + del sys.argv[1] + + try: + import coverage # @UnresolvedImport + except: + sys.stderr.write("Error: coverage module could not be imported\n") + sys.stderr.write("Please make sure that the coverage module " "(http://nedbatchelder.com/code/coverage/)\n") + sys.stderr.write("is properly installed in your interpreter: %s\n" % (sys.executable,)) + + import traceback + + traceback.print_exc() + return + + if hasattr(coverage, "__version__"): + version = tuple(map(int, coverage.__version__.split(".")[:2])) + if version < (4, 3): + sys.stderr.write( + "Error: minimum supported coverage version is 4.3." + "\nFound: %s\nLocation: %s\n" % (".".join(str(x) for x in version), coverage.__file__) + ) + sys.exit(1) + else: + sys.stderr.write("Warning: Could not determine version of python module coverage." "\nEnsure coverage version is >= 4.3\n") + + from coverage.cmdline import main # @UnresolvedImport + + if files is not None: + sys.argv.append("xml") + sys.argv += files + + main() + + +if __name__ == "__main__": + execute() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/README b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/README new file mode 100644 index 0000000..185d417 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/README @@ -0,0 +1,8 @@ +# Parts of IPython, files from: https://github.com/ipython/ipython/tree/rel-1.0.0/IPython +# The files in this package are extracted from IPython to aid the main loop integration +# See tests_mainloop for some manually runable tests + +# What we are doing is reusing the "inputhook" functionality (i.e. what in IPython +# ends up on PyOS_InputHook) and using it in the pydevconsole context. +# Rather that having the callbacks called in PyOS_InputHook, we use a custom XML-RPC +# Server (HookableXMLRPCServer) that calls the inputhook when idle diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ee2c2c5bb5533dcd0dae7a1f52c834ae02f1053 GIT binary patch literal 229 zcmZ8bK?=e!5Nxc12>pXs4|Y+nA_&E!H@$||EH$=GLXsA8_Yc0or-;w+1=3qjrs&Cm z-I-lxV4hJl2|OOvG4J`+uYa^d|G5P&n34TG&;x(9y{EfEB`loaU{D*_p+zxGG-n(V zG=-H4l$IB?TVZ%sB2*4V10~NuIeV636)%=xxW&0jPeq!e0ft$fD+jbe!K6m!tqhwV kQT`1ArCe}JX{=l~URRRUC2sV{mm+>lFWw;`M2B8|08lVN*Z=?k literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhook.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhook.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fd0d1046284d67de0899a18e1cd2b72b2314603 GIT binary patch literal 22434 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookglut.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookglut.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db9c05dde7a1aaa7ea1ae40ba94a72f8c00259bf GIT binary patch literal 3572 zcmbssU2hx5aqoDP$m3C@WJ;uLOIpdU8#WecTTW3RN*r01Wudlg_#=T?6vTKmMcT-#RgK;FMeYzKLkb|I=keF zv~0Kqy5P;u%+Aiv&hE@C{~nF12-@FDZx^?E5&AbL{1$2=TfdPIT15uRAwx1`OUg;2 zmvb`o0V_~aa*EU#3+94itfSPK3pIJ+lA2Qmu2_+hmWv8JXmyohxftLbxi|?ej`+*A zdf@JFQ9icPi4cq&@ab01M{)^6&h-*`G121tn9;fP3PSWi7|DpJiwAvvt2aWx?`qLL zX2?ZkgbnqNk=q>&UM@+Jxn6r1EIH~+wR#!_{|wn{RHLq z7%_l*jX1yoqZ{C$(F1U(D(^!iwI9*2#I5c(wARck=!b#J=!%rywKAekpT2Yv&)DS( zTX38u>{iNUhcY~0u?x&}Y*&56mzzyXp2Ex$fj(-GdA(w>Jf|rzA}%vbJ5PyjR3D9l zwAW$i^onVF(V|shlMAGI_L!q%kor8Tu^?oS|(md zr$vsqFys^jIjfh5yK?!mQ=yn^!)B>$krJ_)&dtS!LtJb-4C|KVT*0Qz2-RUH%LKc` zb@`4a;WG_FVbEnDX4*wOPYL1bGArNve^h7iOO+S6E8ANDh%E)cDypJe(ku-FF2EKS zd-~IC$!6I?_L57en>|SwvGECN8fNwcahI4=&X%dONZ17IXwD+pQkB@tS<9TumaA}{ z_E_fdk*sSnGFsLPOL~#GS%b_~isfoHzf5eyp~L`DgDf|@yxEwTHT@eQyi%@u8b|Vm z>6R_MN_T;EXW-ik0=S00P(rjDu$OO;#zCaDMKOc+0M82x<)&c~+6VM`F2@7$d8ION zh1cE!WEHVyI3TphM|QN^OX+bLR$S4G00bih;i@?IB*r{HG1V}fU{c-@>nqnkFr zyHnsU*07y#v|+X?%r00C9M2x$z5}1j?Y@Q{Dxpm!xvnHPl>Yll?>!~i*h{;W{NTl2 zt^)GRUVz@&*f!%uJ8c`~T6eVD%~in zEUkDQu35Bo%j>u>Gd(kV(c9%mKZI6(LAUvtdBHLTGA%cxDwuGy7{6|!`CPa3BFWat`f~506|nC;>0KzcODEvY_Awr|qP?)pDJ@&34&sS{B76>j^ixy#+ z@ZiK2gejh@Vn~Svp6Vg3mm$aTUI@6@v8`%GRWY=S3#N;g2r0WSk+0ayw6Lgd7{o<^ z%V0b)58)xSv@HdNWXEy`v5pIz%^b{2WyZB&J+24}521`0pi9_cxxh(U~l*nzD< z`EF&3hNc~vxS0D5CiI3bmR{Z+bmv_(1ojaD+=m5ymK@NE2 zdO^s5g(aHexTyHkgf(-hATRhN-OcClR7?Y6qS%7h{e0e$J&AeYic1Xf%6KM`bZytB zJWnZf6jX7;-9H1khMx4HV5F5uHii#xC`anba4>pb>;BpFb?He5(&C$uf%VA1KO#dn z58sXKzYh#;a9tZ*`@x1bd|w;b(1vQe5)XR@J{)aOptXPS*PSx=^>J4>m?4ww%d-vLfUk-up?q0z=dM}P!)N32@;U}YL*WgE^^&?1&e)S}Xw1LM+ z3Px)otrpShK|r6n{jh~UOrXhq=+jpxz75@H`@)miz-Ji=U>bX!`8>RY@_A2o;8EmO zU2h~W>UVyw!c%dkNxAwmxUS?F6^ppS+2YW=$XN)9>C+kh>hly18^;!F@}amheoMU2 zHrBy!n8_&5kCeZjy<}s>=2IcFeH`Lsy^zTB^JUkIaQ*ocXD=N;J>`W3aen&vgeTsd z`4dy;E}m)>S^rtV4JP7}cs&J(Hb#!?E;-qJic3c zlh}G<`VQ*;B9Q`E3v_%i{{HwczH>LQr!K3(Nx7C9TMKQb#@16~HEmBVo?4CGh}M#O zYQ4!?{8fNYqMiNf^=LhT`VXuty|rL?Gnl*^Ox99+H&dB)_$j^rQv2>Ce*{m)$b?)+ zC^#WM?vkbOV^x5FlzOZMq~WbZR*HUAKPw?^H@|t4@;|$FgZSR#GE9w4@~L5f0Y3E9 U<<;ubZ;l*)1O4@luE|K?KN;Ouo&W#< literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookgtk.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookgtk.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..249b4b1945d654e260a4c8efc8f4e7f93dd5e19f GIT binary patch literal 1049 zcmah{&ubJh6i#Mmx6^62KeVWo76;M8qVAyHq!g;P+Cy8RsIZrDc9KrBKW4@xyJd<( zg+f~pJW2f*N(KJ`{{iu$AXtXpJbA0Gp!DR+>~5h&@Ik(pyu2je`(8fg^CklOP=Dl? zbcDXCMc1^>q;&}<+lZhNBA943T*9f>N*c+mqf&cNlsZLk5Ju}Nz&4UNjRI7<#Jd6TyPY{kF)nEHGX*Wl0KufU?y|sn+F%kQ zy32i$;(=JxxVbhLIidutMcjAQ%*G*JBzq z?HViFQ4FO7H;dPA*n&xVEpol8>r-J9T5kAJY&%UFkdRXXsf0E=&SC9?HdC@JgDgO_ z7{!U{9FgU{K<+#YF#xcJ_Vu2PxfgTm3wwP-Er=lRNDWx1N-{87rvNrUt4*{7EnGLA z<7apgfgZ<%%|g~`mA(e>8vjq)EhHhYZ58-KCr#$MkzGXs3?r%dr&dY-Uw75^Cz{0- z|3WV5@xyY3dNS!}q2m(bthmx!PO`HL&g^`u2v^T1x{|4Y6H`b6&0S(ODwG^++)&&3 zBV8R3cJ+$KsVk{-ELxnXg`Qgzlf`3U3(kwn0DnMoWALjn_SqPFQ+j*$-T2PF3fb3)!T{aY*PnPFgU}LuR{vb(pK(rHSb?hsH!bB#j!Khr literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookgtk3.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookgtk3.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b312b7d4e7a0a71d671b3c5568c865bfc1f2890 GIT binary patch literal 1063 zcmaiy&1(}u6u@UTn{>PV_5(>TE>aIEHjDNqwNR+71)GXrNG|JUXPQhtcGsCn$`*wR zg<23iNxce!NU#1A;zdEQEWLU1R*j(aI^h@c`Om}qs}(280kRZL+-Qk$r#6CHFqO6M}`H_Yq4TdGrQQP!p{ z8CWH1H3cOW^Cji3$6C}XMb^@-NLB(rZ<=#WFu1sC-K_)-X5D69#pOhp-&OIP7N;Ol ztS{bVC9m5~vZ&rh;A>w3wSy#1yr8PRu6qtxce^%55zc9ag`CDy;EMYjF7us7O(vm` z?((vTGqp9f3YEpO4!7-wFKy4hCny*80+rOa<~bwGo~NQFgU}9nP^EIt7YuG~HzMk{ z>^dviVRFIg{N*dQV3JOSu2*x*RM>=;n&mLEofh>;z$t-HLR;O%VV#3E^Fu`@sFeX^ zK8#}1IqH_HnT^9IhCywheZ6mM`RVfJ%HF_e8$8H6!T}p~6?NVADNtJg>ls?b1aBHo z@MC-j7#EI_O+(aa6}|!LCH^1VZ6qPCBUN}oCq-s@o?X=h2u8BMW5KkN*Vo&1))Uj> zs{dSutK9J*3mlgaXU&yfB~CA`I7@|uMrWY9LX^X?DI|f(uCh863dIIj731L}sE(q# zKIL)hO6nYU=V$7H=hnq+{+1W-FUGZfW8j6c zZ9F&kMn?GnM7{&Md<+b(*e8$bq1EZ->_2PsGZ1%P#g2l4Lcg?BdhEbNgX5p{Y?8B( z%fx+-Ljuon;-NCja~cNl!~z~A5E4)wCMp?MvrG;qbq|f1MnIZ%I?K<&4+TeLK^>$p Z#y@l&>%T7`Jn?f_!((kTgU6Gje*x_<^VB1QB5?8WrHtgwflL5q*_2C4Mv;U~ zF@vS1OvvK{W;hcDUC@k_qM4|KNTAqO-+FT{?%m|;oZj?A@_8E4LtmgwT#vxmQVHnc zMkyJ+dL??o(sCxjPNiTHj=7C<1eY1nv0-sSwY)J!aIS(G;oPtac&zfth3qNIDf5qQ zdomS`4ww0aOCeI3)f})vm-LSHhXnMsBnub-rlCK@hJDdWeDDmnj46`VLW>B%w?kz&- zNo|%;1sy;S^6a5#KNQ0(2evcVUyf;(hjwYgb!QHfbynG6=F@LO(U0f zDo`(LAa&%uG&4BqbF}=VRv;{`lU%vrRMOcg0)Z&eVX020YE#zm9n*%W{RGtB?^w#I z&hqcly@pyJufjTRT>e6iNIMQVzKL|n zKS*8jmfDIcd9^(V%vgmgZn@WdtNCtx6-1O5 zL!A_0yxpXme+Y=+x(c~o3(N%c zz~m?tzm4y%d%p=kba^w5)em0ETX_W=ymtRjgbg%;lf2$F=}xs0f`_@Mp5?~F4AmcI zGOV3|D{#JSVLq_|RRrD%$EIyN0-xZyyMjNy=N`hHNXVQ*FB7*Zbh{8nZl9`0kOQpX$uqP~o4sm(R}T z#)hZ>gk;S2tlZs20p&x>|~ z`6ztsHy8jAci~{X8cW>%=%!TN(eZ6x6~OV#tuu?Uj`>)}LaeLWj(_ZV)U(*$JKx^B zf|Pj2{iY?gZBfPZDqc|cd;Fn!_0WQP*yFqB)$Yf}g4$nIciq4AAhsL3C3ir8_H&N zJD<(E0h_rpt1x#z6a@Yw*<9JuO_HifOq+r_mTbLj5=Oo9H;G$ia4JxgiU3sLj{A=9 zUi<%~HtOu(g0N$1TwF0X%D6_kX#9lVQ_+AqL@~ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt4.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt4.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49b850b6d2900db2446301d3399e4c72f700a79b GIT binary patch literal 5672 zcmai2eM}t36`#E?xa00PFvi9Xcx;T#*}yseYV0_5Z0rz!1lzHbDzwpMxgCx@_IA&+ zd&Ur4Q57jrk;ZNkkt(U`^q(klRaL4gHBzhoQzeaBsa#D9*%CET6IJP7P9bXI{?qqn zZ|}}P(vfavZa&_;dHd$~dozECL_!48yV)nx7w;qFANa>jzG7ubgUSq1NFPxo#iL1m zk|;fW9w@zTIwtm<{!XvNe4*67i58q68+0QgzGY zNbd_P)pA7f$WbMv1Sh1v+7VB@X7q6Ag0+9ANmV_Uw+0Pkh?@Ca&fpdu$m=OfHS|#E z820ePw0n@Nrlra{J#H9g=o1v&8<*^$HOQH)sCqi?u>%*ZZi6%1f5Ga>t8uR#mNm^7 zPIg~<{A{w@j;LuJy4}AurUmnoIDI7LDC*=zt;y03_&-A!0b3BXL!X!V6wd^?RUF;t zSG*IXFEAp-eRk}WZZR%{-dEVgL8fWFDXBs#3iZNo=`>_BWQ=4gI^F7c*aJPT_%V`n zJHBN6Me?R3tdLZ7(~|WR1Cw}DnrY(F^zLLLt6Paw;t7*+Gw}$sm`+b{RZ$Zsm^ow_ zxkQc|8D<^RO|@TRiR=i|uOu|JKam>&yX*V9?%$g*Rf~1zdDFO>Bkmo>tDDwb#1o#z9qEEJ;ud`TKFxYJI|02!oyH`lYk5OOr{OkKAERY zJ1{hirHS8xQp$0PU2QTeiQcz{W^UI`7-&{OHcsvYNHD_dpdPQXtCLAx&a!0E4keRW zL&l!eh|FH(<67Gn6G%;do3%)&dn1vk9^gYZyQE zfj{=C$Lnui@{&N^9Z?H;{f-)9!XqiyX<-sUD+piP25#^idCmv^CXFAouur5+877!^@?bgbrBBiBUMUTHGSpssfH}h3;Jrs;_ycd}E$uNkf>8c3qJa|CrZZLjs#j`A}Xw zARh;FbpsMui~__6=cNLX1`JMlUe^I&s5QtaAQqK#IZaK;2vC&4F|ep+7`d)c2z-j3 zmpOO@Ab~0Vc9xR(n@w|i7?(JOnD;1n-D9#2=ZZU%K{9k-u;{V!5*^gY;Zm~JB}CvN zj~6wn)WkAq-eg^ro*JOKVbL_;klsOu8HF?6kD625jI5WWu&W5Eu(3)pMt_E-tPU8b z&{WYPRA2-xG?pgF%IivT&yO=J&-HsYEEYLNbF#{5$^dwARx$>tykdW}ovC11 zF3gL84jU|_ZcY7yN{+RrTbymT0}7CIw=Xe#LFVkB)>O*7AE>;4Ds zj~Dg21in+k#1g;JVS^7L0a5^Og=HO~GToU2nu5=k%{kDtQ>ZXJsHO&~oQFMt^QC~> zMkr^nCCG#(!ec>Y*M-G@5T24@`>r)LS*Sk<xC zdCK0`YVrD883H~a0+b*tzZa$|YjwZ4+8pG5Q;>yRr$sV;xJr^xg# zzr==;64aWrE!QBdhp5w6mQ^7sRF?Gr>#FxDGK}AFjZ-~LoZfhi{2S;#KXUG3 zvc!Va2^-6t3s_u4PC=^NNHNo-IfywCk$}qt@gmeI$Vx~c46YKoQ5rK;#HbJoz$9>~ zgPJIW%G88=g+)zZa)$74saZzb5A4aB@fC#cEL9Ry!SyKh80Y}pfzdKeStB`sVnpVC zh?k+F@3bhFRb(HC6|N$P0+kC^h5#ZpSdt1GpsP?-?Cu_XX5xN1M-Gr-r)ufq+l zg7Re$Wj+JG@j2X{oX?T-rM#2C%fNU*SN4@DuatCSJ^5e)4Bd^w8 z_b)cL&Np`zn!9c{@3|gYh^?QA+=$G_+6u9@o0&I^*NwT@!NpB&uXQdoG|im3aptDy zrE?1nE%OcA3k}=n8g^jw=^LkCI=fs&Ht+aR=klYd$aL>QZS3>qZi&RU{+l!g&q&Jw z64^9;ZlS4p^7KNuc0RnN5Z*Eu-n!gKV)ZW!PYu7a^Ut+g7aKRus5jIXhpv0y-_W|) z+VRHG*N^^u|F7$RyWy=3zxV#}$v-{)?$fh9-<)gx*7dWC4RpR?N1NY+%$de{qXJ&!|SKdEQaf5>rc#uPnOpGYk2E_KMHSrzW1()jP>1J zCu+!B-2updS983*XP5WweV(39^7es!P=BZ05A}CC!##(*_uQD#qeLi{gUZXE8B)F+ z^2TyKgX31DGEpd!OsrCf#_Og$YXxUhrE4L)7kOk4yq0)JzrQNP#TZ?ofIP*JRv;YE zfOFyn);X6X^wRcBo^^s(obMoFyo7qakHmc(Y1s|{Xs4LQk>l+M zJ^+-Q8(tFvs)n(zx0ii^YP`7B1l z8{zPj9ByIrmdUdp*Q^)LfXC#O>|D5GVg075ka$M0Ygb$x;z5ChycPAuV3gx++zwx; zghdQK?JBqsz|DYj48O$dMBFcS$REURkDB8rvFBmPOce4AnDJo;EE?9@BR>s;FeWj7 z0NEFS1qVrW&G@s6(T4eGTOryuAMGkcyKYDKOnMh;qLU9U)^C`v-(INSelvCRiQDzN zC%fU?g*MFxw-tihZU?uIA78ABPV(7xt#eh|;Wg;`@%e_fLPOhZZQE>h+j8i<Z~cNV@Z6d2oSBVnoo(Ge=Q{xJO4lQ^HO;fWX6M}n!~1y5u1Y2q zBb7|@`{6(T8f5miqp!6tSSg*Lh@x5Kf=-tBpI z&lmy~RV@W7(%4EOQYBTBen}!%Rll@qq*nb>C5>9CTulqv5;aj1Rp}?E5H)eX^u5{J z+cPHVNVhXLf8M-#^XB(^Gk=Igf&|igna5M#y@!y0;2$UXiiK4T3iCuEgG7-Ok0uRD zBKHh>AoptCjBn5D;8l`E1fu^=vSB z99#Gi+B3pc!&K!gJ)!GH@KY4rACs&qbA&TlQM0L-#|jLXJvwKWf57a`t1+(?mNiWu zOY~fPtS`}HMbuOlnw`HP!-R1O96p}36}7)bt;y;x_&-k=0b3BX!=RV>6wg(1qu6`U zuXwML!N9l_^I6f;S(9-Y^uEk4j4(~>PfBG{QK%Pwt7qUdPbNvatkEe>hdt2Zh@T`0 zr{OF5Um$Nu!U_pBYnXC2$-pGuq-Gd6HN8C(&t%PbGX712aU*_;nJi0Ba#c~|Cz&y7 z>bZE1>uF{l&l>8G#^RZAmc1O;)S-B89PFOm-+kY{xS^V?D<>yMUNs8gU-e__)L=zL)FheF#Etl zh`xW%wpSjW>6v?Uxu)*u|!bA(YqEh^`7nwpdmq$q=?-B64N98P>Ep876$2ZYQ$a@uCuxUj z7q5cT;8)Co-Cd&Zt%3K9$ifYKf z1qzjiafu`HWpod*^d!rf*dR1H%f^RvnJWU$c|K>_uE`NvkeCO|CsZZHOyjmht!f~s zBFQI!5t8L+5^)vJ>FO770AG^kNfj}R7(z;1C=s)SS!u+#bt#Qf)}<190ec$ZjiruD zz{FMS2EyO6*+lSkXODCV+1z@?;~*F4T0%5O2jc}3R%fS;FwN-)sOk3GVCGUk&!m*D zb0oTXy1^|wCBW)Nr|jl8iZ*%29Zt#375^yIa%Ljo ziY0_&RaLVcXosyfUJU^|tQS=PC z(VcgrU2^o3NH%01c4R1(?%q8~=6>-NHk6bqttHbs1;IYVqCQtvnWUgA>HpaqX8P9^ z?~`N<_i%$#Jx1)-SV;a2G@lt=LNL_~qa6qLW{lXn5Wt?Q zB&Ll0QR;Ef0oVj%Xqq&~a{$hW)k6?PLm|7{q+C{!k05%ug0KqYE_fP3isVR1DlCBB zg|lLHcOW(sw+;+kZ~!8HXGw%j7-OoYQH`0P)gFTZ87q4z-iq$+0Rq6_01XMy4)>#s z;1slAN-s$fibHe({HZZe+U6ySl;=hy0{YcX*v3!M!!KI?oNlOBQqR=?toNgdtH)vz zM|7Il8@zi>U9`vKT2~L1Q!=m>MkyF@*z+KrW(mZ+roFsHPsNYU@h4X|8{zu4$<*R;Y_D z)$J?P?YmibV5aB&O^wT&o7TP~kx27%{kNtdk1mB<3gMPlhnHI8h1U2|>)}G{;a}}v z3?EzB)cWEBYn`Nd+m9nZjJ#5F&A-ypw$##HXz9M$viDkWIodEExgJ@Hwilx9uchD6 zU)L9-_pfYef3<75zIp!a^|P;eUOcy4-?~)4vrxZtv3?g;pSgbK#lE!)vUS&wy4D^+ zMdtdKYocGQ^++VT{okaq>a4UDAdxL|=a!pWX3i{!YnH;>3gK;w;q7aUBwF|U*zDNL zyZ>CXeWkH!UcIiqFnZ1V!REG=w$3+>y?*TH2Yy}m+s$up{=N5)kN@eZ_nunl{nldJ zx3BfB)YGNI@oD7k-djjzNUFbwd?;h_v`#rr~!M~P4@2ZfhB^TfR}@M#0%^>7od)NFLb( zZz$f0AKVr6V$`lsK%QcdD-aH7z&`N;>+EY2dTB>loJ)%_?ij?l8-t}2;o9LWj<*pp zRzki0Q!yVu2n)3W0NP2Wab$KYg3kga=Y}_ifNJ1_4?hmA{2}<*FAUSgQ&S6(ybWXs z&3Hy8;$MGq?i%n*6p8@`oSx64B-{jtr{r+UTer>heG+OA&Va|{<;-HZbGc#5Y*0Kd zST*ae60xAbLcS9O+VJNWHy@4xn-v}?M@Ni7tqQm)z?Fe>e4PHgeQ&v|!!`U5{Y*m*Ddy0K@&HGBo|nN_G8Gb$g+@eW|*;P~CmA zdhd*PIaEFKjSs@RKdjrjRM%0c>v*&6&4!zG@tGbthrumNRXYk*J8o9(oIbHqQ9Z*K zHnlBQ?1VR?YbTcK+Y9yW3pMQvmF;W6^OC>zbH!8b-+GIZ=3Ub#7JUuNzQD6*zk7Be zx_zPTz@qOUygprvEQDGXd@c6t42Ju$s8x|jD0(uH;7D)$5PYm13Gw`u7=oLy#=49D z4EZusiVs4DjniB0e#Q5(?n`C@I4&{Dcoy6WPYcI45^M9F-AZ0&GZ=D)AR+sy2)$AG zr!eHY*QDE(N9`A>2l)W>1LP$J+WMAPlBCakKFPPbgGj-@k;o_H&_Bt+zmvWK>HAMG eEJZ#e@VV7Nsy9ssmuognhu5mld8Afhi~j-cQ+|N} literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt6.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/inputhookqt6.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..400599e826d8fe721ea77f8744e79cb50701877b GIT binary patch literal 5770 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 a=<=cKPk-s&w(2Lb{>vvp{aEm;&Hn(dcUnvU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/matplotlibtools.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/matplotlibtools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ec770c96a5be1102bb52882c8d43eb3792275db GIT binary patch literal 6275 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..098cf3413bfe18529674a99fa3b3d15c44b04f6a GIT binary patch literal 1082 zcmY*Y&2Jk;6rbJoe%Kr513^K7rgK0=5vjL?k3$8OA`;q2RTbk<#8R=^c%JP^cV{-U zW48_{GMtiA3l}O?ND(JcFBPYXzo1nwiE^OYQwo(TZb7;A#H<|?I)~qTZ}z?4`@Naj zN9A$}sr4|v(rg(B{gns9HG1S6K2^?-h#(&kjp&i)Yswmt9vi+97yLqO`etnTR&4ur z?D&p`KwEujNONpgUpe-N9w`w0u0Du-7hEWS2^QGk5WQh_G%=|o7$GLOcXVPwL7@$1 zAFV#xeRS^VKaJeg20Y(s;P#wjrl#qanE`H7^UI3OfbuZ&Y5^gC)F1Q5eYdMmJL~&% zxGM47(jrbFg1Y1a%T_3HJ!E(Va61KpCCBM?D(fw^Bd-H6ywp`iAtTDEQ391xX}Lwy zJUdn8fESi)_`S;6BTmX0PC_X`Fw7h0N`oTYpdyts11?41>Z|C?R#a7;Gonc6Ic8ku zw2D>n(+2MHHfEqi^(FMn@`gMjxLT8fvZhzP5(*l!{#2FH-}w<;p0+YO;vosvWLB;& z2WsG8>5JOp{6aSRLO7eb|HakiY~+8z`!7TvWY*x@`q(1tgb`H&1_!zR@(dnqC~T_} z2?d

    -r3yp2+MVAiN#~nauO_4GagsjhZjP(r<0S0eD@u4?Q>bj2Geez)?@td~*= zXOggfEo?&S5m;$AldczZfDzT0s8luMkr|Hat;tH#eeQf1bJC9Bym(c~$scoiOTmGm zY1%)!r4K~_5Pr#tb(M?Y77d;9lq9$r;+#V@r(!*HzwWSG{0g9@eI`N!iYZ*Tna_5Di^ pW_HFt|Muek_=(LMy^Bvyo!-8&ck1jedZTA;nw#zK8zTRW{{?3~Jski5 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt_for_kernel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/__pycache__/qt_for_kernel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14e7b08842ecc1b0c52f4e6616971fb65f3f1777 GIT binary patch literal 4313 zcmcf^OK%j(xqDtc)APhOk2Mb$n1_dl2Mi`FWJt*J2vNe?*bCZTqMk%oUi;}2ErKld0VtQPP177f#oRm;PFeiN+PCl=Tky1GI zBms~RPCe&c;9bx`+99<_tx{W&NfWf4`VMJ_-XgW=tx~JrCbjWg(U%U(-}pH0hF&lU zMFSM629l938wMuGnpCMgtYI`_5+obwMt_lxng$xj#K2m&C=QLP7J?rg#YlBoOj=lR z@EPo0ep0|CrS_LU4wv1yG3@kWyPxYX#zKiHg z_v!94X@{S~u)oN}|6uBjDBi>m=t(47C<{yQ<(3c~YaOAk$HF3K{0G zsT2`4H3bB)eQ>B7#FW6kF)rR<3OgS30Qf-;7n-bM@DW+lm?IFxR)5h^xv{Ygvw=$w ziz64|BvNnz90#g1DtA8|$-_7&GgrYrHTLT=_rK1nV^6ZP0}3G*0ei zbW9G7dmI#@>??r|&+GpDIkP|P&|Ke!{gG|kFV^)+c$#d|E4qbVv2E)W-?mXC|Z#A?O>q@WyKbp$5c=0?4&U&8;S-6bV}AH-Ll?9h(?I1Hm}IVD z3SG+;qAF_U3bw|nS;!QKIfm(F!&0GV$mm6AAu`YsWeQGfb+-FVPsUOyK2?BvDCe=2 zQSk6&zEI3SeKHi2UWRhKX`L9@`MW$Ue3p=h^kRQjx0U_F*a_Jf*d;cxvD z5@dy|31a2*S~&4q$!p|!*Z)%K68w{9=B-(E@FsfO>ojHKp&v>e&@T}6Ly zIeKWV4b5Mw#t#0kxxEf?vE*FeOy7&>-lgc?g`X~-TZx{oT&W4sO8FfMzkBJWyVMHQ zUzDDdeo>x(uq4{rwVn|@Rc@824_ zChn~6`tcuzmUa!Sh_|YNTk8-3T#ilNU}5jH9H${Jo^rI&j(7$BAv7RQ{AIV?)|(5C z8)L1?rZL72&ZeQj1*Ewpd9t5IJd`p&)+pv4jN=r)hi?fq=E0q!+9Em0NP7-!=(o~Bg za|Fpb*5*2wr-2~^cLnPtyILtYN3d);T`N)Gie-*CO>2SR5xCD7IqZDiw8f3nTMDv! zNe^UV=W>xw5avAFZxtmOv6b5Zkl7g zT2oT<*&(-CCComHZ8Ab+pTiO|WFv<_Gs%rJjK?rlxNk%*v1j&f0XP^3hAkHjjV(aB=Xr*)Oxd%dd7^d*y}mDtI6$vYs_Zd1l_v+;;x1drW)(9B&Nu?!r+*vnbNBWV z=>cSRBCXG0dhO?V{wrSxA6Wk(&++14Iq~mY=8Z4H``&Oct+VOt_FjIF|GL1p@u{!6 vx!CU6i(4pFoU`L} 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhook.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhook.py new file mode 100644 index 0000000..db606e3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhook.py @@ -0,0 +1,614 @@ +# coding: utf-8 +""" +Inputhook management for GUI event loop integration. +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +import sys +import select + +# ----------------------------------------------------------------------------- +# Constants +# ----------------------------------------------------------------------------- + +# Constants for identifying the GUI toolkits. +GUI_WX = "wx" +GUI_QT = "qt" +GUI_QT4 = "qt4" +GUI_QT5 = "qt5" +GUI_QT6 = "qt6" +GUI_GTK = "gtk" +GUI_TK = "tk" +GUI_OSX = "osx" +GUI_GLUT = "glut" +GUI_PYGLET = "pyglet" +GUI_GTK3 = "gtk3" +GUI_NONE = "none" # i.e. disable + +# ----------------------------------------------------------------------------- +# Utilities +# ----------------------------------------------------------------------------- + + +def ignore_CTRL_C(): + """Ignore CTRL+C (not implemented).""" + pass + + +def allow_CTRL_C(): + """Take CTRL+C into account (not implemented).""" + pass + + +# ----------------------------------------------------------------------------- +# Main InputHookManager class +# ----------------------------------------------------------------------------- + + +class InputHookManager(object): + """Manage PyOS_InputHook for different GUI toolkits. + + This class installs various hooks under ``PyOSInputHook`` to handle + GUI event loop integration. + """ + + def __init__(self): + self._return_control_callback = None + self._apps = {} + self._reset() + self.pyplot_imported = False + + def _reset(self): + self._callback_pyfunctype = None + self._callback = None + self._current_gui = None + + def set_return_control_callback(self, return_control_callback): + self._return_control_callback = return_control_callback + + def get_return_control_callback(self): + return self._return_control_callback + + def return_control(self): + return self._return_control_callback() + + def get_inputhook(self): + return self._callback + + def set_inputhook(self, callback): + """Set inputhook to callback.""" + # We don't (in the context of PyDev console) actually set PyOS_InputHook, but rather + # while waiting for input on xmlrpc we run this code + self._callback = callback + + def clear_inputhook(self, app=None): + """Clear input hook. + + Parameters + ---------- + app : optional, ignored + This parameter is allowed only so that clear_inputhook() can be + called with a similar interface as all the ``enable_*`` methods. But + the actual value of the parameter is ignored. This uniform interface + makes it easier to have user-level entry points in the main IPython + app like :meth:`enable_gui`.""" + self._reset() + + def clear_app_refs(self, gui=None): + """Clear IPython's internal reference to an application instance. + + Whenever we create an app for a user on qt4 or wx, we hold a + reference to the app. This is needed because in some cases bad things + can happen if a user doesn't hold a reference themselves. This + method is provided to clear the references we are holding. + + Parameters + ---------- + gui : None or str + If None, clear all app references. If ('wx', 'qt4') clear + the app for that toolkit. References are not held for gtk or tk + as those toolkits don't have the notion of an app. + """ + if gui is None: + self._apps = {} + elif gui in self._apps: + del self._apps[gui] + + def enable_wx(self, app=None): + """Enable event loop integration with wxPython. + + Parameters + ---------- + app : WX Application, optional. + Running application to use. If not given, we probe WX for an + existing application object, and create a new one if none is found. + + Notes + ----- + This methods sets the ``PyOS_InputHook`` for wxPython, which allows + the wxPython to integrate with terminal based applications like + IPython. + + If ``app`` is not given we probe for an existing one, and return it if + found. If no existing app is found, we create an :class:`wx.App` as + follows:: + + import wx + app = wx.App(redirect=False, clearSigInt=False) + """ + import wx + from distutils.version import LooseVersion as V + + wx_version = V(wx.__version__).version # @UndefinedVariable + + if wx_version < [2, 8]: + raise ValueError("requires wxPython >= 2.8, but you have %s" % wx.__version__) # @UndefinedVariable + + from pydev_ipython.inputhookwx import inputhook_wx + + self.set_inputhook(inputhook_wx) + self._current_gui = GUI_WX + + if app is None: + app = wx.GetApp() # @UndefinedVariable + if app is None: + app = wx.App(redirect=False, clearSigInt=False) # @UndefinedVariable + app._in_event_loop = True + self._apps[GUI_WX] = app + return app + + def disable_wx(self): + """Disable event loop integration with wxPython. + + This merely sets PyOS_InputHook to NULL. + """ + if GUI_WX in self._apps: + self._apps[GUI_WX]._in_event_loop = False + self.clear_inputhook() + + def enable_qt(self, app=None): + from pydev_ipython.qt_for_kernel import QT_API, QT_API_PYQT5, QT_API_PYQT6 + + if QT_API == QT_API_PYQT6: + self.enable_qt6(app) + elif QT_API == QT_API_PYQT5: + self.enable_qt5(app) + else: + self.enable_qt4(app) + + def enable_qt4(self, app=None): + """Enable event loop integration with PyQt4. + + Parameters + ---------- + app : Qt Application, optional. + Running application to use. If not given, we probe Qt for an + existing application object, and create a new one if none is found. + + Notes + ----- + This methods sets the PyOS_InputHook for PyQt4, which allows + the PyQt4 to integrate with terminal based applications like + IPython. + + If ``app`` is not given we probe for an existing one, and return it if + found. If no existing app is found, we create an :class:`QApplication` + as follows:: + + from PyQt4 import QtCore + app = QtGui.QApplication(sys.argv) + """ + from pydev_ipython.inputhookqt4 import create_inputhook_qt4 + + app, inputhook_qt4 = create_inputhook_qt4(self, app) + self.set_inputhook(inputhook_qt4) + + self._current_gui = GUI_QT4 + app._in_event_loop = True + self._apps[GUI_QT4] = app + return app + + def disable_qt4(self): + """Disable event loop integration with PyQt4. + + This merely sets PyOS_InputHook to NULL. + """ + if GUI_QT4 in self._apps: + self._apps[GUI_QT4]._in_event_loop = False + self.clear_inputhook() + + def enable_qt5(self, app=None): + from pydev_ipython.inputhookqt5 import create_inputhook_qt5 + + app, inputhook_qt5 = create_inputhook_qt5(self, app) + self.set_inputhook(inputhook_qt5) + + self._current_gui = GUI_QT5 + app._in_event_loop = True + self._apps[GUI_QT5] = app + return app + + def disable_qt5(self): + if GUI_QT5 in self._apps: + self._apps[GUI_QT5]._in_event_loop = False + self.clear_inputhook() + + def enable_qt6(self, app=None): + from pydev_ipython.inputhookqt6 import create_inputhook_qt6 + + app, inputhook_qt6 = create_inputhook_qt6(self, app) + self.set_inputhook(inputhook_qt6) + + self._current_gui = GUI_QT6 + app._in_event_loop = True + self._apps[GUI_QT6] = app + return app + + def disable_qt6(self): + if GUI_QT6 in self._apps: + self._apps[GUI_QT6]._in_event_loop = False + self.clear_inputhook() + + def enable_gtk(self, app=None): + """Enable event loop integration with PyGTK. + + Parameters + ---------- + app : ignored + Ignored, it's only a placeholder to keep the call signature of all + gui activation methods consistent, which simplifies the logic of + supporting magics. + + Notes + ----- + This methods sets the PyOS_InputHook for PyGTK, which allows + the PyGTK to integrate with terminal based applications like + IPython. + """ + from pydev_ipython.inputhookgtk import create_inputhook_gtk + + self.set_inputhook(create_inputhook_gtk(self._stdin_file)) + self._current_gui = GUI_GTK + + def disable_gtk(self): + """Disable event loop integration with PyGTK. + + This merely sets PyOS_InputHook to NULL. + """ + self.clear_inputhook() + + def enable_tk(self, app=None): + """Enable event loop integration with Tk. + + Parameters + ---------- + app : toplevel :class:`Tkinter.Tk` widget, optional. + Running toplevel widget to use. If not given, we probe Tk for an + existing one, and create a new one if none is found. + + Notes + ----- + If you have already created a :class:`Tkinter.Tk` object, the only + thing done by this method is to register with the + :class:`InputHookManager`, since creating that object automatically + sets ``PyOS_InputHook``. + """ + self._current_gui = GUI_TK + if app is None: + try: + import Tkinter as _TK + except: + # Python 3 + import tkinter as _TK # @UnresolvedImport + app = _TK.Tk() + app.withdraw() + self._apps[GUI_TK] = app + + from pydev_ipython.inputhooktk import create_inputhook_tk + + self.set_inputhook(create_inputhook_tk(app)) + return app + + def disable_tk(self): + """Disable event loop integration with Tkinter. + + This merely sets PyOS_InputHook to NULL. + """ + self.clear_inputhook() + + def enable_glut(self, app=None): + """Enable event loop integration with GLUT. + + Parameters + ---------- + + app : ignored + Ignored, it's only a placeholder to keep the call signature of all + gui activation methods consistent, which simplifies the logic of + supporting magics. + + Notes + ----- + + This methods sets the PyOS_InputHook for GLUT, which allows the GLUT to + integrate with terminal based applications like IPython. Due to GLUT + limitations, it is currently not possible to start the event loop + without first creating a window. You should thus not create another + window but use instead the created one. See 'gui-glut.py' in the + docs/examples/lib directory. + + The default screen mode is set to: + glut.GLUT_DOUBLE | glut.GLUT_RGBA | glut.GLUT_DEPTH + """ + + import OpenGL.GLUT as glut # @UnresolvedImport + from pydev_ipython.inputhookglut import glut_display_mode, glut_close, glut_display, glut_idle, inputhook_glut + + if GUI_GLUT not in self._apps: + argv = getattr(sys, "argv", []) + glut.glutInit(argv) + glut.glutInitDisplayMode(glut_display_mode) + # This is specific to freeglut + if bool(glut.glutSetOption): + glut.glutSetOption(glut.GLUT_ACTION_ON_WINDOW_CLOSE, glut.GLUT_ACTION_GLUTMAINLOOP_RETURNS) + glut.glutCreateWindow(argv[0] if len(argv) > 0 else "") + glut.glutReshapeWindow(1, 1) + glut.glutHideWindow() + glut.glutWMCloseFunc(glut_close) + glut.glutDisplayFunc(glut_display) + glut.glutIdleFunc(glut_idle) + else: + glut.glutWMCloseFunc(glut_close) + glut.glutDisplayFunc(glut_display) + glut.glutIdleFunc(glut_idle) + self.set_inputhook(inputhook_glut) + self._current_gui = GUI_GLUT + self._apps[GUI_GLUT] = True + + def disable_glut(self): + """Disable event loop integration with glut. + + This sets PyOS_InputHook to NULL and set the display function to a + dummy one and set the timer to a dummy timer that will be triggered + very far in the future. + """ + import OpenGL.GLUT as glut # @UnresolvedImport + from glut_support import glutMainLoopEvent # @UnresolvedImport + + glut.glutHideWindow() # This is an event to be processed below + glutMainLoopEvent() + self.clear_inputhook() + + def enable_pyglet(self, app=None): + """Enable event loop integration with pyglet. + + Parameters + ---------- + app : ignored + Ignored, it's only a placeholder to keep the call signature of all + gui activation methods consistent, which simplifies the logic of + supporting magics. + + Notes + ----- + This methods sets the ``PyOS_InputHook`` for pyglet, which allows + pyglet to integrate with terminal based applications like + IPython. + + """ + from pydev_ipython.inputhookpyglet import inputhook_pyglet + + self.set_inputhook(inputhook_pyglet) + self._current_gui = GUI_PYGLET + return app + + def disable_pyglet(self): + """Disable event loop integration with pyglet. + + This merely sets PyOS_InputHook to NULL. + """ + self.clear_inputhook() + + def enable_gtk3(self, app=None): + """Enable event loop integration with Gtk3 (gir bindings). + + Parameters + ---------- + app : ignored + Ignored, it's only a placeholder to keep the call signature of all + gui activation methods consistent, which simplifies the logic of + supporting magics. + + Notes + ----- + This methods sets the PyOS_InputHook for Gtk3, which allows + the Gtk3 to integrate with terminal based applications like + IPython. + """ + from pydev_ipython.inputhookgtk3 import create_inputhook_gtk3 + + self.set_inputhook(create_inputhook_gtk3(self._stdin_file)) + self._current_gui = GUI_GTK + + def disable_gtk3(self): + """Disable event loop integration with PyGTK. + + This merely sets PyOS_InputHook to NULL. + """ + self.clear_inputhook() + + def enable_mac(self, app=None): + """Enable event loop integration with MacOSX. + + We call function pyplot.pause, which updates and displays active + figure during pause. It's not MacOSX-specific, but it enables to + avoid inputhooks in native MacOSX backend. + Also we shouldn't import pyplot, until user does it. Cause it's + possible to choose backend before importing pyplot for the first + time only. + """ + + def inputhook_mac(app=None): + if self.pyplot_imported: + pyplot = sys.modules["matplotlib.pyplot"] + try: + pyplot.pause(0.01) + except: + pass + else: + if "matplotlib.pyplot" in sys.modules: + self.pyplot_imported = True + + self.set_inputhook(inputhook_mac) + self._current_gui = GUI_OSX + + def disable_mac(self): + self.clear_inputhook() + + def current_gui(self): + """Return a string indicating the currently active GUI or None.""" + return self._current_gui + + +inputhook_manager = InputHookManager() + +enable_wx = inputhook_manager.enable_wx +disable_wx = inputhook_manager.disable_wx +enable_qt = inputhook_manager.enable_qt +enable_qt4 = inputhook_manager.enable_qt4 +disable_qt4 = inputhook_manager.disable_qt4 +enable_qt5 = inputhook_manager.enable_qt5 +disable_qt5 = inputhook_manager.disable_qt5 +enable_gtk = inputhook_manager.enable_gtk +disable_gtk = inputhook_manager.disable_gtk +enable_tk = inputhook_manager.enable_tk +disable_tk = inputhook_manager.disable_tk +enable_glut = inputhook_manager.enable_glut +disable_glut = inputhook_manager.disable_glut +enable_pyglet = inputhook_manager.enable_pyglet +disable_pyglet = inputhook_manager.disable_pyglet +enable_gtk3 = inputhook_manager.enable_gtk3 +disable_gtk3 = inputhook_manager.disable_gtk3 +enable_mac = inputhook_manager.enable_mac +disable_mac = inputhook_manager.disable_mac +clear_inputhook = inputhook_manager.clear_inputhook +set_inputhook = inputhook_manager.set_inputhook +current_gui = inputhook_manager.current_gui +clear_app_refs = inputhook_manager.clear_app_refs + +# We maintain this as stdin_ready so that the individual inputhooks +# can diverge as little as possible from their IPython sources +stdin_ready = inputhook_manager.return_control +set_return_control_callback = inputhook_manager.set_return_control_callback +get_return_control_callback = inputhook_manager.get_return_control_callback +get_inputhook = inputhook_manager.get_inputhook + + +# Convenience function to switch amongst them +def enable_gui(gui=None, app=None): + """Switch amongst GUI input hooks by name. + + This is just a utility wrapper around the methods of the InputHookManager + object. + + Parameters + ---------- + gui : optional, string or None + If None (or 'none'), clears input hook, otherwise it must be one + of the recognized GUI names (see ``GUI_*`` constants in module). + + app : optional, existing application object. + For toolkits that have the concept of a global app, you can supply an + existing one. If not given, the toolkit will be probed for one, and if + none is found, a new one will be created. Note that GTK does not have + this concept, and passing an app if ``gui=="GTK"`` will raise an error. + + Returns + ------- + The output of the underlying gui switch routine, typically the actual + PyOS_InputHook wrapper object or the GUI toolkit app created, if there was + one. + """ + + if get_return_control_callback() is None: + raise ValueError("A return_control_callback must be supplied as a reference before a gui can be enabled") + + guis = { + GUI_NONE: clear_inputhook, + GUI_OSX: enable_mac, + GUI_TK: enable_tk, + GUI_GTK: enable_gtk, + GUI_WX: enable_wx, + GUI_QT: enable_qt, + GUI_QT4: enable_qt4, + GUI_QT5: enable_qt5, + GUI_GLUT: enable_glut, + GUI_PYGLET: enable_pyglet, + GUI_GTK3: enable_gtk3, + } + try: + gui_hook = guis[gui] + except KeyError: + if gui is None or gui == "": + gui_hook = clear_inputhook + else: + e = "Invalid GUI request %r, valid ones are:%s" % (gui, list(guis.keys())) + raise ValueError(e) + return gui_hook(app) + + +__all__ = [ + "GUI_WX", + "GUI_QT", + "GUI_QT4", + "GUI_QT5", + "GUI_GTK", + "GUI_TK", + "GUI_OSX", + "GUI_GLUT", + "GUI_PYGLET", + "GUI_GTK3", + "GUI_NONE", + "ignore_CTRL_C", + "allow_CTRL_C", + "InputHookManager", + "inputhook_manager", + "enable_wx", + "disable_wx", + "enable_qt", + "enable_qt4", + "disable_qt4", + "enable_qt5", + "disable_qt5", + "enable_gtk", + "disable_gtk", + "enable_tk", + "disable_tk", + "enable_glut", + "disable_glut", + "enable_pyglet", + "disable_pyglet", + "enable_gtk3", + "disable_gtk3", + "enable_mac", + "disable_mac", + "clear_inputhook", + "set_inputhook", + "current_gui", + "clear_app_refs", + "stdin_ready", + "set_return_control_callback", + "get_return_control_callback", + "get_inputhook", + "enable_gui", +] diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookglut.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookglut.py new file mode 100644 index 0000000..feab648 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookglut.py @@ -0,0 +1,150 @@ +# coding: utf-8 +""" +GLUT Inputhook support functions +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# GLUT is quite an old library and it is difficult to ensure proper +# integration within IPython since original GLUT does not allow to handle +# events one by one. Instead, it requires for the mainloop to be entered +# and never returned (there is not even a function to exit he +# mainloop). Fortunately, there are alternatives such as freeglut +# (available for linux and windows) and the OSX implementation gives +# access to a glutCheckLoop() function that blocks itself until a new +# event is received. This means we have to setup the idle callback to +# ensure we got at least one event that will unblock the function. +# +# Furthermore, it is not possible to install these handlers without a window +# being first created. We choose to make this window invisible. This means that +# display mode options are set at this level and user won't be able to change +# them later without modifying the code. This should probably be made available +# via IPython options system. + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- +import os +import sys +from _pydev_bundle._pydev_saved_modules import time +import signal +import OpenGL.GLUT as glut # @UnresolvedImport +import OpenGL.platform as platform # @UnresolvedImport +from timeit import default_timer as clock +from pydev_ipython.inputhook import stdin_ready + +# ----------------------------------------------------------------------------- +# Constants +# ----------------------------------------------------------------------------- + +# Frame per second : 60 +# Should probably be an IPython option +glut_fps = 60 + +# Display mode : double buffeed + rgba + depth +# Should probably be an IPython option +glut_display_mode = glut.GLUT_DOUBLE | glut.GLUT_RGBA | glut.GLUT_DEPTH + +glutMainLoopEvent = None +if sys.platform == "darwin": + try: + glutCheckLoop = platform.createBaseFunction( + "glutCheckLoop", + dll=platform.GLUT, + resultType=None, + argTypes=[], + doc="glutCheckLoop( ) -> None", + argNames=(), + ) + except AttributeError: + raise RuntimeError("""Your glut implementation does not allow interactive sessions""" """Consider installing freeglut.""") + glutMainLoopEvent = glutCheckLoop +elif glut.HAVE_FREEGLUT: + glutMainLoopEvent = glut.glutMainLoopEvent +else: + raise RuntimeError("""Your glut implementation does not allow interactive sessions. """ """Consider installing freeglut.""") + +# ----------------------------------------------------------------------------- +# Callback functions +# ----------------------------------------------------------------------------- + + +def glut_display(): + # Dummy display function + pass + + +def glut_idle(): + # Dummy idle function + pass + + +def glut_close(): + # Close function only hides the current window + glut.glutHideWindow() + glutMainLoopEvent() + + +def glut_int_handler(signum, frame): + # Catch sigint and print the defautl message + signal.signal(signal.SIGINT, signal.default_int_handler) + print("\nKeyboardInterrupt") + # Need to reprint the prompt at this stage + + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- +def inputhook_glut(): + """Run the pyglet event loop by processing pending events only. + + This keeps processing pending events until stdin is ready. After + processing all pending events, a call to time.sleep is inserted. This is + needed, otherwise, CPU usage is at 100%. This sleep time should be tuned + though for best performance. + """ + # We need to protect against a user pressing Control-C when IPython is + # idle and this is running. We trap KeyboardInterrupt and pass. + + signal.signal(signal.SIGINT, glut_int_handler) + + try: + t = clock() + + # Make sure the default window is set after a window has been closed + if glut.glutGetWindow() == 0: + glut.glutSetWindow(1) + glutMainLoopEvent() + return 0 + + while not stdin_ready(): + glutMainLoopEvent() + # We need to sleep at this point to keep the idle CPU load + # low. However, if sleep to long, GUI response is poor. As + # a compromise, we watch how often GUI events are being processed + # and switch between a short and long sleep time. Here are some + # stats useful in helping to tune this. + # time CPU load + # 0.001 13% + # 0.005 3% + # 0.01 1.5% + # 0.05 0.5% + used_time = clock() - t + if used_time > 10.0: + # print 'Sleep for 1 s' # dbg + time.sleep(1.0) + elif used_time > 0.1: + # Few GUI events coming in, so we can sleep longer + # print 'Sleep for 0.05 s' # dbg + time.sleep(0.05) + else: + # Many GUI events coming in, so sleep only very little + time.sleep(0.001) + except KeyboardInterrupt: + pass + return 0 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk.py new file mode 100644 index 0000000..8911a86 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk.py @@ -0,0 +1,37 @@ +# encoding: utf-8 +""" +Enable pygtk to be used interacive by setting PyOS_InputHook. + +Authors: Brian Granger +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +import gtk, gobject # @UnresolvedImport + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- + + +def _main_quit(*args, **kwargs): + gtk.main_quit() + return False + + +def create_inputhook_gtk(stdin_file): + def inputhook_gtk(): + gobject.io_add_watch(stdin_file, gobject.IO_IN, _main_quit) + gtk.main() + return 0 + + return inputhook_gtk diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk3.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk3.py new file mode 100644 index 0000000..198f9b8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk3.py @@ -0,0 +1,37 @@ +# encoding: utf-8 +""" +Enable Gtk3 to be used interacive by IPython. + +Authors: Thomi Richards +""" +# ----------------------------------------------------------------------------- +# Copyright (c) 2012, the IPython Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +from gi.repository import Gtk, GLib # @UnresolvedImport + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- + + +def _main_quit(*args, **kwargs): + Gtk.main_quit() + return False + + +def create_inputhook_gtk3(stdin_file): + def inputhook_gtk3(): + GLib.io_add_watch(stdin_file, GLib.IO_IN, _main_quit) + Gtk.main() + return 0 + + return inputhook_gtk3 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookpyglet.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookpyglet.py new file mode 100644 index 0000000..76d5f63 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookpyglet.py @@ -0,0 +1,95 @@ +# encoding: utf-8 +""" +Enable pyglet to be used interacive by setting PyOS_InputHook. + +Authors +------- + +* Nicolas P. Rougier +* Fernando Perez +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +import os +import sys +from _pydev_bundle._pydev_saved_modules import time +from timeit import default_timer as clock +import pyglet # @UnresolvedImport +from pydev_ipython.inputhook import stdin_ready + + +# On linux only, window.flip() has a bug that causes an AttributeError on +# window close. For details, see: +# http://groups.google.com/group/pyglet-users/browse_thread/thread/47c1aab9aa4a3d23/c22f9e819826799e?#c22f9e819826799e + +if sys.platform.startswith("linux"): + + def flip(window): + try: + window.flip() + except AttributeError: + pass +else: + + def flip(window): + window.flip() + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- + + +def inputhook_pyglet(): + """Run the pyglet event loop by processing pending events only. + + This keeps processing pending events until stdin is ready. After + processing all pending events, a call to time.sleep is inserted. This is + needed, otherwise, CPU usage is at 100%. This sleep time should be tuned + though for best performance. + """ + # We need to protect against a user pressing Control-C when IPython is + # idle and this is running. We trap KeyboardInterrupt and pass. + try: + t = clock() + while not stdin_ready(): + pyglet.clock.tick() + for window in pyglet.app.windows: + window.switch_to() + window.dispatch_events() + window.dispatch_event("on_draw") + flip(window) + + # We need to sleep at this point to keep the idle CPU load + # low. However, if sleep to long, GUI response is poor. As + # a compromise, we watch how often GUI events are being processed + # and switch between a short and long sleep time. Here are some + # stats useful in helping to tune this. + # time CPU load + # 0.001 13% + # 0.005 3% + # 0.01 1.5% + # 0.05 0.5% + used_time = clock() - t + if used_time > 10.0: + # print 'Sleep for 1 s' # dbg + time.sleep(1.0) + elif used_time > 0.1: + # Few GUI events coming in, so we can sleep longer + # print 'Sleep for 0.05 s' # dbg + time.sleep(0.05) + else: + # Many GUI events coming in, so sleep only very little + time.sleep(0.001) + except KeyboardInterrupt: + pass + return 0 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt4.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt4.py new file mode 100644 index 0000000..dd819fb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt4.py @@ -0,0 +1,198 @@ +# -*- coding: utf-8 -*- +""" +Qt4's inputhook support function + +Author: Christian Boos +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +import os +import signal + +from _pydev_bundle._pydev_saved_modules import threading + +from pydev_ipython.qt_for_kernel import QtCore, QtGui +from pydev_ipython.inputhook import allow_CTRL_C, ignore_CTRL_C, stdin_ready + + +# To minimise future merging complexity, rather than edit the entire code base below +# we fake InteractiveShell here +class InteractiveShell: + _instance = None + + @classmethod + def instance(cls): + if cls._instance is None: + cls._instance = cls() + return cls._instance + + def set_hook(self, *args, **kwargs): + # We don't consider the pre_prompt_hook because we don't have + # KeyboardInterrupts to consider since we are running under PyDev + pass + + +# ----------------------------------------------------------------------------- +# Module Globals +# ----------------------------------------------------------------------------- + +got_kbdint = False +sigint_timer = None + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- + + +def create_inputhook_qt4(mgr, app=None): + """Create an input hook for running the Qt4 application event loop. + + Parameters + ---------- + mgr : an InputHookManager + + app : Qt Application, optional. + Running application to use. If not given, we probe Qt for an + existing application object, and create a new one if none is found. + + Returns + ------- + A pair consisting of a Qt Application (either the one given or the + one found or created) and a inputhook. + + Notes + ----- + We use a custom input hook instead of PyQt4's default one, as it + interacts better with the readline packages (issue #481). + + The inputhook function works in tandem with a 'pre_prompt_hook' + which automatically restores the hook as an inputhook in case the + latter has been temporarily disabled after having intercepted a + KeyboardInterrupt. + """ + + if app is None: + app = QtCore.QCoreApplication.instance() + if app is None: + app = QtGui.QApplication([" "]) + + # Re-use previously created inputhook if any + ip = InteractiveShell.instance() + if hasattr(ip, "_inputhook_qt4"): + return app, ip._inputhook_qt4 + + # Otherwise create the inputhook_qt4/preprompthook_qt4 pair of + # hooks (they both share the got_kbdint flag) + + def inputhook_qt4(): + """PyOS_InputHook python hook for Qt4. + + Process pending Qt events and if there's no pending keyboard + input, spend a short slice of time (50ms) running the Qt event + loop. + + As a Python ctypes callback can't raise an exception, we catch + the KeyboardInterrupt and temporarily deactivate the hook, + which will let a *second* CTRL+C be processed normally and go + back to a clean prompt line. + """ + try: + allow_CTRL_C() + app = QtCore.QCoreApplication.instance() + if not app: # shouldn't happen, but safer if it happens anyway... + return 0 + app.processEvents(QtCore.QEventLoop.AllEvents, 300) + if not stdin_ready(): + # Generally a program would run QCoreApplication::exec() + # from main() to enter and process the Qt event loop until + # quit() or exit() is called and the program terminates. + # + # For our input hook integration, we need to repeatedly + # enter and process the Qt event loop for only a short + # amount of time (say 50ms) to ensure that Python stays + # responsive to other user inputs. + # + # A naive approach would be to repeatedly call + # QCoreApplication::exec(), using a timer to quit after a + # short amount of time. Unfortunately, QCoreApplication + # emits an aboutToQuit signal before stopping, which has + # the undesirable effect of closing all modal windows. + # + # To work around this problem, we instead create a + # QEventLoop and call QEventLoop::exec(). Other than + # setting some state variables which do not seem to be + # used anywhere, the only thing QCoreApplication adds is + # the aboutToQuit signal which is precisely what we are + # trying to avoid. + timer = QtCore.QTimer() + event_loop = QtCore.QEventLoop() + timer.timeout.connect(event_loop.quit) + while not stdin_ready(): + timer.start(50) + event_loop.exec_() + timer.stop() + except KeyboardInterrupt: + global got_kbdint, sigint_timer + + ignore_CTRL_C() + got_kbdint = True + mgr.clear_inputhook() + + # This generates a second SIGINT so the user doesn't have to + # press CTRL+C twice to get a clean prompt. + # + # Since we can't catch the resulting KeyboardInterrupt here + # (because this is a ctypes callback), we use a timer to + # generate the SIGINT after we leave this callback. + # + # Unfortunately this doesn't work on Windows (SIGINT kills + # Python and CTRL_C_EVENT doesn't work). + if os.name == "posix": + pid = os.getpid() + if not sigint_timer: + sigint_timer = threading.Timer(0.01, os.kill, args=[pid, signal.SIGINT]) + sigint_timer.start() + else: + print("\nKeyboardInterrupt - Ctrl-C again for new prompt") + + except: # NO exceptions are allowed to escape from a ctypes callback + ignore_CTRL_C() + from traceback import print_exc + + print_exc() + print("Got exception from inputhook_qt4, unregistering.") + mgr.clear_inputhook() + finally: + allow_CTRL_C() + return 0 + + def preprompthook_qt4(ishell): + """'pre_prompt_hook' used to restore the Qt4 input hook + + (in case the latter was temporarily deactivated after a + CTRL+C) + """ + global got_kbdint, sigint_timer + + if sigint_timer: + sigint_timer.cancel() + sigint_timer = None + + if got_kbdint: + mgr.set_inputhook(inputhook_qt4) + got_kbdint = False + + ip._inputhook_qt4 = inputhook_qt4 + ip.set_hook("pre_prompt_hook", preprompthook_qt4) + + return app, inputhook_qt4 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt5.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt5.py new file mode 100644 index 0000000..f38383e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt5.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +""" +Qt5's inputhook support function + +Author: Christian Boos +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +import os +import signal + +from _pydev_bundle._pydev_saved_modules import threading + +from pydev_ipython.qt_for_kernel import QtCore, QtGui +from pydev_ipython.inputhook import allow_CTRL_C, ignore_CTRL_C, stdin_ready + + +# To minimise future merging complexity, rather than edit the entire code base below +# we fake InteractiveShell here +class InteractiveShell: + _instance = None + + @classmethod + def instance(cls): + if cls._instance is None: + cls._instance = cls() + return cls._instance + + def set_hook(self, *args, **kwargs): + # We don't consider the pre_prompt_hook because we don't have + # KeyboardInterrupts to consider since we are running under PyDev + pass + + +# ----------------------------------------------------------------------------- +# Module Globals +# ----------------------------------------------------------------------------- + + +got_kbdint = False +sigint_timer = None + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- + + +def create_inputhook_qt5(mgr, app=None): + """Create an input hook for running the Qt5 application event loop. + + Parameters + ---------- + mgr : an InputHookManager + + app : Qt Application, optional. + Running application to use. If not given, we probe Qt for an + existing application object, and create a new one if none is found. + + Returns + ------- + A pair consisting of a Qt Application (either the one given or the + one found or created) and a inputhook. + + Notes + ----- + We use a custom input hook instead of PyQt5's default one, as it + interacts better with the readline packages (issue #481). + + The inputhook function works in tandem with a 'pre_prompt_hook' + which automatically restores the hook as an inputhook in case the + latter has been temporarily disabled after having intercepted a + KeyboardInterrupt. + """ + + if app is None: + app = QtCore.QCoreApplication.instance() + if app is None: + from PyQt5 import QtWidgets + + app = QtWidgets.QApplication([" "]) + + # Re-use previously created inputhook if any + ip = InteractiveShell.instance() + if hasattr(ip, "_inputhook_qt5"): + return app, ip._inputhook_qt5 + + # Otherwise create the inputhook_qt5/preprompthook_qt5 pair of + # hooks (they both share the got_kbdint flag) + + def inputhook_qt5(): + """PyOS_InputHook python hook for Qt5. + + Process pending Qt events and if there's no pending keyboard + input, spend a short slice of time (50ms) running the Qt event + loop. + + As a Python ctypes callback can't raise an exception, we catch + the KeyboardInterrupt and temporarily deactivate the hook, + which will let a *second* CTRL+C be processed normally and go + back to a clean prompt line. + """ + try: + allow_CTRL_C() + app = QtCore.QCoreApplication.instance() + if not app: # shouldn't happen, but safer if it happens anyway... + return 0 + app.processEvents(QtCore.QEventLoop.AllEvents, 300) + if not stdin_ready(): + # Generally a program would run QCoreApplication::exec() + # from main() to enter and process the Qt event loop until + # quit() or exit() is called and the program terminates. + # + # For our input hook integration, we need to repeatedly + # enter and process the Qt event loop for only a short + # amount of time (say 50ms) to ensure that Python stays + # responsive to other user inputs. + # + # A naive approach would be to repeatedly call + # QCoreApplication::exec(), using a timer to quit after a + # short amount of time. Unfortunately, QCoreApplication + # emits an aboutToQuit signal before stopping, which has + # the undesirable effect of closing all modal windows. + # + # To work around this problem, we instead create a + # QEventLoop and call QEventLoop::exec(). Other than + # setting some state variables which do not seem to be + # used anywhere, the only thing QCoreApplication adds is + # the aboutToQuit signal which is precisely what we are + # trying to avoid. + timer = QtCore.QTimer() + event_loop = QtCore.QEventLoop() + timer.timeout.connect(event_loop.quit) + while not stdin_ready(): + timer.start(50) + event_loop.exec_() + timer.stop() + except KeyboardInterrupt: + global got_kbdint, sigint_timer + + ignore_CTRL_C() + got_kbdint = True + mgr.clear_inputhook() + + # This generates a second SIGINT so the user doesn't have to + # press CTRL+C twice to get a clean prompt. + # + # Since we can't catch the resulting KeyboardInterrupt here + # (because this is a ctypes callback), we use a timer to + # generate the SIGINT after we leave this callback. + # + # Unfortunately this doesn't work on Windows (SIGINT kills + # Python and CTRL_C_EVENT doesn't work). + if os.name == "posix": + pid = os.getpid() + if not sigint_timer: + sigint_timer = threading.Timer(0.01, os.kill, args=[pid, signal.SIGINT]) + sigint_timer.start() + else: + print("\nKeyboardInterrupt - Ctrl-C again for new prompt") + + except: # NO exceptions are allowed to escape from a ctypes callback + ignore_CTRL_C() + from traceback import print_exc + + print_exc() + print("Got exception from inputhook_qt5, unregistering.") + mgr.clear_inputhook() + finally: + allow_CTRL_C() + return 0 + + def preprompthook_qt5(ishell): + """'pre_prompt_hook' used to restore the Qt5 input hook + + (in case the latter was temporarily deactivated after a + CTRL+C) + """ + global got_kbdint, sigint_timer + + if sigint_timer: + sigint_timer.cancel() + sigint_timer = None + + if got_kbdint: + mgr.set_inputhook(inputhook_qt5) + got_kbdint = False + + ip._inputhook_qt5 = inputhook_qt5 + ip.set_hook("pre_prompt_hook", preprompthook_qt5) + + return app, inputhook_qt5 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt6.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt6.py new file mode 100644 index 0000000..05ebb75 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt6.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +""" +Qt6's inputhook support function + +Author: Christian Boos, Marijn van Vliet +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +import os +import signal + +from _pydev_bundle._pydev_saved_modules import threading + +from pydev_ipython.qt_for_kernel import QtCore, QtGui +from pydev_ipython.inputhook import allow_CTRL_C, ignore_CTRL_C, stdin_ready + + +# To minimise future merging complexity, rather than edit the entire code base below +# we fake InteractiveShell here +class InteractiveShell: + _instance = None + + @classmethod + def instance(cls): + if cls._instance is None: + cls._instance = cls() + return cls._instance + + def set_hook(self, *args, **kwargs): + # We don't consider the pre_prompt_hook because we don't have + # KeyboardInterrupts to consider since we are running under PyDev + pass + + +# ----------------------------------------------------------------------------- +# Module Globals +# ----------------------------------------------------------------------------- + + +got_kbdint = False +sigint_timer = None + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- + + +def create_inputhook_qt6(mgr, app=None): + """Create an input hook for running the Qt6 application event loop. + + Parameters + ---------- + mgr : an InputHookManager + + app : Qt Application, optional. + Running application to use. If not given, we probe Qt for an + existing application object, and create a new one if none is found. + + Returns + ------- + A pair consisting of a Qt Application (either the one given or the + one found or created) and a inputhook. + + Notes + ----- + We use a custom input hook instead of PyQt6's default one, as it + interacts better with the readline packages (issue #481). + + The inputhook function works in tandem with a 'pre_prompt_hook' + which automatically restores the hook as an inputhook in case the + latter has been temporarily disabled after having intercepted a + KeyboardInterrupt. + """ + + if app is None: + app = QtCore.QCoreApplication.instance() + if app is None: + from PyQt6 import QtWidgets + + app = QtWidgets.QApplication([" "]) + + # Re-use previously created inputhook if any + ip = InteractiveShell.instance() + if hasattr(ip, "_inputhook_qt6"): + return app, ip._inputhook_qt6 + + # Otherwise create the inputhook_qt6/preprompthook_qt6 pair of + # hooks (they both share the got_kbdint flag) + + def inputhook_qt6(): + """PyOS_InputHook python hook for Qt6. + + Process pending Qt events and if there's no pending keyboard + input, spend a short slice of time (50ms) running the Qt event + loop. + + As a Python ctypes callback can't raise an exception, we catch + the KeyboardInterrupt and temporarily deactivate the hook, + which will let a *second* CTRL+C be processed normally and go + back to a clean prompt line. + """ + try: + allow_CTRL_C() + app = QtCore.QCoreApplication.instance() + if not app: # shouldn't happen, but safer if it happens anyway... + return 0 + app.processEvents(QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 300) + if not stdin_ready(): + # Generally a program would run QCoreApplication::exec() + # from main() to enter and process the Qt event loop until + # quit() or exit() is called and the program terminates. + # + # For our input hook integration, we need to repeatedly + # enter and process the Qt event loop for only a short + # amount of time (say 50ms) to ensure that Python stays + # responsive to other user inputs. + # + # A naive approach would be to repeatedly call + # QCoreApplication::exec(), using a timer to quit after a + # short amount of time. Unfortunately, QCoreApplication + # emits an aboutToQuit signal before stopping, which has + # the undesirable effect of closing all modal windows. + # + # To work around this problem, we instead create a + # QEventLoop and call QEventLoop::exec(). Other than + # setting some state variables which do not seem to be + # used anywhere, the only thing QCoreApplication adds is + # the aboutToQuit signal which is precisely what we are + # trying to avoid. + timer = QtCore.QTimer() + event_loop = QtCore.QEventLoop() + timer.timeout.connect(event_loop.quit) + while not stdin_ready(): + timer.start(50) + event_loop.exec() + timer.stop() + except KeyboardInterrupt: + global got_kbdint, sigint_timer + + ignore_CTRL_C() + got_kbdint = True + mgr.clear_inputhook() + + # This generates a second SIGINT so the user doesn't have to + # press CTRL+C twice to get a clean prompt. + # + # Since we can't catch the resulting KeyboardInterrupt here + # (because this is a ctypes callback), we use a timer to + # generate the SIGINT after we leave this callback. + # + # Unfortunately this doesn't work on Windows (SIGINT kills + # Python and CTRL_C_EVENT doesn't work). + if os.name == "posix": + pid = os.getpid() + if not sigint_timer: + sigint_timer = threading.Timer(0.01, os.kill, args=[pid, signal.SIGINT]) + sigint_timer.start() + else: + print("\nKeyboardInterrupt - Ctrl-C again for new prompt") + + except: # NO exceptions are allowed to escape from a ctypes callback + ignore_CTRL_C() + from traceback import print_exc + + print_exc() + print("Got exception from inputhook_qt6, unregistering.") + mgr.clear_inputhook() + finally: + allow_CTRL_C() + return 0 + + def preprompthook_qt6(ishell): + """'pre_prompt_hook' used to restore the Qt6 input hook + + (in case the latter was temporarily deactivated after a + CTRL+C) + """ + global got_kbdint, sigint_timer + + if sigint_timer: + sigint_timer.cancel() + sigint_timer = None + + if got_kbdint: + mgr.set_inputhook(inputhook_qt6) + got_kbdint = False + + ip._inputhook_qt6 = inputhook_qt6 + ip.set_hook("pre_prompt_hook", preprompthook_qt6) + + return app, inputhook_qt6 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhooktk.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhooktk.py new file mode 100644 index 0000000..b853c17 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhooktk.py @@ -0,0 +1,25 @@ +# encoding: utf-8 +# Unlike what IPython does, we need to have an explicit inputhook because tkinter handles +# input hook in the C Source code + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +from pydev_ipython.inputhook import stdin_ready + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- + +TCL_DONT_WAIT = 1 << 1 + + +def create_inputhook_tk(app): + def inputhook_tk(): + while app.dooneevent(TCL_DONT_WAIT) == 1: + if stdin_ready(): + break + return 0 + + return inputhook_tk diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookwx.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookwx.py new file mode 100644 index 0000000..455114b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/inputhookwx.py @@ -0,0 +1,173 @@ +# encoding: utf-8 +""" +Enable wxPython to be used interacive by setting PyOS_InputHook. + +Authors: Robin Dunn, Brian Granger, Ondrej Certik +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +import sys +import signal +from _pydev_bundle._pydev_saved_modules import time +from timeit import default_timer as clock +import wx + +from pydev_ipython.inputhook import stdin_ready + + +# ----------------------------------------------------------------------------- +# Code +# ----------------------------------------------------------------------------- + + +def inputhook_wx1(): + """Run the wx event loop by processing pending events only. + + This approach seems to work, but its performance is not great as it + relies on having PyOS_InputHook called regularly. + """ + try: + app = wx.GetApp() # @UndefinedVariable + if app is not None: + assert wx.Thread_IsMain() # @UndefinedVariable + + # Make a temporary event loop and process system events until + # there are no more waiting, then allow idle events (which + # will also deal with pending or posted wx events.) + evtloop = wx.EventLoop() # @UndefinedVariable + ea = wx.EventLoopActivator(evtloop) # @UndefinedVariable + while evtloop.Pending(): + evtloop.Dispatch() + app.ProcessIdle() + del ea + except KeyboardInterrupt: + pass + return 0 + + +class EventLoopTimer(wx.Timer): # @UndefinedVariable + def __init__(self, func): + self.func = func + wx.Timer.__init__(self) # @UndefinedVariable + + def Notify(self): + self.func() + + +class EventLoopRunner(object): + def Run(self, time): + self.evtloop = wx.EventLoop() # @UndefinedVariable + self.timer = EventLoopTimer(self.check_stdin) + self.timer.Start(time) + self.evtloop.Run() + + def check_stdin(self): + if stdin_ready(): + self.timer.Stop() + self.evtloop.Exit() + + +def inputhook_wx2(): + """Run the wx event loop, polling for stdin. + + This version runs the wx eventloop for an undetermined amount of time, + during which it periodically checks to see if anything is ready on + stdin. If anything is ready on stdin, the event loop exits. + + The argument to elr.Run controls how often the event loop looks at stdin. + This determines the responsiveness at the keyboard. A setting of 1000 + enables a user to type at most 1 char per second. I have found that a + setting of 10 gives good keyboard response. We can shorten it further, + but eventually performance would suffer from calling select/kbhit too + often. + """ + try: + app = wx.GetApp() # @UndefinedVariable + if app is not None: + assert wx.Thread_IsMain() # @UndefinedVariable + elr = EventLoopRunner() + # As this time is made shorter, keyboard response improves, but idle + # CPU load goes up. 10 ms seems like a good compromise. + elr.Run(time=10) # CHANGE time here to control polling interval + except KeyboardInterrupt: + pass + return 0 + + +def inputhook_wx3(): + """Run the wx event loop by processing pending events only. + + This is like inputhook_wx1, but it keeps processing pending events + until stdin is ready. After processing all pending events, a call to + time.sleep is inserted. This is needed, otherwise, CPU usage is at 100%. + This sleep time should be tuned though for best performance. + """ + # We need to protect against a user pressing Control-C when IPython is + # idle and this is running. We trap KeyboardInterrupt and pass. + try: + app = wx.GetApp() # @UndefinedVariable + if app is not None: + if hasattr(wx, "IsMainThread"): + assert wx.IsMainThread() # @UndefinedVariable + else: + assert wx.Thread_IsMain() # @UndefinedVariable + + # The import of wx on Linux sets the handler for signal.SIGINT + # to 0. This is a bug in wx or gtk. We fix by just setting it + # back to the Python default. + if not callable(signal.getsignal(signal.SIGINT)): + signal.signal(signal.SIGINT, signal.default_int_handler) + + evtloop = wx.EventLoop() # @UndefinedVariable + ea = wx.EventLoopActivator(evtloop) # @UndefinedVariable + t = clock() + while not stdin_ready(): + while evtloop.Pending(): + t = clock() + evtloop.Dispatch() + app.ProcessIdle() + # We need to sleep at this point to keep the idle CPU load + # low. However, if sleep to long, GUI response is poor. As + # a compromise, we watch how often GUI events are being processed + # and switch between a short and long sleep time. Here are some + # stats useful in helping to tune this. + # time CPU load + # 0.001 13% + # 0.005 3% + # 0.01 1.5% + # 0.05 0.5% + used_time = clock() - t + if used_time > 10.0: + # print 'Sleep for 1 s' # dbg + time.sleep(1.0) + elif used_time > 0.1: + # Few GUI events coming in, so we can sleep longer + # print 'Sleep for 0.05 s' # dbg + time.sleep(0.05) + else: + # Many GUI events coming in, so sleep only very little + time.sleep(0.001) + del ea + except KeyboardInterrupt: + pass + return 0 + + +if sys.platform == "darwin": + # On OSX, evtloop.Pending() always returns True, regardless of there being + # any events pending. As such we can't use implementations 1 or 3 of the + # inputhook as those depend on a pending/dispatch loop. + inputhook_wx = inputhook_wx2 +else: + # This is our default implementation + inputhook_wx = inputhook_wx3 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/matplotlibtools.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/matplotlibtools.py new file mode 100644 index 0000000..ef185b7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/matplotlibtools.py @@ -0,0 +1,154 @@ +import sys +from _pydev_bundle import pydev_log + +backends = { + "tk": "TkAgg", + "gtk": "GTKAgg", + "wx": "WXAgg", + "qt": "QtAgg", # Auto-choose qt4/5 + "qt4": "Qt4Agg", + "qt5": "Qt5Agg", + "qt6": "Qt6Agg", + "osx": "MacOSX", +} + +# We also need a reverse backends2guis mapping that will properly choose which +# GUI support to activate based on the desired matplotlib backend. For the +# most part it's just a reverse of the above dict, but we also need to add a +# few others that map to the same GUI manually: +backend2gui = dict(zip(backends.values(), backends.keys())) +# In the reverse mapping, there are a few extra valid matplotlib backends that +# map to the same GUI support +backend2gui["GTK"] = backend2gui["GTKCairo"] = "gtk" +backend2gui["WX"] = "wx" +backend2gui["CocoaAgg"] = "osx" + + +def do_enable_gui(guiname): + from _pydev_bundle.pydev_versioncheck import versionok_for_gui + + if versionok_for_gui(): + try: + from pydev_ipython.inputhook import enable_gui + + enable_gui(guiname) + except: + sys.stderr.write("Failed to enable GUI event loop integration for '%s'\n" % guiname) + pydev_log.exception() + elif guiname not in ["none", "", None]: + # Only print a warning if the guiname was going to do something + sys.stderr.write("Debug console: Python version does not support GUI event loop integration for '%s'\n" % guiname) + # Return value does not matter, so return back what was sent + return guiname + + +def find_gui_and_backend(): + """Return the gui and mpl backend.""" + matplotlib = sys.modules["matplotlib"] + # WARNING: this assumes matplotlib 1.1 or newer!! + backend = matplotlib.rcParams["backend"] + # In this case, we need to find what the appropriate gui selection call + # should be for IPython, so we can activate inputhook accordingly + gui = backend2gui.get(backend, None) + return gui, backend + + +def is_interactive_backend(backend): + """Check if backend is interactive""" + matplotlib = sys.modules["matplotlib"] + from matplotlib.rcsetup import interactive_bk, non_interactive_bk # @UnresolvedImport + + if backend in interactive_bk: + return True + elif backend in non_interactive_bk: + return False + else: + return matplotlib.is_interactive() + + +def patch_use(enable_gui_function): + """Patch matplotlib function 'use'""" + matplotlib = sys.modules["matplotlib"] + + def patched_use(*args, **kwargs): + matplotlib.real_use(*args, **kwargs) + gui, backend = find_gui_and_backend() + enable_gui_function(gui) + + matplotlib.real_use = matplotlib.use + matplotlib.use = patched_use + + +def patch_is_interactive(): + """Patch matplotlib function 'use'""" + matplotlib = sys.modules["matplotlib"] + + def patched_is_interactive(): + return matplotlib.rcParams["interactive"] + + matplotlib.real_is_interactive = matplotlib.is_interactive + matplotlib.is_interactive = patched_is_interactive + + +def activate_matplotlib(enable_gui_function): + """Set interactive to True for interactive backends. + enable_gui_function - Function which enables gui, should be run in the main thread. + """ + matplotlib = sys.modules["matplotlib"] + gui, backend = find_gui_and_backend() + is_interactive = is_interactive_backend(backend) + if is_interactive: + enable_gui_function(gui) + if not matplotlib.is_interactive(): + sys.stdout.write("Backend %s is interactive backend. Turning interactive mode on.\n" % backend) + matplotlib.interactive(True) + else: + if matplotlib.is_interactive(): + sys.stdout.write("Backend %s is non-interactive backend. Turning interactive mode off.\n" % backend) + matplotlib.interactive(False) + patch_use(enable_gui_function) + patch_is_interactive() + + +def flag_calls(func): + """Wrap a function to detect and flag when it gets called. + + This is a decorator which takes a function and wraps it in a function with + a 'called' attribute. wrapper.called is initialized to False. + + The wrapper.called attribute is set to False right before each call to the + wrapped function, so if the call fails it remains False. After the call + completes, wrapper.called is set to True and the output is returned. + + Testing for truth in wrapper.called allows you to determine if a call to + func() was attempted and succeeded.""" + + # don't wrap twice + if hasattr(func, "called"): + return func + + def wrapper(*args, **kw): + wrapper.called = False + out = func(*args, **kw) + wrapper.called = True + return out + + wrapper.called = False + wrapper.__doc__ = func.__doc__ + return wrapper + + +def activate_pylab(): + pylab = sys.modules["pylab"] + pylab.show._needmain = False + # We need to detect at runtime whether show() is called by the user. + # For this, we wrap it into a decorator which adds a 'called' flag. + pylab.draw_if_interactive = flag_calls(pylab.draw_if_interactive) + + +def activate_pyplot(): + pyplot = sys.modules["matplotlib.pyplot"] + pyplot.show._needmain = False + # We need to detect at runtime whether show() is called by the user. + # For this, we wrap it into a decorator which adds a 'called' flag. + pyplot.draw_if_interactive = flag_calls(pyplot.draw_if_interactive) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt.py new file mode 100644 index 0000000..2b2a467 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt.py @@ -0,0 +1,24 @@ +"""A Qt API selector that can be used to switch between PyQt and PySide. + +This uses the ETS 4.0 selection pattern of: +PySide first, PyQt with API v2. second. + +Do not use this if you need PyQt with the old QString/QVariant API. +""" + +import os + +from pydev_ipython.qt_loaders import load_qt, QT_API_PYSIDE, QT_API_PYSIDE2, QT_API_PYQT, QT_API_PYQT5, QT_API_PYQT6 + +QT_API = os.environ.get("QT_API", None) +if QT_API not in [QT_API_PYSIDE, QT_API_PYSIDE2, QT_API_PYQT, QT_API_PYQT5, QT_API_PYQT6, None]: + raise RuntimeError( + "Invalid Qt API %r, valid values are: %r, %r, %r, %r, %r" + % (QT_API, QT_API_PYSIDE, QT_API_PYSIDE2, QT_API_PYQT, QT_API_PYQT5, QT_API_PYQT6) + ) +if QT_API is None: + api_opts = [QT_API_PYSIDE, QT_API_PYSIDE2, QT_API_PYQT, QT_API_PYQT5, QT_API_PYQT6] +else: + api_opts = [QT_API] + +QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt_for_kernel.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt_for_kernel.py new file mode 100644 index 0000000..efb29bc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt_for_kernel.py @@ -0,0 +1,135 @@ +"""Import Qt in a manner suitable for an IPython kernel. + +This is the import used for the `gui=qt` or `matplotlib=qt` initialization. + +Import Priority: + +if Qt4 has been imported anywhere else: + use that + +if matplotlib has been imported and doesn't support v2 (<= 1.0.1): + use PyQt4 @v1 + +Next, ask ETS' QT_API env variable + +if QT_API not set: + ask matplotlib via rcParams['backend.qt4'] + if it said PyQt: + use PyQt4 @v1 + elif it said PySide: + use PySide + + else: (matplotlib said nothing) + # this is the default path - nobody told us anything + try: + PyQt @v1 + except: + fallback on PySide +else: + use PyQt @v2 or PySide, depending on QT_API + because ETS doesn't work with PyQt @v1. + +""" + +import os +import sys + +from pydev_ipython.version import check_version +from pydev_ipython.qt_loaders import ( + load_qt, + QT_API_PYSIDE, + QT_API_PYSIDE2, + QT_API_PYQT, + QT_API_PYQT_DEFAULT, + loaded_api, + QT_API_PYQT5, + QT_API_PYQT6, +) + + +# Constraints placed on an imported matplotlib +def matplotlib_options(mpl): + if mpl is None: + return + + # #PyDev-779: In pysrc/pydev_ipython/qt_for_kernel.py, matplotlib_options should be replaced with latest from ipython + # (i.e.: properly check backend to decide upon qt4/qt5). + + backend = mpl.rcParams.get("backend", None) + if backend == "Qt4Agg": + mpqt = mpl.rcParams.get("backend.qt4", None) + if mpqt is None: + return None + if mpqt.lower() == "pyside": + return [QT_API_PYSIDE] + elif mpqt.lower() == "pyqt4": + return [QT_API_PYQT_DEFAULT] + elif mpqt.lower() == "pyqt4v2": + return [QT_API_PYQT] + raise ImportError("unhandled value for backend.qt4 from matplotlib: %r" % mpqt) + + elif backend == "Qt5Agg": + mpqt = mpl.rcParams.get("backend.qt5", None) + if mpqt is None: + return None + if mpqt.lower() == "pyqt5": + return [QT_API_PYQT5] + raise ImportError("unhandled value for backend.qt5 from matplotlib: %r" % mpqt) + + elif backend == "Qt6Agg": + mpqt = mpl.rcParams.get("backend.qt6", None) + if mpqt is None: + return None + if mpqt.lower() == "pyqt6": + return [QT_API_PYQT6] + raise ImportError("unhandled value for backend.qt6 from matplotlib: %r" % mpqt) + + # Fallback without checking backend (previous code) + mpqt = mpl.rcParams.get("backend.qt4", None) + if mpqt is None: + mpqt = mpl.rcParams.get("backend.qt5", None) + if mpqt is None: + mpqt = mpl.rcParams.get("backend.qt6", None) + + if mpqt is None: + return None + if mpqt.lower() == "pyside": + return [QT_API_PYSIDE] + elif mpqt.lower() == "pyqt4": + return [QT_API_PYQT_DEFAULT] + elif mpqt.lower() == "pyqt5": + return [QT_API_PYQT5] + elif mpqt.lower() == "pyqt6": + return [QT_API_PYQT6] + raise ImportError("unhandled value for qt backend from matplotlib: %r" % mpqt) + + +def get_options(): + """Return a list of acceptable QT APIs, in decreasing order of + preference + """ + # already imported Qt somewhere. Use that + loaded = loaded_api() + if loaded is not None: + return [loaded] + + mpl = sys.modules.get("matplotlib", None) + + if mpl is not None and not check_version(mpl.__version__, "1.0.2"): + # 1.0.1 only supports PyQt4 v1 + return [QT_API_PYQT_DEFAULT] + + if os.environ.get("QT_API", None) is None: + # no ETS variable. Ask mpl, then use either + return matplotlib_options(mpl) or [QT_API_PYQT_DEFAULT, QT_API_PYSIDE, QT_API_PYSIDE2, QT_API_PYQT5, QT_API_PYQT6] + + # ETS variable present. Will fallback to external.qt + return None + + +api_opts = get_options() +if api_opts is not None: + QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) + +else: # use ETS variable + from pydev_ipython.qt import QtCore, QtGui, QtSvg, QT_API diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt_loaders.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt_loaders.py new file mode 100644 index 0000000..d53c5f1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/qt_loaders.py @@ -0,0 +1,378 @@ +""" +This module contains factory functions that attempt +to return Qt submodules from the various python Qt bindings. + +It also protects against double-importing Qt with different +bindings, which is unstable and likely to crash + +This is used primarily by qt and qt_for_kernel, and shouldn't +be accessed directly from the outside +""" + +import sys +from functools import partial + +from pydev_ipython.version import check_version + +# Available APIs. +QT_API_PYQT = "pyqt" +QT_API_PYQTv1 = "pyqtv1" +QT_API_PYQT_DEFAULT = "pyqtdefault" # don't set SIP explicitly +QT_API_PYSIDE = "pyside" +QT_API_PYSIDE2 = "pyside2" +QT_API_PYSIDE6 = "pyside6" +QT_API_PYQT5 = "pyqt5" +QT_API_PYQT6 = "pyqt6" + + +class ImportDenier(object): + """Import Hook that will guard against bad Qt imports + once IPython commits to a specific binding + """ + + def __init__(self): + self.__forbidden = set() + + def forbid(self, module_name): + sys.modules.pop(module_name, None) + self.__forbidden.add(module_name) + + def find_module(self, fullname, path=None): + if path: + return + if fullname in self.__forbidden: + return self + + def load_module(self, fullname): + raise ImportError( + """ + Importing %s disabled by IPython, which has + already imported an Incompatible QT Binding: %s + """ + % (fullname, loaded_api()) + ) + + +ID = ImportDenier() +sys.meta_path.append(ID) + + +def commit_api(api): + """Commit to a particular API, and trigger ImportErrors on subsequent + dangerous imports""" + + if api == QT_API_PYSIDE: + ID.forbid("PyQt4") + ID.forbid("PyQt5") + ID.forbid("PyQt6") + else: + ID.forbid("PySide") + ID.forbid("PySide2") + ID.forbid("PySide6") + + +def loaded_api(): + """Return which API is loaded, if any + + If this returns anything besides None, + importing any other Qt binding is unsafe. + + Returns + ------- + None, 'pyside', 'pyside2', 'pyside6', 'pyqt5', 'pyqt6', or 'pyqtv1' + """ + if "PyQt4.QtCore" in sys.modules: + if qtapi_version() == 2: + return QT_API_PYQT + else: + return QT_API_PYQTv1 + elif "PySide.QtCore" in sys.modules: + return QT_API_PYSIDE + elif "PySide2.QtCore" in sys.modules: + return QT_API_PYSIDE2 + elif "PySide6.QtCore" in sys.modules: + return QT_API_PYSIDE6 + elif "PyQt5.QtCore" in sys.modules: + return QT_API_PYQT5 + elif "PyQt6.QtCore" in sys.modules: + return QT_API_PYQT6 + return None + + +def has_binding(api): + """Safely check for PyQt or PySide, without importing + submodules + + Parameters + ---------- + api : str [ 'pyqtv1' | 'pyqt' | 'pyside' | 'pyqtdefault'] + Which module to check for + + Returns + ------- + True if the relevant module appears to be importable + """ + # we can't import an incomplete pyside and pyqt4 + # this will cause a crash in sip (#1431) + # check for complete presence before importing + module_name = { + QT_API_PYSIDE: "PySide", + QT_API_PYSIDE2: "PySide2", + QT_API_PYSIDE6: "PySide6", + QT_API_PYQT: "PyQt4", + QT_API_PYQTv1: "PyQt4", + QT_API_PYQT_DEFAULT: "PyQt4", + QT_API_PYQT5: "PyQt5", + QT_API_PYQT6: "PyQt6", + } + module_name = module_name[api] + + import importlib + + try: + # importing top level PyQt4/PySide module is ok... + mod = __import__(module_name) + # ...importing submodules is not + + for check in ("QtCore", "QtGui", "QtSvg"): + if importlib.util.find_spec("%s.%s" % (module_name, check)) is None: + return False + + # we can also safely check PySide version + if api == QT_API_PYSIDE: + return check_version(mod.__version__, "1.0.3") + else: + return True + + except ModuleNotFoundError: + from importlib import machinery + + # importing top level PyQt4/PySide module is ok... + mod = __import__(module_name) + + # ...importing submodules is not + loader_details = (machinery.ExtensionFileLoader, machinery.EXTENSION_SUFFIXES) + submod_finder = machinery.FileFinder(mod.__path__[0], loader_details) + submod_check = ( + submod_finder.find_spec("QtCore") is not None + and submod_finder.find_spec("QtGui") is not None + and submod_finder.find_spec("QtSvg") is not None + ) + + # we can also safely check PySide version + if api == QT_API_PYSIDE: + return check_version(mod.__version__, '1.0.3') and submod_check + else: + return submod_check + + except ImportError: + return False + + +def qtapi_version(): + """Return which QString API has been set, if any + + Returns + ------- + The QString API version (1 or 2), or None if not set + """ + try: + import sip + except ImportError: + return + try: + return sip.getapi("QString") + except ValueError: + return + + +def can_import(api): + """Safely query whether an API is importable, without importing it""" + if not has_binding(api): + return False + + current = loaded_api() + if api == QT_API_PYQT_DEFAULT: + return current in [QT_API_PYQT, QT_API_PYQTv1, QT_API_PYQT5, QT_API_PYQT6, None] + else: + return current in [api, None] + + +def import_pyqt4(version=2): + """ + Import PyQt4 + + Parameters + ---------- + version : 1, 2, or None + Which QString/QVariant API to use. Set to None to use the system + default + + ImportErrors raised within this function are non-recoverable + """ + # The new-style string API (version=2) automatically + # converts QStrings to Unicode Python strings. Also, automatically unpacks + # QVariants to their underlying objects. + import sip + + if version is not None: + sip.setapi("QString", version) + sip.setapi("QVariant", version) + + from PyQt4 import QtGui, QtCore, QtSvg + + if not check_version(QtCore.PYQT_VERSION_STR, "4.7"): + raise ImportError("IPython requires PyQt4 >= 4.7, found %s" % QtCore.PYQT_VERSION_STR) + + # Alias PyQt-specific functions for PySide compatibility. + QtCore.Signal = QtCore.pyqtSignal + QtCore.Slot = QtCore.pyqtSlot + + # query for the API version (in case version == None) + version = sip.getapi("QString") + api = QT_API_PYQTv1 if version == 1 else QT_API_PYQT + return QtCore, QtGui, QtSvg, api + + +def import_pyqt5(): + """ + Import PyQt5 + + ImportErrors raised within this function are non-recoverable + """ + from PyQt5 import QtGui, QtCore, QtSvg + + # Alias PyQt-specific functions for PySide compatibility. + QtCore.Signal = QtCore.pyqtSignal + QtCore.Slot = QtCore.pyqtSlot + + return QtCore, QtGui, QtSvg, QT_API_PYQT5 + + +def import_pyqt6(): + """ + Import PyQt6 + + ImportErrors raised within this function are non-recoverable + """ + from PyQt6 import QtGui, QtCore, QtSvg + + # Alias PyQt-specific functions for PySide compatibility. + QtCore.Signal = QtCore.pyqtSignal + QtCore.Slot = QtCore.pyqtSlot + + return QtCore, QtGui, QtSvg, QT_API_PYQT6 + + +def import_pyside(): + """ + Import PySide + + ImportErrors raised within this function are non-recoverable + """ + from PySide import QtGui, QtCore, QtSvg # @UnresolvedImport + + return QtCore, QtGui, QtSvg, QT_API_PYSIDE + + +def import_pyside2(): + """ + Import PySide2 + + ImportErrors raised within this function are non-recoverable + """ + from PySide2 import QtGui, QtCore, QtSvg # @UnresolvedImport + + return QtCore, QtGui, QtSvg, QT_API_PYSIDE2 + + +def import_pyside6(): + """ + Import PySide6 + + ImportErrors raised within this function are non-recoverable + """ + from PySide6 import QtGui, QtCore, QtSvg # @UnresolvedImport + + return QtCore, QtGui, QtSvg, QT_API_PYSIDE6 + + +def load_qt(api_options): + """ + Attempt to import Qt, given a preference list + of permissible bindings + + It is safe to call this function multiple times. + + Parameters + ---------- + api_options: List of strings + The order of APIs to try. Valid items are 'pyside', + 'pyqt', and 'pyqtv1' + + Returns + ------- + + A tuple of QtCore, QtGui, QtSvg, QT_API + The first three are the Qt modules. The last is the + string indicating which module was loaded. + + Raises + ------ + ImportError, if it isn't possible to import any requested + bindings (either becaues they aren't installed, or because + an incompatible library has already been installed) + """ + loaders = { + QT_API_PYSIDE: import_pyside, + QT_API_PYSIDE2: import_pyside2, + QT_API_PYSIDE6: import_pyside6, + QT_API_PYQT: import_pyqt4, + QT_API_PYQTv1: partial(import_pyqt4, version=1), + QT_API_PYQT_DEFAULT: partial(import_pyqt4, version=None), + QT_API_PYQT5: import_pyqt5, + QT_API_PYQT6: import_pyqt6, + } + + for api in api_options: + if api not in loaders: + raise RuntimeError( + "Invalid Qt API %r, valid values are: %r, %r, %r, %r, %r, %r, %r" + % (api, QT_API_PYSIDE, QT_API_PYSIDE2, QT_API_PYQT, QT_API_PYQTv1, QT_API_PYQT_DEFAULT, QT_API_PYQT5, QT_API_PYQT6) + ) + + if not can_import(api): + continue + + # cannot safely recover from an ImportError during this + result = loaders[api]() + api = result[-1] # changed if api = QT_API_PYQT_DEFAULT + commit_api(api) + return result + else: + raise ImportError( + """ + Could not load requested Qt binding. Please ensure that + PyQt4 >= 4.7 or PySide >= 1.0.3 is available, + and only one is imported per session. + + Currently-imported Qt library: %r + PyQt4 installed: %s + PyQt5 installed: %s + PyQt6 installed: %s + PySide >= 1.0.3 installed: %s + PySide2 installed: %s + PySide6 installed: %s + Tried to load: %r + """ + % ( + loaded_api(), + has_binding(QT_API_PYQT), + has_binding(QT_API_PYQT5), + has_binding(QT_API_PYQT6), + has_binding(QT_API_PYSIDE), + has_binding(QT_API_PYSIDE2), + has_binding(QT_API_PYSIDE6), + api_options, + ) + ) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/version.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/version.py new file mode 100644 index 0000000..e474636 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_ipython/version.py @@ -0,0 +1,50 @@ +""" +Utility for version comparison +""" + + +class _Version: + def __init__(self, s): + parts = s.split(".") + version_parts = [] + for p in parts: + try: + version_parts.append(int(p)) + except ValueError: + version_parts.append(p) + + self._version_parts = tuple(version_parts) + + def __ge__(self, v): + this_parts = self._version_parts + other_parts = v._version_parts + + while len(this_parts) < len(other_parts): + this_parts = this_parts + (0,) + + return this_parts >= other_parts + + +def check_version(found_version, expected_min_or_eq_to_version): + """check version string found_version >= expected_min_or_eq_to_version + + If dev/prerelease tags result in TypeError for string-number comparison, + it is assumed that the dependency is satisfied. + Users on dev branches are responsible for keeping their own packages up to date. + """ + try: + return _Version(found_version) >= _Version(expected_min_or_eq_to_version) + except TypeError: + return True + + +if __name__ == "__main__": + assert check_version("1.2.3", "1.2.3") + assert check_version("1.2.4", "1.2.3") + assert check_version("1.2", "1.2.bar") + assert check_version("1.3", "1.2.bar") + assert check_version("1.3", "1.2b") + assert not check_version("1.2", "1.3") + assert not check_version("1.2.0", "1.2.1") + assert not check_version("1.2", "1.2.1") + print("Ok, checks passed") diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_pysrc.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_pysrc.py new file mode 100644 index 0000000..f02d9fd --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_pysrc.py @@ -0,0 +1 @@ +"""An empty file in pysrc that can be imported (from sitecustomize) to find the location of pysrc""" diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_run_in_console.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_run_in_console.py new file mode 100644 index 0000000..bffc88c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_run_in_console.py @@ -0,0 +1,152 @@ +""" +Entry point module to run a file in the interactive console. +""" +import os +import sys +import traceback +from pydevconsole import InterpreterInterface, process_exec_queue, start_console_server, init_mpl_in_console +from _pydev_bundle._pydev_saved_modules import threading, _queue + +from _pydev_bundle import pydev_imports +from _pydevd_bundle.pydevd_utils import save_main_module +from _pydev_bundle.pydev_console_utils import StdIn +from pydevd_file_utils import get_fullname + + +def run_file(file, globals=None, locals=None, is_module=False): + module_name = None + entry_point_fn = None + if is_module: + file, _, entry_point_fn = file.partition(":") + module_name = file + filename = get_fullname(file) + if filename is None: + sys.stderr.write("No module named %s\n" % file) + return + else: + file = filename + + if os.path.isdir(file): + new_target = os.path.join(file, "__main__.py") + if os.path.isfile(new_target): + file = new_target + + if globals is None: + m = save_main_module(file, "pydev_run_in_console") + + globals = m.__dict__ + try: + globals["__builtins__"] = __builtins__ + except NameError: + pass # Not there on Jython... + + if locals is None: + locals = globals + + if not is_module: + sys.path.insert(0, os.path.split(file)[0]) + + print("Running %s" % file) + try: + if not is_module: + pydev_imports.execfile(file, globals, locals) # execute the script + else: + # treat ':' as a seperator between module and entry point function + # if there is no entry point we run we same as with -m switch. Otherwise we perform + # an import and execute the entry point + if entry_point_fn: + mod = __import__(module_name, level=0, fromlist=[entry_point_fn], globals=globals, locals=locals) + func = getattr(mod, entry_point_fn) + func() + else: + # Run with the -m switch + from _pydevd_bundle import pydevd_runpy + + pydevd_runpy._run_module_as_main(module_name) + except: + traceback.print_exc() + + return globals + + +def skip_successful_exit(*args): + """System exit in file shouldn't kill interpreter (i.e. in `timeit`)""" + if len(args) == 1 and args[0] in (0, None): + pass + else: + raise SystemExit(*args) + + +def process_args(argv): + setup_args = {"file": "", "module": False} + + setup_args["port"] = argv[1] + del argv[1] + setup_args["client_port"] = argv[1] + del argv[1] + + module_flag = "--module" + if module_flag in argv: + i = argv.index(module_flag) + if i != -1: + setup_args["module"] = True + setup_args["file"] = argv[i + 1] + del sys.argv[i] + else: + setup_args["file"] = argv[1] + + del argv[0] + + return setup_args + + +# ======================================================================================================================= +# main +# ======================================================================================================================= +if __name__ == "__main__": + setup = process_args(sys.argv) + + port = setup["port"] + client_port = setup["client_port"] + file = setup["file"] + is_module = setup["module"] + + from _pydev_bundle import pydev_localhost + + if int(port) == 0 and int(client_port) == 0: + (h, p) = pydev_localhost.get_socket_name() + client_port = p + + host = pydev_localhost.get_localhost() + + # replace exit (see comments on method) + # note that this does not work in jython!!! (sys method can't be replaced). + sys.exit = skip_successful_exit + + connect_status_queue = _queue.Queue() + interpreter = InterpreterInterface(host, int(client_port), threading.current_thread(), connect_status_queue=connect_status_queue) + + server_thread = threading.Thread(target=start_console_server, name="ServerThread", args=(host, int(port), interpreter)) + server_thread.daemon = True + server_thread.start() + + sys.stdin = StdIn(interpreter, host, client_port, sys.stdin) + + init_mpl_in_console(interpreter) + + try: + success = connect_status_queue.get(True, 60) + if not success: + raise ValueError() + except: + sys.stderr.write("Console server didn't start\n") + sys.stderr.flush() + sys.exit(1) + + globals = run_file(file, None, None, is_module) + + interpreter.get_namespace().update(globals) + + interpreter.ShowConsole() + + process_exec_queue(interpreter) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/__not_in_default_pythonpath.txt b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/__not_in_default_pythonpath.txt new file mode 100644 index 0000000..29cdc5b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/__not_in_default_pythonpath.txt @@ -0,0 +1 @@ +(no __init__.py file) \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/__pycache__/sitecustomize.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/__pycache__/sitecustomize.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fce4458e70a2c8fe47e723adb91032a3d3d1c23f GIT binary patch literal 6870 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/sitecustomize.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/sitecustomize.py new file mode 100644 index 0000000..f683ae5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydev_sitecustomize/sitecustomize.py @@ -0,0 +1,267 @@ +""" + This module will: + - change the input() and raw_input() commands to change \r\n or \r into \n + - execute the user site customize -- if available + - change raw_input() and input() to also remove any trailing \r + + Up to PyDev 3.4 it also was setting the default encoding, but it was removed because of differences when + running from a shell (i.e.: now we just set the PYTHONIOENCODING related to that -- which is properly + treated on Py 2.7 onwards). +""" +DEBUG = 0 # 0 or 1 because of jython + +import sys + +encoding = None + +IS_PYTHON_3_ONWARDS = 0 + +try: + IS_PYTHON_3_ONWARDS = sys.version_info[0] >= 3 +except: + # That's OK, not all versions of python have sys.version_info + if DEBUG: + import traceback + + traceback.print_exc() # @Reimport + +# ----------------------------------------------------------------------------------------------------------------------- +# Line buffering +if IS_PYTHON_3_ONWARDS: + # Python 3 has a bug (http://bugs.python.org/issue4705) in which -u doesn't properly make output/input unbuffered + # so, we need to enable that ourselves here. + try: + sys.stdout._line_buffering = True + except: + pass + try: + sys.stderr._line_buffering = True + except: + pass + try: + sys.stdin._line_buffering = True + except: + pass + + +try: + import org.python.core.PyDictionary # @UnresolvedImport @UnusedImport -- just to check if it could be valid + + def dict_contains(d, key): + return d.has_key(key) +except: + try: + # Py3k does not have has_key anymore, and older versions don't have __contains__ + dict_contains = dict.__contains__ + except: + try: + dict_contains = dict.has_key + except NameError: + + def dict_contains(d, key): + return d.has_key(key) + + +def install_breakpointhook(): + def custom_sitecustomize_breakpointhook(*args, **kwargs): + import os + + hookname = os.getenv("PYTHONBREAKPOINT") + if ( + hookname is not None + and len(hookname) > 0 + and hasattr(sys, "__breakpointhook__") + and sys.__breakpointhook__ != custom_sitecustomize_breakpointhook + ): + sys.__breakpointhook__(*args, **kwargs) + else: + sys.path.append(os.path.dirname(os.path.dirname(__file__))) + import pydevd + + kwargs.setdefault("stop_at_frame", sys._getframe().f_back) + pydevd.settrace(*args, **kwargs) + + if sys.version_info[0:2] >= (3, 7): + # There are some choices on how to provide the breakpoint hook. Namely, we can provide a + # PYTHONBREAKPOINT which provides the import path for a method to be executed or we + # can override sys.breakpointhook. + # pydevd overrides sys.breakpointhook instead of providing an environment variable because + # it's possible that the debugger starts the user program but is not available in the + # PYTHONPATH (and would thus fail to be imported if PYTHONBREAKPOINT was set to pydevd.settrace). + # Note that the implementation still takes PYTHONBREAKPOINT in account (so, if it was provided + # by someone else, it'd still work). + sys.breakpointhook = custom_sitecustomize_breakpointhook + else: + if sys.version_info[0] >= 3: + import builtins as __builtin__ # Py3 + else: + import __builtin__ + + # In older versions, breakpoint() isn't really available, so, install the hook directly + # in the builtins. + __builtin__.breakpoint = custom_sitecustomize_breakpointhook + sys.__breakpointhook__ = custom_sitecustomize_breakpointhook + + +# Install the breakpoint hook at import time. +install_breakpointhook() + +# ----------------------------------------------------------------------------------------------------------------------- +# now that we've finished the needed pydev sitecustomize, let's run the default one (if available) + +# Ok, some weirdness going on in Python 3k: when removing this module from the sys.module to import the 'real' +# sitecustomize, all the variables in this scope become None (as if it was garbage-collected), so, the the reference +# below is now being kept to create a cyclic reference so that it neven dies) +__pydev_sitecustomize_module__ = sys.modules.get("sitecustomize") # A ref to this module + + +# remove the pydev site customize (and the pythonpath for it) +paths_removed = [] +try: + for c in sys.path[:]: + # Pydev controls the whole classpath in Jython already, so, we don't want a a duplicate for + # what we've already added there (this is needed to support Jython 2.5b1 onwards -- otherwise, as + # we added the sitecustomize to the pythonpath and to the classpath, we'd have to remove it from the + # classpath too -- and I don't think there's a way to do that... or not?) + if ( + c.find("pydev_sitecustomize") != -1 + or c == "__classpath__" + or c == "__pyclasspath__" + or c == "__classpath__/" + or c == "__pyclasspath__/" + or c == "__classpath__\\" + or c == "__pyclasspath__\\" + ): + sys.path.remove(c) + if c.find("pydev_sitecustomize") == -1: + # We'll re-add any paths removed but the pydev_sitecustomize we added from pydev. + paths_removed.append(c) + + if dict_contains(sys.modules, "sitecustomize"): + del sys.modules["sitecustomize"] # this module +except: + # print the error... should never happen (so, always show, and not only on debug)! + import traceback + + traceback.print_exc() # @Reimport +else: + # Now, execute the default sitecustomize + try: + import sitecustomize # @UnusedImport + + sitecustomize.__pydev_sitecustomize_module__ = __pydev_sitecustomize_module__ + except: + pass + + if not dict_contains(sys.modules, "sitecustomize"): + # If there was no sitecustomize, re-add the pydev sitecustomize (pypy gives a KeyError if it's not there) + sys.modules["sitecustomize"] = __pydev_sitecustomize_module__ + + try: + if paths_removed: + if sys is None: + import sys + if sys is not None: + # And after executing the default sitecustomize, restore the paths (if we didn't remove it before, + # the import sitecustomize would recurse). + sys.path.extend(paths_removed) + except: + # print the error... should never happen (so, always show, and not only on debug)! + import traceback + + traceback.print_exc() # @Reimport + + +if sys.version_info[0] < 3: + try: + # Redefine input and raw_input only after the original sitecustomize was executed + # (because otherwise, the original raw_input and input would still not be defined) + import __builtin__ + + original_raw_input = __builtin__.raw_input + original_input = __builtin__.input + + def raw_input(prompt=""): + # the original raw_input would only remove a trailing \n, so, at + # this point if we had a \r\n the \r would remain (which is valid for eclipse) + # so, let's remove the remaining \r which python didn't expect. + ret = original_raw_input(prompt) + + if ret.endswith("\r"): + return ret[:-1] + + return ret + + raw_input.__doc__ = original_raw_input.__doc__ + + def input(prompt=""): + # input must also be rebinded for using the new raw_input defined + return eval(raw_input(prompt)) + + input.__doc__ = original_input.__doc__ + + __builtin__.raw_input = raw_input + __builtin__.input = input + + except: + # Don't report errors at this stage + if DEBUG: + import traceback + + traceback.print_exc() # @Reimport + +else: + try: + import builtins # Python 3.0 does not have the __builtin__ module @UnresolvedImport + + original_input = builtins.input + + def input(prompt=""): + # the original input would only remove a trailing \n, so, at + # this point if we had a \r\n the \r would remain (which is valid for eclipse) + # so, let's remove the remaining \r which python didn't expect. + ret = original_input(prompt) + + if ret.endswith("\r"): + return ret[:-1] + + return ret + + input.__doc__ = original_input.__doc__ + builtins.input = input + except: + # Don't report errors at this stage + if DEBUG: + import traceback + + traceback.print_exc() # @Reimport + + +try: + # The original getpass doesn't work from the eclipse console, so, let's put a replacement + # here (note that it'll not go into echo mode in the console, so, what' the user writes + # will actually be seen) + # Note: same thing from the fix_getpass module -- but we don't want to import it in this + # custom sitecustomize. + def fix_get_pass(): + try: + import getpass + except ImportError: + return # If we can't import it, we can't fix it + import warnings + + fallback = getattr(getpass, "fallback_getpass", None) # >= 2.6 + if not fallback: + fallback = getpass.default_getpass # <= 2.5 + getpass.getpass = fallback + if hasattr(getpass, "GetPassWarning"): + warnings.simplefilter("ignore", category=getpass.GetPassWarning) + + fix_get_pass() + +except: + # Don't report errors at this stage + if DEBUG: + import traceback + + traceback.print_exc() # @Reimport diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevconsole.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevconsole.py new file mode 100644 index 0000000..342ca15 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevconsole.py @@ -0,0 +1,611 @@ +""" +Entry point module to start the interactive console. +""" +from _pydev_bundle._pydev_saved_modules import thread, _code +from _pydevd_bundle.pydevd_constants import IS_JYTHON + +start_new_thread = thread.start_new_thread + +from _pydevd_bundle.pydevconsole_code import InteractiveConsole + +compile_command = _code.compile_command +InteractiveInterpreter = _code.InteractiveInterpreter + +import os +import sys + +from _pydev_bundle._pydev_saved_modules import threading +from _pydevd_bundle.pydevd_constants import INTERACTIVE_MODE_AVAILABLE + +import traceback +from _pydev_bundle import pydev_log + +from _pydevd_bundle import pydevd_save_locals + +from _pydev_bundle.pydev_imports import Exec, _queue + +import builtins as __builtin__ + +from _pydev_bundle.pydev_console_utils import BaseInterpreterInterface, BaseStdIn # @UnusedImport +from _pydev_bundle.pydev_console_utils import CodeFragment + + +class Command: + def __init__(self, interpreter, code_fragment): + """ + :type code_fragment: CodeFragment + :type interpreter: InteractiveConsole + """ + self.interpreter = interpreter + self.code_fragment = code_fragment + self.more = None + + def symbol_for_fragment(code_fragment): + if code_fragment.is_single_line: + symbol = "single" + else: + if IS_JYTHON: + symbol = "single" # Jython doesn't support exec + else: + symbol = "exec" + return symbol + + symbol_for_fragment = staticmethod(symbol_for_fragment) + + def run(self): + text = self.code_fragment.text + symbol = self.symbol_for_fragment(self.code_fragment) + + self.more = self.interpreter.runsource(text, "", symbol) + + +try: + from _pydev_bundle.pydev_imports import execfile + + __builtin__.execfile = execfile +except: + pass + +# Pull in runfile, the interface to UMD that wraps execfile +from _pydev_bundle.pydev_umd import runfile, _set_globals_function + +if sys.version_info[0] >= 3: + __builtin__.runfile = runfile +else: + __builtin__.runfile = runfile + + +# ======================================================================================================================= +# InterpreterInterface +# ======================================================================================================================= +class InterpreterInterface(BaseInterpreterInterface): + """ + The methods in this class should be registered in the xml-rpc server. + """ + + def __init__(self, host, client_port, mainThread, connect_status_queue=None): + BaseInterpreterInterface.__init__(self, mainThread, connect_status_queue) + self.client_port = client_port + self.host = host + self.namespace = {} + self.interpreter = InteractiveConsole(self.namespace) + self._input_error_printed = False + + def do_add_exec(self, codeFragment): + command = Command(self.interpreter, codeFragment) + command.run() + return command.more + + def get_namespace(self): + return self.namespace + + def getCompletions(self, text, act_tok): + try: + from _pydev_bundle._pydev_completer import Completer + + completer = Completer(self.namespace, None) + return completer.complete(act_tok) + except: + pydev_log.exception() + return [] + + def close(self): + sys.exit(0) + + def get_greeting_msg(self): + return "PyDev console: starting.\n" + + +class _ProcessExecQueueHelper: + _debug_hook = None + _return_control_osc = False + + +def set_debug_hook(debug_hook): + _ProcessExecQueueHelper._debug_hook = debug_hook + + +def activate_mpl_if_already_imported(interpreter): + if interpreter.mpl_modules_for_patching: + for module in list(interpreter.mpl_modules_for_patching): + if module in sys.modules: + activate_function = interpreter.mpl_modules_for_patching.pop(module) + activate_function() + + +def init_set_return_control_back(interpreter): + from pydev_ipython.inputhook import set_return_control_callback + + def return_control(): + """A function that the inputhooks can call (via inputhook.stdin_ready()) to find + out if they should cede control and return""" + if _ProcessExecQueueHelper._debug_hook: + # Some of the input hooks check return control without doing + # a single operation, so we don't return True on every + # call when the debug hook is in place to allow the GUI to run + # XXX: Eventually the inputhook code will have diverged enough + # from the IPython source that it will be worthwhile rewriting + # it rather than pretending to maintain the old API + _ProcessExecQueueHelper._return_control_osc = not _ProcessExecQueueHelper._return_control_osc + if _ProcessExecQueueHelper._return_control_osc: + return True + + if not interpreter.exec_queue.empty(): + return True + return False + + set_return_control_callback(return_control) + + +def init_mpl_in_console(interpreter): + init_set_return_control_back(interpreter) + + if not INTERACTIVE_MODE_AVAILABLE: + return + + activate_mpl_if_already_imported(interpreter) + from _pydev_bundle.pydev_import_hook import import_hook_manager + + for mod in list(interpreter.mpl_modules_for_patching): + import_hook_manager.add_module_name(mod, interpreter.mpl_modules_for_patching.pop(mod)) + + +if sys.platform != "win32": + if not hasattr(os, "kill"): # Jython may not have it. + + def pid_exists(pid): + return True + + else: + + def pid_exists(pid): + # Note that this function in the face of errors will conservatively consider that + # the pid is still running (because we'll exit the current process when it's + # no longer running, so, we need to be 100% sure it actually exited). + + import errno + + if pid == 0: + # According to "man 2 kill" PID 0 has a special meaning: + # it refers to <> so we don't want to go any further. + # If we get here it means this UNIX platform *does* have + # a process with id 0. + return True + try: + os.kill(pid, 0) + except OSError as err: + if err.errno == errno.ESRCH: + # ESRCH == No such process + return False + elif err.errno == errno.EPERM: + # EPERM clearly means there's a process to deny access to + return True + else: + # According to "man 2 kill" possible error values are + # (EINVAL, EPERM, ESRCH) therefore we should never get + # here. If we do, although it's an error, consider it + # exists (see first comment in this function). + return True + else: + return True + +else: + + def pid_exists(pid): + # Note that this function in the face of errors will conservatively consider that + # the pid is still running (because we'll exit the current process when it's + # no longer running, so, we need to be 100% sure it actually exited). + import ctypes + + kernel32 = ctypes.windll.kernel32 + + PROCESS_QUERY_INFORMATION = 0x0400 + PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 + ERROR_INVALID_PARAMETER = 0x57 + STILL_ACTIVE = 259 + + process = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_QUERY_LIMITED_INFORMATION, 0, pid) + if not process: + err = kernel32.GetLastError() + if err == ERROR_INVALID_PARAMETER: + # Means it doesn't exist (pid parameter is wrong). + return False + + # There was some unexpected error (such as access denied), so + # consider it exists (although it could be something else, but we don't want + # to raise any errors -- so, just consider it exists). + return True + + try: + zero = ctypes.c_int(0) + exit_code = ctypes.pointer(zero) + + exit_code_suceeded = kernel32.GetExitCodeProcess(process, exit_code) + if not exit_code_suceeded: + # There was some unexpected error (such as access denied), so + # consider it exists (although it could be something else, but we don't want + # to raise any errors -- so, just consider it exists). + return True + + elif bool(exit_code.contents.value) and int(exit_code.contents.value) != STILL_ACTIVE: + return False + finally: + kernel32.CloseHandle(process) + + return True + + +def process_exec_queue(interpreter): + init_mpl_in_console(interpreter) + from pydev_ipython.inputhook import get_inputhook + + try: + kill_if_pid_not_alive = int(os.environ.get("PYDEV_ECLIPSE_PID", "-1")) + except: + kill_if_pid_not_alive = -1 + + while 1: + if kill_if_pid_not_alive != -1: + if not pid_exists(kill_if_pid_not_alive): + exit() + + # Running the request may have changed the inputhook in use + inputhook = get_inputhook() + + if _ProcessExecQueueHelper._debug_hook: + _ProcessExecQueueHelper._debug_hook() + + if inputhook: + try: + # Note: it'll block here until return_control returns True. + inputhook() + except: + pydev_log.exception() + try: + try: + code_fragment = interpreter.exec_queue.get(block=True, timeout=1 / 20.0) # 20 calls/second + except _queue.Empty: + continue + + if callable(code_fragment): + # It can be a callable (i.e.: something that must run in the main + # thread can be put in the queue for later execution). + code_fragment() + else: + more = interpreter.add_exec(code_fragment) + except KeyboardInterrupt: + interpreter.buffer = None + continue + except SystemExit: + raise + except: + pydev_log.exception("Error processing queue on pydevconsole.") + exit() + + +if "IPYTHONENABLE" in os.environ: + IPYTHON = os.environ["IPYTHONENABLE"] == "True" +else: + # By default, don't use IPython because occasionally changes + # in IPython break pydevd. + IPYTHON = False + +try: + try: + exitfunc = sys.exitfunc + except AttributeError: + exitfunc = None + + if IPYTHON: + from _pydev_bundle.pydev_ipython_console import InterpreterInterface + + if exitfunc is not None: + sys.exitfunc = exitfunc + else: + try: + delattr(sys, "exitfunc") + except: + pass +except: + IPYTHON = False + pass + + +# ======================================================================================================================= +# _DoExit +# ======================================================================================================================= +def do_exit(*args): + """ + We have to override the exit because calling sys.exit will only actually exit the main thread, + and as we're in a Xml-rpc server, that won't work. + """ + + try: + import java.lang.System + + java.lang.System.exit(1) + except ImportError: + if len(args) == 1: + os._exit(args[0]) + else: + os._exit(0) + + +# ======================================================================================================================= +# start_console_server +# ======================================================================================================================= +def start_console_server(host, port, interpreter): + try: + if port == 0: + host = "" + + # I.e.: supporting the internal Jython version in PyDev to create a Jython interactive console inside Eclipse. + from _pydev_bundle.pydev_imports import SimpleXMLRPCServer as XMLRPCServer # @Reimport + + try: + server = XMLRPCServer((host, port), logRequests=False, allow_none=True) + + except: + sys.stderr.write( + 'Error starting server with host: "%s", port: "%s", client_port: "%s"\n' % (host, port, interpreter.client_port) + ) + sys.stderr.flush() + raise + + # Tell UMD the proper default namespace + _set_globals_function(interpreter.get_namespace) + + server.register_function(interpreter.execLine) + server.register_function(interpreter.execMultipleLines) + server.register_function(interpreter.getCompletions) + server.register_function(interpreter.getFrame) + server.register_function(interpreter.getVariable) + server.register_function(interpreter.changeVariable) + server.register_function(interpreter.getDescription) + server.register_function(interpreter.close) + server.register_function(interpreter.interrupt) + server.register_function(interpreter.handshake) + server.register_function(interpreter.connectToDebugger) + server.register_function(interpreter.hello) + server.register_function(interpreter.getArray) + server.register_function(interpreter.evaluate) + server.register_function(interpreter.ShowConsole) + server.register_function(interpreter.loadFullValue) + + # Functions for GUI main loop integration + server.register_function(interpreter.enableGui) + + if port == 0: + (h, port) = server.socket.getsockname() + + print(port) + print(interpreter.client_port) + + while True: + try: + server.serve_forever() + except: + # Ugly code to be py2/3 compatible + # https://sw-brainwy.rhcloud.com/tracker/PyDev/534: + # Unhandled "interrupted system call" error in the pydevconsol.py + e = sys.exc_info()[1] + retry = False + try: + retry = e.args[0] == 4 # errno.EINTR + except: + pass + if not retry: + raise + # Otherwise, keep on going + return server + except: + pydev_log.exception() + # Notify about error to avoid long waiting + connection_queue = interpreter.get_connect_status_queue() + if connection_queue is not None: + connection_queue.put(False) + + +def start_server(host, port, client_port): + # replace exit (see comments on method) + # note that this does not work in jython!!! (sys method can't be replaced). + sys.exit = do_exit + + interpreter = InterpreterInterface(host, client_port, threading.current_thread()) + + start_new_thread(start_console_server, (host, port, interpreter)) + + process_exec_queue(interpreter) + + +def get_ipython_hidden_vars(): + if IPYTHON and hasattr(__builtin__, "interpreter"): + interpreter = get_interpreter() + return interpreter.get_ipython_hidden_vars_dict() + + +def get_interpreter(): + try: + interpreterInterface = getattr(__builtin__, "interpreter") + except AttributeError: + interpreterInterface = InterpreterInterface(None, None, threading.current_thread()) + __builtin__.interpreter = interpreterInterface + sys.stderr.write(interpreterInterface.get_greeting_msg()) + sys.stderr.flush() + + return interpreterInterface + + +def get_completions(text, token, globals, locals): + interpreterInterface = get_interpreter() + + interpreterInterface.interpreter.update(globals, locals) + + return interpreterInterface.getCompletions(text, token) + + +# =============================================================================== +# Debugger integration +# =============================================================================== + + +def exec_code(code, globals, locals, debugger): + interpreterInterface = get_interpreter() + interpreterInterface.interpreter.update(globals, locals) + + res = interpreterInterface.need_more(code) + + if res: + return True + + interpreterInterface.add_exec(code, debugger) + + return False + + +class ConsoleWriter(InteractiveInterpreter): + skip = 0 + + def __init__(self, locals=None): + InteractiveInterpreter.__init__(self, locals) + + def write(self, data): + # if (data.find("global_vars") == -1 and data.find("pydevd") == -1): + if self.skip > 0: + self.skip -= 1 + else: + if data == "Traceback (most recent call last):\n": + self.skip = 1 + sys.stderr.write(data) + + def showsyntaxerror(self, filename=None): + """Display the syntax error that just occurred.""" + # Override for avoid using sys.excepthook PY-12600 + type, value, tb = sys.exc_info() + sys.last_type = type + sys.last_value = value + sys.last_traceback = tb + if filename and type is SyntaxError: + # Work hard to stuff the correct filename in the exception + try: + msg, (dummy_filename, lineno, offset, line) = value.args + except ValueError: + # Not the format we expect; leave it alone + pass + else: + # Stuff in the right filename + value = SyntaxError(msg, (filename, lineno, offset, line)) + sys.last_value = value + list = traceback.format_exception_only(type, value) + sys.stderr.write("".join(list)) + + def showtraceback(self, *args, **kwargs): + """Display the exception that just occurred.""" + # Override for avoid using sys.excepthook PY-12600 + try: + type, value, tb = sys.exc_info() + sys.last_type = type + sys.last_value = value + sys.last_traceback = tb + tblist = traceback.extract_tb(tb) + del tblist[:1] + lines = traceback.format_list(tblist) + if lines: + lines.insert(0, "Traceback (most recent call last):\n") + lines.extend(traceback.format_exception_only(type, value)) + finally: + tblist = tb = None + sys.stderr.write("".join(lines)) + + +def console_exec(thread_id, frame_id, expression, dbg): + """returns 'False' in case expression is partially correct""" + frame = dbg.find_frame(thread_id, frame_id) + + is_multiline = expression.count("@LINE@") > 1 + expression = str(expression.replace("@LINE@", "\n")) + + # Not using frame.f_globals because of https://sourceforge.net/tracker2/?func=detail&aid=2541355&group_id=85796&atid=577329 + # (Names not resolved in generator expression in method) + # See message: http://mail.python.org/pipermail/python-list/2009-January/526522.html + updated_globals = {} + updated_globals.update(frame.f_globals) + updated_globals.update(frame.f_locals) # locals later because it has precedence over the actual globals + + if IPYTHON: + need_more = exec_code(CodeFragment(expression), updated_globals, frame.f_locals, dbg) + if not need_more: + pydevd_save_locals.save_locals(frame) + return need_more + + interpreter = ConsoleWriter() + + if not is_multiline: + try: + code = compile_command(expression) + except (OverflowError, SyntaxError, ValueError): + # Case 1 + interpreter.showsyntaxerror() + return False + if code is None: + # Case 2 + return True + else: + code = expression + + # Case 3 + + try: + Exec(code, updated_globals, frame.f_locals) + + except SystemExit: + raise + except: + interpreter.showtraceback() + else: + pydevd_save_locals.save_locals(frame) + return False + + +# ======================================================================================================================= +# main +# ======================================================================================================================= +if __name__ == "__main__": + # Important: don't use this module directly as the __main__ module, rather, import itself as pydevconsole + # so that we don't get multiple pydevconsole modules if it's executed directly (otherwise we'd have multiple + # representations of its classes). + # See: https://sw-brainwy.rhcloud.com/tracker/PyDev/446: + # 'Variables' and 'Expressions' views stopped working when debugging interactive console + import pydevconsole + + sys.stdin = pydevconsole.BaseStdIn(sys.stdin) + port, client_port = sys.argv[1:3] + from _pydev_bundle import pydev_localhost + + if int(port) == 0 and int(client_port) == 0: + (h, p) = pydev_localhost.get_socket_name() + + client_port = p + + pydevconsole.start_server(pydev_localhost.get_localhost(), int(port), int(client_port)) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd.py new file mode 100644 index 0000000..51f69be --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd.py @@ -0,0 +1,3710 @@ +""" +Entry point module (keep at root): + +This module starts the debugger. +""" + +import sys # @NoMove + +if sys.version_info[:2] < (3, 6): + raise RuntimeError( + "The PyDev.Debugger requires Python 3.6 onwards to be run. If you need to use an older Python version, use an older version of the debugger." + ) +import os + +# On the first import of a pydevd module, add pydevd itself to the PYTHONPATH +this_dir = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, this_dir) + +import _pydev_bundle + +# Import this first as it'll check for shadowed modules and will make sure that we import +# things as needed for gevent. +from _pydevd_bundle import pydevd_constants +from typing import Optional, Tuple +from types import FrameType + +import atexit +import dis +import io +from collections import defaultdict +from contextlib import contextmanager +from functools import partial +import itertools +import traceback +import weakref +import getpass as getpass_mod +import functools + +import pydevd_file_utils +from _pydevd_bundle.pydevd_dont_trace_files import LIB_FILES_IN_DONT_TRACE_DIRS +from _pydev_bundle import pydev_imports, pydev_log +from _pydev_bundle._pydev_filesystem_encoding import getfilesystemencoding +from _pydev_bundle.pydev_is_thread_alive import is_thread_alive +from _pydev_bundle.pydev_override import overrides +from _pydev_bundle._pydev_saved_modules import threading, time, thread, ThreadingEvent +from _pydevd_bundle import pydevd_extension_utils, pydevd_frame_utils +from _pydevd_bundle.pydevd_filtering import FilesFiltering, glob_matches_path +from _pydevd_bundle import pydevd_io, pydevd_vm_type, pydevd_defaults +from _pydevd_bundle import pydevd_utils +from _pydevd_bundle import pydevd_runpy +from _pydev_bundle.pydev_console_utils import DebugConsoleStdIn +from _pydevd_bundle.pydevd_additional_thread_info import set_additional_thread_info, remove_additional_info +from _pydevd_bundle.pydevd_breakpoints import ExceptionBreakpoint, get_exception_breakpoint +from _pydevd_bundle.pydevd_comm_constants import ( + CMD_THREAD_SUSPEND, + CMD_STEP_INTO, + CMD_SET_BREAK, + CMD_STEP_INTO_MY_CODE, + CMD_STEP_OVER, + CMD_SMART_STEP_INTO, + CMD_RUN_TO_LINE, + CMD_SET_NEXT_STATEMENT, + CMD_STEP_RETURN, + CMD_ADD_EXCEPTION_BREAK, + CMD_STEP_RETURN_MY_CODE, + CMD_STEP_OVER_MY_CODE, + constant_to_str, + CMD_STEP_INTO_COROUTINE, +) +from _pydevd_bundle.pydevd_constants import ( + get_thread_id, + get_current_thread_id, + DebugInfoHolder, + PYTHON_SUSPEND, + STATE_SUSPEND, + STATE_RUN, + get_frame, + clear_cached_thread_id, + INTERACTIVE_MODE_AVAILABLE, + SHOW_DEBUG_INFO_ENV, + NULL, + NO_FTRACE, + IS_IRONPYTHON, + JSON_PROTOCOL, + IS_CPYTHON, + HTTP_JSON_PROTOCOL, + USE_CUSTOM_SYS_CURRENT_FRAMES_MAP, + call_only_once, + ForkSafeLock, + IGNORE_BASENAMES_STARTING_WITH, + EXCEPTION_TYPE_UNHANDLED, + SUPPORT_GEVENT, + PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING, + PYDEVD_IPYTHON_CONTEXT, + PYDEVD_USE_SYS_MONITORING, +) +from _pydevd_bundle.pydevd_defaults import PydevdCustomization # Note: import alias used on pydev_monkey. +from _pydevd_bundle.pydevd_custom_frames import CustomFramesContainer, custom_frames_container_init +from _pydevd_bundle.pydevd_dont_trace_files import DONT_TRACE, PYDEV_FILE, LIB_FILE, DONT_TRACE_DIRS +from _pydevd_bundle.pydevd_extension_api import DebuggerEventHandler +from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame, remove_exception_from_frame, short_stack +from _pydevd_bundle.pydevd_net_command_factory_xml import NetCommandFactory +from _pydevd_bundle.pydevd_trace_dispatch import ( + trace_dispatch as _trace_dispatch, + global_cache_skips, + global_cache_frame_skips, + fix_top_level_trace_and_get_trace_func, + USING_CYTHON, +) +from _pydevd_bundle.pydevd_utils import save_main_module, is_current_thread_main_thread, import_attr_from_module +from _pydevd_frame_eval.pydevd_frame_eval_main import frame_eval_func, dummy_trace_dispatch, USING_FRAME_EVAL +import pydev_ipython # @UnusedImport +from _pydevd_bundle.pydevd_source_mapping import SourceMapping +from _pydevd_bundle.pydevd_concurrency_analyser.pydevd_concurrency_logger import ( + ThreadingLogger, + AsyncioLogger, + send_concurrency_message, + cur_time, +) +from _pydevd_bundle.pydevd_concurrency_analyser.pydevd_thread_wrappers import wrap_threads +from pydevd_file_utils import ( + get_abs_path_real_path_and_base_from_frame, + get_abs_path_real_path_and_base_from_file, + NORM_PATHS_AND_BASE_CONTAINER, +) +from pydevd_file_utils import get_fullname, get_package_dir +from os.path import abspath as os_path_abspath +import pydevd_tracing +from _pydevd_bundle.pydevd_comm import InternalThreadCommand, InternalThreadCommandForAnyThread, create_server_socket, FSNotifyThread +from _pydevd_bundle.pydevd_comm import ( + InternalConsoleExec, + _queue, + ReaderThread, + GetGlobalDebugger, + get_global_debugger, + set_global_debugger, + WriterThread, + start_client, + start_server, + InternalGetBreakpointException, + InternalSendCurrExceptionTrace, + InternalSendCurrExceptionTraceProceeded, +) +from _pydevd_bundle.pydevd_daemon_thread import PyDBDaemonThread, mark_as_pydevd_daemon_thread +from _pydevd_bundle.pydevd_process_net_command_json import PyDevJsonCommandProcessor +from _pydevd_bundle.pydevd_process_net_command import process_net_command +from _pydevd_bundle.pydevd_net_command import NetCommand, NULL_NET_COMMAND + +from _pydevd_bundle.pydevd_breakpoints import stop_on_unhandled_exception +from _pydevd_bundle.pydevd_collect_bytecode_info import collect_try_except_info, collect_return_info, collect_try_except_info_from_source +from _pydevd_bundle.pydevd_suspended_frames import SuspendedFramesManager +from socket import SHUT_RDWR +from _pydevd_bundle.pydevd_api import PyDevdAPI +from _pydevd_bundle.pydevd_timeout import TimeoutTracker +from _pydevd_bundle.pydevd_thread_lifecycle import suspend_all_threads, mark_thread_suspended + +if PYDEVD_USE_SYS_MONITORING: + from _pydevd_sys_monitoring import pydevd_sys_monitoring + +pydevd_gevent_integration = None + +if SUPPORT_GEVENT: + try: + from _pydevd_bundle import pydevd_gevent_integration + except: + pydev_log.exception( + "pydevd: GEVENT_SUPPORT is set but gevent is not available in the environment.\n" + "Please unset GEVENT_SUPPORT from the environment variables or install gevent." + ) + else: + pydevd_gevent_integration.log_gevent_debug_info() + +if USE_CUSTOM_SYS_CURRENT_FRAMES_MAP: + from _pydevd_bundle.pydevd_constants import constructed_tid_to_last_frame + +__version_info__ = (3, 2, 3) +__version_info_str__ = [] +for v in __version_info__: + __version_info_str__.append(str(v)) + +__version__ = ".".join(__version_info_str__) + +# IMPORTANT: pydevd_constants must be the 1st thing defined because it'll keep a reference to the original sys._getframe + + +def install_breakpointhook(pydevd_breakpointhook=None): + if pydevd_breakpointhook is None: + + def pydevd_breakpointhook(*args, **kwargs): + hookname = os.getenv("PYTHONBREAKPOINT") + if ( + hookname is not None + and len(hookname) > 0 + and hasattr(sys, "__breakpointhook__") + and sys.__breakpointhook__ != pydevd_breakpointhook + ): + sys.__breakpointhook__(*args, **kwargs) + else: + settrace(*args, **kwargs) + + if sys.version_info[0:2] >= (3, 7): + # There are some choices on how to provide the breakpoint hook. Namely, we can provide a + # PYTHONBREAKPOINT which provides the import path for a method to be executed or we + # can override sys.breakpointhook. + # pydevd overrides sys.breakpointhook instead of providing an environment variable because + # it's possible that the debugger starts the user program but is not available in the + # PYTHONPATH (and would thus fail to be imported if PYTHONBREAKPOINT was set to pydevd.settrace). + # Note that the implementation still takes PYTHONBREAKPOINT in account (so, if it was provided + # by someone else, it'd still work). + sys.breakpointhook = pydevd_breakpointhook + else: + if sys.version_info[0] >= 3: + import builtins as __builtin__ # Py3 noqa + else: + import __builtin__ # noqa + + # In older versions, breakpoint() isn't really available, so, install the hook directly + # in the builtins. + __builtin__.breakpoint = pydevd_breakpointhook + sys.__breakpointhook__ = pydevd_breakpointhook + + +# Install the breakpoint hook at import time. +install_breakpointhook() + +from _pydevd_bundle.pydevd_plugin_utils import PluginManager + +threadingEnumerate = threading.enumerate +threadingCurrentThread = threading.current_thread + +try: + "dummy".encode("utf-8") # Added because otherwise Jython 2.2.1 wasn't finding the encoding (if it wasn't loaded in the main thread). +except: + pass + +_global_redirect_stdout_to_server = False +_global_redirect_stderr_to_server = False + +file_system_encoding = getfilesystemencoding() + +_CACHE_FILE_TYPE = {} + +pydev_log.debug("Using GEVENT_SUPPORT: %s", pydevd_constants.SUPPORT_GEVENT) +pydev_log.debug("Using GEVENT_SHOW_PAUSED_GREENLETS: %s", pydevd_constants.GEVENT_SHOW_PAUSED_GREENLETS) +pydev_log.debug("pydevd __file__: %s", os.path.abspath(__file__)) +pydev_log.debug("Using PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING: %s", pydevd_constants.PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING) +if pydevd_constants.PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING: + pydev_log.debug("PYDEVD_IPYTHON_CONTEXT: %s", pydevd_constants.PYDEVD_IPYTHON_CONTEXT) + +TIMEOUT_SLOW = 0.2 +TIMEOUT_FAST = 1.0 / 50 + + +# ======================================================================================================================= +# PyDBCommandThread +# ======================================================================================================================= +class PyDBCommandThread(PyDBDaemonThread): + + def __init__(self, py_db): + PyDBDaemonThread.__init__(self, py_db) + self._py_db_command_thread_event = py_db._py_db_command_thread_event + self.name = "pydevd.CommandThread" + + @overrides(PyDBDaemonThread._on_run) + def _on_run(self): + # Delay a bit this initialization to wait for the main program to start. + self._py_db_command_thread_event.wait(TIMEOUT_SLOW) + + if self._kill_received: + return + + try: + while not self._kill_received: + try: + self.py_db.process_internal_commands(("*",)) + except: + pydev_log.info("Finishing debug communication...(2)") + self._py_db_command_thread_event.clear() + self._py_db_command_thread_event.wait(TIMEOUT_SLOW) + except: + try: + pydev_log.debug(sys.exc_info()[0]) + except: + # In interpreter shutdown many things can go wrong (any module variables may + # be None, streams can be closed, etc). + pass + + # only got this error in interpreter shutdown + # pydev_log.info('Finishing debug communication...(3)') + + @overrides(PyDBDaemonThread.do_kill_pydev_thread) + def do_kill_pydev_thread(self): + PyDBDaemonThread.do_kill_pydev_thread(self) + # Set flag so that it can exit before the usual timeout. + self._py_db_command_thread_event.set() + + +# ======================================================================================================================= +# CheckAliveThread +# Non-daemon thread: guarantees that all data is written even if program is finished +# ======================================================================================================================= +class CheckAliveThread(PyDBDaemonThread): + + def __init__(self, py_db): + PyDBDaemonThread.__init__(self, py_db) + self.name = "pydevd.CheckAliveThread" + self.daemon = False + self._wait_event = ThreadingEvent() + + @overrides(PyDBDaemonThread._on_run) + def _on_run(self): + py_db = self.py_db + + def can_exit(): + with py_db._main_lock: + # Note: it's important to get the lock besides checking that it's empty (this + # means that we're not in the middle of some command processing). + writer = py_db.writer + writer_empty = writer is not None and writer.empty() + + return not py_db.has_user_threads_alive() and writer_empty + + try: + while not self._kill_received: + self._wait_event.wait(TIMEOUT_SLOW) + if can_exit(): + break + + py_db.check_output_redirect() + + if can_exit(): + pydev_log.debug("No threads alive, finishing debug session") + py_db.dispose_and_kill_all_pydevd_threads() + except: + pydev_log.exception() + + def join(self, timeout=None): + # If someone tries to join this thread, mark it to be killed. + # This is the case for CherryPy when auto-reload is turned on. + self.do_kill_pydev_thread() + PyDBDaemonThread.join(self, timeout=timeout) + + @overrides(PyDBDaemonThread.do_kill_pydev_thread) + def do_kill_pydev_thread(self): + PyDBDaemonThread.do_kill_pydev_thread(self) + # Set flag so that it can exit before the usual timeout. + self._wait_event.set() + + +class AbstractSingleNotificationBehavior(object): + """ + The basic usage should be: + + # Increment the request time for the suspend. + single_notification_behavior.increment_suspend_time() + + # Notify that this is a pause request (when a pause, not a breakpoint). + single_notification_behavior.on_pause() + + # Mark threads to be suspended. + set_suspend(...) + + # On do_wait_suspend, use notify_thread_suspended: + def do_wait_suspend(...): + with single_notification_behavior.notify_thread_suspended(thread_id, thread, reason): + ... + """ + + __slots__ = [ + "_last_resume_notification_time", + "_last_suspend_notification_time", + "_lock", + "_next_request_time", + "_suspend_time_request", + "_suspended_thread_id_to_thread", + "_pause_requested", + "_py_db", + ] + + NOTIFY_OF_PAUSE_TIMEOUT = 0.5 + + def __init__(self, py_db): + self._py_db = weakref.ref(py_db) + self._next_request_time = partial(next, itertools.count()) + self._last_suspend_notification_time = -1 + self._last_resume_notification_time = -1 + self._suspend_time_request = self._next_request_time() + self._lock = thread.allocate_lock() + self._suspended_thread_id_to_thread = {} + self._pause_requested = False + + def send_suspend_notification(self, thread_id, thread, stop_reason): + raise AssertionError("abstract: subclasses must override.") + + def send_resume_notification(self, thread_id): + raise AssertionError("abstract: subclasses must override.") + + def increment_suspend_time(self): + with self._lock: + self._suspend_time_request = self._next_request_time() + + def on_pause(self): + # Upon a pause, we should force sending new suspend notifications + # if no notification is sent after some time and there's some thread already stopped. + with self._lock: + self._pause_requested = True + global_suspend_time = self._suspend_time_request + py_db = self._py_db() + if py_db is not None: + py_db.timeout_tracker.call_on_timeout( + self.NOTIFY_OF_PAUSE_TIMEOUT, self._notify_after_timeout, kwargs={"global_suspend_time": global_suspend_time} + ) + + def _notify_after_timeout(self, global_suspend_time): + with self._lock: + if self._suspended_thread_id_to_thread: + if global_suspend_time > self._last_suspend_notification_time: + self._last_suspend_notification_time = global_suspend_time + # Notify about any thread which is currently suspended. + pydev_log.info("Sending suspend notification after timeout.") + thread_id, thread = next(iter(self._suspended_thread_id_to_thread.items())) + self.send_suspend_notification(thread_id, thread, CMD_THREAD_SUSPEND) + + def on_thread_suspend(self, thread_id, thread, stop_reason): + with self._lock: + pause_requested = self._pause_requested + if pause_requested: + # When a suspend notification is sent, reset the pause flag. + self._pause_requested = False + + self._suspended_thread_id_to_thread[thread_id] = thread + + # CMD_THREAD_SUSPEND should always be a side-effect of a break, so, only + # issue for a CMD_THREAD_SUSPEND if a pause is pending. + if stop_reason != CMD_THREAD_SUSPEND or pause_requested: + if self._suspend_time_request > self._last_suspend_notification_time: + pydev_log.info("Sending suspend notification.") + self._last_suspend_notification_time = self._suspend_time_request + self.send_suspend_notification(thread_id, thread, stop_reason) + else: + pydev_log.info( + "Suspend not sent (it was already sent). Last suspend % <= Last resume %s", + self._last_suspend_notification_time, + self._last_resume_notification_time, + ) + else: + pydev_log.info( + "Suspend not sent because stop reason is thread suspend and pause was not requested.", + ) + + def on_thread_resume(self, thread_id, thread): + # on resume (step, continue all): + with self._lock: + self._suspended_thread_id_to_thread.pop(thread_id) + if self._last_resume_notification_time < self._last_suspend_notification_time: + pydev_log.info("Sending resume notification.") + self._last_resume_notification_time = self._last_suspend_notification_time + self.send_resume_notification(thread_id) + else: + pydev_log.info( + "Resume not sent (it was already sent). Last resume %s >= Last suspend %s", + self._last_resume_notification_time, + self._last_suspend_notification_time, + ) + + @contextmanager + def notify_thread_suspended(self, thread_id, thread, stop_reason): + self.on_thread_suspend(thread_id, thread, stop_reason) + try: + yield # At this point the thread must be actually suspended. + finally: + self.on_thread_resume(thread_id, thread) + + +class ThreadsSuspendedSingleNotification(AbstractSingleNotificationBehavior): + __slots__ = AbstractSingleNotificationBehavior.__slots__ + ["multi_threads_single_notification", "_callbacks", "_callbacks_lock"] + + def __init__(self, py_db): + AbstractSingleNotificationBehavior.__init__(self, py_db) + # If True, pydevd will send a single notification when all threads are suspended/resumed. + self.multi_threads_single_notification = False + self._callbacks_lock = threading.Lock() + self._callbacks = [] + + def add_on_resumed_callback(self, callback): + with self._callbacks_lock: + self._callbacks.append(callback) + + @overrides(AbstractSingleNotificationBehavior.send_resume_notification) + def send_resume_notification(self, thread_id): + py_db = self._py_db() + if py_db is not None: + py_db.writer.add_command(py_db.cmd_factory.make_thread_resume_single_notification(thread_id)) + + with self._callbacks_lock: + callbacks = self._callbacks + self._callbacks = [] + + for callback in callbacks: + callback() + + @overrides(AbstractSingleNotificationBehavior.send_suspend_notification) + def send_suspend_notification(self, thread_id, thread, stop_reason): + py_db = self._py_db() + if py_db is not None: + py_db.writer.add_command(py_db.cmd_factory.make_thread_suspend_single_notification(py_db, thread_id, thread, stop_reason)) + + @overrides(AbstractSingleNotificationBehavior.notify_thread_suspended) + @contextmanager + def notify_thread_suspended(self, thread_id, thread, stop_reason): + if self.multi_threads_single_notification: + pydev_log.info("Thread suspend mode: single notification") + with AbstractSingleNotificationBehavior.notify_thread_suspended(self, thread_id, thread, stop_reason): + yield + else: + pydev_log.info("Thread suspend mode: NOT single notification") + yield + + +class _Authentication(object): + __slots__ = ["access_token", "client_access_token", "_authenticated", "_wrong_attempts"] + + def __init__(self): + # A token to be send in the command line or through the settrace api -- when such token + # is given, the first message sent to the IDE must pass the same token to authenticate. + # Note that if a disconnect is sent, the same message must be resent to authenticate. + self.access_token = None + + # This token is the one that the client requires to accept a connection from pydevd + # (it's stored here and just passed back when required, it's not used internally + # for anything else). + self.client_access_token = None + + self._authenticated = None + + self._wrong_attempts = 0 + + def is_authenticated(self): + if self._authenticated is None: + return self.access_token is None + return self._authenticated + + def login(self, access_token): + if self._wrong_attempts >= 10: # A user can fail to authenticate at most 10 times. + return + + self._authenticated = access_token == self.access_token + if not self._authenticated: + self._wrong_attempts += 1 + else: + self._wrong_attempts = 0 + + def logout(self): + self._authenticated = None + self._wrong_attempts = 0 + + +class PyDB(object): + """Main debugging class + Lots of stuff going on here: + + PyDB starts two threads on startup that connect to remote debugger (RDB) + The threads continuously read & write commands to RDB. + PyDB communicates with these threads through command queues. + Every RDB command is processed by calling process_net_command. + Every PyDB net command is sent to the net by posting NetCommand to WriterThread queue + + Some commands need to be executed on the right thread (suspend/resume & friends) + These are placed on the internal command queue. + """ + + # Direct child pids which should not be terminated when terminating processes. + # Note: class instance because it should outlive PyDB instances. + dont_terminate_child_pids = set() + + def __init__(self, set_as_global=True): + if set_as_global: + pydevd_tracing.replace_sys_set_trace_func() + + self.authentication = _Authentication() + + self.reader = None + self.writer = None + self._fsnotify_thread = None + self.created_pydb_daemon_threads = {} + self._waiting_for_connection_thread = None + self._on_configuration_done_event = ThreadingEvent() + self.check_alive_thread = None + self.py_db_command_thread = None + self.quitting = None + self.cmd_factory = NetCommandFactory() + self._cmd_queue = defaultdict(_queue.Queue) # Key is thread id or '*', value is Queue + self._thread_events = defaultdict(ThreadingEvent) # Key is thread id or '*', value is Event + self.suspended_frames_manager = SuspendedFramesManager() + self._files_filtering = FilesFiltering() + self.timeout_tracker = TimeoutTracker(self) + + # Note: when the source mapping is changed we also have to clear the file types cache + # (because if a given file is a part of the project or not may depend on it being + # defined in the source mapping). + self.source_mapping = SourceMapping(on_source_mapping_changed=self._clear_caches) + + # Determines whether we should terminate child processes when asked to terminate. + self.terminate_child_processes = True + + # Determines whether we should try to do a soft terminate (i.e.: interrupt the main + # thread with a KeyboardInterrupt). + self.terminate_keyboard_interrupt = False + + # Set to True after a keyboard interrupt is requested the first time. + self.keyboard_interrupt_requested = False + + # These are the breakpoints received by the PyDevdAPI. They are meant to store + # the breakpoints in the api -- its actual contents are managed by the api. + self.api_received_breakpoints = {} + + # These are the breakpoints meant to be consumed during runtime. + self.breakpoints = {} + self.function_breakpoint_name_to_breakpoint = {} + + # Set communication protocol + PyDevdAPI().set_protocol(self, 0, PydevdCustomization.DEFAULT_PROTOCOL) + + self.variable_presentation = PyDevdAPI.VariablePresentation() + + # mtime to be raised when something that will affect the + # tracing in place (such as breakpoints change or filtering). + self.mtime = 0 + + self.file_to_id_to_line_breakpoint = {} + self.file_to_id_to_plugin_breakpoint = {} + + # Note: breakpoints dict should not be mutated: a copy should be created + # and later it should be assigned back (to prevent concurrency issues). + self.break_on_uncaught_exceptions = {} + self.break_on_caught_exceptions = {} + self.break_on_user_uncaught_exceptions = {} + + self.ready_to_run = False + self._main_lock = thread.allocate_lock() + self._lock_running_thread_ids = thread.allocate_lock() + self._lock_create_fs_notify = thread.allocate_lock() + self._py_db_command_thread_event = ThreadingEvent() + if set_as_global: + CustomFramesContainer._py_db_command_thread_event = self._py_db_command_thread_event + + self.pydb_disposed = False + self._wait_for_threads_to_finish_called = False + self._wait_for_threads_to_finish_called_lock = thread.allocate_lock() + self._wait_for_threads_to_finish_called_event = ThreadingEvent() + + self.terminate_requested = False + self._disposed_lock = thread.allocate_lock() + self.signature_factory = None + self.SetTrace = pydevd_tracing.SetTrace + self.skip_on_exceptions_thrown_in_same_context = False + self.ignore_exceptions_thrown_in_lines_with_ignore_exception = True + + # Suspend debugger even if breakpoint condition raises an exception. + # May be changed with CMD_PYDEVD_JSON_CONFIG. + self.skip_suspend_on_breakpoint_exception = () # By default suspend on any Exception. + self.skip_print_breakpoint_exception = () # By default print on any Exception. + + # By default user can step into properties getter/setter/deleter methods + self.disable_property_trace = False + self.disable_property_getter_trace = False + self.disable_property_setter_trace = False + self.disable_property_deleter_trace = False + + # this is a dict of thread ids pointing to thread ids. Whenever a command is passed to the java end that + # acknowledges that a thread was created, the thread id should be passed here -- and if at some time we do not + # find that thread alive anymore, we must remove it from this list and make the java side know that the thread + # was killed. + self._running_thread_ids = {} + # Note: also access '_enable_thread_notifications' with '_lock_running_thread_ids' + self._enable_thread_notifications = False + + self._set_breakpoints_with_id = False + + # This attribute holds the file-> lines which have an @IgnoreException. + self.filename_to_lines_where_exceptions_are_ignored = {} + + # working with plugins (lazily initialized) + self.plugin = None + self.has_plugin_line_breaks = False + self.has_plugin_exception_breaks = False + self.thread_analyser = None + self.asyncio_analyser = None + + # The GUI event loop that's going to run. + # Possible values: + # matplotlib - Whatever GUI backend matplotlib is using. + # 'wx'/'qt'/'none'/... - GUI toolkits that have bulitin support. See pydevd_ipython/inputhook.py:24. + # Other - A custom function that'll be imported and run. + self._gui_event_loop = "matplotlib" + self._installed_gui_support = False + self.gui_in_use = False + + # GUI event loop support in debugger + self.activate_gui_function = None + + # matplotlib support in debugger and debug console + self.mpl_hooks_in_debug_console = False + self.mpl_modules_for_patching = {} + + self._filename_to_not_in_scope = {} + self.first_breakpoint_reached = False + self._exclude_filters_enabled = self._files_filtering.use_exclude_filters() + self._is_libraries_filter_enabled = self._files_filtering.use_libraries_filter() + self.is_files_filter_enabled = self._exclude_filters_enabled or self._is_libraries_filter_enabled + self.show_return_values = False + self.remove_return_values_flag = False + self.redirect_output = False + # Note that besides the `redirect_output` flag, we also need to consider that someone + # else is already redirecting (i.e.: debugpy). + self.is_output_redirected = False + + # this flag disables frame evaluation even if it's available + self.use_frame_eval = True + + # If True, pydevd will send a single notification when all threads are suspended/resumed. + self._threads_suspended_single_notification = ThreadsSuspendedSingleNotification(self) + + # If True a step command will do a step in one thread and will also resume all other threads. + self.stepping_resumes_all_threads = False + + self._local_thread_trace_func = threading.local() + + self._server_socket_ready_event = ThreadingEvent() + self._server_socket_name = None + + # Bind many locals to the debugger because upon teardown those names may become None + # in the namespace (and thus can't be relied upon unless the reference was previously + # saved). + if IS_IRONPYTHON: + + # A partial() cannot be used in IronPython for sys.settrace. + def new_trace_dispatch(frame, event, arg): + return _trace_dispatch(self, frame, event, arg) + + self.trace_dispatch = new_trace_dispatch + else: + self.trace_dispatch = partial(_trace_dispatch, self) + self.fix_top_level_trace_and_get_trace_func = fix_top_level_trace_and_get_trace_func + self.frame_eval_func = frame_eval_func + self.dummy_trace_dispatch = dummy_trace_dispatch + + # Note: this is different from pydevd_constants.thread_get_ident because we want Jython + # to be None here because it also doesn't have threading._active. + try: + self.threading_get_ident = threading.get_ident # Python 3 + self.threading_active = threading._active + except: + try: + self.threading_get_ident = threading._get_ident # Python 2 noqa + self.threading_active = threading._active + except: + self.threading_get_ident = None # Jython + self.threading_active = None + self.threading_current_thread = threading.currentThread + self.set_additional_thread_info = set_additional_thread_info + self.stop_on_unhandled_exception = stop_on_unhandled_exception + self.collect_return_info = collect_return_info + self.get_exception_breakpoint = get_exception_breakpoint + self._dont_trace_get_file_type = DONT_TRACE.get + self._dont_trace_dirs_get_file_type = DONT_TRACE_DIRS.get + self.PYDEV_FILE = PYDEV_FILE + self.LIB_FILE = LIB_FILE + + self._in_project_scope_cache = {} + self._exclude_by_filter_cache = {} + self._apply_filter_cache = {} + self._ignore_system_exit_codes = set() + + # DAP related + self._dap_messages_listeners = [] + + if set_as_global: + # Set as the global instance only after it's initialized. + set_global_debugger(self) + + pydevd_defaults.on_pydb_init(self) + # Stop the tracing as the last thing before the actual shutdown for a clean exit. + atexit.register(stoptrace) + + def collect_try_except_info(self, code_obj): + filename = code_obj.co_filename + try: + if os.path.exists(filename): + pydev_log.debug("Collecting try..except info from source for %s", filename) + try_except_infos = collect_try_except_info_from_source(filename) + if try_except_infos: + # Filter for the current function + max_line = -1 + min_line = sys.maxsize + for _, line in dis.findlinestarts(code_obj): + if line is not None: + if line > max_line: + max_line = line + if line < min_line: + min_line = line + + try_except_infos = [x for x in try_except_infos if min_line <= x.try_line <= max_line] + return try_except_infos + + except: + pydev_log.exception("Error collecting try..except info from source (%s)", filename) + + pydev_log.debug("Collecting try..except info from bytecode for %s", filename) + return collect_try_except_info(code_obj) + + def setup_auto_reload_watcher(self, enable_auto_reload, watch_dirs, poll_target_time, exclude_patterns, include_patterns): + try: + with self._lock_create_fs_notify: + # When setting up, dispose of the previous one (if any). + if self._fsnotify_thread is not None: + self._fsnotify_thread.do_kill_pydev_thread() + self._fsnotify_thread = None + + if not enable_auto_reload: + return + + exclude_patterns = tuple(exclude_patterns) + include_patterns = tuple(include_patterns) + + def accept_directory(absolute_filename, cache={}): + try: + return cache[absolute_filename] + except: + if absolute_filename and absolute_filename[-1] not in ("/", "\\"): + # I.e.: for directories we always end with '/' or '\\' so that + # we match exclusions such as "**/node_modules/**" + absolute_filename += os.path.sep + + # First include what we want + for include_pattern in include_patterns: + if glob_matches_path(absolute_filename, include_pattern): + cache[absolute_filename] = True + return True + + # Then exclude what we don't want + for exclude_pattern in exclude_patterns: + if glob_matches_path(absolute_filename, exclude_pattern): + cache[absolute_filename] = False + return False + + # By default track all directories not excluded. + cache[absolute_filename] = True + return True + + def accept_file(absolute_filename, cache={}): + try: + return cache[absolute_filename] + except: + # First include what we want + for include_pattern in include_patterns: + if glob_matches_path(absolute_filename, include_pattern): + cache[absolute_filename] = True + return True + + # Then exclude what we don't want + for exclude_pattern in exclude_patterns: + if glob_matches_path(absolute_filename, exclude_pattern): + cache[absolute_filename] = False + return False + + # By default don't track files not included. + cache[absolute_filename] = False + return False + + self._fsnotify_thread = FSNotifyThread(self, PyDevdAPI(), watch_dirs) + watcher = self._fsnotify_thread.watcher + watcher.accept_directory = accept_directory + watcher.accept_file = accept_file + + watcher.target_time_for_single_scan = poll_target_time + watcher.target_time_for_notification = poll_target_time + self._fsnotify_thread.start() + except: + pydev_log.exception("Error setting up auto-reload.") + + def get_arg_ppid(self): + try: + setup = SetupHolder.setup + if setup: + return int(setup.get("ppid", 0)) + except: + pydev_log.exception("Error getting ppid.") + + return 0 + + def wait_for_ready_to_run(self): + while not self.ready_to_run: + # busy wait until we receive run command + self.process_internal_commands() + self._py_db_command_thread_event.clear() + self._py_db_command_thread_event.wait(TIMEOUT_FAST) + + def on_initialize(self): + """ + Note: only called when using the DAP (Debug Adapter Protocol). + """ + self._on_configuration_done_event.clear() + + def on_configuration_done(self): + """ + Note: only called when using the DAP (Debug Adapter Protocol). + """ + self._on_configuration_done_event.set() + self._py_db_command_thread_event.set() + + def is_attached(self): + return self._on_configuration_done_event.is_set() + + def on_disconnect(self): + """ + Note: only called when using the DAP (Debug Adapter Protocol). + """ + self.authentication.logout() + self._on_configuration_done_event.clear() + + def set_ignore_system_exit_codes(self, ignore_system_exit_codes): + assert isinstance(ignore_system_exit_codes, (list, tuple, set)) + self._ignore_system_exit_codes = set(ignore_system_exit_codes) + + def ignore_system_exit_code(self, system_exit_exc): + if hasattr(system_exit_exc, "code"): + return system_exit_exc.code in self._ignore_system_exit_codes + else: + return system_exit_exc in self._ignore_system_exit_codes + + def block_until_configuration_done(self, cancel=None): + if cancel is None: + cancel = NULL + + while not cancel.is_set(): + if self._on_configuration_done_event.is_set(): + cancel.set() # Set cancel to prevent reuse + return + + self.process_internal_commands() + self._py_db_command_thread_event.clear() + self._py_db_command_thread_event.wait(TIMEOUT_FAST) + + def add_fake_frame(self, thread_id, frame_id, frame): + self.suspended_frames_manager.add_fake_frame(thread_id, frame_id, frame) + + def handle_breakpoint_condition(self, info, pybreakpoint, new_frame): + condition = pybreakpoint.condition + try: + if pybreakpoint.handle_hit_condition(new_frame): + return True + + if not condition: + return False + + return eval(condition, new_frame.f_globals, new_frame.f_locals) + except Exception as e: + if not isinstance(e, self.skip_print_breakpoint_exception): + stack_trace = io.StringIO() + etype, value, tb = sys.exc_info() + traceback.print_exception(etype, value, tb.tb_next, file=stack_trace) + + msg = "Error while evaluating expression in conditional breakpoint: %s\n%s" % (condition, stack_trace.getvalue()) + api = PyDevdAPI() + api.send_error_message(self, msg) + + if not isinstance(e, self.skip_suspend_on_breakpoint_exception): + try: + # add exception_type and stacktrace into thread additional info + etype, value, tb = sys.exc_info() + error = "".join(traceback.format_exception_only(etype, value)) + stack = traceback.extract_stack(f=tb.tb_frame.f_back) + + # On self.set_suspend(thread, CMD_SET_BREAK) this info will be + # sent to the client. + info.conditional_breakpoint_exception = ("Condition:\n" + condition + "\n\nError:\n" + error, stack) + except: + pydev_log.exception() + return True + + return False + + finally: + etype, value, tb = None, None, None + + def handle_breakpoint_expression(self, pybreakpoint, info, new_frame): + try: + try: + val = eval(pybreakpoint.expression, new_frame.f_globals, new_frame.f_locals) + except: + val = sys.exc_info()[1] + finally: + if val is not None: + info.pydev_message = str(val) + + def _internal_get_file_type(self, abs_real_path_and_basename): + basename = abs_real_path_and_basename[-1] + if basename.startswith(IGNORE_BASENAMES_STARTING_WITH) or abs_real_path_and_basename[0].startswith(IGNORE_BASENAMES_STARTING_WITH): + # Note: these are the files that are completely ignored (they aren't shown to the user + # as user nor library code as it's usually just noise in the frame stack). + return self.PYDEV_FILE + file_type = self._dont_trace_get_file_type(basename) + if file_type is not None: + return file_type + + if basename.startswith("__init__.py") or basename in LIB_FILES_IN_DONT_TRACE_DIRS: + # i.e.: ignore the __init__ files inside pydevd (the other + # files are ignored just by their name). + abs_path = abs_real_path_and_basename[0] + i = max(abs_path.rfind("/"), abs_path.rfind("\\")) + if i: + abs_path = abs_path[0:i] + i = max(abs_path.rfind("/"), abs_path.rfind("\\")) + if i: + dirname = abs_path[i + 1:] + # At this point, something as: + # "my_path\_pydev_runfiles\__init__.py" + # is now "_pydev_runfiles". + return self._dont_trace_dirs_get_file_type(dirname) + return None + + def dont_trace_external_files(self, abs_path): + """ + :param abs_path: + The result from get_abs_path_real_path_and_base_from_file or + get_abs_path_real_path_and_base_from_frame. + + :return + True : + If files should NOT be traced. + + False: + If files should be traced. + """ + # By default all external files are traced. Note: this function is expected to + # be changed for another function in PyDevdAPI.set_dont_trace_start_end_patterns. + return False + + def get_file_type(self, frame, abs_real_path_and_basename=None, _cache_file_type=_CACHE_FILE_TYPE): + """ + :param abs_real_path_and_basename: + The result from get_abs_path_real_path_and_base_from_file or + get_abs_path_real_path_and_base_from_frame. + + :return + _pydevd_bundle.pydevd_dont_trace_files.PYDEV_FILE: + If it's a file internal to the debugger which shouldn't be + traced nor shown to the user. + + _pydevd_bundle.pydevd_dont_trace_files.LIB_FILE: + If it's a file in a library which shouldn't be traced. + + None: + If it's a regular user file which should be traced. + """ + if abs_real_path_and_basename is None: + try: + # Make fast path faster! + abs_real_path_and_basename = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + except: + abs_real_path_and_basename = get_abs_path_real_path_and_base_from_frame(frame) + + # Note 1: we have to take into account that we may have files as '', and that in + # this case the cache key can't rely only on the filename. With the current cache, there's + # still a potential miss if 2 functions which have exactly the same content are compiled + # with '', but in practice as we only separate the one from python -c from the rest + # this shouldn't be a problem in practice. + + # Note 2: firstlineno added to make misses faster in the first comparison. + + # Note 3: this cache key is repeated in pydevd_frame_evaluator.pyx:get_func_code_info (for + # speedups). + cache_key = (frame.f_code.co_firstlineno, abs_real_path_and_basename[0], frame.f_code) + try: + return _cache_file_type[cache_key] + except: + if abs_real_path_and_basename[0] == "": + f = frame.f_back + while f is not None: + if self.get_file_type(f) != self.PYDEV_FILE and pydevd_file_utils.basename(f.f_code.co_filename) not in ( + "runpy.py", + "", + ): + # We found some back frame that's not internal, which means we must consider + # this a library file. + # This is done because we only want to trace files as if they don't + # have any back frame (which is the case for python -c ...), for all other + # cases we don't want to trace them because we can't show the source to the + # user (at least for now...). + + # Note that we return as a LIB_FILE and not PYDEV_FILE because we still want + # to show it in the stack. + _cache_file_type[cache_key] = LIB_FILE + return LIB_FILE + + f = f.f_back + else: + # This is a top-level file (used in python -c), so, trace it as usual... we + # still won't be able to show the sources, but some tests require this to work. + _cache_file_type[cache_key] = None + return None + + file_type = self._internal_get_file_type(abs_real_path_and_basename) + if file_type is None: + if self.dont_trace_external_files(abs_real_path_and_basename[0]): + file_type = PYDEV_FILE + + _cache_file_type[cache_key] = file_type + return file_type + + def is_cache_file_type_empty(self): + return not _CACHE_FILE_TYPE + + def get_cache_file_type(self, _cache=_CACHE_FILE_TYPE): # i.e.: Make it local. + return _cache + + def get_thread_local_trace_func(self): + try: + thread_trace_func = self._local_thread_trace_func.thread_trace_func + except AttributeError: + thread_trace_func = self.trace_dispatch + return thread_trace_func + + def enable_tracing(self, thread_trace_func=None, apply_to_all_threads=False): + """ + Enables tracing. + + If in regular mode (tracing), will set the tracing function to the tracing + function for this thread -- by default it's `PyDB.trace_dispatch`, but after + `PyDB.enable_tracing` is called with a `thread_trace_func`, the given function will + be the default for the given thread. + + :param bool apply_to_all_threads: + If True we'll set the tracing function in all threads, not only in the current thread. + If False only the tracing for the current function should be changed. + In general apply_to_all_threads should only be true if this is the first time + this function is called on a multi-threaded program (either programmatically or attach + to pid). + """ + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.start_monitoring(all_threads=apply_to_all_threads) + return + + if pydevd_gevent_integration is not None: + pydevd_gevent_integration.enable_gevent_integration() + + if self.frame_eval_func is not None: + self.frame_eval_func() + pydevd_tracing.SetTrace(self.dummy_trace_dispatch) + + if IS_CPYTHON and apply_to_all_threads: + pydevd_tracing.set_trace_to_threads(self.dummy_trace_dispatch) + return + + if apply_to_all_threads: + # If applying to all threads, don't use the local thread trace function. + assert thread_trace_func is not None + else: + if thread_trace_func is None: + thread_trace_func = self.get_thread_local_trace_func() + else: + self._local_thread_trace_func.thread_trace_func = thread_trace_func + + pydevd_tracing.SetTrace(thread_trace_func) + if IS_CPYTHON and apply_to_all_threads: + pydevd_tracing.set_trace_to_threads(thread_trace_func) + + def disable_tracing(self): + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.stop_monitoring(all_threads=False) + else: + pydevd_tracing.SetTrace(None) + + def on_breakpoints_changed(self, removed=False): + """ + When breakpoints change, we have to re-evaluate all the assumptions we've made so far. + """ + if not self.ready_to_run: + # No need to do anything if we're still not running. + return + + self.mtime += 1 + if not removed: + # When removing breakpoints we can leave tracing as was, but if a breakpoint was added + # we have to reset the tracing for the existing functions to be re-evaluated. + + # The caches also need to be cleared because of django breakpoints use case, + # where adding a file needs to start tracking a context which was previously + # untracked. + self._clear_caches() + self.set_tracing_for_untraced_contexts(breakpoints_changed=True) + + def set_tracing_for_untraced_contexts(self, breakpoints_changed=False): + # Enable the tracing for existing threads (because there may be frames being executed that + # are currently untraced). + if PYDEVD_USE_SYS_MONITORING and breakpoints_changed: + pydevd_sys_monitoring.update_monitor_events() + + if IS_CPYTHON: + # Note: use sys._current_frames instead of threading.enumerate() because this way + # we also see C/C++ threads, not only the ones visible to the threading module. + tid_to_frame = sys._current_frames() + + ignore_thread_ids = set( + t.ident + for t in threadingEnumerate() + if getattr(t, "is_pydev_daemon_thread", False) or getattr(t, "pydev_do_not_trace", False) + ) + + for thread_ident, frame in tid_to_frame.items(): + if thread_ident not in ignore_thread_ids: + self.set_trace_for_frame_and_parents(thread_ident, frame) + + else: + try: + threads = threadingEnumerate() + for t in threads: + if getattr(t, "is_pydev_daemon_thread", False) or getattr(t, "pydev_do_not_trace", False): + continue + + additional_info = set_additional_thread_info(t) + frame = additional_info.get_topmost_frame(t) + try: + if frame is not None: + self.set_trace_for_frame_and_parents(t.ident, frame) + finally: + frame = None + finally: + frame = None + t = None + threads = None + additional_info = None + + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.restart_events() + + @property + def multi_threads_single_notification(self): + return self._threads_suspended_single_notification.multi_threads_single_notification + + @multi_threads_single_notification.setter + def multi_threads_single_notification(self, notify): + self._threads_suspended_single_notification.multi_threads_single_notification = notify + + @property + def threads_suspended_single_notification(self): + return self._threads_suspended_single_notification + + def get_plugin_lazy_init(self): + if self.plugin is None: + self.plugin = PluginManager(self) + return self.plugin + + def in_project_scope(self, frame, absolute_filename=None): + """ + Note: in general this method should not be used (apply_files_filter should be used + in most cases as it also handles the project scope check). + + :param frame: + The frame we want to check. + + :param absolute_filename: + Must be the result from get_abs_path_real_path_and_base_from_frame(frame)[0] (can + be used to speed this function a bit if it's already available to the caller, but + in general it's not needed). + """ + try: + if absolute_filename is None: + try: + # Make fast path faster! + abs_real_path_and_basename = NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + except: + abs_real_path_and_basename = get_abs_path_real_path_and_base_from_frame(frame) + + absolute_filename = abs_real_path_and_basename[0] + + cache_key = (frame.f_code.co_firstlineno, absolute_filename, frame.f_code) + + return self._in_project_scope_cache[cache_key] + except KeyError: + cache = self._in_project_scope_cache + try: + abs_real_path_and_basename # If we've gotten it previously, use it again. + except NameError: + abs_real_path_and_basename = get_abs_path_real_path_and_base_from_frame(frame) + + # pydevd files are never considered to be in the project scope. + file_type = self.get_file_type(frame, abs_real_path_and_basename) + if file_type == self.PYDEV_FILE: + cache[cache_key] = False + + elif absolute_filename == "": + # Special handling for '' + if file_type == self.LIB_FILE: + cache[cache_key] = False + else: + cache[cache_key] = True + + elif self.source_mapping.has_mapping_entry(absolute_filename): + cache[cache_key] = True + + else: + cache[cache_key] = self._files_filtering.in_project_roots(absolute_filename) + + return cache[cache_key] + + def in_project_roots_filename_uncached(self, absolute_filename): + return self._files_filtering.in_project_roots(absolute_filename) + + def _clear_caches(self): + # Skip caches + global_cache_skips.clear() + global_cache_frame_skips.clear() + + # Filter caches + self._in_project_scope_cache.clear() + self._exclude_by_filter_cache.clear() + self._apply_filter_cache.clear() + self._exclude_filters_enabled = self._files_filtering.use_exclude_filters() + self._is_libraries_filter_enabled = self._files_filtering.use_libraries_filter() + self.is_files_filter_enabled = self._exclude_filters_enabled or self._is_libraries_filter_enabled + + self.mtime += 1 + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.update_monitor_events() + pydevd_sys_monitoring.restart_events() + + def clear_dont_trace_start_end_patterns_caches(self): + # When start/end patterns are changed we must clear all caches which would be + # affected by a change in get_file_type() and reset the tracing function + # as places which were traced may no longer need to be traced and vice-versa. + self.on_breakpoints_changed() + _CACHE_FILE_TYPE.clear() + self._clear_caches() + + def _exclude_by_filter(self, frame, absolute_filename): + """ + :return: True if it should be excluded, False if it should be included and None + if no rule matched the given file. + + :note: it'll be normalized as needed inside of this method. + """ + cache_key = (absolute_filename, frame.f_code.co_name, frame.f_code.co_firstlineno) + try: + return self._exclude_by_filter_cache[cache_key] + except KeyError: + cache = self._exclude_by_filter_cache + + # pydevd files are always filtered out + if self.get_file_type(frame) == self.PYDEV_FILE: + cache[cache_key] = True + else: + module_name = None + if self._files_filtering.require_module: + module_name = frame.f_globals.get("__name__", "") + cache[cache_key] = self._files_filtering.exclude_by_filter(absolute_filename, module_name) + + return cache[cache_key] + + def apply_files_filter(self, frame, original_filename, force_check_project_scope): + """ + Should only be called if `self.is_files_filter_enabled == True` or `force_check_project_scope == True`. + + Note that it covers both the filter by specific paths includes/excludes as well + as the check which filters out libraries if not in the project scope. + + :param original_filename: + Note can either be the original filename or the absolute version of that filename. + + :param force_check_project_scope: + Check that the file is in the project scope even if the global setting + is off. + + :return bool: + True if it should be excluded when stepping and False if it should be + included. + """ + cache_key = (frame.f_code.co_firstlineno, original_filename, force_check_project_scope, frame.f_code) + try: + return self._apply_filter_cache[cache_key] + except KeyError: + DEBUG = True # 'defaulttags' in original_filename + if self.plugin is not None and (self.has_plugin_line_breaks or self.has_plugin_exception_breaks): + # If it's explicitly needed by some plugin, we can't skip it. + if not self.plugin.can_skip(self, frame): + if DEBUG: + pydev_log.debug_once("File traced (included by plugins): %s", original_filename) + self._apply_filter_cache[cache_key] = False + return False + + if self._exclude_filters_enabled: + absolute_filename = pydevd_file_utils.absolute_path(original_filename) + exclude_by_filter = self._exclude_by_filter(frame, absolute_filename) + if exclude_by_filter is not None: + if exclude_by_filter: + # ignore files matching stepping filters + if DEBUG: + pydev_log.debug_once("File not traced (excluded by filters): %s", original_filename) + + self._apply_filter_cache[cache_key] = True + return True + else: + if DEBUG: + pydev_log.debug_once("File traced (explicitly included by filters): %s", original_filename) + + self._apply_filter_cache[cache_key] = False + return False + + if (self._is_libraries_filter_enabled or force_check_project_scope) and not self.in_project_scope(frame): + # ignore library files while stepping + self._apply_filter_cache[cache_key] = True + if force_check_project_scope: + if DEBUG: + pydev_log.debug_once("File not traced (not in project): %s", original_filename) + else: + if DEBUG: + pydev_log.debug_once("File not traced (not in project - force_check_project_scope): %s", original_filename) + + return True + + if force_check_project_scope: + if DEBUG: + pydev_log.debug_once("File traced: %s (force_check_project_scope)", original_filename) + else: + if DEBUG: + pydev_log.debug_once("File traced: %s", original_filename) + self._apply_filter_cache[cache_key] = False + return False + + def exclude_exception_by_filter(self, exception_breakpoint, trace): + if not exception_breakpoint.ignore_libraries and not self._exclude_filters_enabled: + return False + + if trace is None: + return True + + ignore_libraries = exception_breakpoint.ignore_libraries + exclude_filters_enabled = self._exclude_filters_enabled + + if (ignore_libraries and not self.in_project_scope(trace.tb_frame)) or ( + exclude_filters_enabled + and self._exclude_by_filter(trace.tb_frame, pydevd_file_utils.absolute_path(trace.tb_frame.f_code.co_filename)) + ): + return True + + return False + + def set_project_roots(self, project_roots): + self._files_filtering.set_project_roots(project_roots) + self._clear_caches() + + def set_exclude_filters(self, exclude_filters): + self._files_filtering.set_exclude_filters(exclude_filters) + self._clear_caches() + + def set_use_libraries_filter(self, use_libraries_filter): + self._files_filtering.set_use_libraries_filter(use_libraries_filter) + self._clear_caches() + + def get_use_libraries_filter(self): + return self._files_filtering.use_libraries_filter() + + def get_require_module_for_filters(self): + return self._files_filtering.require_module + + def has_user_threads_alive(self): + for t in pydevd_utils.get_non_pydevd_threads(): + if isinstance(t, PyDBDaemonThread): + pydev_log.error_once("Error in debugger: Found PyDBDaemonThread not marked with is_pydev_daemon_thread=True.\n") + + if is_thread_alive(t): + if not t.daemon or hasattr(t, "__pydevd_main_thread"): + return True + + return False + + def initialize_network(self, sock, terminate_on_socket_close=True): + assert sock is not None + try: + sock.settimeout(None) # infinite, no timeouts from now on - jython does not have it + except: + pass + curr_reader = getattr(self, "reader", None) + curr_writer = getattr(self, "writer", None) + if curr_reader: + curr_reader.do_kill_pydev_thread() + if curr_writer: + curr_writer.do_kill_pydev_thread() + + self.writer = WriterThread(sock, self, terminate_on_socket_close=terminate_on_socket_close) + self.reader = ReaderThread( + sock, + self, + PyDevJsonCommandProcessor=PyDevJsonCommandProcessor, + process_net_command=process_net_command, + terminate_on_socket_close=terminate_on_socket_close, + ) + self.writer.start() + self.reader.start() + + time.sleep(0.1) # give threads time to start + + def connect(self, host, port): + if host: + s = start_client(host, port) + else: + s = start_server(port) + + self.initialize_network(s) + + def create_wait_for_connection_thread(self): + if self._waiting_for_connection_thread is not None: + raise AssertionError("There is already another thread waiting for a connection.") + + self._server_socket_ready_event.clear() + self._waiting_for_connection_thread = self._WaitForConnectionThread(self) + self._waiting_for_connection_thread.start() + + def set_server_socket_ready(self): + self._server_socket_ready_event.set() + + def wait_for_server_socket_ready(self): + self._server_socket_ready_event.wait() + + @property + def dap_messages_listeners(self): + return self._dap_messages_listeners + + def add_dap_messages_listener(self, listener): + self._dap_messages_listeners.append(listener) + + class _WaitForConnectionThread(PyDBDaemonThread): + + def __init__(self, py_db): + PyDBDaemonThread.__init__(self, py_db) + self._server_socket = None + + def run(self): + host = SetupHolder.setup["client"] + port = SetupHolder.setup["port"] + + self._server_socket = create_server_socket(host=host, port=port) + self.py_db._server_socket_name = self._server_socket.getsockname() + self.py_db.set_server_socket_ready() + + while not self._kill_received: + try: + s = self._server_socket + if s is None: + return + + s.listen(1) + new_socket, _addr = s.accept() + if self._kill_received: + pydev_log.info("Connection (from wait_for_attach) accepted but ignored as kill was already received.") + return + + pydev_log.info("Connection (from wait_for_attach) accepted.") + reader = getattr(self.py_db, "reader", None) + if reader is not None: + # This is needed if a new connection is done without the client properly + # sending a disconnect for the previous connection. + api = PyDevdAPI() + api.request_disconnect(self.py_db, resume_threads=False) + + self.py_db.initialize_network(new_socket, terminate_on_socket_close=False) + + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL > 0: + pydev_log.exception() + pydev_log.debug("Exiting _WaitForConnectionThread: %s\n", port) + + def do_kill_pydev_thread(self): + PyDBDaemonThread.do_kill_pydev_thread(self) + s = self._server_socket + if s is not None: + try: + s.close() + except: + pass + self._server_socket = None + + def get_internal_queue_and_event(self, thread_id) -> Tuple[_queue.Queue, ThreadingEvent]: + """returns internal command queue for a given thread. + if new queue is created, notify the RDB about it""" + if thread_id.startswith("__frame__"): + thread_id = thread_id[thread_id.rfind("|") + 1:] + return self._cmd_queue[thread_id], self._thread_events[thread_id] + + def post_method_as_internal_command(self, thread_id, method, *args, **kwargs): + if thread_id == "*": + internal_cmd = InternalThreadCommandForAnyThread(thread_id, method, *args, **kwargs) + else: + internal_cmd = InternalThreadCommand(thread_id, method, *args, **kwargs) + self.post_internal_command(internal_cmd, thread_id) + + def post_internal_command(self, int_cmd, thread_id): + """if thread_id is *, post to the '*' queue""" + queue, event = self.get_internal_queue_and_event(thread_id) + queue.put(int_cmd) + if thread_id == "*": + self._py_db_command_thread_event.set() + else: + event.set() + + def enable_output_redirection(self, redirect_stdout, redirect_stderr): + global _global_redirect_stdout_to_server + global _global_redirect_stderr_to_server + + _global_redirect_stdout_to_server = redirect_stdout + _global_redirect_stderr_to_server = redirect_stderr + self.redirect_output = redirect_stdout or redirect_stderr + if _global_redirect_stdout_to_server: + _init_stdout_redirect() + if _global_redirect_stderr_to_server: + _init_stderr_redirect() + + def check_output_redirect(self): + global _global_redirect_stdout_to_server + global _global_redirect_stderr_to_server + + if _global_redirect_stdout_to_server: + _init_stdout_redirect() + + if _global_redirect_stderr_to_server: + _init_stderr_redirect() + + def init_gui_support(self): + if self._installed_gui_support: + return + self._installed_gui_support = True + + # enable_gui and enable_gui_function in activate_matplotlib should be called in main thread. Unlike integrated console, + # in the debug console we have no interpreter instance with exec_queue, but we run this code in the main + # thread and can call it directly. + class _ReturnGuiLoopControlHelper: + _return_control_osc = False + + def return_control(): + # Some of the input hooks (e.g. Qt4Agg) check return control without doing + # a single operation, so we don't return True on every + # call when the debug hook is in place to allow the GUI to run + _ReturnGuiLoopControlHelper._return_control_osc = not _ReturnGuiLoopControlHelper._return_control_osc + return _ReturnGuiLoopControlHelper._return_control_osc + + from pydev_ipython.inputhook import set_return_control_callback, enable_gui + + set_return_control_callback(return_control) + + if self._gui_event_loop == "matplotlib": + # prepare debugger for matplotlib integration with GUI event loop + from pydev_ipython.matplotlibtools import activate_matplotlib, activate_pylab, activate_pyplot, do_enable_gui + + self.mpl_modules_for_patching = { + "matplotlib": lambda: activate_matplotlib(do_enable_gui), + "matplotlib.pyplot": activate_pyplot, + "pylab": activate_pylab, + } + else: + self.activate_gui_function = enable_gui + + def _activate_gui_if_needed(self): + if self.gui_in_use: + return + + if len(self.mpl_modules_for_patching) > 0: + if is_current_thread_main_thread(): # Note that we call only in the main thread. + for module in list(self.mpl_modules_for_patching): + if module in sys.modules: + activate_function = self.mpl_modules_for_patching.pop(module, None) + if activate_function is not None: + activate_function() + self.gui_in_use = True + + if self.activate_gui_function: + if is_current_thread_main_thread(): # Only call enable_gui in the main thread. + try: + # First try to activate builtin GUI event loops. + self.activate_gui_function(self._gui_event_loop) + self.activate_gui_function = None + self.gui_in_use = True + except ValueError: + # The user requested a custom GUI event loop, try to import it. + from pydev_ipython.inputhook import set_inputhook + + try: + inputhook_function = import_attr_from_module(self._gui_event_loop) + set_inputhook(inputhook_function) + self.gui_in_use = True + except Exception as e: + pydev_log.debug("Cannot activate custom GUI event loop {}: {}".format(self._gui_event_loop, e)) + finally: + self.activate_gui_function = None + + def _call_input_hook(self): + try: + from pydev_ipython.inputhook import get_inputhook + + inputhook = get_inputhook() + if inputhook: + inputhook() + except: + pass + + def notify_skipped_step_in_because_of_filters(self, frame): + self.writer.add_command(self.cmd_factory.make_skipped_step_in_because_of_filters(self, frame)) + + def notify_thread_created(self, thread_id, thread, use_lock=True): + if self.writer is None: + # Protect about threads being created before the communication structure is in place + # (note that they will appear later on anyways as pydevd does reconcile live/dead threads + # when processing internal commands, albeit it may take longer and in general this should + # not be usual as it's expected that the debugger is live before other threads are created). + return + + with self._lock_running_thread_ids if use_lock else NULL: + if not self._enable_thread_notifications: + return + + if thread_id in self._running_thread_ids: + return + + additional_info = set_additional_thread_info(thread) + if additional_info.pydev_notify_kill: + # After we notify it should be killed, make sure we don't notify it's alive (on a racing condition + # this could happen as we may notify before the thread is stopped internally). + return + + self._running_thread_ids[thread_id] = thread + + self.writer.add_command(self.cmd_factory.make_thread_created_message(thread)) + + def notify_thread_not_alive(self, thread_id, use_lock=True): + """if thread is not alive, cancel trace_dispatch processing""" + if self.writer is None: + return + + with self._lock_running_thread_ids if use_lock else NULL: + if not self._enable_thread_notifications: + return + + thread = self._running_thread_ids.pop(thread_id, None) + if thread is None: + return + + additional_info = set_additional_thread_info(thread) + was_notified = additional_info.pydev_notify_kill + if not was_notified: + additional_info.pydev_notify_kill = True + remove_additional_info(additional_info) + + self.writer.add_command(self.cmd_factory.make_thread_killed_message(thread_id)) + + def set_enable_thread_notifications(self, enable): + with self._lock_running_thread_ids: + if self._enable_thread_notifications != enable: + self._enable_thread_notifications = enable + + if enable: + # As it was previously disabled, we have to notify about existing threads again + # (so, clear the cache related to that). + self._running_thread_ids = {} + + def process_internal_commands(self, process_thread_ids: Optional[tuple]=None): + """ + This function processes internal commands. + """ + # If this method is being called before the debugger is ready to run we should not notify + # about threads and should only process commands sent to all threads. + ready_to_run = self.ready_to_run + + dispose = False + with self._main_lock: + program_threads_alive = {} + if ready_to_run: + self.check_output_redirect() + + all_threads = threadingEnumerate() + program_threads_dead = [] + with self._lock_running_thread_ids: + reset_cache = not self._running_thread_ids + + for t in all_threads: + if getattr(t, "is_pydev_daemon_thread", False): + pass # I.e.: skip the DummyThreads created from pydev daemon threads + elif isinstance(t, PyDBDaemonThread): + pydev_log.error_once("Error in debugger: Found PyDBDaemonThread not marked with is_pydev_daemon_thread=True.") + + elif is_thread_alive(t): + if reset_cache: + # Fix multiprocessing debug with breakpoints in both main and child processes + # (https://youtrack.jetbrains.com/issue/PY-17092) When the new process is created, the main + # thread in the new process already has the attribute 'pydevd_id', so the new thread doesn't + # get new id with its process number and the debugger loses access to both threads. + # Therefore we should update thread_id for every main thread in the new process. + clear_cached_thread_id(t) + + thread_id = get_thread_id(t) + program_threads_alive[thread_id] = t + + self.notify_thread_created(thread_id, t, use_lock=False) + + # Compute and notify about threads which are no longer alive. + thread_ids = list(self._running_thread_ids.keys()) + for thread_id in thread_ids: + if thread_id not in program_threads_alive: + program_threads_dead.append(thread_id) + + for thread_id in program_threads_dead: + self.notify_thread_not_alive(thread_id, use_lock=False) + + cmds_to_execute = [] + + # Without self._lock_running_thread_ids + if len(program_threads_alive) == 0 and ready_to_run: + dispose = True + else: + curr_thread_id = get_current_thread_id(threadingCurrentThread()) + if process_thread_ids is None: + # Actually process the commands now (make sure we don't have a lock for _lock_running_thread_ids + # acquired at this point as it could lead to a deadlock if some command evaluated tried to + # create a thread and wait for it -- which would try to notify about it getting that lock). + if ready_to_run: + process_thread_ids = (curr_thread_id, "*") + else: + process_thread_ids = ("*",) + + for thread_id in process_thread_ids: + queue, _event = self.get_internal_queue_and_event(thread_id) + + # some commands must be processed by the thread itself... if that's the case, + # we will re-add the commands to the queue after executing. + cmds_to_add_back = [] + + try: + while True: + internal_cmd = queue.get(False) + try: + if internal_cmd.can_be_executed_by(curr_thread_id): + cmds_to_execute.append(internal_cmd) + else: + pydev_log.verbose("NOT processing internal command: %s ", internal_cmd) + cmds_to_add_back.append(internal_cmd) + except: + pydev_log.exception() + raise + + except _queue.Empty: # @UndefinedVariable + # this is how we exit + for internal_cmd in cmds_to_add_back: + queue.put(internal_cmd) + + if dispose: + # Note: must be called without the main lock to avoid deadlocks. + self.dispose_and_kill_all_pydevd_threads() + else: + # Actually execute the commands without the main lock! + for internal_cmd in cmds_to_execute: + pydev_log.verbose("processing internal command: %s", internal_cmd) + try: + internal_cmd.do_it(self) + except: + pydev_log.exception("Error processing internal command.") + + def consolidate_breakpoints(self, canonical_normalized_filename, id_to_breakpoint, file_to_line_to_breakpoints): + break_dict = {} + for _breakpoint_id, pybreakpoint in id_to_breakpoint.items(): + break_dict[pybreakpoint.line] = pybreakpoint + + file_to_line_to_breakpoints[canonical_normalized_filename] = break_dict + self._clear_caches() + + def add_break_on_exception( + self, + exception, + condition, + expression, + notify_on_handled_exceptions, + notify_on_unhandled_exceptions, + notify_on_user_unhandled_exceptions, + notify_on_first_raise_only, + ignore_libraries=False, + ): + try: + eb = ExceptionBreakpoint( + exception, + condition, + expression, + notify_on_handled_exceptions, + notify_on_unhandled_exceptions, + notify_on_user_unhandled_exceptions, + notify_on_first_raise_only, + ignore_libraries, + ) + except ImportError: + pydev_log.critical("Error unable to add break on exception for: %s (exception could not be imported).", exception) + return None + + if eb.notify_on_unhandled_exceptions: + cp = self.break_on_uncaught_exceptions.copy() + cp[exception] = eb + pydev_log.info("Exceptions to hook on terminate: %s.", cp) + self.break_on_uncaught_exceptions = cp + + if eb.notify_on_handled_exceptions: + cp = self.break_on_caught_exceptions.copy() + cp[exception] = eb + pydev_log.info("Exceptions to hook always: %s.", cp) + self.break_on_caught_exceptions = cp + + if eb.notify_on_user_unhandled_exceptions: + cp = self.break_on_user_uncaught_exceptions.copy() + cp[exception] = eb + pydev_log.info("Exceptions to hook on user uncaught code: %s.", cp) + self.break_on_user_uncaught_exceptions = cp + + return eb + + def set_suspend( + self, + thread, + stop_reason: int, + suspend_other_threads: bool=False, + is_pause=False, + original_step_cmd: int=-1, + suspend_requested: bool=False, + ): + """ + :param thread: + The thread which should be suspended. + + :param stop_reason: + Reason why the thread was suspended. + + :param suspend_other_threads: + Whether to force other threads to be suspended (i.e.: when hitting a breakpoint + with a suspend all threads policy). + + :param is_pause: + If this is a pause to suspend all threads, any thread can be considered as the 'main' + thread paused. + + :param original_step_cmd: + If given we may change the stop reason to this. + + :param suspend_requested: + If the execution will be suspended right away then this may be false, otherwise, + if the thread should be stopped due to this suspend at a later time then it + should be true. + """ + self._threads_suspended_single_notification.increment_suspend_time() + if is_pause: + self._threads_suspended_single_notification.on_pause() + + info = mark_thread_suspended(thread, stop_reason, original_step_cmd=original_step_cmd) + + if (suspend_requested or is_pause) and PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.update_monitor_events(suspend_requested=True) + + if is_pause: + # Must set tracing after setting the state to suspend. + frame = info.get_topmost_frame(thread) + if frame is not None: + # Where suspend was requested + # traceback.print_stack(frame) + try: + self.set_trace_for_frame_and_parents(thread.ident, frame) + finally: + frame = None + + # If conditional breakpoint raises any exception during evaluation send the details to the client. + if stop_reason == CMD_SET_BREAK and info.conditional_breakpoint_exception is not None: + conditional_breakpoint_exception_tuple = info.conditional_breakpoint_exception + info.conditional_breakpoint_exception = None + self._send_breakpoint_condition_exception(thread, conditional_breakpoint_exception_tuple) + + if not suspend_other_threads and self.multi_threads_single_notification: + # In the mode which gives a single notification when all threads are + # stopped, stop all threads whenever a set_suspend is issued. + suspend_other_threads = True + + if suspend_other_threads: + # Suspend all except the current one (which we're currently suspending already). + suspend_all_threads(self, except_thread=thread) + + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.restart_events() + + def _send_breakpoint_condition_exception(self, thread, conditional_breakpoint_exception_tuple): + """If conditional breakpoint raises an exception during evaluation + send exception details to java + """ + thread_id = get_thread_id(thread) + # conditional_breakpoint_exception_tuple - should contain 2 values (exception_type, stacktrace) + if conditional_breakpoint_exception_tuple and len(conditional_breakpoint_exception_tuple) == 2: + exc_type, stacktrace = conditional_breakpoint_exception_tuple + int_cmd = InternalGetBreakpointException(thread_id, exc_type, stacktrace) + self.post_internal_command(int_cmd, thread_id) + + def send_caught_exception_stack(self, thread, arg, curr_frame_id): + """Sends details on the exception which was caught (and where we stopped) to the java side. + + arg is: exception type, description, traceback object + """ + thread_id = get_thread_id(thread) + int_cmd = InternalSendCurrExceptionTrace(thread_id, arg, curr_frame_id) + self.post_internal_command(int_cmd, thread_id) + + def send_caught_exception_stack_proceeded(self, thread): + """Sends that some thread was resumed and is no longer showing an exception trace.""" + thread_id = get_thread_id(thread) + int_cmd = InternalSendCurrExceptionTraceProceeded(thread_id) + self.post_internal_command(int_cmd, thread_id) + self.process_internal_commands() + + def send_process_created_message(self): + """Sends a message that a new process has been created.""" + if self.writer is None or self.cmd_factory is None: + return + cmd = self.cmd_factory.make_process_created_message() + self.writer.add_command(cmd) + + def send_process_about_to_be_replaced(self): + """Sends a message that a new process has been created.""" + if self.writer is None or self.cmd_factory is None: + return + cmd = self.cmd_factory.make_process_about_to_be_replaced_message() + if cmd is NULL_NET_COMMAND: + return + + sent = [False] + + def after_sent(*args, **kwargs): + sent[0] = True + + cmd.call_after_send(after_sent) + self.writer.add_command(cmd) + + timeout = 5 # Wait up to 5 seconds + initial_time = time.time() + while not sent[0]: + time.sleep(0.05) + + if (time.time() - initial_time) > timeout: + pydev_log.critical("pydevd: Sending message related to process being replaced timed-out after %s seconds", timeout) + break + + def set_next_statement(self, frame, event, func_name, next_line): + stop = False + response_msg = "" + old_line = frame.f_lineno + if event == "line" or event == "exception": + # If we're already in the correct context, we have to stop it now, because we can act only on + # line events -- if a return was the next statement it wouldn't work (so, we have this code + # repeated at pydevd_frame). + + curr_func_name = frame.f_code.co_name + + # global context is set with an empty name + if curr_func_name in ("?", ""): + curr_func_name = "" + + if func_name == "*" or curr_func_name == func_name: + line = next_line + frame.f_trace = self.trace_dispatch + frame.f_lineno = line + stop = True + else: + response_msg = "jump is available only within the bottom frame" + return stop, old_line, response_msg + + def cancel_async_evaluation(self, thread_id, frame_id): + with self._main_lock: + try: + all_threads = threadingEnumerate() + for t in all_threads: + if ( + getattr(t, "is_pydev_daemon_thread", False) + and hasattr(t, "cancel_event") + and t.thread_id == thread_id + and t.frame_id == frame_id + ): + t.cancel_event.set() + except: + pydev_log.exception() + + def find_frame(self, thread_id, frame_id): + """returns a frame on the thread that has a given frame_id""" + return self.suspended_frames_manager.find_frame(thread_id, frame_id) + + def do_wait_suspend(self, thread, frame, event, arg, exception_type=None): # @UnusedVariable + """busy waits until the thread state changes to RUN + it expects thread's state as attributes of the thread. + Upon running, processes any outstanding Stepping commands. + + :param exception_type: + If pausing due to an exception, its type. + """ + if USE_CUSTOM_SYS_CURRENT_FRAMES_MAP: + constructed_tid_to_last_frame[thread.ident] = sys._getframe() + + # Only process from all threads, not for current one (we'll do that later on in this method). + self.process_internal_commands(("*",)) + + thread_id = get_current_thread_id(thread) + + # if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 2: + # pydev_log.debug('do_wait_suspend %s %s %s %s %s %s (%s)' % (frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename, event, arg, constant_to_str(thread.additional_info.pydev_step_cmd), constant_to_str(thread.additional_info.pydev_original_step_cmd))) + # pydev_log.debug('--- internal stack ---') + # _f = sys._getframe() + # while _f is not None: + # pydev_log.debug(' -> %s' % (_f)) + # _f = _f.f_back + # pydev_log.debug('--- end internal stack ---') + + # Send the suspend message + message = thread.additional_info.pydev_message + trace_suspend_type = thread.additional_info.trace_suspend_type + thread.additional_info.trace_suspend_type = "trace" # Reset to trace mode for next call. + stop_reason = thread.stop_reason + + frames_list = None + + if arg is not None and event == "exception": + # arg must be the exception info (tuple(exc_type, exc, traceback)) + exc_type, exc_desc, trace_obj = arg + if trace_obj is not None: + frames_list = pydevd_frame_utils.create_frames_list_from_traceback( + trace_obj, frame, exc_type, exc_desc, exception_type=exception_type + ) + + if frames_list is None: + frames_list = pydevd_frame_utils.create_frames_list_from_frame(frame) + + if DebugInfoHolder.DEBUG_TRACE_LEVEL > 2: + pydev_log.debug( + "PyDB.do_wait_suspend\nname: %s (line: %s)\n file: %s\n event: %s\n arg: %s\n step: %s (original step: %s)\n thread: %s, thread id: %s, id(thread): %s", + frame.f_code.co_name, + frame.f_lineno, + frame.f_code.co_filename, + event, + arg, + constant_to_str(thread.additional_info.pydev_step_cmd), + constant_to_str(thread.additional_info.pydev_original_step_cmd), + thread, + thread_id, + id(thread), + ) + for f in frames_list: + pydev_log.debug(" Stack: %s, %s, %s", f.f_code.co_filename, f.f_code.co_name, f.f_lineno) + + with self.suspended_frames_manager.track_frames(self) as frames_tracker: + frames_tracker.track(thread_id, frames_list) + cmd = frames_tracker.create_thread_suspend_command( + thread_id, stop_reason, message, trace_suspend_type, thread, thread.additional_info + ) + self.writer.add_command(cmd) + + with CustomFramesContainer.custom_frames_lock: # @UndefinedVariable + from_this_thread = [] + + for frame_custom_thread_id, custom_frame in CustomFramesContainer.custom_frames.items(): + if custom_frame.thread_id == thread.ident: + frames_tracker.track( + thread_id, + pydevd_frame_utils.create_frames_list_from_frame(custom_frame.frame), + frame_custom_thread_id=frame_custom_thread_id, + ) + # print('Frame created as thread: %s' % (frame_custom_thread_id,)) + + self.writer.add_command( + self.cmd_factory.make_custom_frame_created_message(frame_custom_thread_id, custom_frame.name) + ) + + self.writer.add_command( + frames_tracker.create_thread_suspend_command( + frame_custom_thread_id, CMD_THREAD_SUSPEND, "", trace_suspend_type, thread, thread.additional_info + ) + ) + + from_this_thread.append(frame_custom_thread_id) + + with self._threads_suspended_single_notification.notify_thread_suspended(thread_id, thread, stop_reason): + keep_suspended = self._do_wait_suspend(thread, frame, event, arg, trace_suspend_type, from_this_thread, frames_tracker) + + frames_list = None + + if keep_suspended: + # This means that we should pause again after a set next statement. + self._threads_suspended_single_notification.increment_suspend_time() + self.do_wait_suspend(thread, frame, event, arg, exception_type) + if DebugInfoHolder.DEBUG_TRACE_LEVEL > 2: + pydev_log.debug("Leaving PyDB.do_wait_suspend: %s (%s) %s", thread, thread_id, id(thread)) + + def _do_wait_suspend(self, thread, frame, event, arg, trace_suspend_type, from_this_thread, frames_tracker): + info = thread.additional_info + try: + info.is_in_wait_loop = True + info.update_stepping_info() + info.step_in_initial_location = None + keep_suspended = False + + with self._main_lock: # Use lock to check if suspended state changed + activate_gui = info.pydev_state == STATE_SUSPEND and not self.pydb_disposed + + in_main_thread = is_current_thread_main_thread() + if activate_gui and in_main_thread: + # before every stop check if matplotlib modules were imported inside script code + # or some GUI event loop needs to be activated + self._activate_gui_if_needed() + + # self.process_internal_commands(): processes for all the threads + # and updates running threads. This was called once in `do_wait_suspend` + # At this point it's just processing for this thread. + # Note that clients may not post an actual event (for instance, it + # could just set the internal state and signal the event instead + # of posting a command to the queue). In any case, if an item is + # put in the queue, the event must be set too. + curr_thread_id = get_current_thread_id(threadingCurrentThread()) + queue, notify_event = self.get_internal_queue_and_event(curr_thread_id) + + wait_timeout = TIMEOUT_SLOW + while True: + with self._main_lock: # Use lock to check if suspended state changed + if info.pydev_state != STATE_SUSPEND or (self.pydb_disposed and not self.terminate_requested): + # Note: we can't exit here if terminate was requested while a breakpoint was hit. + break + + if in_main_thread and self.gui_in_use: + wait_timeout = TIMEOUT_FAST + # call input hooks if only GUI is in use + self._call_input_hook() + + # No longer process commands for '*' at this point, just the + # ones related to this thread. + try: + internal_cmd = queue.get(False) + except _queue.Empty: + pass + else: + if internal_cmd.can_be_executed_by(curr_thread_id): + pydev_log.verbose("processing internal command: %s", internal_cmd) + try: + internal_cmd.do_it(self) + except: + pydev_log.exception("Error processing internal command.") + else: + # This shouldn't really happen... + pydev_log.verbose("NOT processing internal command: %s ", internal_cmd) + queue.put(internal_cmd) + wait_timeout = TIMEOUT_FAST + + notify_event.wait(wait_timeout) + notify_event.clear() + + finally: + info.is_in_wait_loop = False + info.update_stepping_info() + + self.cancel_async_evaluation(get_current_thread_id(thread), str(id(frame))) + + # process any stepping instructions + if info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE): + info.step_in_initial_location = (frame, frame.f_lineno) + if frame.f_code.co_flags & 0x80: # CO_COROUTINE = 0x80 + # When in a coroutine we switch to CMD_STEP_INTO_COROUTINE. + info.pydev_step_cmd = CMD_STEP_INTO_COROUTINE + info.pydev_step_stop = frame + self.set_trace_for_frame_and_parents(thread.ident, frame) + else: + info.pydev_step_stop = None + self.set_trace_for_frame_and_parents(thread.ident, frame) + + elif info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE, CMD_SMART_STEP_INTO): + info.pydev_step_stop = frame + self.set_trace_for_frame_and_parents(thread.ident, frame) + + elif info.pydev_step_cmd == CMD_RUN_TO_LINE or info.pydev_step_cmd == CMD_SET_NEXT_STATEMENT: + info.pydev_step_stop = None + self.set_trace_for_frame_and_parents(thread.ident, frame) + stop = False + response_msg = "" + try: + stop, _old_line, response_msg = self.set_next_statement(frame, event, info.pydev_func_name, info.pydev_next_line) + except ValueError as e: + response_msg = "%s" % e + finally: + seq = info.pydev_message + cmd = self.cmd_factory.make_set_next_stmnt_status_message(seq, stop, response_msg) + self.writer.add_command(cmd) + info.pydev_message = "" + + if stop: + # Uninstall the current frames tracker before running it. + frames_tracker.untrack_all() + cmd = self.cmd_factory.make_thread_run_message(self, get_current_thread_id(thread), info.pydev_step_cmd) + self.writer.add_command(cmd) + info.pydev_state = STATE_SUSPEND + thread.stop_reason = CMD_SET_NEXT_STATEMENT + keep_suspended = True + + else: + # Set next did not work... + info.pydev_original_step_cmd = -1 + info.pydev_step_cmd = -1 + info.pydev_state = STATE_SUSPEND + thread.stop_reason = CMD_THREAD_SUSPEND + # return to the suspend state and wait for other command (without sending any + # additional notification to the client). + return self._do_wait_suspend(thread, frame, event, arg, trace_suspend_type, from_this_thread, frames_tracker) + + elif info.pydev_step_cmd in (CMD_STEP_RETURN, CMD_STEP_RETURN_MY_CODE): + back_frame = frame.f_back + force_check_project_scope = info.pydev_step_cmd == CMD_STEP_RETURN_MY_CODE + + if force_check_project_scope or self.is_files_filter_enabled: + while back_frame is not None: + if self.apply_files_filter(back_frame, back_frame.f_code.co_filename, force_check_project_scope): + frame = back_frame + back_frame = back_frame.f_back + else: + break + + if back_frame is not None: + # steps back to the same frame (in a return call it will stop in the 'back frame' for the user) + info.pydev_step_stop = frame + self.set_trace_for_frame_and_parents(thread.ident, frame) + else: + # No back frame?!? -- this happens in jython when we have some frame created from an awt event + # (the previous frame would be the awt event, but this doesn't make part of 'jython', only 'java') + # so, if we're doing a step return in this situation, it's the same as just making it run + info.pydev_step_stop = None + info.pydev_original_step_cmd = -1 + info.pydev_step_cmd = -1 + info.pydev_state = STATE_RUN + + if PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING: + info.pydev_use_scoped_step_frame = False + if info.pydev_step_cmd in (CMD_STEP_OVER, CMD_STEP_OVER_MY_CODE, CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE): + # i.e.: We're stepping: check if the stepping should be scoped (i.e.: in ipython + # each line is executed separately in a new frame, in which case we need to consider + # the next line as if it was still in the same frame). + f = frame.f_back + if f and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[1]: + f = f.f_back + if f and f.f_code.co_name == PYDEVD_IPYTHON_CONTEXT[2]: + info.pydev_use_scoped_step_frame = True + pydev_log.info("Using (ipython) scoped stepping.") + del f + + del frame + cmd = self.cmd_factory.make_thread_run_message(self, get_current_thread_id(thread), info.pydev_step_cmd) + self.writer.add_command(cmd) + + with CustomFramesContainer.custom_frames_lock: + # The ones that remained on last_running must now be removed. + for frame_id in from_this_thread: + # print('Removing created frame: %s' % (frame_id,)) + self.writer.add_command(self.cmd_factory.make_thread_killed_message(frame_id)) + + info.update_stepping_info() + return keep_suspended + + def do_stop_on_unhandled_exception(self, thread, frame, frames_byid, arg): + pydev_log.debug("We are stopping in unhandled exception.") + try: + add_exception_to_frame(frame, arg) + self.send_caught_exception_stack(thread, arg, id(frame)) + try: + self.set_suspend(thread, CMD_ADD_EXCEPTION_BREAK) + self.do_wait_suspend(thread, frame, "exception", arg, EXCEPTION_TYPE_UNHANDLED) + except: + self.send_caught_exception_stack_proceeded(thread) + except: + pydev_log.exception("We've got an error while stopping in unhandled exception: %s.", arg[0]) + finally: + remove_exception_from_frame(frame) + frame = None + + def set_trace_for_frame_and_parents(self, thread_ident: Optional[int], frame, **kwargs): + disable = kwargs.pop("disable", False) + assert not kwargs + + DEBUG = True # 'defaulttags' in frame.f_code.co_filename + + while frame is not None: + if not isinstance(frame, FrameType): + # This is the case for django/jinja frames. + frame = frame.f_back + continue + + # Don't change the tracing on debugger-related files + file_type = self.get_file_type(frame) + if PYDEVD_USE_SYS_MONITORING: + if file_type is None: + if disable: + if DEBUG: + pydev_log.debug("Disable tracing of frame: %s - %s", frame.f_code.co_filename, frame.f_code.co_name) + pydevd_sys_monitoring.disable_code_tracing(frame.f_code) + + else: + if DEBUG: + pydev_log.debug("Set tracing of frame: %s - %s", frame.f_code.co_filename, frame.f_code.co_name) + pydevd_sys_monitoring.enable_code_tracing(thread_ident, frame.f_code, frame) + else: + if DEBUG: + pydev_log.debug("SKIP set tracing of frame: %s - %s", frame.f_code.co_filename, frame.f_code.co_name) + else: + # Not using sys.monitoring. + if file_type is None: + if disable: + if DEBUG: + pydev_log.debug("Disable tracing of frame: %s - %s", frame.f_code.co_filename, frame.f_code.co_name) + if frame.f_trace is not None and frame.f_trace is not NO_FTRACE: + frame.f_trace = NO_FTRACE + + elif frame.f_trace is not self.trace_dispatch: + if DEBUG: + pydev_log.debug("Set tracing of frame: %s - %s", frame.f_code.co_filename, frame.f_code.co_name) + frame.f_trace = self.trace_dispatch + else: + if DEBUG: + pydev_log.debug("SKIP set tracing of frame: %s - %s", frame.f_code.co_filename, frame.f_code.co_name) + + frame = frame.f_back + + del frame + + def _create_pydb_command_thread(self): + curr_pydb_command_thread = self.py_db_command_thread + if curr_pydb_command_thread is not None: + curr_pydb_command_thread.do_kill_pydev_thread() + + new_pydb_command_thread = self.py_db_command_thread = PyDBCommandThread(self) + new_pydb_command_thread.start() + + def _create_check_output_thread(self): + curr_output_checker_thread = self.check_alive_thread + if curr_output_checker_thread is not None: + curr_output_checker_thread.do_kill_pydev_thread() + + check_alive_thread = self.check_alive_thread = CheckAliveThread(self) + check_alive_thread.start() + + def start_auxiliary_daemon_threads(self): + self._create_pydb_command_thread() + self._create_check_output_thread() + + def __wait_for_threads_to_finish(self, timeout): + try: + with self._wait_for_threads_to_finish_called_lock: + wait_for_threads_to_finish_called = self._wait_for_threads_to_finish_called + self._wait_for_threads_to_finish_called = True + + if wait_for_threads_to_finish_called: + # Make sure that we wait for the previous call to be finished. + self._wait_for_threads_to_finish_called_event.wait(timeout=timeout) + else: + try: + + def get_pydb_daemon_threads_to_wait(): + pydb_daemon_threads = set(self.created_pydb_daemon_threads) + pydb_daemon_threads.discard(self.check_alive_thread) + pydb_daemon_threads.discard(threading.current_thread()) + return pydb_daemon_threads + + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads waiting for pydb daemon threads to finish") + started_at = time.time() + # Note: we wait for all except the check_alive_thread (which is not really a daemon + # thread and it can call this method itself). + while time.time() < started_at + timeout: + if len(get_pydb_daemon_threads_to_wait()) == 0: + break + time.sleep(1 / 10.0) + else: + thread_names = [t.name for t in get_pydb_daemon_threads_to_wait()] + if thread_names: + pydev_log.debug("The following pydb threads may not have finished correctly: %s", ", ".join(thread_names)) + finally: + self._wait_for_threads_to_finish_called_event.set() + except: + pydev_log.exception() + + def dispose_and_kill_all_pydevd_threads(self, wait=True, timeout=0.5): + """ + When this method is called we finish the debug session, terminate threads + and if this was registered as the global instance, unregister it -- afterwards + it should be possible to create a new instance and set as global to start + a new debug session. + + :param bool wait: + If True we'll wait for the threads to be actually finished before proceeding + (based on the available timeout). + Note that this must be thread-safe and if one thread is waiting the other thread should + also wait. + """ + try: + back_frame = sys._getframe().f_back + pydev_log.debug( + 'PyDB.dispose_and_kill_all_pydevd_threads (called from: File "%s", line %s, in %s)', + back_frame.f_code.co_filename, + back_frame.f_lineno, + back_frame.f_code.co_name, + ) + back_frame = None + with self._disposed_lock: + disposed = self.pydb_disposed + self.pydb_disposed = True + + if disposed: + if wait: + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads (already disposed - wait)") + self.__wait_for_threads_to_finish(timeout) + else: + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads (already disposed - no wait)") + return + + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads (first call)") + + # Wait until a time when there are no commands being processed to kill the threads. + started_at = time.time() + while time.time() < started_at + timeout: + with self._main_lock: + writer = self.writer + if writer is None or writer.empty(): + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads no commands being processed.") + break + else: + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads timed out waiting for writer to be empty.") + + pydb_daemon_threads = set(self.created_pydb_daemon_threads) + for t in pydb_daemon_threads: + if hasattr(t, "do_kill_pydev_thread"): + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads killing thread: %s", t) + t.do_kill_pydev_thread() + + if wait: + self.__wait_for_threads_to_finish(timeout) + else: + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads: no wait") + + py_db = get_global_debugger() + if py_db is self: + set_global_debugger(None) + except: + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads: exception") + try: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 3: + pydev_log.exception() + except: + pass + finally: + pydev_log.debug("PyDB.dispose_and_kill_all_pydevd_threads: finished") + + def prepare_to_run(self): + """Shared code to prepare debugging by installing traces and registering threads""" + self.patch_threads() + self.start_auxiliary_daemon_threads() + + def patch_threads(self): + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.start_monitoring(all_threads=True) + else: + try: + # not available in jython! + threading.settrace(self.trace_dispatch) # for all future threads + except: + pass + + from _pydev_bundle.pydev_monkey import patch_thread_modules + + patch_thread_modules() + + def run(self, file, globals=None, locals=None, is_module=False, set_trace=True): + module_name = None + entry_point_fn = "" + if is_module: + # When launching with `python -m `, python automatically adds + # an empty path to the PYTHONPATH which resolves files in the current + # directory, so, depending how pydevd itself is launched, we may need + # to manually add such an entry to properly resolve modules in the + # current directory (see: https://github.com/Microsoft/ptvsd/issues/1010). + if "" not in sys.path: + sys.path.insert(0, "") + file, _, entry_point_fn = file.partition(":") + module_name = file + filename = get_fullname(file) + if filename is None: + mod_dir = get_package_dir(module_name) + if mod_dir is None: + sys.stderr.write("No module named %s\n" % file) + return + else: + filename = get_fullname("%s.__main__" % module_name) + if filename is None: + sys.stderr.write("No module named %s\n" % file) + return + else: + file = filename + else: + file = filename + mod_dir = os.path.dirname(filename) + main_py = os.path.join(mod_dir, "__main__.py") + main_pyc = os.path.join(mod_dir, "__main__.pyc") + if filename.endswith("__init__.pyc"): + if os.path.exists(main_pyc): + filename = main_pyc + elif os.path.exists(main_py): + filename = main_py + elif filename.endswith("__init__.py"): + if os.path.exists(main_pyc) and not os.path.exists(main_py): + filename = main_pyc + elif os.path.exists(main_py): + filename = main_py + + sys.argv[0] = filename + + if os.path.isdir(file): + new_target = os.path.join(file, "__main__.py") + if os.path.isfile(new_target): + file = new_target + + m = None + if globals is None: + m = save_main_module(file, "pydevd") + globals = m.__dict__ + try: + globals["__builtins__"] = __builtins__ + except NameError: + pass # Not there on Jython... + + if locals is None: + locals = globals + + # Predefined (writable) attributes: __name__ is the module's name; + # __doc__ is the module's documentation string, or None if unavailable; + # __file__ is the pathname of the file from which the module was loaded, + # if it was loaded from a file. The __file__ attribute is not present for + # C modules that are statically linked into the interpreter; for extension modules + # loaded dynamically from a shared library, it is the pathname of the shared library file. + + # I think this is an ugly hack, bug it works (seems to) for the bug that says that sys.path should be the same in + # debug and run. + if sys.path[0] != "" and m is not None and m.__file__.startswith(sys.path[0]): + # print >> sys.stderr, 'Deleting: ', sys.path[0] + del sys.path[0] + + if not is_module: + # now, the local directory has to be added to the pythonpath + # sys.path.insert(0, os.getcwd()) + # Changed: it's not the local directory, but the directory of the file launched + # The file being run must be in the pythonpath (even if it was not before) + sys.path.insert(0, os.path.split(os_path_abspath(file))[0]) + + if set_trace: + self.wait_for_ready_to_run() + + # call prepare_to_run when we already have all information about breakpoints + self.prepare_to_run() + + t = threadingCurrentThread() + thread_id = get_current_thread_id(t) + + if self.thread_analyser is not None: + wrap_threads() + self.thread_analyser.set_start_time(cur_time()) + send_concurrency_message("threading_event", 0, t.name, thread_id, "thread", "start", file, 1, None, parent=thread_id) + + if self.asyncio_analyser is not None: + # we don't have main thread in asyncio graph, so we should add a fake event + send_concurrency_message("asyncio_event", 0, "Task", "Task", "thread", "stop", file, 1, frame=None, parent=None) + + try: + if INTERACTIVE_MODE_AVAILABLE: + self.init_gui_support() + except: + pydev_log.exception("Matplotlib support in debugger failed") + + if hasattr(sys, "exc_clear"): + # we should clean exception information in Python 2, before user's code execution + sys.exc_clear() + + # Notify that the main thread is created. + self.notify_thread_created(thread_id, t) + + # Note: important: set the tracing right before calling _exec. + if set_trace: + self.enable_tracing() + + return self._exec(is_module, entry_point_fn, module_name, file, globals, locals) + + def _exec(self, is_module, entry_point_fn, module_name, file, globals, locals): + """ + This function should have frames tracked by unhandled exceptions (the `_exec` name is important). + """ + t = threading.current_thread() # Keep in 't' local variable to be accessed afterwards from frame.f_locals. + if not is_module: + globals = pydevd_runpy.run_path(file, globals, "__main__") + else: + # treat ':' as a separator between module and entry point function + # if there is no entry point we run we same as with -m switch. Otherwise we perform + # an import and execute the entry point + if entry_point_fn: + mod = __import__(module_name, level=0, fromlist=[entry_point_fn], globals=globals, locals=locals) + func = getattr(mod, entry_point_fn) + func() + else: + # Run with the -m switch + globals = pydevd_runpy._run_module_as_main(module_name, alter_argv=False) + return globals + + def wait_for_commands(self, globals): + self._activate_gui_if_needed() + + thread = threading.current_thread() + from _pydevd_bundle import pydevd_frame_utils + + frame = pydevd_frame_utils.Frame( + None, -1, pydevd_frame_utils.FCode("Console", os.path.abspath(os.path.dirname(__file__))), globals, globals + ) + thread_id = get_current_thread_id(thread) + self.add_fake_frame(thread_id, id(frame), frame) + + cmd = self.cmd_factory.make_show_console_message(self, thread_id, frame) + if self.writer is not None: + self.writer.add_command(cmd) + + while True: + if self.gui_in_use: + # call input hooks if only GUI is in use + self._call_input_hook() + self.process_internal_commands() + time.sleep(0.01) + + +class IDAPMessagesListener(object): + + def before_send(self, message_as_dict): + """ + Called just before a message is sent to the IDE. + + :type message_as_dict: dict + """ + + def after_receive(self, message_as_dict): + """ + Called just after a message is received from the IDE. + + :type message_as_dict: dict + """ + + +def add_dap_messages_listener(dap_messages_listener): + """ + Adds a listener for the DAP (debug adapter protocol) messages. + + :type dap_messages_listener: IDAPMessagesListener + + :note: messages from the xml backend are not notified through this API. + + :note: the notifications are sent from threads and they are not synchronized (so, + it's possible that a message is sent and received from different threads at the same time). + """ + py_db = get_global_debugger() + if py_db is None: + raise AssertionError("PyDB is still not setup.") + + py_db.add_dap_messages_listener(dap_messages_listener) + + +def send_json_message(msg): + """ + API to send some custom json message. + + :param dict|pydevd_schema.BaseSchema msg: + The custom message to be sent. + + :return bool: + True if the message was added to the queue to be sent and False otherwise. + """ + py_db = get_global_debugger() + if py_db is None: + return False + + writer = py_db.writer + if writer is None: + return False + + cmd = NetCommand(-1, 0, msg, is_json=True) + writer.add_command(cmd) + return True + + +def enable_qt_support(qt_support_mode): + from _pydev_bundle import pydev_monkey_qt + + pydev_monkey_qt.patch_qt(qt_support_mode) + + +def start_dump_threads_thread(filename_template, timeout, recurrent): + """ + Helper to dump threads after a timeout. + + :param filename_template: + A template filename, such as 'c:/temp/thread_dump_%s.txt', where the %s will + be replaced by the time for the dump. + :param timeout: + The timeout (in seconds) for the dump. + :param recurrent: + If True we'll keep on doing thread dumps. + """ + assert filename_template.count("%s") == 1, "Expected one %%s to appear in: %s" % (filename_template,) + + def _threads_on_timeout(): + try: + while True: + time.sleep(timeout) + filename = filename_template % (time.time(),) + try: + os.makedirs(os.path.dirname(filename)) + except Exception: + pass + with open(filename, "w") as stream: + dump_threads(stream) + if not recurrent: + return + except Exception: + pydev_log.exception() + + t = threading.Thread(target=_threads_on_timeout) + mark_as_pydevd_daemon_thread(t) + t.start() + + +def dump_threads(stream=None): + """ + Helper to dump thread info (default is printing to stderr). + """ + pydevd_utils.dump_threads(stream) + + +def usage(doExit=0): + sys.stdout.write("Usage:\n") + sys.stdout.write("pydevd.py --port N [(--client hostname) | --server] --file executable [file_options]\n") + if doExit: + sys.exit(0) + + +def _init_stdout_redirect(): + pydevd_io.redirect_stream_to_pydb_io_messages(std="stdout") + + +def _init_stderr_redirect(): + pydevd_io.redirect_stream_to_pydb_io_messages(std="stderr") + + +def _enable_attach( + address, + dont_trace_start_patterns=(), + dont_trace_end_patterns=(), + patch_multiprocessing=False, + access_token=None, + client_access_token=None, +): + """ + Starts accepting connections at the given host/port. The debugger will not be initialized nor + configured, it'll only start accepting connections (and will have the tracing setup in this + thread). + + Meant to be used with the DAP (Debug Adapter Protocol) with _wait_for_attach(). + + :param address: (host, port) + :type address: tuple(str, int) + """ + host = address[0] + port = int(address[1]) + + if SetupHolder.setup is not None: + if port != SetupHolder.setup["port"]: + raise AssertionError("Unable to listen in port: %s (already listening in port: %s)" % (port, SetupHolder.setup["port"])) + settrace( + host=host, + port=port, + suspend=False, + wait_for_ready_to_run=False, + block_until_connected=False, + dont_trace_start_patterns=dont_trace_start_patterns, + dont_trace_end_patterns=dont_trace_end_patterns, + patch_multiprocessing=patch_multiprocessing, + access_token=access_token, + client_access_token=client_access_token, + ) + + py_db = get_global_debugger() + py_db.wait_for_server_socket_ready() + return py_db._server_socket_name + + +def _wait_for_attach(cancel=None): + """ + Meant to be called after _enable_attach() -- the current thread will only unblock after a + connection is in place and the DAP (Debug Adapter Protocol) sends the ConfigurationDone + request. + """ + py_db = get_global_debugger() + if py_db is None: + raise AssertionError("Debugger still not created. Please use _enable_attach() before using _wait_for_attach().") + + py_db.block_until_configuration_done(cancel=cancel) + + +def _is_attached(): + """ + Can be called any time to check if the connection was established and the DAP (Debug Adapter Protocol) has sent + the ConfigurationDone request. + """ + py_db = get_global_debugger() + return (py_db is not None) and py_db.is_attached() + + +# ======================================================================================================================= +# settrace +# ======================================================================================================================= +def settrace( + host=None, + stdout_to_server=False, + stderr_to_server=False, + port=5678, + suspend=True, + trace_only_current_thread=False, + overwrite_prev_trace=False, # Deprecated + patch_multiprocessing=False, + stop_at_frame=None, + block_until_connected=True, + wait_for_ready_to_run=True, + dont_trace_start_patterns=(), + dont_trace_end_patterns=(), + access_token=None, + client_access_token=None, + notify_stdin=True, + protocol=None, + **kwargs, +): + """Sets the tracing function with the pydev debug function and initializes needed facilities. + + :param host: the user may specify another host, if the debug server is not in the same machine (default is the local + host) + + :param stdout_to_server: when this is true, the stdout is passed to the debug server + + :param stderr_to_server: when this is true, the stderr is passed to the debug server + so that they are printed in its console and not in this process console. + + :param port: specifies which port to use for communicating with the server (note that the server must be started + in the same port). @note: currently it's hard-coded at 5678 in the client + + :param suspend: whether a breakpoint should be emulated as soon as this function is called. + + :param trace_only_current_thread: determines if only the current thread will be traced or all current and future + threads will also have the tracing enabled. + + :param overwrite_prev_trace: deprecated + + :param patch_multiprocessing: if True we'll patch the functions which create new processes so that launched + processes are debugged. + + :param stop_at_frame: if passed it'll stop at the given frame, otherwise it'll stop in the function which + called this method. + + :param wait_for_ready_to_run: if True settrace will block until the ready_to_run flag is set to True, + otherwise, it'll set ready_to_run to True and this function won't block. + + Note that if wait_for_ready_to_run == False, there are no guarantees that the debugger is synchronized + with what's configured in the client (IDE), the only guarantee is that when leaving this function + the debugger will be already connected. + + :param dont_trace_start_patterns: if set, then any path that starts with one fo the patterns in the collection + will not be traced + + :param dont_trace_end_patterns: if set, then any path that ends with one fo the patterns in the collection + will not be traced + + :param access_token: token to be sent from the client (i.e.: IDE) to the debugger when a connection + is established (verified by the debugger). + + :param client_access_token: token to be sent from the debugger to the client (i.e.: IDE) when + a connection is established (verified by the client). + + :param notify_stdin: + If True sys.stdin will be patched to notify the client when a message is requested + from the IDE. This is done so that when reading the stdin the client is notified. + Clients may need this to know when something that is being written should be interpreted + as an input to the process or as a command to be evaluated. + Note that parallel-python has issues with this (because it tries to assert that sys.stdin + is of a given type instead of just checking that it has what it needs). + + :param protocol: + When using in Eclipse the protocol should not be passed, but when used in VSCode + or some other IDE/editor that accepts the Debug Adapter Protocol then 'dap' should + be passed. + """ + if protocol and protocol.lower() == "dap": + pydevd_defaults.PydevdCustomization.DEFAULT_PROTOCOL = pydevd_constants.HTTP_JSON_PROTOCOL + + stdout_to_server = stdout_to_server or kwargs.get("stdoutToServer", False) # Backward compatibility + stderr_to_server = stderr_to_server or kwargs.get("stderrToServer", False) # Backward compatibility + + # Internal use (may be used to set the setup info directly for subprocesess). + __setup_holder__ = kwargs.get("__setup_holder__") + + with _set_trace_lock: + _locked_settrace( + host, + stdout_to_server, + stderr_to_server, + port, + suspend, + trace_only_current_thread, + patch_multiprocessing, + stop_at_frame, + block_until_connected, + wait_for_ready_to_run, + dont_trace_start_patterns, + dont_trace_end_patterns, + access_token, + client_access_token, + __setup_holder__=__setup_holder__, + notify_stdin=notify_stdin, + ) + + +_set_trace_lock = ForkSafeLock() + + +def _locked_settrace( + host, + stdout_to_server, + stderr_to_server, + port, + suspend, + trace_only_current_thread, + patch_multiprocessing, + stop_at_frame, + block_until_connected, + wait_for_ready_to_run, + dont_trace_start_patterns, + dont_trace_end_patterns, + access_token, + client_access_token, + __setup_holder__, + notify_stdin, +): + if patch_multiprocessing: + try: + from _pydev_bundle import pydev_monkey + except: + pass + else: + pydev_monkey.patch_new_process_functions() + + if host is None: + from _pydev_bundle import pydev_localhost + + host = pydev_localhost.get_localhost() + + global _global_redirect_stdout_to_server + global _global_redirect_stderr_to_server + + py_db = get_global_debugger() + if __setup_holder__: + SetupHolder.setup = __setup_holder__ + if py_db is None: + py_db = PyDB() + pydevd_vm_type.setup_type() + + if SetupHolder.setup is None: + setup = { + "client": host, # dispatch expects client to be set to the host address when server is False + "server": False, + "port": int(port), + "multiprocess": patch_multiprocessing, + "skip-notify-stdin": not notify_stdin, + } + SetupHolder.setup = setup + + if access_token is not None: + py_db.authentication.access_token = access_token + SetupHolder.setup["access-token"] = access_token + if client_access_token is not None: + py_db.authentication.client_access_token = client_access_token + SetupHolder.setup["client-access-token"] = client_access_token + + if block_until_connected: + py_db.connect(host, port) # Note: connect can raise error. + else: + # Create a dummy writer and wait for the real connection. + py_db.writer = WriterThread(NULL, py_db, terminate_on_socket_close=False) + py_db.create_wait_for_connection_thread() + + if dont_trace_start_patterns or dont_trace_end_patterns: + PyDevdAPI().set_dont_trace_start_end_patterns(py_db, dont_trace_start_patterns, dont_trace_end_patterns) + + _global_redirect_stdout_to_server = stdout_to_server + _global_redirect_stderr_to_server = stderr_to_server + + if _global_redirect_stdout_to_server: + _init_stdout_redirect() + + if _global_redirect_stderr_to_server: + _init_stderr_redirect() + + if notify_stdin: + patch_stdin() + + t = threadingCurrentThread() + additional_info = set_additional_thread_info(t) + + if not wait_for_ready_to_run: + py_db.ready_to_run = True + + py_db.wait_for_ready_to_run() + py_db.start_auxiliary_daemon_threads() + + try: + if INTERACTIVE_MODE_AVAILABLE: + py_db.init_gui_support() + except: + pydev_log.exception("Matplotlib support in debugger failed") + + if trace_only_current_thread: + py_db.enable_tracing() + else: + # Trace future threads. + py_db.patch_threads() + + py_db.enable_tracing(py_db.trace_dispatch, apply_to_all_threads=True) + + # As this is the first connection, also set tracing for any untraced threads + py_db.set_tracing_for_untraced_contexts() + + py_db.set_trace_for_frame_and_parents(t.ident, get_frame().f_back) + + with CustomFramesContainer.custom_frames_lock: # @UndefinedVariable + for _frameId, custom_frame in CustomFramesContainer.custom_frames.items(): + py_db.set_trace_for_frame_and_parents(None, custom_frame.frame) + + else: + # ok, we're already in debug mode, with all set, so, let's just set the break + if access_token is not None: + py_db.authentication.access_token = access_token + if client_access_token is not None: + py_db.authentication.client_access_token = client_access_token + + t = threadingCurrentThread() + py_db.set_trace_for_frame_and_parents(t.ident, get_frame().f_back) + additional_info = set_additional_thread_info(t) + + if trace_only_current_thread: + py_db.enable_tracing() + else: + # Trace future threads. + py_db.patch_threads() + py_db.enable_tracing(py_db.trace_dispatch, apply_to_all_threads=True) + + # Suspend as the last thing after all tracing is in place. + if suspend: + additional_info.pydev_original_step_cmd = CMD_SET_BREAK + if stop_at_frame is not None: + # If the step was set we have to go to run state and + # set the proper frame for it to stop. + additional_info.pydev_state = STATE_RUN + additional_info.pydev_step_cmd = CMD_STEP_OVER + additional_info.pydev_step_stop = stop_at_frame + additional_info.suspend_type = PYTHON_SUSPEND + additional_info.update_stepping_info() + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.update_monitor_events(suspend_requested=True) + py_db.set_trace_for_frame_and_parents(t.ident, stop_at_frame) + else: + # Ask to break as soon as possible. + py_db.set_suspend(t, CMD_SET_BREAK, suspend_requested=True) + py_db.set_trace_for_frame_and_parents(t.ident, get_frame().f_back) + + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.restart_events() + + +def stoptrace(): + pydev_log.debug("pydevd.stoptrace()") + pydevd_tracing.restore_sys_set_trace_func() + if PYDEVD_USE_SYS_MONITORING: + pydevd_sys_monitoring.stop_monitoring(all_threads=True) + else: + sys.settrace(None) + try: + # not available in jython! + threading.settrace(None) # for all future threads + except: + pass + + from _pydev_bundle.pydev_monkey import undo_patch_thread_modules + + undo_patch_thread_modules() + + # Either or both standard streams can be closed at this point, + # in which case flush() will fail. + try: + sys.stdout.flush() + except: + pass + try: + sys.stderr.flush() + except: + pass + + py_db = get_global_debugger() + + if py_db is not None: + py_db.dispose_and_kill_all_pydevd_threads() + + +class Dispatcher(object): + + def __init__(self): + self.port = None + + def connect(self, host, port): + self.host = host + self.port = port + self.client = start_client(self.host, self.port) + self.reader = DispatchReader(self) + self.reader.pydev_do_not_trace = False # we run reader in the same thread so we don't want to loose tracing + self.reader.run() + + def close(self): + try: + self.reader.do_kill_pydev_thread() + except: + pass + + +class DispatchReader(ReaderThread): + + def __init__(self, dispatcher): + self.dispatcher = dispatcher + + ReaderThread.__init__( + self, + get_global_debugger(), + self.dispatcher.client, + PyDevJsonCommandProcessor=PyDevJsonCommandProcessor, + process_net_command=process_net_command, + ) + + @overrides(ReaderThread._on_run) + def _on_run(self): + dummy_thread = threading.current_thread() + dummy_thread.is_pydev_daemon_thread = False + return ReaderThread._on_run(self) + + @overrides(PyDBDaemonThread.do_kill_pydev_thread) + def do_kill_pydev_thread(self): + if not self._kill_received: + ReaderThread.do_kill_pydev_thread(self) + try: + self.sock.shutdown(SHUT_RDWR) + except: + pass + try: + self.sock.close() + except: + pass + + def process_command(self, cmd_id, seq, text): + if cmd_id == 99: + self.dispatcher.port = int(text) + self._kill_received = True + + +DISPATCH_APPROACH_NEW_CONNECTION = 1 # Used by PyDev +DISPATCH_APPROACH_EXISTING_CONNECTION = 2 # Used by PyCharm +DISPATCH_APPROACH = DISPATCH_APPROACH_NEW_CONNECTION + + +def dispatch(): + setup = SetupHolder.setup + host = setup["client"] + port = setup["port"] + if DISPATCH_APPROACH == DISPATCH_APPROACH_EXISTING_CONNECTION: + dispatcher = Dispatcher() + try: + dispatcher.connect(host, port) + port = dispatcher.port + finally: + dispatcher.close() + return host, port + + +def settrace_forked(setup_tracing=True): + """ + When creating a fork from a process in the debugger, we need to reset the whole debugger environment! + """ + from _pydevd_bundle.pydevd_constants import GlobalDebuggerHolder + + py_db = GlobalDebuggerHolder.global_dbg + if py_db is not None: + py_db.created_pydb_daemon_threads = {} # Just making sure we won't touch those (paused) threads. + py_db = None + + GlobalDebuggerHolder.global_dbg = None + threading.current_thread().additional_info = None + + # Make sure that we keep the same access tokens for subprocesses started through fork. + setup = SetupHolder.setup + if setup is None: + setup = {} + else: + # i.e.: Get the ppid at this point as it just changed. + # If we later do an exec() it should remain the same ppid. + setup[pydevd_constants.ARGUMENT_PPID] = PyDevdAPI().get_ppid() + access_token = setup.get("access-token") + client_access_token = setup.get("client-access-token") + + if setup_tracing: + from _pydevd_frame_eval.pydevd_frame_eval_main import clear_thread_local_info + + host, port = dispatch() + + import pydevd_tracing + + pydevd_tracing.restore_sys_set_trace_func() + + if setup_tracing: + if port is not None: + custom_frames_container_init() + + if clear_thread_local_info is not None: + clear_thread_local_info() + + settrace( + host, + port=port, + suspend=False, + trace_only_current_thread=False, + overwrite_prev_trace=True, + patch_multiprocessing=True, + access_token=access_token, + client_access_token=client_access_token, + ) + + +@contextmanager +def skip_subprocess_arg_patch(): + """ + May be used to skip the monkey-patching that pydevd does to + skip changing arguments to embed the debugger into child processes. + + i.e.: + + with pydevd.skip_subprocess_arg_patch(): + subprocess.call(...) + """ + from _pydev_bundle import pydev_monkey + + with pydev_monkey.skip_subprocess_arg_patch(): + yield + + +def add_dont_terminate_child_pid(pid): + """ + May be used to ask pydevd to skip the termination of some process + when it's asked to terminate (debug adapter protocol only). + + :param int pid: + The pid to be ignored. + + i.e.: + + process = subprocess.Popen(...) + pydevd.add_dont_terminate_child_pid(process.pid) + """ + py_db = get_global_debugger() + if py_db is not None: + py_db.dont_terminate_child_pids.add(pid) + + +class SetupHolder: + setup = None + + +def apply_debugger_options(setup_options): + """ + + :type setup_options: dict[str, bool] + """ + default_options = {"save-signatures": False, "qt-support": ""} + default_options.update(setup_options) + setup_options = default_options + + debugger = get_global_debugger() + if setup_options["save-signatures"]: + if pydevd_vm_type.get_vm_type() == pydevd_vm_type.PydevdVmType.JYTHON: + sys.stderr.write("Collecting run-time type information is not supported for Jython\n") + else: + # Only import it if we're going to use it! + from _pydevd_bundle.pydevd_signature import SignatureFactory + + debugger.signature_factory = SignatureFactory() + + if setup_options["qt-support"]: + enable_qt_support(setup_options["qt-support"]) + + +@call_only_once +def patch_stdin(): + _internal_patch_stdin(None, sys, getpass_mod) + + +def _internal_patch_stdin(py_db=None, sys=None, getpass_mod=None): + """ + Note: don't use this function directly, use `patch_stdin()` instead. + (this function is only meant to be used on test-cases to avoid patching the actual globals). + """ + # Patch stdin so that we notify when readline() is called. + original_sys_stdin = sys.stdin + debug_console_stdin = DebugConsoleStdIn(py_db, original_sys_stdin) + sys.stdin = debug_console_stdin + + _original_getpass = getpass_mod.getpass + + @functools.wraps(_original_getpass) + def getpass(*args, **kwargs): + with DebugConsoleStdIn.notify_input_requested(debug_console_stdin): + try: + curr_stdin = sys.stdin + if curr_stdin is debug_console_stdin: + sys.stdin = original_sys_stdin + return _original_getpass(*args, **kwargs) + finally: + sys.stdin = curr_stdin + + getpass_mod.getpass = getpass + +# Dispatch on_debugger_modules_loaded here, after all primary py_db modules are loaded + + +for handler in pydevd_extension_utils.extensions_of_type(DebuggerEventHandler): + handler.on_debugger_modules_loaded(debugger_version=__version__) + + +def log_to(log_file: str, log_level=3) -> None: + """ + In pydevd it's possible to log by setting the following environment variables: + + PYDEVD_DEBUG=1 (sets the default log level to 3 along with other default options) + PYDEVD_DEBUG_FILE= + + Note that the file will have the pid of the process added to it (so, logging to + /path/to/file.log would actually start logging to /path/to/file..log -- if subprocesses are + logged, each new subprocess will have the logging set to its own pid). + + Usually setting the environment variable is preferred as it'd log information while + pydevd is still doing its imports and not just after this method is called, but on + cases where this is hard to do this function may be called to set the tracing after + pydevd itself is already imported. + """ + pydev_log.log_to(log_file, log_level) + + +def _log_initial_info(): + pydev_log.debug("Initial arguments: %s", (sys.argv,)) + pydev_log.debug("Current pid: %s", os.getpid()) + pydev_log.debug("Using cython: %s", USING_CYTHON) + pydev_log.debug("Using frame eval: %s", USING_FRAME_EVAL) + pydev_log.debug("Using gevent mode: %s / imported gevent module support: %s", SUPPORT_GEVENT, bool(pydevd_gevent_integration)) + + +def config(protocol="", debug_mode="", preimport=""): + pydev_log.debug("Config: protocol: %s, debug_mode: %s, preimport: %s", protocol, debug_mode, preimport) + PydevdCustomization.DEFAULT_PROTOCOL = protocol + PydevdCustomization.DEBUG_MODE = debug_mode + PydevdCustomization.PREIMPORT = preimport + + +# ======================================================================================================================= +# main +# ======================================================================================================================= +def main(): + # parse the command line. --file is our last argument that is required + _log_initial_info() + original_argv = sys.argv[:] + try: + from _pydevd_bundle.pydevd_command_line_handling import process_command_line + + setup = process_command_line(sys.argv) + SetupHolder.setup = setup + except ValueError: + pydev_log.exception() + usage(1) + + preimport = setup.get("preimport") + if preimport: + pydevd_defaults.PydevdCustomization.PREIMPORT = preimport + + debug_mode = setup.get("debug-mode") + if debug_mode: + pydevd_defaults.PydevdCustomization.DEBUG_MODE = debug_mode + + log_trace_level = setup.get("log-level") + + # Note: the logging info could've been changed (this would happen if this is a + # subprocess and the value in the environment variable does not match the value in the + # argument because the user used `pydevd.log_to` instead of supplying the environment + # variable). If this is the case, update the logging info and re-log some information + # in the new target. + new_debug_file = setup.get("log-file") + if new_debug_file and DebugInfoHolder.PYDEVD_DEBUG_FILE != new_debug_file: + # The debug file can't be set directly, we need to use log_to() so that the a + # new stream is actually created for the new file. + log_to(new_debug_file, log_trace_level if log_trace_level is not None else 3) + _log_initial_info() # The redirection info just changed, log it again. + + elif log_trace_level is not None: + # The log file was not specified + DebugInfoHolder.DEBUG_TRACE_LEVEL = log_trace_level + pydev_log.debug("Original sys.argv: %s", original_argv) + + if setup["print-in-debugger-startup"]: + try: + pid = " (pid: %s)" % os.getpid() + except: + pid = "" + sys.stderr.write("pydev debugger: starting%s\n" % pid) + + pydev_log.debug("Executing file %s", setup["file"]) + pydev_log.debug("arguments: %s", (sys.argv,)) + + pydevd_vm_type.setup_type(setup.get("vm_type", None)) + + port = setup["port"] + host = setup["client"] + f = setup["file"] + fix_app_engine_debug = False + + debugger = get_global_debugger() + if debugger is None: + debugger = PyDB() + + try: + from _pydev_bundle import pydev_monkey + except: + pass # Not usable on jython 2.1 + else: + if setup["multiprocess"]: # PyDev + pydev_monkey.patch_new_process_functions() + + elif setup["multiproc"]: # PyCharm + pydev_log.debug("Started in multiproc mode\n") + global DISPATCH_APPROACH + DISPATCH_APPROACH = DISPATCH_APPROACH_EXISTING_CONNECTION + + dispatcher = Dispatcher() + try: + dispatcher.connect(host, port) + if dispatcher.port is not None: + port = dispatcher.port + pydev_log.debug("Received port %d\n", port) + pydev_log.info("pydev debugger: process %d is connecting\n" % os.getpid()) + + try: + pydev_monkey.patch_new_process_functions() + except: + pydev_log.exception("Error patching process functions.") + else: + pydev_log.critical("pydev debugger: couldn't get port for new debug process.") + finally: + dispatcher.close() + else: + try: + pydev_monkey.patch_new_process_functions_with_warning() + except: + pydev_log.exception("Error patching process functions.") + + # Only do this patching if we're not running with multiprocess turned on. + if f.find("dev_appserver.py") != -1: + if os.path.basename(f).startswith("dev_appserver.py"): + appserver_dir = os.path.dirname(f) + version_file = os.path.join(appserver_dir, "VERSION") + if os.path.exists(version_file): + try: + stream = open(version_file, "r") + try: + for line in stream.read().splitlines(): + line = line.strip() + if line.startswith("release:"): + line = line[8:].strip() + version = line.replace('"', "") + version = version.split(".") + if int(version[0]) > 1: + fix_app_engine_debug = True + + elif int(version[0]) == 1: + if int(version[1]) >= 7: + # Only fix from 1.7 onwards + fix_app_engine_debug = True + break + finally: + stream.close() + except: + pydev_log.exception() + + try: + # In the default run (i.e.: run directly on debug mode), we try to patch stackless as soon as possible + # on a run where we have a remote debug, we may have to be more careful because patching stackless means + # that if the user already had a stackless.set_schedule_callback installed, he'd loose it and would need + # to call it again (because stackless provides no way of getting the last function which was registered + # in set_schedule_callback). + # + # So, ideally, if there's an application using stackless and the application wants to use the remote debugger + # and benefit from stackless debugging, the application itself must call: + # + # import pydevd_stackless + # pydevd_stackless.patch_stackless() + # + # itself to be able to benefit from seeing the tasklets created before the remote debugger is attached. + from _pydevd_bundle import pydevd_stackless + + pydevd_stackless.patch_stackless() + except: + # It's ok not having stackless there... + try: + if hasattr(sys, "exc_clear"): + sys.exc_clear() # the exception information should be cleaned in Python 2 + except: + pass + + is_module = setup["module"] + if not setup["skip-notify-stdin"]: + patch_stdin() + + if setup[pydevd_constants.ARGUMENT_JSON_PROTOCOL]: + PyDevdAPI().set_protocol(debugger, 0, JSON_PROTOCOL) + + elif setup[pydevd_constants.ARGUMENT_HTTP_JSON_PROTOCOL]: + PyDevdAPI().set_protocol(debugger, 0, HTTP_JSON_PROTOCOL) + + elif setup[pydevd_constants.ARGUMENT_HTTP_PROTOCOL]: + PyDevdAPI().set_protocol(debugger, 0, pydevd_constants.HTTP_PROTOCOL) + + elif setup[pydevd_constants.ARGUMENT_QUOTED_LINE_PROTOCOL]: + PyDevdAPI().set_protocol(debugger, 0, pydevd_constants.QUOTED_LINE_PROTOCOL) + + access_token = setup["access-token"] + if access_token: + debugger.authentication.access_token = access_token + + client_access_token = setup["client-access-token"] + if client_access_token: + debugger.authentication.client_access_token = client_access_token + + if fix_app_engine_debug: + sys.stderr.write("pydev debugger: google app engine integration enabled\n") + curr_dir = os.path.dirname(__file__) + app_engine_startup_file = os.path.join(curr_dir, "pydev_app_engine_debug_startup.py") + + sys.argv.insert(1, "--python_startup_script=" + app_engine_startup_file) + import json + + setup["pydevd"] = __file__ + sys.argv.insert( + 2, + "--python_startup_args=%s" % json.dumps(setup), + ) + sys.argv.insert(3, "--automatic_restart=no") + sys.argv.insert(4, "--max_module_instances=1") + + # Run the dev_appserver + debugger.run(setup["file"], None, None, is_module, set_trace=False) + else: + if setup["save-threading"]: + debugger.thread_analyser = ThreadingLogger() + if setup["save-asyncio"]: + debugger.asyncio_analyser = AsyncioLogger() + + apply_debugger_options(setup) + + try: + debugger.connect(host, port) + except: + sys.stderr.write("Could not connect to %s: %s\n" % (host, port)) + pydev_log.exception() + sys.exit(1) + + globals = debugger.run(setup["file"], None, None, is_module) + + if setup["cmd-line"]: + debugger.wait_for_commands(globals) + + +try: + # Remove the entry we added: it should no longer be needed as + # what we need should've been imported already + if sys.path[:1] == [this_dir]: + sys.path.remove(this_dir) +except Exception: + pass + +if __name__ == "__main__": + main() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/README.txt b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/README.txt new file mode 100644 index 0000000..6bf2f03 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/README.txt @@ -0,0 +1,27 @@ +This folder contains the utilities to attach a target process to the pydev debugger. + +The main module to be called for the attach is: + +attach_pydevd.py + +it should be called as; + +python attach_pydevd.py --port 5678 --pid 1234 + +Note that the client is responsible for having a remote debugger alive in the given port for the attach to work. + + +The binaries are now compiled at: +- https://github.com/fabioz/PyDev.Debugger.binaries/actions +(after generation the binaries are copied to this repo) + + +To copy: +cd /D X:\PyDev.Debugger +"C:\Program Files\7-Zip\7z" e C:\Users\fabio\Downloads\win_binaries.zip -oX:\PyDev.Debugger\pydevd_attach_to_process * -r -y +"C:\Program Files\7-Zip\7z" e C:\Users\fabio\Downloads\linux_binaries.zip -oX:\PyDev.Debugger\pydevd_attach_to_process * -r -y +"C:\Program Files\7-Zip\7z" e C:\Users\fabio\Downloads\mac_binaries.zip -oX:\PyDev.Debugger\pydevd_attach_to_process * -r -y +git add *.exe +git add *.dll +git add *.dylib +git add *.so diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_always_live_program.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_always_live_program.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d5504222d0a3700197f26a4695dd1794d64570d GIT binary patch literal 1770 zcmbtU&u<$=6nJp?KO2VYie&)}@RURyKc z6k8zqz`;flNyQ;X9N>yliT?vGHMJD8=^=;%$}MefIWc2ryGn@!h?Vxex9`n+@0+*Z z%rD7g9K`c;<&)x15r9ABNASc>jpJz%*#Qg~xsV%altU395gZ{a9->d?lA=noG#%uI8pi|d2*hk=!bo71-UzHv zCJZio0TK8dN`hf8J~$F0<4O=ck8LGAh=v+R|8;gE%nGbJe~y9&D<^0!tNIFeD#VX5mynttWew)5jN@vZ`?34f;Ue^@TW9N8MCJKl@-WPv zd}mfXZWhds8KKO4k8tA6-k}b5%sYgYd9`NNXthN6ZI3x(h-RfhybaTJ@@B2U*Q?&r z;AY>S1G|_DJC0%vTV-n!n(z)mMC2yjG310-nSdf za-9t#okeO_7HbVZu2we*2D)mFCRo%r_B=J*pW zA4nI<5!}0q1Xx5Hb^wqWD*afA;m`31aH_xsR%kot* zIML8Y&X7-ZOqQ3tr}6@)lEd_6DW325M7vd~;<`)Tp&1d7FxgWfj-m*meTeTv@^^?m zQZIDV-_LwI(^IeZVSXRohFeGevjFwsr*;p!eN^kAV6<}($c%u@}J z+A2Tz;PFeDo|@^yn+MTEyZLMMmERP-J-_X2=Xab3&Nt;={BmEJ8)$m#w&0M^?Ry=y zjb0?v;BRC);}K*UB#bugEN|cY>g|CszIC^Ach8va8PnahzH#}Cr*F(0r3Lej#z46= G9LZlW?q4wg literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_check.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_check.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32266ef19fbedd0d76b9b5aa62e74f62eb3dc15a GIT binary patch literal 430 zcmYLFF-yZh6uvWUtU`5h5T^YhafB|= z5&~=z^(qVEKk_AR@ycU$WR<%SE)k;)JN9=moQC&n2wknDG8B5ZB^;xQRtIW?4Y^dA}Z9dmwK%41)#{> zV44v+1i=#t+)z0T7eGC&J=UFDEj<#-y1@F)G@I29A$x%6Lc_J+8u8R9QJ6n?S* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_test_attach_to_process.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_test_attach_to_process.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4215a0d37511147e8eaab73f5b20df1619bd7f0 GIT binary patch literal 832 zcmZuvJ#W)M7`}_`#BvphuO=xI5)4!*IX(tdgpew#3W`8oV2BVW$M@pewa=FClHy2+ zc0ldO1}w0G`UhAM3m*e1t<=h0ikR3cbz|b(#>xQiaL@bk-19y@`CGMWAr)W42kr%o z(678G!WYW;6C!-%^l7 zGIF9I(-)+SC##tyx*gSYK!{8esmP2t@wm(^cmhsW+MNLME!+-)(#)8TV&EB$v#Kqn z?JUqZWzb`pp4-Sy4V9=9g`v%vGQvU0$|Td2flObrJ^3CTC&g3N*h zer6`|m`7$nEXpV*O3ep3&4s62kT3<_BZ1c;aVi%gex-HkG7+AHW^6l)whMwV=ycsU zCA0^eMF}uP&Fu|=4n4~#f1Lc236&t^zkT&+f6VJ)#JU08NXC`j{NEDK)UmH&jCaxT zU1a@4#0Q0C zr`MM6ZtJxTy*8*%y?DA^pW3KTeYpDZ=4brf_+osT8_Yi(JYs`uuvve+rMo-2u{ygl P`~24a7}8HCCzXf4J4@Q) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_test_attach_to_process_linux.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/_test_attach_to_process_linux.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34421354f59146019df3186875ae347bb81f6b8f GIT binary patch literal 3348 zcmcgvPf#1z8Q*_G(n{DED>2Z-yaFi#ODtdt4z-0lG(2IJ){+@-R-^= zL7E&yCmlb=r$O(v0Qx#WOwSRAt;l$EUtsST=F-q?cqz z()Ydhe((3bfA5p@kIqh>BG2FR?`K$|{nHtEPsfq+e3zrBeF{=33eu2K=@jisCdIgt zO|h=zQXC3Eb~{c{w;8h!vAL*6<;&b@U-z_EAkTQ~zC_`N^x+6{51B(P#WNIPc-=>N z8sa@P?I8YNYj_wq=8lFbm%Y#9^d*Y=>;yyS-tgBv4R+-EJ>8cNkJPX2?}9;p{0eIa zeGX59A#WFER;XXmuZ+dX{+|@%a^WBhSF@4CA9*Z_b`r$GslPlWyd=+$HZ+U&5G=A=#ewS3E6u#nXK0 zRZglO_2=gNc~66{LB^|H;?K#L*T0G(-ke;y-{2wYhv)v>^N>9}IrV+QbF!buF(LNE za*Lj&zVv*esUlNk1}U1_q;Au{`O_}DNqtO@^hqC(i_WiS6%6t^ET{+&Emy!6*wRg4 zA#5pH2FSW5Bg4XDVA%pVs~1!V(g+|^!UzIYvXBXMZH(s^cMW7Jd8Ao*mgfZlWMCR3 z4KVfg4`-aAEU7Ahs%{`HJ|JZEJQB8~w4#@U1%$UP-4Gz!5!Q+eXlHBzr3;x1G6kbZ zCZQ-;b`6+jA4Bs0VYSjauzP;<3ke(Fpx#6st@=}?l?Ze zyLP&UeRpQ%^O6xCPk`y^naKp00H1(K@}44U0$cCrKsr8DGLaW z|AL`Ffv{lT{BJ$36Q5l2!w1!GjO-Uq9p1DDK~mGPC7G5J3;cDATV- z8d=ci+>04^?wDbcsrZKjau&(k6VBsm9}bL=YdJnL{DKCV!{+qt9lL97bA4&`=JM*| z&H2@Z<(oHb{%~e(ZhdKegt1wq?brd5R8{@L`DHRPXa_|R>M|)M9v9L_eZXdM5!;N8 zZO$US$Ei0>$|C~e49UvcTuxUsI|voinRb?))R5({TaF@Gumf_|5fQA5sxC{GqHA`C ziSqgmvN?&knpMq8FrBPs+ibVoT z7rz(snkC4>&oMHwa2*jAuwW`sIqsn(E;(e)X;>ll2>BwRCcQFE8mX1lwTojDlL97{ zl{6%ITgo6znl5RzMo|!Vh($WNghxI1)vZ@_z8e0wC6n7gS~9r?FG80OzfZ236U1mI zd-z}Ev(3^p{Uvjj=AMsIboWz=e@ca)QjuqDq*7|Iy{)e9{otM8e)LZC;JtercQ@{d zcf|)EG~S&4JlN>^ae2ALMa$Q2E$uB;Hk;hJR(EWF_|EWt;!fhASRegSqx*9C-8RDp zI$NPL6{Z%hhHqbJhR(M;s6ec|a%**OwI17e9Q)`|?4w3ZY;wPN!iDSn`6k!jigeay zsx!5#)vNVBvl+p44%Z{tKkvQTMs=emR>gzOM(1#oixbjtZ-svx>Uk9EIT*Y*c6aQ- zPDS#@<3Jv~y z<@pvNy0Leo9zB1bYjSTL4J$u67;-`q?y2%02XiX{T7$hgM=&qmZ&E!$)@;_NK2HW7bV6H3SyTeNIdA>r6?jm zOuN1f89O7X>8+?H9?QL%F;nNxsCPP3ySJUhPTVHGow*Bvil{X`qfF(w_00W2TW;;@ zW~TT1&SC+OrmQBty({tT+4DZ%Ip=#H{12zoM#1xb?Ci*s=P2qQ@I!yhxyXH$rl_kF zPYqH$%^RZhAWhzeK?8Xk2aV*-3^L?x8Z?o&dC&}RW7HC32U%LHYaO(bJlmknN(uHs zyTJ11m#8;$T@AVf(^#oKfWn)%jJHzMp!*@Y>;-Dj^N>6%sae9?UZMs|`5NB-5k3FX{Su8Q|S?P~Zcfv+0DEgFUL!P>Y}D1lfF#8|-tu_}le z`BErb%a=h|$CpD`FEsEKI0~^1#<;&QD?P?n@`hS!uu*7~tOiQp_^LMn;`q?iw1KY{ z8hN?~zDOG^l&I6;h57JZFEkd{m^N&r1ji;ybkUT7I!y7*OB8PsoNpRQqtu}NJoU=o zOi>q&=cy^$TNgSBo50qYn3xtLBcpOVcSsCH;#1Sysl>266%qyRsLY4_HrvriScpqP zJJ)^UsNZ&=__5gr65_bT4JSlyAQI;jQxZ2c%}q*?_y`w@bHYU-JSm5Uq5>z6hUAuL zl#9g2gs{woI37Oa1VkppL|Bj{D9>}@5Tu5<;mLSdjwIsHdw)WPu195gLTV2LMk4a) zFcpc1CMNiy5iTM@#{$odO-eGh%nPz0#v*Zniwr~eFocjeBFOpv zpnTg74o1FvCpQ$4CFra$o1>BVCxg@BY3E(ieUIMl|0Mq~i+SGK{mM*M=mor{IWu>!z_3>Sx}^%RuCi3#DrNFRs;u*&kh3L@T4dT zaXC88@d-hSx5(TSY*6fz7ltNBxS`2Nl$UfEXw3(CugzvV4v-MJNNgf1#GnOzjeQ)P zkB}6R1>AJn(jGo>lysZh@d1E5?3GsNMB6p62%)HyKp;rCZxC3pd~w|OJ|E=4q$Wp3 zIcY)&M}{L|*!pnV_{i|EfP+Vv03;BE`BS1DByFj}30~l);2>}bGG=*H6hbg5Nlr{m z2)q{o0qdrpM_3*)5ekpuHj5>oqi6*7Ff8Ga5DsA{FkBs2k|4yiqZ5kaIhhbd044TC zCVWC$jyCN;VXtJ*6}B&|hi|>JI+93?M1=sNn)ryIL9t^31|@J8cKAu#$K%iwfn*@p z4P@k6gM$xCl}JP-SOi{xCAwHxja)ltcNDJ)N1AILn#9dCF_92un0(|S%o=tMz#2Eh z2#m$6^*t$aiK#d&66C>|kHET(3ZV-T7!qthKv5x4<`TmIDh(AqWI%yaiAgambSC1m zn1}|VAz6^*joNeqCq&q@VHsxEg}rykGR%MVmp?o)K?VdHCUHR!VaExagaKJIZBODj zLZmVRACV@Uia5r}@X7Hi;5u!^itsSZM_)z_@TUa8uUdnof57*!o!hyS0@;p$nsK>d zLr#U_xNTr;+SZ(y6a^ow3!YF7pn|9^t&Xh$s}4h9@0-jCT@f=}ziM*!$MO^&6nm(V+;WfS}`8A);P zMf42Np%5F>S{@^Vwb@R=+5@tLwH2apQd>uaxFEvO#8r<2*37LWY+2Z9ytln@UT|9E ztcVGuw*;IWq8tfFVRk!rZ+|?1;}d)Xp=k*rstwb39yYMA6OI8u4^lgz6F`eT*t@U~ zbR;R}cZS~K8q%z-^l)erFdYmvDu{)F#RYySB*V#%@`6Z)B?}kj0HK7wJl!9aW6||d zNpAlD;Bs3jFceJ;1!5rysC^D~ApO)Rgg*?FWm*bKf=qhw{yQ2C3$U-S!4uQn5DT6X zRI!HD#Ql`@hjcgH$2wamyC@`Evq>LKVwT-(FktShd zNb)2fNdVu48&=}Bx525+u|=)0zW_zVCL&QG2+jCm8KC*1;~$)u=7kHqe_|RBxrP#Q zWEj%(XPji_k&d<=I#cDheT>{@zn4~BaHMc)W1%=4DKV^Zp<0+@bgBCe_`XUB6bKj8 zpkbQ!8dS&WNK8mf%H4Rl`@Ke$4F=<(m=FxAwqQ_OR){--!RKJcTF#HC``GY<*8{P* z90&)_NP;K@dVm3pb6sMDj|92|X&mTd0EpU{Aa}$G7Z!+33-Jp;zlU;rsm;HAM*xYv z4~Wxv4if;fo|p~XAeEs+M#bnf9W#8#95bd3 zAZZ!XM)+f7D^|oOMae|Y!}yy9457!86gB45;>97)yqW7a4bnpjmLp|MF)8XzMl1Cl z%bZ0jm)&}uF^?WAymk5HMH=OgS@W!A*ua}!0$ESaOLw|7k~UefACq3^j}2F8lv`4U zIg36LkaJ-2YtwWI=D!+2im~*II5F5Ij!xi5WT6|DN$ya~20{_JCn25!+!+;)4!1;~Df3`cFibiO z!VwH26E6GrM-w2wNC*8v;JwH|`olS}lZFwLW$<@DnQJ~p&wvn}rsFO-zvuvZLlU-y z4umuSbIv%&q-cE!(}t9RH(sDbdYXZli3o`Fv{}}NPmSdkjr5uebU?odKuhk-6Cxx= z?ZDoIfbY}JT|08ik^rZdmsS;vV*CI4{J%bLq$2+aaj${E{^J=)J{^G_NcF%v7=du8 z=CC|HAxJ8VfWUL?HK~jwM2A&Nt{2rP3bN>es;Y@Vj~oRU%*>2v$JEj(SivCBbPc$O z!IOLbEim_gx#9>kC_N3q7cmX*7`16?v!r6E-VaW zOLxt7F1brDM>6ilrK-B6lJa@eAJ*Tks=rrRe>HI>k*#b|JT2tFdg*>IBjOY67{+|8^~Fon=LWa6Rl@@fkm9we)v&iT;nokawjKU) zL5vI0wjCm#V66u{k*X~M5;yQq@vxwphNgk-RLw#hk&sx4C9ANIIYEwrmsJ_WnpzvA zx&v@D;L;#6IkM`E#3OP9KA}ONsW_IR$>3md({S8VPiZSv@}*S~w?Lsm_>(R|@Gt*} zaQ|P-K!zE(TUI@Dbg8^%=Gd~m;xhk(?nQg^lDq8EH|M@NzbEV7ILq8|RL_^srxu=l zt1Ij1nCZS__bj{0FD2#@Sy!XNHh#`{Os#*^^BD!Nl}$!d-5poe%i}lMnqRYJm%DGV zwO`EH$@@3b2I%~yj*W*b^gFHAj&|yu?N*Gp+YT|tcNrtZRTF_LP#segxn9*wUOQAX z9}*!e3@zjz-2V7?e+L9tslt&RD?a48;ykS%VBUZS^c3Kzew9A)F~Se}GfT1v(tyeW z#t2K1q#z>N)>fbFe|JOzdW^hsaQ9ANq{YV}|M%ff!WEsNmhB~%o}7DfzAbBSyuLkS z-=r{`NcAv|QGc*eGUj(-lfszwbZWgZk0CW$^E{#k?)o*4j58#U4gvk0Hm0bVx&loS z?Q)(H72x$EU7#{L(n?dj0VrFZnu!OC#VA}C2iu_v^l;{uGMRaTCTMycdLw8 zhCI1k8|2z^b?b_HbjWxN$TL>1#|m$KRydv%GuBkd(PR2tc;^NBGA&-P7VrFKy;R|y zGU{{eqApp&h7l@kcot4T+LE%2Z7!74W4uc*FVU}5K$#Xjr|?c0ipsR4ELRM#Y-Ol4 z3vJS3d5TUkNK#V<4AWL1p&s&GoN9}Ec-QK3e95YB8&9R}DQgP!%3@Q|URmdKkNFB? z(__FdS#@Zp?eV`XTEERH+rOh#TT!d8$bo!+tPT^tl&}Dsey1_Bd>L-fqCN&wY|+ZW z?jb9;-l~{1h^NfjdpN&JBK=AOStSlu$&t1cjoPth)Eocbj5=kXsVv&{G`8A|Q?W;v6G|s0e(U>x&opD3ToOY&YX;cd%9ox{< zdB8}Tt)kGjcSC>j;PJfJt0|~K*ahw$HB(?>Ao6NX(GOHJj#4lvK69#8f%mJFT6yB+ z@y_m3r;eWtcAV@y(tEmlVE4|p9qXibo<4K3JL#VQ^$KvJF@FqHc3@Cw^@6rm)4%{1 zJ1NFF5Y{1qi0u9cj32~n)f9^HyLYO_i+gt`jeaSSH2e8!5H(dZqySBS@YosD+JmaD zAZsUdIU0Fzz1Mbbv*b02y8%ez9t`$EpfZuRy}QY`YRSo<$uh!ggR&5`W}q|TBVs$3 zV`+k_GgpdmIKhu`{Rsb_-28}fgv9V@JC}5Gt@@;gLF>RJ860HN;PofXXNbWkX~Pt) z_ygLX^gg2D!UU7H?%X0mM>d3ra1kcq_tvO}grqVPA$e4_zG*w z%|P#|;6QJG*YSZK&n4-->@s9F%TFbvfOyfNsMQ8TWxpcv3%R-$7X0@Z@LPR5Pe;h9ehME9gzY<_1&17hkO=TceKN0yR1?&_uL4YR#V<#n@GkUZwBA6d1;hSiB~Qj){O`dmpEhSjCGp7`ri zKY8ZuXBOE$5LND4?B7nlko^6WQrC6U(zQ}@}&+g~5ee0@}jh_}8j{o!e)T%PTQ;1dVsC|#;=zJB`Jv4!4D{jS+# zOU`MbEUSXX^K2sqHtqGR=G6+LvkWQXGwU z%c^GCC42RJcgEhdTvc;*>dMsB)Rolro`qxCs`j}fA2}>q2e(wQ zVXo(H#fI6QU%M+la@V|icB!WMiuuEmnx&f7E9Q?p6+f5$F7<9osXVjjISX?8y|Rj{ zd#>!cy8p`l>*hc2dAsMGUZu4^TXuYwy=Qk`+B3K3(!sfd^R0{ajUPg9t%_^sBD)J$ z*j_es{9itmXsTk8{$j;ov{u6ye{@zU-L>f0z3iyC?P!E`S#&hrDXaR;r(3D&Nm@ee z{PRs!N86~MKT&zq&%9S!g5f3x!&U>N|Dt-sv3lkgdl(4+-fx1Gzi-=gti~8FR@R_| zL*%vZfGmc3z7&0dmMncB|LBzQMewfRsVIeV$XKzg2UYRW%k2U>3?3Bv)l?8cz zY|^;|)FATaC=)ZKO%Nyl3V8)dEk(7z%UlV_2yO|u1Ai?^mIFtRIo{iHy@J76= zn8zz{Y-4$eN^gy##u^K8J*Kw^{pO`5kU;VrG#L?MWb&j~-pzaRT2E`rD%s_{6vUV4 z@Bpc|sE(eRwxw*V%9rXnP`)thG8q*vb9|4~L zG`e%h?*i-o+$8$ppaB}J~pkC7}SOTnXv1K$GlBf(Jsmz-=So=duCQ)|xs zr65H}?cB#4RyKLT^~9&zHTNsD{{@qbAN&H6-JOZas3y!1zFub-In3pd)x(~0Zd*`~ z@c6|40Mm0uFMo2+Lz}@mq!|SfE{|nULxQb1p)_7p&Z;D zH2WH;Mxj&;yw-vuZv5nquN=d=-K(X=P$!m%V6tJ&kkIW2mFeiS1^`8!d2)NsOvwpo z-)JXtXKv`R&@{2mkA^O27S|{kB6)wZ5hvOM+I49Zq*Vlq23275ab`Aeoyvma9r|)e zU_M1Fc`*O&kce-R#;>c+-WWQy3}~g*l7gWiw;YFjLKge6AZVv~Fu{UM5uKDq)h1%(ni9bnUum1Dj)qz`23Q8%9ujgYYytlpCgM15bePco6;mh}A%|p14#a zEV*jWDZml-YBgA-aO($kUy~q8TL3H7ErDBzmK==4K~P6^2LXU;(feU=+9Ei+Qff&~ ziYYk7sJ2`ZtO*KQ0REanN)R_(VXtX6orj4@Ram%a*a$gvixj^LUDLq)NWVu!r6s%T z@;LD83Uf-?cq$8_z3IN0GL_%8mfW^-87r5yHh)4HO#UU-bDM3*unqI0f6<_@4U6oP zAF{sBO_22&OF1epkNt<`eC41>@dtJs} zm$f&{bS>32Uf*%8U16&Ksg$x+zg?zOAN;8yYwi4mYBn_jBYg8~XBMB0Elnifd|-y|~QUFWKg7x7q3pTfNBE-gEjFzWG*X*7?*Y)COzgGS{Z;Jn{>laz2>l zeot{U+$r0%T-mH_9LrXYE1vOtHQN+lN4DnBY~P)-29onkw(?oU^Xx~ClAnuzH}%fc z?ZX3^!vo5>p<9Q;H-%B9G_vRzTXwiF_09F&cGPDa^^1-TOXZt?C@r-8my0)Qm9qV_ zUCWNj+m5D;qv`slMMnz&#JgYFe?mDqs*Fu!Tc1-Lo9~ouBi#*TE6*vOb03v7zYQQi zlr8C8p;%|jPbWY0RQ&zP|2go>f!oKP%^Z7H`Nq_(V;65G(@N#H7Cp}|d&;ibuGnsS zxQvHe^fWJ3dw<-vAicR)+10O99ly*hdunfcHfKDWuk(wZ$G}W@yDE^W3fwR(R<$jc z*C@5e7R&pW%d4*TUFo}BzA00_X|a6E=OxhfXQh<0R4LuL=-9P(nx7v4n0{`BC0RK_ zQx50nF&fsJ?1u-RpQfQQ8T^CKy-;oi7vMor=?79D?6&J0`pS*(mUUSB_8EUx-)Zmj znf|ur&|`f~mS2``hmZG-EabdjZtB}$dB4fjx7Ggs77M2POntkp@9(f+?mpAg22kQd zbNYh<1+r%M{ji(YxFZ;1hO`mf5g6k5ZPbN{g77eg4j*ftH*?=XnmLaI4O{D=?|Nhy$un6LD8qmA1-VflXetp|ypN8G{f zFv4#G|G#aV=4ya^$27P(#lTAz*aFfL5J&Lj1usEx#seAzs?N~_dbk3yn*j6(4qt-i z=BN8f*fl?iW7vY~I4sCV!E;JO*htraH7V~tc@kBlM^AQlbe#`&pX)t!`qb(Ewpl;2-&uYxw-~Nv~BzQNNqOv)v$4h7!#g!lr z(Qt`qG9tlKh^A-Zix{pycTlDibcQ+pA+!HpS=H5jSN47H2{2;YTz5Qm^Ig|BE!eW2 zwpr7ivc~TnR5tI+larCx4(#l7OD?CzCPFlT?jI@h;kzu2+&PzC+Y6U-r&dgnWJdx$PxW#IJj$%Xzpkl;Fua?Oq$61F>~4sazI|LU+)l%<$ZXd_1v?bMG>q$g?84l zjed1*$}m=~w_bRU7*m#D{)j%J1xqmBKhJ>nATPs%KNP38nb%wx`lwa1cV0um6NEu@ zFL^Je^-F?`Pf*M_KwGK>U5!Og0ZEZ9l4J92L%J2D?c88q1nmJ27Q*#PBI-hSpd`#b z4IW+VT2S+{yhLULc3>;-NZWX4+K$LG1-EZfHu!^kE-A1Ofi)(l|4D-^og#N-BtyzE z*};AR6@QHXmE*GjbY?c4*}dmqpZ$bkO}&&Q|>{1~aNS{p1DOppUc)*HFY zV6vkp1Y;$x*g498xRBSREEqXXjBC|=u-dsV&DjgGRM(f9xBx&v-}0|&Y89-!es8(z zUW2{GKY_t(c>ens`vC@s=fzhsKzyJwVdS&TG3i2Bl)(Zc#A4v~4dQX|LIOnJ3Dtb6 zcd$En8ql>kqB)XTz%>bDMH0K66p-ic8~jL%swPswc zGl%c7u1oGY_p?N+@Jq)*LGLb`IgDOanmnK| zUd8TRw!3D(nYGu=hi=*%6{bUJ>c~Q9Z@i~xj4aUC#&6oapHP(PkUNdXcg;U`eQMDW_`p%}YX{KiTaG5AsfTZ|^Hp|yzaiTD z7rUCf_t8J!T+_Xc`uUTt?ndf8CkyfSDy@+IUZbtsYkbdZ#FTBe?%l@sb{ipmmG<5a z3yo~+{Xd3t{4ni(!Ea2*|HPw6lJVG+XFd1LF^isCct4^Basg|eg7<=sb@g}JROCLo z4wDX^x&%#86!?aib6!0#OVs0oH;x(nJS=H*5pxZG6F}vF6$UDj_bmqc`PH*r$A<8T z8tZs^rSkphW9CiBC#G561eDRtgJprY^0tCqp`fMa?IV`7t*Fm+IGC}#KUV>~yn}b@ zJjED#eXe=(Yi&>2#c#;yR7oD7$mo6IF7~KM+19f=@Sc&pPa#-#>|;%O8-;hlp3p@R zpDUp6UpX4bL;5O3>d%7@NpYX(a}~E2jlE2VFN|mXF_#zDe@K~%e?yr{@YDjHg|AAn zSSB`;>?dw#hAzDh5vKa2-#45({th!G)!W z?87TMzMTI3KnoP$LX&WhNlL)*eQ+@Y7@Xmj2lTe&2H)DUM5zhI#E>}6CC@yvcVzys zgH|aV((d2k-DRx-yg&#-uzpcTnvM;@g_+Q+O(7t z9jA{xu%Fa!D559R1DZSiBk;Ed9XK$7MsUmVRub*8_!KN8(HDz{FxH7d7X~LV_!a~z zE5TJ`yi_DUk7+X)9LC@X1kk1|Mka_Z8$E5ngNBDRtN|=%VqzMU%83c_43>WZgBKwH zj*&2ngl+s!nED48dRYhe2aqlpl&E6DSE z0i1teU;Pa<@-RkGtyrr!CZ0OtFQLxMKzJo1(9IcYJ+1M*l1=nx;Wml`N zR9$Vn()h#DH>zH*dZY36#=oe}HnnF+4$=&Ssl;{>rm!e$yY8E1q4m zCI~)s)qZNGN~-R7DuBUsy6zjzZrciFw%UL<1(%YMDh-DHEqgL8 zd)~5TTRO9qT|fO=rtz=lR2zS%@2@1Kx=X3*zUAoo z#Ds-FL5v^xUVh;Svr$GZ%vRgvI{hffd*UYTa_@FFqgunZDA^2VV{6PZ&z9u@&NE;sE zF}e;nTJX_+WbJi0(?V^@B_khA9v-eb6;npglo+&|6i&^J5zMSX@Zd{=U38TZ6OaoC zi-1`HApns82TF4henAwVvS5{sp&Ow%0G|ZE!1W~}*P*|iU8}2k(dkDYg+4s`62cl( zhnj0#DcVhgT9@$a3D~8mK!Jb2gL?`ha9g9Y8qd(x=#}X8JqyR*`g*pqcjkC5RXbVN zpU+nAfwUsuq`;zm>$0m>sXOpfcc$)m)^$Q*Pu#WFDom|*)q{b?^#|2sWDD#BRPkF1 zANB(C&*zyaVAk{PkKw*s^Ng*tj9(ToK(NRw?oy!H*O}zB8JKa)2*sQKltz927%B~|3Za#$lvlI4@e$`sc{yn5UC+`|5aPL$@n{1EOi>5fK$_<{E-TqP9nnk(!<3KVV(rYD`i6DE8ZMJ6p- z;`3>z#1{?4M<(H#t!mbEYsq?Ff@{%@A~`OUu#enkz9m_QxjF7Gcee2tJHX%zyojN> zC0T<72nhy)8${%gYXh@^Q-NY-#XZ1J#DGV4OR^agwK3@pCZs30gyaVg-iX|~-PKtXg>)5(*>ZapywXG}T=u!9g zywBb|`RvVLTyZ1{q;$oTFW$7|cznfVL>h}~veN%p8mr+{080Kr{D*kyKDyi&U-{!7 zp~%p&9648pesLev_ZqbY?}xb9iwOqtWq7IPaq#jOk;pw!ou;_gESR_iC0pQBNvI+L zg2FoUj>)&!zAq0Q5jG(QNm$(9X6VIQf6&z%(v+O1_G6$2U;7kE+6b;S5BQXVF?S@d zkx7Fc0T4e`pz+{2x}Ls?`mwnH#DdPO*cAI)wvi_=>shz>Jdy?3p8hJ-uURD?RYtc( zc&+_OS5EvP9%3Lt-?inCRzliF%%ouCotA9m#y~6J9PrWsfw|S|wQU?06L2w`{E`Uj z^mFyJUy878)ZVR{Tyg-UAFrR>OKA1l;3r%3pH1Kn9N=2umlM!WD%hg^0t)=168LqU z7AJE*#)HTL4W)i!V{P^C(ta2RlVNDkD!K#ti3dzK8+gA)W2Q$<4Sv6%X(>z^%u<=(1N7I`2cfAo%}!*i&W zdbhRoP`h!}Pe9rhCleBZC1^s)~??TLVpPI z(>KM2IB-7Db_o2C75uW;s-Jj+n@K(&E<4=4?(g>+dNj7ANwoxnd?FkSYPaK`!ddw- zcmV@~pK()xbDH)OCMdn*5)iB{B1f-zBv|`F7SMbr2=U*7Io%i>#o!nQk7FQU@Ldd& z7@$Fji1r$5fOJ^f&v!9~ASAyjKwQx-Xh0{d0y5kLM1-h6VE1dkhH_B+7%~9OQ_@ig zSBx}Ge_}X9)6D&T14X+&psXKI&JU=P4=CFQl>I|$^9Pjs1In|)m}uuxS>w#n6&Gdj zd}83}y8A|mtzc}Who)R5m!6q>W_}>!+%#hY<-?`@bNiJ#zhd{#uuE3QrTV%0`Ra_d zX~z7inWi`2XQybo{Jw15Pdit>1wZEjZC2#lgxJdCB+XAZRiQPuW_!^w&F-J+x?^|WK@!<_i+vg{bX=C_JFZOKv~RfM@O-!D*ACC+^6&Polu%6V x7c0-ZDYoQO%1ApuV`!7}a_XNccmdl%J0B2g`)7vED(Yudp3betpLuBr|1X(-FzWyS literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/attach_pydevd.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/__pycache__/attach_pydevd.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67a85c53cb00a5fd3f489a9d415b3fe81798ebb0 GIT binary patch literal 3492 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." + # based on the way it's currently compiled -- see: + # - windows/compile_windows.bat + # - linux_and_mac/compile_linux.sh + # - linux_and_mac/compile_mac.sh + + try: + found = [name for name in os.listdir(libdir) if name.startswith("attach_") and name.endswith(extension)] + except: + print("Error listing dir: %s" % (libdir,)) + traceback.print_exc() + return None + + if prefix: + expected_name = prefix + arch + extension + expected_name_linux = prefix + "linux_" + arch + extension + else: + # Default is looking for the attach_ / attach_linux + expected_name = "attach_" + arch + extension + expected_name_linux = "attach_linux_" + arch + extension + + filename = None + if expected_name in found: # Heuristic: user compiled with "attach_." + filename = os.path.join(libdir, expected_name) + + elif IS_LINUX and expected_name_linux in found: # Heuristic: user compiled with "attach_linux_." + filename = os.path.join(libdir, expected_name_linux) + + elif len(found) == 1: # Heuristic: user removed all libraries and just left his own lib. + filename = os.path.join(libdir, found[0]) + + else: # Heuristic: there's one additional library which doesn't seem to be our own. Find the odd one. + filtered = [name for name in found if not name.endswith((suffix_64 + extension, suffix_32 + extension))] + if len(filtered) == 1: # If more than one is available we can't be sure... + filename = os.path.join(libdir, found[0]) + + if filename is None: + print("Unable to attach to process in arch: %s (did not find %s in %s)." % (arch, expected_name, libdir)) + return None + + print("Using %s in arch: %s." % (filename, arch)) + + else: + if is_target_process_64: + suffix = suffix_64 + else: + suffix = suffix_32 + + if not prefix: + # Default is looking for the attach_ / attach_linux + if IS_WINDOWS or IS_MAC: # just the extension changes + prefix = "attach_" + elif IS_LINUX: + prefix = "attach_linux_" # historically it has a different name + else: + print("Unable to attach to process in platform: %s" % (sys.platform,)) + return None + + filename = os.path.join(libdir, "%s%s%s" % (prefix, suffix, extension)) + + if not os.path.exists(filename): + print("Expected: %s to exist." % (filename,)) + return None + + return filename + + +def run_python_code_windows(pid, python_code, connect_debugger_tracing=False, show_debug_info=0): + assert "'" not in python_code, "Having a single quote messes with our command." + + # Suppress winappdbg warning about sql package missing. + import warnings + + with warnings.catch_warnings(): + warnings.simplefilter("ignore", category=ImportWarning) + from winappdbg.process import Process + + if not isinstance(python_code, bytes): + python_code = python_code.encode("utf-8") + + process = Process(pid) + bits = process.get_bits() + is_target_process_64 = bits == 64 + + # Note: this restriction no longer applies (we create a process with the proper bitness from + # this process so that the attach works). + # if is_target_process_64 != is_python_64bit(): + # raise RuntimeError("The architecture of the Python used to connect doesn't match the architecture of the target.\n" + # "Target 64 bits: %s\n" + # "Current Python 64 bits: %s" % (is_target_process_64, is_python_64bit())) + + with _acquire_mutex("_pydevd_pid_attach_mutex_%s" % (pid,), 10): + print("--- Connecting to %s bits target (current process is: %s) ---" % (bits, 64 if is_python_64bit() else 32)) + sys.stdout.flush() + + with _win_write_to_shared_named_memory(python_code, pid): + target_executable = get_target_filename(is_target_process_64, "inject_dll_", ".exe") + if not target_executable: + raise RuntimeError("Could not find expected .exe file to inject dll in attach to process.") + + target_dll = get_target_filename(is_target_process_64) + if not target_dll: + raise RuntimeError("Could not find expected .dll file in attach to process.") + + print("\n--- Injecting attach dll: %s into pid: %s ---" % (os.path.basename(target_dll), pid)) + sys.stdout.flush() + args = [target_executable, str(pid), target_dll] + subprocess.check_call(args) + + # Now, if the first injection worked, go on to the second which will actually + # run the code. + target_dll_run_on_dllmain = get_target_filename(is_target_process_64, "run_code_on_dllmain_", ".dll") + if not target_dll_run_on_dllmain: + raise RuntimeError("Could not find expected .dll in attach to process.") + + with _create_win_event("_pydevd_pid_event_%s" % (pid,)) as event: + print("\n--- Injecting run code dll: %s into pid: %s ---" % (os.path.basename(target_dll_run_on_dllmain), pid)) + sys.stdout.flush() + args = [target_executable, str(pid), target_dll_run_on_dllmain] + subprocess.check_call(args) + + if not event.wait_for_event_set(15): + print("Timeout error: the attach may not have completed.") + sys.stdout.flush() + print("--- Finished dll injection ---\n") + sys.stdout.flush() + + return 0 + + +@contextmanager +def _acquire_mutex(mutex_name, timeout): + """ + Only one process may be attaching to a pid, so, create a system mutex + to make sure this holds in practice. + """ + from winappdbg.win32.kernel32 import CreateMutex, GetLastError, CloseHandle + from winappdbg.win32.defines import ERROR_ALREADY_EXISTS + + initial_time = time.time() + while True: + mutex = CreateMutex(None, True, mutex_name) + acquired = GetLastError() != ERROR_ALREADY_EXISTS + if acquired: + break + if time.time() - initial_time > timeout: + raise TimeoutError("Unable to acquire mutex to make attach before timeout.") + time.sleep(0.2) + + try: + yield + finally: + CloseHandle(mutex) + + +@contextmanager +def _win_write_to_shared_named_memory(python_code, pid): + # Use the definitions from winappdbg when possible. + from winappdbg.win32 import defines + from winappdbg.win32.kernel32 import ( + CreateFileMapping, + MapViewOfFile, + CloseHandle, + UnmapViewOfFile, + ) + + memmove = ctypes.cdll.msvcrt.memmove + memmove.argtypes = [ + ctypes.c_void_p, + ctypes.c_void_p, + defines.SIZE_T, + ] + memmove.restype = ctypes.c_void_p + + # Note: BUFSIZE must be the same from run_code_in_memory.hpp + BUFSIZE = 2048 + assert isinstance(python_code, bytes) + assert len(python_code) > 0, "Python code must not be empty." + # Note: -1 so that we're sure we'll add a \0 to the end. + assert len(python_code) < BUFSIZE - 1, "Python code must have at most %s bytes (found: %s)" % (BUFSIZE - 1, len(python_code)) + + python_code += b"\0" * (BUFSIZE - len(python_code)) + assert python_code.endswith(b"\0") + + INVALID_HANDLE_VALUE = -1 + PAGE_READWRITE = 0x4 + FILE_MAP_WRITE = 0x2 + filemap = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, BUFSIZE, "__pydevd_pid_code_to_run__%s" % (pid,)) + + if filemap == INVALID_HANDLE_VALUE or filemap is None: + raise Exception("Failed to create named file mapping (ctypes: CreateFileMapping): %s" % (filemap,)) + try: + view = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0) + if not view: + raise Exception("Failed to create view of named file mapping (ctypes: MapViewOfFile).") + + try: + memmove(view, python_code, BUFSIZE) + yield + finally: + UnmapViewOfFile(view) + finally: + CloseHandle(filemap) + + +def run_python_code_linux(pid, python_code, connect_debugger_tracing=False, show_debug_info=0): + assert "'" not in python_code, "Having a single quote messes with our command." + + target_dll = get_target_filename() + if not target_dll: + libdir = os.path.dirname(os.path.abspath(__file__)) + found = [name for name in os.listdir(libdir)] + raise RuntimeError( + "Could not find .so for attach to process.\nlibdir: %s\nAvailable in dir: %s" + % ( + libdir, + found, + ) + ) + target_dll_name = os.path.splitext(os.path.basename(target_dll))[0] + + # Note: we currently don't support debug builds + is_debug = 0 + # Note that the space in the beginning of each line in the multi-line is important! + cmd = [ + "gdb", + "--nw", # no gui interface + "--nh", # no ~/.gdbinit + "--nx", # no .gdbinit + # '--quiet', # no version number on startup + "--pid", + str(pid), + "--batch", + # '--batch-silent', + ] + + # PYDEVD_GDB_SCAN_SHARED_LIBRARIES can be a list of strings with the shared libraries + # which should be scanned by default to make the attach to process (i.e.: libdl, libltdl, libc, libfreebl3). + # + # The default is scanning all shared libraries, but on some cases this can be in the 20-30 + # seconds range for some corner cases. + # See: https://github.com/JetBrains/intellij-community/pull/1608 + # + # By setting PYDEVD_GDB_SCAN_SHARED_LIBRARIES (to a comma-separated string), it's possible to + # specify just a few libraries to be loaded (not many are needed for the attach, + # but it can be tricky to pre-specify for all Linux versions as this may change + # across different versions). + # + # See: https://github.com/microsoft/debugpy/issues/762#issuecomment-947103844 + # for a comment that explains the basic steps on how to discover what should be available + # in each case (mostly trying different versions based on the output of gdb). + # + # The upside is that for cases when too many libraries are loaded the attach could be slower + # and just specifying the one that is actually needed for the attach can make it much faster. + # + # The downside is that it may be dependent on the Linux version being attached to (which is the + # reason why this is no longer done by default -- see: https://github.com/microsoft/debugpy/issues/882). + gdb_load_shared_libraries = os.environ.get("PYDEVD_GDB_SCAN_SHARED_LIBRARIES", "").strip() + if gdb_load_shared_libraries: + print("PYDEVD_GDB_SCAN_SHARED_LIBRARIES set: %s." % (gdb_load_shared_libraries,)) + cmd.extend(["--init-eval-command='set auto-solib-add off'"]) # Don't scan all libraries. + + for lib in gdb_load_shared_libraries.split(","): + lib = lib.strip() + cmd.extend(["--eval-command='sharedlibrary %s'" % (lib,)]) # Scan the specified library + else: + print("PYDEVD_GDB_SCAN_SHARED_LIBRARIES not set (scanning all libraries for needed symbols).") + + cmd.extend(["--eval-command='set scheduler-locking off'"]) # If on we'll deadlock. + + # Leave auto by default (it should do the right thing as we're attaching to a process in the + # current host). + cmd.extend(["--eval-command='set architecture auto'"]) + + cmd.extend( + [ + "--eval-command='call (void*)dlopen(\"%s\", 2)'" % target_dll, + "--eval-command='sharedlibrary %s'" % target_dll_name, + "--eval-command='call (int)DoAttach(%s, \"%s\", %s)'" % (is_debug, python_code, show_debug_info), + ] + ) + + # print ' '.join(cmd) + + env = os.environ.copy() + # Remove the PYTHONPATH (if gdb has a builtin Python it could fail if we + # have the PYTHONPATH for a different python version or some forced encoding). + env.pop("PYTHONIOENCODING", None) + env.pop("PYTHONPATH", None) + print("Running: %s" % (" ".join(cmd))) + subprocess.check_call(" ".join(cmd), shell=True, env=env) + + +def find_helper_script(filedir, script_name): + target_filename = os.path.join(filedir, "linux_and_mac", script_name) + target_filename = os.path.normpath(target_filename) + if not os.path.exists(target_filename): + raise RuntimeError("Could not find helper script: %s" % target_filename) + + return target_filename + + +def run_python_code_mac(pid, python_code, connect_debugger_tracing=False, show_debug_info=0): + assert "'" not in python_code, "Having a single quote messes with our command." + + target_dll = get_target_filename() + if not target_dll: + raise RuntimeError("Could not find .dylib for attach to process.") + + libdir = os.path.dirname(__file__) + lldb_prepare_file = find_helper_script(libdir, "lldb_prepare.py") + # Note: we currently don't support debug builds + + is_debug = 0 + # Note that the space in the beginning of each line in the multi-line is important! + cmd = [ + "lldb", + "--no-lldbinit", # Do not automatically parse any '.lldbinit' files. + # '--attach-pid', + # str(pid), + # '--arch', + # arch, + "--script-language", + "Python", + # '--batch-silent', + ] + + cmd.extend( + [ + "-o 'process attach --pid %d'" % pid, + "-o 'command script import \"%s\"'" % (lldb_prepare_file,), + '-o \'load_lib_and_attach "%s" %s "%s" %s\'' % (target_dll, is_debug, python_code, show_debug_info), + ] + ) + + cmd.extend( + [ + "-o 'process detach'", + "-o 'script import os; os._exit(1)'", + ] + ) + + # print ' '.join(cmd) + + env = os.environ.copy() + # Remove the PYTHONPATH (if lldb has a builtin Python it could fail if we + # have the PYTHONPATH for a different python version or some forced encoding). + env.pop("PYTHONIOENCODING", None) + env.pop("PYTHONPATH", None) + print("Running: %s" % (" ".join(cmd))) + subprocess.check_call(" ".join(cmd), shell=True, env=env) + + +if IS_WINDOWS: + run_python_code = run_python_code_windows +elif IS_MAC: + run_python_code = run_python_code_mac +elif IS_LINUX: + run_python_code = run_python_code_linux +else: + + def run_python_code(*args, **kwargs): + print("Unable to attach to process in platform: %s", sys.platform) + + +def test(): + print("Running with: %s" % (sys.executable,)) + code = """ +import os, time, sys +print(os.getpid()) +#from threading import Thread +#Thread(target=str).start() +if __name__ == '__main__': + while True: + time.sleep(.5) + sys.stdout.write('.\\n') + sys.stdout.flush() +""" + + p = subprocess.Popen([sys.executable, "-u", "-c", code]) + try: + code = 'print("It worked!")\n' + + # Real code will be something as: + # code = '''import sys;sys.path.append(r'X:\winappdbg-code\examples'); import imported;''' + run_python_code(p.pid, python_code=code) + print("\nRun a 2nd time...\n") + run_python_code(p.pid, python_code=code) + + time.sleep(3) + finally: + p.kill() + + +def main(args): + # Otherwise, assume the first parameter is the pid and anything else is code to be executed + # in the target process. + pid = int(args[0]) + del args[0] + python_code = ";".join(args) + + # Note: on Linux the python code may not have a single quote char: ' + run_python_code(pid, python_code) + + +if __name__ == "__main__": + args = sys.argv[1:] + if not args: + print("Expected pid and Python code to execute in target process.") + else: + if "--test" == args[0]: + test() + else: + main(args) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_linux_amd64.so b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_linux_amd64.so new file mode 100644 index 0000000000000000000000000000000000000000..0e8180bfa3dd1e327f7a3e88f5436f31ae2d13ad GIT binary patch literal 31160 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"), + ("run_module_as_main", "runpy.py"), + ("run_module", "runpy.py"), + ("run_path", "runpy.py"), + ]: + # This is the case for python -m (this is an ideal match, so, + # let's return it). + return thread_ident, "" + + if frame.f_code.co_name == "": + if frame.f_globals.get("__name__") == "__main__": + possible_thread_ids.insert(0, thread_ident) # Add with higher priority + continue + + # Usually the main thread will be started in the , whereas others would + # be started in another place (but when Python is embedded, this may not be + # correct, so, just add to the available possibilities as we'll have to choose + # one if there are multiple). + possible_thread_ids.append(thread_ident) + + if len(possible_thread_ids) > 0: + if len(possible_thread_ids) == 1: + return possible_thread_ids[0], "" # Ideal: only one match + + while unlikely_thread_id in possible_thread_ids: + possible_thread_ids.remove(unlikely_thread_id) + + if len(possible_thread_ids) == 1: + return possible_thread_ids[0], "" # Ideal: only one match + + elif len(possible_thread_ids) > 1: + # Bad: we can't really be certain of anything at this point. + return possible_thread_ids[0], "Multiple thread ids found (%s). Choosing main thread id randomly (%s)." % ( + possible_thread_ids, + possible_thread_ids[0], + ) + + # If we got here we couldn't discover the main thread id. + return None, "Unable to discover main thread id." + + +def fix_main_thread_id(on_warn=lambda msg: None, on_exception=lambda msg: None, on_critical=lambda msg: None): + # This means that we weren't able to import threading in the main thread (which most + # likely means that the main thread is paused or in some very long operation). + # In this case we'll import threading here and hotfix what may be wrong in the threading + # module (if we're on Windows where we create a thread to do the attach and on Linux + # we are not certain on which thread we're executing this code). + # + # The code below is a workaround for https://bugs.python.org/issue37416 + import sys + import threading + + # This is no longer needed in Py 3.13 (as the related issue is already fixed). + if sys.version_info[:2] >= (3, 13): + return + + try: + with threading._active_limbo_lock: + main_thread_instance = get_main_thread_instance(threading) + + if sys.platform == "win32": + # On windows this code would be called in a secondary thread, so, + # the current thread is unlikely to be the main thread. + if hasattr(threading, "_get_ident"): + unlikely_thread_id = threading._get_ident() # py2 + else: + unlikely_thread_id = threading.get_ident() # py3 + else: + unlikely_thread_id = None + + main_thread_id, critical_warning = get_main_thread_id(unlikely_thread_id) + + if main_thread_id is not None: + main_thread_id_attr = "_ident" + if not hasattr(main_thread_instance, main_thread_id_attr): + main_thread_id_attr = "_Thread__ident" + assert hasattr(main_thread_instance, main_thread_id_attr) + + if main_thread_id != getattr(main_thread_instance, main_thread_id_attr): + # Note that we also have to reset the '_tstack_lock' for a regular lock. + # This is needed to avoid an error on shutdown because this lock is bound + # to the thread state and will be released when the secondary thread + # that initialized the lock is finished -- making an assert fail during + # process shutdown. + main_thread_instance._tstate_lock = threading._allocate_lock() + main_thread_instance._tstate_lock.acquire() + + # Actually patch the thread ident as well as the threading._active dict + # (we should have the _active_limbo_lock to do that). + threading._active.pop(getattr(main_thread_instance, main_thread_id_attr), None) + setattr(main_thread_instance, main_thread_id_attr, main_thread_id) + threading._active[getattr(main_thread_instance, main_thread_id_attr)] = main_thread_instance + + # Note: only import from pydevd after the patching is done (we want to do the minimum + # possible when doing that patching). + on_warn( + "The threading module was not imported by user code in the main thread. The debugger will attempt to work around https://bugs.python.org/issue37416." + ) + + if critical_warning: + on_critical("Issue found when debugger was trying to work around https://bugs.python.org/issue37416:\n%s" % (critical_warning,)) + except: + on_exception("Error patching main thread id.") + + +def attach(port, host, protocol="", debug_mode=""): + try: + import sys + + fix_main_thread = "threading" not in sys.modules + + if fix_main_thread: + + def on_warn(msg): + from _pydev_bundle import pydev_log + + pydev_log.warn(msg) + + def on_exception(msg): + from _pydev_bundle import pydev_log + + pydev_log.exception(msg) + + def on_critical(msg): + from _pydev_bundle import pydev_log + + pydev_log.critical(msg) + + fix_main_thread_id(on_warn=on_warn, on_exception=on_exception, on_critical=on_critical) + + else: + from _pydev_bundle import pydev_log # @Reimport + + pydev_log.debug("The threading module is already imported by user code.") + + if protocol: + from _pydevd_bundle import pydevd_defaults + + pydevd_defaults.PydevdCustomization.DEFAULT_PROTOCOL = protocol + + if debug_mode: + from _pydevd_bundle import pydevd_defaults + + pydevd_defaults.PydevdCustomization.DEBUG_MODE = debug_mode + + import pydevd + + # I.e.: disconnect/reset if already connected. + + pydevd.SetupHolder.setup = None + + py_db = pydevd.get_global_debugger() + if py_db is not None: + py_db.dispose_and_kill_all_pydevd_threads(wait=False) + + # pydevd.DebugInfoHolder.DEBUG_TRACE_LEVEL = 3 + pydevd.settrace( + port=port, + host=host, + stdoutToServer=True, + stderrToServer=True, + overwrite_prev_trace=True, + suspend=False, + trace_only_current_thread=False, + patch_multiprocessing=False, + ) + except: + import traceback + + traceback.print_exc() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace.hpp new file mode 100644 index 0000000..510f916 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace.hpp @@ -0,0 +1,193 @@ +#ifndef _PY_CUSTOM_PYEVAL_SETTRACE_HPP_ +#define _PY_CUSTOM_PYEVAL_SETTRACE_HPP_ + +#include "python.h" +#include "py_utils.hpp" +#include "py_custom_pyeval_settrace_common.hpp" +#include "py_custom_pyeval_settrace_310.hpp" +#include "py_custom_pyeval_settrace_311.hpp" + +// On Python 3.7 onwards the thread state is not kept in PyThread_set_key_value (rather +// it uses PyThread_tss_set using PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate) +// and we don't have access to that key from here (thus, we can't use the previous approach which +// made CPython think that the current thread had the thread state where we wanted to set the tracing). +// +// So, the solution implemented here is not faking that change and reimplementing PyEval_SetTrace. +// The implementation is mostly the same from the one in CPython, but we have one shortcoming: +// +// When CPython sets the tracing for a thread it increments _Py_TracingPossible (actually +// _PyRuntime.ceval.tracing_possible). This implementation has one issue: it only works on +// deltas when the tracing is set (so, a settrace(func) will increase the _Py_TracingPossible global value and a +// settrace(None) will decrease it, but when a thread dies it's kept as is and is not decreased). +// -- as we don't currently have access to _PyRuntime we have to create a thread, set the tracing +// and let it die so that the count is increased (this is really hacky, but better than having +// to create a local copy of the whole _PyRuntime (defined in pystate.h with several inner structs) +// which would need to be kept up to date for each new CPython version just to increment that variable). + + + +/** + * This version is used in internalInitializeCustomPyEvalSetTrace->pyObject_FastCallDict on older + * versions of CPython (pre 3.7). + */ + static PyObject * + PyObject_FastCallDictCustom(PyObject* callback, PyObject *stack[3], int ignoredStackSizeAlways3, void* ignored) + { + PyObject *args = internalInitializeCustomPyEvalSetTrace->pyTuple_New(3); + PyObject *result; + + if (args == NULL) { + return NULL; + } + + IncRef(stack[0]); + IncRef(stack[1]); + IncRef(stack[2]); + + // I.e.: same thing as: PyTuple_SET_ITEM(args, 0, stack[0]); + reinterpret_cast(args)->ob_item[0] = stack[0]; + reinterpret_cast(args)->ob_item[1] = stack[1]; + reinterpret_cast(args)->ob_item[2] = stack[2]; + + /* call the Python-level function */ + result = internalInitializeCustomPyEvalSetTrace->pyEval_CallObjectWithKeywords(callback, args, (PyObject*)NULL); + + /* cleanup */ + DecRef(args, internalInitializeCustomPyEvalSetTrace->isDebug); + return result; +} + +static PyObject * +InternalCallTrampoline(PyObject* callback, + PyFrameObjectBaseUpTo39 *frame, int what, PyObject *arg) +{ + PyObject *result; + PyObject *stack[3]; + +// Note: this is commented out from CPython (we shouldn't need it and it adds a reasonable overhead). +// if (PyFrame_FastToLocalsWithError(frame) < 0) { +// return NULL; +// } +// + stack[0] = (PyObject *)frame; + stack[1] = InternalWhatstrings_37[what]; + stack[2] = (arg != NULL) ? arg : internalInitializeCustomPyEvalSetTrace->pyNone; + + + // Helpers to print info. + // printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[0]))); + // printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[1]))); + // printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[2]))); + // printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)callback))); + + // call the Python-level function + // result = _PyObject_FastCall(callback, stack, 3); + // + // Note that _PyObject_FastCall is actually a define: + // #define _PyObject_FastCall(func, args, nargs) _PyObject_FastCallDict((func), (args), (nargs), NULL) + + result = internalInitializeCustomPyEvalSetTrace->pyObject_FastCallDict(callback, stack, 3, NULL); + + +// Note: this is commented out from CPython (we shouldn't need it and it adds a reasonable overhead). +// PyFrame_LocalsToFast(frame, 1); + + if (result == NULL) { + internalInitializeCustomPyEvalSetTrace->pyTraceBack_Here(frame); + } + + return result; +} + +static int +InternalTraceTrampoline(PyObject *self, PyFrameObject *frameParam, + int what, PyObject *arg) +{ + PyObject *callback; + PyObject *result; + + PyFrameObjectBaseUpTo39 *frame = reinterpret_cast(frameParam); + + if (what == PyTrace_CALL){ + callback = self; + } else { + callback = frame->f_trace; + } + + if (callback == NULL){ + return 0; + } + + result = InternalCallTrampoline(callback, frame, what, arg); + if (result == NULL) { + // Note: calling the original sys.settrace here. + internalInitializeCustomPyEvalSetTrace->pyEval_SetTrace(NULL, NULL); + PyObject *temp_f_trace = frame->f_trace; + frame->f_trace = NULL; + if(temp_f_trace != NULL){ + DecRef(temp_f_trace, internalInitializeCustomPyEvalSetTrace->isDebug); + } + return -1; + } + if (result != internalInitializeCustomPyEvalSetTrace->pyNone) { + PyObject *tmp = frame->f_trace; + frame->f_trace = result; + DecRef(tmp, internalInitializeCustomPyEvalSetTrace->isDebug); + } + else { + DecRef(result, internalInitializeCustomPyEvalSetTrace->isDebug); + } + return 0; +} + +// Based on ceval.c (PyEval_SetTrace(Py_tracefunc func, PyObject *arg)) +template +void InternalPySetTrace_Template(T tstate, PyObjectHolder* traceFunc, bool isDebug) +{ + PyObject *temp = tstate->c_traceobj; + + // We can't increase _Py_TracingPossible. Everything else should be equal to CPython. + // runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL); + + PyObject *arg = traceFunc->ToPython(); + IncRef(arg); + tstate->c_tracefunc = NULL; + tstate->c_traceobj = NULL; + /* Must make sure that profiling is not ignored if 'temp' is freed */ + tstate->use_tracing = tstate->c_profilefunc != NULL; + if(temp != NULL){ + DecRef(temp, isDebug); + } + tstate->c_tracefunc = InternalTraceTrampoline; + tstate->c_traceobj = arg; + /* Flag that tracing or profiling is turned on */ + tstate->use_tracing = ((InternalTraceTrampoline != NULL) + || (tstate->c_profilefunc != NULL)); + +}; + + +void InternalPySetTrace(PyThreadState* curThread, PyObjectHolder* traceFunc, bool isDebug, PythonVersion version) +{ + if (PyThreadState_25_27::IsFor(version)) { + InternalPySetTrace_Template(reinterpret_cast(curThread), traceFunc, isDebug); + } else if (PyThreadState_30_33::IsFor(version)) { + InternalPySetTrace_Template(reinterpret_cast(curThread), traceFunc, isDebug); + } else if (PyThreadState_34_36::IsFor(version)) { + InternalPySetTrace_Template(reinterpret_cast(curThread), traceFunc, isDebug); + } else if (PyThreadState_37_38::IsFor(version)) { + InternalPySetTrace_Template(reinterpret_cast(curThread), traceFunc, isDebug); + } else if (PyThreadState_39::IsFor(version)) { + InternalPySetTrace_Template(reinterpret_cast(curThread), traceFunc, isDebug); + } else if (PyThreadState_310::IsFor(version)) { + // 3.10 has other changes on the actual algorithm (use_tracing is per-frame now), so, we have a full new version for it. + InternalPySetTrace_Template310(reinterpret_cast(curThread), traceFunc, isDebug); + } else if (PyThreadState_311::IsFor(version)) { + InternalPySetTrace_Template311(reinterpret_cast(curThread), traceFunc, isDebug); + } else { + printf("Unable to set trace to target thread with Python version: %d", version); + } +} + + +#endif //_PY_CUSTOM_PYEVAL_SETTRACE_HPP_ \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_310.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_310.hpp new file mode 100644 index 0000000..d4fe89b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_310.hpp @@ -0,0 +1,113 @@ +#ifndef _PY_CUSTOM_PYEVAL_SETTRACE_310_HPP_ +#define _PY_CUSTOM_PYEVAL_SETTRACE_310_HPP_ + +#include "python.h" +#include "py_utils.hpp" + +static PyObject * +InternalCallTrampoline310(PyObject* callback, + PyFrameObject310 *frame, int what, PyObject *arg) +{ + PyObject *result; + PyObject *stack[3]; + +// Note: this is commented out from CPython (we shouldn't need it and it adds a reasonable overhead). +// if (PyFrame_FastToLocalsWithError(frame) < 0) { +// return NULL; +// } +// + stack[0] = (PyObject *)frame; + stack[1] = InternalWhatstrings_37[what]; + stack[2] = (arg != NULL) ? arg : internalInitializeCustomPyEvalSetTrace->pyNone; + + + // Helper to print info. + // printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[0]))); + // printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[1]))); + // printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[2]))); + // printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)callback))); + + result = internalInitializeCustomPyEvalSetTrace->pyObject_FastCallDict(callback, stack, 3, NULL); + +// Note: this is commented out from CPython (we shouldn't need it and it adds a reasonable overhead). +// PyFrame_LocalsToFast(frame, 1); + + if (result == NULL) { + internalInitializeCustomPyEvalSetTrace->pyTraceBack_Here(frame); + } + + return result; +} + +// See: static int trace_trampoline(PyObject *self, PyFrameObject *frame, int what, PyObject *arg) +// in: https://github.com/python/cpython/blob/3.10/Python/sysmodule.c +static int +InternalTraceTrampoline310(PyObject *self, PyFrameObject *frameParam, + int what, PyObject *arg) +{ + PyObject *callback; + PyObject *result; + + PyFrameObject310 *frame = reinterpret_cast(frameParam); + + if (what == PyTrace_CALL){ + callback = self; + } else { + callback = frame->f_trace; + } + + if (callback == NULL){ + return 0; + } + + result = InternalCallTrampoline310(callback, frame, what, arg); + if (result == NULL) { + // Note: calling the original sys.settrace here. + internalInitializeCustomPyEvalSetTrace->pyEval_SetTrace(NULL, NULL); + PyObject *temp_f_trace = frame->f_trace; + frame->f_trace = NULL; + if(temp_f_trace != NULL){ + DecRef(temp_f_trace, internalInitializeCustomPyEvalSetTrace->isDebug); + } + return -1; + } + if (result != internalInitializeCustomPyEvalSetTrace->pyNone) { + PyObject *tmp = frame->f_trace; + frame->f_trace = result; + DecRef(tmp, internalInitializeCustomPyEvalSetTrace->isDebug); + } + else { + DecRef(result, internalInitializeCustomPyEvalSetTrace->isDebug); + } + return 0; +} + +// Based on ceval.c (PyEval_SetTrace(Py_tracefunc func, PyObject *arg)) +// https://github.com/python/cpython/blob/3.10/Python/ceval.c +template +void InternalPySetTrace_Template310(T tstate, PyObjectHolder* traceFunc, bool isDebug) +{ + PyObject *temp = tstate->c_traceobj; + + PyObject *arg = traceFunc->ToPython(); + IncRef(arg); + tstate->c_tracefunc = NULL; + tstate->c_traceobj = NULL; + + // This is different (previously it was just: tstate->use_tracing, now + // this flag is per-frame). + tstate->cframe->use_tracing = tstate->c_profilefunc != NULL; + + if(temp != NULL){ + DecRef(temp, isDebug); + } + tstate->c_tracefunc = InternalTraceTrampoline310; + tstate->c_traceobj = arg; + /* Flag that tracing or profiling is turned on */ + tstate->cframe->use_tracing = ((InternalTraceTrampoline310 != NULL) + || (tstate->c_profilefunc != NULL)); + +}; + + +#endif //_PY_CUSTOM_PYEVAL_SETTRACE_310_HPP_ \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_311.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_311.hpp new file mode 100644 index 0000000..d3086ad --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_311.hpp @@ -0,0 +1,120 @@ +#ifndef _PY_CUSTOM_PYEVAL_SETTRACE_311_HPP_ +#define _PY_CUSTOM_PYEVAL_SETTRACE_311_HPP_ + +#include "python.h" +#include "py_utils.hpp" + +static PyObject * +InternalCallTrampoline311(PyObject* callback, + PyFrameObject311 *frame, int what, PyObject *arg) +{ + PyObject *result; + PyObject *stack[3]; + +// Note: this is commented out from CPython (we shouldn't need it and it adds a reasonable overhead). +// if (PyFrame_FastToLocalsWithError(frame) < 0) { +// return NULL; +// } +// + stack[0] = (PyObject *)frame; + stack[1] = InternalWhatstrings_37[what]; + stack[2] = (arg != NULL) ? arg : internalInitializeCustomPyEvalSetTrace->pyNone; + + + // Helper to print info. + //printf("--- start\n"); + //printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[0]))); + //printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[1]))); + //printf("%s\n", internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8(internalInitializeCustomPyEvalSetTrace->pyObject_Repr((PyObject *)stack[2]))); + //printf("--- end\n"); + + result = internalInitializeCustomPyEvalSetTrace->pyObject_FastCallDict(callback, stack, 3, NULL); + +// Note: this is commented out from CPython (we shouldn't need it and it adds a reasonable overhead). +// PyFrame_LocalsToFast(frame, 1); + + if (result == NULL) { + internalInitializeCustomPyEvalSetTrace->pyTraceBack_Here(frame); + } + + return result; +} + +// See: static int trace_trampoline(PyObject *self, PyFrameObject *frame, int what, PyObject *arg) +// in: https://github.com/python/cpython/blob/3.11/Python/sysmodule.c +static int +InternalTraceTrampoline311(PyObject *self, PyFrameObject *frameParam, + int what, PyObject *arg) +{ + PyObject *callback; + PyObject *result; + + PyFrameObject311 *frame = reinterpret_cast(frameParam); + + if (what == PyTrace_CALL){ + callback = self; + } else { + callback = frame->f_trace; + } + + if (callback == NULL){ + return 0; + } + + result = InternalCallTrampoline311(callback, frame, what, arg); + if (result == NULL) { + // Note: calling the original sys.settrace here. + internalInitializeCustomPyEvalSetTrace->pyEval_SetTrace(NULL, NULL); + PyObject *temp_f_trace = frame->f_trace; + frame->f_trace = NULL; + if(temp_f_trace != NULL){ + DecRef(temp_f_trace, internalInitializeCustomPyEvalSetTrace->isDebug); + } + return -1; + } + if (result != internalInitializeCustomPyEvalSetTrace->pyNone) { + PyObject *tmp = frame->f_trace; + frame->f_trace = result; + DecRef(tmp, internalInitializeCustomPyEvalSetTrace->isDebug); + } + else { + DecRef(result, internalInitializeCustomPyEvalSetTrace->isDebug); + } + return 0; +} + +// Based on ceval.c (PyEval_SetTrace(Py_tracefunc func, PyObject *arg)) +// https://github.com/python/cpython/blob/3.11/Python/ceval.c +template +void InternalPySetTrace_Template311(T tstate, PyObjectHolder* traceFunc, bool isDebug) +{ + PyObject *traceobj = tstate->c_traceobj; + + PyObject *arg = traceFunc->ToPython(); + IncRef(arg); + tstate->c_tracefunc = NULL; + tstate->c_traceobj = NULL; + + // This is different (previously it was just: tstate->use_tracing, now + // this flag is per-frame). + int use_tracing = (tstate->c_profilefunc != NULL); + + // Note: before 3.11 this was just 1 or 0, now it needs to be 255 or 0. + tstate->cframe->use_tracing = (use_tracing ? 255 : 0); + + if(traceobj != NULL){ + DecRef(traceobj, isDebug); + } + tstate->c_tracefunc = InternalTraceTrampoline311; + tstate->c_traceobj = arg; + /* Flag that tracing or profiling is turned on */ + use_tracing = ((InternalTraceTrampoline311 != NULL) + || (tstate->c_profilefunc != NULL)); + + // Note: before 3.11 this was just 1 or 0, now it needs to be 255 or 0. + tstate->cframe->use_tracing = (use_tracing ? 255 : 0); + +}; + + +#endif //_PY_CUSTOM_PYEVAL_SETTRACE_311_HPP_ \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_common.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_common.hpp new file mode 100644 index 0000000..12f9e22 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_common.hpp @@ -0,0 +1,62 @@ +#ifndef _PY_CUSTOM_PYEVAL_SETTRACE_COMMON_HPP_ +#define _PY_CUSTOM_PYEVAL_SETTRACE_COMMON_HPP_ + +#include "python.h" +#include "py_utils.hpp" + +struct InternalInitializeCustomPyEvalSetTrace { + PyObject* pyNone; + PyTuple_New* pyTuple_New; + _PyObject_FastCallDict* pyObject_FastCallDict; + PyEval_CallObjectWithKeywords* pyEval_CallObjectWithKeywords; + PyUnicode_InternFromString* pyUnicode_InternFromString; // Note: in Py2 will be PyString_InternFromString. + PyTraceBack_Here* pyTraceBack_Here; + PyEval_SetTrace* pyEval_SetTrace; + bool isDebug; + PyUnicode_AsUTF8* pyUnicode_AsUTF8; + PyObject_Repr* pyObject_Repr; +}; + +/** + * Helper information to access CPython internals. + */ +static InternalInitializeCustomPyEvalSetTrace *internalInitializeCustomPyEvalSetTrace = NULL; + +/* + * Cached interned string objects used for calling the profile and + * trace functions. Initialized by InternalTraceInit(). + */ +static PyObject *InternalWhatstrings_37[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + + +static int +InternalIsTraceInitialized() +{ + return internalInitializeCustomPyEvalSetTrace != NULL; +} + + + +static int +InternalTraceInit(InternalInitializeCustomPyEvalSetTrace *p_internalInitializeSettrace_37) +{ + internalInitializeCustomPyEvalSetTrace = p_internalInitializeSettrace_37; + static const char * const whatnames[8] = { + "call", "exception", "line", "return", + "c_call", "c_exception", "c_return", + "opcode" + }; + PyObject *name; + int i; + for (i = 0; i < 8; ++i) { + if (InternalWhatstrings_37[i] == NULL) { + name = internalInitializeCustomPyEvalSetTrace->pyUnicode_InternFromString(whatnames[i]); + if (name == NULL) + return -1; + InternalWhatstrings_37[i] = name; + } + } + return 0; +} + +#endif //_PY_CUSTOM_PYEVAL_SETTRACE_COMMON_HPP_ \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_settrace.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_settrace.hpp new file mode 100644 index 0000000..4f033f8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_settrace.hpp @@ -0,0 +1,194 @@ +#ifndef _PY_SETTRACE_HPP_ +#define _PY_SETTRACE_HPP_ + +#include "ref_utils.hpp" +#include "py_utils.hpp" +#include "python.h" +#include "py_custom_pyeval_settrace.hpp" +#include + + +#ifdef _WIN32 + +typedef HMODULE MODULE_TYPE; +#else // LINUX ----------------------------------------------------------------- + +typedef void* MODULE_TYPE; +typedef ssize_t SSIZE_T; +typedef unsigned int DWORD; + +#endif + +DWORD GetPythonThreadId(PythonVersion version, PyThreadState* curThread) { + DWORD threadId = 0; + if (PyThreadState_25_27::IsFor(version)) { + threadId = (DWORD)((PyThreadState_25_27*)curThread)->thread_id; + } else if (PyThreadState_30_33::IsFor(version)) { + threadId = (DWORD)((PyThreadState_30_33*)curThread)->thread_id; + } else if (PyThreadState_34_36::IsFor(version)) { + threadId = (DWORD)((PyThreadState_34_36*)curThread)->thread_id; + } else if (PyThreadState_37_38::IsFor(version)) { + threadId = (DWORD)((PyThreadState_37_38*)curThread)->thread_id; + } else if (PyThreadState_39::IsFor(version)) { + threadId = (DWORD)((PyThreadState_39*)curThread)->thread_id; + } else if (PyThreadState_310::IsFor(version)) { + threadId = (DWORD)((PyThreadState_310*)curThread)->thread_id; + } else if (PyThreadState_311::IsFor(version)) { + threadId = (DWORD)((PyThreadState_311*)curThread)->thread_id; + } + return threadId; +} + + +/** + * This function may be called to set a tracing function to existing python threads. + */ +int InternalSetSysTraceFunc( + MODULE_TYPE module, + bool isDebug, + bool showDebugInfo, + PyObjectHolder* traceFunc, + PyObjectHolder* setTraceFunc, + unsigned int threadId, + PyObjectHolder* pyNone) +{ + + if(showDebugInfo){ + PRINT("InternalSetSysTraceFunc started."); + } + + DEFINE_PROC(isInit, Py_IsInitialized*, "Py_IsInitialized", 100); + if (!isInit()) { + PRINT("Py_IsInitialized returned false."); + return 110; + } + + auto version = GetPythonVersion(module); + + // found initialized Python runtime, gather and check the APIs we need. + + DEFINE_PROC(interpHead, PyInterpreterState_Head*, "PyInterpreterState_Head", 120); + DEFINE_PROC(gilEnsure, PyGILState_Ensure*, "PyGILState_Ensure", 130); + DEFINE_PROC(gilRelease, PyGILState_Release*, "PyGILState_Release", 140); + DEFINE_PROC(threadHead, PyInterpreterState_ThreadHead*, "PyInterpreterState_ThreadHead", 150); + DEFINE_PROC(threadNext, PyThreadState_Next*, "PyThreadState_Next", 160); + DEFINE_PROC(threadSwap, PyThreadState_Swap*, "PyThreadState_Swap", 170); + DEFINE_PROC(call, PyObject_CallFunctionObjArgs*, "PyObject_CallFunctionObjArgs", 180); + + PyInt_FromLong* intFromLong; + + if (version >= PythonVersion_30) { + DEFINE_PROC(intFromLongPy3, PyInt_FromLong*, "PyLong_FromLong", 190); + intFromLong = intFromLongPy3; + } else { + DEFINE_PROC(intFromLongPy2, PyInt_FromLong*, "PyInt_FromLong", 200); + intFromLong = intFromLongPy2; + } + + DEFINE_PROC(pyGetAttr, PyObject_GetAttrString*, "PyObject_GetAttrString", 250); + DEFINE_PROC(pyHasAttr, PyObject_HasAttrString*, "PyObject_HasAttrString", 260); + DEFINE_PROC_NO_CHECK(PyCFrame_Type, PyTypeObject*, "PyCFrame_Type", 300); // optional + + DEFINE_PROC_NO_CHECK(curPythonThread, PyThreadState**, "_PyThreadState_Current", 310); // optional + DEFINE_PROC_NO_CHECK(getPythonThread, _PyThreadState_UncheckedGet*, "_PyThreadState_UncheckedGet", 320); // optional + + if (curPythonThread == nullptr && getPythonThread == nullptr) { + // we're missing some APIs, we cannot attach. + PRINT("Error, missing Python threading API!!"); + return 330; + } + + auto head = interpHead(); + if (head == nullptr) { + // this interpreter is loaded but not initialized. + PRINT("Interpreter not initialized!"); + return 340; + } + + GilHolder gilLock(gilEnsure, gilRelease); // acquire and hold the GIL until done... + + int retVal = 0; + // find what index is holding onto the thread state... + auto curPyThread = getPythonThread ? getPythonThread() : *curPythonThread; + + if(curPyThread == nullptr){ + PRINT("Getting the current python thread returned nullptr."); + return 345; + } + + + // We do what PyEval_SetTrace does, but for any target thread. + PyUnicode_InternFromString* pyUnicode_InternFromString; + if (version >= PythonVersion_30) { + DEFINE_PROC(unicodeFromString, PyUnicode_InternFromString*, "PyUnicode_InternFromString", 520); + pyUnicode_InternFromString = unicodeFromString; + } else { + DEFINE_PROC(stringFromString, PyUnicode_InternFromString*, "PyString_InternFromString", 525); + pyUnicode_InternFromString = stringFromString; + } + + _PyObject_FastCallDict* pyObject_FastCallDict; + if (version < PythonVersion_37) { + pyObject_FastCallDict = reinterpret_cast<_PyObject_FastCallDict*>(&PyObject_FastCallDictCustom); + } else if (version < PythonVersion_39) { + DEFINE_PROC(fastCallDict, _PyObject_FastCallDict*, "_PyObject_FastCallDict", 530); + pyObject_FastCallDict = fastCallDict; + } else { + DEFINE_PROC(vectorcallDict, _PyObject_FastCallDict*, "PyObject_VectorcallDict", 530); + pyObject_FastCallDict = vectorcallDict; + } + + DEFINE_PROC(pyTuple_New, PyTuple_New*, "PyTuple_New", 531); + DEFINE_PROC(pyEval_CallObjectWithKeywords, PyEval_CallObjectWithKeywords*, "PyEval_CallObjectWithKeywords", 532); + + + DEFINE_PROC(pyTraceBack_Here, PyTraceBack_Here*, "PyTraceBack_Here", 540); + DEFINE_PROC(pyEval_SetTrace, PyEval_SetTrace*, "PyEval_SetTrace", 550); + + // These are defined mostly for printing info while debugging, so, if they're not there, don't bother reporting. + DEFINE_PROC_NO_CHECK(pyObject_Repr, PyObject_Repr*, "PyObject_Repr", 551); + DEFINE_PROC_NO_CHECK(pyUnicode_AsUTF8, PyUnicode_AsUTF8*, "PyUnicode_AsUTF8", 552); + + + bool found = false; + for (PyThreadState* curThread = threadHead(head); curThread != nullptr; curThread = threadNext(curThread)) { + if (GetPythonThreadId(version, curThread) != threadId) { + continue; + } + found = true; + + if(showDebugInfo){ + printf("setting trace for thread: %d\n", threadId); + } + + if(!InternalIsTraceInitialized()) + { + InternalInitializeCustomPyEvalSetTrace *internalInitializeCustomPyEvalSetTrace = new InternalInitializeCustomPyEvalSetTrace(); + + IncRef(pyNone->ToPython()); + internalInitializeCustomPyEvalSetTrace->pyNone = pyNone->ToPython(); + + internalInitializeCustomPyEvalSetTrace->pyUnicode_InternFromString = pyUnicode_InternFromString; + internalInitializeCustomPyEvalSetTrace->pyObject_FastCallDict = pyObject_FastCallDict; + internalInitializeCustomPyEvalSetTrace->isDebug = isDebug; + internalInitializeCustomPyEvalSetTrace->pyTraceBack_Here = pyTraceBack_Here; + internalInitializeCustomPyEvalSetTrace->pyEval_SetTrace = pyEval_SetTrace; + internalInitializeCustomPyEvalSetTrace->pyTuple_New = pyTuple_New; + internalInitializeCustomPyEvalSetTrace->pyEval_CallObjectWithKeywords = pyEval_CallObjectWithKeywords; + internalInitializeCustomPyEvalSetTrace->pyObject_Repr = pyObject_Repr; + internalInitializeCustomPyEvalSetTrace->pyUnicode_AsUTF8 = pyUnicode_AsUTF8; + + InternalTraceInit(internalInitializeCustomPyEvalSetTrace); + } + InternalPySetTrace(curThread, traceFunc, isDebug, version); + break; + } + if(!found) { + retVal = 501; + } + + return retVal; + +} + +#endif // _PY_SETTRACE_HPP_ diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_utils.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_utils.hpp new file mode 100644 index 0000000..132a071 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_utils.hpp @@ -0,0 +1,85 @@ +#ifndef _PY_UTILS_HPP_ +#define _PY_UTILS_HPP_ + +typedef int (Py_IsInitialized)(); +typedef PyInterpreterState* (PyInterpreterState_Head)(); +typedef enum { PyGILState_LOCKED, PyGILState_UNLOCKED } PyGILState_STATE; +typedef PyGILState_STATE(PyGILState_Ensure)(); +typedef void (PyGILState_Release)(PyGILState_STATE); +typedef int (PyRun_SimpleString)(const char *command); +typedef PyThreadState* (PyInterpreterState_ThreadHead)(PyInterpreterState* interp); +typedef PyThreadState* (PyThreadState_Next)(PyThreadState *tstate); +typedef PyThreadState* (PyThreadState_Swap)(PyThreadState *tstate); +typedef PyThreadState* (_PyThreadState_UncheckedGet)(); +typedef PyThreadState* (_PyThreadState_GetCurrent)(); +typedef PyObject* (PyObject_CallFunctionObjArgs)(PyObject *callable, ...); // call w/ varargs, last arg should be nullptr +typedef PyObject* (PyInt_FromLong)(long); +typedef PyObject* (PyErr_Occurred)(); +typedef void (PyErr_Fetch)(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback); +typedef void (PyErr_Restore)(PyObject *type, PyObject *value, PyObject *traceback); +typedef PyObject* (PyImport_ImportModule) (const char *name); +typedef PyObject* (PyImport_ImportModuleNoBlock) (const char *name); +typedef PyObject* (PyObject_GetAttrString)(PyObject *o, const char *attr_name); +typedef PyObject* (PyObject_HasAttrString)(PyObject *o, const char *attr_name); +typedef void* (PyThread_get_key_value)(int); +typedef int (PyThread_set_key_value)(int, void*); +typedef void (PyThread_delete_key_value)(int); +typedef int (PyObject_Not) (PyObject *o); +typedef PyObject* (PyDict_New)(); +typedef PyObject* (PyUnicode_InternFromString)(const char *u); +typedef PyObject * (_PyObject_FastCallDict)( + PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs); +typedef int (PyTraceBack_Here)(PyFrameObject *frame); + +typedef PyObject* PyTuple_New(Py_ssize_t len); +typedef PyObject* PyEval_CallObjectWithKeywords(PyObject *callable, PyObject *args, PyObject *kwargs); + +typedef void (PyEval_SetTrace)(Py_tracefunc, PyObject *); +typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *frame, int, PyObject *); +typedef int (_PyEval_SetTrace)(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); + +typedef PyObject* PyObject_Repr(PyObject *); +typedef const char* PyUnicode_AsUTF8(PyObject *unicode); + +// holder to ensure we release the GIL even in error conditions +class GilHolder { + PyGILState_STATE _gilState; + PyGILState_Release* _release; +public: + GilHolder(PyGILState_Ensure* acquire, PyGILState_Release* release) { + _gilState = acquire(); + _release = release; + } + + ~GilHolder() { + _release(_gilState); + } +}; + +#ifdef _WIN32 + +#define PRINT(msg) {std::cout << msg << std::endl << std::flush;} + +#define DEFINE_PROC_NO_CHECK(func, funcType, funcNameStr, errorCode) \ + funcType func=reinterpret_cast(GetProcAddress(module, funcNameStr)); + +#define DEFINE_PROC(func, funcType, funcNameStr, errorCode) \ + DEFINE_PROC_NO_CHECK(func, funcType, funcNameStr, errorCode); \ + if(func == nullptr){std::cout << funcNameStr << " not found." << std::endl << std::flush; return errorCode;}; + +#else // LINUX ----------------------------------------------------------------- + +#define PRINT(msg) {printf(msg); printf("\n");} + +#define CHECK_NULL(ptr, msg, errorCode) if(ptr == nullptr){printf(msg); return errorCode;} + +#define DEFINE_PROC_NO_CHECK(func, funcType, funcNameStr, errorCode) \ + funcType func; *(void**)(&func) = dlsym(module, funcNameStr); + +#define DEFINE_PROC(func, funcType, funcNameStr, errorCode) \ + DEFINE_PROC_NO_CHECK(func, funcType, funcNameStr, errorCode); \ + if(func == nullptr){printf(funcNameStr); printf(" not found.\n"); return errorCode;}; + +#endif //_WIN32 + +#endif //_PY_UTILS_HPP_ \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp new file mode 100644 index 0000000..712684c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp @@ -0,0 +1,98 @@ + +#ifndef __PY_VERSION_HPP__ +#define __PY_VERSION_HPP__ + + +#include + +enum PythonVersion { + PythonVersion_Unknown, + PythonVersion_25 = 0x0205, + PythonVersion_26 = 0x0206, + PythonVersion_27 = 0x0207, + PythonVersion_30 = 0x0300, + PythonVersion_31 = 0x0301, + PythonVersion_32 = 0x0302, + PythonVersion_33 = 0x0303, + PythonVersion_34 = 0x0304, + PythonVersion_35 = 0x0305, + PythonVersion_36 = 0x0306, + PythonVersion_37 = 0x0307, + PythonVersion_38 = 0x0308, + PythonVersion_39 = 0x0309, + PythonVersion_310 = 0x030A, + PythonVersion_311 = 0x030B, + PythonVersion_312 = 0x030C, + PythonVersion_313 = 0x030D, +}; + + +#ifdef _WIN32 + +typedef const char* (GetVersionFunc)(); + +static PythonVersion GetPythonVersion(HMODULE hMod) { + auto versionFunc = reinterpret_cast(GetProcAddress(hMod, "Py_GetVersion")); + if (versionFunc == nullptr) { + return PythonVersion_Unknown; + } + const char* version = versionFunc(); + + +#else // LINUX ----------------------------------------------------------------- + +typedef const char* (*GetVersionFunc) (); + +static PythonVersion GetPythonVersion(void *module) { + GetVersionFunc versionFunc; + *(void**)(&versionFunc) = dlsym(module, "Py_GetVersion"); + if(versionFunc == nullptr) { + return PythonVersion_Unknown; + } + const char* version = versionFunc(); + +#endif //_WIN32 + + if (version != nullptr && strlen(version) >= 3 && version[1] == '.') { + if (version[0] == '2') { + switch (version[2]) { + case '5': return PythonVersion_25; + case '6': return PythonVersion_26; + case '7': return PythonVersion_27; + } + } + else if (version[0] == '3') { + switch (version[2]) { + case '0': return PythonVersion_30; + case '1': + if(strlen(version) >= 4){ + if(version[3] == '0'){ + return PythonVersion_310; + } + if(version[3] == '1'){ + return PythonVersion_311; + } + if(version[3] == '2'){ + return PythonVersion_312; + } + if(version[3] == '3'){ + return PythonVersion_313; + } + } + return PythonVersion_Unknown; // we don't care about 3.1 anymore... + + case '2': return PythonVersion_32; + case '3': return PythonVersion_33; + case '4': return PythonVersion_34; + case '5': return PythonVersion_35; + case '6': return PythonVersion_36; + case '7': return PythonVersion_37; + case '8': return PythonVersion_38; + case '9': return PythonVersion_39; + } + } + } + return PythonVersion_Unknown; +} + +#endif \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/python.h b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/python.h new file mode 100644 index 0000000..ce5dc98 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/python.h @@ -0,0 +1,704 @@ +// Python Tools for Visual Studio +// Copyright(c) Microsoft Corporation +// All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the License); you may not use +// this file except in compliance with the License. You may obtain a copy of the +// License at http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY +// IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +// MERCHANTABILITY OR NON-INFRINGEMENT. +// +// See the Apache Version 2.0 License for specific language governing +// permissions and limitations under the License. + +#ifndef __PYTHON_H__ +#define __PYTHON_H__ + +#include "../common/py_version.hpp" + +#include + +#ifndef _WIN32 +typedef unsigned int DWORD; +typedef ssize_t SSIZE_T; +#endif +typedef SSIZE_T Py_ssize_t; + +// defines limited header of Python API for compatible access across a number of Pythons. + +class PyTypeObject; +class PyThreadState; + +#define PyObject_HEAD \ + size_t ob_refcnt; \ + PyTypeObject *ob_type; + +#define PyObject_VAR_HEAD \ + PyObject_HEAD \ + size_t ob_size; /* Number of items in variable part */ + +class PyObject { +public: + PyObject_HEAD +}; + +class PyVarObject : public PyObject { +public: + size_t ob_size; /* Number of items in variable part */ +}; + +// 2.5 - 3.7 +class PyFunctionObject : public PyObject { +public: + PyObject *func_code; /* A code object */ +}; + +// 2.5 - 2.7 compatible +class PyStringObject : public PyVarObject { +public: + long ob_shash; + int ob_sstate; + char ob_sval[1]; + + /* Invariants: + * ob_sval contains space for 'ob_size+1' elements. + * ob_sval[ob_size] == 0. + * ob_shash is the hash of the string or -1 if not computed yet. + * ob_sstate != 0 iff the string object is in stringobject.c's + * 'interned' dictionary; in this case the two references + * from 'interned' to this object are *not counted* in ob_refcnt. + */ +}; + +// 2.4 - 3.7 compatible +typedef struct { + PyObject_HEAD + size_t length; /* Length of raw Unicode data in buffer */ + wchar_t *str; /* Raw Unicode buffer */ + long hash; /* Hash value; -1 if not set */ +} PyUnicodeObject; + + +class PyFrameObject : public PyObject { + // After 3.10 we don't really have things we want to reuse common, so, + // create an empty base (it's not based on PyVarObject because on Python 3.11 + // it's just a PyObject and no longer a PyVarObject -- the part related to + // the var object must be declared in ech subclass in this case). +}; + +// 2.4 - 3.7 compatible +class PyFrameObjectBaseUpTo39 : public PyFrameObject { +public: + size_t ob_size; /* Number of items in variable part -- i.e.: PyVarObject*/ + + PyFrameObjectBaseUpTo39 *f_back; /* previous frame, or nullptr */ + PyObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + + // It has more things, but we're only interested in things up to f_trace. + +}; + + +// https://github.com/python/cpython/blob/3.10/Include/cpython/frameobject.h +class PyFrameObject310 : public PyFrameObject { +public: + size_t ob_size; /* Number of items in variable part -- i.e.: PyVarObject*/ + + PyFrameObject310 *f_back; /* previous frame, or NULL */ + PyObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + PyObject *f_trace; /* Trace function */ + + // It has more things, but we're only interested in things up to f_trace. +}; + +typedef uint16_t _Py_CODEUNIT; + +// https://github.com/python/cpython/blob/3.11/Include/internal/pycore_frame.h +typedef struct _PyInterpreterFrame311 { + /* "Specials" section */ + PyFunctionObject *f_func; /* Strong reference */ + PyObject *f_globals; /* Borrowed reference */ + PyObject *f_builtins; /* Borrowed reference */ + PyObject *f_locals; /* Strong reference, may be NULL */ + void *f_code; /* Strong reference */ + void *frame_obj; /* Strong reference, may be NULL */ + /* Linkage section */ + struct _PyInterpreterFrame311 *previous; + // NOTE: This is not necessarily the last instruction started in the given + // frame. Rather, it is the code unit *prior to* the *next* instruction. For + // example, it may be an inline CACHE entry, an instruction we just jumped + // over, or (in the case of a newly-created frame) a totally invalid value: + _Py_CODEUNIT *prev_instr; + int stacktop; /* Offset of TOS from localsplus */ + bool is_entry; // Whether this is the "root" frame for the current _PyCFrame. + char owner; + /* Locals and stack */ + PyObject *localsplus[1]; +} _PyInterpreterFrame311; + +// https://github.com/python/cpython/blob/3.11/Include/internal/pycore_frame.h +// Note that in 3.11 it's no longer a "PyVarObject". +class PyFrameObject311 : public PyFrameObject { +public: + PyFrameObject311 *f_back; /* previous frame, or NULL */ + struct _PyInterpreterFrame311 *f_frame; /* points to the frame data */ + PyObject *f_trace; /* Trace function */ + int f_lineno; /* Current line number. Only valid if non-zero */ + char f_trace_lines; /* Emit per-line trace events? */ + char f_trace_opcodes; /* Emit per-opcode trace events? */ + char f_fast_as_locals; /* Have the fast locals of this frame been converted to a dict? */ + // It has more things, but we're not interested on those. +}; + + +typedef void (*destructor)(PyObject *); + +// 2.4 - 3.7 +class PyMethodDef { +public: + char *ml_name; /* The name of the built-in function/method */ +}; + + +// +// 2.5 - 3.7 +// While these are compatible there are fields only available on later versions. +class PyTypeObject : public PyVarObject { +public: + const char *tp_name; /* For printing, in format "." */ + size_t tp_basicsize, tp_itemsize; /* For allocation */ + + /* Methods to implement standard operations */ + + destructor tp_dealloc; + void *tp_print; + void *tp_getattr; + void *tp_setattr; + union { + void *tp_compare; /* 2.4 - 3.4 */ + void *tp_as_async; /* 3.5 - 3.7 */ + }; + void *tp_repr; + + /* Method suites for standard classes */ + + void *tp_as_number; + void *tp_as_sequence; + void *tp_as_mapping; + + /* More standard operations (here for binary compatibility) */ + + void *tp_hash; + void *tp_call; + void *tp_str; + void *tp_getattro; + void *tp_setattro; + + /* Functions to access object as input/output buffer */ + void *tp_as_buffer; + + /* Flags to define presence of optional/expanded features */ + long tp_flags; + + const char *tp_doc; /* Documentation string */ + + /* Assigned meaning in release 2.0 */ + /* call function for all accessible objects */ + void *tp_traverse; + + /* delete references to contained objects */ + void *tp_clear; + + /* Assigned meaning in release 2.1 */ + /* rich comparisons */ + void *tp_richcompare; + + /* weak reference enabler */ + size_t tp_weaklistoffset; + + /* Added in release 2.2 */ + /* Iterators */ + void *tp_iter; + void *tp_iternext; + + /* Attribute descriptor and subclassing stuff */ + PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + struct _typeobject *tp_base; + PyObject *tp_dict; + void *tp_descr_get; + void *tp_descr_set; + size_t tp_dictoffset; + void *tp_init; + void *tp_alloc; + void *tp_new; + void *tp_free; /* Low-level free-memory routine */ + void *tp_is_gc; /* For PyObject_IS_GC */ + PyObject *tp_bases; + PyObject *tp_mro; /* method resolution order */ + PyObject *tp_cache; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + void *tp_del; + + /* Type attribute cache version tag. Added in version 2.6 */ + unsigned int tp_version_tag; +}; + +// 2.4 - 3.7 +class PyTupleObject : public PyVarObject { +public: + PyObject *ob_item[1]; + + /* ob_item contains space for 'ob_size' elements. + * Items must normally not be nullptr, except during construction when + * the tuple is not yet visible outside the function that builds it. + */ +}; + +// 2.4 - 3.7 +class PyCFunctionObject : public PyObject { +public: + PyMethodDef *m_ml; /* Description of the C function to call */ + PyObject *m_self; /* Passed as 'self' arg to the C func, can be nullptr */ + PyObject *m_module; /* The __module__ attribute, can be anything */ +}; + +typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *); + +#define PyTrace_CALL 0 +#define PyTrace_EXCEPTION 1 +#define PyTrace_LINE 2 +#define PyTrace_RETURN 3 +#define PyTrace_C_CALL 4 +#define PyTrace_C_EXCEPTION 5 +#define PyTrace_C_RETURN 6 + +class PyInterpreterState { +}; + +class PyThreadState { }; + +class PyThreadState_25_27 : public PyThreadState { +public: + /* See Python/ceval.c for comments explaining most fields */ + + PyThreadState *next; + PyInterpreterState *interp; + + PyFrameObjectBaseUpTo39 *frame; + int recursion_depth; + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; + + PyObject *dict; /* Stores per-thread state */ + + /* tick_counter is incremented whenever the check_interval ticker + * reaches zero. The purpose is to give a useful measure of the number + * of interpreted bytecode instructions in a given thread. This + * extremely lightweight statistic collector may be of interest to + * profilers (like psyco.jit()), although nothing in the core uses it. + */ + int tick_counter; + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + long thread_id; /* Thread id where this tstate was created */ + + /* XXX signal handlers should also be here */ + static bool IsFor(int majorVersion, int minorVersion) { + return majorVersion == 2 && (minorVersion >= 5 && minorVersion <= 7); + } + + static bool IsFor(PythonVersion version) { + return version >= PythonVersion_25 && version <= PythonVersion_27; + } +}; + +class PyThreadState_30_33 : public PyThreadState { +public: + PyThreadState *next; + PyInterpreterState *interp; + + PyFrameObjectBaseUpTo39 *frame; + int recursion_depth; + char overflowed; /* The stack has overflowed. Allow 50 more calls + to handle the runtime error. */ + char recursion_critical; /* The current calls must not cause + a stack overflow. */ + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; + + PyObject *dict; /* Stores per-thread state */ + + /* tick_counter is incremented whenever the check_interval ticker + * reaches zero. The purpose is to give a useful measure of the number + * of interpreted bytecode instructions in a given thread. This + * extremely lightweight statistic collector may be of interest to + * profilers (like psyco.jit()), although nothing in the core uses it. + */ + int tick_counter; + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + long thread_id; /* Thread id where this tstate was created */ + + /* XXX signal handlers should also be here */ + static bool IsFor(int majorVersion, int minorVersion) { + return majorVersion == 3 && (minorVersion >= 0 && minorVersion <= 3); + } + + static bool IsFor(PythonVersion version) { + return version >= PythonVersion_30 && version <= PythonVersion_33; + } +}; + +class PyThreadState_34_36 : public PyThreadState { +public: + PyThreadState *prev; + PyThreadState *next; + PyInterpreterState *interp; + + PyFrameObjectBaseUpTo39 *frame; + int recursion_depth; + char overflowed; /* The stack has overflowed. Allow 50 more calls + to handle the runtime error. */ + char recursion_critical; /* The current calls must not cause + a stack overflow. */ + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; + + PyObject *dict; /* Stores per-thread state */ + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + + long thread_id; /* Thread id where this tstate was created */ + /* XXX signal handlers should also be here */ + + static bool IsFor(int majorVersion, int minorVersion) { + return majorVersion == 3 && minorVersion >= 4 && minorVersion <= 6; + } + + static bool IsFor(PythonVersion version) { + return version >= PythonVersion_34 && version <= PythonVersion_36; + } +}; + +struct _PyErr_StackItem { + PyObject *exc_type, *exc_value, *exc_traceback; + struct _PyErr_StackItem *previous_item; +}; + + +class PyThreadState_37_38 : public PyThreadState { +public: + PyThreadState *prev; + PyThreadState *next; + PyInterpreterState *interp; + + PyFrameObjectBaseUpTo39 *frame; + int recursion_depth; + char overflowed; /* The stack has overflowed. Allow 50 more calls + to handle the runtime error. */ + char recursion_critical; /* The current calls must not cause + a stack overflow. */ + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int stackcheck_counter; + + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + _PyErr_StackItem exc_state; + _PyErr_StackItem *exc_info; + + PyObject *dict; /* Stores per-thread state */ + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + + unsigned long thread_id; /* Thread id where this tstate was created */ + + static bool IsFor(int majorVersion, int minorVersion) { + return majorVersion == 3 && (minorVersion == 7 || minorVersion == 8); + } + + static bool IsFor(PythonVersion version) { + return version == PythonVersion_37 || version == PythonVersion_38; + } +}; + +// i.e.: https://github.com/python/cpython/blob/master/Include/cpython/pystate.h +class PyThreadState_39 : public PyThreadState { +public: + PyThreadState *prev; + PyThreadState *next; + PyInterpreterState *interp; + + PyFrameObjectBaseUpTo39 *frame; + int recursion_depth; + char overflowed; /* The stack has overflowed. Allow 50 more calls + to handle the runtime error. */ + int stackcheck_counter; + + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + _PyErr_StackItem exc_state; + _PyErr_StackItem *exc_info; + + PyObject *dict; /* Stores per-thread state */ + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + + unsigned long thread_id; /* Thread id where this tstate was created */ + + static bool IsFor(int majorVersion, int minorVersion) { + return majorVersion == 3 && minorVersion == 9; + } + + static bool IsFor(PythonVersion version) { + return version == PythonVersion_39; + } +}; + +typedef struct _cframe { + /* This struct will be threaded through the C stack + * allowing fast access to per-thread state that needs + * to be accessed quickly by the interpreter, but can + * be modified outside of the interpreter. + * + * WARNING: This makes data on the C stack accessible from + * heap objects. Care must be taken to maintain stack + * discipline and make sure that instances of this struct cannot + * accessed outside of their lifetime. + */ + int use_tracing; + struct _cframe *previous; +} CFrame; + +// i.e.: https://github.com/python/cpython/blob/master/Include/cpython/pystate.h +class PyThreadState_310 : public PyThreadState { +public: + PyThreadState *prev; + PyThreadState *next; + PyInterpreterState *interp; + + PyFrameObject310 *frame; + int recursion_depth; + int recursion_headroom; /* Allow 50 more calls to handle any errors. */ + int stackcheck_counter; + + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + + /* Pointer to current CFrame in the C stack frame of the currently, + * or most recently, executing _PyEval_EvalFrameDefault. */ + CFrame *cframe; + + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + _PyErr_StackItem exc_state; + _PyErr_StackItem *exc_info; + + PyObject *dict; /* Stores per-thread state */ + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + + unsigned long thread_id; /* Thread id where this tstate was created */ + + static bool IsFor(int majorVersion, int minorVersion) { + return majorVersion == 3 && minorVersion == 10; + } + + static bool IsFor(PythonVersion version) { + return version == PythonVersion_310; + } +}; + +// i.e.: https://github.com/python/cpython/blob/3.11/Include/cpython/pystate.h +class PyThreadState_311 : public PyThreadState { +public: + PyThreadState *prev; + PyThreadState *next; + PyInterpreterState *interp; + + int _initialized; + + int _static; + + int recursion_remaining; + int recursion_limit; + int recursion_headroom; /* Allow 50 more calls to handle any errors. */ + + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int tracing_what; + + /* Pointer to current CFrame in the C stack frame of the currently, + * or most recently, executing _PyEval_EvalFrameDefault. */ + CFrame *cframe; + + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + _PyErr_StackItem *exc_info; + + PyObject *dict; /* Stores per-thread state */ + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + + unsigned long thread_id; /* Thread id where this tstate was created */ + + static bool IsFor(int majorVersion, int minorVersion) { + return majorVersion == 3 && minorVersion == 11; + } + + static bool IsFor(PythonVersion version) { + return version == PythonVersion_311; + } +}; + +class PyIntObject : public PyObject { +public: + long ob_ival; +}; + +class Py3kLongObject : public PyVarObject { +public: + DWORD ob_digit[1]; +}; + +class PyOldStyleClassObject : public PyObject { +public: + PyObject *cl_bases; /* A tuple of class objects */ + PyObject *cl_dict; /* A dictionary */ + PyObject *cl_name; /* A string */ + /* The following three are functions or nullptr */ + PyObject *cl_getattr; + PyObject *cl_setattr; + PyObject *cl_delattr; +}; + +class PyInstanceObject : public PyObject { +public: + PyOldStyleClassObject *in_class; /* The class object */ + PyObject *in_dict; /* A dictionary */ + PyObject *in_weakreflist; /* List of weak references */ +}; + +#endif diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/ref_utils.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/ref_utils.hpp new file mode 100644 index 0000000..d1fa07d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/ref_utils.hpp @@ -0,0 +1,63 @@ +#ifndef _REF_UTILS_HPP_ +#define _REF_UTILS_HPP_ + + +PyObject* GetPyObjectPointerNoDebugInfo(bool isDebug, PyObject* object) { + if (object != nullptr && isDebug) { + // debug builds have 2 extra pointers at the front that we don't care about + return (PyObject*)((size_t*)object + 2); + } + return object; +} + +void DecRef(PyObject* object, bool isDebug) { + auto noDebug = GetPyObjectPointerNoDebugInfo(isDebug, object); + + if (noDebug != nullptr && --noDebug->ob_refcnt == 0) { + ((PyTypeObject*)GetPyObjectPointerNoDebugInfo(isDebug, noDebug->ob_type))->tp_dealloc(object); + } +} + +void IncRef(PyObject* object) { + object->ob_refcnt++; +} + +class PyObjectHolder { +private: + PyObject* _object; +public: + bool _isDebug; + + PyObjectHolder(bool isDebug) { + _object = nullptr; + _isDebug = isDebug; + } + + PyObjectHolder(bool isDebug, PyObject *object) { + _object = object; + _isDebug = isDebug; + }; + + PyObjectHolder(bool isDebug, PyObject *object, bool addRef) { + _object = object; + _isDebug = isDebug; + if (_object != nullptr && addRef) { + GetPyObjectPointerNoDebugInfo(_isDebug, _object)->ob_refcnt++; + } + }; + + PyObject* ToPython() { + return _object; + } + + ~PyObjectHolder() { + DecRef(_object, _isDebug); + } + + PyObject* operator* () { + return GetPyObjectPointerNoDebugInfo(_isDebug, _object); + } +}; + + +#endif //_REF_UTILS_HPP_ \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/.gitignore b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/.gitignore new file mode 100644 index 0000000..826fe93 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/.gitignore @@ -0,0 +1,4 @@ +/attach_x86.dylib +/attach_x86_64.dylib +/attach_linux_x86.o +/attach_linux_x86_64.o diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/__pycache__/lldb_prepare.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/__pycache__/lldb_prepare.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4eeaf1de016545c8778ed48c47cbc2cc6082ead GIT binary patch literal 2300 zcmb7F&2JM&6rZ)%-(PV829h*&^Fd+)SOKY*P^6F#2!#+SDJre1m9sP0Yu3AFcJpCt z)B3<6QK<-*f>c#%Z&YyTpFn$TFE&YQv-A*&ULy67l1r6S-|X5XL@rXt-r2YBy?O69 zGjD$LYbfML(0<8XPv3JR^pbrv8dn!~T0nS!FuH?2L70P{D>xEPk#9J{+Xs&mo}Cj8 z%a_AQM$5dxXPNduGq}g~*vl@%g}Gy3Uv`7!up|#iPD}EF#9NXNvxtsmzv0h%4upfx z$92_mzzAd+mIJL}=MdNf2aNEET~FK%OqNfmiI3-rch5(UG(3#`BT+Wm(C@t)*_VSx zFx$4LZ%Ei@xQnp*M&L259&5`XBa}UC%lrG+k-|op2KHeHH$}D&?|)?W8=h}C95B4u zBm48%G7jQU0}*(I4IlK8Z$1ALXRtZW0xF}=owWJL=_V=qGi-Y+aO5FO_j1@ zH$7^7(r(=b=!7Jui!eAEEB5%CZTI_RPSKNM@*@qlC<)6%l=v8xu#_Al+AUqpC-YRz z5`9F`q&b-+a|NO-BxPwXX@fa?dgx42lXP+_pAv7S(nL#IVDp8fus{^7Qi8!1lZD1h zNLkw|=&AsrMc69{r_3)2uqHw-B_`QUf{El)l$_2N%r;p~VF6NF9`(6q5kzyqBK$Sw^aQ-6@O2;_k*WxmEQ5Ei|hVt03#T=cV+d; zms6$j=bqpn-p~rU8)Oj%H~5%6=$XIg=S+F})9SQXnHI}9U6$nErgP8K&&$1EY$J5R zG3nSrC~(=)G~8FgZ71@Ezyl$%&Ol5?z)3c%{{;fv05+>T4AhL(v15;ed2hJ!qG~kDTyNud#-isS<=u83*oFOi5NG3d!42ci zHsSRKCJx;I|0U-Qw8$k~Q9cr6AWI@dV$@CB zS;wYF-(x{M^%G*c?VNNFv>L1X`Z1=x%&k=rthq>vqzgF}&&z}+!El^;-+_)DkjN$< ztn%#@zP;R$-rzIae9+ZZiyo^+2P@IR_2{V;_wzus7VE6W`YW;i^;lx%;`2zX*46h4 zIigeC+QjDM)wQeNo%}IY9U83+jjj)kSGvca9h&&t#q3ahEl0LpDA@YXcG&6adf`2~ z>5W#s9TjiK@7{NIwIBd_Fv5*=pr1NoBWImc35RuzEvP>r%FtT#+4Y{YCvlz*fsWlO X7I$qsIgWc3?&J>doR4x{)_{KjivBai literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/attach.cpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/attach.cpp new file mode 100644 index 0000000..6502c06 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/attach.cpp @@ -0,0 +1,111 @@ +// This is much simpler than the windows version because we're using gdb and +// we assume that gdb will call things in the correct thread already. + +//compile with: g++ -shared -o attach_linux.so -fPIC -nostartfiles attach_linux.c + + +#include +#include +#include +#include + +#include "../common/python.h" +#include "../common/ref_utils.hpp" +#include "../common/py_utils.hpp" +#include "../common/py_settrace.hpp" +//#include used for usleep + +// Exported function: hello(): Just to print something and check that we've been +// able to connect. +extern "C" int hello(void); + +int hello() +{ + printf("Hello world!\n"); + + void *module = dlopen(nullptr, 0x2); + + void *hndl = dlsym (module, "PyGILState_Ensure"); + if(hndl == nullptr){ + printf("nullptr\n"); + + }else{ + printf("Worked (found PyGILState_Ensure)!\n"); + } + + printf("%d", GetPythonVersion(module)); + + + return 2; +} + + +// Internal function to keep on the tracing +int _PYDEVD_ExecWithGILSetSysStrace(bool showDebugInfo, bool isDebug); + +// Implementation details below +typedef PyObject* (PyImport_ImportModuleNoBlock) (const char *name); +typedef int (*PyEval_ThreadsInitialized)(); +typedef unsigned long (*_PyEval_GetSwitchInterval)(void); +typedef void (*_PyEval_SetSwitchInterval)(unsigned long microseconds); + +// isDebug is pretty important! Must be true on python debug builds (python_d) +// If this value is passed wrongly the program will crash. +extern "C" int DoAttach(bool isDebug, const char *command, bool showDebugInfo); + +int DoAttach(bool isDebug, const char *command, bool showDebugInfo) +{ + void *module = dlopen(nullptr, 0x2); + DEFINE_PROC(isInitFunc, Py_IsInitialized*, "Py_IsInitialized", 1); + DEFINE_PROC(gilEnsure, PyGILState_Ensure*, "PyGILState_Ensure", 51); + DEFINE_PROC(gilRelease, PyGILState_Release*, "PyGILState_Release", 51); + + + if(!isInitFunc()){ + if(showDebugInfo){ + printf("Py_IsInitialized returned false.\n"); + } + return 2; + } + + PythonVersion version = GetPythonVersion(module); + + DEFINE_PROC(interpHead, PyInterpreterState_Head*, "PyInterpreterState_Head", 51); + + auto head = interpHead(); + if (head == nullptr) { + // this interpreter is loaded but not initialized. + if(showDebugInfo){ + printf("Interpreter not initialized!\n"); + } + return 54; + } + + // Note: unlike windows where we have to do many things to enable threading + // to work to get the gil, here we'll be executing in an existing thread, + // so, it's mostly a matter of getting the GIL and running it and we shouldn't + // have any more problems. + + DEFINE_PROC(pyRun_SimpleString, PyRun_SimpleString*, "PyRun_SimpleString", 51); + + GilHolder gilLock(gilEnsure, gilRelease); // acquire and hold the GIL until done... + + pyRun_SimpleString(command); + return 0; +} + + +// This is the function which enables us to set the sys.settrace for all the threads +// which are already running. +extern "C" int AttachDebuggerTracing(bool showDebugInfo, void* pSetTraceFunc, void* pTraceFunc, unsigned int threadId, void* pPyNone); + +int AttachDebuggerTracing(bool showDebugInfo, void* pSetTraceFunc, void* pTraceFunc, unsigned int threadId, void* pPyNone) +{ + void *module = dlopen(nullptr, 0x2); + bool isDebug = false; + PyObjectHolder traceFunc(isDebug, (PyObject*) pTraceFunc, true); + PyObjectHolder setTraceFunc(isDebug, (PyObject*) pSetTraceFunc, true); + PyObjectHolder pyNone(isDebug, reinterpret_cast(pPyNone), true); + return InternalSetSysTraceFunc(module, isDebug, showDebugInfo, &traceFunc, &setTraceFunc, threadId, &pyNone); +} + diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh new file mode 100644 index 0000000..6df8c1f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh @@ -0,0 +1,11 @@ +set -e + +ARCH="$(uname -m)" +case $ARCH in + i*86) SUFFIX=x86;; + x86_64*) SUFFIX=amd64;; + *) echo >&2 "unsupported: $ARCH"; exit 1;; +esac + +SRC="$(dirname "$0")/.." +g++ -std=c++11 -shared -fPIC -nostartfiles $SRC/linux_and_mac/attach.cpp -o $SRC/attach_linux_$SUFFIX.so diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_mac.sh b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_mac.sh new file mode 100644 index 0000000..b1930bb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_mac.sh @@ -0,0 +1,4 @@ +set -e +SRC="$(dirname "$0")/.." +g++ -fPIC -D_REENTRANT -std=c++11 -arch x86_64 -c $SRC/linux_and_mac/attach.cpp -o $SRC/attach_x86_64.o +g++ -dynamiclib -nostartfiles -arch x86_64 -lc $SRC/attach_x86_64.o -o $SRC/attach_x86_64.dylib diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_manylinux.cmd b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_manylinux.cmd new file mode 100644 index 0000000..e55f0bf --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_manylinux.cmd @@ -0,0 +1,10 @@ +:: WARNING: manylinux1 images are based on CentOS 5, which requires vsyscall to be available on +:: the host. For any recent version of Linux, this requires passing vsyscall=emulate during boot. +:: For WSL, add the following to your .wslconfig: +:: +:: [wsl2] +:: kernelCommandLine = vsyscall=emulate + +docker run --rm -v %~dp0/..:/src quay.io/pypa/manylinux1_x86_64 g++ -std=c++11 -shared -o /src/attach_linux_amd64.so -fPIC -nostartfiles /src/linux_and_mac/attach.cpp + +docker run --rm -v %~dp0/..:/src quay.io/pypa/manylinux1_i686 g++ -std=c++11 -shared -o /src/attach_linux_x86.so -fPIC -nostartfiles /src/linux_and_mac/attach.cpp diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/lldb_prepare.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/lldb_prepare.py new file mode 100644 index 0000000..aa48b06 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/lldb_prepare.py @@ -0,0 +1,55 @@ +# This file is meant to be run inside lldb +# It registers command to load library and invoke attach function +# Also it marks process threads to to distinguish them from debugger +# threads later while settings trace in threads + + +def load_lib_and_attach(debugger, command, result, internal_dict): + import shlex + + args = shlex.split(command) + + dll = args[0] + is_debug = args[1] + python_code = args[2] + show_debug_info = args[3] + + import lldb + + options = lldb.SBExpressionOptions() + options.SetFetchDynamicValue() + options.SetTryAllThreads(run_others=False) + options.SetTimeoutInMicroSeconds(timeout=10000000) + + print(dll) + target = debugger.GetSelectedTarget() + res = target.EvaluateExpression('(void*)dlopen("%s", 2);' % (dll), options) + error = res.GetError() + if error: + print(error) + + print(python_code) + res = target.EvaluateExpression('(int)DoAttach(%s, "%s", %s);' % (is_debug, python_code.replace('"', "'"), show_debug_info), options) + error = res.GetError() + if error: + print(error) + + +def __lldb_init_module(debugger, internal_dict): + import lldb + + debugger.HandleCommand("command script add -f lldb_prepare.load_lib_and_attach load_lib_and_attach") + + try: + target = debugger.GetSelectedTarget() + if target: + process = target.GetProcess() + if process: + for thread in process: + # print('Marking process thread %d'%thread.GetThreadID()) + internal_dict["_thread_%d" % thread.GetThreadID()] = True + # thread.Suspend() + except: + import traceback + + traceback.print_exc() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__init__.py new file mode 100644 index 0000000..4dbb060 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__init__.py @@ -0,0 +1,247 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Windows application debugging engine for Python. + +by Mario Vilas (mvilas at gmail.com) + +Project: U{http://sourceforge.net/projects/winappdbg/} + +Web: U{http://winappdbg.sourceforge.net/} + +Blog: U{http://breakingcode.wordpress.com} + +@group Debugging: + Debug, EventHandler, EventSift, DebugLog + +@group Instrumentation: + System, Process, Thread, Module, Window, Registry + +@group Disassemblers: + Disassembler, + BeaEngine, DistormEngine, PyDasmEngine + +@group Crash reporting: + Crash, CrashDump, CrashDAO, CrashDictionary + +@group Memory search: + Search, + Pattern, + BytePattern, + TextPattern, + RegExpPattern, + HexPattern + +@group Debug events: + Event, + NoEvent, + CreateProcessEvent, + CreateThreadEvent, + ExitProcessEvent, + ExitThreadEvent, + LoadDLLEvent, + UnloadDLLEvent, + OutputDebugStringEvent, + RIPEvent, + ExceptionEvent + +@group Win32 API wrappers: + win32, Handle, ProcessHandle, ThreadHandle, FileHandle + +@group Helpers: + HexInput, HexOutput, HexDump, Color, Table, Logger, + PathOperations, + MemoryAddresses, + CustomAddressIterator, + DataAddressIterator, + ImageAddressIterator, + MappedAddressIterator, + ExecutableAddressIterator, + ReadableAddressIterator, + WriteableAddressIterator, + ExecutableAndWriteableAddressIterator, + DebugRegister, + Regenerator + +@group Warnings: + MixedBitsWarning, BreakpointWarning, BreakpointCallbackWarning, + EventCallbackWarning, DebugSymbolsWarning, CrashWarning + +@group Deprecated classes: + CrashContainer, CrashTable, CrashTableMSSQL, + VolatileCrashContainer, DummyCrashContainer + +@type version_number: float +@var version_number: This WinAppDbg major and minor version, + as a floating point number. Use this for compatibility checking. + +@type version: str +@var version: This WinAppDbg release version, + as a printable string. Use this to show to the user. + +@undocumented: plugins +""" + +__revision__ = "$Id$" + +# List of all public symbols +__all__ = [ + # Library version + "version", + "version_number", + # from breakpoint import * + ## 'Breakpoint', + ## 'CodeBreakpoint', + ## 'PageBreakpoint', + ## 'HardwareBreakpoint', + ## 'Hook', + ## 'ApiHook', + ## 'BufferWatch', + "BreakpointWarning", + "BreakpointCallbackWarning", + # from crash import * + "Crash", + "CrashWarning", + "CrashDictionary", + "CrashContainer", + "CrashTable", + "CrashTableMSSQL", + "VolatileCrashContainer", + "DummyCrashContainer", + # from debug import * + "Debug", + "MixedBitsWarning", + # from disasm import * + "Disassembler", + "BeaEngine", + "DistormEngine", + "PyDasmEngine", + # from event import * + "EventHandler", + "EventSift", + ## 'EventFactory', + ## 'EventDispatcher', + "EventCallbackWarning", + "Event", + ## 'NoEvent', + "CreateProcessEvent", + "CreateThreadEvent", + "ExitProcessEvent", + "ExitThreadEvent", + "LoadDLLEvent", + "UnloadDLLEvent", + "OutputDebugStringEvent", + "RIPEvent", + "ExceptionEvent", + # from interactive import * + ## 'ConsoleDebugger', + # from module import * + "Module", + "DebugSymbolsWarning", + # from process import * + "Process", + # from system import * + "System", + # from search import * + "Search", + "Pattern", + "BytePattern", + "TextPattern", + "RegExpPattern", + "HexPattern", + # from registry import * + "Registry", + # from textio import * + "HexDump", + "HexInput", + "HexOutput", + "Color", + "Table", + "CrashDump", + "DebugLog", + "Logger", + # from thread import * + "Thread", + # from util import * + "PathOperations", + "MemoryAddresses", + "CustomAddressIterator", + "DataAddressIterator", + "ImageAddressIterator", + "MappedAddressIterator", + "ExecutableAddressIterator", + "ReadableAddressIterator", + "WriteableAddressIterator", + "ExecutableAndWriteableAddressIterator", + "DebugRegister", + # from window import * + "Window", + # import win32 + "win32", + # from win32 import Handle, ProcessHandle, ThreadHandle, FileHandle + "Handle", + "ProcessHandle", + "ThreadHandle", + "FileHandle", +] + +# Import all public symbols +from winappdbg.breakpoint import * +from winappdbg.crash import * +from winappdbg.debug import * +from winappdbg.disasm import * +from winappdbg.event import * +from winappdbg.interactive import * +from winappdbg.module import * +from winappdbg.process import * +from winappdbg.registry import * +from winappdbg.system import * +from winappdbg.search import * +from winappdbg.textio import * +from winappdbg.thread import * +from winappdbg.util import * +from winappdbg.window import * + +import winappdbg.win32 +from winappdbg.win32 import Handle, ProcessHandle, ThreadHandle, FileHandle + +try: + from sql import * + + __all__.append("CrashDAO") +except ImportError: + import warnings + + warnings.warn("No SQL database support present (missing dependencies?)", ImportWarning) + +# Library version +version_number = 1.5 +version = "Version %s" % version_number diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c09ce2194144c1d0a9850912001efcd6bc27bf16 GIT binary patch literal 4257 zcmaJ^&2JmW72g%Vq?JT{SdtSvQKpTZR0T_-)}e(^B#}e~RxHV?7l279NSwF^p9vx1#)T8A_!g$BuGxZsYwrkPkl49TrMT51hM<(&6_uG z-h1%EhJRIUu;}Ln~MHou+&%z zmK)2#N@FFs+_-ESQ`*{>q%56yv_3fO@a>j9#PiA@o@}bI>RNR5NzpJGuk{PB8}!OG zgI!T)F8Eg)S0@a5_0bQteD>*1(pNv6&>Yiv-}u!VCq^&#zHwr%P20aI8HV-13*G31 z6FZK5&#{FUg~X+;ZoBP;Z9+qQQSvZi(01B!3?QCrEU;w?t)$7s6~xwLu`F*jzEb7>Wdztd(>HzxJL0XHnUl^Rya z&M^(eO*?db%97EM_fS;y{9e>f*YAd0ux^0j%3)f|QJ)JMR0y8j!5u5)ZU;?qD`Y=% zyFRTD?dl4-L)#v%@2BeO9=AECK?^tLiAfn&MH#t8?Hv^jvBS?go3xjVQ{z=Y2$k_j{Gno_H#vwhgKcy%?x|gVj;|w-Vej-j zab8$*&x!6uwp-uZ%PhVZ`saAJyCUuiW$%$-=;)06o!!ICXs74USUOkn(xYNhtluD; zhr8s2;VnoL0JDDmMuq5fOp|Ib)YcA0?|MGfbgK3y^@qC9!@D7xiRx%iTdc?=1tLGf ze7|dB`c(*~c^lJTr5uK(a~svDBrr>h6Fgy8$d)WrapZ+!3~Sr={g&-K9!#ltsLVM#qpQP+aI>lOuHJ-Y}!P1T4%an!f2&)+udrSqjILU`0y?=D{<2@bJ`;m`1;Zrr4S%?W0 z^hcSvx#-7~9Ajo<@;Ae7(4uUEJjA;stapxWM$XOM?RZ>P%gs2hx7sAIA0hr=T_%AS zB9*AprXT{@S{eG9D0dRQN0r>;lnALy;uiuyj7GOS-xGb}bf_ay0`Y9bz72wvdDN^8 zEaW5hFzQnqRiC#b#tNXaQ)-dghbD-K@J@6>@GUx&bU9^m?=GURqmYEU8zlC-h_~E& zlE1d=UR$d}DcJ+cqyB@1bJ+tg4_Rk&1PUr9Fr!{cR=}JZ)zgX(<uV;M-#u8% zvn?F3ZTYCn#|}PVQpaHP_LCnRL}!Lp2$fwPEDuGngd&n+A9_r)D+ARdUjLbT6Cb2<%h6XoRDhcPI~acMikQ}cO#`Sbkr2M5m%e!cO}{OW1hSX_Qu{?uCe-Rj@1H=mWhIh`{m zFMVa?Q1)N>OP}W#p5FXm|JnZE7H|FaXP@MMa$1rzFZd!_`IqY}TRG#S+$&q(&VBSP H6QBPB+Z(Lv literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/breakpoint.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/breakpoint.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1be316f2ba55598019f31c6ca17fb45e03fa149d GIT binary patch literal 176857 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 `nupCH^Ov0=%j)K0%7OsR3E1Oy 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 J_jv~g^xp;2F4q76 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/crash.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/crash.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..470bafb4220220d119cbc6dee12b8a6e32b1167c GIT binary patch literal 68826 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

    U$a_&y}k>c3~e4wn81VTW`-@n$HiU-;?2hENk0 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/debug.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/debug.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d5615e70e8c8beecaa1e605ae5aa73f226fead4 GIT binary patch literal 54388 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 Vsh12=-ZZcIdBPdrW{|4G{s!*@i{JnN literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/interactive.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/interactive.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66507d0fe336b7903f74bba7a5fa6d0dc377ecc6 GIT binary patch literal 94269 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

  2. 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/module.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/module.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05ce343682c8a178e86568235ad9d21ce8e4bff5 GIT binary patch literal 65657 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/sql.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/sql.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5db113bbbb172c5c1e6d31bb98b8ede6e40a5677 GIT binary patch literal 34537 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/system.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/system.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcf96b84b31f436b1be7f5d73279db824521098b GIT binary patch literal 48097 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 b-KG^(HGV#BH}{)N>&Kq_FObYle5n6_d04(9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/thread.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/thread.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35b77daa8990d6c9a63e98e8f84316984524491a GIT binary patch literal 82812 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 i*0NXF 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

    !@68jpGewUyV(GBb1yCufWR4#w z&ybLjtyk2xo0ybIXi;Cr=uciR^3~X4y(oZi^n!9EI^+&sPCT5> zHsQ*+yw-;X2c@Ad3>E*&5lI}rb

    X07F|Y)_7jN)wGG}c^ERG;9kna7@;?sV;vy0A}By{%6Eu0zhJDQi#0)%R0W1EJQ3z{jZ3}78)9^c6R01@TuANbn1ah>^Rpd39O{9`!r7l?42AbglDnJKv=PSi1&qW2DSteIgpB6e7#bk>L3 ze1u1=-qN&Lnp!V-jMB{7bjQ*qgujG?a8kt|&2iwQJLHMr?{e8VIY@uV=I$`k99(ij zHE{D+1Sg%u#WCDER|0w|L~tvQ`FKH2$JgV&x4vtY6*IAOvpzbH~@1%(`&~ zDkdASnrT2IYBBaAm_}Z-B_oF`^kiduuT~f&*~6$EYJwg$3v^NG`FOl7q)z_Vsq(`|Uu zOE{NH*X2_*PyIhc&z}Jp=($q})GlnhG>*T7;q%XHFMjIMrxwrRlFzJf2a=jMzTERt z&-IRM^WGbeWt$IP3e1-*loI5HOI5tc`Ad}?u%MIB?i<^(%@3{%SlMD2}sN7$jYsC~$Jt%PgjrZp=qPE2A1bSv!JCm{hT_Fi<`3 z$<@?dZM)KTOK_Jp%=hA);6mg|>0<9^K83q*KJU-r09Nm%6PNl{N|Dd5J7eNzAQUQg zP(!b^Y^;`DOcN@m8%s2;1*@B&=xgl7uAqdMl z%z%PCPo!-5HL6YW{B5IR~D z6LGfYDYwwvlJPX;>Ko<;at)1hCvzK`@&41A+PTMbET|36eK<$KPlM82|H^~j+LF1) z->w#dO*bB2ZhAD+^yu|xzqIjs&C-UQH=7<^sy#IKVcbOFt;|(a;=-3e!(!vL{%q5( zOvUb8RsG$(tdx1n%5m!FSFC8y#$X9P{c)@@{y+NWnv%H_D~Cm)tUlB9VAl6g&R4fy z1oO(EtA!0x##6ttwK7mL_ZSX&;P6JxmFC5lXUVmlxEvTLSRypG&7H(g!^XJ*`v(B~Zv?XKkG|fWZ9kP6jAYv*+29BY z42i&2U~%KdjHfPF--1%EN-v)fPlgbjzpcUDS7Z>8?5c$fVVtUs(i`cTEc6^{wR ze-d2BylzI5q0Q_sY0=-P!}X{!x*H3Bu?~Nu16CR&{Zk_8=MmsfT9Rg|u|E=~m*FfG z+?w%s1KCk`ekq<0mOl13Lis_wT~xG_73IF>>~E*AKghxELSpCI_;CkzWPz3@%!!wI zS2E`|<~zjPDD;xS6T?TtL+T$96!93nYzY0~SJ|-4lgBuxd5|E;C6jTVcYO!>?Ld#H zerOi>9}6dhxMM~X-+m-0vMcBs<|=M^YW%Lb($(#P=>M@$_G6*)$3oz5g_ge(T5p$E zi@O$%-xlz5dwZGKwb-%T{2+9y+X7y0H@Azm3)^oC__^ILy2T-p-stys?XxbF{Mc=Q zes3qd7e(>7YvJ5&90o?@){MJB+K3C;OG*-OM`P$ zzcuq4GrZ7J>E>%6`9bM+++2F8GFMhVU;kq3rPc-IYWzxksjU6lvp*>7z)g3TDu3#$ f{Mkw+DlqPvD{no#NBI7p-tr@ly8rAE5#j#>vdn(o literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/window.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__pycache__/window.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e58bd8d51342c65ebcabae6c93bdb804c7b2e81 GIT binary patch literal 27851 zcmeHweQ;D)mf!1Ex73na>PD?EkdPiAK7@su4*@o|0hv!35Ex`^vtxH!dQVbAt6P5E zLP$ts?UYj`D&7F`>;k(q{fq^Ql8qairOtA(M6_Qn@Oc6l|QhU zt!$k9k>9!ZzT2-qB(SYzC!T#ax8J+>zI)$2=iGD7J?Gr3zbGp!QE>gmz{$SEn~L&Z z>A}35;^xr{xVfTe$|*&&ow8~6KHDj~R-ie;1p|x6GmgHHS_v?~V`t?*q%v+G5- z3;5foTqDlrqR|&iUJFIE=&%}!#Nx)#fF6klr|oUd{;SDMBjbNr4=D9)?7$Sv|^;CS_x9OR*JMtYt!6lpH+R`5`lMt(8 zxgOn{kz3DlD_EYLfBdQCEYFvb*TC{BGx8c)UX@;*(W1(7YxLTT+!b0KzHFsdk93u` z9BGr*fONIih;)snB3-L()mC8a>$H`4YSvaEU9UAEeMVc2v_)Hkbc41QX{+9H%CB!Y zwNYD#r%hTj(#?2(J>K7f-)HdKhTj(aZpH5g{BFZ=KjO?cX& zZPzyA_xTZf^RouQBKTi`cSbNBk+^R3277ch9#w-8H9DwARL}`0JvH91t35-80rFEd zJ$5D@9Rvjur3orLX5bAY9@1l+0I8@?j|cjL5iP8@u=~M~#&6=dVK1At290Qs9*c?6 zenSshD#Xx?tUwR(tP0dmPdFHhMS=sOt5|%*>{UM(*CU#)1$bUYzi||{sH{!8%P1QR z0~$2nc!l(1My*(nq3e-=q4%I3|Bw*g;Tf`~s1=XmJE^!u<-Y;s@UjeGp1>T}({K#M z0%wC^0v_FkVxevt8}9W;5Vt&kAb2h`5E?a~LJ`YTPk$(E0Vv)ajYbDV)lg3~66(q5 zzcY9?)W_IN`Xgv;gFzwyF-~d|kNnAqMn!%c@W=!t>pc*RXLOO5YY{o{F}0{#C`N+= z@cW~~Eoy&A!@W63+=&6UsD>VkM-3{Bo<({l6b@(fbT~S^A*`R(!)maHh%7y%80ex! z9gN1zPm7NX>T3UM5p4(9ZJc3mcj#=;5P6)7s+^=v@@Ma8!=Qg^yd&q;jG_bKXm>EI zcI;K7y=+biy2gDlu11F=G2De>V&Y|W(Z$Fl z5Yn+b6b{8lz^mi^Y7bFztW{QN4~L_}F?A41Nhs2%#*JVk#-(R?L=Bo;A=-T!dV|oo z+K+XpJ;87|-3V0m5@MfR;CyH^-1w##eWz-8kfzE5!59f;up?-1fzc`xW*OOkKyNKU z0?4@)Z{@{zF1(ZUs8cT0pxg|wNCt5bB@8V1&Aui|<5Z7bn(ej#-1opfPMg`5UjWZO z8kLaQZ4jt-s8YhRDP!pIAtNH$r72>mjIP~AFa(KmG8i7x_Zddi*r9etP4$#lCM_-v zy3wk9u5s*xS{|~8J6A}hRxA)?67oM9ct$$EaKefCq zS+RA>y>-^(yEt-TWXe^W3s^~S1fux>`}^+sK!|(^ax@?=lRg>uH8U;0jBW!@2>Kk= zLCn*~iCe(bg+5cY0S>c3fQkH&7J%v>fU2Jj;Z%{RFj{VbG8PBd(Tq98OBAY(P!B5Gy?88q7KD$ zP3;~rSCs3Tv0T;I6GpkNxfSBmptn=C2lO~6FfKQbnJPM);sygDQEmbY?^6#Inna+r)~df*DrP@4}B-u@@B%-Orq&(<-MiNxv-R6p#d!b zmPq+EQKZ3M6t)d0LB*zw;J@aAPJ;jhp-?17f|<7hIjJSXrX+0@b2ev4m4QGw8q@;f zO}<yq=IE6STu@P}PUhs&2O~XW86cK}sZz$@`D`1l5E!!L z{hTnf8;Qw^c3#*yRl1s3(ay^|r`)8v&A3)1Tq~wss~#*>Z&ZFzf3yBi8O3kNzR2~sNcc~-+&42ZL6lZIpq;6EP8ZMXzTEt46H{aBeh6BJ;g5*Uy-fE>VTw&2Gg3xh#wGN&*<-EE|V(HgOQlev^r?j|Ie%!T;Aq`S0b z=GRp5EhL<`R7~!ityjSejxgTRlyEmqyVnqJ>HR_Pv~R;~b-RVPoW0$WsM(hAZp+{; z4Ncc0*CNS=*2%r^9i6RTNv-8lrBrU}p{QHc^|aI?dA5*DTv%eBSqC^Yq6MkuV3gu| zGKB}rS9?C=VOlOOR4V(I64&gVnJpKPx3|U8h5BbpFxW!|rgf=~_}Xw7HlGoaiapUm{K6D2WV9(nY0)A`(a?K!cv9d$ zP(!`sk6=c(bbHN3%vs0f8woGt8A=#M(x8p4NKCS1mcK%1)3B&zP-e=_7cabM)F(A( z(#&|~|3N#kek2phZ%UMk+N+ND>n96mOP5@PhL$X?GnwIMr5k456*KOJgc}TUrqQ2h z^d}oPO}jVGUw3)Jz5J?nJ$fygZ17LJH_m#hCd(F(ga`2%R&xFNt4oI3OA@tGR++Yb z#(PXD#i0WC94vQMJ3p_)tWdm4OxU5?BdSgoDK**y2Pu}O!*GlN+g$x+#y=tuLw|b+ zjw%aM3-~J4eL#=zq24-S#p5f}>?M5}VMzKSMk@v8GIEPS%Q2z|psrl;R?T=;Bs?o_ zG=1Q|=})fQlJvAqx!M*0cked_cY5)9T58Q`R9vS1JRdSle_K9eFvl%?f3Y*dakBWx zaByUJfea4a!_i3JvADqyk}5v%+Tp;7t~U+k%;Exzl7J%)qO~eCzO=!QcKgP-N@`JULcM z2`l?v&ySZ1!i)KN0zpeH2+Ay~BTO|dfT@}1UQRssa?*2X%5`V~ToLcQq7*NRQS5}W zN=dIjn-rtKro5qy*oKvJ1#c+BWEPu9V=JbUO; z*FNyo&iK|Od~0sRKX~WnJIS@rCVkIMxu5%+2cEh)#a3K<-&gan0KZ?x$U*YGm8+G1 zQM{?(j%`yxkJUEdKq0dY9A;ShCWcGsPNHQP=Li$`B_>XYCHXLqoyi2Nm47jeasN0~ z8qZm!Q*PR+%y=GOoAZKBec1GXP=>W>?k%x`e~0>Y`zTZgJ(iq%SS`HZVB;i|j3_xjOmN0ap%ZpH5{D5n-z zEeMw2Yb5H9>v1E5ND-#43H;6PU6-%z7MP?F%Ia2hn$vGV_ddgKmKGvg%W>_eJ6}v( zo2agkv-y}AgTU~eGl`jIBEK?2Gm*J35Wmci|iEv_Aa+p?x3oDxmyT=4}SZ20tO?pCQ&Ql@*Io&G&7e3vOnd8Wq z^TqPZGA4dm#w?H&k&)Yx!ve_O0xNIh&Bo-4&38KPxppofWEYnOjQ&qKmq7JaO6ZA3 z4Go@^IIYXFLTltZay4O2?&Gk3T1BsLY*ThH(g!7p)(L|l?!%&WpPX9L z`mp?y+e7qiiEkXO=Je2-m4DJQ!7JDVUzzZ%ywUc-uA94(tJ;#Dty8Y83*fUB?=Q|u zZ=8(#(u58fBQBWTUFLoI7rC^U&bmy&&U})#v>$TJ7LW#xd3zygn028SvJ_=qS-r>w z6MB)~KW3xFQqW~(R+%KaHYVaoRhapMFf}|yg3aptDUq*B=pul_9u`R}$v5TA4yjE! z!g_B!Re)IKl+y_H^~Y0%-O+eFI$-K8_8udHc`=F?%@~*$85D2H4-&=eKq+*X3Z>jP zQ>G@$(hMwFwq??en53Cy{=_o>9s9>c9~IrL_*wN&s*}rhU+_%Y-z&OQ@%`%AhLtl7 zTM`Xh?!5Hz!H*8!?fzNlC!u7+L8wEh;<~i*`^~eSC6mQ$>ZHi=TcCk?Se;iyD@>*R z2e`4$p>%-GX;R*@uKe^X&26?Zd#~N3(AyX*U5pkHcb`_5x+thA%-EygVH`vmbO;L= zXCc;HtF8)*8dfe{WFx`7hVM1VtkNE7~i$ zF^N(hc8V|BvbptG6m5)iYmT*3rm=}&OID{fn|N}?`MGpZutj1c_h8frjYhFABWxLC zdW|H497poLj@*+JHjlusjF;tzq+pHb6~-w(oWc##ZI}yY;q2pbs8z*E9^s@hX}N-1#iDBW2VvTe z3Wtn^Q7C~oC^AG-z+fi6-YKB6>eA(P_Bz=nX8qfNW)R4`< zqp&Yi$R1oYJm4Vd*)-|6U+Q78lT8U<(~YjAZ~c^eJq1B|a|we~P(~Q@ocd`yxXFduZpBXqV6R0f5|yAjv?!+d3_zzs{QZ zV#T16}B(PftJRo<+k5UBhvVY3zjoa`^)t@mmi2-9M2p}(FF z&9u8L50bS|PX>}toZql>92>_dx3#rZZO*48?L{%Ej_}R``Ba%bVdJ9O8#S=4tWSlu zgiUNujW!BW4*Cp(_T;3vSsdL9e{QNMHq=d@lPU@dnjz3bcjK{4LwJxjR-z56`)`RZ zo<|9z3t!FqYbJ|kYwBid)+K7zC2Q7`)qL~h0YoQB-|ggqO9wu4*OMK6^XH!G$?{wd zLH*LdNB3_d?EBanwpPV2?Kek zRZ6k+d#3d2An{}_fUNw8b~lnFW6}%jSh10jOAR%|wbi{nfNvsHfM-OWK0Cg_ytXbchM4DNia>BTVEy}4=SqOUyVuO ztC@7&FR!>1zp*`0vwqg?yLjlrp{tH*_j1ga$%Ak`QFQ!`wxn;}j~q`LKmu&*p*VMKHdEe>AF zemSEAiRL-r6#z9`XaQ0&twKX zh(%heyY+tfHVG>Ot%QU<=l2K0vCKZ?*HLq1oMfGlTxCc-O+mon&>4gQM<9pMl)-9Q zSG#Gi*=x*|YGtXy;K4L0(||4rMFiS_au7%rBH`Xb%Ldbj9bzki?D4YofFK^$P87S% zEaucS8|-W@r9aeb0&qHT5$!TN5=~?`R)KKZ+)|9r$#` zr>}fkovb-_+3_nX+?1%2=`E85p6KVMVazPaG%n`}t)tC@@J z&UsUko;00hP8U zNM=R>7+;KbO+Ym(fgy`_GRUyFq-W!lYh$kFMKXiQiA9FhXc|`BB1&g1jJK%g>9hsw zd=m@tuL4L?XClxr#Ca6}CuV*wAU!4^Px5mu^1~Cc|K`CLavhw`DgjI%2@f+ixFYtg zDdE9-_k+OAKyvlAq-Xn-Yx~oK>O?kF`H>a`S8=Gt;(!*?ji3MVSlI64_2!4IXvhj% zkyQcM8W%u+PY-^PEchKhZyx*c&EaOY1TBE^R3w%ueTtomk{?WN(3^Z)@?C2tIY%Ce zsZC_~cRIE608yNnvIsyl50}Xc#13|z%mP3(-_8J{nYoha?b1`Fw;@RiR()_@)6!RD zf^f@{y+_EGT!M#t~t9p;d~-VnsW0GTu6Wya`rb`#w)e*$L$1j5xeGPv1`i`u4Px-uJ5|GD_Pfa zOS|XV@^=OFz5KkSuMBlQGV7{mG0ounJB_OVc~0P1k&uLPm%4ave+-0m867Byj|fna z`q5{2pk1HF7R$QVT9Z|O+`9M4BH1bO)6z@60Fwnbzdv~|h%ZgMO^yVyYO**pgnpH0 zK5->3J(f`Ej+Tl^Ob>@Z4Ub*~8B8c&R4eX^ z2ks>^?iC4ldaJ~bU;X&akKVlJ-t#Les!zD*Ebefg0zWpTlYe`Aj zBp8a!PlN<>D|7k(i3p8<4mwE_-ocK&`-~fubrVS@ozYyAbVd)q2jVb(K$V#b_IHa^ z9$83*pGs)qSXR~{B)@r>AC^dm&x`Z?z6C^63T}0z{q>F`9jE3a9GAJIkoujOafTRG zI|yh2Mm4i_e`4$Yd+r1ISk=tN_Qb~ad+wKh$0<;(EFMFF;`GdKBL#MJE=+*}KxqmT z8RvQBPwak4!5tP z*Kt-cx)*l;ju+yn824CVzI8C%%63*pI$qX=D2IZHrFhT!C8AFL)<)qNgA?4r-paRV zD9jhJ%ieON50yDh-h-?QBc$`1vM#GLkDxK;ye+ui{`gw?&5v`l zWi@wp;dopAZNnig-k&#OSCm*9#gUmIw(*lA^Ww@I^T{x*4y+(x^P z>w`f=1JARZGfO3?$mVJ3CBF*p>wza6nnNFO) z@hT|Sc!QEtl>8ng-=T!&U8;mg(_*s0p$J(XG#qOWq@@Zuuu?7)I4K9k^2aEMgvO7H zhYdLBz-Xzo)5D(-dwLJ`;5pk!{{8k#Z(m(~qk77>E+M@7YZJb;Nni8i-dT@#a%8r$ z_DaX)j!QQAbnx;)da9fppRKLGUUIDjZiqK-zLBVHz2u}L557CQbouqVYjxPmdhX`A z#8UsI!UwK0acpVj^~P(B$))RWwcmRC&g#3>pVZ!Sz05fsc$&P3%P~&(5^m-T#ED}p z{L05qZj1KB_SGLste$}H7v5Yp=W&KXAGwwh!~gbBC}W3d=H!Q?otX!?bs&A#foye= zX$28eaPG!AVHCY~B=E|s9bGv#CI=k_F7ZnbKO_8-uMYTy{jTg{@rB~=ufDS3@`iin zVW`${2q{rM$18xdW5OCvA>qrROer|9^?gy0$$@VRDRRQPNj#tQc!IVpCZs%)#8N7Q zG1A{Uiur)B4bd~(-SN*bB#E*U*w_#E9geZh3_2RXDd#xw*W~TAb0O0l#M#}@kyu|| zX2%PTh*o-VVwjbu@K}c7V-(VmKB%4MY!`$OYnl#D8PJ0fib`OosFTPs&%nhWC%_*r z(C9!GM#AE2bGr!t?RSCmnnMG6bO_wpJY`yq^Bidmr$3q?{+o>>Cb- z;;^D?dM{M-xSk1bGfo0xKq7Cq>EtG;WdMtqI*TZSV|z%?2G=kbVG?TQ_t0X!q&Mk1GUYzC@5w zr6^}??e;I^&v86GRFpmT!}dpt;ypqS#YgO1LfqBAoVOSZ(Q5{cZnT}tS%P7X7e^520JjDJtb ze?XEMLuvdQWJ!W1;rdrZ(2dANph^StbuCS}mR@bT?!V?wE_>!y*PU&5x7~Ab>k`C}w1J3@>_1 zxuA8>Uy>Oy5Jb+cul(RE3h>}Z9+{{a?u%l`n2@yAsDPbv9RN|9QFtLBslap=zR z>GEeM4%{!Rx^()+`a3J9%eGGJzwfQRy8PBl(_a5X$9;F@r8jQ8gp)QW_T4Y9o~miS zWlWcE#w&=iJ$SVr)k^&nd-*G6cQ;RacTRN7xqQz3wz>5zZ7p^_Ggn>Y4B(qeoHcW` zRnE#st&Psgx&1b$bJJXTq4U`}uSho09ZNPsC0w$6qGQ%uPYt@9Z3L06k1ETZyB?_` z*<+(yp1y?pmCi%9xq~(rKw4SjJYxUNW)DgkKW;8I{t{>)Vn@_6qMM=-kUoeVvJN-J zkhT2JA22nRAE&#TUMS?}tMW77lE`7rF${m{dVx=(oyIH*NQsXja9u&zzRmW} Enabled, OneShot + @cvar ENABLED: I{Enabled} S{->} I{Running}, Disabled + @cvar ONESHOT: I{OneShot} S{->} I{Disabled} + @cvar RUNNING: I{Running} S{->} I{Enabled}, Disabled + + @type DISABLED: int + @type ENABLED: int + @type ONESHOT: int + @type RUNNING: int + + @type stateNames: dict E{lb} int S{->} str E{rb} + @cvar stateNames: User-friendly names for each breakpoint state. + + @type typeName: str + @cvar typeName: User friendly breakpoint type string. + """ + + # I don't think transitions Enabled <-> OneShot should be allowed... plus + # it would require special handling to avoid setting the same bp twice + + DISABLED = 0 + ENABLED = 1 + ONESHOT = 2 + RUNNING = 3 + + typeName = "breakpoint" + + stateNames = { + DISABLED: "disabled", + ENABLED: "enabled", + ONESHOT: "one shot", + RUNNING: "running", + } + + def __init__(self, address, size=1, condition=True, action=None): + """ + Breakpoint object. + + @type address: int + @param address: Memory address for breakpoint. + + @type size: int + @param size: Size of breakpoint in bytes (defaults to 1). + + @type condition: function + @param condition: (Optional) Condition callback function. + + The callback signature is:: + + def condition_callback(event): + return True # returns True or False + + Where B{event} is an L{Event} object, + and the return value is a boolean + (C{True} to dispatch the event, C{False} otherwise). + + @type action: function + @param action: (Optional) Action callback function. + If specified, the event is handled by this callback instead of + being dispatched normally. + + The callback signature is:: + + def action_callback(event): + pass # no return value + + Where B{event} is an L{Event} object. + """ + self.__address = address + self.__size = size + self.__state = self.DISABLED + + self.set_condition(condition) + self.set_action(action) + + def __repr__(self): + if self.is_disabled(): + state = "Disabled" + else: + state = "Active (%s)" % self.get_state_name() + if self.is_conditional(): + condition = "conditional" + else: + condition = "unconditional" + name = self.typeName + size = self.get_size() + if size == 1: + address = HexDump.address(self.get_address()) + else: + begin = self.get_address() + end = begin + size + begin = HexDump.address(begin) + end = HexDump.address(end) + address = "range %s-%s" % (begin, end) + msg = "<%s %s %s at remote address %s>" + msg = msg % (state, condition, name, address) + return msg + + # ------------------------------------------------------------------------------ + + def is_disabled(self): + """ + @rtype: bool + @return: C{True} if the breakpoint is in L{DISABLED} state. + """ + return self.get_state() == self.DISABLED + + def is_enabled(self): + """ + @rtype: bool + @return: C{True} if the breakpoint is in L{ENABLED} state. + """ + return self.get_state() == self.ENABLED + + def is_one_shot(self): + """ + @rtype: bool + @return: C{True} if the breakpoint is in L{ONESHOT} state. + """ + return self.get_state() == self.ONESHOT + + def is_running(self): + """ + @rtype: bool + @return: C{True} if the breakpoint is in L{RUNNING} state. + """ + return self.get_state() == self.RUNNING + + def is_here(self, address): + """ + @rtype: bool + @return: C{True} if the address is within the range of the breakpoint. + """ + begin = self.get_address() + end = begin + self.get_size() + return begin <= address < end + + def get_address(self): + """ + @rtype: int + @return: The target memory address for the breakpoint. + """ + return self.__address + + def get_size(self): + """ + @rtype: int + @return: The size in bytes of the breakpoint. + """ + return self.__size + + def get_span(self): + """ + @rtype: tuple( int, int ) + @return: + Starting and ending address of the memory range + covered by the breakpoint. + """ + address = self.get_address() + size = self.get_size() + return (address, address + size) + + def get_state(self): + """ + @rtype: int + @return: The current state of the breakpoint + (L{DISABLED}, L{ENABLED}, L{ONESHOT}, L{RUNNING}). + """ + return self.__state + + def get_state_name(self): + """ + @rtype: str + @return: The name of the current state of the breakpoint. + """ + return self.stateNames[self.get_state()] + + # ------------------------------------------------------------------------------ + + def is_conditional(self): + """ + @see: L{__init__} + @rtype: bool + @return: C{True} if the breakpoint has a condition callback defined. + """ + # Do not evaluate as boolean! Test for identity with True instead. + return self.__condition is not True + + def is_unconditional(self): + """ + @rtype: bool + @return: C{True} if the breakpoint doesn't have a condition callback defined. + """ + # Do not evaluate as boolean! Test for identity with True instead. + return self.__condition is True + + def get_condition(self): + """ + @rtype: bool, function + @return: Returns the condition callback for conditional breakpoints. + Returns C{True} for unconditional breakpoints. + """ + return self.__condition + + def set_condition(self, condition=True): + """ + Sets a new condition callback for the breakpoint. + + @see: L{__init__} + + @type condition: function + @param condition: (Optional) Condition callback function. + """ + if condition is None: + self.__condition = True + else: + self.__condition = condition + + def eval_condition(self, event): + """ + Evaluates the breakpoint condition, if any was set. + + @type event: L{Event} + @param event: Debug event triggered by the breakpoint. + + @rtype: bool + @return: C{True} to dispatch the event, C{False} otherwise. + """ + condition = self.get_condition() + if condition is True: # shortcut for unconditional breakpoints + return True + if callable(condition): + try: + return bool(condition(event)) + except Exception: + e = sys.exc_info()[1] + msg = "Breakpoint condition callback %r" " raised an exception: %s" + msg = msg % (condition, traceback.format_exc(e)) + warnings.warn(msg, BreakpointCallbackWarning) + return False + return bool(condition) # force evaluation now + + # ------------------------------------------------------------------------------ + + def is_automatic(self): + """ + @rtype: bool + @return: C{True} if the breakpoint has an action callback defined. + """ + return self.__action is not None + + def is_interactive(self): + """ + @rtype: bool + @return: + C{True} if the breakpoint doesn't have an action callback defined. + """ + return self.__action is None + + def get_action(self): + """ + @rtype: bool, function + @return: Returns the action callback for automatic breakpoints. + Returns C{None} for interactive breakpoints. + """ + return self.__action + + def set_action(self, action=None): + """ + Sets a new action callback for the breakpoint. + + @type action: function + @param action: (Optional) Action callback function. + """ + self.__action = action + + def run_action(self, event): + """ + Executes the breakpoint action callback, if any was set. + + @type event: L{Event} + @param event: Debug event triggered by the breakpoint. + """ + action = self.get_action() + if action is not None: + try: + return bool(action(event)) + except Exception: + e = sys.exc_info()[1] + msg = "Breakpoint action callback %r" " raised an exception: %s" + msg = msg % (action, traceback.format_exc(e)) + warnings.warn(msg, BreakpointCallbackWarning) + return False + return True + + # ------------------------------------------------------------------------------ + + def __bad_transition(self, state): + """ + Raises an C{AssertionError} exception for an invalid state transition. + + @see: L{stateNames} + + @type state: int + @param state: Intended breakpoint state. + + @raise Exception: Always. + """ + statemsg = "" + oldState = self.stateNames[self.get_state()] + newState = self.stateNames[state] + msg = "Invalid state transition (%s -> %s)" " for breakpoint at address %s" + msg = msg % (oldState, newState, HexDump.address(self.get_address())) + raise AssertionError(msg) + + def disable(self, aProcess, aThread): + """ + Transition to L{DISABLED} state. + - When hit: OneShot S{->} Disabled + - Forced by user: Enabled, OneShot, Running S{->} Disabled + - Transition from running state may require special handling + by the breakpoint implementation class. + + @type aProcess: L{Process} + @param aProcess: Process object. + + @type aThread: L{Thread} + @param aThread: Thread object. + """ + ## if self.__state not in (self.ENABLED, self.ONESHOT, self.RUNNING): + ## self.__bad_transition(self.DISABLED) + self.__state = self.DISABLED + + def enable(self, aProcess, aThread): + """ + Transition to L{ENABLED} state. + - When hit: Running S{->} Enabled + - Forced by user: Disabled, Running S{->} Enabled + - Transition from running state may require special handling + by the breakpoint implementation class. + + @type aProcess: L{Process} + @param aProcess: Process object. + + @type aThread: L{Thread} + @param aThread: Thread object. + """ + ## if self.__state not in (self.DISABLED, self.RUNNING): + ## self.__bad_transition(self.ENABLED) + self.__state = self.ENABLED + + def one_shot(self, aProcess, aThread): + """ + Transition to L{ONESHOT} state. + - Forced by user: Disabled S{->} OneShot + + @type aProcess: L{Process} + @param aProcess: Process object. + + @type aThread: L{Thread} + @param aThread: Thread object. + """ + ## if self.__state != self.DISABLED: + ## self.__bad_transition(self.ONESHOT) + self.__state = self.ONESHOT + + def running(self, aProcess, aThread): + """ + Transition to L{RUNNING} state. + - When hit: Enabled S{->} Running + + @type aProcess: L{Process} + @param aProcess: Process object. + + @type aThread: L{Thread} + @param aThread: Thread object. + """ + if self.__state != self.ENABLED: + self.__bad_transition(self.RUNNING) + self.__state = self.RUNNING + + def hit(self, event): + """ + Notify a breakpoint that it's been hit. + + This triggers the corresponding state transition and sets the + C{breakpoint} property of the given L{Event} object. + + @see: L{disable}, L{enable}, L{one_shot}, L{running} + + @type event: L{Event} + @param event: Debug event to handle (depends on the breakpoint type). + + @raise AssertionError: Disabled breakpoints can't be hit. + """ + aProcess = event.get_process() + aThread = event.get_thread() + state = self.get_state() + + event.breakpoint = self + + if state == self.ENABLED: + self.running(aProcess, aThread) + + elif state == self.RUNNING: + self.enable(aProcess, aThread) + + elif state == self.ONESHOT: + self.disable(aProcess, aThread) + + elif state == self.DISABLED: + # this should not happen + msg = "Hit a disabled breakpoint at address %s" + msg = msg % HexDump.address(self.get_address()) + warnings.warn(msg, BreakpointWarning) + + +# ============================================================================== + +# XXX TODO +# Check if the user is trying to set a code breakpoint on a memory mapped file, +# so we don't end up writing the int3 instruction in the file by accident. + + +class CodeBreakpoint(Breakpoint): + """ + Code execution breakpoints (using an int3 opcode). + + @see: L{Debug.break_at} + + @type bpInstruction: str + @cvar bpInstruction: Breakpoint instruction for the current processor. + """ + + typeName = "code breakpoint" + + if win32.arch in (win32.ARCH_I386, win32.ARCH_AMD64): + bpInstruction = "\xCC" # int 3 + + def __init__(self, address, condition=True, action=None): + """ + Code breakpoint object. + + @see: L{Breakpoint.__init__} + + @type address: int + @param address: Memory address for breakpoint. + + @type condition: function + @param condition: (Optional) Condition callback function. + + @type action: function + @param action: (Optional) Action callback function. + """ + if win32.arch not in (win32.ARCH_I386, win32.ARCH_AMD64): + msg = "Code breakpoints not supported for %s" % win32.arch + raise NotImplementedError(msg) + Breakpoint.__init__(self, address, len(self.bpInstruction), condition, action) + self.__previousValue = self.bpInstruction + + def __set_bp(self, aProcess): + """ + Writes a breakpoint instruction at the target address. + + @type aProcess: L{Process} + @param aProcess: Process object. + """ + address = self.get_address() + self.__previousValue = aProcess.read(address, len(self.bpInstruction)) + if self.__previousValue == self.bpInstruction: + msg = "Possible overlapping code breakpoints at %s" + msg = msg % HexDump.address(address) + warnings.warn(msg, BreakpointWarning) + aProcess.write(address, self.bpInstruction) + + def __clear_bp(self, aProcess): + """ + Restores the original byte at the target address. + + @type aProcess: L{Process} + @param aProcess: Process object. + """ + address = self.get_address() + currentValue = aProcess.read(address, len(self.bpInstruction)) + if currentValue == self.bpInstruction: + # Only restore the previous value if the int3 is still there. + aProcess.write(self.get_address(), self.__previousValue) + else: + self.__previousValue = currentValue + msg = "Overwritten code breakpoint at %s" + msg = msg % HexDump.address(address) + warnings.warn(msg, BreakpointWarning) + + def disable(self, aProcess, aThread): + if not self.is_disabled() and not self.is_running(): + self.__clear_bp(aProcess) + super(CodeBreakpoint, self).disable(aProcess, aThread) + + def enable(self, aProcess, aThread): + if not self.is_enabled() and not self.is_one_shot(): + self.__set_bp(aProcess) + super(CodeBreakpoint, self).enable(aProcess, aThread) + + def one_shot(self, aProcess, aThread): + if not self.is_enabled() and not self.is_one_shot(): + self.__set_bp(aProcess) + super(CodeBreakpoint, self).one_shot(aProcess, aThread) + + # FIXME race condition here (however unlikely) + # If another thread runs on over the target address while + # the breakpoint is in RUNNING state, we'll miss it. There + # is a solution to this but it's somewhat complicated, so + # I'm leaving it for another version of the debugger. :( + def running(self, aProcess, aThread): + if self.is_enabled(): + self.__clear_bp(aProcess) + aThread.set_tf() + super(CodeBreakpoint, self).running(aProcess, aThread) + + +# ============================================================================== + +# TODO: +# * If the original page was already a guard page, the exception should be +# passed to the debugee instead of being handled by the debugger. +# * If the original page was already a guard page, it should NOT be converted +# to a no-access page when disabling the breakpoint. +# * If the page permissions were modified after the breakpoint was enabled, +# no change should be done on them when disabling the breakpoint. For this +# we need to remember the original page permissions instead of blindly +# setting and clearing the guard page bit on them. +# * Some pages seem to be "magic" and resist all attempts at changing their +# protect bits (for example the pages where the PEB and TEB reside). Maybe +# a more descriptive error message could be shown in this case. + + +class PageBreakpoint(Breakpoint): + """ + Page access breakpoint (using guard pages). + + @see: L{Debug.watch_buffer} + + @group Information: + get_size_in_pages + """ + + typeName = "page breakpoint" + + # ------------------------------------------------------------------------------ + + def __init__(self, address, pages=1, condition=True, action=None): + """ + Page breakpoint object. + + @see: L{Breakpoint.__init__} + + @type address: int + @param address: Memory address for breakpoint. + + @type pages: int + @param address: Size of breakpoint in pages. + + @type condition: function + @param condition: (Optional) Condition callback function. + + @type action: function + @param action: (Optional) Action callback function. + """ + Breakpoint.__init__(self, address, pages * MemoryAddresses.pageSize, condition, action) + ## if (address & 0x00000FFF) != 0: + floordiv_align = long(address) // long(MemoryAddresses.pageSize) + truediv_align = float(address) / float(MemoryAddresses.pageSize) + if floordiv_align != truediv_align: + msg = "Address of page breakpoint " "must be aligned to a page size boundary " "(value %s received)" % HexDump.address(address) + raise ValueError(msg) + + def get_size_in_pages(self): + """ + @rtype: int + @return: The size in pages of the breakpoint. + """ + # The size is always a multiple of the page size. + return self.get_size() // MemoryAddresses.pageSize + + def __set_bp(self, aProcess): + """ + Sets the target pages as guard pages. + + @type aProcess: L{Process} + @param aProcess: Process object. + """ + lpAddress = self.get_address() + dwSize = self.get_size() + flNewProtect = aProcess.mquery(lpAddress).Protect + flNewProtect = flNewProtect | win32.PAGE_GUARD + aProcess.mprotect(lpAddress, dwSize, flNewProtect) + + def __clear_bp(self, aProcess): + """ + Restores the original permissions of the target pages. + + @type aProcess: L{Process} + @param aProcess: Process object. + """ + lpAddress = self.get_address() + flNewProtect = aProcess.mquery(lpAddress).Protect + flNewProtect = flNewProtect & (0xFFFFFFFF ^ win32.PAGE_GUARD) # DWORD + aProcess.mprotect(lpAddress, self.get_size(), flNewProtect) + + def disable(self, aProcess, aThread): + if not self.is_disabled(): + self.__clear_bp(aProcess) + super(PageBreakpoint, self).disable(aProcess, aThread) + + def enable(self, aProcess, aThread): + if win32.arch not in (win32.ARCH_I386, win32.ARCH_AMD64): + msg = "Only one-shot page breakpoints are supported for %s" + raise NotImplementedError(msg % win32.arch) + if not self.is_enabled() and not self.is_one_shot(): + self.__set_bp(aProcess) + super(PageBreakpoint, self).enable(aProcess, aThread) + + def one_shot(self, aProcess, aThread): + if not self.is_enabled() and not self.is_one_shot(): + self.__set_bp(aProcess) + super(PageBreakpoint, self).one_shot(aProcess, aThread) + + def running(self, aProcess, aThread): + aThread.set_tf() + super(PageBreakpoint, self).running(aProcess, aThread) + + +# ============================================================================== + + +class HardwareBreakpoint(Breakpoint): + """ + Hardware breakpoint (using debug registers). + + @see: L{Debug.watch_variable} + + @group Information: + get_slot, get_trigger, get_watch + + @group Trigger flags: + BREAK_ON_EXECUTION, BREAK_ON_WRITE, BREAK_ON_ACCESS + + @group Watch size flags: + WATCH_BYTE, WATCH_WORD, WATCH_DWORD, WATCH_QWORD + + @type BREAK_ON_EXECUTION: int + @cvar BREAK_ON_EXECUTION: Break on execution. + + @type BREAK_ON_WRITE: int + @cvar BREAK_ON_WRITE: Break on write. + + @type BREAK_ON_ACCESS: int + @cvar BREAK_ON_ACCESS: Break on read or write. + + @type WATCH_BYTE: int + @cvar WATCH_BYTE: Watch a byte. + + @type WATCH_WORD: int + @cvar WATCH_WORD: Watch a word (2 bytes). + + @type WATCH_DWORD: int + @cvar WATCH_DWORD: Watch a double word (4 bytes). + + @type WATCH_QWORD: int + @cvar WATCH_QWORD: Watch one quad word (8 bytes). + + @type validTriggers: tuple + @cvar validTriggers: Valid trigger flag values. + + @type validWatchSizes: tuple + @cvar validWatchSizes: Valid watch flag values. + """ + + typeName = "hardware breakpoint" + + BREAK_ON_EXECUTION = DebugRegister.BREAK_ON_EXECUTION + BREAK_ON_WRITE = DebugRegister.BREAK_ON_WRITE + BREAK_ON_ACCESS = DebugRegister.BREAK_ON_ACCESS + + WATCH_BYTE = DebugRegister.WATCH_BYTE + WATCH_WORD = DebugRegister.WATCH_WORD + WATCH_DWORD = DebugRegister.WATCH_DWORD + WATCH_QWORD = DebugRegister.WATCH_QWORD + + validTriggers = ( + BREAK_ON_EXECUTION, + BREAK_ON_WRITE, + BREAK_ON_ACCESS, + ) + + validWatchSizes = ( + WATCH_BYTE, + WATCH_WORD, + WATCH_DWORD, + WATCH_QWORD, + ) + + def __init__(self, address, triggerFlag=BREAK_ON_ACCESS, sizeFlag=WATCH_DWORD, condition=True, action=None): + """ + Hardware breakpoint object. + + @see: L{Breakpoint.__init__} + + @type address: int + @param address: Memory address for breakpoint. + + @type triggerFlag: int + @param triggerFlag: Trigger of breakpoint. Must be one of the following: + + - L{BREAK_ON_EXECUTION} + + Break on code execution. + + - L{BREAK_ON_WRITE} + + Break on memory read or write. + + - L{BREAK_ON_ACCESS} + + Break on memory write. + + @type sizeFlag: int + @param sizeFlag: Size of breakpoint. Must be one of the following: + + - L{WATCH_BYTE} + + One (1) byte in size. + + - L{WATCH_WORD} + + Two (2) bytes in size. + + - L{WATCH_DWORD} + + Four (4) bytes in size. + + - L{WATCH_QWORD} + + Eight (8) bytes in size. + + @type condition: function + @param condition: (Optional) Condition callback function. + + @type action: function + @param action: (Optional) Action callback function. + """ + if win32.arch not in (win32.ARCH_I386, win32.ARCH_AMD64): + msg = "Hardware breakpoints not supported for %s" % win32.arch + raise NotImplementedError(msg) + if sizeFlag == self.WATCH_BYTE: + size = 1 + elif sizeFlag == self.WATCH_WORD: + size = 2 + elif sizeFlag == self.WATCH_DWORD: + size = 4 + elif sizeFlag == self.WATCH_QWORD: + size = 8 + else: + msg = "Invalid size flag for hardware breakpoint (%s)" + msg = msg % repr(sizeFlag) + raise ValueError(msg) + + if triggerFlag not in self.validTriggers: + msg = "Invalid trigger flag for hardware breakpoint (%s)" + msg = msg % repr(triggerFlag) + raise ValueError(msg) + + Breakpoint.__init__(self, address, size, condition, action) + self.__trigger = triggerFlag + self.__watch = sizeFlag + self.__slot = None + + def __clear_bp(self, aThread): + """ + Clears this breakpoint from the debug registers. + + @type aThread: L{Thread} + @param aThread: Thread object. + """ + if self.__slot is not None: + aThread.suspend() + try: + ctx = aThread.get_context(win32.CONTEXT_DEBUG_REGISTERS) + DebugRegister.clear_bp(ctx, self.__slot) + aThread.set_context(ctx) + self.__slot = None + finally: + aThread.resume() + + def __set_bp(self, aThread): + """ + Sets this breakpoint in the debug registers. + + @type aThread: L{Thread} + @param aThread: Thread object. + """ + if self.__slot is None: + aThread.suspend() + try: + ctx = aThread.get_context(win32.CONTEXT_DEBUG_REGISTERS) + self.__slot = DebugRegister.find_slot(ctx) + if self.__slot is None: + msg = "No available hardware breakpoint slots for thread ID %d" + msg = msg % aThread.get_tid() + raise RuntimeError(msg) + DebugRegister.set_bp(ctx, self.__slot, self.get_address(), self.__trigger, self.__watch) + aThread.set_context(ctx) + finally: + aThread.resume() + + def get_slot(self): + """ + @rtype: int + @return: The debug register number used by this breakpoint, + or C{None} if the breakpoint is not active. + """ + return self.__slot + + def get_trigger(self): + """ + @see: L{validTriggers} + @rtype: int + @return: The breakpoint trigger flag. + """ + return self.__trigger + + def get_watch(self): + """ + @see: L{validWatchSizes} + @rtype: int + @return: The breakpoint watch flag. + """ + return self.__watch + + def disable(self, aProcess, aThread): + if not self.is_disabled(): + self.__clear_bp(aThread) + super(HardwareBreakpoint, self).disable(aProcess, aThread) + + def enable(self, aProcess, aThread): + if not self.is_enabled() and not self.is_one_shot(): + self.__set_bp(aThread) + super(HardwareBreakpoint, self).enable(aProcess, aThread) + + def one_shot(self, aProcess, aThread): + if not self.is_enabled() and not self.is_one_shot(): + self.__set_bp(aThread) + super(HardwareBreakpoint, self).one_shot(aProcess, aThread) + + def running(self, aProcess, aThread): + self.__clear_bp(aThread) + super(HardwareBreakpoint, self).running(aProcess, aThread) + aThread.set_tf() + + +# ============================================================================== + +# XXX FIXME +# +# The implementation of function hooks is very simple. A breakpoint is set at +# the entry point. Each time it's hit the "pre" callback is executed. If a +# "post" callback was defined, a one-shot breakpoint is set at the return +# address - and when that breakpoint hits, the "post" callback is executed. +# +# Functions hooks, as they are implemented now, don't work correctly for +# recursive functions. The problem is we don't know when to remove the +# breakpoint at the return address. Also there could be more than one return +# address. +# +# One possible solution would involve a dictionary of lists, where the key +# would be the thread ID and the value a stack of return addresses. But we +# still don't know what to do if the "wrong" return address is hit for some +# reason (maybe check the stack pointer?). Or if both a code and a hardware +# breakpoint are hit simultaneously. +# +# For now, the workaround for the user is to set only the "pre" callback for +# functions that are known to be recursive. +# +# If an exception is thrown by a hooked function and caught by one of it's +# parent functions, the "post" callback won't be called and weird stuff may +# happen. A possible solution is to put a breakpoint in the system call that +# unwinds the stack, to detect this case and remove the "post" breakpoint. +# +# Hooks may also behave oddly if the return address is overwritten by a buffer +# overflow bug (this is similar to the exception problem). But it's probably a +# minor issue since when you're fuzzing a function for overflows you're usually +# not interested in the return value anyway. + +# TODO: an API to modify the hooked function's arguments + + +class Hook(object): + """ + Factory class to produce hook objects. Used by L{Debug.hook_function} and + L{Debug.stalk_function}. + + When you try to instance this class, one of the architecture specific + implementations is returned instead. + + Instances act as an action callback for code breakpoints set at the + beginning of a function. It automatically retrieves the parameters from + the stack, sets a breakpoint at the return address and retrieves the + return value from the function call. + + @see: L{_Hook_i386}, L{_Hook_amd64} + + @type useHardwareBreakpoints: bool + @cvar useHardwareBreakpoints: C{True} to try to use hardware breakpoints, + C{False} otherwise. + """ + + # This is a factory class that returns + # the architecture specific implementation. + def __new__(cls, *argv, **argd): + try: + arch = argd["arch"] + del argd["arch"] + except KeyError: + try: + arch = argv[4] + argv = argv[:4] + argv[5:] + except IndexError: + raise TypeError("Missing 'arch' argument!") + if arch is None: + arch = win32.arch + if arch == win32.ARCH_I386: + return _Hook_i386(*argv, **argd) + if arch == win32.ARCH_AMD64: + return _Hook_amd64(*argv, **argd) + return object.__new__(cls, *argv, **argd) + + # XXX FIXME + # + # Hardware breakpoints don't work correctly (or al all) in old VirtualBox + # versions (3.0 and below). + # + # Maybe there should be a way to autodetect the buggy VirtualBox versions + # and tell Hook objects not to use hardware breakpoints? + # + # For now the workaround is to manually set this variable to True when + # WinAppDbg is installed on a physical machine. + # + useHardwareBreakpoints = False + + def __init__(self, preCB=None, postCB=None, paramCount=None, signature=None, arch=None): + """ + @type preCB: function + @param preCB: (Optional) Callback triggered on function entry. + + The signature for the callback should be something like this:: + + def pre_LoadLibraryEx(event, ra, lpFilename, hFile, dwFlags): + + # return address + ra = params[0] + + # function arguments start from here... + szFilename = event.get_process().peek_string(lpFilename) + + # (...) + + Note that all pointer types are treated like void pointers, so your + callback won't get the string or structure pointed to by it, but + the remote memory address instead. This is so to prevent the ctypes + library from being "too helpful" and trying to dereference the + pointer. To get the actual data being pointed to, use one of the + L{Process.read} methods. + + @type postCB: function + @param postCB: (Optional) Callback triggered on function exit. + + The signature for the callback should be something like this:: + + def post_LoadLibraryEx(event, return_value): + + # (...) + + @type paramCount: int + @param paramCount: + (Optional) Number of parameters for the C{preCB} callback, + not counting the return address. Parameters are read from + the stack and assumed to be DWORDs in 32 bits and QWORDs in 64. + + This is a faster way to pull stack parameters in 32 bits, but in 64 + bits (or with some odd APIs in 32 bits) it won't be useful, since + not all arguments to the hooked function will be of the same size. + + For a more reliable and cross-platform way of hooking use the + C{signature} argument instead. + + @type signature: tuple + @param signature: + (Optional) Tuple of C{ctypes} data types that constitute the + hooked function signature. When the function is called, this will + be used to parse the arguments from the stack. Overrides the + C{paramCount} argument. + + @type arch: str + @param arch: (Optional) Target architecture. Defaults to the current + architecture. See: L{win32.arch} + """ + self.__preCB = preCB + self.__postCB = postCB + self.__paramStack = dict() # tid -> list of tuple( arg, arg, arg... ) + + self._paramCount = paramCount + + if win32.arch != win32.ARCH_I386: + self.useHardwareBreakpoints = False + + if win32.bits == 64 and paramCount and not signature: + signature = (win32.QWORD,) * paramCount + + if signature: + self._signature = self._calc_signature(signature) + else: + self._signature = None + + def _cast_signature_pointers_to_void(self, signature): + c_void_p = ctypes.c_void_p + c_char_p = ctypes.c_char_p + c_wchar_p = ctypes.c_wchar_p + _Pointer = ctypes._Pointer + cast = ctypes.cast + for i in compat.xrange(len(signature)): + t = signature[i] + if t is not c_void_p and (issubclass(t, _Pointer) or t in [c_char_p, c_wchar_p]): + signature[i] = cast(t, c_void_p) + + def _calc_signature(self, signature): + raise NotImplementedError("Hook signatures are not supported for architecture: %s" % win32.arch) + + def _get_return_address(self, aProcess, aThread): + return None + + def _get_function_arguments(self, aProcess, aThread): + if self._signature or self._paramCount: + raise NotImplementedError("Hook signatures are not supported for architecture: %s" % win32.arch) + return () + + def _get_return_value(self, aThread): + return None + + # By using break_at() to set a process-wide breakpoint on the function's + # return address, we might hit a race condition when more than one thread + # is being debugged. + # + # Hardware breakpoints should be used instead. But since a thread can run + # out of those, we need to fall back to this method when needed. + + def __call__(self, event): + """ + Handles the breakpoint event on entry of the function. + + @type event: L{ExceptionEvent} + @param event: Breakpoint hit event. + + @raise WindowsError: An error occured. + """ + debug = event.debug + + dwProcessId = event.get_pid() + dwThreadId = event.get_tid() + aProcess = event.get_process() + aThread = event.get_thread() + + # Get the return address and function arguments. + ra = self._get_return_address(aProcess, aThread) + params = self._get_function_arguments(aProcess, aThread) + + # Keep the function arguments for later use. + self.__push_params(dwThreadId, params) + + # If we need to hook the return from the function... + bHookedReturn = False + if ra is not None and self.__postCB is not None: + # Try to set a one shot hardware breakpoint at the return address. + useHardwareBreakpoints = self.useHardwareBreakpoints + if useHardwareBreakpoints: + try: + debug.define_hardware_breakpoint( + dwThreadId, ra, event.debug.BP_BREAK_ON_EXECUTION, event.debug.BP_WATCH_BYTE, True, self.__postCallAction_hwbp + ) + debug.enable_one_shot_hardware_breakpoint(dwThreadId, ra) + bHookedReturn = True + except Exception: + e = sys.exc_info()[1] + useHardwareBreakpoints = False + msg = "Failed to set hardware breakpoint" " at address %s for thread ID %d" + msg = msg % (HexDump.address(ra), dwThreadId) + warnings.warn(msg, BreakpointWarning) + + # If not possible, set a code breakpoint instead. + if not useHardwareBreakpoints: + try: + debug.break_at(dwProcessId, ra, self.__postCallAction_codebp) + bHookedReturn = True + except Exception: + e = sys.exc_info()[1] + msg = "Failed to set code breakpoint" " at address %s for process ID %d" + msg = msg % (HexDump.address(ra), dwProcessId) + warnings.warn(msg, BreakpointWarning) + + # Call the "pre" callback. + try: + self.__callHandler(self.__preCB, event, ra, *params) + + # If no "post" callback is defined, forget the function arguments. + finally: + if not bHookedReturn: + self.__pop_params(dwThreadId) + + def __postCallAction_hwbp(self, event): + """ + Handles hardware breakpoint events on return from the function. + + @type event: L{ExceptionEvent} + @param event: Single step event. + """ + + # Remove the one shot hardware breakpoint + # at the return address location in the stack. + tid = event.get_tid() + address = event.breakpoint.get_address() + event.debug.erase_hardware_breakpoint(tid, address) + + # Call the "post" callback. + try: + self.__postCallAction(event) + + # Forget the parameters. + finally: + self.__pop_params(tid) + + def __postCallAction_codebp(self, event): + """ + Handles code breakpoint events on return from the function. + + @type event: L{ExceptionEvent} + @param event: Breakpoint hit event. + """ + + # If the breakpoint was accidentally hit by another thread, + # pass it to the debugger instead of calling the "post" callback. + # + # XXX FIXME: + # I suppose this check will fail under some weird conditions... + # + tid = event.get_tid() + if tid not in self.__paramStack: + return True + + # Remove the code breakpoint at the return address. + pid = event.get_pid() + address = event.breakpoint.get_address() + event.debug.dont_break_at(pid, address) + + # Call the "post" callback. + try: + self.__postCallAction(event) + + # Forget the parameters. + finally: + self.__pop_params(tid) + + def __postCallAction(self, event): + """ + Calls the "post" callback. + + @type event: L{ExceptionEvent} + @param event: Breakpoint hit event. + """ + aThread = event.get_thread() + retval = self._get_return_value(aThread) + self.__callHandler(self.__postCB, event, retval) + + def __callHandler(self, callback, event, *params): + """ + Calls a "pre" or "post" handler, if set. + + @type callback: function + @param callback: Callback function to call. + + @type event: L{ExceptionEvent} + @param event: Breakpoint hit event. + + @type params: tuple + @param params: Parameters for the callback function. + """ + if callback is not None: + event.hook = self + callback(event, *params) + + def __push_params(self, tid, params): + """ + Remembers the arguments tuple for the last call to the hooked function + from this thread. + + @type tid: int + @param tid: Thread global ID. + + @type params: tuple( arg, arg, arg... ) + @param params: Tuple of arguments. + """ + stack = self.__paramStack.get(tid, []) + stack.append(params) + self.__paramStack[tid] = stack + + def __pop_params(self, tid): + """ + Forgets the arguments tuple for the last call to the hooked function + from this thread. + + @type tid: int + @param tid: Thread global ID. + """ + stack = self.__paramStack[tid] + stack.pop() + if not stack: + del self.__paramStack[tid] + + def get_params(self, tid): + """ + Returns the parameters found in the stack when the hooked function + was last called by this thread. + + @type tid: int + @param tid: Thread global ID. + + @rtype: tuple( arg, arg, arg... ) + @return: Tuple of arguments. + """ + try: + params = self.get_params_stack(tid)[-1] + except IndexError: + msg = "Hooked function called from thread %d already returned" + raise IndexError(msg % tid) + return params + + def get_params_stack(self, tid): + """ + Returns the parameters found in the stack each time the hooked function + was called by this thread and hasn't returned yet. + + @type tid: int + @param tid: Thread global ID. + + @rtype: list of tuple( arg, arg, arg... ) + @return: List of argument tuples. + """ + try: + stack = self.__paramStack[tid] + except KeyError: + msg = "Hooked function was not called from thread %d" + raise KeyError(msg % tid) + return stack + + def hook(self, debug, pid, address): + """ + Installs the function hook at a given process and address. + + @see: L{unhook} + + @warning: Do not call from an function hook callback. + + @type debug: L{Debug} + @param debug: Debug object. + + @type pid: int + @param pid: Process ID. + + @type address: int + @param address: Function address. + """ + return debug.break_at(pid, address, self) + + def unhook(self, debug, pid, address): + """ + Removes the function hook at a given process and address. + + @see: L{hook} + + @warning: Do not call from an function hook callback. + + @type debug: L{Debug} + @param debug: Debug object. + + @type pid: int + @param pid: Process ID. + + @type address: int + @param address: Function address. + """ + return debug.dont_break_at(pid, address) + + +class _Hook_i386(Hook): + """ + Implementation details for L{Hook} on the L{win32.ARCH_I386} architecture. + """ + + # We don't want to inherit the parent class __new__ method. + __new__ = object.__new__ + + def _calc_signature(self, signature): + self._cast_signature_pointers_to_void(signature) + + class Arguments(ctypes.Structure): + _fields_ = [("arg_%s" % i, signature[i]) for i in compat.xrange(len(signature) - 1, -1, -1)] + + return Arguments + + def _get_return_address(self, aProcess, aThread): + return aProcess.read_pointer(aThread.get_sp()) + + def _get_function_arguments(self, aProcess, aThread): + if self._signature: + params = aThread.read_stack_structure(self._signature, offset=win32.sizeof(win32.LPVOID)) + elif self._paramCount: + params = aThread.read_stack_dwords(self._paramCount, offset=win32.sizeof(win32.LPVOID)) + else: + params = () + return params + + def _get_return_value(self, aThread): + ctx = aThread.get_context(win32.CONTEXT_INTEGER) + return ctx["Eax"] + + +class _Hook_amd64(Hook): + """ + Implementation details for L{Hook} on the L{win32.ARCH_AMD64} architecture. + """ + + # We don't want to inherit the parent class __new__ method. + __new__ = object.__new__ + + # Make a list of floating point types. + __float_types = ( + ctypes.c_double, + ctypes.c_float, + ) + # Long doubles are not supported in old versions of ctypes! + try: + __float_types += (ctypes.c_longdouble,) + except AttributeError: + pass + + def _calc_signature(self, signature): + self._cast_signature_pointers_to_void(signature) + + float_types = self.__float_types + c_sizeof = ctypes.sizeof + reg_size = c_sizeof(ctypes.c_size_t) + + reg_int_sig = [] + reg_float_sig = [] + stack_sig = [] + + for i in compat.xrange(len(signature)): + arg = signature[i] + name = "arg_%d" % i + stack_sig.insert(0, (name, arg)) + if i < 4: + if type(arg) in float_types: + reg_float_sig.append((name, arg)) + elif c_sizeof(arg) <= reg_size: + reg_int_sig.append((name, arg)) + else: + msg = ( + "Hook signatures don't support structures" " within the first 4 arguments of a function" " for the %s architecture" + ) % win32.arch + raise NotImplementedError(msg) + + if reg_int_sig: + + class RegisterArguments(ctypes.Structure): + _fields_ = reg_int_sig + else: + RegisterArguments = None + if reg_float_sig: + + class FloatArguments(ctypes.Structure): + _fields_ = reg_float_sig + else: + FloatArguments = None + if stack_sig: + + class StackArguments(ctypes.Structure): + _fields_ = stack_sig + else: + StackArguments = None + + return (len(signature), RegisterArguments, FloatArguments, StackArguments) + + def _get_return_address(self, aProcess, aThread): + return aProcess.read_pointer(aThread.get_sp()) + + def _get_function_arguments(self, aProcess, aThread): + if self._signature: + (args_count, RegisterArguments, FloatArguments, StackArguments) = self._signature + arguments = {} + if StackArguments: + address = aThread.get_sp() + win32.sizeof(win32.LPVOID) + stack_struct = aProcess.read_structure(address, StackArguments) + stack_args = dict([(name, stack_struct.__getattribute__(name)) for (name, type) in stack_struct._fields_]) + arguments.update(stack_args) + flags = 0 + if RegisterArguments: + flags = flags | win32.CONTEXT_INTEGER + if FloatArguments: + flags = flags | win32.CONTEXT_MMX_REGISTERS + if flags: + ctx = aThread.get_context(flags) + if RegisterArguments: + buffer = (win32.QWORD * 4)(ctx["Rcx"], ctx["Rdx"], ctx["R8"], ctx["R9"]) + reg_args = self._get_arguments_from_buffer(buffer, RegisterArguments) + arguments.update(reg_args) + if FloatArguments: + buffer = (win32.M128A * 4)(ctx["XMM0"], ctx["XMM1"], ctx["XMM2"], ctx["XMM3"]) + float_args = self._get_arguments_from_buffer(buffer, FloatArguments) + arguments.update(float_args) + params = tuple([arguments["arg_%d" % i] for i in compat.xrange(args_count)]) + else: + params = () + return params + + def _get_arguments_from_buffer(self, buffer, structure): + b_ptr = ctypes.pointer(buffer) + v_ptr = ctypes.cast(b_ptr, ctypes.c_void_p) + s_ptr = ctypes.cast(v_ptr, ctypes.POINTER(structure)) + struct = s_ptr.contents + return dict([(name, struct.__getattribute__(name)) for (name, type) in struct._fields_]) + + def _get_return_value(self, aThread): + ctx = aThread.get_context(win32.CONTEXT_INTEGER) + return ctx["Rax"] + + +# ------------------------------------------------------------------------------ + +# This class acts as a factory of Hook objects, one per target process. +# Said objects are deleted by the unhook() method. + + +class ApiHook(object): + """ + Used by L{EventHandler}. + + This class acts as an action callback for code breakpoints set at the + beginning of a function. It automatically retrieves the parameters from + the stack, sets a breakpoint at the return address and retrieves the + return value from the function call. + + @see: L{EventHandler.apiHooks} + + @type modName: str + @ivar modName: Module name. + + @type procName: str + @ivar procName: Procedure name. + """ + + def __init__(self, eventHandler, modName, procName, paramCount=None, signature=None): + """ + @type eventHandler: L{EventHandler} + @param eventHandler: Event handler instance. This is where the hook + callbacks are to be defined (see below). + + @type modName: str + @param modName: Module name. + + @type procName: str + @param procName: Procedure name. + The pre and post callbacks will be deduced from it. + + For example, if the procedure is "LoadLibraryEx" the callback + routines will be "pre_LoadLibraryEx" and "post_LoadLibraryEx". + + The signature for the callbacks should be something like this:: + + def pre_LoadLibraryEx(self, event, ra, lpFilename, hFile, dwFlags): + + # return address + ra = params[0] + + # function arguments start from here... + szFilename = event.get_process().peek_string(lpFilename) + + # (...) + + def post_LoadLibraryEx(self, event, return_value): + + # (...) + + Note that all pointer types are treated like void pointers, so your + callback won't get the string or structure pointed to by it, but + the remote memory address instead. This is so to prevent the ctypes + library from being "too helpful" and trying to dereference the + pointer. To get the actual data being pointed to, use one of the + L{Process.read} methods. + + @type paramCount: int + @param paramCount: + (Optional) Number of parameters for the C{preCB} callback, + not counting the return address. Parameters are read from + the stack and assumed to be DWORDs in 32 bits and QWORDs in 64. + + This is a faster way to pull stack parameters in 32 bits, but in 64 + bits (or with some odd APIs in 32 bits) it won't be useful, since + not all arguments to the hooked function will be of the same size. + + For a more reliable and cross-platform way of hooking use the + C{signature} argument instead. + + @type signature: tuple + @param signature: + (Optional) Tuple of C{ctypes} data types that constitute the + hooked function signature. When the function is called, this will + be used to parse the arguments from the stack. Overrides the + C{paramCount} argument. + """ + self.__modName = modName + self.__procName = procName + self.__paramCount = paramCount + self.__signature = signature + self.__preCB = getattr(eventHandler, "pre_%s" % procName, None) + self.__postCB = getattr(eventHandler, "post_%s" % procName, None) + self.__hook = dict() + + def __call__(self, event): + """ + Handles the breakpoint event on entry of the function. + + @type event: L{ExceptionEvent} + @param event: Breakpoint hit event. + + @raise WindowsError: An error occured. + """ + pid = event.get_pid() + try: + hook = self.__hook[pid] + except KeyError: + hook = Hook(self.__preCB, self.__postCB, self.__paramCount, self.__signature, event.get_process().get_arch()) + self.__hook[pid] = hook + return hook(event) + + @property + def modName(self): + return self.__modName + + @property + def procName(self): + return self.__procName + + def hook(self, debug, pid): + """ + Installs the API hook on a given process and module. + + @warning: Do not call from an API hook callback. + + @type debug: L{Debug} + @param debug: Debug object. + + @type pid: int + @param pid: Process ID. + """ + label = "%s!%s" % (self.__modName, self.__procName) + try: + hook = self.__hook[pid] + except KeyError: + try: + aProcess = debug.system.get_process(pid) + except KeyError: + aProcess = Process(pid) + hook = Hook(self.__preCB, self.__postCB, self.__paramCount, self.__signature, aProcess.get_arch()) + self.__hook[pid] = hook + hook.hook(debug, pid, label) + + def unhook(self, debug, pid): + """ + Removes the API hook from the given process and module. + + @warning: Do not call from an API hook callback. + + @type debug: L{Debug} + @param debug: Debug object. + + @type pid: int + @param pid: Process ID. + """ + try: + hook = self.__hook[pid] + except KeyError: + return + label = "%s!%s" % (self.__modName, self.__procName) + hook.unhook(debug, pid, label) + del self.__hook[pid] + + +# ============================================================================== + + +class BufferWatch(object): + """ + Returned by L{Debug.watch_buffer}. + + This object uniquely references a buffer being watched, even if there are + multiple watches set on the exact memory region. + + @type pid: int + @ivar pid: Process ID. + + @type start: int + @ivar start: Memory address of the start of the buffer. + + @type end: int + @ivar end: Memory address of the end of the buffer. + + @type action: callable + @ivar action: Action callback. + + @type oneshot: bool + @ivar oneshot: C{True} for one shot breakpoints, C{False} otherwise. + """ + + def __init__(self, pid, start, end, action=None, oneshot=False): + self.__pid = pid + self.__start = start + self.__end = end + self.__action = action + self.__oneshot = oneshot + + @property + def pid(self): + return self.__pid + + @property + def start(self): + return self.__start + + @property + def end(self): + return self.__end + + @property + def action(self): + return self.__action + + @property + def oneshot(self): + return self.__oneshot + + def match(self, address): + """ + Determine if the given memory address lies within the watched buffer. + + @rtype: bool + @return: C{True} if the given memory address lies within the watched + buffer, C{False} otherwise. + """ + return self.__start <= address < self.__end + + +# ============================================================================== + + +class _BufferWatchCondition(object): + """ + Used by L{Debug.watch_buffer}. + + This class acts as a condition callback for page breakpoints. + It emulates page breakpoints that can overlap and/or take up less + than a page's size. + """ + + def __init__(self): + self.__ranges = list() # list of BufferWatch in definition order + + def add(self, bw): + """ + Adds a buffer watch identifier. + + @type bw: L{BufferWatch} + @param bw: + Buffer watch identifier. + """ + self.__ranges.append(bw) + + def remove(self, bw): + """ + Removes a buffer watch identifier. + + @type bw: L{BufferWatch} + @param bw: + Buffer watch identifier. + + @raise KeyError: The buffer watch identifier was already removed. + """ + try: + self.__ranges.remove(bw) + except KeyError: + if not bw.oneshot: + raise + + def remove_last_match(self, address, size): + """ + Removes the last buffer from the watch object + to match the given address and size. + + @type address: int + @param address: Memory address of buffer to stop watching. + + @type size: int + @param size: Size in bytes of buffer to stop watching. + + @rtype: int + @return: Number of matching elements found. Only the last one to be + added is actually deleted upon calling this method. + + This counter allows you to know if there are more matching elements + and how many. + """ + count = 0 + start = address + end = address + size - 1 + matched = None + for item in self.__ranges: + if item.match(start) and item.match(end): + matched = item + count += 1 + self.__ranges.remove(matched) + return count + + def count(self): + """ + @rtype: int + @return: Number of buffers being watched. + """ + return len(self.__ranges) + + def __call__(self, event): + """ + Breakpoint condition callback. + + This method will also call the action callbacks for each + buffer being watched. + + @type event: L{ExceptionEvent} + @param event: Guard page exception event. + + @rtype: bool + @return: C{True} if the address being accessed belongs + to at least one of the buffers that was being watched + and had no action callback. + """ + address = event.get_exception_information(1) + bCondition = False + for bw in self.__ranges: + bMatched = bw.match(address) + try: + action = bw.action + if bMatched and action is not None: + try: + action(event) + except Exception: + e = sys.exc_info()[1] + msg = "Breakpoint action callback %r" " raised an exception: %s" + msg = msg % (action, traceback.format_exc(e)) + warnings.warn(msg, BreakpointCallbackWarning) + else: + bCondition = bCondition or bMatched + finally: + if bMatched and bw.oneshot: + event.debug.dont_watch_buffer(bw) + return bCondition + + +# ============================================================================== + + +class _BreakpointContainer(object): + """ + Encapsulates the capability to contain Breakpoint objects. + + @group Breakpoints: + break_at, watch_variable, watch_buffer, hook_function, + dont_break_at, dont_watch_variable, dont_watch_buffer, + dont_hook_function, unhook_function, + break_on_error, dont_break_on_error + + @group Stalking: + stalk_at, stalk_variable, stalk_buffer, stalk_function, + dont_stalk_at, dont_stalk_variable, dont_stalk_buffer, + dont_stalk_function + + @group Tracing: + is_tracing, get_traced_tids, + start_tracing, stop_tracing, + start_tracing_process, stop_tracing_process, + start_tracing_all, stop_tracing_all + + @group Symbols: + resolve_label, resolve_exported_function + + @group Advanced breakpoint use: + define_code_breakpoint, + define_page_breakpoint, + define_hardware_breakpoint, + has_code_breakpoint, + has_page_breakpoint, + has_hardware_breakpoint, + get_code_breakpoint, + get_page_breakpoint, + get_hardware_breakpoint, + erase_code_breakpoint, + erase_page_breakpoint, + erase_hardware_breakpoint, + enable_code_breakpoint, + enable_page_breakpoint, + enable_hardware_breakpoint, + enable_one_shot_code_breakpoint, + enable_one_shot_page_breakpoint, + enable_one_shot_hardware_breakpoint, + disable_code_breakpoint, + disable_page_breakpoint, + disable_hardware_breakpoint + + @group Listing breakpoints: + get_all_breakpoints, + get_all_code_breakpoints, + get_all_page_breakpoints, + get_all_hardware_breakpoints, + get_process_breakpoints, + get_process_code_breakpoints, + get_process_page_breakpoints, + get_process_hardware_breakpoints, + get_thread_hardware_breakpoints, + get_all_deferred_code_breakpoints, + get_process_deferred_code_breakpoints + + @group Batch operations on breakpoints: + enable_all_breakpoints, + enable_one_shot_all_breakpoints, + disable_all_breakpoints, + erase_all_breakpoints, + enable_process_breakpoints, + enable_one_shot_process_breakpoints, + disable_process_breakpoints, + erase_process_breakpoints + + @group Breakpoint types: + BP_TYPE_ANY, BP_TYPE_CODE, BP_TYPE_PAGE, BP_TYPE_HARDWARE + @group Breakpoint states: + BP_STATE_DISABLED, BP_STATE_ENABLED, BP_STATE_ONESHOT, BP_STATE_RUNNING + @group Memory breakpoint trigger flags: + BP_BREAK_ON_EXECUTION, BP_BREAK_ON_WRITE, BP_BREAK_ON_ACCESS + @group Memory breakpoint size flags: + BP_WATCH_BYTE, BP_WATCH_WORD, BP_WATCH_DWORD, BP_WATCH_QWORD + + @type BP_TYPE_ANY: int + @cvar BP_TYPE_ANY: To get all breakpoints + @type BP_TYPE_CODE: int + @cvar BP_TYPE_CODE: To get code breakpoints only + @type BP_TYPE_PAGE: int + @cvar BP_TYPE_PAGE: To get page breakpoints only + @type BP_TYPE_HARDWARE: int + @cvar BP_TYPE_HARDWARE: To get hardware breakpoints only + + @type BP_STATE_DISABLED: int + @cvar BP_STATE_DISABLED: Breakpoint is disabled. + @type BP_STATE_ENABLED: int + @cvar BP_STATE_ENABLED: Breakpoint is enabled. + @type BP_STATE_ONESHOT: int + @cvar BP_STATE_ONESHOT: Breakpoint is enabled for one shot. + @type BP_STATE_RUNNING: int + @cvar BP_STATE_RUNNING: Breakpoint is running (recently hit). + + @type BP_BREAK_ON_EXECUTION: int + @cvar BP_BREAK_ON_EXECUTION: Break on code execution. + @type BP_BREAK_ON_WRITE: int + @cvar BP_BREAK_ON_WRITE: Break on memory write. + @type BP_BREAK_ON_ACCESS: int + @cvar BP_BREAK_ON_ACCESS: Break on memory read or write. + """ + + # Breakpoint types + BP_TYPE_ANY = 0 # to get all breakpoints + BP_TYPE_CODE = 1 + BP_TYPE_PAGE = 2 + BP_TYPE_HARDWARE = 3 + + # Breakpoint states + BP_STATE_DISABLED = Breakpoint.DISABLED + BP_STATE_ENABLED = Breakpoint.ENABLED + BP_STATE_ONESHOT = Breakpoint.ONESHOT + BP_STATE_RUNNING = Breakpoint.RUNNING + + # Memory breakpoint trigger flags + BP_BREAK_ON_EXECUTION = HardwareBreakpoint.BREAK_ON_EXECUTION + BP_BREAK_ON_WRITE = HardwareBreakpoint.BREAK_ON_WRITE + BP_BREAK_ON_ACCESS = HardwareBreakpoint.BREAK_ON_ACCESS + + # Memory breakpoint size flags + BP_WATCH_BYTE = HardwareBreakpoint.WATCH_BYTE + BP_WATCH_WORD = HardwareBreakpoint.WATCH_WORD + BP_WATCH_QWORD = HardwareBreakpoint.WATCH_QWORD + BP_WATCH_DWORD = HardwareBreakpoint.WATCH_DWORD + + def __init__(self): + self.__codeBP = dict() # (pid, address) -> CodeBreakpoint + self.__pageBP = dict() # (pid, address) -> PageBreakpoint + self.__hardwareBP = dict() # tid -> [ HardwareBreakpoint ] + self.__runningBP = dict() # tid -> set( Breakpoint ) + self.__tracing = set() # set( tid ) + self.__deferredBP = dict() # pid -> label -> (action, oneshot) + + # ------------------------------------------------------------------------------ + + # This operates on the dictionary of running breakpoints. + # Since the bps are meant to stay alive no cleanup is done here. + + def __get_running_bp_set(self, tid): + "Auxiliary method." + return self.__runningBP.get(tid, ()) + + def __add_running_bp(self, tid, bp): + "Auxiliary method." + if tid not in self.__runningBP: + self.__runningBP[tid] = set() + self.__runningBP[tid].add(bp) + + def __del_running_bp(self, tid, bp): + "Auxiliary method." + self.__runningBP[tid].remove(bp) + if not self.__runningBP[tid]: + del self.__runningBP[tid] + + def __del_running_bp_from_all_threads(self, bp): + "Auxiliary method." + for tid, bpset in compat.iteritems(self.__runningBP): + if bp in bpset: + bpset.remove(bp) + self.system.get_thread(tid).clear_tf() + + # ------------------------------------------------------------------------------ + + # This is the cleanup code. Mostly called on response to exit/unload debug + # events. If possible it shouldn't raise exceptions on runtime errors. + # The main goal here is to avoid memory or handle leaks. + + def __cleanup_breakpoint(self, event, bp): + "Auxiliary method." + try: + process = event.get_process() + thread = event.get_thread() + bp.disable(process, thread) # clear the debug regs / trap flag + except Exception: + pass + bp.set_condition(True) # break possible circular reference + bp.set_action(None) # break possible circular reference + + def __cleanup_thread(self, event): + """ + Auxiliary method for L{_notify_exit_thread} + and L{_notify_exit_process}. + """ + tid = event.get_tid() + + # Cleanup running breakpoints + try: + for bp in self.__runningBP[tid]: + self.__cleanup_breakpoint(event, bp) + del self.__runningBP[tid] + except KeyError: + pass + + # Cleanup hardware breakpoints + try: + for bp in self.__hardwareBP[tid]: + self.__cleanup_breakpoint(event, bp) + del self.__hardwareBP[tid] + except KeyError: + pass + + # Cleanup set of threads being traced + if tid in self.__tracing: + self.__tracing.remove(tid) + + def __cleanup_process(self, event): + """ + Auxiliary method for L{_notify_exit_process}. + """ + pid = event.get_pid() + process = event.get_process() + + # Cleanup code breakpoints + for bp_pid, bp_address in compat.keys(self.__codeBP): + if bp_pid == pid: + bp = self.__codeBP[(bp_pid, bp_address)] + self.__cleanup_breakpoint(event, bp) + del self.__codeBP[(bp_pid, bp_address)] + + # Cleanup page breakpoints + for bp_pid, bp_address in compat.keys(self.__pageBP): + if bp_pid == pid: + bp = self.__pageBP[(bp_pid, bp_address)] + self.__cleanup_breakpoint(event, bp) + del self.__pageBP[(bp_pid, bp_address)] + + # Cleanup deferred code breakpoints + try: + del self.__deferredBP[pid] + except KeyError: + pass + + def __cleanup_module(self, event): + """ + Auxiliary method for L{_notify_unload_dll}. + """ + pid = event.get_pid() + process = event.get_process() + module = event.get_module() + + # Cleanup thread breakpoints on this module + for tid in process.iter_thread_ids(): + thread = process.get_thread(tid) + + # Running breakpoints + if tid in self.__runningBP: + bplist = list(self.__runningBP[tid]) + for bp in bplist: + bp_address = bp.get_address() + if process.get_module_at_address(bp_address) == module: + self.__cleanup_breakpoint(event, bp) + self.__runningBP[tid].remove(bp) + + # Hardware breakpoints + if tid in self.__hardwareBP: + bplist = list(self.__hardwareBP[tid]) + for bp in bplist: + bp_address = bp.get_address() + if process.get_module_at_address(bp_address) == module: + self.__cleanup_breakpoint(event, bp) + self.__hardwareBP[tid].remove(bp) + + # Cleanup code breakpoints on this module + for bp_pid, bp_address in compat.keys(self.__codeBP): + if bp_pid == pid: + if process.get_module_at_address(bp_address) == module: + bp = self.__codeBP[(bp_pid, bp_address)] + self.__cleanup_breakpoint(event, bp) + del self.__codeBP[(bp_pid, bp_address)] + + # Cleanup page breakpoints on this module + for bp_pid, bp_address in compat.keys(self.__pageBP): + if bp_pid == pid: + if process.get_module_at_address(bp_address) == module: + bp = self.__pageBP[(bp_pid, bp_address)] + self.__cleanup_breakpoint(event, bp) + del self.__pageBP[(bp_pid, bp_address)] + + # ------------------------------------------------------------------------------ + + # Defining breakpoints. + + # Code breakpoints. + def define_code_breakpoint(self, dwProcessId, address, condition=True, action=None): + """ + Creates a disabled code breakpoint at the given address. + + @see: + L{has_code_breakpoint}, + L{get_code_breakpoint}, + L{enable_code_breakpoint}, + L{enable_one_shot_code_breakpoint}, + L{disable_code_breakpoint}, + L{erase_code_breakpoint} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of the code instruction to break at. + + @type condition: function + @param condition: (Optional) Condition callback function. + + The callback signature is:: + + def condition_callback(event): + return True # returns True or False + + Where B{event} is an L{Event} object, + and the return value is a boolean + (C{True} to dispatch the event, C{False} otherwise). + + @type action: function + @param action: (Optional) Action callback function. + If specified, the event is handled by this callback instead of + being dispatched normally. + + The callback signature is:: + + def action_callback(event): + pass # no return value + + Where B{event} is an L{Event} object, + and the return value is a boolean + (C{True} to dispatch the event, C{False} otherwise). + + @rtype: L{CodeBreakpoint} + @return: The code breakpoint object. + """ + process = self.system.get_process(dwProcessId) + bp = CodeBreakpoint(address, condition, action) + + key = (dwProcessId, bp.get_address()) + if key in self.__codeBP: + msg = "Already exists (PID %d) : %r" + raise KeyError(msg % (dwProcessId, self.__codeBP[key])) + self.__codeBP[key] = bp + return bp + + # Page breakpoints. + def define_page_breakpoint(self, dwProcessId, address, pages=1, condition=True, action=None): + """ + Creates a disabled page breakpoint at the given address. + + @see: + L{has_page_breakpoint}, + L{get_page_breakpoint}, + L{enable_page_breakpoint}, + L{enable_one_shot_page_breakpoint}, + L{disable_page_breakpoint}, + L{erase_page_breakpoint} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of the first page to watch. + + @type pages: int + @param pages: Number of pages to watch. + + @type condition: function + @param condition: (Optional) Condition callback function. + + The callback signature is:: + + def condition_callback(event): + return True # returns True or False + + Where B{event} is an L{Event} object, + and the return value is a boolean + (C{True} to dispatch the event, C{False} otherwise). + + @type action: function + @param action: (Optional) Action callback function. + If specified, the event is handled by this callback instead of + being dispatched normally. + + The callback signature is:: + + def action_callback(event): + pass # no return value + + Where B{event} is an L{Event} object, + and the return value is a boolean + (C{True} to dispatch the event, C{False} otherwise). + + @rtype: L{PageBreakpoint} + @return: The page breakpoint object. + """ + process = self.system.get_process(dwProcessId) + bp = PageBreakpoint(address, pages, condition, action) + begin = bp.get_address() + end = begin + bp.get_size() + + address = begin + pageSize = MemoryAddresses.pageSize + while address < end: + key = (dwProcessId, address) + if key in self.__pageBP: + msg = "Already exists (PID %d) : %r" + msg = msg % (dwProcessId, self.__pageBP[key]) + raise KeyError(msg) + address = address + pageSize + + address = begin + while address < end: + key = (dwProcessId, address) + self.__pageBP[key] = bp + address = address + pageSize + return bp + + # Hardware breakpoints. + def define_hardware_breakpoint( + self, dwThreadId, address, triggerFlag=BP_BREAK_ON_ACCESS, sizeFlag=BP_WATCH_DWORD, condition=True, action=None + ): + """ + Creates a disabled hardware breakpoint at the given address. + + @see: + L{has_hardware_breakpoint}, + L{get_hardware_breakpoint}, + L{enable_hardware_breakpoint}, + L{enable_one_shot_hardware_breakpoint}, + L{disable_hardware_breakpoint}, + L{erase_hardware_breakpoint} + + @note: + Hardware breakpoints do not seem to work properly on VirtualBox. + See U{http://www.virtualbox.org/ticket/477}. + + @type dwThreadId: int + @param dwThreadId: Thread global ID. + + @type address: int + @param address: Memory address to watch. + + @type triggerFlag: int + @param triggerFlag: Trigger of breakpoint. Must be one of the following: + + - L{BP_BREAK_ON_EXECUTION} + + Break on code execution. + + - L{BP_BREAK_ON_WRITE} + + Break on memory read or write. + + - L{BP_BREAK_ON_ACCESS} + + Break on memory write. + + @type sizeFlag: int + @param sizeFlag: Size of breakpoint. Must be one of the following: + + - L{BP_WATCH_BYTE} + + One (1) byte in size. + + - L{BP_WATCH_WORD} + + Two (2) bytes in size. + + - L{BP_WATCH_DWORD} + + Four (4) bytes in size. + + - L{BP_WATCH_QWORD} + + Eight (8) bytes in size. + + @type condition: function + @param condition: (Optional) Condition callback function. + + The callback signature is:: + + def condition_callback(event): + return True # returns True or False + + Where B{event} is an L{Event} object, + and the return value is a boolean + (C{True} to dispatch the event, C{False} otherwise). + + @type action: function + @param action: (Optional) Action callback function. + If specified, the event is handled by this callback instead of + being dispatched normally. + + The callback signature is:: + + def action_callback(event): + pass # no return value + + Where B{event} is an L{Event} object, + and the return value is a boolean + (C{True} to dispatch the event, C{False} otherwise). + + @rtype: L{HardwareBreakpoint} + @return: The hardware breakpoint object. + """ + thread = self.system.get_thread(dwThreadId) + bp = HardwareBreakpoint(address, triggerFlag, sizeFlag, condition, action) + begin = bp.get_address() + end = begin + bp.get_size() + + if dwThreadId in self.__hardwareBP: + bpSet = self.__hardwareBP[dwThreadId] + for oldbp in bpSet: + old_begin = oldbp.get_address() + old_end = old_begin + oldbp.get_size() + if MemoryAddresses.do_ranges_intersect(begin, end, old_begin, old_end): + msg = "Already exists (TID %d) : %r" % (dwThreadId, oldbp) + raise KeyError(msg) + else: + bpSet = set() + self.__hardwareBP[dwThreadId] = bpSet + bpSet.add(bp) + return bp + + # ------------------------------------------------------------------------------ + + # Checking breakpoint definitions. + + def has_code_breakpoint(self, dwProcessId, address): + """ + Checks if a code breakpoint is defined at the given address. + + @see: + L{define_code_breakpoint}, + L{get_code_breakpoint}, + L{erase_code_breakpoint}, + L{enable_code_breakpoint}, + L{enable_one_shot_code_breakpoint}, + L{disable_code_breakpoint} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + + @rtype: bool + @return: C{True} if the breakpoint is defined, C{False} otherwise. + """ + return (dwProcessId, address) in self.__codeBP + + def has_page_breakpoint(self, dwProcessId, address): + """ + Checks if a page breakpoint is defined at the given address. + + @see: + L{define_page_breakpoint}, + L{get_page_breakpoint}, + L{erase_page_breakpoint}, + L{enable_page_breakpoint}, + L{enable_one_shot_page_breakpoint}, + L{disable_page_breakpoint} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + + @rtype: bool + @return: C{True} if the breakpoint is defined, C{False} otherwise. + """ + return (dwProcessId, address) in self.__pageBP + + def has_hardware_breakpoint(self, dwThreadId, address): + """ + Checks if a hardware breakpoint is defined at the given address. + + @see: + L{define_hardware_breakpoint}, + L{get_hardware_breakpoint}, + L{erase_hardware_breakpoint}, + L{enable_hardware_breakpoint}, + L{enable_one_shot_hardware_breakpoint}, + L{disable_hardware_breakpoint} + + @type dwThreadId: int + @param dwThreadId: Thread global ID. + + @type address: int + @param address: Memory address of breakpoint. + + @rtype: bool + @return: C{True} if the breakpoint is defined, C{False} otherwise. + """ + if dwThreadId in self.__hardwareBP: + bpSet = self.__hardwareBP[dwThreadId] + for bp in bpSet: + if bp.get_address() == address: + return True + return False + + # ------------------------------------------------------------------------------ + + # Getting breakpoints. + + def get_code_breakpoint(self, dwProcessId, address): + """ + Returns the internally used breakpoint object, + for the code breakpoint defined at the given address. + + @warning: It's usually best to call the L{Debug} methods + instead of accessing the breakpoint objects directly. + + @see: + L{define_code_breakpoint}, + L{has_code_breakpoint}, + L{enable_code_breakpoint}, + L{enable_one_shot_code_breakpoint}, + L{disable_code_breakpoint}, + L{erase_code_breakpoint} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address where the breakpoint is defined. + + @rtype: L{CodeBreakpoint} + @return: The code breakpoint object. + """ + key = (dwProcessId, address) + if key not in self.__codeBP: + msg = "No breakpoint at process %d, address %s" + address = HexDump.address(address) + raise KeyError(msg % (dwProcessId, address)) + return self.__codeBP[key] + + def get_page_breakpoint(self, dwProcessId, address): + """ + Returns the internally used breakpoint object, + for the page breakpoint defined at the given address. + + @warning: It's usually best to call the L{Debug} methods + instead of accessing the breakpoint objects directly. + + @see: + L{define_page_breakpoint}, + L{has_page_breakpoint}, + L{enable_page_breakpoint}, + L{enable_one_shot_page_breakpoint}, + L{disable_page_breakpoint}, + L{erase_page_breakpoint} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address where the breakpoint is defined. + + @rtype: L{PageBreakpoint} + @return: The page breakpoint object. + """ + key = (dwProcessId, address) + if key not in self.__pageBP: + msg = "No breakpoint at process %d, address %s" + address = HexDump.addresS(address) + raise KeyError(msg % (dwProcessId, address)) + return self.__pageBP[key] + + def get_hardware_breakpoint(self, dwThreadId, address): + """ + Returns the internally used breakpoint object, + for the code breakpoint defined at the given address. + + @warning: It's usually best to call the L{Debug} methods + instead of accessing the breakpoint objects directly. + + @see: + L{define_hardware_breakpoint}, + L{has_hardware_breakpoint}, + L{get_code_breakpoint}, + L{enable_hardware_breakpoint}, + L{enable_one_shot_hardware_breakpoint}, + L{disable_hardware_breakpoint}, + L{erase_hardware_breakpoint} + + @type dwThreadId: int + @param dwThreadId: Thread global ID. + + @type address: int + @param address: Memory address where the breakpoint is defined. + + @rtype: L{HardwareBreakpoint} + @return: The hardware breakpoint object. + """ + if dwThreadId not in self.__hardwareBP: + msg = "No hardware breakpoints set for thread %d" + raise KeyError(msg % dwThreadId) + for bp in self.__hardwareBP[dwThreadId]: + if bp.is_here(address): + return bp + msg = "No hardware breakpoint at thread %d, address %s" + raise KeyError(msg % (dwThreadId, HexDump.address(address))) + + # ------------------------------------------------------------------------------ + + # Enabling and disabling breakpoints. + + def enable_code_breakpoint(self, dwProcessId, address): + """ + Enables the code breakpoint at the given address. + + @see: + L{define_code_breakpoint}, + L{has_code_breakpoint}, + L{enable_one_shot_code_breakpoint}, + L{disable_code_breakpoint} + L{erase_code_breakpoint}, + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + p = self.system.get_process(dwProcessId) + bp = self.get_code_breakpoint(dwProcessId, address) + if bp.is_running(): + self.__del_running_bp_from_all_threads(bp) + bp.enable(p, None) # XXX HACK thread is not used + + def enable_page_breakpoint(self, dwProcessId, address): + """ + Enables the page breakpoint at the given address. + + @see: + L{define_page_breakpoint}, + L{has_page_breakpoint}, + L{get_page_breakpoint}, + L{enable_one_shot_page_breakpoint}, + L{disable_page_breakpoint} + L{erase_page_breakpoint}, + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + p = self.system.get_process(dwProcessId) + bp = self.get_page_breakpoint(dwProcessId, address) + if bp.is_running(): + self.__del_running_bp_from_all_threads(bp) + bp.enable(p, None) # XXX HACK thread is not used + + def enable_hardware_breakpoint(self, dwThreadId, address): + """ + Enables the hardware breakpoint at the given address. + + @see: + L{define_hardware_breakpoint}, + L{has_hardware_breakpoint}, + L{get_hardware_breakpoint}, + L{enable_one_shot_hardware_breakpoint}, + L{disable_hardware_breakpoint} + L{erase_hardware_breakpoint}, + + @note: Do not set hardware breakpoints while processing the system + breakpoint event. + + @type dwThreadId: int + @param dwThreadId: Thread global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + t = self.system.get_thread(dwThreadId) + bp = self.get_hardware_breakpoint(dwThreadId, address) + if bp.is_running(): + self.__del_running_bp_from_all_threads(bp) + bp.enable(None, t) # XXX HACK process is not used + + def enable_one_shot_code_breakpoint(self, dwProcessId, address): + """ + Enables the code breakpoint at the given address for only one shot. + + @see: + L{define_code_breakpoint}, + L{has_code_breakpoint}, + L{get_code_breakpoint}, + L{enable_code_breakpoint}, + L{disable_code_breakpoint} + L{erase_code_breakpoint}, + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + p = self.system.get_process(dwProcessId) + bp = self.get_code_breakpoint(dwProcessId, address) + if bp.is_running(): + self.__del_running_bp_from_all_threads(bp) + bp.one_shot(p, None) # XXX HACK thread is not used + + def enable_one_shot_page_breakpoint(self, dwProcessId, address): + """ + Enables the page breakpoint at the given address for only one shot. + + @see: + L{define_page_breakpoint}, + L{has_page_breakpoint}, + L{get_page_breakpoint}, + L{enable_page_breakpoint}, + L{disable_page_breakpoint} + L{erase_page_breakpoint}, + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + p = self.system.get_process(dwProcessId) + bp = self.get_page_breakpoint(dwProcessId, address) + if bp.is_running(): + self.__del_running_bp_from_all_threads(bp) + bp.one_shot(p, None) # XXX HACK thread is not used + + def enable_one_shot_hardware_breakpoint(self, dwThreadId, address): + """ + Enables the hardware breakpoint at the given address for only one shot. + + @see: + L{define_hardware_breakpoint}, + L{has_hardware_breakpoint}, + L{get_hardware_breakpoint}, + L{enable_hardware_breakpoint}, + L{disable_hardware_breakpoint} + L{erase_hardware_breakpoint}, + + @type dwThreadId: int + @param dwThreadId: Thread global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + t = self.system.get_thread(dwThreadId) + bp = self.get_hardware_breakpoint(dwThreadId, address) + if bp.is_running(): + self.__del_running_bp_from_all_threads(bp) + bp.one_shot(None, t) # XXX HACK process is not used + + def disable_code_breakpoint(self, dwProcessId, address): + """ + Disables the code breakpoint at the given address. + + @see: + L{define_code_breakpoint}, + L{has_code_breakpoint}, + L{get_code_breakpoint}, + L{enable_code_breakpoint} + L{enable_one_shot_code_breakpoint}, + L{erase_code_breakpoint}, + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + p = self.system.get_process(dwProcessId) + bp = self.get_code_breakpoint(dwProcessId, address) + if bp.is_running(): + self.__del_running_bp_from_all_threads(bp) + bp.disable(p, None) # XXX HACK thread is not used + + def disable_page_breakpoint(self, dwProcessId, address): + """ + Disables the page breakpoint at the given address. + + @see: + L{define_page_breakpoint}, + L{has_page_breakpoint}, + L{get_page_breakpoint}, + L{enable_page_breakpoint} + L{enable_one_shot_page_breakpoint}, + L{erase_page_breakpoint}, + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + p = self.system.get_process(dwProcessId) + bp = self.get_page_breakpoint(dwProcessId, address) + if bp.is_running(): + self.__del_running_bp_from_all_threads(bp) + bp.disable(p, None) # XXX HACK thread is not used + + def disable_hardware_breakpoint(self, dwThreadId, address): + """ + Disables the hardware breakpoint at the given address. + + @see: + L{define_hardware_breakpoint}, + L{has_hardware_breakpoint}, + L{get_hardware_breakpoint}, + L{enable_hardware_breakpoint} + L{enable_one_shot_hardware_breakpoint}, + L{erase_hardware_breakpoint}, + + @type dwThreadId: int + @param dwThreadId: Thread global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + t = self.system.get_thread(dwThreadId) + p = t.get_process() + bp = self.get_hardware_breakpoint(dwThreadId, address) + if bp.is_running(): + self.__del_running_bp(dwThreadId, bp) + bp.disable(p, t) + + # ------------------------------------------------------------------------------ + + # Undefining (erasing) breakpoints. + + def erase_code_breakpoint(self, dwProcessId, address): + """ + Erases the code breakpoint at the given address. + + @see: + L{define_code_breakpoint}, + L{has_code_breakpoint}, + L{get_code_breakpoint}, + L{enable_code_breakpoint}, + L{enable_one_shot_code_breakpoint}, + L{disable_code_breakpoint} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + bp = self.get_code_breakpoint(dwProcessId, address) + if not bp.is_disabled(): + self.disable_code_breakpoint(dwProcessId, address) + del self.__codeBP[(dwProcessId, address)] + + def erase_page_breakpoint(self, dwProcessId, address): + """ + Erases the page breakpoint at the given address. + + @see: + L{define_page_breakpoint}, + L{has_page_breakpoint}, + L{get_page_breakpoint}, + L{enable_page_breakpoint}, + L{enable_one_shot_page_breakpoint}, + L{disable_page_breakpoint} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + bp = self.get_page_breakpoint(dwProcessId, address) + begin = bp.get_address() + end = begin + bp.get_size() + if not bp.is_disabled(): + self.disable_page_breakpoint(dwProcessId, address) + address = begin + pageSize = MemoryAddresses.pageSize + while address < end: + del self.__pageBP[(dwProcessId, address)] + address = address + pageSize + + def erase_hardware_breakpoint(self, dwThreadId, address): + """ + Erases the hardware breakpoint at the given address. + + @see: + L{define_hardware_breakpoint}, + L{has_hardware_breakpoint}, + L{get_hardware_breakpoint}, + L{enable_hardware_breakpoint}, + L{enable_one_shot_hardware_breakpoint}, + L{disable_hardware_breakpoint} + + @type dwThreadId: int + @param dwThreadId: Thread global ID. + + @type address: int + @param address: Memory address of breakpoint. + """ + bp = self.get_hardware_breakpoint(dwThreadId, address) + if not bp.is_disabled(): + self.disable_hardware_breakpoint(dwThreadId, address) + bpSet = self.__hardwareBP[dwThreadId] + bpSet.remove(bp) + if not bpSet: + del self.__hardwareBP[dwThreadId] + + # ------------------------------------------------------------------------------ + + # Listing breakpoints. + + def get_all_breakpoints(self): + """ + Returns all breakpoint objects as a list of tuples. + + Each tuple contains: + - Process global ID to which the breakpoint applies. + - Thread global ID to which the breakpoint applies, or C{None}. + - The L{Breakpoint} object itself. + + @note: If you're only interested in a specific breakpoint type, or in + breakpoints for a specific process or thread, it's probably faster + to call one of the following methods: + - L{get_all_code_breakpoints} + - L{get_all_page_breakpoints} + - L{get_all_hardware_breakpoints} + - L{get_process_code_breakpoints} + - L{get_process_page_breakpoints} + - L{get_process_hardware_breakpoints} + - L{get_thread_hardware_breakpoints} + + @rtype: list of tuple( pid, tid, bp ) + @return: List of all breakpoints. + """ + bplist = list() + + # Get the code breakpoints. + for pid, bp in self.get_all_code_breakpoints(): + bplist.append((pid, None, bp)) + + # Get the page breakpoints. + for pid, bp in self.get_all_page_breakpoints(): + bplist.append((pid, None, bp)) + + # Get the hardware breakpoints. + for tid, bp in self.get_all_hardware_breakpoints(): + pid = self.system.get_thread(tid).get_pid() + bplist.append((pid, tid, bp)) + + # Return the list of breakpoints. + return bplist + + def get_all_code_breakpoints(self): + """ + @rtype: list of tuple( int, L{CodeBreakpoint} ) + @return: All code breakpoints as a list of tuples (pid, bp). + """ + return [(pid, bp) for ((pid, address), bp) in compat.iteritems(self.__codeBP)] + + def get_all_page_breakpoints(self): + """ + @rtype: list of tuple( int, L{PageBreakpoint} ) + @return: All page breakpoints as a list of tuples (pid, bp). + """ + ## return list( set( [ (pid, bp) for ((pid, address), bp) in compat.iteritems(self.__pageBP) ] ) ) + result = set() + for (pid, address), bp in compat.iteritems(self.__pageBP): + result.add((pid, bp)) + return list(result) + + def get_all_hardware_breakpoints(self): + """ + @rtype: list of tuple( int, L{HardwareBreakpoint} ) + @return: All hardware breakpoints as a list of tuples (tid, bp). + """ + result = list() + for tid, bplist in compat.iteritems(self.__hardwareBP): + for bp in bplist: + result.append((tid, bp)) + return result + + def get_process_breakpoints(self, dwProcessId): + """ + Returns all breakpoint objects for the given process as a list of tuples. + + Each tuple contains: + - Process global ID to which the breakpoint applies. + - Thread global ID to which the breakpoint applies, or C{None}. + - The L{Breakpoint} object itself. + + @note: If you're only interested in a specific breakpoint type, or in + breakpoints for a specific process or thread, it's probably faster + to call one of the following methods: + - L{get_all_code_breakpoints} + - L{get_all_page_breakpoints} + - L{get_all_hardware_breakpoints} + - L{get_process_code_breakpoints} + - L{get_process_page_breakpoints} + - L{get_process_hardware_breakpoints} + - L{get_thread_hardware_breakpoints} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @rtype: list of tuple( pid, tid, bp ) + @return: List of all breakpoints for the given process. + """ + bplist = list() + + # Get the code breakpoints. + for bp in self.get_process_code_breakpoints(dwProcessId): + bplist.append((dwProcessId, None, bp)) + + # Get the page breakpoints. + for bp in self.get_process_page_breakpoints(dwProcessId): + bplist.append((dwProcessId, None, bp)) + + # Get the hardware breakpoints. + for tid, bp in self.get_process_hardware_breakpoints(dwProcessId): + pid = self.system.get_thread(tid).get_pid() + bplist.append((dwProcessId, tid, bp)) + + # Return the list of breakpoints. + return bplist + + def get_process_code_breakpoints(self, dwProcessId): + """ + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @rtype: list of L{CodeBreakpoint} + @return: All code breakpoints for the given process. + """ + return [bp for ((pid, address), bp) in compat.iteritems(self.__codeBP) if pid == dwProcessId] + + def get_process_page_breakpoints(self, dwProcessId): + """ + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @rtype: list of L{PageBreakpoint} + @return: All page breakpoints for the given process. + """ + return [bp for ((pid, address), bp) in compat.iteritems(self.__pageBP) if pid == dwProcessId] + + def get_thread_hardware_breakpoints(self, dwThreadId): + """ + @see: L{get_process_hardware_breakpoints} + + @type dwThreadId: int + @param dwThreadId: Thread global ID. + + @rtype: list of L{HardwareBreakpoint} + @return: All hardware breakpoints for the given thread. + """ + result = list() + for tid, bplist in compat.iteritems(self.__hardwareBP): + if tid == dwThreadId: + for bp in bplist: + result.append(bp) + return result + + def get_process_hardware_breakpoints(self, dwProcessId): + """ + @see: L{get_thread_hardware_breakpoints} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @rtype: list of tuple( int, L{HardwareBreakpoint} ) + @return: All hardware breakpoints for each thread in the given process + as a list of tuples (tid, bp). + """ + result = list() + aProcess = self.system.get_process(dwProcessId) + for dwThreadId in aProcess.iter_thread_ids(): + if dwThreadId in self.__hardwareBP: + bplist = self.__hardwareBP[dwThreadId] + for bp in bplist: + result.append((dwThreadId, bp)) + return result + + ## def get_all_hooks(self): + ## """ + ## @see: L{get_process_hooks} + ## + ## @rtype: list of tuple( int, int, L{Hook} ) + ## @return: All defined hooks as a list of tuples (pid, address, hook). + ## """ + ## return [ (pid, address, hook) \ + ## for ((pid, address), hook) in self.__hook_objects ] + ## + ## def get_process_hooks(self, dwProcessId): + ## """ + ## @see: L{get_all_hooks} + ## + ## @type dwProcessId: int + ## @param dwProcessId: Process global ID. + ## + ## @rtype: list of tuple( int, int, L{Hook} ) + ## @return: All hooks for the given process as a list of tuples + ## (pid, address, hook). + ## """ + ## return [ (pid, address, hook) \ + ## for ((pid, address), hook) in self.__hook_objects \ + ## if pid == dwProcessId ] + + # ------------------------------------------------------------------------------ + + # Batch operations on all breakpoints. + + def enable_all_breakpoints(self): + """ + Enables all disabled breakpoints in all processes. + + @see: + enable_code_breakpoint, + enable_page_breakpoint, + enable_hardware_breakpoint + """ + + # disable code breakpoints + for pid, bp in self.get_all_code_breakpoints(): + if bp.is_disabled(): + self.enable_code_breakpoint(pid, bp.get_address()) + + # disable page breakpoints + for pid, bp in self.get_all_page_breakpoints(): + if bp.is_disabled(): + self.enable_page_breakpoint(pid, bp.get_address()) + + # disable hardware breakpoints + for tid, bp in self.get_all_hardware_breakpoints(): + if bp.is_disabled(): + self.enable_hardware_breakpoint(tid, bp.get_address()) + + def enable_one_shot_all_breakpoints(self): + """ + Enables for one shot all disabled breakpoints in all processes. + + @see: + enable_one_shot_code_breakpoint, + enable_one_shot_page_breakpoint, + enable_one_shot_hardware_breakpoint + """ + + # disable code breakpoints for one shot + for pid, bp in self.get_all_code_breakpoints(): + if bp.is_disabled(): + self.enable_one_shot_code_breakpoint(pid, bp.get_address()) + + # disable page breakpoints for one shot + for pid, bp in self.get_all_page_breakpoints(): + if bp.is_disabled(): + self.enable_one_shot_page_breakpoint(pid, bp.get_address()) + + # disable hardware breakpoints for one shot + for tid, bp in self.get_all_hardware_breakpoints(): + if bp.is_disabled(): + self.enable_one_shot_hardware_breakpoint(tid, bp.get_address()) + + def disable_all_breakpoints(self): + """ + Disables all breakpoints in all processes. + + @see: + disable_code_breakpoint, + disable_page_breakpoint, + disable_hardware_breakpoint + """ + + # disable code breakpoints + for pid, bp in self.get_all_code_breakpoints(): + self.disable_code_breakpoint(pid, bp.get_address()) + + # disable page breakpoints + for pid, bp in self.get_all_page_breakpoints(): + self.disable_page_breakpoint(pid, bp.get_address()) + + # disable hardware breakpoints + for tid, bp in self.get_all_hardware_breakpoints(): + self.disable_hardware_breakpoint(tid, bp.get_address()) + + def erase_all_breakpoints(self): + """ + Erases all breakpoints in all processes. + + @see: + erase_code_breakpoint, + erase_page_breakpoint, + erase_hardware_breakpoint + """ + + # This should be faster but let's not trust the GC so much :P + # self.disable_all_breakpoints() + # self.__codeBP = dict() + # self.__pageBP = dict() + # self.__hardwareBP = dict() + # self.__runningBP = dict() + # self.__hook_objects = dict() + + ## # erase hooks + ## for (pid, address, hook) in self.get_all_hooks(): + ## self.dont_hook_function(pid, address) + + # erase code breakpoints + for pid, bp in self.get_all_code_breakpoints(): + self.erase_code_breakpoint(pid, bp.get_address()) + + # erase page breakpoints + for pid, bp in self.get_all_page_breakpoints(): + self.erase_page_breakpoint(pid, bp.get_address()) + + # erase hardware breakpoints + for tid, bp in self.get_all_hardware_breakpoints(): + self.erase_hardware_breakpoint(tid, bp.get_address()) + + # ------------------------------------------------------------------------------ + + # Batch operations on breakpoints per process. + + def enable_process_breakpoints(self, dwProcessId): + """ + Enables all disabled breakpoints for the given process. + + @type dwProcessId: int + @param dwProcessId: Process global ID. + """ + + # enable code breakpoints + for bp in self.get_process_code_breakpoints(dwProcessId): + if bp.is_disabled(): + self.enable_code_breakpoint(dwProcessId, bp.get_address()) + + # enable page breakpoints + for bp in self.get_process_page_breakpoints(dwProcessId): + if bp.is_disabled(): + self.enable_page_breakpoint(dwProcessId, bp.get_address()) + + # enable hardware breakpoints + if self.system.has_process(dwProcessId): + aProcess = self.system.get_process(dwProcessId) + else: + aProcess = Process(dwProcessId) + aProcess.scan_threads() + for aThread in aProcess.iter_threads(): + dwThreadId = aThread.get_tid() + for bp in self.get_thread_hardware_breakpoints(dwThreadId): + if bp.is_disabled(): + self.enable_hardware_breakpoint(dwThreadId, bp.get_address()) + + def enable_one_shot_process_breakpoints(self, dwProcessId): + """ + Enables for one shot all disabled breakpoints for the given process. + + @type dwProcessId: int + @param dwProcessId: Process global ID. + """ + + # enable code breakpoints for one shot + for bp in self.get_process_code_breakpoints(dwProcessId): + if bp.is_disabled(): + self.enable_one_shot_code_breakpoint(dwProcessId, bp.get_address()) + + # enable page breakpoints for one shot + for bp in self.get_process_page_breakpoints(dwProcessId): + if bp.is_disabled(): + self.enable_one_shot_page_breakpoint(dwProcessId, bp.get_address()) + + # enable hardware breakpoints for one shot + if self.system.has_process(dwProcessId): + aProcess = self.system.get_process(dwProcessId) + else: + aProcess = Process(dwProcessId) + aProcess.scan_threads() + for aThread in aProcess.iter_threads(): + dwThreadId = aThread.get_tid() + for bp in self.get_thread_hardware_breakpoints(dwThreadId): + if bp.is_disabled(): + self.enable_one_shot_hardware_breakpoint(dwThreadId, bp.get_address()) + + def disable_process_breakpoints(self, dwProcessId): + """ + Disables all breakpoints for the given process. + + @type dwProcessId: int + @param dwProcessId: Process global ID. + """ + + # disable code breakpoints + for bp in self.get_process_code_breakpoints(dwProcessId): + self.disable_code_breakpoint(dwProcessId, bp.get_address()) + + # disable page breakpoints + for bp in self.get_process_page_breakpoints(dwProcessId): + self.disable_page_breakpoint(dwProcessId, bp.get_address()) + + # disable hardware breakpoints + if self.system.has_process(dwProcessId): + aProcess = self.system.get_process(dwProcessId) + else: + aProcess = Process(dwProcessId) + aProcess.scan_threads() + for aThread in aProcess.iter_threads(): + dwThreadId = aThread.get_tid() + for bp in self.get_thread_hardware_breakpoints(dwThreadId): + self.disable_hardware_breakpoint(dwThreadId, bp.get_address()) + + def erase_process_breakpoints(self, dwProcessId): + """ + Erases all breakpoints for the given process. + + @type dwProcessId: int + @param dwProcessId: Process global ID. + """ + + # disable breakpoints first + # if an error occurs, no breakpoint is erased + self.disable_process_breakpoints(dwProcessId) + + ## # erase hooks + ## for address, hook in self.get_process_hooks(dwProcessId): + ## self.dont_hook_function(dwProcessId, address) + + # erase code breakpoints + for bp in self.get_process_code_breakpoints(dwProcessId): + self.erase_code_breakpoint(dwProcessId, bp.get_address()) + + # erase page breakpoints + for bp in self.get_process_page_breakpoints(dwProcessId): + self.erase_page_breakpoint(dwProcessId, bp.get_address()) + + # erase hardware breakpoints + if self.system.has_process(dwProcessId): + aProcess = self.system.get_process(dwProcessId) + else: + aProcess = Process(dwProcessId) + aProcess.scan_threads() + for aThread in aProcess.iter_threads(): + dwThreadId = aThread.get_tid() + for bp in self.get_thread_hardware_breakpoints(dwThreadId): + self.erase_hardware_breakpoint(dwThreadId, bp.get_address()) + + # ------------------------------------------------------------------------------ + + # Internal handlers of debug events. + + def _notify_guard_page(self, event): + """ + Notify breakpoints of a guard page exception event. + + @type event: L{ExceptionEvent} + @param event: Guard page exception event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + address = event.get_fault_address() + pid = event.get_pid() + bCallHandler = True + + # Align address to page boundary. + mask = ~(MemoryAddresses.pageSize - 1) + address = address & mask + + # Do we have an active page breakpoint there? + key = (pid, address) + if key in self.__pageBP: + bp = self.__pageBP[key] + if bp.is_enabled() or bp.is_one_shot(): + # Breakpoint is ours. + event.continueStatus = win32.DBG_CONTINUE + ## event.continueStatus = win32.DBG_EXCEPTION_HANDLED + + # Hit the breakpoint. + bp.hit(event) + + # Remember breakpoints in RUNNING state. + if bp.is_running(): + tid = event.get_tid() + self.__add_running_bp(tid, bp) + + # Evaluate the breakpoint condition. + bCondition = bp.eval_condition(event) + + # If the breakpoint is automatic, run the action. + # If not, notify the user. + if bCondition and bp.is_automatic(): + bp.run_action(event) + bCallHandler = False + else: + bCallHandler = bCondition + + # If we don't have a breakpoint here pass the exception to the debugee. + # This is a normally occurring exception so we shouldn't swallow it. + else: + event.continueStatus = win32.DBG_EXCEPTION_NOT_HANDLED + + return bCallHandler + + def _notify_breakpoint(self, event): + """ + Notify breakpoints of a breakpoint exception event. + + @type event: L{ExceptionEvent} + @param event: Breakpoint exception event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + address = event.get_exception_address() + pid = event.get_pid() + bCallHandler = True + + # Do we have an active code breakpoint there? + key = (pid, address) + if key in self.__codeBP: + bp = self.__codeBP[key] + if not bp.is_disabled(): + # Change the program counter (PC) to the exception address. + # This accounts for the change in PC caused by + # executing the breakpoint instruction, no matter + # the size of it. + aThread = event.get_thread() + aThread.set_pc(address) + + # Swallow the exception. + event.continueStatus = win32.DBG_CONTINUE + + # Hit the breakpoint. + bp.hit(event) + + # Remember breakpoints in RUNNING state. + if bp.is_running(): + tid = event.get_tid() + self.__add_running_bp(tid, bp) + + # Evaluate the breakpoint condition. + bCondition = bp.eval_condition(event) + + # If the breakpoint is automatic, run the action. + # If not, notify the user. + if bCondition and bp.is_automatic(): + bCallHandler = bp.run_action(event) + else: + bCallHandler = bCondition + + # Handle the system breakpoint. + # TODO: examine the stack trace to figure out if it's really a + # system breakpoint or an antidebug trick. The caller should be + # inside ntdll if it's legit. + elif event.get_process().is_system_defined_breakpoint(address): + event.continueStatus = win32.DBG_CONTINUE + + # In hostile mode, if we don't have a breakpoint here pass the + # exception to the debugee. In normal mode assume all breakpoint + # exceptions are to be handled by the debugger. + else: + if self.in_hostile_mode(): + event.continueStatus = win32.DBG_EXCEPTION_NOT_HANDLED + else: + event.continueStatus = win32.DBG_CONTINUE + + return bCallHandler + + def _notify_single_step(self, event): + """ + Notify breakpoints of a single step exception event. + + @type event: L{ExceptionEvent} + @param event: Single step exception event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + pid = event.get_pid() + tid = event.get_tid() + aThread = event.get_thread() + aProcess = event.get_process() + bCallHandler = True + bIsOurs = False + + # In hostile mode set the default to pass the exception to the debugee. + # If we later determine the exception is ours, hide it instead. + old_continueStatus = event.continueStatus + try: + if self.in_hostile_mode(): + event.continueStatus = win32.DBG_EXCEPTION_NOT_HANDLED + + # Single step support is implemented on x86/x64 architectures only. + if self.system.arch not in (win32.ARCH_I386, win32.ARCH_AMD64): + return bCallHandler + + # In hostile mode, read the last executed bytes to try to detect + # some antidebug tricks. Skip this check in normal mode because + # it'd slow things down. + # + # FIXME: weird opcode encodings may bypass this check! + # + # bFakeSingleStep: Ice Breakpoint undocumented instruction. + # bHideTrapFlag: Don't let pushf instructions get the real value of + # the trap flag. + # bNextIsPopFlags: Don't let popf instructions clear the trap flag. + # + bFakeSingleStep = False + bLastIsPushFlags = False + bNextIsPopFlags = False + if self.in_hostile_mode(): + pc = aThread.get_pc() + c = aProcess.read_char(pc - 1) + if c == 0xF1: # int1 + bFakeSingleStep = True + elif c == 0x9C: # pushf + bLastIsPushFlags = True + c = aProcess.peek_char(pc) + if c == 0x66: # the only valid prefix for popf + c = aProcess.peek_char(pc + 1) + if c == 0x9D: # popf + if bLastIsPushFlags: + bLastIsPushFlags = False # they cancel each other out + else: + bNextIsPopFlags = True + + # When the thread is in tracing mode, + # don't pass the exception to the debugee + # and set the trap flag again. + if self.is_tracing(tid): + bIsOurs = True + if not bFakeSingleStep: + event.continueStatus = win32.DBG_CONTINUE + aThread.set_tf() + + # Don't let the debugee read or write the trap flag. + # This code works in 32 and 64 bits thanks to the endianness. + if bLastIsPushFlags or bNextIsPopFlags: + sp = aThread.get_sp() + flags = aProcess.read_dword(sp) + if bLastIsPushFlags: + flags &= ~Thread.Flags.Trap + else: # if bNextIsPopFlags: + flags |= Thread.Flags.Trap + aProcess.write_dword(sp, flags) + + # Handle breakpoints in RUNNING state. + running = self.__get_running_bp_set(tid) + if running: + bIsOurs = True + if not bFakeSingleStep: + event.continueStatus = win32.DBG_CONTINUE + bCallHandler = False + while running: + try: + running.pop().hit(event) + except Exception: + e = sys.exc_info()[1] + warnings.warn(str(e), BreakpointWarning) + + # Handle hardware breakpoints. + if tid in self.__hardwareBP: + ctx = aThread.get_context(win32.CONTEXT_DEBUG_REGISTERS) + Dr6 = ctx["Dr6"] + ctx["Dr6"] = Dr6 & DebugRegister.clearHitMask + aThread.set_context(ctx) + bFoundBreakpoint = False + bCondition = False + hwbpList = [bp for bp in self.__hardwareBP[tid]] + for bp in hwbpList: + if not bp in self.__hardwareBP[tid]: + continue # it was removed by a user-defined callback + slot = bp.get_slot() + if (slot is not None) and (Dr6 & DebugRegister.hitMask[slot]): + if not bFoundBreakpoint: # set before actions are called + if not bFakeSingleStep: + event.continueStatus = win32.DBG_CONTINUE + bFoundBreakpoint = True + bIsOurs = True + bp.hit(event) + if bp.is_running(): + self.__add_running_bp(tid, bp) + bThisCondition = bp.eval_condition(event) + if bThisCondition and bp.is_automatic(): + bp.run_action(event) + bThisCondition = False + bCondition = bCondition or bThisCondition + if bFoundBreakpoint: + bCallHandler = bCondition + + # Always call the user-defined handler + # when the thread is in tracing mode. + if self.is_tracing(tid): + bCallHandler = True + + # If we're not in hostile mode, by default we assume all single + # step exceptions are caused by the debugger. + if not bIsOurs and not self.in_hostile_mode(): + aThread.clear_tf() + + # If the user hit Control-C while we were inside the try block, + # set the default continueStatus back. + except: + event.continueStatus = old_continueStatus + raise + + return bCallHandler + + def _notify_load_dll(self, event): + """ + Notify the loading of a DLL. + + @type event: L{LoadDLLEvent} + @param event: Load DLL event. + + @rtype: bool + @return: C{True} to call the user-defined handler, C{False} otherwise. + """ + self.__set_deferred_breakpoints(event) + return True + + def _notify_unload_dll(self, event): + """ + Notify the unloading of a DLL. + + @type event: L{UnloadDLLEvent} + @param event: Unload DLL event. + + @rtype: bool + @return: C{True} to call the user-defined handler, C{False} otherwise. + """ + self.__cleanup_module(event) + return True + + def _notify_exit_thread(self, event): + """ + Notify the termination of a thread. + + @type event: L{ExitThreadEvent} + @param event: Exit thread event. + + @rtype: bool + @return: C{True} to call the user-defined handler, C{False} otherwise. + """ + self.__cleanup_thread(event) + return True + + def _notify_exit_process(self, event): + """ + Notify the termination of a process. + + @type event: L{ExitProcessEvent} + @param event: Exit process event. + + @rtype: bool + @return: C{True} to call the user-defined handler, C{False} otherwise. + """ + self.__cleanup_process(event) + self.__cleanup_thread(event) + return True + + # ------------------------------------------------------------------------------ + + # This is the high level breakpoint interface. Here we don't have to care + # about defining or enabling breakpoints, and many errors are ignored + # (like for example setting the same breakpoint twice, here the second + # breakpoint replaces the first, much like in WinDBG). It should be easier + # and more intuitive, if less detailed. It also allows the use of deferred + # breakpoints. + + # ------------------------------------------------------------------------------ + + # Code breakpoints + + def __set_break(self, pid, address, action, oneshot): + """ + Used by L{break_at} and L{stalk_at}. + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_code_breakpoint} for more details. + + @type oneshot: bool + @param oneshot: C{True} for one-shot breakpoints, C{False} otherwise. + + @rtype: L{Breakpoint} + @return: Returns the new L{Breakpoint} object, or C{None} if the label + couldn't be resolved and the breakpoint was deferred. Deferred + breakpoints are set when the DLL they point to is loaded. + """ + if type(address) not in (int, long): + label = address + try: + address = self.system.get_process(pid).resolve_label(address) + if not address: + raise Exception() + except Exception: + try: + deferred = self.__deferredBP[pid] + except KeyError: + deferred = dict() + self.__deferredBP[pid] = deferred + if label in deferred: + msg = "Redefined deferred code breakpoint at %s in process ID %d" + msg = msg % (label, pid) + warnings.warn(msg, BreakpointWarning) + deferred[label] = (action, oneshot) + return None + if self.has_code_breakpoint(pid, address): + bp = self.get_code_breakpoint(pid, address) + if bp.get_action() != action: # can't use "is not", fails for bound methods + bp.set_action(action) + msg = "Redefined code breakpoint at %s in process ID %d" + msg = msg % (label, pid) + warnings.warn(msg, BreakpointWarning) + else: + self.define_code_breakpoint(pid, address, True, action) + bp = self.get_code_breakpoint(pid, address) + if oneshot: + if not bp.is_one_shot(): + self.enable_one_shot_code_breakpoint(pid, address) + else: + if not bp.is_enabled(): + self.enable_code_breakpoint(pid, address) + return bp + + def __clear_break(self, pid, address): + """ + Used by L{dont_break_at} and L{dont_stalk_at}. + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + """ + if type(address) not in (int, long): + unknown = True + label = address + try: + deferred = self.__deferredBP[pid] + del deferred[label] + unknown = False + except KeyError: + ## traceback.print_last() # XXX DEBUG + pass + aProcess = self.system.get_process(pid) + try: + address = aProcess.resolve_label(label) + if not address: + raise Exception() + except Exception: + ## traceback.print_last() # XXX DEBUG + if unknown: + msg = "Can't clear unknown code breakpoint" " at %s in process ID %d" + msg = msg % (label, pid) + warnings.warn(msg, BreakpointWarning) + return + if self.has_code_breakpoint(pid, address): + self.erase_code_breakpoint(pid, address) + + def __set_deferred_breakpoints(self, event): + """ + Used internally. Sets all deferred breakpoints for a DLL when it's + loaded. + + @type event: L{LoadDLLEvent} + @param event: Load DLL event. + """ + pid = event.get_pid() + try: + deferred = self.__deferredBP[pid] + except KeyError: + return + aProcess = event.get_process() + for label, (action, oneshot) in deferred.items(): + try: + address = aProcess.resolve_label(label) + except Exception: + continue + del deferred[label] + try: + self.__set_break(pid, address, action, oneshot) + except Exception: + msg = "Can't set deferred breakpoint %s at process ID %d" + msg = msg % (label, pid) + warnings.warn(msg, BreakpointWarning) + + def get_all_deferred_code_breakpoints(self): + """ + Returns a list of deferred code breakpoints. + + @rtype: tuple of (int, str, callable, bool) + @return: Tuple containing the following elements: + - Process ID where to set the breakpoint. + - Label pointing to the address where to set the breakpoint. + - Action callback for the breakpoint. + - C{True} of the breakpoint is one-shot, C{False} otherwise. + """ + result = [] + for pid, deferred in compat.iteritems(self.__deferredBP): + for label, (action, oneshot) in compat.iteritems(deferred): + result.add((pid, label, action, oneshot)) + return result + + def get_process_deferred_code_breakpoints(self, dwProcessId): + """ + Returns a list of deferred code breakpoints. + + @type dwProcessId: int + @param dwProcessId: Process ID. + + @rtype: tuple of (int, str, callable, bool) + @return: Tuple containing the following elements: + - Label pointing to the address where to set the breakpoint. + - Action callback for the breakpoint. + - C{True} of the breakpoint is one-shot, C{False} otherwise. + """ + return [(label, action, oneshot) for (label, (action, oneshot)) in compat.iteritems(self.__deferredBP.get(dwProcessId, {}))] + + def stalk_at(self, pid, address, action=None): + """ + Sets a one shot code breakpoint at the given process and address. + + If instead of an address you pass a label, the breakpoint may be + deferred until the DLL it points to is loaded. + + @see: L{break_at}, L{dont_stalk_at} + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_code_breakpoint} for more details. + + @rtype: bool + @return: C{True} if the breakpoint was set immediately, or C{False} if + it was deferred. + """ + bp = self.__set_break(pid, address, action, oneshot=True) + return bp is not None + + def break_at(self, pid, address, action=None): + """ + Sets a code breakpoint at the given process and address. + + If instead of an address you pass a label, the breakpoint may be + deferred until the DLL it points to is loaded. + + @see: L{stalk_at}, L{dont_break_at} + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_code_breakpoint} for more details. + + @rtype: bool + @return: C{True} if the breakpoint was set immediately, or C{False} if + it was deferred. + """ + bp = self.__set_break(pid, address, action, oneshot=False) + return bp is not None + + def dont_break_at(self, pid, address): + """ + Clears a code breakpoint set by L{break_at}. + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + """ + self.__clear_break(pid, address) + + def dont_stalk_at(self, pid, address): + """ + Clears a code breakpoint set by L{stalk_at}. + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + """ + self.__clear_break(pid, address) + + # ------------------------------------------------------------------------------ + + # Function hooks + + def hook_function(self, pid, address, preCB=None, postCB=None, paramCount=None, signature=None): + """ + Sets a function hook at the given address. + + If instead of an address you pass a label, the hook may be + deferred until the DLL it points to is loaded. + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + + @type preCB: function + @param preCB: (Optional) Callback triggered on function entry. + + The signature for the callback should be something like this:: + + def pre_LoadLibraryEx(event, ra, lpFilename, hFile, dwFlags): + + # return address + ra = params[0] + + # function arguments start from here... + szFilename = event.get_process().peek_string(lpFilename) + + # (...) + + Note that all pointer types are treated like void pointers, so your + callback won't get the string or structure pointed to by it, but + the remote memory address instead. This is so to prevent the ctypes + library from being "too helpful" and trying to dereference the + pointer. To get the actual data being pointed to, use one of the + L{Process.read} methods. + + @type postCB: function + @param postCB: (Optional) Callback triggered on function exit. + + The signature for the callback should be something like this:: + + def post_LoadLibraryEx(event, return_value): + + # (...) + + @type paramCount: int + @param paramCount: + (Optional) Number of parameters for the C{preCB} callback, + not counting the return address. Parameters are read from + the stack and assumed to be DWORDs in 32 bits and QWORDs in 64. + + This is a faster way to pull stack parameters in 32 bits, but in 64 + bits (or with some odd APIs in 32 bits) it won't be useful, since + not all arguments to the hooked function will be of the same size. + + For a more reliable and cross-platform way of hooking use the + C{signature} argument instead. + + @type signature: tuple + @param signature: + (Optional) Tuple of C{ctypes} data types that constitute the + hooked function signature. When the function is called, this will + be used to parse the arguments from the stack. Overrides the + C{paramCount} argument. + + @rtype: bool + @return: C{True} if the hook was set immediately, or C{False} if + it was deferred. + """ + try: + aProcess = self.system.get_process(pid) + except KeyError: + aProcess = Process(pid) + arch = aProcess.get_arch() + hookObj = Hook(preCB, postCB, paramCount, signature, arch) + bp = self.break_at(pid, address, hookObj) + return bp is not None + + def stalk_function(self, pid, address, preCB=None, postCB=None, paramCount=None, signature=None): + """ + Sets a one-shot function hook at the given address. + + If instead of an address you pass a label, the hook may be + deferred until the DLL it points to is loaded. + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + + @type preCB: function + @param preCB: (Optional) Callback triggered on function entry. + + The signature for the callback should be something like this:: + + def pre_LoadLibraryEx(event, ra, lpFilename, hFile, dwFlags): + + # return address + ra = params[0] + + # function arguments start from here... + szFilename = event.get_process().peek_string(lpFilename) + + # (...) + + Note that all pointer types are treated like void pointers, so your + callback won't get the string or structure pointed to by it, but + the remote memory address instead. This is so to prevent the ctypes + library from being "too helpful" and trying to dereference the + pointer. To get the actual data being pointed to, use one of the + L{Process.read} methods. + + @type postCB: function + @param postCB: (Optional) Callback triggered on function exit. + + The signature for the callback should be something like this:: + + def post_LoadLibraryEx(event, return_value): + + # (...) + + @type paramCount: int + @param paramCount: + (Optional) Number of parameters for the C{preCB} callback, + not counting the return address. Parameters are read from + the stack and assumed to be DWORDs in 32 bits and QWORDs in 64. + + This is a faster way to pull stack parameters in 32 bits, but in 64 + bits (or with some odd APIs in 32 bits) it won't be useful, since + not all arguments to the hooked function will be of the same size. + + For a more reliable and cross-platform way of hooking use the + C{signature} argument instead. + + @type signature: tuple + @param signature: + (Optional) Tuple of C{ctypes} data types that constitute the + hooked function signature. When the function is called, this will + be used to parse the arguments from the stack. Overrides the + C{paramCount} argument. + + @rtype: bool + @return: C{True} if the breakpoint was set immediately, or C{False} if + it was deferred. + """ + try: + aProcess = self.system.get_process(pid) + except KeyError: + aProcess = Process(pid) + arch = aProcess.get_arch() + hookObj = Hook(preCB, postCB, paramCount, signature, arch) + bp = self.stalk_at(pid, address, hookObj) + return bp is not None + + def dont_hook_function(self, pid, address): + """ + Removes a function hook set by L{hook_function}. + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + """ + self.dont_break_at(pid, address) + + # alias + unhook_function = dont_hook_function + + def dont_stalk_function(self, pid, address): + """ + Removes a function hook set by L{stalk_function}. + + @type pid: int + @param pid: Process global ID. + + @type address: int or str + @param address: + Memory address of code instruction to break at. It can be an + integer value for the actual address or a string with a label + to be resolved. + """ + self.dont_stalk_at(pid, address) + + # ------------------------------------------------------------------------------ + + # Variable watches + + def __set_variable_watch(self, tid, address, size, action): + """ + Used by L{watch_variable} and L{stalk_variable}. + + @type tid: int + @param tid: Thread global ID. + + @type address: int + @param address: Memory address of variable to watch. + + @type size: int + @param size: Size of variable to watch. The only supported sizes are: + byte (1), word (2), dword (4) and qword (8). + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_hardware_breakpoint} for more details. + + @rtype: L{HardwareBreakpoint} + @return: Hardware breakpoint at the requested address. + """ + + # TODO + # We should merge the breakpoints instead of overwriting them. + # We'll have the same problem as watch_buffer and we'll need to change + # the API again. + + if size == 1: + sizeFlag = self.BP_WATCH_BYTE + elif size == 2: + sizeFlag = self.BP_WATCH_WORD + elif size == 4: + sizeFlag = self.BP_WATCH_DWORD + elif size == 8: + sizeFlag = self.BP_WATCH_QWORD + else: + raise ValueError("Bad size for variable watch: %r" % size) + + if self.has_hardware_breakpoint(tid, address): + warnings.warn( + "Hardware breakpoint in thread %d at address %s was overwritten!" + % (tid, HexDump.address(address, self.system.get_thread(tid).get_bits())), + BreakpointWarning, + ) + + bp = self.get_hardware_breakpoint(tid, address) + if bp.get_trigger() != self.BP_BREAK_ON_ACCESS or bp.get_watch() != sizeFlag: + self.erase_hardware_breakpoint(tid, address) + self.define_hardware_breakpoint(tid, address, self.BP_BREAK_ON_ACCESS, sizeFlag, True, action) + bp = self.get_hardware_breakpoint(tid, address) + + else: + self.define_hardware_breakpoint(tid, address, self.BP_BREAK_ON_ACCESS, sizeFlag, True, action) + bp = self.get_hardware_breakpoint(tid, address) + + return bp + + def __clear_variable_watch(self, tid, address): + """ + Used by L{dont_watch_variable} and L{dont_stalk_variable}. + + @type tid: int + @param tid: Thread global ID. + + @type address: int + @param address: Memory address of variable to stop watching. + """ + if self.has_hardware_breakpoint(tid, address): + self.erase_hardware_breakpoint(tid, address) + + def watch_variable(self, tid, address, size, action=None): + """ + Sets a hardware breakpoint at the given thread, address and size. + + @see: L{dont_watch_variable} + + @type tid: int + @param tid: Thread global ID. + + @type address: int + @param address: Memory address of variable to watch. + + @type size: int + @param size: Size of variable to watch. The only supported sizes are: + byte (1), word (2), dword (4) and qword (8). + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_hardware_breakpoint} for more details. + """ + bp = self.__set_variable_watch(tid, address, size, action) + if not bp.is_enabled(): + self.enable_hardware_breakpoint(tid, address) + + def stalk_variable(self, tid, address, size, action=None): + """ + Sets a one-shot hardware breakpoint at the given thread, + address and size. + + @see: L{dont_watch_variable} + + @type tid: int + @param tid: Thread global ID. + + @type address: int + @param address: Memory address of variable to watch. + + @type size: int + @param size: Size of variable to watch. The only supported sizes are: + byte (1), word (2), dword (4) and qword (8). + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_hardware_breakpoint} for more details. + """ + bp = self.__set_variable_watch(tid, address, size, action) + if not bp.is_one_shot(): + self.enable_one_shot_hardware_breakpoint(tid, address) + + def dont_watch_variable(self, tid, address): + """ + Clears a hardware breakpoint set by L{watch_variable}. + + @type tid: int + @param tid: Thread global ID. + + @type address: int + @param address: Memory address of variable to stop watching. + """ + self.__clear_variable_watch(tid, address) + + def dont_stalk_variable(self, tid, address): + """ + Clears a hardware breakpoint set by L{stalk_variable}. + + @type tid: int + @param tid: Thread global ID. + + @type address: int + @param address: Memory address of variable to stop watching. + """ + self.__clear_variable_watch(tid, address) + + # ------------------------------------------------------------------------------ + + # Buffer watches + + def __set_buffer_watch(self, pid, address, size, action, bOneShot): + """ + Used by L{watch_buffer} and L{stalk_buffer}. + + @type pid: int + @param pid: Process global ID. + + @type address: int + @param address: Memory address of buffer to watch. + + @type size: int + @param size: Size in bytes of buffer to watch. + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_page_breakpoint} for more details. + + @type bOneShot: bool + @param bOneShot: + C{True} to set a one-shot breakpoint, + C{False} to set a normal breakpoint. + """ + + # Check the size isn't zero or negative. + if size < 1: + raise ValueError("Bad size for buffer watch: %r" % size) + + # Create the buffer watch identifier. + bw = BufferWatch(pid, address, address + size, action, bOneShot) + + # Get the base address and size in pages required for this buffer. + base = MemoryAddresses.align_address_to_page_start(address) + limit = MemoryAddresses.align_address_to_page_end(address + size) + pages = MemoryAddresses.get_buffer_size_in_pages(address, size) + + try: + # For each page: + # + if a page breakpoint exists reuse it + # + if it doesn't exist define it + + bset = set() # all breakpoints used + nset = set() # newly defined breakpoints + cset = set() # condition objects + + page_addr = base + pageSize = MemoryAddresses.pageSize + while page_addr < limit: + # If a breakpoints exists, reuse it. + if self.has_page_breakpoint(pid, page_addr): + bp = self.get_page_breakpoint(pid, page_addr) + if bp not in bset: + condition = bp.get_condition() + if not condition in cset: + if not isinstance(condition, _BufferWatchCondition): + # this shouldn't happen unless you tinkered + # with it or defined your own page breakpoints + # manually. + msg = "Can't watch buffer at page %s" + msg = msg % HexDump.address(page_addr) + raise RuntimeError(msg) + cset.add(condition) + bset.add(bp) + + # If it doesn't, define it. + else: + condition = _BufferWatchCondition() + bp = self.define_page_breakpoint(pid, page_addr, 1, condition=condition) + bset.add(bp) + nset.add(bp) + cset.add(condition) + + # Next page. + page_addr = page_addr + pageSize + + # For each breakpoint, enable it if needed. + aProcess = self.system.get_process(pid) + for bp in bset: + if bp.is_disabled() or bp.is_one_shot(): + bp.enable(aProcess, None) + + # On error... + except: + # Erase the newly defined breakpoints. + for bp in nset: + try: + self.erase_page_breakpoint(pid, bp.get_address()) + except: + pass + + # Pass the exception to the caller + raise + + # For each condition object, add the new buffer. + for condition in cset: + condition.add(bw) + + def __clear_buffer_watch_old_method(self, pid, address, size): + """ + Used by L{dont_watch_buffer} and L{dont_stalk_buffer}. + + @warn: Deprecated since WinAppDbg 1.5. + + @type pid: int + @param pid: Process global ID. + + @type address: int + @param address: Memory address of buffer to stop watching. + + @type size: int + @param size: Size in bytes of buffer to stop watching. + """ + warnings.warn("Deprecated since WinAppDbg 1.5", DeprecationWarning) + + # Check the size isn't zero or negative. + if size < 1: + raise ValueError("Bad size for buffer watch: %r" % size) + + # Get the base address and size in pages required for this buffer. + base = MemoryAddresses.align_address_to_page_start(address) + limit = MemoryAddresses.align_address_to_page_end(address + size) + pages = MemoryAddresses.get_buffer_size_in_pages(address, size) + + # For each page, get the breakpoint and it's condition object. + # For each condition, remove the buffer. + # For each breakpoint, if no buffers are on watch, erase it. + cset = set() # condition objects + page_addr = base + pageSize = MemoryAddresses.pageSize + while page_addr < limit: + if self.has_page_breakpoint(pid, page_addr): + bp = self.get_page_breakpoint(pid, page_addr) + condition = bp.get_condition() + if condition not in cset: + if not isinstance(condition, _BufferWatchCondition): + # this shouldn't happen unless you tinkered with it + # or defined your own page breakpoints manually. + continue + cset.add(condition) + condition.remove_last_match(address, size) + if condition.count() == 0: + try: + self.erase_page_breakpoint(pid, bp.get_address()) + except WindowsError: + pass + page_addr = page_addr + pageSize + + def __clear_buffer_watch(self, bw): + """ + Used by L{dont_watch_buffer} and L{dont_stalk_buffer}. + + @type bw: L{BufferWatch} + @param bw: Buffer watch identifier. + """ + + # Get the PID and the start and end addresses of the buffer. + pid = bw.pid + start = bw.start + end = bw.end + + # Get the base address and size in pages required for the buffer. + base = MemoryAddresses.align_address_to_page_start(start) + limit = MemoryAddresses.align_address_to_page_end(end) + pages = MemoryAddresses.get_buffer_size_in_pages(start, end - start) + + # For each page, get the breakpoint and it's condition object. + # For each condition, remove the buffer. + # For each breakpoint, if no buffers are on watch, erase it. + cset = set() # condition objects + page_addr = base + pageSize = MemoryAddresses.pageSize + while page_addr < limit: + if self.has_page_breakpoint(pid, page_addr): + bp = self.get_page_breakpoint(pid, page_addr) + condition = bp.get_condition() + if condition not in cset: + if not isinstance(condition, _BufferWatchCondition): + # this shouldn't happen unless you tinkered with it + # or defined your own page breakpoints manually. + continue + cset.add(condition) + condition.remove(bw) + if condition.count() == 0: + try: + self.erase_page_breakpoint(pid, bp.get_address()) + except WindowsError: + msg = "Cannot remove page breakpoint at address %s" + msg = msg % HexDump.address(bp.get_address()) + warnings.warn(msg, BreakpointWarning) + page_addr = page_addr + pageSize + + def watch_buffer(self, pid, address, size, action=None): + """ + Sets a page breakpoint and notifies when the given buffer is accessed. + + @see: L{dont_watch_variable} + + @type pid: int + @param pid: Process global ID. + + @type address: int + @param address: Memory address of buffer to watch. + + @type size: int + @param size: Size in bytes of buffer to watch. + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_page_breakpoint} for more details. + + @rtype: L{BufferWatch} + @return: Buffer watch identifier. + """ + self.__set_buffer_watch(pid, address, size, action, False) + + def stalk_buffer(self, pid, address, size, action=None): + """ + Sets a one-shot page breakpoint and notifies + when the given buffer is accessed. + + @see: L{dont_watch_variable} + + @type pid: int + @param pid: Process global ID. + + @type address: int + @param address: Memory address of buffer to watch. + + @type size: int + @param size: Size in bytes of buffer to watch. + + @type action: function + @param action: (Optional) Action callback function. + + See L{define_page_breakpoint} for more details. + + @rtype: L{BufferWatch} + @return: Buffer watch identifier. + """ + self.__set_buffer_watch(pid, address, size, action, True) + + def dont_watch_buffer(self, bw, *argv, **argd): + """ + Clears a page breakpoint set by L{watch_buffer}. + + @type bw: L{BufferWatch} + @param bw: + Buffer watch identifier returned by L{watch_buffer}. + """ + + # The sane way to do it. + if not (argv or argd): + self.__clear_buffer_watch(bw) + + # Backwards compatibility with WinAppDbg 1.4. + else: + argv = list(argv) + argv.insert(0, bw) + if "pid" in argd: + argv.insert(0, argd.pop("pid")) + if "address" in argd: + argv.insert(1, argd.pop("address")) + if "size" in argd: + argv.insert(2, argd.pop("size")) + if argd: + raise TypeError("Wrong arguments for dont_watch_buffer()") + try: + pid, address, size = argv + except ValueError: + raise TypeError("Wrong arguments for dont_watch_buffer()") + self.__clear_buffer_watch_old_method(pid, address, size) + + def dont_stalk_buffer(self, bw, *argv, **argd): + """ + Clears a page breakpoint set by L{stalk_buffer}. + + @type bw: L{BufferWatch} + @param bw: + Buffer watch identifier returned by L{stalk_buffer}. + """ + self.dont_watch_buffer(bw, *argv, **argd) + + # ------------------------------------------------------------------------------ + + # Tracing + + # XXX TODO + # Add "action" parameter to tracing mode + + def __start_tracing(self, thread): + """ + @type thread: L{Thread} + @param thread: Thread to start tracing. + """ + tid = thread.get_tid() + if not tid in self.__tracing: + thread.set_tf() + self.__tracing.add(tid) + + def __stop_tracing(self, thread): + """ + @type thread: L{Thread} + @param thread: Thread to stop tracing. + """ + tid = thread.get_tid() + if tid in self.__tracing: + self.__tracing.remove(tid) + if thread.is_alive(): + thread.clear_tf() + + def is_tracing(self, tid): + """ + @type tid: int + @param tid: Thread global ID. + + @rtype: bool + @return: C{True} if the thread is being traced, C{False} otherwise. + """ + return tid in self.__tracing + + def get_traced_tids(self): + """ + Retrieves the list of global IDs of all threads being traced. + + @rtype: list( int... ) + @return: List of thread global IDs. + """ + tids = list(self.__tracing) + tids.sort() + return tids + + def start_tracing(self, tid): + """ + Start tracing mode in the given thread. + + @type tid: int + @param tid: Global ID of thread to start tracing. + """ + if not self.is_tracing(tid): + thread = self.system.get_thread(tid) + self.__start_tracing(thread) + + def stop_tracing(self, tid): + """ + Stop tracing mode in the given thread. + + @type tid: int + @param tid: Global ID of thread to stop tracing. + """ + if self.is_tracing(tid): + thread = self.system.get_thread(tid) + self.__stop_tracing(thread) + + def start_tracing_process(self, pid): + """ + Start tracing mode for all threads in the given process. + + @type pid: int + @param pid: Global ID of process to start tracing. + """ + for thread in self.system.get_process(pid).iter_threads(): + self.__start_tracing(thread) + + def stop_tracing_process(self, pid): + """ + Stop tracing mode for all threads in the given process. + + @type pid: int + @param pid: Global ID of process to stop tracing. + """ + for thread in self.system.get_process(pid).iter_threads(): + self.__stop_tracing(thread) + + def start_tracing_all(self): + """ + Start tracing mode for all threads in all debugees. + """ + for pid in self.get_debugee_pids(): + self.start_tracing_process(pid) + + def stop_tracing_all(self): + """ + Stop tracing mode for all threads in all debugees. + """ + for pid in self.get_debugee_pids(): + self.stop_tracing_process(pid) + + # ------------------------------------------------------------------------------ + + # Break on LastError values (only available since Windows Server 2003) + + def break_on_error(self, pid, errorCode): + """ + Sets or clears the system breakpoint for a given Win32 error code. + + Use L{Process.is_system_defined_breakpoint} to tell if a breakpoint + exception was caused by a system breakpoint or by the application + itself (for example because of a failed assertion in the code). + + @note: This functionality is only available since Windows Server 2003. + In 2003 it only breaks on error values set externally to the + kernel32.dll library, but this was fixed in Windows Vista. + + @warn: This method will fail if the debug symbols for ntdll (kernel32 + in Windows 2003) are not present. For more information see: + L{System.fix_symbol_store_path}. + + @see: U{http://www.nynaeve.net/?p=147} + + @type pid: int + @param pid: Process ID. + + @type errorCode: int + @param errorCode: Win32 error code to stop on. Set to C{0} or + C{ERROR_SUCCESS} to clear the breakpoint instead. + + @raise NotImplementedError: + The functionality is not supported in this system. + + @raise WindowsError: + An error occurred while processing this request. + """ + aProcess = self.system.get_process(pid) + address = aProcess.get_break_on_error_ptr() + if not address: + raise NotImplementedError("The functionality is not supported in this system.") + aProcess.write_dword(address, errorCode) + + def dont_break_on_error(self, pid): + """ + Alias to L{break_on_error}C{(pid, ERROR_SUCCESS)}. + + @type pid: int + @param pid: Process ID. + + @raise NotImplementedError: + The functionality is not supported in this system. + + @raise WindowsError: + An error occurred while processing this request. + """ + self.break_on_error(pid, 0) + + # ------------------------------------------------------------------------------ + + # Simplified symbol resolving, useful for hooking functions + + def resolve_exported_function(self, pid, modName, procName): + """ + Resolves the exported DLL function for the given process. + + @type pid: int + @param pid: Process global ID. + + @type modName: str + @param modName: Name of the module that exports the function. + + @type procName: str + @param procName: Name of the exported function to resolve. + + @rtype: int, None + @return: On success, the address of the exported function. + On failure, returns C{None}. + """ + aProcess = self.system.get_process(pid) + aModule = aProcess.get_module_by_name(modName) + if not aModule: + aProcess.scan_modules() + aModule = aProcess.get_module_by_name(modName) + if aModule: + address = aModule.resolve(procName) + return address + return None + + def resolve_label(self, pid, label): + """ + Resolves a label for the given process. + + @type pid: int + @param pid: Process global ID. + + @type label: str + @param label: Label to resolve. + + @rtype: int + @return: Memory address pointed to by the label. + + @raise ValueError: The label is malformed or impossible to resolve. + @raise RuntimeError: Cannot resolve the module or function. + """ + return self.get_process(pid).resolve_label(label) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/compat.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/compat.py new file mode 100644 index 0000000..65590f7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/compat.py @@ -0,0 +1,201 @@ +# Partial copy of https://bitbucket.org/gutworth/six/src/8e634686c53a35092dd705172440a9231c90ddd1/six.py?at=default +# With some differences to take into account that the iterXXX version may be defined in user code. + +# Original __author__ = "Benjamin Peterson " +# Base __version__ = "1.7.3" + +# Copyright (c) 2010-2014 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import sys +import types + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = (str,) + integer_types = (int,) + class_types = (type,) + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = (basestring,) + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +if PY3: + xrange = range + unicode = str + bytes = bytes + + def iterkeys(d, **kw): + if hasattr(d, "iterkeys"): + return iter(d.iterkeys(**kw)) + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + if hasattr(d, "itervalues"): + return iter(d.itervalues(**kw)) + return iter(d.values(**kw)) + + def iteritems(d, **kw): + if hasattr(d, "iteritems"): + return iter(d.iteritems(**kw)) + return iter(d.items(**kw)) + + def iterlists(d, **kw): + if hasattr(d, "iterlists"): + return iter(d.iterlists(**kw)) + return iter(d.lists(**kw)) + + def keys(d, **kw): + return list(iterkeys(d, **kw)) +else: + unicode = unicode + xrange = xrange + bytes = str + + def keys(d, **kw): + return d.keys(**kw) + + def iterkeys(d, **kw): + return iter(d.iterkeys(**kw)) + + def itervalues(d, **kw): + return iter(d.itervalues(**kw)) + + def iteritems(d, **kw): + return iter(d.iteritems(**kw)) + + def iterlists(d, **kw): + return iter(d.iterlists(**kw)) + + +if PY3: + import builtins + + exec_ = getattr(builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_( + """def reraise(tp, value, tb=None): + raise tp, value, tb +""" + ) + + +if PY3: + import operator + + def b(s): + if isinstance(s, str): + return s.encode("latin-1") + assert isinstance(s, bytes) + return s + + def u(s): + return s + + unichr = chr + if sys.version_info[1] <= 1: + + def int2byte(i): + return bytes((i,)) + else: + # This is about 2x faster than the implementation above on 3.2+ + int2byte = operator.methodcaller("to_bytes", 1, "big") + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + + StringIO = io.StringIO + BytesIO = io.BytesIO +else: + + def b(s): + return s + + # Workaround for standalone backslash + def u(s): + return unicode(s.replace(r"\\", r"\\\\"), "unicode_escape") + + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + + def iterbytes(buf): + return (ord(byte) for byte in buf) + + import StringIO + + StringIO = BytesIO = StringIO.StringIO diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/crash.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/crash.py new file mode 100644 index 0000000..5471ce4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/crash.py @@ -0,0 +1,1908 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Crash dump support. + +@group Crash reporting: + Crash, CrashDictionary + +@group Warnings: + CrashWarning + +@group Deprecated classes: + CrashContainer, CrashTable, CrashTableMSSQL, + VolatileCrashContainer, DummyCrashContainer +""" + +__revision__ = "$Id$" + +__all__ = [ + # Object that represents a crash in the debugee. + "Crash", + # Crash storage. + "CrashDictionary", + # Warnings. + "CrashWarning", + # Backwards compatibility with WinAppDbg 1.4 and before. + "CrashContainer", + "CrashTable", + "CrashTableMSSQL", + "VolatileCrashContainer", + "DummyCrashContainer", +] + +from winappdbg import win32 +from winappdbg import compat +from winappdbg.system import System +from winappdbg.textio import HexDump, CrashDump +from winappdbg.util import StaticClass, MemoryAddresses, PathOperations + +import sys +import os +import time +import zlib +import warnings + +# lazy imports +sql = None +anydbm = None + +# ============================================================================== + +# Secure alternative to pickle, use it if present. +try: + import cerealizer + + pickle = cerealizer + + # There is no optimization function for cerealized objects. + def optimize(picklestring): + return picklestring + + # There is no HIGHEST_PROTOCOL in cerealizer. + HIGHEST_PROTOCOL = 0 + + # Note: it's important NOT to provide backwards compatibility, otherwise + # it'd be just the same as not having this! + # + # To disable this security upgrade simply uncomment the following line: + # + # raise ImportError("Fallback to pickle for backwards compatibility") + +# If cerealizer is not present fallback to the insecure pickle module. +except ImportError: + # Faster implementation of the pickle module as a C extension. + try: + import cPickle as pickle + + # If all fails fallback to the classic pickle module. + except ImportError: + import pickle + + # Fetch the highest protocol version. + HIGHEST_PROTOCOL = pickle.HIGHEST_PROTOCOL + + # Try to use the pickle optimizer if found. + try: + from pickletools import optimize + except ImportError: + + def optimize(picklestring): + return picklestring + + +class Marshaller(StaticClass): + """ + Custom pickler for L{Crash} objects. Optimizes the pickled data when using + the standard C{pickle} (or C{cPickle}) module. The pickled data is then + compressed using zlib. + """ + + @staticmethod + def dumps(obj, protocol=HIGHEST_PROTOCOL): + return zlib.compress(optimize(pickle.dumps(obj)), 9) + + @staticmethod + def loads(data): + return pickle.loads(zlib.decompress(data)) + + +# ============================================================================== + + +class CrashWarning(Warning): + """ + An error occurred while gathering crash data. + Some data may be incomplete or missing. + """ + + +# ============================================================================== + + +# Crash object. Must be serializable. +class Crash(object): + """ + Represents a crash, bug, or another interesting event in the debugee. + + @group Basic information: + timeStamp, signature, eventCode, eventName, pid, tid, arch, os, bits, + registers, labelPC, pc, sp, fp + + @group Optional information: + debugString, + modFileName, + lpBaseOfDll, + exceptionCode, + exceptionName, + exceptionDescription, + exceptionAddress, + exceptionLabel, + firstChance, + faultType, + faultAddress, + faultLabel, + isOurBreakpoint, + isSystemBreakpoint, + stackTrace, + stackTracePC, + stackTraceLabels, + stackTracePretty + + @group Extra information: + commandLine, + environment, + environmentData, + registersPeek, + stackRange, + stackFrame, + stackPeek, + faultCode, + faultMem, + faultPeek, + faultDisasm, + memoryMap + + @group Report: + briefReport, fullReport, notesReport, environmentReport, isExploitable + + @group Notes: + addNote, getNotes, iterNotes, hasNotes, clearNotes, notes + + @group Miscellaneous: + fetch_extra_data + + @type timeStamp: float + @ivar timeStamp: Timestamp as returned by time.time(). + + @type signature: object + @ivar signature: Approximately unique signature for the Crash object. + + This signature can be used as an heuristic to determine if two crashes + were caused by the same software error. Ideally it should be treated as + as opaque serializable object that can be tested for equality. + + @type notes: list( str ) + @ivar notes: List of strings, each string is a note. + + @type eventCode: int + @ivar eventCode: Event code as defined by the Win32 API. + + @type eventName: str + @ivar eventName: Event code user-friendly name. + + @type pid: int + @ivar pid: Process global ID. + + @type tid: int + @ivar tid: Thread global ID. + + @type arch: str + @ivar arch: Processor architecture. + + @type os: str + @ivar os: Operating system version. + + May indicate a 64 bit version even if L{arch} and L{bits} indicate 32 + bits. This means the crash occurred inside a WOW64 process. + + @type bits: int + @ivar bits: C{32} or C{64} bits. + + @type commandLine: None or str + @ivar commandLine: Command line for the target process. + + C{None} if unapplicable or unable to retrieve. + + @type environmentData: None or list of str + @ivar environmentData: Environment data for the target process. + + C{None} if unapplicable or unable to retrieve. + + @type environment: None or dict( str S{->} str ) + @ivar environment: Environment variables for the target process. + + C{None} if unapplicable or unable to retrieve. + + @type registers: dict( str S{->} int ) + @ivar registers: Dictionary mapping register names to their values. + + @type registersPeek: None or dict( str S{->} str ) + @ivar registersPeek: Dictionary mapping register names to the data they point to. + + C{None} if unapplicable or unable to retrieve. + + @type labelPC: None or str + @ivar labelPC: Label pointing to the program counter. + + C{None} or invalid if unapplicable or unable to retrieve. + + @type debugString: None or str + @ivar debugString: Debug string sent by the debugee. + + C{None} if unapplicable or unable to retrieve. + + @type exceptionCode: None or int + @ivar exceptionCode: Exception code as defined by the Win32 API. + + C{None} if unapplicable or unable to retrieve. + + @type exceptionName: None or str + @ivar exceptionName: Exception code user-friendly name. + + C{None} if unapplicable or unable to retrieve. + + @type exceptionDescription: None or str + @ivar exceptionDescription: Exception description. + + C{None} if unapplicable or unable to retrieve. + + @type exceptionAddress: None or int + @ivar exceptionAddress: Memory address where the exception occured. + + C{None} if unapplicable or unable to retrieve. + + @type exceptionLabel: None or str + @ivar exceptionLabel: Label pointing to the exception address. + + C{None} or invalid if unapplicable or unable to retrieve. + + @type faultType: None or int + @ivar faultType: Access violation type. + Only applicable to memory faults. + Should be one of the following constants: + + - L{win32.ACCESS_VIOLATION_TYPE_READ} + - L{win32.ACCESS_VIOLATION_TYPE_WRITE} + - L{win32.ACCESS_VIOLATION_TYPE_DEP} + + C{None} if unapplicable or unable to retrieve. + + @type faultAddress: None or int + @ivar faultAddress: Access violation memory address. + Only applicable to memory faults. + + C{None} if unapplicable or unable to retrieve. + + @type faultLabel: None or str + @ivar faultLabel: Label pointing to the access violation memory address. + Only applicable to memory faults. + + C{None} if unapplicable or unable to retrieve. + + @type firstChance: None or bool + @ivar firstChance: + C{True} for first chance exceptions, C{False} for second chance. + + C{None} if unapplicable or unable to retrieve. + + @type isOurBreakpoint: bool + @ivar isOurBreakpoint: + C{True} for breakpoints defined by the L{Debug} class, + C{False} otherwise. + + C{None} if unapplicable. + + @type isSystemBreakpoint: bool + @ivar isSystemBreakpoint: + C{True} for known system-defined breakpoints, + C{False} otherwise. + + C{None} if unapplicable. + + @type modFileName: None or str + @ivar modFileName: File name of module where the program counter points to. + + C{None} or invalid if unapplicable or unable to retrieve. + + @type lpBaseOfDll: None or int + @ivar lpBaseOfDll: Base of module where the program counter points to. + + C{None} if unapplicable or unable to retrieve. + + @type stackTrace: None or tuple of tuple( int, int, str ) + @ivar stackTrace: + Stack trace of the current thread as a tuple of + ( frame pointer, return address, module filename ). + + C{None} or empty if unapplicable or unable to retrieve. + + @type stackTracePretty: None or tuple of tuple( int, str ) + @ivar stackTracePretty: + Stack trace of the current thread as a tuple of + ( frame pointer, return location ). + + C{None} or empty if unapplicable or unable to retrieve. + + @type stackTracePC: None or tuple( int... ) + @ivar stackTracePC: Tuple of return addresses in the stack trace. + + C{None} or empty if unapplicable or unable to retrieve. + + @type stackTraceLabels: None or tuple( str... ) + @ivar stackTraceLabels: + Tuple of labels pointing to the return addresses in the stack trace. + + C{None} or empty if unapplicable or unable to retrieve. + + @type stackRange: tuple( int, int ) + @ivar stackRange: + Stack beginning and end pointers, in memory addresses order. + + C{None} if unapplicable or unable to retrieve. + + @type stackFrame: None or str + @ivar stackFrame: Data pointed to by the stack pointer. + + C{None} or empty if unapplicable or unable to retrieve. + + @type stackPeek: None or dict( int S{->} str ) + @ivar stackPeek: Dictionary mapping stack offsets to the data they point to. + + C{None} or empty if unapplicable or unable to retrieve. + + @type faultCode: None or str + @ivar faultCode: Data pointed to by the program counter. + + C{None} or empty if unapplicable or unable to retrieve. + + @type faultMem: None or str + @ivar faultMem: Data pointed to by the exception address. + + C{None} or empty if unapplicable or unable to retrieve. + + @type faultPeek: None or dict( intS{->} str ) + @ivar faultPeek: Dictionary mapping guessed pointers at L{faultMem} to the data they point to. + + C{None} or empty if unapplicable or unable to retrieve. + + @type faultDisasm: None or tuple of tuple( long, int, str, str ) + @ivar faultDisasm: Dissassembly around the program counter. + + C{None} or empty if unapplicable or unable to retrieve. + + @type memoryMap: None or list of L{win32.MemoryBasicInformation} objects. + @ivar memoryMap: Memory snapshot of the program. May contain the actual + data from the entire process memory if requested. + See L{fetch_extra_data} for more details. + + C{None} or empty if unapplicable or unable to retrieve. + + @type _rowid: int + @ivar _rowid: Row ID in the database. Internally used by the DAO layer. + Only present in crash dumps retrieved from the database. Do not rely + on this property to be present in future versions of WinAppDbg. + """ + + def __init__(self, event): + """ + @type event: L{Event} + @param event: Event object for crash. + """ + + # First of all, take the timestamp. + self.timeStamp = time.time() + + # Notes are initially empty. + self.notes = list() + + # Get the process and thread, but dont't store them in the DB. + process = event.get_process() + thread = event.get_thread() + + # Determine the architecture. + self.os = System.os + self.arch = process.get_arch() + self.bits = process.get_bits() + + # The following properties are always retrieved for all events. + self.eventCode = event.get_event_code() + self.eventName = event.get_event_name() + self.pid = event.get_pid() + self.tid = event.get_tid() + self.registers = dict(thread.get_context()) + self.labelPC = process.get_label_at_address(self.pc) + + # The following properties are only retrieved for some events. + self.commandLine = None + self.environment = None + self.environmentData = None + self.registersPeek = None + self.debugString = None + self.modFileName = None + self.lpBaseOfDll = None + self.exceptionCode = None + self.exceptionName = None + self.exceptionDescription = None + self.exceptionAddress = None + self.exceptionLabel = None + self.firstChance = None + self.faultType = None + self.faultAddress = None + self.faultLabel = None + self.isOurBreakpoint = None + self.isSystemBreakpoint = None + self.stackTrace = None + self.stackTracePC = None + self.stackTraceLabels = None + self.stackTracePretty = None + self.stackRange = None + self.stackFrame = None + self.stackPeek = None + self.faultCode = None + self.faultMem = None + self.faultPeek = None + self.faultDisasm = None + self.memoryMap = None + + # Get information for debug string events. + if self.eventCode == win32.OUTPUT_DEBUG_STRING_EVENT: + self.debugString = event.get_debug_string() + + # Get information for module load and unload events. + # For create and exit process events, get the information + # for the main module. + elif self.eventCode in ( + win32.CREATE_PROCESS_DEBUG_EVENT, + win32.EXIT_PROCESS_DEBUG_EVENT, + win32.LOAD_DLL_DEBUG_EVENT, + win32.UNLOAD_DLL_DEBUG_EVENT, + ): + aModule = event.get_module() + self.modFileName = event.get_filename() + if not self.modFileName: + self.modFileName = aModule.get_filename() + self.lpBaseOfDll = event.get_module_base() + if not self.lpBaseOfDll: + self.lpBaseOfDll = aModule.get_base() + + # Get some information for exception events. + # To get the remaining information call fetch_extra_data(). + elif self.eventCode == win32.EXCEPTION_DEBUG_EVENT: + # Exception information. + self.exceptionCode = event.get_exception_code() + self.exceptionName = event.get_exception_name() + self.exceptionDescription = event.get_exception_description() + self.exceptionAddress = event.get_exception_address() + self.firstChance = event.is_first_chance() + self.exceptionLabel = process.get_label_at_address(self.exceptionAddress) + if self.exceptionCode in (win32.EXCEPTION_ACCESS_VIOLATION, win32.EXCEPTION_GUARD_PAGE, win32.EXCEPTION_IN_PAGE_ERROR): + self.faultType = event.get_fault_type() + self.faultAddress = event.get_fault_address() + self.faultLabel = process.get_label_at_address(self.faultAddress) + elif self.exceptionCode in (win32.EXCEPTION_BREAKPOINT, win32.EXCEPTION_SINGLE_STEP): + self.isOurBreakpoint = hasattr(event, "breakpoint") and event.breakpoint + self.isSystemBreakpoint = process.is_system_defined_breakpoint(self.exceptionAddress) + + # Stack trace. + try: + self.stackTracePretty = thread.get_stack_trace_with_labels() + except Exception: + e = sys.exc_info()[1] + warnings.warn("Cannot get stack trace with labels, reason: %s" % str(e), CrashWarning) + try: + self.stackTrace = thread.get_stack_trace() + stackTracePC = [ra for (_, ra, _) in self.stackTrace] + self.stackTracePC = tuple(stackTracePC) + stackTraceLabels = [process.get_label_at_address(ra) for ra in self.stackTracePC] + self.stackTraceLabels = tuple(stackTraceLabels) + except Exception: + e = sys.exc_info()[1] + warnings.warn("Cannot get stack trace, reason: %s" % str(e), CrashWarning) + + def fetch_extra_data(self, event, takeMemorySnapshot=0): + """ + Fetch extra data from the L{Event} object. + + @note: Since this method may take a little longer to run, it's best to + call it only after you've determined the crash is interesting and + you want to save it. + + @type event: L{Event} + @param event: Event object for crash. + + @type takeMemorySnapshot: int + @param takeMemorySnapshot: + Memory snapshot behavior: + - C{0} to take no memory information (default). + - C{1} to take only the memory map. + See L{Process.get_memory_map}. + - C{2} to take a full memory snapshot. + See L{Process.take_memory_snapshot}. + - C{3} to take a live memory snapshot. + See L{Process.generate_memory_snapshot}. + """ + + # Get the process and thread, we'll use them below. + process = event.get_process() + thread = event.get_thread() + + # Get the command line for the target process. + try: + self.commandLine = process.get_command_line() + except Exception: + e = sys.exc_info()[1] + warnings.warn("Cannot get command line, reason: %s" % str(e), CrashWarning) + + # Get the environment variables for the target process. + try: + self.environmentData = process.get_environment_data() + self.environment = process.parse_environment_data(self.environmentData) + except Exception: + e = sys.exc_info()[1] + warnings.warn("Cannot get environment, reason: %s" % str(e), CrashWarning) + + # Data pointed to by registers. + self.registersPeek = thread.peek_pointers_in_registers() + + # Module where execution is taking place. + aModule = process.get_module_at_address(self.pc) + if aModule is not None: + self.modFileName = aModule.get_filename() + self.lpBaseOfDll = aModule.get_base() + + # Contents of the stack frame. + try: + self.stackRange = thread.get_stack_range() + except Exception: + e = sys.exc_info()[1] + warnings.warn("Cannot get stack range, reason: %s" % str(e), CrashWarning) + try: + self.stackFrame = thread.get_stack_frame() + stackFrame = self.stackFrame + except Exception: + self.stackFrame = thread.peek_stack_data() + stackFrame = self.stackFrame[:64] + if stackFrame: + self.stackPeek = process.peek_pointers_in_data(stackFrame) + + # Code being executed. + self.faultCode = thread.peek_code_bytes() + try: + self.faultDisasm = thread.disassemble_around_pc(32) + except Exception: + e = sys.exc_info()[1] + warnings.warn("Cannot disassemble, reason: %s" % str(e), CrashWarning) + + # For memory related exceptions, get the memory contents + # of the location that caused the exception to be raised. + if self.eventCode == win32.EXCEPTION_DEBUG_EVENT: + if self.pc != self.exceptionAddress and self.exceptionCode in ( + win32.EXCEPTION_ACCESS_VIOLATION, + win32.EXCEPTION_ARRAY_BOUNDS_EXCEEDED, + win32.EXCEPTION_DATATYPE_MISALIGNMENT, + win32.EXCEPTION_IN_PAGE_ERROR, + win32.EXCEPTION_STACK_OVERFLOW, + win32.EXCEPTION_GUARD_PAGE, + ): + self.faultMem = process.peek(self.exceptionAddress, 64) + if self.faultMem: + self.faultPeek = process.peek_pointers_in_data(self.faultMem) + + # TODO: maybe add names and versions of DLLs and EXE? + + # Take a snapshot of the process memory. Additionally get the + # memory contents if requested. + if takeMemorySnapshot == 1: + self.memoryMap = process.get_memory_map() + mappedFilenames = process.get_mapped_filenames(self.memoryMap) + for mbi in self.memoryMap: + mbi.filename = mappedFilenames.get(mbi.BaseAddress, None) + mbi.content = None + elif takeMemorySnapshot == 2: + self.memoryMap = process.take_memory_snapshot() + elif takeMemorySnapshot == 3: + self.memoryMap = process.generate_memory_snapshot() + + @property + def pc(self): + """ + Value of the program counter register. + + @rtype: int + """ + try: + return self.registers["Eip"] # i386 + except KeyError: + return self.registers["Rip"] # amd64 + + @property + def sp(self): + """ + Value of the stack pointer register. + + @rtype: int + """ + try: + return self.registers["Esp"] # i386 + except KeyError: + return self.registers["Rsp"] # amd64 + + @property + def fp(self): + """ + Value of the frame pointer register. + + @rtype: int + """ + try: + return self.registers["Ebp"] # i386 + except KeyError: + return self.registers["Rbp"] # amd64 + + def __str__(self): + return self.fullReport() + + def key(self): + """ + Alias of L{signature}. Deprecated since WinAppDbg 1.5. + """ + warnings.warn("Crash.key() method was deprecated in WinAppDbg 1.5", DeprecationWarning) + return self.signature + + @property + def signature(self): + if self.labelPC: + pc = self.labelPC + else: + pc = self.pc + if self.stackTraceLabels: + trace = self.stackTraceLabels + else: + trace = self.stackTracePC + return ( + self.arch, + self.eventCode, + self.exceptionCode, + pc, + trace, + self.debugString, + ) + # TODO + # add the name and version of the binary where the crash happened? + + def isExploitable(self): + """ + Guess how likely is it that the bug causing the crash can be leveraged + into an exploitable vulnerability. + + @note: Don't take this as an equivalent of a real exploitability + analysis, that can only be done by a human being! This is only + a guideline, useful for example to sort crashes - placing the most + interesting ones at the top. + + @see: The heuristics are similar to those of the B{!exploitable} + extension for I{WinDBG}, which can be downloaded from here: + + U{http://www.codeplex.com/msecdbg} + + @rtype: tuple( str, str, str ) + @return: The first element of the tuple is the result of the analysis, + being one of the following: + + - Not an exception + - Not exploitable + - Not likely exploitable + - Unknown + - Probably exploitable + - Exploitable + + The second element of the tuple is a code to identify the matched + heuristic rule. + + The third element of the tuple is a description string of the + reason behind the result. + """ + + # Terminal rules + + if self.eventCode != win32.EXCEPTION_DEBUG_EVENT: + return ("Not an exception", "NotAnException", "The event is not an exception.") + + if self.stackRange and self.pc is not None and self.stackRange[0] <= self.pc < self.stackRange[1]: + return ("Exploitable", "StackCodeExecution", "Code execution from the stack is considered exploitable.") + + # This rule is NOT from !exploitable + if self.stackRange and self.sp is not None and not (self.stackRange[0] <= self.sp < self.stackRange[1]): + return ("Exploitable", "StackPointerCorruption", "Stack pointer corruption is considered exploitable.") + + if self.exceptionCode == win32.EXCEPTION_ILLEGAL_INSTRUCTION: + return ( + "Exploitable", + "IllegalInstruction", + "An illegal instruction exception indicates that the attacker controls execution flow.", + ) + + if self.exceptionCode == win32.EXCEPTION_PRIV_INSTRUCTION: + return ( + "Exploitable", + "PrivilegedInstruction", + "A privileged instruction exception indicates that the attacker controls execution flow.", + ) + + if self.exceptionCode == win32.EXCEPTION_GUARD_PAGE: + return ( + "Exploitable", + "GuardPage", + "A guard page violation indicates a stack overflow has occured, and the stack of another thread was reached (possibly the overflow length is not controlled by the attacker).", + ) + + if self.exceptionCode == win32.STATUS_STACK_BUFFER_OVERRUN: + return ( + "Exploitable", + "GSViolation", + "An overrun of a protected stack buffer has been detected. This is considered exploitable, and must be fixed.", + ) + + if self.exceptionCode == win32.STATUS_HEAP_CORRUPTION: + return ( + "Exploitable", + "HeapCorruption", + "Heap Corruption has been detected. This is considered exploitable, and must be fixed.", + ) + + if self.exceptionCode == win32.EXCEPTION_ACCESS_VIOLATION: + nearNull = self.faultAddress is None or MemoryAddresses.align_address_to_page_start(self.faultAddress) == 0 + controlFlow = self.__is_control_flow() + blockDataMove = self.__is_block_data_move() + if self.faultType == win32.EXCEPTION_EXECUTE_FAULT: + if nearNull: + return ( + "Probably exploitable", + "DEPViolation", + "User mode DEP access violations are probably exploitable if near NULL.", + ) + else: + return ("Exploitable", "DEPViolation", "User mode DEP access violations are exploitable.") + elif self.faultType == win32.EXCEPTION_WRITE_FAULT: + if nearNull: + return ( + "Probably exploitable", + "WriteAV", + "User mode write access violations that are near NULL are probably exploitable.", + ) + else: + return ("Exploitable", "WriteAV", "User mode write access violations that are not near NULL are exploitable.") + elif self.faultType == win32.EXCEPTION_READ_FAULT: + if self.faultAddress == self.pc: + if nearNull: + return ( + "Probably exploitable", + "ReadAVonIP", + "Access violations at the instruction pointer are probably exploitable if near NULL.", + ) + else: + return ( + "Exploitable", + "ReadAVonIP", + "Access violations at the instruction pointer are exploitable if not near NULL.", + ) + if controlFlow: + if nearNull: + return ( + "Probably exploitable", + "ReadAVonControlFlow", + "Access violations near null in control flow instructions are considered probably exploitable.", + ) + else: + return ( + "Exploitable", + "ReadAVonControlFlow", + "Access violations not near null in control flow instructions are considered exploitable.", + ) + if blockDataMove: + return ( + "Probably exploitable", + "ReadAVonBlockMove", + "This is a read access violation in a block data move, and is therefore classified as probably exploitable.", + ) + + # Rule: Tainted information used to control branch addresses is considered probably exploitable + # Rule: Tainted information used to control the target of a later write is probably exploitable + + # Non terminal rules + + # XXX TODO add rule to check if code is in writeable memory (probably exploitable) + + # XXX TODO maybe we should be returning a list of tuples instead? + + result = ("Unknown", "Unknown", "Exploitability unknown.") + + if self.exceptionCode == win32.EXCEPTION_ACCESS_VIOLATION: + if self.faultType == win32.EXCEPTION_READ_FAULT: + if nearNull: + result = ( + "Not likely exploitable", + "ReadAVNearNull", + "This is a user mode read access violation near null, and is probably not exploitable.", + ) + + elif self.exceptionCode == win32.EXCEPTION_INT_DIVIDE_BY_ZERO: + result = ("Not likely exploitable", "DivideByZero", "This is an integer divide by zero, and is probably not exploitable.") + + elif self.exceptionCode == win32.EXCEPTION_FLT_DIVIDE_BY_ZERO: + result = ("Not likely exploitable", "DivideByZero", "This is a floating point divide by zero, and is probably not exploitable.") + + elif self.exceptionCode in (win32.EXCEPTION_BREAKPOINT, win32.STATUS_WX86_BREAKPOINT): + result = ( + "Unknown", + "Breakpoint", + "While a breakpoint itself is probably not exploitable, it may also be an indication that an attacker is testing a target. In either case breakpoints should not exist in production code.", + ) + + # Rule: If the stack contains unknown symbols in user mode, call that out + # Rule: Tainted information used to control the source of a later block move unknown, but called out explicitly + # Rule: Tainted information used as an argument to a function is an unknown risk, but called out explicitly + # Rule: Tainted information used to control branch selection is an unknown risk, but called out explicitly + + return result + + def __is_control_flow(self): + """ + Private method to tell if the instruction pointed to by the program + counter is a control flow instruction. + + Currently only works for x86 and amd64 architectures. + """ + jump_instructions = ( + "jmp", + "jecxz", + "jcxz", + "ja", + "jnbe", + "jae", + "jnb", + "jb", + "jnae", + "jbe", + "jna", + "jc", + "je", + "jz", + "jnc", + "jne", + "jnz", + "jnp", + "jpo", + "jp", + "jpe", + "jg", + "jnle", + "jge", + "jnl", + "jl", + "jnge", + "jle", + "jng", + "jno", + "jns", + "jo", + "js", + ) + call_instructions = ("call", "ret", "retn") + loop_instructions = ("loop", "loopz", "loopnz", "loope", "loopne") + control_flow_instructions = call_instructions + loop_instructions + jump_instructions + isControlFlow = False + instruction = None + if self.pc is not None and self.faultDisasm: + for disasm in self.faultDisasm: + if disasm[0] == self.pc: + instruction = disasm[2].lower().strip() + break + if instruction: + for x in control_flow_instructions: + if x in instruction: + isControlFlow = True + break + return isControlFlow + + def __is_block_data_move(self): + """ + Private method to tell if the instruction pointed to by the program + counter is a block data move instruction. + + Currently only works for x86 and amd64 architectures. + """ + block_data_move_instructions = ("movs", "stos", "lods") + isBlockDataMove = False + instruction = None + if self.pc is not None and self.faultDisasm: + for disasm in self.faultDisasm: + if disasm[0] == self.pc: + instruction = disasm[2].lower().strip() + break + if instruction: + for x in block_data_move_instructions: + if x in instruction: + isBlockDataMove = True + break + return isBlockDataMove + + def briefReport(self): + """ + @rtype: str + @return: Short description of the event. + """ + if self.exceptionCode is not None: + if self.exceptionCode == win32.EXCEPTION_BREAKPOINT: + if self.isOurBreakpoint: + what = "Breakpoint hit" + elif self.isSystemBreakpoint: + what = "System breakpoint hit" + else: + what = "Assertion failed" + elif self.exceptionDescription: + what = self.exceptionDescription + elif self.exceptionName: + what = self.exceptionName + else: + what = "Exception %s" % HexDump.integer(self.exceptionCode, self.bits) + if self.firstChance: + chance = "first" + else: + chance = "second" + if self.exceptionLabel: + where = self.exceptionLabel + elif self.exceptionAddress: + where = HexDump.address(self.exceptionAddress, self.bits) + elif self.labelPC: + where = self.labelPC + else: + where = HexDump.address(self.pc, self.bits) + msg = "%s (%s chance) at %s" % (what, chance, where) + elif self.debugString is not None: + if self.labelPC: + where = self.labelPC + else: + where = HexDump.address(self.pc, self.bits) + msg = "Debug string from %s: %r" % (where, self.debugString) + else: + if self.labelPC: + where = self.labelPC + else: + where = HexDump.address(self.pc, self.bits) + msg = "%s (%s) at %s" % (self.eventName, HexDump.integer(self.eventCode, self.bits), where) + return msg + + def fullReport(self, bShowNotes=True): + """ + @type bShowNotes: bool + @param bShowNotes: C{True} to show the user notes, C{False} otherwise. + + @rtype: str + @return: Long description of the event. + """ + msg = self.briefReport() + msg += "\n" + + if self.bits == 32: + width = 16 + else: + width = 8 + + if self.eventCode == win32.EXCEPTION_DEBUG_EVENT: + (exploitability, expcode, expdescription) = self.isExploitable() + msg += "\nSecurity risk level: %s\n" % exploitability + msg += " %s\n" % expdescription + + if bShowNotes and self.notes: + msg += "\nNotes:\n" + msg += self.notesReport() + + if self.commandLine: + msg += "\nCommand line: %s\n" % self.commandLine + + if self.environment: + msg += "\nEnvironment:\n" + msg += self.environmentReport() + + if not self.labelPC: + base = HexDump.address(self.lpBaseOfDll, self.bits) + if self.modFileName: + fn = PathOperations.pathname_to_filename(self.modFileName) + msg += "\nRunning in %s (%s)\n" % (fn, base) + else: + msg += "\nRunning in module at %s\n" % base + + if self.registers: + msg += "\nRegisters:\n" + msg += CrashDump.dump_registers(self.registers) + if self.registersPeek: + msg += "\n" + msg += CrashDump.dump_registers_peek(self.registers, self.registersPeek, width=width) + + if self.faultDisasm: + msg += "\nCode disassembly:\n" + msg += CrashDump.dump_code(self.faultDisasm, self.pc, bits=self.bits) + + if self.stackTrace: + msg += "\nStack trace:\n" + if self.stackTracePretty: + msg += CrashDump.dump_stack_trace_with_labels(self.stackTracePretty, bits=self.bits) + else: + msg += CrashDump.dump_stack_trace(self.stackTrace, bits=self.bits) + + if self.stackFrame: + if self.stackPeek: + msg += "\nStack pointers:\n" + msg += CrashDump.dump_stack_peek(self.stackPeek, width=width) + msg += "\nStack dump:\n" + msg += HexDump.hexblock(self.stackFrame, self.sp, bits=self.bits, width=width) + + if self.faultCode and not self.modFileName: + msg += "\nCode dump:\n" + msg += HexDump.hexblock(self.faultCode, self.pc, bits=self.bits, width=width) + + if self.faultMem: + if self.faultPeek: + msg += "\nException address pointers:\n" + msg += CrashDump.dump_data_peek(self.faultPeek, self.exceptionAddress, bits=self.bits, width=width) + msg += "\nException address dump:\n" + msg += HexDump.hexblock(self.faultMem, self.exceptionAddress, bits=self.bits, width=width) + + if self.memoryMap: + msg += "\nMemory map:\n" + mappedFileNames = dict() + for mbi in self.memoryMap: + if hasattr(mbi, "filename") and mbi.filename: + mappedFileNames[mbi.BaseAddress] = mbi.filename + msg += CrashDump.dump_memory_map(self.memoryMap, mappedFileNames, bits=self.bits) + + if not msg.endswith("\n\n"): + if not msg.endswith("\n"): + msg += "\n" + msg += "\n" + return msg + + def environmentReport(self): + """ + @rtype: str + @return: The process environment variables, + merged and formatted for a report. + """ + msg = "" + if self.environment: + for key, value in compat.iteritems(self.environment): + msg += " %s=%s\n" % (key, value) + return msg + + def notesReport(self): + """ + @rtype: str + @return: All notes, merged and formatted for a report. + """ + msg = "" + if self.notes: + for n in self.notes: + n = n.strip("\n") + if "\n" in n: + n = n.strip("\n") + msg += " * %s\n" % n.pop(0) + for x in n: + msg += " %s\n" % x + else: + msg += " * %s\n" % n + return msg + + def addNote(self, msg): + """ + Add a note to the crash event. + + @type msg: str + @param msg: Note text. + """ + self.notes.append(msg) + + def clearNotes(self): + """ + Clear the notes of this crash event. + """ + self.notes = list() + + def getNotes(self): + """ + Get the list of notes of this crash event. + + @rtype: list( str ) + @return: List of notes. + """ + return self.notes + + def iterNotes(self): + """ + Iterate the notes of this crash event. + + @rtype: listiterator + @return: Iterator of the list of notes. + """ + return self.notes.__iter__() + + def hasNotes(self): + """ + @rtype: bool + @return: C{True} if there are notes for this crash event. + """ + return bool(self.notes) + + +# ============================================================================== + + +class CrashContainer(object): + """ + Old crash dump persistencer using a DBM database. + Doesn't support duplicate crashes. + + @warning: + DBM database support is provided for backwards compatibility with older + versions of WinAppDbg. New applications should not use this class. + Also, DBM databases in Python suffer from multiple problems that can + easily be avoided by switching to a SQL database. + + @see: If you really must use a DBM database, try the standard C{shelve} + module instead: U{http://docs.python.org/library/shelve.html} + + @group Marshalling configuration: + optimizeKeys, optimizeValues, compressKeys, compressValues, escapeKeys, + escapeValues, binaryKeys, binaryValues + + @type optimizeKeys: bool + @cvar optimizeKeys: Ignored by the current implementation. + + Up to WinAppDbg 1.4 this setting caused the database keys to be + optimized when pickled with the standard C{pickle} module. + + But with a DBM database backend that causes inconsistencies, since the + same key can be serialized into multiple optimized pickles, thus losing + uniqueness. + + @type optimizeValues: bool + @cvar optimizeValues: C{True} to optimize the marshalling of keys, C{False} + otherwise. Only used with the C{pickle} module, ignored when using the + more secure C{cerealizer} module. + + @type compressKeys: bool + @cvar compressKeys: C{True} to compress keys when marshalling, C{False} + to leave them uncompressed. + + @type compressValues: bool + @cvar compressValues: C{True} to compress values when marshalling, C{False} + to leave them uncompressed. + + @type escapeKeys: bool + @cvar escapeKeys: C{True} to escape keys when marshalling, C{False} + to leave them uncompressed. + + @type escapeValues: bool + @cvar escapeValues: C{True} to escape values when marshalling, C{False} + to leave them uncompressed. + + @type binaryKeys: bool + @cvar binaryKeys: C{True} to marshall keys to binary format (the Python + C{buffer} type), C{False} to use text marshalled keys (C{str} type). + + @type binaryValues: bool + @cvar binaryValues: C{True} to marshall values to binary format (the Python + C{buffer} type), C{False} to use text marshalled values (C{str} type). + """ + + optimizeKeys = False + optimizeValues = True + compressKeys = False + compressValues = True + escapeKeys = False + escapeValues = False + binaryKeys = False + binaryValues = False + + def __init__(self, filename=None, allowRepeatedKeys=False): + """ + @type filename: str + @param filename: (Optional) File name for crash database. + If no filename is specified, the container is volatile. + + Volatile containers are stored only in memory and + destroyed when they go out of scope. + + @type allowRepeatedKeys: bool + @param allowRepeatedKeys: + Currently not supported, always use C{False}. + """ + if allowRepeatedKeys: + raise NotImplementedError() + self.__filename = filename + if filename: + global anydbm + if not anydbm: + import anydbm + self.__db = anydbm.open(filename, "c") + self.__keys = dict([(self.unmarshall_key(mk), mk) for mk in self.__db.keys()]) + else: + self.__db = dict() + self.__keys = dict() + + def remove_key(self, key): + """ + Removes the given key from the set of known keys. + + @type key: L{Crash} key. + @param key: Key to remove. + """ + del self.__keys[key] + + def marshall_key(self, key): + """ + Marshalls a Crash key to be used in the database. + + @see: L{__init__} + + @type key: L{Crash} key. + @param key: Key to convert. + + @rtype: str or buffer + @return: Converted key. + """ + if key in self.__keys: + return self.__keys[key] + skey = pickle.dumps(key, protocol=0) + if self.compressKeys: + skey = zlib.compress(skey, zlib.Z_BEST_COMPRESSION) + if self.escapeKeys: + skey = skey.encode("hex") + if self.binaryKeys: + skey = buffer(skey) + self.__keys[key] = skey + return skey + + def unmarshall_key(self, key): + """ + Unmarshalls a Crash key read from the database. + + @type key: str or buffer + @param key: Key to convert. + + @rtype: L{Crash} key. + @return: Converted key. + """ + key = str(key) + if self.escapeKeys: + key = key.decode("hex") + if self.compressKeys: + key = zlib.decompress(key) + key = pickle.loads(key) + return key + + def marshall_value(self, value, storeMemoryMap=False): + """ + Marshalls a Crash object to be used in the database. + By default the C{memoryMap} member is B{NOT} stored here. + + @warning: Setting the C{storeMemoryMap} argument to C{True} can lead to + a severe performance penalty! + + @type value: L{Crash} + @param value: Object to convert. + + @type storeMemoryMap: bool + @param storeMemoryMap: C{True} to store the memory map, C{False} + otherwise. + + @rtype: str + @return: Converted object. + """ + if hasattr(value, "memoryMap"): + crash = value + memoryMap = crash.memoryMap + try: + crash.memoryMap = None + if storeMemoryMap and memoryMap is not None: + # convert the generator to a list + crash.memoryMap = list(memoryMap) + if self.optimizeValues: + value = pickle.dumps(crash, protocol=HIGHEST_PROTOCOL) + value = optimize(value) + else: + value = pickle.dumps(crash, protocol=0) + finally: + crash.memoryMap = memoryMap + del memoryMap + del crash + if self.compressValues: + value = zlib.compress(value, zlib.Z_BEST_COMPRESSION) + if self.escapeValues: + value = value.encode("hex") + if self.binaryValues: + value = buffer(value) + return value + + def unmarshall_value(self, value): + """ + Unmarshalls a Crash object read from the database. + + @type value: str + @param value: Object to convert. + + @rtype: L{Crash} + @return: Converted object. + """ + value = str(value) + if self.escapeValues: + value = value.decode("hex") + if self.compressValues: + value = zlib.decompress(value) + value = pickle.loads(value) + return value + + # The interface is meant to be similar to a Python set. + # However it may not be necessary to implement all of the set methods. + # Other methods like get, has_key, iterkeys and itervalues + # are dictionary-like. + + def __len__(self): + """ + @rtype: int + @return: Count of known keys. + """ + return len(self.__keys) + + def __bool__(self): + """ + @rtype: bool + @return: C{False} if there are no known keys. + """ + return bool(self.__keys) + + def __contains__(self, crash): + """ + @type crash: L{Crash} + @param crash: Crash object. + + @rtype: bool + @return: + C{True} if a Crash object with the same key is in the container. + """ + return self.has_key(crash.key()) + + def has_key(self, key): + """ + @type key: L{Crash} key. + @param key: Key to find. + + @rtype: bool + @return: C{True} if the key is present in the set of known keys. + """ + return key in self.__keys + + def iterkeys(self): + """ + @rtype: iterator + @return: Iterator of known L{Crash} keys. + """ + return compat.iterkeys(self.__keys) + + class __CrashContainerIterator(object): + """ + Iterator of Crash objects. Returned by L{CrashContainer.__iter__}. + """ + + def __init__(self, container): + """ + @type container: L{CrashContainer} + @param container: Crash set to iterate. + """ + # It's important to keep a reference to the CrashContainer, + # rather than it's underlying database. + # Otherwise the destructor of CrashContainer may close the + # database while we're still iterating it. + # + # TODO: lock the database when iterating it. + # + self.__container = container + self.__keys_iter = compat.iterkeys(container) + + def next(self): + """ + @rtype: L{Crash} + @return: A B{copy} of a Crash object in the L{CrashContainer}. + @raise StopIteration: No more items left. + """ + key = self.__keys_iter.next() + return self.__container.get(key) + + def __del__(self): + "Class destructor. Closes the database when this object is destroyed." + try: + if self.__filename: + self.__db.close() + except: + pass + + def __iter__(self): + """ + @see: L{itervalues} + @rtype: iterator + @return: Iterator of the contained L{Crash} objects. + """ + return self.itervalues() + + def itervalues(self): + """ + @rtype: iterator + @return: Iterator of the contained L{Crash} objects. + + @warning: A B{copy} of each object is returned, + so any changes made to them will be lost. + + To preserve changes do the following: + 1. Keep a reference to the object. + 2. Delete the object from the set. + 3. Modify the object and add it again. + """ + return self.__CrashContainerIterator(self) + + def add(self, crash): + """ + Adds a new crash to the container. + If the crash appears to be already known, it's ignored. + + @see: L{Crash.key} + + @type crash: L{Crash} + @param crash: Crash object to add. + """ + if crash not in self: + key = crash.key() + skey = self.marshall_key(key) + data = self.marshall_value(crash, storeMemoryMap=True) + self.__db[skey] = data + + def __delitem__(self, key): + """ + Removes a crash from the container. + + @type key: L{Crash} unique key. + @param key: Key of the crash to get. + """ + skey = self.marshall_key(key) + del self.__db[skey] + self.remove_key(key) + + def remove(self, crash): + """ + Removes a crash from the container. + + @type crash: L{Crash} + @param crash: Crash object to remove. + """ + del self[crash.key()] + + def get(self, key): + """ + Retrieves a crash from the container. + + @type key: L{Crash} unique key. + @param key: Key of the crash to get. + + @rtype: L{Crash} object. + @return: Crash matching the given key. + + @see: L{iterkeys} + @warning: A B{copy} of each object is returned, + so any changes made to them will be lost. + + To preserve changes do the following: + 1. Keep a reference to the object. + 2. Delete the object from the set. + 3. Modify the object and add it again. + """ + skey = self.marshall_key(key) + data = self.__db[skey] + crash = self.unmarshall_value(data) + return crash + + def __getitem__(self, key): + """ + Retrieves a crash from the container. + + @type key: L{Crash} unique key. + @param key: Key of the crash to get. + + @rtype: L{Crash} object. + @return: Crash matching the given key. + + @see: L{iterkeys} + @warning: A B{copy} of each object is returned, + so any changes made to them will be lost. + + To preserve changes do the following: + 1. Keep a reference to the object. + 2. Delete the object from the set. + 3. Modify the object and add it again. + """ + return self.get(key) + + +# ============================================================================== + + +class CrashDictionary(object): + """ + Dictionary-like persistence interface for L{Crash} objects. + + Currently the only implementation is through L{sql.CrashDAO}. + """ + + def __init__(self, url, creator=None, allowRepeatedKeys=True): + """ + @type url: str + @param url: Connection URL of the crash database. + See L{sql.CrashDAO.__init__} for more details. + + @type creator: callable + @param creator: (Optional) Callback function that creates the SQL + database connection. + + Normally it's not necessary to use this argument. However in some + odd cases you may need to customize the database connection, for + example when using the integrated authentication in MSSQL. + + @type allowRepeatedKeys: bool + @param allowRepeatedKeys: + If C{True} all L{Crash} objects are stored. + + If C{False} any L{Crash} object with the same signature as a + previously existing object will be ignored. + """ + global sql + if sql is None: + from winappdbg import sql + self._allowRepeatedKeys = allowRepeatedKeys + self._dao = sql.CrashDAO(url, creator) + + def add(self, crash): + """ + Adds a new crash to the container. + + @note: + When the C{allowRepeatedKeys} parameter of the constructor + is set to C{False}, duplicated crashes are ignored. + + @see: L{Crash.key} + + @type crash: L{Crash} + @param crash: Crash object to add. + """ + self._dao.add(crash, self._allowRepeatedKeys) + + def get(self, key): + """ + Retrieves a crash from the container. + + @type key: L{Crash} signature. + @param key: Heuristic signature of the crash to get. + + @rtype: L{Crash} object. + @return: Crash matching the given signature. If more than one is found, + retrieve the newest one. + + @see: L{iterkeys} + @warning: A B{copy} of each object is returned, + so any changes made to them will be lost. + + To preserve changes do the following: + 1. Keep a reference to the object. + 2. Delete the object from the set. + 3. Modify the object and add it again. + """ + found = self._dao.find(signature=key, limit=1, order=-1) + if not found: + raise KeyError(key) + return found[0] + + def __iter__(self): + """ + @rtype: iterator + @return: Iterator of the contained L{Crash} objects. + """ + offset = 0 + limit = 10 + while 1: + found = self._dao.find(offset=offset, limit=limit) + if not found: + break + offset += len(found) + for crash in found: + yield crash + + def itervalues(self): + """ + @rtype: iterator + @return: Iterator of the contained L{Crash} objects. + """ + return self.__iter__() + + def iterkeys(self): + """ + @rtype: iterator + @return: Iterator of the contained L{Crash} heuristic signatures. + """ + for crash in self: + yield crash.signature # FIXME this gives repeated results! + + def __contains__(self, crash): + """ + @type crash: L{Crash} + @param crash: Crash object. + + @rtype: bool + @return: C{True} if the Crash object is in the container. + """ + return self._dao.count(signature=crash.signature) > 0 + + def has_key(self, key): + """ + @type key: L{Crash} signature. + @param key: Heuristic signature of the crash to get. + + @rtype: bool + @return: C{True} if a matching L{Crash} object is in the container. + """ + return self._dao.count(signature=key) > 0 + + def __len__(self): + """ + @rtype: int + @return: Count of L{Crash} elements in the container. + """ + return self._dao.count() + + def __bool__(self): + """ + @rtype: bool + @return: C{False} if the container is empty. + """ + return bool(len(self)) + + +class CrashTable(CrashDictionary): + """ + Old crash dump persistencer using a SQLite database. + + @warning: + Superceded by L{CrashDictionary} since WinAppDbg 1.5. + New applications should not use this class. + """ + + def __init__(self, location=None, allowRepeatedKeys=True): + """ + @type location: str + @param location: (Optional) Location of the crash database. + If the location is a filename, it's an SQLite database file. + + If no location is specified, the container is volatile. + Volatile containers are stored only in memory and + destroyed when they go out of scope. + + @type allowRepeatedKeys: bool + @param allowRepeatedKeys: + If C{True} all L{Crash} objects are stored. + + If C{False} any L{Crash} object with the same signature as a + previously existing object will be ignored. + """ + warnings.warn("The %s class is deprecated since WinAppDbg 1.5." % self.__class__, DeprecationWarning) + if location: + url = "sqlite:///%s" % location + else: + url = "sqlite://" + super(CrashTable, self).__init__(url, allowRepeatedKeys) + + +class CrashTableMSSQL(CrashDictionary): + """ + Old crash dump persistencer using a Microsoft SQL Server database. + + @warning: + Superceded by L{CrashDictionary} since WinAppDbg 1.5. + New applications should not use this class. + """ + + def __init__(self, location=None, allowRepeatedKeys=True): + """ + @type location: str + @param location: Location of the crash database. + It must be an ODBC connection string. + + @type allowRepeatedKeys: bool + @param allowRepeatedKeys: + If C{True} all L{Crash} objects are stored. + + If C{False} any L{Crash} object with the same signature as a + previously existing object will be ignored. + """ + warnings.warn("The %s class is deprecated since WinAppDbg 1.5." % self.__class__, DeprecationWarning) + import urllib + + url = "mssql+pyodbc:///?odbc_connect=" + urllib.quote_plus(location) + super(CrashTableMSSQL, self).__init__(url, allowRepeatedKeys) + + +class VolatileCrashContainer(CrashTable): + """ + Old in-memory crash dump storage. + + @warning: + Superceded by L{CrashDictionary} since WinAppDbg 1.5. + New applications should not use this class. + """ + + def __init__(self, allowRepeatedKeys=True): + """ + Volatile containers are stored only in memory and + destroyed when they go out of scope. + + @type allowRepeatedKeys: bool + @param allowRepeatedKeys: + If C{True} all L{Crash} objects are stored. + + If C{False} any L{Crash} object with the same key as a + previously existing object will be ignored. + """ + super(VolatileCrashContainer, self).__init__(allowRepeatedKeys=allowRepeatedKeys) + + +class DummyCrashContainer(object): + """ + Fakes a database of volatile Crash objects, + trying to mimic part of it's interface, but + doesn't actually store anything. + + Normally applications don't need to use this. + + @see: L{CrashDictionary} + """ + + def __init__(self, allowRepeatedKeys=True): + """ + Fake containers don't store L{Crash} objects, but they implement the + interface properly. + + @type allowRepeatedKeys: bool + @param allowRepeatedKeys: + Mimics the duplicate filter behavior found in real containers. + """ + self.__keys = set() + self.__count = 0 + self.__allowRepeatedKeys = allowRepeatedKeys + + def __contains__(self, crash): + """ + @type crash: L{Crash} + @param crash: Crash object. + + @rtype: bool + @return: C{True} if the Crash object is in the container. + """ + return crash.signature in self.__keys + + def __len__(self): + """ + @rtype: int + @return: Count of L{Crash} elements in the container. + """ + if self.__allowRepeatedKeys: + return self.__count + return len(self.__keys) + + def __bool__(self): + """ + @rtype: bool + @return: C{False} if the container is empty. + """ + return bool(len(self)) + + def add(self, crash): + """ + Adds a new crash to the container. + + @note: + When the C{allowRepeatedKeys} parameter of the constructor + is set to C{False}, duplicated crashes are ignored. + + @see: L{Crash.key} + + @type crash: L{Crash} + @param crash: Crash object to add. + """ + self.__keys.add(crash.signature) + self.__count += 1 + + def get(self, key): + """ + This method is not supported. + """ + raise NotImplementedError() + + def has_key(self, key): + """ + @type key: L{Crash} signature. + @param key: Heuristic signature of the crash to get. + + @rtype: bool + @return: C{True} if a matching L{Crash} object is in the container. + """ + return self.__keys.has_key(key) + + def iterkeys(self): + """ + @rtype: iterator + @return: Iterator of the contained L{Crash} object keys. + + @see: L{get} + @warning: A B{copy} of each object is returned, + so any changes made to them will be lost. + + To preserve changes do the following: + 1. Keep a reference to the object. + 2. Delete the object from the set. + 3. Modify the object and add it again. + """ + return iter(self.__keys) + + +# ============================================================================== +# Register the Crash class with the secure serializer. + +try: + cerealizer.register(Crash) + cerealizer.register(win32.MemoryBasicInformation) +except NameError: + pass diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/debug.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/debug.py new file mode 100644 index 0000000..8d7a4a4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/debug.py @@ -0,0 +1,1513 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Debugging. + +@group Debugging: + Debug + +@group Warnings: + MixedBitsWarning +""" + +__revision__ = "$Id$" + +__all__ = ["Debug", "MixedBitsWarning"] + +import sys +from winappdbg import win32 +from winappdbg.system import System +from winappdbg.process import Process +from winappdbg.thread import Thread +from winappdbg.module import Module +from winappdbg.window import Window +from winappdbg.breakpoint import _BreakpointContainer, CodeBreakpoint +from winappdbg.event import Event, EventHandler, EventDispatcher, EventFactory +from winappdbg.interactive import ConsoleDebugger + +import warnings +##import traceback + +# ============================================================================== + + +# If you set this warning to be considered as an error, you can stop the +# debugger from attaching to 64-bit processes from a 32-bit Python VM and +# visceversa. +class MixedBitsWarning(RuntimeWarning): + """ + This warning is issued when mixing 32 and 64 bit processes. + """ + + +# ============================================================================== + +# TODO +# * Add memory read and write operations, similar to those in the Process +# class, but hiding the presence of the code breakpoints. +# * Add a method to get the memory map of a process, but hiding the presence +# of the page breakpoints. +# * Maybe the previous two features should be implemented at the Process class +# instead, but how to communicate with the Debug object without creating +# circular references? Perhaps the "overrides" could be set using private +# members (so users won't see them), but then there's the problem of the +# users being able to access the snapshot (i.e. clear it), which is why it's +# not such a great idea to use the snapshot to store data that really belongs +# to the Debug class. + + +class Debug(EventDispatcher, _BreakpointContainer): + """ + The main debugger class. + + @group Debugging: + interactive, attach, detach, detach_from_all, execv, execl, + kill, kill_all, + get_debugee_count, get_debugee_pids, + is_debugee, is_debugee_attached, is_debugee_started, + in_hostile_mode, + add_existing_session + + @group Debugging loop: + loop, stop, next, wait, dispatch, cont + + @undocumented: force_garbage_collection + + @type system: L{System} + @ivar system: A System snapshot that is automatically updated for + processes being debugged. Processes not being debugged in this snapshot + may be outdated. + """ + + # Automatically set to True the first time a Debug object is instanced. + _debug_static_init = False + + def __init__(self, eventHandler=None, bKillOnExit=False, bHostileCode=False): + """ + Debugger object. + + @type eventHandler: L{EventHandler} + @param eventHandler: + (Optional, recommended) Custom event handler object. + + @type bKillOnExit: bool + @param bKillOnExit: (Optional) Kill on exit mode. + If C{True} debugged processes are killed when the debugger is + stopped. If C{False} when the debugger stops it detaches from all + debugged processes and leaves them running (default). + + @type bHostileCode: bool + @param bHostileCode: (Optional) Hostile code mode. + Set to C{True} to take some basic precautions against anti-debug + tricks. Disabled by default. + + @warn: When hostile mode is enabled, some things may not work as + expected! This is because the anti-anti debug tricks may disrupt + the behavior of the Win32 debugging APIs or WinAppDbg itself. + + @note: The L{eventHandler} parameter may be any callable Python object + (for example a function, or an instance method). + However you'll probably find it more convenient to use an instance + of a subclass of L{EventHandler} here. + + @raise WindowsError: Raises an exception on error. + """ + EventDispatcher.__init__(self, eventHandler) + _BreakpointContainer.__init__(self) + + self.system = System() + self.lastEvent = None + self.__firstDebugee = True + self.__bKillOnExit = bKillOnExit + self.__bHostileCode = bHostileCode + self.__breakOnEP = set() # set of pids + self.__attachedDebugees = set() # set of pids + self.__startedDebugees = set() # set of pids + + if not self._debug_static_init: + self._debug_static_init = True + + # Request debug privileges for the current process. + # Only do this once, and only after instancing a Debug object, + # so passive debuggers don't get detected because of this. + self.system.request_debug_privileges(bIgnoreExceptions=False) + + # Try to fix the symbol store path if it wasn't set. + # But don't enable symbol downloading by default, since it may + # degrade performance severely. + self.system.fix_symbol_store_path(remote=False, force=False) + + ## # It's hard not to create circular references, + ## # and if we have a destructor, we can end up leaking everything. + ## # It's best to code the debugging loop properly to always + ## # stop the debugger before going out of scope. + ## def __del__(self): + ## self.stop() + + def __enter__(self): + """ + Compatibility with the "C{with}" Python statement. + """ + return self + + def __exit__(self, type, value, traceback): + """ + Compatibility with the "C{with}" Python statement. + """ + self.stop() + + def __len__(self): + """ + @rtype: int + @return: Number of processes being debugged. + """ + return self.get_debugee_count() + + # TODO: maybe custom __bool__ to break out of loop() ? + # it already does work (because of __len__) but it'd be + # useful to do it from the event handler anyway + + # ------------------------------------------------------------------------------ + + def __setSystemKillOnExitMode(self): + # Make sure the default system behavior on detaching from processes + # versus killing them matches our preferences. This only affects the + # scenario where the Python VM dies unexpectedly without running all + # the finally clauses, or the user failed to either instance the Debug + # object inside a with block or call the stop() method before quitting. + if self.__firstDebugee: + try: + System.set_kill_on_exit_mode(self.__bKillOnExit) + self.__firstDebugee = False + except Exception: + pass + + def attach(self, dwProcessId): + """ + Attaches to an existing process for debugging. + + @see: L{detach}, L{execv}, L{execl} + + @type dwProcessId: int + @param dwProcessId: Global ID of a process to attach to. + + @rtype: L{Process} + @return: A new Process object. Normally you don't need to use it now, + it's best to interact with the process from the event handler. + + @raise WindowsError: Raises an exception on error. + Depending on the circumstances, the debugger may or may not have + attached to the target process. + """ + + # Get the Process object from the snapshot, + # if missing create a new one. + try: + aProcess = self.system.get_process(dwProcessId) + except KeyError: + aProcess = Process(dwProcessId) + + # Warn when mixing 32 and 64 bits. + # This also allows the user to stop attaching altogether, + # depending on how the warnings are configured. + if System.bits != aProcess.get_bits(): + msg = "Mixture of 32 and 64 bits is considered experimental." " Use at your own risk!" + warnings.warn(msg, MixedBitsWarning) + + # Attach to the process. + win32.DebugActiveProcess(dwProcessId) + + # Add the new PID to the set of debugees. + self.__attachedDebugees.add(dwProcessId) + + # Match the system kill-on-exit flag to our own. + self.__setSystemKillOnExitMode() + + # If the Process object was not in the snapshot, add it now. + if not self.system.has_process(dwProcessId): + self.system._add_process(aProcess) + + # Scan the process threads and loaded modules. + # This is prefered because the thread and library events do not + # properly give some information, like the filename for each module. + aProcess.scan_threads() + aProcess.scan_modules() + + # Return the Process object, like the execv() and execl() methods. + return aProcess + + def execv(self, argv, **kwargs): + """ + Starts a new process for debugging. + + This method uses a list of arguments. To use a command line string + instead, use L{execl}. + + @see: L{attach}, L{detach} + + @type argv: list( str... ) + @param argv: List of command line arguments to pass to the debugee. + The first element must be the debugee executable filename. + + @type bBreakOnEntryPoint: bool + @keyword bBreakOnEntryPoint: C{True} to automatically set a breakpoint + at the program entry point. + + @type bConsole: bool + @keyword bConsole: True to inherit the console of the debugger. + Defaults to C{False}. + + @type bFollow: bool + @keyword bFollow: C{True} to automatically attach to child processes. + Defaults to C{False}. + + @type bInheritHandles: bool + @keyword bInheritHandles: C{True} if the new process should inherit + it's parent process' handles. Defaults to C{False}. + + @type bSuspended: bool + @keyword bSuspended: C{True} to suspend the main thread before any code + is executed in the debugee. Defaults to C{False}. + + @keyword dwParentProcessId: C{None} or C{0} if the debugger process + should be the parent process (default), or a process ID to + forcefully set as the debugee's parent (only available for Windows + Vista and above). + + In hostile mode, the default is not the debugger process but the + process ID for "explorer.exe". + + @type iTrustLevel: int or None + @keyword iTrustLevel: Trust level. + Must be one of the following values: + - 0: B{No trust}. May not access certain resources, such as + cryptographic keys and credentials. Only available since + Windows XP and 2003, desktop editions. This is the default + in hostile mode. + - 1: B{Normal trust}. Run with the same privileges as a normal + user, that is, one that doesn't have the I{Administrator} or + I{Power User} user rights. Only available since Windows XP + and 2003, desktop editions. + - 2: B{Full trust}. Run with the exact same privileges as the + current user. This is the default in normal mode. + + @type bAllowElevation: bool + @keyword bAllowElevation: C{True} to allow the child process to keep + UAC elevation, if the debugger itself is running elevated. C{False} + to ensure the child process doesn't run with elevation. Defaults to + C{True}. + + This flag is only meaningful on Windows Vista and above, and if the + debugger itself is running with elevation. It can be used to make + sure the child processes don't run elevated as well. + + This flag DOES NOT force an elevation prompt when the debugger is + not running with elevation. + + Note that running the debugger with elevation (or the Python + interpreter at all for that matter) is not normally required. + You should only need to if the target program requires elevation + to work properly (for example if you try to debug an installer). + + @rtype: L{Process} + @return: A new Process object. Normally you don't need to use it now, + it's best to interact with the process from the event handler. + + @raise WindowsError: Raises an exception on error. + """ + if type(argv) in (str, compat.unicode): + raise TypeError("Debug.execv expects a list, not a string") + lpCmdLine = self.system.argv_to_cmdline(argv) + return self.execl(lpCmdLine, **kwargs) + + def execl(self, lpCmdLine, **kwargs): + """ + Starts a new process for debugging. + + This method uses a command line string. To use a list of arguments + instead, use L{execv}. + + @see: L{attach}, L{detach} + + @type lpCmdLine: str + @param lpCmdLine: Command line string to execute. + The first token must be the debugee executable filename. + Tokens with spaces must be enclosed in double quotes. + Tokens including double quote characters must be escaped with a + backslash. + + @type bBreakOnEntryPoint: bool + @keyword bBreakOnEntryPoint: C{True} to automatically set a breakpoint + at the program entry point. Defaults to C{False}. + + @type bConsole: bool + @keyword bConsole: True to inherit the console of the debugger. + Defaults to C{False}. + + @type bFollow: bool + @keyword bFollow: C{True} to automatically attach to child processes. + Defaults to C{False}. + + @type bInheritHandles: bool + @keyword bInheritHandles: C{True} if the new process should inherit + it's parent process' handles. Defaults to C{False}. + + @type bSuspended: bool + @keyword bSuspended: C{True} to suspend the main thread before any code + is executed in the debugee. Defaults to C{False}. + + @type dwParentProcessId: int or None + @keyword dwParentProcessId: C{None} or C{0} if the debugger process + should be the parent process (default), or a process ID to + forcefully set as the debugee's parent (only available for Windows + Vista and above). + + In hostile mode, the default is not the debugger process but the + process ID for "explorer.exe". + + @type iTrustLevel: int + @keyword iTrustLevel: Trust level. + Must be one of the following values: + - 0: B{No trust}. May not access certain resources, such as + cryptographic keys and credentials. Only available since + Windows XP and 2003, desktop editions. This is the default + in hostile mode. + - 1: B{Normal trust}. Run with the same privileges as a normal + user, that is, one that doesn't have the I{Administrator} or + I{Power User} user rights. Only available since Windows XP + and 2003, desktop editions. + - 2: B{Full trust}. Run with the exact same privileges as the + current user. This is the default in normal mode. + + @type bAllowElevation: bool + @keyword bAllowElevation: C{True} to allow the child process to keep + UAC elevation, if the debugger itself is running elevated. C{False} + to ensure the child process doesn't run with elevation. Defaults to + C{True} in normal mode and C{False} in hostile mode. + + This flag is only meaningful on Windows Vista and above, and if the + debugger itself is running with elevation. It can be used to make + sure the child processes don't run elevated as well. + + This flag DOES NOT force an elevation prompt when the debugger is + not running with elevation. + + Note that running the debugger with elevation (or the Python + interpreter at all for that matter) is not normally required. + You should only need to if the target program requires elevation + to work properly (for example if you try to debug an installer). + + @rtype: L{Process} + @return: A new Process object. Normally you don't need to use it now, + it's best to interact with the process from the event handler. + + @raise WindowsError: Raises an exception on error. + """ + if type(lpCmdLine) not in (str, compat.unicode): + warnings.warn("Debug.execl expects a string") + + # Set the "debug" flag to True. + kwargs["bDebug"] = True + + # Pop the "break on entry point" flag. + bBreakOnEntryPoint = kwargs.pop("bBreakOnEntryPoint", False) + + # Set the default trust level if requested. + if "iTrustLevel" not in kwargs: + if self.__bHostileCode: + kwargs["iTrustLevel"] = 0 + else: + kwargs["iTrustLevel"] = 2 + + # Set the default UAC elevation flag if requested. + if "bAllowElevation" not in kwargs: + kwargs["bAllowElevation"] = not self.__bHostileCode + + # In hostile mode the default parent process is explorer.exe. + # Only supported for Windows Vista and above. + if self.__bHostileCode and not kwargs.get("dwParentProcessId", None): + try: + vista_and_above = self.__vista_and_above + except AttributeError: + osi = win32.OSVERSIONINFOEXW() + osi.dwMajorVersion = 6 + osi.dwMinorVersion = 0 + osi.dwPlatformId = win32.VER_PLATFORM_WIN32_NT + mask = 0 + mask = win32.VerSetConditionMask(mask, win32.VER_MAJORVERSION, win32.VER_GREATER_EQUAL) + mask = win32.VerSetConditionMask(mask, win32.VER_MAJORVERSION, win32.VER_GREATER_EQUAL) + mask = win32.VerSetConditionMask(mask, win32.VER_PLATFORMID, win32.VER_EQUAL) + vista_and_above = win32.VerifyVersionInfoW( + osi, win32.VER_MAJORVERSION | win32.VER_MINORVERSION | win32.VER_PLATFORMID, mask + ) + self.__vista_and_above = vista_and_above + if vista_and_above: + dwParentProcessId = self.system.get_explorer_pid() + if dwParentProcessId: + kwargs["dwParentProcessId"] = dwParentProcessId + else: + msg = 'Failed to find "explorer.exe"!' " Using the debugger as parent process." + warnings.warn(msg, RuntimeWarning) + + # Start the new process. + aProcess = None + try: + aProcess = self.system.start_process(lpCmdLine, **kwargs) + dwProcessId = aProcess.get_pid() + + # Match the system kill-on-exit flag to our own. + self.__setSystemKillOnExitMode() + + # Warn when mixing 32 and 64 bits. + # This also allows the user to stop attaching altogether, + # depending on how the warnings are configured. + if System.bits != aProcess.get_bits(): + msg = "Mixture of 32 and 64 bits is considered experimental." " Use at your own risk!" + warnings.warn(msg, MixedBitsWarning) + + # Add the new PID to the set of debugees. + self.__startedDebugees.add(dwProcessId) + + # Add the new PID to the set of "break on EP" debugees if needed. + if bBreakOnEntryPoint: + self.__breakOnEP.add(dwProcessId) + + # Return the Process object. + return aProcess + + # On error kill the new process and raise an exception. + except: + if aProcess is not None: + try: + try: + self.__startedDebugees.remove(aProcess.get_pid()) + except KeyError: + pass + finally: + try: + try: + self.__breakOnEP.remove(aProcess.get_pid()) + except KeyError: + pass + finally: + try: + aProcess.kill() + except Exception: + pass + raise + + def add_existing_session(self, dwProcessId, bStarted=False): + """ + Use this method only when for some reason the debugger's been attached + to the target outside of WinAppDbg (for example when integrating with + other tools). + + You don't normally need to call this method. Most users should call + L{attach}, L{execv} or L{execl} instead. + + @type dwProcessId: int + @param dwProcessId: Global process ID. + + @type bStarted: bool + @param bStarted: C{True} if the process was started by the debugger, + or C{False} if the process was attached to instead. + + @raise WindowsError: The target process does not exist, is not attached + to the debugger anymore. + """ + + # Register the process object with the snapshot. + if not self.system.has_process(dwProcessId): + aProcess = Process(dwProcessId) + self.system._add_process(aProcess) + else: + aProcess = self.system.get_process(dwProcessId) + + # Test for debug privileges on the target process. + # Raises WindowsException on error. + aProcess.get_handle() + + # Register the process ID with the debugger. + if bStarted: + self.__attachedDebugees.add(dwProcessId) + else: + self.__startedDebugees.add(dwProcessId) + + # Match the system kill-on-exit flag to our own. + self.__setSystemKillOnExitMode() + + # Scan the process threads and loaded modules. + # This is prefered because the thread and library events do not + # properly give some information, like the filename for each module. + aProcess.scan_threads() + aProcess.scan_modules() + + def __cleanup_process(self, dwProcessId, bIgnoreExceptions=False): + """ + Perform the necessary cleanup of a process about to be killed or + detached from. + + This private method is called by L{kill} and L{detach}. + + @type dwProcessId: int + @param dwProcessId: Global ID of a process to kill. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when killing the process. + + @raise WindowsError: Raises an exception on error, unless + C{bIgnoreExceptions} is C{True}. + """ + # If the process is being debugged... + if self.is_debugee(dwProcessId): + # Make sure a Process object exists or the following calls fail. + if not self.system.has_process(dwProcessId): + aProcess = Process(dwProcessId) + try: + aProcess.get_handle() + except WindowsError: + pass # fails later on with more specific reason + self.system._add_process(aProcess) + + # Erase all breakpoints in the process. + try: + self.erase_process_breakpoints(dwProcessId) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Stop tracing all threads in the process. + try: + self.stop_tracing_process(dwProcessId) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # The process is no longer a debugee. + try: + if dwProcessId in self.__attachedDebugees: + self.__attachedDebugees.remove(dwProcessId) + if dwProcessId in self.__startedDebugees: + self.__startedDebugees.remove(dwProcessId) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Clear and remove the process from the snapshot. + # If the user wants to do something with it after detaching + # a new Process instance should be created. + try: + if self.system.has_process(dwProcessId): + try: + self.system.get_process(dwProcessId).clear() + finally: + self.system._del_process(dwProcessId) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # If the last debugging event is related to this process, forget it. + try: + if self.lastEvent and self.lastEvent.get_pid() == dwProcessId: + self.lastEvent = None + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + def kill(self, dwProcessId, bIgnoreExceptions=False): + """ + Kills a process currently being debugged. + + @see: L{detach} + + @type dwProcessId: int + @param dwProcessId: Global ID of a process to kill. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when killing the process. + + @raise WindowsError: Raises an exception on error, unless + C{bIgnoreExceptions} is C{True}. + """ + + # Keep a reference to the process. We'll need it later. + try: + aProcess = self.system.get_process(dwProcessId) + except KeyError: + aProcess = Process(dwProcessId) + + # Cleanup all data referring to the process. + self.__cleanup_process(dwProcessId, bIgnoreExceptions=bIgnoreExceptions) + + # Kill the process. + try: + try: + if self.is_debugee(dwProcessId): + try: + if aProcess.is_alive(): + aProcess.suspend() + finally: + self.detach(dwProcessId, bIgnoreExceptions=bIgnoreExceptions) + finally: + aProcess.kill() + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Cleanup what remains of the process data. + try: + aProcess.clear() + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + def kill_all(self, bIgnoreExceptions=False): + """ + Kills from all processes currently being debugged. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when killing each process. C{False} to stop and raise an + exception when encountering an error. + + @raise WindowsError: Raises an exception on error, unless + C{bIgnoreExceptions} is C{True}. + """ + for pid in self.get_debugee_pids(): + self.kill(pid, bIgnoreExceptions=bIgnoreExceptions) + + def detach(self, dwProcessId, bIgnoreExceptions=False): + """ + Detaches from a process currently being debugged. + + @note: On Windows 2000 and below the process is killed. + + @see: L{attach}, L{detach_from_all} + + @type dwProcessId: int + @param dwProcessId: Global ID of a process to detach from. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when detaching. C{False} to stop and raise an exception when + encountering an error. + + @raise WindowsError: Raises an exception on error, unless + C{bIgnoreExceptions} is C{True}. + """ + + # Keep a reference to the process. We'll need it later. + try: + aProcess = self.system.get_process(dwProcessId) + except KeyError: + aProcess = Process(dwProcessId) + + # Determine if there is support for detaching. + # This check should only fail on Windows 2000 and older. + try: + win32.DebugActiveProcessStop + can_detach = True + except AttributeError: + can_detach = False + + # Continue the last event before detaching. + # XXX not sure about this... + try: + if can_detach and self.lastEvent and self.lastEvent.get_pid() == dwProcessId: + self.cont(self.lastEvent) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Cleanup all data referring to the process. + self.__cleanup_process(dwProcessId, bIgnoreExceptions=bIgnoreExceptions) + + try: + # Detach from the process. + # On Windows 2000 and before, kill the process. + if can_detach: + try: + win32.DebugActiveProcessStop(dwProcessId) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + else: + try: + aProcess.kill() + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + finally: + # Cleanup what remains of the process data. + aProcess.clear() + + def detach_from_all(self, bIgnoreExceptions=False): + """ + Detaches from all processes currently being debugged. + + @note: To better handle last debugging event, call L{stop} instead. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when detaching. + + @raise WindowsError: Raises an exception on error, unless + C{bIgnoreExceptions} is C{True}. + """ + for pid in self.get_debugee_pids(): + self.detach(pid, bIgnoreExceptions=bIgnoreExceptions) + + # ------------------------------------------------------------------------------ + + def wait(self, dwMilliseconds=None): + """ + Waits for the next debug event. + + @see: L{cont}, L{dispatch}, L{loop} + + @type dwMilliseconds: int + @param dwMilliseconds: (Optional) Timeout in milliseconds. + Use C{INFINITE} or C{None} for no timeout. + + @rtype: L{Event} + @return: An event that occured in one of the debugees. + + @raise WindowsError: Raises an exception on error. + If no target processes are left to debug, + the error code is L{win32.ERROR_INVALID_HANDLE}. + """ + + # Wait for the next debug event. + raw = win32.WaitForDebugEvent(dwMilliseconds) + event = EventFactory.get(self, raw) + + # Remember it. + self.lastEvent = event + + # Return it. + return event + + def dispatch(self, event=None): + """ + Calls the debug event notify callbacks. + + @see: L{cont}, L{loop}, L{wait} + + @type event: L{Event} + @param event: (Optional) Event object returned by L{wait}. + + @raise WindowsError: Raises an exception on error. + """ + + # If no event object was given, use the last event. + if event is None: + event = self.lastEvent + + # Ignore dummy events. + if not event: + return + + # Determine the default behaviour for this event. + # XXX HACK + # Some undocumented flags are used, but as far as I know in those + # versions of Windows that don't support them they should behave + # like DGB_CONTINUE. + + code = event.get_event_code() + if code == win32.EXCEPTION_DEBUG_EVENT: + # At this point, by default some exception types are swallowed by + # the debugger, because we don't know yet if it was caused by the + # debugger itself or the debugged process. + # + # Later on (see breakpoint.py) if we determined the exception was + # not caused directly by the debugger itself, we set the default + # back to passing the exception to the debugee. + # + # The "invalid handle" exception is also swallowed by the debugger + # because it's not normally generated by the debugee. But in + # hostile mode we want to pass it to the debugee, as it may be the + # result of an anti-debug trick. In that case it's best to disable + # bad handles detection with Microsoft's gflags.exe utility. See: + # http://msdn.microsoft.com/en-us/library/windows/hardware/ff549557(v=vs.85).aspx + + exc_code = event.get_exception_code() + if exc_code in ( + win32.EXCEPTION_BREAKPOINT, + win32.EXCEPTION_WX86_BREAKPOINT, + win32.EXCEPTION_SINGLE_STEP, + win32.EXCEPTION_GUARD_PAGE, + ): + event.continueStatus = win32.DBG_CONTINUE + elif exc_code == win32.EXCEPTION_INVALID_HANDLE: + if self.__bHostileCode: + event.continueStatus = win32.DBG_EXCEPTION_NOT_HANDLED + else: + event.continueStatus = win32.DBG_CONTINUE + else: + event.continueStatus = win32.DBG_EXCEPTION_NOT_HANDLED + + elif code == win32.RIP_EVENT and event.get_rip_type() == win32.SLE_ERROR: + # RIP events that signal fatal events should kill the process. + event.continueStatus = win32.DBG_TERMINATE_PROCESS + + else: + # Other events need this continue code. + # Sometimes other codes can be used and are ignored, sometimes not. + # For example, when using the DBG_EXCEPTION_NOT_HANDLED code, + # debug strings are sent twice (!) + event.continueStatus = win32.DBG_CONTINUE + + # Dispatch the debug event. + return EventDispatcher.dispatch(self, event) + + def cont(self, event=None): + """ + Resumes execution after processing a debug event. + + @see: dispatch(), loop(), wait() + + @type event: L{Event} + @param event: (Optional) Event object returned by L{wait}. + + @raise WindowsError: Raises an exception on error. + """ + + # If no event object was given, use the last event. + if event is None: + event = self.lastEvent + + # Ignore dummy events. + if not event: + return + + # Get the event continue status information. + dwProcessId = event.get_pid() + dwThreadId = event.get_tid() + dwContinueStatus = event.continueStatus + + # Check if the process is still being debugged. + if self.is_debugee(dwProcessId): + # Try to flush the instruction cache. + try: + if self.system.has_process(dwProcessId): + aProcess = self.system.get_process(dwProcessId) + else: + aProcess = Process(dwProcessId) + aProcess.flush_instruction_cache() + except WindowsError: + pass + + # XXX TODO + # + # Try to execute the UnhandledExceptionFilter for second chance + # exceptions, at least when in hostile mode (in normal mode it + # would be breaking compatibility, as users may actually expect + # second chance exceptions to be raised again). + # + # Reportedly in Windows 7 (maybe in Vista too) this seems to be + # happening already. In XP and below the UnhandledExceptionFilter + # was never called for processes being debugged. + + # Continue execution of the debugee. + win32.ContinueDebugEvent(dwProcessId, dwThreadId, dwContinueStatus) + + # If the event is the last event, forget it. + if event == self.lastEvent: + self.lastEvent = None + + def stop(self, bIgnoreExceptions=True): + """ + Stops debugging all processes. + + If the kill on exit mode is on, debugged processes are killed when the + debugger is stopped. Otherwise when the debugger stops it detaches from + all debugged processes and leaves them running (default). For more + details see: L{__init__} + + @note: This method is better than L{detach_from_all} because it can + gracefully handle the last debugging event before detaching. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when detaching. + """ + + # Determine if we have a last debug event that we need to continue. + try: + event = self.lastEvent + has_event = bool(event) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + has_event = False + + # If we do... + if has_event: + # Disable all breakpoints in the process before resuming execution. + try: + pid = event.get_pid() + self.disable_process_breakpoints(pid) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Disable all breakpoints in the thread before resuming execution. + try: + tid = event.get_tid() + self.disable_thread_breakpoints(tid) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Resume execution. + try: + event.continueDebugEvent = win32.DBG_CONTINUE + self.cont(event) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Detach from or kill all debuggees. + try: + if self.__bKillOnExit: + self.kill_all(bIgnoreExceptions) + else: + self.detach_from_all(bIgnoreExceptions) + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Cleanup the process snapshots. + try: + self.system.clear() + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # Close all Win32 handles the Python garbage collector failed to close. + self.force_garbage_collection(bIgnoreExceptions) + + def next(self): + """ + Handles the next debug event. + + @see: L{cont}, L{dispatch}, L{wait}, L{stop} + + @raise WindowsError: Raises an exception on error. + + If the wait operation causes an error, debugging is stopped + (meaning all debugees are either killed or detached from). + + If the event dispatching causes an error, the event is still + continued before returning. This may happen, for example, if the + event handler raises an exception nobody catches. + """ + try: + event = self.wait() + except Exception: + self.stop() + raise + try: + self.dispatch() + finally: + self.cont() + + def loop(self): + """ + Simple debugging loop. + + This debugging loop is meant to be useful for most simple scripts. + It iterates as long as there is at least one debugee, or an exception + is raised. Multiple calls are allowed. + + This is a trivial example script:: + import sys + debug = Debug() + try: + debug.execv( sys.argv [ 1 : ] ) + debug.loop() + finally: + debug.stop() + + @see: L{next}, L{stop} + + U{http://msdn.microsoft.com/en-us/library/ms681675(VS.85).aspx} + + @raise WindowsError: Raises an exception on error. + + If the wait operation causes an error, debugging is stopped + (meaning all debugees are either killed or detached from). + + If the event dispatching causes an error, the event is still + continued before returning. This may happen, for example, if the + event handler raises an exception nobody catches. + """ + while self: + self.next() + + def get_debugee_count(self): + """ + @rtype: int + @return: Number of processes being debugged. + """ + return len(self.__attachedDebugees) + len(self.__startedDebugees) + + def get_debugee_pids(self): + """ + @rtype: list( int... ) + @return: Global IDs of processes being debugged. + """ + return list(self.__attachedDebugees) + list(self.__startedDebugees) + + def is_debugee(self, dwProcessId): + """ + Determine if the debugger is debugging the given process. + + @see: L{is_debugee_attached}, L{is_debugee_started} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @rtype: bool + @return: C{True} if the given process is being debugged + by this L{Debug} instance. + """ + return self.is_debugee_attached(dwProcessId) or self.is_debugee_started(dwProcessId) + + def is_debugee_started(self, dwProcessId): + """ + Determine if the given process was started by the debugger. + + @see: L{is_debugee}, L{is_debugee_attached} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @rtype: bool + @return: C{True} if the given process was started for debugging by this + L{Debug} instance. + """ + return dwProcessId in self.__startedDebugees + + def is_debugee_attached(self, dwProcessId): + """ + Determine if the debugger is attached to the given process. + + @see: L{is_debugee}, L{is_debugee_started} + + @type dwProcessId: int + @param dwProcessId: Process global ID. + + @rtype: bool + @return: C{True} if the given process is attached to this + L{Debug} instance. + """ + return dwProcessId in self.__attachedDebugees + + def in_hostile_mode(self): + """ + Determine if we're in hostile mode (anti-anti-debug). + + @rtype: bool + @return: C{True} if this C{Debug} instance was started in hostile mode, + C{False} otherwise. + """ + return self.__bHostileCode + + # ------------------------------------------------------------------------------ + + def interactive(self, bConfirmQuit=True, bShowBanner=True): + """ + Start an interactive debugging session. + + @type bConfirmQuit: bool + @param bConfirmQuit: Set to C{True} to ask the user for confirmation + before closing the session, C{False} otherwise. + + @type bShowBanner: bool + @param bShowBanner: Set to C{True} to show a banner before entering + the session and after leaving it, C{False} otherwise. + + @warn: This will temporarily disable the user-defined event handler! + + This method returns when the user closes the session. + """ + print("") + print("-" * 79) + print("Interactive debugging session started.") + print('Use the "help" command to list all available commands.') + print('Use the "quit" command to close this session.') + print("-" * 79) + if self.lastEvent is None: + print("") + console = ConsoleDebugger() + console.confirm_quit = bConfirmQuit + console.load_history() + try: + console.start_using_debugger(self) + console.loop() + finally: + console.stop_using_debugger() + console.save_history() + print("") + print("-" * 79) + print("Interactive debugging session closed.") + print("-" * 79) + print("") + + # ------------------------------------------------------------------------------ + + @staticmethod + def force_garbage_collection(bIgnoreExceptions=True): + """ + Close all Win32 handles the Python garbage collector failed to close. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when detaching. + """ + try: + import gc + + gc.collect() + bRecollect = False + for obj in list(gc.garbage): + try: + if isinstance(obj, win32.Handle): + obj.close() + elif isinstance(obj, Event): + obj.debug = None + elif isinstance(obj, Process): + obj.clear() + elif isinstance(obj, Thread): + obj.set_process(None) + obj.clear() + elif isinstance(obj, Module): + obj.set_process(None) + elif isinstance(obj, Window): + obj.set_process(None) + else: + continue + gc.garbage.remove(obj) + del obj + bRecollect = True + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + if bRecollect: + gc.collect() + except Exception: + if not bIgnoreExceptions: + raise + e = sys.exc_info()[1] + warnings.warn(str(e), RuntimeWarning) + + # ------------------------------------------------------------------------------ + + def _notify_create_process(self, event): + """ + Notify the creation of a new process. + + @warning: This method is meant to be used internally by the debugger. + + @type event: L{CreateProcessEvent} + @param event: Create process event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + dwProcessId = event.get_pid() + if dwProcessId not in self.__attachedDebugees: + if dwProcessId not in self.__startedDebugees: + self.__startedDebugees.add(dwProcessId) + + retval = self.system._notify_create_process(event) + + # Set a breakpoint on the program's entry point if requested. + # Try not to use the Event object's entry point value, as in some cases + # it may be wrong. See: http://pferrie.host22.com/misc/lowlevel3.htm + if dwProcessId in self.__breakOnEP: + try: + lpEntryPoint = event.get_process().get_entry_point() + except Exception: + lpEntryPoint = event.get_start_address() + + # It'd be best to use a hardware breakpoint instead, at least in + # hostile mode. But since the main thread's context gets smashed + # by the loader, I haven't found a way to make it work yet. + self.break_at(dwProcessId, lpEntryPoint) + + # Defeat isDebuggerPresent by patching PEB->BeingDebugged. + # When we do this, some debugging APIs cease to work as expected. + # For example, the system breakpoint isn't hit when we attach. + # For that reason we need to define a code breakpoint at the + # code location where a new thread is spawned by the debugging + # APIs, ntdll!DbgUiRemoteBreakin. + if self.__bHostileCode: + aProcess = event.get_process() + try: + hProcess = aProcess.get_handle(win32.PROCESS_QUERY_INFORMATION) + pbi = win32.NtQueryInformationProcess(hProcess, win32.ProcessBasicInformation) + ptr = pbi.PebBaseAddress + 2 + if aProcess.peek(ptr, 1) == "\x01": + aProcess.poke(ptr, "\x00") + except WindowsError: + e = sys.exc_info()[1] + warnings.warn("Cannot patch PEB->BeingDebugged, reason: %s" % e.strerror) + + return retval + + def _notify_create_thread(self, event): + """ + Notify the creation of a new thread. + + @warning: This method is meant to be used internally by the debugger. + + @type event: L{CreateThreadEvent} + @param event: Create thread event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + return event.get_process()._notify_create_thread(event) + + def _notify_load_dll(self, event): + """ + Notify the load of a new module. + + @warning: This method is meant to be used internally by the debugger. + + @type event: L{LoadDLLEvent} + @param event: Load DLL event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + + # Pass the event to the breakpoint container. + bCallHandler = _BreakpointContainer._notify_load_dll(self, event) + + # Get the process where the DLL was loaded. + aProcess = event.get_process() + + # Pass the event to the process. + bCallHandler = aProcess._notify_load_dll(event) and bCallHandler + + # Anti-anti-debugging tricks on ntdll.dll. + if self.__bHostileCode: + aModule = event.get_module() + if aModule.match_name("ntdll.dll"): + # Since we've overwritten the PEB to hide + # ourselves, we no longer have the system + # breakpoint when attaching to the process. + # Set a breakpoint at ntdll!DbgUiRemoteBreakin + # instead (that's where the debug API spawns + # it's auxiliary threads). This also defeats + # a simple anti-debugging trick: the hostile + # process could have overwritten the int3 + # instruction at the system breakpoint. + self.break_at(aProcess.get_pid(), aProcess.resolve_label("ntdll!DbgUiRemoteBreakin")) + + return bCallHandler + + def _notify_exit_process(self, event): + """ + Notify the termination of a process. + + @warning: This method is meant to be used internally by the debugger. + + @type event: L{ExitProcessEvent} + @param event: Exit process event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + bCallHandler1 = _BreakpointContainer._notify_exit_process(self, event) + bCallHandler2 = self.system._notify_exit_process(event) + + try: + self.detach(event.get_pid()) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror != win32.ERROR_INVALID_PARAMETER: + warnings.warn("Failed to detach from dead process, reason: %s" % str(e), RuntimeWarning) + except Exception: + e = sys.exc_info()[1] + warnings.warn("Failed to detach from dead process, reason: %s" % str(e), RuntimeWarning) + + return bCallHandler1 and bCallHandler2 + + def _notify_exit_thread(self, event): + """ + Notify the termination of a thread. + + @warning: This method is meant to be used internally by the debugger. + + @type event: L{ExitThreadEvent} + @param event: Exit thread event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + bCallHandler1 = _BreakpointContainer._notify_exit_thread(self, event) + bCallHandler2 = event.get_process()._notify_exit_thread(event) + return bCallHandler1 and bCallHandler2 + + def _notify_unload_dll(self, event): + """ + Notify the unload of a module. + + @warning: This method is meant to be used internally by the debugger. + + @type event: L{UnloadDLLEvent} + @param event: Unload DLL event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + bCallHandler1 = _BreakpointContainer._notify_unload_dll(self, event) + bCallHandler2 = event.get_process()._notify_unload_dll(event) + return bCallHandler1 and bCallHandler2 + + def _notify_rip(self, event): + """ + Notify of a RIP event. + + @warning: This method is meant to be used internally by the debugger. + + @type event: L{RIPEvent} + @param event: RIP event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + event.debug.detach(event.get_pid()) + return True + + def _notify_debug_control_c(self, event): + """ + Notify of a Debug Ctrl-C exception. + + @warning: This method is meant to be used internally by the debugger. + + @note: This exception is only raised when a debugger is attached, and + applications are not supposed to handle it, so we need to handle it + ourselves or the application may crash. + + @see: U{http://msdn.microsoft.com/en-us/library/aa363082(VS.85).aspx} + + @type event: L{ExceptionEvent} + @param event: Debug Ctrl-C exception event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + if event.is_first_chance(): + event.continueStatus = win32.DBG_EXCEPTION_HANDLED + return True + + def _notify_ms_vc_exception(self, event): + """ + Notify of a Microsoft Visual C exception. + + @warning: This method is meant to be used internally by the debugger. + + @note: This allows the debugger to understand the + Microsoft Visual C thread naming convention. + + @see: U{http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx} + + @type event: L{ExceptionEvent} + @param event: Microsoft Visual C exception event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + dwType = event.get_exception_information(0) + if dwType == 0x1000: + pszName = event.get_exception_information(1) + dwThreadId = event.get_exception_information(2) + dwFlags = event.get_exception_information(3) + + aProcess = event.get_process() + szName = aProcess.peek_string(pszName, fUnicode=False) + if szName: + if dwThreadId == -1: + dwThreadId = event.get_tid() + + if aProcess.has_thread(dwThreadId): + aThread = aProcess.get_thread(dwThreadId) + else: + aThread = Thread(dwThreadId) + aProcess._add_thread(aThread) + + ## if aThread.get_name() is None: + ## aThread.set_name(szName) + aThread.set_name(szName) + + return True diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/disasm.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/disasm.py new file mode 100644 index 0000000..306c4ea --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/disasm.py @@ -0,0 +1,717 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Binary code disassembly. + +@group Disassembler loader: + Disassembler, Engine + +@group Disassembler engines: + BeaEngine, CapstoneEngine, DistormEngine, + LibdisassembleEngine, PyDasmEngine +""" + +from __future__ import with_statement + +__revision__ = "$Id$" + +__all__ = [ + "Disassembler", + "Engine", + "BeaEngine", + "CapstoneEngine", + "DistormEngine", + "LibdisassembleEngine", + "PyDasmEngine", +] + +from winappdbg.textio import HexDump +from winappdbg import win32 + +import ctypes +import warnings + +# lazy imports +BeaEnginePython = None +distorm3 = None +pydasm = None +libdisassemble = None +capstone = None + +# ============================================================================== + + +class Engine(object): + """ + Base class for disassembly engine adaptors. + + @type name: str + @cvar name: Engine name to use with the L{Disassembler} class. + + @type desc: str + @cvar desc: User friendly name of the disassembler engine. + + @type url: str + @cvar url: Download URL. + + @type supported: set(str) + @cvar supported: Set of supported processor architectures. + For more details see L{win32.version._get_arch}. + + @type arch: str + @ivar arch: Name of the processor architecture. + """ + + name = "" + desc = "" + url = "" + supported = set() + + def __init__(self, arch=None): + """ + @type arch: str + @param arch: Name of the processor architecture. + If not provided the current processor architecture is assumed. + For more details see L{win32.version._get_arch}. + + @raise NotImplementedError: This disassembler doesn't support the + requested processor architecture. + """ + self.arch = self._validate_arch(arch) + try: + self._import_dependencies() + except ImportError: + msg = "%s is not installed or can't be found. Download it from: %s" + msg = msg % (self.name, self.url) + raise NotImplementedError(msg) + + def _validate_arch(self, arch=None): + """ + @type arch: str + @param arch: Name of the processor architecture. + If not provided the current processor architecture is assumed. + For more details see L{win32.version._get_arch}. + + @rtype: str + @return: Name of the processor architecture. + If not provided the current processor architecture is assumed. + For more details see L{win32.version._get_arch}. + + @raise NotImplementedError: This disassembler doesn't support the + requested processor architecture. + """ + + # Use the default architecture if none specified. + if not arch: + arch = win32.arch + + # Validate the architecture. + if arch not in self.supported: + msg = "The %s engine cannot decode %s code." + msg = msg % (self.name, arch) + raise NotImplementedError(msg) + + # Return the architecture. + return arch + + def _import_dependencies(self): + """ + Loads the dependencies for this disassembler. + + @raise ImportError: This disassembler cannot find or load the + necessary dependencies to make it work. + """ + raise SyntaxError("Subclasses MUST implement this method!") + + def decode(self, address, code): + """ + @type address: int + @param address: Memory address where the code was read from. + + @type code: str + @param code: Machine code to disassemble. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + + @raise NotImplementedError: This disassembler could not be loaded. + This may be due to missing dependencies. + """ + raise NotImplementedError() + + +# ============================================================================== + + +class BeaEngine(Engine): + """ + Integration with the BeaEngine disassembler by Beatrix. + + @see: U{https://sourceforge.net/projects/winappdbg/files/additional%20packages/BeaEngine/} + """ + + name = "BeaEngine" + desc = "BeaEngine disassembler by Beatrix" + url = "https://sourceforge.net/projects/winappdbg/files/additional%20packages/BeaEngine/" + + supported = set( + ( + win32.ARCH_I386, + win32.ARCH_AMD64, + ) + ) + + def _import_dependencies(self): + # Load the BeaEngine ctypes wrapper. + global BeaEnginePython + if BeaEnginePython is None: + import BeaEnginePython + + def decode(self, address, code): + addressof = ctypes.addressof + + # Instance the code buffer. + buffer = ctypes.create_string_buffer(code) + buffer_ptr = addressof(buffer) + + # Instance the disassembler structure. + Instruction = BeaEnginePython.DISASM() + Instruction.VirtualAddr = address + Instruction.EIP = buffer_ptr + Instruction.SecurityBlock = buffer_ptr + len(code) + if self.arch == win32.ARCH_I386: + Instruction.Archi = 0 + else: + Instruction.Archi = 0x40 + Instruction.Options = ( + BeaEnginePython.Tabulation + BeaEnginePython.NasmSyntax + BeaEnginePython.SuffixedNumeral + BeaEnginePython.ShowSegmentRegs + ) + + # Prepare for looping over each instruction. + result = [] + Disasm = BeaEnginePython.Disasm + InstructionPtr = addressof(Instruction) + hexdump = HexDump.hexadecimal + append = result.append + OUT_OF_BLOCK = BeaEnginePython.OUT_OF_BLOCK + UNKNOWN_OPCODE = BeaEnginePython.UNKNOWN_OPCODE + + # For each decoded instruction... + while True: + # Calculate the current offset into the buffer. + offset = Instruction.EIP - buffer_ptr + + # If we've gone past the buffer, break the loop. + if offset >= len(code): + break + + # Decode the current instruction. + InstrLength = Disasm(InstructionPtr) + + # If BeaEngine detects we've gone past the buffer, break the loop. + if InstrLength == OUT_OF_BLOCK: + break + + # The instruction could not be decoded. + if InstrLength == UNKNOWN_OPCODE: + # Output a single byte as a "db" instruction. + char = "%.2X" % ord(buffer[offset]) + result.append( + ( + Instruction.VirtualAddr, + 1, + "db %sh" % char, + char, + ) + ) + Instruction.VirtualAddr += 1 + Instruction.EIP += 1 + + # The instruction was decoded but reading past the buffer's end. + # This can happen when the last instruction is a prefix without an + # opcode. For example: decode(0, '\x66') + elif offset + InstrLength > len(code): + # Output each byte as a "db" instruction. + for char in buffer[offset : offset + len(code)]: + char = "%.2X" % ord(char) + result.append( + ( + Instruction.VirtualAddr, + 1, + "db %sh" % char, + char, + ) + ) + Instruction.VirtualAddr += 1 + Instruction.EIP += 1 + + # The instruction was decoded correctly. + else: + # Output the decoded instruction. + append( + ( + Instruction.VirtualAddr, + InstrLength, + Instruction.CompleteInstr.strip(), + hexdump(buffer.raw[offset : offset + InstrLength]), + ) + ) + Instruction.VirtualAddr += InstrLength + Instruction.EIP += InstrLength + + # Return the list of decoded instructions. + return result + + +# ============================================================================== + + +class DistormEngine(Engine): + """ + Integration with the diStorm disassembler by Gil Dabah. + + @see: U{https://code.google.com/p/distorm3} + """ + + name = "diStorm" + desc = "diStorm disassembler by Gil Dabah" + url = "https://code.google.com/p/distorm3" + + supported = set( + ( + win32.ARCH_I386, + win32.ARCH_AMD64, + ) + ) + + def _import_dependencies(self): + # Load the distorm bindings. + global distorm3 + if distorm3 is None: + try: + import distorm3 + except ImportError: + import distorm as distorm3 + + # Load the decoder function. + self.__decode = distorm3.Decode + + # Load the bits flag. + self.__flag = { + win32.ARCH_I386: distorm3.Decode32Bits, + win32.ARCH_AMD64: distorm3.Decode64Bits, + }[self.arch] + + def decode(self, address, code): + return self.__decode(address, code, self.__flag) + + +# ============================================================================== + + +class PyDasmEngine(Engine): + """ + Integration with PyDasm: Python bindings to libdasm. + + @see: U{https://code.google.com/p/libdasm/} + """ + + name = "PyDasm" + desc = "PyDasm: Python bindings to libdasm" + url = "https://code.google.com/p/libdasm/" + + supported = set((win32.ARCH_I386,)) + + def _import_dependencies(self): + # Load the libdasm bindings. + global pydasm + if pydasm is None: + import pydasm + + def decode(self, address, code): + # Decode each instruction in the buffer. + result = [] + offset = 0 + while offset < len(code): + # Try to decode the current instruction. + instruction = pydasm.get_instruction(code[offset : offset + 32], pydasm.MODE_32) + + # Get the memory address of the current instruction. + current = address + offset + + # Illegal opcode or opcode longer than remaining buffer. + if not instruction or instruction.length + offset > len(code): + hexdump = "%.2X" % ord(code[offset]) + disasm = "db 0x%s" % hexdump + ilen = 1 + + # Correctly decoded instruction. + else: + disasm = pydasm.get_instruction_string(instruction, pydasm.FORMAT_INTEL, current) + ilen = instruction.length + hexdump = HexDump.hexadecimal(code[offset : offset + ilen]) + + # Add the decoded instruction to the list. + result.append( + ( + current, + ilen, + disasm, + hexdump, + ) + ) + + # Move to the next instruction. + offset += ilen + + # Return the list of decoded instructions. + return result + + +# ============================================================================== + + +class LibdisassembleEngine(Engine): + """ + Integration with Immunity libdisassemble. + + @see: U{http://www.immunitysec.com/resources-freesoftware.shtml} + """ + + name = "Libdisassemble" + desc = "Immunity libdisassemble" + url = "http://www.immunitysec.com/resources-freesoftware.shtml" + + supported = set((win32.ARCH_I386,)) + + def _import_dependencies(self): + # Load the libdisassemble module. + # Since it doesn't come with an installer or an __init__.py file + # users can only install it manually however they feel like it, + # so we'll have to do a bit of guessing to find it. + + global libdisassemble + if libdisassemble is None: + try: + # If installed properly with __init__.py + import libdisassemble.disassemble as libdisassemble + + except ImportError: + # If installed by just copying and pasting the files + import disassemble as libdisassemble + + def decode(self, address, code): + # Decode each instruction in the buffer. + result = [] + offset = 0 + while offset < len(code): + # Decode the current instruction. + opcode = libdisassemble.Opcode(code[offset : offset + 32]) + length = opcode.getSize() + disasm = opcode.printOpcode("INTEL") + hexdump = HexDump.hexadecimal(code[offset : offset + length]) + + # Add the decoded instruction to the list. + result.append( + ( + address + offset, + length, + disasm, + hexdump, + ) + ) + + # Move to the next instruction. + offset += length + + # Return the list of decoded instructions. + return result + + +# ============================================================================== + + +class CapstoneEngine(Engine): + """ + Integration with the Capstone disassembler by Nguyen Anh Quynh. + + @see: U{http://www.capstone-engine.org/} + """ + + name = "Capstone" + desc = "Capstone disassembler by Nguyen Anh Quynh" + url = "http://www.capstone-engine.org/" + + supported = set( + ( + win32.ARCH_I386, + win32.ARCH_AMD64, + win32.ARCH_THUMB, + win32.ARCH_ARM, + win32.ARCH_ARM64, + ) + ) + + def _import_dependencies(self): + # Load the Capstone bindings. + global capstone + if capstone is None: + import capstone + + # Load the constants for the requested architecture. + self.__constants = { + win32.ARCH_I386: (capstone.CS_ARCH_X86, capstone.CS_MODE_32), + win32.ARCH_AMD64: (capstone.CS_ARCH_X86, capstone.CS_MODE_64), + win32.ARCH_THUMB: (capstone.CS_ARCH_ARM, capstone.CS_MODE_THUMB), + win32.ARCH_ARM: (capstone.CS_ARCH_ARM, capstone.CS_MODE_ARM), + win32.ARCH_ARM64: (capstone.CS_ARCH_ARM64, capstone.CS_MODE_ARM), + } + + # Test for the bug in early versions of Capstone. + # If found, warn the user about it. + try: + self.__bug = not isinstance( + capstone.cs_disasm_quick(capstone.CS_ARCH_X86, capstone.CS_MODE_32, "\x90", 1)[0], capstone.capstone.CsInsn + ) + except AttributeError: + self.__bug = False + if self.__bug: + warnings.warn( + "This version of the Capstone bindings is unstable," " please upgrade to a newer one!", RuntimeWarning, stacklevel=4 + ) + + def decode(self, address, code): + # Get the constants for the requested architecture. + arch, mode = self.__constants[self.arch] + + # Get the decoder function outside the loop. + decoder = capstone.cs_disasm_quick + + # If the buggy version of the bindings are being used, we need to catch + # all exceptions broadly. If not, we only need to catch CsError. + if self.__bug: + CsError = Exception + else: + CsError = capstone.CsError + + # Create the variables for the instruction length, mnemonic and + # operands. That way they won't be created within the loop, + # minimizing the chances data might be overwritten. + # This only makes sense for the buggy vesion of the bindings, normally + # memory accesses are safe). + length = mnemonic = op_str = None + + # For each instruction... + result = [] + offset = 0 + while offset < len(code): + # Disassemble a single instruction, because disassembling multiple + # instructions may cause excessive memory usage (Capstone allocates + # approximately 1K of metadata per each decoded instruction). + instr = None + try: + instr = decoder(arch, mode, code[offset : offset + 16], address + offset, 1)[0] + except IndexError: + pass # No instructions decoded. + except CsError: + pass # Any other error. + + # On success add the decoded instruction. + if instr is not None: + # Get the instruction length, mnemonic and operands. + # Copy the values quickly before someone overwrites them, + # if using the buggy version of the bindings (otherwise it's + # irrelevant in which order we access the properties). + length = instr.size + mnemonic = instr.mnemonic + op_str = instr.op_str + + # Concatenate the mnemonic and the operands. + if op_str: + disasm = "%s %s" % (mnemonic, op_str) + else: + disasm = mnemonic + + # Get the instruction bytes as a hexadecimal dump. + hexdump = HexDump.hexadecimal(code[offset : offset + length]) + + # On error add a "define constant" instruction. + # The exact instruction depends on the architecture. + else: + # The number of bytes to skip depends on the architecture. + # On Intel processors we'll skip one byte, since we can't + # really know the instruction length. On the rest of the + # architectures we always know the instruction length. + if self.arch in (win32.ARCH_I386, win32.ARCH_AMD64): + length = 1 + else: + length = 4 + + # Get the skipped bytes as a hexadecimal dump. + skipped = code[offset : offset + length] + hexdump = HexDump.hexadecimal(skipped) + + # Build the "define constant" instruction. + # On Intel processors it's "db". + # On ARM processors it's "dcb". + if self.arch in (win32.ARCH_I386, win32.ARCH_AMD64): + mnemonic = "db " + else: + mnemonic = "dcb " + bytes = [] + for b in skipped: + if b.isalpha(): + bytes.append("'%s'" % b) + else: + bytes.append("0x%x" % ord(b)) + op_str = ", ".join(bytes) + disasm = mnemonic + op_str + + # Add the decoded instruction to the list. + result.append( + ( + address + offset, + length, + disasm, + hexdump, + ) + ) + + # Update the offset. + offset += length + + # Return the list of decoded instructions. + return result + + +# ============================================================================== + +# TODO: use a lock to access __decoder +# TODO: look in sys.modules for whichever disassembler is already loaded + + +class Disassembler(object): + """ + Generic disassembler. Uses a set of adapters to decide which library to + load for which supported platform. + + @type engines: tuple( L{Engine} ) + @cvar engines: Set of supported engines. If you implement your own adapter + you can add its class here to make it available to L{Disassembler}. + Supported disassemblers are: + """ + + engines = ( + DistormEngine, # diStorm engine goes first for backwards compatibility + BeaEngine, + CapstoneEngine, + LibdisassembleEngine, + PyDasmEngine, + ) + + # Add the list of supported disassemblers to the docstring. + __doc__ += "\n" + for e in engines: + __doc__ += " - %s - %s (U{%s})\n" % (e.name, e.desc, e.url) + del e + + # Cache of already loaded disassemblers. + __decoder = {} + + def __new__(cls, arch=None, engine=None): + """ + Factory class. You can't really instance a L{Disassembler} object, + instead one of the adapter L{Engine} subclasses is returned. + + @type arch: str + @param arch: (Optional) Name of the processor architecture. + If not provided the current processor architecture is assumed. + For more details see L{win32.version._get_arch}. + + @type engine: str + @param engine: (Optional) Name of the disassembler engine. + If not provided a compatible one is loaded automatically. + See: L{Engine.name} + + @raise NotImplementedError: No compatible disassembler was found that + could decode machine code for the requested architecture. This may + be due to missing dependencies. + + @raise ValueError: An unknown engine name was supplied. + """ + + # Use the default architecture if none specified. + if not arch: + arch = win32.arch + + # Return a compatible engine if none specified. + if not engine: + found = False + for clazz in cls.engines: + try: + if arch in clazz.supported: + selected = (clazz.name, arch) + try: + decoder = cls.__decoder[selected] + except KeyError: + decoder = clazz(arch) + cls.__decoder[selected] = decoder + return decoder + except NotImplementedError: + pass + msg = "No disassembler engine available for %s code." % arch + raise NotImplementedError(msg) + + # Return the specified engine. + selected = (engine, arch) + try: + decoder = cls.__decoder[selected] + except KeyError: + found = False + engineLower = engine.lower() + for clazz in cls.engines: + if clazz.name.lower() == engineLower: + found = True + break + if not found: + msg = "Unsupported disassembler engine: %s" % engine + raise ValueError(msg) + if arch not in clazz.supported: + msg = "The %s engine cannot decode %s code." % selected + raise NotImplementedError(msg) + decoder = clazz(arch) + cls.__decoder[selected] = decoder + return decoder diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/event.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/event.py new file mode 100644 index 0000000..57e9a37 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/event.py @@ -0,0 +1,1877 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Event handling module. + +@see: U{http://apps.sourceforge.net/trac/winappdbg/wiki/Debugging} + +@group Debugging: + EventHandler, EventSift + +@group Debug events: + EventFactory, + EventDispatcher, + Event, + NoEvent, + CreateProcessEvent, + CreateThreadEvent, + ExitProcessEvent, + ExitThreadEvent, + LoadDLLEvent, + UnloadDLLEvent, + OutputDebugStringEvent, + RIPEvent, + ExceptionEvent + +@group Warnings: + EventCallbackWarning +""" + +__revision__ = "$Id$" + +__all__ = [ + # Factory of Event objects and all of it's subclasses. + # Users should not need to instance Event objects directly. + "EventFactory", + # Event dispatcher used internally by the Debug class. + "EventDispatcher", + # Base classes for user-defined event handlers. + "EventHandler", + "EventSift", + # Warning for uncaught exceptions on event callbacks. + "EventCallbackWarning", + # Dummy event object that can be used as a placeholder. + # It's never returned by the EventFactory. + "NoEvent", + # Base class for event objects. + "Event", + # Event objects. + "CreateProcessEvent", + "CreateThreadEvent", + "ExitProcessEvent", + "ExitThreadEvent", + "LoadDLLEvent", + "UnloadDLLEvent", + "OutputDebugStringEvent", + "RIPEvent", + "ExceptionEvent", +] + +from winappdbg import win32 +from winappdbg import compat +from winappdbg.win32 import FileHandle, ProcessHandle, ThreadHandle +from winappdbg.breakpoint import ApiHook +from winappdbg.module import Module +from winappdbg.thread import Thread +from winappdbg.process import Process +from winappdbg.textio import HexDump +from winappdbg.util import StaticClass, PathOperations + +import sys +import ctypes +import warnings +import traceback + +# ============================================================================== + + +class EventCallbackWarning(RuntimeWarning): + """ + This warning is issued when an uncaught exception was raised by a + user-defined event handler. + """ + + +# ============================================================================== + + +class Event(object): + """ + Event object. + + @type eventMethod: str + @cvar eventMethod: + Method name to call when using L{EventHandler} subclasses. + Used internally. + + @type eventName: str + @cvar eventName: + User-friendly name of the event. + + @type eventDescription: str + @cvar eventDescription: + User-friendly description of the event. + + @type debug: L{Debug} + @ivar debug: + Debug object that received the event. + + @type raw: L{DEBUG_EVENT} + @ivar raw: + Raw DEBUG_EVENT structure as used by the Win32 API. + + @type continueStatus: int + @ivar continueStatus: + Continue status to pass to L{win32.ContinueDebugEvent}. + """ + + eventMethod = "unknown_event" + eventName = "Unknown event" + eventDescription = "A debug event of an unknown type has occured." + + def __init__(self, debug, raw): + """ + @type debug: L{Debug} + @param debug: Debug object that received the event. + + @type raw: L{DEBUG_EVENT} + @param raw: Raw DEBUG_EVENT structure as used by the Win32 API. + """ + self.debug = debug + self.raw = raw + self.continueStatus = win32.DBG_EXCEPTION_NOT_HANDLED + + ## @property + ## def debug(self): + ## """ + ## @rtype debug: L{Debug} + ## @return debug: + ## Debug object that received the event. + ## """ + ## return self.__debug() + + def get_event_name(self): + """ + @rtype: str + @return: User-friendly name of the event. + """ + return self.eventName + + def get_event_description(self): + """ + @rtype: str + @return: User-friendly description of the event. + """ + return self.eventDescription + + def get_event_code(self): + """ + @rtype: int + @return: Debug event code as defined in the Win32 API. + """ + return self.raw.dwDebugEventCode + + ## # Compatibility with version 1.0 + ## # XXX to be removed in version 1.4 + ## def get_code(self): + ## """ + ## Alias of L{get_event_code} for backwards compatibility + ## with WinAppDbg version 1.0. + ## Will be phased out in the next version. + ## + ## @rtype: int + ## @return: Debug event code as defined in the Win32 API. + ## """ + ## return self.get_event_code() + + def get_pid(self): + """ + @see: L{get_process} + + @rtype: int + @return: Process global ID where the event occured. + """ + return self.raw.dwProcessId + + def get_tid(self): + """ + @see: L{get_thread} + + @rtype: int + @return: Thread global ID where the event occured. + """ + return self.raw.dwThreadId + + def get_process(self): + """ + @see: L{get_pid} + + @rtype: L{Process} + @return: Process where the event occured. + """ + pid = self.get_pid() + system = self.debug.system + if system.has_process(pid): + process = system.get_process(pid) + else: + # XXX HACK + # The process object was missing for some reason, so make a new one. + process = Process(pid) + system._add_process(process) + ## process.scan_threads() # not needed + process.scan_modules() + return process + + def get_thread(self): + """ + @see: L{get_tid} + + @rtype: L{Thread} + @return: Thread where the event occured. + """ + tid = self.get_tid() + process = self.get_process() + if process.has_thread(tid): + thread = process.get_thread(tid) + else: + # XXX HACK + # The thread object was missing for some reason, so make a new one. + thread = Thread(tid) + process._add_thread(thread) + return thread + + +# ============================================================================== + + +class NoEvent(Event): + """ + No event. + + Dummy L{Event} object that can be used as a placeholder when no debug + event has occured yet. It's never returned by the L{EventFactory}. + """ + + eventMethod = "no_event" + eventName = "No event" + eventDescription = "No debug event has occured." + + def __init__(self, debug, raw=None): + Event.__init__(self, debug, raw) + + def __len__(self): + """ + Always returns C{0}, so when evaluating the object as a boolean it's + always C{False}. This prevents L{Debug.cont} from trying to continue + a dummy event. + """ + return 0 + + def get_event_code(self): + return -1 + + def get_pid(self): + return -1 + + def get_tid(self): + return -1 + + def get_process(self): + return Process(self.get_pid()) + + def get_thread(self): + return Thread(self.get_tid()) + + +# ============================================================================== + + +class ExceptionEvent(Event): + """ + Exception event. + + @type exceptionName: dict( int S{->} str ) + @cvar exceptionName: + Mapping of exception constants to their names. + + @type exceptionDescription: dict( int S{->} str ) + @cvar exceptionDescription: + Mapping of exception constants to user-friendly strings. + + @type breakpoint: L{Breakpoint} + @ivar breakpoint: + If the exception was caused by one of our breakpoints, this member + contains a reference to the breakpoint object. Otherwise it's not + defined. It should only be used from the condition or action callback + routines, instead of the event handler. + + @type hook: L{Hook} + @ivar hook: + If the exception was caused by a function hook, this member contains a + reference to the hook object. Otherwise it's not defined. It should + only be used from the hook callback routines, instead of the event + handler. + """ + + eventName = "Exception event" + eventDescription = "An exception was raised by the debugee." + + __exceptionMethod = { + win32.EXCEPTION_ACCESS_VIOLATION: "access_violation", + win32.EXCEPTION_ARRAY_BOUNDS_EXCEEDED: "array_bounds_exceeded", + win32.EXCEPTION_BREAKPOINT: "breakpoint", + win32.EXCEPTION_DATATYPE_MISALIGNMENT: "datatype_misalignment", + win32.EXCEPTION_FLT_DENORMAL_OPERAND: "float_denormal_operand", + win32.EXCEPTION_FLT_DIVIDE_BY_ZERO: "float_divide_by_zero", + win32.EXCEPTION_FLT_INEXACT_RESULT: "float_inexact_result", + win32.EXCEPTION_FLT_INVALID_OPERATION: "float_invalid_operation", + win32.EXCEPTION_FLT_OVERFLOW: "float_overflow", + win32.EXCEPTION_FLT_STACK_CHECK: "float_stack_check", + win32.EXCEPTION_FLT_UNDERFLOW: "float_underflow", + win32.EXCEPTION_ILLEGAL_INSTRUCTION: "illegal_instruction", + win32.EXCEPTION_IN_PAGE_ERROR: "in_page_error", + win32.EXCEPTION_INT_DIVIDE_BY_ZERO: "integer_divide_by_zero", + win32.EXCEPTION_INT_OVERFLOW: "integer_overflow", + win32.EXCEPTION_INVALID_DISPOSITION: "invalid_disposition", + win32.EXCEPTION_NONCONTINUABLE_EXCEPTION: "noncontinuable_exception", + win32.EXCEPTION_PRIV_INSTRUCTION: "privileged_instruction", + win32.EXCEPTION_SINGLE_STEP: "single_step", + win32.EXCEPTION_STACK_OVERFLOW: "stack_overflow", + win32.EXCEPTION_GUARD_PAGE: "guard_page", + win32.EXCEPTION_INVALID_HANDLE: "invalid_handle", + win32.EXCEPTION_POSSIBLE_DEADLOCK: "possible_deadlock", + win32.EXCEPTION_WX86_BREAKPOINT: "wow64_breakpoint", + win32.CONTROL_C_EXIT: "control_c_exit", + win32.DBG_CONTROL_C: "debug_control_c", + win32.MS_VC_EXCEPTION: "ms_vc_exception", + } + + __exceptionName = { + win32.EXCEPTION_ACCESS_VIOLATION: "EXCEPTION_ACCESS_VIOLATION", + win32.EXCEPTION_ARRAY_BOUNDS_EXCEEDED: "EXCEPTION_ARRAY_BOUNDS_EXCEEDED", + win32.EXCEPTION_BREAKPOINT: "EXCEPTION_BREAKPOINT", + win32.EXCEPTION_DATATYPE_MISALIGNMENT: "EXCEPTION_DATATYPE_MISALIGNMENT", + win32.EXCEPTION_FLT_DENORMAL_OPERAND: "EXCEPTION_FLT_DENORMAL_OPERAND", + win32.EXCEPTION_FLT_DIVIDE_BY_ZERO: "EXCEPTION_FLT_DIVIDE_BY_ZERO", + win32.EXCEPTION_FLT_INEXACT_RESULT: "EXCEPTION_FLT_INEXACT_RESULT", + win32.EXCEPTION_FLT_INVALID_OPERATION: "EXCEPTION_FLT_INVALID_OPERATION", + win32.EXCEPTION_FLT_OVERFLOW: "EXCEPTION_FLT_OVERFLOW", + win32.EXCEPTION_FLT_STACK_CHECK: "EXCEPTION_FLT_STACK_CHECK", + win32.EXCEPTION_FLT_UNDERFLOW: "EXCEPTION_FLT_UNDERFLOW", + win32.EXCEPTION_ILLEGAL_INSTRUCTION: "EXCEPTION_ILLEGAL_INSTRUCTION", + win32.EXCEPTION_IN_PAGE_ERROR: "EXCEPTION_IN_PAGE_ERROR", + win32.EXCEPTION_INT_DIVIDE_BY_ZERO: "EXCEPTION_INT_DIVIDE_BY_ZERO", + win32.EXCEPTION_INT_OVERFLOW: "EXCEPTION_INT_OVERFLOW", + win32.EXCEPTION_INVALID_DISPOSITION: "EXCEPTION_INVALID_DISPOSITION", + win32.EXCEPTION_NONCONTINUABLE_EXCEPTION: "EXCEPTION_NONCONTINUABLE_EXCEPTION", + win32.EXCEPTION_PRIV_INSTRUCTION: "EXCEPTION_PRIV_INSTRUCTION", + win32.EXCEPTION_SINGLE_STEP: "EXCEPTION_SINGLE_STEP", + win32.EXCEPTION_STACK_OVERFLOW: "EXCEPTION_STACK_OVERFLOW", + win32.EXCEPTION_GUARD_PAGE: "EXCEPTION_GUARD_PAGE", + win32.EXCEPTION_INVALID_HANDLE: "EXCEPTION_INVALID_HANDLE", + win32.EXCEPTION_POSSIBLE_DEADLOCK: "EXCEPTION_POSSIBLE_DEADLOCK", + win32.EXCEPTION_WX86_BREAKPOINT: "EXCEPTION_WX86_BREAKPOINT", + win32.CONTROL_C_EXIT: "CONTROL_C_EXIT", + win32.DBG_CONTROL_C: "DBG_CONTROL_C", + win32.MS_VC_EXCEPTION: "MS_VC_EXCEPTION", + } + + __exceptionDescription = { + win32.EXCEPTION_ACCESS_VIOLATION: "Access violation", + win32.EXCEPTION_ARRAY_BOUNDS_EXCEEDED: "Array bounds exceeded", + win32.EXCEPTION_BREAKPOINT: "Breakpoint", + win32.EXCEPTION_DATATYPE_MISALIGNMENT: "Datatype misalignment", + win32.EXCEPTION_FLT_DENORMAL_OPERAND: "Float denormal operand", + win32.EXCEPTION_FLT_DIVIDE_BY_ZERO: "Float divide by zero", + win32.EXCEPTION_FLT_INEXACT_RESULT: "Float inexact result", + win32.EXCEPTION_FLT_INVALID_OPERATION: "Float invalid operation", + win32.EXCEPTION_FLT_OVERFLOW: "Float overflow", + win32.EXCEPTION_FLT_STACK_CHECK: "Float stack check", + win32.EXCEPTION_FLT_UNDERFLOW: "Float underflow", + win32.EXCEPTION_ILLEGAL_INSTRUCTION: "Illegal instruction", + win32.EXCEPTION_IN_PAGE_ERROR: "In-page error", + win32.EXCEPTION_INT_DIVIDE_BY_ZERO: "Integer divide by zero", + win32.EXCEPTION_INT_OVERFLOW: "Integer overflow", + win32.EXCEPTION_INVALID_DISPOSITION: "Invalid disposition", + win32.EXCEPTION_NONCONTINUABLE_EXCEPTION: "Noncontinuable exception", + win32.EXCEPTION_PRIV_INSTRUCTION: "Privileged instruction", + win32.EXCEPTION_SINGLE_STEP: "Single step event", + win32.EXCEPTION_STACK_OVERFLOW: "Stack limits overflow", + win32.EXCEPTION_GUARD_PAGE: "Guard page hit", + win32.EXCEPTION_INVALID_HANDLE: "Invalid handle", + win32.EXCEPTION_POSSIBLE_DEADLOCK: "Possible deadlock", + win32.EXCEPTION_WX86_BREAKPOINT: "WOW64 breakpoint", + win32.CONTROL_C_EXIT: "Control-C exit", + win32.DBG_CONTROL_C: "Debug Control-C", + win32.MS_VC_EXCEPTION: "Microsoft Visual C++ exception", + } + + @property + def eventMethod(self): + return self.__exceptionMethod.get(self.get_exception_code(), "unknown_exception") + + def get_exception_name(self): + """ + @rtype: str + @return: Name of the exception as defined by the Win32 API. + """ + code = self.get_exception_code() + unk = HexDump.integer(code) + return self.__exceptionName.get(code, unk) + + def get_exception_description(self): + """ + @rtype: str + @return: User-friendly name of the exception. + """ + code = self.get_exception_code() + description = self.__exceptionDescription.get(code, None) + if description is None: + try: + description = "Exception code %s (%s)" + description = description % (HexDump.integer(code), ctypes.FormatError(code)) + except OverflowError: + description = "Exception code %s" % HexDump.integer(code) + return description + + def is_first_chance(self): + """ + @rtype: bool + @return: C{True} for first chance exceptions, C{False} for last chance. + """ + return self.raw.u.Exception.dwFirstChance != 0 + + def is_last_chance(self): + """ + @rtype: bool + @return: The opposite of L{is_first_chance}. + """ + return not self.is_first_chance() + + def is_noncontinuable(self): + """ + @see: U{http://msdn.microsoft.com/en-us/library/aa363082(VS.85).aspx} + + @rtype: bool + @return: C{True} if the exception is noncontinuable, + C{False} otherwise. + + Attempting to continue a noncontinuable exception results in an + EXCEPTION_NONCONTINUABLE_EXCEPTION exception to be raised. + """ + return bool(self.raw.u.Exception.ExceptionRecord.ExceptionFlags & win32.EXCEPTION_NONCONTINUABLE) + + def is_continuable(self): + """ + @rtype: bool + @return: The opposite of L{is_noncontinuable}. + """ + return not self.is_noncontinuable() + + def is_user_defined_exception(self): + """ + Determines if this is an user-defined exception. User-defined + exceptions may contain any exception code that is not system reserved. + + Often the exception code is also a valid Win32 error code, but that's + up to the debugged application. + + @rtype: bool + @return: C{True} if the exception is user-defined, C{False} otherwise. + """ + return self.get_exception_code() & 0x10000000 == 0 + + def is_system_defined_exception(self): + """ + @rtype: bool + @return: The opposite of L{is_user_defined_exception}. + """ + return not self.is_user_defined_exception() + + def get_exception_code(self): + """ + @rtype: int + @return: Exception code as defined by the Win32 API. + """ + return self.raw.u.Exception.ExceptionRecord.ExceptionCode + + def get_exception_address(self): + """ + @rtype: int + @return: Memory address where the exception occured. + """ + address = self.raw.u.Exception.ExceptionRecord.ExceptionAddress + if address is None: + address = 0 + return address + + def get_exception_information(self, index): + """ + @type index: int + @param index: Index into the exception information block. + + @rtype: int + @return: Exception information DWORD. + """ + if index < 0 or index > win32.EXCEPTION_MAXIMUM_PARAMETERS: + raise IndexError("Array index out of range: %s" % repr(index)) + info = self.raw.u.Exception.ExceptionRecord.ExceptionInformation + value = info[index] + if value is None: + value = 0 + return value + + def get_exception_information_as_list(self): + """ + @rtype: list( int ) + @return: Exception information block. + """ + info = self.raw.u.Exception.ExceptionRecord.ExceptionInformation + data = list() + for index in compat.xrange(0, win32.EXCEPTION_MAXIMUM_PARAMETERS): + value = info[index] + if value is None: + value = 0 + data.append(value) + return data + + def get_fault_type(self): + """ + @rtype: int + @return: Access violation type. + Should be one of the following constants: + + - L{win32.EXCEPTION_READ_FAULT} + - L{win32.EXCEPTION_WRITE_FAULT} + - L{win32.EXCEPTION_EXECUTE_FAULT} + + @note: This method is only meaningful for access violation exceptions, + in-page memory error exceptions and guard page exceptions. + + @raise NotImplementedError: Wrong kind of exception. + """ + if self.get_exception_code() not in (win32.EXCEPTION_ACCESS_VIOLATION, win32.EXCEPTION_IN_PAGE_ERROR, win32.EXCEPTION_GUARD_PAGE): + msg = "This method is not meaningful for %s." + raise NotImplementedError(msg % self.get_exception_name()) + return self.get_exception_information(0) + + def get_fault_address(self): + """ + @rtype: int + @return: Access violation memory address. + + @note: This method is only meaningful for access violation exceptions, + in-page memory error exceptions and guard page exceptions. + + @raise NotImplementedError: Wrong kind of exception. + """ + if self.get_exception_code() not in (win32.EXCEPTION_ACCESS_VIOLATION, win32.EXCEPTION_IN_PAGE_ERROR, win32.EXCEPTION_GUARD_PAGE): + msg = "This method is not meaningful for %s." + raise NotImplementedError(msg % self.get_exception_name()) + return self.get_exception_information(1) + + def get_ntstatus_code(self): + """ + @rtype: int + @return: NTSTATUS status code that caused the exception. + + @note: This method is only meaningful for in-page memory error + exceptions. + + @raise NotImplementedError: Not an in-page memory error. + """ + if self.get_exception_code() != win32.EXCEPTION_IN_PAGE_ERROR: + msg = "This method is only meaningful " "for in-page memory error exceptions." + raise NotImplementedError(msg) + return self.get_exception_information(2) + + def is_nested(self): + """ + @rtype: bool + @return: Returns C{True} if there are additional exception records + associated with this exception. This would mean the exception + is nested, that is, it was triggered while trying to handle + at least one previous exception. + """ + return bool(self.raw.u.Exception.ExceptionRecord.ExceptionRecord) + + def get_raw_exception_record_list(self): + """ + Traverses the exception record linked list and builds a Python list. + + Nested exception records are received for nested exceptions. This + happens when an exception is raised in the debugee while trying to + handle a previous exception. + + @rtype: list( L{win32.EXCEPTION_RECORD} ) + @return: + List of raw exception record structures as used by the Win32 API. + + There is always at least one exception record, so the list is + never empty. All other methods of this class read from the first + exception record only, that is, the most recent exception. + """ + # The first EXCEPTION_RECORD is contained in EXCEPTION_DEBUG_INFO. + # The remaining EXCEPTION_RECORD structures are linked by pointers. + nested = list() + record = self.raw.u.Exception + while True: + record = record.ExceptionRecord + if not record: + break + nested.append(record) + return nested + + def get_nested_exceptions(self): + """ + Traverses the exception record linked list and builds a Python list. + + Nested exception records are received for nested exceptions. This + happens when an exception is raised in the debugee while trying to + handle a previous exception. + + @rtype: list( L{ExceptionEvent} ) + @return: + List of ExceptionEvent objects representing each exception record + found in this event. + + There is always at least one exception record, so the list is + never empty. All other methods of this class read from the first + exception record only, that is, the most recent exception. + """ + # The list always begins with ourselves. + # Just put a reference to "self" as the first element, + # and start looping from the second exception record. + nested = [self] + raw = self.raw + dwDebugEventCode = raw.dwDebugEventCode + dwProcessId = raw.dwProcessId + dwThreadId = raw.dwThreadId + dwFirstChance = raw.u.Exception.dwFirstChance + record = raw.u.Exception.ExceptionRecord + while True: + record = record.ExceptionRecord + if not record: + break + raw = win32.DEBUG_EVENT() + raw.dwDebugEventCode = dwDebugEventCode + raw.dwProcessId = dwProcessId + raw.dwThreadId = dwThreadId + raw.u.Exception.ExceptionRecord = record + raw.u.Exception.dwFirstChance = dwFirstChance + event = EventFactory.get(self.debug, raw) + nested.append(event) + return nested + + +# ============================================================================== + + +class CreateThreadEvent(Event): + """ + Thread creation event. + """ + + eventMethod = "create_thread" + eventName = "Thread creation event" + eventDescription = "A new thread has started." + + def get_thread_handle(self): + """ + @rtype: L{ThreadHandle} + @return: Thread handle received from the system. + Returns C{None} if the handle is not available. + """ + # The handle doesn't need to be closed. + # See http://msdn.microsoft.com/en-us/library/ms681423(VS.85).aspx + hThread = self.raw.u.CreateThread.hThread + if hThread in (0, win32.NULL, win32.INVALID_HANDLE_VALUE): + hThread = None + else: + hThread = ThreadHandle(hThread, False, win32.THREAD_ALL_ACCESS) + return hThread + + def get_teb(self): + """ + @rtype: int + @return: Pointer to the TEB. + """ + return self.raw.u.CreateThread.lpThreadLocalBase + + def get_start_address(self): + """ + @rtype: int + @return: Pointer to the first instruction to execute in this thread. + + Returns C{NULL} when the debugger attached to a process + and the thread already existed. + + See U{http://msdn.microsoft.com/en-us/library/ms679295(VS.85).aspx} + """ + return self.raw.u.CreateThread.lpStartAddress + + +# ============================================================================== + + +class CreateProcessEvent(Event): + """ + Process creation event. + """ + + eventMethod = "create_process" + eventName = "Process creation event" + eventDescription = "A new process has started." + + def get_file_handle(self): + """ + @rtype: L{FileHandle} or None + @return: File handle to the main module, received from the system. + Returns C{None} if the handle is not available. + """ + # This handle DOES need to be closed. + # Therefore we must cache it so it doesn't + # get closed after the first call. + try: + hFile = self.__hFile + except AttributeError: + hFile = self.raw.u.CreateProcessInfo.hFile + if hFile in (0, win32.NULL, win32.INVALID_HANDLE_VALUE): + hFile = None + else: + hFile = FileHandle(hFile, True) + self.__hFile = hFile + return hFile + + def get_process_handle(self): + """ + @rtype: L{ProcessHandle} + @return: Process handle received from the system. + Returns C{None} if the handle is not available. + """ + # The handle doesn't need to be closed. + # See http://msdn.microsoft.com/en-us/library/ms681423(VS.85).aspx + hProcess = self.raw.u.CreateProcessInfo.hProcess + if hProcess in (0, win32.NULL, win32.INVALID_HANDLE_VALUE): + hProcess = None + else: + hProcess = ProcessHandle(hProcess, False, win32.PROCESS_ALL_ACCESS) + return hProcess + + def get_thread_handle(self): + """ + @rtype: L{ThreadHandle} + @return: Thread handle received from the system. + Returns C{None} if the handle is not available. + """ + # The handle doesn't need to be closed. + # See http://msdn.microsoft.com/en-us/library/ms681423(VS.85).aspx + hThread = self.raw.u.CreateProcessInfo.hThread + if hThread in (0, win32.NULL, win32.INVALID_HANDLE_VALUE): + hThread = None + else: + hThread = ThreadHandle(hThread, False, win32.THREAD_ALL_ACCESS) + return hThread + + def get_start_address(self): + """ + @rtype: int + @return: Pointer to the first instruction to execute in this process. + + Returns C{NULL} when the debugger attaches to a process. + + See U{http://msdn.microsoft.com/en-us/library/ms679295(VS.85).aspx} + """ + return self.raw.u.CreateProcessInfo.lpStartAddress + + def get_image_base(self): + """ + @rtype: int + @return: Base address of the main module. + @warn: This value is taken from the PE file + and may be incorrect because of ASLR! + """ + # TODO try to calculate the real value when ASLR is active. + return self.raw.u.CreateProcessInfo.lpBaseOfImage + + def get_teb(self): + """ + @rtype: int + @return: Pointer to the TEB. + """ + return self.raw.u.CreateProcessInfo.lpThreadLocalBase + + def get_debug_info(self): + """ + @rtype: str + @return: Debugging information. + """ + raw = self.raw.u.CreateProcessInfo + ptr = raw.lpBaseOfImage + raw.dwDebugInfoFileOffset + size = raw.nDebugInfoSize + data = self.get_process().peek(ptr, size) + if len(data) == size: + return data + return None + + def get_filename(self): + """ + @rtype: str, None + @return: This method does it's best to retrieve the filename to + the main module of the process. However, sometimes that's not + possible, and C{None} is returned instead. + """ + + # Try to get the filename from the file handle. + szFilename = None + hFile = self.get_file_handle() + if hFile: + szFilename = hFile.get_filename() + if not szFilename: + # Try to get it from CREATE_PROCESS_DEBUG_INFO.lpImageName + # It's NULL or *NULL most of the times, see MSDN: + # http://msdn.microsoft.com/en-us/library/ms679286(VS.85).aspx + aProcess = self.get_process() + lpRemoteFilenamePtr = self.raw.u.CreateProcessInfo.lpImageName + if lpRemoteFilenamePtr: + lpFilename = aProcess.peek_uint(lpRemoteFilenamePtr) + fUnicode = bool(self.raw.u.CreateProcessInfo.fUnicode) + szFilename = aProcess.peek_string(lpFilename, fUnicode) + + # XXX TODO + # Sometimes the filename is relative (ntdll.dll, kernel32.dll). + # It could be converted to an absolute pathname (SearchPath). + + # Try to get it from Process.get_image_name(). + if not szFilename: + szFilename = aProcess.get_image_name() + + # Return the filename, or None on error. + return szFilename + + def get_module_base(self): + """ + @rtype: int + @return: Base address of the main module. + """ + return self.get_image_base() + + def get_module(self): + """ + @rtype: L{Module} + @return: Main module of the process. + """ + return self.get_process().get_module(self.get_module_base()) + + +# ============================================================================== + + +class ExitThreadEvent(Event): + """ + Thread termination event. + """ + + eventMethod = "exit_thread" + eventName = "Thread termination event" + eventDescription = "A thread has finished executing." + + def get_exit_code(self): + """ + @rtype: int + @return: Exit code of the thread. + """ + return self.raw.u.ExitThread.dwExitCode + + +# ============================================================================== + + +class ExitProcessEvent(Event): + """ + Process termination event. + """ + + eventMethod = "exit_process" + eventName = "Process termination event" + eventDescription = "A process has finished executing." + + def get_exit_code(self): + """ + @rtype: int + @return: Exit code of the process. + """ + return self.raw.u.ExitProcess.dwExitCode + + def get_filename(self): + """ + @rtype: None or str + @return: Filename of the main module. + C{None} if the filename is unknown. + """ + return self.get_module().get_filename() + + def get_image_base(self): + """ + @rtype: int + @return: Base address of the main module. + """ + return self.get_module_base() + + def get_module_base(self): + """ + @rtype: int + @return: Base address of the main module. + """ + return self.get_module().get_base() + + def get_module(self): + """ + @rtype: L{Module} + @return: Main module of the process. + """ + return self.get_process().get_main_module() + + +# ============================================================================== + + +class LoadDLLEvent(Event): + """ + Module load event. + """ + + eventMethod = "load_dll" + eventName = "Module load event" + eventDescription = "A new DLL library was loaded by the debugee." + + def get_module_base(self): + """ + @rtype: int + @return: Base address for the newly loaded DLL. + """ + return self.raw.u.LoadDll.lpBaseOfDll + + def get_module(self): + """ + @rtype: L{Module} + @return: Module object for the newly loaded DLL. + """ + lpBaseOfDll = self.get_module_base() + aProcess = self.get_process() + if aProcess.has_module(lpBaseOfDll): + aModule = aProcess.get_module(lpBaseOfDll) + else: + # XXX HACK + # For some reason the module object is missing, so make a new one. + aModule = Module(lpBaseOfDll, hFile=self.get_file_handle(), fileName=self.get_filename(), process=aProcess) + aProcess._add_module(aModule) + return aModule + + def get_file_handle(self): + """ + @rtype: L{FileHandle} or None + @return: File handle to the newly loaded DLL received from the system. + Returns C{None} if the handle is not available. + """ + # This handle DOES need to be closed. + # Therefore we must cache it so it doesn't + # get closed after the first call. + try: + hFile = self.__hFile + except AttributeError: + hFile = self.raw.u.LoadDll.hFile + if hFile in (0, win32.NULL, win32.INVALID_HANDLE_VALUE): + hFile = None + else: + hFile = FileHandle(hFile, True) + self.__hFile = hFile + return hFile + + def get_filename(self): + """ + @rtype: str, None + @return: This method does it's best to retrieve the filename to + the newly loaded module. However, sometimes that's not + possible, and C{None} is returned instead. + """ + szFilename = None + + # Try to get it from LOAD_DLL_DEBUG_INFO.lpImageName + # It's NULL or *NULL most of the times, see MSDN: + # http://msdn.microsoft.com/en-us/library/ms679286(VS.85).aspx + aProcess = self.get_process() + lpRemoteFilenamePtr = self.raw.u.LoadDll.lpImageName + if lpRemoteFilenamePtr: + lpFilename = aProcess.peek_uint(lpRemoteFilenamePtr) + fUnicode = bool(self.raw.u.LoadDll.fUnicode) + szFilename = aProcess.peek_string(lpFilename, fUnicode) + if not szFilename: + szFilename = None + + # Try to get the filename from the file handle. + if not szFilename: + hFile = self.get_file_handle() + if hFile: + szFilename = hFile.get_filename() + + # Return the filename, or None on error. + return szFilename + + +# ============================================================================== + + +class UnloadDLLEvent(Event): + """ + Module unload event. + """ + + eventMethod = "unload_dll" + eventName = "Module unload event" + eventDescription = "A DLL library was unloaded by the debugee." + + def get_module_base(self): + """ + @rtype: int + @return: Base address for the recently unloaded DLL. + """ + return self.raw.u.UnloadDll.lpBaseOfDll + + def get_module(self): + """ + @rtype: L{Module} + @return: Module object for the recently unloaded DLL. + """ + lpBaseOfDll = self.get_module_base() + aProcess = self.get_process() + if aProcess.has_module(lpBaseOfDll): + aModule = aProcess.get_module(lpBaseOfDll) + else: + aModule = Module(lpBaseOfDll, process=aProcess) + aProcess._add_module(aModule) + return aModule + + def get_file_handle(self): + """ + @rtype: None or L{FileHandle} + @return: File handle to the recently unloaded DLL. + Returns C{None} if the handle is not available. + """ + hFile = self.get_module().hFile + if hFile in (0, win32.NULL, win32.INVALID_HANDLE_VALUE): + hFile = None + return hFile + + def get_filename(self): + """ + @rtype: None or str + @return: Filename of the recently unloaded DLL. + C{None} if the filename is unknown. + """ + return self.get_module().get_filename() + + +# ============================================================================== + + +class OutputDebugStringEvent(Event): + """ + Debug string output event. + """ + + eventMethod = "output_string" + eventName = "Debug string output event" + eventDescription = "The debugee sent a message to the debugger." + + def get_debug_string(self): + """ + @rtype: str, compat.unicode + @return: String sent by the debugee. + It may be ANSI or Unicode and may end with a null character. + """ + return self.get_process().peek_string( + self.raw.u.DebugString.lpDebugStringData, bool(self.raw.u.DebugString.fUnicode), self.raw.u.DebugString.nDebugStringLength + ) + + +# ============================================================================== + + +class RIPEvent(Event): + """ + RIP event. + """ + + eventMethod = "rip" + eventName = "RIP event" + eventDescription = "An error has occured and the process " "can no longer be debugged." + + def get_rip_error(self): + """ + @rtype: int + @return: RIP error code as defined by the Win32 API. + """ + return self.raw.u.RipInfo.dwError + + def get_rip_type(self): + """ + @rtype: int + @return: RIP type code as defined by the Win32 API. + May be C{0} or one of the following: + - L{win32.SLE_ERROR} + - L{win32.SLE_MINORERROR} + - L{win32.SLE_WARNING} + """ + return self.raw.u.RipInfo.dwType + + +# ============================================================================== + + +class EventFactory(StaticClass): + """ + Factory of L{Event} objects. + + @type baseEvent: L{Event} + @cvar baseEvent: + Base class for Event objects. + It's used for unknown event codes. + + @type eventClasses: dict( int S{->} L{Event} ) + @cvar eventClasses: + Dictionary that maps event codes to L{Event} subclasses. + """ + + baseEvent = Event + eventClasses = { + win32.EXCEPTION_DEBUG_EVENT: ExceptionEvent, # 1 + win32.CREATE_THREAD_DEBUG_EVENT: CreateThreadEvent, # 2 + win32.CREATE_PROCESS_DEBUG_EVENT: CreateProcessEvent, # 3 + win32.EXIT_THREAD_DEBUG_EVENT: ExitThreadEvent, # 4 + win32.EXIT_PROCESS_DEBUG_EVENT: ExitProcessEvent, # 5 + win32.LOAD_DLL_DEBUG_EVENT: LoadDLLEvent, # 6 + win32.UNLOAD_DLL_DEBUG_EVENT: UnloadDLLEvent, # 7 + win32.OUTPUT_DEBUG_STRING_EVENT: OutputDebugStringEvent, # 8 + win32.RIP_EVENT: RIPEvent, # 9 + } + + @classmethod + def get(cls, debug, raw): + """ + @type debug: L{Debug} + @param debug: Debug object that received the event. + + @type raw: L{DEBUG_EVENT} + @param raw: Raw DEBUG_EVENT structure as used by the Win32 API. + + @rtype: L{Event} + @returns: An Event object or one of it's subclasses, + depending on the event type. + """ + eventClass = cls.eventClasses.get(raw.dwDebugEventCode, cls.baseEvent) + return eventClass(debug, raw) + + +# ============================================================================== + + +class EventHandler(object): + """ + Base class for debug event handlers. + + Your program should subclass it to implement it's own event handling. + + The constructor can be overriden as long as you call the superclass + constructor. The special method L{__call__} B{MUST NOT} be overriden. + + The signature for event handlers is the following:: + + def event_handler(self, event): + + Where B{event} is an L{Event} object. + + Each event handler is named after the event they handle. + This is the list of all valid event handler names: + + - I{event} + + Receives an L{Event} object or an object of any of it's subclasses, + and handles any event for which no handler was defined. + + - I{unknown_event} + + Receives an L{Event} object or an object of any of it's subclasses, + and handles any event unknown to the debugging engine. (This is not + likely to happen unless the Win32 debugging API is changed in future + versions of Windows). + + - I{exception} + + Receives an L{ExceptionEvent} object and handles any exception for + which no handler was defined. See above for exception handlers. + + - I{unknown_exception} + + Receives an L{ExceptionEvent} object and handles any exception unknown + to the debugging engine. This usually happens for C++ exceptions, which + are not standardized and may change from one compiler to the next. + + Currently we have partial support for C++ exceptions thrown by Microsoft + compilers. + + Also see: U{RaiseException() + } + + - I{create_thread} + + Receives a L{CreateThreadEvent} object. + + - I{create_process} + + Receives a L{CreateProcessEvent} object. + + - I{exit_thread} + + Receives a L{ExitThreadEvent} object. + + - I{exit_process} + + Receives a L{ExitProcessEvent} object. + + - I{load_dll} + + Receives a L{LoadDLLEvent} object. + + - I{unload_dll} + + Receives an L{UnloadDLLEvent} object. + + - I{output_string} + + Receives an L{OutputDebugStringEvent} object. + + - I{rip} + + Receives a L{RIPEvent} object. + + This is the list of all valid exception handler names + (they all receive an L{ExceptionEvent} object): + + - I{access_violation} + - I{array_bounds_exceeded} + - I{breakpoint} + - I{control_c_exit} + - I{datatype_misalignment} + - I{debug_control_c} + - I{float_denormal_operand} + - I{float_divide_by_zero} + - I{float_inexact_result} + - I{float_invalid_operation} + - I{float_overflow} + - I{float_stack_check} + - I{float_underflow} + - I{guard_page} + - I{illegal_instruction} + - I{in_page_error} + - I{integer_divide_by_zero} + - I{integer_overflow} + - I{invalid_disposition} + - I{invalid_handle} + - I{ms_vc_exception} + - I{noncontinuable_exception} + - I{possible_deadlock} + - I{privileged_instruction} + - I{single_step} + - I{stack_overflow} + - I{wow64_breakpoint} + + + + @type apiHooks: dict( str S{->} list( tuple( str, int ) ) ) + @cvar apiHooks: + Dictionary that maps module names to lists of + tuples of ( procedure name, parameter count ). + + All procedures listed here will be hooked for calls from the debugee. + When this happens, the corresponding event handler can be notified both + when the procedure is entered and when it's left by the debugee. + + For example, let's hook the LoadLibraryEx() API call. + This would be the declaration of apiHooks:: + + from winappdbg import EventHandler + from winappdbg.win32 import * + + # (...) + + class MyEventHandler (EventHandler): + + apiHook = { + + "kernel32.dll" : ( + + # Procedure name Signature + ( "LoadLibraryEx", (PVOID, HANDLE, DWORD) ), + + # (more procedures can go here...) + ), + + # (more libraries can go here...) + } + + # (your method definitions go here...) + + Note that all pointer types are treated like void pointers, so your + callback won't get the string or structure pointed to by it, but the + remote memory address instead. This is so to prevent the ctypes library + from being "too helpful" and trying to dereference the pointer. To get + the actual data being pointed to, use one of the L{Process.read} + methods. + + Now, to intercept calls to LoadLibraryEx define a method like this in + your event handler class:: + + def pre_LoadLibraryEx(self, event, ra, lpFilename, hFile, dwFlags): + szFilename = event.get_process().peek_string(lpFilename) + + # (...) + + Note that the first parameter is always the L{Event} object, and the + second parameter is the return address. The third parameter and above + are the values passed to the hooked function. + + Finally, to intercept returns from calls to LoadLibraryEx define a + method like this:: + + def post_LoadLibraryEx(self, event, retval): + # (...) + + The first parameter is the L{Event} object and the second is the + return value from the hooked function. + """ + + # ------------------------------------------------------------------------------ + + # Default (empty) API hooks dictionary. + apiHooks = {} + + def __init__(self): + """ + Class constructor. Don't forget to call it when subclassing! + + Forgetting to call the superclass constructor is a common mistake when + you're new to Python. :) + + Example:: + class MyEventHandler (EventHandler): + + # Override the constructor to use an extra argument. + def __init__(self, myArgument): + + # Do something with the argument, like keeping it + # as an instance variable. + self.myVariable = myArgument + + # Call the superclass constructor. + super(MyEventHandler, self).__init__() + + # The rest of your code below... + """ + + # TODO + # All this does is set up the hooks. + # This code should be moved to the EventDispatcher class. + # Then the hooks can be set up at set_event_handler() instead, making + # this class even simpler. The downside here is deciding where to store + # the ApiHook objects. + + # Convert the tuples into instances of the ApiHook class. + # A new dictionary must be instanced, otherwise we could also be + # affecting all other instances of the EventHandler. + apiHooks = dict() + for lib, hooks in compat.iteritems(self.apiHooks): + hook_objs = [] + for proc, args in hooks: + if type(args) in (int, long): + h = ApiHook(self, lib, proc, paramCount=args) + else: + h = ApiHook(self, lib, proc, signature=args) + hook_objs.append(h) + apiHooks[lib] = hook_objs + self.__apiHooks = apiHooks + + def __get_hooks_for_dll(self, event): + """ + Get the requested API hooks for the current DLL. + + Used by L{__hook_dll} and L{__unhook_dll}. + """ + result = [] + if self.__apiHooks: + path = event.get_module().get_filename() + if path: + lib_name = PathOperations.pathname_to_filename(path).lower() + for hook_lib, hook_api_list in compat.iteritems(self.__apiHooks): + if hook_lib == lib_name: + result.extend(hook_api_list) + return result + + def __hook_dll(self, event): + """ + Hook the requested API calls (in self.apiHooks). + + This method is called automatically whenever a DLL is loaded. + """ + debug = event.debug + pid = event.get_pid() + for hook_api_stub in self.__get_hooks_for_dll(event): + hook_api_stub.hook(debug, pid) + + def __unhook_dll(self, event): + """ + Unhook the requested API calls (in self.apiHooks). + + This method is called automatically whenever a DLL is unloaded. + """ + debug = event.debug + pid = event.get_pid() + for hook_api_stub in self.__get_hooks_for_dll(event): + hook_api_stub.unhook(debug, pid) + + def __call__(self, event): + """ + Dispatch debug events. + + @warn: B{Don't override this method!} + + @type event: L{Event} + @param event: Event object. + """ + try: + code = event.get_event_code() + if code == win32.LOAD_DLL_DEBUG_EVENT: + self.__hook_dll(event) + elif code == win32.UNLOAD_DLL_DEBUG_EVENT: + self.__unhook_dll(event) + finally: + method = EventDispatcher.get_handler_method(self, event) + if method is not None: + return method(event) + + +# ============================================================================== + +# TODO +# * Make it more generic by adding a few more callbacks. +# That way it will be possible to make a thread sifter too. +# * This interface feels too much like an antipattern. +# When apiHooks is deprecated this will have to be reviewed. + + +class EventSift(EventHandler): + """ + Event handler that allows you to use customized event handlers for each + process you're attached to. + + This makes coding the event handlers much easier, because each instance + will only "know" about one process. So you can code your event handler as + if only one process was being debugged, but your debugger can attach to + multiple processes. + + Example:: + from winappdbg import Debug, EventHandler, EventSift + + # This class was written assuming only one process is attached. + # If you used it directly it would break when attaching to another + # process, or when a child process is spawned. + class MyEventHandler (EventHandler): + + def create_process(self, event): + self.first = True + self.name = event.get_process().get_filename() + print "Attached to %s" % self.name + + def breakpoint(self, event): + if self.first: + self.first = False + print "First breakpoint reached at %s" % self.name + + def exit_process(self, event): + print "Detached from %s" % self.name + + # Now when debugging we use the EventSift to be able to work with + # multiple processes while keeping our code simple. :) + if __name__ == "__main__": + handler = EventSift(MyEventHandler) + #handler = MyEventHandler() # try uncommenting this line... + with Debug(handler) as debug: + debug.execl("calc.exe") + debug.execl("notepad.exe") + debug.execl("charmap.exe") + debug.loop() + + Subclasses of C{EventSift} can prevent specific event types from + being forwarded by simply defining a method for it. That means your + subclass can handle some event types globally while letting other types + be handled on per-process basis. To forward events manually you can + call C{self.event(event)}. + + Example:: + class MySift (EventSift): + + # Don't forward this event. + def debug_control_c(self, event): + pass + + # Handle this event globally without forwarding it. + def output_string(self, event): + print "Debug string: %s" % event.get_debug_string() + + # Handle this event globally and then forward it. + def create_process(self, event): + print "New process created, PID: %d" % event.get_pid() + return self.event(event) + + # All other events will be forwarded. + + Note that overriding the C{event} method would cause no events to be + forwarded at all. To prevent this, call the superclass implementation. + + Example:: + + def we_want_to_forward_this_event(event): + "Use whatever logic you want here..." + # (...return True or False...) + + class MySift (EventSift): + + def event(self, event): + + # If the event matches some custom criteria... + if we_want_to_forward_this_event(event): + + # Forward it. + return super(MySift, self).event(event) + + # Otherwise, don't. + + @type cls: class + @ivar cls: + Event handler class. There will be one instance of this class + per debugged process in the L{forward} dictionary. + + @type argv: list + @ivar argv: + Positional arguments to pass to the constructor of L{cls}. + + @type argd: list + @ivar argd: + Keyword arguments to pass to the constructor of L{cls}. + + @type forward: dict + @ivar forward: + Dictionary that maps each debugged process ID to an instance of L{cls}. + """ + + def __init__(self, cls, *argv, **argd): + """ + Maintains an instance of your event handler for each process being + debugged, and forwards the events of each process to each corresponding + instance. + + @warn: If you subclass L{EventSift} and reimplement this method, + don't forget to call the superclass constructor! + + @see: L{event} + + @type cls: class + @param cls: Event handler class. This must be the class itself, not an + instance! All additional arguments passed to the constructor of + the event forwarder will be passed on to the constructor of this + class as well. + """ + self.cls = cls + self.argv = argv + self.argd = argd + self.forward = dict() + super(EventSift, self).__init__() + + # XXX HORRIBLE HACK + # This makes apiHooks work in the inner handlers. + def __call__(self, event): + try: + eventCode = event.get_event_code() + if eventCode in (win32.LOAD_DLL_DEBUG_EVENT, win32.LOAD_DLL_DEBUG_EVENT): + pid = event.get_pid() + handler = self.forward.get(pid, None) + if handler is None: + handler = self.cls(*self.argv, **self.argd) + self.forward[pid] = handler + if isinstance(handler, EventHandler): + if eventCode == win32.LOAD_DLL_DEBUG_EVENT: + handler.__EventHandler_hook_dll(event) + else: + handler.__EventHandler_unhook_dll(event) + finally: + return super(EventSift, self).__call__(event) + + def event(self, event): + """ + Forwards events to the corresponding instance of your event handler + for this process. + + If you subclass L{EventSift} and reimplement this method, no event + will be forwarded at all unless you call the superclass implementation. + + If your filtering is based on the event type, there's a much easier way + to do it: just implement a handler for it. + """ + eventCode = event.get_event_code() + pid = event.get_pid() + handler = self.forward.get(pid, None) + if handler is None: + handler = self.cls(*self.argv, **self.argd) + if eventCode != win32.EXIT_PROCESS_DEBUG_EVENT: + self.forward[pid] = handler + elif eventCode == win32.EXIT_PROCESS_DEBUG_EVENT: + del self.forward[pid] + return handler(event) + + +# ============================================================================== + + +class EventDispatcher(object): + """ + Implements debug event dispatching capabilities. + + @group Debugging events: + get_event_handler, set_event_handler, get_handler_method + """ + + # Maps event code constants to the names of the pre-notify routines. + # These routines are called BEFORE the user-defined handlers. + # Unknown codes are ignored. + __preEventNotifyCallbackName = { + win32.CREATE_THREAD_DEBUG_EVENT: "_notify_create_thread", + win32.CREATE_PROCESS_DEBUG_EVENT: "_notify_create_process", + win32.LOAD_DLL_DEBUG_EVENT: "_notify_load_dll", + } + + # Maps event code constants to the names of the post-notify routines. + # These routines are called AFTER the user-defined handlers. + # Unknown codes are ignored. + __postEventNotifyCallbackName = { + win32.EXIT_THREAD_DEBUG_EVENT: "_notify_exit_thread", + win32.EXIT_PROCESS_DEBUG_EVENT: "_notify_exit_process", + win32.UNLOAD_DLL_DEBUG_EVENT: "_notify_unload_dll", + win32.RIP_EVENT: "_notify_rip", + } + + # Maps exception code constants to the names of the pre-notify routines. + # These routines are called BEFORE the user-defined handlers. + # Unknown codes are ignored. + __preExceptionNotifyCallbackName = { + win32.EXCEPTION_BREAKPOINT: "_notify_breakpoint", + win32.EXCEPTION_WX86_BREAKPOINT: "_notify_breakpoint", + win32.EXCEPTION_SINGLE_STEP: "_notify_single_step", + win32.EXCEPTION_GUARD_PAGE: "_notify_guard_page", + win32.DBG_CONTROL_C: "_notify_debug_control_c", + win32.MS_VC_EXCEPTION: "_notify_ms_vc_exception", + } + + # Maps exception code constants to the names of the post-notify routines. + # These routines are called AFTER the user-defined handlers. + # Unknown codes are ignored. + __postExceptionNotifyCallbackName = {} + + def __init__(self, eventHandler=None): + """ + Event dispatcher. + + @type eventHandler: L{EventHandler} + @param eventHandler: (Optional) User-defined event handler. + + @raise TypeError: The event handler is of an incorrect type. + + @note: The L{eventHandler} parameter may be any callable Python object + (for example a function, or an instance method). + However you'll probably find it more convenient to use an instance + of a subclass of L{EventHandler} here. + """ + self.set_event_handler(eventHandler) + + def get_event_handler(self): + """ + Get the event handler. + + @see: L{set_event_handler} + + @rtype: L{EventHandler} + @return: Current event handler object, or C{None}. + """ + return self.__eventHandler + + def set_event_handler(self, eventHandler): + """ + Set the event handler. + + @warn: This is normally not needed. Use with care! + + @type eventHandler: L{EventHandler} + @param eventHandler: New event handler object, or C{None}. + + @rtype: L{EventHandler} + @return: Previous event handler object, or C{None}. + + @raise TypeError: The event handler is of an incorrect type. + + @note: The L{eventHandler} parameter may be any callable Python object + (for example a function, or an instance method). + However you'll probably find it more convenient to use an instance + of a subclass of L{EventHandler} here. + """ + if eventHandler is not None and not callable(eventHandler): + raise TypeError("Event handler must be a callable object") + try: + wrong_type = issubclass(eventHandler, EventHandler) + except TypeError: + wrong_type = False + if wrong_type: + classname = str(eventHandler) + msg = "Event handler must be an instance of class %s" + msg += "rather than the %s class itself. (Missing parens?)" + msg = msg % (classname, classname) + raise TypeError(msg) + try: + previous = self.__eventHandler + except AttributeError: + previous = None + self.__eventHandler = eventHandler + return previous + + @staticmethod + def get_handler_method(eventHandler, event, fallback=None): + """ + Retrieves the appropriate callback method from an L{EventHandler} + instance for the given L{Event} object. + + @type eventHandler: L{EventHandler} + @param eventHandler: + Event handler object whose methods we are examining. + + @type event: L{Event} + @param event: Debugging event to be handled. + + @type fallback: callable + @param fallback: (Optional) If no suitable method is found in the + L{EventHandler} instance, return this value. + + @rtype: callable + @return: Bound method that will handle the debugging event. + Returns C{None} if no such method is defined. + """ + eventCode = event.get_event_code() + method = getattr(eventHandler, "event", fallback) + if eventCode == win32.EXCEPTION_DEBUG_EVENT: + method = getattr(eventHandler, "exception", method) + method = getattr(eventHandler, event.eventMethod, method) + return method + + def dispatch(self, event): + """ + Sends event notifications to the L{Debug} object and + the L{EventHandler} object provided by the user. + + The L{Debug} object will forward the notifications to it's contained + snapshot objects (L{System}, L{Process}, L{Thread} and L{Module}) when + appropriate. + + @warning: This method is called automatically from L{Debug.dispatch}. + + @see: L{Debug.cont}, L{Debug.loop}, L{Debug.wait} + + @type event: L{Event} + @param event: Event object passed to L{Debug.dispatch}. + + @raise WindowsError: Raises an exception on error. + """ + returnValue = None + bCallHandler = True + pre_handler = None + post_handler = None + eventCode = event.get_event_code() + + # Get the pre and post notification methods for exceptions. + # If not found, the following steps take care of that. + if eventCode == win32.EXCEPTION_DEBUG_EVENT: + exceptionCode = event.get_exception_code() + pre_name = self.__preExceptionNotifyCallbackName.get(exceptionCode, None) + post_name = self.__postExceptionNotifyCallbackName.get(exceptionCode, None) + if pre_name is not None: + pre_handler = getattr(self, pre_name, None) + if post_name is not None: + post_handler = getattr(self, post_name, None) + + # Get the pre notification method for all other events. + # This includes the exception event if no notify method was found + # for this exception code. + if pre_handler is None: + pre_name = self.__preEventNotifyCallbackName.get(eventCode, None) + if pre_name is not None: + pre_handler = getattr(self, pre_name, pre_handler) + + # Get the post notification method for all other events. + # This includes the exception event if no notify method was found + # for this exception code. + if post_handler is None: + post_name = self.__postEventNotifyCallbackName.get(eventCode, None) + if post_name is not None: + post_handler = getattr(self, post_name, post_handler) + + # Call the pre-notify method only if it was defined. + # If an exception is raised don't call the other methods. + if pre_handler is not None: + bCallHandler = pre_handler(event) + + # Call the user-defined event handler only if the pre-notify + # method was not defined, or was and it returned True. + try: + if bCallHandler and self.__eventHandler is not None: + try: + returnValue = self.__eventHandler(event) + except Exception: + e = sys.exc_info()[1] + msg = "Event handler pre-callback %r" " raised an exception: %s" + msg = msg % (self.__eventHandler, traceback.format_exc(e)) + warnings.warn(msg, EventCallbackWarning) + returnValue = None + + # Call the post-notify method if defined, even if an exception is + # raised by the user-defined event handler. + finally: + if post_handler is not None: + post_handler(event) + + # Return the value from the call to the user-defined event handler. + # If not defined return None. + return returnValue diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/interactive.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/interactive.py new file mode 100644 index 0000000..bf8253f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/interactive.py @@ -0,0 +1,2269 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Acknowledgements: +# Nicolas Economou, for his command line debugger on which this is inspired. +# http://tinyurl.com/nicolaseconomou + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Interactive debugging console. + +@group Debugging: + ConsoleDebugger + +@group Exceptions: + CmdError +""" + +from __future__ import with_statement + +__revision__ = "$Id$" + +__all__ = ["ConsoleDebugger", "CmdError"] + +# TODO document this module with docstrings. +# TODO command to set a last error breakpoint. +# TODO command to show available plugins. + +from winappdbg import win32 +from winappdbg import compat +from winappdbg.system import System +from winappdbg.util import PathOperations +from winappdbg.event import EventHandler, NoEvent +from winappdbg.textio import HexInput, HexOutput, HexDump, CrashDump, DebugLog + +import os +import sys +import code +import time +import warnings +import traceback + +# too many variables named "cmd" to have a module by the same name :P +from cmd import Cmd + +# lazy imports +readline = None + +# ============================================================================== + + +class DummyEvent(NoEvent): + "Dummy event object used internally by L{ConsoleDebugger}." + + def get_pid(self): + return self._pid + + def get_tid(self): + return self._tid + + def get_process(self): + return self._process + + def get_thread(self): + return self._thread + + +# ============================================================================== + + +class CmdError(Exception): + """ + Exception raised when a command parsing error occurs. + Used internally by L{ConsoleDebugger}. + """ + + +# ============================================================================== + + +class ConsoleDebugger(Cmd, EventHandler): + """ + Interactive console debugger. + + @see: L{Debug.interactive} + """ + + # ------------------------------------------------------------------------------ + # Class variables + + # Exception to raise when an error occurs executing a command. + command_error_exception = CmdError + + # Milliseconds to wait for debug events in the main loop. + dwMilliseconds = 100 + + # History file name. + history_file = ".winappdbg_history" + + # Confirm before quitting? + confirm_quit = True + + # Valid plugin name characters. + valid_plugin_name_chars = "ABCDEFGHIJKLMNOPQRSTUVWXY" "abcdefghijklmnopqrstuvwxy" "012345678" "_" + + # Names of the registers. + segment_names = ("cs", "ds", "es", "fs", "gs") + + register_alias_64_to_32 = { + "eax": "Rax", + "ebx": "Rbx", + "ecx": "Rcx", + "edx": "Rdx", + "eip": "Rip", + "ebp": "Rbp", + "esp": "Rsp", + "esi": "Rsi", + "edi": "Rdi", + } + register_alias_64_to_16 = {"ax": "Rax", "bx": "Rbx", "cx": "Rcx", "dx": "Rdx"} + register_alias_64_to_8_low = {"al": "Rax", "bl": "Rbx", "cl": "Rcx", "dl": "Rdx"} + register_alias_64_to_8_high = {"ah": "Rax", "bh": "Rbx", "ch": "Rcx", "dh": "Rdx"} + register_alias_32_to_16 = {"ax": "Eax", "bx": "Ebx", "cx": "Ecx", "dx": "Edx"} + register_alias_32_to_8_low = {"al": "Eax", "bl": "Ebx", "cl": "Ecx", "dl": "Edx"} + register_alias_32_to_8_high = {"ah": "Eax", "bh": "Ebx", "ch": "Ecx", "dh": "Edx"} + + register_aliases_full_32 = list(segment_names) + register_aliases_full_32.extend(compat.iterkeys(register_alias_32_to_16)) + register_aliases_full_32.extend(compat.iterkeys(register_alias_32_to_8_low)) + register_aliases_full_32.extend(compat.iterkeys(register_alias_32_to_8_high)) + register_aliases_full_32 = tuple(register_aliases_full_32) + + register_aliases_full_64 = list(segment_names) + register_aliases_full_64.extend(compat.iterkeys(register_alias_64_to_32)) + register_aliases_full_64.extend(compat.iterkeys(register_alias_64_to_16)) + register_aliases_full_64.extend(compat.iterkeys(register_alias_64_to_8_low)) + register_aliases_full_64.extend(compat.iterkeys(register_alias_64_to_8_high)) + register_aliases_full_64 = tuple(register_aliases_full_64) + + # Names of the control flow instructions. + jump_instructions = ( + "jmp", + "jecxz", + "jcxz", + "ja", + "jnbe", + "jae", + "jnb", + "jb", + "jnae", + "jbe", + "jna", + "jc", + "je", + "jz", + "jnc", + "jne", + "jnz", + "jnp", + "jpo", + "jp", + "jpe", + "jg", + "jnle", + "jge", + "jnl", + "jl", + "jnge", + "jle", + "jng", + "jno", + "jns", + "jo", + "js", + ) + call_instructions = ("call", "ret", "retn") + loop_instructions = ("loop", "loopz", "loopnz", "loope", "loopne") + control_flow_instructions = call_instructions + loop_instructions + jump_instructions + + # ------------------------------------------------------------------------------ + # Instance variables + + def __init__(self): + """ + Interactive console debugger. + + @see: L{Debug.interactive} + """ + Cmd.__init__(self) + EventHandler.__init__(self) + + # Quit the debugger when True. + self.debuggerExit = False + + # Full path to the history file. + self.history_file_full_path = None + + # Last executed command. + self.__lastcmd = "" + + # ------------------------------------------------------------------------------ + # Debugger + + # Use this Debug object. + def start_using_debugger(self, debug): + # Clear the previous Debug object. + self.stop_using_debugger() + + # Keep the Debug object. + self.debug = debug + + # Set ourselves as the event handler for the debugger. + self.prevHandler = debug.set_event_handler(self) + + # Stop using the Debug object given by start_using_debugger(). + # Circular references must be removed, or the destructors never get called. + def stop_using_debugger(self): + if hasattr(self, "debug"): + debug = self.debug + debug.set_event_handler(self.prevHandler) + del self.prevHandler + del self.debug + return debug + return None + + # Destroy the Debug object. + def destroy_debugger(self, autodetach=True): + debug = self.stop_using_debugger() + if debug is not None: + if not autodetach: + debug.kill_all(bIgnoreExceptions=True) + debug.lastEvent = None + debug.stop() + del debug + + @property + def lastEvent(self): + return self.debug.lastEvent + + def set_fake_last_event(self, process): + if self.lastEvent is None: + self.debug.lastEvent = DummyEvent(self.debug) + self.debug.lastEvent._process = process + self.debug.lastEvent._thread = process.get_thread(process.get_thread_ids()[0]) + self.debug.lastEvent._pid = process.get_pid() + self.debug.lastEvent._tid = self.lastEvent._thread.get_tid() + + # ------------------------------------------------------------------------------ + # Input + + # TODO + # * try to guess breakpoints when insufficient data is given + # * child Cmd instances will have to be used for other prompts, for example + # when assembling or editing memory - it may also be a good idea to think + # if it's possible to make the main Cmd instance also a child, instead of + # the debugger itself - probably the same goes for the EventHandler, maybe + # it can be used as a contained object rather than a parent class. + + # Join a token list into an argument string. + def join_tokens(self, token_list): + return self.debug.system.argv_to_cmdline(token_list) + + # Split an argument string into a token list. + def split_tokens(self, arg, min_count=0, max_count=None): + token_list = self.debug.system.cmdline_to_argv(arg) + if len(token_list) < min_count: + raise CmdError("missing parameters.") + if max_count and len(token_list) > max_count: + raise CmdError("too many parameters.") + return token_list + + # Token is a thread ID or name. + def input_thread(self, token): + targets = self.input_thread_list([token]) + if len(targets) == 0: + raise CmdError("missing thread name or ID") + if len(targets) > 1: + msg = "more than one thread with that name:\n" + for tid in targets: + msg += "\t%d\n" % tid + msg = msg[: -len("\n")] + raise CmdError(msg) + return targets[0] + + # Token list is a list of thread IDs or names. + def input_thread_list(self, token_list): + targets = set() + system = self.debug.system + for token in token_list: + try: + tid = self.input_integer(token) + if not system.has_thread(tid): + raise CmdError("thread not found (%d)" % tid) + targets.add(tid) + except ValueError: + found = set() + for process in system.iter_processes(): + found.update(system.find_threads_by_name(token)) + if not found: + raise CmdError("thread not found (%s)" % token) + for thread in found: + targets.add(thread.get_tid()) + targets = list(targets) + targets.sort() + return targets + + # Token is a process ID or name. + def input_process(self, token): + targets = self.input_process_list([token]) + if len(targets) == 0: + raise CmdError("missing process name or ID") + if len(targets) > 1: + msg = "more than one process with that name:\n" + for pid in targets: + msg += "\t%d\n" % pid + msg = msg[: -len("\n")] + raise CmdError(msg) + return targets[0] + + # Token list is a list of process IDs or names. + def input_process_list(self, token_list): + targets = set() + system = self.debug.system + for token in token_list: + try: + pid = self.input_integer(token) + if not system.has_process(pid): + raise CmdError("process not found (%d)" % pid) + targets.add(pid) + except ValueError: + found = system.find_processes_by_filename(token) + if not found: + raise CmdError("process not found (%s)" % token) + for process, _ in found: + targets.add(process.get_pid()) + targets = list(targets) + targets.sort() + return targets + + # Token is a command line to execute. + def input_command_line(self, command_line): + argv = self.debug.system.cmdline_to_argv(command_line) + if not argv: + raise CmdError("missing command line to execute") + fname = argv[0] + if not os.path.exists(fname): + try: + fname, _ = win32.SearchPath(None, fname, ".exe") + except WindowsError: + raise CmdError("file not found: %s" % fname) + argv[0] = fname + command_line = self.debug.system.argv_to_cmdline(argv) + return command_line + + # Token is an integer. + # Only hexadecimal format is supported. + def input_hexadecimal_integer(self, token): + return int(token, 0x10) + + # Token is an integer. + # It can be in any supported format. + def input_integer(self, token): + return HexInput.integer(token) + + # # input_integer = input_hexadecimal_integer + + # Token is an address. + # The address can be a integer, a label or a register. + def input_address(self, token, pid=None, tid=None): + address = None + if self.is_register(token): + if tid is None: + if self.lastEvent is None or pid != self.lastEvent.get_pid(): + msg = "can't resolve register (%s) for unknown thread" + raise CmdError(msg % token) + tid = self.lastEvent.get_tid() + address = self.input_register(token, tid) + if address is None: + try: + address = self.input_hexadecimal_integer(token) + except ValueError: + if pid is None: + if self.lastEvent is None: + raise CmdError("no current process set") + process = self.lastEvent.get_process() + elif self.lastEvent is not None and pid == self.lastEvent.get_pid(): + process = self.lastEvent.get_process() + else: + try: + process = self.debug.system.get_process(pid) + except KeyError: + raise CmdError("process not found (%d)" % pid) + try: + address = process.resolve_label(token) + except Exception: + raise CmdError("unknown address (%s)" % token) + return address + + # Token is an address range, or a single address. + # The addresses can be integers, labels or registers. + def input_address_range(self, token_list, pid=None, tid=None): + if len(token_list) == 2: + token_1, token_2 = token_list + address = self.input_address(token_1, pid, tid) + try: + size = self.input_integer(token_2) + except ValueError: + raise CmdError("bad address range: %s %s" % (token_1, token_2)) + elif len(token_list) == 1: + token = token_list[0] + if "-" in token: + try: + token_1, token_2 = token.split("-") + except Exception: + raise CmdError("bad address range: %s" % token) + address = self.input_address(token_1, pid, tid) + size = self.input_address(token_2, pid, tid) - address + else: + address = self.input_address(token, pid, tid) + size = None + return address, size + + # XXX TODO + # Support non-integer registers here. + def is_register(self, token): + if win32.arch == "i386": + if token in self.register_aliases_full_32: + return True + token = token.title() + for name, typ in win32.CONTEXT._fields_: + if name == token: + return win32.sizeof(typ) == win32.sizeof(win32.DWORD) + elif win32.arch == "amd64": + if token in self.register_aliases_full_64: + return True + token = token.title() + for name, typ in win32.CONTEXT._fields_: + if name == token: + return win32.sizeof(typ) == win32.sizeof(win32.DWORD64) + return False + + # The token is a register name. + # Returns None if no register name is matched. + def input_register(self, token, tid=None): + if tid is None: + if self.lastEvent is None: + raise CmdError("no current process set") + thread = self.lastEvent.get_thread() + else: + thread = self.debug.system.get_thread(tid) + ctx = thread.get_context() + + token = token.lower() + title = token.title() + + if title in ctx: + return ctx.get(title) # eax -> Eax + + if ctx.arch == "i386": + if token in self.segment_names: + return ctx.get("Seg%s" % title) # cs -> SegCs + + if token in self.register_alias_32_to_16: + return ctx.get(self.register_alias_32_to_16[token]) & 0xFFFF + + if token in self.register_alias_32_to_8_low: + return ctx.get(self.register_alias_32_to_8_low[token]) & 0xFF + + if token in self.register_alias_32_to_8_high: + return (ctx.get(self.register_alias_32_to_8_high[token]) & 0xFF00) >> 8 + + elif ctx.arch == "amd64": + if token in self.segment_names: + return ctx.get("Seg%s" % title) # cs -> SegCs + + if token in self.register_alias_64_to_32: + return ctx.get(self.register_alias_64_to_32[token]) & 0xFFFFFFFF + + if token in self.register_alias_64_to_16: + return ctx.get(self.register_alias_64_to_16[token]) & 0xFFFF + + if token in self.register_alias_64_to_8_low: + return ctx.get(self.register_alias_64_to_8_low[token]) & 0xFF + + if token in self.register_alias_64_to_8_high: + return (ctx.get(self.register_alias_64_to_8_high[token]) & 0xFF00) >> 8 + + return None + + # Token list contains an address or address range. + # The prefix is also parsed looking for process and thread IDs. + def input_full_address_range(self, token_list): + pid, tid = self.get_process_and_thread_ids_from_prefix() + address, size = self.input_address_range(token_list, pid, tid) + return pid, tid, address, size + + # Token list contains a breakpoint. + def input_breakpoint(self, token_list): + pid, tid, address, size = self.input_full_address_range(token_list) + if not self.debug.is_debugee(pid): + raise CmdError("target process is not being debugged") + return pid, tid, address, size + + # Token list contains a memory address, and optional size and process. + # Sets the results as the default for the next display command. + def input_display(self, token_list, default_size=64): + pid, tid, address, size = self.input_full_address_range(token_list) + if not size: + size = default_size + next_address = HexOutput.integer(address + size) + self.default_display_target = next_address + return pid, tid, address, size + + # ------------------------------------------------------------------------------ + # Output + + # Tell the user a module was loaded. + def print_module_load(self, event): + mod = event.get_module() + base = mod.get_base() + name = mod.get_filename() + if not name: + name = "" + msg = "Loaded module (%s) %s" + msg = msg % (HexDump.address(base), name) + print(msg) + + # Tell the user a module was unloaded. + def print_module_unload(self, event): + mod = event.get_module() + base = mod.get_base() + name = mod.get_filename() + if not name: + name = "" + msg = "Unloaded module (%s) %s" + msg = msg % (HexDump.address(base), name) + print(msg) + + # Tell the user a process was started. + def print_process_start(self, event): + pid = event.get_pid() + start = event.get_start_address() + if start: + start = HexOutput.address(start) + print("Started process %d at %s" % (pid, start)) + else: + print("Attached to process %d" % pid) + + # Tell the user a thread was started. + def print_thread_start(self, event): + tid = event.get_tid() + start = event.get_start_address() + if start: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + start = event.get_process().get_label_at_address(start) + print("Started thread %d at %s" % (tid, start)) + else: + print("Attached to thread %d" % tid) + + # Tell the user a process has finished. + def print_process_end(self, event): + pid = event.get_pid() + code = event.get_exit_code() + print("Process %d terminated, exit code %d" % (pid, code)) + + # Tell the user a thread has finished. + def print_thread_end(self, event): + tid = event.get_tid() + code = event.get_exit_code() + print("Thread %d terminated, exit code %d" % (tid, code)) + + # Print(debug strings. + def print_debug_string(self, event): + tid = event.get_tid() + string = event.get_debug_string() + print("Thread %d says: %r" % (tid, string)) + + # Inform the user of any other debugging event. + def print_event(self, event): + code = HexDump.integer(event.get_event_code()) + name = event.get_event_name() + desc = event.get_event_description() + if code in desc: + print("") + print("%s: %s" % (name, desc)) + else: + print("") + print("%s (%s): %s" % (name, code, desc)) + self.print_event_location(event) + + # Stop on exceptions and prompt for commands. + def print_exception(self, event): + address = HexDump.address(event.get_exception_address()) + code = HexDump.integer(event.get_exception_code()) + desc = event.get_exception_description() + if event.is_first_chance(): + chance = "first" + else: + chance = "second" + if code in desc: + msg = "%s at address %s (%s chance)" % (desc, address, chance) + else: + msg = "%s (%s) at address %s (%s chance)" % (desc, code, address, chance) + print("") + print(msg) + self.print_event_location(event) + + # Show the current location in the code. + def print_event_location(self, event): + process = event.get_process() + thread = event.get_thread() + self.print_current_location(process, thread) + + # Show the current location in the code. + def print_breakpoint_location(self, event): + process = event.get_process() + thread = event.get_thread() + pc = event.get_exception_address() + self.print_current_location(process, thread, pc) + + # Show the current location in any process and thread. + def print_current_location(self, process=None, thread=None, pc=None): + if not process: + if self.lastEvent is None: + raise CmdError("no current process set") + process = self.lastEvent.get_process() + if not thread: + if self.lastEvent is None: + raise CmdError("no current process set") + thread = self.lastEvent.get_thread() + thread.suspend() + try: + if pc is None: + pc = thread.get_pc() + ctx = thread.get_context() + finally: + thread.resume() + label = process.get_label_at_address(pc) + try: + disasm = process.disassemble(pc, 15) + except WindowsError: + disasm = None + except NotImplementedError: + disasm = None + print("") + print( + CrashDump.dump_registers(ctx), + ) + print("%s:" % label) + if disasm: + print(CrashDump.dump_code_line(disasm[0], pc, bShowDump=True)) + else: + try: + data = process.peek(pc, 15) + except Exception: + data = None + if data: + print("%s: %s" % (HexDump.address(pc), HexDump.hexblock_byte(data))) + else: + print("%s: ???" % HexDump.address(pc)) + + # Display memory contents using a given method. + def print_memory_display(self, arg, method): + if not arg: + arg = self.default_display_target + token_list = self.split_tokens(arg, 1, 2) + pid, tid, address, size = self.input_display(token_list) + label = self.get_process(pid).get_label_at_address(address) + data = self.read_memory(address, size, pid) + if data: + print("%s:" % label) + print( + method(data, address), + ) + + # ------------------------------------------------------------------------------ + # Debugging + + # Get the process ID from the prefix or the last event. + def get_process_id_from_prefix(self): + if self.cmdprefix: + pid = self.input_process(self.cmdprefix) + else: + if self.lastEvent is None: + raise CmdError("no current process set") + pid = self.lastEvent.get_pid() + return pid + + # Get the thread ID from the prefix or the last event. + def get_thread_id_from_prefix(self): + if self.cmdprefix: + tid = self.input_thread(self.cmdprefix) + else: + if self.lastEvent is None: + raise CmdError("no current process set") + tid = self.lastEvent.get_tid() + return tid + + # Get the process from the prefix or the last event. + def get_process_from_prefix(self): + pid = self.get_process_id_from_prefix() + return self.get_process(pid) + + # Get the thread from the prefix or the last event. + def get_thread_from_prefix(self): + tid = self.get_thread_id_from_prefix() + return self.get_thread(tid) + + # Get the process and thread IDs from the prefix or the last event. + def get_process_and_thread_ids_from_prefix(self): + if self.cmdprefix: + try: + pid = self.input_process(self.cmdprefix) + tid = None + except CmdError: + try: + tid = self.input_thread(self.cmdprefix) + pid = self.debug.system.get_thread(tid).get_pid() + except CmdError: + msg = "unknown process or thread (%s)" % self.cmdprefix + raise CmdError(msg) + else: + if self.lastEvent is None: + raise CmdError("no current process set") + pid = self.lastEvent.get_pid() + tid = self.lastEvent.get_tid() + return pid, tid + + # Get the process and thread from the prefix or the last event. + def get_process_and_thread_from_prefix(self): + pid, tid = self.get_process_and_thread_ids_from_prefix() + process = self.get_process(pid) + thread = self.get_thread(tid) + return process, thread + + # Get the process object. + def get_process(self, pid=None): + if pid is None: + if self.lastEvent is None: + raise CmdError("no current process set") + process = self.lastEvent.get_process() + elif self.lastEvent is not None and pid == self.lastEvent.get_pid(): + process = self.lastEvent.get_process() + else: + try: + process = self.debug.system.get_process(pid) + except KeyError: + raise CmdError("process not found (%d)" % pid) + return process + + # Get the thread object. + def get_thread(self, tid=None): + if tid is None: + if self.lastEvent is None: + raise CmdError("no current process set") + thread = self.lastEvent.get_thread() + elif self.lastEvent is not None and tid == self.lastEvent.get_tid(): + thread = self.lastEvent.get_thread() + else: + try: + thread = self.debug.system.get_thread(tid) + except KeyError: + raise CmdError("thread not found (%d)" % tid) + return thread + + # Read the process memory. + def read_memory(self, address, size, pid=None): + process = self.get_process(pid) + try: + data = process.peek(address, size) + except WindowsError: + orig_address = HexOutput.integer(address) + next_address = HexOutput.integer(address + size) + msg = "error reading process %d, from %s to %s (%d bytes)" + msg = msg % (pid, orig_address, next_address, size) + raise CmdError(msg) + return data + + # Write the process memory. + def write_memory(self, address, data, pid=None): + process = self.get_process(pid) + try: + process.write(address, data) + except WindowsError: + size = len(data) + orig_address = HexOutput.integer(address) + next_address = HexOutput.integer(address + size) + msg = "error reading process %d, from %s to %s (%d bytes)" + msg = msg % (pid, orig_address, next_address, size) + raise CmdError(msg) + + # Change a register value. + def change_register(self, register, value, tid=None): + # Get the thread. + if tid is None: + if self.lastEvent is None: + raise CmdError("no current process set") + thread = self.lastEvent.get_thread() + else: + try: + thread = self.debug.system.get_thread(tid) + except KeyError: + raise CmdError("thread not found (%d)" % tid) + + # Convert the value to integer type. + try: + value = self.input_integer(value) + except ValueError: + pid = thread.get_pid() + value = self.input_address(value, pid, tid) + + # Suspend the thread. + # The finally clause ensures the thread is resumed before returning. + thread.suspend() + try: + # Get the current context. + ctx = thread.get_context() + + # Register name matching is case insensitive. + register = register.lower() + + # Integer 32 bits registers. + if register in self.register_names: + register = register.title() # eax -> Eax + + # Segment (16 bit) registers. + if register in self.segment_names: + register = "Seg%s" % register.title() # cs -> SegCs + value = value & 0x0000FFFF + + # Integer 16 bits registers. + if register in self.register_alias_16: + register = self.register_alias_16[register] + previous = ctx.get(register) & 0xFFFF0000 + value = (value & 0x0000FFFF) | previous + + # Integer 8 bits registers (low part). + if register in self.register_alias_8_low: + register = self.register_alias_8_low[register] + previous = ctx.get(register) % 0xFFFFFF00 + value = (value & 0x000000FF) | previous + + # Integer 8 bits registers (high part). + if register in self.register_alias_8_high: + register = self.register_alias_8_high[register] + previous = ctx.get(register) % 0xFFFF00FF + value = ((value & 0x000000FF) << 8) | previous + + # Set the new context. + ctx.__setitem__(register, value) + thread.set_context(ctx) + + # Resume the thread. + finally: + thread.resume() + + # Very crude way to find data within the process memory. + # TODO: Perhaps pfind.py can be integrated here instead. + def find_in_memory(self, query, process): + for mbi in process.get_memory_map(): + if mbi.State != win32.MEM_COMMIT or mbi.Protect & win32.PAGE_GUARD: + continue + address = mbi.BaseAddress + size = mbi.RegionSize + try: + data = process.read(address, size) + except WindowsError: + msg = "*** Warning: read error at address %s" + msg = msg % HexDump.address(address) + print(msg) + width = min(len(query), 16) + p = data.find(query) + while p >= 0: + q = p + len(query) + d = data[p : min(q, p + width)] + h = HexDump.hexline(d, width=width) + a = HexDump.address(address + p) + print("%s: %s" % (a, h)) + p = data.find(query, q) + + # Kill a process. + def kill_process(self, pid): + process = self.debug.system.get_process(pid) + try: + process.kill() + if self.debug.is_debugee(pid): + self.debug.detach(pid) + print("Killed process (%d)" % pid) + except Exception: + print("Error trying to kill process (%d)" % pid) + + # Kill a thread. + def kill_thread(self, tid): + thread = self.debug.system.get_thread(tid) + try: + thread.kill() + process = thread.get_process() + pid = process.get_pid() + if self.debug.is_debugee(pid) and not process.is_alive(): + self.debug.detach(pid) + print("Killed thread (%d)" % tid) + except Exception: + print("Error trying to kill thread (%d)" % tid) + + # ------------------------------------------------------------------------------ + # Command prompt input + + # Prompt the user for commands. + def prompt_user(self): + while not self.debuggerExit: + try: + self.cmdloop() + break + except CmdError: + e = sys.exc_info()[1] + print("*** Error: %s" % str(e)) + except Exception: + traceback.print_exc() + + # # self.debuggerExit = True + + # Prompt the user for a YES/NO kind of question. + def ask_user(self, msg, prompt="Are you sure? (y/N): "): + print(msg) + answer = raw_input(prompt) + answer = answer.strip()[:1].lower() + return answer == "y" + + # Autocomplete the given command when not ambiguous. + # Convert it to lowercase (so commands are seen as case insensitive). + def autocomplete(self, cmd): + cmd = cmd.lower() + completed = self.completenames(cmd) + if len(completed) == 1: + cmd = completed[0] + return cmd + + # Get the help text for the given list of command methods. + # Note it's NOT a list of commands, but a list of actual method names. + # Each line of text is stripped and all lines are sorted. + # Repeated text lines are removed. + # Returns a single, possibly multiline, string. + def get_help(self, commands): + msg = set() + for name in commands: + if name != "do_help": + try: + doc = getattr(self, name).__doc__.split("\n") + except Exception: + return "No help available when Python" " is run with the -OO switch." + for x in doc: + x = x.strip() + if x: + msg.add(" %s" % x) + msg = list(msg) + msg.sort() + msg = "\n".join(msg) + return msg + + # Parse the prefix and remove it from the command line. + def split_prefix(self, line): + prefix = None + if line.startswith("~"): + pos = line.find(" ") + if pos == 1: + pos = line.find(" ", pos + 1) + if not pos < 0: + prefix = line[1:pos].strip() + line = line[pos:].strip() + return prefix, line + + # ------------------------------------------------------------------------------ + # Cmd() hacks + + # Header for help page. + doc_header = "Available commands (type help * or help )" + + # # # Read and write directly to stdin and stdout. + # # # This prevents the use of raw_input and print. + # # use_rawinput = False + + @property + def prompt(self): + if self.lastEvent: + pid = self.lastEvent.get_pid() + tid = self.lastEvent.get_tid() + if self.debug.is_debugee(pid): + # # return '~%d(%d)> ' % (tid, pid) + return "%d:%d> " % (pid, tid) + return "> " + + # Return a sorted list of method names. + # Only returns the methods that implement commands. + def get_names(self): + names = Cmd.get_names(self) + names = [x for x in set(names) if x.startswith("do_")] + names.sort() + return names + + # Automatically autocomplete commands, even if Tab wasn't pressed. + # The prefix is removed from the line and stored in self.cmdprefix. + # Also implement the commands that consist of a symbol character. + def parseline(self, line): + self.cmdprefix, line = self.split_prefix(line) + line = line.strip() + if line: + if line[0] == ".": + line = "plugin " + line[1:] + elif line[0] == "#": + line = "python " + line[1:] + cmd, arg, line = Cmd.parseline(self, line) + if cmd: + cmd = self.autocomplete(cmd) + return cmd, arg, line + + # # # Don't repeat the last executed command. + # # def emptyline(self): + # # pass + + # Reset the defaults for some commands. + def preloop(self): + self.default_disasm_target = "eip" + self.default_display_target = "eip" + self.last_display_command = self.do_db + + # Put the prefix back in the command line. + def get_lastcmd(self): + return self.__lastcmd + + def set_lastcmd(self, lastcmd): + if self.cmdprefix: + lastcmd = "~%s %s" % (self.cmdprefix, lastcmd) + self.__lastcmd = lastcmd + + lastcmd = property(get_lastcmd, set_lastcmd) + + # Quit the command prompt if the debuggerExit flag is on. + def postcmd(self, stop, line): + return stop or self.debuggerExit + + # ------------------------------------------------------------------------------ + # Commands + + # Each command contains a docstring with it's help text. + # The help text consist of independent text lines, + # where each line shows a command and it's parameters. + # Each command method has the help message for itself and all it's aliases. + # Only the docstring for the "help" command is shown as-is. + + # NOTE: Command methods MUST be all lowercase! + + # Extended help command. + def do_help(self, arg): + """ + ? - show the list of available commands + ? * - show help for all commands + ? [command...] - show help for the given command(s) + help - show the list of available commands + help * - show help for all commands + help [command...] - show help for the given command(s) + """ + if not arg: + Cmd.do_help(self, arg) + elif arg in ("?", "help"): + # An easter egg :) + print(" Help! I need somebody...") + print(" Help! Not just anybody...") + print(" Help! You know, I need someone...") + print(" Heeelp!") + else: + if arg == "*": + commands = self.get_names() + commands = [x for x in commands if x.startswith("do_")] + else: + commands = set() + for x in arg.split(" "): + x = x.strip() + if x: + for n in self.completenames(x): + commands.add("do_%s" % n) + commands = list(commands) + commands.sort() + print(self.get_help(commands)) + + def do_shell(self, arg): + """ + ! - spawn a system shell + shell - spawn a system shell + ! [arguments...] - execute a single shell command + shell [arguments...] - execute a single shell command + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + + # Try to use the environment to locate cmd.exe. + # If not found, it's usually OK to just use the filename, + # since cmd.exe is one of those "magic" programs that + # can be automatically found by CreateProcess. + shell = os.getenv("ComSpec", "cmd.exe") + + # When given a command, run it and return. + # When no command is given, spawn a shell. + if arg: + arg = "%s /c %s" % (shell, arg) + else: + arg = shell + process = self.debug.system.start_process(arg, bConsole=True) + process.wait() + + # This hack fixes a bug in Python, the interpreter console is closing the + # stdin pipe when calling the exit() function (Ctrl+Z seems to work fine). + class _PythonExit(object): + def __repr__(self): + return "Use exit() or Ctrl-Z plus Return to exit" + + def __call__(self): + raise SystemExit() + + _python_exit = _PythonExit() + + # Spawns a Python shell with some handy local variables and the winappdbg + # module already imported. Also the console banner is improved. + def _spawn_python_shell(self, arg): + import winappdbg + + banner = 'Python %s on %s\nType "help", "copyright", ' '"credits" or "license" for more information.\n' + platform = winappdbg.version.lower() + platform = "WinAppDbg %s" % platform + banner = banner % (sys.version, platform) + local = {} + local.update(__builtins__) + local.update( + { + "__name__": "__console__", + "__doc__": None, + "exit": self._python_exit, + "self": self, + "arg": arg, + "winappdbg": winappdbg, + } + ) + try: + code.interact(banner=banner, local=local) + except SystemExit: + # We need to catch it so it doesn't kill our program. + pass + + def do_python(self, arg): + """ + # - spawn a python interpreter + python - spawn a python interpreter + # - execute a single python statement + python - execute a single python statement + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + + # When given a Python statement, execute it directly. + if arg: + try: + compat.exec_(arg, globals(), locals()) + except Exception: + traceback.print_exc() + + # When no statement is given, spawn a Python interpreter. + else: + try: + self._spawn_python_shell(arg) + except Exception: + e = sys.exc_info()[1] + raise CmdError("unhandled exception when running Python console: %s" % e) + + def do_quit(self, arg): + """ + quit - close the debugging session + q - close the debugging session + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + if arg: + raise CmdError("too many arguments") + if self.confirm_quit: + count = self.debug.get_debugee_count() + if count > 0: + if count == 1: + msg = "There's a program still running." + else: + msg = "There are %s programs still running." % count + if not self.ask_user(msg): + return False + self.debuggerExit = True + return True + + do_q = do_quit + + def do_attach(self, arg): + """ + attach [target...] - attach to the given process(es) + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + targets = self.input_process_list(self.split_tokens(arg, 1)) + if not targets: + print("Error: missing parameters") + else: + debug = self.debug + for pid in targets: + try: + debug.attach(pid) + print("Attached to process (%d)" % pid) + except Exception: + print("Error: can't attach to process (%d)" % pid) + + def do_detach(self, arg): + """ + [~process] detach - detach from the current process + detach - detach from the current process + detach [target...] - detach from the given process(es) + """ + debug = self.debug + token_list = self.split_tokens(arg) + if self.cmdprefix: + token_list.insert(0, self.cmdprefix) + targets = self.input_process_list(token_list) + if not targets: + if self.lastEvent is None: + raise CmdError("no current process set") + targets = [self.lastEvent.get_pid()] + for pid in targets: + try: + debug.detach(pid) + print("Detached from process (%d)" % pid) + except Exception: + print("Error: can't detach from process (%d)" % pid) + + def do_windowed(self, arg): + """ + windowed [arguments...] - run a windowed program for debugging + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + cmdline = self.input_command_line(arg) + try: + process = self.debug.execl(arg, bConsole=False, bFollow=self.options.follow) + print("Spawned process (%d)" % process.get_pid()) + except Exception: + raise CmdError("can't execute") + self.set_fake_last_event(process) + + def do_console(self, arg): + """ + console [arguments...] - run a console program for debugging + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + cmdline = self.input_command_line(arg) + try: + process = self.debug.execl(arg, bConsole=True, bFollow=self.options.follow) + print("Spawned process (%d)" % process.get_pid()) + except Exception: + raise CmdError("can't execute") + self.set_fake_last_event(process) + + def do_continue(self, arg): + """ + continue - continue execution + g - continue execution + go - continue execution + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + if arg: + raise CmdError("too many arguments") + if self.debug.get_debugee_count() > 0: + return True + + do_g = do_continue + do_go = do_continue + + def do_gh(self, arg): + """ + gh - go with exception handled + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + if arg: + raise CmdError("too many arguments") + if self.lastEvent: + self.lastEvent.continueStatus = win32.DBG_EXCEPTION_HANDLED + return self.do_go(arg) + + def do_gn(self, arg): + """ + gn - go with exception not handled + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + if arg: + raise CmdError("too many arguments") + if self.lastEvent: + self.lastEvent.continueStatus = win32.DBG_EXCEPTION_NOT_HANDLED + return self.do_go(arg) + + def do_refresh(self, arg): + """ + refresh - refresh the list of running processes and threads + [~process] refresh - refresh the list of running threads + """ + if arg: + raise CmdError("too many arguments") + if self.cmdprefix: + process = self.get_process_from_prefix() + process.scan() + else: + self.debug.system.scan() + + def do_processlist(self, arg): + """ + pl - show the processes being debugged + processlist - show the processes being debugged + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + if arg: + raise CmdError("too many arguments") + system = self.debug.system + pid_list = self.debug.get_debugee_pids() + if pid_list: + print("Process ID File name") + for pid in pid_list: + if pid == 0: + filename = "System Idle Process" + elif pid == 4: + filename = "System" + else: + filename = system.get_process(pid).get_filename() + filename = PathOperations.pathname_to_filename(filename) + print("%-12d %s" % (pid, filename)) + + do_pl = do_processlist + + def do_threadlist(self, arg): + """ + tl - show the threads being debugged + threadlist - show the threads being debugged + """ + if arg: + raise CmdError("too many arguments") + if self.cmdprefix: + process = self.get_process_from_prefix() + for thread in process.iter_threads(): + tid = thread.get_tid() + name = thread.get_name() + print("%-12d %s" % (tid, name)) + else: + system = self.debug.system + pid_list = self.debug.get_debugee_pids() + if pid_list: + print("Thread ID Thread name") + for pid in pid_list: + process = system.get_process(pid) + for thread in process.iter_threads(): + tid = thread.get_tid() + name = thread.get_name() + print("%-12d %s" % (tid, name)) + + do_tl = do_threadlist + + def do_kill(self, arg): + """ + [~process] kill - kill a process + [~thread] kill - kill a thread + kill - kill the current process + kill * - kill all debugged processes + kill - kill the given processes and threads + """ + if arg: + if arg == "*": + target_pids = self.debug.get_debugee_pids() + target_tids = list() + else: + target_pids = set() + target_tids = set() + if self.cmdprefix: + pid, tid = self.get_process_and_thread_ids_from_prefix() + if tid is None: + target_tids.add(tid) + else: + target_pids.add(pid) + for token in self.split_tokens(arg): + try: + pid = self.input_process(token) + target_pids.add(pid) + except CmdError: + try: + tid = self.input_process(token) + target_pids.add(pid) + except CmdError: + msg = "unknown process or thread (%s)" % token + raise CmdError(msg) + target_pids = list(target_pids) + target_tids = list(target_tids) + target_pids.sort() + target_tids.sort() + msg = "You are about to kill %d processes and %d threads." + msg = msg % (len(target_pids), len(target_tids)) + if self.ask_user(msg): + for pid in target_pids: + self.kill_process(pid) + for tid in target_tids: + self.kill_thread(tid) + else: + if self.cmdprefix: + pid, tid = self.get_process_and_thread_ids_from_prefix() + if tid is None: + if self.lastEvent is not None and pid == self.lastEvent.get_pid(): + msg = "You are about to kill the current process." + else: + msg = "You are about to kill process %d." % pid + if self.ask_user(msg): + self.kill_process(pid) + else: + if self.lastEvent is not None and tid == self.lastEvent.get_tid(): + msg = "You are about to kill the current thread." + else: + msg = "You are about to kill thread %d." % tid + if self.ask_user(msg): + self.kill_thread(tid) + else: + if self.lastEvent is None: + raise CmdError("no current process set") + pid = self.lastEvent.get_pid() + if self.ask_user("You are about to kill the current process."): + self.kill_process(pid) + + # TODO: create hidden threads using undocumented API calls. + def do_modload(self, arg): + """ + [~process] modload - load a DLL module + """ + filename = self.split_tokens(arg, 1, 1)[0] + process = self.get_process_from_prefix() + try: + process.inject_dll(filename, bWait=False) + except RuntimeError: + print("Can't inject module: %r" % filename) + + # TODO: modunload + + def do_stack(self, arg): + """ + [~thread] k - show the stack trace + [~thread] stack - show the stack trace + """ + if arg: # XXX TODO add depth parameter + raise CmdError("too many arguments") + pid, tid = self.get_process_and_thread_ids_from_prefix() + process = self.get_process(pid) + thread = process.get_thread(tid) + try: + stack_trace = thread.get_stack_trace_with_labels() + if stack_trace: + print( + CrashDump.dump_stack_trace_with_labels(stack_trace), + ) + else: + print("No stack trace available for thread (%d)" % tid) + except WindowsError: + print("Can't get stack trace for thread (%d)" % tid) + + do_k = do_stack + + def do_break(self, arg): + """ + break - force a debug break in all debugees + break [process...] - force a debug break + """ + debug = self.debug + system = debug.system + targets = self.input_process_list(self.split_tokens(arg)) + if not targets: + targets = debug.get_debugee_pids() + targets.sort() + if self.lastEvent: + current = self.lastEvent.get_pid() + else: + current = None + for pid in targets: + if pid != current and debug.is_debugee(pid): + process = system.get_process(pid) + try: + process.debug_break() + except WindowsError: + print("Can't force a debug break on process (%d)") + + def do_step(self, arg): + """ + p - step on the current assembly instruction + next - step on the current assembly instruction + step - step on the current assembly instruction + """ + if self.cmdprefix: + raise CmdError("prefix not allowed") + if self.lastEvent is None: + raise CmdError("no current process set") + if arg: # XXX this check is to be removed + raise CmdError("too many arguments") + pid = self.lastEvent.get_pid() + thread = self.lastEvent.get_thread() + pc = thread.get_pc() + code = thread.disassemble(pc, 16)[0] + size = code[1] + opcode = code[2].lower() + if " " in opcode: + opcode = opcode[: opcode.find(" ")] + if opcode in self.jump_instructions or opcode in ("int", "ret", "retn"): + return self.do_trace(arg) + address = pc + size + # # print(hex(pc), hex(address), size # XXX DEBUG + self.debug.stalk_at(pid, address) + return True + + do_p = do_step + do_next = do_step + + def do_trace(self, arg): + """ + t - trace at the current assembly instruction + trace - trace at the current assembly instruction + """ + if arg: # XXX this check is to be removed + raise CmdError("too many arguments") + if self.lastEvent is None: + raise CmdError("no current thread set") + self.lastEvent.get_thread().set_tf() + return True + + do_t = do_trace + + def do_bp(self, arg): + """ + [~process] bp

    - set a code breakpoint + """ + pid = self.get_process_id_from_prefix() + if not self.debug.is_debugee(pid): + raise CmdError("target process is not being debugged") + process = self.get_process(pid) + token_list = self.split_tokens(arg, 1, 1) + try: + address = self.input_address(token_list[0], pid) + deferred = False + except Exception: + address = token_list[0] + deferred = True + if not address: + address = token_list[0] + deferred = True + self.debug.break_at(pid, address) + if deferred: + print("Deferred breakpoint set at %s" % address) + else: + print("Breakpoint set at %s" % address) + + def do_ba(self, arg): + """ + [~thread] ba <1|2|4|8>
    - set hardware breakpoint + """ + debug = self.debug + thread = self.get_thread_from_prefix() + pid = thread.get_pid() + tid = thread.get_tid() + if not debug.is_debugee(pid): + raise CmdError("target thread is not being debugged") + token_list = self.split_tokens(arg, 3, 3) + access = token_list[0].lower() + size = token_list[1] + address = token_list[2] + if access == "a": + access = debug.BP_BREAK_ON_ACCESS + elif access == "w": + access = debug.BP_BREAK_ON_WRITE + elif access == "e": + access = debug.BP_BREAK_ON_EXECUTION + else: + raise CmdError("bad access type: %s" % token_list[0]) + if size == "1": + size = debug.BP_WATCH_BYTE + elif size == "2": + size = debug.BP_WATCH_WORD + elif size == "4": + size = debug.BP_WATCH_DWORD + elif size == "8": + size = debug.BP_WATCH_QWORD + else: + raise CmdError("bad breakpoint size: %s" % size) + thread = self.get_thread_from_prefix() + tid = thread.get_tid() + pid = thread.get_pid() + if not debug.is_debugee(pid): + raise CmdError("target process is not being debugged") + address = self.input_address(address, pid) + if debug.has_hardware_breakpoint(tid, address): + debug.erase_hardware_breakpoint(tid, address) + debug.define_hardware_breakpoint(tid, address, access, size) + debug.enable_hardware_breakpoint(tid, address) + + def do_bm(self, arg): + """ + [~process] bm - set memory breakpoint + """ + pid = self.get_process_id_from_prefix() + if not self.debug.is_debugee(pid): + raise CmdError("target process is not being debugged") + process = self.get_process(pid) + token_list = self.split_tokens(arg, 1, 2) + address, size = self.input_address_range(token_list[0], pid) + self.debug.watch_buffer(pid, address, size) + + def do_bl(self, arg): + """ + bl - list the breakpoints for the current process + bl * - list the breakpoints for all processes + [~process] bl - list the breakpoints for the given process + bl [process...] - list the breakpoints for each given process + """ + debug = self.debug + if arg == "*": + if self.cmdprefix: + raise CmdError("prefix not supported") + breakpoints = debug.get_debugee_pids() + else: + targets = self.input_process_list(self.split_tokens(arg)) + if self.cmdprefix: + targets.insert(0, self.input_process(self.cmdprefix)) + if not targets: + if self.lastEvent is None: + raise CmdError("no current process is set") + targets = [self.lastEvent.get_pid()] + for pid in targets: + bplist = debug.get_process_code_breakpoints(pid) + printed_process_banner = False + if bplist: + if not printed_process_banner: + print("Process %d:" % pid) + printed_process_banner = True + for bp in bplist: + address = repr(bp)[1:-1].replace("remote address ", "") + print(" %s" % address) + dbplist = debug.get_process_deferred_code_breakpoints(pid) + if dbplist: + if not printed_process_banner: + print("Process %d:" % pid) + printed_process_banner = True + for label, action, oneshot in dbplist: + if oneshot: + address = " Deferred unconditional one-shot" " code breakpoint at %s" + else: + address = " Deferred unconditional" " code breakpoint at %s" + address = address % label + print(" %s" % address) + bplist = debug.get_process_page_breakpoints(pid) + if bplist: + if not printed_process_banner: + print("Process %d:" % pid) + printed_process_banner = True + for bp in bplist: + address = repr(bp)[1:-1].replace("remote address ", "") + print(" %s" % address) + for tid in debug.system.get_process(pid).iter_thread_ids(): + bplist = debug.get_thread_hardware_breakpoints(tid) + if bplist: + print("Thread %d:" % tid) + for bp in bplist: + address = repr(bp)[1:-1].replace("remote address ", "") + print(" %s" % address) + + def do_bo(self, arg): + """ + [~process] bo
    - make a code breakpoint one-shot + [~thread] bo
    - make a hardware breakpoint one-shot + [~process] bo - make a memory breakpoint one-shot + [~process] bo
    - make a memory breakpoint one-shot + """ + token_list = self.split_tokens(arg, 1, 2) + pid, tid, address, size = self.input_breakpoint(token_list) + debug = self.debug + found = False + if size is None: + if tid is not None: + if debug.has_hardware_breakpoint(tid, address): + debug.enable_one_shot_hardware_breakpoint(tid, address) + found = True + if pid is not None: + if debug.has_code_breakpoint(pid, address): + debug.enable_one_shot_code_breakpoint(pid, address) + found = True + else: + if debug.has_page_breakpoint(pid, address): + debug.enable_one_shot_page_breakpoint(pid, address) + found = True + if not found: + print("Error: breakpoint not found.") + + def do_be(self, arg): + """ + [~process] be
    - enable a code breakpoint + [~thread] be
    - enable a hardware breakpoint + [~process] be - enable a memory breakpoint + [~process] be
    - enable a memory breakpoint + """ + token_list = self.split_tokens(arg, 1, 2) + pid, tid, address, size = self.input_breakpoint(token_list) + debug = self.debug + found = False + if size is None: + if tid is not None: + if debug.has_hardware_breakpoint(tid, address): + debug.enable_hardware_breakpoint(tid, address) + found = True + if pid is not None: + if debug.has_code_breakpoint(pid, address): + debug.enable_code_breakpoint(pid, address) + found = True + else: + if debug.has_page_breakpoint(pid, address): + debug.enable_page_breakpoint(pid, address) + found = True + if not found: + print("Error: breakpoint not found.") + + def do_bd(self, arg): + """ + [~process] bd
    - disable a code breakpoint + [~thread] bd
    - disable a hardware breakpoint + [~process] bd - disable a memory breakpoint + [~process] bd
    - disable a memory breakpoint + """ + token_list = self.split_tokens(arg, 1, 2) + pid, tid, address, size = self.input_breakpoint(token_list) + debug = self.debug + found = False + if size is None: + if tid is not None: + if debug.has_hardware_breakpoint(tid, address): + debug.disable_hardware_breakpoint(tid, address) + found = True + if pid is not None: + if debug.has_code_breakpoint(pid, address): + debug.disable_code_breakpoint(pid, address) + found = True + else: + if debug.has_page_breakpoint(pid, address): + debug.disable_page_breakpoint(pid, address) + found = True + if not found: + print("Error: breakpoint not found.") + + def do_bc(self, arg): + """ + [~process] bc
    - clear a code breakpoint + [~thread] bc
    - clear a hardware breakpoint + [~process] bc - clear a memory breakpoint + [~process] bc
    - clear a memory breakpoint + """ + token_list = self.split_tokens(arg, 1, 2) + pid, tid, address, size = self.input_breakpoint(token_list) + debug = self.debug + found = False + if size is None: + if tid is not None: + if debug.has_hardware_breakpoint(tid, address): + debug.dont_watch_variable(tid, address) + found = True + if pid is not None: + if debug.has_code_breakpoint(pid, address): + debug.dont_break_at(pid, address) + found = True + else: + if debug.has_page_breakpoint(pid, address): + debug.dont_watch_buffer(pid, address, size) + found = True + if not found: + print("Error: breakpoint not found.") + + def do_disassemble(self, arg): + """ + [~thread] u [register] - show code disassembly + [~process] u [address] - show code disassembly + [~thread] disassemble [register] - show code disassembly + [~process] disassemble [address] - show code disassembly + """ + if not arg: + arg = self.default_disasm_target + token_list = self.split_tokens(arg, 1, 1) + pid, tid = self.get_process_and_thread_ids_from_prefix() + process = self.get_process(pid) + address = self.input_address(token_list[0], pid, tid) + try: + code = process.disassemble(address, 15 * 8)[:8] + except Exception: + msg = "can't disassemble address %s" + msg = msg % HexDump.address(address) + raise CmdError(msg) + if code: + label = process.get_label_at_address(address) + last_code = code[-1] + next_address = last_code[0] + last_code[1] + next_address = HexOutput.integer(next_address) + self.default_disasm_target = next_address + print("%s:" % label) + # # print(CrashDump.dump_code(code)) + for line in code: + print(CrashDump.dump_code_line(line, bShowDump=False)) + + do_u = do_disassemble + + def do_search(self, arg): + """ + [~process] s [address-address] + [~process] search [address-address] + """ + token_list = self.split_tokens(arg, 1, 3) + pid, tid = self.get_process_and_thread_ids_from_prefix() + process = self.get_process(pid) + if len(token_list) == 1: + pattern = token_list[0] + minAddr = None + maxAddr = None + else: + pattern = token_list[-1] + addr, size = self.input_address_range(token_list[:-1], pid, tid) + minAddr = addr + maxAddr = addr + size + iter = process.search_bytes(pattern) + if process.get_bits() == 32: + addr_width = 8 + else: + addr_width = 16 + # TODO: need a prettier output here! + for addr in iter: + print(HexDump.address(addr, addr_width)) + + do_s = do_search + + def do_searchhex(self, arg): + """ + [~process] sh [address-address] + [~process] searchhex [address-address] + """ + token_list = self.split_tokens(arg, 1, 3) + pid, tid = self.get_process_and_thread_ids_from_prefix() + process = self.get_process(pid) + if len(token_list) == 1: + pattern = token_list[0] + minAddr = None + maxAddr = None + else: + pattern = token_list[-1] + addr, size = self.input_address_range(token_list[:-1], pid, tid) + minAddr = addr + maxAddr = addr + size + iter = process.search_hexa(pattern) + if process.get_bits() == 32: + addr_width = 8 + else: + addr_width = 16 + for addr, bytes in iter: + print( + HexDump.hexblock(bytes, addr, addr_width), + ) + + do_sh = do_searchhex + + # # def do_strings(self, arg): + # # """ + # # [~process] strings - extract ASCII strings from memory + # # """ + # # if arg: + # # raise CmdError("too many arguments") + # # pid, tid = self.get_process_and_thread_ids_from_prefix() + # # process = self.get_process(pid) + # # for addr, size, data in process.strings(): + # # print("%s: %r" % (HexDump.address(addr), data) + + def do_d(self, arg): + """ + [~thread] d - show memory contents + [~thread] d - show memory contents + [~thread] d - show memory contents + [~process] d
    - show memory contents + [~process] d - show memory contents + [~process] d
    - show memory contents + """ + return self.last_display_command(arg) + + def do_db(self, arg): + """ + [~thread] db - show memory contents as bytes + [~thread] db - show memory contents as bytes + [~thread] db - show memory contents as bytes + [~process] db
    - show memory contents as bytes + [~process] db - show memory contents as bytes + [~process] db
    - show memory contents as bytes + """ + self.print_memory_display(arg, HexDump.hexblock) + self.last_display_command = self.do_db + + def do_dw(self, arg): + """ + [~thread] dw - show memory contents as words + [~thread] dw - show memory contents as words + [~thread] dw - show memory contents as words + [~process] dw
    - show memory contents as words + [~process] dw - show memory contents as words + [~process] dw
    - show memory contents as words + """ + self.print_memory_display(arg, HexDump.hexblock_word) + self.last_display_command = self.do_dw + + def do_dd(self, arg): + """ + [~thread] dd - show memory contents as dwords + [~thread] dd - show memory contents as dwords + [~thread] dd - show memory contents as dwords + [~process] dd
    - show memory contents as dwords + [~process] dd - show memory contents as dwords + [~process] dd
    - show memory contents as dwords + """ + self.print_memory_display(arg, HexDump.hexblock_dword) + self.last_display_command = self.do_dd + + def do_dq(self, arg): + """ + [~thread] dq - show memory contents as qwords + [~thread] dq - show memory contents as qwords + [~thread] dq - show memory contents as qwords + [~process] dq
    - show memory contents as qwords + [~process] dq - show memory contents as qwords + [~process] dq
    - show memory contents as qwords + """ + self.print_memory_display(arg, HexDump.hexblock_qword) + self.last_display_command = self.do_dq + + # XXX TODO + # Change the way the default is used with ds and du + + def do_ds(self, arg): + """ + [~thread] ds - show memory contents as ANSI string + [~process] ds
    - show memory contents as ANSI string + """ + if not arg: + arg = self.default_display_target + token_list = self.split_tokens(arg, 1, 1) + pid, tid, address, size = self.input_display(token_list, 256) + process = self.get_process(pid) + data = process.peek_string(address, False, size) + if data: + print(repr(data)) + self.last_display_command = self.do_ds + + def do_du(self, arg): + """ + [~thread] du - show memory contents as Unicode string + [~process] du
    - show memory contents as Unicode string + """ + if not arg: + arg = self.default_display_target + token_list = self.split_tokens(arg, 1, 2) + pid, tid, address, size = self.input_display(token_list, 256) + process = self.get_process(pid) + data = process.peek_string(address, True, size) + if data: + print(repr(data)) + self.last_display_command = self.do_du + + def do_register(self, arg): + """ + [~thread] r - print(the value of all registers + [~thread] r - print(the value of a register + [~thread] r = - change the value of a register + [~thread] register - print(the value of all registers + [~thread] register - print(the value of a register + [~thread] register = - change the value of a register + """ + arg = arg.strip() + if not arg: + self.print_current_location() + else: + equ = arg.find("=") + if equ >= 0: + register = arg[:equ].strip() + value = arg[equ + 1 :].strip() + if not value: + value = "0" + self.change_register(register, value) + else: + value = self.input_register(arg) + if value is None: + raise CmdError("unknown register: %s" % arg) + try: + label = None + thread = self.get_thread_from_prefix() + process = thread.get_process() + module = process.get_module_at_address(value) + if module: + label = module.get_label_at_address(value) + except RuntimeError: + label = None + reg = arg.upper() + val = HexDump.address(value) + if label: + print("%s: %s (%s)" % (reg, val, label)) + else: + print("%s: %s" % (reg, val)) + + do_r = do_register + + def do_eb(self, arg): + """ + [~process] eb
    - write the data to the specified address + """ + # TODO + # data parameter should be optional, use a child Cmd here + pid = self.get_process_id_from_prefix() + token_list = self.split_tokens(arg, 2) + address = self.input_address(token_list[0], pid) + data = HexInput.hexadecimal(" ".join(token_list[1:])) + self.write_memory(address, data, pid) + + # XXX TODO + # add ew, ed and eq here + + def do_find(self, arg): + """ + [~process] f - find the string in the process memory + [~process] find - find the string in the process memory + """ + if not arg: + raise CmdError("missing parameter: string") + process = self.get_process_from_prefix() + self.find_in_memory(arg, process) + + do_f = do_find + + def do_memory(self, arg): + """ + [~process] m - show the process memory map + [~process] memory - show the process memory map + """ + if arg: # TODO: take min and max addresses + raise CmdError("too many arguments") + process = self.get_process_from_prefix() + try: + memoryMap = process.get_memory_map() + mappedFilenames = process.get_mapped_filenames() + print("") + print(CrashDump.dump_memory_map(memoryMap, mappedFilenames)) + except WindowsError: + msg = "can't get memory information for process (%d)" + raise CmdError(msg % process.get_pid()) + + do_m = do_memory + + # ------------------------------------------------------------------------------ + # Event handling + + # TODO + # * add configurable stop/don't stop behavior on events and exceptions + + # Stop for all events, unless stated otherwise. + def event(self, event): + self.print_event(event) + self.prompt_user() + + # Stop for all exceptions, unless stated otherwise. + def exception(self, event): + self.print_exception(event) + self.prompt_user() + + # Stop for breakpoint exceptions. + def breakpoint(self, event): + if hasattr(event, "breakpoint") and event.breakpoint: + self.print_breakpoint_location(event) + else: + self.print_exception(event) + self.prompt_user() + + # Stop for WOW64 breakpoint exceptions. + def wow64_breakpoint(self, event): + self.print_exception(event) + self.prompt_user() + + # Stop for single step exceptions. + def single_step(self, event): + if event.debug.is_tracing(event.get_tid()): + self.print_breakpoint_location(event) + else: + self.print_exception(event) + self.prompt_user() + + # Don't stop for C++ exceptions. + def ms_vc_exception(self, event): + self.print_exception(event) + event.continueStatus = win32.DBG_CONTINUE + + # Don't stop for process start. + def create_process(self, event): + self.print_process_start(event) + self.print_thread_start(event) + self.print_module_load(event) + + # Don't stop for process exit. + def exit_process(self, event): + self.print_process_end(event) + + # Don't stop for thread creation. + def create_thread(self, event): + self.print_thread_start(event) + + # Don't stop for thread exit. + def exit_thread(self, event): + self.print_thread_end(event) + + # Don't stop for DLL load. + def load_dll(self, event): + self.print_module_load(event) + + # Don't stop for DLL unload. + def unload_dll(self, event): + self.print_module_unload(event) + + # Don't stop for debug strings. + def output_string(self, event): + self.print_debug_string(event) + + # ------------------------------------------------------------------------------ + # History file + + def load_history(self): + global readline + if readline is None: + try: + import readline + except ImportError: + return + if self.history_file_full_path is None: + folder = os.environ.get("USERPROFILE", "") + if not folder: + folder = os.environ.get("HOME", "") + if not folder: + folder = os.path.split(sys.argv[0])[1] + if not folder: + folder = os.path.curdir + self.history_file_full_path = os.path.join(folder, self.history_file) + try: + if os.path.exists(self.history_file_full_path): + readline.read_history_file(self.history_file_full_path) + except IOError: + e = sys.exc_info()[1] + warnings.warn("Cannot load history file, reason: %s" % str(e)) + + def save_history(self): + if self.history_file_full_path is not None: + global readline + if readline is None: + try: + import readline + except ImportError: + return + try: + readline.write_history_file(self.history_file_full_path) + except IOError: + e = sys.exc_info()[1] + warnings.warn("Cannot save history file, reason: %s" % str(e)) + + # ------------------------------------------------------------------------------ + # Main loop + + # Debugging loop. + def loop(self): + self.debuggerExit = False + debug = self.debug + + # Stop on the initial event, if any. + if self.lastEvent is not None: + self.cmdqueue.append("r") + self.prompt_user() + + # Loop until the debugger is told to quit. + while not self.debuggerExit: + try: + # If for some reason the last event wasn't continued, + # continue it here. This won't be done more than once + # for a given Event instance, though. + try: + debug.cont() + # On error, show the command prompt. + except Exception: + traceback.print_exc() + self.prompt_user() + + # While debugees are attached, handle debug events. + # Some debug events may cause the command prompt to be shown. + if self.debug.get_debugee_count() > 0: + try: + # Get the next debug event. + debug.wait() + + # Dispatch the debug event. + try: + debug.dispatch() + + # Continue the debug event. + finally: + debug.cont() + + # On error, show the command prompt. + except Exception: + traceback.print_exc() + self.prompt_user() + + # While no debugees are attached, show the command prompt. + else: + self.prompt_user() + + # When the user presses Ctrl-C send a debug break to all debugees. + except KeyboardInterrupt: + success = False + try: + print("*** User requested debug break") + system = debug.system + for pid in debug.get_debugee_pids(): + try: + system.get_process(pid).debug_break() + success = True + except: + traceback.print_exc() + except: + traceback.print_exc() + if not success: + raise # This should never happen! diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/module.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/module.py new file mode 100644 index 0000000..223524e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/module.py @@ -0,0 +1,1983 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Module instrumentation. + +@group Instrumentation: + Module + +@group Warnings: + DebugSymbolsWarning +""" + +from __future__ import with_statement + +__revision__ = "$Id$" + +__all__ = ["Module", "DebugSymbolsWarning"] + +import sys +from winappdbg import win32 +from winappdbg import compat +from winappdbg.textio import HexInput, HexDump +from winappdbg.util import PathOperations + +# delayed imports +Process = None + +import os +import warnings +import traceback + +# ============================================================================== + + +class DebugSymbolsWarning(UserWarning): + """ + This warning is issued if the support for debug symbols + isn't working properly. + """ + + +# ============================================================================== + + +class Module(object): + """ + Interface to a DLL library loaded in the context of another process. + + @group Properties: + get_base, get_filename, get_name, get_size, get_entry_point, + get_process, set_process, get_pid, + get_handle, set_handle, open_handle, close_handle + + @group Labels: + get_label, get_label_at_address, is_address_here, + resolve, resolve_label, match_name + + @group Symbols: + load_symbols, unload_symbols, get_symbols, iter_symbols, + resolve_symbol, get_symbol_at_address + + @group Modules snapshot: + clear + + @type unknown: str + @cvar unknown: Suggested tag for unknown modules. + + @type lpBaseOfDll: int + @ivar lpBaseOfDll: Base of DLL module. + Use L{get_base} instead. + + @type hFile: L{FileHandle} + @ivar hFile: Handle to the module file. + Use L{get_handle} instead. + + @type fileName: str + @ivar fileName: Module filename. + Use L{get_filename} instead. + + @type SizeOfImage: int + @ivar SizeOfImage: Size of the module. + Use L{get_size} instead. + + @type EntryPoint: int + @ivar EntryPoint: Entry point of the module. + Use L{get_entry_point} instead. + + @type process: L{Process} + @ivar process: Process where the module is loaded. + Use the L{get_process} method instead. + """ + + unknown = "" + + class _SymbolEnumerator(object): + """ + Internally used by L{Module} to enumerate symbols in a module. + """ + + def __init__(self, undecorate=False): + self.symbols = list() + self.undecorate = undecorate + + def __call__(self, SymbolName, SymbolAddress, SymbolSize, UserContext): + """ + Callback that receives symbols and stores them in a Python list. + """ + if self.undecorate: + try: + SymbolName = win32.UnDecorateSymbolName(SymbolName) + except Exception: + pass # not all symbols are decorated! + self.symbols.append((SymbolName, SymbolAddress, SymbolSize)) + return win32.TRUE + + def __init__(self, lpBaseOfDll, hFile=None, fileName=None, SizeOfImage=None, EntryPoint=None, process=None): + """ + @type lpBaseOfDll: str + @param lpBaseOfDll: Base address of the module. + + @type hFile: L{FileHandle} + @param hFile: (Optional) Handle to the module file. + + @type fileName: str + @param fileName: (Optional) Module filename. + + @type SizeOfImage: int + @param SizeOfImage: (Optional) Size of the module. + + @type EntryPoint: int + @param EntryPoint: (Optional) Entry point of the module. + + @type process: L{Process} + @param process: (Optional) Process where the module is loaded. + """ + self.lpBaseOfDll = lpBaseOfDll + self.fileName = fileName + self.SizeOfImage = SizeOfImage + self.EntryPoint = EntryPoint + + self.__symbols = list() + + self.set_handle(hFile) + self.set_process(process) + + # Not really sure if it's a good idea... + ## def __eq__(self, aModule): + ## """ + ## Compare two Module objects. The comparison is made using the process + ## IDs and the module bases. + ## + ## @type aModule: L{Module} + ## @param aModule: Another Module object. + ## + ## @rtype: bool + ## @return: C{True} if the two process IDs and module bases are equal, + ## C{False} otherwise. + ## """ + ## return isinstance(aModule, Module) and \ + ## self.get_pid() == aModule.get_pid() and \ + ## self.get_base() == aModule.get_base() + + def get_handle(self): + """ + @rtype: L{Handle} + @return: File handle. + Returns C{None} if unknown. + """ + # no way to guess! + return self.__hFile + + def set_handle(self, hFile): + """ + @type hFile: L{Handle} + @param hFile: File handle. Use C{None} to clear. + """ + if hFile == win32.INVALID_HANDLE_VALUE: + hFile = None + self.__hFile = hFile + + hFile = property(get_handle, set_handle, doc="") + + def get_process(self): + """ + @rtype: L{Process} + @return: Parent Process object. + Returns C{None} if unknown. + """ + # no way to guess! + return self.__process + + def set_process(self, process=None): + """ + Manually set the parent process. Use with care! + + @type process: L{Process} + @param process: (Optional) Process object. Use C{None} for no process. + """ + if process is None: + self.__process = None + else: + global Process # delayed import + if Process is None: + from winappdbg.process import Process + if not isinstance(process, Process): + msg = "Parent process must be a Process instance, " + msg += "got %s instead" % type(process) + raise TypeError(msg) + self.__process = process + + process = property(get_process, set_process, doc="") + + def get_pid(self): + """ + @rtype: int or None + @return: Parent process global ID. + Returns C{None} on error. + """ + process = self.get_process() + if process is not None: + return process.get_pid() + + def get_base(self): + """ + @rtype: int or None + @return: Base address of the module. + Returns C{None} if unknown. + """ + return self.lpBaseOfDll + + def get_size(self): + """ + @rtype: int or None + @return: Base size of the module. + Returns C{None} if unknown. + """ + if not self.SizeOfImage: + self.__get_size_and_entry_point() + return self.SizeOfImage + + def get_entry_point(self): + """ + @rtype: int or None + @return: Entry point of the module. + Returns C{None} if unknown. + """ + if not self.EntryPoint: + self.__get_size_and_entry_point() + return self.EntryPoint + + def __get_size_and_entry_point(self): + "Get the size and entry point of the module using the Win32 API." + process = self.get_process() + if process: + try: + handle = process.get_handle(win32.PROCESS_VM_READ | win32.PROCESS_QUERY_INFORMATION) + base = self.get_base() + mi = win32.GetModuleInformation(handle, base) + self.SizeOfImage = mi.SizeOfImage + self.EntryPoint = mi.EntryPoint + except WindowsError: + e = sys.exc_info()[1] + warnings.warn("Cannot get size and entry point of module %s, reason: %s" % (self.get_name(), e.strerror), RuntimeWarning) + + def get_filename(self): + """ + @rtype: str or None + @return: Module filename. + Returns C{None} if unknown. + """ + if self.fileName is None: + if self.hFile not in (None, win32.INVALID_HANDLE_VALUE): + fileName = self.hFile.get_filename() + if fileName: + fileName = PathOperations.native_to_win32_pathname(fileName) + self.fileName = fileName + return self.fileName + + def __filename_to_modname(self, pathname): + """ + @type pathname: str + @param pathname: Pathname to a module. + + @rtype: str + @return: Module name. + """ + filename = PathOperations.pathname_to_filename(pathname) + if filename: + filename = filename.lower() + filepart, extpart = PathOperations.split_extension(filename) + if filepart and extpart: + modName = filepart + else: + modName = filename + else: + modName = pathname + return modName + + def get_name(self): + """ + @rtype: str + @return: Module name, as used in labels. + + @warning: Names are B{NOT} guaranteed to be unique. + + If you need unique identification for a loaded module, + use the base address instead. + + @see: L{get_label} + """ + pathname = self.get_filename() + if pathname: + modName = self.__filename_to_modname(pathname) + if isinstance(modName, compat.unicode): + try: + modName = modName.encode("cp1252") + except UnicodeEncodeError: + e = sys.exc_info()[1] + warnings.warn(str(e)) + else: + modName = "0x%x" % self.get_base() + return modName + + def match_name(self, name): + """ + @rtype: bool + @return: + C{True} if the given name could refer to this module. + It may not be exactly the same returned by L{get_name}. + """ + + # If the given name is exactly our name, return True. + # Comparison is case insensitive. + my_name = self.get_name().lower() + if name.lower() == my_name: + return True + + # If the given name is a base address, compare it with ours. + try: + base = HexInput.integer(name) + except ValueError: + base = None + if base is not None and base == self.get_base(): + return True + + # If the given name is a filename, convert it to a module name. + # Then compare it with ours, case insensitive. + modName = self.__filename_to_modname(name) + if modName.lower() == my_name: + return True + + # No match. + return False + + # ------------------------------------------------------------------------------ + + def open_handle(self): + """ + Opens a new handle to the module. + + The new handle is stored in the L{hFile} property. + """ + + if not self.get_filename(): + msg = "Cannot retrieve filename for module at %s" + msg = msg % HexDump.address(self.get_base()) + raise Exception(msg) + + hFile = win32.CreateFile(self.get_filename(), dwShareMode=win32.FILE_SHARE_READ, dwCreationDisposition=win32.OPEN_EXISTING) + + # In case hFile was set to an actual handle value instead of a Handle + # object. This shouldn't happen unless the user tinkered with hFile. + if not hasattr(self.hFile, "__del__"): + self.close_handle() + + self.hFile = hFile + + def close_handle(self): + """ + Closes the handle to the module. + + @note: Normally you don't need to call this method. All handles + created by I{WinAppDbg} are automatically closed when the garbage + collector claims them. So unless you've been tinkering with it, + setting L{hFile} to C{None} should be enough. + """ + try: + if hasattr(self.hFile, "close"): + self.hFile.close() + elif self.hFile not in (None, win32.INVALID_HANDLE_VALUE): + win32.CloseHandle(self.hFile) + finally: + self.hFile = None + + def get_handle(self): + """ + @rtype: L{FileHandle} + @return: Handle to the module file. + """ + if self.hFile in (None, win32.INVALID_HANDLE_VALUE): + self.open_handle() + return self.hFile + + def clear(self): + """ + Clears the resources held by this object. + """ + try: + self.set_process(None) + finally: + self.close_handle() + + # ------------------------------------------------------------------------------ + + # XXX FIXME + # I've been told sometimes the debugging symbols APIs don't correctly + # handle redirected exports (for example ws2_32!recv). + # I haven't been able to reproduce the bug yet. + def load_symbols(self): + """ + Loads the debugging symbols for a module. + Automatically called by L{get_symbols}. + """ + if win32.PROCESS_ALL_ACCESS == win32.PROCESS_ALL_ACCESS_VISTA: + dwAccess = win32.PROCESS_QUERY_LIMITED_INFORMATION + else: + dwAccess = win32.PROCESS_QUERY_INFORMATION + hProcess = self.get_process().get_handle(dwAccess) + hFile = self.hFile + BaseOfDll = self.get_base() + SizeOfDll = self.get_size() + Enumerator = self._SymbolEnumerator() + try: + win32.SymInitialize(hProcess) + SymOptions = win32.SymGetOptions() + SymOptions |= ( + win32.SYMOPT_ALLOW_ZERO_ADDRESS + | win32.SYMOPT_CASE_INSENSITIVE + | win32.SYMOPT_FAVOR_COMPRESSED + | win32.SYMOPT_INCLUDE_32BIT_MODULES + | win32.SYMOPT_UNDNAME + ) + SymOptions &= ~(win32.SYMOPT_LOAD_LINES | win32.SYMOPT_NO_IMAGE_SEARCH | win32.SYMOPT_NO_CPP | win32.SYMOPT_IGNORE_NT_SYMPATH) + win32.SymSetOptions(SymOptions) + try: + win32.SymSetOptions(SymOptions | win32.SYMOPT_ALLOW_ABSOLUTE_SYMBOLS) + except WindowsError: + pass + try: + try: + success = win32.SymLoadModule64(hProcess, hFile, None, None, BaseOfDll, SizeOfDll) + except WindowsError: + success = 0 + if not success: + ImageName = self.get_filename() + success = win32.SymLoadModule64(hProcess, None, ImageName, None, BaseOfDll, SizeOfDll) + if success: + try: + win32.SymEnumerateSymbols64(hProcess, BaseOfDll, Enumerator) + finally: + win32.SymUnloadModule64(hProcess, BaseOfDll) + finally: + win32.SymCleanup(hProcess) + except WindowsError: + e = sys.exc_info()[1] + msg = "Cannot load debug symbols for process ID %d, reason:\n%s" + msg = msg % (self.get_pid(), traceback.format_exc(e)) + warnings.warn(msg, DebugSymbolsWarning) + self.__symbols = Enumerator.symbols + + def unload_symbols(self): + """ + Unloads the debugging symbols for a module. + """ + self.__symbols = list() + + def get_symbols(self): + """ + Returns the debugging symbols for a module. + The symbols are automatically loaded when needed. + + @rtype: list of tuple( str, int, int ) + @return: List of symbols. + Each symbol is represented by a tuple that contains: + - Symbol name + - Symbol memory address + - Symbol size in bytes + """ + if not self.__symbols: + self.load_symbols() + return list(self.__symbols) + + def iter_symbols(self): + """ + Returns an iterator for the debugging symbols in a module, + in no particular order. + The symbols are automatically loaded when needed. + + @rtype: iterator of tuple( str, int, int ) + @return: Iterator of symbols. + Each symbol is represented by a tuple that contains: + - Symbol name + - Symbol memory address + - Symbol size in bytes + """ + if not self.__symbols: + self.load_symbols() + return self.__symbols.__iter__() + + def resolve_symbol(self, symbol, bCaseSensitive=False): + """ + Resolves a debugging symbol's address. + + @type symbol: str + @param symbol: Name of the symbol to resolve. + + @type bCaseSensitive: bool + @param bCaseSensitive: C{True} for case sensitive matches, + C{False} for case insensitive. + + @rtype: int or None + @return: Memory address of symbol. C{None} if not found. + """ + if bCaseSensitive: + for SymbolName, SymbolAddress, SymbolSize in self.iter_symbols(): + if symbol == SymbolName: + return SymbolAddress + for SymbolName, SymbolAddress, SymbolSize in self.iter_symbols(): + try: + SymbolName = win32.UnDecorateSymbolName(SymbolName) + except Exception: + continue + if symbol == SymbolName: + return SymbolAddress + else: + symbol = symbol.lower() + for SymbolName, SymbolAddress, SymbolSize in self.iter_symbols(): + if symbol == SymbolName.lower(): + return SymbolAddress + for SymbolName, SymbolAddress, SymbolSize in self.iter_symbols(): + try: + SymbolName = win32.UnDecorateSymbolName(SymbolName) + except Exception: + continue + if symbol == SymbolName.lower(): + return SymbolAddress + + def get_symbol_at_address(self, address): + """ + Tries to find the closest matching symbol for the given address. + + @type address: int + @param address: Memory address to query. + + @rtype: None or tuple( str, int, int ) + @return: Returns a tuple consisting of: + - Name + - Address + - Size (in bytes) + Returns C{None} if no symbol could be matched. + """ + found = None + for SymbolName, SymbolAddress, SymbolSize in self.iter_symbols(): + if SymbolAddress > address: + continue + if SymbolAddress + SymbolSize > address: + if not found or found[1] < SymbolAddress: + found = (SymbolName, SymbolAddress, SymbolSize) + return found + + # ------------------------------------------------------------------------------ + + def get_label(self, function=None, offset=None): + """ + Retrieves the label for the given function of this module or the module + base address if no function name is given. + + @type function: str + @param function: (Optional) Exported function name. + + @type offset: int + @param offset: (Optional) Offset from the module base address. + + @rtype: str + @return: Label for the module base address, plus the offset if given. + """ + return _ModuleContainer.parse_label(self.get_name(), function, offset) + + def get_label_at_address(self, address, offset=None): + """ + Creates a label from the given memory address. + + If the address belongs to the module, the label is made relative to + it's base address. + + @type address: int + @param address: Memory address. + + @type offset: None or int + @param offset: (Optional) Offset value. + + @rtype: str + @return: Label pointing to the given address. + """ + + # Add the offset to the address. + if offset: + address = address + offset + + # Make the label relative to the base address if no match is found. + module = self.get_name() + function = None + offset = address - self.get_base() + + # Make the label relative to the entrypoint if no other match is found. + # Skip if the entry point is unknown. + start = self.get_entry_point() + if start and start <= address: + function = "start" + offset = address - start + + # Enumerate exported functions and debug symbols, + # then find the closest match, if possible. + try: + symbol = self.get_symbol_at_address(address) + if symbol: + (SymbolName, SymbolAddress, SymbolSize) = symbol + new_offset = address - SymbolAddress + if new_offset <= offset: + function = SymbolName + offset = new_offset + except WindowsError: + pass + + # Parse the label and return it. + return _ModuleContainer.parse_label(module, function, offset) + + def is_address_here(self, address): + """ + Tries to determine if the given address belongs to this module. + + @type address: int + @param address: Memory address. + + @rtype: bool or None + @return: C{True} if the address belongs to the module, + C{False} if it doesn't, + and C{None} if it can't be determined. + """ + base = self.get_base() + size = self.get_size() + if base and size: + return base <= address < (base + size) + return None + + def resolve(self, function): + """ + Resolves a function exported by this module. + + @type function: str or int + @param function: + str: Name of the function. + int: Ordinal of the function. + + @rtype: int + @return: Memory address of the exported function in the process. + Returns None on error. + """ + + # Unknown DLL filename, there's nothing we can do. + filename = self.get_filename() + if not filename: + return None + + # If the DLL is already mapped locally, resolve the function. + try: + hlib = win32.GetModuleHandle(filename) + address = win32.GetProcAddress(hlib, function) + except WindowsError: + # Load the DLL locally, resolve the function and unload it. + try: + hlib = win32.LoadLibraryEx(filename, win32.DONT_RESOLVE_DLL_REFERENCES) + try: + address = win32.GetProcAddress(hlib, function) + finally: + win32.FreeLibrary(hlib) + except WindowsError: + return None + + # A NULL pointer means the function was not found. + if address in (None, 0): + return None + + # Compensate for DLL base relocations locally and remotely. + return address - hlib + self.lpBaseOfDll + + def resolve_label(self, label): + """ + Resolves a label for this module only. If the label refers to another + module, an exception is raised. + + @type label: str + @param label: Label to resolve. + + @rtype: int + @return: Memory address pointed to by the label. + + @raise ValueError: The label is malformed or impossible to resolve. + @raise RuntimeError: Cannot resolve the module or function. + """ + + # Split the label into it's components. + # Use the fuzzy mode whenever possible. + aProcess = self.get_process() + if aProcess is not None: + (module, procedure, offset) = aProcess.split_label(label) + else: + (module, procedure, offset) = _ModuleContainer.split_label(label) + + # If a module name is given that doesn't match ours, + # raise an exception. + if module and not self.match_name(module): + raise RuntimeError("Label does not belong to this module") + + # Resolve the procedure if given. + if procedure: + address = self.resolve(procedure) + if address is None: + # If it's a debug symbol, use the symbol. + address = self.resolve_symbol(procedure) + + # If it's the keyword "start" use the entry point. + if address is None and procedure == "start": + address = self.get_entry_point() + + # The procedure was not found. + if address is None: + if not module: + module = self.get_name() + msg = "Can't find procedure %s in module %s" + raise RuntimeError(msg % (procedure, module)) + + # If no procedure is given use the base address of the module. + else: + address = self.get_base() + + # Add the offset if given and return the resolved address. + if offset: + address = address + offset + return address + + +# ============================================================================== + +# TODO +# An alternative approach to the toolhelp32 snapshots: parsing the PEB and +# fetching the list of loaded modules from there. That would solve the problem +# of toolhelp32 not working when the process hasn't finished initializing. +# See: http://pferrie.host22.com/misc/lowlevel3.htm + + +class _ModuleContainer(object): + """ + Encapsulates the capability to contain Module objects. + + @note: Labels are an approximated way of referencing memory locations + across different executions of the same process, or different processes + with common modules. They are not meant to be perfectly unique, and + some errors may occur when multiple modules with the same name are + loaded, or when module filenames can't be retrieved. + + @group Modules snapshot: + scan_modules, + get_module, get_module_bases, get_module_count, + get_module_at_address, get_module_by_name, + has_module, iter_modules, iter_module_addresses, + clear_modules + + @group Labels: + parse_label, split_label, sanitize_label, resolve_label, + resolve_label_components, get_label_at_address, split_label_strict, + split_label_fuzzy + + @group Symbols: + load_symbols, unload_symbols, get_symbols, iter_symbols, + resolve_symbol, get_symbol_at_address + + @group Debugging: + is_system_defined_breakpoint, get_system_breakpoint, + get_user_breakpoint, get_breakin_breakpoint, + get_wow64_system_breakpoint, get_wow64_user_breakpoint, + get_wow64_breakin_breakpoint, get_break_on_error_ptr + """ + + def __init__(self): + self.__moduleDict = dict() + self.__system_breakpoints = dict() + + # Replace split_label with the fuzzy version on object instances. + self.split_label = self.__use_fuzzy_mode + + def __initialize_snapshot(self): + """ + Private method to automatically initialize the snapshot + when you try to use it without calling any of the scan_* + methods first. You don't need to call this yourself. + """ + if not self.__moduleDict: + try: + self.scan_modules() + except WindowsError: + pass + + def __contains__(self, anObject): + """ + @type anObject: L{Module}, int + @param anObject: + - C{Module}: Module object to look for. + - C{int}: Base address of the DLL to look for. + + @rtype: bool + @return: C{True} if the snapshot contains + a L{Module} object with the same base address. + """ + if isinstance(anObject, Module): + anObject = anObject.lpBaseOfDll + return self.has_module(anObject) + + def __iter__(self): + """ + @see: L{iter_modules} + @rtype: dictionary-valueiterator + @return: Iterator of L{Module} objects in this snapshot. + """ + return self.iter_modules() + + def __len__(self): + """ + @see: L{get_module_count} + @rtype: int + @return: Count of L{Module} objects in this snapshot. + """ + return self.get_module_count() + + def has_module(self, lpBaseOfDll): + """ + @type lpBaseOfDll: int + @param lpBaseOfDll: Base address of the DLL to look for. + + @rtype: bool + @return: C{True} if the snapshot contains a + L{Module} object with the given base address. + """ + self.__initialize_snapshot() + return lpBaseOfDll in self.__moduleDict + + def get_module(self, lpBaseOfDll): + """ + @type lpBaseOfDll: int + @param lpBaseOfDll: Base address of the DLL to look for. + + @rtype: L{Module} + @return: Module object with the given base address. + """ + self.__initialize_snapshot() + if lpBaseOfDll not in self.__moduleDict: + msg = "Unknown DLL base address %s" + msg = msg % HexDump.address(lpBaseOfDll) + raise KeyError(msg) + return self.__moduleDict[lpBaseOfDll] + + def iter_module_addresses(self): + """ + @see: L{iter_modules} + @rtype: dictionary-keyiterator + @return: Iterator of DLL base addresses in this snapshot. + """ + self.__initialize_snapshot() + return compat.iterkeys(self.__moduleDict) + + def iter_modules(self): + """ + @see: L{iter_module_addresses} + @rtype: dictionary-valueiterator + @return: Iterator of L{Module} objects in this snapshot. + """ + self.__initialize_snapshot() + return compat.itervalues(self.__moduleDict) + + def get_module_bases(self): + """ + @see: L{iter_module_addresses} + @rtype: list( int... ) + @return: List of DLL base addresses in this snapshot. + """ + self.__initialize_snapshot() + return compat.keys(self.__moduleDict) + + def get_module_count(self): + """ + @rtype: int + @return: Count of L{Module} objects in this snapshot. + """ + self.__initialize_snapshot() + return len(self.__moduleDict) + + # ------------------------------------------------------------------------------ + + def get_module_by_name(self, modName): + """ + @type modName: int + @param modName: + Name of the module to look for, as returned by L{Module.get_name}. + If two or more modules with the same name are loaded, only one + of the matching modules is returned. + + You can also pass a full pathname to the DLL file. + This works correctly even if two modules with the same name + are loaded from different paths. + + @rtype: L{Module} + @return: C{Module} object that best matches the given name. + Returns C{None} if no C{Module} can be found. + """ + + # Convert modName to lowercase. + # This helps make case insensitive string comparisons. + modName = modName.lower() + + # modName is an absolute pathname. + if PathOperations.path_is_absolute(modName): + for lib in self.iter_modules(): + if modName == lib.get_filename().lower(): + return lib + return None # Stop trying to match the name. + + # Get all the module names. + # This prevents having to iterate through the module list + # more than once. + modDict = [(lib.get_name(), lib) for lib in self.iter_modules()] + modDict = dict(modDict) + + # modName is a base filename. + if modName in modDict: + return modDict[modName] + + # modName is a base filename without extension. + filepart, extpart = PathOperations.split_extension(modName) + if filepart and extpart: + if filepart in modDict: + return modDict[filepart] + + # modName is a base address. + try: + baseAddress = HexInput.integer(modName) + except ValueError: + return None + if self.has_module(baseAddress): + return self.get_module(baseAddress) + + # Module not found. + return None + + def get_module_at_address(self, address): + """ + @type address: int + @param address: Memory address to query. + + @rtype: L{Module} + @return: C{Module} object that best matches the given address. + Returns C{None} if no C{Module} can be found. + """ + bases = self.get_module_bases() + bases.sort() + bases.append(long(0x10000000000000000)) # max. 64 bit address + 1 + if address >= bases[0]: + i = 0 + max_i = len(bases) - 1 + while i < max_i: + begin, end = bases[i : i + 2] + if begin <= address < end: + module = self.get_module(begin) + here = module.is_address_here(address) + if here is False: + break + else: # True or None + return module + i = i + 1 + return None + + # XXX this method musn't end up calling __initialize_snapshot by accident! + def scan_modules(self): + """ + Populates the snapshot with loaded modules. + """ + + # The module filenames may be spoofed by malware, + # since this information resides in usermode space. + # See: http://www.ragestorm.net/blogs/?p=163 + + # Ignore special process IDs. + # PID 0: System Idle Process. Also has a special meaning to the + # toolhelp APIs (current process). + # PID 4: System Integrity Group. See this forum post for more info: + # http://tinyurl.com/ycza8jo + # (points to social.technet.microsoft.com) + # Only on XP and above + # PID 8: System (?) only in Windows 2000 and below AFAIK. + # It's probably the same as PID 4 in XP and above. + dwProcessId = self.get_pid() + if dwProcessId in (0, 4, 8): + return + + # It would seem easier to clear the snapshot first. + # But then all open handles would be closed. + found_bases = set() + with win32.CreateToolhelp32Snapshot(win32.TH32CS_SNAPMODULE, dwProcessId) as hSnapshot: + me = win32.Module32First(hSnapshot) + while me is not None: + lpBaseAddress = me.modBaseAddr + fileName = me.szExePath # full pathname + if not fileName: + fileName = me.szModule # filename only + if not fileName: + fileName = None + else: + fileName = PathOperations.native_to_win32_pathname(fileName) + found_bases.add(lpBaseAddress) + ## if not self.has_module(lpBaseAddress): # XXX triggers a scan + if lpBaseAddress not in self.__moduleDict: + aModule = Module(lpBaseAddress, fileName=fileName, SizeOfImage=me.modBaseSize, process=self) + self._add_module(aModule) + else: + aModule = self.get_module(lpBaseAddress) + if not aModule.fileName: + aModule.fileName = fileName + if not aModule.SizeOfImage: + aModule.SizeOfImage = me.modBaseSize + if not aModule.process: + aModule.process = self + me = win32.Module32Next(hSnapshot) + ## for base in self.get_module_bases(): # XXX triggers a scan + for base in compat.keys(self.__moduleDict): + if base not in found_bases: + self._del_module(base) + + def clear_modules(self): + """ + Clears the modules snapshot. + """ + for aModule in compat.itervalues(self.__moduleDict): + aModule.clear() + self.__moduleDict = dict() + + # ------------------------------------------------------------------------------ + + @staticmethod + def parse_label(module=None, function=None, offset=None): + """ + Creates a label from a module and a function name, plus an offset. + + @warning: This method only creates the label, it doesn't make sure the + label actually points to a valid memory location. + + @type module: None or str + @param module: (Optional) Module name. + + @type function: None, str or int + @param function: (Optional) Function name or ordinal. + + @type offset: None or int + @param offset: (Optional) Offset value. + + If C{function} is specified, offset from the function. + + If C{function} is C{None}, offset from the module. + + @rtype: str + @return: + Label representing the given function in the given module. + + @raise ValueError: + The module or function name contain invalid characters. + """ + + # TODO + # Invalid characters should be escaped or filtered. + + # Convert ordinals to strings. + try: + function = "#0x%x" % function + except TypeError: + pass + + # Validate the parameters. + if module is not None and ("!" in module or "+" in module): + raise ValueError("Invalid module name: %s" % module) + if function is not None and ("!" in function or "+" in function): + raise ValueError("Invalid function name: %s" % function) + + # Parse the label. + if module: + if function: + if offset: + label = "%s!%s+0x%x" % (module, function, offset) + else: + label = "%s!%s" % (module, function) + else: + if offset: + ## label = "%s+0x%x!" % (module, offset) + label = "%s!0x%x" % (module, offset) + else: + label = "%s!" % module + else: + if function: + if offset: + label = "!%s+0x%x" % (function, offset) + else: + label = "!%s" % function + else: + if offset: + label = "0x%x" % offset + else: + label = "0x0" + + return label + + @staticmethod + def split_label_strict(label): + """ + Splits a label created with L{parse_label}. + + To parse labels with a less strict syntax, use the L{split_label_fuzzy} + method instead. + + @warning: This method only parses the label, it doesn't make sure the + label actually points to a valid memory location. + + @type label: str + @param label: Label to split. + + @rtype: tuple( str or None, str or int or None, int or None ) + @return: Tuple containing the C{module} name, + the C{function} name or ordinal, and the C{offset} value. + + If the label doesn't specify a module, + then C{module} is C{None}. + + If the label doesn't specify a function, + then C{function} is C{None}. + + If the label doesn't specify an offset, + then C{offset} is C{0}. + + @raise ValueError: The label is malformed. + """ + module = function = None + offset = 0 + + # Special case: None + if not label: + label = "0x0" + else: + # Remove all blanks. + label = label.replace(" ", "") + label = label.replace("\t", "") + label = label.replace("\r", "") + label = label.replace("\n", "") + + # Special case: empty label. + if not label: + label = "0x0" + + # * ! * + if "!" in label: + try: + module, function = label.split("!") + except ValueError: + raise ValueError("Malformed label: %s" % label) + + # module ! function + if function: + if "+" in module: + raise ValueError("Malformed label: %s" % label) + + # module ! function + offset + if "+" in function: + try: + function, offset = function.split("+") + except ValueError: + raise ValueError("Malformed label: %s" % label) + try: + offset = HexInput.integer(offset) + except ValueError: + raise ValueError("Malformed label: %s" % label) + else: + # module ! offset + try: + offset = HexInput.integer(function) + function = None + except ValueError: + pass + else: + # module + offset ! + if "+" in module: + try: + module, offset = module.split("+") + except ValueError: + raise ValueError("Malformed label: %s" % label) + try: + offset = HexInput.integer(offset) + except ValueError: + raise ValueError("Malformed label: %s" % label) + + else: + # module ! + try: + offset = HexInput.integer(module) + module = None + + # offset ! + except ValueError: + pass + + if not module: + module = None + if not function: + function = None + + # * + else: + # offset + try: + offset = HexInput.integer(label) + + # # ordinal + except ValueError: + if label.startswith("#"): + function = label + try: + HexInput.integer(function[1:]) + + # module? + # function? + except ValueError: + raise ValueError("Ambiguous label: %s" % label) + + # module? + # function? + else: + raise ValueError("Ambiguous label: %s" % label) + + # Convert function ordinal strings into integers. + if function and function.startswith("#"): + try: + function = HexInput.integer(function[1:]) + except ValueError: + pass + + # Convert null offsets to None. + if not offset: + offset = None + + return (module, function, offset) + + def split_label_fuzzy(self, label): + """ + Splits a label entered as user input. + + It's more flexible in it's syntax parsing than the L{split_label_strict} + method, as it allows the exclamation mark (B{C{!}}) to be omitted. The + ambiguity is resolved by searching the modules in the snapshot to guess + if a label refers to a module or a function. It also tries to rebuild + labels when they contain hardcoded addresses. + + @warning: This method only parses the label, it doesn't make sure the + label actually points to a valid memory location. + + @type label: str + @param label: Label to split. + + @rtype: tuple( str or None, str or int or None, int or None ) + @return: Tuple containing the C{module} name, + the C{function} name or ordinal, and the C{offset} value. + + If the label doesn't specify a module, + then C{module} is C{None}. + + If the label doesn't specify a function, + then C{function} is C{None}. + + If the label doesn't specify an offset, + then C{offset} is C{0}. + + @raise ValueError: The label is malformed. + """ + module = function = None + offset = 0 + + # Special case: None + if not label: + label = compat.b("0x0") + else: + # Remove all blanks. + label = label.replace(compat.b(" "), compat.b("")) + label = label.replace(compat.b("\t"), compat.b("")) + label = label.replace(compat.b("\r"), compat.b("")) + label = label.replace(compat.b("\n"), compat.b("")) + + # Special case: empty label. + if not label: + label = compat.b("0x0") + + # If an exclamation sign is present, we know we can parse it strictly. + if compat.b("!") in label: + return self.split_label_strict(label) + + ## # Try to parse it strictly, on error do it the fuzzy way. + ## try: + ## return self.split_label(label) + ## except ValueError: + ## pass + + # * + offset + if compat.b("+") in label: + try: + prefix, offset = label.split(compat.b("+")) + except ValueError: + raise ValueError("Malformed label: %s" % label) + try: + offset = HexInput.integer(offset) + except ValueError: + raise ValueError("Malformed label: %s" % label) + label = prefix + + # This parses both filenames and base addresses. + modobj = self.get_module_by_name(label) + if modobj: + # module + # module + offset + module = modobj.get_name() + + else: + # TODO + # If 0xAAAAAAAA + 0xBBBBBBBB is given, + # A is interpreted as a module base address, + # and B as an offset. + # If that fails, it'd be good to add A+B and try to + # use the nearest loaded module. + + # offset + # base address + offset (when no module has that base address) + try: + address = HexInput.integer(label) + + if offset: + # If 0xAAAAAAAA + 0xBBBBBBBB is given, + # A is interpreted as a module base address, + # and B as an offset. + # If that fails, we get here, meaning no module was found + # at A. Then add up A+B and work with that as a hardcoded + # address. + offset = address + offset + else: + # If the label is a hardcoded address, we get here. + offset = address + + # If only a hardcoded address is given, + # rebuild the label using get_label_at_address. + # Then parse it again, but this time strictly, + # both because there is no need for fuzzy syntax and + # to prevent an infinite recursion if there's a bug here. + try: + new_label = self.get_label_at_address(offset) + module, function, offset = self.split_label_strict(new_label) + except ValueError: + pass + + # function + # function + offset + except ValueError: + function = label + + # Convert function ordinal strings into integers. + if function and function.startswith(compat.b("#")): + try: + function = HexInput.integer(function[1:]) + except ValueError: + pass + + # Convert null offsets to None. + if not offset: + offset = None + + return (module, function, offset) + + @classmethod + def split_label(cls, label): + """ + Splits a label into it's C{module}, C{function} and C{offset} + components, as used in L{parse_label}. + + When called as a static method, the strict syntax mode is used:: + + winappdbg.Process.split_label( "kernel32!CreateFileA" ) + + When called as an instance method, the fuzzy syntax mode is used:: + + aProcessInstance.split_label( "CreateFileA" ) + + @see: L{split_label_strict}, L{split_label_fuzzy} + + @type label: str + @param label: Label to split. + + @rtype: tuple( str or None, str or int or None, int or None ) + @return: + Tuple containing the C{module} name, + the C{function} name or ordinal, and the C{offset} value. + + If the label doesn't specify a module, + then C{module} is C{None}. + + If the label doesn't specify a function, + then C{function} is C{None}. + + If the label doesn't specify an offset, + then C{offset} is C{0}. + + @raise ValueError: The label is malformed. + """ + + # XXX + # Docstring indentation was removed so epydoc doesn't complain + # when parsing the docs for __use_fuzzy_mode(). + + # This function is overwritten by __init__ + # so here is the static implementation only. + return cls.split_label_strict(label) + + # The split_label method is replaced with this function by __init__. + def __use_fuzzy_mode(self, label): + "@see: L{split_label}" + return self.split_label_fuzzy(label) + + ## __use_fuzzy_mode.__doc__ = split_label.__doc__ + + def sanitize_label(self, label): + """ + Converts a label taken from user input into a well-formed label. + + @type label: str + @param label: Label taken from user input. + + @rtype: str + @return: Sanitized label. + """ + (module, function, offset) = self.split_label_fuzzy(label) + label = self.parse_label(module, function, offset) + return label + + def resolve_label(self, label): + """ + Resolve the memory address of the given label. + + @note: + If multiple modules with the same name are loaded, + the label may be resolved at any of them. For a more precise + way to resolve functions use the base address to get the L{Module} + object (see L{Process.get_module}) and then call L{Module.resolve}. + + If no module name is specified in the label, the function may be + resolved in any loaded module. If you want to resolve all functions + with that name in all processes, call L{Process.iter_modules} to + iterate through all loaded modules, and then try to resolve the + function in each one of them using L{Module.resolve}. + + @type label: str + @param label: Label to resolve. + + @rtype: int + @return: Memory address pointed to by the label. + + @raise ValueError: The label is malformed or impossible to resolve. + @raise RuntimeError: Cannot resolve the module or function. + """ + + # Split the label into module, function and offset components. + module, function, offset = self.split_label_fuzzy(label) + + # Resolve the components into a memory address. + address = self.resolve_label_components(module, function, offset) + + # Return the memory address. + return address + + def resolve_label_components(self, module=None, function=None, offset=None): + """ + Resolve the memory address of the given module, function and/or offset. + + @note: + If multiple modules with the same name are loaded, + the label may be resolved at any of them. For a more precise + way to resolve functions use the base address to get the L{Module} + object (see L{Process.get_module}) and then call L{Module.resolve}. + + If no module name is specified in the label, the function may be + resolved in any loaded module. If you want to resolve all functions + with that name in all processes, call L{Process.iter_modules} to + iterate through all loaded modules, and then try to resolve the + function in each one of them using L{Module.resolve}. + + @type module: None or str + @param module: (Optional) Module name. + + @type function: None, str or int + @param function: (Optional) Function name or ordinal. + + @type offset: None or int + @param offset: (Optional) Offset value. + + If C{function} is specified, offset from the function. + + If C{function} is C{None}, offset from the module. + + @rtype: int + @return: Memory address pointed to by the label. + + @raise ValueError: The label is malformed or impossible to resolve. + @raise RuntimeError: Cannot resolve the module or function. + """ + # Default address if no module or function are given. + # An offset may be added later. + address = 0 + + # Resolve the module. + # If the module is not found, check for the special symbol "main". + if module: + modobj = self.get_module_by_name(module) + if not modobj: + if module == "main": + modobj = self.get_main_module() + else: + raise RuntimeError("Module %r not found" % module) + + # Resolve the exported function or debugging symbol. + # If all else fails, check for the special symbol "start". + if function: + address = modobj.resolve(function) + if address is None: + address = modobj.resolve_symbol(function) + if address is None: + if function == "start": + address = modobj.get_entry_point() + if address is None: + msg = "Symbol %r not found in module %s" + raise RuntimeError(msg % (function, module)) + + # No function, use the base address. + else: + address = modobj.get_base() + + # Resolve the function in any module. + # If all else fails, check for the special symbols "main" and "start". + elif function: + for modobj in self.iter_modules(): + address = modobj.resolve(function) + if address is not None: + break + if address is None: + if function == "start": + modobj = self.get_main_module() + address = modobj.get_entry_point() + elif function == "main": + modobj = self.get_main_module() + address = modobj.get_base() + else: + msg = "Function %r not found in any module" % function + raise RuntimeError(msg) + + # Return the address plus the offset. + if offset: + address = address + offset + return address + + def get_label_at_address(self, address, offset=None): + """ + Creates a label from the given memory address. + + @warning: This method uses the name of the nearest currently loaded + module. If that module is unloaded later, the label becomes + impossible to resolve. + + @type address: int + @param address: Memory address. + + @type offset: None or int + @param offset: (Optional) Offset value. + + @rtype: str + @return: Label pointing to the given address. + """ + if offset: + address = address + offset + modobj = self.get_module_at_address(address) + if modobj: + label = modobj.get_label_at_address(address) + else: + label = self.parse_label(None, None, address) + return label + + # ------------------------------------------------------------------------------ + + # The memory addresses of system breakpoints are be cached, since they're + # all in system libraries it's not likely they'll ever change their address + # during the lifetime of the process... I don't suppose a program could + # happily unload ntdll.dll and survive. + def __get_system_breakpoint(self, label): + try: + return self.__system_breakpoints[label] + except KeyError: + try: + address = self.resolve_label(label) + except Exception: + return None + self.__system_breakpoints[label] = address + return address + + # It's in kernel32 in Windows Server 2003, in ntdll since Windows Vista. + # It can only be resolved if we have the debug symbols. + def get_break_on_error_ptr(self): + """ + @rtype: int + @return: + If present, returns the address of the C{g_dwLastErrorToBreakOn} + global variable for this process. If not, returns C{None}. + """ + address = self.__get_system_breakpoint("ntdll!g_dwLastErrorToBreakOn") + if not address: + address = self.__get_system_breakpoint("kernel32!g_dwLastErrorToBreakOn") + # cheat a little :) + self.__system_breakpoints["ntdll!g_dwLastErrorToBreakOn"] = address + return address + + def is_system_defined_breakpoint(self, address): + """ + @type address: int + @param address: Memory address. + + @rtype: bool + @return: C{True} if the given address points to a system defined + breakpoint. System defined breakpoints are hardcoded into + system libraries. + """ + if address: + module = self.get_module_at_address(address) + if module: + return module.match_name("ntdll") or module.match_name("kernel32") + return False + + # FIXME + # In Wine, the system breakpoint seems to be somewhere in kernel32. + def get_system_breakpoint(self): + """ + @rtype: int or None + @return: Memory address of the system breakpoint + within the process address space. + Returns C{None} on error. + """ + return self.__get_system_breakpoint("ntdll!DbgBreakPoint") + + # I don't know when this breakpoint is actually used... + def get_user_breakpoint(self): + """ + @rtype: int or None + @return: Memory address of the user breakpoint + within the process address space. + Returns C{None} on error. + """ + return self.__get_system_breakpoint("ntdll!DbgUserBreakPoint") + + # On some platforms, this breakpoint can only be resolved + # when the debugging symbols for ntdll.dll are loaded. + def get_breakin_breakpoint(self): + """ + @rtype: int or None + @return: Memory address of the remote breakin breakpoint + within the process address space. + Returns C{None} on error. + """ + return self.__get_system_breakpoint("ntdll!DbgUiRemoteBreakin") + + # Equivalent of ntdll!DbgBreakPoint in Wow64. + def get_wow64_system_breakpoint(self): + """ + @rtype: int or None + @return: Memory address of the Wow64 system breakpoint + within the process address space. + Returns C{None} on error. + """ + return self.__get_system_breakpoint("ntdll32!DbgBreakPoint") + + # Equivalent of ntdll!DbgUserBreakPoint in Wow64. + def get_wow64_user_breakpoint(self): + """ + @rtype: int or None + @return: Memory address of the Wow64 user breakpoint + within the process address space. + Returns C{None} on error. + """ + return self.__get_system_breakpoint("ntdll32!DbgUserBreakPoint") + + # Equivalent of ntdll!DbgUiRemoteBreakin in Wow64. + def get_wow64_breakin_breakpoint(self): + """ + @rtype: int or None + @return: Memory address of the Wow64 remote breakin breakpoint + within the process address space. + Returns C{None} on error. + """ + return self.__get_system_breakpoint("ntdll32!DbgUiRemoteBreakin") + + # ------------------------------------------------------------------------------ + + def load_symbols(self): + """ + Loads the debugging symbols for all modules in this snapshot. + Automatically called by L{get_symbols}. + """ + for aModule in self.iter_modules(): + aModule.load_symbols() + + def unload_symbols(self): + """ + Unloads the debugging symbols for all modules in this snapshot. + """ + for aModule in self.iter_modules(): + aModule.unload_symbols() + + def get_symbols(self): + """ + Returns the debugging symbols for all modules in this snapshot. + The symbols are automatically loaded when needed. + + @rtype: list of tuple( str, int, int ) + @return: List of symbols. + Each symbol is represented by a tuple that contains: + - Symbol name + - Symbol memory address + - Symbol size in bytes + """ + symbols = list() + for aModule in self.iter_modules(): + for symbol in aModule.iter_symbols(): + symbols.append(symbol) + return symbols + + def iter_symbols(self): + """ + Returns an iterator for the debugging symbols in all modules in this + snapshot, in no particular order. + The symbols are automatically loaded when needed. + + @rtype: iterator of tuple( str, int, int ) + @return: Iterator of symbols. + Each symbol is represented by a tuple that contains: + - Symbol name + - Symbol memory address + - Symbol size in bytes + """ + for aModule in self.iter_modules(): + for symbol in aModule.iter_symbols(): + yield symbol + + def resolve_symbol(self, symbol, bCaseSensitive=False): + """ + Resolves a debugging symbol's address. + + @type symbol: str + @param symbol: Name of the symbol to resolve. + + @type bCaseSensitive: bool + @param bCaseSensitive: C{True} for case sensitive matches, + C{False} for case insensitive. + + @rtype: int or None + @return: Memory address of symbol. C{None} if not found. + """ + if bCaseSensitive: + for SymbolName, SymbolAddress, SymbolSize in self.iter_symbols(): + if symbol == SymbolName: + return SymbolAddress + else: + symbol = symbol.lower() + for SymbolName, SymbolAddress, SymbolSize in self.iter_symbols(): + if symbol == SymbolName.lower(): + return SymbolAddress + + def get_symbol_at_address(self, address): + """ + Tries to find the closest matching symbol for the given address. + + @type address: int + @param address: Memory address to query. + + @rtype: None or tuple( str, int, int ) + @return: Returns a tuple consisting of: + - Name + - Address + - Size (in bytes) + Returns C{None} if no symbol could be matched. + """ + # Any module may have symbols pointing anywhere in memory, so there's + # no easy way to optimize this. I guess we're stuck with brute force. + found = None + for SymbolName, SymbolAddress, SymbolSize in self.iter_symbols(): + if SymbolAddress > address: + continue + + if SymbolAddress == address: + found = (SymbolName, SymbolAddress, SymbolSize) + break + + if SymbolAddress < address: + if found and (address - found[1]) < (address - SymbolAddress): + continue + else: + found = (SymbolName, SymbolAddress, SymbolSize) + return found + + # ------------------------------------------------------------------------------ + + # XXX _notify_* methods should not trigger a scan + + def _add_module(self, aModule): + """ + Private method to add a module object to the snapshot. + + @type aModule: L{Module} + @param aModule: Module object. + """ + ## if not isinstance(aModule, Module): + ## if hasattr(aModule, '__class__'): + ## typename = aModule.__class__.__name__ + ## else: + ## typename = str(type(aModule)) + ## msg = "Expected Module, got %s instead" % typename + ## raise TypeError(msg) + lpBaseOfDll = aModule.get_base() + ## if lpBaseOfDll in self.__moduleDict: + ## msg = "Module already exists: %d" % lpBaseOfDll + ## raise KeyError(msg) + aModule.set_process(self) + self.__moduleDict[lpBaseOfDll] = aModule + + def _del_module(self, lpBaseOfDll): + """ + Private method to remove a module object from the snapshot. + + @type lpBaseOfDll: int + @param lpBaseOfDll: Module base address. + """ + try: + aModule = self.__moduleDict[lpBaseOfDll] + del self.__moduleDict[lpBaseOfDll] + except KeyError: + aModule = None + msg = "Unknown base address %d" % HexDump.address(lpBaseOfDll) + warnings.warn(msg, RuntimeWarning) + if aModule: + aModule.clear() # remove circular references + + def __add_loaded_module(self, event): + """ + Private method to automatically add new module objects from debug events. + + @type event: L{Event} + @param event: Event object. + """ + lpBaseOfDll = event.get_module_base() + hFile = event.get_file_handle() + ## if not self.has_module(lpBaseOfDll): # XXX this would trigger a scan + if lpBaseOfDll not in self.__moduleDict: + fileName = event.get_filename() + if not fileName: + fileName = None + if hasattr(event, "get_start_address"): + EntryPoint = event.get_start_address() + else: + EntryPoint = None + aModule = Module(lpBaseOfDll, hFile, fileName=fileName, EntryPoint=EntryPoint, process=self) + self._add_module(aModule) + else: + aModule = self.get_module(lpBaseOfDll) + if not aModule.hFile and hFile not in (None, 0, win32.INVALID_HANDLE_VALUE): + aModule.hFile = hFile + if not aModule.process: + aModule.process = self + if aModule.EntryPoint is None and hasattr(event, "get_start_address"): + aModule.EntryPoint = event.get_start_address() + if not aModule.fileName: + fileName = event.get_filename() + if fileName: + aModule.fileName = fileName + + def _notify_create_process(self, event): + """ + Notify the load of the main module. + + This is done automatically by the L{Debug} class, you shouldn't need + to call it yourself. + + @type event: L{CreateProcessEvent} + @param event: Create process event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + self.__add_loaded_module(event) + return True + + def _notify_load_dll(self, event): + """ + Notify the load of a new module. + + This is done automatically by the L{Debug} class, you shouldn't need + to call it yourself. + + @type event: L{LoadDLLEvent} + @param event: Load DLL event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + self.__add_loaded_module(event) + return True + + def _notify_unload_dll(self, event): + """ + Notify the release of a loaded module. + + This is done automatically by the L{Debug} class, you shouldn't need + to call it yourself. + + @type event: L{UnloadDLLEvent} + @param event: Unload DLL event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + lpBaseOfDll = event.get_module_base() + ## if self.has_module(lpBaseOfDll): # XXX this would trigger a scan + if lpBaseOfDll in self.__moduleDict: + self._del_module(lpBaseOfDll) + return True diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/process.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/process.py new file mode 100644 index 0000000..c274958 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/process.py @@ -0,0 +1,4885 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Process instrumentation. + +@group Instrumentation: + Process +""" + +from __future__ import with_statement + +# FIXME +# I've been told the host process for the latest versions of VMWare +# can't be instrumented, because they try to stop code injection into the VMs. +# The solution appears to be to run the debugger from a user account that +# belongs to the VMware group. I haven't confirmed this yet. + +__revision__ = "$Id$" + +__all__ = ["Process"] + +import sys +from winappdbg import win32 +from winappdbg import compat +from winappdbg.textio import HexDump, HexInput +from winappdbg.util import Regenerator, PathOperations, MemoryAddresses +from winappdbg.module import Module, _ModuleContainer +from winappdbg.thread import Thread, _ThreadContainer +from winappdbg.window import Window +from winappdbg.search import Search, Pattern, BytePattern, TextPattern, RegExpPattern, HexPattern +from winappdbg.disasm import Disassembler + +import re +import os +import os.path +import ctypes +import struct +import warnings +import traceback + +# delayed import +System = None + +# ============================================================================== + +# TODO +# * Remote GetLastError() +# * The memory operation methods do not take into account that code breakpoints +# change the memory. This object should talk to BreakpointContainer to +# retrieve the original memory contents where code breakpoints are enabled. +# * A memory cache could be implemented here. + + +class Process(_ThreadContainer, _ModuleContainer): + """ + Interface to a process. Contains threads and modules snapshots. + + @group Properties: + get_pid, is_alive, is_debugged, is_wow64, get_arch, get_bits, + get_filename, get_exit_code, + get_start_time, get_exit_time, get_running_time, + get_services, get_dep_policy, get_peb, get_peb_address, + get_entry_point, get_main_module, get_image_base, get_image_name, + get_command_line, get_environment, + get_command_line_block, + get_environment_block, get_environment_variables, + get_handle, open_handle, close_handle + + @group Instrumentation: + kill, wait, suspend, resume, inject_code, inject_dll, clean_exit + + @group Disassembly: + disassemble, disassemble_around, disassemble_around_pc, + disassemble_string, disassemble_instruction, disassemble_current + + @group Debugging: + flush_instruction_cache, debug_break, peek_pointers_in_data + + @group Memory mapping: + take_memory_snapshot, generate_memory_snapshot, iter_memory_snapshot, + restore_memory_snapshot, get_memory_map, get_mapped_filenames, + generate_memory_map, iter_memory_map, + is_pointer, is_address_valid, is_address_free, is_address_reserved, + is_address_commited, is_address_guard, is_address_readable, + is_address_writeable, is_address_copy_on_write, is_address_executable, + is_address_executable_and_writeable, + is_buffer, + is_buffer_readable, is_buffer_writeable, is_buffer_executable, + is_buffer_executable_and_writeable, is_buffer_copy_on_write + + @group Memory allocation: + malloc, free, mprotect, mquery + + @group Memory read: + read, read_char, read_int, read_uint, read_float, read_double, + read_dword, read_qword, read_pointer, read_string, read_structure, + peek, peek_char, peek_int, peek_uint, peek_float, peek_double, + peek_dword, peek_qword, peek_pointer, peek_string + + @group Memory write: + write, write_char, write_int, write_uint, write_float, write_double, + write_dword, write_qword, write_pointer, + poke, poke_char, poke_int, poke_uint, poke_float, poke_double, + poke_dword, poke_qword, poke_pointer + + @group Memory search: + search, search_bytes, search_hexa, search_text, search_regexp, strings + + @group Processes snapshot: + scan, clear, __contains__, __iter__, __len__ + + @group Deprecated: + get_environment_data, parse_environment_data + + @type dwProcessId: int + @ivar dwProcessId: Global process ID. Use L{get_pid} instead. + + @type hProcess: L{ProcessHandle} + @ivar hProcess: Handle to the process. Use L{get_handle} instead. + + @type fileName: str + @ivar fileName: Filename of the main module. Use L{get_filename} instead. + """ + + def __init__(self, dwProcessId, hProcess=None, fileName=None): + """ + @type dwProcessId: int + @param dwProcessId: Global process ID. + + @type hProcess: L{ProcessHandle} + @param hProcess: Handle to the process. + + @type fileName: str + @param fileName: (Optional) Filename of the main module. + """ + _ThreadContainer.__init__(self) + _ModuleContainer.__init__(self) + + self.dwProcessId = dwProcessId + self.hProcess = hProcess + self.fileName = fileName + + def get_pid(self): + """ + @rtype: int + @return: Process global ID. + """ + return self.dwProcessId + + def get_filename(self): + """ + @rtype: str + @return: Filename of the main module of the process. + """ + if not self.fileName: + self.fileName = self.get_image_name() + return self.fileName + + def open_handle(self, dwDesiredAccess=win32.PROCESS_ALL_ACCESS): + """ + Opens a new handle to the process. + + The new handle is stored in the L{hProcess} property. + + @warn: Normally you should call L{get_handle} instead, since it's much + "smarter" and tries to reuse handles and merge access rights. + + @type dwDesiredAccess: int + @param dwDesiredAccess: Desired access rights. + Defaults to L{win32.PROCESS_ALL_ACCESS}. + See: U{http://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx} + + @raise WindowsError: It's not possible to open a handle to the process + with the requested access rights. This tipically happens because + the target process is a system process and the debugger is not + runnning with administrative rights. + """ + hProcess = win32.OpenProcess(dwDesiredAccess, win32.FALSE, self.dwProcessId) + + try: + self.close_handle() + except Exception: + warnings.warn("Failed to close process handle: %s" % traceback.format_exc()) + + self.hProcess = hProcess + + def close_handle(self): + """ + Closes the handle to the process. + + @note: Normally you don't need to call this method. All handles + created by I{WinAppDbg} are automatically closed when the garbage + collector claims them. So unless you've been tinkering with it, + setting L{hProcess} to C{None} should be enough. + """ + try: + if hasattr(self.hProcess, "close"): + self.hProcess.close() + elif self.hProcess not in (None, win32.INVALID_HANDLE_VALUE): + win32.CloseHandle(self.hProcess) + finally: + self.hProcess = None + + def get_handle(self, dwDesiredAccess=win32.PROCESS_ALL_ACCESS): + """ + Returns a handle to the process with I{at least} the access rights + requested. + + @note: + If a handle was previously opened and has the required access + rights, it's reused. If not, a new handle is opened with the + combination of the old and new access rights. + + @type dwDesiredAccess: int + @param dwDesiredAccess: Desired access rights. + Defaults to L{win32.PROCESS_ALL_ACCESS}. + See: U{http://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx} + + @rtype: L{ProcessHandle} + @return: Handle to the process. + + @raise WindowsError: It's not possible to open a handle to the process + with the requested access rights. This tipically happens because + the target process is a system process and the debugger is not + runnning with administrative rights. + """ + if self.hProcess in (None, win32.INVALID_HANDLE_VALUE): + self.open_handle(dwDesiredAccess) + else: + dwAccess = self.hProcess.dwAccess + if (dwAccess | dwDesiredAccess) != dwAccess: + self.open_handle(dwAccess | dwDesiredAccess) + return self.hProcess + + # ------------------------------------------------------------------------------ + + # Not really sure if it's a good idea... + ## def __eq__(self, aProcess): + ## """ + ## Compare two Process objects. The comparison is made using the IDs. + ## + ## @warning: + ## If you have two Process instances with different handles the + ## equality operator still returns C{True}, so be careful! + ## + ## @type aProcess: L{Process} + ## @param aProcess: Another Process object. + ## + ## @rtype: bool + ## @return: C{True} if the two process IDs are equal, + ## C{False} otherwise. + ## """ + ## return isinstance(aProcess, Process) and \ + ## self.get_pid() == aProcess.get_pid() + + def __contains__(self, anObject): + """ + The same as: C{self.has_thread(anObject) or self.has_module(anObject)} + + @type anObject: L{Thread}, L{Module} or int + @param anObject: Object to look for. + Can be a Thread, Module, thread global ID or module base address. + + @rtype: bool + @return: C{True} if the requested object was found in the snapshot. + """ + return _ThreadContainer.__contains__(self, anObject) or _ModuleContainer.__contains__(self, anObject) + + def __len__(self): + """ + @see: L{get_thread_count}, L{get_module_count} + @rtype: int + @return: Count of L{Thread} and L{Module} objects in this snapshot. + """ + return _ThreadContainer.__len__(self) + _ModuleContainer.__len__(self) + + class __ThreadsAndModulesIterator(object): + """ + Iterator object for L{Process} objects. + Iterates through L{Thread} objects first, L{Module} objects next. + """ + + def __init__(self, container): + """ + @type container: L{Process} + @param container: L{Thread} and L{Module} container. + """ + self.__container = container + self.__iterator = None + self.__state = 0 + + def __iter__(self): + "x.__iter__() <==> iter(x)" + return self + + def next(self): + "x.next() -> the next value, or raise StopIteration" + if self.__state == 0: + self.__iterator = self.__container.iter_threads() + self.__state = 1 + if self.__state == 1: + try: + return self.__iterator.next() + except StopIteration: + self.__iterator = self.__container.iter_modules() + self.__state = 2 + if self.__state == 2: + try: + return self.__iterator.next() + except StopIteration: + self.__iterator = None + self.__state = 3 + raise StopIteration + + def __iter__(self): + """ + @see: L{iter_threads}, L{iter_modules} + @rtype: iterator + @return: Iterator of L{Thread} and L{Module} objects in this snapshot. + All threads are iterated first, then all modules. + """ + return self.__ThreadsAndModulesIterator(self) + + # ------------------------------------------------------------------------------ + + def wait(self, dwTimeout=None): + """ + Waits for the process to finish executing. + + @raise WindowsError: On error an exception is raised. + """ + self.get_handle(win32.SYNCHRONIZE).wait(dwTimeout) + + def kill(self, dwExitCode=0): + """ + Terminates the execution of the process. + + @raise WindowsError: On error an exception is raised. + """ + hProcess = self.get_handle(win32.PROCESS_TERMINATE) + win32.TerminateProcess(hProcess, dwExitCode) + + def suspend(self): + """ + Suspends execution on all threads of the process. + + @raise WindowsError: On error an exception is raised. + """ + self.scan_threads() # force refresh the snapshot + suspended = list() + try: + for aThread in self.iter_threads(): + aThread.suspend() + suspended.append(aThread) + except Exception: + for aThread in suspended: + try: + aThread.resume() + except Exception: + pass + raise + + def resume(self): + """ + Resumes execution on all threads of the process. + + @raise WindowsError: On error an exception is raised. + """ + if self.get_thread_count() == 0: + self.scan_threads() # only refresh the snapshot if empty + resumed = list() + try: + for aThread in self.iter_threads(): + aThread.resume() + resumed.append(aThread) + except Exception: + for aThread in resumed: + try: + aThread.suspend() + except Exception: + pass + raise + + def is_debugged(self): + """ + Tries to determine if the process is being debugged by another process. + It may detect other debuggers besides WinAppDbg. + + @rtype: bool + @return: C{True} if the process has a debugger attached. + + @warning: + May return inaccurate results when some anti-debug techniques are + used by the target process. + + @note: To know if a process currently being debugged by a L{Debug} + object, call L{Debug.is_debugee} instead. + """ + # FIXME the MSDN docs don't say what access rights are needed here! + hProcess = self.get_handle(win32.PROCESS_QUERY_INFORMATION) + return win32.CheckRemoteDebuggerPresent(hProcess) + + def is_alive(self): + """ + @rtype: bool + @return: C{True} if the process is currently running. + """ + try: + self.wait(0) + except WindowsError: + e = sys.exc_info()[1] + return e.winerror == win32.WAIT_TIMEOUT + return False + + def get_exit_code(self): + """ + @rtype: int + @return: Process exit code, or C{STILL_ACTIVE} if it's still alive. + + @warning: If a process returns C{STILL_ACTIVE} as it's exit code, + you may not be able to determine if it's active or not with this + method. Use L{is_alive} to check if the process is still active. + Alternatively you can call L{get_handle} to get the handle object + and then L{ProcessHandle.wait} on it to wait until the process + finishes running. + """ + if win32.PROCESS_ALL_ACCESS == win32.PROCESS_ALL_ACCESS_VISTA: + dwAccess = win32.PROCESS_QUERY_LIMITED_INFORMATION + else: + dwAccess = win32.PROCESS_QUERY_INFORMATION + return win32.GetExitCodeProcess(self.get_handle(dwAccess)) + + # ------------------------------------------------------------------------------ + + def scan(self): + """ + Populates the snapshot of threads and modules. + """ + self.scan_threads() + self.scan_modules() + + def clear(self): + """ + Clears the snapshot of threads and modules. + """ + try: + try: + self.clear_threads() + finally: + self.clear_modules() + finally: + self.close_handle() + + # ------------------------------------------------------------------------------ + + # Regular expression to find hexadecimal values of any size. + __hexa_parameter = re.compile("0x[0-9A-Fa-f]+") + + def __fixup_labels(self, disasm): + """ + Private method used when disassembling from process memory. + + It has no return value because the list is modified in place. On return + all raw memory addresses are replaced by labels when possible. + + @type disasm: list of tuple(int, int, str, str) + @param disasm: Output of one of the dissassembly functions. + """ + for index in compat.xrange(len(disasm)): + (address, size, text, dump) = disasm[index] + m = self.__hexa_parameter.search(text) + while m: + s, e = m.span() + value = text[s:e] + try: + label = self.get_label_at_address(int(value, 0x10)) + except Exception: + label = None + if label: + text = text[:s] + label + text[e:] + e = s + len(value) + m = self.__hexa_parameter.search(text, e) + disasm[index] = (address, size, text, dump) + + def disassemble_string(self, lpAddress, code): + """ + Disassemble instructions from a block of binary code. + + @type lpAddress: int + @param lpAddress: Memory address where the code was read from. + + @type code: str + @param code: Binary code to disassemble. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + + @raise NotImplementedError: + No compatible disassembler was found for the current platform. + """ + try: + disasm = self.__disasm + except AttributeError: + disasm = self.__disasm = Disassembler(self.get_arch()) + return disasm.decode(lpAddress, code) + + def disassemble(self, lpAddress, dwSize): + """ + Disassemble instructions from the address space of the process. + + @type lpAddress: int + @param lpAddress: Memory address where to read the code from. + + @type dwSize: int + @param dwSize: Size of binary code to disassemble. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + data = self.read(lpAddress, dwSize) + disasm = self.disassemble_string(lpAddress, data) + self.__fixup_labels(disasm) + return disasm + + # FIXME + # This algorithm really bad, I've got to write a better one :P + def disassemble_around(self, lpAddress, dwSize=64): + """ + Disassemble around the given address. + + @type lpAddress: int + @param lpAddress: Memory address where to read the code from. + + @type dwSize: int + @param dwSize: Delta offset. + Code will be read from lpAddress - dwSize to lpAddress + dwSize. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + dwDelta = int(float(dwSize) / 2.0) + addr_1 = lpAddress - dwDelta + addr_2 = lpAddress + size_1 = dwDelta + size_2 = dwSize - dwDelta + data = self.read(addr_1, dwSize) + data_1 = data[:size_1] + data_2 = data[size_1:] + disasm_1 = self.disassemble_string(addr_1, data_1) + disasm_2 = self.disassemble_string(addr_2, data_2) + disasm = disasm_1 + disasm_2 + self.__fixup_labels(disasm) + return disasm + + def disassemble_around_pc(self, dwThreadId, dwSize=64): + """ + Disassemble around the program counter of the given thread. + + @type dwThreadId: int + @param dwThreadId: Global thread ID. + The program counter for this thread will be used as the disassembly + address. + + @type dwSize: int + @param dwSize: Delta offset. + Code will be read from pc - dwSize to pc + dwSize. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + aThread = self.get_thread(dwThreadId) + return self.disassemble_around(aThread.get_pc(), dwSize) + + def disassemble_instruction(self, lpAddress): + """ + Disassemble the instruction at the given memory address. + + @type lpAddress: int + @param lpAddress: Memory address where to read the code from. + + @rtype: tuple( long, int, str, str ) + @return: The tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + return self.disassemble(lpAddress, 15)[0] + + def disassemble_current(self, dwThreadId): + """ + Disassemble the instruction at the program counter of the given thread. + + @type dwThreadId: int + @param dwThreadId: Global thread ID. + The program counter for this thread will be used as the disassembly + address. + + @rtype: tuple( long, int, str, str ) + @return: The tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + aThread = self.get_thread(dwThreadId) + return self.disassemble_instruction(aThread.get_pc()) + + # ------------------------------------------------------------------------------ + + def flush_instruction_cache(self): + """ + Flush the instruction cache. This is required if the process memory is + modified and one or more threads are executing nearby the modified + memory region. + + @see: U{http://blogs.msdn.com/oldnewthing/archive/2003/12/08/55954.aspx#55958} + + @raise WindowsError: Raises exception on error. + """ + # FIXME + # No idea what access rights are required here! + # Maybe PROCESS_VM_OPERATION ??? + # In any case we're only calling this from the debugger, + # so it should be fine (we already have PROCESS_ALL_ACCESS). + win32.FlushInstructionCache(self.get_handle()) + + def debug_break(self): + """ + Triggers the system breakpoint in the process. + + @raise WindowsError: On error an exception is raised. + """ + # The exception is raised by a new thread. + # When continuing the exception, the thread dies by itself. + # This thread is hidden from the debugger. + win32.DebugBreakProcess(self.get_handle()) + + def is_wow64(self): + """ + Determines if the process is running under WOW64. + + @rtype: bool + @return: + C{True} if the process is running under WOW64. That is, a 32-bit + application running in a 64-bit Windows. + + C{False} if the process is either a 32-bit application running in + a 32-bit Windows, or a 64-bit application running in a 64-bit + Windows. + + @raise WindowsError: On error an exception is raised. + + @see: U{http://msdn.microsoft.com/en-us/library/aa384249(VS.85).aspx} + """ + try: + wow64 = self.__wow64 + except AttributeError: + if win32.bits == 32 and not win32.wow64: + wow64 = False + else: + if win32.PROCESS_ALL_ACCESS == win32.PROCESS_ALL_ACCESS_VISTA: + dwAccess = win32.PROCESS_QUERY_LIMITED_INFORMATION + else: + dwAccess = win32.PROCESS_QUERY_INFORMATION + hProcess = self.get_handle(dwAccess) + try: + wow64 = win32.IsWow64Process(hProcess) + except AttributeError: + wow64 = False + self.__wow64 = wow64 + return wow64 + + def get_arch(self): + """ + @rtype: str + @return: The architecture in which this process believes to be running. + For example, if running a 32 bit binary in a 64 bit machine, the + architecture returned by this method will be L{win32.ARCH_I386}, + but the value of L{System.arch} will be L{win32.ARCH_AMD64}. + """ + + # Are we in a 32 bit machine? + if win32.bits == 32 and not win32.wow64: + return win32.arch + + # Is the process outside of WOW64? + if not self.is_wow64(): + return win32.arch + + # In WOW64, "amd64" becomes "i386". + if win32.arch == win32.ARCH_AMD64: + return win32.ARCH_I386 + + # We don't know the translation for other architectures. + raise NotImplementedError() + + def get_bits(self): + """ + @rtype: str + @return: The number of bits in which this process believes to be + running. For example, if running a 32 bit binary in a 64 bit + machine, the number of bits returned by this method will be C{32}, + but the value of L{System.arch} will be C{64}. + """ + + # Are we in a 32 bit machine? + if win32.bits == 32 and not win32.wow64: + # All processes are 32 bits. + return 32 + + # Is the process inside WOW64? + if self.is_wow64(): + # The process is 32 bits. + return 32 + + # The process is 64 bits. + return 64 + + # TODO: get_os, to test compatibility run + # See: http://msdn.microsoft.com/en-us/library/windows/desktop/ms683224(v=vs.85).aspx + + # ------------------------------------------------------------------------------ + + def get_start_time(self): + """ + Determines when has this process started running. + + @rtype: win32.SYSTEMTIME + @return: Process start time. + """ + if win32.PROCESS_ALL_ACCESS == win32.PROCESS_ALL_ACCESS_VISTA: + dwAccess = win32.PROCESS_QUERY_LIMITED_INFORMATION + else: + dwAccess = win32.PROCESS_QUERY_INFORMATION + hProcess = self.get_handle(dwAccess) + CreationTime = win32.GetProcessTimes(hProcess)[0] + return win32.FileTimeToSystemTime(CreationTime) + + def get_exit_time(self): + """ + Determines when has this process finished running. + If the process is still alive, the current time is returned instead. + + @rtype: win32.SYSTEMTIME + @return: Process exit time. + """ + if self.is_alive(): + ExitTime = win32.GetSystemTimeAsFileTime() + else: + if win32.PROCESS_ALL_ACCESS == win32.PROCESS_ALL_ACCESS_VISTA: + dwAccess = win32.PROCESS_QUERY_LIMITED_INFORMATION + else: + dwAccess = win32.PROCESS_QUERY_INFORMATION + hProcess = self.get_handle(dwAccess) + ExitTime = win32.GetProcessTimes(hProcess)[1] + return win32.FileTimeToSystemTime(ExitTime) + + def get_running_time(self): + """ + Determines how long has this process been running. + + @rtype: long + @return: Process running time in milliseconds. + """ + if win32.PROCESS_ALL_ACCESS == win32.PROCESS_ALL_ACCESS_VISTA: + dwAccess = win32.PROCESS_QUERY_LIMITED_INFORMATION + else: + dwAccess = win32.PROCESS_QUERY_INFORMATION + hProcess = self.get_handle(dwAccess) + (CreationTime, ExitTime, _, _) = win32.GetProcessTimes(hProcess) + if self.is_alive(): + ExitTime = win32.GetSystemTimeAsFileTime() + CreationTime = CreationTime.dwLowDateTime + (CreationTime.dwHighDateTime << 32) + ExitTime = ExitTime.dwLowDateTime + (ExitTime.dwHighDateTime << 32) + RunningTime = ExitTime - CreationTime + return RunningTime / 10000 # 100 nanoseconds steps => milliseconds + + # ------------------------------------------------------------------------------ + + def __load_System_class(self): + global System # delayed import + if System is None: + from system import System + + def get_services(self): + """ + Retrieves the list of system services that are currently running in + this process. + + @see: L{System.get_services} + + @rtype: list( L{win32.ServiceStatusProcessEntry} ) + @return: List of service status descriptors. + """ + self.__load_System_class() + pid = self.get_pid() + return [d for d in System.get_active_services() if d.ProcessId == pid] + + # ------------------------------------------------------------------------------ + + def get_dep_policy(self): + """ + Retrieves the DEP (Data Execution Prevention) policy for this process. + + @note: This method is only available in Windows XP SP3 and above, and + only for 32 bit processes. It will fail in any other circumstance. + + @see: U{http://msdn.microsoft.com/en-us/library/bb736297(v=vs.85).aspx} + + @rtype: tuple(int, int) + @return: + The first member of the tuple is the DEP flags. It can be a + combination of the following values: + - 0: DEP is disabled for this process. + - 1: DEP is enabled for this process. (C{PROCESS_DEP_ENABLE}) + - 2: DEP-ATL thunk emulation is disabled for this process. + (C{PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION}) + + The second member of the tuple is the permanent flag. If C{TRUE} + the DEP settings cannot be changed in runtime for this process. + + @raise WindowsError: On error an exception is raised. + """ + hProcess = self.get_handle(win32.PROCESS_QUERY_INFORMATION) + try: + return win32.kernel32.GetProcessDEPPolicy(hProcess) + except AttributeError: + msg = "This method is only available in Windows XP SP3 and above." + raise NotImplementedError(msg) + + # ------------------------------------------------------------------------------ + + def get_peb(self): + """ + Returns a copy of the PEB. + To dereference pointers in it call L{Process.read_structure}. + + @rtype: L{win32.PEB} + @return: PEB structure. + @raise WindowsError: An exception is raised on error. + """ + self.get_handle(win32.PROCESS_VM_READ | win32.PROCESS_QUERY_INFORMATION) + return self.read_structure(self.get_peb_address(), win32.PEB) + + def get_peb_address(self): + """ + Returns a remote pointer to the PEB. + + @rtype: int + @return: Remote pointer to the L{win32.PEB} structure. + Returns C{None} on error. + """ + try: + return self._peb_ptr + except AttributeError: + hProcess = self.get_handle(win32.PROCESS_QUERY_INFORMATION) + pbi = win32.NtQueryInformationProcess(hProcess, win32.ProcessBasicInformation) + address = pbi.PebBaseAddress + self._peb_ptr = address + return address + + def get_entry_point(self): + """ + Alias to C{process.get_main_module().get_entry_point()}. + + @rtype: int + @return: Address of the entry point of the main module. + """ + return self.get_main_module().get_entry_point() + + def get_main_module(self): + """ + @rtype: L{Module} + @return: Module object for the process main module. + """ + return self.get_module(self.get_image_base()) + + def get_image_base(self): + """ + @rtype: int + @return: Image base address for the process main module. + """ + return self.get_peb().ImageBaseAddress + + def get_image_name(self): + """ + @rtype: int + @return: Filename of the process main module. + + This method does it's best to retrieve the filename. + However sometimes this is not possible, so C{None} may + be returned instead. + """ + + # Method 1: Module.fileName + # It's cached if the filename was already found by the other methods, + # if it came with the corresponding debug event, or it was found by the + # toolhelp API. + mainModule = None + try: + mainModule = self.get_main_module() + name = mainModule.fileName + if not name: + name = None + except (KeyError, AttributeError, WindowsError): + ## traceback.print_exc() # XXX DEBUG + name = None + + # Method 2: QueryFullProcessImageName() + # Not implemented until Windows Vista. + if not name: + try: + hProcess = self.get_handle(win32.PROCESS_QUERY_LIMITED_INFORMATION) + name = win32.QueryFullProcessImageName(hProcess) + except (AttributeError, WindowsError): + ## traceback.print_exc() # XXX DEBUG + name = None + + # Method 3: GetProcessImageFileName() + # + # Not implemented until Windows XP. + # For more info see: + # https://voidnish.wordpress.com/2005/06/20/getprocessimagefilenamequerydosdevice-trivia/ + if not name: + try: + hProcess = self.get_handle(win32.PROCESS_QUERY_INFORMATION) + name = win32.GetProcessImageFileName(hProcess) + if name: + name = PathOperations.native_to_win32_pathname(name) + else: + name = None + except (AttributeError, WindowsError): + ## traceback.print_exc() # XXX DEBUG + if not name: + name = None + + # Method 4: GetModuleFileNameEx() + # Not implemented until Windows 2000. + # + # May be spoofed by malware, since this information resides + # in usermode space (see http://www.ragestorm.net/blogs/?p=163). + if not name: + try: + hProcess = self.get_handle(win32.PROCESS_VM_READ | win32.PROCESS_QUERY_INFORMATION) + try: + name = win32.GetModuleFileNameEx(hProcess) + except WindowsError: + ## traceback.print_exc() # XXX DEBUG + name = win32.GetModuleFileNameEx(hProcess, self.get_image_base()) + if name: + name = PathOperations.native_to_win32_pathname(name) + else: + name = None + except (AttributeError, WindowsError): + ## traceback.print_exc() # XXX DEBUG + if not name: + name = None + + # Method 5: PEB.ProcessParameters->ImagePathName + # + # May fail since it's using an undocumented internal structure. + # + # May be spoofed by malware, since this information resides + # in usermode space (see http://www.ragestorm.net/blogs/?p=163). + if not name: + try: + peb = self.get_peb() + pp = self.read_structure(peb.ProcessParameters, win32.RTL_USER_PROCESS_PARAMETERS) + s = pp.ImagePathName + name = self.peek_string(s.Buffer, dwMaxSize=s.MaximumLength, fUnicode=True) + if name: + name = PathOperations.native_to_win32_pathname(name) + else: + name = None + except (AttributeError, WindowsError): + ## traceback.print_exc() # XXX DEBUG + name = None + + # Method 6: Module.get_filename() + # It tries to get the filename from the file handle. + # + # There are currently some problems due to the strange way the API + # works - it returns the pathname without the drive letter, and I + # couldn't figure out a way to fix it. + if not name and mainModule is not None: + try: + name = mainModule.get_filename() + if not name: + name = None + except (AttributeError, WindowsError): + ## traceback.print_exc() # XXX DEBUG + name = None + + # Remember the filename. + if name and mainModule is not None: + mainModule.fileName = name + + # Return the image filename, or None on error. + return name + + def get_command_line_block(self): + """ + Retrieves the command line block memory address and size. + + @rtype: tuple(int, int) + @return: Tuple with the memory address of the command line block + and it's maximum size in Unicode characters. + + @raise WindowsError: On error an exception is raised. + """ + peb = self.get_peb() + pp = self.read_structure(peb.ProcessParameters, win32.RTL_USER_PROCESS_PARAMETERS) + s = pp.CommandLine + return (s.Buffer, s.MaximumLength) + + def get_environment_block(self): + """ + Retrieves the environment block memory address for the process. + + @note: The size is always enough to contain the environment data, but + it may not be an exact size. It's best to read the memory and + scan for two null wide chars to find the actual size. + + @rtype: tuple(int, int) + @return: Tuple with the memory address of the environment block + and it's size. + + @raise WindowsError: On error an exception is raised. + """ + peb = self.get_peb() + pp = self.read_structure(peb.ProcessParameters, win32.RTL_USER_PROCESS_PARAMETERS) + Environment = pp.Environment + try: + EnvironmentSize = pp.EnvironmentSize + except AttributeError: + mbi = self.mquery(Environment) + EnvironmentSize = mbi.RegionSize + mbi.BaseAddress - Environment + return (Environment, EnvironmentSize) + + def get_command_line(self): + """ + Retrieves the command line with wich the program was started. + + @rtype: str + @return: Command line string. + + @raise WindowsError: On error an exception is raised. + """ + (Buffer, MaximumLength) = self.get_command_line_block() + CommandLine = self.peek_string(Buffer, dwMaxSize=MaximumLength, fUnicode=True) + gst = win32.GuessStringType + if gst.t_default == gst.t_ansi: + CommandLine = CommandLine.encode("cp1252") + return CommandLine + + def get_environment_variables(self): + """ + Retrieves the environment variables with wich the program is running. + + @rtype: list of tuple(compat.unicode, compat.unicode) + @return: Environment keys and values as found in the process memory. + + @raise WindowsError: On error an exception is raised. + """ + + # Note: the first bytes are garbage and must be skipped. Then the first + # two environment entries are the current drive and directory as key + # and value pairs, followed by the ExitCode variable (it's what batch + # files know as "errorlevel"). After that, the real environment vars + # are there in alphabetical order. In theory that's where it stops, + # but I've always seen one more "variable" tucked at the end which + # may be another environment block but in ANSI. I haven't examined it + # yet, I'm just skipping it because if it's parsed as Unicode it just + # renders garbage. + + # Read the environment block contents. + data = self.peek(*self.get_environment_block()) + + # Put them into a Unicode buffer. + tmp = ctypes.create_string_buffer(data) + buffer = ctypes.create_unicode_buffer(len(data)) + ctypes.memmove(buffer, tmp, len(data)) + del tmp + + # Skip until the first Unicode null char is found. + pos = 0 + while buffer[pos] != "\0": + pos += 1 + pos += 1 + + # Loop for each environment variable... + environment = [] + while buffer[pos] != "\0": + # Until we find a null char... + env_name_pos = pos + env_name = "" + found_name = False + while buffer[pos] != "\0": + # Get the current char. + char = buffer[pos] + + # Is it an equal sign? + if char == "=": + # Skip leading equal signs. + if env_name_pos == pos: + env_name_pos += 1 + pos += 1 + continue + + # Otherwise we found the separator equal sign. + pos += 1 + found_name = True + break + + # Add the char to the variable name. + env_name += char + + # Next char. + pos += 1 + + # If the name was not parsed properly, stop. + if not found_name: + break + + # Read the variable value until we find a null char. + env_value = "" + while buffer[pos] != "\0": + env_value += buffer[pos] + pos += 1 + + # Skip the null char. + pos += 1 + + # Add to the list of environment variables found. + environment.append((env_name, env_value)) + + # Remove the last entry, it's garbage. + if environment: + environment.pop() + + # Return the environment variables. + return environment + + def get_environment_data(self, fUnicode=None): + """ + Retrieves the environment block data with wich the program is running. + + @warn: Deprecated since WinAppDbg 1.5. + + @see: L{win32.GuessStringType} + + @type fUnicode: bool or None + @param fUnicode: C{True} to return a list of Unicode strings, C{False} + to return a list of ANSI strings, or C{None} to return whatever + the default is for string types. + + @rtype: list of str + @return: Environment keys and values separated by a (C{=}) character, + as found in the process memory. + + @raise WindowsError: On error an exception is raised. + """ + + # Issue a deprecation warning. + warnings.warn("Process.get_environment_data() is deprecated" " since WinAppDbg 1.5.", DeprecationWarning) + + # Get the environment variables. + block = [key + "=" + value for (key, value) in self.get_environment_variables()] + + # Convert the data to ANSI if requested. + if fUnicode is None: + gst = win32.GuessStringType + fUnicode = gst.t_default == gst.t_unicode + if not fUnicode: + block = [x.encode("cp1252") for x in block] + + # Return the environment data. + return block + + @staticmethod + def parse_environment_data(block): + """ + Parse the environment block into a Python dictionary. + + @warn: Deprecated since WinAppDbg 1.5. + + @note: Values of duplicated keys are joined using null characters. + + @type block: list of str + @param block: List of strings as returned by L{get_environment_data}. + + @rtype: dict(str S{->} str) + @return: Dictionary of environment keys and values. + """ + + # Issue a deprecation warning. + warnings.warn("Process.parse_environment_data() is deprecated" " since WinAppDbg 1.5.", DeprecationWarning) + + # Create an empty environment dictionary. + environment = dict() + + # End here if the environment block is empty. + if not block: + return environment + + # Prepare the tokens (ANSI or Unicode). + gst = win32.GuessStringType + if type(block[0]) == gst.t_ansi: + equals = "=" + terminator = "\0" + else: + equals = "=" + terminator = "\0" + + # Split the blocks into key/value pairs. + for chunk in block: + sep = chunk.find(equals, 1) + if sep < 0: + ## raise Exception() + continue # corrupted environment block? + key, value = chunk[:sep], chunk[sep + 1 :] + + # For duplicated keys, append the value. + # Values are separated using null terminators. + if key not in environment: + environment[key] = value + else: + environment[key] += terminator + value + + # Return the environment dictionary. + return environment + + def get_environment(self, fUnicode=None): + """ + Retrieves the environment with wich the program is running. + + @note: Duplicated keys are joined using null characters. + To avoid this behavior, call L{get_environment_variables} instead + and convert the results to a dictionary directly, like this: + C{dict(process.get_environment_variables())} + + @see: L{win32.GuessStringType} + + @type fUnicode: bool or None + @param fUnicode: C{True} to return a list of Unicode strings, C{False} + to return a list of ANSI strings, or C{None} to return whatever + the default is for string types. + + @rtype: dict(str S{->} str) + @return: Dictionary of environment keys and values. + + @raise WindowsError: On error an exception is raised. + """ + + # Get the environment variables. + variables = self.get_environment_variables() + + # Convert the strings to ANSI if requested. + if fUnicode is None: + gst = win32.GuessStringType + fUnicode = gst.t_default == gst.t_unicode + if not fUnicode: + variables = [(key.encode("cp1252"), value.encode("cp1252")) for (key, value) in variables] + + # Add the variables to a dictionary, concatenating duplicates. + environment = dict() + for key, value in variables: + if key in environment: + environment[key] = environment[key] + "\0" + value + else: + environment[key] = value + + # Return the dictionary. + return environment + + # ------------------------------------------------------------------------------ + + def search(self, pattern, minAddr=None, maxAddr=None): + """ + Search for the given pattern within the process memory. + + @type pattern: str, compat.unicode or L{Pattern} + @param pattern: Pattern to search for. + It may be a byte string, a Unicode string, or an instance of + L{Pattern}. + + The following L{Pattern} subclasses are provided by WinAppDbg: + - L{BytePattern} + - L{TextPattern} + - L{RegExpPattern} + - L{HexPattern} + + You can also write your own subclass of L{Pattern} for customized + searches. + + @type minAddr: int + @param minAddr: (Optional) Start the search at this memory address. + + @type maxAddr: int + @param maxAddr: (Optional) Stop the search at this memory address. + + @rtype: iterator of tuple( int, int, str ) + @return: An iterator of tuples. Each tuple contains the following: + - The memory address where the pattern was found. + - The size of the data that matches the pattern. + - The data that matches the pattern. + + @raise WindowsError: An error occurred when querying or reading the + process memory. + """ + if isinstance(pattern, str): + return self.search_bytes(pattern, minAddr, maxAddr) + if isinstance(pattern, compat.unicode): + return self.search_bytes(pattern.encode("utf-16le"), minAddr, maxAddr) + if isinstance(pattern, Pattern): + return Search.search_process(self, pattern, minAddr, maxAddr) + raise TypeError("Unknown pattern type: %r" % type(pattern)) + + def search_bytes(self, bytes, minAddr=None, maxAddr=None): + """ + Search for the given byte pattern within the process memory. + + @type bytes: str + @param bytes: Bytes to search for. + + @type minAddr: int + @param minAddr: (Optional) Start the search at this memory address. + + @type maxAddr: int + @param maxAddr: (Optional) Stop the search at this memory address. + + @rtype: iterator of int + @return: An iterator of memory addresses where the pattern was found. + + @raise WindowsError: An error occurred when querying or reading the + process memory. + """ + pattern = BytePattern(bytes) + matches = Search.search_process(self, pattern, minAddr, maxAddr) + for addr, size, data in matches: + yield addr + + def search_text(self, text, encoding="utf-16le", caseSensitive=False, minAddr=None, maxAddr=None): + """ + Search for the given text within the process memory. + + @type text: str or compat.unicode + @param text: Text to search for. + + @type encoding: str + @param encoding: (Optional) Encoding for the text parameter. + Only used when the text to search for is a Unicode string. + Don't change unless you know what you're doing! + + @type caseSensitive: bool + @param caseSensitive: C{True} of the search is case sensitive, + C{False} otherwise. + + @type minAddr: int + @param minAddr: (Optional) Start the search at this memory address. + + @type maxAddr: int + @param maxAddr: (Optional) Stop the search at this memory address. + + @rtype: iterator of tuple( int, str ) + @return: An iterator of tuples. Each tuple contains the following: + - The memory address where the pattern was found. + - The text that matches the pattern. + + @raise WindowsError: An error occurred when querying or reading the + process memory. + """ + pattern = TextPattern(text, encoding, caseSensitive) + matches = Search.search_process(self, pattern, minAddr, maxAddr) + for addr, size, data in matches: + yield addr, data + + def search_regexp(self, regexp, flags=0, minAddr=None, maxAddr=None, bufferPages=-1): + """ + Search for the given regular expression within the process memory. + + @type regexp: str + @param regexp: Regular expression string. + + @type flags: int + @param flags: Regular expression flags. + + @type minAddr: int + @param minAddr: (Optional) Start the search at this memory address. + + @type maxAddr: int + @param maxAddr: (Optional) Stop the search at this memory address. + + @type bufferPages: int + @param bufferPages: (Optional) Number of memory pages to buffer when + performing the search. Valid values are: + - C{0} or C{None}: + Automatically determine the required buffer size. May not give + complete results for regular expressions that match variable + sized strings. + - C{> 0}: Set the buffer size, in memory pages. + - C{< 0}: Disable buffering entirely. This may give you a little + speed gain at the cost of an increased memory usage. If the + target process has very large contiguous memory regions it may + actually be slower or even fail. It's also the only way to + guarantee complete results for regular expressions that match + variable sized strings. + + @rtype: iterator of tuple( int, int, str ) + @return: An iterator of tuples. Each tuple contains the following: + - The memory address where the pattern was found. + - The size of the data that matches the pattern. + - The data that matches the pattern. + + @raise WindowsError: An error occurred when querying or reading the + process memory. + """ + pattern = RegExpPattern(regexp, flags) + return Search.search_process(self, pattern, minAddr, maxAddr, bufferPages) + + def search_hexa(self, hexa, minAddr=None, maxAddr=None): + """ + Search for the given hexadecimal pattern within the process memory. + + Hex patterns must be in this form:: + "68 65 6c 6c 6f 20 77 6f 72 6c 64" # "hello world" + + Spaces are optional. Capitalization of hex digits doesn't matter. + This is exactly equivalent to the previous example:: + "68656C6C6F20776F726C64" # "hello world" + + Wildcards are allowed, in the form of a C{?} sign in any hex digit:: + "5? 5? c3" # pop register / pop register / ret + "b8 ?? ?? ?? ??" # mov eax, immediate value + + @type hexa: str + @param hexa: Pattern to search for. + + @type minAddr: int + @param minAddr: (Optional) Start the search at this memory address. + + @type maxAddr: int + @param maxAddr: (Optional) Stop the search at this memory address. + + @rtype: iterator of tuple( int, str ) + @return: An iterator of tuples. Each tuple contains the following: + - The memory address where the pattern was found. + - The bytes that match the pattern. + + @raise WindowsError: An error occurred when querying or reading the + process memory. + """ + pattern = HexPattern(hexa) + matches = Search.search_process(self, pattern, minAddr, maxAddr) + for addr, size, data in matches: + yield addr, data + + def strings(self, minSize=4, maxSize=1024): + """ + Extract ASCII strings from the process memory. + + @type minSize: int + @param minSize: (Optional) Minimum size of the strings to search for. + + @type maxSize: int + @param maxSize: (Optional) Maximum size of the strings to search for. + + @rtype: iterator of tuple(int, int, str) + @return: Iterator of strings extracted from the process memory. + Each tuple contains the following: + - The memory address where the string was found. + - The size of the string. + - The string. + """ + return Search.extract_ascii_strings(self, minSize=minSize, maxSize=maxSize) + + # ------------------------------------------------------------------------------ + + def __read_c_type(self, address, format, c_type): + size = ctypes.sizeof(c_type) + packed = self.read(address, size) + if len(packed) != size: + raise ctypes.WinError() + return struct.unpack(format, packed)[0] + + def __write_c_type(self, address, format, unpacked): + packed = struct.pack("@L", unpacked) + self.write(address, packed) + + # XXX TODO + # + Maybe change page permissions before trying to read? + def read(self, lpBaseAddress, nSize): + """ + Reads from the memory of the process. + + @see: L{peek} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @type nSize: int + @param nSize: Number of bytes to read. + + @rtype: str + @return: Bytes read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + hProcess = self.get_handle(win32.PROCESS_VM_READ | win32.PROCESS_QUERY_INFORMATION) + if not self.is_buffer(lpBaseAddress, nSize): + raise ctypes.WinError(win32.ERROR_INVALID_ADDRESS) + data = win32.ReadProcessMemory(hProcess, lpBaseAddress, nSize) + if len(data) != nSize: + raise ctypes.WinError() + return data + + def write(self, lpBaseAddress, lpBuffer): + """ + Writes to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type lpBuffer: str + @param lpBuffer: Bytes to write. + + @raise WindowsError: On error an exception is raised. + """ + r = self.poke(lpBaseAddress, lpBuffer) + if r != len(lpBuffer): + raise ctypes.WinError() + + def read_char(self, lpBaseAddress): + """ + Reads a single character to the memory of the process. + + @see: L{peek_char} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @rtype: int + @return: Character value read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + return ord(self.read(lpBaseAddress, 1)) + + def write_char(self, lpBaseAddress, char): + """ + Writes a single character to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke_char} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type char: int + @param char: Character to write. + + @raise WindowsError: On error an exception is raised. + """ + self.write(lpBaseAddress, chr(char)) + + def read_int(self, lpBaseAddress): + """ + Reads a signed integer from the memory of the process. + + @see: L{peek_int} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + return self.__read_c_type(lpBaseAddress, compat.b("@l"), ctypes.c_int) + + def write_int(self, lpBaseAddress, unpackedValue): + """ + Writes a signed integer to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke_int} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @raise WindowsError: On error an exception is raised. + """ + self.__write_c_type(lpBaseAddress, "@l", unpackedValue) + + def read_uint(self, lpBaseAddress): + """ + Reads an unsigned integer from the memory of the process. + + @see: L{peek_uint} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + return self.__read_c_type(lpBaseAddress, "@L", ctypes.c_uint) + + def write_uint(self, lpBaseAddress, unpackedValue): + """ + Writes an unsigned integer to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke_uint} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @raise WindowsError: On error an exception is raised. + """ + self.__write_c_type(lpBaseAddress, "@L", unpackedValue) + + def read_float(self, lpBaseAddress): + """ + Reads a float from the memory of the process. + + @see: L{peek_float} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Floating point value read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + return self.__read_c_type(lpBaseAddress, "@f", ctypes.c_float) + + def write_float(self, lpBaseAddress, unpackedValue): + """ + Writes a float to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke_float} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Floating point value to write. + + @raise WindowsError: On error an exception is raised. + """ + self.__write_c_type(lpBaseAddress, "@f", unpackedValue) + + def read_double(self, lpBaseAddress): + """ + Reads a double from the memory of the process. + + @see: L{peek_double} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Floating point value read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + return self.__read_c_type(lpBaseAddress, "@d", ctypes.c_double) + + def write_double(self, lpBaseAddress, unpackedValue): + """ + Writes a double to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke_double} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Floating point value to write. + + @raise WindowsError: On error an exception is raised. + """ + self.__write_c_type(lpBaseAddress, "@d", unpackedValue) + + def read_pointer(self, lpBaseAddress): + """ + Reads a pointer value from the memory of the process. + + @see: L{peek_pointer} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Pointer value read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + return self.__read_c_type(lpBaseAddress, "@P", ctypes.c_void_p) + + def write_pointer(self, lpBaseAddress, unpackedValue): + """ + Writes a pointer value to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke_pointer} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @raise WindowsError: On error an exception is raised. + """ + self.__write_c_type(lpBaseAddress, "@P", unpackedValue) + + def read_dword(self, lpBaseAddress): + """ + Reads a DWORD from the memory of the process. + + @see: L{peek_dword} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + return self.__read_c_type(lpBaseAddress, "=L", win32.DWORD) + + def write_dword(self, lpBaseAddress, unpackedValue): + """ + Writes a DWORD to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke_dword} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @raise WindowsError: On error an exception is raised. + """ + self.__write_c_type(lpBaseAddress, "=L", unpackedValue) + + def read_qword(self, lpBaseAddress): + """ + Reads a QWORD from the memory of the process. + + @see: L{peek_qword} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + return self.__read_c_type(lpBaseAddress, "=Q", win32.QWORD) + + def write_qword(self, lpBaseAddress, unpackedValue): + """ + Writes a QWORD to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{poke_qword} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @raise WindowsError: On error an exception is raised. + """ + self.__write_c_type(lpBaseAddress, "=Q", unpackedValue) + + def read_structure(self, lpBaseAddress, stype): + """ + Reads a ctypes structure from the memory of the process. + + @see: L{read} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @type stype: class ctypes.Structure or a subclass. + @param stype: Structure definition. + + @rtype: int + @return: Structure instance filled in with data + read from the process memory. + + @raise WindowsError: On error an exception is raised. + """ + if type(lpBaseAddress) not in (type(0), type(long(0))): + lpBaseAddress = ctypes.cast(lpBaseAddress, ctypes.c_void_p) + data = self.read(lpBaseAddress, ctypes.sizeof(stype)) + buff = ctypes.create_string_buffer(data) + ptr = ctypes.cast(ctypes.pointer(buff), ctypes.POINTER(stype)) + return ptr.contents + + # XXX TODO + ## def write_structure(self, lpBaseAddress, sStructure): + ## """ + ## Writes a ctypes structure into the memory of the process. + ## + ## @note: Page permissions may be changed temporarily while writing. + ## + ## @see: L{write} + ## + ## @type lpBaseAddress: int + ## @param lpBaseAddress: Memory address to begin writing. + ## + ## @type sStructure: ctypes.Structure or a subclass' instance. + ## @param sStructure: Structure definition. + ## + ## @rtype: int + ## @return: Structure instance filled in with data + ## read from the process memory. + ## + ## @raise WindowsError: On error an exception is raised. + ## """ + ## size = ctypes.sizeof(sStructure) + ## data = ctypes.create_string_buffer("", size = size) + ## win32.CopyMemory(ctypes.byref(data), ctypes.byref(sStructure), size) + ## self.write(lpBaseAddress, data.raw) + + def read_string(self, lpBaseAddress, nChars, fUnicode=False): + """ + Reads an ASCII or Unicode string + from the address space of the process. + + @see: L{peek_string} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @type nChars: int + @param nChars: String length to read, in characters. + Remember that Unicode strings have two byte characters. + + @type fUnicode: bool + @param fUnicode: C{True} is the string is expected to be Unicode, + C{False} if it's expected to be ANSI. + + @rtype: str, compat.unicode + @return: String read from the process memory space. + + @raise WindowsError: On error an exception is raised. + """ + if fUnicode: + nChars = nChars * 2 + szString = self.read(lpBaseAddress, nChars) + if fUnicode: + szString = compat.unicode(szString, "U16", "ignore") + return szString + + # ------------------------------------------------------------------------------ + + # FIXME this won't work properly with a different endianness! + def __peek_c_type(self, address, format, c_type): + size = ctypes.sizeof(c_type) + packed = self.peek(address, size) + if len(packed) < size: + packed = "\0" * (size - len(packed)) + packed + elif len(packed) > size: + packed = packed[:size] + return struct.unpack(format, packed)[0] + + def __poke_c_type(self, address, format, unpacked): + packed = struct.pack("@L", unpacked) + return self.poke(address, packed) + + def peek(self, lpBaseAddress, nSize): + """ + Reads the memory of the process. + + @see: L{read} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @type nSize: int + @param nSize: Number of bytes to read. + + @rtype: str + @return: Bytes read from the process memory. + Returns an empty string on error. + """ + # XXX TODO + # + Maybe change page permissions before trying to read? + # + Maybe use mquery instead of get_memory_map? + # (less syscalls if we break out of the loop earlier) + data = "" + if nSize > 0: + try: + hProcess = self.get_handle(win32.PROCESS_VM_READ | win32.PROCESS_QUERY_INFORMATION) + for mbi in self.get_memory_map(lpBaseAddress, lpBaseAddress + nSize): + if not mbi.is_readable(): + nSize = mbi.BaseAddress - lpBaseAddress + break + if nSize > 0: + data = win32.ReadProcessMemory(hProcess, lpBaseAddress, nSize) + except WindowsError: + e = sys.exc_info()[1] + msg = "Error reading process %d address %s: %s" + msg %= (self.get_pid(), HexDump.address(lpBaseAddress), e.strerror) + warnings.warn(msg) + return data + + def poke(self, lpBaseAddress, lpBuffer): + """ + Writes to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type lpBuffer: str + @param lpBuffer: Bytes to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + assert isinstance(lpBuffer, compat.bytes) + hProcess = self.get_handle(win32.PROCESS_VM_WRITE | win32.PROCESS_VM_OPERATION | win32.PROCESS_QUERY_INFORMATION) + mbi = self.mquery(lpBaseAddress) + if not mbi.has_content(): + raise ctypes.WinError(win32.ERROR_INVALID_ADDRESS) + if mbi.is_image() or mbi.is_mapped(): + prot = win32.PAGE_WRITECOPY + elif mbi.is_writeable(): + prot = None + elif mbi.is_executable(): + prot = win32.PAGE_EXECUTE_READWRITE + else: + prot = win32.PAGE_READWRITE + if prot is not None: + try: + self.mprotect(lpBaseAddress, len(lpBuffer), prot) + except Exception: + prot = None + msg = "Failed to adjust page permissions" " for process %s at address %s: %s" + msg = msg % (self.get_pid(), HexDump.address(lpBaseAddress, self.get_bits()), traceback.format_exc()) + warnings.warn(msg, RuntimeWarning) + try: + r = win32.WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer) + finally: + if prot is not None: + self.mprotect(lpBaseAddress, len(lpBuffer), mbi.Protect) + return r + + def peek_char(self, lpBaseAddress): + """ + Reads a single character from the memory of the process. + + @see: L{read_char} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Character read from the process memory. + Returns zero on error. + """ + char = self.peek(lpBaseAddress, 1) + if char: + return ord(char) + return 0 + + def poke_char(self, lpBaseAddress, char): + """ + Writes a single character to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write_char} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type char: str + @param char: Character to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + return self.poke(lpBaseAddress, chr(char)) + + def peek_int(self, lpBaseAddress): + """ + Reads a signed integer from the memory of the process. + + @see: L{read_int} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + Returns zero on error. + """ + return self.__peek_c_type(lpBaseAddress, "@l", ctypes.c_int) + + def poke_int(self, lpBaseAddress, unpackedValue): + """ + Writes a signed integer to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write_int} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + return self.__poke_c_type(lpBaseAddress, "@l", unpackedValue) + + def peek_uint(self, lpBaseAddress): + """ + Reads an unsigned integer from the memory of the process. + + @see: L{read_uint} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + Returns zero on error. + """ + return self.__peek_c_type(lpBaseAddress, "@L", ctypes.c_uint) + + def poke_uint(self, lpBaseAddress, unpackedValue): + """ + Writes an unsigned integer to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write_uint} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + return self.__poke_c_type(lpBaseAddress, "@L", unpackedValue) + + def peek_float(self, lpBaseAddress): + """ + Reads a float from the memory of the process. + + @see: L{read_float} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + Returns zero on error. + """ + return self.__peek_c_type(lpBaseAddress, "@f", ctypes.c_float) + + def poke_float(self, lpBaseAddress, unpackedValue): + """ + Writes a float to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write_float} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + return self.__poke_c_type(lpBaseAddress, "@f", unpackedValue) + + def peek_double(self, lpBaseAddress): + """ + Reads a double from the memory of the process. + + @see: L{read_double} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + Returns zero on error. + """ + return self.__peek_c_type(lpBaseAddress, "@d", ctypes.c_double) + + def poke_double(self, lpBaseAddress, unpackedValue): + """ + Writes a double to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write_double} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + return self.__poke_c_type(lpBaseAddress, "@d", unpackedValue) + + def peek_dword(self, lpBaseAddress): + """ + Reads a DWORD from the memory of the process. + + @see: L{read_dword} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + Returns zero on error. + """ + return self.__peek_c_type(lpBaseAddress, "=L", win32.DWORD) + + def poke_dword(self, lpBaseAddress, unpackedValue): + """ + Writes a DWORD to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write_dword} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + return self.__poke_c_type(lpBaseAddress, "=L", unpackedValue) + + def peek_qword(self, lpBaseAddress): + """ + Reads a QWORD from the memory of the process. + + @see: L{read_qword} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Integer value read from the process memory. + Returns zero on error. + """ + return self.__peek_c_type(lpBaseAddress, "=Q", win32.QWORD) + + def poke_qword(self, lpBaseAddress, unpackedValue): + """ + Writes a QWORD to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write_qword} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + return self.__poke_c_type(lpBaseAddress, "=Q", unpackedValue) + + def peek_pointer(self, lpBaseAddress): + """ + Reads a pointer value from the memory of the process. + + @see: L{read_pointer} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @rtype: int + @return: Pointer value read from the process memory. + Returns zero on error. + """ + return self.__peek_c_type(lpBaseAddress, "@P", ctypes.c_void_p) + + def poke_pointer(self, lpBaseAddress, unpackedValue): + """ + Writes a pointer value to the memory of the process. + + @note: Page permissions may be changed temporarily while writing. + + @see: L{write_pointer} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin writing. + + @type unpackedValue: int, long + @param unpackedValue: Value to write. + + @rtype: int + @return: Number of bytes written. + May be less than the number of bytes to write. + """ + return self.__poke_c_type(lpBaseAddress, "@P", unpackedValue) + + def peek_string(self, lpBaseAddress, fUnicode=False, dwMaxSize=0x1000): + """ + Tries to read an ASCII or Unicode string + from the address space of the process. + + @see: L{read_string} + + @type lpBaseAddress: int + @param lpBaseAddress: Memory address to begin reading. + + @type fUnicode: bool + @param fUnicode: C{True} is the string is expected to be Unicode, + C{False} if it's expected to be ANSI. + + @type dwMaxSize: int + @param dwMaxSize: Maximum allowed string length to read, in bytes. + + @rtype: str, compat.unicode + @return: String read from the process memory space. + It B{doesn't} include the terminating null character. + Returns an empty string on failure. + """ + + # Validate the parameters. + if not lpBaseAddress or dwMaxSize == 0: + if fUnicode: + return "" + return "" + if not dwMaxSize: + dwMaxSize = 0x1000 + + # Read the string. + szString = self.peek(lpBaseAddress, dwMaxSize) + + # If the string is Unicode... + if fUnicode: + # Decode the string. + szString = compat.unicode(szString, "U16", "replace") + ## try: + ## szString = compat.unicode(szString, 'U16') + ## except UnicodeDecodeError: + ## szString = struct.unpack('H' * (len(szString) / 2), szString) + ## szString = [ unichr(c) for c in szString ] + ## szString = u''.join(szString) + + # Truncate the string when the first null char is found. + szString = szString[: szString.find("\0")] + + # If the string is ANSI... + else: + # Truncate the string when the first null char is found. + szString = szString[: szString.find("\0")] + + # Return the decoded string. + return szString + + # TODO + # try to avoid reading the same page twice by caching it + def peek_pointers_in_data(self, data, peekSize=16, peekStep=1): + """ + Tries to guess which values in the given data are valid pointers, + and reads some data from them. + + @see: L{peek} + + @type data: str + @param data: Binary data to find pointers in. + + @type peekSize: int + @param peekSize: Number of bytes to read from each pointer found. + + @type peekStep: int + @param peekStep: Expected data alignment. + Tipically you specify 1 when data alignment is unknown, + or 4 when you expect data to be DWORD aligned. + Any other value may be specified. + + @rtype: dict( str S{->} str ) + @return: Dictionary mapping stack offsets to the data they point to. + """ + result = dict() + ptrSize = win32.sizeof(win32.LPVOID) + if ptrSize == 4: + ptrFmt = " 0: + for i in compat.xrange(0, len(data), peekStep): + packed = data[i : i + ptrSize] + if len(packed) == ptrSize: + address = struct.unpack(ptrFmt, packed)[0] + ## if not address & (~0xFFFF): continue + peek_data = self.peek(address, peekSize) + if peek_data: + result[i] = peek_data + return result + + # ------------------------------------------------------------------------------ + + def malloc(self, dwSize, lpAddress=None): + """ + Allocates memory into the address space of the process. + + @see: L{free} + + @type dwSize: int + @param dwSize: Number of bytes to allocate. + + @type lpAddress: int + @param lpAddress: (Optional) + Desired address for the newly allocated memory. + This is only a hint, the memory could still be allocated somewhere + else. + + @rtype: int + @return: Address of the newly allocated memory. + + @raise WindowsError: On error an exception is raised. + """ + hProcess = self.get_handle(win32.PROCESS_VM_OPERATION) + return win32.VirtualAllocEx(hProcess, lpAddress, dwSize) + + def mprotect(self, lpAddress, dwSize, flNewProtect): + """ + Set memory protection in the address space of the process. + + @see: U{http://msdn.microsoft.com/en-us/library/aa366899.aspx} + + @type lpAddress: int + @param lpAddress: Address of memory to protect. + + @type dwSize: int + @param dwSize: Number of bytes to protect. + + @type flNewProtect: int + @param flNewProtect: New protect flags. + + @rtype: int + @return: Old protect flags. + + @raise WindowsError: On error an exception is raised. + """ + hProcess = self.get_handle(win32.PROCESS_VM_OPERATION) + return win32.VirtualProtectEx(hProcess, lpAddress, dwSize, flNewProtect) + + def mquery(self, lpAddress): + """ + Query memory information from the address space of the process. + Returns a L{win32.MemoryBasicInformation} object. + + @see: U{http://msdn.microsoft.com/en-us/library/aa366907(VS.85).aspx} + + @type lpAddress: int + @param lpAddress: Address of memory to query. + + @rtype: L{win32.MemoryBasicInformation} + @return: Memory region information. + + @raise WindowsError: On error an exception is raised. + """ + hProcess = self.get_handle(win32.PROCESS_QUERY_INFORMATION) + return win32.VirtualQueryEx(hProcess, lpAddress) + + def free(self, lpAddress): + """ + Frees memory from the address space of the process. + + @see: U{http://msdn.microsoft.com/en-us/library/aa366894(v=vs.85).aspx} + + @type lpAddress: int + @param lpAddress: Address of memory to free. + Must be the base address returned by L{malloc}. + + @raise WindowsError: On error an exception is raised. + """ + hProcess = self.get_handle(win32.PROCESS_VM_OPERATION) + win32.VirtualFreeEx(hProcess, lpAddress) + + # ------------------------------------------------------------------------------ + + def is_pointer(self, address): + """ + Determines if an address is a valid code or data pointer. + + That is, the address must be valid and must point to code or data in + the target process. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: C{True} if the address is a valid code or data pointer. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.has_content() + + def is_address_valid(self, address): + """ + Determines if an address is a valid user mode address. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: C{True} if the address is a valid user mode address. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return True + + def is_address_free(self, address): + """ + Determines if an address belongs to a free page. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: C{True} if the address belongs to a free page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_free() + + def is_address_reserved(self, address): + """ + Determines if an address belongs to a reserved page. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: C{True} if the address belongs to a reserved page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_reserved() + + def is_address_commited(self, address): + """ + Determines if an address belongs to a commited page. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: C{True} if the address belongs to a commited page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_commited() + + def is_address_guard(self, address): + """ + Determines if an address belongs to a guard page. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: C{True} if the address belongs to a guard page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_guard() + + def is_address_readable(self, address): + """ + Determines if an address belongs to a commited and readable page. + The page may or may not have additional permissions. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: + C{True} if the address belongs to a commited and readable page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_readable() + + def is_address_writeable(self, address): + """ + Determines if an address belongs to a commited and writeable page. + The page may or may not have additional permissions. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: + C{True} if the address belongs to a commited and writeable page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_writeable() + + def is_address_copy_on_write(self, address): + """ + Determines if an address belongs to a commited, copy-on-write page. + The page may or may not have additional permissions. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: + C{True} if the address belongs to a commited, copy-on-write page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_copy_on_write() + + def is_address_executable(self, address): + """ + Determines if an address belongs to a commited and executable page. + The page may or may not have additional permissions. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: + C{True} if the address belongs to a commited and executable page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_executable() + + def is_address_executable_and_writeable(self, address): + """ + Determines if an address belongs to a commited, writeable and + executable page. The page may or may not have additional permissions. + + Looking for writeable and executable pages is important when + exploiting a software vulnerability. + + @note: Returns always C{False} for kernel mode addresses. + + @type address: int + @param address: Memory address to query. + + @rtype: bool + @return: + C{True} if the address belongs to a commited, writeable and + executable page. + + @raise WindowsError: An exception is raised on error. + """ + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + return mbi.is_executable_and_writeable() + + def is_buffer(self, address, size): + """ + Determines if the given memory area is a valid code or data buffer. + + @note: Returns always C{False} for kernel mode addresses. + + @see: L{mquery} + + @type address: int + @param address: Memory address. + + @type size: int + @param size: Number of bytes. Must be greater than zero. + + @rtype: bool + @return: C{True} if the memory area is a valid code or data buffer, + C{False} otherwise. + + @raise ValueError: The size argument must be greater than zero. + @raise WindowsError: On error an exception is raised. + """ + if size <= 0: + raise ValueError("The size argument must be greater than zero") + while size > 0: + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + if not mbi.has_content(): + return False + size = size - mbi.RegionSize + return True + + def is_buffer_readable(self, address, size): + """ + Determines if the given memory area is readable. + + @note: Returns always C{False} for kernel mode addresses. + + @see: L{mquery} + + @type address: int + @param address: Memory address. + + @type size: int + @param size: Number of bytes. Must be greater than zero. + + @rtype: bool + @return: C{True} if the memory area is readable, C{False} otherwise. + + @raise ValueError: The size argument must be greater than zero. + @raise WindowsError: On error an exception is raised. + """ + if size <= 0: + raise ValueError("The size argument must be greater than zero") + while size > 0: + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + if not mbi.is_readable(): + return False + size = size - mbi.RegionSize + return True + + def is_buffer_writeable(self, address, size): + """ + Determines if the given memory area is writeable. + + @note: Returns always C{False} for kernel mode addresses. + + @see: L{mquery} + + @type address: int + @param address: Memory address. + + @type size: int + @param size: Number of bytes. Must be greater than zero. + + @rtype: bool + @return: C{True} if the memory area is writeable, C{False} otherwise. + + @raise ValueError: The size argument must be greater than zero. + @raise WindowsError: On error an exception is raised. + """ + if size <= 0: + raise ValueError("The size argument must be greater than zero") + while size > 0: + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + if not mbi.is_writeable(): + return False + size = size - mbi.RegionSize + return True + + def is_buffer_copy_on_write(self, address, size): + """ + Determines if the given memory area is marked as copy-on-write. + + @note: Returns always C{False} for kernel mode addresses. + + @see: L{mquery} + + @type address: int + @param address: Memory address. + + @type size: int + @param size: Number of bytes. Must be greater than zero. + + @rtype: bool + @return: C{True} if the memory area is marked as copy-on-write, + C{False} otherwise. + + @raise ValueError: The size argument must be greater than zero. + @raise WindowsError: On error an exception is raised. + """ + if size <= 0: + raise ValueError("The size argument must be greater than zero") + while size > 0: + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + if not mbi.is_copy_on_write(): + return False + size = size - mbi.RegionSize + return True + + def is_buffer_executable(self, address, size): + """ + Determines if the given memory area is executable. + + @note: Returns always C{False} for kernel mode addresses. + + @see: L{mquery} + + @type address: int + @param address: Memory address. + + @type size: int + @param size: Number of bytes. Must be greater than zero. + + @rtype: bool + @return: C{True} if the memory area is executable, C{False} otherwise. + + @raise ValueError: The size argument must be greater than zero. + @raise WindowsError: On error an exception is raised. + """ + if size <= 0: + raise ValueError("The size argument must be greater than zero") + while size > 0: + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + if not mbi.is_executable(): + return False + size = size - mbi.RegionSize + return True + + def is_buffer_executable_and_writeable(self, address, size): + """ + Determines if the given memory area is writeable and executable. + + Looking for writeable and executable pages is important when + exploiting a software vulnerability. + + @note: Returns always C{False} for kernel mode addresses. + + @see: L{mquery} + + @type address: int + @param address: Memory address. + + @type size: int + @param size: Number of bytes. Must be greater than zero. + + @rtype: bool + @return: C{True} if the memory area is writeable and executable, + C{False} otherwise. + + @raise ValueError: The size argument must be greater than zero. + @raise WindowsError: On error an exception is raised. + """ + if size <= 0: + raise ValueError("The size argument must be greater than zero") + while size > 0: + try: + mbi = self.mquery(address) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + return False + raise + if not mbi.is_executable(): + return False + size = size - mbi.RegionSize + return True + + def get_memory_map(self, minAddr=None, maxAddr=None): + """ + Produces a memory map to the process address space. + + Optionally restrict the map to the given address range. + + @see: L{mquery} + + @type minAddr: int + @param minAddr: (Optional) Starting address in address range to query. + + @type maxAddr: int + @param maxAddr: (Optional) Ending address in address range to query. + + @rtype: list( L{win32.MemoryBasicInformation} ) + @return: List of memory region information objects. + """ + return list(self.iter_memory_map(minAddr, maxAddr)) + + def generate_memory_map(self, minAddr=None, maxAddr=None): + """ + Returns a L{Regenerator} that can iterate indefinitely over the memory + map to the process address space. + + Optionally restrict the map to the given address range. + + @see: L{mquery} + + @type minAddr: int + @param minAddr: (Optional) Starting address in address range to query. + + @type maxAddr: int + @param maxAddr: (Optional) Ending address in address range to query. + + @rtype: L{Regenerator} of L{win32.MemoryBasicInformation} + @return: List of memory region information objects. + """ + return Regenerator(self.iter_memory_map, minAddr, maxAddr) + + def iter_memory_map(self, minAddr=None, maxAddr=None): + """ + Produces an iterator over the memory map to the process address space. + + Optionally restrict the map to the given address range. + + @see: L{mquery} + + @type minAddr: int + @param minAddr: (Optional) Starting address in address range to query. + + @type maxAddr: int + @param maxAddr: (Optional) Ending address in address range to query. + + @rtype: iterator of L{win32.MemoryBasicInformation} + @return: List of memory region information objects. + """ + minAddr, maxAddr = MemoryAddresses.align_address_range(minAddr, maxAddr) + prevAddr = minAddr - 1 + currentAddr = minAddr + while prevAddr < currentAddr < maxAddr: + try: + mbi = self.mquery(currentAddr) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_INVALID_PARAMETER: + break + raise + yield mbi + prevAddr = currentAddr + currentAddr = mbi.BaseAddress + mbi.RegionSize + + def get_mapped_filenames(self, memoryMap=None): + """ + Retrieves the filenames for memory mapped files in the debugee. + + @type memoryMap: list( L{win32.MemoryBasicInformation} ) + @param memoryMap: (Optional) Memory map returned by L{get_memory_map}. + If not given, the current memory map is used. + + @rtype: dict( int S{->} str ) + @return: Dictionary mapping memory addresses to file names. + Native filenames are converted to Win32 filenames when possible. + """ + hProcess = self.get_handle(win32.PROCESS_VM_READ | win32.PROCESS_QUERY_INFORMATION) + if not memoryMap: + memoryMap = self.get_memory_map() + mappedFilenames = dict() + for mbi in memoryMap: + if mbi.Type not in (win32.MEM_IMAGE, win32.MEM_MAPPED): + continue + baseAddress = mbi.BaseAddress + fileName = "" + try: + fileName = win32.GetMappedFileName(hProcess, baseAddress) + fileName = PathOperations.native_to_win32_pathname(fileName) + except WindowsError: + # e = sys.exc_info()[1] + # try: + # msg = "Can't get mapped file name at address %s in process " \ + # "%d, reason: %s" % (HexDump.address(baseAddress), + # self.get_pid(), + # e.strerror) + # warnings.warn(msg, Warning) + # except Exception: + pass + mappedFilenames[baseAddress] = fileName + return mappedFilenames + + def generate_memory_snapshot(self, minAddr=None, maxAddr=None): + """ + Returns a L{Regenerator} that allows you to iterate through the memory + contents of a process indefinitely. + + It's basically the same as the L{take_memory_snapshot} method, but it + takes the snapshot of each memory region as it goes, as opposed to + taking the whole snapshot at once. This allows you to work with very + large snapshots without a significant performance penalty. + + Example:: + # Print the memory contents of a process. + process.suspend() + try: + snapshot = process.generate_memory_snapshot() + for mbi in snapshot: + print HexDump.hexblock(mbi.content, mbi.BaseAddress) + finally: + process.resume() + + The downside of this is the process must remain suspended while + iterating the snapshot, otherwise strange things may happen. + + The snapshot can be iterated more than once. Each time it's iterated + the memory contents of the process will be fetched again. + + You can also iterate the memory of a dead process, just as long as the + last open handle to it hasn't been closed. + + @see: L{take_memory_snapshot} + + @type minAddr: int + @param minAddr: (Optional) Starting address in address range to query. + + @type maxAddr: int + @param maxAddr: (Optional) Ending address in address range to query. + + @rtype: L{Regenerator} of L{win32.MemoryBasicInformation} + @return: Generator that when iterated returns memory region information + objects. Two extra properties are added to these objects: + - C{filename}: Mapped filename, or C{None}. + - C{content}: Memory contents, or C{None}. + """ + return Regenerator(self.iter_memory_snapshot, minAddr, maxAddr) + + def iter_memory_snapshot(self, minAddr=None, maxAddr=None): + """ + Returns an iterator that allows you to go through the memory contents + of a process. + + It's basically the same as the L{take_memory_snapshot} method, but it + takes the snapshot of each memory region as it goes, as opposed to + taking the whole snapshot at once. This allows you to work with very + large snapshots without a significant performance penalty. + + Example:: + # Print the memory contents of a process. + process.suspend() + try: + snapshot = process.generate_memory_snapshot() + for mbi in snapshot: + print HexDump.hexblock(mbi.content, mbi.BaseAddress) + finally: + process.resume() + + The downside of this is the process must remain suspended while + iterating the snapshot, otherwise strange things may happen. + + The snapshot can only iterated once. To be able to iterate indefinitely + call the L{generate_memory_snapshot} method instead. + + You can also iterate the memory of a dead process, just as long as the + last open handle to it hasn't been closed. + + @see: L{take_memory_snapshot} + + @type minAddr: int + @param minAddr: (Optional) Starting address in address range to query. + + @type maxAddr: int + @param maxAddr: (Optional) Ending address in address range to query. + + @rtype: iterator of L{win32.MemoryBasicInformation} + @return: Iterator of memory region information objects. + Two extra properties are added to these objects: + - C{filename}: Mapped filename, or C{None}. + - C{content}: Memory contents, or C{None}. + """ + + # One may feel tempted to include calls to self.suspend() and + # self.resume() here, but that wouldn't work on a dead process. + # It also wouldn't be needed when debugging since the process is + # already suspended when the debug event arrives. So it's up to + # the user to suspend the process if needed. + + # Get the memory map. + memory = self.get_memory_map(minAddr, maxAddr) + + # Abort if the map couldn't be retrieved. + if not memory: + return + + # Get the mapped filenames. + # Don't fail on access denied errors. + try: + filenames = self.get_mapped_filenames(memory) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror != win32.ERROR_ACCESS_DENIED: + raise + filenames = dict() + + # Trim the first memory information block if needed. + if minAddr is not None: + minAddr = MemoryAddresses.align_address_to_page_start(minAddr) + mbi = memory[0] + if mbi.BaseAddress < minAddr: + mbi.RegionSize = mbi.BaseAddress + mbi.RegionSize - minAddr + mbi.BaseAddress = minAddr + + # Trim the last memory information block if needed. + if maxAddr is not None: + if maxAddr != MemoryAddresses.align_address_to_page_start(maxAddr): + maxAddr = MemoryAddresses.align_address_to_page_end(maxAddr) + mbi = memory[-1] + if mbi.BaseAddress + mbi.RegionSize > maxAddr: + mbi.RegionSize = maxAddr - mbi.BaseAddress + + # Read the contents of each block and yield it. + while memory: + mbi = memory.pop(0) # so the garbage collector can take it + mbi.filename = filenames.get(mbi.BaseAddress, None) + if mbi.has_content(): + mbi.content = self.read(mbi.BaseAddress, mbi.RegionSize) + else: + mbi.content = None + yield mbi + + def take_memory_snapshot(self, minAddr=None, maxAddr=None): + """ + Takes a snapshot of the memory contents of the process. + + It's best if the process is suspended (if alive) when taking the + snapshot. Execution can be resumed afterwards. + + Example:: + # Print the memory contents of a process. + process.suspend() + try: + snapshot = process.take_memory_snapshot() + for mbi in snapshot: + print HexDump.hexblock(mbi.content, mbi.BaseAddress) + finally: + process.resume() + + You can also iterate the memory of a dead process, just as long as the + last open handle to it hasn't been closed. + + @warning: If the target process has a very big memory footprint, the + resulting snapshot will be equally big. This may result in a severe + performance penalty. + + @see: L{generate_memory_snapshot} + + @type minAddr: int + @param minAddr: (Optional) Starting address in address range to query. + + @type maxAddr: int + @param maxAddr: (Optional) Ending address in address range to query. + + @rtype: list( L{win32.MemoryBasicInformation} ) + @return: List of memory region information objects. + Two extra properties are added to these objects: + - C{filename}: Mapped filename, or C{None}. + - C{content}: Memory contents, or C{None}. + """ + return list(self.iter_memory_snapshot(minAddr, maxAddr)) + + def restore_memory_snapshot(self, snapshot, bSkipMappedFiles=True, bSkipOnError=False): + """ + Attempts to restore the memory state as it was when the given snapshot + was taken. + + @warning: Currently only the memory contents, state and protect bits + are restored. Under some circumstances this method may fail (for + example if memory was freed and then reused by a mapped file). + + @type snapshot: list( L{win32.MemoryBasicInformation} ) + @param snapshot: Memory snapshot returned by L{take_memory_snapshot}. + Snapshots returned by L{generate_memory_snapshot} don't work here. + + @type bSkipMappedFiles: bool + @param bSkipMappedFiles: C{True} to avoid restoring the contents of + memory mapped files, C{False} otherwise. Use with care! Setting + this to C{False} can cause undesired side effects - changes to + memory mapped files may be written to disk by the OS. Also note + that most mapped files are typically executables and don't change, + so trying to restore their contents is usually a waste of time. + + @type bSkipOnError: bool + @param bSkipOnError: C{True} to issue a warning when an error occurs + during the restoration of the snapshot, C{False} to stop and raise + an exception instead. Use with care! Setting this to C{True} will + cause the debugger to falsely believe the memory snapshot has been + correctly restored. + + @raise WindowsError: An error occured while restoring the snapshot. + @raise RuntimeError: An error occured while restoring the snapshot. + @raise TypeError: A snapshot of the wrong type was passed. + """ + if not snapshot or not isinstance(snapshot, list) or not isinstance(snapshot[0], win32.MemoryBasicInformation): + raise TypeError("Only snapshots returned by " "take_memory_snapshot() can be used here.") + + # Get the process handle. + hProcess = self.get_handle( + win32.PROCESS_VM_WRITE | win32.PROCESS_VM_OPERATION | win32.PROCESS_SUSPEND_RESUME | win32.PROCESS_QUERY_INFORMATION + ) + + # Freeze the process. + self.suspend() + try: + # For each memory region in the snapshot... + for old_mbi in snapshot: + # If the region matches, restore it directly. + new_mbi = self.mquery(old_mbi.BaseAddress) + if new_mbi.BaseAddress == old_mbi.BaseAddress and new_mbi.RegionSize == old_mbi.RegionSize: + self.__restore_mbi(hProcess, new_mbi, old_mbi, bSkipMappedFiles) + + # If the region doesn't match, restore it page by page. + else: + # We need a copy so we don't corrupt the snapshot. + old_mbi = win32.MemoryBasicInformation(old_mbi) + + # Get the overlapping range of pages. + old_start = old_mbi.BaseAddress + old_end = old_start + old_mbi.RegionSize + new_start = new_mbi.BaseAddress + new_end = new_start + new_mbi.RegionSize + if old_start > new_start: + start = old_start + else: + start = new_start + if old_end < new_end: + end = old_end + else: + end = new_end + + # Restore each page in the overlapping range. + step = MemoryAddresses.pageSize + old_mbi.RegionSize = step + new_mbi.RegionSize = step + address = start + while address < end: + old_mbi.BaseAddress = address + new_mbi.BaseAddress = address + self.__restore_mbi(hProcess, new_mbi, old_mbi, bSkipMappedFiles, bSkipOnError) + address = address + step + + # Resume execution. + finally: + self.resume() + + def __restore_mbi(self, hProcess, new_mbi, old_mbi, bSkipMappedFiles, bSkipOnError): + """ + Used internally by L{restore_memory_snapshot}. + """ + + ## print "Restoring %s-%s" % ( + ## HexDump.address(old_mbi.BaseAddress, self.get_bits()), + ## HexDump.address(old_mbi.BaseAddress + old_mbi.RegionSize, + ## self.get_bits())) + + try: + # Restore the region state. + if new_mbi.State != old_mbi.State: + if new_mbi.is_free(): + if old_mbi.is_reserved(): + # Free -> Reserved + address = win32.VirtualAllocEx( + hProcess, old_mbi.BaseAddress, old_mbi.RegionSize, win32.MEM_RESERVE, old_mbi.Protect + ) + if address != old_mbi.BaseAddress: + self.free(address) + msg = "Error restoring region at address %s" + msg = msg % HexDump(old_mbi.BaseAddress, self.get_bits()) + raise RuntimeError(msg) + # permissions already restored + new_mbi.Protect = old_mbi.Protect + + else: # elif old_mbi.is_commited(): + # Free -> Commited + address = win32.VirtualAllocEx( + hProcess, old_mbi.BaseAddress, old_mbi.RegionSize, win32.MEM_RESERVE | win32.MEM_COMMIT, old_mbi.Protect + ) + if address != old_mbi.BaseAddress: + self.free(address) + msg = "Error restoring region at address %s" + msg = msg % HexDump(old_mbi.BaseAddress, self.get_bits()) + raise RuntimeError(msg) + # permissions already restored + new_mbi.Protect = old_mbi.Protect + + elif new_mbi.is_reserved(): + if old_mbi.is_commited(): + # Reserved -> Commited + address = win32.VirtualAllocEx(hProcess, old_mbi.BaseAddress, old_mbi.RegionSize, win32.MEM_COMMIT, old_mbi.Protect) + if address != old_mbi.BaseAddress: + self.free(address) + msg = "Error restoring region at address %s" + msg = msg % HexDump(old_mbi.BaseAddress, self.get_bits()) + raise RuntimeError(msg) + # permissions already restored + new_mbi.Protect = old_mbi.Protect + + else: # elif old_mbi.is_free(): + # Reserved -> Free + win32.VirtualFreeEx(hProcess, old_mbi.BaseAddress, old_mbi.RegionSize, win32.MEM_RELEASE) + + else: # elif new_mbi.is_commited(): + if old_mbi.is_reserved(): + # Commited -> Reserved + win32.VirtualFreeEx(hProcess, old_mbi.BaseAddress, old_mbi.RegionSize, win32.MEM_DECOMMIT) + + else: # elif old_mbi.is_free(): + # Commited -> Free + win32.VirtualFreeEx(hProcess, old_mbi.BaseAddress, old_mbi.RegionSize, win32.MEM_DECOMMIT | win32.MEM_RELEASE) + + new_mbi.State = old_mbi.State + + # Restore the region permissions. + if old_mbi.is_commited() and old_mbi.Protect != new_mbi.Protect: + win32.VirtualProtectEx(hProcess, old_mbi.BaseAddress, old_mbi.RegionSize, old_mbi.Protect) + new_mbi.Protect = old_mbi.Protect + + # Restore the region data. + # Ignore write errors when the region belongs to a mapped file. + if old_mbi.has_content(): + if old_mbi.Type != 0: + if not bSkipMappedFiles: + self.poke(old_mbi.BaseAddress, old_mbi.content) + else: + self.write(old_mbi.BaseAddress, old_mbi.content) + new_mbi.content = old_mbi.content + + # On error, skip this region or raise an exception. + except Exception: + if not bSkipOnError: + raise + msg = "Error restoring region at address %s: %s" + msg = msg % (HexDump(old_mbi.BaseAddress, self.get_bits()), traceback.format_exc()) + warnings.warn(msg, RuntimeWarning) + + # ------------------------------------------------------------------------------ + + def inject_code(self, payload, lpParameter=0): + """ + Injects relocatable code into the process memory and executes it. + + @warning: Don't forget to free the memory when you're done with it! + Otherwise you'll be leaking memory in the target process. + + @see: L{inject_dll} + + @type payload: str + @param payload: Relocatable code to run in a new thread. + + @type lpParameter: int + @param lpParameter: (Optional) Parameter to be pushed in the stack. + + @rtype: tuple( L{Thread}, int ) + @return: The injected Thread object + and the memory address where the code was written. + + @raise WindowsError: An exception is raised on error. + """ + + # Uncomment for debugging... + ## payload = '\xCC' + payload + + # Allocate the memory for the shellcode. + lpStartAddress = self.malloc(len(payload)) + + # Catch exceptions so we can free the memory on error. + try: + # Write the shellcode to our memory location. + self.write(lpStartAddress, payload) + + # Start a new thread for the shellcode to run. + aThread = self.start_thread(lpStartAddress, lpParameter, bSuspended=False) + + # Remember the shellcode address. + # It will be freed ONLY by the Thread.kill() method + # and the EventHandler class, otherwise you'll have to + # free it in your code, or have your shellcode clean up + # after itself (recommended). + aThread.pInjectedMemory = lpStartAddress + + # Free the memory on error. + except Exception: + self.free(lpStartAddress) + raise + + # Return the Thread object and the shellcode address. + return aThread, lpStartAddress + + # TODO + # The shellcode should check for errors, otherwise it just crashes + # when the DLL can't be loaded or the procedure can't be found. + # On error the shellcode should execute an int3 instruction. + def inject_dll(self, dllname, procname=None, lpParameter=0, bWait=True, dwTimeout=None): + """ + Injects a DLL into the process memory. + + @warning: Setting C{bWait} to C{True} when the process is frozen by a + debug event will cause a deadlock in your debugger. + + @warning: This involves allocating memory in the target process. + This is how the freeing of this memory is handled: + + - If the C{bWait} flag is set to C{True} the memory will be freed + automatically before returning from this method. + - If the C{bWait} flag is set to C{False}, the memory address is + set as the L{Thread.pInjectedMemory} property of the returned + thread object. + - L{Debug} objects free L{Thread.pInjectedMemory} automatically + both when it detaches from a process and when the injected + thread finishes its execution. + - The {Thread.kill} method also frees L{Thread.pInjectedMemory} + automatically, even if you're not attached to the process. + + You could still be leaking memory if not careful. For example, if + you inject a dll into a process you're not attached to, you don't + wait for the thread's completion and you don't kill it either, the + memory would be leaked. + + @see: L{inject_code} + + @type dllname: str + @param dllname: Name of the DLL module to load. + + @type procname: str + @param procname: (Optional) Procedure to call when the DLL is loaded. + + @type lpParameter: int + @param lpParameter: (Optional) Parameter to the C{procname} procedure. + + @type bWait: bool + @param bWait: C{True} to wait for the process to finish. + C{False} to return immediately. + + @type dwTimeout: int + @param dwTimeout: (Optional) Timeout value in milliseconds. + Ignored if C{bWait} is C{False}. + + @rtype: L{Thread} + @return: Newly created thread object. If C{bWait} is set to C{True} the + thread will be dead, otherwise it will be alive. + + @raise NotImplementedError: The target platform is not supported. + Currently calling a procedure in the library is only supported in + the I{i386} architecture. + + @raise WindowsError: An exception is raised on error. + """ + + # Resolve kernel32.dll + aModule = self.get_module_by_name(compat.b("kernel32.dll")) + if aModule is None: + self.scan_modules() + aModule = self.get_module_by_name(compat.b("kernel32.dll")) + if aModule is None: + raise RuntimeError("Cannot resolve kernel32.dll in the remote process") + + # Old method, using shellcode. + if procname: + if self.get_arch() != win32.ARCH_I386: + raise NotImplementedError() + dllname = compat.b(dllname) + + # Resolve kernel32.dll!LoadLibraryA + pllib = aModule.resolve(compat.b("LoadLibraryA")) + if not pllib: + raise RuntimeError("Cannot resolve kernel32.dll!LoadLibraryA" " in the remote process") + + # Resolve kernel32.dll!GetProcAddress + pgpad = aModule.resolve(compat.b("GetProcAddress")) + if not pgpad: + raise RuntimeError("Cannot resolve kernel32.dll!GetProcAddress" " in the remote process") + + # Resolve kernel32.dll!VirtualFree + pvf = aModule.resolve(compat.b("VirtualFree")) + if not pvf: + raise RuntimeError("Cannot resolve kernel32.dll!VirtualFree" " in the remote process") + + # Shellcode follows... + code = compat.b("") + + # push dllname + code += compat.b("\xe8") + struct.pack("= 2 and bAllowElevation: + pi = win32.CreateProcess( + None, lpCmdLine, bInheritHandles=bInheritHandles, dwCreationFlags=dwCreationFlags, lpStartupInfo=lpStartupInfo + ) + + # Create the process the hard way... + else: + # If we allow elevation, use the current process token. + # If not, get the token from the current shell process. + hToken = None + try: + if not bAllowElevation: + if bFollow: + msg = "Child processes can't be autofollowed" " when dropping UAC elevation." + raise NotImplementedError(msg) + if bConsole: + msg = "Child processes can't inherit the debugger's" " console when dropping UAC elevation." + raise NotImplementedError(msg) + if bInheritHandles: + msg = "Child processes can't inherit the debugger's" " handles when dropping UAC elevation." + raise NotImplementedError(msg) + try: + hWnd = self.get_shell_window() + except WindowsError: + hWnd = self.get_desktop_window() + shell = hWnd.get_process() + try: + hShell = shell.get_handle(win32.PROCESS_QUERY_INFORMATION) + with win32.OpenProcessToken(hShell) as hShellToken: + hToken = win32.DuplicateTokenEx(hShellToken) + finally: + shell.close_handle() + + # Lower trust level if requested. + if iTrustLevel < 2: + if iTrustLevel > 0: + dwLevelId = win32.SAFER_LEVELID_NORMALUSER + else: + dwLevelId = win32.SAFER_LEVELID_UNTRUSTED + with win32.SaferCreateLevel(dwLevelId=dwLevelId) as hSafer: + hSaferToken = win32.SaferComputeTokenFromLevel(hSafer, hToken)[0] + try: + if hToken is not None: + hToken.close() + except: + hSaferToken.close() + raise + hToken = hSaferToken + + # If we have a computed token, call CreateProcessAsUser(). + if bAllowElevation: + pi = win32.CreateProcessAsUser( + hToken=hToken, + lpCommandLine=lpCmdLine, + bInheritHandles=bInheritHandles, + dwCreationFlags=dwCreationFlags, + lpStartupInfo=lpStartupInfo, + ) + + # If we have a primary token call CreateProcessWithToken(). + # The problem is, there are many flags CreateProcess() and + # CreateProcessAsUser() accept but CreateProcessWithToken() + # and CreateProcessWithLogonW() don't, so we need to work + # around them. + else: + # Remove the debug flags. + dwCreationFlags &= ~win32.DEBUG_PROCESS + dwCreationFlags &= ~win32.DEBUG_ONLY_THIS_PROCESS + + # Remove the console flags. + dwCreationFlags &= ~win32.DETACHED_PROCESS + + # The process will be created suspended. + dwCreationFlags |= win32.CREATE_SUSPENDED + + # Create the process using the new primary token. + pi = win32.CreateProcessWithToken( + hToken=hToken, + dwLogonFlags=win32.LOGON_WITH_PROFILE, + lpCommandLine=lpCmdLine, + dwCreationFlags=dwCreationFlags, + lpStartupInfo=lpStartupInfo, + ) + + # Attach as a debugger, if requested. + if bDebug: + win32.DebugActiveProcess(pi.dwProcessId) + + # Resume execution, if requested. + if not bSuspended: + win32.ResumeThread(pi.hThread) + + # Close the token when we're done with it. + finally: + if hToken is not None: + hToken.close() + + # Wrap the new process and thread in Process and Thread objects, + # and add them to the corresponding snapshots. + aProcess = Process(pi.dwProcessId, pi.hProcess) + aThread = Thread(pi.dwThreadId, pi.hThread) + aProcess._add_thread(aThread) + self._add_process(aProcess) + + # Clean up on error. + except: + if pi is not None: + try: + win32.TerminateProcess(pi.hProcess) + except WindowsError: + pass + pi.hThread.close() + pi.hProcess.close() + raise + + # Return the new Process object. + return aProcess + + def get_explorer_pid(self): + """ + Tries to find the process ID for "explorer.exe". + + @rtype: int or None + @return: Returns the process ID, or C{None} on error. + """ + try: + exp = win32.SHGetFolderPath(win32.CSIDL_WINDOWS) + except Exception: + exp = None + if not exp: + exp = os.getenv("SystemRoot") + if exp: + exp = os.path.join(exp, "explorer.exe") + exp_list = self.find_processes_by_filename(exp) + if exp_list: + return exp_list[0][0].get_pid() + return None + + # ------------------------------------------------------------------------------ + + # XXX this methods musn't end up calling __initialize_snapshot by accident! + + def scan(self): + """ + Populates the snapshot with running processes and threads, + and loaded modules. + + Tipically this is the first method called after instantiating a + L{System} object, as it makes a best effort approach to gathering + information on running processes. + + @rtype: bool + @return: C{True} if the snapshot is complete, C{False} if the debugger + doesn't have permission to scan some processes. In either case, the + snapshot is complete for all processes the debugger has access to. + """ + has_threads = True + try: + try: + # Try using the Toolhelp API + # to scan for processes and threads. + self.scan_processes_and_threads() + + except Exception: + # On error, try using the PSAPI to scan for process IDs only. + self.scan_processes_fast() + + # Now try using the Toolhelp again to get the threads. + for aProcess in self.__processDict.values(): + if aProcess._get_thread_ids(): + try: + aProcess.scan_threads() + except WindowsError: + has_threads = False + + finally: + # Try using the Remote Desktop API to scan for processes only. + # This will update the filenames when it's not possible + # to obtain them from the Toolhelp API. + self.scan_processes() + + # When finished scanning for processes, try modules too. + has_modules = self.scan_modules() + + # Try updating the process filenames when possible. + has_full_names = self.scan_process_filenames() + + # Return the completion status. + return has_threads and has_modules and has_full_names + + def scan_processes_and_threads(self): + """ + Populates the snapshot with running processes and threads. + + Tipically you don't need to call this method directly, if unsure use + L{scan} instead. + + @note: This method uses the Toolhelp API. + + @see: L{scan_modules} + + @raise WindowsError: An error occured while updating the snapshot. + The snapshot was not modified. + """ + + # The main module filename may be spoofed by malware, + # since this information resides in usermode space. + # See: http://www.ragestorm.net/blogs/?p=163 + + our_pid = win32.GetCurrentProcessId() + dead_pids = set(compat.iterkeys(self.__processDict)) + found_tids = set() + + # Ignore our own process if it's in the snapshot for some reason + if our_pid in dead_pids: + dead_pids.remove(our_pid) + + # Take a snapshot of all processes and threads + dwFlags = win32.TH32CS_SNAPPROCESS | win32.TH32CS_SNAPTHREAD + with win32.CreateToolhelp32Snapshot(dwFlags) as hSnapshot: + # Add all the processes (excluding our own) + pe = win32.Process32First(hSnapshot) + while pe is not None: + dwProcessId = pe.th32ProcessID + if dwProcessId != our_pid: + if dwProcessId in dead_pids: + dead_pids.remove(dwProcessId) + if dwProcessId not in self.__processDict: + aProcess = Process(dwProcessId, fileName=pe.szExeFile) + self._add_process(aProcess) + elif pe.szExeFile: + aProcess = self.get_process(dwProcessId) + if not aProcess.fileName: + aProcess.fileName = pe.szExeFile + pe = win32.Process32Next(hSnapshot) + + # Add all the threads + te = win32.Thread32First(hSnapshot) + while te is not None: + dwProcessId = te.th32OwnerProcessID + if dwProcessId != our_pid: + if dwProcessId in dead_pids: + dead_pids.remove(dwProcessId) + if dwProcessId in self.__processDict: + aProcess = self.get_process(dwProcessId) + else: + aProcess = Process(dwProcessId) + self._add_process(aProcess) + dwThreadId = te.th32ThreadID + found_tids.add(dwThreadId) + if not aProcess._has_thread_id(dwThreadId): + aThread = Thread(dwThreadId, process=aProcess) + aProcess._add_thread(aThread) + te = win32.Thread32Next(hSnapshot) + + # Remove dead processes + for pid in dead_pids: + self._del_process(pid) + + # Remove dead threads + for aProcess in compat.itervalues(self.__processDict): + dead_tids = set(aProcess._get_thread_ids()) + dead_tids.difference_update(found_tids) + for tid in dead_tids: + aProcess._del_thread(tid) + + def scan_modules(self): + """ + Populates the snapshot with loaded modules. + + Tipically you don't need to call this method directly, if unsure use + L{scan} instead. + + @note: This method uses the Toolhelp API. + + @see: L{scan_processes_and_threads} + + @rtype: bool + @return: C{True} if the snapshot is complete, C{False} if the debugger + doesn't have permission to scan some processes. In either case, the + snapshot is complete for all processes the debugger has access to. + """ + complete = True + for aProcess in compat.itervalues(self.__processDict): + try: + aProcess.scan_modules() + except WindowsError: + complete = False + return complete + + def scan_processes(self): + """ + Populates the snapshot with running processes. + + Tipically you don't need to call this method directly, if unsure use + L{scan} instead. + + @note: This method uses the Remote Desktop API instead of the Toolhelp + API. It might give slightly different results, especially if the + current process does not have full privileges. + + @note: This method will only retrieve process filenames. To get the + process pathnames instead, B{after} this method call + L{scan_process_filenames}. + + @raise WindowsError: An error occured while updating the snapshot. + The snapshot was not modified. + """ + + # Get the previous list of PIDs. + # We'll be removing live PIDs from it as we find them. + our_pid = win32.GetCurrentProcessId() + dead_pids = set(compat.iterkeys(self.__processDict)) + + # Ignore our own PID. + if our_pid in dead_pids: + dead_pids.remove(our_pid) + + # Get the list of processes from the Remote Desktop API. + pProcessInfo = None + try: + pProcessInfo, dwCount = win32.WTSEnumerateProcesses(win32.WTS_CURRENT_SERVER_HANDLE) + + # For each process found... + for index in compat.xrange(dwCount): + sProcessInfo = pProcessInfo[index] + + ## # Ignore processes belonging to other sessions. + ## if sProcessInfo.SessionId != win32.WTS_CURRENT_SESSION: + ## continue + + # Ignore our own PID. + pid = sProcessInfo.ProcessId + if pid == our_pid: + continue + + # Remove the PID from the dead PIDs list. + if pid in dead_pids: + dead_pids.remove(pid) + + # Get the "process name". + # Empirically, this seems to be the filename without the path. + # (The MSDN docs aren't very clear about this API call). + fileName = sProcessInfo.pProcessName + + # If the process is new, add a new Process object. + if pid not in self.__processDict: + aProcess = Process(pid, fileName=fileName) + self._add_process(aProcess) + + # If the process was already in the snapshot, and the + # filename is missing, update the Process object. + elif fileName: + aProcess = self.__processDict.get(pid) + if not aProcess.fileName: + aProcess.fileName = fileName + + # Free the memory allocated by the Remote Desktop API. + finally: + if pProcessInfo is not None: + try: + win32.WTSFreeMemory(pProcessInfo) + except WindowsError: + pass + + # At this point the only remaining PIDs from the old list are dead. + # Remove them from the snapshot. + for pid in dead_pids: + self._del_process(pid) + + def scan_processes_fast(self): + """ + Populates the snapshot with running processes. + Only the PID is retrieved for each process. + + Dead processes are removed. + Threads and modules of living processes are ignored. + + Tipically you don't need to call this method directly, if unsure use + L{scan} instead. + + @note: This method uses the PSAPI. It may be faster for scanning, + but some information may be missing, outdated or slower to obtain. + This could be a good tradeoff under some circumstances. + """ + + # Get the new and old list of pids + new_pids = set(win32.EnumProcesses()) + old_pids = set(compat.iterkeys(self.__processDict)) + + # Ignore our own pid + our_pid = win32.GetCurrentProcessId() + if our_pid in new_pids: + new_pids.remove(our_pid) + if our_pid in old_pids: + old_pids.remove(our_pid) + + # Add newly found pids + for pid in new_pids.difference(old_pids): + self._add_process(Process(pid)) + + # Remove missing pids + for pid in old_pids.difference(new_pids): + self._del_process(pid) + + def scan_process_filenames(self): + """ + Update the filename for each process in the snapshot when possible. + + @note: Tipically you don't need to call this method. It's called + automatically by L{scan} to get the full pathname for each process + when possible, since some scan methods only get filenames without + the path component. + + If unsure, use L{scan} instead. + + @see: L{scan}, L{Process.get_filename} + + @rtype: bool + @return: C{True} if all the pathnames were retrieved, C{False} if the + debugger doesn't have permission to scan some processes. In either + case, all processes the debugger has access to have a full pathname + instead of just a filename. + """ + complete = True + for aProcess in self.__processDict.values(): + try: + new_name = None + old_name = aProcess.fileName + try: + aProcess.fileName = None + new_name = aProcess.get_filename() + finally: + if not new_name: + aProcess.fileName = old_name + complete = False + except Exception: + complete = False + return complete + + # ------------------------------------------------------------------------------ + + def clear_dead_processes(self): + """ + Removes Process objects from the snapshot + referring to processes no longer running. + """ + for pid in self.get_process_ids(): + aProcess = self.get_process(pid) + if not aProcess.is_alive(): + self._del_process(aProcess) + + def clear_unattached_processes(self): + """ + Removes Process objects from the snapshot + referring to processes not being debugged. + """ + for pid in self.get_process_ids(): + aProcess = self.get_process(pid) + if not aProcess.is_being_debugged(): + self._del_process(aProcess) + + def close_process_handles(self): + """ + Closes all open handles to processes in this snapshot. + """ + for pid in self.get_process_ids(): + aProcess = self.get_process(pid) + try: + aProcess.close_handle() + except Exception: + e = sys.exc_info()[1] + try: + msg = "Cannot close process handle %s, reason: %s" + msg %= (aProcess.hProcess.value, str(e)) + warnings.warn(msg) + except Exception: + pass + + def close_process_and_thread_handles(self): + """ + Closes all open handles to processes and threads in this snapshot. + """ + for aProcess in self.iter_processes(): + aProcess.close_thread_handles() + try: + aProcess.close_handle() + except Exception: + e = sys.exc_info()[1] + try: + msg = "Cannot close process handle %s, reason: %s" + msg %= (aProcess.hProcess.value, str(e)) + warnings.warn(msg) + except Exception: + pass + + def clear_processes(self): + """ + Removes all L{Process}, L{Thread} and L{Module} objects in this snapshot. + """ + # self.close_process_and_thread_handles() + for aProcess in self.iter_processes(): + aProcess.clear() + self.__processDict = dict() + + def clear(self): + """ + Clears this snapshot. + + @see: L{clear_processes} + """ + self.clear_processes() + + # ------------------------------------------------------------------------------ + + # Docs for these methods are taken from the _ThreadContainer class. + + def has_thread(self, dwThreadId): + dwProcessId = self.get_pid_from_tid(dwThreadId) + if dwProcessId is None: + return False + return self.has_process(dwProcessId) + + def get_thread(self, dwThreadId): + dwProcessId = self.get_pid_from_tid(dwThreadId) + if dwProcessId is None: + msg = "Unknown thread ID %d" % dwThreadId + raise KeyError(msg) + return self.get_process(dwProcessId).get_thread(dwThreadId) + + def get_thread_ids(self): + ids = list() + for aProcess in self.iter_processes(): + ids += aProcess.get_thread_ids() + return ids + + def get_thread_count(self): + count = 0 + for aProcess in self.iter_processes(): + count += aProcess.get_thread_count() + return count + + has_thread.__doc__ = _ThreadContainer.has_thread.__doc__ + get_thread.__doc__ = _ThreadContainer.get_thread.__doc__ + get_thread_ids.__doc__ = _ThreadContainer.get_thread_ids.__doc__ + get_thread_count.__doc__ = _ThreadContainer.get_thread_count.__doc__ + + # ------------------------------------------------------------------------------ + + # Docs for these methods are taken from the _ModuleContainer class. + + def get_module_count(self): + count = 0 + for aProcess in self.iter_processes(): + count += aProcess.get_module_count() + return count + + get_module_count.__doc__ = _ModuleContainer.get_module_count.__doc__ + + # ------------------------------------------------------------------------------ + + def find_modules_by_base(self, lpBaseOfDll): + """ + @rtype: list( L{Module}... ) + @return: List of Module objects with the given base address. + """ + found = list() + for aProcess in self.iter_processes(): + if aProcess.has_module(lpBaseOfDll): + aModule = aProcess.get_module(lpBaseOfDll) + found.append((aProcess, aModule)) + return found + + def find_modules_by_name(self, fileName): + """ + @rtype: list( L{Module}... ) + @return: List of Module objects found. + """ + found = list() + for aProcess in self.iter_processes(): + aModule = aProcess.get_module_by_name(fileName) + if aModule is not None: + found.append((aProcess, aModule)) + return found + + def find_modules_by_address(self, address): + """ + @rtype: list( L{Module}... ) + @return: List of Module objects that best match the given address. + """ + found = list() + for aProcess in self.iter_processes(): + aModule = aProcess.get_module_at_address(address) + if aModule is not None: + found.append((aProcess, aModule)) + return found + + def __find_processes_by_filename(self, filename): + """ + Internally used by L{find_processes_by_filename}. + """ + found = list() + filename = filename.lower() + if PathOperations.path_is_absolute(filename): + for aProcess in self.iter_processes(): + imagename = aProcess.get_filename() + if imagename and imagename.lower() == filename: + found.append((aProcess, imagename)) + else: + for aProcess in self.iter_processes(): + imagename = aProcess.get_filename() + if imagename: + imagename = PathOperations.pathname_to_filename(imagename) + if imagename.lower() == filename: + found.append((aProcess, imagename)) + return found + + def find_processes_by_filename(self, fileName): + """ + @type fileName: str + @param fileName: Filename to search for. + If it's a full pathname, the match must be exact. + If it's a base filename only, the file part is matched, + regardless of the directory where it's located. + + @note: If the process is not found and the file extension is not + given, this method will search again assuming a default + extension (.exe). + + @rtype: list of tuple( L{Process}, str ) + @return: List of processes matching the given main module filename. + Each tuple contains a Process object and it's filename. + """ + found = self.__find_processes_by_filename(fileName) + if not found: + fn, ext = PathOperations.split_extension(fileName) + if not ext: + fileName = "%s.exe" % fn + found = self.__find_processes_by_filename(fileName) + return found + + # ------------------------------------------------------------------------------ + + # XXX _notify_* methods should not trigger a scan + + def _add_process(self, aProcess): + """ + Private method to add a process object to the snapshot. + + @type aProcess: L{Process} + @param aProcess: Process object. + """ + ## if not isinstance(aProcess, Process): + ## if hasattr(aProcess, '__class__'): + ## typename = aProcess.__class__.__name__ + ## else: + ## typename = str(type(aProcess)) + ## msg = "Expected Process, got %s instead" % typename + ## raise TypeError(msg) + dwProcessId = aProcess.dwProcessId + ## if dwProcessId in self.__processDict: + ## msg = "Process already exists: %d" % dwProcessId + ## raise KeyError(msg) + self.__processDict[dwProcessId] = aProcess + + def _del_process(self, dwProcessId): + """ + Private method to remove a process object from the snapshot. + + @type dwProcessId: int + @param dwProcessId: Global process ID. + """ + try: + aProcess = self.__processDict[dwProcessId] + del self.__processDict[dwProcessId] + except KeyError: + aProcess = None + msg = "Unknown process ID %d" % dwProcessId + warnings.warn(msg, RuntimeWarning) + if aProcess: + aProcess.clear() # remove circular references + + # Notify the creation of a new process. + def _notify_create_process(self, event): + """ + Notify the creation of a new process. + + This is done automatically by the L{Debug} class, you shouldn't need + to call it yourself. + + @type event: L{CreateProcessEvent} + @param event: Create process event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + dwProcessId = event.get_pid() + dwThreadId = event.get_tid() + hProcess = event.get_process_handle() + ## if not self.has_process(dwProcessId): # XXX this would trigger a scan + if dwProcessId not in self.__processDict: + aProcess = Process(dwProcessId, hProcess) + self._add_process(aProcess) + aProcess.fileName = event.get_filename() + else: + aProcess = self.get_process(dwProcessId) + # if hProcess != win32.INVALID_HANDLE_VALUE: + # aProcess.hProcess = hProcess # may have more privileges + if not aProcess.fileName: + fileName = event.get_filename() + if fileName: + aProcess.fileName = fileName + return aProcess._notify_create_process(event) # pass it to the process + + def _notify_exit_process(self, event): + """ + Notify the termination of a process. + + This is done automatically by the L{Debug} class, you shouldn't need + to call it yourself. + + @type event: L{ExitProcessEvent} + @param event: Exit process event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + dwProcessId = event.get_pid() + ## if self.has_process(dwProcessId): # XXX this would trigger a scan + if dwProcessId in self.__processDict: + self._del_process(dwProcessId) + return True diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/registry.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/registry.py new file mode 100644 index 0000000..7a8b38e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/registry.py @@ -0,0 +1,696 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Registry access. + +@group Instrumentation: + Registry, RegistryKey +""" + +from __future__ import with_statement + +__revision__ = "$Id$" + +__all__ = ["Registry"] + +import sys +from winappdbg import win32 +from winappdbg import compat +import collections +import warnings + +# ============================================================================== + + +class _RegistryContainer(object): + """ + Base class for L{Registry} and L{RegistryKey}. + """ + + # Dummy object to detect empty arguments. + class __EmptyArgument: + pass + + __emptyArgument = __EmptyArgument() + + def __init__(self): + self.__default = None + + def has_key(self, name): + return name in self + + def get(self, name, default=__emptyArgument): + try: + return self[name] + except KeyError: + if default is RegistryKey.__emptyArgument: + return self.__default + return default + + def setdefault(self, default): + self.__default = default + + def __iter__(self): + return compat.iterkeys(self) + + +# ============================================================================== + + +class RegistryKey(_RegistryContainer): + """ + Exposes a single Windows Registry key as a dictionary-like object. + + @see: L{Registry} + + @type path: str + @ivar path: Registry key path. + + @type handle: L{win32.RegistryKeyHandle} + @ivar handle: Registry key handle. + """ + + def __init__(self, path, handle): + """ + @type path: str + @param path: Registry key path. + + @type handle: L{win32.RegistryKeyHandle} + @param handle: Registry key handle. + """ + super(RegistryKey, self).__init__() + if path.endswith("\\"): + path = path[:-1] + self._path = path + self._handle = handle + + @property + def path(self): + return self._path + + @property + def handle(self): + # if not self._handle: + # msg = "This Registry key handle has already been closed." + # raise RuntimeError(msg) + return self._handle + + # def close(self): + # """ + # Close the Registry key handle, freeing its resources. It cannot be + # used again after calling this method. + # + # @note: This method will be called automatically by the garbage + # collector, and upon exiting a "with" block. + # + # @raise RuntimeError: This Registry key handle has already been closed. + # """ + # self.handle.close() + # + # def __enter__(self): + # """ + # Compatibility with the "C{with}" Python statement. + # """ + # return self + # + # def __exit__(self, type, value, traceback): + # """ + # Compatibility with the "C{with}" Python statement. + # """ + # try: + # self.close() + # except Exception: + # pass + + def __contains__(self, name): + try: + win32.RegQueryValueEx(self.handle, name, False) + return True + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_FILE_NOT_FOUND: + return False + raise + + def __getitem__(self, name): + try: + return win32.RegQueryValueEx(self.handle, name)[0] + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_FILE_NOT_FOUND: + raise KeyError(name) + raise + + def __setitem__(self, name, value): + win32.RegSetValueEx(self.handle, name, value) + + def __delitem__(self, name): + win32.RegDeleteValue(self.handle, name) + + def iterkeys(self): + handle = self.handle + index = 0 + while 1: + resp = win32.RegEnumValue(handle, index, False) + if resp is None: + break + yield resp[0] + index += 1 + + def itervalues(self): + handle = self.handle + index = 0 + while 1: + resp = win32.RegEnumValue(handle, index) + if resp is None: + break + yield resp[2] + index += 1 + + def iteritems(self): + handle = self.handle + index = 0 + while 1: + resp = win32.RegEnumValue(handle, index) + if resp is None: + break + yield resp[0], resp[2] + index += 1 + + def keys(self): + # return list(self.iterkeys()) # that can't be optimized by psyco + handle = self.handle + keys = list() + index = 0 + while 1: + resp = win32.RegEnumValue(handle, index, False) + if resp is None: + break + keys.append(resp[0]) + index += 1 + return keys + + def values(self): + # return list(self.itervalues()) # that can't be optimized by psyco + handle = self.handle + values = list() + index = 0 + while 1: + resp = win32.RegEnumValue(handle, index) + if resp is None: + break + values.append(resp[2]) + index += 1 + return values + + def items(self): + # return list(self.iteritems()) # that can't be optimized by psyco + handle = self.handle + items = list() + index = 0 + while 1: + resp = win32.RegEnumValue(handle, index) + if resp is None: + break + items.append((resp[0], resp[2])) + index += 1 + return items + + def get_value_type(self, name): + """ + Retrieves the low-level data type for the given value. + + @type name: str + @param name: Registry value name. + + @rtype: int + @return: One of the following constants: + - L{win32.REG_NONE} (0) + - L{win32.REG_SZ} (1) + - L{win32.REG_EXPAND_SZ} (2) + - L{win32.REG_BINARY} (3) + - L{win32.REG_DWORD} (4) + - L{win32.REG_DWORD_BIG_ENDIAN} (5) + - L{win32.REG_LINK} (6) + - L{win32.REG_MULTI_SZ} (7) + - L{win32.REG_RESOURCE_LIST} (8) + - L{win32.REG_FULL_RESOURCE_DESCRIPTOR} (9) + - L{win32.REG_RESOURCE_REQUIREMENTS_LIST} (10) + - L{win32.REG_QWORD} (11) + + @raise KeyError: The specified value could not be found. + """ + try: + return win32.RegQueryValueEx(self.handle, name)[1] + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_FILE_NOT_FOUND: + raise KeyError(name) + raise + + def clear(self): + handle = self.handle + while 1: + resp = win32.RegEnumValue(handle, 0, False) + if resp is None: + break + win32.RegDeleteValue(handle, resp[0]) + + def __str__(self): + default = self[""] + return str(default) + + def __unicode__(self): + default = self[""] + return compat.unicode(default) + + def __repr__(self): + return '' % self._path + + def iterchildren(self): + """ + Iterates the subkeys for this Registry key. + + @rtype: iter of L{RegistryKey} + @return: Iterator of subkeys. + """ + handle = self.handle + index = 0 + while 1: + subkey = win32.RegEnumKey(handle, index) + if subkey is None: + break + yield self.child(subkey) + index += 1 + + def children(self): + """ + Returns a list of subkeys for this Registry key. + + @rtype: list(L{RegistryKey}) + @return: List of subkeys. + """ + # return list(self.iterchildren()) # that can't be optimized by psyco + handle = self.handle + result = [] + index = 0 + while 1: + subkey = win32.RegEnumKey(handle, index) + if subkey is None: + break + result.append(self.child(subkey)) + index += 1 + return result + + def child(self, subkey): + """ + Retrieves a subkey for this Registry key, given its name. + + @type subkey: str + @param subkey: Name of the subkey. + + @rtype: L{RegistryKey} + @return: Subkey. + """ + path = self._path + "\\" + subkey + handle = win32.RegOpenKey(self.handle, subkey) + return RegistryKey(path, handle) + + def flush(self): + """ + Flushes changes immediately to disk. + + This method is normally not needed, as the Registry writes changes + to disk by itself. This mechanism is provided to ensure the write + happens immediately, as opposed to whenever the OS wants to. + + @warn: Calling this method too often may degrade performance. + """ + win32.RegFlushKey(self.handle) + + +# ============================================================================== + +# TODO: possibly cache the RegistryKey objects +# to avoid opening and closing handles many times on code sequences like this: +# +# r = Registry() +# r['HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Run']['Example 1'] = 'example1.exe' +# r['HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Run']['Example 2'] = 'example2.exe' +# r['HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Run']['Example 3'] = 'example3.exe' + +# TODO: support for access flags? +# TODO: should be possible to disable the safety checks (see __delitem__) + +# TODO: workaround for an API bug described by a user in MSDN +# +# http://msdn.microsoft.com/en-us/library/windows/desktop/aa379776(v=vs.85).aspx +# +# Apparently RegDeleteTree won't work remotely from Win7 to WinXP, and the only +# solution is to recursively call RegDeleteKey. + + +class Registry(_RegistryContainer): + """ + Exposes the Windows Registry as a Python container. + + @type machine: str or None + @ivar machine: For a remote Registry, the machine name. + For a local Registry, the value is C{None}. + """ + + _hives_by_name = { + # Short names + "HKCR": win32.HKEY_CLASSES_ROOT, + "HKCU": win32.HKEY_CURRENT_USER, + "HKLM": win32.HKEY_LOCAL_MACHINE, + "HKU": win32.HKEY_USERS, + "HKPD": win32.HKEY_PERFORMANCE_DATA, + "HKCC": win32.HKEY_CURRENT_CONFIG, + # Long names + "HKEY_CLASSES_ROOT": win32.HKEY_CLASSES_ROOT, + "HKEY_CURRENT_USER": win32.HKEY_CURRENT_USER, + "HKEY_LOCAL_MACHINE": win32.HKEY_LOCAL_MACHINE, + "HKEY_USERS": win32.HKEY_USERS, + "HKEY_PERFORMANCE_DATA": win32.HKEY_PERFORMANCE_DATA, + "HKEY_CURRENT_CONFIG": win32.HKEY_CURRENT_CONFIG, + } + + _hives_by_value = { + win32.HKEY_CLASSES_ROOT: "HKEY_CLASSES_ROOT", + win32.HKEY_CURRENT_USER: "HKEY_CURRENT_USER", + win32.HKEY_LOCAL_MACHINE: "HKEY_LOCAL_MACHINE", + win32.HKEY_USERS: "HKEY_USERS", + win32.HKEY_PERFORMANCE_DATA: "HKEY_PERFORMANCE_DATA", + win32.HKEY_CURRENT_CONFIG: "HKEY_CURRENT_CONFIG", + } + + _hives = sorted(compat.itervalues(_hives_by_value)) + + def __init__(self, machine=None): + """ + Opens a local or remote registry. + + @type machine: str + @param machine: Optional machine name. If C{None} it opens the local + registry. + """ + self._machine = machine + self._remote_hives = {} + + @property + def machine(self): + return self._machine + + def _split_path(self, path): + """ + Splits a Registry path and returns the hive and key. + + @type path: str + @param path: Registry path. + + @rtype: tuple( int, str ) + @return: Tuple containing the hive handle and the subkey path. + The hive handle is always one of the following integer constants: + - L{win32.HKEY_CLASSES_ROOT} + - L{win32.HKEY_CURRENT_USER} + - L{win32.HKEY_LOCAL_MACHINE} + - L{win32.HKEY_USERS} + - L{win32.HKEY_PERFORMANCE_DATA} + - L{win32.HKEY_CURRENT_CONFIG} + """ + if "\\" in path: + p = path.find("\\") + hive = path[:p] + path = path[p + 1 :] + else: + hive = path + path = None + handle = self._hives_by_name[hive.upper()] + return handle, path + + def _parse_path(self, path): + """ + Parses a Registry path and returns the hive and key. + + @type path: str + @param path: Registry path. + + @rtype: tuple( int, str ) + @return: Tuple containing the hive handle and the subkey path. + For a local Registry, the hive handle is an integer. + For a remote Registry, the hive handle is a L{RegistryKeyHandle}. + """ + handle, path = self._split_path(path) + if self._machine is not None: + handle = self._connect_hive(handle) + return handle, path + + def _join_path(self, hive, subkey): + """ + Joins the hive and key to make a Registry path. + + @type hive: int + @param hive: Registry hive handle. + The hive handle must be one of the following integer constants: + - L{win32.HKEY_CLASSES_ROOT} + - L{win32.HKEY_CURRENT_USER} + - L{win32.HKEY_LOCAL_MACHINE} + - L{win32.HKEY_USERS} + - L{win32.HKEY_PERFORMANCE_DATA} + - L{win32.HKEY_CURRENT_CONFIG} + + @type subkey: str + @param subkey: Subkey path. + + @rtype: str + @return: Registry path. + """ + path = self._hives_by_value[hive] + if subkey: + path = path + "\\" + subkey + return path + + def _sanitize_path(self, path): + """ + Sanitizes the given Registry path. + + @type path: str + @param path: Registry path. + + @rtype: str + @return: Registry path. + """ + return self._join_path(*self._split_path(path)) + + def _connect_hive(self, hive): + """ + Connect to the specified hive of a remote Registry. + + @note: The connection will be cached, to close all connections and + erase this cache call the L{close} method. + + @type hive: int + @param hive: Hive to connect to. + + @rtype: L{win32.RegistryKeyHandle} + @return: Open handle to the remote Registry hive. + """ + try: + handle = self._remote_hives[hive] + except KeyError: + handle = win32.RegConnectRegistry(self._machine, hive) + self._remote_hives[hive] = handle + return handle + + def close(self): + """ + Closes all open connections to the remote Registry. + + No exceptions are raised, even if an error occurs. + + This method has no effect when opening the local Registry. + + The remote Registry will still be accessible after calling this method + (new connections will be opened automatically on access). + """ + while self._remote_hives: + hive = self._remote_hives.popitem()[1] + try: + hive.close() + except Exception: + try: + e = sys.exc_info()[1] + msg = "Cannot close registry hive handle %s, reason: %s" + msg %= (hive.value, str(e)) + warnings.warn(msg) + except Exception: + pass + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + + def __repr__(self): + if self._machine: + return '' % self._machine + return "" + + def __contains__(self, path): + hive, subpath = self._parse_path(path) + try: + with win32.RegOpenKey(hive, subpath): + return True + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_FILE_NOT_FOUND: + return False + raise + + def __getitem__(self, path): + path = self._sanitize_path(path) + hive, subpath = self._parse_path(path) + try: + handle = win32.RegOpenKey(hive, subpath) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_FILE_NOT_FOUND: + raise KeyError(path) + raise + return RegistryKey(path, handle) + + def __setitem__(self, path, value): + do_copy = isinstance(value, RegistryKey) + if not do_copy and not isinstance(value, str) and not isinstance(value, compat.unicode): + if isinstance(value, object): + t = value.__class__.__name__ + else: + t = type(value) + raise TypeError("Expected string or RegistryKey, got %s" % t) + hive, subpath = self._parse_path(path) + with win32.RegCreateKey(hive, subpath) as handle: + if do_copy: + win32.RegCopyTree(value.handle, None, handle) + else: + win32.RegSetValueEx(handle, None, value) + + # XXX FIXME currently not working! + # It's probably best to call RegDeleteKey recursively, even if slower. + def __delitem__(self, path): + hive, subpath = self._parse_path(path) + if not subpath: + raise TypeError("Are you SURE you want to wipe out an entire hive?!" " Call win32.RegDeleteTree() directly if you must...") + try: + win32.RegDeleteTree(hive, subpath) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror == win32.ERROR_FILE_NOT_FOUND: + raise KeyError(path) + raise + + def create(self, path): + """ + Creates a new Registry key. + + @type path: str + @param path: Registry key path. + + @rtype: L{RegistryKey} + @return: The newly created Registry key. + """ + path = self._sanitize_path(path) + hive, subpath = self._parse_path(path) + handle = win32.RegCreateKey(hive, subpath) + return RegistryKey(path, handle) + + def subkeys(self, path): + """ + Returns a list of subkeys for the given Registry key. + + @type path: str + @param path: Registry key path. + + @rtype: list(str) + @return: List of subkey names. + """ + result = list() + hive, subpath = self._parse_path(path) + with win32.RegOpenKey(hive, subpath) as handle: + index = 0 + while 1: + name = win32.RegEnumKey(handle, index) + if name is None: + break + result.append(name) + index += 1 + return result + + def iterate(self, path): + """ + Returns a recursive iterator on the specified key and its subkeys. + + @type path: str + @param path: Registry key path. + + @rtype: iterator + @return: Recursive iterator that returns Registry key paths. + + @raise KeyError: The specified path does not exist. + """ + if path.endswith("\\"): + path = path[:-1] + if not self.has_key(path): + raise KeyError(path) + stack = collections.deque() + stack.appendleft(path) + return self.__iterate(stack) + + def iterkeys(self): + """ + Returns an iterator that crawls the entire Windows Registry. + """ + stack = collections.deque(self._hives) + stack.reverse() + return self.__iterate(stack) + + def __iterate(self, stack): + while stack: + path = stack.popleft() + yield path + try: + subkeys = self.subkeys(path) + except WindowsError: + continue + prefix = path + "\\" + subkeys = [prefix + name for name in subkeys] + stack.extendleft(subkeys) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/search.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/search.py new file mode 100644 index 0000000..de1ddeb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/search.py @@ -0,0 +1,661 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Process memory finder +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Process memory search. + +@group Memory search: + Search, + Pattern, + BytePattern, + TextPattern, + RegExpPattern, + HexPattern +""" + +__revision__ = "$Id$" + +__all__ = [ + "Search", + "Pattern", + "BytePattern", + "TextPattern", + "RegExpPattern", + "HexPattern", +] + +from winappdbg.textio import HexInput +from winappdbg.util import StaticClass, MemoryAddresses +from winappdbg import win32 + +import warnings + +try: + # http://pypi.python.org/pypi/regex + import regex as re +except ImportError: + import re + +# ============================================================================== + + +class Pattern(object): + """ + Base class for search patterns. + + The following L{Pattern} subclasses are provided by WinAppDbg: + - L{BytePattern} + - L{TextPattern} + - L{RegExpPattern} + - L{HexPattern} + + @see: L{Search.search_process} + """ + + def __init__(self, pattern): + """ + Class constructor. + + The only mandatory argument should be the pattern string. + + This method B{MUST} be reimplemented by subclasses of L{Pattern}. + """ + raise NotImplementedError() + + def __len__(self): + """ + Returns the maximum expected length of the strings matched by this + pattern. Exact behavior is implementation dependent. + + Ideally it should be an exact value, but in some cases it's not + possible to calculate so an upper limit should be returned instead. + + If that's not possible either an exception must be raised. + + This value will be used to calculate the required buffer size when + doing buffered searches. + + This method B{MUST} be reimplemented by subclasses of L{Pattern}. + """ + raise NotImplementedError() + + def read(self, process, address, size): + """ + Reads the requested number of bytes from the process memory at the + given address. + + Subclasses of L{Pattern} tipically don't need to reimplement this + method. + """ + return process.read(address, size) + + def find(self, buffer, pos=None): + """ + Searches for the pattern in the given buffer, optionally starting at + the given position within the buffer. + + This method B{MUST} be reimplemented by subclasses of L{Pattern}. + + @type buffer: str + @param buffer: Buffer to search on. + + @type pos: int + @param pos: + (Optional) Position within the buffer to start searching from. + + @rtype: tuple( int, int ) + @return: Tuple containing the following: + - Position within the buffer where a match is found, or C{-1} if + no match was found. + - Length of the matched data if a match is found, or undefined if + no match was found. + """ + raise NotImplementedError() + + def found(self, address, size, data): + """ + This method gets called when a match is found. + + This allows subclasses of L{Pattern} to filter out unwanted results, + or modify the results before giving them to the caller of + L{Search.search_process}. + + If the return value is C{None} the result is skipped. + + Subclasses of L{Pattern} don't need to reimplement this method unless + filtering is needed. + + @type address: int + @param address: The memory address where the pattern was found. + + @type size: int + @param size: The size of the data that matches the pattern. + + @type data: str + @param data: The data that matches the pattern. + + @rtype: tuple( int, int, str ) + @return: Tuple containing the following: + * The memory address where the pattern was found. + * The size of the data that matches the pattern. + * The data that matches the pattern. + """ + return (address, size, data) + + +# ------------------------------------------------------------------------------ + + +class BytePattern(Pattern): + """ + Fixed byte pattern. + + @type pattern: str + @ivar pattern: Byte string to search for. + + @type length: int + @ivar length: Length of the byte pattern. + """ + + def __init__(self, pattern): + """ + @type pattern: str + @param pattern: Byte string to search for. + """ + self.pattern = str(pattern) + self.length = len(pattern) + + def __len__(self): + """ + Returns the exact length of the pattern. + + @see: L{Pattern.__len__} + """ + return self.length + + def find(self, buffer, pos=None): + return buffer.find(self.pattern, pos), self.length + + +# ------------------------------------------------------------------------------ + +# FIXME: case insensitive compat.unicode searches are probably buggy! + + +class TextPattern(BytePattern): + """ + Text pattern. + + @type isUnicode: bool + @ivar isUnicode: C{True} if the text to search for is a compat.unicode string, + C{False} otherwise. + + @type encoding: str + @ivar encoding: Encoding for the text parameter. + Only used when the text to search for is a Unicode string. + Don't change unless you know what you're doing! + + @type caseSensitive: bool + @ivar caseSensitive: C{True} of the search is case sensitive, + C{False} otherwise. + """ + + def __init__(self, text, encoding="utf-16le", caseSensitive=False): + """ + @type text: str or compat.unicode + @param text: Text to search for. + + @type encoding: str + @param encoding: (Optional) Encoding for the text parameter. + Only used when the text to search for is a Unicode string. + Don't change unless you know what you're doing! + + @type caseSensitive: bool + @param caseSensitive: C{True} of the search is case sensitive, + C{False} otherwise. + """ + self.isUnicode = isinstance(text, compat.unicode) + self.encoding = encoding + self.caseSensitive = caseSensitive + if not self.caseSensitive: + pattern = text.lower() + if self.isUnicode: + pattern = text.encode(encoding) + super(TextPattern, self).__init__(pattern) + + def read(self, process, address, size): + data = super(TextPattern, self).read(address, size) + if not self.caseSensitive: + if self.isUnicode: + try: + encoding = self.encoding + text = data.decode(encoding, "replace") + text = text.lower() + new_data = text.encode(encoding, "replace") + if len(data) == len(new_data): + data = new_data + else: + data = data.lower() + except Exception: + data = data.lower() + else: + data = data.lower() + return data + + def found(self, address, size, data): + if self.isUnicode: + try: + data = compat.unicode(data, self.encoding) + except Exception: + ## traceback.print_exc() # XXX DEBUG + return None + return (address, size, data) + + +# ------------------------------------------------------------------------------ + + +class RegExpPattern(Pattern): + """ + Regular expression pattern. + + @type pattern: str + @ivar pattern: Regular expression in text form. + + @type flags: int + @ivar flags: Regular expression flags. + + @type regexp: re.compile + @ivar regexp: Regular expression in compiled form. + + @type maxLength: int + @ivar maxLength: + Maximum expected length of the strings matched by this regular + expression. + + This value will be used to calculate the required buffer size when + doing buffered searches. + + Ideally it should be an exact value, but in some cases it's not + possible to calculate so an upper limit should be given instead. + + If that's not possible either, C{None} should be used. That will + cause an exception to be raised if this pattern is used in a + buffered search. + """ + + def __init__(self, regexp, flags=0, maxLength=None): + """ + @type regexp: str + @param regexp: Regular expression string. + + @type flags: int + @param flags: Regular expression flags. + + @type maxLength: int + @param maxLength: Maximum expected length of the strings matched by + this regular expression. + + This value will be used to calculate the required buffer size when + doing buffered searches. + + Ideally it should be an exact value, but in some cases it's not + possible to calculate so an upper limit should be given instead. + + If that's not possible either, C{None} should be used. That will + cause an exception to be raised if this pattern is used in a + buffered search. + """ + self.pattern = regexp + self.flags = flags + self.regexp = re.compile(regexp, flags) + self.maxLength = maxLength + + def __len__(self): + """ + Returns the maximum expected length of the strings matched by this + pattern. This value is taken from the C{maxLength} argument of the + constructor if this class. + + Ideally it should be an exact value, but in some cases it's not + possible to calculate so an upper limit should be returned instead. + + If that's not possible either an exception must be raised. + + This value will be used to calculate the required buffer size when + doing buffered searches. + """ + if self.maxLength is None: + raise NotImplementedError() + return self.maxLength + + def find(self, buffer, pos=None): + if not pos: # make sure pos is an int + pos = 0 + match = self.regexp.search(buffer, pos) + if match: + start, end = match.span() + return start, end - start + return -1, 0 + + +# ------------------------------------------------------------------------------ + + +class HexPattern(RegExpPattern): + """ + Hexadecimal pattern. + + Hex patterns must be in this form:: + "68 65 6c 6c 6f 20 77 6f 72 6c 64" # "hello world" + + Spaces are optional. Capitalization of hex digits doesn't matter. + This is exactly equivalent to the previous example:: + "68656C6C6F20776F726C64" # "hello world" + + Wildcards are allowed, in the form of a C{?} sign in any hex digit:: + "5? 5? c3" # pop register / pop register / ret + "b8 ?? ?? ?? ??" # mov eax, immediate value + + @type pattern: str + @ivar pattern: Hexadecimal pattern. + """ + + def __new__(cls, pattern): + """ + If the pattern is completely static (no wildcards are present) a + L{BytePattern} is created instead. That's because searching for a + fixed byte pattern is faster than searching for a regular expression. + """ + if "?" not in pattern: + return BytePattern(HexInput.hexadecimal(pattern)) + return object.__new__(cls, pattern) + + def __init__(self, hexa): + """ + Hex patterns must be in this form:: + "68 65 6c 6c 6f 20 77 6f 72 6c 64" # "hello world" + + Spaces are optional. Capitalization of hex digits doesn't matter. + This is exactly equivalent to the previous example:: + "68656C6C6F20776F726C64" # "hello world" + + Wildcards are allowed, in the form of a C{?} sign in any hex digit:: + "5? 5? c3" # pop register / pop register / ret + "b8 ?? ?? ?? ??" # mov eax, immediate value + + @type hexa: str + @param hexa: Pattern to search for. + """ + maxLength = len([x for x in hexa if x in "?0123456789ABCDEFabcdef"]) / 2 + super(HexPattern, self).__init__(HexInput.pattern(hexa), maxLength=maxLength) + + +# ============================================================================== + + +class Search(StaticClass): + """ + Static class to group the search functionality. + + Do not instance this class! Use its static methods instead. + """ + + # TODO: aligned searches + # TODO: method to coalesce search results + # TODO: search memory dumps + # TODO: search non-ascii C strings + + @staticmethod + def search_process(process, pattern, minAddr=None, maxAddr=None, bufferPages=None, overlapping=False): + """ + Search for the given pattern within the process memory. + + @type process: L{Process} + @param process: Process to search. + + @type pattern: L{Pattern} + @param pattern: Pattern to search for. + It must be an instance of a subclass of L{Pattern}. + + The following L{Pattern} subclasses are provided by WinAppDbg: + - L{BytePattern} + - L{TextPattern} + - L{RegExpPattern} + - L{HexPattern} + + You can also write your own subclass of L{Pattern} for customized + searches. + + @type minAddr: int + @param minAddr: (Optional) Start the search at this memory address. + + @type maxAddr: int + @param maxAddr: (Optional) Stop the search at this memory address. + + @type bufferPages: int + @param bufferPages: (Optional) Number of memory pages to buffer when + performing the search. Valid values are: + - C{0} or C{None}: + Automatically determine the required buffer size. May not give + complete results for regular expressions that match variable + sized strings. + - C{> 0}: Set the buffer size, in memory pages. + - C{< 0}: Disable buffering entirely. This may give you a little + speed gain at the cost of an increased memory usage. If the + target process has very large contiguous memory regions it may + actually be slower or even fail. It's also the only way to + guarantee complete results for regular expressions that match + variable sized strings. + + @type overlapping: bool + @param overlapping: C{True} to allow overlapping results, C{False} + otherwise. + + Overlapping results yield the maximum possible number of results. + + For example, if searching for "AAAA" within "AAAAAAAA" at address + C{0x10000}, when overlapping is turned off the following matches + are yielded:: + (0x10000, 4, "AAAA") + (0x10004, 4, "AAAA") + + If overlapping is turned on, the following matches are yielded:: + (0x10000, 4, "AAAA") + (0x10001, 4, "AAAA") + (0x10002, 4, "AAAA") + (0x10003, 4, "AAAA") + (0x10004, 4, "AAAA") + + As you can see, the middle results are overlapping the last two. + + @rtype: iterator of tuple( int, int, str ) + @return: An iterator of tuples. Each tuple contains the following: + - The memory address where the pattern was found. + - The size of the data that matches the pattern. + - The data that matches the pattern. + + @raise WindowsError: An error occurred when querying or reading the + process memory. + """ + + # Do some namespace lookups of symbols we'll be using frequently. + MEM_COMMIT = win32.MEM_COMMIT + PAGE_GUARD = win32.PAGE_GUARD + page = MemoryAddresses.pageSize + read = pattern.read + find = pattern.find + + # Calculate the address range. + if minAddr is None: + minAddr = 0 + if maxAddr is None: + maxAddr = win32.LPVOID(-1).value # XXX HACK + + # Calculate the buffer size from the number of pages. + if bufferPages is None: + try: + size = MemoryAddresses.align_address_to_page_end(len(pattern)) + page + except NotImplementedError: + size = None + elif bufferPages > 0: + size = page * (bufferPages + 1) + else: + size = None + + # Get the memory map of the process. + memory_map = process.iter_memory_map(minAddr, maxAddr) + + # Perform search with buffering enabled. + if size: + # Loop through all memory blocks containing data. + buffer = "" # buffer to hold the memory data + prev_addr = 0 # previous memory block address + last = 0 # position of the last match + delta = 0 # delta of last read address and start of buffer + for mbi in memory_map: + # Skip blocks with no data to search on. + if not mbi.has_content(): + continue + + # Get the address and size of this block. + address = mbi.BaseAddress # current address to search on + block_size = mbi.RegionSize # total size of the block + if address >= maxAddr: + break + end = address + block_size # end address of the block + + # If the block is contiguous to the previous block, + # coalesce the new data in the buffer. + if delta and address == prev_addr: + buffer += read(process, address, page) + + # If not, clear the buffer and read new data. + else: + buffer = read(process, address, min(size, block_size)) + last = 0 + delta = 0 + + # Search for the pattern in this block. + while 1: + # Yield each match of the pattern in the buffer. + pos, length = find(buffer, last) + while pos >= last: + match_addr = address + pos - delta + if minAddr <= match_addr < maxAddr: + result = pattern.found(match_addr, length, buffer[pos : pos + length]) + if result is not None: + yield result + if overlapping: + last = pos + 1 + else: + last = pos + length + pos, length = find(buffer, last) + + # Advance to the next page. + address = address + page + block_size = block_size - page + prev_addr = address + + # Fix the position of the last match. + last = last - page + if last < 0: + last = 0 + + # Remove the first page in the buffer. + buffer = buffer[page:] + delta = page + + # If we haven't reached the end of the block yet, + # read the next page in the block and keep seaching. + if address < end: + buffer = buffer + read(process, address, page) + + # Otherwise, we're done searching this block. + else: + break + + # Perform search with buffering disabled. + else: + # Loop through all memory blocks containing data. + for mbi in memory_map: + # Skip blocks with no data to search on. + if not mbi.has_content(): + continue + + # Get the address and size of this block. + address = mbi.BaseAddress + block_size = mbi.RegionSize + if address >= maxAddr: + break + + # Read the whole memory region. + buffer = process.read(address, block_size) + + # Search for the pattern in this region. + pos, length = find(buffer) + last = 0 + while pos >= last: + match_addr = address + pos + if minAddr <= match_addr < maxAddr: + result = pattern.found(match_addr, length, buffer[pos : pos + length]) + if result is not None: + yield result + if overlapping: + last = pos + 1 + else: + last = pos + length + pos, length = find(buffer, last) + + @classmethod + def extract_ascii_strings(cls, process, minSize=4, maxSize=1024): + """ + Extract ASCII strings from the process memory. + + @type process: L{Process} + @param process: Process to search. + + @type minSize: int + @param minSize: (Optional) Minimum size of the strings to search for. + + @type maxSize: int + @param maxSize: (Optional) Maximum size of the strings to search for. + + @rtype: iterator of tuple(int, int, str) + @return: Iterator of strings extracted from the process memory. + Each tuple contains the following: + - The memory address where the string was found. + - The size of the string. + - The string. + """ + regexp = r"[\s\w\!\@\#\$\%%\^\&\*\(\)\{\}\[\]\~\`\'\"\:\;\.\,\\\/\-\+\=\_\<\>]{%d,%d}\0" % (minSize, maxSize) + pattern = RegExpPattern(regexp, 0, maxSize) + return cls.search_process(process, pattern, overlapping=False) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/sql.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/sql.py new file mode 100644 index 0000000..50d7455 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/sql.py @@ -0,0 +1,981 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +SQL database storage support. + +@group Crash reporting: + CrashDAO +""" + +__revision__ = "$Id$" + +__all__ = ["CrashDAO"] + +import sqlite3 +import datetime +import warnings + +from sqlalchemy import create_engine, Column, ForeignKey, Sequence +from sqlalchemy.engine.url import URL +from sqlalchemy.ext.compiler import compiles +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.interfaces import PoolListener +from sqlalchemy.orm import sessionmaker, deferred +from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound +from sqlalchemy.types import Integer, BigInteger, Boolean, DateTime, String, LargeBinary, Enum, VARCHAR +from sqlalchemy.sql.expression import asc, desc + +from crash import Crash, Marshaller, pickle, HIGHEST_PROTOCOL +from textio import CrashDump +import win32 + +# ------------------------------------------------------------------------------ + +try: + from decorator import decorator +except ImportError: + import functools + + def decorator(w): + """ + The C{decorator} module was not found. You can install it from: + U{http://pypi.python.org/pypi/decorator/} + """ + + def d(fn): + @functools.wraps(fn) + def x(*argv, **argd): + return w(fn, *argv, **argd) + + return x + + return d + +# ------------------------------------------------------------------------------ + + +@compiles(String, "mysql") +@compiles(VARCHAR, "mysql") +def _compile_varchar_mysql(element, compiler, **kw): + """MySQL hack to avoid the "VARCHAR requires a length" error.""" + if not element.length or element.length == "max": + return "TEXT" + else: + return compiler.visit_VARCHAR(element, **kw) + + +# ------------------------------------------------------------------------------ + + +class _SQLitePatch(PoolListener): + """ + Used internally by L{BaseDAO}. + + After connecting to an SQLite database, ensure that the foreign keys + support is enabled. If not, abort the connection. + + @see: U{http://sqlite.org/foreignkeys.html} + """ + + def connect(dbapi_connection, connection_record): + """ + Called once by SQLAlchemy for each new SQLite DB-API connection. + + Here is where we issue some PRAGMA statements to configure how we're + going to access the SQLite database. + + @param dbapi_connection: + A newly connected raw SQLite DB-API connection. + + @param connection_record: + Unused by this method. + """ + try: + cursor = dbapi_connection.cursor() + try: + cursor.execute("PRAGMA foreign_keys = ON;") + cursor.execute("PRAGMA foreign_keys;") + if cursor.fetchone()[0] != 1: + raise Exception() + finally: + cursor.close() + except Exception: + dbapi_connection.close() + raise sqlite3.Error() + + +# ------------------------------------------------------------------------------ + + +class BaseDTO(object): + """ + Customized declarative base for SQLAlchemy. + """ + + __table_args__ = { + # Don't use MyISAM in MySQL. It doesn't support ON DELETE CASCADE. + "mysql_engine": "InnoDB", + # Don't use BlitzDB in Drizzle. It doesn't support foreign keys. + "drizzle_engine": "InnoDB", + # Collate to UTF-8. + "mysql_charset": "utf8", + } + + +BaseDTO = declarative_base(cls=BaseDTO) + +# ------------------------------------------------------------------------------ + +# TODO: if using mssql, check it's at least SQL Server 2005 +# (LIMIT and OFFSET support is required). +# TODO: if using mysql, check it's at least MySQL 5.0.3 +# (nested transactions are required). +# TODO: maybe in mysql check the tables are not myisam? +# TODO: maybe create the database if it doesn't exist? +# TODO: maybe add a method to compact the database? +# http://stackoverflow.com/questions/1875885 +# http://www.sqlite.org/lang_vacuum.html +# http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html +# http://msdn.microsoft.com/en-us/library/ms174459(v=sql.90).aspx + + +class BaseDAO(object): + """ + Data Access Object base class. + + @type _url: sqlalchemy.url.URL + @ivar _url: Database connection URL. + + @type _dialect: str + @ivar _dialect: SQL dialect currently being used. + + @type _driver: str + @ivar _driver: Name of the database driver currently being used. + To get the actual Python module use L{_url}.get_driver() instead. + + @type _session: sqlalchemy.orm.Session + @ivar _session: Database session object. + + @type _new_session: class + @cvar _new_session: Custom configured Session class used to create the + L{_session} instance variable. + + @type _echo: bool + @cvar _echo: Set to C{True} to print all SQL queries to standard output. + """ + + _echo = False + + _new_session = sessionmaker(autoflush=True, autocommit=True, expire_on_commit=True, weak_identity_map=True) + + def __init__(self, url, creator=None): + """ + Connect to the database using the given connection URL. + + The current implementation uses SQLAlchemy and so it will support + whatever database said module supports. + + @type url: str + @param url: + URL that specifies the database to connect to. + + Some examples: + - Opening an SQLite file: + C{dao = CrashDAO("sqlite:///C:\\some\\path\\database.sqlite")} + - Connecting to a locally installed SQL Express database: + C{dao = CrashDAO("mssql://.\\SQLEXPRESS/Crashes?trusted_connection=yes")} + - Connecting to a MySQL database running locally, using the + C{oursql} library, authenticating as the "winappdbg" user with + no password: + C{dao = CrashDAO("mysql+oursql://winappdbg@localhost/Crashes")} + - Connecting to a Postgres database running locally, + authenticating with user and password: + C{dao = CrashDAO("postgresql://winappdbg:winappdbg@localhost/Crashes")} + + For more information see the C{SQLAlchemy} documentation online: + U{http://docs.sqlalchemy.org/en/latest/core/engines.html} + + Note that in all dialects except for SQLite the database + must already exist. The tables schema, however, is created + automatically when connecting for the first time. + + To create the database in MSSQL, you can use the + U{SQLCMD} + command:: + sqlcmd -Q "CREATE DATABASE Crashes" + + In MySQL you can use something like the following:: + mysql -u root -e "CREATE DATABASE Crashes;" + + And in Postgres:: + createdb Crashes -h localhost -U winappdbg -p winappdbg -O winappdbg + + Some small changes to the schema may be tolerated (for example, + increasing the maximum length of string columns, or adding new + columns with default values). Of course, it's best to test it + first before making changes in a live database. This all depends + very much on the SQLAlchemy version you're using, but it's best + to use the latest version always. + + @type creator: callable + @param creator: (Optional) Callback function that creates the SQL + database connection. + + Normally it's not necessary to use this argument. However in some + odd cases you may need to customize the database connection. + """ + + # Parse the connection URL. + parsed_url = URL(url) + schema = parsed_url.drivername + if "+" in schema: + dialect, driver = schema.split("+") + else: + dialect, driver = schema, "base" + dialect = dialect.strip().lower() + driver = driver.strip() + + # Prepare the database engine arguments. + arguments = {"echo": self._echo} + if dialect == "sqlite": + arguments["module"] = sqlite3.dbapi2 + arguments["listeners"] = [_SQLitePatch()] + if creator is not None: + arguments["creator"] = creator + + # Load the database engine. + engine = create_engine(url, **arguments) + + # Create a new session. + session = self._new_session(bind=engine) + + # Create the required tables if they don't exist. + BaseDTO.metadata.create_all(engine) + # TODO: create a dialect specific index on the "signature" column. + + # Set the instance properties. + self._url = parsed_url + self._driver = driver + self._dialect = dialect + self._session = session + + def _transactional(self, method, *argv, **argd): + """ + Begins a transaction and calls the given DAO method. + + If the method executes successfully the transaction is commited. + + If the method fails, the transaction is rolled back. + + @type method: callable + @param method: Bound method of this class or one of its subclasses. + The first argument will always be C{self}. + + @return: The return value of the method call. + + @raise Exception: Any exception raised by the method. + """ + self._session.begin(subtransactions=True) + try: + result = method(self, *argv, **argd) + self._session.commit() + return result + except: + self._session.rollback() + raise + + +# ------------------------------------------------------------------------------ + + +@decorator +def Transactional(fn, self, *argv, **argd): + """ + Decorator that wraps DAO methods to handle transactions automatically. + + It may only work with subclasses of L{BaseDAO}. + """ + return self._transactional(fn, *argv, **argd) + + +# ============================================================================== + + +# Generates all possible memory access flags. +def _gen_valid_access_flags(): + f = [] + for a1 in ("---", "R--", "RW-", "RC-", "--X", "R-X", "RWX", "RCX", "???"): + for a2 in ("G", "-"): + for a3 in ("N", "-"): + for a4 in ("W", "-"): + f.append("%s %s%s%s" % (a1, a2, a3, a4)) + return tuple(f) + + +_valid_access_flags = _gen_valid_access_flags() + +# Enumerated types for the memory table. +n_MEM_ACCESS_ENUM = {"name": "MEM_ACCESS_ENUM"} +n_MEM_ALLOC_ACCESS_ENUM = {"name": "MEM_ALLOC_ACCESS_ENUM"} +MEM_ACCESS_ENUM = Enum(*_valid_access_flags, **n_MEM_ACCESS_ENUM) +MEM_ALLOC_ACCESS_ENUM = Enum(*_valid_access_flags, **n_MEM_ALLOC_ACCESS_ENUM) +MEM_STATE_ENUM = Enum("Reserved", "Commited", "Free", "Unknown", name="MEM_STATE_ENUM") +MEM_TYPE_ENUM = Enum("Image", "Mapped", "Private", "Unknown", name="MEM_TYPE_ENUM") + +# Cleanup the namespace. +del _gen_valid_access_flags +del _valid_access_flags +del n_MEM_ACCESS_ENUM +del n_MEM_ALLOC_ACCESS_ENUM + +# ------------------------------------------------------------------------------ + + +class MemoryDTO(BaseDTO): + """ + Database mapping for memory dumps. + """ + + # Declare the table mapping. + __tablename__ = "memory" + id = Column(Integer, Sequence(__tablename__ + "_seq"), primary_key=True, autoincrement=True) + crash_id = Column(Integer, ForeignKey("crashes.id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) + address = Column(BigInteger, nullable=False, index=True) + size = Column(BigInteger, nullable=False) + state = Column(MEM_STATE_ENUM, nullable=False) + access = Column(MEM_ACCESS_ENUM) + type = Column(MEM_TYPE_ENUM) + alloc_base = Column(BigInteger) + alloc_access = Column(MEM_ALLOC_ACCESS_ENUM) + filename = Column(String) + content = deferred(Column(LargeBinary)) + + def __init__(self, crash_id, mbi): + """ + Process a L{win32.MemoryBasicInformation} object for database storage. + """ + + # Crash ID. + self.crash_id = crash_id + + # Address. + self.address = mbi.BaseAddress + + # Size. + self.size = mbi.RegionSize + + # State (free or allocated). + if mbi.State == win32.MEM_RESERVE: + self.state = "Reserved" + elif mbi.State == win32.MEM_COMMIT: + self.state = "Commited" + elif mbi.State == win32.MEM_FREE: + self.state = "Free" + else: + self.state = "Unknown" + + # Page protection bits (R/W/X/G). + if mbi.State != win32.MEM_COMMIT: + self.access = None + else: + self.access = self._to_access(mbi.Protect) + + # Type (file mapping, executable image, or private memory). + if mbi.Type == win32.MEM_IMAGE: + self.type = "Image" + elif mbi.Type == win32.MEM_MAPPED: + self.type = "Mapped" + elif mbi.Type == win32.MEM_PRIVATE: + self.type = "Private" + elif mbi.Type == 0: + self.type = None + else: + self.type = "Unknown" + + # Allocation info. + self.alloc_base = mbi.AllocationBase + if not mbi.AllocationProtect: + self.alloc_access = None + else: + self.alloc_access = self._to_access(mbi.AllocationProtect) + + # Filename (for memory mappings). + try: + self.filename = mbi.filename + except AttributeError: + self.filename = None + + # Memory contents. + try: + self.content = mbi.content + except AttributeError: + self.content = None + + def _to_access(self, protect): + if protect & win32.PAGE_NOACCESS: + access = "--- " + elif protect & win32.PAGE_READONLY: + access = "R-- " + elif protect & win32.PAGE_READWRITE: + access = "RW- " + elif protect & win32.PAGE_WRITECOPY: + access = "RC- " + elif protect & win32.PAGE_EXECUTE: + access = "--X " + elif protect & win32.PAGE_EXECUTE_READ: + access = "R-X " + elif protect & win32.PAGE_EXECUTE_READWRITE: + access = "RWX " + elif protect & win32.PAGE_EXECUTE_WRITECOPY: + access = "RCX " + else: + access = "??? " + if protect & win32.PAGE_GUARD: + access += "G" + else: + access += "-" + if protect & win32.PAGE_NOCACHE: + access += "N" + else: + access += "-" + if protect & win32.PAGE_WRITECOMBINE: + access += "W" + else: + access += "-" + return access + + def toMBI(self, getMemoryDump=False): + """ + Returns a L{win32.MemoryBasicInformation} object using the data + retrieved from the database. + + @type getMemoryDump: bool + @param getMemoryDump: (Optional) If C{True} retrieve the memory dump. + Defaults to C{False} since this may be a costly operation. + + @rtype: L{win32.MemoryBasicInformation} + @return: Memory block information. + """ + mbi = win32.MemoryBasicInformation() + mbi.BaseAddress = self.address + mbi.RegionSize = self.size + mbi.State = self._parse_state(self.state) + mbi.Protect = self._parse_access(self.access) + mbi.Type = self._parse_type(self.type) + if self.alloc_base is not None: + mbi.AllocationBase = self.alloc_base + else: + mbi.AllocationBase = mbi.BaseAddress + if self.alloc_access is not None: + mbi.AllocationProtect = self._parse_access(self.alloc_access) + else: + mbi.AllocationProtect = mbi.Protect + if self.filename is not None: + mbi.filename = self.filename + if getMemoryDump and self.content is not None: + mbi.content = self.content + return mbi + + @staticmethod + def _parse_state(state): + if state: + if state == "Reserved": + return win32.MEM_RESERVE + if state == "Commited": + return win32.MEM_COMMIT + if state == "Free": + return win32.MEM_FREE + return 0 + + @staticmethod + def _parse_type(type): + if type: + if type == "Image": + return win32.MEM_IMAGE + if type == "Mapped": + return win32.MEM_MAPPED + if type == "Private": + return win32.MEM_PRIVATE + return -1 + return 0 + + @staticmethod + def _parse_access(access): + if not access: + return 0 + perm = access[:3] + if perm == "R--": + protect = win32.PAGE_READONLY + elif perm == "RW-": + protect = win32.PAGE_READWRITE + elif perm == "RC-": + protect = win32.PAGE_WRITECOPY + elif perm == "--X": + protect = win32.PAGE_EXECUTE + elif perm == "R-X": + protect = win32.PAGE_EXECUTE_READ + elif perm == "RWX": + protect = win32.PAGE_EXECUTE_READWRITE + elif perm == "RCX": + protect = win32.PAGE_EXECUTE_WRITECOPY + else: + protect = win32.PAGE_NOACCESS + if access[5] == "G": + protect = protect | win32.PAGE_GUARD + if access[6] == "N": + protect = protect | win32.PAGE_NOCACHE + if access[7] == "W": + protect = protect | win32.PAGE_WRITECOMBINE + return protect + + +# ------------------------------------------------------------------------------ + + +class CrashDTO(BaseDTO): + """ + Database mapping for crash dumps. + """ + + # Table name. + __tablename__ = "crashes" + + # Primary key. + id = Column(Integer, Sequence(__tablename__ + "_seq"), primary_key=True, autoincrement=True) + + # Timestamp. + timestamp = Column(DateTime, nullable=False, index=True) + + # Exploitability test. + exploitable = Column(Integer, nullable=False) + exploitability_rule = Column(String(32), nullable=False) + exploitability_rating = Column(String(32), nullable=False) + exploitability_desc = Column(String, nullable=False) + + # Platform description. + os = Column(String(32), nullable=False) + arch = Column(String(16), nullable=False) + bits = Column(Integer, nullable=False) # Integer(4) is deprecated :( + + # Event description. + event = Column(String, nullable=False) + pid = Column(Integer, nullable=False) + tid = Column(Integer, nullable=False) + pc = Column(BigInteger, nullable=False) + sp = Column(BigInteger, nullable=False) + fp = Column(BigInteger, nullable=False) + pc_label = Column(String, nullable=False) + + # Exception description. + exception = Column(String(64)) + exception_text = Column(String(64)) + exception_address = Column(BigInteger) + exception_label = Column(String) + first_chance = Column(Boolean) + fault_type = Column(Integer) + fault_address = Column(BigInteger) + fault_label = Column(String) + fault_disasm = Column(String) + stack_trace = Column(String) + + # Environment description. + command_line = Column(String) + environment = Column(String) + + # Debug strings. + debug_string = Column(String) + + # Notes. + notes = Column(String) + + # Heuristic signature. + signature = Column(String, nullable=False) + + # Pickled Crash object, minus the memory dump. + data = deferred(Column(LargeBinary, nullable=False)) + + def __init__(self, crash): + """ + @type crash: Crash + @param crash: L{Crash} object to store into the database. + """ + + # Timestamp and signature. + self.timestamp = datetime.datetime.fromtimestamp(crash.timeStamp) + self.signature = pickle.dumps(crash.signature, protocol=0) + + # Marshalled Crash object, minus the memory dump. + # This code is *not* thread safe! + memoryMap = crash.memoryMap + try: + crash.memoryMap = None + self.data = buffer(Marshaller.dumps(crash)) + finally: + crash.memoryMap = memoryMap + + # Exploitability test. + self.exploitability_rating, self.exploitability_rule, self.exploitability_desc = crash.isExploitable() + + # Exploitability test as an integer result (for sorting). + self.exploitable = [ + "Not an exception", + "Not exploitable", + "Not likely exploitable", + "Unknown", + "Probably exploitable", + "Exploitable", + ].index(self.exploitability_rating) + + # Platform description. + self.os = crash.os + self.arch = crash.arch + self.bits = crash.bits + + # Event description. + self.event = crash.eventName + self.pid = crash.pid + self.tid = crash.tid + self.pc = crash.pc + self.sp = crash.sp + self.fp = crash.fp + self.pc_label = crash.labelPC + + # Exception description. + self.exception = crash.exceptionName + self.exception_text = crash.exceptionDescription + self.exception_address = crash.exceptionAddress + self.exception_label = crash.exceptionLabel + self.first_chance = crash.firstChance + self.fault_type = crash.faultType + self.fault_address = crash.faultAddress + self.fault_label = crash.faultLabel + self.fault_disasm = CrashDump.dump_code(crash.faultDisasm, crash.pc) + self.stack_trace = CrashDump.dump_stack_trace_with_labels(crash.stackTracePretty) + + # Command line. + self.command_line = crash.commandLine + + # Environment. + if crash.environment: + envList = crash.environment.items() + envList.sort() + environment = "" + for envKey, envVal in envList: + # Must concatenate here instead of using a substitution, + # so strings can be automatically promoted to Unicode. + environment += envKey + "=" + envVal + "\n" + if environment: + self.environment = environment + + # Debug string. + self.debug_string = crash.debugString + + # Notes. + self.notes = crash.notesReport() + + def toCrash(self, getMemoryDump=False): + """ + Returns a L{Crash} object using the data retrieved from the database. + + @type getMemoryDump: bool + @param getMemoryDump: If C{True} retrieve the memory dump. + Defaults to C{False} since this may be a costly operation. + + @rtype: L{Crash} + @return: Crash object. + """ + crash = Marshaller.loads(str(self.data)) + if not isinstance(crash, Crash): + raise TypeError("Expected Crash instance, got %s instead" % type(crash)) + crash._rowid = self.id + if not crash.memoryMap: + memory = getattr(self, "memory", []) + if memory: + crash.memoryMap = [dto.toMBI(getMemoryDump) for dto in memory] + return crash + + +# ============================================================================== + +# TODO: add a method to modify already stored crash dumps. + + +class CrashDAO(BaseDAO): + """ + Data Access Object to read, write and search for L{Crash} objects in a + database. + """ + + @Transactional + def add(self, crash, allow_duplicates=True): + """ + Add a new crash dump to the database, optionally filtering them by + signature to avoid duplicates. + + @type crash: L{Crash} + @param crash: Crash object. + + @type allow_duplicates: bool + @param allow_duplicates: (Optional) + C{True} to always add the new crash dump. + C{False} to only add the crash dump if no other crash with the + same signature is found in the database. + + Sometimes, your fuzzer turns out to be I{too} good. Then you find + youself browsing through gigabytes of crash dumps, only to find + a handful of actual bugs in them. This simple heuristic filter + saves you the trouble by discarding crashes that seem to be similar + to another one you've already found. + """ + + # Filter out duplicated crashes, if requested. + if not allow_duplicates: + signature = pickle.dumps(crash.signature, protocol=0) + if self._session.query(CrashDTO.id).filter_by(signature=signature).count() > 0: + return + + # Fill out a new row for the crashes table. + crash_id = self.__add_crash(crash) + + # Fill out new rows for the memory dump. + self.__add_memory(crash_id, crash.memoryMap) + + # On success set the row ID for the Crash object. + # WARNING: In nested calls, make sure to delete + # this property before a session rollback! + crash._rowid = crash_id + + # Store the Crash object into the crashes table. + def __add_crash(self, crash): + session = self._session + r_crash = None + try: + # Fill out a new row for the crashes table. + r_crash = CrashDTO(crash) + session.add(r_crash) + + # Flush and get the new row ID. + session.flush() + crash_id = r_crash.id + + finally: + try: + # Make the ORM forget the CrashDTO object. + if r_crash is not None: + session.expire(r_crash) + + finally: + # Delete the last reference to the CrashDTO + # object, so the Python garbage collector claims it. + del r_crash + + # Return the row ID. + return crash_id + + # Store the memory dump into the memory table. + def __add_memory(self, crash_id, memoryMap): + session = self._session + if memoryMap: + for mbi in memoryMap: + r_mem = MemoryDTO(crash_id, mbi) + session.add(r_mem) + session.flush() + + @Transactional + def find(self, signature=None, order=0, since=None, until=None, offset=None, limit=None): + """ + Retrieve all crash dumps in the database, optionally filtering them by + signature and timestamp, and/or sorting them by timestamp. + + Results can be paged to avoid consuming too much memory if the database + is large. + + @see: L{find_by_example} + + @type signature: object + @param signature: (Optional) Return only through crashes matching + this signature. See L{Crash.signature} for more details. + + @type order: int + @param order: (Optional) Sort by timestamp. + If C{== 0}, results are not sorted. + If C{> 0}, results are sorted from older to newer. + If C{< 0}, results are sorted from newer to older. + + @type since: datetime + @param since: (Optional) Return only the crashes after and + including this date and time. + + @type until: datetime + @param until: (Optional) Return only the crashes before this date + and time, not including it. + + @type offset: int + @param offset: (Optional) Skip the first I{offset} results. + + @type limit: int + @param limit: (Optional) Return at most I{limit} results. + + @rtype: list(L{Crash}) + @return: List of Crash objects. + """ + + # Validate the parameters. + if since and until and since > until: + warnings.warn("CrashDAO.find() got the 'since' and 'until'" " arguments reversed, corrected automatically.") + since, until = until, since + if limit is not None and not limit: + warnings.warn("CrashDAO.find() was set a limit of 0 results," " returning without executing a query.") + return [] + + # Build the SQL query. + query = self._session.query(CrashDTO) + if signature is not None: + sig_pickled = pickle.dumps(signature, protocol=0) + query = query.filter(CrashDTO.signature == sig_pickled) + if since: + query = query.filter(CrashDTO.timestamp >= since) + if until: + query = query.filter(CrashDTO.timestamp < until) + if order: + if order > 0: + query = query.order_by(asc(CrashDTO.timestamp)) + else: + query = query.order_by(desc(CrashDTO.timestamp)) + else: + # Default ordering is by row ID, to get consistent results. + # Also some database engines require ordering when using offsets. + query = query.order_by(asc(CrashDTO.id)) + if offset: + query = query.offset(offset) + if limit: + query = query.limit(limit) + + # Execute the SQL query and convert the results. + try: + return [dto.toCrash() for dto in query.all()] + except NoResultFound: + return [] + + @Transactional + def find_by_example(self, crash, offset=None, limit=None): + """ + Find all crash dumps that have common properties with the crash dump + provided. + + Results can be paged to avoid consuming too much memory if the database + is large. + + @see: L{find} + + @type crash: L{Crash} + @param crash: Crash object to compare with. Fields set to C{None} are + ignored, all other fields but the signature are used in the + comparison. + + To search for signature instead use the L{find} method. + + @type offset: int + @param offset: (Optional) Skip the first I{offset} results. + + @type limit: int + @param limit: (Optional) Return at most I{limit} results. + + @rtype: list(L{Crash}) + @return: List of similar crash dumps found. + """ + + # Validate the parameters. + if limit is not None and not limit: + warnings.warn("CrashDAO.find_by_example() was set a limit of 0" " results, returning without executing a query.") + return [] + + # Build the query. + query = self._session.query(CrashDTO) + + # Order by row ID to get consistent results. + # Also some database engines require ordering when using offsets. + query = query.asc(CrashDTO.id) + + # Build a CrashDTO from the Crash object. + dto = CrashDTO(crash) + + # Filter all the fields in the crashes table that are present in the + # CrashDTO object and not set to None, except for the row ID. + for name, column in compat.iteritems(CrashDTO.__dict__): + if not name.startswith("__") and name not in ("id", "signature", "data"): + if isinstance(column, Column): + value = getattr(dto, name, None) + if value is not None: + query = query.filter(column == value) + + # Page the query. + if offset: + query = query.offset(offset) + if limit: + query = query.limit(limit) + + # Execute the SQL query and convert the results. + try: + return [dto.toCrash() for dto in query.all()] + except NoResultFound: + return [] + + @Transactional + def count(self, signature=None): + """ + Counts how many crash dumps have been stored in this database. + Optionally filters the count by heuristic signature. + + @type signature: object + @param signature: (Optional) Count only the crashes that match + this signature. See L{Crash.signature} for more details. + + @rtype: int + @return: Count of crash dumps stored in this database. + """ + query = self._session.query(CrashDTO.id) + if signature: + sig_pickled = pickle.dumps(signature, protocol=0) + query = query.filter_by(signature=sig_pickled) + return query.count() + + @Transactional + def delete(self, crash): + """ + Remove the given crash dump from the database. + + @type crash: L{Crash} + @param crash: Crash dump to remove. + """ + query = self._session.query(CrashDTO).filter_by(id=crash._rowid) + query.delete(synchronize_session=False) + del crash._rowid diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/system.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/system.py new file mode 100644 index 0000000..11eea80 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/system.py @@ -0,0 +1,1227 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +System settings. + +@group Instrumentation: + System +""" + +from __future__ import with_statement + +__revision__ = "$Id$" + +__all__ = ["System"] + +from winappdbg import win32 +from winappdbg.registry import Registry +from winappdbg.textio import HexInput, HexDump +from winappdbg.util import Regenerator, PathOperations, MemoryAddresses, DebugRegister, classproperty +from winappdbg.process import _ProcessContainer +from winappdbg.window import Window + +import sys +import os +import ctypes +import warnings + +from os import path, getenv + +# ============================================================================== + + +class System(_ProcessContainer): + """ + Interface to a batch of processes, plus some system wide settings. + Contains a snapshot of processes. + + @group Platform settings: + arch, bits, os, wow64, pageSize + + @group Instrumentation: + find_window, get_window_at, get_foreground_window, + get_desktop_window, get_shell_window + + @group Debugging: + load_dbghelp, fix_symbol_store_path, + request_debug_privileges, drop_debug_privileges + + @group Postmortem debugging: + get_postmortem_debugger, set_postmortem_debugger, + get_postmortem_exclusion_list, add_to_postmortem_exclusion_list, + remove_from_postmortem_exclusion_list + + @group System services: + get_services, get_active_services, + start_service, stop_service, + pause_service, resume_service, + get_service_display_name, get_service_from_display_name + + @group Permissions and privileges: + request_privileges, drop_privileges, adjust_privileges, is_admin + + @group Miscellaneous global settings: + set_kill_on_exit_mode, read_msr, write_msr, enable_step_on_branch_mode, + get_last_branch_location + + @type arch: str + @cvar arch: Name of the processor architecture we're running on. + For more details see L{win32.version._get_arch}. + + @type bits: int + @cvar bits: Size of the machine word in bits for the current architecture. + For more details see L{win32.version._get_bits}. + + @type os: str + @cvar os: Name of the Windows version we're runing on. + For more details see L{win32.version._get_os}. + + @type wow64: bool + @cvar wow64: C{True} if the debugger is a 32 bits process running in a 64 + bits version of Windows, C{False} otherwise. + + @type pageSize: int + @cvar pageSize: Page size in bytes. Defaults to 0x1000 but it's + automatically updated on runtime when importing the module. + + @type registry: L{Registry} + @cvar registry: Windows Registry for this machine. + """ + + arch = win32.arch + bits = win32.bits + os = win32.os + wow64 = win32.wow64 + + @classproperty + def pageSize(cls): + pageSize = MemoryAddresses.pageSize + cls.pageSize = pageSize + return pageSize + + registry = Registry() + + # ------------------------------------------------------------------------------ + + @staticmethod + def find_window(className=None, windowName=None): + """ + Find the first top-level window in the current desktop to match the + given class name and/or window name. If neither are provided any + top-level window will match. + + @see: L{get_window_at} + + @type className: str + @param className: (Optional) Class name of the window to find. + If C{None} or not used any class name will match the search. + + @type windowName: str + @param windowName: (Optional) Caption text of the window to find. + If C{None} or not used any caption text will match the search. + + @rtype: L{Window} or None + @return: A window that matches the request. There may be more matching + windows, but this method only returns one. If no matching window + is found, the return value is C{None}. + + @raise WindowsError: An error occured while processing this request. + """ + # I'd love to reverse the order of the parameters + # but that might create some confusion. :( + hWnd = win32.FindWindow(className, windowName) + if hWnd: + return Window(hWnd) + + @staticmethod + def get_window_at(x, y): + """ + Get the window located at the given coordinates in the desktop. + If no such window exists an exception is raised. + + @see: L{find_window} + + @type x: int + @param x: Horizontal coordinate. + @type y: int + @param y: Vertical coordinate. + + @rtype: L{Window} + @return: Window at the requested position. If no such window + exists a C{WindowsError} exception is raised. + + @raise WindowsError: An error occured while processing this request. + """ + return Window(win32.WindowFromPoint((x, y))) + + @staticmethod + def get_foreground_window(): + """ + @rtype: L{Window} + @return: Returns the foreground window. + @raise WindowsError: An error occured while processing this request. + """ + return Window(win32.GetForegroundWindow()) + + @staticmethod + def get_desktop_window(): + """ + @rtype: L{Window} + @return: Returns the desktop window. + @raise WindowsError: An error occured while processing this request. + """ + return Window(win32.GetDesktopWindow()) + + @staticmethod + def get_shell_window(): + """ + @rtype: L{Window} + @return: Returns the shell window. + @raise WindowsError: An error occured while processing this request. + """ + return Window(win32.GetShellWindow()) + + # ------------------------------------------------------------------------------ + + @classmethod + def request_debug_privileges(cls, bIgnoreExceptions=False): + """ + Requests debug privileges. + + This may be needed to debug processes running as SYSTEM + (such as services) since Windows XP. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when requesting debug privileges. + + @rtype: bool + @return: C{True} on success, C{False} on failure. + + @raise WindowsError: Raises an exception on error, unless + C{bIgnoreExceptions} is C{True}. + """ + try: + cls.request_privileges(win32.SE_DEBUG_NAME) + return True + except Exception: + if not bIgnoreExceptions: + raise + return False + + @classmethod + def drop_debug_privileges(cls, bIgnoreExceptions=False): + """ + Drops debug privileges. + + This may be needed to avoid being detected + by certain anti-debug tricks. + + @type bIgnoreExceptions: bool + @param bIgnoreExceptions: C{True} to ignore any exceptions that may be + raised when dropping debug privileges. + + @rtype: bool + @return: C{True} on success, C{False} on failure. + + @raise WindowsError: Raises an exception on error, unless + C{bIgnoreExceptions} is C{True}. + """ + try: + cls.drop_privileges(win32.SE_DEBUG_NAME) + return True + except Exception: + if not bIgnoreExceptions: + raise + return False + + @classmethod + def request_privileges(cls, *privileges): + """ + Requests privileges. + + @type privileges: int... + @param privileges: Privileges to request. + + @raise WindowsError: Raises an exception on error. + """ + cls.adjust_privileges(True, privileges) + + @classmethod + def drop_privileges(cls, *privileges): + """ + Drops privileges. + + @type privileges: int... + @param privileges: Privileges to drop. + + @raise WindowsError: Raises an exception on error. + """ + cls.adjust_privileges(False, privileges) + + @staticmethod + def adjust_privileges(state, privileges): + """ + Requests or drops privileges. + + @type state: bool + @param state: C{True} to request, C{False} to drop. + + @type privileges: list(int) + @param privileges: Privileges to request or drop. + + @raise WindowsError: Raises an exception on error. + """ + with win32.OpenProcessToken(win32.GetCurrentProcess(), win32.TOKEN_ADJUST_PRIVILEGES) as hToken: + NewState = ((priv, state) for priv in privileges) + win32.AdjustTokenPrivileges(hToken, NewState) + + @staticmethod + def is_admin(): + """ + @rtype: bool + @return: C{True} if the current user as Administrator privileges, + C{False} otherwise. Since Windows Vista and above this means if + the current process is running with UAC elevation or not. + """ + return win32.IsUserAnAdmin() + + # ------------------------------------------------------------------------------ + + __binary_types = { + win32.VFT_APP: "application", + win32.VFT_DLL: "dynamic link library", + win32.VFT_STATIC_LIB: "static link library", + win32.VFT_FONT: "font", + win32.VFT_DRV: "driver", + win32.VFT_VXD: "legacy driver", + } + + __driver_types = { + win32.VFT2_DRV_COMM: "communications driver", + win32.VFT2_DRV_DISPLAY: "display driver", + win32.VFT2_DRV_INSTALLABLE: "installable driver", + win32.VFT2_DRV_KEYBOARD: "keyboard driver", + win32.VFT2_DRV_LANGUAGE: "language driver", + win32.VFT2_DRV_MOUSE: "mouse driver", + win32.VFT2_DRV_NETWORK: "network driver", + win32.VFT2_DRV_PRINTER: "printer driver", + win32.VFT2_DRV_SOUND: "sound driver", + win32.VFT2_DRV_SYSTEM: "system driver", + win32.VFT2_DRV_VERSIONED_PRINTER: "versioned printer driver", + } + + __font_types = { + win32.VFT2_FONT_RASTER: "raster font", + win32.VFT2_FONT_TRUETYPE: "TrueType font", + win32.VFT2_FONT_VECTOR: "vector font", + } + + __months = ( + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ) + + __days_of_the_week = ( + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + ) + + @classmethod + def get_file_version_info(cls, filename): + """ + Get the program version from an executable file, if available. + + @type filename: str + @param filename: Pathname to the executable file to query. + + @rtype: tuple(str, str, bool, bool, str, str) + @return: Tuple with version information extracted from the executable + file metadata, containing the following: + - File version number (C{"major.minor"}). + - Product version number (C{"major.minor"}). + - C{True} for debug builds, C{False} for production builds. + - C{True} for legacy OS builds (DOS, OS/2, Win16), + C{False} for modern OS builds. + - Binary file type. + May be one of the following values: + - "application" + - "dynamic link library" + - "static link library" + - "font" + - "raster font" + - "TrueType font" + - "vector font" + - "driver" + - "communications driver" + - "display driver" + - "installable driver" + - "keyboard driver" + - "language driver" + - "legacy driver" + - "mouse driver" + - "network driver" + - "printer driver" + - "sound driver" + - "system driver" + - "versioned printer driver" + - Binary creation timestamp. + Any of the fields may be C{None} if not available. + + @raise WindowsError: Raises an exception on error. + """ + + # Get the file version info structure. + pBlock = win32.GetFileVersionInfo(filename) + pBuffer, dwLen = win32.VerQueryValue(pBlock, "\\") + if dwLen != ctypes.sizeof(win32.VS_FIXEDFILEINFO): + raise ctypes.WinError(win32.ERROR_BAD_LENGTH) + pVersionInfo = ctypes.cast(pBuffer, ctypes.POINTER(win32.VS_FIXEDFILEINFO)) + VersionInfo = pVersionInfo.contents + if VersionInfo.dwSignature != 0xFEEF04BD: + raise ctypes.WinError(win32.ERROR_BAD_ARGUMENTS) + + # File and product versions. + FileVersion = "%d.%d" % (VersionInfo.dwFileVersionMS, VersionInfo.dwFileVersionLS) + ProductVersion = "%d.%d" % (VersionInfo.dwProductVersionMS, VersionInfo.dwProductVersionLS) + + # Debug build? + if VersionInfo.dwFileFlagsMask & win32.VS_FF_DEBUG: + DebugBuild = (VersionInfo.dwFileFlags & win32.VS_FF_DEBUG) != 0 + else: + DebugBuild = None + + # Legacy OS build? + LegacyBuild = VersionInfo.dwFileOS != win32.VOS_NT_WINDOWS32 + + # File type. + FileType = cls.__binary_types.get(VersionInfo.dwFileType) + if VersionInfo.dwFileType == win32.VFT_DRV: + FileType = cls.__driver_types.get(VersionInfo.dwFileSubtype) + elif VersionInfo.dwFileType == win32.VFT_FONT: + FileType = cls.__font_types.get(VersionInfo.dwFileSubtype) + + # Timestamp, ex: "Monday, July 7, 2013 (12:20:50.126)". + # FIXME: how do we know the time zone? + FileDate = (VersionInfo.dwFileDateMS << 32) + VersionInfo.dwFileDateLS + if FileDate: + CreationTime = win32.FileTimeToSystemTime(FileDate) + CreationTimestamp = "%s, %s %d, %d (%d:%d:%d.%d)" % ( + cls.__days_of_the_week[CreationTime.wDayOfWeek], + cls.__months[CreationTime.wMonth], + CreationTime.wDay, + CreationTime.wYear, + CreationTime.wHour, + CreationTime.wMinute, + CreationTime.wSecond, + CreationTime.wMilliseconds, + ) + else: + CreationTimestamp = None + + # Return the file version info. + return ( + FileVersion, + ProductVersion, + DebugBuild, + LegacyBuild, + FileType, + CreationTimestamp, + ) + + # ------------------------------------------------------------------------------ + + # Locations for dbghelp.dll. + # Unfortunately, Microsoft started bundling WinDbg with the + # platform SDK, so the install directories may vary across + # versions and platforms. + __dbghelp_locations = { + # Intel 64 bits. + win32.ARCH_AMD64: set( + [ + # WinDbg bundled with the SDK, version 8.0. + path.join(getenv("ProgramFiles", "C:\\Program Files"), "Windows Kits", "8.0", "Debuggers", "x64", "dbghelp.dll"), + path.join( + getenv("ProgramW6432", getenv("ProgramFiles", "C:\\Program Files")), + "Windows Kits", + "8.0", + "Debuggers", + "x64", + "dbghelp.dll", + ), + # Old standalone versions of WinDbg. + path.join(getenv("ProgramFiles", "C:\\Program Files"), "Debugging Tools for Windows (x64)", "dbghelp.dll"), + ] + ), + # Intel 32 bits. + win32.ARCH_I386: set( + [ + # WinDbg bundled with the SDK, version 8.0. + path.join(getenv("ProgramFiles", "C:\\Program Files"), "Windows Kits", "8.0", "Debuggers", "x86", "dbghelp.dll"), + path.join( + getenv("ProgramW6432", getenv("ProgramFiles", "C:\\Program Files")), + "Windows Kits", + "8.0", + "Debuggers", + "x86", + "dbghelp.dll", + ), + # Old standalone versions of WinDbg. + path.join(getenv("ProgramFiles", "C:\\Program Files"), "Debugging Tools for Windows (x86)", "dbghelp.dll"), + # Version shipped with Windows. + path.join(getenv("ProgramFiles", "C:\\Program Files"), "Debugging Tools for Windows (x86)", "dbghelp.dll"), + ] + ), + } + + @classmethod + def load_dbghelp(cls, pathname=None): + """ + Load the specified version of the C{dbghelp.dll} library. + + This library is shipped with the Debugging Tools for Windows, and it's + required to load debug symbols. + + Normally you don't need to call this method, as WinAppDbg already tries + to load the latest version automatically - but it may come in handy if + the Debugging Tools are installed in a non standard folder. + + Example:: + from winappdbg import Debug + + def simple_debugger( argv ): + + # Instance a Debug object, passing it the event handler callback + debug = Debug( my_event_handler ) + try: + + # Load a specific dbghelp.dll file + debug.system.load_dbghelp("C:\\Some folder\\dbghelp.dll") + + # Start a new process for debugging + debug.execv( argv ) + + # Wait for the debugee to finish + debug.loop() + + # Stop the debugger + finally: + debug.stop() + + @see: U{http://msdn.microsoft.com/en-us/library/ms679294(VS.85).aspx} + + @type pathname: str + @param pathname: + (Optional) Full pathname to the C{dbghelp.dll} library. + If not provided this method will try to autodetect it. + + @rtype: ctypes.WinDLL + @return: Loaded instance of C{dbghelp.dll}. + + @raise NotImplementedError: This feature was not implemented for the + current architecture. + + @raise WindowsError: An error occured while processing this request. + """ + + # If an explicit pathname was not given, search for the library. + if not pathname: + # Under WOW64 we'll treat AMD64 as I386. + arch = win32.arch + if arch == win32.ARCH_AMD64 and win32.bits == 32: + arch = win32.ARCH_I386 + + # Check if the architecture is supported. + if not arch in cls.__dbghelp_locations: + msg = "Architecture %s is not currently supported." + raise NotImplementedError(msg % arch) + + # Grab all versions of the library we can find. + found = [] + for pathname in cls.__dbghelp_locations[arch]: + if path.isfile(pathname): + try: + f_ver, p_ver = cls.get_file_version_info(pathname)[:2] + except WindowsError: + msg = "Failed to parse file version metadata for: %s" + warnings.warn(msg % pathname) + if not f_ver: + f_ver = p_ver + elif p_ver and p_ver > f_ver: + f_ver = p_ver + found.append((f_ver, pathname)) + + # If we found any, use the newest version. + if found: + found.sort() + pathname = found.pop()[1] + + # If we didn't find any, trust the default DLL search algorithm. + else: + pathname = "dbghelp.dll" + + # Load the library. + dbghelp = ctypes.windll.LoadLibrary(pathname) + + # Set it globally as the library to be used. + ctypes.windll.dbghelp = dbghelp + + # Return the library. + return dbghelp + + @staticmethod + def fix_symbol_store_path(symbol_store_path=None, remote=True, force=False): + """ + Fix the symbol store path. Equivalent to the C{.symfix} command in + Microsoft WinDbg. + + If the symbol store path environment variable hasn't been set, this + method will provide a default one. + + @type symbol_store_path: str or None + @param symbol_store_path: (Optional) Symbol store path to set. + + @type remote: bool + @param remote: (Optional) Defines the symbol store path to set when the + C{symbol_store_path} is C{None}. + + If C{True} the default symbol store path is set to the Microsoft + symbol server. Debug symbols will be downloaded through HTTP. + This gives the best results but is also quite slow. + + If C{False} the default symbol store path is set to the local + cache only. This prevents debug symbols from being downloaded and + is faster, but unless you've installed the debug symbols on this + machine or downloaded them in a previous debugging session, some + symbols may be missing. + + If the C{symbol_store_path} argument is not C{None}, this argument + is ignored entirely. + + @type force: bool + @param force: (Optional) If C{True} the new symbol store path is set + always. If C{False} the new symbol store path is only set if + missing. + + This allows you to call this method preventively to ensure the + symbol server is always set up correctly when running your script, + but without messing up whatever configuration the user has. + + Example:: + from winappdbg import Debug, System + + def simple_debugger( argv ): + + # Instance a Debug object + debug = Debug( MyEventHandler() ) + try: + + # Make sure the remote symbol store is set + System.fix_symbol_store_path(remote = True, + force = False) + + # Start a new process for debugging + debug.execv( argv ) + + # Wait for the debugee to finish + debug.loop() + + # Stop the debugger + finally: + debug.stop() + + @rtype: str or None + @return: The previously set symbol store path if any, + otherwise returns C{None}. + """ + try: + if symbol_store_path is None: + local_path = "C:\\SYMBOLS" + if not path.isdir(local_path): + local_path = "C:\\Windows\\Symbols" + if not path.isdir(local_path): + local_path = path.abspath(".") + if remote: + symbol_store_path = "cache*;SRV*" + local_path + "*" "http://msdl.microsoft.com/download/symbols" + else: + symbol_store_path = "cache*;SRV*" + local_path + previous = os.environ.get("_NT_SYMBOL_PATH", None) + if not previous or force: + os.environ["_NT_SYMBOL_PATH"] = symbol_store_path + return previous + except Exception: + e = sys.exc_info()[1] + warnings.warn("Cannot fix symbol path, reason: %s" % str(e), RuntimeWarning) + + # ------------------------------------------------------------------------------ + + @staticmethod + def set_kill_on_exit_mode(bKillOnExit=False): + """ + Defines the behavior of the debugged processes when the debugging + thread dies. This method only affects the calling thread. + + Works on the following platforms: + + - Microsoft Windows XP and above. + - Wine (Windows Emulator). + + Fails on the following platforms: + + - Microsoft Windows 2000 and below. + - ReactOS. + + @type bKillOnExit: bool + @param bKillOnExit: C{True} to automatically kill processes when the + debugger thread dies. C{False} to automatically detach from + processes when the debugger thread dies. + + @rtype: bool + @return: C{True} on success, C{False} on error. + + @note: + This call will fail if a debug port was not created. That is, if + the debugger isn't attached to at least one process. For more info + see: U{http://msdn.microsoft.com/en-us/library/ms679307.aspx} + """ + try: + # won't work before calling CreateProcess or DebugActiveProcess + win32.DebugSetProcessKillOnExit(bKillOnExit) + except (AttributeError, WindowsError): + return False + return True + + @staticmethod + def read_msr(address): + """ + Read the contents of the specified MSR (Machine Specific Register). + + @type address: int + @param address: MSR to read. + + @rtype: int + @return: Value of the specified MSR. + + @raise WindowsError: + Raises an exception on error. + + @raise NotImplementedError: + Current architecture is not C{i386} or C{amd64}. + + @warning: + It could potentially brick your machine. + It works on my machine, but your mileage may vary. + """ + if win32.arch not in (win32.ARCH_I386, win32.ARCH_AMD64): + raise NotImplementedError("MSR reading is only supported on i386 or amd64 processors.") + msr = win32.SYSDBG_MSR() + msr.Address = address + msr.Data = 0 + win32.NtSystemDebugControl(win32.SysDbgReadMsr, InputBuffer=msr, OutputBuffer=msr) + return msr.Data + + @staticmethod + def write_msr(address, value): + """ + Set the contents of the specified MSR (Machine Specific Register). + + @type address: int + @param address: MSR to write. + + @type value: int + @param value: Contents to write on the MSR. + + @raise WindowsError: + Raises an exception on error. + + @raise NotImplementedError: + Current architecture is not C{i386} or C{amd64}. + + @warning: + It could potentially brick your machine. + It works on my machine, but your mileage may vary. + """ + if win32.arch not in (win32.ARCH_I386, win32.ARCH_AMD64): + raise NotImplementedError("MSR writing is only supported on i386 or amd64 processors.") + msr = win32.SYSDBG_MSR() + msr.Address = address + msr.Data = value + win32.NtSystemDebugControl(win32.SysDbgWriteMsr, InputBuffer=msr) + + @classmethod + def enable_step_on_branch_mode(cls): + """ + When tracing, call this on every single step event + for step on branch mode. + + @raise WindowsError: + Raises C{ERROR_DEBUGGER_INACTIVE} if the debugger is not attached + to least one process. + + @raise NotImplementedError: + Current architecture is not C{i386} or C{amd64}. + + @warning: + This method uses the processor's machine specific registers (MSR). + It could potentially brick your machine. + It works on my machine, but your mileage may vary. + + @note: + It doesn't seem to work in VMWare or VirtualBox machines. + Maybe it fails in other virtualization/emulation environments, + no extensive testing was made so far. + """ + cls.write_msr(DebugRegister.DebugCtlMSR, DebugRegister.BranchTrapFlag | DebugRegister.LastBranchRecord) + + @classmethod + def get_last_branch_location(cls): + """ + Returns the source and destination addresses of the last taken branch. + + @rtype: tuple( int, int ) + @return: Source and destination addresses of the last taken branch. + + @raise WindowsError: + Raises an exception on error. + + @raise NotImplementedError: + Current architecture is not C{i386} or C{amd64}. + + @warning: + This method uses the processor's machine specific registers (MSR). + It could potentially brick your machine. + It works on my machine, but your mileage may vary. + + @note: + It doesn't seem to work in VMWare or VirtualBox machines. + Maybe it fails in other virtualization/emulation environments, + no extensive testing was made so far. + """ + LastBranchFromIP = cls.read_msr(DebugRegister.LastBranchFromIP) + LastBranchToIP = cls.read_msr(DebugRegister.LastBranchToIP) + return (LastBranchFromIP, LastBranchToIP) + + # ------------------------------------------------------------------------------ + + @classmethod + def get_postmortem_debugger(cls, bits=None): + """ + Returns the postmortem debugging settings from the Registry. + + @see: L{set_postmortem_debugger} + + @type bits: int + @param bits: Set to C{32} for the 32 bits debugger, or C{64} for the + 64 bits debugger. Set to {None} for the default (L{System.bits}. + + @rtype: tuple( str, bool, int ) + @return: A tuple containing the command line string to the postmortem + debugger, a boolean specifying if user interaction is allowed + before attaching, and an integer specifying a user defined hotkey. + Any member of the tuple may be C{None}. + See L{set_postmortem_debugger} for more details. + + @raise WindowsError: + Raises an exception on error. + """ + if bits is None: + bits = cls.bits + elif bits not in (32, 64): + raise NotImplementedError("Unknown architecture (%r bits)" % bits) + + if bits == 32 and cls.bits == 64: + keyname = "HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug" + else: + keyname = "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug" + + key = cls.registry[keyname] + + debugger = key.get("Debugger") + auto = key.get("Auto") + hotkey = key.get("UserDebuggerHotkey") + + if auto is not None: + auto = bool(auto) + + return (debugger, auto, hotkey) + + @classmethod + def get_postmortem_exclusion_list(cls, bits=None): + """ + Returns the exclusion list for the postmortem debugger. + + @see: L{get_postmortem_debugger} + + @type bits: int + @param bits: Set to C{32} for the 32 bits debugger, or C{64} for the + 64 bits debugger. Set to {None} for the default (L{System.bits}). + + @rtype: list( str ) + @return: List of excluded application filenames. + + @raise WindowsError: + Raises an exception on error. + """ + if bits is None: + bits = cls.bits + elif bits not in (32, 64): + raise NotImplementedError("Unknown architecture (%r bits)" % bits) + + if bits == 32 and cls.bits == 64: + keyname = "HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\AutoExclusionList" + else: + keyname = "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\AutoExclusionList" + + try: + key = cls.registry[keyname] + except KeyError: + return [] + + return [name for (name, enabled) in key.items() if enabled] + + @classmethod + def set_postmortem_debugger(cls, cmdline, auto=None, hotkey=None, bits=None): + """ + Sets the postmortem debugging settings in the Registry. + + @warning: This method requires administrative rights. + + @see: L{get_postmortem_debugger} + + @type cmdline: str + @param cmdline: Command line to the new postmortem debugger. + When the debugger is invoked, the first "%ld" is replaced with the + process ID and the second "%ld" is replaced with the event handle. + Don't forget to enclose the program filename in double quotes if + the path contains spaces. + + @type auto: bool + @param auto: Set to C{True} if no user interaction is allowed, C{False} + to prompt a confirmation dialog before attaching. + Use C{None} to leave this value unchanged. + + @type hotkey: int + @param hotkey: Virtual key scan code for the user defined hotkey. + Use C{0} to disable the hotkey. + Use C{None} to leave this value unchanged. + + @type bits: int + @param bits: Set to C{32} for the 32 bits debugger, or C{64} for the + 64 bits debugger. Set to {None} for the default (L{System.bits}). + + @rtype: tuple( str, bool, int ) + @return: Previously defined command line and auto flag. + + @raise WindowsError: + Raises an exception on error. + """ + if bits is None: + bits = cls.bits + elif bits not in (32, 64): + raise NotImplementedError("Unknown architecture (%r bits)" % bits) + + if bits == 32 and cls.bits == 64: + keyname = "HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug" + else: + keyname = "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug" + + key = cls.registry[keyname] + + if cmdline is not None: + key["Debugger"] = cmdline + if auto is not None: + key["Auto"] = int(bool(auto)) + if hotkey is not None: + key["UserDebuggerHotkey"] = int(hotkey) + + @classmethod + def add_to_postmortem_exclusion_list(cls, pathname, bits=None): + """ + Adds the given filename to the exclusion list for postmortem debugging. + + @warning: This method requires administrative rights. + + @see: L{get_postmortem_exclusion_list} + + @type pathname: str + @param pathname: + Application pathname to exclude from postmortem debugging. + + @type bits: int + @param bits: Set to C{32} for the 32 bits debugger, or C{64} for the + 64 bits debugger. Set to {None} for the default (L{System.bits}). + + @raise WindowsError: + Raises an exception on error. + """ + if bits is None: + bits = cls.bits + elif bits not in (32, 64): + raise NotImplementedError("Unknown architecture (%r bits)" % bits) + + if bits == 32 and cls.bits == 64: + keyname = "HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\AutoExclusionList" + else: + keyname = "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\AutoExclusionList" + + try: + key = cls.registry[keyname] + except KeyError: + key = cls.registry.create(keyname) + + key[pathname] = 1 + + @classmethod + def remove_from_postmortem_exclusion_list(cls, pathname, bits=None): + """ + Removes the given filename to the exclusion list for postmortem + debugging from the Registry. + + @warning: This method requires administrative rights. + + @warning: Don't ever delete entries you haven't created yourself! + Some entries are set by default for your version of Windows. + Deleting them might deadlock your system under some circumstances. + + For more details see: + U{http://msdn.microsoft.com/en-us/library/bb204634(v=vs.85).aspx} + + @see: L{get_postmortem_exclusion_list} + + @type pathname: str + @param pathname: Application pathname to remove from the postmortem + debugging exclusion list. + + @type bits: int + @param bits: Set to C{32} for the 32 bits debugger, or C{64} for the + 64 bits debugger. Set to {None} for the default (L{System.bits}). + + @raise WindowsError: + Raises an exception on error. + """ + if bits is None: + bits = cls.bits + elif bits not in (32, 64): + raise NotImplementedError("Unknown architecture (%r bits)" % bits) + + if bits == 32 and cls.bits == 64: + keyname = "HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\AutoExclusionList" + else: + keyname = "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\AutoExclusionList" + + try: + key = cls.registry[keyname] + except KeyError: + return + + try: + del key[pathname] + except KeyError: + return + + # ------------------------------------------------------------------------------ + + @staticmethod + def get_services(): + """ + Retrieve a list of all system services. + + @see: L{get_active_services}, + L{start_service}, L{stop_service}, + L{pause_service}, L{resume_service} + + @rtype: list( L{win32.ServiceStatusProcessEntry} ) + @return: List of service status descriptors. + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_ENUMERATE_SERVICE) as hSCManager: + try: + return win32.EnumServicesStatusEx(hSCManager) + except AttributeError: + return win32.EnumServicesStatus(hSCManager) + + @staticmethod + def get_active_services(): + """ + Retrieve a list of all active system services. + + @see: L{get_services}, + L{start_service}, L{stop_service}, + L{pause_service}, L{resume_service} + + @rtype: list( L{win32.ServiceStatusProcessEntry} ) + @return: List of service status descriptors. + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_ENUMERATE_SERVICE) as hSCManager: + return [ + entry + for entry in win32.EnumServicesStatusEx(hSCManager, dwServiceType=win32.SERVICE_WIN32, dwServiceState=win32.SERVICE_ACTIVE) + if entry.ProcessId + ] + + @staticmethod + def get_service(name): + """ + Get the service descriptor for the given service name. + + @see: L{start_service}, L{stop_service}, + L{pause_service}, L{resume_service} + + @type name: str + @param name: Service unique name. You can get this value from the + C{ServiceName} member of the service descriptors returned by + L{get_services} or L{get_active_services}. + + @rtype: L{win32.ServiceStatusProcess} + @return: Service status descriptor. + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_ENUMERATE_SERVICE) as hSCManager: + with win32.OpenService(hSCManager, name, dwDesiredAccess=win32.SERVICE_QUERY_STATUS) as hService: + try: + return win32.QueryServiceStatusEx(hService) + except AttributeError: + return win32.QueryServiceStatus(hService) + + @staticmethod + def get_service_display_name(name): + """ + Get the service display name for the given service name. + + @see: L{get_service} + + @type name: str + @param name: Service unique name. You can get this value from the + C{ServiceName} member of the service descriptors returned by + L{get_services} or L{get_active_services}. + + @rtype: str + @return: Service display name. + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_ENUMERATE_SERVICE) as hSCManager: + return win32.GetServiceDisplayName(hSCManager, name) + + @staticmethod + def get_service_from_display_name(displayName): + """ + Get the service unique name given its display name. + + @see: L{get_service} + + @type displayName: str + @param displayName: Service display name. You can get this value from + the C{DisplayName} member of the service descriptors returned by + L{get_services} or L{get_active_services}. + + @rtype: str + @return: Service unique name. + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_ENUMERATE_SERVICE) as hSCManager: + return win32.GetServiceKeyName(hSCManager, displayName) + + @staticmethod + def start_service(name, argv=None): + """ + Start the service given by name. + + @warn: This method requires UAC elevation in Windows Vista and above. + + @see: L{stop_service}, L{pause_service}, L{resume_service} + + @type name: str + @param name: Service unique name. You can get this value from the + C{ServiceName} member of the service descriptors returned by + L{get_services} or L{get_active_services}. + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_CONNECT) as hSCManager: + with win32.OpenService(hSCManager, name, dwDesiredAccess=win32.SERVICE_START) as hService: + win32.StartService(hService) + + @staticmethod + def stop_service(name): + """ + Stop the service given by name. + + @warn: This method requires UAC elevation in Windows Vista and above. + + @see: L{get_services}, L{get_active_services}, + L{start_service}, L{pause_service}, L{resume_service} + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_CONNECT) as hSCManager: + with win32.OpenService(hSCManager, name, dwDesiredAccess=win32.SERVICE_STOP) as hService: + win32.ControlService(hService, win32.SERVICE_CONTROL_STOP) + + @staticmethod + def pause_service(name): + """ + Pause the service given by name. + + @warn: This method requires UAC elevation in Windows Vista and above. + + @note: Not all services support this. + + @see: L{get_services}, L{get_active_services}, + L{start_service}, L{stop_service}, L{resume_service} + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_CONNECT) as hSCManager: + with win32.OpenService(hSCManager, name, dwDesiredAccess=win32.SERVICE_PAUSE_CONTINUE) as hService: + win32.ControlService(hService, win32.SERVICE_CONTROL_PAUSE) + + @staticmethod + def resume_service(name): + """ + Resume the service given by name. + + @warn: This method requires UAC elevation in Windows Vista and above. + + @note: Not all services support this. + + @see: L{get_services}, L{get_active_services}, + L{start_service}, L{stop_service}, L{pause_service} + """ + with win32.OpenSCManager(dwDesiredAccess=win32.SC_MANAGER_CONNECT) as hSCManager: + with win32.OpenService(hSCManager, name, dwDesiredAccess=win32.SERVICE_PAUSE_CONTINUE) as hService: + win32.ControlService(hService, win32.SERVICE_CONTROL_CONTINUE) + + # TODO: create_service, delete_service diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/textio.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/textio.py new file mode 100644 index 0000000..afb4de2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/textio.py @@ -0,0 +1,1848 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Functions for text input, logging or text output. + +@group Helpers: + HexDump, + HexInput, + HexOutput, + Color, + Table, + Logger + DebugLog + CrashDump +""" + +__revision__ = "$Id$" + +__all__ = [ + "HexDump", + "HexInput", + "HexOutput", + "Color", + "Table", + "CrashDump", + "DebugLog", + "Logger", +] + +import sys +from winappdbg import win32 +from winappdbg import compat +from winappdbg.util import StaticClass + +import re +import time +import struct +import traceback + +# ------------------------------------------------------------------------------ + + +class HexInput(StaticClass): + """ + Static functions for user input parsing. + The counterparts for each method are in the L{HexOutput} class. + """ + + @staticmethod + def integer(token): + """ + Convert numeric strings into integers. + + @type token: str + @param token: String to parse. + + @rtype: int + @return: Parsed integer value. + """ + token = token.strip() + neg = False + if token.startswith(compat.b("-")): + token = token[1:] + neg = True + if token.startswith(compat.b("0x")): + result = int(token, 16) # hexadecimal + elif token.startswith(compat.b("0b")): + result = int(token[2:], 2) # binary + elif token.startswith(compat.b("0o")): + result = int(token, 8) # octal + else: + try: + result = int(token) # decimal + except ValueError: + result = int(token, 16) # hexadecimal (no "0x" prefix) + if neg: + result = -result + return result + + @staticmethod + def address(token): + """ + Convert numeric strings into memory addresses. + + @type token: str + @param token: String to parse. + + @rtype: int + @return: Parsed integer value. + """ + return int(token, 16) + + @staticmethod + def hexadecimal(token): + """ + Convert a strip of hexadecimal numbers into binary data. + + @type token: str + @param token: String to parse. + + @rtype: str + @return: Parsed string value. + """ + token = "".join([c for c in token if c.isalnum()]) + if len(token) % 2 != 0: + raise ValueError("Missing characters in hex data") + data = "" + for i in compat.xrange(0, len(token), 2): + x = token[i : i + 2] + d = int(x, 16) + s = struct.pack("= 0: + return ("0x%%.%dx" % (integer_size - 2)) % integer + return ("-0x%%.%dx" % (integer_size - 2)) % -integer + + @classmethod + def address(cls, address, bits=None): + """ + @type address: int + @param address: Memory address. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexOutput.address_size} + + @rtype: str + @return: Text output. + """ + if bits is None: + address_size = cls.address_size + bits = win32.bits + else: + address_size = (bits / 4) + 2 + if address < 0: + address = ((2**bits) - 1) ^ ~address + return ("0x%%.%dx" % (address_size - 2)) % address + + @staticmethod + def hexadecimal(data): + """ + Convert binary data to a string of hexadecimal numbers. + + @type data: str + @param data: Binary data. + + @rtype: str + @return: Hexadecimal representation. + """ + return HexDump.hexadecimal(data, separator="") + + @classmethod + def integer_list_file(cls, filename, values, bits=None): + """ + Write a list of integers to a file. + If a file of the same name exists, it's contents are replaced. + + See L{HexInput.integer_list_file} for a description of the file format. + + @type filename: str + @param filename: Name of the file to write. + + @type values: list( int ) + @param values: List of integers to write to the file. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexOutput.integer_size} + """ + fd = open(filename, "w") + for integer in values: + print >> fd, cls.integer(integer, bits) + fd.close() + + @classmethod + def string_list_file(cls, filename, values): + """ + Write a list of strings to a file. + If a file of the same name exists, it's contents are replaced. + + See L{HexInput.string_list_file} for a description of the file format. + + @type filename: str + @param filename: Name of the file to write. + + @type values: list( int ) + @param values: List of strings to write to the file. + """ + fd = open(filename, "w") + for string in values: + print >> fd, string + fd.close() + + @classmethod + def mixed_list_file(cls, filename, values, bits): + """ + Write a list of mixed values to a file. + If a file of the same name exists, it's contents are replaced. + + See L{HexInput.mixed_list_file} for a description of the file format. + + @type filename: str + @param filename: Name of the file to write. + + @type values: list( int ) + @param values: List of mixed values to write to the file. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexOutput.integer_size} + """ + fd = open(filename, "w") + for original in values: + try: + parsed = cls.integer(original, bits) + except TypeError: + parsed = repr(original) + print >> fd, parsed + fd.close() + + +# ------------------------------------------------------------------------------ + + +class HexDump(StaticClass): + """ + Static functions for hexadecimal dumps. + + @type integer_size: int + @cvar integer_size: Size in characters of an outputted integer. + This value is platform dependent. + + @type address_size: int + @cvar address_size: Size in characters of an outputted address. + This value is platform dependent. + """ + + integer_size = win32.SIZEOF(win32.DWORD) * 2 + address_size = win32.SIZEOF(win32.SIZE_T) * 2 + + @classmethod + def integer(cls, integer, bits=None): + """ + @type integer: int + @param integer: Integer. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexDump.integer_size} + + @rtype: str + @return: Text output. + """ + if bits is None: + integer_size = cls.integer_size + else: + integer_size = bits / 4 + return ("%%.%dX" % integer_size) % integer + + @classmethod + def address(cls, address, bits=None): + """ + @type address: int + @param address: Memory address. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexDump.address_size} + + @rtype: str + @return: Text output. + """ + if bits is None: + address_size = cls.address_size + bits = win32.bits + else: + address_size = bits / 4 + if address < 0: + address = ((2**bits) - 1) ^ ~address + return ("%%.%dX" % address_size) % address + + @staticmethod + def printable(data): + """ + Replace unprintable characters with dots. + + @type data: str + @param data: Binary data. + + @rtype: str + @return: Printable text. + """ + result = "" + for c in data: + if 32 < ord(c) < 128: + result += c + else: + result += "." + return result + + @staticmethod + def hexadecimal(data, separator=""): + """ + Convert binary data to a string of hexadecimal numbers. + + @type data: str + @param data: Binary data. + + @type separator: str + @param separator: + Separator between the hexadecimal representation of each character. + + @rtype: str + @return: Hexadecimal representation. + """ + return separator.join(["%.2x" % ord(c) for c in data]) + + @staticmethod + def hexa_word(data, separator=" "): + """ + Convert binary data to a string of hexadecimal WORDs. + + @type data: str + @param data: Binary data. + + @type separator: str + @param separator: + Separator between the hexadecimal representation of each WORD. + + @rtype: str + @return: Hexadecimal representation. + """ + if len(data) & 1 != 0: + data += "\0" + return separator.join(["%.4x" % struct.unpack(" 0: + width.extend(len_row[-missing:]) + elif missing < 0: + len_row.extend([0] * (-missing)) + self.__width = [max(width[i], len_row[i]) for i in compat.xrange(len(len_row))] + self.__cols.append(row) + + def justify(self, column, direction): + """ + Make the text in a column left or right justified. + + @type column: int + @param column: Index of the column. + + @type direction: int + @param direction: + C{-1} to justify left, + C{1} to justify right. + + @raise IndexError: Bad column index. + @raise ValueError: Bad direction value. + """ + if direction == -1: + self.__width[column] = abs(self.__width[column]) + elif direction == 1: + self.__width[column] = -abs(self.__width[column]) + else: + raise ValueError("Bad direction value.") + + def getWidth(self): + """ + Get the width of the text output for the table. + + @rtype: int + @return: Width in characters for the text output, + including the newline character. + """ + width = 0 + if self.__width: + width = sum(abs(x) for x in self.__width) + width = width + len(self.__width) * len(self.__sep) + 1 + return width + + def getOutput(self): + """ + Get the text output for the table. + + @rtype: str + @return: Text output. + """ + return "%s\n" % "\n".join(self.yieldOutput()) + + def yieldOutput(self): + """ + Generate the text output for the table. + + @rtype: generator of str + @return: Text output. + """ + width = self.__width + if width: + num_cols = len(width) + fmt = ["%%%ds" % -w for w in width] + if width[-1] > 0: + fmt[-1] = "%s" + fmt = self.__sep.join(fmt) + for row in self.__cols: + row.extend([""] * (num_cols - len(row))) + yield fmt % tuple(row) + + def show(self): + """ + Print the text output for the table. + """ + print(self.getOutput()) + + +# ------------------------------------------------------------------------------ + + +class CrashDump(StaticClass): + """ + Static functions for crash dumps. + + @type reg_template: str + @cvar reg_template: Template for the L{dump_registers} method. + """ + + # Templates for the dump_registers method. + reg_template = { + win32.ARCH_I386: ( + "eax=%(Eax).8x ebx=%(Ebx).8x ecx=%(Ecx).8x edx=%(Edx).8x esi=%(Esi).8x edi=%(Edi).8x\n" + "eip=%(Eip).8x esp=%(Esp).8x ebp=%(Ebp).8x %(efl_dump)s\n" + "cs=%(SegCs).4x ss=%(SegSs).4x ds=%(SegDs).4x es=%(SegEs).4x fs=%(SegFs).4x gs=%(SegGs).4x efl=%(EFlags).8x\n" + ), + win32.ARCH_AMD64: ( + "rax=%(Rax).16x rbx=%(Rbx).16x rcx=%(Rcx).16x\n" + "rdx=%(Rdx).16x rsi=%(Rsi).16x rdi=%(Rdi).16x\n" + "rip=%(Rip).16x rsp=%(Rsp).16x rbp=%(Rbp).16x\n" + " r8=%(R8).16x r9=%(R9).16x r10=%(R10).16x\n" + "r11=%(R11).16x r12=%(R12).16x r13=%(R13).16x\n" + "r14=%(R14).16x r15=%(R15).16x\n" + "%(efl_dump)s\n" + "cs=%(SegCs).4x ss=%(SegSs).4x ds=%(SegDs).4x es=%(SegEs).4x fs=%(SegFs).4x gs=%(SegGs).4x efl=%(EFlags).8x\n" + ), + } + + @staticmethod + def dump_flags(efl): + """ + Dump the x86 processor flags. + The output mimics that of the WinDBG debugger. + Used by L{dump_registers}. + + @type efl: int + @param efl: Value of the eFlags register. + + @rtype: str + @return: Text suitable for logging. + """ + if efl is None: + return "" + efl_dump = "iopl=%1d" % ((efl & 0x3000) >> 12) + if efl & 0x100000: + efl_dump += " vip" + else: + efl_dump += " " + if efl & 0x80000: + efl_dump += " vif" + else: + efl_dump += " " + # 0x20000 ??? + if efl & 0x800: + efl_dump += " ov" # Overflow + else: + efl_dump += " no" # No overflow + if efl & 0x400: + efl_dump += " dn" # Downwards + else: + efl_dump += " up" # Upwards + if efl & 0x200: + efl_dump += " ei" # Enable interrupts + else: + efl_dump += " di" # Disable interrupts + # 0x100 trap flag + if efl & 0x80: + efl_dump += " ng" # Negative + else: + efl_dump += " pl" # Positive + if efl & 0x40: + efl_dump += " zr" # Zero + else: + efl_dump += " nz" # Nonzero + if efl & 0x10: + efl_dump += " ac" # Auxiliary carry + else: + efl_dump += " na" # No auxiliary carry + # 0x8 ??? + if efl & 0x4: + efl_dump += " pe" # Parity odd + else: + efl_dump += " po" # Parity even + # 0x2 ??? + if efl & 0x1: + efl_dump += " cy" # Carry + else: + efl_dump += " nc" # No carry + return efl_dump + + @classmethod + def dump_registers(cls, registers, arch=None): + """ + Dump the x86/x64 processor register values. + The output mimics that of the WinDBG debugger. + + @type registers: dict( str S{->} int ) + @param registers: Dictionary mapping register names to their values. + + @type arch: str + @param arch: Architecture of the machine whose registers were dumped. + Defaults to the current architecture. + Currently only the following architectures are supported: + - L{win32.ARCH_I386} + - L{win32.ARCH_AMD64} + + @rtype: str + @return: Text suitable for logging. + """ + if registers is None: + return "" + if arch is None: + if "Eax" in registers: + arch = win32.ARCH_I386 + elif "Rax" in registers: + arch = win32.ARCH_AMD64 + else: + arch = "Unknown" + if arch not in cls.reg_template: + msg = "Don't know how to dump the registers for architecture: %s" + raise NotImplementedError(msg % arch) + registers = registers.copy() + registers["efl_dump"] = cls.dump_flags(registers["EFlags"]) + return cls.reg_template[arch] % registers + + @staticmethod + def dump_registers_peek(registers, data, separator=" ", width=16): + """ + Dump data pointed to by the given registers, if any. + + @type registers: dict( str S{->} int ) + @param registers: Dictionary mapping register names to their values. + This value is returned by L{Thread.get_context}. + + @type data: dict( str S{->} str ) + @param data: Dictionary mapping register names to the data they point to. + This value is returned by L{Thread.peek_pointers_in_registers}. + + @rtype: str + @return: Text suitable for logging. + """ + if None in (registers, data): + return "" + names = compat.keys(data) + names.sort() + result = "" + for reg_name in names: + tag = reg_name.lower() + dumped = HexDump.hexline(data[reg_name], separator, width) + result += "%s -> %s\n" % (tag, dumped) + return result + + @staticmethod + def dump_data_peek(data, base=0, separator=" ", width=16, bits=None): + """ + Dump data from pointers guessed within the given binary data. + + @type data: str + @param data: Dictionary mapping offsets to the data they point to. + + @type base: int + @param base: Base offset. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexDump.address_size} + + @rtype: str + @return: Text suitable for logging. + """ + if data is None: + return "" + pointers = compat.keys(data) + pointers.sort() + result = "" + for offset in pointers: + dumped = HexDump.hexline(data[offset], separator, width) + address = HexDump.address(base + offset, bits) + result += "%s -> %s\n" % (address, dumped) + return result + + @staticmethod + def dump_stack_peek(data, separator=" ", width=16, arch=None): + """ + Dump data from pointers guessed within the given stack dump. + + @type data: str + @param data: Dictionary mapping stack offsets to the data they point to. + + @type separator: str + @param separator: + Separator between the hexadecimal representation of each character. + + @type width: int + @param width: + (Optional) Maximum number of characters to convert per text line. + This value is also used for padding. + + @type arch: str + @param arch: Architecture of the machine whose registers were dumped. + Defaults to the current architecture. + + @rtype: str + @return: Text suitable for logging. + """ + if data is None: + return "" + if arch is None: + arch = win32.arch + pointers = compat.keys(data) + pointers.sort() + result = "" + if pointers: + if arch == win32.ARCH_I386: + spreg = "esp" + elif arch == win32.ARCH_AMD64: + spreg = "rsp" + else: + spreg = "STACK" # just a generic tag + tag_fmt = "[%s+0x%%.%dx]" % (spreg, len("%x" % pointers[-1])) + for offset in pointers: + dumped = HexDump.hexline(data[offset], separator, width) + tag = tag_fmt % offset + result += "%s -> %s\n" % (tag, dumped) + return result + + @staticmethod + def dump_stack_trace(stack_trace, bits=None): + """ + Dump a stack trace, as returned by L{Thread.get_stack_trace} with the + C{bUseLabels} parameter set to C{False}. + + @type stack_trace: list( int, int, str ) + @param stack_trace: Stack trace as a list of tuples of + ( return address, frame pointer, module filename ) + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexDump.address_size} + + @rtype: str + @return: Text suitable for logging. + """ + if not stack_trace: + return "" + table = Table() + table.addRow("Frame", "Origin", "Module") + for fp, ra, mod in stack_trace: + fp_d = HexDump.address(fp, bits) + ra_d = HexDump.address(ra, bits) + table.addRow(fp_d, ra_d, mod) + return table.getOutput() + + @staticmethod + def dump_stack_trace_with_labels(stack_trace, bits=None): + """ + Dump a stack trace, + as returned by L{Thread.get_stack_trace_with_labels}. + + @type stack_trace: list( int, int, str ) + @param stack_trace: Stack trace as a list of tuples of + ( return address, frame pointer, module filename ) + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexDump.address_size} + + @rtype: str + @return: Text suitable for logging. + """ + if not stack_trace: + return "" + table = Table() + table.addRow("Frame", "Origin") + for fp, label in stack_trace: + table.addRow(HexDump.address(fp, bits), label) + return table.getOutput() + + # TODO + # + Instead of a star when EIP points to, it would be better to show + # any register value (or other values like the exception address) that + # points to a location in the dissassembled code. + # + It'd be very useful to show some labels here. + # + It'd be very useful to show register contents for code at EIP + @staticmethod + def dump_code(disassembly, pc=None, bLowercase=True, bits=None): + """ + Dump a disassembly. Optionally mark where the program counter is. + + @type disassembly: list of tuple( int, int, str, str ) + @param disassembly: Disassembly dump as returned by + L{Process.disassemble} or L{Thread.disassemble_around_pc}. + + @type pc: int + @param pc: (Optional) Program counter. + + @type bLowercase: bool + @param bLowercase: (Optional) If C{True} convert the code to lowercase. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexDump.address_size} + + @rtype: str + @return: Text suitable for logging. + """ + if not disassembly: + return "" + table = Table(sep=" | ") + for addr, size, code, dump in disassembly: + if bLowercase: + code = code.lower() + if addr == pc: + addr = " * %s" % HexDump.address(addr, bits) + else: + addr = " %s" % HexDump.address(addr, bits) + table.addRow(addr, dump, code) + table.justify(1, 1) + return table.getOutput() + + @staticmethod + def dump_code_line(disassembly_line, bShowAddress=True, bShowDump=True, bLowercase=True, dwDumpWidth=None, dwCodeWidth=None, bits=None): + """ + Dump a single line of code. To dump a block of code use L{dump_code}. + + @type disassembly_line: tuple( int, int, str, str ) + @param disassembly_line: Single item of the list returned by + L{Process.disassemble} or L{Thread.disassemble_around_pc}. + + @type bShowAddress: bool + @param bShowAddress: (Optional) If C{True} show the memory address. + + @type bShowDump: bool + @param bShowDump: (Optional) If C{True} show the hexadecimal dump. + + @type bLowercase: bool + @param bLowercase: (Optional) If C{True} convert the code to lowercase. + + @type dwDumpWidth: int or None + @param dwDumpWidth: (Optional) Width in characters of the hex dump. + + @type dwCodeWidth: int or None + @param dwCodeWidth: (Optional) Width in characters of the code. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexDump.address_size} + + @rtype: str + @return: Text suitable for logging. + """ + if bits is None: + address_size = HexDump.address_size + else: + address_size = bits / 4 + (addr, size, code, dump) = disassembly_line + dump = dump.replace(" ", "") + result = list() + fmt = "" + if bShowAddress: + result.append(HexDump.address(addr, bits)) + fmt += "%%%ds:" % address_size + if bShowDump: + result.append(dump) + if dwDumpWidth: + fmt += " %%-%ds" % dwDumpWidth + else: + fmt += " %s" + if bLowercase: + code = code.lower() + result.append(code) + if dwCodeWidth: + fmt += " %%-%ds" % dwCodeWidth + else: + fmt += " %s" + return fmt % tuple(result) + + @staticmethod + def dump_memory_map(memoryMap, mappedFilenames=None, bits=None): + """ + Dump the memory map of a process. Optionally show the filenames for + memory mapped files as well. + + @type memoryMap: list( L{win32.MemoryBasicInformation} ) + @param memoryMap: Memory map returned by L{Process.get_memory_map}. + + @type mappedFilenames: dict( int S{->} str ) + @param mappedFilenames: (Optional) Memory mapped filenames + returned by L{Process.get_mapped_filenames}. + + @type bits: int + @param bits: + (Optional) Number of bits of the target architecture. + The default is platform dependent. See: L{HexDump.address_size} + + @rtype: str + @return: Text suitable for logging. + """ + if not memoryMap: + return "" + + table = Table() + if mappedFilenames: + table.addRow("Address", "Size", "State", "Access", "Type", "File") + else: + table.addRow("Address", "Size", "State", "Access", "Type") + + # For each memory block in the map... + for mbi in memoryMap: + # Address and size of memory block. + BaseAddress = HexDump.address(mbi.BaseAddress, bits) + RegionSize = HexDump.address(mbi.RegionSize, bits) + + # State (free or allocated). + mbiState = mbi.State + if mbiState == win32.MEM_RESERVE: + State = "Reserved" + elif mbiState == win32.MEM_COMMIT: + State = "Commited" + elif mbiState == win32.MEM_FREE: + State = "Free" + else: + State = "Unknown" + + # Page protection bits (R/W/X/G). + if mbiState != win32.MEM_COMMIT: + Protect = "" + else: + mbiProtect = mbi.Protect + if mbiProtect & win32.PAGE_NOACCESS: + Protect = "--- " + elif mbiProtect & win32.PAGE_READONLY: + Protect = "R-- " + elif mbiProtect & win32.PAGE_READWRITE: + Protect = "RW- " + elif mbiProtect & win32.PAGE_WRITECOPY: + Protect = "RC- " + elif mbiProtect & win32.PAGE_EXECUTE: + Protect = "--X " + elif mbiProtect & win32.PAGE_EXECUTE_READ: + Protect = "R-X " + elif mbiProtect & win32.PAGE_EXECUTE_READWRITE: + Protect = "RWX " + elif mbiProtect & win32.PAGE_EXECUTE_WRITECOPY: + Protect = "RCX " + else: + Protect = "??? " + if mbiProtect & win32.PAGE_GUARD: + Protect += "G" + else: + Protect += "-" + if mbiProtect & win32.PAGE_NOCACHE: + Protect += "N" + else: + Protect += "-" + if mbiProtect & win32.PAGE_WRITECOMBINE: + Protect += "W" + else: + Protect += "-" + + # Type (file mapping, executable image, or private memory). + mbiType = mbi.Type + if mbiType == win32.MEM_IMAGE: + Type = "Image" + elif mbiType == win32.MEM_MAPPED: + Type = "Mapped" + elif mbiType == win32.MEM_PRIVATE: + Type = "Private" + elif mbiType == 0: + Type = "" + else: + Type = "Unknown" + + # Output a row in the table. + if mappedFilenames: + FileName = mappedFilenames.get(mbi.BaseAddress, "") + table.addRow(BaseAddress, RegionSize, State, Protect, Type, FileName) + else: + table.addRow(BaseAddress, RegionSize, State, Protect, Type) + + # Return the table output. + return table.getOutput() + + +# ------------------------------------------------------------------------------ + + +class DebugLog(StaticClass): + "Static functions for debug logging." + + @staticmethod + def log_text(text): + """ + Log lines of text, inserting a timestamp. + + @type text: str + @param text: Text to log. + + @rtype: str + @return: Log line. + """ + if text.endswith("\n"): + text = text[: -len("\n")] + # text = text.replace('\n', '\n\t\t') # text CSV + ltime = time.strftime("%X") + msecs = (time.time() % 1) * 1000 + return "[%s.%04d] %s" % (ltime, msecs, text) + # return '[%s.%04d]\t%s' % (ltime, msecs, text) # text CSV + + @classmethod + def log_event(cls, event, text=None): + """ + Log lines of text associated with a debug event. + + @type event: L{Event} + @param event: Event object. + + @type text: str + @param text: (Optional) Text to log. If no text is provided the default + is to show a description of the event itself. + + @rtype: str + @return: Log line. + """ + if not text: + if event.get_event_code() == win32.EXCEPTION_DEBUG_EVENT: + what = event.get_exception_description() + if event.is_first_chance(): + what = "%s (first chance)" % what + else: + what = "%s (second chance)" % what + try: + address = event.get_fault_address() + except NotImplementedError: + address = event.get_exception_address() + else: + what = event.get_event_name() + address = event.get_thread().get_pc() + process = event.get_process() + label = process.get_label_at_address(address) + address = HexDump.address(address, process.get_bits()) + if label: + where = "%s (%s)" % (address, label) + else: + where = address + text = "%s at %s" % (what, where) + text = "pid %d tid %d: %s" % (event.get_pid(), event.get_tid(), text) + # text = 'pid %d tid %d:\t%s' % (event.get_pid(), event.get_tid(), text) # text CSV + return cls.log_text(text) + + +# ------------------------------------------------------------------------------ + + +class Logger(object): + """ + Logs text to standard output and/or a text file. + + @type logfile: str or None + @ivar logfile: Append messages to this text file. + + @type verbose: bool + @ivar verbose: C{True} to print messages to standard output. + + @type fd: file + @ivar fd: File object where log messages are printed to. + C{None} if no log file is used. + """ + + def __init__(self, logfile=None, verbose=True): + """ + @type logfile: str or None + @param logfile: Append messages to this text file. + + @type verbose: bool + @param verbose: C{True} to print messages to standard output. + """ + self.verbose = verbose + self.logfile = logfile + if self.logfile: + self.fd = open(self.logfile, "a+") + + def __logfile_error(self, e): + """ + Shows an error message to standard error + if the log file can't be written to. + + Used internally. + + @type e: Exception + @param e: Exception raised when trying to write to the log file. + """ + from sys import stderr + + msg = "Warning, error writing log file %s: %s\n" + msg = msg % (self.logfile, str(e)) + stderr.write(DebugLog.log_text(msg)) + self.logfile = None + self.fd = None + + def __do_log(self, text): + """ + Writes the given text verbatim into the log file (if any) + and/or standard input (if the verbose flag is turned on). + + Used internally. + + @type text: str + @param text: Text to print. + """ + if isinstance(text, compat.unicode): + text = text.encode("cp1252") + if self.verbose: + print(text) + if self.logfile: + try: + self.fd.writelines("%s\n" % text) + except IOError: + e = sys.exc_info()[1] + self.__logfile_error(e) + + def log_text(self, text): + """ + Log lines of text, inserting a timestamp. + + @type text: str + @param text: Text to log. + """ + self.__do_log(DebugLog.log_text(text)) + + def log_event(self, event, text=None): + """ + Log lines of text associated with a debug event. + + @type event: L{Event} + @param event: Event object. + + @type text: str + @param text: (Optional) Text to log. If no text is provided the default + is to show a description of the event itself. + """ + self.__do_log(DebugLog.log_event(event, text)) + + def log_exc(self): + """ + Log lines of text associated with the last Python exception. + """ + self.__do_log("Exception raised: %s" % traceback.format_exc()) + + def is_enabled(self): + """ + Determines if the logger will actually print anything when the log_* + methods are called. + + This may save some processing if the log text requires a lengthy + calculation to prepare. If no log file is set and stdout logging + is disabled, there's no point in preparing a log text that won't + be shown to anyone. + + @rtype: bool + @return: C{True} if a log file was set and/or standard output logging + is enabled, or C{False} otherwise. + """ + return self.verbose or self.logfile diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/thread.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/thread.py new file mode 100644 index 0000000..91bc413 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/thread.py @@ -0,0 +1,2108 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Thread instrumentation. + +@group Instrumentation: + Thread +""" + +from __future__ import with_statement + +__revision__ = "$Id$" + +__all__ = ["Thread"] + +from winappdbg import win32 +from winappdbg import compat +from winappdbg.textio import HexDump +from winappdbg.util import DebugRegister +from winappdbg.window import Window + +import sys +import struct +import warnings + +# delayed imports +Process = None + +# ============================================================================== + +# TODO +# + fetch special registers (MMX, XMM, 3DNow!, etc) + + +class Thread(object): + """ + Interface to a thread in another process. + + @group Properties: + get_tid, get_pid, get_process, set_process, get_exit_code, is_alive, + get_name, set_name, get_windows, get_teb, get_teb_address, is_wow64, + get_arch, get_bits, get_handle, open_handle, close_handle + + @group Instrumentation: + suspend, resume, kill, wait + + @group Debugging: + get_seh_chain_pointer, set_seh_chain_pointer, + get_seh_chain, get_wait_chain, is_hidden + + @group Disassembly: + disassemble, disassemble_around, disassemble_around_pc, + disassemble_string, disassemble_instruction, disassemble_current + + @group Stack: + get_stack_frame, get_stack_frame_range, get_stack_range, + get_stack_trace, get_stack_trace_with_labels, + read_stack_data, read_stack_dwords, read_stack_qwords, + peek_stack_data, peek_stack_dwords, peek_stack_qwords, + read_stack_structure, read_stack_frame + + @group Registers: + get_context, + get_register, + get_flags, get_flag_value, + get_pc, get_sp, get_fp, + get_cf, get_df, get_sf, get_tf, get_zf, + set_context, + set_register, + set_flags, set_flag_value, + set_pc, set_sp, set_fp, + set_cf, set_df, set_sf, set_tf, set_zf, + clear_cf, clear_df, clear_sf, clear_tf, clear_zf, + Flags + + @group Threads snapshot: + clear + + @group Miscellaneous: + read_code_bytes, peek_code_bytes, + peek_pointers_in_data, peek_pointers_in_registers, + get_linear_address, get_label_at_pc + + @type dwThreadId: int + @ivar dwThreadId: Global thread ID. Use L{get_tid} instead. + + @type hThread: L{ThreadHandle} + @ivar hThread: Handle to the thread. Use L{get_handle} instead. + + @type process: L{Process} + @ivar process: Parent process object. Use L{get_process} instead. + + @type pInjectedMemory: int + @ivar pInjectedMemory: If the thread was created by L{Process.inject_code}, + this member contains a pointer to the memory buffer for the injected + code. Otherwise it's C{None}. + + The L{kill} method uses this member to free the buffer + when the injected thread is killed. + """ + + def __init__(self, dwThreadId, hThread=None, process=None): + """ + @type dwThreadId: int + @param dwThreadId: Global thread ID. + + @type hThread: L{ThreadHandle} + @param hThread: (Optional) Handle to the thread. + + @type process: L{Process} + @param process: (Optional) Parent Process object. + """ + self.dwProcessId = None + self.dwThreadId = dwThreadId + self.hThread = hThread + self.pInjectedMemory = None + self.set_name(None) + self.set_process(process) + + # Not really sure if it's a good idea... + ## def __eq__(self, aThread): + ## """ + ## Compare two Thread objects. The comparison is made using the IDs. + ## + ## @warning: + ## If you have two Thread instances with different handles the + ## equality operator still returns C{True}, so be careful! + ## + ## @type aThread: L{Thread} + ## @param aThread: Another Thread object. + ## + ## @rtype: bool + ## @return: C{True} if the two thread IDs are equal, + ## C{False} otherwise. + ## """ + ## return isinstance(aThread, Thread) and \ + ## self.get_tid() == aThread.get_tid() + + def __load_Process_class(self): + global Process # delayed import + if Process is None: + from winappdbg.process import Process + + def get_process(self): + """ + @rtype: L{Process} + @return: Parent Process object. + Returns C{None} if unknown. + """ + if self.__process is not None: + return self.__process + self.__load_Process_class() + self.__process = Process(self.get_pid()) + return self.__process + + def set_process(self, process=None): + """ + Manually set the parent Process object. Use with care! + + @type process: L{Process} + @param process: (Optional) Process object. Use C{None} for no process. + """ + if process is None: + self.dwProcessId = None + self.__process = None + else: + self.__load_Process_class() + if not isinstance(process, Process): + msg = "Parent process must be a Process instance, " + msg += "got %s instead" % type(process) + raise TypeError(msg) + self.dwProcessId = process.get_pid() + self.__process = process + + process = property(get_process, set_process, doc="") + + def get_pid(self): + """ + @rtype: int + @return: Parent process global ID. + + @raise WindowsError: An error occured when calling a Win32 API function. + @raise RuntimeError: The parent process ID can't be found. + """ + if self.dwProcessId is None: + if self.__process is not None: + # Infinite loop if self.__process is None + self.dwProcessId = self.get_process().get_pid() + else: + try: + # I wish this had been implemented before Vista... + # XXX TODO find the real ntdll call under this api + hThread = self.get_handle(win32.THREAD_QUERY_LIMITED_INFORMATION) + self.dwProcessId = win32.GetProcessIdOfThread(hThread) + except AttributeError: + # This method is really bad :P + self.dwProcessId = self.__get_pid_by_scanning() + return self.dwProcessId + + def __get_pid_by_scanning(self): + "Internally used by get_pid()." + dwProcessId = None + dwThreadId = self.get_tid() + with win32.CreateToolhelp32Snapshot(win32.TH32CS_SNAPTHREAD) as hSnapshot: + te = win32.Thread32First(hSnapshot) + while te is not None: + if te.th32ThreadID == dwThreadId: + dwProcessId = te.th32OwnerProcessID + break + te = win32.Thread32Next(hSnapshot) + if dwProcessId is None: + msg = "Cannot find thread ID %d in any process" % dwThreadId + raise RuntimeError(msg) + return dwProcessId + + def get_tid(self): + """ + @rtype: int + @return: Thread global ID. + """ + return self.dwThreadId + + def get_name(self): + """ + @rtype: str + @return: Thread name, or C{None} if the thread is nameless. + """ + return self.name + + def set_name(self, name=None): + """ + Sets the thread's name. + + @type name: str + @param name: Thread name, or C{None} if the thread is nameless. + """ + self.name = name + + # ------------------------------------------------------------------------------ + + def open_handle(self, dwDesiredAccess=win32.THREAD_ALL_ACCESS): + """ + Opens a new handle to the thread, closing the previous one. + + The new handle is stored in the L{hThread} property. + + @warn: Normally you should call L{get_handle} instead, since it's much + "smarter" and tries to reuse handles and merge access rights. + + @type dwDesiredAccess: int + @param dwDesiredAccess: Desired access rights. + Defaults to L{win32.THREAD_ALL_ACCESS}. + See: U{http://msdn.microsoft.com/en-us/library/windows/desktop/ms686769(v=vs.85).aspx} + + @raise WindowsError: It's not possible to open a handle to the thread + with the requested access rights. This tipically happens because + the target thread belongs to system process and the debugger is not + runnning with administrative rights. + """ + hThread = win32.OpenThread(dwDesiredAccess, win32.FALSE, self.dwThreadId) + + # In case hThread was set to an actual handle value instead of a Handle + # object. This shouldn't happen unless the user tinkered with it. + if not hasattr(self.hThread, "__del__"): + self.close_handle() + + self.hThread = hThread + + def close_handle(self): + """ + Closes the handle to the thread. + + @note: Normally you don't need to call this method. All handles + created by I{WinAppDbg} are automatically closed when the garbage + collector claims them. + """ + try: + if hasattr(self.hThread, "close"): + self.hThread.close() + elif self.hThread not in (None, win32.INVALID_HANDLE_VALUE): + win32.CloseHandle(self.hThread) + finally: + self.hThread = None + + def get_handle(self, dwDesiredAccess=win32.THREAD_ALL_ACCESS): + """ + Returns a handle to the thread with I{at least} the access rights + requested. + + @note: + If a handle was previously opened and has the required access + rights, it's reused. If not, a new handle is opened with the + combination of the old and new access rights. + + @type dwDesiredAccess: int + @param dwDesiredAccess: Desired access rights. + See: U{http://msdn.microsoft.com/en-us/library/windows/desktop/ms686769(v=vs.85).aspx} + + @rtype: ThreadHandle + @return: Handle to the thread. + + @raise WindowsError: It's not possible to open a handle to the thread + with the requested access rights. This tipically happens because + the target thread belongs to system process and the debugger is not + runnning with administrative rights. + """ + if self.hThread in (None, win32.INVALID_HANDLE_VALUE): + self.open_handle(dwDesiredAccess) + else: + dwAccess = self.hThread.dwAccess + if (dwAccess | dwDesiredAccess) != dwAccess: + self.open_handle(dwAccess | dwDesiredAccess) + return self.hThread + + def clear(self): + """ + Clears the resources held by this object. + """ + try: + self.set_process(None) + finally: + self.close_handle() + + # ------------------------------------------------------------------------------ + + def wait(self, dwTimeout=None): + """ + Waits for the thread to finish executing. + + @type dwTimeout: int + @param dwTimeout: (Optional) Timeout value in milliseconds. + Use C{INFINITE} or C{None} for no timeout. + """ + self.get_handle(win32.SYNCHRONIZE).wait(dwTimeout) + + def kill(self, dwExitCode=0): + """ + Terminates the thread execution. + + @note: If the C{lpInjectedMemory} member contains a valid pointer, + the memory is freed. + + @type dwExitCode: int + @param dwExitCode: (Optional) Thread exit code. + """ + hThread = self.get_handle(win32.THREAD_TERMINATE) + win32.TerminateThread(hThread, dwExitCode) + + # Ugliest hack ever, won't work if many pieces of code are injected. + # Seriously, what was I thinking? :( + if self.pInjectedMemory is not None: + try: + self.get_process().free(self.pInjectedMemory) + self.pInjectedMemory = None + except Exception: + ## raise # XXX DEBUG + pass + + # XXX TODO + # suspend() and resume() should have a counter of how many times a thread + # was suspended, so on debugger exit they could (optionally!) be restored + + def suspend(self): + """ + Suspends the thread execution. + + @rtype: int + @return: Suspend count. If zero, the thread is running. + """ + hThread = self.get_handle(win32.THREAD_SUSPEND_RESUME) + if self.is_wow64(): + # FIXME this will be horribly slow on XP 64 + # since it'll try to resolve a missing API every time + try: + return win32.Wow64SuspendThread(hThread) + except AttributeError: + pass + return win32.SuspendThread(hThread) + + def resume(self): + """ + Resumes the thread execution. + + @rtype: int + @return: Suspend count. If zero, the thread is running. + """ + hThread = self.get_handle(win32.THREAD_SUSPEND_RESUME) + return win32.ResumeThread(hThread) + + def is_alive(self): + """ + @rtype: bool + @return: C{True} if the thread if currently running. + @raise WindowsError: + The debugger doesn't have enough privileges to perform this action. + """ + try: + self.wait(0) + except WindowsError: + e = sys.exc_info()[1] + error = e.winerror + if error == win32.ERROR_ACCESS_DENIED: + raise + return error == win32.WAIT_TIMEOUT + return True + + def get_exit_code(self): + """ + @rtype: int + @return: Thread exit code, or C{STILL_ACTIVE} if it's still alive. + """ + if win32.THREAD_ALL_ACCESS == win32.THREAD_ALL_ACCESS_VISTA: + dwAccess = win32.THREAD_QUERY_LIMITED_INFORMATION + else: + dwAccess = win32.THREAD_QUERY_INFORMATION + return win32.GetExitCodeThread(self.get_handle(dwAccess)) + + # ------------------------------------------------------------------------------ + + # XXX TODO + # Support for string searches on the window captions. + + def get_windows(self): + """ + @rtype: list of L{Window} + @return: Returns a list of windows handled by this thread. + """ + try: + process = self.get_process() + except Exception: + process = None + return [Window(hWnd, process, self) for hWnd in win32.EnumThreadWindows(self.get_tid())] + + # ------------------------------------------------------------------------------ + + # TODO + # A registers cache could be implemented here. + def get_context(self, ContextFlags=None, bSuspend=False): + """ + Retrieves the execution context (i.e. the registers values) for this + thread. + + @type ContextFlags: int + @param ContextFlags: Optional, specify which registers to retrieve. + Defaults to C{win32.CONTEXT_ALL} which retrieves all registes + for the current platform. + + @type bSuspend: bool + @param bSuspend: C{True} to automatically suspend the thread before + getting its context, C{False} otherwise. + + Defaults to C{False} because suspending the thread during some + debug events (like thread creation or destruction) may lead to + strange errors. + + Note that WinAppDbg 1.4 used to suspend the thread automatically + always. This behavior was changed in version 1.5. + + @rtype: dict( str S{->} int ) + @return: Dictionary mapping register names to their values. + + @see: L{set_context} + """ + + # Some words on the "strange errors" that lead to the bSuspend + # parameter. Peter Van Eeckhoutte and I were working on a fix + # for some bugs he found in the 1.5 betas when we stumbled upon + # what seemed to be a deadlock in the debug API that caused the + # GetThreadContext() call never to return. Since removing the + # call to SuspendThread() solved the problem, and a few Google + # searches showed a handful of problems related to these two + # APIs and Wow64 environments, I decided to break compatibility. + # + # Here are some pages about the weird behavior of SuspendThread: + # http://zachsaw.blogspot.com.es/2010/11/wow64-bug-getthreadcontext-may-return.html + # http://stackoverflow.com/questions/3444190/windows-suspendthread-doesnt-getthreadcontext-fails + + # Get the thread handle. + dwAccess = win32.THREAD_GET_CONTEXT + if bSuspend: + dwAccess = dwAccess | win32.THREAD_SUSPEND_RESUME + hThread = self.get_handle(dwAccess) + + # Suspend the thread if requested. + if bSuspend: + try: + self.suspend() + except WindowsError: + # Threads can't be suspended when the exit process event + # arrives, but you can still get the context. + bSuspend = False + + # If an exception is raised, make sure the thread execution is resumed. + try: + if win32.bits == self.get_bits(): + # 64 bit debugger attached to 64 bit process, or + # 32 bit debugger attached to 32 bit process. + ctx = win32.GetThreadContext(hThread, ContextFlags=ContextFlags) + + else: + if self.is_wow64(): + # 64 bit debugger attached to 32 bit process. + if ContextFlags is not None: + ContextFlags &= ~win32.ContextArchMask + ContextFlags |= win32.WOW64_CONTEXT_i386 + ctx = win32.Wow64GetThreadContext(hThread, ContextFlags) + + else: + # 32 bit debugger attached to 64 bit process. + # XXX only i386/AMD64 is supported in this particular case + if win32.arch not in (win32.ARCH_I386, win32.ARCH_AMD64): + raise NotImplementedError() + if ContextFlags is not None: + ContextFlags &= ~win32.ContextArchMask + ContextFlags |= win32.context_amd64.CONTEXT_AMD64 + ctx = win32.context_amd64.GetThreadContext(hThread, ContextFlags=ContextFlags) + + finally: + # Resume the thread if we suspended it. + if bSuspend: + self.resume() + + # Return the context. + return ctx + + def set_context(self, context, bSuspend=False): + """ + Sets the values of the registers. + + @see: L{get_context} + + @type context: dict( str S{->} int ) + @param context: Dictionary mapping register names to their values. + + @type bSuspend: bool + @param bSuspend: C{True} to automatically suspend the thread before + setting its context, C{False} otherwise. + + Defaults to C{False} because suspending the thread during some + debug events (like thread creation or destruction) may lead to + strange errors. + + Note that WinAppDbg 1.4 used to suspend the thread automatically + always. This behavior was changed in version 1.5. + """ + + # Get the thread handle. + dwAccess = win32.THREAD_SET_CONTEXT + if bSuspend: + dwAccess = dwAccess | win32.THREAD_SUSPEND_RESUME + hThread = self.get_handle(dwAccess) + + # Suspend the thread if requested. + if bSuspend: + self.suspend() + # No fix for the exit process event bug. + # Setting the context of a dead thread is pointless anyway. + + # Set the thread context. + try: + if win32.bits == 64 and self.is_wow64(): + win32.Wow64SetThreadContext(hThread, context) + else: + win32.SetThreadContext(hThread, context) + + # Resume the thread if we suspended it. + finally: + if bSuspend: + self.resume() + + def get_register(self, register): + """ + @type register: str + @param register: Register name. + + @rtype: int + @return: Value of the requested register. + """ + "Returns the value of a specific register." + context = self.get_context() + return context[register] + + def set_register(self, register, value): + """ + Sets the value of a specific register. + + @type register: str + @param register: Register name. + + @rtype: int + @return: Register value. + """ + context = self.get_context() + context[register] = value + self.set_context(context) + + # ------------------------------------------------------------------------------ + + # TODO: a metaclass would do a better job instead of checking the platform + # during module import, also would support mixing 32 and 64 bits + + if win32.arch in (win32.ARCH_I386, win32.ARCH_AMD64): + + def get_pc(self): + """ + @rtype: int + @return: Value of the program counter register. + """ + context = self.get_context(win32.CONTEXT_CONTROL) + return context.pc + + def set_pc(self, pc): + """ + Sets the value of the program counter register. + + @type pc: int + @param pc: Value of the program counter register. + """ + context = self.get_context(win32.CONTEXT_CONTROL) + context.pc = pc + self.set_context(context) + + def get_sp(self): + """ + @rtype: int + @return: Value of the stack pointer register. + """ + context = self.get_context(win32.CONTEXT_CONTROL) + return context.sp + + def set_sp(self, sp): + """ + Sets the value of the stack pointer register. + + @type sp: int + @param sp: Value of the stack pointer register. + """ + context = self.get_context(win32.CONTEXT_CONTROL) + context.sp = sp + self.set_context(context) + + def get_fp(self): + """ + @rtype: int + @return: Value of the frame pointer register. + """ + flags = win32.CONTEXT_CONTROL | win32.CONTEXT_INTEGER + context = self.get_context(flags) + return context.fp + + def set_fp(self, fp): + """ + Sets the value of the frame pointer register. + + @type fp: int + @param fp: Value of the frame pointer register. + """ + flags = win32.CONTEXT_CONTROL | win32.CONTEXT_INTEGER + context = self.get_context(flags) + context.fp = fp + self.set_context(context) + + # ------------------------------------------------------------------------------ + + if win32.arch in (win32.ARCH_I386, win32.ARCH_AMD64): + + class Flags(object): + "Commonly used processor flags" + + Overflow = 0x800 + Direction = 0x400 + Interrupts = 0x200 + Trap = 0x100 + Sign = 0x80 + Zero = 0x40 + # 0x20 ??? + Auxiliary = 0x10 + # 0x8 ??? + Parity = 0x4 + # 0x2 ??? + Carry = 0x1 + + def get_flags(self, FlagMask=0xFFFFFFFF): + """ + @type FlagMask: int + @param FlagMask: (Optional) Bitwise-AND mask. + + @rtype: int + @return: Flags register contents, optionally masking out some bits. + """ + context = self.get_context(win32.CONTEXT_CONTROL) + return context["EFlags"] & FlagMask + + def set_flags(self, eflags, FlagMask=0xFFFFFFFF): + """ + Sets the flags register, optionally masking some bits. + + @type eflags: int + @param eflags: Flags register contents. + + @type FlagMask: int + @param FlagMask: (Optional) Bitwise-AND mask. + """ + context = self.get_context(win32.CONTEXT_CONTROL) + context["EFlags"] = (context["EFlags"] & FlagMask) | eflags + self.set_context(context) + + def get_flag_value(self, FlagBit): + """ + @type FlagBit: int + @param FlagBit: One of the L{Flags}. + + @rtype: bool + @return: Boolean value of the requested flag. + """ + return bool(self.get_flags(FlagBit)) + + def set_flag_value(self, FlagBit, FlagValue): + """ + Sets a single flag, leaving the others intact. + + @type FlagBit: int + @param FlagBit: One of the L{Flags}. + + @type FlagValue: bool + @param FlagValue: Boolean value of the flag. + """ + if FlagValue: + eflags = FlagBit + else: + eflags = 0 + FlagMask = 0xFFFFFFFF ^ FlagBit + self.set_flags(eflags, FlagMask) + + def get_zf(self): + """ + @rtype: bool + @return: Boolean value of the Zero flag. + """ + return self.get_flag_value(self.Flags.Zero) + + def get_cf(self): + """ + @rtype: bool + @return: Boolean value of the Carry flag. + """ + return self.get_flag_value(self.Flags.Carry) + + def get_sf(self): + """ + @rtype: bool + @return: Boolean value of the Sign flag. + """ + return self.get_flag_value(self.Flags.Sign) + + def get_df(self): + """ + @rtype: bool + @return: Boolean value of the Direction flag. + """ + return self.get_flag_value(self.Flags.Direction) + + def get_tf(self): + """ + @rtype: bool + @return: Boolean value of the Trap flag. + """ + return self.get_flag_value(self.Flags.Trap) + + def clear_zf(self): + "Clears the Zero flag." + self.set_flag_value(self.Flags.Zero, False) + + def clear_cf(self): + "Clears the Carry flag." + self.set_flag_value(self.Flags.Carry, False) + + def clear_sf(self): + "Clears the Sign flag." + self.set_flag_value(self.Flags.Sign, False) + + def clear_df(self): + "Clears the Direction flag." + self.set_flag_value(self.Flags.Direction, False) + + def clear_tf(self): + "Clears the Trap flag." + self.set_flag_value(self.Flags.Trap, False) + + def set_zf(self): + "Sets the Zero flag." + self.set_flag_value(self.Flags.Zero, True) + + def set_cf(self): + "Sets the Carry flag." + self.set_flag_value(self.Flags.Carry, True) + + def set_sf(self): + "Sets the Sign flag." + self.set_flag_value(self.Flags.Sign, True) + + def set_df(self): + "Sets the Direction flag." + self.set_flag_value(self.Flags.Direction, True) + + def set_tf(self): + "Sets the Trap flag." + self.set_flag_value(self.Flags.Trap, True) + + # ------------------------------------------------------------------------------ + + def is_wow64(self): + """ + Determines if the thread is running under WOW64. + + @rtype: bool + @return: + C{True} if the thread is running under WOW64. That is, it belongs + to a 32-bit application running in a 64-bit Windows. + + C{False} if the thread belongs to either a 32-bit application + running in a 32-bit Windows, or a 64-bit application running in a + 64-bit Windows. + + @raise WindowsError: On error an exception is raised. + + @see: U{http://msdn.microsoft.com/en-us/library/aa384249(VS.85).aspx} + """ + try: + wow64 = self.__wow64 + except AttributeError: + if win32.bits == 32 and not win32.wow64: + wow64 = False + else: + wow64 = self.get_process().is_wow64() + self.__wow64 = wow64 + return wow64 + + def get_arch(self): + """ + @rtype: str + @return: The architecture in which this thread believes to be running. + For example, if running a 32 bit binary in a 64 bit machine, the + architecture returned by this method will be L{win32.ARCH_I386}, + but the value of L{System.arch} will be L{win32.ARCH_AMD64}. + """ + if win32.bits == 32 and not win32.wow64: + return win32.arch + return self.get_process().get_arch() + + def get_bits(self): + """ + @rtype: str + @return: The number of bits in which this thread believes to be + running. For example, if running a 32 bit binary in a 64 bit + machine, the number of bits returned by this method will be C{32}, + but the value of L{System.arch} will be C{64}. + """ + if win32.bits == 32 and not win32.wow64: + return 32 + return self.get_process().get_bits() + + def is_hidden(self): + """ + Determines if the thread has been hidden from debuggers. + + Some binary packers hide their own threads to thwart debugging. + + @rtype: bool + @return: C{True} if the thread is hidden from debuggers. + This means the thread's execution won't be stopped for debug + events, and thus said events won't be sent to the debugger. + """ + return win32.NtQueryInformationThread( + self.get_handle(), # XXX what permissions do I need? + win32.ThreadHideFromDebugger, + ) + + def get_teb(self): + """ + Returns a copy of the TEB. + To dereference pointers in it call L{Process.read_structure}. + + @rtype: L{TEB} + @return: TEB structure. + @raise WindowsError: An exception is raised on error. + """ + return self.get_process().read_structure(self.get_teb_address(), win32.TEB) + + def get_teb_address(self): + """ + Returns a remote pointer to the TEB. + + @rtype: int + @return: Remote pointer to the L{TEB} structure. + @raise WindowsError: An exception is raised on error. + """ + try: + return self._teb_ptr + except AttributeError: + try: + hThread = self.get_handle(win32.THREAD_QUERY_INFORMATION) + tbi = win32.NtQueryInformationThread(hThread, win32.ThreadBasicInformation) + address = tbi.TebBaseAddress + except WindowsError: + address = self.get_linear_address("SegFs", 0) # fs:[0] + if not address: + raise + self._teb_ptr = address + return address + + def get_linear_address(self, segment, address): + """ + Translates segment-relative addresses to linear addresses. + + Linear addresses can be used to access a process memory, + calling L{Process.read} and L{Process.write}. + + @type segment: str + @param segment: Segment register name. + + @type address: int + @param address: Segment relative memory address. + + @rtype: int + @return: Linear memory address. + + @raise ValueError: Address is too large for selector. + + @raise WindowsError: + The current architecture does not support selectors. + Selectors only exist in x86-based systems. + """ + hThread = self.get_handle(win32.THREAD_QUERY_INFORMATION) + selector = self.get_register(segment) + ldt = win32.GetThreadSelectorEntry(hThread, selector) + BaseLow = ldt.BaseLow + BaseMid = ldt.HighWord.Bytes.BaseMid << 16 + BaseHi = ldt.HighWord.Bytes.BaseHi << 24 + Base = BaseLow | BaseMid | BaseHi + LimitLow = ldt.LimitLow + LimitHi = ldt.HighWord.Bits.LimitHi << 16 + Limit = LimitLow | LimitHi + if address > Limit: + msg = "Address %s too large for segment %s (selector %d)" + msg = msg % (HexDump.address(address, self.get_bits()), segment, selector) + raise ValueError(msg) + return Base + address + + def get_label_at_pc(self): + """ + @rtype: str + @return: Label that points to the instruction currently being executed. + """ + return self.get_process().get_label_at_address(self.get_pc()) + + def get_seh_chain_pointer(self): + """ + Get the pointer to the first structured exception handler block. + + @rtype: int + @return: Remote pointer to the first block of the structured exception + handlers linked list. If the list is empty, the returned value is + C{0xFFFFFFFF}. + + @raise NotImplementedError: + This method is only supported in 32 bits versions of Windows. + """ + if win32.arch != win32.ARCH_I386: + raise NotImplementedError("SEH chain parsing is only supported in 32-bit Windows.") + + process = self.get_process() + address = self.get_linear_address("SegFs", 0) + return process.read_pointer(address) + + def set_seh_chain_pointer(self, value): + """ + Change the pointer to the first structured exception handler block. + + @type value: int + @param value: Value of the remote pointer to the first block of the + structured exception handlers linked list. To disable SEH set the + value C{0xFFFFFFFF}. + + @raise NotImplementedError: + This method is only supported in 32 bits versions of Windows. + """ + if win32.arch != win32.ARCH_I386: + raise NotImplementedError("SEH chain parsing is only supported in 32-bit Windows.") + + process = self.get_process() + address = self.get_linear_address("SegFs", 0) + process.write_pointer(address, value) + + def get_seh_chain(self): + """ + @rtype: list of tuple( int, int ) + @return: List of structured exception handlers. + Each SEH is represented as a tuple of two addresses: + - Address of this SEH block + - Address of the SEH callback function + Do not confuse this with the contents of the SEH block itself, + where the first member is a pointer to the B{next} block instead. + + @raise NotImplementedError: + This method is only supported in 32 bits versions of Windows. + """ + seh_chain = list() + try: + process = self.get_process() + seh = self.get_seh_chain_pointer() + while seh != 0xFFFFFFFF: + seh_func = process.read_pointer(seh + 4) + seh_chain.append((seh, seh_func)) + seh = process.read_pointer(seh) + except WindowsError: + seh_chain.append((seh, None)) + return seh_chain + + def get_wait_chain(self): + """ + @rtype: + tuple of ( + list of L{win32.WaitChainNodeInfo} structures, + bool) + @return: + Wait chain for the thread. + The boolean indicates if there's a cycle in the chain (a deadlock). + @raise AttributeError: + This method is only suppported in Windows Vista and above. + @see: + U{http://msdn.microsoft.com/en-us/library/ms681622%28VS.85%29.aspx} + """ + with win32.OpenThreadWaitChainSession() as hWct: + return win32.GetThreadWaitChain(hWct, ThreadId=self.get_tid()) + + def get_stack_range(self): + """ + @rtype: tuple( int, int ) + @return: Stack beginning and end pointers, in memory addresses order. + That is, the first pointer is the stack top, and the second pointer + is the stack bottom, since the stack grows towards lower memory + addresses. + @raise WindowsError: Raises an exception on error. + """ + # TODO use teb.DeallocationStack too (max. possible stack size) + teb = self.get_teb() + tib = teb.NtTib + return (tib.StackLimit, tib.StackBase) # top, bottom + + def __get_stack_trace(self, depth=16, bUseLabels=True, bMakePretty=True): + """ + Tries to get a stack trace for the current function using the debug + helper API (dbghelp.dll). + + @type depth: int + @param depth: Maximum depth of stack trace. + + @type bUseLabels: bool + @param bUseLabels: C{True} to use labels, C{False} to use addresses. + + @type bMakePretty: bool + @param bMakePretty: + C{True} for user readable labels, + C{False} for labels that can be passed to L{Process.resolve_label}. + + "Pretty" labels look better when producing output for the user to + read, while pure labels are more useful programatically. + + @rtype: tuple of tuple( int, int, str ) + @return: Stack trace of the thread as a tuple of + ( return address, frame pointer address, module filename ) + when C{bUseLabels} is C{True}, or a tuple of + ( return address, frame pointer label ) + when C{bUseLabels} is C{False}. + + @raise WindowsError: Raises an exception on error. + """ + + aProcess = self.get_process() + arch = aProcess.get_arch() + bits = aProcess.get_bits() + + if arch == win32.ARCH_I386: + MachineType = win32.IMAGE_FILE_MACHINE_I386 + elif arch == win32.ARCH_AMD64: + MachineType = win32.IMAGE_FILE_MACHINE_AMD64 + elif arch == win32.ARCH_IA64: + MachineType = win32.IMAGE_FILE_MACHINE_IA64 + else: + msg = "Stack walking is not available for this architecture: %s" + raise NotImplementedError(msg % arch) + + hProcess = aProcess.get_handle(win32.PROCESS_VM_READ | win32.PROCESS_QUERY_INFORMATION) + hThread = self.get_handle(win32.THREAD_GET_CONTEXT | win32.THREAD_QUERY_INFORMATION) + + StackFrame = win32.STACKFRAME64() + StackFrame.AddrPC = win32.ADDRESS64(self.get_pc()) + StackFrame.AddrFrame = win32.ADDRESS64(self.get_fp()) + StackFrame.AddrStack = win32.ADDRESS64(self.get_sp()) + + trace = list() + while win32.StackWalk64(MachineType, hProcess, hThread, StackFrame): + if depth <= 0: + break + fp = StackFrame.AddrFrame.Offset + ra = aProcess.peek_pointer(fp + 4) + if ra == 0: + break + lib = aProcess.get_module_at_address(ra) + if lib is None: + lib = "" + else: + if lib.fileName: + lib = lib.fileName + else: + lib = "%s" % HexDump.address(lib.lpBaseOfDll, bits) + if bUseLabels: + label = aProcess.get_label_at_address(ra) + if bMakePretty: + label = "%s (%s)" % (HexDump.address(ra, bits), label) + trace.append((fp, label)) + else: + trace.append((fp, ra, lib)) + fp = aProcess.peek_pointer(fp) + return tuple(trace) + + def __get_stack_trace_manually(self, depth=16, bUseLabels=True, bMakePretty=True): + """ + Tries to get a stack trace for the current function. + Only works for functions with standard prologue and epilogue. + + @type depth: int + @param depth: Maximum depth of stack trace. + + @type bUseLabels: bool + @param bUseLabels: C{True} to use labels, C{False} to use addresses. + + @type bMakePretty: bool + @param bMakePretty: + C{True} for user readable labels, + C{False} for labels that can be passed to L{Process.resolve_label}. + + "Pretty" labels look better when producing output for the user to + read, while pure labels are more useful programatically. + + @rtype: tuple of tuple( int, int, str ) + @return: Stack trace of the thread as a tuple of + ( return address, frame pointer address, module filename ) + when C{bUseLabels} is C{True}, or a tuple of + ( return address, frame pointer label ) + when C{bUseLabels} is C{False}. + + @raise WindowsError: Raises an exception on error. + """ + aProcess = self.get_process() + st, sb = self.get_stack_range() # top, bottom + fp = self.get_fp() + trace = list() + if aProcess.get_module_count() == 0: + aProcess.scan_modules() + bits = aProcess.get_bits() + while depth > 0: + if fp == 0: + break + if not st <= fp < sb: + break + ra = aProcess.peek_pointer(fp + 4) + if ra == 0: + break + lib = aProcess.get_module_at_address(ra) + if lib is None: + lib = "" + else: + if lib.fileName: + lib = lib.fileName + else: + lib = "%s" % HexDump.address(lib.lpBaseOfDll, bits) + if bUseLabels: + label = aProcess.get_label_at_address(ra) + if bMakePretty: + label = "%s (%s)" % (HexDump.address(ra, bits), label) + trace.append((fp, label)) + else: + trace.append((fp, ra, lib)) + fp = aProcess.peek_pointer(fp) + return tuple(trace) + + def get_stack_trace(self, depth=16): + """ + Tries to get a stack trace for the current function. + Only works for functions with standard prologue and epilogue. + + @type depth: int + @param depth: Maximum depth of stack trace. + + @rtype: tuple of tuple( int, int, str ) + @return: Stack trace of the thread as a tuple of + ( return address, frame pointer address, module filename ). + + @raise WindowsError: Raises an exception on error. + """ + try: + trace = self.__get_stack_trace(depth, False) + except Exception: + import traceback + + traceback.print_exc() + trace = () + if not trace: + trace = self.__get_stack_trace_manually(depth, False) + return trace + + def get_stack_trace_with_labels(self, depth=16, bMakePretty=True): + """ + Tries to get a stack trace for the current function. + Only works for functions with standard prologue and epilogue. + + @type depth: int + @param depth: Maximum depth of stack trace. + + @type bMakePretty: bool + @param bMakePretty: + C{True} for user readable labels, + C{False} for labels that can be passed to L{Process.resolve_label}. + + "Pretty" labels look better when producing output for the user to + read, while pure labels are more useful programatically. + + @rtype: tuple of tuple( int, int, str ) + @return: Stack trace of the thread as a tuple of + ( return address, frame pointer label ). + + @raise WindowsError: Raises an exception on error. + """ + try: + trace = self.__get_stack_trace(depth, True, bMakePretty) + except Exception: + trace = () + if not trace: + trace = self.__get_stack_trace_manually(depth, True, bMakePretty) + return trace + + def get_stack_frame_range(self): + """ + Returns the starting and ending addresses of the stack frame. + Only works for functions with standard prologue and epilogue. + + @rtype: tuple( int, int ) + @return: Stack frame range. + May not be accurate, depending on the compiler used. + + @raise RuntimeError: The stack frame is invalid, + or the function doesn't have a standard prologue + and epilogue. + + @raise WindowsError: An error occured when getting the thread context. + """ + st, sb = self.get_stack_range() # top, bottom + sp = self.get_sp() + fp = self.get_fp() + size = fp - sp + if not st <= sp < sb: + raise RuntimeError("Stack pointer lies outside the stack") + if not st <= fp < sb: + raise RuntimeError("Frame pointer lies outside the stack") + if sp > fp: + raise RuntimeError("No valid stack frame found") + return (sp, fp) + + def get_stack_frame(self, max_size=None): + """ + Reads the contents of the current stack frame. + Only works for functions with standard prologue and epilogue. + + @type max_size: int + @param max_size: (Optional) Maximum amount of bytes to read. + + @rtype: str + @return: Stack frame data. + May not be accurate, depending on the compiler used. + May return an empty string. + + @raise RuntimeError: The stack frame is invalid, + or the function doesn't have a standard prologue + and epilogue. + + @raise WindowsError: An error occured when getting the thread context + or reading data from the process memory. + """ + sp, fp = self.get_stack_frame_range() + size = fp - sp + if max_size and size > max_size: + size = max_size + return self.get_process().peek(sp, size) + + def read_stack_data(self, size=128, offset=0): + """ + Reads the contents of the top of the stack. + + @type size: int + @param size: Number of bytes to read. + + @type offset: int + @param offset: Offset from the stack pointer to begin reading. + + @rtype: str + @return: Stack data. + + @raise WindowsError: Could not read the requested data. + """ + aProcess = self.get_process() + return aProcess.read(self.get_sp() + offset, size) + + def peek_stack_data(self, size=128, offset=0): + """ + Tries to read the contents of the top of the stack. + + @type size: int + @param size: Number of bytes to read. + + @type offset: int + @param offset: Offset from the stack pointer to begin reading. + + @rtype: str + @return: Stack data. + Returned data may be less than the requested size. + """ + aProcess = self.get_process() + return aProcess.peek(self.get_sp() + offset, size) + + def read_stack_dwords(self, count, offset=0): + """ + Reads DWORDs from the top of the stack. + + @type count: int + @param count: Number of DWORDs to read. + + @type offset: int + @param offset: Offset from the stack pointer to begin reading. + + @rtype: tuple( int... ) + @return: Tuple of integers read from the stack. + + @raise WindowsError: Could not read the requested data. + """ + if count > 0: + stackData = self.read_stack_data(count * 4, offset) + return struct.unpack("<" + ("L" * count), stackData) + return () + + def peek_stack_dwords(self, count, offset=0): + """ + Tries to read DWORDs from the top of the stack. + + @type count: int + @param count: Number of DWORDs to read. + + @type offset: int + @param offset: Offset from the stack pointer to begin reading. + + @rtype: tuple( int... ) + @return: Tuple of integers read from the stack. + May be less than the requested number of DWORDs. + """ + stackData = self.peek_stack_data(count * 4, offset) + if len(stackData) & 3: + stackData = stackData[: -len(stackData) & 3] + if not stackData: + return () + return struct.unpack("<" + ("L" * count), stackData) + + def read_stack_qwords(self, count, offset=0): + """ + Reads QWORDs from the top of the stack. + + @type count: int + @param count: Number of QWORDs to read. + + @type offset: int + @param offset: Offset from the stack pointer to begin reading. + + @rtype: tuple( int... ) + @return: Tuple of integers read from the stack. + + @raise WindowsError: Could not read the requested data. + """ + stackData = self.read_stack_data(count * 8, offset) + return struct.unpack("<" + ("Q" * count), stackData) + + def peek_stack_qwords(self, count, offset=0): + """ + Tries to read QWORDs from the top of the stack. + + @type count: int + @param count: Number of QWORDs to read. + + @type offset: int + @param offset: Offset from the stack pointer to begin reading. + + @rtype: tuple( int... ) + @return: Tuple of integers read from the stack. + May be less than the requested number of QWORDs. + """ + stackData = self.peek_stack_data(count * 8, offset) + if len(stackData) & 7: + stackData = stackData[: -len(stackData) & 7] + if not stackData: + return () + return struct.unpack("<" + ("Q" * count), stackData) + + def read_stack_structure(self, structure, offset=0): + """ + Reads the given structure at the top of the stack. + + @type structure: ctypes.Structure + @param structure: Structure of the data to read from the stack. + + @type offset: int + @param offset: Offset from the stack pointer to begin reading. + The stack pointer is the same returned by the L{get_sp} method. + + @rtype: tuple + @return: Tuple of elements read from the stack. The type of each + element matches the types in the stack frame structure. + """ + aProcess = self.get_process() + stackData = aProcess.read_structure(self.get_sp() + offset, structure) + return tuple([stackData.__getattribute__(name) for (name, type) in stackData._fields_]) + + def read_stack_frame(self, structure, offset=0): + """ + Reads the stack frame of the thread. + + @type structure: ctypes.Structure + @param structure: Structure of the stack frame. + + @type offset: int + @param offset: Offset from the frame pointer to begin reading. + The frame pointer is the same returned by the L{get_fp} method. + + @rtype: tuple + @return: Tuple of elements read from the stack frame. The type of each + element matches the types in the stack frame structure. + """ + aProcess = self.get_process() + stackData = aProcess.read_structure(self.get_fp() + offset, structure) + return tuple([stackData.__getattribute__(name) for (name, type) in stackData._fields_]) + + def read_code_bytes(self, size=128, offset=0): + """ + Tries to read some bytes of the code currently being executed. + + @type size: int + @param size: Number of bytes to read. + + @type offset: int + @param offset: Offset from the program counter to begin reading. + + @rtype: str + @return: Bytes read from the process memory. + + @raise WindowsError: Could not read the requested data. + """ + return self.get_process().read(self.get_pc() + offset, size) + + def peek_code_bytes(self, size=128, offset=0): + """ + Tries to read some bytes of the code currently being executed. + + @type size: int + @param size: Number of bytes to read. + + @type offset: int + @param offset: Offset from the program counter to begin reading. + + @rtype: str + @return: Bytes read from the process memory. + May be less than the requested number of bytes. + """ + return self.get_process().peek(self.get_pc() + offset, size) + + def peek_pointers_in_registers(self, peekSize=16, context=None): + """ + Tries to guess which values in the registers are valid pointers, + and reads some data from them. + + @type peekSize: int + @param peekSize: Number of bytes to read from each pointer found. + + @type context: dict( str S{->} int ) + @param context: (Optional) + Dictionary mapping register names to their values. + If not given, the current thread context will be used. + + @rtype: dict( str S{->} str ) + @return: Dictionary mapping register names to the data they point to. + """ + peekable_registers = ("Eax", "Ebx", "Ecx", "Edx", "Esi", "Edi", "Ebp") + if not context: + context = self.get_context(win32.CONTEXT_CONTROL | win32.CONTEXT_INTEGER) + aProcess = self.get_process() + data = dict() + for reg_name, reg_value in compat.iteritems(context): + if reg_name not in peekable_registers: + continue + ## if reg_name == 'Ebp': + ## stack_begin, stack_end = self.get_stack_range() + ## print hex(stack_end), hex(reg_value), hex(stack_begin) + ## if stack_begin and stack_end and stack_end < stack_begin and \ + ## stack_begin <= reg_value <= stack_end: + ## continue + reg_data = aProcess.peek(reg_value, peekSize) + if reg_data: + data[reg_name] = reg_data + return data + + # TODO + # try to avoid reading the same page twice by caching it + def peek_pointers_in_data(self, data, peekSize=16, peekStep=1): + """ + Tries to guess which values in the given data are valid pointers, + and reads some data from them. + + @type data: str + @param data: Binary data to find pointers in. + + @type peekSize: int + @param peekSize: Number of bytes to read from each pointer found. + + @type peekStep: int + @param peekStep: Expected data alignment. + Tipically you specify 1 when data alignment is unknown, + or 4 when you expect data to be DWORD aligned. + Any other value may be specified. + + @rtype: dict( str S{->} str ) + @return: Dictionary mapping stack offsets to the data they point to. + """ + aProcess = self.get_process() + return aProcess.peek_pointers_in_data(data, peekSize, peekStep) + + # ------------------------------------------------------------------------------ + + # TODO + # The disassemble_around and disassemble_around_pc methods + # should take as parameter instruction counts rather than sizes + + def disassemble_string(self, lpAddress, code): + """ + Disassemble instructions from a block of binary code. + + @type lpAddress: int + @param lpAddress: Memory address where the code was read from. + + @type code: str + @param code: Binary code to disassemble. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + aProcess = self.get_process() + return aProcess.disassemble_string(lpAddress, code) + + def disassemble(self, lpAddress, dwSize): + """ + Disassemble instructions from the address space of the process. + + @type lpAddress: int + @param lpAddress: Memory address where to read the code from. + + @type dwSize: int + @param dwSize: Size of binary code to disassemble. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + aProcess = self.get_process() + return aProcess.disassemble(lpAddress, dwSize) + + def disassemble_around(self, lpAddress, dwSize=64): + """ + Disassemble around the given address. + + @type lpAddress: int + @param lpAddress: Memory address where to read the code from. + + @type dwSize: int + @param dwSize: Delta offset. + Code will be read from lpAddress - dwSize to lpAddress + dwSize. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + aProcess = self.get_process() + return aProcess.disassemble_around(lpAddress, dwSize) + + def disassemble_around_pc(self, dwSize=64): + """ + Disassemble around the program counter of the given thread. + + @type dwSize: int + @param dwSize: Delta offset. + Code will be read from pc - dwSize to pc + dwSize. + + @rtype: list of tuple( long, int, str, str ) + @return: List of tuples. Each tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + aProcess = self.get_process() + return aProcess.disassemble_around(self.get_pc(), dwSize) + + def disassemble_instruction(self, lpAddress): + """ + Disassemble the instruction at the given memory address. + + @type lpAddress: int + @param lpAddress: Memory address where to read the code from. + + @rtype: tuple( long, int, str, str ) + @return: The tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + aProcess = self.get_process() + return aProcess.disassemble(lpAddress, 15)[0] + + def disassemble_current(self): + """ + Disassemble the instruction at the program counter of the given thread. + + @rtype: tuple( long, int, str, str ) + @return: The tuple represents an assembly instruction + and contains: + - Memory address of instruction. + - Size of instruction in bytes. + - Disassembly line of instruction. + - Hexadecimal dump of instruction. + """ + return self.disassemble_instruction(self.get_pc()) + + +# ============================================================================== + + +class _ThreadContainer(object): + """ + Encapsulates the capability to contain Thread objects. + + @group Instrumentation: + start_thread + + @group Threads snapshot: + scan_threads, + get_thread, get_thread_count, get_thread_ids, + has_thread, iter_threads, iter_thread_ids, + find_threads_by_name, get_windows, + clear_threads, clear_dead_threads, close_thread_handles + """ + + def __init__(self): + self.__threadDict = dict() + + def __initialize_snapshot(self): + """ + Private method to automatically initialize the snapshot + when you try to use it without calling any of the scan_* + methods first. You don't need to call this yourself. + """ + if not self.__threadDict: + self.scan_threads() + + def __contains__(self, anObject): + """ + @type anObject: L{Thread}, int + @param anObject: + - C{int}: Global ID of the thread to look for. + - C{Thread}: Thread object to look for. + + @rtype: bool + @return: C{True} if the snapshot contains + a L{Thread} object with the same ID. + """ + if isinstance(anObject, Thread): + anObject = anObject.dwThreadId + return self.has_thread(anObject) + + def __iter__(self): + """ + @see: L{iter_threads} + @rtype: dictionary-valueiterator + @return: Iterator of L{Thread} objects in this snapshot. + """ + return self.iter_threads() + + def __len__(self): + """ + @see: L{get_thread_count} + @rtype: int + @return: Count of L{Thread} objects in this snapshot. + """ + return self.get_thread_count() + + def has_thread(self, dwThreadId): + """ + @type dwThreadId: int + @param dwThreadId: Global ID of the thread to look for. + + @rtype: bool + @return: C{True} if the snapshot contains a + L{Thread} object with the given global ID. + """ + self.__initialize_snapshot() + return dwThreadId in self.__threadDict + + def get_thread(self, dwThreadId): + """ + @type dwThreadId: int + @param dwThreadId: Global ID of the thread to look for. + + @rtype: L{Thread} + @return: Thread object with the given global ID. + """ + self.__initialize_snapshot() + if dwThreadId not in self.__threadDict: + msg = "Unknown thread ID: %d" % dwThreadId + raise KeyError(msg) + return self.__threadDict[dwThreadId] + + def iter_thread_ids(self): + """ + @see: L{iter_threads} + @rtype: dictionary-keyiterator + @return: Iterator of global thread IDs in this snapshot. + """ + self.__initialize_snapshot() + return compat.iterkeys(self.__threadDict) + + def iter_threads(self): + """ + @see: L{iter_thread_ids} + @rtype: dictionary-valueiterator + @return: Iterator of L{Thread} objects in this snapshot. + """ + self.__initialize_snapshot() + return compat.itervalues(self.__threadDict) + + def get_thread_ids(self): + """ + @rtype: list( int ) + @return: List of global thread IDs in this snapshot. + """ + self.__initialize_snapshot() + return compat.keys(self.__threadDict) + + def get_thread_count(self): + """ + @rtype: int + @return: Count of L{Thread} objects in this snapshot. + """ + self.__initialize_snapshot() + return len(self.__threadDict) + + # ------------------------------------------------------------------------------ + + def find_threads_by_name(self, name, bExactMatch=True): + """ + Find threads by name, using different search methods. + + @type name: str, None + @param name: Name to look for. Use C{None} to find nameless threads. + + @type bExactMatch: bool + @param bExactMatch: C{True} if the name must be + B{exactly} as given, C{False} if the name can be + loosely matched. + + This parameter is ignored when C{name} is C{None}. + + @rtype: list( L{Thread} ) + @return: All threads matching the given name. + """ + found_threads = list() + + # Find threads with no name. + if name is None: + for aThread in self.iter_threads(): + if aThread.get_name() is None: + found_threads.append(aThread) + + # Find threads matching the given name exactly. + elif bExactMatch: + for aThread in self.iter_threads(): + if aThread.get_name() == name: + found_threads.append(aThread) + + # Find threads whose names match the given substring. + else: + for aThread in self.iter_threads(): + t_name = aThread.get_name() + if t_name is not None and name in t_name: + found_threads.append(aThread) + + return found_threads + + # ------------------------------------------------------------------------------ + + # XXX TODO + # Support for string searches on the window captions. + + def get_windows(self): + """ + @rtype: list of L{Window} + @return: Returns a list of windows handled by this process. + """ + window_list = list() + for thread in self.iter_threads(): + window_list.extend(thread.get_windows()) + return window_list + + # ------------------------------------------------------------------------------ + + def start_thread(self, lpStartAddress, lpParameter=0, bSuspended=False): + """ + Remotely creates a new thread in the process. + + @type lpStartAddress: int + @param lpStartAddress: Start address for the new thread. + + @type lpParameter: int + @param lpParameter: Optional argument for the new thread. + + @type bSuspended: bool + @param bSuspended: C{True} if the new thread should be suspended. + In that case use L{Thread.resume} to start execution. + """ + if bSuspended: + dwCreationFlags = win32.CREATE_SUSPENDED + else: + dwCreationFlags = 0 + hProcess = self.get_handle( + win32.PROCESS_CREATE_THREAD + | win32.PROCESS_QUERY_INFORMATION + | win32.PROCESS_VM_OPERATION + | win32.PROCESS_VM_WRITE + | win32.PROCESS_VM_READ + ) + hThread, dwThreadId = win32.CreateRemoteThread(hProcess, 0, 0, lpStartAddress, lpParameter, dwCreationFlags) + aThread = Thread(dwThreadId, hThread, self) + self._add_thread(aThread) + return aThread + + # ------------------------------------------------------------------------------ + + # TODO + # maybe put all the toolhelp code into their own set of classes? + # + # XXX this method musn't end up calling __initialize_snapshot by accident! + def scan_threads(self): + """ + Populates the snapshot with running threads. + """ + + # Ignore special process IDs. + # PID 0: System Idle Process. Also has a special meaning to the + # toolhelp APIs (current process). + # PID 4: System Integrity Group. See this forum post for more info: + # http://tinyurl.com/ycza8jo + # (points to social.technet.microsoft.com) + # Only on XP and above + # PID 8: System (?) only in Windows 2000 and below AFAIK. + # It's probably the same as PID 4 in XP and above. + dwProcessId = self.get_pid() + if dwProcessId in (0, 4, 8): + return + + ## dead_tids = set( self.get_thread_ids() ) # XXX triggers a scan + dead_tids = self._get_thread_ids() + dwProcessId = self.get_pid() + hSnapshot = win32.CreateToolhelp32Snapshot(win32.TH32CS_SNAPTHREAD, dwProcessId) + try: + te = win32.Thread32First(hSnapshot) + while te is not None: + if te.th32OwnerProcessID == dwProcessId: + dwThreadId = te.th32ThreadID + if dwThreadId in dead_tids: + dead_tids.remove(dwThreadId) + ## if not self.has_thread(dwThreadId): # XXX triggers a scan + if not self._has_thread_id(dwThreadId): + aThread = Thread(dwThreadId, process=self) + self._add_thread(aThread) + te = win32.Thread32Next(hSnapshot) + finally: + win32.CloseHandle(hSnapshot) + for tid in dead_tids: + self._del_thread(tid) + + def clear_dead_threads(self): + """ + Remove Thread objects from the snapshot + referring to threads no longer running. + """ + for tid in self.get_thread_ids(): + aThread = self.get_thread(tid) + if not aThread.is_alive(): + self._del_thread(aThread) + + def clear_threads(self): + """ + Clears the threads snapshot. + """ + for aThread in compat.itervalues(self.__threadDict): + aThread.clear() + self.__threadDict = dict() + + def close_thread_handles(self): + """ + Closes all open handles to threads in the snapshot. + """ + for aThread in self.iter_threads(): + try: + aThread.close_handle() + except Exception: + try: + e = sys.exc_info()[1] + msg = "Cannot close thread handle %s, reason: %s" + msg %= (aThread.hThread.value, str(e)) + warnings.warn(msg) + except Exception: + pass + + # ------------------------------------------------------------------------------ + + # XXX _notify_* methods should not trigger a scan + + def _add_thread(self, aThread): + """ + Private method to add a thread object to the snapshot. + + @type aThread: L{Thread} + @param aThread: Thread object. + """ + ## if not isinstance(aThread, Thread): + ## if hasattr(aThread, '__class__'): + ## typename = aThread.__class__.__name__ + ## else: + ## typename = str(type(aThread)) + ## msg = "Expected Thread, got %s instead" % typename + ## raise TypeError(msg) + dwThreadId = aThread.dwThreadId + ## if dwThreadId in self.__threadDict: + ## msg = "Already have a Thread object with ID %d" % dwThreadId + ## raise KeyError(msg) + aThread.set_process(self) + self.__threadDict[dwThreadId] = aThread + + def _del_thread(self, dwThreadId): + """ + Private method to remove a thread object from the snapshot. + + @type dwThreadId: int + @param dwThreadId: Global thread ID. + """ + try: + aThread = self.__threadDict[dwThreadId] + del self.__threadDict[dwThreadId] + except KeyError: + aThread = None + msg = "Unknown thread ID %d" % dwThreadId + warnings.warn(msg, RuntimeWarning) + if aThread: + aThread.clear() # remove circular references + + def _has_thread_id(self, dwThreadId): + """ + Private method to test for a thread in the snapshot without triggering + an automatic scan. + """ + return dwThreadId in self.__threadDict + + def _get_thread_ids(self): + """ + Private method to get the list of thread IDs currently in the snapshot + without triggering an automatic scan. + """ + return compat.keys(self.__threadDict) + + def __add_created_thread(self, event): + """ + Private method to automatically add new thread objects from debug events. + + @type event: L{Event} + @param event: Event object. + """ + dwThreadId = event.get_tid() + hThread = event.get_thread_handle() + ## if not self.has_thread(dwThreadId): # XXX this would trigger a scan + if not self._has_thread_id(dwThreadId): + aThread = Thread(dwThreadId, hThread, self) + teb_ptr = event.get_teb() # remember the TEB pointer + if teb_ptr: + aThread._teb_ptr = teb_ptr + self._add_thread(aThread) + # else: + # aThread = self.get_thread(dwThreadId) + # if hThread != win32.INVALID_HANDLE_VALUE: + # aThread.hThread = hThread # may have more privileges + + def _notify_create_process(self, event): + """ + Notify the creation of the main thread of this process. + + This is done automatically by the L{Debug} class, you shouldn't need + to call it yourself. + + @type event: L{CreateProcessEvent} + @param event: Create process event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + self.__add_created_thread(event) + return True + + def _notify_create_thread(self, event): + """ + Notify the creation of a new thread in this process. + + This is done automatically by the L{Debug} class, you shouldn't need + to call it yourself. + + @type event: L{CreateThreadEvent} + @param event: Create thread event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + self.__add_created_thread(event) + return True + + def _notify_exit_thread(self, event): + """ + Notify the termination of a thread. + + This is done automatically by the L{Debug} class, you shouldn't need + to call it yourself. + + @type event: L{ExitThreadEvent} + @param event: Exit thread event. + + @rtype: bool + @return: C{True} to call the user-defined handle, C{False} otherwise. + """ + dwThreadId = event.get_tid() + ## if self.has_thread(dwThreadId): # XXX this would trigger a scan + if self._has_thread_id(dwThreadId): + self._del_thread(dwThreadId) + return True diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/util.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/util.py new file mode 100644 index 0000000..7036c66 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/util.py @@ -0,0 +1,1059 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Miscellaneous utility classes and functions. + +@group Helpers: + PathOperations, + MemoryAddresses, + CustomAddressIterator, + DataAddressIterator, + ImageAddressIterator, + MappedAddressIterator, + ExecutableAddressIterator, + ReadableAddressIterator, + WriteableAddressIterator, + ExecutableAndWriteableAddressIterator, + DebugRegister, + Regenerator, + BannerHelpFormatter, + StaticClass, + classproperty +""" + +__revision__ = "$Id$" + +__all__ = [ + # Filename and pathname manipulation + "PathOperations", + # Memory address operations + "MemoryAddresses", + "CustomAddressIterator", + "DataAddressIterator", + "ImageAddressIterator", + "MappedAddressIterator", + "ExecutableAddressIterator", + "ReadableAddressIterator", + "WriteableAddressIterator", + "ExecutableAndWriteableAddressIterator", + # Debug registers manipulation + "DebugRegister", + # Miscellaneous + "Regenerator", +] + +import sys +import os +import ctypes +import optparse + +from winappdbg import win32 +from winappdbg import compat + +# ============================================================================== + + +class classproperty(property): + """ + Class property method. + + Only works for getting properties, if you set them + the symbol gets overwritten in the class namespace. + + Inspired on: U{http://stackoverflow.com/a/7864317/426293} + """ + + def __init__(self, fget=None, fset=None, fdel=None, doc=""): + if fset is not None or fdel is not None: + raise NotImplementedError() + super(classproperty, self).__init__(fget=classmethod(fget), doc=doc) + + def __get__(self, cls, owner): + return self.fget.__get__(None, owner)() + + +class BannerHelpFormatter(optparse.IndentedHelpFormatter): + "Just a small tweak to optparse to be able to print a banner." + + def __init__(self, banner, *argv, **argd): + self.banner = banner + optparse.IndentedHelpFormatter.__init__(self, *argv, **argd) + + def format_usage(self, usage): + msg = optparse.IndentedHelpFormatter.format_usage(self, usage) + return "%s\n%s" % (self.banner, msg) + + +# See Process.generate_memory_snapshot() +class Regenerator(object): + """ + Calls a generator and iterates it. When it's finished iterating, the + generator is called again. This allows you to iterate a generator more + than once (well, sort of). + """ + + def __init__(self, g_function, *v_args, **d_args): + """ + @type g_function: function + @param g_function: Function that when called returns a generator. + + @type v_args: tuple + @param v_args: Variable arguments to pass to the generator function. + + @type d_args: dict + @param d_args: Variable arguments to pass to the generator function. + """ + self.__g_function = g_function + self.__v_args = v_args + self.__d_args = d_args + self.__g_object = None + + def __iter__(self): + "x.__iter__() <==> iter(x)" + return self + + def next(self): + "x.next() -> the next value, or raise StopIteration" + if self.__g_object is None: + self.__g_object = self.__g_function(*self.__v_args, **self.__d_args) + try: + return self.__g_object.next() + except StopIteration: + self.__g_object = None + raise + + +class StaticClass(object): + def __new__(cls, *argv, **argd): + "Don't try to instance this class, just use the static methods." + raise NotImplementedError("Cannot instance static class %s" % cls.__name__) + + +# ============================================================================== + + +class PathOperations(StaticClass): + """ + Static methods for filename and pathname manipulation. + """ + + @staticmethod + def path_is_relative(path): + """ + @see: L{path_is_absolute} + + @type path: str + @param path: Absolute or relative path. + + @rtype: bool + @return: C{True} if the path is relative, C{False} if it's absolute. + """ + return win32.PathIsRelative(path) + + @staticmethod + def path_is_absolute(path): + """ + @see: L{path_is_relative} + + @type path: str + @param path: Absolute or relative path. + + @rtype: bool + @return: C{True} if the path is absolute, C{False} if it's relative. + """ + return not win32.PathIsRelative(path) + + @staticmethod + def make_relative(path, current=None): + """ + @type path: str + @param path: Absolute path. + + @type current: str + @param current: (Optional) Path to the current directory. + + @rtype: str + @return: Relative path. + + @raise WindowsError: It's impossible to make the path relative. + This happens when the path and the current path are not on the + same disk drive or network share. + """ + return win32.PathRelativePathTo(pszFrom=current, pszTo=path) + + @staticmethod + def make_absolute(path): + """ + @type path: str + @param path: Relative path. + + @rtype: str + @return: Absolute path. + """ + return win32.GetFullPathName(path)[0] + + @staticmethod + def split_extension(pathname): + """ + @type pathname: str + @param pathname: Absolute path. + + @rtype: tuple( str, str ) + @return: + Tuple containing the file and extension components of the filename. + """ + filepart = win32.PathRemoveExtension(pathname) + extpart = win32.PathFindExtension(pathname) + return (filepart, extpart) + + @staticmethod + def split_filename(pathname): + """ + @type pathname: str + @param pathname: Absolute path. + + @rtype: tuple( str, str ) + @return: Tuple containing the path to the file and the base filename. + """ + filepart = win32.PathFindFileName(pathname) + pathpart = win32.PathRemoveFileSpec(pathname) + return (pathpart, filepart) + + @staticmethod + def split_path(path): + """ + @see: L{join_path} + + @type path: str + @param path: Absolute or relative path. + + @rtype: list( str... ) + @return: List of path components. + """ + components = list() + while path: + next = win32.PathFindNextComponent(path) + if next: + prev = path[: -len(next)] + components.append(prev) + path = next + return components + + @staticmethod + def join_path(*components): + """ + @see: L{split_path} + + @type components: tuple( str... ) + @param components: Path components. + + @rtype: str + @return: Absolute or relative path. + """ + if components: + path = components[0] + for next in components[1:]: + path = win32.PathAppend(path, next) + else: + path = "" + return path + + @staticmethod + def native_to_win32_pathname(name): + """ + @type name: str + @param name: Native (NT) absolute pathname. + + @rtype: str + @return: Win32 absolute pathname. + """ + # XXX TODO + # There are probably some native paths that + # won't be converted by this naive approach. + if name.startswith("\\"): + if name.startswith("\\??\\"): + name = name[4:] + elif name.startswith("\\SystemRoot\\"): + system_root_path = os.environ["SYSTEMROOT"] + if system_root_path.endswith("\\"): + system_root_path = system_root_path[:-1] + name = system_root_path + name[11:] + else: + for drive_number in compat.xrange(ord("A"), ord("Z") + 1): + drive_letter = "%c:" % drive_number + try: + device_native_path = win32.QueryDosDevice(drive_letter) + except WindowsError: + e = sys.exc_info()[1] + if e.winerror in (win32.ERROR_FILE_NOT_FOUND, win32.ERROR_PATH_NOT_FOUND): + continue + raise + if not device_native_path.endswith("\\"): + device_native_path += "\\" + if name.startswith(device_native_path): + name = drive_letter + "\\" + name[len(device_native_path) :] + break + return name + + @staticmethod + def pathname_to_filename(pathname): + """ + Equivalent to: C{PathOperations.split_filename(pathname)[0]} + + @note: This function is preserved for backwards compatibility with + WinAppDbg 1.4 and earlier. It may be removed in future versions. + + @type pathname: str + @param pathname: Absolute path to a file. + + @rtype: str + @return: Filename component of the path. + """ + return win32.PathFindFileName(pathname) + + +# ============================================================================== + + +class MemoryAddresses(StaticClass): + """ + Class to manipulate memory addresses. + + @type pageSize: int + @cvar pageSize: Page size in bytes. Defaults to 0x1000 but it's + automatically updated on runtime when importing the module. + """ + + @classproperty + def pageSize(cls): + """ + Try to get the pageSize value on runtime. + """ + try: + try: + pageSize = win32.GetSystemInfo().dwPageSize + except WindowsError: + pageSize = 0x1000 + except NameError: + pageSize = 0x1000 + cls.pageSize = pageSize # now this function won't be called again + return pageSize + + @classmethod + def align_address_to_page_start(cls, address): + """ + Align the given address to the start of the page it occupies. + + @type address: int + @param address: Memory address. + + @rtype: int + @return: Aligned memory address. + """ + return address - (address % cls.pageSize) + + @classmethod + def align_address_to_page_end(cls, address): + """ + Align the given address to the end of the page it occupies. + That is, to point to the start of the next page. + + @type address: int + @param address: Memory address. + + @rtype: int + @return: Aligned memory address. + """ + return address + cls.pageSize - (address % cls.pageSize) + + @classmethod + def align_address_range(cls, begin, end): + """ + Align the given address range to the start and end of the page(s) it occupies. + + @type begin: int + @param begin: Memory address of the beginning of the buffer. + Use C{None} for the first legal address in the address space. + + @type end: int + @param end: Memory address of the end of the buffer. + Use C{None} for the last legal address in the address space. + + @rtype: tuple( int, int ) + @return: Aligned memory addresses. + """ + if begin is None: + begin = 0 + if end is None: + end = win32.LPVOID(-1).value # XXX HACK + if end < begin: + begin, end = end, begin + begin = cls.align_address_to_page_start(begin) + if end != cls.align_address_to_page_start(end): + end = cls.align_address_to_page_end(end) + return (begin, end) + + @classmethod + def get_buffer_size_in_pages(cls, address, size): + """ + Get the number of pages in use by the given buffer. + + @type address: int + @param address: Aligned memory address. + + @type size: int + @param size: Buffer size. + + @rtype: int + @return: Buffer size in number of pages. + """ + if size < 0: + size = -size + address = address - size + begin, end = cls.align_address_range(address, address + size) + # XXX FIXME + # I think this rounding fails at least for address 0xFFFFFFFF size 1 + return int(float(end - begin) / float(cls.pageSize)) + + @staticmethod + def do_ranges_intersect(begin, end, old_begin, old_end): + """ + Determine if the two given memory address ranges intersect. + + @type begin: int + @param begin: Start address of the first range. + + @type end: int + @param end: End address of the first range. + + @type old_begin: int + @param old_begin: Start address of the second range. + + @type old_end: int + @param old_end: End address of the second range. + + @rtype: bool + @return: C{True} if the two ranges intersect, C{False} otherwise. + """ + return (old_begin <= begin < old_end) or (old_begin < end <= old_end) or (begin <= old_begin < end) or (begin < old_end <= end) + + +# ============================================================================== + + +def CustomAddressIterator(memory_map, condition): + """ + Generator function that iterates through a memory map, filtering memory + region blocks by any given condition. + + @type memory_map: list( L{win32.MemoryBasicInformation} ) + @param memory_map: List of memory region information objects. + Returned by L{Process.get_memory_map}. + + @type condition: function + @param condition: Callback function that returns C{True} if the memory + block should be returned, or C{False} if it should be filtered. + + @rtype: generator of L{win32.MemoryBasicInformation} + @return: Generator object to iterate memory blocks. + """ + for mbi in memory_map: + if condition(mbi): + address = mbi.BaseAddress + max_addr = address + mbi.RegionSize + while address < max_addr: + yield address + address = address + 1 + + +def DataAddressIterator(memory_map): + """ + Generator function that iterates through a memory map, returning only those + memory blocks that contain data. + + @type memory_map: list( L{win32.MemoryBasicInformation} ) + @param memory_map: List of memory region information objects. + Returned by L{Process.get_memory_map}. + + @rtype: generator of L{win32.MemoryBasicInformation} + @return: Generator object to iterate memory blocks. + """ + return CustomAddressIterator(memory_map, win32.MemoryBasicInformation.has_content) + + +def ImageAddressIterator(memory_map): + """ + Generator function that iterates through a memory map, returning only those + memory blocks that belong to executable images. + + @type memory_map: list( L{win32.MemoryBasicInformation} ) + @param memory_map: List of memory region information objects. + Returned by L{Process.get_memory_map}. + + @rtype: generator of L{win32.MemoryBasicInformation} + @return: Generator object to iterate memory blocks. + """ + return CustomAddressIterator(memory_map, win32.MemoryBasicInformation.is_image) + + +def MappedAddressIterator(memory_map): + """ + Generator function that iterates through a memory map, returning only those + memory blocks that belong to memory mapped files. + + @type memory_map: list( L{win32.MemoryBasicInformation} ) + @param memory_map: List of memory region information objects. + Returned by L{Process.get_memory_map}. + + @rtype: generator of L{win32.MemoryBasicInformation} + @return: Generator object to iterate memory blocks. + """ + return CustomAddressIterator(memory_map, win32.MemoryBasicInformation.is_mapped) + + +def ReadableAddressIterator(memory_map): + """ + Generator function that iterates through a memory map, returning only those + memory blocks that are readable. + + @type memory_map: list( L{win32.MemoryBasicInformation} ) + @param memory_map: List of memory region information objects. + Returned by L{Process.get_memory_map}. + + @rtype: generator of L{win32.MemoryBasicInformation} + @return: Generator object to iterate memory blocks. + """ + return CustomAddressIterator(memory_map, win32.MemoryBasicInformation.is_readable) + + +def WriteableAddressIterator(memory_map): + """ + Generator function that iterates through a memory map, returning only those + memory blocks that are writeable. + + @note: Writeable memory is always readable too. + + @type memory_map: list( L{win32.MemoryBasicInformation} ) + @param memory_map: List of memory region information objects. + Returned by L{Process.get_memory_map}. + + @rtype: generator of L{win32.MemoryBasicInformation} + @return: Generator object to iterate memory blocks. + """ + return CustomAddressIterator(memory_map, win32.MemoryBasicInformation.is_writeable) + + +def ExecutableAddressIterator(memory_map): + """ + Generator function that iterates through a memory map, returning only those + memory blocks that are executable. + + @note: Executable memory is always readable too. + + @type memory_map: list( L{win32.MemoryBasicInformation} ) + @param memory_map: List of memory region information objects. + Returned by L{Process.get_memory_map}. + + @rtype: generator of L{win32.MemoryBasicInformation} + @return: Generator object to iterate memory blocks. + """ + return CustomAddressIterator(memory_map, win32.MemoryBasicInformation.is_executable) + + +def ExecutableAndWriteableAddressIterator(memory_map): + """ + Generator function that iterates through a memory map, returning only those + memory blocks that are executable and writeable. + + @note: The presence of such pages make memory corruption vulnerabilities + much easier to exploit. + + @type memory_map: list( L{win32.MemoryBasicInformation} ) + @param memory_map: List of memory region information objects. + Returned by L{Process.get_memory_map}. + + @rtype: generator of L{win32.MemoryBasicInformation} + @return: Generator object to iterate memory blocks. + """ + return CustomAddressIterator(memory_map, win32.MemoryBasicInformation.is_executable_and_writeable) + + +# ============================================================================== +try: + _registerMask = win32.SIZE_T(-1).value +except TypeError: + if win32.SIZEOF(win32.SIZE_T) == 4: + _registerMask = 0xFFFFFFFF + elif win32.SIZEOF(win32.SIZE_T) == 8: + _registerMask = 0xFFFFFFFFFFFFFFFF + else: + raise + + +class DebugRegister(StaticClass): + """ + Class to manipulate debug registers. + Used by L{HardwareBreakpoint}. + + @group Trigger flags used by HardwareBreakpoint: + BREAK_ON_EXECUTION, BREAK_ON_WRITE, BREAK_ON_ACCESS, BREAK_ON_IO_ACCESS + @group Size flags used by HardwareBreakpoint: + WATCH_BYTE, WATCH_WORD, WATCH_DWORD, WATCH_QWORD + @group Bitwise masks for Dr7: + enableMask, disableMask, triggerMask, watchMask, clearMask, + generalDetectMask + @group Bitwise masks for Dr6: + hitMask, hitMaskAll, debugAccessMask, singleStepMask, taskSwitchMask, + clearDr6Mask, clearHitMask + @group Debug control MSR definitions: + DebugCtlMSR, LastBranchRecord, BranchTrapFlag, PinControl, + LastBranchToIP, LastBranchFromIP, + LastExceptionToIP, LastExceptionFromIP + + @type BREAK_ON_EXECUTION: int + @cvar BREAK_ON_EXECUTION: Break on execution. + + @type BREAK_ON_WRITE: int + @cvar BREAK_ON_WRITE: Break on write. + + @type BREAK_ON_ACCESS: int + @cvar BREAK_ON_ACCESS: Break on read or write. + + @type BREAK_ON_IO_ACCESS: int + @cvar BREAK_ON_IO_ACCESS: Break on I/O port access. + Not supported by any hardware. + + @type WATCH_BYTE: int + @cvar WATCH_BYTE: Watch a byte. + + @type WATCH_WORD: int + @cvar WATCH_WORD: Watch a word. + + @type WATCH_DWORD: int + @cvar WATCH_DWORD: Watch a double word. + + @type WATCH_QWORD: int + @cvar WATCH_QWORD: Watch one quad word. + + @type enableMask: 4-tuple of integers + @cvar enableMask: + Enable bit on C{Dr7} for each slot. + Works as a bitwise-OR mask. + + @type disableMask: 4-tuple of integers + @cvar disableMask: + Mask of the enable bit on C{Dr7} for each slot. + Works as a bitwise-AND mask. + + @type triggerMask: 4-tuple of 2-tuples of integers + @cvar triggerMask: + Trigger bits on C{Dr7} for each trigger flag value. + Each 2-tuple has the bitwise-OR mask and the bitwise-AND mask. + + @type watchMask: 4-tuple of 2-tuples of integers + @cvar watchMask: + Watch bits on C{Dr7} for each watch flag value. + Each 2-tuple has the bitwise-OR mask and the bitwise-AND mask. + + @type clearMask: 4-tuple of integers + @cvar clearMask: + Mask of all important bits on C{Dr7} for each slot. + Works as a bitwise-AND mask. + + @type generalDetectMask: integer + @cvar generalDetectMask: + General detect mode bit. It enables the processor to notify the + debugger when the debugee is trying to access one of the debug + registers. + + @type hitMask: 4-tuple of integers + @cvar hitMask: + Hit bit on C{Dr6} for each slot. + Works as a bitwise-AND mask. + + @type hitMaskAll: integer + @cvar hitMaskAll: + Bitmask for all hit bits in C{Dr6}. Useful to know if at least one + hardware breakpoint was hit, or to clear the hit bits only. + + @type clearHitMask: integer + @cvar clearHitMask: + Bitmask to clear all the hit bits in C{Dr6}. + + @type debugAccessMask: integer + @cvar debugAccessMask: + The debugee tried to access a debug register. Needs bit + L{generalDetectMask} enabled in C{Dr7}. + + @type singleStepMask: integer + @cvar singleStepMask: + A single step exception was raised. Needs the trap flag enabled. + + @type taskSwitchMask: integer + @cvar taskSwitchMask: + A task switch has occurred. Needs the TSS T-bit set to 1. + + @type clearDr6Mask: integer + @cvar clearDr6Mask: + Bitmask to clear all meaningful bits in C{Dr6}. + """ + + BREAK_ON_EXECUTION = 0 + BREAK_ON_WRITE = 1 + BREAK_ON_ACCESS = 3 + BREAK_ON_IO_ACCESS = 2 + + WATCH_BYTE = 0 + WATCH_WORD = 1 + WATCH_DWORD = 3 + WATCH_QWORD = 2 + + registerMask = _registerMask + + # ------------------------------------------------------------------------------ + + ########################################################################### + # http://en.wikipedia.org/wiki/Debug_register + # + # DR7 - Debug control + # + # The low-order eight bits of DR7 (0,2,4,6 and 1,3,5,7) selectively enable + # the four address breakpoint conditions. There are two levels of enabling: + # the local (0,2,4,6) and global (1,3,5,7) levels. The local enable bits + # are automatically reset by the processor at every task switch to avoid + # unwanted breakpoint conditions in the new task. The global enable bits + # are not reset by a task switch; therefore, they can be used for + # conditions that are global to all tasks. + # + # Bits 16-17 (DR0), 20-21 (DR1), 24-25 (DR2), 28-29 (DR3), define when + # breakpoints trigger. Each breakpoint has a two-bit entry that specifies + # whether they break on execution (00b), data write (01b), data read or + # write (11b). 10b is defined to mean break on IO read or write but no + # hardware supports it. Bits 18-19 (DR0), 22-23 (DR1), 26-27 (DR2), 30-31 + # (DR3), define how large area of memory is watched by breakpoints. Again + # each breakpoint has a two-bit entry that specifies whether they watch + # one (00b), two (01b), eight (10b) or four (11b) bytes. + ########################################################################### + + # Dr7 |= enableMask[register] + enableMask = ( + 1 << 0, # Dr0 (bit 0) + 1 << 2, # Dr1 (bit 2) + 1 << 4, # Dr2 (bit 4) + 1 << 6, # Dr3 (bit 6) + ) + + # Dr7 &= disableMask[register] + disableMask = tuple([_registerMask ^ x for x in enableMask]) # The registerMask from the class is not there in py3 + try: + del x # It's not there in py3 + except: + pass + + # orMask, andMask = triggerMask[register][trigger] + # Dr7 = (Dr7 & andMask) | orMask # to set + # Dr7 = Dr7 & andMask # to remove + triggerMask = ( + # Dr0 (bits 16-17) + ( + ((0 << 16), (3 << 16) ^ registerMask), # execute + ((1 << 16), (3 << 16) ^ registerMask), # write + ((2 << 16), (3 << 16) ^ registerMask), # io read + ((3 << 16), (3 << 16) ^ registerMask), # access + ), + # Dr1 (bits 20-21) + ( + ((0 << 20), (3 << 20) ^ registerMask), # execute + ((1 << 20), (3 << 20) ^ registerMask), # write + ((2 << 20), (3 << 20) ^ registerMask), # io read + ((3 << 20), (3 << 20) ^ registerMask), # access + ), + # Dr2 (bits 24-25) + ( + ((0 << 24), (3 << 24) ^ registerMask), # execute + ((1 << 24), (3 << 24) ^ registerMask), # write + ((2 << 24), (3 << 24) ^ registerMask), # io read + ((3 << 24), (3 << 24) ^ registerMask), # access + ), + # Dr3 (bits 28-29) + ( + ((0 << 28), (3 << 28) ^ registerMask), # execute + ((1 << 28), (3 << 28) ^ registerMask), # write + ((2 << 28), (3 << 28) ^ registerMask), # io read + ((3 << 28), (3 << 28) ^ registerMask), # access + ), + ) + + # orMask, andMask = watchMask[register][watch] + # Dr7 = (Dr7 & andMask) | orMask # to set + # Dr7 = Dr7 & andMask # to remove + watchMask = ( + # Dr0 (bits 18-19) + ( + ((0 << 18), (3 << 18) ^ registerMask), # byte + ((1 << 18), (3 << 18) ^ registerMask), # word + ((2 << 18), (3 << 18) ^ registerMask), # qword + ((3 << 18), (3 << 18) ^ registerMask), # dword + ), + # Dr1 (bits 22-23) + ( + ((0 << 23), (3 << 23) ^ registerMask), # byte + ((1 << 23), (3 << 23) ^ registerMask), # word + ((2 << 23), (3 << 23) ^ registerMask), # qword + ((3 << 23), (3 << 23) ^ registerMask), # dword + ), + # Dr2 (bits 26-27) + ( + ((0 << 26), (3 << 26) ^ registerMask), # byte + ((1 << 26), (3 << 26) ^ registerMask), # word + ((2 << 26), (3 << 26) ^ registerMask), # qword + ((3 << 26), (3 << 26) ^ registerMask), # dword + ), + # Dr3 (bits 30-31) + ( + ((0 << 30), (3 << 31) ^ registerMask), # byte + ((1 << 30), (3 << 31) ^ registerMask), # word + ((2 << 30), (3 << 31) ^ registerMask), # qword + ((3 << 30), (3 << 31) ^ registerMask), # dword + ), + ) + + # Dr7 = Dr7 & clearMask[register] + clearMask = ( + registerMask ^ ((1 << 0) + (3 << 16) + (3 << 18)), # Dr0 + registerMask ^ ((1 << 2) + (3 << 20) + (3 << 22)), # Dr1 + registerMask ^ ((1 << 4) + (3 << 24) + (3 << 26)), # Dr2 + registerMask ^ ((1 << 6) + (3 << 28) + (3 << 30)), # Dr3 + ) + + # Dr7 = Dr7 | generalDetectMask + generalDetectMask = 1 << 13 + + ########################################################################### + # http://en.wikipedia.org/wiki/Debug_register + # + # DR6 - Debug status + # + # The debug status register permits the debugger to determine which debug + # conditions have occurred. When the processor detects an enabled debug + # exception, it sets the low-order bits of this register (0,1,2,3) before + # entering the debug exception handler. + # + # Note that the bits of DR6 are never cleared by the processor. To avoid + # any confusion in identifying the next debug exception, the debug handler + # should move zeros to DR6 immediately before returning. + ########################################################################### + + # bool(Dr6 & hitMask[register]) + hitMask = ( + ( + 1 << 0 # Dr0 + ), + ( + 1 << 1 # Dr1 + ), + ( + 1 << 2 # Dr2 + ), + ( + 1 << 3 # Dr3 + ), + ) + + # bool(Dr6 & anyHitMask) + hitMaskAll = hitMask[0] | hitMask[1] | hitMask[2] | hitMask[3] + + # Dr6 = Dr6 & clearHitMask + clearHitMask = registerMask ^ hitMaskAll + + # bool(Dr6 & debugAccessMask) + debugAccessMask = 1 << 13 + + # bool(Dr6 & singleStepMask) + singleStepMask = 1 << 14 + + # bool(Dr6 & taskSwitchMask) + taskSwitchMask = 1 << 15 + + # Dr6 = Dr6 & clearDr6Mask + clearDr6Mask = registerMask ^ (hitMaskAll | debugAccessMask | singleStepMask | taskSwitchMask) + + # ------------------------------------------------------------------------------ + + ############################################################################### + # + # (from the AMD64 manuals) + # + # The fields within the DebugCtlMSR register are: + # + # Last-Branch Record (LBR) - Bit 0, read/write. Software sets this bit to 1 + # to cause the processor to record the source and target addresses of the + # last control transfer taken before a debug exception occurs. The recorded + # control transfers include branch instructions, interrupts, and exceptions. + # + # Branch Single Step (BTF) - Bit 1, read/write. Software uses this bit to + # change the behavior of the rFLAGS.TF bit. When this bit is cleared to 0, + # the rFLAGS.TF bit controls instruction single stepping, (normal behavior). + # When this bit is set to 1, the rFLAGS.TF bit controls single stepping on + # control transfers. The single-stepped control transfers include branch + # instructions, interrupts, and exceptions. Control-transfer single stepping + # requires both BTF=1 and rFLAGS.TF=1. + # + # Performance-Monitoring/Breakpoint Pin-Control (PBi) - Bits 5-2, read/write. + # Software uses these bits to control the type of information reported by + # the four external performance-monitoring/breakpoint pins on the processor. + # When a PBi bit is cleared to 0, the corresponding external pin (BPi) + # reports performance-monitor information. When a PBi bit is set to 1, the + # corresponding external pin (BPi) reports breakpoint information. + # + # All remaining bits in the DebugCtlMSR register are reserved. + # + # Software can enable control-transfer single stepping by setting + # DebugCtlMSR.BTF to 1 and rFLAGS.TF to 1. The processor automatically + # disables control-transfer single stepping when a debug exception (#DB) + # occurs by clearing DebugCtlMSR.BTF to 0. rFLAGS.TF is also cleared when a + # #DB exception occurs. Before exiting the debug-exception handler, software + # must set both DebugCtlMSR.BTF and rFLAGS.TF to 1 to restart single + # stepping. + # + ############################################################################### + + DebugCtlMSR = 0x1D9 + LastBranchRecord = 1 << 0 + BranchTrapFlag = 1 << 1 + PinControl = ( + ( + 1 << 2 # PB1 + ), + ( + 1 << 3 # PB2 + ), + ( + 1 << 4 # PB3 + ), + ( + 1 << 5 # PB4 + ), + ) + + ############################################################################### + # + # (from the AMD64 manuals) + # + # Control-transfer recording MSRs: LastBranchToIP, LastBranchFromIP, + # LastExceptionToIP, and LastExceptionFromIP. These registers are loaded + # automatically by the processor when the DebugCtlMSR.LBR bit is set to 1. + # These MSRs are read-only. + # + # The processor automatically disables control-transfer recording when a + # debug exception (#DB) occurs by clearing DebugCtlMSR.LBR to 0. The + # contents of the control-transfer recording MSRs are not altered by the + # processor when the #DB occurs. Before exiting the debug-exception handler, + # software can set DebugCtlMSR.LBR to 1 to re-enable the recording mechanism. + # + ############################################################################### + + LastBranchToIP = 0x1DC + LastBranchFromIP = 0x1DB + LastExceptionToIP = 0x1DE + LastExceptionFromIP = 0x1DD + + # ------------------------------------------------------------------------------ + + @classmethod + def clear_bp(cls, ctx, register): + """ + Clears a hardware breakpoint. + + @see: find_slot, set_bp + + @type ctx: dict( str S{->} int ) + @param ctx: Thread context dictionary. + + @type register: int + @param register: Slot (debug register) for hardware breakpoint. + """ + ctx["Dr7"] &= cls.clearMask[register] + ctx["Dr%d" % register] = 0 + + @classmethod + def set_bp(cls, ctx, register, address, trigger, watch): + """ + Sets a hardware breakpoint. + + @see: clear_bp, find_slot + + @type ctx: dict( str S{->} int ) + @param ctx: Thread context dictionary. + + @type register: int + @param register: Slot (debug register). + + @type address: int + @param address: Memory address. + + @type trigger: int + @param trigger: Trigger flag. See L{HardwareBreakpoint.validTriggers}. + + @type watch: int + @param watch: Watch flag. See L{HardwareBreakpoint.validWatchSizes}. + """ + Dr7 = ctx["Dr7"] + Dr7 |= cls.enableMask[register] + orMask, andMask = cls.triggerMask[register][trigger] + Dr7 &= andMask + Dr7 |= orMask + orMask, andMask = cls.watchMask[register][watch] + Dr7 &= andMask + Dr7 |= orMask + ctx["Dr7"] = Dr7 + ctx["Dr%d" % register] = address + + @classmethod + def find_slot(cls, ctx): + """ + Finds an empty slot to set a hardware breakpoint. + + @see: clear_bp, set_bp + + @type ctx: dict( str S{->} int ) + @param ctx: Thread context dictionary. + + @rtype: int + @return: Slot (debug register) for hardware breakpoint. + """ + Dr7 = ctx["Dr7"] + slot = 0 + for m in cls.enableMask: + if (Dr7 & m) == 0: + return slot + slot += 1 + return None diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__init__.py new file mode 100644 index 0000000..a46153b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__init__.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Debugging API wrappers in ctypes. +""" + +__revision__ = "$Id$" + +from winappdbg.win32 import defines +from winappdbg.win32 import kernel32 +from winappdbg.win32 import user32 +from winappdbg.win32 import advapi32 +from winappdbg.win32 import wtsapi32 +from winappdbg.win32 import shell32 +from winappdbg.win32 import shlwapi +from winappdbg.win32 import psapi +from winappdbg.win32 import dbghelp +from winappdbg.win32 import ntdll + +from winappdbg.win32.defines import * +from winappdbg.win32.kernel32 import * +from winappdbg.win32.user32 import * +from winappdbg.win32.advapi32 import * +from winappdbg.win32.wtsapi32 import * +from winappdbg.win32.shell32 import * +from winappdbg.win32.shlwapi import * +from winappdbg.win32.psapi import * +from winappdbg.win32.dbghelp import * +from winappdbg.win32.ntdll import * + +# This calculates the list of exported symbols. +_all = set() +_all.update(defines._all) +_all.update(kernel32._all) +_all.update(user32._all) +_all.update(advapi32._all) +_all.update(wtsapi32._all) +_all.update(shell32._all) +_all.update(shlwapi._all) +_all.update(psapi._all) +_all.update(dbghelp._all) +_all.update(ntdll._all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42b3351fe7c8132ebc521e79f5fddffd294a40ff GIT binary patch literal 1992 zcmbW1&yU+g6vv+vCw6S_j{=(w6hzvjNQ*>V5j%|5n z6H>L(RtS|vl>#S@z==bJ#9z@%Z)ic4)t)E^ZY`Xsgv1*s_DTsAQY`1|&+~iVvFCX* zcb1kkz~fH;qwYUQzlk6{ic|P&KM(K?5U_wqmPB$S@8$Y=D=z`Ej4WGn!Ug1lRY=hypXG~kgK?mOIgUJ zF61gL=22xz>H3pkw9>&fDQbtXv3jMZZPNB$x9j@d>bVcjSBH@khBRVT*ROW?D5R{R zU6JeON&OEo)`k=-gnr`slp(6SH1es}Y9bf+7>yEA9Wro2cfv!?QdZaw^(MuL-VpDj zuMmoYWZZTa3qo-RKGMh*z8<%G@lc~=;(nic@(zeV$ ze%hq}N+d0d*JhudG;qEin*e+KV3*1PGgO6C*o}A@*UA|Oks;< z7DOCBMb7?|iS6k0<8RHr&&`hcA%1XXZc$GC>Sp8;*W9FRmj|I4MnRAAb3Sw19yR+T z>JLoMZJXhU?*x9U@oLj#E~l@APG{HYQf3md2E&nQ52#Oqh!QL%bdX+bhjXX1WAnhq zp*xf@Gi!pNR@1a?*LS&XH^R|l_3eH@_B?tvs^bfbmu4@bKFmv!^yq9(k{_zDTHZH) zhuVFp--nZlB4CK;iHSadQ}^Jddr(gl0Yf}%6Ma+!RsU>nU%m_S4gI?Q#e3sR2bT`v z*))ECynV2J2+yVQ*7)MV#Y3p1@oauJo*i#Ces_G~;KCuSr{g^_UwQsl?aWsvzkBD0 v?eDjLs{K-b{mbUh+L?XjE+{vQ>&EBHfB%^W{S7Am4!4c+)?4!JnvD7{bxOfc literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/advapi32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/advapi32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..209571d834c954e1615267653b2d692550182201 GIT binary patch literal 109224 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 PKX7HYN85f-ZUg-PU#L_h literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/version.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cea97ed5cea1d439e0f37d930e6aa8fc629fcda GIT binary patch literal 31905 zcmeHw3s_vob^l%1gK3 zlL8Y&f!RbGOJnKdX`e~63Cu30rwNiBe~xE0;*%adyZP4Bp0%ksF`YTYOqL-!S*GY> zPB9CAZsroRrEJl|vcw$b7IRs)n8!R~KFbjcSgu&e^28#RFBY=`v4jw(+Eyy9k7D{f(R;#SZ# zu#Mt2RxjShHi_HWW^o5-cCsyEBhq#u|8B&a5N>8$#XaD0JLva<;k(wqJZZWbqDmrx;{+iSJ~0izDoS zc#Pd6j4J4T@)^BjQ8Sq>c9!Sx`LB-YGuHM#K-WW8!0MRQw=g;)j?d z{yaM_KF-F(3+#mW1Ph73z)p%EW~aoDuyOGh*@XB@Y*KuZg~bInC0=Cj5`US=;zwCT z{1}Uhzrv=)kF(R_Q*1_DWDkm;V6)<{vNPhZv4_N`*;(<|**Wny*t^9~vWLZI*qrz& zHZOjfy+?c&I`XF56`0?K97F*0{Y>L=!Z+_hu=g$dbCkoX7e=fxM<=(svv0oDZlszf_8Cwv)%`S?6&VE^pv5$&N>|^3f zT=RYfn)h*w<}GvVQ@}1tmko{n4#$21*k85KepkA3@-fo_=ppI5h91V*uRS7&SJ~5m z3j1}yzhJ)sxWYaO_?PS%z`tUj0{mIm&AW$zbXC``;z$2?6<@purG_(*;m9@ z*>8(C*jL4y>;>@_`yKIL*zbxzWWOi=tMm`zkMQ?z(htSgr0e33rB}s&mu`svSNgH| zAJV^zKau|Vf=v{p9{}2WpqqUY zFq{1`pojelU=I5hU@rSpz&!S6fcfm(fCcQ&0Sj3Su;_wKD#W`OZ-m7Xyd8L#;+=ta z8Qz(Am*efky8>?)-j#S~;a!C{)pi5k*?3pu?ZLYS?;O0nc<16>i+3L0b$I9Fy%FyM zyzB9%@;Bj4)TnD9IPK!t+mf)m5#P-=ox!XJ8rXioW(G;X{zDF!0k#5S z4glQ8&_c`uX@GZd%Ke=3PPPS@yEy&b?7IjbU{?U|VR68F*;POvQveULzW{7yD}Zh6 zF9H4RuK?RQ&qJJN2j|(zdEUo)9%c=o>0)RREI3*K8%}lT<@9}={(es1&*=l4et^>t za{42@6+>(fat*WF0gtl1fFj!m_%_bx0nX>`oX

    IR9&m^K0ff2W61v7f387ZD*QwcR`DmSl3Tb+ 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 u@jLZ@Q{60sj+4K9b}B literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/wtsapi32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/wtsapi32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7952bd8e047296f598cb08ccd9040d2be0a2fd2d GIT binary patch literal 6233 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 MaxTokenInfoClass: + raise ValueError("Invalid value for TokenInformationClass (%i)" % TokenInformationClass) + + # User SID. + if TokenInformationClass == TokenUser: + TokenInformation = TOKEN_USER() + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.User.Sid.value + + # Owner SID. + if TokenInformationClass == TokenOwner: + TokenInformation = TOKEN_OWNER() + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.Owner.value + + # Primary group SID. + if TokenInformationClass == TokenOwner: + TokenInformation = TOKEN_PRIMARY_GROUP() + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.PrimaryGroup.value + + # App container SID. + if TokenInformationClass == TokenAppContainerSid: + TokenInformation = TOKEN_APPCONTAINER_INFORMATION() + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.TokenAppContainer.value + + # Integrity level SID. + if TokenInformationClass == TokenIntegrityLevel: + TokenInformation = TOKEN_MANDATORY_LABEL() + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.Label.Sid.value, TokenInformation.Label.Attributes + + # Logon session LUID. + if TokenInformationClass == TokenOrigin: + TokenInformation = TOKEN_ORIGIN() + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.OriginatingLogonSession + + # Primary or impersonation token. + if TokenInformationClass == TokenType: + TokenInformation = TOKEN_TYPE(0) + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.value + + # Elevated token. + if TokenInformationClass == TokenElevation: + TokenInformation = TOKEN_ELEVATION(0) + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.value + + # Security impersonation level. + if TokenInformationClass == TokenElevation: + TokenInformation = SECURITY_IMPERSONATION_LEVEL(0) + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.value + + # Session ID and other DWORD values. + if TokenInformationClass in (TokenSessionId, TokenAppContainerNumber): + TokenInformation = DWORD(0) + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation.value + + # Various boolean flags. + if TokenInformationClass in ( + TokenSandBoxInert, + TokenHasRestrictions, + TokenUIAccess, + TokenVirtualizationAllowed, + TokenVirtualizationEnabled, + ): + TokenInformation = DWORD(0) + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return bool(TokenInformation.value) + + # Linked token. + if TokenInformationClass == TokenLinkedToken: + TokenInformation = TOKEN_LINKED_TOKEN(0) + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenHandle(TokenInformation.LinkedToken.value, bOwnership=True) + + # Token statistics. + if TokenInformationClass == TokenStatistics: + TokenInformation = TOKEN_STATISTICS() + _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation) + return TokenInformation # TODO add a class wrapper? + + # Currently unsupported flags. + raise NotImplementedError("TokenInformationClass(%i) not yet supported!" % TokenInformationClass) + + +def _internal_GetTokenInformation(hTokenHandle, TokenInformationClass, TokenInformation): + _GetTokenInformation = windll.advapi32.GetTokenInformation + _GetTokenInformation.argtypes = [HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD] + _GetTokenInformation.restype = bool + _GetTokenInformation.errcheck = RaiseIfZero + + ReturnLength = DWORD(0) + TokenInformationLength = SIZEOF(TokenInformation) + _GetTokenInformation(hTokenHandle, TokenInformationClass, byref(TokenInformation), TokenInformationLength, byref(ReturnLength)) + if ReturnLength.value != TokenInformationLength: + raise ctypes.WinError(ERROR_INSUFFICIENT_BUFFER) + return TokenInformation + + +# BOOL WINAPI SetTokenInformation( +# __in HANDLE TokenHandle, +# __in TOKEN_INFORMATION_CLASS TokenInformationClass, +# __in LPVOID TokenInformation, +# __in DWORD TokenInformationLength +# ); + +# XXX TODO + + +# BOOL WINAPI CreateProcessWithLogonW( +# __in LPCWSTR lpUsername, +# __in_opt LPCWSTR lpDomain, +# __in LPCWSTR lpPassword, +# __in DWORD dwLogonFlags, +# __in_opt LPCWSTR lpApplicationName, +# __inout_opt LPWSTR lpCommandLine, +# __in DWORD dwCreationFlags, +# __in_opt LPVOID lpEnvironment, +# __in_opt LPCWSTR lpCurrentDirectory, +# __in LPSTARTUPINFOW lpStartupInfo, +# __out LPPROCESS_INFORMATION lpProcessInfo +# ); +def CreateProcessWithLogonW( + lpUsername=None, + lpDomain=None, + lpPassword=None, + dwLogonFlags=0, + lpApplicationName=None, + lpCommandLine=None, + dwCreationFlags=0, + lpEnvironment=None, + lpCurrentDirectory=None, + lpStartupInfo=None, +): + _CreateProcessWithLogonW = windll.advapi32.CreateProcessWithLogonW + _CreateProcessWithLogonW.argtypes = [ + LPWSTR, + LPWSTR, + LPWSTR, + DWORD, + LPWSTR, + LPWSTR, + DWORD, + LPVOID, + LPWSTR, + LPVOID, + LPPROCESS_INFORMATION, + ] + _CreateProcessWithLogonW.restype = bool + _CreateProcessWithLogonW.errcheck = RaiseIfZero + + if not lpUsername: + lpUsername = None + if not lpDomain: + lpDomain = None + if not lpPassword: + lpPassword = None + if not lpApplicationName: + lpApplicationName = None + if not lpCommandLine: + lpCommandLine = None + else: + lpCommandLine = ctypes.create_unicode_buffer(lpCommandLine, max(MAX_PATH, len(lpCommandLine))) + if not lpEnvironment: + lpEnvironment = None + else: + lpEnvironment = ctypes.create_unicode_buffer(lpEnvironment) + if not lpCurrentDirectory: + lpCurrentDirectory = None + if not lpStartupInfo: + lpStartupInfo = STARTUPINFOW() + lpStartupInfo.cb = sizeof(STARTUPINFOW) + lpStartupInfo.lpReserved = 0 + lpStartupInfo.lpDesktop = 0 + lpStartupInfo.lpTitle = 0 + lpStartupInfo.dwFlags = 0 + lpStartupInfo.cbReserved2 = 0 + lpStartupInfo.lpReserved2 = 0 + lpProcessInformation = PROCESS_INFORMATION() + lpProcessInformation.hProcess = INVALID_HANDLE_VALUE + lpProcessInformation.hThread = INVALID_HANDLE_VALUE + lpProcessInformation.dwProcessId = 0 + lpProcessInformation.dwThreadId = 0 + _CreateProcessWithLogonW( + lpUsername, + lpDomain, + lpPassword, + dwLogonFlags, + lpApplicationName, + lpCommandLine, + dwCreationFlags, + lpEnvironment, + lpCurrentDirectory, + byref(lpStartupInfo), + byref(lpProcessInformation), + ) + return ProcessInformation(lpProcessInformation) + + +CreateProcessWithLogonA = MakeANSIVersion(CreateProcessWithLogonW) +CreateProcessWithLogon = DefaultStringType(CreateProcessWithLogonA, CreateProcessWithLogonW) + + +# BOOL WINAPI CreateProcessWithTokenW( +# __in HANDLE hToken, +# __in DWORD dwLogonFlags, +# __in_opt LPCWSTR lpApplicationName, +# __inout_opt LPWSTR lpCommandLine, +# __in DWORD dwCreationFlags, +# __in_opt LPVOID lpEnvironment, +# __in_opt LPCWSTR lpCurrentDirectory, +# __in LPSTARTUPINFOW lpStartupInfo, +# __out LPPROCESS_INFORMATION lpProcessInfo +# ); +def CreateProcessWithTokenW( + hToken=None, + dwLogonFlags=0, + lpApplicationName=None, + lpCommandLine=None, + dwCreationFlags=0, + lpEnvironment=None, + lpCurrentDirectory=None, + lpStartupInfo=None, +): + _CreateProcessWithTokenW = windll.advapi32.CreateProcessWithTokenW + _CreateProcessWithTokenW.argtypes = [HANDLE, DWORD, LPWSTR, LPWSTR, DWORD, LPVOID, LPWSTR, LPVOID, LPPROCESS_INFORMATION] + _CreateProcessWithTokenW.restype = bool + _CreateProcessWithTokenW.errcheck = RaiseIfZero + + if not hToken: + hToken = None + if not lpApplicationName: + lpApplicationName = None + if not lpCommandLine: + lpCommandLine = None + else: + lpCommandLine = ctypes.create_unicode_buffer(lpCommandLine, max(MAX_PATH, len(lpCommandLine))) + if not lpEnvironment: + lpEnvironment = None + else: + lpEnvironment = ctypes.create_unicode_buffer(lpEnvironment) + if not lpCurrentDirectory: + lpCurrentDirectory = None + if not lpStartupInfo: + lpStartupInfo = STARTUPINFOW() + lpStartupInfo.cb = sizeof(STARTUPINFOW) + lpStartupInfo.lpReserved = 0 + lpStartupInfo.lpDesktop = 0 + lpStartupInfo.lpTitle = 0 + lpStartupInfo.dwFlags = 0 + lpStartupInfo.cbReserved2 = 0 + lpStartupInfo.lpReserved2 = 0 + lpProcessInformation = PROCESS_INFORMATION() + lpProcessInformation.hProcess = INVALID_HANDLE_VALUE + lpProcessInformation.hThread = INVALID_HANDLE_VALUE + lpProcessInformation.dwProcessId = 0 + lpProcessInformation.dwThreadId = 0 + _CreateProcessWithTokenW( + hToken, + dwLogonFlags, + lpApplicationName, + lpCommandLine, + dwCreationFlags, + lpEnvironment, + lpCurrentDirectory, + byref(lpStartupInfo), + byref(lpProcessInformation), + ) + return ProcessInformation(lpProcessInformation) + + +CreateProcessWithTokenA = MakeANSIVersion(CreateProcessWithTokenW) +CreateProcessWithToken = DefaultStringType(CreateProcessWithTokenA, CreateProcessWithTokenW) + + +# BOOL WINAPI CreateProcessAsUser( +# __in_opt HANDLE hToken, +# __in_opt LPCTSTR lpApplicationName, +# __inout_opt LPTSTR lpCommandLine, +# __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, +# __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, +# __in BOOL bInheritHandles, +# __in DWORD dwCreationFlags, +# __in_opt LPVOID lpEnvironment, +# __in_opt LPCTSTR lpCurrentDirectory, +# __in LPSTARTUPINFO lpStartupInfo, +# __out LPPROCESS_INFORMATION lpProcessInformation +# ); +def CreateProcessAsUserA( + hToken=None, + lpApplicationName=None, + lpCommandLine=None, + lpProcessAttributes=None, + lpThreadAttributes=None, + bInheritHandles=False, + dwCreationFlags=0, + lpEnvironment=None, + lpCurrentDirectory=None, + lpStartupInfo=None, +): + _CreateProcessAsUserA = windll.advapi32.CreateProcessAsUserA + _CreateProcessAsUserA.argtypes = [ + HANDLE, + LPSTR, + LPSTR, + LPSECURITY_ATTRIBUTES, + LPSECURITY_ATTRIBUTES, + BOOL, + DWORD, + LPVOID, + LPSTR, + LPVOID, + LPPROCESS_INFORMATION, + ] + _CreateProcessAsUserA.restype = bool + _CreateProcessAsUserA.errcheck = RaiseIfZero + + if not lpApplicationName: + lpApplicationName = None + if not lpCommandLine: + lpCommandLine = None + else: + lpCommandLine = ctypes.create_string_buffer(lpCommandLine, max(MAX_PATH, len(lpCommandLine))) + if not lpEnvironment: + lpEnvironment = None + else: + lpEnvironment = ctypes.create_string_buffer(lpEnvironment) + if not lpCurrentDirectory: + lpCurrentDirectory = None + if not lpProcessAttributes: + lpProcessAttributes = None + else: + lpProcessAttributes = byref(lpProcessAttributes) + if not lpThreadAttributes: + lpThreadAttributes = None + else: + lpThreadAttributes = byref(lpThreadAttributes) + if not lpStartupInfo: + lpStartupInfo = STARTUPINFO() + lpStartupInfo.cb = sizeof(STARTUPINFO) + lpStartupInfo.lpReserved = 0 + lpStartupInfo.lpDesktop = 0 + lpStartupInfo.lpTitle = 0 + lpStartupInfo.dwFlags = 0 + lpStartupInfo.cbReserved2 = 0 + lpStartupInfo.lpReserved2 = 0 + lpProcessInformation = PROCESS_INFORMATION() + lpProcessInformation.hProcess = INVALID_HANDLE_VALUE + lpProcessInformation.hThread = INVALID_HANDLE_VALUE + lpProcessInformation.dwProcessId = 0 + lpProcessInformation.dwThreadId = 0 + _CreateProcessAsUserA( + hToken, + lpApplicationName, + lpCommandLine, + lpProcessAttributes, + lpThreadAttributes, + bool(bInheritHandles), + dwCreationFlags, + lpEnvironment, + lpCurrentDirectory, + byref(lpStartupInfo), + byref(lpProcessInformation), + ) + return ProcessInformation(lpProcessInformation) + + +def CreateProcessAsUserW( + hToken=None, + lpApplicationName=None, + lpCommandLine=None, + lpProcessAttributes=None, + lpThreadAttributes=None, + bInheritHandles=False, + dwCreationFlags=0, + lpEnvironment=None, + lpCurrentDirectory=None, + lpStartupInfo=None, +): + _CreateProcessAsUserW = windll.advapi32.CreateProcessAsUserW + _CreateProcessAsUserW.argtypes = [ + HANDLE, + LPWSTR, + LPWSTR, + LPSECURITY_ATTRIBUTES, + LPSECURITY_ATTRIBUTES, + BOOL, + DWORD, + LPVOID, + LPWSTR, + LPVOID, + LPPROCESS_INFORMATION, + ] + _CreateProcessAsUserW.restype = bool + _CreateProcessAsUserW.errcheck = RaiseIfZero + + if not lpApplicationName: + lpApplicationName = None + if not lpCommandLine: + lpCommandLine = None + else: + lpCommandLine = ctypes.create_unicode_buffer(lpCommandLine, max(MAX_PATH, len(lpCommandLine))) + if not lpEnvironment: + lpEnvironment = None + else: + lpEnvironment = ctypes.create_unicode_buffer(lpEnvironment) + if not lpCurrentDirectory: + lpCurrentDirectory = None + if not lpProcessAttributes: + lpProcessAttributes = None + else: + lpProcessAttributes = byref(lpProcessAttributes) + if not lpThreadAttributes: + lpThreadAttributes = None + else: + lpThreadAttributes = byref(lpThreadAttributes) + if not lpStartupInfo: + lpStartupInfo = STARTUPINFO() + lpStartupInfo.cb = sizeof(STARTUPINFO) + lpStartupInfo.lpReserved = 0 + lpStartupInfo.lpDesktop = 0 + lpStartupInfo.lpTitle = 0 + lpStartupInfo.dwFlags = 0 + lpStartupInfo.cbReserved2 = 0 + lpStartupInfo.lpReserved2 = 0 + lpProcessInformation = PROCESS_INFORMATION() + lpProcessInformation.hProcess = INVALID_HANDLE_VALUE + lpProcessInformation.hThread = INVALID_HANDLE_VALUE + lpProcessInformation.dwProcessId = 0 + lpProcessInformation.dwThreadId = 0 + _CreateProcessAsUserW( + hToken, + lpApplicationName, + lpCommandLine, + lpProcessAttributes, + lpThreadAttributes, + bool(bInheritHandles), + dwCreationFlags, + lpEnvironment, + lpCurrentDirectory, + byref(lpStartupInfo), + byref(lpProcessInformation), + ) + return ProcessInformation(lpProcessInformation) + + +CreateProcessAsUser = GuessStringType(CreateProcessAsUserA, CreateProcessAsUserW) + +# VOID CALLBACK WaitChainCallback( +# HWCT WctHandle, +# DWORD_PTR Context, +# DWORD CallbackStatus, +# LPDWORD NodeCount, +# PWAITCHAIN_NODE_INFO NodeInfoArray, +# LPBOOL IsCycle +# ); +PWAITCHAINCALLBACK = WINFUNCTYPE(HWCT, DWORD_PTR, DWORD, LPDWORD, PWAITCHAIN_NODE_INFO, LPBOOL) + + +# HWCT WINAPI OpenThreadWaitChainSession( +# __in DWORD Flags, +# __in_opt PWAITCHAINCALLBACK callback +# ); +def OpenThreadWaitChainSession(Flags=0, callback=None): + _OpenThreadWaitChainSession = windll.advapi32.OpenThreadWaitChainSession + _OpenThreadWaitChainSession.argtypes = [DWORD, PVOID] + _OpenThreadWaitChainSession.restype = HWCT + _OpenThreadWaitChainSession.errcheck = RaiseIfZero + + if callback is not None: + callback = PWAITCHAINCALLBACK(callback) + aHandle = _OpenThreadWaitChainSession(Flags, callback) + return ThreadWaitChainSessionHandle(aHandle) + + +# BOOL WINAPI GetThreadWaitChain( +# _In_ HWCT WctHandle, +# _In_opt_ DWORD_PTR Context, +# _In_ DWORD Flags, +# _In_ DWORD ThreadId, +# _Inout_ LPDWORD NodeCount, +# _Out_ PWAITCHAIN_NODE_INFO NodeInfoArray, +# _Out_ LPBOOL IsCycle +# ); +def GetThreadWaitChain(WctHandle, Context=None, Flags=WCTP_GETINFO_ALL_FLAGS, ThreadId=-1, NodeCount=WCT_MAX_NODE_COUNT): + _GetThreadWaitChain = windll.advapi32.GetThreadWaitChain + _GetThreadWaitChain.argtypes = [HWCT, LPDWORD, DWORD, DWORD, LPDWORD, PWAITCHAIN_NODE_INFO, LPBOOL] + _GetThreadWaitChain.restype = bool + _GetThreadWaitChain.errcheck = RaiseIfZero + + dwNodeCount = DWORD(NodeCount) + NodeInfoArray = (WAITCHAIN_NODE_INFO * NodeCount)() + IsCycle = BOOL(0) + _GetThreadWaitChain( + WctHandle, + Context, + Flags, + ThreadId, + byref(dwNodeCount), + ctypes.cast(ctypes.pointer(NodeInfoArray), PWAITCHAIN_NODE_INFO), + byref(IsCycle), + ) + while dwNodeCount.value > NodeCount: + NodeCount = dwNodeCount.value + NodeInfoArray = (WAITCHAIN_NODE_INFO * NodeCount)() + _GetThreadWaitChain( + WctHandle, + Context, + Flags, + ThreadId, + byref(dwNodeCount), + ctypes.cast(ctypes.pointer(NodeInfoArray), PWAITCHAIN_NODE_INFO), + byref(IsCycle), + ) + return ([WaitChainNodeInfo(NodeInfoArray[index]) for index in compat.xrange(dwNodeCount.value)], bool(IsCycle.value)) + + +# VOID WINAPI CloseThreadWaitChainSession( +# __in HWCT WctHandle +# ); +def CloseThreadWaitChainSession(WctHandle): + _CloseThreadWaitChainSession = windll.advapi32.CloseThreadWaitChainSession + _CloseThreadWaitChainSession.argtypes = [HWCT] + _CloseThreadWaitChainSession(WctHandle) + + +# BOOL WINAPI SaferCreateLevel( +# __in DWORD dwScopeId, +# __in DWORD dwLevelId, +# __in DWORD OpenFlags, +# __out SAFER_LEVEL_HANDLE *pLevelHandle, +# __reserved LPVOID lpReserved +# ); +def SaferCreateLevel(dwScopeId=SAFER_SCOPEID_USER, dwLevelId=SAFER_LEVELID_NORMALUSER, OpenFlags=0): + _SaferCreateLevel = windll.advapi32.SaferCreateLevel + _SaferCreateLevel.argtypes = [DWORD, DWORD, DWORD, POINTER(SAFER_LEVEL_HANDLE), LPVOID] + _SaferCreateLevel.restype = BOOL + _SaferCreateLevel.errcheck = RaiseIfZero + + hLevelHandle = SAFER_LEVEL_HANDLE(INVALID_HANDLE_VALUE) + _SaferCreateLevel(dwScopeId, dwLevelId, OpenFlags, byref(hLevelHandle), None) + return SaferLevelHandle(hLevelHandle.value) + + +# BOOL WINAPI SaferIdentifyLevel( +# __in DWORD dwNumProperties, +# __in_opt PSAFER_CODE_PROPERTIES pCodeProperties, +# __out SAFER_LEVEL_HANDLE *pLevelHandle, +# __reserved LPVOID lpReserved +# ); + +# XXX TODO + + +# BOOL WINAPI SaferComputeTokenFromLevel( +# __in SAFER_LEVEL_HANDLE LevelHandle, +# __in_opt HANDLE InAccessToken, +# __out PHANDLE OutAccessToken, +# __in DWORD dwFlags, +# __inout_opt LPVOID lpReserved +# ); +def SaferComputeTokenFromLevel(LevelHandle, InAccessToken=None, dwFlags=0): + _SaferComputeTokenFromLevel = windll.advapi32.SaferComputeTokenFromLevel + _SaferComputeTokenFromLevel.argtypes = [SAFER_LEVEL_HANDLE, HANDLE, PHANDLE, DWORD, LPDWORD] + _SaferComputeTokenFromLevel.restype = BOOL + _SaferComputeTokenFromLevel.errcheck = RaiseIfZero + + OutAccessToken = HANDLE(INVALID_HANDLE_VALUE) + lpReserved = DWORD(0) + _SaferComputeTokenFromLevel(LevelHandle, InAccessToken, byref(OutAccessToken), dwFlags, byref(lpReserved)) + return TokenHandle(OutAccessToken.value), lpReserved.value + + +# BOOL WINAPI SaferCloseLevel( +# __in SAFER_LEVEL_HANDLE hLevelHandle +# ); +def SaferCloseLevel(hLevelHandle): + _SaferCloseLevel = windll.advapi32.SaferCloseLevel + _SaferCloseLevel.argtypes = [SAFER_LEVEL_HANDLE] + _SaferCloseLevel.restype = BOOL + _SaferCloseLevel.errcheck = RaiseIfZero + + if hasattr(hLevelHandle, "value"): + _SaferCloseLevel(hLevelHandle.value) + else: + _SaferCloseLevel(hLevelHandle) + + +# BOOL SaferiIsExecutableFileType( +# __in LPCWSTR szFullPath, +# __in BOOLEAN bFromShellExecute +# ); +def SaferiIsExecutableFileType(szFullPath, bFromShellExecute=False): + _SaferiIsExecutableFileType = windll.advapi32.SaferiIsExecutableFileType + _SaferiIsExecutableFileType.argtypes = [LPWSTR, BOOLEAN] + _SaferiIsExecutableFileType.restype = BOOL + _SaferiIsExecutableFileType.errcheck = RaiseIfLastError + + SetLastError(ERROR_SUCCESS) + return bool(_SaferiIsExecutableFileType(compat.unicode(szFullPath), bFromShellExecute)) + + +# useful alias since I'm likely to misspell it :P +SaferIsExecutableFileType = SaferiIsExecutableFileType + +# ------------------------------------------------------------------------------ + + +# LONG WINAPI RegCloseKey( +# __in HKEY hKey +# ); +def RegCloseKey(hKey): + if hasattr(hKey, "value"): + value = hKey.value + else: + value = hKey + + if value in (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_PERFORMANCE_DATA, HKEY_CURRENT_CONFIG): + return + + _RegCloseKey = windll.advapi32.RegCloseKey + _RegCloseKey.argtypes = [HKEY] + _RegCloseKey.restype = LONG + _RegCloseKey.errcheck = RaiseIfNotErrorSuccess + _RegCloseKey(hKey) + + +# LONG WINAPI RegConnectRegistry( +# __in_opt LPCTSTR lpMachineName, +# __in HKEY hKey, +# __out PHKEY phkResult +# ); +def RegConnectRegistryA(lpMachineName=None, hKey=HKEY_LOCAL_MACHINE): + _RegConnectRegistryA = windll.advapi32.RegConnectRegistryA + _RegConnectRegistryA.argtypes = [LPSTR, HKEY, PHKEY] + _RegConnectRegistryA.restype = LONG + _RegConnectRegistryA.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegConnectRegistryA(lpMachineName, hKey, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +def RegConnectRegistryW(lpMachineName=None, hKey=HKEY_LOCAL_MACHINE): + _RegConnectRegistryW = windll.advapi32.RegConnectRegistryW + _RegConnectRegistryW.argtypes = [LPWSTR, HKEY, PHKEY] + _RegConnectRegistryW.restype = LONG + _RegConnectRegistryW.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegConnectRegistryW(lpMachineName, hKey, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +RegConnectRegistry = GuessStringType(RegConnectRegistryA, RegConnectRegistryW) + + +# LONG WINAPI RegCreateKey( +# __in HKEY hKey, +# __in_opt LPCTSTR lpSubKey, +# __out PHKEY phkResult +# ); +def RegCreateKeyA(hKey=HKEY_LOCAL_MACHINE, lpSubKey=None): + _RegCreateKeyA = windll.advapi32.RegCreateKeyA + _RegCreateKeyA.argtypes = [HKEY, LPSTR, PHKEY] + _RegCreateKeyA.restype = LONG + _RegCreateKeyA.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegCreateKeyA(hKey, lpSubKey, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +def RegCreateKeyW(hKey=HKEY_LOCAL_MACHINE, lpSubKey=None): + _RegCreateKeyW = windll.advapi32.RegCreateKeyW + _RegCreateKeyW.argtypes = [HKEY, LPWSTR, PHKEY] + _RegCreateKeyW.restype = LONG + _RegCreateKeyW.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegCreateKeyW(hKey, lpSubKey, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +RegCreateKey = GuessStringType(RegCreateKeyA, RegCreateKeyW) + +# LONG WINAPI RegCreateKeyEx( +# __in HKEY hKey, +# __in LPCTSTR lpSubKey, +# __reserved DWORD Reserved, +# __in_opt LPTSTR lpClass, +# __in DWORD dwOptions, +# __in REGSAM samDesired, +# __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, +# __out PHKEY phkResult, +# __out_opt LPDWORD lpdwDisposition +# ); + +# XXX TODO + + +# LONG WINAPI RegOpenKey( +# __in HKEY hKey, +# __in_opt LPCTSTR lpSubKey, +# __out PHKEY phkResult +# ); +def RegOpenKeyA(hKey=HKEY_LOCAL_MACHINE, lpSubKey=None): + _RegOpenKeyA = windll.advapi32.RegOpenKeyA + _RegOpenKeyA.argtypes = [HKEY, LPSTR, PHKEY] + _RegOpenKeyA.restype = LONG + _RegOpenKeyA.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegOpenKeyA(hKey, lpSubKey, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +def RegOpenKeyW(hKey=HKEY_LOCAL_MACHINE, lpSubKey=None): + _RegOpenKeyW = windll.advapi32.RegOpenKeyW + _RegOpenKeyW.argtypes = [HKEY, LPWSTR, PHKEY] + _RegOpenKeyW.restype = LONG + _RegOpenKeyW.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegOpenKeyW(hKey, lpSubKey, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +RegOpenKey = GuessStringType(RegOpenKeyA, RegOpenKeyW) + + +# LONG WINAPI RegOpenKeyEx( +# __in HKEY hKey, +# __in_opt LPCTSTR lpSubKey, +# __reserved DWORD ulOptions, +# __in REGSAM samDesired, +# __out PHKEY phkResult +# ); +def RegOpenKeyExA(hKey=HKEY_LOCAL_MACHINE, lpSubKey=None, samDesired=KEY_ALL_ACCESS): + _RegOpenKeyExA = windll.advapi32.RegOpenKeyExA + _RegOpenKeyExA.argtypes = [HKEY, LPSTR, DWORD, REGSAM, PHKEY] + _RegOpenKeyExA.restype = LONG + _RegOpenKeyExA.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegOpenKeyExA(hKey, lpSubKey, 0, samDesired, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +def RegOpenKeyExW(hKey=HKEY_LOCAL_MACHINE, lpSubKey=None, samDesired=KEY_ALL_ACCESS): + _RegOpenKeyExW = windll.advapi32.RegOpenKeyExW + _RegOpenKeyExW.argtypes = [HKEY, LPWSTR, DWORD, REGSAM, PHKEY] + _RegOpenKeyExW.restype = LONG + _RegOpenKeyExW.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegOpenKeyExW(hKey, lpSubKey, 0, samDesired, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +RegOpenKeyEx = GuessStringType(RegOpenKeyExA, RegOpenKeyExW) + + +# LONG WINAPI RegOpenCurrentUser( +# __in REGSAM samDesired, +# __out PHKEY phkResult +# ); +def RegOpenCurrentUser(samDesired=KEY_ALL_ACCESS): + _RegOpenCurrentUser = windll.advapi32.RegOpenCurrentUser + _RegOpenCurrentUser.argtypes = [REGSAM, PHKEY] + _RegOpenCurrentUser.restype = LONG + _RegOpenCurrentUser.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegOpenCurrentUser(samDesired, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +# LONG WINAPI RegOpenUserClassesRoot( +# __in HANDLE hToken, +# __reserved DWORD dwOptions, +# __in REGSAM samDesired, +# __out PHKEY phkResult +# ); +def RegOpenUserClassesRoot(hToken, samDesired=KEY_ALL_ACCESS): + _RegOpenUserClassesRoot = windll.advapi32.RegOpenUserClassesRoot + _RegOpenUserClassesRoot.argtypes = [HANDLE, DWORD, REGSAM, PHKEY] + _RegOpenUserClassesRoot.restype = LONG + _RegOpenUserClassesRoot.errcheck = RaiseIfNotErrorSuccess + + hkResult = HKEY(INVALID_HANDLE_VALUE) + _RegOpenUserClassesRoot(hToken, 0, samDesired, byref(hkResult)) + return RegistryKeyHandle(hkResult.value) + + +# LONG WINAPI RegQueryValue( +# __in HKEY hKey, +# __in_opt LPCTSTR lpSubKey, +# __out_opt LPTSTR lpValue, +# __inout_opt PLONG lpcbValue +# ); +def RegQueryValueA(hKey, lpSubKey=None): + _RegQueryValueA = windll.advapi32.RegQueryValueA + _RegQueryValueA.argtypes = [HKEY, LPSTR, LPVOID, PLONG] + _RegQueryValueA.restype = LONG + _RegQueryValueA.errcheck = RaiseIfNotErrorSuccess + + cbValue = LONG(0) + _RegQueryValueA(hKey, lpSubKey, None, byref(cbValue)) + lpValue = ctypes.create_string_buffer(cbValue.value) + _RegQueryValueA(hKey, lpSubKey, lpValue, byref(cbValue)) + return lpValue.value + + +def RegQueryValueW(hKey, lpSubKey=None): + _RegQueryValueW = windll.advapi32.RegQueryValueW + _RegQueryValueW.argtypes = [HKEY, LPWSTR, LPVOID, PLONG] + _RegQueryValueW.restype = LONG + _RegQueryValueW.errcheck = RaiseIfNotErrorSuccess + + cbValue = LONG(0) + _RegQueryValueW(hKey, lpSubKey, None, byref(cbValue)) + lpValue = ctypes.create_unicode_buffer(cbValue.value * sizeof(WCHAR)) + _RegQueryValueW(hKey, lpSubKey, lpValue, byref(cbValue)) + return lpValue.value + + +RegQueryValue = GuessStringType(RegQueryValueA, RegQueryValueW) + + +# LONG WINAPI RegQueryValueEx( +# __in HKEY hKey, +# __in_opt LPCTSTR lpValueName, +# __reserved LPDWORD lpReserved, +# __out_opt LPDWORD lpType, +# __out_opt LPBYTE lpData, +# __inout_opt LPDWORD lpcbData +# ); +def _internal_RegQueryValueEx(ansi, hKey, lpValueName=None, bGetData=True): + _RegQueryValueEx = _caller_RegQueryValueEx(ansi) + + cbData = DWORD(0) + dwType = DWORD(-1) + _RegQueryValueEx(hKey, lpValueName, None, byref(dwType), None, byref(cbData)) + Type = dwType.value + + if not bGetData: + return cbData.value, Type + + if Type in (REG_DWORD, REG_DWORD_BIG_ENDIAN): # REG_DWORD_LITTLE_ENDIAN + if cbData.value != 4: + raise ValueError("REG_DWORD value of size %d" % cbData.value) + dwData = DWORD(0) + _RegQueryValueEx(hKey, lpValueName, None, None, byref(dwData), byref(cbData)) + return dwData.value, Type + + if Type == REG_QWORD: # REG_QWORD_LITTLE_ENDIAN + if cbData.value != 8: + raise ValueError("REG_QWORD value of size %d" % cbData.value) + qwData = QWORD(long(0)) + _RegQueryValueEx(hKey, lpValueName, None, None, byref(qwData), byref(cbData)) + return qwData.value, Type + + if Type in (REG_SZ, REG_EXPAND_SZ): + if ansi: + szData = ctypes.create_string_buffer(cbData.value) + else: + szData = ctypes.create_unicode_buffer(cbData.value) + _RegQueryValueEx(hKey, lpValueName, None, None, byref(szData), byref(cbData)) + return szData.value, Type + + if Type == REG_MULTI_SZ: + if ansi: + szData = ctypes.create_string_buffer(cbData.value) + else: + szData = ctypes.create_unicode_buffer(cbData.value) + _RegQueryValueEx(hKey, lpValueName, None, None, byref(szData), byref(cbData)) + Data = szData[:] + if ansi: + aData = Data.split("\0") + else: + aData = Data.split("\0") + aData = [token for token in aData if token] + return aData, Type + + if Type == REG_LINK: + szData = ctypes.create_unicode_buffer(cbData.value) + _RegQueryValueEx(hKey, lpValueName, None, None, byref(szData), byref(cbData)) + return szData.value, Type + + # REG_BINARY, REG_NONE, and any future types + szData = ctypes.create_string_buffer(cbData.value) + _RegQueryValueEx(hKey, lpValueName, None, None, byref(szData), byref(cbData)) + return szData.raw, Type + + +def _caller_RegQueryValueEx(ansi): + if ansi: + _RegQueryValueEx = windll.advapi32.RegQueryValueExA + _RegQueryValueEx.argtypes = [HKEY, LPSTR, LPVOID, PDWORD, LPVOID, PDWORD] + else: + _RegQueryValueEx = windll.advapi32.RegQueryValueExW + _RegQueryValueEx.argtypes = [HKEY, LPWSTR, LPVOID, PDWORD, LPVOID, PDWORD] + _RegQueryValueEx.restype = LONG + _RegQueryValueEx.errcheck = RaiseIfNotErrorSuccess + return _RegQueryValueEx + + +# see _internal_RegQueryValueEx +def RegQueryValueExA(hKey, lpValueName=None, bGetData=True): + return _internal_RegQueryValueEx(True, hKey, lpValueName, bGetData) + + +# see _internal_RegQueryValueEx +def RegQueryValueExW(hKey, lpValueName=None, bGetData=True): + return _internal_RegQueryValueEx(False, hKey, lpValueName, bGetData) + + +RegQueryValueEx = GuessStringType(RegQueryValueExA, RegQueryValueExW) + + +# LONG WINAPI RegSetValueEx( +# __in HKEY hKey, +# __in_opt LPCTSTR lpValueName, +# __reserved DWORD Reserved, +# __in DWORD dwType, +# __in_opt const BYTE *lpData, +# __in DWORD cbData +# ); +def RegSetValueEx(hKey, lpValueName=None, lpData=None, dwType=None): + # Determine which version of the API to use, ANSI or Widechar. + if lpValueName is None: + if isinstance(lpData, GuessStringType.t_ansi): + ansi = True + elif isinstance(lpData, GuessStringType.t_unicode): + ansi = False + else: + ansi = GuessStringType.t_ansi == GuessStringType.t_default + elif isinstance(lpValueName, GuessStringType.t_ansi): + ansi = True + elif isinstance(lpValueName, GuessStringType.t_unicode): + ansi = False + else: + raise TypeError("String expected, got %s instead" % type(lpValueName)) + + # Autodetect the type when not given. + # TODO: improve detection of DWORD and QWORD by seeing if the value "fits". + if dwType is None: + if lpValueName is None: + dwType = REG_SZ + elif lpData is None: + dwType = REG_NONE + elif isinstance(lpData, GuessStringType.t_ansi): + dwType = REG_SZ + elif isinstance(lpData, GuessStringType.t_unicode): + dwType = REG_SZ + elif isinstance(lpData, int): + dwType = REG_DWORD + elif isinstance(lpData, long): + dwType = REG_QWORD + else: + dwType = REG_BINARY + + # Load the ctypes caller. + if ansi: + _RegSetValueEx = windll.advapi32.RegSetValueExA + _RegSetValueEx.argtypes = [HKEY, LPSTR, DWORD, DWORD, LPVOID, DWORD] + else: + _RegSetValueEx = windll.advapi32.RegSetValueExW + _RegSetValueEx.argtypes = [HKEY, LPWSTR, DWORD, DWORD, LPVOID, DWORD] + _RegSetValueEx.restype = LONG + _RegSetValueEx.errcheck = RaiseIfNotErrorSuccess + + # Convert the arguments so ctypes can understand them. + if lpData is None: + DataRef = None + DataSize = 0 + else: + if dwType in (REG_DWORD, REG_DWORD_BIG_ENDIAN): # REG_DWORD_LITTLE_ENDIAN + Data = DWORD(lpData) + elif dwType == REG_QWORD: # REG_QWORD_LITTLE_ENDIAN + Data = QWORD(lpData) + elif dwType in (REG_SZ, REG_EXPAND_SZ): + if ansi: + Data = ctypes.create_string_buffer(lpData) + else: + Data = ctypes.create_unicode_buffer(lpData) + elif dwType == REG_MULTI_SZ: + if ansi: + Data = ctypes.create_string_buffer("\0".join(lpData) + "\0\0") + else: + Data = ctypes.create_unicode_buffer("\0".join(lpData) + "\0\0") + elif dwType == REG_LINK: + Data = ctypes.create_unicode_buffer(lpData) + else: + Data = ctypes.create_string_buffer(lpData) + DataRef = byref(Data) + DataSize = sizeof(Data) + + # Call the API with the converted arguments. + _RegSetValueEx(hKey, lpValueName, 0, dwType, DataRef, DataSize) + + +# No "GuessStringType" here since detection is done inside. +RegSetValueExA = RegSetValueExW = RegSetValueEx + + +# LONG WINAPI RegEnumKey( +# __in HKEY hKey, +# __in DWORD dwIndex, +# __out LPTSTR lpName, +# __in DWORD cchName +# ); +def RegEnumKeyA(hKey, dwIndex): + _RegEnumKeyA = windll.advapi32.RegEnumKeyA + _RegEnumKeyA.argtypes = [HKEY, DWORD, LPSTR, DWORD] + _RegEnumKeyA.restype = LONG + + cchName = 1024 + while True: + lpName = ctypes.create_string_buffer(cchName) + errcode = _RegEnumKeyA(hKey, dwIndex, lpName, cchName) + if errcode != ERROR_MORE_DATA: + break + cchName = cchName + 1024 + if cchName > 65536: + raise ctypes.WinError(errcode) + if errcode == ERROR_NO_MORE_ITEMS: + return None + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return lpName.value + + +def RegEnumKeyW(hKey, dwIndex): + _RegEnumKeyW = windll.advapi32.RegEnumKeyW + _RegEnumKeyW.argtypes = [HKEY, DWORD, LPWSTR, DWORD] + _RegEnumKeyW.restype = LONG + + cchName = 512 + while True: + lpName = ctypes.create_unicode_buffer(cchName) + errcode = _RegEnumKeyW(hKey, dwIndex, lpName, cchName * 2) + if errcode != ERROR_MORE_DATA: + break + cchName = cchName + 512 + if cchName > 32768: + raise ctypes.WinError(errcode) + if errcode == ERROR_NO_MORE_ITEMS: + return None + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return lpName.value + + +RegEnumKey = DefaultStringType(RegEnumKeyA, RegEnumKeyW) + +# LONG WINAPI RegEnumKeyEx( +# __in HKEY hKey, +# __in DWORD dwIndex, +# __out LPTSTR lpName, +# __inout LPDWORD lpcName, +# __reserved LPDWORD lpReserved, +# __inout LPTSTR lpClass, +# __inout_opt LPDWORD lpcClass, +# __out_opt PFILETIME lpftLastWriteTime +# ); + +# XXX TODO + + +# LONG WINAPI RegEnumValue( +# __in HKEY hKey, +# __in DWORD dwIndex, +# __out LPTSTR lpValueName, +# __inout LPDWORD lpcchValueName, +# __reserved LPDWORD lpReserved, +# __out_opt LPDWORD lpType, +# __out_opt LPBYTE lpData, +# __inout_opt LPDWORD lpcbData +# ); +def _internal_RegEnumValue(ansi, hKey, dwIndex, bGetData=True): + if ansi: + _RegEnumValue = windll.advapi32.RegEnumValueA + _RegEnumValue.argtypes = [HKEY, DWORD, LPSTR, LPDWORD, LPVOID, LPDWORD, LPVOID, LPDWORD] + else: + _RegEnumValue = windll.advapi32.RegEnumValueW + _RegEnumValue.argtypes = [HKEY, DWORD, LPWSTR, LPDWORD, LPVOID, LPDWORD, LPVOID, LPDWORD] + _RegEnumValue.restype = LONG + + cchValueName = DWORD(1024) + dwType = DWORD(-1) + lpcchValueName = byref(cchValueName) + lpType = byref(dwType) + if ansi: + lpValueName = ctypes.create_string_buffer(cchValueName.value) + else: + lpValueName = ctypes.create_unicode_buffer(cchValueName.value) + if bGetData: + cbData = DWORD(0) + lpcbData = byref(cbData) + else: + lpcbData = None + lpData = None + errcode = _RegEnumValue(hKey, dwIndex, lpValueName, lpcchValueName, None, lpType, lpData, lpcbData) + + if errcode == ERROR_MORE_DATA or (bGetData and errcode == ERROR_SUCCESS): + if ansi: + cchValueName.value = cchValueName.value + sizeof(CHAR) + lpValueName = ctypes.create_string_buffer(cchValueName.value) + else: + cchValueName.value = cchValueName.value + sizeof(WCHAR) + lpValueName = ctypes.create_unicode_buffer(cchValueName.value) + + if bGetData: + Type = dwType.value + + if Type in (REG_DWORD, REG_DWORD_BIG_ENDIAN): # REG_DWORD_LITTLE_ENDIAN + if cbData.value != sizeof(DWORD): + raise ValueError("REG_DWORD value of size %d" % cbData.value) + Data = DWORD(0) + + elif Type == REG_QWORD: # REG_QWORD_LITTLE_ENDIAN + if cbData.value != sizeof(QWORD): + raise ValueError("REG_QWORD value of size %d" % cbData.value) + Data = QWORD(long(0)) + + elif Type in (REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ): + if ansi: + Data = ctypes.create_string_buffer(cbData.value) + else: + Data = ctypes.create_unicode_buffer(cbData.value) + + elif Type == REG_LINK: + Data = ctypes.create_unicode_buffer(cbData.value) + + else: # REG_BINARY, REG_NONE, and any future types + Data = ctypes.create_string_buffer(cbData.value) + + lpData = byref(Data) + + errcode = _RegEnumValue(hKey, dwIndex, lpValueName, lpcchValueName, None, lpType, lpData, lpcbData) + + if errcode == ERROR_NO_MORE_ITEMS: + return None + # if errcode != ERROR_SUCCESS: + # raise ctypes.WinError(errcode) + + if not bGetData: + return lpValueName.value, dwType.value + + if Type in ( + REG_DWORD, + REG_DWORD_BIG_ENDIAN, + REG_QWORD, + REG_SZ, + REG_EXPAND_SZ, + REG_LINK, + ): # REG_DWORD_LITTLE_ENDIAN, REG_QWORD_LITTLE_ENDIAN + return lpValueName.value, dwType.value, Data.value + + if Type == REG_MULTI_SZ: + sData = Data[:] + del Data + if ansi: + aData = sData.split("\0") + else: + aData = sData.split("\0") + aData = [token for token in aData if token] + return lpValueName.value, dwType.value, aData + + # REG_BINARY, REG_NONE, and any future types + return lpValueName.value, dwType.value, Data.raw + + +def RegEnumValueA(hKey, dwIndex, bGetData=True): + return _internal_RegEnumValue(True, hKey, dwIndex, bGetData) + + +def RegEnumValueW(hKey, dwIndex, bGetData=True): + return _internal_RegEnumValue(False, hKey, dwIndex, bGetData) + + +RegEnumValue = DefaultStringType(RegEnumValueA, RegEnumValueW) + +# XXX TODO + +# LONG WINAPI RegSetKeyValue( +# __in HKEY hKey, +# __in_opt LPCTSTR lpSubKey, +# __in_opt LPCTSTR lpValueName, +# __in DWORD dwType, +# __in_opt LPCVOID lpData, +# __in DWORD cbData +# ); + +# XXX TODO + +# LONG WINAPI RegQueryMultipleValues( +# __in HKEY hKey, +# __out PVALENT val_list, +# __in DWORD num_vals, +# __out_opt LPTSTR lpValueBuf, +# __inout_opt LPDWORD ldwTotsize +# ); + +# XXX TODO + + +# LONG WINAPI RegDeleteValue( +# __in HKEY hKey, +# __in_opt LPCTSTR lpValueName +# ); +def RegDeleteValueA(hKeySrc, lpValueName=None): + _RegDeleteValueA = windll.advapi32.RegDeleteValueA + _RegDeleteValueA.argtypes = [HKEY, LPSTR] + _RegDeleteValueA.restype = LONG + _RegDeleteValueA.errcheck = RaiseIfNotErrorSuccess + _RegDeleteValueA(hKeySrc, lpValueName) + + +def RegDeleteValueW(hKeySrc, lpValueName=None): + _RegDeleteValueW = windll.advapi32.RegDeleteValueW + _RegDeleteValueW.argtypes = [HKEY, LPWSTR] + _RegDeleteValueW.restype = LONG + _RegDeleteValueW.errcheck = RaiseIfNotErrorSuccess + _RegDeleteValueW(hKeySrc, lpValueName) + + +RegDeleteValue = GuessStringType(RegDeleteValueA, RegDeleteValueW) + + +# LONG WINAPI RegDeleteKeyValue( +# __in HKEY hKey, +# __in_opt LPCTSTR lpSubKey, +# __in_opt LPCTSTR lpValueName +# ); +def RegDeleteKeyValueA(hKeySrc, lpSubKey=None, lpValueName=None): + _RegDeleteKeyValueA = windll.advapi32.RegDeleteKeyValueA + _RegDeleteKeyValueA.argtypes = [HKEY, LPSTR, LPSTR] + _RegDeleteKeyValueA.restype = LONG + _RegDeleteKeyValueA.errcheck = RaiseIfNotErrorSuccess + _RegDeleteKeyValueA(hKeySrc, lpSubKey, lpValueName) + + +def RegDeleteKeyValueW(hKeySrc, lpSubKey=None, lpValueName=None): + _RegDeleteKeyValueW = windll.advapi32.RegDeleteKeyValueW + _RegDeleteKeyValueW.argtypes = [HKEY, LPWSTR, LPWSTR] + _RegDeleteKeyValueW.restype = LONG + _RegDeleteKeyValueW.errcheck = RaiseIfNotErrorSuccess + _RegDeleteKeyValueW(hKeySrc, lpSubKey, lpValueName) + + +RegDeleteKeyValue = GuessStringType(RegDeleteKeyValueA, RegDeleteKeyValueW) + + +# LONG WINAPI RegDeleteKey( +# __in HKEY hKey, +# __in LPCTSTR lpSubKey +# ); +def RegDeleteKeyA(hKeySrc, lpSubKey=None): + _RegDeleteKeyA = windll.advapi32.RegDeleteKeyA + _RegDeleteKeyA.argtypes = [HKEY, LPSTR] + _RegDeleteKeyA.restype = LONG + _RegDeleteKeyA.errcheck = RaiseIfNotErrorSuccess + _RegDeleteKeyA(hKeySrc, lpSubKey) + + +def RegDeleteKeyW(hKeySrc, lpSubKey=None): + _RegDeleteKeyW = windll.advapi32.RegDeleteKeyW + _RegDeleteKeyW.argtypes = [HKEY, LPWSTR] + _RegDeleteKeyW.restype = LONG + _RegDeleteKeyW.errcheck = RaiseIfNotErrorSuccess + _RegDeleteKeyW(hKeySrc, lpSubKey) + + +RegDeleteKey = GuessStringType(RegDeleteKeyA, RegDeleteKeyW) + +# LONG WINAPI RegDeleteKeyEx( +# __in HKEY hKey, +# __in LPCTSTR lpSubKey, +# __in REGSAM samDesired, +# __reserved DWORD Reserved +# ); + + +def RegDeleteKeyExA(hKeySrc, lpSubKey=None, samDesired=KEY_WOW64_32KEY): + _RegDeleteKeyExA = windll.advapi32.RegDeleteKeyExA + _RegDeleteKeyExA.argtypes = [HKEY, LPSTR, REGSAM, DWORD] + _RegDeleteKeyExA.restype = LONG + _RegDeleteKeyExA.errcheck = RaiseIfNotErrorSuccess + _RegDeleteKeyExA(hKeySrc, lpSubKey, samDesired, 0) + + +def RegDeleteKeyExW(hKeySrc, lpSubKey=None, samDesired=KEY_WOW64_32KEY): + _RegDeleteKeyExW = windll.advapi32.RegDeleteKeyExW + _RegDeleteKeyExW.argtypes = [HKEY, LPWSTR, REGSAM, DWORD] + _RegDeleteKeyExW.restype = LONG + _RegDeleteKeyExW.errcheck = RaiseIfNotErrorSuccess + _RegDeleteKeyExW(hKeySrc, lpSubKey, samDesired, 0) + + +RegDeleteKeyEx = GuessStringType(RegDeleteKeyExA, RegDeleteKeyExW) + + +# LONG WINAPI RegCopyTree( +# __in HKEY hKeySrc, +# __in_opt LPCTSTR lpSubKey, +# __in HKEY hKeyDest +# ); +def RegCopyTreeA(hKeySrc, lpSubKey, hKeyDest): + _RegCopyTreeA = windll.advapi32.RegCopyTreeA + _RegCopyTreeA.argtypes = [HKEY, LPSTR, HKEY] + _RegCopyTreeA.restype = LONG + _RegCopyTreeA.errcheck = RaiseIfNotErrorSuccess + _RegCopyTreeA(hKeySrc, lpSubKey, hKeyDest) + + +def RegCopyTreeW(hKeySrc, lpSubKey, hKeyDest): + _RegCopyTreeW = windll.advapi32.RegCopyTreeW + _RegCopyTreeW.argtypes = [HKEY, LPWSTR, HKEY] + _RegCopyTreeW.restype = LONG + _RegCopyTreeW.errcheck = RaiseIfNotErrorSuccess + _RegCopyTreeW(hKeySrc, lpSubKey, hKeyDest) + + +RegCopyTree = GuessStringType(RegCopyTreeA, RegCopyTreeW) + + +# LONG WINAPI RegDeleteTree( +# __in HKEY hKey, +# __in_opt LPCTSTR lpSubKey +# ); +def RegDeleteTreeA(hKey, lpSubKey=None): + _RegDeleteTreeA = windll.advapi32.RegDeleteTreeA + _RegDeleteTreeA.argtypes = [HKEY, LPWSTR] + _RegDeleteTreeA.restype = LONG + _RegDeleteTreeA.errcheck = RaiseIfNotErrorSuccess + _RegDeleteTreeA(hKey, lpSubKey) + + +def RegDeleteTreeW(hKey, lpSubKey=None): + _RegDeleteTreeW = windll.advapi32.RegDeleteTreeW + _RegDeleteTreeW.argtypes = [HKEY, LPWSTR] + _RegDeleteTreeW.restype = LONG + _RegDeleteTreeW.errcheck = RaiseIfNotErrorSuccess + _RegDeleteTreeW(hKey, lpSubKey) + + +RegDeleteTree = GuessStringType(RegDeleteTreeA, RegDeleteTreeW) + + +# LONG WINAPI RegFlushKey( +# __in HKEY hKey +# ); +def RegFlushKey(hKey): + _RegFlushKey = windll.advapi32.RegFlushKey + _RegFlushKey.argtypes = [HKEY] + _RegFlushKey.restype = LONG + _RegFlushKey.errcheck = RaiseIfNotErrorSuccess + _RegFlushKey(hKey) + + +# LONG WINAPI RegLoadMUIString( +# _In_ HKEY hKey, +# _In_opt_ LPCTSTR pszValue, +# _Out_opt_ LPTSTR pszOutBuf, +# _In_ DWORD cbOutBuf, +# _Out_opt_ LPDWORD pcbData, +# _In_ DWORD Flags, +# _In_opt_ LPCTSTR pszDirectory +# ); + +# TO DO + +# ------------------------------------------------------------------------------ + + +# BOOL WINAPI CloseServiceHandle( +# _In_ SC_HANDLE hSCObject +# ); +def CloseServiceHandle(hSCObject): + _CloseServiceHandle = windll.advapi32.CloseServiceHandle + _CloseServiceHandle.argtypes = [SC_HANDLE] + _CloseServiceHandle.restype = bool + _CloseServiceHandle.errcheck = RaiseIfZero + + if isinstance(hSCObject, Handle): + # Prevents the handle from being closed without notifying the Handle object. + hSCObject.close() + else: + _CloseServiceHandle(hSCObject) + + +# SC_HANDLE WINAPI OpenSCManager( +# _In_opt_ LPCTSTR lpMachineName, +# _In_opt_ LPCTSTR lpDatabaseName, +# _In_ DWORD dwDesiredAccess +# ); +def OpenSCManagerA(lpMachineName=None, lpDatabaseName=None, dwDesiredAccess=SC_MANAGER_ALL_ACCESS): + _OpenSCManagerA = windll.advapi32.OpenSCManagerA + _OpenSCManagerA.argtypes = [LPSTR, LPSTR, DWORD] + _OpenSCManagerA.restype = SC_HANDLE + _OpenSCManagerA.errcheck = RaiseIfZero + + hSCObject = _OpenSCManagerA(lpMachineName, lpDatabaseName, dwDesiredAccess) + return ServiceControlManagerHandle(hSCObject) + + +def OpenSCManagerW(lpMachineName=None, lpDatabaseName=None, dwDesiredAccess=SC_MANAGER_ALL_ACCESS): + _OpenSCManagerW = windll.advapi32.OpenSCManagerW + _OpenSCManagerW.argtypes = [LPWSTR, LPWSTR, DWORD] + _OpenSCManagerW.restype = SC_HANDLE + _OpenSCManagerW.errcheck = RaiseIfZero + + hSCObject = _OpenSCManagerA(lpMachineName, lpDatabaseName, dwDesiredAccess) + return ServiceControlManagerHandle(hSCObject) + + +OpenSCManager = GuessStringType(OpenSCManagerA, OpenSCManagerW) + + +# SC_HANDLE WINAPI OpenService( +# _In_ SC_HANDLE hSCManager, +# _In_ LPCTSTR lpServiceName, +# _In_ DWORD dwDesiredAccess +# ); +def OpenServiceA(hSCManager, lpServiceName, dwDesiredAccess=SERVICE_ALL_ACCESS): + _OpenServiceA = windll.advapi32.OpenServiceA + _OpenServiceA.argtypes = [SC_HANDLE, LPSTR, DWORD] + _OpenServiceA.restype = SC_HANDLE + _OpenServiceA.errcheck = RaiseIfZero + return ServiceHandle(_OpenServiceA(hSCManager, lpServiceName, dwDesiredAccess)) + + +def OpenServiceW(hSCManager, lpServiceName, dwDesiredAccess=SERVICE_ALL_ACCESS): + _OpenServiceW = windll.advapi32.OpenServiceW + _OpenServiceW.argtypes = [SC_HANDLE, LPWSTR, DWORD] + _OpenServiceW.restype = SC_HANDLE + _OpenServiceW.errcheck = RaiseIfZero + return ServiceHandle(_OpenServiceW(hSCManager, lpServiceName, dwDesiredAccess)) + + +OpenService = GuessStringType(OpenServiceA, OpenServiceW) + + +# SC_HANDLE WINAPI CreateService( +# _In_ SC_HANDLE hSCManager, +# _In_ LPCTSTR lpServiceName, +# _In_opt_ LPCTSTR lpDisplayName, +# _In_ DWORD dwDesiredAccess, +# _In_ DWORD dwServiceType, +# _In_ DWORD dwStartType, +# _In_ DWORD dwErrorControl, +# _In_opt_ LPCTSTR lpBinaryPathName, +# _In_opt_ LPCTSTR lpLoadOrderGroup, +# _Out_opt_ LPDWORD lpdwTagId, +# _In_opt_ LPCTSTR lpDependencies, +# _In_opt_ LPCTSTR lpServiceStartName, +# _In_opt_ LPCTSTR lpPassword +# ); +def CreateServiceA( + hSCManager, + lpServiceName, + lpDisplayName=None, + dwDesiredAccess=SERVICE_ALL_ACCESS, + dwServiceType=SERVICE_WIN32_OWN_PROCESS, + dwStartType=SERVICE_DEMAND_START, + dwErrorControl=SERVICE_ERROR_NORMAL, + lpBinaryPathName=None, + lpLoadOrderGroup=None, + lpDependencies=None, + lpServiceStartName=None, + lpPassword=None, +): + _CreateServiceA = windll.advapi32.CreateServiceA + _CreateServiceA.argtypes = [SC_HANDLE, LPSTR, LPSTR, DWORD, DWORD, DWORD, DWORD, LPSTR, LPSTR, LPDWORD, LPSTR, LPSTR, LPSTR] + _CreateServiceA.restype = SC_HANDLE + _CreateServiceA.errcheck = RaiseIfZero + + dwTagId = DWORD(0) + hService = _CreateServiceA( + hSCManager, + lpServiceName, + dwDesiredAccess, + dwServiceType, + dwStartType, + dwErrorControl, + lpBinaryPathName, + lpLoadOrderGroup, + byref(dwTagId), + lpDependencies, + lpServiceStartName, + lpPassword, + ) + return ServiceHandle(hService), dwTagId.value + + +def CreateServiceW( + hSCManager, + lpServiceName, + lpDisplayName=None, + dwDesiredAccess=SERVICE_ALL_ACCESS, + dwServiceType=SERVICE_WIN32_OWN_PROCESS, + dwStartType=SERVICE_DEMAND_START, + dwErrorControl=SERVICE_ERROR_NORMAL, + lpBinaryPathName=None, + lpLoadOrderGroup=None, + lpDependencies=None, + lpServiceStartName=None, + lpPassword=None, +): + _CreateServiceW = windll.advapi32.CreateServiceW + _CreateServiceW.argtypes = [SC_HANDLE, LPWSTR, LPWSTR, DWORD, DWORD, DWORD, DWORD, LPWSTR, LPWSTR, LPDWORD, LPWSTR, LPWSTR, LPWSTR] + _CreateServiceW.restype = SC_HANDLE + _CreateServiceW.errcheck = RaiseIfZero + + dwTagId = DWORD(0) + hService = _CreateServiceW( + hSCManager, + lpServiceName, + dwDesiredAccess, + dwServiceType, + dwStartType, + dwErrorControl, + lpBinaryPathName, + lpLoadOrderGroup, + byref(dwTagId), + lpDependencies, + lpServiceStartName, + lpPassword, + ) + return ServiceHandle(hService), dwTagId.value + + +CreateService = GuessStringType(CreateServiceA, CreateServiceW) + + +# BOOL WINAPI DeleteService( +# _In_ SC_HANDLE hService +# ); +def DeleteService(hService): + _DeleteService = windll.advapi32.DeleteService + _DeleteService.argtypes = [SC_HANDLE] + _DeleteService.restype = bool + _DeleteService.errcheck = RaiseIfZero + _DeleteService(hService) + + +# BOOL WINAPI GetServiceKeyName( +# _In_ SC_HANDLE hSCManager, +# _In_ LPCTSTR lpDisplayName, +# _Out_opt_ LPTSTR lpServiceName, +# _Inout_ LPDWORD lpcchBuffer +# ); +def GetServiceKeyNameA(hSCManager, lpDisplayName): + _GetServiceKeyNameA = windll.advapi32.GetServiceKeyNameA + _GetServiceKeyNameA.argtypes = [SC_HANDLE, LPSTR, LPSTR, LPDWORD] + _GetServiceKeyNameA.restype = bool + + cchBuffer = DWORD(0) + _GetServiceKeyNameA(hSCManager, lpDisplayName, None, byref(cchBuffer)) + if cchBuffer.value == 0: + raise ctypes.WinError() + lpServiceName = ctypes.create_string_buffer(cchBuffer.value + 1) + cchBuffer.value = sizeof(lpServiceName) + success = _GetServiceKeyNameA(hSCManager, lpDisplayName, lpServiceName, byref(cchBuffer)) + if not success: + raise ctypes.WinError() + return lpServiceName.value + + +def GetServiceKeyNameW(hSCManager, lpDisplayName): + _GetServiceKeyNameW = windll.advapi32.GetServiceKeyNameW + _GetServiceKeyNameW.argtypes = [SC_HANDLE, LPWSTR, LPWSTR, LPDWORD] + _GetServiceKeyNameW.restype = bool + + cchBuffer = DWORD(0) + _GetServiceKeyNameW(hSCManager, lpDisplayName, None, byref(cchBuffer)) + if cchBuffer.value == 0: + raise ctypes.WinError() + lpServiceName = ctypes.create_unicode_buffer(cchBuffer.value + 2) + cchBuffer.value = sizeof(lpServiceName) + success = _GetServiceKeyNameW(hSCManager, lpDisplayName, lpServiceName, byref(cchBuffer)) + if not success: + raise ctypes.WinError() + return lpServiceName.value + + +GetServiceKeyName = GuessStringType(GetServiceKeyNameA, GetServiceKeyNameW) + + +# BOOL WINAPI GetServiceDisplayName( +# _In_ SC_HANDLE hSCManager, +# _In_ LPCTSTR lpServiceName, +# _Out_opt_ LPTSTR lpDisplayName, +# _Inout_ LPDWORD lpcchBuffer +# ); +def GetServiceDisplayNameA(hSCManager, lpServiceName): + _GetServiceDisplayNameA = windll.advapi32.GetServiceDisplayNameA + _GetServiceDisplayNameA.argtypes = [SC_HANDLE, LPSTR, LPSTR, LPDWORD] + _GetServiceDisplayNameA.restype = bool + + cchBuffer = DWORD(0) + _GetServiceDisplayNameA(hSCManager, lpServiceName, None, byref(cchBuffer)) + if cchBuffer.value == 0: + raise ctypes.WinError() + lpDisplayName = ctypes.create_string_buffer(cchBuffer.value + 1) + cchBuffer.value = sizeof(lpDisplayName) + success = _GetServiceDisplayNameA(hSCManager, lpServiceName, lpDisplayName, byref(cchBuffer)) + if not success: + raise ctypes.WinError() + return lpDisplayName.value + + +def GetServiceDisplayNameW(hSCManager, lpServiceName): + _GetServiceDisplayNameW = windll.advapi32.GetServiceDisplayNameW + _GetServiceDisplayNameW.argtypes = [SC_HANDLE, LPWSTR, LPWSTR, LPDWORD] + _GetServiceDisplayNameW.restype = bool + + cchBuffer = DWORD(0) + _GetServiceDisplayNameW(hSCManager, lpServiceName, None, byref(cchBuffer)) + if cchBuffer.value == 0: + raise ctypes.WinError() + lpDisplayName = ctypes.create_unicode_buffer(cchBuffer.value + 2) + cchBuffer.value = sizeof(lpDisplayName) + success = _GetServiceDisplayNameW(hSCManager, lpServiceName, lpDisplayName, byref(cchBuffer)) + if not success: + raise ctypes.WinError() + return lpDisplayName.value + + +GetServiceDisplayName = GuessStringType(GetServiceDisplayNameA, GetServiceDisplayNameW) + +# BOOL WINAPI QueryServiceConfig( +# _In_ SC_HANDLE hService, +# _Out_opt_ LPQUERY_SERVICE_CONFIG lpServiceConfig, +# _In_ DWORD cbBufSize, +# _Out_ LPDWORD pcbBytesNeeded +# ); + +# TO DO + +# BOOL WINAPI QueryServiceConfig2( +# _In_ SC_HANDLE hService, +# _In_ DWORD dwInfoLevel, +# _Out_opt_ LPBYTE lpBuffer, +# _In_ DWORD cbBufSize, +# _Out_ LPDWORD pcbBytesNeeded +# ); + +# TO DO + +# BOOL WINAPI ChangeServiceConfig( +# _In_ SC_HANDLE hService, +# _In_ DWORD dwServiceType, +# _In_ DWORD dwStartType, +# _In_ DWORD dwErrorControl, +# _In_opt_ LPCTSTR lpBinaryPathName, +# _In_opt_ LPCTSTR lpLoadOrderGroup, +# _Out_opt_ LPDWORD lpdwTagId, +# _In_opt_ LPCTSTR lpDependencies, +# _In_opt_ LPCTSTR lpServiceStartName, +# _In_opt_ LPCTSTR lpPassword, +# _In_opt_ LPCTSTR lpDisplayName +# ); + +# TO DO + +# BOOL WINAPI ChangeServiceConfig2( +# _In_ SC_HANDLE hService, +# _In_ DWORD dwInfoLevel, +# _In_opt_ LPVOID lpInfo +# ); + +# TO DO + + +# BOOL WINAPI StartService( +# _In_ SC_HANDLE hService, +# _In_ DWORD dwNumServiceArgs, +# _In_opt_ LPCTSTR *lpServiceArgVectors +# ); +def StartServiceA(hService, ServiceArgVectors=None): + _StartServiceA = windll.advapi32.StartServiceA + _StartServiceA.argtypes = [SC_HANDLE, DWORD, LPVOID] + _StartServiceA.restype = bool + _StartServiceA.errcheck = RaiseIfZero + + if ServiceArgVectors: + dwNumServiceArgs = len(ServiceArgVectors) + CServiceArgVectors = (LPSTR * dwNumServiceArgs)(*ServiceArgVectors) + lpServiceArgVectors = ctypes.pointer(CServiceArgVectors) + else: + dwNumServiceArgs = 0 + lpServiceArgVectors = None + _StartServiceA(hService, dwNumServiceArgs, lpServiceArgVectors) + + +def StartServiceW(hService, ServiceArgVectors=None): + _StartServiceW = windll.advapi32.StartServiceW + _StartServiceW.argtypes = [SC_HANDLE, DWORD, LPVOID] + _StartServiceW.restype = bool + _StartServiceW.errcheck = RaiseIfZero + + if ServiceArgVectors: + dwNumServiceArgs = len(ServiceArgVectors) + CServiceArgVectors = (LPWSTR * dwNumServiceArgs)(*ServiceArgVectors) + lpServiceArgVectors = ctypes.pointer(CServiceArgVectors) + else: + dwNumServiceArgs = 0 + lpServiceArgVectors = None + _StartServiceW(hService, dwNumServiceArgs, lpServiceArgVectors) + + +StartService = GuessStringType(StartServiceA, StartServiceW) + + +# BOOL WINAPI ControlService( +# _In_ SC_HANDLE hService, +# _In_ DWORD dwControl, +# _Out_ LPSERVICE_STATUS lpServiceStatus +# ); +def ControlService(hService, dwControl): + _ControlService = windll.advapi32.ControlService + _ControlService.argtypes = [SC_HANDLE, DWORD, LPSERVICE_STATUS] + _ControlService.restype = bool + _ControlService.errcheck = RaiseIfZero + + rawServiceStatus = SERVICE_STATUS() + _ControlService(hService, dwControl, byref(rawServiceStatus)) + return ServiceStatus(rawServiceStatus) + + +# BOOL WINAPI ControlServiceEx( +# _In_ SC_HANDLE hService, +# _In_ DWORD dwControl, +# _In_ DWORD dwInfoLevel, +# _Inout_ PVOID pControlParams +# ); + +# TO DO + +# DWORD WINAPI NotifyServiceStatusChange( +# _In_ SC_HANDLE hService, +# _In_ DWORD dwNotifyMask, +# _In_ PSERVICE_NOTIFY pNotifyBuffer +# ); + +# TO DO + + +# BOOL WINAPI QueryServiceStatus( +# _In_ SC_HANDLE hService, +# _Out_ LPSERVICE_STATUS lpServiceStatus +# ); +def QueryServiceStatus(hService): + _QueryServiceStatus = windll.advapi32.QueryServiceStatus + _QueryServiceStatus.argtypes = [SC_HANDLE, LPSERVICE_STATUS] + _QueryServiceStatus.restype = bool + _QueryServiceStatus.errcheck = RaiseIfZero + + rawServiceStatus = SERVICE_STATUS() + _QueryServiceStatus(hService, byref(rawServiceStatus)) + return ServiceStatus(rawServiceStatus) + + +# BOOL WINAPI QueryServiceStatusEx( +# _In_ SC_HANDLE hService, +# _In_ SC_STATUS_TYPE InfoLevel, +# _Out_opt_ LPBYTE lpBuffer, +# _In_ DWORD cbBufSize, +# _Out_ LPDWORD pcbBytesNeeded +# ); +def QueryServiceStatusEx(hService, InfoLevel=SC_STATUS_PROCESS_INFO): + if InfoLevel != SC_STATUS_PROCESS_INFO: + raise NotImplementedError() + + _QueryServiceStatusEx = windll.advapi32.QueryServiceStatusEx + _QueryServiceStatusEx.argtypes = [SC_HANDLE, SC_STATUS_TYPE, LPVOID, DWORD, LPDWORD] + _QueryServiceStatusEx.restype = bool + _QueryServiceStatusEx.errcheck = RaiseIfZero + + lpBuffer = SERVICE_STATUS_PROCESS() + cbBytesNeeded = DWORD(sizeof(lpBuffer)) + _QueryServiceStatusEx(hService, InfoLevel, byref(lpBuffer), sizeof(lpBuffer), byref(cbBytesNeeded)) + return ServiceStatusProcess(lpBuffer) + + +# BOOL WINAPI EnumServicesStatus( +# _In_ SC_HANDLE hSCManager, +# _In_ DWORD dwServiceType, +# _In_ DWORD dwServiceState, +# _Out_opt_ LPENUM_SERVICE_STATUS lpServices, +# _In_ DWORD cbBufSize, +# _Out_ LPDWORD pcbBytesNeeded, +# _Out_ LPDWORD lpServicesReturned, +# _Inout_opt_ LPDWORD lpResumeHandle +# ); +def EnumServicesStatusA(hSCManager, dwServiceType=SERVICE_DRIVER | SERVICE_WIN32, dwServiceState=SERVICE_STATE_ALL): + _EnumServicesStatusA = windll.advapi32.EnumServicesStatusA + _EnumServicesStatusA.argtypes = [SC_HANDLE, DWORD, DWORD, LPVOID, DWORD, LPDWORD, LPDWORD, LPDWORD] + _EnumServicesStatusA.restype = bool + + cbBytesNeeded = DWORD(0) + ServicesReturned = DWORD(0) + ResumeHandle = DWORD(0) + + _EnumServicesStatusA( + hSCManager, dwServiceType, dwServiceState, None, 0, byref(cbBytesNeeded), byref(ServicesReturned), byref(ResumeHandle) + ) + + Services = [] + success = False + while GetLastError() == ERROR_MORE_DATA: + if cbBytesNeeded.value < sizeof(ENUM_SERVICE_STATUSA): + break + ServicesBuffer = ctypes.create_string_buffer("", cbBytesNeeded.value) + success = _EnumServicesStatusA( + hSCManager, + dwServiceType, + dwServiceState, + byref(ServicesBuffer), + sizeof(ServicesBuffer), + byref(cbBytesNeeded), + byref(ServicesReturned), + byref(ResumeHandle), + ) + if sizeof(ServicesBuffer) < (sizeof(ENUM_SERVICE_STATUSA) * ServicesReturned.value): + raise ctypes.WinError() + lpServicesArray = ctypes.cast(ctypes.cast(ctypes.pointer(ServicesBuffer), ctypes.c_void_p), LPENUM_SERVICE_STATUSA) + for index in compat.xrange(0, ServicesReturned.value): + Services.append(ServiceStatusEntry(lpServicesArray[index])) + if success: + break + if not success: + raise ctypes.WinError() + + return Services + + +def EnumServicesStatusW(hSCManager, dwServiceType=SERVICE_DRIVER | SERVICE_WIN32, dwServiceState=SERVICE_STATE_ALL): + _EnumServicesStatusW = windll.advapi32.EnumServicesStatusW + _EnumServicesStatusW.argtypes = [SC_HANDLE, DWORD, DWORD, LPVOID, DWORD, LPDWORD, LPDWORD, LPDWORD] + _EnumServicesStatusW.restype = bool + + cbBytesNeeded = DWORD(0) + ServicesReturned = DWORD(0) + ResumeHandle = DWORD(0) + + _EnumServicesStatusW( + hSCManager, dwServiceType, dwServiceState, None, 0, byref(cbBytesNeeded), byref(ServicesReturned), byref(ResumeHandle) + ) + + Services = [] + success = False + while GetLastError() == ERROR_MORE_DATA: + if cbBytesNeeded.value < sizeof(ENUM_SERVICE_STATUSW): + break + ServicesBuffer = ctypes.create_string_buffer("", cbBytesNeeded.value) + success = _EnumServicesStatusW( + hSCManager, + dwServiceType, + dwServiceState, + byref(ServicesBuffer), + sizeof(ServicesBuffer), + byref(cbBytesNeeded), + byref(ServicesReturned), + byref(ResumeHandle), + ) + if sizeof(ServicesBuffer) < (sizeof(ENUM_SERVICE_STATUSW) * ServicesReturned.value): + raise ctypes.WinError() + lpServicesArray = ctypes.cast(ctypes.cast(ctypes.pointer(ServicesBuffer), ctypes.c_void_p), LPENUM_SERVICE_STATUSW) + for index in compat.xrange(0, ServicesReturned.value): + Services.append(ServiceStatusEntry(lpServicesArray[index])) + if success: + break + if not success: + raise ctypes.WinError() + + return Services + + +EnumServicesStatus = DefaultStringType(EnumServicesStatusA, EnumServicesStatusW) + + +# BOOL WINAPI EnumServicesStatusEx( +# _In_ SC_HANDLE hSCManager, +# _In_ SC_ENUM_TYPE InfoLevel, +# _In_ DWORD dwServiceType, +# _In_ DWORD dwServiceState, +# _Out_opt_ LPBYTE lpServices, +# _In_ DWORD cbBufSize, +# _Out_ LPDWORD pcbBytesNeeded, +# _Out_ LPDWORD lpServicesReturned, +# _Inout_opt_ LPDWORD lpResumeHandle, +# _In_opt_ LPCTSTR pszGroupName +# ); +def EnumServicesStatusExA( + hSCManager, + InfoLevel=SC_ENUM_PROCESS_INFO, + dwServiceType=SERVICE_DRIVER | SERVICE_WIN32, + dwServiceState=SERVICE_STATE_ALL, + pszGroupName=None, +): + if InfoLevel != SC_ENUM_PROCESS_INFO: + raise NotImplementedError() + + _EnumServicesStatusExA = windll.advapi32.EnumServicesStatusExA + _EnumServicesStatusExA.argtypes = [SC_HANDLE, SC_ENUM_TYPE, DWORD, DWORD, LPVOID, DWORD, LPDWORD, LPDWORD, LPDWORD, LPSTR] + _EnumServicesStatusExA.restype = bool + + cbBytesNeeded = DWORD(0) + ServicesReturned = DWORD(0) + ResumeHandle = DWORD(0) + + _EnumServicesStatusExA( + hSCManager, + InfoLevel, + dwServiceType, + dwServiceState, + None, + 0, + byref(cbBytesNeeded), + byref(ServicesReturned), + byref(ResumeHandle), + pszGroupName, + ) + + Services = [] + success = False + while GetLastError() == ERROR_MORE_DATA: + if cbBytesNeeded.value < sizeof(ENUM_SERVICE_STATUS_PROCESSA): + break + ServicesBuffer = ctypes.create_string_buffer("", cbBytesNeeded.value) + success = _EnumServicesStatusExA( + hSCManager, + InfoLevel, + dwServiceType, + dwServiceState, + byref(ServicesBuffer), + sizeof(ServicesBuffer), + byref(cbBytesNeeded), + byref(ServicesReturned), + byref(ResumeHandle), + pszGroupName, + ) + if sizeof(ServicesBuffer) < (sizeof(ENUM_SERVICE_STATUS_PROCESSA) * ServicesReturned.value): + raise ctypes.WinError() + lpServicesArray = ctypes.cast(ctypes.cast(ctypes.pointer(ServicesBuffer), ctypes.c_void_p), LPENUM_SERVICE_STATUS_PROCESSA) + for index in compat.xrange(0, ServicesReturned.value): + Services.append(ServiceStatusProcessEntry(lpServicesArray[index])) + if success: + break + if not success: + raise ctypes.WinError() + + return Services + + +def EnumServicesStatusExW( + hSCManager, + InfoLevel=SC_ENUM_PROCESS_INFO, + dwServiceType=SERVICE_DRIVER | SERVICE_WIN32, + dwServiceState=SERVICE_STATE_ALL, + pszGroupName=None, +): + _EnumServicesStatusExW = windll.advapi32.EnumServicesStatusExW + _EnumServicesStatusExW.argtypes = [SC_HANDLE, SC_ENUM_TYPE, DWORD, DWORD, LPVOID, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR] + _EnumServicesStatusExW.restype = bool + + if InfoLevel != SC_ENUM_PROCESS_INFO: + raise NotImplementedError() + + cbBytesNeeded = DWORD(0) + ServicesReturned = DWORD(0) + ResumeHandle = DWORD(0) + + _EnumServicesStatusExW( + hSCManager, + InfoLevel, + dwServiceType, + dwServiceState, + None, + 0, + byref(cbBytesNeeded), + byref(ServicesReturned), + byref(ResumeHandle), + pszGroupName, + ) + + Services = [] + success = False + while GetLastError() == ERROR_MORE_DATA: + if cbBytesNeeded.value < sizeof(ENUM_SERVICE_STATUS_PROCESSW): + break + ServicesBuffer = ctypes.create_string_buffer("", cbBytesNeeded.value) + success = _EnumServicesStatusExW( + hSCManager, + InfoLevel, + dwServiceType, + dwServiceState, + byref(ServicesBuffer), + sizeof(ServicesBuffer), + byref(cbBytesNeeded), + byref(ServicesReturned), + byref(ResumeHandle), + pszGroupName, + ) + if sizeof(ServicesBuffer) < (sizeof(ENUM_SERVICE_STATUS_PROCESSW) * ServicesReturned.value): + raise ctypes.WinError() + lpServicesArray = ctypes.cast(ctypes.cast(ctypes.pointer(ServicesBuffer), ctypes.c_void_p), LPENUM_SERVICE_STATUS_PROCESSW) + for index in compat.xrange(0, ServicesReturned.value): + Services.append(ServiceStatusProcessEntry(lpServicesArray[index])) + if success: + break + if not success: + raise ctypes.WinError() + + return Services + + +EnumServicesStatusEx = DefaultStringType(EnumServicesStatusExA, EnumServicesStatusExW) + +# BOOL WINAPI EnumDependentServices( +# _In_ SC_HANDLE hService, +# _In_ DWORD dwServiceState, +# _Out_opt_ LPENUM_SERVICE_STATUS lpServices, +# _In_ DWORD cbBufSize, +# _Out_ LPDWORD pcbBytesNeeded, +# _Out_ LPDWORD lpServicesReturned +# ); + +# TO DO + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_amd64.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_amd64.py new file mode 100644 index 0000000..cc1e59a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_amd64.py @@ -0,0 +1,816 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +CONTEXT structure for amd64. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.version import ARCH_AMD64 +from winappdbg.win32 import context_i386 + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- CONTEXT structures and constants ----------------------------------------- + +# The following values specify the type of access in the first parameter +# of the exception record when the exception code specifies an access +# violation. +EXCEPTION_READ_FAULT = 0 # exception caused by a read +EXCEPTION_WRITE_FAULT = 1 # exception caused by a write +EXCEPTION_EXECUTE_FAULT = 8 # exception caused by an instruction fetch + +CONTEXT_AMD64 = 0x00100000 + +CONTEXT_CONTROL = CONTEXT_AMD64 | long(0x1) +CONTEXT_INTEGER = CONTEXT_AMD64 | long(0x2) +CONTEXT_SEGMENTS = CONTEXT_AMD64 | long(0x4) +CONTEXT_FLOATING_POINT = CONTEXT_AMD64 | long(0x8) +CONTEXT_DEBUG_REGISTERS = CONTEXT_AMD64 | long(0x10) + +CONTEXT_MMX_REGISTERS = CONTEXT_FLOATING_POINT + +CONTEXT_FULL = CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT + +CONTEXT_ALL = CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS + +CONTEXT_EXCEPTION_ACTIVE = 0x8000000 +CONTEXT_SERVICE_ACTIVE = 0x10000000 +CONTEXT_EXCEPTION_REQUEST = 0x40000000 +CONTEXT_EXCEPTION_REPORTING = 0x80000000 + +INITIAL_MXCSR = 0x1F80 # initial MXCSR value +INITIAL_FPCSR = 0x027F # initial FPCSR value + + +# typedef struct _XMM_SAVE_AREA32 { +# WORD ControlWord; +# WORD StatusWord; +# BYTE TagWord; +# BYTE Reserved1; +# WORD ErrorOpcode; +# DWORD ErrorOffset; +# WORD ErrorSelector; +# WORD Reserved2; +# DWORD DataOffset; +# WORD DataSelector; +# WORD Reserved3; +# DWORD MxCsr; +# DWORD MxCsr_Mask; +# M128A FloatRegisters[8]; +# M128A XmmRegisters[16]; +# BYTE Reserved4[96]; +# } XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; +class XMM_SAVE_AREA32(Structure): + _pack_ = 1 + _fields_ = [ + ("ControlWord", WORD), + ("StatusWord", WORD), + ("TagWord", BYTE), + ("Reserved1", BYTE), + ("ErrorOpcode", WORD), + ("ErrorOffset", DWORD), + ("ErrorSelector", WORD), + ("Reserved2", WORD), + ("DataOffset", DWORD), + ("DataSelector", WORD), + ("Reserved3", WORD), + ("MxCsr", DWORD), + ("MxCsr_Mask", DWORD), + ("FloatRegisters", M128A * 8), + ("XmmRegisters", M128A * 16), + ("Reserved4", BYTE * 96), + ] + + def from_dict(self): + raise NotImplementedError() + + def to_dict(self): + d = dict() + for name, type in self._fields_: + if name in ("FloatRegisters", "XmmRegisters"): + d[name] = tuple([(x.LowPart + (x.HighPart << 64)) for x in getattr(self, name)]) + elif name == "Reserved4": + d[name] = tuple([chr(x) for x in getattr(self, name)]) + else: + d[name] = getattr(self, name) + return d + + +LEGACY_SAVE_AREA_LENGTH = sizeof(XMM_SAVE_AREA32) + +PXMM_SAVE_AREA32 = ctypes.POINTER(XMM_SAVE_AREA32) +LPXMM_SAVE_AREA32 = PXMM_SAVE_AREA32 + +# // +# // Context Frame +# // +# // This frame has a several purposes: 1) it is used as an argument to +# // NtContinue, 2) is is used to constuct a call frame for APC delivery, +# // and 3) it is used in the user level thread creation routines. +# // +# // +# // The flags field within this record controls the contents of a CONTEXT +# // record. +# // +# // If the context record is used as an input parameter, then for each +# // portion of the context record controlled by a flag whose value is +# // set, it is assumed that that portion of the context record contains +# // valid context. If the context record is being used to modify a threads +# // context, then only that portion of the threads context is modified. +# // +# // If the context record is used as an output parameter to capture the +# // context of a thread, then only those portions of the thread's context +# // corresponding to set flags will be returned. +# // +# // CONTEXT_CONTROL specifies SegSs, Rsp, SegCs, Rip, and EFlags. +# // +# // CONTEXT_INTEGER specifies Rax, Rcx, Rdx, Rbx, Rbp, Rsi, Rdi, and R8-R15. +# // +# // CONTEXT_SEGMENTS specifies SegDs, SegEs, SegFs, and SegGs. +# // +# // CONTEXT_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7. +# // +# // CONTEXT_MMX_REGISTERS specifies the floating point and extended registers +# // Mm0/St0-Mm7/St7 and Xmm0-Xmm15). +# // +# +# typedef struct DECLSPEC_ALIGN(16) _CONTEXT { +# +# // +# // Register parameter home addresses. +# // +# // N.B. These fields are for convience - they could be used to extend the +# // context record in the future. +# // +# +# DWORD64 P1Home; +# DWORD64 P2Home; +# DWORD64 P3Home; +# DWORD64 P4Home; +# DWORD64 P5Home; +# DWORD64 P6Home; +# +# // +# // Control flags. +# // +# +# DWORD ContextFlags; +# DWORD MxCsr; +# +# // +# // Segment Registers and processor flags. +# // +# +# WORD SegCs; +# WORD SegDs; +# WORD SegEs; +# WORD SegFs; +# WORD SegGs; +# WORD SegSs; +# DWORD EFlags; +# +# // +# // Debug registers +# // +# +# DWORD64 Dr0; +# DWORD64 Dr1; +# DWORD64 Dr2; +# DWORD64 Dr3; +# DWORD64 Dr6; +# DWORD64 Dr7; +# +# // +# // Integer registers. +# // +# +# DWORD64 Rax; +# DWORD64 Rcx; +# DWORD64 Rdx; +# DWORD64 Rbx; +# DWORD64 Rsp; +# DWORD64 Rbp; +# DWORD64 Rsi; +# DWORD64 Rdi; +# DWORD64 R8; +# DWORD64 R9; +# DWORD64 R10; +# DWORD64 R11; +# DWORD64 R12; +# DWORD64 R13; +# DWORD64 R14; +# DWORD64 R15; +# +# // +# // Program counter. +# // +# +# DWORD64 Rip; +# +# // +# // Floating point state. +# // +# +# union { +# XMM_SAVE_AREA32 FltSave; +# struct { +# M128A Header[2]; +# M128A Legacy[8]; +# M128A Xmm0; +# M128A Xmm1; +# M128A Xmm2; +# M128A Xmm3; +# M128A Xmm4; +# M128A Xmm5; +# M128A Xmm6; +# M128A Xmm7; +# M128A Xmm8; +# M128A Xmm9; +# M128A Xmm10; +# M128A Xmm11; +# M128A Xmm12; +# M128A Xmm13; +# M128A Xmm14; +# M128A Xmm15; +# }; +# }; +# +# // +# // Vector registers. +# // +# +# M128A VectorRegister[26]; +# DWORD64 VectorControl; +# +# // +# // Special debug control registers. +# // +# +# DWORD64 DebugControl; +# DWORD64 LastBranchToRip; +# DWORD64 LastBranchFromRip; +# DWORD64 LastExceptionToRip; +# DWORD64 LastExceptionFromRip; +# } CONTEXT, *PCONTEXT; + + +class _CONTEXT_FLTSAVE_STRUCT(Structure): + _fields_ = [ + ("Header", M128A * 2), + ("Legacy", M128A * 8), + ("Xmm0", M128A), + ("Xmm1", M128A), + ("Xmm2", M128A), + ("Xmm3", M128A), + ("Xmm4", M128A), + ("Xmm5", M128A), + ("Xmm6", M128A), + ("Xmm7", M128A), + ("Xmm8", M128A), + ("Xmm9", M128A), + ("Xmm10", M128A), + ("Xmm11", M128A), + ("Xmm12", M128A), + ("Xmm13", M128A), + ("Xmm14", M128A), + ("Xmm15", M128A), + ] + + def from_dict(self): + raise NotImplementedError() + + def to_dict(self): + d = dict() + for name, type in self._fields_: + if name in ("Header", "Legacy"): + d[name] = tuple([(x.Low + (x.High << 64)) for x in getattr(self, name)]) + else: + x = getattr(self, name) + d[name] = x.Low + (x.High << 64) + return d + + +class _CONTEXT_FLTSAVE_UNION(Union): + _fields_ = [ + ("flt", XMM_SAVE_AREA32), + ("xmm", _CONTEXT_FLTSAVE_STRUCT), + ] + + def from_dict(self): + raise NotImplementedError() + + def to_dict(self): + d = dict() + d["flt"] = self.flt.to_dict() + d["xmm"] = self.xmm.to_dict() + return d + + +class CONTEXT(Structure): + arch = ARCH_AMD64 + + _pack_ = 16 + _fields_ = [ + # Register parameter home addresses. + ("P1Home", DWORD64), + ("P2Home", DWORD64), + ("P3Home", DWORD64), + ("P4Home", DWORD64), + ("P5Home", DWORD64), + ("P6Home", DWORD64), + # Control flags. + ("ContextFlags", DWORD), + ("MxCsr", DWORD), + # Segment Registers and processor flags. + ("SegCs", WORD), + ("SegDs", WORD), + ("SegEs", WORD), + ("SegFs", WORD), + ("SegGs", WORD), + ("SegSs", WORD), + ("EFlags", DWORD), + # Debug registers. + ("Dr0", DWORD64), + ("Dr1", DWORD64), + ("Dr2", DWORD64), + ("Dr3", DWORD64), + ("Dr6", DWORD64), + ("Dr7", DWORD64), + # Integer registers. + ("Rax", DWORD64), + ("Rcx", DWORD64), + ("Rdx", DWORD64), + ("Rbx", DWORD64), + ("Rsp", DWORD64), + ("Rbp", DWORD64), + ("Rsi", DWORD64), + ("Rdi", DWORD64), + ("R8", DWORD64), + ("R9", DWORD64), + ("R10", DWORD64), + ("R11", DWORD64), + ("R12", DWORD64), + ("R13", DWORD64), + ("R14", DWORD64), + ("R15", DWORD64), + # Program counter. + ("Rip", DWORD64), + # Floating point state. + ("FltSave", _CONTEXT_FLTSAVE_UNION), + # Vector registers. + ("VectorRegister", M128A * 26), + ("VectorControl", DWORD64), + # Special debug control registers. + ("DebugControl", DWORD64), + ("LastBranchToRip", DWORD64), + ("LastBranchFromRip", DWORD64), + ("LastExceptionToRip", DWORD64), + ("LastExceptionFromRip", DWORD64), + ] + + _others = ("P1Home", "P2Home", "P3Home", "P4Home", "P5Home", "P6Home", "MxCsr", "VectorRegister", "VectorControl") + _control = ("SegSs", "Rsp", "SegCs", "Rip", "EFlags") + _integer = ("Rax", "Rcx", "Rdx", "Rbx", "Rsp", "Rbp", "Rsi", "Rdi", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15") + _segments = ("SegDs", "SegEs", "SegFs", "SegGs") + _debug = ( + "Dr0", + "Dr1", + "Dr2", + "Dr3", + "Dr6", + "Dr7", + "DebugControl", + "LastBranchToRip", + "LastBranchFromRip", + "LastExceptionToRip", + "LastExceptionFromRip", + ) + _mmx = ( + "Xmm0", + "Xmm1", + "Xmm2", + "Xmm3", + "Xmm4", + "Xmm5", + "Xmm6", + "Xmm7", + "Xmm8", + "Xmm9", + "Xmm10", + "Xmm11", + "Xmm12", + "Xmm13", + "Xmm14", + "Xmm15", + ) + + # XXX TODO + # Convert VectorRegister and Xmm0-Xmm15 to pure Python types! + + @classmethod + def from_dict(cls, ctx): + "Instance a new structure from a Python native type." + ctx = Context(ctx) + s = cls() + ContextFlags = ctx["ContextFlags"] + s.ContextFlags = ContextFlags + for key in cls._others: + if key != "VectorRegister": + setattr(s, key, ctx[key]) + else: + w = ctx[key] + v = (M128A * len(w))() + i = 0 + for x in w: + y = M128A() + y.High = x >> 64 + y.Low = x - (x >> 64) + v[i] = y + i += 1 + setattr(s, key, v) + if (ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL: + for key in cls._control: + setattr(s, key, ctx[key]) + if (ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER: + for key in cls._integer: + setattr(s, key, ctx[key]) + if (ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS: + for key in cls._segments: + setattr(s, key, ctx[key]) + if (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS: + for key in cls._debug: + setattr(s, key, ctx[key]) + if (ContextFlags & CONTEXT_MMX_REGISTERS) == CONTEXT_MMX_REGISTERS: + xmm = s.FltSave.xmm + for key in cls._mmx: + y = M128A() + y.High = x >> 64 + y.Low = x - (x >> 64) + setattr(xmm, key, y) + return s + + def to_dict(self): + "Convert a structure into a Python dictionary." + ctx = Context() + ContextFlags = self.ContextFlags + ctx["ContextFlags"] = ContextFlags + for key in self._others: + if key != "VectorRegister": + ctx[key] = getattr(self, key) + else: + ctx[key] = tuple([(x.Low + (x.High << 64)) for x in getattr(self, key)]) + if (ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL: + for key in self._control: + ctx[key] = getattr(self, key) + if (ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER: + for key in self._integer: + ctx[key] = getattr(self, key) + if (ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS: + for key in self._segments: + ctx[key] = getattr(self, key) + if (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS: + for key in self._debug: + ctx[key] = getattr(self, key) + if (ContextFlags & CONTEXT_MMX_REGISTERS) == CONTEXT_MMX_REGISTERS: + xmm = self.FltSave.xmm.to_dict() + for key in self._mmx: + ctx[key] = xmm.get(key) + return ctx + + +PCONTEXT = ctypes.POINTER(CONTEXT) +LPCONTEXT = PCONTEXT + + +class Context(dict): + """ + Register context dictionary for the amd64 architecture. + """ + + arch = CONTEXT.arch + + def __get_pc(self): + return self["Rip"] + + def __set_pc(self, value): + self["Rip"] = value + + pc = property(__get_pc, __set_pc) + + def __get_sp(self): + return self["Rsp"] + + def __set_sp(self, value): + self["Rsp"] = value + + sp = property(__get_sp, __set_sp) + + def __get_fp(self): + return self["Rbp"] + + def __set_fp(self, value): + self["Rbp"] = value + + fp = property(__get_fp, __set_fp) + + +# --- LDT_ENTRY structure ------------------------------------------------------ + +# typedef struct _LDT_ENTRY { +# WORD LimitLow; +# WORD BaseLow; +# union { +# struct { +# BYTE BaseMid; +# BYTE Flags1; +# BYTE Flags2; +# BYTE BaseHi; +# } Bytes; +# struct { +# DWORD BaseMid :8; +# DWORD Type :5; +# DWORD Dpl :2; +# DWORD Pres :1; +# DWORD LimitHi :4; +# DWORD Sys :1; +# DWORD Reserved_0 :1; +# DWORD Default_Big :1; +# DWORD Granularity :1; +# DWORD BaseHi :8; +# } Bits; +# } HighWord; +# } LDT_ENTRY, +# *PLDT_ENTRY; + + +class _LDT_ENTRY_BYTES_(Structure): + _pack_ = 1 + _fields_ = [ + ("BaseMid", BYTE), + ("Flags1", BYTE), + ("Flags2", BYTE), + ("BaseHi", BYTE), + ] + + +class _LDT_ENTRY_BITS_(Structure): + _pack_ = 1 + _fields_ = [ + ("BaseMid", DWORD, 8), + ("Type", DWORD, 5), + ("Dpl", DWORD, 2), + ("Pres", DWORD, 1), + ("LimitHi", DWORD, 4), + ("Sys", DWORD, 1), + ("Reserved_0", DWORD, 1), + ("Default_Big", DWORD, 1), + ("Granularity", DWORD, 1), + ("BaseHi", DWORD, 8), + ] + + +class _LDT_ENTRY_HIGHWORD_(Union): + _pack_ = 1 + _fields_ = [ + ("Bytes", _LDT_ENTRY_BYTES_), + ("Bits", _LDT_ENTRY_BITS_), + ] + + +class LDT_ENTRY(Structure): + _pack_ = 1 + _fields_ = [ + ("LimitLow", WORD), + ("BaseLow", WORD), + ("HighWord", _LDT_ENTRY_HIGHWORD_), + ] + + +PLDT_ENTRY = POINTER(LDT_ENTRY) +LPLDT_ENTRY = PLDT_ENTRY + +# --- WOW64 CONTEXT structure and constants ------------------------------------ + +# Value of SegCs in a Wow64 thread when running in 32 bits mode +WOW64_CS32 = 0x23 + +WOW64_CONTEXT_i386 = long(0x00010000) +WOW64_CONTEXT_i486 = long(0x00010000) + +WOW64_CONTEXT_CONTROL = WOW64_CONTEXT_i386 | long(0x00000001) +WOW64_CONTEXT_INTEGER = WOW64_CONTEXT_i386 | long(0x00000002) +WOW64_CONTEXT_SEGMENTS = WOW64_CONTEXT_i386 | long(0x00000004) +WOW64_CONTEXT_FLOATING_POINT = WOW64_CONTEXT_i386 | long(0x00000008) +WOW64_CONTEXT_DEBUG_REGISTERS = WOW64_CONTEXT_i386 | long(0x00000010) +WOW64_CONTEXT_EXTENDED_REGISTERS = WOW64_CONTEXT_i386 | long(0x00000020) + +WOW64_CONTEXT_FULL = WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS +WOW64_CONTEXT_ALL = ( + WOW64_CONTEXT_CONTROL + | WOW64_CONTEXT_INTEGER + | WOW64_CONTEXT_SEGMENTS + | WOW64_CONTEXT_FLOATING_POINT + | WOW64_CONTEXT_DEBUG_REGISTERS + | WOW64_CONTEXT_EXTENDED_REGISTERS +) + +WOW64_SIZE_OF_80387_REGISTERS = 80 +WOW64_MAXIMUM_SUPPORTED_EXTENSION = 512 + + +class WOW64_FLOATING_SAVE_AREA(context_i386.FLOATING_SAVE_AREA): + pass + + +class WOW64_CONTEXT(context_i386.CONTEXT): + pass + + +class WOW64_LDT_ENTRY(context_i386.LDT_ENTRY): + pass + + +PWOW64_FLOATING_SAVE_AREA = POINTER(WOW64_FLOATING_SAVE_AREA) +PWOW64_CONTEXT = POINTER(WOW64_CONTEXT) +PWOW64_LDT_ENTRY = POINTER(WOW64_LDT_ENTRY) + +############################################################################### + + +# BOOL WINAPI GetThreadSelectorEntry( +# __in HANDLE hThread, +# __in DWORD dwSelector, +# __out LPLDT_ENTRY lpSelectorEntry +# ); +def GetThreadSelectorEntry(hThread, dwSelector): + _GetThreadSelectorEntry = windll.kernel32.GetThreadSelectorEntry + _GetThreadSelectorEntry.argtypes = [HANDLE, DWORD, LPLDT_ENTRY] + _GetThreadSelectorEntry.restype = bool + _GetThreadSelectorEntry.errcheck = RaiseIfZero + + ldt = LDT_ENTRY() + _GetThreadSelectorEntry(hThread, dwSelector, byref(ldt)) + return ldt + + +# BOOL WINAPI GetThreadContext( +# __in HANDLE hThread, +# __inout LPCONTEXT lpContext +# ); +def GetThreadContext(hThread, ContextFlags=None, raw=False): + _GetThreadContext = windll.kernel32.GetThreadContext + _GetThreadContext.argtypes = [HANDLE, LPCONTEXT] + _GetThreadContext.restype = bool + _GetThreadContext.errcheck = RaiseIfZero + + if ContextFlags is None: + ContextFlags = CONTEXT_ALL | CONTEXT_AMD64 + Context = CONTEXT() + Context.ContextFlags = ContextFlags + _GetThreadContext(hThread, byref(Context)) + if raw: + return Context + return Context.to_dict() + + +# BOOL WINAPI SetThreadContext( +# __in HANDLE hThread, +# __in const CONTEXT* lpContext +# ); +def SetThreadContext(hThread, lpContext): + _SetThreadContext = windll.kernel32.SetThreadContext + _SetThreadContext.argtypes = [HANDLE, LPCONTEXT] + _SetThreadContext.restype = bool + _SetThreadContext.errcheck = RaiseIfZero + + if isinstance(lpContext, dict): + lpContext = CONTEXT.from_dict(lpContext) + _SetThreadContext(hThread, byref(lpContext)) + + +# BOOL Wow64GetThreadSelectorEntry( +# __in HANDLE hThread, +# __in DWORD dwSelector, +# __out PWOW64_LDT_ENTRY lpSelectorEntry +# ); +def Wow64GetThreadSelectorEntry(hThread, dwSelector): + _Wow64GetThreadSelectorEntry = windll.kernel32.Wow64GetThreadSelectorEntry + _Wow64GetThreadSelectorEntry.argtypes = [HANDLE, DWORD, PWOW64_LDT_ENTRY] + _Wow64GetThreadSelectorEntry.restype = bool + _Wow64GetThreadSelectorEntry.errcheck = RaiseIfZero + + lpSelectorEntry = WOW64_LDT_ENTRY() + _Wow64GetThreadSelectorEntry(hThread, dwSelector, byref(lpSelectorEntry)) + return lpSelectorEntry + + +# DWORD WINAPI Wow64ResumeThread( +# __in HANDLE hThread +# ); +def Wow64ResumeThread(hThread): + _Wow64ResumeThread = windll.kernel32.Wow64ResumeThread + _Wow64ResumeThread.argtypes = [HANDLE] + _Wow64ResumeThread.restype = DWORD + + previousCount = _Wow64ResumeThread(hThread) + if previousCount == DWORD(-1).value: + raise ctypes.WinError() + return previousCount + + +# DWORD WINAPI Wow64SuspendThread( +# __in HANDLE hThread +# ); +def Wow64SuspendThread(hThread): + _Wow64SuspendThread = windll.kernel32.Wow64SuspendThread + _Wow64SuspendThread.argtypes = [HANDLE] + _Wow64SuspendThread.restype = DWORD + + previousCount = _Wow64SuspendThread(hThread) + if previousCount == DWORD(-1).value: + raise ctypes.WinError() + return previousCount + + +# XXX TODO Use this http://www.nynaeve.net/Code/GetThreadWow64Context.cpp +# Also see http://www.woodmann.com/forum/archive/index.php/t-11162.html + + +# BOOL WINAPI Wow64GetThreadContext( +# __in HANDLE hThread, +# __inout PWOW64_CONTEXT lpContext +# ); +def Wow64GetThreadContext(hThread, ContextFlags=None): + _Wow64GetThreadContext = windll.kernel32.Wow64GetThreadContext + _Wow64GetThreadContext.argtypes = [HANDLE, PWOW64_CONTEXT] + _Wow64GetThreadContext.restype = bool + _Wow64GetThreadContext.errcheck = RaiseIfZero + + # XXX doesn't exist in XP 64 bits + + Context = WOW64_CONTEXT() + if ContextFlags is None: + Context.ContextFlags = WOW64_CONTEXT_ALL | WOW64_CONTEXT_i386 + else: + Context.ContextFlags = ContextFlags + _Wow64GetThreadContext(hThread, byref(Context)) + return Context.to_dict() + + +# BOOL WINAPI Wow64SetThreadContext( +# __in HANDLE hThread, +# __in const WOW64_CONTEXT *lpContext +# ); +def Wow64SetThreadContext(hThread, lpContext): + _Wow64SetThreadContext = windll.kernel32.Wow64SetThreadContext + _Wow64SetThreadContext.argtypes = [HANDLE, PWOW64_CONTEXT] + _Wow64SetThreadContext.restype = bool + _Wow64SetThreadContext.errcheck = RaiseIfZero + + # XXX doesn't exist in XP 64 bits + + if isinstance(lpContext, dict): + lpContext = WOW64_CONTEXT.from_dict(lpContext) + _Wow64SetThreadContext(hThread, byref(lpContext)) + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_i386.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_i386.py new file mode 100644 index 0000000..fa24b3b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_i386.py @@ -0,0 +1,461 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +CONTEXT structure for i386. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.version import ARCH_I386 + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- CONTEXT structures and constants ----------------------------------------- + +# The following values specify the type of access in the first parameter +# of the exception record when the exception code specifies an access +# violation. +EXCEPTION_READ_FAULT = 0 # exception caused by a read +EXCEPTION_WRITE_FAULT = 1 # exception caused by a write +EXCEPTION_EXECUTE_FAULT = 8 # exception caused by an instruction fetch + +CONTEXT_i386 = 0x00010000 # this assumes that i386 and +CONTEXT_i486 = 0x00010000 # i486 have identical context records + +CONTEXT_CONTROL = CONTEXT_i386 | long(0x00000001) # SS:SP, CS:IP, FLAGS, BP +CONTEXT_INTEGER = CONTEXT_i386 | long(0x00000002) # AX, BX, CX, DX, SI, DI +CONTEXT_SEGMENTS = CONTEXT_i386 | long(0x00000004) # DS, ES, FS, GS +CONTEXT_FLOATING_POINT = CONTEXT_i386 | long(0x00000008) # 387 state +CONTEXT_DEBUG_REGISTERS = CONTEXT_i386 | long(0x00000010) # DB 0-3,6,7 +CONTEXT_EXTENDED_REGISTERS = CONTEXT_i386 | long(0x00000020) # cpu specific extensions + +CONTEXT_FULL = CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS + +CONTEXT_ALL = ( + CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS +) + +SIZE_OF_80387_REGISTERS = 80 +MAXIMUM_SUPPORTED_EXTENSION = 512 + + +# typedef struct _FLOATING_SAVE_AREA { +# DWORD ControlWord; +# DWORD StatusWord; +# DWORD TagWord; +# DWORD ErrorOffset; +# DWORD ErrorSelector; +# DWORD DataOffset; +# DWORD DataSelector; +# BYTE RegisterArea[SIZE_OF_80387_REGISTERS]; +# DWORD Cr0NpxState; +# } FLOATING_SAVE_AREA; +class FLOATING_SAVE_AREA(Structure): + _pack_ = 1 + _fields_ = [ + ("ControlWord", DWORD), + ("StatusWord", DWORD), + ("TagWord", DWORD), + ("ErrorOffset", DWORD), + ("ErrorSelector", DWORD), + ("DataOffset", DWORD), + ("DataSelector", DWORD), + ("RegisterArea", BYTE * SIZE_OF_80387_REGISTERS), + ("Cr0NpxState", DWORD), + ] + + _integer_members = ("ControlWord", "StatusWord", "TagWord", "ErrorOffset", "ErrorSelector", "DataOffset", "DataSelector", "Cr0NpxState") + + @classmethod + def from_dict(cls, fsa): + "Instance a new structure from a Python dictionary." + fsa = dict(fsa) + s = cls() + for key in cls._integer_members: + setattr(s, key, fsa.get(key)) + ra = fsa.get("RegisterArea", None) + if ra is not None: + for index in compat.xrange(0, SIZE_OF_80387_REGISTERS): + s.RegisterArea[index] = ra[index] + return s + + def to_dict(self): + "Convert a structure into a Python dictionary." + fsa = dict() + for key in self._integer_members: + fsa[key] = getattr(self, key) + ra = [self.RegisterArea[index] for index in compat.xrange(0, SIZE_OF_80387_REGISTERS)] + ra = tuple(ra) + fsa["RegisterArea"] = ra + return fsa + + +PFLOATING_SAVE_AREA = POINTER(FLOATING_SAVE_AREA) +LPFLOATING_SAVE_AREA = PFLOATING_SAVE_AREA + + +# typedef struct _CONTEXT { +# DWORD ContextFlags; +# DWORD Dr0; +# DWORD Dr1; +# DWORD Dr2; +# DWORD Dr3; +# DWORD Dr6; +# DWORD Dr7; +# FLOATING_SAVE_AREA FloatSave; +# DWORD SegGs; +# DWORD SegFs; +# DWORD SegEs; +# DWORD SegDs; +# DWORD Edi; +# DWORD Esi; +# DWORD Ebx; +# DWORD Edx; +# DWORD Ecx; +# DWORD Eax; +# DWORD Ebp; +# DWORD Eip; +# DWORD SegCs; +# DWORD EFlags; +# DWORD Esp; +# DWORD SegSs; +# BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; +# } CONTEXT; +class CONTEXT(Structure): + arch = ARCH_I386 + + _pack_ = 1 + + # Context Frame + # + # This frame has a several purposes: 1) it is used as an argument to + # NtContinue, 2) is is used to constuct a call frame for APC delivery, + # and 3) it is used in the user level thread creation routines. + # + # The layout of the record conforms to a standard call frame. + + _fields_ = [ + # The flags values within this flag control the contents of + # a CONTEXT record. + # + # If the context record is used as an input parameter, then + # for each portion of the context record controlled by a flag + # whose value is set, it is assumed that that portion of the + # context record contains valid context. If the context record + # is being used to modify a threads context, then only that + # portion of the threads context will be modified. + # + # If the context record is used as an IN OUT parameter to capture + # the context of a thread, then only those portions of the thread's + # context corresponding to set flags will be returned. + # + # The context record is never used as an OUT only parameter. + ("ContextFlags", DWORD), + # This section is specified/returned if CONTEXT_DEBUG_REGISTERS is + # set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT + # included in CONTEXT_FULL. + ("Dr0", DWORD), + ("Dr1", DWORD), + ("Dr2", DWORD), + ("Dr3", DWORD), + ("Dr6", DWORD), + ("Dr7", DWORD), + # This section is specified/returned if the + # ContextFlags word contains the flag CONTEXT_FLOATING_POINT. + ("FloatSave", FLOATING_SAVE_AREA), + # This section is specified/returned if the + # ContextFlags word contains the flag CONTEXT_SEGMENTS. + ("SegGs", DWORD), + ("SegFs", DWORD), + ("SegEs", DWORD), + ("SegDs", DWORD), + # This section is specified/returned if the + # ContextFlags word contains the flag CONTEXT_INTEGER. + ("Edi", DWORD), + ("Esi", DWORD), + ("Ebx", DWORD), + ("Edx", DWORD), + ("Ecx", DWORD), + ("Eax", DWORD), + # This section is specified/returned if the + # ContextFlags word contains the flag CONTEXT_CONTROL. + ("Ebp", DWORD), + ("Eip", DWORD), + ("SegCs", DWORD), # MUST BE SANITIZED + ("EFlags", DWORD), # MUST BE SANITIZED + ("Esp", DWORD), + ("SegSs", DWORD), + # This section is specified/returned if the ContextFlags word + # contains the flag CONTEXT_EXTENDED_REGISTERS. + # The format and contexts are processor specific. + ("ExtendedRegisters", BYTE * MAXIMUM_SUPPORTED_EXTENSION), + ] + + _ctx_debug = ("Dr0", "Dr1", "Dr2", "Dr3", "Dr6", "Dr7") + _ctx_segs = ( + "SegGs", + "SegFs", + "SegEs", + "SegDs", + ) + _ctx_int = ("Edi", "Esi", "Ebx", "Edx", "Ecx", "Eax") + _ctx_ctrl = ("Ebp", "Eip", "SegCs", "EFlags", "Esp", "SegSs") + + @classmethod + def from_dict(cls, ctx): + "Instance a new structure from a Python dictionary." + ctx = Context(ctx) + s = cls() + ContextFlags = ctx["ContextFlags"] + setattr(s, "ContextFlags", ContextFlags) + if (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS: + for key in s._ctx_debug: + setattr(s, key, ctx[key]) + if (ContextFlags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT: + fsa = ctx["FloatSave"] + s.FloatSave = FLOATING_SAVE_AREA.from_dict(fsa) + if (ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS: + for key in s._ctx_segs: + setattr(s, key, ctx[key]) + if (ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER: + for key in s._ctx_int: + setattr(s, key, ctx[key]) + if (ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL: + for key in s._ctx_ctrl: + setattr(s, key, ctx[key]) + if (ContextFlags & CONTEXT_EXTENDED_REGISTERS) == CONTEXT_EXTENDED_REGISTERS: + er = ctx["ExtendedRegisters"] + for index in compat.xrange(0, MAXIMUM_SUPPORTED_EXTENSION): + s.ExtendedRegisters[index] = er[index] + return s + + def to_dict(self): + "Convert a structure into a Python native type." + ctx = Context() + ContextFlags = self.ContextFlags + ctx["ContextFlags"] = ContextFlags + if (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS: + for key in self._ctx_debug: + ctx[key] = getattr(self, key) + if (ContextFlags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT: + ctx["FloatSave"] = self.FloatSave.to_dict() + if (ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS: + for key in self._ctx_segs: + ctx[key] = getattr(self, key) + if (ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER: + for key in self._ctx_int: + ctx[key] = getattr(self, key) + if (ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL: + for key in self._ctx_ctrl: + ctx[key] = getattr(self, key) + if (ContextFlags & CONTEXT_EXTENDED_REGISTERS) == CONTEXT_EXTENDED_REGISTERS: + er = [self.ExtendedRegisters[index] for index in compat.xrange(0, MAXIMUM_SUPPORTED_EXTENSION)] + er = tuple(er) + ctx["ExtendedRegisters"] = er + return ctx + + +PCONTEXT = POINTER(CONTEXT) +LPCONTEXT = PCONTEXT + + +class Context(dict): + """ + Register context dictionary for the i386 architecture. + """ + + arch = CONTEXT.arch + + def __get_pc(self): + return self["Eip"] + + def __set_pc(self, value): + self["Eip"] = value + + pc = property(__get_pc, __set_pc) + + def __get_sp(self): + return self["Esp"] + + def __set_sp(self, value): + self["Esp"] = value + + sp = property(__get_sp, __set_sp) + + def __get_fp(self): + return self["Ebp"] + + def __set_fp(self, value): + self["Ebp"] = value + + fp = property(__get_fp, __set_fp) + + +# --- LDT_ENTRY structure ------------------------------------------------------ + +# typedef struct _LDT_ENTRY { +# WORD LimitLow; +# WORD BaseLow; +# union { +# struct { +# BYTE BaseMid; +# BYTE Flags1; +# BYTE Flags2; +# BYTE BaseHi; +# } Bytes; +# struct { +# DWORD BaseMid :8; +# DWORD Type :5; +# DWORD Dpl :2; +# DWORD Pres :1; +# DWORD LimitHi :4; +# DWORD Sys :1; +# DWORD Reserved_0 :1; +# DWORD Default_Big :1; +# DWORD Granularity :1; +# DWORD BaseHi :8; +# } Bits; +# } HighWord; +# } LDT_ENTRY, +# *PLDT_ENTRY; + + +class _LDT_ENTRY_BYTES_(Structure): + _pack_ = 1 + _fields_ = [ + ("BaseMid", BYTE), + ("Flags1", BYTE), + ("Flags2", BYTE), + ("BaseHi", BYTE), + ] + + +class _LDT_ENTRY_BITS_(Structure): + _pack_ = 1 + _fields_ = [ + ("BaseMid", DWORD, 8), + ("Type", DWORD, 5), + ("Dpl", DWORD, 2), + ("Pres", DWORD, 1), + ("LimitHi", DWORD, 4), + ("Sys", DWORD, 1), + ("Reserved_0", DWORD, 1), + ("Default_Big", DWORD, 1), + ("Granularity", DWORD, 1), + ("BaseHi", DWORD, 8), + ] + + +class _LDT_ENTRY_HIGHWORD_(Union): + _pack_ = 1 + _fields_ = [ + ("Bytes", _LDT_ENTRY_BYTES_), + ("Bits", _LDT_ENTRY_BITS_), + ] + + +class LDT_ENTRY(Structure): + _pack_ = 1 + _fields_ = [ + ("LimitLow", WORD), + ("BaseLow", WORD), + ("HighWord", _LDT_ENTRY_HIGHWORD_), + ] + + +PLDT_ENTRY = POINTER(LDT_ENTRY) +LPLDT_ENTRY = PLDT_ENTRY + +############################################################################### + + +# BOOL WINAPI GetThreadSelectorEntry( +# __in HANDLE hThread, +# __in DWORD dwSelector, +# __out LPLDT_ENTRY lpSelectorEntry +# ); +def GetThreadSelectorEntry(hThread, dwSelector): + _GetThreadSelectorEntry = windll.kernel32.GetThreadSelectorEntry + _GetThreadSelectorEntry.argtypes = [HANDLE, DWORD, LPLDT_ENTRY] + _GetThreadSelectorEntry.restype = bool + _GetThreadSelectorEntry.errcheck = RaiseIfZero + + ldt = LDT_ENTRY() + _GetThreadSelectorEntry(hThread, dwSelector, byref(ldt)) + return ldt + + +# BOOL WINAPI GetThreadContext( +# __in HANDLE hThread, +# __inout LPCONTEXT lpContext +# ); +def GetThreadContext(hThread, ContextFlags=None, raw=False): + _GetThreadContext = windll.kernel32.GetThreadContext + _GetThreadContext.argtypes = [HANDLE, LPCONTEXT] + _GetThreadContext.restype = bool + _GetThreadContext.errcheck = RaiseIfZero + + if ContextFlags is None: + ContextFlags = CONTEXT_ALL | CONTEXT_i386 + Context = CONTEXT() + Context.ContextFlags = ContextFlags + _GetThreadContext(hThread, byref(Context)) + if raw: + return Context + return Context.to_dict() + + +# BOOL WINAPI SetThreadContext( +# __in HANDLE hThread, +# __in const CONTEXT* lpContext +# ); +def SetThreadContext(hThread, lpContext): + _SetThreadContext = windll.kernel32.SetThreadContext + _SetThreadContext.argtypes = [HANDLE, LPCONTEXT] + _SetThreadContext.restype = bool + _SetThreadContext.errcheck = RaiseIfZero + + if isinstance(lpContext, dict): + lpContext = CONTEXT.from_dict(lpContext) + _SetThreadContext(hThread, byref(lpContext)) + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/dbghelp.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/dbghelp.py new file mode 100644 index 0000000..c3f5bfd --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/dbghelp.py @@ -0,0 +1,1381 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for dbghelp.dll in ctypes. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.version import * +from winappdbg.win32.kernel32 import * + +# DbgHelp versions and features list: +# http://msdn.microsoft.com/en-us/library/windows/desktop/ms679294(v=vs.85).aspx + +# ------------------------------------------------------------------------------ +# Tries to load the newest version of dbghelp.dll if available. + + +def _load_latest_dbghelp_dll(): + from os import getenv + from os.path import join, exists + + program_files_location = getenv("ProgramFiles") + if not program_files_location: + program_files_location = "C:\\Program Files" + + program_files_x86_location = getenv("ProgramFiles(x86)") + + if arch == ARCH_AMD64: + if wow64: + pathname = join(program_files_x86_location or program_files_location, "Debugging Tools for Windows (x86)", "dbghelp.dll") + else: + pathname = join(program_files_location, "Debugging Tools for Windows (x64)", "dbghelp.dll") + elif arch == ARCH_I386: + pathname = join(program_files_location, "Debugging Tools for Windows (x86)", "dbghelp.dll") + else: + pathname = None + + if pathname and exists(pathname): + try: + _dbghelp = ctypes.windll.LoadLibrary(pathname) + ctypes.windll.dbghelp = _dbghelp + except Exception: + pass + + +_load_latest_dbghelp_dll() + +# Recover the old binding of the "os" symbol. +# XXX FIXME not sure if I really need to do this! +##from version import os + +# ------------------------------------------------------------------------------ + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# SymGetHomeDirectory "type" values +hdBase = 0 +hdSym = 1 +hdSrc = 2 + +UNDNAME_32_BIT_DECODE = 0x0800 +UNDNAME_COMPLETE = 0x0000 +UNDNAME_NAME_ONLY = 0x1000 +UNDNAME_NO_ACCESS_SPECIFIERS = 0x0080 +UNDNAME_NO_ALLOCATION_LANGUAGE = 0x0010 +UNDNAME_NO_ALLOCATION_MODEL = 0x0008 +UNDNAME_NO_ARGUMENTS = 0x2000 +UNDNAME_NO_CV_THISTYPE = 0x0040 +UNDNAME_NO_FUNCTION_RETURNS = 0x0004 +UNDNAME_NO_LEADING_UNDERSCORES = 0x0001 +UNDNAME_NO_MEMBER_TYPE = 0x0200 +UNDNAME_NO_MS_KEYWORDS = 0x0002 +UNDNAME_NO_MS_THISTYPE = 0x0020 +UNDNAME_NO_RETURN_UDT_MODEL = 0x0400 +UNDNAME_NO_SPECIAL_SYMS = 0x4000 +UNDNAME_NO_THISTYPE = 0x0060 +UNDNAME_NO_THROW_SIGNATURES = 0x0100 + +# --- IMAGEHLP_MODULE structure and related ------------------------------------ + +SYMOPT_ALLOW_ABSOLUTE_SYMBOLS = 0x00000800 +SYMOPT_ALLOW_ZERO_ADDRESS = 0x01000000 +SYMOPT_AUTO_PUBLICS = 0x00010000 +SYMOPT_CASE_INSENSITIVE = 0x00000001 +SYMOPT_DEBUG = 0x80000000 +SYMOPT_DEFERRED_LOADS = 0x00000004 +SYMOPT_DISABLE_SYMSRV_AUTODETECT = 0x02000000 +SYMOPT_EXACT_SYMBOLS = 0x00000400 +SYMOPT_FAIL_CRITICAL_ERRORS = 0x00000200 +SYMOPT_FAVOR_COMPRESSED = 0x00800000 +SYMOPT_FLAT_DIRECTORY = 0x00400000 +SYMOPT_IGNORE_CVREC = 0x00000080 +SYMOPT_IGNORE_IMAGEDIR = 0x00200000 +SYMOPT_IGNORE_NT_SYMPATH = 0x00001000 +SYMOPT_INCLUDE_32BIT_MODULES = 0x00002000 +SYMOPT_LOAD_ANYTHING = 0x00000040 +SYMOPT_LOAD_LINES = 0x00000010 +SYMOPT_NO_CPP = 0x00000008 +SYMOPT_NO_IMAGE_SEARCH = 0x00020000 +SYMOPT_NO_PROMPTS = 0x00080000 +SYMOPT_NO_PUBLICS = 0x00008000 +SYMOPT_NO_UNQUALIFIED_LOADS = 0x00000100 +SYMOPT_OVERWRITE = 0x00100000 +SYMOPT_PUBLICS_ONLY = 0x00004000 +SYMOPT_SECURE = 0x00040000 +SYMOPT_UNDNAME = 0x00000002 + +##SSRVOPT_DWORD +##SSRVOPT_DWORDPTR +##SSRVOPT_GUIDPTR +## +##SSRVOPT_CALLBACK +##SSRVOPT_DOWNSTREAM_STORE +##SSRVOPT_FLAT_DEFAULT_STORE +##SSRVOPT_FAVOR_COMPRESSED +##SSRVOPT_NOCOPY +##SSRVOPT_OVERWRITE +##SSRVOPT_PARAMTYPE +##SSRVOPT_PARENTWIN +##SSRVOPT_PROXY +##SSRVOPT_RESET +##SSRVOPT_SECURE +##SSRVOPT_SETCONTEXT +##SSRVOPT_TRACE +##SSRVOPT_UNATTENDED + +# typedef enum +# { +# SymNone = 0, +# SymCoff, +# SymCv, +# SymPdb, +# SymExport, +# SymDeferred, +# SymSym, +# SymDia, +# SymVirtual, +# NumSymTypes +# } SYM_TYPE; +SymNone = 0 +SymCoff = 1 +SymCv = 2 +SymPdb = 3 +SymExport = 4 +SymDeferred = 5 +SymSym = 6 +SymDia = 7 +SymVirtual = 8 +NumSymTypes = 9 + +# typedef struct _IMAGEHLP_MODULE64 { +# DWORD SizeOfStruct; +# DWORD64 BaseOfImage; +# DWORD ImageSize; +# DWORD TimeDateStamp; +# DWORD CheckSum; +# DWORD NumSyms; +# SYM_TYPE SymType; +# TCHAR ModuleName[32]; +# TCHAR ImageName[256]; +# TCHAR LoadedImageName[256]; +# TCHAR LoadedPdbName[256]; +# DWORD CVSig; +# TCHAR CVData[MAX_PATH*3]; +# DWORD PdbSig; +# GUID PdbSig70; +# DWORD PdbAge; +# BOOL PdbUnmatched; +# BOOL DbgUnmatched; +# BOOL LineNumbers; +# BOOL GlobalSymbols; +# BOOL TypeInfo; +# BOOL SourceIndexed; +# BOOL Publics; +# } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64; + + +class IMAGEHLP_MODULE(Structure): + _fields_ = [ + ("SizeOfStruct", DWORD), + ("BaseOfImage", DWORD), + ("ImageSize", DWORD), + ("TimeDateStamp", DWORD), + ("CheckSum", DWORD), + ("NumSyms", DWORD), + ("SymType", DWORD), # SYM_TYPE + ("ModuleName", CHAR * 32), + ("ImageName", CHAR * 256), + ("LoadedImageName", CHAR * 256), + ] + + +PIMAGEHLP_MODULE = POINTER(IMAGEHLP_MODULE) + + +class IMAGEHLP_MODULE64(Structure): + _fields_ = [ + ("SizeOfStruct", DWORD), + ("BaseOfImage", DWORD64), + ("ImageSize", DWORD), + ("TimeDateStamp", DWORD), + ("CheckSum", DWORD), + ("NumSyms", DWORD), + ("SymType", DWORD), # SYM_TYPE + ("ModuleName", CHAR * 32), + ("ImageName", CHAR * 256), + ("LoadedImageName", CHAR * 256), + ("LoadedPdbName", CHAR * 256), + ("CVSig", DWORD), + ("CVData", CHAR * (MAX_PATH * 3)), + ("PdbSig", DWORD), + ("PdbSig70", GUID), + ("PdbAge", DWORD), + ("PdbUnmatched", BOOL), + ("DbgUnmatched", BOOL), + ("LineNumbers", BOOL), + ("GlobalSymbols", BOOL), + ("TypeInfo", BOOL), + ("SourceIndexed", BOOL), + ("Publics", BOOL), + ] + + +PIMAGEHLP_MODULE64 = POINTER(IMAGEHLP_MODULE64) + + +class IMAGEHLP_MODULEW(Structure): + _fields_ = [ + ("SizeOfStruct", DWORD), + ("BaseOfImage", DWORD), + ("ImageSize", DWORD), + ("TimeDateStamp", DWORD), + ("CheckSum", DWORD), + ("NumSyms", DWORD), + ("SymType", DWORD), # SYM_TYPE + ("ModuleName", WCHAR * 32), + ("ImageName", WCHAR * 256), + ("LoadedImageName", WCHAR * 256), + ] + + +PIMAGEHLP_MODULEW = POINTER(IMAGEHLP_MODULEW) + + +class IMAGEHLP_MODULEW64(Structure): + _fields_ = [ + ("SizeOfStruct", DWORD), + ("BaseOfImage", DWORD64), + ("ImageSize", DWORD), + ("TimeDateStamp", DWORD), + ("CheckSum", DWORD), + ("NumSyms", DWORD), + ("SymType", DWORD), # SYM_TYPE + ("ModuleName", WCHAR * 32), + ("ImageName", WCHAR * 256), + ("LoadedImageName", WCHAR * 256), + ("LoadedPdbName", WCHAR * 256), + ("CVSig", DWORD), + ("CVData", WCHAR * (MAX_PATH * 3)), + ("PdbSig", DWORD), + ("PdbSig70", GUID), + ("PdbAge", DWORD), + ("PdbUnmatched", BOOL), + ("DbgUnmatched", BOOL), + ("LineNumbers", BOOL), + ("GlobalSymbols", BOOL), + ("TypeInfo", BOOL), + ("SourceIndexed", BOOL), + ("Publics", BOOL), + ] + + +PIMAGEHLP_MODULEW64 = POINTER(IMAGEHLP_MODULEW64) + +# --- dbghelp.dll -------------------------------------------------------------- + +# XXX the ANSI versions of these functions don't end in "A" as expected! + + +# BOOL WINAPI MakeSureDirectoryPathExists( +# _In_ PCSTR DirPath +# ); +def MakeSureDirectoryPathExistsA(DirPath): + _MakeSureDirectoryPathExists = windll.dbghelp.MakeSureDirectoryPathExists + _MakeSureDirectoryPathExists.argtypes = [LPSTR] + _MakeSureDirectoryPathExists.restype = bool + _MakeSureDirectoryPathExists.errcheck = RaiseIfZero + return _MakeSureDirectoryPathExists(DirPath) + + +MakeSureDirectoryPathExistsW = MakeWideVersion(MakeSureDirectoryPathExistsA) +MakeSureDirectoryPathExists = GuessStringType(MakeSureDirectoryPathExistsA, MakeSureDirectoryPathExistsW) + + +# BOOL WINAPI SymInitialize( +# __in HANDLE hProcess, +# __in_opt PCTSTR UserSearchPath, +# __in BOOL fInvadeProcess +# ); +def SymInitializeA(hProcess, UserSearchPath=None, fInvadeProcess=False): + _SymInitialize = windll.dbghelp.SymInitialize + _SymInitialize.argtypes = [HANDLE, LPSTR, BOOL] + _SymInitialize.restype = bool + _SymInitialize.errcheck = RaiseIfZero + if not UserSearchPath: + UserSearchPath = None + _SymInitialize(hProcess, UserSearchPath, fInvadeProcess) + + +SymInitializeW = MakeWideVersion(SymInitializeA) +SymInitialize = GuessStringType(SymInitializeA, SymInitializeW) + + +# BOOL WINAPI SymCleanup( +# __in HANDLE hProcess +# ); +def SymCleanup(hProcess): + _SymCleanup = windll.dbghelp.SymCleanup + _SymCleanup.argtypes = [HANDLE] + _SymCleanup.restype = bool + _SymCleanup.errcheck = RaiseIfZero + _SymCleanup(hProcess) + + +# BOOL WINAPI SymRefreshModuleList( +# __in HANDLE hProcess +# ); +def SymRefreshModuleList(hProcess): + _SymRefreshModuleList = windll.dbghelp.SymRefreshModuleList + _SymRefreshModuleList.argtypes = [HANDLE] + _SymRefreshModuleList.restype = bool + _SymRefreshModuleList.errcheck = RaiseIfZero + _SymRefreshModuleList(hProcess) + + +# BOOL WINAPI SymSetParentWindow( +# __in HWND hwnd +# ); +def SymSetParentWindow(hwnd): + _SymSetParentWindow = windll.dbghelp.SymSetParentWindow + _SymSetParentWindow.argtypes = [HWND] + _SymSetParentWindow.restype = bool + _SymSetParentWindow.errcheck = RaiseIfZero + _SymSetParentWindow(hwnd) + + +# DWORD WINAPI SymSetOptions( +# __in DWORD SymOptions +# ); +def SymSetOptions(SymOptions): + _SymSetOptions = windll.dbghelp.SymSetOptions + _SymSetOptions.argtypes = [DWORD] + _SymSetOptions.restype = DWORD + _SymSetOptions.errcheck = RaiseIfZero + _SymSetOptions(SymOptions) + + +# DWORD WINAPI SymGetOptions(void); +def SymGetOptions(): + _SymGetOptions = windll.dbghelp.SymGetOptions + _SymGetOptions.argtypes = [] + _SymGetOptions.restype = DWORD + return _SymGetOptions() + + +# DWORD WINAPI SymLoadModule( +# __in HANDLE hProcess, +# __in_opt HANDLE hFile, +# __in_opt PCSTR ImageName, +# __in_opt PCSTR ModuleName, +# __in DWORD BaseOfDll, +# __in DWORD SizeOfDll +# ); +def SymLoadModuleA(hProcess, hFile=None, ImageName=None, ModuleName=None, BaseOfDll=None, SizeOfDll=None): + _SymLoadModule = windll.dbghelp.SymLoadModule + _SymLoadModule.argtypes = [HANDLE, HANDLE, LPSTR, LPSTR, DWORD, DWORD] + _SymLoadModule.restype = DWORD + + if not ImageName: + ImageName = None + if not ModuleName: + ModuleName = None + if not BaseOfDll: + BaseOfDll = 0 + if not SizeOfDll: + SizeOfDll = 0 + SetLastError(ERROR_SUCCESS) + lpBaseAddress = _SymLoadModule(hProcess, hFile, ImageName, ModuleName, BaseOfDll, SizeOfDll) + if lpBaseAddress == NULL: + dwErrorCode = GetLastError() + if dwErrorCode != ERROR_SUCCESS: + raise ctypes.WinError(dwErrorCode) + return lpBaseAddress + + +SymLoadModuleW = MakeWideVersion(SymLoadModuleA) +SymLoadModule = GuessStringType(SymLoadModuleA, SymLoadModuleW) + + +# DWORD64 WINAPI SymLoadModule64( +# __in HANDLE hProcess, +# __in_opt HANDLE hFile, +# __in_opt PCSTR ImageName, +# __in_opt PCSTR ModuleName, +# __in DWORD64 BaseOfDll, +# __in DWORD SizeOfDll +# ); +def SymLoadModule64A(hProcess, hFile=None, ImageName=None, ModuleName=None, BaseOfDll=None, SizeOfDll=None): + _SymLoadModule64 = windll.dbghelp.SymLoadModule64 + _SymLoadModule64.argtypes = [HANDLE, HANDLE, LPSTR, LPSTR, DWORD64, DWORD] + _SymLoadModule64.restype = DWORD64 + + if not ImageName: + ImageName = None + if not ModuleName: + ModuleName = None + if not BaseOfDll: + BaseOfDll = 0 + if not SizeOfDll: + SizeOfDll = 0 + SetLastError(ERROR_SUCCESS) + lpBaseAddress = _SymLoadModule64(hProcess, hFile, ImageName, ModuleName, BaseOfDll, SizeOfDll) + if lpBaseAddress == NULL: + dwErrorCode = GetLastError() + if dwErrorCode != ERROR_SUCCESS: + raise ctypes.WinError(dwErrorCode) + return lpBaseAddress + + +SymLoadModule64W = MakeWideVersion(SymLoadModule64A) +SymLoadModule64 = GuessStringType(SymLoadModule64A, SymLoadModule64W) + + +# BOOL WINAPI SymUnloadModule( +# __in HANDLE hProcess, +# __in DWORD BaseOfDll +# ); +def SymUnloadModule(hProcess, BaseOfDll): + _SymUnloadModule = windll.dbghelp.SymUnloadModule + _SymUnloadModule.argtypes = [HANDLE, DWORD] + _SymUnloadModule.restype = bool + _SymUnloadModule.errcheck = RaiseIfZero + _SymUnloadModule(hProcess, BaseOfDll) + + +# BOOL WINAPI SymUnloadModule64( +# __in HANDLE hProcess, +# __in DWORD64 BaseOfDll +# ); +def SymUnloadModule64(hProcess, BaseOfDll): + _SymUnloadModule64 = windll.dbghelp.SymUnloadModule64 + _SymUnloadModule64.argtypes = [HANDLE, DWORD64] + _SymUnloadModule64.restype = bool + _SymUnloadModule64.errcheck = RaiseIfZero + _SymUnloadModule64(hProcess, BaseOfDll) + + +# BOOL WINAPI SymGetModuleInfo( +# __in HANDLE hProcess, +# __in DWORD dwAddr, +# __out PIMAGEHLP_MODULE ModuleInfo +# ); +def SymGetModuleInfoA(hProcess, dwAddr): + _SymGetModuleInfo = windll.dbghelp.SymGetModuleInfo + _SymGetModuleInfo.argtypes = [HANDLE, DWORD, PIMAGEHLP_MODULE] + _SymGetModuleInfo.restype = bool + _SymGetModuleInfo.errcheck = RaiseIfZero + + ModuleInfo = IMAGEHLP_MODULE() + ModuleInfo.SizeOfStruct = sizeof(ModuleInfo) + _SymGetModuleInfo(hProcess, dwAddr, byref(ModuleInfo)) + return ModuleInfo + + +def SymGetModuleInfoW(hProcess, dwAddr): + _SymGetModuleInfoW = windll.dbghelp.SymGetModuleInfoW + _SymGetModuleInfoW.argtypes = [HANDLE, DWORD, PIMAGEHLP_MODULEW] + _SymGetModuleInfoW.restype = bool + _SymGetModuleInfoW.errcheck = RaiseIfZero + + ModuleInfo = IMAGEHLP_MODULEW() + ModuleInfo.SizeOfStruct = sizeof(ModuleInfo) + _SymGetModuleInfoW(hProcess, dwAddr, byref(ModuleInfo)) + return ModuleInfo + + +SymGetModuleInfo = GuessStringType(SymGetModuleInfoA, SymGetModuleInfoW) + + +# BOOL WINAPI SymGetModuleInfo64( +# __in HANDLE hProcess, +# __in DWORD64 dwAddr, +# __out PIMAGEHLP_MODULE64 ModuleInfo +# ); +def SymGetModuleInfo64A(hProcess, dwAddr): + _SymGetModuleInfo64 = windll.dbghelp.SymGetModuleInfo64 + _SymGetModuleInfo64.argtypes = [HANDLE, DWORD64, PIMAGEHLP_MODULE64] + _SymGetModuleInfo64.restype = bool + _SymGetModuleInfo64.errcheck = RaiseIfZero + + ModuleInfo = IMAGEHLP_MODULE64() + ModuleInfo.SizeOfStruct = sizeof(ModuleInfo) + _SymGetModuleInfo64(hProcess, dwAddr, byref(ModuleInfo)) + return ModuleInfo + + +def SymGetModuleInfo64W(hProcess, dwAddr): + _SymGetModuleInfo64W = windll.dbghelp.SymGetModuleInfo64W + _SymGetModuleInfo64W.argtypes = [HANDLE, DWORD64, PIMAGEHLP_MODULE64W] + _SymGetModuleInfo64W.restype = bool + _SymGetModuleInfo64W.errcheck = RaiseIfZero + + ModuleInfo = IMAGEHLP_MODULE64W() + ModuleInfo.SizeOfStruct = sizeof(ModuleInfo) + _SymGetModuleInfo64W(hProcess, dwAddr, byref(ModuleInfo)) + return ModuleInfo + + +SymGetModuleInfo64 = GuessStringType(SymGetModuleInfo64A, SymGetModuleInfo64W) + +# BOOL CALLBACK SymEnumerateModulesProc( +# __in PCTSTR ModuleName, +# __in DWORD BaseOfDll, +# __in_opt PVOID UserContext +# ); +PSYM_ENUMMODULES_CALLBACK = WINFUNCTYPE(BOOL, LPSTR, DWORD, PVOID) +PSYM_ENUMMODULES_CALLBACKW = WINFUNCTYPE(BOOL, LPWSTR, DWORD, PVOID) + +# BOOL CALLBACK SymEnumerateModulesProc64( +# __in PCTSTR ModuleName, +# __in DWORD64 BaseOfDll, +# __in_opt PVOID UserContext +# ); +PSYM_ENUMMODULES_CALLBACK64 = WINFUNCTYPE(BOOL, LPSTR, DWORD64, PVOID) +PSYM_ENUMMODULES_CALLBACKW64 = WINFUNCTYPE(BOOL, LPWSTR, DWORD64, PVOID) + + +# BOOL WINAPI SymEnumerateModules( +# __in HANDLE hProcess, +# __in PSYM_ENUMMODULES_CALLBACK EnumModulesCallback, +# __in_opt PVOID UserContext +# ); +def SymEnumerateModulesA(hProcess, EnumModulesCallback, UserContext=None): + _SymEnumerateModules = windll.dbghelp.SymEnumerateModules + _SymEnumerateModules.argtypes = [HANDLE, PSYM_ENUMMODULES_CALLBACK, PVOID] + _SymEnumerateModules.restype = bool + _SymEnumerateModules.errcheck = RaiseIfZero + + EnumModulesCallback = PSYM_ENUMMODULES_CALLBACK(EnumModulesCallback) + if UserContext: + UserContext = ctypes.pointer(UserContext) + else: + UserContext = LPVOID(NULL) + _SymEnumerateModules(hProcess, EnumModulesCallback, UserContext) + + +def SymEnumerateModulesW(hProcess, EnumModulesCallback, UserContext=None): + _SymEnumerateModulesW = windll.dbghelp.SymEnumerateModulesW + _SymEnumerateModulesW.argtypes = [HANDLE, PSYM_ENUMMODULES_CALLBACKW, PVOID] + _SymEnumerateModulesW.restype = bool + _SymEnumerateModulesW.errcheck = RaiseIfZero + + EnumModulesCallback = PSYM_ENUMMODULES_CALLBACKW(EnumModulesCallback) + if UserContext: + UserContext = ctypes.pointer(UserContext) + else: + UserContext = LPVOID(NULL) + _SymEnumerateModulesW(hProcess, EnumModulesCallback, UserContext) + + +SymEnumerateModules = GuessStringType(SymEnumerateModulesA, SymEnumerateModulesW) + + +# BOOL WINAPI SymEnumerateModules64( +# __in HANDLE hProcess, +# __in PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, +# __in_opt PVOID UserContext +# ); +def SymEnumerateModules64A(hProcess, EnumModulesCallback, UserContext=None): + _SymEnumerateModules64 = windll.dbghelp.SymEnumerateModules64 + _SymEnumerateModules64.argtypes = [HANDLE, PSYM_ENUMMODULES_CALLBACK64, PVOID] + _SymEnumerateModules64.restype = bool + _SymEnumerateModules64.errcheck = RaiseIfZero + + EnumModulesCallback = PSYM_ENUMMODULES_CALLBACK64(EnumModulesCallback) + if UserContext: + UserContext = ctypes.pointer(UserContext) + else: + UserContext = LPVOID(NULL) + _SymEnumerateModules64(hProcess, EnumModulesCallback, UserContext) + + +def SymEnumerateModules64W(hProcess, EnumModulesCallback, UserContext=None): + _SymEnumerateModules64W = windll.dbghelp.SymEnumerateModules64W + _SymEnumerateModules64W.argtypes = [HANDLE, PSYM_ENUMMODULES_CALLBACK64W, PVOID] + _SymEnumerateModules64W.restype = bool + _SymEnumerateModules64W.errcheck = RaiseIfZero + + EnumModulesCallback = PSYM_ENUMMODULES_CALLBACK64W(EnumModulesCallback) + if UserContext: + UserContext = ctypes.pointer(UserContext) + else: + UserContext = LPVOID(NULL) + _SymEnumerateModules64W(hProcess, EnumModulesCallback, UserContext) + + +SymEnumerateModules64 = GuessStringType(SymEnumerateModules64A, SymEnumerateModules64W) + +# BOOL CALLBACK SymEnumerateSymbolsProc( +# __in PCTSTR SymbolName, +# __in DWORD SymbolAddress, +# __in ULONG SymbolSize, +# __in_opt PVOID UserContext +# ); +PSYM_ENUMSYMBOLS_CALLBACK = WINFUNCTYPE(BOOL, LPSTR, DWORD, ULONG, PVOID) +PSYM_ENUMSYMBOLS_CALLBACKW = WINFUNCTYPE(BOOL, LPWSTR, DWORD, ULONG, PVOID) + +# BOOL CALLBACK SymEnumerateSymbolsProc64( +# __in PCTSTR SymbolName, +# __in DWORD64 SymbolAddress, +# __in ULONG SymbolSize, +# __in_opt PVOID UserContext +# ); +PSYM_ENUMSYMBOLS_CALLBACK64 = WINFUNCTYPE(BOOL, LPSTR, DWORD64, ULONG, PVOID) +PSYM_ENUMSYMBOLS_CALLBACKW64 = WINFUNCTYPE(BOOL, LPWSTR, DWORD64, ULONG, PVOID) + + +# BOOL WINAPI SymEnumerateSymbols( +# __in HANDLE hProcess, +# __in ULONG BaseOfDll, +# __in PSYM_ENUMSYMBOLS_CALLBACK EnumSymbolsCallback, +# __in_opt PVOID UserContext +# ); +def SymEnumerateSymbolsA(hProcess, BaseOfDll, EnumSymbolsCallback, UserContext=None): + _SymEnumerateSymbols = windll.dbghelp.SymEnumerateSymbols + _SymEnumerateSymbols.argtypes = [HANDLE, ULONG, PSYM_ENUMSYMBOLS_CALLBACK, PVOID] + _SymEnumerateSymbols.restype = bool + _SymEnumerateSymbols.errcheck = RaiseIfZero + + EnumSymbolsCallback = PSYM_ENUMSYMBOLS_CALLBACK(EnumSymbolsCallback) + if UserContext: + UserContext = ctypes.pointer(UserContext) + else: + UserContext = LPVOID(NULL) + _SymEnumerateSymbols(hProcess, BaseOfDll, EnumSymbolsCallback, UserContext) + + +def SymEnumerateSymbolsW(hProcess, BaseOfDll, EnumSymbolsCallback, UserContext=None): + _SymEnumerateSymbolsW = windll.dbghelp.SymEnumerateSymbolsW + _SymEnumerateSymbolsW.argtypes = [HANDLE, ULONG, PSYM_ENUMSYMBOLS_CALLBACKW, PVOID] + _SymEnumerateSymbolsW.restype = bool + _SymEnumerateSymbolsW.errcheck = RaiseIfZero + + EnumSymbolsCallback = PSYM_ENUMSYMBOLS_CALLBACKW(EnumSymbolsCallback) + if UserContext: + UserContext = ctypes.pointer(UserContext) + else: + UserContext = LPVOID(NULL) + _SymEnumerateSymbolsW(hProcess, BaseOfDll, EnumSymbolsCallback, UserContext) + + +SymEnumerateSymbols = GuessStringType(SymEnumerateSymbolsA, SymEnumerateSymbolsW) + + +# BOOL WINAPI SymEnumerateSymbols64( +# __in HANDLE hProcess, +# __in ULONG64 BaseOfDll, +# __in PSYM_ENUMSYMBOLS_CALLBACK64 EnumSymbolsCallback, +# __in_opt PVOID UserContext +# ); +def SymEnumerateSymbols64A(hProcess, BaseOfDll, EnumSymbolsCallback, UserContext=None): + _SymEnumerateSymbols64 = windll.dbghelp.SymEnumerateSymbols64 + _SymEnumerateSymbols64.argtypes = [HANDLE, ULONG64, PSYM_ENUMSYMBOLS_CALLBACK64, PVOID] + _SymEnumerateSymbols64.restype = bool + _SymEnumerateSymbols64.errcheck = RaiseIfZero + + EnumSymbolsCallback = PSYM_ENUMSYMBOLS_CALLBACK64(EnumSymbolsCallback) + if UserContext: + UserContext = ctypes.pointer(UserContext) + else: + UserContext = LPVOID(NULL) + _SymEnumerateSymbols64(hProcess, BaseOfDll, EnumSymbolsCallback, UserContext) + + +def SymEnumerateSymbols64W(hProcess, BaseOfDll, EnumSymbolsCallback, UserContext=None): + _SymEnumerateSymbols64W = windll.dbghelp.SymEnumerateSymbols64W + _SymEnumerateSymbols64W.argtypes = [HANDLE, ULONG64, PSYM_ENUMSYMBOLS_CALLBACK64W, PVOID] + _SymEnumerateSymbols64W.restype = bool + _SymEnumerateSymbols64W.errcheck = RaiseIfZero + + EnumSymbolsCallback = PSYM_ENUMSYMBOLS_CALLBACK64W(EnumSymbolsCallback) + if UserContext: + UserContext = ctypes.pointer(UserContext) + else: + UserContext = LPVOID(NULL) + _SymEnumerateSymbols64W(hProcess, BaseOfDll, EnumSymbolsCallback, UserContext) + + +SymEnumerateSymbols64 = GuessStringType(SymEnumerateSymbols64A, SymEnumerateSymbols64W) + + +# DWORD WINAPI UnDecorateSymbolName( +# __in PCTSTR DecoratedName, +# __out PTSTR UnDecoratedName, +# __in DWORD UndecoratedLength, +# __in DWORD Flags +# ); +def UnDecorateSymbolNameA(DecoratedName, Flags=UNDNAME_COMPLETE): + _UnDecorateSymbolNameA = windll.dbghelp.UnDecorateSymbolName + _UnDecorateSymbolNameA.argtypes = [LPSTR, LPSTR, DWORD, DWORD] + _UnDecorateSymbolNameA.restype = DWORD + _UnDecorateSymbolNameA.errcheck = RaiseIfZero + + UndecoratedLength = _UnDecorateSymbolNameA(DecoratedName, None, 0, Flags) + UnDecoratedName = ctypes.create_string_buffer("", UndecoratedLength + 1) + _UnDecorateSymbolNameA(DecoratedName, UnDecoratedName, UndecoratedLength, Flags) + return UnDecoratedName.value + + +def UnDecorateSymbolNameW(DecoratedName, Flags=UNDNAME_COMPLETE): + _UnDecorateSymbolNameW = windll.dbghelp.UnDecorateSymbolNameW + _UnDecorateSymbolNameW.argtypes = [LPWSTR, LPWSTR, DWORD, DWORD] + _UnDecorateSymbolNameW.restype = DWORD + _UnDecorateSymbolNameW.errcheck = RaiseIfZero + + UndecoratedLength = _UnDecorateSymbolNameW(DecoratedName, None, 0, Flags) + UnDecoratedName = ctypes.create_unicode_buffer("", UndecoratedLength + 1) + _UnDecorateSymbolNameW(DecoratedName, UnDecoratedName, UndecoratedLength, Flags) + return UnDecoratedName.value + + +UnDecorateSymbolName = GuessStringType(UnDecorateSymbolNameA, UnDecorateSymbolNameW) + + +# BOOL WINAPI SymGetSearchPath( +# __in HANDLE hProcess, +# __out PTSTR SearchPath, +# __in DWORD SearchPathLength +# ); +def SymGetSearchPathA(hProcess): + _SymGetSearchPath = windll.dbghelp.SymGetSearchPath + _SymGetSearchPath.argtypes = [HANDLE, LPSTR, DWORD] + _SymGetSearchPath.restype = bool + _SymGetSearchPath.errcheck = RaiseIfZero + + SearchPathLength = MAX_PATH + SearchPath = ctypes.create_string_buffer("", SearchPathLength) + _SymGetSearchPath(hProcess, SearchPath, SearchPathLength) + return SearchPath.value + + +def SymGetSearchPathW(hProcess): + _SymGetSearchPathW = windll.dbghelp.SymGetSearchPathW + _SymGetSearchPathW.argtypes = [HANDLE, LPWSTR, DWORD] + _SymGetSearchPathW.restype = bool + _SymGetSearchPathW.errcheck = RaiseIfZero + + SearchPathLength = MAX_PATH + SearchPath = ctypes.create_unicode_buffer("", SearchPathLength) + _SymGetSearchPathW(hProcess, SearchPath, SearchPathLength) + return SearchPath.value + + +SymGetSearchPath = GuessStringType(SymGetSearchPathA, SymGetSearchPathW) + + +# BOOL WINAPI SymSetSearchPath( +# __in HANDLE hProcess, +# __in_opt PCTSTR SearchPath +# ); +def SymSetSearchPathA(hProcess, SearchPath=None): + _SymSetSearchPath = windll.dbghelp.SymSetSearchPath + _SymSetSearchPath.argtypes = [HANDLE, LPSTR] + _SymSetSearchPath.restype = bool + _SymSetSearchPath.errcheck = RaiseIfZero + if not SearchPath: + SearchPath = None + _SymSetSearchPath(hProcess, SearchPath) + + +def SymSetSearchPathW(hProcess, SearchPath=None): + _SymSetSearchPathW = windll.dbghelp.SymSetSearchPathW + _SymSetSearchPathW.argtypes = [HANDLE, LPWSTR] + _SymSetSearchPathW.restype = bool + _SymSetSearchPathW.errcheck = RaiseIfZero + if not SearchPath: + SearchPath = None + _SymSetSearchPathW(hProcess, SearchPath) + + +SymSetSearchPath = GuessStringType(SymSetSearchPathA, SymSetSearchPathW) + + +# PTCHAR WINAPI SymGetHomeDirectory( +# __in DWORD type, +# __out PTSTR dir, +# __in size_t size +# ); +def SymGetHomeDirectoryA(type): + _SymGetHomeDirectoryA = windll.dbghelp.SymGetHomeDirectoryA + _SymGetHomeDirectoryA.argtypes = [DWORD, LPSTR, SIZE_T] + _SymGetHomeDirectoryA.restype = LPSTR + _SymGetHomeDirectoryA.errcheck = RaiseIfZero + + size = MAX_PATH + dir = ctypes.create_string_buffer("", size) + _SymGetHomeDirectoryA(type, dir, size) + return dir.value + + +def SymGetHomeDirectoryW(type): + _SymGetHomeDirectoryW = windll.dbghelp.SymGetHomeDirectoryW + _SymGetHomeDirectoryW.argtypes = [DWORD, LPWSTR, SIZE_T] + _SymGetHomeDirectoryW.restype = LPWSTR + _SymGetHomeDirectoryW.errcheck = RaiseIfZero + + size = MAX_PATH + dir = ctypes.create_unicode_buffer("", size) + _SymGetHomeDirectoryW(type, dir, size) + return dir.value + + +SymGetHomeDirectory = GuessStringType(SymGetHomeDirectoryA, SymGetHomeDirectoryW) + + +# PTCHAR WINAPI SymSetHomeDirectory( +# __in HANDLE hProcess, +# __in_opt PCTSTR dir +# ); +def SymSetHomeDirectoryA(hProcess, dir=None): + _SymSetHomeDirectoryA = windll.dbghelp.SymSetHomeDirectoryA + _SymSetHomeDirectoryA.argtypes = [HANDLE, LPSTR] + _SymSetHomeDirectoryA.restype = LPSTR + _SymSetHomeDirectoryA.errcheck = RaiseIfZero + if not dir: + dir = None + _SymSetHomeDirectoryA(hProcess, dir) + return dir + + +def SymSetHomeDirectoryW(hProcess, dir=None): + _SymSetHomeDirectoryW = windll.dbghelp.SymSetHomeDirectoryW + _SymSetHomeDirectoryW.argtypes = [HANDLE, LPWSTR] + _SymSetHomeDirectoryW.restype = LPWSTR + _SymSetHomeDirectoryW.errcheck = RaiseIfZero + if not dir: + dir = None + _SymSetHomeDirectoryW(hProcess, dir) + return dir + + +SymSetHomeDirectory = GuessStringType(SymSetHomeDirectoryA, SymSetHomeDirectoryW) + +# --- DbgHelp 5+ support, patch by Neitsa -------------------------------------- + +# XXX TODO +# + use the GuessStringType decorator for ANSI/Wide versions +# + replace hardcoded struct sizes with sizeof() calls +# + StackWalk64 should raise on error, but something has to be done about it +# not setting the last error code (maybe we should call SetLastError +# ourselves with a default error code?) +# /Mario + +# maximum length of a symbol name +MAX_SYM_NAME = 2000 + + +class SYM_INFO(Structure): + _fields_ = [ + ("SizeOfStruct", ULONG), + ("TypeIndex", ULONG), + ("Reserved", ULONG64 * 2), + ("Index", ULONG), + ("Size", ULONG), + ("ModBase", ULONG64), + ("Flags", ULONG), + ("Value", ULONG64), + ("Address", ULONG64), + ("Register", ULONG), + ("Scope", ULONG), + ("Tag", ULONG), + ("NameLen", ULONG), + ("MaxNameLen", ULONG), + ("Name", CHAR * (MAX_SYM_NAME + 1)), + ] + + +PSYM_INFO = POINTER(SYM_INFO) + + +class SYM_INFOW(Structure): + _fields_ = [ + ("SizeOfStruct", ULONG), + ("TypeIndex", ULONG), + ("Reserved", ULONG64 * 2), + ("Index", ULONG), + ("Size", ULONG), + ("ModBase", ULONG64), + ("Flags", ULONG), + ("Value", ULONG64), + ("Address", ULONG64), + ("Register", ULONG), + ("Scope", ULONG), + ("Tag", ULONG), + ("NameLen", ULONG), + ("MaxNameLen", ULONG), + ("Name", WCHAR * (MAX_SYM_NAME + 1)), + ] + + +PSYM_INFOW = POINTER(SYM_INFOW) + + +# =============================================================================== +# BOOL WINAPI SymFromName( +# __in HANDLE hProcess, +# __in PCTSTR Name, +# __inout PSYMBOL_INFO Symbol +# ); +# =============================================================================== +def SymFromName(hProcess, Name): + _SymFromNameA = windll.dbghelp.SymFromName + _SymFromNameA.argtypes = [HANDLE, LPSTR, PSYM_INFO] + _SymFromNameA.restype = bool + _SymFromNameA.errcheck = RaiseIfZero + + SymInfo = SYM_INFO() + SymInfo.SizeOfStruct = 88 # *don't modify*: sizeof(SYMBOL_INFO) in C. + SymInfo.MaxNameLen = MAX_SYM_NAME + + _SymFromNameA(hProcess, Name, byref(SymInfo)) + + return SymInfo + + +def SymFromNameW(hProcess, Name): + _SymFromNameW = windll.dbghelp.SymFromNameW + _SymFromNameW.argtypes = [HANDLE, LPWSTR, PSYM_INFOW] + _SymFromNameW.restype = bool + _SymFromNameW.errcheck = RaiseIfZero + + SymInfo = SYM_INFOW() + SymInfo.SizeOfStruct = 88 # *don't modify*: sizeof(SYMBOL_INFOW) in C. + SymInfo.MaxNameLen = MAX_SYM_NAME + + _SymFromNameW(hProcess, Name, byref(SymInfo)) + + return SymInfo + + +# =============================================================================== +# BOOL WINAPI SymFromAddr( +# __in HANDLE hProcess, +# __in DWORD64 Address, +# __out_opt PDWORD64 Displacement, +# __inout PSYMBOL_INFO Symbol +# ); +# =============================================================================== +def SymFromAddr(hProcess, Address): + _SymFromAddr = windll.dbghelp.SymFromAddr + _SymFromAddr.argtypes = [HANDLE, DWORD64, PDWORD64, PSYM_INFO] + _SymFromAddr.restype = bool + _SymFromAddr.errcheck = RaiseIfZero + + SymInfo = SYM_INFO() + SymInfo.SizeOfStruct = 88 # *don't modify*: sizeof(SYMBOL_INFO) in C. + SymInfo.MaxNameLen = MAX_SYM_NAME + + Displacement = DWORD64(0) + _SymFromAddr(hProcess, Address, byref(Displacement), byref(SymInfo)) + + return (Displacement.value, SymInfo) + + +def SymFromAddrW(hProcess, Address): + _SymFromAddr = windll.dbghelp.SymFromAddrW + _SymFromAddr.argtypes = [HANDLE, DWORD64, PDWORD64, PSYM_INFOW] + _SymFromAddr.restype = bool + _SymFromAddr.errcheck = RaiseIfZero + + SymInfo = SYM_INFOW() + SymInfo.SizeOfStruct = 88 # *don't modify*: sizeof(SYMBOL_INFOW) in C. + SymInfo.MaxNameLen = MAX_SYM_NAME + + Displacement = DWORD64(0) + _SymFromAddr(hProcess, Address, byref(Displacement), byref(SymInfo)) + + return (Displacement.value, SymInfo) + + +# =============================================================================== +# typedef struct _IMAGEHLP_SYMBOL64 { +# DWORD SizeOfStruct; +# DWORD64 Address; +# DWORD Size; +# DWORD Flags; +# DWORD MaxNameLength; +# CHAR Name[1]; +# } IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64; +# =============================================================================== +class IMAGEHLP_SYMBOL64(Structure): + _fields_ = [ + ("SizeOfStruct", DWORD), + ("Address", DWORD64), + ("Size", DWORD), + ("Flags", DWORD), + ("MaxNameLength", DWORD), + ("Name", CHAR * (MAX_SYM_NAME + 1)), + ] + + +PIMAGEHLP_SYMBOL64 = POINTER(IMAGEHLP_SYMBOL64) + + +# =============================================================================== +# typedef struct _IMAGEHLP_SYMBOLW64 { +# DWORD SizeOfStruct; +# DWORD64 Address; +# DWORD Size; +# DWORD Flags; +# DWORD MaxNameLength; +# WCHAR Name[1]; +# } IMAGEHLP_SYMBOLW64, *PIMAGEHLP_SYMBOLW64; +# =============================================================================== +class IMAGEHLP_SYMBOLW64(Structure): + _fields_ = [ + ("SizeOfStruct", DWORD), + ("Address", DWORD64), + ("Size", DWORD), + ("Flags", DWORD), + ("MaxNameLength", DWORD), + ("Name", WCHAR * (MAX_SYM_NAME + 1)), + ] + + +PIMAGEHLP_SYMBOLW64 = POINTER(IMAGEHLP_SYMBOLW64) + + +# =============================================================================== +# BOOL WINAPI SymGetSymFromAddr64( +# __in HANDLE hProcess, +# __in DWORD64 Address, +# __out_opt PDWORD64 Displacement, +# __inout PIMAGEHLP_SYMBOL64 Symbol +# ); +# =============================================================================== +def SymGetSymFromAddr64(hProcess, Address): + _SymGetSymFromAddr64 = windll.dbghelp.SymGetSymFromAddr64 + _SymGetSymFromAddr64.argtypes = [HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64] + _SymGetSymFromAddr64.restype = bool + _SymGetSymFromAddr64.errcheck = RaiseIfZero + + imagehlp_symbol64 = IMAGEHLP_SYMBOL64() + imagehlp_symbol64.SizeOfStruct = 32 # *don't modify*: sizeof(IMAGEHLP_SYMBOL64) in C. + imagehlp_symbol64.MaxNameLen = MAX_SYM_NAME + + Displacement = DWORD64(0) + _SymGetSymFromAddr64(hProcess, Address, byref(Displacement), byref(imagehlp_symbol64)) + + return (Displacement.value, imagehlp_symbol64) + + +# TODO: check for the 'W' version of SymGetSymFromAddr64() + + +# =============================================================================== +# typedef struct API_VERSION { +# USHORT MajorVersion; +# USHORT MinorVersion; +# USHORT Revision; +# USHORT Reserved; +# } API_VERSION, *LPAPI_VERSION; +# =============================================================================== +class API_VERSION(Structure): + _fields_ = [ + ("MajorVersion", USHORT), + ("MinorVersion", USHORT), + ("Revision", USHORT), + ("Reserved", USHORT), + ] + + +PAPI_VERSION = POINTER(API_VERSION) +LPAPI_VERSION = PAPI_VERSION + + +# =============================================================================== +# LPAPI_VERSION WINAPI ImagehlpApiVersion(void); +# =============================================================================== +def ImagehlpApiVersion(): + _ImagehlpApiVersion = windll.dbghelp.ImagehlpApiVersion + _ImagehlpApiVersion.restype = LPAPI_VERSION + + api_version = _ImagehlpApiVersion() + return api_version.contents + + +# =============================================================================== +# LPAPI_VERSION WINAPI ImagehlpApiVersionEx( +# __in LPAPI_VERSION AppVersion +# ); +# =============================================================================== +def ImagehlpApiVersionEx(MajorVersion, MinorVersion, Revision): + _ImagehlpApiVersionEx = windll.dbghelp.ImagehlpApiVersionEx + _ImagehlpApiVersionEx.argtypes = [LPAPI_VERSION] + _ImagehlpApiVersionEx.restype = LPAPI_VERSION + + api_version = API_VERSION(MajorVersion, MinorVersion, Revision, 0) + + ret_api_version = _ImagehlpApiVersionEx(byref(api_version)) + + return ret_api_version.contents + + +# =============================================================================== +# typedef enum { +# AddrMode1616, +# AddrMode1632, +# AddrModeReal, +# AddrModeFlat +# } ADDRESS_MODE; +# =============================================================================== +AddrMode1616 = 0 +AddrMode1632 = 1 +AddrModeReal = 2 +AddrModeFlat = 3 + +ADDRESS_MODE = DWORD # needed for the size of an ADDRESS_MODE (see ADDRESS64) + + +# =============================================================================== +# typedef struct _tagADDRESS64 { +# DWORD64 Offset; +# WORD Segment; +# ADDRESS_MODE Mode; +# } ADDRESS64, *LPADDRESS64; +# =============================================================================== +class ADDRESS64(Structure): + _fields_ = [ + ("Offset", DWORD64), + ("Segment", WORD), + ("Mode", ADDRESS_MODE), # it's a member of the ADDRESS_MODE enum. + ] + + +LPADDRESS64 = POINTER(ADDRESS64) + + +# =============================================================================== +# typedef struct _KDHELP64 { +# DWORD64 Thread; +# DWORD ThCallbackStack; +# DWORD ThCallbackBStore; +# DWORD NextCallback; +# DWORD FramePointer; +# DWORD64 KiCallUserMode; +# DWORD64 KeUserCallbackDispatcher; +# DWORD64 SystemRangeStart; +# DWORD64 KiUserExceptionDispatcher; +# DWORD64 StackBase; +# DWORD64 StackLimit; +# DWORD64 Reserved[5]; +# } KDHELP64, *PKDHELP64; +# =============================================================================== +class KDHELP64(Structure): + _fields_ = [ + ("Thread", DWORD64), + ("ThCallbackStack", DWORD), + ("ThCallbackBStore", DWORD), + ("NextCallback", DWORD), + ("FramePointer", DWORD), + ("KiCallUserMode", DWORD64), + ("KeUserCallbackDispatcher", DWORD64), + ("SystemRangeStart", DWORD64), + ("KiUserExceptionDispatcher", DWORD64), + ("StackBase", DWORD64), + ("StackLimit", DWORD64), + ("Reserved", DWORD64 * 5), + ] + + +PKDHELP64 = POINTER(KDHELP64) + + +# =============================================================================== +# typedef struct _tagSTACKFRAME64 { +# ADDRESS64 AddrPC; +# ADDRESS64 AddrReturn; +# ADDRESS64 AddrFrame; +# ADDRESS64 AddrStack; +# ADDRESS64 AddrBStore; +# PVOID FuncTableEntry; +# DWORD64 Params[4]; +# BOOL Far; +# BOOL Virtual; +# DWORD64 Reserved[3]; +# KDHELP64 KdHelp; +# } STACKFRAME64, *LPSTACKFRAME64; +# =============================================================================== +class STACKFRAME64(Structure): + _fields_ = [ + ("AddrPC", ADDRESS64), + ("AddrReturn", ADDRESS64), + ("AddrFrame", ADDRESS64), + ("AddrStack", ADDRESS64), + ("AddrBStore", ADDRESS64), + ("FuncTableEntry", PVOID), + ("Params", DWORD64 * 4), + ("Far", BOOL), + ("Virtual", BOOL), + ("Reserved", DWORD64 * 3), + ("KdHelp", KDHELP64), + ] + + +LPSTACKFRAME64 = POINTER(STACKFRAME64) + +# =============================================================================== +# BOOL CALLBACK ReadProcessMemoryProc64( +# __in HANDLE hProcess, +# __in DWORD64 lpBaseAddress, +# __out PVOID lpBuffer, +# __in DWORD nSize, +# __out LPDWORD lpNumberOfBytesRead +# ); +# =============================================================================== +PREAD_PROCESS_MEMORY_ROUTINE64 = WINFUNCTYPE(BOOL, HANDLE, DWORD64, PVOID, DWORD, LPDWORD) + +# =============================================================================== +# PVOID CALLBACK FunctionTableAccessProc64( +# __in HANDLE hProcess, +# __in DWORD64 AddrBase +# ); +# =============================================================================== +PFUNCTION_TABLE_ACCESS_ROUTINE64 = WINFUNCTYPE(PVOID, HANDLE, DWORD64) + +# =============================================================================== +# DWORD64 CALLBACK GetModuleBaseProc64( +# __in HANDLE hProcess, +# __in DWORD64 Address +# ); +# =============================================================================== +PGET_MODULE_BASE_ROUTINE64 = WINFUNCTYPE(DWORD64, HANDLE, DWORD64) + +# =============================================================================== +# DWORD64 CALLBACK GetModuleBaseProc64( +# __in HANDLE hProcess, +# __in DWORD64 Address +# ); +# =============================================================================== +PTRANSLATE_ADDRESS_ROUTINE64 = WINFUNCTYPE(DWORD64, HANDLE, DWORD64) + +# Valid machine types for StackWalk64 function +IMAGE_FILE_MACHINE_I386 = 0x014C # Intel x86 +IMAGE_FILE_MACHINE_IA64 = 0x0200 # Intel Itanium Processor Family (IPF) +IMAGE_FILE_MACHINE_AMD64 = 0x8664 # x64 (AMD64 or EM64T) + + +# =============================================================================== +# BOOL WINAPI StackWalk64( +# __in DWORD MachineType, +# __in HANDLE hProcess, +# __in HANDLE hThread, +# __inout LPSTACKFRAME64 StackFrame, +# __inout PVOID ContextRecord, +# __in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, +# __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, +# __in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, +# __in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress +# ); +# =============================================================================== +def StackWalk64( + MachineType, + hProcess, + hThread, + StackFrame, + ContextRecord=None, + ReadMemoryRoutine=None, + FunctionTableAccessRoutine=None, + GetModuleBaseRoutine=None, + TranslateAddress=None, +): + _StackWalk64 = windll.dbghelp.StackWalk64 + _StackWalk64.argtypes = [ + DWORD, + HANDLE, + HANDLE, + LPSTACKFRAME64, + PVOID, + PREAD_PROCESS_MEMORY_ROUTINE64, + PFUNCTION_TABLE_ACCESS_ROUTINE64, + PGET_MODULE_BASE_ROUTINE64, + PTRANSLATE_ADDRESS_ROUTINE64, + ] + _StackWalk64.restype = bool + + pReadMemoryRoutine = None + if ReadMemoryRoutine: + pReadMemoryRoutine = PREAD_PROCESS_MEMORY_ROUTINE64(ReadMemoryRoutine) + else: + pReadMemoryRoutine = ctypes.cast(None, PREAD_PROCESS_MEMORY_ROUTINE64) + + pFunctionTableAccessRoutine = None + if FunctionTableAccessRoutine: + pFunctionTableAccessRoutine = PFUNCTION_TABLE_ACCESS_ROUTINE64(FunctionTableAccessRoutine) + else: + pFunctionTableAccessRoutine = ctypes.cast(None, PFUNCTION_TABLE_ACCESS_ROUTINE64) + + pGetModuleBaseRoutine = None + if GetModuleBaseRoutine: + pGetModuleBaseRoutine = PGET_MODULE_BASE_ROUTINE64(GetModuleBaseRoutine) + else: + pGetModuleBaseRoutine = ctypes.cast(None, PGET_MODULE_BASE_ROUTINE64) + + pTranslateAddress = None + if TranslateAddress: + pTranslateAddress = PTRANSLATE_ADDRESS_ROUTINE64(TranslateAddress) + else: + pTranslateAddress = ctypes.cast(None, PTRANSLATE_ADDRESS_ROUTINE64) + + pContextRecord = None + if ContextRecord is None: + ContextRecord = GetThreadContext(hThread, raw=True) + pContextRecord = PCONTEXT(ContextRecord) + + # this function *DOESN'T* set last error [GetLastError()] properly most of the time. + ret = _StackWalk64( + MachineType, + hProcess, + hThread, + byref(StackFrame), + pContextRecord, + pReadMemoryRoutine, + pFunctionTableAccessRoutine, + pGetModuleBaseRoutine, + pTranslateAddress, + ) + + return ret + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/defines.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/defines.py new file mode 100644 index 0000000..d38d609 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/defines.py @@ -0,0 +1,737 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Common definitions. +""" + +# TODO +# + add TCHAR and related types? + +__revision__ = "$Id$" + +import ctypes +import functools +from winappdbg import compat + +# ------------------------------------------------------------------------------ + +# Some stuff from ctypes we'll be using very frequently. +addressof = ctypes.addressof +sizeof = ctypes.sizeof +SIZEOF = ctypes.sizeof +POINTER = ctypes.POINTER +Structure = ctypes.Structure +Union = ctypes.Union +WINFUNCTYPE = ctypes.WINFUNCTYPE +windll = ctypes.windll + +# The IronPython implementation of byref() was giving me problems, +# so I'm replacing it with the slower pointer() function. +try: + ctypes.c_void_p(ctypes.byref(ctypes.c_char())) # this fails in IronPython + byref = ctypes.byref +except TypeError: + byref = ctypes.pointer + +# XXX DEBUG +# The following code can be enabled to make the Win32 API wrappers log to +# standard output the dll and function names, the parameter values and the +# return value for each call. + +##WIN32_VERBOSE_MODE = True +WIN32_VERBOSE_MODE = False + +if WIN32_VERBOSE_MODE: + + class WinDllHook(object): + def __getattr__(self, name): + if name.startswith("_"): + return object.__getattr__(self, name) + return WinFuncHook(name) + + class WinFuncHook(object): + def __init__(self, name): + self.__name = name + + def __getattr__(self, name): + if name.startswith("_"): + return object.__getattr__(self, name) + return WinCallHook(self.__name, name) + + class WinCallHook(object): + def __init__(self, dllname, funcname): + self.__dllname = dllname + self.__funcname = funcname + self.__func = getattr(getattr(ctypes.windll, dllname), funcname) + + def __copy_attribute(self, attribute): + try: + value = getattr(self, attribute) + setattr(self.__func, attribute, value) + except AttributeError: + try: + delattr(self.__func, attribute) + except AttributeError: + pass + + def __call__(self, *argv): + self.__copy_attribute("argtypes") + self.__copy_attribute("restype") + self.__copy_attribute("errcheck") + print("-" * 10) + print("%s ! %s %r" % (self.__dllname, self.__funcname, argv)) + retval = self.__func(*argv) + print("== %r" % (retval,)) + return retval + + windll = WinDllHook() + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + + +def RaiseIfZero(result, func=None, arguments=()): + """ + Error checking for most Win32 API calls. + + The function is assumed to return an integer, which is C{0} on error. + In that case the C{WindowsError} exception is raised. + """ + if not result: + raise ctypes.WinError() + return result + + +def RaiseIfNotZero(result, func=None, arguments=()): + """ + Error checking for some odd Win32 API calls. + + The function is assumed to return an integer, which is zero on success. + If the return value is nonzero the C{WindowsError} exception is raised. + + This is mostly useful for free() like functions, where the return value is + the pointer to the memory block on failure or a C{NULL} pointer on success. + """ + if result: + raise ctypes.WinError() + return result + + +def RaiseIfNotErrorSuccess(result, func=None, arguments=()): + """ + Error checking for Win32 Registry API calls. + + The function is assumed to return a Win32 error code. If the code is not + C{ERROR_SUCCESS} then a C{WindowsError} exception is raised. + """ + if result != ERROR_SUCCESS: + raise ctypes.WinError(result) + return result + + +class GuessStringType(object): + """ + Decorator that guesses the correct version (A or W) to call + based on the types of the strings passed as parameters. + + Calls the B{ANSI} version if the only string types are ANSI. + + Calls the B{Unicode} version if Unicode or mixed string types are passed. + + The default if no string arguments are passed depends on the value of the + L{t_default} class variable. + + @type fn_ansi: function + @ivar fn_ansi: ANSI version of the API function to call. + @type fn_unicode: function + @ivar fn_unicode: Unicode (wide) version of the API function to call. + + @type t_default: type + @cvar t_default: Default string type to use. + Possible values are: + - type('') for ANSI + - type(u'') for Unicode + """ + + # ANSI and Unicode types + t_ansi = type("") + t_unicode = type("") + + # Default is ANSI for Python 2.x + t_default = t_ansi + + def __init__(self, fn_ansi, fn_unicode): + """ + @type fn_ansi: function + @param fn_ansi: ANSI version of the API function to call. + @type fn_unicode: function + @param fn_unicode: Unicode (wide) version of the API function to call. + """ + self.fn_ansi = fn_ansi + self.fn_unicode = fn_unicode + + # Copy the wrapped function attributes. + try: + self.__name__ = self.fn_ansi.__name__[:-1] # remove the A or W + except AttributeError: + pass + try: + self.__module__ = self.fn_ansi.__module__ + except AttributeError: + pass + try: + self.__doc__ = self.fn_ansi.__doc__ + except AttributeError: + pass + + def __call__(self, *argv, **argd): + # Shortcut to self.t_ansi + t_ansi = self.t_ansi + + # Get the types of all arguments for the function + v_types = [type(item) for item in argv] + v_types.extend([type(value) for (key, value) in compat.iteritems(argd)]) + + # Get the appropriate function for the default type + if self.t_default == t_ansi: + fn = self.fn_ansi + else: + fn = self.fn_unicode + + # If at least one argument is a Unicode string... + if self.t_unicode in v_types: + # If al least one argument is an ANSI string, + # convert all ANSI strings to Unicode + if t_ansi in v_types: + argv = list(argv) + for index in compat.xrange(len(argv)): + if v_types[index] == t_ansi: + argv[index] = compat.unicode(argv[index]) + for key, value in argd.items(): + if type(value) == t_ansi: + argd[key] = compat.unicode(value) + + # Use the W version + fn = self.fn_unicode + + # If at least one argument is an ANSI string, + # but there are no Unicode strings... + elif t_ansi in v_types: + # Use the A version + fn = self.fn_ansi + + # Call the function and return the result + return fn(*argv, **argd) + + +class DefaultStringType(object): + """ + Decorator that uses the default version (A or W) to call + based on the configuration of the L{GuessStringType} decorator. + + @see: L{GuessStringType.t_default} + + @type fn_ansi: function + @ivar fn_ansi: ANSI version of the API function to call. + @type fn_unicode: function + @ivar fn_unicode: Unicode (wide) version of the API function to call. + """ + + def __init__(self, fn_ansi, fn_unicode): + """ + @type fn_ansi: function + @param fn_ansi: ANSI version of the API function to call. + @type fn_unicode: function + @param fn_unicode: Unicode (wide) version of the API function to call. + """ + self.fn_ansi = fn_ansi + self.fn_unicode = fn_unicode + + # Copy the wrapped function attributes. + try: + self.__name__ = self.fn_ansi.__name__[:-1] # remove the A or W + except AttributeError: + pass + try: + self.__module__ = self.fn_ansi.__module__ + except AttributeError: + pass + try: + self.__doc__ = self.fn_ansi.__doc__ + except AttributeError: + pass + + def __call__(self, *argv, **argd): + # Get the appropriate function based on the default. + if GuessStringType.t_default == GuessStringType.t_ansi: + fn = self.fn_ansi + else: + fn = self.fn_unicode + + # Call the function and return the result + return fn(*argv, **argd) + + +def MakeANSIVersion(fn): + """ + Decorator that generates an ANSI version of a Unicode (wide) only API call. + + @type fn: callable + @param fn: Unicode (wide) version of the API function to call. + """ + + @functools.wraps(fn) + def wrapper(*argv, **argd): + t_ansi = GuessStringType.t_ansi + t_unicode = GuessStringType.t_unicode + v_types = [type(item) for item in argv] + v_types.extend([type(value) for (key, value) in compat.iteritems(argd)]) + if t_ansi in v_types: + argv = list(argv) + for index in compat.xrange(len(argv)): + if v_types[index] == t_ansi: + argv[index] = t_unicode(argv[index]) + for key, value in argd.items(): + if type(value) == t_ansi: + argd[key] = t_unicode(value) + return fn(*argv, **argd) + + return wrapper + + +def MakeWideVersion(fn): + """ + Decorator that generates a Unicode (wide) version of an ANSI only API call. + + @type fn: callable + @param fn: ANSI version of the API function to call. + """ + + @functools.wraps(fn) + def wrapper(*argv, **argd): + t_ansi = GuessStringType.t_ansi + t_unicode = GuessStringType.t_unicode + v_types = [type(item) for item in argv] + v_types.extend([type(value) for (key, value) in compat.iteritems(argd)]) + if t_unicode in v_types: + argv = list(argv) + for index in compat.xrange(len(argv)): + if v_types[index] == t_unicode: + argv[index] = t_ansi(argv[index]) + for key, value in argd.items(): + if type(value) == t_unicode: + argd[key] = t_ansi(value) + return fn(*argv, **argd) + + return wrapper + + +# --- Types -------------------------------------------------------------------- +# http://msdn.microsoft.com/en-us/library/aa383751(v=vs.85).aspx + +# Map of basic C types to Win32 types +LPVOID = ctypes.c_void_p +CHAR = ctypes.c_char +WCHAR = ctypes.c_wchar +BYTE = ctypes.c_ubyte +SBYTE = ctypes.c_byte +WORD = ctypes.c_uint16 +SWORD = ctypes.c_int16 +DWORD = ctypes.c_uint32 +SDWORD = ctypes.c_int32 +QWORD = ctypes.c_uint64 +SQWORD = ctypes.c_int64 +SHORT = ctypes.c_short +USHORT = ctypes.c_ushort +INT = ctypes.c_int +UINT = ctypes.c_uint +LONG = ctypes.c_long +ULONG = ctypes.c_ulong +LONGLONG = ctypes.c_int64 # c_longlong +ULONGLONG = ctypes.c_uint64 # c_ulonglong +LPSTR = ctypes.c_char_p +LPWSTR = ctypes.c_wchar_p +INT8 = ctypes.c_int8 +INT16 = ctypes.c_int16 +INT32 = ctypes.c_int32 +INT64 = ctypes.c_int64 +UINT8 = ctypes.c_uint8 +UINT16 = ctypes.c_uint16 +UINT32 = ctypes.c_uint32 +UINT64 = ctypes.c_uint64 +LONG32 = ctypes.c_int32 +LONG64 = ctypes.c_int64 +ULONG32 = ctypes.c_uint32 +ULONG64 = ctypes.c_uint64 +DWORD32 = ctypes.c_uint32 +DWORD64 = ctypes.c_uint64 +BOOL = ctypes.c_int +FLOAT = ctypes.c_float + +# Map size_t to SIZE_T +try: + SIZE_T = ctypes.c_size_t + SSIZE_T = ctypes.c_ssize_t +except AttributeError: + # Size of a pointer + SIZE_T = {1: BYTE, 2: WORD, 4: DWORD, 8: QWORD}[sizeof(LPVOID)] + SSIZE_T = {1: SBYTE, 2: SWORD, 4: SDWORD, 8: SQWORD}[sizeof(LPVOID)] +PSIZE_T = POINTER(SIZE_T) + +# Not really pointers but pointer-sized integers +DWORD_PTR = SIZE_T +ULONG_PTR = SIZE_T +LONG_PTR = SIZE_T + +# Other Win32 types, more may be added as needed +PVOID = LPVOID +PPVOID = POINTER(PVOID) +PSTR = LPSTR +PWSTR = LPWSTR +PCHAR = LPSTR +PWCHAR = LPWSTR +LPBYTE = POINTER(BYTE) +LPSBYTE = POINTER(SBYTE) +LPWORD = POINTER(WORD) +LPSWORD = POINTER(SWORD) +LPDWORD = POINTER(DWORD) +LPSDWORD = POINTER(SDWORD) +LPULONG = POINTER(ULONG) +LPLONG = POINTER(LONG) +PDWORD = LPDWORD +PDWORD_PTR = POINTER(DWORD_PTR) +PULONG = LPULONG +PLONG = LPLONG +CCHAR = CHAR +BOOLEAN = BYTE +PBOOL = POINTER(BOOL) +LPBOOL = PBOOL +TCHAR = CHAR # XXX ANSI by default? +UCHAR = BYTE +DWORDLONG = ULONGLONG +LPDWORD32 = POINTER(DWORD32) +LPULONG32 = POINTER(ULONG32) +LPDWORD64 = POINTER(DWORD64) +LPULONG64 = POINTER(ULONG64) +PDWORD32 = LPDWORD32 +PULONG32 = LPULONG32 +PDWORD64 = LPDWORD64 +PULONG64 = LPULONG64 +ATOM = WORD +HANDLE = LPVOID +PHANDLE = POINTER(HANDLE) +LPHANDLE = PHANDLE +HMODULE = HANDLE +HINSTANCE = HANDLE +HTASK = HANDLE +HKEY = HANDLE +PHKEY = POINTER(HKEY) +HDESK = HANDLE +HRSRC = HANDLE +HSTR = HANDLE +HWINSTA = HANDLE +HKL = HANDLE +HDWP = HANDLE +HFILE = HANDLE +HRESULT = LONG +HGLOBAL = HANDLE +HLOCAL = HANDLE +HGDIOBJ = HANDLE +HDC = HGDIOBJ +HRGN = HGDIOBJ +HBITMAP = HGDIOBJ +HPALETTE = HGDIOBJ +HPEN = HGDIOBJ +HBRUSH = HGDIOBJ +HMF = HGDIOBJ +HEMF = HGDIOBJ +HENHMETAFILE = HGDIOBJ +HMETAFILE = HGDIOBJ +HMETAFILEPICT = HGDIOBJ +HWND = HANDLE +NTSTATUS = LONG +PNTSTATUS = POINTER(NTSTATUS) +KAFFINITY = ULONG_PTR +RVA = DWORD +RVA64 = QWORD +WPARAM = DWORD +LPARAM = LPVOID +LRESULT = LPVOID +ACCESS_MASK = DWORD +REGSAM = ACCESS_MASK +PACCESS_MASK = POINTER(ACCESS_MASK) +PREGSAM = POINTER(REGSAM) + +# Since the SID is an opaque structure, let's treat its pointers as void* +PSID = PVOID + +# typedef union _LARGE_INTEGER { +# struct { +# DWORD LowPart; +# LONG HighPart; +# } ; +# struct { +# DWORD LowPart; +# LONG HighPart; +# } u; +# LONGLONG QuadPart; +# } LARGE_INTEGER, +# *PLARGE_INTEGER; + +# XXX TODO + + +# typedef struct _FLOAT128 { +# __int64 LowPart; +# __int64 HighPart; +# } FLOAT128; +class FLOAT128(Structure): + _fields_ = [ + ("LowPart", QWORD), + ("HighPart", QWORD), + ] + + +PFLOAT128 = POINTER(FLOAT128) + + +# typedef struct DECLSPEC_ALIGN(16) _M128A { +# ULONGLONG Low; +# LONGLONG High; +# } M128A, *PM128A; +class M128A(Structure): + _fields_ = [ + ("Low", ULONGLONG), + ("High", LONGLONG), + ] + + +PM128A = POINTER(M128A) + +# --- Constants ---------------------------------------------------------------- + +NULL = None +INFINITE = -1 +TRUE = 1 +FALSE = 0 + +# http://blogs.msdn.com/oldnewthing/archive/2004/08/26/220873.aspx +ANYSIZE_ARRAY = 1 + +# Invalid handle value is -1 casted to void pointer. +try: + INVALID_HANDLE_VALUE = ctypes.c_void_p(-1).value # -1 #0xFFFFFFFF +except TypeError: + if sizeof(ctypes.c_void_p) == 4: + INVALID_HANDLE_VALUE = 0xFFFFFFFF + elif sizeof(ctypes.c_void_p) == 8: + INVALID_HANDLE_VALUE = 0xFFFFFFFFFFFFFFFF + else: + raise + +MAX_MODULE_NAME32 = 255 +MAX_PATH = 260 + +# Error codes +# TODO maybe add more error codes? +# if they're too many they could be pickled instead, +# or at the very least put in a new file +ERROR_SUCCESS = 0 +ERROR_INVALID_FUNCTION = 1 +ERROR_FILE_NOT_FOUND = 2 +ERROR_PATH_NOT_FOUND = 3 +ERROR_ACCESS_DENIED = 5 +ERROR_INVALID_HANDLE = 6 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_INVALID_DRIVE = 15 +ERROR_NO_MORE_FILES = 18 +ERROR_BAD_LENGTH = 24 +ERROR_HANDLE_EOF = 38 +ERROR_HANDLE_DISK_FULL = 39 +ERROR_NOT_SUPPORTED = 50 +ERROR_FILE_EXISTS = 80 +ERROR_INVALID_PARAMETER = 87 +ERROR_BUFFER_OVERFLOW = 111 +ERROR_DISK_FULL = 112 +ERROR_CALL_NOT_IMPLEMENTED = 120 +ERROR_SEM_TIMEOUT = 121 +ERROR_INSUFFICIENT_BUFFER = 122 +ERROR_INVALID_NAME = 123 +ERROR_MOD_NOT_FOUND = 126 +ERROR_PROC_NOT_FOUND = 127 +ERROR_DIR_NOT_EMPTY = 145 +ERROR_BAD_THREADID_ADDR = 159 +ERROR_BAD_ARGUMENTS = 160 +ERROR_BAD_PATHNAME = 161 +ERROR_ALREADY_EXISTS = 183 +ERROR_INVALID_FLAG_NUMBER = 186 +ERROR_ENVVAR_NOT_FOUND = 203 +ERROR_FILENAME_EXCED_RANGE = 206 +ERROR_MORE_DATA = 234 + +WAIT_TIMEOUT = 258 + +ERROR_NO_MORE_ITEMS = 259 +ERROR_PARTIAL_COPY = 299 +ERROR_INVALID_ADDRESS = 487 +ERROR_THREAD_NOT_IN_PROCESS = 566 +ERROR_CONTROL_C_EXIT = 572 +ERROR_UNHANDLED_EXCEPTION = 574 +ERROR_ASSERTION_FAILURE = 668 +ERROR_WOW_ASSERTION = 670 + +ERROR_DBG_EXCEPTION_NOT_HANDLED = 688 +ERROR_DBG_REPLY_LATER = 689 +ERROR_DBG_UNABLE_TO_PROVIDE_HANDLE = 690 +ERROR_DBG_TERMINATE_THREAD = 691 +ERROR_DBG_TERMINATE_PROCESS = 692 +ERROR_DBG_CONTROL_C = 693 +ERROR_DBG_PRINTEXCEPTION_C = 694 +ERROR_DBG_RIPEXCEPTION = 695 +ERROR_DBG_CONTROL_BREAK = 696 +ERROR_DBG_COMMAND_EXCEPTION = 697 +ERROR_DBG_EXCEPTION_HANDLED = 766 +ERROR_DBG_CONTINUE = 767 + +ERROR_ELEVATION_REQUIRED = 740 +ERROR_NOACCESS = 998 + +ERROR_CIRCULAR_DEPENDENCY = 1059 +ERROR_SERVICE_DOES_NOT_EXIST = 1060 +ERROR_SERVICE_CANNOT_ACCEPT_CTRL = 1061 +ERROR_SERVICE_NOT_ACTIVE = 1062 +ERROR_FAILED_SERVICE_CONTROLLER_CONNECT = 1063 +ERROR_EXCEPTION_IN_SERVICE = 1064 +ERROR_DATABASE_DOES_NOT_EXIST = 1065 +ERROR_SERVICE_SPECIFIC_ERROR = 1066 +ERROR_PROCESS_ABORTED = 1067 +ERROR_SERVICE_DEPENDENCY_FAIL = 1068 +ERROR_SERVICE_LOGON_FAILED = 1069 +ERROR_SERVICE_START_HANG = 1070 +ERROR_INVALID_SERVICE_LOCK = 1071 +ERROR_SERVICE_MARKED_FOR_DELETE = 1072 +ERROR_SERVICE_EXISTS = 1073 +ERROR_ALREADY_RUNNING_LKG = 1074 +ERROR_SERVICE_DEPENDENCY_DELETED = 1075 +ERROR_BOOT_ALREADY_ACCEPTED = 1076 +ERROR_SERVICE_NEVER_STARTED = 1077 +ERROR_DUPLICATE_SERVICE_NAME = 1078 +ERROR_DIFFERENT_SERVICE_ACCOUNT = 1079 +ERROR_CANNOT_DETECT_DRIVER_FAILURE = 1080 +ERROR_CANNOT_DETECT_PROCESS_ABORT = 1081 +ERROR_NO_RECOVERY_PROGRAM = 1082 +ERROR_SERVICE_NOT_IN_EXE = 1083 +ERROR_NOT_SAFEBOOT_SERVICE = 1084 + +ERROR_DEBUGGER_INACTIVE = 1284 + +ERROR_PRIVILEGE_NOT_HELD = 1314 + +ERROR_NONE_MAPPED = 1332 + +RPC_S_SERVER_UNAVAILABLE = 1722 + +# Standard access rights +import sys + +if sys.version_info[0] >= 3: + long = int + +DELETE = long(0x00010000) +READ_CONTROL = long(0x00020000) +WRITE_DAC = long(0x00040000) +WRITE_OWNER = long(0x00080000) +SYNCHRONIZE = long(0x00100000) +STANDARD_RIGHTS_REQUIRED = long(0x000F0000) +STANDARD_RIGHTS_READ = READ_CONTROL +STANDARD_RIGHTS_WRITE = READ_CONTROL +STANDARD_RIGHTS_EXECUTE = READ_CONTROL +STANDARD_RIGHTS_ALL = long(0x001F0000) +SPECIFIC_RIGHTS_ALL = long(0x0000FFFF) + +# --- Structures --------------------------------------------------------------- + + +# typedef struct _LSA_UNICODE_STRING { +# USHORT Length; +# USHORT MaximumLength; +# PWSTR Buffer; +# } LSA_UNICODE_STRING, +# *PLSA_UNICODE_STRING, +# UNICODE_STRING, +# *PUNICODE_STRING; +class UNICODE_STRING(Structure): + _fields_ = [ + ("Length", USHORT), + ("MaximumLength", USHORT), + ("Buffer", PVOID), + ] + + +# From MSDN: +# +# typedef struct _GUID { +# DWORD Data1; +# WORD Data2; +# WORD Data3; +# BYTE Data4[8]; +# } GUID; +class GUID(Structure): + _fields_ = [ + ("Data1", DWORD), + ("Data2", WORD), + ("Data3", WORD), + ("Data4", BYTE * 8), + ] + + +# From MSDN: +# +# typedef struct _LIST_ENTRY { +# struct _LIST_ENTRY *Flink; +# struct _LIST_ENTRY *Blink; +# } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY; +class LIST_ENTRY(Structure): + _fields_ = [ + ("Flink", PVOID), # POINTER(LIST_ENTRY) + ("Blink", PVOID), # POINTER(LIST_ENTRY) + ] + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +##__all__ = [_x for _x in _all if not _x.startswith('_')] +##__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/gdi32.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/gdi32.py new file mode 100644 index 0000000..77c5b13 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/gdi32.py @@ -0,0 +1,526 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for gdi32.dll in ctypes. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.kernel32 import GetLastError, SetLastError + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- Helpers ------------------------------------------------------------------ + +# --- Types -------------------------------------------------------------------- + +# --- Constants ---------------------------------------------------------------- + +# GDI object types +OBJ_PEN = 1 +OBJ_BRUSH = 2 +OBJ_DC = 3 +OBJ_METADC = 4 +OBJ_PAL = 5 +OBJ_FONT = 6 +OBJ_BITMAP = 7 +OBJ_REGION = 8 +OBJ_METAFILE = 9 +OBJ_MEMDC = 10 +OBJ_EXTPEN = 11 +OBJ_ENHMETADC = 12 +OBJ_ENHMETAFILE = 13 +OBJ_COLORSPACE = 14 +GDI_OBJ_LAST = OBJ_COLORSPACE + +# Ternary raster operations +SRCCOPY = 0x00CC0020 # dest = source +SRCPAINT = 0x00EE0086 # dest = source OR dest +SRCAND = 0x008800C6 # dest = source AND dest +SRCINVERT = 0x00660046 # dest = source XOR dest +SRCERASE = 0x00440328 # dest = source AND (NOT dest) +NOTSRCCOPY = 0x00330008 # dest = (NOT source) +NOTSRCERASE = 0x001100A6 # dest = (NOT src) AND (NOT dest) +MERGECOPY = 0x00C000CA # dest = (source AND pattern) +MERGEPAINT = 0x00BB0226 # dest = (NOT source) OR dest +PATCOPY = 0x00F00021 # dest = pattern +PATPAINT = 0x00FB0A09 # dest = DPSnoo +PATINVERT = 0x005A0049 # dest = pattern XOR dest +DSTINVERT = 0x00550009 # dest = (NOT dest) +BLACKNESS = 0x00000042 # dest = BLACK +WHITENESS = 0x00FF0062 # dest = WHITE +NOMIRRORBITMAP = 0x80000000 # Do not Mirror the bitmap in this call +CAPTUREBLT = 0x40000000 # Include layered windows + +# Region flags +ERROR = 0 +NULLREGION = 1 +SIMPLEREGION = 2 +COMPLEXREGION = 3 +RGN_ERROR = ERROR + +# CombineRgn() styles +RGN_AND = 1 +RGN_OR = 2 +RGN_XOR = 3 +RGN_DIFF = 4 +RGN_COPY = 5 +RGN_MIN = RGN_AND +RGN_MAX = RGN_COPY + +# StretchBlt() modes +BLACKONWHITE = 1 +WHITEONBLACK = 2 +COLORONCOLOR = 3 +HALFTONE = 4 +MAXSTRETCHBLTMODE = 4 +STRETCH_ANDSCANS = BLACKONWHITE +STRETCH_ORSCANS = WHITEONBLACK +STRETCH_DELETESCANS = COLORONCOLOR +STRETCH_HALFTONE = HALFTONE + +# PolyFill() modes +ALTERNATE = 1 +WINDING = 2 +POLYFILL_LAST = 2 + +# Layout orientation options +LAYOUT_RTL = 0x00000001 # Right to left +LAYOUT_BTT = 0x00000002 # Bottom to top +LAYOUT_VBH = 0x00000004 # Vertical before horizontal +LAYOUT_ORIENTATIONMASK = LAYOUT_RTL + LAYOUT_BTT + LAYOUT_VBH +LAYOUT_BITMAPORIENTATIONPRESERVED = 0x00000008 + +# Stock objects +WHITE_BRUSH = 0 +LTGRAY_BRUSH = 1 +GRAY_BRUSH = 2 +DKGRAY_BRUSH = 3 +BLACK_BRUSH = 4 +NULL_BRUSH = 5 +HOLLOW_BRUSH = NULL_BRUSH +WHITE_PEN = 6 +BLACK_PEN = 7 +NULL_PEN = 8 +OEM_FIXED_FONT = 10 +ANSI_FIXED_FONT = 11 +ANSI_VAR_FONT = 12 +SYSTEM_FONT = 13 +DEVICE_DEFAULT_FONT = 14 +DEFAULT_PALETTE = 15 +SYSTEM_FIXED_FONT = 16 + +# Metafile functions +META_SETBKCOLOR = 0x0201 +META_SETBKMODE = 0x0102 +META_SETMAPMODE = 0x0103 +META_SETROP2 = 0x0104 +META_SETRELABS = 0x0105 +META_SETPOLYFILLMODE = 0x0106 +META_SETSTRETCHBLTMODE = 0x0107 +META_SETTEXTCHAREXTRA = 0x0108 +META_SETTEXTCOLOR = 0x0209 +META_SETTEXTJUSTIFICATION = 0x020A +META_SETWINDOWORG = 0x020B +META_SETWINDOWEXT = 0x020C +META_SETVIEWPORTORG = 0x020D +META_SETVIEWPORTEXT = 0x020E +META_OFFSETWINDOWORG = 0x020F +META_SCALEWINDOWEXT = 0x0410 +META_OFFSETVIEWPORTORG = 0x0211 +META_SCALEVIEWPORTEXT = 0x0412 +META_LINETO = 0x0213 +META_MOVETO = 0x0214 +META_EXCLUDECLIPRECT = 0x0415 +META_INTERSECTCLIPRECT = 0x0416 +META_ARC = 0x0817 +META_ELLIPSE = 0x0418 +META_FLOODFILL = 0x0419 +META_PIE = 0x081A +META_RECTANGLE = 0x041B +META_ROUNDRECT = 0x061C +META_PATBLT = 0x061D +META_SAVEDC = 0x001E +META_SETPIXEL = 0x041F +META_OFFSETCLIPRGN = 0x0220 +META_TEXTOUT = 0x0521 +META_BITBLT = 0x0922 +META_STRETCHBLT = 0x0B23 +META_POLYGON = 0x0324 +META_POLYLINE = 0x0325 +META_ESCAPE = 0x0626 +META_RESTOREDC = 0x0127 +META_FILLREGION = 0x0228 +META_FRAMEREGION = 0x0429 +META_INVERTREGION = 0x012A +META_PAINTREGION = 0x012B +META_SELECTCLIPREGION = 0x012C +META_SELECTOBJECT = 0x012D +META_SETTEXTALIGN = 0x012E +META_CHORD = 0x0830 +META_SETMAPPERFLAGS = 0x0231 +META_EXTTEXTOUT = 0x0A32 +META_SETDIBTODEV = 0x0D33 +META_SELECTPALETTE = 0x0234 +META_REALIZEPALETTE = 0x0035 +META_ANIMATEPALETTE = 0x0436 +META_SETPALENTRIES = 0x0037 +META_POLYPOLYGON = 0x0538 +META_RESIZEPALETTE = 0x0139 +META_DIBBITBLT = 0x0940 +META_DIBSTRETCHBLT = 0x0B41 +META_DIBCREATEPATTERNBRUSH = 0x0142 +META_STRETCHDIB = 0x0F43 +META_EXTFLOODFILL = 0x0548 +META_SETLAYOUT = 0x0149 +META_DELETEOBJECT = 0x01F0 +META_CREATEPALETTE = 0x00F7 +META_CREATEPATTERNBRUSH = 0x01F9 +META_CREATEPENINDIRECT = 0x02FA +META_CREATEFONTINDIRECT = 0x02FB +META_CREATEBRUSHINDIRECT = 0x02FC +META_CREATEREGION = 0x06FF + +# Metafile escape codes +NEWFRAME = 1 +ABORTDOC = 2 +NEXTBAND = 3 +SETCOLORTABLE = 4 +GETCOLORTABLE = 5 +FLUSHOUTPUT = 6 +DRAFTMODE = 7 +QUERYESCSUPPORT = 8 +SETABORTPROC = 9 +STARTDOC = 10 +ENDDOC = 11 +GETPHYSPAGESIZE = 12 +GETPRINTINGOFFSET = 13 +GETSCALINGFACTOR = 14 +MFCOMMENT = 15 +GETPENWIDTH = 16 +SETCOPYCOUNT = 17 +SELECTPAPERSOURCE = 18 +DEVICEDATA = 19 +PASSTHROUGH = 19 +GETTECHNOLGY = 20 +GETTECHNOLOGY = 20 +SETLINECAP = 21 +SETLINEJOIN = 22 +SETMITERLIMIT = 23 +BANDINFO = 24 +DRAWPATTERNRECT = 25 +GETVECTORPENSIZE = 26 +GETVECTORBRUSHSIZE = 27 +ENABLEDUPLEX = 28 +GETSETPAPERBINS = 29 +GETSETPRINTORIENT = 30 +ENUMPAPERBINS = 31 +SETDIBSCALING = 32 +EPSPRINTING = 33 +ENUMPAPERMETRICS = 34 +GETSETPAPERMETRICS = 35 +POSTSCRIPT_DATA = 37 +POSTSCRIPT_IGNORE = 38 +MOUSETRAILS = 39 +GETDEVICEUNITS = 42 +GETEXTENDEDTEXTMETRICS = 256 +GETEXTENTTABLE = 257 +GETPAIRKERNTABLE = 258 +GETTRACKKERNTABLE = 259 +EXTTEXTOUT = 512 +GETFACENAME = 513 +DOWNLOADFACE = 514 +ENABLERELATIVEWIDTHS = 768 +ENABLEPAIRKERNING = 769 +SETKERNTRACK = 770 +SETALLJUSTVALUES = 771 +SETCHARSET = 772 +STRETCHBLT = 2048 +METAFILE_DRIVER = 2049 +GETSETSCREENPARAMS = 3072 +QUERYDIBSUPPORT = 3073 +BEGIN_PATH = 4096 +CLIP_TO_PATH = 4097 +END_PATH = 4098 +EXT_DEVICE_CAPS = 4099 +RESTORE_CTM = 4100 +SAVE_CTM = 4101 +SET_ARC_DIRECTION = 4102 +SET_BACKGROUND_COLOR = 4103 +SET_POLY_MODE = 4104 +SET_SCREEN_ANGLE = 4105 +SET_SPREAD = 4106 +TRANSFORM_CTM = 4107 +SET_CLIP_BOX = 4108 +SET_BOUNDS = 4109 +SET_MIRROR_MODE = 4110 +OPENCHANNEL = 4110 +DOWNLOADHEADER = 4111 +CLOSECHANNEL = 4112 +POSTSCRIPT_PASSTHROUGH = 4115 +ENCAPSULATED_POSTSCRIPT = 4116 +POSTSCRIPT_IDENTIFY = 4117 +POSTSCRIPT_INJECTION = 4118 +CHECKJPEGFORMAT = 4119 +CHECKPNGFORMAT = 4120 +GET_PS_FEATURESETTING = 4121 +GDIPLUS_TS_QUERYVER = 4122 +GDIPLUS_TS_RECORD = 4123 +SPCLPASSTHROUGH2 = 4568 + +# --- Structures --------------------------------------------------------------- + + +# typedef struct _RECT { +# LONG left; +# LONG top; +# LONG right; +# LONG bottom; +# }RECT, *PRECT; +class RECT(Structure): + _fields_ = [ + ("left", LONG), + ("top", LONG), + ("right", LONG), + ("bottom", LONG), + ] + + +PRECT = POINTER(RECT) +LPRECT = PRECT + + +# typedef struct tagPOINT { +# LONG x; +# LONG y; +# } POINT; +class POINT(Structure): + _fields_ = [ + ("x", LONG), + ("y", LONG), + ] + + +PPOINT = POINTER(POINT) +LPPOINT = PPOINT + + +# typedef struct tagBITMAP { +# LONG bmType; +# LONG bmWidth; +# LONG bmHeight; +# LONG bmWidthBytes; +# WORD bmPlanes; +# WORD bmBitsPixel; +# LPVOID bmBits; +# } BITMAP, *PBITMAP; +class BITMAP(Structure): + _fields_ = [ + ("bmType", LONG), + ("bmWidth", LONG), + ("bmHeight", LONG), + ("bmWidthBytes", LONG), + ("bmPlanes", WORD), + ("bmBitsPixel", WORD), + ("bmBits", LPVOID), + ] + + +PBITMAP = POINTER(BITMAP) +LPBITMAP = PBITMAP + +# --- High level classes ------------------------------------------------------- + +# --- gdi32.dll ---------------------------------------------------------------- + + +# HDC GetDC( +# __in HWND hWnd +# ); +def GetDC(hWnd): + _GetDC = windll.gdi32.GetDC + _GetDC.argtypes = [HWND] + _GetDC.restype = HDC + _GetDC.errcheck = RaiseIfZero + return _GetDC(hWnd) + + +# HDC GetWindowDC( +# __in HWND hWnd +# ); +def GetWindowDC(hWnd): + _GetWindowDC = windll.gdi32.GetWindowDC + _GetWindowDC.argtypes = [HWND] + _GetWindowDC.restype = HDC + _GetWindowDC.errcheck = RaiseIfZero + return _GetWindowDC(hWnd) + + +# int ReleaseDC( +# __in HWND hWnd, +# __in HDC hDC +# ); +def ReleaseDC(hWnd, hDC): + _ReleaseDC = windll.gdi32.ReleaseDC + _ReleaseDC.argtypes = [HWND, HDC] + _ReleaseDC.restype = ctypes.c_int + _ReleaseDC.errcheck = RaiseIfZero + _ReleaseDC(hWnd, hDC) + + +# HGDIOBJ SelectObject( +# __in HDC hdc, +# __in HGDIOBJ hgdiobj +# ); +def SelectObject(hdc, hgdiobj): + _SelectObject = windll.gdi32.SelectObject + _SelectObject.argtypes = [HDC, HGDIOBJ] + _SelectObject.restype = HGDIOBJ + _SelectObject.errcheck = RaiseIfZero + return _SelectObject(hdc, hgdiobj) + + +# HGDIOBJ GetStockObject( +# __in int fnObject +# ); +def GetStockObject(fnObject): + _GetStockObject = windll.gdi32.GetStockObject + _GetStockObject.argtypes = [ctypes.c_int] + _GetStockObject.restype = HGDIOBJ + _GetStockObject.errcheck = RaiseIfZero + return _GetStockObject(fnObject) + + +# DWORD GetObjectType( +# __in HGDIOBJ h +# ); +def GetObjectType(h): + _GetObjectType = windll.gdi32.GetObjectType + _GetObjectType.argtypes = [HGDIOBJ] + _GetObjectType.restype = DWORD + _GetObjectType.errcheck = RaiseIfZero + return _GetObjectType(h) + + +# int GetObject( +# __in HGDIOBJ hgdiobj, +# __in int cbBuffer, +# __out LPVOID lpvObject +# ); +def GetObject(hgdiobj, cbBuffer=None, lpvObject=None): + _GetObject = windll.gdi32.GetObject + _GetObject.argtypes = [HGDIOBJ, ctypes.c_int, LPVOID] + _GetObject.restype = ctypes.c_int + _GetObject.errcheck = RaiseIfZero + + # Both cbBuffer and lpvObject can be omitted, the correct + # size and structure to return are automatically deduced. + # If lpvObject is given it must be a ctypes object, not a pointer. + # Always returns a ctypes object. + + if cbBuffer is not None: + if lpvObject is None: + lpvObject = ctypes.create_string_buffer("", cbBuffer) + elif lpvObject is not None: + cbBuffer = sizeof(lpvObject) + else: # most likely case, both are None + t = GetObjectType(hgdiobj) + if t == OBJ_PEN: + cbBuffer = sizeof(LOGPEN) + lpvObject = LOGPEN() + elif t == OBJ_BRUSH: + cbBuffer = sizeof(LOGBRUSH) + lpvObject = LOGBRUSH() + elif t == OBJ_PAL: + cbBuffer = _GetObject(hgdiobj, 0, None) + lpvObject = (WORD * (cbBuffer // sizeof(WORD)))() + elif t == OBJ_FONT: + cbBuffer = sizeof(LOGFONT) + lpvObject = LOGFONT() + elif t == OBJ_BITMAP: # try the two possible types of bitmap + cbBuffer = sizeof(DIBSECTION) + lpvObject = DIBSECTION() + try: + _GetObject(hgdiobj, cbBuffer, byref(lpvObject)) + return lpvObject + except WindowsError: + cbBuffer = sizeof(BITMAP) + lpvObject = BITMAP() + elif t == OBJ_EXTPEN: + cbBuffer = sizeof(LOGEXTPEN) + lpvObject = LOGEXTPEN() + else: + cbBuffer = _GetObject(hgdiobj, 0, None) + lpvObject = ctypes.create_string_buffer("", cbBuffer) + _GetObject(hgdiobj, cbBuffer, byref(lpvObject)) + return lpvObject + + +# LONG GetBitmapBits( +# __in HBITMAP hbmp, +# __in LONG cbBuffer, +# __out LPVOID lpvBits +# ); +def GetBitmapBits(hbmp): + _GetBitmapBits = windll.gdi32.GetBitmapBits + _GetBitmapBits.argtypes = [HBITMAP, LONG, LPVOID] + _GetBitmapBits.restype = LONG + _GetBitmapBits.errcheck = RaiseIfZero + + bitmap = GetObject(hbmp, lpvObject=BITMAP()) + cbBuffer = bitmap.bmWidthBytes * bitmap.bmHeight + lpvBits = ctypes.create_string_buffer("", cbBuffer) + _GetBitmapBits(hbmp, cbBuffer, byref(lpvBits)) + return lpvBits.raw + + +# HBITMAP CreateBitmapIndirect( +# __in const BITMAP *lpbm +# ); +def CreateBitmapIndirect(lpbm): + _CreateBitmapIndirect = windll.gdi32.CreateBitmapIndirect + _CreateBitmapIndirect.argtypes = [PBITMAP] + _CreateBitmapIndirect.restype = HBITMAP + _CreateBitmapIndirect.errcheck = RaiseIfZero + return _CreateBitmapIndirect(lpbm) + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/kernel32.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/kernel32.py new file mode 100644 index 0000000..013a7c2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/kernel32.py @@ -0,0 +1,5098 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for kernel32.dll in ctypes. +""" + +__revision__ = "$Id$" + +import warnings + +from winappdbg.win32.defines import * + +from winappdbg.win32 import context_i386 +from winappdbg.win32 import context_amd64 + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +_all.add("version") +# ============================================================================== + +from winappdbg.win32.version import * + +# ------------------------------------------------------------------------------ + + +# This can't be defined in defines.py because it calls GetLastError(). +def RaiseIfLastError(result, func=None, arguments=()): + """ + Error checking for Win32 API calls with no error-specific return value. + + Regardless of the return value, the function calls GetLastError(). If the + code is not C{ERROR_SUCCESS} then a C{WindowsError} exception is raised. + + For this to work, the user MUST call SetLastError(ERROR_SUCCESS) prior to + calling the API. Otherwise an exception may be raised even on success, + since most API calls don't clear the error status code. + """ + code = GetLastError() + if code != ERROR_SUCCESS: + raise ctypes.WinError(code) + return result + + +# --- CONTEXT structure and constants ------------------------------------------ + +ContextArchMask = 0x0FFF0000 # just guessing here! seems to work, though + +if arch == ARCH_I386: + from winappdbg.win32.context_i386 import * +elif arch == ARCH_AMD64: + if bits == 64: + from winappdbg.win32.context_amd64 import * + else: + from winappdbg.win32.context_i386 import * +else: + warnings.warn("Unknown or unsupported architecture: %s" % arch) + +# --- Constants ---------------------------------------------------------------- + +STILL_ACTIVE = 259 + +WAIT_TIMEOUT = 0x102 +WAIT_FAILED = -1 +WAIT_OBJECT_0 = 0 + +EXCEPTION_NONCONTINUABLE = 0x1 # Noncontinuable exception +EXCEPTION_MAXIMUM_PARAMETERS = 15 # maximum number of exception parameters +MAXIMUM_WAIT_OBJECTS = 64 # Maximum number of wait objects +MAXIMUM_SUSPEND_COUNT = 0x7F # Maximum times thread can be suspended + +FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100 +FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000 + +GR_GDIOBJECTS = 0 +GR_USEROBJECTS = 1 + +PROCESS_NAME_NATIVE = 1 + +MAXINTATOM = 0xC000 + +STD_INPUT_HANDLE = 0xFFFFFFF6 # (DWORD)-10 +STD_OUTPUT_HANDLE = 0xFFFFFFF5 # (DWORD)-11 +STD_ERROR_HANDLE = 0xFFFFFFF4 # (DWORD)-12 + +ATTACH_PARENT_PROCESS = 0xFFFFFFFF # (DWORD)-1 + +# LoadLibraryEx constants +DONT_RESOLVE_DLL_REFERENCES = 0x00000001 +LOAD_LIBRARY_AS_DATAFILE = 0x00000002 +LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008 +LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010 +LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020 +LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040 + +# SetSearchPathMode flags +# TODO I couldn't find these constants :( +##BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE = ??? +##BASE_SEARCH_PATH_DISABLE_SAFE_SEARCHMODE = ??? +##BASE_SEARCH_PATH_PERMANENT = ??? + +# Console control events +CTRL_C_EVENT = 0 +CTRL_BREAK_EVENT = 1 +CTRL_CLOSE_EVENT = 2 +CTRL_LOGOFF_EVENT = 5 +CTRL_SHUTDOWN_EVENT = 6 + +# Heap flags +HEAP_NO_SERIALIZE = 0x00000001 +HEAP_GENERATE_EXCEPTIONS = 0x00000004 +HEAP_ZERO_MEMORY = 0x00000008 +HEAP_CREATE_ENABLE_EXECUTE = 0x00040000 + +# Standard access rights +DELETE = long(0x00010000) +READ_CONTROL = long(0x00020000) +WRITE_DAC = long(0x00040000) +WRITE_OWNER = long(0x00080000) +SYNCHRONIZE = long(0x00100000) +STANDARD_RIGHTS_REQUIRED = long(0x000F0000) +STANDARD_RIGHTS_READ = READ_CONTROL +STANDARD_RIGHTS_WRITE = READ_CONTROL +STANDARD_RIGHTS_EXECUTE = READ_CONTROL +STANDARD_RIGHTS_ALL = long(0x001F0000) +SPECIFIC_RIGHTS_ALL = long(0x0000FFFF) + +# Mutex access rights +MUTEX_ALL_ACCESS = 0x1F0001 +MUTEX_MODIFY_STATE = 1 + +# Event access rights +EVENT_ALL_ACCESS = 0x1F0003 +EVENT_MODIFY_STATE = 2 + +# Semaphore access rights +SEMAPHORE_ALL_ACCESS = 0x1F0003 +SEMAPHORE_MODIFY_STATE = 2 + +# Timer access rights +TIMER_ALL_ACCESS = 0x1F0003 +TIMER_MODIFY_STATE = 2 +TIMER_QUERY_STATE = 1 + +# Process access rights for OpenProcess +PROCESS_TERMINATE = 0x0001 +PROCESS_CREATE_THREAD = 0x0002 +PROCESS_SET_SESSIONID = 0x0004 +PROCESS_VM_OPERATION = 0x0008 +PROCESS_VM_READ = 0x0010 +PROCESS_VM_WRITE = 0x0020 +PROCESS_DUP_HANDLE = 0x0040 +PROCESS_CREATE_PROCESS = 0x0080 +PROCESS_SET_QUOTA = 0x0100 +PROCESS_SET_INFORMATION = 0x0200 +PROCESS_QUERY_INFORMATION = 0x0400 +PROCESS_SUSPEND_RESUME = 0x0800 +PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 + +# Thread access rights for OpenThread +THREAD_TERMINATE = 0x0001 +THREAD_SUSPEND_RESUME = 0x0002 +THREAD_ALERT = 0x0004 +THREAD_GET_CONTEXT = 0x0008 +THREAD_SET_CONTEXT = 0x0010 +THREAD_SET_INFORMATION = 0x0020 +THREAD_QUERY_INFORMATION = 0x0040 +THREAD_SET_THREAD_TOKEN = 0x0080 +THREAD_IMPERSONATE = 0x0100 +THREAD_DIRECT_IMPERSONATION = 0x0200 +THREAD_SET_LIMITED_INFORMATION = 0x0400 +THREAD_QUERY_LIMITED_INFORMATION = 0x0800 + +# The values of PROCESS_ALL_ACCESS and THREAD_ALL_ACCESS were changed in Vista/2008 +PROCESS_ALL_ACCESS_NT = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF +PROCESS_ALL_ACCESS_VISTA = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF +THREAD_ALL_ACCESS_NT = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF +THREAD_ALL_ACCESS_VISTA = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF +if NTDDI_VERSION < NTDDI_VISTA: + PROCESS_ALL_ACCESS = PROCESS_ALL_ACCESS_NT + THREAD_ALL_ACCESS = THREAD_ALL_ACCESS_NT +else: + PROCESS_ALL_ACCESS = PROCESS_ALL_ACCESS_VISTA + THREAD_ALL_ACCESS = THREAD_ALL_ACCESS_VISTA + +# Process priority classes + +IDLE_PRIORITY_CLASS = 0x00000040 +BELOW_NORMAL_PRIORITY_CLASS = 0x00004000 +NORMAL_PRIORITY_CLASS = 0x00000020 +ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000 +HIGH_PRIORITY_CLASS = 0x00000080 +REALTIME_PRIORITY_CLASS = 0x00000100 + +PROCESS_MODE_BACKGROUND_BEGIN = 0x00100000 +PROCESS_MODE_BACKGROUND_END = 0x00200000 + +# dwCreationFlag values + +DEBUG_PROCESS = 0x00000001 +DEBUG_ONLY_THIS_PROCESS = 0x00000002 +CREATE_SUSPENDED = 0x00000004 # Threads and processes +DETACHED_PROCESS = 0x00000008 +CREATE_NEW_CONSOLE = 0x00000010 +NORMAL_PRIORITY_CLASS = 0x00000020 +IDLE_PRIORITY_CLASS = 0x00000040 +HIGH_PRIORITY_CLASS = 0x00000080 +REALTIME_PRIORITY_CLASS = 0x00000100 +CREATE_NEW_PROCESS_GROUP = 0x00000200 +CREATE_UNICODE_ENVIRONMENT = 0x00000400 +CREATE_SEPARATE_WOW_VDM = 0x00000800 +CREATE_SHARED_WOW_VDM = 0x00001000 +CREATE_FORCEDOS = 0x00002000 +BELOW_NORMAL_PRIORITY_CLASS = 0x00004000 +ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000 +INHERIT_PARENT_AFFINITY = 0x00010000 +STACK_SIZE_PARAM_IS_A_RESERVATION = 0x00010000 # Threads only +INHERIT_CALLER_PRIORITY = 0x00020000 # Deprecated +CREATE_PROTECTED_PROCESS = 0x00040000 +EXTENDED_STARTUPINFO_PRESENT = 0x00080000 +PROCESS_MODE_BACKGROUND_BEGIN = 0x00100000 +PROCESS_MODE_BACKGROUND_END = 0x00200000 +CREATE_BREAKAWAY_FROM_JOB = 0x01000000 +CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000 +CREATE_DEFAULT_ERROR_MODE = 0x04000000 +CREATE_NO_WINDOW = 0x08000000 +PROFILE_USER = 0x10000000 +PROFILE_KERNEL = 0x20000000 +PROFILE_SERVER = 0x40000000 +CREATE_IGNORE_SYSTEM_DEFAULT = 0x80000000 + +# Thread priority values + +THREAD_BASE_PRIORITY_LOWRT = 15 # value that gets a thread to LowRealtime-1 +THREAD_BASE_PRIORITY_MAX = 2 # maximum thread base priority boost +THREAD_BASE_PRIORITY_MIN = -2 # minimum thread base priority boost +THREAD_BASE_PRIORITY_IDLE = -15 # value that gets a thread to idle + +THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN +THREAD_PRIORITY_BELOW_NORMAL = THREAD_PRIORITY_LOWEST + 1 +THREAD_PRIORITY_NORMAL = 0 +THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX +THREAD_PRIORITY_ABOVE_NORMAL = THREAD_PRIORITY_HIGHEST - 1 +THREAD_PRIORITY_ERROR_RETURN = long(0xFFFFFFFF) + +THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT +THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE + +# Memory access +SECTION_QUERY = 0x0001 +SECTION_MAP_WRITE = 0x0002 +SECTION_MAP_READ = 0x0004 +SECTION_MAP_EXECUTE = 0x0008 +SECTION_EXTEND_SIZE = 0x0010 +SECTION_MAP_EXECUTE_EXPLICIT = 0x0020 # not included in SECTION_ALL_ACCESS + +SECTION_ALL_ACCESS = ( + STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_WRITE | SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_EXTEND_SIZE +) +PAGE_NOACCESS = 0x01 +PAGE_READONLY = 0x02 +PAGE_READWRITE = 0x04 +PAGE_WRITECOPY = 0x08 +PAGE_EXECUTE = 0x10 +PAGE_EXECUTE_READ = 0x20 +PAGE_EXECUTE_READWRITE = 0x40 +PAGE_EXECUTE_WRITECOPY = 0x80 +PAGE_GUARD = 0x100 +PAGE_NOCACHE = 0x200 +PAGE_WRITECOMBINE = 0x400 +MEM_COMMIT = 0x1000 +MEM_RESERVE = 0x2000 +MEM_DECOMMIT = 0x4000 +MEM_RELEASE = 0x8000 +MEM_FREE = 0x10000 +MEM_PRIVATE = 0x20000 +MEM_MAPPED = 0x40000 +MEM_RESET = 0x80000 +MEM_TOP_DOWN = 0x100000 +MEM_WRITE_WATCH = 0x200000 +MEM_PHYSICAL = 0x400000 +MEM_LARGE_PAGES = 0x20000000 +MEM_4MB_PAGES = 0x80000000 +SEC_FILE = 0x800000 +SEC_IMAGE = 0x1000000 +SEC_RESERVE = 0x4000000 +SEC_COMMIT = 0x8000000 +SEC_NOCACHE = 0x10000000 +SEC_LARGE_PAGES = 0x80000000 +MEM_IMAGE = SEC_IMAGE +WRITE_WATCH_FLAG_RESET = 0x01 +FILE_MAP_ALL_ACCESS = 0xF001F + +SECTION_QUERY = 0x0001 +SECTION_MAP_WRITE = 0x0002 +SECTION_MAP_READ = 0x0004 +SECTION_MAP_EXECUTE = 0x0008 +SECTION_EXTEND_SIZE = 0x0010 +SECTION_MAP_EXECUTE_EXPLICIT = 0x0020 # not included in SECTION_ALL_ACCESS + +SECTION_ALL_ACCESS = ( + STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_WRITE | SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_EXTEND_SIZE +) + +FILE_MAP_COPY = SECTION_QUERY +FILE_MAP_WRITE = SECTION_MAP_WRITE +FILE_MAP_READ = SECTION_MAP_READ +FILE_MAP_ALL_ACCESS = SECTION_ALL_ACCESS +FILE_MAP_EXECUTE = SECTION_MAP_EXECUTE_EXPLICIT # not included in FILE_MAP_ALL_ACCESS + +GENERIC_READ = 0x80000000 +GENERIC_WRITE = 0x40000000 +GENERIC_EXECUTE = 0x20000000 +GENERIC_ALL = 0x10000000 + +FILE_SHARE_READ = 0x00000001 +FILE_SHARE_WRITE = 0x00000002 +FILE_SHARE_DELETE = 0x00000004 + +CREATE_NEW = 1 +CREATE_ALWAYS = 2 +OPEN_EXISTING = 3 +OPEN_ALWAYS = 4 +TRUNCATE_EXISTING = 5 + +FILE_ATTRIBUTE_READONLY = 0x00000001 +FILE_ATTRIBUTE_NORMAL = 0x00000080 +FILE_ATTRIBUTE_TEMPORARY = 0x00000100 + +FILE_FLAG_WRITE_THROUGH = 0x80000000 +FILE_FLAG_NO_BUFFERING = 0x20000000 +FILE_FLAG_RANDOM_ACCESS = 0x10000000 +FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000 +FILE_FLAG_DELETE_ON_CLOSE = 0x04000000 +FILE_FLAG_OVERLAPPED = 0x40000000 + +FILE_ATTRIBUTE_READONLY = 0x00000001 +FILE_ATTRIBUTE_HIDDEN = 0x00000002 +FILE_ATTRIBUTE_SYSTEM = 0x00000004 +FILE_ATTRIBUTE_DIRECTORY = 0x00000010 +FILE_ATTRIBUTE_ARCHIVE = 0x00000020 +FILE_ATTRIBUTE_DEVICE = 0x00000040 +FILE_ATTRIBUTE_NORMAL = 0x00000080 +FILE_ATTRIBUTE_TEMPORARY = 0x00000100 + +# Debug events +EXCEPTION_DEBUG_EVENT = 1 +CREATE_THREAD_DEBUG_EVENT = 2 +CREATE_PROCESS_DEBUG_EVENT = 3 +EXIT_THREAD_DEBUG_EVENT = 4 +EXIT_PROCESS_DEBUG_EVENT = 5 +LOAD_DLL_DEBUG_EVENT = 6 +UNLOAD_DLL_DEBUG_EVENT = 7 +OUTPUT_DEBUG_STRING_EVENT = 8 +RIP_EVENT = 9 + +# Debug status codes (ContinueDebugEvent) +DBG_EXCEPTION_HANDLED = long(0x00010001) +DBG_CONTINUE = long(0x00010002) +DBG_REPLY_LATER = long(0x40010001) +DBG_UNABLE_TO_PROVIDE_HANDLE = long(0x40010002) +DBG_TERMINATE_THREAD = long(0x40010003) +DBG_TERMINATE_PROCESS = long(0x40010004) +DBG_CONTROL_C = long(0x40010005) +DBG_PRINTEXCEPTION_C = long(0x40010006) +DBG_RIPEXCEPTION = long(0x40010007) +DBG_CONTROL_BREAK = long(0x40010008) +DBG_COMMAND_EXCEPTION = long(0x40010009) +DBG_EXCEPTION_NOT_HANDLED = long(0x80010001) +DBG_NO_STATE_CHANGE = long(0xC0010001) +DBG_APP_NOT_IDLE = long(0xC0010002) + +# Status codes +STATUS_WAIT_0 = long(0x00000000) +STATUS_ABANDONED_WAIT_0 = long(0x00000080) +STATUS_USER_APC = long(0x000000C0) +STATUS_TIMEOUT = long(0x00000102) +STATUS_PENDING = long(0x00000103) +STATUS_SEGMENT_NOTIFICATION = long(0x40000005) +STATUS_GUARD_PAGE_VIOLATION = long(0x80000001) +STATUS_DATATYPE_MISALIGNMENT = long(0x80000002) +STATUS_BREAKPOINT = long(0x80000003) +STATUS_SINGLE_STEP = long(0x80000004) +STATUS_INVALID_INFO_CLASS = long(0xC0000003) +STATUS_ACCESS_VIOLATION = long(0xC0000005) +STATUS_IN_PAGE_ERROR = long(0xC0000006) +STATUS_INVALID_HANDLE = long(0xC0000008) +STATUS_NO_MEMORY = long(0xC0000017) +STATUS_ILLEGAL_INSTRUCTION = long(0xC000001D) +STATUS_NONCONTINUABLE_EXCEPTION = long(0xC0000025) +STATUS_INVALID_DISPOSITION = long(0xC0000026) +STATUS_ARRAY_BOUNDS_EXCEEDED = long(0xC000008C) +STATUS_FLOAT_DENORMAL_OPERAND = long(0xC000008D) +STATUS_FLOAT_DIVIDE_BY_ZERO = long(0xC000008E) +STATUS_FLOAT_INEXACT_RESULT = long(0xC000008F) +STATUS_FLOAT_INVALID_OPERATION = long(0xC0000090) +STATUS_FLOAT_OVERFLOW = long(0xC0000091) +STATUS_FLOAT_STACK_CHECK = long(0xC0000092) +STATUS_FLOAT_UNDERFLOW = long(0xC0000093) +STATUS_INTEGER_DIVIDE_BY_ZERO = long(0xC0000094) +STATUS_INTEGER_OVERFLOW = long(0xC0000095) +STATUS_PRIVILEGED_INSTRUCTION = long(0xC0000096) +STATUS_STACK_OVERFLOW = long(0xC00000FD) +STATUS_CONTROL_C_EXIT = long(0xC000013A) +STATUS_FLOAT_MULTIPLE_FAULTS = long(0xC00002B4) +STATUS_FLOAT_MULTIPLE_TRAPS = long(0xC00002B5) +STATUS_REG_NAT_CONSUMPTION = long(0xC00002C9) +STATUS_SXS_EARLY_DEACTIVATION = long(0xC015000F) +STATUS_SXS_INVALID_DEACTIVATION = long(0xC0150010) + +STATUS_STACK_BUFFER_OVERRUN = long(0xC0000409) +STATUS_WX86_BREAKPOINT = long(0x4000001F) +STATUS_HEAP_CORRUPTION = long(0xC0000374) + +STATUS_POSSIBLE_DEADLOCK = long(0xC0000194) + +STATUS_UNWIND_CONSOLIDATE = long(0x80000029) + +# Exception codes + +EXCEPTION_ACCESS_VIOLATION = STATUS_ACCESS_VIOLATION +EXCEPTION_ARRAY_BOUNDS_EXCEEDED = STATUS_ARRAY_BOUNDS_EXCEEDED +EXCEPTION_BREAKPOINT = STATUS_BREAKPOINT +EXCEPTION_DATATYPE_MISALIGNMENT = STATUS_DATATYPE_MISALIGNMENT +EXCEPTION_FLT_DENORMAL_OPERAND = STATUS_FLOAT_DENORMAL_OPERAND +EXCEPTION_FLT_DIVIDE_BY_ZERO = STATUS_FLOAT_DIVIDE_BY_ZERO +EXCEPTION_FLT_INEXACT_RESULT = STATUS_FLOAT_INEXACT_RESULT +EXCEPTION_FLT_INVALID_OPERATION = STATUS_FLOAT_INVALID_OPERATION +EXCEPTION_FLT_OVERFLOW = STATUS_FLOAT_OVERFLOW +EXCEPTION_FLT_STACK_CHECK = STATUS_FLOAT_STACK_CHECK +EXCEPTION_FLT_UNDERFLOW = STATUS_FLOAT_UNDERFLOW +EXCEPTION_ILLEGAL_INSTRUCTION = STATUS_ILLEGAL_INSTRUCTION +EXCEPTION_IN_PAGE_ERROR = STATUS_IN_PAGE_ERROR +EXCEPTION_INT_DIVIDE_BY_ZERO = STATUS_INTEGER_DIVIDE_BY_ZERO +EXCEPTION_INT_OVERFLOW = STATUS_INTEGER_OVERFLOW +EXCEPTION_INVALID_DISPOSITION = STATUS_INVALID_DISPOSITION +EXCEPTION_NONCONTINUABLE_EXCEPTION = STATUS_NONCONTINUABLE_EXCEPTION +EXCEPTION_PRIV_INSTRUCTION = STATUS_PRIVILEGED_INSTRUCTION +EXCEPTION_SINGLE_STEP = STATUS_SINGLE_STEP +EXCEPTION_STACK_OVERFLOW = STATUS_STACK_OVERFLOW + +EXCEPTION_GUARD_PAGE = STATUS_GUARD_PAGE_VIOLATION +EXCEPTION_INVALID_HANDLE = STATUS_INVALID_HANDLE +EXCEPTION_POSSIBLE_DEADLOCK = STATUS_POSSIBLE_DEADLOCK +EXCEPTION_WX86_BREAKPOINT = STATUS_WX86_BREAKPOINT + +CONTROL_C_EXIT = STATUS_CONTROL_C_EXIT + +DBG_CONTROL_C = long(0x40010005) +MS_VC_EXCEPTION = long(0x406D1388) + +# Access violation types +ACCESS_VIOLATION_TYPE_READ = EXCEPTION_READ_FAULT +ACCESS_VIOLATION_TYPE_WRITE = EXCEPTION_WRITE_FAULT +ACCESS_VIOLATION_TYPE_DEP = EXCEPTION_EXECUTE_FAULT + +# RIP event types +SLE_ERROR = 1 +SLE_MINORERROR = 2 +SLE_WARNING = 3 + +# DuplicateHandle constants +DUPLICATE_CLOSE_SOURCE = 0x00000001 +DUPLICATE_SAME_ACCESS = 0x00000002 + +# GetFinalPathNameByHandle constants +FILE_NAME_NORMALIZED = 0x0 +FILE_NAME_OPENED = 0x8 +VOLUME_NAME_DOS = 0x0 +VOLUME_NAME_GUID = 0x1 +VOLUME_NAME_NONE = 0x4 +VOLUME_NAME_NT = 0x2 + +# GetProductInfo constants +PRODUCT_BUSINESS = 0x00000006 +PRODUCT_BUSINESS_N = 0x00000010 +PRODUCT_CLUSTER_SERVER = 0x00000012 +PRODUCT_DATACENTER_SERVER = 0x00000008 +PRODUCT_DATACENTER_SERVER_CORE = 0x0000000C +PRODUCT_DATACENTER_SERVER_CORE_V = 0x00000027 +PRODUCT_DATACENTER_SERVER_V = 0x00000025 +PRODUCT_ENTERPRISE = 0x00000004 +PRODUCT_ENTERPRISE_E = 0x00000046 +PRODUCT_ENTERPRISE_N = 0x0000001B +PRODUCT_ENTERPRISE_SERVER = 0x0000000A +PRODUCT_ENTERPRISE_SERVER_CORE = 0x0000000E +PRODUCT_ENTERPRISE_SERVER_CORE_V = 0x00000029 +PRODUCT_ENTERPRISE_SERVER_IA64 = 0x0000000F +PRODUCT_ENTERPRISE_SERVER_V = 0x00000026 +PRODUCT_HOME_BASIC = 0x00000002 +PRODUCT_HOME_BASIC_E = 0x00000043 +PRODUCT_HOME_BASIC_N = 0x00000005 +PRODUCT_HOME_PREMIUM = 0x00000003 +PRODUCT_HOME_PREMIUM_E = 0x00000044 +PRODUCT_HOME_PREMIUM_N = 0x0000001A +PRODUCT_HYPERV = 0x0000002A +PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT = 0x0000001E +PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING = 0x00000020 +PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY = 0x0000001F +PRODUCT_PROFESSIONAL = 0x00000030 +PRODUCT_PROFESSIONAL_E = 0x00000045 +PRODUCT_PROFESSIONAL_N = 0x00000031 +PRODUCT_SERVER_FOR_SMALLBUSINESS = 0x00000018 +PRODUCT_SERVER_FOR_SMALLBUSINESS_V = 0x00000023 +PRODUCT_SERVER_FOUNDATION = 0x00000021 +PRODUCT_SMALLBUSINESS_SERVER = 0x00000009 +PRODUCT_STANDARD_SERVER = 0x00000007 +PRODUCT_STANDARD_SERVER_CORE = 0x0000000D +PRODUCT_STANDARD_SERVER_CORE_V = 0x00000028 +PRODUCT_STANDARD_SERVER_V = 0x00000024 +PRODUCT_STARTER = 0x0000000B +PRODUCT_STARTER_E = 0x00000042 +PRODUCT_STARTER_N = 0x0000002F +PRODUCT_STORAGE_ENTERPRISE_SERVER = 0x00000017 +PRODUCT_STORAGE_EXPRESS_SERVER = 0x00000014 +PRODUCT_STORAGE_STANDARD_SERVER = 0x00000015 +PRODUCT_STORAGE_WORKGROUP_SERVER = 0x00000016 +PRODUCT_UNDEFINED = 0x00000000 +PRODUCT_UNLICENSED = 0xABCDABCD +PRODUCT_ULTIMATE = 0x00000001 +PRODUCT_ULTIMATE_E = 0x00000047 +PRODUCT_ULTIMATE_N = 0x0000001C +PRODUCT_WEB_SERVER = 0x00000011 +PRODUCT_WEB_SERVER_CORE = 0x0000001D + +# DEP policy flags +PROCESS_DEP_ENABLE = 1 +PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION = 2 + +# Error modes +SEM_FAILCRITICALERRORS = 0x001 +SEM_NOGPFAULTERRORBOX = 0x002 +SEM_NOALIGNMENTFAULTEXCEPT = 0x004 +SEM_NOOPENFILEERRORBOX = 0x800 + +# GetHandleInformation / SetHandleInformation +HANDLE_FLAG_INHERIT = 0x00000001 +HANDLE_FLAG_PROTECT_FROM_CLOSE = 0x00000002 + +# --- Handle wrappers ---------------------------------------------------------- + + +class Handle(object): + """ + Encapsulates Win32 handles to avoid leaking them. + + @type inherit: bool + @ivar inherit: C{True} if the handle is to be inherited by child processes, + C{False} otherwise. + + @type protectFromClose: bool + @ivar protectFromClose: Set to C{True} to prevent the handle from being + closed. Must be set to C{False} before you're done using the handle, + or it will be left open until the debugger exits. Use with care! + + @see: + L{ProcessHandle}, L{ThreadHandle}, L{FileHandle}, L{SnapshotHandle} + """ + + # XXX DEBUG + # When this private flag is True each Handle will print a message to + # standard output when it's created and destroyed. This is useful for + # detecting handle leaks within WinAppDbg itself. + __bLeakDetection = False + + def __init__(self, aHandle=None, bOwnership=True): + """ + @type aHandle: int + @param aHandle: Win32 handle value. + + @type bOwnership: bool + @param bOwnership: + C{True} if we own the handle and we need to close it. + C{False} if someone else will be calling L{CloseHandle}. + """ + super(Handle, self).__init__() + self._value = self._normalize(aHandle) + self.bOwnership = bOwnership + if Handle.__bLeakDetection: # XXX DEBUG + print("INIT HANDLE (%r) %r" % (self.value, self)) + + @property + def value(self): + return self._value + + def __del__(self): + """ + Closes the Win32 handle when the Python object is destroyed. + """ + try: + if Handle.__bLeakDetection: # XXX DEBUG + print("DEL HANDLE %r" % self) + self.close() + except Exception: + pass + + def __enter__(self): + """ + Compatibility with the "C{with}" Python statement. + """ + if Handle.__bLeakDetection: # XXX DEBUG + print("ENTER HANDLE %r" % self) + return self + + def __exit__(self, type, value, traceback): + """ + Compatibility with the "C{with}" Python statement. + """ + if Handle.__bLeakDetection: # XXX DEBUG + print("EXIT HANDLE %r" % self) + try: + self.close() + except Exception: + pass + + def __copy__(self): + """ + Duplicates the Win32 handle when copying the Python object. + + @rtype: L{Handle} + @return: A new handle to the same Win32 object. + """ + return self.dup() + + def __deepcopy__(self): + """ + Duplicates the Win32 handle when copying the Python object. + + @rtype: L{Handle} + @return: A new handle to the same win32 object. + """ + return self.dup() + + @property + def _as_parameter_(self): + """ + Compatibility with ctypes. + Allows passing transparently a Handle object to an API call. + """ + return HANDLE(self.value) + + @staticmethod + def from_param(value): + """ + Compatibility with ctypes. + Allows passing transparently a Handle object to an API call. + + @type value: int + @param value: Numeric handle value. + """ + return HANDLE(value) + + def close(self): + """ + Closes the Win32 handle. + """ + if self.bOwnership and self.value not in (None, INVALID_HANDLE_VALUE): + if Handle.__bLeakDetection: # XXX DEBUG + print("CLOSE HANDLE (%d) %r" % (self.value, self)) + try: + self._close() + finally: + self._value = None + + def _close(self): + """ + Low-level close method. + This is a private method, do not call it. + """ + CloseHandle(self.value) + + def dup(self): + """ + @rtype: L{Handle} + @return: A new handle to the same Win32 object. + """ + if self.value is None: + raise ValueError("Closed handles can't be duplicated!") + new_handle = DuplicateHandle(self.value) + if Handle.__bLeakDetection: # XXX DEBUG + print("DUP HANDLE (%d -> %d) %r %r" % (self.value, new_handle.value, self, new_handle)) + return new_handle + + @staticmethod + def _normalize(value): + """ + Normalize handle values. + """ + if hasattr(value, "value"): + value = value.value + if value is not None: + value = long(value) + return value + + def wait(self, dwMilliseconds=None): + """ + Wait for the Win32 object to be signaled. + + @type dwMilliseconds: int + @param dwMilliseconds: (Optional) Timeout value in milliseconds. + Use C{INFINITE} or C{None} for no timeout. + """ + if self.value is None: + raise ValueError("Handle is already closed!") + if dwMilliseconds is None: + dwMilliseconds = INFINITE + r = WaitForSingleObject(self.value, dwMilliseconds) + if r != WAIT_OBJECT_0: + raise ctypes.WinError(r) + + def __repr__(self): + return "<%s: %s>" % (self.__class__.__name__, self.value) + + def __get_inherit(self): + if self.value is None: + raise ValueError("Handle is already closed!") + return bool(GetHandleInformation(self.value) & HANDLE_FLAG_INHERIT) + + def __set_inherit(self, value): + if self.value is None: + raise ValueError("Handle is already closed!") + flag = (0, HANDLE_FLAG_INHERIT)[bool(value)] + SetHandleInformation(self.value, flag, flag) + + inherit = property(__get_inherit, __set_inherit) + + def __get_protectFromClose(self): + if self.value is None: + raise ValueError("Handle is already closed!") + return bool(GetHandleInformation(self.value) & HANDLE_FLAG_PROTECT_FROM_CLOSE) + + def __set_protectFromClose(self, value): + if self.value is None: + raise ValueError("Handle is already closed!") + flag = (0, HANDLE_FLAG_PROTECT_FROM_CLOSE)[bool(value)] + SetHandleInformation(self.value, flag, flag) + + protectFromClose = property(__get_protectFromClose, __set_protectFromClose) + + +class UserModeHandle(Handle): + """ + Base class for non-kernel handles. Generally this means they are closed + by special Win32 API functions instead of CloseHandle() and some standard + operations (synchronizing, duplicating, inheritance) are not supported. + + @type _TYPE: C type + @cvar _TYPE: C type to translate this handle to. + Subclasses should override this. + Defaults to L{HANDLE}. + """ + + # Subclasses should override this. + _TYPE = HANDLE + + # This method must be implemented by subclasses. + def _close(self): + raise NotImplementedError() + + # Translation to C type. + @property + def _as_parameter_(self): + return self._TYPE(self.value) + + # Translation to C type. + @staticmethod + def from_param(value): + return self._TYPE(self.value) + + # Operation not supported. + @property + def inherit(self): + return False + + # Operation not supported. + @property + def protectFromClose(self): + return False + + # Operation not supported. + def dup(self): + raise NotImplementedError() + + # Operation not supported. + def wait(self, dwMilliseconds=None): + raise NotImplementedError() + + +class ProcessHandle(Handle): + """ + Win32 process handle. + + @type dwAccess: int + @ivar dwAccess: Current access flags to this handle. + This is the same value passed to L{OpenProcess}. + Can only be C{None} if C{aHandle} is also C{None}. + Defaults to L{PROCESS_ALL_ACCESS}. + + @see: L{Handle} + """ + + def __init__(self, aHandle=None, bOwnership=True, dwAccess=PROCESS_ALL_ACCESS): + """ + @type aHandle: int + @param aHandle: Win32 handle value. + + @type bOwnership: bool + @param bOwnership: + C{True} if we own the handle and we need to close it. + C{False} if someone else will be calling L{CloseHandle}. + + @type dwAccess: int + @param dwAccess: Current access flags to this handle. + This is the same value passed to L{OpenProcess}. + Can only be C{None} if C{aHandle} is also C{None}. + Defaults to L{PROCESS_ALL_ACCESS}. + """ + super(ProcessHandle, self).__init__(aHandle, bOwnership) + self.dwAccess = dwAccess + if aHandle is not None and dwAccess is None: + msg = "Missing access flags for process handle: %x" % aHandle + raise TypeError(msg) + + def get_pid(self): + """ + @rtype: int + @return: Process global ID. + """ + return GetProcessId(self.value) + + +class ThreadHandle(Handle): + """ + Win32 thread handle. + + @type dwAccess: int + @ivar dwAccess: Current access flags to this handle. + This is the same value passed to L{OpenThread}. + Can only be C{None} if C{aHandle} is also C{None}. + Defaults to L{THREAD_ALL_ACCESS}. + + @see: L{Handle} + """ + + def __init__(self, aHandle=None, bOwnership=True, dwAccess=THREAD_ALL_ACCESS): + """ + @type aHandle: int + @param aHandle: Win32 handle value. + + @type bOwnership: bool + @param bOwnership: + C{True} if we own the handle and we need to close it. + C{False} if someone else will be calling L{CloseHandle}. + + @type dwAccess: int + @param dwAccess: Current access flags to this handle. + This is the same value passed to L{OpenThread}. + Can only be C{None} if C{aHandle} is also C{None}. + Defaults to L{THREAD_ALL_ACCESS}. + """ + super(ThreadHandle, self).__init__(aHandle, bOwnership) + self.dwAccess = dwAccess + if aHandle is not None and dwAccess is None: + msg = "Missing access flags for thread handle: %x" % aHandle + raise TypeError(msg) + + def get_tid(self): + """ + @rtype: int + @return: Thread global ID. + """ + return GetThreadId(self.value) + + +class FileHandle(Handle): + """ + Win32 file handle. + + @see: L{Handle} + """ + + def get_filename(self): + """ + @rtype: None or str + @return: Name of the open file, or C{None} if unavailable. + """ + # + # XXX BUG + # + # This code truncates the first two bytes of the path. + # It seems to be the expected behavior of NtQueryInformationFile. + # + # My guess is it only returns the NT pathname, without the device name. + # It's like dropping the drive letter in a Win32 pathname. + # + # Note that using the "official" GetFileInformationByHandleEx + # API introduced in Vista doesn't change the results! + # + dwBufferSize = 0x1004 + lpFileInformation = ctypes.create_string_buffer(dwBufferSize) + try: + GetFileInformationByHandleEx(self.value, FILE_INFO_BY_HANDLE_CLASS.FileNameInfo, lpFileInformation, dwBufferSize) + except AttributeError: + from winappdbg.win32.ntdll import NtQueryInformationFile, FileNameInformation, FILE_NAME_INFORMATION + + NtQueryInformationFile(self.value, FileNameInformation, lpFileInformation, dwBufferSize) + FileName = compat.unicode(lpFileInformation.raw[sizeof(DWORD) :], "U16") + FileName = ctypes.create_unicode_buffer(FileName).value + if not FileName: + FileName = None + elif FileName[1:2] != ":": + # When the drive letter is missing, we'll assume SYSTEMROOT. + # Not a good solution but it could be worse. + import os + + FileName = os.environ["SYSTEMROOT"][:2] + FileName + return FileName + + +class FileMappingHandle(Handle): + """ + File mapping handle. + + @see: L{Handle} + """ + + pass + + +# XXX maybe add functions related to the toolhelp snapshots here? +class SnapshotHandle(Handle): + """ + Toolhelp32 snapshot handle. + + @see: L{Handle} + """ + + pass + + +# --- Structure wrappers ------------------------------------------------------- + + +class ProcessInformation(object): + """ + Process information object returned by L{CreateProcess}. + """ + + def __init__(self, pi): + self.hProcess = ProcessHandle(pi.hProcess) + self.hThread = ThreadHandle(pi.hThread) + self.dwProcessId = pi.dwProcessId + self.dwThreadId = pi.dwThreadId + + +# Don't psyco-optimize this class because it needs to be serialized. +class MemoryBasicInformation(object): + """ + Memory information object returned by L{VirtualQueryEx}. + """ + + READABLE = PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY | PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY + + WRITEABLE = PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY | PAGE_READWRITE | PAGE_WRITECOPY + + COPY_ON_WRITE = PAGE_EXECUTE_WRITECOPY | PAGE_WRITECOPY + + EXECUTABLE = PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY + + EXECUTABLE_AND_WRITEABLE = PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY + + def __init__(self, mbi=None): + """ + @type mbi: L{MEMORY_BASIC_INFORMATION} or L{MemoryBasicInformation} + @param mbi: Either a L{MEMORY_BASIC_INFORMATION} structure or another + L{MemoryBasicInformation} instance. + """ + if mbi is None: + self.BaseAddress = None + self.AllocationBase = None + self.AllocationProtect = None + self.RegionSize = None + self.State = None + self.Protect = None + self.Type = None + else: + self.BaseAddress = mbi.BaseAddress + self.AllocationBase = mbi.AllocationBase + self.AllocationProtect = mbi.AllocationProtect + self.RegionSize = mbi.RegionSize + self.State = mbi.State + self.Protect = mbi.Protect + self.Type = mbi.Type + + # Only used when copying MemoryBasicInformation objects, instead of + # instancing them from a MEMORY_BASIC_INFORMATION structure. + if hasattr(mbi, "content"): + self.content = mbi.content + if hasattr(mbi, "filename"): + self.content = mbi.filename + + def __contains__(self, address): + """ + Test if the given memory address falls within this memory region. + + @type address: int + @param address: Memory address to test. + + @rtype: bool + @return: C{True} if the given memory address falls within this memory + region, C{False} otherwise. + """ + return self.BaseAddress <= address < (self.BaseAddress + self.RegionSize) + + def is_free(self): + """ + @rtype: bool + @return: C{True} if the memory in this region is free. + """ + return self.State == MEM_FREE + + def is_reserved(self): + """ + @rtype: bool + @return: C{True} if the memory in this region is reserved. + """ + return self.State == MEM_RESERVE + + def is_commited(self): + """ + @rtype: bool + @return: C{True} if the memory in this region is commited. + """ + return self.State == MEM_COMMIT + + def is_image(self): + """ + @rtype: bool + @return: C{True} if the memory in this region belongs to an executable + image. + """ + return self.Type == MEM_IMAGE + + def is_mapped(self): + """ + @rtype: bool + @return: C{True} if the memory in this region belongs to a mapped file. + """ + return self.Type == MEM_MAPPED + + def is_private(self): + """ + @rtype: bool + @return: C{True} if the memory in this region is private. + """ + return self.Type == MEM_PRIVATE + + def is_guard(self): + """ + @rtype: bool + @return: C{True} if all pages in this region are guard pages. + """ + return self.is_commited() and bool(self.Protect & PAGE_GUARD) + + def has_content(self): + """ + @rtype: bool + @return: C{True} if the memory in this region has any data in it. + """ + return self.is_commited() and not bool(self.Protect & (PAGE_GUARD | PAGE_NOACCESS)) + + def is_readable(self): + """ + @rtype: bool + @return: C{True} if all pages in this region are readable. + """ + return self.has_content() and bool(self.Protect & self.READABLE) + + def is_writeable(self): + """ + @rtype: bool + @return: C{True} if all pages in this region are writeable. + """ + return self.has_content() and bool(self.Protect & self.WRITEABLE) + + def is_copy_on_write(self): + """ + @rtype: bool + @return: C{True} if all pages in this region are marked as + copy-on-write. This means the pages are writeable, but changes + are not propagated to disk. + @note: + Tipically data sections in executable images are marked like this. + """ + return self.has_content() and bool(self.Protect & self.COPY_ON_WRITE) + + def is_executable(self): + """ + @rtype: bool + @return: C{True} if all pages in this region are executable. + @note: Executable pages are always readable. + """ + return self.has_content() and bool(self.Protect & self.EXECUTABLE) + + def is_executable_and_writeable(self): + """ + @rtype: bool + @return: C{True} if all pages in this region are executable and + writeable. + @note: The presence of such pages make memory corruption + vulnerabilities much easier to exploit. + """ + return self.has_content() and bool(self.Protect & self.EXECUTABLE_AND_WRITEABLE) + + +class ProcThreadAttributeList(object): + """ + Extended process and thread attribute support. + + To be used with L{STARTUPINFOEX}. + Only available for Windows Vista and above. + + @type AttributeList: list of tuple( int, ctypes-compatible object ) + @ivar AttributeList: List of (Attribute, Value) pairs. + + @type AttributeListBuffer: L{LPPROC_THREAD_ATTRIBUTE_LIST} + @ivar AttributeListBuffer: Memory buffer used to store the attribute list. + L{InitializeProcThreadAttributeList}, + L{UpdateProcThreadAttribute}, + L{DeleteProcThreadAttributeList} and + L{STARTUPINFOEX}. + """ + + def __init__(self, AttributeList): + """ + @type AttributeList: list of tuple( int, ctypes-compatible object ) + @param AttributeList: List of (Attribute, Value) pairs. + """ + self.AttributeList = AttributeList + self.AttributeListBuffer = InitializeProcThreadAttributeList(len(AttributeList)) + try: + for Attribute, Value in AttributeList: + UpdateProcThreadAttribute(self.AttributeListBuffer, Attribute, Value) + except: + ProcThreadAttributeList.__del__(self) + raise + + def __del__(self): + try: + DeleteProcThreadAttributeList(self.AttributeListBuffer) + del self.AttributeListBuffer + except Exception: + pass + + def __copy__(self): + return self.__deepcopy__() + + def __deepcopy__(self): + return self.__class__(self.AttributeList) + + @property + def value(self): + return ctypes.cast(ctypes.pointer(self.AttributeListBuffer), LPVOID) + + @property + def _as_parameter_(self): + return self.value + + # XXX TODO + @staticmethod + def from_param(value): + raise NotImplementedError() + + +# --- OVERLAPPED structure ----------------------------------------------------- + + +# typedef struct _OVERLAPPED { +# ULONG_PTR Internal; +# ULONG_PTR InternalHigh; +# union { +# struct { +# DWORD Offset; +# DWORD OffsetHigh; +# } ; +# PVOID Pointer; +# } ; +# HANDLE hEvent; +# }OVERLAPPED, *LPOVERLAPPED; +class _OVERLAPPED_STRUCT(Structure): + _fields_ = [ + ("Offset", DWORD), + ("OffsetHigh", DWORD), + ] + + +class _OVERLAPPED_UNION(Union): + _fields_ = [ + ("s", _OVERLAPPED_STRUCT), + ("Pointer", PVOID), + ] + + +class OVERLAPPED(Structure): + _fields_ = [ + ("Internal", ULONG_PTR), + ("InternalHigh", ULONG_PTR), + ("u", _OVERLAPPED_UNION), + ("hEvent", HANDLE), + ] + + +LPOVERLAPPED = POINTER(OVERLAPPED) + +# --- SECURITY_ATTRIBUTES structure -------------------------------------------- + + +# typedef struct _SECURITY_ATTRIBUTES { +# DWORD nLength; +# LPVOID lpSecurityDescriptor; +# BOOL bInheritHandle; +# } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; +class SECURITY_ATTRIBUTES(Structure): + _fields_ = [ + ("nLength", DWORD), + ("lpSecurityDescriptor", LPVOID), + ("bInheritHandle", BOOL), + ] + + +LPSECURITY_ATTRIBUTES = POINTER(SECURITY_ATTRIBUTES) + +# --- Extended process and thread attribute support --------------------------- + +PPROC_THREAD_ATTRIBUTE_LIST = LPVOID +LPPROC_THREAD_ATTRIBUTE_LIST = PPROC_THREAD_ATTRIBUTE_LIST + +PROC_THREAD_ATTRIBUTE_NUMBER = 0x0000FFFF +PROC_THREAD_ATTRIBUTE_THREAD = 0x00010000 # Attribute may be used with thread creation +PROC_THREAD_ATTRIBUTE_INPUT = 0x00020000 # Attribute is input only +PROC_THREAD_ATTRIBUTE_ADDITIVE = 0x00040000 # Attribute may be "accumulated," e.g. bitmasks, counters, etc. + +# PROC_THREAD_ATTRIBUTE_NUM +ProcThreadAttributeParentProcess = 0 +ProcThreadAttributeExtendedFlags = 1 +ProcThreadAttributeHandleList = 2 +ProcThreadAttributeGroupAffinity = 3 +ProcThreadAttributePreferredNode = 4 +ProcThreadAttributeIdealProcessor = 5 +ProcThreadAttributeUmsThread = 6 +ProcThreadAttributeMitigationPolicy = 7 +ProcThreadAttributeMax = 8 + +PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = ProcThreadAttributeParentProcess | PROC_THREAD_ATTRIBUTE_INPUT +PROC_THREAD_ATTRIBUTE_EXTENDED_FLAGS = ProcThreadAttributeExtendedFlags | PROC_THREAD_ATTRIBUTE_INPUT | PROC_THREAD_ATTRIBUTE_ADDITIVE +PROC_THREAD_ATTRIBUTE_HANDLE_LIST = ProcThreadAttributeHandleList | PROC_THREAD_ATTRIBUTE_INPUT +PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY = ProcThreadAttributeGroupAffinity | PROC_THREAD_ATTRIBUTE_THREAD | PROC_THREAD_ATTRIBUTE_INPUT +PROC_THREAD_ATTRIBUTE_PREFERRED_NODE = ProcThreadAttributePreferredNode | PROC_THREAD_ATTRIBUTE_INPUT +PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR = ProcThreadAttributeIdealProcessor | PROC_THREAD_ATTRIBUTE_THREAD | PROC_THREAD_ATTRIBUTE_INPUT +PROC_THREAD_ATTRIBUTE_UMS_THREAD = ProcThreadAttributeUmsThread | PROC_THREAD_ATTRIBUTE_THREAD | PROC_THREAD_ATTRIBUTE_INPUT +PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY = ProcThreadAttributeMitigationPolicy | PROC_THREAD_ATTRIBUTE_INPUT + +PROCESS_CREATION_MITIGATION_POLICY_DEP_ENABLE = 0x01 +PROCESS_CREATION_MITIGATION_POLICY_DEP_ATL_THUNK_ENABLE = 0x02 +PROCESS_CREATION_MITIGATION_POLICY_SEHOP_ENABLE = 0x04 + +# --- VS_FIXEDFILEINFO structure ----------------------------------------------- + + +# struct VS_FIXEDFILEINFO { +# DWORD dwSignature; +# DWORD dwStrucVersion; +# DWORD dwFileVersionMS; +# DWORD dwFileVersionLS; +# DWORD dwProductVersionMS; +# DWORD dwProductVersionLS; +# DWORD dwFileFlagsMask; +# DWORD dwFileFlags; +# DWORD dwFileOS; +# DWORD dwFileType; +# DWORD dwFileSubtype; +# DWORD dwFileDateMS; +# DWORD dwFileDateLS; +# }; +class VS_FIXEDFILEINFO(Structure): + _fields_ = [ + ("dwSignature", DWORD), # 0xFEEF04BD + ("dwStrucVersion", DWORD), + ("dwFileVersionMS", DWORD), + ("dwFileVersionLS", DWORD), + ("dwProductVersionMS", DWORD), + ("dwProductVersionLS", DWORD), + ("dwFileFlagsMask", DWORD), + ("dwFileFlags", DWORD), + ("dwFileOS", DWORD), + ("dwFileType", DWORD), + ("dwFileSubtype", DWORD), + ("dwFileDateMS", DWORD), + ("dwFileDateLS", DWORD), + ] + + +# --- THREADNAME_INFO structure ------------------------------------------------ + + +# typedef struct tagTHREADNAME_INFO +# { +# DWORD dwType; // Must be 0x1000. +# LPCSTR szName; // Pointer to name (in user addr space). +# DWORD dwThreadID; // Thread ID (-1=caller thread). +# DWORD dwFlags; // Reserved for future use, must be zero. +# } THREADNAME_INFO; +class THREADNAME_INFO(Structure): + _fields_ = [ + ("dwType", DWORD), # 0x1000 + ("szName", LPVOID), # remote pointer + ("dwThreadID", DWORD), # -1 usually + ("dwFlags", DWORD), # 0 + ] + + +# --- MEMORY_BASIC_INFORMATION structure --------------------------------------- + + +# typedef struct _MEMORY_BASIC_INFORMATION32 { +# DWORD BaseAddress; +# DWORD AllocationBase; +# DWORD AllocationProtect; +# DWORD RegionSize; +# DWORD State; +# DWORD Protect; +# DWORD Type; +# } MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32; +class MEMORY_BASIC_INFORMATION32(Structure): + _fields_ = [ + ("BaseAddress", DWORD), # remote pointer + ("AllocationBase", DWORD), # remote pointer + ("AllocationProtect", DWORD), + ("RegionSize", DWORD), + ("State", DWORD), + ("Protect", DWORD), + ("Type", DWORD), + ] + + +# typedef struct DECLSPEC_ALIGN(16) _MEMORY_BASIC_INFORMATION64 { +# ULONGLONG BaseAddress; +# ULONGLONG AllocationBase; +# DWORD AllocationProtect; +# DWORD __alignment1; +# ULONGLONG RegionSize; +# DWORD State; +# DWORD Protect; +# DWORD Type; +# DWORD __alignment2; +# } MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64; +class MEMORY_BASIC_INFORMATION64(Structure): + _fields_ = [ + ("BaseAddress", ULONGLONG), # remote pointer + ("AllocationBase", ULONGLONG), # remote pointer + ("AllocationProtect", DWORD), + ("__alignment1", DWORD), + ("RegionSize", ULONGLONG), + ("State", DWORD), + ("Protect", DWORD), + ("Type", DWORD), + ("__alignment2", DWORD), + ] + + +# typedef struct _MEMORY_BASIC_INFORMATION { +# PVOID BaseAddress; +# PVOID AllocationBase; +# DWORD AllocationProtect; +# SIZE_T RegionSize; +# DWORD State; +# DWORD Protect; +# DWORD Type; +# } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; +class MEMORY_BASIC_INFORMATION(Structure): + _fields_ = [ + ("BaseAddress", SIZE_T), # remote pointer + ("AllocationBase", SIZE_T), # remote pointer + ("AllocationProtect", DWORD), + ("RegionSize", SIZE_T), + ("State", DWORD), + ("Protect", DWORD), + ("Type", DWORD), + ] + + +PMEMORY_BASIC_INFORMATION = POINTER(MEMORY_BASIC_INFORMATION) + +# --- BY_HANDLE_FILE_INFORMATION structure ------------------------------------- + + +# typedef struct _FILETIME { +# DWORD dwLowDateTime; +# DWORD dwHighDateTime; +# } FILETIME, *PFILETIME; +class FILETIME(Structure): + _fields_ = [ + ("dwLowDateTime", DWORD), + ("dwHighDateTime", DWORD), + ] + + +LPFILETIME = POINTER(FILETIME) + + +# typedef struct _SYSTEMTIME { +# WORD wYear; +# WORD wMonth; +# WORD wDayOfWeek; +# WORD wDay; +# WORD wHour; +# WORD wMinute; +# WORD wSecond; +# WORD wMilliseconds; +# }SYSTEMTIME, *PSYSTEMTIME; +class SYSTEMTIME(Structure): + _fields_ = [ + ("wYear", WORD), + ("wMonth", WORD), + ("wDayOfWeek", WORD), + ("wDay", WORD), + ("wHour", WORD), + ("wMinute", WORD), + ("wSecond", WORD), + ("wMilliseconds", WORD), + ] + + +LPSYSTEMTIME = POINTER(SYSTEMTIME) + + +# typedef struct _BY_HANDLE_FILE_INFORMATION { +# DWORD dwFileAttributes; +# FILETIME ftCreationTime; +# FILETIME ftLastAccessTime; +# FILETIME ftLastWriteTime; +# DWORD dwVolumeSerialNumber; +# DWORD nFileSizeHigh; +# DWORD nFileSizeLow; +# DWORD nNumberOfLinks; +# DWORD nFileIndexHigh; +# DWORD nFileIndexLow; +# } BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION; +class BY_HANDLE_FILE_INFORMATION(Structure): + _fields_ = [ + ("dwFileAttributes", DWORD), + ("ftCreationTime", FILETIME), + ("ftLastAccessTime", FILETIME), + ("ftLastWriteTime", FILETIME), + ("dwVolumeSerialNumber", DWORD), + ("nFileSizeHigh", DWORD), + ("nFileSizeLow", DWORD), + ("nNumberOfLinks", DWORD), + ("nFileIndexHigh", DWORD), + ("nFileIndexLow", DWORD), + ] + + +LPBY_HANDLE_FILE_INFORMATION = POINTER(BY_HANDLE_FILE_INFORMATION) + + +# typedef enum _FILE_INFO_BY_HANDLE_CLASS { +# FileBasicInfo = 0, +# FileStandardInfo = 1, +# FileNameInfo = 2, +# FileRenameInfo = 3, +# FileDispositionInfo = 4, +# FileAllocationInfo = 5, +# FileEndOfFileInfo = 6, +# FileStreamInfo = 7, +# FileCompressionInfo = 8, +# FileAttributeTagInfo = 9, +# FileIdBothDirectoryInfo = 10, +# FileIdBothDirectoryRestartInfo = 11, +# FileIoPriorityHintInfo = 12, +# MaximumFileInfoByHandlesClass = 13 +# } FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS; +class FILE_INFO_BY_HANDLE_CLASS(object): + FileBasicInfo = 0 + FileStandardInfo = 1 + FileNameInfo = 2 + FileRenameInfo = 3 + FileDispositionInfo = 4 + FileAllocationInfo = 5 + FileEndOfFileInfo = 6 + FileStreamInfo = 7 + FileCompressionInfo = 8 + FileAttributeTagInfo = 9 + FileIdBothDirectoryInfo = 10 + FileIdBothDirectoryRestartInfo = 11 + FileIoPriorityHintInfo = 12 + MaximumFileInfoByHandlesClass = 13 + + +# typedef struct _FILE_NAME_INFO { +# DWORD FileNameLength; +# WCHAR FileName[1]; +# } FILE_NAME_INFO, *PFILE_NAME_INFO; +##class FILE_NAME_INFO(Structure): +## _fields_ = [ +## ('FileNameLength', DWORD), +## ('FileName', WCHAR * 1), +## ] + +# TO DO: add more structures used by GetFileInformationByHandleEx() + +# --- PROCESS_INFORMATION structure -------------------------------------------- + + +# typedef struct _PROCESS_INFORMATION { +# HANDLE hProcess; +# HANDLE hThread; +# DWORD dwProcessId; +# DWORD dwThreadId; +# } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION; +class PROCESS_INFORMATION(Structure): + _fields_ = [ + ("hProcess", HANDLE), + ("hThread", HANDLE), + ("dwProcessId", DWORD), + ("dwThreadId", DWORD), + ] + + +LPPROCESS_INFORMATION = POINTER(PROCESS_INFORMATION) + +# --- STARTUPINFO and STARTUPINFOEX structures --------------------------------- + + +# typedef struct _STARTUPINFO { +# DWORD cb; +# LPTSTR lpReserved; +# LPTSTR lpDesktop; +# LPTSTR lpTitle; +# DWORD dwX; +# DWORD dwY; +# DWORD dwXSize; +# DWORD dwYSize; +# DWORD dwXCountChars; +# DWORD dwYCountChars; +# DWORD dwFillAttribute; +# DWORD dwFlags; +# WORD wShowWindow; +# WORD cbReserved2; +# LPBYTE lpReserved2; +# HANDLE hStdInput; +# HANDLE hStdOutput; +# HANDLE hStdError; +# }STARTUPINFO, *LPSTARTUPINFO; +class STARTUPINFO(Structure): + _fields_ = [ + ("cb", DWORD), + ("lpReserved", LPSTR), + ("lpDesktop", LPSTR), + ("lpTitle", LPSTR), + ("dwX", DWORD), + ("dwY", DWORD), + ("dwXSize", DWORD), + ("dwYSize", DWORD), + ("dwXCountChars", DWORD), + ("dwYCountChars", DWORD), + ("dwFillAttribute", DWORD), + ("dwFlags", DWORD), + ("wShowWindow", WORD), + ("cbReserved2", WORD), + ("lpReserved2", LPVOID), # LPBYTE + ("hStdInput", HANDLE), + ("hStdOutput", HANDLE), + ("hStdError", HANDLE), + ] + + +LPSTARTUPINFO = POINTER(STARTUPINFO) + + +# typedef struct _STARTUPINFOEX { +# STARTUPINFO StartupInfo; +# PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; +# } STARTUPINFOEX, *LPSTARTUPINFOEX; +class STARTUPINFOEX(Structure): + _fields_ = [ + ("StartupInfo", STARTUPINFO), + ("lpAttributeList", PPROC_THREAD_ATTRIBUTE_LIST), + ] + + +LPSTARTUPINFOEX = POINTER(STARTUPINFOEX) + + +class STARTUPINFOW(Structure): + _fields_ = [ + ("cb", DWORD), + ("lpReserved", LPWSTR), + ("lpDesktop", LPWSTR), + ("lpTitle", LPWSTR), + ("dwX", DWORD), + ("dwY", DWORD), + ("dwXSize", DWORD), + ("dwYSize", DWORD), + ("dwXCountChars", DWORD), + ("dwYCountChars", DWORD), + ("dwFillAttribute", DWORD), + ("dwFlags", DWORD), + ("wShowWindow", WORD), + ("cbReserved2", WORD), + ("lpReserved2", LPVOID), # LPBYTE + ("hStdInput", HANDLE), + ("hStdOutput", HANDLE), + ("hStdError", HANDLE), + ] + + +LPSTARTUPINFOW = POINTER(STARTUPINFOW) + + +class STARTUPINFOEXW(Structure): + _fields_ = [ + ("StartupInfo", STARTUPINFOW), + ("lpAttributeList", PPROC_THREAD_ATTRIBUTE_LIST), + ] + + +LPSTARTUPINFOEXW = POINTER(STARTUPINFOEXW) + +# --- JIT_DEBUG_INFO structure ------------------------------------------------- + + +# typedef struct _JIT_DEBUG_INFO { +# DWORD dwSize; +# DWORD dwProcessorArchitecture; +# DWORD dwThreadID; +# DWORD dwReserved0; +# ULONG64 lpExceptionAddress; +# ULONG64 lpExceptionRecord; +# ULONG64 lpContextRecord; +# } JIT_DEBUG_INFO, *LPJIT_DEBUG_INFO; +class JIT_DEBUG_INFO(Structure): + _fields_ = [ + ("dwSize", DWORD), + ("dwProcessorArchitecture", DWORD), + ("dwThreadID", DWORD), + ("dwReserved0", DWORD), + ("lpExceptionAddress", ULONG64), + ("lpExceptionRecord", ULONG64), + ("lpContextRecord", ULONG64), + ] + + +JIT_DEBUG_INFO32 = JIT_DEBUG_INFO +JIT_DEBUG_INFO64 = JIT_DEBUG_INFO + +LPJIT_DEBUG_INFO = POINTER(JIT_DEBUG_INFO) +LPJIT_DEBUG_INFO32 = POINTER(JIT_DEBUG_INFO32) +LPJIT_DEBUG_INFO64 = POINTER(JIT_DEBUG_INFO64) + +# --- DEBUG_EVENT structure ---------------------------------------------------- + + +# typedef struct _EXCEPTION_RECORD32 { +# DWORD ExceptionCode; +# DWORD ExceptionFlags; +# DWORD ExceptionRecord; +# DWORD ExceptionAddress; +# DWORD NumberParameters; +# DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +# } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32; +class EXCEPTION_RECORD32(Structure): + _fields_ = [ + ("ExceptionCode", DWORD), + ("ExceptionFlags", DWORD), + ("ExceptionRecord", DWORD), + ("ExceptionAddress", DWORD), + ("NumberParameters", DWORD), + ("ExceptionInformation", DWORD * EXCEPTION_MAXIMUM_PARAMETERS), + ] + + +PEXCEPTION_RECORD32 = POINTER(EXCEPTION_RECORD32) + + +# typedef struct _EXCEPTION_RECORD64 { +# DWORD ExceptionCode; +# DWORD ExceptionFlags; +# DWORD64 ExceptionRecord; +# DWORD64 ExceptionAddress; +# DWORD NumberParameters; +# DWORD __unusedAlignment; +# DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +# } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64; +class EXCEPTION_RECORD64(Structure): + _fields_ = [ + ("ExceptionCode", DWORD), + ("ExceptionFlags", DWORD), + ("ExceptionRecord", DWORD64), + ("ExceptionAddress", DWORD64), + ("NumberParameters", DWORD), + ("__unusedAlignment", DWORD), + ("ExceptionInformation", DWORD64 * EXCEPTION_MAXIMUM_PARAMETERS), + ] + + +PEXCEPTION_RECORD64 = POINTER(EXCEPTION_RECORD64) + + +# typedef struct _EXCEPTION_RECORD { +# DWORD ExceptionCode; +# DWORD ExceptionFlags; +# LPVOID ExceptionRecord; +# LPVOID ExceptionAddress; +# DWORD NumberParameters; +# LPVOID ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +# } EXCEPTION_RECORD, *PEXCEPTION_RECORD; +class EXCEPTION_RECORD(Structure): + pass + + +PEXCEPTION_RECORD = POINTER(EXCEPTION_RECORD) +EXCEPTION_RECORD._fields_ = [ + ("ExceptionCode", DWORD), + ("ExceptionFlags", DWORD), + ("ExceptionRecord", PEXCEPTION_RECORD), + ("ExceptionAddress", LPVOID), + ("NumberParameters", DWORD), + ("ExceptionInformation", LPVOID * EXCEPTION_MAXIMUM_PARAMETERS), +] + + +# typedef struct _EXCEPTION_DEBUG_INFO { +# EXCEPTION_RECORD ExceptionRecord; +# DWORD dwFirstChance; +# } EXCEPTION_DEBUG_INFO; +class EXCEPTION_DEBUG_INFO(Structure): + _fields_ = [ + ("ExceptionRecord", EXCEPTION_RECORD), + ("dwFirstChance", DWORD), + ] + + +# typedef struct _CREATE_THREAD_DEBUG_INFO { +# HANDLE hThread; +# LPVOID lpThreadLocalBase; +# LPTHREAD_START_ROUTINE lpStartAddress; +# } CREATE_THREAD_DEBUG_INFO; +class CREATE_THREAD_DEBUG_INFO(Structure): + _fields_ = [ + ("hThread", HANDLE), + ("lpThreadLocalBase", LPVOID), + ("lpStartAddress", LPVOID), + ] + + +# typedef struct _CREATE_PROCESS_DEBUG_INFO { +# HANDLE hFile; +# HANDLE hProcess; +# HANDLE hThread; +# LPVOID lpBaseOfImage; +# DWORD dwDebugInfoFileOffset; +# DWORD nDebugInfoSize; +# LPVOID lpThreadLocalBase; +# LPTHREAD_START_ROUTINE lpStartAddress; +# LPVOID lpImageName; +# WORD fUnicode; +# } CREATE_PROCESS_DEBUG_INFO; +class CREATE_PROCESS_DEBUG_INFO(Structure): + _fields_ = [ + ("hFile", HANDLE), + ("hProcess", HANDLE), + ("hThread", HANDLE), + ("lpBaseOfImage", LPVOID), + ("dwDebugInfoFileOffset", DWORD), + ("nDebugInfoSize", DWORD), + ("lpThreadLocalBase", LPVOID), + ("lpStartAddress", LPVOID), + ("lpImageName", LPVOID), + ("fUnicode", WORD), + ] + + +# typedef struct _EXIT_THREAD_DEBUG_INFO { +# DWORD dwExitCode; +# } EXIT_THREAD_DEBUG_INFO; +class EXIT_THREAD_DEBUG_INFO(Structure): + _fields_ = [ + ("dwExitCode", DWORD), + ] + + +# typedef struct _EXIT_PROCESS_DEBUG_INFO { +# DWORD dwExitCode; +# } EXIT_PROCESS_DEBUG_INFO; +class EXIT_PROCESS_DEBUG_INFO(Structure): + _fields_ = [ + ("dwExitCode", DWORD), + ] + + +# typedef struct _LOAD_DLL_DEBUG_INFO { +# HANDLE hFile; +# LPVOID lpBaseOfDll; +# DWORD dwDebugInfoFileOffset; +# DWORD nDebugInfoSize; +# LPVOID lpImageName; +# WORD fUnicode; +# } LOAD_DLL_DEBUG_INFO; +class LOAD_DLL_DEBUG_INFO(Structure): + _fields_ = [ + ("hFile", HANDLE), + ("lpBaseOfDll", LPVOID), + ("dwDebugInfoFileOffset", DWORD), + ("nDebugInfoSize", DWORD), + ("lpImageName", LPVOID), + ("fUnicode", WORD), + ] + + +# typedef struct _UNLOAD_DLL_DEBUG_INFO { +# LPVOID lpBaseOfDll; +# } UNLOAD_DLL_DEBUG_INFO; +class UNLOAD_DLL_DEBUG_INFO(Structure): + _fields_ = [ + ("lpBaseOfDll", LPVOID), + ] + + +# typedef struct _OUTPUT_DEBUG_STRING_INFO { +# LPSTR lpDebugStringData; +# WORD fUnicode; +# WORD nDebugStringLength; +# } OUTPUT_DEBUG_STRING_INFO; +class OUTPUT_DEBUG_STRING_INFO(Structure): + _fields_ = [ + ("lpDebugStringData", LPVOID), # don't use LPSTR + ("fUnicode", WORD), + ("nDebugStringLength", WORD), + ] + + +# typedef struct _RIP_INFO { +# DWORD dwError; +# DWORD dwType; +# } RIP_INFO, *LPRIP_INFO; +class RIP_INFO(Structure): + _fields_ = [ + ("dwError", DWORD), + ("dwType", DWORD), + ] + + +# typedef struct _DEBUG_EVENT { +# DWORD dwDebugEventCode; +# DWORD dwProcessId; +# DWORD dwThreadId; +# union { +# EXCEPTION_DEBUG_INFO Exception; +# CREATE_THREAD_DEBUG_INFO CreateThread; +# CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; +# EXIT_THREAD_DEBUG_INFO ExitThread; +# EXIT_PROCESS_DEBUG_INFO ExitProcess; +# LOAD_DLL_DEBUG_INFO LoadDll; +# UNLOAD_DLL_DEBUG_INFO UnloadDll; +# OUTPUT_DEBUG_STRING_INFO DebugString; +# RIP_INFO RipInfo; +# } u; +# } DEBUG_EVENT;. +class _DEBUG_EVENT_UNION_(Union): + _fields_ = [ + ("Exception", EXCEPTION_DEBUG_INFO), + ("CreateThread", CREATE_THREAD_DEBUG_INFO), + ("CreateProcessInfo", CREATE_PROCESS_DEBUG_INFO), + ("ExitThread", EXIT_THREAD_DEBUG_INFO), + ("ExitProcess", EXIT_PROCESS_DEBUG_INFO), + ("LoadDll", LOAD_DLL_DEBUG_INFO), + ("UnloadDll", UNLOAD_DLL_DEBUG_INFO), + ("DebugString", OUTPUT_DEBUG_STRING_INFO), + ("RipInfo", RIP_INFO), + ] + + +class DEBUG_EVENT(Structure): + _fields_ = [ + ("dwDebugEventCode", DWORD), + ("dwProcessId", DWORD), + ("dwThreadId", DWORD), + ("u", _DEBUG_EVENT_UNION_), + ] + + +LPDEBUG_EVENT = POINTER(DEBUG_EVENT) + +# --- Console API defines and structures --------------------------------------- + +FOREGROUND_MASK = 0x000F +BACKGROUND_MASK = 0x00F0 +COMMON_LVB_MASK = 0xFF00 + +FOREGROUND_BLACK = 0x0000 +FOREGROUND_BLUE = 0x0001 +FOREGROUND_GREEN = 0x0002 +FOREGROUND_CYAN = 0x0003 +FOREGROUND_RED = 0x0004 +FOREGROUND_MAGENTA = 0x0005 +FOREGROUND_YELLOW = 0x0006 +FOREGROUND_GREY = 0x0007 +FOREGROUND_INTENSITY = 0x0008 + +BACKGROUND_BLACK = 0x0000 +BACKGROUND_BLUE = 0x0010 +BACKGROUND_GREEN = 0x0020 +BACKGROUND_CYAN = 0x0030 +BACKGROUND_RED = 0x0040 +BACKGROUND_MAGENTA = 0x0050 +BACKGROUND_YELLOW = 0x0060 +BACKGROUND_GREY = 0x0070 +BACKGROUND_INTENSITY = 0x0080 + +COMMON_LVB_LEADING_BYTE = 0x0100 +COMMON_LVB_TRAILING_BYTE = 0x0200 +COMMON_LVB_GRID_HORIZONTAL = 0x0400 +COMMON_LVB_GRID_LVERTICAL = 0x0800 +COMMON_LVB_GRID_RVERTICAL = 0x1000 +COMMON_LVB_REVERSE_VIDEO = 0x4000 +COMMON_LVB_UNDERSCORE = 0x8000 + + +# typedef struct _CHAR_INFO { +# union { +# WCHAR UnicodeChar; +# CHAR AsciiChar; +# } Char; +# WORD Attributes; +# } CHAR_INFO, *PCHAR_INFO; +class _CHAR_INFO_CHAR(Union): + _fields_ = [ + ("UnicodeChar", WCHAR), + ("AsciiChar", CHAR), + ] + + +class CHAR_INFO(Structure): + _fields_ = [ + ("Char", _CHAR_INFO_CHAR), + ("Attributes", WORD), + ] + + +PCHAR_INFO = POINTER(CHAR_INFO) + + +# typedef struct _COORD { +# SHORT X; +# SHORT Y; +# } COORD, *PCOORD; +class COORD(Structure): + _fields_ = [ + ("X", SHORT), + ("Y", SHORT), + ] + + +PCOORD = POINTER(COORD) + + +# typedef struct _SMALL_RECT { +# SHORT Left; +# SHORT Top; +# SHORT Right; +# SHORT Bottom; +# } SMALL_RECT; +class SMALL_RECT(Structure): + _fields_ = [ + ("Left", SHORT), + ("Top", SHORT), + ("Right", SHORT), + ("Bottom", SHORT), + ] + + +PSMALL_RECT = POINTER(SMALL_RECT) + + +# typedef struct _CONSOLE_SCREEN_BUFFER_INFO { +# COORD dwSize; +# COORD dwCursorPosition; +# WORD wAttributes; +# SMALL_RECT srWindow; +# COORD dwMaximumWindowSize; +# } CONSOLE_SCREEN_BUFFER_INFO; +class CONSOLE_SCREEN_BUFFER_INFO(Structure): + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", WORD), + ("srWindow", SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + + +PCONSOLE_SCREEN_BUFFER_INFO = POINTER(CONSOLE_SCREEN_BUFFER_INFO) + +# --- Toolhelp library defines and structures ---------------------------------- + +TH32CS_SNAPHEAPLIST = 0x00000001 +TH32CS_SNAPPROCESS = 0x00000002 +TH32CS_SNAPTHREAD = 0x00000004 +TH32CS_SNAPMODULE = 0x00000008 +TH32CS_INHERIT = 0x80000000 +TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE + + +# typedef struct tagTHREADENTRY32 { +# DWORD dwSize; +# DWORD cntUsage; +# DWORD th32ThreadID; +# DWORD th32OwnerProcessID; +# LONG tpBasePri; +# LONG tpDeltaPri; +# DWORD dwFlags; +# } THREADENTRY32, *PTHREADENTRY32; +class THREADENTRY32(Structure): + _fields_ = [ + ("dwSize", DWORD), + ("cntUsage", DWORD), + ("th32ThreadID", DWORD), + ("th32OwnerProcessID", DWORD), + ("tpBasePri", LONG), + ("tpDeltaPri", LONG), + ("dwFlags", DWORD), + ] + + +LPTHREADENTRY32 = POINTER(THREADENTRY32) + + +# typedef struct tagPROCESSENTRY32 { +# DWORD dwSize; +# DWORD cntUsage; +# DWORD th32ProcessID; +# ULONG_PTR th32DefaultHeapID; +# DWORD th32ModuleID; +# DWORD cntThreads; +# DWORD th32ParentProcessID; +# LONG pcPriClassBase; +# DWORD dwFlags; +# TCHAR szExeFile[MAX_PATH]; +# } PROCESSENTRY32, *PPROCESSENTRY32; +class PROCESSENTRY32(Structure): + _fields_ = [ + ("dwSize", DWORD), + ("cntUsage", DWORD), + ("th32ProcessID", DWORD), + ("th32DefaultHeapID", ULONG_PTR), + ("th32ModuleID", DWORD), + ("cntThreads", DWORD), + ("th32ParentProcessID", DWORD), + ("pcPriClassBase", LONG), + ("dwFlags", DWORD), + ("szExeFile", TCHAR * 260), + ] + + +LPPROCESSENTRY32 = POINTER(PROCESSENTRY32) + + +# typedef struct tagMODULEENTRY32 { +# DWORD dwSize; +# DWORD th32ModuleID; +# DWORD th32ProcessID; +# DWORD GlblcntUsage; +# DWORD ProccntUsage; +# BYTE* modBaseAddr; +# DWORD modBaseSize; +# HMODULE hModule; +# TCHAR szModule[MAX_MODULE_NAME32 + 1]; +# TCHAR szExePath[MAX_PATH]; +# } MODULEENTRY32, *PMODULEENTRY32; +class MODULEENTRY32(Structure): + _fields_ = [ + ("dwSize", DWORD), + ("th32ModuleID", DWORD), + ("th32ProcessID", DWORD), + ("GlblcntUsage", DWORD), + ("ProccntUsage", DWORD), + ("modBaseAddr", LPVOID), # BYTE* + ("modBaseSize", DWORD), + ("hModule", HMODULE), + ("szModule", TCHAR * (MAX_MODULE_NAME32 + 1)), + ("szExePath", TCHAR * MAX_PATH), + ] + + +LPMODULEENTRY32 = POINTER(MODULEENTRY32) + + +# typedef struct tagHEAPENTRY32 { +# SIZE_T dwSize; +# HANDLE hHandle; +# ULONG_PTR dwAddress; +# SIZE_T dwBlockSize; +# DWORD dwFlags; +# DWORD dwLockCount; +# DWORD dwResvd; +# DWORD th32ProcessID; +# ULONG_PTR th32HeapID; +# } HEAPENTRY32, +# *PHEAPENTRY32; +class HEAPENTRY32(Structure): + _fields_ = [ + ("dwSize", SIZE_T), + ("hHandle", HANDLE), + ("dwAddress", ULONG_PTR), + ("dwBlockSize", SIZE_T), + ("dwFlags", DWORD), + ("dwLockCount", DWORD), + ("dwResvd", DWORD), + ("th32ProcessID", DWORD), + ("th32HeapID", ULONG_PTR), + ] + + +LPHEAPENTRY32 = POINTER(HEAPENTRY32) + + +# typedef struct tagHEAPLIST32 { +# SIZE_T dwSize; +# DWORD th32ProcessID; +# ULONG_PTR th32HeapID; +# DWORD dwFlags; +# } HEAPLIST32, +# *PHEAPLIST32; +class HEAPLIST32(Structure): + _fields_ = [ + ("dwSize", SIZE_T), + ("th32ProcessID", DWORD), + ("th32HeapID", ULONG_PTR), + ("dwFlags", DWORD), + ] + + +LPHEAPLIST32 = POINTER(HEAPLIST32) + +# --- kernel32.dll ------------------------------------------------------------- + + +# DWORD WINAPI GetLastError(void); +def GetLastError(): + _GetLastError = windll.kernel32.GetLastError + _GetLastError.argtypes = [] + _GetLastError.restype = DWORD + return _GetLastError() + + +# void WINAPI SetLastError( +# __in DWORD dwErrCode +# ); +def SetLastError(dwErrCode): + _SetLastError = windll.kernel32.SetLastError + _SetLastError.argtypes = [DWORD] + _SetLastError.restype = None + _SetLastError(dwErrCode) + + +# UINT WINAPI GetErrorMode(void); +def GetErrorMode(): + _GetErrorMode = windll.kernel32.GetErrorMode + _GetErrorMode.argtypes = [] + _GetErrorMode.restype = UINT + return _GetErrorMode() + + +# UINT WINAPI SetErrorMode( +# __in UINT uMode +# ); +def SetErrorMode(uMode): + _SetErrorMode = windll.kernel32.SetErrorMode + _SetErrorMode.argtypes = [UINT] + _SetErrorMode.restype = UINT + return _SetErrorMode(dwErrCode) + + +# DWORD GetThreadErrorMode(void); +def GetThreadErrorMode(): + _GetThreadErrorMode = windll.kernel32.GetThreadErrorMode + _GetThreadErrorMode.argtypes = [] + _GetThreadErrorMode.restype = DWORD + return _GetThreadErrorMode() + + +# BOOL SetThreadErrorMode( +# __in DWORD dwNewMode, +# __out LPDWORD lpOldMode +# ); +def SetThreadErrorMode(dwNewMode): + _SetThreadErrorMode = windll.kernel32.SetThreadErrorMode + _SetThreadErrorMode.argtypes = [DWORD, LPDWORD] + _SetThreadErrorMode.restype = BOOL + _SetThreadErrorMode.errcheck = RaiseIfZero + + old = DWORD(0) + _SetThreadErrorMode(dwErrCode, byref(old)) + return old.value + + +# BOOL WINAPI CloseHandle( +# __in HANDLE hObject +# ); +def CloseHandle(hHandle): + if isinstance(hHandle, Handle): + # Prevents the handle from being closed without notifying the Handle object. + hHandle.close() + else: + _CloseHandle = windll.kernel32.CloseHandle + _CloseHandle.argtypes = [HANDLE] + _CloseHandle.restype = bool + _CloseHandle.errcheck = RaiseIfZero + _CloseHandle(hHandle) + + +# BOOL WINAPI DuplicateHandle( +# __in HANDLE hSourceProcessHandle, +# __in HANDLE hSourceHandle, +# __in HANDLE hTargetProcessHandle, +# __out LPHANDLE lpTargetHandle, +# __in DWORD dwDesiredAccess, +# __in BOOL bInheritHandle, +# __in DWORD dwOptions +# ); +def DuplicateHandle( + hSourceHandle, + hSourceProcessHandle=None, + hTargetProcessHandle=None, + dwDesiredAccess=STANDARD_RIGHTS_ALL, + bInheritHandle=False, + dwOptions=DUPLICATE_SAME_ACCESS, +): + _DuplicateHandle = windll.kernel32.DuplicateHandle + _DuplicateHandle.argtypes = [HANDLE, HANDLE, HANDLE, LPHANDLE, DWORD, BOOL, DWORD] + _DuplicateHandle.restype = bool + _DuplicateHandle.errcheck = RaiseIfZero + + # NOTE: the arguments to this function are in a different order, + # so we can set default values for all of them but one (hSourceHandle). + + if hSourceProcessHandle is None: + hSourceProcessHandle = GetCurrentProcess() + if hTargetProcessHandle is None: + hTargetProcessHandle = hSourceProcessHandle + lpTargetHandle = HANDLE(INVALID_HANDLE_VALUE) + _DuplicateHandle( + hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, byref(lpTargetHandle), dwDesiredAccess, bool(bInheritHandle), dwOptions + ) + if isinstance(hSourceHandle, Handle): + HandleClass = hSourceHandle.__class__ + else: + HandleClass = Handle + if hasattr(hSourceHandle, "dwAccess"): + return HandleClass(lpTargetHandle.value, dwAccess=hSourceHandle.dwAccess) + else: + return HandleClass(lpTargetHandle.value) + + +# HLOCAL WINAPI LocalFree( +# __in HLOCAL hMem +# ); +def LocalFree(hMem): + _LocalFree = windll.kernel32.LocalFree + _LocalFree.argtypes = [HLOCAL] + _LocalFree.restype = HLOCAL + + result = _LocalFree(hMem) + if result != NULL: + ctypes.WinError() + + +# ------------------------------------------------------------------------------ +# Console API + + +# HANDLE WINAPI GetStdHandle( +# _In_ DWORD nStdHandle +# ); +def GetStdHandle(nStdHandle): + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argytpes = [DWORD] + _GetStdHandle.restype = HANDLE + _GetStdHandle.errcheck = RaiseIfZero + return Handle(_GetStdHandle(nStdHandle), bOwnership=False) + + +# BOOL WINAPI SetStdHandle( +# _In_ DWORD nStdHandle, +# _In_ HANDLE hHandle +# ); + +# TODO + + +# UINT WINAPI GetConsoleCP(void); +def GetConsoleCP(): + _GetConsoleCP = windll.kernel32.GetConsoleCP + _GetConsoleCP.argytpes = [] + _GetConsoleCP.restype = UINT + return _GetConsoleCP() + + +# UINT WINAPI GetConsoleOutputCP(void); +def GetConsoleOutputCP(): + _GetConsoleOutputCP = windll.kernel32.GetConsoleOutputCP + _GetConsoleOutputCP.argytpes = [] + _GetConsoleOutputCP.restype = UINT + return _GetConsoleOutputCP() + + +# BOOL WINAPI SetConsoleCP( +# _In_ UINT wCodePageID +# ); +def SetConsoleCP(wCodePageID): + _SetConsoleCP = windll.kernel32.SetConsoleCP + _SetConsoleCP.argytpes = [UINT] + _SetConsoleCP.restype = bool + _SetConsoleCP.errcheck = RaiseIfZero + _SetConsoleCP(wCodePageID) + + +# BOOL WINAPI SetConsoleOutputCP( +# _In_ UINT wCodePageID +# ); +def SetConsoleOutputCP(wCodePageID): + _SetConsoleOutputCP = windll.kernel32.SetConsoleOutputCP + _SetConsoleOutputCP.argytpes = [UINT] + _SetConsoleOutputCP.restype = bool + _SetConsoleOutputCP.errcheck = RaiseIfZero + _SetConsoleOutputCP(wCodePageID) + + +# HANDLE WINAPI CreateConsoleScreenBuffer( +# _In_ DWORD dwDesiredAccess, +# _In_ DWORD dwShareMode, +# _In_opt_ const SECURITY_ATTRIBUTES *lpSecurityAttributes, +# _In_ DWORD dwFlags, +# _Reserved_ LPVOID lpScreenBufferData +# ); + +# TODO + + +# BOOL WINAPI SetConsoleActiveScreenBuffer( +# _In_ HANDLE hConsoleOutput +# ); +def SetConsoleActiveScreenBuffer(hConsoleOutput=None): + _SetConsoleActiveScreenBuffer = windll.kernel32.SetConsoleActiveScreenBuffer + _SetConsoleActiveScreenBuffer.argytpes = [HANDLE] + _SetConsoleActiveScreenBuffer.restype = bool + _SetConsoleActiveScreenBuffer.errcheck = RaiseIfZero + + if hConsoleOutput is None: + hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE) + _SetConsoleActiveScreenBuffer(hConsoleOutput) + + +# BOOL WINAPI GetConsoleScreenBufferInfo( +# _In_ HANDLE hConsoleOutput, +# _Out_ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo +# ); +def GetConsoleScreenBufferInfo(hConsoleOutput=None): + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argytpes = [HANDLE, PCONSOLE_SCREEN_BUFFER_INFO] + _GetConsoleScreenBufferInfo.restype = bool + _GetConsoleScreenBufferInfo.errcheck = RaiseIfZero + + if hConsoleOutput is None: + hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE) + ConsoleScreenBufferInfo = CONSOLE_SCREEN_BUFFER_INFO() + _GetConsoleScreenBufferInfo(hConsoleOutput, byref(ConsoleScreenBufferInfo)) + return ConsoleScreenBufferInfo + + +# BOOL WINAPI GetConsoleScreenBufferInfoEx( +# _In_ HANDLE hConsoleOutput, +# _Out_ PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx +# ); + +# TODO + + +# BOOL WINAPI SetConsoleWindowInfo( +# _In_ HANDLE hConsoleOutput, +# _In_ BOOL bAbsolute, +# _In_ const SMALL_RECT *lpConsoleWindow +# ); +def SetConsoleWindowInfo(hConsoleOutput, bAbsolute, lpConsoleWindow): + _SetConsoleWindowInfo = windll.kernel32.SetConsoleWindowInfo + _SetConsoleWindowInfo.argytpes = [HANDLE, BOOL, PSMALL_RECT] + _SetConsoleWindowInfo.restype = bool + _SetConsoleWindowInfo.errcheck = RaiseIfZero + + if hConsoleOutput is None: + hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE) + if isinstance(lpConsoleWindow, SMALL_RECT): + ConsoleWindow = lpConsoleWindow + else: + ConsoleWindow = SMALL_RECT(*lpConsoleWindow) + _SetConsoleWindowInfo(hConsoleOutput, bAbsolute, byref(ConsoleWindow)) + + +# BOOL WINAPI SetConsoleTextAttribute( +# _In_ HANDLE hConsoleOutput, +# _In_ WORD wAttributes +# ); +def SetConsoleTextAttribute(hConsoleOutput=None, wAttributes=0): + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argytpes = [HANDLE, WORD] + _SetConsoleTextAttribute.restype = bool + _SetConsoleTextAttribute.errcheck = RaiseIfZero + + if hConsoleOutput is None: + hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE) + _SetConsoleTextAttribute(hConsoleOutput, wAttributes) + + +# HANDLE WINAPI CreateConsoleScreenBuffer( +# _In_ DWORD dwDesiredAccess, +# _In_ DWORD dwShareMode, +# _In_opt_ const SECURITY_ATTRIBUTES *lpSecurityAttributes, +# _In_ DWORD dwFlags, +# _Reserved_ LPVOID lpScreenBufferData +# ); + +# TODO + + +# BOOL WINAPI AllocConsole(void); +def AllocConsole(): + _AllocConsole = windll.kernel32.AllocConsole + _AllocConsole.argytpes = [] + _AllocConsole.restype = bool + _AllocConsole.errcheck = RaiseIfZero + _AllocConsole() + + +# BOOL WINAPI AttachConsole( +# _In_ DWORD dwProcessId +# ); +def AttachConsole(dwProcessId=ATTACH_PARENT_PROCESS): + _AttachConsole = windll.kernel32.AttachConsole + _AttachConsole.argytpes = [DWORD] + _AttachConsole.restype = bool + _AttachConsole.errcheck = RaiseIfZero + _AttachConsole(dwProcessId) + + +# BOOL WINAPI FreeConsole(void); +def FreeConsole(): + _FreeConsole = windll.kernel32.FreeConsole + _FreeConsole.argytpes = [] + _FreeConsole.restype = bool + _FreeConsole.errcheck = RaiseIfZero + _FreeConsole() + + +# DWORD WINAPI GetConsoleProcessList( +# _Out_ LPDWORD lpdwProcessList, +# _In_ DWORD dwProcessCount +# ); + +# TODO + +# DWORD WINAPI GetConsoleTitle( +# _Out_ LPTSTR lpConsoleTitle, +# _In_ DWORD nSize +# ); + +# TODO + +# BOOL WINAPI SetConsoleTitle( +# _In_ LPCTSTR lpConsoleTitle +# ); + +# TODO + +# COORD WINAPI GetLargestConsoleWindowSize( +# _In_ HANDLE hConsoleOutput +# ); + +# TODO + +# BOOL WINAPI GetConsoleHistoryInfo( +# _Out_ PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo +# ); + +# TODO + +# ------------------------------------------------------------------------------ +# DLL API + + +# DWORD WINAPI GetDllDirectory( +# __in DWORD nBufferLength, +# __out LPTSTR lpBuffer +# ); +def GetDllDirectoryA(): + _GetDllDirectoryA = windll.kernel32.GetDllDirectoryA + _GetDllDirectoryA.argytpes = [DWORD, LPSTR] + _GetDllDirectoryA.restype = DWORD + + nBufferLength = _GetDllDirectoryA(0, None) + if nBufferLength == 0: + return None + lpBuffer = ctypes.create_string_buffer("", nBufferLength) + _GetDllDirectoryA(nBufferLength, byref(lpBuffer)) + return lpBuffer.value + + +def GetDllDirectoryW(): + _GetDllDirectoryW = windll.kernel32.GetDllDirectoryW + _GetDllDirectoryW.argytpes = [DWORD, LPWSTR] + _GetDllDirectoryW.restype = DWORD + + nBufferLength = _GetDllDirectoryW(0, None) + if nBufferLength == 0: + return None + lpBuffer = ctypes.create_unicode_buffer("", nBufferLength) + _GetDllDirectoryW(nBufferLength, byref(lpBuffer)) + return lpBuffer.value + + +GetDllDirectory = GuessStringType(GetDllDirectoryA, GetDllDirectoryW) + + +# BOOL WINAPI SetDllDirectory( +# __in_opt LPCTSTR lpPathName +# ); +def SetDllDirectoryA(lpPathName=None): + _SetDllDirectoryA = windll.kernel32.SetDllDirectoryA + _SetDllDirectoryA.argytpes = [LPSTR] + _SetDllDirectoryA.restype = bool + _SetDllDirectoryA.errcheck = RaiseIfZero + _SetDllDirectoryA(lpPathName) + + +def SetDllDirectoryW(lpPathName): + _SetDllDirectoryW = windll.kernel32.SetDllDirectoryW + _SetDllDirectoryW.argytpes = [LPWSTR] + _SetDllDirectoryW.restype = bool + _SetDllDirectoryW.errcheck = RaiseIfZero + _SetDllDirectoryW(lpPathName) + + +SetDllDirectory = GuessStringType(SetDllDirectoryA, SetDllDirectoryW) + + +# HMODULE WINAPI LoadLibrary( +# __in LPCTSTR lpFileName +# ); +def LoadLibraryA(pszLibrary): + _LoadLibraryA = windll.kernel32.LoadLibraryA + _LoadLibraryA.argtypes = [LPSTR] + _LoadLibraryA.restype = HMODULE + hModule = _LoadLibraryA(pszLibrary) + if hModule == NULL: + raise ctypes.WinError() + return hModule + + +def LoadLibraryW(pszLibrary): + _LoadLibraryW = windll.kernel32.LoadLibraryW + _LoadLibraryW.argtypes = [LPWSTR] + _LoadLibraryW.restype = HMODULE + hModule = _LoadLibraryW(pszLibrary) + if hModule == NULL: + raise ctypes.WinError() + return hModule + + +LoadLibrary = GuessStringType(LoadLibraryA, LoadLibraryW) + + +# HMODULE WINAPI LoadLibraryEx( +# __in LPCTSTR lpFileName, +# __reserved HANDLE hFile, +# __in DWORD dwFlags +# ); +def LoadLibraryExA(pszLibrary, dwFlags=0): + _LoadLibraryExA = windll.kernel32.LoadLibraryExA + _LoadLibraryExA.argtypes = [LPSTR, HANDLE, DWORD] + _LoadLibraryExA.restype = HMODULE + hModule = _LoadLibraryExA(pszLibrary, NULL, dwFlags) + if hModule == NULL: + raise ctypes.WinError() + return hModule + + +def LoadLibraryExW(pszLibrary, dwFlags=0): + _LoadLibraryExW = windll.kernel32.LoadLibraryExW + _LoadLibraryExW.argtypes = [LPWSTR, HANDLE, DWORD] + _LoadLibraryExW.restype = HMODULE + hModule = _LoadLibraryExW(pszLibrary, NULL, dwFlags) + if hModule == NULL: + raise ctypes.WinError() + return hModule + + +LoadLibraryEx = GuessStringType(LoadLibraryExA, LoadLibraryExW) + + +# HMODULE WINAPI GetModuleHandle( +# __in_opt LPCTSTR lpModuleName +# ); +def GetModuleHandleA(lpModuleName): + _GetModuleHandleA = windll.kernel32.GetModuleHandleA + _GetModuleHandleA.argtypes = [LPSTR] + _GetModuleHandleA.restype = HMODULE + hModule = _GetModuleHandleA(lpModuleName) + if hModule == NULL: + raise ctypes.WinError() + return hModule + + +def GetModuleHandleW(lpModuleName): + _GetModuleHandleW = windll.kernel32.GetModuleHandleW + _GetModuleHandleW.argtypes = [LPWSTR] + _GetModuleHandleW.restype = HMODULE + hModule = _GetModuleHandleW(lpModuleName) + if hModule == NULL: + raise ctypes.WinError() + return hModule + + +GetModuleHandle = GuessStringType(GetModuleHandleA, GetModuleHandleW) + + +# FARPROC WINAPI GetProcAddress( +# __in HMODULE hModule, +# __in LPCSTR lpProcName +# ); +def GetProcAddressA(hModule, lpProcName): + _GetProcAddress = windll.kernel32.GetProcAddress + _GetProcAddress.argtypes = [HMODULE, LPVOID] + _GetProcAddress.restype = LPVOID + + if type(lpProcName) in (type(0), type(long(0))): + lpProcName = LPVOID(lpProcName) + if lpProcName.value & (~0xFFFF): + raise ValueError("Ordinal number too large: %d" % lpProcName.value) + elif type(lpProcName) == type(compat.b("")): + lpProcName = ctypes.c_char_p(lpProcName) + else: + raise TypeError(str(type(lpProcName))) + return _GetProcAddress(hModule, lpProcName) + + +GetProcAddressW = MakeWideVersion(GetProcAddressA) +GetProcAddress = GuessStringType(GetProcAddressA, GetProcAddressW) + + +# BOOL WINAPI FreeLibrary( +# __in HMODULE hModule +# ); +def FreeLibrary(hModule): + _FreeLibrary = windll.kernel32.FreeLibrary + _FreeLibrary.argtypes = [HMODULE] + _FreeLibrary.restype = bool + _FreeLibrary.errcheck = RaiseIfZero + _FreeLibrary(hModule) + + +# PVOID WINAPI RtlPcToFileHeader( +# __in PVOID PcValue, +# __out PVOID *BaseOfImage +# ); +def RtlPcToFileHeader(PcValue): + _RtlPcToFileHeader = windll.kernel32.RtlPcToFileHeader + _RtlPcToFileHeader.argtypes = [PVOID, POINTER(PVOID)] + _RtlPcToFileHeader.restype = PRUNTIME_FUNCTION + + BaseOfImage = PVOID(0) + _RtlPcToFileHeader(PcValue, byref(BaseOfImage)) + return BaseOfImage.value + + +# ------------------------------------------------------------------------------ +# File API and related + + +# BOOL WINAPI GetHandleInformation( +# __in HANDLE hObject, +# __out LPDWORD lpdwFlags +# ); +def GetHandleInformation(hObject): + _GetHandleInformation = windll.kernel32.GetHandleInformation + _GetHandleInformation.argtypes = [HANDLE, PDWORD] + _GetHandleInformation.restype = bool + _GetHandleInformation.errcheck = RaiseIfZero + + dwFlags = DWORD(0) + _GetHandleInformation(hObject, byref(dwFlags)) + return dwFlags.value + + +# BOOL WINAPI SetHandleInformation( +# __in HANDLE hObject, +# __in DWORD dwMask, +# __in DWORD dwFlags +# ); +def SetHandleInformation(hObject, dwMask, dwFlags): + _SetHandleInformation = windll.kernel32.SetHandleInformation + _SetHandleInformation.argtypes = [HANDLE, DWORD, DWORD] + _SetHandleInformation.restype = bool + _SetHandleInformation.errcheck = RaiseIfZero + _SetHandleInformation(hObject, dwMask, dwFlags) + + +# UINT WINAPI GetWindowModuleFileName( +# __in HWND hwnd, +# __out LPTSTR lpszFileName, +# __in UINT cchFileNameMax +# ); +# Not included because it doesn't work in other processes. +# See: http://support.microsoft.com/?id=228469 + + +# BOOL WINAPI QueryFullProcessImageName( +# __in HANDLE hProcess, +# __in DWORD dwFlags, +# __out LPTSTR lpExeName, +# __inout PDWORD lpdwSize +# ); +def QueryFullProcessImageNameA(hProcess, dwFlags=0): + _QueryFullProcessImageNameA = windll.kernel32.QueryFullProcessImageNameA + _QueryFullProcessImageNameA.argtypes = [HANDLE, DWORD, LPSTR, PDWORD] + _QueryFullProcessImageNameA.restype = bool + + dwSize = MAX_PATH + while 1: + lpdwSize = DWORD(dwSize) + lpExeName = ctypes.create_string_buffer("", lpdwSize.value + 1) + success = _QueryFullProcessImageNameA(hProcess, dwFlags, lpExeName, byref(lpdwSize)) + if success and 0 < lpdwSize.value < dwSize: + break + error = GetLastError() + if error != ERROR_INSUFFICIENT_BUFFER: + raise ctypes.WinError(error) + dwSize = dwSize + 256 + if dwSize > 0x1000: + # this prevents an infinite loop in Windows 2008 when the path has spaces, + # see http://msdn.microsoft.com/en-us/library/ms684919(VS.85).aspx#4 + raise ctypes.WinError(error) + return lpExeName.value + + +def QueryFullProcessImageNameW(hProcess, dwFlags=0): + _QueryFullProcessImageNameW = windll.kernel32.QueryFullProcessImageNameW + _QueryFullProcessImageNameW.argtypes = [HANDLE, DWORD, LPWSTR, PDWORD] + _QueryFullProcessImageNameW.restype = bool + + dwSize = MAX_PATH + while 1: + lpdwSize = DWORD(dwSize) + lpExeName = ctypes.create_unicode_buffer("", lpdwSize.value + 1) + success = _QueryFullProcessImageNameW(hProcess, dwFlags, lpExeName, byref(lpdwSize)) + if success and 0 < lpdwSize.value < dwSize: + break + error = GetLastError() + if error != ERROR_INSUFFICIENT_BUFFER: + raise ctypes.WinError(error) + dwSize = dwSize + 256 + if dwSize > 0x1000: + # this prevents an infinite loop in Windows 2008 when the path has spaces, + # see http://msdn.microsoft.com/en-us/library/ms684919(VS.85).aspx#4 + raise ctypes.WinError(error) + return lpExeName.value + + +QueryFullProcessImageName = GuessStringType(QueryFullProcessImageNameA, QueryFullProcessImageNameW) + + +# DWORD WINAPI GetLogicalDriveStrings( +# __in DWORD nBufferLength, +# __out LPTSTR lpBuffer +# ); +def GetLogicalDriveStringsA(): + _GetLogicalDriveStringsA = ctypes.windll.kernel32.GetLogicalDriveStringsA + _GetLogicalDriveStringsA.argtypes = [DWORD, LPSTR] + _GetLogicalDriveStringsA.restype = DWORD + _GetLogicalDriveStringsA.errcheck = RaiseIfZero + + nBufferLength = (4 * 26) + 1 # "X:\\\0" from A to Z plus empty string + lpBuffer = ctypes.create_string_buffer("", nBufferLength) + _GetLogicalDriveStringsA(nBufferLength, lpBuffer) + drive_strings = list() + string_p = addressof(lpBuffer) + sizeof_char = sizeof(ctypes.c_char) + while True: + string_v = ctypes.string_at(string_p) + if string_v == "": + break + drive_strings.append(string_v) + string_p += len(string_v) + sizeof_char + return drive_strings + + +def GetLogicalDriveStringsW(): + _GetLogicalDriveStringsW = ctypes.windll.kernel32.GetLogicalDriveStringsW + _GetLogicalDriveStringsW.argtypes = [DWORD, LPWSTR] + _GetLogicalDriveStringsW.restype = DWORD + _GetLogicalDriveStringsW.errcheck = RaiseIfZero + + nBufferLength = (4 * 26) + 1 # "X:\\\0" from A to Z plus empty string + lpBuffer = ctypes.create_unicode_buffer("", nBufferLength) + _GetLogicalDriveStringsW(nBufferLength, lpBuffer) + drive_strings = list() + string_p = addressof(lpBuffer) + sizeof_wchar = sizeof(ctypes.c_wchar) + while True: + string_v = ctypes.wstring_at(string_p) + if string_v == "": + break + drive_strings.append(string_v) + string_p += (len(string_v) * sizeof_wchar) + sizeof_wchar + return drive_strings + + +##def GetLogicalDriveStringsA(): +## _GetLogicalDriveStringsA = windll.kernel32.GetLogicalDriveStringsA +## _GetLogicalDriveStringsA.argtypes = [DWORD, LPSTR] +## _GetLogicalDriveStringsA.restype = DWORD +## _GetLogicalDriveStringsA.errcheck = RaiseIfZero +## +## nBufferLength = (4 * 26) + 1 # "X:\\\0" from A to Z plus empty string +## lpBuffer = ctypes.create_string_buffer('', nBufferLength) +## _GetLogicalDriveStringsA(nBufferLength, lpBuffer) +## result = list() +## index = 0 +## while 1: +## string = list() +## while 1: +## character = lpBuffer[index] +## index = index + 1 +## if character == '\0': +## break +## string.append(character) +## if not string: +## break +## result.append(''.join(string)) +## return result +## +##def GetLogicalDriveStringsW(): +## _GetLogicalDriveStringsW = windll.kernel32.GetLogicalDriveStringsW +## _GetLogicalDriveStringsW.argtypes = [DWORD, LPWSTR] +## _GetLogicalDriveStringsW.restype = DWORD +## _GetLogicalDriveStringsW.errcheck = RaiseIfZero +## +## nBufferLength = (4 * 26) + 1 # "X:\\\0" from A to Z plus empty string +## lpBuffer = ctypes.create_unicode_buffer(u'', nBufferLength) +## _GetLogicalDriveStringsW(nBufferLength, lpBuffer) +## result = list() +## index = 0 +## while 1: +## string = list() +## while 1: +## character = lpBuffer[index] +## index = index + 1 +## if character == u'\0': +## break +## string.append(character) +## if not string: +## break +## result.append(u''.join(string)) +## return result + +GetLogicalDriveStrings = GuessStringType(GetLogicalDriveStringsA, GetLogicalDriveStringsW) + + +# DWORD WINAPI QueryDosDevice( +# __in_opt LPCTSTR lpDeviceName, +# __out LPTSTR lpTargetPath, +# __in DWORD ucchMax +# ); +def QueryDosDeviceA(lpDeviceName=None): + _QueryDosDeviceA = windll.kernel32.QueryDosDeviceA + _QueryDosDeviceA.argtypes = [LPSTR, LPSTR, DWORD] + _QueryDosDeviceA.restype = DWORD + _QueryDosDeviceA.errcheck = RaiseIfZero + + if not lpDeviceName: + lpDeviceName = None + ucchMax = 0x1000 + lpTargetPath = ctypes.create_string_buffer("", ucchMax) + _QueryDosDeviceA(lpDeviceName, lpTargetPath, ucchMax) + return lpTargetPath.value + + +def QueryDosDeviceW(lpDeviceName): + _QueryDosDeviceW = windll.kernel32.QueryDosDeviceW + _QueryDosDeviceW.argtypes = [LPWSTR, LPWSTR, DWORD] + _QueryDosDeviceW.restype = DWORD + _QueryDosDeviceW.errcheck = RaiseIfZero + + if not lpDeviceName: + lpDeviceName = None + ucchMax = 0x1000 + lpTargetPath = ctypes.create_unicode_buffer("", ucchMax) + _QueryDosDeviceW(lpDeviceName, lpTargetPath, ucchMax) + return lpTargetPath.value + + +QueryDosDevice = GuessStringType(QueryDosDeviceA, QueryDosDeviceW) + + +# LPVOID WINAPI MapViewOfFile( +# __in HANDLE hFileMappingObject, +# __in DWORD dwDesiredAccess, +# __in DWORD dwFileOffsetHigh, +# __in DWORD dwFileOffsetLow, +# __in SIZE_T dwNumberOfBytesToMap +# ); +def MapViewOfFile( + hFileMappingObject, + dwDesiredAccess=FILE_MAP_ALL_ACCESS | FILE_MAP_EXECUTE, + dwFileOffsetHigh=0, + dwFileOffsetLow=0, + dwNumberOfBytesToMap=0, +): + _MapViewOfFile = windll.kernel32.MapViewOfFile + _MapViewOfFile.argtypes = [HANDLE, DWORD, DWORD, DWORD, SIZE_T] + _MapViewOfFile.restype = LPVOID + lpBaseAddress = _MapViewOfFile(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap) + if lpBaseAddress == NULL: + raise ctypes.WinError() + return lpBaseAddress + + +# BOOL WINAPI UnmapViewOfFile( +# __in LPCVOID lpBaseAddress +# ); +def UnmapViewOfFile(lpBaseAddress): + _UnmapViewOfFile = windll.kernel32.UnmapViewOfFile + _UnmapViewOfFile.argtypes = [LPVOID] + _UnmapViewOfFile.restype = bool + _UnmapViewOfFile.errcheck = RaiseIfZero + _UnmapViewOfFile(lpBaseAddress) + + +# HANDLE WINAPI OpenFileMapping( +# __in DWORD dwDesiredAccess, +# __in BOOL bInheritHandle, +# __in LPCTSTR lpName +# ); +def OpenFileMappingA(dwDesiredAccess, bInheritHandle, lpName): + _OpenFileMappingA = windll.kernel32.OpenFileMappingA + _OpenFileMappingA.argtypes = [DWORD, BOOL, LPSTR] + _OpenFileMappingA.restype = HANDLE + _OpenFileMappingA.errcheck = RaiseIfZero + hFileMappingObject = _OpenFileMappingA(dwDesiredAccess, bool(bInheritHandle), lpName) + return FileMappingHandle(hFileMappingObject) + + +def OpenFileMappingW(dwDesiredAccess, bInheritHandle, lpName): + _OpenFileMappingW = windll.kernel32.OpenFileMappingW + _OpenFileMappingW.argtypes = [DWORD, BOOL, LPWSTR] + _OpenFileMappingW.restype = HANDLE + _OpenFileMappingW.errcheck = RaiseIfZero + hFileMappingObject = _OpenFileMappingW(dwDesiredAccess, bool(bInheritHandle), lpName) + return FileMappingHandle(hFileMappingObject) + + +OpenFileMapping = GuessStringType(OpenFileMappingA, OpenFileMappingW) + + +# HANDLE WINAPI CreateFileMapping( +# __in HANDLE hFile, +# __in_opt LPSECURITY_ATTRIBUTES lpAttributes, +# __in DWORD flProtect, +# __in DWORD dwMaximumSizeHigh, +# __in DWORD dwMaximumSizeLow, +# __in_opt LPCTSTR lpName +# ); +def CreateFileMappingA(hFile, lpAttributes=None, flProtect=PAGE_EXECUTE_READWRITE, dwMaximumSizeHigh=0, dwMaximumSizeLow=0, lpName=None): + _CreateFileMappingA = windll.kernel32.CreateFileMappingA + _CreateFileMappingA.argtypes = [HANDLE, LPVOID, DWORD, DWORD, DWORD, LPSTR] + _CreateFileMappingA.restype = HANDLE + _CreateFileMappingA.errcheck = RaiseIfZero + + if lpAttributes: + lpAttributes = ctypes.pointer(lpAttributes) + if not lpName: + lpName = None + hFileMappingObject = _CreateFileMappingA(hFile, lpAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName) + return FileMappingHandle(hFileMappingObject) + + +def CreateFileMappingW(hFile, lpAttributes=None, flProtect=PAGE_EXECUTE_READWRITE, dwMaximumSizeHigh=0, dwMaximumSizeLow=0, lpName=None): + _CreateFileMappingW = windll.kernel32.CreateFileMappingW + _CreateFileMappingW.argtypes = [HANDLE, LPVOID, DWORD, DWORD, DWORD, LPWSTR] + _CreateFileMappingW.restype = HANDLE + _CreateFileMappingW.errcheck = RaiseIfZero + + if lpAttributes: + lpAttributes = ctypes.pointer(lpAttributes) + if not lpName: + lpName = None + hFileMappingObject = _CreateFileMappingW(hFile, lpAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName) + return FileMappingHandle(hFileMappingObject) + + +CreateFileMapping = GuessStringType(CreateFileMappingA, CreateFileMappingW) + + +# HANDLE WINAPI CreateFile( +# __in LPCTSTR lpFileName, +# __in DWORD dwDesiredAccess, +# __in DWORD dwShareMode, +# __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, +# __in DWORD dwCreationDisposition, +# __in DWORD dwFlagsAndAttributes, +# __in_opt HANDLE hTemplateFile +# ); +def CreateFileA( + lpFileName, + dwDesiredAccess=GENERIC_ALL, + dwShareMode=0, + lpSecurityAttributes=None, + dwCreationDisposition=OPEN_ALWAYS, + dwFlagsAndAttributes=FILE_ATTRIBUTE_NORMAL, + hTemplateFile=None, +): + _CreateFileA = windll.kernel32.CreateFileA + _CreateFileA.argtypes = [LPSTR, DWORD, DWORD, LPVOID, DWORD, DWORD, HANDLE] + _CreateFileA.restype = HANDLE + + if not lpFileName: + lpFileName = None + if lpSecurityAttributes: + lpSecurityAttributes = ctypes.pointer(lpSecurityAttributes) + hFile = _CreateFileA( + lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile + ) + if hFile == INVALID_HANDLE_VALUE: + raise ctypes.WinError() + return FileHandle(hFile) + + +def CreateFileW( + lpFileName, + dwDesiredAccess=GENERIC_ALL, + dwShareMode=0, + lpSecurityAttributes=None, + dwCreationDisposition=OPEN_ALWAYS, + dwFlagsAndAttributes=FILE_ATTRIBUTE_NORMAL, + hTemplateFile=None, +): + _CreateFileW = windll.kernel32.CreateFileW + _CreateFileW.argtypes = [LPWSTR, DWORD, DWORD, LPVOID, DWORD, DWORD, HANDLE] + _CreateFileW.restype = HANDLE + + if not lpFileName: + lpFileName = None + if lpSecurityAttributes: + lpSecurityAttributes = ctypes.pointer(lpSecurityAttributes) + hFile = _CreateFileW( + lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile + ) + if hFile == INVALID_HANDLE_VALUE: + raise ctypes.WinError() + return FileHandle(hFile) + + +CreateFile = GuessStringType(CreateFileA, CreateFileW) + + +# BOOL WINAPI FlushFileBuffers( +# __in HANDLE hFile +# ); +def FlushFileBuffers(hFile): + _FlushFileBuffers = windll.kernel32.FlushFileBuffers + _FlushFileBuffers.argtypes = [HANDLE] + _FlushFileBuffers.restype = bool + _FlushFileBuffers.errcheck = RaiseIfZero + _FlushFileBuffers(hFile) + + +# BOOL WINAPI FlushViewOfFile( +# __in LPCVOID lpBaseAddress, +# __in SIZE_T dwNumberOfBytesToFlush +# ); +def FlushViewOfFile(lpBaseAddress, dwNumberOfBytesToFlush=0): + _FlushViewOfFile = windll.kernel32.FlushViewOfFile + _FlushViewOfFile.argtypes = [LPVOID, SIZE_T] + _FlushViewOfFile.restype = bool + _FlushViewOfFile.errcheck = RaiseIfZero + _FlushViewOfFile(lpBaseAddress, dwNumberOfBytesToFlush) + + +# DWORD WINAPI SearchPath( +# __in_opt LPCTSTR lpPath, +# __in LPCTSTR lpFileName, +# __in_opt LPCTSTR lpExtension, +# __in DWORD nBufferLength, +# __out LPTSTR lpBuffer, +# __out_opt LPTSTR *lpFilePart +# ); +def SearchPathA(lpPath, lpFileName, lpExtension): + _SearchPathA = windll.kernel32.SearchPathA + _SearchPathA.argtypes = [LPSTR, LPSTR, LPSTR, DWORD, LPSTR, POINTER(LPSTR)] + _SearchPathA.restype = DWORD + _SearchPathA.errcheck = RaiseIfZero + + if not lpPath: + lpPath = None + if not lpExtension: + lpExtension = None + nBufferLength = _SearchPathA(lpPath, lpFileName, lpExtension, 0, None, None) + lpBuffer = ctypes.create_string_buffer("", nBufferLength + 1) + lpFilePart = LPSTR() + _SearchPathA(lpPath, lpFileName, lpExtension, nBufferLength, lpBuffer, byref(lpFilePart)) + lpFilePart = lpFilePart.value + lpBuffer = lpBuffer.value + if lpBuffer == "": + if GetLastError() == ERROR_SUCCESS: + raise ctypes.WinError(ERROR_FILE_NOT_FOUND) + raise ctypes.WinError() + return (lpBuffer, lpFilePart) + + +def SearchPathW(lpPath, lpFileName, lpExtension): + _SearchPathW = windll.kernel32.SearchPathW + _SearchPathW.argtypes = [LPWSTR, LPWSTR, LPWSTR, DWORD, LPWSTR, POINTER(LPWSTR)] + _SearchPathW.restype = DWORD + _SearchPathW.errcheck = RaiseIfZero + + if not lpPath: + lpPath = None + if not lpExtension: + lpExtension = None + nBufferLength = _SearchPathW(lpPath, lpFileName, lpExtension, 0, None, None) + lpBuffer = ctypes.create_unicode_buffer("", nBufferLength + 1) + lpFilePart = LPWSTR() + _SearchPathW(lpPath, lpFileName, lpExtension, nBufferLength, lpBuffer, byref(lpFilePart)) + lpFilePart = lpFilePart.value + lpBuffer = lpBuffer.value + if lpBuffer == "": + if GetLastError() == ERROR_SUCCESS: + raise ctypes.WinError(ERROR_FILE_NOT_FOUND) + raise ctypes.WinError() + return (lpBuffer, lpFilePart) + + +SearchPath = GuessStringType(SearchPathA, SearchPathW) + + +# BOOL SetSearchPathMode( +# __in DWORD Flags +# ); +def SetSearchPathMode(Flags): + _SetSearchPathMode = windll.kernel32.SetSearchPathMode + _SetSearchPathMode.argtypes = [DWORD] + _SetSearchPathMode.restype = bool + _SetSearchPathMode.errcheck = RaiseIfZero + _SetSearchPathMode(Flags) + + +# BOOL WINAPI DeviceIoControl( +# __in HANDLE hDevice, +# __in DWORD dwIoControlCode, +# __in_opt LPVOID lpInBuffer, +# __in DWORD nInBufferSize, +# __out_opt LPVOID lpOutBuffer, +# __in DWORD nOutBufferSize, +# __out_opt LPDWORD lpBytesReturned, +# __inout_opt LPOVERLAPPED lpOverlapped +# ); +def DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpOverlapped): + _DeviceIoControl = windll.kernel32.DeviceIoControl + _DeviceIoControl.argtypes = [HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED] + _DeviceIoControl.restype = bool + _DeviceIoControl.errcheck = RaiseIfZero + + if not lpInBuffer: + lpInBuffer = None + if not lpOutBuffer: + lpOutBuffer = None + if lpOverlapped: + lpOverlapped = ctypes.pointer(lpOverlapped) + lpBytesReturned = DWORD(0) + _DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, byref(lpBytesReturned), lpOverlapped) + return lpBytesReturned.value + + +# BOOL GetFileInformationByHandle( +# HANDLE hFile, +# LPBY_HANDLE_FILE_INFORMATION lpFileInformation +# ); +def GetFileInformationByHandle(hFile): + _GetFileInformationByHandle = windll.kernel32.GetFileInformationByHandle + _GetFileInformationByHandle.argtypes = [HANDLE, LPBY_HANDLE_FILE_INFORMATION] + _GetFileInformationByHandle.restype = bool + _GetFileInformationByHandle.errcheck = RaiseIfZero + + lpFileInformation = BY_HANDLE_FILE_INFORMATION() + _GetFileInformationByHandle(hFile, byref(lpFileInformation)) + return lpFileInformation + + +# BOOL WINAPI GetFileInformationByHandleEx( +# __in HANDLE hFile, +# __in FILE_INFO_BY_HANDLE_CLASS FileInformationClass, +# __out LPVOID lpFileInformation, +# __in DWORD dwBufferSize +# ); +def GetFileInformationByHandleEx(hFile, FileInformationClass, lpFileInformation, dwBufferSize): + _GetFileInformationByHandleEx = windll.kernel32.GetFileInformationByHandleEx + _GetFileInformationByHandleEx.argtypes = [HANDLE, DWORD, LPVOID, DWORD] + _GetFileInformationByHandleEx.restype = bool + _GetFileInformationByHandleEx.errcheck = RaiseIfZero + # XXX TODO + # support each FileInformationClass so the function can allocate the + # corresponding structure for the lpFileInformation parameter + _GetFileInformationByHandleEx(hFile, FileInformationClass, byref(lpFileInformation), dwBufferSize) + + +# DWORD WINAPI GetFinalPathNameByHandle( +# __in HANDLE hFile, +# __out LPTSTR lpszFilePath, +# __in DWORD cchFilePath, +# __in DWORD dwFlags +# ); +def GetFinalPathNameByHandleA(hFile, dwFlags=FILE_NAME_NORMALIZED | VOLUME_NAME_DOS): + _GetFinalPathNameByHandleA = windll.kernel32.GetFinalPathNameByHandleA + _GetFinalPathNameByHandleA.argtypes = [HANDLE, LPSTR, DWORD, DWORD] + _GetFinalPathNameByHandleA.restype = DWORD + + cchFilePath = _GetFinalPathNameByHandleA(hFile, None, 0, dwFlags) + if cchFilePath == 0: + raise ctypes.WinError() + lpszFilePath = ctypes.create_string_buffer("", cchFilePath + 1) + nCopied = _GetFinalPathNameByHandleA(hFile, lpszFilePath, cchFilePath, dwFlags) + if nCopied <= 0 or nCopied > cchFilePath: + raise ctypes.WinError() + return lpszFilePath.value + + +def GetFinalPathNameByHandleW(hFile, dwFlags=FILE_NAME_NORMALIZED | VOLUME_NAME_DOS): + _GetFinalPathNameByHandleW = windll.kernel32.GetFinalPathNameByHandleW + _GetFinalPathNameByHandleW.argtypes = [HANDLE, LPWSTR, DWORD, DWORD] + _GetFinalPathNameByHandleW.restype = DWORD + + cchFilePath = _GetFinalPathNameByHandleW(hFile, None, 0, dwFlags) + if cchFilePath == 0: + raise ctypes.WinError() + lpszFilePath = ctypes.create_unicode_buffer("", cchFilePath + 1) + nCopied = _GetFinalPathNameByHandleW(hFile, lpszFilePath, cchFilePath, dwFlags) + if nCopied <= 0 or nCopied > cchFilePath: + raise ctypes.WinError() + return lpszFilePath.value + + +GetFinalPathNameByHandle = GuessStringType(GetFinalPathNameByHandleA, GetFinalPathNameByHandleW) + + +# DWORD GetFullPathName( +# LPCTSTR lpFileName, +# DWORD nBufferLength, +# LPTSTR lpBuffer, +# LPTSTR* lpFilePart +# ); +def GetFullPathNameA(lpFileName): + _GetFullPathNameA = windll.kernel32.GetFullPathNameA + _GetFullPathNameA.argtypes = [LPSTR, DWORD, LPSTR, POINTER(LPSTR)] + _GetFullPathNameA.restype = DWORD + + nBufferLength = _GetFullPathNameA(lpFileName, 0, None, None) + if nBufferLength <= 0: + raise ctypes.WinError() + lpBuffer = ctypes.create_string_buffer("", nBufferLength + 1) + lpFilePart = LPSTR() + nCopied = _GetFullPathNameA(lpFileName, nBufferLength, lpBuffer, byref(lpFilePart)) + if nCopied > nBufferLength or nCopied == 0: + raise ctypes.WinError() + return lpBuffer.value, lpFilePart.value + + +def GetFullPathNameW(lpFileName): + _GetFullPathNameW = windll.kernel32.GetFullPathNameW + _GetFullPathNameW.argtypes = [LPWSTR, DWORD, LPWSTR, POINTER(LPWSTR)] + _GetFullPathNameW.restype = DWORD + + nBufferLength = _GetFullPathNameW(lpFileName, 0, None, None) + if nBufferLength <= 0: + raise ctypes.WinError() + lpBuffer = ctypes.create_unicode_buffer("", nBufferLength + 1) + lpFilePart = LPWSTR() + nCopied = _GetFullPathNameW(lpFileName, nBufferLength, lpBuffer, byref(lpFilePart)) + if nCopied > nBufferLength or nCopied == 0: + raise ctypes.WinError() + return lpBuffer.value, lpFilePart.value + + +GetFullPathName = GuessStringType(GetFullPathNameA, GetFullPathNameW) + + +# DWORD WINAPI GetTempPath( +# __in DWORD nBufferLength, +# __out LPTSTR lpBuffer +# ); +def GetTempPathA(): + _GetTempPathA = windll.kernel32.GetTempPathA + _GetTempPathA.argtypes = [DWORD, LPSTR] + _GetTempPathA.restype = DWORD + + nBufferLength = _GetTempPathA(0, None) + if nBufferLength <= 0: + raise ctypes.WinError() + lpBuffer = ctypes.create_string_buffer("", nBufferLength) + nCopied = _GetTempPathA(nBufferLength, lpBuffer) + if nCopied > nBufferLength or nCopied == 0: + raise ctypes.WinError() + return lpBuffer.value + + +def GetTempPathW(): + _GetTempPathW = windll.kernel32.GetTempPathW + _GetTempPathW.argtypes = [DWORD, LPWSTR] + _GetTempPathW.restype = DWORD + + nBufferLength = _GetTempPathW(0, None) + if nBufferLength <= 0: + raise ctypes.WinError() + lpBuffer = ctypes.create_unicode_buffer("", nBufferLength) + nCopied = _GetTempPathW(nBufferLength, lpBuffer) + if nCopied > nBufferLength or nCopied == 0: + raise ctypes.WinError() + return lpBuffer.value + + +GetTempPath = GuessStringType(GetTempPathA, GetTempPathW) + + +# UINT WINAPI GetTempFileName( +# __in LPCTSTR lpPathName, +# __in LPCTSTR lpPrefixString, +# __in UINT uUnique, +# __out LPTSTR lpTempFileName +# ); +def GetTempFileNameA(lpPathName=None, lpPrefixString="TMP", uUnique=0): + _GetTempFileNameA = windll.kernel32.GetTempFileNameA + _GetTempFileNameA.argtypes = [LPSTR, LPSTR, UINT, LPSTR] + _GetTempFileNameA.restype = UINT + + if lpPathName is None: + lpPathName = GetTempPathA() + lpTempFileName = ctypes.create_string_buffer("", MAX_PATH) + uUnique = _GetTempFileNameA(lpPathName, lpPrefixString, uUnique, lpTempFileName) + if uUnique == 0: + raise ctypes.WinError() + return lpTempFileName.value, uUnique + + +def GetTempFileNameW(lpPathName=None, lpPrefixString="TMP", uUnique=0): + _GetTempFileNameW = windll.kernel32.GetTempFileNameW + _GetTempFileNameW.argtypes = [LPWSTR, LPWSTR, UINT, LPWSTR] + _GetTempFileNameW.restype = UINT + + if lpPathName is None: + lpPathName = GetTempPathW() + lpTempFileName = ctypes.create_unicode_buffer("", MAX_PATH) + uUnique = _GetTempFileNameW(lpPathName, lpPrefixString, uUnique, lpTempFileName) + if uUnique == 0: + raise ctypes.WinError() + return lpTempFileName.value, uUnique + + +GetTempFileName = GuessStringType(GetTempFileNameA, GetTempFileNameW) + + +# DWORD WINAPI GetCurrentDirectory( +# __in DWORD nBufferLength, +# __out LPTSTR lpBuffer +# ); +def GetCurrentDirectoryA(): + _GetCurrentDirectoryA = windll.kernel32.GetCurrentDirectoryA + _GetCurrentDirectoryA.argtypes = [DWORD, LPSTR] + _GetCurrentDirectoryA.restype = DWORD + + nBufferLength = _GetCurrentDirectoryA(0, None) + if nBufferLength <= 0: + raise ctypes.WinError() + lpBuffer = ctypes.create_string_buffer("", nBufferLength) + nCopied = _GetCurrentDirectoryA(nBufferLength, lpBuffer) + if nCopied > nBufferLength or nCopied == 0: + raise ctypes.WinError() + return lpBuffer.value + + +def GetCurrentDirectoryW(): + _GetCurrentDirectoryW = windll.kernel32.GetCurrentDirectoryW + _GetCurrentDirectoryW.argtypes = [DWORD, LPWSTR] + _GetCurrentDirectoryW.restype = DWORD + + nBufferLength = _GetCurrentDirectoryW(0, None) + if nBufferLength <= 0: + raise ctypes.WinError() + lpBuffer = ctypes.create_unicode_buffer("", nBufferLength) + nCopied = _GetCurrentDirectoryW(nBufferLength, lpBuffer) + if nCopied > nBufferLength or nCopied == 0: + raise ctypes.WinError() + return lpBuffer.value + + +GetCurrentDirectory = GuessStringType(GetCurrentDirectoryA, GetCurrentDirectoryW) + +# ------------------------------------------------------------------------------ +# Contrl-C handler + +# BOOL WINAPI HandlerRoutine( +# __in DWORD dwCtrlType +# ); +PHANDLER_ROUTINE = ctypes.WINFUNCTYPE(BOOL, DWORD) + + +# BOOL WINAPI SetConsoleCtrlHandler( +# __in_opt PHANDLER_ROUTINE HandlerRoutine, +# __in BOOL Add +# ); +def SetConsoleCtrlHandler(HandlerRoutine=None, Add=True): + _SetConsoleCtrlHandler = windll.kernel32.SetConsoleCtrlHandler + _SetConsoleCtrlHandler.argtypes = [PHANDLER_ROUTINE, BOOL] + _SetConsoleCtrlHandler.restype = bool + _SetConsoleCtrlHandler.errcheck = RaiseIfZero + _SetConsoleCtrlHandler(HandlerRoutine, bool(Add)) + # we can't automagically transform Python functions to PHANDLER_ROUTINE + # because a) the actual pointer value is meaningful to the API + # and b) if it gets garbage collected bad things would happen + + +# BOOL WINAPI GenerateConsoleCtrlEvent( +# __in DWORD dwCtrlEvent, +# __in DWORD dwProcessGroupId +# ); +def GenerateConsoleCtrlEvent(dwCtrlEvent, dwProcessGroupId): + _GenerateConsoleCtrlEvent = windll.kernel32.GenerateConsoleCtrlEvent + _GenerateConsoleCtrlEvent.argtypes = [DWORD, DWORD] + _GenerateConsoleCtrlEvent.restype = bool + _GenerateConsoleCtrlEvent.errcheck = RaiseIfZero + _GenerateConsoleCtrlEvent(dwCtrlEvent, dwProcessGroupId) + + +# ------------------------------------------------------------------------------ +# Synchronization API + +# XXX NOTE +# +# Instead of waiting forever, we wait for a small period of time and loop. +# This is a workaround for an unwanted behavior of psyco-accelerated code: +# you can't interrupt a blocking call using Ctrl+C, because signal processing +# is only done between C calls. +# +# Also see: bug #2793618 in Psyco project +# http://sourceforge.net/tracker/?func=detail&aid=2793618&group_id=41036&atid=429622 + + +# DWORD WINAPI WaitForSingleObject( +# HANDLE hHandle, +# DWORD dwMilliseconds +# ); +def WaitForSingleObject(hHandle, dwMilliseconds=INFINITE): + _WaitForSingleObject = windll.kernel32.WaitForSingleObject + _WaitForSingleObject.argtypes = [HANDLE, DWORD] + _WaitForSingleObject.restype = DWORD + + if not dwMilliseconds and dwMilliseconds != 0: + dwMilliseconds = INFINITE + if dwMilliseconds != INFINITE: + r = _WaitForSingleObject(hHandle, dwMilliseconds) + if r == WAIT_FAILED: + raise ctypes.WinError() + else: + while 1: + r = _WaitForSingleObject(hHandle, 100) + if r == WAIT_FAILED: + raise ctypes.WinError() + if r != WAIT_TIMEOUT: + break + return r + + +# DWORD WINAPI WaitForSingleObjectEx( +# HANDLE hHandle, +# DWORD dwMilliseconds, +# BOOL bAlertable +# ); +def WaitForSingleObjectEx(hHandle, dwMilliseconds=INFINITE, bAlertable=True): + _WaitForSingleObjectEx = windll.kernel32.WaitForSingleObjectEx + _WaitForSingleObjectEx.argtypes = [HANDLE, DWORD, BOOL] + _WaitForSingleObjectEx.restype = DWORD + + if not dwMilliseconds and dwMilliseconds != 0: + dwMilliseconds = INFINITE + if dwMilliseconds != INFINITE: + r = _WaitForSingleObjectEx(hHandle, dwMilliseconds, bool(bAlertable)) + if r == WAIT_FAILED: + raise ctypes.WinError() + else: + while 1: + r = _WaitForSingleObjectEx(hHandle, 100, bool(bAlertable)) + if r == WAIT_FAILED: + raise ctypes.WinError() + if r != WAIT_TIMEOUT: + break + return r + + +# DWORD WINAPI WaitForMultipleObjects( +# DWORD nCount, +# const HANDLE *lpHandles, +# BOOL bWaitAll, +# DWORD dwMilliseconds +# ); +def WaitForMultipleObjects(handles, bWaitAll=False, dwMilliseconds=INFINITE): + _WaitForMultipleObjects = windll.kernel32.WaitForMultipleObjects + _WaitForMultipleObjects.argtypes = [DWORD, POINTER(HANDLE), BOOL, DWORD] + _WaitForMultipleObjects.restype = DWORD + + if not dwMilliseconds and dwMilliseconds != 0: + dwMilliseconds = INFINITE + nCount = len(handles) + lpHandlesType = HANDLE * nCount + lpHandles = lpHandlesType(*handles) + if dwMilliseconds != INFINITE: + r = _WaitForMultipleObjects(byref(lpHandles), bool(bWaitAll), dwMilliseconds) + if r == WAIT_FAILED: + raise ctypes.WinError() + else: + while 1: + r = _WaitForMultipleObjects(byref(lpHandles), bool(bWaitAll), 100) + if r == WAIT_FAILED: + raise ctypes.WinError() + if r != WAIT_TIMEOUT: + break + return r + + +# DWORD WINAPI WaitForMultipleObjectsEx( +# DWORD nCount, +# const HANDLE *lpHandles, +# BOOL bWaitAll, +# DWORD dwMilliseconds, +# BOOL bAlertable +# ); +def WaitForMultipleObjectsEx(handles, bWaitAll=False, dwMilliseconds=INFINITE, bAlertable=True): + _WaitForMultipleObjectsEx = windll.kernel32.WaitForMultipleObjectsEx + _WaitForMultipleObjectsEx.argtypes = [DWORD, POINTER(HANDLE), BOOL, DWORD] + _WaitForMultipleObjectsEx.restype = DWORD + + if not dwMilliseconds and dwMilliseconds != 0: + dwMilliseconds = INFINITE + nCount = len(handles) + lpHandlesType = HANDLE * nCount + lpHandles = lpHandlesType(*handles) + if dwMilliseconds != INFINITE: + r = _WaitForMultipleObjectsEx(byref(lpHandles), bool(bWaitAll), dwMilliseconds, bool(bAlertable)) + if r == WAIT_FAILED: + raise ctypes.WinError() + else: + while 1: + r = _WaitForMultipleObjectsEx(byref(lpHandles), bool(bWaitAll), 100, bool(bAlertable)) + if r == WAIT_FAILED: + raise ctypes.WinError() + if r != WAIT_TIMEOUT: + break + return r + + +# HANDLE WINAPI CreateMutex( +# _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, +# _In_ BOOL bInitialOwner, +# _In_opt_ LPCTSTR lpName +# ); +def CreateMutexA(lpMutexAttributes=None, bInitialOwner=True, lpName=None): + _CreateMutexA = windll.kernel32.CreateMutexA + _CreateMutexA.argtypes = [LPVOID, BOOL, LPSTR] + _CreateMutexA.restype = HANDLE + _CreateMutexA.errcheck = RaiseIfZero + return Handle(_CreateMutexA(lpMutexAttributes, bInitialOwner, lpName)) + + +def CreateMutexW(lpMutexAttributes=None, bInitialOwner=True, lpName=None): + _CreateMutexW = windll.kernel32.CreateMutexW + _CreateMutexW.argtypes = [LPVOID, BOOL, LPWSTR] + _CreateMutexW.restype = HANDLE + _CreateMutexW.errcheck = RaiseIfZero + return Handle(_CreateMutexW(lpMutexAttributes, bInitialOwner, lpName)) + + +CreateMutex = GuessStringType(CreateMutexA, CreateMutexW) + + +# HANDLE WINAPI OpenMutex( +# _In_ DWORD dwDesiredAccess, +# _In_ BOOL bInheritHandle, +# _In_ LPCTSTR lpName +# ); +def OpenMutexA(dwDesiredAccess=MUTEX_ALL_ACCESS, bInitialOwner=True, lpName=None): + _OpenMutexA = windll.kernel32.OpenMutexA + _OpenMutexA.argtypes = [DWORD, BOOL, LPSTR] + _OpenMutexA.restype = HANDLE + _OpenMutexA.errcheck = RaiseIfZero + return Handle(_OpenMutexA(lpMutexAttributes, bInitialOwner, lpName)) + + +def OpenMutexW(dwDesiredAccess=MUTEX_ALL_ACCESS, bInitialOwner=True, lpName=None): + _OpenMutexW = windll.kernel32.OpenMutexW + _OpenMutexW.argtypes = [DWORD, BOOL, LPWSTR] + _OpenMutexW.restype = HANDLE + _OpenMutexW.errcheck = RaiseIfZero + return Handle(_OpenMutexW(lpMutexAttributes, bInitialOwner, lpName)) + + +OpenMutex = GuessStringType(OpenMutexA, OpenMutexW) + + +# HANDLE WINAPI CreateEvent( +# _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes, +# _In_ BOOL bManualReset, +# _In_ BOOL bInitialState, +# _In_opt_ LPCTSTR lpName +# ); +def CreateEventA(lpMutexAttributes=None, bManualReset=False, bInitialState=False, lpName=None): + _CreateEventA = windll.kernel32.CreateEventA + _CreateEventA.argtypes = [LPVOID, BOOL, BOOL, LPSTR] + _CreateEventA.restype = HANDLE + _CreateEventA.errcheck = RaiseIfZero + return Handle(_CreateEventA(lpMutexAttributes, bManualReset, bInitialState, lpName)) + + +def CreateEventW(lpMutexAttributes=None, bManualReset=False, bInitialState=False, lpName=None): + _CreateEventW = windll.kernel32.CreateEventW + _CreateEventW.argtypes = [LPVOID, BOOL, BOOL, LPWSTR] + _CreateEventW.restype = HANDLE + _CreateEventW.errcheck = RaiseIfZero + return Handle(_CreateEventW(lpMutexAttributes, bManualReset, bInitialState, lpName)) + + +CreateEvent = GuessStringType(CreateEventA, CreateEventW) + + +# HANDLE WINAPI OpenEvent( +# _In_ DWORD dwDesiredAccess, +# _In_ BOOL bInheritHandle, +# _In_ LPCTSTR lpName +# ); +def OpenEventA(dwDesiredAccess=EVENT_ALL_ACCESS, bInheritHandle=False, lpName=None): + _OpenEventA = windll.kernel32.OpenEventA + _OpenEventA.argtypes = [DWORD, BOOL, LPSTR] + _OpenEventA.restype = HANDLE + _OpenEventA.errcheck = RaiseIfZero + return Handle(_OpenEventA(dwDesiredAccess, bInheritHandle, lpName)) + + +def OpenEventW(dwDesiredAccess=EVENT_ALL_ACCESS, bInheritHandle=False, lpName=None): + _OpenEventW = windll.kernel32.OpenEventW + _OpenEventW.argtypes = [DWORD, BOOL, LPWSTR] + _OpenEventW.restype = HANDLE + _OpenEventW.errcheck = RaiseIfZero + return Handle(_OpenEventW(dwDesiredAccess, bInheritHandle, lpName)) + + +OpenEvent = GuessStringType(OpenEventA, OpenEventW) + +# HANDLE WINAPI CreateSemaphore( +# _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, +# _In_ LONG lInitialCount, +# _In_ LONG lMaximumCount, +# _In_opt_ LPCTSTR lpName +# ); + +# TODO + +# HANDLE WINAPI OpenSemaphore( +# _In_ DWORD dwDesiredAccess, +# _In_ BOOL bInheritHandle, +# _In_ LPCTSTR lpName +# ); + +# TODO + + +# BOOL WINAPI ReleaseMutex( +# _In_ HANDLE hMutex +# ); +def ReleaseMutex(hMutex): + _ReleaseMutex = windll.kernel32.ReleaseMutex + _ReleaseMutex.argtypes = [HANDLE] + _ReleaseMutex.restype = bool + _ReleaseMutex.errcheck = RaiseIfZero + _ReleaseMutex(hMutex) + + +# BOOL WINAPI SetEvent( +# _In_ HANDLE hEvent +# ); +def SetEvent(hEvent): + _SetEvent = windll.kernel32.SetEvent + _SetEvent.argtypes = [HANDLE] + _SetEvent.restype = bool + _SetEvent.errcheck = RaiseIfZero + _SetEvent(hEvent) + + +# BOOL WINAPI ResetEvent( +# _In_ HANDLE hEvent +# ); +def ResetEvent(hEvent): + _ResetEvent = windll.kernel32.ResetEvent + _ResetEvent.argtypes = [HANDLE] + _ResetEvent.restype = bool + _ResetEvent.errcheck = RaiseIfZero + _ResetEvent(hEvent) + + +# BOOL WINAPI PulseEvent( +# _In_ HANDLE hEvent +# ); +def PulseEvent(hEvent): + _PulseEvent = windll.kernel32.PulseEvent + _PulseEvent.argtypes = [HANDLE] + _PulseEvent.restype = bool + _PulseEvent.errcheck = RaiseIfZero + _PulseEvent(hEvent) + + +# BOOL WINAPI ReleaseSemaphore( +# _In_ HANDLE hSemaphore, +# _In_ LONG lReleaseCount, +# _Out_opt_ LPLONG lpPreviousCount +# ); + +# TODO + +# ------------------------------------------------------------------------------ +# Debug API + + +# BOOL WaitForDebugEvent( +# LPDEBUG_EVENT lpDebugEvent, +# DWORD dwMilliseconds +# ); +def WaitForDebugEvent(dwMilliseconds=INFINITE): + _WaitForDebugEvent = windll.kernel32.WaitForDebugEvent + _WaitForDebugEvent.argtypes = [LPDEBUG_EVENT, DWORD] + _WaitForDebugEvent.restype = DWORD + + if not dwMilliseconds and dwMilliseconds != 0: + dwMilliseconds = INFINITE + lpDebugEvent = DEBUG_EVENT() + lpDebugEvent.dwDebugEventCode = 0 + lpDebugEvent.dwProcessId = 0 + lpDebugEvent.dwThreadId = 0 + if dwMilliseconds != INFINITE: + success = _WaitForDebugEvent(byref(lpDebugEvent), dwMilliseconds) + if success == 0: + raise ctypes.WinError() + else: + # this avoids locking the Python GIL for too long + while 1: + success = _WaitForDebugEvent(byref(lpDebugEvent), 100) + if success != 0: + break + code = GetLastError() + if code not in (ERROR_SEM_TIMEOUT, WAIT_TIMEOUT): + raise ctypes.WinError(code) + return lpDebugEvent + + +# BOOL ContinueDebugEvent( +# DWORD dwProcessId, +# DWORD dwThreadId, +# DWORD dwContinueStatus +# ); +def ContinueDebugEvent(dwProcessId, dwThreadId, dwContinueStatus=DBG_EXCEPTION_NOT_HANDLED): + _ContinueDebugEvent = windll.kernel32.ContinueDebugEvent + _ContinueDebugEvent.argtypes = [DWORD, DWORD, DWORD] + _ContinueDebugEvent.restype = bool + _ContinueDebugEvent.errcheck = RaiseIfZero + _ContinueDebugEvent(dwProcessId, dwThreadId, dwContinueStatus) + + +# BOOL WINAPI FlushInstructionCache( +# __in HANDLE hProcess, +# __in LPCVOID lpBaseAddress, +# __in SIZE_T dwSize +# ); +def FlushInstructionCache(hProcess, lpBaseAddress=None, dwSize=0): + # http://blogs.msdn.com/oldnewthing/archive/2003/12/08/55954.aspx#55958 + _FlushInstructionCache = windll.kernel32.FlushInstructionCache + _FlushInstructionCache.argtypes = [HANDLE, LPVOID, SIZE_T] + _FlushInstructionCache.restype = bool + _FlushInstructionCache.errcheck = RaiseIfZero + _FlushInstructionCache(hProcess, lpBaseAddress, dwSize) + + +# BOOL DebugActiveProcess( +# DWORD dwProcessId +# ); +def DebugActiveProcess(dwProcessId): + _DebugActiveProcess = windll.kernel32.DebugActiveProcess + _DebugActiveProcess.argtypes = [DWORD] + _DebugActiveProcess.restype = bool + _DebugActiveProcess.errcheck = RaiseIfZero + _DebugActiveProcess(dwProcessId) + + +# BOOL DebugActiveProcessStop( +# DWORD dwProcessId +# ); +def DebugActiveProcessStop(dwProcessId): + _DebugActiveProcessStop = windll.kernel32.DebugActiveProcessStop + _DebugActiveProcessStop.argtypes = [DWORD] + _DebugActiveProcessStop.restype = bool + _DebugActiveProcessStop.errcheck = RaiseIfZero + _DebugActiveProcessStop(dwProcessId) + + +# BOOL CheckRemoteDebuggerPresent( +# HANDLE hProcess, +# PBOOL pbDebuggerPresent +# ); +def CheckRemoteDebuggerPresent(hProcess): + _CheckRemoteDebuggerPresent = windll.kernel32.CheckRemoteDebuggerPresent + _CheckRemoteDebuggerPresent.argtypes = [HANDLE, PBOOL] + _CheckRemoteDebuggerPresent.restype = bool + _CheckRemoteDebuggerPresent.errcheck = RaiseIfZero + + pbDebuggerPresent = BOOL(0) + _CheckRemoteDebuggerPresent(hProcess, byref(pbDebuggerPresent)) + return bool(pbDebuggerPresent.value) + + +# BOOL DebugSetProcessKillOnExit( +# BOOL KillOnExit +# ); +def DebugSetProcessKillOnExit(KillOnExit): + _DebugSetProcessKillOnExit = windll.kernel32.DebugSetProcessKillOnExit + _DebugSetProcessKillOnExit.argtypes = [BOOL] + _DebugSetProcessKillOnExit.restype = bool + _DebugSetProcessKillOnExit.errcheck = RaiseIfZero + _DebugSetProcessKillOnExit(bool(KillOnExit)) + + +# BOOL DebugBreakProcess( +# HANDLE Process +# ); +def DebugBreakProcess(hProcess): + _DebugBreakProcess = windll.kernel32.DebugBreakProcess + _DebugBreakProcess.argtypes = [HANDLE] + _DebugBreakProcess.restype = bool + _DebugBreakProcess.errcheck = RaiseIfZero + _DebugBreakProcess(hProcess) + + +# void WINAPI OutputDebugString( +# __in_opt LPCTSTR lpOutputString +# ); +def OutputDebugStringA(lpOutputString): + _OutputDebugStringA = windll.kernel32.OutputDebugStringA + _OutputDebugStringA.argtypes = [LPSTR] + _OutputDebugStringA.restype = None + _OutputDebugStringA(lpOutputString) + + +def OutputDebugStringW(lpOutputString): + _OutputDebugStringW = windll.kernel32.OutputDebugStringW + _OutputDebugStringW.argtypes = [LPWSTR] + _OutputDebugStringW.restype = None + _OutputDebugStringW(lpOutputString) + + +OutputDebugString = GuessStringType(OutputDebugStringA, OutputDebugStringW) + + +# BOOL WINAPI ReadProcessMemory( +# __in HANDLE hProcess, +# __in LPCVOID lpBaseAddress, +# __out LPVOID lpBuffer, +# __in SIZE_T nSize, +# __out SIZE_T* lpNumberOfBytesRead +# ); +def ReadProcessMemory(hProcess, lpBaseAddress, nSize): + _ReadProcessMemory = windll.kernel32.ReadProcessMemory + _ReadProcessMemory.argtypes = [HANDLE, LPVOID, LPVOID, SIZE_T, POINTER(SIZE_T)] + _ReadProcessMemory.restype = bool + + lpBuffer = ctypes.create_string_buffer(compat.b(""), nSize) + lpNumberOfBytesRead = SIZE_T(0) + success = _ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, byref(lpNumberOfBytesRead)) + if not success and GetLastError() != ERROR_PARTIAL_COPY: + raise ctypes.WinError() + return compat.b(lpBuffer.raw)[: lpNumberOfBytesRead.value] + + +# BOOL WINAPI WriteProcessMemory( +# __in HANDLE hProcess, +# __in LPCVOID lpBaseAddress, +# __in LPVOID lpBuffer, +# __in SIZE_T nSize, +# __out SIZE_T* lpNumberOfBytesWritten +# ); +def WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer): + _WriteProcessMemory = windll.kernel32.WriteProcessMemory + _WriteProcessMemory.argtypes = [HANDLE, LPVOID, LPVOID, SIZE_T, POINTER(SIZE_T)] + _WriteProcessMemory.restype = bool + + nSize = len(lpBuffer) + lpBuffer = ctypes.create_string_buffer(lpBuffer) + lpNumberOfBytesWritten = SIZE_T(0) + success = _WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, byref(lpNumberOfBytesWritten)) + if not success and GetLastError() != ERROR_PARTIAL_COPY: + raise ctypes.WinError() + return lpNumberOfBytesWritten.value + + +# LPVOID WINAPI VirtualAllocEx( +# __in HANDLE hProcess, +# __in_opt LPVOID lpAddress, +# __in SIZE_T dwSize, +# __in DWORD flAllocationType, +# __in DWORD flProtect +# ); +def VirtualAllocEx(hProcess, lpAddress=0, dwSize=0x1000, flAllocationType=MEM_COMMIT | MEM_RESERVE, flProtect=PAGE_EXECUTE_READWRITE): + _VirtualAllocEx = windll.kernel32.VirtualAllocEx + _VirtualAllocEx.argtypes = [HANDLE, LPVOID, SIZE_T, DWORD, DWORD] + _VirtualAllocEx.restype = LPVOID + + lpAddress = _VirtualAllocEx(hProcess, lpAddress, dwSize, flAllocationType, flProtect) + if lpAddress == NULL: + raise ctypes.WinError() + return lpAddress + + +# SIZE_T WINAPI VirtualQueryEx( +# __in HANDLE hProcess, +# __in_opt LPCVOID lpAddress, +# __out PMEMORY_BASIC_INFORMATION lpBuffer, +# __in SIZE_T dwLength +# ); +def VirtualQueryEx(hProcess, lpAddress): + _VirtualQueryEx = windll.kernel32.VirtualQueryEx + _VirtualQueryEx.argtypes = [HANDLE, LPVOID, PMEMORY_BASIC_INFORMATION, SIZE_T] + _VirtualQueryEx.restype = SIZE_T + + lpBuffer = MEMORY_BASIC_INFORMATION() + dwLength = sizeof(MEMORY_BASIC_INFORMATION) + success = _VirtualQueryEx(hProcess, lpAddress, byref(lpBuffer), dwLength) + if success == 0: + raise ctypes.WinError() + return MemoryBasicInformation(lpBuffer) + + +# BOOL WINAPI VirtualProtectEx( +# __in HANDLE hProcess, +# __in LPVOID lpAddress, +# __in SIZE_T dwSize, +# __in DWORD flNewProtect, +# __out PDWORD lpflOldProtect +# ); +def VirtualProtectEx(hProcess, lpAddress, dwSize, flNewProtect=PAGE_EXECUTE_READWRITE): + _VirtualProtectEx = windll.kernel32.VirtualProtectEx + _VirtualProtectEx.argtypes = [HANDLE, LPVOID, SIZE_T, DWORD, PDWORD] + _VirtualProtectEx.restype = bool + _VirtualProtectEx.errcheck = RaiseIfZero + + flOldProtect = DWORD(0) + _VirtualProtectEx(hProcess, lpAddress, dwSize, flNewProtect, byref(flOldProtect)) + return flOldProtect.value + + +# BOOL WINAPI VirtualFreeEx( +# __in HANDLE hProcess, +# __in LPVOID lpAddress, +# __in SIZE_T dwSize, +# __in DWORD dwFreeType +# ); +def VirtualFreeEx(hProcess, lpAddress, dwSize=0, dwFreeType=MEM_RELEASE): + _VirtualFreeEx = windll.kernel32.VirtualFreeEx + _VirtualFreeEx.argtypes = [HANDLE, LPVOID, SIZE_T, DWORD] + _VirtualFreeEx.restype = bool + _VirtualFreeEx.errcheck = RaiseIfZero + _VirtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType) + + +# HANDLE WINAPI CreateRemoteThread( +# __in HANDLE hProcess, +# __in LPSECURITY_ATTRIBUTES lpThreadAttributes, +# __in SIZE_T dwStackSize, +# __in LPTHREAD_START_ROUTINE lpStartAddress, +# __in LPVOID lpParameter, +# __in DWORD dwCreationFlags, +# __out LPDWORD lpThreadId +# ); +def CreateRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags): + _CreateRemoteThread = windll.kernel32.CreateRemoteThread + _CreateRemoteThread.argtypes = [HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPVOID, LPVOID, DWORD, LPDWORD] + _CreateRemoteThread.restype = HANDLE + + if not lpThreadAttributes: + lpThreadAttributes = None + else: + lpThreadAttributes = byref(lpThreadAttributes) + dwThreadId = DWORD(0) + hThread = _CreateRemoteThread( + hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, byref(dwThreadId) + ) + if not hThread: + raise ctypes.WinError() + return ThreadHandle(hThread), dwThreadId.value + + +# ------------------------------------------------------------------------------ +# Process API + + +# BOOL WINAPI CreateProcess( +# __in_opt LPCTSTR lpApplicationName, +# __inout_opt LPTSTR lpCommandLine, +# __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, +# __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, +# __in BOOL bInheritHandles, +# __in DWORD dwCreationFlags, +# __in_opt LPVOID lpEnvironment, +# __in_opt LPCTSTR lpCurrentDirectory, +# __in LPSTARTUPINFO lpStartupInfo, +# __out LPPROCESS_INFORMATION lpProcessInformation +# ); +def CreateProcessA( + lpApplicationName, + lpCommandLine=None, + lpProcessAttributes=None, + lpThreadAttributes=None, + bInheritHandles=False, + dwCreationFlags=0, + lpEnvironment=None, + lpCurrentDirectory=None, + lpStartupInfo=None, +): + _CreateProcessA = windll.kernel32.CreateProcessA + _CreateProcessA.argtypes = [ + LPSTR, + LPSTR, + LPSECURITY_ATTRIBUTES, + LPSECURITY_ATTRIBUTES, + BOOL, + DWORD, + LPVOID, + LPSTR, + LPVOID, + LPPROCESS_INFORMATION, + ] + _CreateProcessA.restype = bool + _CreateProcessA.errcheck = RaiseIfZero + + if not lpApplicationName: + lpApplicationName = None + if not lpCommandLine: + lpCommandLine = None + else: + lpCommandLine = ctypes.create_string_buffer(lpCommandLine, max(MAX_PATH, len(lpCommandLine))) + if not lpEnvironment: + lpEnvironment = None + else: + lpEnvironment = ctypes.create_string_buffer(lpEnvironment) + if not lpCurrentDirectory: + lpCurrentDirectory = None + if not lpProcessAttributes: + lpProcessAttributes = None + else: + lpProcessAttributes = byref(lpProcessAttributes) + if not lpThreadAttributes: + lpThreadAttributes = None + else: + lpThreadAttributes = byref(lpThreadAttributes) + if not lpStartupInfo: + lpStartupInfo = STARTUPINFO() + lpStartupInfo.cb = sizeof(STARTUPINFO) + lpStartupInfo.lpReserved = 0 + lpStartupInfo.lpDesktop = 0 + lpStartupInfo.lpTitle = 0 + lpStartupInfo.dwFlags = 0 + lpStartupInfo.cbReserved2 = 0 + lpStartupInfo.lpReserved2 = 0 + lpProcessInformation = PROCESS_INFORMATION() + lpProcessInformation.hProcess = INVALID_HANDLE_VALUE + lpProcessInformation.hThread = INVALID_HANDLE_VALUE + lpProcessInformation.dwProcessId = 0 + lpProcessInformation.dwThreadId = 0 + _CreateProcessA( + lpApplicationName, + lpCommandLine, + lpProcessAttributes, + lpThreadAttributes, + bool(bInheritHandles), + dwCreationFlags, + lpEnvironment, + lpCurrentDirectory, + byref(lpStartupInfo), + byref(lpProcessInformation), + ) + return ProcessInformation(lpProcessInformation) + + +def CreateProcessW( + lpApplicationName, + lpCommandLine=None, + lpProcessAttributes=None, + lpThreadAttributes=None, + bInheritHandles=False, + dwCreationFlags=0, + lpEnvironment=None, + lpCurrentDirectory=None, + lpStartupInfo=None, +): + _CreateProcessW = windll.kernel32.CreateProcessW + _CreateProcessW.argtypes = [ + LPWSTR, + LPWSTR, + LPSECURITY_ATTRIBUTES, + LPSECURITY_ATTRIBUTES, + BOOL, + DWORD, + LPVOID, + LPWSTR, + LPVOID, + LPPROCESS_INFORMATION, + ] + _CreateProcessW.restype = bool + _CreateProcessW.errcheck = RaiseIfZero + + if not lpApplicationName: + lpApplicationName = None + if not lpCommandLine: + lpCommandLine = None + else: + lpCommandLine = ctypes.create_unicode_buffer(lpCommandLine, max(MAX_PATH, len(lpCommandLine))) + if not lpEnvironment: + lpEnvironment = None + else: + lpEnvironment = ctypes.create_unicode_buffer(lpEnvironment) + if not lpCurrentDirectory: + lpCurrentDirectory = None + if not lpProcessAttributes: + lpProcessAttributes = None + else: + lpProcessAttributes = byref(lpProcessAttributes) + if not lpThreadAttributes: + lpThreadAttributes = None + else: + lpThreadAttributes = byref(lpThreadAttributes) + if not lpStartupInfo: + lpStartupInfo = STARTUPINFO() + lpStartupInfo.cb = sizeof(STARTUPINFO) + lpStartupInfo.lpReserved = 0 + lpStartupInfo.lpDesktop = 0 + lpStartupInfo.lpTitle = 0 + lpStartupInfo.dwFlags = 0 + lpStartupInfo.cbReserved2 = 0 + lpStartupInfo.lpReserved2 = 0 + lpProcessInformation = PROCESS_INFORMATION() + lpProcessInformation.hProcess = INVALID_HANDLE_VALUE + lpProcessInformation.hThread = INVALID_HANDLE_VALUE + lpProcessInformation.dwProcessId = 0 + lpProcessInformation.dwThreadId = 0 + _CreateProcessW( + lpApplicationName, + lpCommandLine, + lpProcessAttributes, + lpThreadAttributes, + bool(bInheritHandles), + dwCreationFlags, + lpEnvironment, + lpCurrentDirectory, + byref(lpStartupInfo), + byref(lpProcessInformation), + ) + return ProcessInformation(lpProcessInformation) + + +CreateProcess = GuessStringType(CreateProcessA, CreateProcessW) + + +# BOOL WINAPI InitializeProcThreadAttributeList( +# __out_opt LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, +# __in DWORD dwAttributeCount, +# __reserved DWORD dwFlags, +# __inout PSIZE_T lpSize +# ); +def InitializeProcThreadAttributeList(dwAttributeCount): + _InitializeProcThreadAttributeList = windll.kernel32.InitializeProcThreadAttributeList + _InitializeProcThreadAttributeList.argtypes = [LPPROC_THREAD_ATTRIBUTE_LIST, DWORD, DWORD, PSIZE_T] + _InitializeProcThreadAttributeList.restype = bool + + Size = SIZE_T(0) + _InitializeProcThreadAttributeList(None, dwAttributeCount, 0, byref(Size)) + RaiseIfZero(Size.value) + AttributeList = (BYTE * Size.value)() + success = _InitializeProcThreadAttributeList(byref(AttributeList), dwAttributeCount, 0, byref(Size)) + RaiseIfZero(success) + return AttributeList + + +# BOOL WINAPI UpdateProcThreadAttribute( +# __inout LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, +# __in DWORD dwFlags, +# __in DWORD_PTR Attribute, +# __in PVOID lpValue, +# __in SIZE_T cbSize, +# __out_opt PVOID lpPreviousValue, +# __in_opt PSIZE_T lpReturnSize +# ); +def UpdateProcThreadAttribute(lpAttributeList, Attribute, Value, cbSize=None): + _UpdateProcThreadAttribute = windll.kernel32.UpdateProcThreadAttribute + _UpdateProcThreadAttribute.argtypes = [LPPROC_THREAD_ATTRIBUTE_LIST, DWORD, DWORD_PTR, PVOID, SIZE_T, PVOID, PSIZE_T] + _UpdateProcThreadAttribute.restype = bool + _UpdateProcThreadAttribute.errcheck = RaiseIfZero + + if cbSize is None: + cbSize = sizeof(Value) + _UpdateProcThreadAttribute(byref(lpAttributeList), 0, Attribute, byref(Value), cbSize, None, None) + + +# VOID WINAPI DeleteProcThreadAttributeList( +# __inout LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList +# ); +def DeleteProcThreadAttributeList(lpAttributeList): + _DeleteProcThreadAttributeList = windll.kernel32.DeleteProcThreadAttributeList + _DeleteProcThreadAttributeList.restype = None + _DeleteProcThreadAttributeList(byref(lpAttributeList)) + + +# HANDLE WINAPI OpenProcess( +# __in DWORD dwDesiredAccess, +# __in BOOL bInheritHandle, +# __in DWORD dwProcessId +# ); +def OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId): + _OpenProcess = windll.kernel32.OpenProcess + _OpenProcess.argtypes = [DWORD, BOOL, DWORD] + _OpenProcess.restype = HANDLE + + hProcess = _OpenProcess(dwDesiredAccess, bool(bInheritHandle), dwProcessId) + if hProcess == NULL: + raise ctypes.WinError() + return ProcessHandle(hProcess, dwAccess=dwDesiredAccess) + + +# HANDLE WINAPI OpenThread( +# __in DWORD dwDesiredAccess, +# __in BOOL bInheritHandle, +# __in DWORD dwThreadId +# ); +def OpenThread(dwDesiredAccess, bInheritHandle, dwThreadId): + _OpenThread = windll.kernel32.OpenThread + _OpenThread.argtypes = [DWORD, BOOL, DWORD] + _OpenThread.restype = HANDLE + + hThread = _OpenThread(dwDesiredAccess, bool(bInheritHandle), dwThreadId) + if hThread == NULL: + raise ctypes.WinError() + return ThreadHandle(hThread, dwAccess=dwDesiredAccess) + + +# DWORD WINAPI SuspendThread( +# __in HANDLE hThread +# ); +def SuspendThread(hThread): + _SuspendThread = windll.kernel32.SuspendThread + _SuspendThread.argtypes = [HANDLE] + _SuspendThread.restype = DWORD + + previousCount = _SuspendThread(hThread) + if previousCount == DWORD(-1).value: + raise ctypes.WinError() + return previousCount + + +# DWORD WINAPI ResumeThread( +# __in HANDLE hThread +# ); +def ResumeThread(hThread): + _ResumeThread = windll.kernel32.ResumeThread + _ResumeThread.argtypes = [HANDLE] + _ResumeThread.restype = DWORD + + previousCount = _ResumeThread(hThread) + if previousCount == DWORD(-1).value: + raise ctypes.WinError() + return previousCount + + +# BOOL WINAPI TerminateThread( +# __inout HANDLE hThread, +# __in DWORD dwExitCode +# ); +def TerminateThread(hThread, dwExitCode=0): + _TerminateThread = windll.kernel32.TerminateThread + _TerminateThread.argtypes = [HANDLE, DWORD] + _TerminateThread.restype = bool + _TerminateThread.errcheck = RaiseIfZero + _TerminateThread(hThread, dwExitCode) + + +# BOOL WINAPI TerminateProcess( +# __inout HANDLE hProcess, +# __in DWORD dwExitCode +# ); +def TerminateProcess(hProcess, dwExitCode=0): + _TerminateProcess = windll.kernel32.TerminateProcess + _TerminateProcess.argtypes = [HANDLE, DWORD] + _TerminateProcess.restype = bool + _TerminateProcess.errcheck = RaiseIfZero + _TerminateProcess(hProcess, dwExitCode) + + +# DWORD WINAPI GetCurrentProcessId(void); +def GetCurrentProcessId(): + _GetCurrentProcessId = windll.kernel32.GetCurrentProcessId + _GetCurrentProcessId.argtypes = [] + _GetCurrentProcessId.restype = DWORD + return _GetCurrentProcessId() + + +# DWORD WINAPI GetCurrentThreadId(void); +def GetCurrentThreadId(): + _GetCurrentThreadId = windll.kernel32.GetCurrentThreadId + _GetCurrentThreadId.argtypes = [] + _GetCurrentThreadId.restype = DWORD + return _GetCurrentThreadId() + + +# DWORD WINAPI GetProcessId( +# __in HANDLE hProcess +# ); +def GetProcessId(hProcess): + _GetProcessId = windll.kernel32.GetProcessId + _GetProcessId.argtypes = [HANDLE] + _GetProcessId.restype = DWORD + _GetProcessId.errcheck = RaiseIfZero + return _GetProcessId(hProcess) + + +# DWORD WINAPI GetThreadId( +# __in HANDLE hThread +# ); +def GetThreadId(hThread): + _GetThreadId = windll.kernel32._GetThreadId + _GetThreadId.argtypes = [HANDLE] + _GetThreadId.restype = DWORD + + dwThreadId = _GetThreadId(hThread) + if dwThreadId == 0: + raise ctypes.WinError() + return dwThreadId + + +# DWORD WINAPI GetProcessIdOfThread( +# __in HANDLE hThread +# ); +def GetProcessIdOfThread(hThread): + _GetProcessIdOfThread = windll.kernel32.GetProcessIdOfThread + _GetProcessIdOfThread.argtypes = [HANDLE] + _GetProcessIdOfThread.restype = DWORD + + dwProcessId = _GetProcessIdOfThread(hThread) + if dwProcessId == 0: + raise ctypes.WinError() + return dwProcessId + + +# BOOL WINAPI GetExitCodeProcess( +# __in HANDLE hProcess, +# __out LPDWORD lpExitCode +# ); +def GetExitCodeProcess(hProcess): + _GetExitCodeProcess = windll.kernel32.GetExitCodeProcess + _GetExitCodeProcess.argtypes = [HANDLE] + _GetExitCodeProcess.restype = bool + _GetExitCodeProcess.errcheck = RaiseIfZero + + lpExitCode = DWORD(0) + _GetExitCodeProcess(hProcess, byref(lpExitCode)) + return lpExitCode.value + + +# BOOL WINAPI GetExitCodeThread( +# __in HANDLE hThread, +# __out LPDWORD lpExitCode +# ); +def GetExitCodeThread(hThread): + _GetExitCodeThread = windll.kernel32.GetExitCodeThread + _GetExitCodeThread.argtypes = [HANDLE] + _GetExitCodeThread.restype = bool + _GetExitCodeThread.errcheck = RaiseIfZero + + lpExitCode = DWORD(0) + _GetExitCodeThread(hThread, byref(lpExitCode)) + return lpExitCode.value + + +# DWORD WINAPI GetProcessVersion( +# __in DWORD ProcessId +# ); +def GetProcessVersion(ProcessId): + _GetProcessVersion = windll.kernel32.GetProcessVersion + _GetProcessVersion.argtypes = [DWORD] + _GetProcessVersion.restype = DWORD + + retval = _GetProcessVersion(ProcessId) + if retval == 0: + raise ctypes.WinError() + return retval + + +# DWORD WINAPI GetPriorityClass( +# __in HANDLE hProcess +# ); +def GetPriorityClass(hProcess): + _GetPriorityClass = windll.kernel32.GetPriorityClass + _GetPriorityClass.argtypes = [HANDLE] + _GetPriorityClass.restype = DWORD + + retval = _GetPriorityClass(hProcess) + if retval == 0: + raise ctypes.WinError() + return retval + + +# BOOL WINAPI SetPriorityClass( +# __in HANDLE hProcess, +# __in DWORD dwPriorityClass +# ); +def SetPriorityClass(hProcess, dwPriorityClass=NORMAL_PRIORITY_CLASS): + _SetPriorityClass = windll.kernel32.SetPriorityClass + _SetPriorityClass.argtypes = [HANDLE, DWORD] + _SetPriorityClass.restype = bool + _SetPriorityClass.errcheck = RaiseIfZero + _SetPriorityClass(hProcess, dwPriorityClass) + + +# BOOL WINAPI GetProcessPriorityBoost( +# __in HANDLE hProcess, +# __out PBOOL pDisablePriorityBoost +# ); +def GetProcessPriorityBoost(hProcess): + _GetProcessPriorityBoost = windll.kernel32.GetProcessPriorityBoost + _GetProcessPriorityBoost.argtypes = [HANDLE, PBOOL] + _GetProcessPriorityBoost.restype = bool + _GetProcessPriorityBoost.errcheck = RaiseIfZero + + pDisablePriorityBoost = BOOL(False) + _GetProcessPriorityBoost(hProcess, byref(pDisablePriorityBoost)) + return bool(pDisablePriorityBoost.value) + + +# BOOL WINAPI SetProcessPriorityBoost( +# __in HANDLE hProcess, +# __in BOOL DisablePriorityBoost +# ); +def SetProcessPriorityBoost(hProcess, DisablePriorityBoost): + _SetProcessPriorityBoost = windll.kernel32.SetProcessPriorityBoost + _SetProcessPriorityBoost.argtypes = [HANDLE, BOOL] + _SetProcessPriorityBoost.restype = bool + _SetProcessPriorityBoost.errcheck = RaiseIfZero + _SetProcessPriorityBoost(hProcess, bool(DisablePriorityBoost)) + + +# BOOL WINAPI GetProcessAffinityMask( +# __in HANDLE hProcess, +# __out PDWORD_PTR lpProcessAffinityMask, +# __out PDWORD_PTR lpSystemAffinityMask +# ); +def GetProcessAffinityMask(hProcess): + _GetProcessAffinityMask = windll.kernel32.GetProcessAffinityMask + _GetProcessAffinityMask.argtypes = [HANDLE, PDWORD_PTR, PDWORD_PTR] + _GetProcessAffinityMask.restype = bool + _GetProcessAffinityMask.errcheck = RaiseIfZero + + lpProcessAffinityMask = DWORD_PTR(0) + lpSystemAffinityMask = DWORD_PTR(0) + _GetProcessAffinityMask(hProcess, byref(lpProcessAffinityMask), byref(lpSystemAffinityMask)) + return lpProcessAffinityMask.value, lpSystemAffinityMask.value + + +# BOOL WINAPI SetProcessAffinityMask( +# __in HANDLE hProcess, +# __in DWORD_PTR dwProcessAffinityMask +# ); +def SetProcessAffinityMask(hProcess, dwProcessAffinityMask): + _SetProcessAffinityMask = windll.kernel32.SetProcessAffinityMask + _SetProcessAffinityMask.argtypes = [HANDLE, DWORD_PTR] + _SetProcessAffinityMask.restype = bool + _SetProcessAffinityMask.errcheck = RaiseIfZero + _SetProcessAffinityMask(hProcess, dwProcessAffinityMask) + + +# ------------------------------------------------------------------------------ +# Toolhelp32 API + + +# HANDLE WINAPI CreateToolhelp32Snapshot( +# __in DWORD dwFlags, +# __in DWORD th32ProcessID +# ); +def CreateToolhelp32Snapshot(dwFlags=TH32CS_SNAPALL, th32ProcessID=0): + _CreateToolhelp32Snapshot = windll.kernel32.CreateToolhelp32Snapshot + _CreateToolhelp32Snapshot.argtypes = [DWORD, DWORD] + _CreateToolhelp32Snapshot.restype = HANDLE + + hSnapshot = _CreateToolhelp32Snapshot(dwFlags, th32ProcessID) + if hSnapshot == INVALID_HANDLE_VALUE: + raise ctypes.WinError() + return SnapshotHandle(hSnapshot) + + +# BOOL WINAPI Process32First( +# __in HANDLE hSnapshot, +# __inout LPPROCESSENTRY32 lppe +# ); +def Process32First(hSnapshot): + _Process32First = windll.kernel32.Process32First + _Process32First.argtypes = [HANDLE, LPPROCESSENTRY32] + _Process32First.restype = bool + + pe = PROCESSENTRY32() + pe.dwSize = sizeof(PROCESSENTRY32) + success = _Process32First(hSnapshot, byref(pe)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return pe + + +# BOOL WINAPI Process32Next( +# __in HANDLE hSnapshot, +# __out LPPROCESSENTRY32 lppe +# ); +def Process32Next(hSnapshot, pe=None): + _Process32Next = windll.kernel32.Process32Next + _Process32Next.argtypes = [HANDLE, LPPROCESSENTRY32] + _Process32Next.restype = bool + + if pe is None: + pe = PROCESSENTRY32() + pe.dwSize = sizeof(PROCESSENTRY32) + success = _Process32Next(hSnapshot, byref(pe)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return pe + + +# BOOL WINAPI Thread32First( +# __in HANDLE hSnapshot, +# __inout LPTHREADENTRY32 lpte +# ); +def Thread32First(hSnapshot): + _Thread32First = windll.kernel32.Thread32First + _Thread32First.argtypes = [HANDLE, LPTHREADENTRY32] + _Thread32First.restype = bool + + te = THREADENTRY32() + te.dwSize = sizeof(THREADENTRY32) + success = _Thread32First(hSnapshot, byref(te)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return te + + +# BOOL WINAPI Thread32Next( +# __in HANDLE hSnapshot, +# __out LPTHREADENTRY32 lpte +# ); +def Thread32Next(hSnapshot, te=None): + _Thread32Next = windll.kernel32.Thread32Next + _Thread32Next.argtypes = [HANDLE, LPTHREADENTRY32] + _Thread32Next.restype = bool + + if te is None: + te = THREADENTRY32() + te.dwSize = sizeof(THREADENTRY32) + success = _Thread32Next(hSnapshot, byref(te)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return te + + +# BOOL WINAPI Module32First( +# __in HANDLE hSnapshot, +# __inout LPMODULEENTRY32 lpme +# ); +def Module32First(hSnapshot): + _Module32First = windll.kernel32.Module32First + _Module32First.argtypes = [HANDLE, LPMODULEENTRY32] + _Module32First.restype = bool + + me = MODULEENTRY32() + me.dwSize = sizeof(MODULEENTRY32) + success = _Module32First(hSnapshot, byref(me)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return me + + +# BOOL WINAPI Module32Next( +# __in HANDLE hSnapshot, +# __out LPMODULEENTRY32 lpme +# ); +def Module32Next(hSnapshot, me=None): + _Module32Next = windll.kernel32.Module32Next + _Module32Next.argtypes = [HANDLE, LPMODULEENTRY32] + _Module32Next.restype = bool + + if me is None: + me = MODULEENTRY32() + me.dwSize = sizeof(MODULEENTRY32) + success = _Module32Next(hSnapshot, byref(me)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return me + + +# BOOL WINAPI Heap32First( +# __inout LPHEAPENTRY32 lphe, +# __in DWORD th32ProcessID, +# __in ULONG_PTR th32HeapID +# ); +def Heap32First(th32ProcessID, th32HeapID): + _Heap32First = windll.kernel32.Heap32First + _Heap32First.argtypes = [LPHEAPENTRY32, DWORD, ULONG_PTR] + _Heap32First.restype = bool + + he = HEAPENTRY32() + he.dwSize = sizeof(HEAPENTRY32) + success = _Heap32First(byref(he), th32ProcessID, th32HeapID) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return he + + +# BOOL WINAPI Heap32Next( +# __out LPHEAPENTRY32 lphe +# ); +def Heap32Next(he): + _Heap32Next = windll.kernel32.Heap32Next + _Heap32Next.argtypes = [LPHEAPENTRY32] + _Heap32Next.restype = bool + + he.dwSize = sizeof(HEAPENTRY32) + success = _Heap32Next(byref(he)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return he + + +# BOOL WINAPI Heap32ListFirst( +# __in HANDLE hSnapshot, +# __inout LPHEAPLIST32 lphl +# ); +def Heap32ListFirst(hSnapshot): + _Heap32ListFirst = windll.kernel32.Heap32ListFirst + _Heap32ListFirst.argtypes = [HANDLE, LPHEAPLIST32] + _Heap32ListFirst.restype = bool + + hl = HEAPLIST32() + hl.dwSize = sizeof(HEAPLIST32) + success = _Heap32ListFirst(hSnapshot, byref(hl)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return hl + + +# BOOL WINAPI Heap32ListNext( +# __in HANDLE hSnapshot, +# __out LPHEAPLIST32 lphl +# ); +def Heap32ListNext(hSnapshot, hl=None): + _Heap32ListNext = windll.kernel32.Heap32ListNext + _Heap32ListNext.argtypes = [HANDLE, LPHEAPLIST32] + _Heap32ListNext.restype = bool + + if hl is None: + hl = HEAPLIST32() + hl.dwSize = sizeof(HEAPLIST32) + success = _Heap32ListNext(hSnapshot, byref(hl)) + if not success: + if GetLastError() == ERROR_NO_MORE_FILES: + return None + raise ctypes.WinError() + return hl + + +# BOOL WINAPI Toolhelp32ReadProcessMemory( +# __in DWORD th32ProcessID, +# __in LPCVOID lpBaseAddress, +# __out LPVOID lpBuffer, +# __in SIZE_T cbRead, +# __out SIZE_T lpNumberOfBytesRead +# ); +def Toolhelp32ReadProcessMemory(th32ProcessID, lpBaseAddress, cbRead): + _Toolhelp32ReadProcessMemory = windll.kernel32.Toolhelp32ReadProcessMemory + _Toolhelp32ReadProcessMemory.argtypes = [DWORD, LPVOID, LPVOID, SIZE_T, POINTER(SIZE_T)] + _Toolhelp32ReadProcessMemory.restype = bool + + lpBuffer = ctypes.create_string_buffer("", cbRead) + lpNumberOfBytesRead = SIZE_T(0) + success = _Toolhelp32ReadProcessMemory(th32ProcessID, lpBaseAddress, lpBuffer, cbRead, byref(lpNumberOfBytesRead)) + if not success and GetLastError() != ERROR_PARTIAL_COPY: + raise ctypes.WinError() + return str(lpBuffer.raw)[: lpNumberOfBytesRead.value] + + +# ------------------------------------------------------------------------------ +# Miscellaneous system information + + +# BOOL WINAPI GetProcessDEPPolicy( +# __in HANDLE hProcess, +# __out LPDWORD lpFlags, +# __out PBOOL lpPermanent +# ); +# Contribution by ivanlef0u (http://ivanlef0u.fr/) +# XP SP3 and > only +def GetProcessDEPPolicy(hProcess): + _GetProcessDEPPolicy = windll.kernel32.GetProcessDEPPolicy + _GetProcessDEPPolicy.argtypes = [HANDLE, LPDWORD, PBOOL] + _GetProcessDEPPolicy.restype = bool + _GetProcessDEPPolicy.errcheck = RaiseIfZero + + lpFlags = DWORD(0) + lpPermanent = BOOL(0) + _GetProcessDEPPolicy(hProcess, byref(lpFlags), byref(lpPermanent)) + return (lpFlags.value, lpPermanent.value) + + +# DWORD WINAPI GetCurrentProcessorNumber(void); +def GetCurrentProcessorNumber(): + _GetCurrentProcessorNumber = windll.kernel32.GetCurrentProcessorNumber + _GetCurrentProcessorNumber.argtypes = [] + _GetCurrentProcessorNumber.restype = DWORD + _GetCurrentProcessorNumber.errcheck = RaiseIfZero + return _GetCurrentProcessorNumber() + + +# VOID WINAPI FlushProcessWriteBuffers(void); +def FlushProcessWriteBuffers(): + _FlushProcessWriteBuffers = windll.kernel32.FlushProcessWriteBuffers + _FlushProcessWriteBuffers.argtypes = [] + _FlushProcessWriteBuffers.restype = None + _FlushProcessWriteBuffers() + + +# BOOL WINAPI GetLogicalProcessorInformation( +# __out PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, +# __inout PDWORD ReturnLength +# ); + +# TO DO http://msdn.microsoft.com/en-us/library/ms683194(VS.85).aspx + +# BOOL WINAPI GetProcessIoCounters( +# __in HANDLE hProcess, +# __out PIO_COUNTERS lpIoCounters +# ); + +# TO DO http://msdn.microsoft.com/en-us/library/ms683218(VS.85).aspx + + +# DWORD WINAPI GetGuiResources( +# __in HANDLE hProcess, +# __in DWORD uiFlags +# ); +def GetGuiResources(hProcess, uiFlags=GR_GDIOBJECTS): + _GetGuiResources = windll.kernel32.GetGuiResources + _GetGuiResources.argtypes = [HANDLE, DWORD] + _GetGuiResources.restype = DWORD + + dwCount = _GetGuiResources(hProcess, uiFlags) + if dwCount == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return dwCount + + +# BOOL WINAPI GetProcessHandleCount( +# __in HANDLE hProcess, +# __inout PDWORD pdwHandleCount +# ); +def GetProcessHandleCount(hProcess): + _GetProcessHandleCount = windll.kernel32.GetProcessHandleCount + _GetProcessHandleCount.argtypes = [HANDLE, PDWORD] + _GetProcessHandleCount.restype = DWORD + _GetProcessHandleCount.errcheck = RaiseIfZero + + pdwHandleCount = DWORD(0) + _GetProcessHandleCount(hProcess, byref(pdwHandleCount)) + return pdwHandleCount.value + + +# BOOL WINAPI GetProcessTimes( +# __in HANDLE hProcess, +# __out LPFILETIME lpCreationTime, +# __out LPFILETIME lpExitTime, +# __out LPFILETIME lpKernelTime, +# __out LPFILETIME lpUserTime +# ); +def GetProcessTimes(hProcess=None): + _GetProcessTimes = windll.kernel32.GetProcessTimes + _GetProcessTimes.argtypes = [HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME] + _GetProcessTimes.restype = bool + _GetProcessTimes.errcheck = RaiseIfZero + + if hProcess is None: + hProcess = GetCurrentProcess() + + CreationTime = FILETIME() + ExitTime = FILETIME() + KernelTime = FILETIME() + UserTime = FILETIME() + + _GetProcessTimes(hProcess, byref(CreationTime), byref(ExitTime), byref(KernelTime), byref(UserTime)) + + return (CreationTime, ExitTime, KernelTime, UserTime) + + +# BOOL WINAPI FileTimeToSystemTime( +# __in const FILETIME *lpFileTime, +# __out LPSYSTEMTIME lpSystemTime +# ); +def FileTimeToSystemTime(lpFileTime): + _FileTimeToSystemTime = windll.kernel32.FileTimeToSystemTime + _FileTimeToSystemTime.argtypes = [LPFILETIME, LPSYSTEMTIME] + _FileTimeToSystemTime.restype = bool + _FileTimeToSystemTime.errcheck = RaiseIfZero + + if isinstance(lpFileTime, FILETIME): + FileTime = lpFileTime + else: + FileTime = FILETIME() + FileTime.dwLowDateTime = lpFileTime & 0xFFFFFFFF + FileTime.dwHighDateTime = lpFileTime >> 32 + SystemTime = SYSTEMTIME() + _FileTimeToSystemTime(byref(FileTime), byref(SystemTime)) + return SystemTime + + +# void WINAPI GetSystemTimeAsFileTime( +# __out LPFILETIME lpSystemTimeAsFileTime +# ); +def GetSystemTimeAsFileTime(): + _GetSystemTimeAsFileTime = windll.kernel32.GetSystemTimeAsFileTime + _GetSystemTimeAsFileTime.argtypes = [LPFILETIME] + _GetSystemTimeAsFileTime.restype = None + + FileTime = FILETIME() + _GetSystemTimeAsFileTime(byref(FileTime)) + return FileTime + + +# ------------------------------------------------------------------------------ +# Global ATOM API + + +# ATOM GlobalAddAtom( +# __in LPCTSTR lpString +# ); +def GlobalAddAtomA(lpString): + _GlobalAddAtomA = windll.kernel32.GlobalAddAtomA + _GlobalAddAtomA.argtypes = [LPSTR] + _GlobalAddAtomA.restype = ATOM + _GlobalAddAtomA.errcheck = RaiseIfZero + return _GlobalAddAtomA(lpString) + + +def GlobalAddAtomW(lpString): + _GlobalAddAtomW = windll.kernel32.GlobalAddAtomW + _GlobalAddAtomW.argtypes = [LPWSTR] + _GlobalAddAtomW.restype = ATOM + _GlobalAddAtomW.errcheck = RaiseIfZero + return _GlobalAddAtomW(lpString) + + +GlobalAddAtom = GuessStringType(GlobalAddAtomA, GlobalAddAtomW) + + +# ATOM GlobalFindAtom( +# __in LPCTSTR lpString +# ); +def GlobalFindAtomA(lpString): + _GlobalFindAtomA = windll.kernel32.GlobalFindAtomA + _GlobalFindAtomA.argtypes = [LPSTR] + _GlobalFindAtomA.restype = ATOM + _GlobalFindAtomA.errcheck = RaiseIfZero + return _GlobalFindAtomA(lpString) + + +def GlobalFindAtomW(lpString): + _GlobalFindAtomW = windll.kernel32.GlobalFindAtomW + _GlobalFindAtomW.argtypes = [LPWSTR] + _GlobalFindAtomW.restype = ATOM + _GlobalFindAtomW.errcheck = RaiseIfZero + return _GlobalFindAtomW(lpString) + + +GlobalFindAtom = GuessStringType(GlobalFindAtomA, GlobalFindAtomW) + + +# UINT GlobalGetAtomName( +# __in ATOM nAtom, +# __out LPTSTR lpBuffer, +# __in int nSize +# ); +def GlobalGetAtomNameA(nAtom): + _GlobalGetAtomNameA = windll.kernel32.GlobalGetAtomNameA + _GlobalGetAtomNameA.argtypes = [ATOM, LPSTR, ctypes.c_int] + _GlobalGetAtomNameA.restype = UINT + _GlobalGetAtomNameA.errcheck = RaiseIfZero + + nSize = 64 + while 1: + lpBuffer = ctypes.create_string_buffer("", nSize) + nCopied = _GlobalGetAtomNameA(nAtom, lpBuffer, nSize) + if nCopied < nSize - 1: + break + nSize = nSize + 64 + return lpBuffer.value + + +def GlobalGetAtomNameW(nAtom): + _GlobalGetAtomNameW = windll.kernel32.GlobalGetAtomNameW + _GlobalGetAtomNameW.argtypes = [ATOM, LPWSTR, ctypes.c_int] + _GlobalGetAtomNameW.restype = UINT + _GlobalGetAtomNameW.errcheck = RaiseIfZero + + nSize = 64 + while 1: + lpBuffer = ctypes.create_unicode_buffer("", nSize) + nCopied = _GlobalGetAtomNameW(nAtom, lpBuffer, nSize) + if nCopied < nSize - 1: + break + nSize = nSize + 64 + return lpBuffer.value + + +GlobalGetAtomName = GuessStringType(GlobalGetAtomNameA, GlobalGetAtomNameW) + + +# ATOM GlobalDeleteAtom( +# __in ATOM nAtom +# ); +def GlobalDeleteAtom(nAtom): + _GlobalDeleteAtom = windll.kernel32.GlobalDeleteAtom + _GlobalDeleteAtom.argtypes + _GlobalDeleteAtom.restype + SetLastError(ERROR_SUCCESS) + _GlobalDeleteAtom(nAtom) + error = GetLastError() + if error != ERROR_SUCCESS: + raise ctypes.WinError(error) + + +# ------------------------------------------------------------------------------ +# Wow64 + + +# DWORD WINAPI Wow64SuspendThread( +# _In_ HANDLE hThread +# ); +def Wow64SuspendThread(hThread): + _Wow64SuspendThread = windll.kernel32.Wow64SuspendThread + _Wow64SuspendThread.argtypes = [HANDLE] + _Wow64SuspendThread.restype = DWORD + + previousCount = _Wow64SuspendThread(hThread) + if previousCount == DWORD(-1).value: + raise ctypes.WinError() + return previousCount + + +# BOOLEAN WINAPI Wow64EnableWow64FsRedirection( +# __in BOOLEAN Wow64FsEnableRedirection +# ); +def Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection): + """ + This function may not work reliably when there are nested calls. Therefore, + this function has been replaced by the L{Wow64DisableWow64FsRedirection} + and L{Wow64RevertWow64FsRedirection} functions. + + @see: U{http://msdn.microsoft.com/en-us/library/windows/desktop/aa365744(v=vs.85).aspx} + """ + _Wow64EnableWow64FsRedirection = windll.kernel32.Wow64EnableWow64FsRedirection + _Wow64EnableWow64FsRedirection.argtypes = [BOOLEAN] + _Wow64EnableWow64FsRedirection.restype = BOOLEAN + _Wow64EnableWow64FsRedirection.errcheck = RaiseIfZero + + +# BOOL WINAPI Wow64DisableWow64FsRedirection( +# __out PVOID *OldValue +# ); +def Wow64DisableWow64FsRedirection(): + _Wow64DisableWow64FsRedirection = windll.kernel32.Wow64DisableWow64FsRedirection + _Wow64DisableWow64FsRedirection.argtypes = [PPVOID] + _Wow64DisableWow64FsRedirection.restype = BOOL + _Wow64DisableWow64FsRedirection.errcheck = RaiseIfZero + + OldValue = PVOID(None) + _Wow64DisableWow64FsRedirection(byref(OldValue)) + return OldValue + + +# BOOL WINAPI Wow64RevertWow64FsRedirection( +# __in PVOID OldValue +# ); +def Wow64RevertWow64FsRedirection(OldValue): + _Wow64RevertWow64FsRedirection = windll.kernel32.Wow64RevertWow64FsRedirection + _Wow64RevertWow64FsRedirection.argtypes = [PVOID] + _Wow64RevertWow64FsRedirection.restype = BOOL + _Wow64RevertWow64FsRedirection.errcheck = RaiseIfZero + _Wow64RevertWow64FsRedirection(OldValue) + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== + +# ============================================================================== +# Mark functions that Psyco cannot compile. +# In your programs, don't use psyco.full(). +# Call psyco.bind() on your main function instead. + +try: + import psyco + + psyco.cannotcompile(WaitForDebugEvent) + psyco.cannotcompile(WaitForSingleObject) + psyco.cannotcompile(WaitForSingleObjectEx) + psyco.cannotcompile(WaitForMultipleObjects) + psyco.cannotcompile(WaitForMultipleObjectsEx) +except ImportError: + pass +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/ntdll.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/ntdll.py new file mode 100644 index 0000000..7396ece --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/ntdll.py @@ -0,0 +1,579 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for ntdll.dll in ctypes. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +_all.add("peb_teb") +# ============================================================================== + +from winappdbg.win32.peb_teb import * + +# --- Types -------------------------------------------------------------------- + +SYSDBG_COMMAND = DWORD +PROCESSINFOCLASS = DWORD +THREADINFOCLASS = DWORD +FILE_INFORMATION_CLASS = DWORD + +# --- Constants ---------------------------------------------------------------- + +# DEP flags for ProcessExecuteFlags +MEM_EXECUTE_OPTION_ENABLE = 1 +MEM_EXECUTE_OPTION_DISABLE = 2 +MEM_EXECUTE_OPTION_ATL7_THUNK_EMULATION = 4 +MEM_EXECUTE_OPTION_PERMANENT = 8 + +# SYSTEM_INFORMATION_CLASS +# http://www.informit.com/articles/article.aspx?p=22442&seqNum=4 +SystemBasicInformation = 1 # 0x002C +SystemProcessorInformation = 2 # 0x000C +SystemPerformanceInformation = 3 # 0x0138 +SystemTimeInformation = 4 # 0x0020 +SystemPathInformation = 5 # not implemented +SystemProcessInformation = 6 # 0x00F8 + per process +SystemCallInformation = 7 # 0x0018 + (n * 0x0004) +SystemConfigurationInformation = 8 # 0x0018 +SystemProcessorCounters = 9 # 0x0030 per cpu +SystemGlobalFlag = 10 # 0x0004 +SystemInfo10 = 11 # not implemented +SystemModuleInformation = 12 # 0x0004 + (n * 0x011C) +SystemLockInformation = 13 # 0x0004 + (n * 0x0024) +SystemInfo13 = 14 # not implemented +SystemPagedPoolInformation = 15 # checked build only +SystemNonPagedPoolInformation = 16 # checked build only +SystemHandleInformation = 17 # 0x0004 + (n * 0x0010) +SystemObjectInformation = 18 # 0x0038+ + (n * 0x0030+) +SystemPagefileInformation = 19 # 0x0018+ per page file +SystemInstemulInformation = 20 # 0x0088 +SystemInfo20 = 21 # invalid info class +SystemCacheInformation = 22 # 0x0024 +SystemPoolTagInformation = 23 # 0x0004 + (n * 0x001C) +SystemProcessorStatistics = 24 # 0x0000, or 0x0018 per cpu +SystemDpcInformation = 25 # 0x0014 +SystemMemoryUsageInformation1 = 26 # checked build only +SystemLoadImage = 27 # 0x0018, set mode only +SystemUnloadImage = 28 # 0x0004, set mode only +SystemTimeAdjustmentInformation = 29 # 0x000C, 0x0008 writeable +SystemMemoryUsageInformation2 = 30 # checked build only +SystemInfo30 = 31 # checked build only +SystemInfo31 = 32 # checked build only +SystemCrashDumpInformation = 33 # 0x0004 +SystemExceptionInformation = 34 # 0x0010 +SystemCrashDumpStateInformation = 35 # 0x0008 +SystemDebuggerInformation = 36 # 0x0002 +SystemThreadSwitchInformation = 37 # 0x0030 +SystemRegistryQuotaInformation = 38 # 0x000C +SystemLoadDriver = 39 # 0x0008, set mode only +SystemPrioritySeparationInformation = 40 # 0x0004, set mode only +SystemInfo40 = 41 # not implemented +SystemInfo41 = 42 # not implemented +SystemInfo42 = 43 # invalid info class +SystemInfo43 = 44 # invalid info class +SystemTimeZoneInformation = 45 # 0x00AC +SystemLookasideInformation = 46 # n * 0x0020 +# info classes specific to Windows 2000 +# WTS = Windows Terminal Server +SystemSetTimeSlipEvent = 47 # set mode only +SystemCreateSession = 48 # WTS, set mode only +SystemDeleteSession = 49 # WTS, set mode only +SystemInfo49 = 50 # invalid info class +SystemRangeStartInformation = 51 # 0x0004 +SystemVerifierInformation = 52 # 0x0068 +SystemAddVerifier = 53 # set mode only +SystemSessionProcessesInformation = 54 # WTS + +# NtQueryInformationProcess constants (from MSDN) +##ProcessBasicInformation = 0 +##ProcessDebugPort = 7 +##ProcessWow64Information = 26 +##ProcessImageFileName = 27 + +# PROCESS_INFORMATION_CLASS +# http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PROCESS_INFORMATION_CLASS.html +ProcessBasicInformation = 0 +ProcessQuotaLimits = 1 +ProcessIoCounters = 2 +ProcessVmCounters = 3 +ProcessTimes = 4 +ProcessBasePriority = 5 +ProcessRaisePriority = 6 +ProcessDebugPort = 7 +ProcessExceptionPort = 8 +ProcessAccessToken = 9 +ProcessLdtInformation = 10 +ProcessLdtSize = 11 +ProcessDefaultHardErrorMode = 12 +ProcessIoPortHandlers = 13 +ProcessPooledUsageAndLimits = 14 +ProcessWorkingSetWatch = 15 +ProcessUserModeIOPL = 16 +ProcessEnableAlignmentFaultFixup = 17 +ProcessPriorityClass = 18 +ProcessWx86Information = 19 +ProcessHandleCount = 20 +ProcessAffinityMask = 21 +ProcessPriorityBoost = 22 + +ProcessWow64Information = 26 +ProcessImageFileName = 27 + +# http://www.codeproject.com/KB/security/AntiReverseEngineering.aspx +ProcessDebugObjectHandle = 30 + +ProcessExecuteFlags = 34 + +# THREAD_INFORMATION_CLASS +ThreadBasicInformation = 0 +ThreadTimes = 1 +ThreadPriority = 2 +ThreadBasePriority = 3 +ThreadAffinityMask = 4 +ThreadImpersonationToken = 5 +ThreadDescriptorTableEntry = 6 +ThreadEnableAlignmentFaultFixup = 7 +ThreadEventPair = 8 +ThreadQuerySetWin32StartAddress = 9 +ThreadZeroTlsCell = 10 +ThreadPerformanceCount = 11 +ThreadAmILastThread = 12 +ThreadIdealProcessor = 13 +ThreadPriorityBoost = 14 +ThreadSetTlsArrayAddress = 15 +ThreadIsIoPending = 16 +ThreadHideFromDebugger = 17 + +# OBJECT_INFORMATION_CLASS +ObjectBasicInformation = 0 +ObjectNameInformation = 1 +ObjectTypeInformation = 2 +ObjectAllTypesInformation = 3 +ObjectHandleInformation = 4 + +# FILE_INFORMATION_CLASS +FileDirectoryInformation = 1 +FileFullDirectoryInformation = 2 +FileBothDirectoryInformation = 3 +FileBasicInformation = 4 +FileStandardInformation = 5 +FileInternalInformation = 6 +FileEaInformation = 7 +FileAccessInformation = 8 +FileNameInformation = 9 +FileRenameInformation = 10 +FileLinkInformation = 11 +FileNamesInformation = 12 +FileDispositionInformation = 13 +FilePositionInformation = 14 +FileFullEaInformation = 15 +FileModeInformation = 16 +FileAlignmentInformation = 17 +FileAllInformation = 18 +FileAllocationInformation = 19 +FileEndOfFileInformation = 20 +FileAlternateNameInformation = 21 +FileStreamInformation = 22 +FilePipeInformation = 23 +FilePipeLocalInformation = 24 +FilePipeRemoteInformation = 25 +FileMailslotQueryInformation = 26 +FileMailslotSetInformation = 27 +FileCompressionInformation = 28 +FileCopyOnWriteInformation = 29 +FileCompletionInformation = 30 +FileMoveClusterInformation = 31 +FileQuotaInformation = 32 +FileReparsePointInformation = 33 +FileNetworkOpenInformation = 34 +FileObjectIdInformation = 35 +FileTrackingInformation = 36 +FileOleDirectoryInformation = 37 +FileContentIndexInformation = 38 +FileInheritContentIndexInformation = 37 +FileOleInformation = 39 +FileMaximumInformation = 40 + +# From http://www.nirsoft.net/kernel_struct/vista/EXCEPTION_DISPOSITION.html +# typedef enum _EXCEPTION_DISPOSITION +# { +# ExceptionContinueExecution = 0, +# ExceptionContinueSearch = 1, +# ExceptionNestedException = 2, +# ExceptionCollidedUnwind = 3 +# } EXCEPTION_DISPOSITION; +ExceptionContinueExecution = 0 +ExceptionContinueSearch = 1 +ExceptionNestedException = 2 +ExceptionCollidedUnwind = 3 + +# --- PROCESS_BASIC_INFORMATION structure -------------------------------------- + +# From MSDN: +# +# typedef struct _PROCESS_BASIC_INFORMATION { +# PVOID Reserved1; +# PPEB PebBaseAddress; +# PVOID Reserved2[2]; +# ULONG_PTR UniqueProcessId; +# PVOID Reserved3; +# } PROCESS_BASIC_INFORMATION; +##class PROCESS_BASIC_INFORMATION(Structure): +## _fields_ = [ +## ("Reserved1", PVOID), +## ("PebBaseAddress", PPEB), +## ("Reserved2", PVOID * 2), +## ("UniqueProcessId", ULONG_PTR), +## ("Reserved3", PVOID), +##] + +# From http://catch22.net/tuts/tips2 +# (Only valid for 32 bits) +# +# typedef struct +# { +# ULONG ExitStatus; +# PVOID PebBaseAddress; +# ULONG AffinityMask; +# ULONG BasePriority; +# ULONG_PTR UniqueProcessId; +# ULONG_PTR InheritedFromUniqueProcessId; +# } PROCESS_BASIC_INFORMATION; + + +# My own definition follows: +class PROCESS_BASIC_INFORMATION(Structure): + _fields_ = [ + ("ExitStatus", SIZE_T), + ("PebBaseAddress", PVOID), # PPEB + ("AffinityMask", KAFFINITY), + ("BasePriority", SDWORD), + ("UniqueProcessId", ULONG_PTR), + ("InheritedFromUniqueProcessId", ULONG_PTR), + ] + + +# --- THREAD_BASIC_INFORMATION structure --------------------------------------- + + +# From http://undocumented.ntinternals.net/UserMode/Structures/THREAD_BASIC_INFORMATION.html +# +# typedef struct _THREAD_BASIC_INFORMATION { +# NTSTATUS ExitStatus; +# PVOID TebBaseAddress; +# CLIENT_ID ClientId; +# KAFFINITY AffinityMask; +# KPRIORITY Priority; +# KPRIORITY BasePriority; +# } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; +class THREAD_BASIC_INFORMATION(Structure): + _fields_ = [ + ("ExitStatus", NTSTATUS), + ("TebBaseAddress", PVOID), # PTEB + ("ClientId", CLIENT_ID), + ("AffinityMask", KAFFINITY), + ("Priority", SDWORD), + ("BasePriority", SDWORD), + ] + + +# --- FILE_NAME_INFORMATION structure ------------------------------------------ + + +# typedef struct _FILE_NAME_INFORMATION { +# ULONG FileNameLength; +# WCHAR FileName[1]; +# } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; +class FILE_NAME_INFORMATION(Structure): + _fields_ = [ + ("FileNameLength", ULONG), + ("FileName", WCHAR * 1), + ] + + +# --- SYSDBG_MSR structure and constants --------------------------------------- + +SysDbgReadMsr = 16 +SysDbgWriteMsr = 17 + + +class SYSDBG_MSR(Structure): + _fields_ = [ + ("Address", ULONG), + ("Data", ULONGLONG), + ] + + +# --- IO_STATUS_BLOCK structure ------------------------------------------------ + + +# typedef struct _IO_STATUS_BLOCK { +# union { +# NTSTATUS Status; +# PVOID Pointer; +# }; +# ULONG_PTR Information; +# } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; +class IO_STATUS_BLOCK(Structure): + _fields_ = [ + ("Status", NTSTATUS), + ("Information", ULONG_PTR), + ] + + def __get_Pointer(self): + return PVOID(self.Status) + + def __set_Pointer(self, ptr): + self.Status = ptr.value + + Pointer = property(__get_Pointer, __set_Pointer) + + +PIO_STATUS_BLOCK = POINTER(IO_STATUS_BLOCK) + +# --- ntdll.dll ---------------------------------------------------------------- + + +# ULONG WINAPI RtlNtStatusToDosError( +# __in NTSTATUS Status +# ); +def RtlNtStatusToDosError(Status): + _RtlNtStatusToDosError = windll.ntdll.RtlNtStatusToDosError + _RtlNtStatusToDosError.argtypes = [NTSTATUS] + _RtlNtStatusToDosError.restype = ULONG + return _RtlNtStatusToDosError(Status) + + +# NTSYSAPI NTSTATUS NTAPI NtSystemDebugControl( +# IN SYSDBG_COMMAND Command, +# IN PVOID InputBuffer OPTIONAL, +# IN ULONG InputBufferLength, +# OUT PVOID OutputBuffer OPTIONAL, +# IN ULONG OutputBufferLength, +# OUT PULONG ReturnLength OPTIONAL +# ); +def NtSystemDebugControl(Command, InputBuffer=None, InputBufferLength=None, OutputBuffer=None, OutputBufferLength=None): + _NtSystemDebugControl = windll.ntdll.NtSystemDebugControl + _NtSystemDebugControl.argtypes = [SYSDBG_COMMAND, PVOID, ULONG, PVOID, ULONG, PULONG] + _NtSystemDebugControl.restype = NTSTATUS + + # Validate the input buffer + if InputBuffer is None: + if InputBufferLength is None: + InputBufferLength = 0 + else: + raise ValueError("Invalid call to NtSystemDebugControl: " "input buffer length given but no input buffer!") + else: + if InputBufferLength is None: + InputBufferLength = sizeof(InputBuffer) + InputBuffer = byref(InputBuffer) + + # Validate the output buffer + if OutputBuffer is None: + if OutputBufferLength is None: + OutputBufferLength = 0 + else: + OutputBuffer = ctypes.create_string_buffer("", OutputBufferLength) + elif OutputBufferLength is None: + OutputBufferLength = sizeof(OutputBuffer) + + # Make the call (with an output buffer) + if OutputBuffer is not None: + ReturnLength = ULONG(0) + ntstatus = _NtSystemDebugControl( + Command, InputBuffer, InputBufferLength, byref(OutputBuffer), OutputBufferLength, byref(ReturnLength) + ) + if ntstatus != 0: + raise ctypes.WinError(RtlNtStatusToDosError(ntstatus)) + ReturnLength = ReturnLength.value + if ReturnLength != OutputBufferLength: + raise ctypes.WinError(ERROR_BAD_LENGTH) + return OutputBuffer, ReturnLength + + # Make the call (without an output buffer) + ntstatus = _NtSystemDebugControl(Command, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, None) + if ntstatus != 0: + raise ctypes.WinError(RtlNtStatusToDosError(ntstatus)) + + +ZwSystemDebugControl = NtSystemDebugControl + + +# NTSTATUS WINAPI NtQueryInformationProcess( +# __in HANDLE ProcessHandle, +# __in PROCESSINFOCLASS ProcessInformationClass, +# __out PVOID ProcessInformation, +# __in ULONG ProcessInformationLength, +# __out_opt PULONG ReturnLength +# ); +def NtQueryInformationProcess(ProcessHandle, ProcessInformationClass, ProcessInformationLength=None): + _NtQueryInformationProcess = windll.ntdll.NtQueryInformationProcess + _NtQueryInformationProcess.argtypes = [HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG] + _NtQueryInformationProcess.restype = NTSTATUS + if ProcessInformationLength is not None: + ProcessInformation = ctypes.create_string_buffer("", ProcessInformationLength) + else: + if ProcessInformationClass == ProcessBasicInformation: + ProcessInformation = PROCESS_BASIC_INFORMATION() + ProcessInformationLength = sizeof(PROCESS_BASIC_INFORMATION) + elif ProcessInformationClass == ProcessImageFileName: + unicode_buffer = ctypes.create_unicode_buffer("", 0x1000) + ProcessInformation = UNICODE_STRING(0, 0x1000, addressof(unicode_buffer)) + ProcessInformationLength = sizeof(UNICODE_STRING) + elif ProcessInformationClass in ( + ProcessDebugPort, + ProcessWow64Information, + ProcessWx86Information, + ProcessHandleCount, + ProcessPriorityBoost, + ): + ProcessInformation = DWORD() + ProcessInformationLength = sizeof(DWORD) + else: + raise Exception("Unknown ProcessInformationClass, use an explicit ProcessInformationLength value instead") + ReturnLength = ULONG(0) + ntstatus = _NtQueryInformationProcess( + ProcessHandle, ProcessInformationClass, byref(ProcessInformation), ProcessInformationLength, byref(ReturnLength) + ) + if ntstatus != 0: + raise ctypes.WinError(RtlNtStatusToDosError(ntstatus)) + if ProcessInformationClass == ProcessBasicInformation: + retval = ProcessInformation + elif ProcessInformationClass in ( + ProcessDebugPort, + ProcessWow64Information, + ProcessWx86Information, + ProcessHandleCount, + ProcessPriorityBoost, + ): + retval = ProcessInformation.value + elif ProcessInformationClass == ProcessImageFileName: + vptr = ctypes.c_void_p(ProcessInformation.Buffer) + cptr = ctypes.cast(vptr, ctypes.c_wchar * ProcessInformation.Length) + retval = cptr.contents.raw + else: + retval = ProcessInformation.raw[: ReturnLength.value] + return retval + + +ZwQueryInformationProcess = NtQueryInformationProcess + + +# NTSTATUS WINAPI NtQueryInformationThread( +# __in HANDLE ThreadHandle, +# __in THREADINFOCLASS ThreadInformationClass, +# __out PVOID ThreadInformation, +# __in ULONG ThreadInformationLength, +# __out_opt PULONG ReturnLength +# ); +def NtQueryInformationThread(ThreadHandle, ThreadInformationClass, ThreadInformationLength=None): + _NtQueryInformationThread = windll.ntdll.NtQueryInformationThread + _NtQueryInformationThread.argtypes = [HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG] + _NtQueryInformationThread.restype = NTSTATUS + if ThreadInformationLength is not None: + ThreadInformation = ctypes.create_string_buffer("", ThreadInformationLength) + else: + if ThreadInformationClass == ThreadBasicInformation: + ThreadInformation = THREAD_BASIC_INFORMATION() + elif ThreadInformationClass == ThreadHideFromDebugger: + ThreadInformation = BOOLEAN() + elif ThreadInformationClass == ThreadQuerySetWin32StartAddress: + ThreadInformation = PVOID() + elif ThreadInformationClass in (ThreadAmILastThread, ThreadPriorityBoost): + ThreadInformation = DWORD() + elif ThreadInformationClass == ThreadPerformanceCount: + ThreadInformation = LONGLONG() # LARGE_INTEGER + else: + raise Exception("Unknown ThreadInformationClass, use an explicit ThreadInformationLength value instead") + ThreadInformationLength = sizeof(ThreadInformation) + ReturnLength = ULONG(0) + ntstatus = _NtQueryInformationThread( + ThreadHandle, ThreadInformationClass, byref(ThreadInformation), ThreadInformationLength, byref(ReturnLength) + ) + if ntstatus != 0: + raise ctypes.WinError(RtlNtStatusToDosError(ntstatus)) + if ThreadInformationClass == ThreadBasicInformation: + retval = ThreadInformation + elif ThreadInformationClass == ThreadHideFromDebugger: + retval = bool(ThreadInformation.value) + elif ThreadInformationClass in (ThreadQuerySetWin32StartAddress, ThreadAmILastThread, ThreadPriorityBoost, ThreadPerformanceCount): + retval = ThreadInformation.value + else: + retval = ThreadInformation.raw[: ReturnLength.value] + return retval + + +ZwQueryInformationThread = NtQueryInformationThread + + +# NTSTATUS +# NtQueryInformationFile( +# IN HANDLE FileHandle, +# OUT PIO_STATUS_BLOCK IoStatusBlock, +# OUT PVOID FileInformation, +# IN ULONG Length, +# IN FILE_INFORMATION_CLASS FileInformationClass +# ); +def NtQueryInformationFile(FileHandle, FileInformationClass, FileInformation, Length): + _NtQueryInformationFile = windll.ntdll.NtQueryInformationFile + _NtQueryInformationFile.argtypes = [HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, DWORD] + _NtQueryInformationFile.restype = NTSTATUS + IoStatusBlock = IO_STATUS_BLOCK() + ntstatus = _NtQueryInformationFile(FileHandle, byref(IoStatusBlock), byref(FileInformation), Length, FileInformationClass) + if ntstatus != 0: + raise ctypes.WinError(RtlNtStatusToDosError(ntstatus)) + return IoStatusBlock + + +ZwQueryInformationFile = NtQueryInformationFile + + +# DWORD STDCALL CsrGetProcessId (VOID); +def CsrGetProcessId(): + _CsrGetProcessId = windll.ntdll.CsrGetProcessId + _CsrGetProcessId.argtypes = [] + _CsrGetProcessId.restype = DWORD + return _CsrGetProcessId() + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/peb_teb.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/peb_teb.py new file mode 100644 index 0000000..9ae4660 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/peb_teb.py @@ -0,0 +1,3517 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +PEB and TEB structures, constants and data types. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.version import os + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- PEB and TEB structures, constants and data types ------------------------- + + +# From http://www.nirsoft.net/kernel_struct/vista/CLIENT_ID.html +# +# typedef struct _CLIENT_ID +# { +# PVOID UniqueProcess; +# PVOID UniqueThread; +# } CLIENT_ID, *PCLIENT_ID; +class CLIENT_ID(Structure): + _fields_ = [ + ("UniqueProcess", PVOID), + ("UniqueThread", PVOID), + ] + + +# From MSDN: +# +# typedef struct _LDR_DATA_TABLE_ENTRY { +# BYTE Reserved1[2]; +# LIST_ENTRY InMemoryOrderLinks; +# PVOID Reserved2[2]; +# PVOID DllBase; +# PVOID EntryPoint; +# PVOID Reserved3; +# UNICODE_STRING FullDllName; +# BYTE Reserved4[8]; +# PVOID Reserved5[3]; +# union { +# ULONG CheckSum; +# PVOID Reserved6; +# }; +# ULONG TimeDateStamp; +# } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; +##class LDR_DATA_TABLE_ENTRY(Structure): +## _fields_ = [ +## ("Reserved1", BYTE * 2), +## ("InMemoryOrderLinks", LIST_ENTRY), +## ("Reserved2", PVOID * 2), +## ("DllBase", PVOID), +## ("EntryPoint", PVOID), +## ("Reserved3", PVOID), +## ("FullDllName", UNICODE_STRING), +## ("Reserved4", BYTE * 8), +## ("Reserved5", PVOID * 3), +## ("CheckSum", ULONG), +## ("TimeDateStamp", ULONG), +##] + +# From MSDN: +# +# typedef struct _PEB_LDR_DATA { +# BYTE Reserved1[8]; +# PVOID Reserved2[3]; +# LIST_ENTRY InMemoryOrderModuleList; +# } PEB_LDR_DATA, +# *PPEB_LDR_DATA; +##class PEB_LDR_DATA(Structure): +## _fields_ = [ +## ("Reserved1", BYTE), +## ("Reserved2", PVOID), +## ("InMemoryOrderModuleList", LIST_ENTRY), +##] + +# From http://undocumented.ntinternals.net/UserMode/Structures/RTL_USER_PROCESS_PARAMETERS.html +# typedef struct _RTL_USER_PROCESS_PARAMETERS { +# ULONG MaximumLength; +# ULONG Length; +# ULONG Flags; +# ULONG DebugFlags; +# PVOID ConsoleHandle; +# ULONG ConsoleFlags; +# HANDLE StdInputHandle; +# HANDLE StdOutputHandle; +# HANDLE StdErrorHandle; +# UNICODE_STRING CurrentDirectoryPath; +# HANDLE CurrentDirectoryHandle; +# UNICODE_STRING DllPath; +# UNICODE_STRING ImagePathName; +# UNICODE_STRING CommandLine; +# PVOID Environment; +# ULONG StartingPositionLeft; +# ULONG StartingPositionTop; +# ULONG Width; +# ULONG Height; +# ULONG CharWidth; +# ULONG CharHeight; +# ULONG ConsoleTextAttributes; +# ULONG WindowFlags; +# ULONG ShowWindowFlags; +# UNICODE_STRING WindowTitle; +# UNICODE_STRING DesktopName; +# UNICODE_STRING ShellInfo; +# UNICODE_STRING RuntimeData; +# RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20]; +# } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; + +# kd> dt _RTL_USER_PROCESS_PARAMETERS +# ntdll!_RTL_USER_PROCESS_PARAMETERS +# +0x000 MaximumLength : Uint4B +# +0x004 Length : Uint4B +# +0x008 Flags : Uint4B +# +0x00c DebugFlags : Uint4B +# +0x010 ConsoleHandle : Ptr32 Void +# +0x014 ConsoleFlags : Uint4B +# +0x018 StandardInput : Ptr32 Void +# +0x01c StandardOutput : Ptr32 Void +# +0x020 StandardError : Ptr32 Void +# +0x024 CurrentDirectory : _CURDIR +# +0x030 DllPath : _UNICODE_STRING +# +0x038 ImagePathName : _UNICODE_STRING +# +0x040 CommandLine : _UNICODE_STRING +# +0x048 Environment : Ptr32 Void +# +0x04c StartingX : Uint4B +# +0x050 StartingY : Uint4B +# +0x054 CountX : Uint4B +# +0x058 CountY : Uint4B +# +0x05c CountCharsX : Uint4B +# +0x060 CountCharsY : Uint4B +# +0x064 FillAttribute : Uint4B +# +0x068 WindowFlags : Uint4B +# +0x06c ShowWindowFlags : Uint4B +# +0x070 WindowTitle : _UNICODE_STRING +# +0x078 DesktopInfo : _UNICODE_STRING +# +0x080 ShellInfo : _UNICODE_STRING +# +0x088 RuntimeData : _UNICODE_STRING +# +0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR +# +0x290 EnvironmentSize : Uint4B +##class RTL_USER_PROCESS_PARAMETERS(Structure): +## _fields_ = [ +## ("MaximumLength", ULONG), +## ("Length", ULONG), +## ("Flags", ULONG), +## ("DebugFlags", ULONG), +## ("ConsoleHandle", PVOID), +## ("ConsoleFlags", ULONG), +## ("StandardInput", HANDLE), +## ("StandardOutput", HANDLE), +## ("StandardError", HANDLE), +## ("CurrentDirectory", CURDIR), +## ("DllPath", UNICODE_STRING), +## ("ImagePathName", UNICODE_STRING), +## ("CommandLine", UNICODE_STRING), +## ("Environment", PVOID), +## ("StartingX", ULONG), +## ("StartingY", ULONG), +## ("CountX", ULONG), +## ("CountY", ULONG), +## ("CountCharsX", ULONG), +## ("CountCharsY", ULONG), +## ("FillAttribute", ULONG), +## ("WindowFlags", ULONG), +## ("ShowWindowFlags", ULONG), +## ("WindowTitle", UNICODE_STRING), +## ("DesktopInfo", UNICODE_STRING), +## ("ShellInfo", UNICODE_STRING), +## ("RuntimeData", UNICODE_STRING), +## ("CurrentDirectores", RTL_DRIVE_LETTER_CURDIR * 32), # typo here? +## +## # Windows 2008 and Vista +## ("EnvironmentSize", ULONG), +##] +## @property +## def CurrentDirectories(self): +## return self.CurrentDirectores + + +# From MSDN: +# +# typedef struct _RTL_USER_PROCESS_PARAMETERS { +# BYTE Reserved1[16]; +# PVOID Reserved2[10]; +# UNICODE_STRING ImagePathName; +# UNICODE_STRING CommandLine; +# } RTL_USER_PROCESS_PARAMETERS, +# *PRTL_USER_PROCESS_PARAMETERS; +class RTL_USER_PROCESS_PARAMETERS(Structure): + _fields_ = [ + ("Reserved1", BYTE * 16), + ("Reserved2", PVOID * 10), + ("ImagePathName", UNICODE_STRING), + ("CommandLine", UNICODE_STRING), + ("Environment", PVOID), # undocumented! + # + # XXX TODO + # This structure should be defined with all undocumented fields for + # each version of Windows, just like it's being done for PEB and TEB. + # + ] + + +PPS_POST_PROCESS_INIT_ROUTINE = PVOID + +# from MSDN: +# +# typedef struct _PEB { +# BYTE Reserved1[2]; +# BYTE BeingDebugged; +# BYTE Reserved2[21]; +# PPEB_LDR_DATA LoaderData; +# PRTL_USER_PROCESS_PARAMETERS ProcessParameters; +# BYTE Reserved3[520]; +# PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; +# BYTE Reserved4[136]; +# ULONG SessionId; +# } PEB; +##class PEB(Structure): +## _fields_ = [ +## ("Reserved1", BYTE * 2), +## ("BeingDebugged", BYTE), +## ("Reserved2", BYTE * 21), +## ("LoaderData", PVOID, # PPEB_LDR_DATA +## ("ProcessParameters", PVOID, # PRTL_USER_PROCESS_PARAMETERS +## ("Reserved3", BYTE * 520), +## ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), +## ("Reserved4", BYTE), +## ("SessionId", ULONG), +##] + +# from MSDN: +# +# typedef struct _TEB { +# BYTE Reserved1[1952]; +# PVOID Reserved2[412]; +# PVOID TlsSlots[64]; +# BYTE Reserved3[8]; +# PVOID Reserved4[26]; +# PVOID ReservedForOle; +# PVOID Reserved5[4]; +# PVOID TlsExpansionSlots; +# } TEB, +# *PTEB; +##class TEB(Structure): +## _fields_ = [ +## ("Reserved1", PVOID * 1952), +## ("Reserved2", PVOID * 412), +## ("TlsSlots", PVOID * 64), +## ("Reserved3", BYTE * 8), +## ("Reserved4", PVOID * 26), +## ("ReservedForOle", PVOID), +## ("Reserved5", PVOID * 4), +## ("TlsExpansionSlots", PVOID), +##] + + +# from http://undocumented.ntinternals.net/UserMode/Structures/LDR_MODULE.html +# +# typedef struct _LDR_MODULE { +# LIST_ENTRY InLoadOrderModuleList; +# LIST_ENTRY InMemoryOrderModuleList; +# LIST_ENTRY InInitializationOrderModuleList; +# PVOID BaseAddress; +# PVOID EntryPoint; +# ULONG SizeOfImage; +# UNICODE_STRING FullDllName; +# UNICODE_STRING BaseDllName; +# ULONG Flags; +# SHORT LoadCount; +# SHORT TlsIndex; +# LIST_ENTRY HashTableEntry; +# ULONG TimeDateStamp; +# } LDR_MODULE, *PLDR_MODULE; +class LDR_MODULE(Structure): + _fields_ = [ + ("InLoadOrderModuleList", LIST_ENTRY), + ("InMemoryOrderModuleList", LIST_ENTRY), + ("InInitializationOrderModuleList", LIST_ENTRY), + ("BaseAddress", PVOID), + ("EntryPoint", PVOID), + ("SizeOfImage", ULONG), + ("FullDllName", UNICODE_STRING), + ("BaseDllName", UNICODE_STRING), + ("Flags", ULONG), + ("LoadCount", SHORT), + ("TlsIndex", SHORT), + ("HashTableEntry", LIST_ENTRY), + ("TimeDateStamp", ULONG), + ] + + +# from http://undocumented.ntinternals.net/UserMode/Structures/PEB_LDR_DATA.html +# +# typedef struct _PEB_LDR_DATA { +# ULONG Length; +# BOOLEAN Initialized; +# PVOID SsHandle; +# LIST_ENTRY InLoadOrderModuleList; +# LIST_ENTRY InMemoryOrderModuleList; +# LIST_ENTRY InInitializationOrderModuleList; +# } PEB_LDR_DATA, *PPEB_LDR_DATA; +class PEB_LDR_DATA(Structure): + _fields_ = [ + ("Length", ULONG), + ("Initialized", BOOLEAN), + ("SsHandle", PVOID), + ("InLoadOrderModuleList", LIST_ENTRY), + ("InMemoryOrderModuleList", LIST_ENTRY), + ("InInitializationOrderModuleList", LIST_ENTRY), + ] + + +# From http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB_FREE_BLOCK.html +# +# typedef struct _PEB_FREE_BLOCK { +# PEB_FREE_BLOCK *Next; +# ULONG Size; +# } PEB_FREE_BLOCK, *PPEB_FREE_BLOCK; +class PEB_FREE_BLOCK(Structure): + pass + + +##PPEB_FREE_BLOCK = POINTER(PEB_FREE_BLOCK) +PPEB_FREE_BLOCK = PVOID + +PEB_FREE_BLOCK._fields_ = [ + ("Next", PPEB_FREE_BLOCK), + ("Size", ULONG), +] + + +# From http://undocumented.ntinternals.net/UserMode/Structures/RTL_DRIVE_LETTER_CURDIR.html +# +# typedef struct _RTL_DRIVE_LETTER_CURDIR { +# USHORT Flags; +# USHORT Length; +# ULONG TimeStamp; +# UNICODE_STRING DosPath; +# } RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR; +class RTL_DRIVE_LETTER_CURDIR(Structure): + _fields_ = [ + ("Flags", USHORT), + ("Length", USHORT), + ("TimeStamp", ULONG), + ("DosPath", UNICODE_STRING), + ] + + +# From http://www.nirsoft.net/kernel_struct/vista/CURDIR.html +# +# typedef struct _CURDIR +# { +# UNICODE_STRING DosPath; +# PVOID Handle; +# } CURDIR, *PCURDIR; +class CURDIR(Structure): + _fields_ = [ + ("DosPath", UNICODE_STRING), + ("Handle", PVOID), + ] + + +# From http://www.nirsoft.net/kernel_struct/vista/RTL_CRITICAL_SECTION_DEBUG.html +# +# typedef struct _RTL_CRITICAL_SECTION_DEBUG +# { +# WORD Type; +# WORD CreatorBackTraceIndex; +# PRTL_CRITICAL_SECTION CriticalSection; +# LIST_ENTRY ProcessLocksList; +# ULONG EntryCount; +# ULONG ContentionCount; +# ULONG Flags; +# WORD CreatorBackTraceIndexHigh; +# WORD SpareUSHORT; +# } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG; +# +# From http://www.nirsoft.net/kernel_struct/vista/RTL_CRITICAL_SECTION.html +# +# typedef struct _RTL_CRITICAL_SECTION +# { +# PRTL_CRITICAL_SECTION_DEBUG DebugInfo; +# LONG LockCount; +# LONG RecursionCount; +# PVOID OwningThread; +# PVOID LockSemaphore; +# ULONG SpinCount; +# } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; +# +class RTL_CRITICAL_SECTION(Structure): + _fields_ = [ + ("DebugInfo", PVOID), # PRTL_CRITICAL_SECTION_DEBUG + ("LockCount", LONG), + ("RecursionCount", LONG), + ("OwningThread", PVOID), + ("LockSemaphore", PVOID), + ("SpinCount", ULONG), + ] + + +class RTL_CRITICAL_SECTION_DEBUG(Structure): + _fields_ = [ + ("Type", WORD), + ("CreatorBackTraceIndex", WORD), + ("CriticalSection", PVOID), # PRTL_CRITICAL_SECTION + ("ProcessLocksList", LIST_ENTRY), + ("EntryCount", ULONG), + ("ContentionCount", ULONG), + ("Flags", ULONG), + ("CreatorBackTraceIndexHigh", WORD), + ("SpareUSHORT", WORD), + ] + + +PRTL_CRITICAL_SECTION = POINTER(RTL_CRITICAL_SECTION) +PRTL_CRITICAL_SECTION_DEBUG = POINTER(RTL_CRITICAL_SECTION_DEBUG) + +PPEB_LDR_DATA = POINTER(PEB_LDR_DATA) +PRTL_USER_PROCESS_PARAMETERS = POINTER(RTL_USER_PROCESS_PARAMETERS) + +PPEBLOCKROUTINE = PVOID + +# BitField +ImageUsesLargePages = 1 << 0 +IsProtectedProcess = 1 << 1 +IsLegacyProcess = 1 << 2 +IsImageDynamicallyRelocated = 1 << 3 +SkipPatchingUser32Forwarders = 1 << 4 + +# CrossProcessFlags +ProcessInJob = 1 << 0 +ProcessInitializing = 1 << 1 +ProcessUsingVEH = 1 << 2 +ProcessUsingVCH = 1 << 3 +ProcessUsingFTH = 1 << 4 + +# TracingFlags +HeapTracingEnabled = 1 << 0 +CritSecTracingEnabled = 1 << 1 + +# NtGlobalFlags +FLG_VALID_BITS = 0x003FFFFF # not a flag +FLG_STOP_ON_EXCEPTION = 0x00000001 +FLG_SHOW_LDR_SNAPS = 0x00000002 +FLG_DEBUG_INITIAL_COMMAND = 0x00000004 +FLG_STOP_ON_HUNG_GUI = 0x00000008 +FLG_HEAP_ENABLE_TAIL_CHECK = 0x00000010 +FLG_HEAP_ENABLE_FREE_CHECK = 0x00000020 +FLG_HEAP_VALIDATE_PARAMETERS = 0x00000040 +FLG_HEAP_VALIDATE_ALL = 0x00000080 +FLG_POOL_ENABLE_TAIL_CHECK = 0x00000100 +FLG_POOL_ENABLE_FREE_CHECK = 0x00000200 +FLG_POOL_ENABLE_TAGGING = 0x00000400 +FLG_HEAP_ENABLE_TAGGING = 0x00000800 +FLG_USER_STACK_TRACE_DB = 0x00001000 +FLG_KERNEL_STACK_TRACE_DB = 0x00002000 +FLG_MAINTAIN_OBJECT_TYPELIST = 0x00004000 +FLG_HEAP_ENABLE_TAG_BY_DLL = 0x00008000 +FLG_IGNORE_DEBUG_PRIV = 0x00010000 +FLG_ENABLE_CSRDEBUG = 0x00020000 +FLG_ENABLE_KDEBUG_SYMBOL_LOAD = 0x00040000 +FLG_DISABLE_PAGE_KERNEL_STACKS = 0x00080000 +FLG_HEAP_ENABLE_CALL_TRACING = 0x00100000 +FLG_HEAP_DISABLE_COALESCING = 0x00200000 +FLG_ENABLE_CLOSE_EXCEPTION = 0x00400000 +FLG_ENABLE_EXCEPTION_LOGGING = 0x00800000 +FLG_ENABLE_HANDLE_TYPE_TAGGING = 0x01000000 +FLG_HEAP_PAGE_ALLOCS = 0x02000000 +FLG_DEBUG_WINLOGON = 0x04000000 +FLG_ENABLE_DBGPRINT_BUFFERING = 0x08000000 +FLG_EARLY_CRITICAL_SECTION_EVT = 0x10000000 +FLG_DISABLE_DLL_VERIFICATION = 0x80000000 + + +class _PEB_NT(Structure): + _pack_ = 4 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("BitField", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), + ("FastPebLockRoutine", PVOID), # PPEBLOCKROUTINE + ("FastPebUnlockRoutine", PVOID), # PPEBLOCKROUTINE + ("EnvironmentUpdateCount", ULONG), + ("KernelCallbackTable", PVOID), # Ptr32 Ptr32 Void + ("EventLogSection", PVOID), + ("EventLog", PVOID), + ("FreeList", PVOID), # PPEB_FREE_BLOCK + ("TlsExpansionCounter", ULONG), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", ULONG * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("ReadOnlySharedMemoryHeap", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr32 Ptr32 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", ULONG), + ("NtGlobalFlag", ULONG), + ("Spare2", BYTE * 4), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", ULONG), + ("HeapSegmentCommit", ULONG), + ("HeapDeCommitTotalFreeThreshold", ULONG), + ("HeapDeCommitFreeBlockThreshold", ULONG), + ("NumberOfHeaps", ULONG), + ("MaximumNumberOfHeaps", ULONG), + ("ProcessHeaps", PVOID), # Ptr32 Ptr32 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", PVOID), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", ULONG), + ("OSMinorVersion", ULONG), + ("OSBuildNumber", ULONG), + ("OSPlatformId", ULONG), + ("ImageSubSystem", ULONG), + ("ImageSubSystemMajorVersion", ULONG), + ("ImageSubSystemMinorVersion", ULONG), + ("ImageProcessAffinityMask", ULONG), + ("GdiHandleBuffer", ULONG * 34), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", ULONG), + ("TlsExpansionBitmapBits", BYTE * 128), + ("SessionId", ULONG), + ] + + +# not really, but "dt _PEB" in w2k isn't working for me :( +_PEB_2000 = _PEB_NT + + +# +0x000 InheritedAddressSpace : UChar +# +0x001 ReadImageFileExecOptions : UChar +# +0x002 BeingDebugged : UChar +# +0x003 SpareBool : UChar +# +0x004 Mutant : Ptr32 Void +# +0x008 ImageBaseAddress : Ptr32 Void +# +0x00c Ldr : Ptr32 _PEB_LDR_DATA +# +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS +# +0x014 SubSystemData : Ptr32 Void +# +0x018 ProcessHeap : Ptr32 Void +# +0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x020 FastPebLockRoutine : Ptr32 Void +# +0x024 FastPebUnlockRoutine : Ptr32 Void +# +0x028 EnvironmentUpdateCount : Uint4B +# +0x02c KernelCallbackTable : Ptr32 Void +# +0x030 SystemReserved : [1] Uint4B +# +0x034 AtlThunkSListPtr32 : Uint4B +# +0x038 FreeList : Ptr32 _PEB_FREE_BLOCK +# +0x03c TlsExpansionCounter : Uint4B +# +0x040 TlsBitmap : Ptr32 Void +# +0x044 TlsBitmapBits : [2] Uint4B +# +0x04c ReadOnlySharedMemoryBase : Ptr32 Void +# +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void +# +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void +# +0x058 AnsiCodePageData : Ptr32 Void +# +0x05c OemCodePageData : Ptr32 Void +# +0x060 UnicodeCaseTableData : Ptr32 Void +# +0x064 NumberOfProcessors : Uint4B +# +0x068 NtGlobalFlag : Uint4B +# +0x070 CriticalSectionTimeout : _LARGE_INTEGER +# +0x078 HeapSegmentReserve : Uint4B +# +0x07c HeapSegmentCommit : Uint4B +# +0x080 HeapDeCommitTotalFreeThreshold : Uint4B +# +0x084 HeapDeCommitFreeBlockThreshold : Uint4B +# +0x088 NumberOfHeaps : Uint4B +# +0x08c MaximumNumberOfHeaps : Uint4B +# +0x090 ProcessHeaps : Ptr32 Ptr32 Void +# +0x094 GdiSharedHandleTable : Ptr32 Void +# +0x098 ProcessStarterHelper : Ptr32 Void +# +0x09c GdiDCAttributeList : Uint4B +# +0x0a0 LoaderLock : Ptr32 Void +# +0x0a4 OSMajorVersion : Uint4B +# +0x0a8 OSMinorVersion : Uint4B +# +0x0ac OSBuildNumber : Uint2B +# +0x0ae OSCSDVersion : Uint2B +# +0x0b0 OSPlatformId : Uint4B +# +0x0b4 ImageSubsystem : Uint4B +# +0x0b8 ImageSubsystemMajorVersion : Uint4B +# +0x0bc ImageSubsystemMinorVersion : Uint4B +# +0x0c0 ImageProcessAffinityMask : Uint4B +# +0x0c4 GdiHandleBuffer : [34] Uint4B +# +0x14c PostProcessInitRoutine : Ptr32 void +# +0x150 TlsExpansionBitmap : Ptr32 Void +# +0x154 TlsExpansionBitmapBits : [32] Uint4B +# +0x1d4 SessionId : Uint4B +# +0x1d8 AppCompatFlags : _ULARGE_INTEGER +# +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER +# +0x1e8 pShimData : Ptr32 Void +# +0x1ec AppCompatInfo : Ptr32 Void +# +0x1f0 CSDVersion : _UNICODE_STRING +# +0x1f8 ActivationContextData : Ptr32 Void +# +0x1fc ProcessAssemblyStorageMap : Ptr32 Void +# +0x200 SystemDefaultActivationContextData : Ptr32 Void +# +0x204 SystemAssemblyStorageMap : Ptr32 Void +# +0x208 MinimumStackCommit : Uint4B +class _PEB_XP(Structure): + _pack_ = 8 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("SpareBool", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), + ("FastPebLockRoutine", PVOID), + ("FastPebUnlockRoutine", PVOID), + ("EnvironmentUpdateCount", DWORD), + ("KernelCallbackTable", PVOID), + ("SystemReserved", DWORD), + ("AtlThunkSListPtr32", DWORD), + ("FreeList", PVOID), # PPEB_FREE_BLOCK + ("TlsExpansionCounter", DWORD), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", DWORD * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("ReadOnlySharedMemoryHeap", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr32 Ptr32 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", DWORD), + ("NtGlobalFlag", DWORD), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", DWORD), + ("HeapSegmentCommit", DWORD), + ("HeapDeCommitTotalFreeThreshold", DWORD), + ("HeapDeCommitFreeBlockThreshold", DWORD), + ("NumberOfHeaps", DWORD), + ("MaximumNumberOfHeaps", DWORD), + ("ProcessHeaps", PVOID), # Ptr32 Ptr32 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", DWORD), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", DWORD), + ("OSMinorVersion", DWORD), + ("OSBuildNumber", WORD), + ("OSCSDVersion", WORD), + ("OSPlatformId", DWORD), + ("ImageSubsystem", DWORD), + ("ImageSubsystemMajorVersion", DWORD), + ("ImageSubsystemMinorVersion", DWORD), + ("ImageProcessAffinityMask", DWORD), + ("GdiHandleBuffer", DWORD * 34), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", PVOID), + ("TlsExpansionBitmapBits", DWORD * 32), + ("SessionId", DWORD), + ("AppCompatFlags", ULONGLONG), # ULARGE_INTEGER + ("AppCompatFlagsUser", ULONGLONG), # ULARGE_INTEGER + ("pShimData", PVOID), + ("AppCompatInfo", PVOID), + ("CSDVersion", UNICODE_STRING), + ("ActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("ProcessAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("SystemDefaultActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("SystemAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("MinimumStackCommit", DWORD), + ] + + +# +0x000 InheritedAddressSpace : UChar +# +0x001 ReadImageFileExecOptions : UChar +# +0x002 BeingDebugged : UChar +# +0x003 BitField : UChar +# +0x003 ImageUsesLargePages : Pos 0, 1 Bit +# +0x003 SpareBits : Pos 1, 7 Bits +# +0x008 Mutant : Ptr64 Void +# +0x010 ImageBaseAddress : Ptr64 Void +# +0x018 Ldr : Ptr64 _PEB_LDR_DATA +# +0x020 ProcessParameters : Ptr64 _RTL_USER_PROCESS_PARAMETERS +# +0x028 SubSystemData : Ptr64 Void +# +0x030 ProcessHeap : Ptr64 Void +# +0x038 FastPebLock : Ptr64 _RTL_CRITICAL_SECTION +# +0x040 AtlThunkSListPtr : Ptr64 Void +# +0x048 SparePtr2 : Ptr64 Void +# +0x050 EnvironmentUpdateCount : Uint4B +# +0x058 KernelCallbackTable : Ptr64 Void +# +0x060 SystemReserved : [1] Uint4B +# +0x064 SpareUlong : Uint4B +# +0x068 FreeList : Ptr64 _PEB_FREE_BLOCK +# +0x070 TlsExpansionCounter : Uint4B +# +0x078 TlsBitmap : Ptr64 Void +# +0x080 TlsBitmapBits : [2] Uint4B +# +0x088 ReadOnlySharedMemoryBase : Ptr64 Void +# +0x090 ReadOnlySharedMemoryHeap : Ptr64 Void +# +0x098 ReadOnlyStaticServerData : Ptr64 Ptr64 Void +# +0x0a0 AnsiCodePageData : Ptr64 Void +# +0x0a8 OemCodePageData : Ptr64 Void +# +0x0b0 UnicodeCaseTableData : Ptr64 Void +# +0x0b8 NumberOfProcessors : Uint4B +# +0x0bc NtGlobalFlag : Uint4B +# +0x0c0 CriticalSectionTimeout : _LARGE_INTEGER +# +0x0c8 HeapSegmentReserve : Uint8B +# +0x0d0 HeapSegmentCommit : Uint8B +# +0x0d8 HeapDeCommitTotalFreeThreshold : Uint8B +# +0x0e0 HeapDeCommitFreeBlockThreshold : Uint8B +# +0x0e8 NumberOfHeaps : Uint4B +# +0x0ec MaximumNumberOfHeaps : Uint4B +# +0x0f0 ProcessHeaps : Ptr64 Ptr64 Void +# +0x0f8 GdiSharedHandleTable : Ptr64 Void +# +0x100 ProcessStarterHelper : Ptr64 Void +# +0x108 GdiDCAttributeList : Uint4B +# +0x110 LoaderLock : Ptr64 _RTL_CRITICAL_SECTION +# +0x118 OSMajorVersion : Uint4B +# +0x11c OSMinorVersion : Uint4B +# +0x120 OSBuildNumber : Uint2B +# +0x122 OSCSDVersion : Uint2B +# +0x124 OSPlatformId : Uint4B +# +0x128 ImageSubsystem : Uint4B +# +0x12c ImageSubsystemMajorVersion : Uint4B +# +0x130 ImageSubsystemMinorVersion : Uint4B +# +0x138 ImageProcessAffinityMask : Uint8B +# +0x140 GdiHandleBuffer : [60] Uint4B +# +0x230 PostProcessInitRoutine : Ptr64 void +# +0x238 TlsExpansionBitmap : Ptr64 Void +# +0x240 TlsExpansionBitmapBits : [32] Uint4B +# +0x2c0 SessionId : Uint4B +# +0x2c8 AppCompatFlags : _ULARGE_INTEGER +# +0x2d0 AppCompatFlagsUser : _ULARGE_INTEGER +# +0x2d8 pShimData : Ptr64 Void +# +0x2e0 AppCompatInfo : Ptr64 Void +# +0x2e8 CSDVersion : _UNICODE_STRING +# +0x2f8 ActivationContextData : Ptr64 _ACTIVATION_CONTEXT_DATA +# +0x300 ProcessAssemblyStorageMap : Ptr64 _ASSEMBLY_STORAGE_MAP +# +0x308 SystemDefaultActivationContextData : Ptr64 _ACTIVATION_CONTEXT_DATA +# +0x310 SystemAssemblyStorageMap : Ptr64 _ASSEMBLY_STORAGE_MAP +# +0x318 MinimumStackCommit : Uint8B +# +0x320 FlsCallback : Ptr64 Ptr64 Void +# +0x328 FlsListHead : _LIST_ENTRY +# +0x338 FlsBitmap : Ptr64 Void +# +0x340 FlsBitmapBits : [4] Uint4B +# +0x350 FlsHighIndex : Uint4B +class _PEB_XP_64(Structure): + _pack_ = 8 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("BitField", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), # PRTL_CRITICAL_SECTION + ("AtlThunkSListPtr", PVOID), + ("SparePtr2", PVOID), + ("EnvironmentUpdateCount", DWORD), + ("KernelCallbackTable", PVOID), + ("SystemReserved", DWORD), + ("SpareUlong", DWORD), + ("FreeList", PVOID), # PPEB_FREE_BLOCK + ("TlsExpansionCounter", DWORD), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", DWORD * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("ReadOnlySharedMemoryHeap", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr64 Ptr64 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", DWORD), + ("NtGlobalFlag", DWORD), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", QWORD), + ("HeapSegmentCommit", QWORD), + ("HeapDeCommitTotalFreeThreshold", QWORD), + ("HeapDeCommitFreeBlockThreshold", QWORD), + ("NumberOfHeaps", DWORD), + ("MaximumNumberOfHeaps", DWORD), + ("ProcessHeaps", PVOID), # Ptr64 Ptr64 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", DWORD), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", DWORD), + ("OSMinorVersion", DWORD), + ("OSBuildNumber", WORD), + ("OSCSDVersion", WORD), + ("OSPlatformId", DWORD), + ("ImageSubsystem", DWORD), + ("ImageSubsystemMajorVersion", DWORD), + ("ImageSubsystemMinorVersion", DWORD), + ("ImageProcessAffinityMask", QWORD), + ("GdiHandleBuffer", DWORD * 60), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", PVOID), + ("TlsExpansionBitmapBits", DWORD * 32), + ("SessionId", DWORD), + ("AppCompatFlags", ULONGLONG), # ULARGE_INTEGER + ("AppCompatFlagsUser", ULONGLONG), # ULARGE_INTEGER + ("pShimData", PVOID), + ("AppCompatInfo", PVOID), + ("CSDVersion", UNICODE_STRING), + ("ActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("ProcessAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("SystemDefaultActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("SystemAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("MinimumStackCommit", QWORD), + ("FlsCallback", PVOID), # Ptr64 Ptr64 Void + ("FlsListHead", LIST_ENTRY), + ("FlsBitmap", PVOID), + ("FlsBitmapBits", DWORD * 4), + ("FlsHighIndex", DWORD), + ] + + +# +0x000 InheritedAddressSpace : UChar +# +0x001 ReadImageFileExecOptions : UChar +# +0x002 BeingDebugged : UChar +# +0x003 BitField : UChar +# +0x003 ImageUsesLargePages : Pos 0, 1 Bit +# +0x003 SpareBits : Pos 1, 7 Bits +# +0x004 Mutant : Ptr32 Void +# +0x008 ImageBaseAddress : Ptr32 Void +# +0x00c Ldr : Ptr32 _PEB_LDR_DATA +# +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS +# +0x014 SubSystemData : Ptr32 Void +# +0x018 ProcessHeap : Ptr32 Void +# +0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x020 AtlThunkSListPtr : Ptr32 Void +# +0x024 SparePtr2 : Ptr32 Void +# +0x028 EnvironmentUpdateCount : Uint4B +# +0x02c KernelCallbackTable : Ptr32 Void +# +0x030 SystemReserved : [1] Uint4B +# +0x034 SpareUlong : Uint4B +# +0x038 FreeList : Ptr32 _PEB_FREE_BLOCK +# +0x03c TlsExpansionCounter : Uint4B +# +0x040 TlsBitmap : Ptr32 Void +# +0x044 TlsBitmapBits : [2] Uint4B +# +0x04c ReadOnlySharedMemoryBase : Ptr32 Void +# +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void +# +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void +# +0x058 AnsiCodePageData : Ptr32 Void +# +0x05c OemCodePageData : Ptr32 Void +# +0x060 UnicodeCaseTableData : Ptr32 Void +# +0x064 NumberOfProcessors : Uint4B +# +0x068 NtGlobalFlag : Uint4B +# +0x070 CriticalSectionTimeout : _LARGE_INTEGER +# +0x078 HeapSegmentReserve : Uint4B +# +0x07c HeapSegmentCommit : Uint4B +# +0x080 HeapDeCommitTotalFreeThreshold : Uint4B +# +0x084 HeapDeCommitFreeBlockThreshold : Uint4B +# +0x088 NumberOfHeaps : Uint4B +# +0x08c MaximumNumberOfHeaps : Uint4B +# +0x090 ProcessHeaps : Ptr32 Ptr32 Void +# +0x094 GdiSharedHandleTable : Ptr32 Void +# +0x098 ProcessStarterHelper : Ptr32 Void +# +0x09c GdiDCAttributeList : Uint4B +# +0x0a0 LoaderLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x0a4 OSMajorVersion : Uint4B +# +0x0a8 OSMinorVersion : Uint4B +# +0x0ac OSBuildNumber : Uint2B +# +0x0ae OSCSDVersion : Uint2B +# +0x0b0 OSPlatformId : Uint4B +# +0x0b4 ImageSubsystem : Uint4B +# +0x0b8 ImageSubsystemMajorVersion : Uint4B +# +0x0bc ImageSubsystemMinorVersion : Uint4B +# +0x0c0 ImageProcessAffinityMask : Uint4B +# +0x0c4 GdiHandleBuffer : [34] Uint4B +# +0x14c PostProcessInitRoutine : Ptr32 void +# +0x150 TlsExpansionBitmap : Ptr32 Void +# +0x154 TlsExpansionBitmapBits : [32] Uint4B +# +0x1d4 SessionId : Uint4B +# +0x1d8 AppCompatFlags : _ULARGE_INTEGER +# +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER +# +0x1e8 pShimData : Ptr32 Void +# +0x1ec AppCompatInfo : Ptr32 Void +# +0x1f0 CSDVersion : _UNICODE_STRING +# +0x1f8 ActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA +# +0x1fc ProcessAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP +# +0x200 SystemDefaultActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA +# +0x204 SystemAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP +# +0x208 MinimumStackCommit : Uint4B +# +0x20c FlsCallback : Ptr32 Ptr32 Void +# +0x210 FlsListHead : _LIST_ENTRY +# +0x218 FlsBitmap : Ptr32 Void +# +0x21c FlsBitmapBits : [4] Uint4B +# +0x22c FlsHighIndex : Uint4B +class _PEB_2003(Structure): + _pack_ = 8 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("BitField", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), # PRTL_CRITICAL_SECTION + ("AtlThunkSListPtr", PVOID), + ("SparePtr2", PVOID), + ("EnvironmentUpdateCount", DWORD), + ("KernelCallbackTable", PVOID), + ("SystemReserved", DWORD), + ("SpareUlong", DWORD), + ("FreeList", PVOID), # PPEB_FREE_BLOCK + ("TlsExpansionCounter", DWORD), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", DWORD * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("ReadOnlySharedMemoryHeap", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr32 Ptr32 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", DWORD), + ("NtGlobalFlag", DWORD), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", DWORD), + ("HeapSegmentCommit", DWORD), + ("HeapDeCommitTotalFreeThreshold", DWORD), + ("HeapDeCommitFreeBlockThreshold", DWORD), + ("NumberOfHeaps", DWORD), + ("MaximumNumberOfHeaps", DWORD), + ("ProcessHeaps", PVOID), # Ptr32 Ptr32 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", DWORD), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", DWORD), + ("OSMinorVersion", DWORD), + ("OSBuildNumber", WORD), + ("OSCSDVersion", WORD), + ("OSPlatformId", DWORD), + ("ImageSubsystem", DWORD), + ("ImageSubsystemMajorVersion", DWORD), + ("ImageSubsystemMinorVersion", DWORD), + ("ImageProcessAffinityMask", DWORD), + ("GdiHandleBuffer", DWORD * 34), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", PVOID), + ("TlsExpansionBitmapBits", DWORD * 32), + ("SessionId", DWORD), + ("AppCompatFlags", ULONGLONG), # ULARGE_INTEGER + ("AppCompatFlagsUser", ULONGLONG), # ULARGE_INTEGER + ("pShimData", PVOID), + ("AppCompatInfo", PVOID), + ("CSDVersion", UNICODE_STRING), + ("ActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("ProcessAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("SystemDefaultActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("SystemAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("MinimumStackCommit", QWORD), + ("FlsCallback", PVOID), # Ptr32 Ptr32 Void + ("FlsListHead", LIST_ENTRY), + ("FlsBitmap", PVOID), + ("FlsBitmapBits", DWORD * 4), + ("FlsHighIndex", DWORD), + ] + + +_PEB_2003_64 = _PEB_XP_64 +_PEB_2003_R2 = _PEB_2003 +_PEB_2003_R2_64 = _PEB_2003_64 + + +# +0x000 InheritedAddressSpace : UChar +# +0x001 ReadImageFileExecOptions : UChar +# +0x002 BeingDebugged : UChar +# +0x003 BitField : UChar +# +0x003 ImageUsesLargePages : Pos 0, 1 Bit +# +0x003 IsProtectedProcess : Pos 1, 1 Bit +# +0x003 IsLegacyProcess : Pos 2, 1 Bit +# +0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit +# +0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit +# +0x003 SpareBits : Pos 5, 3 Bits +# +0x004 Mutant : Ptr32 Void +# +0x008 ImageBaseAddress : Ptr32 Void +# +0x00c Ldr : Ptr32 _PEB_LDR_DATA +# +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS +# +0x014 SubSystemData : Ptr32 Void +# +0x018 ProcessHeap : Ptr32 Void +# +0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x020 AtlThunkSListPtr : Ptr32 Void +# +0x024 IFEOKey : Ptr32 Void +# +0x028 CrossProcessFlags : Uint4B +# +0x028 ProcessInJob : Pos 0, 1 Bit +# +0x028 ProcessInitializing : Pos 1, 1 Bit +# +0x028 ProcessUsingVEH : Pos 2, 1 Bit +# +0x028 ProcessUsingVCH : Pos 3, 1 Bit +# +0x028 ReservedBits0 : Pos 4, 28 Bits +# +0x02c KernelCallbackTable : Ptr32 Void +# +0x02c UserSharedInfoPtr : Ptr32 Void +# +0x030 SystemReserved : [1] Uint4B +# +0x034 SpareUlong : Uint4B +# +0x038 SparePebPtr0 : Uint4B +# +0x03c TlsExpansionCounter : Uint4B +# +0x040 TlsBitmap : Ptr32 Void +# +0x044 TlsBitmapBits : [2] Uint4B +# +0x04c ReadOnlySharedMemoryBase : Ptr32 Void +# +0x050 HotpatchInformation : Ptr32 Void +# +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void +# +0x058 AnsiCodePageData : Ptr32 Void +# +0x05c OemCodePageData : Ptr32 Void +# +0x060 UnicodeCaseTableData : Ptr32 Void +# +0x064 NumberOfProcessors : Uint4B +# +0x068 NtGlobalFlag : Uint4B +# +0x070 CriticalSectionTimeout : _LARGE_INTEGER +# +0x078 HeapSegmentReserve : Uint4B +# +0x07c HeapSegmentCommit : Uint4B +# +0x080 HeapDeCommitTotalFreeThreshold : Uint4B +# +0x084 HeapDeCommitFreeBlockThreshold : Uint4B +# +0x088 NumberOfHeaps : Uint4B +# +0x08c MaximumNumberOfHeaps : Uint4B +# +0x090 ProcessHeaps : Ptr32 Ptr32 Void +# +0x094 GdiSharedHandleTable : Ptr32 Void +# +0x098 ProcessStarterHelper : Ptr32 Void +# +0x09c GdiDCAttributeList : Uint4B +# +0x0a0 LoaderLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x0a4 OSMajorVersion : Uint4B +# +0x0a8 OSMinorVersion : Uint4B +# +0x0ac OSBuildNumber : Uint2B +# +0x0ae OSCSDVersion : Uint2B +# +0x0b0 OSPlatformId : Uint4B +# +0x0b4 ImageSubsystem : Uint4B +# +0x0b8 ImageSubsystemMajorVersion : Uint4B +# +0x0bc ImageSubsystemMinorVersion : Uint4B +# +0x0c0 ActiveProcessAffinityMask : Uint4B +# +0x0c4 GdiHandleBuffer : [34] Uint4B +# +0x14c PostProcessInitRoutine : Ptr32 void +# +0x150 TlsExpansionBitmap : Ptr32 Void +# +0x154 TlsExpansionBitmapBits : [32] Uint4B +# +0x1d4 SessionId : Uint4B +# +0x1d8 AppCompatFlags : _ULARGE_INTEGER +# +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER +# +0x1e8 pShimData : Ptr32 Void +# +0x1ec AppCompatInfo : Ptr32 Void +# +0x1f0 CSDVersion : _UNICODE_STRING +# +0x1f8 ActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA +# +0x1fc ProcessAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP +# +0x200 SystemDefaultActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA +# +0x204 SystemAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP +# +0x208 MinimumStackCommit : Uint4B +# +0x20c FlsCallback : Ptr32 _FLS_CALLBACK_INFO +# +0x210 FlsListHead : _LIST_ENTRY +# +0x218 FlsBitmap : Ptr32 Void +# +0x21c FlsBitmapBits : [4] Uint4B +# +0x22c FlsHighIndex : Uint4B +# +0x230 WerRegistrationData : Ptr32 Void +# +0x234 WerShipAssertPtr : Ptr32 Void +class _PEB_2008(Structure): + _pack_ = 8 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("BitField", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), # PRTL_CRITICAL_SECTION + ("AtlThunkSListPtr", PVOID), + ("IFEOKey", PVOID), + ("CrossProcessFlags", DWORD), + ("KernelCallbackTable", PVOID), + ("SystemReserved", DWORD), + ("SpareUlong", DWORD), + ("SparePebPtr0", PVOID), + ("TlsExpansionCounter", DWORD), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", DWORD * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("HotpatchInformation", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr32 Ptr32 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", DWORD), + ("NtGlobalFlag", DWORD), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", DWORD), + ("HeapSegmentCommit", DWORD), + ("HeapDeCommitTotalFreeThreshold", DWORD), + ("HeapDeCommitFreeBlockThreshold", DWORD), + ("NumberOfHeaps", DWORD), + ("MaximumNumberOfHeaps", DWORD), + ("ProcessHeaps", PVOID), # Ptr32 Ptr32 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", DWORD), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", DWORD), + ("OSMinorVersion", DWORD), + ("OSBuildNumber", WORD), + ("OSCSDVersion", WORD), + ("OSPlatformId", DWORD), + ("ImageSubsystem", DWORD), + ("ImageSubsystemMajorVersion", DWORD), + ("ImageSubsystemMinorVersion", DWORD), + ("ActiveProcessAffinityMask", DWORD), + ("GdiHandleBuffer", DWORD * 34), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", PVOID), + ("TlsExpansionBitmapBits", DWORD * 32), + ("SessionId", DWORD), + ("AppCompatFlags", ULONGLONG), # ULARGE_INTEGER + ("AppCompatFlagsUser", ULONGLONG), # ULARGE_INTEGER + ("pShimData", PVOID), + ("AppCompatInfo", PVOID), + ("CSDVersion", UNICODE_STRING), + ("ActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("ProcessAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("SystemDefaultActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("SystemAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("MinimumStackCommit", DWORD), + ("FlsCallback", PVOID), # PFLS_CALLBACK_INFO + ("FlsListHead", LIST_ENTRY), + ("FlsBitmap", PVOID), + ("FlsBitmapBits", DWORD * 4), + ("FlsHighIndex", DWORD), + ("WerRegistrationData", PVOID), + ("WerShipAssertPtr", PVOID), + ] + + def __get_UserSharedInfoPtr(self): + return self.KernelCallbackTable + + def __set_UserSharedInfoPtr(self, value): + self.KernelCallbackTable = value + + UserSharedInfoPtr = property(__get_UserSharedInfoPtr, __set_UserSharedInfoPtr) + + +# +0x000 InheritedAddressSpace : UChar +# +0x001 ReadImageFileExecOptions : UChar +# +0x002 BeingDebugged : UChar +# +0x003 BitField : UChar +# +0x003 ImageUsesLargePages : Pos 0, 1 Bit +# +0x003 IsProtectedProcess : Pos 1, 1 Bit +# +0x003 IsLegacyProcess : Pos 2, 1 Bit +# +0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit +# +0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit +# +0x003 SpareBits : Pos 5, 3 Bits +# +0x008 Mutant : Ptr64 Void +# +0x010 ImageBaseAddress : Ptr64 Void +# +0x018 Ldr : Ptr64 _PEB_LDR_DATA +# +0x020 ProcessParameters : Ptr64 _RTL_USER_PROCESS_PARAMETERS +# +0x028 SubSystemData : Ptr64 Void +# +0x030 ProcessHeap : Ptr64 Void +# +0x038 FastPebLock : Ptr64 _RTL_CRITICAL_SECTION +# +0x040 AtlThunkSListPtr : Ptr64 Void +# +0x048 IFEOKey : Ptr64 Void +# +0x050 CrossProcessFlags : Uint4B +# +0x050 ProcessInJob : Pos 0, 1 Bit +# +0x050 ProcessInitializing : Pos 1, 1 Bit +# +0x050 ProcessUsingVEH : Pos 2, 1 Bit +# +0x050 ProcessUsingVCH : Pos 3, 1 Bit +# +0x050 ReservedBits0 : Pos 4, 28 Bits +# +0x058 KernelCallbackTable : Ptr64 Void +# +0x058 UserSharedInfoPtr : Ptr64 Void +# +0x060 SystemReserved : [1] Uint4B +# +0x064 SpareUlong : Uint4B +# +0x068 SparePebPtr0 : Uint8B +# +0x070 TlsExpansionCounter : Uint4B +# +0x078 TlsBitmap : Ptr64 Void +# +0x080 TlsBitmapBits : [2] Uint4B +# +0x088 ReadOnlySharedMemoryBase : Ptr64 Void +# +0x090 HotpatchInformation : Ptr64 Void +# +0x098 ReadOnlyStaticServerData : Ptr64 Ptr64 Void +# +0x0a0 AnsiCodePageData : Ptr64 Void +# +0x0a8 OemCodePageData : Ptr64 Void +# +0x0b0 UnicodeCaseTableData : Ptr64 Void +# +0x0b8 NumberOfProcessors : Uint4B +# +0x0bc NtGlobalFlag : Uint4B +# +0x0c0 CriticalSectionTimeout : _LARGE_INTEGER +# +0x0c8 HeapSegmentReserve : Uint8B +# +0x0d0 HeapSegmentCommit : Uint8B +# +0x0d8 HeapDeCommitTotalFreeThreshold : Uint8B +# +0x0e0 HeapDeCommitFreeBlockThreshold : Uint8B +# +0x0e8 NumberOfHeaps : Uint4B +# +0x0ec MaximumNumberOfHeaps : Uint4B +# +0x0f0 ProcessHeaps : Ptr64 Ptr64 Void +# +0x0f8 GdiSharedHandleTable : Ptr64 Void +# +0x100 ProcessStarterHelper : Ptr64 Void +# +0x108 GdiDCAttributeList : Uint4B +# +0x110 LoaderLock : Ptr64 _RTL_CRITICAL_SECTION +# +0x118 OSMajorVersion : Uint4B +# +0x11c OSMinorVersion : Uint4B +# +0x120 OSBuildNumber : Uint2B +# +0x122 OSCSDVersion : Uint2B +# +0x124 OSPlatformId : Uint4B +# +0x128 ImageSubsystem : Uint4B +# +0x12c ImageSubsystemMajorVersion : Uint4B +# +0x130 ImageSubsystemMinorVersion : Uint4B +# +0x138 ActiveProcessAffinityMask : Uint8B +# +0x140 GdiHandleBuffer : [60] Uint4B +# +0x230 PostProcessInitRoutine : Ptr64 void +# +0x238 TlsExpansionBitmap : Ptr64 Void +# +0x240 TlsExpansionBitmapBits : [32] Uint4B +# +0x2c0 SessionId : Uint4B +# +0x2c8 AppCompatFlags : _ULARGE_INTEGER +# +0x2d0 AppCompatFlagsUser : _ULARGE_INTEGER +# +0x2d8 pShimData : Ptr64 Void +# +0x2e0 AppCompatInfo : Ptr64 Void +# +0x2e8 CSDVersion : _UNICODE_STRING +# +0x2f8 ActivationContextData : Ptr64 _ACTIVATION_CONTEXT_DATA +# +0x300 ProcessAssemblyStorageMap : Ptr64 _ASSEMBLY_STORAGE_MAP +# +0x308 SystemDefaultActivationContextData : Ptr64 _ACTIVATION_CONTEXT_DATA +# +0x310 SystemAssemblyStorageMap : Ptr64 _ASSEMBLY_STORAGE_MAP +# +0x318 MinimumStackCommit : Uint8B +# +0x320 FlsCallback : Ptr64 _FLS_CALLBACK_INFO +# +0x328 FlsListHead : _LIST_ENTRY +# +0x338 FlsBitmap : Ptr64 Void +# +0x340 FlsBitmapBits : [4] Uint4B +# +0x350 FlsHighIndex : Uint4B +# +0x358 WerRegistrationData : Ptr64 Void +# +0x360 WerShipAssertPtr : Ptr64 Void +class _PEB_2008_64(Structure): + _pack_ = 8 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("BitField", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), # PRTL_CRITICAL_SECTION + ("AtlThunkSListPtr", PVOID), + ("IFEOKey", PVOID), + ("CrossProcessFlags", DWORD), + ("KernelCallbackTable", PVOID), + ("SystemReserved", DWORD), + ("SpareUlong", DWORD), + ("SparePebPtr0", PVOID), + ("TlsExpansionCounter", DWORD), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", DWORD * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("HotpatchInformation", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr64 Ptr64 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", DWORD), + ("NtGlobalFlag", DWORD), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", QWORD), + ("HeapSegmentCommit", QWORD), + ("HeapDeCommitTotalFreeThreshold", QWORD), + ("HeapDeCommitFreeBlockThreshold", QWORD), + ("NumberOfHeaps", DWORD), + ("MaximumNumberOfHeaps", DWORD), + ("ProcessHeaps", PVOID), # Ptr64 Ptr64 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", DWORD), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", DWORD), + ("OSMinorVersion", DWORD), + ("OSBuildNumber", WORD), + ("OSCSDVersion", WORD), + ("OSPlatformId", DWORD), + ("ImageSubsystem", DWORD), + ("ImageSubsystemMajorVersion", DWORD), + ("ImageSubsystemMinorVersion", DWORD), + ("ActiveProcessAffinityMask", QWORD), + ("GdiHandleBuffer", DWORD * 60), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", PVOID), + ("TlsExpansionBitmapBits", DWORD * 32), + ("SessionId", DWORD), + ("AppCompatFlags", ULONGLONG), # ULARGE_INTEGER + ("AppCompatFlagsUser", ULONGLONG), # ULARGE_INTEGER + ("pShimData", PVOID), + ("AppCompatInfo", PVOID), + ("CSDVersion", UNICODE_STRING), + ("ActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("ProcessAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("SystemDefaultActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("SystemAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("MinimumStackCommit", QWORD), + ("FlsCallback", PVOID), # PFLS_CALLBACK_INFO + ("FlsListHead", LIST_ENTRY), + ("FlsBitmap", PVOID), + ("FlsBitmapBits", DWORD * 4), + ("FlsHighIndex", DWORD), + ("WerRegistrationData", PVOID), + ("WerShipAssertPtr", PVOID), + ] + + def __get_UserSharedInfoPtr(self): + return self.KernelCallbackTable + + def __set_UserSharedInfoPtr(self, value): + self.KernelCallbackTable = value + + UserSharedInfoPtr = property(__get_UserSharedInfoPtr, __set_UserSharedInfoPtr) + + +# +0x000 InheritedAddressSpace : UChar +# +0x001 ReadImageFileExecOptions : UChar +# +0x002 BeingDebugged : UChar +# +0x003 BitField : UChar +# +0x003 ImageUsesLargePages : Pos 0, 1 Bit +# +0x003 IsProtectedProcess : Pos 1, 1 Bit +# +0x003 IsLegacyProcess : Pos 2, 1 Bit +# +0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit +# +0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit +# +0x003 SpareBits : Pos 5, 3 Bits +# +0x004 Mutant : Ptr32 Void +# +0x008 ImageBaseAddress : Ptr32 Void +# +0x00c Ldr : Ptr32 _PEB_LDR_DATA +# +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS +# +0x014 SubSystemData : Ptr32 Void +# +0x018 ProcessHeap : Ptr32 Void +# +0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x020 AtlThunkSListPtr : Ptr32 Void +# +0x024 IFEOKey : Ptr32 Void +# +0x028 CrossProcessFlags : Uint4B +# +0x028 ProcessInJob : Pos 0, 1 Bit +# +0x028 ProcessInitializing : Pos 1, 1 Bit +# +0x028 ProcessUsingVEH : Pos 2, 1 Bit +# +0x028 ProcessUsingVCH : Pos 3, 1 Bit +# +0x028 ProcessUsingFTH : Pos 4, 1 Bit +# +0x028 ReservedBits0 : Pos 5, 27 Bits +# +0x02c KernelCallbackTable : Ptr32 Void +# +0x02c UserSharedInfoPtr : Ptr32 Void +# +0x030 SystemReserved : [1] Uint4B +# +0x034 AtlThunkSListPtr32 : Uint4B +# +0x038 ApiSetMap : Ptr32 Void +# +0x03c TlsExpansionCounter : Uint4B +# +0x040 TlsBitmap : Ptr32 Void +# +0x044 TlsBitmapBits : [2] Uint4B +# +0x04c ReadOnlySharedMemoryBase : Ptr32 Void +# +0x050 HotpatchInformation : Ptr32 Void +# +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void +# +0x058 AnsiCodePageData : Ptr32 Void +# +0x05c OemCodePageData : Ptr32 Void +# +0x060 UnicodeCaseTableData : Ptr32 Void +# +0x064 NumberOfProcessors : Uint4B +# +0x068 NtGlobalFlag : Uint4B +# +0x070 CriticalSectionTimeout : _LARGE_INTEGER +# +0x078 HeapSegmentReserve : Uint4B +# +0x07c HeapSegmentCommit : Uint4B +# +0x080 HeapDeCommitTotalFreeThreshold : Uint4B +# +0x084 HeapDeCommitFreeBlockThreshold : Uint4B +# +0x088 NumberOfHeaps : Uint4B +# +0x08c MaximumNumberOfHeaps : Uint4B +# +0x090 ProcessHeaps : Ptr32 Ptr32 Void +# +0x094 GdiSharedHandleTable : Ptr32 Void +# +0x098 ProcessStarterHelper : Ptr32 Void +# +0x09c GdiDCAttributeList : Uint4B +# +0x0a0 LoaderLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x0a4 OSMajorVersion : Uint4B +# +0x0a8 OSMinorVersion : Uint4B +# +0x0ac OSBuildNumber : Uint2B +# +0x0ae OSCSDVersion : Uint2B +# +0x0b0 OSPlatformId : Uint4B +# +0x0b4 ImageSubsystem : Uint4B +# +0x0b8 ImageSubsystemMajorVersion : Uint4B +# +0x0bc ImageSubsystemMinorVersion : Uint4B +# +0x0c0 ActiveProcessAffinityMask : Uint4B +# +0x0c4 GdiHandleBuffer : [34] Uint4B +# +0x14c PostProcessInitRoutine : Ptr32 void +# +0x150 TlsExpansionBitmap : Ptr32 Void +# +0x154 TlsExpansionBitmapBits : [32] Uint4B +# +0x1d4 SessionId : Uint4B +# +0x1d8 AppCompatFlags : _ULARGE_INTEGER +# +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER +# +0x1e8 pShimData : Ptr32 Void +# +0x1ec AppCompatInfo : Ptr32 Void +# +0x1f0 CSDVersion : _UNICODE_STRING +# +0x1f8 ActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA +# +0x1fc ProcessAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP +# +0x200 SystemDefaultActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA +# +0x204 SystemAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP +# +0x208 MinimumStackCommit : Uint4B +# +0x20c FlsCallback : Ptr32 _FLS_CALLBACK_INFO +# +0x210 FlsListHead : _LIST_ENTRY +# +0x218 FlsBitmap : Ptr32 Void +# +0x21c FlsBitmapBits : [4] Uint4B +# +0x22c FlsHighIndex : Uint4B +# +0x230 WerRegistrationData : Ptr32 Void +# +0x234 WerShipAssertPtr : Ptr32 Void +# +0x238 pContextData : Ptr32 Void +# +0x23c pImageHeaderHash : Ptr32 Void +# +0x240 TracingFlags : Uint4B +# +0x240 HeapTracingEnabled : Pos 0, 1 Bit +# +0x240 CritSecTracingEnabled : Pos 1, 1 Bit +# +0x240 SpareTracingBits : Pos 2, 30 Bits +class _PEB_2008_R2(Structure): + _pack_ = 8 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("BitField", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), # PRTL_CRITICAL_SECTION + ("AtlThunkSListPtr", PVOID), + ("IFEOKey", PVOID), + ("CrossProcessFlags", DWORD), + ("KernelCallbackTable", PVOID), + ("SystemReserved", DWORD), + ("AtlThunkSListPtr32", PVOID), + ("ApiSetMap", PVOID), + ("TlsExpansionCounter", DWORD), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", DWORD * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("HotpatchInformation", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr32 Ptr32 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", DWORD), + ("NtGlobalFlag", DWORD), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", DWORD), + ("HeapSegmentCommit", DWORD), + ("HeapDeCommitTotalFreeThreshold", DWORD), + ("HeapDeCommitFreeBlockThreshold", DWORD), + ("NumberOfHeaps", DWORD), + ("MaximumNumberOfHeaps", DWORD), + ("ProcessHeaps", PVOID), # Ptr32 Ptr32 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", DWORD), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", DWORD), + ("OSMinorVersion", DWORD), + ("OSBuildNumber", WORD), + ("OSCSDVersion", WORD), + ("OSPlatformId", DWORD), + ("ImageSubsystem", DWORD), + ("ImageSubsystemMajorVersion", DWORD), + ("ImageSubsystemMinorVersion", DWORD), + ("ActiveProcessAffinityMask", DWORD), + ("GdiHandleBuffer", DWORD * 34), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", PVOID), + ("TlsExpansionBitmapBits", DWORD * 32), + ("SessionId", DWORD), + ("AppCompatFlags", ULONGLONG), # ULARGE_INTEGER + ("AppCompatFlagsUser", ULONGLONG), # ULARGE_INTEGER + ("pShimData", PVOID), + ("AppCompatInfo", PVOID), + ("CSDVersion", UNICODE_STRING), + ("ActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("ProcessAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("SystemDefaultActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("SystemAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("MinimumStackCommit", DWORD), + ("FlsCallback", PVOID), # PFLS_CALLBACK_INFO + ("FlsListHead", LIST_ENTRY), + ("FlsBitmap", PVOID), + ("FlsBitmapBits", DWORD * 4), + ("FlsHighIndex", DWORD), + ("WerRegistrationData", PVOID), + ("WerShipAssertPtr", PVOID), + ("pContextData", PVOID), + ("pImageHeaderHash", PVOID), + ("TracingFlags", DWORD), + ] + + def __get_UserSharedInfoPtr(self): + return self.KernelCallbackTable + + def __set_UserSharedInfoPtr(self, value): + self.KernelCallbackTable = value + + UserSharedInfoPtr = property(__get_UserSharedInfoPtr, __set_UserSharedInfoPtr) + + +# +0x000 InheritedAddressSpace : UChar +# +0x001 ReadImageFileExecOptions : UChar +# +0x002 BeingDebugged : UChar +# +0x003 BitField : UChar +# +0x003 ImageUsesLargePages : Pos 0, 1 Bit +# +0x003 IsProtectedProcess : Pos 1, 1 Bit +# +0x003 IsLegacyProcess : Pos 2, 1 Bit +# +0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit +# +0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit +# +0x003 SpareBits : Pos 5, 3 Bits +# +0x008 Mutant : Ptr64 Void +# +0x010 ImageBaseAddress : Ptr64 Void +# +0x018 Ldr : Ptr64 _PEB_LDR_DATA +# +0x020 ProcessParameters : Ptr64 _RTL_USER_PROCESS_PARAMETERS +# +0x028 SubSystemData : Ptr64 Void +# +0x030 ProcessHeap : Ptr64 Void +# +0x038 FastPebLock : Ptr64 _RTL_CRITICAL_SECTION +# +0x040 AtlThunkSListPtr : Ptr64 Void +# +0x048 IFEOKey : Ptr64 Void +# +0x050 CrossProcessFlags : Uint4B +# +0x050 ProcessInJob : Pos 0, 1 Bit +# +0x050 ProcessInitializing : Pos 1, 1 Bit +# +0x050 ProcessUsingVEH : Pos 2, 1 Bit +# +0x050 ProcessUsingVCH : Pos 3, 1 Bit +# +0x050 ProcessUsingFTH : Pos 4, 1 Bit +# +0x050 ReservedBits0 : Pos 5, 27 Bits +# +0x058 KernelCallbackTable : Ptr64 Void +# +0x058 UserSharedInfoPtr : Ptr64 Void +# +0x060 SystemReserved : [1] Uint4B +# +0x064 AtlThunkSListPtr32 : Uint4B +# +0x068 ApiSetMap : Ptr64 Void +# +0x070 TlsExpansionCounter : Uint4B +# +0x078 TlsBitmap : Ptr64 Void +# +0x080 TlsBitmapBits : [2] Uint4B +# +0x088 ReadOnlySharedMemoryBase : Ptr64 Void +# +0x090 HotpatchInformation : Ptr64 Void +# +0x098 ReadOnlyStaticServerData : Ptr64 Ptr64 Void +# +0x0a0 AnsiCodePageData : Ptr64 Void +# +0x0a8 OemCodePageData : Ptr64 Void +# +0x0b0 UnicodeCaseTableData : Ptr64 Void +# +0x0b8 NumberOfProcessors : Uint4B +# +0x0bc NtGlobalFlag : Uint4B +# +0x0c0 CriticalSectionTimeout : _LARGE_INTEGER +# +0x0c8 HeapSegmentReserve : Uint8B +# +0x0d0 HeapSegmentCommit : Uint8B +# +0x0d8 HeapDeCommitTotalFreeThreshold : Uint8B +# +0x0e0 HeapDeCommitFreeBlockThreshold : Uint8B +# +0x0e8 NumberOfHeaps : Uint4B +# +0x0ec MaximumNumberOfHeaps : Uint4B +# +0x0f0 ProcessHeaps : Ptr64 Ptr64 Void +# +0x0f8 GdiSharedHandleTable : Ptr64 Void +# +0x100 ProcessStarterHelper : Ptr64 Void +# +0x108 GdiDCAttributeList : Uint4B +# +0x110 LoaderLock : Ptr64 _RTL_CRITICAL_SECTION +# +0x118 OSMajorVersion : Uint4B +# +0x11c OSMinorVersion : Uint4B +# +0x120 OSBuildNumber : Uint2B +# +0x122 OSCSDVersion : Uint2B +# +0x124 OSPlatformId : Uint4B +# +0x128 ImageSubsystem : Uint4B +# +0x12c ImageSubsystemMajorVersion : Uint4B +# +0x130 ImageSubsystemMinorVersion : Uint4B +# +0x138 ActiveProcessAffinityMask : Uint8B +# +0x140 GdiHandleBuffer : [60] Uint4B +# +0x230 PostProcessInitRoutine : Ptr64 void +# +0x238 TlsExpansionBitmap : Ptr64 Void +# +0x240 TlsExpansionBitmapBits : [32] Uint4B +# +0x2c0 SessionId : Uint4B +# +0x2c8 AppCompatFlags : _ULARGE_INTEGER +# +0x2d0 AppCompatFlagsUser : _ULARGE_INTEGER +# +0x2d8 pShimData : Ptr64 Void +# +0x2e0 AppCompatInfo : Ptr64 Void +# +0x2e8 CSDVersion : _UNICODE_STRING +# +0x2f8 ActivationContextData : Ptr64 _ACTIVATION_CONTEXT_DATA +# +0x300 ProcessAssemblyStorageMap : Ptr64 _ASSEMBLY_STORAGE_MAP +# +0x308 SystemDefaultActivationContextData : Ptr64 _ACTIVATION_CONTEXT_DATA +# +0x310 SystemAssemblyStorageMap : Ptr64 _ASSEMBLY_STORAGE_MAP +# +0x318 MinimumStackCommit : Uint8B +# +0x320 FlsCallback : Ptr64 _FLS_CALLBACK_INFO +# +0x328 FlsListHead : _LIST_ENTRY +# +0x338 FlsBitmap : Ptr64 Void +# +0x340 FlsBitmapBits : [4] Uint4B +# +0x350 FlsHighIndex : Uint4B +# +0x358 WerRegistrationData : Ptr64 Void +# +0x360 WerShipAssertPtr : Ptr64 Void +# +0x368 pContextData : Ptr64 Void +# +0x370 pImageHeaderHash : Ptr64 Void +# +0x378 TracingFlags : Uint4B +# +0x378 HeapTracingEnabled : Pos 0, 1 Bit +# +0x378 CritSecTracingEnabled : Pos 1, 1 Bit +# +0x378 SpareTracingBits : Pos 2, 30 Bits +class _PEB_2008_R2_64(Structure): + _pack_ = 8 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("BitField", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), # PRTL_CRITICAL_SECTION + ("AtlThunkSListPtr", PVOID), + ("IFEOKey", PVOID), + ("CrossProcessFlags", DWORD), + ("KernelCallbackTable", PVOID), + ("SystemReserved", DWORD), + ("AtlThunkSListPtr32", DWORD), + ("ApiSetMap", PVOID), + ("TlsExpansionCounter", DWORD), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", DWORD * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("HotpatchInformation", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr32 Ptr32 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", DWORD), + ("NtGlobalFlag", DWORD), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", QWORD), + ("HeapSegmentCommit", QWORD), + ("HeapDeCommitTotalFreeThreshold", QWORD), + ("HeapDeCommitFreeBlockThreshold", QWORD), + ("NumberOfHeaps", DWORD), + ("MaximumNumberOfHeaps", DWORD), + ("ProcessHeaps", PVOID), # Ptr64 Ptr64 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", DWORD), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", DWORD), + ("OSMinorVersion", DWORD), + ("OSBuildNumber", WORD), + ("OSCSDVersion", WORD), + ("OSPlatformId", DWORD), + ("ImageSubsystem", DWORD), + ("ImageSubsystemMajorVersion", DWORD), + ("ImageSubsystemMinorVersion", DWORD), + ("ActiveProcessAffinityMask", QWORD), + ("GdiHandleBuffer", DWORD * 60), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", PVOID), + ("TlsExpansionBitmapBits", DWORD * 32), + ("SessionId", DWORD), + ("AppCompatFlags", ULONGLONG), # ULARGE_INTEGER + ("AppCompatFlagsUser", ULONGLONG), # ULARGE_INTEGER + ("pShimData", PVOID), + ("AppCompatInfo", PVOID), + ("CSDVersion", UNICODE_STRING), + ("ActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("ProcessAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("SystemDefaultActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("SystemAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("MinimumStackCommit", QWORD), + ("FlsCallback", PVOID), # PFLS_CALLBACK_INFO + ("FlsListHead", LIST_ENTRY), + ("FlsBitmap", PVOID), + ("FlsBitmapBits", DWORD * 4), + ("FlsHighIndex", DWORD), + ("WerRegistrationData", PVOID), + ("WerShipAssertPtr", PVOID), + ("pContextData", PVOID), + ("pImageHeaderHash", PVOID), + ("TracingFlags", DWORD), + ] + + def __get_UserSharedInfoPtr(self): + return self.KernelCallbackTable + + def __set_UserSharedInfoPtr(self, value): + self.KernelCallbackTable = value + + UserSharedInfoPtr = property(__get_UserSharedInfoPtr, __set_UserSharedInfoPtr) + + +_PEB_Vista = _PEB_2008 +_PEB_Vista_64 = _PEB_2008_64 +_PEB_W7 = _PEB_2008_R2 +_PEB_W7_64 = _PEB_2008_R2_64 + + +# +0x000 InheritedAddressSpace : UChar +# +0x001 ReadImageFileExecOptions : UChar +# +0x002 BeingDebugged : UChar +# +0x003 BitField : UChar +# +0x003 ImageUsesLargePages : Pos 0, 1 Bit +# +0x003 IsProtectedProcess : Pos 1, 1 Bit +# +0x003 IsLegacyProcess : Pos 2, 1 Bit +# +0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit +# +0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit +# +0x003 SpareBits : Pos 5, 3 Bits +# +0x004 Mutant : Ptr32 Void +# +0x008 ImageBaseAddress : Ptr32 Void +# +0x00c Ldr : Ptr32 _PEB_LDR_DATA +# +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS +# +0x014 SubSystemData : Ptr32 Void +# +0x018 ProcessHeap : Ptr32 Void +# +0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x020 AtlThunkSListPtr : Ptr32 Void +# +0x024 IFEOKey : Ptr32 Void +# +0x028 CrossProcessFlags : Uint4B +# +0x028 ProcessInJob : Pos 0, 1 Bit +# +0x028 ProcessInitializing : Pos 1, 1 Bit +# +0x028 ProcessUsingVEH : Pos 2, 1 Bit +# +0x028 ProcessUsingVCH : Pos 3, 1 Bit +# +0x028 ProcessUsingFTH : Pos 4, 1 Bit +# +0x028 ReservedBits0 : Pos 5, 27 Bits +# +0x02c KernelCallbackTable : Ptr32 Void +# +0x02c UserSharedInfoPtr : Ptr32 Void +# +0x030 SystemReserved : [1] Uint4B +# +0x034 TracingFlags : Uint4B +# +0x034 HeapTracingEnabled : Pos 0, 1 Bit +# +0x034 CritSecTracingEnabled : Pos 1, 1 Bit +# +0x034 SpareTracingBits : Pos 2, 30 Bits +# +0x038 ApiSetMap : Ptr32 Void +# +0x03c TlsExpansionCounter : Uint4B +# +0x040 TlsBitmap : Ptr32 Void +# +0x044 TlsBitmapBits : [2] Uint4B +# +0x04c ReadOnlySharedMemoryBase : Ptr32 Void +# +0x050 HotpatchInformation : Ptr32 Void +# +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void +# +0x058 AnsiCodePageData : Ptr32 Void +# +0x05c OemCodePageData : Ptr32 Void +# +0x060 UnicodeCaseTableData : Ptr32 Void +# +0x064 NumberOfProcessors : Uint4B +# +0x068 NtGlobalFlag : Uint4B +# +0x070 CriticalSectionTimeout : _LARGE_INTEGER +# +0x078 HeapSegmentReserve : Uint4B +# +0x07c HeapSegmentCommit : Uint4B +# +0x080 HeapDeCommitTotalFreeThreshold : Uint4B +# +0x084 HeapDeCommitFreeBlockThreshold : Uint4B +# +0x088 NumberOfHeaps : Uint4B +# +0x08c MaximumNumberOfHeaps : Uint4B +# +0x090 ProcessHeaps : Ptr32 Ptr32 Void +# +0x094 GdiSharedHandleTable : Ptr32 Void +# +0x098 ProcessStarterHelper : Ptr32 Void +# +0x09c GdiDCAttributeList : Uint4B +# +0x0a0 LoaderLock : Ptr32 _RTL_CRITICAL_SECTION +# +0x0a4 OSMajorVersion : Uint4B +# +0x0a8 OSMinorVersion : Uint4B +# +0x0ac OSBuildNumber : Uint2B +# +0x0ae OSCSDVersion : Uint2B +# +0x0b0 OSPlatformId : Uint4B +# +0x0b4 ImageSubsystem : Uint4B +# +0x0b8 ImageSubsystemMajorVersion : Uint4B +# +0x0bc ImageSubsystemMinorVersion : Uint4B +# +0x0c0 ActiveProcessAffinityMask : Uint4B +# +0x0c4 GdiHandleBuffer : [34] Uint4B +# +0x14c PostProcessInitRoutine : Ptr32 void +# +0x150 TlsExpansionBitmap : Ptr32 Void +# +0x154 TlsExpansionBitmapBits : [32] Uint4B +# +0x1d4 SessionId : Uint4B +# +0x1d8 AppCompatFlags : _ULARGE_INTEGER +# +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER +# +0x1e8 pShimData : Ptr32 Void +# +0x1ec AppCompatInfo : Ptr32 Void +# +0x1f0 CSDVersion : _UNICODE_STRING +# +0x1f8 ActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA +# +0x1fc ProcessAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP +# +0x200 SystemDefaultActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA +# +0x204 SystemAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP +# +0x208 MinimumStackCommit : Uint4B +# +0x20c FlsCallback : Ptr32 _FLS_CALLBACK_INFO +# +0x210 FlsListHead : _LIST_ENTRY +# +0x218 FlsBitmap : Ptr32 Void +# +0x21c FlsBitmapBits : [4] Uint4B +# +0x22c FlsHighIndex : Uint4B +# +0x230 WerRegistrationData : Ptr32 Void +# +0x234 WerShipAssertPtr : Ptr32 Void +# +0x238 pContextData : Ptr32 Void +# +0x23c pImageHeaderHash : Ptr32 Void +class _PEB_W7_Beta(Structure): + """ + This definition of the PEB structure is only valid for the beta versions + of Windows 7. For the final version of Windows 7 use L{_PEB_W7} instead. + This structure is not chosen automatically. + """ + + _pack_ = 8 + _fields_ = [ + ("InheritedAddressSpace", BOOLEAN), + ("ReadImageFileExecOptions", UCHAR), + ("BeingDebugged", BOOLEAN), + ("BitField", UCHAR), + ("Mutant", HANDLE), + ("ImageBaseAddress", PVOID), + ("Ldr", PVOID), # PPEB_LDR_DATA + ("ProcessParameters", PVOID), # PRTL_USER_PROCESS_PARAMETERS + ("SubSystemData", PVOID), + ("ProcessHeap", PVOID), + ("FastPebLock", PVOID), # PRTL_CRITICAL_SECTION + ("AtlThunkSListPtr", PVOID), + ("IFEOKey", PVOID), + ("CrossProcessFlags", DWORD), + ("KernelCallbackTable", PVOID), + ("SystemReserved", DWORD), + ("TracingFlags", DWORD), + ("ApiSetMap", PVOID), + ("TlsExpansionCounter", DWORD), + ("TlsBitmap", PVOID), + ("TlsBitmapBits", DWORD * 2), + ("ReadOnlySharedMemoryBase", PVOID), + ("HotpatchInformation", PVOID), + ("ReadOnlyStaticServerData", PVOID), # Ptr32 Ptr32 Void + ("AnsiCodePageData", PVOID), + ("OemCodePageData", PVOID), + ("UnicodeCaseTableData", PVOID), + ("NumberOfProcessors", DWORD), + ("NtGlobalFlag", DWORD), + ("CriticalSectionTimeout", LONGLONG), # LARGE_INTEGER + ("HeapSegmentReserve", DWORD), + ("HeapSegmentCommit", DWORD), + ("HeapDeCommitTotalFreeThreshold", DWORD), + ("HeapDeCommitFreeBlockThreshold", DWORD), + ("NumberOfHeaps", DWORD), + ("MaximumNumberOfHeaps", DWORD), + ("ProcessHeaps", PVOID), # Ptr32 Ptr32 Void + ("GdiSharedHandleTable", PVOID), + ("ProcessStarterHelper", PVOID), + ("GdiDCAttributeList", DWORD), + ("LoaderLock", PVOID), # PRTL_CRITICAL_SECTION + ("OSMajorVersion", DWORD), + ("OSMinorVersion", DWORD), + ("OSBuildNumber", WORD), + ("OSCSDVersion", WORD), + ("OSPlatformId", DWORD), + ("ImageSubsystem", DWORD), + ("ImageSubsystemMajorVersion", DWORD), + ("ImageSubsystemMinorVersion", DWORD), + ("ActiveProcessAffinityMask", DWORD), + ("GdiHandleBuffer", DWORD * 34), + ("PostProcessInitRoutine", PPS_POST_PROCESS_INIT_ROUTINE), + ("TlsExpansionBitmap", PVOID), + ("TlsExpansionBitmapBits", DWORD * 32), + ("SessionId", DWORD), + ("AppCompatFlags", ULONGLONG), # ULARGE_INTEGER + ("AppCompatFlagsUser", ULONGLONG), # ULARGE_INTEGER + ("pShimData", PVOID), + ("AppCompatInfo", PVOID), + ("CSDVersion", UNICODE_STRING), + ("ActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("ProcessAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("SystemDefaultActivationContextData", PVOID), # ACTIVATION_CONTEXT_DATA + ("SystemAssemblyStorageMap", PVOID), # ASSEMBLY_STORAGE_MAP + ("MinimumStackCommit", DWORD), + ("FlsCallback", PVOID), # PFLS_CALLBACK_INFO + ("FlsListHead", LIST_ENTRY), + ("FlsBitmap", PVOID), + ("FlsBitmapBits", DWORD * 4), + ("FlsHighIndex", DWORD), + ("WerRegistrationData", PVOID), + ("WerShipAssertPtr", PVOID), + ("pContextData", PVOID), + ("pImageHeaderHash", PVOID), + ] + + def __get_UserSharedInfoPtr(self): + return self.KernelCallbackTable + + def __set_UserSharedInfoPtr(self, value): + self.KernelCallbackTable = value + + UserSharedInfoPtr = property(__get_UserSharedInfoPtr, __set_UserSharedInfoPtr) + + +# Use the correct PEB structure definition. +# Defaults to the latest Windows version. +class PEB(Structure): + _pack_ = 8 + if os == "Windows NT": + _pack_ = _PEB_NT._pack_ + _fields_ = _PEB_NT._fields_ + elif os == "Windows 2000": + _pack_ = _PEB_2000._pack_ + _fields_ = _PEB_2000._fields_ + elif os == "Windows XP": + _fields_ = _PEB_XP._fields_ + elif os == "Windows XP (64 bits)": + _fields_ = _PEB_XP_64._fields_ + elif os == "Windows 2003": + _fields_ = _PEB_2003._fields_ + elif os == "Windows 2003 (64 bits)": + _fields_ = _PEB_2003_64._fields_ + elif os == "Windows 2003 R2": + _fields_ = _PEB_2003_R2._fields_ + elif os == "Windows 2003 R2 (64 bits)": + _fields_ = _PEB_2003_R2_64._fields_ + elif os == "Windows 2008": + _fields_ = _PEB_2008._fields_ + elif os == "Windows 2008 (64 bits)": + _fields_ = _PEB_2008_64._fields_ + elif os == "Windows 2008 R2": + _fields_ = _PEB_2008_R2._fields_ + elif os == "Windows 2008 R2 (64 bits)": + _fields_ = _PEB_2008_R2_64._fields_ + elif os == "Windows Vista": + _fields_ = _PEB_Vista._fields_ + elif os == "Windows Vista (64 bits)": + _fields_ = _PEB_Vista_64._fields_ + elif os == "Windows 7": + _fields_ = _PEB_W7._fields_ + elif os == "Windows 7 (64 bits)": + _fields_ = _PEB_W7_64._fields_ + elif sizeof(SIZE_T) == sizeof(DWORD): + _fields_ = _PEB_W7._fields_ + else: + _fields_ = _PEB_W7_64._fields_ + + +PPEB = POINTER(PEB) + + +# PEB structure for WOW64 processes. +class PEB_32(Structure): + _pack_ = 8 + if os == "Windows NT": + _pack_ = _PEB_NT._pack_ + _fields_ = _PEB_NT._fields_ + elif os == "Windows 2000": + _pack_ = _PEB_2000._pack_ + _fields_ = _PEB_2000._fields_ + elif os.startswith("Windows XP"): + _fields_ = _PEB_XP._fields_ + elif os.startswith("Windows 2003 R2"): + _fields_ = _PEB_2003_R2._fields_ + elif os.startswith("Windows 2003"): + _fields_ = _PEB_2003._fields_ + elif os.startswith("Windows 2008 R2"): + _fields_ = _PEB_2008_R2._fields_ + elif os.startswith("Windows 2008"): + _fields_ = _PEB_2008._fields_ + elif os.startswith("Windows Vista"): + _fields_ = _PEB_Vista._fields_ + else: # if os.startswith('Windows 7'): + _fields_ = _PEB_W7._fields_ + + +# from https://vmexplorer.svn.codeplex.com/svn/VMExplorer/src/Win32/Threads.cs +# +# [StructLayout (LayoutKind.Sequential, Size = 0x0C)] +# public struct Wx86ThreadState +# { +# public IntPtr CallBx86Eip; // Ptr32 to Uint4B +# public IntPtr DeallocationCpu; // Ptr32 to Void +# public Byte UseKnownWx86Dll; // UChar +# public Byte OleStubInvoked; // Char +# }; +class Wx86ThreadState(Structure): + _fields_ = [ + ("CallBx86Eip", PVOID), + ("DeallocationCpu", PVOID), + ("UseKnownWx86Dll", UCHAR), + ("OleStubInvoked", CHAR), + ] + + +# ntdll!_RTL_ACTIVATION_CONTEXT_STACK_FRAME +# +0x000 Previous : Ptr64 _RTL_ACTIVATION_CONTEXT_STACK_FRAME +# +0x008 ActivationContext : Ptr64 _ACTIVATION_CONTEXT +# +0x010 Flags : Uint4B +class RTL_ACTIVATION_CONTEXT_STACK_FRAME(Structure): + _fields_ = [ + ("Previous", PVOID), + ("ActivationContext", PVOID), + ("Flags", DWORD), + ] + + +# ntdll!_ACTIVATION_CONTEXT_STACK +# +0x000 ActiveFrame : Ptr64 _RTL_ACTIVATION_CONTEXT_STACK_FRAME +# +0x008 FrameListCache : _LIST_ENTRY +# +0x018 Flags : Uint4B +# +0x01c NextCookieSequenceNumber : Uint4B +# +0x020 StackId : Uint4B +class ACTIVATION_CONTEXT_STACK(Structure): + _fields_ = [ + ("ActiveFrame", PVOID), + ("FrameListCache", LIST_ENTRY), + ("Flags", DWORD), + ("NextCookieSequenceNumber", DWORD), + ("StackId", DWORD), + ] + + +# typedef struct _PROCESSOR_NUMBER { +# WORD Group; +# BYTE Number; +# BYTE Reserved; +# }PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; +class PROCESSOR_NUMBER(Structure): + _fields_ = [ + ("Group", WORD), + ("Number", BYTE), + ("Reserved", BYTE), + ] + + +# from http://www.nirsoft.net/kernel_struct/vista/NT_TIB.html +# +# typedef struct _NT_TIB +# { +# PEXCEPTION_REGISTRATION_RECORD ExceptionList; +# PVOID StackBase; +# PVOID StackLimit; +# PVOID SubSystemTib; +# union +# { +# PVOID FiberData; +# ULONG Version; +# }; +# PVOID ArbitraryUserPointer; +# PNT_TIB Self; +# } NT_TIB, *PNT_TIB; +class _NT_TIB_UNION(Union): + _fields_ = [ + ("FiberData", PVOID), + ("Version", ULONG), + ] + + +class NT_TIB(Structure): + _fields_ = [ + ("ExceptionList", PVOID), # PEXCEPTION_REGISTRATION_RECORD + ("StackBase", PVOID), + ("StackLimit", PVOID), + ("SubSystemTib", PVOID), + ("u", _NT_TIB_UNION), + ("ArbitraryUserPointer", PVOID), + ("Self", PVOID), # PNTTIB + ] + + def __get_FiberData(self): + return self.u.FiberData + + def __set_FiberData(self, value): + self.u.FiberData = value + + FiberData = property(__get_FiberData, __set_FiberData) + + def __get_Version(self): + return self.u.Version + + def __set_Version(self, value): + self.u.Version = value + + Version = property(__get_Version, __set_Version) + + +PNTTIB = POINTER(NT_TIB) + + +# From http://www.nirsoft.net/kernel_struct/vista/EXCEPTION_REGISTRATION_RECORD.html +# +# typedef struct _EXCEPTION_REGISTRATION_RECORD +# { +# PEXCEPTION_REGISTRATION_RECORD Next; +# PEXCEPTION_DISPOSITION Handler; +# } EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD; +class EXCEPTION_REGISTRATION_RECORD(Structure): + pass + + +EXCEPTION_DISPOSITION = DWORD +##PEXCEPTION_DISPOSITION = POINTER(EXCEPTION_DISPOSITION) +##PEXCEPTION_REGISTRATION_RECORD = POINTER(EXCEPTION_REGISTRATION_RECORD) +PEXCEPTION_DISPOSITION = PVOID +PEXCEPTION_REGISTRATION_RECORD = PVOID + +EXCEPTION_REGISTRATION_RECORD._fields_ = [ + ("Next", PEXCEPTION_REGISTRATION_RECORD), + ("Handler", PEXCEPTION_DISPOSITION), +] + +##PPEB = POINTER(PEB) +PPEB = PVOID + + +# From http://www.nirsoft.net/kernel_struct/vista/GDI_TEB_BATCH.html +# +# typedef struct _GDI_TEB_BATCH +# { +# ULONG Offset; +# ULONG HDC; +# ULONG Buffer[310]; +# } GDI_TEB_BATCH, *PGDI_TEB_BATCH; +class GDI_TEB_BATCH(Structure): + _fields_ = [ + ("Offset", ULONG), + ("HDC", ULONG), + ("Buffer", ULONG * 310), + ] + + +# ntdll!_TEB_ACTIVE_FRAME_CONTEXT +# +0x000 Flags : Uint4B +# +0x008 FrameName : Ptr64 Char +class TEB_ACTIVE_FRAME_CONTEXT(Structure): + _fields_ = [ + ("Flags", DWORD), + ("FrameName", LPVOID), # LPCHAR + ] + + +PTEB_ACTIVE_FRAME_CONTEXT = POINTER(TEB_ACTIVE_FRAME_CONTEXT) + + +# ntdll!_TEB_ACTIVE_FRAME +# +0x000 Flags : Uint4B +# +0x008 Previous : Ptr64 _TEB_ACTIVE_FRAME +# +0x010 Context : Ptr64 _TEB_ACTIVE_FRAME_CONTEXT +class TEB_ACTIVE_FRAME(Structure): + _fields_ = [ + ("Flags", DWORD), + ("Previous", LPVOID), # PTEB_ACTIVE_FRAME + ("Context", LPVOID), # PTEB_ACTIVE_FRAME_CONTEXT + ] + + +PTEB_ACTIVE_FRAME = POINTER(TEB_ACTIVE_FRAME) + +# SameTebFlags +DbgSafeThunkCall = 1 << 0 +DbgInDebugPrint = 1 << 1 +DbgHasFiberData = 1 << 2 +DbgSkipThreadAttach = 1 << 3 +DbgWerInShipAssertCode = 1 << 4 +DbgRanProcessInit = 1 << 5 +DbgClonedThread = 1 << 6 +DbgSuppressDebugMsg = 1 << 7 +RtlDisableUserStackWalk = 1 << 8 +RtlExceptionAttached = 1 << 9 +RtlInitialThread = 1 << 10 + + +# XXX This is quite wrong :P +class _TEB_NT(Structure): + _pack_ = 4 + _fields_ = [ + ("NtTib", NT_TIB), + ("EnvironmentPointer", PVOID), + ("ClientId", CLIENT_ID), + ("ActiveRpcHandle", HANDLE), + ("ThreadLocalStoragePointer", PVOID), + ("ProcessEnvironmentBlock", PPEB), + ("LastErrorValue", ULONG), + ("CountOfOwnedCriticalSections", ULONG), + ("CsrClientThread", PVOID), + ("Win32ThreadInfo", PVOID), + ("User32Reserved", ULONG * 26), + ("UserReserved", ULONG * 5), + ("WOW32Reserved", PVOID), # ptr to wow64cpu!X86SwitchTo64BitMode + ("CurrentLocale", ULONG), + ("FpSoftwareStatusRegister", ULONG), + ("SystemReserved1", PVOID * 54), + ("Spare1", PVOID), + ("ExceptionCode", ULONG), + ("ActivationContextStackPointer", PVOID), # PACTIVATION_CONTEXT_STACK + ("SpareBytes1", ULONG * 36), + ("TxFsContext", ULONG), + ("GdiTebBatch", GDI_TEB_BATCH), + ("RealClientId", CLIENT_ID), + ("GdiCachedProcessHandle", PVOID), + ("GdiClientPID", ULONG), + ("GdiClientTID", ULONG), + ("GdiThreadLocalInfo", PVOID), + ("Win32ClientInfo", PVOID * 62), + ("glDispatchTable", PVOID * 233), + ("glReserved1", ULONG * 29), + ("glReserved2", PVOID), + ("glSectionInfo", PVOID), + ("glSection", PVOID), + ("glTable", PVOID), + ("glCurrentRC", PVOID), + ("glContext", PVOID), + ("LastStatusValue", NTSTATUS), + ("StaticUnicodeString", UNICODE_STRING), + ("StaticUnicodeBuffer", WCHAR * 261), + ("DeallocationStack", PVOID), + ("TlsSlots", PVOID * 64), + ("TlsLinks", LIST_ENTRY), + ("Vdm", PVOID), + ("ReservedForNtRpc", PVOID), + ("DbgSsReserved", PVOID * 2), + ("HardErrorDisabled", ULONG), + ("Instrumentation", PVOID * 9), + ("ActivityId", GUID), + ("SubProcessTag", PVOID), + ("EtwLocalData", PVOID), + ("EtwTraceData", PVOID), + ("WinSockData", PVOID), + ("GdiBatchCount", ULONG), + ("SpareBool0", BOOLEAN), + ("SpareBool1", BOOLEAN), + ("SpareBool2", BOOLEAN), + ("IdealProcessor", UCHAR), + ("GuaranteedStackBytes", ULONG), + ("ReservedForPerf", PVOID), + ("ReservedForOle", PVOID), + ("WaitingOnLoaderLock", ULONG), + ("StackCommit", PVOID), + ("StackCommitMax", PVOID), + ("StackReserved", PVOID), + ] + + +# not really, but "dt _TEB" in w2k isn't working for me :( +_TEB_2000 = _TEB_NT + + +# +0x000 NtTib : _NT_TIB +# +0x01c EnvironmentPointer : Ptr32 Void +# +0x020 ClientId : _CLIENT_ID +# +0x028 ActiveRpcHandle : Ptr32 Void +# +0x02c ThreadLocalStoragePointer : Ptr32 Void +# +0x030 ProcessEnvironmentBlock : Ptr32 _PEB +# +0x034 LastErrorValue : Uint4B +# +0x038 CountOfOwnedCriticalSections : Uint4B +# +0x03c CsrClientThread : Ptr32 Void +# +0x040 Win32ThreadInfo : Ptr32 Void +# +0x044 User32Reserved : [26] Uint4B +# +0x0ac UserReserved : [5] Uint4B +# +0x0c0 WOW32Reserved : Ptr32 Void +# +0x0c4 CurrentLocale : Uint4B +# +0x0c8 FpSoftwareStatusRegister : Uint4B +# +0x0cc SystemReserved1 : [54] Ptr32 Void +# +0x1a4 ExceptionCode : Int4B +# +0x1a8 ActivationContextStack : _ACTIVATION_CONTEXT_STACK +# +0x1bc SpareBytes1 : [24] UChar +# +0x1d4 GdiTebBatch : _GDI_TEB_BATCH +# +0x6b4 RealClientId : _CLIENT_ID +# +0x6bc GdiCachedProcessHandle : Ptr32 Void +# +0x6c0 GdiClientPID : Uint4B +# +0x6c4 GdiClientTID : Uint4B +# +0x6c8 GdiThreadLocalInfo : Ptr32 Void +# +0x6cc Win32ClientInfo : [62] Uint4B +# +0x7c4 glDispatchTable : [233] Ptr32 Void +# +0xb68 glReserved1 : [29] Uint4B +# +0xbdc glReserved2 : Ptr32 Void +# +0xbe0 glSectionInfo : Ptr32 Void +# +0xbe4 glSection : Ptr32 Void +# +0xbe8 glTable : Ptr32 Void +# +0xbec glCurrentRC : Ptr32 Void +# +0xbf0 glContext : Ptr32 Void +# +0xbf4 LastStatusValue : Uint4B +# +0xbf8 StaticUnicodeString : _UNICODE_STRING +# +0xc00 StaticUnicodeBuffer : [261] Uint2B +# +0xe0c DeallocationStack : Ptr32 Void +# +0xe10 TlsSlots : [64] Ptr32 Void +# +0xf10 TlsLinks : _LIST_ENTRY +# +0xf18 Vdm : Ptr32 Void +# +0xf1c ReservedForNtRpc : Ptr32 Void +# +0xf20 DbgSsReserved : [2] Ptr32 Void +# +0xf28 HardErrorsAreDisabled : Uint4B +# +0xf2c Instrumentation : [16] Ptr32 Void +# +0xf6c WinSockData : Ptr32 Void +# +0xf70 GdiBatchCount : Uint4B +# +0xf74 InDbgPrint : UChar +# +0xf75 FreeStackOnTermination : UChar +# +0xf76 HasFiberData : UChar +# +0xf77 IdealProcessor : UChar +# +0xf78 Spare3 : Uint4B +# +0xf7c ReservedForPerf : Ptr32 Void +# +0xf80 ReservedForOle : Ptr32 Void +# +0xf84 WaitingOnLoaderLock : Uint4B +# +0xf88 Wx86Thread : _Wx86ThreadState +# +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void +# +0xf98 ImpersonationLocale : Uint4B +# +0xf9c IsImpersonating : Uint4B +# +0xfa0 NlsCache : Ptr32 Void +# +0xfa4 pShimData : Ptr32 Void +# +0xfa8 HeapVirtualAffinity : Uint4B +# +0xfac CurrentTransactionHandle : Ptr32 Void +# +0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME +# +0xfb4 SafeThunkCall : UChar +# +0xfb5 BooleanSpare : [3] UChar +class _TEB_XP(Structure): + _pack_ = 8 + _fields_ = [ + ("NtTib", NT_TIB), + ("EnvironmentPointer", PVOID), + ("ClientId", CLIENT_ID), + ("ActiveRpcHandle", HANDLE), + ("ThreadLocalStoragePointer", PVOID), + ("ProcessEnvironmentBlock", PVOID), # PPEB + ("LastErrorValue", DWORD), + ("CountOfOwnedCriticalSections", DWORD), + ("CsrClientThread", PVOID), + ("Win32ThreadInfo", PVOID), + ("User32Reserved", DWORD * 26), + ("UserReserved", DWORD * 5), + ("WOW32Reserved", PVOID), # ptr to wow64cpu!X86SwitchTo64BitMode + ("CurrentLocale", DWORD), + ("FpSoftwareStatusRegister", DWORD), + ("SystemReserved1", PVOID * 54), + ("ExceptionCode", SDWORD), + ("ActivationContextStackPointer", PVOID), # PACTIVATION_CONTEXT_STACK + ("SpareBytes1", UCHAR * 24), + ("TxFsContext", DWORD), + ("GdiTebBatch", GDI_TEB_BATCH), + ("RealClientId", CLIENT_ID), + ("GdiCachedProcessHandle", HANDLE), + ("GdiClientPID", DWORD), + ("GdiClientTID", DWORD), + ("GdiThreadLocalInfo", PVOID), + ("Win32ClientInfo", DWORD * 62), + ("glDispatchTable", PVOID * 233), + ("glReserved1", DWORD * 29), + ("glReserved2", PVOID), + ("glSectionInfo", PVOID), + ("glSection", PVOID), + ("glTable", PVOID), + ("glCurrentRC", PVOID), + ("glContext", PVOID), + ("LastStatusValue", NTSTATUS), + ("StaticUnicodeString", UNICODE_STRING), + ("StaticUnicodeBuffer", WCHAR * 261), + ("DeallocationStack", PVOID), + ("TlsSlots", PVOID * 64), + ("TlsLinks", LIST_ENTRY), + ("Vdm", PVOID), + ("ReservedForNtRpc", PVOID), + ("DbgSsReserved", PVOID * 2), + ("HardErrorsAreDisabled", DWORD), + ("Instrumentation", PVOID * 16), + ("WinSockData", PVOID), + ("GdiBatchCount", DWORD), + ("InDbgPrint", BOOLEAN), + ("FreeStackOnTermination", BOOLEAN), + ("HasFiberData", BOOLEAN), + ("IdealProcessor", UCHAR), + ("Spare3", DWORD), + ("ReservedForPerf", PVOID), + ("ReservedForOle", PVOID), + ("WaitingOnLoaderLock", DWORD), + ("Wx86Thread", Wx86ThreadState), + ("TlsExpansionSlots", PVOID), # Ptr32 Ptr32 Void + ("ImpersonationLocale", DWORD), + ("IsImpersonating", BOOL), + ("NlsCache", PVOID), + ("pShimData", PVOID), + ("HeapVirtualAffinity", DWORD), + ("CurrentTransactionHandle", HANDLE), + ("ActiveFrame", PVOID), # PTEB_ACTIVE_FRAME + ("SafeThunkCall", BOOLEAN), + ("BooleanSpare", BOOLEAN * 3), + ] + + +# +0x000 NtTib : _NT_TIB +# +0x038 EnvironmentPointer : Ptr64 Void +# +0x040 ClientId : _CLIENT_ID +# +0x050 ActiveRpcHandle : Ptr64 Void +# +0x058 ThreadLocalStoragePointer : Ptr64 Void +# +0x060 ProcessEnvironmentBlock : Ptr64 _PEB +# +0x068 LastErrorValue : Uint4B +# +0x06c CountOfOwnedCriticalSections : Uint4B +# +0x070 CsrClientThread : Ptr64 Void +# +0x078 Win32ThreadInfo : Ptr64 Void +# +0x080 User32Reserved : [26] Uint4B +# +0x0e8 UserReserved : [5] Uint4B +# +0x100 WOW32Reserved : Ptr64 Void +# +0x108 CurrentLocale : Uint4B +# +0x10c FpSoftwareStatusRegister : Uint4B +# +0x110 SystemReserved1 : [54] Ptr64 Void +# +0x2c0 ExceptionCode : Int4B +# +0x2c8 ActivationContextStackPointer : Ptr64 _ACTIVATION_CONTEXT_STACK +# +0x2d0 SpareBytes1 : [28] UChar +# +0x2f0 GdiTebBatch : _GDI_TEB_BATCH +# +0x7d8 RealClientId : _CLIENT_ID +# +0x7e8 GdiCachedProcessHandle : Ptr64 Void +# +0x7f0 GdiClientPID : Uint4B +# +0x7f4 GdiClientTID : Uint4B +# +0x7f8 GdiThreadLocalInfo : Ptr64 Void +# +0x800 Win32ClientInfo : [62] Uint8B +# +0x9f0 glDispatchTable : [233] Ptr64 Void +# +0x1138 glReserved1 : [29] Uint8B +# +0x1220 glReserved2 : Ptr64 Void +# +0x1228 glSectionInfo : Ptr64 Void +# +0x1230 glSection : Ptr64 Void +# +0x1238 glTable : Ptr64 Void +# +0x1240 glCurrentRC : Ptr64 Void +# +0x1248 glContext : Ptr64 Void +# +0x1250 LastStatusValue : Uint4B +# +0x1258 StaticUnicodeString : _UNICODE_STRING +# +0x1268 StaticUnicodeBuffer : [261] Uint2B +# +0x1478 DeallocationStack : Ptr64 Void +# +0x1480 TlsSlots : [64] Ptr64 Void +# +0x1680 TlsLinks : _LIST_ENTRY +# +0x1690 Vdm : Ptr64 Void +# +0x1698 ReservedForNtRpc : Ptr64 Void +# +0x16a0 DbgSsReserved : [2] Ptr64 Void +# +0x16b0 HardErrorMode : Uint4B +# +0x16b8 Instrumentation : [14] Ptr64 Void +# +0x1728 SubProcessTag : Ptr64 Void +# +0x1730 EtwTraceData : Ptr64 Void +# +0x1738 WinSockData : Ptr64 Void +# +0x1740 GdiBatchCount : Uint4B +# +0x1744 InDbgPrint : UChar +# +0x1745 FreeStackOnTermination : UChar +# +0x1746 HasFiberData : UChar +# +0x1747 IdealProcessor : UChar +# +0x1748 GuaranteedStackBytes : Uint4B +# +0x1750 ReservedForPerf : Ptr64 Void +# +0x1758 ReservedForOle : Ptr64 Void +# +0x1760 WaitingOnLoaderLock : Uint4B +# +0x1768 SparePointer1 : Uint8B +# +0x1770 SoftPatchPtr1 : Uint8B +# +0x1778 SoftPatchPtr2 : Uint8B +# +0x1780 TlsExpansionSlots : Ptr64 Ptr64 Void +# +0x1788 DeallocationBStore : Ptr64 Void +# +0x1790 BStoreLimit : Ptr64 Void +# +0x1798 ImpersonationLocale : Uint4B +# +0x179c IsImpersonating : Uint4B +# +0x17a0 NlsCache : Ptr64 Void +# +0x17a8 pShimData : Ptr64 Void +# +0x17b0 HeapVirtualAffinity : Uint4B +# +0x17b8 CurrentTransactionHandle : Ptr64 Void +# +0x17c0 ActiveFrame : Ptr64 _TEB_ACTIVE_FRAME +# +0x17c8 FlsData : Ptr64 Void +# +0x17d0 SafeThunkCall : UChar +# +0x17d1 BooleanSpare : [3] UChar +class _TEB_XP_64(Structure): + _pack_ = 8 + _fields_ = [ + ("NtTib", NT_TIB), + ("EnvironmentPointer", PVOID), + ("ClientId", CLIENT_ID), + ("ActiveRpcHandle", PVOID), + ("ThreadLocalStoragePointer", PVOID), + ("ProcessEnvironmentBlock", PVOID), # PPEB + ("LastErrorValue", DWORD), + ("CountOfOwnedCriticalSections", DWORD), + ("CsrClientThread", PVOID), + ("Win32ThreadInfo", PVOID), + ("User32Reserved", DWORD * 26), + ("UserReserved", DWORD * 5), + ("WOW32Reserved", PVOID), # ptr to wow64cpu!X86SwitchTo64BitMode + ("CurrentLocale", DWORD), + ("FpSoftwareStatusRegister", DWORD), + ("SystemReserved1", PVOID * 54), + ("ExceptionCode", SDWORD), + ("ActivationContextStackPointer", PVOID), # PACTIVATION_CONTEXT_STACK + ("SpareBytes1", UCHAR * 28), + ("GdiTebBatch", GDI_TEB_BATCH), + ("RealClientId", CLIENT_ID), + ("GdiCachedProcessHandle", HANDLE), + ("GdiClientPID", DWORD), + ("GdiClientTID", DWORD), + ("GdiThreadLocalInfo", PVOID), + ("Win32ClientInfo", QWORD * 62), + ("glDispatchTable", PVOID * 233), + ("glReserved1", QWORD * 29), + ("glReserved2", PVOID), + ("glSectionInfo", PVOID), + ("glSection", PVOID), + ("glTable", PVOID), + ("glCurrentRC", PVOID), + ("glContext", PVOID), + ("LastStatusValue", NTSTATUS), + ("StaticUnicodeString", UNICODE_STRING), + ("StaticUnicodeBuffer", WCHAR * 261), + ("DeallocationStack", PVOID), + ("TlsSlots", PVOID * 64), + ("TlsLinks", LIST_ENTRY), + ("Vdm", PVOID), + ("ReservedForNtRpc", PVOID), + ("DbgSsReserved", PVOID * 2), + ("HardErrorMode", DWORD), + ("Instrumentation", PVOID * 14), + ("SubProcessTag", PVOID), + ("EtwTraceData", PVOID), + ("WinSockData", PVOID), + ("GdiBatchCount", DWORD), + ("InDbgPrint", BOOLEAN), + ("FreeStackOnTermination", BOOLEAN), + ("HasFiberData", BOOLEAN), + ("IdealProcessor", UCHAR), + ("GuaranteedStackBytes", DWORD), + ("ReservedForPerf", PVOID), + ("ReservedForOle", PVOID), + ("WaitingOnLoaderLock", DWORD), + ("SparePointer1", PVOID), + ("SoftPatchPtr1", PVOID), + ("SoftPatchPtr2", PVOID), + ("TlsExpansionSlots", PVOID), # Ptr64 Ptr64 Void + ("DeallocationBStore", PVOID), + ("BStoreLimit", PVOID), + ("ImpersonationLocale", DWORD), + ("IsImpersonating", BOOL), + ("NlsCache", PVOID), + ("pShimData", PVOID), + ("HeapVirtualAffinity", DWORD), + ("CurrentTransactionHandle", HANDLE), + ("ActiveFrame", PVOID), # PTEB_ACTIVE_FRAME + ("FlsData", PVOID), + ("SafeThunkCall", BOOLEAN), + ("BooleanSpare", BOOLEAN * 3), + ] + + +# +0x000 NtTib : _NT_TIB +# +0x01c EnvironmentPointer : Ptr32 Void +# +0x020 ClientId : _CLIENT_ID +# +0x028 ActiveRpcHandle : Ptr32 Void +# +0x02c ThreadLocalStoragePointer : Ptr32 Void +# +0x030 ProcessEnvironmentBlock : Ptr32 _PEB +# +0x034 LastErrorValue : Uint4B +# +0x038 CountOfOwnedCriticalSections : Uint4B +# +0x03c CsrClientThread : Ptr32 Void +# +0x040 Win32ThreadInfo : Ptr32 Void +# +0x044 User32Reserved : [26] Uint4B +# +0x0ac UserReserved : [5] Uint4B +# +0x0c0 WOW32Reserved : Ptr32 Void +# +0x0c4 CurrentLocale : Uint4B +# +0x0c8 FpSoftwareStatusRegister : Uint4B +# +0x0cc SystemReserved1 : [54] Ptr32 Void +# +0x1a4 ExceptionCode : Int4B +# +0x1a8 ActivationContextStackPointer : Ptr32 _ACTIVATION_CONTEXT_STACK +# +0x1ac SpareBytes1 : [40] UChar +# +0x1d4 GdiTebBatch : _GDI_TEB_BATCH +# +0x6b4 RealClientId : _CLIENT_ID +# +0x6bc GdiCachedProcessHandle : Ptr32 Void +# +0x6c0 GdiClientPID : Uint4B +# +0x6c4 GdiClientTID : Uint4B +# +0x6c8 GdiThreadLocalInfo : Ptr32 Void +# +0x6cc Win32ClientInfo : [62] Uint4B +# +0x7c4 glDispatchTable : [233] Ptr32 Void +# +0xb68 glReserved1 : [29] Uint4B +# +0xbdc glReserved2 : Ptr32 Void +# +0xbe0 glSectionInfo : Ptr32 Void +# +0xbe4 glSection : Ptr32 Void +# +0xbe8 glTable : Ptr32 Void +# +0xbec glCurrentRC : Ptr32 Void +# +0xbf0 glContext : Ptr32 Void +# +0xbf4 LastStatusValue : Uint4B +# +0xbf8 StaticUnicodeString : _UNICODE_STRING +# +0xc00 StaticUnicodeBuffer : [261] Uint2B +# +0xe0c DeallocationStack : Ptr32 Void +# +0xe10 TlsSlots : [64] Ptr32 Void +# +0xf10 TlsLinks : _LIST_ENTRY +# +0xf18 Vdm : Ptr32 Void +# +0xf1c ReservedForNtRpc : Ptr32 Void +# +0xf20 DbgSsReserved : [2] Ptr32 Void +# +0xf28 HardErrorMode : Uint4B +# +0xf2c Instrumentation : [14] Ptr32 Void +# +0xf64 SubProcessTag : Ptr32 Void +# +0xf68 EtwTraceData : Ptr32 Void +# +0xf6c WinSockData : Ptr32 Void +# +0xf70 GdiBatchCount : Uint4B +# +0xf74 InDbgPrint : UChar +# +0xf75 FreeStackOnTermination : UChar +# +0xf76 HasFiberData : UChar +# +0xf77 IdealProcessor : UChar +# +0xf78 GuaranteedStackBytes : Uint4B +# +0xf7c ReservedForPerf : Ptr32 Void +# +0xf80 ReservedForOle : Ptr32 Void +# +0xf84 WaitingOnLoaderLock : Uint4B +# +0xf88 SparePointer1 : Uint4B +# +0xf8c SoftPatchPtr1 : Uint4B +# +0xf90 SoftPatchPtr2 : Uint4B +# +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void +# +0xf98 ImpersonationLocale : Uint4B +# +0xf9c IsImpersonating : Uint4B +# +0xfa0 NlsCache : Ptr32 Void +# +0xfa4 pShimData : Ptr32 Void +# +0xfa8 HeapVirtualAffinity : Uint4B +# +0xfac CurrentTransactionHandle : Ptr32 Void +# +0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME +# +0xfb4 FlsData : Ptr32 Void +# +0xfb8 SafeThunkCall : UChar +# +0xfb9 BooleanSpare : [3] UChar +class _TEB_2003(Structure): + _pack_ = 8 + _fields_ = [ + ("NtTib", NT_TIB), + ("EnvironmentPointer", PVOID), + ("ClientId", CLIENT_ID), + ("ActiveRpcHandle", HANDLE), + ("ThreadLocalStoragePointer", PVOID), + ("ProcessEnvironmentBlock", PVOID), # PPEB + ("LastErrorValue", DWORD), + ("CountOfOwnedCriticalSections", DWORD), + ("CsrClientThread", PVOID), + ("Win32ThreadInfo", PVOID), + ("User32Reserved", DWORD * 26), + ("UserReserved", DWORD * 5), + ("WOW32Reserved", PVOID), # ptr to wow64cpu!X86SwitchTo64BitMode + ("CurrentLocale", DWORD), + ("FpSoftwareStatusRegister", DWORD), + ("SystemReserved1", PVOID * 54), + ("ExceptionCode", SDWORD), + ("ActivationContextStackPointer", PVOID), # PACTIVATION_CONTEXT_STACK + ("SpareBytes1", UCHAR * 40), + ("GdiTebBatch", GDI_TEB_BATCH), + ("RealClientId", CLIENT_ID), + ("GdiCachedProcessHandle", HANDLE), + ("GdiClientPID", DWORD), + ("GdiClientTID", DWORD), + ("GdiThreadLocalInfo", PVOID), + ("Win32ClientInfo", DWORD * 62), + ("glDispatchTable", PVOID * 233), + ("glReserved1", DWORD * 29), + ("glReserved2", PVOID), + ("glSectionInfo", PVOID), + ("glSection", PVOID), + ("glTable", PVOID), + ("glCurrentRC", PVOID), + ("glContext", PVOID), + ("LastStatusValue", NTSTATUS), + ("StaticUnicodeString", UNICODE_STRING), + ("StaticUnicodeBuffer", WCHAR * 261), + ("DeallocationStack", PVOID), + ("TlsSlots", PVOID * 64), + ("TlsLinks", LIST_ENTRY), + ("Vdm", PVOID), + ("ReservedForNtRpc", PVOID), + ("DbgSsReserved", PVOID * 2), + ("HardErrorMode", DWORD), + ("Instrumentation", PVOID * 14), + ("SubProcessTag", PVOID), + ("EtwTraceData", PVOID), + ("WinSockData", PVOID), + ("GdiBatchCount", DWORD), + ("InDbgPrint", BOOLEAN), + ("FreeStackOnTermination", BOOLEAN), + ("HasFiberData", BOOLEAN), + ("IdealProcessor", UCHAR), + ("GuaranteedStackBytes", DWORD), + ("ReservedForPerf", PVOID), + ("ReservedForOle", PVOID), + ("WaitingOnLoaderLock", DWORD), + ("SparePointer1", PVOID), + ("SoftPatchPtr1", PVOID), + ("SoftPatchPtr2", PVOID), + ("TlsExpansionSlots", PVOID), # Ptr32 Ptr32 Void + ("ImpersonationLocale", DWORD), + ("IsImpersonating", BOOL), + ("NlsCache", PVOID), + ("pShimData", PVOID), + ("HeapVirtualAffinity", DWORD), + ("CurrentTransactionHandle", HANDLE), + ("ActiveFrame", PVOID), # PTEB_ACTIVE_FRAME + ("FlsData", PVOID), + ("SafeThunkCall", BOOLEAN), + ("BooleanSpare", BOOLEAN * 3), + ] + + +_TEB_2003_64 = _TEB_XP_64 +_TEB_2003_R2 = _TEB_2003 +_TEB_2003_R2_64 = _TEB_2003_64 + + +# +0x000 NtTib : _NT_TIB +# +0x01c EnvironmentPointer : Ptr32 Void +# +0x020 ClientId : _CLIENT_ID +# +0x028 ActiveRpcHandle : Ptr32 Void +# +0x02c ThreadLocalStoragePointer : Ptr32 Void +# +0x030 ProcessEnvironmentBlock : Ptr32 _PEB +# +0x034 LastErrorValue : Uint4B +# +0x038 CountOfOwnedCriticalSections : Uint4B +# +0x03c CsrClientThread : Ptr32 Void +# +0x040 Win32ThreadInfo : Ptr32 Void +# +0x044 User32Reserved : [26] Uint4B +# +0x0ac UserReserved : [5] Uint4B +# +0x0c0 WOW32Reserved : Ptr32 Void +# +0x0c4 CurrentLocale : Uint4B +# +0x0c8 FpSoftwareStatusRegister : Uint4B +# +0x0cc SystemReserved1 : [54] Ptr32 Void +# +0x1a4 ExceptionCode : Int4B +# +0x1a8 ActivationContextStackPointer : Ptr32 _ACTIVATION_CONTEXT_STACK +# +0x1ac SpareBytes1 : [36] UChar +# +0x1d0 TxFsContext : Uint4B +# +0x1d4 GdiTebBatch : _GDI_TEB_BATCH +# +0x6b4 RealClientId : _CLIENT_ID +# +0x6bc GdiCachedProcessHandle : Ptr32 Void +# +0x6c0 GdiClientPID : Uint4B +# +0x6c4 GdiClientTID : Uint4B +# +0x6c8 GdiThreadLocalInfo : Ptr32 Void +# +0x6cc Win32ClientInfo : [62] Uint4B +# +0x7c4 glDispatchTable : [233] Ptr32 Void +# +0xb68 glReserved1 : [29] Uint4B +# +0xbdc glReserved2 : Ptr32 Void +# +0xbe0 glSectionInfo : Ptr32 Void +# +0xbe4 glSection : Ptr32 Void +# +0xbe8 glTable : Ptr32 Void +# +0xbec glCurrentRC : Ptr32 Void +# +0xbf0 glContext : Ptr32 Void +# +0xbf4 LastStatusValue : Uint4B +# +0xbf8 StaticUnicodeString : _UNICODE_STRING +# +0xc00 StaticUnicodeBuffer : [261] Wchar +# +0xe0c DeallocationStack : Ptr32 Void +# +0xe10 TlsSlots : [64] Ptr32 Void +# +0xf10 TlsLinks : _LIST_ENTRY +# +0xf18 Vdm : Ptr32 Void +# +0xf1c ReservedForNtRpc : Ptr32 Void +# +0xf20 DbgSsReserved : [2] Ptr32 Void +# +0xf28 HardErrorMode : Uint4B +# +0xf2c Instrumentation : [9] Ptr32 Void +# +0xf50 ActivityId : _GUID +# +0xf60 SubProcessTag : Ptr32 Void +# +0xf64 EtwLocalData : Ptr32 Void +# +0xf68 EtwTraceData : Ptr32 Void +# +0xf6c WinSockData : Ptr32 Void +# +0xf70 GdiBatchCount : Uint4B +# +0xf74 SpareBool0 : UChar +# +0xf75 SpareBool1 : UChar +# +0xf76 SpareBool2 : UChar +# +0xf77 IdealProcessor : UChar +# +0xf78 GuaranteedStackBytes : Uint4B +# +0xf7c ReservedForPerf : Ptr32 Void +# +0xf80 ReservedForOle : Ptr32 Void +# +0xf84 WaitingOnLoaderLock : Uint4B +# +0xf88 SavedPriorityState : Ptr32 Void +# +0xf8c SoftPatchPtr1 : Uint4B +# +0xf90 ThreadPoolData : Ptr32 Void +# +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void +# +0xf98 ImpersonationLocale : Uint4B +# +0xf9c IsImpersonating : Uint4B +# +0xfa0 NlsCache : Ptr32 Void +# +0xfa4 pShimData : Ptr32 Void +# +0xfa8 HeapVirtualAffinity : Uint4B +# +0xfac CurrentTransactionHandle : Ptr32 Void +# +0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME +# +0xfb4 FlsData : Ptr32 Void +# +0xfb8 PreferredLanguages : Ptr32 Void +# +0xfbc UserPrefLanguages : Ptr32 Void +# +0xfc0 MergedPrefLanguages : Ptr32 Void +# +0xfc4 MuiImpersonation : Uint4B +# +0xfc8 CrossTebFlags : Uint2B +# +0xfc8 SpareCrossTebBits : Pos 0, 16 Bits +# +0xfca SameTebFlags : Uint2B +# +0xfca DbgSafeThunkCall : Pos 0, 1 Bit +# +0xfca DbgInDebugPrint : Pos 1, 1 Bit +# +0xfca DbgHasFiberData : Pos 2, 1 Bit +# +0xfca DbgSkipThreadAttach : Pos 3, 1 Bit +# +0xfca DbgWerInShipAssertCode : Pos 4, 1 Bit +# +0xfca DbgRanProcessInit : Pos 5, 1 Bit +# +0xfca DbgClonedThread : Pos 6, 1 Bit +# +0xfca DbgSuppressDebugMsg : Pos 7, 1 Bit +# +0xfca RtlDisableUserStackWalk : Pos 8, 1 Bit +# +0xfca RtlExceptionAttached : Pos 9, 1 Bit +# +0xfca SpareSameTebBits : Pos 10, 6 Bits +# +0xfcc TxnScopeEnterCallback : Ptr32 Void +# +0xfd0 TxnScopeExitCallback : Ptr32 Void +# +0xfd4 TxnScopeContext : Ptr32 Void +# +0xfd8 LockCount : Uint4B +# +0xfdc ProcessRundown : Uint4B +# +0xfe0 LastSwitchTime : Uint8B +# +0xfe8 TotalSwitchOutTime : Uint8B +# +0xff0 WaitReasonBitMap : _LARGE_INTEGER +class _TEB_2008(Structure): + _pack_ = 8 + _fields_ = [ + ("NtTib", NT_TIB), + ("EnvironmentPointer", PVOID), + ("ClientId", CLIENT_ID), + ("ActiveRpcHandle", HANDLE), + ("ThreadLocalStoragePointer", PVOID), + ("ProcessEnvironmentBlock", PVOID), # PPEB + ("LastErrorValue", DWORD), + ("CountOfOwnedCriticalSections", DWORD), + ("CsrClientThread", PVOID), + ("Win32ThreadInfo", PVOID), + ("User32Reserved", DWORD * 26), + ("UserReserved", DWORD * 5), + ("WOW32Reserved", PVOID), # ptr to wow64cpu!X86SwitchTo64BitMode + ("CurrentLocale", DWORD), + ("FpSoftwareStatusRegister", DWORD), + ("SystemReserved1", PVOID * 54), + ("ExceptionCode", SDWORD), + ("ActivationContextStackPointer", PVOID), # PACTIVATION_CONTEXT_STACK + ("SpareBytes1", UCHAR * 36), + ("TxFsContext", DWORD), + ("GdiTebBatch", GDI_TEB_BATCH), + ("RealClientId", CLIENT_ID), + ("GdiCachedProcessHandle", HANDLE), + ("GdiClientPID", DWORD), + ("GdiClientTID", DWORD), + ("GdiThreadLocalInfo", PVOID), + ("Win32ClientInfo", DWORD * 62), + ("glDispatchTable", PVOID * 233), + ("glReserved1", DWORD * 29), + ("glReserved2", PVOID), + ("glSectionInfo", PVOID), + ("glSection", PVOID), + ("glTable", PVOID), + ("glCurrentRC", PVOID), + ("glContext", PVOID), + ("LastStatusValue", NTSTATUS), + ("StaticUnicodeString", UNICODE_STRING), + ("StaticUnicodeBuffer", WCHAR * 261), + ("DeallocationStack", PVOID), + ("TlsSlots", PVOID * 64), + ("TlsLinks", LIST_ENTRY), + ("Vdm", PVOID), + ("ReservedForNtRpc", PVOID), + ("DbgSsReserved", PVOID * 2), + ("HardErrorMode", DWORD), + ("Instrumentation", PVOID * 9), + ("ActivityId", GUID), + ("SubProcessTag", PVOID), + ("EtwLocalData", PVOID), + ("EtwTraceData", PVOID), + ("WinSockData", PVOID), + ("GdiBatchCount", DWORD), + ("SpareBool0", BOOLEAN), + ("SpareBool1", BOOLEAN), + ("SpareBool2", BOOLEAN), + ("IdealProcessor", UCHAR), + ("GuaranteedStackBytes", DWORD), + ("ReservedForPerf", PVOID), + ("ReservedForOle", PVOID), + ("WaitingOnLoaderLock", DWORD), + ("SavedPriorityState", PVOID), + ("SoftPatchPtr1", PVOID), + ("ThreadPoolData", PVOID), + ("TlsExpansionSlots", PVOID), # Ptr32 Ptr32 Void + ("ImpersonationLocale", DWORD), + ("IsImpersonating", BOOL), + ("NlsCache", PVOID), + ("pShimData", PVOID), + ("HeapVirtualAffinity", DWORD), + ("CurrentTransactionHandle", HANDLE), + ("ActiveFrame", PVOID), # PTEB_ACTIVE_FRAME + ("FlsData", PVOID), + ("PreferredLanguages", PVOID), + ("UserPrefLanguages", PVOID), + ("MergedPrefLanguages", PVOID), + ("MuiImpersonation", BOOL), + ("CrossTebFlags", WORD), + ("SameTebFlags", WORD), + ("TxnScopeEnterCallback", PVOID), + ("TxnScopeExitCallback", PVOID), + ("TxnScopeContext", PVOID), + ("LockCount", DWORD), + ("ProcessRundown", DWORD), + ("LastSwitchTime", QWORD), + ("TotalSwitchOutTime", QWORD), + ("WaitReasonBitMap", LONGLONG), # LARGE_INTEGER + ] + + +# +0x000 NtTib : _NT_TIB +# +0x038 EnvironmentPointer : Ptr64 Void +# +0x040 ClientId : _CLIENT_ID +# +0x050 ActiveRpcHandle : Ptr64 Void +# +0x058 ThreadLocalStoragePointer : Ptr64 Void +# +0x060 ProcessEnvironmentBlock : Ptr64 _PEB +# +0x068 LastErrorValue : Uint4B +# +0x06c CountOfOwnedCriticalSections : Uint4B +# +0x070 CsrClientThread : Ptr64 Void +# +0x078 Win32ThreadInfo : Ptr64 Void +# +0x080 User32Reserved : [26] Uint4B +# +0x0e8 UserReserved : [5] Uint4B +# +0x100 WOW32Reserved : Ptr64 Void +# +0x108 CurrentLocale : Uint4B +# +0x10c FpSoftwareStatusRegister : Uint4B +# +0x110 SystemReserved1 : [54] Ptr64 Void +# +0x2c0 ExceptionCode : Int4B +# +0x2c8 ActivationContextStackPointer : Ptr64 _ACTIVATION_CONTEXT_STACK +# +0x2d0 SpareBytes1 : [24] UChar +# +0x2e8 TxFsContext : Uint4B +# +0x2f0 GdiTebBatch : _GDI_TEB_BATCH +# +0x7d8 RealClientId : _CLIENT_ID +# +0x7e8 GdiCachedProcessHandle : Ptr64 Void +# +0x7f0 GdiClientPID : Uint4B +# +0x7f4 GdiClientTID : Uint4B +# +0x7f8 GdiThreadLocalInfo : Ptr64 Void +# +0x800 Win32ClientInfo : [62] Uint8B +# +0x9f0 glDispatchTable : [233] Ptr64 Void +# +0x1138 glReserved1 : [29] Uint8B +# +0x1220 glReserved2 : Ptr64 Void +# +0x1228 glSectionInfo : Ptr64 Void +# +0x1230 glSection : Ptr64 Void +# +0x1238 glTable : Ptr64 Void +# +0x1240 glCurrentRC : Ptr64 Void +# +0x1248 glContext : Ptr64 Void +# +0x1250 LastStatusValue : Uint4B +# +0x1258 StaticUnicodeString : _UNICODE_STRING +# +0x1268 StaticUnicodeBuffer : [261] Wchar +# +0x1478 DeallocationStack : Ptr64 Void +# +0x1480 TlsSlots : [64] Ptr64 Void +# +0x1680 TlsLinks : _LIST_ENTRY +# +0x1690 Vdm : Ptr64 Void +# +0x1698 ReservedForNtRpc : Ptr64 Void +# +0x16a0 DbgSsReserved : [2] Ptr64 Void +# +0x16b0 HardErrorMode : Uint4B +# +0x16b8 Instrumentation : [11] Ptr64 Void +# +0x1710 ActivityId : _GUID +# +0x1720 SubProcessTag : Ptr64 Void +# +0x1728 EtwLocalData : Ptr64 Void +# +0x1730 EtwTraceData : Ptr64 Void +# +0x1738 WinSockData : Ptr64 Void +# +0x1740 GdiBatchCount : Uint4B +# +0x1744 SpareBool0 : UChar +# +0x1745 SpareBool1 : UChar +# +0x1746 SpareBool2 : UChar +# +0x1747 IdealProcessor : UChar +# +0x1748 GuaranteedStackBytes : Uint4B +# +0x1750 ReservedForPerf : Ptr64 Void +# +0x1758 ReservedForOle : Ptr64 Void +# +0x1760 WaitingOnLoaderLock : Uint4B +# +0x1768 SavedPriorityState : Ptr64 Void +# +0x1770 SoftPatchPtr1 : Uint8B +# +0x1778 ThreadPoolData : Ptr64 Void +# +0x1780 TlsExpansionSlots : Ptr64 Ptr64 Void +# +0x1788 DeallocationBStore : Ptr64 Void +# +0x1790 BStoreLimit : Ptr64 Void +# +0x1798 ImpersonationLocale : Uint4B +# +0x179c IsImpersonating : Uint4B +# +0x17a0 NlsCache : Ptr64 Void +# +0x17a8 pShimData : Ptr64 Void +# +0x17b0 HeapVirtualAffinity : Uint4B +# +0x17b8 CurrentTransactionHandle : Ptr64 Void +# +0x17c0 ActiveFrame : Ptr64 _TEB_ACTIVE_FRAME +# +0x17c8 FlsData : Ptr64 Void +# +0x17d0 PreferredLanguages : Ptr64 Void +# +0x17d8 UserPrefLanguages : Ptr64 Void +# +0x17e0 MergedPrefLanguages : Ptr64 Void +# +0x17e8 MuiImpersonation : Uint4B +# +0x17ec CrossTebFlags : Uint2B +# +0x17ec SpareCrossTebBits : Pos 0, 16 Bits +# +0x17ee SameTebFlags : Uint2B +# +0x17ee DbgSafeThunkCall : Pos 0, 1 Bit +# +0x17ee DbgInDebugPrint : Pos 1, 1 Bit +# +0x17ee DbgHasFiberData : Pos 2, 1 Bit +# +0x17ee DbgSkipThreadAttach : Pos 3, 1 Bit +# +0x17ee DbgWerInShipAssertCode : Pos 4, 1 Bit +# +0x17ee DbgRanProcessInit : Pos 5, 1 Bit +# +0x17ee DbgClonedThread : Pos 6, 1 Bit +# +0x17ee DbgSuppressDebugMsg : Pos 7, 1 Bit +# +0x17ee RtlDisableUserStackWalk : Pos 8, 1 Bit +# +0x17ee RtlExceptionAttached : Pos 9, 1 Bit +# +0x17ee SpareSameTebBits : Pos 10, 6 Bits +# +0x17f0 TxnScopeEnterCallback : Ptr64 Void +# +0x17f8 TxnScopeExitCallback : Ptr64 Void +# +0x1800 TxnScopeContext : Ptr64 Void +# +0x1808 LockCount : Uint4B +# +0x180c ProcessRundown : Uint4B +# +0x1810 LastSwitchTime : Uint8B +# +0x1818 TotalSwitchOutTime : Uint8B +# +0x1820 WaitReasonBitMap : _LARGE_INTEGER +class _TEB_2008_64(Structure): + _pack_ = 8 + _fields_ = [ + ("NtTib", NT_TIB), + ("EnvironmentPointer", PVOID), + ("ClientId", CLIENT_ID), + ("ActiveRpcHandle", HANDLE), + ("ThreadLocalStoragePointer", PVOID), + ("ProcessEnvironmentBlock", PVOID), # PPEB + ("LastErrorValue", DWORD), + ("CountOfOwnedCriticalSections", DWORD), + ("CsrClientThread", PVOID), + ("Win32ThreadInfo", PVOID), + ("User32Reserved", DWORD * 26), + ("UserReserved", DWORD * 5), + ("WOW32Reserved", PVOID), # ptr to wow64cpu!X86SwitchTo64BitMode + ("CurrentLocale", DWORD), + ("FpSoftwareStatusRegister", DWORD), + ("SystemReserved1", PVOID * 54), + ("ExceptionCode", SDWORD), + ("ActivationContextStackPointer", PVOID), # PACTIVATION_CONTEXT_STACK + ("SpareBytes1", UCHAR * 24), + ("TxFsContext", DWORD), + ("GdiTebBatch", GDI_TEB_BATCH), + ("RealClientId", CLIENT_ID), + ("GdiCachedProcessHandle", HANDLE), + ("GdiClientPID", DWORD), + ("GdiClientTID", DWORD), + ("GdiThreadLocalInfo", PVOID), + ("Win32ClientInfo", QWORD * 62), + ("glDispatchTable", PVOID * 233), + ("glReserved1", QWORD * 29), + ("glReserved2", PVOID), + ("glSectionInfo", PVOID), + ("glSection", PVOID), + ("glTable", PVOID), + ("glCurrentRC", PVOID), + ("glContext", PVOID), + ("LastStatusValue", NTSTATUS), + ("StaticUnicodeString", UNICODE_STRING), + ("StaticUnicodeBuffer", WCHAR * 261), + ("DeallocationStack", PVOID), + ("TlsSlots", PVOID * 64), + ("TlsLinks", LIST_ENTRY), + ("Vdm", PVOID), + ("ReservedForNtRpc", PVOID), + ("DbgSsReserved", PVOID * 2), + ("HardErrorMode", DWORD), + ("Instrumentation", PVOID * 11), + ("ActivityId", GUID), + ("SubProcessTag", PVOID), + ("EtwLocalData", PVOID), + ("EtwTraceData", PVOID), + ("WinSockData", PVOID), + ("GdiBatchCount", DWORD), + ("SpareBool0", BOOLEAN), + ("SpareBool1", BOOLEAN), + ("SpareBool2", BOOLEAN), + ("IdealProcessor", UCHAR), + ("GuaranteedStackBytes", DWORD), + ("ReservedForPerf", PVOID), + ("ReservedForOle", PVOID), + ("WaitingOnLoaderLock", DWORD), + ("SavedPriorityState", PVOID), + ("SoftPatchPtr1", PVOID), + ("ThreadPoolData", PVOID), + ("TlsExpansionSlots", PVOID), # Ptr64 Ptr64 Void + ("DeallocationBStore", PVOID), + ("BStoreLimit", PVOID), + ("ImpersonationLocale", DWORD), + ("IsImpersonating", BOOL), + ("NlsCache", PVOID), + ("pShimData", PVOID), + ("HeapVirtualAffinity", DWORD), + ("CurrentTransactionHandle", HANDLE), + ("ActiveFrame", PVOID), # PTEB_ACTIVE_FRAME + ("FlsData", PVOID), + ("PreferredLanguages", PVOID), + ("UserPrefLanguages", PVOID), + ("MergedPrefLanguages", PVOID), + ("MuiImpersonation", BOOL), + ("CrossTebFlags", WORD), + ("SameTebFlags", WORD), + ("TxnScopeEnterCallback", PVOID), + ("TxnScopeExitCallback", PVOID), + ("TxnScopeContext", PVOID), + ("LockCount", DWORD), + ("ProcessRundown", DWORD), + ("LastSwitchTime", QWORD), + ("TotalSwitchOutTime", QWORD), + ("WaitReasonBitMap", LONGLONG), # LARGE_INTEGER + ] + + +# +0x000 NtTib : _NT_TIB +# +0x01c EnvironmentPointer : Ptr32 Void +# +0x020 ClientId : _CLIENT_ID +# +0x028 ActiveRpcHandle : Ptr32 Void +# +0x02c ThreadLocalStoragePointer : Ptr32 Void +# +0x030 ProcessEnvironmentBlock : Ptr32 _PEB +# +0x034 LastErrorValue : Uint4B +# +0x038 CountOfOwnedCriticalSections : Uint4B +# +0x03c CsrClientThread : Ptr32 Void +# +0x040 Win32ThreadInfo : Ptr32 Void +# +0x044 User32Reserved : [26] Uint4B +# +0x0ac UserReserved : [5] Uint4B +# +0x0c0 WOW32Reserved : Ptr32 Void +# +0x0c4 CurrentLocale : Uint4B +# +0x0c8 FpSoftwareStatusRegister : Uint4B +# +0x0cc SystemReserved1 : [54] Ptr32 Void +# +0x1a4 ExceptionCode : Int4B +# +0x1a8 ActivationContextStackPointer : Ptr32 _ACTIVATION_CONTEXT_STACK +# +0x1ac SpareBytes : [36] UChar +# +0x1d0 TxFsContext : Uint4B +# +0x1d4 GdiTebBatch : _GDI_TEB_BATCH +# +0x6b4 RealClientId : _CLIENT_ID +# +0x6bc GdiCachedProcessHandle : Ptr32 Void +# +0x6c0 GdiClientPID : Uint4B +# +0x6c4 GdiClientTID : Uint4B +# +0x6c8 GdiThreadLocalInfo : Ptr32 Void +# +0x6cc Win32ClientInfo : [62] Uint4B +# +0x7c4 glDispatchTable : [233] Ptr32 Void +# +0xb68 glReserved1 : [29] Uint4B +# +0xbdc glReserved2 : Ptr32 Void +# +0xbe0 glSectionInfo : Ptr32 Void +# +0xbe4 glSection : Ptr32 Void +# +0xbe8 glTable : Ptr32 Void +# +0xbec glCurrentRC : Ptr32 Void +# +0xbf0 glContext : Ptr32 Void +# +0xbf4 LastStatusValue : Uint4B +# +0xbf8 StaticUnicodeString : _UNICODE_STRING +# +0xc00 StaticUnicodeBuffer : [261] Wchar +# +0xe0c DeallocationStack : Ptr32 Void +# +0xe10 TlsSlots : [64] Ptr32 Void +# +0xf10 TlsLinks : _LIST_ENTRY +# +0xf18 Vdm : Ptr32 Void +# +0xf1c ReservedForNtRpc : Ptr32 Void +# +0xf20 DbgSsReserved : [2] Ptr32 Void +# +0xf28 HardErrorMode : Uint4B +# +0xf2c Instrumentation : [9] Ptr32 Void +# +0xf50 ActivityId : _GUID +# +0xf60 SubProcessTag : Ptr32 Void +# +0xf64 EtwLocalData : Ptr32 Void +# +0xf68 EtwTraceData : Ptr32 Void +# +0xf6c WinSockData : Ptr32 Void +# +0xf70 GdiBatchCount : Uint4B +# +0xf74 CurrentIdealProcessor : _PROCESSOR_NUMBER +# +0xf74 IdealProcessorValue : Uint4B +# +0xf74 ReservedPad0 : UChar +# +0xf75 ReservedPad1 : UChar +# +0xf76 ReservedPad2 : UChar +# +0xf77 IdealProcessor : UChar +# +0xf78 GuaranteedStackBytes : Uint4B +# +0xf7c ReservedForPerf : Ptr32 Void +# +0xf80 ReservedForOle : Ptr32 Void +# +0xf84 WaitingOnLoaderLock : Uint4B +# +0xf88 SavedPriorityState : Ptr32 Void +# +0xf8c SoftPatchPtr1 : Uint4B +# +0xf90 ThreadPoolData : Ptr32 Void +# +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void +# +0xf98 MuiGeneration : Uint4B +# +0xf9c IsImpersonating : Uint4B +# +0xfa0 NlsCache : Ptr32 Void +# +0xfa4 pShimData : Ptr32 Void +# +0xfa8 HeapVirtualAffinity : Uint4B +# +0xfac CurrentTransactionHandle : Ptr32 Void +# +0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME +# +0xfb4 FlsData : Ptr32 Void +# +0xfb8 PreferredLanguages : Ptr32 Void +# +0xfbc UserPrefLanguages : Ptr32 Void +# +0xfc0 MergedPrefLanguages : Ptr32 Void +# +0xfc4 MuiImpersonation : Uint4B +# +0xfc8 CrossTebFlags : Uint2B +# +0xfc8 SpareCrossTebBits : Pos 0, 16 Bits +# +0xfca SameTebFlags : Uint2B +# +0xfca SafeThunkCall : Pos 0, 1 Bit +# +0xfca InDebugPrint : Pos 1, 1 Bit +# +0xfca HasFiberData : Pos 2, 1 Bit +# +0xfca SkipThreadAttach : Pos 3, 1 Bit +# +0xfca WerInShipAssertCode : Pos 4, 1 Bit +# +0xfca RanProcessInit : Pos 5, 1 Bit +# +0xfca ClonedThread : Pos 6, 1 Bit +# +0xfca SuppressDebugMsg : Pos 7, 1 Bit +# +0xfca DisableUserStackWalk : Pos 8, 1 Bit +# +0xfca RtlExceptionAttached : Pos 9, 1 Bit +# +0xfca InitialThread : Pos 10, 1 Bit +# +0xfca SpareSameTebBits : Pos 11, 5 Bits +# +0xfcc TxnScopeEnterCallback : Ptr32 Void +# +0xfd0 TxnScopeExitCallback : Ptr32 Void +# +0xfd4 TxnScopeContext : Ptr32 Void +# +0xfd8 LockCount : Uint4B +# +0xfdc SpareUlong0 : Uint4B +# +0xfe0 ResourceRetValue : Ptr32 Void +class _TEB_2008_R2(Structure): + _pack_ = 8 + _fields_ = [ + ("NtTib", NT_TIB), + ("EnvironmentPointer", PVOID), + ("ClientId", CLIENT_ID), + ("ActiveRpcHandle", HANDLE), + ("ThreadLocalStoragePointer", PVOID), + ("ProcessEnvironmentBlock", PVOID), # PPEB + ("LastErrorValue", DWORD), + ("CountOfOwnedCriticalSections", DWORD), + ("CsrClientThread", PVOID), + ("Win32ThreadInfo", PVOID), + ("User32Reserved", DWORD * 26), + ("UserReserved", DWORD * 5), + ("WOW32Reserved", PVOID), # ptr to wow64cpu!X86SwitchTo64BitMode + ("CurrentLocale", DWORD), + ("FpSoftwareStatusRegister", DWORD), + ("SystemReserved1", PVOID * 54), + ("ExceptionCode", SDWORD), + ("ActivationContextStackPointer", PVOID), # PACTIVATION_CONTEXT_STACK + ("SpareBytes", UCHAR * 36), + ("TxFsContext", DWORD), + ("GdiTebBatch", GDI_TEB_BATCH), + ("RealClientId", CLIENT_ID), + ("GdiCachedProcessHandle", HANDLE), + ("GdiClientPID", DWORD), + ("GdiClientTID", DWORD), + ("GdiThreadLocalInfo", PVOID), + ("Win32ClientInfo", DWORD * 62), + ("glDispatchTable", PVOID * 233), + ("glReserved1", DWORD * 29), + ("glReserved2", PVOID), + ("glSectionInfo", PVOID), + ("glSection", PVOID), + ("glTable", PVOID), + ("glCurrentRC", PVOID), + ("glContext", PVOID), + ("LastStatusValue", NTSTATUS), + ("StaticUnicodeString", UNICODE_STRING), + ("StaticUnicodeBuffer", WCHAR * 261), + ("DeallocationStack", PVOID), + ("TlsSlots", PVOID * 64), + ("TlsLinks", LIST_ENTRY), + ("Vdm", PVOID), + ("ReservedForNtRpc", PVOID), + ("DbgSsReserved", PVOID * 2), + ("HardErrorMode", DWORD), + ("Instrumentation", PVOID * 9), + ("ActivityId", GUID), + ("SubProcessTag", PVOID), + ("EtwLocalData", PVOID), + ("EtwTraceData", PVOID), + ("WinSockData", PVOID), + ("GdiBatchCount", DWORD), + ("CurrentIdealProcessor", PROCESSOR_NUMBER), + ("IdealProcessorValue", DWORD), + ("ReservedPad0", UCHAR), + ("ReservedPad1", UCHAR), + ("ReservedPad2", UCHAR), + ("IdealProcessor", UCHAR), + ("GuaranteedStackBytes", DWORD), + ("ReservedForPerf", PVOID), + ("ReservedForOle", PVOID), + ("WaitingOnLoaderLock", DWORD), + ("SavedPriorityState", PVOID), + ("SoftPatchPtr1", PVOID), + ("ThreadPoolData", PVOID), + ("TlsExpansionSlots", PVOID), # Ptr32 Ptr32 Void + ("MuiGeneration", DWORD), + ("IsImpersonating", BOOL), + ("NlsCache", PVOID), + ("pShimData", PVOID), + ("HeapVirtualAffinity", DWORD), + ("CurrentTransactionHandle", HANDLE), + ("ActiveFrame", PVOID), # PTEB_ACTIVE_FRAME + ("FlsData", PVOID), + ("PreferredLanguages", PVOID), + ("UserPrefLanguages", PVOID), + ("MergedPrefLanguages", PVOID), + ("MuiImpersonation", BOOL), + ("CrossTebFlags", WORD), + ("SameTebFlags", WORD), + ("TxnScopeEnterCallback", PVOID), + ("TxnScopeExitCallback", PVOID), + ("TxnScopeContext", PVOID), + ("LockCount", DWORD), + ("SpareUlong0", ULONG), + ("ResourceRetValue", PVOID), + ] + + +# +0x000 NtTib : _NT_TIB +# +0x038 EnvironmentPointer : Ptr64 Void +# +0x040 ClientId : _CLIENT_ID +# +0x050 ActiveRpcHandle : Ptr64 Void +# +0x058 ThreadLocalStoragePointer : Ptr64 Void +# +0x060 ProcessEnvironmentBlock : Ptr64 _PEB +# +0x068 LastErrorValue : Uint4B +# +0x06c CountOfOwnedCriticalSections : Uint4B +# +0x070 CsrClientThread : Ptr64 Void +# +0x078 Win32ThreadInfo : Ptr64 Void +# +0x080 User32Reserved : [26] Uint4B +# +0x0e8 UserReserved : [5] Uint4B +# +0x100 WOW32Reserved : Ptr64 Void +# +0x108 CurrentLocale : Uint4B +# +0x10c FpSoftwareStatusRegister : Uint4B +# +0x110 SystemReserved1 : [54] Ptr64 Void +# +0x2c0 ExceptionCode : Int4B +# +0x2c8 ActivationContextStackPointer : Ptr64 _ACTIVATION_CONTEXT_STACK +# +0x2d0 SpareBytes : [24] UChar +# +0x2e8 TxFsContext : Uint4B +# +0x2f0 GdiTebBatch : _GDI_TEB_BATCH +# +0x7d8 RealClientId : _CLIENT_ID +# +0x7e8 GdiCachedProcessHandle : Ptr64 Void +# +0x7f0 GdiClientPID : Uint4B +# +0x7f4 GdiClientTID : Uint4B +# +0x7f8 GdiThreadLocalInfo : Ptr64 Void +# +0x800 Win32ClientInfo : [62] Uint8B +# +0x9f0 glDispatchTable : [233] Ptr64 Void +# +0x1138 glReserved1 : [29] Uint8B +# +0x1220 glReserved2 : Ptr64 Void +# +0x1228 glSectionInfo : Ptr64 Void +# +0x1230 glSection : Ptr64 Void +# +0x1238 glTable : Ptr64 Void +# +0x1240 glCurrentRC : Ptr64 Void +# +0x1248 glContext : Ptr64 Void +# +0x1250 LastStatusValue : Uint4B +# +0x1258 StaticUnicodeString : _UNICODE_STRING +# +0x1268 StaticUnicodeBuffer : [261] Wchar +# +0x1478 DeallocationStack : Ptr64 Void +# +0x1480 TlsSlots : [64] Ptr64 Void +# +0x1680 TlsLinks : _LIST_ENTRY +# +0x1690 Vdm : Ptr64 Void +# +0x1698 ReservedForNtRpc : Ptr64 Void +# +0x16a0 DbgSsReserved : [2] Ptr64 Void +# +0x16b0 HardErrorMode : Uint4B +# +0x16b8 Instrumentation : [11] Ptr64 Void +# +0x1710 ActivityId : _GUID +# +0x1720 SubProcessTag : Ptr64 Void +# +0x1728 EtwLocalData : Ptr64 Void +# +0x1730 EtwTraceData : Ptr64 Void +# +0x1738 WinSockData : Ptr64 Void +# +0x1740 GdiBatchCount : Uint4B +# +0x1744 CurrentIdealProcessor : _PROCESSOR_NUMBER +# +0x1744 IdealProcessorValue : Uint4B +# +0x1744 ReservedPad0 : UChar +# +0x1745 ReservedPad1 : UChar +# +0x1746 ReservedPad2 : UChar +# +0x1747 IdealProcessor : UChar +# +0x1748 GuaranteedStackBytes : Uint4B +# +0x1750 ReservedForPerf : Ptr64 Void +# +0x1758 ReservedForOle : Ptr64 Void +# +0x1760 WaitingOnLoaderLock : Uint4B +# +0x1768 SavedPriorityState : Ptr64 Void +# +0x1770 SoftPatchPtr1 : Uint8B +# +0x1778 ThreadPoolData : Ptr64 Void +# +0x1780 TlsExpansionSlots : Ptr64 Ptr64 Void +# +0x1788 DeallocationBStore : Ptr64 Void +# +0x1790 BStoreLimit : Ptr64 Void +# +0x1798 MuiGeneration : Uint4B +# +0x179c IsImpersonating : Uint4B +# +0x17a0 NlsCache : Ptr64 Void +# +0x17a8 pShimData : Ptr64 Void +# +0x17b0 HeapVirtualAffinity : Uint4B +# +0x17b8 CurrentTransactionHandle : Ptr64 Void +# +0x17c0 ActiveFrame : Ptr64 _TEB_ACTIVE_FRAME +# +0x17c8 FlsData : Ptr64 Void +# +0x17d0 PreferredLanguages : Ptr64 Void +# +0x17d8 UserPrefLanguages : Ptr64 Void +# +0x17e0 MergedPrefLanguages : Ptr64 Void +# +0x17e8 MuiImpersonation : Uint4B +# +0x17ec CrossTebFlags : Uint2B +# +0x17ec SpareCrossTebBits : Pos 0, 16 Bits +# +0x17ee SameTebFlags : Uint2B +# +0x17ee SafeThunkCall : Pos 0, 1 Bit +# +0x17ee InDebugPrint : Pos 1, 1 Bit +# +0x17ee HasFiberData : Pos 2, 1 Bit +# +0x17ee SkipThreadAttach : Pos 3, 1 Bit +# +0x17ee WerInShipAssertCode : Pos 4, 1 Bit +# +0x17ee RanProcessInit : Pos 5, 1 Bit +# +0x17ee ClonedThread : Pos 6, 1 Bit +# +0x17ee SuppressDebugMsg : Pos 7, 1 Bit +# +0x17ee DisableUserStackWalk : Pos 8, 1 Bit +# +0x17ee RtlExceptionAttached : Pos 9, 1 Bit +# +0x17ee InitialThread : Pos 10, 1 Bit +# +0x17ee SpareSameTebBits : Pos 11, 5 Bits +# +0x17f0 TxnScopeEnterCallback : Ptr64 Void +# +0x17f8 TxnScopeExitCallback : Ptr64 Void +# +0x1800 TxnScopeContext : Ptr64 Void +# +0x1808 LockCount : Uint4B +# +0x180c SpareUlong0 : Uint4B +# +0x1810 ResourceRetValue : Ptr64 Void +class _TEB_2008_R2_64(Structure): + _pack_ = 8 + _fields_ = [ + ("NtTib", NT_TIB), + ("EnvironmentPointer", PVOID), + ("ClientId", CLIENT_ID), + ("ActiveRpcHandle", HANDLE), + ("ThreadLocalStoragePointer", PVOID), + ("ProcessEnvironmentBlock", PVOID), # PPEB + ("LastErrorValue", DWORD), + ("CountOfOwnedCriticalSections", DWORD), + ("CsrClientThread", PVOID), + ("Win32ThreadInfo", PVOID), + ("User32Reserved", DWORD * 26), + ("UserReserved", DWORD * 5), + ("WOW32Reserved", PVOID), # ptr to wow64cpu!X86SwitchTo64BitMode + ("CurrentLocale", DWORD), + ("FpSoftwareStatusRegister", DWORD), + ("SystemReserved1", PVOID * 54), + ("ExceptionCode", SDWORD), + ("ActivationContextStackPointer", PVOID), # PACTIVATION_CONTEXT_STACK + ("SpareBytes", UCHAR * 24), + ("TxFsContext", DWORD), + ("GdiTebBatch", GDI_TEB_BATCH), + ("RealClientId", CLIENT_ID), + ("GdiCachedProcessHandle", HANDLE), + ("GdiClientPID", DWORD), + ("GdiClientTID", DWORD), + ("GdiThreadLocalInfo", PVOID), + ("Win32ClientInfo", DWORD * 62), + ("glDispatchTable", PVOID * 233), + ("glReserved1", QWORD * 29), + ("glReserved2", PVOID), + ("glSectionInfo", PVOID), + ("glSection", PVOID), + ("glTable", PVOID), + ("glCurrentRC", PVOID), + ("glContext", PVOID), + ("LastStatusValue", NTSTATUS), + ("StaticUnicodeString", UNICODE_STRING), + ("StaticUnicodeBuffer", WCHAR * 261), + ("DeallocationStack", PVOID), + ("TlsSlots", PVOID * 64), + ("TlsLinks", LIST_ENTRY), + ("Vdm", PVOID), + ("ReservedForNtRpc", PVOID), + ("DbgSsReserved", PVOID * 2), + ("HardErrorMode", DWORD), + ("Instrumentation", PVOID * 11), + ("ActivityId", GUID), + ("SubProcessTag", PVOID), + ("EtwLocalData", PVOID), + ("EtwTraceData", PVOID), + ("WinSockData", PVOID), + ("GdiBatchCount", DWORD), + ("CurrentIdealProcessor", PROCESSOR_NUMBER), + ("IdealProcessorValue", DWORD), + ("ReservedPad0", UCHAR), + ("ReservedPad1", UCHAR), + ("ReservedPad2", UCHAR), + ("IdealProcessor", UCHAR), + ("GuaranteedStackBytes", DWORD), + ("ReservedForPerf", PVOID), + ("ReservedForOle", PVOID), + ("WaitingOnLoaderLock", DWORD), + ("SavedPriorityState", PVOID), + ("SoftPatchPtr1", PVOID), + ("ThreadPoolData", PVOID), + ("TlsExpansionSlots", PVOID), # Ptr64 Ptr64 Void + ("DeallocationBStore", PVOID), + ("BStoreLimit", PVOID), + ("MuiGeneration", DWORD), + ("IsImpersonating", BOOL), + ("NlsCache", PVOID), + ("pShimData", PVOID), + ("HeapVirtualAffinity", DWORD), + ("CurrentTransactionHandle", HANDLE), + ("ActiveFrame", PVOID), # PTEB_ACTIVE_FRAME + ("FlsData", PVOID), + ("PreferredLanguages", PVOID), + ("UserPrefLanguages", PVOID), + ("MergedPrefLanguages", PVOID), + ("MuiImpersonation", BOOL), + ("CrossTebFlags", WORD), + ("SameTebFlags", WORD), + ("TxnScopeEnterCallback", PVOID), + ("TxnScopeExitCallback", PVOID), + ("TxnScopeContext", PVOID), + ("LockCount", DWORD), + ("SpareUlong0", ULONG), + ("ResourceRetValue", PVOID), + ] + + +_TEB_Vista = _TEB_2008 +_TEB_Vista_64 = _TEB_2008_64 +_TEB_W7 = _TEB_2008_R2 +_TEB_W7_64 = _TEB_2008_R2_64 + + +# Use the correct TEB structure definition. +# Defaults to the latest Windows version. +class TEB(Structure): + _pack_ = 8 + if os == "Windows NT": + _pack_ = _TEB_NT._pack_ + _fields_ = _TEB_NT._fields_ + elif os == "Windows 2000": + _pack_ = _TEB_2000._pack_ + _fields_ = _TEB_2000._fields_ + elif os == "Windows XP": + _fields_ = _TEB_XP._fields_ + elif os == "Windows XP (64 bits)": + _fields_ = _TEB_XP_64._fields_ + elif os == "Windows 2003": + _fields_ = _TEB_2003._fields_ + elif os == "Windows 2003 (64 bits)": + _fields_ = _TEB_2003_64._fields_ + elif os == "Windows 2008": + _fields_ = _TEB_2008._fields_ + elif os == "Windows 2008 (64 bits)": + _fields_ = _TEB_2008_64._fields_ + elif os == "Windows 2003 R2": + _fields_ = _TEB_2003_R2._fields_ + elif os == "Windows 2003 R2 (64 bits)": + _fields_ = _TEB_2003_R2_64._fields_ + elif os == "Windows 2008 R2": + _fields_ = _TEB_2008_R2._fields_ + elif os == "Windows 2008 R2 (64 bits)": + _fields_ = _TEB_2008_R2_64._fields_ + elif os == "Windows Vista": + _fields_ = _TEB_Vista._fields_ + elif os == "Windows Vista (64 bits)": + _fields_ = _TEB_Vista_64._fields_ + elif os == "Windows 7": + _fields_ = _TEB_W7._fields_ + elif os == "Windows 7 (64 bits)": + _fields_ = _TEB_W7_64._fields_ + elif sizeof(SIZE_T) == sizeof(DWORD): + _fields_ = _TEB_W7._fields_ + else: + _fields_ = _TEB_W7_64._fields_ + + +PTEB = POINTER(TEB) + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/psapi.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/psapi.py new file mode 100644 index 0000000..7cdf1bc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/psapi.py @@ -0,0 +1,410 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for psapi.dll in ctypes. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- PSAPI structures and constants ------------------------------------------- + +LIST_MODULES_DEFAULT = 0x00 +LIST_MODULES_32BIT = 0x01 +LIST_MODULES_64BIT = 0x02 +LIST_MODULES_ALL = 0x03 + + +# typedef struct _MODULEINFO { +# LPVOID lpBaseOfDll; +# DWORD SizeOfImage; +# LPVOID EntryPoint; +# } MODULEINFO, *LPMODULEINFO; +class MODULEINFO(Structure): + _fields_ = [ + ("lpBaseOfDll", LPVOID), # remote pointer + ("SizeOfImage", DWORD), + ("EntryPoint", LPVOID), # remote pointer + ] + + +LPMODULEINFO = POINTER(MODULEINFO) + +# --- psapi.dll ---------------------------------------------------------------- + + +# BOOL WINAPI EnumDeviceDrivers( +# __out LPVOID *lpImageBase, +# __in DWORD cb, +# __out LPDWORD lpcbNeeded +# ); +def EnumDeviceDrivers(): + _EnumDeviceDrivers = windll.psapi.EnumDeviceDrivers + _EnumDeviceDrivers.argtypes = [LPVOID, DWORD, LPDWORD] + _EnumDeviceDrivers.restype = bool + _EnumDeviceDrivers.errcheck = RaiseIfZero + + size = 0x1000 + lpcbNeeded = DWORD(size) + unit = sizeof(LPVOID) + while 1: + lpImageBase = (LPVOID * (size // unit))() + _EnumDeviceDrivers(byref(lpImageBase), lpcbNeeded, byref(lpcbNeeded)) + needed = lpcbNeeded.value + if needed <= size: + break + size = needed + return [lpImageBase[index] for index in compat.xrange(0, (needed // unit))] + + +# BOOL WINAPI EnumProcesses( +# __out DWORD *pProcessIds, +# __in DWORD cb, +# __out DWORD *pBytesReturned +# ); +def EnumProcesses(): + _EnumProcesses = windll.psapi.EnumProcesses + _EnumProcesses.argtypes = [LPVOID, DWORD, LPDWORD] + _EnumProcesses.restype = bool + _EnumProcesses.errcheck = RaiseIfZero + + size = 0x1000 + cbBytesReturned = DWORD() + unit = sizeof(DWORD) + while 1: + ProcessIds = (DWORD * (size // unit))() + cbBytesReturned.value = size + _EnumProcesses(byref(ProcessIds), cbBytesReturned, byref(cbBytesReturned)) + returned = cbBytesReturned.value + if returned < size: + break + size = size + 0x1000 + ProcessIdList = list() + for ProcessId in ProcessIds: + if ProcessId is None: + break + ProcessIdList.append(ProcessId) + return ProcessIdList + + +# BOOL WINAPI EnumProcessModules( +# __in HANDLE hProcess, +# __out HMODULE *lphModule, +# __in DWORD cb, +# __out LPDWORD lpcbNeeded +# ); +def EnumProcessModules(hProcess): + _EnumProcessModules = windll.psapi.EnumProcessModules + _EnumProcessModules.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD] + _EnumProcessModules.restype = bool + _EnumProcessModules.errcheck = RaiseIfZero + + size = 0x1000 + lpcbNeeded = DWORD(size) + unit = sizeof(HMODULE) + while 1: + lphModule = (HMODULE * (size // unit))() + _EnumProcessModules(hProcess, byref(lphModule), lpcbNeeded, byref(lpcbNeeded)) + needed = lpcbNeeded.value + if needed <= size: + break + size = needed + return [lphModule[index] for index in compat.xrange(0, int(needed // unit))] + + +# BOOL WINAPI EnumProcessModulesEx( +# __in HANDLE hProcess, +# __out HMODULE *lphModule, +# __in DWORD cb, +# __out LPDWORD lpcbNeeded, +# __in DWORD dwFilterFlag +# ); +def EnumProcessModulesEx(hProcess, dwFilterFlag=LIST_MODULES_DEFAULT): + _EnumProcessModulesEx = windll.psapi.EnumProcessModulesEx + _EnumProcessModulesEx.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, DWORD] + _EnumProcessModulesEx.restype = bool + _EnumProcessModulesEx.errcheck = RaiseIfZero + + size = 0x1000 + lpcbNeeded = DWORD(size) + unit = sizeof(HMODULE) + while 1: + lphModule = (HMODULE * (size // unit))() + _EnumProcessModulesEx(hProcess, byref(lphModule), lpcbNeeded, byref(lpcbNeeded), dwFilterFlag) + needed = lpcbNeeded.value + if needed <= size: + break + size = needed + return [lphModule[index] for index in compat.xrange(0, (needed // unit))] + + +# DWORD WINAPI GetDeviceDriverBaseName( +# __in LPVOID ImageBase, +# __out LPTSTR lpBaseName, +# __in DWORD nSize +# ); +def GetDeviceDriverBaseNameA(ImageBase): + _GetDeviceDriverBaseNameA = windll.psapi.GetDeviceDriverBaseNameA + _GetDeviceDriverBaseNameA.argtypes = [LPVOID, LPSTR, DWORD] + _GetDeviceDriverBaseNameA.restype = DWORD + + nSize = MAX_PATH + while 1: + lpBaseName = ctypes.create_string_buffer("", nSize) + nCopied = _GetDeviceDriverBaseNameA(ImageBase, lpBaseName, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpBaseName.value + + +def GetDeviceDriverBaseNameW(ImageBase): + _GetDeviceDriverBaseNameW = windll.psapi.GetDeviceDriverBaseNameW + _GetDeviceDriverBaseNameW.argtypes = [LPVOID, LPWSTR, DWORD] + _GetDeviceDriverBaseNameW.restype = DWORD + + nSize = MAX_PATH + while 1: + lpBaseName = ctypes.create_unicode_buffer("", nSize) + nCopied = _GetDeviceDriverBaseNameW(ImageBase, lpBaseName, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpBaseName.value + + +GetDeviceDriverBaseName = GuessStringType(GetDeviceDriverBaseNameA, GetDeviceDriverBaseNameW) + + +# DWORD WINAPI GetDeviceDriverFileName( +# __in LPVOID ImageBase, +# __out LPTSTR lpFilename, +# __in DWORD nSize +# ); +def GetDeviceDriverFileNameA(ImageBase): + _GetDeviceDriverFileNameA = windll.psapi.GetDeviceDriverFileNameA + _GetDeviceDriverFileNameA.argtypes = [LPVOID, LPSTR, DWORD] + _GetDeviceDriverFileNameA.restype = DWORD + + nSize = MAX_PATH + while 1: + lpFilename = ctypes.create_string_buffer("", nSize) + nCopied = ctypes.windll.psapi.GetDeviceDriverFileNameA(ImageBase, lpFilename, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpFilename.value + + +def GetDeviceDriverFileNameW(ImageBase): + _GetDeviceDriverFileNameW = windll.psapi.GetDeviceDriverFileNameW + _GetDeviceDriverFileNameW.argtypes = [LPVOID, LPWSTR, DWORD] + _GetDeviceDriverFileNameW.restype = DWORD + + nSize = MAX_PATH + while 1: + lpFilename = ctypes.create_unicode_buffer("", nSize) + nCopied = ctypes.windll.psapi.GetDeviceDriverFileNameW(ImageBase, lpFilename, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpFilename.value + + +GetDeviceDriverFileName = GuessStringType(GetDeviceDriverFileNameA, GetDeviceDriverFileNameW) + + +# DWORD WINAPI GetMappedFileName( +# __in HANDLE hProcess, +# __in LPVOID lpv, +# __out LPTSTR lpFilename, +# __in DWORD nSize +# ); +def GetMappedFileNameA(hProcess, lpv): + _GetMappedFileNameA = ctypes.windll.psapi.GetMappedFileNameA + _GetMappedFileNameA.argtypes = [HANDLE, LPVOID, LPSTR, DWORD] + _GetMappedFileNameA.restype = DWORD + + nSize = MAX_PATH + while 1: + lpFilename = ctypes.create_string_buffer("", nSize) + nCopied = _GetMappedFileNameA(hProcess, lpv, lpFilename, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpFilename.value + + +def GetMappedFileNameW(hProcess, lpv): + _GetMappedFileNameW = ctypes.windll.psapi.GetMappedFileNameW + _GetMappedFileNameW.argtypes = [HANDLE, LPVOID, LPWSTR, DWORD] + _GetMappedFileNameW.restype = DWORD + + nSize = MAX_PATH + while 1: + lpFilename = ctypes.create_unicode_buffer("", nSize) + nCopied = _GetMappedFileNameW(hProcess, lpv, lpFilename, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpFilename.value + + +GetMappedFileName = GuessStringType(GetMappedFileNameA, GetMappedFileNameW) + + +# DWORD WINAPI GetModuleFileNameEx( +# __in HANDLE hProcess, +# __in_opt HMODULE hModule, +# __out LPTSTR lpFilename, +# __in DWORD nSize +# ); +def GetModuleFileNameExA(hProcess, hModule=None): + _GetModuleFileNameExA = ctypes.windll.psapi.GetModuleFileNameExA + _GetModuleFileNameExA.argtypes = [HANDLE, HMODULE, LPSTR, DWORD] + _GetModuleFileNameExA.restype = DWORD + + nSize = MAX_PATH + while 1: + lpFilename = ctypes.create_string_buffer("", nSize) + nCopied = _GetModuleFileNameExA(hProcess, hModule, lpFilename, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpFilename.value + + +def GetModuleFileNameExW(hProcess, hModule=None): + _GetModuleFileNameExW = ctypes.windll.psapi.GetModuleFileNameExW + _GetModuleFileNameExW.argtypes = [HANDLE, HMODULE, LPWSTR, DWORD] + _GetModuleFileNameExW.restype = DWORD + + nSize = MAX_PATH + while 1: + lpFilename = ctypes.create_unicode_buffer("", nSize) + nCopied = _GetModuleFileNameExW(hProcess, hModule, lpFilename, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpFilename.value + + +GetModuleFileNameEx = GuessStringType(GetModuleFileNameExA, GetModuleFileNameExW) + + +# BOOL WINAPI GetModuleInformation( +# __in HANDLE hProcess, +# __in HMODULE hModule, +# __out LPMODULEINFO lpmodinfo, +# __in DWORD cb +# ); +def GetModuleInformation(hProcess, hModule, lpmodinfo=None): + _GetModuleInformation = windll.psapi.GetModuleInformation + _GetModuleInformation.argtypes = [HANDLE, HMODULE, LPMODULEINFO, DWORD] + _GetModuleInformation.restype = bool + _GetModuleInformation.errcheck = RaiseIfZero + + if lpmodinfo is None: + lpmodinfo = MODULEINFO() + _GetModuleInformation(hProcess, hModule, byref(lpmodinfo), sizeof(lpmodinfo)) + return lpmodinfo + + +# DWORD WINAPI GetProcessImageFileName( +# __in HANDLE hProcess, +# __out LPTSTR lpImageFileName, +# __in DWORD nSize +# ); +def GetProcessImageFileNameA(hProcess): + _GetProcessImageFileNameA = windll.psapi.GetProcessImageFileNameA + _GetProcessImageFileNameA.argtypes = [HANDLE, LPSTR, DWORD] + _GetProcessImageFileNameA.restype = DWORD + + nSize = MAX_PATH + while 1: + lpFilename = ctypes.create_string_buffer("", nSize) + nCopied = _GetProcessImageFileNameA(hProcess, lpFilename, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpFilename.value + + +def GetProcessImageFileNameW(hProcess): + _GetProcessImageFileNameW = windll.psapi.GetProcessImageFileNameW + _GetProcessImageFileNameW.argtypes = [HANDLE, LPWSTR, DWORD] + _GetProcessImageFileNameW.restype = DWORD + + nSize = MAX_PATH + while 1: + lpFilename = ctypes.create_unicode_buffer("", nSize) + nCopied = _GetProcessImageFileNameW(hProcess, lpFilename, nSize) + if nCopied == 0: + raise ctypes.WinError() + if nCopied < (nSize - 1): + break + nSize = nSize + MAX_PATH + return lpFilename.value + + +GetProcessImageFileName = GuessStringType(GetProcessImageFileNameA, GetProcessImageFileNameW) + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shell32.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shell32.py new file mode 100644 index 0000000..1447da7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shell32.py @@ -0,0 +1,403 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for shell32.dll in ctypes. +""" + +# TODO +# * Add a class wrapper to SHELLEXECUTEINFO +# * More logic into ShellExecuteEx + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.kernel32 import LocalFree + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- Constants ---------------------------------------------------------------- + +SEE_MASK_DEFAULT = 0x00000000 +SEE_MASK_CLASSNAME = 0x00000001 +SEE_MASK_CLASSKEY = 0x00000003 +SEE_MASK_IDLIST = 0x00000004 +SEE_MASK_INVOKEIDLIST = 0x0000000C +SEE_MASK_ICON = 0x00000010 +SEE_MASK_HOTKEY = 0x00000020 +SEE_MASK_NOCLOSEPROCESS = 0x00000040 +SEE_MASK_CONNECTNETDRV = 0x00000080 +SEE_MASK_NOASYNC = 0x00000100 +SEE_MASK_DOENVSUBST = 0x00000200 +SEE_MASK_FLAG_NO_UI = 0x00000400 +SEE_MASK_UNICODE = 0x00004000 +SEE_MASK_NO_CONSOLE = 0x00008000 +SEE_MASK_ASYNCOK = 0x00100000 +SEE_MASK_HMONITOR = 0x00200000 +SEE_MASK_NOZONECHECKS = 0x00800000 +SEE_MASK_WAITFORINPUTIDLE = 0x02000000 +SEE_MASK_FLAG_LOG_USAGE = 0x04000000 + +SE_ERR_FNF = 2 +SE_ERR_PNF = 3 +SE_ERR_ACCESSDENIED = 5 +SE_ERR_OOM = 8 +SE_ERR_DLLNOTFOUND = 32 +SE_ERR_SHARE = 26 +SE_ERR_ASSOCINCOMPLETE = 27 +SE_ERR_DDETIMEOUT = 28 +SE_ERR_DDEFAIL = 29 +SE_ERR_DDEBUSY = 30 +SE_ERR_NOASSOC = 31 + +SHGFP_TYPE_CURRENT = 0 +SHGFP_TYPE_DEFAULT = 1 + +CSIDL_DESKTOP = 0x0000 +CSIDL_INTERNET = 0x0001 +CSIDL_PROGRAMS = 0x0002 +CSIDL_CONTROLS = 0x0003 +CSIDL_PRINTERS = 0x0004 +CSIDL_PERSONAL = 0x0005 +CSIDL_FAVORITES = 0x0006 +CSIDL_STARTUP = 0x0007 +CSIDL_RECENT = 0x0008 +CSIDL_SENDTO = 0x0009 +CSIDL_BITBUCKET = 0x000A +CSIDL_STARTMENU = 0x000B +CSIDL_MYDOCUMENTS = CSIDL_PERSONAL +CSIDL_MYMUSIC = 0x000D +CSIDL_MYVIDEO = 0x000E +CSIDL_DESKTOPDIRECTORY = 0x0010 +CSIDL_DRIVES = 0x0011 +CSIDL_NETWORK = 0x0012 +CSIDL_NETHOOD = 0x0013 +CSIDL_FONTS = 0x0014 +CSIDL_TEMPLATES = 0x0015 +CSIDL_COMMON_STARTMENU = 0x0016 +CSIDL_COMMON_PROGRAMS = 0x0017 +CSIDL_COMMON_STARTUP = 0x0018 +CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019 +CSIDL_APPDATA = 0x001A +CSIDL_PRINTHOOD = 0x001B +CSIDL_LOCAL_APPDATA = 0x001C +CSIDL_ALTSTARTUP = 0x001D +CSIDL_COMMON_ALTSTARTUP = 0x001E +CSIDL_COMMON_FAVORITES = 0x001F +CSIDL_INTERNET_CACHE = 0x0020 +CSIDL_COOKIES = 0x0021 +CSIDL_HISTORY = 0x0022 +CSIDL_COMMON_APPDATA = 0x0023 +CSIDL_WINDOWS = 0x0024 +CSIDL_SYSTEM = 0x0025 +CSIDL_PROGRAM_FILES = 0x0026 +CSIDL_MYPICTURES = 0x0027 +CSIDL_PROFILE = 0x0028 +CSIDL_SYSTEMX86 = 0x0029 +CSIDL_PROGRAM_FILESX86 = 0x002A +CSIDL_PROGRAM_FILES_COMMON = 0x002B +CSIDL_PROGRAM_FILES_COMMONX86 = 0x002C +CSIDL_COMMON_TEMPLATES = 0x002D +CSIDL_COMMON_DOCUMENTS = 0x002E +CSIDL_COMMON_ADMINTOOLS = 0x002F +CSIDL_ADMINTOOLS = 0x0030 +CSIDL_CONNECTIONS = 0x0031 +CSIDL_COMMON_MUSIC = 0x0035 +CSIDL_COMMON_PICTURES = 0x0036 +CSIDL_COMMON_VIDEO = 0x0037 +CSIDL_RESOURCES = 0x0038 +CSIDL_RESOURCES_LOCALIZED = 0x0039 +CSIDL_COMMON_OEM_LINKS = 0x003A +CSIDL_CDBURN_AREA = 0x003B +CSIDL_COMPUTERSNEARME = 0x003D +CSIDL_PROFILES = 0x003E + +CSIDL_FOLDER_MASK = 0x00FF + +CSIDL_FLAG_PER_USER_INIT = 0x0800 +CSIDL_FLAG_NO_ALIAS = 0x1000 +CSIDL_FLAG_DONT_VERIFY = 0x4000 +CSIDL_FLAG_CREATE = 0x8000 + +CSIDL_FLAG_MASK = 0xFF00 + +# --- Structures --------------------------------------------------------------- + +# typedef struct _SHELLEXECUTEINFO { +# DWORD cbSize; +# ULONG fMask; +# HWND hwnd; +# LPCTSTR lpVerb; +# LPCTSTR lpFile; +# LPCTSTR lpParameters; +# LPCTSTR lpDirectory; +# int nShow; +# HINSTANCE hInstApp; +# LPVOID lpIDList; +# LPCTSTR lpClass; +# HKEY hkeyClass; +# DWORD dwHotKey; +# union { +# HANDLE hIcon; +# HANDLE hMonitor; +# } DUMMYUNIONNAME; +# HANDLE hProcess; +# } SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; + + +class SHELLEXECUTEINFO(Structure): + _fields_ = [ + ("cbSize", DWORD), + ("fMask", ULONG), + ("hwnd", HWND), + ("lpVerb", LPSTR), + ("lpFile", LPSTR), + ("lpParameters", LPSTR), + ("lpDirectory", LPSTR), + ("nShow", ctypes.c_int), + ("hInstApp", HINSTANCE), + ("lpIDList", LPVOID), + ("lpClass", LPSTR), + ("hkeyClass", HKEY), + ("dwHotKey", DWORD), + ("hIcon", HANDLE), + ("hProcess", HANDLE), + ] + + def __get_hMonitor(self): + return self.hIcon + + def __set_hMonitor(self, hMonitor): + self.hIcon = hMonitor + + hMonitor = property(__get_hMonitor, __set_hMonitor) + + +LPSHELLEXECUTEINFO = POINTER(SHELLEXECUTEINFO) + +# --- shell32.dll -------------------------------------------------------------- + + +# LPWSTR *CommandLineToArgvW( +# LPCWSTR lpCmdLine, +# int *pNumArgs +# ); +def CommandLineToArgvW(lpCmdLine): + _CommandLineToArgvW = windll.shell32.CommandLineToArgvW + _CommandLineToArgvW.argtypes = [LPVOID, POINTER(ctypes.c_int)] + _CommandLineToArgvW.restype = LPVOID + + if not lpCmdLine: + lpCmdLine = None + argc = ctypes.c_int(0) + vptr = ctypes.windll.shell32.CommandLineToArgvW(lpCmdLine, byref(argc)) + if vptr == NULL: + raise ctypes.WinError() + argv = vptr + try: + argc = argc.value + if argc <= 0: + raise ctypes.WinError() + argv = ctypes.cast(argv, ctypes.POINTER(LPWSTR * argc)) + argv = [argv.contents[i] for i in compat.xrange(0, argc)] + finally: + if vptr is not None: + LocalFree(vptr) + return argv + + +def CommandLineToArgvA(lpCmdLine): + t_ansi = GuessStringType.t_ansi + t_unicode = GuessStringType.t_unicode + if isinstance(lpCmdLine, t_ansi): + cmdline = t_unicode(lpCmdLine) + else: + cmdline = lpCmdLine + return [t_ansi(x) for x in CommandLineToArgvW(cmdline)] + + +CommandLineToArgv = GuessStringType(CommandLineToArgvA, CommandLineToArgvW) + + +# HINSTANCE ShellExecute( +# HWND hwnd, +# LPCTSTR lpOperation, +# LPCTSTR lpFile, +# LPCTSTR lpParameters, +# LPCTSTR lpDirectory, +# INT nShowCmd +# ); +def ShellExecuteA(hwnd=None, lpOperation=None, lpFile=None, lpParameters=None, lpDirectory=None, nShowCmd=None): + _ShellExecuteA = windll.shell32.ShellExecuteA + _ShellExecuteA.argtypes = [HWND, LPSTR, LPSTR, LPSTR, LPSTR, INT] + _ShellExecuteA.restype = HINSTANCE + + if not nShowCmd: + nShowCmd = 0 + success = _ShellExecuteA(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd) + success = ctypes.cast(success, c_int) + success = success.value + if not success > 32: # weird! isn't it? + raise ctypes.WinError(success) + + +def ShellExecuteW(hwnd=None, lpOperation=None, lpFile=None, lpParameters=None, lpDirectory=None, nShowCmd=None): + _ShellExecuteW = windll.shell32.ShellExecuteW + _ShellExecuteW.argtypes = [HWND, LPWSTR, LPWSTR, LPWSTR, LPWSTR, INT] + _ShellExecuteW.restype = HINSTANCE + + if not nShowCmd: + nShowCmd = 0 + success = _ShellExecuteW(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd) + success = ctypes.cast(success, c_int) + success = success.value + if not success > 32: # weird! isn't it? + raise ctypes.WinError(success) + + +ShellExecute = GuessStringType(ShellExecuteA, ShellExecuteW) + + +# BOOL ShellExecuteEx( +# __inout LPSHELLEXECUTEINFO lpExecInfo +# ); +def ShellExecuteEx(lpExecInfo): + if isinstance(lpExecInfo, SHELLEXECUTEINFOA): + ShellExecuteExA(lpExecInfo) + elif isinstance(lpExecInfo, SHELLEXECUTEINFOW): + ShellExecuteExW(lpExecInfo) + else: + raise TypeError("Expected SHELLEXECUTEINFOA or SHELLEXECUTEINFOW, got %s instead" % type(lpExecInfo)) + + +def ShellExecuteExA(lpExecInfo): + _ShellExecuteExA = windll.shell32.ShellExecuteExA + _ShellExecuteExA.argtypes = [LPSHELLEXECUTEINFOA] + _ShellExecuteExA.restype = BOOL + _ShellExecuteExA.errcheck = RaiseIfZero + _ShellExecuteExA(byref(lpExecInfo)) + + +def ShellExecuteExW(lpExecInfo): + _ShellExecuteExW = windll.shell32.ShellExecuteExW + _ShellExecuteExW.argtypes = [LPSHELLEXECUTEINFOW] + _ShellExecuteExW.restype = BOOL + _ShellExecuteExW.errcheck = RaiseIfZero + _ShellExecuteExW(byref(lpExecInfo)) + + +# HINSTANCE FindExecutable( +# __in LPCTSTR lpFile, +# __in_opt LPCTSTR lpDirectory, +# __out LPTSTR lpResult +# ); +def FindExecutableA(lpFile, lpDirectory=None): + _FindExecutableA = windll.shell32.FindExecutableA + _FindExecutableA.argtypes = [LPSTR, LPSTR, LPSTR] + _FindExecutableA.restype = HINSTANCE + + lpResult = ctypes.create_string_buffer(MAX_PATH) + success = _FindExecutableA(lpFile, lpDirectory, lpResult) + success = ctypes.cast(success, ctypes.c_void_p) + success = success.value + if not success > 32: # weird! isn't it? + raise ctypes.WinError(success) + return lpResult.value + + +def FindExecutableW(lpFile, lpDirectory=None): + _FindExecutableW = windll.shell32.FindExecutableW + _FindExecutableW.argtypes = [LPWSTR, LPWSTR, LPWSTR] + _FindExecutableW.restype = HINSTANCE + + lpResult = ctypes.create_unicode_buffer(MAX_PATH) + success = _FindExecutableW(lpFile, lpDirectory, lpResult) + success = ctypes.cast(success, ctypes.c_void_p) + success = success.value + if not success > 32: # weird! isn't it? + raise ctypes.WinError(success) + return lpResult.value + + +FindExecutable = GuessStringType(FindExecutableA, FindExecutableW) + + +# HRESULT SHGetFolderPath( +# __in HWND hwndOwner, +# __in int nFolder, +# __in HANDLE hToken, +# __in DWORD dwFlags, +# __out LPTSTR pszPath +# ); +def SHGetFolderPathA(nFolder, hToken=None, dwFlags=SHGFP_TYPE_CURRENT): + _SHGetFolderPathA = windll.shell32.SHGetFolderPathA # shfolder.dll in older win versions + _SHGetFolderPathA.argtypes = [HWND, ctypes.c_int, HANDLE, DWORD, LPSTR] + _SHGetFolderPathA.restype = HRESULT + _SHGetFolderPathA.errcheck = RaiseIfNotZero # S_OK == 0 + + pszPath = ctypes.create_string_buffer(MAX_PATH + 1) + _SHGetFolderPathA(None, nFolder, hToken, dwFlags, pszPath) + return pszPath.value + + +def SHGetFolderPathW(nFolder, hToken=None, dwFlags=SHGFP_TYPE_CURRENT): + _SHGetFolderPathW = windll.shell32.SHGetFolderPathW # shfolder.dll in older win versions + _SHGetFolderPathW.argtypes = [HWND, ctypes.c_int, HANDLE, DWORD, LPWSTR] + _SHGetFolderPathW.restype = HRESULT + _SHGetFolderPathW.errcheck = RaiseIfNotZero # S_OK == 0 + + pszPath = ctypes.create_unicode_buffer(MAX_PATH + 1) + _SHGetFolderPathW(None, nFolder, hToken, dwFlags, pszPath) + return pszPath.value + + +SHGetFolderPath = DefaultStringType(SHGetFolderPathA, SHGetFolderPathW) + + +# BOOL IsUserAnAdmin(void); +def IsUserAnAdmin(): + # Supposedly, IsUserAnAdmin() is deprecated in Vista. + # But I tried it on Windows 7 and it works just fine. + _IsUserAnAdmin = windll.shell32.IsUserAnAdmin + _IsUserAnAdmin.argtypes = [] + _IsUserAnAdmin.restype = bool + return _IsUserAnAdmin() + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shlwapi.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shlwapi.py new file mode 100644 index 0000000..43dfcb5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shlwapi.py @@ -0,0 +1,838 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for shlwapi.dll in ctypes. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.kernel32 import * + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +OS_WINDOWS = 0 +OS_NT = 1 +OS_WIN95ORGREATER = 2 +OS_NT4ORGREATER = 3 +OS_WIN98ORGREATER = 5 +OS_WIN98_GOLD = 6 +OS_WIN2000ORGREATER = 7 +OS_WIN2000PRO = 8 +OS_WIN2000SERVER = 9 +OS_WIN2000ADVSERVER = 10 +OS_WIN2000DATACENTER = 11 +OS_WIN2000TERMINAL = 12 +OS_EMBEDDED = 13 +OS_TERMINALCLIENT = 14 +OS_TERMINALREMOTEADMIN = 15 +OS_WIN95_GOLD = 16 +OS_MEORGREATER = 17 +OS_XPORGREATER = 18 +OS_HOME = 19 +OS_PROFESSIONAL = 20 +OS_DATACENTER = 21 +OS_ADVSERVER = 22 +OS_SERVER = 23 +OS_TERMINALSERVER = 24 +OS_PERSONALTERMINALSERVER = 25 +OS_FASTUSERSWITCHING = 26 +OS_WELCOMELOGONUI = 27 +OS_DOMAINMEMBER = 28 +OS_ANYSERVER = 29 +OS_WOW6432 = 30 +OS_WEBSERVER = 31 +OS_SMALLBUSINESSSERVER = 32 +OS_TABLETPC = 33 +OS_SERVERADMINUI = 34 +OS_MEDIACENTER = 35 +OS_APPLIANCE = 36 + +# --- shlwapi.dll -------------------------------------------------------------- + + +# BOOL IsOS( +# DWORD dwOS +# ); +def IsOS(dwOS): + try: + _IsOS = windll.shlwapi.IsOS + _IsOS.argtypes = [DWORD] + _IsOS.restype = bool + except AttributeError: + # According to MSDN, on Windows versions prior to Vista + # this function is exported only by ordinal number 437. + # http://msdn.microsoft.com/en-us/library/bb773795%28VS.85%29.aspx + _GetProcAddress = windll.kernel32.GetProcAddress + _GetProcAddress.argtypes = [HINSTANCE, DWORD] + _GetProcAddress.restype = LPVOID + _IsOS = windll.kernel32.GetProcAddress(windll.shlwapi._handle, 437) + _IsOS = WINFUNCTYPE(bool, DWORD)(_IsOS) + return _IsOS(dwOS) + + +# LPTSTR PathAddBackslash( +# LPTSTR lpszPath +# ); +def PathAddBackslashA(lpszPath): + _PathAddBackslashA = windll.shlwapi.PathAddBackslashA + _PathAddBackslashA.argtypes = [LPSTR] + _PathAddBackslashA.restype = LPSTR + + lpszPath = ctypes.create_string_buffer(lpszPath, MAX_PATH) + retval = _PathAddBackslashA(lpszPath) + if retval == NULL: + raise ctypes.WinError() + return lpszPath.value + + +def PathAddBackslashW(lpszPath): + _PathAddBackslashW = windll.shlwapi.PathAddBackslashW + _PathAddBackslashW.argtypes = [LPWSTR] + _PathAddBackslashW.restype = LPWSTR + + lpszPath = ctypes.create_unicode_buffer(lpszPath, MAX_PATH) + retval = _PathAddBackslashW(lpszPath) + if retval == NULL: + raise ctypes.WinError() + return lpszPath.value + + +PathAddBackslash = GuessStringType(PathAddBackslashA, PathAddBackslashW) + + +# BOOL PathAddExtension( +# LPTSTR pszPath, +# LPCTSTR pszExtension +# ); +def PathAddExtensionA(lpszPath, pszExtension=None): + _PathAddExtensionA = windll.shlwapi.PathAddExtensionA + _PathAddExtensionA.argtypes = [LPSTR, LPSTR] + _PathAddExtensionA.restype = bool + _PathAddExtensionA.errcheck = RaiseIfZero + + if not pszExtension: + pszExtension = None + lpszPath = ctypes.create_string_buffer(lpszPath, MAX_PATH) + _PathAddExtensionA(lpszPath, pszExtension) + return lpszPath.value + + +def PathAddExtensionW(lpszPath, pszExtension=None): + _PathAddExtensionW = windll.shlwapi.PathAddExtensionW + _PathAddExtensionW.argtypes = [LPWSTR, LPWSTR] + _PathAddExtensionW.restype = bool + _PathAddExtensionW.errcheck = RaiseIfZero + + if not pszExtension: + pszExtension = None + lpszPath = ctypes.create_unicode_buffer(lpszPath, MAX_PATH) + _PathAddExtensionW(lpszPath, pszExtension) + return lpszPath.value + + +PathAddExtension = GuessStringType(PathAddExtensionA, PathAddExtensionW) + + +# BOOL PathAppend( +# LPTSTR pszPath, +# LPCTSTR pszMore +# ); +def PathAppendA(lpszPath, pszMore=None): + _PathAppendA = windll.shlwapi.PathAppendA + _PathAppendA.argtypes = [LPSTR, LPSTR] + _PathAppendA.restype = bool + _PathAppendA.errcheck = RaiseIfZero + + if not pszMore: + pszMore = None + lpszPath = ctypes.create_string_buffer(lpszPath, MAX_PATH) + _PathAppendA(lpszPath, pszMore) + return lpszPath.value + + +def PathAppendW(lpszPath, pszMore=None): + _PathAppendW = windll.shlwapi.PathAppendW + _PathAppendW.argtypes = [LPWSTR, LPWSTR] + _PathAppendW.restype = bool + _PathAppendW.errcheck = RaiseIfZero + + if not pszMore: + pszMore = None + lpszPath = ctypes.create_unicode_buffer(lpszPath, MAX_PATH) + _PathAppendW(lpszPath, pszMore) + return lpszPath.value + + +PathAppend = GuessStringType(PathAppendA, PathAppendW) + + +# LPTSTR PathCombine( +# LPTSTR lpszDest, +# LPCTSTR lpszDir, +# LPCTSTR lpszFile +# ); +def PathCombineA(lpszDir, lpszFile): + _PathCombineA = windll.shlwapi.PathCombineA + _PathCombineA.argtypes = [LPSTR, LPSTR, LPSTR] + _PathCombineA.restype = LPSTR + + lpszDest = ctypes.create_string_buffer("", max(MAX_PATH, len(lpszDir) + len(lpszFile) + 1)) + retval = _PathCombineA(lpszDest, lpszDir, lpszFile) + if retval == NULL: + return None + return lpszDest.value + + +def PathCombineW(lpszDir, lpszFile): + _PathCombineW = windll.shlwapi.PathCombineW + _PathCombineW.argtypes = [LPWSTR, LPWSTR, LPWSTR] + _PathCombineW.restype = LPWSTR + + lpszDest = ctypes.create_unicode_buffer("", max(MAX_PATH, len(lpszDir) + len(lpszFile) + 1)) + retval = _PathCombineW(lpszDest, lpszDir, lpszFile) + if retval == NULL: + return None + return lpszDest.value + + +PathCombine = GuessStringType(PathCombineA, PathCombineW) + + +# BOOL PathCanonicalize( +# LPTSTR lpszDst, +# LPCTSTR lpszSrc +# ); +def PathCanonicalizeA(lpszSrc): + _PathCanonicalizeA = windll.shlwapi.PathCanonicalizeA + _PathCanonicalizeA.argtypes = [LPSTR, LPSTR] + _PathCanonicalizeA.restype = bool + _PathCanonicalizeA.errcheck = RaiseIfZero + + lpszDst = ctypes.create_string_buffer("", MAX_PATH) + _PathCanonicalizeA(lpszDst, lpszSrc) + return lpszDst.value + + +def PathCanonicalizeW(lpszSrc): + _PathCanonicalizeW = windll.shlwapi.PathCanonicalizeW + _PathCanonicalizeW.argtypes = [LPWSTR, LPWSTR] + _PathCanonicalizeW.restype = bool + _PathCanonicalizeW.errcheck = RaiseIfZero + + lpszDst = ctypes.create_unicode_buffer("", MAX_PATH) + _PathCanonicalizeW(lpszDst, lpszSrc) + return lpszDst.value + + +PathCanonicalize = GuessStringType(PathCanonicalizeA, PathCanonicalizeW) + + +# BOOL PathRelativePathTo( +# _Out_ LPTSTR pszPath, +# _In_ LPCTSTR pszFrom, +# _In_ DWORD dwAttrFrom, +# _In_ LPCTSTR pszTo, +# _In_ DWORD dwAttrTo +# ); +def PathRelativePathToA(pszFrom=None, dwAttrFrom=FILE_ATTRIBUTE_DIRECTORY, pszTo=None, dwAttrTo=FILE_ATTRIBUTE_DIRECTORY): + _PathRelativePathToA = windll.shlwapi.PathRelativePathToA + _PathRelativePathToA.argtypes = [LPSTR, LPSTR, DWORD, LPSTR, DWORD] + _PathRelativePathToA.restype = bool + _PathRelativePathToA.errcheck = RaiseIfZero + + # Make the paths absolute or the function fails. + if pszFrom: + pszFrom = GetFullPathNameA(pszFrom)[0] + else: + pszFrom = GetCurrentDirectoryA() + if pszTo: + pszTo = GetFullPathNameA(pszTo)[0] + else: + pszTo = GetCurrentDirectoryA() + + # Argh, this function doesn't receive an output buffer size! + # We'll try to guess the maximum possible buffer size. + dwPath = max((len(pszFrom) + len(pszTo)) * 2 + 1, MAX_PATH + 1) + pszPath = ctypes.create_string_buffer("", dwPath) + + # Also, it doesn't set the last error value. + # Whoever coded it must have been drunk or tripping on acid. Or both. + # The only failure conditions I've seen were invalid paths, paths not + # on the same drive, or the path is not absolute. + SetLastError(ERROR_INVALID_PARAMETER) + + _PathRelativePathToA(pszPath, pszFrom, dwAttrFrom, pszTo, dwAttrTo) + return pszPath.value + + +def PathRelativePathToW(pszFrom=None, dwAttrFrom=FILE_ATTRIBUTE_DIRECTORY, pszTo=None, dwAttrTo=FILE_ATTRIBUTE_DIRECTORY): + _PathRelativePathToW = windll.shlwapi.PathRelativePathToW + _PathRelativePathToW.argtypes = [LPWSTR, LPWSTR, DWORD, LPWSTR, DWORD] + _PathRelativePathToW.restype = bool + _PathRelativePathToW.errcheck = RaiseIfZero + + # Refer to PathRelativePathToA to know why this code is so ugly. + if pszFrom: + pszFrom = GetFullPathNameW(pszFrom)[0] + else: + pszFrom = GetCurrentDirectoryW() + if pszTo: + pszTo = GetFullPathNameW(pszTo)[0] + else: + pszTo = GetCurrentDirectoryW() + dwPath = max((len(pszFrom) + len(pszTo)) * 2 + 1, MAX_PATH + 1) + pszPath = ctypes.create_unicode_buffer("", dwPath) + SetLastError(ERROR_INVALID_PARAMETER) + _PathRelativePathToW(pszPath, pszFrom, dwAttrFrom, pszTo, dwAttrTo) + return pszPath.value + + +PathRelativePathTo = GuessStringType(PathRelativePathToA, PathRelativePathToW) + + +# BOOL PathFileExists( +# LPCTSTR pszPath +# ); +def PathFileExistsA(pszPath): + _PathFileExistsA = windll.shlwapi.PathFileExistsA + _PathFileExistsA.argtypes = [LPSTR] + _PathFileExistsA.restype = bool + return _PathFileExistsA(pszPath) + + +def PathFileExistsW(pszPath): + _PathFileExistsW = windll.shlwapi.PathFileExistsW + _PathFileExistsW.argtypes = [LPWSTR] + _PathFileExistsW.restype = bool + return _PathFileExistsW(pszPath) + + +PathFileExists = GuessStringType(PathFileExistsA, PathFileExistsW) + + +# LPTSTR PathFindExtension( +# LPCTSTR pszPath +# ); +def PathFindExtensionA(pszPath): + _PathFindExtensionA = windll.shlwapi.PathFindExtensionA + _PathFindExtensionA.argtypes = [LPSTR] + _PathFindExtensionA.restype = LPSTR + pszPath = ctypes.create_string_buffer(pszPath) + return _PathFindExtensionA(pszPath) + + +def PathFindExtensionW(pszPath): + _PathFindExtensionW = windll.shlwapi.PathFindExtensionW + _PathFindExtensionW.argtypes = [LPWSTR] + _PathFindExtensionW.restype = LPWSTR + pszPath = ctypes.create_unicode_buffer(pszPath) + return _PathFindExtensionW(pszPath) + + +PathFindExtension = GuessStringType(PathFindExtensionA, PathFindExtensionW) + + +# LPTSTR PathFindFileName( +# LPCTSTR pszPath +# ); +def PathFindFileNameA(pszPath): + _PathFindFileNameA = windll.shlwapi.PathFindFileNameA + _PathFindFileNameA.argtypes = [LPSTR] + _PathFindFileNameA.restype = LPSTR + pszPath = ctypes.create_string_buffer(pszPath) + return _PathFindFileNameA(pszPath) + + +def PathFindFileNameW(pszPath): + _PathFindFileNameW = windll.shlwapi.PathFindFileNameW + _PathFindFileNameW.argtypes = [LPWSTR] + _PathFindFileNameW.restype = LPWSTR + pszPath = ctypes.create_unicode_buffer(pszPath) + return _PathFindFileNameW(pszPath) + + +PathFindFileName = GuessStringType(PathFindFileNameA, PathFindFileNameW) + + +# LPTSTR PathFindNextComponent( +# LPCTSTR pszPath +# ); +def PathFindNextComponentA(pszPath): + _PathFindNextComponentA = windll.shlwapi.PathFindNextComponentA + _PathFindNextComponentA.argtypes = [LPSTR] + _PathFindNextComponentA.restype = LPSTR + pszPath = ctypes.create_string_buffer(pszPath) + return _PathFindNextComponentA(pszPath) + + +def PathFindNextComponentW(pszPath): + _PathFindNextComponentW = windll.shlwapi.PathFindNextComponentW + _PathFindNextComponentW.argtypes = [LPWSTR] + _PathFindNextComponentW.restype = LPWSTR + pszPath = ctypes.create_unicode_buffer(pszPath) + return _PathFindNextComponentW(pszPath) + + +PathFindNextComponent = GuessStringType(PathFindNextComponentA, PathFindNextComponentW) + + +# BOOL PathFindOnPath( +# LPTSTR pszFile, +# LPCTSTR *ppszOtherDirs +# ); +def PathFindOnPathA(pszFile, ppszOtherDirs=None): + _PathFindOnPathA = windll.shlwapi.PathFindOnPathA + _PathFindOnPathA.argtypes = [LPSTR, LPSTR] + _PathFindOnPathA.restype = bool + + pszFile = ctypes.create_string_buffer(pszFile, MAX_PATH) + if not ppszOtherDirs: + ppszOtherDirs = None + else: + szArray = "" + for pszOtherDirs in ppszOtherDirs: + if pszOtherDirs: + szArray = "%s%s\0" % (szArray, pszOtherDirs) + szArray = szArray + "\0" + pszOtherDirs = ctypes.create_string_buffer(szArray) + ppszOtherDirs = ctypes.pointer(pszOtherDirs) + if _PathFindOnPathA(pszFile, ppszOtherDirs): + return pszFile.value + return None + + +def PathFindOnPathW(pszFile, ppszOtherDirs=None): + _PathFindOnPathW = windll.shlwapi.PathFindOnPathA + _PathFindOnPathW.argtypes = [LPWSTR, LPWSTR] + _PathFindOnPathW.restype = bool + + pszFile = ctypes.create_unicode_buffer(pszFile, MAX_PATH) + if not ppszOtherDirs: + ppszOtherDirs = None + else: + szArray = "" + for pszOtherDirs in ppszOtherDirs: + if pszOtherDirs: + szArray = "%s%s\0" % (szArray, pszOtherDirs) + szArray = szArray + "\0" + pszOtherDirs = ctypes.create_unicode_buffer(szArray) + ppszOtherDirs = ctypes.pointer(pszOtherDirs) + if _PathFindOnPathW(pszFile, ppszOtherDirs): + return pszFile.value + return None + + +PathFindOnPath = GuessStringType(PathFindOnPathA, PathFindOnPathW) + + +# LPTSTR PathGetArgs( +# LPCTSTR pszPath +# ); +def PathGetArgsA(pszPath): + _PathGetArgsA = windll.shlwapi.PathGetArgsA + _PathGetArgsA.argtypes = [LPSTR] + _PathGetArgsA.restype = LPSTR + pszPath = ctypes.create_string_buffer(pszPath) + return _PathGetArgsA(pszPath) + + +def PathGetArgsW(pszPath): + _PathGetArgsW = windll.shlwapi.PathGetArgsW + _PathGetArgsW.argtypes = [LPWSTR] + _PathGetArgsW.restype = LPWSTR + pszPath = ctypes.create_unicode_buffer(pszPath) + return _PathGetArgsW(pszPath) + + +PathGetArgs = GuessStringType(PathGetArgsA, PathGetArgsW) + + +# BOOL PathIsContentType( +# LPCTSTR pszPath, +# LPCTSTR pszContentType +# ); +def PathIsContentTypeA(pszPath, pszContentType): + _PathIsContentTypeA = windll.shlwapi.PathIsContentTypeA + _PathIsContentTypeA.argtypes = [LPSTR, LPSTR] + _PathIsContentTypeA.restype = bool + return _PathIsContentTypeA(pszPath, pszContentType) + + +def PathIsContentTypeW(pszPath, pszContentType): + _PathIsContentTypeW = windll.shlwapi.PathIsContentTypeW + _PathIsContentTypeW.argtypes = [LPWSTR, LPWSTR] + _PathIsContentTypeW.restype = bool + return _PathIsContentTypeW(pszPath, pszContentType) + + +PathIsContentType = GuessStringType(PathIsContentTypeA, PathIsContentTypeW) + + +# BOOL PathIsDirectory( +# LPCTSTR pszPath +# ); +def PathIsDirectoryA(pszPath): + _PathIsDirectoryA = windll.shlwapi.PathIsDirectoryA + _PathIsDirectoryA.argtypes = [LPSTR] + _PathIsDirectoryA.restype = bool + return _PathIsDirectoryA(pszPath) + + +def PathIsDirectoryW(pszPath): + _PathIsDirectoryW = windll.shlwapi.PathIsDirectoryW + _PathIsDirectoryW.argtypes = [LPWSTR] + _PathIsDirectoryW.restype = bool + return _PathIsDirectoryW(pszPath) + + +PathIsDirectory = GuessStringType(PathIsDirectoryA, PathIsDirectoryW) + + +# BOOL PathIsDirectoryEmpty( +# LPCTSTR pszPath +# ); +def PathIsDirectoryEmptyA(pszPath): + _PathIsDirectoryEmptyA = windll.shlwapi.PathIsDirectoryEmptyA + _PathIsDirectoryEmptyA.argtypes = [LPSTR] + _PathIsDirectoryEmptyA.restype = bool + return _PathIsDirectoryEmptyA(pszPath) + + +def PathIsDirectoryEmptyW(pszPath): + _PathIsDirectoryEmptyW = windll.shlwapi.PathIsDirectoryEmptyW + _PathIsDirectoryEmptyW.argtypes = [LPWSTR] + _PathIsDirectoryEmptyW.restype = bool + return _PathIsDirectoryEmptyW(pszPath) + + +PathIsDirectoryEmpty = GuessStringType(PathIsDirectoryEmptyA, PathIsDirectoryEmptyW) + + +# BOOL PathIsNetworkPath( +# LPCTSTR pszPath +# ); +def PathIsNetworkPathA(pszPath): + _PathIsNetworkPathA = windll.shlwapi.PathIsNetworkPathA + _PathIsNetworkPathA.argtypes = [LPSTR] + _PathIsNetworkPathA.restype = bool + return _PathIsNetworkPathA(pszPath) + + +def PathIsNetworkPathW(pszPath): + _PathIsNetworkPathW = windll.shlwapi.PathIsNetworkPathW + _PathIsNetworkPathW.argtypes = [LPWSTR] + _PathIsNetworkPathW.restype = bool + return _PathIsNetworkPathW(pszPath) + + +PathIsNetworkPath = GuessStringType(PathIsNetworkPathA, PathIsNetworkPathW) + + +# BOOL PathIsRelative( +# LPCTSTR lpszPath +# ); +def PathIsRelativeA(pszPath): + _PathIsRelativeA = windll.shlwapi.PathIsRelativeA + _PathIsRelativeA.argtypes = [LPSTR] + _PathIsRelativeA.restype = bool + return _PathIsRelativeA(pszPath) + + +def PathIsRelativeW(pszPath): + _PathIsRelativeW = windll.shlwapi.PathIsRelativeW + _PathIsRelativeW.argtypes = [LPWSTR] + _PathIsRelativeW.restype = bool + return _PathIsRelativeW(pszPath) + + +PathIsRelative = GuessStringType(PathIsRelativeA, PathIsRelativeW) + + +# BOOL PathIsRoot( +# LPCTSTR pPath +# ); +def PathIsRootA(pszPath): + _PathIsRootA = windll.shlwapi.PathIsRootA + _PathIsRootA.argtypes = [LPSTR] + _PathIsRootA.restype = bool + return _PathIsRootA(pszPath) + + +def PathIsRootW(pszPath): + _PathIsRootW = windll.shlwapi.PathIsRootW + _PathIsRootW.argtypes = [LPWSTR] + _PathIsRootW.restype = bool + return _PathIsRootW(pszPath) + + +PathIsRoot = GuessStringType(PathIsRootA, PathIsRootW) + + +# BOOL PathIsSameRoot( +# LPCTSTR pszPath1, +# LPCTSTR pszPath2 +# ); +def PathIsSameRootA(pszPath1, pszPath2): + _PathIsSameRootA = windll.shlwapi.PathIsSameRootA + _PathIsSameRootA.argtypes = [LPSTR, LPSTR] + _PathIsSameRootA.restype = bool + return _PathIsSameRootA(pszPath1, pszPath2) + + +def PathIsSameRootW(pszPath1, pszPath2): + _PathIsSameRootW = windll.shlwapi.PathIsSameRootW + _PathIsSameRootW.argtypes = [LPWSTR, LPWSTR] + _PathIsSameRootW.restype = bool + return _PathIsSameRootW(pszPath1, pszPath2) + + +PathIsSameRoot = GuessStringType(PathIsSameRootA, PathIsSameRootW) + + +# BOOL PathIsUNC( +# LPCTSTR pszPath +# ); +def PathIsUNCA(pszPath): + _PathIsUNCA = windll.shlwapi.PathIsUNCA + _PathIsUNCA.argtypes = [LPSTR] + _PathIsUNCA.restype = bool + return _PathIsUNCA(pszPath) + + +def PathIsUNCW(pszPath): + _PathIsUNCW = windll.shlwapi.PathIsUNCW + _PathIsUNCW.argtypes = [LPWSTR] + _PathIsUNCW.restype = bool + return _PathIsUNCW(pszPath) + + +PathIsUNC = GuessStringType(PathIsUNCA, PathIsUNCW) + +# XXX WARNING +# PathMakePretty turns filenames into all lowercase. +# I'm not sure how well that might work on Wine. + + +# BOOL PathMakePretty( +# LPCTSTR pszPath +# ); +def PathMakePrettyA(pszPath): + _PathMakePrettyA = windll.shlwapi.PathMakePrettyA + _PathMakePrettyA.argtypes = [LPSTR] + _PathMakePrettyA.restype = bool + _PathMakePrettyA.errcheck = RaiseIfZero + + pszPath = ctypes.create_string_buffer(pszPath, MAX_PATH) + _PathMakePrettyA(pszPath) + return pszPath.value + + +def PathMakePrettyW(pszPath): + _PathMakePrettyW = windll.shlwapi.PathMakePrettyW + _PathMakePrettyW.argtypes = [LPWSTR] + _PathMakePrettyW.restype = bool + _PathMakePrettyW.errcheck = RaiseIfZero + + pszPath = ctypes.create_unicode_buffer(pszPath, MAX_PATH) + _PathMakePrettyW(pszPath) + return pszPath.value + + +PathMakePretty = GuessStringType(PathMakePrettyA, PathMakePrettyW) + + +# void PathRemoveArgs( +# LPTSTR pszPath +# ); +def PathRemoveArgsA(pszPath): + _PathRemoveArgsA = windll.shlwapi.PathRemoveArgsA + _PathRemoveArgsA.argtypes = [LPSTR] + + pszPath = ctypes.create_string_buffer(pszPath, MAX_PATH) + _PathRemoveArgsA(pszPath) + return pszPath.value + + +def PathRemoveArgsW(pszPath): + _PathRemoveArgsW = windll.shlwapi.PathRemoveArgsW + _PathRemoveArgsW.argtypes = [LPWSTR] + + pszPath = ctypes.create_unicode_buffer(pszPath, MAX_PATH) + _PathRemoveArgsW(pszPath) + return pszPath.value + + +PathRemoveArgs = GuessStringType(PathRemoveArgsA, PathRemoveArgsW) + + +# void PathRemoveBackslash( +# LPTSTR pszPath +# ); +def PathRemoveBackslashA(pszPath): + _PathRemoveBackslashA = windll.shlwapi.PathRemoveBackslashA + _PathRemoveBackslashA.argtypes = [LPSTR] + + pszPath = ctypes.create_string_buffer(pszPath, MAX_PATH) + _PathRemoveBackslashA(pszPath) + return pszPath.value + + +def PathRemoveBackslashW(pszPath): + _PathRemoveBackslashW = windll.shlwapi.PathRemoveBackslashW + _PathRemoveBackslashW.argtypes = [LPWSTR] + + pszPath = ctypes.create_unicode_buffer(pszPath, MAX_PATH) + _PathRemoveBackslashW(pszPath) + return pszPath.value + + +PathRemoveBackslash = GuessStringType(PathRemoveBackslashA, PathRemoveBackslashW) + + +# void PathRemoveExtension( +# LPTSTR pszPath +# ); +def PathRemoveExtensionA(pszPath): + _PathRemoveExtensionA = windll.shlwapi.PathRemoveExtensionA + _PathRemoveExtensionA.argtypes = [LPSTR] + + pszPath = ctypes.create_string_buffer(pszPath, MAX_PATH) + _PathRemoveExtensionA(pszPath) + return pszPath.value + + +def PathRemoveExtensionW(pszPath): + _PathRemoveExtensionW = windll.shlwapi.PathRemoveExtensionW + _PathRemoveExtensionW.argtypes = [LPWSTR] + + pszPath = ctypes.create_unicode_buffer(pszPath, MAX_PATH) + _PathRemoveExtensionW(pszPath) + return pszPath.value + + +PathRemoveExtension = GuessStringType(PathRemoveExtensionA, PathRemoveExtensionW) + + +# void PathRemoveFileSpec( +# LPTSTR pszPath +# ); +def PathRemoveFileSpecA(pszPath): + _PathRemoveFileSpecA = windll.shlwapi.PathRemoveFileSpecA + _PathRemoveFileSpecA.argtypes = [LPSTR] + + pszPath = ctypes.create_string_buffer(pszPath, MAX_PATH) + _PathRemoveFileSpecA(pszPath) + return pszPath.value + + +def PathRemoveFileSpecW(pszPath): + _PathRemoveFileSpecW = windll.shlwapi.PathRemoveFileSpecW + _PathRemoveFileSpecW.argtypes = [LPWSTR] + + pszPath = ctypes.create_unicode_buffer(pszPath, MAX_PATH) + _PathRemoveFileSpecW(pszPath) + return pszPath.value + + +PathRemoveFileSpec = GuessStringType(PathRemoveFileSpecA, PathRemoveFileSpecW) + + +# BOOL PathRenameExtension( +# LPTSTR pszPath, +# LPCTSTR pszExt +# ); +def PathRenameExtensionA(pszPath, pszExt): + _PathRenameExtensionA = windll.shlwapi.PathRenameExtensionA + _PathRenameExtensionA.argtypes = [LPSTR, LPSTR] + _PathRenameExtensionA.restype = bool + + pszPath = ctypes.create_string_buffer(pszPath, MAX_PATH) + if _PathRenameExtensionA(pszPath, pszExt): + return pszPath.value + return None + + +def PathRenameExtensionW(pszPath, pszExt): + _PathRenameExtensionW = windll.shlwapi.PathRenameExtensionW + _PathRenameExtensionW.argtypes = [LPWSTR, LPWSTR] + _PathRenameExtensionW.restype = bool + + pszPath = ctypes.create_unicode_buffer(pszPath, MAX_PATH) + if _PathRenameExtensionW(pszPath, pszExt): + return pszPath.value + return None + + +PathRenameExtension = GuessStringType(PathRenameExtensionA, PathRenameExtensionW) + + +# BOOL PathUnExpandEnvStrings( +# LPCTSTR pszPath, +# LPTSTR pszBuf, +# UINT cchBuf +# ); +def PathUnExpandEnvStringsA(pszPath): + _PathUnExpandEnvStringsA = windll.shlwapi.PathUnExpandEnvStringsA + _PathUnExpandEnvStringsA.argtypes = [LPSTR, LPSTR] + _PathUnExpandEnvStringsA.restype = bool + _PathUnExpandEnvStringsA.errcheck = RaiseIfZero + + cchBuf = MAX_PATH + pszBuf = ctypes.create_string_buffer("", cchBuf) + _PathUnExpandEnvStringsA(pszPath, pszBuf, cchBuf) + return pszBuf.value + + +def PathUnExpandEnvStringsW(pszPath): + _PathUnExpandEnvStringsW = windll.shlwapi.PathUnExpandEnvStringsW + _PathUnExpandEnvStringsW.argtypes = [LPWSTR, LPWSTR] + _PathUnExpandEnvStringsW.restype = bool + _PathUnExpandEnvStringsW.errcheck = RaiseIfZero + + cchBuf = MAX_PATH + pszBuf = ctypes.create_unicode_buffer("", cchBuf) + _PathUnExpandEnvStringsW(pszPath, pszBuf, cchBuf) + return pszBuf.value + + +PathUnExpandEnvStrings = GuessStringType(PathUnExpandEnvStringsA, PathUnExpandEnvStringsW) + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/user32.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/user32.py new file mode 100644 index 0000000..f6f9fef --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/user32.py @@ -0,0 +1,1832 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for user32.dll in ctypes. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.version import bits +from winappdbg.win32.kernel32 import GetLastError, SetLastError +from winappdbg.win32.gdi32 import POINT, PPOINT, LPPOINT, RECT, PRECT, LPRECT + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- Helpers ------------------------------------------------------------------ + + +def MAKE_WPARAM(wParam): + """ + Convert arguments to the WPARAM type. + Used automatically by SendMessage, PostMessage, etc. + You shouldn't need to call this function. + """ + wParam = ctypes.cast(wParam, LPVOID).value + if wParam is None: + wParam = 0 + return wParam + + +def MAKE_LPARAM(lParam): + """ + Convert arguments to the LPARAM type. + Used automatically by SendMessage, PostMessage, etc. + You shouldn't need to call this function. + """ + return ctypes.cast(lParam, LPARAM) + + +class __WindowEnumerator(object): + """ + Window enumerator class. Used internally by the window enumeration APIs. + """ + + def __init__(self): + self.hwnd = list() + + def __call__(self, hwnd, lParam): + ## print hwnd # XXX DEBUG + self.hwnd.append(hwnd) + return TRUE + + +# --- Types -------------------------------------------------------------------- + +WNDENUMPROC = WINFUNCTYPE(BOOL, HWND, PVOID) + +# --- Constants ---------------------------------------------------------------- + +HWND_DESKTOP = 0 +HWND_TOP = 1 +HWND_BOTTOM = 1 +HWND_TOPMOST = -1 +HWND_NOTOPMOST = -2 +HWND_MESSAGE = -3 + +# GetWindowLong / SetWindowLong +GWL_WNDPROC = -4 +GWL_HINSTANCE = -6 +GWL_HWNDPARENT = -8 +GWL_ID = -12 +GWL_STYLE = -16 +GWL_EXSTYLE = -20 +GWL_USERDATA = -21 + +# GetWindowLongPtr / SetWindowLongPtr +GWLP_WNDPROC = GWL_WNDPROC +GWLP_HINSTANCE = GWL_HINSTANCE +GWLP_HWNDPARENT = GWL_HWNDPARENT +GWLP_STYLE = GWL_STYLE +GWLP_EXSTYLE = GWL_EXSTYLE +GWLP_USERDATA = GWL_USERDATA +GWLP_ID = GWL_ID + +# ShowWindow +SW_HIDE = 0 +SW_SHOWNORMAL = 1 +SW_NORMAL = 1 +SW_SHOWMINIMIZED = 2 +SW_SHOWMAXIMIZED = 3 +SW_MAXIMIZE = 3 +SW_SHOWNOACTIVATE = 4 +SW_SHOW = 5 +SW_MINIMIZE = 6 +SW_SHOWMINNOACTIVE = 7 +SW_SHOWNA = 8 +SW_RESTORE = 9 +SW_SHOWDEFAULT = 10 +SW_FORCEMINIMIZE = 11 + +# SendMessageTimeout flags +SMTO_NORMAL = 0 +SMTO_BLOCK = 1 +SMTO_ABORTIFHUNG = 2 +SMTO_NOTIMEOUTIFNOTHUNG = 8 +SMTO_ERRORONEXIT = 0x20 + +# WINDOWPLACEMENT flags +WPF_SETMINPOSITION = 1 +WPF_RESTORETOMAXIMIZED = 2 +WPF_ASYNCWINDOWPLACEMENT = 4 + +# GetAncestor flags +GA_PARENT = 1 +GA_ROOT = 2 +GA_ROOTOWNER = 3 + +# GetWindow flags +GW_HWNDFIRST = 0 +GW_HWNDLAST = 1 +GW_HWNDNEXT = 2 +GW_HWNDPREV = 3 +GW_OWNER = 4 +GW_CHILD = 5 +GW_ENABLEDPOPUP = 6 + +# --- Window messages ---------------------------------------------------------- + +WM_USER = 0x400 +WM_APP = 0x800 + +WM_NULL = 0 +WM_CREATE = 1 +WM_DESTROY = 2 +WM_MOVE = 3 +WM_SIZE = 5 +WM_ACTIVATE = 6 +WA_INACTIVE = 0 +WA_ACTIVE = 1 +WA_CLICKACTIVE = 2 +WM_SETFOCUS = 7 +WM_KILLFOCUS = 8 +WM_ENABLE = 0x0A +WM_SETREDRAW = 0x0B +WM_SETTEXT = 0x0C +WM_GETTEXT = 0x0D +WM_GETTEXTLENGTH = 0x0E +WM_PAINT = 0x0F +WM_CLOSE = 0x10 +WM_QUERYENDSESSION = 0x11 +WM_QUIT = 0x12 +WM_QUERYOPEN = 0x13 +WM_ERASEBKGND = 0x14 +WM_SYSCOLORCHANGE = 0x15 +WM_ENDSESSION = 0x16 +WM_SHOWWINDOW = 0x18 +WM_WININICHANGE = 0x1A +WM_SETTINGCHANGE = WM_WININICHANGE +WM_DEVMODECHANGE = 0x1B +WM_ACTIVATEAPP = 0x1C +WM_FONTCHANGE = 0x1D +WM_TIMECHANGE = 0x1E +WM_CANCELMODE = 0x1F +WM_SETCURSOR = 0x20 +WM_MOUSEACTIVATE = 0x21 +WM_CHILDACTIVATE = 0x22 +WM_QUEUESYNC = 0x23 +WM_GETMINMAXINFO = 0x24 +WM_PAINTICON = 0x26 +WM_ICONERASEBKGND = 0x27 +WM_NEXTDLGCTL = 0x28 +WM_SPOOLERSTATUS = 0x2A +WM_DRAWITEM = 0x2B +WM_MEASUREITEM = 0x2C +WM_DELETEITEM = 0x2D +WM_VKEYTOITEM = 0x2E +WM_CHARTOITEM = 0x2F +WM_SETFONT = 0x30 +WM_GETFONT = 0x31 +WM_SETHOTKEY = 0x32 +WM_GETHOTKEY = 0x33 +WM_QUERYDRAGICON = 0x37 +WM_COMPAREITEM = 0x39 +WM_GETOBJECT = 0x3D +WM_COMPACTING = 0x41 +WM_OTHERWINDOWCREATED = 0x42 +WM_OTHERWINDOWDESTROYED = 0x43 +WM_COMMNOTIFY = 0x44 + +CN_RECEIVE = 0x1 +CN_TRANSMIT = 0x2 +CN_EVENT = 0x4 + +WM_WINDOWPOSCHANGING = 0x46 +WM_WINDOWPOSCHANGED = 0x47 +WM_POWER = 0x48 + +PWR_OK = 1 +PWR_FAIL = -1 +PWR_SUSPENDREQUEST = 1 +PWR_SUSPENDRESUME = 2 +PWR_CRITICALRESUME = 3 + +WM_COPYDATA = 0x4A +WM_CANCELJOURNAL = 0x4B +WM_NOTIFY = 0x4E +WM_INPUTLANGCHANGEREQUEST = 0x50 +WM_INPUTLANGCHANGE = 0x51 +WM_TCARD = 0x52 +WM_HELP = 0x53 +WM_USERCHANGED = 0x54 +WM_NOTIFYFORMAT = 0x55 +WM_CONTEXTMENU = 0x7B +WM_STYLECHANGING = 0x7C +WM_STYLECHANGED = 0x7D +WM_DISPLAYCHANGE = 0x7E +WM_GETICON = 0x7F +WM_SETICON = 0x80 +WM_NCCREATE = 0x81 +WM_NCDESTROY = 0x82 +WM_NCCALCSIZE = 0x83 +WM_NCHITTEST = 0x84 +WM_NCPAINT = 0x85 +WM_NCACTIVATE = 0x86 +WM_GETDLGCODE = 0x87 +WM_SYNCPAINT = 0x88 +WM_NCMOUSEMOVE = 0x0A0 +WM_NCLBUTTONDOWN = 0x0A1 +WM_NCLBUTTONUP = 0x0A2 +WM_NCLBUTTONDBLCLK = 0x0A3 +WM_NCRBUTTONDOWN = 0x0A4 +WM_NCRBUTTONUP = 0x0A5 +WM_NCRBUTTONDBLCLK = 0x0A6 +WM_NCMBUTTONDOWN = 0x0A7 +WM_NCMBUTTONUP = 0x0A8 +WM_NCMBUTTONDBLCLK = 0x0A9 +WM_KEYFIRST = 0x100 +WM_KEYDOWN = 0x100 +WM_KEYUP = 0x101 +WM_CHAR = 0x102 +WM_DEADCHAR = 0x103 +WM_SYSKEYDOWN = 0x104 +WM_SYSKEYUP = 0x105 +WM_SYSCHAR = 0x106 +WM_SYSDEADCHAR = 0x107 +WM_KEYLAST = 0x108 +WM_INITDIALOG = 0x110 +WM_COMMAND = 0x111 +WM_SYSCOMMAND = 0x112 +WM_TIMER = 0x113 +WM_HSCROLL = 0x114 +WM_VSCROLL = 0x115 +WM_INITMENU = 0x116 +WM_INITMENUPOPUP = 0x117 +WM_MENUSELECT = 0x11F +WM_MENUCHAR = 0x120 +WM_ENTERIDLE = 0x121 +WM_CTLCOLORMSGBOX = 0x132 +WM_CTLCOLOREDIT = 0x133 +WM_CTLCOLORLISTBOX = 0x134 +WM_CTLCOLORBTN = 0x135 +WM_CTLCOLORDLG = 0x136 +WM_CTLCOLORSCROLLBAR = 0x137 +WM_CTLCOLORSTATIC = 0x138 +WM_MOUSEFIRST = 0x200 +WM_MOUSEMOVE = 0x200 +WM_LBUTTONDOWN = 0x201 +WM_LBUTTONUP = 0x202 +WM_LBUTTONDBLCLK = 0x203 +WM_RBUTTONDOWN = 0x204 +WM_RBUTTONUP = 0x205 +WM_RBUTTONDBLCLK = 0x206 +WM_MBUTTONDOWN = 0x207 +WM_MBUTTONUP = 0x208 +WM_MBUTTONDBLCLK = 0x209 +WM_MOUSELAST = 0x209 +WM_PARENTNOTIFY = 0x210 +WM_ENTERMENULOOP = 0x211 +WM_EXITMENULOOP = 0x212 +WM_MDICREATE = 0x220 +WM_MDIDESTROY = 0x221 +WM_MDIACTIVATE = 0x222 +WM_MDIRESTORE = 0x223 +WM_MDINEXT = 0x224 +WM_MDIMAXIMIZE = 0x225 +WM_MDITILE = 0x226 +WM_MDICASCADE = 0x227 +WM_MDIICONARRANGE = 0x228 +WM_MDIGETACTIVE = 0x229 +WM_MDISETMENU = 0x230 +WM_DROPFILES = 0x233 +WM_MDIREFRESHMENU = 0x234 +WM_CUT = 0x300 +WM_COPY = 0x301 +WM_PASTE = 0x302 +WM_CLEAR = 0x303 +WM_UNDO = 0x304 +WM_RENDERFORMAT = 0x305 +WM_RENDERALLFORMATS = 0x306 +WM_DESTROYCLIPBOARD = 0x307 +WM_DRAWCLIPBOARD = 0x308 +WM_PAINTCLIPBOARD = 0x309 +WM_VSCROLLCLIPBOARD = 0x30A +WM_SIZECLIPBOARD = 0x30B +WM_ASKCBFORMATNAME = 0x30C +WM_CHANGECBCHAIN = 0x30D +WM_HSCROLLCLIPBOARD = 0x30E +WM_QUERYNEWPALETTE = 0x30F +WM_PALETTEISCHANGING = 0x310 +WM_PALETTECHANGED = 0x311 +WM_HOTKEY = 0x312 +WM_PRINT = 0x317 +WM_PRINTCLIENT = 0x318 +WM_PENWINFIRST = 0x380 +WM_PENWINLAST = 0x38F + +# --- Structures --------------------------------------------------------------- + + +# typedef struct _WINDOWPLACEMENT { +# UINT length; +# UINT flags; +# UINT showCmd; +# POINT ptMinPosition; +# POINT ptMaxPosition; +# RECT rcNormalPosition; +# } WINDOWPLACEMENT; +class WINDOWPLACEMENT(Structure): + _fields_ = [ + ("length", UINT), + ("flags", UINT), + ("showCmd", UINT), + ("ptMinPosition", POINT), + ("ptMaxPosition", POINT), + ("rcNormalPosition", RECT), + ] + + +PWINDOWPLACEMENT = POINTER(WINDOWPLACEMENT) +LPWINDOWPLACEMENT = PWINDOWPLACEMENT + + +# typedef struct tagGUITHREADINFO { +# DWORD cbSize; +# DWORD flags; +# HWND hwndActive; +# HWND hwndFocus; +# HWND hwndCapture; +# HWND hwndMenuOwner; +# HWND hwndMoveSize; +# HWND hwndCaret; +# RECT rcCaret; +# } GUITHREADINFO, *PGUITHREADINFO; +class GUITHREADINFO(Structure): + _fields_ = [ + ("cbSize", DWORD), + ("flags", DWORD), + ("hwndActive", HWND), + ("hwndFocus", HWND), + ("hwndCapture", HWND), + ("hwndMenuOwner", HWND), + ("hwndMoveSize", HWND), + ("hwndCaret", HWND), + ("rcCaret", RECT), + ] + + +PGUITHREADINFO = POINTER(GUITHREADINFO) +LPGUITHREADINFO = PGUITHREADINFO + +# --- High level classes ------------------------------------------------------- + +# Point() and Rect() are here instead of gdi32.py because they were mainly +# created to handle window coordinates rather than drawing on the screen. + +# XXX not sure if these classes should be psyco-optimized, +# it may not work if the user wants to serialize them for some reason + + +class Point(object): + """ + Python wrapper over the L{POINT} class. + + @type x: int + @ivar x: Horizontal coordinate + @type y: int + @ivar y: Vertical coordinate + """ + + def __init__(self, x=0, y=0): + """ + @see: L{POINT} + @type x: int + @param x: Horizontal coordinate + @type y: int + @param y: Vertical coordinate + """ + self.x = x + self.y = y + + def __iter__(self): + return (self.x, self.y).__iter__() + + def __len__(self): + return 2 + + def __getitem__(self, index): + return (self.x, self.y)[index] + + def __setitem__(self, index, value): + if index == 0: + self.x = value + elif index == 1: + self.y = value + else: + raise IndexError("index out of range") + + @property + def _as_parameter_(self): + """ + Compatibility with ctypes. + Allows passing transparently a Point object to an API call. + """ + return POINT(self.x, self.y) + + def screen_to_client(self, hWnd): + """ + Translates window screen coordinates to client coordinates. + + @see: L{client_to_screen}, L{translate} + + @type hWnd: int or L{HWND} or L{system.Window} + @param hWnd: Window handle. + + @rtype: L{Point} + @return: New object containing the translated coordinates. + """ + return ScreenToClient(hWnd, self) + + def client_to_screen(self, hWnd): + """ + Translates window client coordinates to screen coordinates. + + @see: L{screen_to_client}, L{translate} + + @type hWnd: int or L{HWND} or L{system.Window} + @param hWnd: Window handle. + + @rtype: L{Point} + @return: New object containing the translated coordinates. + """ + return ClientToScreen(hWnd, self) + + def translate(self, hWndFrom=HWND_DESKTOP, hWndTo=HWND_DESKTOP): + """ + Translate coordinates from one window to another. + + @note: To translate multiple points it's more efficient to use the + L{MapWindowPoints} function instead. + + @see: L{client_to_screen}, L{screen_to_client} + + @type hWndFrom: int or L{HWND} or L{system.Window} + @param hWndFrom: Window handle to translate from. + Use C{HWND_DESKTOP} for screen coordinates. + + @type hWndTo: int or L{HWND} or L{system.Window} + @param hWndTo: Window handle to translate to. + Use C{HWND_DESKTOP} for screen coordinates. + + @rtype: L{Point} + @return: New object containing the translated coordinates. + """ + return MapWindowPoints(hWndFrom, hWndTo, [self]) + + +class Rect(object): + """ + Python wrapper over the L{RECT} class. + + @type left: int + @ivar left: Horizontal coordinate for the top left corner. + @type top: int + @ivar top: Vertical coordinate for the top left corner. + @type right: int + @ivar right: Horizontal coordinate for the bottom right corner. + @type bottom: int + @ivar bottom: Vertical coordinate for the bottom right corner. + + @type width: int + @ivar width: Width in pixels. Same as C{right - left}. + @type height: int + @ivar height: Height in pixels. Same as C{bottom - top}. + """ + + def __init__(self, left=0, top=0, right=0, bottom=0): + """ + @see: L{RECT} + @type left: int + @param left: Horizontal coordinate for the top left corner. + @type top: int + @param top: Vertical coordinate for the top left corner. + @type right: int + @param right: Horizontal coordinate for the bottom right corner. + @type bottom: int + @param bottom: Vertical coordinate for the bottom right corner. + """ + self.left = left + self.top = top + self.right = right + self.bottom = bottom + + def __iter__(self): + return (self.left, self.top, self.right, self.bottom).__iter__() + + def __len__(self): + return 2 + + def __getitem__(self, index): + return (self.left, self.top, self.right, self.bottom)[index] + + def __setitem__(self, index, value): + if index == 0: + self.left = value + elif index == 1: + self.top = value + elif index == 2: + self.right = value + elif index == 3: + self.bottom = value + else: + raise IndexError("index out of range") + + @property + def _as_parameter_(self): + """ + Compatibility with ctypes. + Allows passing transparently a Point object to an API call. + """ + return RECT(self.left, self.top, self.right, self.bottom) + + def __get_width(self): + return self.right - self.left + + def __get_height(self): + return self.bottom - self.top + + def __set_width(self, value): + self.right = value - self.left + + def __set_height(self, value): + self.bottom = value - self.top + + width = property(__get_width, __set_width) + height = property(__get_height, __set_height) + + def screen_to_client(self, hWnd): + """ + Translates window screen coordinates to client coordinates. + + @see: L{client_to_screen}, L{translate} + + @type hWnd: int or L{HWND} or L{system.Window} + @param hWnd: Window handle. + + @rtype: L{Rect} + @return: New object containing the translated coordinates. + """ + topleft = ScreenToClient(hWnd, (self.left, self.top)) + bottomright = ScreenToClient(hWnd, (self.bottom, self.right)) + return Rect(topleft.x, topleft.y, bottomright.x, bottomright.y) + + def client_to_screen(self, hWnd): + """ + Translates window client coordinates to screen coordinates. + + @see: L{screen_to_client}, L{translate} + + @type hWnd: int or L{HWND} or L{system.Window} + @param hWnd: Window handle. + + @rtype: L{Rect} + @return: New object containing the translated coordinates. + """ + topleft = ClientToScreen(hWnd, (self.left, self.top)) + bottomright = ClientToScreen(hWnd, (self.bottom, self.right)) + return Rect(topleft.x, topleft.y, bottomright.x, bottomright.y) + + def translate(self, hWndFrom=HWND_DESKTOP, hWndTo=HWND_DESKTOP): + """ + Translate coordinates from one window to another. + + @see: L{client_to_screen}, L{screen_to_client} + + @type hWndFrom: int or L{HWND} or L{system.Window} + @param hWndFrom: Window handle to translate from. + Use C{HWND_DESKTOP} for screen coordinates. + + @type hWndTo: int or L{HWND} or L{system.Window} + @param hWndTo: Window handle to translate to. + Use C{HWND_DESKTOP} for screen coordinates. + + @rtype: L{Rect} + @return: New object containing the translated coordinates. + """ + points = [(self.left, self.top), (self.right, self.bottom)] + return MapWindowPoints(hWndFrom, hWndTo, points) + + +class WindowPlacement(object): + """ + Python wrapper over the L{WINDOWPLACEMENT} class. + """ + + def __init__(self, wp=None): + """ + @type wp: L{WindowPlacement} or L{WINDOWPLACEMENT} + @param wp: Another window placement object. + """ + + # Initialize all properties with empty values. + self.flags = 0 + self.showCmd = 0 + self.ptMinPosition = Point() + self.ptMaxPosition = Point() + self.rcNormalPosition = Rect() + + # If a window placement was given copy it's properties. + if wp: + self.flags = wp.flags + self.showCmd = wp.showCmd + self.ptMinPosition = Point(wp.ptMinPosition.x, wp.ptMinPosition.y) + self.ptMaxPosition = Point(wp.ptMaxPosition.x, wp.ptMaxPosition.y) + self.rcNormalPosition = Rect( + wp.rcNormalPosition.left, + wp.rcNormalPosition.top, + wp.rcNormalPosition.right, + wp.rcNormalPosition.bottom, + ) + + @property + def _as_parameter_(self): + """ + Compatibility with ctypes. + Allows passing transparently a Point object to an API call. + """ + wp = WINDOWPLACEMENT() + wp.length = sizeof(wp) + wp.flags = self.flags + wp.showCmd = self.showCmd + wp.ptMinPosition.x = self.ptMinPosition.x + wp.ptMinPosition.y = self.ptMinPosition.y + wp.ptMaxPosition.x = self.ptMaxPosition.x + wp.ptMaxPosition.y = self.ptMaxPosition.y + wp.rcNormalPosition.left = self.rcNormalPosition.left + wp.rcNormalPosition.top = self.rcNormalPosition.top + wp.rcNormalPosition.right = self.rcNormalPosition.right + wp.rcNormalPosition.bottom = self.rcNormalPosition.bottom + return wp + + +# --- user32.dll --------------------------------------------------------------- + + +# void WINAPI SetLastErrorEx( +# __in DWORD dwErrCode, +# __in DWORD dwType +# ); +def SetLastErrorEx(dwErrCode, dwType=0): + _SetLastErrorEx = windll.user32.SetLastErrorEx + _SetLastErrorEx.argtypes = [DWORD, DWORD] + _SetLastErrorEx.restype = None + _SetLastErrorEx(dwErrCode, dwType) + + +# HWND FindWindow( +# LPCTSTR lpClassName, +# LPCTSTR lpWindowName +# ); +def FindWindowA(lpClassName=None, lpWindowName=None): + _FindWindowA = windll.user32.FindWindowA + _FindWindowA.argtypes = [LPSTR, LPSTR] + _FindWindowA.restype = HWND + + hWnd = _FindWindowA(lpClassName, lpWindowName) + if not hWnd: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return hWnd + + +def FindWindowW(lpClassName=None, lpWindowName=None): + _FindWindowW = windll.user32.FindWindowW + _FindWindowW.argtypes = [LPWSTR, LPWSTR] + _FindWindowW.restype = HWND + + hWnd = _FindWindowW(lpClassName, lpWindowName) + if not hWnd: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return hWnd + + +FindWindow = GuessStringType(FindWindowA, FindWindowW) + + +# HWND WINAPI FindWindowEx( +# __in_opt HWND hwndParent, +# __in_opt HWND hwndChildAfter, +# __in_opt LPCTSTR lpszClass, +# __in_opt LPCTSTR lpszWindow +# ); +def FindWindowExA(hwndParent=None, hwndChildAfter=None, lpClassName=None, lpWindowName=None): + _FindWindowExA = windll.user32.FindWindowExA + _FindWindowExA.argtypes = [HWND, HWND, LPSTR, LPSTR] + _FindWindowExA.restype = HWND + + hWnd = _FindWindowExA(hwndParent, hwndChildAfter, lpClassName, lpWindowName) + if not hWnd: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return hWnd + + +def FindWindowExW(hwndParent=None, hwndChildAfter=None, lpClassName=None, lpWindowName=None): + _FindWindowExW = windll.user32.FindWindowExW + _FindWindowExW.argtypes = [HWND, HWND, LPWSTR, LPWSTR] + _FindWindowExW.restype = HWND + + hWnd = _FindWindowExW(hwndParent, hwndChildAfter, lpClassName, lpWindowName) + if not hWnd: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return hWnd + + +FindWindowEx = GuessStringType(FindWindowExA, FindWindowExW) + + +# int GetClassName( +# HWND hWnd, +# LPTSTR lpClassName, +# int nMaxCount +# ); +def GetClassNameA(hWnd): + _GetClassNameA = windll.user32.GetClassNameA + _GetClassNameA.argtypes = [HWND, LPSTR, ctypes.c_int] + _GetClassNameA.restype = ctypes.c_int + + nMaxCount = 0x1000 + dwCharSize = sizeof(CHAR) + while 1: + lpClassName = ctypes.create_string_buffer("", nMaxCount) + nCount = _GetClassNameA(hWnd, lpClassName, nMaxCount) + if nCount == 0: + raise ctypes.WinError() + if nCount < nMaxCount - dwCharSize: + break + nMaxCount += 0x1000 + return lpClassName.value + + +def GetClassNameW(hWnd): + _GetClassNameW = windll.user32.GetClassNameW + _GetClassNameW.argtypes = [HWND, LPWSTR, ctypes.c_int] + _GetClassNameW.restype = ctypes.c_int + + nMaxCount = 0x1000 + dwCharSize = sizeof(WCHAR) + while 1: + lpClassName = ctypes.create_unicode_buffer("", nMaxCount) + nCount = _GetClassNameW(hWnd, lpClassName, nMaxCount) + if nCount == 0: + raise ctypes.WinError() + if nCount < nMaxCount - dwCharSize: + break + nMaxCount += 0x1000 + return lpClassName.value + + +GetClassName = GuessStringType(GetClassNameA, GetClassNameW) + + +# int WINAPI GetWindowText( +# __in HWND hWnd, +# __out LPTSTR lpString, +# __in int nMaxCount +# ); +def GetWindowTextA(hWnd): + _GetWindowTextA = windll.user32.GetWindowTextA + _GetWindowTextA.argtypes = [HWND, LPSTR, ctypes.c_int] + _GetWindowTextA.restype = ctypes.c_int + + nMaxCount = 0x1000 + dwCharSize = sizeof(CHAR) + while 1: + lpString = ctypes.create_string_buffer("", nMaxCount) + nCount = _GetWindowTextA(hWnd, lpString, nMaxCount) + if nCount == 0: + raise ctypes.WinError() + if nCount < nMaxCount - dwCharSize: + break + nMaxCount += 0x1000 + return lpString.value + + +def GetWindowTextW(hWnd): + _GetWindowTextW = windll.user32.GetWindowTextW + _GetWindowTextW.argtypes = [HWND, LPWSTR, ctypes.c_int] + _GetWindowTextW.restype = ctypes.c_int + + nMaxCount = 0x1000 + dwCharSize = sizeof(CHAR) + while 1: + lpString = ctypes.create_string_buffer("", nMaxCount) + nCount = _GetWindowTextW(hWnd, lpString, nMaxCount) + if nCount == 0: + raise ctypes.WinError() + if nCount < nMaxCount - dwCharSize: + break + nMaxCount += 0x1000 + return lpString.value + + +GetWindowText = GuessStringType(GetWindowTextA, GetWindowTextW) + + +# BOOL WINAPI SetWindowText( +# __in HWND hWnd, +# __in_opt LPCTSTR lpString +# ); +def SetWindowTextA(hWnd, lpString=None): + _SetWindowTextA = windll.user32.SetWindowTextA + _SetWindowTextA.argtypes = [HWND, LPSTR] + _SetWindowTextA.restype = bool + _SetWindowTextA.errcheck = RaiseIfZero + _SetWindowTextA(hWnd, lpString) + + +def SetWindowTextW(hWnd, lpString=None): + _SetWindowTextW = windll.user32.SetWindowTextW + _SetWindowTextW.argtypes = [HWND, LPWSTR] + _SetWindowTextW.restype = bool + _SetWindowTextW.errcheck = RaiseIfZero + _SetWindowTextW(hWnd, lpString) + + +SetWindowText = GuessStringType(SetWindowTextA, SetWindowTextW) + + +# LONG GetWindowLong( +# HWND hWnd, +# int nIndex +# ); +def GetWindowLongA(hWnd, nIndex=0): + _GetWindowLongA = windll.user32.GetWindowLongA + _GetWindowLongA.argtypes = [HWND, ctypes.c_int] + _GetWindowLongA.restype = DWORD + + SetLastError(ERROR_SUCCESS) + retval = _GetWindowLongA(hWnd, nIndex) + if retval == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return retval + + +def GetWindowLongW(hWnd, nIndex=0): + _GetWindowLongW = windll.user32.GetWindowLongW + _GetWindowLongW.argtypes = [HWND, ctypes.c_int] + _GetWindowLongW.restype = DWORD + + SetLastError(ERROR_SUCCESS) + retval = _GetWindowLongW(hWnd, nIndex) + if retval == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return retval + + +GetWindowLong = DefaultStringType(GetWindowLongA, GetWindowLongW) + +# LONG_PTR WINAPI GetWindowLongPtr( +# _In_ HWND hWnd, +# _In_ int nIndex +# ); + +if bits == 32: + GetWindowLongPtrA = GetWindowLongA + GetWindowLongPtrW = GetWindowLongW + GetWindowLongPtr = GetWindowLong + +else: + + def GetWindowLongPtrA(hWnd, nIndex=0): + _GetWindowLongPtrA = windll.user32.GetWindowLongPtrA + _GetWindowLongPtrA.argtypes = [HWND, ctypes.c_int] + _GetWindowLongPtrA.restype = SIZE_T + + SetLastError(ERROR_SUCCESS) + retval = _GetWindowLongPtrA(hWnd, nIndex) + if retval == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return retval + + def GetWindowLongPtrW(hWnd, nIndex=0): + _GetWindowLongPtrW = windll.user32.GetWindowLongPtrW + _GetWindowLongPtrW.argtypes = [HWND, ctypes.c_int] + _GetWindowLongPtrW.restype = DWORD + + SetLastError(ERROR_SUCCESS) + retval = _GetWindowLongPtrW(hWnd, nIndex) + if retval == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return retval + + GetWindowLongPtr = DefaultStringType(GetWindowLongPtrA, GetWindowLongPtrW) + +# LONG WINAPI SetWindowLong( +# _In_ HWND hWnd, +# _In_ int nIndex, +# _In_ LONG dwNewLong +# ); + + +def SetWindowLongA(hWnd, nIndex, dwNewLong): + _SetWindowLongA = windll.user32.SetWindowLongA + _SetWindowLongA.argtypes = [HWND, ctypes.c_int, DWORD] + _SetWindowLongA.restype = DWORD + + SetLastError(ERROR_SUCCESS) + retval = _SetWindowLongA(hWnd, nIndex, dwNewLong) + if retval == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return retval + + +def SetWindowLongW(hWnd, nIndex, dwNewLong): + _SetWindowLongW = windll.user32.SetWindowLongW + _SetWindowLongW.argtypes = [HWND, ctypes.c_int, DWORD] + _SetWindowLongW.restype = DWORD + + SetLastError(ERROR_SUCCESS) + retval = _SetWindowLongW(hWnd, nIndex, dwNewLong) + if retval == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return retval + + +SetWindowLong = DefaultStringType(SetWindowLongA, SetWindowLongW) + +# LONG_PTR WINAPI SetWindowLongPtr( +# _In_ HWND hWnd, +# _In_ int nIndex, +# _In_ LONG_PTR dwNewLong +# ); + +if bits == 32: + SetWindowLongPtrA = SetWindowLongA + SetWindowLongPtrW = SetWindowLongW + SetWindowLongPtr = SetWindowLong + +else: + + def SetWindowLongPtrA(hWnd, nIndex, dwNewLong): + _SetWindowLongPtrA = windll.user32.SetWindowLongPtrA + _SetWindowLongPtrA.argtypes = [HWND, ctypes.c_int, SIZE_T] + _SetWindowLongPtrA.restype = SIZE_T + + SetLastError(ERROR_SUCCESS) + retval = _SetWindowLongPtrA(hWnd, nIndex, dwNewLong) + if retval == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return retval + + def SetWindowLongPtrW(hWnd, nIndex, dwNewLong): + _SetWindowLongPtrW = windll.user32.SetWindowLongPtrW + _SetWindowLongPtrW.argtypes = [HWND, ctypes.c_int, SIZE_T] + _SetWindowLongPtrW.restype = SIZE_T + + SetLastError(ERROR_SUCCESS) + retval = _SetWindowLongPtrW(hWnd, nIndex, dwNewLong) + if retval == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + return retval + + SetWindowLongPtr = DefaultStringType(SetWindowLongPtrA, SetWindowLongPtrW) + + +# HWND GetShellWindow(VOID); +def GetShellWindow(): + _GetShellWindow = windll.user32.GetShellWindow + _GetShellWindow.argtypes = [] + _GetShellWindow.restype = HWND + _GetShellWindow.errcheck = RaiseIfZero + return _GetShellWindow() + + +# DWORD GetWindowThreadProcessId( +# HWND hWnd, +# LPDWORD lpdwProcessId +# ); +def GetWindowThreadProcessId(hWnd): + _GetWindowThreadProcessId = windll.user32.GetWindowThreadProcessId + _GetWindowThreadProcessId.argtypes = [HWND, LPDWORD] + _GetWindowThreadProcessId.restype = DWORD + _GetWindowThreadProcessId.errcheck = RaiseIfZero + + dwProcessId = DWORD(0) + dwThreadId = _GetWindowThreadProcessId(hWnd, byref(dwProcessId)) + return (dwThreadId, dwProcessId.value) + + +# HWND WINAPI GetWindow( +# __in HWND hwnd, +# __in UINT uCmd +# ); +def GetWindow(hWnd, uCmd): + _GetWindow = windll.user32.GetWindow + _GetWindow.argtypes = [HWND, UINT] + _GetWindow.restype = HWND + + SetLastError(ERROR_SUCCESS) + hWndTarget = _GetWindow(hWnd, uCmd) + if not hWndTarget: + winerr = GetLastError() + if winerr != ERROR_SUCCESS: + raise ctypes.WinError(winerr) + return hWndTarget + + +# HWND GetParent( +# HWND hWnd +# ); +def GetParent(hWnd): + _GetParent = windll.user32.GetParent + _GetParent.argtypes = [HWND] + _GetParent.restype = HWND + + SetLastError(ERROR_SUCCESS) + hWndParent = _GetParent(hWnd) + if not hWndParent: + winerr = GetLastError() + if winerr != ERROR_SUCCESS: + raise ctypes.WinError(winerr) + return hWndParent + + +# HWND WINAPI GetAncestor( +# __in HWND hwnd, +# __in UINT gaFlags +# ); +def GetAncestor(hWnd, gaFlags=GA_PARENT): + _GetAncestor = windll.user32.GetAncestor + _GetAncestor.argtypes = [HWND, UINT] + _GetAncestor.restype = HWND + + SetLastError(ERROR_SUCCESS) + hWndParent = _GetAncestor(hWnd, gaFlags) + if not hWndParent: + winerr = GetLastError() + if winerr != ERROR_SUCCESS: + raise ctypes.WinError(winerr) + return hWndParent + + +# BOOL EnableWindow( +# HWND hWnd, +# BOOL bEnable +# ); +def EnableWindow(hWnd, bEnable=True): + _EnableWindow = windll.user32.EnableWindow + _EnableWindow.argtypes = [HWND, BOOL] + _EnableWindow.restype = bool + return _EnableWindow(hWnd, bool(bEnable)) + + +# BOOL ShowWindow( +# HWND hWnd, +# int nCmdShow +# ); +def ShowWindow(hWnd, nCmdShow=SW_SHOW): + _ShowWindow = windll.user32.ShowWindow + _ShowWindow.argtypes = [HWND, ctypes.c_int] + _ShowWindow.restype = bool + return _ShowWindow(hWnd, nCmdShow) + + +# BOOL ShowWindowAsync( +# HWND hWnd, +# int nCmdShow +# ); +def ShowWindowAsync(hWnd, nCmdShow=SW_SHOW): + _ShowWindowAsync = windll.user32.ShowWindowAsync + _ShowWindowAsync.argtypes = [HWND, ctypes.c_int] + _ShowWindowAsync.restype = bool + return _ShowWindowAsync(hWnd, nCmdShow) + + +# HWND GetDesktopWindow(VOID); +def GetDesktopWindow(): + _GetDesktopWindow = windll.user32.GetDesktopWindow + _GetDesktopWindow.argtypes = [] + _GetDesktopWindow.restype = HWND + _GetDesktopWindow.errcheck = RaiseIfZero + return _GetDesktopWindow() + + +# HWND GetForegroundWindow(VOID); +def GetForegroundWindow(): + _GetForegroundWindow = windll.user32.GetForegroundWindow + _GetForegroundWindow.argtypes = [] + _GetForegroundWindow.restype = HWND + _GetForegroundWindow.errcheck = RaiseIfZero + return _GetForegroundWindow() + + +# BOOL IsWindow( +# HWND hWnd +# ); +def IsWindow(hWnd): + _IsWindow = windll.user32.IsWindow + _IsWindow.argtypes = [HWND] + _IsWindow.restype = bool + return _IsWindow(hWnd) + + +# BOOL IsWindowVisible( +# HWND hWnd +# ); +def IsWindowVisible(hWnd): + _IsWindowVisible = windll.user32.IsWindowVisible + _IsWindowVisible.argtypes = [HWND] + _IsWindowVisible.restype = bool + return _IsWindowVisible(hWnd) + + +# BOOL IsWindowEnabled( +# HWND hWnd +# ); +def IsWindowEnabled(hWnd): + _IsWindowEnabled = windll.user32.IsWindowEnabled + _IsWindowEnabled.argtypes = [HWND] + _IsWindowEnabled.restype = bool + return _IsWindowEnabled(hWnd) + + +# BOOL IsZoomed( +# HWND hWnd +# ); +def IsZoomed(hWnd): + _IsZoomed = windll.user32.IsZoomed + _IsZoomed.argtypes = [HWND] + _IsZoomed.restype = bool + return _IsZoomed(hWnd) + + +# BOOL IsIconic( +# HWND hWnd +# ); +def IsIconic(hWnd): + _IsIconic = windll.user32.IsIconic + _IsIconic.argtypes = [HWND] + _IsIconic.restype = bool + return _IsIconic(hWnd) + + +# BOOL IsChild( +# HWND hWnd +# ); +def IsChild(hWnd): + _IsChild = windll.user32.IsChild + _IsChild.argtypes = [HWND] + _IsChild.restype = bool + return _IsChild(hWnd) + + +# HWND WindowFromPoint( +# POINT Point +# ); +def WindowFromPoint(point): + _WindowFromPoint = windll.user32.WindowFromPoint + _WindowFromPoint.argtypes = [POINT] + _WindowFromPoint.restype = HWND + _WindowFromPoint.errcheck = RaiseIfZero + if isinstance(point, tuple): + point = POINT(*point) + return _WindowFromPoint(point) + + +# HWND ChildWindowFromPoint( +# HWND hWndParent, +# POINT Point +# ); +def ChildWindowFromPoint(hWndParent, point): + _ChildWindowFromPoint = windll.user32.ChildWindowFromPoint + _ChildWindowFromPoint.argtypes = [HWND, POINT] + _ChildWindowFromPoint.restype = HWND + _ChildWindowFromPoint.errcheck = RaiseIfZero + if isinstance(point, tuple): + point = POINT(*point) + return _ChildWindowFromPoint(hWndParent, point) + + +# HWND RealChildWindowFromPoint( +# HWND hwndParent, +# POINT ptParentClientCoords +# ); +def RealChildWindowFromPoint(hWndParent, ptParentClientCoords): + _RealChildWindowFromPoint = windll.user32.RealChildWindowFromPoint + _RealChildWindowFromPoint.argtypes = [HWND, POINT] + _RealChildWindowFromPoint.restype = HWND + _RealChildWindowFromPoint.errcheck = RaiseIfZero + if isinstance(ptParentClientCoords, tuple): + ptParentClientCoords = POINT(*ptParentClientCoords) + return _RealChildWindowFromPoint(hWndParent, ptParentClientCoords) + + +# BOOL ScreenToClient( +# __in HWND hWnd, +# LPPOINT lpPoint +# ); +def ScreenToClient(hWnd, lpPoint): + _ScreenToClient = windll.user32.ScreenToClient + _ScreenToClient.argtypes = [HWND, LPPOINT] + _ScreenToClient.restype = bool + _ScreenToClient.errcheck = RaiseIfZero + + if isinstance(lpPoint, tuple): + lpPoint = POINT(*lpPoint) + else: + lpPoint = POINT(lpPoint.x, lpPoint.y) + _ScreenToClient(hWnd, byref(lpPoint)) + return Point(lpPoint.x, lpPoint.y) + + +# BOOL ClientToScreen( +# HWND hWnd, +# LPPOINT lpPoint +# ); +def ClientToScreen(hWnd, lpPoint): + _ClientToScreen = windll.user32.ClientToScreen + _ClientToScreen.argtypes = [HWND, LPPOINT] + _ClientToScreen.restype = bool + _ClientToScreen.errcheck = RaiseIfZero + + if isinstance(lpPoint, tuple): + lpPoint = POINT(*lpPoint) + else: + lpPoint = POINT(lpPoint.x, lpPoint.y) + _ClientToScreen(hWnd, byref(lpPoint)) + return Point(lpPoint.x, lpPoint.y) + + +# int MapWindowPoints( +# __in HWND hWndFrom, +# __in HWND hWndTo, +# __inout LPPOINT lpPoints, +# __in UINT cPoints +# ); +def MapWindowPoints(hWndFrom, hWndTo, lpPoints): + _MapWindowPoints = windll.user32.MapWindowPoints + _MapWindowPoints.argtypes = [HWND, HWND, LPPOINT, UINT] + _MapWindowPoints.restype = ctypes.c_int + + cPoints = len(lpPoints) + lpPoints = (POINT * cPoints)(*lpPoints) + SetLastError(ERROR_SUCCESS) + number = _MapWindowPoints(hWndFrom, hWndTo, byref(lpPoints), cPoints) + if number == 0: + errcode = GetLastError() + if errcode != ERROR_SUCCESS: + raise ctypes.WinError(errcode) + x_delta = number & 0xFFFF + y_delta = (number >> 16) & 0xFFFF + return x_delta, y_delta, [(Point.x, Point.y) for Point in lpPoints] + + +# BOOL SetForegroundWindow( +# HWND hWnd +# ); +def SetForegroundWindow(hWnd): + _SetForegroundWindow = windll.user32.SetForegroundWindow + _SetForegroundWindow.argtypes = [HWND] + _SetForegroundWindow.restype = bool + _SetForegroundWindow.errcheck = RaiseIfZero + return _SetForegroundWindow(hWnd) + + +# BOOL GetWindowPlacement( +# HWND hWnd, +# WINDOWPLACEMENT *lpwndpl +# ); +def GetWindowPlacement(hWnd): + _GetWindowPlacement = windll.user32.GetWindowPlacement + _GetWindowPlacement.argtypes = [HWND, PWINDOWPLACEMENT] + _GetWindowPlacement.restype = bool + _GetWindowPlacement.errcheck = RaiseIfZero + + lpwndpl = WINDOWPLACEMENT() + lpwndpl.length = sizeof(lpwndpl) + _GetWindowPlacement(hWnd, byref(lpwndpl)) + return WindowPlacement(lpwndpl) + + +# BOOL SetWindowPlacement( +# HWND hWnd, +# WINDOWPLACEMENT *lpwndpl +# ); +def SetWindowPlacement(hWnd, lpwndpl): + _SetWindowPlacement = windll.user32.SetWindowPlacement + _SetWindowPlacement.argtypes = [HWND, PWINDOWPLACEMENT] + _SetWindowPlacement.restype = bool + _SetWindowPlacement.errcheck = RaiseIfZero + + if isinstance(lpwndpl, WINDOWPLACEMENT): + lpwndpl.length = sizeof(lpwndpl) + _SetWindowPlacement(hWnd, byref(lpwndpl)) + + +# BOOL WINAPI GetWindowRect( +# __in HWND hWnd, +# __out LPRECT lpRect +# ); +def GetWindowRect(hWnd): + _GetWindowRect = windll.user32.GetWindowRect + _GetWindowRect.argtypes = [HWND, LPRECT] + _GetWindowRect.restype = bool + _GetWindowRect.errcheck = RaiseIfZero + + lpRect = RECT() + _GetWindowRect(hWnd, byref(lpRect)) + return Rect(lpRect.left, lpRect.top, lpRect.right, lpRect.bottom) + + +# BOOL WINAPI GetClientRect( +# __in HWND hWnd, +# __out LPRECT lpRect +# ); +def GetClientRect(hWnd): + _GetClientRect = windll.user32.GetClientRect + _GetClientRect.argtypes = [HWND, LPRECT] + _GetClientRect.restype = bool + _GetClientRect.errcheck = RaiseIfZero + + lpRect = RECT() + _GetClientRect(hWnd, byref(lpRect)) + return Rect(lpRect.left, lpRect.top, lpRect.right, lpRect.bottom) + + +# BOOL MoveWindow( +# HWND hWnd, +# int X, +# int Y, +# int nWidth, +# int nHeight, +# BOOL bRepaint +# ); +def MoveWindow(hWnd, X, Y, nWidth, nHeight, bRepaint=True): + _MoveWindow = windll.user32.MoveWindow + _MoveWindow.argtypes = [HWND, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int, BOOL] + _MoveWindow.restype = bool + _MoveWindow.errcheck = RaiseIfZero + _MoveWindow(hWnd, X, Y, nWidth, nHeight, bool(bRepaint)) + + +# BOOL GetGUIThreadInfo( +# DWORD idThread, +# LPGUITHREADINFO lpgui +# ); +def GetGUIThreadInfo(idThread): + _GetGUIThreadInfo = windll.user32.GetGUIThreadInfo + _GetGUIThreadInfo.argtypes = [DWORD, LPGUITHREADINFO] + _GetGUIThreadInfo.restype = bool + _GetGUIThreadInfo.errcheck = RaiseIfZero + + gui = GUITHREADINFO() + _GetGUIThreadInfo(idThread, byref(gui)) + return gui + + +# BOOL CALLBACK EnumWndProc( +# HWND hwnd, +# LPARAM lParam +# ); +class __EnumWndProc(__WindowEnumerator): + pass + + +# BOOL EnumWindows( +# WNDENUMPROC lpEnumFunc, +# LPARAM lParam +# ); +def EnumWindows(): + _EnumWindows = windll.user32.EnumWindows + _EnumWindows.argtypes = [WNDENUMPROC, LPARAM] + _EnumWindows.restype = bool + + EnumFunc = __EnumWndProc() + lpEnumFunc = WNDENUMPROC(EnumFunc) + if not _EnumWindows(lpEnumFunc, NULL): + errcode = GetLastError() + if errcode not in (ERROR_NO_MORE_FILES, ERROR_SUCCESS): + raise ctypes.WinError(errcode) + return EnumFunc.hwnd + + +# BOOL CALLBACK EnumThreadWndProc( +# HWND hwnd, +# LPARAM lParam +# ); +class __EnumThreadWndProc(__WindowEnumerator): + pass + + +# BOOL EnumThreadWindows( +# DWORD dwThreadId, +# WNDENUMPROC lpfn, +# LPARAM lParam +# ); +def EnumThreadWindows(dwThreadId): + _EnumThreadWindows = windll.user32.EnumThreadWindows + _EnumThreadWindows.argtypes = [DWORD, WNDENUMPROC, LPARAM] + _EnumThreadWindows.restype = bool + + fn = __EnumThreadWndProc() + lpfn = WNDENUMPROC(fn) + if not _EnumThreadWindows(dwThreadId, lpfn, NULL): + errcode = GetLastError() + if errcode not in (ERROR_NO_MORE_FILES, ERROR_SUCCESS): + raise ctypes.WinError(errcode) + return fn.hwnd + + +# BOOL CALLBACK EnumChildProc( +# HWND hwnd, +# LPARAM lParam +# ); +class __EnumChildProc(__WindowEnumerator): + pass + + +# BOOL EnumChildWindows( +# HWND hWndParent, +# WNDENUMPROC lpEnumFunc, +# LPARAM lParam +# ); +def EnumChildWindows(hWndParent=NULL): + _EnumChildWindows = windll.user32.EnumChildWindows + _EnumChildWindows.argtypes = [HWND, WNDENUMPROC, LPARAM] + _EnumChildWindows.restype = bool + + EnumFunc = __EnumChildProc() + lpEnumFunc = WNDENUMPROC(EnumFunc) + SetLastError(ERROR_SUCCESS) + _EnumChildWindows(hWndParent, lpEnumFunc, NULL) + errcode = GetLastError() + if errcode != ERROR_SUCCESS and errcode not in (ERROR_NO_MORE_FILES, ERROR_SUCCESS): + raise ctypes.WinError(errcode) + return EnumFunc.hwnd + + +# LRESULT SendMessage( +# HWND hWnd, +# UINT Msg, +# WPARAM wParam, +# LPARAM lParam +# ); +def SendMessageA(hWnd, Msg, wParam=0, lParam=0): + _SendMessageA = windll.user32.SendMessageA + _SendMessageA.argtypes = [HWND, UINT, WPARAM, LPARAM] + _SendMessageA.restype = LRESULT + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + return _SendMessageA(hWnd, Msg, wParam, lParam) + + +def SendMessageW(hWnd, Msg, wParam=0, lParam=0): + _SendMessageW = windll.user32.SendMessageW + _SendMessageW.argtypes = [HWND, UINT, WPARAM, LPARAM] + _SendMessageW.restype = LRESULT + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + return _SendMessageW(hWnd, Msg, wParam, lParam) + + +SendMessage = GuessStringType(SendMessageA, SendMessageW) + + +# BOOL PostMessage( +# HWND hWnd, +# UINT Msg, +# WPARAM wParam, +# LPARAM lParam +# ); +def PostMessageA(hWnd, Msg, wParam=0, lParam=0): + _PostMessageA = windll.user32.PostMessageA + _PostMessageA.argtypes = [HWND, UINT, WPARAM, LPARAM] + _PostMessageA.restype = bool + _PostMessageA.errcheck = RaiseIfZero + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + _PostMessageA(hWnd, Msg, wParam, lParam) + + +def PostMessageW(hWnd, Msg, wParam=0, lParam=0): + _PostMessageW = windll.user32.PostMessageW + _PostMessageW.argtypes = [HWND, UINT, WPARAM, LPARAM] + _PostMessageW.restype = bool + _PostMessageW.errcheck = RaiseIfZero + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + _PostMessageW(hWnd, Msg, wParam, lParam) + + +PostMessage = GuessStringType(PostMessageA, PostMessageW) + + +# BOOL PostThreadMessage( +# DWORD idThread, +# UINT Msg, +# WPARAM wParam, +# LPARAM lParam +# ); +def PostThreadMessageA(idThread, Msg, wParam=0, lParam=0): + _PostThreadMessageA = windll.user32.PostThreadMessageA + _PostThreadMessageA.argtypes = [DWORD, UINT, WPARAM, LPARAM] + _PostThreadMessageA.restype = bool + _PostThreadMessageA.errcheck = RaiseIfZero + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + _PostThreadMessageA(idThread, Msg, wParam, lParam) + + +def PostThreadMessageW(idThread, Msg, wParam=0, lParam=0): + _PostThreadMessageW = windll.user32.PostThreadMessageW + _PostThreadMessageW.argtypes = [DWORD, UINT, WPARAM, LPARAM] + _PostThreadMessageW.restype = bool + _PostThreadMessageW.errcheck = RaiseIfZero + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + _PostThreadMessageW(idThread, Msg, wParam, lParam) + + +PostThreadMessage = GuessStringType(PostThreadMessageA, PostThreadMessageW) + + +# LRESULT c( +# HWND hWnd, +# UINT Msg, +# WPARAM wParam, +# LPARAM lParam, +# UINT fuFlags, +# UINT uTimeout, +# PDWORD_PTR lpdwResult +# ); +def SendMessageTimeoutA(hWnd, Msg, wParam=0, lParam=0, fuFlags=0, uTimeout=0): + _SendMessageTimeoutA = windll.user32.SendMessageTimeoutA + _SendMessageTimeoutA.argtypes = [HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR] + _SendMessageTimeoutA.restype = LRESULT + _SendMessageTimeoutA.errcheck = RaiseIfZero + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + dwResult = DWORD(0) + _SendMessageTimeoutA(hWnd, Msg, wParam, lParam, fuFlags, uTimeout, byref(dwResult)) + return dwResult.value + + +def SendMessageTimeoutW(hWnd, Msg, wParam=0, lParam=0): + _SendMessageTimeoutW = windll.user32.SendMessageTimeoutW + _SendMessageTimeoutW.argtypes = [HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR] + _SendMessageTimeoutW.restype = LRESULT + _SendMessageTimeoutW.errcheck = RaiseIfZero + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + dwResult = DWORD(0) + _SendMessageTimeoutW(hWnd, Msg, wParam, lParam, fuFlags, uTimeout, byref(dwResult)) + return dwResult.value + + +SendMessageTimeout = GuessStringType(SendMessageTimeoutA, SendMessageTimeoutW) + + +# BOOL SendNotifyMessage( +# HWND hWnd, +# UINT Msg, +# WPARAM wParam, +# LPARAM lParam +# ); +def SendNotifyMessageA(hWnd, Msg, wParam=0, lParam=0): + _SendNotifyMessageA = windll.user32.SendNotifyMessageA + _SendNotifyMessageA.argtypes = [HWND, UINT, WPARAM, LPARAM] + _SendNotifyMessageA.restype = bool + _SendNotifyMessageA.errcheck = RaiseIfZero + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + _SendNotifyMessageA(hWnd, Msg, wParam, lParam) + + +def SendNotifyMessageW(hWnd, Msg, wParam=0, lParam=0): + _SendNotifyMessageW = windll.user32.SendNotifyMessageW + _SendNotifyMessageW.argtypes = [HWND, UINT, WPARAM, LPARAM] + _SendNotifyMessageW.restype = bool + _SendNotifyMessageW.errcheck = RaiseIfZero + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + _SendNotifyMessageW(hWnd, Msg, wParam, lParam) + + +SendNotifyMessage = GuessStringType(SendNotifyMessageA, SendNotifyMessageW) + + +# LRESULT SendDlgItemMessage( +# HWND hDlg, +# int nIDDlgItem, +# UINT Msg, +# WPARAM wParam, +# LPARAM lParam +# ); +def SendDlgItemMessageA(hDlg, nIDDlgItem, Msg, wParam=0, lParam=0): + _SendDlgItemMessageA = windll.user32.SendDlgItemMessageA + _SendDlgItemMessageA.argtypes = [HWND, ctypes.c_int, UINT, WPARAM, LPARAM] + _SendDlgItemMessageA.restype = LRESULT + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + return _SendDlgItemMessageA(hDlg, nIDDlgItem, Msg, wParam, lParam) + + +def SendDlgItemMessageW(hDlg, nIDDlgItem, Msg, wParam=0, lParam=0): + _SendDlgItemMessageW = windll.user32.SendDlgItemMessageW + _SendDlgItemMessageW.argtypes = [HWND, ctypes.c_int, UINT, WPARAM, LPARAM] + _SendDlgItemMessageW.restype = LRESULT + + wParam = MAKE_WPARAM(wParam) + lParam = MAKE_LPARAM(lParam) + return _SendDlgItemMessageW(hDlg, nIDDlgItem, Msg, wParam, lParam) + + +SendDlgItemMessage = GuessStringType(SendDlgItemMessageA, SendDlgItemMessageW) + + +# DWORD WINAPI WaitForInputIdle( +# _In_ HANDLE hProcess, +# _In_ DWORD dwMilliseconds +# ); +def WaitForInputIdle(hProcess, dwMilliseconds=INFINITE): + _WaitForInputIdle = windll.user32.WaitForInputIdle + _WaitForInputIdle.argtypes = [HANDLE, DWORD] + _WaitForInputIdle.restype = DWORD + + r = _WaitForInputIdle(hProcess, dwMilliseconds) + if r == WAIT_FAILED: + raise ctypes.WinError() + return r + + +# UINT RegisterWindowMessage( +# LPCTSTR lpString +# ); +def RegisterWindowMessageA(lpString): + _RegisterWindowMessageA = windll.user32.RegisterWindowMessageA + _RegisterWindowMessageA.argtypes = [LPSTR] + _RegisterWindowMessageA.restype = UINT + _RegisterWindowMessageA.errcheck = RaiseIfZero + return _RegisterWindowMessageA(lpString) + + +def RegisterWindowMessageW(lpString): + _RegisterWindowMessageW = windll.user32.RegisterWindowMessageW + _RegisterWindowMessageW.argtypes = [LPWSTR] + _RegisterWindowMessageW.restype = UINT + _RegisterWindowMessageW.errcheck = RaiseIfZero + return _RegisterWindowMessageW(lpString) + + +RegisterWindowMessage = GuessStringType(RegisterWindowMessageA, RegisterWindowMessageW) + + +# UINT RegisterClipboardFormat( +# LPCTSTR lpString +# ); +def RegisterClipboardFormatA(lpString): + _RegisterClipboardFormatA = windll.user32.RegisterClipboardFormatA + _RegisterClipboardFormatA.argtypes = [LPSTR] + _RegisterClipboardFormatA.restype = UINT + _RegisterClipboardFormatA.errcheck = RaiseIfZero + return _RegisterClipboardFormatA(lpString) + + +def RegisterClipboardFormatW(lpString): + _RegisterClipboardFormatW = windll.user32.RegisterClipboardFormatW + _RegisterClipboardFormatW.argtypes = [LPWSTR] + _RegisterClipboardFormatW.restype = UINT + _RegisterClipboardFormatW.errcheck = RaiseIfZero + return _RegisterClipboardFormatW(lpString) + + +RegisterClipboardFormat = GuessStringType(RegisterClipboardFormatA, RegisterClipboardFormatW) + + +# HANDLE WINAPI GetProp( +# __in HWND hWnd, +# __in LPCTSTR lpString +# ); +def GetPropA(hWnd, lpString): + _GetPropA = windll.user32.GetPropA + _GetPropA.argtypes = [HWND, LPSTR] + _GetPropA.restype = HANDLE + return _GetPropA(hWnd, lpString) + + +def GetPropW(hWnd, lpString): + _GetPropW = windll.user32.GetPropW + _GetPropW.argtypes = [HWND, LPWSTR] + _GetPropW.restype = HANDLE + return _GetPropW(hWnd, lpString) + + +GetProp = GuessStringType(GetPropA, GetPropW) + + +# BOOL WINAPI SetProp( +# __in HWND hWnd, +# __in LPCTSTR lpString, +# __in_opt HANDLE hData +# ); +def SetPropA(hWnd, lpString, hData): + _SetPropA = windll.user32.SetPropA + _SetPropA.argtypes = [HWND, LPSTR, HANDLE] + _SetPropA.restype = BOOL + _SetPropA.errcheck = RaiseIfZero + _SetPropA(hWnd, lpString, hData) + + +def SetPropW(hWnd, lpString, hData): + _SetPropW = windll.user32.SetPropW + _SetPropW.argtypes = [HWND, LPWSTR, HANDLE] + _SetPropW.restype = BOOL + _SetPropW.errcheck = RaiseIfZero + _SetPropW(hWnd, lpString, hData) + + +SetProp = GuessStringType(SetPropA, SetPropW) + + +# HANDLE WINAPI RemoveProp( +# __in HWND hWnd, +# __in LPCTSTR lpString +# ); +def RemovePropA(hWnd, lpString): + _RemovePropA = windll.user32.RemovePropA + _RemovePropA.argtypes = [HWND, LPSTR] + _RemovePropA.restype = HANDLE + return _RemovePropA(hWnd, lpString) + + +def RemovePropW(hWnd, lpString): + _RemovePropW = windll.user32.RemovePropW + _RemovePropW.argtypes = [HWND, LPWSTR] + _RemovePropW.restype = HANDLE + return _RemovePropW(hWnd, lpString) + + +RemoveProp = GuessStringType(RemovePropA, RemovePropW) + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/version.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/version.py new file mode 100644 index 0000000..556bbeb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/version.py @@ -0,0 +1,1085 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Detect the current architecture and operating system. + +Some functions here are really from kernel32.dll, others from version.dll. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- NTDDI version ------------------------------------------------------------ + +NTDDI_WIN8 = 0x06020000 +NTDDI_WIN7SP1 = 0x06010100 +NTDDI_WIN7 = 0x06010000 +NTDDI_WS08 = 0x06000100 +NTDDI_VISTASP1 = 0x06000100 +NTDDI_VISTA = 0x06000000 +NTDDI_LONGHORN = NTDDI_VISTA +NTDDI_WS03SP2 = 0x05020200 +NTDDI_WS03SP1 = 0x05020100 +NTDDI_WS03 = 0x05020000 +NTDDI_WINXPSP3 = 0x05010300 +NTDDI_WINXPSP2 = 0x05010200 +NTDDI_WINXPSP1 = 0x05010100 +NTDDI_WINXP = 0x05010000 +NTDDI_WIN2KSP4 = 0x05000400 +NTDDI_WIN2KSP3 = 0x05000300 +NTDDI_WIN2KSP2 = 0x05000200 +NTDDI_WIN2KSP1 = 0x05000100 +NTDDI_WIN2K = 0x05000000 +NTDDI_WINNT4 = 0x04000000 + +OSVERSION_MASK = 0xFFFF0000 +SPVERSION_MASK = 0x0000FF00 +SUBVERSION_MASK = 0x000000FF + +# --- OSVERSIONINFO and OSVERSIONINFOEX structures and constants --------------- + +VER_PLATFORM_WIN32s = 0 +VER_PLATFORM_WIN32_WINDOWS = 1 +VER_PLATFORM_WIN32_NT = 2 + +VER_SUITE_BACKOFFICE = 0x00000004 +VER_SUITE_BLADE = 0x00000400 +VER_SUITE_COMPUTE_SERVER = 0x00004000 +VER_SUITE_DATACENTER = 0x00000080 +VER_SUITE_ENTERPRISE = 0x00000002 +VER_SUITE_EMBEDDEDNT = 0x00000040 +VER_SUITE_PERSONAL = 0x00000200 +VER_SUITE_SINGLEUSERTS = 0x00000100 +VER_SUITE_SMALLBUSINESS = 0x00000001 +VER_SUITE_SMALLBUSINESS_RESTRICTED = 0x00000020 +VER_SUITE_STORAGE_SERVER = 0x00002000 +VER_SUITE_TERMINAL = 0x00000010 +VER_SUITE_WH_SERVER = 0x00008000 + +VER_NT_DOMAIN_CONTROLLER = 0x0000002 +VER_NT_SERVER = 0x0000003 +VER_NT_WORKSTATION = 0x0000001 + +VER_BUILDNUMBER = 0x0000004 +VER_MAJORVERSION = 0x0000002 +VER_MINORVERSION = 0x0000001 +VER_PLATFORMID = 0x0000008 +VER_PRODUCT_TYPE = 0x0000080 +VER_SERVICEPACKMAJOR = 0x0000020 +VER_SERVICEPACKMINOR = 0x0000010 +VER_SUITENAME = 0x0000040 + +VER_EQUAL = 1 +VER_GREATER = 2 +VER_GREATER_EQUAL = 3 +VER_LESS = 4 +VER_LESS_EQUAL = 5 +VER_AND = 6 +VER_OR = 7 + + +# typedef struct _OSVERSIONINFO { +# DWORD dwOSVersionInfoSize; +# DWORD dwMajorVersion; +# DWORD dwMinorVersion; +# DWORD dwBuildNumber; +# DWORD dwPlatformId; +# TCHAR szCSDVersion[128]; +# }OSVERSIONINFO; +class OSVERSIONINFOA(Structure): + _fields_ = [ + ("dwOSVersionInfoSize", DWORD), + ("dwMajorVersion", DWORD), + ("dwMinorVersion", DWORD), + ("dwBuildNumber", DWORD), + ("dwPlatformId", DWORD), + ("szCSDVersion", CHAR * 128), + ] + + +class OSVERSIONINFOW(Structure): + _fields_ = [ + ("dwOSVersionInfoSize", DWORD), + ("dwMajorVersion", DWORD), + ("dwMinorVersion", DWORD), + ("dwBuildNumber", DWORD), + ("dwPlatformId", DWORD), + ("szCSDVersion", WCHAR * 128), + ] + + +# typedef struct _OSVERSIONINFOEX { +# DWORD dwOSVersionInfoSize; +# DWORD dwMajorVersion; +# DWORD dwMinorVersion; +# DWORD dwBuildNumber; +# DWORD dwPlatformId; +# TCHAR szCSDVersion[128]; +# WORD wServicePackMajor; +# WORD wServicePackMinor; +# WORD wSuiteMask; +# BYTE wProductType; +# BYTE wReserved; +# }OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX; +class OSVERSIONINFOEXA(Structure): + _fields_ = [ + ("dwOSVersionInfoSize", DWORD), + ("dwMajorVersion", DWORD), + ("dwMinorVersion", DWORD), + ("dwBuildNumber", DWORD), + ("dwPlatformId", DWORD), + ("szCSDVersion", CHAR * 128), + ("wServicePackMajor", WORD), + ("wServicePackMinor", WORD), + ("wSuiteMask", WORD), + ("wProductType", BYTE), + ("wReserved", BYTE), + ] + + +class OSVERSIONINFOEXW(Structure): + _fields_ = [ + ("dwOSVersionInfoSize", DWORD), + ("dwMajorVersion", DWORD), + ("dwMinorVersion", DWORD), + ("dwBuildNumber", DWORD), + ("dwPlatformId", DWORD), + ("szCSDVersion", WCHAR * 128), + ("wServicePackMajor", WORD), + ("wServicePackMinor", WORD), + ("wSuiteMask", WORD), + ("wProductType", BYTE), + ("wReserved", BYTE), + ] + + +LPOSVERSIONINFOA = POINTER(OSVERSIONINFOA) +LPOSVERSIONINFOW = POINTER(OSVERSIONINFOW) +LPOSVERSIONINFOEXA = POINTER(OSVERSIONINFOEXA) +LPOSVERSIONINFOEXW = POINTER(OSVERSIONINFOEXW) +POSVERSIONINFOA = LPOSVERSIONINFOA +POSVERSIONINFOW = LPOSVERSIONINFOW +POSVERSIONINFOEXA = LPOSVERSIONINFOEXA +POSVERSIONINFOEXW = LPOSVERSIONINFOA + +# --- GetSystemMetrics constants ----------------------------------------------- + +SM_CXSCREEN = 0 +SM_CYSCREEN = 1 +SM_CXVSCROLL = 2 +SM_CYHSCROLL = 3 +SM_CYCAPTION = 4 +SM_CXBORDER = 5 +SM_CYBORDER = 6 +SM_CXDLGFRAME = 7 +SM_CYDLGFRAME = 8 +SM_CYVTHUMB = 9 +SM_CXHTHUMB = 10 +SM_CXICON = 11 +SM_CYICON = 12 +SM_CXCURSOR = 13 +SM_CYCURSOR = 14 +SM_CYMENU = 15 +SM_CXFULLSCREEN = 16 +SM_CYFULLSCREEN = 17 +SM_CYKANJIWINDOW = 18 +SM_MOUSEPRESENT = 19 +SM_CYVSCROLL = 20 +SM_CXHSCROLL = 21 +SM_DEBUG = 22 +SM_SWAPBUTTON = 23 +SM_RESERVED1 = 24 +SM_RESERVED2 = 25 +SM_RESERVED3 = 26 +SM_RESERVED4 = 27 +SM_CXMIN = 28 +SM_CYMIN = 29 +SM_CXSIZE = 30 +SM_CYSIZE = 31 +SM_CXFRAME = 32 +SM_CYFRAME = 33 +SM_CXMINTRACK = 34 +SM_CYMINTRACK = 35 +SM_CXDOUBLECLK = 36 +SM_CYDOUBLECLK = 37 +SM_CXICONSPACING = 38 +SM_CYICONSPACING = 39 +SM_MENUDROPALIGNMENT = 40 +SM_PENWINDOWS = 41 +SM_DBCSENABLED = 42 +SM_CMOUSEBUTTONS = 43 + +SM_CXFIXEDFRAME = SM_CXDLGFRAME # ;win40 name change +SM_CYFIXEDFRAME = SM_CYDLGFRAME # ;win40 name change +SM_CXSIZEFRAME = SM_CXFRAME # ;win40 name change +SM_CYSIZEFRAME = SM_CYFRAME # ;win40 name change + +SM_SECURE = 44 +SM_CXEDGE = 45 +SM_CYEDGE = 46 +SM_CXMINSPACING = 47 +SM_CYMINSPACING = 48 +SM_CXSMICON = 49 +SM_CYSMICON = 50 +SM_CYSMCAPTION = 51 +SM_CXSMSIZE = 52 +SM_CYSMSIZE = 53 +SM_CXMENUSIZE = 54 +SM_CYMENUSIZE = 55 +SM_ARRANGE = 56 +SM_CXMINIMIZED = 57 +SM_CYMINIMIZED = 58 +SM_CXMAXTRACK = 59 +SM_CYMAXTRACK = 60 +SM_CXMAXIMIZED = 61 +SM_CYMAXIMIZED = 62 +SM_NETWORK = 63 +SM_CLEANBOOT = 67 +SM_CXDRAG = 68 +SM_CYDRAG = 69 +SM_SHOWSOUNDS = 70 +SM_CXMENUCHECK = 71 # Use instead of GetMenuCheckMarkDimensions()! +SM_CYMENUCHECK = 72 +SM_SLOWMACHINE = 73 +SM_MIDEASTENABLED = 74 +SM_MOUSEWHEELPRESENT = 75 +SM_XVIRTUALSCREEN = 76 +SM_YVIRTUALSCREEN = 77 +SM_CXVIRTUALSCREEN = 78 +SM_CYVIRTUALSCREEN = 79 +SM_CMONITORS = 80 +SM_SAMEDISPLAYFORMAT = 81 +SM_IMMENABLED = 82 +SM_CXFOCUSBORDER = 83 +SM_CYFOCUSBORDER = 84 +SM_TABLETPC = 86 +SM_MEDIACENTER = 87 +SM_STARTER = 88 +SM_SERVERR2 = 89 +SM_MOUSEHORIZONTALWHEELPRESENT = 91 +SM_CXPADDEDBORDER = 92 + +SM_CMETRICS = 93 + +SM_REMOTESESSION = 0x1000 +SM_SHUTTINGDOWN = 0x2000 +SM_REMOTECONTROL = 0x2001 +SM_CARETBLINKINGENABLED = 0x2002 + +# --- SYSTEM_INFO structure, GetSystemInfo() and GetNativeSystemInfo() --------- + +# Values used by Wine +# Documented values at MSDN are marked with an asterisk +PROCESSOR_ARCHITECTURE_UNKNOWN = 0xFFFF # Unknown architecture. +PROCESSOR_ARCHITECTURE_INTEL = 0 # x86 (AMD or Intel) * +PROCESSOR_ARCHITECTURE_MIPS = 1 # MIPS +PROCESSOR_ARCHITECTURE_ALPHA = 2 # Alpha +PROCESSOR_ARCHITECTURE_PPC = 3 # Power PC +PROCESSOR_ARCHITECTURE_SHX = 4 # SHX +PROCESSOR_ARCHITECTURE_ARM = 5 # ARM +PROCESSOR_ARCHITECTURE_IA64 = 6 # Intel Itanium * +PROCESSOR_ARCHITECTURE_ALPHA64 = 7 # Alpha64 +PROCESSOR_ARCHITECTURE_MSIL = 8 # MSIL +PROCESSOR_ARCHITECTURE_AMD64 = 9 # x64 (AMD or Intel) * +PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 = 10 # IA32 on Win64 +PROCESSOR_ARCHITECTURE_SPARC = 20 # Sparc (Wine) + +# Values used by Wine +# PROCESSOR_OPTIL value found at http://code.google.com/p/ddab-lib/ +# Documented values at MSDN are marked with an asterisk +PROCESSOR_INTEL_386 = 386 # Intel i386 * +PROCESSOR_INTEL_486 = 486 # Intel i486 * +PROCESSOR_INTEL_PENTIUM = 586 # Intel Pentium * +PROCESSOR_INTEL_IA64 = 2200 # Intel IA64 (Itanium) * +PROCESSOR_AMD_X8664 = 8664 # AMD X86 64 * +PROCESSOR_MIPS_R4000 = 4000 # MIPS R4000, R4101, R3910 +PROCESSOR_ALPHA_21064 = 21064 # Alpha 210 64 +PROCESSOR_PPC_601 = 601 # PPC 601 +PROCESSOR_PPC_603 = 603 # PPC 603 +PROCESSOR_PPC_604 = 604 # PPC 604 +PROCESSOR_PPC_620 = 620 # PPC 620 +PROCESSOR_HITACHI_SH3 = 10003 # Hitachi SH3 (Windows CE) +PROCESSOR_HITACHI_SH3E = 10004 # Hitachi SH3E (Windows CE) +PROCESSOR_HITACHI_SH4 = 10005 # Hitachi SH4 (Windows CE) +PROCESSOR_MOTOROLA_821 = 821 # Motorola 821 (Windows CE) +PROCESSOR_SHx_SH3 = 103 # SHx SH3 (Windows CE) +PROCESSOR_SHx_SH4 = 104 # SHx SH4 (Windows CE) +PROCESSOR_STRONGARM = 2577 # StrongARM (Windows CE) +PROCESSOR_ARM720 = 1824 # ARM 720 (Windows CE) +PROCESSOR_ARM820 = 2080 # ARM 820 (Windows CE) +PROCESSOR_ARM920 = 2336 # ARM 920 (Windows CE) +PROCESSOR_ARM_7TDMI = 70001 # ARM 7TDMI (Windows CE) +PROCESSOR_OPTIL = 0x494F # MSIL + +# typedef struct _SYSTEM_INFO { +# union { +# DWORD dwOemId; +# struct { +# WORD wProcessorArchitecture; +# WORD wReserved; +# } ; +# } ; +# DWORD dwPageSize; +# LPVOID lpMinimumApplicationAddress; +# LPVOID lpMaximumApplicationAddress; +# DWORD_PTR dwActiveProcessorMask; +# DWORD dwNumberOfProcessors; +# DWORD dwProcessorType; +# DWORD dwAllocationGranularity; +# WORD wProcessorLevel; +# WORD wProcessorRevision; +# } SYSTEM_INFO; + + +class _SYSTEM_INFO_OEM_ID_STRUCT(Structure): + _fields_ = [ + ("wProcessorArchitecture", WORD), + ("wReserved", WORD), + ] + + +class _SYSTEM_INFO_OEM_ID(Union): + _fields_ = [ + ("dwOemId", DWORD), + ("w", _SYSTEM_INFO_OEM_ID_STRUCT), + ] + + +class SYSTEM_INFO(Structure): + _fields_ = [ + ("id", _SYSTEM_INFO_OEM_ID), + ("dwPageSize", DWORD), + ("lpMinimumApplicationAddress", LPVOID), + ("lpMaximumApplicationAddress", LPVOID), + ("dwActiveProcessorMask", DWORD_PTR), + ("dwNumberOfProcessors", DWORD), + ("dwProcessorType", DWORD), + ("dwAllocationGranularity", DWORD), + ("wProcessorLevel", WORD), + ("wProcessorRevision", WORD), + ] + + def __get_dwOemId(self): + return self.id.dwOemId + + def __set_dwOemId(self, value): + self.id.dwOemId = value + + dwOemId = property(__get_dwOemId, __set_dwOemId) + + def __get_wProcessorArchitecture(self): + return self.id.w.wProcessorArchitecture + + def __set_wProcessorArchitecture(self, value): + self.id.w.wProcessorArchitecture = value + + wProcessorArchitecture = property(__get_wProcessorArchitecture, __set_wProcessorArchitecture) + + +LPSYSTEM_INFO = ctypes.POINTER(SYSTEM_INFO) + + +# void WINAPI GetSystemInfo( +# __out LPSYSTEM_INFO lpSystemInfo +# ); +def GetSystemInfo(): + _GetSystemInfo = windll.kernel32.GetSystemInfo + _GetSystemInfo.argtypes = [LPSYSTEM_INFO] + _GetSystemInfo.restype = None + + sysinfo = SYSTEM_INFO() + _GetSystemInfo(byref(sysinfo)) + return sysinfo + + +# void WINAPI GetNativeSystemInfo( +# __out LPSYSTEM_INFO lpSystemInfo +# ); +def GetNativeSystemInfo(): + _GetNativeSystemInfo = windll.kernel32.GetNativeSystemInfo + _GetNativeSystemInfo.argtypes = [LPSYSTEM_INFO] + _GetNativeSystemInfo.restype = None + + sysinfo = SYSTEM_INFO() + _GetNativeSystemInfo(byref(sysinfo)) + return sysinfo + + +# int WINAPI GetSystemMetrics( +# __in int nIndex +# ); +def GetSystemMetrics(nIndex): + _GetSystemMetrics = windll.user32.GetSystemMetrics + _GetSystemMetrics.argtypes = [ctypes.c_int] + _GetSystemMetrics.restype = ctypes.c_int + return _GetSystemMetrics(nIndex) + + +# SIZE_T WINAPI GetLargePageMinimum(void); +def GetLargePageMinimum(): + _GetLargePageMinimum = windll.user32.GetLargePageMinimum + _GetLargePageMinimum.argtypes = [] + _GetLargePageMinimum.restype = SIZE_T + return _GetLargePageMinimum() + + +# HANDLE WINAPI GetCurrentProcess(void); +def GetCurrentProcess(): + ## return 0xFFFFFFFFFFFFFFFFL + _GetCurrentProcess = windll.kernel32.GetCurrentProcess + _GetCurrentProcess.argtypes = [] + _GetCurrentProcess.restype = HANDLE + return _GetCurrentProcess() + + +# HANDLE WINAPI GetCurrentThread(void); +def GetCurrentThread(): + ## return 0xFFFFFFFFFFFFFFFEL + _GetCurrentThread = windll.kernel32.GetCurrentThread + _GetCurrentThread.argtypes = [] + _GetCurrentThread.restype = HANDLE + return _GetCurrentThread() + + +# BOOL WINAPI IsWow64Process( +# __in HANDLE hProcess, +# __out PBOOL Wow64Process +# ); +def IsWow64Process(hProcess): + _IsWow64Process = windll.kernel32.IsWow64Process + _IsWow64Process.argtypes = [HANDLE, PBOOL] + _IsWow64Process.restype = bool + _IsWow64Process.errcheck = RaiseIfZero + + Wow64Process = BOOL(FALSE) + _IsWow64Process(hProcess, byref(Wow64Process)) + return bool(Wow64Process) + + +# DWORD WINAPI GetVersion(void); +def GetVersion(): + _GetVersion = windll.kernel32.GetVersion + _GetVersion.argtypes = [] + _GetVersion.restype = DWORD + _GetVersion.errcheck = RaiseIfZero + + # See the example code here: + # http://msdn.microsoft.com/en-us/library/ms724439(VS.85).aspx + + dwVersion = _GetVersion() + dwMajorVersion = dwVersion & 0x000000FF + dwMinorVersion = (dwVersion & 0x0000FF00) >> 8 + if (dwVersion & 0x80000000) == 0: + dwBuild = (dwVersion & 0x7FFF0000) >> 16 + else: + dwBuild = None + return int(dwMajorVersion), int(dwMinorVersion), int(dwBuild) + + +# BOOL WINAPI GetVersionEx( +# __inout LPOSVERSIONINFO lpVersionInfo +# ); +def GetVersionExA(): + _GetVersionExA = windll.kernel32.GetVersionExA + _GetVersionExA.argtypes = [POINTER(OSVERSIONINFOEXA)] + _GetVersionExA.restype = bool + _GetVersionExA.errcheck = RaiseIfZero + + osi = OSVERSIONINFOEXA() + osi.dwOSVersionInfoSize = sizeof(osi) + try: + _GetVersionExA(byref(osi)) + except WindowsError: + osi = OSVERSIONINFOA() + osi.dwOSVersionInfoSize = sizeof(osi) + _GetVersionExA.argtypes = [POINTER(OSVERSIONINFOA)] + _GetVersionExA(byref(osi)) + return osi + + +def GetVersionExW(): + _GetVersionExW = windll.kernel32.GetVersionExW + _GetVersionExW.argtypes = [POINTER(OSVERSIONINFOEXW)] + _GetVersionExW.restype = bool + _GetVersionExW.errcheck = RaiseIfZero + + osi = OSVERSIONINFOEXW() + osi.dwOSVersionInfoSize = sizeof(osi) + try: + _GetVersionExW(byref(osi)) + except WindowsError: + osi = OSVERSIONINFOW() + osi.dwOSVersionInfoSize = sizeof(osi) + _GetVersionExW.argtypes = [POINTER(OSVERSIONINFOW)] + _GetVersionExW(byref(osi)) + return osi + + +GetVersionEx = GuessStringType(GetVersionExA, GetVersionExW) + + +# BOOL WINAPI GetProductInfo( +# __in DWORD dwOSMajorVersion, +# __in DWORD dwOSMinorVersion, +# __in DWORD dwSpMajorVersion, +# __in DWORD dwSpMinorVersion, +# __out PDWORD pdwReturnedProductType +# ); +def GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion): + _GetProductInfo = windll.kernel32.GetProductInfo + _GetProductInfo.argtypes = [DWORD, DWORD, DWORD, DWORD, PDWORD] + _GetProductInfo.restype = BOOL + _GetProductInfo.errcheck = RaiseIfZero + + dwReturnedProductType = DWORD(0) + _GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, byref(dwReturnedProductType)) + return dwReturnedProductType.value + + +# BOOL WINAPI VerifyVersionInfo( +# __in LPOSVERSIONINFOEX lpVersionInfo, +# __in DWORD dwTypeMask, +# __in DWORDLONG dwlConditionMask +# ); +def VerifyVersionInfo(lpVersionInfo, dwTypeMask, dwlConditionMask): + if isinstance(lpVersionInfo, OSVERSIONINFOEXA): + return VerifyVersionInfoA(lpVersionInfo, dwTypeMask, dwlConditionMask) + if isinstance(lpVersionInfo, OSVERSIONINFOEXW): + return VerifyVersionInfoW(lpVersionInfo, dwTypeMask, dwlConditionMask) + raise TypeError("Bad OSVERSIONINFOEX structure") + + +def VerifyVersionInfoA(lpVersionInfo, dwTypeMask, dwlConditionMask): + _VerifyVersionInfoA = windll.kernel32.VerifyVersionInfoA + _VerifyVersionInfoA.argtypes = [LPOSVERSIONINFOEXA, DWORD, DWORDLONG] + _VerifyVersionInfoA.restype = bool + return _VerifyVersionInfoA(byref(lpVersionInfo), dwTypeMask, dwlConditionMask) + + +def VerifyVersionInfoW(lpVersionInfo, dwTypeMask, dwlConditionMask): + _VerifyVersionInfoW = windll.kernel32.VerifyVersionInfoW + _VerifyVersionInfoW.argtypes = [LPOSVERSIONINFOEXW, DWORD, DWORDLONG] + _VerifyVersionInfoW.restype = bool + return _VerifyVersionInfoW(byref(lpVersionInfo), dwTypeMask, dwlConditionMask) + + +# ULONGLONG WINAPI VerSetConditionMask( +# __in ULONGLONG dwlConditionMask, +# __in DWORD dwTypeBitMask, +# __in BYTE dwConditionMask +# ); +def VerSetConditionMask(dwlConditionMask, dwTypeBitMask, dwConditionMask): + _VerSetConditionMask = windll.kernel32.VerSetConditionMask + _VerSetConditionMask.argtypes = [ULONGLONG, DWORD, BYTE] + _VerSetConditionMask.restype = ULONGLONG + return _VerSetConditionMask(dwlConditionMask, dwTypeBitMask, dwConditionMask) + + +# --- get_bits, get_arch and get_os -------------------------------------------- + +ARCH_UNKNOWN = "unknown" +ARCH_I386 = "i386" +ARCH_MIPS = "mips" +ARCH_ALPHA = "alpha" +ARCH_PPC = "ppc" +ARCH_SHX = "shx" +ARCH_ARM = "arm" +ARCH_ARM64 = "arm64" +ARCH_THUMB = "thumb" +ARCH_IA64 = "ia64" +ARCH_ALPHA64 = "alpha64" +ARCH_MSIL = "msil" +ARCH_AMD64 = "amd64" +ARCH_SPARC = "sparc" + +# aliases +ARCH_IA32 = ARCH_I386 +ARCH_X86 = ARCH_I386 +ARCH_X64 = ARCH_AMD64 +ARCH_ARM7 = ARCH_ARM +ARCH_ARM8 = ARCH_ARM64 +ARCH_T32 = ARCH_THUMB +ARCH_AARCH32 = ARCH_ARM7 +ARCH_AARCH64 = ARCH_ARM8 +ARCH_POWERPC = ARCH_PPC +ARCH_HITACHI = ARCH_SHX +ARCH_ITANIUM = ARCH_IA64 + +# win32 constants -> our constants +_arch_map = { + PROCESSOR_ARCHITECTURE_INTEL: ARCH_I386, + PROCESSOR_ARCHITECTURE_MIPS: ARCH_MIPS, + PROCESSOR_ARCHITECTURE_ALPHA: ARCH_ALPHA, + PROCESSOR_ARCHITECTURE_PPC: ARCH_PPC, + PROCESSOR_ARCHITECTURE_SHX: ARCH_SHX, + PROCESSOR_ARCHITECTURE_ARM: ARCH_ARM, + PROCESSOR_ARCHITECTURE_IA64: ARCH_IA64, + PROCESSOR_ARCHITECTURE_ALPHA64: ARCH_ALPHA64, + PROCESSOR_ARCHITECTURE_MSIL: ARCH_MSIL, + PROCESSOR_ARCHITECTURE_AMD64: ARCH_AMD64, + PROCESSOR_ARCHITECTURE_SPARC: ARCH_SPARC, +} + +OS_UNKNOWN = "Unknown" +OS_NT = "Windows NT" +OS_W2K = "Windows 2000" +OS_XP = "Windows XP" +OS_XP_64 = "Windows XP (64 bits)" +OS_W2K3 = "Windows 2003" +OS_W2K3_64 = "Windows 2003 (64 bits)" +OS_W2K3R2 = "Windows 2003 R2" +OS_W2K3R2_64 = "Windows 2003 R2 (64 bits)" +OS_W2K8 = "Windows 2008" +OS_W2K8_64 = "Windows 2008 (64 bits)" +OS_W2K8R2 = "Windows 2008 R2" +OS_W2K8R2_64 = "Windows 2008 R2 (64 bits)" +OS_VISTA = "Windows Vista" +OS_VISTA_64 = "Windows Vista (64 bits)" +OS_W7 = "Windows 7" +OS_W7_64 = "Windows 7 (64 bits)" + +OS_SEVEN = OS_W7 +OS_SEVEN_64 = OS_W7_64 + +OS_WINDOWS_NT = OS_NT +OS_WINDOWS_2000 = OS_W2K +OS_WINDOWS_XP = OS_XP +OS_WINDOWS_XP_64 = OS_XP_64 +OS_WINDOWS_2003 = OS_W2K3 +OS_WINDOWS_2003_64 = OS_W2K3_64 +OS_WINDOWS_2003_R2 = OS_W2K3R2 +OS_WINDOWS_2003_R2_64 = OS_W2K3R2_64 +OS_WINDOWS_2008 = OS_W2K8 +OS_WINDOWS_2008_64 = OS_W2K8_64 +OS_WINDOWS_2008_R2 = OS_W2K8R2 +OS_WINDOWS_2008_R2_64 = OS_W2K8R2_64 +OS_WINDOWS_VISTA = OS_VISTA +OS_WINDOWS_VISTA_64 = OS_VISTA_64 +OS_WINDOWS_SEVEN = OS_W7 +OS_WINDOWS_SEVEN_64 = OS_W7_64 + + +def _get_bits(): + """ + Determines the current integer size in bits. + + This is useful to know if we're running in a 32 bits or a 64 bits machine. + + @rtype: int + @return: Returns the size of L{SIZE_T} in bits. + """ + return sizeof(SIZE_T) * 8 + + +def _get_arch(): + """ + Determines the current processor architecture. + + @rtype: str + @return: + On error, returns: + + - L{ARCH_UNKNOWN} (C{"unknown"}) meaning the architecture could not be detected or is not known to WinAppDbg. + + On success, returns one of the following values: + + - L{ARCH_I386} (C{"i386"}) for Intel 32-bit x86 processor or compatible. + - L{ARCH_AMD64} (C{"amd64"}) for Intel 64-bit x86_64 processor or compatible. + + May also return one of the following values if you get both Python and + WinAppDbg to work in such machines... let me know if you do! :) + + - L{ARCH_MIPS} (C{"mips"}) for MIPS compatible processors. + - L{ARCH_ALPHA} (C{"alpha"}) for Alpha processors. + - L{ARCH_PPC} (C{"ppc"}) for PowerPC compatible processors. + - L{ARCH_SHX} (C{"shx"}) for Hitachi SH processors. + - L{ARCH_ARM} (C{"arm"}) for ARM compatible processors. + - L{ARCH_IA64} (C{"ia64"}) for Intel Itanium processor or compatible. + - L{ARCH_ALPHA64} (C{"alpha64"}) for Alpha64 processors. + - L{ARCH_MSIL} (C{"msil"}) for the .NET virtual machine. + - L{ARCH_SPARC} (C{"sparc"}) for Sun Sparc processors. + + Probably IronPython returns C{ARCH_MSIL} but I haven't tried it. Python + on Windows CE and Windows Mobile should return C{ARCH_ARM}. Python on + Solaris using Wine would return C{ARCH_SPARC}. Python in an Itanium + machine should return C{ARCH_IA64} both on Wine and proper Windows. + All other values should only be returned on Linux using Wine. + """ + try: + si = GetNativeSystemInfo() + except Exception: + si = GetSystemInfo() + try: + return _arch_map[si.id.w.wProcessorArchitecture] + except KeyError: + return ARCH_UNKNOWN + + +def _get_wow64(): + """ + Determines if the current process is running in Windows-On-Windows 64 bits. + + @rtype: bool + @return: C{True} of the current process is a 32 bit program running in a + 64 bit version of Windows, C{False} if it's either a 32 bit program + in a 32 bit Windows or a 64 bit program in a 64 bit Windows. + """ + # Try to determine if the debugger itself is running on WOW64. + # On error assume False. + if bits == 64: + wow64 = False + else: + try: + wow64 = IsWow64Process(GetCurrentProcess()) + except Exception: + wow64 = False + return wow64 + + +def _get_os(osvi=None): + """ + Determines the current operating system. + + This function allows you to quickly tell apart major OS differences. + For more detailed information call L{GetVersionEx} instead. + + @note: + Wine reports itself as Windows XP 32 bits + (even if the Linux host is 64 bits). + ReactOS may report itself as Windows 2000 or Windows XP, + depending on the version of ReactOS. + + @type osvi: L{OSVERSIONINFOEXA} + @param osvi: Optional. The return value from L{GetVersionEx}. + + @rtype: str + @return: + One of the following values: + - L{OS_UNKNOWN} (C{"Unknown"}) + - L{OS_NT} (C{"Windows NT"}) + - L{OS_W2K} (C{"Windows 2000"}) + - L{OS_XP} (C{"Windows XP"}) + - L{OS_XP_64} (C{"Windows XP (64 bits)"}) + - L{OS_W2K3} (C{"Windows 2003"}) + - L{OS_W2K3_64} (C{"Windows 2003 (64 bits)"}) + - L{OS_W2K3R2} (C{"Windows 2003 R2"}) + - L{OS_W2K3R2_64} (C{"Windows 2003 R2 (64 bits)"}) + - L{OS_W2K8} (C{"Windows 2008"}) + - L{OS_W2K8_64} (C{"Windows 2008 (64 bits)"}) + - L{OS_W2K8R2} (C{"Windows 2008 R2"}) + - L{OS_W2K8R2_64} (C{"Windows 2008 R2 (64 bits)"}) + - L{OS_VISTA} (C{"Windows Vista"}) + - L{OS_VISTA_64} (C{"Windows Vista (64 bits)"}) + - L{OS_W7} (C{"Windows 7"}) + - L{OS_W7_64} (C{"Windows 7 (64 bits)"}) + """ + # rough port of http://msdn.microsoft.com/en-us/library/ms724429%28VS.85%29.aspx + if not osvi: + osvi = GetVersionEx() + if osvi.dwPlatformId == VER_PLATFORM_WIN32_NT and osvi.dwMajorVersion > 4: + if osvi.dwMajorVersion == 6: + if osvi.dwMinorVersion == 0: + if osvi.wProductType == VER_NT_WORKSTATION: + if bits == 64 or wow64: + return "Windows Vista (64 bits)" + return "Windows Vista" + else: + if bits == 64 or wow64: + return "Windows 2008 (64 bits)" + return "Windows 2008" + if osvi.dwMinorVersion == 1: + if osvi.wProductType == VER_NT_WORKSTATION: + if bits == 64 or wow64: + return "Windows 7 (64 bits)" + return "Windows 7" + else: + if bits == 64 or wow64: + return "Windows 2008 R2 (64 bits)" + return "Windows 2008 R2" + if osvi.dwMajorVersion == 5: + if osvi.dwMinorVersion == 2: + if GetSystemMetrics(SM_SERVERR2): + if bits == 64 or wow64: + return "Windows 2003 R2 (64 bits)" + return "Windows 2003 R2" + if osvi.wSuiteMask in (VER_SUITE_STORAGE_SERVER, VER_SUITE_WH_SERVER): + if bits == 64 or wow64: + return "Windows 2003 (64 bits)" + return "Windows 2003" + if osvi.wProductType == VER_NT_WORKSTATION and arch == ARCH_AMD64: + return "Windows XP (64 bits)" + else: + if bits == 64 or wow64: + return "Windows 2003 (64 bits)" + return "Windows 2003" + if osvi.dwMinorVersion == 1: + return "Windows XP" + if osvi.dwMinorVersion == 0: + return "Windows 2000" + if osvi.dwMajorVersion == 4: + return "Windows NT" + return "Unknown" + + +def _get_ntddi(osvi): + """ + Determines the current operating system. + + This function allows you to quickly tell apart major OS differences. + For more detailed information call L{kernel32.GetVersionEx} instead. + + @note: + Wine reports itself as Windows XP 32 bits + (even if the Linux host is 64 bits). + ReactOS may report itself as Windows 2000 or Windows XP, + depending on the version of ReactOS. + + @type osvi: L{OSVERSIONINFOEXA} + @param osvi: Optional. The return value from L{kernel32.GetVersionEx}. + + @rtype: int + @return: NTDDI version number. + """ + if not osvi: + osvi = GetVersionEx() + ntddi = 0 + ntddi += (osvi.dwMajorVersion & 0xFF) << 24 + ntddi += (osvi.dwMinorVersion & 0xFF) << 16 + ntddi += (osvi.wServicePackMajor & 0xFF) << 8 + ntddi += osvi.wServicePackMinor & 0xFF + return ntddi + + +# The order of the following definitions DOES matter! + +# Current integer size in bits. See L{_get_bits} for more details. +bits = _get_bits() + +# Current processor architecture. See L{_get_arch} for more details. +arch = _get_arch() + +# Set to C{True} if the current process is running in WOW64. See L{_get_wow64} for more details. +wow64 = _get_wow64() + +_osvi = GetVersionEx() + +# Current operating system. See L{_get_os} for more details. +os = _get_os(_osvi) + +# Current operating system as an NTDDI constant. See L{_get_ntddi} for more details. +NTDDI_VERSION = _get_ntddi(_osvi) + +# Upper word of L{NTDDI_VERSION}, contains the OS major and minor version number. +WINVER = NTDDI_VERSION >> 16 + +# --- version.dll -------------------------------------------------------------- + +VS_FF_DEBUG = 0x00000001 +VS_FF_PRERELEASE = 0x00000002 +VS_FF_PATCHED = 0x00000004 +VS_FF_PRIVATEBUILD = 0x00000008 +VS_FF_INFOINFERRED = 0x00000010 +VS_FF_SPECIALBUILD = 0x00000020 + +VOS_UNKNOWN = 0x00000000 +VOS__WINDOWS16 = 0x00000001 +VOS__PM16 = 0x00000002 +VOS__PM32 = 0x00000003 +VOS__WINDOWS32 = 0x00000004 +VOS_DOS = 0x00010000 +VOS_OS216 = 0x00020000 +VOS_OS232 = 0x00030000 +VOS_NT = 0x00040000 + +VOS_DOS_WINDOWS16 = 0x00010001 +VOS_DOS_WINDOWS32 = 0x00010004 +VOS_NT_WINDOWS32 = 0x00040004 +VOS_OS216_PM16 = 0x00020002 +VOS_OS232_PM32 = 0x00030003 + +VFT_UNKNOWN = 0x00000000 +VFT_APP = 0x00000001 +VFT_DLL = 0x00000002 +VFT_DRV = 0x00000003 +VFT_FONT = 0x00000004 +VFT_VXD = 0x00000005 +VFT_RESERVED = 0x00000006 # undocumented +VFT_STATIC_LIB = 0x00000007 + +VFT2_UNKNOWN = 0x00000000 + +VFT2_DRV_PRINTER = 0x00000001 +VFT2_DRV_KEYBOARD = 0x00000002 +VFT2_DRV_LANGUAGE = 0x00000003 +VFT2_DRV_DISPLAY = 0x00000004 +VFT2_DRV_MOUSE = 0x00000005 +VFT2_DRV_NETWORK = 0x00000006 +VFT2_DRV_SYSTEM = 0x00000007 +VFT2_DRV_INSTALLABLE = 0x00000008 +VFT2_DRV_SOUND = 0x00000009 +VFT2_DRV_COMM = 0x0000000A +VFT2_DRV_RESERVED = 0x0000000B # undocumented +VFT2_DRV_VERSIONED_PRINTER = 0x0000000C + +VFT2_FONT_RASTER = 0x00000001 +VFT2_FONT_VECTOR = 0x00000002 +VFT2_FONT_TRUETYPE = 0x00000003 + + +# typedef struct tagVS_FIXEDFILEINFO { +# DWORD dwSignature; +# DWORD dwStrucVersion; +# DWORD dwFileVersionMS; +# DWORD dwFileVersionLS; +# DWORD dwProductVersionMS; +# DWORD dwProductVersionLS; +# DWORD dwFileFlagsMask; +# DWORD dwFileFlags; +# DWORD dwFileOS; +# DWORD dwFileType; +# DWORD dwFileSubtype; +# DWORD dwFileDateMS; +# DWORD dwFileDateLS; +# } VS_FIXEDFILEINFO; +class VS_FIXEDFILEINFO(Structure): + _fields_ = [ + ("dwSignature", DWORD), + ("dwStrucVersion", DWORD), + ("dwFileVersionMS", DWORD), + ("dwFileVersionLS", DWORD), + ("dwProductVersionMS", DWORD), + ("dwProductVersionLS", DWORD), + ("dwFileFlagsMask", DWORD), + ("dwFileFlags", DWORD), + ("dwFileOS", DWORD), + ("dwFileType", DWORD), + ("dwFileSubtype", DWORD), + ("dwFileDateMS", DWORD), + ("dwFileDateLS", DWORD), + ] + + +PVS_FIXEDFILEINFO = POINTER(VS_FIXEDFILEINFO) +LPVS_FIXEDFILEINFO = PVS_FIXEDFILEINFO + + +# BOOL WINAPI GetFileVersionInfo( +# _In_ LPCTSTR lptstrFilename, +# _Reserved_ DWORD dwHandle, +# _In_ DWORD dwLen, +# _Out_ LPVOID lpData +# ); +# DWORD WINAPI GetFileVersionInfoSize( +# _In_ LPCTSTR lptstrFilename, +# _Out_opt_ LPDWORD lpdwHandle +# ); +def GetFileVersionInfoA(lptstrFilename): + _GetFileVersionInfoA = windll.version.GetFileVersionInfoA + _GetFileVersionInfoA.argtypes = [LPSTR, DWORD, DWORD, LPVOID] + _GetFileVersionInfoA.restype = bool + _GetFileVersionInfoA.errcheck = RaiseIfZero + + _GetFileVersionInfoSizeA = windll.version.GetFileVersionInfoSizeA + _GetFileVersionInfoSizeA.argtypes = [LPSTR, LPVOID] + _GetFileVersionInfoSizeA.restype = DWORD + _GetFileVersionInfoSizeA.errcheck = RaiseIfZero + + dwLen = _GetFileVersionInfoSizeA(lptstrFilename, None) + lpData = ctypes.create_string_buffer(dwLen) + _GetFileVersionInfoA(lptstrFilename, 0, dwLen, byref(lpData)) + return lpData + + +def GetFileVersionInfoW(lptstrFilename): + _GetFileVersionInfoW = windll.version.GetFileVersionInfoW + _GetFileVersionInfoW.argtypes = [LPWSTR, DWORD, DWORD, LPVOID] + _GetFileVersionInfoW.restype = bool + _GetFileVersionInfoW.errcheck = RaiseIfZero + + _GetFileVersionInfoSizeW = windll.version.GetFileVersionInfoSizeW + _GetFileVersionInfoSizeW.argtypes = [LPWSTR, LPVOID] + _GetFileVersionInfoSizeW.restype = DWORD + _GetFileVersionInfoSizeW.errcheck = RaiseIfZero + + dwLen = _GetFileVersionInfoSizeW(lptstrFilename, None) + lpData = ctypes.create_string_buffer(dwLen) # not a string! + _GetFileVersionInfoW(lptstrFilename, 0, dwLen, byref(lpData)) + return lpData + + +GetFileVersionInfo = GuessStringType(GetFileVersionInfoA, GetFileVersionInfoW) + + +# BOOL WINAPI VerQueryValue( +# _In_ LPCVOID pBlock, +# _In_ LPCTSTR lpSubBlock, +# _Out_ LPVOID *lplpBuffer, +# _Out_ PUINT puLen +# ); +def VerQueryValueA(pBlock, lpSubBlock): + _VerQueryValueA = windll.version.VerQueryValueA + _VerQueryValueA.argtypes = [LPVOID, LPSTR, LPVOID, POINTER(UINT)] + _VerQueryValueA.restype = bool + _VerQueryValueA.errcheck = RaiseIfZero + + lpBuffer = LPVOID(0) + uLen = UINT(0) + _VerQueryValueA(pBlock, lpSubBlock, byref(lpBuffer), byref(uLen)) + return lpBuffer, uLen.value + + +def VerQueryValueW(pBlock, lpSubBlock): + _VerQueryValueW = windll.version.VerQueryValueW + _VerQueryValueW.argtypes = [LPVOID, LPWSTR, LPVOID, POINTER(UINT)] + _VerQueryValueW.restype = bool + _VerQueryValueW.errcheck = RaiseIfZero + + lpBuffer = LPVOID(0) + uLen = UINT(0) + _VerQueryValueW(pBlock, lpSubBlock, byref(lpBuffer), byref(uLen)) + return lpBuffer, uLen.value + + +VerQueryValue = GuessStringType(VerQueryValueA, VerQueryValueW) + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/wtsapi32.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/wtsapi32.py new file mode 100644 index 0000000..438094a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/wtsapi32.py @@ -0,0 +1,355 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Wrapper for wtsapi32.dll in ctypes. +""" + +__revision__ = "$Id$" + +from winappdbg.win32.defines import * +from winappdbg.win32.advapi32 import * + +# ============================================================================== +# This is used later on to calculate the list of exported symbols. +_all = None +_all = set(vars().keys()) +# ============================================================================== + +# --- Constants ---------------------------------------------------------------- + +WTS_CURRENT_SERVER_HANDLE = 0 +WTS_CURRENT_SESSION = 1 + +# --- WTS_PROCESS_INFO structure ----------------------------------------------- + +# typedef struct _WTS_PROCESS_INFO { +# DWORD SessionId; +# DWORD ProcessId; +# LPTSTR pProcessName; +# PSID pUserSid; +# } WTS_PROCESS_INFO, *PWTS_PROCESS_INFO; + + +class WTS_PROCESS_INFOA(Structure): + _fields_ = [ + ("SessionId", DWORD), + ("ProcessId", DWORD), + ("pProcessName", LPSTR), + ("pUserSid", PSID), + ] + + +PWTS_PROCESS_INFOA = POINTER(WTS_PROCESS_INFOA) + + +class WTS_PROCESS_INFOW(Structure): + _fields_ = [ + ("SessionId", DWORD), + ("ProcessId", DWORD), + ("pProcessName", LPWSTR), + ("pUserSid", PSID), + ] + + +PWTS_PROCESS_INFOW = POINTER(WTS_PROCESS_INFOW) + +# --- WTSQuerySessionInformation enums and structures -------------------------- + +# typedef enum _WTS_INFO_CLASS { +# WTSInitialProgram = 0, +# WTSApplicationName = 1, +# WTSWorkingDirectory = 2, +# WTSOEMId = 3, +# WTSSessionId = 4, +# WTSUserName = 5, +# WTSWinStationName = 6, +# WTSDomainName = 7, +# WTSConnectState = 8, +# WTSClientBuildNumber = 9, +# WTSClientName = 10, +# WTSClientDirectory = 11, +# WTSClientProductId = 12, +# WTSClientHardwareId = 13, +# WTSClientAddress = 14, +# WTSClientDisplay = 15, +# WTSClientProtocolType = 16, +# WTSIdleTime = 17, +# WTSLogonTime = 18, +# WTSIncomingBytes = 19, +# WTSOutgoingBytes = 20, +# WTSIncomingFrames = 21, +# WTSOutgoingFrames = 22, +# WTSClientInfo = 23, +# WTSSessionInfo = 24, +# WTSSessionInfoEx = 25, +# WTSConfigInfo = 26, +# WTSValidationInfo = 27, +# WTSSessionAddressV4 = 28, +# WTSIsRemoteSession = 29 +# } WTS_INFO_CLASS; + +WTSInitialProgram = 0 +WTSApplicationName = 1 +WTSWorkingDirectory = 2 +WTSOEMId = 3 +WTSSessionId = 4 +WTSUserName = 5 +WTSWinStationName = 6 +WTSDomainName = 7 +WTSConnectState = 8 +WTSClientBuildNumber = 9 +WTSClientName = 10 +WTSClientDirectory = 11 +WTSClientProductId = 12 +WTSClientHardwareId = 13 +WTSClientAddress = 14 +WTSClientDisplay = 15 +WTSClientProtocolType = 16 +WTSIdleTime = 17 +WTSLogonTime = 18 +WTSIncomingBytes = 19 +WTSOutgoingBytes = 20 +WTSIncomingFrames = 21 +WTSOutgoingFrames = 22 +WTSClientInfo = 23 +WTSSessionInfo = 24 +WTSSessionInfoEx = 25 +WTSConfigInfo = 26 +WTSValidationInfo = 27 +WTSSessionAddressV4 = 28 +WTSIsRemoteSession = 29 + +WTS_INFO_CLASS = ctypes.c_int + +# typedef enum _WTS_CONNECTSTATE_CLASS { +# WTSActive, +# WTSConnected, +# WTSConnectQuery, +# WTSShadow, +# WTSDisconnected, +# WTSIdle, +# WTSListen, +# WTSReset, +# WTSDown, +# WTSInit +# } WTS_CONNECTSTATE_CLASS; + +WTSActive = 0 +WTSConnected = 1 +WTSConnectQuery = 2 +WTSShadow = 3 +WTSDisconnected = 4 +WTSIdle = 5 +WTSListen = 6 +WTSReset = 7 +WTSDown = 8 +WTSInit = 9 + +WTS_CONNECTSTATE_CLASS = ctypes.c_int + + +# typedef struct _WTS_CLIENT_DISPLAY { +# DWORD HorizontalResolution; +# DWORD VerticalResolution; +# DWORD ColorDepth; +# } WTS_CLIENT_DISPLAY, *PWTS_CLIENT_DISPLAY; +class WTS_CLIENT_DISPLAY(Structure): + _fields_ = [ + ("HorizontalResolution", DWORD), + ("VerticalResolution", DWORD), + ("ColorDepth", DWORD), + ] + + +PWTS_CLIENT_DISPLAY = POINTER(WTS_CLIENT_DISPLAY) + +# typedef struct _WTS_CLIENT_ADDRESS { +# DWORD AddressFamily; +# BYTE Address[20]; +# } WTS_CLIENT_ADDRESS, *PWTS_CLIENT_ADDRESS; + +# XXX TODO + +# typedef struct _WTSCLIENT { +# WCHAR ClientName[CLIENTNAME_LENGTH + 1]; +# WCHAR Domain[DOMAIN_LENGTH + 1 ]; +# WCHAR UserName[USERNAME_LENGTH + 1]; +# WCHAR WorkDirectory[MAX_PATH + 1]; +# WCHAR InitialProgram[MAX_PATH + 1]; +# BYTE EncryptionLevel; +# ULONG ClientAddressFamily; +# USHORT ClientAddress[CLIENTADDRESS_LENGTH + 1]; +# USHORT HRes; +# USHORT VRes; +# USHORT ColorDepth; +# WCHAR ClientDirectory[MAX_PATH + 1]; +# ULONG ClientBuildNumber; +# ULONG ClientHardwareId; +# USHORT ClientProductId; +# USHORT OutBufCountHost; +# USHORT OutBufCountClient; +# USHORT OutBufLength; +# WCHAR DeviceId[MAX_PATH + 1]; +# } WTSCLIENT, *PWTSCLIENT; + +# XXX TODO + +# typedef struct _WTSINFO { +# WTS_CONNECTSTATE_CLASS State; +# DWORD SessionId; +# DWORD IncomingBytes; +# DWORD OutgoingBytes; +# DWORD IncomingCompressedBytes; +# DWORD OutgoingCompressedBytes; +# WCHAR WinStationName; +# WCHAR Domain; +# WCHAR UserName; +# LARGE_INTEGER ConnectTime; +# LARGE_INTEGER DisconnectTime; +# LARGE_INTEGER LastInputTime; +# LARGE_INTEGER LogonTime; +# LARGE_INTEGER CurrentTime; +# } WTSINFO, *PWTSINFO; + +# XXX TODO + +# typedef struct _WTSINFOEX { +# DWORD Level; +# WTSINFOEX_LEVEL Data; +# } WTSINFOEX, *PWTSINFOEX; + +# XXX TODO + +# --- wtsapi32.dll ------------------------------------------------------------- + + +# void WTSFreeMemory( +# __in PVOID pMemory +# ); +def WTSFreeMemory(pMemory): + _WTSFreeMemory = windll.wtsapi32.WTSFreeMemory + _WTSFreeMemory.argtypes = [PVOID] + _WTSFreeMemory.restype = None + _WTSFreeMemory(pMemory) + + +# BOOL WTSEnumerateProcesses( +# __in HANDLE hServer, +# __in DWORD Reserved, +# __in DWORD Version, +# __out PWTS_PROCESS_INFO *ppProcessInfo, +# __out DWORD *pCount +# ); +def WTSEnumerateProcessesA(hServer=WTS_CURRENT_SERVER_HANDLE): + _WTSEnumerateProcessesA = windll.wtsapi32.WTSEnumerateProcessesA + _WTSEnumerateProcessesA.argtypes = [HANDLE, DWORD, DWORD, POINTER(PWTS_PROCESS_INFOA), PDWORD] + _WTSEnumerateProcessesA.restype = bool + _WTSEnumerateProcessesA.errcheck = RaiseIfZero + + pProcessInfo = PWTS_PROCESS_INFOA() + Count = DWORD(0) + _WTSEnumerateProcessesA(hServer, 0, 1, byref(pProcessInfo), byref(Count)) + return pProcessInfo, Count.value + + +def WTSEnumerateProcessesW(hServer=WTS_CURRENT_SERVER_HANDLE): + _WTSEnumerateProcessesW = windll.wtsapi32.WTSEnumerateProcessesW + _WTSEnumerateProcessesW.argtypes = [HANDLE, DWORD, DWORD, POINTER(PWTS_PROCESS_INFOW), PDWORD] + _WTSEnumerateProcessesW.restype = bool + _WTSEnumerateProcessesW.errcheck = RaiseIfZero + + pProcessInfo = PWTS_PROCESS_INFOW() + Count = DWORD(0) + _WTSEnumerateProcessesW(hServer, 0, 1, byref(pProcessInfo), byref(Count)) + return pProcessInfo, Count.value + + +WTSEnumerateProcesses = DefaultStringType(WTSEnumerateProcessesA, WTSEnumerateProcessesW) + + +# BOOL WTSTerminateProcess( +# __in HANDLE hServer, +# __in DWORD ProcessId, +# __in DWORD ExitCode +# ); +def WTSTerminateProcess(hServer, ProcessId, ExitCode): + _WTSTerminateProcess = windll.wtsapi32.WTSTerminateProcess + _WTSTerminateProcess.argtypes = [HANDLE, DWORD, DWORD] + _WTSTerminateProcess.restype = bool + _WTSTerminateProcess.errcheck = RaiseIfZero + _WTSTerminateProcess(hServer, ProcessId, ExitCode) + + +# BOOL WTSQuerySessionInformation( +# __in HANDLE hServer, +# __in DWORD SessionId, +# __in WTS_INFO_CLASS WTSInfoClass, +# __out LPTSTR *ppBuffer, +# __out DWORD *pBytesReturned +# ); + +# XXX TODO + +# --- kernel32.dll ------------------------------------------------------------- + +# I've no idea why these functions are in kernel32.dll instead of wtsapi32.dll + + +# BOOL ProcessIdToSessionId( +# __in DWORD dwProcessId, +# __out DWORD *pSessionId +# ); +def ProcessIdToSessionId(dwProcessId): + _ProcessIdToSessionId = windll.kernel32.ProcessIdToSessionId + _ProcessIdToSessionId.argtypes = [DWORD, PDWORD] + _ProcessIdToSessionId.restype = bool + _ProcessIdToSessionId.errcheck = RaiseIfZero + + dwSessionId = DWORD(0) + _ProcessIdToSessionId(dwProcessId, byref(dwSessionId)) + return dwSessionId.value + + +# DWORD WTSGetActiveConsoleSessionId(void); +def WTSGetActiveConsoleSessionId(): + _WTSGetActiveConsoleSessionId = windll.kernel32.WTSGetActiveConsoleSessionId + _WTSGetActiveConsoleSessionId.argtypes = [] + _WTSGetActiveConsoleSessionId.restype = DWORD + _WTSGetActiveConsoleSessionId.errcheck = RaiseIfZero + return _WTSGetActiveConsoleSessionId() + + +# ============================================================================== +# This calculates the list of exported symbols. +_all = set(vars().keys()).difference(_all) +__all__ = [_x for _x in _all if not _x.startswith("_")] +__all__.sort() +# ============================================================================== diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/window.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/window.py new file mode 100644 index 0000000..bb98f79 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/window.py @@ -0,0 +1,753 @@ +#!~/.wine/drive_c/Python25/python.exe +# -*- coding: utf-8 -*- + +# Copyright (c) 2009-2014, Mario Vilas +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice,this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Window instrumentation. + +@group Instrumentation: + Window +""" + +__revision__ = "$Id$" + +__all__ = ["Window"] + +from winappdbg import win32 + +# delayed imports +Process = None +Thread = None + +# ============================================================================== + +# Unlike Process, Thread and Module, there's no container for Window objects. +# That's because Window objects don't really store any data besides the handle. + +# XXX TODO +# * implement sending fake user input (mouse and keyboard messages) +# * maybe implement low-level hooks? (they don't require a dll to be injected) + +# XXX TODO +# +# Will it be possible to implement window hooks too? That requires a DLL to be +# injected in the target process. Perhaps with CPython it could be done easier, +# compiling a native extension is the safe bet, but both require having a non +# pure Python module, which is something I was trying to avoid so far. +# +# Another possibility would be to malloc some CC's in the target process and +# point the hook callback to it. We'd need to have the remote procedure call +# feature first as (I believe) the hook can't be set remotely in this case. + + +class Window(object): + """ + Interface to an open window in the current desktop. + + @group Properties: + get_handle, get_pid, get_tid, + get_process, get_thread, + set_process, set_thread, + get_classname, get_style, get_extended_style, + get_text, set_text, + get_placement, set_placement, + get_screen_rect, get_client_rect, + screen_to_client, client_to_screen + + @group State: + is_valid, is_visible, is_enabled, is_maximized, is_minimized, is_child, + is_zoomed, is_iconic + + @group Navigation: + get_parent, get_children, get_root, get_tree, + get_child_at + + @group Instrumentation: + enable, disable, show, hide, maximize, minimize, restore, move, kill + + @group Low-level access: + send, post + + @type hWnd: int + @ivar hWnd: Window handle. + + @type dwProcessId: int + @ivar dwProcessId: Global ID of the process that owns this window. + + @type dwThreadId: int + @ivar dwThreadId: Global ID of the thread that owns this window. + + @type process: L{Process} + @ivar process: Process that owns this window. + Use the L{get_process} method instead. + + @type thread: L{Thread} + @ivar thread: Thread that owns this window. + Use the L{get_thread} method instead. + + @type classname: str + @ivar classname: Window class name. + + @type text: str + @ivar text: Window text (caption). + + @type placement: L{win32.WindowPlacement} + @ivar placement: Window placement in the desktop. + """ + + def __init__(self, hWnd=None, process=None, thread=None): + """ + @type hWnd: int or L{win32.HWND} + @param hWnd: Window handle. + + @type process: L{Process} + @param process: (Optional) Process that owns this window. + + @type thread: L{Thread} + @param thread: (Optional) Thread that owns this window. + """ + self.hWnd = hWnd + self.dwProcessId = None + self.dwThreadId = None + self.set_process(process) + self.set_thread(thread) + + @property + def _as_parameter_(self): + """ + Compatibility with ctypes. + Allows passing transparently a Window object to an API call. + """ + return self.get_handle() + + def get_handle(self): + """ + @rtype: int + @return: Window handle. + @raise ValueError: No window handle set. + """ + if self.hWnd is None: + raise ValueError("No window handle set!") + return self.hWnd + + def get_pid(self): + """ + @rtype: int + @return: Global ID of the process that owns this window. + """ + if self.dwProcessId is not None: + return self.dwProcessId + self.__get_pid_and_tid() + return self.dwProcessId + + def get_tid(self): + """ + @rtype: int + @return: Global ID of the thread that owns this window. + """ + if self.dwThreadId is not None: + return self.dwThreadId + self.__get_pid_and_tid() + return self.dwThreadId + + def __get_pid_and_tid(self): + "Internally used by get_pid() and get_tid()." + self.dwThreadId, self.dwProcessId = win32.GetWindowThreadProcessId(self.get_handle()) + + def __load_Process_class(self): + global Process # delayed import + if Process is None: + from winappdbg.process import Process + + def __load_Thread_class(self): + global Thread # delayed import + if Thread is None: + from winappdbg.thread import Thread + + def get_process(self): + """ + @rtype: L{Process} + @return: Parent Process object. + """ + if self.__process is not None: + return self.__process + self.__load_Process_class() + self.__process = Process(self.get_pid()) + return self.__process + + def set_process(self, process=None): + """ + Manually set the parent process. Use with care! + + @type process: L{Process} + @param process: (Optional) Process object. Use C{None} to autodetect. + """ + if process is None: + self.__process = None + else: + self.__load_Process_class() + if not isinstance(process, Process): + msg = "Parent process must be a Process instance, " + msg += "got %s instead" % type(process) + raise TypeError(msg) + self.dwProcessId = process.get_pid() + self.__process = process + + def get_thread(self): + """ + @rtype: L{Thread} + @return: Parent Thread object. + """ + if self.__thread is not None: + return self.__thread + self.__load_Thread_class() + self.__thread = Thread(self.get_tid()) + return self.__thread + + def set_thread(self, thread=None): + """ + Manually set the thread process. Use with care! + + @type thread: L{Thread} + @param thread: (Optional) Thread object. Use C{None} to autodetect. + """ + if thread is None: + self.__thread = None + else: + self.__load_Thread_class() + if not isinstance(thread, Thread): + msg = "Parent thread must be a Thread instance, " + msg += "got %s instead" % type(thread) + raise TypeError(msg) + self.dwThreadId = thread.get_tid() + self.__thread = thread + + def __get_window(self, hWnd): + """ + User internally to get another Window from this one. + It'll try to copy the parent Process and Thread references if possible. + """ + window = Window(hWnd) + if window.get_pid() == self.get_pid(): + window.set_process(self.get_process()) + if window.get_tid() == self.get_tid(): + window.set_thread(self.get_thread()) + return window + + # ------------------------------------------------------------------------------ + + def get_classname(self): + """ + @rtype: str + @return: Window class name. + + @raise WindowsError: An error occured while processing this request. + """ + return win32.GetClassName(self.get_handle()) + + def get_style(self): + """ + @rtype: int + @return: Window style mask. + + @raise WindowsError: An error occured while processing this request. + """ + return win32.GetWindowLongPtr(self.get_handle(), win32.GWL_STYLE) + + def get_extended_style(self): + """ + @rtype: int + @return: Window extended style mask. + + @raise WindowsError: An error occured while processing this request. + """ + return win32.GetWindowLongPtr(self.get_handle(), win32.GWL_EXSTYLE) + + def get_text(self): + """ + @see: L{set_text} + @rtype: str + @return: Window text (caption) on success, C{None} on error. + """ + try: + return win32.GetWindowText(self.get_handle()) + except WindowsError: + return None + + def set_text(self, text): + """ + Set the window text (caption). + + @see: L{get_text} + + @type text: str + @param text: New window text. + + @raise WindowsError: An error occured while processing this request. + """ + win32.SetWindowText(self.get_handle(), text) + + def get_placement(self): + """ + Retrieve the window placement in the desktop. + + @see: L{set_placement} + + @rtype: L{win32.WindowPlacement} + @return: Window placement in the desktop. + + @raise WindowsError: An error occured while processing this request. + """ + return win32.GetWindowPlacement(self.get_handle()) + + def set_placement(self, placement): + """ + Set the window placement in the desktop. + + @see: L{get_placement} + + @type placement: L{win32.WindowPlacement} + @param placement: Window placement in the desktop. + + @raise WindowsError: An error occured while processing this request. + """ + win32.SetWindowPlacement(self.get_handle(), placement) + + def get_screen_rect(self): + """ + Get the window coordinates in the desktop. + + @rtype: L{win32.Rect} + @return: Rectangle occupied by the window in the desktop. + + @raise WindowsError: An error occured while processing this request. + """ + return win32.GetWindowRect(self.get_handle()) + + def get_client_rect(self): + """ + Get the window's client area coordinates in the desktop. + + @rtype: L{win32.Rect} + @return: Rectangle occupied by the window's client area in the desktop. + + @raise WindowsError: An error occured while processing this request. + """ + cr = win32.GetClientRect(self.get_handle()) + cr.left, cr.top = self.client_to_screen(cr.left, cr.top) + cr.right, cr.bottom = self.client_to_screen(cr.right, cr.bottom) + return cr + + # XXX TODO + # * properties x, y, width, height + # * properties left, top, right, bottom + + process = property(get_process, set_process, doc="") + thread = property(get_thread, set_thread, doc="") + classname = property(get_classname, doc="") + style = property(get_style, doc="") + exstyle = property(get_extended_style, doc="") + text = property(get_text, set_text, doc="") + placement = property(get_placement, set_placement, doc="") + + # ------------------------------------------------------------------------------ + + def client_to_screen(self, x, y): + """ + Translates window client coordinates to screen coordinates. + + @note: This is a simplified interface to some of the functionality of + the L{win32.Point} class. + + @see: {win32.Point.client_to_screen} + + @type x: int + @param x: Horizontal coordinate. + @type y: int + @param y: Vertical coordinate. + + @rtype: tuple( int, int ) + @return: Translated coordinates in a tuple (x, y). + + @raise WindowsError: An error occured while processing this request. + """ + return tuple(win32.ClientToScreen(self.get_handle(), (x, y))) + + def screen_to_client(self, x, y): + """ + Translates window screen coordinates to client coordinates. + + @note: This is a simplified interface to some of the functionality of + the L{win32.Point} class. + + @see: {win32.Point.screen_to_client} + + @type x: int + @param x: Horizontal coordinate. + @type y: int + @param y: Vertical coordinate. + + @rtype: tuple( int, int ) + @return: Translated coordinates in a tuple (x, y). + + @raise WindowsError: An error occured while processing this request. + """ + return tuple(win32.ScreenToClient(self.get_handle(), (x, y))) + + # ------------------------------------------------------------------------------ + + def get_parent(self): + """ + @see: L{get_children} + @rtype: L{Window} or None + @return: Parent window. Returns C{None} if the window has no parent. + @raise WindowsError: An error occured while processing this request. + """ + hWnd = win32.GetParent(self.get_handle()) + if hWnd: + return self.__get_window(hWnd) + + def get_children(self): + """ + @see: L{get_parent} + @rtype: list( L{Window} ) + @return: List of child windows. + @raise WindowsError: An error occured while processing this request. + """ + return [self.__get_window(hWnd) for hWnd in win32.EnumChildWindows(self.get_handle())] + + def get_tree(self): + """ + @see: L{get_root} + @rtype: dict( L{Window} S{->} dict( ... ) ) + @return: Dictionary of dictionaries forming a tree of child windows. + @raise WindowsError: An error occured while processing this request. + """ + subtree = dict() + for aWindow in self.get_children(): + subtree[aWindow] = aWindow.get_tree() + return subtree + + def get_root(self): + """ + @see: L{get_tree} + @rtype: L{Window} + @return: If this is a child window, return the top-level window it + belongs to. + If this window is already a top-level window, returns itself. + @raise WindowsError: An error occured while processing this request. + """ + hWnd = self.get_handle() + history = set() + hPrevWnd = hWnd + while hWnd and hWnd not in history: + history.add(hWnd) + hPrevWnd = hWnd + hWnd = win32.GetParent(hWnd) + if hWnd in history: + # See: https://docs.google.com/View?id=dfqd62nk_228h28szgz + return self + if hPrevWnd != self.get_handle(): + return self.__get_window(hPrevWnd) + return self + + def get_child_at(self, x, y, bAllowTransparency=True): + """ + Get the child window located at the given coordinates. If no such + window exists an exception is raised. + + @see: L{get_children} + + @type x: int + @param x: Horizontal coordinate. + + @type y: int + @param y: Vertical coordinate. + + @type bAllowTransparency: bool + @param bAllowTransparency: If C{True} transparent areas in windows are + ignored, returning the window behind them. If C{False} transparent + areas are treated just like any other area. + + @rtype: L{Window} + @return: Child window at the requested position, or C{None} if there + is no window at those coordinates. + """ + try: + if bAllowTransparency: + hWnd = win32.RealChildWindowFromPoint(self.get_handle(), (x, y)) + else: + hWnd = win32.ChildWindowFromPoint(self.get_handle(), (x, y)) + if hWnd: + return self.__get_window(hWnd) + except WindowsError: + pass + return None + + # ------------------------------------------------------------------------------ + + def is_valid(self): + """ + @rtype: bool + @return: C{True} if the window handle is still valid. + """ + return win32.IsWindow(self.get_handle()) + + def is_visible(self): + """ + @see: {show}, {hide} + @rtype: bool + @return: C{True} if the window is in a visible state. + """ + return win32.IsWindowVisible(self.get_handle()) + + def is_enabled(self): + """ + @see: {enable}, {disable} + @rtype: bool + @return: C{True} if the window is in an enabled state. + """ + return win32.IsWindowEnabled(self.get_handle()) + + def is_maximized(self): + """ + @see: L{maximize} + @rtype: bool + @return: C{True} if the window is maximized. + """ + return win32.IsZoomed(self.get_handle()) + + def is_minimized(self): + """ + @see: L{minimize} + @rtype: bool + @return: C{True} if the window is minimized. + """ + return win32.IsIconic(self.get_handle()) + + def is_child(self): + """ + @see: L{get_parent} + @rtype: bool + @return: C{True} if the window is a child window. + """ + return win32.IsChild(self.get_handle()) + + is_zoomed = is_maximized + is_iconic = is_minimized + + # ------------------------------------------------------------------------------ + + def enable(self): + """ + Enable the user input for the window. + + @see: L{disable} + + @raise WindowsError: An error occured while processing this request. + """ + win32.EnableWindow(self.get_handle(), True) + + def disable(self): + """ + Disable the user input for the window. + + @see: L{enable} + + @raise WindowsError: An error occured while processing this request. + """ + win32.EnableWindow(self.get_handle(), False) + + def show(self, bAsync=True): + """ + Make the window visible. + + @see: L{hide} + + @type bAsync: bool + @param bAsync: Perform the request asynchronously. + + @raise WindowsError: An error occured while processing this request. + """ + if bAsync: + win32.ShowWindowAsync(self.get_handle(), win32.SW_SHOW) + else: + win32.ShowWindow(self.get_handle(), win32.SW_SHOW) + + def hide(self, bAsync=True): + """ + Make the window invisible. + + @see: L{show} + + @type bAsync: bool + @param bAsync: Perform the request asynchronously. + + @raise WindowsError: An error occured while processing this request. + """ + if bAsync: + win32.ShowWindowAsync(self.get_handle(), win32.SW_HIDE) + else: + win32.ShowWindow(self.get_handle(), win32.SW_HIDE) + + def maximize(self, bAsync=True): + """ + Maximize the window. + + @see: L{minimize}, L{restore} + + @type bAsync: bool + @param bAsync: Perform the request asynchronously. + + @raise WindowsError: An error occured while processing this request. + """ + if bAsync: + win32.ShowWindowAsync(self.get_handle(), win32.SW_MAXIMIZE) + else: + win32.ShowWindow(self.get_handle(), win32.SW_MAXIMIZE) + + def minimize(self, bAsync=True): + """ + Minimize the window. + + @see: L{maximize}, L{restore} + + @type bAsync: bool + @param bAsync: Perform the request asynchronously. + + @raise WindowsError: An error occured while processing this request. + """ + if bAsync: + win32.ShowWindowAsync(self.get_handle(), win32.SW_MINIMIZE) + else: + win32.ShowWindow(self.get_handle(), win32.SW_MINIMIZE) + + def restore(self, bAsync=True): + """ + Unmaximize and unminimize the window. + + @see: L{maximize}, L{minimize} + + @type bAsync: bool + @param bAsync: Perform the request asynchronously. + + @raise WindowsError: An error occured while processing this request. + """ + if bAsync: + win32.ShowWindowAsync(self.get_handle(), win32.SW_RESTORE) + else: + win32.ShowWindow(self.get_handle(), win32.SW_RESTORE) + + def move(self, x=None, y=None, width=None, height=None, bRepaint=True): + """ + Moves and/or resizes the window. + + @note: This is request is performed syncronously. + + @type x: int + @param x: (Optional) New horizontal coordinate. + + @type y: int + @param y: (Optional) New vertical coordinate. + + @type width: int + @param width: (Optional) Desired window width. + + @type height: int + @param height: (Optional) Desired window height. + + @type bRepaint: bool + @param bRepaint: + (Optional) C{True} if the window should be redrawn afterwards. + + @raise WindowsError: An error occured while processing this request. + """ + if None in (x, y, width, height): + rect = self.get_screen_rect() + if x is None: + x = rect.left + if y is None: + y = rect.top + if width is None: + width = rect.right - rect.left + if height is None: + height = rect.bottom - rect.top + win32.MoveWindow(self.get_handle(), x, y, width, height, bRepaint) + + def kill(self): + """ + Signals the program to quit. + + @note: This is an asyncronous request. + + @raise WindowsError: An error occured while processing this request. + """ + self.post(win32.WM_QUIT) + + def send(self, uMsg, wParam=None, lParam=None, dwTimeout=None): + """ + Send a low-level window message syncronically. + + @type uMsg: int + @param uMsg: Message code. + + @param wParam: + The type and meaning of this parameter depends on the message. + + @param lParam: + The type and meaning of this parameter depends on the message. + + @param dwTimeout: Optional timeout for the operation. + Use C{None} to wait indefinitely. + + @rtype: int + @return: The meaning of the return value depends on the window message. + Typically a value of C{0} means an error occured. You can get the + error code by calling L{win32.GetLastError}. + """ + if dwTimeout is None: + return win32.SendMessage(self.get_handle(), uMsg, wParam, lParam) + return win32.SendMessageTimeout(self.get_handle(), uMsg, wParam, lParam, win32.SMTO_ABORTIFHUNG | win32.SMTO_ERRORONEXIT, dwTimeout) + + def post(self, uMsg, wParam=None, lParam=None): + """ + Post a low-level window message asyncronically. + + @type uMsg: int + @param uMsg: Message code. + + @param wParam: + The type and meaning of this parameter depends on the message. + + @param lParam: + The type and meaning of this parameter depends on the message. + + @raise WindowsError: An error occured while sending the message. + """ + win32.PostMessage(self.get_handle(), uMsg, wParam, lParam) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.cpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.cpp new file mode 100644 index 0000000..cafd69f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.cpp @@ -0,0 +1,640 @@ +/* **************************************************************************** +* +* Copyright (c) Microsoft Corporation. +* +* This source code is subject to terms and conditions of the Apache License, Version 2.0. A +* copy of the license can be found in the License.html file at the root of this distribution. If +* you cannot locate the Apache License, Version 2.0, please send an email to +* vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound +* by the terms of the Apache License, Version 2.0. +* +* You must not remove this notice, or any other, from this software. +* +* Contributor: Fabio Zadrozny +* +* Based on PyDebugAttach.cpp from PVTS. Windows only. +* +* https://github.com/Microsoft/PTVS/blob/master/Python/Product/PyDebugAttach/PyDebugAttach.cpp +* +* Initially we did an attach completely based on shellcode which got the +* GIL called PyRun_SimpleString with the needed code and was done with it +* (so, none of this code was needed). +* Now, newer version of Python don't initialize threading by default, so, +* most of this code is done only to overcome this limitation (and as a plus, +* if there's no code running, we also pause the threads to make our code run). +* +* On Linux the approach is still the simpler one (using gdb), so, on newer +* versions of Python it may not work unless the user has some code running +* and threads are initialized. +* I.e.: +* +* The user may have to add the code below in the start of its script for +* a successful attach (if he doesn't already use threads). +* +* from threading import Thread +* Thread(target=str).start() +* +* -- this is the workaround for the fact that we can't get the gil +* if there aren't any threads (PyGILState_Ensure gives an error). +* ***************************************************************************/ + + +// Access to std::cout and std::endl +#include +// DECLDIR will perform an export for us +#define DLL_EXPORT + +#include "attach.h" +#include "stdafx.h" + +#include "../common/python.h" +#include "../common/ref_utils.hpp" +#include "../common/py_utils.hpp" +#include "../common/py_settrace.hpp" + + +#pragma comment(lib, "kernel32.lib") +#pragma comment(lib, "user32.lib") +#pragma comment(lib, "advapi32.lib") +#pragma comment(lib, "psapi.lib") + +#include "py_win_helpers.hpp" +#include "run_code_in_memory.hpp" + +// _Always_ is not defined for all versions, so make it a no-op if missing. +#ifndef _Always_ +#define _Always_(x) x +#endif + + +typedef void (PyEval_Lock)(); // Acquire/Release lock +typedef void (PyThreadState_API)(PyThreadState *); // Acquire/Release lock +typedef PyObject* (Py_CompileString)(const char *str, const char *filename, int start); +typedef PyObject* (PyEval_EvalCode)(PyObject *co, PyObject *globals, PyObject *locals); +typedef PyObject* (PyDict_GetItemString)(PyObject *p, const char *key); +typedef PyObject* (PyEval_GetBuiltins)(); +typedef int (PyDict_SetItemString)(PyObject *dp, const char *key, PyObject *item); +typedef int (PyEval_ThreadsInitialized)(); +typedef int (Py_AddPendingCall)(int (*func)(void *), void*); +typedef PyObject* (PyString_FromString)(const char* s); +typedef void PyEval_SetTrace(Py_tracefunc func, PyObject *obj); +typedef PyObject* (PyErr_Print)(); +typedef PyObject* (PyObject_SetAttrString)(PyObject *o, const char *attr_name, PyObject* value); +typedef PyObject* (PyBool_FromLong)(long v); +typedef unsigned long (_PyEval_GetSwitchInterval)(void); +typedef void (_PyEval_SetSwitchInterval)(unsigned long microseconds); +typedef PyGILState_STATE PyGILState_EnsureFunc(void); +typedef void PyGILState_ReleaseFunc(PyGILState_STATE); +typedef PyThreadState *PyThreadState_NewFunc(PyInterpreterState *interp); + +typedef PyObject *PyList_New(Py_ssize_t len); +typedef int PyList_Append(PyObject *list, PyObject *item); + + + +std::wstring GetCurrentModuleFilename() { + HMODULE hModule = nullptr; + if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)GetCurrentModuleFilename, &hModule) != 0) { + wchar_t filename[MAX_PATH]; + GetModuleFileName(hModule, filename, MAX_PATH); + return filename; + } + return std::wstring(); +} + + +struct InitializeThreadingInfo { + PyImport_ImportModule* pyImportMod; + PyEval_Lock* initThreads; + + CRITICAL_SECTION cs; + HANDLE initedEvent; // Note: only access with mutex locked (and check if not already nullptr). + bool completed; // Note: only access with mutex locked +}; + + +int AttachCallback(void *voidInitializeThreadingInfo) { + // initialize us for threading, this will acquire the GIL if not already created, and is a nop if the GIL is created. + // This leaves us in the proper state when we return back to the runtime whether the GIL was created or not before + // we were called. + InitializeThreadingInfo* initializeThreadingInfo = reinterpret_cast(voidInitializeThreadingInfo); + initializeThreadingInfo->initThreads(); // Note: calling multiple times is ok. + initializeThreadingInfo->pyImportMod("threading"); + + EnterCriticalSection(&initializeThreadingInfo->cs); + initializeThreadingInfo->completed = true; + if(initializeThreadingInfo->initedEvent != nullptr) { + SetEvent(initializeThreadingInfo->initedEvent); + } + LeaveCriticalSection(&initializeThreadingInfo->cs); + return 0; +} + + +// create a custom heap for our unordered map. This is necessary because if we suspend a thread while in a heap function +// then we could deadlock here. We need to be VERY careful about what we do while the threads are suspended. +static HANDLE g_heap = 0; + +template +class PrivateHeapAllocator { +public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + typedef T value_type; + + template + struct rebind { + typedef PrivateHeapAllocator other; + }; + + explicit PrivateHeapAllocator() {} + + PrivateHeapAllocator(PrivateHeapAllocator const&) {} + + ~PrivateHeapAllocator() {} + + template + PrivateHeapAllocator(PrivateHeapAllocator const&) {} + + pointer allocate(size_type size, std::allocator::const_pointer hint = 0) { + UNREFERENCED_PARAMETER(hint); + + if (g_heap == nullptr) { + g_heap = HeapCreate(0, 0, 0); + } + auto mem = HeapAlloc(g_heap, 0, size * sizeof(T)); + return static_cast(mem); + } + + void deallocate(pointer p, size_type n) { + UNREFERENCED_PARAMETER(n); + + HeapFree(g_heap, 0, p); + } + + size_type max_size() const { + return (std::numeric_limits::max)() / sizeof(T); + } + + void construct(pointer p, const T& t) { + new(p) T(t); + } + + void destroy(pointer p) { + p->~T(); + } +}; + +typedef std::unordered_map, std::equal_to, PrivateHeapAllocator>> ThreadMap; + +void ResumeThreads(ThreadMap &suspendedThreads) { + for (auto start = suspendedThreads.begin(); start != suspendedThreads.end(); start++) { + ResumeThread((*start).second); + CloseHandle((*start).second); + } + suspendedThreads.clear(); +} + +// Suspends all threads ensuring that they are not currently in a call to Py_AddPendingCall. +void SuspendThreads(ThreadMap &suspendedThreads, Py_AddPendingCall* addPendingCall, PyEval_ThreadsInitialized* threadsInited) { + DWORD curThreadId = GetCurrentThreadId(); + DWORD curProcess = GetCurrentProcessId(); + // suspend all the threads in the process so we can do things safely... + bool suspended; + + do { + suspended = false; + HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); + if (h != INVALID_HANDLE_VALUE) { + + THREADENTRY32 te; + te.dwSize = sizeof(te); + if (Thread32First(h, &te)) { + do { + if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID) && te.th32OwnerProcessID == curProcess) { + + + if (te.th32ThreadID != curThreadId && suspendedThreads.find(te.th32ThreadID) == suspendedThreads.end()) { + auto hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID); + if (hThread != nullptr) { + SuspendThread(hThread); + + bool addingPendingCall = false; + + CONTEXT context; + memset(&context, 0x00, sizeof(CONTEXT)); + context.ContextFlags = CONTEXT_ALL; + GetThreadContext(hThread, &context); + +#if defined(_X86_) + if (context.Eip >= *(reinterpret_cast(addPendingCall)) && context.Eip <= (*(reinterpret_cast(addPendingCall))) + 0x100) { + addingPendingCall = true; + } +#elif defined(_AMD64_) + if (context.Rip >= *(reinterpret_cast(addPendingCall)) && context.Rip <= *(reinterpret_cast(addPendingCall) + 0x100)) { + addingPendingCall = true; + } +#endif + + if (addingPendingCall) { + // we appear to be adding a pending call via this thread - wait for this to finish so we can add our own pending call... + ResumeThread(hThread); + SwitchToThread(); // yield to the resumed thread if it's on our CPU... + CloseHandle(hThread); + } else { + suspendedThreads[te.th32ThreadID] = hThread; + } + suspended = true; + } + } + } + + te.dwSize = sizeof(te); + } while (Thread32Next(h, &te) && !threadsInited()); + } + CloseHandle(h); + } + } while (suspended && !threadsInited()); +} + + + +extern "C" +{ + + /** + * The returned value signals the error that happened! + * + * Return codes: + * 0 = all OK. + * 1 = Py_IsInitialized not found + * 2 = Py_IsInitialized returned false + * 3 = Missing Python API + * 4 = Interpreter not initialized + * 5 = Python version unknown + * 6 = Connect timeout + **/ + int DoAttach(HMODULE module, bool isDebug, const char *command, bool showDebugInfo ) + { + auto isInit = reinterpret_cast(GetProcAddress(module, "Py_IsInitialized")); + + if (isInit == nullptr) { + std::cerr << "Py_IsInitialized not found. " << std::endl << std::flush; + return 1; + } + if (!isInit()) { + std::cerr << "Py_IsInitialized returned false. " << std::endl << std::flush; + return 2; + } + + auto version = GetPythonVersion(module); + + // found initialized Python runtime, gather and check the APIs we need for a successful attach... + DEFINE_PROC(addPendingCall, Py_AddPendingCall*, "Py_AddPendingCall", -100); + DEFINE_PROC(interpHead, PyInterpreterState_Head*, "PyInterpreterState_Head", -110); + DEFINE_PROC(gilEnsure, PyGILState_Ensure*, "PyGILState_Ensure", -120); + DEFINE_PROC(gilRelease, PyGILState_Release*, "PyGILState_Release", -130); + DEFINE_PROC(threadHead, PyInterpreterState_ThreadHead*, "PyInterpreterState_ThreadHead", -140); + DEFINE_PROC(initThreads, PyEval_Lock*, "PyEval_InitThreads", -150); + DEFINE_PROC(releaseLock, PyEval_Lock*, "PyEval_ReleaseLock", -160); + DEFINE_PROC(threadsInited, PyEval_ThreadsInitialized*, "PyEval_ThreadsInitialized", -170); + DEFINE_PROC(threadNext, PyThreadState_Next*, "PyThreadState_Next", -180); + DEFINE_PROC(pyImportMod, PyImport_ImportModule*, "PyImport_ImportModule", -190); + DEFINE_PROC(pyNone, PyObject*, "_Py_NoneStruct", -2000); + DEFINE_PROC(pyRun_SimpleString, PyRun_SimpleString*, "PyRun_SimpleString", -210); + + // Either _PyThreadState_Current or _PyThreadState_UncheckedGet are required + DEFINE_PROC_NO_CHECK(curPythonThread, PyThreadState**, "_PyThreadState_Current", -220); // optional + DEFINE_PROC_NO_CHECK(getPythonThread, _PyThreadState_UncheckedGet*, "_PyThreadState_UncheckedGet", -230); // optional + DEFINE_PROC_NO_CHECK(getPythonThread13, _PyThreadState_GetCurrent*, "_PyThreadState_GetCurrent", -231); // optional + if (getPythonThread == nullptr && getPythonThread13 != nullptr) { + std::cout << "Using Python 3.13 or later, using _PyThreadState_GetCurrent" << std::endl << std::flush; + getPythonThread = getPythonThread13; + } + + if (curPythonThread == nullptr && getPythonThread == nullptr) { + // we're missing some APIs, we cannot attach. + std::cerr << "Error, missing Python threading API!!" << std::endl << std::flush; + return -240; + } + + // Either _Py_CheckInterval or _PyEval_[GS]etSwitchInterval are useful, but not required + DEFINE_PROC_NO_CHECK(intervalCheck, int*, "_Py_CheckInterval", -250); // optional + DEFINE_PROC_NO_CHECK(getSwitchInterval, _PyEval_GetSwitchInterval*, "_PyEval_GetSwitchInterval", -260); // optional + DEFINE_PROC_NO_CHECK(setSwitchInterval, _PyEval_SetSwitchInterval*, "_PyEval_SetSwitchInterval", -270); // optional + + auto head = interpHead(); + if (head == nullptr) { + // this interpreter is loaded but not initialized. + std::cerr << "Interpreter not initialized! " << std::endl << std::flush; + return 4; + } + + // check that we're a supported version + if (version == PythonVersion_Unknown) { + std::cerr << "Python version unknown! " << std::endl << std::flush; + return 5; + } else if (version == PythonVersion_25 || version == PythonVersion_26 || + version == PythonVersion_30 || version == PythonVersion_31 || version == PythonVersion_32) { + std::cerr << "Python version unsupported! " << std::endl << std::flush; + return 5; + } + + + // We always try to initialize threading and import the threading module in the main thread in the code + // below... + // + // We need to initialize multiple threading support but we need to do so safely, so we call + // Py_AddPendingCall and have our callback then initialize multi threading. This is completely safe on 2.7 + // and up. Unfortunately that doesn't work if we're not actively running code on the main thread (blocked on a lock + // or reading input). + // + // Another option is to make sure no code is running - if there is no active thread then we can safely call + // PyEval_InitThreads and we're in business. But to know this is safe we need to first suspend all the other + // threads in the process and then inspect if any code is running (note that this is still not ideal because + // this thread will be the thread head for Python, but still better than not attach at all). + // + // Finally if code is running after we've suspended the threads then we can go ahead and do Py_AddPendingCall + // on down-level interpreters as long as we're sure no one else is making a call to Py_AddPendingCall at the same + // time. + // + // Therefore our strategy becomes: Make the Py_AddPendingCall on interpreters and wait for it. If it doesn't + // call after a timeout, suspend all threads - if a threads is in Py_AddPendingCall resume and try again. Once we've got all of the threads + // stopped and not in Py_AddPendingCall (which calls no functions its self, you can see this and it's size in the + // debugger) then see if we have a current thread. If not go ahead and initialize multiple threading (it's now safe, + // no Python code is running). + + InitializeThreadingInfo *initializeThreadingInfo = new InitializeThreadingInfo(); + initializeThreadingInfo->pyImportMod = pyImportMod; + initializeThreadingInfo->initThreads = initThreads; + initializeThreadingInfo->initedEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); + InitializeCriticalSection(&initializeThreadingInfo->cs); + + // Add the call to initialize threading. + addPendingCall(&AttachCallback, initializeThreadingInfo); + + ::WaitForSingleObject(initializeThreadingInfo->initedEvent, 5000); + + // Whether this completed or not, release the event handle as we won't use it anymore. + EnterCriticalSection(&initializeThreadingInfo->cs); + CloseHandle(initializeThreadingInfo->initedEvent); + bool completed = initializeThreadingInfo->completed; + initializeThreadingInfo->initedEvent = nullptr; + LeaveCriticalSection(&initializeThreadingInfo->cs); + + if(completed) { + // Note that this structure will leak if addPendingCall did not complete in the timeout + // (we can't release now because it's possible that it'll still be called). + DeleteCriticalSection(&initializeThreadingInfo->cs); + delete initializeThreadingInfo; + if (showDebugInfo) { + std::cout << "addPendingCall to initialize threads/import threading completed. " << std::endl << std::flush; + } + } else { + if (showDebugInfo) { + std::cout << "addPendingCall to initialize threads/import threading did NOT complete. " << std::endl << std::flush; + } + } + + if (threadsInited()) { + // Note that since Python 3.7, threads are *always* initialized! + if (showDebugInfo) { + std::cout << "Threads initialized! " << std::endl << std::flush; + } + + } else { + int saveIntervalCheck; + unsigned long saveLongIntervalCheck; + if (intervalCheck != nullptr) { + // not available on 3.2 + saveIntervalCheck = *intervalCheck; + *intervalCheck = -1; // lower the interval check so pending calls are processed faster + saveLongIntervalCheck = 0; // prevent compiler warning + } else if (getSwitchInterval != nullptr && setSwitchInterval != nullptr) { + saveLongIntervalCheck = getSwitchInterval(); + setSwitchInterval(0); + saveIntervalCheck = 0; // prevent compiler warning + } + else { + saveIntervalCheck = 0; // prevent compiler warning + saveLongIntervalCheck = 0; // prevent compiler warning + } + + // If threads weren't initialized in our pending call, instead of giving a timeout, try + // to initialize it in this thread. + for(int attempts = 0; !threadsInited() && attempts < 20; attempts++) { + if(attempts > 0){ + // If we haven't been able to do it in the first time, wait a bit before retrying. + Sleep(10); + } + + ThreadMap suspendedThreads; + if (showDebugInfo) { + std::cout << "SuspendThreads(suspendedThreads, addPendingCall, threadsInited);" << std::endl << std::flush; + } + SuspendThreads(suspendedThreads, addPendingCall, threadsInited); + + if(!threadsInited()){ // Check again with threads suspended. + if (showDebugInfo) { + std::cout << "ENTERED if (!threadsInited()) {" << std::endl << std::flush; + } + auto curPyThread = getPythonThread ? getPythonThread() : *curPythonThread; + + if (curPyThread == nullptr) { + if (showDebugInfo) { + std::cout << "ENTERED if (curPyThread == nullptr) {" << std::endl << std::flush; + } + // no threads are currently running, it is safe to initialize multi threading. + PyGILState_STATE gilState; + if (version >= PythonVersion_34) { + // in 3.4 due to http://bugs.python.org/issue20891, + // we need to create our thread state manually + // before we can call PyGILState_Ensure() before we + // can call PyEval_InitThreads(). + + // Don't require this function unless we need it. + auto threadNew = (PyThreadState_NewFunc*)GetProcAddress(module, "PyThreadState_New"); + if (threadNew != nullptr) { + threadNew(head); + } + } + + if (version >= PythonVersion_32) { + // in 3.2 due to the new GIL and later we can't call Py_InitThreads + // without a thread being initialized. + // So we use PyGilState_Ensure here to first + // initialize the current thread, and then we use + // Py_InitThreads to bring up multi-threading. + // Some context here: http://bugs.python.org/issue11329 + // http://pytools.codeplex.com/workitem/834 + gilState = gilEnsure(); + } + else { + gilState = PyGILState_LOCKED; // prevent compiler warning + } + + if (showDebugInfo) { + std::cout << "Called initThreads()" << std::endl << std::flush; + } + // Initialize threads in our secondary thread (this is NOT ideal because + // this thread will be the thread head), but is still better than not being + // able to attach if the main thread is not actually running any code. + initThreads(); + + if (version >= PythonVersion_32) { + // we will release the GIL here + gilRelease(gilState); + } else { + releaseLock(); + } + } + } + ResumeThreads(suspendedThreads); + } + + + if (intervalCheck != nullptr) { + *intervalCheck = saveIntervalCheck; + } else if (setSwitchInterval != nullptr) { + setSwitchInterval(saveLongIntervalCheck); + } + + } + + if (g_heap != nullptr) { + HeapDestroy(g_heap); + g_heap = nullptr; + } + + if (!threadsInited()) { + std::cerr << "Unable to initialize threads in the given timeout! " << std::endl << std::flush; + return 8; + } + + GilHolder gilLock(gilEnsure, gilRelease); // acquire and hold the GIL until done... + + pyRun_SimpleString(command); + return 0; + + } + + + + + // ======================================== Code related to setting tracing to existing threads. + + + /** + * This function is meant to be called to execute some arbitrary python code to be + * run. It'll initialize threads as needed and then run the code with pyRun_SimpleString. + * + * @param command: the python code to be run + * @param attachInfo: pointer to an int specifying whether we should show debug info (1) or not (0). + **/ + DECLDIR int AttachAndRunPythonCode(const char *command, int *attachInfo ) + { + + int SHOW_DEBUG_INFO = 1; + + bool showDebugInfo = (*attachInfo & SHOW_DEBUG_INFO) != 0; + + if (showDebugInfo) { + std::cout << "AttachAndRunPythonCode started (showing debug info). " << std::endl << std::flush; + } + + ModuleInfo moduleInfo = GetPythonModule(); + if (moduleInfo.errorGettingModule != 0) { + return moduleInfo.errorGettingModule; + } + HMODULE module = moduleInfo.module; + int attached = DoAttach(module, moduleInfo.isDebug, command, showDebugInfo); + + if (attached != 0) { + std::cerr << "Error when injecting code in target process. Error code (on windows): " << attached << std::endl << std::flush; + } + return attached; + } + + + DECLDIR int PrintDebugInfo() { + PRINT("Getting debug info..."); + ModuleInfo moduleInfo = GetPythonModule(); + if (moduleInfo.errorGettingModule != 0) { + PRINT("Error getting python module"); + return 0; + } + HMODULE module = moduleInfo.module; + + DEFINE_PROC(interpHead, PyInterpreterState_Head*, "PyInterpreterState_Head", 0); + DEFINE_PROC(threadHead, PyInterpreterState_ThreadHead*, "PyInterpreterState_ThreadHead", 0); + DEFINE_PROC(threadNext, PyThreadState_Next*, "PyThreadState_Next", 160); + DEFINE_PROC(gilEnsure, PyGILState_Ensure*, "PyGILState_Ensure", 0); + DEFINE_PROC(gilRelease, PyGILState_Release*, "PyGILState_Release", 0); + + auto head = interpHead(); + if (head == nullptr) { + // this interpreter is loaded but not initialized. + PRINT("Interpreter not initialized!"); + return 0; + } + + auto version = GetPythonVersion(module); + printf("Python version: %d\n", version); + + GilHolder gilLock(gilEnsure, gilRelease); // acquire and hold the GIL until done... + auto curThread = threadHead(head); + if (curThread == nullptr) { + PRINT("Thread head is NULL.") + return 0; + } + + for (auto curThread = threadHead(head); curThread != nullptr; curThread = threadNext(curThread)) { + printf("Found thread id: %d\n", GetPythonThreadId(version, curThread)); + } + + PRINT("Finished getting debug info.") + return 0; + } + + + /** + * This function may be called to set a tracing function to existing python threads. + **/ + DECLDIR int AttachDebuggerTracing(bool showDebugInfo, void* pSetTraceFunc, void* pTraceFunc, unsigned int threadId, void* pPyNone) + { + ModuleInfo moduleInfo = GetPythonModule(); + if (moduleInfo.errorGettingModule != 0) { + return moduleInfo.errorGettingModule; + } + HMODULE module = moduleInfo.module; + if (showDebugInfo) { + std::cout << "Setting sys trace for existing threads." << std::endl << std::flush; + } + int attached = 0; + PyObjectHolder traceFunc(moduleInfo.isDebug, reinterpret_cast(pTraceFunc), true); + PyObjectHolder setTraceFunc(moduleInfo.isDebug, reinterpret_cast(pSetTraceFunc), true); + PyObjectHolder pyNone(moduleInfo.isDebug, reinterpret_cast(pPyNone), true); + + int temp = InternalSetSysTraceFunc(module, moduleInfo.isDebug, showDebugInfo, &traceFunc, &setTraceFunc, threadId, &pyNone); + if (temp == 0) { + // we've successfully attached the debugger + return 0; + } else { + if (temp > attached) { + //I.e.: the higher the value the more significant it is. + attached = temp; + } + } + + if (showDebugInfo) { + std::cout << "Setting sys trace for existing threads failed with code: " << attached << "." << std::endl << std::flush; + } + return attached; + } + +} + diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.h b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.h new file mode 100644 index 0000000..3a2b582 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.h @@ -0,0 +1,57 @@ +/* **************************************************************************** + * + * Copyright (c) Brainwy software Ltda. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Apache License, Version 2.0, please send an email to + * vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + * + * ***************************************************************************/ + +#ifndef _ATTACH_DLL_H_ +#define _ATTACH_DLL_H_ + +#if defined DLL_EXPORT +#define DECLDIR __declspec(dllexport) +#else +#define DECLDIR __declspec(dllimport) +#endif + + +extern "C" +{ + DECLDIR int AttachAndRunPythonCode(const char *command, int *result ); + + /* + * Helper to print debug information from the current process + */ + DECLDIR int PrintDebugInfo(); + + /* + Could be used with ctypes (note that the threading should be initialized, so, + doing it in a thread as below is recommended): + + def check(): + + import ctypes + lib = ctypes.cdll.LoadLibrary(r'C:\...\attach_x86.dll') + print 'result', lib.AttachDebuggerTracing(0) + + t = threading.Thread(target=check) + t.start() + t.join() + */ + DECLDIR int AttachDebuggerTracing( + bool showDebugInfo, + void* pSetTraceFunc, // Actually PyObject*, but we don't want to include it here. + void* pTraceFunc, // Actually PyObject*, but we don't want to include it here. + unsigned int threadId, + void* pPyNone // Actually PyObject*, but we don't want to include it here. + ); +} + +#endif \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/compile_windows.bat b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/compile_windows.bat new file mode 100644 index 0000000..59ffcc0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/compile_windows.bat @@ -0,0 +1,44 @@ +:: This script compiles the attach and inject DLLs for x86 and x64 architectures. + +setlocal +@cd /d %~dp0 + +@set VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe +@echo Using vswhere at %VSWHERE% +@for /f "usebackq tokens=*" %%i in (`"%VSWHERE%" -prerelease -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do set VSDIR=%%i +@echo Using Visual C++ at %VSDIR% + +call "%VSDIR%\VC\Auxiliary\Build\vcvarsall.bat" x86 -vcvars_spectre_libs=spectre + +cl -DUNICODE -D_UNICODE /EHsc /Zi /O1 /W3 /LD /MD /Qspectre attach.cpp /link /PROFILE /GUARD:CF /CETCOMPAT /out:attach_x86.dll +copy attach_x86.dll ..\attach_x86.dll /Y +copy attach_x86.pdb ..\attach_x86.pdb /Y + +cl -DUNICODE -D_UNICODE /EHsc /Zi /O1 /W3 /LD /MD /D BITS_32 /Qspectre run_code_on_dllmain.cpp /link /PROFILE /GUARD:CF /CETCOMPAT /out:run_code_on_dllmain_x86.dll +copy run_code_on_dllmain_x86.dll ..\run_code_on_dllmain_x86.dll /Y +copy run_code_on_dllmain_x86.pdb ..\run_code_on_dllmain_x86.pdb /Y + +cl /EHsc /Zi /O1 /W3 /Qspectre inject_dll.cpp /link /PROFILE /GUARD:CF /CETCOMPAT /out:inject_dll_x86.exe +copy inject_dll_x86.exe ..\inject_dll_x86.exe /Y +copy inject_dll_x86.pdb ..\inject_dll_x86.pdb /Y + +call "%VSDIR%\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64 -vcvars_spectre_libs=spectre + +cl -DUNICODE -D_UNICODE /EHsc /Zi /O1 /W3 /LD /MD /Qspectre attach.cpp /link /PROFILE /GUARD:CF /CETCOMPAT /out:attach_amd64.dll +copy attach_amd64.dll ..\attach_amd64.dll /Y +copy attach_amd64.pdb ..\attach_amd64.pdb /Y + +cl -DUNICODE -D_UNICODE /EHsc /Zi /O1 /W3 /LD /MD /D BITS_64 /Qspectre run_code_on_dllmain.cpp /link /PROFILE /GUARD:CF /CETCOMPAT /out:run_code_on_dllmain_amd64.dll +copy run_code_on_dllmain_amd64.dll ..\run_code_on_dllmain_amd64.dll /Y +copy run_code_on_dllmain_amd64.pdb ..\run_code_on_dllmain_amd64.pdb /Y + +cl /EHsc /Zi /O1 /W3 /Qspectre inject_dll.cpp /link /PROFILE /GUARD:CF /CETCOMPAT /out:inject_dll_amd64.exe +copy inject_dll_amd64.exe ..\inject_dll_amd64.exe /Y +copy inject_dll_amd64.pdb ..\inject_dll_amd64.pdb /Y + +del *.exe +del *.lib +del *.obj +del *.pdb +del *.dll +del *.exp \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/inject_dll.cpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/inject_dll.cpp new file mode 100644 index 0000000..5b2b34f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/inject_dll.cpp @@ -0,0 +1,134 @@ +#include +#include +#include +#include +#include +#include + +#pragma comment(lib, "kernel32.lib") +#pragma comment(lib, "user32.lib") + +// Helper to free data when we leave the scope. +class DataToFree { +public: + HANDLE hProcess; + HANDLE snapshotHandle; + + LPVOID remoteMemoryAddr; + int remoteMemorySize; + + DataToFree(){ + this->hProcess = nullptr; + this->snapshotHandle = nullptr; + + this->remoteMemoryAddr = nullptr; + this->remoteMemorySize = 0; + } + + ~DataToFree() { + if(this->hProcess != nullptr){ + + if(this->remoteMemoryAddr != nullptr && this->remoteMemorySize != 0){ + VirtualFreeEx(this->hProcess, this->remoteMemoryAddr, this->remoteMemorySize, MEM_RELEASE); + this->remoteMemoryAddr = nullptr; + this->remoteMemorySize = 0; + } + + CloseHandle(this->hProcess); + this->hProcess = nullptr; + } + + if(this->snapshotHandle != nullptr){ + CloseHandle(this->snapshotHandle); + this->snapshotHandle = nullptr; + } + } +}; + + +/** + * All we do here is load a dll in a remote program (in a remote thread). + * + * Arguments must be the pid and the dll name to run. + * + * i.e.: inject_dll.exe + */ +int wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] ) +{ + std::cout << "Running executable to inject dll." << std::endl; + + // Helper to clear resources. + DataToFree dataToFree; + + if(argc != 3){ + std::cout << "Expected 2 arguments (pid, dll name)." << std::endl; + return 1; + } + + const int pid = _wtoi(argv[1]); + if(pid == 0){ + std::cout << "Invalid pid." << std::endl; + return 2; + } + + const int MAX_PATH_SIZE_PADDED = MAX_PATH + 1; + char dllPath[MAX_PATH_SIZE_PADDED]; + memset(&dllPath[0], '\0', MAX_PATH_SIZE_PADDED); + size_t pathLen = 0; + wcstombs_s(&pathLen, dllPath, argv[2], MAX_PATH); + + const bool inheritable = false; + const HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, inheritable, pid); + if(hProcess == nullptr || hProcess == INVALID_HANDLE_VALUE){ + std::cout << "Unable to open process with pid: " << pid << ". Error code: " << GetLastError() << "." << std::endl; + return 3; + } + dataToFree.hProcess = hProcess; + std::cout << "OpenProcess with pid: " << pid << std::endl; + + const LPVOID remoteMemoryAddr = VirtualAllocEx(hProcess, nullptr, MAX_PATH_SIZE_PADDED, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); + if(remoteMemoryAddr == nullptr){ + std::cout << "Error. Unable to allocate memory in pid: " << pid << ". Error code: " << GetLastError() << "." << std::endl; + return 4; + } + dataToFree.remoteMemorySize = MAX_PATH_SIZE_PADDED; + dataToFree.remoteMemoryAddr = remoteMemoryAddr; + + std::cout << "VirtualAllocEx in pid: " << pid << std::endl; + + const bool written = WriteProcessMemory(hProcess, remoteMemoryAddr, dllPath, pathLen, nullptr); + if(!written){ + std::cout << "Error. Unable to write to memory in pid: " << pid << ". Error code: " << GetLastError() << "." << std::endl; + return 5; + } + std::cout << "WriteProcessMemory in pid: " << pid << std::endl; + + const LPVOID loadLibraryAddress = (LPVOID) GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); + if(loadLibraryAddress == nullptr){ + std::cout << "Error. Unable to get LoadLibraryA address. Error code: " << GetLastError() << "." << std::endl; + return 6; + } + std::cout << "loadLibraryAddress: " << pid << std::endl; + + const HANDLE remoteThread = CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE) loadLibraryAddress, remoteMemoryAddr, 0, nullptr); + if (remoteThread == nullptr) { + std::cout << "Error. Unable to CreateRemoteThread. Error code: " << GetLastError() << "." << std::endl; + return 7; + } + + // We wait for the load to finish before proceeding to get the function to actually do the attach. + std::cout << "Waiting for LoadLibraryA to complete." << std::endl; + DWORD result = WaitForSingleObject(remoteThread, 5 * 1000); + + if(result == WAIT_TIMEOUT) { + std::cout << "WaitForSingleObject(LoadLibraryA thread) timed out." << std::endl; + return 8; + + } else if(result == WAIT_FAILED) { + std::cout << "WaitForSingleObject(LoadLibraryA thread) failed. Error code: " << GetLastError() << "." << std::endl; + return 9; + } + + std::cout << "Ok, finished dll injection." << std::endl; + return 0; +} \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/py_win_helpers.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/py_win_helpers.hpp new file mode 100644 index 0000000..ffd6078 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/py_win_helpers.hpp @@ -0,0 +1,77 @@ +#ifndef _PY_WIN_HELPERS_HPP_ +#define _PY_WIN_HELPERS_HPP_ + +bool IsPythonModule(HMODULE module, bool &isDebug) { + wchar_t mod_name[MAX_PATH]; + isDebug = false; + if (GetModuleBaseName(GetCurrentProcess(), module, mod_name, MAX_PATH)) { + if (_wcsnicmp(mod_name, L"python", 6) == 0) { + if (wcslen(mod_name) >= 10 && _wcsnicmp(mod_name + 8, L"_d", 2) == 0) { + isDebug = true; + } + + // Check if the module has Py_IsInitialized. + DEFINE_PROC_NO_CHECK(isInit, Py_IsInitialized*, "Py_IsInitialized", 0); + DEFINE_PROC_NO_CHECK(gilEnsure, PyGILState_Ensure*, "PyGILState_Ensure", 51); + DEFINE_PROC_NO_CHECK(gilRelease, PyGILState_Release*, "PyGILState_Release", 51); + if (isInit == nullptr || gilEnsure == nullptr || gilRelease == nullptr) { + return false; + } + + + return true; + } + } + return false; +} + + +struct ModuleInfo { + HMODULE module; + bool isDebug; + int errorGettingModule; // 0 means ok, negative values some error (should never be positive). +}; + + +ModuleInfo GetPythonModule() { + HANDLE hProcess = GetCurrentProcess(); + ModuleInfo moduleInfo; + moduleInfo.module = nullptr; + moduleInfo.isDebug = false; + moduleInfo.errorGettingModule = 0; + + DWORD modSize = sizeof(HMODULE) * 1024; + HMODULE* hMods = (HMODULE*)_malloca(modSize); + if (hMods == nullptr) { + std::cout << "hmods not allocated! " << std::endl << std::flush; + moduleInfo.errorGettingModule = -1; + return moduleInfo; + } + + DWORD modsNeeded; + while (!EnumProcessModules(hProcess, hMods, modSize, &modsNeeded)) { + // try again w/ more space... + _freea(hMods); + hMods = (HMODULE*)_malloca(modsNeeded); + if (hMods == nullptr) { + std::cout << "hmods not allocated (2)! " << std::endl << std::flush; + moduleInfo.errorGettingModule = -2; + return moduleInfo; + } + modSize = modsNeeded; + } + + for (size_t i = 0; i < modsNeeded / sizeof(HMODULE); i++) { + bool isDebug; + if (IsPythonModule(hMods[i], isDebug)) { + moduleInfo.isDebug = isDebug; + moduleInfo.module = hMods[i]; + return moduleInfo; + } + } + std::cout << "Unable to find python module. " << std::endl << std::flush; + moduleInfo.errorGettingModule = -3; + return moduleInfo; +} + +#endif \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_in_memory.hpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_in_memory.hpp new file mode 100644 index 0000000..6839810 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_in_memory.hpp @@ -0,0 +1,116 @@ +#ifndef _PY_RUN_CODE_IN_MEMORY_HPP_ +#define _PY_RUN_CODE_IN_MEMORY_HPP_ + +#include +#include "attach.h" +#include "stdafx.h" + +#include +#include +#include +#include + +#include "../common/python.h" +#include "../common/ref_utils.hpp" +#include "../common/py_utils.hpp" +#include "../common/py_settrace.hpp" + +#include "py_win_helpers.hpp" + +#pragma comment(lib, "kernel32.lib") +#pragma comment(lib, "user32.lib") +#pragma comment(lib, "advapi32.lib") + +DECLDIR int AttachAndRunPythonCode(const char *command, int *attachInfo ); + +// NOTE: BUFSIZE must be the same from add_code_to_python_process.py +#define BUFSIZE 2048 + +// Helper to free data when we leave the scope. +class DataToFree { + +public: + + HANDLE hMapFile; + void* mapViewOfFile; + char* codeToRun; + + DataToFree() { + this->hMapFile = nullptr; + this->mapViewOfFile = nullptr; + this->codeToRun = nullptr; + } + + ~DataToFree() { + if (this->hMapFile != nullptr) { + CloseHandle(this->hMapFile); + this->hMapFile = nullptr; + } + if (this->mapViewOfFile != nullptr) { + UnmapViewOfFile(this->mapViewOfFile); + this->mapViewOfFile = nullptr; + } + if (this->codeToRun != nullptr) { + delete this->codeToRun; + this->codeToRun = nullptr; + } + } +}; + + + +extern "C" +{ + /** + * This method will read the code to be executed from the named shared memory + * and execute it. + */ + DECLDIR int RunCodeInMemoryInAttachedDll() { + // PRINT("Attempting to run Python code from named shared memory.") + //get the code to be run (based on https://docs.microsoft.com/en-us/windows/win32/memory/creating-named-shared-memory). + HANDLE hMapFile; + char* mapViewOfFile; + + DataToFree dataToFree; + + std::string namedSharedMemoryName("__pydevd_pid_code_to_run__"); + namedSharedMemoryName += std::to_string(GetCurrentProcessId()); + + hMapFile = OpenFileMappingA( + FILE_MAP_ALL_ACCESS, // read/write access + FALSE, // do not inherit the name + namedSharedMemoryName.c_str()); // name of mapping object + + if (hMapFile == nullptr) { + std::cout << "Error opening named shared memory (OpenFileMapping): " << GetLastError() + " name: " << namedSharedMemoryName << std::endl; + return 1; + } else { + // PRINT("Opened named shared memory.") + } + + dataToFree.hMapFile = hMapFile; + + mapViewOfFile = reinterpret_cast < char* > (MapViewOfFile(hMapFile, // handle to map object + FILE_MAP_ALL_ACCESS, // read/write permission + 0, + 0, + BUFSIZE)); + + if (mapViewOfFile == nullptr) { + std::cout << "Error mapping view of named shared memory (MapViewOfFile): " << GetLastError() << std::endl; + return 1; + } else { + // PRINT("Mapped view of file.") + } + dataToFree.mapViewOfFile = mapViewOfFile; + // std::cout << "Will run contents: " << mapViewOfFile << std::endl; + + dataToFree.codeToRun = new char[BUFSIZE]; + memmove(dataToFree.codeToRun, mapViewOfFile, BUFSIZE); + + int attachInfo = 0; + return AttachAndRunPythonCode(dataToFree.codeToRun, &attachInfo); + } +} + +#endif \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_on_dllmain.cpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_on_dllmain.cpp new file mode 100644 index 0000000..fcf7354 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_on_dllmain.cpp @@ -0,0 +1,78 @@ +#include +#include +#include "attach.h" +#include "stdafx.h" + +#include +#include +#include +#include + +typedef int (_RunCodeInMemoryInAttachedDll)(); + +HINSTANCE globalDllInstance = NULL; + +class NotificationHelper { +public: +#pragma warning( push ) +#pragma warning( disable : 4722 ) +// disable c4722 here: Destructor never returns warning. Compiler sees ExitThread and assumes that +// there is a potential memory leak. + ~NotificationHelper(){ + std::string eventName("_pydevd_pid_event_"); + eventName += std::to_string(GetCurrentProcessId()); + + // When we finish we need to set the event that the caller is waiting for and + // unload the dll (if we don't exit this dll we won't be able to reattach later on). + auto event = CreateEventA(nullptr, false, false, eventName.c_str()); + if (event != nullptr) { + SetEvent(event); + CloseHandle(event); + } + FreeLibraryAndExitThread(globalDllInstance, 0); + } +#pragma warning( pop ) +}; + +DWORD WINAPI RunCodeInThread(LPVOID lpParam){ + NotificationHelper notificationHelper; // When we exit the scope the destructor should take care of the cleanup. + +#ifdef BITS_32 + HMODULE attachModule = GetModuleHandleA("attach_x86.dll"); +#else + HMODULE attachModule = GetModuleHandleA("attach_amd64.dll"); +#endif + + if (attachModule == nullptr) { + std::cout << "Error: unable to get attach_x86.dll or attach_amd64.dll module handle." << std::endl; + return 900; + } + + _RunCodeInMemoryInAttachedDll* runCode = reinterpret_cast < _RunCodeInMemoryInAttachedDll* > (GetProcAddress(attachModule, "RunCodeInMemoryInAttachedDll")); + if (runCode == nullptr) { + std::cout << "Error: unable to GetProcAddress(attachModule, RunCodeInMemoryInAttachedDll) from attach_x86.dll or attach_amd64.dll." << std::endl; + return 901; + } + + runCode(); + return 0; +} + +/** + * When the dll is loaded we create a thread that will call 'RunCodeInMemoryInAttachedDll' + * in the attach dll (when completed we unload this library for a reattach to work later on). + */ +BOOL WINAPI DllMain( + _In_ HINSTANCE hinstDLL, + _In_ DWORD fdwReason, + _In_ LPVOID lpvReserved +){ + if(fdwReason == DLL_PROCESS_ATTACH){ + globalDllInstance = hinstDLL; + DWORD threadId; + CreateThread(nullptr, 0, &RunCodeInThread, nullptr, 0, &threadId); + } + else if(fdwReason == DLL_PROCESS_DETACH){ + } + return true; +} diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.cpp b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.cpp new file mode 100644 index 0000000..4b80b54 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.cpp @@ -0,0 +1,22 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Apache License, Version 2.0, please send an email to + * vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + * + * ***************************************************************************/ + +// stdafx.cpp : source file that includes just the standard includes +// PyDebugAttach.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.h b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.h new file mode 100644 index 0000000..15274c0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.h @@ -0,0 +1,36 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Apache License, Version 2.0, please send an email to + * vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + * + * ***************************************************************************/ + +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#include +#include +#include +#include +#include + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/targetver.h b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/targetver.h new file mode 100644 index 0000000..acff541 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/targetver.h @@ -0,0 +1,22 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Apache License, Version 2.0, please send an email to + * vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + * + * ***************************************************************************/ + +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_file_utils.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_file_utils.py new file mode 100644 index 0000000..b9fbe4d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_file_utils.py @@ -0,0 +1,965 @@ +r""" +This module provides utilities to get the absolute filenames so that we can be sure that: + - The case of a file will match the actual file in the filesystem (otherwise breakpoints won't be hit). + - Providing means for the user to make path conversions when doing a remote debugging session in + one machine and debugging in another. + +To do that, the PATHS_FROM_ECLIPSE_TO_PYTHON constant must be filled with the appropriate paths. + +@note: + in this context, the server is where your python process is running + and the client is where eclipse is running. + +E.g.: + If the server (your python process) has the structure + /user/projects/my_project/src/package/module1.py + + and the client has: + c:\my_project\src\package\module1.py + + the PATHS_FROM_ECLIPSE_TO_PYTHON would have to be: + PATHS_FROM_ECLIPSE_TO_PYTHON = [(r'c:\my_project\src', r'/user/projects/my_project/src')] + + alternatively, this can be set with an environment variable from the command line: + set PATHS_FROM_ECLIPSE_TO_PYTHON=[['c:\my_project\src','/user/projects/my_project/src']] + +@note: DEBUG_CLIENT_SERVER_TRANSLATION can be set to True to debug the result of those translations + +@note: the case of the paths is important! Note that this can be tricky to get right when one machine +uses a case-independent filesystem and the other uses a case-dependent filesystem (if the system being +debugged is case-independent, 'normcase()' should be used on the paths defined in PATHS_FROM_ECLIPSE_TO_PYTHON). + +@note: all the paths with breakpoints must be translated (otherwise they won't be found in the server) + +@note: to enable remote debugging in the target machine (pydev extensions in the eclipse installation) + import pydevd;pydevd.settrace(host, stdoutToServer, stderrToServer, port, suspend) + + see parameter docs on pydevd.py + +@note: for doing a remote debugging session, all the pydevd_ files must be on the server accessible + through the PYTHONPATH (and the PATHS_FROM_ECLIPSE_TO_PYTHON only needs to be set on the target + machine for the paths that'll actually have breakpoints). +""" + +from _pydev_bundle import pydev_log +from _pydevd_bundle.pydevd_constants import DebugInfoHolder, IS_WINDOWS, IS_JYTHON, DISABLE_FILE_VALIDATION, is_true_in_env, IS_MAC +from _pydev_bundle._pydev_filesystem_encoding import getfilesystemencoding +from _pydevd_bundle.pydevd_comm_constants import file_system_encoding, filesystem_encoding_is_utf8 +from _pydev_bundle.pydev_log import error_once + +import json +import os.path +import sys +import itertools +import ntpath +from functools import partial + +_nt_os_normcase = ntpath.normcase +os_path_basename = os.path.basename +os_path_exists = os.path.exists +join = os.path.join + +try: + FileNotFoundError +except NameError: + FileNotFoundError = IOError # noqa + +try: + os_path_real_path = os.path.realpath # @UndefinedVariable +except: + # jython does not support os.path.realpath + # realpath is a no-op on systems without islink support + os_path_real_path = os.path.abspath + + +def _get_library_dir(): + library_dir = None + try: + import sysconfig + + library_dir = sysconfig.get_path("purelib") + except ImportError: + pass # i.e.: Only 2.7 onwards + + if library_dir is None or not os_path_exists(library_dir): + for path in sys.path: + if os_path_exists(path) and os.path.basename(path) == "site-packages": + library_dir = path + break + + if library_dir is None or not os_path_exists(library_dir): + library_dir = os.path.dirname(os.__file__) + + return library_dir + + +# Note: we can't call sysconfig.get_path from _apply_func_and_normalize_case (it deadlocks on Python 2.7) so, we +# need to get the library dir during module loading. +_library_dir = _get_library_dir() + +# defined as a list of tuples where the 1st element of the tuple is the path in the client machine +# and the 2nd element is the path in the server machine. +# see module docstring for more details. +try: + PATHS_FROM_ECLIPSE_TO_PYTHON = json.loads(os.environ.get("PATHS_FROM_ECLIPSE_TO_PYTHON", "[]")) +except Exception: + pydev_log.critical("Error loading PATHS_FROM_ECLIPSE_TO_PYTHON from environment variable.") + pydev_log.exception() + PATHS_FROM_ECLIPSE_TO_PYTHON = [] +else: + if not isinstance(PATHS_FROM_ECLIPSE_TO_PYTHON, list): + pydev_log.critical("Expected PATHS_FROM_ECLIPSE_TO_PYTHON loaded from environment variable to be a list.") + PATHS_FROM_ECLIPSE_TO_PYTHON = [] + else: + # Converting json lists to tuple + PATHS_FROM_ECLIPSE_TO_PYTHON = [tuple(x) for x in PATHS_FROM_ECLIPSE_TO_PYTHON] + +# example: +# PATHS_FROM_ECLIPSE_TO_PYTHON = [ +# (r'd:\temp\temp_workspace_2\test_python\src\yyy\yyy', +# r'd:\temp\temp_workspace_2\test_python\src\hhh\xxx') +# ] + +convert_to_long_pathname = lambda filename: filename +convert_to_short_pathname = lambda filename: filename +get_path_with_real_case = lambda filename: filename + +# Note that we have a cache for previous list dirs... the only case where this may be an +# issue is if the user actually changes the case of an existing file on while +# the debugger is executing (as this seems very unlikely and the cache can save a +# reasonable time -- especially on mapped drives -- it seems nice to have it). +_listdir_cache = {} + +# May be changed during tests. +os_listdir = os.listdir + + +def _resolve_listing(resolved, iter_parts_lowercase, cache=_listdir_cache): + while True: # Note: while True to make iterative and not recursive + try: + resolve_lowercase = next(iter_parts_lowercase) # must be lowercase already + except StopIteration: + return resolved + + resolved_lower = resolved.lower() + + resolved_joined = cache.get((resolved_lower, resolve_lowercase)) + if resolved_joined is None: + dir_contents = cache.get(resolved_lower) + if dir_contents is None: + dir_contents = cache[resolved_lower] = os_listdir(resolved) + + for filename in dir_contents: + if filename.lower() == resolve_lowercase: + resolved_joined = os.path.join(resolved, filename) + cache[(resolved_lower, resolve_lowercase)] = resolved_joined + break + else: + raise FileNotFoundError("Unable to find: %s in %s. Dir Contents: %s" % (resolve_lowercase, resolved, dir_contents)) + + resolved = resolved_joined + + +def _resolve_listing_parts(resolved, parts_in_lowercase, filename): + try: + if parts_in_lowercase == [""]: + return resolved + return _resolve_listing(resolved, iter(parts_in_lowercase)) + except FileNotFoundError: + _listdir_cache.clear() + # Retry once after clearing the cache we have. + try: + return _resolve_listing(resolved, iter(parts_in_lowercase)) + except FileNotFoundError: + if os_path_exists(filename): + # This is really strange, ask the user to report as error. + pydev_log.critical( + "pydev debugger: critical: unable to get real case for file. Details:\n" + "filename: %s\ndrive: %s\nparts: %s\n" + "(please create a ticket in the tracker to address this).", + filename, + resolved, + parts_in_lowercase, + ) + pydev_log.exception() + # Don't fail, just return the original file passed. + return filename + except OSError: + # Something as: PermissionError (listdir may fail). + # See: https://github.com/microsoft/debugpy/issues/1154 + # Don't fail nor log unless the trace level is at least info. Just return the original file passed. + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + pydev_log.info( + "pydev debugger: OSError: Unable to get real case for file. Details:\n" "filename: %s\ndrive: %s\nparts: %s\n", + filename, + resolved, + parts_in_lowercase, + ) + pydev_log.exception() + return filename + + +if sys.platform == "win32": + try: + import ctypes + from ctypes.wintypes import MAX_PATH, LPCWSTR, LPWSTR, DWORD + + GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW # noqa + GetLongPathName.argtypes = [LPCWSTR, LPWSTR, DWORD] + GetLongPathName.restype = DWORD + + GetShortPathName = ctypes.windll.kernel32.GetShortPathNameW # noqa + GetShortPathName.argtypes = [LPCWSTR, LPWSTR, DWORD] + GetShortPathName.restype = DWORD + + def _convert_to_long_pathname(filename): + buf = ctypes.create_unicode_buffer(MAX_PATH) + + rv = GetLongPathName(filename, buf, MAX_PATH) + if rv != 0 and rv <= MAX_PATH: + filename = buf.value + + return filename + + def _convert_to_short_pathname(filename): + buf = ctypes.create_unicode_buffer(MAX_PATH) + + rv = GetShortPathName(filename, buf, MAX_PATH) + if rv != 0 and rv <= MAX_PATH: + filename = buf.value + + return filename + + def _get_path_with_real_case(filename): + # Note: this previously made: + # convert_to_long_pathname(convert_to_short_pathname(filename)) + # but this is no longer done because we can't rely on getting the shortname + # consistently (there are settings to disable it on Windows). + # So, using approach which resolves by listing the dir. + + if "~" in filename: + filename = convert_to_long_pathname(filename) + + if filename.startswith("<") or not os_path_exists(filename): + return filename # Not much we can do. + + drive, parts = os.path.splitdrive(os.path.normpath(filename)) + drive = drive.upper() + while parts.startswith(os.path.sep): + parts = parts[1:] + drive += os.path.sep + parts = parts.lower().split(os.path.sep) + return _resolve_listing_parts(drive, parts, filename) + + # Check that it actually works + _get_path_with_real_case(__file__) + except: + # Something didn't quite work out, leave no-op conversions in place. + if DebugInfoHolder.DEBUG_TRACE_LEVEL > 2: + pydev_log.exception() + else: + convert_to_long_pathname = _convert_to_long_pathname + convert_to_short_pathname = _convert_to_short_pathname + get_path_with_real_case = _get_path_with_real_case + +elif IS_JYTHON and IS_WINDOWS: + + def get_path_with_real_case(filename): + if filename.startswith("<"): + return filename + + from java.io import File # noqa + + f = File(filename) + ret = f.getCanonicalPath() + return ret + +elif IS_MAC: + + def get_path_with_real_case(filename): + if filename.startswith("<") or not os_path_exists(filename): + return filename # Not much we can do. + + parts = filename.lower().split("/") + + found = "" + while parts and parts[0] == "": + found += "/" + parts = parts[1:] + + return _resolve_listing_parts(found, parts, filename) + + +if IS_JYTHON: + + def _normcase_windows(filename): + return filename.lower() + +else: + + def _normcase_windows(filename): + # `normcase` doesn't lower case on Python 2 for non-English locale, so we should do it manually. + if "~" in filename: + filename = convert_to_long_pathname(filename) + + filename = _nt_os_normcase(filename) + return filename.lower() + + +def _normcase_linux(filename): + return filename # no-op + + +_filename_normalization = os.environ.get("PYDEVD_FILENAME_NORMALIZATION", "").lower() +if _filename_normalization == "lower": + # Note: this is mostly for testing (forcing to always lower-case all contents + # internally -- used to mimick Windows normalization on Linux). + + def _normcase_lower(filename): + return filename.lower() + + _default_normcase = _normcase_lower + +elif _filename_normalization == "none": + # Disable any filename normalization may be an option on Windows if the + # user is having issues under some circumstances. + _default_normcase = _normcase_linux + +elif IS_WINDOWS: + _default_normcase = _normcase_windows + +elif IS_MAC: + + def _normcase_lower(filename): + return filename.lower() + + _default_normcase = _normcase_lower + +else: + _default_normcase = _normcase_linux + + +def normcase(s, NORMCASE_CACHE={}): + try: + return NORMCASE_CACHE[s] + except: + normalized = NORMCASE_CACHE[s] = _default_normcase(s) + return normalized + + +_ide_os = "WINDOWS" if IS_WINDOWS else "UNIX" + +_normcase_from_client = normcase + + +def normcase_from_client(s): + return _normcase_from_client(s) + + +DEBUG_CLIENT_SERVER_TRANSLATION = os.environ.get("DEBUG_PYDEVD_PATHS_TRANSLATION", "False").lower() in ("1", "true") + + +def set_ide_os(os): + """ + We need to set the IDE os because the host where the code is running may be + actually different from the client (and the point is that we want the proper + paths to translate from the client to the server). + + :param os: + 'UNIX' or 'WINDOWS' + """ + global _ide_os + global _normcase_from_client + prev = _ide_os + if os == "WIN": # Apparently PyCharm uses 'WIN' (https://github.com/fabioz/PyDev.Debugger/issues/116) + os = "WINDOWS" + + assert os in ("WINDOWS", "UNIX") + + if DEBUG_CLIENT_SERVER_TRANSLATION: + print("pydev debugger: client OS: %s" % (os,)) + + _normcase_from_client = normcase + if os == "WINDOWS": + # Client in Windows and server in Unix, we need to normalize the case. + if not IS_WINDOWS: + _normcase_from_client = _normcase_windows + + else: + # Client in Unix and server in Windows, we can't normalize the case. + if IS_WINDOWS: + _normcase_from_client = _normcase_linux + + if prev != os: + _ide_os = os + # We need to (re)setup how the client <-> server translation works to provide proper separators. + setup_client_server_paths(_last_client_server_paths_set) + + +# Caches filled as requested during the debug session. +NORM_PATHS_CONTAINER = {} +NORM_PATHS_AND_BASE_CONTAINER = {} + + +def canonical_normalized_path(filename): + """ + This returns a filename that is canonical and it's meant to be used internally + to store information on breakpoints and see if there's any hit on it. + + Note that this version is only internal as it may not match the case and + may have symlinks resolved (and thus may not match what the user expects + in the editor). + """ + return get_abs_path_real_path_and_base_from_file(filename)[1] + + +def absolute_path(filename): + """ + Provides a version of the filename that's absolute (and NOT normalized). + """ + return get_abs_path_real_path_and_base_from_file(filename)[0] + + +def basename(filename): + """ + Provides the basename for a file. + """ + return get_abs_path_real_path_and_base_from_file(filename)[2] + + +# Returns tuple of absolute path and real path for given filename +def _abs_and_canonical_path(filename, NORM_PATHS_CONTAINER=NORM_PATHS_CONTAINER): + try: + return NORM_PATHS_CONTAINER[filename] + except: + if filename.__class__ != str: + raise AssertionError("Paths passed to _abs_and_canonical_path must be str. Found: %s (%s)" % (filename, type(filename))) + if os is None: # Interpreter shutdown + return filename, filename + + os_path = os.path + if os_path is None: # Interpreter shutdown + return filename, filename + + os_path_abspath = os_path.abspath + os_path_isabs = os_path.isabs + + if os_path_abspath is None or os_path_isabs is None or os_path_real_path is None: # Interpreter shutdown + return filename, filename + + isabs = os_path_isabs(filename) + + if _global_resolve_symlinks: + os_path_abspath = os_path_real_path + + normalize = False + abs_path = _apply_func_and_normalize_case(filename, os_path_abspath, isabs, normalize) + + normalize = True + real_path = _apply_func_and_normalize_case(filename, os_path_real_path, isabs, normalize) + + # cache it for fast access later + NORM_PATHS_CONTAINER[filename] = abs_path, real_path + return abs_path, real_path + + +def _get_relative_filename_abs_path(filename, func, os_path_exists=os_path_exists): + # If we have a relative path and the file does not exist when made absolute, try to + # resolve it based on the sys.path entries. + for p in sys.path: + r = func(os.path.join(p, filename)) + if os_path_exists(r): + return r + + # We couldn't find the real file for the relative path. Resolve it as if it was in + # a library (so that it's considered a library file and not a project file). + r = func(os.path.join(_library_dir, filename)) + return r + + +def _apply_func_and_normalize_case(filename, func, isabs, normalize_case, os_path_exists=os_path_exists, join=join): + if filename.startswith("<"): + # Not really a file, rather a synthetic name like or ; + # shouldn't be normalized. + return filename + + r = func(filename) + + if not isabs: + if not os_path_exists(r): + r = _get_relative_filename_abs_path(filename, func) + + ind = r.find(".zip") + if ind == -1: + ind = r.find(".egg") + if ind != -1: + ind += 4 + zip_path = r[:ind] + inner_path = r[ind:] + if inner_path.startswith("!"): + # Note (fabioz): although I can replicate this by creating a file ending as + # .zip! or .egg!, I don't really know what's the real-world case for this + # (still kept as it was added by @jetbrains, but it should probably be reviewed + # later on). + # Note 2: it goes hand-in-hand with 'exists'. + inner_path = inner_path[1:] + zip_path = zip_path + "!" + + if inner_path.startswith("/") or inner_path.startswith("\\"): + inner_path = inner_path[1:] + if inner_path: + if normalize_case: + r = join(normcase(zip_path), inner_path) + else: + r = join(zip_path, inner_path) + return r + + if normalize_case: + r = normcase(r) + return r + + +_ZIP_SEARCH_CACHE = {} +_NOT_FOUND_SENTINEL = object() + + +def exists(filename): + if os_path_exists(filename): + return True + + if not os.path.isabs(filename): + filename = _get_relative_filename_abs_path(filename, os.path.abspath) + if os_path_exists(filename): + return True + + ind = filename.find(".zip") + if ind == -1: + ind = filename.find(".egg") + + if ind != -1: + ind += 4 + zip_path = filename[:ind] + inner_path = filename[ind:] + if inner_path.startswith("!"): + # Note (fabioz): although I can replicate this by creating a file ending as + # .zip! or .egg!, I don't really know what's the real-world case for this + # (still kept as it was added by @jetbrains, but it should probably be reviewed + # later on). + # Note 2: it goes hand-in-hand with '_apply_func_and_normalize_case'. + inner_path = inner_path[1:] + zip_path = zip_path + "!" + + zip_file_obj = _ZIP_SEARCH_CACHE.get(zip_path, _NOT_FOUND_SENTINEL) + if zip_file_obj is None: + return False + elif zip_file_obj is _NOT_FOUND_SENTINEL: + try: + import zipfile + + zip_file_obj = zipfile.ZipFile(zip_path, "r") + _ZIP_SEARCH_CACHE[zip_path] = zip_file_obj + except: + _ZIP_SEARCH_CACHE[zip_path] = _NOT_FOUND_SENTINEL + return False + + try: + if inner_path.startswith("/") or inner_path.startswith("\\"): + inner_path = inner_path[1:] + + _info = zip_file_obj.getinfo(inner_path.replace("\\", "/")) + + return join(zip_path, inner_path) + except KeyError: + return False + + else: + pydev_log.debug("os.path.exists(%r) returned False.", filename) + + return False + + +try: + report = pydev_log.critical + if DISABLE_FILE_VALIDATION: + report = pydev_log.debug + + try: + code = os_path_real_path.func_code + except AttributeError: + code = os_path_real_path.__code__ + + if code.co_filename.startswith(" in this case). + f = "" + + if f.startswith("<"): + return f, normcase(f), f + + if _abs_and_canonical_path is None: # Interpreter shutdown + i = max(f.rfind("/"), f.rfind("\\")) + return (f, f, f[i + 1 :]) + + if f is not None: + if f.endswith(".pyc"): + f = f[:-1] + elif f.endswith("$py.class"): + f = f[: -len("$py.class")] + ".py" + + abs_path, canonical_normalized_filename = _abs_and_canonical_path(f) + + try: + base = os_path_basename(canonical_normalized_filename) + except AttributeError: + # Error during shutdown. + i = max(f.rfind("/"), f.rfind("\\")) + base = f[i + 1 :] + ret = abs_path, canonical_normalized_filename, base + NORM_PATHS_AND_BASE_CONTAINER[filename] = ret + return ret + + +def get_abs_path_real_path_and_base_from_frame(frame, NORM_PATHS_AND_BASE_CONTAINER=NORM_PATHS_AND_BASE_CONTAINER): + try: + return NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] + except: + # This one is just internal (so, does not need any kind of client-server translation) + f = frame.f_code.co_filename + + if f is not None and f.startswith(("build/bdist.", "build\\bdist.")): + # files from eggs in Python 2.7 have paths like build/bdist.linux-x86_64/egg/ + f = frame.f_globals["__file__"] + + if get_abs_path_real_path_and_base_from_file is None: + # Interpreter shutdown + if not f: + # i.e.: it's possible that the user compiled code with an empty string (consider + # it as in this case). + f = "" + i = max(f.rfind("/"), f.rfind("\\")) + return f, f, f[i + 1 :] + + ret = get_abs_path_real_path_and_base_from_file(f) + # Also cache based on the frame.f_code.co_filename (if we had it inside build/bdist it can make a difference). + NORM_PATHS_AND_BASE_CONTAINER[frame.f_code.co_filename] = ret + return ret + + +def get_fullname(mod_name): + import pkgutil + + try: + loader = pkgutil.get_loader(mod_name) + except: + return None + if loader is not None: + for attr in ("get_filename", "_get_filename"): + meth = getattr(loader, attr, None) + if meth is not None: + return meth(mod_name) + return None + + +def get_package_dir(mod_name): + for path in sys.path: + mod_path = join(path, mod_name.replace(".", "/")) + if os.path.isdir(mod_path): + return mod_path + return None diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__init__.py new file mode 100644 index 0000000..f77af49 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__init__.py @@ -0,0 +1,3 @@ +import pkgutil + +__path__ = pkgutil.extend_path(__path__, __name__) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8734a7f2a1f908f7d6f77ff7799e8cb67baf4811 GIT binary patch literal 343 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 Ang9R* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/jinja2_debug.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/jinja2_debug.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0160657c4480cd02236e71ca685c1b5a225b0498 GIT binary patch literal 19701 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 CPrxMr literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/pydevd_line_validation.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/__pycache__/pydevd_line_validation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..413badb47ba26253d0d3bf5c2159cadfdd31dc67 GIT binary patch literal 5675 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 9) or version[0] > 1 +except: + pass + + +class DjangoLineBreakpoint(LineBreakpointWithLazyValidation): + def __init__( + self, canonical_normalized_filename, breakpoint_id, line, condition, func_name, expression, hit_condition=None, is_logpoint=False + ): + self.canonical_normalized_filename = canonical_normalized_filename + LineBreakpointWithLazyValidation.__init__( + self, breakpoint_id, line, condition, func_name, expression, hit_condition=hit_condition, is_logpoint=is_logpoint + ) + + def __str__(self): + return "DjangoLineBreakpoint: %s-%d" % (self.canonical_normalized_filename, self.line) + + +class _DjangoValidationInfo(ValidationInfo): + @overrides(ValidationInfo._collect_valid_lines_in_template_uncached) + def _collect_valid_lines_in_template_uncached(self, template): + lines = set() + for node in self._iternodes(template.nodelist): + if node.__class__.__name__ in _IGNORE_RENDER_OF_CLASSES: + continue + lineno = self._get_lineno(node) + if lineno is not None: + lines.add(lineno) + return lines + + def _get_lineno(self, node): + if hasattr(node, "token") and hasattr(node.token, "lineno"): + return node.token.lineno + return None + + def _iternodes(self, nodelist): + for node in nodelist: + yield node + + try: + children = node.child_nodelists + except: + pass + else: + for attr in children: + nodelist = getattr(node, attr, None) + if nodelist: + # i.e.: yield from _iternodes(nodelist) + for node in self._iternodes(nodelist): + yield node + + +def add_line_breakpoint( + pydb, + type, + canonical_normalized_filename, + breakpoint_id, + line, + condition, + expression, + func_name, + hit_condition=None, + is_logpoint=False, + add_breakpoint_result=None, + on_changed_breakpoint_state=None, +): + if type == "django-line": + django_line_breakpoint = DjangoLineBreakpoint( + canonical_normalized_filename, + breakpoint_id, + line, + condition, + func_name, + expression, + hit_condition=hit_condition, + is_logpoint=is_logpoint, + ) + if not hasattr(pydb, "django_breakpoints"): + _init_plugin_breaks(pydb) + + if IS_DJANGO19_OR_HIGHER: + add_breakpoint_result.error_code = PyDevdAPI.ADD_BREAKPOINT_LAZY_VALIDATION + django_line_breakpoint.add_breakpoint_result = add_breakpoint_result + django_line_breakpoint.on_changed_breakpoint_state = on_changed_breakpoint_state + else: + add_breakpoint_result.error_code = PyDevdAPI.ADD_BREAKPOINT_NO_ERROR + + return django_line_breakpoint, pydb.django_breakpoints + return None + + +def after_breakpoints_consolidated(py_db, canonical_normalized_filename, id_to_pybreakpoint, file_to_line_to_breakpoints): + if IS_DJANGO19_OR_HIGHER: + django_breakpoints_for_file = file_to_line_to_breakpoints.get(canonical_normalized_filename) + if not django_breakpoints_for_file: + return + + if not hasattr(py_db, "django_validation_info"): + _init_plugin_breaks(py_db) + + # In general we validate the breakpoints only when the template is loaded, but if the template + # was already loaded, we can validate the breakpoints based on the last loaded value. + py_db.django_validation_info.verify_breakpoints_from_template_cached_lines( + py_db, canonical_normalized_filename, django_breakpoints_for_file + ) + + +def add_exception_breakpoint(pydb, type, exception): + if type == "django": + if not hasattr(pydb, "django_exception_break"): + _init_plugin_breaks(pydb) + pydb.django_exception_break[exception] = True + return True + return False + + +def _init_plugin_breaks(pydb): + pydb.django_exception_break = {} + pydb.django_breakpoints = {} + + pydb.django_validation_info = _DjangoValidationInfo() + + +def remove_exception_breakpoint(pydb, exception_type, exception): + if exception_type == "django": + try: + del pydb.django_exception_break[exception] + return True + except KeyError: + pass + return False + + +def remove_all_exception_breakpoints(pydb): + if hasattr(pydb, "django_exception_break"): + pydb.django_exception_break = {} + return True + return False + + +def get_breakpoints(pydb, breakpoint_type): + if breakpoint_type == "django-line": + return pydb.django_breakpoints + return None + + +def _inherits(cls, *names): + if cls.__name__ in names: + return True + inherits_node = False + for base in inspect.getmro(cls): + if base.__name__ in names: + inherits_node = True + break + return inherits_node + + +_IGNORE_RENDER_OF_CLASSES = ("TextNode", "NodeList") + + +def _is_django_render_call(frame): + try: + name = frame.f_code.co_name + if name != "render": + return False + + if "self" not in frame.f_locals: + return False + + cls = frame.f_locals["self"].__class__ + + inherits_node = _inherits(cls, "Node") + + if not inherits_node: + return False + + clsname = cls.__name__ + if IS_DJANGO19: + # in Django 1.9 we need to save the flag that there is included template + if clsname == "IncludeNode": + if "context" in frame.f_locals: + context = frame.f_locals["context"] + context._has_included_template = True + + return clsname not in _IGNORE_RENDER_OF_CLASSES + except: + pydev_log.exception() + return False + + +def _is_django_context_get_call(frame): + try: + if "self" not in frame.f_locals: + return False + + cls = frame.f_locals["self"].__class__ + + return _inherits(cls, "BaseContext") + except: + pydev_log.exception() + return False + + +def _is_django_resolve_call(frame): + try: + name = frame.f_code.co_name + if name != "_resolve_lookup": + return False + + if "self" not in frame.f_locals: + return False + + cls = frame.f_locals["self"].__class__ + + clsname = cls.__name__ + return clsname == "Variable" + except: + pydev_log.exception() + return False + + +def _is_django_suspended(thread): + return thread.additional_info.suspend_type == DJANGO_SUSPEND + + +def suspend_django(py_db, thread, frame, cmd=CMD_SET_BREAK): + if frame.f_lineno is None: + return None + + py_db.set_suspend(thread, cmd) + thread.additional_info.suspend_type = DJANGO_SUSPEND + + return frame + + +def _find_django_render_frame(frame): + while frame is not None and not _is_django_render_call(frame): + frame = frame.f_back + + return frame + + +# ======================================================================================================================= +# Django Frame +# ======================================================================================================================= + + +def _read_file(filename): + # type: (str) -> str + f = open(filename, "r", encoding="utf-8", errors="replace") + s = f.read() + f.close() + return s + + +def _offset_to_line_number(text, offset): + curLine = 1 + curOffset = 0 + while curOffset < offset: + if curOffset == len(text): + return -1 + c = text[curOffset] + if c == "\n": + curLine += 1 + elif c == "\r": + curLine += 1 + if curOffset < len(text) and text[curOffset + 1] == "\n": + curOffset += 1 + + curOffset += 1 + + return curLine + + +def _get_source_django_18_or_lower(frame): + # This method is usable only for the Django <= 1.8 + try: + node = frame.f_locals["self"] + if hasattr(node, "source"): + return node.source + else: + if IS_DJANGO18: + # The debug setting was changed since Django 1.8 + pydev_log.error_once( + "WARNING: Template path is not available. Set the 'debug' option in the OPTIONS of a DjangoTemplates " "backend." + ) + else: + # The debug setting for Django < 1.8 + pydev_log.error_once( + "WARNING: Template path is not available. Please set TEMPLATE_DEBUG=True in your settings.py to make " + "django template breakpoints working" + ) + return None + + except: + pydev_log.exception() + return None + + +def _convert_to_str(s): + return s + + +def _get_template_original_file_name_from_frame(frame): + try: + if IS_DJANGO19: + # The Node source was removed since Django 1.9 + if "context" in frame.f_locals: + context = frame.f_locals["context"] + if hasattr(context, "_has_included_template"): + # if there was included template we need to inspect the previous frames and find its name + back = frame.f_back + while back is not None and frame.f_code.co_name in ("render", "_render"): + locals = back.f_locals + if "self" in locals: + self = locals["self"] + if self.__class__.__name__ == "Template" and hasattr(self, "origin") and hasattr(self.origin, "name"): + return _convert_to_str(self.origin.name) + back = back.f_back + else: + if hasattr(context, "template") and hasattr(context.template, "origin") and hasattr(context.template.origin, "name"): + return _convert_to_str(context.template.origin.name) + return None + elif IS_DJANGO19_OR_HIGHER: + # For Django 1.10 and later there is much simpler way to get template name + if "self" in frame.f_locals: + self = frame.f_locals["self"] + if hasattr(self, "origin") and hasattr(self.origin, "name"): + return _convert_to_str(self.origin.name) + return None + + source = _get_source_django_18_or_lower(frame) + if source is None: + pydev_log.debug("Source is None\n") + return None + fname = _convert_to_str(source[0].name) + + if fname == "": + pydev_log.debug("Source name is %s\n" % fname) + return None + else: + return fname + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 2: + pydev_log.exception("Error getting django template filename.") + return None + + +def _get_template_line(frame): + if IS_DJANGO19_OR_HIGHER: + node = frame.f_locals["self"] + if hasattr(node, "token") and hasattr(node.token, "lineno"): + return node.token.lineno + else: + return None + + source = _get_source_django_18_or_lower(frame) + original_filename = _get_template_original_file_name_from_frame(frame) + if original_filename is not None: + try: + absolute_filename = absolute_path(original_filename) + return _offset_to_line_number(_read_file(absolute_filename), source[1][0]) + except: + return None + return None + + +class DjangoTemplateFrame(object): + IS_PLUGIN_FRAME = True + + def __init__(self, frame): + original_filename = _get_template_original_file_name_from_frame(frame) + self._back_context = frame.f_locals["context"] + self.f_code = FCode("Django Template", original_filename) + self.f_lineno = _get_template_line(frame) + self.f_back = frame + self.f_globals = {} + self.f_locals = self._collect_context(self._back_context) + self.f_trace = None + + def _collect_context(self, context): + res = {} + try: + for d in context.dicts: + for k, v in d.items(): + res[k] = v + except AttributeError: + pass + return res + + def _change_variable(self, name, value): + for d in self._back_context.dicts: + for k, v in d.items(): + if k == name: + d[k] = value + + +class DjangoTemplateSyntaxErrorFrame(object): + IS_PLUGIN_FRAME = True + + def __init__(self, frame, original_filename, lineno, f_locals): + self.f_code = FCode("Django TemplateSyntaxError", original_filename) + self.f_lineno = lineno + self.f_back = frame + self.f_globals = {} + self.f_locals = f_locals + self.f_trace = None + + +def change_variable(frame, attr, expression, default): + if isinstance(frame, DjangoTemplateFrame): + result = eval(expression, frame.f_globals, frame.f_locals) + frame._change_variable(attr, result) + return result + return default + + +def _is_django_variable_does_not_exist_exception_break_context(frame): + try: + name = frame.f_code.co_name + except: + name = None + return name in ("_resolve_lookup", "find_template") + + +def _is_ignoring_failures(frame): + while frame is not None: + if frame.f_code.co_name == "resolve": + ignore_failures = frame.f_locals.get("ignore_failures") + if ignore_failures: + return True + frame = frame.f_back + + return False + + +# ======================================================================================================================= +# Django Step Commands +# ======================================================================================================================= + + +def can_skip(py_db, frame): + if py_db.django_breakpoints: + if _is_django_render_call(frame): + return False + + if py_db.django_exception_break: + module_name = frame.f_globals.get("__name__", "") + + if module_name == "django.template.base": + # Exceptions raised at django.template.base must be checked. + return False + + return True + + +is_tracked_frame = _is_django_render_call + + +def required_events_breakpoint(): + return ("call",) + + +def required_events_stepping(): + return ("call", "return") + + +def has_exception_breaks(py_db): + if len(py_db.django_exception_break) > 0: + return True + return False + + +def has_line_breaks(py_db): + for _canonical_normalized_filename, breakpoints in py_db.django_breakpoints.items(): + if len(breakpoints) > 0: + return True + return False + + +def cmd_step_into(py_db, frame, event, info, thread, stop_info, stop): + plugin_stop = False + if _is_django_suspended(thread): + plugin_stop = stop_info["django_stop"] = event == "call" and _is_django_render_call(frame) + stop = stop and _is_django_resolve_call(frame.f_back) and not _is_django_context_get_call(frame) + if stop: + info.pydev_django_resolve_frame = True # we remember that we've go into python code from django rendering frame + return stop, plugin_stop + + +def cmd_step_over(py_db, frame, event, info, thread, stop_info, stop): + plugin_stop = False + if _is_django_suspended(thread): + plugin_stop = stop_info["django_stop"] = event == "call" and _is_django_render_call(frame) + stop = False + return stop, plugin_stop + else: + if event == "return" and info.pydev_django_resolve_frame and _is_django_resolve_call(frame.f_back): + # we return to Django suspend mode and should not stop before django rendering frame + info.pydev_step_stop = frame.f_back + info.pydev_django_resolve_frame = False + thread.additional_info.suspend_type = DJANGO_SUSPEND + stop = info.pydev_step_stop is frame and event in ("line", "return") + return stop, plugin_stop + + +def stop(py_db, frame, event, thread, stop_info, arg, step_cmd): + if "django_stop" in stop_info and stop_info["django_stop"]: + frame = suspend_django(py_db, thread, DjangoTemplateFrame(frame), step_cmd) + if frame: + py_db.do_wait_suspend(thread, frame, event, arg) + return True + return False + + +def get_breakpoint(py_db, frame, event, info): + breakpoint_type = "django" + + if event == "call" and info.pydev_state != STATE_SUSPEND and py_db.django_breakpoints and _is_django_render_call(frame): + original_filename = _get_template_original_file_name_from_frame(frame) + pydev_log.debug("Django is rendering a template: %s", original_filename) + + canonical_normalized_filename = canonical_normalized_path(original_filename) + django_breakpoints_for_file = py_db.django_breakpoints.get(canonical_normalized_filename) + + if django_breakpoints_for_file: + # At this point, let's validate whether template lines are correct. + if IS_DJANGO19_OR_HIGHER: + django_validation_info = py_db.django_validation_info + context = frame.f_locals["context"] + django_template = context.template + django_validation_info.verify_breakpoints( + py_db, canonical_normalized_filename, django_breakpoints_for_file, django_template + ) + + pydev_log.debug("Breakpoints for that file: %s", django_breakpoints_for_file) + template_line = _get_template_line(frame) + pydev_log.debug("Tracing template line: %s", template_line) + + if template_line in django_breakpoints_for_file: + django_breakpoint = django_breakpoints_for_file[template_line] + new_frame = DjangoTemplateFrame(frame) + return django_breakpoint, new_frame, breakpoint_type + + return None + + +def suspend(py_db, thread, frame, bp_type): + if bp_type == "django": + return suspend_django(py_db, thread, DjangoTemplateFrame(frame)) + return None + + +def _get_original_filename_from_origin_in_parent_frame_locals(frame, parent_frame_name): + filename = None + parent_frame = frame + while parent_frame.f_code.co_name != parent_frame_name: + parent_frame = parent_frame.f_back + + origin = None + if parent_frame is not None: + origin = parent_frame.f_locals.get("origin") + + if hasattr(origin, "name") and origin.name is not None: + filename = _convert_to_str(origin.name) + return filename + + +def exception_break(py_db, frame, thread, arg, is_unwind): + exception, value, trace = arg + + if py_db.django_exception_break and exception is not None: + if ( + exception.__name__ in ["VariableDoesNotExist", "TemplateDoesNotExist", "TemplateSyntaxError"] + and not is_unwind + and just_raised(trace) + and not ignore_exception_trace(trace) + ): + if exception.__name__ == "TemplateSyntaxError": + # In this case we don't actually have a regular render frame with the context + # (we didn't really get to that point). + token = getattr(value, "token", None) + + if token is None: + # Django 1.7 does not have token in exception. Try to get it from locals. + token = frame.f_locals.get("token") + + lineno = getattr(token, "lineno", None) + + original_filename = None + if lineno is not None: + original_filename = _get_original_filename_from_origin_in_parent_frame_locals(frame, "get_template") + + if original_filename is None: + # Django 1.7 does not have origin in get_template. Try to get it from + # load_template. + original_filename = _get_original_filename_from_origin_in_parent_frame_locals(frame, "load_template") + + if original_filename is not None and lineno is not None: + syntax_error_frame = DjangoTemplateSyntaxErrorFrame( + frame, original_filename, lineno, {"token": token, "exception": exception} + ) + + suspend_frame = suspend_django(py_db, thread, syntax_error_frame, CMD_ADD_EXCEPTION_BREAK) + return True, suspend_frame + + elif exception.__name__ == "VariableDoesNotExist": + if _is_django_variable_does_not_exist_exception_break_context(frame): + if not getattr(exception, "silent_variable_failure", False) and not _is_ignoring_failures(frame): + render_frame = _find_django_render_frame(frame) + if render_frame: + suspend_frame = suspend_django(py_db, thread, DjangoTemplateFrame(render_frame), CMD_ADD_EXCEPTION_BREAK) + if suspend_frame: + add_exception_to_frame(suspend_frame, (exception, value, trace)) + thread.additional_info.pydev_message = "VariableDoesNotExist" + suspend_frame.f_back = frame + frame = suspend_frame + return True, frame + + return None diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/README.md b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/README.md new file mode 100644 index 0000000..030e303 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/README.md @@ -0,0 +1,30 @@ +Extensions allow extending the debugger without modifying the debugger code. This is implemented with explicit namespace +packages. + +To implement your own extension: + +1. Ensure that the root folder of your extension is in sys.path (add it to PYTHONPATH) +2. Ensure that your module follows the directory structure below +3. The ``__init__.py`` files inside the pydevd_plugin and extension folder must contain the preamble below, +and nothing else. +Preamble: +```python +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + import pkgutil + __path__ = pkgutil.extend_path(__path__, __name__) +``` +4. Your plugin name inside the extensions folder must start with `"pydevd_plugin"` +5. Implement one or more of the abstract base classes defined in `_pydevd_bundle.pydevd_extension_api`. This can be done +by either inheriting from them or registering with the abstract base class. + +* Directory structure: +``` +|-- root_directory-> must be on python path +| |-- pydevd_plugins +| | |-- __init__.py -> must contain preamble +| | |-- extensions +| | | |-- __init__.py -> must contain preamble +| | | |-- pydevd_plugin_plugin_name.py +``` \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/__init__.py new file mode 100644 index 0000000..f77af49 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/__init__.py @@ -0,0 +1,3 @@ +import pkgutil + +__path__ = pkgutil.extend_path(__path__, __name__) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b61fcbae81157ca073a1eebb603532a4b801a891 GIT binary patch literal 354 zcmYLFu}Z{15Z&Ys42H9|kYIa-Hy8^W5yZpNPK#@n^Ew!86B{qtb#iX;yKTDYZ^$yVs>JBn# zUYP@*#Z_rC?O(3fW6HnX>+&HLjwiJ=zOXkhI_kQ!{AJ$A3|sn$Puj{g>4BDM6iqQAR;|ScQBEGOGE)K7qA&y70|H^j&3xV0-FqL{W7p6 z6g0HJr<QaK zjn`Jr3#^QFlT*g6Yc!yqag{m5v93}+6Xbo%XZdLwT=KXx=~63Kpx&J2I+K=P2&VGh z*@4q%EbavKq@T{rq_dP;gig+8{eorBQIF&qB>*LKuDRL1JDYVpZqfS?j5~Qa1_d83 zHemJ?b$v)?z%PUycO8$|nRI4~61(vdCb}T%#SZ{0p>N4O3q$im3#0R+<-y90da|#o z^sR#lWwzH&)GVs-ARM5=Th%Y3cbn%&Qc)`50ty5!qM}s9P}fa)95E5sl%f7~i_nctLltOtf z?S@(d9sLwBN6l`wH6}80C5)^ajBT*^Ghooq_I-=vOB1gq>g}o0^%b@K#p5TB7kOPh zRA!&mV=H?1vffkEdn%c_-uLEAO&^%oz9%{ty63ygo%O_#O2_9!3Q!eo**H}*PQCA} z8|OdZnsKpe3{~~vm)du=eOc|Qsa@rBUsOXt literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugin_numpy_types.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugin_numpy_types.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..581fe19fb1ef58e9b4e5cbdb236a12298e99acaf GIT binary patch literal 4603 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugins_django_form_str.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__pycache__/pydevd_plugins_django_form_str.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0171d154bfe2481eb51d32de780799bbb1ae01d7 GIT binary patch literal 1288 zcmY*Y&1)M+6rb5$?QUc%YU7yJ7=lQhmNnE%YvO|`hJtZU7J<+n6w0vDjOA7Kt1}}t zYZOSp&>nkpX(;%Z;2e_wAm{d?Gz|$uN((*Z7NVST%A1uoYUc1h=6%oa%^$T|6~XyE z{4Q;j=eFm*&_)ldkFH35nKQu> z8OShAF7tE{QpR8CoSva-dtpLJoKg}<$yL2jJ5eA6NrISlW;GC+wt>bU!|f4bsD&wN z85AF)mPrkuR&IKhs%`gzq?_)fJcjC>>Fh-&3#it|TSW?4ri6E-#tFQ(J~zyvNl_nP z$9x_m`7VBlhi2(>1$k!kV4fD0*7l&3P?oOf8C-*;s-Y15b}qvE~Q1ptljTsxlaZxp($q+TqzrrjAT*2 z8z#bM*P)mIw1lsl6jQg-P9{^6qH7`fT9&K1PLL32NP~N@^d10f|1;SzowxwxCVIYj z{&?&D#^c4!pQ_L5OUGwN^$UO2ckivP%75a)Die-+54u&47e0OgmPcGoOMGX8Rtuo zaMt%5_p8a6TU=wIKa$u6^3uc@|BWvFgEn8=Hs1Jo=QRR0K7;VwzfSeX;jQ6Q=iDRb h+%JQ_oKK%wDpiiM9UHMDAxrmACg6O|Jj| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_helpers.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_helpers.py new file mode 100644 index 0000000..3360e1f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_helpers.py @@ -0,0 +1,26 @@ +import sys + + +def find_cached_module(mod_name): + return sys.modules.get(mod_name, None) + + +def find_mod_attr(mod_name, attr): + mod = find_cached_module(mod_name) + if mod is None: + return None + return getattr(mod, attr, None) + + +def find_class_name(val): + class_name = str(val.__class__) + if class_name.find(".") != -1: + class_name = class_name.split(".")[-1] + + elif class_name.find("'") != -1: # does not have '.' (could be something like ) + class_name = class_name[class_name.index("'") + 1 :] + + if class_name.endswith("'>"): + class_name = class_name[:-2] + + return class_name diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_numpy_types.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_numpy_types.py new file mode 100644 index 0000000..57ed2b4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_numpy_types.py @@ -0,0 +1,90 @@ +from _pydevd_bundle.pydevd_extension_api import TypeResolveProvider +from _pydevd_bundle.pydevd_resolver import defaultResolver +from .pydevd_helpers import find_mod_attr +from _pydevd_bundle import pydevd_constants + +TOO_LARGE_MSG = "Maximum number of items (%s) reached. To show more items customize the value of the PYDEVD_CONTAINER_NUMPY_MAX_ITEMS environment variable." +TOO_LARGE_ATTR = "Unable to handle:" + + +class NdArrayItemsContainer(object): + pass + + +class NDArrayTypeResolveProvider(object): + """ + This resolves a numpy ndarray returning some metadata about the NDArray + """ + + def can_provide(self, type_object, type_name): + nd_array = find_mod_attr("numpy", "ndarray") + return nd_array is not None and issubclass(type_object, nd_array) + + def is_numeric(self, obj): + if not hasattr(obj, "dtype"): + return False + return obj.dtype.kind in "biufc" + + def resolve(self, obj, attribute): + if attribute == "__internals__": + return defaultResolver.get_dictionary(obj) + if attribute == "min": + if self.is_numeric(obj) and obj.size > 0: + return obj.min() + else: + return None + if attribute == "max": + if self.is_numeric(obj) and obj.size > 0: + return obj.max() + else: + return None + if attribute == "shape": + return obj.shape + if attribute == "dtype": + return obj.dtype + if attribute == "size": + return obj.size + if attribute.startswith("["): + container = NdArrayItemsContainer() + i = 0 + format_str = "%0" + str(int(len(str(len(obj))))) + "d" + for item in obj: + setattr(container, format_str % i, item) + i += 1 + if i >= pydevd_constants.PYDEVD_CONTAINER_NUMPY_MAX_ITEMS: + setattr(container, TOO_LARGE_ATTR, TOO_LARGE_MSG % (pydevd_constants.PYDEVD_CONTAINER_NUMPY_MAX_ITEMS,)) + break + return container + return None + + def get_dictionary(self, obj): + ret = dict() + ret["__internals__"] = defaultResolver.get_dictionary(obj) + if obj.size > 1024 * 1024: + ret["min"] = "ndarray too big, calculating min would slow down debugging" + ret["max"] = "ndarray too big, calculating max would slow down debugging" + elif obj.size == 0: + ret["min"] = "array is empty" + ret["max"] = "array is empty" + else: + if self.is_numeric(obj): + ret["min"] = obj.min() + ret["max"] = obj.max() + else: + ret["min"] = "not a numeric object" + ret["max"] = "not a numeric object" + ret["shape"] = obj.shape + ret["dtype"] = obj.dtype + ret["size"] = obj.size + try: + ret["[0:%s] " % (len(obj))] = list(obj[0 : pydevd_constants.PYDEVD_CONTAINER_NUMPY_MAX_ITEMS]) + except: + # This may not work depending on the array shape. + pass + return ret + + +import sys + +if not sys.platform.startswith("java"): + TypeResolveProvider.register(NDArrayTypeResolveProvider) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_pandas_types.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_pandas_types.py new file mode 100644 index 0000000..631691e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_pandas_types.py @@ -0,0 +1,178 @@ +import sys + +from _pydevd_bundle.pydevd_constants import PANDAS_MAX_ROWS, PANDAS_MAX_COLS, PANDAS_MAX_COLWIDTH +from _pydevd_bundle.pydevd_extension_api import TypeResolveProvider, StrPresentationProvider +from _pydevd_bundle.pydevd_resolver import inspect, MethodWrapperType +from _pydevd_bundle.pydevd_utils import Timer + +from .pydevd_helpers import find_mod_attr +from contextlib import contextmanager + + +def _get_dictionary(obj, replacements): + ret = dict() + cls = obj.__class__ + for attr_name in dir(obj): + # This is interesting but it actually hides too much info from the dataframe. + # attr_type_in_cls = type(getattr(cls, attr_name, None)) + # if attr_type_in_cls == property: + # ret[attr_name] = '' + # continue + + timer = Timer() + try: + replacement = replacements.get(attr_name) + if replacement is not None: + ret[attr_name] = replacement + continue + + attr_value = getattr(obj, attr_name, "") + if inspect.isroutine(attr_value) or isinstance(attr_value, MethodWrapperType): + continue + ret[attr_name] = attr_value + except Exception as e: + ret[attr_name] = "" % (e,) + finally: + timer.report_if_getting_attr_slow(cls, attr_name) + + return ret + + +@contextmanager +def customize_pandas_options(): + # The default repr depends on the settings of: + # + # pandas.set_option('display.max_columns', None) + # pandas.set_option('display.max_rows', None) + # + # which can make the repr **very** slow on some cases, so, we customize pandas to have + # smaller values if the current values are too big. + custom_options = [] + + from pandas import get_option + + max_rows = get_option("display.max_rows") + max_cols = get_option("display.max_columns") + max_colwidth = get_option("display.max_colwidth") + + if max_rows is None or max_rows > PANDAS_MAX_ROWS: + custom_options.append("display.max_rows") + custom_options.append(PANDAS_MAX_ROWS) + + if max_cols is None or max_cols > PANDAS_MAX_COLS: + custom_options.append("display.max_columns") + custom_options.append(PANDAS_MAX_COLS) + + if max_colwidth is None or max_colwidth > PANDAS_MAX_COLWIDTH: + custom_options.append("display.max_colwidth") + custom_options.append(PANDAS_MAX_COLWIDTH) + + if custom_options: + from pandas import option_context + + with option_context(*custom_options): + yield + else: + yield + + +class PandasDataFrameTypeResolveProvider(object): + def can_provide(self, type_object, type_name): + data_frame_class = find_mod_attr("pandas.core.frame", "DataFrame") + return data_frame_class is not None and issubclass(type_object, data_frame_class) + + def resolve(self, obj, attribute): + return getattr(obj, attribute) + + def get_dictionary(self, obj): + replacements = { + # This actually calls: DataFrame.transpose(), which can be expensive, so, + # let's just add some string representation for it. + "T": "", + # This creates a whole new dict{index: Series) for each column. Doing a + # subsequent repr() from this dict can be very slow, so, don't return it. + "_series": "", + "style": "", + } + return _get_dictionary(obj, replacements) + + def get_str_in_context(self, df, context: str): + """ + :param context: + This is the context in which the variable is being requested. Valid values: + "watch", + "repl", + "hover", + "clipboard" + """ + if context in ("repl", "clipboard"): + return repr(df) + return self.get_str(df) + + def get_str(self, df): + with customize_pandas_options(): + return repr(df) + + +class PandasSeriesTypeResolveProvider(object): + def can_provide(self, type_object, type_name): + series_class = find_mod_attr("pandas.core.series", "Series") + return series_class is not None and issubclass(type_object, series_class) + + def resolve(self, obj, attribute): + return getattr(obj, attribute) + + def get_dictionary(self, obj): + replacements = { + # This actually calls: DataFrame.transpose(), which can be expensive, so, + # let's just add some string representation for it. + "T": "", + # This creates a whole new dict{index: Series) for each column. Doing a + # subsequent repr() from this dict can be very slow, so, don't return it. + "_series": "", + "style": "", + } + return _get_dictionary(obj, replacements) + + def get_str_in_context(self, df, context: str): + """ + :param context: + This is the context in which the variable is being requested. Valid values: + "watch", + "repl", + "hover", + "clipboard" + """ + if context in ("repl", "clipboard"): + return repr(df) + return self.get_str(df) + + def get_str(self, series): + with customize_pandas_options(): + return repr(series) + + +class PandasStylerTypeResolveProvider(object): + def can_provide(self, type_object, type_name): + series_class = find_mod_attr("pandas.io.formats.style", "Styler") + return series_class is not None and issubclass(type_object, series_class) + + def resolve(self, obj, attribute): + return getattr(obj, attribute) + + def get_dictionary(self, obj): + replacements = { + "data": "", + "__dict__": "", + } + return _get_dictionary(obj, replacements) + + +if not sys.platform.startswith("java"): + TypeResolveProvider.register(PandasDataFrameTypeResolveProvider) + StrPresentationProvider.register(PandasDataFrameTypeResolveProvider) + + TypeResolveProvider.register(PandasSeriesTypeResolveProvider) + StrPresentationProvider.register(PandasSeriesTypeResolveProvider) + + TypeResolveProvider.register(PandasStylerTypeResolveProvider) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugins_django_form_str.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugins_django_form_str.py new file mode 100644 index 0000000..1d6d073 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugins_django_form_str.py @@ -0,0 +1,17 @@ +from _pydevd_bundle.pydevd_extension_api import StrPresentationProvider +from .pydevd_helpers import find_mod_attr, find_class_name + + +class DjangoFormStr(object): + def can_provide(self, type_object, type_name): + form_class = find_mod_attr("django.forms", "Form") + return form_class is not None and issubclass(type_object, form_class) + + def get_str(self, val): + return "%s: %r" % (find_class_name(val), val) + + +import sys + +if not sys.platform.startswith("java"): + StrPresentationProvider.register(DjangoFormStr) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/jinja2_debug.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/jinja2_debug.py new file mode 100644 index 0000000..5d4bb58 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/jinja2_debug.py @@ -0,0 +1,528 @@ +from _pydevd_bundle.pydevd_constants import STATE_SUSPEND, JINJA2_SUSPEND +from _pydevd_bundle.pydevd_comm import CMD_SET_BREAK, CMD_ADD_EXCEPTION_BREAK +from pydevd_file_utils import canonical_normalized_path +from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame, FCode +from _pydev_bundle import pydev_log +from pydevd_plugins.pydevd_line_validation import LineBreakpointWithLazyValidation, ValidationInfo +from _pydev_bundle.pydev_override import overrides +from _pydevd_bundle.pydevd_api import PyDevdAPI + + +class Jinja2LineBreakpoint(LineBreakpointWithLazyValidation): + def __init__( + self, canonical_normalized_filename, breakpoint_id, line, condition, func_name, expression, hit_condition=None, is_logpoint=False + ): + self.canonical_normalized_filename = canonical_normalized_filename + LineBreakpointWithLazyValidation.__init__( + self, breakpoint_id, line, condition, func_name, expression, hit_condition=hit_condition, is_logpoint=is_logpoint + ) + + def __str__(self): + return "Jinja2LineBreakpoint: %s-%d" % (self.canonical_normalized_filename, self.line) + + +class _Jinja2ValidationInfo(ValidationInfo): + @overrides(ValidationInfo._collect_valid_lines_in_template_uncached) + def _collect_valid_lines_in_template_uncached(self, template): + lineno_mapping = _get_frame_lineno_mapping(template) + if not lineno_mapping: + return set() + + return set(x[0] for x in lineno_mapping) + + +def add_line_breakpoint( + pydb, + type, + canonical_normalized_filename, + breakpoint_id, + line, + condition, + expression, + func_name, + hit_condition=None, + is_logpoint=False, + add_breakpoint_result=None, + on_changed_breakpoint_state=None, +): + if type == "jinja2-line": + jinja2_line_breakpoint = Jinja2LineBreakpoint( + canonical_normalized_filename, + breakpoint_id, + line, + condition, + func_name, + expression, + hit_condition=hit_condition, + is_logpoint=is_logpoint, + ) + if not hasattr(pydb, "jinja2_breakpoints"): + _init_plugin_breaks(pydb) + + add_breakpoint_result.error_code = PyDevdAPI.ADD_BREAKPOINT_LAZY_VALIDATION + jinja2_line_breakpoint.add_breakpoint_result = add_breakpoint_result + jinja2_line_breakpoint.on_changed_breakpoint_state = on_changed_breakpoint_state + + return jinja2_line_breakpoint, pydb.jinja2_breakpoints + return None + + +def after_breakpoints_consolidated(py_db, canonical_normalized_filename, id_to_pybreakpoint, file_to_line_to_breakpoints): + jinja2_breakpoints_for_file = file_to_line_to_breakpoints.get(canonical_normalized_filename) + if not jinja2_breakpoints_for_file: + return + + if not hasattr(py_db, "jinja2_validation_info"): + _init_plugin_breaks(py_db) + + # In general we validate the breakpoints only when the template is loaded, but if the template + # was already loaded, we can validate the breakpoints based on the last loaded value. + py_db.jinja2_validation_info.verify_breakpoints_from_template_cached_lines( + py_db, canonical_normalized_filename, jinja2_breakpoints_for_file + ) + + +def add_exception_breakpoint(pydb, type, exception): + if type == "jinja2": + if not hasattr(pydb, "jinja2_exception_break"): + _init_plugin_breaks(pydb) + pydb.jinja2_exception_break[exception] = True + return True + return False + + +def _init_plugin_breaks(pydb): + pydb.jinja2_exception_break = {} + pydb.jinja2_breakpoints = {} + + pydb.jinja2_validation_info = _Jinja2ValidationInfo() + + +def remove_all_exception_breakpoints(pydb): + if hasattr(pydb, "jinja2_exception_break"): + pydb.jinja2_exception_break = {} + return True + return False + + +def remove_exception_breakpoint(pydb, exception_type, exception): + if exception_type == "jinja2": + try: + del pydb.jinja2_exception_break[exception] + return True + except KeyError: + pass + return False + + +def get_breakpoints(pydb, breakpoint_type): + if breakpoint_type == "jinja2-line": + return pydb.jinja2_breakpoints + return None + + +def _is_jinja2_render_call(frame): + try: + name = frame.f_code.co_name + if "__jinja_template__" in frame.f_globals and name in ("root", "loop", "macro") or name.startswith("block_"): + return True + return False + except: + pydev_log.exception() + return False + + +def _suspend_jinja2(pydb, thread, frame, cmd=CMD_SET_BREAK, message=None): + frame = Jinja2TemplateFrame(frame) + + if frame.f_lineno is None: + return None + + pydb.set_suspend(thread, cmd) + + thread.additional_info.suspend_type = JINJA2_SUSPEND + if cmd == CMD_ADD_EXCEPTION_BREAK: + # send exception name as message + if message: + message = str(message) + thread.additional_info.pydev_message = message + + return frame + + +def _is_jinja2_suspended(thread): + return thread.additional_info.suspend_type == JINJA2_SUSPEND + + +def _is_jinja2_context_call(frame): + return "_Context__obj" in frame.f_locals + + +def _is_jinja2_internal_function(frame): + return "self" in frame.f_locals and frame.f_locals["self"].__class__.__name__ in ( + "LoopContext", + "TemplateReference", + "Macro", + "BlockReference", + ) + + +def _find_jinja2_render_frame(frame): + while frame is not None and not _is_jinja2_render_call(frame): + frame = frame.f_back + + return frame + + +# ======================================================================================================================= +# Jinja2 Frame +# ======================================================================================================================= + + +class Jinja2TemplateFrame(object): + IS_PLUGIN_FRAME = True + + def __init__(self, frame, original_filename=None, template_lineno=None): + if original_filename is None: + original_filename = _get_jinja2_template_original_filename(frame) + + if template_lineno is None: + template_lineno = _get_jinja2_template_line(frame) + + self.back_context = None + if "context" in frame.f_locals: + # sometimes we don't have 'context', e.g. in macros + self.back_context = frame.f_locals["context"] + self.f_code = FCode("template", original_filename) + self.f_lineno = template_lineno + self.f_back = frame + self.f_globals = {} + self.f_locals = self.collect_context(frame) + self.f_trace = None + + def _get_real_var_name(self, orig_name): + # replace leading number for local variables + parts = orig_name.split("_") + if len(parts) > 1 and parts[0].isdigit(): + return parts[1] + return orig_name + + def collect_context(self, frame): + res = {} + for k, v in frame.f_locals.items(): + if not k.startswith("l_"): + res[k] = v + elif v and not _is_missing(v): + res[self._get_real_var_name(k[2:])] = v + if self.back_context is not None: + for k, v in self.back_context.items(): + res[k] = v + return res + + def _change_variable(self, frame, name, value): + in_vars_or_parents = False + if "context" in frame.f_locals: + if name in frame.f_locals["context"].parent: + self.back_context.parent[name] = value + in_vars_or_parents = True + if name in frame.f_locals["context"].vars: + self.back_context.vars[name] = value + in_vars_or_parents = True + + l_name = "l_" + name + if l_name in frame.f_locals: + if in_vars_or_parents: + frame.f_locals[l_name] = self.back_context.resolve(name) + else: + frame.f_locals[l_name] = value + + +class Jinja2TemplateSyntaxErrorFrame(object): + IS_PLUGIN_FRAME = True + + def __init__(self, frame, exception_cls_name, filename, lineno, f_locals): + self.f_code = FCode("Jinja2 %s" % (exception_cls_name,), filename) + self.f_lineno = lineno + self.f_back = frame + self.f_globals = {} + self.f_locals = f_locals + self.f_trace = None + + +def change_variable(frame, attr, expression, default): + if isinstance(frame, Jinja2TemplateFrame): + result = eval(expression, frame.f_globals, frame.f_locals) + frame._change_variable(frame.f_back, attr, result) + return result + return default + + +def _is_missing(item): + if item.__class__.__name__ == "MissingType": + return True + return False + + +def _find_render_function_frame(frame): + # in order to hide internal rendering functions + old_frame = frame + try: + while not ( + "self" in frame.f_locals and frame.f_locals["self"].__class__.__name__ == "Template" and frame.f_code.co_name == "render" + ): + frame = frame.f_back + if frame is None: + return old_frame + return frame + except: + return old_frame + + +def _get_jinja2_template_debug_info(frame): + frame_globals = frame.f_globals + + jinja_template = frame_globals.get("__jinja_template__") + + if jinja_template is None: + return None + + return _get_frame_lineno_mapping(jinja_template) + + +def _get_frame_lineno_mapping(jinja_template): + """ + :rtype: list(tuple(int,int)) + :return: list((original_line, line_in_frame)) + """ + # _debug_info is a string with the mapping from frame line to actual line + # i.e.: "5=13&8=14" + _debug_info = jinja_template._debug_info + if not _debug_info: + # Sometimes template contains only plain text. + return None + + # debug_info is a list with the mapping from frame line to actual line + # i.e.: [(5, 13), (8, 14)] + return jinja_template.debug_info + + +def _get_jinja2_template_line(frame): + debug_info = _get_jinja2_template_debug_info(frame) + if debug_info is None: + return None + + lineno = frame.f_lineno + + for pair in debug_info: + if pair[1] == lineno: + return pair[0] + + return None + + +def _convert_to_str(s): + return s + + +def _get_jinja2_template_original_filename(frame): + if "__jinja_template__" in frame.f_globals: + return _convert_to_str(frame.f_globals["__jinja_template__"].filename) + + return None + + +# ======================================================================================================================= +# Jinja2 Step Commands +# ======================================================================================================================= + + +def has_exception_breaks(py_db): + if len(py_db.jinja2_exception_break) > 0: + return True + return False + + +def has_line_breaks(py_db): + for _canonical_normalized_filename, breakpoints in py_db.jinja2_breakpoints.items(): + if len(breakpoints) > 0: + return True + return False + + +def can_skip(pydb, frame): + if pydb.jinja2_breakpoints and _is_jinja2_render_call(frame): + filename = _get_jinja2_template_original_filename(frame) + if filename is not None: + canonical_normalized_filename = canonical_normalized_path(filename) + jinja2_breakpoints_for_file = pydb.jinja2_breakpoints.get(canonical_normalized_filename) + if jinja2_breakpoints_for_file: + return False + + if pydb.jinja2_exception_break: + name = frame.f_code.co_name + + # errors in compile time + if name in ("template", "top-level template code", "") or name.startswith("block "): + f_back = frame.f_back + module_name = "" + if f_back is not None: + module_name = f_back.f_globals.get("__name__", "") + if module_name.startswith("jinja2."): + return False + + return True + + +is_tracked_frame = _is_jinja2_render_call + + +def required_events_breakpoint(): + return ("line",) + + +def required_events_stepping(): + return ("call", "line", "return") + + +def cmd_step_into(pydb, frame, event, info, thread, stop_info, stop): + plugin_stop = False + if _is_jinja2_suspended(thread): + plugin_stop = stop_info["jinja2_stop"] = event in ("call", "line") and _is_jinja2_render_call(frame) + stop = False + if info.pydev_call_from_jinja2 is not None: + if _is_jinja2_internal_function(frame): + # if internal Jinja2 function was called, we should continue debugging inside template + info.pydev_call_from_jinja2 = None + else: + # we go into python code from Jinja2 rendering frame + stop = True + + if event == "call" and _is_jinja2_context_call(frame.f_back): + # we called function from context, the next step will be in function + info.pydev_call_from_jinja2 = 1 + + if event == "return" and _is_jinja2_context_call(frame.f_back): + # we return from python code to Jinja2 rendering frame + info.pydev_step_stop = info.pydev_call_from_jinja2 + info.pydev_call_from_jinja2 = None + thread.additional_info.suspend_type = JINJA2_SUSPEND + stop = False + + # print "info.pydev_call_from_jinja2", info.pydev_call_from_jinja2, "stop_info", stop_info, \ + # "thread.additional_info.suspend_type", thread.additional_info.suspend_type + # print "event", event, "farme.locals", frame.f_locals + return stop, plugin_stop + + +def cmd_step_over(pydb, frame, event, info, thread, stop_info, stop): + plugin_stop = False + if _is_jinja2_suspended(thread): + stop = False + + if info.pydev_call_inside_jinja2 is None: + if _is_jinja2_render_call(frame): + if event == "call": + info.pydev_call_inside_jinja2 = frame.f_back + if event in ("line", "return"): + info.pydev_call_inside_jinja2 = frame + else: + if event == "line": + if _is_jinja2_render_call(frame) and info.pydev_call_inside_jinja2 is frame: + plugin_stop = stop_info["jinja2_stop"] = True + if event == "return": + if frame is info.pydev_call_inside_jinja2 and "event" not in frame.f_back.f_locals: + info.pydev_call_inside_jinja2 = _find_jinja2_render_frame(frame.f_back) + return stop, plugin_stop + else: + if event == "return" and _is_jinja2_context_call(frame.f_back): + # we return from python code to Jinja2 rendering frame + info.pydev_call_from_jinja2 = None + info.pydev_call_inside_jinja2 = _find_jinja2_render_frame(frame) + thread.additional_info.suspend_type = JINJA2_SUSPEND + stop = False + return stop, plugin_stop + # print "info.pydev_call_from_jinja2", info.pydev_call_from_jinja2, "stop", stop, "jinja_stop", jinja2_stop, \ + # "thread.additional_info.suspend_type", thread.additional_info.suspend_type + # print "event", event, "info.pydev_call_inside_jinja2", info.pydev_call_inside_jinja2 + # print "frame", frame, "frame.f_back", frame.f_back, "step_stop", info.pydev_step_stop + # print "is_context_call", _is_jinja2_context_call(frame) + # print "render", _is_jinja2_render_call(frame) + # print "-------------" + return stop, plugin_stop + + +def stop(pydb, frame, event, thread, stop_info, arg, step_cmd): + if "jinja2_stop" in stop_info and stop_info["jinja2_stop"]: + frame = _suspend_jinja2(pydb, thread, frame, step_cmd) + if frame: + pydb.do_wait_suspend(thread, frame, event, arg) + return True + return False + + +def get_breakpoint(py_db, frame, event, info): + break_type = "jinja2" + + if event == "line" and info.pydev_state != STATE_SUSPEND and py_db.jinja2_breakpoints and _is_jinja2_render_call(frame): + jinja_template = frame.f_globals.get("__jinja_template__") + if jinja_template is None: + return None + + original_filename = _get_jinja2_template_original_filename(frame) + if original_filename is not None: + pydev_log.debug("Jinja2 is rendering a template: %s", original_filename) + canonical_normalized_filename = canonical_normalized_path(original_filename) + jinja2_breakpoints_for_file = py_db.jinja2_breakpoints.get(canonical_normalized_filename) + + if jinja2_breakpoints_for_file: + jinja2_validation_info = py_db.jinja2_validation_info + jinja2_validation_info.verify_breakpoints(py_db, canonical_normalized_filename, jinja2_breakpoints_for_file, jinja_template) + + template_lineno = _get_jinja2_template_line(frame) + if template_lineno is not None: + jinja2_breakpoint = jinja2_breakpoints_for_file.get(template_lineno) + if jinja2_breakpoint is not None: + new_frame = Jinja2TemplateFrame(frame, original_filename, template_lineno) + return jinja2_breakpoint, new_frame, break_type + + return None + + +def suspend(pydb, thread, frame, bp_type): + if bp_type == "jinja2": + return _suspend_jinja2(pydb, thread, frame) + return None + + +def exception_break(pydb, frame, thread, arg, is_unwind): + exception, value, trace = arg + if pydb.jinja2_exception_break and exception is not None: + exception_type = list(pydb.jinja2_exception_break.keys())[0] + if exception.__name__ in ("UndefinedError", "TemplateNotFound", "TemplatesNotFound"): + # errors in rendering + render_frame = _find_jinja2_render_frame(frame) + if render_frame: + suspend_frame = _suspend_jinja2(pydb, thread, render_frame, CMD_ADD_EXCEPTION_BREAK, message=exception_type) + if suspend_frame: + add_exception_to_frame(suspend_frame, (exception, value, trace)) + suspend_frame.f_back = frame + frame = suspend_frame + return True, frame + + elif exception.__name__ in ("TemplateSyntaxError", "TemplateAssertionError"): + name = frame.f_code.co_name + + # errors in compile time + if name in ("template", "top-level template code", "") or name.startswith("block "): + f_back = frame.f_back + if f_back is not None: + module_name = f_back.f_globals.get("__name__", "") + + if module_name.startswith("jinja2."): + # Jinja2 translates exception info and creates fake frame on his own + pydb.set_suspend(thread, CMD_ADD_EXCEPTION_BREAK) + add_exception_to_frame(frame, (exception, value, trace)) + thread.additional_info.suspend_type = JINJA2_SUSPEND + thread.additional_info.pydev_message = str(exception_type) + return True, frame + return None diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/pydevd_line_validation.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/pydevd_line_validation.py new file mode 100644 index 0000000..e32aea6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_plugins/pydevd_line_validation.py @@ -0,0 +1,120 @@ +from _pydevd_bundle.pydevd_breakpoints import LineBreakpoint +from _pydevd_bundle.pydevd_api import PyDevdAPI +import bisect +from _pydev_bundle import pydev_log + + +class LineBreakpointWithLazyValidation(LineBreakpoint): + def __init__(self, *args, **kwargs): + LineBreakpoint.__init__(self, *args, **kwargs) + # This is the _AddBreakpointResult that'll be modified (and then re-sent on the + # on_changed_breakpoint_state). + self.add_breakpoint_result = None + + # The signature for the callback should be: + # on_changed_breakpoint_state(breakpoint_id: int, add_breakpoint_result: _AddBreakpointResult) + self.on_changed_breakpoint_state = None + + # When its state is checked (in which case it'd call on_changed_breakpoint_state if the + # state changed), we store a cache key in 'verified_cache_key' -- in case it changes + # we'd need to re-verify it (for instance, the template could have changed on disk). + self.verified_cache_key = None + + +class ValidationInfo(object): + def __init__(self): + self._canonical_normalized_filename_to_last_template_lines = {} + + def _collect_valid_lines_in_template(self, template): + # We cache the lines in the template itself. Note that among requests the + # template may be a different instance (because the template contents could be + # changed on disk), but this may still be called multiple times during the + # same render session, so, caching is interesting. + lines_cache = getattr(template, "__pydevd_lines_cache__", None) + if lines_cache is not None: + lines, sorted_lines = lines_cache + return lines, sorted_lines + + lines = self._collect_valid_lines_in_template_uncached(template) + + lines = frozenset(lines) + sorted_lines = tuple(sorted(lines)) + template.__pydevd_lines_cache__ = lines, sorted_lines + return lines, sorted_lines + + def _collect_valid_lines_in_template_uncached(self, template): + raise NotImplementedError() + + def verify_breakpoints(self, py_db, canonical_normalized_filename, template_breakpoints_for_file, template): + """ + This function should be called whenever a rendering is detected. + + :param str canonical_normalized_filename: + :param dict[int:LineBreakpointWithLazyValidation] template_breakpoints_for_file: + """ + valid_lines_frozenset, sorted_lines = self._collect_valid_lines_in_template(template) + + self._canonical_normalized_filename_to_last_template_lines[canonical_normalized_filename] = valid_lines_frozenset, sorted_lines + self._verify_breakpoints_with_lines_collected( + py_db, canonical_normalized_filename, template_breakpoints_for_file, valid_lines_frozenset, sorted_lines + ) + + def verify_breakpoints_from_template_cached_lines(self, py_db, canonical_normalized_filename, template_breakpoints_for_file): + """ + This is used when the lines are already available (if just the template is available, + `verify_breakpoints` should be used instead). + """ + cached = self._canonical_normalized_filename_to_last_template_lines.get(canonical_normalized_filename) + if cached is not None: + valid_lines_frozenset, sorted_lines = cached + self._verify_breakpoints_with_lines_collected( + py_db, canonical_normalized_filename, template_breakpoints_for_file, valid_lines_frozenset, sorted_lines + ) + + def _verify_breakpoints_with_lines_collected( + self, py_db, canonical_normalized_filename, template_breakpoints_for_file, valid_lines_frozenset, sorted_lines + ): + for line, template_bp in list(template_breakpoints_for_file.items()): # Note: iterate in a copy (we may mutate it). + if template_bp.verified_cache_key != valid_lines_frozenset: + template_bp.verified_cache_key = valid_lines_frozenset + valid = line in valid_lines_frozenset + + if not valid: + new_line = -1 + if sorted_lines: + # Adjust to the first preceding valid line. + idx = bisect.bisect_left(sorted_lines, line) + if idx > 0: + new_line = sorted_lines[idx - 1] + + if new_line >= 0 and new_line not in template_breakpoints_for_file: + # We just add it if found and if there's no existing breakpoint at that + # location. + if ( + template_bp.add_breakpoint_result.error_code != PyDevdAPI.ADD_BREAKPOINT_NO_ERROR + and template_bp.add_breakpoint_result.translated_line != new_line + ): + pydev_log.debug( + "Template breakpoint in %s in line: %s moved to line: %s", canonical_normalized_filename, line, new_line + ) + template_bp.add_breakpoint_result.error_code = PyDevdAPI.ADD_BREAKPOINT_NO_ERROR + template_bp.add_breakpoint_result.translated_line = new_line + + # Add it to a new line. + template_breakpoints_for_file.pop(line, None) + template_breakpoints_for_file[new_line] = template_bp + template_bp.on_changed_breakpoint_state(template_bp.breakpoint_id, template_bp.add_breakpoint_result) + else: + if template_bp.add_breakpoint_result.error_code != PyDevdAPI.ADD_BREAKPOINT_INVALID_LINE: + pydev_log.debug( + "Template breakpoint in %s in line: %s invalid (valid lines: %s)", + canonical_normalized_filename, + line, + valid_lines_frozenset, + ) + template_bp.add_breakpoint_result.error_code = PyDevdAPI.ADD_BREAKPOINT_INVALID_LINE + template_bp.on_changed_breakpoint_state(template_bp.breakpoint_id, template_bp.add_breakpoint_result) + else: + if template_bp.add_breakpoint_result.error_code != PyDevdAPI.ADD_BREAKPOINT_NO_ERROR: + template_bp.add_breakpoint_result.error_code = PyDevdAPI.ADD_BREAKPOINT_NO_ERROR + template_bp.on_changed_breakpoint_state(template_bp.breakpoint_id, template_bp.add_breakpoint_result) diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_tracing.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_tracing.py new file mode 100644 index 0000000..dca75d3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_tracing.py @@ -0,0 +1,407 @@ +from _pydevd_bundle.pydevd_constants import ( + get_frame, + IS_CPYTHON, + IS_64BIT_PROCESS, + IS_WINDOWS, + IS_LINUX, + IS_MAC, + DebugInfoHolder, + LOAD_NATIVE_LIB_FLAG, + ENV_FALSE_LOWER_VALUES, + ForkSafeLock, + PYDEVD_USE_SYS_MONITORING, +) +from _pydev_bundle._pydev_saved_modules import thread, threading +from _pydev_bundle import pydev_log, pydev_monkey +import os.path +import platform +import ctypes +from io import StringIO +import sys +import traceback + +_original_settrace = sys.settrace + + +class TracingFunctionHolder: + """This class exists just to keep some variables (so that we don't keep them in the global namespace).""" + + _original_tracing = None + _warn = True + _traceback_limit = 1 + _warnings_shown = {} + + +def get_exception_traceback_str(): + exc_info = sys.exc_info() + s = StringIO() + traceback.print_exception(exc_info[0], exc_info[1], exc_info[2], file=s) + return s.getvalue() + + +def _get_stack_str(frame): + msg = ( + "\nIf this is needed, please check: " + + "\nhttp://pydev.blogspot.com/2007/06/why-cant-pydev-debugger-work-with.html" + + "\nto see how to restore the debug tracing back correctly.\n" + ) + + if TracingFunctionHolder._traceback_limit: + s = StringIO() + s.write("Call Location:\n") + traceback.print_stack(f=frame, limit=TracingFunctionHolder._traceback_limit, file=s) + msg = msg + s.getvalue() + + return msg + + +def _internal_set_trace(tracing_func): + if PYDEVD_USE_SYS_MONITORING: + raise RuntimeError("pydevd: Using sys.monitoring, sys.settrace should not be called.") + if TracingFunctionHolder._warn: + frame = get_frame() + if frame is not None and frame.f_back is not None: + filename = os.path.splitext(frame.f_back.f_code.co_filename.lower())[0] + if filename.endswith("threadpool") and "gevent" in filename: + if tracing_func is None: + pydev_log.debug("Disabled internal sys.settrace from gevent threadpool.") + return + + elif not filename.endswith( + ( + "threading", + "pydevd_tracing", + ) + ): + message = ( + "\nPYDEV DEBUGGER WARNING:" + + "\nsys.settrace() should not be used when the debugger is being used." + + "\nThis may cause the debugger to stop working correctly." + + "%s" % _get_stack_str(frame.f_back) + ) + + if message not in TracingFunctionHolder._warnings_shown: + # only warn about each message once... + TracingFunctionHolder._warnings_shown[message] = 1 + sys.stderr.write("%s\n" % (message,)) + sys.stderr.flush() + + if TracingFunctionHolder._original_tracing: + TracingFunctionHolder._original_tracing(tracing_func) + + +_last_tracing_func_thread_local = threading.local() + + +def SetTrace(tracing_func): + if PYDEVD_USE_SYS_MONITORING: + raise RuntimeError("SetTrace should not be used when using sys.monitoring.") + _last_tracing_func_thread_local.tracing_func = tracing_func + + if tracing_func is not None: + if set_trace_to_threads(tracing_func, thread_idents=[thread.get_ident()], create_dummy_thread=False) == 0: + # If we can use our own tracer instead of the one from sys.settrace, do it (the reason + # is that this is faster than the Python version because we don't call + # PyFrame_FastToLocalsWithError and PyFrame_LocalsToFast at each event! + # (the difference can be huge when checking line events on frames as the + # time increases based on the number of local variables in the scope) + # See: InternalCallTrampoline (on the C side) for details. + return + + # If it didn't work (or if it was None), use the Python version. + set_trace = TracingFunctionHolder._original_tracing or sys.settrace + set_trace(tracing_func) + + +def reapply_settrace(): + try: + tracing_func = _last_tracing_func_thread_local.tracing_func + except AttributeError: + return + else: + SetTrace(tracing_func) + + +def replace_sys_set_trace_func(): + if PYDEVD_USE_SYS_MONITORING: + return + if TracingFunctionHolder._original_tracing is None: + TracingFunctionHolder._original_tracing = sys.settrace + sys.settrace = _internal_set_trace + + +def restore_sys_set_trace_func(): + if PYDEVD_USE_SYS_MONITORING: + return + if TracingFunctionHolder._original_tracing is not None: + sys.settrace = TracingFunctionHolder._original_tracing + TracingFunctionHolder._original_tracing = None + + +_lock = ForkSafeLock() + + +def _load_python_helper_lib(): + try: + # If it's already loaded, just return it. + return _load_python_helper_lib.__lib__ + except AttributeError: + pass + with _lock: + try: + return _load_python_helper_lib.__lib__ + except AttributeError: + pass + + lib = _load_python_helper_lib_uncached() + _load_python_helper_lib.__lib__ = lib + return lib + + +def get_python_helper_lib_filename(): + # Note: we have an independent (and similar -- but not equal) version of this method in + # `add_code_to_python_process.py` which should be kept synchronized with this one (we do a copy + # because the `pydevd_attach_to_process` is mostly independent and shouldn't be imported in the + # debugger -- the only situation where it's imported is if the user actually does an attach to + # process, through `attach_pydevd.py`, but this should usually be called from the IDE directly + # and not from the debugger). + libdir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "pydevd_attach_to_process") + + if not os.path.exists(libdir): + pydev_log.critical("Expected the directory: %s to exist!", libdir) + + arch = "" + if IS_WINDOWS: + # prefer not using platform.machine() when possible (it's a bit heavyweight as it may + # spawn a subprocess). + arch = os.environ.get("PROCESSOR_ARCHITEW6432", os.environ.get("PROCESSOR_ARCHITECTURE", "")) + + if not arch: + arch = platform.machine() + if not arch: + pydev_log.info("platform.machine() did not return valid value.") # This shouldn't happen... + return None + + if IS_WINDOWS: + extension = ".dll" + suffix_64 = "amd64" + suffix_32 = "x86" + + elif IS_LINUX: + extension = ".so" + suffix_64 = "amd64" + suffix_32 = "x86" + + elif IS_MAC: + extension = ".dylib" + suffix_64 = "x86_64" + suffix_32 = "x86" + + else: + pydev_log.info("Unable to set trace to all threads in platform: %s", sys.platform) + return None + + if arch.lower() not in ("amd64", "x86", "x86_64", "i386", "x86"): + # We don't support this processor by default. Still, let's support the case where the + # user manually compiled it himself with some heuristics. + # + # Ideally the user would provide a library in the format: "attach_." + # based on the way it's currently compiled -- see: + # - windows/compile_windows.bat + # - linux_and_mac/compile_linux.sh + # - linux_and_mac/compile_mac.sh + + try: + found = [name for name in os.listdir(libdir) if name.startswith("attach_") and name.endswith(extension)] + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + # There is no need to show this unless debug tracing is enabled. + pydev_log.exception("Error listing dir: %s", libdir) + return None + + expected_name = "attach_" + arch + extension + expected_name_linux = "attach_linux_" + arch + extension + + filename = None + if expected_name in found: # Heuristic: user compiled with "attach_." + filename = os.path.join(libdir, expected_name) + + elif IS_LINUX and expected_name_linux in found: # Heuristic: user compiled with "attach_linux_." + filename = os.path.join(libdir, expected_name_linux) + + elif len(found) == 1: # Heuristic: user removed all libraries and just left his own lib. + filename = os.path.join(libdir, found[0]) + + else: # Heuristic: there's one additional library which doesn't seem to be our own. Find the odd one. + filtered = [name for name in found if not name.endswith((suffix_64 + extension, suffix_32 + extension))] + if len(filtered) == 1: # If more than one is available we can't be sure... + filename = os.path.join(libdir, found[0]) + + if filename is None: + pydev_log.info("Unable to set trace to all threads in arch: %s (did not find a %s lib in %s).", arch, expected_name, libdir) + return None + + pydev_log.info("Using %s lib in arch: %s.", filename, arch) + + else: + # Happy path for which we have pre-compiled binaries. + if IS_64BIT_PROCESS: + suffix = suffix_64 + else: + suffix = suffix_32 + + if IS_WINDOWS or IS_MAC: # just the extension changes + prefix = "attach_" + elif IS_LINUX: # + prefix = "attach_linux_" # historically it has a different name + else: + pydev_log.info("Unable to set trace to all threads in platform: %s", sys.platform) + return None + + filename = os.path.join(libdir, "%s%s%s" % (prefix, suffix, extension)) + + if not os.path.exists(filename): + pydev_log.critical("Expected: %s to exist.", filename) + return None + + return filename + + +def _load_python_helper_lib_uncached(): + if ( + not IS_CPYTHON + or sys.version_info[:2] > (3, 11) + or hasattr(sys, "gettotalrefcount") + or LOAD_NATIVE_LIB_FLAG in ENV_FALSE_LOWER_VALUES + ): + pydev_log.info("Helper lib to set tracing to all threads not loaded.") + return None + + try: + filename = get_python_helper_lib_filename() + if filename is None: + return None + # Load as pydll so that we don't release the gil. + lib = ctypes.pydll.LoadLibrary(filename) + pydev_log.info("Successfully Loaded helper lib to set tracing to all threads.") + return lib + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + # Only show message if tracing is on (we don't have pre-compiled + # binaries for all architectures -- i.e.: ARM). + pydev_log.exception("Error loading: %s", filename) + return None + + +def set_trace_to_threads(tracing_func, thread_idents=None, create_dummy_thread=True): + if PYDEVD_USE_SYS_MONITORING: + raise RuntimeError("Should not be called when using sys.monitoring.") + assert tracing_func is not None + + ret = 0 + + # Note: use sys._current_frames() keys to get the thread ids because it'll return + # thread ids created in C/C++ where there's user code running, unlike the APIs + # from the threading module which see only threads created through it (unless + # a call for threading.current_thread() was previously done in that thread, + # in which case a dummy thread would've been created for it). + if thread_idents is None: + thread_idents = set(sys._current_frames().keys()) + + for t in threading.enumerate(): + # PY-44778: ignore pydevd threads and also add any thread that wasn't found on + # sys._current_frames() as some existing threads may not appear in + # sys._current_frames() but may be available through the `threading` module. + if getattr(t, "pydev_do_not_trace", False): + thread_idents.discard(t.ident) + else: + thread_idents.add(t.ident) + + curr_ident = thread.get_ident() + curr_thread = threading._active.get(curr_ident) + + if curr_ident in thread_idents and len(thread_idents) != 1: + # The current thread must be updated first (because we need to set + # the reference to `curr_thread`). + thread_idents = list(thread_idents) + thread_idents.remove(curr_ident) + thread_idents.insert(0, curr_ident) + + for thread_ident in thread_idents: + # If that thread is not available in the threading module we also need to create a + # dummy thread for it (otherwise it'll be invisible to the debugger). + if create_dummy_thread: + if thread_ident not in threading._active: + + class _DummyThread(threading._DummyThread): + def _set_ident(self): + # Note: Hack to set the thread ident that we want. + self._ident = thread_ident + + t = _DummyThread() + # Reset to the base class (don't expose our own version of the class). + t.__class__ = threading._DummyThread + + if thread_ident == curr_ident: + curr_thread = t + + with threading._active_limbo_lock: + # On Py2 it'll put in active getting the current indent, not using the + # ident that was set, so, we have to update it (should be harmless on Py3 + # so, do it always). + threading._active[thread_ident] = t + threading._active[curr_ident] = curr_thread + + if t.ident != thread_ident: + # Check if it actually worked. + pydev_log.critical("pydevd: creation of _DummyThread with fixed thread ident did not succeed.") + + # Some (ptvsd) tests failed because of this, so, leave it always disabled for now. + # show_debug_info = 1 if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1 else 0 + show_debug_info = 0 + + # Hack to increase _Py_TracingPossible. + # See comments on py_custom_pyeval_settrace.hpp + proceed = thread.allocate_lock() + proceed.acquire() + + def dummy_trace(frame, event, arg): + return dummy_trace + + def increase_tracing_count(): + set_trace = TracingFunctionHolder._original_tracing or sys.settrace + set_trace(dummy_trace) + proceed.release() + + start_new_thread = pydev_monkey.get_original_start_new_thread(thread) + start_new_thread(increase_tracing_count, ()) + proceed.acquire() # Only proceed after the release() is done. + proceed = None + + # Note: The set_trace_func is not really used anymore in the C side. + set_trace_func = TracingFunctionHolder._original_tracing or sys.settrace + + lib = _load_python_helper_lib() + if lib is None: # This is the case if it's not CPython. + pydev_log.info("Unable to load helper lib to set tracing to all threads (unsupported python vm).") + ret = -1 + else: + try: + result = lib.AttachDebuggerTracing( + ctypes.c_int(show_debug_info), + ctypes.py_object(set_trace_func), + ctypes.py_object(tracing_func), + ctypes.c_uint(thread_ident), + ctypes.py_object(None), + ) + except: + if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: + # There is no need to show this unless debug tracing is enabled. + pydev_log.exception("Error attaching debugger tracing") + ret = -1 + else: + if result != 0: + pydev_log.info("Unable to set tracing for existing thread. Result: %s", result) + ret = result + + return ret diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/setup_pydevd_cython.py b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/setup_pydevd_cython.py new file mode 100644 index 0000000..01b2e6c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/setup_pydevd_cython.py @@ -0,0 +1,287 @@ +""" +A simpler setup version just to compile the speedup module. + +It should be used as: + +python setup_pydevd_cython build_ext --inplace + +Note: the .c file and other generated files are regenerated from +the .pyx file by running "python build_tools/build.py" +""" + +import os +import sys +from setuptools import setup + +os.chdir(os.path.dirname(os.path.abspath(__file__))) + +IS_PY36_OR_GREATER = sys.version_info[:2] >= (3, 6) +IS_PY311_ONWARDS = sys.version_info[:2] >= (3, 11) +IS_PY312_ONWARDS = sys.version_info[:2] >= (3, 12) + + +def process_args(): + extension_folder = None + target_pydevd_name = None + target_frame_eval = None + force_cython = False + + for i, arg in enumerate(sys.argv[:]): + if arg == "--build-lib": + extension_folder = sys.argv[i + 1] + # It shouldn't be removed from sys.argv (among with --build-temp) because they're passed further to setup() + if arg.startswith("--target-pyd-name="): + sys.argv.remove(arg) + target_pydevd_name = arg[len("--target-pyd-name=") :] + if arg.startswith("--target-pyd-frame-eval="): + sys.argv.remove(arg) + target_frame_eval = arg[len("--target-pyd-frame-eval=") :] + if arg == "--force-cython": + sys.argv.remove(arg) + force_cython = True + + return extension_folder, target_pydevd_name, target_frame_eval, force_cython + + +def process_template_lines(template_lines): + # Create 2 versions of the template, one for Python 3.8 and another for Python 3.9 + for version in ("38", "39"): + yield "### WARNING: GENERATED CODE, DO NOT EDIT!" + yield "### WARNING: GENERATED CODE, DO NOT EDIT!" + yield "### WARNING: GENERATED CODE, DO NOT EDIT!" + + for line in template_lines: + if version == "38": + line = line.replace( + "get_bytecode_while_frame_eval(PyFrameObject * frame_obj, int exc)", + "get_bytecode_while_frame_eval_38(PyFrameObject * frame_obj, int exc)", + ) + line = line.replace("CALL_EvalFrameDefault", "CALL_EvalFrameDefault_38(frame_obj, exc)") + else: # 3.9 + line = line.replace( + "get_bytecode_while_frame_eval(PyFrameObject * frame_obj, int exc)", + "get_bytecode_while_frame_eval_39(PyThreadState* tstate, PyFrameObject * frame_obj, int exc)", + ) + line = line.replace("CALL_EvalFrameDefault", "CALL_EvalFrameDefault_39(tstate, frame_obj, exc)") + + yield line + + yield "### WARNING: GENERATED CODE, DO NOT EDIT!" + yield "### WARNING: GENERATED CODE, DO NOT EDIT!" + yield "### WARNING: GENERATED CODE, DO NOT EDIT!" + yield "" + yield "" + + +def process_template_file(contents): + ret = [] + template_lines = [] + + append_to = ret + for line in contents.splitlines(keepends=False): + if line.strip() == "### TEMPLATE_START": + append_to = template_lines + elif line.strip() == "### TEMPLATE_END": + append_to = ret + for line in process_template_lines(template_lines): + ret.append(line) + else: + append_to.append(line) + + return "\n".join(ret) + + +def build_extension(dir_name, extension_name, target_pydevd_name, force_cython, extended=False, has_pxd=False, template=False): + pyx_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.pyx" % (extension_name,)) + + if template: + pyx_template_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.template.pyx" % (extension_name,)) + with open(pyx_template_file, "r") as stream: + contents = stream.read() + + contents = process_template_file(contents) + + with open(pyx_file, "w") as stream: + stream.write(contents) + + if target_pydevd_name != extension_name: + # It MUST be there in this case! + # (otherwise we'll have unresolved externals because the .c file had another name initially). + import shutil + + # We must force cython in this case (but only in this case -- for the regular setup in the user machine, we + # should always compile the .c file). + force_cython = True + + new_pyx_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.pyx" % (target_pydevd_name,)) + new_c_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.c" % (target_pydevd_name,)) + shutil.copy(pyx_file, new_pyx_file) + pyx_file = new_pyx_file + if has_pxd: + pxd_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.pxd" % (extension_name,)) + new_pxd_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.pxd" % (target_pydevd_name,)) + shutil.copy(pxd_file, new_pxd_file) + assert os.path.exists(pyx_file) + + try: + c_files = [ + os.path.join(dir_name, "%s.c" % target_pydevd_name), + ] + if force_cython: + for c_file in c_files: + try: + os.remove(c_file) + except: + pass + from Cython.Build import cythonize # @UnusedImport + # Generate the .c files in cythonize (will not compile at this point). + + target = "%s/%s.pyx" % ( + dir_name, + target_pydevd_name, + ) + cythonize([target]) + + # Workarounds needed in CPython 3.8 and 3.9 to access PyInterpreterState.eval_frame. + for c_file in c_files: + with open(c_file, "r") as stream: + c_file_contents = stream.read() + + if '#include "internal/pycore_gc.h"' not in c_file_contents: + c_file_contents = c_file_contents.replace( + '#include "Python.h"', + """#include "Python.h" +#if PY_VERSION_HEX >= 0x03090000 +#include "internal/pycore_gc.h" +#include "internal/pycore_interp.h" +#endif +""", + ) + + if '#include "internal/pycore_pystate.h"' not in c_file_contents: + c_file_contents = c_file_contents.replace( + '#include "pystate.h"', + """#include "pystate.h" +#if PY_VERSION_HEX >= 0x03080000 +#include "internal/pycore_pystate.h" +#endif +""", + ) + + # We want the same output on Windows and Linux. + c_file_contents = c_file_contents.replace("\r\n", "\n").replace("\r", "\n") + c_file_contents = c_file_contents.replace(r"_pydevd_frame_eval\\release_mem.h", "_pydevd_frame_eval/release_mem.h") + c_file_contents = c_file_contents.replace( + r"_pydevd_frame_eval\\pydevd_frame_evaluator.pyx", "_pydevd_frame_eval/pydevd_frame_evaluator.pyx" + ) + c_file_contents = c_file_contents.replace(r"_pydevd_bundle\\pydevd_cython.pxd", "_pydevd_bundle/pydevd_cython.pxd") + c_file_contents = c_file_contents.replace(r"_pydevd_bundle\\pydevd_cython.pyx", "_pydevd_bundle/pydevd_cython.pyx") + + with open(c_file, "w") as stream: + stream.write(c_file_contents) + + # Always compile the .c (and not the .pyx) file (which we should keep up-to-date by running build_tools/build.py). + from distutils.extension import Extension + + extra_compile_args = [] + extra_link_args = [] + + if "linux" in sys.platform: + # Enabling -flto brings executable from 4MB to 0.56MB and -Os to 0.41MB + # Profiling shows an execution around 3-5% slower with -Os vs -O3, + # so, kept only -flto. + extra_compile_args = ["-flto", "-O3"] + extra_link_args = extra_compile_args[:] + + # Note: also experimented with profile-guided optimization. The executable + # size became a bit smaller (from 0.56MB to 0.5MB) but this would add an + # extra step to run the debugger to obtain the optimizations + # so, skipped it for now (note: the actual benchmarks time was in the + # margin of a 0-1% improvement, which is probably not worth it for + # speed increments). + # extra_compile_args = ["-flto", "-fprofile-generate"] + # ... Run benchmarks ... + # extra_compile_args = ["-flto", "-fprofile-use", "-fprofile-correction"] + elif "win32" in sys.platform: + pass + # uncomment to generate pdbs for visual studio. + # extra_compile_args=["-Zi", "/Od"] + # extra_link_args=["-debug"] + if IS_PY311_ONWARDS: + # On py311 we need to add the CPython include folder to the include path. + extra_compile_args.append("-I%s\\include\\CPython" % sys.exec_prefix) + + kwargs = {} + if extra_link_args: + kwargs["extra_link_args"] = extra_link_args + if extra_compile_args: + kwargs["extra_compile_args"] = extra_compile_args + + ext_modules = [ + Extension( + "%s%s.%s" + % ( + dir_name, + "_ext" if extended else "", + target_pydevd_name, + ), + c_files, + **kwargs, + ) + ] + + # This is needed in CPython 3.8 to be able to include internal/pycore_pystate.h + # (needed to set PyInterpreterState.eval_frame). + for module in ext_modules: + module.define_macros = [("Py_BUILD_CORE_MODULE", "1")] + setup(name="Cythonize", ext_modules=ext_modules) + finally: + if target_pydevd_name != extension_name: + try: + os.remove(new_pyx_file) + except: + import traceback + + traceback.print_exc() + try: + os.remove(new_c_file) + except: + import traceback + + traceback.print_exc() + if has_pxd: + try: + os.remove(new_pxd_file) + except: + import traceback + + traceback.print_exc() + + +extension_folder, target_pydevd_name, target_frame_eval, force_cython = process_args() + +FORCE_BUILD_ALL = os.environ.get("PYDEVD_FORCE_BUILD_ALL", "").lower() in ("true", "1") + +extension_name = "pydevd_cython" +if target_pydevd_name is None: + target_pydevd_name = extension_name +build_extension("_pydevd_bundle", extension_name, target_pydevd_name, force_cython, extension_folder, True) + +if IS_PY36_OR_GREATER and not IS_PY311_ONWARDS or FORCE_BUILD_ALL: + extension_name = "pydevd_frame_evaluator" + if target_frame_eval is None: + target_frame_eval = extension_name + build_extension("_pydevd_frame_eval", extension_name, target_frame_eval, force_cython, extension_folder, True, template=True) + +if IS_PY312_ONWARDS or FORCE_BUILD_ALL: + extension_name = "_pydevd_sys_monitoring_cython" + build_extension("_pydevd_sys_monitoring", extension_name, extension_name, force_cython, extension_folder, True) + +if extension_folder: + os.chdir(extension_folder) + for folder in [ + file for file in os.listdir(extension_folder) if file != "build" and os.path.isdir(os.path.join(extension_folder, file)) + ]: + file = os.path.join(folder, "__init__.py") + if not os.path.exists(file): + open(file, "a").close() diff --git a/myenv/lib/python3.12/site-packages/debugpy/_version.py b/myenv/lib/python3.12/site-packages/debugpy/_version.py new file mode 100644 index 0000000..86f3d22 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/_version.py @@ -0,0 +1,21 @@ + +# This file was generated by 'versioneer.py' (0.23) from +# revision-control system data, or from the parent directory name of an +# unpacked source archive. Distribution tarballs contain a pre-generated copy +# of this file. + +import json + +version_json = ''' +{ + "date": "2024-11-18T09:50:34-0800", + "dirty": false, + "error": null, + "full-revisionid": "f4ba976121ce38ee1c7c1f3174fcc520bccc7e19", + "version": "1.8.9" +} +''' # END VERSION_JSON + + +def get_versions(): + return json.loads(version_json) diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/adapter/__init__.py new file mode 100644 index 0000000..fa55b25 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/adapter/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +from __future__ import annotations +import typing + +if typing.TYPE_CHECKING: + __all__: list[str] + +__all__ = [] + +access_token = None +"""Access token used to authenticate with this adapter.""" diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/__main__.py b/myenv/lib/python3.12/site-packages/debugpy/adapter/__main__.py new file mode 100644 index 0000000..e18ecd5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/adapter/__main__.py @@ -0,0 +1,227 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import argparse +import atexit +import codecs +import locale +import os +import sys + +# WARNING: debugpy and submodules must not be imported on top level in this module, +# and should be imported locally inside main() instead. + + +def main(args): + # If we're talking DAP over stdio, stderr is not guaranteed to be read from, + # so disable it to avoid the pipe filling and locking up. This must be done + # as early as possible, before the logging module starts writing to it. + if args.port is None: + sys.stderr = stderr = open(os.devnull, "w") + atexit.register(stderr.close) + + from debugpy import adapter + from debugpy.common import json, log, sockets + from debugpy.adapter import clients, servers, sessions + + if args.for_server is not None: + if os.name == "posix": + # On POSIX, we need to leave the process group and its session, and then + # daemonize properly by double-forking (first fork already happened when + # this process was spawned). + # NOTE: if process is already the session leader, then + # setsid would fail with `operation not permitted` + if os.getsid(os.getpid()) != os.getpid(): + os.setsid() + if os.fork() != 0: + sys.exit(0) + + for stdio in sys.stdin, sys.stdout, sys.stderr: + if stdio is not None: + stdio.close() + + if args.log_stderr: + log.stderr.levels |= set(log.LEVELS) + if args.log_dir is not None: + log.log_dir = args.log_dir + + log.to_file(prefix="debugpy.adapter") + log.describe_environment("debugpy.adapter startup environment:") + + servers.access_token = args.server_access_token + if args.for_server is None: + adapter.access_token = codecs.encode(os.urandom(32), "hex").decode("ascii") + + endpoints = {} + try: + client_host, client_port = clients.serve(args.host, args.port) + except Exception as exc: + if args.for_server is None: + raise + endpoints = {"error": "Can't listen for client connections: " + str(exc)} + else: + endpoints["client"] = {"host": client_host, "port": client_port} + + if args.for_server is not None: + try: + server_host, server_port = servers.serve() + except Exception as exc: + endpoints = {"error": "Can't listen for server connections: " + str(exc)} + else: + endpoints["server"] = {"host": server_host, "port": server_port} + + log.info( + "Sending endpoints info to debug server at localhost:{0}:\n{1}", + args.for_server, + json.repr(endpoints), + ) + + try: + sock = sockets.create_client() + try: + sock.settimeout(None) + sock.connect(("127.0.0.1", args.for_server)) + sock_io = sock.makefile("wb", 0) + try: + sock_io.write(json.dumps(endpoints).encode("utf-8")) + finally: + sock_io.close() + finally: + sockets.close_socket(sock) + except Exception: + log.reraise_exception("Error sending endpoints info to debug server:") + + if "error" in endpoints: + log.error("Couldn't set up endpoints; exiting.") + sys.exit(1) + + listener_file = os.getenv("DEBUGPY_ADAPTER_ENDPOINTS") + if listener_file is not None: + log.info( + "Writing endpoints info to {0!r}:\n{1}", listener_file, json.repr(endpoints) + ) + + def delete_listener_file(): + log.info("Listener ports closed; deleting {0!r}", listener_file) + try: + os.remove(listener_file) + except Exception: + log.swallow_exception( + "Failed to delete {0!r}", listener_file, level="warning" + ) + + try: + with open(listener_file, "w") as f: + atexit.register(delete_listener_file) + print(json.dumps(endpoints), file=f) + except Exception: + log.reraise_exception("Error writing endpoints info to file:") + + if args.port is None: + clients.Client("stdio") + + # These must be registered after the one above, to ensure that the listener sockets + # are closed before the endpoint info file is deleted - this way, another process + # can wait for the file to go away as a signal that the ports are no longer in use. + atexit.register(servers.stop_serving) + atexit.register(clients.stop_serving) + + servers.wait_until_disconnected() + log.info("All debug servers disconnected; waiting for remaining sessions...") + + sessions.wait_until_ended() + log.info("All debug sessions have ended; exiting.") + + +def _parse_argv(argv): + parser = argparse.ArgumentParser() + + parser.add_argument( + "--for-server", type=int, metavar="PORT", help=argparse.SUPPRESS + ) + + parser.add_argument( + "--port", + type=int, + default=None, + metavar="PORT", + help="start the adapter in debugServer mode on the specified port", + ) + + parser.add_argument( + "--host", + type=str, + default="127.0.0.1", + metavar="HOST", + help="start the adapter in debugServer mode on the specified host", + ) + + parser.add_argument( + "--access-token", type=str, help="access token expected from the server" + ) + + parser.add_argument( + "--server-access-token", type=str, help="access token expected by the server" + ) + + parser.add_argument( + "--log-dir", + type=str, + metavar="DIR", + help="enable logging and use DIR to save adapter logs", + ) + + parser.add_argument( + "--log-stderr", action="store_true", help="enable logging to stderr" + ) + + args = parser.parse_args(argv[1:]) + + if args.port is None: + if args.log_stderr: + parser.error("--log-stderr requires --port") + if args.for_server is not None: + parser.error("--for-server requires --port") + + return args + + +if __name__ == "__main__": + # debugpy can also be invoked directly rather than via -m. In this case, the first + # entry on sys.path is the one added automatically by Python for the directory + # containing this file. This means that import debugpy will not work, since we need + # the parent directory of debugpy/ to be in sys.path, rather than debugpy/adapter/. + # + # The other issue is that many other absolute imports will break, because they + # will be resolved relative to debugpy/adapter/ - e.g. `import state` will then try + # to import debugpy/adapter/state.py. + # + # To fix both, we need to replace the automatically added entry such that it points + # at parent directory of debugpy/ instead of debugpy/adapter, import debugpy with that + # in sys.path, and then remove the first entry entry altogether, so that it doesn't + # affect any further imports we might do. For example, suppose the user did: + # + # python /foo/bar/debugpy/adapter ... + # + # At the beginning of this script, sys.path will contain "/foo/bar/debugpy/adapter" + # as the first entry. What we want is to replace it with "/foo/bar', then import + # debugpy with that in effect, and then remove the replaced entry before any more + # code runs. The imported debugpy module will remain in sys.modules, and thus all + # future imports of it or its submodules will resolve accordingly. + if "debugpy" not in sys.modules: + # Do not use dirname() to walk up - this can be a relative path, e.g. ".". + sys.path[0] = sys.path[0] + "/../../" + __import__("debugpy") + del sys.path[0] + + # Apply OS-global and user-specific locale settings. + try: + locale.setlocale(locale.LC_ALL, "") + except Exception: + # On POSIX, locale is set via environment variables, and this can fail if + # those variables reference a non-existing locale. Ignore and continue using + # the default "C" locale if so. + pass + + main(_parse_argv(sys.argv)) diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac8010fd7a2004081dd092aeb659c8791e07cbee GIT binary patch literal 419 zcmYLFJxjzu5Zz63cV4_;A!sXDrO-v~Ll;x)wa3Q^XL%8Om{l zagCkKi5zflnq$GFss?kxW8Q`xr6_7JCu){X*!Zd`A+DxlAqo>4UI=}3*Uq>$7uu-H zszqs>Wt4`k%BS>dUndV+vF&c6q9uio6y@7%YBGqd-dceJjiE&C57c6GA= literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/__main__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..884a46f6508d75b6ab161495f97882e5e8423586 GIT binary patch literal 8547 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/launchers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/launchers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..555339054c2e62e0d4b3bd1b517bba4867c5725d GIT binary patch literal 9003 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 YenxV2h^~$`1cgTzh=T^AU77y>01E7;asU7T literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/servers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/servers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12518ad34a6bd4da6bef9f361cd2d36847009aa4 GIT binary patch literal 25454 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/sessions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/adapter/__pycache__/sessions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b09f3771f2c8ac8700c1b3f30d3b041233d9c366 GIT binary patch literal 13817 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

    T_N^V7s};*fhOj6EfYvPwi~0eU zV$y;$p{oG`oZbFBSFu>(f9=^!a7VUc=LbxtV$bB0d9Q!=+tc5k+@CM=&X?6gn;h4i z;hI0@T0p*X4VoENFTH|eqB<+Rhzah2bQBV`jM@=Hqna9Cp?`%@VFp70w@7kef|eeQ z;G%Ki)Qpf2)fz$X#@r4_RL4HN_mOsCzWgW+^NvEOy(Wl|H&Gg<%adNmPZUg)+##G^ z6PY`tYfuJjC-ON+Kx{M2-Et82pAgq4#QO>HeL~#-MH+rhg1;t@XUOBAakv6guGz}z z$_1`|((y}A 0 and isinstance( + request.arguments["args"], str + ) + if shell_expand_args: + if not self.capabilities["supportsArgsCanBeInterpretedByShell"]: + raise request.isnt_valid( + 'Shell expansion in "args" is not supported by the client' + ) + if console == "internalConsole": + raise request.isnt_valid( + 'Shell expansion in "args" is not available for "console":"internalConsole"' + ) + + cwd = request("cwd", str, optional=True) + if cwd == (): + # If it's not specified, but we're launching a file rather than a module, + # and the specified path has a directory in it, use that. + cwd = None if program == () else (os.path.dirname(program) or None) + + sudo = bool(property_or_debug_option("sudo", "Sudo")) + if sudo and sys.platform == "win32": + raise request.cant_handle('"sudo":true is not supported on Windows.') + + on_terminate = request("onTerminate", str, optional=True) + + if on_terminate: + self._forward_terminate_request = on_terminate == "KeyboardInterrupt" + + launcher_path = request("debugLauncherPath", os.path.dirname(launcher.__file__)) + adapter_host = request("debugAdapterHost", "127.0.0.1") + + try: + servers.serve(adapter_host) + except Exception as exc: + raise request.cant_handle( + "{0} couldn't create listener socket for servers: {1}", + self.session, + exc, + ) + + launchers.spawn_debuggee( + self.session, + request, + [launcher_python], + launcher_path, + adapter_host, + args, + shell_expand_args, + cwd, + console, + console_title, + sudo, + ) + + @_start_message_handler + def attach_request(self, request): + if self.session.no_debug: + raise request.isnt_valid('"noDebug" is not supported for "attach"') + + host = request("host", str, optional=True) + port = request("port", int, optional=True) + listen = request("listen", dict, optional=True) + connect = request("connect", dict, optional=True) + pid = request("processId", (int, str), optional=True) + sub_pid = request("subProcessId", int, optional=True) + on_terminate = request("onTerminate", bool, optional=True) + + if on_terminate: + self._forward_terminate_request = on_terminate == "KeyboardInterrupt" + + if host != () or port != (): + if listen != (): + raise request.isnt_valid( + '"listen" and "host"/"port" are mutually exclusive' + ) + if connect != (): + raise request.isnt_valid( + '"connect" and "host"/"port" are mutually exclusive' + ) + if listen != (): + if connect != (): + raise request.isnt_valid( + '"listen" and "connect" are mutually exclusive' + ) + if pid != (): + raise request.isnt_valid( + '"listen" and "processId" are mutually exclusive' + ) + if sub_pid != (): + raise request.isnt_valid( + '"listen" and "subProcessId" are mutually exclusive' + ) + if pid != () and sub_pid != (): + raise request.isnt_valid( + '"processId" and "subProcessId" are mutually exclusive' + ) + + if listen != (): + if servers.is_serving(): + raise request.isnt_valid( + 'Multiple concurrent "listen" sessions are not supported' + ) + host = listen("host", "127.0.0.1") + port = listen("port", int) + adapter.access_token = None + self.restart_requested = request("restart", False) + host, port = servers.serve(host, port) + else: + if not servers.is_serving(): + servers.serve() + host, port = servers.listener.getsockname() + + # There are four distinct possibilities here. + # + # If "processId" is specified, this is attach-by-PID. We need to inject the + # debug server into the designated process, and then wait until it connects + # back to us. Since the injected server can crash, there must be a timeout. + # + # If "subProcessId" is specified, this is attach to a known subprocess, likely + # in response to a "debugpyAttach" event. If so, the debug server should be + # connected already, and thus the wait timeout is zero. + # + # If "listen" is specified, this is attach-by-socket with the server expected + # to connect to the adapter via debugpy.connect(). There is no PID known in + # advance, so just wait until the first server connection indefinitely, with + # no timeout. + # + # If "connect" is specified, this is attach-by-socket in which the server has + # spawned the adapter via debugpy.listen(). There is no PID known to the client + # in advance, but the server connection should be either be there already, or + # the server should be connecting shortly, so there must be a timeout. + # + # In the last two cases, if there's more than one server connection already, + # this is a multiprocess re-attach. The client doesn't know the PID, so we just + # connect it to the oldest server connection that we have - in most cases, it + # will be the one for the root debuggee process, but if it has exited already, + # it will be some subprocess. + if pid != (): + if not isinstance(pid, int): + try: + pid = int(pid) + except Exception: + raise request.isnt_valid('"processId" must be parseable as int') + debugpy_args = request("debugpyArgs", json.array(str)) + + def on_output(category, output): + self.channel.send_event( + "output", + { + "category": category, + "output": output, + }, + ) + + try: + servers.inject(pid, debugpy_args, on_output) + except Exception as e: + log.swallow_exception() + self.session.finalize( + "Error when trying to attach to PID:\n%s" % (str(e),) + ) + return + + timeout = common.PROCESS_SPAWN_TIMEOUT + pred = lambda conn: conn.pid == pid + else: + if sub_pid == (): + pred = lambda conn: True + timeout = common.PROCESS_SPAWN_TIMEOUT if listen == () else None + else: + pred = lambda conn: conn.pid == sub_pid + timeout = 0 + + self.channel.send_event("debugpyWaitingForServer", {"host": host, "port": port}) + conn = servers.wait_for_connection(self.session, pred, timeout) + if conn is None: + if sub_pid != (): + # If we can't find a matching subprocess, it's not always an error - + # it might have already exited, or didn't even get a chance to connect. + # To prevent the client from complaining, pretend that the "attach" + # request was successful, but that the session terminated immediately. + request.respond({}) + self.session.finalize( + 'No known subprocess with "subProcessId":{0}'.format(sub_pid) + ) + return + + raise request.cant_handle( + ( + "Timed out waiting for debug server to connect." + if timeout + else "There is no debug server connected to this adapter." + ), + sub_pid, + ) + + try: + conn.attach_to_session(self.session) + except ValueError: + request.cant_handle("{0} is already being debugged.", conn) + + @message_handler + def configurationDone_request(self, request): + if self.start_request is None or self.has_started: + request.cant_handle( + '"configurationDone" is only allowed during handling of a "launch" ' + 'or an "attach" request' + ) + + try: + self.has_started = True + try: + result = self.server.channel.delegate(request) + except messaging.NoMoreMessages: + # Server closed connection before we could receive the response to + # "configurationDone" - this can happen when debuggee exits shortly + # after starting. It's not an error, but we can't do anything useful + # here at this point, either, so just bail out. + request.respond({}) + self.start_request.respond({}) + self.session.finalize( + "{0} disconnected before responding to {1}".format( + self.server, + json.repr(request.command), + ) + ) + return + else: + request.respond(result) + except messaging.MessageHandlingError as exc: + self.start_request.cant_handle(str(exc)) + finally: + if self.start_request.response is None: + self.start_request.respond({}) + self._propagate_deferred_events() + + # Notify the client of any child processes of the debuggee that aren't already + # being debugged. + for conn in servers.connections(): + if conn.server is None and conn.ppid == self.session.pid: + self.notify_of_subprocess(conn) + + @message_handler + def evaluate_request(self, request): + propagated_request = self.server.channel.propagate(request) + + def handle_response(response): + request.respond(response.body) + + propagated_request.on_response(handle_response) + + return messaging.NO_RESPONSE + + @message_handler + def pause_request(self, request): + request.arguments["threadId"] = "*" + return self.server.channel.delegate(request) + + @message_handler + def continue_request(self, request): + request.arguments["threadId"] = "*" + + try: + return self.server.channel.delegate(request) + except messaging.NoMoreMessages: + # pydevd can sometimes allow the debuggee to exit before the queued + # "continue" response gets sent. Thus, a failed "continue" response + # indicating that the server disconnected should be treated as success. + return {"allThreadsContinued": True} + + @message_handler + def debugpySystemInfo_request(self, request): + result = {"debugpy": {"version": debugpy.__version__}} + if self.server: + try: + pydevd_info = self.server.channel.request("pydevdSystemInfo") + except Exception: + # If the server has already disconnected, or couldn't handle it, + # report what we've got. + pass + else: + result.update(pydevd_info) + return result + + @message_handler + def terminate_request(self, request): + # If user specifically requests to terminate, it means that they don't want + # debug session auto-restart kicking in. + self.restart_requested = False + + if self._forward_terminate_request: + # According to the spec, terminate should try to do a gracefull shutdown. + # We do this in the server by interrupting the main thread with a Ctrl+C. + # To force the kill a subsequent request would do a disconnect. + # + # We only do this if the onTerminate option is set though (the default + # is a hard-kill for the process and subprocesses). + return self.server.channel.delegate(request) + + self.session.finalize('client requested "terminate"', terminate_debuggee=True) + return {} + + @message_handler + def disconnect_request(self, request): + # If user specifically requests to disconnect, it means that they don't want + # debug session auto-restart kicking in. + self.restart_requested = False + + terminate_debuggee = request("terminateDebuggee", bool, optional=True) + if terminate_debuggee == (): + terminate_debuggee = None + self.session.finalize('client requested "disconnect"', terminate_debuggee) + request.respond({}) + + if self.using_stdio: + # There's no way for the client to reconnect to this adapter once it disconnects + # from this session, so close any remaining server connections. + servers.stop_serving() + log.info("{0} disconnected from stdio; closing remaining server connections.", self) + for conn in servers.connections(): + try: + conn.channel.close() + except Exception: + log.swallow_exception() + + def disconnect(self): + super().disconnect() + + def report_sockets(self): + sockets = [ + { + "host": host, + "port": port, + "internal": listener is not clients.listener, + } + for listener in [clients.listener, launchers.listener, servers.listener] + if listener is not None + for (host, port) in [listener.getsockname()] + ] + self.channel.send_event( + "debugpySockets", + { + "sockets": sockets + }, + ) + + def notify_of_subprocess(self, conn): + log.info("{1} is a subprocess of {0}.", self, conn) + with self.session: + if self.start_request is None or conn in self.known_subprocesses: + return + if "processId" in self.start_request.arguments: + log.warning( + "Not reporting subprocess for {0}, because the parent process " + 'was attached to using "processId" rather than "port".', + self.session, + ) + return + + log.info("Notifying {0} about {1}.", self, conn) + body = dict(self.start_request.arguments) + self.known_subprocesses.add(conn) + self.session.notify_changed() + + for key in "processId", "listen", "preLaunchTask", "postDebugTask", "request", "restart": + body.pop(key, None) + + body["name"] = "Subprocess {0}".format(conn.pid) + body["subProcessId"] = conn.pid + + for key in "args", "processName", "pythonArgs": + body.pop(key, None) + + host = body.pop("host", None) + port = body.pop("port", None) + if "connect" not in body: + body["connect"] = {} + if "host" not in body["connect"]: + body["connect"]["host"] = host if host is not None else "127.0.0.1" + if "port" not in body["connect"]: + if port is None: + _, port = listener.getsockname() + body["connect"]["port"] = port + + if self.capabilities["supportsStartDebuggingRequest"]: + self.channel.request("startDebugging", { + "request": "attach", + "configuration": body, + }) + else: + body["request"] = "attach" + self.channel.send_event("debugpyAttach", body) + + +def serve(host, port): + global listener + listener = sockets.serve("Client", Client, host, port) + sessions.report_sockets() + return listener.getsockname() + + +def stop_serving(): + global listener + if listener is not None: + try: + listener.close() + except Exception: + log.swallow_exception(level="warning") + listener = None + sessions.report_sockets() diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/components.py b/myenv/lib/python3.12/site-packages/debugpy/adapter/components.py new file mode 100644 index 0000000..1a65340 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/adapter/components.py @@ -0,0 +1,183 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import functools + +from debugpy.common import json, log, messaging, util + + +ACCEPT_CONNECTIONS_TIMEOUT = 60 + + +class ComponentNotAvailable(Exception): + def __init__(self, type): + super().__init__(f"{type.__name__} is not available") + + +class Component(util.Observable): + """A component managed by a debug adapter: client, launcher, or debug server. + + Every component belongs to a Session, which is used for synchronization and + shared data. + + Every component has its own message channel, and provides message handlers for + that channel. All handlers should be decorated with @Component.message_handler, + which ensures that Session is locked for the duration of the handler. Thus, only + one handler is running at any given time across all components, unless the lock + is released explicitly or via Session.wait_for(). + + Components report changes to their attributes to Session, allowing one component + to wait_for() a change caused by another component. + """ + + def __init__(self, session, stream=None, channel=None): + assert (stream is None) ^ (channel is None) + + try: + lock_held = session.lock.acquire(blocking=False) + assert lock_held, "__init__ of a Component subclass must lock its Session" + finally: + session.lock.release() + + super().__init__() + + self.session = session + + if channel is None: + stream.name = str(self) + channel = messaging.JsonMessageChannel(stream, self) + channel.start() + else: + channel.name = channel.stream.name = str(self) + channel.handlers = self + self.channel = channel + self.is_connected = True + + # Do this last to avoid triggering useless notifications for assignments above. + self.observers += [lambda *_: self.session.notify_changed()] + + def __str__(self): + return f"{type(self).__name__}[{self.session.id}]" + + @property + def client(self): + return self.session.client + + @property + def launcher(self): + return self.session.launcher + + @property + def server(self): + return self.session.server + + def wait_for(self, *args, **kwargs): + return self.session.wait_for(*args, **kwargs) + + @staticmethod + def message_handler(f): + """Applied to a message handler to automatically lock and unlock the session + for its duration, and to validate the session state. + + If the handler raises ComponentNotAvailable or JsonIOError, converts it to + Message.cant_handle(). + """ + + @functools.wraps(f) + def lock_and_handle(self, message): + try: + with self.session: + return f(self, message) + except ComponentNotAvailable as exc: + raise message.cant_handle("{0}", exc, silent=True) + except messaging.MessageHandlingError as exc: + if exc.cause is message: + raise + else: + exc.propagate(message) + except messaging.JsonIOError as exc: + raise message.cant_handle( + "{0} disconnected unexpectedly", exc.stream.name, silent=True + ) + + return lock_and_handle + + def disconnect(self): + with self.session: + self.is_connected = False + self.session.finalize("{0} has disconnected".format(self)) + + +def missing(session, type): + class Missing(object): + """A dummy component that raises ComponentNotAvailable whenever some + attribute is accessed on it. + """ + + __getattr__ = __setattr__ = lambda self, *_: report() + __bool__ = __nonzero__ = lambda self: False + + def report(): + try: + raise ComponentNotAvailable(type) + except Exception as exc: + log.reraise_exception("{0} in {1}", exc, session) + + return Missing() + + +class Capabilities(dict): + """A collection of feature flags for a component. Corresponds to JSON properties + in the DAP "initialize" request or response, other than those that identify the + party. + """ + + PROPERTIES = {} + """JSON property names and default values for the the capabilities represented + by instances of this class. Keys are names, and values are either default values + or validators. + + If the value is callable, it must be a JSON validator; see debugpy.common.json for + details. If the value is not callable, it is as if json.default(value) validator + was used instead. + """ + + def __init__(self, component, message): + """Parses an "initialize" request or response and extracts the feature flags. + + For every "X" in self.PROPERTIES, sets self["X"] to the corresponding value + from message.payload if it's present there, or to the default value otherwise. + """ + + assert message.is_request("initialize") or message.is_response("initialize") + + self.component = component + + payload = message.payload + for name, validate in self.PROPERTIES.items(): + value = payload.get(name, ()) + if not callable(validate): + validate = json.default(validate) + + try: + value = validate(value) + except Exception as exc: + raise message.isnt_valid("{0} {1}", json.repr(name), exc) + + assert ( + value != () + ), f"{validate} must provide a default value for missing properties." + self[name] = value + + log.debug("{0}", self) + + def __repr__(self): + return f"{type(self).__name__}: {json.repr(dict(self))}" + + def require(self, *keys): + for key in keys: + if not self[key]: + raise messaging.MessageHandlingError( + f"{self.component} does not have capability {json.repr(key)}", + ) diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/launchers.py b/myenv/lib/python3.12/site-packages/debugpy/adapter/launchers.py new file mode 100644 index 0000000..38a990d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/adapter/launchers.py @@ -0,0 +1,198 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import os +import subprocess +import sys + +from debugpy import adapter, common +from debugpy.common import log, messaging, sockets +from debugpy.adapter import components, servers, sessions + +listener = None + + +class Launcher(components.Component): + """Handles the launcher side of a debug session.""" + + message_handler = components.Component.message_handler + + def __init__(self, session, stream): + with session: + assert not session.launcher + super().__init__(session, stream) + + self.pid = None + """Process ID of the debuggee process, as reported by the launcher.""" + + self.exit_code = None + """Exit code of the debuggee process.""" + + session.launcher = self + + @message_handler + def process_event(self, event): + self.pid = event("systemProcessId", int) + self.client.propagate_after_start(event) + + @message_handler + def output_event(self, event): + self.client.propagate_after_start(event) + + @message_handler + def exited_event(self, event): + self.exit_code = event("exitCode", int) + # We don't want to tell the client about this just yet, because it will then + # want to disconnect, and the launcher might still be waiting for keypress + # (if wait-on-exit was enabled). Instead, we'll report the event when we + # receive "terminated" from the launcher, right before it exits. + + @message_handler + def terminated_event(self, event): + try: + self.client.channel.send_event("exited", {"exitCode": self.exit_code}) + except Exception: + pass + self.channel.close() + + def terminate_debuggee(self): + with self.session: + if self.exit_code is None: + try: + self.channel.request("terminate") + except Exception: + pass + + +def spawn_debuggee( + session, + start_request, + python, + launcher_path, + adapter_host, + args, + shell_expand_args, + cwd, + console, + console_title, + sudo, +): + global listener + + # -E tells sudo to propagate environment variables to the target process - this + # is necessary for launcher to get DEBUGPY_LAUNCHER_PORT and DEBUGPY_LOG_DIR. + cmdline = ["sudo", "-E"] if sudo else [] + cmdline += python + cmdline += [launcher_path] + env = {} + + arguments = dict(start_request.arguments) + if not session.no_debug: + _, arguments["port"] = servers.listener.getsockname() + arguments["adapterAccessToken"] = adapter.access_token + + def on_launcher_connected(sock): + listener.close() + stream = messaging.JsonIOStream.from_socket(sock) + Launcher(session, stream) + + try: + listener = sockets.serve( + "Launcher", on_launcher_connected, adapter_host, backlog=1 + ) + except Exception as exc: + raise start_request.cant_handle( + "{0} couldn't create listener socket for launcher: {1}", session, exc + ) + sessions.report_sockets() + + try: + launcher_host, launcher_port = listener.getsockname() + launcher_addr = ( + launcher_port + if launcher_host == "127.0.0.1" + else f"{launcher_host}:{launcher_port}" + ) + cmdline += [str(launcher_addr), "--"] + cmdline += args + + if log.log_dir is not None: + env[str("DEBUGPY_LOG_DIR")] = log.log_dir + if log.stderr.levels != {"warning", "error"}: + env[str("DEBUGPY_LOG_STDERR")] = str(" ".join(log.stderr.levels)) + + if console == "internalConsole": + log.info("{0} spawning launcher: {1!r}", session, cmdline) + try: + # If we are talking to the client over stdio, sys.stdin and sys.stdout + # are redirected to avoid mangling the DAP message stream. Make sure + # the launcher also respects that. + subprocess.Popen( + cmdline, + cwd=cwd, + env=dict(list(os.environ.items()) + list(env.items())), + stdin=sys.stdin, + stdout=sys.stdout, + stderr=sys.stderr, + ) + except Exception as exc: + raise start_request.cant_handle("Failed to spawn launcher: {0}", exc) + else: + log.info('{0} spawning launcher via "runInTerminal" request.', session) + session.client.capabilities.require("supportsRunInTerminalRequest") + kinds = {"integratedTerminal": "integrated", "externalTerminal": "external"} + request_args = { + "kind": kinds[console], + "title": console_title, + "args": cmdline, + "env": env, + } + if cwd is not None: + request_args["cwd"] = cwd + if shell_expand_args: + request_args["argsCanBeInterpretedByShell"] = True + try: + # It is unspecified whether this request receives a response immediately, or only + # after the spawned command has completed running, so do not block waiting for it. + session.client.channel.send_request("runInTerminal", request_args) + except messaging.MessageHandlingError as exc: + exc.propagate(start_request) + + # If using sudo, it might prompt for password, and launcher won't start running + # until the user enters it, so don't apply timeout in that case. + if not session.wait_for( + lambda: session.launcher, + timeout=(None if sudo else common.PROCESS_SPAWN_TIMEOUT), + ): + raise start_request.cant_handle("Timed out waiting for launcher to connect") + + try: + session.launcher.channel.request(start_request.command, arguments) + except messaging.MessageHandlingError as exc: + exc.propagate(start_request) + + if not session.wait_for( + lambda: session.launcher.pid is not None, + timeout=common.PROCESS_SPAWN_TIMEOUT, + ): + raise start_request.cant_handle( + 'Timed out waiting for "process" event from launcher' + ) + + if session.no_debug: + return + + # Wait for the first incoming connection regardless of the PID - it won't + # necessarily match due to the use of stubs like py.exe or "conda run". + conn = servers.wait_for_connection( + session, lambda conn: True, timeout=common.PROCESS_SPAWN_TIMEOUT + ) + if conn is None: + raise start_request.cant_handle("Timed out waiting for debuggee to spawn") + conn.attach_to_session(session) + + finally: + listener.close() + listener = None + sessions.report_sockets() diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/servers.py b/myenv/lib/python3.12/site-packages/debugpy/adapter/servers.py new file mode 100644 index 0000000..307a2ce --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/adapter/servers.py @@ -0,0 +1,620 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +from __future__ import annotations + +import os +import subprocess +import sys +import threading +import time + +import debugpy +from debugpy import adapter +from debugpy.common import json, log, messaging, sockets +from debugpy.adapter import components, sessions +import traceback +import io + +access_token = None +"""Access token used to authenticate with the servers.""" + +listener = None +"""Listener socket that accepts server connections.""" + +_lock = threading.RLock() + +_connections = [] +"""All servers that are connected to this adapter, in order in which they connected. +""" + +_connections_changed = threading.Event() + + +class Connection(object): + """A debug server that is connected to the adapter. + + Servers that are not participating in a debug session are managed directly by the + corresponding Connection instance. + + Servers that are participating in a debug session are managed by that sessions's + Server component instance, but Connection object remains, and takes over again + once the session ends. + """ + + disconnected: bool + + process_replaced: bool + """Whether this is a connection to a process that is being replaced in situ + by another process, e.g. via exec(). + """ + + server: Server | None + """The Server component, if this debug server belongs to Session. + """ + + pid: int | None + + ppid: int | None + + channel: messaging.JsonMessageChannel + + def __init__(self, sock): + from debugpy.adapter import sessions + + self.disconnected = False + + self.process_replaced = False + + self.server = None + + self.pid = None + + stream = messaging.JsonIOStream.from_socket(sock, str(self)) + self.channel = messaging.JsonMessageChannel(stream, self) + self.channel.start() + + try: + self.authenticate() + info = self.channel.request("pydevdSystemInfo") + process_info = info("process", json.object()) + self.pid = process_info("pid", int) + self.ppid = process_info("ppid", int, optional=True) + if self.ppid == (): + self.ppid = None + self.channel.name = stream.name = str(self) + + with _lock: + # The server can disconnect concurrently before we get here, e.g. if + # it was force-killed. If the disconnect() handler has already run, + # don't register this server or report it, since there's nothing to + # deregister it. + if self.disconnected: + return + + # An existing connection with the same PID and process_replaced == True + # corresponds to the process that replaced itself with this one, so it's + # not an error. + if any( + conn.pid == self.pid and not conn.process_replaced + for conn in _connections + ): + raise KeyError(f"{self} is already connected to this adapter") + + is_first_server = len(_connections) == 0 + _connections.append(self) + _connections_changed.set() + + except Exception: + log.swallow_exception("Failed to accept incoming server connection:") + self.channel.close() + + # If this was the first server to connect, and the main thread is inside + # wait_until_disconnected(), we want to unblock it and allow it to exit. + dont_wait_for_first_connection() + + # If we couldn't retrieve all the necessary info from the debug server, + # or there's a PID clash, we don't want to track this debuggee anymore, + # but we want to continue accepting connections. + return + + parent_session = sessions.get(self.ppid) + if parent_session is None: + parent_session = sessions.get(self.pid) + if parent_session is None: + log.info("No active debug session for parent process of {0}.", self) + else: + if self.pid == parent_session.pid: + parent_server = parent_session.server + if not (parent_server and parent_server.connection.process_replaced): + log.error("{0} is not expecting replacement.", parent_session) + self.channel.close() + return + try: + parent_session.client.notify_of_subprocess(self) + return + except Exception: + # This might fail if the client concurrently disconnects from the parent + # session. We still want to keep the connection around, in case the + # client reconnects later. If the parent session was "launch", it'll take + # care of closing the remaining server connections. + log.swallow_exception( + "Failed to notify parent session about {0}:", self + ) + + # If we got to this point, the subprocess notification was either not sent, + # or not delivered successfully. For the first server, this is expected, since + # it corresponds to the root process, and there is no other debug session to + # notify. But subsequent server connections represent subprocesses, and those + # will not start running user code until the client tells them to. Since there + # isn't going to be a client without the notification, such subprocesses have + # to be unblocked. + if is_first_server: + return + log.info("No clients to wait for - unblocking {0}.", self) + try: + self.channel.request("initialize", {"adapterID": "debugpy"}) + self.channel.request("attach", {"subProcessId": self.pid}) + self.channel.request("configurationDone") + self.channel.request("disconnect") + except Exception: + log.swallow_exception("Failed to unblock orphaned subprocess:") + self.channel.close() + + def __str__(self): + return "Server" + ("[?]" if self.pid is None else f"[pid={self.pid}]") + + def authenticate(self): + if access_token is None and adapter.access_token is None: + return + auth = self.channel.request( + "pydevdAuthorize", {"debugServerAccessToken": access_token} + ) + if auth["clientAccessToken"] != adapter.access_token: + self.channel.close() + raise RuntimeError('Mismatched "clientAccessToken"; server not authorized.') + + def request(self, request): + raise request.isnt_valid( + "Requests from the debug server to the client are not allowed." + ) + + def event(self, event): + pass + + def terminated_event(self, event): + self.channel.close() + + def disconnect(self): + with _lock: + self.disconnected = True + if self.server is not None: + # If the disconnect happened while Server was being instantiated, + # we need to tell it, so that it can clean up via Session.finalize(). + # It will also take care of deregistering the connection in that case. + self.server.disconnect() + elif self in _connections: + _connections.remove(self) + _connections_changed.set() + + def attach_to_session(self, session): + """Attaches this server to the specified Session as a Server component. + + Raises ValueError if the server already belongs to some session. + """ + + with _lock: + if self.server is not None: + raise ValueError + log.info("Attaching {0} to {1}", self, session) + self.server = Server(session, self) + + +class Server(components.Component): + """Handles the debug server side of a debug session.""" + + message_handler = components.Component.message_handler + + connection: Connection + + class Capabilities(components.Capabilities): + PROPERTIES = { + "supportsCompletionsRequest": False, + "supportsConditionalBreakpoints": False, + "supportsConfigurationDoneRequest": False, + "supportsDataBreakpoints": False, + "supportsDelayedStackTraceLoading": False, + "supportsDisassembleRequest": False, + "supportsEvaluateForHovers": False, + "supportsExceptionInfoRequest": False, + "supportsExceptionOptions": False, + "supportsFunctionBreakpoints": False, + "supportsGotoTargetsRequest": False, + "supportsHitConditionalBreakpoints": False, + "supportsLoadedSourcesRequest": False, + "supportsLogPoints": False, + "supportsModulesRequest": False, + "supportsReadMemoryRequest": False, + "supportsRestartFrame": False, + "supportsRestartRequest": False, + "supportsSetExpression": False, + "supportsSetVariable": False, + "supportsStepBack": False, + "supportsStepInTargetsRequest": False, + "supportsTerminateRequest": True, + "supportsTerminateThreadsRequest": False, + "supportsValueFormattingOptions": False, + "exceptionBreakpointFilters": [], + "additionalModuleColumns": [], + "supportedChecksumAlgorithms": [], + } + + def __init__(self, session, connection): + assert connection.server is None + with session: + assert not session.server + super().__init__(session, channel=connection.channel) + + self.connection = connection + + assert self.session.pid is None + if self.session.launcher and self.session.launcher.pid != self.pid: + log.info( + "Launcher reported PID={0}, but server reported PID={1}", + self.session.launcher.pid, + self.pid, + ) + self.session.pid = self.pid + + session.server = self + + @property + def pid(self): + """Process ID of the debuggee process, as reported by the server.""" + return self.connection.pid + + @property + def ppid(self): + """Parent process ID of the debuggee process, as reported by the server.""" + return self.connection.ppid + + def initialize(self, request): + assert request.is_request("initialize") + self.connection.authenticate() + request = self.channel.propagate(request) + request.wait_for_response() + self.capabilities = self.Capabilities(self, request.response) + + # Generic request handler, used if there's no specific handler below. + @message_handler + def request(self, request): + # Do not delegate requests from the server by default. There is a security + # boundary between the server and the adapter, and we cannot trust arbitrary + # requests sent over that boundary, since they may contain arbitrary code + # that the client will execute - e.g. "runInTerminal". The adapter must only + # propagate requests that it knows are safe. + raise request.isnt_valid( + "Requests from the debug server to the client are not allowed." + ) + + # Generic event handler, used if there's no specific handler below. + @message_handler + def event(self, event): + self.client.propagate_after_start(event) + + @message_handler + def initialized_event(self, event): + # pydevd doesn't send it, but the adapter will send its own in any case. + pass + + @message_handler + def process_event(self, event): + # If there is a launcher, it's handling the process event. + if not self.launcher: + self.client.propagate_after_start(event) + + @message_handler + def continued_event(self, event): + # https://github.com/microsoft/ptvsd/issues/1530 + # + # DAP specification says that a step request implies that only the thread on + # which that step occurred is resumed for the duration of the step. However, + # for VS compatibility, pydevd can operate in a mode that resumes all threads + # instead. This is set according to the value of "steppingResumesAllThreads" + # in "launch" or "attach" request, which defaults to true. If explicitly set + # to false, pydevd will only resume the thread that was stepping. + # + # To ensure that the client is aware that other threads are getting resumed in + # that mode, pydevd sends a "continued" event with "allThreadsResumed": true. + # when responding to a step request. This ensures correct behavior in VSCode + # and other DAP-conformant clients. + # + # On the other hand, VS does not follow the DAP specification in this regard. + # When it requests a step, it assumes that all threads will be resumed, and + # does not expect to see "continued" events explicitly reflecting that fact. + # If such events are sent regardless, VS behaves erratically. Thus, we have + # to suppress them specifically for VS. + if self.client.client_id not in ("visualstudio", "vsformac"): + self.client.propagate_after_start(event) + + @message_handler + def exited_event(self, event: messaging.Event): + if event("pydevdReason", str, optional=True) == "processReplaced": + # The parent process used some API like exec() that replaced it with another + # process in situ. The connection will shut down immediately afterwards, but + # we need to keep the corresponding session alive long enough to report the + # subprocess to it. + self.connection.process_replaced = True + else: + # If there is a launcher, it's handling the exit code. + if not self.launcher: + self.client.propagate_after_start(event) + + @message_handler + def terminated_event(self, event): + # Do not propagate this, since we'll report our own. + self.channel.close() + + def detach_from_session(self): + with _lock: + self.is_connected = False + self.channel.handlers = self.connection + self.channel.name = self.channel.stream.name = str(self.connection) + self.connection.server = None + + def disconnect(self): + if self.connection.process_replaced: + # Wait for the replacement server to connect to the adapter, and to report + # itself to the client for this session if there is one. + log.info("{0} is waiting for replacement subprocess.", self) + session = self.session + if not session.client or not session.client.is_connected: + wait_for_connection( + session, lambda conn: conn.pid == self.pid, timeout=60 + ) + else: + self.wait_for( + lambda: ( + not session.client + or not session.client.is_connected + or any( + conn.pid == self.pid + for conn in session.client.known_subprocesses + ) + ), + timeout=60, + ) + with _lock: + _connections.remove(self.connection) + _connections_changed.set() + super().disconnect() + + +def serve(host="127.0.0.1", port=0): + global listener + listener = sockets.serve("Server", Connection, host, port) + sessions.report_sockets() + return listener.getsockname() + + +def is_serving(): + return listener is not None + + +def stop_serving(): + global listener + try: + if listener is not None: + listener.close() + listener = None + except Exception: + log.swallow_exception(level="warning") + sessions.report_sockets() + + +def connections(): + with _lock: + return list(_connections) + + +def wait_for_connection(session, predicate, timeout=None): + """Waits until there is a server matching the specified predicate connected to + this adapter, and returns the corresponding Connection. + + If there is more than one server connection already available, returns the oldest + one. + """ + + def wait_for_timeout(): + time.sleep(timeout) + wait_for_timeout.timed_out = True + with _lock: + _connections_changed.set() + + wait_for_timeout.timed_out = timeout == 0 + if timeout: + thread = threading.Thread( + target=wait_for_timeout, name="servers.wait_for_connection() timeout" + ) + thread.daemon = True + thread.start() + + if timeout != 0: + log.info("{0} waiting for connection from debug server...", session) + while True: + with _lock: + _connections_changed.clear() + conns = (conn for conn in _connections if predicate(conn)) + conn = next(conns, None) + if conn is not None or wait_for_timeout.timed_out: + return conn + _connections_changed.wait() + + +def wait_until_disconnected(): + """Blocks until all debug servers disconnect from the adapter. + + If there are no server connections, waits until at least one is established first, + before waiting for it to disconnect. + """ + while True: + _connections_changed.wait() + with _lock: + _connections_changed.clear() + if not len(_connections): + return + + +def dont_wait_for_first_connection(): + """Unblocks any pending wait_until_disconnected() call that is waiting on the + first server to connect. + """ + with _lock: + _connections_changed.set() + + +def inject(pid, debugpy_args, on_output): + host, port = listener.getsockname() + + cmdline = [ + sys.executable, + os.path.dirname(debugpy.__file__), + "--connect", + host + ":" + str(port), + ] + if adapter.access_token is not None: + cmdline += ["--adapter-access-token", adapter.access_token] + cmdline += debugpy_args + cmdline += ["--pid", str(pid)] + + log.info("Spawning attach-to-PID debugger injector: {0!r}", cmdline) + try: + injector = subprocess.Popen( + cmdline, + bufsize=0, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + except Exception as exc: + log.swallow_exception( + "Failed to inject debug server into process with PID={0}", pid + ) + raise messaging.MessageHandlingError( + "Failed to inject debug server into process with PID={0}: {1}".format( + pid, exc + ) + ) + + # We need to capture the output of the injector - needed so that it doesn't + # get blocked on a write() syscall (besides showing it to the user if it + # is taking longer than expected). + + output_collected = [] + output_collected.append("--- Starting attach to pid: {0} ---\n".format(pid)) + + def capture(stream): + nonlocal output_collected + try: + while True: + line = stream.readline() + if not line: + break + line = line.decode("utf-8", "replace") + output_collected.append(line) + log.info("Injector[PID={0}] output: {1}", pid, line.rstrip()) + log.info("Injector[PID={0}] exited.", pid) + except Exception: + s = io.StringIO() + traceback.print_exc(file=s) + on_output("stderr", s.getvalue()) + + threading.Thread( + target=capture, + name=f"Injector[PID={pid}] stdout", + args=(injector.stdout,), + daemon=True, + ).start() + + def info_on_timeout(): + nonlocal output_collected + taking_longer_than_expected = False + initial_time = time.time() + while True: + time.sleep(1) + returncode = injector.poll() + if returncode is not None: + if returncode != 0: + # Something didn't work out. Let's print more info to the user. + on_output( + "stderr", + "Attach to PID failed.\n\n", + ) + + old = output_collected + output_collected = [] + contents = "".join(old) + on_output("stderr", "".join(contents)) + break + + elapsed = time.time() - initial_time + on_output( + "stdout", "Attaching to PID: %s (elapsed: %.2fs).\n" % (pid, elapsed) + ) + + if not taking_longer_than_expected: + if elapsed > 10: + taking_longer_than_expected = True + if sys.platform in ("linux", "linux2"): + on_output( + "stdout", + "\nThe attach to PID is taking longer than expected.\n", + ) + on_output( + "stdout", + "On Linux it's possible to customize the value of\n", + ) + on_output( + "stdout", + "`PYDEVD_GDB_SCAN_SHARED_LIBRARIES` so that fewer libraries.\n", + ) + on_output( + "stdout", + "are scanned when searching for the needed symbols.\n\n", + ) + on_output( + "stdout", + "i.e.: set in your environment variables (and restart your editor/client\n", + ) + on_output( + "stdout", + "so that it picks up the updated environment variable value):\n\n", + ) + on_output( + "stdout", + "PYDEVD_GDB_SCAN_SHARED_LIBRARIES=libdl, libltdl, libc, libfreebl3\n\n", + ) + on_output( + "stdout", + "-- the actual library may be different (the gdb output typically\n", + ) + on_output( + "stdout", + "-- writes the libraries that will be used, so, it should be possible\n", + ) + on_output( + "stdout", + "-- to test other libraries if the above doesn't work).\n\n", + ) + if taking_longer_than_expected: + # If taking longer than expected, start showing the actual output to the user. + old = output_collected + output_collected = [] + contents = "".join(old) + if contents: + on_output("stderr", contents) + + threading.Thread( + target=info_on_timeout, name=f"Injector[PID={pid}] info on timeout", daemon=True + ).start() diff --git a/myenv/lib/python3.12/site-packages/debugpy/adapter/sessions.py b/myenv/lib/python3.12/site-packages/debugpy/adapter/sessions.py new file mode 100644 index 0000000..ca87483 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/adapter/sessions.py @@ -0,0 +1,293 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import itertools +import os +import signal +import threading +import time + +from debugpy import common +from debugpy.common import log, util +from debugpy.adapter import components, launchers, servers + + +_lock = threading.RLock() +_sessions = set() +_sessions_changed = threading.Event() + + +class Session(util.Observable): + """A debug session involving a client, an adapter, a launcher, and a debug server. + + The client and the adapter are always present, and at least one of launcher and debug + server is present, depending on the scenario. + """ + + _counter = itertools.count(1) + + def __init__(self): + from debugpy.adapter import clients + + super().__init__() + + self.lock = threading.RLock() + self.id = next(self._counter) + self._changed_condition = threading.Condition(self.lock) + + self.client = components.missing(self, clients.Client) + """The client component. Always present.""" + + self.launcher = components.missing(self, launchers.Launcher) + """The launcher componet. Always present in "launch" sessions, and never + present in "attach" sessions. + """ + + self.server = components.missing(self, servers.Server) + """The debug server component. Always present, unless this is a "launch" + session with "noDebug". + """ + + self.no_debug = None + """Whether this is a "noDebug" session.""" + + self.pid = None + """Process ID of the debuggee process.""" + + self.debug_options = {} + """Debug options as specified by "launch" or "attach" request.""" + + self.is_finalizing = False + """Whether finalize() has been invoked.""" + + self.observers += [lambda *_: self.notify_changed()] + + def __str__(self): + return f"Session[{self.id}]" + + def __enter__(self): + """Lock the session for exclusive access.""" + self.lock.acquire() + return self + + def __exit__(self, exc_type, exc_value, exc_tb): + """Unlock the session.""" + self.lock.release() + + def register(self): + with _lock: + _sessions.add(self) + _sessions_changed.set() + + def notify_changed(self): + with self: + self._changed_condition.notify_all() + + # A session is considered ended once all components disconnect, and there + # are no further incoming messages from anything to handle. + components = self.client, self.launcher, self.server + if all(not com or not com.is_connected for com in components): + with _lock: + if self in _sessions: + log.info("{0} has ended.", self) + _sessions.remove(self) + _sessions_changed.set() + + def wait_for(self, predicate, timeout=None): + """Waits until predicate() becomes true. + + The predicate is invoked with the session locked. If satisfied, the method + returns immediately. Otherwise, the lock is released (even if it was held + at entry), and the method blocks waiting for some attribute of either self, + self.client, self.server, or self.launcher to change. On every change, session + is re-locked and predicate is re-evaluated, until it is satisfied. + + While the session is unlocked, message handlers for components other than + the one that is waiting can run, but message handlers for that one are still + blocked. + + If timeout is not None, the method will unblock and return after that many + seconds regardless of whether the predicate was satisfied. The method returns + False if it timed out, and True otherwise. + """ + + def wait_for_timeout(): + time.sleep(timeout) + wait_for_timeout.timed_out = True + self.notify_changed() + + wait_for_timeout.timed_out = False + if timeout is not None: + thread = threading.Thread( + target=wait_for_timeout, name="Session.wait_for() timeout" + ) + thread.daemon = True + thread.start() + + with self: + while not predicate(): + if wait_for_timeout.timed_out: + return False + self._changed_condition.wait() + return True + + def finalize(self, why, terminate_debuggee=None): + """Finalizes the debug session. + + If the server is present, sends "disconnect" request with "terminateDebuggee" + set as specified request to it; waits for it to disconnect, allowing any + remaining messages from it to be handled; and closes the server channel. + + If the launcher is present, sends "terminate" request to it, regardless of the + value of terminate; waits for it to disconnect, allowing any remaining messages + from it to be handled; and closes the launcher channel. + + If the client is present, sends "terminated" event to it. + + If terminate_debuggee=None, it is treated as True if the session has a Launcher + component, and False otherwise. + """ + + if self.is_finalizing: + return + self.is_finalizing = True + log.info("{0}; finalizing {1}.", why, self) + + if terminate_debuggee is None: + terminate_debuggee = bool(self.launcher) + + try: + self._finalize(why, terminate_debuggee) + except Exception: + # Finalization should never fail, and if it does, the session is in an + # indeterminate and likely unrecoverable state, so just fail fast. + log.swallow_exception("Fatal error while finalizing {0}", self) + os._exit(1) + + log.info("{0} finalized.", self) + + def _finalize(self, why, terminate_debuggee): + # If the client started a session, and then disconnected before issuing "launch" + # or "attach", the main thread will be blocked waiting for the first server + # connection to come in - unblock it, so that we can exit. + servers.dont_wait_for_first_connection() + + if self.server: + if self.server.is_connected: + if terminate_debuggee and self.launcher and self.launcher.is_connected: + # If we were specifically asked to terminate the debuggee, and we + # can ask the launcher to kill it, do so instead of disconnecting + # from the server to prevent debuggee from running any more code. + self.launcher.terminate_debuggee() + else: + # Otherwise, let the server handle it the best it can. + try: + self.server.channel.request( + "disconnect", {"terminateDebuggee": terminate_debuggee} + ) + except Exception: + pass + self.server.detach_from_session() + + if self.launcher and self.launcher.is_connected: + # If there was a server, we just disconnected from it above, which should + # cause the debuggee process to exit, unless it is being replaced in situ - + # so let's wait for that first. + if self.server and not self.server.connection.process_replaced: + log.info('{0} waiting for "exited" event...', self) + if not self.wait_for( + lambda: self.launcher.exit_code is not None, + timeout=common.PROCESS_EXIT_TIMEOUT, + ): + log.warning('{0} timed out waiting for "exited" event.', self) + + # Terminate the debuggee process if it's still alive for any reason - + # whether it's because there was no server to handle graceful shutdown, + # or because the server couldn't handle it for some reason - unless the + # process is being replaced in situ. + if not (self.server and self.server.connection.process_replaced): + self.launcher.terminate_debuggee() + + # Wait until the launcher message queue fully drains. There is no timeout + # here, because the final "terminated" event will only come after reading + # user input in wait-on-exit scenarios. In addition, if the process was + # replaced in situ, the launcher might still have more output to capture + # from its replacement. + log.info("{0} waiting for {1} to disconnect...", self, self.launcher) + self.wait_for(lambda: not self.launcher.is_connected) + + try: + self.launcher.channel.close() + except Exception: + log.swallow_exception() + + if self.client: + if self.client.is_connected: + # Tell the client that debugging is over, but don't close the channel until it + # tells us to, via the "disconnect" request. + body = {} + if self.client.restart_requested: + body["restart"] = True + try: + self.client.channel.send_event("terminated", body) + except Exception: + pass + + if ( + self.client.start_request is not None + and self.client.start_request.command == "launch" + and not (self.server and self.server.connection.process_replaced) + ): + servers.stop_serving() + log.info( + '"launch" session ended - killing remaining debuggee processes.' + ) + + pids_killed = set() + if self.launcher and self.launcher.pid is not None: + # Already killed above. + pids_killed.add(self.launcher.pid) + + while True: + conns = [ + conn + for conn in servers.connections() + if conn.pid not in pids_killed + ] + if not len(conns): + break + for conn in conns: + log.info("Killing {0}", conn) + try: + os.kill(conn.pid, signal.SIGTERM) + except Exception: + log.swallow_exception("Failed to kill {0}", conn) + pids_killed.add(conn.pid) + + +def get(pid): + with _lock: + return next((session for session in _sessions if session.pid == pid), None) + + +def wait_until_ended(): + """Blocks until all sessions have ended. + + A session ends when all components that it manages disconnect from it. + """ + while True: + with _lock: + if not len(_sessions): + return + _sessions_changed.clear() + _sessions_changed.wait() + + +def report_sockets(): + if not _sessions: + return + session = sorted(_sessions, key=lambda session: session.id)[0] + client = session.client + if client is not None: + client.report_sockets() diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/common/__init__.py new file mode 100644 index 0000000..825d6b0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +from __future__ import annotations +import os +import typing + +if typing.TYPE_CHECKING: + __all__: list[str] + +__all__ = [] + +# The lower time bound for assuming that the process hasn't spawned successfully. +PROCESS_SPAWN_TIMEOUT = float(os.getenv("DEBUGPY_PROCESS_SPAWN_TIMEOUT", 60)) or None + +# The lower time bound for assuming that the process hasn't exited gracefully. +PROCESS_EXIT_TIMEOUT = float(os.getenv("DEBUGPY_PROCESS_EXIT_TIMEOUT", 30)) or None diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49531271b9a5e3999ce339b459721f2df061877b GIT binary patch literal 719 zcmaJ;&ubGw7@gToHa}`mv}q!kAb8Lo?4VwYP?I&r+B7yhKrjyESS5KZQh4Z7*NSp&y{Y2LJ+-o0Z`7i*!hIG@2okX%xn+9>j}(h= z;y#b^e@zt4Pp^Lu@dg}=3E;#=j>}OGX^aF6-Hiubt_IYks7ly2_k83BUZ3z4m(i|G zkP`|gWYaG4L;lQjZ!O)pi5TVNx^MKh4T~^jlJ3CrL)7ye$8!9D&? zcj)L^ZU6kF{9saC8yB_FLu~}|f>10C_2I^@zN3$>s_%kH>Heg!Ixe*K`A0AxTo6t_ E0Gf-y?EnA( literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/json.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84cbad7d7f53c4e873d9dc977b81569584e5d3b3 GIT binary patch literal 12566 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�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 NIC}UK0XsHi{|7OLj-CJj literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/singleton.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/singleton.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f6b42d0f1399b45da74d285a8c508b2c7f3b553 GIT binary patch literal 7982 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

    q2Z+Q9+5acfvG{QW4t0PL{SBV3oriUL8%u0G> zE=>y2*hmZ_5)#yML~Tf1yGL!sk{87ZK_V(-C6O$IsTUzx1YE$2L%csSm5h?un1cwN z6CeYa;UIi3*~f2H7iyuAN{G|qQ+{j8;8)SK+~A-Zlb0kBgm^3op)ScN-rhS`LSMbd z+pTl2yuEMkmD&AWg~a0-*ZBSZs4go~6BZNUt$hsO*ED&o7PQEeGcdZ~RAoadq~;8A zA;c-Ga@3+RMWqZyl{274y3`0lV%mIB4`5+t0~ZCTT6sCbwXja%t^os zlZ+$;i5whsC!J1jMzq>q;b{?12zYk8nyB~>t9hh!)W2mm4r`?m08i2==d8>d7>764 z+WyBKzu)no^+d+)UuH61|MKkhSJth_;a)nmcq->Uo^w~_+;#B3ZZSHX|F$DX)pGDk zcfKCEJWtk5sCxUg!4KYi|IHOo3*-zA@88|kkSaL58F)phyCYrh+P;5oX$=B=o*E?coHQ?cto#S53t zq=O4PA2R0oQ4 z{@(76*E@TAdNctx5kkaTE0+FK7Y4$8!PojU$4DF=Cfvh22;c}HdDsSfI3e;=ap5Q? zZl8E}=_ddnZlb6)E25lVBI}pP{V&w`H`ETkv2n)@Q+D^k%~DOwH~!qz;;>ihL#7)qLY(HgGHxICj5k9lbzRsr&yAD;rpn literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/stacks.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/stacks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..425f0e25da207788d21e178fd9a0db37e44979d0 GIT binary patch literal 2412 zcmahLO>Y}TbjIFY+nY_|G-(JfDVru#**3NNm9~O5QfU+gC=n8+q87+FyW?aXd)L}o zH+5p8R4Qshi;^BtTM4O1TtMN#k^caPS}E9Ub3mdTI3R^4psFX{?0VxIs&?d^_h#PA z`zg#KU)e*_xH<~Sg?k%p2;!&)GRlh}oUWWa^NWYC3Nl5-)S zCxa0moxXYEfXIbrWqxfbg(7T(r zeXPR6eviLu!is>A!E;CpT)`E-B51+vo+j1D>|P(s?)9-IEC*K`ujRu^=moyz$~<@g zmxXd@Rq!}rbn_O6UT}}!`6eYn3C+Dd$|CSN(Wg^C{Dx$5MI{AW&X|@PmTJ+mh+zZH zqBTC($9U<+l+TWxYlN;mf4CBl$LAuai^hy$&Ke^QnmhGA3wjpw9tU0qc zkX&HMQ9!gb$(zQR`C}F3by1u@UYQ#l(+!zLPPtB2!cGt@bb=tu3E3%60p8{9VA~Pwl*=t_ryBft?{Qcv z%8l_fo5&k>LQQ-?iA57*#3qJ3YU!Gu7$tPZHVX;xdzRQ|4XRJ(NFrY%#^pp#pG*`= z_Oxjniyt|fpkTLO@lu*q)I6L79jTcG|$7+Wxph%mR+f|-2N%vg;zHNQua4huJ^Vxe1MbA5SZ^(Ms2V%8 z7E9D(!`0aETI}Rw)WwTSZHu9m-Sw7TE9&PXb*bx7N37N{Q0*94>)8Jo36Y`2v-S4q z^6b*=o&Fo2)?bd@>%QB)BGmW1a_`jLQ!C-$qPsUDaBM?DeM9%9gNtJ;AO0TQbvtw` z^i`zR6R-Bfzb&ry46j8`Eb{B&mgVqLxGs&?rCoKYvo5uR$hy?=Z)+$bZtMYlwuTTN z_EbOlW9Kj2nN2VlsoV7w7A!>ETAKyrI#k<5l!5keEethr``okYZW(_c*v|2Q230Jz zU7gE;>~`G+wvFLeFN{i@!q2_)mT}pff!4v^WKfY!Lr%*q$fhi_XlQ;Or873MW| z8OTOIU1@=+dPaw&vGqKOtG)~dStDS@ce4!Bm-s~uWC{6ZU=%?%bWv~YP#5(hDEr$c zJ+GBubP1KvmEa{bixoVf@D9f`baqRI7f$Ida{7l!_u<2B(5BP5boIs1S13MQuK?l zCmR9G(Ds_tSC#sHmHMAjmV$T0e)LWE8$l2(*l7!j#)S!mvse*!gbQvVv{;^i@<6tg zp!FK8to<(Ct2&g$&L^_$X)89hw4gzuqwvuKFo9}Y0?!X@wV}3`YOTH1*50o#K4=|U z7^`>nER0=yx6X;z&tEVnR}@M(?$?u{Evt+w<#bjK1A?qd5EI$`xEVb QEbPT2n{Q$Xce~t%J^3bX76cDI$T#oJy!XBDy?p9)Tm<$xdltXP2z}Q< zW5&{1?13{w6b%u@)JX9VQR~Pun1y5|%TGy~j7U+cBc9*u?d}noD7I6C(McFH zNhlkQ0Y`2EOwm{G`kVgi{<(MaL;l6^V71`q$fy+x2Ddejq%Q9 P+rW1&T!igcPTlx7uYR2X literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/util.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/common/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4002cd3c4bff6c96030660ff49ee3fbadecf2760 GIT binary patch literal 6388 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 IOsx6;0M$q4mjD0& literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/json.py b/myenv/lib/python3.12/site-packages/debugpy/common/json.py new file mode 100644 index 0000000..6f3e2b2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/json.py @@ -0,0 +1,292 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +"""Improved JSON serialization. +""" + +import builtins +import json +import numbers +import operator + + +JsonDecoder = json.JSONDecoder + + +class JsonEncoder(json.JSONEncoder): + """Customizable JSON encoder. + + If the object implements __getstate__, then that method is invoked, and its + result is serialized instead of the object itself. + """ + + def default(self, value): + try: + get_state = value.__getstate__ + except AttributeError: + pass + else: + return get_state() + return super().default(value) + + +class JsonObject(object): + """A wrapped Python object that formats itself as JSON when asked for a string + representation via str() or format(). + """ + + json_encoder_factory = JsonEncoder + """Used by __format__ when format_spec is not empty.""" + + json_encoder = json_encoder_factory(indent=4) + """The default encoder used by __format__ when format_spec is empty.""" + + def __init__(self, value): + assert not isinstance(value, JsonObject) + self.value = value + + def __getstate__(self): + raise NotImplementedError + + def __repr__(self): + return builtins.repr(self.value) + + def __str__(self): + return format(self) + + def __format__(self, format_spec): + """If format_spec is empty, uses self.json_encoder to serialize self.value + as a string. Otherwise, format_spec is treated as an argument list to be + passed to self.json_encoder_factory - which defaults to JSONEncoder - and + then the resulting formatter is used to serialize self.value as a string. + + Example:: + + format("{0} {0:indent=4,sort_keys=True}", json.repr(x)) + """ + if format_spec: + # At this point, format_spec is a string that looks something like + # "indent=4,sort_keys=True". What we want is to build a function call + # from that which looks like: + # + # json_encoder_factory(indent=4,sort_keys=True) + # + # which we can then eval() to create our encoder instance. + make_encoder = "json_encoder_factory(" + format_spec + ")" + encoder = eval( + make_encoder, {"json_encoder_factory": self.json_encoder_factory} + ) + else: + encoder = self.json_encoder + return encoder.encode(self.value) + + +# JSON property validators, for use with MessageDict. +# +# A validator is invoked with the actual value of the JSON property passed to it as +# the sole argument; or if the property is missing in JSON, then () is passed. Note +# that None represents an actual null in JSON, while () is a missing value. +# +# The validator must either raise TypeError or ValueError describing why the property +# value is invalid, or else return the value of the property, possibly after performing +# some substitutions - e.g. replacing () with some default value. + + +def _converter(value, classinfo): + """Convert value (str) to number, otherwise return None if is not possible""" + for one_info in classinfo: + if issubclass(one_info, numbers.Number): + try: + return one_info(value) + except ValueError: + pass + + +def of_type(*classinfo, **kwargs): + """Returns a validator for a JSON property that requires it to have a value of + the specified type. If optional=True, () is also allowed. + + The meaning of classinfo is the same as for isinstance(). + """ + + assert len(classinfo) + optional = kwargs.pop("optional", False) + assert not len(kwargs) + + def validate(value): + if (optional and value == ()) or isinstance(value, classinfo): + return value + else: + converted_value = _converter(value, classinfo) + if converted_value: + return converted_value + + if not optional and value == (): + raise ValueError("must be specified") + raise TypeError("must be " + " or ".join(t.__name__ for t in classinfo)) + + return validate + + +def default(default): + """Returns a validator for a JSON property with a default value. + + The validator will only allow property values that have the same type as the + specified default value. + """ + + def validate(value): + if value == (): + return default + elif isinstance(value, type(default)): + return value + else: + raise TypeError("must be {0}".format(type(default).__name__)) + + return validate + + +def enum(*values, **kwargs): + """Returns a validator for a JSON enum. + + The validator will only allow the property to have one of the specified values. + + If optional=True, and the property is missing, the first value specified is used + as the default. + """ + + assert len(values) + optional = kwargs.pop("optional", False) + assert not len(kwargs) + + def validate(value): + if optional and value == (): + return values[0] + elif value in values: + return value + else: + raise ValueError("must be one of: {0!r}".format(list(values))) + + return validate + + +def array(validate_item=False, vectorize=False, size=None): + """Returns a validator for a JSON array. + + If the property is missing, it is treated as if it were []. Otherwise, it must + be a list. + + If validate_item=False, it's treated as if it were (lambda x: x) - i.e. any item + is considered valid, and is unchanged. If validate_item is a type or a tuple, + it's treated as if it were json.of_type(validate). + + Every item in the list is replaced with validate_item(item) in-place, propagating + any exceptions raised by the latter. If validate_item is a type or a tuple, it is + treated as if it were json.of_type(validate_item). + + If vectorize=True, and the value is neither a list nor a dict, it is treated as + if it were a single-element list containing that single value - e.g. "foo" is + then the same as ["foo"]; but {} is an error, and not [{}]. + + If size is not None, it can be an int, a tuple of one int, a tuple of two ints, + or a set. If it's an int, the array must have exactly that many elements. If it's + a tuple of one int, it's the minimum length. If it's a tuple of two ints, they + are the minimum and the maximum lengths. If it's a set, it's the set of sizes that + are valid - e.g. for {2, 4}, the array can be either 2 or 4 elements long. + """ + + if not validate_item: + validate_item = lambda x: x + elif isinstance(validate_item, type) or isinstance(validate_item, tuple): + validate_item = of_type(validate_item) + + if size is None: + validate_size = lambda _: True + elif isinstance(size, set): + size = {operator.index(n) for n in size} + validate_size = lambda value: ( + len(value) in size + or "must have {0} elements".format( + " or ".join(str(n) for n in sorted(size)) + ) + ) + elif isinstance(size, tuple): + assert 1 <= len(size) <= 2 + size = tuple(operator.index(n) for n in size) + min_len, max_len = (size + (None,))[0:2] + validate_size = lambda value: ( + "must have at least {0} elements".format(min_len) + if len(value) < min_len + else "must have at most {0} elements".format(max_len) + if max_len is not None and len(value) < max_len + else True + ) + else: + size = operator.index(size) + validate_size = lambda value: ( + len(value) == size or "must have {0} elements".format(size) + ) + + def validate(value): + if value == (): + value = [] + elif vectorize and not isinstance(value, (list, dict)): + value = [value] + + of_type(list)(value) + + size_err = validate_size(value) # True if valid, str if error + if size_err is not True: + raise ValueError(size_err) + + for i, item in enumerate(value): + try: + value[i] = validate_item(item) + except (TypeError, ValueError) as exc: + raise type(exc)(f"[{repr(i)}] {exc}") + return value + + return validate + + +def object(validate_value=False): + """Returns a validator for a JSON object. + + If the property is missing, it is treated as if it were {}. Otherwise, it must + be a dict. + + If validate_value=False, it's treated as if it were (lambda x: x) - i.e. any + value is considered valid, and is unchanged. If validate_value is a type or a + tuple, it's treated as if it were json.of_type(validate_value). + + Every value in the dict is replaced with validate_value(value) in-place, propagating + any exceptions raised by the latter. If validate_value is a type or a tuple, it is + treated as if it were json.of_type(validate_value). Keys are not affected. + """ + + if isinstance(validate_value, type) or isinstance(validate_value, tuple): + validate_value = of_type(validate_value) + + def validate(value): + if value == (): + return {} + + of_type(dict)(value) + if validate_value: + for k, v in value.items(): + try: + value[k] = validate_value(v) + except (TypeError, ValueError) as exc: + raise type(exc)(f"[{repr(k)}] {exc}") + return value + + return validate + + +def repr(value): + return JsonObject(value) + + +dumps = json.dumps +loads = json.loads diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/log.py b/myenv/lib/python3.12/site-packages/debugpy/common/log.py new file mode 100644 index 0000000..099e93c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/log.py @@ -0,0 +1,411 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import atexit +import contextlib +import functools +import inspect +import io +import os +import platform +import sys +import threading +import traceback + +import debugpy +from debugpy.common import json, timestamp, util + + +LEVELS = ("debug", "info", "warning", "error") +"""Logging levels, lowest to highest importance. +""" + +log_dir = os.getenv("DEBUGPY_LOG_DIR") +"""If not None, debugger logs its activity to a file named debugpy.*-.log +in the specified directory, where is the return value of os.getpid(). +""" + +timestamp_format = "09.3f" +"""Format spec used for timestamps. Can be changed to dial precision up or down. +""" + +_lock = threading.RLock() +_tls = threading.local() +_files = {} # filename -> LogFile +_levels = set() # combined for all log files + + +def _update_levels(): + global _levels + _levels = frozenset(level for file in _files.values() for level in file.levels) + + +class LogFile(object): + def __init__(self, filename, file, levels=LEVELS, close_file=True): + info("Also logging to {0}.", json.repr(filename)) + self.filename = filename + self.file = file + self.close_file = close_file + self._levels = frozenset(levels) + + with _lock: + _files[self.filename] = self + _update_levels() + info( + "{0} {1}\n{2} {3} ({4}-bit)\ndebugpy {5}", + platform.platform(), + platform.machine(), + platform.python_implementation(), + platform.python_version(), + 64 if sys.maxsize > 2**32 else 32, + debugpy.__version__, + _to_files=[self], + ) + + @property + def levels(self): + return self._levels + + @levels.setter + def levels(self, value): + with _lock: + self._levels = frozenset(LEVELS if value is all else value) + _update_levels() + + def write(self, level, output): + if level in self.levels: + try: + self.file.write(output) + self.file.flush() + except Exception: # pragma: no cover + pass + + def close(self): + with _lock: + del _files[self.filename] + _update_levels() + info("Not logging to {0} anymore.", json.repr(self.filename)) + + if self.close_file: + try: + self.file.close() + except Exception: # pragma: no cover + pass + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + +class NoLog(object): + file = filename = None + + __bool__ = __nonzero__ = lambda self: False + + def close(self): + pass + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + +# Used to inject a newline into stderr if logging there, to clean up the output +# when it's intermixed with regular prints from other sources. +def newline(level="info"): + with _lock: + stderr.write(level, "\n") + + +def write(level, text, _to_files=all): + assert level in LEVELS + + t = timestamp.current() + format_string = "{0}+{1:" + timestamp_format + "}: " + prefix = format_string.format(level[0].upper(), t) + + text = getattr(_tls, "prefix", "") + text + indent = "\n" + (" " * len(prefix)) + output = indent.join(text.split("\n")) + output = prefix + output + "\n\n" + + with _lock: + if _to_files is all: + _to_files = _files.values() + for file in _to_files: + file.write(level, output) + + return text + + +def write_format(level, format_string, *args, **kwargs): + # Don't spend cycles doing expensive formatting if we don't have to. Errors are + # always formatted, so that error() can return the text even if it's not logged. + if level != "error" and level not in _levels: + return + + try: + text = format_string.format(*args, **kwargs) + except Exception: # pragma: no cover + reraise_exception() + + return write(level, text, kwargs.pop("_to_files", all)) + + +debug = functools.partial(write_format, "debug") +info = functools.partial(write_format, "info") +warning = functools.partial(write_format, "warning") + + +def error(*args, **kwargs): + """Logs an error. + + Returns the output wrapped in AssertionError. Thus, the following:: + + raise log.error(s, ...) + + has the same effect as:: + + log.error(...) + assert False, (s.format(...)) + """ + return AssertionError(write_format("error", *args, **kwargs)) + + +def _exception(format_string="", *args, **kwargs): + level = kwargs.pop("level", "error") + exc_info = kwargs.pop("exc_info", sys.exc_info()) + + if format_string: + format_string += "\n\n" + format_string += "{exception}\nStack where logged:\n{stack}" + + exception = "".join(traceback.format_exception(*exc_info)) + + f = inspect.currentframe() + f = f.f_back if f else f # don't log this frame + try: + stack = "".join(traceback.format_stack(f)) + finally: + del f # avoid cycles + + write_format( + level, format_string, *args, exception=exception, stack=stack, **kwargs + ) + + +def swallow_exception(format_string="", *args, **kwargs): + """Logs an exception with full traceback. + + If format_string is specified, it is formatted with format(*args, **kwargs), and + prepended to the exception traceback on a separate line. + + If exc_info is specified, the exception it describes will be logged. Otherwise, + sys.exc_info() - i.e. the exception being handled currently - will be logged. + + If level is specified, the exception will be logged as a message of that level. + The default is "error". + """ + + _exception(format_string, *args, **kwargs) + + +def reraise_exception(format_string="", *args, **kwargs): + """Like swallow_exception(), but re-raises the current exception after logging it.""" + + assert "exc_info" not in kwargs + _exception(format_string, *args, **kwargs) + raise + + +def to_file(filename=None, prefix=None, levels=LEVELS): + """Starts logging all messages at the specified levels to the designated file. + + Either filename or prefix must be specified, but not both. + + If filename is specified, it designates the log file directly. + + If prefix is specified, the log file is automatically created in options.log_dir, + with filename computed as prefix + os.getpid(). If log_dir is None, no log file + is created, and the function returns immediately. + + If the file with the specified or computed name is already being used as a log + file, it is not overwritten, but its levels are updated as specified. + + The function returns an object with a close() method. When the object is closed, + logs are not written into that file anymore. Alternatively, the returned object + can be used in a with-statement: + + with log.to_file("some.log"): + # now also logging to some.log + # not logging to some.log anymore + """ + + assert (filename is not None) ^ (prefix is not None) + + if filename is None: + if log_dir is None: + return NoLog() + try: + os.makedirs(log_dir) + except OSError: # pragma: no cover + pass + filename = f"{log_dir}/{prefix}-{os.getpid()}.log" + + file = _files.get(filename) + if file is None: + file = LogFile(filename, io.open(filename, "w", encoding="utf-8"), levels) + else: + file.levels = levels + return file + + +@contextlib.contextmanager +def prefixed(format_string, *args, **kwargs): + """Adds a prefix to all messages logged from the current thread for the duration + of the context manager. + """ + prefix = format_string.format(*args, **kwargs) + old_prefix = getattr(_tls, "prefix", "") + _tls.prefix = prefix + old_prefix + try: + yield + finally: + _tls.prefix = old_prefix + + +def get_environment_description(header): + import sysconfig + import site # noqa + + result = [header, "\n\n"] + + def report(s, *args, **kwargs): + result.append(s.format(*args, **kwargs)) + + def report_paths(get_paths, label=None): + prefix = f" {label or get_paths}: " + + expr = None + if not callable(get_paths): + expr = get_paths + get_paths = lambda: util.evaluate(expr) + try: + paths = get_paths() + except AttributeError: + report("{0}\n", prefix) + return + except Exception: # pragma: no cover + swallow_exception( + "Error evaluating {0}", + repr(expr) if expr else util.srcnameof(get_paths), + level="info", + ) + return + + if not isinstance(paths, (list, tuple)): + paths = [paths] + + for p in sorted(paths): + report("{0}{1}", prefix, p) + if p is not None: + rp = os.path.realpath(p) + if p != rp: + report("({0})", rp) + report("\n") + + prefix = " " * len(prefix) + + report("System paths:\n") + report_paths("sys.executable") + report_paths("sys.prefix") + report_paths("sys.base_prefix") + report_paths("sys.real_prefix") + report_paths("site.getsitepackages()") + report_paths("site.getusersitepackages()") + + site_packages = [ + p + for p in sys.path + if os.path.exists(p) and os.path.basename(p) == "site-packages" + ] + report_paths(lambda: site_packages, "sys.path (site-packages)") + + for name in sysconfig.get_path_names(): + expr = "sysconfig.get_path({0!r})".format(name) + report_paths(expr) + + report_paths("os.__file__") + report_paths("threading.__file__") + report_paths("debugpy.__file__") + report("\n") + + importlib_metadata = None + try: + import importlib_metadata + except ImportError: # pragma: no cover + try: + from importlib import metadata as importlib_metadata + except ImportError: + pass + if importlib_metadata is None: # pragma: no cover + report("Cannot enumerate installed packages - missing importlib_metadata.") + else: + report("Installed packages:\n") + try: + for pkg in importlib_metadata.distributions(): + report(" {0}=={1}\n", pkg.name, pkg.version) + except Exception: # pragma: no cover + swallow_exception( + "Error while enumerating installed packages.", level="info" + ) + + return "".join(result).rstrip("\n") + + +def describe_environment(header): + info("{0}", get_environment_description(header)) + + +stderr = LogFile( + "", + sys.stderr, + levels=os.getenv("DEBUGPY_LOG_STDERR", "warning error").split(), + close_file=False, +) + + +@atexit.register +def _close_files(): + for file in tuple(_files.values()): + file.close() + + +# The following are helper shortcuts for printf debugging. They must never be used +# in production code. + + +def _repr(value): # pragma: no cover + warning("$REPR {0!r}", value) + + +def _vars(*names): # pragma: no cover + locals = inspect.currentframe().f_back.f_locals + if names: + locals = {name: locals[name] for name in names if name in locals} + warning("$VARS {0!r}", locals) + + +def _stack(): # pragma: no cover + stack = "\n".join(traceback.format_stack()) + warning("$STACK:\n\n{0}", stack) + + +def _threads(): # pragma: no cover + output = "\n".join([str(t) for t in threading.enumerate()]) + warning("$THREADS:\n\n{0}", output) diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/messaging.py b/myenv/lib/python3.12/site-packages/debugpy/common/messaging.py new file mode 100644 index 0000000..eb29c18 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/messaging.py @@ -0,0 +1,1506 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +"""An implementation of the session and presentation layers as used in the Debug +Adapter Protocol (DAP): channels and their lifetime, JSON messages, requests, +responses, and events. + +https://microsoft.github.io/debug-adapter-protocol/overview#base-protocol +""" + +from __future__ import annotations + +import collections +import contextlib +import functools +import itertools +import os +import socket +import sys +import threading + +from debugpy.common import json, log, util +from debugpy.common.util import hide_thread_from_debugger + + +class JsonIOError(IOError): + """Indicates that a read or write operation on JsonIOStream has failed.""" + + def __init__(self, *args, **kwargs): + stream = kwargs.pop("stream") + cause = kwargs.pop("cause", None) + if not len(args) and cause is not None: + args = [str(cause)] + super().__init__(*args, **kwargs) + + self.stream = stream + """The stream that couldn't be read or written. + + Set by JsonIOStream.read_json() and JsonIOStream.write_json(). + + JsonMessageChannel relies on this value to decide whether a NoMoreMessages + instance that bubbles up to the message loop is related to that loop. + """ + + self.cause = cause + """The underlying exception, if any.""" + + +class NoMoreMessages(JsonIOError, EOFError): + """Indicates that there are no more messages that can be read from or written + to a stream. + """ + + def __init__(self, *args, **kwargs): + args = args if len(args) else ["No more messages"] + super().__init__(*args, **kwargs) + + +class JsonIOStream(object): + """Implements a JSON value stream over two byte streams (input and output). + + Each value is encoded as a DAP packet, with metadata headers and a JSON payload. + """ + + MAX_BODY_SIZE = 0xFFFFFF + + json_decoder_factory = json.JsonDecoder + """Used by read_json() when decoder is None.""" + + json_encoder_factory = json.JsonEncoder + """Used by write_json() when encoder is None.""" + + @classmethod + def from_stdio(cls, name="stdio"): + """Creates a new instance that receives messages from sys.stdin, and sends + them to sys.stdout. + """ + return cls(sys.stdin.buffer, sys.stdout.buffer, name) + + @classmethod + def from_process(cls, process, name="stdio"): + """Creates a new instance that receives messages from process.stdin, and sends + them to process.stdout. + """ + return cls(process.stdout, process.stdin, name) + + @classmethod + def from_socket(cls, sock, name=None): + """Creates a new instance that sends and receives messages over a socket.""" + sock.settimeout(None) # make socket blocking + if name is None: + name = repr(sock) + + # TODO: investigate switching to buffered sockets; readline() on unbuffered + # sockets is very slow! Although the implementation of readline() itself is + # native code, it calls read(1) in a loop - and that then ultimately calls + # SocketIO.readinto(), which is implemented in Python. + socket_io = sock.makefile("rwb", 0) + + # SocketIO.close() doesn't close the underlying socket. + def cleanup(): + try: + sock.shutdown(socket.SHUT_RDWR) + except Exception: # pragma: no cover + pass + sock.close() + + return cls(socket_io, socket_io, name, cleanup) + + def __init__(self, reader, writer, name=None, cleanup=lambda: None): + """Creates a new JsonIOStream. + + reader must be a BytesIO-like object, from which incoming messages will be + read by read_json(). + + writer must be a BytesIO-like object, into which outgoing messages will be + written by write_json(). + + cleanup must be a callable; it will be invoked without arguments when the + stream is closed. + + reader.readline() must treat "\n" as the line terminator, and must leave "\r" + as is - it must not replace "\r\n" with "\n" automatically, as TextIO does. + """ + + if name is None: + name = f"reader={reader!r}, writer={writer!r}" + + self.name = name + self._reader = reader + self._writer = writer + self._cleanup = cleanup + self._closed = False + + def close(self): + """Closes the stream, the reader, and the writer.""" + + if self._closed: + return + self._closed = True + + log.debug("Closing {0} message stream", self.name) + try: + try: + # Close the writer first, so that the other end of the connection has + # its message loop waiting on read() unblocked. If there is an exception + # while closing the writer, we still want to try to close the reader - + # only one exception can bubble up, so if both fail, it'll be the one + # from reader. + try: + self._writer.close() + finally: + if self._reader is not self._writer: + self._reader.close() + finally: + self._cleanup() + except Exception: # pragma: no cover + log.reraise_exception("Error while closing {0} message stream", self.name) + + def _log_message(self, dir, data, logger=log.debug): + return logger("{0} {1} {2}", self.name, dir, data) + + def _read_line(self, reader): + line = b"" + while True: + try: + line += reader.readline() + except Exception as exc: + raise NoMoreMessages(str(exc), stream=self) + if not line: + raise NoMoreMessages(stream=self) + if line.endswith(b"\r\n"): + line = line[0:-2] + return line + + def read_json(self, decoder=None): + """Read a single JSON value from reader. + + Returns JSON value as parsed by decoder.decode(), or raises NoMoreMessages + if there are no more values to be read. + """ + + decoder = decoder if decoder is not None else self.json_decoder_factory() + reader = self._reader + read_line = functools.partial(self._read_line, reader) + + # If any error occurs while reading and parsing the message, log the original + # raw message data as is, so that it's possible to diagnose missing or invalid + # headers, encoding issues, JSON syntax errors etc. + def log_message_and_reraise_exception(format_string="", *args, **kwargs): + if format_string: + format_string += "\n\n" + format_string += "{name} -->\n{raw_lines}" + + raw_lines = b"".join(raw_chunks).split(b"\n") + raw_lines = "\n".join(repr(line) for line in raw_lines) + + log.reraise_exception( + format_string, *args, name=self.name, raw_lines=raw_lines, **kwargs + ) + + raw_chunks = [] + headers = {} + + while True: + try: + line = read_line() + except Exception: # pragma: no cover + # Only log it if we have already read some headers, and are looking + # for a blank line terminating them. If this is the very first read, + # there's no message data to log in any case, and the caller might + # be anticipating the error - e.g. NoMoreMessages on disconnect. + if headers: + log_message_and_reraise_exception( + "Error while reading message headers:" + ) + else: + raise + + raw_chunks += [line, b"\n"] + if line == b"": + break + + key, _, value = line.partition(b":") + headers[key] = value + + try: + length = int(headers[b"Content-Length"]) + if not (0 <= length <= self.MAX_BODY_SIZE): + raise ValueError + except (KeyError, ValueError): # pragma: no cover + try: + raise IOError("Content-Length is missing or invalid:") + except Exception: + log_message_and_reraise_exception() + + body_start = len(raw_chunks) + body_remaining = length + while body_remaining > 0: + try: + chunk = reader.read(body_remaining) + if not chunk: + raise EOFError + except Exception as exc: + # Not logged due to https://github.com/microsoft/ptvsd/issues/1699 + raise NoMoreMessages(str(exc), stream=self) + + raw_chunks.append(chunk) + body_remaining -= len(chunk) + assert body_remaining == 0 + + body = b"".join(raw_chunks[body_start:]) + try: + body = body.decode("utf-8") + except Exception: # pragma: no cover + log_message_and_reraise_exception() + + try: + body = decoder.decode(body) + except Exception: # pragma: no cover + log_message_and_reraise_exception() + + # If parsed successfully, log as JSON for readability. + self._log_message("-->", body) + return body + + def write_json(self, value, encoder=None): + """Write a single JSON value into writer. + + Value is written as encoded by encoder.encode(). + """ + + if self._closed: + # Don't log this - it's a common pattern to write to a stream while + # anticipating EOFError from it in case it got closed concurrently. + raise NoMoreMessages(stream=self) + + encoder = encoder if encoder is not None else self.json_encoder_factory() + writer = self._writer + + # Format the value as a message, and try to log any failures using as much + # information as we already have at the point of the failure. For example, + # if it fails after it is serialized to JSON, log that JSON. + + try: + body = encoder.encode(value) + except Exception: # pragma: no cover + self._log_message("<--", repr(value), logger=log.reraise_exception) + body = body.encode("utf-8") + + header = f"Content-Length: {len(body)}\r\n\r\n".encode("ascii") + data = header + body + data_written = 0 + try: + while data_written < len(data): + written = writer.write(data[data_written:]) + if written is not None: + data_written += written + writer.flush() + except Exception as exc: # pragma: no cover + self._log_message("<--", value, logger=log.swallow_exception) + raise JsonIOError(stream=self, cause=exc) + + self._log_message("<--", value) + + def __repr__(self): + return f"{type(self).__name__}({self.name!r})" + + +class MessageDict(collections.OrderedDict): + """A specialized dict that is used for JSON message payloads - Request.arguments, + Response.body, and Event.body. + + For all members that normally throw KeyError when a requested key is missing, this + dict raises InvalidMessageError instead. Thus, a message handler can skip checks + for missing properties, and just work directly with the payload on the assumption + that it is valid according to the protocol specification; if anything is missing, + it will be reported automatically in the proper manner. + + If the value for the requested key is itself a dict, it is returned as is, and not + automatically converted to MessageDict. Thus, to enable convenient chaining - e.g. + d["a"]["b"]["c"] - the dict must consistently use MessageDict instances rather than + vanilla dicts for all its values, recursively. This is guaranteed for the payload + of all freshly received messages (unless and until it is mutated), but there is no + such guarantee for outgoing messages. + """ + + def __init__(self, message, items=None): + assert message is None or isinstance(message, Message) + + if items is None: + super().__init__() + else: + super().__init__(items) + + self.message = message + """The Message object that owns this dict. + + For any instance exposed via a Message object corresponding to some incoming + message, it is guaranteed to reference that Message object. There is no similar + guarantee for outgoing messages. + """ + + def __repr__(self): + try: + return format(json.repr(self)) + except Exception: # pragma: no cover + return super().__repr__() + + def __call__(self, key, validate, optional=False): + """Like get(), but with validation. + + The item is first retrieved as if with self.get(key, default=()) - the default + value is () rather than None, so that JSON nulls are distinguishable from + missing properties. + + If optional=True, and the value is (), it's returned as is. Otherwise, the + item is validated by invoking validate(item) on it. + + If validate=False, it's treated as if it were (lambda x: x) - i.e. any value + is considered valid, and is returned unchanged. If validate is a type or a + tuple, it's treated as json.of_type(validate). Otherwise, if validate is not + callable(), it's treated as json.default(validate). + + If validate() returns successfully, the item is substituted with the value + it returns - thus, the validator can e.g. replace () with a suitable default + value for the property. + + If validate() raises TypeError or ValueError, raises InvalidMessageError with + the same text that applies_to(self.messages). + + See debugpy.common.json for reusable validators. + """ + + if not validate: + validate = lambda x: x + elif isinstance(validate, type) or isinstance(validate, tuple): + validate = json.of_type(validate, optional=optional) + elif not callable(validate): + validate = json.default(validate) + + value = self.get(key, ()) + try: + value = validate(value) + except (TypeError, ValueError) as exc: + message = Message if self.message is None else self.message + err = str(exc) + if not err.startswith("["): + err = " " + err + raise message.isnt_valid("{0}{1}", json.repr(key), err) + return value + + def _invalid_if_no_key(func): + def wrap(self, key, *args, **kwargs): + try: + return func(self, key, *args, **kwargs) + except KeyError: + message = Message if self.message is None else self.message + raise message.isnt_valid("missing property {0!r}", key) + + return wrap + + __getitem__ = _invalid_if_no_key(collections.OrderedDict.__getitem__) + __delitem__ = _invalid_if_no_key(collections.OrderedDict.__delitem__) + pop = _invalid_if_no_key(collections.OrderedDict.pop) + + del _invalid_if_no_key + + +def _payload(value): + """JSON validator for message payload. + + If that value is missing or null, it is treated as if it were {}. + """ + + if value is not None and value != (): + if isinstance(value, dict): # can be int, str, list... + assert isinstance(value, MessageDict) + return value + + # Missing payload. Construct a dummy MessageDict, and make it look like it was + # deserialized. See JsonMessageChannel._parse_incoming_message for why it needs + # to have associate_with(). + + def associate_with(message): + value.message = message + + value = MessageDict(None) + value.associate_with = associate_with + return value + + +class Message(object): + """Represents a fully parsed incoming or outgoing message. + + https://microsoft.github.io/debug-adapter-protocol/specification#protocolmessage + """ + + def __init__(self, channel, seq, json=None): + self.channel = channel + + self.seq = seq + """Sequence number of the message in its channel. + + This can be None for synthesized Responses. + """ + + self.json = json + """For incoming messages, the MessageDict containing raw JSON from which + this message was originally parsed. + """ + + def __str__(self): + return json.repr(self.json) if self.json is not None else repr(self) + + def describe(self): + """A brief description of the message that is enough to identify it. + + Examples: + '#1 request "launch" from IDE' + '#2 response to #1 request "launch" from IDE'. + """ + raise NotImplementedError + + @property + def payload(self) -> MessageDict: + """Payload of the message - self.body or self.arguments, depending on the + message type. + """ + raise NotImplementedError + + def __call__(self, *args, **kwargs): + """Same as self.payload(...).""" + return self.payload(*args, **kwargs) + + def __contains__(self, key): + """Same as (key in self.payload).""" + return key in self.payload + + def is_event(self, *event): + """Returns True if this message is an Event of one of the specified types.""" + if not isinstance(self, Event): + return False + return event == () or self.event in event + + def is_request(self, *command): + """Returns True if this message is a Request of one of the specified types.""" + if not isinstance(self, Request): + return False + return command == () or self.command in command + + def is_response(self, *command): + """Returns True if this message is a Response to a request of one of the + specified types. + """ + if not isinstance(self, Response): + return False + return command == () or self.request.command in command + + def error(self, exc_type, format_string, *args, **kwargs): + """Returns a new exception of the specified type from the point at which it is + invoked, with the specified formatted message as the reason. + + The resulting exception will have its cause set to the Message object on which + error() was called. Additionally, if that message is a Request, a failure + response is immediately sent. + """ + + assert issubclass(exc_type, MessageHandlingError) + + silent = kwargs.pop("silent", False) + reason = format_string.format(*args, **kwargs) + exc = exc_type(reason, self, silent) # will log it + + if isinstance(self, Request): + self.respond(exc) + return exc + + def isnt_valid(self, *args, **kwargs): + """Same as self.error(InvalidMessageError, ...).""" + return self.error(InvalidMessageError, *args, **kwargs) + + def cant_handle(self, *args, **kwargs): + """Same as self.error(MessageHandlingError, ...).""" + return self.error(MessageHandlingError, *args, **kwargs) + + +class Event(Message): + """Represents an incoming event. + + https://microsoft.github.io/debug-adapter-protocol/specification#event + + It is guaranteed that body is a MessageDict associated with this Event, and so + are all the nested dicts in it. If "body" was missing or null in JSON, body is + an empty dict. + + To handle the event, JsonMessageChannel tries to find a handler for this event in + JsonMessageChannel.handlers. Given event="X", if handlers.X_event exists, then it + is the specific handler for this event. Otherwise, handlers.event must exist, and + it is the generic handler for this event. A missing handler is a fatal error. + + No further incoming messages are processed until the handler returns, except for + responses to requests that have wait_for_response() invoked on them. + + To report failure to handle the event, the handler must raise an instance of + MessageHandlingError that applies_to() the Event object it was handling. Any such + failure is logged, after which the message loop moves on to the next message. + + Helper methods Message.isnt_valid() and Message.cant_handle() can be used to raise + the appropriate exception type that applies_to() the Event object. + """ + + def __init__(self, channel, seq, event, body, json=None): + super().__init__(channel, seq, json) + + self.event = event + + if isinstance(body, MessageDict) and hasattr(body, "associate_with"): + body.associate_with(self) + self.body = body + + def describe(self): + return f"#{self.seq} event {json.repr(self.event)} from {self.channel}" + + @property + def payload(self): + return self.body + + @staticmethod + def _parse(channel, message_dict): + seq = message_dict("seq", int) + event = message_dict("event", str) + body = message_dict("body", _payload) + message = Event(channel, seq, event, body, json=message_dict) + channel._enqueue_handlers(message, message._handle) + + def _handle(self): + channel = self.channel + handler = channel._get_handler_for("event", self.event) + try: + try: + result = handler(self) + assert ( + result is None + ), f"Handler {util.srcnameof(handler)} tried to respond to {self.describe()}." + except MessageHandlingError as exc: + if not exc.applies_to(self): + raise + log.error( + "Handler {0}\ncouldn't handle {1}:\n{2}", + util.srcnameof(handler), + self.describe(), + str(exc), + ) + except Exception: + log.reraise_exception( + "Handler {0}\ncouldn't handle {1}:", + util.srcnameof(handler), + self.describe(), + ) + + +NO_RESPONSE = object() +"""Can be returned from a request handler in lieu of the response body, to indicate +that no response is to be sent. + +Request.respond() must be invoked explicitly at some later point to provide a response. +""" + + +class Request(Message): + """Represents an incoming or an outgoing request. + + Incoming requests are represented directly by instances of this class. + + Outgoing requests are represented by instances of OutgoingRequest, which provides + additional functionality to handle responses. + + For incoming requests, it is guaranteed that arguments is a MessageDict associated + with this Request, and so are all the nested dicts in it. If "arguments" was missing + or null in JSON, arguments is an empty dict. + + To handle the request, JsonMessageChannel tries to find a handler for this request + in JsonMessageChannel.handlers. Given command="X", if handlers.X_request exists, + then it is the specific handler for this request. Otherwise, handlers.request must + exist, and it is the generic handler for this request. A missing handler is a fatal + error. + + The handler is then invoked with the Request object as its sole argument. + + If the handler itself invokes respond() on the Request at any point, then it must + not return any value. + + Otherwise, if the handler returns NO_RESPONSE, no response to the request is sent. + It must be sent manually at some later point via respond(). + + Otherwise, a response to the request is sent with the returned value as the body. + + To fail the request, the handler can return an instance of MessageHandlingError, + or respond() with one, or raise one such that it applies_to() the Request object + being handled. + + Helper methods Message.isnt_valid() and Message.cant_handle() can be used to raise + the appropriate exception type that applies_to() the Request object. + """ + + def __init__(self, channel, seq, command, arguments, json=None): + super().__init__(channel, seq, json) + + self.command = command + + if isinstance(arguments, MessageDict) and hasattr(arguments, "associate_with"): + arguments.associate_with(self) + self.arguments = arguments + + self.response = None + """Response to this request. + + For incoming requests, it is set as soon as the request handler returns. + + For outgoing requests, it is set as soon as the response is received, and + before self._handle_response is invoked. + """ + + def describe(self): + return f"#{self.seq} request {json.repr(self.command)} from {self.channel}" + + @property + def payload(self): + return self.arguments + + def respond(self, body): + assert self.response is None + d = {"type": "response", "request_seq": self.seq, "command": self.command} + + if isinstance(body, Exception): + d["success"] = False + d["message"] = str(body) + else: + d["success"] = True + if body is not None and body != {}: + d["body"] = body + + with self.channel._send_message(d) as seq: + pass + self.response = Response(self.channel, seq, self, body) + + @staticmethod + def _parse(channel, message_dict): + seq = message_dict("seq", int) + command = message_dict("command", str) + arguments = message_dict("arguments", _payload) + message = Request(channel, seq, command, arguments, json=message_dict) + channel._enqueue_handlers(message, message._handle) + + def _handle(self): + channel = self.channel + handler = channel._get_handler_for("request", self.command) + try: + try: + result = handler(self) + except MessageHandlingError as exc: + if not exc.applies_to(self): + raise + result = exc + log.error( + "Handler {0}\ncouldn't handle {1}:\n{2}", + util.srcnameof(handler), + self.describe(), + str(exc), + ) + + if result is NO_RESPONSE: + assert self.response is None, ( + "Handler {0} for {1} must not return NO_RESPONSE if it has already " + "invoked request.respond().".format( + util.srcnameof(handler), self.describe() + ) + ) + elif self.response is not None: + assert result is None or result is self.response.body, ( + "Handler {0} for {1} must not return a response body if it has " + "already invoked request.respond().".format( + util.srcnameof(handler), self.describe() + ) + ) + else: + assert result is not None, ( + "Handler {0} for {1} must either call request.respond() before it " + "returns, or return the response body, or return NO_RESPONSE.".format( + util.srcnameof(handler), self.describe() + ) + ) + try: + self.respond(result) + except NoMoreMessages: + log.warning( + "Channel was closed before the response from handler {0} to {1} could be sent", + util.srcnameof(handler), + self.describe(), + ) + + except Exception: + log.reraise_exception( + "Handler {0}\ncouldn't handle {1}:", + util.srcnameof(handler), + self.describe(), + ) + + +class OutgoingRequest(Request): + """Represents an outgoing request, for which it is possible to wait for a + response to be received, and register a response handler. + """ + + _parse = _handle = None + + def __init__(self, channel, seq, command, arguments): + super().__init__(channel, seq, command, arguments) + self._response_handlers = [] + + def describe(self): + return f"{self.seq} request {json.repr(self.command)} to {self.channel}" + + def wait_for_response(self, raise_if_failed=True): + """Waits until a response is received for this request, records the Response + object for it in self.response, and returns response.body. + + If no response was received from the other party before the channel closed, + self.response is a synthesized Response with body=NoMoreMessages(). + + If raise_if_failed=True and response.success is False, raises response.body + instead of returning. + """ + + with self.channel: + while self.response is None: + self.channel._handlers_enqueued.wait() + + if raise_if_failed and not self.response.success: + raise self.response.body + return self.response.body + + def on_response(self, response_handler): + """Registers a handler to invoke when a response is received for this request. + The handler is invoked with Response as its sole argument. + + If response has already been received, invokes the handler immediately. + + It is guaranteed that self.response is set before the handler is invoked. + If no response was received from the other party before the channel closed, + self.response is a dummy Response with body=NoMoreMessages(). + + The handler is always invoked asynchronously on an unspecified background + thread - thus, the caller of on_response() can never be blocked or deadlocked + by the handler. + + No further incoming messages are processed until the handler returns, except for + responses to requests that have wait_for_response() invoked on them. + """ + + with self.channel: + self._response_handlers.append(response_handler) + self._enqueue_response_handlers() + + def _enqueue_response_handlers(self): + response = self.response + if response is None: + # Response._parse() will submit the handlers when response is received. + return + + def run_handlers(): + for handler in handlers: + try: + try: + handler(response) + except MessageHandlingError as exc: + if not exc.applies_to(response): + raise + log.error( + "Handler {0}\ncouldn't handle {1}:\n{2}", + util.srcnameof(handler), + response.describe(), + str(exc), + ) + except Exception: + log.reraise_exception( + "Handler {0}\ncouldn't handle {1}:", + util.srcnameof(handler), + response.describe(), + ) + + handlers = self._response_handlers[:] + self.channel._enqueue_handlers(response, run_handlers) + del self._response_handlers[:] + + +class Response(Message): + """Represents an incoming or an outgoing response to a Request. + + https://microsoft.github.io/debug-adapter-protocol/specification#response + + error_message corresponds to "message" in JSON, and is renamed for clarity. + + If success is False, body is None. Otherwise, it is a MessageDict associated + with this Response, and so are all the nested dicts in it. If "body" was missing + or null in JSON, body is an empty dict. + + If this is a response to an outgoing request, it will be handled by the handler + registered via self.request.on_response(), if any. + + Regardless of whether there is such a handler, OutgoingRequest.wait_for_response() + can also be used to retrieve and handle the response. If there is a handler, it is + executed before wait_for_response() returns. + + No further incoming messages are processed until the handler returns, except for + responses to requests that have wait_for_response() invoked on them. + + To report failure to handle the event, the handler must raise an instance of + MessageHandlingError that applies_to() the Response object it was handling. Any + such failure is logged, after which the message loop moves on to the next message. + + Helper methods Message.isnt_valid() and Message.cant_handle() can be used to raise + the appropriate exception type that applies_to() the Response object. + """ + + def __init__(self, channel, seq, request, body, json=None): + super().__init__(channel, seq, json) + + self.request = request + """The request to which this is the response.""" + + if isinstance(body, MessageDict) and hasattr(body, "associate_with"): + body.associate_with(self) + self.body = body + """Body of the response if the request was successful, or an instance + of some class derived from Exception it it was not. + + If a response was received from the other side, but request failed, it is an + instance of MessageHandlingError containing the received error message. If the + error message starts with InvalidMessageError.PREFIX, then it's an instance of + the InvalidMessageError specifically, and that prefix is stripped. + + If no response was received from the other party before the channel closed, + it is an instance of NoMoreMessages. + """ + + def describe(self): + return f"#{self.seq} response to {self.request.describe()}" + + @property + def payload(self): + return self.body + + @property + def success(self): + """Whether the request succeeded or not.""" + return not isinstance(self.body, Exception) + + @property + def result(self): + """Result of the request. Returns the value of response.body, unless it + is an exception, in which case it is raised instead. + """ + if self.success: + return self.body + else: + raise self.body + + @staticmethod + def _parse(channel, message_dict, body=None): + seq = message_dict("seq", int) if (body is None) else None + request_seq = message_dict("request_seq", int) + command = message_dict("command", str) + success = message_dict("success", bool) + if body is None: + if success: + body = message_dict("body", _payload) + else: + error_message = message_dict("message", str) + exc_type = MessageHandlingError + if error_message.startswith(InvalidMessageError.PREFIX): + error_message = error_message[len(InvalidMessageError.PREFIX) :] + exc_type = InvalidMessageError + body = exc_type(error_message, silent=True) + + try: + with channel: + request = channel._sent_requests.pop(request_seq) + known_request = True + except KeyError: + # Synthetic Request that only has seq and command as specified in response + # JSON, for error reporting purposes. + request = OutgoingRequest(channel, request_seq, command, "") + known_request = False + + if not success: + body.cause = request + + response = Response(channel, seq, request, body, json=message_dict) + + with channel: + request.response = response + request._enqueue_response_handlers() + + if known_request: + return response + else: + raise response.isnt_valid( + "request_seq={0} does not match any known request", request_seq + ) + + +class Disconnect(Message): + """A dummy message used to represent disconnect. It's always the last message + received from any channel. + """ + + def __init__(self, channel): + super().__init__(channel, None) + + def describe(self): + return f"disconnect from {self.channel}" + + +class MessageHandlingError(Exception): + """Indicates that a message couldn't be handled for some reason. + + If the reason is a contract violation - i.e. the message that was handled did not + conform to the protocol specification - InvalidMessageError, which is a subclass, + should be used instead. + + If any message handler raises an exception not derived from this class, it will + escape the message loop unhandled, and terminate the process. + + If any message handler raises this exception, but applies_to(message) is False, it + is treated as if it was a generic exception, as desribed above. Thus, if a request + handler issues another request of its own, and that one fails, the failure is not + silently propagated. However, a request that is delegated via Request.delegate() + will also propagate failures back automatically. For manual propagation, catch the + exception, and call exc.propagate(). + + If any event handler raises this exception, and applies_to(event) is True, the + exception is silently swallowed by the message loop. + + If any request handler raises this exception, and applies_to(request) is True, the + exception is silently swallowed by the message loop, and a failure response is sent + with "message" set to str(reason). + + Note that, while errors are not logged when they're swallowed by the message loop, + by that time they have already been logged by their __init__ (when instantiated). + """ + + def __init__(self, reason, cause=None, silent=False): + """Creates a new instance of this class, and immediately logs the exception. + + Message handling errors are logged immediately unless silent=True, so that the + precise context in which they occured can be determined from the surrounding + log entries. + """ + + self.reason = reason + """Why it couldn't be handled. This can be any object, but usually it's either + str or Exception. + """ + + assert cause is None or isinstance(cause, Message) + self.cause = cause + """The Message object for the message that couldn't be handled. For responses + to unknown requests, this is a synthetic Request. + """ + + if not silent: + try: + raise self + except MessageHandlingError: + log.swallow_exception() + + def __hash__(self): + return hash((self.reason, id(self.cause))) + + def __eq__(self, other): + if not isinstance(other, MessageHandlingError): + return NotImplemented + if type(self) is not type(other): + return NotImplemented + if self.reason != other.reason: + return False + if self.cause is not None and other.cause is not None: + if self.cause.seq != other.cause.seq: + return False + return True + + def __ne__(self, other): + return not self == other + + def __str__(self): + return str(self.reason) + + def __repr__(self): + s = type(self).__name__ + if self.cause is None: + s += f"reason={self.reason!r})" + else: + s += f"channel={self.cause.channel.name!r}, cause={self.cause.seq!r}, reason={self.reason!r})" + return s + + def applies_to(self, message): + """Whether this MessageHandlingError can be treated as a reason why the + handling of message failed. + + If self.cause is None, this is always true. + + If self.cause is not None, this is only true if cause is message. + """ + return self.cause is None or self.cause is message + + def propagate(self, new_cause): + """Propagates this error, raising a new instance of the same class with the + same reason, but a different cause. + """ + raise type(self)(self.reason, new_cause, silent=True) + + +class InvalidMessageError(MessageHandlingError): + """Indicates that an incoming message did not follow the protocol specification - + for example, it was missing properties that are required, or the message itself + is not allowed in the current state. + + Raised by MessageDict in lieu of KeyError for missing keys. + """ + + PREFIX = "Invalid message: " + """Automatically prepended to the "message" property in JSON responses, when the + handler raises InvalidMessageError. + + If a failed response has "message" property that starts with this prefix, it is + reported as InvalidMessageError rather than MessageHandlingError. + """ + + def __str__(self): + return InvalidMessageError.PREFIX + str(self.reason) + + +class JsonMessageChannel(object): + """Implements a JSON message channel on top of a raw JSON message stream, with + support for DAP requests, responses, and events. + + The channel can be locked for exclusive use via the with-statement:: + + with channel: + channel.send_request(...) + # No interleaving messages can be sent here from other threads. + channel.send_event(...) + """ + + def __init__(self, stream, handlers=None, name=None): + self.stream = stream + self.handlers = handlers + self.name = name if name is not None else stream.name + self.started = False + self._lock = threading.RLock() + self._closed = False + self._seq_iter = itertools.count(1) + self._sent_requests = {} # {seq: Request} + self._handler_queue = [] # [(what, handler)] + self._handlers_enqueued = threading.Condition(self._lock) + self._handler_thread = None + self._parser_thread = None + + def __str__(self): + return self.name + + def __repr__(self): + return f"{type(self).__name__}({self.name!r})" + + def __enter__(self): + self._lock.acquire() + return self + + def __exit__(self, exc_type, exc_value, exc_tb): + self._lock.release() + + def close(self): + """Closes the underlying stream. + + This does not immediately terminate any handlers that are already executing, + but they will be unable to respond. No new request or event handlers will + execute after this method is called, even for messages that have already been + received. However, response handlers will continue to executed for any request + that is still pending, as will any handlers registered via on_response(). + """ + with self: + if not self._closed: + self._closed = True + self.stream.close() + + def start(self): + """Starts a message loop which parses incoming messages and invokes handlers + for them on a background thread, until the channel is closed. + + Incoming messages, including responses to requests, will not be processed at + all until this is invoked. + """ + + assert not self.started + self.started = True + + self._parser_thread = threading.Thread( + target=self._parse_incoming_messages, name=f"{self} message parser" + ) + + hide_thread_from_debugger(self._parser_thread) + self._parser_thread.daemon = True + self._parser_thread.start() + + def wait(self): + """Waits for the message loop to terminate, and for all enqueued Response + message handlers to finish executing. + """ + parser_thread = self._parser_thread + try: + if parser_thread is not None: + parser_thread.join() + except AssertionError: + log.debug("Handled error joining parser thread.") + try: + handler_thread = self._handler_thread + if handler_thread is not None: + handler_thread.join() + except AssertionError: + log.debug("Handled error joining handler thread.") + + # Order of keys for _prettify() - follows the order of properties in + # https://microsoft.github.io/debug-adapter-protocol/specification + _prettify_order = ( + "seq", + "type", + "request_seq", + "success", + "command", + "event", + "message", + "arguments", + "body", + "error", + ) + + def _prettify(self, message_dict): + """Reorders items in a MessageDict such that it is more readable.""" + for key in self._prettify_order: + if key not in message_dict: + continue + value = message_dict[key] + del message_dict[key] + message_dict[key] = value + + @contextlib.contextmanager + def _send_message(self, message): + """Sends a new message to the other party. + + Generates a new sequence number for the message, and provides it to the + caller before the message is sent, using the context manager protocol:: + + with send_message(...) as seq: + # The message hasn't been sent yet. + ... + # Now the message has been sent. + + Safe to call concurrently for the same channel from different threads. + """ + + assert "seq" not in message + with self: + seq = next(self._seq_iter) + + message = MessageDict(None, message) + message["seq"] = seq + self._prettify(message) + + with self: + yield seq + self.stream.write_json(message) + + def send_request(self, command, arguments=None, on_before_send=None): + """Sends a new request, and returns the OutgoingRequest object for it. + + If arguments is None or {}, "arguments" will be omitted in JSON. + + If on_before_send is not None, invokes on_before_send() with the request + object as the sole argument, before the request actually gets sent. + + Does not wait for response - use OutgoingRequest.wait_for_response(). + + Safe to call concurrently for the same channel from different threads. + """ + + d = {"type": "request", "command": command} + if arguments is not None and arguments != {}: + d["arguments"] = arguments + + with self._send_message(d) as seq: + request = OutgoingRequest(self, seq, command, arguments) + if on_before_send is not None: + on_before_send(request) + self._sent_requests[seq] = request + return request + + def send_event(self, event, body=None): + """Sends a new event. + + If body is None or {}, "body" will be omitted in JSON. + + Safe to call concurrently for the same channel from different threads. + """ + + d = {"type": "event", "event": event} + if body is not None and body != {}: + d["body"] = body + + with self._send_message(d): + pass + + def request(self, *args, **kwargs): + """Same as send_request(...).wait_for_response()""" + return self.send_request(*args, **kwargs).wait_for_response() + + def propagate(self, message): + """Sends a new message with the same type and payload. + + If it was a request, returns the new OutgoingRequest object for it. + """ + assert message.is_request() or message.is_event() + if message.is_request(): + return self.send_request(message.command, message.arguments) + else: + self.send_event(message.event, message.body) + + def delegate(self, message): + """Like propagate(message).wait_for_response(), but will also propagate + any resulting MessageHandlingError back. + """ + try: + result = self.propagate(message) + if result.is_request(): + result = result.wait_for_response() + return result + except MessageHandlingError as exc: + exc.propagate(message) + + def _parse_incoming_messages(self): + log.debug("Starting message loop for channel {0}", self) + try: + while True: + self._parse_incoming_message() + + except NoMoreMessages as exc: + log.debug("Exiting message loop for channel {0}: {1}", self, exc) + with self: + # Generate dummy responses for all outstanding requests. + err_message = str(exc) + + # Response._parse() will remove items from _sent_requests, so + # make a snapshot before iterating. + sent_requests = list(self._sent_requests.values()) + + for request in sent_requests: + response_json = MessageDict( + None, + { + "seq": -1, + "request_seq": request.seq, + "command": request.command, + "success": False, + "message": err_message, + }, + ) + Response._parse(self, response_json, body=exc) + assert not len(self._sent_requests) + + self._enqueue_handlers(Disconnect(self), self._handle_disconnect) + self.close() + + _message_parsers = { + "event": Event._parse, + "request": Request._parse, + "response": Response._parse, + } + + def _parse_incoming_message(self): + """Reads incoming messages, parses them, and puts handlers into the queue + for _run_handlers() to invoke, until the channel is closed. + """ + + # Set up a dedicated decoder for this message, to create MessageDict instances + # for all JSON objects, and track them so that they can be later wired up to + # the Message they belong to, once it is instantiated. + def object_hook(d): + d = MessageDict(None, d) + if "seq" in d: + self._prettify(d) + d.associate_with = associate_with + message_dicts.append(d) + return d + + # A hack to work around circular dependency between messages, and instances of + # MessageDict in their payload. We need to set message for all of them, but it + # cannot be done until the actual Message is created - which happens after the + # dicts are created during deserialization. + # + # So, upon deserialization, every dict in the message payload gets a method + # that can be called to set MessageDict.message for *all* dicts belonging to + # that message. This method can then be invoked on the top-level dict by the + # parser, after it has parsed enough of the dict to create the appropriate + # instance of Event, Request, or Response for this message. + def associate_with(message): + for d in message_dicts: + d.message = message + del d.associate_with + + message_dicts = [] + decoder = self.stream.json_decoder_factory(object_hook=object_hook) + message_dict = self.stream.read_json(decoder) + assert isinstance(message_dict, MessageDict) # make sure stream used decoder + + msg_type = message_dict("type", json.enum("event", "request", "response")) + parser = self._message_parsers[msg_type] + try: + parser(self, message_dict) + except InvalidMessageError as exc: + log.error( + "Failed to parse message in channel {0}: {1} in:\n{2}", + self, + str(exc), + json.repr(message_dict), + ) + except Exception as exc: + if isinstance(exc, NoMoreMessages) and exc.stream is self.stream: + raise + log.swallow_exception( + "Fatal error in channel {0} while parsing:\n{1}", + self, + json.repr(message_dict), + ) + os._exit(1) + + def _enqueue_handlers(self, what, *handlers): + """Enqueues handlers for _run_handlers() to run. + + `what` is the Message being handled, and is used for logging purposes. + + If the background thread with _run_handlers() isn't running yet, starts it. + """ + + with self: + self._handler_queue.extend((what, handler) for handler in handlers) + self._handlers_enqueued.notify_all() + + # If there is anything to handle, but there's no handler thread yet, + # spin it up. This will normally happen only once, on the first call + # to _enqueue_handlers(), and that thread will run all the handlers + # for parsed messages. However, this can also happen is somebody calls + # Request.on_response() - possibly concurrently from multiple threads - + # after the channel has already been closed, and the initial handler + # thread has exited. In this case, we spin up a new thread just to run + # the enqueued response handlers, and it will exit as soon as it's out + # of handlers to run. + if len(self._handler_queue) and self._handler_thread is None: + self._handler_thread = threading.Thread( + target=self._run_handlers, + name=f"{self} message handler", + ) + hide_thread_from_debugger(self._handler_thread) + self._handler_thread.start() + + def _run_handlers(self): + """Runs enqueued handlers until the channel is closed, or until the handler + queue is empty once the channel is closed. + """ + + while True: + with self: + closed = self._closed + if closed: + # Wait for the parser thread to wrap up and enqueue any remaining + # handlers, if it is still running. + self._parser_thread.join() + # From this point on, _enqueue_handlers() can only get called + # from Request.on_response(). + + with self: + if not closed and not len(self._handler_queue): + # Wait for something to process. + self._handlers_enqueued.wait() + + # Make a snapshot before releasing the lock. + handlers = self._handler_queue[:] + del self._handler_queue[:] + + if closed and not len(handlers): + # Nothing to process, channel is closed, and parser thread is + # not running anymore - time to quit! If Request.on_response() + # needs to call _enqueue_handlers() later, it will spin up + # a new handler thread. + self._handler_thread = None + return + + for what, handler in handlers: + # If the channel is closed, we don't want to process any more events + # or requests - only responses and the final disconnect handler. This + # is to guarantee that if a handler calls close() on its own channel, + # the corresponding request or event is the last thing to be processed. + if closed and handler in (Event._handle, Request._handle): + continue + + with log.prefixed("/handling {0}/\n", what.describe()): + try: + handler() + except Exception: + # It's already logged by the handler, so just fail fast. + self.close() + os._exit(1) + + def _get_handler_for(self, type, name): + """Returns the handler for a message of a given type.""" + + with self: + handlers = self.handlers + + for handler_name in (name + "_" + type, type): + try: + return getattr(handlers, handler_name) + except AttributeError: + continue + + raise AttributeError( + "handler object {0} for channel {1} has no handler for {2} {3!r}".format( + util.srcnameof(handlers), + self, + type, + name, + ) + ) + + def _handle_disconnect(self): + handler = getattr(self.handlers, "disconnect", lambda: None) + try: + handler() + except Exception: + log.reraise_exception( + "Handler {0}\ncouldn't handle disconnect from {1}:", + util.srcnameof(handler), + self, + ) + + +class MessageHandlers(object): + """A simple delegating message handlers object for use with JsonMessageChannel. + For every argument provided, the object gets an attribute with the corresponding + name and value. + """ + + def __init__(self, **kwargs): + for name, func in kwargs.items(): + setattr(self, name, func) diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/singleton.py b/myenv/lib/python3.12/site-packages/debugpy/common/singleton.py new file mode 100644 index 0000000..d515a4a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/singleton.py @@ -0,0 +1,185 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import functools +import threading + + +class Singleton(object): + """A base class for a class of a singleton object. + + For any derived class T, the first invocation of T() will create the instance, + and any future invocations of T() will return that instance. + + Concurrent invocations of T() from different threads are safe. + """ + + # A dual-lock scheme is necessary to be thread safe while avoiding deadlocks. + # _lock_lock is shared by all singleton types, and is used to construct their + # respective _lock instances when invoked for a new type. Then _lock is used + # to synchronize all further access for that type, including __init__. This way, + # __init__ for any given singleton can access another singleton, and not get + # deadlocked if that other singleton is trying to access it. + _lock_lock = threading.RLock() + _lock = None + + # Specific subclasses will get their own _instance set in __new__. + _instance = None + + _is_shared = None # True if shared, False if exclusive + + def __new__(cls, *args, **kwargs): + # Allow arbitrary args and kwargs if shared=False, because that is guaranteed + # to construct a new singleton if it succeeds. Otherwise, this call might end + # up returning an existing instance, which might have been constructed with + # different arguments, so allowing them is misleading. + assert not kwargs.get("shared", False) or (len(args) + len(kwargs)) == 0, ( + "Cannot use constructor arguments when accessing a Singleton without " + "specifying shared=False." + ) + + # Avoid locking as much as possible with repeated double-checks - the most + # common path is when everything is already allocated. + if not cls._instance: + # If there's no per-type lock, allocate it. + if cls._lock is None: + with cls._lock_lock: + if cls._lock is None: + cls._lock = threading.RLock() + + # Now that we have a per-type lock, we can synchronize construction. + if not cls._instance: + with cls._lock: + if not cls._instance: + cls._instance = object.__new__(cls) + # To prevent having __init__ invoked multiple times, call + # it here directly, and then replace it with a stub that + # does nothing - that stub will get auto-invoked on return, + # and on all future singleton accesses. + cls._instance.__init__() + cls.__init__ = lambda *args, **kwargs: None + + return cls._instance + + def __init__(self, *args, **kwargs): + """Initializes the singleton instance. Guaranteed to only be invoked once for + any given type derived from Singleton. + + If shared=False, the caller is requesting a singleton instance for their own + exclusive use. This is only allowed if the singleton has not been created yet; + if so, it is created and marked as being in exclusive use. While it is marked + as such, all attempts to obtain an existing instance of it immediately raise + an exception. The singleton can eventually be promoted to shared use by calling + share() on it. + """ + + shared = kwargs.pop("shared", True) + with self: + if shared: + assert ( + type(self)._is_shared is not False + ), "Cannot access a non-shared Singleton." + type(self)._is_shared = True + else: + assert type(self)._is_shared is None, "Singleton is already created." + + def __enter__(self): + """Lock this singleton to prevent concurrent access.""" + type(self)._lock.acquire() + return self + + def __exit__(self, exc_type, exc_value, exc_tb): + """Unlock this singleton to allow concurrent access.""" + type(self)._lock.release() + + def share(self): + """Share this singleton, if it was originally created with shared=False.""" + type(self)._is_shared = True + + +class ThreadSafeSingleton(Singleton): + """A singleton that incorporates a lock for thread-safe access to its members. + + The lock can be acquired using the context manager protocol, and thus idiomatic + use is in conjunction with a with-statement. For example, given derived class T:: + + with T() as t: + t.x = t.frob(t.y) + + All access to the singleton from the outside should follow this pattern for both + attributes and method calls. Singleton members can assume that self is locked by + the caller while they're executing, but recursive locking of the same singleton + on the same thread is also permitted. + """ + + threadsafe_attrs = frozenset() + """Names of attributes that are guaranteed to be used in a thread-safe manner. + + This is typically used in conjunction with share() to simplify synchronization. + """ + + readonly_attrs = frozenset() + """Names of attributes that are readonly. These can be read without locking, but + cannot be written at all. + + Every derived class gets its own separate set. Thus, for any given singleton type + T, an attribute can be made readonly after setting it, with T.readonly_attrs.add(). + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Make sure each derived class gets a separate copy. + type(self).readonly_attrs = set(type(self).readonly_attrs) + + # Prevent callers from reading or writing attributes without locking, except for + # reading attributes listed in threadsafe_attrs, and methods specifically marked + # with @threadsafe_method. Such methods should perform the necessary locking to + # ensure thread safety for the callers. + + @staticmethod + def assert_locked(self): + lock = type(self)._lock + assert lock.acquire(blocking=False), ( + "ThreadSafeSingleton accessed without locking. Either use with-statement, " + "or if it is a method or property, mark it as @threadsafe_method or with " + "@autolocked_method, as appropriate." + ) + lock.release() + + def __getattribute__(self, name): + value = object.__getattribute__(self, name) + if name not in (type(self).threadsafe_attrs | type(self).readonly_attrs): + if not getattr(value, "is_threadsafe_method", False): + ThreadSafeSingleton.assert_locked(self) + return value + + def __setattr__(self, name, value): + assert name not in type(self).readonly_attrs, "This attribute is read-only." + if name not in type(self).threadsafe_attrs: + ThreadSafeSingleton.assert_locked(self) + return object.__setattr__(self, name, value) + + +def threadsafe_method(func): + """Marks a method of a ThreadSafeSingleton-derived class as inherently thread-safe. + + A method so marked must either not use any singleton state, or lock it appropriately. + """ + + func.is_threadsafe_method = True + return func + + +def autolocked_method(func): + """Automatically synchronizes all calls of a method of a ThreadSafeSingleton-derived + class by locking the singleton for the duration of each call. + """ + + @functools.wraps(func) + @threadsafe_method + def lock_and_call(self, *args, **kwargs): + with self: + return func(self, *args, **kwargs) + + return lock_and_call diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/sockets.py b/myenv/lib/python3.12/site-packages/debugpy/common/sockets.py new file mode 100644 index 0000000..ffcef80 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/sockets.py @@ -0,0 +1,129 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import socket +import sys +import threading + +from debugpy.common import log +from debugpy.common.util import hide_thread_from_debugger + + +def create_server(host, port=0, backlog=socket.SOMAXCONN, timeout=None): + """Return a local server socket listening on the given port.""" + + assert backlog > 0 + if host is None: + host = "127.0.0.1" + if port is None: + port = 0 + + try: + server = _new_sock() + if port != 0: + # If binding to a specific port, make sure that the user doesn't have + # to wait until the OS times out the socket to be able to use that port + # again.if the server or the adapter crash or are force-killed. + if sys.platform == "win32": + server.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + else: + try: + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + except (AttributeError, OSError): # pragma: no cover + pass # Not available everywhere + server.bind((host, port)) + if timeout is not None: + server.settimeout(timeout) + server.listen(backlog) + except Exception: # pragma: no cover + server.close() + raise + return server + + +def create_client(): + """Return a client socket that may be connected to a remote address.""" + return _new_sock() + + +def _new_sock(): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) + + # Set TCP keepalive on an open socket. + # It activates after 1 second (TCP_KEEPIDLE,) of idleness, + # then sends a keepalive ping once every 3 seconds (TCP_KEEPINTVL), + # and closes the connection after 5 failed ping (TCP_KEEPCNT), or 15 seconds + try: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + except (AttributeError, OSError): # pragma: no cover + pass # May not be available everywhere. + try: + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 1) + except (AttributeError, OSError): # pragma: no cover + pass # May not be available everywhere. + try: + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 3) + except (AttributeError, OSError): # pragma: no cover + pass # May not be available everywhere. + try: + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5) + except (AttributeError, OSError): # pragma: no cover + pass # May not be available everywhere. + return sock + + +def shut_down(sock, how=socket.SHUT_RDWR): + """Shut down the given socket.""" + sock.shutdown(how) + + +def close_socket(sock): + """Shutdown and close the socket.""" + try: + shut_down(sock) + except Exception: # pragma: no cover + pass + sock.close() + + +def serve(name, handler, host, port=0, backlog=socket.SOMAXCONN, timeout=None): + """Accepts TCP connections on the specified host and port, and invokes the + provided handler function for every new connection. + + Returns the created server socket. + """ + + assert backlog > 0 + + try: + listener = create_server(host, port, backlog, timeout) + except Exception: # pragma: no cover + log.reraise_exception( + "Error listening for incoming {0} connections on {1}:{2}:", name, host, port + ) + host, port = listener.getsockname() + log.info("Listening for incoming {0} connections on {1}:{2}...", name, host, port) + + def accept_worker(): + while True: + try: + sock, (other_host, other_port) = listener.accept() + except (OSError, socket.error): + # Listener socket has been closed. + break + + log.info( + "Accepted incoming {0} connection from {1}:{2}.", + name, + other_host, + other_port, + ) + handler(sock) + + thread = threading.Thread(target=accept_worker) + thread.daemon = True + hide_thread_from_debugger(thread) + thread.start() + + return listener diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/stacks.py b/myenv/lib/python3.12/site-packages/debugpy/common/stacks.py new file mode 100644 index 0000000..a7bd16f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/stacks.py @@ -0,0 +1,62 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +"""Provides facilities to dump all stacks of all threads in the process. +""" + +import os +import sys +import time +import threading +import traceback + +from debugpy.common import log + + +def dump(): + """Dump stacks of all threads in this process, except for the current thread.""" + + tid = threading.current_thread().ident + pid = os.getpid() + + log.info("Dumping stacks for process {0}...", pid) + + for t_ident, frame in sys._current_frames().items(): + if t_ident == tid: + continue + + for t in threading.enumerate(): + if t.ident == tid: + t_name = t.name + t_daemon = t.daemon + break + else: + t_name = t_daemon = "" + + stack = "".join(traceback.format_stack(frame)) + log.info( + "Stack of thread {0} (tid={1}, pid={2}, daemon={3}):\n\n{4}", + t_name, + t_ident, + pid, + t_daemon, + stack, + ) + + log.info("Finished dumping stacks for process {0}.", pid) + + +def dump_after(secs): + """Invokes dump() on a background thread after waiting for the specified time.""" + + def dumper(): + time.sleep(secs) + try: + dump() + except: + log.swallow_exception() + + thread = threading.Thread(target=dumper) + thread.daemon = True + thread.start() diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/timestamp.py b/myenv/lib/python3.12/site-packages/debugpy/common/timestamp.py new file mode 100644 index 0000000..2913b60 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/timestamp.py @@ -0,0 +1,22 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +"""Provides monotonic timestamps with a resetable zero. +""" + +import time + +__all__ = ["current", "reset"] + + +def current(): + return time.monotonic() - timestamp_zero + + +def reset(): + global timestamp_zero + timestamp_zero = time.monotonic() + + +reset() diff --git a/myenv/lib/python3.12/site-packages/debugpy/common/util.py b/myenv/lib/python3.12/site-packages/debugpy/common/util.py new file mode 100644 index 0000000..54850a0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/common/util.py @@ -0,0 +1,164 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import inspect +import os +import sys + + +def evaluate(code, path=__file__, mode="eval"): + # Setting file path here to avoid breaking here if users have set + # "break on exception raised" setting. This code can potentially run + # in user process and is indistinguishable if the path is not set. + # We use the path internally to skip exception inside the debugger. + expr = compile(code, path, "eval") + return eval(expr, {}, sys.modules) + + +class Observable(object): + """An object with change notifications.""" + + observers = () # used when attributes are set before __init__ is invoked + + def __init__(self): + self.observers = [] + + def __setattr__(self, name, value): + try: + return super().__setattr__(name, value) + finally: + for ob in self.observers: + ob(self, name) + + +class Env(dict): + """A dict for environment variables.""" + + @staticmethod + def snapshot(): + """Returns a snapshot of the current environment.""" + return Env(os.environ) + + def copy(self, updated_from=None): + result = Env(self) + if updated_from is not None: + result.update(updated_from) + return result + + def prepend_to(self, key, entry): + """Prepends a new entry to a PATH-style environment variable, creating + it if it doesn't exist already. + """ + try: + tail = os.path.pathsep + self[key] + except KeyError: + tail = "" + self[key] = entry + tail + + +def force_str(s, encoding, errors="strict"): + """Converts s to str, using the provided encoding. If s is already str, + it is returned as is. + """ + return s.decode(encoding, errors) if isinstance(s, bytes) else str(s) + + +def force_bytes(s, encoding, errors="strict"): + """Converts s to bytes, using the provided encoding. If s is already bytes, + it is returned as is. + + If errors="strict" and s is bytes, its encoding is verified by decoding it; + UnicodeError is raised if it cannot be decoded. + """ + if isinstance(s, str): + return s.encode(encoding, errors) + else: + s = bytes(s) + if errors == "strict": + # Return value ignored - invoked solely for verification. + s.decode(encoding, errors) + return s + + +def force_ascii(s, errors="strict"): + """Same as force_bytes(s, "ascii", errors)""" + return force_bytes(s, "ascii", errors) + + +def force_utf8(s, errors="strict"): + """Same as force_bytes(s, "utf8", errors)""" + return force_bytes(s, "utf8", errors) + + +def nameof(obj, quote=False): + """Returns the most descriptive name of a Python module, class, or function, + as a Unicode string + + If quote=True, name is quoted with repr(). + + Best-effort, but guaranteed to not fail - always returns something. + """ + + try: + name = obj.__qualname__ + except Exception: + try: + name = obj.__name__ + except Exception: + # Fall back to raw repr(), and skip quoting. + try: + name = repr(obj) + except Exception: + return "" + else: + quote = False + + if quote: + try: + name = repr(name) + except Exception: + pass + + return force_str(name, "utf-8", "replace") + + +def srcnameof(obj): + """Returns the most descriptive name of a Python module, class, or function, + including source information (filename and linenumber), if available. + + Best-effort, but guaranteed to not fail - always returns something. + """ + + name = nameof(obj, quote=True) + + # Get the source information if possible. + try: + src_file = inspect.getsourcefile(obj) + except Exception: + pass + else: + name += f" (file {src_file!r}" + try: + _, src_lineno = inspect.getsourcelines(obj) + except Exception: + pass + else: + name += f", line {src_lineno}" + name += ")" + + return name + + +def hide_debugpy_internals(): + """Returns True if the caller should hide something from debugpy.""" + return "DEBUGPY_TRACE_DEBUGPY" not in os.environ + + +def hide_thread_from_debugger(thread): + """Disables tracing for the given thread if DEBUGPY_TRACE_DEBUGPY is not set. + DEBUGPY_TRACE_DEBUGPY is used to debug debugpy with debugpy + """ + if hide_debugpy_internals(): + thread.pydev_do_not_trace = True + thread.is_pydev_daemon_thread = True diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/launcher/__init__.py new file mode 100644 index 0000000..a6e0934 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/launcher/__init__.py @@ -0,0 +1,32 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +__all__ = [] + + +adapter_host = None +"""The host on which adapter is running and listening for incoming connections +from the launcher and the servers.""" + +channel = None +"""DAP message channel to the adapter.""" + + +def connect(host, port): + from debugpy.common import log, messaging, sockets + from debugpy.launcher import handlers + + global channel, adapter_host + assert channel is None + assert adapter_host is None + + log.info("Connecting to adapter at {0}:{1}", host, port) + + sock = sockets.create_client() + sock.connect((host, port)) + adapter_host = host + + stream = messaging.JsonIOStream.from_socket(sock, "Adapter") + channel = messaging.JsonMessageChannel(stream, handlers=handlers) + channel.start() diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/__main__.py b/myenv/lib/python3.12/site-packages/debugpy/launcher/__main__.py new file mode 100644 index 0000000..cff18b5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/launcher/__main__.py @@ -0,0 +1,91 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +__all__ = ["main"] + +import locale +import signal +import sys + +# WARNING: debugpy and submodules must not be imported on top level in this module, +# and should be imported locally inside main() instead. + + +def main(): + from debugpy import launcher + from debugpy.common import log + from debugpy.launcher import debuggee + + log.to_file(prefix="debugpy.launcher") + log.describe_environment("debugpy.launcher startup environment:") + + if sys.platform == "win32": + # For windows, disable exceptions on Ctrl+C - we want to allow the debuggee + # process to handle these, or not, as it sees fit. If the debuggee exits + # on Ctrl+C, the launcher will also exit, so it doesn't need to observe + # the signal directly. + signal.signal(signal.SIGINT, signal.SIG_IGN) + + # Everything before "--" is command line arguments for the launcher itself, + # and everything after "--" is command line arguments for the debuggee. + log.info("sys.argv before parsing: {0}", sys.argv) + sep = sys.argv.index("--") + launcher_argv = sys.argv[1:sep] + sys.argv[:] = [sys.argv[0]] + sys.argv[sep + 1 :] + log.info("sys.argv after patching: {0}", sys.argv) + + # The first argument specifies the host/port on which the adapter is waiting + # for launcher to connect. It's either host:port, or just port. + adapter = launcher_argv[0] + host, sep, port = adapter.partition(":") + if not sep: + host = "127.0.0.1" + port = adapter + port = int(port) + + launcher.connect(host, port) + launcher.channel.wait() + + if debuggee.process is not None: + sys.exit(debuggee.process.returncode) + + +if __name__ == "__main__": + # debugpy can also be invoked directly rather than via -m. In this case, the first + # entry on sys.path is the one added automatically by Python for the directory + # containing this file. This means that import debugpy will not work, since we need + # the parent directory of debugpy/ to be in sys.path, rather than debugpy/launcher/. + # + # The other issue is that many other absolute imports will break, because they + # will be resolved relative to debugpy/launcher/ - e.g. `import state` will then try + # to import debugpy/launcher/state.py. + # + # To fix both, we need to replace the automatically added entry such that it points + # at parent directory of debugpy/ instead of debugpy/launcher, import debugpy with that + # in sys.path, and then remove the first entry entry altogether, so that it doesn't + # affect any further imports we might do. For example, suppose the user did: + # + # python /foo/bar/debugpy/launcher ... + # + # At the beginning of this script, sys.path will contain "/foo/bar/debugpy/launcher" + # as the first entry. What we want is to replace it with "/foo/bar', then import + # debugpy with that in effect, and then remove the replaced entry before any more + # code runs. The imported debugpy module will remain in sys.modules, and thus all + # future imports of it or its submodules will resolve accordingly. + if "debugpy" not in sys.modules: + # Do not use dirname() to walk up - this can be a relative path, e.g. ".". + sys.path[0] = sys.path[0] + "/../../" + __import__("debugpy") + del sys.path[0] + + # Apply OS-global and user-specific locale settings. + try: + locale.setlocale(locale.LC_ALL, "") + except Exception: + # On POSIX, locale is set via environment variables, and this can fail if + # those variables reference a non-existing locale. Ignore and continue using + # the default "C" locale if so. + pass + + main() diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..750c2a6df70d7241a9a3a570d0df99d8dcc59da4 GIT binary patch literal 1108 zcmZuwO-~a+7@pak?pC&25D@%!BSupaSw9jE#Hd76G<+P49=vRp-J#vGJKM|*CWSU> zjRr3!-tZ@A@W9dkpocb?KsFjlJb5F*6DMbA8&Q0ddFK6m=ACzUKAC105b`;Cl3!8* z_#ussz_zk`QYfn+51s-axbTQXMId|uo~mV#Q)WD+QzQ12Sb_@djtPQQk>)EQh+tKT zl&Tu3RRpC^4N;V;rXb*%PHkOz2%bZp{oAf6#iJe1pWR0lP=Ram93c=?P_eJ2AH=n` zQPnD1@z}vgOP3t;%3AxPf(5vGMJ)~-&Mcld?5k*gYOQ_qs;oQppB%lC`k;2QT5JwVLSTEnluX$@+M1F<&Z=cyScPgd%Yel^>330+OCiICK|@ zSHP6&(ye>qG=jq<(`I)HG2;me$b6ib9>p%lju!@)aFN?;C&@fyF?lfih>LKP81poa zoL2uyuMAD^Ukl%9Q>PerDbJ-7)Z#A1l>gISs~IFo5{>Qivb5;WYRew6Bf@RZe$2#R z?0cAFVolJ%59|rd7I<8;OEfNGK2BIL7h*dqWAe-ngE_lY=7pGCAGvzXW&y{SORl%z z<}tI|1F<^;u^lHM0e75{Qkizk!Aa;5i@g?51K-hT6ODdDxnCN{^u4;(Kqp__`f3a| zjB^ciPT)4uS0?L|4bxulU*})YjcucM)3BO`wPBpEO>Cj`%2a*o&4st<&FL@b>{j1k zZED*b*ffWl=Fp~TH$@>@4>ru(wR>CH!OiS&Gduil^y6eBJG_y-Tf6@i87tHE>6f#+ zq9Kq&iS9UV7&;D>FOC`#WYg~fl|MHOiUcpb8R$cmr_S2htVKgQYtQ-S%y(wb zIdf*Tzk57RfZHG9wb+|F0A3pdv%z)np@{%s0dOEj3`0T z4n>xi-WuGY=(t`dxp%=X;Ot;UB;fKGPKriGSeHi zgBc*P&(vEoZO5FAvw=CETXQB#1WjZ~>jb53i3672MAHW}pNSKlCbHz_R*8_sFp(K6 zKCAc%dWRI_=miO#5!i7l8b=Doq#(x(6^BN~V=;tM+bSqI6{;cGlL{K;CsX@Ao(rfN zt7zlN0FrL;iY$pp(oX8s1TP)wPPM92YKT>0w*n(*R8~+R$to%@#ZCskKa@$?y1L#P z7gi089o3M6Sz0u1($2((r3ft;+rbAI#6lF=V8_NGgpwNbz z*5t@2FCe{vLuypvM^L23Yn{a2>P%8#HSDXX+f_a$v4U>DGH_vF=&DX*85y`Rq(fdB zm33&urBl4bp-J6=1JihomnEI#B~7QJvLvCX0pcu1f(|EG9uJd>97U?CLo|tpP6cV> ziWHSO6l5y#RQ#`cOR6ZTd(1tER9;839Gk=`(qUXyH612pMN=6ZTVTDdNnuga!qMA|JO zV0N$w4=h8v1X~NRb*Zhd2+zHtop;jH>A8vL^sc|1z~P`vCnu>DcTgO0@`zxo~@TRgF}=V+n+==&F;Mm!%Ne)Y z8gr_;%4wws4~{FB2*qC0CeY4&&lR;Ct!Se z@}BFit3bD}`kNQx^YQ$5^JDi13jVGfSxJO%#`Th^pF2@x+Lqnk+5VaSxy!l1vfWO3 zmYJrUy~H#Xn5Mk{UfbQaMO%?M_^u96jvvmK2l0Da{wbdZ?j7#|q&)8!;P8|k7_F(s WXU=as+s+W+89|+Kkk1$b_x}P2${8mB literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/debuggee.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/debuggee.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46650eec88bbb0b7ffabe39e5d01eb8696d16a2a GIT binary patch literal 10258 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 Ye}E~Xc2M^lYAMSD59Oq46gT1j06wiIjQ{`u literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/handlers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/handlers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e8666e720eab565b92c159a15dc51dfaabb14ea GIT binary patch literal 6122 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 DhJQ6G literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/winapi.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/launcher/__pycache__/winapi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb5970349ed2746654a64bc64f794f34667ac5de GIT binary patch literal 4412 zcmai1O;8)j74Ff`XoSR{Fc@qwLIxIrk^CP!{)q+1wrn9`BGS*75ilGA!UxP$_1AX@p1RI$E`{ZQkfK!sjZ4#sT_R61&7q0@_MAv02c97>GkXP z-t^b={<`(I*47pT&)+k5mo7RH`Zt~EkG0Nhe{MnOITDe`q!CX?Q<}+`cvHsAn==;P zlCkpE49l|_8*gK%-kjz#cHYh)jFu1S%NZl@Fi}mfA<;Q(e#O*yz7;I`b-6L}?I3p> zbDiTmK|ZX{jFIm$p&LlFtRm407Gs7+=U$m>9N(>3vS4ZZgk_Ir$$_Q)6PAbJOC4fM z!BjW)=pj1v_v%HsjWm^#I$0kRt}7 z&h0~PX7LenibkZFYB$1F`CCDQIK-k z>0B{eP`mCCsetzjqlGUp*(dCzZ^ua@E2l82z3kFn-Y3)E-6M;5ttux7*+d2lg4!Yo znVeWmQ{E{Ezbhuvb&Y)?9F5$dKQK>8I4#P;OSDbh@Kf5K$rk)c|ALH(?7xl+IP0Dv zk|_CSu)I>p<^6e*TgHVzR+bji*qW%=l`@&tWo0a!D-9)R%E7 zgTqorf=mF#t=!^XVT-1_o=z;uYWJ*^l`_T5y&PGQvP&^sh)EAHh!bBn5xWA(f^;9( zp=uCZAeDkO3MI95jz~GkywY?!Aq!?S^zw(^#eQThSm8WdT`fjHDbSvPeyUn&;LKX!_68I}3DwGK)jDj1 zFZj!NFftRIX%fNise~*gHIIg}sT|2@<*c%y9G$AJy31#ACPzv&$G1UXch9@$aAIYT z9fVy}JE^!~N<~cqp}ANqkP+(aW>NTzDkzzNpZs$mGz#vDXS%}8DE7{0mnz&Kt(W^1 zZd9@Nt(^z=8sX?)OF#g9PWub^$@JwidOfcl2olf^bSfBdHZW1e`cN|6MABP)VP6=bA`qSEYqd;Jt8c+ zOf!Gq11r=~7*x>H4=vNJ?|byq|7+$Eb%rVOpyT1muiOL|iX@9g_rp_Pd98%HSG9_? zD{953vdKazk7bp+CuM_#_)6DaZIitlndmrSJPt3Il@2Db8PApb3+e>#q=o!@YHess1!4Lu1}ddAj=|2p|{ z^4p#b=d~YQz0dvM_}{pWSDeS+cJ)1;tra~jf3Jzq8z;F!7o-0BZ7r^geL}q0Sf$LtHB7`E;+78|Lt~}DRMV7^=Vze%(ogj|C+KYSEP7w#-X;{h#eR2FGSTkC$)GFY}L_V%ZPPX^1Z!8l!;&SO>Qv9f)Kn$3qEG;-$ksW-#tDro4fd%S`Mlo5XgdEOp6QbC=H zMnAB~eQ_I>?AYo-PS?{bPp)h_hN_OCGWTxs{HtG=xlJ@wMME2CTsd*ln0Xc7+1IJc z1u zZ4QnYvwmf0bltL!EAF#~aNwQqXRlW1+*3uK4K$%lo-$_RZ!Il~#idYcS1gV#2kSQ( z>WL2>2)^w$mAI?Oy@9;Sgx{ErDU)YjfBya59~LSnVuslJ?z5ABc}V9+tLW$k8dgTN XZ>!CYD`URbmKT4}_5VP_THE^{TlwoZ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/debuggee.py b/myenv/lib/python3.12/site-packages/debugpy/launcher/debuggee.py new file mode 100644 index 0000000..ec0c9ef --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/launcher/debuggee.py @@ -0,0 +1,250 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import atexit +import ctypes +import os +import signal +import struct +import subprocess +import sys +import threading + +from debugpy import launcher +from debugpy.common import log, messaging +from debugpy.launcher import output + +if sys.platform == "win32": + from debugpy.launcher import winapi + + +process = None +"""subprocess.Popen instance for the debuggee process.""" + +job_handle = None +"""On Windows, the handle for the job object to which the debuggee is assigned.""" + +wait_on_exit_predicates = [] +"""List of functions that determine whether to pause after debuggee process exits. + +Every function is invoked with exit code as the argument. If any of the functions +returns True, the launcher pauses and waits for user input before exiting. +""" + + +def describe(): + return f"Debuggee[PID={process.pid}]" + + +def spawn(process_name, cmdline, env, redirect_output): + log.info( + "Spawning debuggee process:\n\n" + "Command line: {0!r}\n\n" + "Environment variables: {1!r}\n\n", + cmdline, + env, + ) + + close_fds = set() + try: + if redirect_output: + # subprocess.PIPE behavior can vary substantially depending on Python version + # and platform; using our own pipes keeps it simple, predictable, and fast. + stdout_r, stdout_w = os.pipe() + stderr_r, stderr_w = os.pipe() + close_fds |= {stdout_r, stdout_w, stderr_r, stderr_w} + kwargs = dict(stdout=stdout_w, stderr=stderr_w) + else: + kwargs = {} + + if sys.platform != "win32" and sys.implementation.name != 'graalpy': + # GraalPy does not support running code between fork and exec + + def preexec_fn(): + try: + # Start the debuggee in a new process group, so that the launcher can + # kill the entire process tree later. + os.setpgrp() + + # Make the new process group the foreground group in its session, so + # that it can interact with the terminal. The debuggee will receive + # SIGTTOU when tcsetpgrp() is called, and must ignore it. + old_handler = signal.signal(signal.SIGTTOU, signal.SIG_IGN) + try: + tty = os.open("/dev/tty", os.O_RDWR) + try: + os.tcsetpgrp(tty, os.getpgrp()) + finally: + os.close(tty) + finally: + signal.signal(signal.SIGTTOU, old_handler) + except Exception: + # Not an error - /dev/tty doesn't work when there's no terminal. + log.swallow_exception( + "Failed to set up process group", level="info" + ) + + kwargs.update(preexec_fn=preexec_fn) + + try: + global process + process = subprocess.Popen(cmdline, env=env, bufsize=0, **kwargs) + except Exception as exc: + raise messaging.MessageHandlingError( + "Couldn't spawn debuggee: {0}\n\nCommand line:{1!r}".format( + exc, cmdline + ) + ) + + log.info("Spawned {0}.", describe()) + + if sys.platform == "win32": + # Assign the debuggee to a new job object, so that the launcher can kill + # the entire process tree later. + try: + global job_handle + job_handle = winapi.kernel32.CreateJobObjectA(None, None) + + job_info = winapi.JOBOBJECT_EXTENDED_LIMIT_INFORMATION() + job_info_size = winapi.DWORD(ctypes.sizeof(job_info)) + winapi.kernel32.QueryInformationJobObject( + job_handle, + winapi.JobObjectExtendedLimitInformation, + ctypes.pointer(job_info), + job_info_size, + ctypes.pointer(job_info_size), + ) + + job_info.BasicLimitInformation.LimitFlags |= ( + # Ensure that the job will be terminated by the OS once the + # launcher exits, even if it doesn't terminate the job explicitly. + winapi.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE + | + # Allow the debuggee to create its own jobs unrelated to ours. + winapi.JOB_OBJECT_LIMIT_BREAKAWAY_OK + ) + winapi.kernel32.SetInformationJobObject( + job_handle, + winapi.JobObjectExtendedLimitInformation, + ctypes.pointer(job_info), + job_info_size, + ) + + process_handle = winapi.kernel32.OpenProcess( + winapi.PROCESS_TERMINATE | winapi.PROCESS_SET_QUOTA, + False, + process.pid, + ) + + winapi.kernel32.AssignProcessToJobObject(job_handle, process_handle) + + except Exception: + log.swallow_exception("Failed to set up job object", level="warning") + + atexit.register(kill) + + launcher.channel.send_event( + "process", + { + "startMethod": "launch", + "isLocalProcess": True, + "systemProcessId": process.pid, + "name": process_name, + "pointerSize": struct.calcsize("P") * 8, + }, + ) + + if redirect_output: + for category, fd, tee in [ + ("stdout", stdout_r, sys.stdout), + ("stderr", stderr_r, sys.stderr), + ]: + output.CaptureOutput(describe(), category, fd, tee) + close_fds.remove(fd) + + wait_thread = threading.Thread(target=wait_for_exit, name="wait_for_exit()") + wait_thread.daemon = True + wait_thread.start() + + finally: + for fd in close_fds: + try: + os.close(fd) + except Exception: + log.swallow_exception(level="warning") + + +def kill(): + if process is None: + return + + try: + if process.poll() is None: + log.info("Killing {0}", describe()) + # Clean up the process tree + if sys.platform == "win32": + # On Windows, kill the job object. + winapi.kernel32.TerminateJobObject(job_handle, 0) + else: + # On POSIX, kill the debuggee's process group. + os.killpg(process.pid, signal.SIGKILL) + except Exception: + log.swallow_exception("Failed to kill {0}", describe()) + + +def wait_for_exit(): + try: + code = process.wait() + if sys.platform != "win32" and code < 0: + # On POSIX, if the process was terminated by a signal, Popen will use + # a negative returncode to indicate that - but the actual exit code of + # the process is always an unsigned number, and can be determined by + # taking the lowest 8 bits of that negative returncode. + code &= 0xFF + except Exception: + log.swallow_exception("Couldn't determine process exit code") + code = -1 + + log.info("{0} exited with code {1}", describe(), code) + output.wait_for_remaining_output() + + # Determine whether we should wait or not before sending "exited", so that any + # follow-up "terminate" requests don't affect the predicates. + should_wait = any(pred(code) for pred in wait_on_exit_predicates) + + try: + launcher.channel.send_event("exited", {"exitCode": code}) + except Exception: + pass + + if should_wait: + _wait_for_user_input() + + try: + launcher.channel.send_event("terminated") + except Exception: + pass + + +def _wait_for_user_input(): + if sys.stdout and sys.stdin and sys.stdin.isatty(): + from debugpy.common import log + + try: + import msvcrt + except ImportError: + can_getch = False + else: + can_getch = True + + if can_getch: + log.debug("msvcrt available - waiting for user input via getch()") + sys.stdout.write("Press any key to continue . . . ") + sys.stdout.flush() + msvcrt.getch() + else: + log.debug("msvcrt not available - waiting for user input via read()") + sys.stdout.write("Press Enter to continue . . . ") + sys.stdout.flush() + sys.stdin.read(1) diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/handlers.py b/myenv/lib/python3.12/site-packages/debugpy/launcher/handlers.py new file mode 100644 index 0000000..213a5b9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/launcher/handlers.py @@ -0,0 +1,152 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import os +import sys + +import debugpy +from debugpy import launcher +from debugpy.common import json +from debugpy.launcher import debuggee + + +def launch_request(request): + debug_options = set(request("debugOptions", json.array(str))) + + # Handling of properties that can also be specified as legacy "debugOptions" flags. + # If property is explicitly set to false, but the flag is in "debugOptions", treat + # it as an error. Returns None if the property wasn't explicitly set either way. + def property_or_debug_option(prop_name, flag_name): + assert prop_name[0].islower() and flag_name[0].isupper() + + value = request(prop_name, bool, optional=True) + if value == (): + value = None + + if flag_name in debug_options: + if value is False: + raise request.isnt_valid( + '{0}:false and "debugOptions":[{1}] are mutually exclusive', + json.repr(prop_name), + json.repr(flag_name), + ) + value = True + + return value + + python = request("python", json.array(str, size=(1,))) + cmdline = list(python) + + if not request("noDebug", json.default(False)): + # see https://github.com/microsoft/debugpy/issues/861 + if sys.version_info[:2] >= (3, 11): + cmdline += ["-X", "frozen_modules=off"] + + port = request("port", int) + cmdline += [ + os.path.dirname(debugpy.__file__), + "--connect", + launcher.adapter_host + ":" + str(port), + ] + + if not request("subProcess", True): + cmdline += ["--configure-subProcess", "False"] + + qt_mode = request( + "qt", + json.enum( + "none", "auto", "pyside", "pyside2", "pyqt4", "pyqt5", optional=True + ), + ) + cmdline += ["--configure-qt", qt_mode] + + adapter_access_token = request("adapterAccessToken", str, optional=True) + if adapter_access_token != (): + cmdline += ["--adapter-access-token", adapter_access_token] + + debugpy_args = request("debugpyArgs", json.array(str)) + cmdline += debugpy_args + + # Use the copy of arguments that was propagated via the command line rather than + # "args" in the request itself, to allow for shell expansion. + cmdline += sys.argv[1:] + + process_name = request("processName", sys.executable) + + env = os.environ.copy() + env_changes = request("env", json.object((str, type(None)))) + if sys.platform == "win32": + # Environment variables are case-insensitive on Win32, so we need to normalize + # both dicts to make sure that env vars specified in the debug configuration + # overwrite the global env vars correctly. If debug config has entries that + # differ in case only, that's an error. + env = {k.upper(): v for k, v in os.environ.items()} + new_env_changes = {} + for k, v in env_changes.items(): + k_upper = k.upper() + if k_upper in new_env_changes: + if new_env_changes[k_upper] == v: + continue + else: + raise request.isnt_valid( + 'Found duplicate in "env": {0}.'.format(k_upper) + ) + new_env_changes[k_upper] = v + env_changes = new_env_changes + if "DEBUGPY_TEST" in env: + # If we're running as part of a debugpy test, make sure that codecov is not + # applied to the debuggee, since it will conflict with pydevd. + env.pop("COV_CORE_SOURCE", None) + env.update(env_changes) + env = {k: v for k, v in env.items() if v is not None} + + if request("gevent", False): + env["GEVENT_SUPPORT"] = "True" + + console = request( + "console", + json.enum( + "internalConsole", "integratedTerminal", "externalTerminal", optional=True + ), + ) + + redirect_output = property_or_debug_option("redirectOutput", "RedirectOutput") + if redirect_output is None: + # If neither the property nor the option were specified explicitly, choose + # the default depending on console type - "internalConsole" needs it to + # provide any output at all, but it's unnecessary for the terminals. + redirect_output = console == "internalConsole" + if redirect_output: + # sys.stdout buffering must be disabled - otherwise we won't see the output + # at all until the buffer fills up. + env["PYTHONUNBUFFERED"] = "1" + # Force UTF-8 output to minimize data loss due to re-encoding. + env["PYTHONIOENCODING"] = "utf-8" + + if property_or_debug_option("waitOnNormalExit", "WaitOnNormalExit"): + if console == "internalConsole": + raise request.isnt_valid( + '"waitOnNormalExit" is not supported for "console":"internalConsole"' + ) + debuggee.wait_on_exit_predicates.append(lambda code: code == 0) + if property_or_debug_option("waitOnAbnormalExit", "WaitOnAbnormalExit"): + if console == "internalConsole": + raise request.isnt_valid( + '"waitOnAbnormalExit" is not supported for "console":"internalConsole"' + ) + debuggee.wait_on_exit_predicates.append(lambda code: code != 0) + + debuggee.spawn(process_name, cmdline, env, redirect_output) + return {} + + +def terminate_request(request): + del debuggee.wait_on_exit_predicates[:] + request.respond({}) + debuggee.kill() + + +def disconnect(): + del debuggee.wait_on_exit_predicates[:] + debuggee.kill() diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/output.py b/myenv/lib/python3.12/site-packages/debugpy/launcher/output.py new file mode 100644 index 0000000..70cd521 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/launcher/output.py @@ -0,0 +1,113 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import codecs +import os +import threading + +from debugpy import launcher +from debugpy.common import log + + +class CaptureOutput(object): + """Captures output from the specified file descriptor, and tees it into another + file descriptor while generating DAP "output" events for it. + """ + + instances = {} + """Keys are output categories, values are CaptureOutput instances.""" + + def __init__(self, whose, category, fd, stream): + assert category not in self.instances + self.instances[category] = self + log.info("Capturing {0} of {1}.", category, whose) + + self.category = category + self._whose = whose + self._fd = fd + self._decoder = codecs.getincrementaldecoder("utf-8")(errors="surrogateescape") + + if stream is None: + # Can happen if running under pythonw.exe. + self._stream = None + else: + self._stream = stream.buffer + encoding = stream.encoding + if encoding is None or encoding == "cp65001": + encoding = "utf-8" + try: + self._encode = codecs.getencoder(encoding) + except Exception: + log.swallow_exception( + "Unsupported {0} encoding {1!r}; falling back to UTF-8.", + category, + encoding, + level="warning", + ) + self._encode = codecs.getencoder("utf-8") + else: + log.info("Using encoding {0!r} for {1}", encoding, category) + + self._worker_thread = threading.Thread(target=self._worker, name=category) + self._worker_thread.start() + + def __del__(self): + fd = self._fd + if fd is not None: + try: + os.close(fd) + except Exception: + pass + + def _worker(self): + while self._fd is not None: + try: + s = os.read(self._fd, 0x1000) + except Exception: + break + if not len(s): + break + self._process_chunk(s) + + # Flush any remaining data in the incremental decoder. + self._process_chunk(b"", final=True) + + def _process_chunk(self, s, final=False): + s = self._decoder.decode(s, final=final) + if len(s) == 0: + return + + try: + launcher.channel.send_event( + "output", {"category": self.category, "output": s.replace("\r\n", "\n")} + ) + except Exception: + pass # channel to adapter is already closed + + if self._stream is None: + return + + try: + s, _ = self._encode(s, "surrogateescape") + size = len(s) + i = 0 + while i < size: + written = self._stream.write(s[i:]) + self._stream.flush() + if written == 0: + # This means that the output stream was closed from the other end. + # Do the same to the debuggee, so that it knows as well. + os.close(self._fd) + self._fd = None + break + i += written + except Exception: + log.swallow_exception("Error printing {0!r} to {1}", s, self.category) + + +def wait_for_remaining_output(): + """Waits for all remaining output to be captured and propagated.""" + for category, instance in CaptureOutput.instances.items(): + log.info("Waiting for remaining {0} of {1}.", category, instance._whose) + instance._worker_thread.join() diff --git a/myenv/lib/python3.12/site-packages/debugpy/launcher/winapi.py b/myenv/lib/python3.12/site-packages/debugpy/launcher/winapi.py new file mode 100644 index 0000000..a93dbc7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/launcher/winapi.py @@ -0,0 +1,104 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +import ctypes +from ctypes.wintypes import BOOL, DWORD, HANDLE, LARGE_INTEGER, LPCSTR, UINT + +from debugpy.common import log + + +JOBOBJECTCLASS = ctypes.c_int +LPDWORD = ctypes.POINTER(DWORD) +LPVOID = ctypes.c_void_p +SIZE_T = ctypes.c_size_t +ULONGLONG = ctypes.c_ulonglong + + +class IO_COUNTERS(ctypes.Structure): + _fields_ = [ + ("ReadOperationCount", ULONGLONG), + ("WriteOperationCount", ULONGLONG), + ("OtherOperationCount", ULONGLONG), + ("ReadTransferCount", ULONGLONG), + ("WriteTransferCount", ULONGLONG), + ("OtherTransferCount", ULONGLONG), + ] + + +class JOBOBJECT_BASIC_LIMIT_INFORMATION(ctypes.Structure): + _fields_ = [ + ("PerProcessUserTimeLimit", LARGE_INTEGER), + ("PerJobUserTimeLimit", LARGE_INTEGER), + ("LimitFlags", DWORD), + ("MinimumWorkingSetSize", SIZE_T), + ("MaximumWorkingSetSize", SIZE_T), + ("ActiveProcessLimit", DWORD), + ("Affinity", SIZE_T), + ("PriorityClass", DWORD), + ("SchedulingClass", DWORD), + ] + + +class JOBOBJECT_EXTENDED_LIMIT_INFORMATION(ctypes.Structure): + _fields_ = [ + ("BasicLimitInformation", JOBOBJECT_BASIC_LIMIT_INFORMATION), + ("IoInfo", IO_COUNTERS), + ("ProcessMemoryLimit", SIZE_T), + ("JobMemoryLimit", SIZE_T), + ("PeakProcessMemoryUsed", SIZE_T), + ("PeakJobMemoryUsed", SIZE_T), + ] + + +JobObjectExtendedLimitInformation = JOBOBJECTCLASS(9) + +JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x00000800 +JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000 + +PROCESS_TERMINATE = 0x0001 +PROCESS_SET_QUOTA = 0x0100 + + +def _errcheck(is_error_result=(lambda result: not result)): + def impl(result, func, args): + if is_error_result(result): + log.debug("{0} returned {1}", func.__name__, result) + raise ctypes.WinError() + else: + return result + + return impl + + +kernel32 = ctypes.windll.kernel32 + +kernel32.AssignProcessToJobObject.errcheck = _errcheck() +kernel32.AssignProcessToJobObject.restype = BOOL +kernel32.AssignProcessToJobObject.argtypes = (HANDLE, HANDLE) + +kernel32.CreateJobObjectA.errcheck = _errcheck(lambda result: result == 0) +kernel32.CreateJobObjectA.restype = HANDLE +kernel32.CreateJobObjectA.argtypes = (LPVOID, LPCSTR) + +kernel32.OpenProcess.errcheck = _errcheck(lambda result: result == 0) +kernel32.OpenProcess.restype = HANDLE +kernel32.OpenProcess.argtypes = (DWORD, BOOL, DWORD) + +kernel32.QueryInformationJobObject.errcheck = _errcheck() +kernel32.QueryInformationJobObject.restype = BOOL +kernel32.QueryInformationJobObject.argtypes = ( + HANDLE, + JOBOBJECTCLASS, + LPVOID, + DWORD, + LPDWORD, +) + +kernel32.SetInformationJobObject.errcheck = _errcheck() +kernel32.SetInformationJobObject.restype = BOOL +kernel32.SetInformationJobObject.argtypes = (HANDLE, JOBOBJECTCLASS, LPVOID, DWORD) + +kernel32.TerminateJobObject.errcheck = _errcheck() +kernel32.TerminateJobObject.restype = BOOL +kernel32.TerminateJobObject.argtypes = (HANDLE, UINT) diff --git a/myenv/lib/python3.12/site-packages/debugpy/public_api.py b/myenv/lib/python3.12/site-packages/debugpy/public_api.py new file mode 100644 index 0000000..c61a260 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/public_api.py @@ -0,0 +1,195 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +from __future__ import annotations + +import functools +import typing + +from debugpy import _version + + +# Expose debugpy.server API from subpackage, but do not actually import it unless +# and until a member is invoked - we don't want the server package loaded in the +# adapter, the tests, or setup.py. + +# Docstrings for public API members must be formatted according to PEP 8 - no more +# than 72 characters per line! - and must be readable when retrieved via help(). + + +Endpoint = typing.Tuple[str, int] + + +def _api(cancelable=False): + def apply(f): + @functools.wraps(f) + def wrapper(*args, **kwargs): + from debugpy.server import api + + wrapped = getattr(api, f.__name__) + return wrapped(*args, **kwargs) + + if cancelable: + + def cancel(*args, **kwargs): + from debugpy.server import api + + wrapped = getattr(api, f.__name__) + return wrapped.cancel(*args, **kwargs) + + wrapper.cancel = cancel # pyright: ignore + + return wrapper + + return apply + + +@_api() +def log_to(__path: str | typing.TextIO) -> None: + """Generate detailed debugpy logs in the specified directory. + + The directory must already exist. Several log files are generated, + one for every process involved in the debug session. + """ + + +@_api() +def configure(__properties: dict[str, typing.Any] | None = None, **kwargs) -> None: + """Sets debug configuration properties that cannot be set in the + "attach" request, because they must be applied as early as possible + in the process being debugged. + + For example, a "launch" configuration with subprocess debugging + disabled can be defined entirely in JSON:: + + { + "request": "launch", + "subProcess": false, + ... + } + + But the same cannot be done with "attach", because "subProcess" + must be known at the point debugpy starts tracing execution. Thus, + it is not available in JSON, and must be omitted:: + + { + "request": "attach", + ... + } + + and set from within the debugged process instead:: + + debugpy.configure(subProcess=False) + debugpy.listen(...) + + Properties to set can be passed either as a single dict argument, + or as separate keyword arguments:: + + debugpy.configure({"subProcess": False}) + """ + + +@_api() +def listen( + __endpoint: Endpoint | int, *, in_process_debug_adapter: bool = False +) -> Endpoint: + """Starts a debug adapter debugging this process, that listens for + incoming socket connections from clients on the specified address. + + `__endpoint` must be either a (host, port) tuple as defined by the + standard `socket` module for the `AF_INET` address family, or a port + number. If only the port is specified, host is "127.0.0.1". + + `in_process_debug_adapter`: by default a separate python process is + spawned and used to communicate with the client as the debug adapter. + By setting the value of `in_process_debug_adapter` to True a new + python process is not spawned. Note: the con of setting + `in_process_debug_adapter` to True is that subprocesses won't be + automatically debugged. + + Returns the interface and the port on which the debug adapter is + actually listening, in the same format as `__endpoint`. This may be + different from address if port was 0 in the latter, in which case + the adapter will pick some unused ephemeral port to listen on. + + This function does't wait for a client to connect to the debug + adapter that it starts. Use `wait_for_client` to block execution + until the client connects. + """ + ... + +@_api() +def connect(__endpoint: Endpoint | int, *, access_token: str | None = None) -> Endpoint: + """Tells an existing debug adapter instance that is listening on the + specified address to debug this process. + + `__endpoint` must be either a (host, port) tuple as defined by the + standard `socket` module for the `AF_INET` address family, or a port + number. If only the port is specified, host is "127.0.0.1". + + `access_token` must be the same value that was passed to the adapter + via the `--server-access-token` command-line switch. + + This function does't wait for a client to connect to the debug + adapter that it connects to. Use `wait_for_client` to block + execution until the client connects. + """ + ... + +@_api(cancelable=True) +def wait_for_client() -> None: + """If there is a client connected to the debug adapter that is + debugging this process, returns immediately. Otherwise, blocks + until a client connects to the adapter. + + While this function is waiting, it can be canceled by calling + `wait_for_client.cancel()` from another thread. + """ + + +@_api() +def is_client_connected() -> bool: + """True if a client is connected to the debug adapter that is + debugging this process. + """ + ... + + +@_api() +def breakpoint() -> None: + """If a client is connected to the debug adapter that is debugging + this process, pauses execution of all threads, and simulates a + breakpoint being hit at the line following the call. + + It is also registered as the default handler for builtins.breakpoint(). + """ + + +@_api() +def debug_this_thread() -> None: + """Makes the debugger aware of the current thread. + + Must be called on any background thread that is started by means + other than the usual Python APIs (i.e. the "threading" module), + in order for breakpoints to work on that thread. + """ + + +@_api() +def trace_this_thread(__should_trace: bool): + """Tells the debug adapter to enable or disable tracing on the + current thread. + + When the thread is traced, the debug adapter can detect breakpoints + being hit, but execution is slower, especially in functions that + have any breakpoints set in them. Disabling tracing when breakpoints + are not anticipated to be hit can improve performance. It can also + be used to skip breakpoints on a particular thread. + + Tracing is automatically disabled for all threads when there is no + client connected to the debug adapter. + """ + + +__version__: str = _version.get_versions()["version"] diff --git a/myenv/lib/python3.12/site-packages/debugpy/server/__init__.py b/myenv/lib/python3.12/site-packages/debugpy/server/__init__.py new file mode 100644 index 0000000..42d5367 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/debugpy/server/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + +# "force_pydevd" must be imported first to ensure (via side effects) +# that the debugpy-vendored copy of pydevd gets used. +import debugpy._vendored.force_pydevd # noqa diff --git a/myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a647aea6465270fe934481a19472f51fc2e6661 GIT binary patch literal 261 zcmXv}u}T9$6nuMv1~GnuSP3b-hp`O-F<9DZVYB4!Juhqac9-4F!G4L~;J4@(q_wgW zk}8#Za85PDFf+{Oczg;OU+r^qF95!K@sDC4yR%H*fq;aD7m>uI`01_3NwK{kt~QNJ zrR>;{^-Sff^)*YEh&$Sz4E_h~`p7|JYa-V86xauR;K=53;T0)da9Bs{(0TjD@y-NQ zX~s6O=}@Z*U5YDfZp)h~1{L|*E$j8N;ef*e=EjaaN~w&BQkE_qMzhw^M)TZ{@_7CS Sp}+fkB!t+XgShg?S^fd?`%It! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/api.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..866d714366500307d6e9cc631caf06b3a5dbfc03 GIT binary patch literal 14775 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/attach_pid_injected.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/server/__pycache__/attach_pid_injected.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b78d89b8d5fd70f9c49e364c12b2683ff9c1783e GIT binary patch literal 3675 zcmcguT}&I<6~5!&F*CNu#xW3#FeM@D4cL$@N!0u;g(ifp*h=kITBK?;crIp)J!9P& zFsAlGqE;JMl?V?joT^f?+Ld-uqVDD?`&e}!Hd6aw2X?WBm5Q`drM|g>N~`Qk@AcRi z7T8u*+mYtXx%ZxP?stCfx$`HdvkBnm&&i*~evi4Y$e{k%Ys}7HF|!IpFabnLG$p7B z3Q}=PU99nq*EJeb09qbV#&E)Nj25#`yvF`dB=?Zi5!JsFHqrb`Fk#P_LY9T=KZznK zr3EE94x<_rF{3F#Z5jqeI5``OK^ROSB??tFD9$2Djs*ox6Qa|7n$q{;puY8nG~DD25m zINXOdMGEWIyrzs;&^cSy7H>W*n>A(4S|-#jQc;8_;(Vca~BZud+psv}7 z7q-cfJw*@k6rI334;-Z_dWlqBp91oQJ_S4_MlL6hh=Bhboa`vn}PB#12Q_lzm?tppon;=bfA5*3ONfo5`Z2tQ= zveXiF2Vn0mehVrdHqgEaeskNv8)_Lx5mYo_rKrCX+?1Y9%e))elZnr>4y5h8>q%trWCqG}k%TlENoBNYMLr)M zI2TbR4fdsk=!_79YNXo3Q<(_1I0sS0Xx)5D68U<+52rG^U6J{;faHZ1Lm+%5p+tp* zdM#XA@RKljF!_23eCcZ|bUz&aVC>zoFMN?5JPH20VMC;&BAO5elUj6;3-daQ0m1nw zOlguLF9eQ&ySGYe7IB0S;Qv2}42FoWR87JWTxdT6VSO=h0HAKK;@^nv>@TC!y{f(7P^KN zc}j{I7kRw|jGI1{`F`*h{W;x|R78jsBo)`6ZWlxm;mcpQM-^Gde+ary5QUTm5idl^ zUjeo{17*AsyMMgUQS+wpU!l%c<)>y7iA*Sf$mOcr@m{kDsOly~)h#JOo5tuBN!D4u zrq7EK(rs`aqfvF6B;!KXbZ0FNYW3Ge_fARkd{U5P-Z;p-gd>MwQkjGJY$G8GC-HgE z9n}L!$_J5p)?KwN!p7lfjH602smSOgiD^3_twg*z1~opGP$q?h0WJoS-YrUMN>L#% z$Ra-@B@(=V-&(c|G%D&K>J~|!QgjP~DTF$S(JnIU8d8ZzxR`&4kb-m%f=H0Cy}dFH zId!WFwb_&bTZ4ds^H1$h z>`&Pz?3cb^+1F9_b(VdBvM;>D*ao~su5Z@`T2HQ~SJJC*t-Mw28Qy3aDRLvlmXR{o zyh^XotL_!|L#o*Q>IOHoV*{Sk+g!&c*I(lL%Yp8Xd!M~lF$2%QE--n#l_ucv)pd%& zs~g<4iVHZ{WjaqUyYub>^}8z@^h*_!-4WPgPj0bYe_{K#*tYFv|LUccONF78%kTF- zZw?pPaIraD+rQws$82-{P449q_wqW|d)HcKxFQoMvz|?Mu*432GFW5>H`t+VhP&6A zzg}c|%53xUcz(Pv_^|c<^$qrHnPv!tqUV*5#i!B}=?~WR3pY0Cn?%E(zgif5&YWuK zw3XV=e$Mumo!)yF@;@&~&z)z;;_La>%iM{3Qi%(GI9nWitrYnY_S_lx2QWEZyEJI- zdf)dDzSq9)?JKf<6+f`jZ;##{EjoKYxAc8od4sYz{aajcn`_(Tx=UR526r0U`=;Ur zzLxLueuep_(qkv-Zr!Fmn{<1LZr`9g%8cvoWgLTT*1gGgmDsK?*zOnV6+}zbgRi6qIEmZ zi%OK|(P?Z8^Zq{`;_N#zm$+HBq74TTA*5`YeuWDmhTJtiqTuHp&`6Z zZf^Cbm{iOZMg6@AP&cTrfTLmqtZVsV{^IiW{Pn`6b>`F(U3Pnx)A{uBVt%oJ9;EN5 oA1vNq{1APVUQ2(pxVHGo{CZ?`z4O+(du)l_v5iwyxO&0-6QvFZJseqcqDNi8sTnZ8C!C?Wx$G@ z6&Yr+C(K|rnX$Q{D$Y!*LMrSIshPdQ?47#HB$>Ulceb`9WMZYqTa&3}t9EL)>YB&i z$&#vj@Bg1xKWr4(d+Q$X>C>nG^Xzl}$9MkLZ}RdS6okJUJa*!rwo}wU;*A;#vx)nk znJ8+K;whdUpt_YS-A$8wQ@4p+&E00Wng*CbOSgqa8uNg4(AI4mWV_ixd$)bi(d~eI zMlkmms}1PaQ7p>FRbtdCNfFpu5{c>Y@koyYopq1>|ZSC>->5d&x7~K*6A| z+Xrd3yNI{<*XgyYDIveVUQO#)q3A;x7l!Uq6SbS-9p@lW>UQ89MxR`bQMA+_D?IjjL(NB9A5x&6<>Ic>ZN(_Il6l}?}MCb zz6jzKd@;l|drEsl+YXx5ktt{u4eMl>9LmtP| zkXOxD@pPREgLu;j?ce_goX##kE!%rTVLl)Y2|a#BHtz_J$d;qwP$Vo{jtmbC2r|WRwMp%Gp<#RI)dNd?5=@X!d{n+GB%@Ddyf#Wu9|h6aRia8PLD;#}Pz*E$&ChX<6q z9zp%BltLev&q2QQWvjt`$08sT1DH|jVn2wYz@IwZ9;Gz3ou>j$L<^>J@R z@SqTm2BXl&dWYkv6g(lca4Jb%-9Si+3Sn%%t|t->3q4T>w=lfW+82?cZ7nag z4n@Rh+ar(b>P`nk(K=|Yu4fjYpt*3$m!$R9j_4V~R$YGM| zq7fK!FxuDl688f1ljPJ%QC<+mM_PDw{pcgLv)hNfj}@EjwowH zg3?x)>_9Xk=PB2KGU=iR%jRQQ55DmLyzzkY#${iS4-Q2IF%azOfnG!5lR{W5zydam zaMC}Z?n6vHJkc;1jyCi(9F+u7YUmVj`L&B7KGe`INGGF_p@tzb(l11Jgr(5&0ij`V zLo+t=p{P(d6zn+(%UN6T4N&7LL2Q6d)ent`dDt>WYvE5C zg6P{+#_374XV$Ju>>fKhv2n^f)iYIkY5R10(p#I#^QW10nY@BTXU12ScsjGJI?*}S zF;P7co$#kzOVdnsW<_mc|3uM*G}S&ak}9Z5GqsuGC5eNXCCidbX{KTs6lkCDPV`Ka zj(5#4%fw2x3o;XqgoPu1lWck=Dm$d%dEqVpra^!sb2WIe+8oNn2dSfWpRj4 zf+Q2mqgq*>?l(3Mr7?_~)spJYdb|9Gw%vLm} zDjKi1rz^Ik3tN(|mW(HVj8$HF1=R0nL_b`_)flb8h^#~03g7(ZH#w!VtlCQv6%u3w z5^l4H3F?2Etd@fLe9BdjI6x}x$*LjnSm9!1r3}E$B&EO7s74i4IUUuH8-7u^MytY= zrlL55B=oatO26_Z^(E5O2)@D(XqiF5C1O+XYAiz{vJqxa$ALq@Rz@V*s&EXM5zd67 zADH0&bST=>C!0c12@7%A(R)eBK%X!$1T2UTAi1~&2=>FDv;?9AHOJU5ta$72WcQ`+ z+YC3y*v{`cyJzeh-`@Y|q-fjcn@}?Mr1Wc(0wmd>4=;+$iiDgKLF<$w)CZ=n>;#DG zp@?kD%2e4I2mlk3fR6_PVk0~fH)6C2q6LF5RtB%qYU6JM!b3=`kAKyyqax*~m|-d( z8Nardp#-MMqQLh(NyVwd)CY8zh>H>48GS}V0%htSvaJKb!Q*_eP22^UN8wMxQVDAM zl?3(Z)Z$wsRijppoC)|6Jw}1rg#oWn6&bQ$XN1149+gL}i;KfZPH}W{W7I6V{^{1g6*wRI-IA8DtyE zwo^e7Z`r0w zrfY7qwTA6(7ID=od;S0x#=&SC9XpCmh)+WRYJzCkiN3AYdOS~7Pc4l`DSBLjUziW;Zy zWq3qb8BE{fCyZ47=!Ds|YDL@)FRAsBDWhS^tcEEw?gDM8qG5U-_5mzYnk-XA27&N2 zE>j#45uTf%lJCR1jzWeK`i*qiyt7W7TY@2%ZTNLsXC3;&#(mLmS8LO+I!ApG*2t)N zlo_?e8HwS|Am2@+7CRMns?>3d+Qz7bx5O^V)HF+We8ru}SJtWGl} zfRX9O1Q!$qZg4mX%ILrdC!FaS7?wh(gokuX%)WlZ=K6K;Z~Y(sHw3~=L&(Hp-cT4e zE|@%MaB$(_!Q+DHXUVcuwAdQxkJt&3YzLVh4WZI3mXQ07Gd%*~1Y!}~`)!L>vCN<` z15!#Dk{PU?kV!ZZ90|siT|)M(qKF&UwgA-9`w-#Ub{1aTKE6HaTuJnX1L?x2ldh*9 zSgC@diD%wq$1IuhW$!dxZn#>VF0UW=j4@+96HT9c3NzlyvG$C&bgX^eWVRR2d5b5a zZ*GA*C|NjhWG26As^eCE6{&PXy09_nYMeJy1YUz9AlV7uS~?Q_~Uwf2JTyPhu} zv)CNcwLD--dgY9>y@ z;KgpJfX7iI(}GbyFcn%>&DR=spmD3xL|^8H4aUUHQBAqYC9_Y_pzms%i8uA5J+LUmbLhKK94HBouRm@^BT*d% zZr!*gnx8F74O3zXZ{``^a>W#9`jO2n3Lj?gv6fLL%$lHlT+^OMnK<*L_FJJO*`z+T zYS^SJVf*W&w&osn+>#4pQ`JIsOs~`0Hn(-fTm&Y_n)0#Y;qb|DZZN3zdX zLLSsMG6dkt@knGqwhTm00|ZE5%RB)k2N zuk=dEJC&C!uQI8!y0ou8@$@`s`bWV8DZSF3a&no9s;eC---hcOf423btv}h8^6eP! z_`R=cx+d+b9qRy1VQJO5-RHZ`c1<+hVoJY!V53|`u;ZZ$(q#Q?*~V1a#_Rlzr)OKA zNwq$cE<2odA4#%DfEfVMLkYS0FPm5GY@|MJY}mEjyug;k{YdsMZYxEHBpMfC7UB-b zG-#1TcO=mze1Js~)YTmcMS<*;83Zf-UoG6l97VBkp?_%Mjx)K06=;~2ajOX2ChW+? zFVr;+nx-!LOi|6~QP;k>4)(FBU)w=2u55^E{G%W7ltn?^&3Zd=qfpiA8-dyl{Ws); zu+_K+?BgRe^>sbbm5)(VxN%XrRUo8IJT+iPg(BBD;^uyokBb8T2qzphJx_%hl>f|ARz%jRp* z>pMR@lP+i;v)*wQP4r$7W}GYL88+`Aohe)PPQ~Sl_oUfXPo-8pm0qIhX-HQT~6~an+tY2 zOds26NPq08+u36Ic(V!9TWCzTm?8a%1D`7T0;A8KC_z<<=73tXj%pB=s?3>)>zr^0 zoPL69aeKTkUWYh#}CCKgO!qZ_KK|!6M4am`BadLc$_K zW`vjk+A(`;7C~(TI5V52LEN$p>=neiV+D_(*CLwTF}G39)vt-!vUqi@xUMdXb=E0Z zC*ah8bpipowuwujxJ<3&^6Y;qQJDqWz#W=Qi^m2Y2u^0rNU_qc9gWPf+kt>Pb}FKyLnk zo}@wX$f|VI6UwMeGTRUOLdOUwGJkFcd&1oH2ju>Lz?%GKF#s2ZIWS;BpMt4Go6#VL zWEZ?o2@X2Y!agM?;OVDG(E-sv6D{45ccJHE-+12}byMqaIhM}ldnegT>{P)eC)o2Y z&&56CdnUdywm;+ce#Z$C6$HFSe%rD1--*n8eMi-fmGm!Hm>`z1C(;7RslAfdpjG9S zfIbUpCFC+DK|l2Ba!QpR9iVEz3bp;fG->)%iv?aT$O}N;!P+CQMu-T*N=YD1jL!@hqmvs4`ObcrKaY3bLfMx; zl#uVg&TXTANN;6+RJ4u$xp^Di19@6N#(^_;{|>xt<04jP1C|~>Cqc)wjpprwT+~5G z$Yl+j^*&ykhNTFgiCAdRolUy&8-se)MGFSM-ck-tAmKFBp-I&RrEqE%g|n59ua##` zZifCD>(=0b1$CoZyeI%%fMZ)?Xu-FL1a249ZGa67rE=7rAgA&Mn&L-mR%ie~X1m1G z@Hmz~7?MC0IKe4`qJ@jq3SbBbBA^G^Q%N|$)Oa=*k~mR#WjF*fUOa^r_;a&jl}ggf zimxJlEn%r}Bq~T89CvZj@DKqQ9uWaxnE*f#m6wtO1LP@EpjV6x0?IWwh&b&)C@jcJ z7C(h!s*o57<8iB^^bmyuZ5Y{lWXChRJB}!(HcAL`jz&ZcK{OCjmjoeflH(~jXkh$wzhRGoX3v%t+FX1$+qk=md$wTY>|cr;7sP*P*(gdL;wqa57Q_}WEOYE0Z^{= znd#8?Ko%>`3K{V{7Q^U1{7HDof#6x*#g_3FG_RB8^=W5AqWyEHC&RkG@OUrA#$#{9 z6MOEISG--5WJ=(LO!OtW#^lC5zg}^hIjF3nA3!}l*}*}QqR^HjuOJSq!nlfbDKW~} z!KyMy6&-H@fOXUwx8|C1{nbb&-ZW~}t;Tlhr40*xI`d*XJ2Wof$;`d$##Btw6xQlBwC3k&|j z--9iyy-~1%%{28q=r*c_x#%fJQ*kyce~{mjz_YoqHW(+X&bB%lkeZqlgtn?i9fn!8 ze_btchk7EV*TYkzj@KNgb+pXU^^mSpM4jp7+L+0|BIX+oi(tQ=2!~<<&nbtZTx>ZH zo1ckQZi!Foi~rAD)y%f4)oMRRquWB`6g%Upy6c06-+T7`m*0IkS+hOkDwuzsrkrpL03E8p zV}QcXArB4#3cq^LMzT!yr)fBQNP1T%U8^A`J!+V(*p#Z+bp6zgSJP_G<~*fX!7-Xp zG|pDEq$*l&Y`VEMdFXJu;z+viXwr4`E3Eq%fC>nve9yUS3H5QCeb;L0lO^_DtIVIQ zq%mH-u6?Wd)AFV5o6MhXvOs!)%tR?j81}yshW#XyiKknkfNnJ9@@?P^;94%TOJxFJ zL}=2p-vQMw3cBi_6YSF%q7K>h=TMGw18qE`_JX$%rT&hgHH}H?9m=ZjO$Mr540MHI zMCE#EHTC$?Dl-EXKVqQF)f*czCfW^Dxq8!N=nZPUi^Ahe8=h7!DhRjNG*%A1T^_Ac zDWcU{N)x_0k2$h$PaQJ|0-YYj`Qjk@3}eahT-Ck+cr_dVWuOyQ97kZCLA#bc?D@cxtlc%|@?Pv3@4B-2o$Z&m-*&B;%ky1)as0)p=Wpe$ytetr z+dtTzT+@j}2geUy+5OJJ%Ljk4YPRKAs^!>cu4nHQa_{-xJMsR&y94Q}#&ls*($z#v zoaMKi%c0P$t2*VXo^jQDv10YPo#*$R-Iw%mx0ouTp7y{1wZK4%FuH3n_9qz!fO=@= zfv&lNu0x#-80>7+b{B=5XupPAh)+GCw06FsSF5)_N=G%UBNx7sODp8TkWpD3Y}MkZ zSFO2U)4bFi(2Bue(WwozxtNfKs{kX{Yt6xkcxFMZi13oopMxm@wr07eY30OVvSl}F zK^LF~K@LwRvU~Gk$surQ9taMHd-@hAW3j?#hQnb*H;_8Jk-=AYFbEER0oW)kID`|= zUBAZw7U0$(8xfon!1Y@+xxgWfbP1ai{|cTzjXM-AWiZoV!@NBHa-wsN@lJHk zFiYm$6zfjf%B~!L=fvd`?}RUhuO6GJY?^cDUpz5>;$mbxGS!=Q*NmCxSm#A{oW1B7 z_e{}KjknolcOb_;Zci50OrM%z>tVOgGD}koxLj_UVK(FD2lu{YUez?*t_I&fa?rVH zdf#VE!=qbDv$x+{hCN=FLm&uoaqquOX zZdg2?T9rtnuyM}1z|_hC6asrdB$xz!d%`wAu1!LJ4(Sg%M^@@Bpv={dCZQkgokih^%|MExKjC=tek5Ng&sT+4xD2H2J- zxZ~hN&%w7AI(a=*XjdwP=KVfJllTZaApR61d;`jfr=M^ zr{Lis7wQiJ*&!1rOt2djtML$o;^6R<1J}w!<(nUcOT3= zcfrNy#-E!Aj=zxTgmYNS0eY^aa`LrHuO&pF^)%Sg-V7)k5cSx$DWX(v&wQ@L2Zp%zU?Fyv`$P(^Wo zood*TflfPHF|Y*<_sXf-8&I;SPMJ&3u|0kSI{S#0s6&lYA%ku-LK#}frSlk=nQm+- zjE8N7kAGk*wV{W;&?AmO6AFjX)D}F1ZgDv93k^_vvS&0|K2Z+{lD_pDvG79ffamLj zL#RoR-A?orZOcQO;N2-(0FsZ0aF&a}rO{p>Y6vzj{sx|W3wLS)5}<~_p#?eGs6r(| zQ!B1CPKj@Co?)x!JjHLF#_jo@bhYJ2fAS0Sjn4n#OnchLm^*CA74ua4+x8iDIh37c zxfIJKt6FB*tyv8vS+MF_$&V{PsGMP&@35}1BNH3G>(+IZ+pKbGv0ytmp;u%(+++Ul z6#87-0n}u}%jHeyC{VUF^*$Fmk;|#ipq}T@8geaJb!mf3)Z<&zGz%DYHs~&ziu)!= zdRote8dX9nmj!Nknq&DIp61YG3{P`tFNUX@ZlZMsJ~_T(88u^Hb=06=(-U;MN8Lh4 z!IcwTGW!t=T@-i=uNe(FpW6)2S1l?Gw{TKp)-jDyMmPU*t`_^(^uobARo08Owuq-K=WY{*ta(73gR|0#>1D054$tq>)2^UhdG|_H7_N7GS-oK%k+1{}4pz zTza6M$)OPkXrTM|_A(2<1V`RcbA;4?%Uh|d~<&w^W^E=OpPcpjjX>yfsqxBXHitlfa> zz187RJR`Ynobt66C$+%I5EiNjC(A%HplWzqtBtf)^7~&{_YxQCfAcsDCRu@C^^aQ|waxKqSaZwHhHl8ubH_1FaJ@Rq7Q$ zqITU{POkl2=Q*0~J1`^N0rXkapmg zqIzR+P>tP+mF;MBHSI8E#dURk4G6v;88o z%SnBa;Q^jZ9w4Prz-+i+c!Wc56##Qy8IFM0>RNCl8HVqZwOg>(!oq1huaoNK((Gsd zhJ~eU4&oLYTdTB(_7}cC=<3&O9}d2cKO%D~0=(nMksZ7C1a>|jfbA6^xq-c1od;!l z9n42*)~hj#wSqwy6@xu!GI?M`rbtz#<#>)K8^@A zyaBLW`Fj5{gEmNXJ!08i!Z{{-;ZHDyyahf4C0}UcSL+Bg;kV}S&8HNVzIMOJ3@$-H zuZIVRz&Qc1W;`cU&LF>yRWkh%Fga0XWx=uF(2xM1$d|)WB{=Nx0@>B%%ke;#LCGF8 z6qT>Z35oLUkQE#r06rt;t6U($S!GB9Kuxt=!Iv1_h{PmDX^dtdf`dz?Zfr`f_`25~ zz-2D}6BN+gj8&^t&ND2M5HJ1<5WR^E=U*WLt=Ca-v3|Thu}d=@*IlokVK)6f??|Ha zPJwr_>qvnD$3x~V+x zTTPQKms+NTw0A|?Rg>tLXFOgev44I!W%tdpOH%BTsrKpRX}0Ef_WbdZ3Eza6wwM3T z?inwhYPouJtT=6NoVQVy{09z7vAUCa{;OMO*R-Y9wB3+ycBI$rn_>3fV=4Qx_q@|D zq^s87V%N``O_t~BFKo}<2jlg5dY&@5tPfbKX4U(<-`)NGfp-tgv5t$jaT~&nSFG=N zE_>2!ZE|({eY2^?3ZHBMt;?;>MY4SJjI%k(G$)s4GOm(LjelyQ#hQ~`+$OEQBd&&R2L0%vSJY# z+@4(*)nLVFt@=E=T1#mPGJHG6JiadC6HH)MeQf9r44yKYDi5mOH^HEEYV~VMxo$G5 zGiVsOrgEW?uIKAt;E{ZNPI4HX*G#JN3h!T2@p7sC`qwAu@dN%e^lS74eW6Q9>7F$( zE=`q(ajk`M>2GqKIzs)*gMU;12K`=5@is8HvOUsU9Lct?%JzJ=+4jO@7+IrRaU)-oWR5(fO`;@@KhjTjMk?>8`Y3?npa6vP&1 zKy1PYO%g?9Az$vok!g{Ban=4;22XV=YyLOA$4L$G_&$_Ep?y9>^ zi?@1g*IgHtm;c?4c@O1Uqhhrt>@R$C@YaeqLRYG%PNvIOr`)Tr9lq}U@VS(G<1cpo z^}e6)yUp&-wmngB(fJ+cR|wAfzIxC^xr*WY9_WaQ_GVm-*AM^fxsRT^`RpIfCc6W$ zUb_RFZ-C~Zgv;n{N4tmm#J#;^EA^?z-qCFSv~)*NN2B>yjTX51)mD4wI`iK!%RASY z|7MK^(*Dij7f?(&^nV*uxOil@qOrq|?SOp|8py)>@Yy6RYw{yL`VR<^ANG-L%1MMo z6foHhN)`U@Rp9t=m`!FWXSG1>9-ZCb3vRN~a1DxM7!g0SZJ5HP z3#SXm(RNUN)@Ki97hqI}5n`l@cD4mmZ5Ta`(IJewG3v#L99pFi5*U%K^DRt~ zU4u%c;t_lvQ{TmipqPJ!sZTKa4MzWh5iVNg%SetmyvnBv8WXm2?t4}{T>wvPo-t`+$3!%3U79f8vzqAqdk%=;1ftS^ zpR&;Id-)7R?jnfR71C9AS5wvXH#Xj-ytI4b@O`|@H&fQ)X(rjUJIUBM4GDqfF%F0f=KH7KVRPvc) zGfmGXnddSV`?Ldc&ZL|6B$>T<%OXL#sWZv!&RAU2Hn<(W*`u^LUsvKXCD?n-4DFlG zx6!2&(fbr!?v?uJRrB>Uy>eQ*Pr+rLW$8oobr?Nf?=Gdd>bHmCXQ1xdo9My}_#K+z z`bF8&c?(>jtK}8:] + [--wait-for-client] + [--configure- ]... + [--log-to ] [--log-to-stderr] + {1} + []... +""".format( + debugpy.__version__, TARGET +) + + +class Options(object): + mode = None + address: Union[Tuple[str, int], None] = None + log_to = None + log_to_stderr = False + target: Union[str, None] = None + target_kind: Union[str, None] = None + wait_for_client = False + adapter_access_token = None + config: Dict[str, Any] = {} + + +options = Options() +options.config = {"qt": "none", "subProcess": True} + + +def in_range(parser, start, stop): + def parse(s): + n = parser(s) + if start is not None and n < start: + raise ValueError("must be >= {0}".format(start)) + if stop is not None and n >= stop: + raise ValueError("must be < {0}".format(stop)) + return n + + return parse + + +pid = in_range(int, 0, None) + + +def print_help_and_exit(switch, it): + print(HELP, file=sys.stderr) + sys.exit(0) + + +def print_version_and_exit(switch, it): + print(debugpy.__version__) + sys.exit(0) + + +def set_arg(varname, parser=(lambda x: x)): + def do(arg, it): + value = parser(next(it)) + setattr(options, varname, value) + + return do + + +def set_const(varname, value): + def do(arg, it): + setattr(options, varname, value) + + return do + + +def set_address(mode): + def do(arg, it): + if options.address is not None: + raise ValueError("--listen and --connect are mutually exclusive") + + # It's either host:port, or just port. + value = next(it) + host, sep, port = value.partition(":") + if not sep: + host = "127.0.0.1" + port = value + try: + port = int(port) + except Exception: + port = -1 + if not (0 <= port < 2**16): + raise ValueError("invalid port number") + + options.mode = mode + options.address = (host, port) + + return do + + +def set_config(arg, it): + prefix = "--configure-" + assert arg.startswith(prefix) + name = arg[len(prefix) :] + value = next(it) + + if name not in options.config: + raise ValueError("unknown property {0!r}".format(name)) + + expected_type = type(options.config[name]) + try: + if expected_type is bool: + value = {"true": True, "false": False}[value.lower()] + else: + value = expected_type(value) + except Exception: + raise ValueError("{0!r} must be a {1}".format(name, expected_type.__name__)) + + options.config[name] = value + + +def set_target(kind: str, parser=(lambda x: x), positional=False): + def do(arg, it): + options.target_kind = kind + target = parser(arg if positional else next(it)) + + if isinstance(target, bytes): + # target may be the code, so, try some additional encodings... + try: + target = target.decode(sys.getfilesystemencoding()) + except UnicodeDecodeError: + try: + target = target.decode("utf-8") + except UnicodeDecodeError: + import locale + + target = target.decode(locale.getpreferredencoding(False)) + + options.target = target + + return do + + +# fmt: off +switches = [ + # Switch Placeholder Action + # ====== =========== ====== + + # Switches that are documented for use by end users. + ("-(\\?|h|-help)", None, print_help_and_exit), + ("-(V|-version)", None, print_version_and_exit), + ("--log-to" , "", set_arg("log_to")), + ("--log-to-stderr", None, set_const("log_to_stderr", True)), + ("--listen", "

    ", set_address("listen")), + ("--connect", "
    ", set_address("connect")), + ("--wait-for-client", None, set_const("wait_for_client", True)), + ("--configure-.+", "", set_config), + + # Switches that are used internally by the client or debugpy itself. + ("--adapter-access-token", "", set_arg("adapter_access_token")), + + # Targets. The "" entry corresponds to positional command line arguments, + # i.e. the ones not preceded by any switch name. + ("", "", set_target("file", positional=True)), + ("-m", "", set_target("module")), + ("-c", "", set_target("code")), + ("--pid", "", set_target("pid", pid)), +] +# fmt: on + + +# Consume all the args from argv +def consume_argv(): + while len(sys.argv) >= 2: + value = sys.argv[1] + del sys.argv[1] + yield value + + +# Consume all the args from a given list +def consume_args(args: list): + if args is sys.argv: + yield from consume_argv() + else: + while args: + value = args[0] + del args[0] + yield value + + +# Parse the args from the command line, then from the environment. +# Args from the environment are only used if they are not already set from the command line. +def parse_args(): + + # keep track of the switches we've seen so far + seen = set() + + parse_args_from_command_line(seen) + parse_args_from_environment(seen) + + # if the target is not set, or is empty, this is an error + if options.target is None or options.target == "": + raise ValueError("missing target: " + TARGET) + + if options.mode is None: + raise ValueError("either --listen or --connect is required") + if options.adapter_access_token is not None and options.mode != "connect": + raise ValueError("--adapter-access-token requires --connect") + if options.target_kind == "pid" and options.wait_for_client: + raise ValueError("--pid does not support --wait-for-client") + + assert options.target_kind is not None + assert options.address is not None + + +def parse_args_from_command_line(seen: set): + parse_args_helper(sys.argv, seen) + + +def parse_args_from_environment(seenFromCommandLine: set): + args = os.environ.get("DEBUGPY_EXTRA_ARGV") + if not args: + return + + argsList = args.split() + + seenFromEnvironment = set() + parse_args_helper(argsList, seenFromCommandLine, seenFromEnvironment, True) + + +def parse_args_helper( + args: list, + seenFromCommandLine: set, + seenFromEnvironment: set = set(), + isFromEnvironment=False, +): + iterator = consume_args(args) + + while True: + try: + arg = next(iterator) + except StopIteration: + break + + switch = arg + if not switch.startswith("-"): + switch = "" + for pattern, placeholder, action in switches: + if re.match("^(" + pattern + ")$", switch): + break + else: + raise ValueError("unrecognized switch " + switch) + + # if we're parsing from the command line, and we've already seen the switch on the command line, this is an error + if not isFromEnvironment and switch in seenFromCommandLine: + raise ValueError("duplicate switch on command line: " + switch) + # if we're parsing from the environment, and we've already seen the switch in the environment, this is an error + elif isFromEnvironment and switch in seenFromEnvironment: + raise ValueError("duplicate switch from environment: " + switch) + # if we're parsing from the environment, and we've already seen the switch on the command line, skip it, since command line takes precedence + elif isFromEnvironment and switch in seenFromCommandLine: + continue + # otherwise, the switch is new, so add it to the appropriate set + else: + if isFromEnvironment: + seenFromEnvironment.add(switch) + else: + seenFromCommandLine.add(switch) + + # process the switch, running the corresponding action + try: + action(arg, iterator) + except StopIteration: + assert placeholder is not None + raise ValueError("{0}: missing {1}".format(switch, placeholder)) + except Exception as exc: + raise ValueError("invalid {0} {1}: {2}".format(switch, placeholder, exc)) + + # If we're parsing the command line, we're done after we've processed the target + # Otherwise, we need to keep parsing until all args are consumed, since the target may be set from the command line + # already, but there might be additional args in the environment that we want to process. + if not isFromEnvironment and options.target is not None: + break + + +def start_debugging(argv_0): + # We need to set up sys.argv[0] before invoking either listen() or connect(), + # because they use it to report the "process" event. Thus, we can't rely on + # run_path() and run_module() doing that, even though they will eventually. + sys.argv[0] = argv_0 + + log.debug("sys.argv after patching: {0!r}", sys.argv) + + debugpy.configure(options.config) + + if os.environ.get("DEBUGPY_RUNNING", "false") != "true": + if options.mode == "listen" and options.address is not None: + debugpy.listen(options.address) + elif options.mode == "connect" and options.address is not None: + debugpy.connect(options.address, access_token=options.adapter_access_token) + else: + raise AssertionError(repr(options.mode)) + + if options.wait_for_client: + debugpy.wait_for_client() + + os.environ["DEBUGPY_RUNNING"] = "true" + + +def run_file(): + target = options.target + start_debugging(target) + + # run_path has one difference with invoking Python from command-line: + # if the target is a file (rather than a directory), it does not add its + # parent directory to sys.path. Thus, importing other modules from the + # same directory is broken unless sys.path is patched here. + + if target is not None and os.path.isfile(target): + dir = os.path.dirname(target) + sys.path.insert(0, dir) + else: + log.debug("Not a file: {0!r}", target) + + log.describe_environment("Pre-launch environment:") + + log.info("Running file {0!r}", target) + runpy.run_path(target, run_name="__main__") + + +def run_module(): + # Add current directory to path, like Python itself does for -m. This must + # be in place before trying to use find_spec below to resolve submodules. + sys.path.insert(0, str("")) + + # We want to do the same thing that run_module() would do here, without + # actually invoking it. + argv_0 = sys.argv[0] + try: + spec = None if options.target is None else find_spec(options.target) + if spec is not None: + argv_0 = spec.origin + except Exception: + log.swallow_exception("Error determining module path for sys.argv") + + start_debugging(argv_0) + log.describe_environment("Pre-launch environment:") + log.info("Running module {0!r}", options.target) + + # Docs say that runpy.run_module is equivalent to -m, but it's not actually + # the case for packages - -m sets __name__ to "__main__", but run_module sets + # it to "pkg.__main__". This breaks everything that uses the standard pattern + # __name__ == "__main__" to detect being run as a CLI app. On the other hand, + # runpy._run_module_as_main is a private function that actually implements -m. + try: + run_module_as_main = runpy._run_module_as_main + except AttributeError: + log.warning("runpy._run_module_as_main is missing, falling back to run_module.") + runpy.run_module(options.target, alter_sys=True) + else: + run_module_as_main(options.target, alter_argv=True) + + +def run_code(): + if options.target is not None: + # Add current directory to path, like Python itself does for -c. + sys.path.insert(0, str("")) + code = compile(options.target, str(""), str("exec")) + + start_debugging(str("-c")) + + log.describe_environment("Pre-launch environment:") + log.info("Running code:\n\n{0}", options.target) + + eval(code, {}) + else: + log.error("No target to run.") + + +def attach_to_pid(): + pid = options.target + log.info("Attaching to process with PID={0}", pid) + + encode = lambda s: list(bytearray(s.encode("utf-8"))) if s is not None else None + + script_dir = os.path.dirname(debugpy.server.__file__) + assert os.path.exists(script_dir) + script_dir = encode(script_dir) + + setup = { + "mode": options.mode, + "address": options.address, + "wait_for_client": options.wait_for_client, + "log_to": options.log_to, + "adapter_access_token": options.adapter_access_token, + } + setup = encode(json.dumps(setup)) + + python_code = """ +import codecs; +import json; +import sys; + +decode = lambda s: codecs.utf_8_decode(bytearray(s))[0] if s is not None else None; + +script_dir = decode({script_dir}); +setup = json.loads(decode({setup})); + +sys.path.insert(0, script_dir); +import attach_pid_injected; +del sys.path[0]; + +attach_pid_injected.attach(setup); +""" + python_code = ( + python_code.replace("\r", "") + .replace("\n", "") + .format(script_dir=script_dir, setup=setup) + ) + log.info("Code to be injected: \n{0}", python_code.replace(";", ";\n")) + + # pydevd restriction on characters in injected code. + assert not ( + {'"', "'", "\r", "\n"} & set(python_code) + ), "Injected code should not contain any single quotes, double quotes, or newlines." + + pydevd_attach_to_process_path = os.path.join( + os.path.dirname(pydevd.__file__), "pydevd_attach_to_process" + ) + + assert os.path.exists(pydevd_attach_to_process_path) + sys.path.append(pydevd_attach_to_process_path) + + try: + import add_code_to_python_process # noqa + + log.info("Injecting code into process with PID={0} ...", pid) + add_code_to_python_process.run_python_code( + pid, + python_code, + connect_debugger_tracing=True, + show_debug_info=int(os.getenv("DEBUGPY_ATTACH_BY_PID_DEBUG_INFO", "0")), + ) + except Exception: + log.reraise_exception("Code injection into PID={0} failed:", pid) + log.info("Code injection into PID={0} completed.", pid) + + +def main(): + original_argv = list(sys.argv) + try: + parse_args() + except Exception as exc: + print(str(HELP) + str("\nError: ") + str(exc), file=sys.stderr) + sys.exit(2) + + if options.log_to is not None: + debugpy.log_to(options.log_to) + if options.log_to_stderr: + debugpy.log_to(sys.stderr) + + api.ensure_logging() + + log.info( + str("sys.argv before parsing: {0!r}\n" " after parsing: {1!r}"), + original_argv, + sys.argv, + ) + + try: + if options.target_kind is not None: + run = { + "file": run_file, + "module": run_module, + "code": run_code, + "pid": attach_to_pid, + }[options.target_kind] + run() + except SystemExit as exc: + log.reraise_exception( + "Debuggee exited via SystemExit: {0!r}", exc.code, level="debug" + ) diff --git a/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/INSTALLER b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/LICENSE b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/LICENSE new file mode 100644 index 0000000..1eb999e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/LICENSE @@ -0,0 +1,35 @@ +Copyright (c) 2004-2016 California Institute of Technology. +Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +All rights reserved. + +This software is available subject to the conditions and terms laid +out below. By downloading and using this software you are agreeing +to the following conditions. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the names of the copyright holders nor the names of any of + the contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/METADATA b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/METADATA new file mode 100644 index 0000000..3397cd0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/METADATA @@ -0,0 +1,281 @@ +Metadata-Version: 2.1 +Name: dill +Version: 0.3.9 +Summary: serialize all of Python +Home-page: https://github.com/uqfoundation/dill +Download-URL: https://pypi.org/project/dill/#files +Author: Mike McKerns +Author-email: mmckerns@uqfoundation.org +Maintainer: Mike McKerns +Maintainer-email: mmckerns@uqfoundation.org +License: BSD-3-Clause +Project-URL: Documentation, http://dill.rtfd.io +Project-URL: Source Code, https://github.com/uqfoundation/dill +Project-URL: Bug Tracker, https://github.com/uqfoundation/dill/issues +Platform: Linux +Platform: Windows +Platform: Mac +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Scientific/Engineering +Classifier: Topic :: Software Development +Requires-Python: >=3.8 +License-File: LICENSE +Provides-Extra: graph +Requires-Dist: objgraph >=1.7.2 ; extra == 'graph' +Provides-Extra: profile +Requires-Dist: gprof2dot >=2022.7.29 ; extra == 'profile' +Provides-Extra: readline + +----------------------------- +dill: serialize all of Python +----------------------------- + +About Dill +========== + +``dill`` extends Python's ``pickle`` module for serializing and de-serializing +Python objects to the majority of the built-in Python types. Serialization +is the process of converting an object to a byte stream, and the inverse +of which is converting a byte stream back to a Python object hierarchy. + +``dill`` provides the user the same interface as the ``pickle`` module, and +also includes some additional features. In addition to pickling Python +objects, ``dill`` provides the ability to save the state of an interpreter +session in a single command. Hence, it would be feasible to save an +interpreter session, close the interpreter, ship the pickled file to +another computer, open a new interpreter, unpickle the session and +thus continue from the 'saved' state of the original interpreter +session. + +``dill`` can be used to store Python objects to a file, but the primary +usage is to send Python objects across the network as a byte stream. +``dill`` is quite flexible, and allows arbitrary user defined classes +and functions to be serialized. Thus ``dill`` is not intended to be +secure against erroneously or maliciously constructed data. It is +left to the user to decide whether the data they unpickle is from +a trustworthy source. + +``dill`` is part of ``pathos``, a Python framework for heterogeneous computing. +``dill`` is in active development, so any user feedback, bug reports, comments, +or suggestions are highly appreciated. A list of issues is located at +https://github.com/uqfoundation/dill/issues, with a legacy list maintained at +https://uqfoundation.github.io/project/pathos/query. + + +Major Features +============== + +``dill`` can pickle the following standard types: + + - none, type, bool, int, float, complex, bytes, str, + - tuple, list, dict, file, buffer, builtin, + - Python classes, namedtuples, dataclasses, metaclasses, + - instances of classes, + - set, frozenset, array, functions, exceptions + +``dill`` can also pickle more 'exotic' standard types: + + - functions with yields, nested functions, lambdas, + - cell, method, unboundmethod, module, code, methodwrapper, + - methoddescriptor, getsetdescriptor, memberdescriptor, wrapperdescriptor, + - dictproxy, slice, notimplemented, ellipsis, quit + +``dill`` cannot yet pickle these standard types: + + - frame, generator, traceback + +``dill`` also provides the capability to: + + - save and load Python interpreter sessions + - save and extract the source code from functions and classes + - interactively diagnose pickling errors + + +Current Release +=============== + +The latest released version of ``dill`` is available from: + + https://pypi.org/project/dill + +``dill`` is distributed under a 3-clause BSD license. + + +Development Version +=================== + +You can get the latest development version with all the shiny new features at: + + https://github.com/uqfoundation + +If you have a new contribution, please submit a pull request. + + +Installation +============ + +``dill`` can be installed with ``pip``:: + + $ pip install dill + +To optionally include the ``objgraph`` diagnostic tool in the install:: + + $ pip install dill[graph] + +To optionally include the ``gprof2dot`` diagnostic tool in the install:: + + $ pip install dill[profile] + +For windows users, to optionally install session history tools:: + + $ pip install dill[readline] + + +Requirements +============ + +``dill`` requires: + + - ``python`` (or ``pypy``), **>=3.8** + - ``setuptools``, **>=42** + +Optional requirements: + + - ``objgraph``, **>=1.7.2** + - ``gprof2dot``, **>=2022.7.29** + - ``pyreadline``, **>=1.7.1** (on windows) + + +Basic Usage +=========== + +``dill`` is a drop-in replacement for ``pickle``. Existing code can be +updated to allow complete pickling using:: + + >>> import dill as pickle + +or:: + + >>> from dill import dumps, loads + +``dumps`` converts the object to a unique byte string, and ``loads`` performs +the inverse operation:: + + >>> squared = lambda x: x**2 + >>> loads(dumps(squared))(3) + 9 + +There are a number of options to control serialization which are provided +as keyword arguments to several ``dill`` functions: + +* with *protocol*, the pickle protocol level can be set. This uses the + same value as the ``pickle`` module, *DEFAULT_PROTOCOL*. +* with *byref=True*, ``dill`` to behave a lot more like pickle with + certain objects (like modules) pickled by reference as opposed to + attempting to pickle the object itself. +* with *recurse=True*, objects referred to in the global dictionary are + recursively traced and pickled, instead of the default behavior of + attempting to store the entire global dictionary. +* with *fmode*, the contents of the file can be pickled along with the file + handle, which is useful if the object is being sent over the wire to a + remote system which does not have the original file on disk. Options are + *HANDLE_FMODE* for just the handle, *CONTENTS_FMODE* for the file content + and *FILE_FMODE* for content and handle. +* with *ignore=False*, objects reconstructed with types defined in the + top-level script environment use the existing type in the environment + rather than a possibly different reconstructed type. + +The default serialization can also be set globally in *dill.settings*. +Thus, we can modify how ``dill`` handles references to the global dictionary +locally or globally:: + + >>> import dill.settings + >>> dumps(absolute) == dumps(absolute, recurse=True) + False + >>> dill.settings['recurse'] = True + >>> dumps(absolute) == dumps(absolute, recurse=True) + True + +``dill`` also includes source code inspection, as an alternate to pickling:: + + >>> import dill.source + >>> print(dill.source.getsource(squared)) + squared = lambda x:x**2 + +To aid in debugging pickling issues, use *dill.detect* which provides +tools like pickle tracing:: + + >>> import dill.detect + >>> with dill.detect.trace(): + >>> dumps(squared) + ┬ F1: at 0x7fe074f8c280> + ├┬ F2: + │└ # F2 [34 B] + ├┬ Co: at 0x7fe07501eb30, file "", line 1> + │├┬ F2: + ││└ # F2 [19 B] + │└ # Co [87 B] + ├┬ D1: + │└ # D1 [22 B] + ├┬ D2: + │└ # D2 [2 B] + ├┬ D2: + │├┬ D2: + ││└ # D2 [2 B] + │└ # D2 [23 B] + └ # F1 [180 B] + +With trace, we see how ``dill`` stored the lambda (``F1``) by first storing +``_create_function``, the underlying code object (``Co``) and ``_create_code`` +(which is used to handle code objects), then we handle the reference to +the global dict (``D2``) plus other dictionaries (``D1`` and ``D2``) that +save the lambda object's state. A ``#`` marks when the object is actually stored. + + +More Information +================ + +Probably the best way to get started is to look at the documentation at +http://dill.rtfd.io. Also see ``dill.tests`` for a set of scripts that +demonstrate how ``dill`` can serialize different Python objects. You can +run the test suite with ``python -m dill.tests``. The contents of any +pickle file can be examined with ``undill``. As ``dill`` conforms to +the ``pickle`` interface, the examples and documentation found at +http://docs.python.org/library/pickle.html also apply to ``dill`` +if one will ``import dill as pickle``. The source code is also generally +well documented, so further questions may be resolved by inspecting the +code itself. Please feel free to submit a ticket on github, or ask a +question on stackoverflow (**@Mike McKerns**). +If you would like to share how you use ``dill`` in your work, please send +an email (to **mmckerns at uqfoundation dot org**). + + +Citation +======== + +If you use ``dill`` to do research that leads to publication, we ask that you +acknowledge use of ``dill`` by citing the following in your publication:: + + M.M. McKerns, L. Strand, T. Sullivan, A. Fang, M.A.G. Aivazis, + "Building a framework for predictive science", Proceedings of + the 10th Python in Science Conference, 2011; + http://arxiv.org/pdf/1202.1056 + + Michael McKerns and Michael Aivazis, + "pathos: a framework for heterogeneous computing", 2010- ; + https://uqfoundation.github.io/project/pathos + +Please see https://uqfoundation.github.io/project/pathos or +http://arxiv.org/pdf/1202.1056 for further information. diff --git a/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/RECORD b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/RECORD new file mode 100644 index 0000000..3ae6532 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/RECORD @@ -0,0 +1,101 @@ +../../../bin/get_gprof,sha256=BRIVoOWNrOUFn9FJl5PeknTe06IbbDvX94JZQ7oHafg,2505 +../../../bin/get_objgraph,sha256=94waQt9P06UGkuId8trcAFO1T7NAPMYh6L17d9CWRc0,1699 +../../../bin/undill,sha256=NfQrAVv5b0PhmWYWNnvNGrbqNBJXuXqSbQQpPQg2sLA,635 +dill-0.3.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +dill-0.3.9.dist-info/LICENSE,sha256=UeiKI-eId86r1yfCGcel4z9l2pugOsT9KFupBKoc4is,1790 +dill-0.3.9.dist-info/METADATA,sha256=_FFzic5yJVTlvzEQffApWsBq905JF3St0SGXAjlIulo,10174 +dill-0.3.9.dist-info/RECORD,, +dill-0.3.9.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 +dill-0.3.9.dist-info/top_level.txt,sha256=HLSIyYIjQzJiBvs3_-16ntezE3j6mWGTW0DT1xDd7X0,5 +dill/__diff.py,sha256=d0X0PkF-MN2XI8vQXth0S2yp338z7sQ_DVUMxzYa7ew,7146 +dill/__info__.py,sha256=2c-q6__qU-eAto8Hr4UCv8ykw1QzdfWEnZtOyWeevOs,10756 +dill/__init__.py,sha256=j-Jxl3H6bxatS0h2f8ywWs7DChwk7B9ozuZQBVcjYGU,3798 +dill/__pycache__/__diff.cpython-312.pyc,, +dill/__pycache__/__info__.cpython-312.pyc,, +dill/__pycache__/__init__.cpython-312.pyc,, +dill/__pycache__/_dill.cpython-312.pyc,, +dill/__pycache__/_objects.cpython-312.pyc,, +dill/__pycache__/_shims.cpython-312.pyc,, +dill/__pycache__/detect.cpython-312.pyc,, +dill/__pycache__/logger.cpython-312.pyc,, +dill/__pycache__/objtypes.cpython-312.pyc,, +dill/__pycache__/pointers.cpython-312.pyc,, +dill/__pycache__/session.cpython-312.pyc,, +dill/__pycache__/settings.cpython-312.pyc,, +dill/__pycache__/source.cpython-312.pyc,, +dill/__pycache__/temp.cpython-312.pyc,, +dill/_dill.py,sha256=MY3QRoToKg-bAh_WAlb5YRH3HuC0_sHabc-snh7b80o,89603 +dill/_objects.py,sha256=Nc0GKdQpwe1mALjg6UIqeXm-FQkgpJ8v3pkxS_C5O8s,19716 +dill/_shims.py,sha256=IuzQcyPET5VWmWMoSGStieoedvNXlb5suDpa4bykTbQ,6635 +dill/detect.py,sha256=Mb-PfCxn1mg0l3TmHXyPNVEc4n3fuxc_nue6eL3-q_o,11114 +dill/logger.py,sha256=D2mTGFLfnKrDnLRFJAFIwWkHUQasWqAgE5GniK7pjDM,11143 +dill/objtypes.py,sha256=BamGH3BEM6lLlxisuvXcGjsCRLNeoLs4_rFZrM5r2yM,736 +dill/pointers.py,sha256=vnQzjwGtKMGnmbdYRXRWNLMyceNPSw4f7UpvwCXLYbE,4467 +dill/session.py,sha256=9L3QF-inmkKoJ0D7mXyFCTcZsVeReHoRPVDcByt-Mdc,23541 +dill/settings.py,sha256=7I3yvSpPKstOqpoW2gv3X77kXK-hZlqCnF7nJUGhxTY,630 +dill/source.py,sha256=6TaPbKFWuqE23v0NABXXYnqokNRN8pYqmNUPvKTw47Q,45507 +dill/temp.py,sha256=KJUry4t0UjQCh5t4LXcxNyMF_uOGHwcjTuNYTJD9qdA,8027 +dill/tests/__init__.py,sha256=Gx-chVB-l-e7ncsGp2zF4BimTjbUyO7BY7RkrO835vY,479 +dill/tests/__main__.py,sha256=fHhioQwcOvTPlf1RM_wVQ0Y3ndETWJOuXJQ2rVtqliA,899 +dill/tests/__pycache__/__init__.cpython-312.pyc,, +dill/tests/__pycache__/__main__.cpython-312.pyc,, +dill/tests/__pycache__/test_abc.cpython-312.pyc,, +dill/tests/__pycache__/test_check.cpython-312.pyc,, +dill/tests/__pycache__/test_classdef.cpython-312.pyc,, +dill/tests/__pycache__/test_dataclasses.cpython-312.pyc,, +dill/tests/__pycache__/test_detect.cpython-312.pyc,, +dill/tests/__pycache__/test_dictviews.cpython-312.pyc,, +dill/tests/__pycache__/test_diff.cpython-312.pyc,, +dill/tests/__pycache__/test_extendpickle.cpython-312.pyc,, +dill/tests/__pycache__/test_fglobals.cpython-312.pyc,, +dill/tests/__pycache__/test_file.cpython-312.pyc,, +dill/tests/__pycache__/test_functions.cpython-312.pyc,, +dill/tests/__pycache__/test_functors.cpython-312.pyc,, +dill/tests/__pycache__/test_logger.cpython-312.pyc,, +dill/tests/__pycache__/test_mixins.cpython-312.pyc,, +dill/tests/__pycache__/test_module.cpython-312.pyc,, +dill/tests/__pycache__/test_moduledict.cpython-312.pyc,, +dill/tests/__pycache__/test_nested.cpython-312.pyc,, +dill/tests/__pycache__/test_objects.cpython-312.pyc,, +dill/tests/__pycache__/test_properties.cpython-312.pyc,, +dill/tests/__pycache__/test_pycapsule.cpython-312.pyc,, +dill/tests/__pycache__/test_recursive.cpython-312.pyc,, +dill/tests/__pycache__/test_registered.cpython-312.pyc,, +dill/tests/__pycache__/test_restricted.cpython-312.pyc,, +dill/tests/__pycache__/test_selected.cpython-312.pyc,, +dill/tests/__pycache__/test_session.cpython-312.pyc,, +dill/tests/__pycache__/test_source.cpython-312.pyc,, +dill/tests/__pycache__/test_sources.cpython-312.pyc,, +dill/tests/__pycache__/test_temp.cpython-312.pyc,, +dill/tests/__pycache__/test_threads.cpython-312.pyc,, +dill/tests/__pycache__/test_weakref.cpython-312.pyc,, +dill/tests/test_abc.py,sha256=BSjSKKCQ5_iPfFxAd0yBq4KSAJxelrlC3IzoAhjd1C4,4227 +dill/tests/test_check.py,sha256=4F5gkX6zxY7C5sD2_0Tkqf3T3jmQl0K15FOxYUTZQl0,1396 +dill/tests/test_classdef.py,sha256=fI3fVk4SlsjNMMs5RfU6DUCaxpP7YYRjvLZ2nhXMHuc,8600 +dill/tests/test_dataclasses.py,sha256=yKjFuG24ymLtjk-sZZdhvNY7aDqerTDpMcfi_eV4ft0,890 +dill/tests/test_detect.py,sha256=DFIrE-JetKlPCmPev9vJbF95i9lxHQZDUi_qAz5q3sk,4144 +dill/tests/test_dictviews.py,sha256=Jhol0cQWPwoQrp7OPxGhU8FNRX2GgfFp9fTahCvQEPA,1337 +dill/tests/test_diff.py,sha256=5VIWf2fpV6auLHNfzkHLTrgx6AJBlE2xe5Wanfmq8TM,2667 +dill/tests/test_extendpickle.py,sha256=gONrMBHO94Edhnqm1wo49hgzwmaxHs7L-86Hs-7albY,1315 +dill/tests/test_fglobals.py,sha256=DCvdojmKcLN_X9vX4Qe1FbsqjeoJK-wsY2uJwBfNFro,1676 +dill/tests/test_file.py,sha256=jUU2h8qaDOIe1mn_Ng7wqCZcd7Ucx3TAaI-K_90_Tbk,13578 +dill/tests/test_functions.py,sha256=-mqTpUbzRu8GynjBGD25dRDm8qInIe07sRZmCcA_iXY,4267 +dill/tests/test_functors.py,sha256=7rx9wLmrgFwF0gUm_-SGOISPYSok0XjmrQ-jFMRt6gs,930 +dill/tests/test_logger.py,sha256=D9zGRaA-CEadG13orPS_D4gPVZlkqXf9Zu8wn2oMiYc,2385 +dill/tests/test_mixins.py,sha256=YtB24BjodooLj85ijFbAxiM7LlFQZAUL8RQVx9vIAwY,4007 +dill/tests/test_module.py,sha256=KLl_gZJJqDY7S_bD5wCqKL8JQCS0MDMoipVQSDfASlo,1943 +dill/tests/test_moduledict.py,sha256=faXG6-5AcmCfP3xe2FYGOUdSosU-9TWnKU_ZVqPDaxY,1182 +dill/tests/test_nested.py,sha256=ViWiOrChLZktS0z6qyKqMxDdTuy9kAX4qMgH_OreMcc,3146 +dill/tests/test_objects.py,sha256=pPAth0toC_UWztuKHC7NZlsRBb0g_gSAt70UbUtXEXo,1931 +dill/tests/test_properties.py,sha256=h35c-lYir1JG6oLPtrA0eYE0xoSohIimsA3yIfRw6yA,1346 +dill/tests/test_pycapsule.py,sha256=EXFyB6g1Wx9O9LM6StIeUKhrhln4_hou1xrtGwkt4Cw,1417 +dill/tests/test_recursive.py,sha256=bfr-BsK1Xu0PU7l2srHsDXdY2l1LeM3L3w7NraXO0cc,4182 +dill/tests/test_registered.py,sha256=J3oku053VfdJgYh4Z5_kyFRf-C52JglIzjcyxEaYOhk,1573 +dill/tests/test_restricted.py,sha256=xLMIae8sYJksAj9hKKyHFHIL8vtbGpFeOULz59snYM4,783 +dill/tests/test_selected.py,sha256=wPKFTnXThwUm2Ycypt08yv6Wh39SmGeyrUxeENN2gRc,3258 +dill/tests/test_session.py,sha256=KoSPvs4c4VJ8mFMF7EUlD_3GwcOhhipt9fqHr--Go-4,10161 +dill/tests/test_source.py,sha256=vuJV0Y9xLiq5wJUD1yNbjTTxeaxYIUiJsL6PVPs25R8,7059 +dill/tests/test_sources.py,sha256=8FWkpEL3zTHn4_5RjwoNEJvKBy4RriUB3O6ARDyXqUg,8667 +dill/tests/test_temp.py,sha256=F_7nJkSetLIBSAYMw1-hYh03iVrEYwGs-4GIUzoBOfY,2619 +dill/tests/test_threads.py,sha256=knJA-lRvAAnYyePaAQTKGqu0OG9BIXdbgZhW47ZXY9s,1252 +dill/tests/test_weakref.py,sha256=mrjZP5aPtUP1wBD6ibPsDsfI9ffmq_Ykt7ltoodi5Lg,1602 diff --git a/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/WHEEL new file mode 100644 index 0000000..bab98d6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.43.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/top_level.txt b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/top_level.txt new file mode 100644 index 0000000..85eea70 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill-0.3.9.dist-info/top_level.txt @@ -0,0 +1 @@ +dill diff --git a/myenv/lib/python3.12/site-packages/dill/__diff.py b/myenv/lib/python3.12/site-packages/dill/__diff.py new file mode 100644 index 0000000..f427110 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/__diff.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +""" +Module to show if an object has changed since it was memorised +""" + +import builtins +import os +import sys +import types +try: + import numpy.ma + HAS_NUMPY = True +except ImportError: + HAS_NUMPY = False + +# pypy doesn't use reference counting +getrefcount = getattr(sys, 'getrefcount', lambda x:0) + +# memo of objects indexed by id to a tuple (attributes, sequence items) +# attributes is a dict indexed by attribute name to attribute id +# sequence items is either a list of ids, of a dictionary of keys to ids +memo = {} +id_to_obj = {} +# types that cannot have changing attributes +builtins_types = set((str, list, dict, set, frozenset, int)) +dont_memo = set(id(i) for i in (memo, sys.modules, sys.path_importer_cache, + os.environ, id_to_obj)) + + +def get_attrs(obj): + """ + Gets all the attributes of an object though its __dict__ or return None + """ + if type(obj) in builtins_types \ + or type(obj) is type and obj in builtins_types: + return + return getattr(obj, '__dict__', None) + + +def get_seq(obj, cache={str: False, frozenset: False, list: True, set: True, + dict: True, tuple: True, type: False, + types.ModuleType: False, types.FunctionType: False, + types.BuiltinFunctionType: False}): + """ + Gets all the items in a sequence or return None + """ + try: + o_type = obj.__class__ + except AttributeError: + o_type = type(obj) + hsattr = hasattr + if o_type in cache: + if cache[o_type]: + if hsattr(obj, "copy"): + return obj.copy() + return obj + elif HAS_NUMPY and o_type in (numpy.ndarray, numpy.ma.core.MaskedConstant): + if obj.shape and obj.size: + return obj + else: + return [] + elif hsattr(obj, "__contains__") and hsattr(obj, "__iter__") \ + and hsattr(obj, "__len__") and hsattr(o_type, "__contains__") \ + and hsattr(o_type, "__iter__") and hsattr(o_type, "__len__"): + cache[o_type] = True + if hsattr(obj, "copy"): + return obj.copy() + return obj + else: + cache[o_type] = False + return None + + +def memorise(obj, force=False): + """ + Adds an object to the memo, and recursively adds all the objects + attributes, and if it is a container, its items. Use force=True to update + an object already in the memo. Updating is not recursively done. + """ + obj_id = id(obj) + if obj_id in memo and not force or obj_id in dont_memo: + return + id_ = id + g = get_attrs(obj) + if g is None: + attrs_id = None + else: + attrs_id = dict((key,id_(value)) for key, value in g.items()) + + s = get_seq(obj) + if s is None: + seq_id = None + elif hasattr(s, "items"): + seq_id = dict((id_(key),id_(value)) for key, value in s.items()) + elif not hasattr(s, "__len__"): #XXX: avoid TypeError from unexpected case + seq_id = None + else: + seq_id = [id_(i) for i in s] + + memo[obj_id] = attrs_id, seq_id + id_to_obj[obj_id] = obj + mem = memorise + if g is not None: + [mem(value) for key, value in g.items()] + + if s is not None: + if hasattr(s, "items"): + [(mem(key), mem(item)) + for key, item in s.items()] + else: + if hasattr(s, '__len__'): + [mem(item) for item in s] + else: mem(s) + + +def release_gone(): + itop, mp, src = id_to_obj.pop, memo.pop, getrefcount + [(itop(id_), mp(id_)) for id_, obj in list(id_to_obj.items()) + if src(obj) < 4] #XXX: correct for pypy? + + +def whats_changed(obj, seen=None, simple=False, first=True): + """ + Check an object against the memo. Returns a list in the form + (attribute changes, container changed). Attribute changes is a dict of + attribute name to attribute value. container changed is a boolean. + If simple is true, just returns a boolean. None for either item means + that it has not been checked yet + """ + # Special cases + if first: + # ignore the _ variable, which only appears in interactive sessions + if "_" in builtins.__dict__: + del builtins._ + if seen is None: + seen = {} + + obj_id = id(obj) + + if obj_id in seen: + if simple: + return any(seen[obj_id]) + return seen[obj_id] + + # Safety checks + if obj_id in dont_memo: + seen[obj_id] = [{}, False] + if simple: + return False + return seen[obj_id] + elif obj_id not in memo: + if simple: + return True + else: + raise RuntimeError("Object not memorised " + str(obj)) + + seen[obj_id] = ({}, False) + + chngd = whats_changed + id_ = id + + # compare attributes + attrs = get_attrs(obj) + if attrs is None: + changed = {} + else: + obj_attrs = memo[obj_id][0] + obj_get = obj_attrs.get + changed = dict((key,None) for key in obj_attrs if key not in attrs) + for key, o in attrs.items(): + if id_(o) != obj_get(key, None) or chngd(o, seen, True, False): + changed[key] = o + + # compare sequence + items = get_seq(obj) + seq_diff = False + if (items is not None) and (hasattr(items, '__len__')): + obj_seq = memo[obj_id][1] + if (len(items) != len(obj_seq)): + seq_diff = True + elif hasattr(obj, "items"): # dict type obj + obj_get = obj_seq.get + for key, item in items.items(): + if id_(item) != obj_get(id_(key)) \ + or chngd(key, seen, True, False) \ + or chngd(item, seen, True, False): + seq_diff = True + break + else: + for i, j in zip(items, obj_seq): # list type obj + if id_(i) != j or chngd(i, seen, True, False): + seq_diff = True + break + seen[obj_id] = changed, seq_diff + if simple: + return changed or seq_diff + return changed, seq_diff + + +def has_changed(*args, **kwds): + kwds['simple'] = True # ignore simple if passed in + return whats_changed(*args, **kwds) + +__import__ = __import__ + + +def _imp(*args, **kwds): + """ + Replaces the default __import__, to allow a module to be memorised + before the user can change it + """ + before = set(sys.modules.keys()) + mod = __import__(*args, **kwds) + after = set(sys.modules.keys()).difference(before) + for m in after: + memorise(sys.modules[m]) + return mod + +builtins.__import__ = _imp +if hasattr(builtins, "_"): + del builtins._ + +# memorise all already imported modules. This implies that this must be +# imported first for any changes to be recorded +for mod in list(sys.modules.values()): + memorise(mod) +release_gone() diff --git a/myenv/lib/python3.12/site-packages/dill/__info__.py b/myenv/lib/python3.12/site-packages/dill/__info__.py new file mode 100644 index 0000000..0bcefb8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/__info__.py @@ -0,0 +1,291 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +''' +----------------------------- +dill: serialize all of Python +----------------------------- + +About Dill +========== + +``dill`` extends Python's ``pickle`` module for serializing and de-serializing +Python objects to the majority of the built-in Python types. Serialization +is the process of converting an object to a byte stream, and the inverse +of which is converting a byte stream back to a Python object hierarchy. + +``dill`` provides the user the same interface as the ``pickle`` module, and +also includes some additional features. In addition to pickling Python +objects, ``dill`` provides the ability to save the state of an interpreter +session in a single command. Hence, it would be feasible to save an +interpreter session, close the interpreter, ship the pickled file to +another computer, open a new interpreter, unpickle the session and +thus continue from the 'saved' state of the original interpreter +session. + +``dill`` can be used to store Python objects to a file, but the primary +usage is to send Python objects across the network as a byte stream. +``dill`` is quite flexible, and allows arbitrary user defined classes +and functions to be serialized. Thus ``dill`` is not intended to be +secure against erroneously or maliciously constructed data. It is +left to the user to decide whether the data they unpickle is from +a trustworthy source. + +``dill`` is part of ``pathos``, a Python framework for heterogeneous computing. +``dill`` is in active development, so any user feedback, bug reports, comments, +or suggestions are highly appreciated. A list of issues is located at +https://github.com/uqfoundation/dill/issues, with a legacy list maintained at +https://uqfoundation.github.io/project/pathos/query. + + +Major Features +============== + +``dill`` can pickle the following standard types: + + - none, type, bool, int, float, complex, bytes, str, + - tuple, list, dict, file, buffer, builtin, + - Python classes, namedtuples, dataclasses, metaclasses, + - instances of classes, + - set, frozenset, array, functions, exceptions + +``dill`` can also pickle more 'exotic' standard types: + + - functions with yields, nested functions, lambdas, + - cell, method, unboundmethod, module, code, methodwrapper, + - methoddescriptor, getsetdescriptor, memberdescriptor, wrapperdescriptor, + - dictproxy, slice, notimplemented, ellipsis, quit + +``dill`` cannot yet pickle these standard types: + + - frame, generator, traceback + +``dill`` also provides the capability to: + + - save and load Python interpreter sessions + - save and extract the source code from functions and classes + - interactively diagnose pickling errors + + +Current Release +=============== + +The latest released version of ``dill`` is available from: + + https://pypi.org/project/dill + +``dill`` is distributed under a 3-clause BSD license. + + +Development Version +=================== + +You can get the latest development version with all the shiny new features at: + + https://github.com/uqfoundation + +If you have a new contribution, please submit a pull request. + + +Installation +============ + +``dill`` can be installed with ``pip``:: + + $ pip install dill + +To optionally include the ``objgraph`` diagnostic tool in the install:: + + $ pip install dill[graph] + +To optionally include the ``gprof2dot`` diagnostic tool in the install:: + + $ pip install dill[profile] + +For windows users, to optionally install session history tools:: + + $ pip install dill[readline] + + +Requirements +============ + +``dill`` requires: + + - ``python`` (or ``pypy``), **>=3.8** + - ``setuptools``, **>=42** + +Optional requirements: + + - ``objgraph``, **>=1.7.2** + - ``gprof2dot``, **>=2022.7.29** + - ``pyreadline``, **>=1.7.1** (on windows) + + +Basic Usage +=========== + +``dill`` is a drop-in replacement for ``pickle``. Existing code can be +updated to allow complete pickling using:: + + >>> import dill as pickle + +or:: + + >>> from dill import dumps, loads + +``dumps`` converts the object to a unique byte string, and ``loads`` performs +the inverse operation:: + + >>> squared = lambda x: x**2 + >>> loads(dumps(squared))(3) + 9 + +There are a number of options to control serialization which are provided +as keyword arguments to several ``dill`` functions: + +* with *protocol*, the pickle protocol level can be set. This uses the + same value as the ``pickle`` module, *DEFAULT_PROTOCOL*. +* with *byref=True*, ``dill`` to behave a lot more like pickle with + certain objects (like modules) pickled by reference as opposed to + attempting to pickle the object itself. +* with *recurse=True*, objects referred to in the global dictionary are + recursively traced and pickled, instead of the default behavior of + attempting to store the entire global dictionary. +* with *fmode*, the contents of the file can be pickled along with the file + handle, which is useful if the object is being sent over the wire to a + remote system which does not have the original file on disk. Options are + *HANDLE_FMODE* for just the handle, *CONTENTS_FMODE* for the file content + and *FILE_FMODE* for content and handle. +* with *ignore=False*, objects reconstructed with types defined in the + top-level script environment use the existing type in the environment + rather than a possibly different reconstructed type. + +The default serialization can also be set globally in *dill.settings*. +Thus, we can modify how ``dill`` handles references to the global dictionary +locally or globally:: + + >>> import dill.settings + >>> dumps(absolute) == dumps(absolute, recurse=True) + False + >>> dill.settings['recurse'] = True + >>> dumps(absolute) == dumps(absolute, recurse=True) + True + +``dill`` also includes source code inspection, as an alternate to pickling:: + + >>> import dill.source + >>> print(dill.source.getsource(squared)) + squared = lambda x:x**2 + +To aid in debugging pickling issues, use *dill.detect* which provides +tools like pickle tracing:: + + >>> import dill.detect + >>> with dill.detect.trace(): + >>> dumps(squared) + ┬ F1: at 0x7fe074f8c280> + ├┬ F2: + │└ # F2 [34 B] + ├┬ Co: at 0x7fe07501eb30, file "", line 1> + │├┬ F2: + ││└ # F2 [19 B] + │└ # Co [87 B] + ├┬ D1: + │└ # D1 [22 B] + ├┬ D2: + │└ # D2 [2 B] + ├┬ D2: + │├┬ D2: + ││└ # D2 [2 B] + │└ # D2 [23 B] + └ # F1 [180 B] + +With trace, we see how ``dill`` stored the lambda (``F1``) by first storing +``_create_function``, the underlying code object (``Co``) and ``_create_code`` +(which is used to handle code objects), then we handle the reference to +the global dict (``D2``) plus other dictionaries (``D1`` and ``D2``) that +save the lambda object's state. A ``#`` marks when the object is actually stored. + + +More Information +================ + +Probably the best way to get started is to look at the documentation at +http://dill.rtfd.io. Also see ``dill.tests`` for a set of scripts that +demonstrate how ``dill`` can serialize different Python objects. You can +run the test suite with ``python -m dill.tests``. The contents of any +pickle file can be examined with ``undill``. As ``dill`` conforms to +the ``pickle`` interface, the examples and documentation found at +http://docs.python.org/library/pickle.html also apply to ``dill`` +if one will ``import dill as pickle``. The source code is also generally +well documented, so further questions may be resolved by inspecting the +code itself. Please feel free to submit a ticket on github, or ask a +question on stackoverflow (**@Mike McKerns**). +If you would like to share how you use ``dill`` in your work, please send +an email (to **mmckerns at uqfoundation dot org**). + + +Citation +======== + +If you use ``dill`` to do research that leads to publication, we ask that you +acknowledge use of ``dill`` by citing the following in your publication:: + + M.M. McKerns, L. Strand, T. Sullivan, A. Fang, M.A.G. Aivazis, + "Building a framework for predictive science", Proceedings of + the 10th Python in Science Conference, 2011; + http://arxiv.org/pdf/1202.1056 + + Michael McKerns and Michael Aivazis, + "pathos: a framework for heterogeneous computing", 2010- ; + https://uqfoundation.github.io/project/pathos + +Please see https://uqfoundation.github.io/project/pathos or +http://arxiv.org/pdf/1202.1056 for further information. + +''' + +__version__ = '0.3.9' +__author__ = 'Mike McKerns' + +__license__ = ''' +Copyright (c) 2004-2016 California Institute of Technology. +Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +All rights reserved. + +This software is available subject to the conditions and terms laid +out below. By downloading and using this software you are agreeing +to the following conditions. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the names of the copyright holders nor the names of any of + the contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +''' diff --git a/myenv/lib/python3.12/site-packages/dill/__init__.py b/myenv/lib/python3.12/site-packages/dill/__init__.py new file mode 100644 index 0000000..549048a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/__init__.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +# author, version, license, and long description +try: # the package is installed + from .__info__ import __version__, __author__, __doc__, __license__ +except: # pragma: no cover + import os + import sys + parent = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) + sys.path.append(parent) + # get distribution meta info + from version import (__version__, __author__, + get_license_text, get_readme_as_rst) + __license__ = get_license_text(os.path.join(parent, 'LICENSE')) + __license__ = "\n%s" % __license__ + __doc__ = get_readme_as_rst(os.path.join(parent, 'README.md')) + del os, sys, parent, get_license_text, get_readme_as_rst + + +from ._dill import ( + dump, dumps, load, loads, copy, + Pickler, Unpickler, register, pickle, pickles, check, + DEFAULT_PROTOCOL, HIGHEST_PROTOCOL, HANDLE_FMODE, CONTENTS_FMODE, FILE_FMODE, + PickleError, PickleWarning, PicklingError, PicklingWarning, UnpicklingError, + UnpicklingWarning, +) +from .session import ( + dump_module, load_module, load_module_asdict, + dump_session, load_session # backward compatibility +) +from . import detect, logger, session, source, temp + +# get global settings +from .settings import settings + +# make sure "trace" is turned off +logger.trace(False) + +objects = {} +# local import of dill._objects +#from . import _objects +#objects.update(_objects.succeeds) +#del _objects + +# local import of dill.objtypes +from . import objtypes as types + +def load_types(pickleable=True, unpickleable=True): + """load pickleable and/or unpickleable types to ``dill.types`` + + ``dill.types`` is meant to mimic the ``types`` module, providing a + registry of object types. By default, the module is empty (for import + speed purposes). Use the ``load_types`` function to load selected object + types to the ``dill.types`` module. + + Args: + pickleable (bool, default=True): if True, load pickleable types. + unpickleable (bool, default=True): if True, load unpickleable types. + + Returns: + None + """ + from importlib import reload + # local import of dill.objects + from . import _objects + if pickleable: + objects.update(_objects.succeeds) + else: + [objects.pop(obj,None) for obj in _objects.succeeds] + if unpickleable: + objects.update(_objects.failures) + else: + [objects.pop(obj,None) for obj in _objects.failures] + objects.update(_objects.registered) + del _objects + # reset contents of types to 'empty' + [types.__dict__.pop(obj) for obj in list(types.__dict__.keys()) \ + if obj.find('Type') != -1] + # add corresponding types from objects to types + reload(types) + +def extend(use_dill=True): + '''add (or remove) dill types to/from the pickle registry + + by default, ``dill`` populates its types to ``pickle.Pickler.dispatch``. + Thus, all ``dill`` types are available upon calling ``'import pickle'``. + To drop all ``dill`` types from the ``pickle`` dispatch, *use_dill=False*. + + Args: + use_dill (bool, default=True): if True, extend the dispatch table. + + Returns: + None + ''' + from ._dill import _revert_extension, _extend + if use_dill: _extend() + else: _revert_extension() + return + +extend() + + +def license(): + """print license""" + print (__license__) + return + +def citation(): + """print citation""" + print (__doc__[-491:-118]) + return + +# end of file diff --git a/myenv/lib/python3.12/site-packages/dill/__pycache__/__diff.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/__pycache__/__diff.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7aff4adf58e98cfb50947c7cf825ad04585363e9 GIT binary patch literal 8996 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 Y6x5$t&RM#iB%eKL?Y6R?TNsG{2Q+H;?f?J) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/__pycache__/__info__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/__pycache__/__info__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04374a7489744de0cd98e10a75189ef03b65ab01 GIT binary patch literal 10712 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/__pycache__/_dill.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/__pycache__/_dill.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eab4b541afc24fbb0e08cf14575e9405a78eaca9 GIT binary patch literal 102107 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�t+kv}%)HM$x*L>!;{ah{NF^H{u ze%EAiD5o}LUy7i*VmE~|DkodNw{^Px&vyl?3H^f9^*is=fxeA{s8`H0pIwW2a@0Aw>ybnY~HsWt<=!NI^+WrpO%~ds{0FF)O)&gYD@)*mEl8 zVn4c1b$5wZtjZrr@oZL@#rMW@BmmvefQ3yjcl&?fdGb<8e9cuz+R3??Q&5(hgW% z9T)_TFFbYyOg9~0d3Mr>t4TiKT- zwyr5u+Z=MXAe0+2-qfM=e_{c*zS6k1aRWDG_W?tr=6Gk<(auBNJ~&3O_$=&;zeHd8 zbNWC8t?%rmh;#gYT#K2y`@Ad)V=Sd*|K66i_HDb{I@%v>ZQZuNr5&<8Y7`-qa5`F! zk(MV4?h{B$%ECtBvytl*HNzQ{{!j2*0uGdc>R=G-nQP#=>m2-HEqbX5JkmzVWukV7A=S7|pdn+<@7`rqN9iYjMz8 z94=WIvaY&ir#lXfEqnanh5mE>0c#DAg$+r95i+VT9n#|L#U&*PBAvL5E8*1)av%c* zq|K0r_9vYdB0*sjUE4;E-o5>u-fkWibb2=ESiDQVnZ_V7TtLmDMpgp1x~XA>ke0B# z6NVd~hn9VYTDAtY7aMl{q$gypo$>~(YiF#FO&|Pg-QQS$W{qrpB)IjF(ALKS8y^ek zAG?P+_Hh(ST26(&QCh{|S0zDlqJLViRIzRIuKvuK&5yEWmJpj@?XCc!OCm(+C*Kz5$f=H zhu1EWJjf=Nl4sV2c%V!*LseP-2LCNEnf|0JQb1YoLRPWxyYxeX$+~*GdL7K(t#Q$^ zoXS3h)>R-#``AVbz#on1vLja@##jg{M z&fi2r0?l3ZLrJ?5S@B(Uf(jEf7?eoEllcIT#Z5EhfJuuKRJYWJvUXC2TufylUKn{2 zKumN0Y1o|g3C|?$Vro!`WmvSwODL=|LokeCk{#@75ijc`VuZoC_%Ow}_wo^X<9n2l zb0MN|krgq)wFyjTF=$uJwnwOmATuK3uRvQRiY0{OW*UmqR7%RW`ybxBmDZSTZCiG> z?A_hgE)d0^(u>%_{41O#c=Z|MH3FL?ufQzk7qD}Dz+q&7u`v?}rGWBpW&pAT7smIX zzAA2if~#$uvR0#>Unk1?G%^E7!)UuxqDilubcfPvMyzrmubHgf(+yY4e_HcKO<>*b z5mLbtf?S|rbI`W=XX~!Ji)2-&;3@NdIdoRx@=avq_YHrb<-x%IMY= zk$u5-&KAk23}#e@GO7_#D`O?G0aauAs4J5|?#I0o&DUI&Bps@HKcfoaSnU-gK*}0l zb78}|4Iuy7wNtj~10i=~#Jw}<-ud>!*WCM}8HE!i=bZ5Pvr}L$NoVVr%9yfVb-xXe zGeDU=Bv+SQcSNucNAh!zjXpO1*o?hW&LDh`48f(F1l|?OsF$;_GUE6i;Bg4eJ$+){ zbC(=bZi?|W<%D9Eo>ypxnfs7v?W@Ni5D#hHUW*}@xNfWI&qT`T6>M;`KxOdU{6laa zP+Qeu{J*M);!n~plO5_Mi0=V)#{{7$uWI%aeuLUO#AmTmA>5T$T1WVI$7^GGRq*d-{dy~7bsU2Px(zU3KyS@H78jpLz&8J4(d{iP|HbpLk3%| z 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 G`u_kJ!2tvS literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/__pycache__/_objects.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/__pycache__/_objects.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80185e1b461f2ab4dc36b82ee96b367318d6dd3b GIT binary patch literal 25799 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 ejlq9eD*UmqZ*Bj3uWuBNFXcZ?&LANG literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/__pycache__/detect.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/__pycache__/detect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37b0b39162398ff571cd48a541a6fb9e0b807e36 GIT binary patch literal 13347 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

    @|!ymP#t6ykO*{trX7r^W@ZH`y(&`FIs!<5{@!( z_VgX>F%!nd_($fLY081b{M-XPF=Y_U&mxJf;RYPLn{DK%DO1!UX1IQba0e`@ z!%~#SrAZ6cHDMQOPbztl2_gJw$SMty zLw?2(J4QgxhgkV(`t6d^3DK_XL8W_NI{N(JslgKnwSS8mNoAFW*^K}Q>6(wJhb*eg z-2FkGgGxU3*HcRk(SkR6C%kR3_D0`IxM#`NbH^2UjApz<5&h} zWL?9o>wA9d(a^kje5s)WO%->xw=YUJPAqTln{|EU+h!b(y-!TGsS?0mzbN6S+|+DJ zl=B#^Pz1}dl5xMODD9e^%qVB6z}I_(RRSv8)K7PpKq}*}m4}4ZGKmYz_bP>74788g z0rui%id1;tq#=Sdc4&Ug_OpsJurm2Rn@ZW)Wjr#AuE5ZSQnDTeGB=eHJ5Siuh0n6< z(!JbN%rt4VMtK!IdZnu2_X$eOFgg^3)KdtuD}RMPCTH}DbL>ZNW`@_`WtPnj4uILM zW)eIK@sSaMB@a`thBw!rNI=iR)MAoL_v6j-ID8=fm;#`zj^pOhwp@%5dSWOgq2V$;_<8D*4yFMJ1x6b zTlxwueYb{w@$v^RFSmSY&h?|vAE~vs(9(OW?-x&g@Z>M0UnTz`x!iJc&h=L44u#Qo z6hb?G+O-ne%f7Z3LfaR#xAWKXE1}Li6jkpnH1@*B!cDBaL%H|{#H6m*zukPTdBwL2 z$%QxbSMp2ct|bXBV)}bcz#r}dUX4;V_g?mg4aLI-6PCM_=S!g4*V9@D4*w%l$zXhY z=ooqSn~G*L>;^o_Tv>Hn`IW}(&`J@sbs;EsO8<=C83YWjV%+jK7|giVU^3!DBkKPe zy%EbIot?_4vXy!E$(Q2zQDY)gsuL--K&ChN%J}I@QTQ6oh|Y5AHvx@ejpo5F)V;m^ z+V&M+hs|gvhb-=VxAUFOl@O9hXdy1S{_0Ao3-0)8?XKIkyO8CX4_ytdR<$Bq@)3(g z)Rzp8r!-EAP5{lIMca%ice56`yd`pHN--2^ai? z^ZzIJ*ne@tAGqMUhpVW1^UReqi)}aJzij(3UTFHta_HI1{`+V70iNGAcVM*^VUmvf z9DUtC>xiK3rPVFF3R`yF=kT%qJkJHT&DO8_n+pD>g(sH%t(OtYX}IiJ;i^6kY@M4} z4s5^dU8|1F)vs1Z3e}P2>geUlHO{-r)fBjzxg#rF>$)q-ANk#}yO5$sW^;2x3r{TW xyW#j*@V(&DmVJeA-#T@C7-x^Ap|9Sf&-*X(jePsuq1D>HLT%rlIeah%`(HU5$nXFF literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/__pycache__/objtypes.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/__pycache__/objtypes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f35eaf85531615a7cb81a3db41f9e92353f55cde GIT binary patch literal 669 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 NPID;Sbj5FS{V%Q_g3OYM%bOEymJ&VMp^YrIaS zc7NZwkG?In!Avqq<$_M%d+vFB=bZ0+=R4o`JNGY2N<18{9}b)|eOBL6#l4=-9oYs}JPVZYWMEBm$e*x0YV$IgBoJr4Hk>~UH+$uU@_ z7o7h^ymPQ3|E%A=r`^2At2aF!lw^x}hkQN0p^}~wp2M>}RyySG@eh^tlns^llq1d| zI%EE!ik^z0Ku=((vZr#Ws;6qGx~F=mrl)48wx@PzRnMxS)jg|+f<3{ZH9c#F>U!#s z&-Dh^Q!iCX)lxvJlqv@7J!?g`6uipGZfUI)6y2*p#sEKF!f|-x=@CG8gXn#OlY|a# z1+9YULwW1O5`>LnDZ=$`j{b@DqF*YJnk4Js3B9HH-vJBNB9=)$q^Xjc)Mpk~E;Wl4 zqIJL}2Hvpuw4j{IH~5~A)H0aQZrn+sUgO@v9pS{PH#o8SJ&Yk;JsZUuP_#*0E7qcn zRz{cb3({2qTB}&!IK)+;Y_lkct5IrL+FX>faGo+&Z^KupH%M)l+6Elr8q}~wtn1(| zRH7a27=x{nU!vb_`WQ&Mw?ZdBX2^X+5S(7N$f&*^CYm6#+%hDAY^ltf&X zgv4b@hz=*D5m`z|vY<$c5{(asJt2F}D~=A0^bW(odBrAJ~p``KaKgseGxuNaNRa!!>rIp;n*Ji@4ye@2`i z^5x18jz(jN=Kb6FuJf=6ElZ;#z@1l_1mG(x5M&fe9puab& z^j=hp)#CybrzVq(hWdJkBGF+zNm;KfU6o`->P?{Jp~y(i+iMiloAYa=M~5#RmgTtI zua1ElI`Kn;^6-D6Sr8=Gatg-i1I;}R}Cvn~LN$40py*!01k zuq2o$qnv|2J%9dp(4W88?{u~SOZ^VVeH~L|!a89~T1ER+PAN;2>* zKUk+f=YNx+bHJigz;no7pMR_0nW%N>X&+Id9c5bebeL+-+qfI=*iiNvF60~!UXl_5 zm_&#V2s&R0>TFVEVuuiqDJBg>Mq>$@L3s3^LBg2S6&aG0kx0LU`Qf}c);o;noEfxLtGBP3!i!ya& z$jRzZ3wNMInjKU!qn#p1h&baH2aO2aE7T2wdVLXT8yZfu^|zf>FvZ$BA&!QH4mm1D z+d3rW3Yy(EBF6`%#DQTYdNC%o4UI{|SKDIIi)|xgkPO4y!tGnz6trP8y6#HklBBee zXlc_$+Q=AsNhJgwH6m|A-A(vY{u;p~_qVp@zp^!bT(ailvfx`CnX-nDOIN+MK2y3j zTT%I$(^l%3?EK8bty%l_?l*TY1Y6U=)=V(`fOFcPAZU+wQ0}1Z!f(&F@55#irLQZ zu1@>bFZed4eVgu_yZhq%mr|{rANh`aYNwKxyhPkm8Rx5*Joylfma#|}kC6pRJQ z#gHTC=x0okbKnPZE9X&0FQS|Ku?&FKF3VCxMD%#DKR(<)D$CMv;_Kmo(Znd0kCv~8 zzkY2~X#aT45I8uhfSqNMc+` zUY}wAn!gPRc_V1!#<)MQUgO{8X-%=n;H&=l&`2~U(PMZ^j=!!@L4qJ}#m^V+J(r|m z>H3JgPkt89d-11`@cG}|=abyM;E_9#w+_C2?9F3yzw-9UbnwXkRfyKt*EaC|bfaH( z+%N&&19E@eN#qw>;gdWG42V;(789qo3479(w2X2Pm)?ZYz(I4_S{H-f$&K z^_Z3Vo4f~YE266=0(zdLAxgE@HlVfWoeA57W5WIft*k>U9r;#{*+Ta5a4a6bGCCrV zq!8k=5EV&;LR<*Z0Zo7kQN@s{IS*tXlP|r!T`PEwX8FTs5&Sl9a9tH~U6LO(_)c#Y z$4wgz)3~ih=QepaQb9($2S#JDp-7_ta>y$0LtM@-OP8eU@@Sa$_KN3^+g$=Hx8KKZ>_PNTDf#>fYo;iH`)U8u<#}+Ev(t+nymi$Jro`2WU z)fMtE`73Wg7P%Qg&WWWal1RvMh@Q%io;-c(h3>;0y$8NtDi@EIn&<&DS|a><)1w~YyCE4n-9H7P%GJ6_6R3bs(dT1!fbpkB|iCg(~ETPt@V z#eV!Le}n+j?S8P~?R{_VyR$wWY=gYBH$ZkeW}I1X`OKMb?tSab+vndrf2Ss0*ZzL+ zUR_5vuzI#*X74?puw+Nt&m3IEs@cG7>`q6fynXW6qO*LaalWQy-Wj?xmXOD7FY`8&(o;UwHXw30^oL(Db&41Nojq{tHX-|?Hu$IT_}Mbq++R&DbwB5Am+{{IHqP3jlBl7?DoiYq!cdLLcEiXlH=e3XhS zx_VA1xlqb`jee(9sMnC{kh_*%L%mOsBBW9XyM}1&A15mkBw*AxoL;i*6sasj-6w@N ziB+nROBhQ1dRPv4EH!VA~$(7{Z-tJHpQzx0eOlmU8P^ih9P?ij4<>aFjkaU)**O*w8 zTj`FJYbJkluH(`e+c)N{F=;sG7#$HK2`T3%r8^cgwx+p?Wf9nb=T7I#t$FOt_D`(E7Z%=Yw{f-K)FdmH3a;~@>y%fa`UOtXuawST9RPL9w zK2=u+*8Ld*AF;Uwu+imMJ@u+SWN=c4WTf$YP*ww*Q@7^MUaE zw!!wc5KArWiN%>o7p%Q;{f3|WBTedIU z?MSVE=A+78_bb;fRBlLDZn#r&_u2=xRP*7FDm#~K*78uca>GL9=5*!eJ69Ll_NUwS z|H$&ewjVmvZO{GL`c(MTN0q0Sn$VulS~-_@YUej5zN5@y+tG$)GgGtWo^wmqReIAu z?O$-!r(N~4*XLa=*@n=RW8PJtUEfB(4cSe5>9=LkTQRd^cFj5nO}?wH@*^=B{7 z?>>KDz(P3htIPVUrb_PnSEpR7KmRPq)d~+d9^^H(%se;S{hh8QE1tekX!HNWmQbhD z@)Kui=PLV8YI%hHhB}MahJySKM)Nj|ebBHFz5E(9md5-W(a`a+n61|qGs}b(%NCWo z?84G!)fblHbtJ89;oE?{_*bXF(EK#z9du4upwNCf6}GQLMe`F;Vb~Ku1$NnN=|fML z)qh#sq+>7n13W860)-D_=r_tN2s? zJAz4W$>Oq?Wb0ZM>e`|GEz~`gu6ruA<4C6NIq;+VBtLx;+v4tQXzM~~Z#uO1{YxJt zGNBVw#}|A;+9%9a-t%n$t0Lk34ebjXcBMD$TG+5Jy=N;Am^2(0bS(g9I(fZ%ESHU*+OGUg7x7R z#F7mWJc0oNd1~{C3&cd?n!5Ui#y>S4w}?U_exu)>`l-b z$*!bZr**-}t|XiqdL9|_WWqBnBsnNohGLqa z{U5u;@^SQyUdjZQFszvW9j29V33h&>r9o>+-@Mh~$kqc^COK|wD+|2xVfPu~9P9i%PfvMb-$7(v>) z@Ys@g21yrOcImvvb7Q5AdfM{GrM;Gyc2$u-_Hmr%0wK4DX3!F#lq6ti7!Y=ijO~Ix zw5v}ytM-xkAu=3CYFW2DB;rCupotsycu2sViCk5^C@_)1WSLODq@)%pd?_pp$nhbR z$XqUR1lHNB5-WvVFmj;}Ce+FjGRK7^YSp(ginNE#WV<872+X_!E1#9c92>&5XyP(! z5tHD%`d(p%zVJ!IKhlQ^@{JL?(IcwoMP#L@CKaI{#G?7b!bM5<8HsAy)P)0@ABI&# z54-wIuAx4yiw?+_lwGV)>M&jC?Lt3}L=u-b$D&t^R#1Nn*W_p-0uwJr1_sEXuyAxh z=tg-ZWyhi4gyofSsPSpn-$g==2;LT@cl6ggo|Ss*Z~Q) z-F_)7Z0w3Bq+J`4jZADxL3v7aC>o2%!o|@9$`&QE{(~Tusr&k9n-W%}1blUul=FQT z$53qFg+6LSVL5$$rpEU5snshqbXTKtViYYNW6jnZrMDkrd>Iq3fTljJ9!%9?$~G{7 z@kQrKR{Xuipo zkj~IAM56F27%WXmrR(5*mJqFH+qgb9jBHBLFbzbaF-4mYhp$J-&w~<-wro}fi7u0h z$OBbQnX(ANzJ2?&kq2YPVn$)=8|7C)BrwhPOWXnhJ(_T^=7P+%D56y&6rbh|9U z3Z5YvigzVmw9*7uYm>yiB-RQ#_XQIY!C)N5MI<1#Au&&t$MHR*&a@1*Ebkm`Vzg{E zzu3O4jo<-vz>2a~FpaqknvZ6VY-u;Y-MXv>bWPD3miMK(465Ng640QuTn`BYSf#Gh zB1duRfSbqp{Fd;}?d{v2-tx@O?K`(Tz4MtJPqhkL!q04ZX6rLgZ{NCO=hmlo>}-FU z;@Y>jw{P9DWy{VjPd&49$J1Lcm?r>yvO#I zf*4cAr`vbzSl%7K5amUtC2C(rwxJoAD4@P7Lb@r%_H8>=?%8V~WQ3IK!01rTefND94 zP11NtHnM}`B6dH* zxScg;ywa#g5m?ubLR*q!NGQXoK<-hOt^np-Km;V>K%sPfQPBi1F0{`$nyCr&oSo_G zUwBOmaL#h=VrO?~b$p*V4;ERN*x;92b%ZC(%8UH8515qzFe@|SxAy1ucmBCGRefUWNY-CH+kDU8kS(i8 z1&^o8j?Xw3eU&#)PM@4@o;&pB=K0XUdEcQ$f7Q3H&sx7V@mJMre`@{diz(r3rutl} z?A(%{$_C^lP;95TU%noEqnkGB{*0wI|ubK70_X^X# zw|ufA>-0`07yZF$+oC%#)A3g0yt{tUUpFge{Ebt#MQ_!N_|~y`Z}VblO{%u_P9j~q zEmOKZ<=VdJEShV*W4GNT` zHXB^4{?@Of-ypKyd2wO$q4efMsfI(Wl&s5t(>Lv#>7IA3zVG$VTu*z~W_@Khk4+!D zaUyH;e7k<$S^y3QeOQ@dsKC@8f>Fucoug+HXaSevzw|c=X{p1ZLNB zF&m!9KiYbi1fVy`15RRj3)VKW9Kp5%hg#S8=0btIQlJ#<7ebaiCx>iu0;I{K6kMf% zI1#ao;hCTyStS1&0*138wpCe{EXFbgE^wk%ZY0eg_>akCI^DRk)0rd9Wia` zv|S{!wuB12Bh(Evk`Kw;2JjG{L@ z<+=fJ8Qm@-BNiQ&-sKtX3UQCdlDCQO75%Jd2oUXL6E)G^2#J>QH>F%nzkJGV2`Ltn zXF-6O=6^#pujp$^T2+Kz>g$ZZA?0fLrPC|_Dkxh)E=7)4EoTk3Ox6^kS4jH>GiR82 znq&v#>3U@RGM=8Wz;I5f*hN@6-K5U2FjU5}OXnK~8g?#wiAViC9EFx*I2|}EK@VN5 z1QOrNuKb(=^!o8-*cj4+)_r#6-5diJIQdH9pfPYAa0D4H6_I=0Vz~aST{-&z>?W7T zSE~|7*Uv^YskcjLl0$AbwPkVy$={=Zn2RKnbcN07T0ss6(?@2>eleYU3V_RF_k{;i3r=LkD{eERsTYu?w8 ztz3Qk_^sn}{BLzl9WHngsGU0T`C?i9J5Koa$?1nuE1FUp4t~&?sW_f`{%p#3mb{JU z_%E3L_3Z<~fi~{Lwz`8pE5Y-+sf7org}&ZiSm9!{lj-fvIRVp%_rr(!o0Nd0qD&%& zb*nl(-l50mDWJ7WT^PSjcNE~z52vih%^Tduw%rdbyuI#$jkh;auz`Yg?D3(^V?W2M z1yHtrjs0+|;&9m{`BOaT=MV}3Yog&@mn{VAF-;dvG<@E&uOQy8Pa~y*dH#z`BmlZJ zN>C=PPwX`~4v!0v-QW-?D$n zVs)2i162!w_36O+xpSF7Ys%LO;G-`%yCdUWm$I$<{4+aOwu-p296IHqceVav$&RQm z6q@`$C_CWdK6JSc)LTES;}I6_IRt7x0Bx#=_tIG`8? zLp1!k`k2BO4KyqR0ponegfnSV)&ovwj3=nlF44if)U`=RF>xt6^%CJv-YB{zY&SL+ zF9#=2$lJXq=`cXjhHw=PFX!t#xa!MAHxk{e<_9n=4q!3U2t{6ky#Z!C?Cs1pWc{Fs z0}%H3h_a8SZq9kO>*%3V9fxzCgGamc`?5370rcCOkLmmw790+mq~pkmQwI;6knbWd z+XHuxw?K#Kzl_Sybe}rS>{W62bO`W4t_s?@YD9L8*N+Y}j~8qQMuSWVpelRSt!N@1 zk16sWP$g_`9Vb#<*tjb+3uSVK%ipIs&p9$ot9$hjBCyPSlU}mj0n7jID4A~{J_-Pe zY6Z+W;v@ZWQ38@#zC`#GC1;oDkQGyO^}VmEw&lujP=-0m#&lrXe?WolG!_2{H+0rx zU9NQZh|tiyHo3)y%%^kTN`}a_ogq^^wdYSJF<<&Yv!l{au&tHm>$c2$+wY309i5*9Y8FfDQuX^XrTafP zn{pldyCpBB`$D1B;M?H??cAS~BlytI!UikdH~A=R_aAJr{wY^+u+jRbH9iU(?T9Iu z_Xd9CEl2>G_el#5c?rePy!C(N$Af&)wn^67N}8$q&;T`0w=&smaOd1OWY+}VW9gz>Nq@W4x07+%5- zl#0FApvZ*Vz)3ixRGc82v?U#{0ay+C^N?O^5vj2Y=oJIEq0@+?t%g*R>rLnl>tI7Z zjeaK@Flo_CbH`}4b=ZvNFqBKEpVrql6wp<#m!-D>cojo|6@5u-AzlS=VSBHE1{wB2 z>aN#I$p514&H7VbwS~NQy!InV^hdTD*c=yt+m5f&-U)|TLXdAcoOH^q2@(|SO1cL( z>G%0xu~hWqU)g&$EtPe!HUCz>qoXFv+U!zLzVi6;Q8v|Kln-twR>O+&i>69Ct~?Ea z_f=}8R^@B`lG0Yx>QvT=<;5wa_D^_{)lkE8g3jKs3$S%#Mq)c(2>MBD`ilf^Qo*UD`{etJFh9$@{2C!<1q~P~t?7B_2KpOV8UhV5 zUyjxrLy*f>#0m>yV{BBSY4j`Rm`=|xgg!Dpi14NOBgO;_fVAuj z1S$kc18Ng@Yak?@9s{_P*T~f@MOl-%0QJ2KVKWMPXj!Ad+2p>agSqh6!HjN58sfw} zc1k#)kC3`$Zzb#-RbL=UH0NOvNfMV0Dh%OeOcuD2$+ZecEsae47NSd+r8YxZfQ&Gq$o|3Lsz(v| z4+le02Exl&-%WVhCuqViAD*SI4gx-rVYEh_L{v2lBzO_lWPpaeDgX=-&P`oy zsmC7C52mHZ)D>nO;|aP2JPl@EF}^GCdH-CPvO@0By7&eU_8yrxxOxZ1%2^J#*)qo{PIAd&5`ET=8Mf{xF8|B z^gb?-_r+1eW(l%_!*oRKUKIGx#chluz9I&VHRiDxG;@;~2F-w=VOvFJQ2@UR!D|%H zu)M}*>x=}wKc>VD{5aF!R-B%|5nRGB_R(I9s%1jde8{AzD)xw78n_%qMIas6SAlRG zLfvdI!|Qms+q@lVrnWS%1b#HDl{SaF##`@b*A75;A=*@5A)#H=PkGpAs8wI!SxV;ag6mMVm0zMn z)d&jkW4}hR%yiC-=mV5Vv&gHEwK9Cyj7Bqmg1i(ldhcUAb8coy?;TPu<$OjwauB!< z*cb6jFlJV&nS$rYvi{d_#RFq@!pgZyXDVNNWzki3vt+s?>)W&FYx>M?b$gav_!3dd zTenydOszRaj#S@q^4-?ns-4}CDQ}o^FeI1?=&GJ~3SSk_^|ZY_4;A~Q5}>hk<)%3b zrrg=OhAB5-Sa6}$G|wgObZ4r!PI*FBS|*>%hINlnw7n5o$`V?!|nHp7u|@ttGyfwsl! zwJBly-9%d0ovGfFD%+C$ctP%G4d2>iXDUm#q&i)Nf1IZ@YUaQ@`{5igf*+8E>|>XX+?krq^v78=^q4ehMjb?;xyG#vP# z`#)d!@ItD)H`URXZs^NYM^a^xPaRyDkPU9SBmUvgyF=;V?x_>mmew1GnETzA_BGuv zUwym&Ry`Z|PvEn^K36@Dlk_@Fj(I}yMVH&&Ti)3dsj?7#kELR!dwO5WwrXnMqOEe~ zr8(QYtqI7%8_BdYIGdQe`sOPb!2ABdl=t(`{9O5}w?ZlZdgdzq*jGj#`|`j0%*~b6 zJi4-USqR?$+Lf9AUO5DI|FErd+c5|CXZy>KwsU{p?muR={?x)#=%_pHwf=N{`LP|g zpFYLY{SN|7To`Zlc#%^754>h8FI&x`SD>lf`1H9A5b5B6pk1(qz@le!uK1E z^=+kOXYW<%-VzF{IO7#yKAP?L;zl0KN76_8)`o_eav(;g;O|K)kORR4<2yLtabe!} zuNaIkZ41v;rfgw+n7|fR(F!jjbwSrqIjn0SR`MPzZ{A~t4`HDix?m+H>evMvu3;r+ zJ|(N>Q!-Eq2`ZUgqHUQ^$%IVEd!{C=uvzDA#3rvx{=+vWZ-_1Lvnuu>t)d^9F??wF zfEFzi>@s<;97$f@mb6cLO1k>}uFTBD~e-oN(7}qJq*PPhu>!gaaT$F$4X%mJ-d(Mr7=L^*&sTq-lujtm<8NKrU;es z`s4V3rZN)OKsIbs2tOE2lW8=MF|@Sbp%yYh`JR* zjT%Ff8PzCA9|PU7mml=7Kn(yVz<`gh1ZopTeMVtANo@0I6jz)ig5KfWnka3S*fDJC z#8LV#m$^%>VRp00dNF^H8=b43YKJ+8s5dytbOMxYH0D+m?qeBcn)N=vuQr|bBcWoD zPw|)l=yYcI6}GktrsJ{f?eORjUT)8y*`!z|nM{sPlfloFX-h#p@ZR-8tf8=G4BSw2 z!Al0DT4}E{1nG*z=bQD9i#1<>g$0{5iZSGq$(qxGc((29#kuC@r*VssP%Yg6MDK+Cfpq|vAP&JV0VnQ$Ud^79k<_p5!y=s>m847H4E7OA- zb%+`Z&3){oq*2J1){61dDy5NZ6#BJ;h>-z(iO@PNU-}~o)d!Jqap-fDcP%~|6KT#; zGjyL-oS{U8W_A8It3^wBPhy^0reBXgYgkXHwd4&)>+reL<=-V>$9!o#G(4NZA1a2J z%qsGqAP7~;%zE*qh6`q{*g(k%!;`b(KcdZ)cJNAX3rMHddSrCklP9rs)fMR&Ijz<1RuDr*=F-JP!7ct6zs9V^@M z9!-~RfVH4DIJ@(=CMG-PZTOV5|K{H5y(wGm=bt%s1aN*^>o2;keOxW~$~Jty=&vo< zBLBT|3M26$cW~|DQtpR)nmhJ$Kicm;?6v;b!&6vV*V$H-j#aYrUTn9BV`p8R>=cyTi6kLQS7&Iu z{Cl`1)I2^30v06oJ!gq4>X&a5>>YhU2HybBx#$}&v_9lqr}1^_(}>P_z}^&%kG`lD zJb5duk$Pg#jP(YJK zg}1WCJx7nn5a5IBqc{?#wmU+x%z{S-MGy%BPvFBhIon0xX4UhWv@>B4bJfboCM%nE z4$1;*`x9)EsNY_6;-sy5hEhR(zOVFoW>?rxh07_P}NJ zS|*(jJsj`(OV0h5976wJa-|6Gdsa_1FL+j`J*!i}@a)coU^pENXKeS(Lsmd2qTzS@tPo!^1TQ_8F zRjJh*@9a;n-kn;tH*Et~S1noin)7^$3;cC;5TD_uFER#?WU7xK=7G)2S3g+Y!UrF8 z^KQOmX*CzxoNe2dt*!gidC0Y*M&lT726E9a*OsKW|;pl|2OZoS``_+rPs-Wh0y21ELHwr=G$g@Mll+o7{?aF zsWq@L0xPzSw@sB^oPm8~6^>ti+^8muhePH`P>N=W^hR8G=QJ8K5Y?|mrjK=_bJ}fR z^)7?+i~eQ*q~GiMj&^gw6^}U6PFM&SX=jx37<5HIbT1_6GEFir;LI=SN)W_63Ibiu z|DtUZtlcH_70nlF17S2I zd7*B3cDT2HKqOVLn-8P$Fab$o${1O4_VVJ#Ju+Y3GdLD?gT$ugju}%MV?1kExb*EJ iyft;v+U8_+{bRL0X|yKw=B)0nSWoV(iJX?GnS);)!*tXD literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/__pycache__/source.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/__pycache__/source.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cea49ab755d6e0db0c31900ab0837912103e3e8c GIT binary patch literal 41175 zcmeIb3v^r8c_w-e-fw^e_>@F~FOiTa(vqn6%aka}k`+3#XgikeG7t|Wk>W!>0QF!% zn{hG|(AHdmmRdovQ^Sc@1I22?G?^Qv&6+5-C-F4t8h~Iz3T0R2R=sO-?_ING$!%?= zoqNB3pBG3&vXge!WZiYoBKJ8sXP^Dv|Nj5)|M!1>=5*RP9B&Uke)R3{aNOU~59QFw z7k37Dj=RVS+#&8LC-7hA5AlLd&=2Si>DXC+NRP8&z%Xb$WE?adG7Xv!nFlS0EQ8iV z)VJXfntSqa9Ww>q?T7)W`A3zG#IIk931wYPf@Jp~kSkv2Q4R zBGemc^bZaTBLksk|EXhry~q5$!6EH*{oJ91KQ~kpGA{ zJm??j!(Ayk|M1~{Bo%J)cOMJ+2Sdn02-}3vk-njjfH(b-V|`&cAAe8``GX@z2SY;< zJVX{pg1vnMeUV@U_j`LoVJfFBJUk-yhWx$5LdZXS1ZhM>KEP(->MK)u2_tNJ@V9(yqKH2@y zBVE08OF8top#MAD5nSXV>a!^KrhGldM|sf`<@*&PqP&Z49g#cKe+s?Nsz>9mr-z!XrzdAouDUw|I?;=C=oa-yPftLX(_h;Z~t}=l0IoJ$Dd=ThN#W++dCQd$_oFV+uOfXpV@HQlLX?Y&50* zjG>N;sEu9EiAGRRevE&TJ6nBg?LKoN#6}6LH@c#pZX0Nf%Iz*L#~sn71S@e7egFZQ##5HipLfK3H_Z0f znQ3$RtA|qhS9_$U`S1fX=O~#r)FirJ7Se{AyI}`j`l7vx`$K!P{!PAF->cRS53KlS z?G`a{+*h1mabbnRx-`HI@?$!xJ60%eP&cL@)Q=ek4P(?EhA(qtCJahD-d%JEMuC4* zPG2xp;Az2FW-Zp!h&^T=vsk%^Q%OuPM$NDAf+cEsh5wo%Lc@a{%Bm76T72hCssoM} zojNY6n{X-3$@i;k#GDb=LzY>5G}$80aUCR}0jgfnWDC$sg8EwV&;al)m%5$4a>P#&XJ9(q%- zQ#LsBbRNb3zpf;r<34#Cw7mQOr?thsOHjB?1*6hJAcq~8FMk;|fBJqq$%+3lYAHBE zf4gyPA9E}k$96W39l!B7cF`!+`oGX9r5JgAQedP@<2bTR9Z%}K(C$U8N(&y}z?KtR zga|M@z#(#x8s!&_Qe|#;aLU+M-hR=krK!z7^opG78Eb^7J3FGh@)nKj31^`mm~cv? zTZ#E1axWAwYF!l16=_iNi8+t(;BGCEM&*vc7b@j_Yo(>;LTavirl!u-`=sVVUGFn@ zCS3P>$|yuzB%ss=eR}UlmNjg%tR+CzKQd?$K@PYB~@cJS+qi4yKV9FRz$_8F-h;nj&*8qKJ>X#n&-5r_0D<( z4|6<<8|9wCLdX_SEY?vzs-wvk=Fd9l`iSli_=`Nxo%I^HGu$8R!MN~Utl(%QUCRSG zzAwl3hbdjZ-!Ij}y7g#iD0KRSxP7$x9u-j{d=Br0s}TG*?!$3z+P&#gLt=H}z*NoD zv)^4FFN&|eV9dBTeH6AJ$_vg4K5nhx7gPxRhE$;eT>L(-RtaNzjMtdqf~+q$f$Gwl zr_8l}m7l{+`A}wp+zhMG3_LZ%W!8Yomc)H{1gUdy(Yf9Co4qR@?x*nKyZOFJb%(^yZoZTOZSkt*cY0e~olkSa(tEf0F6tq%6 z{BX_~J^|@DXTYQ%fC$Lud^l&4re4mv`*d&U1PRGGbMJ5u6YdPhLubM{WAE??L{@!p zU?8U-2o2@*;Shd~_MH$*C|!fl*Bi+h#o*A`T;GRDk=lSPjt%3xZ@7xj^-uICDw32{j4LqfYR$M>r}R?? zvaStZ+%vu_roW}r8U26l@O=H?WpBD@)s<6kp7~+vpO+)w@ z{?{8*_1{=ETe~4syJ39Kc>8$dy_x`SRn6A4Wop{8HS2$A-H>RH)t_52u_AupKdhRz zZW!Nr-R`_$cf<`ZZc22|xqUb7u9$dsLt@=~)}na*OI71L=W6Pb?XQ<4#Z=AfBd;&{ zrFGT9G*%%Ev-Lt<{P2awWW)8Em8p(w&Fa~j^_iOW*_w^Nv~F4$f762aH!O~Gwh3E& zQ`WL9$xmBqQu@oMuNvNbZnkx2rgdkwwIkEiG3P70xOZ}IqA$f~eJfIHGQO5sUt7l4 zHg)i7QP#I*!WuKgy3thDhQBT<`BweqNV>G`dq=<9_m1gpOSWilY$uw^TbZamzjC&? zAyeG&`l(dp8)LJLTQiMYW9AqiYnw;CpM7clg@Xy-`6s9CRmqW?4mU{S8*7u#rhMPn zGUMKqb!>|9a=iF~7q=uvAj{pfm&An``;z4DTPDtGJ7=CS$N6~8q~Rs!c>A2yd9HGz zGTxCWn%tAME*;-_)8fcF4!l!x?b)Au-#zfN(zmN;90#(N1LN)UR%h1P{m!~~i+;ZL zUGZldvbzq>IJ>jfZuEe~dd@UqddU*sd2!F=p7VRBEz92MOs)R*#>*Su+?=gn|HI|i ziho-1vS?wQlMqa5+Tk7wI*I~5&sBXWRd#k#9e}&=g`tto%hIbmu_tzPIQdhUXiTk*U+El%U@cLgjZ_lLS&1Qoc3HP zJ$g;+WmQTU%kO3Fu3@M&FZL&o2}8Idsso~8uEZD<>;hlOWOl*9WTd>-6jV9w1wLvJ zby33*7&??94B-k3uyK^H9krrJ%IYm^o?==a*LPjTiU` zu?pP z;xP~6?o`sy&SRX05apGl{u5I+Qp!V;gQs1N8%1hmW)E`prYiGoMSoyUm z_I~BQc1G++lwWzV|0QxjyDNB=UR%%$KBa#!X1M-GmH66OD52IH^G3a*H}aTrKWbLq z!%T!0Ys?q*gndFOTDS=5Jg&sk&PqIr6M0g(-+xHC(#}zjlJ+OYELLL{M}2~kVL8u5 z%~2l_QBWmM|1(;;%9Vy)h|fg5VWX9!H)y1(W2Gq4qsA`M@C$Kwe%z=PNYGZnI98(3 zCX|A;2j;0=K^Hr?XF#LJN~6UEOJk0fQfZZ%h^A->(g3PCR&sV3&kgYgF6xVxNUfZg zznl|VUa2{MmerkVau0gu|CIEMM&;*~7SPTZXDZs7H_omic7fG#%zgiU7RsV-qT)h1 zqveY7qU&YW-1T$ zqqbHGl}d`Bm+A^CEYa=)Hz7cR9TM^a9fS_JiQ%lE;3kXW9OVo5=;t)_JVKZPJJ8Do z)`EVLdKMi@ofL|L82}M%%$T?CsR%4|0;WRvl>n`Slq`D6A2lslO|`cT(hOm>Oe(dM zQ6=js4)q1~k`A=V4(K6>8z~ucL>>Jk7A`uJk_)T{`blP7bVxk}PR7wsa^#`|>$Ihk z6C_;T7_|#FHk0kFe9tc`pNo}G?Xw7>1ME1WLs=`)HyT%=(uW1@pxrgF9Lkg&P;WIg zq=i<(bN=iN<#}Lf&<94~(NJVWBt3J;5A|jrRLqikjcIb3b~qdficobPl`yoSk-@_u z(N79s=({ELb&HMU&Q9D~plx2IXq#mvcQebSkyKTUeyFt08oq4lgLD`UrqE*FB(!@5i#85bf{mCWvGljccRrUY{ zg4PXf0o^(@pg~kO93c%l#C%p%rn_coF}-|9Yayx#0~qDTAyx5d0FRUgU`G}`7-0#v z`2Foe{=JVd6`qtB0hE0(8Xy%crIcSN*c1#6N2ub8If1~;4F;$sR8=4vlO-jmldqgV zbu5G~U7RfHIx-YI8SEP%ow>g$)N-^%()q%+A<)t#l3XzA-r6TAVpsJIofwI%y35-b zyqMz{bowhjBIWd_`i4fAHTzEtgo0tJD~1aitP$GTP*9-yH;RNjj_S5?`ZX+%-Hk1oJK1bM_^VP%qAqz#26ZF%@W^VXYU*uTMO4aWT0uN_q5A+KlQvWba80;`~=#hIm=a#1+ zP@^Ge+{IiG>-!$M-E#uqIG`*W!_A~5EJ`ou?0cCt1{>Hw#DJ4oLZ^Fs$oeH`z%<71 z69d5r2IpYTEKh)3CFR{aB8r&eEDy~79zbeGBgaJIG;#8kW3b6W}`VsK+ahrhkF=75NT;e%P~w(ET0y0}+)Tj}CqhF)&d5OEoPlt^KxNJ( z5gd^uX>lbb#t*#jaV^a-%?$r+_aH_HtoK1qp2 zC{aDefOwLw3|sCjc%HMV z`Gr|c!!))uU~%!41Z$H>DN@jf|M06o)yKIHe4MK+elqK<8t4E9I8>R=POQ%a8 zPL_VN`t|CmeVLl=_;oFEZR2>?Uz>|2hi(}h*2;MRW9!fFh;__YEKi=yRuY|I@U5~X7yBmr-mrheIqTn+@o$^;Ka%l3k}dsgY|q@Pw%JuX zGOKoESGE7rw=>xt?@n}_e=6e+btY|)BL(TddSY|*Ne zkS$u1_Uw-tGoJmo3|4C^tHOmHZ=AXknd*EqI@7pyzN{*7^8E90!~C)psrA`qYbI?s z7vGB8-nVd`%7lQC=IR9{+aF<({l>+r;jh3tBF=`#rm7-c^z=U6*yOPg~Z1VB##E zxM{{*2D~*MjGd0T(Y6&!(uT_M4g|5bc-@@6WW3|1*)2yaIrsd;^D)Dm-5uXNZC{pN z{@|s^TuEI_m@6u~SUp)CGtHZe;>%~u6?5)Iap%0NVjXkE^17bdzu5O)iKfqdKd$xE-+OcEKQ#$LZ&3I~)eHl+{%y=Dj z^p?g)&TmfgliOn**S%$Ff7d174R6J)w<+UoO0CX#n^6*PJ4Twj=-lYUXreyru8tY5 z=)P^cY@2G!Hf>D$fQkcKJvQepPxvOcAimoxMV)b1UoTsl2;C~@Jb+wdUr1XjZr~{4Oe~FihfY>1K;)9##=_jK=1hLlftDhBn)%q%Wk04 z~NuHIvcg z&ZL+vT5+4h%!;)uD0wK^e(6}&*BINKbEEys0X}a`v`=nH)}f*1miUu3iH$Ema>G+O z>#50jYLe@|x#jgOsb{~jeQI^OcHJ*L>u=E#<8@z%6s>%6TfUEGqjwWbZNAAazZfs^f<&Xax9uNl;Qo3n!6 z(11Go{Cva8EBmgRe&qgvdv;@2W@A@&<7cxC2T+%y%J^q)HZ-T6$u?|>cg-yc%r0rm zENM%x>zrA#XRh3jJMoVBnwHd9wq{#=-*sOF3S3lq_m&Z<|MTrCu4EVg;Rg=Rv*b2s zAd*u$S6p(jd9wL@OR^|aTsK?XlqqgX;c{hc*POffTy!Fu*qJzxc2_6YO}m@sJl=HK z`iy6NTz~hL6)F7lZ4X!U8Khav6;-~vJ?%z|>tw2vPdH!Nhv8yv{q+Zr>NrQ`w4wT| zZ9v`chDi!NYd^4xyIOi+2lv);$H6s*w>Fs$Zs6Wtwd66K;T=c2<1sV$mu)K_Tgzou z*$-^hXSVPZ?r3j5*s9OA@Dy%nH+1jN&ur%r{=(ew*aP}swDJ_LwLZ@2f3br{*sDr6 z$dfPvVjJ&xaJR6v9aBrgUaXMh0|}Z3dW_XYI--U*70kd8)eHOxtPP@uqp(9e$}=e~S(cp93ahj~b6-85eH@ z(=S>S5kI4bD6N7Tt?lH(vD zDJuE{M8Sskl*bKnaWizmp`Z(k;#wESJ^P{(Q$}jcr?`M6_=lLzG9sY~;Ih!jc;DX$ zk=UDW`@R^BfJA)+KnBd{rG#anKF|L4V}QioBfv;{2ZqByL$-B`BQX7kWDT?TfiSc8 zCm6=#+fBoC2%aK$ z`0iMn!ZU+8e|2MW_bWT%>*i`2Q*EzT#Y^JmL`}jQdoFF+Iu)9F0w?fauJVL2AzZR& zo%Il$9KQHtiMGVL_|sWO?Kn7h-=)s{r0Q3sgx9-RQuT?_wA-Jy?6_KT)r`{(`|9zI zAJ+b8#Sd0o>&|Z8H`T_N_*W0V)_akbLlMP?1PM2?sokVb>sy=17G!*NM?~d(A8#YcYNATeXTe$MtY0rk#x+&k~EvZ%C zXiIxG{Q84R&Q~?N(Y2?A`^o0w zhxCS@mb>??)cOVi@=h@N+CR^jLy;*g~en z_G`d#A5nE|!(zCtvU4O=55 zFpTD(NWp$u6$rb~?ckv)fF6fq=ABUq8U1+U; znn@^8a*_FMk5I}uY!BnNEm03q!a}=p6g^?VRLhi9#kHWa1+}JRyMvPI@6n1d#l{X0 zSK)W@#PKy%1Bw>DA(ThuvZ80!BTuE|g<7^kDV^YCwQKx%>npXRQi|V^%OaN!;e&U6HliEFtakzo%BrvOvf}`a(tMnSwnEjW8dzvlc^d6r3AMuhQ+#o+CV9dSoMjf;OK>Y05B5Bgwg>zK~D+G$1!HRS4&WBMWfP+ zLp*HzX#0SjSy1TMFI$w&Q&{WSsimofrQAMEiO|NX-2p2K3;Iy0brBBon(K6ITXTqN8NKi}-~I)T1Q8(RIE$l_We(BmXh=HXhq(iMp?bo^3Ig z)vr)Uv)$^H&;5krZan{A$as+~4o--~!67KIp&h46t~H*kVE*q<#DTW5dJ8!)l%6ZT2z? z$I_)iF2|*=ATCahCGp%~)`)w<#xApbzxy(uGqQK@8XLm?ZGHwx+|@UPZI^X9i}E)7 z2=vI;Jw2mt#OskA3-t6fHIBL($)03*kjz51J=HjBXnZEnA|6Io3=zTpt8M#i_1|Ceoh4Vhv#WRhvJwisL|fAE%BJbcUDtM9 zdo*47(7QG9w%Bg$Td+8<+lv`A02Q2sEf@$}cz*KvWO$}*<>ki~VGB_0mc+X!zA)>q z$+&B>?z&lbOUB)jIyvKBPpYiW*B-g_NY=Y@&R219|I7RTwBc&$kE;K?I$g8(7ruRS zQ1ga>iyY4s1t{|FWc{UwXP2(ZEM1lA1^P0zI!7^feYN&Gd!cei;9XBZN4`J&onZoL$`c(gZ&NGuXTEgJ z_8H%fIlJ@RhKUXFbuVpC8!A5hpk2o~OD~*C+pBMLCFs`cZr_}vXdVJn>5SWd-Mi$C zy{RKpp=(df)PH7r*=KH+RwqqU=9$usu{})D4mGQ{1sdL_Rq-bhBQN(%t%-F)lbtZU zIF=L>N9M?$U~+qMIY75n8E@;fqxHSTX)>*FUB+8C>ur|Q!lV;jo+(*QNtL84)@Iym z=ga)b(iFh8nX(6`JrDlvXS=5#dusaW&rb(K>FOits-x+?{&*yAoG-0RtVbEU)7vCcy;egRp+EVZag2kwUR3Q&$l1qxg{NZm<$RNo;};R zA8&I!yw>p3ZL1!BK>u#@I)wkF&O_n4HiUn%vYp52XRQ=2*y%#@9&vVeHX~RlEs}o* zh3f+!>x6Y7W|?#lm#aM`yk~S1A>4U>K`{A=_L7+lGrYkXgawHV_JCLPMSzyW7)G+U z8AqaBIV-cnp<6_ZftS*&mw6^chbd=i^Qd?gmn`@*n)D=6!c~PGwg6D>c4zG?rtMu< zj!qr9`qaC=Y)e<#&?U*pYT5CETI&~ZcVVsHl;ed9?zw;^e4d1?#Dzx>K2O7?@^eUo zXf8YQIBa_%zMG|y$5kt7hif!mJD;~!o-5}<+^?VmHw$kg&@S>3uTqlxrlRWLl-Q7R z)SW2UMbB%c(P|_v14mt|y`fwQ#*^4;sO|S)vXM!V6$CRY9m*H5jBZ~vdcfiYB}YR{ zoj?nlpDeljP2_4Nfram*f5}}-vNavu|&8m zgPPm|Qez!$QaAF;;3&p}tO09e9iaHyl9W%3f9qzQ4kN>XfxZ*rzHrX5TfXW>mvsgV zIU{>jWF5^|r7xjoa?grC$8~+zeGto0lYq5|7hjv@W@P#v6#i&Y~?fg5cwAuM#V=Eni5i zG#5geAwM<}$ig_ z{KAH@FD$(-PUG%8)tqPx5#f^fkypcS>`n}1?JLuUl~P^g(jZD6;qAn03+ti~vN77a zrW@eN84#A7{L!FSY6c)d4>$%blfQ*uBUDgIaQ!OjWjV7z&8M z4RSH%Eq%r)b2y~Lfbv@xH8Udy{%je6CDL)N-Pa&7)f-Rj@y}P+#jOQ(p2mhi)V%X#OS$5W$gw2+_|rKf4zW zusH%^XxR((_fau8aF_Q>atdMDZ0-cC(oS`=q<095GxX%YQotmG$LQ(+1wW)<7(u`y zX+}*_E=;+~Udx%`4iAM1OPW_=J4hCgyrq$_!GLiD5;jhQpS}DZjk6SfVVpV35{9gE z*?8w)8~n^{Fwrz)u1ob!Ex+8KeEcR9qNQ1ve|*mkhv(eBiGA@%*0FSaH>pa!7uJ%6 zA8brvS!Jw?@i&W?CLT+!zVx|l@$#5?&R!JXGi_gz_}rYAbd&t0rpX-;6oM~WU`J)F zyX6NPAA9tRXTI|M7oX3X%M&}N%~h$LNn`Tx>sAoXbDJhM#UIPsVF|fJ8vH7OM9I~O z{Gae+;oz4%E2%>YgZqo{?iAJ2unGftgnt`MBiI+|7Z6?D0_!G~?*O`{?uEesZomLG z4!)+>k!(eUKB-W#gD>2nav+*vPS>CP9aNr1-@Kaw7&Z@V|gzv|U!n%k~hm zjX*Pb03?40q`@MATNv&oK2VUriQZv)GQx}&!ZLLx4i1VG;yjoUHycR-votF#GK zU?YKsi+CLY#*8$K!bBkCF(VBbl3+y&I5b)K3ph(d#+V3RvSgh#P*Izm>t^o&Ane4y`jz^mmnloFtajiVh(4=<)G`E&$u41)yNz87rjV5&=v<^;M}FEfII zwN&lSfI;eTq7|&O7$w17(vfM=Sg(f-xJO+q^)JENA_WfWUm6?vB%xs6zGrvEBZbWQ!h`{3!h5}s%68}$!lw8O7>*!52XzcNu36QqaMgf>a@pk@fCDijDwRV{>zpz zeuC>)qiGjWzDNCm81(+412NPbqA&pj-`Y&3K*1B?5o~;*9XrY% zi-nbIsn0J7oI@EBLr#GD{o$s!8*b%{Q(Qy zt(*?^GVhww1Ln08(3|Xk1v@E#V@W<(uybQSQW8ffsH1?=2WdHtQ_gVwln~DGiyX?3 zd!bP;b0VsFQKELQq`^hK{oy!wOJ}g|CaR>m@RHkJKAsQ>CxRVaVKB$w{U+_ z+wRe0W>9%S)OtWK$wQ|2_xLSR=@{4fd3o&9R2C^Hr{aOIQ}I49n2i2gF0Q2X;=aj! z;~iiA3}B{_W}kgZ^h6C5a7_eFZK*A zoDLE^O7?I;cu>OHk_V|{9SRR)=tz=5Zbe}yTPj?g=WZ*vBtLFAGIF>F&b<0)zyaVT zFT4JRa8qEjt^2Y*5A-CwbJT|Yc4W>6j9C0*x?yPwY{Aa00g07Df3oF^+DtJEpg}J_ zg#adI$cquaMV0{&GGruJ{J#-#IrTXa8;nR89&H-mJ!fwsTdeZLx{TeAD}&{1=Y>s) z$5U-r4c9tmynC~beHjCW1bY(SmTb#-8?%n4i~;XmH#=fN{AkiRIh=7dU?+yb@^$0a zN79Z}8N;ga4j6DL14r&^?j)+@F*<$6hPYNdzl;8^ei`=Qpt%5sK@G^zZeR)o&48HvV8>7agl z1=j*aC|J2GZbf#1X|JsiPcNvZyc9!X2n7$Nt3fwWlTr%0FL(-VrN+BOLa}C;PBCfA zG$xZb*osbTBwxv-Mv>Hk&{Jr;J_&t;DBU|SBCrjqC;EDi4?wji%_e!HEo^U~rC>@H zwlZl#_+rRL)=sH27_ZrAAy))VXmXgP6Lf+jL*%s=SxL}Mo~p9Nj|}B`ASKAskQ1e; zuM_}|fyo86wr*;KqA7B01fH?`hWZBkMv*5=f|NnhI^t()GA1OQ7#zi3w|V$x?}tr0>!5|40F)lhdE*J1#M0|CjU= z{_FJEkH|<@nAU#kQ2CG;G-42#-l&ZT)<5CbIQI`8&bVaW=9(CZKmO8K*0yYX*PI=@ z#jcxObM9tr40Dwv3==~!{hZ4?p~nuTnBls=A$Am){7`CLOb^YB!+qg6z>?CyoW&8> zr%RhsYcr)S8Ba^b(lTLy8?Fo1#PZq771-M|ReQDjUEhqSD`V-xZanPBT0iTp&v@(M zrwmzG9FzL#0|4XUAMeSG=gExa$(Vt3Kkgfz2VzF14oZe*Jk2rV4cM64C+&%jtfwYs z1Uwc$FmW0s9eed;Qg|hraj#4X-|oBIchz|H@YUX{wrtC;jC)tikVidfnN<#Ia<=Re zdjZdiI06p5Rc+4exCx87$ouR+jR986#NXqU4Co8Eg99*@+kq}U&0mC zzsG_|invFKq!5|OnIgla=9YMFMs6OW2n-A&z?h-s;Ct%nn)s!h{>ZaKlCt+aelB8r zq~s}&r!)fcp4k>(dvW9B##i?x!>>T^iCwqN^Q!Z9dl8g?iEh#ZtxcF`?EaMZ+ZErc zAcS@8Yuheu%X$N;UC`xyuYM~0{n77?em9z3(~!mYkOZhFG z+vo#-upIroAIum^=`;`H)Oq=(vD3x>_z8x zOzcQkZOqs=0+^4FPP=PTEy*@q$Lt@@+aVeljXsq1Qn#EX%Yj}>tevq}!%QAgU$ox> zhTyv!rWSk4v~^b{_qM*2!b*FGP5*Y|QiSgqbrf28goSl_?=T`$SQOMIkunYM=i5|b zM+zbds^6M|PgNYM;8PWjg|9AhEvqY32F>?2Jekm_V24(Ipkn0rhL)m5PgLu>0_+^f zC2Y_z$&2$Qu3B2rEYKc3{ZXEX7l;IqH{}{4uxe=r5&)3;Np8rXOkGXv)=DT@l?m3P zdH!a#r%JkcY+gb8G{L5Mh*|)97mTg+Dzz%wwM=fDypslo3#^ucqmlz7?neE}m1rNY z-zWEx+^%)lEx;__1Q%287zH=oArvvM#pO6kX`$vZlb<=Xy^dO*N)N`>6D-FXseR6) z34{>xl`M2=yxXxpe7r>LJ$43aLQ)_qK3Q0dfQ`5m!X$}jJc=)zs19i)Z!}~nBr6JG zyF=bSD5AuVswvAna3_)poemDdkI81qI&1s(?UDr?Lv4nK2cVN;E-w7=gAwTq4zTPg z)(M#Y$oHB+rknkT;RI!y=KcPr}hM?9m%O?++51XYwtVGm`RYvh>TLPisrF3y`q}cWnewey4`$2T zXUq3w%J;mh&zA3>Eq^pq{%HE(4cH5k{EcWnC zY~&8V6rFajOoU&HUIMWP{Z5y(X6&u=Zs-`!K9@X|?3-$vTAo?HF=)HdIbxZ+PY1n`T>V?UzocVGCkzp7WH&&b+!Ssek36#O92GZ`9UVLWq zndJVd`mA#UscK!Z@VT*xF{o-Go_l=p?u&;e4<+^Idy)rWMUoWLo)r^5UUQOWIP^`_c})Vs@sBR%XmA!D+HR0i)CQn$%FTEv0*XBUQ2^Q9Sw3jD1BP$_3~&Qo1x6NNC}?R3RJmkxP()5fq@xh@ImQk7@rE8Tm&$LHgB3Ok@MlWm zJoFdFF(c@f^ywLVaSFdkDaI_YWs1x(`+*0Ljzv};TR|1oGHS{|Q7_n#;}Y0B|Hiox zV;VLI04Eq!VH&bP04fvgB_71k$mWbdnXaX2G5P{by zvOiXdv?NtGHByYm=03%Vj6o<$wC$~A8Yj~ZF?jarmyjGD=B83C4u5q;FiAPQ;m zP~`$>ahY0|77B^n575;O3J7J-nMBDcx~&INh?Ey$_S8x6yoByyKqqt2jXRkbuU+^L>OGyJ@Jkgw8QyKYNH&h@SC>V{PLPfB1o2_6D+j&R2f%;mL=S`eb_+u8p3}_yV!r z*P(`N06IY?jPqqR$p-iW8ksthE!!41e8^M)x9kS%_Pb#cvfo;6-?@%^YhBx}RrY`%jqo0LQ>SW|2XkYQnx{V7qyr2O?yV++F~!wlltQucJ_IGjf=dho;jE%NkL|WZN$F06 zP_74ai%LuoJFtn#y7)N=vMOAFAU_3yY+>xaqfiatAmX7sva7Zch^lJkfd!GUX|z2Z z1?#Lj!4@2>y=+6v3g!0c-o+=!zN`>>)W#>}%W(?pfA)n)Y2LjWwT9&A#7GOFykxuB zh9;Z57}GC1SbiHlr6pTJIFQ@7?vWcDSYS(1eqR1h$V+mXsRPf zqez9Ot!x2@xQA}wE2D5DLRZ5SFoc^4C;RE=4=7;530pka@?<}F1|Bj_OLB-ql0z8C zjSrbhn-rw2yOc7PBy_ZBp(kz%JQNT-#a1l#c{^p1qO*i`6R{B~n5Kp5b-Xgpy^n>e z=&vme*I|(Eed#$M*`<{eLQ)^olZBkbz1v;qHew@hN5Y$^jqlCctH9AqjQn^9Ji-}Q z%IFZeO-qFFfem*|0;+%dT$xi$+>jL&#i#5z8@Yp{KDzTbu-{x$cGug81Ru zogVJTt6jS`aBuOhju!4MPkYU-HvQXcc?vgJJ67u7(bZG9f~T;hWw&4dpR05Td-GX% z!qfHmze5^%LiESog&-gR8$84sIM;{3P>l7B-eCus^56r21`-sm=-&jjq=T(IYCalR z6fVlA^wOIS+Jb4&)~p3Fkh1(-VeZZOP#GLLXqLFxS`7ntRh$r10R*nziPpD*1JdF0win ziy%Cys6A_T76|GG6rp?m^sT|=wFdOd(zbRXp2Q?@B}2CVZYFa9amV37=iz|=AhXxXGZ(G*wVE?v7kQAD~nnb zNnXL1hllesWWo_kNy++5f!(IfY|EaMsv@9$JQ*r9ON#dQpIn*JQZuG0LU))5tZoAt8%=D%WxCQIwz$gLHt8W=CR1=y&N#>uB`g5R1g z`dE`7#~~QH4mDy9{)UhPOG`!*^1Ft$c;3*aaeQCU0pI*JNX*O?5HV>#=C^PK^S9UN zhQ{%{iJzl2(xmXyE-m;H3o4tm8Wl@~#>Magv24Hth+ax21sd1Im>|Y_Y1%%U#%<9@ z&FCZJdBvlWNoD*IU1?kvv3JB>Nr%K^k$@#qV8)^urmda;1DYW+k3TnG0k5gAR!{m; zA-J1wzQK)#S`(77kg4`Bp^cnLNswW z{y3SvFHfwUq#dtmLsfVS+WPlBJ1yKdm+UO#eyndd;PjToy3?nB%ga+(X5Cq*f2)?K zFyPs_nR{!qb(cy1wvk7;z@Zck3&tNk2bo&27b8PM!NB%-81TVo3026m7#lP7k;_31 z127emWoaPO@g_zD9UX9x^303!mny-NXlu9j0T+B4!i&#G6j=2&=NYiw(xh>f7a$q4 zU&R8X94S;vQOFicQ(eNTgsOs*P=+fe#nyJrj!$1TEy7hCf;n&Foa)?$@mLlL^PZ|@ zr2F{r6@dcm$aB-9rl7PIoJ=fJ;ziY`%+Ze}U}-`0;0p zPm{(4*H>TrAkA;m3;c*&ejm;sYO_Q7v&~q^dwHWi&}? z^*1g~MH_E$7#mQYMqR+B$dKQpLiiZ1;K?l{>)Lppt^nIZCo#Y)_Uh2roDi6i+# ziZwui#*q-kmi&me(-l)^te`7Rtxb4Qz{`y7wX#c@Yx!E~bI)WD9+o$%)1}0?fb0N0 zIs%Rg8z)74tCjFH@vD@{2Nay6U>5~XBFI@GMMxiLVEZN&UMKI&*q)rbN9i4@&BO+j zb2nyG_UY_sm{^GVAMcRA^u6W#EOLAH_5bH6kUqevi9P%gi;b=F>+vDYSHjMO+^yd=?) zGESYEDc zEnX4Zb+go;^kqwzPwa{9j@QhsX#GcyuV_iue{aLpw(oAc)-k>Ip}C5hMDc6om&%iM z*dbfdd|S^|R)JT;R~+`T6SAEzUG{2U%J9l?wzMU#zgbz2eg2gzCe3kUJUG{~7Ktu< zgii|d{>GHy8_p?T#=q`r)79D^HT|IJ+S+#wGn+qyRI6%{9OA{T()lKw{hzt8{Ypi8 zZC5t%NV@Kkx$>H1?ImYy@0@q31ZpLpCA+a2ICz-#uE}`UWW8-uk7m3ZXT94q-tAfM zgZL5vHV__6)~7;OpO`7$4R`F7%VJje{dC`2hqixzJs3N}0e#H&z*TagFKIYGoOLaa z>94zs<3d8193YIX4V9;_3*}QA+=u@e~$)i{a)kM`tPpF)b6-u%+&6_hUVO_ zHfI+vwPzRqKeyr&?m4?JZSZ|`dkgyTquUN@^N()(`HC){eaHLlisF3_nBHzKL-@|B zz`k{+cRj`XHXGipTaK_-)_Y*0oV9%2mcbxgjHH8XvJf8_?@`T{8Sj zY;9Re@$k_`e7%j5GEh)OKee@t#+IbAVTiM`?MXv|zFC;*2%-U0rT-MT=IKn^mxkooc%pnW^fC?Trf)kIXrI z1s0q{DC??^!OXvy46|N}&bpUp+{@tx$-R>3X?MynQ@n~66RbZFvkVo1QQ|bnp%fl1FkNthM>*6V*Ruep*Y?VJB~Z072|tj!WSR8!N{AmqmH^u zIS9C?$#drdLZ%4t+(Qwd1Awk4OG|7Oa^@=nl*s^P0iFwbSjFPY7O+9mg--zrhX5@d z8sUTbI!{SJQwH7w4a!tMxIm3g$^wA>$^trL%brv(Z57#HSL@SY?!e1%{ky2bdTX{3@EKl8%Z$UQ2R=7eVOda zYP2+zD`jcwP+Y)wkP}A1Y~1CM&k=Adq{or=`;i^srzaPy1F|dpfl!#1axr; zmU<@5kGjdB7Dl>aY{+;X#@Z~{TSBV`v7L7!2(Zd=5|o86#$b*T{3Uu}?uAqrANiC< zn)C9Tut$|mvXC0l0y!PJ&r&3M0Y4W8=?uRV&EZHNc?pdSV=hAr$R?>YJ0(9*BdCSH zkuh%)Rv}>vhpBkI2*95WOQ+Xy%6D$$l3dbB8HB{qT50YRnb6z=ER6GWG)edwq%+R3 zPnEsAF$s4tU$;)ReSgz;HeG!zyLMM<-7O1OzAWyzW#&qkBv!xtx#URd!0V?IBQQZ^ z_l~{Mq6>76c~O0tdJ6GL!HJ{6!wi6TBCl(fzUh6d%w_*i09= zT{6^S{3SAs2#T+4Go1(pAfg-q$VUV^S_ZhgXz-2 zA8fhW0iN%fBk7~ZfAP$~g)>QCQke41maV7nnw1WI#7stC@CNulz&{+3($XcB=m&Jg zG)4rMFuW({U1&$k%z;G4c@sx1ZDAnpSK_?CLicEVNYE3tGvm+$c1@+FO`)6vstlu71s%@Ip0bmLn(&QyLJCH@LvKyTRBrYm@OWR?Ydsy7_Yw=m<%L#U1&)? z8Uy52ng}Os*QFDQAKpo9^IQ7i2cO|NAM@f`f8AT1EWrmD&pW74^}qh0i)S7{^j80M z_mae8b4#jY`{ydE z3XCvN5*l&JE}ie<8Xr13L!d8xk@v(vUvFO|Os`=^%TxM2{1Pd+L*tYf^>GdxRpPyg zhE!+Db`{%BcBc)yB^il`fpU-pL%;9%5iBkvN~qIF&p{x`L}paIH3~}N2dGUwPC4_5 zAZ+eo>aq@%SU_=dPRYJgaWK3I5&n@1O6wLC6nk-!N0TeBT4wC+X+!&cM7dAbl;Q^D zfZ{P68GZ!WCsy#i+#uGZjd&y#aX}O2T=-%X8KEkL+=h4`E^N&ZLi9>)M5j*rJ_%hg+W_gJGhkx3x;neN3Cdvc z-@{IoHI;m4}aqhWbWBA_OPw8pDUE;kdw0kr*j=(beZE&{6P56zD0Sno90E8KM76 z`Z-Mj4K2x$6s?2eJ_`Ppf`=*iI|@irmfRnZ(Vk>0O2`Q7I7wxoEgWn;pqar2x=4da zq)vkWLvS5zhhDA}R}w^oFGUXzDj%K}*V1dGx??LKzCkX1zj?d38wuc#3&UFq2Twpe z|9-idH{34P*?02e<~tUSFZwIa`cFC?-~3OU68r;Q{ey|){eRCbyKOS^MYlaB1jTC* z^z%>Z_y_KsHgxd(raN6a7rz8c#-{CayB@luf0E}bZ=XhLkMOrGMZD*BlbK(4+lS=t z*p~83?`*g6MR&?g{9YdBqwdm|`o`_oo!*x|H*UMFv-6%iOIc8lt1iBR_ubyuh|9N;W}P literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/__pycache__/temp.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/__pycache__/temp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24bbc454231251c9787427b2ef446328bc040be2 GIT binary patch literal 9477 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 ajNV-ng5sLhP`|U8ZTMm<{AGeZ#lHZ}0R{sA literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/_dill.py b/myenv/lib/python3.12/site-packages/dill/_dill.py new file mode 100644 index 0000000..53738df --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/_dill.py @@ -0,0 +1,2226 @@ +# -*- coding: utf-8 -*- +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2015 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +dill: a utility for serialization of python objects + +The primary functions in `dill` are :func:`dump` and +:func:`dumps` for serialization ("pickling") to a +file or to a string, respectively, and :func:`load` +and :func:`loads` for deserialization ("unpickling"), +similarly, from a file or from a string. Other notable +functions are :func:`~dill.dump_module` and +:func:`~dill.load_module`, which are used to save and +restore module objects, including an intepreter session. + +Based on code written by Oren Tirosh and Armin Ronacher. +Extended to a (near) full set of the builtin types (in types module), +and coded to the pickle interface, by . +Initial port to python3 by Jonathan Dobson, continued by mmckerns. +Tested against "all" python types (Std. Lib. CH 1-15 @ 2.7) by mmckerns. +Tested against CH16+ Std. Lib. ... TBD. +""" + +from __future__ import annotations + +__all__ = [ + 'dump','dumps','load','loads','copy', + 'Pickler','Unpickler','register','pickle','pickles','check', + 'DEFAULT_PROTOCOL','HIGHEST_PROTOCOL','HANDLE_FMODE','CONTENTS_FMODE','FILE_FMODE', + 'PickleError','PickleWarning','PicklingError','PicklingWarning','UnpicklingError', + 'UnpicklingWarning', +] + +__module__ = 'dill' + +import warnings +from .logger import adapter as logger +from .logger import trace as _trace +log = logger # backward compatibility (see issue #582) + +import os +import sys +diff = None +_use_diff = False +OLD38 = (sys.hexversion < 0x3080000) +OLD39 = (sys.hexversion < 0x3090000) +OLD310 = (sys.hexversion < 0x30a0000) +OLD312a7 = (sys.hexversion < 0x30c00a7) +#XXX: get types from .objtypes ? +import builtins as __builtin__ +from pickle import _Pickler as StockPickler, Unpickler as StockUnpickler +from pickle import GLOBAL, POP +from _thread import LockType +from _thread import RLock as RLockType +try: + from _thread import _ExceptHookArgs as ExceptHookArgsType +except ImportError: + ExceptHookArgsType = None +try: + from _thread import _ThreadHandle as ThreadHandleType +except ImportError: + ThreadHandleType = None +#from io import IOBase +from types import CodeType, FunctionType, MethodType, GeneratorType, \ + TracebackType, FrameType, ModuleType, BuiltinMethodType +BufferType = memoryview #XXX: unregistered +ClassType = type # no 'old-style' classes +EllipsisType = type(Ellipsis) +#FileType = IOBase +NotImplementedType = type(NotImplemented) +SliceType = slice +TypeType = type # 'new-style' classes #XXX: unregistered +XRangeType = range +from types import MappingProxyType as DictProxyType, new_class +from pickle import DEFAULT_PROTOCOL, HIGHEST_PROTOCOL, PickleError, PicklingError, UnpicklingError +import __main__ as _main_module +import marshal +import gc +# import zlib +import abc +import dataclasses +from weakref import ReferenceType, ProxyType, CallableProxyType +from collections import OrderedDict +from enum import Enum, EnumMeta +from functools import partial +from operator import itemgetter, attrgetter +GENERATOR_FAIL = False +import importlib.machinery +EXTENSION_SUFFIXES = tuple(importlib.machinery.EXTENSION_SUFFIXES) +try: + import ctypes + HAS_CTYPES = True + # if using `pypy`, pythonapi is not found + IS_PYPY = not hasattr(ctypes, 'pythonapi') +except ImportError: + HAS_CTYPES = False + IS_PYPY = False +NumpyUfuncType = None +NumpyDType = None +NumpyArrayType = None +try: + if not importlib.machinery.PathFinder().find_spec('numpy'): + raise ImportError("No module named 'numpy'") + NumpyUfuncType = True + NumpyDType = True + NumpyArrayType = True +except ImportError: + pass +def __hook__(): + global NumpyArrayType, NumpyDType, NumpyUfuncType + from numpy import ufunc as NumpyUfuncType + from numpy import ndarray as NumpyArrayType + from numpy import dtype as NumpyDType + return True +if NumpyArrayType: # then has numpy + def ndarraysubclassinstance(obj_type): + if all((c.__module__, c.__name__) != ('numpy', 'ndarray') for c in obj_type.__mro__): + return False + # anything below here is a numpy array (or subclass) instance + __hook__() # import numpy (so the following works!!!) + # verify that __reduce__ has not been overridden + if obj_type.__reduce_ex__ is not NumpyArrayType.__reduce_ex__ \ + or obj_type.__reduce__ is not NumpyArrayType.__reduce__: + return False + return True + def numpyufunc(obj_type): + return any((c.__module__, c.__name__) == ('numpy', 'ufunc') for c in obj_type.__mro__) + def numpydtype(obj_type): + if all((c.__module__, c.__name__) != ('numpy', 'dtype') for c in obj_type.__mro__): + return False + # anything below here is a numpy dtype + __hook__() # import numpy (so the following works!!!) + return obj_type is type(NumpyDType) # handles subclasses +else: + def ndarraysubclassinstance(obj): return False + def numpyufunc(obj): return False + def numpydtype(obj): return False + +from types import GetSetDescriptorType, ClassMethodDescriptorType, \ + WrapperDescriptorType, MethodDescriptorType, MemberDescriptorType, \ + MethodWrapperType #XXX: unused + +# make sure to add these 'hand-built' types to _typemap +CellType = type((lambda x: lambda y: x)(0).__closure__[0]) +PartialType = type(partial(int, base=2)) +SuperType = type(super(Exception, TypeError())) +ItemGetterType = type(itemgetter(0)) +AttrGetterType = type(attrgetter('__repr__')) + +try: + from functools import _lru_cache_wrapper as LRUCacheType +except ImportError: + LRUCacheType = None + +if not isinstance(LRUCacheType, type): + LRUCacheType = None + +def get_file_type(*args, **kwargs): + open = kwargs.pop("open", __builtin__.open) + f = open(os.devnull, *args, **kwargs) + t = type(f) + f.close() + return t + +IS_PYODIDE = sys.platform == 'emscripten' + +FileType = get_file_type('rb', buffering=0) +TextWrapperType = get_file_type('r', buffering=-1) +BufferedRandomType = None if IS_PYODIDE else get_file_type('r+b', buffering=-1) +BufferedReaderType = get_file_type('rb', buffering=-1) +BufferedWriterType = get_file_type('wb', buffering=-1) +try: + from _pyio import open as _open + PyTextWrapperType = get_file_type('r', buffering=-1, open=_open) + PyBufferedRandomType = None if IS_PYODIDE else get_file_type('r+b', buffering=-1, open=_open) + PyBufferedReaderType = get_file_type('rb', buffering=-1, open=_open) + PyBufferedWriterType = get_file_type('wb', buffering=-1, open=_open) +except ImportError: + PyTextWrapperType = PyBufferedRandomType = PyBufferedReaderType = PyBufferedWriterType = None +from io import BytesIO as StringIO +InputType = OutputType = None +from socket import socket as SocketType +#FIXME: additionally calls ForkingPickler.register several times +from multiprocessing.reduction import _reduce_socket as reduce_socket +try: #pragma: no cover + IS_IPYTHON = __IPYTHON__ # is True + ExitType = None # IPython.core.autocall.ExitAutocall + IPYTHON_SINGLETONS = ('exit', 'quit', 'get_ipython') +except NameError: + IS_IPYTHON = False + try: ExitType = type(exit) # apparently 'exit' can be removed + except NameError: ExitType = None + IPYTHON_SINGLETONS = () + +import inspect +import typing + + +### Shims for different versions of Python and dill +class Sentinel(object): + """ + Create a unique sentinel object that is pickled as a constant. + """ + def __init__(self, name, module_name=None): + self.name = name + if module_name is None: + # Use the calling frame's module + self.__module__ = inspect.currentframe().f_back.f_globals['__name__'] + else: + self.__module__ = module_name # pragma: no cover + def __repr__(self): + return self.__module__ + '.' + self.name # pragma: no cover + def __copy__(self): + return self # pragma: no cover + def __deepcopy__(self, memo): + return self # pragma: no cover + def __reduce__(self): + return self.name + def __reduce_ex__(self, protocol): + return self.name + +from . import _shims +from ._shims import Reduce, Getattr + +### File modes +#: Pickles the file handle, preserving mode. The position of the unpickled +#: object is as for a new file handle. +HANDLE_FMODE = 0 +#: Pickles the file contents, creating a new file if on load the file does +#: not exist. The position = min(pickled position, EOF) and mode is chosen +#: as such that "best" preserves behavior of the original file. +CONTENTS_FMODE = 1 +#: Pickles the entire file (handle and contents), preserving mode and position. +FILE_FMODE = 2 + +### Shorthands (modified from python2.5/lib/pickle.py) +def copy(obj, *args, **kwds): + """ + Use pickling to 'copy' an object (i.e. `loads(dumps(obj))`). + + See :func:`dumps` and :func:`loads` for keyword arguments. + """ + ignore = kwds.pop('ignore', Unpickler.settings['ignore']) + return loads(dumps(obj, *args, **kwds), ignore=ignore) + +def dump(obj, file, protocol=None, byref=None, fmode=None, recurse=None, **kwds):#, strictio=None): + """ + Pickle an object to a file. + + See :func:`dumps` for keyword arguments. + """ + from .settings import settings + protocol = settings['protocol'] if protocol is None else int(protocol) + _kwds = kwds.copy() + _kwds.update(dict(byref=byref, fmode=fmode, recurse=recurse)) + Pickler(file, protocol, **_kwds).dump(obj) + return + +def dumps(obj, protocol=None, byref=None, fmode=None, recurse=None, **kwds):#, strictio=None): + """ + Pickle an object to a string. + + *protocol* is the pickler protocol, as defined for Python *pickle*. + + If *byref=True*, then dill behaves a lot more like pickle as certain + objects (like modules) are pickled by reference as opposed to attempting + to pickle the object itself. + + If *recurse=True*, then objects referred to in the global dictionary + are recursively traced and pickled, instead of the default behavior + of attempting to store the entire global dictionary. This is needed for + functions defined via *exec()*. + + *fmode* (:const:`HANDLE_FMODE`, :const:`CONTENTS_FMODE`, + or :const:`FILE_FMODE`) indicates how file handles will be pickled. + For example, when pickling a data file handle for transfer to a remote + compute service, *FILE_FMODE* will include the file contents in the + pickle and cursor position so that a remote method can operate + transparently on an object with an open file handle. + + Default values for keyword arguments can be set in :mod:`dill.settings`. + """ + file = StringIO() + dump(obj, file, protocol, byref, fmode, recurse, **kwds)#, strictio) + return file.getvalue() + +def load(file, ignore=None, **kwds): + """ + Unpickle an object from a file. + + See :func:`loads` for keyword arguments. + """ + return Unpickler(file, ignore=ignore, **kwds).load() + +def loads(str, ignore=None, **kwds): + """ + Unpickle an object from a string. + + If *ignore=False* then objects whose class is defined in the module + *__main__* are updated to reference the existing class in *__main__*, + otherwise they are left to refer to the reconstructed type, which may + be different. + + Default values for keyword arguments can be set in :mod:`dill.settings`. + """ + file = StringIO(str) + return load(file, ignore, **kwds) + +# def dumpzs(obj, protocol=None): +# """pickle an object to a compressed string""" +# return zlib.compress(dumps(obj, protocol)) + +# def loadzs(str): +# """unpickle an object from a compressed string""" +# return loads(zlib.decompress(str)) + +### End: Shorthands ### + +class MetaCatchingDict(dict): + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + + def __missing__(self, key): + if issubclass(key, type): + return save_type + else: + raise KeyError() + +class PickleWarning(Warning, PickleError): + pass + +class PicklingWarning(PickleWarning, PicklingError): + pass + +class UnpicklingWarning(PickleWarning, UnpicklingError): + pass + +### Extend the Picklers +class Pickler(StockPickler): + """python's Pickler extended to interpreter sessions""" + dispatch: typing.Dict[type, typing.Callable[[Pickler, typing.Any], None]] \ + = MetaCatchingDict(StockPickler.dispatch.copy()) + """The dispatch table, a dictionary of serializing functions used + by Pickler to save objects of specific types. Use :func:`pickle` + or :func:`register` to associate types to custom functions. + + :meta hide-value: + """ + _session = False + from .settings import settings + + def __init__(self, file, *args, **kwds): + settings = Pickler.settings + _byref = kwds.pop('byref', None) + #_strictio = kwds.pop('strictio', None) + _fmode = kwds.pop('fmode', None) + _recurse = kwds.pop('recurse', None) + StockPickler.__init__(self, file, *args, **kwds) + self._main = _main_module + self._diff_cache = {} + self._byref = settings['byref'] if _byref is None else _byref + self._strictio = False #_strictio + self._fmode = settings['fmode'] if _fmode is None else _fmode + self._recurse = settings['recurse'] if _recurse is None else _recurse + self._postproc = OrderedDict() + self._file = file + + def save(self, obj, save_persistent_id=True): + # numpy hack + obj_type = type(obj) + if NumpyArrayType and not (obj_type is type or obj_type in Pickler.dispatch): + # register if the object is a numpy ufunc + # thanks to Paul Kienzle for pointing out ufuncs didn't pickle + if numpyufunc(obj_type): + @register(obj_type) + def save_numpy_ufunc(pickler, obj): + logger.trace(pickler, "Nu: %s", obj) + name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) + StockPickler.save_global(pickler, obj, name=name) + logger.trace(pickler, "# Nu") + return + # NOTE: the above 'save' performs like: + # import copy_reg + # def udump(f): return f.__name__ + # def uload(name): return getattr(numpy, name) + # copy_reg.pickle(NumpyUfuncType, udump, uload) + # register if the object is a numpy dtype + if numpydtype(obj_type): + @register(obj_type) + def save_numpy_dtype(pickler, obj): + logger.trace(pickler, "Dt: %s", obj) + pickler.save_reduce(_create_dtypemeta, (obj.type,), obj=obj) + logger.trace(pickler, "# Dt") + return + # NOTE: the above 'save' performs like: + # import copy_reg + # def uload(name): return type(NumpyDType(name)) + # def udump(f): return uload, (f.type,) + # copy_reg.pickle(NumpyDTypeType, udump, uload) + # register if the object is a subclassed numpy array instance + if ndarraysubclassinstance(obj_type): + @register(obj_type) + def save_numpy_array(pickler, obj): + logger.trace(pickler, "Nu: (%s, %s)", obj.shape, obj.dtype) + npdict = getattr(obj, '__dict__', None) + f, args, state = obj.__reduce__() + pickler.save_reduce(_create_array, (f,args,state,npdict), obj=obj) + logger.trace(pickler, "# Nu") + return + # end numpy hack + + if GENERATOR_FAIL and obj_type is GeneratorType: + msg = "Can't pickle %s: attribute lookup builtins.generator failed" % GeneratorType + raise PicklingError(msg) + StockPickler.save(self, obj, save_persistent_id) + + save.__doc__ = StockPickler.save.__doc__ + + def dump(self, obj): #NOTE: if settings change, need to update attributes + logger.trace_setup(self) + StockPickler.dump(self, obj) + dump.__doc__ = StockPickler.dump.__doc__ + +class Unpickler(StockUnpickler): + """python's Unpickler extended to interpreter sessions and more types""" + from .settings import settings + _session = False + + def find_class(self, module, name): + if (module, name) == ('__builtin__', '__main__'): + return self._main.__dict__ #XXX: above set w/save_module_dict + elif (module, name) == ('__builtin__', 'NoneType'): + return type(None) #XXX: special case: NoneType missing + if module == 'dill.dill': module = 'dill._dill' + return StockUnpickler.find_class(self, module, name) + + def __init__(self, *args, **kwds): + settings = Pickler.settings + _ignore = kwds.pop('ignore', None) + StockUnpickler.__init__(self, *args, **kwds) + self._main = _main_module + self._ignore = settings['ignore'] if _ignore is None else _ignore + + def load(self): #NOTE: if settings change, need to update attributes + obj = StockUnpickler.load(self) + if type(obj).__module__ == getattr(_main_module, '__name__', '__main__'): + if not self._ignore: + # point obj class to main + try: obj.__class__ = getattr(self._main, type(obj).__name__) + except (AttributeError,TypeError): pass # defined in a file + #_main_module.__dict__.update(obj.__dict__) #XXX: should update globals ? + return obj + load.__doc__ = StockUnpickler.load.__doc__ + pass + +''' +def dispatch_table(): + """get the dispatch table of registered types""" + return Pickler.dispatch +''' + +pickle_dispatch_copy = StockPickler.dispatch.copy() + +def pickle(t, func): + """expose :attr:`~Pickler.dispatch` table for user-created extensions""" + Pickler.dispatch[t] = func + return + +def register(t): + """decorator to register types to Pickler's :attr:`~Pickler.dispatch` table""" + def proxy(func): + Pickler.dispatch[t] = func + return func + return proxy + +def _revert_extension(): + """drop dill-registered types from pickle's dispatch table""" + for type, func in list(StockPickler.dispatch.items()): + if func.__module__ == __name__: + del StockPickler.dispatch[type] + if type in pickle_dispatch_copy: + StockPickler.dispatch[type] = pickle_dispatch_copy[type] + +def use_diff(on=True): + """ + Reduces size of pickles by only including object which have changed. + + Decreases pickle size but increases CPU time needed. + Also helps avoid some unpickleable objects. + MUST be called at start of script, otherwise changes will not be recorded. + """ + global _use_diff, diff + _use_diff = on + if _use_diff and diff is None: + try: + from . import diff as d + except ImportError: + import diff as d + diff = d + +def _create_typemap(): + import types + d = dict(list(__builtin__.__dict__.items()) + \ + list(types.__dict__.items())).items() + for key, value in d: + if getattr(value, '__module__', None) == 'builtins' \ + and type(value) is type: + yield key, value + return +_reverse_typemap = dict(_create_typemap()) +_reverse_typemap.update({ + 'PartialType': PartialType, + 'SuperType': SuperType, + 'ItemGetterType': ItemGetterType, + 'AttrGetterType': AttrGetterType, +}) +if sys.hexversion < 0x30800a2: + _reverse_typemap.update({ + 'CellType': CellType, + }) + +# "Incidental" implementation specific types. Unpickling these types in another +# implementation of Python (PyPy -> CPython) is not guaranteed to work + +# This dictionary should contain all types that appear in Python implementations +# but are not defined in https://docs.python.org/3/library/types.html#standard-interpreter-types +x=OrderedDict() +_incedental_reverse_typemap = { + 'FileType': FileType, + 'BufferedRandomType': BufferedRandomType, + 'BufferedReaderType': BufferedReaderType, + 'BufferedWriterType': BufferedWriterType, + 'TextWrapperType': TextWrapperType, + 'PyBufferedRandomType': PyBufferedRandomType, + 'PyBufferedReaderType': PyBufferedReaderType, + 'PyBufferedWriterType': PyBufferedWriterType, + 'PyTextWrapperType': PyTextWrapperType, +} + +_incedental_reverse_typemap.update({ + "DictKeysType": type({}.keys()), + "DictValuesType": type({}.values()), + "DictItemsType": type({}.items()), + + "OdictKeysType": type(x.keys()), + "OdictValuesType": type(x.values()), + "OdictItemsType": type(x.items()), +}) + +if ExitType: + _incedental_reverse_typemap['ExitType'] = ExitType +if InputType: + _incedental_reverse_typemap['InputType'] = InputType + _incedental_reverse_typemap['OutputType'] = OutputType + +''' +try: + import symtable + _incedental_reverse_typemap["SymtableEntryType"] = type(symtable.symtable("", "string", "exec")._table) +except: #FIXME: fails to pickle + pass + +if sys.hexversion >= 0x30a00a0: + _incedental_reverse_typemap['LineIteratorType'] = type(compile('3', '', 'eval').co_lines()) +''' + +if sys.hexversion >= 0x30b00b0: + from types import GenericAlias + _incedental_reverse_typemap["GenericAliasIteratorType"] = type(iter(GenericAlias(list, (int,)))) + ''' + _incedental_reverse_typemap['PositionsIteratorType'] = type(compile('3', '', 'eval').co_positions()) + ''' + +try: + import winreg + _incedental_reverse_typemap["HKEYType"] = winreg.HKEYType +except ImportError: + pass + +_reverse_typemap.update(_incedental_reverse_typemap) +_incedental_types = set(_incedental_reverse_typemap.values()) + +del x + +_typemap = dict((v, k) for k, v in _reverse_typemap.items()) + +def _unmarshal(string): + return marshal.loads(string) + +def _load_type(name): + return _reverse_typemap[name] + +def _create_type(typeobj, *args): + return typeobj(*args) + +def _create_function(fcode, fglobals, fname=None, fdefaults=None, + fclosure=None, fdict=None, fkwdefaults=None): + # same as FunctionType, but enable passing __dict__ to new function, + # __dict__ is the storehouse for attributes added after function creation + func = FunctionType(fcode, fglobals or dict(), fname, fdefaults, fclosure) + if fdict is not None: + func.__dict__.update(fdict) #XXX: better copy? option to copy? + if fkwdefaults is not None: + func.__kwdefaults__ = fkwdefaults + # 'recurse' only stores referenced modules/objects in fglobals, + # thus we need to make sure that we have __builtins__ as well + if "__builtins__" not in func.__globals__: + func.__globals__["__builtins__"] = globals()["__builtins__"] + # assert id(fglobals) == id(func.__globals__) + return func + +class match: + """ + Make avaialable a limited structural pattern matching-like syntax for Python < 3.10 + + Patterns can be only tuples (without types) currently. + Inspired by the package pattern-matching-PEP634. + + Usage: + >>> with match(args) as m: + >>> if m.case(('x', 'y')): + >>> # use m.x and m.y + >>> elif m.case(('x', 'y', 'z')): + >>> # use m.x, m.y and m.z + + Equivalent native code for Python >= 3.10: + >>> match args: + >>> case (x, y): + >>> # use x and y + >>> case (x, y, z): + >>> # use x, y and z + """ + def __init__(self, value): + self.value = value + self._fields = None + def __enter__(self): + return self + def __exit__(self, *exc_info): + return False + def case(self, args): # *args, **kwargs): + """just handles tuple patterns""" + if len(self.value) != len(args): # + len(kwargs): + return False + #if not all(isinstance(arg, pat) for arg, pat in zip(self.value[len(args):], kwargs.values())): + # return False + self.args = args # (*args, *kwargs) + return True + @property + def fields(self): + # Only bind names to values if necessary. + if self._fields is None: + self._fields = dict(zip(self.args, self.value)) + return self._fields + def __getattr__(self, item): + return self.fields[item] + +ALL_CODE_PARAMS = [ + # Version New attribute CodeType parameters + ((3,11,'a'), 'co_endlinetable', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name qualname firstlineno linetable endlinetable columntable exceptiontable freevars cellvars'), + ((3,11), 'co_exceptiontable', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name qualname firstlineno linetable exceptiontable freevars cellvars'), + ((3,10), 'co_linetable', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name firstlineno linetable freevars cellvars'), + ((3,8), 'co_posonlyargcount', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name firstlineno lnotab freevars cellvars'), + ((3,7), 'co_kwonlyargcount', 'argcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name firstlineno lnotab freevars cellvars'), + ] +for version, new_attr, params in ALL_CODE_PARAMS: + if hasattr(CodeType, new_attr): + CODE_VERSION = version + CODE_PARAMS = params.split() + break +ENCODE_PARAMS = set(CODE_PARAMS).intersection( + ['code', 'lnotab', 'linetable', 'endlinetable', 'columntable', 'exceptiontable']) + +def _create_code(*args): + if not isinstance(args[0], int): # co_lnotab stored from >= 3.10 + LNOTAB, *args = args + else: # from < 3.10 (or pre-LNOTAB storage) + LNOTAB = b'' + + with match(args) as m: + # Python 3.11/3.12a (18 members) + if m.case(( + 'argcount', 'posonlyargcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:6] + 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'qualname', 'firstlineno', # args[6:14] + 'linetable', 'exceptiontable', 'freevars', 'cellvars' # args[14:] + )): + if CODE_VERSION == (3,11): + return CodeType( + *args[:6], + args[6].encode() if hasattr(args[6], 'encode') else args[6], # code + *args[7:14], + args[14].encode() if hasattr(args[14], 'encode') else args[14], # linetable + args[15].encode() if hasattr(args[15], 'encode') else args[15], # exceptiontable + args[16], + args[17], + ) + fields = m.fields + # Python 3.10 or 3.8/3.9 (16 members) + elif m.case(( + 'argcount', 'posonlyargcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:6] + 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'firstlineno', # args[6:13] + 'LNOTAB_OR_LINETABLE', 'freevars', 'cellvars' # args[13:] + )): + if CODE_VERSION == (3,10) or CODE_VERSION == (3,8): + return CodeType( + *args[:6], + args[6].encode() if hasattr(args[6], 'encode') else args[6], # code + *args[7:13], + args[13].encode() if hasattr(args[13], 'encode') else args[13], # lnotab/linetable + args[14], + args[15], + ) + fields = m.fields + if CODE_VERSION >= (3,10): + fields['linetable'] = m.LNOTAB_OR_LINETABLE + else: + fields['lnotab'] = LNOTAB if LNOTAB else m.LNOTAB_OR_LINETABLE + # Python 3.7 (15 args) + elif m.case(( + 'argcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:5] + 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'firstlineno', # args[5:12] + 'lnotab', 'freevars', 'cellvars' # args[12:] + )): + if CODE_VERSION == (3,7): + return CodeType( + *args[:5], + args[5].encode() if hasattr(args[5], 'encode') else args[5], # code + *args[6:12], + args[12].encode() if hasattr(args[12], 'encode') else args[12], # lnotab + args[13], + args[14], + ) + fields = m.fields + # Python 3.11a (20 members) + elif m.case(( + 'argcount', 'posonlyargcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:6] + 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'qualname', 'firstlineno', # args[6:14] + 'linetable', 'endlinetable', 'columntable', 'exceptiontable', 'freevars', 'cellvars' # args[14:] + )): + if CODE_VERSION == (3,11,'a'): + return CodeType( + *args[:6], + args[6].encode() if hasattr(args[6], 'encode') else args[6], # code + *args[7:14], + *(a.encode() if hasattr(a, 'encode') else a for a in args[14:18]), # linetable-exceptiontable + args[18], + args[19], + ) + fields = m.fields + else: + raise UnpicklingError("pattern match for code object failed") + + # The args format doesn't match this version. + fields.setdefault('posonlyargcount', 0) # from python <= 3.7 + fields.setdefault('lnotab', LNOTAB) # from python >= 3.10 + fields.setdefault('linetable', b'') # from python <= 3.9 + fields.setdefault('qualname', fields['name']) # from python <= 3.10 + fields.setdefault('exceptiontable', b'') # from python <= 3.10 + fields.setdefault('endlinetable', None) # from python != 3.11a + fields.setdefault('columntable', None) # from python != 3.11a + + args = (fields[k].encode() if k in ENCODE_PARAMS and hasattr(fields[k], 'encode') else fields[k] + for k in CODE_PARAMS) + return CodeType(*args) + +def _create_ftype(ftypeobj, func, args, kwds): + if kwds is None: + kwds = {} + if args is None: + args = () + return ftypeobj(func, *args, **kwds) + +def _create_typing_tuple(argz, *args): #NOTE: workaround python/cpython#94245 + if not argz: + return typing.Tuple[()].copy_with(()) + if argz == ((),): + return typing.Tuple[()] + return typing.Tuple[argz] + +if ThreadHandleType: + def _create_thread_handle(ident, done, *args): #XXX: ignores 'blocking' + from threading import _make_thread_handle + handle = _make_thread_handle(ident) + if done: + handle._set_done() + return handle + +def _create_lock(locked, *args): #XXX: ignores 'blocking' + from threading import Lock + lock = Lock() + if locked: + if not lock.acquire(False): + raise UnpicklingError("Cannot acquire lock") + return lock + +def _create_rlock(count, owner, *args): #XXX: ignores 'blocking' + lock = RLockType() + if owner is not None: + lock._acquire_restore((count, owner)) + if owner and not lock._is_owned(): + raise UnpicklingError("Cannot acquire lock") + return lock + +# thanks to matsjoyce for adding all the different file modes +def _create_filehandle(name, mode, position, closed, open, strictio, fmode, fdata): # buffering=0 + # only pickles the handle, not the file contents... good? or StringIO(data)? + # (for file contents see: http://effbot.org/librarybook/copy-reg.htm) + # NOTE: handle special cases first (are there more special cases?) + names = {'':sys.__stdin__, '':sys.__stdout__, + '':sys.__stderr__} #XXX: better fileno=(0,1,2) ? + if name in list(names.keys()): + f = names[name] #XXX: safer "f=sys.stdin" + elif name == '': + f = os.tmpfile() + elif name == '': + import tempfile + f = tempfile.TemporaryFile(mode) + else: + try: + exists = os.path.exists(name) + except Exception: + exists = False + if not exists: + if strictio: + raise FileNotFoundError("[Errno 2] No such file or directory: '%s'" % name) + elif "r" in mode and fmode != FILE_FMODE: + name = '' # or os.devnull? + current_size = 0 # or maintain position? + else: + current_size = os.path.getsize(name) + + if position > current_size: + if strictio: + raise ValueError("invalid buffer size") + elif fmode == CONTENTS_FMODE: + position = current_size + # try to open the file by name + # NOTE: has different fileno + try: + #FIXME: missing: *buffering*, encoding, softspace + if fmode == FILE_FMODE: + f = open(name, mode if "w" in mode else "w") + f.write(fdata) + if "w" not in mode: + f.close() + f = open(name, mode) + elif name == '': # file did not exist + import tempfile + f = tempfile.TemporaryFile(mode) + # treat x mode as w mode + elif fmode == CONTENTS_FMODE \ + and ("w" in mode or "x" in mode): + # stop truncation when opening + flags = os.O_CREAT + if "+" in mode: + flags |= os.O_RDWR + else: + flags |= os.O_WRONLY + f = os.fdopen(os.open(name, flags), mode) + # set name to the correct value + r = getattr(f, "buffer", f) + r = getattr(r, "raw", r) + r.name = name + assert f.name == name + else: + f = open(name, mode) + except (IOError, FileNotFoundError): + err = sys.exc_info()[1] + raise UnpicklingError(err) + if closed: + f.close() + elif position >= 0 and fmode != HANDLE_FMODE: + f.seek(position) + return f + +def _create_stringi(value, position, closed): + f = StringIO(value) + if closed: f.close() + else: f.seek(position) + return f + +def _create_stringo(value, position, closed): + f = StringIO() + if closed: f.close() + else: + f.write(value) + f.seek(position) + return f + +class _itemgetter_helper(object): + def __init__(self): + self.items = [] + def __getitem__(self, item): + self.items.append(item) + return + +class _attrgetter_helper(object): + def __init__(self, attrs, index=None): + self.attrs = attrs + self.index = index + def __getattribute__(self, attr): + attrs = object.__getattribute__(self, "attrs") + index = object.__getattribute__(self, "index") + if index is None: + index = len(attrs) + attrs.append(attr) + else: + attrs[index] = ".".join([attrs[index], attr]) + return type(self)(attrs, index) + +class _dictproxy_helper(dict): + def __ror__(self, a): + return a + +_dictproxy_helper_instance = _dictproxy_helper() + +__d = {} +try: + # In CPython 3.9 and later, this trick can be used to exploit the + # implementation of the __or__ function of MappingProxyType to get the true + # mapping referenced by the proxy. It may work for other implementations, + # but is not guaranteed. + MAPPING_PROXY_TRICK = __d is (DictProxyType(__d) | _dictproxy_helper_instance) +except Exception: + MAPPING_PROXY_TRICK = False +del __d + +# _CELL_REF and _CELL_EMPTY are used to stay compatible with versions of dill +# whose _create_cell functions do not have a default value. +# _CELL_REF can be safely removed entirely (replaced by empty tuples for calls +# to _create_cell) once breaking changes are allowed. +_CELL_REF = None +_CELL_EMPTY = Sentinel('_CELL_EMPTY') + +def _create_cell(contents=None): + if contents is not _CELL_EMPTY: + value = contents + return (lambda: value).__closure__[0] + +def _create_weakref(obj, *args): + from weakref import ref + if obj is None: # it's dead + from collections import UserDict + return ref(UserDict(), *args) + return ref(obj, *args) + +def _create_weakproxy(obj, callable=False, *args): + from weakref import proxy + if obj is None: # it's dead + if callable: return proxy(lambda x:x, *args) + from collections import UserDict + return proxy(UserDict(), *args) + return proxy(obj, *args) + +def _eval_repr(repr_str): + return eval(repr_str) + +def _create_array(f, args, state, npdict=None): + #array = numpy.core.multiarray._reconstruct(*args) + array = f(*args) + array.__setstate__(state) + if npdict is not None: # we also have saved state in __dict__ + array.__dict__.update(npdict) + return array + +def _create_dtypemeta(scalar_type): + if NumpyDType is True: __hook__() # a bit hacky I think + if scalar_type is None: + return NumpyDType + return type(NumpyDType(scalar_type)) + +def _create_namedtuple(name, fieldnames, modulename, defaults=None): + class_ = _import_module(modulename + '.' + name, safe=True) + if class_ is not None: + return class_ + import collections + t = collections.namedtuple(name, fieldnames, defaults=defaults, module=modulename) + return t + +def _create_capsule(pointer, name, context, destructor): + attr_found = False + try: + # based on https://github.com/python/cpython/blob/f4095e53ab708d95e019c909d5928502775ba68f/Objects/capsule.c#L209-L231 + uname = name.decode('utf8') + for i in range(1, uname.count('.')+1): + names = uname.rsplit('.', i) + try: + module = __import__(names[0]) + except ImportError: + pass + obj = module + for attr in names[1:]: + obj = getattr(obj, attr) + capsule = obj + attr_found = True + break + except Exception: + pass + + if attr_found: + if _PyCapsule_IsValid(capsule, name): + return capsule + raise UnpicklingError("%s object exists at %s but a PyCapsule object was expected." % (type(capsule), name)) + else: + #warnings.warn('Creating a new PyCapsule %s for a C data structure that may not be present in memory. Segmentation faults or other memory errors are possible.' % (name,), UnpicklingWarning) + capsule = _PyCapsule_New(pointer, name, destructor) + _PyCapsule_SetContext(capsule, context) + return capsule + +def _getattr(objclass, name, repr_str): + # hack to grab the reference directly + try: #XXX: works only for __builtin__ ? + attr = repr_str.split("'")[3] + return eval(attr+'.__dict__["'+name+'"]') + except Exception: + try: + attr = objclass.__dict__ + if type(attr) is DictProxyType: + attr = attr[name] + else: + attr = getattr(objclass,name) + except (AttributeError, KeyError): + attr = getattr(objclass,name) + return attr + +def _get_attr(self, name): + # stop recursive pickling + return getattr(self, name, None) or getattr(__builtin__, name) + +def _import_module(import_name, safe=False): + try: + if import_name.startswith('__runtime__.'): + return sys.modules[import_name] + elif '.' in import_name: + items = import_name.split('.') + module = '.'.join(items[:-1]) + obj = items[-1] + submodule = getattr(__import__(module, None, None, [obj]), obj) + if isinstance(submodule, (ModuleType, type)): + return submodule + return __import__(import_name, None, None, [obj]) + else: + return __import__(import_name) + except (ImportError, AttributeError, KeyError): + if safe: + return None + raise + +# https://github.com/python/cpython/blob/a8912a0f8d9eba6d502c37d522221f9933e976db/Lib/pickle.py#L322-L333 +def _getattribute(obj, name): + for subpath in name.split('.'): + if subpath == '': + raise AttributeError("Can't get local attribute {!r} on {!r}" + .format(name, obj)) + try: + parent = obj + obj = getattr(obj, subpath) + except AttributeError: + raise AttributeError("Can't get attribute {!r} on {!r}" + .format(name, obj)) + return obj, parent + +def _locate_function(obj, pickler=None): + module_name = getattr(obj, '__module__', None) + if module_name in ['__main__', None] or \ + pickler and is_dill(pickler, child=False) and pickler._session and module_name == pickler._main.__name__: + return False + if hasattr(obj, '__qualname__'): + module = _import_module(module_name, safe=True) + try: + found, _ = _getattribute(module, obj.__qualname__) + return found is obj + except AttributeError: + return False + else: + found = _import_module(module_name + '.' + obj.__name__, safe=True) + return found is obj + + +def _setitems(dest, source): + for k, v in source.items(): + dest[k] = v + + +def _save_with_postproc(pickler, reduction, is_pickler_dill=None, obj=Getattr.NO_DEFAULT, postproc_list=None): + if obj is Getattr.NO_DEFAULT: + obj = Reduce(reduction) # pragma: no cover + + if is_pickler_dill is None: + is_pickler_dill = is_dill(pickler, child=True) + if is_pickler_dill: + # assert id(obj) not in pickler._postproc, str(obj) + ' already pushed on stack!' + # if not hasattr(pickler, 'x'): pickler.x = 0 + # print(pickler.x*' ', 'push', obj, id(obj), pickler._recurse) + # pickler.x += 1 + if postproc_list is None: + postproc_list = [] + + # Recursive object not supported. Default to a global instead. + if id(obj) in pickler._postproc: + name = '%s.%s ' % (obj.__module__, getattr(obj, '__qualname__', obj.__name__)) if hasattr(obj, '__module__') else '' + warnings.warn('Cannot pickle %r: %shas recursive self-references that trigger a RecursionError.' % (obj, name), PicklingWarning) + pickler.save_global(obj) + return + pickler._postproc[id(obj)] = postproc_list + + # TODO: Use state_setter in Python 3.8 to allow for faster cPickle implementations + pickler.save_reduce(*reduction, obj=obj) + + if is_pickler_dill: + # pickler.x -= 1 + # print(pickler.x*' ', 'pop', obj, id(obj)) + postproc = pickler._postproc.pop(id(obj)) + # assert postproc_list == postproc, 'Stack tampered!' + for reduction in reversed(postproc): + if reduction[0] is _setitems: + # use the internal machinery of pickle.py to speedup when + # updating a dictionary in postproc + dest, source = reduction[1] + if source: + pickler.write(pickler.get(pickler.memo[id(dest)][0])) + pickler._batch_setitems(iter(source.items())) + else: + # Updating with an empty dictionary. Same as doing nothing. + continue + else: + pickler.save_reduce(*reduction) + # pop None created by calling preprocessing step off stack + pickler.write(POP) + +#@register(CodeType) +#def save_code(pickler, obj): +# logger.trace(pickler, "Co: %s", obj) +# pickler.save_reduce(_unmarshal, (marshal.dumps(obj),), obj=obj) +# logger.trace(pickler, "# Co") +# return + +# The following function is based on 'save_codeobject' from 'cloudpickle' +# Copyright (c) 2012, Regents of the University of California. +# Copyright (c) 2009 `PiCloud, Inc. `_. +# License: https://github.com/cloudpipe/cloudpickle/blob/master/LICENSE +@register(CodeType) +def save_code(pickler, obj): + logger.trace(pickler, "Co: %s", obj) + if hasattr(obj, "co_endlinetable"): # python 3.11a (20 args) + args = ( + obj.co_lnotab, # for < python 3.10 [not counted in args] + obj.co_argcount, obj.co_posonlyargcount, + obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, + obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, + obj.co_varnames, obj.co_filename, obj.co_name, obj.co_qualname, + obj.co_firstlineno, obj.co_linetable, obj.co_endlinetable, + obj.co_columntable, obj.co_exceptiontable, obj.co_freevars, + obj.co_cellvars + ) + elif hasattr(obj, "co_exceptiontable"): # python 3.11 (18 args) + with warnings.catch_warnings(): + if not OLD312a7: # issue 597 + warnings.filterwarnings('ignore', category=DeprecationWarning) + args = ( + obj.co_lnotab, # for < python 3.10 [not counted in args] + obj.co_argcount, obj.co_posonlyargcount, + obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, + obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, + obj.co_varnames, obj.co_filename, obj.co_name, obj.co_qualname, + obj.co_firstlineno, obj.co_linetable, obj.co_exceptiontable, + obj.co_freevars, obj.co_cellvars + ) + elif hasattr(obj, "co_linetable"): # python 3.10 (16 args) + args = ( + obj.co_lnotab, # for < python 3.10 [not counted in args] + obj.co_argcount, obj.co_posonlyargcount, + obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, + obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, + obj.co_varnames, obj.co_filename, obj.co_name, + obj.co_firstlineno, obj.co_linetable, obj.co_freevars, + obj.co_cellvars + ) + elif hasattr(obj, "co_posonlyargcount"): # python 3.8 (16 args) + args = ( + obj.co_argcount, obj.co_posonlyargcount, + obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, + obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, + obj.co_varnames, obj.co_filename, obj.co_name, + obj.co_firstlineno, obj.co_lnotab, obj.co_freevars, + obj.co_cellvars + ) + else: # python 3.7 (15 args) + args = ( + obj.co_argcount, obj.co_kwonlyargcount, obj.co_nlocals, + obj.co_stacksize, obj.co_flags, obj.co_code, obj.co_consts, + obj.co_names, obj.co_varnames, obj.co_filename, + obj.co_name, obj.co_firstlineno, obj.co_lnotab, + obj.co_freevars, obj.co_cellvars + ) + + pickler.save_reduce(_create_code, args, obj=obj) + logger.trace(pickler, "# Co") + return + +def _repr_dict(obj): + """Make a short string representation of a dictionary.""" + return "<%s object at %#012x>" % (type(obj).__name__, id(obj)) + +@register(dict) +def save_module_dict(pickler, obj): + if is_dill(pickler, child=False) and obj == pickler._main.__dict__ and \ + not (pickler._session and pickler._first_pass): + logger.trace(pickler, "D1: %s", _repr_dict(obj)) # obj + pickler.write(bytes('c__builtin__\n__main__\n', 'UTF-8')) + logger.trace(pickler, "# D1") + elif (not is_dill(pickler, child=False)) and (obj == _main_module.__dict__): + logger.trace(pickler, "D3: %s", _repr_dict(obj)) # obj + pickler.write(bytes('c__main__\n__dict__\n', 'UTF-8')) #XXX: works in general? + logger.trace(pickler, "# D3") + elif '__name__' in obj and obj != _main_module.__dict__ \ + and type(obj['__name__']) is str \ + and obj is getattr(_import_module(obj['__name__'],True), '__dict__', None): + logger.trace(pickler, "D4: %s", _repr_dict(obj)) # obj + pickler.write(bytes('c%s\n__dict__\n' % obj['__name__'], 'UTF-8')) + logger.trace(pickler, "# D4") + else: + logger.trace(pickler, "D2: %s", _repr_dict(obj)) # obj + if is_dill(pickler, child=False) and pickler._session: + # we only care about session the first pass thru + pickler._first_pass = False + StockPickler.save_dict(pickler, obj) + logger.trace(pickler, "# D2") + return + + +if not OLD310 and MAPPING_PROXY_TRICK: + def save_dict_view(dicttype): + def save_dict_view_for_function(func): + def _save_dict_view(pickler, obj): + logger.trace(pickler, "Dkvi: <%s>", obj) + mapping = obj.mapping | _dictproxy_helper_instance + pickler.save_reduce(func, (mapping,), obj=obj) + logger.trace(pickler, "# Dkvi") + return _save_dict_view + return [ + (funcname, save_dict_view_for_function(getattr(dicttype, funcname))) + for funcname in ('keys', 'values', 'items') + ] +else: + # The following functions are based on 'cloudpickle' + # https://github.com/cloudpipe/cloudpickle/blob/5d89947288a18029672596a4d719093cc6d5a412/cloudpickle/cloudpickle.py#L922-L940 + # Copyright (c) 2012, Regents of the University of California. + # Copyright (c) 2009 `PiCloud, Inc. `_. + # License: https://github.com/cloudpipe/cloudpickle/blob/master/LICENSE + def save_dict_view(dicttype): + def save_dict_keys(pickler, obj): + logger.trace(pickler, "Dk: <%s>", obj) + dict_constructor = _shims.Reduce(dicttype.fromkeys, (list(obj),)) + pickler.save_reduce(dicttype.keys, (dict_constructor,), obj=obj) + logger.trace(pickler, "# Dk") + + def save_dict_values(pickler, obj): + logger.trace(pickler, "Dv: <%s>", obj) + dict_constructor = _shims.Reduce(dicttype, (enumerate(obj),)) + pickler.save_reduce(dicttype.values, (dict_constructor,), obj=obj) + logger.trace(pickler, "# Dv") + + def save_dict_items(pickler, obj): + logger.trace(pickler, "Di: <%s>", obj) + pickler.save_reduce(dicttype.items, (dicttype(obj),), obj=obj) + logger.trace(pickler, "# Di") + + return ( + ('keys', save_dict_keys), + ('values', save_dict_values), + ('items', save_dict_items) + ) + +for __dicttype in ( + dict, + OrderedDict +): + __obj = __dicttype() + for __funcname, __savefunc in save_dict_view(__dicttype): + __tview = type(getattr(__obj, __funcname)()) + if __tview not in Pickler.dispatch: + Pickler.dispatch[__tview] = __savefunc +del __dicttype, __obj, __funcname, __tview, __savefunc + + +@register(ClassType) +def save_classobj(pickler, obj): #FIXME: enable pickler._byref + if not _locate_function(obj, pickler): + logger.trace(pickler, "C1: %s", obj) + pickler.save_reduce(ClassType, (obj.__name__, obj.__bases__, + obj.__dict__), obj=obj) + #XXX: or obj.__dict__.copy()), obj=obj) ? + logger.trace(pickler, "# C1") + else: + logger.trace(pickler, "C2: %s", obj) + name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) + StockPickler.save_global(pickler, obj, name=name) + logger.trace(pickler, "# C2") + return + +@register(typing._GenericAlias) +def save_generic_alias(pickler, obj): + args = obj.__args__ + if type(obj.__reduce__()) is str: + logger.trace(pickler, "Ga0: %s", obj) + StockPickler.save_global(pickler, obj, name=obj.__reduce__()) + logger.trace(pickler, "# Ga0") + elif obj.__origin__ is tuple and (not args or args == ((),)): + logger.trace(pickler, "Ga1: %s", obj) + pickler.save_reduce(_create_typing_tuple, (args,), obj=obj) + logger.trace(pickler, "# Ga1") + else: + logger.trace(pickler, "Ga2: %s", obj) + StockPickler.save_reduce(pickler, *obj.__reduce__(), obj=obj) + logger.trace(pickler, "# Ga2") + return + +if ThreadHandleType: + @register(ThreadHandleType) + def save_thread_handle(pickler, obj): + logger.trace(pickler, "Th: %s", obj) + pickler.save_reduce(_create_thread_handle, (obj.ident, obj.is_done()), obj=obj) + logger.trace(pickler, "# Th") + return + +@register(LockType) #XXX: copied Thread will have new Event (due to new Lock) +def save_lock(pickler, obj): + logger.trace(pickler, "Lo: %s", obj) + pickler.save_reduce(_create_lock, (obj.locked(),), obj=obj) + logger.trace(pickler, "# Lo") + return + +@register(RLockType) +def save_rlock(pickler, obj): + logger.trace(pickler, "RL: %s", obj) + r = obj.__repr__() # don't use _release_save as it unlocks the lock + count = int(r.split('count=')[1].split()[0].rstrip('>')) + owner = int(r.split('owner=')[1].split()[0]) + pickler.save_reduce(_create_rlock, (count,owner,), obj=obj) + logger.trace(pickler, "# RL") + return + +#@register(SocketType) #FIXME: causes multiprocess test_pickling FAIL +def save_socket(pickler, obj): + logger.trace(pickler, "So: %s", obj) + pickler.save_reduce(*reduce_socket(obj)) + logger.trace(pickler, "# So") + return + +def _save_file(pickler, obj, open_): + if obj.closed: + position = 0 + else: + obj.flush() + if obj in (sys.__stdout__, sys.__stderr__, sys.__stdin__): + position = -1 + else: + position = obj.tell() + if is_dill(pickler, child=True) and pickler._fmode == FILE_FMODE: + f = open_(obj.name, "r") + fdata = f.read() + f.close() + else: + fdata = "" + if is_dill(pickler, child=True): + strictio = pickler._strictio + fmode = pickler._fmode + else: + strictio = False + fmode = 0 # HANDLE_FMODE + pickler.save_reduce(_create_filehandle, (obj.name, obj.mode, position, + obj.closed, open_, strictio, + fmode, fdata), obj=obj) + return + + +@register(FileType) #XXX: in 3.x has buffer=0, needs different _create? +@register(BufferedReaderType) +@register(BufferedWriterType) +@register(TextWrapperType) +def save_file(pickler, obj): + logger.trace(pickler, "Fi: %s", obj) + f = _save_file(pickler, obj, open) + logger.trace(pickler, "# Fi") + return f + +if BufferedRandomType: + @register(BufferedRandomType) + def save_file(pickler, obj): + logger.trace(pickler, "Fi: %s", obj) + f = _save_file(pickler, obj, open) + logger.trace(pickler, "# Fi") + return f + +if PyTextWrapperType: + @register(PyBufferedReaderType) + @register(PyBufferedWriterType) + @register(PyTextWrapperType) + def save_file(pickler, obj): + logger.trace(pickler, "Fi: %s", obj) + f = _save_file(pickler, obj, _open) + logger.trace(pickler, "# Fi") + return f + + if PyBufferedRandomType: + @register(PyBufferedRandomType) + def save_file(pickler, obj): + logger.trace(pickler, "Fi: %s", obj) + f = _save_file(pickler, obj, _open) + logger.trace(pickler, "# Fi") + return f + + +# The following two functions are based on 'saveCStringIoInput' +# and 'saveCStringIoOutput' from spickle +# Copyright (c) 2011 by science+computing ag +# License: http://www.apache.org/licenses/LICENSE-2.0 +if InputType: + @register(InputType) + def save_stringi(pickler, obj): + logger.trace(pickler, "Io: %s", obj) + if obj.closed: + value = ''; position = 0 + else: + value = obj.getvalue(); position = obj.tell() + pickler.save_reduce(_create_stringi, (value, position, \ + obj.closed), obj=obj) + logger.trace(pickler, "# Io") + return + + @register(OutputType) + def save_stringo(pickler, obj): + logger.trace(pickler, "Io: %s", obj) + if obj.closed: + value = ''; position = 0 + else: + value = obj.getvalue(); position = obj.tell() + pickler.save_reduce(_create_stringo, (value, position, \ + obj.closed), obj=obj) + logger.trace(pickler, "# Io") + return + +if LRUCacheType is not None: + from functools import lru_cache + @register(LRUCacheType) + def save_lru_cache(pickler, obj): + logger.trace(pickler, "LRU: %s", obj) + if OLD39: + kwargs = obj.cache_info() + args = (kwargs.maxsize,) + else: + kwargs = obj.cache_parameters() + args = (kwargs['maxsize'], kwargs['typed']) + if args != lru_cache.__defaults__: + wrapper = Reduce(lru_cache, args, is_callable=True) + else: + wrapper = lru_cache + pickler.save_reduce(wrapper, (obj.__wrapped__,), obj=obj) + logger.trace(pickler, "# LRU") + return + +@register(SuperType) +def save_super(pickler, obj): + logger.trace(pickler, "Su: %s", obj) + pickler.save_reduce(super, (obj.__thisclass__, obj.__self__), obj=obj) + logger.trace(pickler, "# Su") + return + +if IS_PYPY: + @register(MethodType) + def save_instancemethod0(pickler, obj): + code = getattr(obj.__func__, '__code__', None) + if code is not None and type(code) is not CodeType \ + and getattr(obj.__self__, obj.__name__) == obj: + # Some PyPy builtin functions have no module name + logger.trace(pickler, "Me2: %s", obj) + # TODO: verify that this works for all PyPy builtin methods + pickler.save_reduce(getattr, (obj.__self__, obj.__name__), obj=obj) + logger.trace(pickler, "# Me2") + return + + logger.trace(pickler, "Me1: %s", obj) + pickler.save_reduce(MethodType, (obj.__func__, obj.__self__), obj=obj) + logger.trace(pickler, "# Me1") + return +else: + @register(MethodType) + def save_instancemethod0(pickler, obj): + logger.trace(pickler, "Me1: %s", obj) + pickler.save_reduce(MethodType, (obj.__func__, obj.__self__), obj=obj) + logger.trace(pickler, "# Me1") + return + +if not IS_PYPY: + @register(MemberDescriptorType) + @register(GetSetDescriptorType) + @register(MethodDescriptorType) + @register(WrapperDescriptorType) + @register(ClassMethodDescriptorType) + def save_wrapper_descriptor(pickler, obj): + logger.trace(pickler, "Wr: %s", obj) + pickler.save_reduce(_getattr, (obj.__objclass__, obj.__name__, + obj.__repr__()), obj=obj) + logger.trace(pickler, "# Wr") + return +else: + @register(MemberDescriptorType) + @register(GetSetDescriptorType) + def save_wrapper_descriptor(pickler, obj): + logger.trace(pickler, "Wr: %s", obj) + pickler.save_reduce(_getattr, (obj.__objclass__, obj.__name__, + obj.__repr__()), obj=obj) + logger.trace(pickler, "# Wr") + return + +@register(CellType) +def save_cell(pickler, obj): + try: + f = obj.cell_contents + except ValueError: # cell is empty + logger.trace(pickler, "Ce3: %s", obj) + # _shims._CELL_EMPTY is defined in _shims.py to support PyPy 2.7. + # It unpickles to a sentinel object _dill._CELL_EMPTY, also created in + # _shims.py. This object is not present in Python 3 because the cell's + # contents can be deleted in newer versions of Python. The reduce object + # will instead unpickle to None if unpickled in Python 3. + + # When breaking changes are made to dill, (_shims._CELL_EMPTY,) can + # be replaced by () OR the delattr function can be removed repending on + # whichever is more convienient. + pickler.save_reduce(_create_cell, (_shims._CELL_EMPTY,), obj=obj) + # Call the function _delattr on the cell's cell_contents attribute + # The result of this function call will be None + pickler.save_reduce(_shims._delattr, (obj, 'cell_contents')) + # pop None created by calling _delattr off stack + pickler.write(POP) + logger.trace(pickler, "# Ce3") + return + if is_dill(pickler, child=True): + if id(f) in pickler._postproc: + # Already seen. Add to its postprocessing. + postproc = pickler._postproc[id(f)] + else: + # Haven't seen it. Add to the highest possible object and set its + # value as late as possible to prevent cycle. + postproc = next(iter(pickler._postproc.values()), None) + if postproc is not None: + logger.trace(pickler, "Ce2: %s", obj) + # _CELL_REF is defined in _shims.py to support older versions of + # dill. When breaking changes are made to dill, (_CELL_REF,) can + # be replaced by () + pickler.save_reduce(_create_cell, (_CELL_REF,), obj=obj) + postproc.append((_shims._setattr, (obj, 'cell_contents', f))) + logger.trace(pickler, "# Ce2") + return + logger.trace(pickler, "Ce1: %s", obj) + pickler.save_reduce(_create_cell, (f,), obj=obj) + logger.trace(pickler, "# Ce1") + return + +if MAPPING_PROXY_TRICK: + @register(DictProxyType) + def save_dictproxy(pickler, obj): + logger.trace(pickler, "Mp: %s", _repr_dict(obj)) # obj + mapping = obj | _dictproxy_helper_instance + pickler.save_reduce(DictProxyType, (mapping,), obj=obj) + logger.trace(pickler, "# Mp") + return +else: + @register(DictProxyType) + def save_dictproxy(pickler, obj): + logger.trace(pickler, "Mp: %s", _repr_dict(obj)) # obj + pickler.save_reduce(DictProxyType, (obj.copy(),), obj=obj) + logger.trace(pickler, "# Mp") + return + +@register(SliceType) +def save_slice(pickler, obj): + logger.trace(pickler, "Sl: %s", obj) + pickler.save_reduce(slice, (obj.start, obj.stop, obj.step), obj=obj) + logger.trace(pickler, "# Sl") + return + +@register(XRangeType) +@register(EllipsisType) +@register(NotImplementedType) +def save_singleton(pickler, obj): + logger.trace(pickler, "Si: %s", obj) + pickler.save_reduce(_eval_repr, (obj.__repr__(),), obj=obj) + logger.trace(pickler, "# Si") + return + +def _proxy_helper(obj): # a dead proxy returns a reference to None + """get memory address of proxy's reference object""" + _repr = repr(obj) + try: _str = str(obj) + except ReferenceError: # it's a dead proxy + return id(None) + if _str == _repr: return id(obj) # it's a repr + try: # either way, it's a proxy from here + address = int(_str.rstrip('>').split(' at ')[-1], base=16) + except ValueError: # special case: proxy of a 'type' + if not IS_PYPY: + address = int(_repr.rstrip('>').split(' at ')[-1], base=16) + else: + objects = iter(gc.get_objects()) + for _obj in objects: + if repr(_obj) == _str: return id(_obj) + # all bad below... nothing found so throw ReferenceError + msg = "Cannot reference object for proxy at '%s'" % id(obj) + raise ReferenceError(msg) + return address + +def _locate_object(address, module=None): + """get object located at the given memory address (inverse of id(obj))""" + special = [None, True, False] #XXX: more...? + for obj in special: + if address == id(obj): return obj + if module: + objects = iter(module.__dict__.values()) + else: objects = iter(gc.get_objects()) + for obj in objects: + if address == id(obj): return obj + # all bad below... nothing found so throw ReferenceError or TypeError + try: address = hex(address) + except TypeError: + raise TypeError("'%s' is not a valid memory address" % str(address)) + raise ReferenceError("Cannot reference object at '%s'" % address) + +@register(ReferenceType) +def save_weakref(pickler, obj): + refobj = obj() + logger.trace(pickler, "R1: %s", obj) + #refobj = ctypes.pythonapi.PyWeakref_GetObject(obj) # dead returns "None" + pickler.save_reduce(_create_weakref, (refobj,), obj=obj) + logger.trace(pickler, "# R1") + return + +@register(ProxyType) +@register(CallableProxyType) +def save_weakproxy(pickler, obj): + # Must do string substitution here and use %r to avoid ReferenceError. + logger.trace(pickler, "R2: %r" % obj) + refobj = _locate_object(_proxy_helper(obj)) + pickler.save_reduce(_create_weakproxy, (refobj, callable(obj)), obj=obj) + logger.trace(pickler, "# R2") + return + +def _is_builtin_module(module): + if not hasattr(module, "__file__"): return True + if module.__file__ is None: return False + # If a module file name starts with prefix, it should be a builtin + # module, so should always be pickled as a reference. + names = ["base_prefix", "base_exec_prefix", "exec_prefix", "prefix", "real_prefix"] + rp = os.path.realpath + # See https://github.com/uqfoundation/dill/issues/566 + return ( + any( + module.__file__.startswith(getattr(sys, name)) + or rp(module.__file__).startswith(rp(getattr(sys, name))) + for name in names + if hasattr(sys, name) + ) + or module.__file__.endswith(EXTENSION_SUFFIXES) + or 'site-packages' in module.__file__ + ) + +def _is_imported_module(module): + return getattr(module, '__loader__', None) is not None or module in sys.modules.values() + +@register(ModuleType) +def save_module(pickler, obj): + if False: #_use_diff: + if obj.__name__.split('.', 1)[0] != "dill": + try: + changed = diff.whats_changed(obj, seen=pickler._diff_cache)[0] + except RuntimeError: # not memorised module, probably part of dill + pass + else: + logger.trace(pickler, "M2: %s with diff", obj) + logger.info("Diff: %s", changed.keys()) + pickler.save_reduce(_import_module, (obj.__name__,), obj=obj, + state=changed) + logger.trace(pickler, "# M2") + return + + logger.trace(pickler, "M1: %s", obj) + pickler.save_reduce(_import_module, (obj.__name__,), obj=obj) + logger.trace(pickler, "# M1") + else: + builtin_mod = _is_builtin_module(obj) + is_session_main = is_dill(pickler, child=True) and obj is pickler._main + if (obj.__name__ not in ("builtins", "dill", "dill._dill") and not builtin_mod + or is_session_main): + logger.trace(pickler, "M1: %s", obj) + # Hack for handling module-type objects in load_module(). + mod_name = obj.__name__ if _is_imported_module(obj) else '__runtime__.%s' % obj.__name__ + # Second references are saved as __builtin__.__main__ in save_module_dict(). + main_dict = obj.__dict__.copy() + for item in ('__builtins__', '__loader__'): + main_dict.pop(item, None) + for item in IPYTHON_SINGLETONS: #pragma: no cover + if getattr(main_dict.get(item), '__module__', '').startswith('IPython'): + del main_dict[item] + pickler.save_reduce(_import_module, (mod_name,), obj=obj, state=main_dict) + logger.trace(pickler, "# M1") + elif obj.__name__ == "dill._dill": + logger.trace(pickler, "M2: %s", obj) + pickler.save_global(obj, name="_dill") + logger.trace(pickler, "# M2") + else: + logger.trace(pickler, "M2: %s", obj) + pickler.save_reduce(_import_module, (obj.__name__,), obj=obj) + logger.trace(pickler, "# M2") + return + +# The following function is based on '_extract_class_dict' from 'cloudpickle' +# Copyright (c) 2012, Regents of the University of California. +# Copyright (c) 2009 `PiCloud, Inc. `_. +# License: https://github.com/cloudpipe/cloudpickle/blob/master/LICENSE +def _get_typedict_type(cls, clsdict, attrs, postproc_list): + """Retrieve a copy of the dict of a class without the inherited methods""" + if len(cls.__bases__) == 1: + inherited_dict = cls.__bases__[0].__dict__ + else: + inherited_dict = {} + for base in reversed(cls.__bases__): + inherited_dict.update(base.__dict__) + to_remove = [] + for name, value in dict.items(clsdict): + try: + base_value = inherited_dict[name] + if value is base_value and hasattr(value, '__qualname__'): + to_remove.append(name) + except KeyError: + pass + for name in to_remove: + dict.pop(clsdict, name) + + if issubclass(type(cls), type): + clsdict.pop('__dict__', None) + clsdict.pop('__weakref__', None) + # clsdict.pop('__prepare__', None) + return clsdict, attrs + +def _get_typedict_abc(obj, _dict, attrs, postproc_list): + if hasattr(abc, '_get_dump'): + (registry, _, _, _) = abc._get_dump(obj) + register = obj.register + postproc_list.extend((register, (reg(),)) for reg in registry) + elif hasattr(obj, '_abc_registry'): + registry = obj._abc_registry + register = obj.register + postproc_list.extend((register, (reg,)) for reg in registry) + else: + raise PicklingError("Cannot find registry of ABC %s", obj) + + if '_abc_registry' in _dict: + _dict.pop('_abc_registry', None) + _dict.pop('_abc_cache', None) + _dict.pop('_abc_negative_cache', None) + # _dict.pop('_abc_negative_cache_version', None) + else: + _dict.pop('_abc_impl', None) + return _dict, attrs + +@register(TypeType) +def save_type(pickler, obj, postproc_list=None): + if obj in _typemap: + logger.trace(pickler, "T1: %s", obj) + # if obj in _incedental_types: + # warnings.warn('Type %r may only exist on this implementation of Python and cannot be unpickled in other implementations.' % (obj,), PicklingWarning) + pickler.save_reduce(_load_type, (_typemap[obj],), obj=obj) + logger.trace(pickler, "# T1") + elif obj.__bases__ == (tuple,) and all([hasattr(obj, attr) for attr in ('_fields','_asdict','_make','_replace')]): + # special case: namedtuples + logger.trace(pickler, "T6: %s", obj) + + obj_name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) + if obj.__name__ != obj_name: + if postproc_list is None: + postproc_list = [] + postproc_list.append((setattr, (obj, '__qualname__', obj_name))) + + if not obj._field_defaults: + _save_with_postproc(pickler, (_create_namedtuple, (obj.__name__, obj._fields, obj.__module__)), obj=obj, postproc_list=postproc_list) + else: + defaults = [obj._field_defaults[field] for field in obj._fields if field in obj._field_defaults] + _save_with_postproc(pickler, (_create_namedtuple, (obj.__name__, obj._fields, obj.__module__, defaults)), obj=obj, postproc_list=postproc_list) + logger.trace(pickler, "# T6") + return + + # special caes: NoneType, NotImplementedType, EllipsisType, EnumMeta, etc + elif obj is type(None): + logger.trace(pickler, "T7: %s", obj) + #XXX: pickler.save_reduce(type, (None,), obj=obj) + pickler.write(GLOBAL + b'__builtin__\nNoneType\n') + logger.trace(pickler, "# T7") + elif obj is NotImplementedType: + logger.trace(pickler, "T7: %s", obj) + pickler.save_reduce(type, (NotImplemented,), obj=obj) + logger.trace(pickler, "# T7") + elif obj is EllipsisType: + logger.trace(pickler, "T7: %s", obj) + pickler.save_reduce(type, (Ellipsis,), obj=obj) + logger.trace(pickler, "# T7") + elif obj is EnumMeta: + logger.trace(pickler, "T7: %s", obj) + pickler.write(GLOBAL + b'enum\nEnumMeta\n') + logger.trace(pickler, "# T7") + elif obj is ExceptHookArgsType: #NOTE: must be after NoneType for pypy + logger.trace(pickler, "T7: %s", obj) + pickler.write(GLOBAL + b'threading\nExceptHookArgs\n') + logger.trace(pickler, "# T7") + + else: + _byref = getattr(pickler, '_byref', None) + obj_recursive = id(obj) in getattr(pickler, '_postproc', ()) + incorrectly_named = not _locate_function(obj, pickler) + if not _byref and not obj_recursive and incorrectly_named: # not a function, but the name was held over + if postproc_list is None: + postproc_list = [] + + # thanks to Tom Stepleton pointing out pickler._session unneeded + logger.trace(pickler, "T2: %s", obj) + _dict, attrs = _get_typedict_type(obj, obj.__dict__.copy(), None, postproc_list) # copy dict proxy to a dict + + #print (_dict) + #print ("%s\n%s" % (type(obj), obj.__name__)) + #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) + slots = _dict.get('__slots__', ()) + if type(slots) == str: + # __slots__ accepts a single string + slots = (slots,) + + for name in slots: + _dict.pop(name, None) + + if isinstance(obj, abc.ABCMeta): + logger.trace(pickler, "ABC: %s", obj) + _dict, attrs = _get_typedict_abc(obj, _dict, attrs, postproc_list) + logger.trace(pickler, "# ABC") + + qualname = getattr(obj, '__qualname__', None) + if attrs is not None: + for k, v in attrs.items(): + postproc_list.append((setattr, (obj, k, v))) + # TODO: Consider using the state argument to save_reduce? + if qualname is not None: + postproc_list.append((setattr, (obj, '__qualname__', qualname))) + + if not hasattr(obj, '__orig_bases__'): + _save_with_postproc(pickler, (_create_type, ( + type(obj), obj.__name__, obj.__bases__, _dict + )), obj=obj, postproc_list=postproc_list) + else: + # This case will always work, but might be overkill. + _metadict = { + 'metaclass': type(obj) + } + + if _dict: + _dict_update = PartialType(_setitems, source=_dict) + else: + _dict_update = None + + _save_with_postproc(pickler, (new_class, ( + obj.__name__, obj.__orig_bases__, _metadict, _dict_update + )), obj=obj, postproc_list=postproc_list) + logger.trace(pickler, "# T2") + else: + obj_name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) + logger.trace(pickler, "T4: %s", obj) + if incorrectly_named: + warnings.warn( + "Cannot locate reference to %r." % (obj,), + PicklingWarning, + stacklevel=3, + ) + if obj_recursive: + warnings.warn( + "Cannot pickle %r: %s.%s has recursive self-references that " + "trigger a RecursionError." % (obj, obj.__module__, obj_name), + PicklingWarning, + stacklevel=3, + ) + #print (obj.__dict__) + #print ("%s\n%s" % (type(obj), obj.__name__)) + #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) + StockPickler.save_global(pickler, obj, name=obj_name) + logger.trace(pickler, "# T4") + return + +@register(property) +@register(abc.abstractproperty) +def save_property(pickler, obj): + logger.trace(pickler, "Pr: %s", obj) + pickler.save_reduce(type(obj), (obj.fget, obj.fset, obj.fdel, obj.__doc__), + obj=obj) + logger.trace(pickler, "# Pr") + +@register(staticmethod) +@register(classmethod) +@register(abc.abstractstaticmethod) +@register(abc.abstractclassmethod) +def save_classmethod(pickler, obj): + logger.trace(pickler, "Cm: %s", obj) + orig_func = obj.__func__ + + # if type(obj.__dict__) is dict: + # if obj.__dict__: + # state = obj.__dict__ + # else: + # state = None + # else: + # state = (None, {'__dict__', obj.__dict__}) + + pickler.save_reduce(type(obj), (orig_func,), obj=obj) + logger.trace(pickler, "# Cm") + +@register(FunctionType) +def save_function(pickler, obj): + if not _locate_function(obj, pickler): + if type(obj.__code__) is not CodeType: + # Some PyPy builtin functions have no module name, and thus are not + # able to be located + module_name = getattr(obj, '__module__', None) + if module_name is None: + module_name = __builtin__.__name__ + module = _import_module(module_name, safe=True) + _pypy_builtin = False + try: + found, _ = _getattribute(module, obj.__qualname__) + if getattr(found, '__func__', None) is obj: + _pypy_builtin = True + except AttributeError: + pass + + if _pypy_builtin: + logger.trace(pickler, "F3: %s", obj) + pickler.save_reduce(getattr, (found, '__func__'), obj=obj) + logger.trace(pickler, "# F3") + return + + logger.trace(pickler, "F1: %s", obj) + _recurse = getattr(pickler, '_recurse', None) + _postproc = getattr(pickler, '_postproc', None) + _main_modified = getattr(pickler, '_main_modified', None) + _original_main = getattr(pickler, '_original_main', __builtin__)#'None' + postproc_list = [] + if _recurse: + # recurse to get all globals referred to by obj + from .detect import globalvars + globs_copy = globalvars(obj, recurse=True, builtin=True) + + # Add the name of the module to the globs dictionary to prevent + # the duplication of the dictionary. Pickle the unpopulated + # globals dictionary and set the remaining items after the function + # is created to correctly handle recursion. + globs = {'__name__': obj.__module__} + else: + globs_copy = obj.__globals__ + + # If the globals is the __dict__ from the module being saved as a + # session, substitute it by the dictionary being actually saved. + if _main_modified and globs_copy is _original_main.__dict__: + globs_copy = getattr(pickler, '_main', _original_main).__dict__ + globs = globs_copy + # If the globals is a module __dict__, do not save it in the pickle. + elif globs_copy is not None and obj.__module__ is not None and \ + getattr(_import_module(obj.__module__, True), '__dict__', None) is globs_copy: + globs = globs_copy + else: + globs = {'__name__': obj.__module__} + + if globs_copy is not None and globs is not globs_copy: + # In the case that the globals are copied, we need to ensure that + # the globals dictionary is updated when all objects in the + # dictionary are already created. + glob_ids = {id(g) for g in globs_copy.values()} + for stack_element in _postproc: + if stack_element in glob_ids: + _postproc[stack_element].append((_setitems, (globs, globs_copy))) + break + else: + postproc_list.append((_setitems, (globs, globs_copy))) + + closure = obj.__closure__ + state_dict = {} + for fattrname in ('__doc__', '__kwdefaults__', '__annotations__'): + fattr = getattr(obj, fattrname, None) + if fattr is not None: + state_dict[fattrname] = fattr + if obj.__qualname__ != obj.__name__: + state_dict['__qualname__'] = obj.__qualname__ + if '__name__' not in globs or obj.__module__ != globs['__name__']: + state_dict['__module__'] = obj.__module__ + + state = obj.__dict__ + if type(state) is not dict: + state_dict['__dict__'] = state + state = None + if state_dict: + state = state, state_dict + + _save_with_postproc(pickler, (_create_function, ( + obj.__code__, globs, obj.__name__, obj.__defaults__, + closure + ), state), obj=obj, postproc_list=postproc_list) + + # Lift closure cell update to earliest function (#458) + if _postproc: + topmost_postproc = next(iter(_postproc.values()), None) + if closure and topmost_postproc: + for cell in closure: + possible_postproc = (setattr, (cell, 'cell_contents', obj)) + try: + topmost_postproc.remove(possible_postproc) + except ValueError: + continue + + # Change the value of the cell + pickler.save_reduce(*possible_postproc) + # pop None created by calling preprocessing step off stack + pickler.write(POP) + + logger.trace(pickler, "# F1") + else: + logger.trace(pickler, "F2: %s", obj) + name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) + StockPickler.save_global(pickler, obj, name=name) + logger.trace(pickler, "# F2") + return + +if HAS_CTYPES and hasattr(ctypes, 'pythonapi'): + _PyCapsule_New = ctypes.pythonapi.PyCapsule_New + _PyCapsule_New.argtypes = (ctypes.c_void_p, ctypes.c_char_p, ctypes.c_void_p) + _PyCapsule_New.restype = ctypes.py_object + _PyCapsule_GetPointer = ctypes.pythonapi.PyCapsule_GetPointer + _PyCapsule_GetPointer.argtypes = (ctypes.py_object, ctypes.c_char_p) + _PyCapsule_GetPointer.restype = ctypes.c_void_p + _PyCapsule_GetDestructor = ctypes.pythonapi.PyCapsule_GetDestructor + _PyCapsule_GetDestructor.argtypes = (ctypes.py_object,) + _PyCapsule_GetDestructor.restype = ctypes.c_void_p + _PyCapsule_GetContext = ctypes.pythonapi.PyCapsule_GetContext + _PyCapsule_GetContext.argtypes = (ctypes.py_object,) + _PyCapsule_GetContext.restype = ctypes.c_void_p + _PyCapsule_GetName = ctypes.pythonapi.PyCapsule_GetName + _PyCapsule_GetName.argtypes = (ctypes.py_object,) + _PyCapsule_GetName.restype = ctypes.c_char_p + _PyCapsule_IsValid = ctypes.pythonapi.PyCapsule_IsValid + _PyCapsule_IsValid.argtypes = (ctypes.py_object, ctypes.c_char_p) + _PyCapsule_IsValid.restype = ctypes.c_bool + _PyCapsule_SetContext = ctypes.pythonapi.PyCapsule_SetContext + _PyCapsule_SetContext.argtypes = (ctypes.py_object, ctypes.c_void_p) + _PyCapsule_SetDestructor = ctypes.pythonapi.PyCapsule_SetDestructor + _PyCapsule_SetDestructor.argtypes = (ctypes.py_object, ctypes.c_void_p) + _PyCapsule_SetName = ctypes.pythonapi.PyCapsule_SetName + _PyCapsule_SetName.argtypes = (ctypes.py_object, ctypes.c_char_p) + _PyCapsule_SetPointer = ctypes.pythonapi.PyCapsule_SetPointer + _PyCapsule_SetPointer.argtypes = (ctypes.py_object, ctypes.c_void_p) + #from _socket import CAPI as _testcapsule + _testcapsule_name = b'dill._dill._testcapsule' + _testcapsule = _PyCapsule_New( + ctypes.cast(_PyCapsule_New, ctypes.c_void_p), + ctypes.c_char_p(_testcapsule_name), + None + ) + PyCapsuleType = type(_testcapsule) + @register(PyCapsuleType) + def save_capsule(pickler, obj): + logger.trace(pickler, "Cap: %s", obj) + name = _PyCapsule_GetName(obj) + #warnings.warn('Pickling a PyCapsule (%s) does not pickle any C data structures and could cause segmentation faults or other memory errors when unpickling.' % (name,), PicklingWarning) + pointer = _PyCapsule_GetPointer(obj, name) + context = _PyCapsule_GetContext(obj) + destructor = _PyCapsule_GetDestructor(obj) + pickler.save_reduce(_create_capsule, (pointer, name, context, destructor), obj=obj) + logger.trace(pickler, "# Cap") + _incedental_reverse_typemap['PyCapsuleType'] = PyCapsuleType + _reverse_typemap['PyCapsuleType'] = PyCapsuleType + _incedental_types.add(PyCapsuleType) +else: + _testcapsule = None + + +############################# +# A quick fix for issue #500 +# This should be removed when a better solution is found. + +if hasattr(dataclasses, "_HAS_DEFAULT_FACTORY_CLASS"): + @register(dataclasses._HAS_DEFAULT_FACTORY_CLASS) + def save_dataclasses_HAS_DEFAULT_FACTORY_CLASS(pickler, obj): + logger.trace(pickler, "DcHDF: %s", obj) + pickler.write(GLOBAL + b"dataclasses\n_HAS_DEFAULT_FACTORY\n") + logger.trace(pickler, "# DcHDF") + +if hasattr(dataclasses, "MISSING"): + @register(type(dataclasses.MISSING)) + def save_dataclasses_MISSING_TYPE(pickler, obj): + logger.trace(pickler, "DcM: %s", obj) + pickler.write(GLOBAL + b"dataclasses\nMISSING\n") + logger.trace(pickler, "# DcM") + +if hasattr(dataclasses, "KW_ONLY"): + @register(type(dataclasses.KW_ONLY)) + def save_dataclasses_KW_ONLY_TYPE(pickler, obj): + logger.trace(pickler, "DcKWO: %s", obj) + pickler.write(GLOBAL + b"dataclasses\nKW_ONLY\n") + logger.trace(pickler, "# DcKWO") + +if hasattr(dataclasses, "_FIELD_BASE"): + @register(dataclasses._FIELD_BASE) + def save_dataclasses_FIELD_BASE(pickler, obj): + logger.trace(pickler, "DcFB: %s", obj) + pickler.write(GLOBAL + b"dataclasses\n" + obj.name.encode() + b"\n") + logger.trace(pickler, "# DcFB") + +############################# + +# quick sanity checking +def pickles(obj,exact=False,safe=False,**kwds): + """ + Quick check if object pickles with dill. + + If *exact=True* then an equality test is done to check if the reconstructed + object matches the original object. + + If *safe=True* then any exception will raised in copy signal that the + object is not picklable, otherwise only pickling errors will be trapped. + + Additional keyword arguments are as :func:`dumps` and :func:`loads`. + """ + if safe: exceptions = (Exception,) # RuntimeError, ValueError + else: + exceptions = (TypeError, AssertionError, NotImplementedError, PicklingError, UnpicklingError) + try: + pik = copy(obj, **kwds) + #FIXME: should check types match first, then check content if "exact" + try: + #FIXME: should be "(pik == obj).all()" for numpy comparison, though that'll fail if shapes differ + result = bool(pik.all() == obj.all()) + except (AttributeError, TypeError): + warnings.filterwarnings('ignore') #FIXME: be specific + result = pik == obj + if warnings.filters: del warnings.filters[0] + if hasattr(result, 'toarray'): # for unusual types like sparse matrix + result = result.toarray().all() + if result: return True + if not exact: + result = type(pik) == type(obj) + if result: return result + # class instances might have been dumped with byref=False + return repr(type(pik)) == repr(type(obj)) #XXX: InstanceType? + return False + except exceptions: + return False + +def check(obj, *args, **kwds): + """ + Check pickling of an object across another process. + + *python* is the path to the python interpreter (defaults to sys.executable) + + Set *verbose=True* to print the unpickled object in the other process. + + Additional keyword arguments are as :func:`dumps` and :func:`loads`. + """ + # == undocumented == + # python -- the string path or executable name of the selected python + # verbose -- if True, be verbose about printing warning messages + # all other args and kwds are passed to dill.dumps #FIXME: ignore on load + verbose = kwds.pop('verbose', False) + python = kwds.pop('python', None) + if python is None: + import sys + python = sys.executable + # type check + isinstance(python, str) + import subprocess + fail = True + try: + _obj = dumps(obj, *args, **kwds) + fail = False + finally: + if fail and verbose: + print("DUMP FAILED") + #FIXME: fails if python interpreter path contains spaces + # Use the following instead (which also processes the 'ignore' keyword): + # ignore = kwds.pop('ignore', None) + # unpickle = "dill.loads(%s, ignore=%s)"%(repr(_obj), repr(ignore)) + # cmd = [python, "-c", "import dill; print(%s)"%unpickle] + # msg = "SUCCESS" if not subprocess.call(cmd) else "LOAD FAILED" + msg = "%s -c import dill; print(dill.loads(%s))" % (python, repr(_obj)) + msg = "SUCCESS" if not subprocess.call(msg.split(None,2)) else "LOAD FAILED" + if verbose: + print(msg) + return + +# use to protect against missing attributes +def is_dill(pickler, child=None): + "check the dill-ness of your pickler" + if child is False or not hasattr(pickler.__class__, 'mro'): + return 'dill' in pickler.__module__ + return Pickler in pickler.__class__.mro() + +def _extend(): + """extend pickle with all of dill's registered types""" + # need to have pickle not choke on _main_module? use is_dill(pickler) + for t,func in Pickler.dispatch.items(): + try: + StockPickler.dispatch[t] = func + except Exception: #TypeError, PicklingError, UnpicklingError + logger.trace(pickler, "skip: %s", t) + return + +del diff, _use_diff, use_diff + +# EOF diff --git a/myenv/lib/python3.12/site-packages/dill/_objects.py b/myenv/lib/python3.12/site-packages/dill/_objects.py new file mode 100644 index 0000000..7723c13 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/_objects.py @@ -0,0 +1,541 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +all Python Standard Library objects (currently: CH 1-15 @ 2.7) +and some other common objects (i.e. numpy.ndarray) +""" + +__all__ = ['registered','failures','succeeds'] + +# helper imports +import warnings; warnings.filterwarnings("ignore", category=DeprecationWarning) +import sys +import queue as Queue +#import dbm as anydbm #XXX: delete foo +from io import BytesIO as StringIO +import re +import array +import collections +import codecs +import struct +import dataclasses +import datetime +import calendar +import weakref +import pprint +import decimal +import numbers +import functools +import itertools +import operator +import tempfile +import shelve +import zlib +import gzip +import zipfile +import tarfile +import csv +import hashlib +import hmac +import os +import logging +import logging.handlers +import optparse +#import __hello__ +import threading +import socket +import contextlib +try: + import bz2 + import sqlite3 + import dbm.ndbm as dbm + HAS_ALL = True +except ImportError: # Ubuntu + HAS_ALL = False +try: + #import curses + #from curses import textpad, panel + HAS_CURSES = True +except ImportError: # Windows + HAS_CURSES = False +try: + import ctypes + HAS_CTYPES = True + # if using `pypy`, pythonapi is not found + IS_PYPY = not hasattr(ctypes, 'pythonapi') +except ImportError: # MacPorts + HAS_CTYPES = False + IS_PYPY = False + +IS_PYODIDE = sys.platform == 'emscripten' + +# helper objects +class _class: + def _method(self): + pass +# @classmethod +# def _clsmethod(cls): #XXX: test me +# pass +# @staticmethod +# def _static(self): #XXX: test me +# pass +class _class2: + def __call__(self): + pass +_instance2 = _class2() +class _newclass(object): + def _method(self): + pass +# @classmethod +# def _clsmethod(cls): #XXX: test me +# pass +# @staticmethod +# def _static(self): #XXX: test me +# pass +class _newclass2(object): + __slots__ = ['descriptor'] +def _function(x): yield x +def _function2(): + try: raise + except Exception: + from sys import exc_info + e, er, tb = exc_info() + return er, tb +if HAS_CTYPES: + class _Struct(ctypes.Structure): + pass + _Struct._fields_ = [("_field", ctypes.c_int),("next", ctypes.POINTER(_Struct))] +_filedescrip, _tempfile = tempfile.mkstemp('r') # deleted in cleanup +if sys.hexversion < 0x30d00a1: + _tmpf = tempfile.TemporaryFile('w') # emits OSError 9 in python 3.13 +else: + _tmpf = tempfile.NamedTemporaryFile('w').file # for > python 3.9 + +# objects used by dill for type declaration +registered = d = {} +# objects dill fails to pickle +failures = x = {} +# all other type objects +succeeds = a = {} + +# types module (part of CH 8) +a['BooleanType'] = bool(1) +a['BuiltinFunctionType'] = len +a['BuiltinMethodType'] = a['BuiltinFunctionType'] +a['BytesType'] = _bytes = codecs.latin_1_encode('\x00')[0] # bytes(1) +a['ClassType'] = _class +a['ComplexType'] = complex(1) +a['DictType'] = _dict = {} +a['DictionaryType'] = a['DictType'] +a['FloatType'] = float(1) +a['FunctionType'] = _function +a['InstanceType'] = _instance = _class() +a['IntType'] = _int = int(1) +a['ListType'] = _list = [] +a['NoneType'] = None +a['ObjectType'] = object() +a['StringType'] = _str = str(1) +a['TupleType'] = _tuple = () +a['TypeType'] = type +a['LongType'] = _int +a['UnicodeType'] = _str +# built-in constants (CH 4) +a['CopyrightType'] = copyright +# built-in types (CH 5) +a['ClassObjectType'] = _newclass # +a['ClassInstanceType'] = _newclass() # +a['SetType'] = _set = set() +a['FrozenSetType'] = frozenset() +# built-in exceptions (CH 6) +a['ExceptionType'] = _exception = _function2()[0] +# string services (CH 7) +a['SREPatternType'] = _srepattern = re.compile('') +# data types (CH 8) +a['ArrayType'] = array.array("f") +a['DequeType'] = collections.deque([0]) +a['DefaultDictType'] = collections.defaultdict(_function, _dict) +a['TZInfoType'] = datetime.tzinfo() +a['DateTimeType'] = datetime.datetime.today() +a['CalendarType'] = calendar.Calendar() +# numeric and mathematical types (CH 9) +a['DecimalType'] = decimal.Decimal(1) +a['CountType'] = itertools.count(0) +# data compression and archiving (CH 12) +a['TarInfoType'] = tarfile.TarInfo() +# generic operating system services (CH 15) +a['LoggerType'] = _logger = logging.getLogger() +a['FormatterType'] = logging.Formatter() # pickle ok +a['FilterType'] = logging.Filter() # pickle ok +a['LogRecordType'] = logging.makeLogRecord(_dict) # pickle ok +a['OptionParserType'] = _oparser = optparse.OptionParser() # pickle ok +a['OptionGroupType'] = optparse.OptionGroup(_oparser,"foo") # pickle ok +a['OptionType'] = optparse.Option('--foo') # pickle ok +if HAS_CTYPES: + z = x if IS_PYPY else a + z['CCharType'] = _cchar = ctypes.c_char() + z['CWCharType'] = ctypes.c_wchar() # fail == 2.6 + z['CByteType'] = ctypes.c_byte() + z['CUByteType'] = ctypes.c_ubyte() + z['CShortType'] = ctypes.c_short() + z['CUShortType'] = ctypes.c_ushort() + z['CIntType'] = ctypes.c_int() + z['CUIntType'] = ctypes.c_uint() + z['CLongType'] = ctypes.c_long() + z['CULongType'] = ctypes.c_ulong() + z['CLongLongType'] = ctypes.c_longlong() + z['CULongLongType'] = ctypes.c_ulonglong() + z['CFloatType'] = ctypes.c_float() + z['CDoubleType'] = ctypes.c_double() + z['CSizeTType'] = ctypes.c_size_t() + del z + a['CLibraryLoaderType'] = ctypes.cdll + a['StructureType'] = _Struct + # if not IS_PYPY: + # a['BigEndianStructureType'] = ctypes.BigEndianStructure() +#NOTE: also LittleEndianStructureType and UnionType... abstract classes +#NOTE: remember for ctypesobj.contents creates a new python object +#NOTE: ctypes.c_int._objects is memberdescriptor for object's __dict__ +#NOTE: base class of all ctypes data types is non-public _CData + +import fractions +import io +from io import StringIO as TextIO +# built-in functions (CH 2) +a['ByteArrayType'] = bytearray([1]) +# numeric and mathematical types (CH 9) +a['FractionType'] = fractions.Fraction() +a['NumberType'] = numbers.Number() +# generic operating system services (CH 15) +a['IOBaseType'] = io.IOBase() +a['RawIOBaseType'] = io.RawIOBase() +a['TextIOBaseType'] = io.TextIOBase() +a['BufferedIOBaseType'] = io.BufferedIOBase() +a['UnicodeIOType'] = TextIO() # the new StringIO +a['LoggerAdapterType'] = logging.LoggerAdapter(_logger,_dict) # pickle ok +if HAS_CTYPES: + z = x if IS_PYPY else a + z['CBoolType'] = ctypes.c_bool(1) + z['CLongDoubleType'] = ctypes.c_longdouble() + del z +import argparse +# data types (CH 8) +a['OrderedDictType'] = collections.OrderedDict(_dict) +a['CounterType'] = collections.Counter(_dict) +if HAS_CTYPES: + z = x if IS_PYPY else a + z['CSSizeTType'] = ctypes.c_ssize_t() + del z +# generic operating system services (CH 15) +a['NullHandlerType'] = logging.NullHandler() # pickle ok # new 2.7 +a['ArgParseFileType'] = argparse.FileType() # pickle ok + +# -- pickle fails on all below here ----------------------------------------- +# types module (part of CH 8) +a['CodeType'] = compile('','','exec') +a['DictProxyType'] = type.__dict__ +a['DictProxyType2'] = _newclass.__dict__ +a['EllipsisType'] = Ellipsis +a['ClosedFileType'] = open(os.devnull, 'wb', buffering=0).close() +a['GetSetDescriptorType'] = array.array.typecode +a['LambdaType'] = _lambda = lambda x: lambda y: x #XXX: works when not imported! +a['MemberDescriptorType'] = _newclass2.descriptor +if not IS_PYPY: + a['MemberDescriptorType2'] = datetime.timedelta.days +a['MethodType'] = _method = _class()._method #XXX: works when not imported! +a['ModuleType'] = datetime +a['NotImplementedType'] = NotImplemented +a['SliceType'] = slice(1) +a['UnboundMethodType'] = _class._method #XXX: works when not imported! +d['TextWrapperType'] = open(os.devnull, 'r') # same as mode='w','w+','r+' +if not IS_PYODIDE: + d['BufferedRandomType'] = open(os.devnull, 'r+b') # same as mode='w+b' +d['BufferedReaderType'] = open(os.devnull, 'rb') # (default: buffering=-1) +d['BufferedWriterType'] = open(os.devnull, 'wb') +try: # oddities: deprecated + from _pyio import open as _open + d['PyTextWrapperType'] = _open(os.devnull, 'r', buffering=-1) + if not IS_PYODIDE: + d['PyBufferedRandomType'] = _open(os.devnull, 'r+b', buffering=-1) + d['PyBufferedReaderType'] = _open(os.devnull, 'rb', buffering=-1) + d['PyBufferedWriterType'] = _open(os.devnull, 'wb', buffering=-1) +except ImportError: + pass +# other (concrete) object types +z = d if sys.hexversion < 0x30800a2 else a +z['CellType'] = (_lambda)(0).__closure__[0] +del z +a['XRangeType'] = _xrange = range(1) +a['MethodDescriptorType'] = type.__dict__['mro'] +a['WrapperDescriptorType'] = type.__repr__ +#a['WrapperDescriptorType2'] = type.__dict__['__module__']#XXX: GetSetDescriptor +a['ClassMethodDescriptorType'] = type.__dict__['__prepare__'] +# built-in functions (CH 2) +_methodwrap = (1).__lt__ +a['MethodWrapperType'] = _methodwrap +a['StaticMethodType'] = staticmethod(_method) +a['ClassMethodType'] = classmethod(_method) +a['PropertyType'] = property() +d['SuperType'] = super(Exception, _exception) +# string services (CH 7) +_in = _bytes +a['InputType'] = _cstrI = StringIO(_in) +a['OutputType'] = _cstrO = StringIO() +# data types (CH 8) +a['WeakKeyDictionaryType'] = weakref.WeakKeyDictionary() +a['WeakValueDictionaryType'] = weakref.WeakValueDictionary() +a['ReferenceType'] = weakref.ref(_instance) +a['DeadReferenceType'] = weakref.ref(_class()) +a['ProxyType'] = weakref.proxy(_instance) +a['DeadProxyType'] = weakref.proxy(_class()) +a['CallableProxyType'] = weakref.proxy(_instance2) +a['DeadCallableProxyType'] = weakref.proxy(_class2()) +a['QueueType'] = Queue.Queue() +# numeric and mathematical types (CH 9) +d['PartialType'] = functools.partial(int,base=2) +a['IzipType'] = zip('0','1') +a['ChainType'] = itertools.chain('0','1') +d['ItemGetterType'] = operator.itemgetter(0) +d['AttrGetterType'] = operator.attrgetter('__repr__') +# file and directory access (CH 10) +_fileW = _cstrO +# data persistence (CH 11) +if HAS_ALL: + x['ConnectionType'] = _conn = sqlite3.connect(':memory:') + x['CursorType'] = _conn.cursor() +a['ShelveType'] = shelve.Shelf({}) +# data compression and archiving (CH 12) +if HAS_ALL: + x['BZ2FileType'] = bz2.BZ2File(os.devnull) + x['BZ2CompressorType'] = bz2.BZ2Compressor() + x['BZ2DecompressorType'] = bz2.BZ2Decompressor() +#x['ZipFileType'] = _zip = zipfile.ZipFile(os.devnull,'w') +#_zip.write(_tempfile,'x') [causes annoying warning/error printed on import] +#a['ZipInfoType'] = _zip.getinfo('x') +a['TarFileType'] = tarfile.open(fileobj=_fileW,mode='w') +# file formats (CH 13) +x['DialectType'] = csv.get_dialect('excel') +if sys.hexversion < 0x30d00a1: + import xdrlib + a['PackerType'] = xdrlib.Packer() +# optional operating system services (CH 16) +a['LockType'] = threading.Lock() +a['RLockType'] = threading.RLock() +# generic operating system services (CH 15) # also closed/open and r/w/etc... +a['NamedLoggerType'] = _logger = logging.getLogger(__name__) +#a['FrozenModuleType'] = __hello__ #FIXME: prints "Hello world..." +# interprocess communication (CH 17) +x['SocketType'] = _socket = socket.socket() +x['SocketPairType'] = socket.socketpair()[0] +# python runtime services (CH 27) +a['GeneratorContextManagerType'] = contextlib.contextmanager(max)([1]) + +try: # ipython + __IPYTHON__ is True # is ipython +except NameError: + # built-in constants (CH 4) + a['QuitterType'] = quit + d['ExitType'] = a['QuitterType'] +try: # numpy #FIXME: slow... 0.05 to 0.1 sec to import numpy + from numpy import ufunc as _numpy_ufunc + from numpy import array as _numpy_array + from numpy import int32 as _numpy_int32 + a['NumpyUfuncType'] = _numpy_ufunc + a['NumpyArrayType'] = _numpy_array + a['NumpyInt32Type'] = _numpy_int32 +except ImportError: + pass +# numeric and mathematical types (CH 9) +a['ProductType'] = itertools.product('0','1') +# generic operating system services (CH 15) +a['FileHandlerType'] = logging.FileHandler(os.devnull) +a['RotatingFileHandlerType'] = logging.handlers.RotatingFileHandler(os.devnull) +a['SocketHandlerType'] = logging.handlers.SocketHandler('localhost',514) +a['MemoryHandlerType'] = logging.handlers.MemoryHandler(1) +# data types (CH 8) +a['WeakSetType'] = weakref.WeakSet() # 2.7 +# generic operating system services (CH 15) [errors when dill is imported] +#a['ArgumentParserType'] = _parser = argparse.ArgumentParser('PROG') +#a['NamespaceType'] = _parser.parse_args() # pickle ok +#a['SubParsersActionType'] = _parser.add_subparsers() +#a['MutuallyExclusiveGroupType'] = _parser.add_mutually_exclusive_group() +#a['ArgumentGroupType'] = _parser.add_argument_group() + +# -- dill fails in some versions below here --------------------------------- +# types module (part of CH 8) +d['FileType'] = open(os.devnull, 'rb', buffering=0) # same 'wb','wb+','rb+' +# built-in functions (CH 2) +# Iterators: +a['ListIteratorType'] = iter(_list) # empty vs non-empty +a['SetIteratorType'] = iter(_set) #XXX: empty vs non-empty #FIXME: list_iterator +a['TupleIteratorType']= iter(_tuple) # empty vs non-empty +a['XRangeIteratorType'] = iter(_xrange) # empty vs non-empty +a["BytesIteratorType"] = iter(b'') +a["BytearrayIteratorType"] = iter(bytearray(b'')) +z = x if IS_PYPY else a +z["CallableIteratorType"] = iter(iter, None) +del z +x["MemoryIteratorType"] = iter(memoryview(b'')) +a["ListReverseiteratorType"] = reversed([]) +X = a['OrderedDictType'] +d["OdictKeysType"] = X.keys() +d["OdictValuesType"] = X.values() +d["OdictItemsType"] = X.items() +a["OdictIteratorType"] = iter(X.keys()) #FIXME: list_iterator +del X +#FIXME: list_iterator +a['DictionaryItemIteratorType'] = iter(type.__dict__.items()) +a['DictionaryKeyIteratorType'] = iter(type.__dict__.keys()) +a['DictionaryValueIteratorType'] = iter(type.__dict__.values()) +if sys.hexversion >= 0x30800a0: + a["DictReversekeyiteratorType"] = reversed({}.keys()) + a["DictReversevalueiteratorType"] = reversed({}.values()) + a["DictReverseitemiteratorType"] = reversed({}.items()) + +try: + import symtable + #FIXME: fails to pickle + x["SymtableEntryType"] = symtable.symtable("", "string", "exec")._table +except ImportError: + pass + +if sys.hexversion >= 0x30a00a0 and not IS_PYPY: + x['LineIteratorType'] = compile('3', '', 'eval').co_lines() + +if sys.hexversion >= 0x30b00b0: + from types import GenericAlias + d["GenericAliasIteratorType"] = iter(GenericAlias(list, (int,))) + x['PositionsIteratorType'] = compile('3', '', 'eval').co_positions() + +# data types (CH 8) +a['PrettyPrinterType'] = pprint.PrettyPrinter() +# numeric and mathematical types (CH 9) +a['CycleType'] = itertools.cycle('0') +# file and directory access (CH 10) +a['TemporaryFileType'] = _tmpf +# data compression and archiving (CH 12) +x['GzipFileType'] = gzip.GzipFile(fileobj=_fileW) +# generic operating system services (CH 15) +a['StreamHandlerType'] = logging.StreamHandler() +# numeric and mathematical types (CH 9) +a['PermutationsType'] = itertools.permutations('0') +a['CombinationsType'] = itertools.combinations('0',1) +a['RepeatType'] = itertools.repeat(0) +a['CompressType'] = itertools.compress('0',[1]) +#XXX: ...and etc + +# -- dill fails on all below here ------------------------------------------- +# types module (part of CH 8) +x['GeneratorType'] = _generator = _function(1) #XXX: priority +x['FrameType'] = _generator.gi_frame #XXX: inspect.currentframe() +x['TracebackType'] = _function2()[1] #(see: inspect.getouterframes,getframeinfo) +# other (concrete) object types +# (also: Capsule / CObject ?) +# built-in functions (CH 2) +# built-in types (CH 5) +# string services (CH 7) +x['StructType'] = struct.Struct('c') +x['CallableIteratorType'] = _srepattern.finditer('') +x['SREMatchType'] = _srepattern.match('') +x['SREScannerType'] = _srepattern.scanner('') +x['StreamReader'] = codecs.StreamReader(_cstrI) #XXX: ... and etc +# python object persistence (CH 11) +# x['DbShelveType'] = shelve.open('foo','n')#,protocol=2) #XXX: delete foo +if HAS_ALL: + z = a if IS_PYPY else x + z['DbmType'] = dbm.open(_tempfile,'n') + del z +# x['DbCursorType'] = _dbcursor = anydbm.open('foo','n') #XXX: delete foo +# x['DbType'] = _dbcursor.db +# data compression and archiving (CH 12) +x['ZlibCompressType'] = zlib.compressobj() +x['ZlibDecompressType'] = zlib.decompressobj() +# file formats (CH 13) +x['CSVReaderType'] = csv.reader(_cstrI) +x['CSVWriterType'] = csv.writer(_cstrO) +x['CSVDictReaderType'] = csv.DictReader(_cstrI) +x['CSVDictWriterType'] = csv.DictWriter(_cstrO,{}) +# cryptographic services (CH 14) +x['HashType'] = hashlib.md5() +if (sys.hexversion < 0x30800a1): + x['HMACType'] = hmac.new(_in) +else: + x['HMACType'] = hmac.new(_in, digestmod='md5') +# generic operating system services (CH 15) +if HAS_CURSES: pass + #x['CursesWindowType'] = _curwin = curses.initscr() #FIXME: messes up tty + #x['CursesTextPadType'] = textpad.Textbox(_curwin) + #x['CursesPanelType'] = panel.new_panel(_curwin) +if HAS_CTYPES: + x['CCharPType'] = ctypes.c_char_p() + x['CWCharPType'] = ctypes.c_wchar_p() + x['CVoidPType'] = ctypes.c_void_p() + if sys.platform[:3] == 'win': + x['CDLLType'] = _cdll = ctypes.cdll.msvcrt + else: + x['CDLLType'] = _cdll = ctypes.CDLL(None) + if not IS_PYPY: + x['PyDLLType'] = _pydll = ctypes.pythonapi + x['FuncPtrType'] = _cdll._FuncPtr() + x['CCharArrayType'] = ctypes.create_string_buffer(1) + x['CWCharArrayType'] = ctypes.create_unicode_buffer(1) + x['CParamType'] = ctypes.byref(_cchar) + x['LPCCharType'] = ctypes.pointer(_cchar) + x['LPCCharObjType'] = _lpchar = ctypes.POINTER(ctypes.c_char) + x['NullPtrType'] = _lpchar() + x['NullPyObjectType'] = ctypes.py_object() + x['PyObjectType'] = ctypes.py_object(lambda :None) + z = a if IS_PYPY else x + z['FieldType'] = _field = _Struct._field + z['CFUNCTYPEType'] = _cfunc = ctypes.CFUNCTYPE(ctypes.c_char) + if sys.hexversion < 0x30c00b3: + x['CFunctionType'] = _cfunc(str) + del z +# numeric and mathematical types (CH 9) +a['MethodCallerType'] = operator.methodcaller('mro') # 2.6 +# built-in types (CH 5) +x['MemoryType'] = memoryview(_in) # 2.7 +x['MemoryType2'] = memoryview(bytearray(_in)) # 2.7 +d['DictItemsType'] = _dict.items() # 2.7 +d['DictKeysType'] = _dict.keys() # 2.7 +d['DictValuesType'] = _dict.values() # 2.7 +# generic operating system services (CH 15) +a['RawTextHelpFormatterType'] = argparse.RawTextHelpFormatter('PROG') +a['RawDescriptionHelpFormatterType'] = argparse.RawDescriptionHelpFormatter('PROG') +a['ArgDefaultsHelpFormatterType'] = argparse.ArgumentDefaultsHelpFormatter('PROG') +z = a if IS_PYPY else x +z['CmpKeyType'] = _cmpkey = functools.cmp_to_key(_methodwrap) # 2.7, >=3.2 +z['CmpKeyObjType'] = _cmpkey('0') #2.7, >=3.2 +del z +# oddities: removed, etc +x['BufferType'] = x['MemoryType'] + +from dill._dill import _testcapsule +if _testcapsule is not None: + d['PyCapsuleType'] = _testcapsule +del _testcapsule + +if hasattr(dataclasses, '_HAS_DEFAULT_FACTORY'): + a['DataclassesHasDefaultFactoryType'] = dataclasses._HAS_DEFAULT_FACTORY + +if hasattr(dataclasses, 'MISSING'): + a['DataclassesMissingType'] = dataclasses.MISSING + +if hasattr(dataclasses, 'KW_ONLY'): + a['DataclassesKWOnlyType'] = dataclasses.KW_ONLY + +if hasattr(dataclasses, '_FIELD_BASE'): + a['DataclassesFieldBaseType'] = dataclasses._FIELD + +# -- cleanup ---------------------------------------------------------------- +a.update(d) # registered also succeed +if sys.platform[:3] == 'win': + os.close(_filedescrip) # required on win32 +os.remove(_tempfile) + + +# EOF diff --git a/myenv/lib/python3.12/site-packages/dill/_shims.py b/myenv/lib/python3.12/site-packages/dill/_shims.py new file mode 100644 index 0000000..da1abbe --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/_shims.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Author: Anirudh Vegesana (avegesan@cs.stanford.edu) +# Copyright (c) 2021-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +Provides shims for compatibility between versions of dill and Python. + +Compatibility shims should be provided in this file. Here are two simple example +use cases. + +Deprecation of constructor function: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Assume that we were transitioning _import_module in _dill.py to +the builtin function importlib.import_module when present. + +@move_to(_dill) +def _import_module(import_name): + ... # code already in _dill.py + +_import_module = Getattr(importlib, 'import_module', Getattr(_dill, '_import_module', None)) + +The code will attempt to find import_module in the importlib module. If not +present, it will use the _import_module function in _dill. + +Emulate new Python behavior in older Python versions: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CellType.cell_contents behaves differently in Python 3.6 and 3.7. It is +read-only in Python 3.6 and writable and deletable in 3.7. + +if _dill.OLD37 and _dill.HAS_CTYPES and ...: + @move_to(_dill) + def _setattr(object, name, value): + if type(object) is _dill.CellType and name == 'cell_contents': + _PyCell_Set.argtypes = (ctypes.py_object, ctypes.py_object) + _PyCell_Set(object, value) + else: + setattr(object, name, value) +... # more cases below + +_setattr = Getattr(_dill, '_setattr', setattr) + +_dill._setattr will be used when present to emulate Python 3.7 functionality in +older versions of Python while defaulting to the standard setattr in 3.7+. + +See this PR for the discussion that lead to this system: +https://github.com/uqfoundation/dill/pull/443 +""" + +import inspect +import sys + +_dill = sys.modules['dill._dill'] + + +class Reduce(object): + """ + Reduce objects are wrappers used for compatibility enforcement during + unpickle-time. They should only be used in calls to pickler.save and + other Reduce objects. They are only evaluated within unpickler.load. + + Pickling a Reduce object makes the two implementations equivalent: + + pickler.save(Reduce(*reduction)) + + pickler.save_reduce(*reduction, obj=reduction) + """ + __slots__ = ['reduction'] + def __new__(cls, *reduction, **kwargs): + """ + Args: + *reduction: a tuple that matches the format given here: + https://docs.python.org/3/library/pickle.html#object.__reduce__ + is_callable: a bool to indicate that the object created by + unpickling `reduction` is callable. If true, the current Reduce + is allowed to be used as the function in further save_reduce calls + or Reduce objects. + """ + is_callable = kwargs.get('is_callable', False) # Pleases Py2. Can be removed later + if is_callable: + self = object.__new__(_CallableReduce) + else: + self = object.__new__(Reduce) + self.reduction = reduction + return self + def __repr__(self): + return 'Reduce%s' % (self.reduction,) + def __copy__(self): + return self # pragma: no cover + def __deepcopy__(self, memo): + return self # pragma: no cover + def __reduce__(self): + return self.reduction + def __reduce_ex__(self, protocol): + return self.__reduce__() + +class _CallableReduce(Reduce): + # A version of Reduce for functions. Used to trick pickler.save_reduce into + # thinking that Reduce objects of functions are themselves meaningful functions. + def __call__(self, *args, **kwargs): + reduction = self.__reduce__() + func = reduction[0] + f_args = reduction[1] + obj = func(*f_args) + return obj(*args, **kwargs) + +__NO_DEFAULT = _dill.Sentinel('Getattr.NO_DEFAULT') + +def Getattr(object, name, default=__NO_DEFAULT): + """ + A Reduce object that represents the getattr operation. When unpickled, the + Getattr will access an attribute 'name' of 'object' and return the value + stored there. If the attribute doesn't exist, the default value will be + returned if present. + + The following statements are equivalent: + + Getattr(collections, 'OrderedDict') + Getattr(collections, 'spam', None) + Getattr(*args) + + Reduce(getattr, (collections, 'OrderedDict')) + Reduce(getattr, (collections, 'spam', None)) + Reduce(getattr, args) + + During unpickling, the first two will result in collections.OrderedDict and + None respectively because the first attribute exists and the second one does + not, forcing it to use the default value given in the third argument. + """ + + if default is Getattr.NO_DEFAULT: + reduction = (getattr, (object, name)) + else: + reduction = (getattr, (object, name, default)) + + return Reduce(*reduction, is_callable=callable(default)) + +Getattr.NO_DEFAULT = __NO_DEFAULT +del __NO_DEFAULT + +def move_to(module, name=None): + def decorator(func): + if name is None: + fname = func.__name__ + else: + fname = name + module.__dict__[fname] = func + func.__module__ = module.__name__ + return func + return decorator + +def register_shim(name, default): + """ + A easier to understand and more compact way of "softly" defining a function. + These two pieces of code are equivalent: + + if _dill.OLD3X: + def _create_class(): + ... + _create_class = register_shim('_create_class', types.new_class) + + if _dill.OLD3X: + @move_to(_dill) + def _create_class(): + ... + _create_class = Getattr(_dill, '_create_class', types.new_class) + + Intuitively, it creates a function or object in the versions of dill/python + that require special reimplementations, and use a core library or default + implementation if that function or object does not exist. + """ + func = globals().get(name) + if func is not None: + _dill.__dict__[name] = func + func.__module__ = _dill.__name__ + + if default is Getattr.NO_DEFAULT: + reduction = (getattr, (_dill, name)) + else: + reduction = (getattr, (_dill, name, default)) + + return Reduce(*reduction, is_callable=callable(default)) + +###################### +## Compatibility Shims are defined below +###################### + +_CELL_EMPTY = register_shim('_CELL_EMPTY', None) + +_setattr = register_shim('_setattr', setattr) +_delattr = register_shim('_delattr', delattr) diff --git a/myenv/lib/python3.12/site-packages/dill/detect.py b/myenv/lib/python3.12/site-packages/dill/detect.py new file mode 100644 index 0000000..6f76e72 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/detect.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +Methods for detecting objects leading to pickling failures. +""" + +import dis +from inspect import ismethod, isfunction, istraceback, isframe, iscode + +from .pointers import parent, reference, at, parents, children +from .logger import trace + +__all__ = ['baditems','badobjects','badtypes','code','errors','freevars', + 'getmodule','globalvars','nestedcode','nestedglobals','outermost', + 'referredglobals','referrednested','trace','varnames'] + +def getmodule(object, _filename=None, force=False): + """get the module of the object""" + from inspect import getmodule as getmod + module = getmod(object, _filename) + if module or not force: return module + import builtins + from .source import getname + name = getname(object, force=True) + return builtins if name in vars(builtins).keys() else None + +def outermost(func): # is analogous to getsource(func,enclosing=True) + """get outermost enclosing object (i.e. the outer function in a closure) + + NOTE: this is the object-equivalent of getsource(func, enclosing=True) + """ + if ismethod(func): + _globals = func.__func__.__globals__ or {} + elif isfunction(func): + _globals = func.__globals__ or {} + else: + return #XXX: or raise? no matches + _globals = _globals.items() + # get the enclosing source + from .source import getsourcelines + try: lines,lnum = getsourcelines(func, enclosing=True) + except Exception: #TypeError, IOError + lines,lnum = [],None + code = ''.join(lines) + # get all possible names,objects that are named in the enclosing source + _locals = ((name,obj) for (name,obj) in _globals if name in code) + # now only save the objects that generate the enclosing block + for name,obj in _locals: #XXX: don't really need 'name' + try: + if getsourcelines(obj) == (lines,lnum): return obj + except Exception: #TypeError, IOError + pass + return #XXX: or raise? no matches + +def nestedcode(func, recurse=True): #XXX: or return dict of {co_name: co} ? + """get the code objects for any nested functions (e.g. in a closure)""" + func = code(func) + if not iscode(func): return [] #XXX: or raise? no matches + nested = set() + for co in func.co_consts: + if co is None: continue + co = code(co) + if co: + nested.add(co) + if recurse: nested |= set(nestedcode(co, recurse=True)) + return list(nested) + +def code(func): + """get the code object for the given function or method + + NOTE: use dill.source.getsource(CODEOBJ) to get the source code + """ + if ismethod(func): func = func.__func__ + if isfunction(func): func = func.__code__ + if istraceback(func): func = func.tb_frame + if isframe(func): func = func.f_code + if iscode(func): return func + return + +#XXX: ugly: parse dis.dis for name after " len(referrednested(func)), try calling func(). + If possible, python builds code objects, but delays building functions + until func() is called. + """ + import gc + funcs = set() + # get the code objects, and try to track down by referrence + for co in nestedcode(func, recurse): + # look for function objects that refer to the code object + for obj in gc.get_referrers(co): + # get methods + _ = getattr(obj, '__func__', None) # ismethod + if getattr(_, '__code__', None) is co: funcs.add(obj) + # get functions + elif getattr(obj, '__code__', None) is co: funcs.add(obj) + # get frame objects + elif getattr(obj, 'f_code', None) is co: funcs.add(obj) + # get code objects + elif hasattr(obj, 'co_code') and obj is co: funcs.add(obj) +# frameobjs => func.__code__.co_varnames not in func.__code__.co_cellvars +# funcobjs => func.__code__.co_cellvars not in func.__code__.co_varnames +# frameobjs are not found, however funcobjs are... +# (see: test_mixins.quad ... and test_mixins.wtf) +# after execution, code objects get compiled, and then may be found by gc + return list(funcs) + + +def freevars(func): + """get objects defined in enclosing code that are referred to by func + + returns a dict of {name:object}""" + if ismethod(func): func = func.__func__ + if isfunction(func): + closures = func.__closure__ or () + func = func.__code__.co_freevars # get freevars + else: + return {} + + def get_cell_contents(): + for name, c in zip(func, closures): + try: + cell_contents = c.cell_contents + except ValueError: # cell is empty + continue + yield name, c.cell_contents + + return dict(get_cell_contents()) + +# thanks to Davies Liu for recursion of globals +def nestedglobals(func, recurse=True): + """get the names of any globals found within func""" + func = code(func) + if func is None: return list() + import sys + from .temp import capture + CAN_NULL = sys.hexversion >= 0x30b00a7 # NULL may be prepended >= 3.11a7 + names = set() + with capture('stdout') as out: + dis.dis(func) #XXX: dis.dis(None) disassembles last traceback + for line in out.getvalue().splitlines(): + if '_GLOBAL' in line: + name = line.split('(')[-1].split(')')[0] + if CAN_NULL: + names.add(name.replace('NULL + ', '').replace(' + NULL', '')) + else: + names.add(name) + for co in getattr(func, 'co_consts', tuple()): + if co and recurse and iscode(co): + names.update(nestedglobals(co, recurse=True)) + return list(names) + +def referredglobals(func, recurse=True, builtin=False): + """get the names of objects in the global scope referred to by func""" + return globalvars(func, recurse, builtin).keys() + +def globalvars(func, recurse=True, builtin=False): + """get objects defined in global scope that are referred to by func + + return a dict of {name:object}""" + if ismethod(func): func = func.__func__ + if isfunction(func): + globs = vars(getmodule(sum)).copy() if builtin else {} + # get references from within closure + orig_func, func = func, set() + for obj in orig_func.__closure__ or {}: + try: + cell_contents = obj.cell_contents + except ValueError: # cell is empty + pass + else: + _vars = globalvars(cell_contents, recurse, builtin) or {} + func.update(_vars) #XXX: (above) be wary of infinte recursion? + globs.update(_vars) + # get globals + globs.update(orig_func.__globals__ or {}) + # get names of references + if not recurse: + func.update(orig_func.__code__.co_names) + else: + func.update(nestedglobals(orig_func.__code__)) + # find globals for all entries of func + for key in func.copy(): #XXX: unnecessary...? + nested_func = globs.get(key) + if nested_func is orig_func: + #func.remove(key) if key in func else None + continue #XXX: globalvars(func, False)? + func.update(globalvars(nested_func, True, builtin)) + elif iscode(func): + globs = vars(getmodule(sum)).copy() if builtin else {} + #globs.update(globals()) + if not recurse: + func = func.co_names # get names + else: + orig_func = func.co_name # to stop infinite recursion + func = set(nestedglobals(func)) + # find globals for all entries of func + for key in func.copy(): #XXX: unnecessary...? + if key is orig_func: + #func.remove(key) if key in func else None + continue #XXX: globalvars(func, False)? + nested_func = globs.get(key) + func.update(globalvars(nested_func, True, builtin)) + else: + return {} + #NOTE: if name not in __globals__, then we skip it... + return dict((name,globs[name]) for name in func if name in globs) + + +def varnames(func): + """get names of variables defined by func + + returns a tuple (local vars, local vars referrenced by nested functions)""" + func = code(func) + if not iscode(func): + return () #XXX: better ((),())? or None? + return func.co_varnames, func.co_cellvars + + +def baditems(obj, exact=False, safe=False): #XXX: obj=globals() ? + """get items in object that fail to pickle""" + if not hasattr(obj,'__iter__'): # is not iterable + return [j for j in (badobjects(obj,0,exact,safe),) if j is not None] + obj = obj.values() if getattr(obj,'values',None) else obj + _obj = [] # can't use a set, as items may be unhashable + [_obj.append(badobjects(i,0,exact,safe)) for i in obj if i not in _obj] + return [j for j in _obj if j is not None] + + +def badobjects(obj, depth=0, exact=False, safe=False): + """get objects that fail to pickle""" + from dill import pickles + if not depth: + if pickles(obj,exact,safe): return None + return obj + return dict(((attr, badobjects(getattr(obj,attr),depth-1,exact,safe)) \ + for attr in dir(obj) if not pickles(getattr(obj,attr),exact,safe))) + +def badtypes(obj, depth=0, exact=False, safe=False): + """get types for objects that fail to pickle""" + from dill import pickles + if not depth: + if pickles(obj,exact,safe): return None + return type(obj) + return dict(((attr, badtypes(getattr(obj,attr),depth-1,exact,safe)) \ + for attr in dir(obj) if not pickles(getattr(obj,attr),exact,safe))) + +def errors(obj, depth=0, exact=False, safe=False): + """get errors for objects that fail to pickle""" + from dill import pickles, copy + if not depth: + try: + pik = copy(obj) + if exact: + assert pik == obj, \ + "Unpickling produces %s instead of %s" % (pik,obj) + assert type(pik) == type(obj), \ + "Unpickling produces %s instead of %s" % (type(pik),type(obj)) + return None + except Exception: + import sys + return sys.exc_info()[1] + _dict = {} + for attr in dir(obj): + try: + _attr = getattr(obj,attr) + except Exception: + import sys + _dict[attr] = sys.exc_info()[1] + continue + if not pickles(_attr,exact,safe): + _dict[attr] = errors(_attr,depth-1,exact,safe) + return _dict + + +# EOF diff --git a/myenv/lib/python3.12/site-packages/dill/logger.py b/myenv/lib/python3.12/site-packages/dill/logger.py new file mode 100644 index 0000000..6d444c9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/logger.py @@ -0,0 +1,285 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Author: Leonardo Gama (@leogama) +# Copyright (c) 2022-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +Logging utilities for dill. + +The 'logger' object is dill's top-level logger. + +The 'adapter' object wraps the logger and implements a 'trace()' method that +generates a detailed tree-style trace for the pickling call at log level INFO. + +The 'trace()' function sets and resets dill's logger log level, enabling and +disabling the pickling trace. + +The trace shows a tree structure depicting the depth of each object serialized +*with dill save functions*, but not the ones that use save functions from +'pickle._Pickler.dispatch'. If the information is available, it also displays +the size in bytes that the object contributed to the pickle stream (including +its child objects). Sample trace output: + + >>> import dill, dill.tests + >>> dill.detect.trace(True) + >>> dill.dump_session(main=dill.tests) + ┬ M1: + ├┬ F2: + │└ # F2 [32 B] + ├┬ D2: + │├┬ T4: + ││└ # T4 [35 B] + │├┬ D2: + ││├┬ T4: + │││└ # T4 [50 B] + ││├┬ D2: + │││└ # D2 [84 B] + ││└ # D2 [413 B] + │└ # D2 [763 B] + └ # M1 [813 B] +""" + +__all__ = ['adapter', 'logger', 'trace'] + +import codecs +import contextlib +import locale +import logging +import math +import os +from functools import partial +from typing import TextIO, Union + +import dill + +# Tree drawing characters: Unicode to ASCII map. +ASCII_MAP = str.maketrans({"│": "|", "├": "|", "┬": "+", "└": "`"}) + +## Notes about the design choices ## + +# Here is some domumentation of the Standard Library's logging internals that +# can't be found completely in the official documentation. dill's logger is +# obtained by calling logging.getLogger('dill') and therefore is an instance of +# logging.getLoggerClass() at the call time. As this is controlled by the user, +# in order to add some functionality to it it's necessary to use a LoggerAdapter +# to wrap it, overriding some of the adapter's methods and creating new ones. +# +# Basic calling sequence +# ====================== +# +# Python's logging functionality can be conceptually divided into five steps: +# 0. Check logging level -> abort if call level is greater than logger level +# 1. Gather information -> construct a LogRecord from passed arguments and context +# 2. Filter (optional) -> discard message if the record matches a filter +# 3. Format -> format message with args, then format output string with message plus record +# 4. Handle -> write the formatted string to output as defined in the handler +# +# dill.logging.logger.log -> # or logger.info, etc. +# Logger.log -> \ +# Logger._log -> }- accept 'extra' parameter for custom record entries +# Logger.makeRecord -> / +# LogRecord.__init__ +# Logger.handle -> +# Logger.callHandlers -> +# Handler.handle -> +# Filterer.filter -> +# Filter.filter +# StreamHandler.emit -> +# Handler.format -> +# Formatter.format -> +# LogRecord.getMessage # does: record.message = msg % args +# Formatter.formatMessage -> +# PercentStyle.format # does: self._fmt % vars(record) +# +# NOTE: All methods from the second line on are from logging.__init__.py + +class TraceAdapter(logging.LoggerAdapter): + """ + Tracks object tree depth and calculates pickled object size. + + A single instance of this wraps the module's logger, as the logging API + doesn't allow setting it directly with a custom Logger subclass. The added + 'trace()' method receives a pickle instance as the first argument and + creates extra values to be added in the LogRecord from it, then calls + 'info()'. + + Usage of logger with 'trace()' method: + + >>> from dill.logger import adapter as logger #NOTE: not dill.logger.logger + >>> ... + >>> def save_atype(pickler, obj): + >>> logger.trace(pickler, "Message with %s and %r etc. placeholders", 'text', obj) + >>> ... + """ + def __init__(self, logger): + self.logger = logger + def addHandler(self, handler): + formatter = TraceFormatter("%(prefix)s%(message)s%(suffix)s", handler=handler) + handler.setFormatter(formatter) + self.logger.addHandler(handler) + def removeHandler(self, handler): + self.logger.removeHandler(handler) + def process(self, msg, kwargs): + # A no-op override, as we don't have self.extra. + return msg, kwargs + def trace_setup(self, pickler): + # Called by Pickler.dump(). + if not dill._dill.is_dill(pickler, child=False): + return + if self.isEnabledFor(logging.INFO): + pickler._trace_depth = 1 + pickler._size_stack = [] + else: + pickler._trace_depth = None + def trace(self, pickler, msg, *args, **kwargs): + if not hasattr(pickler, '_trace_depth'): + logger.info(msg, *args, **kwargs) + return + if pickler._trace_depth is None: + return + extra = kwargs.get('extra', {}) + pushed_obj = msg.startswith('#') + size = None + try: + # Streams are not required to be tellable. + size = pickler._file.tell() + frame = pickler.framer.current_frame + try: + size += frame.tell() + except AttributeError: + # PyPy may use a BytesBuilder as frame + size += len(frame) + except (AttributeError, TypeError): + pass + if size is not None: + if not pushed_obj: + pickler._size_stack.append(size) + else: + size -= pickler._size_stack.pop() + extra['size'] = size + if pushed_obj: + pickler._trace_depth -= 1 + extra['depth'] = pickler._trace_depth + kwargs['extra'] = extra + self.info(msg, *args, **kwargs) + if not pushed_obj: + pickler._trace_depth += 1 + +class TraceFormatter(logging.Formatter): + """ + Generates message prefix and suffix from record. + + This Formatter adds prefix and suffix strings to the log message in trace + mode (an also provides empty string defaults for normal logs). + """ + def __init__(self, *args, handler=None, **kwargs): + super().__init__(*args, **kwargs) + try: + encoding = handler.stream.encoding + if encoding is None: + raise AttributeError + except AttributeError: + encoding = locale.getpreferredencoding() + try: + encoding = codecs.lookup(encoding).name + except LookupError: + self.is_utf8 = False + else: + self.is_utf8 = (encoding == codecs.lookup('utf-8').name) + def format(self, record): + fields = {'prefix': "", 'suffix': ""} + if getattr(record, 'depth', 0) > 0: + if record.msg.startswith("#"): + prefix = (record.depth - 1)*"│" + "└" + elif record.depth == 1: + prefix = "┬" + else: + prefix = (record.depth - 2)*"│" + "├┬" + if not self.is_utf8: + prefix = prefix.translate(ASCII_MAP) + "-" + fields['prefix'] = prefix + " " + if hasattr(record, 'size') and record.size is not None and record.size >= 1: + # Show object size in human-readable form. + power = int(math.log(record.size, 2)) // 10 + size = record.size >> power*10 + fields['suffix'] = " [%d %sB]" % (size, "KMGTP"[power] + "i" if power else "") + vars(record).update(fields) + return super().format(record) + +logger = logging.getLogger('dill') +logger.propagate = False +adapter = TraceAdapter(logger) +stderr_handler = logging._StderrHandler() +adapter.addHandler(stderr_handler) + +def trace(arg: Union[bool, TextIO, str, os.PathLike] = None, *, mode: str = 'a') -> None: + """print a trace through the stack when pickling; useful for debugging + + With a single boolean argument, enable or disable the tracing. + + Example usage: + + >>> import dill + >>> dill.detect.trace(True) + >>> dill.dump_session() + + Alternatively, ``trace()`` can be used as a context manager. With no + arguments, it just takes care of restoring the tracing state on exit. + Either a file handle, or a file name and (optionally) a file mode may be + specitfied to redirect the tracing output in the ``with`` block context. A + log function is yielded by the manager so the user can write extra + information to the file. + + Example usage: + + >>> from dill import detect + >>> D = {'a': 42, 'b': {'x': None}} + >>> with detect.trace(): + >>> dumps(D) + ┬ D2: + ├┬ D2: + │└ # D2 [8 B] + └ # D2 [22 B] + >>> squared = lambda x: x**2 + >>> with detect.trace('output.txt', mode='w') as log: + >>> log("> D = %r", D) + >>> dumps(D) + >>> log("> squared = %r", squared) + >>> dumps(squared) + + Arguments: + arg: a boolean value, or an optional file-like or path-like object for the context manager + mode: mode string for ``open()`` if a file name is passed as the first argument + """ + if repr(arg) not in ('False', 'True'): + return TraceManager(file=arg, mode=mode) + logger.setLevel(logging.INFO if arg else logging.WARNING) + +class TraceManager(contextlib.AbstractContextManager): + """context manager version of trace(); can redirect the trace to a file""" + def __init__(self, file, mode): + self.file = file + self.mode = mode + self.redirect = file is not None + self.file_is_stream = hasattr(file, 'write') + def __enter__(self): + if self.redirect: + stderr_handler.flush() + if self.file_is_stream: + self.handler = logging.StreamHandler(self.file) + else: + self.handler = logging.FileHandler(self.file, self.mode) + adapter.removeHandler(stderr_handler) + adapter.addHandler(self.handler) + self.old_level = adapter.getEffectiveLevel() + adapter.setLevel(logging.INFO) + return adapter.info + def __exit__(self, *exc_info): + adapter.setLevel(self.old_level) + if self.redirect: + adapter.removeHandler(self.handler) + adapter.addHandler(stderr_handler) + if not self.file_is_stream: + self.handler.close() diff --git a/myenv/lib/python3.12/site-packages/dill/objtypes.py b/myenv/lib/python3.12/site-packages/dill/objtypes.py new file mode 100644 index 0000000..526b583 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/objtypes.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +all Python Standard Library object types (currently: CH 1-15 @ 2.7) +and some other common object types (i.e. numpy.ndarray) + +to load more objects and types, use dill.load_types() +""" + +# non-local import of dill.objects +from dill import objects +for _type in objects.keys(): + exec("%s = type(objects['%s'])" % (_type,_type)) + +del objects +try: + del _type +except NameError: + pass diff --git a/myenv/lib/python3.12/site-packages/dill/pointers.py b/myenv/lib/python3.12/site-packages/dill/pointers.py new file mode 100644 index 0000000..c3b48ca --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/pointers.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +__all__ = ['parent', 'reference', 'at', 'parents', 'children'] + +import gc +import sys + +from ._dill import _proxy_helper as reference +from ._dill import _locate_object as at + +def parent(obj, objtype, ignore=()): + """ +>>> listiter = iter([4,5,6,7]) +>>> obj = parent(listiter, list) +>>> obj == [4,5,6,7] # actually 'is', but don't have handle any longer +True + +NOTE: objtype can be a single type (e.g. int or list) or a tuple of types. + +WARNING: if obj is a sequence (e.g. list), may produce unexpected results. +Parent finds *one* parent (e.g. the last member of the sequence). + """ + depth = 1 #XXX: always looking for the parent (only, right?) + chain = parents(obj, objtype, depth, ignore) + parent = chain.pop() + if parent is obj: + return None + return parent + + +def parents(obj, objtype, depth=1, ignore=()): #XXX: objtype=object ? + """Find the chain of referents for obj. Chain will end with obj. + + objtype: an object type or tuple of types to search for + depth: search depth (e.g. depth=2 is 'grandparents') + ignore: an object or tuple of objects to ignore in the search + """ + edge_func = gc.get_referents # looking for refs, not back_refs + predicate = lambda x: isinstance(x, objtype) # looking for parent type + #if objtype is None: predicate = lambda x: True #XXX: in obj.mro() ? + ignore = (ignore,) if not hasattr(ignore, '__len__') else ignore + ignore = (id(obj) for obj in ignore) + chain = find_chain(obj, predicate, edge_func, depth)[::-1] + #XXX: should pop off obj... ? + return chain + + +def children(obj, objtype, depth=1, ignore=()): #XXX: objtype=object ? + """Find the chain of referrers for obj. Chain will start with obj. + + objtype: an object type or tuple of types to search for + depth: search depth (e.g. depth=2 is 'grandchildren') + ignore: an object or tuple of objects to ignore in the search + + NOTE: a common thing to ignore is all globals, 'ignore=(globals(),)' + + NOTE: repeated calls may yield different results, as python stores + the last value in the special variable '_'; thus, it is often good + to execute something to replace '_' (e.g. >>> 1+1). + """ + edge_func = gc.get_referrers # looking for back_refs, not refs + predicate = lambda x: isinstance(x, objtype) # looking for child type + #if objtype is None: predicate = lambda x: True #XXX: in obj.mro() ? + ignore = (ignore,) if not hasattr(ignore, '__len__') else ignore + ignore = (id(obj) for obj in ignore) + chain = find_chain(obj, predicate, edge_func, depth, ignore) + #XXX: should pop off obj... ? + return chain + + +# more generic helper function (cut-n-paste from objgraph) +# Source at http://mg.pov.lt/objgraph/ +# Copyright (c) 2008-2010 Marius Gedminas +# Copyright (c) 2010 Stefano Rivera +# Released under the MIT licence (see objgraph/objgrah.py) + +def find_chain(obj, predicate, edge_func, max_depth=20, extra_ignore=()): + queue = [obj] + depth = {id(obj): 0} + parent = {id(obj): None} + ignore = set(extra_ignore) + ignore.add(id(extra_ignore)) + ignore.add(id(queue)) + ignore.add(id(depth)) + ignore.add(id(parent)) + ignore.add(id(ignore)) + ignore.add(id(sys._getframe())) # this function + ignore.add(id(sys._getframe(1))) # find_chain/find_backref_chain, likely + gc.collect() + while queue: + target = queue.pop(0) + if predicate(target): + chain = [target] + while parent[id(target)] is not None: + target = parent[id(target)] + chain.append(target) + return chain + tdepth = depth[id(target)] + if tdepth < max_depth: + referrers = edge_func(target) + ignore.add(id(referrers)) + for source in referrers: + if id(source) in ignore: + continue + if id(source) not in depth: + depth[id(source)] = tdepth + 1 + parent[id(source)] = target + queue.append(source) + return [obj] # not found + + +# backward compatibility +refobject = at + + +# EOF diff --git a/myenv/lib/python3.12/site-packages/dill/session.py b/myenv/lib/python3.12/site-packages/dill/session.py new file mode 100644 index 0000000..b99c8ad --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/session.py @@ -0,0 +1,612 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Author: Leonardo Gama (@leogama) +# Copyright (c) 2008-2015 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +Pickle and restore the intepreter session. +""" + +__all__ = [ + 'dump_module', 'load_module', 'load_module_asdict', + 'dump_session', 'load_session' # backward compatibility +] + +import re +import os +import sys +import warnings +import pathlib +import tempfile + +TEMPDIR = pathlib.PurePath(tempfile.gettempdir()) + +# Type hints. +from typing import Optional, Union + +from dill import _dill, Pickler, Unpickler +from ._dill import ( + BuiltinMethodType, FunctionType, MethodType, ModuleType, TypeType, + _import_module, _is_builtin_module, _is_imported_module, _main_module, + _reverse_typemap, __builtin__, UnpicklingError, +) + +def _module_map(): + """get map of imported modules""" + from collections import defaultdict + from types import SimpleNamespace + modmap = SimpleNamespace( + by_name=defaultdict(list), + by_id=defaultdict(list), + top_level={}, + ) + for modname, module in sys.modules.items(): + if modname in ('__main__', '__mp_main__') or not isinstance(module, ModuleType): + continue + if '.' not in modname: + modmap.top_level[id(module)] = modname + for objname, modobj in module.__dict__.items(): + modmap.by_name[objname].append((modobj, modname)) + modmap.by_id[id(modobj)].append((modobj, objname, modname)) + return modmap + +IMPORTED_AS_TYPES = (ModuleType, TypeType, FunctionType, MethodType, BuiltinMethodType) +if 'PyCapsuleType' in _reverse_typemap: + IMPORTED_AS_TYPES += (_reverse_typemap['PyCapsuleType'],) +IMPORTED_AS_MODULES = ('ctypes', 'typing', 'subprocess', 'threading', + r'concurrent\.futures(\.\w+)?', r'multiprocessing(\.\w+)?') +IMPORTED_AS_MODULES = tuple(re.compile(x) for x in IMPORTED_AS_MODULES) + +def _lookup_module(modmap, name, obj, main_module): + """lookup name or id of obj if module is imported""" + for modobj, modname in modmap.by_name[name]: + if modobj is obj and sys.modules[modname] is not main_module: + return modname, name + __module__ = getattr(obj, '__module__', None) + if isinstance(obj, IMPORTED_AS_TYPES) or (__module__ is not None + and any(regex.fullmatch(__module__) for regex in IMPORTED_AS_MODULES)): + for modobj, objname, modname in modmap.by_id[id(obj)]: + if sys.modules[modname] is not main_module: + return modname, objname + return None, None + +def _stash_modules(main_module): + modmap = _module_map() + newmod = ModuleType(main_module.__name__) + + imported = [] + imported_as = [] + imported_top_level = [] # keep separated for backward compatibility + original = {} + for name, obj in main_module.__dict__.items(): + if obj is main_module: + original[name] = newmod # self-reference + elif obj is main_module.__dict__: + original[name] = newmod.__dict__ + # Avoid incorrectly matching a singleton value in another package (ex.: __doc__). + elif any(obj is singleton for singleton in (None, False, True)) \ + or isinstance(obj, ModuleType) and _is_builtin_module(obj): # always saved by ref + original[name] = obj + else: + source_module, objname = _lookup_module(modmap, name, obj, main_module) + if source_module is not None: + if objname == name: + imported.append((source_module, name)) + else: + imported_as.append((source_module, objname, name)) + else: + try: + imported_top_level.append((modmap.top_level[id(obj)], name)) + except KeyError: + original[name] = obj + + if len(original) < len(main_module.__dict__): + newmod.__dict__.update(original) + newmod.__dill_imported = imported + newmod.__dill_imported_as = imported_as + newmod.__dill_imported_top_level = imported_top_level + if getattr(newmod, '__loader__', None) is None and _is_imported_module(main_module): + # Trick _is_imported_module() to force saving as an imported module. + newmod.__loader__ = True # will be discarded by save_module() + return newmod + else: + return main_module + +def _restore_modules(unpickler, main_module): + try: + for modname, name in main_module.__dict__.pop('__dill_imported'): + main_module.__dict__[name] = unpickler.find_class(modname, name) + for modname, objname, name in main_module.__dict__.pop('__dill_imported_as'): + main_module.__dict__[name] = unpickler.find_class(modname, objname) + for modname, name in main_module.__dict__.pop('__dill_imported_top_level'): + main_module.__dict__[name] = __import__(modname) + except KeyError: + pass + +#NOTE: 06/03/15 renamed main_module to main +def dump_module( + filename: Union[str, os.PathLike] = None, + module: Optional[Union[ModuleType, str]] = None, + refimported: bool = False, + **kwds +) -> None: + """Pickle the current state of :py:mod:`__main__` or another module to a file. + + Save the contents of :py:mod:`__main__` (e.g. from an interactive + interpreter session), an imported module, or a module-type object (e.g. + built with :py:class:`~types.ModuleType`), to a file. The pickled + module can then be restored with the function :py:func:`load_module`. + + Args: + filename: a path-like object or a writable stream. If `None` + (the default), write to a named file in a temporary directory. + module: a module object or the name of an importable module. If `None` + (the default), :py:mod:`__main__` is saved. + refimported: if `True`, all objects identified as having been imported + into the module's namespace are saved by reference. *Note:* this is + similar but independent from ``dill.settings[`byref`]``, as + ``refimported`` refers to virtually all imported objects, while + ``byref`` only affects select objects. + **kwds: extra keyword arguments passed to :py:class:`Pickler()`. + + Raises: + :py:exc:`PicklingError`: if pickling fails. + + Examples: + + - Save current interpreter session state: + + >>> import dill + >>> squared = lambda x: x*x + >>> dill.dump_module() # save state of __main__ to /tmp/session.pkl + + - Save the state of an imported/importable module: + + >>> import dill + >>> import pox + >>> pox.plus_one = lambda x: x+1 + >>> dill.dump_module('pox_session.pkl', module=pox) + + - Save the state of a non-importable, module-type object: + + >>> import dill + >>> from types import ModuleType + >>> foo = ModuleType('foo') + >>> foo.values = [1,2,3] + >>> import math + >>> foo.sin = math.sin + >>> dill.dump_module('foo_session.pkl', module=foo, refimported=True) + + - Restore the state of the saved modules: + + >>> import dill + >>> dill.load_module() + >>> squared(2) + 4 + >>> pox = dill.load_module('pox_session.pkl') + >>> pox.plus_one(1) + 2 + >>> foo = dill.load_module('foo_session.pkl') + >>> [foo.sin(x) for x in foo.values] + [0.8414709848078965, 0.9092974268256817, 0.1411200080598672] + + - Use `refimported` to save imported objects by reference: + + >>> import dill + >>> from html.entities import html5 + >>> type(html5), len(html5) + (dict, 2231) + >>> import io + >>> buf = io.BytesIO() + >>> dill.dump_module(buf) # saves __main__, with html5 saved by value + >>> len(buf.getvalue()) # pickle size in bytes + 71665 + >>> buf = io.BytesIO() + >>> dill.dump_module(buf, refimported=True) # html5 saved by reference + >>> len(buf.getvalue()) + 438 + + *Changed in version 0.3.6:* Function ``dump_session()`` was renamed to + ``dump_module()``. Parameters ``main`` and ``byref`` were renamed to + ``module`` and ``refimported``, respectively. + + Note: + Currently, ``dill.settings['byref']`` and ``dill.settings['recurse']`` + don't apply to this function. + """ + for old_par, par in [('main', 'module'), ('byref', 'refimported')]: + if old_par in kwds: + message = "The argument %r has been renamed %r" % (old_par, par) + if old_par == 'byref': + message += " to distinguish it from dill.settings['byref']" + warnings.warn(message + ".", PendingDeprecationWarning) + if locals()[par]: # the defaults are None and False + raise TypeError("both %r and %r arguments were used" % (par, old_par)) + refimported = kwds.pop('byref', refimported) + module = kwds.pop('main', module) + + from .settings import settings + protocol = settings['protocol'] + main = module + if main is None: + main = _main_module + elif isinstance(main, str): + main = _import_module(main) + if not isinstance(main, ModuleType): + raise TypeError("%r is not a module" % main) + if hasattr(filename, 'write'): + file = filename + else: + if filename is None: + filename = str(TEMPDIR/'session.pkl') + file = open(filename, 'wb') + try: + pickler = Pickler(file, protocol, **kwds) + pickler._original_main = main + if refimported: + main = _stash_modules(main) + pickler._main = main #FIXME: dill.settings are disabled + pickler._byref = False # disable pickling by name reference + pickler._recurse = False # disable pickling recursion for globals + pickler._session = True # is best indicator of when pickling a session + pickler._first_pass = True + pickler._main_modified = main is not pickler._original_main + pickler.dump(main) + finally: + if file is not filename: # if newly opened file + file.close() + return + +# Backward compatibility. +def dump_session(filename=None, main=None, byref=False, **kwds): + warnings.warn("dump_session() has been renamed dump_module()", PendingDeprecationWarning) + dump_module(filename, module=main, refimported=byref, **kwds) +dump_session.__doc__ = dump_module.__doc__ + +class _PeekableReader: + """lightweight stream wrapper that implements peek()""" + def __init__(self, stream): + self.stream = stream + def read(self, n): + return self.stream.read(n) + def readline(self): + return self.stream.readline() + def tell(self): + return self.stream.tell() + def close(self): + return self.stream.close() + def peek(self, n): + stream = self.stream + try: + if hasattr(stream, 'flush'): stream.flush() + position = stream.tell() + stream.seek(position) # assert seek() works before reading + chunk = stream.read(n) + stream.seek(position) + return chunk + except (AttributeError, OSError): + raise NotImplementedError("stream is not peekable: %r", stream) from None + +def _make_peekable(stream): + """return stream as an object with a peek() method""" + import io + if hasattr(stream, 'peek'): + return stream + if not (hasattr(stream, 'tell') and hasattr(stream, 'seek')): + try: + return io.BufferedReader(stream) + except Exception: + pass + return _PeekableReader(stream) + +def _identify_module(file, main=None): + """identify the name of the module stored in the given file-type object""" + from pickletools import genops + UNICODE = {'UNICODE', 'BINUNICODE', 'SHORT_BINUNICODE'} + found_import = False + try: + for opcode, arg, pos in genops(file.peek(256)): + if not found_import: + if opcode.name in ('GLOBAL', 'SHORT_BINUNICODE') and \ + arg.endswith('_import_module'): + found_import = True + else: + if opcode.name in UNICODE: + return arg + else: + raise UnpicklingError("reached STOP without finding main module") + except (NotImplementedError, ValueError) as error: + # ValueError occours when the end of the chunk is reached (without a STOP). + if isinstance(error, NotImplementedError) and main is not None: + # file is not peekable, but we have main. + return None + raise UnpicklingError("unable to identify main module") from error + +def load_module( + filename: Union[str, os.PathLike] = None, + module: Optional[Union[ModuleType, str]] = None, + **kwds +) -> Optional[ModuleType]: + """Update the selected module (default is :py:mod:`__main__`) with + the state saved at ``filename``. + + Restore a module to the state saved with :py:func:`dump_module`. The + saved module can be :py:mod:`__main__` (e.g. an interpreter session), + an imported module, or a module-type object (e.g. created with + :py:class:`~types.ModuleType`). + + When restoring the state of a non-importable module-type object, the + current instance of this module may be passed as the argument ``main``. + Otherwise, a new instance is created with :py:class:`~types.ModuleType` + and returned. + + Args: + filename: a path-like object or a readable stream. If `None` + (the default), read from a named file in a temporary directory. + module: a module object or the name of an importable module; + the module name and kind (i.e. imported or non-imported) must + match the name and kind of the module stored at ``filename``. + **kwds: extra keyword arguments passed to :py:class:`Unpickler()`. + + Raises: + :py:exc:`UnpicklingError`: if unpickling fails. + :py:exc:`ValueError`: if the argument ``main`` and module saved + at ``filename`` are incompatible. + + Returns: + A module object, if the saved module is not :py:mod:`__main__` or + a module instance wasn't provided with the argument ``main``. + + Examples: + + - Save the state of some modules: + + >>> import dill + >>> squared = lambda x: x*x + >>> dill.dump_module() # save state of __main__ to /tmp/session.pkl + >>> + >>> import pox # an imported module + >>> pox.plus_one = lambda x: x+1 + >>> dill.dump_module('pox_session.pkl', module=pox) + >>> + >>> from types import ModuleType + >>> foo = ModuleType('foo') # a module-type object + >>> foo.values = [1,2,3] + >>> import math + >>> foo.sin = math.sin + >>> dill.dump_module('foo_session.pkl', module=foo, refimported=True) + + - Restore the state of the interpreter: + + >>> import dill + >>> dill.load_module() # updates __main__ from /tmp/session.pkl + >>> squared(2) + 4 + + - Load the saved state of an importable module: + + >>> import dill + >>> pox = dill.load_module('pox_session.pkl') + >>> pox.plus_one(1) + 2 + >>> import sys + >>> pox in sys.modules.values() + True + + - Load the saved state of a non-importable module-type object: + + >>> import dill + >>> foo = dill.load_module('foo_session.pkl') + >>> [foo.sin(x) for x in foo.values] + [0.8414709848078965, 0.9092974268256817, 0.1411200080598672] + >>> import math + >>> foo.sin is math.sin # foo.sin was saved by reference + True + >>> import sys + >>> foo in sys.modules.values() + False + + - Update the state of a non-importable module-type object: + + >>> import dill + >>> from types import ModuleType + >>> foo = ModuleType('foo') + >>> foo.values = ['a','b'] + >>> foo.sin = lambda x: x*x + >>> dill.load_module('foo_session.pkl', module=foo) + >>> [foo.sin(x) for x in foo.values] + [0.8414709848078965, 0.9092974268256817, 0.1411200080598672] + + *Changed in version 0.3.6:* Function ``load_session()`` was renamed to + ``load_module()``. Parameter ``main`` was renamed to ``module``. + + See also: + :py:func:`load_module_asdict` to load the contents of module saved + with :py:func:`dump_module` into a dictionary. + """ + if 'main' in kwds: + warnings.warn( + "The argument 'main' has been renamed 'module'.", + PendingDeprecationWarning + ) + if module is not None: + raise TypeError("both 'module' and 'main' arguments were used") + module = kwds.pop('main') + main = module + if hasattr(filename, 'read'): + file = filename + else: + if filename is None: + filename = str(TEMPDIR/'session.pkl') + file = open(filename, 'rb') + try: + file = _make_peekable(file) + #FIXME: dill.settings are disabled + unpickler = Unpickler(file, **kwds) + unpickler._session = True + + # Resolve unpickler._main + pickle_main = _identify_module(file, main) + if main is None and pickle_main is not None: + main = pickle_main + if isinstance(main, str): + if main.startswith('__runtime__.'): + # Create runtime module to load the session into. + main = ModuleType(main.partition('.')[-1]) + else: + main = _import_module(main) + if main is not None: + if not isinstance(main, ModuleType): + raise TypeError("%r is not a module" % main) + unpickler._main = main + else: + main = unpickler._main + + # Check against the pickle's main. + is_main_imported = _is_imported_module(main) + if pickle_main is not None: + is_runtime_mod = pickle_main.startswith('__runtime__.') + if is_runtime_mod: + pickle_main = pickle_main.partition('.')[-1] + error_msg = "can't update{} module{} %r with the saved state of{} module{} %r" + if is_runtime_mod and is_main_imported: + raise ValueError( + error_msg.format(" imported", "", "", "-type object") + % (main.__name__, pickle_main) + ) + if not is_runtime_mod and not is_main_imported: + raise ValueError( + error_msg.format("", "-type object", " imported", "") + % (pickle_main, main.__name__) + ) + if main.__name__ != pickle_main: + raise ValueError(error_msg.format("", "", "", "") % (main.__name__, pickle_main)) + + # This is for find_class() to be able to locate it. + if not is_main_imported: + runtime_main = '__runtime__.%s' % main.__name__ + sys.modules[runtime_main] = main + + loaded = unpickler.load() + finally: + if not hasattr(filename, 'read'): # if newly opened file + file.close() + try: + del sys.modules[runtime_main] + except (KeyError, NameError): + pass + assert loaded is main + _restore_modules(unpickler, main) + if main is _main_module or main is module: + return None + else: + return main + +# Backward compatibility. +def load_session(filename=None, main=None, **kwds): + warnings.warn("load_session() has been renamed load_module().", PendingDeprecationWarning) + load_module(filename, module=main, **kwds) +load_session.__doc__ = load_module.__doc__ + +def load_module_asdict( + filename: Union[str, os.PathLike] = None, + update: bool = False, + **kwds +) -> dict: + """ + Load the contents of a saved module into a dictionary. + + ``load_module_asdict()`` is the near-equivalent of:: + + lambda filename: vars(dill.load_module(filename)).copy() + + however, does not alter the original module. Also, the path of + the loaded module is stored in the ``__session__`` attribute. + + Args: + filename: a path-like object or a readable stream. If `None` + (the default), read from a named file in a temporary directory. + update: if `True`, initialize the dictionary with the current state + of the module prior to loading the state stored at filename. + **kwds: extra keyword arguments passed to :py:class:`Unpickler()` + + Raises: + :py:exc:`UnpicklingError`: if unpickling fails + + Returns: + A copy of the restored module's dictionary. + + Note: + If ``update`` is True, the corresponding module may first be imported + into the current namespace before the saved state is loaded from + filename to the dictionary. Note that any module that is imported into + the current namespace as a side-effect of using ``update`` will not be + modified by loading the saved module in filename to a dictionary. + + Example: + >>> import dill + >>> alist = [1, 2, 3] + >>> anum = 42 + >>> dill.dump_module() + >>> anum = 0 + >>> new_var = 'spam' + >>> main = dill.load_module_asdict() + >>> main['__name__'], main['__session__'] + ('__main__', '/tmp/session.pkl') + >>> main is globals() # loaded objects don't reference globals + False + >>> main['alist'] == alist + True + >>> main['alist'] is alist # was saved by value + False + >>> main['anum'] == anum # changed after the session was saved + False + >>> new_var in main # would be True if the option 'update' was set + False + """ + if 'module' in kwds: + raise TypeError("'module' is an invalid keyword argument for load_module_asdict()") + if hasattr(filename, 'read'): + file = filename + else: + if filename is None: + filename = str(TEMPDIR/'session.pkl') + file = open(filename, 'rb') + try: + file = _make_peekable(file) + main_name = _identify_module(file) + old_main = sys.modules.get(main_name) + main = ModuleType(main_name) + if update: + if old_main is None: + old_main = _import_module(main_name) + main.__dict__.update(old_main.__dict__) + else: + main.__builtins__ = __builtin__ + sys.modules[main_name] = main + load_module(file, **kwds) + finally: + if not hasattr(filename, 'read'): # if newly opened file + file.close() + try: + if old_main is None: + del sys.modules[main_name] + else: + sys.modules[main_name] = old_main + except NameError: # failed before setting old_main + pass + main.__session__ = str(filename) + return main.__dict__ + + +# Internal exports for backward compatibility with dill v0.3.5.1 +# Can't be placed in dill._dill because of circular import problems. +for name in ( + '_lookup_module', '_module_map', '_restore_modules', '_stash_modules', + 'dump_session', 'load_session' # backward compatibility functions +): + setattr(_dill, name, globals()[name]) +del name diff --git a/myenv/lib/python3.12/site-packages/dill/settings.py b/myenv/lib/python3.12/site-packages/dill/settings.py new file mode 100644 index 0000000..19c18fc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/settings.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +global settings for Pickler +""" + +from pickle import DEFAULT_PROTOCOL + +settings = { + #'main' : None, + 'protocol' : DEFAULT_PROTOCOL, + 'byref' : False, + #'strictio' : False, + 'fmode' : 0, #HANDLE_FMODE + 'recurse' : False, + 'ignore' : False, +} + +del DEFAULT_PROTOCOL + diff --git a/myenv/lib/python3.12/site-packages/dill/source.py b/myenv/lib/python3.12/site-packages/dill/source.py new file mode 100644 index 0000000..18bd875 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/source.py @@ -0,0 +1,1023 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +# +# inspired by inspect.py from Python-2.7.6 +# inspect.py author: 'Ka-Ping Yee ' +# inspect.py merged into original dill.source by Mike McKerns 4/13/14 +""" +Extensions to python's 'inspect' module, which can be used +to retrieve information from live python objects. The methods +defined in this module are augmented to facilitate access to +source code of interactively defined functions and classes, +as well as provide access to source code for objects defined +in a file. +""" + +__all__ = ['findsource', 'getsourcelines', 'getsource', 'indent', 'outdent', \ + '_wrap', 'dumpsource', 'getname', '_namespace', 'getimport', \ + '_importable', 'importable','isdynamic', 'isfrommain'] + +import linecache +import re +from inspect import (getblock, getfile, getmodule, getsourcefile, indentsize, + isbuiltin, isclass, iscode, isframe, isfunction, ismethod, + ismodule, istraceback) +from tokenize import TokenError + +from ._dill import IS_IPYTHON + + +def isfrommain(obj): + "check if object was built in __main__" + module = getmodule(obj) + if module and module.__name__ == '__main__': + return True + return False + + +def isdynamic(obj): + "check if object was built in the interpreter" + try: file = getfile(obj) + except TypeError: file = None + if file == '' and isfrommain(obj): + return True + return False + + +def _matchlambda(func, line): + """check if lambda object 'func' matches raw line of code 'line'""" + from .detect import code as getcode + from .detect import freevars, globalvars, varnames + dummy = lambda : '__this_is_a_big_dummy_function__' + # process the line (removing leading whitespace, etc) + lhs,rhs = line.split('lambda ',1)[-1].split(":", 1) #FIXME: if !1 inputs + try: #FIXME: unsafe + _ = eval("lambda %s : %s" % (lhs,rhs), globals(),locals()) + except Exception: _ = dummy + # get code objects, for comparison + _, code = getcode(_).co_code, getcode(func).co_code + # check if func is in closure + _f = [line.count(i) for i in freevars(func).keys()] + if not _f: # not in closure + # check if code matches + if _ == code: return True + return False + # weak check on freevars + if not all(_f): return False #XXX: VERY WEAK + # weak check on varnames and globalvars + _f = varnames(func) + _f = [line.count(i) for i in _f[0]+_f[1]] + if _f and not all(_f): return False #XXX: VERY WEAK + _f = [line.count(i) for i in globalvars(func).keys()] + if _f and not all(_f): return False #XXX: VERY WEAK + # check if func is a double lambda + if (line.count('lambda ') > 1) and (lhs in freevars(func).keys()): + _lhs,_rhs = rhs.split('lambda ',1)[-1].split(":",1) #FIXME: if !1 inputs + try: #FIXME: unsafe + _f = eval("lambda %s : %s" % (_lhs,_rhs), globals(),locals()) + except Exception: _f = dummy + # get code objects, for comparison + _, code = getcode(_f).co_code, getcode(func).co_code + if len(_) != len(code): return False + #NOTE: should be same code same order, but except for 't' and '\x88' + _ = set((i,j) for (i,j) in zip(_,code) if i != j) + if len(_) != 1: return False #('t','\x88') + return True + # check indentsize + if not indentsize(line): return False #FIXME: is this a good check??? + # check if code 'pattern' matches + #XXX: or pattern match against dis.dis(code)? (or use uncompyle2?) + _ = _.split(_[0]) # 't' #XXX: remove matching values if starts the same? + _f = code.split(code[0]) # '\x88' + #NOTE: should be same code different order, with different first element + _ = dict(re.match(r'([\W\D\S])(.*)', _[i]).groups() for i in range(1,len(_))) + _f = dict(re.match(r'([\W\D\S])(.*)', _f[i]).groups() for i in range(1,len(_f))) + if (_.keys() == _f.keys()) and (sorted(_.values()) == sorted(_f.values())): + return True + return False + + +def findsource(object): + """Return the entire source file and starting line number for an object. + For interactively-defined objects, the 'file' is the interpreter's history. + + The argument may be a module, class, method, function, traceback, frame, + or code object. The source code is returned as a list of all the lines + in the file and the line number indexes a line in that list. An IOError + is raised if the source code cannot be retrieved, while a TypeError is + raised for objects where the source code is unavailable (e.g. builtins).""" + + module = getmodule(object) + try: file = getfile(module) + except TypeError: file = None + is_module_main = (module and module.__name__ == '__main__' and not file) + if IS_IPYTHON and is_module_main: + #FIXME: quick fix for functions and classes in IPython interpreter + try: + file = getfile(object) + sourcefile = getsourcefile(object) + except TypeError: + if isclass(object): + for object_method in filter(isfunction, object.__dict__.values()): + # look for a method of the class + file_candidate = getfile(object_method) + if not file_candidate.startswith('': pat1 = r'(.*(?': + pat1 = r'(.*(?' + if stdin: + lnum = len(lines) - 1 # can't get lnum easily, so leverage pat + if not pat1: pat1 = r'^(\s*def\s)|(.*(? 0: #XXX: won't find decorators in ? + line = lines[lnum] + if pat1.match(line): + if not stdin: break # co_firstlineno does the job + if name == '': # hackery needed to confirm a match + if _matchlambda(obj, line): break + else: # not a lambda, just look for the name + if name in line: # need to check for decorator... + hats = 0 + for _lnum in range(lnum-1,-1,-1): + if pat2.match(lines[_lnum]): hats += 1 + else: break + lnum = lnum - hats + break + lnum = lnum - 1 + return lines, lnum + + try: # turn instances into classes + if not isclass(object) and isclass(type(object)): # __class__ + object = object.__class__ #XXX: sometimes type(class) is better? + #XXX: we don't find how the instance was built + except AttributeError: pass + if isclass(object): + name = object.__name__ + pat = re.compile(r'^(\s*)class\s*' + name + r'\b') + # make some effort to find the best matching class definition: + # use the one with the least indentation, which is the one + # that's most probably not inside a function definition. + candidates = [] + for i in range(len(lines)-1,-1,-1): + match = pat.match(lines[i]) + if match: + # if it's at toplevel, it's already the best one + if lines[i][0] == 'c': + return lines, i + # else add whitespace to candidate list + candidates.append((match.group(1), i)) + if candidates: + # this will sort by whitespace, and by line number, + # less whitespace first #XXX: should sort high lnum before low + candidates.sort() + return lines, candidates[0][1] + else: + raise IOError('could not find class definition') + raise IOError('could not find code object') + + +def getblocks(object, lstrip=False, enclosing=False, locate=False): + """Return a list of source lines and starting line number for an object. + Interactively-defined objects refer to lines in the interpreter's history. + + If enclosing=True, then also return any enclosing code. + If lstrip=True, ensure there is no indentation in the first line of code. + If locate=True, then also return the line number for the block of code. + + DEPRECATED: use 'getsourcelines' instead + """ + lines, lnum = findsource(object) + + if ismodule(object): + if lstrip: lines = _outdent(lines) + return ([lines], [0]) if locate is True else [lines] + + #XXX: 'enclosing' means: closures only? or classes and files? + indent = indentsize(lines[lnum]) + block = getblock(lines[lnum:]) #XXX: catch any TokenError here? + + if not enclosing or not indent: + if lstrip: block = _outdent(block) + return ([block], [lnum]) if locate is True else [block] + + pat1 = r'^(\s*def\s)|(.*(? indent: #XXX: should be >= ? + line += len(code) - skip + elif target in ''.join(code): + blocks.append(code) # save code block as the potential winner + _lnum.append(line - skip) # save the line number for the match + line += len(code) - skip + else: + line += 1 + skip = 0 + # find skip: the number of consecutive decorators + elif pat2.match(lines[line]): + try: code = getblock(lines[line:]) + except TokenError: code = [lines[line]] + skip = 1 + for _line in code[1:]: # skip lines that are decorators + if not pat2.match(_line): break + skip += 1 + line += skip + # no match: reset skip and go to the next line + else: + line +=1 + skip = 0 + + if not blocks: + blocks = [block] + _lnum = [lnum] + if lstrip: blocks = [_outdent(block) for block in blocks] + # return last match + return (blocks, _lnum) if locate is True else blocks + + +def getsourcelines(object, lstrip=False, enclosing=False): + """Return a list of source lines and starting line number for an object. + Interactively-defined objects refer to lines in the interpreter's history. + + The argument may be a module, class, method, function, traceback, frame, + or code object. The source code is returned as a list of the lines + corresponding to the object and the line number indicates where in the + original source file the first line of code was found. An IOError is + raised if the source code cannot be retrieved, while a TypeError is + raised for objects where the source code is unavailable (e.g. builtins). + + If lstrip=True, ensure there is no indentation in the first line of code. + If enclosing=True, then also return any enclosing code.""" + code, n = getblocks(object, lstrip=lstrip, enclosing=enclosing, locate=True) + return code[-1], n[-1] + + +#NOTE: broke backward compatibility 4/16/14 (was lstrip=True, force=True) +def getsource(object, alias='', lstrip=False, enclosing=False, \ + force=False, builtin=False): + """Return the text of the source code for an object. The source code for + interactively-defined objects are extracted from the interpreter's history. + + The argument may be a module, class, method, function, traceback, frame, + or code object. The source code is returned as a single string. An + IOError is raised if the source code cannot be retrieved, while a + TypeError is raised for objects where the source code is unavailable + (e.g. builtins). + + If alias is provided, then add a line of code that renames the object. + If lstrip=True, ensure there is no indentation in the first line of code. + If enclosing=True, then also return any enclosing code. + If force=True, catch (TypeError,IOError) and try to use import hooks. + If builtin=True, force an import for any builtins + """ + # hascode denotes a callable + hascode = _hascode(object) + # is a class instance type (and not in builtins) + instance = _isinstance(object) + + # get source lines; if fail, try to 'force' an import + try: # fails for builtins, and other assorted object types + lines, lnum = getsourcelines(object, enclosing=enclosing) + except (TypeError, IOError): # failed to get source, resort to import hooks + if not force: # don't try to get types that findsource can't get + raise + if not getmodule(object): # get things like 'None' and '1' + if not instance: return getimport(object, alias, builtin=builtin) + # special handling (numpy arrays, ...) + _import = getimport(object, builtin=builtin) + name = getname(object, force=True) + _alias = "%s = " % alias if alias else "" + if alias == name: _alias = "" + return _import+_alias+"%s\n" % name + else: #FIXME: could use a good bit of cleanup, since using getimport... + if not instance: return getimport(object, alias, builtin=builtin) + # now we are dealing with an instance... + name = object.__class__.__name__ + module = object.__module__ + if module in ['builtins','__builtin__']: + return getimport(object, alias, builtin=builtin) + else: #FIXME: leverage getimport? use 'from module import name'? + lines, lnum = ["%s = __import__('%s', fromlist=['%s']).%s\n" % (name,module,name,name)], 0 + obj = eval(lines[0].lstrip(name + ' = ')) + lines, lnum = getsourcelines(obj, enclosing=enclosing) + + # strip leading indent (helps ensure can be imported) + if lstrip or alias: + lines = _outdent(lines) + + # instantiate, if there's a nice repr #XXX: BAD IDEA??? + if instance: #and force: #XXX: move into findsource or getsourcelines ? + if '(' in repr(object): lines.append('%r\n' % object) + #else: #XXX: better to somehow to leverage __reduce__ ? + # reconstructor,args = object.__reduce__() + # _ = reconstructor(*args) + else: # fall back to serialization #XXX: bad idea? + #XXX: better not duplicate work? #XXX: better new/enclose=True? + lines = dumpsource(object, alias='', new=force, enclose=False) + lines, lnum = [line+'\n' for line in lines.split('\n')][:-1], 0 + #else: object.__code__ # raise AttributeError + + # add an alias to the source code + if alias: + if hascode: + skip = 0 + for line in lines: # skip lines that are decorators + if not line.startswith('@'): break + skip += 1 + #XXX: use regex from findsource / getsourcelines ? + if lines[skip].lstrip().startswith('def '): # we have a function + if alias != object.__name__: + lines.append('\n%s = %s\n' % (alias, object.__name__)) + elif 'lambda ' in lines[skip]: # we have a lambda + if alias != lines[skip].split('=')[0].strip(): + lines[skip] = '%s = %s' % (alias, lines[skip]) + else: # ...try to use the object's name + if alias != object.__name__: + lines.append('\n%s = %s\n' % (alias, object.__name__)) + else: # class or class instance + if instance: + if alias != lines[-1].split('=')[0].strip(): + lines[-1] = ('%s = ' % alias) + lines[-1] + else: + name = getname(object, force=True) or object.__name__ + if alias != name: + lines.append('\n%s = %s\n' % (alias, name)) + return ''.join(lines) + + +def _hascode(object): + '''True if object has an attribute that stores it's __code__''' + return getattr(object,'__code__',None) or getattr(object,'func_code',None) + +def _isinstance(object): + '''True if object is a class instance type (and is not a builtin)''' + if _hascode(object) or isclass(object) or ismodule(object): + return False + if istraceback(object) or isframe(object) or iscode(object): + return False + # special handling (numpy arrays, ...) + if not getmodule(object) and getmodule(type(object)).__name__ in ['numpy']: + return True +# # check if is instance of a builtin +# if not getmodule(object) and getmodule(type(object)).__name__ in ['__builtin__','builtins']: +# return False + _types = ('") + if not repr(type(object)).startswith(_types): #FIXME: weak hack + return False + if not getmodule(object) or object.__module__ in ['builtins','__builtin__'] or getname(object, force=True) in ['array']: + return False + return True # by process of elimination... it's what we want + + +def _intypes(object): + '''check if object is in the 'types' module''' + import types + # allow user to pass in object or object.__name__ + if type(object) is not type(''): + object = getname(object, force=True) + if object == 'ellipsis': object = 'EllipsisType' + return True if hasattr(types, object) else False + + +def _isstring(object): #XXX: isstringlike better? + '''check if object is a string-like type''' + return isinstance(object, (str, bytes)) + + +def indent(code, spaces=4): + '''indent a block of code with whitespace (default is 4 spaces)''' + indent = indentsize(code) + from numbers import Integral + if isinstance(spaces, Integral): spaces = ' '*spaces + # if '\t' is provided, will indent with a tab + nspaces = indentsize(spaces) + # blank lines (etc) need to be ignored + lines = code.split('\n') +## stq = "'''"; dtq = '"""' +## in_stq = in_dtq = False + for i in range(len(lines)): + #FIXME: works... but shouldn't indent 2nd+ lines of multiline doc + _indent = indentsize(lines[i]) + if indent > _indent: continue + lines[i] = spaces+lines[i] +## #FIXME: may fail when stq and dtq in same line (depends on ordering) +## nstq, ndtq = lines[i].count(stq), lines[i].count(dtq) +## if not in_dtq and not in_stq: +## lines[i] = spaces+lines[i] # we indent +## # entering a comment block +## if nstq%2: in_stq = not in_stq +## if ndtq%2: in_dtq = not in_dtq +## # leaving a comment block +## elif in_dtq and ndtq%2: in_dtq = not in_dtq +## elif in_stq and nstq%2: in_stq = not in_stq +## else: pass + if lines[-1].strip() == '': lines[-1] = '' + return '\n'.join(lines) + + +def _outdent(lines, spaces=None, all=True): + '''outdent lines of code, accounting for docs and line continuations''' + indent = indentsize(lines[0]) + if spaces is None or spaces > indent or spaces < 0: spaces = indent + for i in range(len(lines) if all else 1): + #FIXME: works... but shouldn't outdent 2nd+ lines of multiline doc + _indent = indentsize(lines[i]) + if spaces > _indent: _spaces = _indent + else: _spaces = spaces + lines[i] = lines[i][_spaces:] + return lines + +def outdent(code, spaces=None, all=True): + '''outdent a block of code (default is to strip all leading whitespace)''' + indent = indentsize(code) + if spaces is None or spaces > indent or spaces < 0: spaces = indent + #XXX: will this delete '\n' in some cases? + if not all: return code[spaces:] + return '\n'.join(_outdent(code.split('\n'), spaces=spaces, all=all)) + + +# _wrap provides an wrapper to correctly exec and load into locals +__globals__ = globals() +__locals__ = locals() +def _wrap(f): + """ encapsulate a function and it's __import__ """ + def func(*args, **kwds): + try: + # _ = eval(getsource(f, force=True)) #XXX: safer but less robust + exec(getimportable(f, alias='_'), __globals__, __locals__) + except Exception: + raise ImportError('cannot import name ' + f.__name__) + return _(*args, **kwds) + func.__name__ = f.__name__ + func.__doc__ = f.__doc__ + return func + + +def _enclose(object, alias=''): #FIXME: needs alias to hold returned object + """create a function enclosure around the source of some object""" + #XXX: dummy and stub should append a random string + dummy = '__this_is_a_big_dummy_enclosing_function__' + stub = '__this_is_a_stub_variable__' + code = 'def %s():\n' % dummy + code += indent(getsource(object, alias=stub, lstrip=True, force=True)) + code += indent('return %s\n' % stub) + if alias: code += '%s = ' % alias + code += '%s(); del %s\n' % (dummy, dummy) + #code += "globals().pop('%s',lambda :None)()\n" % dummy + return code + + +def dumpsource(object, alias='', new=False, enclose=True): + """'dump to source', where the code includes a pickled object. + + If new=True and object is a class instance, then create a new + instance using the unpacked class source code. If enclose, then + create the object inside a function enclosure (thus minimizing + any global namespace pollution). + """ + from dill import dumps + pik = repr(dumps(object)) + code = 'import dill\n' + if enclose: + stub = '__this_is_a_stub_variable__' #XXX: *must* be same _enclose.stub + pre = '%s = ' % stub + new = False #FIXME: new=True doesn't work with enclose=True + else: + stub = alias + pre = '%s = ' % stub if alias else alias + + # if a 'new' instance is not needed, then just dump and load + if not new or not _isinstance(object): + code += pre + 'dill.loads(%s)\n' % pik + else: #XXX: other cases where source code is needed??? + code += getsource(object.__class__, alias='', lstrip=True, force=True) + mod = repr(object.__module__) # should have a module (no builtins here) + code += pre + 'dill.loads(%s.replace(b%s,bytes(__name__,"UTF-8")))\n' % (pik,mod) + #code += 'del %s' % object.__class__.__name__ #NOTE: kills any existing! + + if enclose: + # generation of the 'enclosure' + dummy = '__this_is_a_big_dummy_object__' + dummy = _enclose(dummy, alias=alias) + # hack to replace the 'dummy' with the 'real' code + dummy = dummy.split('\n') + code = dummy[0]+'\n' + indent(code) + '\n'.join(dummy[-3:]) + + return code #XXX: better 'dumpsourcelines', returning list of lines? + + +def getname(obj, force=False, fqn=False): #XXX: throw(?) to raise error on fail? + """get the name of the object. for lambdas, get the name of the pointer """ + if fqn: return '.'.join(_namespace(obj)) #NOTE: returns 'type' + module = getmodule(obj) + if not module: # things like "None" and "1" + if not force: return None #NOTE: returns 'instance' NOT 'type' #FIXME? + # handle some special cases + if hasattr(obj, 'dtype') and not obj.shape: + return getname(obj.__class__) + "(" + repr(obj.tolist()) + ")" + return repr(obj) + try: + #XXX: 'wrong' for decorators and curried functions ? + # if obj.func_closure: ...use logic from getimportable, etc ? + name = obj.__name__ + if name == '': + return getsource(obj).split('=',1)[0].strip() + # handle some special cases + if module.__name__ in ['builtins','__builtin__']: + if name == 'ellipsis': name = 'EllipsisType' + return name + except AttributeError: #XXX: better to just throw AttributeError ? + if not force: return None + name = repr(obj) + if name.startswith('<'): # or name.split('('): + return None + return name + + +def _namespace(obj): + """_namespace(obj); return namespace hierarchy (as a list of names) + for the given object. For an instance, find the class hierarchy. + + For example: + + >>> from functools import partial + >>> p = partial(int, base=2) + >>> _namespace(p) + [\'functools\', \'partial\'] + """ + # mostly for functions and modules and such + #FIXME: 'wrong' for decorators and curried functions + try: #XXX: needs some work and testing on different types + module = qual = str(getmodule(obj)).split()[1].strip('>').strip('"').strip("'") + qual = qual.split('.') + if ismodule(obj): + return qual + # get name of a lambda, function, etc + name = getname(obj) or obj.__name__ # failing, raise AttributeError + # check special cases (NoneType, ...) + if module in ['builtins','__builtin__']: # BuiltinFunctionType + if _intypes(name): return ['types'] + [name] + return qual + [name] #XXX: can be wrong for some aliased objects + except Exception: pass + # special case: numpy.inf and numpy.nan (we don't want them as floats) + if str(obj) in ['inf','nan','Inf','NaN']: # is more, but are they needed? + return ['numpy'] + [str(obj)] + # mostly for classes and class instances and such + module = getattr(obj.__class__, '__module__', None) + qual = str(obj.__class__) + try: qual = qual[qual.index("'")+1:-2] + except ValueError: pass # str(obj.__class__) made the 'try' unnecessary + qual = qual.split(".") + if module in ['builtins','__builtin__']: + # check special cases (NoneType, Ellipsis, ...) + if qual[-1] == 'ellipsis': qual[-1] = 'EllipsisType' + if _intypes(qual[-1]): module = 'types' #XXX: BuiltinFunctionType + qual = [module] + qual + return qual + + +#NOTE: 05/25/14 broke backward compatibility: added 'alias' as 3rd argument +def _getimport(head, tail, alias='', verify=True, builtin=False): + """helper to build a likely import string from head and tail of namespace. + ('head','tail') are used in the following context: "from head import tail" + + If verify=True, then test the import string before returning it. + If builtin=True, then force an import for builtins where possible. + If alias is provided, then rename the object on import. + """ + # special handling for a few common types + if tail in ['Ellipsis', 'NotImplemented'] and head in ['types']: + head = len.__module__ + elif tail in ['None'] and head in ['types']: + _alias = '%s = ' % alias if alias else '' + if alias == tail: _alias = '' + return _alias+'%s\n' % tail + # we don't need to import from builtins, so return '' +# elif tail in ['NoneType','int','float','long','complex']: return '' #XXX: ? + if head in ['builtins','__builtin__']: + # special cases (NoneType, Ellipsis, ...) #XXX: BuiltinFunctionType + if tail == 'ellipsis': tail = 'EllipsisType' + if _intypes(tail): head = 'types' + elif not builtin: + _alias = '%s = ' % alias if alias else '' + if alias == tail: _alias = '' + return _alias+'%s\n' % tail + else: pass # handle builtins below + # get likely import string + if not head: _str = "import %s" % tail + else: _str = "from %s import %s" % (head, tail) + _alias = " as %s\n" % alias if alias else "\n" + if alias == tail: _alias = "\n" + _str += _alias + # FIXME: fails on most decorators, currying, and such... + # (could look for magic __wrapped__ or __func__ attr) + # (could fix in 'namespace' to check obj for closure) + if verify and not head.startswith('dill.'):# weird behavior for dill + #print(_str) + try: exec(_str) #XXX: check if == obj? (name collision) + except ImportError: #XXX: better top-down or bottom-up recursion? + _head = head.rsplit(".",1)[0] #(or get all, then compare == obj?) + if not _head: raise + if _head != head: + _str = _getimport(_head, tail, alias, verify) + return _str + + +#XXX: rename builtin to force? vice versa? verify to force? (as in getsource) +#NOTE: 05/25/14 broke backward compatibility: added 'alias' as 2nd argument +def getimport(obj, alias='', verify=True, builtin=False, enclosing=False): + """get the likely import string for the given object + + obj is the object to inspect + If verify=True, then test the import string before returning it. + If builtin=True, then force an import for builtins where possible. + If enclosing=True, get the import for the outermost enclosing callable. + If alias is provided, then rename the object on import. + """ + if enclosing: + from .detect import outermost + _obj = outermost(obj) + obj = _obj if _obj else obj + # get the namespace + qual = _namespace(obj) + head = '.'.join(qual[:-1]) + tail = qual[-1] + # for named things... with a nice repr #XXX: move into _namespace? + try: # look for '<...>' and be mindful it might be in lists, dicts, etc... + name = repr(obj).split('<',1)[1].split('>',1)[1] + name = None # we have a 'object'-style repr + except Exception: # it's probably something 'importable' + if head in ['builtins','__builtin__']: + name = repr(obj) #XXX: catch [1,2], (1,2), set([1,2])... others? + elif _isinstance(obj): + name = getname(obj, force=True).split('(')[0] + else: + name = repr(obj).split('(')[0] + #if not repr(obj).startswith('<'): name = repr(obj).split('(')[0] + #else: name = None + if name: # try using name instead of tail + try: return _getimport(head, name, alias, verify, builtin) + except ImportError: pass + except SyntaxError: + if head in ['builtins','__builtin__']: + _alias = '%s = ' % alias if alias else '' + if alias == name: _alias = '' + return _alias+'%s\n' % name + else: pass + try: + #if type(obj) is type(abs): _builtin = builtin # BuiltinFunctionType + #else: _builtin = False + return _getimport(head, tail, alias, verify, builtin) + except ImportError: + raise # could do some checking against obj + except SyntaxError: + if head in ['builtins','__builtin__']: + _alias = '%s = ' % alias if alias else '' + if alias == tail: _alias = '' + return _alias+'%s\n' % tail + raise # could do some checking against obj + + +def _importable(obj, alias='', source=None, enclosing=False, force=True, \ + builtin=True, lstrip=True): + """get an import string (or the source code) for the given object + + This function will attempt to discover the name of the object, or the repr + of the object, or the source code for the object. To attempt to force + discovery of the source code, use source=True, to attempt to force the + use of an import, use source=False; otherwise an import will be sought + for objects not defined in __main__. The intent is to build a string + that can be imported from a python file. obj is the object to inspect. + If alias is provided, then rename the object with the given alias. + + If source=True, use these options: + If enclosing=True, then also return any enclosing code. + If force=True, catch (TypeError,IOError) and try to use import hooks. + If lstrip=True, ensure there is no indentation in the first line of code. + + If source=False, use these options: + If enclosing=True, get the import for the outermost enclosing callable. + If force=True, then don't test the import string before returning it. + If builtin=True, then force an import for builtins where possible. + """ + if source is None: + source = True if isfrommain(obj) else False + if source: # first try to get the source + try: + return getsource(obj, alias, enclosing=enclosing, \ + force=force, lstrip=lstrip, builtin=builtin) + except Exception: pass + try: + if not _isinstance(obj): + return getimport(obj, alias, enclosing=enclosing, \ + verify=(not force), builtin=builtin) + # first 'get the import', then 'get the instance' + _import = getimport(obj, enclosing=enclosing, \ + verify=(not force), builtin=builtin) + name = getname(obj, force=True) + if not name: + raise AttributeError("object has no atribute '__name__'") + _alias = "%s = " % alias if alias else "" + if alias == name: _alias = "" + return _import+_alias+"%s\n" % name + + except Exception: pass + if not source: # try getsource, only if it hasn't been tried yet + try: + return getsource(obj, alias, enclosing=enclosing, \ + force=force, lstrip=lstrip, builtin=builtin) + except Exception: pass + # get the name (of functions, lambdas, and classes) + # or hope that obj can be built from the __repr__ + #XXX: what to do about class instances and such? + obj = getname(obj, force=force) + # we either have __repr__ or __name__ (or None) + if not obj or obj.startswith('<'): + raise AttributeError("object has no atribute '__name__'") + _alias = '%s = ' % alias if alias else '' + if alias == obj: _alias = '' + return _alias+'%s\n' % obj + #XXX: possible failsafe... (for example, for instances when source=False) + # "import dill; result = dill.loads(); # repr()" + +def _closuredimport(func, alias='', builtin=False): + """get import for closured objects; return a dict of 'name' and 'import'""" + import re + from .detect import freevars, outermost + free_vars = freevars(func) + func_vars = {} + # split into 'funcs' and 'non-funcs' + for name,obj in list(free_vars.items()): + if not isfunction(obj): continue + # get import for 'funcs' + fobj = free_vars.pop(name) + src = getsource(fobj) + if src.lstrip().startswith('@'): # we have a decorator + src = getimport(fobj, alias=alias, builtin=builtin) + else: # we have to "hack" a bit... and maybe be lucky + encl = outermost(func) + # pattern: 'func = enclosing(fobj' + pat = r'.*[\w\s]=\s*'+getname(encl)+r'\('+getname(fobj) + mod = getname(getmodule(encl)) + #HACK: get file containing 'outer' function; is func there? + lines,_ = findsource(encl) + candidate = [line for line in lines if getname(encl) in line and \ + re.match(pat, line)] + if not candidate: + mod = getname(getmodule(fobj)) + #HACK: get file containing 'inner' function; is func there? + lines,_ = findsource(fobj) + candidate = [line for line in lines \ + if getname(fobj) in line and re.match(pat, line)] + if not len(candidate): raise TypeError('import could not be found') + candidate = candidate[-1] + name = candidate.split('=',1)[0].split()[-1].strip() + src = _getimport(mod, name, alias=alias, builtin=builtin) + func_vars[name] = src + if not func_vars: + name = outermost(func) + mod = getname(getmodule(name)) + if not mod or name is func: # then it can be handled by getimport + name = getname(func, force=True) #XXX: better key? + src = getimport(func, alias=alias, builtin=builtin) + else: + lines,_ = findsource(name) + # pattern: 'func = enclosing(' + candidate = [line for line in lines if getname(name) in line and \ + re.match(r'.*[\w\s]=\s*'+getname(name)+r'\(', line)] + if not len(candidate): raise TypeError('import could not be found') + candidate = candidate[-1] + name = candidate.split('=',1)[0].split()[-1].strip() + src = _getimport(mod, name, alias=alias, builtin=builtin) + func_vars[name] = src + return func_vars + +#XXX: should be able to use __qualname__ +def _closuredsource(func, alias=''): + """get source code for closured objects; return a dict of 'name' + and 'code blocks'""" + #FIXME: this entire function is a messy messy HACK + # - pollutes global namespace + # - fails if name of freevars are reused + # - can unnecessarily duplicate function code + from .detect import freevars + free_vars = freevars(func) + func_vars = {} + # split into 'funcs' and 'non-funcs' + for name,obj in list(free_vars.items()): + if not isfunction(obj): + # get source for 'non-funcs' + free_vars[name] = getsource(obj, force=True, alias=name) + continue + # get source for 'funcs' + fobj = free_vars.pop(name) + src = getsource(fobj, alias) # DO NOT include dependencies + # if source doesn't start with '@', use name as the alias + if not src.lstrip().startswith('@'): #FIXME: 'enclose' in dummy; + src = importable(fobj,alias=name)# wrong ref 'name' + org = getsource(func, alias, enclosing=False, lstrip=True) + src = (src, org) # undecorated first, then target + else: #NOTE: reproduces the code! + org = getsource(func, enclosing=True, lstrip=False) + src = importable(fobj, alias, source=True) # include dependencies + src = (org, src) # target first, then decorated + func_vars[name] = src + src = ''.join(free_vars.values()) + if not func_vars: #FIXME: 'enclose' in dummy; wrong ref 'name' + org = getsource(func, alias, force=True, enclosing=False, lstrip=True) + src = (src, org) # variables first, then target + else: + src = (src, None) # just variables (better '' instead of None?) + func_vars[None] = src + # FIXME: remove duplicates (however, order is important...) + return func_vars + +def importable(obj, alias='', source=None, builtin=True): + """get an importable string (i.e. source code or the import string) + for the given object, including any required objects from the enclosing + and global scope + + This function will attempt to discover the name of the object, or the repr + of the object, or the source code for the object. To attempt to force + discovery of the source code, use source=True, to attempt to force the + use of an import, use source=False; otherwise an import will be sought + for objects not defined in __main__. The intent is to build a string + that can be imported from a python file. + + obj is the object to inspect. If alias is provided, then rename the + object with the given alias. If builtin=True, then force an import for + builtins where possible. + """ + #NOTE: we always 'force', and 'lstrip' as necessary + #NOTE: for 'enclosing', use importable(outermost(obj)) + if source is None: + source = True if isfrommain(obj) else False + elif builtin and isbuiltin(obj): + source = False + tried_source = tried_import = False + while True: + if not source: # we want an import + try: + if _isinstance(obj): # for instances, punt to _importable + return _importable(obj, alias, source=False, builtin=builtin) + src = _closuredimport(obj, alias=alias, builtin=builtin) + if len(src) == 0: + raise NotImplementedError('not implemented') + if len(src) > 1: + raise NotImplementedError('not implemented') + return list(src.values())[0] + except Exception: + if tried_source: raise + tried_import = True + # we want the source + try: + src = _closuredsource(obj, alias=alias) + if len(src) == 0: + raise NotImplementedError('not implemented') + # groan... an inline code stitcher + def _code_stitcher(block): + "stitch together the strings in tuple 'block'" + if block[0] and block[-1]: block = '\n'.join(block) + elif block[0]: block = block[0] + elif block[-1]: block = block[-1] + else: block = '' + return block + # get free_vars first + _src = _code_stitcher(src.pop(None)) + _src = [_src] if _src else [] + # get func_vars + for xxx in src.values(): + xxx = _code_stitcher(xxx) + if xxx: _src.append(xxx) + # make a single source string + if not len(_src): + src = '' + elif len(_src) == 1: + src = _src[0] + else: + src = '\n'.join(_src) + # get source code of objects referred to by obj in global scope + from .detect import globalvars + obj = globalvars(obj) #XXX: don't worry about alias? recurse? etc? + obj = list(getsource(_obj,name,force=True) for (name,_obj) in obj.items() if not isbuiltin(_obj)) + obj = '\n'.join(obj) if obj else '' + # combine all referred-to source (global then enclosing) + if not obj: return src + if not src: return obj + return obj + src + except Exception: + if tried_import: raise + tried_source = True + source = not source + # should never get here + return + + +# backward compatibility +def getimportable(obj, alias='', byname=True, explicit=False): + return importable(obj,alias,source=(not byname),builtin=explicit) + #return outdent(_importable(obj,alias,source=(not byname),builtin=explicit)) +def likely_import(obj, passive=False, explicit=False): + return getimport(obj, verify=(not passive), builtin=explicit) +def _likely_import(first, last, passive=False, explicit=True): + return _getimport(first, last, verify=(not passive), builtin=explicit) +_get_name = getname +getblocks_from_history = getblocks + + + +# EOF diff --git a/myenv/lib/python3.12/site-packages/dill/temp.py b/myenv/lib/python3.12/site-packages/dill/temp.py new file mode 100644 index 0000000..c4d7165 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/temp.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +Methods for serialized objects (or source code) stored in temporary files +and file-like objects. +""" +#XXX: better instead to have functions write to any given file-like object ? +#XXX: currently, all file-like objects are created by the function... + +__all__ = ['dump_source', 'dump', 'dumpIO_source', 'dumpIO',\ + 'load_source', 'load', 'loadIO_source', 'loadIO',\ + 'capture'] + +import contextlib + + +@contextlib.contextmanager +def capture(stream='stdout'): + """builds a context that temporarily replaces the given stream name + + >>> with capture('stdout') as out: + ... print ("foo!") + ... + >>> print (out.getvalue()) + foo! + + """ + import sys + from io import StringIO + orig = getattr(sys, stream) + setattr(sys, stream, StringIO()) + try: + yield getattr(sys, stream) + finally: + setattr(sys, stream, orig) + + +def b(x): # deal with b'foo' versus 'foo' + import codecs + return codecs.latin_1_encode(x)[0] + +def load_source(file, **kwds): + """load an object that was stored with dill.temp.dump_source + + file: filehandle + alias: string name of stored object + mode: mode to open the file, one of: {'r', 'rb'} + + >>> f = lambda x: x**2 + >>> pyfile = dill.temp.dump_source(f, alias='_f') + >>> _f = dill.temp.load_source(pyfile) + >>> _f(4) + 16 + """ + alias = kwds.pop('alias', None) + mode = kwds.pop('mode', 'r') + fname = getattr(file, 'name', file) # fname=file.name or fname=file (if str) + source = open(fname, mode=mode, **kwds).read() + if not alias: + tag = source.strip().splitlines()[-1].split() + if tag[0] != '#NAME:': + stub = source.splitlines()[0] + raise IOError("unknown name for code: %s" % stub) + alias = tag[-1] + local = {} + exec(source, local) + _ = eval("%s" % alias, local) + return _ + +def dump_source(object, **kwds): + """write object source to a NamedTemporaryFile (instead of dill.dump) +Loads with "import" or "dill.temp.load_source". Returns the filehandle. + + >>> f = lambda x: x**2 + >>> pyfile = dill.temp.dump_source(f, alias='_f') + >>> _f = dill.temp.load_source(pyfile) + >>> _f(4) + 16 + + >>> f = lambda x: x**2 + >>> pyfile = dill.temp.dump_source(f, dir='.') + >>> modulename = os.path.basename(pyfile.name).split('.py')[0] + >>> exec('from %s import f as _f' % modulename) + >>> _f(4) + 16 + +Optional kwds: + If 'alias' is specified, the object will be renamed to the given string. + + If 'prefix' is specified, the file name will begin with that prefix, + otherwise a default prefix is used. + + If 'dir' is specified, the file will be created in that directory, + otherwise a default directory is used. + + If 'text' is specified and true, the file is opened in text + mode. Else (the default) the file is opened in binary mode. On + some operating systems, this makes no difference. + +NOTE: Keep the return value for as long as you want your file to exist ! + """ #XXX: write a "load_source"? + from .source import importable, getname + import tempfile + kwds.setdefault('delete', True) + kwds.pop('suffix', '') # this is *always* '.py' + alias = kwds.pop('alias', '') #XXX: include an alias so a name is known + name = str(alias) or getname(object) + name = "\n#NAME: %s\n" % name + #XXX: assumes kwds['dir'] is writable and on $PYTHONPATH + file = tempfile.NamedTemporaryFile(suffix='.py', **kwds) + file.write(b(''.join([importable(object, alias=alias),name]))) + file.flush() + return file + +def load(file, **kwds): + """load an object that was stored with dill.temp.dump + + file: filehandle + mode: mode to open the file, one of: {'r', 'rb'} + + >>> dumpfile = dill.temp.dump([1, 2, 3, 4, 5]) + >>> dill.temp.load(dumpfile) + [1, 2, 3, 4, 5] + """ + import dill as pickle + mode = kwds.pop('mode', 'rb') + name = getattr(file, 'name', file) # name=file.name or name=file (if str) + return pickle.load(open(name, mode=mode, **kwds)) + +def dump(object, **kwds): + """dill.dump of object to a NamedTemporaryFile. +Loads with "dill.temp.load". Returns the filehandle. + + >>> dumpfile = dill.temp.dump([1, 2, 3, 4, 5]) + >>> dill.temp.load(dumpfile) + [1, 2, 3, 4, 5] + +Optional kwds: + If 'suffix' is specified, the file name will end with that suffix, + otherwise there will be no suffix. + + If 'prefix' is specified, the file name will begin with that prefix, + otherwise a default prefix is used. + + If 'dir' is specified, the file will be created in that directory, + otherwise a default directory is used. + + If 'text' is specified and true, the file is opened in text + mode. Else (the default) the file is opened in binary mode. On + some operating systems, this makes no difference. + +NOTE: Keep the return value for as long as you want your file to exist ! + """ + import dill as pickle + import tempfile + kwds.setdefault('delete', True) + file = tempfile.NamedTemporaryFile(**kwds) + pickle.dump(object, file) + file.flush() + return file + +def loadIO(buffer, **kwds): + """load an object that was stored with dill.temp.dumpIO + + buffer: buffer object + + >>> dumpfile = dill.temp.dumpIO([1, 2, 3, 4, 5]) + >>> dill.temp.loadIO(dumpfile) + [1, 2, 3, 4, 5] + """ + import dill as pickle + from io import BytesIO as StringIO + value = getattr(buffer, 'getvalue', buffer) # value or buffer.getvalue + if value != buffer: value = value() # buffer.getvalue() + return pickle.load(StringIO(value)) + +def dumpIO(object, **kwds): + """dill.dump of object to a buffer. +Loads with "dill.temp.loadIO". Returns the buffer object. + + >>> dumpfile = dill.temp.dumpIO([1, 2, 3, 4, 5]) + >>> dill.temp.loadIO(dumpfile) + [1, 2, 3, 4, 5] + """ + import dill as pickle + from io import BytesIO as StringIO + file = StringIO() + pickle.dump(object, file) + file.flush() + return file + +def loadIO_source(buffer, **kwds): + """load an object that was stored with dill.temp.dumpIO_source + + buffer: buffer object + alias: string name of stored object + + >>> f = lambda x:x**2 + >>> pyfile = dill.temp.dumpIO_source(f, alias='_f') + >>> _f = dill.temp.loadIO_source(pyfile) + >>> _f(4) + 16 + """ + alias = kwds.pop('alias', None) + source = getattr(buffer, 'getvalue', buffer) # source or buffer.getvalue + if source != buffer: source = source() # buffer.getvalue() + source = source.decode() # buffer to string + if not alias: + tag = source.strip().splitlines()[-1].split() + if tag[0] != '#NAME:': + stub = source.splitlines()[0] + raise IOError("unknown name for code: %s" % stub) + alias = tag[-1] + local = {} + exec(source, local) + _ = eval("%s" % alias, local) + return _ + +def dumpIO_source(object, **kwds): + """write object source to a buffer (instead of dill.dump) +Loads by with dill.temp.loadIO_source. Returns the buffer object. + + >>> f = lambda x:x**2 + >>> pyfile = dill.temp.dumpIO_source(f, alias='_f') + >>> _f = dill.temp.loadIO_source(pyfile) + >>> _f(4) + 16 + +Optional kwds: + If 'alias' is specified, the object will be renamed to the given string. + """ + from .source import importable, getname + from io import BytesIO as StringIO + alias = kwds.pop('alias', '') #XXX: include an alias so a name is known + name = str(alias) or getname(object) + name = "\n#NAME: %s\n" % name + #XXX: assumes kwds['dir'] is writable and on $PYTHONPATH + file = StringIO() + file.write(b(''.join([importable(object, alias=alias),name]))) + file.flush() + return file + + +del contextlib + + +# EOF diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__init__.py b/myenv/lib/python3.12/site-packages/dill/tests/__init__.py new file mode 100644 index 0000000..3fbec38 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/__init__.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2018-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +to run this test suite, first build and install `dill`. + + $ python -m pip install ../.. + + +then run the tests with: + + $ python -m dill.tests + + +or, if `nose` is installed: + + $ nosetests + +""" diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__main__.py b/myenv/lib/python3.12/site-packages/dill/tests/__main__.py new file mode 100644 index 0000000..b84d24c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/__main__.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2018-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import glob +import os +import sys +import subprocess as sp +python = sys.executable +try: + import pox + python = pox.which_python(version=True) or python +except ImportError: + pass +shell = sys.platform[:3] == 'win' + +suite = os.path.dirname(__file__) or os.path.curdir +tests = glob.glob(suite + os.path.sep + 'test_*.py') + + +if __name__ == '__main__': + + failed = 0 + for test in tests: + p = sp.Popen([python, test], shell=shell).wait() + if p: + print('F', end='', flush=True) + failed = 1 + else: + print('.', end='', flush=True) + print('') + exit(failed) diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0f747d84fa32b3a5ffba83cbaf62b19fbac57af GIT binary patch literal 409 zcmZ8eJ5B>J5cNU?(Mo|UOhFSVu?2JpAt6PSbWqTEH?fl);ywA+|buh?Dte5(F@tzU#k-%?7+|{ZdpGP9d4QaFC*28li47f%^ zsL(@@K7em9$PvuZMKEnp2`IGy)IO9-K_O77g628E0oXQFM#H!Ui}sH~DWj2)hf3;= zx$L|>++(Ot{%eyXP1!z*j2i*Yq0q+50^(4cU@11b)ab|nd44&}-gY?`X2$swS*0D< z6{~e%Gj`>r^Xwv$HB1}|WE1I^!B}RUxs~Budz>oC>Q?GIrf|xB);Xq!N6g0~jBPnv vmJ8`wnviv&jC0f&IH$H<_fKmh8YR!%P7F>r_UQ{gx3et!+S|{1t{34q#btX9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/__main__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ee60a5126e8a5acb2e0c69dcb2bc1c6e8c680b1 GIT binary patch literal 1326 zcmZ`%&2Jl35PxsKyld~ecIu@0P$HUAwTU6CHnea+NCnqwr3#@^sIn5VHs0rWo%QZ& z-#WH)vII!B6v@8fUTAu1Q2J-&#)Tw>I4_qXPPv)pf^y=m9gBj?9A+9U_c9KeG4_%^BIllSytl^Q|R>?l=rPBNd1bC z7GeMj6=MI+2cE&aV0U0YUV)f_0128v`z79jg$6eX41Vo809pjW!uT+zFf|-Q(Ki^z zD8t(;XND`a7@Zpwh7$nA{-?|AFnEK83?a~iIkXXU(Fg^5cuNM*5@;j^zPUrU8l`+( z;l1G=NI;{j42rxEcj$`*Qc(N$O}%sOXya(yi_%^bhGc~4jUzksg#&@WkhR3-hrOKg z-`wVB9Oz}jgGpiFPol&>eic^X6@a97fyY9y1U3)Lpu#SJGMtN^1Qee?nu8>?jy!BS z_DR4?*s^JFNIt@TW`4n~5;2o0>ZYB^P$ZA@$g&7b6EMdR7TE^jb5;rGPlDg#3@*$~ z5pLCTRtV!@!s03>VO&~qJtvDWCJc5-7*$ZV^Nvke*QpS>oHw)i%y}qs zzvw!if7kOIkBF|N`#HxedZA!K&ei=q2^pqm>qQg{m@_Su$q*r1@@SNfSu%Y@`H@Tb zU=tjG0&oDz=@e}cE=Umm3&%w^;mW${6G-8%XWBmDP{s6r0;iM?oaNP`?WZR56|CeOJ$}>8l8< zhG|)9Z!&doUV7^@@#CUnlq~d#m!!nOP4NWPT^2%k8Us*12GTJIAA?IBNp8+GW@hd=cI literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_abc.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_abc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d85ab7809e31e4beacfd6f03a3d63a580152b5a2 GIT binary patch literal 7952 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_check.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_check.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4e9e2ed25f89f4043708aebec8224bf7546361e GIT binary patch literal 2142 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_detect.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_detect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d458b8740fa65c436c007b1253e3517d6c4618bd GIT binary patch literal 7678 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 RDe0Gf5zg#8fN+ML@DC%T#Hj!P literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_diff.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_diff.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d72cd3752bb5b607244ad62417c7ae4732e5ae75 GIT binary patch literal 3526 zcmeHK-*3}K9KW+Ku@fipa0-YM@x(4Rwjl>zG&uGLT^gWMP7Wgr+idf~J6i6k4VqP#xX? zNO&kP4P>+kWRJ6&@XFprkYE&6X42yTXe^dv9(2`1P^5}flzl?xQD}KZQC4SXFIrqm zF*Id1nZKDcl3iwdfZfSv029kV0SPFB1XYAl%7XEWQQBffF(+jeQMCM`n9a*KGlUL^ z;*Fb9rt{`ouu0TBRb$zl5lhBC))h^Uy{8yTZuqRG%4+PaqNj~~Ay&}x^NJDA>FP{I ziDipQ?vq$Xorx8S##}yk{K(N`F05aCQwG;L82hU>`oJ1WQ14TBhtvbrt1#Zo_?D4F`sy>h$u3;ip8*08i$5XQekfC+T1;dsC1ENCyQh35jF}&lD)55=z0cr{uxCcN>hn zj?QiIaXCA7N@#vh&qIfj;qLXlaF+crbFG(Y2PqZ2h(Sk}3d#(=SBwhFEFM`r`nJKr zw`0FuPWS#|TPHC9TP*auyRO`h_Um%*WWR>s;IDrpdt{LDm;GD3=@%RR`F)N|Z`@V9 z_#MPt9Qx`MN%FPZ7LWSjSFY%4n4mG%u6@5in<0ecrVR92KeqZgz-31dJsGj=C$5p0U{y=rW9UNaq znrLs&6ROFNnrPJIMq9{x``oQ_RcY}9Y^l4IsU|mMq9KzTYP;SDjnG(Sy2S~#qjx6j z!WtJbQN-jT_R8H!6YZ@|cI|W353Bo$2VG)Y9|FP3ROQC4cmKHuzi`5jtnf1%xEH(= ztRRq57{H_@c#Ai=xTU$hYa21$4qw2+z-Y%a@ieH3r^j@Q3feeScz&KVh;bO#VbGJXk;a^`yzZ zUj1wX2_E+Map3d+x7UpIRp}n6TW+X(th>Kt)djmCC;t#xNzI93)JHNwCZmyRTnm%P zqjenS3{D4V49Uv%3 z*~Bzb4lr#JJ#u8ChaG!fciSadCI!4q+B7b`A-GH&roGRJlQf`dQlI4K_xb&N@83Ur zy-f(Xh;1Yw0n2C(!<&++I6cQ;B+zSU&LJ>>oq_|fOLPm) z*bRgows{bJ%o^qzqA?d>FwMdGaFH)9{=$1KLJuxPAp( zoIxBl{rUoY`yPQRUe<|H*XiecTrv0vKdXzH&X0?RsC12Kk|6P8q8>BU1fS5G zEcPW*rX!vTJyA3d-0y`)X8~ovKk4?`VbIhb^wHRqLxA54L%Qi zdnZ%2B8@;laxT+7V`!4HF!|7QmK(uzePT6)W->xDo-o}DqOlm3lcMRFRmvj3lGU&P z+O#?!HJyM$l4`nau8Vxo4b3FPEyD67YpUd%PHNdz1}h$ut&2jt3S2S~`l99dLDRdL z(F4}EF}OAQESO_D)`N%MwvD;Wc*)ngsbrPsj|#qPnTdUd{rbTd54JA;%C!9f95t&J ze4UwzLtp#Wl0}tT+KVk+`IfGojzSBUncQbvH;1xA1@@iH*q^L_Nl!J8q{j`f2?M&Rjt|rsIHmLYv*dSLgU-Z2t`R@8{oV~t__2LllDmcw-vU*EF5bC z^OinPwhtayngWuY)`{pE<5AS{m7I*4_$HB2g=&`CGK z4Al>iq?1cESh}bi9=!-CgG%R3ONqU(8O#QYY-gVB+;J7y8@pq9wm--8=h*&37#}$+ z7k$_BzU#Zrf{)KkoTG3*&kp36fgC$<#5f(^-`wx*2U@ppesi-J=*Bk3STF)2yaNXE)_ zBHdu^87o&rM+wKpQ0VNQjjKXZ7KgN6&>%k>eGm}1fbmHH;r8EA_puY>z_HthFCTaN fu=l7NG0p2MztEQt82{Q7ps%Km9EiDM?Ua83ce=!^ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_fglobals.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_fglobals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..802bbcfeb8038c922039441525f512d37d31f7a2 GIT binary patch literal 2925 zcmb6bT~FIq^xAQVi9=jM`7D%B$Y|Dtgu>dwSU*;@R$W(V>ONF7$qTUo2gi=C9V$@h z*i>ntPD7I>m1>j9W2^pwK2Fo#_L2~$1h;Q{>KlSLw1=JRI3$E@(@x^!bMHC#oO{pL z_3uqhZUpdK^0V3R8W8%E49eiJiTz)Jc#K3OQVNBNHnAQ?%jMkF5jRF|+G`9Lxx)jx@4QI1SX`n;i~A}OpTB;%T@%hQS!NiIt2LPU|L zBdJAWPE$vQhR;WI*^t7iSbRP4t7$VP;m*relgelv*^KXVR*0UpD3h z*qF7QrRc0=2*;*}CKN3Wi!KixW0COaLx5J$E4IDJw-~ zTiwH*$E4;?64|!^fhU=kBG*#jx^rB2f%E4$f1W#2;Lhc^bJ@_9Ja;wATs?khvIXnV ze*y6r8Ftp9y6vHgODd=a43d->MrRd}Uet#);?WBqXQHu*ihal^ES`y9=k73gH$fHjIT0yV9 zzV*af;^&i3yPkAy4~*pp-pzMTv}$JfSx6dxyk zNNo3A%(q?2b7L!$I~@P$!glMqe5);+M>2GR^uHQ_x*(|l zuVY6rpF8e z<1=Kv%f8vnMpaWw_Z2=(7@Q#3EYQo8^tKai1BAe-DT>@1~j-a5X>he!la1-aEN+;}zq3?eebP&vu;Mb_I)k zTY(Sc_`v3Do*!CeihRp@W-YUUxA?v++n440$jpPa2b;bvzCX+MXZe1siEPkM-A~+` zBR}z5++da&%yNT8u5;t_LQgaYe=eG32(}X2WCbA^lT|@@LlP8jDbfbskh{tHm@%C( zB{dfdx-D)SjE6 zhW5M+b!yMsNDc3HAjY%0wB_i0#dwP>S71AGY{!Og13cBe$!@V{pItA6CUT*PmmlXs fSAMy;6}q*<_HMI%JM8Em?1fz?3V%oew(I?GY9L?x literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_file.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_file.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdd75aaeccf8845e9fc9a0198bc07c2ea60ab495 GIT binary patch literal 19291 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 B25tZV literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functors.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functors.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bcbc719065d480170c59e56271df2e11f6c0acb GIT binary patch literal 1485 zcmbtT%}*0S6rb7Mw!4(7G-$9KtT7h%ARFY`m`I2R4cYuH5v}8=*H&&fB&q7;Vs(%zN|R%B zMd%wS1Cn}3-HH@zh#-PplZ5M#8s#5gSu;^^N)pm*WnHPl2Kcwqx=r~$SE zTnKQH!)ZF5KCWAJPgq6k5vPn>_o<*>dY(DNvF0hSiH2|atWl-np2wYnORaj7dQU9Z zDOi3}R2tsw^voTLJA&T!?PAR?Q*IH*buB@;;33bKmb{{9Fh1=!16*RG^5qKzd)oM+inLUi#Si*k B7wG^1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_logger.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_logger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61b13064953c803282238b2ac52c6852d57f9bd5 GIT binary patch literal 3687 zcmb_eU2Idy6`rxj_O-8n@`HZ@hJ-cA;s7yWS=ep6P{0H>qM!oZ78BNWd?$&`^-t&C z5E2}%Ss^XaQYENJ0d*yi_JtKZ(3gt#rQL#5s(ndtP{Q4;mhSR`R8=Xg#41lcWBbO5 z38+;&mS^sqbLN~gbI$o@zHm5f2-@A$d%ZukBJ?ev=uIepJPR8T8b=b6u#6(55l3)w zZipC)qcLKH(I6XBBtkHkG0LWtIbu#(A_7KMP9d^2WsO*YYce2ezfo2%na?4ZJK*n> zEH`k8tdElL35mEQ>p2vuk!;Y{(mF{zxgH_*M_3^wTXc6TBQ@)*G1pup*>5_QP)HKi zS2xMIM5ab^{zt3qRjZcRqA1x~Z3m%cd@m3Ozu&xlXL{C5K) z#@kEwFC@2=_=|g8FZJ-#RScczLkxb_QeVZVK|F{9h}za6#^cCiDwbk;3|;ug06J|v zh6X^Q9VvLgfYCAV0HX_gO7x)X2{(8!h&8iBRT@`=2F#j+}8 zAS4`7St8y0?xCRJ2~UeBd{^;uf^ba`U4)GAe`ben9OWQIhahc_prGL(gAeo>0zLS& z!WT8opA4naYA7E1nL?Qo>HrtgO<|Uh5}`0vPO6z~D9bWQs_sfFiEf#OQiC*oDkLYm zL)k&KFOz!nIaO2~3ZrHZN)`>34h?WL?OJ2)@=NRFktrPvPU z0OM}>E4`pul=2xN6%n}o^V=_XgH?fZVmTn#_mM#l0BM0pt#3$u?*FP{p$f6 z#wzC*TaxHsl`)6)01g{ei%w7S(gZ&}c?)t7Ht>0X_+0-@A z)_VN?;ECKfmp%l-rKUiU)YNsnOWM%1zH1;6+`0QiP(wi%Gs8N~!pi|lSaU!r(^zVM zxya3>GSO@?Nz!SAmy%|Z`cqj&6L?8QGu=tez^G=4XHwaOOf{jGs;6RdKhE;++^_6bzok^3our3K`--R1MurBbp1=`g9i)1 zmh|Y{$|x-W6oBBe5GI)bipx8Cslk9`p%&&8j%1Bhh14GWur;l&m^!Bbzk=Ul86B{(c=F>x-^-?0PcC|&L zjAmIh+LY;O3bwTlnY!A~4DSd!I3lF7Jsbq;4#rYcIttSai?P8DpfR3pnyFOXBn^DV z0hO)douBgvz>mZNe9i%!t>HwY(%)SKhaxzY!GRQw*m$qQ1)xJ8z=H)w?xj+N5Oqa_ zC>oEdnJ8b$egOLU(@(hz9pHpmKP|RQiY?doOo^NG;aRI|)IZ`Mlg1Ml6W8KX*4BR^ zY+Ah-B%T|A@Tk^3-f*$uH>>iUGer2P^K9q21CJf9(a1<-!WS$!TJs$ zmP}7kSrZhh9^hZ>P0p`{J7h1we_TzRq9r-I5qMzinC!Op1Ym*nHi0Uu>Ts?Gs}AL*g0Bfh%*X5n1{D+)pqP z>fs*3{;$a@ehU8i=fA|Dh-b$3d4(6$HFMa6?$~T$kMXWa4A&d))?wazOyNe$zX1?% B_3Z!v literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_mixins.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_mixins.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0240c85891931202147e220615f53cfff175f9c GIT binary patch literal 6933 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 H8`a}~O{dR6 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_module.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_module.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0879ac0277ba6578ab22a9313a109b6ef99e3d4c GIT binary patch literal 3204 zcmd5;T}&HS7QXXid+^vEew{#^VgiM@VzH98K-nx35e?gROBAJz6t8wihC7fk{@Xjl zk5ME{g#^}CvLjW3M_0R2L5b9^RB88lRjI1_Vq>Z}vt5bR?h9`;^kJ2!J$Hs-2&M0P zh0i_r-gD16_d7qsw|>7D!T2h5Z+6pz(7)-z9b1M zP4X#M%*7zgDNMp=D{yAa-+%>+6pzAT*JIW?AwGpmG&)i?m+pf7W_#t#i8hC~Iqb$B zTOUU4u#JUfpfM3QD4cxa3)p579ri6}R=CHEwTcBWI(8Lcirq z3s;;yn^OWO7C7u(L$PL%bUAhz)IgD8620~fXMTLl0)$^SpP3 z?E9q0eAkF=&6$-G8O?e-EsQh6k%73=s_Tq(;s9VB2CZQ%DVlBWX~fNQ zR}msXkZE@E23D;vt*$t$9Ft?Zke*z3G2BE+ zX5#n*!$Xwmd7>$XSC*&a(+?CZ%P*LL16oAO{6IE0eXz?TG=2I>w2?pyK}Wv_vWfKL zfb}WN#`fQDT7k$L!P=uc((8tgL)qFseL^#8p z%Ha7VxQsLNQ%OaRV{EW9OFQU@s(UdPO{Mkdbo4__AzJj7qATg}I8m`09apqDJ(G=Q zNhYD_V`)u=>(NwBNiRf`>QpqF(;sBguMb?i9@SJ``9(H9Jr|!jRQU{}G#>ilM3)+PYI_%GYY*tJ_Ua?tOlL=l;&+ zU2(9&4_3uNLYwCK5O2fDX^8a`h%sa53~6z8&jS^+4y5{VAOL47|+>-_qCsfi58lm4JA_9rH49|nOMqwhfg_BlF{FDSJktm@ckR~8Ts|hMr zXJ$?#8-%0R;iugMl1JZ5!A};pv^}Z&iTiV5NBClV_v&y(7_Lae-%D*zrEpaWmz&CC ziNx#d}*j3@XOwX3vEZOkV zNH`VO9}Fl<*{e$tYKSgh%0G$#&4QzkfPk++t#Mw7ubRcmBAvd_9Ovbhqr>j1kip0J zI4#84b8;5i06S^r5pQsrsRV6SRtd_o!PDY2_~}eGcQ%h&%se`lR5dxBNh{=4@bEYA z(`YVHqyoj!!f3_B320qx|M-pKTZOkix%Doq2xUzv|ym ztLWmtI(y3t+Yk3TZ*25F^mva^_1^!ch#i+?K@Q|`bBS58b0I@ z<2iIAUt`|AChU7#H+qV%6<#adt9e6t&%WrR+i>m@*56xwujJm89!V8GT<5*}4J{k3 z#g0NpX`9{e`ocbjhQ{Zt?u;|`wD%<{z89=Y%V@p++2CIQeOCM z<B`=JN%9sfOi6A8iR lh-LggvW&}r$N~34Yk`pdJv#QvL_hkvUzix;z8++N{txpOc~JlW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_moduledict.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_moduledict.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f982c0c4577474d20d4e1b34715bde96e6064a8 GIT binary patch literal 2128 zcmah}%}*Og6o0c`e}4esBS4bYhkoF;uqnM%5k+c48YxxaK&0-9~`k3iPpYnX>eWVS#8Qbwbjyds3$ z&%f}Ds_Pq;u^<>1#>dQOZhnT_)HY_ASoXb|QRChc^FMTjz34Eb+FJ&} zx$jN9J81~pXX7=~S~e?87}Rzg!)L-5%9g4gtvig`mOoKz1mw4`g8 z3`3;RG~rn~vqiVwZ_c%F36Jm(1HD{#EiP3gq$u)vp2UI2J4TWsq-nyTMj``$B~#5Y zF5ymagX@q)R3UQH03O2$mls1LZz$+MD^KzsT=iiWQlw4TOXXgMlyuA9x`yUB-Dj!S zmwr|2s7z?L;2voQQiue)WG#r-Y-`zJLPc;ovYh0!M49Dr(`S_TBj6x*F@OfyOJ={h z{MF^}7oQ|Ye$z&FlOrlja7@)eA{!S1O;=-p#($PQ>7ATv~ICd zY3=RvTu*clzk+UrlmilwySUY({&}{b2Z>V2HLD00Aap1}oM%d^>1-nAtgqB94!wOmLoM7@u2Uqd@c{-5%b`)?IWhisF^Ava;$OUiQ_)-i9p zN=4ep>M_ne73AWG}inn36j z7699H>@`M@`3Ta-kojwPLv|qxC=%W`xIOyq=z~ul_l<4bQm`ke!9ypqjuf=D$y6TO z^z?MT>o5O7UaEgWg)$cYQ-1YYezl+u&z_m5QB`618|VXzZbt(L35cd&jzrcD`B1HQ z(46;3$I5faKGvZ)^(^Tyh)audIwhMRqj+kc;%}iF1ADtPJ=4?o=Qie^>VqmYsm-cs zyQNa0H++SJV7_m=6%kf8S$|Y|bNOpQ-0>>9O+b(FICr&~me&f037w=5bA$}x!|9o=wcjHn`}&0^`oO;4vw3@8@BMQ2 KAP)Md;_ZK<@2rUc literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_nested.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_nested.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04195f2c087bfeada0a24811eaac1ba8d40e1c5c GIT binary patch literal 6311 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 LYe6El@n!xC4}ffg literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_objects.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_objects.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17b7302fe5605fea79439e4aefb8836d3af7afca GIT binary patch literal 2704 zcmbVOO>7&-6@IfnT#_QGUt51}yq29>+gc*5rWP!yave)*+9pB~D=k8xV3*vHz0z{Y z%&a1jpaZ55U>RvqyGAMnX^;ZW!Krd6iXhD)2+*{*UMMGZq^)nwr8hYYkifn4&61Sp zz^4wtw{PCxym>S48~!66j{=Ur=YD$W6%F9uV$vK+gQ?9DfDN!91s1U+homG+rqW`l zX?XCplu4YRmFke3l2USNO3j5*Ap#Om#geViJKC01w->S>fE8W?E7FvuG#gT3E4l`& zgodp)5iJ!#Uu~%-Y)CPF#I3H`!T`stC=Pw3y*$41AE=zqip z=H`8kQ8ePzko~BWH?4HAoUb)P_#wLLQP-L^BtKfu(9Ag0k1e|gvutZI8s&sq7fLsP zLWv%rO^{=iA*TrZhT zKF2BJ$ytht>C?=%?Bq1%OJ2T^EU^3{_0GH8#w3%uB6VL(I(8;mFXeYePmd+J?a`5f znO!n3QJxgXkQBA$0ZliyJz6OGS~^GZ0IX7?p6_U5egt#jDv}E9gkv>iV9rqda60Xp zIhs!U(R4bOx0W5j$I|H+mQAOwVI648;(~Mv(k_T-!+;DT!?6`%4Qdim<8>RMeyCES ziGoTckhzMrT89OK)eT<+Lz;WYR8*}Sf3+}@SIGukBNu_ia1tbeM@ou5S>+<6UJ259 z5T10*T*fk|N&`)9bkfOZO@~h*Q`a3shalCjD)1+>(%6pJm_b;dP>Q90QQu%cvP_Ux zudN?9y!`0XLCkr)<$m;;pyC1F`J9`{FT2)(C@Z$z91&!KGW-sg+5oR9hcbw@uE-Ja z_U#v&h_-J9t=dQ6Sy^uOZ}WRaDH9fnKv^lv0u{LQBlsmLDqdSN=z&j*OlkVJ`Wy#O z97!-v0GlAt;<3MSi|i3m$`U)`iINAyB4v0TF}lTPKhEpqjeUOt&qGlWzZF=OpNAEK zxrmz-49w*ifv-iD|KG@lS~~f{GD4P~y-bnX3k_guKpodtZ0~Y_gr(35HJ2vz2ShJv z3#RSx34P88Gtp*#sE#zgD)5Q>s?RtJ>W;II- zLTRYJBD&94>8hFaeCsY8C%_#3-(gb%eolBef72aa-4k|7yl;y_+OAz;InAw z^%K`dDi`*oHuc=SM9*)WYtHY_ygB*We1)M4_i|Q@(ljE#(gvZ$<8O8`YSx-EDmJMFe_=J_iZy@AVFDUbtC&Yx;Kgtsma$ z9jSJVRC`Buy9eHw`SbJ#C*J2D7}ev`caO~67~fNc!+$Yq?9k^x)N{LSU9ZmkasJ&W z-k0A!TOIt~-JYpy<9jk{9`Li6`zzmi@-cW%JKqN%_9OS#zNse%<&O>%Tqg5DM4iIWUQ8NsRy z??_vX?j-Q5E(HPKkmvA`VJFduVSC}ce)`H1E!NKhwL;;Cax|C07a)MG#-YUohBwih zCDCjgfBZO-3f$}J-#B&S)Xh;WwR&bf^jWz5dT5j0{@LB|ckinx3ZPaXc+Rw4MD37$ z$;~s0U>0N|&CVNS-sr?9A#LTeXrPF9gB=ywggNy*e3Lm7AQR-wM5zKy_cdOiS=)5b zwT_*^8{mhQ3l{zh2(DO=EfcS$A6_w;D`NREZs!UPU9cUr`r4C$7+rr~rq~2}iE{|9 zD4sYW_d8^w)S^HR?|kD}C3Lm@<@W25Z5a3xMI+mAY8Rr{t=sB9Vf4#{MB?`W$zBxN z;uURoXuJyJ6>UAX4Tm;yI(%#R)1k5Lp|L8A?TdGgKK|xQuf0^!s^P(HII;tYigq>e za$le339GBB$G23Q;DsY?#TWBQo47P{>oFID*f9^|K{)~%JE&LWAo5m<>;OU J%0N*3{{e_zXW#$; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_properties.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_properties.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..041b2aa16db9ae61c62325a4f5495228b16b4bf7 GIT binary patch literal 2455 zcmb_eO>7%Q6rR~1d;JrqX~>^bXhPEpqc%$mJya@@g3=ZaMNNs(qSCTy8%+5!XcBp! zn94FSRVJ^?!Sa-1MwZExYDNJgrUn>gni-pUgAm>;5vH!U_Mza@8Qwnv{Kp=4;eb4KwHFV4?_CDhPZ!^up0+ZCB6hp9sc< zewDe*9-82mY3UP8%(zZjFLS5J+;Ll2H%d&OtuXsby=2|c%N6&gW4}Fm{(>$nmz^u; z@-w+cS<6HrX;8MFl6T6L zAYFst;3);D5kO!H&}5|yygpDnlkIhN9E;trE5mkN_}Pq)fcFXbiH`u5$dg28<5K<7 zx05SlOB2mNX^hp!HWH^dl+%F!`fPYZ8Qx3`2UQ7s?g{48=cEafm*FG^g8-ds=uA=SGp`-Jr5Z&;XCj@$9@00sBeNnDKM=Lc1J%7{>TTP_e~|PXV@N zN-6vspoym>(HuOvqi_@% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_pycapsule.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_pycapsule.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d9c7e3c031b5c025ba6e9ab6088099820f4c61a GIT binary patch literal 2092 zcmd5-UrgIZ7(f3>?4(ZYgpdYU*M!gx!iHhfRtaset`MoJ#QM@r<;61g6>JjQvR!Bp zl}a^fAXV!6#3oHzUnia>RoeST(WJeQ!Iaj`L!~|KjTR&%_OiPW$642D+V--u{e9nk zci(rv?>pajKgMEFfZAsHquI3(0Kedl-^ix0zkq~wpn_?j5-M3Drilh8r%9EZrXZoS zzDdCKhTou%r4^=O7oHBQ)F%L0GAcda4}g6FQY$P8AhppnAV7u0&p>FYH|j#i&03l= zU($@(tem}ExgcB4^%BgQGdfh<=&#snN@?0QSQt?Xefx8Wt^=3w2X#LxUxBzvY&6Gj z0+;p&bnN4Wrbk{-pl+M*m&E)x{$7$fx3z@MwZxXN(Zs)u_G1G_h}uoU<&Px*bitPb z?q~IFK!CQH$zX;rsidC?G!y*~$4yW9Qoxs6IU^7f{P@TSuuKF|ODBArww3<}7}d6& z4lqXA^Yb532073(ehva2Wb5DO+3oTDsg%EOw~0I$0S>W965uM@Zvx!;;RbaTEdE)4 z`!Dpb`}(#BUh!87cptDSyha5qf@6yTddf+l3942q4N3UeD#r)a3v086X~U)N$r~0r zu~5y*Syj7s4cgFfv(UCpdw}=Cid(UuCuK{kbvf+w~cmz}W=c>jSD>*Vmb4kssRQba8;P?*z{wiHhrq>Ji z3bo{5H91)4l6NnyUHX##D*8pVmKmvLMjpKL?f5t2JKTjwoPgeahVF>2G6zu*PuF67 z)mYz7?Cdi@Mo!ncRE^73x!nE!T@HB??p|EG_}T0(_v&E?4ey1)slGe(F56X)b^c?^ zT*GpYWFq7BL{}}*UrqGyBnoKZSiUY~YQmYSaOVEp1G+XmQ5~Mx6(;LKYCUo<^7(7K zLN5Xk%O7x{Be$JCut-sx=~S@?Y!*g~JoT`TMe@UQp(0?ms8Eq(w)jvn!)&D( zq~Gf4D2`BD!vvxpD@kQpGbCw%^%zM~O+}Jy2Klye$#3kNjjsk9*B~1gVr+u{F-iIw z?4v%g(}*0g@0Lv!U4>)zDb&TcnDZeb2rWT86G(#IX92-I0sPZM=dJitiurVOWwb_h wSE=r8>g*Fb@tjPD#`lH+&8;r|M0Gu4I=7kJV>bOWo7tlP+lvU@ZR6wrJ10n<*Z=?k literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_recursive.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_recursive.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..674331d629fd3978570bbd8910f5436df924cfc7 GIT binary patch literal 8881 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_restricted.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_restricted.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99357634bd8db3b454487d68ffe02e5d0c8dda86 GIT binary patch literal 1240 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 Y_5G_t=aSI9Dg=IU;E4}O-CSY+1%1?c!vFvP literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_session.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_session.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba545d92f2a28de36ed95e2f02f12ca7568e79bb GIT binary patch literal 14498 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_source.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_source.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d292361baf1174e8cce21dd0deef4258c23e3b7 GIT binary patch literal 10335 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 F{{_lxW|{y1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_sources.cpython-312.pyc b/myenv/lib/python3.12/site-packages/dill/tests/__pycache__/test_sources.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..069e0964e7118822695cdb6def3e738af489122b GIT binary patch literal 17746 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 + # .LocalABC'> + + class Real(labc): + def foo(self): + return "True!" + + def baz(self): + return "My " + super(Real, self).baz() + + real = Real() + assert real.foo() == "True!" + + try: + labc() + except TypeError as e: + # Expected error + pass + else: + print('Failed to raise type error') + assert False + + labc2, pik = dill.copy((labc, Real())) + assert 'Real' == type(pik).__name__ + assert '.Real' in type(pik).__qualname__ + assert type(pik) is not Real + assert labc2 is not LocalABC + assert labc2 is not labc + assert isinstance(pik, labc2) + assert not isinstance(pik, labc) + assert not isinstance(pik, LocalABC) + assert pik.baz() == "My " + repr(pik) + +def test_meta_local_no_cache(): + """ + Test calling metaclass and cache registration + """ + LocalMetaABC = abc.ABCMeta('LocalMetaABC', (), {}) + + class ClassyClass: + pass + + class KlassyClass: + pass + + LocalMetaABC.register(ClassyClass) + + assert not issubclass(KlassyClass, LocalMetaABC) + assert issubclass(ClassyClass, LocalMetaABC) + + res = dill.dumps((LocalMetaABC, ClassyClass, KlassyClass)) + + lmabc, cc, kc = dill.loads(res) + assert type(lmabc) == type(LocalMetaABC) + assert not issubclass(kc, lmabc) + assert issubclass(cc, lmabc) + +if __name__ == '__main__': + test_abc_non_local() + test_abc_local() + test_meta_local_no_cache() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_check.py b/myenv/lib/python3.12/site-packages/dill/tests/test_check.py new file mode 100644 index 0000000..c0ab757 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_check.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +from dill import check +import sys + +from dill.temp import capture + + +#FIXME: this doesn't catch output... it's from the internal call +def raise_check(func, **kwds): + try: + with capture('stdout') as out: + check(func, **kwds) + except Exception: + e = sys.exc_info()[1] + raise AssertionError(str(e)) + else: + assert 'Traceback' not in out.getvalue() + finally: + out.close() + + +f = lambda x:x**2 + + +def test_simple(verbose=None): + raise_check(f, verbose=verbose) + + +def test_recurse(verbose=None): + raise_check(f, recurse=True, verbose=verbose) + + +def test_byref(verbose=None): + raise_check(f, byref=True, verbose=verbose) + + +def test_protocol(verbose=None): + raise_check(f, protocol=True, verbose=verbose) + + +def test_python(verbose=None): + raise_check(f, python=None, verbose=verbose) + + +#TODO: test incompatible versions +#TODO: test dump failure +#TODO: test load failure + + +if __name__ == '__main__': + test_simple() + test_recurse() + test_byref() + test_protocol() + test_python() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_classdef.py b/myenv/lib/python3.12/site-packages/dill/tests/test_classdef.py new file mode 100644 index 0000000..b09df50 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_classdef.py @@ -0,0 +1,340 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill +from enum import EnumMeta +import sys +dill.settings['recurse'] = True + +# test classdefs +class _class: + def _method(self): + pass + def ok(self): + return True + +class _class2: + def __call__(self): + pass + def ok(self): + return True + +class _newclass(object): + def _method(self): + pass + def ok(self): + return True + +class _newclass2(object): + def __call__(self): + pass + def ok(self): + return True + +class _meta(type): + pass + +def __call__(self): + pass +def ok(self): + return True + +_mclass = _meta("_mclass", (object,), {"__call__": __call__, "ok": ok}) + +del __call__ +del ok + +o = _class() +oc = _class2() +n = _newclass() +nc = _newclass2() +m = _mclass() + +if sys.hexversion < 0x03090000: + import typing + class customIntList(typing.List[int]): + pass +else: + class customIntList(list[int]): + pass + +# test pickles for class instances +def test_class_instances(): + assert dill.pickles(o) + assert dill.pickles(oc) + assert dill.pickles(n) + assert dill.pickles(nc) + assert dill.pickles(m) + +def test_class_objects(): + clslist = [_class,_class2,_newclass,_newclass2,_mclass] + objlist = [o,oc,n,nc,m] + _clslist = [dill.dumps(obj) for obj in clslist] + _objlist = [dill.dumps(obj) for obj in objlist] + + for obj in clslist: + globals().pop(obj.__name__) + del clslist + for obj in ['o','oc','n','nc']: + globals().pop(obj) + del objlist + del obj + + for obj,cls in zip(_objlist,_clslist): + _cls = dill.loads(cls) + _obj = dill.loads(obj) + assert _obj.ok() + assert _cls.ok(_cls()) + if _cls.__name__ == "_mclass": + assert type(_cls).__name__ == "_meta" + +# test NoneType +def test_specialtypes(): + assert dill.pickles(type(None)) + assert dill.pickles(type(NotImplemented)) + assert dill.pickles(type(Ellipsis)) + assert dill.pickles(type(EnumMeta)) + +from collections import namedtuple +Z = namedtuple("Z", ['a','b']) +Zi = Z(0,1) +X = namedtuple("Y", ['a','b']) +X.__name__ = "X" +X.__qualname__ = "X" #XXX: name must 'match' or fails to pickle +Xi = X(0,1) +Bad = namedtuple("FakeName", ['a','b']) +Badi = Bad(0,1) +Defaults = namedtuple('Defaults', ['x', 'y'], defaults=[1]) +Defaultsi = Defaults(2) + +# test namedtuple +def test_namedtuple(): + assert Z is dill.loads(dill.dumps(Z)) + assert Zi == dill.loads(dill.dumps(Zi)) + assert X is dill.loads(dill.dumps(X)) + assert Xi == dill.loads(dill.dumps(Xi)) + assert Defaults is dill.loads(dill.dumps(Defaults)) + assert Defaultsi == dill.loads(dill.dumps(Defaultsi)) + assert Bad is not dill.loads(dill.dumps(Bad)) + assert Bad._fields == dill.loads(dill.dumps(Bad))._fields + assert tuple(Badi) == tuple(dill.loads(dill.dumps(Badi))) + + class A: + class B(namedtuple("C", ["one", "two"])): + '''docstring''' + B.__module__ = 'testing' + + a = A() + assert dill.copy(a) + + assert dill.copy(A.B).__name__ == 'B' + assert dill.copy(A.B).__qualname__.endswith('..A.B') + assert dill.copy(A.B).__doc__ == 'docstring' + assert dill.copy(A.B).__module__ == 'testing' + + from typing import NamedTuple + + def A(): + class B(NamedTuple): + x: int + return B + + assert type(dill.copy(A()(8))).__qualname__ == type(A()(8)).__qualname__ + +def test_dtype(): + try: + import numpy as np + + dti = np.dtype('int') + assert np.dtype == dill.copy(np.dtype) + assert dti == dill.copy(dti) + except ImportError: pass + + +def test_array_nested(): + try: + import numpy as np + + x = np.array([1]) + y = (x,) + assert y == dill.copy(y) + + except ImportError: pass + + +def test_array_subclass(): + try: + import numpy as np + + class TestArray(np.ndarray): + def __new__(cls, input_array, color): + obj = np.asarray(input_array).view(cls) + obj.color = color + return obj + def __array_finalize__(self, obj): + if obj is None: + return + if isinstance(obj, type(self)): + self.color = obj.color + def __getnewargs__(self): + return np.asarray(self), self.color + + a1 = TestArray(np.zeros(100), color='green') + if not dill._dill.IS_PYPY: + assert dill.pickles(a1) + assert a1.__dict__ == dill.copy(a1).__dict__ + + a2 = a1[0:9] + if not dill._dill.IS_PYPY: + assert dill.pickles(a2) + assert a2.__dict__ == dill.copy(a2).__dict__ + + class TestArray2(np.ndarray): + color = 'blue' + + a3 = TestArray2([1,2,3,4,5]) + a3.color = 'green' + if not dill._dill.IS_PYPY: + assert dill.pickles(a3) + assert a3.__dict__ == dill.copy(a3).__dict__ + + except ImportError: pass + + +def test_method_decorator(): + class A(object): + @classmethod + def test(cls): + pass + + a = A() + + res = dill.dumps(a) + new_obj = dill.loads(res) + new_obj.__class__.test() + +# test slots +class Y(object): + __slots__ = ('y', '__weakref__') + def __init__(self, y): + self.y = y + +value = 123 +y = Y(value) + +class Y2(object): + __slots__ = 'y' + def __init__(self, y): + self.y = y + +def test_slots(): + assert dill.pickles(Y) + assert dill.pickles(y) + assert dill.pickles(Y.y) + assert dill.copy(y).y == value + assert dill.copy(Y2(value)).y == value + +def test_origbases(): + assert dill.copy(customIntList).__orig_bases__ == customIntList.__orig_bases__ + +def test_attr(): + import attr + @attr.s + class A: + a = attr.ib() + + v = A(1) + assert dill.copy(v) == v + +def test_metaclass(): + class metaclass_with_new(type): + def __new__(mcls, name, bases, ns, **kwds): + cls = super().__new__(mcls, name, bases, ns, **kwds) + assert mcls is not None + assert cls.method(mcls) + return cls + def method(cls, mcls): + return isinstance(cls, mcls) + + l = locals() + exec("""class subclass_with_new(metaclass=metaclass_with_new): + def __new__(cls): + self = super().__new__(cls) + return self""", None, l) + subclass_with_new = l['subclass_with_new'] + + assert dill.copy(subclass_with_new()) + +def test_enummeta(): + from http import HTTPStatus + import enum + assert dill.copy(HTTPStatus.OK) is HTTPStatus.OK + assert dill.copy(enum.EnumMeta) is enum.EnumMeta + +def test_inherit(): #NOTE: see issue #612 + class Foo: + w = 0 + x = 1 + y = 1.1 + a = () + b = (1,) + n = None + + class Bar(Foo): + w = 2 + x = 1 + y = 1.1 + z = 0.2 + a = () + b = (1,) + c = (2,) + n = None + + Baz = dill.copy(Bar) + + import platform + is_pypy = platform.python_implementation() == 'PyPy' + assert Bar.__dict__ == Baz.__dict__ + # ints + assert 'w' in Bar.__dict__ and 'w' in Baz.__dict__ + assert Bar.__dict__['w'] is Baz.__dict__['w'] + assert 'x' in Bar.__dict__ and 'x' in Baz.__dict__ + assert Bar.__dict__['x'] is Baz.__dict__['x'] + # floats + assert 'y' in Bar.__dict__ and 'y' in Baz.__dict__ + same = Bar.__dict__['y'] is Baz.__dict__['y'] + assert same if is_pypy else not same + assert 'z' in Bar.__dict__ and 'z' in Baz.__dict__ + same = Bar.__dict__['z'] is Baz.__dict__['z'] + assert same if is_pypy else not same + # tuples + assert 'a' in Bar.__dict__ and 'a' in Baz.__dict__ + assert Bar.__dict__['a'] is Baz.__dict__['a'] + assert 'b' in Bar.__dict__ and 'b' in Baz.__dict__ + assert Bar.__dict__['b'] is not Baz.__dict__['b'] + assert 'c' in Bar.__dict__ and 'c' in Baz.__dict__ + assert Bar.__dict__['c'] is not Baz.__dict__['c'] + # None + assert 'n' in Bar.__dict__ and 'n' in Baz.__dict__ + assert Bar.__dict__['n'] is Baz.__dict__['n'] + + +if __name__ == '__main__': + test_class_instances() + test_class_objects() + test_specialtypes() + test_namedtuple() + test_dtype() + test_array_nested() + test_array_subclass() + test_method_decorator() + test_slots() + test_origbases() + test_metaclass() + test_enummeta() + test_inherit() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_dataclasses.py b/myenv/lib/python3.12/site-packages/dill/tests/test_dataclasses.py new file mode 100644 index 0000000..10dc51c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_dataclasses.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Author: Anirudh Vegesana (avegesan@cs.stanford.edu) +# Copyright (c) 2022-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +test pickling a dataclass +""" + +import dill +import dataclasses + +def test_dataclasses(): + # Issue #500 + @dataclasses.dataclass + class A: + x: int + y: str + + @dataclasses.dataclass + class B: + a: A + + a = A(1, "test") + before = B(a) + save = dill.dumps(before) + after = dill.loads(save) + assert before != after # classes don't match + assert before == B(A(**dataclasses.asdict(after.a))) + assert dataclasses.asdict(before) == dataclasses.asdict(after) + +if __name__ == '__main__': + test_dataclasses() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_detect.py b/myenv/lib/python3.12/site-packages/dill/tests/test_detect.py new file mode 100644 index 0000000..5ab16bb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_detect.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +from dill.detect import baditems, badobjects, badtypes, errors, parent, at, globalvars +from dill import settings +from dill._dill import IS_PYPY +from pickle import PicklingError + +import inspect +import sys +import os + +def test_bad_things(): + f = inspect.currentframe() + assert baditems(f) == [f] + #assert baditems(globals()) == [f] #XXX + assert badobjects(f) is f + assert badtypes(f) == type(f) + assert type(errors(f)) is TypeError + d = badtypes(f, 1) + assert isinstance(d, dict) + assert list(badobjects(f, 1).keys()) == list(d.keys()) + assert list(errors(f, 1).keys()) == list(d.keys()) + s = set([(err.__class__.__name__,err.args[0]) for err in list(errors(f, 1).values())]) + a = dict(s) + if not os.environ.get('COVERAGE'): #XXX: travis-ci + proxy = 0 if type(f.f_locals) is dict else 1 + assert len(s) == len(a) + proxy # TypeError (and possibly PicklingError) + n = 2 + assert len(a) is n if 'PicklingError' in a.keys() else n-1 + +def test_parent(): + x = [4,5,6,7] + listiter = iter(x) + obj = parent(listiter, list) + assert obj is x + + if IS_PYPY: assert parent(obj, int) is None + else: assert parent(obj, int) is x[-1] # python oddly? finds last int + assert at(id(at)) is at + +a, b, c = 1, 2, 3 + +def squared(x): + return a+x**2 + +def foo(x): + def bar(y): + return squared(x)+y + return bar + +class _class: + def _method(self): + pass + def ok(self): + return True + +def test_globals(): + def f(): + a + def g(): + b + def h(): + c + assert globalvars(f) == dict(a=1, b=2, c=3) + + res = globalvars(foo, recurse=True) + assert set(res) == set(['squared', 'a']) + res = globalvars(foo, recurse=False) + assert res == {} + zap = foo(2) + res = globalvars(zap, recurse=True) + assert set(res) == set(['squared', 'a']) + res = globalvars(zap, recurse=False) + assert set(res) == set(['squared']) + del zap + res = globalvars(squared) + assert set(res) == set(['a']) + # FIXME: should find referenced __builtins__ + #res = globalvars(_class, recurse=True) + #assert set(res) == set(['True']) + #res = globalvars(_class, recurse=False) + #assert res == {} + #res = globalvars(_class.ok, recurse=True) + #assert set(res) == set(['True']) + #res = globalvars(_class.ok, recurse=False) + #assert set(res) == set(['True']) + + +#98 dill ignores __getstate__ in interactive lambdas +bar = [0] + +class Foo(object): + def __init__(self): + pass + def __getstate__(self): + bar[0] = bar[0]+1 + return {} + def __setstate__(self, data): + pass + +f = Foo() + +def test_getstate(): + from dill import dumps, loads + dumps(f) + b = bar[0] + dumps(lambda: f, recurse=False) # doesn't call __getstate__ + assert bar[0] == b + dumps(lambda: f, recurse=True) # calls __getstate__ + assert bar[0] == b + 1 + +#97 serialize lambdas in test files +def test_deleted(): + global sin + from dill import dumps, loads + from math import sin, pi + + def sinc(x): + return sin(x)/x + + settings['recurse'] = True + _sinc = dumps(sinc) + sin = globals().pop('sin') + sin = 1 + del sin + sinc_ = loads(_sinc) # no NameError... pickling preserves 'sin' + res = sinc_(1) + from math import sin + assert sinc(1) == res + + +def test_lambdify(): + try: + from sympy import symbols, lambdify + except ImportError: + return + settings['recurse'] = True + x = symbols("x") + y = x**2 + f = lambdify([x], y) + z = min + d = globals() + globalvars(f, recurse=True, builtin=True) + assert z is min + assert d is globals() + + +if __name__ == '__main__': + test_bad_things() + test_parent() + test_globals() + test_getstate() + test_deleted() + test_lambdify() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_dictviews.py b/myenv/lib/python3.12/site-packages/dill/tests/test_dictviews.py new file mode 100644 index 0000000..4e94ce3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_dictviews.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Author: Anirudh Vegesana (avegesan@cs.stanford.edu) +# Copyright (c) 2021-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill +from dill._dill import OLD310, MAPPING_PROXY_TRICK, DictProxyType + +def test_dictproxy(): + assert dill.copy(DictProxyType({'a': 2})) + +def test_dictviews(): + x = {'a': 1} + assert dill.copy(x.keys()) + assert dill.copy(x.values()) + assert dill.copy(x.items()) + +def test_dictproxy_trick(): + if not OLD310 and MAPPING_PROXY_TRICK: + x = {'a': 1} + all_views = (x.values(), x.items(), x.keys(), x) + seperate_views = dill.copy(all_views) + new_x = seperate_views[-1] + new_x['b'] = 2 + new_x['c'] = 1 + assert len(new_x) == 3 and len(x) == 1 + assert len(seperate_views[0]) == 3 and len(all_views[0]) == 1 + assert len(seperate_views[1]) == 3 and len(all_views[1]) == 1 + assert len(seperate_views[2]) == 3 and len(all_views[2]) == 1 + assert dict(all_views[1]) == x + assert dict(seperate_views[1]) == new_x + +if __name__ == '__main__': + test_dictproxy() + test_dictviews() + test_dictproxy_trick() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_diff.py b/myenv/lib/python3.12/site-packages/dill/tests/test_diff.py new file mode 100644 index 0000000..a175305 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_diff.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +from dill import __diff as diff + +import sys +IS_PYPY = not hasattr(sys, 'getrefcount') + +class A: + pass + +def test_diff(): + a = A() + b = A() + c = A() + a.a = b + b.a = c + diff.memorise(a) + assert not diff.has_changed(a) + c.a = 1 + assert diff.has_changed(a) + diff.memorise(c, force=True) + assert not diff.has_changed(a) + c.a = 2 + assert diff.has_changed(a) + changed = diff.whats_changed(a) + assert list(changed[0].keys()) == ["a"] + assert not changed[1] + + a2 = [] + b2 = [a2] + c2 = [b2] + diff.memorise(c2) + assert not diff.has_changed(c2) + a2.append(1) + assert diff.has_changed(c2) + changed = diff.whats_changed(c2) + assert changed[0] == {} + assert changed[1] + + a3 = {} + b3 = {1: a3} + c3 = {1: b3} + diff.memorise(c3) + assert not diff.has_changed(c3) + a3[1] = 1 + assert diff.has_changed(c3) + changed = diff.whats_changed(c3) + assert changed[0] == {} + assert changed[1] + + if not IS_PYPY: + import abc + # make sure the "_abc_invaldation_counter" doesn't make test fail + diff.memorise(abc.ABCMeta, force=True) + assert not diff.has_changed(abc) + abc.ABCMeta.zzz = 1 + assert diff.has_changed(abc) + changed = diff.whats_changed(abc) + assert list(changed[0].keys()) == ["ABCMeta"] + assert not changed[1] + + ''' + import Queue + diff.memorise(Queue, force=True) + assert not diff.has_changed(Queue) + Queue.Queue.zzz = 1 + assert diff.has_changed(Queue) + changed = diff.whats_changed(Queue) + assert list(changed[0].keys()) == ["Queue"] + assert not changed[1] + + import math + diff.memorise(math, force=True) + assert not diff.has_changed(math) + math.zzz = 1 + assert diff.has_changed(math) + changed = diff.whats_changed(math) + assert list(changed[0].keys()) == ["zzz"] + assert not changed[1] + ''' + + a = A() + b = A() + c = A() + a.a = b + b.a = c + diff.memorise(a) + assert not diff.has_changed(a) + c.a = 1 + assert diff.has_changed(a) + diff.memorise(c, force=True) + assert not diff.has_changed(a) + del c.a + assert diff.has_changed(a) + changed = diff.whats_changed(a) + assert list(changed[0].keys()) == ["a"] + assert not changed[1] + + +if __name__ == '__main__': + test_diff() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_extendpickle.py b/myenv/lib/python3.12/site-packages/dill/tests/test_extendpickle.py new file mode 100644 index 0000000..3b274d4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_extendpickle.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill as pickle +from io import BytesIO as StringIO + + +def my_fn(x): + return x * 17 + + +def test_extend(): + obj = lambda : my_fn(34) + assert obj() == 578 + + obj_io = StringIO() + pickler = pickle.Pickler(obj_io) + pickler.dump(obj) + + obj_str = obj_io.getvalue() + + obj2_io = StringIO(obj_str) + unpickler = pickle.Unpickler(obj2_io) + obj2 = unpickler.load() + + assert obj2() == 578 + + +def test_isdill(): + obj_io = StringIO() + pickler = pickle.Pickler(obj_io) + assert pickle._dill.is_dill(pickler) is True + + pickler = pickle._dill.StockPickler(obj_io) + assert pickle._dill.is_dill(pickler) is False + + try: + import multiprocess as mp + pickler = mp.reduction.ForkingPickler(obj_io) + assert pickle._dill.is_dill(pickler, child=True) is True + assert pickle._dill.is_dill(pickler, child=False) is False + except Exception: + pass + + +if __name__ == '__main__': + test_extend() + test_isdill() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_fglobals.py b/myenv/lib/python3.12/site-packages/dill/tests/test_fglobals.py new file mode 100644 index 0000000..80b3565 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_fglobals.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2021-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill +dill.settings['recurse'] = True + +def get_fun_with_strftime(): + def fun_with_strftime(): + import datetime + return datetime.datetime.strptime("04-01-1943", "%d-%m-%Y").strftime( + "%Y-%m-%d %H:%M:%S" + ) + return fun_with_strftime + + +def get_fun_with_strftime2(): + import datetime + return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + + +def test_doc_dill_issue_219(): + back_fn = dill.loads(dill.dumps(get_fun_with_strftime())) + assert back_fn() == "1943-01-04 00:00:00" + dupl = dill.loads(dill.dumps(get_fun_with_strftime2)) + assert dupl() == get_fun_with_strftime2() + + +def get_fun_with_internal_import(): + def fun_with_import(): + import re + return re.compile("$") + return fun_with_import + + +def test_method_with_internal_import_should_work(): + import re + back_fn = dill.loads(dill.dumps(get_fun_with_internal_import())) + import inspect + if hasattr(inspect, 'getclosurevars'): + vars = inspect.getclosurevars(back_fn) + assert vars.globals == {} + assert vars.nonlocals == {} + assert back_fn() == re.compile("$") + assert "__builtins__" in back_fn.__globals__ + + +if __name__ == "__main__": + import sys + if (sys.version_info[:3] != (3,10,0) or sys.version_info[3] != 'alpha'): + test_doc_dill_issue_219() + test_method_with_internal_import_should_work() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_file.py b/myenv/lib/python3.12/site-packages/dill/tests/test_file.py new file mode 100644 index 0000000..ad949f3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_file.py @@ -0,0 +1,500 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import os +import sys +import string +import random + +import dill + + +dill.settings['recurse'] = True + +fname = "_test_file.txt" +rand_chars = list(string.ascii_letters) + ["\n"] * 40 # bias newline + +buffer_error = ValueError("invalid buffer size") +dne_error = FileNotFoundError("[Errno 2] No such file or directory: '%s'" % fname) + + +def write_randomness(number=200): + f = open(fname, "w") + for i in range(number): + f.write(random.choice(rand_chars)) + f.close() + f = open(fname, "r") + contents = f.read() + f.close() + return contents + + +def trunc_file(): + open(fname, "w").close() + + +def throws(op, args, exc): + try: + op(*args) + except type(exc): + return sys.exc_info()[1].args == exc.args + else: + return False + + +def teardown_module(): + if os.path.exists(fname): + os.remove(fname) + + +def bench(strictio, fmode, skippypy): + import platform + if skippypy and platform.python_implementation() == 'PyPy': + # Skip for PyPy... + return + + # file exists, with same contents + # read + + write_randomness() + + f = open(fname, "r") + _f = dill.loads(dill.dumps(f, fmode=fmode))#, strictio=strictio)) + assert _f.mode == f.mode + assert _f.tell() == f.tell() + assert _f.read() == f.read() + f.close() + _f.close() + + # write + + f = open(fname, "w") + f.write("hello") + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + f.close() + f2 = dill.loads(f_dumped) #FIXME: fails due to pypy/issues/1233 + # TypeError: expected py_object instance instead of str + f2mode = f2.mode + f2tell = f2.tell() + f2name = f2.name + f2.write(" world!") + f2.close() + + if fmode == dill.HANDLE_FMODE: + assert open(fname).read() == " world!" + assert f2mode == f1mode + assert f2tell == 0 + elif fmode == dill.CONTENTS_FMODE: + assert open(fname).read() == "hello world!" + assert f2mode == f1mode + assert f2tell == ftell + assert f2name == fname + elif fmode == dill.FILE_FMODE: + assert open(fname).read() == "hello world!" + assert f2mode == f1mode + assert f2tell == ftell + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + + # append + + trunc_file() + + f = open(fname, "a") + f.write("hello") + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + f.close() + f2 = dill.loads(f_dumped) + f2mode = f2.mode + f2tell = f2.tell() + f2.write(" world!") + f2.close() + + assert f2mode == f1mode + if fmode == dill.CONTENTS_FMODE: + assert open(fname).read() == "hello world!" + assert f2tell == ftell + elif fmode == dill.HANDLE_FMODE: + assert open(fname).read() == "hello world!" + assert f2tell == ftell + elif fmode == dill.FILE_FMODE: + assert open(fname).read() == "hello world!" + assert f2tell == ftell + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + + # file exists, with different contents (smaller size) + # read + + write_randomness() + + f = open(fname, "r") + fstr = f.read() + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + f.close() + _flen = 150 + _fstr = write_randomness(number=_flen) + + if strictio: # throw error if ftell > EOF + assert throws(dill.loads, (f_dumped,), buffer_error) + else: + f2 = dill.loads(f_dumped) + assert f2.mode == f1mode + if fmode == dill.CONTENTS_FMODE: + assert f2.tell() == _flen + assert f2.read() == "" + f2.seek(0) + assert f2.read() == _fstr + assert f2.tell() == _flen # 150 + elif fmode == dill.HANDLE_FMODE: + assert f2.tell() == 0 + assert f2.read() == _fstr + assert f2.tell() == _flen # 150 + elif fmode == dill.FILE_FMODE: + assert f2.tell() == ftell # 200 + assert f2.read() == "" + f2.seek(0) + assert f2.read() == fstr + assert f2.tell() == ftell # 200 + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + f2.close() + + # write + + write_randomness() + + f = open(fname, "w") + f.write("hello") + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + f.close() + fstr = open(fname).read() + + f = open(fname, "w") + f.write("h") + _ftell = f.tell() + f.close() + + if strictio: # throw error if ftell > EOF + assert throws(dill.loads, (f_dumped,), buffer_error) + else: + f2 = dill.loads(f_dumped) + f2mode = f2.mode + f2tell = f2.tell() + f2.write(" world!") + f2.close() + if fmode == dill.CONTENTS_FMODE: + assert open(fname).read() == "h world!" + assert f2mode == f1mode + assert f2tell == _ftell + elif fmode == dill.HANDLE_FMODE: + assert open(fname).read() == " world!" + assert f2mode == f1mode + assert f2tell == 0 + elif fmode == dill.FILE_FMODE: + assert open(fname).read() == "hello world!" + assert f2mode == f1mode + assert f2tell == ftell + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + f2.close() + + # append + + trunc_file() + + f = open(fname, "a") + f.write("hello") + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + f.close() + fstr = open(fname).read() + + f = open(fname, "w") + f.write("h") + _ftell = f.tell() + f.close() + + if strictio: # throw error if ftell > EOF + assert throws(dill.loads, (f_dumped,), buffer_error) + else: + f2 = dill.loads(f_dumped) + f2mode = f2.mode + f2tell = f2.tell() + f2.write(" world!") + f2.close() + assert f2mode == f1mode + if fmode == dill.CONTENTS_FMODE: + # position of writes cannot be changed on some OSs + assert open(fname).read() == "h world!" + assert f2tell == _ftell + elif fmode == dill.HANDLE_FMODE: + assert open(fname).read() == "h world!" + assert f2tell == _ftell + elif fmode == dill.FILE_FMODE: + assert open(fname).read() == "hello world!" + assert f2tell == ftell + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + f2.close() + + # file does not exist + # read + + write_randomness() + + f = open(fname, "r") + fstr = f.read() + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + f.close() + + os.remove(fname) + + if strictio: # throw error if file DNE + assert throws(dill.loads, (f_dumped,), dne_error) + else: + f2 = dill.loads(f_dumped) + assert f2.mode == f1mode + if fmode == dill.CONTENTS_FMODE: + # FIXME: this fails on systems where f2.tell() always returns 0 + # assert f2.tell() == ftell # 200 + assert f2.read() == "" + f2.seek(0) + assert f2.read() == "" + assert f2.tell() == 0 + elif fmode == dill.FILE_FMODE: + assert f2.tell() == ftell # 200 + assert f2.read() == "" + f2.seek(0) + assert f2.read() == fstr + assert f2.tell() == ftell # 200 + elif fmode == dill.HANDLE_FMODE: + assert f2.tell() == 0 + assert f2.read() == "" + assert f2.tell() == 0 + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + f2.close() + + # write + + write_randomness() + + f = open(fname, "w+") + f.write("hello") + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + ftell = f.tell() + f1mode = f.mode + f.close() + + os.remove(fname) + + if strictio: # throw error if file DNE + assert throws(dill.loads, (f_dumped,), dne_error) + else: + f2 = dill.loads(f_dumped) + f2mode = f2.mode + f2tell = f2.tell() + f2.write(" world!") + f2.close() + if fmode == dill.CONTENTS_FMODE: + assert open(fname).read() == " world!" + assert f2mode == 'w+' + assert f2tell == 0 + elif fmode == dill.HANDLE_FMODE: + assert open(fname).read() == " world!" + assert f2mode == f1mode + assert f2tell == 0 + elif fmode == dill.FILE_FMODE: + assert open(fname).read() == "hello world!" + assert f2mode == f1mode + assert f2tell == ftell + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + + # append + + trunc_file() + + f = open(fname, "a") + f.write("hello") + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + ftell = f.tell() + f1mode = f.mode + f.close() + + os.remove(fname) + + if strictio: # throw error if file DNE + assert throws(dill.loads, (f_dumped,), dne_error) + else: + f2 = dill.loads(f_dumped) + f2mode = f2.mode + f2tell = f2.tell() + f2.write(" world!") + f2.close() + assert f2mode == f1mode + if fmode == dill.CONTENTS_FMODE: + assert open(fname).read() == " world!" + assert f2tell == 0 + elif fmode == dill.HANDLE_FMODE: + assert open(fname).read() == " world!" + assert f2tell == 0 + elif fmode == dill.FILE_FMODE: + assert open(fname).read() == "hello world!" + assert f2tell == ftell + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + + # file exists, with different contents (larger size) + # read + + write_randomness() + + f = open(fname, "r") + fstr = f.read() + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + f.close() + _flen = 250 + _fstr = write_randomness(number=_flen) + + # XXX: no safe_file: no way to be 'safe'? + + f2 = dill.loads(f_dumped) + assert f2.mode == f1mode + if fmode == dill.CONTENTS_FMODE: + assert f2.tell() == ftell # 200 + assert f2.read() == _fstr[ftell:] + f2.seek(0) + assert f2.read() == _fstr + assert f2.tell() == _flen # 250 + elif fmode == dill.HANDLE_FMODE: + assert f2.tell() == 0 + assert f2.read() == _fstr + assert f2.tell() == _flen # 250 + elif fmode == dill.FILE_FMODE: + assert f2.tell() == ftell # 200 + assert f2.read() == "" + f2.seek(0) + assert f2.read() == fstr + assert f2.tell() == ftell # 200 + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + f2.close() # XXX: other alternatives? + + # write + + f = open(fname, "w") + f.write("hello") + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + + fstr = open(fname).read() + + f.write(" and goodbye!") + _ftell = f.tell() + f.close() + + # XXX: no safe_file: no way to be 'safe'? + + f2 = dill.loads(f_dumped) + f2mode = f2.mode + f2tell = f2.tell() + f2.write(" world!") + f2.close() + if fmode == dill.CONTENTS_FMODE: + assert open(fname).read() == "hello world!odbye!" + assert f2mode == f1mode + assert f2tell == ftell + elif fmode == dill.HANDLE_FMODE: + assert open(fname).read() == " world!" + assert f2mode == f1mode + assert f2tell == 0 + elif fmode == dill.FILE_FMODE: + assert open(fname).read() == "hello world!" + assert f2mode == f1mode + assert f2tell == ftell + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + f2.close() + + # append + + trunc_file() + + f = open(fname, "a") + f.write("hello") + f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) + f1mode = f.mode + ftell = f.tell() + fstr = open(fname).read() + + f.write(" and goodbye!") + _ftell = f.tell() + f.close() + + # XXX: no safe_file: no way to be 'safe'? + + f2 = dill.loads(f_dumped) + f2mode = f2.mode + f2tell = f2.tell() + f2.write(" world!") + f2.close() + assert f2mode == f1mode + if fmode == dill.CONTENTS_FMODE: + assert open(fname).read() == "hello and goodbye! world!" + assert f2tell == ftell + elif fmode == dill.HANDLE_FMODE: + assert open(fname).read() == "hello and goodbye! world!" + assert f2tell == _ftell + elif fmode == dill.FILE_FMODE: + assert open(fname).read() == "hello world!" + assert f2tell == ftell + else: + raise RuntimeError("Unknown file mode '%s'" % fmode) + f2.close() + + +def test_nostrictio_handlefmode(): + bench(False, dill.HANDLE_FMODE, False) + teardown_module() + + +def test_nostrictio_filefmode(): + bench(False, dill.FILE_FMODE, False) + teardown_module() + + +def test_nostrictio_contentsfmode(): + bench(False, dill.CONTENTS_FMODE, True) + teardown_module() + + +#bench(True, dill.HANDLE_FMODE, False) +#bench(True, dill.FILE_FMODE, False) +#bench(True, dill.CONTENTS_FMODE, True) + + +if __name__ == '__main__': + test_nostrictio_handlefmode() + test_nostrictio_filefmode() + test_nostrictio_contentsfmode() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_functions.py b/myenv/lib/python3.12/site-packages/dill/tests/test_functions.py new file mode 100644 index 0000000..305acc6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_functions.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2019-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import functools +import dill +import sys +dill.settings['recurse'] = True + + +def function_a(a): + return a + + +def function_b(b, b1): + return b + b1 + + +def function_c(c, c1=1): + return c + c1 + + +def function_d(d, d1, d2=1): + """doc string""" + return d + d1 + d2 + +function_d.__module__ = 'a module' + + +exec(''' +def function_e(e, *e1, e2=1, e3=2): + return e + sum(e1) + e2 + e3''') + +globalvar = 0 + +@functools.lru_cache(None) +def function_with_cache(x): + global globalvar + globalvar += x + return globalvar + + +def function_with_unassigned_variable(): + if False: + value = None + return (lambda: value) + + +def test_issue_510(): + # A very bizzare use of functions and methods that pickle doesn't get + # correctly for odd reasons. + class Foo: + def __init__(self): + def f2(self): + return self + self.f2 = f2.__get__(self) + + import dill, pickletools + f = Foo() + f1 = dill.copy(f) + assert f1.f2() is f1 + + +def test_functions(): + dumped_func_a = dill.dumps(function_a) + assert dill.loads(dumped_func_a)(0) == 0 + + dumped_func_b = dill.dumps(function_b) + assert dill.loads(dumped_func_b)(1,2) == 3 + + dumped_func_c = dill.dumps(function_c) + assert dill.loads(dumped_func_c)(1) == 2 + assert dill.loads(dumped_func_c)(1, 2) == 3 + + dumped_func_d = dill.dumps(function_d) + assert dill.loads(dumped_func_d).__doc__ == function_d.__doc__ + assert dill.loads(dumped_func_d).__module__ == function_d.__module__ + assert dill.loads(dumped_func_d)(1, 2) == 4 + assert dill.loads(dumped_func_d)(1, 2, 3) == 6 + assert dill.loads(dumped_func_d)(1, 2, d2=3) == 6 + + function_with_cache(1) + globalvar = 0 + dumped_func_cache = dill.dumps(function_with_cache) + assert function_with_cache(2) == 3 + assert function_with_cache(1) == 1 + assert function_with_cache(3) == 6 + assert function_with_cache(2) == 3 + + empty_cell = function_with_unassigned_variable() + cell_copy = dill.loads(dill.dumps(empty_cell)) + assert 'empty' in str(cell_copy.__closure__[0]) + try: + cell_copy() + except Exception: + # this is good + pass + else: + raise AssertionError('cell_copy() did not read an empty cell') + + exec(''' +dumped_func_e = dill.dumps(function_e) +assert dill.loads(dumped_func_e)(1, 2) == 6 +assert dill.loads(dumped_func_e)(1, 2, 3) == 9 +assert dill.loads(dumped_func_e)(1, 2, e2=3) == 8 +assert dill.loads(dumped_func_e)(1, 2, e2=3, e3=4) == 10 +assert dill.loads(dumped_func_e)(1, 2, 3, e2=4) == 12 +assert dill.loads(dumped_func_e)(1, 2, 3, e2=4, e3=5) == 15''') + +def test_code_object(): + import warnings + from dill._dill import ALL_CODE_PARAMS, CODE_PARAMS, CODE_VERSION, _create_code + code = function_c.__code__ + warnings.filterwarnings('ignore', category=DeprecationWarning) # issue 597 + LNOTAB = getattr(code, 'co_lnotab', b'') + if warnings.filters: del warnings.filters[0] + fields = {f: getattr(code, 'co_'+f) for f in CODE_PARAMS} + fields.setdefault('posonlyargcount', 0) # python >= 3.8 + fields.setdefault('lnotab', LNOTAB) # python <= 3.9 + fields.setdefault('linetable', b'') # python >= 3.10 + fields.setdefault('qualname', fields['name']) # python >= 3.11 + fields.setdefault('exceptiontable', b'') # python >= 3.11 + fields.setdefault('endlinetable', None) # python == 3.11a + fields.setdefault('columntable', None) # python == 3.11a + + for version, _, params in ALL_CODE_PARAMS: + args = tuple(fields[p] for p in params.split()) + try: + _create_code(*args) + if version >= (3,10): + _create_code(fields['lnotab'], *args) + except Exception as error: + raise Exception("failed to construct code object with format version {}".format(version)) from error + +if __name__ == '__main__': + test_functions() + test_issue_510() + test_code_object() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_functors.py b/myenv/lib/python3.12/site-packages/dill/tests/test_functors.py new file mode 100644 index 0000000..1008be6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_functors.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import functools +import dill +dill.settings['recurse'] = True + + +def f(a, b, c): # without keywords + pass + + +def g(a, b, c=2): # with keywords + pass + + +def h(a=1, b=2, c=3): # without args + pass + + +def test_functools(): + fp = functools.partial(f, 1, 2) + gp = functools.partial(g, 1, c=2) + hp = functools.partial(h, 1, c=2) + bp = functools.partial(int, base=2) + + assert dill.pickles(fp, safe=True) + assert dill.pickles(gp, safe=True) + assert dill.pickles(hp, safe=True) + assert dill.pickles(bp, safe=True) + + +if __name__ == '__main__': + test_functools() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_logger.py b/myenv/lib/python3.12/site-packages/dill/tests/test_logger.py new file mode 100644 index 0000000..b878a10 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_logger.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +# Author: Leonardo Gama (@leogama) +# Copyright (c) 2022-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import logging +import re +import tempfile + +import dill +from dill import detect +from dill.logger import stderr_handler, adapter as logger + +try: + from StringIO import StringIO +except ImportError: + from io import StringIO + +test_obj = {'a': (1, 2), 'b': object(), 'f': lambda x: x**2, 'big': list(range(10))} + +def test_logging(should_trace): + buffer = StringIO() + handler = logging.StreamHandler(buffer) + logger.addHandler(handler) + try: + dill.dumps(test_obj) + if should_trace: + regex = re.compile(r'(\S*┬ \w.*[^)]' # begin pickling object + r'|│*└ # \w.* \[\d+ (\wi)?B])' # object written (with size) + ) + for line in buffer.getvalue().splitlines(): + assert regex.fullmatch(line) + return buffer.getvalue() + else: + assert buffer.getvalue() == "" + finally: + logger.removeHandler(handler) + buffer.close() + +def test_trace_to_file(stream_trace): + file = tempfile.NamedTemporaryFile(mode='r') + with detect.trace(file.name, mode='w'): + dill.dumps(test_obj) + file_trace = file.read() + file.close() + # Apparently, objects can change location in memory... + reghex = re.compile(r'0x[0-9A-Za-z]+') + file_trace, stream_trace = reghex.sub('0x', file_trace), reghex.sub('0x', stream_trace) + # PyPy prints dictionary contents with repr(dict)... + regdict = re.compile(r'(dict\.__repr__ of ).*') + file_trace, stream_trace = regdict.sub(r'\1{}>', file_trace), regdict.sub(r'\1{}>', stream_trace) + assert file_trace == stream_trace + +if __name__ == '__main__': + logger.removeHandler(stderr_handler) + test_logging(should_trace=False) + detect.trace(True) + test_logging(should_trace=True) + detect.trace(False) + test_logging(should_trace=False) + + loglevel = logging.ERROR + logger.setLevel(loglevel) + with detect.trace(): + stream_trace = test_logging(should_trace=True) + test_logging(should_trace=False) + assert logger.getEffectiveLevel() == loglevel + test_trace_to_file(stream_trace) diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_mixins.py b/myenv/lib/python3.12/site-packages/dill/tests/test_mixins.py new file mode 100644 index 0000000..6d67dad --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_mixins.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill +dill.settings['recurse'] = True + + +def wtf(x,y,z): + def zzz(): + return x + def yyy(): + return y + def xxx(): + return z + return zzz,yyy + + +def quad(a=1, b=1, c=0): + inverted = [False] + def invert(): + inverted[0] = not inverted[0] + def dec(f): + def func(*args, **kwds): + x = f(*args, **kwds) + if inverted[0]: x = -x + return a*x**2 + b*x + c + func.__wrapped__ = f + func.invert = invert + func.inverted = inverted + return func + return dec + + +@quad(a=0,b=2) +def double_add(*args): + return sum(args) + + +fx = sum([1,2,3]) + + +### to make it interesting... +def quad_factory(a=1,b=1,c=0): + def dec(f): + def func(*args,**kwds): + fx = f(*args,**kwds) + return a*fx**2 + b*fx + c + return func + return dec + + +@quad_factory(a=0,b=4,c=0) +def quadish(x): + return x+1 + + +quadratic = quad_factory() + + +def doubler(f): + def inner(*args, **kwds): + fx = f(*args, **kwds) + return 2*fx + return inner + + +@doubler +def quadruple(x): + return 2*x + + +def test_mixins(): + # test mixins + assert double_add(1,2,3) == 2*fx + double_add.invert() + assert double_add(1,2,3) == -2*fx + + _d = dill.copy(double_add) + assert _d(1,2,3) == -2*fx + #_d.invert() #FIXME: fails seemingly randomly + #assert _d(1,2,3) == 2*fx + + assert _d.__wrapped__(1,2,3) == fx + + # XXX: issue or feature? in python3.4, inverted is linked through copy + if not double_add.inverted[0]: + double_add.invert() + + # test some stuff from source and pointers + ds = dill.source + dd = dill.detect + assert ds.getsource(dd.freevars(quadish)['f']) == '@quad_factory(a=0,b=4,c=0)\ndef quadish(x):\n return x+1\n' + assert ds.getsource(dd.freevars(quadruple)['f']) == '@doubler\ndef quadruple(x):\n return 2*x\n' + assert ds.importable(quadish, source=False) == 'from %s import quadish\n' % __name__ + assert ds.importable(quadruple, source=False) == 'from %s import quadruple\n' % __name__ + assert ds.importable(quadratic, source=False) == 'from %s import quadratic\n' % __name__ + assert ds.importable(double_add, source=False) == 'from %s import double_add\n' % __name__ + assert ds.importable(quadruple, source=True) == 'def doubler(f):\n def inner(*args, **kwds):\n fx = f(*args, **kwds)\n return 2*fx\n return inner\n\n@doubler\ndef quadruple(x):\n return 2*x\n' + #***** #FIXME: this needs work + result = ds.importable(quadish, source=True) + a,b,c,_,result = result.split('\n',4) + assert result == 'def quad_factory(a=1,b=1,c=0):\n def dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n return dec\n\n@quad_factory(a=0,b=4,c=0)\ndef quadish(x):\n return x+1\n' + assert set([a,b,c]) == set(['a = 0', 'c = 0', 'b = 4']) + result = ds.importable(quadratic, source=True) + a,b,c,result = result.split('\n',3) + assert result == '\ndef dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n' + assert set([a,b,c]) == set(['a = 1', 'c = 0', 'b = 1']) + result = ds.importable(double_add, source=True) + a,b,c,d,_,result = result.split('\n',5) + assert result == 'def quad(a=1, b=1, c=0):\n inverted = [False]\n def invert():\n inverted[0] = not inverted[0]\n def dec(f):\n def func(*args, **kwds):\n x = f(*args, **kwds)\n if inverted[0]: x = -x\n return a*x**2 + b*x + c\n func.__wrapped__ = f\n func.invert = invert\n func.inverted = inverted\n return func\n return dec\n\n@quad(a=0,b=2)\ndef double_add(*args):\n return sum(args)\n' + assert set([a,b,c,d]) == set(['a = 0', 'c = 0', 'b = 2', 'inverted = [True]']) + #***** + + +if __name__ == '__main__': + test_mixins() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_module.py b/myenv/lib/python3.12/site-packages/dill/tests/test_module.py new file mode 100644 index 0000000..b696d72 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_module.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import sys +import dill +import test_mixins as module +from importlib import reload +dill.settings['recurse'] = True + +cached = (module.__cached__ if hasattr(module, "__cached__") + else module.__file__.split(".", 1)[0] + ".pyc") + +module.a = 1234 + +pik_mod = dill.dumps(module) + +module.a = 0 + +# remove module +del sys.modules[module.__name__] +del module + +module = dill.loads(pik_mod) +def test_attributes(): + #assert hasattr(module, "a") and module.a == 1234 #FIXME: -m dill.tests + assert module.double_add(1, 2, 3) == 2 * module.fx + +# Restart, and test use_diff + +reload(module) + +try: + dill.use_diff() + + module.a = 1234 + + pik_mod = dill.dumps(module) + + module.a = 0 + + # remove module + del sys.modules[module.__name__] + del module + + module = dill.loads(pik_mod) + def test_diff_attributes(): + assert hasattr(module, "a") and module.a == 1234 + assert module.double_add(1, 2, 3) == 2 * module.fx + +except AttributeError: + def test_diff_attributes(): + pass + +# clean up +import os +if os.path.exists(cached): + os.remove(cached) +pycache = os.path.join(os.path.dirname(module.__file__), "__pycache__") +if os.path.exists(pycache) and not os.listdir(pycache): + os.removedirs(pycache) + + +# test when module is None +import math + +def get_lambda(str, **kwarg): + return eval(str, kwarg, None) + +obj = get_lambda('lambda x: math.exp(x)', math=math) + +def test_module_is_none(): + assert obj.__module__ is None + assert dill.copy(obj)(3) == obj(3) + + +if __name__ == '__main__': + test_attributes() + test_diff_attributes() + test_module_is_none() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_moduledict.py b/myenv/lib/python3.12/site-packages/dill/tests/test_moduledict.py new file mode 100644 index 0000000..5e6e87b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_moduledict.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill +dill.settings['recurse'] = True + +def f(func): + def w(*args): + return f(*args) + return w + +@f +def f2(): pass + +# check when __main__ and on import +def test_decorated(): + assert dill.pickles(f2) + + +import doctest +import logging +logging.basicConfig(level=logging.DEBUG) + +class SomeUnreferencedUnpicklableClass(object): + def __reduce__(self): + raise Exception + +unpicklable = SomeUnreferencedUnpicklableClass() + +# This works fine outside of Doctest: +def test_normal(): + serialized = dill.dumps(lambda x: x) + +# should not try to pickle unpicklable object in __globals__ +def tests(): + """ + >>> serialized = dill.dumps(lambda x: x) + """ + return + +#print("\n\nRunning Doctest:") +def test_doctest(): + doctest.testmod() + + +if __name__ == '__main__': + test_decorated() + test_normal() + test_doctest() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_nested.py b/myenv/lib/python3.12/site-packages/dill/tests/test_nested.py new file mode 100644 index 0000000..9109f55 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_nested.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +test dill's ability to handle nested functions +""" + +import os +import math + +import dill as pickle +pickle.settings['recurse'] = True + + +# the nested function: pickle should fail here, but dill is ok. +def adder(augend): + zero = [0] + + def inner(addend): + return addend + augend + zero[0] + return inner + + +# rewrite the nested function using a class: standard pickle should work here. +class cadder(object): + def __init__(self, augend): + self.augend = augend + self.zero = [0] + + def __call__(self, addend): + return addend + self.augend + self.zero[0] + + +# rewrite again, but as an old-style class +class c2adder: + def __init__(self, augend): + self.augend = augend + self.zero = [0] + + def __call__(self, addend): + return addend + self.augend + self.zero[0] + + +# some basic class stuff +class basic(object): + pass + + +class basic2: + pass + + +x = 5 +y = 1 + + +def test_basic(): + a = [0, 1, 2] + pa = pickle.dumps(a) + pmath = pickle.dumps(math) #XXX: FAILS in pickle + pmap = pickle.dumps(map) + # ... + la = pickle.loads(pa) + lmath = pickle.loads(pmath) + lmap = pickle.loads(pmap) + assert list(map(math.sin, a)) == list(lmap(lmath.sin, la)) + + +def test_basic_class(): + pbasic2 = pickle.dumps(basic2) + _pbasic2 = pickle.loads(pbasic2)() + pbasic = pickle.dumps(basic) + _pbasic = pickle.loads(pbasic)() + + +def test_c2adder(): + pc2adder = pickle.dumps(c2adder) + pc2add5 = pickle.loads(pc2adder)(x) + assert pc2add5(y) == x+y + + +def test_pickled_cadder(): + pcadder = pickle.dumps(cadder) + pcadd5 = pickle.loads(pcadder)(x) + assert pcadd5(y) == x+y + + +def test_raw_adder_and_inner(): + add5 = adder(x) + assert add5(y) == x+y + + +def test_pickled_adder(): + padder = pickle.dumps(adder) + padd5 = pickle.loads(padder)(x) + assert padd5(y) == x+y + + +def test_pickled_inner(): + add5 = adder(x) + pinner = pickle.dumps(add5) #XXX: FAILS in pickle + p5add = pickle.loads(pinner) + assert p5add(y) == x+y + + +def test_moduledict_where_not_main(): + try: + from . import test_moduledict + except ImportError: + import test_moduledict + name = 'test_moduledict.py' + if os.path.exists(name) and os.path.exists(name+'c'): + os.remove(name+'c') + + if os.path.exists(name) and hasattr(test_moduledict, "__cached__") \ + and os.path.exists(test_moduledict.__cached__): + os.remove(getattr(test_moduledict, "__cached__")) + + if os.path.exists("__pycache__") and not os.listdir("__pycache__"): + os.removedirs("__pycache__") + + +if __name__ == '__main__': + test_basic() + test_basic_class() + test_c2adder() + test_pickled_cadder() + test_raw_adder_and_inner() + test_pickled_adder() + test_pickled_inner() + test_moduledict_where_not_main() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_objects.py b/myenv/lib/python3.12/site-packages/dill/tests/test_objects.py new file mode 100644 index 0000000..7db288d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_objects.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +demonstrate dill's ability to pickle different python types +test pickling of all Python Standard Library objects (currently: CH 1-14 @ 2.7) +""" + +import dill as pickle +pickle.settings['recurse'] = True +#pickle.detect.trace(True) +#import pickle + +# get all objects for testing +from dill import load_types, objects, extend +load_types(pickleable=True,unpickleable=False) + +# uncomment the next two lines to test cloudpickle +#extend(False) +#import cloudpickle as pickle + +# helper objects +class _class: + def _method(self): + pass + +# objects that *fail* if imported +special = {} +special['LambdaType'] = _lambda = lambda x: lambda y: x +special['MethodType'] = _method = _class()._method +special['UnboundMethodType'] = _class._method +objects.update(special) + +def pickles(name, exact=False, verbose=True): + """quick check if object pickles with dill""" + obj = objects[name] + try: + pik = pickle.loads(pickle.dumps(obj)) + if exact: + try: + assert pik == obj + except AssertionError: + assert type(obj) == type(pik) + if verbose: print ("weak: %s %s" % (name, type(obj))) + else: + assert type(obj) == type(pik) + except Exception: + if verbose: print ("fails: %s %s" % (name, type(obj))) + + +def test_objects(verbose=True): + for member in objects.keys(): + #pickles(member, exact=True, verbose=verbose) + pickles(member, exact=False, verbose=verbose) + +if __name__ == '__main__': + import warnings + warnings.simplefilter('ignore') + test_objects(verbose=False) diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_properties.py b/myenv/lib/python3.12/site-packages/dill/tests/test_properties.py new file mode 100644 index 0000000..df3f5b5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_properties.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import sys + +import dill +dill.settings['recurse'] = True + + +class Foo(object): + def __init__(self): + self._data = 1 + + def _get_data(self): + return self._data + + def _set_data(self, x): + self._data = x + + data = property(_get_data, _set_data) + + +def test_data_not_none(): + FooS = dill.copy(Foo) + assert FooS.data.fget is not None + assert FooS.data.fset is not None + assert FooS.data.fdel is None + + +def test_data_unchanged(): + FooS = dill.copy(Foo) + try: + res = FooS().data + except Exception: + e = sys.exc_info()[1] + raise AssertionError(str(e)) + else: + assert res == 1 + + +def test_data_changed(): + FooS = dill.copy(Foo) + try: + f = FooS() + f.data = 1024 + res = f.data + except Exception: + e = sys.exc_info()[1] + raise AssertionError(str(e)) + else: + assert res == 1024 + + +if __name__ == '__main__': + test_data_not_none() + test_data_unchanged() + test_data_changed() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_pycapsule.py b/myenv/lib/python3.12/site-packages/dill/tests/test_pycapsule.py new file mode 100644 index 0000000..34ca00c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_pycapsule.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Author: Anirudh Vegesana (avegesan@cs.stanford.edu) +# Copyright (c) 2022-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +test pickling a PyCapsule object +""" + +import dill +import warnings + +test_pycapsule = None + +if dill._dill._testcapsule is not None: + import ctypes + def test_pycapsule(): + name = ctypes.create_string_buffer(b'dill._testcapsule') + capsule = dill._dill._PyCapsule_New( + ctypes.cast(dill._dill._PyCapsule_New, ctypes.c_void_p), + name, + None + ) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + dill.copy(capsule) + dill._testcapsule = capsule + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + dill.copy(capsule) + dill._testcapsule = None + try: + with warnings.catch_warnings(): + warnings.simplefilter("ignore", dill.PicklingWarning) + dill.copy(capsule) + except dill.UnpicklingError: + pass + else: + raise AssertionError("Expected a different error") + +if __name__ == '__main__': + if test_pycapsule is not None: + test_pycapsule() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_recursive.py b/myenv/lib/python3.12/site-packages/dill/tests/test_recursive.py new file mode 100644 index 0000000..b84f19e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_recursive.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2019-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill +from functools import partial +import warnings + + +def copy(obj, byref=False, recurse=False): + if byref: + try: + return dill.copy(obj, byref=byref, recurse=recurse) + except Exception: + pass + else: + raise AssertionError('Copy of %s with byref=True should have given a warning!' % (obj,)) + + warnings.simplefilter('ignore') + val = dill.copy(obj, byref=byref, recurse=recurse) + warnings.simplefilter('error') + return val + else: + return dill.copy(obj, byref=byref, recurse=recurse) + + +class obj1(object): + def __init__(self): + super(obj1, self).__init__() + +class obj2(object): + def __init__(self): + super(obj2, self).__init__() + +class obj3(object): + super_ = super + def __init__(self): + obj3.super_(obj3, self).__init__() + + +def test_super(): + assert copy(obj1(), byref=True) + assert copy(obj1(), byref=True, recurse=True) + assert copy(obj1(), recurse=True) + assert copy(obj1()) + + assert copy(obj2(), byref=True) + assert copy(obj2(), byref=True, recurse=True) + assert copy(obj2(), recurse=True) + assert copy(obj2()) + + assert copy(obj3(), byref=True) + assert copy(obj3(), byref=True, recurse=True) + assert copy(obj3(), recurse=True) + assert copy(obj3()) + + +def get_trigger(model): + pass + +class Machine(object): + def __init__(self): + self.child = Model() + self.trigger = partial(get_trigger, self) + self.child.trigger = partial(get_trigger, self.child) + +class Model(object): + pass + + + +def test_partial(): + assert copy(Machine(), byref=True) + assert copy(Machine(), byref=True, recurse=True) + assert copy(Machine(), recurse=True) + assert copy(Machine()) + + +class Machine2(object): + def __init__(self): + self.go = partial(self.member, self) + def member(self, model): + pass + + +class SubMachine(Machine2): + def __init__(self): + super(SubMachine, self).__init__() + + +def test_partials(): + assert copy(SubMachine(), byref=True) + assert copy(SubMachine(), byref=True, recurse=True) + assert copy(SubMachine(), recurse=True) + assert copy(SubMachine()) + + +class obj4(object): + def __init__(self): + super(obj4, self).__init__() + a = self + class obj5(object): + def __init__(self): + super(obj5, self).__init__() + self.a = a + self.b = obj5() + + +def test_circular_reference(): + assert copy(obj4()) + obj4_copy = dill.loads(dill.dumps(obj4())) + assert type(obj4_copy) is type(obj4_copy).__init__.__closure__[0].cell_contents + assert type(obj4_copy.b) is type(obj4_copy.b).__init__.__closure__[0].cell_contents + + +def f(): + def g(): + return g + return g + + +def test_function_cells(): + assert copy(f()) + + +def fib(n): + assert n >= 0 + if n <= 1: + return n + else: + return fib(n-1) + fib(n-2) + + +def test_recursive_function(): + global fib + fib2 = copy(fib, recurse=True) + fib3 = copy(fib) + fib4 = fib + del fib + assert fib2(5) == 5 + for _fib in (fib3, fib4): + try: + _fib(5) + except Exception: + # This is expected to fail because fib no longer exists + pass + else: + raise AssertionError("Function fib shouldn't have been found") + fib = fib4 + + +def collection_function_recursion(): + d = {} + def g(): + return d + d['g'] = g + return g + + +def test_collection_function_recursion(): + g = copy(collection_function_recursion()) + assert g()['g'] is g + + +if __name__ == '__main__': + with warnings.catch_warnings(): + warnings.simplefilter('error') + test_super() + test_partial() + test_partials() + test_circular_reference() + test_function_cells() + test_recursive_function() + test_collection_function_recursion() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_registered.py b/myenv/lib/python3.12/site-packages/dill/tests/test_registered.py new file mode 100644 index 0000000..393e2f3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_registered.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2022-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +test pickling registered objects +""" + +import dill +from dill._objects import failures, registered, succeeds +import warnings +warnings.filterwarnings('ignore') + +def check(d, ok=True): + res = [] + for k,v in d.items(): + try: + z = dill.copy(v) + if ok: res.append(k) + except: + if not ok: res.append(k) + return res + +fails = check(failures) +try: + assert not bool(fails) +except AssertionError as e: + print("FAILS: %s" % fails) + raise e from None + +register = check(registered, ok=False) +try: + assert not bool(register) +except AssertionError as e: + print("REGISTER: %s" % register) + raise e from None + +success = check(succeeds, ok=False) +try: + assert not bool(success) +except AssertionError as e: + print("SUCCESS: %s" % success) + raise e from None + +import builtins +import types +q = dill._dill._reverse_typemap +p = {k:v for k,v in q.items() if k not in vars(builtins) and k not in vars(types)} + +diff = set(p.keys()).difference(registered.keys()) +try: + assert not bool(diff) +except AssertionError as e: + print("DIFF: %s" % diff) + raise e from None + +miss = set(registered.keys()).difference(p.keys()) +try: + assert not bool(miss) +except AssertionError as e: + print("MISS: %s" % miss) + raise e from None diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_restricted.py b/myenv/lib/python3.12/site-packages/dill/tests/test_restricted.py new file mode 100644 index 0000000..cdb773e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_restricted.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# +# Author: Kirill Makhonin (@kirillmakhonin) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill + +class RestrictedType: + def __bool__(*args, **kwargs): + raise Exception('Restricted function') + + __eq__ = __lt__ = __le__ = __ne__ = __gt__ = __ge__ = __hash__ = __bool__ + +glob_obj = RestrictedType() + +def restricted_func(): + a = glob_obj + +def test_function_with_restricted_object(): + deserialized = dill.loads(dill.dumps(restricted_func, recurse=True)) + + +if __name__ == '__main__': + test_function_with_restricted_object() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_selected.py b/myenv/lib/python3.12/site-packages/dill/tests/test_selected.py new file mode 100644 index 0000000..bcc640a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_selected.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +testing some selected object types +""" + +import dill +dill.settings['recurse'] = True + +verbose = False + +def test_dict_contents(): + c = type.__dict__ + for i,j in c.items(): + #try: + ok = dill.pickles(j) + #except Exception: + # print ("FAIL: %s with %s" % (i, dill.detect.errors(j))) + if verbose: print ("%s: %s, %s" % (ok, type(j), j)) + assert ok + if verbose: print ("") + +def _g(x): yield x; + +def _f(): + try: raise + except Exception: + from sys import exc_info + e, er, tb = exc_info() + return er, tb + +class _d(object): + def _method(self): + pass + +from dill import objects +from dill import load_types +load_types(pickleable=True,unpickleable=False) +_newclass = objects['ClassObjectType'] +# some clean-up #FIXME: should happen internal to dill +objects['TemporaryFileType'].close() +objects['TextWrapperType'].close() +if 'BufferedRandomType' in objects: + objects['BufferedRandomType'].close() +objects['BufferedReaderType'].close() +objects['BufferedWriterType'].close() +objects['FileType'].close() +del objects + +# getset_descriptor for new-style classes (fails on '_method', if not __main__) +def test_class_descriptors(): + d = _d.__dict__ + for i in d.values(): + ok = dill.pickles(i) + if verbose: print ("%s: %s, %s" % (ok, type(i), i)) + assert ok + if verbose: print ("") + od = _newclass.__dict__ + for i in od.values(): + ok = dill.pickles(i) + if verbose: print ("%s: %s, %s" % (ok, type(i), i)) + assert ok + if verbose: print ("") + +# (__main__) class instance for new-style classes +def test_class(): + o = _d() + oo = _newclass() + ok = dill.pickles(o) + if verbose: print ("%s: %s, %s" % (ok, type(o), o)) + assert ok + ok = dill.pickles(oo) + if verbose: print ("%s: %s, %s" % (ok, type(oo), oo)) + assert ok + if verbose: print ("") + +# frames, generators, and tracebacks (all depend on frame) +def test_frame_related(): + g = _g(1) + f = g.gi_frame + e,t = _f() + _is = lambda ok: ok + ok = dill.pickles(f) + if verbose: print ("%s: %s, %s" % (ok, type(f), f)) + assert not ok + ok = dill.pickles(g) + if verbose: print ("%s: %s, %s" % (ok, type(g), g)) + assert _is(not ok) #XXX: dill fails + ok = dill.pickles(t) + if verbose: print ("%s: %s, %s" % (ok, type(t), t)) + assert not ok #XXX: dill fails + ok = dill.pickles(e) + if verbose: print ("%s: %s, %s" % (ok, type(e), e)) + assert ok + if verbose: print ("") + +def test_typing(): + import typing + x = typing.Any + assert x == dill.copy(x) + x = typing.Dict[int, str] + assert x == dill.copy(x) + x = typing.List[int] + assert x == dill.copy(x) + x = typing.Tuple[int, str] + assert x == dill.copy(x) + x = typing.Tuple[int] + assert x == dill.copy(x) + x = typing.Tuple[()] + assert x == dill.copy(x) + x = typing.Tuple[()].copy_with(()) + assert x == dill.copy(x) + return + + +if __name__ == '__main__': + test_frame_related() + test_dict_contents() + test_class() + test_class_descriptors() + test_typing() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_session.py b/myenv/lib/python3.12/site-packages/dill/tests/test_session.py new file mode 100644 index 0000000..200642d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_session.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python + +# Author: Leonardo Gama (@leogama) +# Copyright (c) 2022-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import atexit +import os +import sys +import __main__ +from contextlib import suppress +from io import BytesIO + +import dill + +session_file = os.path.join(os.path.dirname(__file__), 'session-refimported-%s.pkl') + +################### +# Child process # +################### + +def _error_line(error, obj, refimported): + import traceback + line = traceback.format_exc().splitlines()[-2].replace('[obj]', '['+repr(obj)+']') + return "while testing (with refimported=%s): %s" % (refimported, line.lstrip()) + +if __name__ == '__main__' and len(sys.argv) >= 3 and sys.argv[1] == '--child': + # Test session loading in a fresh interpreter session. + refimported = (sys.argv[2] == 'True') + dill.load_module(session_file % refimported, module='__main__') + + def test_modules(refimported): + # FIXME: In this test setting with CPython 3.7, 'calendar' is not included + # in sys.modules, independent of the value of refimported. Tried to + # run garbage collection just before loading the session with no luck. It + # fails even when preceding them with 'import calendar'. Needed to run + # these kinds of tests in a supbrocess. Failing test sample: + # assert globals()['day_name'] is sys.modules['calendar'].__dict__['day_name'] + try: + for obj in ('json', 'url', 'local_mod', 'sax', 'dom'): + assert globals()[obj].__name__ in sys.modules + assert 'calendar' in sys.modules and 'cmath' in sys.modules + import calendar, cmath + + for obj in ('Calendar', 'isleap'): + assert globals()[obj] is sys.modules['calendar'].__dict__[obj] + assert __main__.day_name.__module__ == 'calendar' + if refimported: + assert __main__.day_name is calendar.day_name + + assert __main__.complex_log is cmath.log + + except AssertionError as error: + error.args = (_error_line(error, obj, refimported),) + raise + + test_modules(refimported) + sys.exit() + +#################### +# Parent process # +#################### + +# Create various kinds of objects to test different internal logics. + +## Modules. +import json # top-level module +import urllib as url # top-level module under alias +from xml import sax # submodule +import xml.dom.minidom as dom # submodule under alias +import test_dictviews as local_mod # non-builtin top-level module + +## Imported objects. +from calendar import Calendar, isleap, day_name # class, function, other object +from cmath import log as complex_log # imported with alias + +## Local objects. +x = 17 +empty = None +names = ['Alice', 'Bob', 'Carol'] +def squared(x): return x**2 +cubed = lambda x: x**3 +class Person: + def __init__(self, name, age): + self.name = name + self.age = age +person = Person(names[0], x) +class CalendarSubclass(Calendar): + def weekdays(self): + return [day_name[i] for i in self.iterweekdays()] +cal = CalendarSubclass() +selfref = __main__ + +# Setup global namespace for session saving tests. +class TestNamespace: + test_globals = globals().copy() + def __init__(self, **extra): + self.extra = extra + def __enter__(self): + self.backup = globals().copy() + globals().clear() + globals().update(self.test_globals) + globals().update(self.extra) + return self + def __exit__(self, *exc_info): + globals().clear() + globals().update(self.backup) + +def _clean_up_cache(module): + cached = module.__file__.split('.', 1)[0] + '.pyc' + cached = module.__cached__ if hasattr(module, '__cached__') else cached + pycache = os.path.join(os.path.dirname(module.__file__), '__pycache__') + for remove, file in [(os.remove, cached), (os.removedirs, pycache)]: + with suppress(OSError): + remove(file) + +atexit.register(_clean_up_cache, local_mod) + +def _test_objects(main, globals_copy, refimported): + try: + main_dict = __main__.__dict__ + global Person, person, Calendar, CalendarSubclass, cal, selfref + + for obj in ('json', 'url', 'local_mod', 'sax', 'dom'): + assert globals()[obj].__name__ == globals_copy[obj].__name__ + + for obj in ('x', 'empty', 'names'): + assert main_dict[obj] == globals_copy[obj] + + for obj in ['squared', 'cubed']: + assert main_dict[obj].__globals__ is main_dict + assert main_dict[obj](3) == globals_copy[obj](3) + + assert Person.__module__ == __main__.__name__ + assert isinstance(person, Person) + assert person.age == globals_copy['person'].age + + assert issubclass(CalendarSubclass, Calendar) + assert isinstance(cal, CalendarSubclass) + assert cal.weekdays() == globals_copy['cal'].weekdays() + + assert selfref is __main__ + + except AssertionError as error: + error.args = (_error_line(error, obj, refimported),) + raise + +def test_session_main(refimported): + """test dump/load_module() for __main__, both in this process and in a subprocess""" + extra_objects = {} + if refimported: + # Test unpickleable imported object in main. + from sys import flags + extra_objects['flags'] = flags + + with TestNamespace(**extra_objects) as ns: + try: + # Test session loading in a new session. + dill.dump_module(session_file % refimported, refimported=refimported) + from dill.tests.__main__ import python, shell, sp + error = sp.call([python, __file__, '--child', str(refimported)], shell=shell) + if error: sys.exit(error) + finally: + with suppress(OSError): + os.remove(session_file % refimported) + + # Test session loading in the same session. + session_buffer = BytesIO() + dill.dump_module(session_buffer, refimported=refimported) + session_buffer.seek(0) + dill.load_module(session_buffer, module='__main__') + ns.backup['_test_objects'](__main__, ns.backup, refimported) + +def test_session_other(): + """test dump/load_module() for a module other than __main__""" + import test_classdef as module + atexit.register(_clean_up_cache, module) + module.selfref = module + dict_objects = [obj for obj in module.__dict__.keys() if not obj.startswith('__')] + + session_buffer = BytesIO() + dill.dump_module(session_buffer, module) + + for obj in dict_objects: + del module.__dict__[obj] + + session_buffer.seek(0) + dill.load_module(session_buffer, module) + + assert all(obj in module.__dict__ for obj in dict_objects) + assert module.selfref is module + +def test_runtime_module(): + from types import ModuleType + modname = '__runtime__' + runtime = ModuleType(modname) + runtime.x = 42 + + mod = dill.session._stash_modules(runtime) + if mod is not runtime: + print("There are objects to save by referenece that shouldn't be:", + mod.__dill_imported, mod.__dill_imported_as, mod.__dill_imported_top_level, + file=sys.stderr) + + # This is also for code coverage, tests the use case of dump_module(refimported=True) + # without imported objects in the namespace. It's a contrived example because + # even dill can't be in it. This should work after fixing #462. + session_buffer = BytesIO() + dill.dump_module(session_buffer, module=runtime, refimported=True) + session_dump = session_buffer.getvalue() + + # Pass a new runtime created module with the same name. + runtime = ModuleType(modname) # empty + return_val = dill.load_module(BytesIO(session_dump), module=runtime) + assert return_val is None + assert runtime.__name__ == modname + assert runtime.x == 42 + assert runtime not in sys.modules.values() + + # Pass nothing as main. load_module() must create it. + session_buffer.seek(0) + runtime = dill.load_module(BytesIO(session_dump)) + assert runtime.__name__ == modname + assert runtime.x == 42 + assert runtime not in sys.modules.values() + +def test_refimported_imported_as(): + import collections + import concurrent.futures + import types + import typing + mod = sys.modules['__test__'] = types.ModuleType('__test__') + dill.executor = concurrent.futures.ThreadPoolExecutor(max_workers=1) + mod.Dict = collections.UserDict # select by type + mod.AsyncCM = typing.AsyncContextManager # select by __module__ + mod.thread_exec = dill.executor # select by __module__ with regex + + session_buffer = BytesIO() + dill.dump_module(session_buffer, mod, refimported=True) + session_buffer.seek(0) + mod = dill.load(session_buffer) + del sys.modules['__test__'] + + assert set(mod.__dill_imported_as) == { + ('collections', 'UserDict', 'Dict'), + ('typing', 'AsyncContextManager', 'AsyncCM'), + ('dill', 'executor', 'thread_exec'), + } + +def test_load_module_asdict(): + with TestNamespace(): + session_buffer = BytesIO() + dill.dump_module(session_buffer) + + global empty, names, x, y + x = y = 0 # change x and create y + del empty + globals_state = globals().copy() + + session_buffer.seek(0) + main_vars = dill.load_module_asdict(session_buffer) + + assert main_vars is not globals() + assert globals() == globals_state + + assert main_vars['__name__'] == '__main__' + assert main_vars['names'] == names + assert main_vars['names'] is not names + assert main_vars['x'] != x + assert 'y' not in main_vars + assert 'empty' in main_vars + +if __name__ == '__main__': + test_session_main(refimported=False) + test_session_main(refimported=True) + test_session_other() + test_runtime_module() + test_refimported_imported_as() + test_load_module_asdict() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_source.py b/myenv/lib/python3.12/site-packages/dill/tests/test_source.py new file mode 100644 index 0000000..51dc852 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_source.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +from dill.source import getsource, getname, _wrap, getimport +from dill.source import importable +from dill._dill import IS_PYPY + +import sys +PY310b = 0x30a00b1 + +f = lambda x: x**2 +def g(x): return f(x) - x + +def h(x): + def g(x): return x + return g(x) - x + +class Foo(object): + def bar(self, x): + return x*x+x +_foo = Foo() + +def add(x,y): + return x+y + +# yes, same as 'f', but things are tricky when it comes to pointers +squared = lambda x:x**2 + +class Bar: + pass +_bar = Bar() + + # inspect.getsourcelines # dill.source.getblocks +def test_getsource(): + assert getsource(f) == 'f = lambda x: x**2\n' + assert getsource(g) == 'def g(x): return f(x) - x\n' + assert getsource(h) == 'def h(x):\n def g(x): return x\n return g(x) - x\n' + assert getname(f) == 'f' + assert getname(g) == 'g' + assert getname(h) == 'h' + assert _wrap(f)(4) == 16 + assert _wrap(g)(4) == 12 + assert _wrap(h)(4) == 0 + + assert getname(Foo) == 'Foo' + assert getname(Bar) == 'Bar' + assert getsource(Bar) == 'class Bar:\n pass\n' + assert getsource(Foo) == 'class Foo(object):\n def bar(self, x):\n return x*x+x\n' + #XXX: add getsource for _foo, _bar + +# test itself +def test_itself(): + assert getimport(getimport)=='from dill.source import getimport\n' + +# builtin functions and objects +def test_builtin(): + assert getimport(pow) == 'pow\n' + assert getimport(100) == '100\n' + assert getimport(True) == 'True\n' + assert getimport(pow, builtin=True) == 'from builtins import pow\n' + assert getimport(100, builtin=True) == '100\n' + assert getimport(True, builtin=True) == 'True\n' + # this is kinda BS... you can't import a None + assert getimport(None) == 'None\n' + assert getimport(None, builtin=True) == 'None\n' + + +# other imported functions +def test_imported(): + from math import sin + assert getimport(sin) == 'from math import sin\n' + +# interactively defined functions +def test_dynamic(): + assert getimport(add) == 'from %s import add\n' % __name__ + # interactive lambdas + assert getimport(squared) == 'from %s import squared\n' % __name__ + +# classes and class instances +def test_classes(): + from io import BytesIO as StringIO + y = "from _io import BytesIO\n" + x = y if (IS_PYPY or sys.hexversion >= PY310b) else "from io import BytesIO\n" + s = StringIO() + + assert getimport(StringIO) == x + assert getimport(s) == y + # interactively defined classes and class instances + assert getimport(Foo) == 'from %s import Foo\n' % __name__ + assert getimport(_foo) == 'from %s import Foo\n' % __name__ + + +# test importable +def test_importable(): + assert importable(add, source=False) == 'from %s import add\n' % __name__ + assert importable(squared, source=False) == 'from %s import squared\n' % __name__ + assert importable(Foo, source=False) == 'from %s import Foo\n' % __name__ + assert importable(Foo.bar, source=False) == 'from %s import bar\n' % __name__ + assert importable(_foo.bar, source=False) == 'from %s import bar\n' % __name__ + assert importable(None, source=False) == 'None\n' + assert importable(100, source=False) == '100\n' + + assert importable(add, source=True) == 'def add(x,y):\n return x+y\n' + assert importable(squared, source=True) == 'squared = lambda x:x**2\n' + assert importable(None, source=True) == 'None\n' + assert importable(Bar, source=True) == 'class Bar:\n pass\n' + assert importable(Foo, source=True) == 'class Foo(object):\n def bar(self, x):\n return x*x+x\n' + assert importable(Foo.bar, source=True) == 'def bar(self, x):\n return x*x+x\n' + assert importable(Foo.bar, source=False) == 'from %s import bar\n' % __name__ + assert importable(Foo.bar, alias='memo', source=False) == 'from %s import bar as memo\n' % __name__ + assert importable(Foo, alias='memo', source=False) == 'from %s import Foo as memo\n' % __name__ + assert importable(squared, alias='memo', source=False) == 'from %s import squared as memo\n' % __name__ + assert importable(squared, alias='memo', source=True) == 'memo = squared = lambda x:x**2\n' + assert importable(add, alias='memo', source=True) == 'def add(x,y):\n return x+y\n\nmemo = add\n' + assert importable(None, alias='memo', source=True) == 'memo = None\n' + assert importable(100, alias='memo', source=True) == 'memo = 100\n' + assert importable(add, builtin=True, source=False) == 'from %s import add\n' % __name__ + assert importable(squared, builtin=True, source=False) == 'from %s import squared\n' % __name__ + assert importable(Foo, builtin=True, source=False) == 'from %s import Foo\n' % __name__ + assert importable(Foo.bar, builtin=True, source=False) == 'from %s import bar\n' % __name__ + assert importable(_foo.bar, builtin=True, source=False) == 'from %s import bar\n' % __name__ + assert importable(None, builtin=True, source=False) == 'None\n' + assert importable(100, builtin=True, source=False) == '100\n' + + +def test_numpy(): + try: + import numpy as np + y = np.array + x = y([1,2,3]) + assert importable(x, source=False) == 'from numpy import array\narray([1, 2, 3])\n' + assert importable(y, source=False) == 'from %s import array\n' % y.__module__ + assert importable(x, source=True) == 'from numpy import array\narray([1, 2, 3])\n' + assert importable(y, source=True) == 'from %s import array\n' % y.__module__ + y = np.int64 + x = y(0) + assert importable(x, source=False) == 'from numpy import int64\nint64(0)\n' + assert importable(y, source=False) == 'from %s import int64\n' % y.__module__ + assert importable(x, source=True) == 'from numpy import int64\nint64(0)\n' + assert importable(y, source=True) == 'from %s import int64\n' % y.__module__ + y = np.bool_ + x = y(0) + import warnings + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=FutureWarning) + warnings.filterwarnings('ignore', category=DeprecationWarning) + if hasattr(np, 'bool'): b = 'bool_' if np.bool is bool else 'bool' + else: b = 'bool_' + assert importable(x, source=False) == 'from numpy import %s\n%s(False)\n' % (b,b) + assert importable(y, source=False) == 'from %s import %s\n' % (y.__module__,b) + assert importable(x, source=True) == 'from numpy import %s\n%s(False)\n' % (b,b) + assert importable(y, source=True) == 'from %s import %s\n' % (y.__module__,b) + except ImportError: pass + +#NOTE: if before getimport(pow), will cause pow to throw AssertionError +def test_foo(): + assert importable(_foo, source=True).startswith("import dill\nclass Foo(object):\n def bar(self, x):\n return x*x+x\ndill.loads(") + +if __name__ == '__main__': + test_getsource() + test_itself() + test_builtin() + test_imported() + test_dynamic() + test_classes() + test_importable() + test_numpy() + test_foo() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_sources.py b/myenv/lib/python3.12/site-packages/dill/tests/test_sources.py new file mode 100644 index 0000000..9deb242 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_sources.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @uqfoundation) +# Copyright (c) 2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE +""" +check that dill.source performs as expected with changes to locals in 3.13.0b1 +see: https://github.com/python/cpython/issues/118888 +""" +# repeat functions from test_source.py +f = lambda x: x**2 +def g(x): return f(x) - x + +def h(x): + def g(x): return x + return g(x) - x + +class Foo(object): + def bar(self, x): + return x*x+x +_foo = Foo() + +def add(x,y): + return x+y + +squared = lambda x:x**2 + +class Bar: + pass +_bar = Bar() + +# repeat, but from test_source.py +import test_source as ts + +# test objects created in other test modules +import test_mixins as tm + +import dill.source as ds + + +def test_isfrommain(): + assert ds.isfrommain(add) == True + assert ds.isfrommain(squared) == True + assert ds.isfrommain(Bar) == True + assert ds.isfrommain(_bar) == True + assert ds.isfrommain(ts.add) == False + assert ds.isfrommain(ts.squared) == False + assert ds.isfrommain(ts.Bar) == False + assert ds.isfrommain(ts._bar) == False + assert ds.isfrommain(tm.quad) == False + assert ds.isfrommain(tm.double_add) == False + assert ds.isfrommain(tm.quadratic) == False + assert ds.isdynamic(add) == False + assert ds.isdynamic(squared) == False + assert ds.isdynamic(ts.add) == False + assert ds.isdynamic(ts.squared) == False + assert ds.isdynamic(tm.double_add) == False + assert ds.isdynamic(tm.quadratic) == False + + +def test_matchlambda(): + assert ds._matchlambda(f, 'f = lambda x: x**2\n') + assert ds._matchlambda(squared, 'squared = lambda x:x**2\n') + assert ds._matchlambda(ts.f, 'f = lambda x: x**2\n') + assert ds._matchlambda(ts.squared, 'squared = lambda x:x**2\n') + + +def test_findsource(): + lines, lineno = ds.findsource(add) + assert lines[lineno] == 'def add(x,y):\n' + lines, lineno = ds.findsource(ts.add) + assert lines[lineno] == 'def add(x,y):\n' + lines, lineno = ds.findsource(squared) + assert lines[lineno] == 'squared = lambda x:x**2\n' + lines, lineno = ds.findsource(ts.squared) + assert lines[lineno] == 'squared = lambda x:x**2\n' + lines, lineno = ds.findsource(Bar) + assert lines[lineno] == 'class Bar:\n' + lines, lineno = ds.findsource(ts.Bar) + assert lines[lineno] == 'class Bar:\n' + lines, lineno = ds.findsource(_bar) + assert lines[lineno] == 'class Bar:\n' + lines, lineno = ds.findsource(ts._bar) + assert lines[lineno] == 'class Bar:\n' + lines, lineno = ds.findsource(tm.quad) + assert lines[lineno] == 'def quad(a=1, b=1, c=0):\n' + lines, lineno = ds.findsource(tm.double_add) + assert lines[lineno] == ' def func(*args, **kwds):\n' + lines, lineno = ds.findsource(tm.quadratic) + assert lines[lineno] == ' def dec(f):\n' + + +def test_getsourcelines(): + assert ''.join(ds.getsourcelines(add)[0]) == 'def add(x,y):\n return x+y\n' + assert ''.join(ds.getsourcelines(ts.add)[0]) == 'def add(x,y):\n return x+y\n' + assert ''.join(ds.getsourcelines(squared)[0]) == 'squared = lambda x:x**2\n' + assert ''.join(ds.getsourcelines(ts.squared)[0]) == 'squared = lambda x:x**2\n' + assert ''.join(ds.getsourcelines(Bar)[0]) == 'class Bar:\n pass\n' + assert ''.join(ds.getsourcelines(ts.Bar)[0]) == 'class Bar:\n pass\n' + assert ''.join(ds.getsourcelines(_bar)[0]) == 'class Bar:\n pass\n' #XXX: ? + assert ''.join(ds.getsourcelines(ts._bar)[0]) == 'class Bar:\n pass\n' #XXX: ? + assert ''.join(ds.getsourcelines(tm.quad)[0]) == 'def quad(a=1, b=1, c=0):\n inverted = [False]\n def invert():\n inverted[0] = not inverted[0]\n def dec(f):\n def func(*args, **kwds):\n x = f(*args, **kwds)\n if inverted[0]: x = -x\n return a*x**2 + b*x + c\n func.__wrapped__ = f\n func.invert = invert\n func.inverted = inverted\n return func\n return dec\n' + assert ''.join(ds.getsourcelines(tm.quadratic)[0]) == ' def dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n' + assert ''.join(ds.getsourcelines(tm.quadratic, lstrip=True)[0]) == 'def dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n' + assert ''.join(ds.getsourcelines(tm.quadratic, enclosing=True)[0]) == 'def quad_factory(a=1,b=1,c=0):\n def dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n return dec\n' + assert ''.join(ds.getsourcelines(tm.double_add)[0]) == ' def func(*args, **kwds):\n x = f(*args, **kwds)\n if inverted[0]: x = -x\n return a*x**2 + b*x + c\n' + assert ''.join(ds.getsourcelines(tm.double_add, enclosing=True)[0]) == 'def quad(a=1, b=1, c=0):\n inverted = [False]\n def invert():\n inverted[0] = not inverted[0]\n def dec(f):\n def func(*args, **kwds):\n x = f(*args, **kwds)\n if inverted[0]: x = -x\n return a*x**2 + b*x + c\n func.__wrapped__ = f\n func.invert = invert\n func.inverted = inverted\n return func\n return dec\n' + + +def test_indent(): + assert ds.outdent(''.join(ds.getsourcelines(tm.quadratic)[0])) == ''.join(ds.getsourcelines(tm.quadratic, lstrip=True)[0]) + assert ds.indent(''.join(ds.getsourcelines(tm.quadratic, lstrip=True)[0]), 2) == ''.join(ds.getsourcelines(tm.quadratic)[0]) + + +def test_dumpsource(): + local = {} + exec(ds.dumpsource(add, alias='raw'), {}, local) + exec(ds.dumpsource(ts.add, alias='mod'), {}, local) + assert local['raw'](1,2) == local['mod'](1,2) + exec(ds.dumpsource(squared, alias='raw'), {}, local) + exec(ds.dumpsource(ts.squared, alias='mod'), {}, local) + assert local['raw'](3) == local['mod'](3) + assert ds._wrap(add)(1,2) == ds._wrap(ts.add)(1,2) + assert ds._wrap(squared)(3) == ds._wrap(ts.squared)(3) + + +def test_name(): + assert ds._namespace(add) == ds.getname(add, fqn=True).split('.') + assert ds._namespace(ts.add) == ds.getname(ts.add, fqn=True).split('.') + assert ds._namespace(squared) == ds.getname(squared, fqn=True).split('.') + assert ds._namespace(ts.squared) == ds.getname(ts.squared, fqn=True).split('.') + assert ds._namespace(Bar) == ds.getname(Bar, fqn=True).split('.') + assert ds._namespace(ts.Bar) == ds.getname(ts.Bar, fqn=True).split('.') + assert ds._namespace(tm.quad) == ds.getname(tm.quad, fqn=True).split('.') + #XXX: the following also works, however behavior may be wrong for nested functions + #assert ds._namespace(tm.double_add) == ds.getname(tm.double_add, fqn=True).split('.') + #assert ds._namespace(tm.quadratic) == ds.getname(tm.quadratic, fqn=True).split('.') + assert ds.getname(add) == 'add' + assert ds.getname(ts.add) == 'add' + assert ds.getname(squared) == 'squared' + assert ds.getname(ts.squared) == 'squared' + assert ds.getname(Bar) == 'Bar' + assert ds.getname(ts.Bar) == 'Bar' + assert ds.getname(tm.quad) == 'quad' + assert ds.getname(tm.double_add) == 'func' #XXX: ? + assert ds.getname(tm.quadratic) == 'dec' #XXX: ? + + +def test_getimport(): + local = {} + exec(ds.getimport(add, alias='raw'), {}, local) + exec(ds.getimport(ts.add, alias='mod'), {}, local) + assert local['raw'](1,2) == local['mod'](1,2) + exec(ds.getimport(squared, alias='raw'), {}, local) + exec(ds.getimport(ts.squared, alias='mod'), {}, local) + assert local['raw'](3) == local['mod'](3) + exec(ds.getimport(Bar, alias='raw'), {}, local) + exec(ds.getimport(ts.Bar, alias='mod'), {}, local) + assert ds.getname(local['raw']) == ds.getname(local['mod']) + exec(ds.getimport(tm.quad, alias='mod'), {}, local) + assert local['mod']()(sum)([1,2,3]) == tm.quad()(sum)([1,2,3]) + #FIXME: wrong results for nested functions (e.g. tm.double_add, tm.quadratic) + + +def test_importable(): + assert ds.importable(add, source=False) == ds.getimport(add) + assert ds.importable(add) == ds.getsource(add) + assert ds.importable(squared, source=False) == ds.getimport(squared) + assert ds.importable(squared) == ds.getsource(squared) + assert ds.importable(Bar, source=False) == ds.getimport(Bar) + assert ds.importable(Bar) == ds.getsource(Bar) + assert ds.importable(ts.add) == ds.getimport(ts.add) + assert ds.importable(ts.add, source=True) == ds.getsource(ts.add) + assert ds.importable(ts.squared) == ds.getimport(ts.squared) + assert ds.importable(ts.squared, source=True) == ds.getsource(ts.squared) + assert ds.importable(ts.Bar) == ds.getimport(ts.Bar) + assert ds.importable(ts.Bar, source=True) == ds.getsource(ts.Bar) + + +if __name__ == '__main__': + test_isfrommain() + test_matchlambda() + test_findsource() + test_getsourcelines() + test_indent() + test_dumpsource() + test_name() + test_getimport() + test_importable() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_temp.py b/myenv/lib/python3.12/site-packages/dill/tests/test_temp.py new file mode 100644 index 0000000..30ae35a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_temp.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import sys +from dill.temp import dump, dump_source, dumpIO, dumpIO_source +from dill.temp import load, load_source, loadIO, loadIO_source +WINDOWS = sys.platform[:3] == 'win' + + +f = lambda x: x**2 +x = [1,2,3,4,5] + +# source code to tempfile +def test_code_to_tempfile(): + if not WINDOWS: #see: https://bugs.python.org/issue14243 + pyfile = dump_source(f, alias='_f') + _f = load_source(pyfile) + assert _f(4) == f(4) + +# source code to stream +def test_code_to_stream(): + pyfile = dumpIO_source(f, alias='_f') + _f = loadIO_source(pyfile) + assert _f(4) == f(4) + +# pickle to tempfile +def test_pickle_to_tempfile(): + if not WINDOWS: #see: https://bugs.python.org/issue14243 + dumpfile = dump(x) + _x = load(dumpfile) + assert _x == x + +# pickle to stream +def test_pickle_to_stream(): + dumpfile = dumpIO(x) + _x = loadIO(dumpfile) + assert _x == x + +### now testing the objects ### +f = lambda x: x**2 +def g(x): return f(x) - x + +def h(x): + def g(x): return x + return g(x) - x + +class Foo(object): + def bar(self, x): + return x*x+x +_foo = Foo() + +def add(x,y): + return x+y + +# yes, same as 'f', but things are tricky when it comes to pointers +squared = lambda x:x**2 + +class Bar: + pass +_bar = Bar() + + +# test function-type objects that take 2 args +def test_two_arg_functions(): + for obj in [add]: + pyfile = dumpIO_source(obj, alias='_obj') + _obj = loadIO_source(pyfile) + assert _obj(4,2) == obj(4,2) + +# test function-type objects that take 1 arg +def test_one_arg_functions(): + for obj in [g, h, squared]: + pyfile = dumpIO_source(obj, alias='_obj') + _obj = loadIO_source(pyfile) + assert _obj(4) == obj(4) + +# test instance-type objects +#for obj in [_bar, _foo]: +# pyfile = dumpIO_source(obj, alias='_obj') +# _obj = loadIO_source(pyfile) +# assert type(_obj) == type(obj) + +# test the rest of the objects +def test_the_rest(): + for obj in [Bar, Foo, Foo.bar, _foo.bar]: + pyfile = dumpIO_source(obj, alias='_obj') + _obj = loadIO_source(pyfile) + assert _obj.__name__ == obj.__name__ + + +if __name__ == '__main__': + test_code_to_tempfile() + test_code_to_stream() + test_pickle_to_tempfile() + test_pickle_to_stream() + test_two_arg_functions() + test_one_arg_functions() + test_the_rest() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_threads.py b/myenv/lib/python3.12/site-packages/dill/tests/test_threads.py new file mode 100644 index 0000000..45f1f58 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_threads.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill +dill.settings['recurse'] = True + + +def test_new_thread(): + import threading + t = threading.Thread() + t_ = dill.copy(t) + assert t.is_alive() == t_.is_alive() + for i in ['daemon','name','ident','native_id']: + if hasattr(t, i): + assert getattr(t, i) == getattr(t_, i) + +def test_run_thread(): + import threading + t = threading.Thread() + t.start() + t_ = dill.copy(t) + assert t.is_alive() == t_.is_alive() + for i in ['daemon','name','ident','native_id']: + if hasattr(t, i): + assert getattr(t, i) == getattr(t_, i) + +def test_join_thread(): + import threading + t = threading.Thread() + t.start() + t.join() + t_ = dill.copy(t) + assert t.is_alive() == t_.is_alive() + for i in ['daemon','name','ident','native_id']: + if hasattr(t, i): + assert getattr(t, i) == getattr(t_, i) + + +if __name__ == '__main__': + test_new_thread() + test_run_thread() + test_join_thread() diff --git a/myenv/lib/python3.12/site-packages/dill/tests/test_weakref.py b/myenv/lib/python3.12/site-packages/dill/tests/test_weakref.py new file mode 100644 index 0000000..df5cbce --- /dev/null +++ b/myenv/lib/python3.12/site-packages/dill/tests/test_weakref.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# +# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) +# Copyright (c) 2008-2016 California Institute of Technology. +# Copyright (c) 2016-2024 The Uncertainty Quantification Foundation. +# License: 3-clause BSD. The full license text is available at: +# - https://github.com/uqfoundation/dill/blob/master/LICENSE + +import dill +dill.settings['recurse'] = True +import weakref + +class _class: + def _method(self): + pass + +class _callable_class: + def __call__(self): + pass + +def _function(): + pass + + +def test_weakref(): + o = _class() + oc = _callable_class() + f = _function + x = _class + + # ReferenceType + r = weakref.ref(o) + d_r = weakref.ref(_class()) + fr = weakref.ref(f) + xr = weakref.ref(x) + + # ProxyType + p = weakref.proxy(o) + d_p = weakref.proxy(_class()) + + # CallableProxyType + cp = weakref.proxy(oc) + d_cp = weakref.proxy(_callable_class()) + fp = weakref.proxy(f) + xp = weakref.proxy(x) + + objlist = [r,d_r,fr,xr, p,d_p, cp,d_cp,fp,xp] + #dill.detect.trace(True) + + for obj in objlist: + res = dill.detect.errors(obj) + if res: + print ("%r:\n %s" % (obj, res)) + # else: + # print ("PASS: %s" % obj) + assert not res + +def test_dictproxy(): + from dill._dill import DictProxyType + try: + m = DictProxyType({"foo": "bar"}) + except Exception: + m = type.__dict__ + mp = dill.copy(m) + assert mp.items() == m.items() + + +if __name__ == '__main__': + test_weakref() + from dill._dill import IS_PYPY + if not IS_PYPY: + test_dictproxy() diff --git a/myenv/lib/python3.12/site-packages/google/_upb/_message.abi3.so b/myenv/lib/python3.12/site-packages/google/_upb/_message.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..1489caee48066c86f1354a7eabe3954ed2dc743a GIT binary patch literal 371296 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

    )aM`#bNJ?9W!z+$*WMHguyV)3hz!wC!%m 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_database.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40bbbffabfbd72157b231b881ab084cbecb34565 GIT binary patch literal 6796 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 KI+!7<#{UC!)sf=> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_pb2.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_pb2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a32348504ac7001bdea213b775b85ee06a0dcd4 GIT binary patch literal 123213 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 XUX;5p8jW|JFD#g_uJ6MI1qJ^PacEn2 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_pool.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/descriptor_pool.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adf292e5bd4dd4ddfb920aa1bdcdfeca6ad330e0 GIT binary patch literal 53283 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 z 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 MB$&JAUgop>4Pz1F^8f$< literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/empty_pb2.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/empty_pb2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3083aad27fc7a63f66ba58ae2c3d1c122b32080f GIT binary patch literal 1579 zcmc&!&u<$=6rSC+z4oMQr)hzdiZ%&Jobbb2S`dvWprmmELZzloK;6q~*E2Ee?Cz{) z)*uH}@)4>S6mn3tRc z;(CVI3nN}D*UGIIj;`)vA5$yDXd$2^BsJnL*v*3jOc!bd;nJDluS*d`nANBggoJXh zF!s!V5LZB~<=MnFkri6D#W06dyXm+HQ}&40fS2op)LpE{ZFmbEdqLPL#qL~T5FB_s zxTL~#S;V&?7ANb@}9`EGqJuKN0+7qlw$Q}U|-+)ID*^d>g{_UR`%}R zV-Lh$|4+$h*SLZxW0vn!_U@m(Ev|1qQcV+)nrTMU2TjHJMKk93LTO4MvlB>s#Z&liGr8}50tByB)RQ8+Rb~2GH8pQWVFadJfFo8vL=6!an)|Jmq@9Ghg@oP_OCxybRNKaESedZR#LL=W-51 z5{PMR;BeDtj?G^IuZ8_Dbl0)* z-tq`)y7)c1$lHsL6Z@Gz`idk;e?lOwJ^^n%0q@7ZoBa%!dHDps*o8|SxbzqpX|FvFmojW%> Z^2JkmwYO3nI={)w{TxWWO0V+0{0;wX%j*CD literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/field_mask_pb2.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/field_mask_pb2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9b9f4a0c56b31e0ed1e27503b0db8a70f0d4284 GIT binary patch literal 1641 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/message.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/message.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d180fe7aff64345ba05fc2bfaa575570fb68e8da GIT binary patch literal 14167 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 F{4X+y_%r|j literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/proto_builder.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/proto_builder.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2a00808a704d66a1deaf39facff2c9227e29117 GIT binary patch literal 4494 zcmb7HO>Eo96&{Kd^=DhQEX!UyKU~MLBPW)Sp9Wc{-K-PYsW*;e#Mv#@-GZP+%A!n> zDoMqWmqryJhdtzwU>9%>Ii#n$2vFphQ!mY}7i*P;1g;lo(e7b;a^f6{w1>VKic;*l z+3i5$ym_4WGc#|#_xR`b_8@}x$Na}j%bf`Q4G-MrX%IVEAl8wH7LZ7Z9)-$#7CaQD zX@y>(NzW`W&@+lR&n~d!ofl}|f{)NF(EbHKp?yFH76L%~@1TXC7!m__sD+Rigi%|G zj<>BIPL)(4FQ>UVT{E@CVunjAf?;rJT@p-9PkfL4ic@yznl4JZB&OuFISbdRa0#fh*vpHrAQZwLE8LCGM)@+?3-Rw^-s} zU!+7Z$Z-?;k}(cF$KjQXgND}P2rEHeW{Qf!W1(@*F!d8eE9RBBUl#>M&d8ETbaGmT zymQQi;`+OdceJ=IU+5{hSU(gB9$g}T>}r~ zHx0=Kr)nl>EUF?WtB!llYDbLyRurf0o+()s8#{9YT)0@8h4tw^*l0Tpo7s4E35QIa zu^GHScA)8*-AUHSx3q?@4$SNZU!X`@Gjx;jt+qiA?>+E8Bq$E&A`sRc>!P|ZjYS~ ztvic?FE%f-YnMX%%bV}GQkLJH z`(riUonx@p0art-cUK{LR)M(|u&DB&NWXn9nMwV?iO{)&Eh{c%9(E}UEWutkqQqSf z#KgX*JdchblXYc>kWN$R6Lk0AE9e&e30k4{eS6V;8)t-nz@c8kKrR7h&Fu#Gm8@n+ z9DtG{8l0d@+@fGW8o)qf5Y(I1Oh7U-3%DU_lA(^6+)aQn5o;r21k8+gcO#^uaGVn% zPhgk1f}ZUQPd!5&*{qSrX56--%E1!WJO zkNp@tcaud^2VhwvVa@?c0sdG377I9XY*td!nkd;cq)0oE zm2QbL;I(Pf6QXGM@mGaqY4^&AQ}Lk9I!C8t9Mdtd+3h&n@J;I-m=|&a&GF3{7(Dg_ z2CmKU`8!R=*l0(wKl5_Fph(0IlIZjicr^rnV-oHcUYfP-d z#O~c(U%S8d=oi)AvFA*p$^O!KaQ2JOYQ6DFZ+v5<+I#A2=Jd7~#J5@0!_}hkN;F=L z9^c4TqG!uVV6x#&Z>-)mUGF+j>l&_f4OhF4y`ZT`yga?l?C*XXqC0Dz?uw^-i#_z< zH%|gj&sW*YuV{*%rv4r{{HT4SR1Lhh>3Q#;uP#xjEeh^?Lw{w1;D75BHGP( zBva9A%-c&xH#e+#TiBcPgPlDshl6lWv*=v=9u^F7(eCfdTBX!)&R%a-Lc`(4T0 z0hem^xkD}5rItU1OMLzZB{_F~tN;IPt-{52^86~C&6>~hf%nZC$86SMIeew}wA}C> z1`I(O7l@=mJ`eKEs^{(#s5iXuvB9iP%xQ(9f>Y%_Xhss>?(Yq#z<0xK;x(1{9@k{A zsboB6v$|1GWK(B=V|VYP)Ancv)Zc=cwV9kItF}*<3W|`HYzAjw+t(+?7G>yz`7*FT<2@l(^2Gbw)dqpKGu zuiO1I6aVua3;Gu&-Hz_jNHEpzn3=dZIm2I@yD@!jc4Ef%D#D_q*bH_s9@6mW`@6%x zJ^ZBmNxJ&(_|t3E=uCO^PO{#6s66`I6Rn5esfC9t;o(|%v=SbzhEJ47>(M?uWou|` zWBKXH>d?<#q7Z$k!gA$orIWiCdl0Kf4md8mI9gkJY-TE8Wvy`KIe^$5t>}3l3F+L$%UAdKgJ~Y||7)z34>L@OS9QH>l$q6!;E}ev5{`MaSXyl5MBD Qcepdu_>M|NsVGtSAC81iy#N3J literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/reflection.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/reflection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d0585c17486f98a3672e73328c343d0a1be9ff8 GIT binary patch literal 2153 zcmbtV-EJF26rNq1#9qZsO8_OMqN7%#c1gT~79jG-wz5_47O`;;Dtb~Nb6?cKqn_h8dcGq!Q?pVp=@$8(R?>pZ){<%^y z5IjExUyXt?LVw5~`J-o>^G(=1LN4kfSL&f_)M8#ePvkq_C%a<>u*k zf5t=oS@*T?P`~8Pz*-*9)=G8-oHuDGY%k>4#sLwwVp~Q_K09*N;n=e8sIg;9p*)XGE4`1#1Y_BU>1kM3rO8CI>fPk zAB$Z$osR5rI3xI$7)Rt5rbBqC{MLoyY1YcYF!m?(*uE#ma0f2R{4*{L z8jC0vcraF{6UrPKM4k`q0{U#fk`dDb>p0@OR4DX{BS>8F0=K1e;NQny5cwn^P&`>3 z!-d*;K9CQDH#RqM6f?5Y9*bQX;z`&+JRA}Rm0$$l-6gPkp`mygLN<5n#)I384uC}( zem0_Xdgr?LeK!@`#Uv0rf4{7WM$Bc5?MflS1~% zlq@uPD4#?0B-=mKb#$mdNsrOP!eL=gTD|lfYWaN)9TvKfi|v7fyp$k~kR0HwkQbs* zx>RVV#3_|-Lwy9nTre*jfi^K-YqdMAW~0|yTg7dgaWZknu}dNb;swdz0enj#c|z7F z=3tJu?0wRdO;oMb!Bg8Oz=M)o=3_l&tG+>m(wtO!wWiV}wyVN7*od!!F@|7y8$lvc zp-{qCdrMuF7%afBio1k)pvMQ0;Y+2T1}brOh=^I3#o8tZ{y6LI%u+_np{H#uG1c^> zJb{_aD}vUc>AQ-+S}_4N=4mITJg;Pq5gz-(QoWJPLXE6|k9ZNPE1|xiW)KR~F~8)X zQFEOL65=)Hxt-w~y{T z)61v&(uuzGxcZBJ`&s$wQT-h5B4?sx_%TuWGW>XiE>ylZ-3!tTo(ttG6)%7zn8#4W zSWcR3-lfE=&bHHn%Ce*s52OmmQ!;r)zEYq6S9y);08os}lRZyGs$Y($oNXzUO9GRl zEmxBgLH5^>J4mre7Z>_T^~NNt$vm`7X0JM|rm+&7b4fpDbFi|ReEC?ucoP;?Nn`1> zTs3*w?KU=AR_~j3E4h)6q5t|vNfz?E&CN!)Yc(6q&s$1)D)S$aN=!j{ zQTimHZtRm!*&;-i82LxAoE0=p`|FL0Ry=zLUAcE;JfA_@@^9$9vl7DQ>CK&!n>)wo X#_w+}9;1c7OINjP=hce#p>q5$3OS5z literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/service.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b08e0ca33ab862694adfc571f450ae29f53d514c GIT binary patch literal 9088 zcmbVS%WoUU8K)kWWcpF(;%XTJI7 zd;Gq~>hGscH5>T+W$^Ru`^$~SzxhY_9P?ieVto0y5jXBN;+cChvyHbK@$83FE}2rMCK}Fbb#2F077KnX4}UjLpzs$V!#>l+MO#sBM`eHmi*WHqbf$iO- z?5iDP3!I@YwqI-ia7|=$Xp1WP`6!K>SzfBrj^z@gBy}h9j%%trD*Y;4t|*O;$?8rL z8x`dkwoPWNE_17f>1Z2En!EiZ>W6v1su-Fm=_L_Qpq{3Ma_A-^V5nJqcmqzu#1D8+V5nNM z71M6+eP?JO&NsL7d^4E8V z_M4rKGiQ81+3CDL(y4#4*y+T1)aiWEI3QDBrR#&NT#wd&2HPsuZY7dBWc`{c z?!&OwA;b4fc{MANZfe#CW0UQyr%88xIL7JOYwcGrt`|vZE(~>aUvHaY-N}Ue%Dg-3 zt$V9&5671NF2nQqQY>Nku<_aK>;Ifxu*burqb0YB$J3G{h}@fx=P(|N0Uh@i;$s*W z#|y2+{l&Y^&-Htd{ng;bT@A;qJYQ@=xQz1j0yym%dx1-0k#2A{-~)WekrNyl6eisP zq|n1FfB?)C1twQ30|OZYM>AG+#{xTIM^@g?a+9srU zZHp;#4Twx`QpW>05iLTj-C2m=V=C|?0OWAp`&qsVVtrFfe7{cUK znGB3t)tOH7?R*3QI3K-5|Jbfcv(*NfM|4MpADkB5l^EUUH#4o7z3<(Dqa=oclq-92 zzfu5!i^wKJpho+Xnf+%r^YUhZMH64QHn*0R<1B{pXaCgOri8irU3<@YZMCPSe}I(- z-1tG`Kh2l_G5@j;(1pd$mpkIzob*U4Gl@D zn?1D>=b2eiQ1m9gkOVLsbVP4dfADhR5+5Lf4f6~@MFIma`rQOtMij879N7$qI($mU zfXH{S%kBa^rs(QooJD<`XHcY&B7M({P)h-ouvfyg~n6b^aoztkijRwMTJOn(2c^!60hlHLn(T@L+_~873h) z;4WgBiRlicv0{f&2e(92NK<1)>)vc4STX{NbGZt&{AHMN2sZ8H#Lh1 zw(NrwXc0+L1eOrF2YQSvc`mvJ7dMK2bxXq8YRl^h>{{TGa?1%xMGk!qbHEWCn-S}E`yew^Elf@b^)N4l)8H0Vn}cQDJP^FM(m%SHkbWHZ`}Ly#EgPy z#mg!yz}K9}ZSUz|4U@U^SY2@82aSh6YMfZEKo4nh^!GvOecF#Wa0~e$LK(@$ zrl&_KO$9!iMTR+?cn#0N$+1vkxby5?f1qiom%aA90bdE|J{?U~TkRXj2%XKoHQof& ztghV1^Oct09&UsE@F{M-a|F_?9$MbMt!-g$*nDso(J|XzO|s#r42wJtwrhfPT&@M- ztw{{&A{BFc#NIxcwa-Aw_E`)CRUgdfTZg#Xdp_9Ep$9+VPH#vreltT_{{M#LUGxbp zX-f(=m;NS2_DYHS13|_rGY0k68j>urfeFSTub4;;kOZT!qo{OY&{>~nA!LLh&bHOf z61y?Yx+Z4XhT4M&#CS)961+6MQ7WnrP7r}1Mvq+5EN|id3`w#;LB~5Z%^Eh?7Y{4x zjOfB`lqj`#Zc0nFC+}kKfmhS%nwmCSOBTsX!xBF10*6HoEJy4)4&UbRGKcBZ%AVvL zhnMhEaM_2AFXk8K7QQ?)JGcDh(n}a#KQ*^}u)H|8>{2qWj_^}`h%o#dT*mNZNqmf| z|K3u(i1B!gTK`^ie7x1%KShOBkg7ie<*OMpj>#m{7PI1Gmc}546xMq(6(X*_1$01J zIADD@9NA$GHC7=x1Zrv(y7OuWF)AGs1Dz#96znBYzAz;#YNQ2+O4uW!xa4xV>H#$r zgNX|%Sa=~t7EIfb)CiS2`Exwi%uZrHg4@(xClx@w-2hTx6v0WWmDFhDCJ4a;1b=iM z@)B(5*_)E#tbSfeuDMrI#ZcBC)!mSUlV$2SbV<`?o z-qhpCfvcvy-3CuOP7`FoSU=R;lJU4&BA5+Lhu`P$b9627=^b<dYO zQxH=i3%ubrh@#`f{SKOE1ey!p&&Tv*a+$qnrnqX$WR6t470rE2L-OZVNjE=t|Aaf{s(Juw4V*bQlWAYBM4wh)`7n?8L!f=g^hK3MIqvn*+$5JDV4!vh9VB{UwOLmZ-8 zvEhfihm>CQW>=_+n${NFNqf&utIf^s*7SDf8|iKDdUY8ACJ26_2Ce!dz|sZ8z*wV6 z1HrmlnEgF}Ggo#U&HHgFs<+I8a_{+R_NxcK#trOK9N4G%8us=p$mphcADVDzQ$!{O zc1jOTG;lTEL6z#GHT$z;v=Il0mOd%;Q4}|tP8R7^Vza)IaHOFlXM23?NfC?OQ;F3B zA0N{3nv@p18WCIvZ}mwbio@rMJwv~ zgnjb@IT!@J;wY?y27^c^$x!wpG(k2o@D_BajNrbs{agoV~MGP2s~2y_SJr3>S!}-hAov!O81eCp-Q757%FVSm1*qSHz-Sz=+yT zc7V=!^}$#@bgyI}+k~mf77k~*gl%38&dbDK!I=;Osv{{lsrcwCu8$lcJ8@p(wV zBPSyfL$yobMW@JgnF0wlXhWK5sI78VDiy{F0Q=4k^x-k$2~r4v8x9s)p&RKIAh)ezftTqc z)Fkbgu$v+OXS)hwM`UGFVF&~BrGCwDf=e!icV2QVc67Spss=G5w7@n14?>N4_ z$l)xCy@RJugo=-wBm7h!7_xj0&f?cm72kLc@2i@;w`)P_OK_9wJ)p81yq#tCf{U1$?t2h z8k+FUF*5;dwRlU2(vNPbvmA(GLCA-RHv0Mq4roY7FbD{QWjs+XRNcJl+PjxQ{xvFS zRXqwa&$jF@-o$P0hgVU*RJ#^0ILU$lUe&$A*6KT>$3)1=i%?xrb{O%cO52Nn74dYC zm!^+aZyWy3G@LIrFTZ;6wM)LGHD#pa&Uduy)T&9}*SaE{A$hLe zQgDwvaTx12Ruu!~7OodeCD}%i%|u65`AiT|J~A<9(>xdK#y-BH0K$1O)jNBWw}S#O zNPqc{0sg%WiJ+2%Vc10eJpp!zT5iC?Tq8{agyX*-c%9IP%)9Tgs*iIc{j$DB>@0H_ zi=s7yPyRbX)y8mbUNDyCFfjaP6+Mv*QP#!?|**bP40!l;c5XN2NP7a^qr(lPQ72>!C{te5v z7frKx8^h;wGcz+^oN3O?e}1lUdi{gu!-d(I#gBgcuz_C>n{Um`EdQ?eu)*ICe>!^` YzdpM0u)*ICd$TX#ue1Mc;FqxcKe~^iZvX%Q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/service_reflection.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/service_reflection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2b1033655dba8afb07e5d04f0b59cfc3f08e568 GIT binary patch literal 12479 zcmeHNTWlLwdY&PN7mJcF@+FET*C&Z@Ol;A)+ExN z4DE=JyV^o&>|TH@(5>^(2k%3%Hu6vx=tG{0-RA`gv2s8yk%s^+`dY`*w&?;b`u*oJ zGo&cTF;bupJ&?`}XU^q6|M@T9|DX9)S67FD@()wrA3w9#F#ef-=n_*m%LUxrGz!Lu zQ7}i$h;hm&MCOe`)Q)@_m2F0%;;DtFF+1u%wZzjno+j*=|1>V1Ch>G#=xJi6Bb~}U zYZ}H-x#Z=XlFO!SFPAUoT-SD4#kC8}E3-VebDqtndD$!H%SGne{ECyeS*}#@?_IAl z+Mzp+@$wYABwL-Z-8^@uy)tLz(Mdb+xh&@~UMYFbl-=Laae2aKr|go=F-1Z3xjZv1 zM{j*`3A2coVKQ^v)}(egC7OceibZ-fRw=TvN-6I-hUZBDeR`va2T>dtAfh#wm-m&c2CKVGtZ7w8E?&C6HPdA*l(1#3lF z-j2&n!!|}t>}dph8ZAUdtU`3&7>UhT=~!b+>so1@xxbDW#yPzuYz$1)%-0K$n^Ooe zm9=NT3uZHRdTP38PubXQVu~wSHA9NZ{u~*4U5dQ%{>Rg1ioXQ@>Mo&d!ADo&$#j`_G-+riv<_MsY&%dfGpR| zjgy=(Mv~&c@HZ%5;T+2;&d`Qqnh6l&OUFZ`7XxY*hUAeA6&;L*_2f!&B~!Ul1%%IN zEr9Si5ap|-PKU7wk<1mk@cL@~*w;@bE!qmw*twYt zq;qNu_NlG!SHIH(qA6q9tiRxFmc8CqomA5kCoc_MJbmHv`HN^5CP-1JrpUq+c)1dE z{Pk8MBz?~?kcvKyj$p*RrG%X>WTfbS`L9sjG(6O@OhTet%WU+D$;}yaHu~^(Pom>B z%hN{En6*At3U)0v8=FkDj%ygRhHhb^^{kQgX`C_Bk=%!5`h<0ZRno%NtYSj+7#rl{ zuI6_sH)Rj7VbrWV7FZLu&lxY3xn0=LMqyI8{eH#4FKt`=Jrb-YfzZO7CQecr%|V0* z*l}EZ>1vu`)Q0B3AYpfSB@ctCdlnpNr0orsTxYasXQpQC(v?in8O==3z1XmUw+B-udOG-g|uq>wU*+_}er%cjk+2yKhY{ZhL<2{F1e~ zZn2uhZf(A2?Oxitb8hIv;bjbD41;@^o>-U7HacKS%7sdi?mM&D_hI_fn?yESDCe_T zPW<8XlVHsi*nYTo$D+8B-B-(_rlYA&;EZH_Y8o|@+I?-y+mmiOS% zM{V5Xbz{tgt4xl>t{WeiBk@Z{+G_N)a!P}P>Mzf=^_T=vVAzGaKeE5PO#Vb_(*#Vr z>r6RC_95xk$Iy=y5U+v|_huAQ>I>vZ=P z+lzTyOW5`bYy0j)t!==A$1=HuNB-ZCGE(Q5TLJ3gJ=hSTs6u5Mo3$Y&J<-N=W7wF| zi*$n17IO+wIBhELq^b*5V~aLkv{hMUKO5_^S)m`6#9uVL4=7_p9f9Z%mHs#(w9-St`Qv+6zT%u3uyvU(y@OJwd=Yl%T^?Ov+) zov7h&(@9vn-u~Ow#omDht7pmTsaxrqmA?JV=T^TkJ6KpZX5eI+_!g?RQsrB-MwePg z-Yyoi*|f=j2k%|N7supc1V5>IgIQBv7v_AbuO^m|2(Z;Kb?N35*xAPd+RlEVIhj zN*h*j$s6Z(I5D{y)3UhkJKT#nK-lYB(>4OVd)hLP|yY?!cb({|ngxDVpQ z(1h%KDX@S_nt+`Z@C@d_SU}Qwg81c74>4~)&<-Y^vU7-KD2~znU5R)oe4}WVxf2w+ zfF_LQ5^_@$lC{nIh7Vk&`zZdGNm_1_F*UNdlZDJ!^>0qYRXd0$t7P{}{*)SHX`?PD z_UFMw%`j4HQ^1meHkb-=69OA{bpjjX^F%@_T8k`AQz}Gt#}rz7C(^K7yExY9UOk^n zi-orl9$e^Zk2Vs=B|7p|bOJ4x$sWuZ_tzUwq~}h2cwR_(6Z4X2AegrYqDh`ycy4n( zc`YLDBDjlcZ+^|1HE)EN3$JBnwTc)4$`|de`Q)eS9a_;Gq7-7YW;<^c;QZMr+J_9x1p^5+_>93FDo8h&^H+nGaDQ7_mvRBP|7EKGE_BKWAf_dYzInjX!_Z zGG^lGMD>S58qibx8t82n;9RGC#60zO{#zGU1nhtp;wl^ueX0be0mkdE_R=+M}N$Ob>NfgCs1^XYsR zq#z+uL>8rypkT;$y@pkQ3O5o;DFW;*{RP1O+dMZNOi_KgRUU<0UXmcX|FvQ{k95P) z{+4dnK$iP7D)^J7t}XR0R_kK7wk+&D{8|6fQ~Pf3T8^6Q58gM-#KF}vOtK|-L}*m- zDAJZkrryy@1}9t&?rhASvb~FPsY7IT?nDKP_;YyAGpJk|oiVlCErRZrKGlJ5vF4V( zKc*?jujz&Fu66BR*mG#H>+nMS@OQe_O>(UQ2HRq>{KZuZ+!`z})Uf*Mw_RbV^L*

    $Y^O2lzYK2FCUTM*_r`{LebbL9)x%(;aozF;WiRT#pOJY3((itfsK{v*x_=? zPZ!z+U+IZA5+oj^yO*dsgsKr&1Co7xS2!l=S;#9?`yR%(_tC=r6I9^RN>3zqa3yKR zj;zGZ*ued`v3c9vsrj=@TX)S3%@2Rkvuknp8;d>1=7#QBTbJ12+)&-xTC=v^vvw?P z@296vEcG6wYtK^mllAUhweDT@?)|my{SOQ?cHX=m|03RXJ^%45H(&k9tG5z$cCyA! z{$gyAo%=jK{8f~iNGbB&1nBa^uRp~Ppn^y{8JacPCAZ!KZ+I$jX9eGI{ITizDJu%v zCW%okJJ83AfxCSMv6lA6=ihP zfPo}_0W4|qAp`80RH)z@e<&Iu0eORvRw zLG@K$1{T-66}d2+19X$y#8C_&URJ%6>e_ixo|&BFybO;z9@1IFHo_BIw0+Xq?1#+o z1E?BFy()ejKSME^!hO%;X|=aiJ41f{W9oJW6`w3QLy&tu$`g_W!es93L9k!;guFB4AVw>gq(#D+QT(Kji-btq*P^yDtQEw zF(tcDgEfR!1~y8E7126F4e=FGPqVH`6XBHTz{`&hl?wR5i;mdT{E|qilGVW$&+<3| z&QD;2g+%j{xNG3Z4)kP6`~m+U{K$`awoED9i3ISeDOPy_J*#Y$%(jsCGqiFk)P9KI zo+H6MF9i3z`DLoFp4wYW?X9N{)l!ERtV91-1$D>61y%a`Rh!(#;D5K0y2iYZE2`>n z_OWF3cq{1nE`&8DDH77k&qA{J_ejRbN9!>972H>!YA>202=;f>?;B)um}K*Ukj)EH zHuu$1`|7E~wbbDSs|}ndI)o9W+{H)6M+oq)n+TtA-aMZq16Tc8V>`-R6qLE4e33Fn z!eG$ZCqhY}LU}yw`zYB+9wayCGUS^kKi`5K)C7UG^XCM9fR7ywEZ(^O9AGWu)`nPl zD2;K#SXvlCX}eY>(?v{h6ny$=WUVmxhSd(w0jc@PbshRe8e6mN(6T_(cj66;(o)>_ z$^0$ME8MZLZ+;j&C!-C11h1=aw2`5;ad{96>&W9*7{sL$&62A}PzIxzWk@HJ*aVf3zpOn!xJI|67 z$IdEbZQ+G3bT4G~HQWef4b#?I3g)a?1s?xYy)%)fo5dFt!S9(!I-2Xi>&t*=qvZl} zg<~QisALuxPKbstTfR^$ArbzrjSr{euja#EC4KS`Rf0{8{=N~k0m-lFqXn514B^o+z(#k%hJq5Ft!_UjU?|(|vQpV&j{fum)KV^I-6h+5 zGl#ES3TaE?$CO-}I1H51N`mUr7SVuG8h#hQs=HT7Lp$;RN9w&36&&zJBZec$zM9py zu;a*QXKOo7-Lu~Mwbgn3@`uC1%MPbgZ8P+gjpGyA^P%zr`JahKVa*lM;@?L^sKqOeO+|3 z9Eirqy$cPoyU!-;k1 zppj%`Q2vGpPSVkSju8qw;O54VZ$=&the-I~r(A)ffJeAEogbRWl}dI|#enuyrHGHV zupA5}GI4>3iLZ-%OsUd!l*tU|{KcA8Dlo{R0|Lsg8^i}Re%fEEDLWlX_G7qjO!v!V ze-oG0jKqMZa)$O*H3?YslD#k4Ks__(+F@4Ly2M zX_u{6+4ZPLM~|YAlb!6)zk(~qq-0u4fkRg6sZ%2=yAG#N{Xt0a1ULvWYt^QFyVN>K zj4pI9Fh$#QBR@r)5?KwYM`=2m0X6)G=o{WBB$6*louNGH8_&mN%8C`YWE37QBmec7bKSmX`$FZ@7j6{p{D9T^RBp?}CnObP} z6McAI-4!NeEwcX&EnPy>bH;=9W^DJD8@lIC%)hm?`57eqzPHr9?PlgDnR<7+)}5vl z-tm?co>gauYwYl6+ZNfe&*OuX!aJ^jMtFlrc7^=Xp^XH`g@_N2*8v_!hnrAh^I^%F zC~?-ffrBjZ$%TJdq7MX8*??*MA}y1Wiew3zpx%*oTx!GjV1G5p`)?XE4Dxzv$(~QP zd~)U1AKks$3i9ZbLi)*ss%w()MtL$%zXrN& z%XdFmjzu~L5uHS0gVJaWr;}^rP%>(ql!X&Pt-zD8o&bCe+z7QK;F$#Q+#-NyXY{!F zpf5s5Gr1wE<`W%gQaZPz5Abpo9H(-8fM*dLlV8@+rzDNI{D59SThXg!ew>^=*=J@JcD}e`;JR{j#xys7 ZJho!cb>)NTE9Rj2$)4XBbQK=se*j%W8r=W@ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/source_context_pb2.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/source_context_pb2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0bccf8ba2b96e04e8a09da0a423bfbe35076a20 GIT binary patch literal 1680 zcmd5+O>g5w7#`bgKAd&Z&GJzw?53gHrqH$b0}vGps7cd;5N*|@u;gOdo=I?Od#o9U zB|YVcmLI?saRPeb7jQ>h61FIjr9B`{y#?*9;=tJXY*ymTD01HSndg1|yyM6IO_D^w z)-U#_wSVRT_$x?8i{;^ZTIB%v7C=w|kb}I%*?dLdf>>bjTxC9t=U5!6M8kOAirMjs z$N?UpX#Isz!^!{YFsxi*jQRg!)R!hzqXHHhhYn6NB0 z$y66(D}ZRz*0H5R&C_&^A_hhEhG{`W=mqN`uGBEDSx5*F5T#N`EDU(*B{5z#Eu=b{jTX5Kmx~|90$`8j`A3|1&A_%i(G8Z5VQ%GnY61@2go-vTWID2d+GYWAu zi$sEgm^!qVAKgY(tzmgg3+tgm-M_j8VF?jav&<6&cbGd!G^mNzEUar5WyPcDdOk4e zCx}w5hPE77bQ<>d*z43E?3b}S1v1*Ofck0ms8m!7>g4H_Sa;Le4>_4_VnS14a*jRh28OL8Z_A;k&R#CN ziJUJL%hVOO>3xBnd-9#T3N<}+%hilyHX&68r#dnEvu2dt=0)tjjbXz=?~`SwBl!N& zU)iNEa2)ry2)NZJ;H@X%gYfrGKLQf3wZ)gaVzwh@AB!ukXkP@$)wc9%SGw7eZa$XQ zy3%Gx+Ux`HZa%_hOBNz6@y|s1o6T0N2i97#E?Db;wI9TvKRg5PT|(M#K4@3;Ghp0O@$~=z literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/struct_pb2.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/struct_pb2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12b59ee97e3bb3afbb07c9582d6c789b83d521fb GIT binary patch literal 2561 zcmc(g&vV;E6vtOm{A(RMuKO!ZX`7@;?4+$t-F8T5DCCFJc1T08opx#t8r!=uN@U3+ z$z|M2b7Y3$3`d3&&`XCufIk3+nV5!&Ml(GCr`*Ey!t?@fC0R1glq(vK^xk(r@9pl> z)B2}a3?sOHXxy*A1nUpxbgzJGyv*%v= za<~yGV-E3%hPF<16Z+4mu2~)gBJf|t)>%KQYmwkn&aumJh#&H@CBVa5<6X{w(l|{# zgkV4g#BonIXzr#DlZ`4(_F4L?%4NQ^M4Xsr(GPa)_ zaz-5wM#sP8aIk0-$(uO1DN&i|!`!Hlj^-|A`rwQMW>#z}uNYdp;D(HRh@(AnGJ%C{ z+J;12I#OU}@-hxQs>m%m%!3xqojQ{IJ{v7K(A)ehH~u}31GWe&!%9n*MJEAE8qbX! zNw5Zp&EG+V2;-gLi+E6JHL6r|!`b{CAW=v4AgGh1)Llqm3ulm{I?x4-tMC?FWB`yb zn~G@;Fpmd;hibb>0FY?z^pTZ1b#&7M?nJ{bWl8VG2JP6RyIcjt=GoMYx1Gfx9@v%? zGJX?BJR+IF!AGpB-8cHWqPx`0Ssd|-n2ck*wz0Y@-d|YV$S2U^6MVd;Hv0Fn72FK7=FMtuWzE9N`QlRH?t1Big8l?Ps{eV_)^V{|Dr_v3 z#Fe}G)#YM-tyFlZv%`0mlWxJ&!XhiPU1jMZ2nRVBv_fv!!H?h_wAt-vrU#w(A^i0t;KiCPmytN(M?*lBJ>MgLsU2AGoQQS6gOV}Exb_nkJ@aDVM3 z#h{u}k+mQT2#fAnWQCULW~C(?uolQ6lB#uVfsi8Aq>3y(resBusTN`}p}MSAE3yv3 zUF-ZJJJIe@U9Z&XfqW2BY(p`!wd@9@(X%Vmpvvg7CJ`wM%h@*6ChPbu zYAh(aRE3kc(Wc6ytSnWt&9?Ees$9!l&1H4TpjVoe+BWP^cRw2cOYu88(`>&A&o@-k zlIbli1@p5%d;K2V4+W0n{=|rzdVy}dK=0bW*~1`;Ufjha`*^&A$DiYgozNjh@u}U| zx&7E=CpP&!mfDZabz*ae2;G#Eu%~zsM!vG cVvnCPC)uhTXW}(8{mQ2g&!K@!+9Z_qALGr@>Hq)$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/symbol_database.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/symbol_database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9a02d0f68348c01f465ad38eb56a24bd20a8781 GIT binary patch literal 8690 zcmc&(TWlOx89uW+d-3kZcHG2G?2w%1((DG;h9)(xn}#}Z+=dVnl9Y?9u#9(RopE+| zmN~O_cjbVApaxV45Q4M|;Gw1SOzyCk~`TdR^F^1EWA9kK75kD@{cL%%I=UY`4EjDw@MHR=#NF4DOhD zV<4s#be`9)8-kk-H#AY^j>R*!fjxP_nCE6eI9eft?;uj+wlQN0$FM<=Q!W|F!7oZqt2sZ6B{n^yrAU`FmU#HEnfr$B_eoqG#2ArpXN_`ET(<247M_wOwqtY z{E|n4FA*ZlED%k?8Q@vl%7Yxp6#SQRj!7G3!7n67+YI{CC(t);h>UF(A+Th=oR+dr z7pET`96x*c%%yV|uYBTCs&$elUe-u9HC0?2YrE7`=#_FT6M%-`T@Y8z3&BeSJK#xbpemNT6)M~9XJqY&_%sY5}! zX&V^_J~L-(;4fnp;616H!BfUZmhO*W&hF!JJR!6TK-4YsoOK(8oWX7kE z$ffrnem72`xy=@o=M}L_VUCBtjLkNW#u$2hoL*q*`q#3O3RE6CS1=tD>Z`zMGzo>R zR1Qw2f;L5!T4%$_FG8v{RmwI{Q-zVs+7yxmte&hABinOp%4=@rIgQjrS~0-p2;X_TC9x{47aVt^?BSeXuUDk^R-k{^baN<(bzb z1Ah+3UNFCGu7vkj!~2&GeE7}qqiZ1+edPUBYyW#wtAv?AWy$BQS*->Rxy>?vw>qVH zO@igg*0XeKl#{QvuMUmcUU6V+2X9@)U8L^t4f}Cz!af3Zc=ljFjCa=@ddM7F7xH6E z7ZKD%cC$UydVTq{&aE8T#zb0&=}q?0v%P&BtcDN1^3gZK$5-QhOKRWyYajoe+yBJp zzu7);4w^GFD0wu%`rVp{H?>LJJbBq&uE|+l@84n@$EpX8hRqNZNVWSo(4_a>r1#Am z_-L@1oEGiZ% z#`CDCP<;&`k}V+9f=>INue zmgO>C3S3btf6#J8ea@H@4v(XzS|_!PhYVgTC0a7h=2-?jZNr z;#|BCCSzX+EQDvNme=;sQS8NsRQBQ^ey^z*cbOex4wZN0bC}t8NL#&+nw3fRLL-W~bgip_q zG9@T>&Va?0O(Unf7VD3e5Z3)t97Me`eV7= z1sC3hAa&mq>rCm`ckBFWcmHy%|85Zf+zn#Dza=eSO@2^GMZCkG ze|6;IX>GU1yUS^Mx|}8<)WUOGu4D*_$F+`ZDVKBmqdummqOuxb_k+G#7-0cdlNd-T zj9kEdCHdHdC{ln@6oL>5(xK-mS3>*HbH6&(%lIz7j|Nh>_i!k*Z>^Jcb}vq>?(SP> z(a_FY9jiUPw^QFvt@IqL_8fcl@#UV!7R}Y(11r6cReK*>={;HPJ-OU_YMq56J0Y`O zhhBMRdDkQBEYz{{*7#aLjqhANlKRQjA76d#MD@tXt%+})xP9u|r(RDSyc@!hyFpA_ z3t^+R9+v1?yzth&2^a5=|IPC6$NcdnZ$h% zE-XkW>2xiYPP;gS_e47Vg_4%@zC_Y#-O8lXZV23g)$HBW?4gDvWFMl2Q$u-_O=T1N z1T`aQe#&ILas^6(%BF?}iU~9~*&hN!Yhe;wazhOSA778E!H=vb)ZiI~+NaTW2On5J z91R{{-<1gVukY&!j;{AcgD2N_bq7x?8;1`Ed)zH(;gllHDTCMgLmnT*?*>)sQGuy{ zpuDPb$g54sL;wh?!C>02D&Tn0^!V9{v1dPi#XgVu4W4R|ad(bAiT>Z=R}dYG>~9@A z7l-7yRLuSu&7rb*ZBKj6P2Q-ZHtv=~y4pU=i!WJ5mvWPv*cWKERx;j>o^+>nIC&4MA2gdiXbhIFG=(PjzViV#`D%*7ejo^kGs zmmd*@Y9lptw}Mpd#;esziMCQnQ6K-NXWw`Pd#_W<|iSk z_MumrJ7?}a=bqpDo%vfyi5J26OX6p-(h`LJ#XbtdohLT^JVJMnj7E^m$$Xp};S@B& z%MQZJLN_qUPM};CI z`@$?*=Iq_u{Aa}i>|IAAplJf^e04167X}cMAB9s#+#??1Ax`3E`j~uPr+*Kf;OTWF zm(QXZ7eb(|$kt{__~pPJ5^uF~1~gi-fjvEZgEl5L0#W-x{uOQeciDZ}BUcdbI4@V; z6h?et0XI>T56q62TvdqcNQu0UctNIgT#&0lrfiy*c+QISB+PH4LNzn{2USUv6*Yz_ ziHio2amrBQilGp_CC3zAnBhl_ToF(}s5w??K+qgZAP|kYMw>XAJ8Bc7xltf;2=bo8 zY{@x#q_thk-2mEjQDUU1D&P7rxz7?6H@6hbtFfZJtw3hOE_b2rhi9B@uh<|llG_3ig9$2ccDZhB^+s0(Ge zecD@Ogg42AoMHmp8q_5*NwA2=rVXNF-JmS=;~K>&onS@9qKXYNW#A;$3{BGFcq}zO zPH2nQi*X-~>0R)~7E2fIvrZ`-VrY1bU}7ndTP!wFkEV?A&MrKZB$6@?ImOC2BwA0! z4V)0Cv81Vn2wGK5ZSEV2oIj7Ht0EO8gHYW*f@wRi;`gVGtD1`2v2j(=u^5kQlR8eR zd2Ku7hgAjYiTsaqPQWIgE+=n8l?S$W)n${IrVxeNDEh%>nmn;rcA+15*o& zpL2IO4t-W7plS3c$0SF~U=e~+9hL0tMpJf5qlOlR$liCDd`qjzNv5DtIjXapi}4%{ z!24xUcZ{fHDoJ~1g0Fj1*gFlZ`hJ+c{}1|p4y^_HA8-#VessTMg$v}~mz7&yvJ07akut#DnmQ{bx z3tA6MA(!b@bVbz-QI&}4fQXt!1{GDEp|2U-vPZf~Epw(5V_H0#5R;|@;%y2OnxcjT zQ(%Q;y7M>OEVJrLf%|SJi!xhu7DKqd?^?+*-T92r5G)^L`wXZd0nah2YDgQuAIesS z=E9Gi#kU)t_{tV~=X)OpJF>o$8R6t(f5WdU?p>Zc47=;Tl7-Xrr?Zf@OAiD6Szmuf z=wC1LEmY4}XZ<}7gopl~Y*9~!@1d2TV5afd=;-m#)UnI0&1b~s@xJDBS3<|m9^Cm! zn}Bgwrnj2HZ(s-hTL7?k*6{=@yI0062Y(y+b^%R-->W&ue4+Ly3V%jBPLUm3yL&Vi zSt#rdp^$Utx5Ih(12nfFI}hfQig6W3nssA3UVvk)lWQrs^nkyB(l)kP4PZ}LzXZ@I ziw2yk;iO3OeSx9dYsj~&1H1-#%m)kd{s_eGwz^mR4%5%U1cmQH9^b7tR?UlTpLTt6BVE4c4z8D!E_^uu;o`+l zN79E^OAg#E|3me?>ZS6pgR3RSGp^(7zT$#JMyRrD+zEZQxzj8yV5JS6W`K&5g)14g z*Wm7!MkB))28SYj?+-@b8~izdKx)i%SxteME}5_f8gf{7f}Q|F*Sb>ATW&oII34?*2T*bFJ74{(uRcAobU5n^&ow>q`WKq#o73*B7yrXoK7T3` zXw3Q!{o5v+vc97mZigdexfJr7?r2ojq-fOSDWQj$Ax;3Q7@!t_6RoxupxGsKQ()C> zy6hW38(@brfU%IqbW2(ysl*9oZOn99g>RY6lBifoY_;2mr#qp^sW|DSgTTsaKp%s7 z!@+UfQ$OMw|Bi~D)Hh^Ma2+3kIo-C3>eml8G4jMJI`Bitr!MqP+e-OLWVz>2@XTHD zi}v)juTHH6&ty>bdS%OZl^v^<9ofoL&k)Cje(}?}fm==MjmI*4ZTj#U-@r@?J@ug0 zlPeb=@XNE0YPy#Wrfcr@eOb3w)BQNqvP4(fmk&Iu>Ac(bMMe7JSNqm#I-feY+B5$Q zcdQIOIJA7@QO((Hk+V;oeC@kj232mjP*r%B_NKh{h9en%-=eX`*D>u)PXy1crVUp$ z*PE6$5xh1!P@rxxa3^>>n5pZ_miNzA~mh_2StuhxT{9c;-d5Jul3f iPI%7hESY~Ui*yKoeWy5bM)<~A7U^|;bEtU0;rcJV`*=tI literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/text_format.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/text_format.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6286ed3901412c7d272676a881f8b8d723359e35 GIT binary patch literal 74655 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 LAond}8CK+9JRW3M literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/unknown_fields.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/__pycache__/unknown_fields.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9e6c7ddc9d90bda59e956ffe0b858e479aebafd GIT binary patch literal 4374 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/any_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/any_pb2.py new file mode 100644 index 0000000..0c120c0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/any_pb2.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/any.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19google/protobuf/any.proto\x12\x0fgoogle.protobuf\"6\n\x03\x41ny\x12\x19\n\x08type_url\x18\x01 \x01(\tR\x07typeUrl\x12\x14\n\x05value\x18\x02 \x01(\x0cR\x05valueBv\n\x13\x63om.google.protobufB\x08\x41nyProtoP\x01Z,google.golang.org/protobuf/types/known/anypb\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.any_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\010AnyProtoP\001Z,google.golang.org/protobuf/types/known/anypb\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' + _globals['_ANY']._serialized_start=46 + _globals['_ANY']._serialized_end=100 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/api_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/api_pb2.py new file mode 100644 index 0000000..a39d2eb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/api_pb2.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/api.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import source_context_pb2 as google_dot_protobuf_dot_source__context__pb2 +from google.protobuf import type_pb2 as google_dot_protobuf_dot_type__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19google/protobuf/api.proto\x12\x0fgoogle.protobuf\x1a$google/protobuf/source_context.proto\x1a\x1agoogle/protobuf/type.proto\"\xc1\x02\n\x03\x41pi\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x31\n\x07methods\x18\x02 \x03(\x0b\x32\x17.google.protobuf.MethodR\x07methods\x12\x31\n\x07options\x18\x03 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12\x18\n\x07version\x18\x04 \x01(\tR\x07version\x12\x45\n\x0esource_context\x18\x05 \x01(\x0b\x32\x1e.google.protobuf.SourceContextR\rsourceContext\x12.\n\x06mixins\x18\x06 \x03(\x0b\x32\x16.google.protobuf.MixinR\x06mixins\x12/\n\x06syntax\x18\x07 \x01(\x0e\x32\x17.google.protobuf.SyntaxR\x06syntax\"\xb2\x02\n\x06Method\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12(\n\x10request_type_url\x18\x02 \x01(\tR\x0erequestTypeUrl\x12+\n\x11request_streaming\x18\x03 \x01(\x08R\x10requestStreaming\x12*\n\x11response_type_url\x18\x04 \x01(\tR\x0fresponseTypeUrl\x12-\n\x12response_streaming\x18\x05 \x01(\x08R\x11responseStreaming\x12\x31\n\x07options\x18\x06 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12/\n\x06syntax\x18\x07 \x01(\x0e\x32\x17.google.protobuf.SyntaxR\x06syntax\"/\n\x05Mixin\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n\x04root\x18\x02 \x01(\tR\x04rootBv\n\x13\x63om.google.protobufB\x08\x41piProtoP\x01Z,google.golang.org/protobuf/types/known/apipb\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.api_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\010ApiProtoP\001Z,google.golang.org/protobuf/types/known/apipb\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' + _globals['_API']._serialized_start=113 + _globals['_API']._serialized_end=434 + _globals['_METHOD']._serialized_start=437 + _globals['_METHOD']._serialized_end=743 + _globals['_MIXIN']._serialized_start=745 + _globals['_MIXIN']._serialized_end=792 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/compiler/__init__.py b/myenv/lib/python3.12/site-packages/google/protobuf/compiler/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/compiler/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/compiler/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa71bc34f3594a40221f1785a51b039121d10a7d GIT binary patch literal 215 zcmZ8bOA5j;6ilpw2)%<_7xtlUMG%Thce)L2eb(6KLy{J963^fvJb}mX1kznsrdtQ* z&Ai7vn0Fk{NWe>+%RxWG_(wMmmk04=L61*jMq%rQOy7c#4hlF~G!_o%P|j1sFC0>| zl~WqDQFnBEX?b2F2#>Obn&+UsyD7OzR%@`_;ZkQsm6d3rRH_Wg@aI(CT%k}x^BN5> f#wB-*CEEAXtx%Vy#+{jj8Z^)j<{ME;O%&V@UkE%D literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/compiler/__pycache__/plugin_pb2.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/compiler/__pycache__/plugin_pb2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e61f8f801932a935c471fb955ba01f1412c51f89 GIT binary patch literal 2989 zcmcgu%}*Og6yIGNY{nRyO#lN)1BQUfhusqLK>|qun*=Gv?i#4-R$8sSgR^A4yWL%< zaZVg7^$+N^$F{k&>b=LRQVzw9D=bSnR6TK{ih9YZZ}!9Mn50rKU0Lh*e)F3*Z{B!O;yyi&@RDUH>MKg53Y18Tj7(RUf{!M$4`hF#$CCXZ_Z9+{ z+#?4oeFa2Q421)G!>&Q^|EVJu`oT&s%nTO>EOyVovG>k-7F7hiNy&`S538~$`i%v?k?6RN~(yHM`SZ|bPI{tDCv@B zsyb*9PvbRJl?i0jDn(W1MZpw`f`I`F6swXfVlrW%b3$?6Nc$-YoiD3uS;i@AVOTU( zQY)GyV?CwG)v}}{tpPS>(`*fBNtZS@(QUw6#b(D#D6oTdLsAv?H0r4cd#WCzC+I{E zXDb#eDS$E#N)&=>f?0YH^Vz7Su*0a=fY3;fV}5}9I7f^B%AnJ05G*H@s?Oohs@O2u z1d8s$et1*m%TAbKbstO}Ao!N*2A@5H`ZPfoD%ixfD}9^?uxkieq2S4^SOhGD=BJb0 zVOfX4bURBql1(r|{>TXXDH<`_fgbM3;)QDxD~w6 z{NxEoU1HKn4Ht0{2Z;aZLqlB=H8fQ*Fv$$obtj8`oUO2z5o=U6P1T`}`CTlSRUI2v zO8wkmdt}`iVDBM+M9dNfkF#WU7DXiRSvR5l z;Fw5?X}JX1Z^Jo)vN04Wsfvk#5V0!DRap+5aw|vV$${i0Wmk7-kAEAH~2{wxQ*E1_y+gyg<%x-3)6g!SaTqMV3x3X9GY;J2KySZ{dO0#Ft zs5_Y7&gHV)R-VtKH^_KC%B3?%Y|Q*Lrs`*YT@wkp#o%sKU2R%JmcCsn=dH3GAy zVZ-SHTJbw3cGv0@Noy);0c%dDcrw*}3f$F_b`RmT;{5t%3#BvpHEtufmE{Z_I@Lox@4Ss>*TCFZE5P%jTH^Uuq${pExkg)|j<%sg z3#VGq4#c_&bn?vsaMyLvI?=_U@UgB4vffK31bOGOXa&-ESE$M+_yRU~v8V?KVb*pC z+%tKrsX-Z7ir2_^lI+&tiYVr>E(x;q1dHTw>Oo>4P?puAARDlhE4{NyE~pQ%VF+cs zqKFx#TJbul(Xz+4RILL9nlr&@vHW&E!>{pPapl3fs*wY4v`+DG_8m9c;9w_cn1XJ$ zBApOc#BZsW;4k&+ajK%2sZwei%owS4xEhp+v@VHK3fy^Usv0>jd)Qo245d#TXW0UA3*@j8k>N7MU(zk4ZqhlYWHnS=1z z!|?ff`26$m>|uDZ9$q}As9WiA*y2EDd>{Q0V!vG64>qaU{oo-rTc>8fLEqnNP|L3& z2MZq`d{SyqV$(Np=$owjCcobP&3B&$S2 zNi=6Kw3V6WwZ;9!K`35lrW(xE=E8MPyVAUVlW0?QX1c*#YhJzKX$#GzJ48#=nYjjY mt9f(T(-xa|R*818&Rl9Rx0}oFyV~!}((x$ezo?V%*na>RN^T|q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/compiler/plugin_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/compiler/plugin_pb2.py new file mode 100644 index 0000000..f5b1f97 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/compiler/plugin_pb2.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/compiler/plugin.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%google/protobuf/compiler/plugin.proto\x12\x18google.protobuf.compiler\x1a google/protobuf/descriptor.proto\"c\n\x07Version\x12\x14\n\x05major\x18\x01 \x01(\x05R\x05major\x12\x14\n\x05minor\x18\x02 \x01(\x05R\x05minor\x12\x14\n\x05patch\x18\x03 \x01(\x05R\x05patch\x12\x16\n\x06suffix\x18\x04 \x01(\tR\x06suffix\"\xcf\x02\n\x14\x43odeGeneratorRequest\x12(\n\x10\x66ile_to_generate\x18\x01 \x03(\tR\x0e\x66ileToGenerate\x12\x1c\n\tparameter\x18\x02 \x01(\tR\tparameter\x12\x43\n\nproto_file\x18\x0f \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\tprotoFile\x12\\\n\x17source_file_descriptors\x18\x11 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x15sourceFileDescriptors\x12L\n\x10\x63ompiler_version\x18\x03 \x01(\x0b\x32!.google.protobuf.compiler.VersionR\x0f\x63ompilerVersion\"\xb3\x03\n\x15\x43odeGeneratorResponse\x12\x14\n\x05\x65rror\x18\x01 \x01(\tR\x05\x65rror\x12-\n\x12supported_features\x18\x02 \x01(\x04R\x11supportedFeatures\x12H\n\x04\x66ile\x18\x0f \x03(\x0b\x32\x34.google.protobuf.compiler.CodeGeneratorResponse.FileR\x04\x66ile\x1a\xb1\x01\n\x04\x46ile\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\'\n\x0finsertion_point\x18\x02 \x01(\tR\x0einsertionPoint\x12\x18\n\x07\x63ontent\x18\x0f \x01(\tR\x07\x63ontent\x12R\n\x13generated_code_info\x18\x10 \x01(\x0b\x32\".google.protobuf.GeneratedCodeInfoR\x11generatedCodeInfo\"W\n\x07\x46\x65\x61ture\x12\x10\n\x0c\x46\x45\x41TURE_NONE\x10\x00\x12\x1b\n\x17\x46\x45\x41TURE_PROTO3_OPTIONAL\x10\x01\x12\x1d\n\x19\x46\x45\x41TURE_SUPPORTS_EDITIONS\x10\x02\x42r\n\x1c\x63om.google.protobuf.compilerB\x0cPluginProtosZ)google.golang.org/protobuf/types/pluginpb\xaa\x02\x18Google.Protobuf.Compiler') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.compiler.plugin_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\034com.google.protobuf.compilerB\014PluginProtosZ)google.golang.org/protobuf/types/pluginpb\252\002\030Google.Protobuf.Compiler' + _globals['_VERSION']._serialized_start=101 + _globals['_VERSION']._serialized_end=200 + _globals['_CODEGENERATORREQUEST']._serialized_start=203 + _globals['_CODEGENERATORREQUEST']._serialized_end=538 + _globals['_CODEGENERATORRESPONSE']._serialized_start=541 + _globals['_CODEGENERATORRESPONSE']._serialized_end=976 + _globals['_CODEGENERATORRESPONSE_FILE']._serialized_start=710 + _globals['_CODEGENERATORRESPONSE_FILE']._serialized_end=887 + _globals['_CODEGENERATORRESPONSE_FEATURE']._serialized_start=889 + _globals['_CODEGENERATORRESPONSE_FEATURE']._serialized_end=976 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/descriptor.py b/myenv/lib/python3.12/site-packages/google/protobuf/descriptor.py new file mode 100644 index 0000000..5b32e5e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/descriptor.py @@ -0,0 +1,1282 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Descriptors essentially contain exactly the information found in a .proto +file, in types that make this information accessible in Python. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import threading +import warnings + +from google.protobuf.internal import api_implementation + +_USE_C_DESCRIPTORS = False +if api_implementation.Type() != 'python': + # Used by MakeDescriptor in cpp mode + import binascii + import os + # pylint: disable=protected-access + _message = api_implementation._c_module + # TODO: Remove this import after fix api_implementation + if _message is None: + from google.protobuf.pyext import _message + _USE_C_DESCRIPTORS = True + + +class Error(Exception): + """Base error for this module.""" + + +class TypeTransformationError(Error): + """Error transforming between python proto type and corresponding C++ type.""" + + +if _USE_C_DESCRIPTORS: + # This metaclass allows to override the behavior of code like + # isinstance(my_descriptor, FieldDescriptor) + # and make it return True when the descriptor is an instance of the extension + # type written in C++. + class DescriptorMetaclass(type): + + def __instancecheck__(cls, obj): + if super(DescriptorMetaclass, cls).__instancecheck__(obj): + return True + if isinstance(obj, cls._C_DESCRIPTOR_CLASS): + return True + return False +else: + # The standard metaclass; nothing changes. + DescriptorMetaclass = type + + +class _Lock(object): + """Wrapper class of threading.Lock(), which is allowed by 'with'.""" + + def __new__(cls): + self = object.__new__(cls) + self._lock = threading.Lock() # pylint: disable=protected-access + return self + + def __enter__(self): + self._lock.acquire() + + def __exit__(self, exc_type, exc_value, exc_tb): + self._lock.release() + + +_lock = threading.Lock() + + +def _Deprecated(name): + if _Deprecated.count > 0: + _Deprecated.count -= 1 + warnings.warn( + 'Call to deprecated create function %s(). Note: Create unlinked ' + 'descriptors is going to go away. Please use get/find descriptors from ' + 'generated code or query the descriptor_pool.' + % name, + category=DeprecationWarning, stacklevel=3) + + +# Deprecated warnings will print 100 times at most which should be enough for +# users to notice and do not cause timeout. +_Deprecated.count = 100 + + +_internal_create_key = object() + + +class DescriptorBase(metaclass=DescriptorMetaclass): + + """Descriptors base class. + + This class is the base of all descriptor classes. It provides common options + related functionality. + + Attributes: + has_options: True if the descriptor has non-default options. Usually it is + not necessary to read this -- just call GetOptions() which will happily + return the default instance. However, it's sometimes useful for + efficiency, and also useful inside the protobuf implementation to avoid + some bootstrapping issues. + file (FileDescriptor): Reference to file info. + """ + + if _USE_C_DESCRIPTORS: + # The class, or tuple of classes, that are considered as "virtual + # subclasses" of this descriptor class. + _C_DESCRIPTOR_CLASS = () + + def __init__(self, file, options, serialized_options, options_class_name): + """Initialize the descriptor given its options message and the name of the + class of the options message. The name of the class is required in case + the options message is None and has to be created. + """ + self.file = file + self._options = options + self._options_class_name = options_class_name + self._serialized_options = serialized_options + + # Does this descriptor have non-default options? + self.has_options = (self._options is not None) or ( + self._serialized_options is not None + ) + + def _SetOptions(self, options, options_class_name): + """Sets the descriptor's options + + This function is used in generated proto2 files to update descriptor + options. It must not be used outside proto2. + """ + self._options = options + self._options_class_name = options_class_name + + # Does this descriptor have non-default options? + self.has_options = options is not None + + def GetOptions(self): + """Retrieves descriptor options. + + This method returns the options set or creates the default options for the + descriptor. + """ + if self._options: + return self._options + + from google.protobuf import descriptor_pb2 + try: + options_class = getattr(descriptor_pb2, + self._options_class_name) + except AttributeError: + raise RuntimeError('Unknown options class name %s!' % + (self._options_class_name)) + + if self._serialized_options is None: + with _lock: + self._options = options_class() + else: + options = _ParseOptions(options_class(), self._serialized_options) + with _lock: + self._options = options + + return self._options + + +class _NestedDescriptorBase(DescriptorBase): + """Common class for descriptors that can be nested.""" + + def __init__(self, options, options_class_name, name, full_name, + file, containing_type, serialized_start=None, + serialized_end=None, serialized_options=None): + """Constructor. + + Args: + options: Protocol message options or None to use default message options. + options_class_name (str): The class name of the above options. + name (str): Name of this protocol message type. + full_name (str): Fully-qualified name of this protocol message type, which + will include protocol "package" name and the name of any enclosing + types. + containing_type: if provided, this is a nested descriptor, with this + descriptor as parent, otherwise None. + serialized_start: The start index (inclusive) in block in the + file.serialized_pb that describes this descriptor. + serialized_end: The end index (exclusive) in block in the + file.serialized_pb that describes this descriptor. + serialized_options: Protocol message serialized options or None. + """ + super(_NestedDescriptorBase, self).__init__( + file, options, serialized_options, options_class_name + ) + + self.name = name + # TODO: Add function to calculate full_name instead of having it in + # memory? + self.full_name = full_name + self.containing_type = containing_type + + self._serialized_start = serialized_start + self._serialized_end = serialized_end + + def CopyToProto(self, proto): + """Copies this to the matching proto in descriptor_pb2. + + Args: + proto: An empty proto instance from descriptor_pb2. + + Raises: + Error: If self couldn't be serialized, due to to few constructor + arguments. + """ + if (self.file is not None and + self._serialized_start is not None and + self._serialized_end is not None): + proto.ParseFromString(self.file.serialized_pb[ + self._serialized_start:self._serialized_end]) + else: + raise Error('Descriptor does not contain serialization.') + + +class Descriptor(_NestedDescriptorBase): + + """Descriptor for a protocol message type. + + Attributes: + name (str): Name of this protocol message type. + full_name (str): Fully-qualified name of this protocol message type, + which will include protocol "package" name and the name of any + enclosing types. + containing_type (Descriptor): Reference to the descriptor of the type + containing us, or None if this is top-level. + fields (list[FieldDescriptor]): Field descriptors for all fields in + this type. + fields_by_number (dict(int, FieldDescriptor)): Same + :class:`FieldDescriptor` objects as in :attr:`fields`, but indexed + by "number" attribute in each FieldDescriptor. + fields_by_name (dict(str, FieldDescriptor)): Same + :class:`FieldDescriptor` objects as in :attr:`fields`, but indexed by + "name" attribute in each :class:`FieldDescriptor`. + nested_types (list[Descriptor]): Descriptor references + for all protocol message types nested within this one. + nested_types_by_name (dict(str, Descriptor)): Same Descriptor + objects as in :attr:`nested_types`, but indexed by "name" attribute + in each Descriptor. + enum_types (list[EnumDescriptor]): :class:`EnumDescriptor` references + for all enums contained within this type. + enum_types_by_name (dict(str, EnumDescriptor)): Same + :class:`EnumDescriptor` objects as in :attr:`enum_types`, but + indexed by "name" attribute in each EnumDescriptor. + enum_values_by_name (dict(str, EnumValueDescriptor)): Dict mapping + from enum value name to :class:`EnumValueDescriptor` for that value. + extensions (list[FieldDescriptor]): All extensions defined directly + within this message type (NOT within a nested type). + extensions_by_name (dict(str, FieldDescriptor)): Same FieldDescriptor + objects as :attr:`extensions`, but indexed by "name" attribute of each + FieldDescriptor. + is_extendable (bool): Does this type define any extension ranges? + oneofs (list[OneofDescriptor]): The list of descriptors for oneof fields + in this message. + oneofs_by_name (dict(str, OneofDescriptor)): Same objects as in + :attr:`oneofs`, but indexed by "name" attribute. + file (FileDescriptor): Reference to file descriptor. + is_map_entry: If the message type is a map entry. + + """ + + if _USE_C_DESCRIPTORS: + _C_DESCRIPTOR_CLASS = _message.Descriptor + + def __new__( + cls, + name=None, + full_name=None, + filename=None, + containing_type=None, + fields=None, + nested_types=None, + enum_types=None, + extensions=None, + options=None, + serialized_options=None, + is_extendable=True, + extension_ranges=None, + oneofs=None, + file=None, # pylint: disable=redefined-builtin + serialized_start=None, + serialized_end=None, + syntax=None, + is_map_entry=False, + create_key=None): + _message.Message._CheckCalledFromGeneratedFile() + return _message.default_pool.FindMessageTypeByName(full_name) + + # NOTE: The file argument redefining a builtin is nothing we can + # fix right now since we don't know how many clients already rely on the + # name of the argument. + def __init__(self, name, full_name, filename, containing_type, fields, + nested_types, enum_types, extensions, options=None, + serialized_options=None, + is_extendable=True, extension_ranges=None, oneofs=None, + file=None, serialized_start=None, serialized_end=None, # pylint: disable=redefined-builtin + syntax=None, is_map_entry=False, create_key=None): + """Arguments to __init__() are as described in the description + of Descriptor fields above. + + Note that filename is an obsolete argument, that is not used anymore. + Please use file.name to access this as an attribute. + """ + if create_key is not _internal_create_key: + _Deprecated('Descriptor') + + super(Descriptor, self).__init__( + options, 'MessageOptions', name, full_name, file, + containing_type, serialized_start=serialized_start, + serialized_end=serialized_end, serialized_options=serialized_options) + + # We have fields in addition to fields_by_name and fields_by_number, + # so that: + # 1. Clients can index fields by "order in which they're listed." + # 2. Clients can easily iterate over all fields with the terse + # syntax: for f in descriptor.fields: ... + self.fields = fields + for field in self.fields: + field.containing_type = self + self.fields_by_number = dict((f.number, f) for f in fields) + self.fields_by_name = dict((f.name, f) for f in fields) + self._fields_by_camelcase_name = None + + self.nested_types = nested_types + for nested_type in nested_types: + nested_type.containing_type = self + self.nested_types_by_name = dict((t.name, t) for t in nested_types) + + self.enum_types = enum_types + for enum_type in self.enum_types: + enum_type.containing_type = self + self.enum_types_by_name = dict((t.name, t) for t in enum_types) + self.enum_values_by_name = dict( + (v.name, v) for t in enum_types for v in t.values) + + self.extensions = extensions + for extension in self.extensions: + extension.extension_scope = self + self.extensions_by_name = dict((f.name, f) for f in extensions) + self.is_extendable = is_extendable + self.extension_ranges = extension_ranges + self.oneofs = oneofs if oneofs is not None else [] + self.oneofs_by_name = dict((o.name, o) for o in self.oneofs) + for oneof in self.oneofs: + oneof.containing_type = self + self._deprecated_syntax = syntax or "proto2" + self._is_map_entry = is_map_entry + + @property + def syntax(self): + warnings.warn( + 'descriptor.syntax is deprecated. It will be removed' + ' soon. Most usages are checking field descriptors. Consider to use' + ' has_presence, is_packed on field descriptors.' + ) + return self._deprecated_syntax + + @property + def fields_by_camelcase_name(self): + """Same FieldDescriptor objects as in :attr:`fields`, but indexed by + :attr:`FieldDescriptor.camelcase_name`. + """ + if self._fields_by_camelcase_name is None: + self._fields_by_camelcase_name = dict( + (f.camelcase_name, f) for f in self.fields) + return self._fields_by_camelcase_name + + def EnumValueName(self, enum, value): + """Returns the string name of an enum value. + + This is just a small helper method to simplify a common operation. + + Args: + enum: string name of the Enum. + value: int, value of the enum. + + Returns: + string name of the enum value. + + Raises: + KeyError if either the Enum doesn't exist or the value is not a valid + value for the enum. + """ + return self.enum_types_by_name[enum].values_by_number[value].name + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.DescriptorProto. + + Args: + proto: An empty descriptor_pb2.DescriptorProto. + """ + # This function is overridden to give a better doc comment. + super(Descriptor, self).CopyToProto(proto) + + +# TODO: We should have aggressive checking here, +# for example: +# * If you specify a repeated field, you should not be allowed +# to specify a default value. +# * [Other examples here as needed]. +# +# TODO: for this and other *Descriptor classes, we +# might also want to lock things down aggressively (e.g., +# prevent clients from setting the attributes). Having +# stronger invariants here in general will reduce the number +# of runtime checks we must do in reflection.py... +class FieldDescriptor(DescriptorBase): + + """Descriptor for a single field in a .proto file. + + Attributes: + name (str): Name of this field, exactly as it appears in .proto. + full_name (str): Name of this field, including containing scope. This is + particularly relevant for extensions. + index (int): Dense, 0-indexed index giving the order that this + field textually appears within its message in the .proto file. + number (int): Tag number declared for this field in the .proto file. + + type (int): (One of the TYPE_* constants below) Declared type. + cpp_type (int): (One of the CPPTYPE_* constants below) C++ type used to + represent this field. + + label (int): (One of the LABEL_* constants below) Tells whether this + field is optional, required, or repeated. + has_default_value (bool): True if this field has a default value defined, + otherwise false. + default_value (Varies): Default value of this field. Only + meaningful for non-repeated scalar fields. Repeated fields + should always set this to [], and non-repeated composite + fields should always set this to None. + + containing_type (Descriptor): Descriptor of the protocol message + type that contains this field. Set by the Descriptor constructor + if we're passed into one. + Somewhat confusingly, for extension fields, this is the + descriptor of the EXTENDED message, not the descriptor + of the message containing this field. (See is_extension and + extension_scope below). + message_type (Descriptor): If a composite field, a descriptor + of the message type contained in this field. Otherwise, this is None. + enum_type (EnumDescriptor): If this field contains an enum, a + descriptor of that enum. Otherwise, this is None. + + is_extension: True iff this describes an extension field. + extension_scope (Descriptor): Only meaningful if is_extension is True. + Gives the message that immediately contains this extension field. + Will be None iff we're a top-level (file-level) extension field. + + options (descriptor_pb2.FieldOptions): Protocol message field options or + None to use default field options. + + containing_oneof (OneofDescriptor): If the field is a member of a oneof + union, contains its descriptor. Otherwise, None. + + file (FileDescriptor): Reference to file descriptor. + """ + + # Must be consistent with C++ FieldDescriptor::Type enum in + # descriptor.h. + # + # TODO: Find a way to eliminate this repetition. + TYPE_DOUBLE = 1 + TYPE_FLOAT = 2 + TYPE_INT64 = 3 + TYPE_UINT64 = 4 + TYPE_INT32 = 5 + TYPE_FIXED64 = 6 + TYPE_FIXED32 = 7 + TYPE_BOOL = 8 + TYPE_STRING = 9 + TYPE_GROUP = 10 + TYPE_MESSAGE = 11 + TYPE_BYTES = 12 + TYPE_UINT32 = 13 + TYPE_ENUM = 14 + TYPE_SFIXED32 = 15 + TYPE_SFIXED64 = 16 + TYPE_SINT32 = 17 + TYPE_SINT64 = 18 + MAX_TYPE = 18 + + # Must be consistent with C++ FieldDescriptor::CppType enum in + # descriptor.h. + # + # TODO: Find a way to eliminate this repetition. + CPPTYPE_INT32 = 1 + CPPTYPE_INT64 = 2 + CPPTYPE_UINT32 = 3 + CPPTYPE_UINT64 = 4 + CPPTYPE_DOUBLE = 5 + CPPTYPE_FLOAT = 6 + CPPTYPE_BOOL = 7 + CPPTYPE_ENUM = 8 + CPPTYPE_STRING = 9 + CPPTYPE_MESSAGE = 10 + MAX_CPPTYPE = 10 + + _PYTHON_TO_CPP_PROTO_TYPE_MAP = { + TYPE_DOUBLE: CPPTYPE_DOUBLE, + TYPE_FLOAT: CPPTYPE_FLOAT, + TYPE_ENUM: CPPTYPE_ENUM, + TYPE_INT64: CPPTYPE_INT64, + TYPE_SINT64: CPPTYPE_INT64, + TYPE_SFIXED64: CPPTYPE_INT64, + TYPE_UINT64: CPPTYPE_UINT64, + TYPE_FIXED64: CPPTYPE_UINT64, + TYPE_INT32: CPPTYPE_INT32, + TYPE_SFIXED32: CPPTYPE_INT32, + TYPE_SINT32: CPPTYPE_INT32, + TYPE_UINT32: CPPTYPE_UINT32, + TYPE_FIXED32: CPPTYPE_UINT32, + TYPE_BYTES: CPPTYPE_STRING, + TYPE_STRING: CPPTYPE_STRING, + TYPE_BOOL: CPPTYPE_BOOL, + TYPE_MESSAGE: CPPTYPE_MESSAGE, + TYPE_GROUP: CPPTYPE_MESSAGE + } + + # Must be consistent with C++ FieldDescriptor::Label enum in + # descriptor.h. + # + # TODO: Find a way to eliminate this repetition. + LABEL_OPTIONAL = 1 + LABEL_REQUIRED = 2 + LABEL_REPEATED = 3 + MAX_LABEL = 3 + + # Must be consistent with C++ constants kMaxNumber, kFirstReservedNumber, + # and kLastReservedNumber in descriptor.h + MAX_FIELD_NUMBER = (1 << 29) - 1 + FIRST_RESERVED_FIELD_NUMBER = 19000 + LAST_RESERVED_FIELD_NUMBER = 19999 + + if _USE_C_DESCRIPTORS: + _C_DESCRIPTOR_CLASS = _message.FieldDescriptor + + def __new__(cls, name, full_name, index, number, type, cpp_type, label, + default_value, message_type, enum_type, containing_type, + is_extension, extension_scope, options=None, + serialized_options=None, + has_default_value=True, containing_oneof=None, json_name=None, + file=None, create_key=None): # pylint: disable=redefined-builtin + _message.Message._CheckCalledFromGeneratedFile() + if is_extension: + return _message.default_pool.FindExtensionByName(full_name) + else: + return _message.default_pool.FindFieldByName(full_name) + + def __init__(self, name, full_name, index, number, type, cpp_type, label, + default_value, message_type, enum_type, containing_type, + is_extension, extension_scope, options=None, + serialized_options=None, + has_default_value=True, containing_oneof=None, json_name=None, + file=None, create_key=None): # pylint: disable=redefined-builtin + """The arguments are as described in the description of FieldDescriptor + attributes above. + + Note that containing_type may be None, and may be set later if necessary + (to deal with circular references between message types, for example). + Likewise for extension_scope. + """ + if create_key is not _internal_create_key: + _Deprecated('FieldDescriptor') + + super(FieldDescriptor, self).__init__( + file, options, serialized_options, 'FieldOptions' + ) + self.name = name + self.full_name = full_name + self._camelcase_name = None + if json_name is None: + self.json_name = _ToJsonName(name) + else: + self.json_name = json_name + self.index = index + self.number = number + self.type = type + self.cpp_type = cpp_type + self.label = label + self.has_default_value = has_default_value + self.default_value = default_value + self.containing_type = containing_type + self.message_type = message_type + self.enum_type = enum_type + self.is_extension = is_extension + self.extension_scope = extension_scope + self.containing_oneof = containing_oneof + if api_implementation.Type() == 'python': + self._cdescriptor = None + else: + if is_extension: + self._cdescriptor = _message.default_pool.FindExtensionByName(full_name) + else: + self._cdescriptor = _message.default_pool.FindFieldByName(full_name) + + @property + def camelcase_name(self): + """Camelcase name of this field. + + Returns: + str: the name in CamelCase. + """ + if self._camelcase_name is None: + self._camelcase_name = _ToCamelCase(self.name) + return self._camelcase_name + + @property + def has_presence(self): + """Whether the field distinguishes between unpopulated and default values. + + Raises: + RuntimeError: singular field that is not linked with message nor file. + """ + if self.label == FieldDescriptor.LABEL_REPEATED: + return False + if (self.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE or + self.containing_oneof): + return True + # self.containing_type is used here instead of self.file for legacy + # compatibility. FieldDescriptor.file was added in cl/153110619 + # Some old/generated code didn't link file to FieldDescriptor. + # TODO: remove syntax usage b/240619313 + return self.containing_type._deprecated_syntax == 'proto2' + + @property + def is_packed(self): + """Returns if the field is packed.""" + if self.label != FieldDescriptor.LABEL_REPEATED: + return False + field_type = self.type + if (field_type == FieldDescriptor.TYPE_STRING or + field_type == FieldDescriptor.TYPE_GROUP or + field_type == FieldDescriptor.TYPE_MESSAGE or + field_type == FieldDescriptor.TYPE_BYTES): + return False + if self.containing_type._deprecated_syntax == 'proto2': + return self.has_options and self.GetOptions().packed + else: + return (not self.has_options or + not self.GetOptions().HasField('packed') or + self.GetOptions().packed) + + @staticmethod + def ProtoTypeToCppProtoType(proto_type): + """Converts from a Python proto type to a C++ Proto Type. + + The Python ProtocolBuffer classes specify both the 'Python' datatype and the + 'C++' datatype - and they're not the same. This helper method should + translate from one to another. + + Args: + proto_type: the Python proto type (descriptor.FieldDescriptor.TYPE_*) + Returns: + int: descriptor.FieldDescriptor.CPPTYPE_*, the C++ type. + Raises: + TypeTransformationError: when the Python proto type isn't known. + """ + try: + return FieldDescriptor._PYTHON_TO_CPP_PROTO_TYPE_MAP[proto_type] + except KeyError: + raise TypeTransformationError('Unknown proto_type: %s' % proto_type) + + +class EnumDescriptor(_NestedDescriptorBase): + + """Descriptor for an enum defined in a .proto file. + + Attributes: + name (str): Name of the enum type. + full_name (str): Full name of the type, including package name + and any enclosing type(s). + + values (list[EnumValueDescriptor]): List of the values + in this enum. + values_by_name (dict(str, EnumValueDescriptor)): Same as :attr:`values`, + but indexed by the "name" field of each EnumValueDescriptor. + values_by_number (dict(int, EnumValueDescriptor)): Same as :attr:`values`, + but indexed by the "number" field of each EnumValueDescriptor. + containing_type (Descriptor): Descriptor of the immediate containing + type of this enum, or None if this is an enum defined at the + top level in a .proto file. Set by Descriptor's constructor + if we're passed into one. + file (FileDescriptor): Reference to file descriptor. + options (descriptor_pb2.EnumOptions): Enum options message or + None to use default enum options. + """ + + if _USE_C_DESCRIPTORS: + _C_DESCRIPTOR_CLASS = _message.EnumDescriptor + + def __new__(cls, name, full_name, filename, values, + containing_type=None, options=None, + serialized_options=None, file=None, # pylint: disable=redefined-builtin + serialized_start=None, serialized_end=None, create_key=None): + _message.Message._CheckCalledFromGeneratedFile() + return _message.default_pool.FindEnumTypeByName(full_name) + + def __init__(self, name, full_name, filename, values, + containing_type=None, options=None, + serialized_options=None, file=None, # pylint: disable=redefined-builtin + serialized_start=None, serialized_end=None, create_key=None): + """Arguments are as described in the attribute description above. + + Note that filename is an obsolete argument, that is not used anymore. + Please use file.name to access this as an attribute. + """ + if create_key is not _internal_create_key: + _Deprecated('EnumDescriptor') + + super(EnumDescriptor, self).__init__( + options, 'EnumOptions', name, full_name, file, + containing_type, serialized_start=serialized_start, + serialized_end=serialized_end, serialized_options=serialized_options) + + self.values = values + for value in self.values: + value.file = file + value.type = self + self.values_by_name = dict((v.name, v) for v in values) + # Values are reversed to ensure that the first alias is retained. + self.values_by_number = dict((v.number, v) for v in reversed(values)) + + @property + def is_closed(self): + """Returns true whether this is a "closed" enum. + + This means that it: + - Has a fixed set of values, rather than being equivalent to an int32. + - Encountering values not in this set causes them to be treated as unknown + fields. + - The first value (i.e., the default) may be nonzero. + + WARNING: Some runtimes currently have a quirk where non-closed enums are + treated as closed when used as the type of fields defined in a + `syntax = proto2;` file. This quirk is not present in all runtimes; as of + writing, we know that: + + - C++, Java, and C++-based Python share this quirk. + - UPB and UPB-based Python do not. + - PHP and Ruby treat all enums as open regardless of declaration. + + Care should be taken when using this function to respect the target + runtime's enum handling quirks. + """ + return self.file._deprecated_syntax == 'proto2' + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.EnumDescriptorProto. + + Args: + proto (descriptor_pb2.EnumDescriptorProto): An empty descriptor proto. + """ + # This function is overridden to give a better doc comment. + super(EnumDescriptor, self).CopyToProto(proto) + + +class EnumValueDescriptor(DescriptorBase): + + """Descriptor for a single value within an enum. + + Attributes: + name (str): Name of this value. + index (int): Dense, 0-indexed index giving the order that this + value appears textually within its enum in the .proto file. + number (int): Actual number assigned to this enum value. + type (EnumDescriptor): :class:`EnumDescriptor` to which this value + belongs. Set by :class:`EnumDescriptor`'s constructor if we're + passed into one. + options (descriptor_pb2.EnumValueOptions): Enum value options message or + None to use default enum value options options. + """ + + if _USE_C_DESCRIPTORS: + _C_DESCRIPTOR_CLASS = _message.EnumValueDescriptor + + def __new__(cls, name, index, number, + type=None, # pylint: disable=redefined-builtin + options=None, serialized_options=None, create_key=None): + _message.Message._CheckCalledFromGeneratedFile() + # There is no way we can build a complete EnumValueDescriptor with the + # given parameters (the name of the Enum is not known, for example). + # Fortunately generated files just pass it to the EnumDescriptor() + # constructor, which will ignore it, so returning None is good enough. + return None + + def __init__(self, name, index, number, + type=None, # pylint: disable=redefined-builtin + options=None, serialized_options=None, create_key=None): + """Arguments are as described in the attribute description above.""" + if create_key is not _internal_create_key: + _Deprecated('EnumValueDescriptor') + + super(EnumValueDescriptor, self).__init__( + type.file if type else None, + options, + serialized_options, + 'EnumValueOptions', + ) + self.name = name + self.index = index + self.number = number + self.type = type + + +class OneofDescriptor(DescriptorBase): + """Descriptor for a oneof field. + + Attributes: + name (str): Name of the oneof field. + full_name (str): Full name of the oneof field, including package name. + index (int): 0-based index giving the order of the oneof field inside + its containing type. + containing_type (Descriptor): :class:`Descriptor` of the protocol message + type that contains this field. Set by the :class:`Descriptor` constructor + if we're passed into one. + fields (list[FieldDescriptor]): The list of field descriptors this + oneof can contain. + """ + + if _USE_C_DESCRIPTORS: + _C_DESCRIPTOR_CLASS = _message.OneofDescriptor + + def __new__( + cls, name, full_name, index, containing_type, fields, options=None, + serialized_options=None, create_key=None): + _message.Message._CheckCalledFromGeneratedFile() + return _message.default_pool.FindOneofByName(full_name) + + def __init__( + self, name, full_name, index, containing_type, fields, options=None, + serialized_options=None, create_key=None): + """Arguments are as described in the attribute description above.""" + if create_key is not _internal_create_key: + _Deprecated('OneofDescriptor') + + super(OneofDescriptor, self).__init__( + containing_type.file if containing_type else None, + options, + serialized_options, + 'OneofOptions', + ) + self.name = name + self.full_name = full_name + self.index = index + self.containing_type = containing_type + self.fields = fields + + +class ServiceDescriptor(_NestedDescriptorBase): + + """Descriptor for a service. + + Attributes: + name (str): Name of the service. + full_name (str): Full name of the service, including package name. + index (int): 0-indexed index giving the order that this services + definition appears within the .proto file. + methods (list[MethodDescriptor]): List of methods provided by this + service. + methods_by_name (dict(str, MethodDescriptor)): Same + :class:`MethodDescriptor` objects as in :attr:`methods_by_name`, but + indexed by "name" attribute in each :class:`MethodDescriptor`. + options (descriptor_pb2.ServiceOptions): Service options message or + None to use default service options. + file (FileDescriptor): Reference to file info. + """ + + if _USE_C_DESCRIPTORS: + _C_DESCRIPTOR_CLASS = _message.ServiceDescriptor + + def __new__( + cls, + name=None, + full_name=None, + index=None, + methods=None, + options=None, + serialized_options=None, + file=None, # pylint: disable=redefined-builtin + serialized_start=None, + serialized_end=None, + create_key=None): + _message.Message._CheckCalledFromGeneratedFile() # pylint: disable=protected-access + return _message.default_pool.FindServiceByName(full_name) + + def __init__(self, name, full_name, index, methods, options=None, + serialized_options=None, file=None, # pylint: disable=redefined-builtin + serialized_start=None, serialized_end=None, create_key=None): + if create_key is not _internal_create_key: + _Deprecated('ServiceDescriptor') + + super(ServiceDescriptor, self).__init__( + options, 'ServiceOptions', name, full_name, file, + None, serialized_start=serialized_start, + serialized_end=serialized_end, serialized_options=serialized_options) + self.index = index + self.methods = methods + self.methods_by_name = dict((m.name, m) for m in methods) + # Set the containing service for each method in this service. + for method in self.methods: + method.file = self.file + method.containing_service = self + + def FindMethodByName(self, name): + """Searches for the specified method, and returns its descriptor. + + Args: + name (str): Name of the method. + + Returns: + MethodDescriptor: The descriptor for the requested method. + + Raises: + KeyError: if the method cannot be found in the service. + """ + return self.methods_by_name[name] + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.ServiceDescriptorProto. + + Args: + proto (descriptor_pb2.ServiceDescriptorProto): An empty descriptor proto. + """ + # This function is overridden to give a better doc comment. + super(ServiceDescriptor, self).CopyToProto(proto) + + +class MethodDescriptor(DescriptorBase): + + """Descriptor for a method in a service. + + Attributes: + name (str): Name of the method within the service. + full_name (str): Full name of method. + index (int): 0-indexed index of the method inside the service. + containing_service (ServiceDescriptor): The service that contains this + method. + input_type (Descriptor): The descriptor of the message that this method + accepts. + output_type (Descriptor): The descriptor of the message that this method + returns. + client_streaming (bool): Whether this method uses client streaming. + server_streaming (bool): Whether this method uses server streaming. + options (descriptor_pb2.MethodOptions or None): Method options message, or + None to use default method options. + """ + + if _USE_C_DESCRIPTORS: + _C_DESCRIPTOR_CLASS = _message.MethodDescriptor + + def __new__(cls, + name, + full_name, + index, + containing_service, + input_type, + output_type, + client_streaming=False, + server_streaming=False, + options=None, + serialized_options=None, + create_key=None): + _message.Message._CheckCalledFromGeneratedFile() # pylint: disable=protected-access + return _message.default_pool.FindMethodByName(full_name) + + def __init__(self, + name, + full_name, + index, + containing_service, + input_type, + output_type, + client_streaming=False, + server_streaming=False, + options=None, + serialized_options=None, + create_key=None): + """The arguments are as described in the description of MethodDescriptor + attributes above. + + Note that containing_service may be None, and may be set later if necessary. + """ + if create_key is not _internal_create_key: + _Deprecated('MethodDescriptor') + + super(MethodDescriptor, self).__init__( + containing_service.file if containing_service else None, + options, + serialized_options, + 'MethodOptions', + ) + self.name = name + self.full_name = full_name + self.index = index + self.containing_service = containing_service + self.input_type = input_type + self.output_type = output_type + self.client_streaming = client_streaming + self.server_streaming = server_streaming + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.MethodDescriptorProto. + + Args: + proto (descriptor_pb2.MethodDescriptorProto): An empty descriptor proto. + + Raises: + Error: If self couldn't be serialized, due to too few constructor + arguments. + """ + if self.containing_service is not None: + from google.protobuf import descriptor_pb2 + service_proto = descriptor_pb2.ServiceDescriptorProto() + self.containing_service.CopyToProto(service_proto) + proto.CopyFrom(service_proto.method[self.index]) + else: + raise Error('Descriptor does not contain a service.') + + +class FileDescriptor(DescriptorBase): + """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto. + + Note that :attr:`enum_types_by_name`, :attr:`extensions_by_name`, and + :attr:`dependencies` fields are only set by the + :py:mod:`google.protobuf.message_factory` module, and not by the generated + proto code. + + Attributes: + name (str): Name of file, relative to root of source tree. + package (str): Name of the package + syntax (str): string indicating syntax of the file (can be "proto2" or + "proto3") + serialized_pb (bytes): Byte string of serialized + :class:`descriptor_pb2.FileDescriptorProto`. + dependencies (list[FileDescriptor]): List of other :class:`FileDescriptor` + objects this :class:`FileDescriptor` depends on. + public_dependencies (list[FileDescriptor]): A subset of + :attr:`dependencies`, which were declared as "public". + message_types_by_name (dict(str, Descriptor)): Mapping from message names + to their :class:`Descriptor`. + enum_types_by_name (dict(str, EnumDescriptor)): Mapping from enum names to + their :class:`EnumDescriptor`. + extensions_by_name (dict(str, FieldDescriptor)): Mapping from extension + names declared at file scope to their :class:`FieldDescriptor`. + services_by_name (dict(str, ServiceDescriptor)): Mapping from services' + names to their :class:`ServiceDescriptor`. + pool (DescriptorPool): The pool this descriptor belongs to. When not + passed to the constructor, the global default pool is used. + """ + + if _USE_C_DESCRIPTORS: + _C_DESCRIPTOR_CLASS = _message.FileDescriptor + + def __new__(cls, name, package, options=None, + serialized_options=None, serialized_pb=None, + dependencies=None, public_dependencies=None, + syntax=None, pool=None, create_key=None): + # FileDescriptor() is called from various places, not only from generated + # files, to register dynamic proto files and messages. + # pylint: disable=g-explicit-bool-comparison + if serialized_pb: + return _message.default_pool.AddSerializedFile(serialized_pb) + else: + return super(FileDescriptor, cls).__new__(cls) + + def __init__(self, name, package, options=None, + serialized_options=None, serialized_pb=None, + dependencies=None, public_dependencies=None, + syntax=None, pool=None, create_key=None): + """Constructor.""" + if create_key is not _internal_create_key: + _Deprecated('FileDescriptor') + + super(FileDescriptor, self).__init__( + None, options, serialized_options, 'FileOptions' + ) + + if pool is None: + from google.protobuf import descriptor_pool + pool = descriptor_pool.Default() + self.pool = pool + self.message_types_by_name = {} + self.name = name + self.package = package + self._deprecated_syntax = syntax or "proto2" + self.serialized_pb = serialized_pb + + self.enum_types_by_name = {} + self.extensions_by_name = {} + self.services_by_name = {} + self.dependencies = (dependencies or []) + self.public_dependencies = (public_dependencies or []) + + @property + def syntax(self): + warnings.warn( + 'descriptor.syntax is deprecated. It will be removed' + ' soon. Most usages are checking field descriptors. Consider to use' + ' has_presence, is_packed on field descriptors.' + ) + return self._deprecated_syntax + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.FileDescriptorProto. + + Args: + proto: An empty descriptor_pb2.FileDescriptorProto. + """ + proto.ParseFromString(self.serialized_pb) + + +def _ParseOptions(message, string): + """Parses serialized options. + + This helper function is used to parse serialized options in generated + proto2 files. It must not be used outside proto2. + """ + message.ParseFromString(string) + return message + + +def _ToCamelCase(name): + """Converts name to camel-case and returns it.""" + capitalize_next = False + result = [] + + for c in name: + if c == '_': + if result: + capitalize_next = True + elif capitalize_next: + result.append(c.upper()) + capitalize_next = False + else: + result += c + + # Lower-case the first letter. + if result and result[0].isupper(): + result[0] = result[0].lower() + return ''.join(result) + + +def _OptionsOrNone(descriptor_proto): + """Returns the value of the field `options`, or None if it is not set.""" + if descriptor_proto.HasField('options'): + return descriptor_proto.options + else: + return None + + +def _ToJsonName(name): + """Converts name to Json name and returns it.""" + capitalize_next = False + result = [] + + for c in name: + if c == '_': + capitalize_next = True + elif capitalize_next: + result.append(c.upper()) + capitalize_next = False + else: + result += c + + return ''.join(result) + + +def MakeDescriptor(desc_proto, package='', build_file_if_cpp=True, + syntax=None): + """Make a protobuf Descriptor given a DescriptorProto protobuf. + + Handles nested descriptors. Note that this is limited to the scope of defining + a message inside of another message. Composite fields can currently only be + resolved if the message is defined in the same scope as the field. + + Args: + desc_proto: The descriptor_pb2.DescriptorProto protobuf message. + package: Optional package name for the new message Descriptor (string). + build_file_if_cpp: Update the C++ descriptor pool if api matches. + Set to False on recursion, so no duplicates are created. + syntax: The syntax/semantics that should be used. Set to "proto3" to get + proto3 field presence semantics. + Returns: + A Descriptor for protobuf messages. + """ + if api_implementation.Type() != 'python' and build_file_if_cpp: + # The C++ implementation requires all descriptors to be backed by the same + # definition in the C++ descriptor pool. To do this, we build a + # FileDescriptorProto with the same definition as this descriptor and build + # it into the pool. + from google.protobuf import descriptor_pb2 + file_descriptor_proto = descriptor_pb2.FileDescriptorProto() + file_descriptor_proto.message_type.add().MergeFrom(desc_proto) + + # Generate a random name for this proto file to prevent conflicts with any + # imported ones. We need to specify a file name so the descriptor pool + # accepts our FileDescriptorProto, but it is not important what that file + # name is actually set to. + proto_name = binascii.hexlify(os.urandom(16)).decode('ascii') + + if package: + file_descriptor_proto.name = os.path.join(package.replace('.', '/'), + proto_name + '.proto') + file_descriptor_proto.package = package + else: + file_descriptor_proto.name = proto_name + '.proto' + + _message.default_pool.Add(file_descriptor_proto) + result = _message.default_pool.FindFileByName(file_descriptor_proto.name) + + if _USE_C_DESCRIPTORS: + return result.message_types_by_name[desc_proto.name] + + full_message_name = [desc_proto.name] + if package: full_message_name.insert(0, package) + + # Create Descriptors for enum types + enum_types = {} + for enum_proto in desc_proto.enum_type: + full_name = '.'.join(full_message_name + [enum_proto.name]) + enum_desc = EnumDescriptor( + enum_proto.name, full_name, None, [ + EnumValueDescriptor(enum_val.name, ii, enum_val.number, + create_key=_internal_create_key) + for ii, enum_val in enumerate(enum_proto.value)], + create_key=_internal_create_key) + enum_types[full_name] = enum_desc + + # Create Descriptors for nested types + nested_types = {} + for nested_proto in desc_proto.nested_type: + full_name = '.'.join(full_message_name + [nested_proto.name]) + # Nested types are just those defined inside of the message, not all types + # used by fields in the message, so no loops are possible here. + nested_desc = MakeDescriptor(nested_proto, + package='.'.join(full_message_name), + build_file_if_cpp=False, + syntax=syntax) + nested_types[full_name] = nested_desc + + fields = [] + for field_proto in desc_proto.field: + full_name = '.'.join(full_message_name + [field_proto.name]) + enum_desc = None + nested_desc = None + if field_proto.json_name: + json_name = field_proto.json_name + else: + json_name = None + if field_proto.HasField('type_name'): + type_name = field_proto.type_name + full_type_name = '.'.join(full_message_name + + [type_name[type_name.rfind('.')+1:]]) + if full_type_name in nested_types: + nested_desc = nested_types[full_type_name] + elif full_type_name in enum_types: + enum_desc = enum_types[full_type_name] + # Else type_name references a non-local type, which isn't implemented + field = FieldDescriptor( + field_proto.name, full_name, field_proto.number - 1, + field_proto.number, field_proto.type, + FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type), + field_proto.label, None, nested_desc, enum_desc, None, False, None, + options=_OptionsOrNone(field_proto), has_default_value=False, + json_name=json_name, create_key=_internal_create_key) + fields.append(field) + + desc_name = '.'.join(full_message_name) + return Descriptor(desc_proto.name, desc_name, None, None, fields, + list(nested_types.values()), list(enum_types.values()), [], + options=_OptionsOrNone(desc_proto), + create_key=_internal_create_key) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_database.py b/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_database.py new file mode 100644 index 0000000..46a893e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_database.py @@ -0,0 +1,154 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Provides a container for DescriptorProtos.""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +import warnings + + +class Error(Exception): + pass + + +class DescriptorDatabaseConflictingDefinitionError(Error): + """Raised when a proto is added with the same name & different descriptor.""" + + +class DescriptorDatabase(object): + """A container accepting FileDescriptorProtos and maps DescriptorProtos.""" + + def __init__(self): + self._file_desc_protos_by_file = {} + self._file_desc_protos_by_symbol = {} + + def Add(self, file_desc_proto): + """Adds the FileDescriptorProto and its types to this database. + + Args: + file_desc_proto: The FileDescriptorProto to add. + Raises: + DescriptorDatabaseConflictingDefinitionError: if an attempt is made to + add a proto with the same name but different definition than an + existing proto in the database. + """ + proto_name = file_desc_proto.name + if proto_name not in self._file_desc_protos_by_file: + self._file_desc_protos_by_file[proto_name] = file_desc_proto + elif self._file_desc_protos_by_file[proto_name] != file_desc_proto: + raise DescriptorDatabaseConflictingDefinitionError( + '%s already added, but with different descriptor.' % proto_name) + else: + return + + # Add all the top-level descriptors to the index. + package = file_desc_proto.package + for message in file_desc_proto.message_type: + for name in _ExtractSymbols(message, package): + self._AddSymbol(name, file_desc_proto) + for enum in file_desc_proto.enum_type: + self._AddSymbol(('.'.join((package, enum.name))), file_desc_proto) + for enum_value in enum.value: + self._file_desc_protos_by_symbol[ + '.'.join((package, enum_value.name))] = file_desc_proto + for extension in file_desc_proto.extension: + self._AddSymbol(('.'.join((package, extension.name))), file_desc_proto) + for service in file_desc_proto.service: + self._AddSymbol(('.'.join((package, service.name))), file_desc_proto) + + def FindFileByName(self, name): + """Finds the file descriptor proto by file name. + + Typically the file name is a relative path ending to a .proto file. The + proto with the given name will have to have been added to this database + using the Add method or else an error will be raised. + + Args: + name: The file name to find. + + Returns: + The file descriptor proto matching the name. + + Raises: + KeyError if no file by the given name was added. + """ + + return self._file_desc_protos_by_file[name] + + def FindFileContainingSymbol(self, symbol): + """Finds the file descriptor proto containing the specified symbol. + + The symbol should be a fully qualified name including the file descriptor's + package and any containing messages. Some examples: + + 'some.package.name.Message' + 'some.package.name.Message.NestedEnum' + 'some.package.name.Message.some_field' + + The file descriptor proto containing the specified symbol must be added to + this database using the Add method or else an error will be raised. + + Args: + symbol: The fully qualified symbol name. + + Returns: + The file descriptor proto containing the symbol. + + Raises: + KeyError if no file contains the specified symbol. + """ + try: + return self._file_desc_protos_by_symbol[symbol] + except KeyError: + # Fields, enum values, and nested extensions are not in + # _file_desc_protos_by_symbol. Try to find the top level + # descriptor. Non-existent nested symbol under a valid top level + # descriptor can also be found. The behavior is the same with + # protobuf C++. + top_level, _, _ = symbol.rpartition('.') + try: + return self._file_desc_protos_by_symbol[top_level] + except KeyError: + # Raise the original symbol as a KeyError for better diagnostics. + raise KeyError(symbol) + + def FindFileContainingExtension(self, extendee_name, extension_number): + # TODO: implement this API. + return None + + def FindAllExtensionNumbers(self, extendee_name): + # TODO: implement this API. + return [] + + def _AddSymbol(self, name, file_desc_proto): + if name in self._file_desc_protos_by_symbol: + warn_msg = ('Conflict register for file "' + file_desc_proto.name + + '": ' + name + + ' is already defined in file "' + + self._file_desc_protos_by_symbol[name].name + '"') + warnings.warn(warn_msg, RuntimeWarning) + self._file_desc_protos_by_symbol[name] = file_desc_proto + + +def _ExtractSymbols(desc_proto, package): + """Pulls out all the symbols from a descriptor proto. + + Args: + desc_proto: The proto to extract symbols from. + package: The package containing the descriptor type. + + Yields: + The fully qualified name found in the descriptor. + """ + message_name = package + '.' + desc_proto.name if package else desc_proto.name + yield message_name + for nested_type in desc_proto.nested_type: + for symbol in _ExtractSymbols(nested_type, message_name): + yield symbol + for enum_type in desc_proto.enum_type: + yield '.'.join((message_name, enum_type.name)) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_pb2.py new file mode 100644 index 0000000..546b827 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_pb2.py @@ -0,0 +1,2790 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/descriptor.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR = _descriptor.FileDescriptor( + name='google/protobuf/descriptor.proto', + package='google.protobuf', + syntax='proto2', + serialized_options=b'\n\023com.google.protobufB\020DescriptorProtosH\001Z-google.golang.org/protobuf/types/descriptorpb\370\001\001\242\002\003GPB\252\002\032Google.Protobuf.Reflection', + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"M\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile\"\x98\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xb9\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xc7\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12h\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDR\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xe3\x02\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xa7\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07options\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xca\t\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\x35\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseR\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12\x37\n\x14php_generic_services\x18* \x01(\x08:\x05\x66\x61lseR\x12phpGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08&\x10\'\"\xf4\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xad\n\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x19\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseR\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xac\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd1\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\x81\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd5\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\xfc\t\n\nFeatureSet\x12\x8b\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB9\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe6\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07R\rfieldPresence\x12\x66\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB#\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\xe6\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07R\x08\x65numType\x12\x92\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB\'\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\xe6\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07R\x15repeatedFieldEncoding\x12x\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB#\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\xe6\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07R\x0eutf8Validation\x12x\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB \x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\xe6\x07R\x0fmessageEncoding\x12|\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB3\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\xe6\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07R\njsonFormat\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"C\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\x08\n\x04NONE\x10\x01\x12\n\n\x06VERIFY\x10\x02\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02*\x06\x08\xe8\x07\x10\xe9\x07*\x06\x08\xe9\x07\x10\xea\x07*\x06\x08\x8bN\x10\x90NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xfe\x02\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\x87\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\"\xa7\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xea\x01\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection' + ) +else: + DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"M\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile\"\x98\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xb9\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xc7\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12h\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDR\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xe3\x02\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xa7\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07options\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xca\t\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\x35\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseR\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12\x37\n\x14php_generic_services\x18* \x01(\x08:\x05\x66\x61lseR\x12phpGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08&\x10\'\"\xf4\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xad\n\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x19\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseR\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xac\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd1\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\x81\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd5\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\xfc\t\n\nFeatureSet\x12\x8b\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB9\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe6\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07R\rfieldPresence\x12\x66\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB#\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\xe6\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07R\x08\x65numType\x12\x92\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB\'\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\xe6\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07R\x15repeatedFieldEncoding\x12x\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB#\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\xe6\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07R\x0eutf8Validation\x12x\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB \x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\xe6\x07R\x0fmessageEncoding\x12|\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB3\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\xe6\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07R\njsonFormat\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"C\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\x08\n\x04NONE\x10\x01\x12\n\n\x06VERIFY\x10\x02\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02*\x06\x08\xe8\x07\x10\xe9\x07*\x06\x08\xe9\x07\x10\xea\x07*\x06\x08\x8bN\x10\x90NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xfe\x02\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\x87\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\"\xa7\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xea\x01\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection') + +_globals = globals() +if _descriptor._USE_C_DESCRIPTORS == False: + _EDITION = _descriptor.EnumDescriptor( + name='Edition', + full_name='google.protobuf.Edition', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='EDITION_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EDITION_PROTO2', index=1, number=998, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EDITION_PROTO3', index=2, number=999, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EDITION_2023', index=3, number=1000, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EDITION_1_TEST_ONLY', index=4, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EDITION_2_TEST_ONLY', index=5, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EDITION_99997_TEST_ONLY', index=6, number=99997, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EDITION_99998_TEST_ONLY', index=7, number=99998, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EDITION_99999_TEST_ONLY', index=8, number=99999, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_EDITION) + + _EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE = _descriptor.EnumDescriptor( + name='VerificationState', + full_name='google.protobuf.ExtensionRangeOptions.VerificationState', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='DECLARATION', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='UNVERIFIED', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE) + + _FIELDDESCRIPTORPROTO_TYPE = _descriptor.EnumDescriptor( + name='Type', + full_name='google.protobuf.FieldDescriptorProto.Type', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='TYPE_DOUBLE', index=0, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_FLOAT', index=1, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_INT64', index=2, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_UINT64', index=3, number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_INT32', index=4, number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_FIXED64', index=5, number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_FIXED32', index=6, number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_BOOL', index=7, number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_STRING', index=8, number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_GROUP', index=9, number=10, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_MESSAGE', index=10, number=11, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_BYTES', index=11, number=12, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_UINT32', index=12, number=13, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_ENUM', index=13, number=14, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_SFIXED32', index=14, number=15, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_SFIXED64', index=15, number=16, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_SINT32', index=16, number=17, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TYPE_SINT64', index=17, number=18, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FIELDDESCRIPTORPROTO_TYPE) + + _FIELDDESCRIPTORPROTO_LABEL = _descriptor.EnumDescriptor( + name='Label', + full_name='google.protobuf.FieldDescriptorProto.Label', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='LABEL_OPTIONAL', index=0, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='LABEL_REPEATED', index=1, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='LABEL_REQUIRED', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FIELDDESCRIPTORPROTO_LABEL) + + _FILEOPTIONS_OPTIMIZEMODE = _descriptor.EnumDescriptor( + name='OptimizeMode', + full_name='google.protobuf.FileOptions.OptimizeMode', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='SPEED', index=0, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CODE_SIZE', index=1, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='LITE_RUNTIME', index=2, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FILEOPTIONS_OPTIMIZEMODE) + + _FIELDOPTIONS_CTYPE = _descriptor.EnumDescriptor( + name='CType', + full_name='google.protobuf.FieldOptions.CType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='STRING', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CORD', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='STRING_PIECE', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_CTYPE) + + _FIELDOPTIONS_JSTYPE = _descriptor.EnumDescriptor( + name='JSType', + full_name='google.protobuf.FieldOptions.JSType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='JS_NORMAL', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='JS_STRING', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='JS_NUMBER', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_JSTYPE) + + _FIELDOPTIONS_OPTIONRETENTION = _descriptor.EnumDescriptor( + name='OptionRetention', + full_name='google.protobuf.FieldOptions.OptionRetention', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='RETENTION_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='RETENTION_RUNTIME', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='RETENTION_SOURCE', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_OPTIONRETENTION) + + _FIELDOPTIONS_OPTIONTARGETTYPE = _descriptor.EnumDescriptor( + name='OptionTargetType', + full_name='google.protobuf.FieldOptions.OptionTargetType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_FILE', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_EXTENSION_RANGE', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_MESSAGE', index=3, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_FIELD', index=4, number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_ONEOF', index=5, number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_ENUM', index=6, number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_ENUM_ENTRY', index=7, number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_SERVICE', index=8, number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TARGET_TYPE_METHOD', index=9, number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_OPTIONTARGETTYPE) + + _METHODOPTIONS_IDEMPOTENCYLEVEL = _descriptor.EnumDescriptor( + name='IdempotencyLevel', + full_name='google.protobuf.MethodOptions.IdempotencyLevel', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='IDEMPOTENCY_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='NO_SIDE_EFFECTS', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='IDEMPOTENT', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_IDEMPOTENCYLEVEL) + + _FEATURESET_FIELDPRESENCE = _descriptor.EnumDescriptor( + name='FieldPresence', + full_name='google.protobuf.FeatureSet.FieldPresence', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='FIELD_PRESENCE_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EXPLICIT', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='IMPLICIT', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='LEGACY_REQUIRED', index=3, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FEATURESET_FIELDPRESENCE) + + _FEATURESET_ENUMTYPE = _descriptor.EnumDescriptor( + name='EnumType', + full_name='google.protobuf.FeatureSet.EnumType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='ENUM_TYPE_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OPEN', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CLOSED', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FEATURESET_ENUMTYPE) + + _FEATURESET_REPEATEDFIELDENCODING = _descriptor.EnumDescriptor( + name='RepeatedFieldEncoding', + full_name='google.protobuf.FeatureSet.RepeatedFieldEncoding', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='REPEATED_FIELD_ENCODING_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PACKED', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EXPANDED', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FEATURESET_REPEATEDFIELDENCODING) + + _FEATURESET_UTF8VALIDATION = _descriptor.EnumDescriptor( + name='Utf8Validation', + full_name='google.protobuf.FeatureSet.Utf8Validation', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='UTF8_VALIDATION_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='NONE', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='VERIFY', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FEATURESET_UTF8VALIDATION) + + _FEATURESET_MESSAGEENCODING = _descriptor.EnumDescriptor( + name='MessageEncoding', + full_name='google.protobuf.FeatureSet.MessageEncoding', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='MESSAGE_ENCODING_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='LENGTH_PREFIXED', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DELIMITED', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FEATURESET_MESSAGEENCODING) + + _FEATURESET_JSONFORMAT = _descriptor.EnumDescriptor( + name='JsonFormat', + full_name='google.protobuf.FeatureSet.JsonFormat', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='JSON_FORMAT_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='ALLOW', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='LEGACY_BEST_EFFORT', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_FEATURESET_JSONFORMAT) + + _GENERATEDCODEINFO_ANNOTATION_SEMANTIC = _descriptor.EnumDescriptor( + name='Semantic', + full_name='google.protobuf.GeneratedCodeInfo.Annotation.Semantic', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='NONE', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SET', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='ALIAS', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + ) + _sym_db.RegisterEnumDescriptor(_GENERATEDCODEINFO_ANNOTATION_SEMANTIC) + + + _FILEDESCRIPTORSET = _descriptor.Descriptor( + name='FileDescriptorSet', + full_name='google.protobuf.FileDescriptorSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='file', full_name='google.protobuf.FileDescriptorSet.file', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='file', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _FILEDESCRIPTORPROTO = _descriptor.Descriptor( + name='FileDescriptorProto', + full_name='google.protobuf.FileDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.FileDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='package', full_name='google.protobuf.FileDescriptorProto.package', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='package', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='dependency', full_name='google.protobuf.FileDescriptorProto.dependency', index=2, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='dependency', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_dependency', full_name='google.protobuf.FileDescriptorProto.public_dependency', index=3, + number=10, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='publicDependency', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='weak_dependency', full_name='google.protobuf.FileDescriptorProto.weak_dependency', index=4, + number=11, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='weakDependency', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='message_type', full_name='google.protobuf.FileDescriptorProto.message_type', index=5, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='messageType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='enum_type', full_name='google.protobuf.FileDescriptorProto.enum_type', index=6, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='enumType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='service', full_name='google.protobuf.FileDescriptorProto.service', index=7, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='service', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='extension', full_name='google.protobuf.FileDescriptorProto.extension', index=8, + number=7, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='extension', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.FileDescriptorProto.options', index=9, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='source_code_info', full_name='google.protobuf.FileDescriptorProto.source_code_info', index=10, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='sourceCodeInfo', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='syntax', full_name='google.protobuf.FileDescriptorProto.syntax', index=11, + number=12, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='syntax', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='edition', full_name='google.protobuf.FileDescriptorProto.edition', index=12, + number=14, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='edition', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _DESCRIPTORPROTO_EXTENSIONRANGE = _descriptor.Descriptor( + name='ExtensionRange', + full_name='google.protobuf.DescriptorProto.ExtensionRange', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='start', full_name='google.protobuf.DescriptorProto.ExtensionRange.start', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='start', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='end', full_name='google.protobuf.DescriptorProto.ExtensionRange.end', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='end', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.DescriptorProto.ExtensionRange.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _DESCRIPTORPROTO_RESERVEDRANGE = _descriptor.Descriptor( + name='ReservedRange', + full_name='google.protobuf.DescriptorProto.ReservedRange', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='start', full_name='google.protobuf.DescriptorProto.ReservedRange.start', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='start', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='end', full_name='google.protobuf.DescriptorProto.ReservedRange.end', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='end', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _DESCRIPTORPROTO = _descriptor.Descriptor( + name='DescriptorProto', + full_name='google.protobuf.DescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.DescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='field', full_name='google.protobuf.DescriptorProto.field', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='field', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='extension', full_name='google.protobuf.DescriptorProto.extension', index=2, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='extension', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='nested_type', full_name='google.protobuf.DescriptorProto.nested_type', index=3, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='nestedType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='enum_type', full_name='google.protobuf.DescriptorProto.enum_type', index=4, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='enumType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='extension_range', full_name='google.protobuf.DescriptorProto.extension_range', index=5, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='extensionRange', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='oneof_decl', full_name='google.protobuf.DescriptorProto.oneof_decl', index=6, + number=8, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='oneofDecl', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.DescriptorProto.options', index=7, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='reserved_range', full_name='google.protobuf.DescriptorProto.reserved_range', index=8, + number=9, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='reservedRange', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='reserved_name', full_name='google.protobuf.DescriptorProto.reserved_name', index=9, + number=10, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='reservedName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_DESCRIPTORPROTO_EXTENSIONRANGE, _DESCRIPTORPROTO_RESERVEDRANGE, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _EXTENSIONRANGEOPTIONS_DECLARATION = _descriptor.Descriptor( + name='Declaration', + full_name='google.protobuf.ExtensionRangeOptions.Declaration', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='number', full_name='google.protobuf.ExtensionRangeOptions.Declaration.number', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='number', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='full_name', full_name='google.protobuf.ExtensionRangeOptions.Declaration.full_name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='fullName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type', full_name='google.protobuf.ExtensionRangeOptions.Declaration.type', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='type', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='reserved', full_name='google.protobuf.ExtensionRangeOptions.Declaration.reserved', index=3, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='reserved', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='repeated', full_name='google.protobuf.ExtensionRangeOptions.Declaration.repeated', index=4, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='repeated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _EXTENSIONRANGEOPTIONS = _descriptor.Descriptor( + name='ExtensionRangeOptions', + full_name='google.protobuf.ExtensionRangeOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.ExtensionRangeOptions.uninterpreted_option', index=0, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='declaration', full_name='google.protobuf.ExtensionRangeOptions.declaration', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\210\001\002', json_name='declaration', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.ExtensionRangeOptions.features', index=2, + number=50, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='verification', full_name='google.protobuf.ExtensionRangeOptions.verification', index=3, + number=3, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='verification', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_EXTENSIONRANGEOPTIONS_DECLARATION, ], + enum_types=[ + _EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE, + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _FIELDDESCRIPTORPROTO = _descriptor.Descriptor( + name='FieldDescriptorProto', + full_name='google.protobuf.FieldDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.FieldDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='number', full_name='google.protobuf.FieldDescriptorProto.number', index=1, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='number', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='label', full_name='google.protobuf.FieldDescriptorProto.label', index=2, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='label', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type', full_name='google.protobuf.FieldDescriptorProto.type', index=3, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='type', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type_name', full_name='google.protobuf.FieldDescriptorProto.type_name', index=4, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='typeName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='extendee', full_name='google.protobuf.FieldDescriptorProto.extendee', index=5, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='extendee', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='default_value', full_name='google.protobuf.FieldDescriptorProto.default_value', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='defaultValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='oneof_index', full_name='google.protobuf.FieldDescriptorProto.oneof_index', index=7, + number=9, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='oneofIndex', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='json_name', full_name='google.protobuf.FieldDescriptorProto.json_name', index=8, + number=10, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='jsonName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.FieldDescriptorProto.options', index=9, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proto3_optional', full_name='google.protobuf.FieldDescriptorProto.proto3_optional', index=10, + number=17, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='proto3Optional', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FIELDDESCRIPTORPROTO_TYPE, + _FIELDDESCRIPTORPROTO_LABEL, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _ONEOFDESCRIPTORPROTO = _descriptor.Descriptor( + name='OneofDescriptorProto', + full_name='google.protobuf.OneofDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.OneofDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.OneofDescriptorProto.options', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE = _descriptor.Descriptor( + name='EnumReservedRange', + full_name='google.protobuf.EnumDescriptorProto.EnumReservedRange', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='start', full_name='google.protobuf.EnumDescriptorProto.EnumReservedRange.start', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='start', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='end', full_name='google.protobuf.EnumDescriptorProto.EnumReservedRange.end', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='end', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _ENUMDESCRIPTORPROTO = _descriptor.Descriptor( + name='EnumDescriptorProto', + full_name='google.protobuf.EnumDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.EnumDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', full_name='google.protobuf.EnumDescriptorProto.value', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='value', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.EnumDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='reserved_range', full_name='google.protobuf.EnumDescriptorProto.reserved_range', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='reservedRange', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='reserved_name', full_name='google.protobuf.EnumDescriptorProto.reserved_name', index=4, + number=5, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='reservedName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _ENUMVALUEDESCRIPTORPROTO = _descriptor.Descriptor( + name='EnumValueDescriptorProto', + full_name='google.protobuf.EnumValueDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.EnumValueDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='number', full_name='google.protobuf.EnumValueDescriptorProto.number', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='number', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.EnumValueDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _SERVICEDESCRIPTORPROTO = _descriptor.Descriptor( + name='ServiceDescriptorProto', + full_name='google.protobuf.ServiceDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.ServiceDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='method', full_name='google.protobuf.ServiceDescriptorProto.method', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='method', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.ServiceDescriptorProto.options', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _METHODDESCRIPTORPROTO = _descriptor.Descriptor( + name='MethodDescriptorProto', + full_name='google.protobuf.MethodDescriptorProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.MethodDescriptorProto.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='input_type', full_name='google.protobuf.MethodDescriptorProto.input_type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='inputType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='output_type', full_name='google.protobuf.MethodDescriptorProto.output_type', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='outputType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', full_name='google.protobuf.MethodDescriptorProto.options', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='client_streaming', full_name='google.protobuf.MethodDescriptorProto.client_streaming', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='clientStreaming', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='server_streaming', full_name='google.protobuf.MethodDescriptorProto.server_streaming', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='serverStreaming', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _FILEOPTIONS = _descriptor.Descriptor( + name='FileOptions', + full_name='google.protobuf.FileOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='java_package', full_name='google.protobuf.FileOptions.java_package', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='javaPackage', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='java_outer_classname', full_name='google.protobuf.FileOptions.java_outer_classname', index=1, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='javaOuterClassname', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='java_multiple_files', full_name='google.protobuf.FileOptions.java_multiple_files', index=2, + number=10, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='javaMultipleFiles', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='java_generate_equals_and_hash', full_name='google.protobuf.FileOptions.java_generate_equals_and_hash', index=3, + number=20, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\030\001', json_name='javaGenerateEqualsAndHash', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='java_string_check_utf8', full_name='google.protobuf.FileOptions.java_string_check_utf8', index=4, + number=27, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='javaStringCheckUtf8', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='optimize_for', full_name='google.protobuf.FileOptions.optimize_for', index=5, + number=9, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='optimizeFor', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='go_package', full_name='google.protobuf.FileOptions.go_package', index=6, + number=11, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='goPackage', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cc_generic_services', full_name='google.protobuf.FileOptions.cc_generic_services', index=7, + number=16, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='ccGenericServices', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='java_generic_services', full_name='google.protobuf.FileOptions.java_generic_services', index=8, + number=17, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='javaGenericServices', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='py_generic_services', full_name='google.protobuf.FileOptions.py_generic_services', index=9, + number=18, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='pyGenericServices', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='php_generic_services', full_name='google.protobuf.FileOptions.php_generic_services', index=10, + number=42, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='phpGenericServices', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.FileOptions.deprecated', index=11, + number=23, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cc_enable_arenas', full_name='google.protobuf.FileOptions.cc_enable_arenas', index=12, + number=31, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='ccEnableArenas', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='objc_class_prefix', full_name='google.protobuf.FileOptions.objc_class_prefix', index=13, + number=36, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='objcClassPrefix', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='csharp_namespace', full_name='google.protobuf.FileOptions.csharp_namespace', index=14, + number=37, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='csharpNamespace', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='swift_prefix', full_name='google.protobuf.FileOptions.swift_prefix', index=15, + number=39, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='swiftPrefix', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='php_class_prefix', full_name='google.protobuf.FileOptions.php_class_prefix', index=16, + number=40, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='phpClassPrefix', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='php_namespace', full_name='google.protobuf.FileOptions.php_namespace', index=17, + number=41, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='phpNamespace', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='php_metadata_namespace', full_name='google.protobuf.FileOptions.php_metadata_namespace', index=18, + number=44, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='phpMetadataNamespace', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='ruby_package', full_name='google.protobuf.FileOptions.ruby_package', index=19, + number=45, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='rubyPackage', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.FileOptions.features', index=20, + number=50, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.FileOptions.uninterpreted_option', index=21, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FILEOPTIONS_OPTIMIZEMODE, + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _MESSAGEOPTIONS = _descriptor.Descriptor( + name='MessageOptions', + full_name='google.protobuf.MessageOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='message_set_wire_format', full_name='google.protobuf.MessageOptions.message_set_wire_format', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='messageSetWireFormat', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='no_standard_descriptor_accessor', full_name='google.protobuf.MessageOptions.no_standard_descriptor_accessor', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='noStandardDescriptorAccessor', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.MessageOptions.deprecated', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='map_entry', full_name='google.protobuf.MessageOptions.map_entry', index=3, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='mapEntry', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated_legacy_json_field_conflicts', full_name='google.protobuf.MessageOptions.deprecated_legacy_json_field_conflicts', index=4, + number=11, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\030\001', json_name='deprecatedLegacyJsonFieldConflicts', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.MessageOptions.features', index=5, + number=12, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.MessageOptions.uninterpreted_option', index=6, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _FIELDOPTIONS_EDITIONDEFAULT = _descriptor.Descriptor( + name='EditionDefault', + full_name='google.protobuf.FieldOptions.EditionDefault', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='edition', full_name='google.protobuf.FieldOptions.EditionDefault.edition', index=0, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='edition', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', full_name='google.protobuf.FieldOptions.EditionDefault.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='value', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _FIELDOPTIONS = _descriptor.Descriptor( + name='FieldOptions', + full_name='google.protobuf.FieldOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='ctype', full_name='google.protobuf.FieldOptions.ctype', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='ctype', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='packed', full_name='google.protobuf.FieldOptions.packed', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='packed', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='jstype', full_name='google.protobuf.FieldOptions.jstype', index=2, + number=6, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='jstype', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='lazy', full_name='google.protobuf.FieldOptions.lazy', index=3, + number=5, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='lazy', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='unverified_lazy', full_name='google.protobuf.FieldOptions.unverified_lazy', index=4, + number=15, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='unverifiedLazy', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.FieldOptions.deprecated', index=5, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='weak', full_name='google.protobuf.FieldOptions.weak', index=6, + number=10, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='weak', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='debug_redact', full_name='google.protobuf.FieldOptions.debug_redact', index=7, + number=16, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='debugRedact', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='retention', full_name='google.protobuf.FieldOptions.retention', index=8, + number=17, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='retention', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='targets', full_name='google.protobuf.FieldOptions.targets', index=9, + number=19, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='targets', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='edition_defaults', full_name='google.protobuf.FieldOptions.edition_defaults', index=10, + number=20, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='editionDefaults', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.FieldOptions.features', index=11, + number=21, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.FieldOptions.uninterpreted_option', index=12, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_FIELDOPTIONS_EDITIONDEFAULT, ], + enum_types=[ + _FIELDOPTIONS_CTYPE, + _FIELDOPTIONS_JSTYPE, + _FIELDOPTIONS_OPTIONRETENTION, + _FIELDOPTIONS_OPTIONTARGETTYPE, + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _ONEOFOPTIONS = _descriptor.Descriptor( + name='OneofOptions', + full_name='google.protobuf.OneofOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.OneofOptions.features', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.OneofOptions.uninterpreted_option', index=1, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _ENUMOPTIONS = _descriptor.Descriptor( + name='EnumOptions', + full_name='google.protobuf.EnumOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='allow_alias', full_name='google.protobuf.EnumOptions.allow_alias', index=0, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='allowAlias', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.EnumOptions.deprecated', index=1, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated_legacy_json_field_conflicts', full_name='google.protobuf.EnumOptions.deprecated_legacy_json_field_conflicts', index=2, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\030\001', json_name='deprecatedLegacyJsonFieldConflicts', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.EnumOptions.features', index=3, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.EnumOptions.uninterpreted_option', index=4, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _ENUMVALUEOPTIONS = _descriptor.Descriptor( + name='EnumValueOptions', + full_name='google.protobuf.EnumValueOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.EnumValueOptions.deprecated', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.EnumValueOptions.features', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='debug_redact', full_name='google.protobuf.EnumValueOptions.debug_redact', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='debugRedact', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.EnumValueOptions.uninterpreted_option', index=3, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _SERVICEOPTIONS = _descriptor.Descriptor( + name='ServiceOptions', + full_name='google.protobuf.ServiceOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.ServiceOptions.features', index=0, + number=34, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.ServiceOptions.deprecated', index=1, + number=33, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.ServiceOptions.uninterpreted_option', index=2, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _METHODOPTIONS = _descriptor.Descriptor( + name='MethodOptions', + full_name='google.protobuf.MethodOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='deprecated', full_name='google.protobuf.MethodOptions.deprecated', index=0, + number=33, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='idempotency_level', full_name='google.protobuf.MethodOptions.idempotency_level', index=1, + number=34, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='idempotencyLevel', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.MethodOptions.features', index=2, + number=35, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='google.protobuf.MethodOptions.uninterpreted_option', index=3, + number=999, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _METHODOPTIONS_IDEMPOTENCYLEVEL, + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 536870912), ], + oneofs=[ + ], + ) + + + _UNINTERPRETEDOPTION_NAMEPART = _descriptor.Descriptor( + name='NamePart', + full_name='google.protobuf.UninterpretedOption.NamePart', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name_part', full_name='google.protobuf.UninterpretedOption.NamePart.name_part', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='namePart', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_extension', full_name='google.protobuf.UninterpretedOption.NamePart.is_extension', index=1, + number=2, type=8, cpp_type=7, label=2, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='isExtension', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _UNINTERPRETEDOPTION = _descriptor.Descriptor( + name='UninterpretedOption', + full_name='google.protobuf.UninterpretedOption', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.protobuf.UninterpretedOption.name', index=0, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='identifier_value', full_name='google.protobuf.UninterpretedOption.identifier_value', index=1, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='identifierValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='positive_int_value', full_name='google.protobuf.UninterpretedOption.positive_int_value', index=2, + number=4, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='positiveIntValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='negative_int_value', full_name='google.protobuf.UninterpretedOption.negative_int_value', index=3, + number=5, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='negativeIntValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='double_value', full_name='google.protobuf.UninterpretedOption.double_value', index=4, + number=6, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='doubleValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='string_value', full_name='google.protobuf.UninterpretedOption.string_value', index=5, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='stringValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='aggregate_value', full_name='google.protobuf.UninterpretedOption.aggregate_value', index=6, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='aggregateValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_UNINTERPRETEDOPTION_NAMEPART, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _FEATURESET = _descriptor.Descriptor( + name='FeatureSet', + full_name='google.protobuf.FeatureSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='field_presence', full_name='google.protobuf.FeatureSet.field_presence', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\210\001\001\230\001\004\230\001\001\242\001\r\022\010EXPLICIT\030\346\007\242\001\r\022\010IMPLICIT\030\347\007\242\001\r\022\010EXPLICIT\030\350\007', json_name='fieldPresence', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='enum_type', full_name='google.protobuf.FeatureSet.enum_type', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\210\001\001\230\001\006\230\001\001\242\001\013\022\006CLOSED\030\346\007\242\001\t\022\004OPEN\030\347\007', json_name='enumType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='repeated_field_encoding', full_name='google.protobuf.FeatureSet.repeated_field_encoding', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\210\001\001\230\001\004\230\001\001\242\001\r\022\010EXPANDED\030\346\007\242\001\013\022\006PACKED\030\347\007', json_name='repeatedFieldEncoding', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='utf8_validation', full_name='google.protobuf.FeatureSet.utf8_validation', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\210\001\001\230\001\004\230\001\001\242\001\t\022\004NONE\030\346\007\242\001\013\022\006VERIFY\030\347\007', json_name='utf8Validation', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='message_encoding', full_name='google.protobuf.FeatureSet.message_encoding', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\210\001\001\230\001\004\230\001\001\242\001\024\022\017LENGTH_PREFIXED\030\346\007', json_name='messageEncoding', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='json_format', full_name='google.protobuf.FeatureSet.json_format', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\210\001\001\230\001\003\230\001\006\230\001\001\242\001\027\022\022LEGACY_BEST_EFFORT\030\346\007\242\001\n\022\005ALLOW\030\347\007', json_name='jsonFormat', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FEATURESET_FIELDPRESENCE, + _FEATURESET_ENUMTYPE, + _FEATURESET_REPEATEDFIELDENCODING, + _FEATURESET_UTF8VALIDATION, + _FEATURESET_MESSAGEENCODING, + _FEATURESET_JSONFORMAT, + ], + serialized_options=None, + is_extendable=True, + syntax='proto2', + extension_ranges=[(1000, 1001), (1001, 1002), (9995, 10000), ], + oneofs=[ + ], + ) + + + _FEATURESETDEFAULTS_FEATURESETEDITIONDEFAULT = _descriptor.Descriptor( + name='FeatureSetEditionDefault', + full_name='google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='edition', full_name='google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.edition', index=0, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='edition', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='features', full_name='google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.features', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='features', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _FEATURESETDEFAULTS = _descriptor.Descriptor( + name='FeatureSetDefaults', + full_name='google.protobuf.FeatureSetDefaults', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='defaults', full_name='google.protobuf.FeatureSetDefaults.defaults', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='defaults', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='minimum_edition', full_name='google.protobuf.FeatureSetDefaults.minimum_edition', index=1, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='minimumEdition', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='maximum_edition', full_name='google.protobuf.FeatureSetDefaults.maximum_edition', index=2, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='maximumEdition', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_FEATURESETDEFAULTS_FEATURESETEDITIONDEFAULT, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _SOURCECODEINFO_LOCATION = _descriptor.Descriptor( + name='Location', + full_name='google.protobuf.SourceCodeInfo.Location', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='google.protobuf.SourceCodeInfo.Location.path', index=0, + number=1, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\020\001', json_name='path', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='span', full_name='google.protobuf.SourceCodeInfo.Location.span', index=1, + number=2, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\020\001', json_name='span', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='leading_comments', full_name='google.protobuf.SourceCodeInfo.Location.leading_comments', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='leadingComments', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='trailing_comments', full_name='google.protobuf.SourceCodeInfo.Location.trailing_comments', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='trailingComments', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='leading_detached_comments', full_name='google.protobuf.SourceCodeInfo.Location.leading_detached_comments', index=4, + number=6, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='leadingDetachedComments', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _SOURCECODEINFO = _descriptor.Descriptor( + name='SourceCodeInfo', + full_name='google.protobuf.SourceCodeInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='location', full_name='google.protobuf.SourceCodeInfo.location', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='location', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_SOURCECODEINFO_LOCATION, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + + _GENERATEDCODEINFO_ANNOTATION = _descriptor.Descriptor( + name='Annotation', + full_name='google.protobuf.GeneratedCodeInfo.Annotation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='google.protobuf.GeneratedCodeInfo.Annotation.path', index=0, + number=1, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\020\001', json_name='path', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='source_file', full_name='google.protobuf.GeneratedCodeInfo.Annotation.source_file', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='sourceFile', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='begin', full_name='google.protobuf.GeneratedCodeInfo.Annotation.begin', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='begin', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='end', full_name='google.protobuf.GeneratedCodeInfo.Annotation.end', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='end', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='semantic', full_name='google.protobuf.GeneratedCodeInfo.Annotation.semantic', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='semantic', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _GENERATEDCODEINFO_ANNOTATION_SEMANTIC, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _GENERATEDCODEINFO = _descriptor.Descriptor( + name='GeneratedCodeInfo', + full_name='google.protobuf.GeneratedCodeInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='annotation', full_name='google.protobuf.GeneratedCodeInfo.annotation', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, json_name='annotation', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GENERATEDCODEINFO_ANNOTATION, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + ) + + _FILEDESCRIPTORSET.fields_by_name['file'].message_type = _FILEDESCRIPTORPROTO + _FILEDESCRIPTORPROTO.fields_by_name['message_type'].message_type = _DESCRIPTORPROTO + _FILEDESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO + _FILEDESCRIPTORPROTO.fields_by_name['service'].message_type = _SERVICEDESCRIPTORPROTO + _FILEDESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO + _FILEDESCRIPTORPROTO.fields_by_name['options'].message_type = _FILEOPTIONS + _FILEDESCRIPTORPROTO.fields_by_name['source_code_info'].message_type = _SOURCECODEINFO + _FILEDESCRIPTORPROTO.fields_by_name['edition'].enum_type = _EDITION + _DESCRIPTORPROTO_EXTENSIONRANGE.fields_by_name['options'].message_type = _EXTENSIONRANGEOPTIONS + _DESCRIPTORPROTO_EXTENSIONRANGE.containing_type = _DESCRIPTORPROTO + _DESCRIPTORPROTO_RESERVEDRANGE.containing_type = _DESCRIPTORPROTO + _DESCRIPTORPROTO.fields_by_name['field'].message_type = _FIELDDESCRIPTORPROTO + _DESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO + _DESCRIPTORPROTO.fields_by_name['nested_type'].message_type = _DESCRIPTORPROTO + _DESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO + _DESCRIPTORPROTO.fields_by_name['extension_range'].message_type = _DESCRIPTORPROTO_EXTENSIONRANGE + _DESCRIPTORPROTO.fields_by_name['oneof_decl'].message_type = _ONEOFDESCRIPTORPROTO + _DESCRIPTORPROTO.fields_by_name['options'].message_type = _MESSAGEOPTIONS + _DESCRIPTORPROTO.fields_by_name['reserved_range'].message_type = _DESCRIPTORPROTO_RESERVEDRANGE + _EXTENSIONRANGEOPTIONS_DECLARATION.containing_type = _EXTENSIONRANGEOPTIONS + _EXTENSIONRANGEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _EXTENSIONRANGEOPTIONS.fields_by_name['declaration'].message_type = _EXTENSIONRANGEOPTIONS_DECLARATION + _EXTENSIONRANGEOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _EXTENSIONRANGEOPTIONS.fields_by_name['verification'].enum_type = _EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE + _EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE.containing_type = _EXTENSIONRANGEOPTIONS + _FIELDDESCRIPTORPROTO.fields_by_name['label'].enum_type = _FIELDDESCRIPTORPROTO_LABEL + _FIELDDESCRIPTORPROTO.fields_by_name['type'].enum_type = _FIELDDESCRIPTORPROTO_TYPE + _FIELDDESCRIPTORPROTO.fields_by_name['options'].message_type = _FIELDOPTIONS + _FIELDDESCRIPTORPROTO_TYPE.containing_type = _FIELDDESCRIPTORPROTO + _FIELDDESCRIPTORPROTO_LABEL.containing_type = _FIELDDESCRIPTORPROTO + _ONEOFDESCRIPTORPROTO.fields_by_name['options'].message_type = _ONEOFOPTIONS + _ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE.containing_type = _ENUMDESCRIPTORPROTO + _ENUMDESCRIPTORPROTO.fields_by_name['value'].message_type = _ENUMVALUEDESCRIPTORPROTO + _ENUMDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMOPTIONS + _ENUMDESCRIPTORPROTO.fields_by_name['reserved_range'].message_type = _ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE + _ENUMVALUEDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMVALUEOPTIONS + _SERVICEDESCRIPTORPROTO.fields_by_name['method'].message_type = _METHODDESCRIPTORPROTO + _SERVICEDESCRIPTORPROTO.fields_by_name['options'].message_type = _SERVICEOPTIONS + _METHODDESCRIPTORPROTO.fields_by_name['options'].message_type = _METHODOPTIONS + _FILEOPTIONS.fields_by_name['optimize_for'].enum_type = _FILEOPTIONS_OPTIMIZEMODE + _FILEOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _FILEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _FILEOPTIONS_OPTIMIZEMODE.containing_type = _FILEOPTIONS + _MESSAGEOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _MESSAGEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _FIELDOPTIONS_EDITIONDEFAULT.fields_by_name['edition'].enum_type = _EDITION + _FIELDOPTIONS_EDITIONDEFAULT.containing_type = _FIELDOPTIONS + _FIELDOPTIONS.fields_by_name['ctype'].enum_type = _FIELDOPTIONS_CTYPE + _FIELDOPTIONS.fields_by_name['jstype'].enum_type = _FIELDOPTIONS_JSTYPE + _FIELDOPTIONS.fields_by_name['retention'].enum_type = _FIELDOPTIONS_OPTIONRETENTION + _FIELDOPTIONS.fields_by_name['targets'].enum_type = _FIELDOPTIONS_OPTIONTARGETTYPE + _FIELDOPTIONS.fields_by_name['edition_defaults'].message_type = _FIELDOPTIONS_EDITIONDEFAULT + _FIELDOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _FIELDOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _FIELDOPTIONS_CTYPE.containing_type = _FIELDOPTIONS + _FIELDOPTIONS_JSTYPE.containing_type = _FIELDOPTIONS + _FIELDOPTIONS_OPTIONRETENTION.containing_type = _FIELDOPTIONS + _FIELDOPTIONS_OPTIONTARGETTYPE.containing_type = _FIELDOPTIONS + _ONEOFOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _ONEOFOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _ENUMOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _ENUMOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _ENUMVALUEOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _ENUMVALUEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _SERVICEOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _SERVICEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _METHODOPTIONS.fields_by_name['idempotency_level'].enum_type = _METHODOPTIONS_IDEMPOTENCYLEVEL + _METHODOPTIONS.fields_by_name['features'].message_type = _FEATURESET + _METHODOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION + _METHODOPTIONS_IDEMPOTENCYLEVEL.containing_type = _METHODOPTIONS + _UNINTERPRETEDOPTION_NAMEPART.containing_type = _UNINTERPRETEDOPTION + _UNINTERPRETEDOPTION.fields_by_name['name'].message_type = _UNINTERPRETEDOPTION_NAMEPART + _FEATURESET.fields_by_name['field_presence'].enum_type = _FEATURESET_FIELDPRESENCE + _FEATURESET.fields_by_name['enum_type'].enum_type = _FEATURESET_ENUMTYPE + _FEATURESET.fields_by_name['repeated_field_encoding'].enum_type = _FEATURESET_REPEATEDFIELDENCODING + _FEATURESET.fields_by_name['utf8_validation'].enum_type = _FEATURESET_UTF8VALIDATION + _FEATURESET.fields_by_name['message_encoding'].enum_type = _FEATURESET_MESSAGEENCODING + _FEATURESET.fields_by_name['json_format'].enum_type = _FEATURESET_JSONFORMAT + _FEATURESET_FIELDPRESENCE.containing_type = _FEATURESET + _FEATURESET_ENUMTYPE.containing_type = _FEATURESET + _FEATURESET_REPEATEDFIELDENCODING.containing_type = _FEATURESET + _FEATURESET_UTF8VALIDATION.containing_type = _FEATURESET + _FEATURESET_MESSAGEENCODING.containing_type = _FEATURESET + _FEATURESET_JSONFORMAT.containing_type = _FEATURESET + _FEATURESETDEFAULTS_FEATURESETEDITIONDEFAULT.fields_by_name['edition'].enum_type = _EDITION + _FEATURESETDEFAULTS_FEATURESETEDITIONDEFAULT.fields_by_name['features'].message_type = _FEATURESET + _FEATURESETDEFAULTS_FEATURESETEDITIONDEFAULT.containing_type = _FEATURESETDEFAULTS + _FEATURESETDEFAULTS.fields_by_name['defaults'].message_type = _FEATURESETDEFAULTS_FEATURESETEDITIONDEFAULT + _FEATURESETDEFAULTS.fields_by_name['minimum_edition'].enum_type = _EDITION + _FEATURESETDEFAULTS.fields_by_name['maximum_edition'].enum_type = _EDITION + _SOURCECODEINFO_LOCATION.containing_type = _SOURCECODEINFO + _SOURCECODEINFO.fields_by_name['location'].message_type = _SOURCECODEINFO_LOCATION + _GENERATEDCODEINFO_ANNOTATION.fields_by_name['semantic'].enum_type = _GENERATEDCODEINFO_ANNOTATION_SEMANTIC + _GENERATEDCODEINFO_ANNOTATION.containing_type = _GENERATEDCODEINFO + _GENERATEDCODEINFO_ANNOTATION_SEMANTIC.containing_type = _GENERATEDCODEINFO_ANNOTATION + _GENERATEDCODEINFO.fields_by_name['annotation'].message_type = _GENERATEDCODEINFO_ANNOTATION + DESCRIPTOR.message_types_by_name['FileDescriptorSet'] = _FILEDESCRIPTORSET + DESCRIPTOR.message_types_by_name['FileDescriptorProto'] = _FILEDESCRIPTORPROTO + DESCRIPTOR.message_types_by_name['DescriptorProto'] = _DESCRIPTORPROTO + DESCRIPTOR.message_types_by_name['ExtensionRangeOptions'] = _EXTENSIONRANGEOPTIONS + DESCRIPTOR.message_types_by_name['FieldDescriptorProto'] = _FIELDDESCRIPTORPROTO + DESCRIPTOR.message_types_by_name['OneofDescriptorProto'] = _ONEOFDESCRIPTORPROTO + DESCRIPTOR.message_types_by_name['EnumDescriptorProto'] = _ENUMDESCRIPTORPROTO + DESCRIPTOR.message_types_by_name['EnumValueDescriptorProto'] = _ENUMVALUEDESCRIPTORPROTO + DESCRIPTOR.message_types_by_name['ServiceDescriptorProto'] = _SERVICEDESCRIPTORPROTO + DESCRIPTOR.message_types_by_name['MethodDescriptorProto'] = _METHODDESCRIPTORPROTO + DESCRIPTOR.message_types_by_name['FileOptions'] = _FILEOPTIONS + DESCRIPTOR.message_types_by_name['MessageOptions'] = _MESSAGEOPTIONS + DESCRIPTOR.message_types_by_name['FieldOptions'] = _FIELDOPTIONS + DESCRIPTOR.message_types_by_name['OneofOptions'] = _ONEOFOPTIONS + DESCRIPTOR.message_types_by_name['EnumOptions'] = _ENUMOPTIONS + DESCRIPTOR.message_types_by_name['EnumValueOptions'] = _ENUMVALUEOPTIONS + DESCRIPTOR.message_types_by_name['ServiceOptions'] = _SERVICEOPTIONS + DESCRIPTOR.message_types_by_name['MethodOptions'] = _METHODOPTIONS + DESCRIPTOR.message_types_by_name['UninterpretedOption'] = _UNINTERPRETEDOPTION + DESCRIPTOR.message_types_by_name['FeatureSet'] = _FEATURESET + DESCRIPTOR.message_types_by_name['FeatureSetDefaults'] = _FEATURESETDEFAULTS + DESCRIPTOR.message_types_by_name['SourceCodeInfo'] = _SOURCECODEINFO + DESCRIPTOR.message_types_by_name['GeneratedCodeInfo'] = _GENERATEDCODEINFO + DESCRIPTOR.enum_types_by_name['Edition'] = _EDITION + _sym_db.RegisterFileDescriptor(DESCRIPTOR) + +else: + _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.descriptor_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\020DescriptorProtosH\001Z-google.golang.org/protobuf/types/descriptorpb\370\001\001\242\002\003GPB\252\002\032Google.Protobuf.Reflection' + _globals['_EXTENSIONRANGEOPTIONS'].fields_by_name['declaration']._options = None + _globals['_EXTENSIONRANGEOPTIONS'].fields_by_name['declaration']._serialized_options = b'\210\001\002' + _globals['_FILEOPTIONS'].fields_by_name['java_generate_equals_and_hash']._options = None + _globals['_FILEOPTIONS'].fields_by_name['java_generate_equals_and_hash']._serialized_options = b'\030\001' + _globals['_MESSAGEOPTIONS'].fields_by_name['deprecated_legacy_json_field_conflicts']._options = None + _globals['_MESSAGEOPTIONS'].fields_by_name['deprecated_legacy_json_field_conflicts']._serialized_options = b'\030\001' + _globals['_ENUMOPTIONS'].fields_by_name['deprecated_legacy_json_field_conflicts']._options = None + _globals['_ENUMOPTIONS'].fields_by_name['deprecated_legacy_json_field_conflicts']._serialized_options = b'\030\001' + _globals['_FEATURESET'].fields_by_name['field_presence']._options = None + _globals['_FEATURESET'].fields_by_name['field_presence']._serialized_options = b'\210\001\001\230\001\004\230\001\001\242\001\r\022\010EXPLICIT\030\346\007\242\001\r\022\010IMPLICIT\030\347\007\242\001\r\022\010EXPLICIT\030\350\007' + _globals['_FEATURESET'].fields_by_name['enum_type']._options = None + _globals['_FEATURESET'].fields_by_name['enum_type']._serialized_options = b'\210\001\001\230\001\006\230\001\001\242\001\013\022\006CLOSED\030\346\007\242\001\t\022\004OPEN\030\347\007' + _globals['_FEATURESET'].fields_by_name['repeated_field_encoding']._options = None + _globals['_FEATURESET'].fields_by_name['repeated_field_encoding']._serialized_options = b'\210\001\001\230\001\004\230\001\001\242\001\r\022\010EXPANDED\030\346\007\242\001\013\022\006PACKED\030\347\007' + _globals['_FEATURESET'].fields_by_name['utf8_validation']._options = None + _globals['_FEATURESET'].fields_by_name['utf8_validation']._serialized_options = b'\210\001\001\230\001\004\230\001\001\242\001\t\022\004NONE\030\346\007\242\001\013\022\006VERIFY\030\347\007' + _globals['_FEATURESET'].fields_by_name['message_encoding']._options = None + _globals['_FEATURESET'].fields_by_name['message_encoding']._serialized_options = b'\210\001\001\230\001\004\230\001\001\242\001\024\022\017LENGTH_PREFIXED\030\346\007' + _globals['_FEATURESET'].fields_by_name['json_format']._options = None + _globals['_FEATURESET'].fields_by_name['json_format']._serialized_options = b'\210\001\001\230\001\003\230\001\006\230\001\001\242\001\027\022\022LEGACY_BEST_EFFORT\030\346\007\242\001\n\022\005ALLOW\030\347\007' + _globals['_SOURCECODEINFO_LOCATION'].fields_by_name['path']._options = None + _globals['_SOURCECODEINFO_LOCATION'].fields_by_name['path']._serialized_options = b'\020\001' + _globals['_SOURCECODEINFO_LOCATION'].fields_by_name['span']._options = None + _globals['_SOURCECODEINFO_LOCATION'].fields_by_name['span']._serialized_options = b'\020\001' + _globals['_GENERATEDCODEINFO_ANNOTATION'].fields_by_name['path']._options = None + _globals['_GENERATEDCODEINFO_ANNOTATION'].fields_by_name['path']._serialized_options = b'\020\001' + _globals['_EDITION']._serialized_start=11258 + _globals['_EDITION']._serialized_end=11492 + _globals['_FILEDESCRIPTORSET']._serialized_start=53 + _globals['_FILEDESCRIPTORSET']._serialized_end=130 + _globals['_FILEDESCRIPTORPROTO']._serialized_start=133 + _globals['_FILEDESCRIPTORPROTO']._serialized_end=797 + _globals['_DESCRIPTORPROTO']._serialized_start=800 + _globals['_DESCRIPTORPROTO']._serialized_end=1625 + _globals['_DESCRIPTORPROTO_EXTENSIONRANGE']._serialized_start=1446 + _globals['_DESCRIPTORPROTO_EXTENSIONRANGE']._serialized_end=1568 + _globals['_DESCRIPTORPROTO_RESERVEDRANGE']._serialized_start=1570 + _globals['_DESCRIPTORPROTO_RESERVEDRANGE']._serialized_end=1625 + _globals['_EXTENSIONRANGEOPTIONS']._serialized_start=1628 + _globals['_EXTENSIONRANGEOPTIONS']._serialized_end=2211 + _globals['_EXTENSIONRANGEOPTIONS_DECLARATION']._serialized_start=1998 + _globals['_EXTENSIONRANGEOPTIONS_DECLARATION']._serialized_end=2146 + _globals['_EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE']._serialized_start=2148 + _globals['_EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE']._serialized_end=2200 + _globals['_FIELDDESCRIPTORPROTO']._serialized_start=2214 + _globals['_FIELDDESCRIPTORPROTO']._serialized_end=3047 + _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_start=2668 + _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_end=2978 + _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_start=2980 + _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_end=3047 + _globals['_ONEOFDESCRIPTORPROTO']._serialized_start=3049 + _globals['_ONEOFDESCRIPTORPROTO']._serialized_end=3148 + _globals['_ENUMDESCRIPTORPROTO']._serialized_start=3151 + _globals['_ENUMDESCRIPTORPROTO']._serialized_end=3506 + _globals['_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE']._serialized_start=3447 + _globals['_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE']._serialized_end=3506 + _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_start=3509 + _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_end=3640 + _globals['_SERVICEDESCRIPTORPROTO']._serialized_start=3643 + _globals['_SERVICEDESCRIPTORPROTO']._serialized_end=3810 + _globals['_METHODDESCRIPTORPROTO']._serialized_start=3813 + _globals['_METHODDESCRIPTORPROTO']._serialized_end=4078 + _globals['_FILEOPTIONS']._serialized_start=4081 + _globals['_FILEOPTIONS']._serialized_end=5307 + _globals['_FILEOPTIONS_OPTIMIZEMODE']._serialized_start=5232 + _globals['_FILEOPTIONS_OPTIMIZEMODE']._serialized_end=5290 + _globals['_MESSAGEOPTIONS']._serialized_start=5310 + _globals['_MESSAGEOPTIONS']._serialized_end=5810 + _globals['_FIELDOPTIONS']._serialized_start=5813 + _globals['_FIELDOPTIONS']._serialized_end=7138 + _globals['_FIELDOPTIONS_EDITIONDEFAULT']._serialized_start=6563 + _globals['_FIELDOPTIONS_EDITIONDEFAULT']._serialized_end=6653 + _globals['_FIELDOPTIONS_CTYPE']._serialized_start=6655 + _globals['_FIELDOPTIONS_CTYPE']._serialized_end=6702 + _globals['_FIELDOPTIONS_JSTYPE']._serialized_start=6704 + _globals['_FIELDOPTIONS_JSTYPE']._serialized_end=6757 + _globals['_FIELDOPTIONS_OPTIONRETENTION']._serialized_start=6759 + _globals['_FIELDOPTIONS_OPTIONRETENTION']._serialized_end=6844 + _globals['_FIELDOPTIONS_OPTIONTARGETTYPE']._serialized_start=6847 + _globals['_FIELDOPTIONS_OPTIONTARGETTYPE']._serialized_end=7115 + _globals['_ONEOFOPTIONS']._serialized_start=7141 + _globals['_ONEOFOPTIONS']._serialized_end=7313 + _globals['_ENUMOPTIONS']._serialized_start=7316 + _globals['_ENUMOPTIONS']._serialized_end=7653 + _globals['_ENUMVALUEOPTIONS']._serialized_start=7656 + _globals['_ENUMVALUEOPTIONS']._serialized_end=7913 + _globals['_SERVICEOPTIONS']._serialized_start=7916 + _globals['_SERVICEOPTIONS']._serialized_end=8129 + _globals['_METHODOPTIONS']._serialized_start=8132 + _globals['_METHODOPTIONS']._serialized_end=8541 + _globals['_METHODOPTIONS_IDEMPOTENCYLEVEL']._serialized_start=8450 + _globals['_METHODOPTIONS_IDEMPOTENCYLEVEL']._serialized_end=8530 + _globals['_UNINTERPRETEDOPTION']._serialized_start=8544 + _globals['_UNINTERPRETEDOPTION']._serialized_end=8954 + _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_start=8880 + _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_end=8954 + _globals['_FEATURESET']._serialized_start=8957 + _globals['_FEATURESET']._serialized_end=10233 + _globals['_FEATURESET_FIELDPRESENCE']._serialized_start=9736 + _globals['_FEATURESET_FIELDPRESENCE']._serialized_end=9828 + _globals['_FEATURESET_ENUMTYPE']._serialized_start=9830 + _globals['_FEATURESET_ENUMTYPE']._serialized_end=9885 + _globals['_FEATURESET_REPEATEDFIELDENCODING']._serialized_start=9887 + _globals['_FEATURESET_REPEATEDFIELDENCODING']._serialized_end=9973 + _globals['_FEATURESET_UTF8VALIDATION']._serialized_start=9975 + _globals['_FEATURESET_UTF8VALIDATION']._serialized_end=10042 + _globals['_FEATURESET_MESSAGEENCODING']._serialized_start=10044 + _globals['_FEATURESET_MESSAGEENCODING']._serialized_end=10127 + _globals['_FEATURESET_JSONFORMAT']._serialized_start=10129 + _globals['_FEATURESET_JSONFORMAT']._serialized_end=10201 + _globals['_FEATURESETDEFAULTS']._serialized_start=10236 + _globals['_FEATURESETDEFAULTS']._serialized_end=10618 + _globals['_FEATURESETDEFAULTS_FEATURESETEDITIONDEFAULT']._serialized_start=10483 + _globals['_FEATURESETDEFAULTS_FEATURESETEDITIONDEFAULT']._serialized_end=10618 + _globals['_SOURCECODEINFO']._serialized_start=10621 + _globals['_SOURCECODEINFO']._serialized_end=10916 + _globals['_SOURCECODEINFO_LOCATION']._serialized_start=10710 + _globals['_SOURCECODEINFO_LOCATION']._serialized_end=10916 + _globals['_GENERATEDCODEINFO']._serialized_start=10919 + _globals['_GENERATEDCODEINFO']._serialized_end=11255 + _globals['_GENERATEDCODEINFO_ANNOTATION']._serialized_start=11020 + _globals['_GENERATEDCODEINFO_ANNOTATION']._serialized_end=11255 + _globals['_GENERATEDCODEINFO_ANNOTATION_SEMANTIC']._serialized_start=11215 + _globals['_GENERATEDCODEINFO_ANNOTATION_SEMANTIC']._serialized_end=11255 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_pool.py b/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_pool.py new file mode 100644 index 0000000..c2fe59f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/descriptor_pool.py @@ -0,0 +1,1271 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Provides DescriptorPool to use as a container for proto2 descriptors. + +The DescriptorPool is used in conjection with a DescriptorDatabase to maintain +a collection of protocol buffer descriptors for use when dynamically creating +message types at runtime. + +For most applications protocol buffers should be used via modules generated by +the protocol buffer compiler tool. This should only be used when the type of +protocol buffers used in an application or library cannot be predetermined. + +Below is a straightforward example on how to use this class:: + + pool = DescriptorPool() + file_descriptor_protos = [ ... ] + for file_descriptor_proto in file_descriptor_protos: + pool.Add(file_descriptor_proto) + my_message_descriptor = pool.FindMessageTypeByName('some.package.MessageType') + +The message descriptor can be used in conjunction with the message_factory +module in order to create a protocol buffer class that can be encoded and +decoded. + +If you want to get a Python class for the specified proto, use the +helper functions inside google.protobuf.message_factory +directly instead of this class. +""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +import collections +import warnings + +from google.protobuf import descriptor +from google.protobuf import descriptor_database +from google.protobuf import text_encoding +from google.protobuf.internal import python_message + +_USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS # pylint: disable=protected-access + + +def _Deprecated(func): + """Mark functions as deprecated.""" + + def NewFunc(*args, **kwargs): + warnings.warn( + 'Call to deprecated function %s(). Note: Do add unlinked descriptors ' + 'to descriptor_pool is wrong. Please use Add() or AddSerializedFile() ' + 'instead. This function will be removed soon.' % func.__name__, + category=DeprecationWarning) + return func(*args, **kwargs) + NewFunc.__name__ = func.__name__ + NewFunc.__doc__ = func.__doc__ + NewFunc.__dict__.update(func.__dict__) + return NewFunc + + +def _NormalizeFullyQualifiedName(name): + """Remove leading period from fully-qualified type name. + + Due to b/13860351 in descriptor_database.py, types in the root namespace are + generated with a leading period. This function removes that prefix. + + Args: + name (str): The fully-qualified symbol name. + + Returns: + str: The normalized fully-qualified symbol name. + """ + return name.lstrip('.') + + +def _OptionsOrNone(descriptor_proto): + """Returns the value of the field `options`, or None if it is not set.""" + if descriptor_proto.HasField('options'): + return descriptor_proto.options + else: + return None + + +def _IsMessageSetExtension(field): + return (field.is_extension and + field.containing_type.has_options and + field.containing_type.GetOptions().message_set_wire_format and + field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and + field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL) + + +class DescriptorPool(object): + """A collection of protobufs dynamically constructed by descriptor protos.""" + + if _USE_C_DESCRIPTORS: + + def __new__(cls, descriptor_db=None): + # pylint: disable=protected-access + return descriptor._message.DescriptorPool(descriptor_db) + + def __init__( + self, descriptor_db=None, use_deprecated_legacy_json_field_conflicts=False + ): + """Initializes a Pool of proto buffs. + + The descriptor_db argument to the constructor is provided to allow + specialized file descriptor proto lookup code to be triggered on demand. An + example would be an implementation which will read and compile a file + specified in a call to FindFileByName() and not require the call to Add() + at all. Results from this database will be cached internally here as well. + + Args: + descriptor_db: A secondary source of file descriptors. + use_deprecated_legacy_json_field_conflicts: Unused, for compatibility with + C++. + """ + + self._internal_db = descriptor_database.DescriptorDatabase() + self._descriptor_db = descriptor_db + self._descriptors = {} + self._enum_descriptors = {} + self._service_descriptors = {} + self._file_descriptors = {} + self._toplevel_extensions = {} + self._top_enum_values = {} + # We store extensions in two two-level mappings: The first key is the + # descriptor of the message being extended, the second key is the extension + # full name or its tag number. + self._extensions_by_name = collections.defaultdict(dict) + self._extensions_by_number = collections.defaultdict(dict) + + def _CheckConflictRegister(self, desc, desc_name, file_name): + """Check if the descriptor name conflicts with another of the same name. + + Args: + desc: Descriptor of a message, enum, service, extension or enum value. + desc_name (str): the full name of desc. + file_name (str): The file name of descriptor. + """ + for register, descriptor_type in [ + (self._descriptors, descriptor.Descriptor), + (self._enum_descriptors, descriptor.EnumDescriptor), + (self._service_descriptors, descriptor.ServiceDescriptor), + (self._toplevel_extensions, descriptor.FieldDescriptor), + (self._top_enum_values, descriptor.EnumValueDescriptor)]: + if desc_name in register: + old_desc = register[desc_name] + if isinstance(old_desc, descriptor.EnumValueDescriptor): + old_file = old_desc.type.file.name + else: + old_file = old_desc.file.name + + if not isinstance(desc, descriptor_type) or ( + old_file != file_name): + error_msg = ('Conflict register for file "' + file_name + + '": ' + desc_name + + ' is already defined in file "' + + old_file + '". Please fix the conflict by adding ' + 'package name on the proto file, or use different ' + 'name for the duplication.') + if isinstance(desc, descriptor.EnumValueDescriptor): + error_msg += ('\nNote: enum values appear as ' + 'siblings of the enum type instead of ' + 'children of it.') + + raise TypeError(error_msg) + + return + + def Add(self, file_desc_proto): + """Adds the FileDescriptorProto and its types to this pool. + + Args: + file_desc_proto (FileDescriptorProto): The file descriptor to add. + """ + + self._internal_db.Add(file_desc_proto) + + def AddSerializedFile(self, serialized_file_desc_proto): + """Adds the FileDescriptorProto and its types to this pool. + + Args: + serialized_file_desc_proto (bytes): A bytes string, serialization of the + :class:`FileDescriptorProto` to add. + + Returns: + FileDescriptor: Descriptor for the added file. + """ + + # pylint: disable=g-import-not-at-top + from google.protobuf import descriptor_pb2 + file_desc_proto = descriptor_pb2.FileDescriptorProto.FromString( + serialized_file_desc_proto) + file_desc = self._ConvertFileProtoToFileDescriptor(file_desc_proto) + file_desc.serialized_pb = serialized_file_desc_proto + return file_desc + + # Add Descriptor to descriptor pool is deprecated. Please use Add() + # or AddSerializedFile() to add a FileDescriptorProto instead. + @_Deprecated + def AddDescriptor(self, desc): + self._AddDescriptor(desc) + + # Never call this method. It is for internal usage only. + def _AddDescriptor(self, desc): + """Adds a Descriptor to the pool, non-recursively. + + If the Descriptor contains nested messages or enums, the caller must + explicitly register them. This method also registers the FileDescriptor + associated with the message. + + Args: + desc: A Descriptor. + """ + if not isinstance(desc, descriptor.Descriptor): + raise TypeError('Expected instance of descriptor.Descriptor.') + + self._CheckConflictRegister(desc, desc.full_name, desc.file.name) + + self._descriptors[desc.full_name] = desc + self._AddFileDescriptor(desc.file) + + # Never call this method. It is for internal usage only. + def _AddEnumDescriptor(self, enum_desc): + """Adds an EnumDescriptor to the pool. + + This method also registers the FileDescriptor associated with the enum. + + Args: + enum_desc: An EnumDescriptor. + """ + + if not isinstance(enum_desc, descriptor.EnumDescriptor): + raise TypeError('Expected instance of descriptor.EnumDescriptor.') + + file_name = enum_desc.file.name + self._CheckConflictRegister(enum_desc, enum_desc.full_name, file_name) + self._enum_descriptors[enum_desc.full_name] = enum_desc + + # Top enum values need to be indexed. + # Count the number of dots to see whether the enum is toplevel or nested + # in a message. We cannot use enum_desc.containing_type at this stage. + if enum_desc.file.package: + top_level = (enum_desc.full_name.count('.') + - enum_desc.file.package.count('.') == 1) + else: + top_level = enum_desc.full_name.count('.') == 0 + if top_level: + file_name = enum_desc.file.name + package = enum_desc.file.package + for enum_value in enum_desc.values: + full_name = _NormalizeFullyQualifiedName( + '.'.join((package, enum_value.name))) + self._CheckConflictRegister(enum_value, full_name, file_name) + self._top_enum_values[full_name] = enum_value + self._AddFileDescriptor(enum_desc.file) + + # Add ServiceDescriptor to descriptor pool is deprecated. Please use Add() + # or AddSerializedFile() to add a FileDescriptorProto instead. + @_Deprecated + def AddServiceDescriptor(self, service_desc): + self._AddServiceDescriptor(service_desc) + + # Never call this method. It is for internal usage only. + def _AddServiceDescriptor(self, service_desc): + """Adds a ServiceDescriptor to the pool. + + Args: + service_desc: A ServiceDescriptor. + """ + + if not isinstance(service_desc, descriptor.ServiceDescriptor): + raise TypeError('Expected instance of descriptor.ServiceDescriptor.') + + self._CheckConflictRegister(service_desc, service_desc.full_name, + service_desc.file.name) + self._service_descriptors[service_desc.full_name] = service_desc + + # Add ExtensionDescriptor to descriptor pool is deprecated. Please use Add() + # or AddSerializedFile() to add a FileDescriptorProto instead. + @_Deprecated + def AddExtensionDescriptor(self, extension): + self._AddExtensionDescriptor(extension) + + # Never call this method. It is for internal usage only. + def _AddExtensionDescriptor(self, extension): + """Adds a FieldDescriptor describing an extension to the pool. + + Args: + extension: A FieldDescriptor. + + Raises: + AssertionError: when another extension with the same number extends the + same message. + TypeError: when the specified extension is not a + descriptor.FieldDescriptor. + """ + if not (isinstance(extension, descriptor.FieldDescriptor) and + extension.is_extension): + raise TypeError('Expected an extension descriptor.') + + if extension.extension_scope is None: + self._CheckConflictRegister( + extension, extension.full_name, extension.file.name) + self._toplevel_extensions[extension.full_name] = extension + + try: + existing_desc = self._extensions_by_number[ + extension.containing_type][extension.number] + except KeyError: + pass + else: + if extension is not existing_desc: + raise AssertionError( + 'Extensions "%s" and "%s" both try to extend message type "%s" ' + 'with field number %d.' % + (extension.full_name, existing_desc.full_name, + extension.containing_type.full_name, extension.number)) + + self._extensions_by_number[extension.containing_type][ + extension.number] = extension + self._extensions_by_name[extension.containing_type][ + extension.full_name] = extension + + # Also register MessageSet extensions with the type name. + if _IsMessageSetExtension(extension): + self._extensions_by_name[extension.containing_type][ + extension.message_type.full_name] = extension + + if hasattr(extension.containing_type, '_concrete_class'): + python_message._AttachFieldHelpers( + extension.containing_type._concrete_class, extension) + + @_Deprecated + def AddFileDescriptor(self, file_desc): + self._InternalAddFileDescriptor(file_desc) + + # Never call this method. It is for internal usage only. + def _InternalAddFileDescriptor(self, file_desc): + """Adds a FileDescriptor to the pool, non-recursively. + + If the FileDescriptor contains messages or enums, the caller must explicitly + register them. + + Args: + file_desc: A FileDescriptor. + """ + + self._AddFileDescriptor(file_desc) + + def _AddFileDescriptor(self, file_desc): + """Adds a FileDescriptor to the pool, non-recursively. + + If the FileDescriptor contains messages or enums, the caller must explicitly + register them. + + Args: + file_desc: A FileDescriptor. + """ + + if not isinstance(file_desc, descriptor.FileDescriptor): + raise TypeError('Expected instance of descriptor.FileDescriptor.') + self._file_descriptors[file_desc.name] = file_desc + + def FindFileByName(self, file_name): + """Gets a FileDescriptor by file name. + + Args: + file_name (str): The path to the file to get a descriptor for. + + Returns: + FileDescriptor: The descriptor for the named file. + + Raises: + KeyError: if the file cannot be found in the pool. + """ + + try: + return self._file_descriptors[file_name] + except KeyError: + pass + + try: + file_proto = self._internal_db.FindFileByName(file_name) + except KeyError as error: + if self._descriptor_db: + file_proto = self._descriptor_db.FindFileByName(file_name) + else: + raise error + if not file_proto: + raise KeyError('Cannot find a file named %s' % file_name) + return self._ConvertFileProtoToFileDescriptor(file_proto) + + def FindFileContainingSymbol(self, symbol): + """Gets the FileDescriptor for the file containing the specified symbol. + + Args: + symbol (str): The name of the symbol to search for. + + Returns: + FileDescriptor: Descriptor for the file that contains the specified + symbol. + + Raises: + KeyError: if the file cannot be found in the pool. + """ + + symbol = _NormalizeFullyQualifiedName(symbol) + try: + return self._InternalFindFileContainingSymbol(symbol) + except KeyError: + pass + + try: + # Try fallback database. Build and find again if possible. + self._FindFileContainingSymbolInDb(symbol) + return self._InternalFindFileContainingSymbol(symbol) + except KeyError: + raise KeyError('Cannot find a file containing %s' % symbol) + + def _InternalFindFileContainingSymbol(self, symbol): + """Gets the already built FileDescriptor containing the specified symbol. + + Args: + symbol (str): The name of the symbol to search for. + + Returns: + FileDescriptor: Descriptor for the file that contains the specified + symbol. + + Raises: + KeyError: if the file cannot be found in the pool. + """ + try: + return self._descriptors[symbol].file + except KeyError: + pass + + try: + return self._enum_descriptors[symbol].file + except KeyError: + pass + + try: + return self._service_descriptors[symbol].file + except KeyError: + pass + + try: + return self._top_enum_values[symbol].type.file + except KeyError: + pass + + try: + return self._toplevel_extensions[symbol].file + except KeyError: + pass + + # Try fields, enum values and nested extensions inside a message. + top_name, _, sub_name = symbol.rpartition('.') + try: + message = self.FindMessageTypeByName(top_name) + assert (sub_name in message.extensions_by_name or + sub_name in message.fields_by_name or + sub_name in message.enum_values_by_name) + return message.file + except (KeyError, AssertionError): + raise KeyError('Cannot find a file containing %s' % symbol) + + def FindMessageTypeByName(self, full_name): + """Loads the named descriptor from the pool. + + Args: + full_name (str): The full name of the descriptor to load. + + Returns: + Descriptor: The descriptor for the named type. + + Raises: + KeyError: if the message cannot be found in the pool. + """ + + full_name = _NormalizeFullyQualifiedName(full_name) + if full_name not in self._descriptors: + self._FindFileContainingSymbolInDb(full_name) + return self._descriptors[full_name] + + def FindEnumTypeByName(self, full_name): + """Loads the named enum descriptor from the pool. + + Args: + full_name (str): The full name of the enum descriptor to load. + + Returns: + EnumDescriptor: The enum descriptor for the named type. + + Raises: + KeyError: if the enum cannot be found in the pool. + """ + + full_name = _NormalizeFullyQualifiedName(full_name) + if full_name not in self._enum_descriptors: + self._FindFileContainingSymbolInDb(full_name) + return self._enum_descriptors[full_name] + + def FindFieldByName(self, full_name): + """Loads the named field descriptor from the pool. + + Args: + full_name (str): The full name of the field descriptor to load. + + Returns: + FieldDescriptor: The field descriptor for the named field. + + Raises: + KeyError: if the field cannot be found in the pool. + """ + full_name = _NormalizeFullyQualifiedName(full_name) + message_name, _, field_name = full_name.rpartition('.') + message_descriptor = self.FindMessageTypeByName(message_name) + return message_descriptor.fields_by_name[field_name] + + def FindOneofByName(self, full_name): + """Loads the named oneof descriptor from the pool. + + Args: + full_name (str): The full name of the oneof descriptor to load. + + Returns: + OneofDescriptor: The oneof descriptor for the named oneof. + + Raises: + KeyError: if the oneof cannot be found in the pool. + """ + full_name = _NormalizeFullyQualifiedName(full_name) + message_name, _, oneof_name = full_name.rpartition('.') + message_descriptor = self.FindMessageTypeByName(message_name) + return message_descriptor.oneofs_by_name[oneof_name] + + def FindExtensionByName(self, full_name): + """Loads the named extension descriptor from the pool. + + Args: + full_name (str): The full name of the extension descriptor to load. + + Returns: + FieldDescriptor: The field descriptor for the named extension. + + Raises: + KeyError: if the extension cannot be found in the pool. + """ + full_name = _NormalizeFullyQualifiedName(full_name) + try: + # The proto compiler does not give any link between the FileDescriptor + # and top-level extensions unless the FileDescriptorProto is added to + # the DescriptorDatabase, but this can impact memory usage. + # So we registered these extensions by name explicitly. + return self._toplevel_extensions[full_name] + except KeyError: + pass + message_name, _, extension_name = full_name.rpartition('.') + try: + # Most extensions are nested inside a message. + scope = self.FindMessageTypeByName(message_name) + except KeyError: + # Some extensions are defined at file scope. + scope = self._FindFileContainingSymbolInDb(full_name) + return scope.extensions_by_name[extension_name] + + def FindExtensionByNumber(self, message_descriptor, number): + """Gets the extension of the specified message with the specified number. + + Extensions have to be registered to this pool by calling :func:`Add` or + :func:`AddExtensionDescriptor`. + + Args: + message_descriptor (Descriptor): descriptor of the extended message. + number (int): Number of the extension field. + + Returns: + FieldDescriptor: The descriptor for the extension. + + Raises: + KeyError: when no extension with the given number is known for the + specified message. + """ + try: + return self._extensions_by_number[message_descriptor][number] + except KeyError: + self._TryLoadExtensionFromDB(message_descriptor, number) + return self._extensions_by_number[message_descriptor][number] + + def FindAllExtensions(self, message_descriptor): + """Gets all the known extensions of a given message. + + Extensions have to be registered to this pool by build related + :func:`Add` or :func:`AddExtensionDescriptor`. + + Args: + message_descriptor (Descriptor): Descriptor of the extended message. + + Returns: + list[FieldDescriptor]: Field descriptors describing the extensions. + """ + # Fallback to descriptor db if FindAllExtensionNumbers is provided. + if self._descriptor_db and hasattr( + self._descriptor_db, 'FindAllExtensionNumbers'): + full_name = message_descriptor.full_name + all_numbers = self._descriptor_db.FindAllExtensionNumbers(full_name) + for number in all_numbers: + if number in self._extensions_by_number[message_descriptor]: + continue + self._TryLoadExtensionFromDB(message_descriptor, number) + + return list(self._extensions_by_number[message_descriptor].values()) + + def _TryLoadExtensionFromDB(self, message_descriptor, number): + """Try to Load extensions from descriptor db. + + Args: + message_descriptor: descriptor of the extended message. + number: the extension number that needs to be loaded. + """ + if not self._descriptor_db: + return + # Only supported when FindFileContainingExtension is provided. + if not hasattr( + self._descriptor_db, 'FindFileContainingExtension'): + return + + full_name = message_descriptor.full_name + file_proto = self._descriptor_db.FindFileContainingExtension( + full_name, number) + + if file_proto is None: + return + + try: + self._ConvertFileProtoToFileDescriptor(file_proto) + except: + warn_msg = ('Unable to load proto file %s for extension number %d.' % + (file_proto.name, number)) + warnings.warn(warn_msg, RuntimeWarning) + + def FindServiceByName(self, full_name): + """Loads the named service descriptor from the pool. + + Args: + full_name (str): The full name of the service descriptor to load. + + Returns: + ServiceDescriptor: The service descriptor for the named service. + + Raises: + KeyError: if the service cannot be found in the pool. + """ + full_name = _NormalizeFullyQualifiedName(full_name) + if full_name not in self._service_descriptors: + self._FindFileContainingSymbolInDb(full_name) + return self._service_descriptors[full_name] + + def FindMethodByName(self, full_name): + """Loads the named service method descriptor from the pool. + + Args: + full_name (str): The full name of the method descriptor to load. + + Returns: + MethodDescriptor: The method descriptor for the service method. + + Raises: + KeyError: if the method cannot be found in the pool. + """ + full_name = _NormalizeFullyQualifiedName(full_name) + service_name, _, method_name = full_name.rpartition('.') + service_descriptor = self.FindServiceByName(service_name) + return service_descriptor.methods_by_name[method_name] + + def _FindFileContainingSymbolInDb(self, symbol): + """Finds the file in descriptor DB containing the specified symbol. + + Args: + symbol (str): The name of the symbol to search for. + + Returns: + FileDescriptor: The file that contains the specified symbol. + + Raises: + KeyError: if the file cannot be found in the descriptor database. + """ + try: + file_proto = self._internal_db.FindFileContainingSymbol(symbol) + except KeyError as error: + if self._descriptor_db: + file_proto = self._descriptor_db.FindFileContainingSymbol(symbol) + else: + raise error + if not file_proto: + raise KeyError('Cannot find a file containing %s' % symbol) + return self._ConvertFileProtoToFileDescriptor(file_proto) + + def _ConvertFileProtoToFileDescriptor(self, file_proto): + """Creates a FileDescriptor from a proto or returns a cached copy. + + This method also has the side effect of loading all the symbols found in + the file into the appropriate dictionaries in the pool. + + Args: + file_proto: The proto to convert. + + Returns: + A FileDescriptor matching the passed in proto. + """ + if file_proto.name not in self._file_descriptors: + built_deps = list(self._GetDeps(file_proto.dependency)) + direct_deps = [self.FindFileByName(n) for n in file_proto.dependency] + public_deps = [direct_deps[i] for i in file_proto.public_dependency] + + file_descriptor = descriptor.FileDescriptor( + pool=self, + name=file_proto.name, + package=file_proto.package, + syntax=file_proto.syntax, + options=_OptionsOrNone(file_proto), + serialized_pb=file_proto.SerializeToString(), + dependencies=direct_deps, + public_dependencies=public_deps, + # pylint: disable=protected-access + create_key=descriptor._internal_create_key) + scope = {} + + # This loop extracts all the message and enum types from all the + # dependencies of the file_proto. This is necessary to create the + # scope of available message types when defining the passed in + # file proto. + for dependency in built_deps: + scope.update(self._ExtractSymbols( + dependency.message_types_by_name.values())) + scope.update((_PrefixWithDot(enum.full_name), enum) + for enum in dependency.enum_types_by_name.values()) + + for message_type in file_proto.message_type: + message_desc = self._ConvertMessageDescriptor( + message_type, file_proto.package, file_descriptor, scope, + file_proto.syntax) + file_descriptor.message_types_by_name[message_desc.name] = ( + message_desc) + + for enum_type in file_proto.enum_type: + file_descriptor.enum_types_by_name[enum_type.name] = ( + self._ConvertEnumDescriptor(enum_type, file_proto.package, + file_descriptor, None, scope, True)) + + for index, extension_proto in enumerate(file_proto.extension): + extension_desc = self._MakeFieldDescriptor( + extension_proto, file_proto.package, index, file_descriptor, + is_extension=True) + extension_desc.containing_type = self._GetTypeFromScope( + file_descriptor.package, extension_proto.extendee, scope) + self._SetFieldType(extension_proto, extension_desc, + file_descriptor.package, scope) + file_descriptor.extensions_by_name[extension_desc.name] = ( + extension_desc) + + for desc_proto in file_proto.message_type: + self._SetAllFieldTypes(file_proto.package, desc_proto, scope) + + if file_proto.package: + desc_proto_prefix = _PrefixWithDot(file_proto.package) + else: + desc_proto_prefix = '' + + for desc_proto in file_proto.message_type: + desc = self._GetTypeFromScope( + desc_proto_prefix, desc_proto.name, scope) + file_descriptor.message_types_by_name[desc_proto.name] = desc + + for index, service_proto in enumerate(file_proto.service): + file_descriptor.services_by_name[service_proto.name] = ( + self._MakeServiceDescriptor(service_proto, index, scope, + file_proto.package, file_descriptor)) + + self._file_descriptors[file_proto.name] = file_descriptor + + # Add extensions to the pool + def AddExtensionForNested(message_type): + for nested in message_type.nested_types: + AddExtensionForNested(nested) + for extension in message_type.extensions: + self._AddExtensionDescriptor(extension) + + file_desc = self._file_descriptors[file_proto.name] + for extension in file_desc.extensions_by_name.values(): + self._AddExtensionDescriptor(extension) + for message_type in file_desc.message_types_by_name.values(): + AddExtensionForNested(message_type) + + return file_desc + + def _ConvertMessageDescriptor(self, desc_proto, package=None, file_desc=None, + scope=None, syntax=None): + """Adds the proto to the pool in the specified package. + + Args: + desc_proto: The descriptor_pb2.DescriptorProto protobuf message. + package: The package the proto should be located in. + file_desc: The file containing this message. + scope: Dict mapping short and full symbols to message and enum types. + syntax: string indicating syntax of the file ("proto2" or "proto3") + + Returns: + The added descriptor. + """ + + if package: + desc_name = '.'.join((package, desc_proto.name)) + else: + desc_name = desc_proto.name + + if file_desc is None: + file_name = None + else: + file_name = file_desc.name + + if scope is None: + scope = {} + + nested = [ + self._ConvertMessageDescriptor( + nested, desc_name, file_desc, scope, syntax) + for nested in desc_proto.nested_type] + enums = [ + self._ConvertEnumDescriptor(enum, desc_name, file_desc, None, + scope, False) + for enum in desc_proto.enum_type] + fields = [self._MakeFieldDescriptor(field, desc_name, index, file_desc) + for index, field in enumerate(desc_proto.field)] + extensions = [ + self._MakeFieldDescriptor(extension, desc_name, index, file_desc, + is_extension=True) + for index, extension in enumerate(desc_proto.extension)] + oneofs = [ + # pylint: disable=g-complex-comprehension + descriptor.OneofDescriptor( + desc.name, + '.'.join((desc_name, desc.name)), + index, + None, + [], + _OptionsOrNone(desc), + # pylint: disable=protected-access + create_key=descriptor._internal_create_key) + for index, desc in enumerate(desc_proto.oneof_decl) + ] + extension_ranges = [(r.start, r.end) for r in desc_proto.extension_range] + if extension_ranges: + is_extendable = True + else: + is_extendable = False + desc = descriptor.Descriptor( + name=desc_proto.name, + full_name=desc_name, + filename=file_name, + containing_type=None, + fields=fields, + oneofs=oneofs, + nested_types=nested, + enum_types=enums, + extensions=extensions, + options=_OptionsOrNone(desc_proto), + is_extendable=is_extendable, + extension_ranges=extension_ranges, + file=file_desc, + serialized_start=None, + serialized_end=None, + syntax=syntax, + is_map_entry=desc_proto.options.map_entry, + # pylint: disable=protected-access + create_key=descriptor._internal_create_key) + for nested in desc.nested_types: + nested.containing_type = desc + for enum in desc.enum_types: + enum.containing_type = desc + for field_index, field_desc in enumerate(desc_proto.field): + if field_desc.HasField('oneof_index'): + oneof_index = field_desc.oneof_index + oneofs[oneof_index].fields.append(fields[field_index]) + fields[field_index].containing_oneof = oneofs[oneof_index] + + scope[_PrefixWithDot(desc_name)] = desc + self._CheckConflictRegister(desc, desc.full_name, desc.file.name) + self._descriptors[desc_name] = desc + return desc + + def _ConvertEnumDescriptor(self, enum_proto, package=None, file_desc=None, + containing_type=None, scope=None, top_level=False): + """Make a protobuf EnumDescriptor given an EnumDescriptorProto protobuf. + + Args: + enum_proto: The descriptor_pb2.EnumDescriptorProto protobuf message. + package: Optional package name for the new message EnumDescriptor. + file_desc: The file containing the enum descriptor. + containing_type: The type containing this enum. + scope: Scope containing available types. + top_level: If True, the enum is a top level symbol. If False, the enum + is defined inside a message. + + Returns: + The added descriptor + """ + + if package: + enum_name = '.'.join((package, enum_proto.name)) + else: + enum_name = enum_proto.name + + if file_desc is None: + file_name = None + else: + file_name = file_desc.name + + values = [self._MakeEnumValueDescriptor(value, index) + for index, value in enumerate(enum_proto.value)] + desc = descriptor.EnumDescriptor(name=enum_proto.name, + full_name=enum_name, + filename=file_name, + file=file_desc, + values=values, + containing_type=containing_type, + options=_OptionsOrNone(enum_proto), + # pylint: disable=protected-access + create_key=descriptor._internal_create_key) + scope['.%s' % enum_name] = desc + self._CheckConflictRegister(desc, desc.full_name, desc.file.name) + self._enum_descriptors[enum_name] = desc + + # Add top level enum values. + if top_level: + for value in values: + full_name = _NormalizeFullyQualifiedName( + '.'.join((package, value.name))) + self._CheckConflictRegister(value, full_name, file_name) + self._top_enum_values[full_name] = value + + return desc + + def _MakeFieldDescriptor(self, field_proto, message_name, index, + file_desc, is_extension=False): + """Creates a field descriptor from a FieldDescriptorProto. + + For message and enum type fields, this method will do a look up + in the pool for the appropriate descriptor for that type. If it + is unavailable, it will fall back to the _source function to + create it. If this type is still unavailable, construction will + fail. + + Args: + field_proto: The proto describing the field. + message_name: The name of the containing message. + index: Index of the field + file_desc: The file containing the field descriptor. + is_extension: Indication that this field is for an extension. + + Returns: + An initialized FieldDescriptor object + """ + + if message_name: + full_name = '.'.join((message_name, field_proto.name)) + else: + full_name = field_proto.name + + if field_proto.json_name: + json_name = field_proto.json_name + else: + json_name = None + + return descriptor.FieldDescriptor( + name=field_proto.name, + full_name=full_name, + index=index, + number=field_proto.number, + type=field_proto.type, + cpp_type=None, + message_type=None, + enum_type=None, + containing_type=None, + label=field_proto.label, + has_default_value=False, + default_value=None, + is_extension=is_extension, + extension_scope=None, + options=_OptionsOrNone(field_proto), + json_name=json_name, + file=file_desc, + # pylint: disable=protected-access + create_key=descriptor._internal_create_key) + + def _SetAllFieldTypes(self, package, desc_proto, scope): + """Sets all the descriptor's fields's types. + + This method also sets the containing types on any extensions. + + Args: + package: The current package of desc_proto. + desc_proto: The message descriptor to update. + scope: Enclosing scope of available types. + """ + + package = _PrefixWithDot(package) + + main_desc = self._GetTypeFromScope(package, desc_proto.name, scope) + + if package == '.': + nested_package = _PrefixWithDot(desc_proto.name) + else: + nested_package = '.'.join([package, desc_proto.name]) + + for field_proto, field_desc in zip(desc_proto.field, main_desc.fields): + self._SetFieldType(field_proto, field_desc, nested_package, scope) + + for extension_proto, extension_desc in ( + zip(desc_proto.extension, main_desc.extensions)): + extension_desc.containing_type = self._GetTypeFromScope( + nested_package, extension_proto.extendee, scope) + self._SetFieldType(extension_proto, extension_desc, nested_package, scope) + + for nested_type in desc_proto.nested_type: + self._SetAllFieldTypes(nested_package, nested_type, scope) + + def _SetFieldType(self, field_proto, field_desc, package, scope): + """Sets the field's type, cpp_type, message_type and enum_type. + + Args: + field_proto: Data about the field in proto format. + field_desc: The descriptor to modify. + package: The package the field's container is in. + scope: Enclosing scope of available types. + """ + if field_proto.type_name: + desc = self._GetTypeFromScope(package, field_proto.type_name, scope) + else: + desc = None + + if not field_proto.HasField('type'): + if isinstance(desc, descriptor.Descriptor): + field_proto.type = descriptor.FieldDescriptor.TYPE_MESSAGE + else: + field_proto.type = descriptor.FieldDescriptor.TYPE_ENUM + + field_desc.cpp_type = descriptor.FieldDescriptor.ProtoTypeToCppProtoType( + field_proto.type) + + if (field_proto.type == descriptor.FieldDescriptor.TYPE_MESSAGE + or field_proto.type == descriptor.FieldDescriptor.TYPE_GROUP): + field_desc.message_type = desc + + if field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: + field_desc.enum_type = desc + + if field_proto.label == descriptor.FieldDescriptor.LABEL_REPEATED: + field_desc.has_default_value = False + field_desc.default_value = [] + elif field_proto.HasField('default_value'): + field_desc.has_default_value = True + if (field_proto.type == descriptor.FieldDescriptor.TYPE_DOUBLE or + field_proto.type == descriptor.FieldDescriptor.TYPE_FLOAT): + field_desc.default_value = float(field_proto.default_value) + elif field_proto.type == descriptor.FieldDescriptor.TYPE_STRING: + field_desc.default_value = field_proto.default_value + elif field_proto.type == descriptor.FieldDescriptor.TYPE_BOOL: + field_desc.default_value = field_proto.default_value.lower() == 'true' + elif field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: + field_desc.default_value = field_desc.enum_type.values_by_name[ + field_proto.default_value].number + elif field_proto.type == descriptor.FieldDescriptor.TYPE_BYTES: + field_desc.default_value = text_encoding.CUnescape( + field_proto.default_value) + elif field_proto.type == descriptor.FieldDescriptor.TYPE_MESSAGE: + field_desc.default_value = None + else: + # All other types are of the "int" type. + field_desc.default_value = int(field_proto.default_value) + else: + field_desc.has_default_value = False + if (field_proto.type == descriptor.FieldDescriptor.TYPE_DOUBLE or + field_proto.type == descriptor.FieldDescriptor.TYPE_FLOAT): + field_desc.default_value = 0.0 + elif field_proto.type == descriptor.FieldDescriptor.TYPE_STRING: + field_desc.default_value = u'' + elif field_proto.type == descriptor.FieldDescriptor.TYPE_BOOL: + field_desc.default_value = False + elif field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: + field_desc.default_value = field_desc.enum_type.values[0].number + elif field_proto.type == descriptor.FieldDescriptor.TYPE_BYTES: + field_desc.default_value = b'' + elif field_proto.type == descriptor.FieldDescriptor.TYPE_MESSAGE: + field_desc.default_value = None + elif field_proto.type == descriptor.FieldDescriptor.TYPE_GROUP: + field_desc.default_value = None + else: + # All other types are of the "int" type. + field_desc.default_value = 0 + + field_desc.type = field_proto.type + + def _MakeEnumValueDescriptor(self, value_proto, index): + """Creates a enum value descriptor object from a enum value proto. + + Args: + value_proto: The proto describing the enum value. + index: The index of the enum value. + + Returns: + An initialized EnumValueDescriptor object. + """ + + return descriptor.EnumValueDescriptor( + name=value_proto.name, + index=index, + number=value_proto.number, + options=_OptionsOrNone(value_proto), + type=None, + # pylint: disable=protected-access + create_key=descriptor._internal_create_key) + + def _MakeServiceDescriptor(self, service_proto, service_index, scope, + package, file_desc): + """Make a protobuf ServiceDescriptor given a ServiceDescriptorProto. + + Args: + service_proto: The descriptor_pb2.ServiceDescriptorProto protobuf message. + service_index: The index of the service in the File. + scope: Dict mapping short and full symbols to message and enum types. + package: Optional package name for the new message EnumDescriptor. + file_desc: The file containing the service descriptor. + + Returns: + The added descriptor. + """ + + if package: + service_name = '.'.join((package, service_proto.name)) + else: + service_name = service_proto.name + + methods = [self._MakeMethodDescriptor(method_proto, service_name, package, + scope, index) + for index, method_proto in enumerate(service_proto.method)] + desc = descriptor.ServiceDescriptor( + name=service_proto.name, + full_name=service_name, + index=service_index, + methods=methods, + options=_OptionsOrNone(service_proto), + file=file_desc, + # pylint: disable=protected-access + create_key=descriptor._internal_create_key) + self._CheckConflictRegister(desc, desc.full_name, desc.file.name) + self._service_descriptors[service_name] = desc + return desc + + def _MakeMethodDescriptor(self, method_proto, service_name, package, scope, + index): + """Creates a method descriptor from a MethodDescriptorProto. + + Args: + method_proto: The proto describing the method. + service_name: The name of the containing service. + package: Optional package name to look up for types. + scope: Scope containing available types. + index: Index of the method in the service. + + Returns: + An initialized MethodDescriptor object. + """ + full_name = '.'.join((service_name, method_proto.name)) + input_type = self._GetTypeFromScope( + package, method_proto.input_type, scope) + output_type = self._GetTypeFromScope( + package, method_proto.output_type, scope) + return descriptor.MethodDescriptor( + name=method_proto.name, + full_name=full_name, + index=index, + containing_service=None, + input_type=input_type, + output_type=output_type, + client_streaming=method_proto.client_streaming, + server_streaming=method_proto.server_streaming, + options=_OptionsOrNone(method_proto), + # pylint: disable=protected-access + create_key=descriptor._internal_create_key) + + def _ExtractSymbols(self, descriptors): + """Pulls out all the symbols from descriptor protos. + + Args: + descriptors: The messages to extract descriptors from. + Yields: + A two element tuple of the type name and descriptor object. + """ + + for desc in descriptors: + yield (_PrefixWithDot(desc.full_name), desc) + for symbol in self._ExtractSymbols(desc.nested_types): + yield symbol + for enum in desc.enum_types: + yield (_PrefixWithDot(enum.full_name), enum) + + def _GetDeps(self, dependencies, visited=None): + """Recursively finds dependencies for file protos. + + Args: + dependencies: The names of the files being depended on. + visited: The names of files already found. + + Yields: + Each direct and indirect dependency. + """ + + visited = visited or set() + for dependency in dependencies: + if dependency not in visited: + visited.add(dependency) + dep_desc = self.FindFileByName(dependency) + yield dep_desc + public_files = [d.name for d in dep_desc.public_dependencies] + yield from self._GetDeps(public_files, visited) + + def _GetTypeFromScope(self, package, type_name, scope): + """Finds a given type name in the current scope. + + Args: + package: The package the proto should be located in. + type_name: The name of the type to be found in the scope. + scope: Dict mapping short and full symbols to message and enum types. + + Returns: + The descriptor for the requested type. + """ + if type_name not in scope: + components = _PrefixWithDot(package).split('.') + while components: + possible_match = '.'.join(components + [type_name]) + if possible_match in scope: + type_name = possible_match + break + else: + components.pop(-1) + return scope[type_name] + + +def _PrefixWithDot(name): + return name if name.startswith('.') else '.%s' % name + + +if _USE_C_DESCRIPTORS: + # TODO: This pool could be constructed from Python code, when we + # support a flag like 'use_cpp_generated_pool=True'. + # pylint: disable=protected-access + _DEFAULT = descriptor._message.default_pool +else: + _DEFAULT = DescriptorPool() + + +def Default(): + return _DEFAULT diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/duration_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/duration_pb2.py new file mode 100644 index 0000000..9522aeb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/duration_pb2.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/duration.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1egoogle/protobuf/duration.proto\x12\x0fgoogle.protobuf\":\n\x08\x44uration\x12\x18\n\x07seconds\x18\x01 \x01(\x03R\x07seconds\x12\x14\n\x05nanos\x18\x02 \x01(\x05R\x05nanosB\x83\x01\n\x13\x63om.google.protobufB\rDurationProtoP\x01Z1google.golang.org/protobuf/types/known/durationpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.duration_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\rDurationProtoP\001Z1google.golang.org/protobuf/types/known/durationpb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' + _globals['_DURATION']._serialized_start=51 + _globals['_DURATION']._serialized_end=109 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/empty_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/empty_pb2.py new file mode 100644 index 0000000..83cc7bb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/empty_pb2.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/empty.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bgoogle/protobuf/empty.proto\x12\x0fgoogle.protobuf\"\x07\n\x05\x45mptyB}\n\x13\x63om.google.protobufB\nEmptyProtoP\x01Z.google.golang.org/protobuf/types/known/emptypb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.empty_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\nEmptyProtoP\001Z.google.golang.org/protobuf/types/known/emptypb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' + _globals['_EMPTY']._serialized_start=48 + _globals['_EMPTY']._serialized_end=55 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/field_mask_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/field_mask_pb2.py new file mode 100644 index 0000000..7cb2e47 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/field_mask_pb2.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/field_mask.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n google/protobuf/field_mask.proto\x12\x0fgoogle.protobuf\"!\n\tFieldMask\x12\x14\n\x05paths\x18\x01 \x03(\tR\x05pathsB\x85\x01\n\x13\x63om.google.protobufB\x0e\x46ieldMaskProtoP\x01Z2google.golang.org/protobuf/types/known/fieldmaskpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.field_mask_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\016FieldMaskProtoP\001Z2google.golang.org/protobuf/types/known/fieldmaskpb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' + _globals['_FIELDMASK']._serialized_start=53 + _globals['_FIELDMASK']._serialized_end=86 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__init__.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__init__.py new file mode 100644 index 0000000..e676e28 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__init__.py @@ -0,0 +1,7 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5eb161bfc4d85d2a437af7c3555f42edf431d5f5 GIT binary patch literal 215 zcmZ9GJqp4=6ohw;f(QYRU~6F>YAb>eEbX)n`FX}Q$?mfI639tBgNN`09>Wtzx>Rmj zr}}1?fqDD>j5)okOFrj}eFpQdZtRi=YuS>Yp3ID#>xNF>KqU!MI9oIpjz}mMp%IyY z5N$z9gEs1pbdXjgB|_DrY@ieg=$39uZiDp(tRP(JI4$BFE#yk&uIYB9lKKil5*ito h5Jf@?ilRWb{d8BUtS)hHChms2&FlbQk8^H3M?Y;AJSPAE literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/_parameterized.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/_parameterized.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1710225c052042a339d0b707d3145f749f80c1be GIT binary patch literal 17383 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 Mw09#IpzZhn9}hqqnE(I) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/containers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/containers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c82ac871f26acdf0171a7f6463c5073947fe159f GIT binary patch literal 32646 zcmdUYdvF}bncvLL>;wD2`~4g~Kmrs5N_f-+(fR1d{ zRg&M=Ju^GAm<0(*cKN1&p4py$_t#&4{rkS|`LCgnU%>SrMqeJTcv%qs7yU3Uul}(5 zuSG$)Dnx|=Au2{)adE)K?$Ut7?(%?)yA*eidImhB-U08ZZ@@QNHc&R|AMlR`1_GnO zf#7IpAT(M&P(E5QP%&CLP&ryPP$dd3L9K|&?;?G=2CCU_xB0t<{q~r@YhA+ALe%?) z5cR3$YIPIhyeqM&!a$ws8tLKBR(GV{`ino0>|E=o))~1_sgO$f=O*)* z1C1<90AYe9!!)rlA%rPc{c4R`JLIyJxS74L!23$a_bu#w72a3B>(cXWWqvjAt2O=F zm|q?I>P^4)30HSR_!nr{BgsTM9808>2!BvDB@z#(Qff*`ClyT{)6|rjNGs9U(2%Op z)0mb_CnL$Ya%!Bsl=Q@yn(FoYPo9pYl%ZH$Rif%pEP({pCVB33EOOeCY9yRihm%?i zfs;dK%6>iNp_m$v^7IuRGoh+cMLnO^!pbO0omLa!L`3aXj*M$mw)ljSK8^A!g>?O4 zP2KPJ->)dji|Uw){Gv)K5{`#8loiRRl>3#FEDi!H;dq=%$AjtbdCqv7*q-(y8B}X@ zESZX>Ri#Vq9qy$pClrc}Dx_kgV`u@^CQ3YZMpaPC-Me~}R9cHAhI9qI117pIV( zSt7Hj#bqdD-iu<#QmjC+L?k{QMH>!l$?>t25>7-Fv_DmKR86JA!_+^&AQI{C4(6pp ziHW@L*|e&KPsLUJDV@~v^08Pdoi9H=o~9Sa!((G8alS(TeM0^6xQfQk`}&hFs_Ahp zk@r16mX0M8;dtI>zV)62IlLU!^6r-sc$fDj&#GEH8II;%gD3HS6#p+rIJt7yqyJd_ zHXg1DsxTmemw<G|^9@UEx?u)wBGWe9eA-}69G2mx! z0(cWt%V;#=z2EviiZMCh$9vz9D;h*vp=gNGR?88x9KS1~o`FjIuEP5Y{H~5xM=No! z!MzIi+6hm0O+IuuoKp3nqiUHt`dLiwz4@v^z4-^@XjwI(YI*PA*>HSZP30@syz*$Q zRr@3QU}klqXJTQi3Y@FLq&O)I;)!3w0)FYtQ4l7?Zdc}ej35qa!>Rr3NiitEEW&=} zkaC<;1@$+TN?}AhiUAa+{_NFbDl{<6QFDR~nx|;Ym=#yf#V}y-B91|T(VsjuqDIo& zIaSh7Ii3XHh^f)8Zj>W^IvK?{Ruf7rtswNM{*vd{-|fD=$$6(O7)ImvRXhXmul*!`o4B-72ZN#I-^e5dX{`y&(fT6 zRhSTNi2XN&8!nB=R%?T!*IR4Gb3QOQIIN~o_)(Oiskjv8s{;tT>V`8Vd?0(ZRy?hr ztJZ-annKPdIMzJ1&G1+!uO}$d7IM~PQ%ttP2!a(~lOk31gwQQ!wt}Nz7B~wYMpaZ! zF-ESW#?%O-9|f(~dqZTjvEg#|A(vDY9JEQG;_`v%1G7>#&^j--@`9Tq2tlYvSg(+* za8*c~?zwpB*sTiVPs)SP~$2MEz~T*-k7A-d&8BN;%b7` z3YDYQNKt|c?{e?pAl{<88GA7Y9f*#3KSRNJwSFEbzm&c_IX$^hs8-&cL^(8D@0;CH zj=10^;3sFg1R=;fVfT^KYUB*cIfNO6MMjZRX_{d%TrvA8m;%BW>PdaHC)8d>IR?>E zn^_4c?-?9SsHi|~F};%Su|oNmJwj#e%=q+$`9k?4X450wC+-$T-e_l;BpFUVJ1AdE zGh=YmOQ*rj{ZAmmDsSl9fr=UVYVb;MA<#B2x2>fg8hRBJJ`M*$u{h~ED`>Tot`Tc> z@Q$viXwc83E9#=5>q4J6(b)(wiK1&#j0uyjZ;M|SMR1R9sXre|CAIY6(0C$3Y&Jg$#rtlF5n5gjW0J^w&YYuriW(UFnh~D14?i;1_CBMiSOEyBhv9(B z`2=6X?6#~|S*mZnI&x)Xu4AG8!KtB3FI^m6lEL@hJa+L|POi(!bu;OCdE4yS1$o=r z<}wNL5u{24>BJ{SsBlG>G2>I!Ss!Eepot^z)xbqG%n(K0tR2ML;*q3>{UTnas^Lrt zOR|rbyfG^`-jbVHkwM=Lc-!AyM>9bpJPPW~`v(UxfsM!MIXE~-BSU|KaT`rW;9WL2 zn2IOUDG(S{L2Dt0hF)I6M57U%FdmzCr{b}Qs*xn5-AC``Q^{mpqjd=7csiUqjpQWA zklJnvLmk8_#2GiSU*2;y^h6FDir>Y<8^ZgpHX2`B=ANA|@15#imVHwFTxwas?Rt8Z zZp*cT99(vZl5h6JvVhy%iz{?nl?;C*V1#&yhe%&P{HN!OLalgQQrof*&P-}mV9%1& zHoIk6z-?~pD&3a-LV5L6*Rm{1?X%JthBO$&`prw+R}UG2 zZxE}pP_)8$!`Ei|dy)ssqgARGGGaBJE26DPw~|YokR82{C2QVr4^*kuMfufQWYHS- zwicza=I)8sS;IuzqV>q32I+*QGLSU+a-)BYroO3DNdw6Zu6e;Ma_D zG~#^|%G!eW&6kAp;y?=~td4xEvCMFi?J`fFU}9kpTg==ap}9eg_Fz$yO5e{`Hs(a8 z3?((?bTS^rdZDmk)te6u(sF2!r=T&BE+4dcvC$Q=4s&{@|5cK#{z$}3j61)k zrAgrr!DlB;?kR!~LJ~ITXOe`&n?WmF4*ukVFbTkV?Dd+elo-5L{M8dHDFiF5v5lr8 zQQg{3sos}q@xZ2OlG=^QnHK8f2_=~@Weq(agitkF27=w_leXDuhSV*A`;3pN8s|<& z(Z<~}mqAJP)@YU{M#ew^@H3i-Fi}i#enT8B)45*Tm?H8hf~F|^ucm}M&4Sy1@#(Bw zJ73qiC~sS8>YVDkCD*g@pLeq*l1*@-X_b+~f5*c{<_XLw4pZld!BLQ!aTUnvU45zs zSqURP<9*>i;x9ZKPpOs?VM9iU!rd}=iEPpK(4nz0H329hOiLq(zpS%VHq?3*48s_~ z74W37*Nb&I0(W)y_IG>voaf*>7Z*}g0Z!7k4FY1w1r12iSFj-SWFhB_WA<$LaWm(k@0 zK=xbf`X`@dLzJ%>Sl@@!Y?V-0`Y^1CmgQ?Gfe&vRC2%iB3EBxX8DCPLq^FnQ+~C3= zTV8660H|?I!SD0v1rjElYrT}U7WUg&zwryvwZGX0H|9g8E+72zshc`e2 zc^@s922<*nZ5+TPghwzsK?vd$#!i`afo4tz7hIFBKH;(yaSdbf`xo6uf{fU*M&mnJ6cj&4NQf)CCQZbekx^yQYy2D`5v}O5a)m8I+MLX` zLT*GlVyYo+axy3W6*Y-i6kY)s^ty0PI4`{-oD(B15$$k6I)_C<=J1o}ft!HWV2RB~ zGfmpGVjYg1WzY=A1=ms=U{{^*WFm~c5Qc+wBC#w6CH5*W#8m>qG<6iHA4~L{mPGR7 zgh6t^lFyZ=fR>#OCx$UK(c~45Ar=9LPih)OiBuBQ-tEuJlybhze3AEIv64V}Q+b)5 zEM(4Pe-AGrr+FgxZa1IF2JoB@8FV$sl9lOa-k(s<>5yECCK(I`V-@rz{JhIx;Q37> zVCqlcU|Hl5e3kRwh9wW=X|FqYyS{n$k#8iXMu7?)5nm90QuV@nTW7ZBs<&pV;qJ^< z@4PABs@^+a^}^J1aNhS;fj_<(zZlPXnzEjz*&U0XPOM3Ca&uO0&dFP{@|Ih2=dbS6 z2*J7)!R-#dAF8|UtGpbV4nZz&I4<51#IkpIe{f9Rke_6ZDtrm0FA$#Ai=WoXHD7jI)rQrlwB%@J+qzS% z8SalM37|7XR^@`bjIT@CJnLSR+t*SBpF&R|#_vj3-Ed_dd66-Lf^0K{CSc9WgqbyS z8s{A}r`_N!n+GmV?4;1Rh5$n~wYISqgU4M)EKlp7A>isZIK|VKyePMoXjtbqeF}+` zB7cr=Vm1<-5R8JniGkoc0r)r5S7@s!m?-I33hf5DAZ+mHL{vS$mO%sOLA#-K7&8Q5 z9982aQUHE<1;w;uJOsF`KjwRp-ggjcbqgFcRIu{$vFT&8HQ8X>)RU}{Y9YYSoLH2b zmI9Si#~At9gg3&vNj*$N$xEZ*u_E!K zz@Qw4+s3HtJ!G2thj6BZpL?rjw!A&Q=xtjn3tn!VZk#V`yItNm-}J~r`M!DIzT3@h zv(a4p1KIWma_x_1+aG=JrG@4rQ&Ey3W_D*i5JigDTOTyH=bC%6%{{s1hqKKOzvo_P zer(+cd}NyvDau99jK*orSepMGECpwis8w`Xr+Ca8_w_+OOQUnlE-k$<>c_H%c%G#P zHsPmjZb-u8uEX18nEwf(R~0zmd%oc1;B;{2#JsQRUZw_f_+LVFYMM!LT+pysu`&V- z0c&$2BwfZZ)ta1{0%B3>MHgvsP9T@{-gdh_-gyLO3$Rk)EgInl69o+ETr7Rs6rV^W zItfL=II_~7CxJR90E@7eJ|pmL_~>ai=wvH@jYRv0Db1LKMDlp2M0eKcvC zmWiwwS$-W4R_$GyeA(sHf@nEfUKU*zcI7L2g`Y-W(PDGNX&EUP@%i-5l@uQBImFG& zktAuAqpCVaPn>R#;*F-l(KR&M6a{rh;^+vLVRDX;L!`*TR>BS#>ZbM4 z6QM7fOwO0cp*fV%1Cwhtn(Q@_+L#83i7RY!(ulKZB!_BWCFg78kd&a&x)k6$hi)Tk zJU%!GEi(;grv7|_L%2kcj4Freg@&&E73qwgC!JBpe0c|HjLM~LA2hZsyK#qiUE{Ks zo}dB@{<4go6j|z;-MlQ|Hdnh!x8)#tN!;r&yItR-zp0eA&3=CF)U{Wa1w3AluF`FJ zs}Grks^@F=-aP+(*Pl<$*Br@)`j*}Brd4%t)k{yc5+YZVCTZJ;ep#xT`TT6;%4?K< z)%C-ae${f&R8?_h*7a)il;pc97ip`Is$Hjb{gIo8ZyaEO-|H(1yy_`KrRpj7m*#d~ zch3Rc>LtC_wwtIHZp(h3w24$*xRI(0x8+8mx&1@8SE~A;rhb|3RFNI4UV5r_Nl%G$ z&wK8+o=|$U8VZDK8=;24mzl6wWcUf=(UVFf1sAV ztwV{dCGbR{;VOiIeoGjrMJi-3S!XLr6LPLcNvX~aOzR~NG%`(B6Et0|`3_^i(z>tH#a4U0`5M#Q3$}O>Ej9+DI;2*MGVMRH6!9Rq%X z1i_D?iXM;9igfTUEsO9hq0?cYi(vH=Y8tkQkh)W0Ee3l{va5=PV~PL#iAfAIm1(f;VFSQzX^-C60}lE+sDd5Wib>j_h9r^FwZM=4Qc)Q>>b5S zaCnGQ23%{J;Zlp4d9yxGolcI!a29Q6Snsly16*5ZHU*H^b~G>qDYH?j@Ph~v0rmiW zZJg+afnA(R5Wi4LZpcSH7Kz6IzcDL7pcPTlOtIqhLyqYOFXMCF44!O?#VhoRO-3~3 zA!n;f(Oid@=mS%$__v5_Y8Bgyw2B=Ml2(yhd1)jN*ldbOSY(2WAKdjSH@$&Z@#QSW z!1P8W(;FuKQA$PE`XVKRJ{^QgM?unDH?vp{f~wP+Kh^A90w;Zi!C|?e3V8J^hoYp6 z#5g@?Xp{{W01be_GKf=R#ZW-1V(DJxs5)^jsYMw9z_4hXTfU8kCx{wJXeS}AFy`5i zCmKTCgo@4XCX>gbYOk&|1qaw{ppc4ymm zFUotcWV8Ucfkk=i`ns@1&-SH2{k*OVXF59D5=TNY=zq0~Q7w8IKZ-9WywT|8PfW3{ z5fghV~cbos4O-9yjbvwEKtvN|!AB0%jL>d9%3trZIlPq)}1^9jZ>I05PttHKw0 z6s4ehDn)@@zaJtB)DYpbp+IT&3yX61`i##`gQT&w@ja6Uq0DBmnj_!S`xlYTi|Jn| zcG1Ob0vx!>1$k2J6J7&Sb-@jDT$jN~E_fzAj?`${3xKLTjx)HqV+|o>N7^*^u!+K3 zkI4c?3t5^dtmDLQbkR! zqBC33IrR*H$jh%zzdH5QQccT>AiFnR^1ffY=^M{aomui! z-q=`zDGDXzl zajxA{cvGr&8&ffBqm&c1mV<_hpvAjO!_W!urZSUs!pls(V7-{2Kuvl#g)i5*-gg)L z04qIHE4+_#-h!lm>p34RoikOH)tUE`Ma$!;<8h+4KgLdwZ<#_3N5;GK&2%tJv1=%~ zg(#NhvEc+Qo3PkYM6DET$<4)MDzs{MhtkxxnUZ zVDr3x%lww3^S)z*gZDEWyr1LXHUg%(m^BQ|1f>c1lj;by43gEpLe3^Qwjr2=$Gz0o z)c4WG0&SAgS~CvK{++^Ws>a6kd8t6!6n?GBeCH)Pbbk(F3D@$Wv;P5#aWZoPiW5xN z0MH^_tyfTUG zvTh#y2S}*9`JPoPSE=|+4(X#OCNooaek%RSTa>^b!m%n*E|VuYKcg3~qS8!>@*DvF z%Fg-nPEw*&O1o&=4Q}6uUIe!v$-kuA^42n`fiwrW&23(#+j6~^D^zeJg$i!V)#QbU z_>wgr)j#2fXhe*9+Y5jCiX2&q02XyK0y>|TWQV8f6+P{ngVndB%b zQ>yW<1{-&-i&)Q?kx!8*0=t& zPWZ6tr|bmVmxJy7rFQs4W08&R@ac8~n8OZTW8X@?oSW1dzxmRDK`2#&n6k79=&ub; z1lN!RtkFYkEnvjXSFVY|btfiIMQ50k&2#txE^XT<&vplaCipc8WAMUWp-CCPXqsXd zU|nI5SOmK!#2c>g0wS^{&u6J(F#DjCGNH5*ft7_8L|CucchD=eOWJ6)jqe>oYpB7*fr$ zG_(_Ljvs#qU9HjR)c%Ydn(_>@akc^KyX5;X$@y1sijBlu;Fqa3yVKN5d=XTWx(_e0 zmf30^2++8N4hE=OYTi!whNZUq>24epz}XsMI5s(o$dSoW{|ygUg)*|K!c*~O?4~c; zJMb*Sx=fNT#By5V6c$Do$eidNH53MGBV@T$*#M^iONqE%fvJ+QFTpU0p(fA!j;a&P zfJ0*)!uGCE!uepIIuss{r(dS6Zw9hYjg*(ropw2QGrTi(*4{7=MmS3yLQ6<=h|A-y z(%1a6Te6|{c~ASVZU<^;>0h-Jtjq=5VB?w#c4dQI*J~Dn_fJKbZ$~!Rkqh=@gFOqu zUidY)S*_+mm9LKw3{dqkTf@FyUL{;PRB>pF^n=YJT(+5E)Yh@osjOoO$15cu-*x?3 z!tU!V8k#lm4aw4?)YOLg^k3lFDm9Z?k**)aj^#|fwHXWkU!`{3j;Lry53JHT-jS1) ztgOt{(q2Ank>7Lmz?B2@fsT2(W351qxV+j#ltqigP4KdnNkRu^LWQE>=hskz!YVND z#c4xCANOi`jP_t~6p@hjSCk+10r)8gnEnz!iZYzGWoXOCoOT)!jZZt+?(e2W0%ZcT zJXm(KZeV&X?LWfvuKCR%zg0>Q+tI!LOVNv80kO_(nSN#7Q~yDzb}GRc1t}VAg)!;r zhj{bJ=!t=%)GtMsBNdt}RzRkhMV(eHlM);F8)hYiZT%h#^)fEa)+7vYd`*N zo9p2}q3SEV`uAY}iqPg|Qeh9gtoDGQ5UOm^^{yV*7$#kKzvk=)nn*KM1umeUfHH@; z=D{3mPe8G0`#)W=z%yT^f-&OTfhV^3<1B-n4up+r;F)$ofcgDXlu_G5aa-YhhDFjI zq(qC#qV0yKy%<>UqiFx!UJPqTm@V@<;%ILRSKhi*jfFeHe=us8PpjE_ZOmBb}A z8t-e-2vRm=Y6`Sr!pS#Kw1{6BIF1QD_Gi{@+o}x3Zd>+VJ|UT)!wc-b=qDHm^FN zU#0rpiJuu#my0ha-bVD|L7ERet)`!(W$+O)vC1?Qif()HJ*ooDbRgiu9{LBffd}X1 z2e}N;fwzF|h}By7;}-^x_9%ldzs66kVOGiAZTEtjRZ?lmnnK%54k6mwzbB`h96vdK zNlpbhq+{o1$VqzYBZnBZMzgH;H{?7+4zVO|$NXb@qTbT-YJ9!=*cfMwJrzfDM;qRA$ocMrna*$ z5_VKI2lHTNcq>cFtVR~Y${dg~+zJ-MGYCqj;5;+;;rctijmV++-2DiCBIxYtm)gnJS2e)Mp9gyRj ztG*Uwhve|z#(_Bqyy|mH&8wAqv|Y0&u=7{i#oLowF@k^dqOPNBbsL)XGl0ejy5dk7 zouTMg13EMoG@&s-W(NBk2bQ(l8JvbIZbMIHj;Mww)$5eoEJ7bF3uQ3vu;3=!OCy#_fz4^1#rB zEA*B@4um%F0UY@)0A1RjBRiCi3Dz@|H7h487zsUwob6CZM@Xcm&~zpy^4B!3i9^^h z5i-(Tlv|e!Y-D4Y$U}^t?|o*nA{-1!kx`za%UHVsNih{MIE4YS8}j)Cn24jrhv2jm z(;_<&lHyo45*_f4IC9Z7LY%wkGR79l?ufpWS(aB!xcxUsz{&WH9Uo$aUmR@QXwt~k z+j<`Bb-o4pHg*0q0$?)pm*@N~S$|8;zb)(EHkVrP-#2xH&P!-=L}lFYr`1-$dSjvX zF{^DxI@hr`+p%}i^UzXrrxla2Z+#@w%24BvJ&klOLKBB+zE$2M{Mn)I!;R7p8$`G^ zfX0-6f+#l$0S0Asi{UWpgUSsiwLzFmLnMQ>HxOB9ru`#wphI7gbc8B$HW`cJ z%poMD(zzVGQrH)Z4YojHQ+S2*jmdC`Rfwg}bd2ZdIFED82Az%=3A3|{$QnI~wBkT( zaT>Cb2+n3^D{^HtHQYNoF=#Xs^W`GKCbYgy5DwWIKGSHSINO`QC7Ppw0*2El1S@Bx z>3#EZEf;jDbFCK>bZNxh1(ISCP^R3T=P!{{0h3~|k`0=nj7nut0uw6A;n%htY>As> z`sqNZq6|r;qWu8n<|4&k;K?>Ps5-1lC-G2HLZ%Q!mz4#V+O=w;m)d)Xt$h!Ul>(Sh znrX1~ffc&+pyWD4$>io%9QKN{r?P?V*X4x(02(KVl3Q9^i)&VpH*3MLqj(eJ-s3QD zr-N{S9_bT3j!V~f(eTreEri`WluRlImA&1fc8==y3e}DBvcpn#HfrKheySTM>Dzvs zo_1`(e|%m(zLuoT(qBT-pSXKU%t6d%!<-wDfqpsJM;2xvqE8>O<-d+{v;LHp0t1hfMBEODX#LW%BxW5KA{ zax7CMlrem&j>@s;H&KoUoyxHro<-&002RKNU@ZrJnHPz_M9!+H3J^SWypt{>(@FMG1t*XKyoY~q0i2aCnBH!d4OFI^pQ6Gnt_`V&R@wYuZrgBW z0937|hfM?uUuY0gvQF}WKCVl zx-pK2jc}v_2XU5(oiv$+IL4_nx2RCX!{R6K%v4&c#IU1Yszi>$uc-vl3admf9!ge% zs#RhcajS5lYM(}T52AQtXuqcHJVb3*AR)*_|y5V~9{R=Nn6?iFeCXqas zVB4rO4TlsQEke8d#<@4&HrjhbLP%zXILOb#$0-cwAQ`a(f%EP`K-u94$=t?8C9)1L zD7OpH`FdtN#wh;~3FzBQ^FdqAWrd7o%GWr_R@eJ7Lyme|wM^jR0E)#nnL^N@lWG^` z`lb2~falLIRpF@fH=bLP{hU=8ElTw<>q4_@DOTY;nVmsgonb&sTtWObdJj5VKTcny zs4Xrt`5vYclLi_y4?)Lm*+AQzJE!c<;xDj!Uf#V&GfWvI1f<~ zDJ-$Ujunqk@$gjliY!Zk6(GlZR(&`$oyVgn&g1$Sys?gJj9+|H2QHnIF1;Zbvn0N# z!^XJz8%BdP+RfiSHtH*^gZ@Qz$axj2uuRvpz%v#CE_@D$jwDK?LCx4{q@LGBEu8Ga zz1_^$zC2sVhXP627HF)C?|MKE9ONc#hA@ocqlbMVY^LX z*kxV#Ig28NL))AO&AWR3XI@2Dmq;1ka=^(rhpZJWYywcv(-F|j?2R{(@qHgF6i-(Fm;A_i zo(l3D9^MdEWS7*qg4yZu{>mBn{{rZnT>x51oN9sVvTy>12cQL`1S`}GWZv8-jN?}kbMy@G!g6$_KLpI%ppKC_I+Sv>lo3q(jYFAom z(QL-PCdP@I@-r@T8vASbl$yq-N=!C|jY;cISO8Y=ZBLR*VciJeBm?a~nZ0no6!T+~ zT3ulZj7m;?)tCZb7t;Zw3Zz*v_U7ZfCb|FP!`7C^xiiKlxDCvI8Z}a;j!6(oCyp%{ zhf-w-hmGUd@oo=C9vK2l(_-HLEXg0-0$C!aMPzLtKjeW!KygTsT@=|&IkZ@d$~zB} z1J`;@pbV+g2*u>gHzzMn&U;(d&W6_ScLARE1}}a2^$8r{eJOo$bV}8K&pbJM@*f>X z7{KiaZR(7B^KTLInUu z>j#ahZbN~Hqi5RI)Y&>QevN8fh1j~BfDf*@vw`+`xqThhJg`pjJ}vcvrd<761xk({ zrNPUEA}4u>nXqIU*3^%GbL|q&@Y(|n8TR5kJIt&*K zYaNXy9VHy=R|jN6dXe~og4Ov&q-f~z?R-5S8t3bFzF05P=;!4@Iw{9C12H;>@7Jk8 zuzEvR->%&>*K@P%y*&%HPrwq^cJ2)`w+l4R%Z+O(fZAdU{#S_tjzZ3|wnstuo-_~C zG&l$#UkLgaL@N&~@R4tdS0Q)2RZWoYccpV8$IbAy8^!>*EX>9@C-l4+vyu7VpfDNR zDnsYX3^o4-Rr@{!`QP+8o7g$nkRI-LC_B)4Xrj8zyvFu{TB z`HQPmT?KK8jRmJJ;OGPUhhN-eQhCex!kc6L-bQp{KL)B$(5E@mxKRh1d8VXE7k#7< zN39aI6kUb&Kw<82#u>~sk=~@l@dNGekX*N%m+2@9&K&l^C-0#z-r+cC{b&^i{{Lfo z5o9`Uy_3OL2|cUa{s)nX6DJON3R_HcE_!< z2bX-I%Yo@Y&expvHQ(~JE_)FOhJ>|^^to2nr2XCH#nSO%D&P@vn4G+sp4jS!*nmb` zPPxq^KGvcmJ5 zF-C0osSx<75cv=!o!zqMX7c-|vJX9bM_`_J z(o#wkyXQu49?oui_`QxFRcH4hLGrs3mm;FLYo>fwo7**eHe0#v4i*aHt~MNlLlUx1dy zrPi>stpM5`(@DH$l1;)*+YPneG|IMVJ)KTwlWCjI>`Vg)P5~j@MoyeeJnc+q$=OZZ zWVgTXocjU@LXz#I`J>m?;laJJn%2Opr?ta50 z2yY8P;hYdOoHGQCLDQ7+oRR%CoipLDdCELpb*{=FAYO&I<(!4ZEr?ssSy|jVWt+C2 zvm1nveX>reLi>Bp8MJ*}IOhu55xR{+$Q5*iJntBJigVR?;|@A?Z@esxOZTRRrE%-t z_<|mkRvWBFSQqpntPj>8YzX=gHU?`EHra*XK(OxXhI7rxUl+1Y?$BDL#6mu`B^xTF z@~Wv?E2OGXQ?*q{RjsDlh*b6Kw5ta1A68na{e1^BM$b91Lf-0ox%v zoAqYQdOwS`AT|)(0C*S-wjvxtIhM(_P4Og1z{)KiG%xK+uoy;oxS3j|8_MJQ(apID%G< zsC_+j#pE9f{GnYC4o8C_aXc!C!O&PV7>-;JFGX4@vkPo({*uFNR`+ z4#(Mva7;wPkchu8hNLTE3}2@Lk{FMQp$L7E1}|L^2L?nb6bOp(iI5nKj>T9N@rgiO zoQ?)(rch;Aip5djh}g+$4oRIag?9wSpAB2I-O@`(7w@VIz6)QjS1{HZemF*b94 zKrWCPB}ZAqsQ*e`(esm`u{b(`sk}T99-EL0x)hLND2TFZW4l+$HaN;&#>BqBi_vh9 zrf?zWZ9L3`|Xl(QyZx?Wqul zk?1%LX`E;5r_sdcD`Mah3X}*&Vxh4aUJRi3bTm%$hV*jhVj|TQpOB)L(XT5gp7Ntr zQ&Z8)7(@c$6Omx(rK6G*l`sYP5gtQRY24xxV4pQxH(P+tnX&j_NKXHBMYO%B|*t3>^wjr@RArfADxMd z2msaM*hGkR1cMNc_X0zNBO$7n(8i@eEbiz;iJf8~1}Gvhj)_;IGqi>Q&uq0|)ML@< zP&9(YI)%1g4r4we(Rg@_+D*8J&w@ki!4yVU5~C4x{0y?jCuksNF0nbH<^m2ex`c@I zLxDNLV$h~dhFEQ098?`(0|+rrWld9`l{wT6f9ZG=II-!)NY2n2Q^1G;8v7E(0G7vu zrvev4^6d5T^%9wxJ|B_*w6RfT0k9tgF(IJHi=iw1A{NkSFf<;RnOYA&>I=i%RWQz_G$Z2S|4a$P2L ziYI4zSZnc$+A~8iF%bfK1QyawG+!q)sKD2}vqUYZ;U!NW180KhvG@$YgI0D(JVqTq z5{ivU;Y&bUpp$U|I|fUP0)%60iyFtO6k`+786dnMuoD0V1cOk=Aaz|gE7Y429T{Yp zIF89C6j6e!u_yvqEK&fl48R5$uC1BlPfCbNfZYM&5v&jyGs&PJz8ILA;fw$}LW>c7 ztTZC>`X_X&z#7kliU^-;BnJeV%|aluwry%_f>Cr2g9zL~2;d6VUl{y>9}I#F|1xty zrGcdg5w<{=ILvXxEUy@^Jp|EY}a*i-<76}70# z6J3%)K&g;0ord+r3)Fl@IMF1)65_z|Sk>nNGJy;IKvaAXSlb!@q|T)S@01|~gfaXF zT0pr7a8>ja1+x*m6a~G|@I*fw>~Q48=tXd30O46Ia?tO{!3)vog{jcsSae$KJIP*& z&jh4k!2cmJpr`$Yf&<+nh6gAbzpV23BI>*xmO`T#rs+VOzR2S;CJR)Ifu*H?H79IoGf%l5b(ATFz zK{zrtH3KFSqX6asaKjN@kS8RF0Imj6IUkN+2ALWF$SK5#R_Fzg`3NX+>>?7OBS;v+ zsG%Ib7zi1L1}_W}mY5>$Rz=#w+o?=qxd`nksg+p=E6c$YCDDpx=wK!W)F5(Vr7cA; zz|;~>14{`?5EQYP2%^BiI4xnyG!Aql_C@iV^OJHRV;DmKJ`%-dK#vsqDb7UV;VIBp zWcTxiqcmkaUwkjgRXknd;Rh#BzJOkZO)bH-HFtcSiDg_LE^_zvFELm)B- za5;k#f>kV+2{FsX=LJD>#^qFk5VR^eUNyWva@}@XBFOuYzJK^K1qlkQ6dXh_+kG|) z%1fNr`76X!G0elpf>sTOw!!O$f@_pR6yu8g)`Erelm!z;reMKB19>b|#U{ez@q*!e z!A!7JaPs$~gjQlyCnFb$#3wUD(~pzN+su#NFC-OGWLU+oO zwA`v`U3?~6)19>By$y?|DRy-}~4I^34p|tJLYQ5le z-9_!fb-{0v2zN-06cAX&2=u=46;W!!--4&OH&QEJK1Qi(5d3XI`0F~i>9Aq7Rd6(< zjrCFs-mZaThM@N1%QeF_(={`}@*MunLT^P-J8!1n6yxvaO-WPIkTj1&FQp}74rU=C8jY;@WM05?*u_Z8xFK+{R1L?{r8~_g#DtUA$yZDRY_2O?p z)-A%Mik4BJ{3t4=t3clzq5DmNUj>qWisU%P$B5$+xDX<2)1m38bmhfx=rU(qIB`O% zJ`nm*hOu?@DL!)v91KzaXBAS+N|6GWW$Z5Vu*eK?6%`QqWJD4i7U6rmnpQ}8;4%v0 zM1cq?K1GOwfRMn%T|KJ>qkT5D-Ff*GCmWl29QST!Pp-z!ARK#|o!524t#4QUI~0S^=n2$$D7qi$VV|#$*gi6<}Ra zR97gRYhA#VfWClbBE=C=01r)Rs-ld_;h{t4eS*Hgcngy=1-Q zT8@52)}ih^$w(KQpAqRoj5He~hwkuSF`}(l)t!RVlh_0rnT(~J z3&ESVmb}@T-1f?&iNmWV!CuW@XKgLFjaA8-SNalNw>@(m{h?l@PaJ$Tbn`ZNTtN;qCFazk}5G2Dl`^7||7!4hh zC!s@`VM<+aIwdnKg87DcKs*p6)w9H|lB@^?4!sxYJq<8Dyn<0i7Lj(1P|LrQz)12^ z_{DILIBA(pCH`D4M-*jljgyc*S}J1}bX|D}Gcx-6>xjH%Bw~N9>YDwUgOGC;{Mo^a=asB#d#+y z*_?DFo#R!Eg|N<9&j`sXdJm?;gxYL#Hb_S1(__?R<)N;y<~N|Ix4@^&naiQtlwGOn zYSmm-q6w+gCM!jO6|jTTcFviUv`V9|R^h#a2!QhDd0^?Q7I5p9IRoRsF%)ygi?G>% z16SJ@G$P>hd(R>sf46KJX<#@0MaR*fftofv9v)lsVNDsog}P$j zMnD{ux8-fmo1Vp3*4ve=$~(Qu19@L-&exmq^)8#PfAQVM?7&FYcPP2(R!jf#GdIp; zTlS=?lT8c5d7F3PFrv1+vvy%@{^1pGYr1V)*1J9J*q-;)EIc|NxwWBp*>b~_-LNAy znB2W^IPa)_qd(QZaQQt)`)ZX??OS;CwFo#KSM@^E{KI)q?ZTmCn3c0X>phTm9LQJu zk`9jQRMhx*6-E;RoYH( zX>g=r3U*Mi3qiq3paxPWp#_5U5CtRxNj>Z%Q8QSJVi41dU{D6aS`I)@$>tLdhDSan z7#5ZC`=~JX8iEG`L+P5qpyKy+%{!qrz3dlNM1X&iLrfIP^$sV~@R!a0KSj!l6}91V{v8h#B3VkFgZtfQhFC!cLT%lkj&EVJBM6dwBm z0?e+42{N{(WHV5K)3Z=JzekTWZaFu6>qOpB_r_pqaItnV_@1K+xWQYSbbv)_>q%~2 zIFlOEFoNG)a2Fv|i6*LG1N(J|7`K86FzxpgT;qf{N4cG%;MAER3U>V976jdzIEqrF zeH0v|;1~saD4@k6JwgGkqJmvzd154WVHm#xMTH1?@1TOdt4nb5Z0~)JCkaroXAt}( zA-r$(u59Q_Tbh1s^jK>l{dwBcmW{XUbt}H+oUfB)+5I<~v%Y-^pw8Nb6F=`sT%e>I zRs{->z9VfBe`K~Hvrq6eqa+67*A2(G3~Q23p(YL$r>SCMAapvHB6=e|iI2ol#YotP z&SkYu=o|QvX`88eb=)90n$t#J{Ft5%p_!rIcQ+$|;sq*1@TEpsGi=gSdstQ`Wf73J zc=n$&MN3f=n7k1P2ALqh3@}{R4Kphwyzwg>?#YtERrqWfI3R{_tuI-XNydU^Toj)s zJuMXMML8j3oeN($7r4Ne0&$#0GPH^iwxTzr4h2FmuR#dLt0ug!($t%CCQ@x)H=O3f zZqcn?LN5~e-Eh!y>6;THgbuh86{vEah(JHj+cvvt^b~bE9D?zQJ6fnJK3y`>@5j0k z&{AybUV3KvOtxuT#$2CxCi(0wSJPrc)+H|Wrk$J9=FJQ`{027DAUYawkSrrTO-0cN z0NiD%$6MM4i9q*#O4x{i6mwpqY0JkJ!O^s6U)qQ&SBK5gHZ;aRCd9_+gfmOrj|FR;9%=)G!~xK^xz6rVNgTZkD23$ovj3| z22jr!tu0~;z)3!q@oY>SzvXUT>{;qru3dgM-MKUC-gV=JjC&6$t9=W{)6Ukkxs^k% zxnSYLRIowUJw^>GSa>5jOjmK3ehxLThDqlr_C*AxIy>Lm7E7Z@_g9pbS_qBZ$6mqP z@W#ujmlt2mR`(<}uhcZY-S%c%qW?!eld0`vTN$87M)gsF{ybih$xH{vWdMHO0E3!= zfv`?8iqpKaXOa}ICC{8X+YF^%lT{_6W+~;e|M*lCDk?@U85}c1H?vEU{s|(vMD{6U zJ3j;T86of_FBCqsOk)skhqIsfELog z0hcfPG%(b+e%EhPHH+bqYkp_?Jfj*?=^C4p` zXhvWD>4)^^E(T9XFsmSAX7Gc(`su83|2RlmH$Id3E*+D!x`LCn zjccH}rGxN=k%)0xRzmRbcl|iXh((`Dz^koW&0hCDkEqI?j@zl|?&pml`^w^1?IeKJx zJERk04;Vg;(L{&`xgNt^G(1uSpKLT7enc=FAA1B}6GxgKn?)eaL*OKvzUj<0?Z`Ck zxN$LSKa@5e;tT_FsLww>?!34j?hHm}$hYycA+_u7M(;l}e(Ws4k1d}D zKQb(4tANGqfzGm6OdczS#^m_tipLZcv0_B{heKpU9O1gf=l;_pF{0TLX|o0f-sU30+S{v2qRdFx?H?T_lLW>Mvt%#R6nJ zypXQ#$<+>KY6r8mTN951c{v&u0*i*Uy=C!Y#_rF9bL&_fNxL^L_1<*rex^G|Zn{U- z!AGvFdtf<`ac}*!_-NM-X&NmqLPVb8zDh45!A|NMC_KYNE*&On1t!|NE+W$N02F6L z=zk&t+l$WDaLx6$kTQ|Awe*>{!wONO@eA_~SRe$*C=N&|RYi7)eVP({QeUrJWJ-t= z2(f1pHviH`k#6Rlae^}Tq@3@d-}KD808PE~P;gEg3GL9ZxxJE#AA=2;ra3lJUP`7Pl4&h{g618+3iPl%pK4 z4d&Aa?XZ&%tv;NyDg84Dk>8m!O_IvLP?)Tf)4;&U6H5^W@9x&tGM`Q`wOuJJmX^7g;lkf_quD z0>53BY;sK{JSMTsKs(`f!i6cuH*-f`&6+Lq&U!)MK|}$CgnlY%fP?{hU>RdZe6|@! zwX~BxxrCRO8>`!ea*A)6$4pBD2>dlVa}6!t zLcOf5)_Xn;Z!dTm-w*?>mUYz3xKpSemHR4hrD57_=}{`4G2hiH^Zm@oQzuTJyd%mF}pj9xMu6H}Y-#m^YwF$NPXfLcgaW->+lY|l|-Uc-Ly7dqSL7!m4kAds1m z<~Jg#$l{r-r-L~bCfi`l%y~CuyqlKBuJ5~XIlJYNtoLBD>Q>X{eE`Jd*Yt{Mcl0 z9x~i^*X7*38Fz2mJ+$H<&iM~#{D-stqf}2%-cgftbY~phIfp;v@aH`(-#nRX-JNOO z{ca=AzS<$Uy$gM>onGw`9PZ>x^BeQU-QZT&k6l9bhV+KLSX={@b4VoTo42>C1VxW;|PO_|l#oACM2HoIdaNCMLOjrnid{9b?)^Y{V4avaD;T zRox{jQho<0d|4j`yG|2Uh6Aw9SyHxgY?Dl@$p}{R=qnSpRya`|I@#J%Jk3g z(NVoCfE|gzg1akxm10bCy-G0x9_ecoyi5VDBWaETB9RwFyI*6tvZ&GuEGJ4KEPi$r-EADr^Qk$$CZ`;A@i4rkjQ$=F&zMS35A ziZJY6N+)WUo=vw5S07=O{4@w6vRd1uW+?_yWlxpB#V z)465&^1EH%`5MY!h|Pa##kVotKAiRKNV|6AYnqaSs{?RYu7LVIg!;*S&2Y6!v*ndR z(|Y#_8L^NPz9KZeYDn4OK4D?*6DrchEXq&H8C0!!vipQ3WnTyFgCxMU!nq%LnWKfN zoG2$Fc(YPN+^NLM2~#OYTt%$qgf&$dvjPRH(z;TjAWRaWEO{V^krN1cS(ic33VJUg z6e`lz3Im}a0|R>|Ta=jgS1AdELhU13S*E1PHZ7MDyI0SP2nD(AnWV2HFXNX_gYjf& zf)>4Wm;#0{7_Oj^*En8|9JbNB^^l0(Yp>K9>J?-xI2f18xLA%Oj#6>O7^J)_9`gg4 z6)PYN###R!AqpH;BD1K?t%>ML%g_zWyQXZ*{*0wDF$>2zyDJ%+Z`O02x9rW|+MKuf z-teS63$eu`@7X$-qswi3?ZTB@MYR4?H!A$<;=|+nB5Fxmn$l z@9s(VzUSyzsoRjN>(115FFn7qX=`rN!OW(E;5+LN8Itzfw(6X%J!5On*?Kazp1iwZ z(X#mRaxC36oNL;bY1)@6=?PLb@?a*|AB%!dl1;vQ|FA$7!s~&FKkzfFB#f;U_84;}mFK zYHX7B(Yu2b9HW5E8Ivza{9tZ5%zy1GIyW5I_~6t{nsg1RzeJN1MdYV!zeTn0jp@{M z!hfsEv(ns?HaGm(xV5TgRiNO!L2$LfvV66YW?n4b3>11h91j$PbN;R zz(VbREs{9?V`EQM^G5=L)ziq=Md%6XwmA0e&GWH{;%;m_!FB^UZ-$&IPufmjk)$}#fWy59R zCDU`lWdl0ZbXeZdPX<#`Da=H|WCR$Tt(u9C4?HyMBn<)U+FtRrzluxcCRoY~zNdLo zF4nR=h6Vfh%+%Cq1Ut29e_Y1lWCx$FrX9L}=9| zxM~uQ|INov!L{*@V5)NcX;1HR?QgYxr!8HxI}!N$1h)A7pH(Y9d=jfefj{r+5WZy} zv6#NoIASpUo}miSBCRkI?V-S8_H6Y=DkJX}kIZ#ohe@^vZQ_|enH&ptYO=M&hnDB%;x;D7=83LF^8TUYT>C>kK?mypOt0}?>wC-70Q2~C^Q z#=4Kq4pYrXO@gN}ZEQ%k-Kz5H7=x9L{#?hgOvf?sTs4mx5+^>;m;(@w2GQS%o`TBx?4!)3aS`2APbkuDX9CM zJ|i_yHF{DO=)Wk|!Lv{=4{X8t3PhJ|Mq4=-8M^?kYet(p3*+4}A8*@iy@ zbx;}4Z=?P47LT=H@?g}#`T(0fXtyDGIf62j+gPLkkh&d2p%xIOHNm+XZTCCwhjNq< z4N`7v)6YD%81kI$s5JSEWIRWc9_Ew&`H&3k_1Ms{RHEc6B^%Nr_0@UbRG@?a$W&4x z0Nh8-rSGitYpCD=b?zJ@f3Knc_uV*J;z98~c4BCF|3~IEc%N{+@~9%95txwSed{$Q z0s`;j4S&kH!q4fXopSPxf(7TTaTQ0U)IFF*lw{un)KtbYqSj>B)ug8+R!|bS;xk%e zVU8}?yNXS*@_Pu9v12aZuz9)R5-?tsN+)sgFl_lG^nRn1rynsJ)6U5vPF(b#j*dL(K2PJ0rzn}KDr}m9-D*W0- zZdoPi=*C#qvo~qF?WWQbHWO7uY zPW^D^?8sAR`KL;B^&k~|i~?=Udg$jP2$V4^maAO);gSf8jnnWDdLp`N5o%kMZHy~j zgSoDeOxFm+r`p4Y#J~sW{;90DGqI%t-5tqvP=*?0(92sslD81R??INg9FVsf^zxRT z?oyn|Ti-!Mqq{}Y7W71_vi0+lwro0SOOtJ!wlh zyO60P2aB|C7Ic!W{vM)`>+hgfTU3!k{y&hnRBEVFG4x1&xGbhn!#Td?M}K;S>b(fH zdF6fjnj{vwZsPm!KWTnCq8`Co;Z67xTEsaALw>#_H_wMDJ&SO}&HErp( zhqB&1X~&-XqC@SK>Cm5|J8Z{d`EyP_BP4={TPx6!ckt&T_unt9fmZz+bhC(7F#(Q1 zq>|Q;(W>=Cc?It(0=!Ow>#7V?j9UE;0n^VuC@{T$KMF$GsqVJjle4#F>}`wVOJmEs zvv%kMZ`vOQ43W>-uB>Nw+O}IGU|hO$tS{XiL}NJ>DiQ2tNmeF6T(0vJ4}tXC$ov*{ znIyZvV-$!f_9{@Abu@alAT9z0eVoGJd^S)RsP|N3A3ya^728muN@h0Vt*q9wT(jOw zxC?!Q6D|3V;ZLeC(su0fVfRmzEg@9W^fEv zklcxJmMooyH5v{g(e{0E8M-vw{-d_$fH~mE0nFLoAyyR+Vd9{HrE_X}Y`FBu;Ea=ApC=htK8cDr zHTDEmEiY&}`naY9vsS_!`oHFTmF~N#oZh^wyse(}bJaQLeC21M2Pnsfs9S8Vy5?Mo zQ*+L8exz63+NPX2chI8DN~~U6E|WD%f3?4JZl&e0Hk!-24>{-Dl^lnZny7W2w5%bMvHsxt zDdg@CV(SOaWgL@mV)Q6Gc3%1|l4Vi4__~kKwpP z^~Iqpr`f#^%x+Y0$wjmM83ik@VhP0Iky5R^rnALy25X`EcqlH9{b4%qo*SJ0J#~)B zFw85DOizWnQ%BF7899D*^vuz-qp-`K8a+F5d|kgh?%ex})Qj46?GuFtr8xlWQ6lMZ zeWBAft@6+n+-d^$-l_ZqoN-qNVvw;DMHv--0NQ_~mp)dWqB~@&M0TiC!OhPwkoptFZ`0x5}iQEHOga>jPd@ru%Tm8#NGOe`TC22}sWC=Ilbix7A{eh=((XwP( zIAY@!OqZ;4Tx~`(aK^UHnLP9Al@(W0x_Kb$8cbUTZ(EW0)vN5)zN~A1 z+Oj`yty?tSw6^Hq-6lu6&WyJ+=iQU>?s>O2>phe>aog%mTU!;MlIOCXUS(5HqnK+P z$TSWlT`ScM3v=mByWXqbz2a!*TV9s?-*fC%H~!>Z^$T;k#^FrkaJF$LX@zzttMuZ> z^o^5Q`@!#@ylH=;So}bbT-Axk&^zpPad+Qzcjr61lh*fa?RkqkXKBk=+Hw{gecrv| zY+q_f_dWb>EZuQ9*Ksn_aWdO+D(yH8&qwQ%hTC>;&fb-=cctxHRyGagHa(Kr^hkEo z2o=@IiV`yxF=yF?Q`F(#z2d0PIfgQhAv$ZlZSkvV$CjL9IO7=3I(B|+HCcC)=M~z; zJt^%anmz6lOAAZ7P63f6?oja`5cAs#4ji^2UrAD^=Af=2k^e@i|1$+ljQTGW`>z!I z0RrXZZgP;2JtXSOLbLP(r2YYc?+hX&P_+t;8|B?kFMM}PZu8O1=A+q$V`*cpwk?W% zcp|g;iEP7@^Z_{WP=_!!(RKJYas238uo5nZWkOAP(keAHm7 zUKLn)+9){ckedz87;0A^;wp(pyn6=$9XNIkXCZ0aXIatcenl+Zab;!8xnB{>c#rnn zuZV>cfs#gcm@J7-FeJmpx@vaodUBJz5wMg{4VDTOsvLEF@M-$4N7{|Sm0V*;*>B$jur zlIiy-`R`M}6#3t$7}GQ{%%I@|YMGAQapj79K&=c@jOOi@f0RWQr58}>GH%Cujr|=e zA)ThfnK-Gxgg07K4nGB>nf*KF7) zgey2S%u)`)&I#qj^f=)t_DojNYgu*X7FB$mx9PQ1C|}*lqm+qLGAux{W~QYwkfXvl zlnFq$a2aQZs&%f1Zl?p4T@-E-Muq+_<*InT8IFQ2d$6~*br$9zcKkPK7)zd%1IikA z8HYFvQwBNL;9WYj8>SJ$rgS>Fs&-MaXpsrFs+{se!CDYy%O8h9cvwBAK~*kjHRx17 zDZAtcj;t!T@2VMXoUAVCFn%JnD#UAF6*`3@IGW3+Sg)S_RHiLe&Blbbx!Ra>gh$@y zN@E1^A5Psk%l-9txSHQCG1;lucdt-&m=5IS5*68-3%0}2OIMEJ9s?$@_`U0kNETe7 zHXXab1sjH>nU91A=h!NO3*b%X22R3Hsk>D%ojf*cX#g>m}?K|GJ-n2hb%+0@VZ-g|H z9DidnHJPzB^W92IyMAN;xAy;$ZR_pU&R=`{7azxBRuZh@+LgM63mI1%E;NFv-MVNZ zQ@j19-M{?oyQc4a8M`Br9_)3LZ-2opID~GQjlE#O=>@oBQIm2x2|i8%~i zsN6W8ls}>*|APVo1kQ%DDPyFV+0==lprclS*cCq9q0NnS3!l%>Y&?g^PuPAYdvgM3 zykW!sMx2|OZXe3E@5;3AT4~>$Yd?}{KLVks`j{c%{{SZ)*k3!H=;hq??V65U&0wZx zFwy^G;P1ve0s_L}wP~YoEeX(H~e3dOZ{OWTnxFD->OV-h! zHuqyYVuGLfJEos3iqpTlTM@{|ak9zL4W`WWW1FrHS+l{!4O#MFvdd_9?YNK8d;t|P zB^tYDN?O6s;sJB90Xs&w+v04mKf(8ZffnA~ga`wClZ9WMQn{0mRMkg?;z#jH?j&MY z?;@rG6=v`??QZHAQ)oTD#8xN zHsDrVS!_KSxhjK}5?Ed`f#}WyAnF&R_7f@N3ko-EVL?64YCED-CjAA{e3Qm&CnAi~ zt=UL+=&X11D_asflC^nUxl@N|S7o@NaZ(-?Zl1!Mw*|<$>QY$4OJU?RgBHV%MsQ-( zay+;;5jW1roC6*CZ@y}Hy%*=6Z)RghH>NVPV#UECS#WO@fHalN`T^;F{(dLch-&ak0Gx#3JZs*TOD%Gs*MRa03b9t> z-J4>~_~irG;ictYyDkV1uyt{Vt&2Hh9547&Ze=j2tF5pO2v5s*?iH0q7^~!w%OVDo zJ>@W0*|N&`d&p&}#~IysS!E<`R@PvJK4Pu2HHIr?XVG$SnM4~(9vu#$bewf5H!{AG zjQA<{re67S-@R#2a%g{9S%xbH?F0@zvxMyphviirC_db-!m3`oq=Eg3tzpK<*~Vw3 zDDJmVZ(gGv>C8LPtvh6gt@atp^8p1@2;iiz<1~i1OTS28x+(Y$1+@0KnSoJcJ&~c+ zEUi+&$TDFOZ81y#i#|~B`?PY~0qBgnSgL_3BEimP^}_soQbWx?{!1cRc%c%B^(i(mLg| z3Z8NLJ|LESYu2$XZQiyPO1Km_$7LO9!Cyb9OM>ka=$3Ua@$9bMuMC@_-mxNMH6U6giWA> z--P-PCpN%Y>fWs4d20C<3P=l7rVl!?0YLp@B>EF{L%L0=TM(?dK!f4qe^`lNc>AEl z8lI$9u(kWA6#Fv-MeM&sS{4@kC5=6)lGxbeOutXf^;7>?AIV!s&x`4`dH}F}j0YW` ziQtA)+@?d9M98FFLoPAGQvqDJ&TecBy)+iOM2QDyTfjbu6S(dbm-FEEf}oaVaJ`AD zA7v$-;2EBU%iLMG%1NJ~m48K@C$z(8zP&zOzb$J6!Qakj5FgaXh8XMJJRi&KaU!f9N^xHO&d4ku3JoqlZoTD+2R`j>ldbm1&g z=f1Rg9|L-D@T4?idJrb$G67B^G|iA4TQ`j27u;~p8D$qWoEkZE5}Sspfzsbo@Dl_a z;V9Zg+|{6KwcPrwA3cxEF=s5Z&|T;S1i>mzG20(VYSBIY{R|l=u7R! zoNr6UwXL-~x=#5nJ9gF%H-WZNjt(jscYef~%%h4o`g3{V zgT;9vuAT$kxI#IZp!6igo}plrf(QjKQgDreIRph4b~_Gl=Osw&*RCDPFZa_$AK6ds zt4n|LSiya!I4%8D)5=U6(+jDUNyO6?JhHM#sk8b_ajJs+LM^M{(%)ZFa2MSOfIH5k z(W!#-5JI^`c02~#B+YhoF{gUI;f%40ze^+W0}B3-f?E`5!1@9G{0j<5<-qw$#v^L5 z%cve9eg=OWUKxu*1e-0gPi*^fOWMp-=wYb|Ad3Hm*nX_+Rg=MB_{h7}U|tOx1kcul zO|4_84R@LPb|k8AHT5q)g~M!`cBX~;JC;U6)1AHh4b6AH zW^fv|-f3+>uzj=Pu;I=*!zTP$eaawo_TDu;YBV%{^t@T{Zp@pjbLRGpxjo&n3;KBP zLkSmZD0;tx-tS`X(WtNH+V^JK_rCi?*84b`=G~~i!S=Yv67KiCqFN?S65f*A{#a)F zW90wzxS`~0+YM)K>!X>ikJ8u2@bx2)P`hdAi@8lBnN1_#-;wn_n(*B6b>Hhv^_n!* zx2juTdpY4k^RiwM)q1p!V(iSQuzFX5BM=CldCJg_@XLlF zyq+)!O??ZO6_220cm$oyY&n^2d^|1G-7$a3V5qxu(9~_%aOX)wpP}~7^9F~(eW%HS zz-KZXG~97n5v{Wse0Li>hR!>kb%y#ogC>LPj*F!+QyP!SFnq_c(NO!*L4)9KdF_c; I>;M1& literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/encoder.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/encoder.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..272752e7794f13b521a385402526eded29529400 GIT binary patch literal 32666 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/enum_type_wrapper.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/enum_type_wrapper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc0e7688781ae03c48c487cdf077a3e149e8ad8b GIT binary patch literal 4417 zcmd57&-6`tji6uIJ3imV?iaqN*S1!gRfwVNMX5)2EGT>n8Tq%>`WwhM|oq*f+( znVF$wGIA=UY8wYBlpYGVKn^X^qBe}8Ip$QLmt1-g>!MT$9}F}=uZrZhu1l7lhi5LCMI?vhj}qi80HQp*YXY{xWKKf z#fvyyuv6S}Y!=tF3pV3PI|bvCl;9L4Nlr|hWH?V9SdUxKvt;oF%ohk|$sED95HLVA zxZ5m{qTF9|Y%vWsOl6ad5f;bzoI`PeB{O6QGeSl*j44THiQM1dgzx&QAh!K~r5t zb1kMHWXKGF44Xlan%M%f)eM1*yo1t;8D0&|>F=Ox%3O37#k6YMBv|iNFy1#^qm~lm zk8B6`Nn5sQ*%@g8VGV|zv}=m1$!r0xJ(a2*uy$Ah+cpMq6D=#t$Pn$a$eL2C6_uE; zGI%Ti5-xON9(U#o>4ar-LhWQWQQzF~oD?9hh77}kYZ^xB zV8cb@wH^#dW$hqV(EaWsD-)~J8{+eW>1}93drTaH25I7NfhljIFj_{7Vo*a_+zpG@ zx2*Jnw&-sd3e{P36!BoKeE?BaL9Zj*zl5%-ucIY}hiiSy3YV-F^*i1k>@){{yTw!% z+iLow?>=X2auWVjZPv1K$8#3YyjW0cd0XKJYU51bm)j9m_wMm%^_W_EX@>9uwINtw z#;M>y%CUJ8klaNF!3OYC0Xvq2h?h^Dzn)i3y24P7F| zNlG1B)huRt5wEJkzSXecx!V_nMRQ4B^}9TJO>kNE#C)_xEFW|i^*BTY{8j%HY*6ZK z^kLCD2>t8>5G!cYuLfE-^rzO08%9MRF6+a$(q;X{iat`-N7jQQ5AU@e*g{I6_0yoX zsls>XK@df{-%o##`g3dly-3%FcBZ0DmbJ-^Xvdm!!>L63%hCQ{P2B4K@bX8`ZL3P_ z$hPX!M>mnLW%PlD^q%#eS1LUh%RLu2wCGymMxvq}E^CK>5rnY^k8LAGk8L8QCAJ-b z1HRoqh<+VDp?;*CQ1|dkc)#S;C!qZAc?G;_g^e4^KD-eZX(&y-*thd?&5Oko=6X@e zp_H(^;{|p{#`cVL6~dzQW8p^eoko{*=kE4NG0t_#7S|=CyId0bXg3^@ieNyygb;+K zQ4pSwNqvul1*9LAx*9!9Hopin*>^!Sy4dlue*D%%SwB(HPnGpk>%mixyVz%1=X%$8 zrR#jT>-0hqz7S(RQ;8LiU?BDF&039H|-0D z+X=L$q7L|){6ND0e*x8dO`#H5K?dyX8m(q~!LcWS z1v9@iSo8>3$mJjgZ8s{itJK{{Gxwb5#o#Xj%h9`$qm8i8qcD39B;v7>>{$WjzhuwT z`?Ci)RZm-B1Fxigz^X${S@mI4sE!Ff4Y^3ga6V~KndsK?{wLve4A>>e#l5*tBAUm} zed*?xbaN3D5wkgr)c_==IrezGl+80RkDUeapXe1mT+#c>djI;s3zdP<^1$eyB4dr1 zGD)=~qyFa4^kaC|%z7%<3@tA$6^U&_k!fi?-E5MUK1w_H zO9Dkw-B1=g8XBP5^!ZdNcph@Gcm_21Ukb1S{3=r6(baat$Pf;{a@2y1ju-|#B!<_Y zy=rv4)+ci-_XQM$aGya{rdm?3h7CjhNE!wcYh%3P=3K4yJ>d7@nMTI$>ijm$VsC(W zDBj0Fp!J^KaZl@ojOg=#FWPs%Z}@I|{C98Ne(PgXG)yReo4ELgbDIHQ%O&NZ$iO-Q z_gzWZXWGH_-pNYu<#O-k$6w5+cfFWQWFy~?4Wr+NPpcm*r`1@S_~j9dG7R`%Gjfhu z$O=7T7;hAkS+A$XFia-}RucrKBJHn+FY^$>-{@EE;Auj+yMRq0^n~M4ASD+%UmMp*@B8963o%u!h)0YEoBX_V!ns-8D s?)A^mm!K*R$HX-t^Hr43+XIS!Gm4@oSF{JgSw$IqKmB(kzH)(o1CUt++5i9m literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/extension_dict.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/extension_dict.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c9d7aed8b3de61f46a917163b971ecefc28856e GIT binary patch literal 8751 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/message_listener.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/message_listener.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d931bb4787ce5e47d4d4c19a6003c3c5eecc22c9 GIT binary patch literal 2444 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/type_checkers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/internal/__pycache__/type_checkers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27a01efdbc4103eba180390e3c83ffde121959b2 GIT binary patch literal 19958 zcmd^GYj7LabzZyy0w4*#NlDc5p$A2YltfC@%aSRPloiXAB2s=ZjbR8_Qh*?U*##w$ zp>5hxV!KIW_K{fWqz#*KTd7XkOefRvWHOl~lOLVFh9K2~L79x3xSggyGPKBPJWi+X zIcN9o-31nO+)RHJ7WdwJ?sxCrz2|=CoO^fux4~eU0Ke~Ce|%!>gdqGB3+z{|W!9gD z+-pKi7!zW)F=ry7^T)img|R@)2iIV%46fyN;j9qz-xgv4sp1WXiXE#YX%M94Ql%~pk+cG& zl?H4TNkbs5GDxdQS`E?~gS3XEwIHoCNNY)257GvyTEANzNgF}hWRTXAbPGtg8l(** z-3HQTgS1gJ|lQ$SQ15SMrj%K;)3+bQjN!>&r=-m%WO0MGp-L-17cB*u7&<$l)& z=-*%^o&x%5USc^yKf_8q1@skOVmU&`Sc#{A9_J;NBlJ~P;whjLyu@;ZPO=hD0iEI{ zmLv2eEAbT2GB2?lp);(+Q$XL~C6*)fEmqDWHF!mspO_UuGqq0{RbmiRI$9KemlsEXg2u;;RhFQ@Vo{gWQSN zIf~^7{R}JdRB|W&gqK*3&{hm`C+;!~PYG?sAa~-=IEv*6ZN(sW;%f}UQ$kxY$es9e zj$%1NTQSI;_y)u9l+acTawqKef+L}R& z9K~{kPO=hDVI)hu#BzkTX3%|x;VGf58T3ya#d3tUX3z@5@RZQj49as9%Mp5xm3RtI zxynl{M`&vX{g`2RN@!~ay~R;1M`&vX{e)q7N@!~az0FZ9M`&vX{TsvZl+e};`ge|E zIYL`A=sy^Sr^KKeB^l&O{G4N1j_zQ^AXj3IVR%aDXLybzhNpzKVvsBGE=RE(p{*F?O1#G~JSDUhgItOK;wY9Qv=xI~iT`F8o)UVN zmsw77&D#>JU`Po+XAo#v!rP1GgtuZ5_U|l#x8f1v-6il=OhUZ31m22Eh%YOFw_+3G z110cQd_sJA3A`1f5MNo0Cr-Uml2aaNRa4xGv|z<5#MhO;KT|B15Z_QNr~a*&wHe-u zTbtpn*oF8~&uhgm#Fu(rD~4@09xIL^zNy6gSg{Q8TT9^Qisdx_rTVvG*=FOhV%cWT zYsIq7@K!8Ce5v`jVj1E~>DP*7n~lecWhL;$vR9`a9lIh;VAL+k=^OEwq==d6NlA=e zm7>?;sR>a|Pi5jMN$Dyp8@(D=#OvwUR8kUS(l|;BzyM9gGjWi|Q)1?-B#x)$>x!5j z7h~~gCZ0}3WT-q=R`z)R`OAahGmi|Od35m7$T6{>1Evu^9+#3a>Rb^cshAiMZ$y$) z5?p+)a@aF%a{5XXZbqNc%J1elGNGm5hBHXhLcR2FyC@yFv?}>)Tlj%q% z@1msygYc&1_(VJvNh)|7@x4!WUr%MaqurNbDwOUaDI=xC0XZIvcMnL)wM=@lds0p( zq)dNGiC;-d-Pfn3)Q#?B{7U!abmnS0)zfw0V7C&_Nc$!u(QA=2ciGpH^XtwWVynn;WyXd=G_88|<;J!|8W8M7y_uHZK-%-Yz=B%9c0 z?HLz?&DxoCR=5V|$8z_qE#{aB3c~+E-?q25PQi@tllzZ#ee%Gw6VLt(l?>~_rLF?Ex)y1A zI~+1bIeFitEJfoASeLv9>|QD+#T1+uMuqH%oqx1NIMdrg=X ztODAM&K@hKT!SZ&cR@>w(9_V;3wJ5_QOmN7pNZM=_s9p2!y>Gt-cG|fEJ8@DFj20} zu-8O*KZ{mu!Hx(S-N723$ihiC!lM|`*7K>NI&6_Lm~^&2BL-(E$>{pThCU}zoTw5=!nThQd4aJYU}!1oGbKV@|A-iHMOb;n}dvekacrzc(msr*nbyI zp=$h9ewUw>GKLwGcfxAGH)YDF;R5uo5j=sHQZJT9@D`<3P|HD`Uh7wx-M0|2AZ ze`wb5w~it9Yl0-eTT%huklOI=D7?vZ#vE{UO*=bWdB5S|W}e4_8tB2|VCw-~5G)eZ zj3~)+TE-Qlb)#BqP88T)`9y zlK+dQlZ*}!O+qNcMvkLL1Lc9g^(wf48MDm_VaTb!X+cKg11bxJBhjcdnTfy{XbmVG z_PkS(lH>Wx!WsqpWR}|-4#!jROgKDKW0-?3CVc{+3hs>Ogq3ak<_7-J*`&_2ZaAS1 zJt3Le=OAMYPH?nV0Sfb`%FdW=)@Jaewl}nAw{AD?m;qA^z87bNe%$xI2t9#cw9ia& z^^qE2jxm0ZX^}DpjWT&oF%D5O%(p0xg0@td4!a(oxQZ_Hh6F|d6q>>a4T4vV@u@Uu zSf=HGDig)`_U`C9u>WAMOm3H!$qr?&cx5UhO1HqQWuRd?g{J42xI^i1=F7mJYW7Ip z1J5GkGR^yN@PoL%?m6U6l$68xVRcEdFj=0wN3)z}2V6!rfp|VsXH+DYk3nzBAYA5z zjWQunH=kOF<#wLP?mThd|IkY4)Jm23di%n2%dLmsbmoo>XO9dohAzD0uvJ~O%}u-= zsGXl!4m2;in^*jei_S(`1;ZWgJS?CT1R3FQzAPM8H$jjOgu|bhiX^ofPdFS)N5f%x zAKYF(1ebdPbwJid#z28CABBt(g3E2;9jD#le&Dq^y4Kx3hq~wp6NPI1$C$E?#}Y=4 z1G6=j!#>WLH%`eDu<03)#v@b7Ow_oFozMj_?IiWZqe80{JS$AtX6;|Kecke7J1cU| zhOD#UPR*k8z@oT+*?C~4X%`Z=UL`J@GJwO#HR9r_La7*Ogc%tbC+41wMs9Qt0c|$b z)z?;Hutrc4I#Mt!0juJ#$oZSI{^mtzv$m#O@?ofw(Z9$?@ItHRH0F-s1w%b`;hex6 zUdG{1!N}>h@BkLh?sZr=+f^V|Tdx@;oN>*t6=U!Vm8a9`q|tlMwBqBLodX6mR{*Ek z^)Az@(rx1^-Hop**dyq>3VDA9?I-Yp0op<5{<{hvNln+2zJ_r{x6VPhRY$?=77q@Q;Ho=7eEbv#& zpIkV8-`~CJ4ZQsHvUh9FyDRJ6b+>QHdytEEWW77?HiF1x{k~oEZRJh>VrT$u-=Nv{ zt@G!PSEt zsZ^v^!-c=?PvJz zME8%}&wh}Fu(AbU0W6M%tPXZ=*yM79J+K$r1KJ}whBc~RPF+i-Z>B`j;tf1n(5Sv2 z9uR!@)b%TH3Y+)BT9qc`NK$3L&UyJsgjG^QC46N%tTvEGKwOIVTZ%M9Yl;lU0<=>m z;DW@jolm_!k=uDVyYujUf1lYymn8P8r|jjE%buo%_CM|ZqwZYm=`8&7oGxN@DJJXd z5$$2AfY@q35VPUYmsP|D;qzsvf{34H%dO5<-mT4*b!1R9Nk;2%54uyf!G)sdS5Lii zD(7#>`db#@(w_5oX8oOu&Q8^8ba*Ty28yULqOuGdkn2SFFX5f=fDo<9qYs=mhxowl z0n-Ap!(P?2AlBNnd~kRz}}k`kZO4b7I0cfe}wSr;4?ooj-_*SY2Zz%Mr{3G2|Xwx+(fns&eA zvLn)tNIN2-`aK2DcfMC1>OUlWuQhbKQuyAXhSNdE_bVGt?{;h+i@_!=zgZwAT1~6b z-2Oe>dYuJh<*He=493u!kxBbHWb|V!2OMLS)q~AEXmeDkHWPu?HWO`aVK_GCq$8{l zIN_dy+Q83*uO{QdXee}4F0(V59dp;Eqtmx42s>nOuZ7XIiE=C*(@(Q4<~SA5kk zw5vlzz=s}U)#Z5M7%2=+I-s}rpMU>(hcGOsAYV8p+@8vKS%JTG^&Dr#SB4|1V(3(4;<{nqm}U)=RUYvkMe`Pb-rpK zJq529jI%lOks{|EBaqQ~|0=uvGI;Hw`#*RJ-9P^r3g%FpZ}^pf={QaI(I4VCO+6m# z`IQd>oOGPF1vlDOZN}}|3kqv*uX}QS$Oi{!?)Uc4EYcB(=F&v-sXzKRdOhETXKa*% z({%IpeWsVWHGJ_;kx$7t5Wv&DYKO43JBO>LU|)}3Os>XDiIcc(#f!na)%>c|ES*fp%_@1ZZtJTVYdSw3jfwKaQT7_hz+Uw zd&My;{1(ujQ{!3tteuC_*9Krp-5EIDQh)F%g`MxJufe=Qt$v0LpDF|ylApi9eA(m~ zki$u|OPQLKWI8*AH&;XFFZ7Sn*_AVVZg_}G;7rRK9v(c4QuUh{r+NU<1Ks2+^axaY zI|uBHCgIzFa9F|31H2fVQ(sl!W@~0^k*W-w@xxv~!IvKI&IxbVZTanqY~Aj=&C7L1 z<}SSDsrz!%lBaDo7@E7bq8DoC(r^1)7fvnvdlsENv>buX1uswZ6XJYO8(UOLCc|Nv z2|8%Q9mvD#7@vczj28zE1w;OK;YFO?<#7L^+~??B6X2ry7((Lm@0geI2KeqTG6mmy z$zYby_Q_)?ZO}f8qu1Q6ZKgw)zxaUc}37 zybz7)S=*s#`cUFDB53;J2XzkU>(Av{fXf3pf&}wKJv?h29|;c(oG_2aG`VwES7i@Ch^PW(@jyWm+0!$ye zUBvz4LaMEYwgRn_JPi-4LYmO zwH(T}90HwHn{>wH9+Vq&#(MFg+@Ldt_oLjPv%Xy0(QMmM&>6@LI%Dz*lpA#B$%#E# zu?KVpa)Zv;eXCJ!&>6dLEy@i#WBu2o+@LdtZ$!C4XRQA%C^zVgjb|Im4LUoUYd@ZC zKMpzrxj|=4-hy(2&RG9#C^zU#lY`Ex-9WRh>X2DwhqA4QKxHAb%6hUbJ)p8sp~^_^ zLAhCF)Qb=0W|a}%k8-oh`m$|(pfZq~RYvj(l$%v{AS)gKm4V!>GP-Xy%FQaH`_`h| ztTO7q9_4105xx=SW|dL@TTpIR8I5Nf%FQY}nr%M{Dg(J$Wh8Gwxmjh@e;dlpDnmJ_ zEaaXG{=Z?_5?Bca-nuOY zmVq-nxzu`c%>h!AGka*M<)JkfNDG|ViKUhkYaWyvSO&d3wAA|0nh)g$mVr|wydUKT zmVq-nwbXWMEr@ah%b2_ZZNZ3x9m30!+i&`K%ONp?efT`oK2YsreK|{XIUY!KNg( z+$M^;O>xv1#nEFlXX4Be)0m0;n#UOOYZ8&u^n6m z#5J4`;##f};yO~h3TjsyYS;73zj2%XkLLF^ zS*ZU;y??%vujcK1BVW%~akZ~m$C_u&{<_45Ov%dkRiLR|#*+Q=KhSoh{sG%kln}GyN^+ z!_$2D z;paBRQ?Q9B*g*7{nKO+s4$47sc8+<8hD~GvqOo#Th;5t=VmqMQkuk&c6E%Z~Uv?rU zAU4=DyeNh)@oao{nh(55jf^WhgA9ex;osKZk|E;?rBl?L=`AJA(N_R4(LM(|xf*J5 z<}3RtN@$ofeVyjabM&MNHk7Gh(l~~a`E~k_%yU$b-~+RwJF$mftG&tC9$Gro@$}z0 z^V^IHIn=hOC9@X4HPQD(X#9%E#xL`%IL(iTVKq4xD1hJxNGisT&jk^`r7Pn2I4?|vqhT=~9v|^rGv){%%{YgK&kvqE@xxlFeAIh9Wb(pUE&HADPIQr^HK{VzohVT7W%qT_}R# zMMNkI;lt;U zVqkhU!ypb5cA%^Prn(Wh&qI`?9$G28>&Bs!t!62-X4|=Z=x(pnwC`TiTGL~hhVHvf ze;)XDV59fsTJOnK->D?`rK!JTyY80#dHuKRH+oL2^_*DsolJ5sO{Kl%8{SsQ+j{qz zRc~v`JD42$(#b6tff_ebnnt--q2x9N)PPlT!aPvSq(*Uip-$Z*J&QD`(TSlBHEGqK z)RanFG&O7Tn-lvlL=lZLO%)&>U{63*dBhetI_hVHV(2tuIw59?p9l#ee^iJ~$#fx< zL5bfil*5lufwi0*FOCc0>3B>KaXvr^LM0YhWdIURTo5^Z0P@8yh?3L;Z~5)|TlLA4 zX;<;h{R{gS``2Cd>7vp!W7}XVC8lzTdENP{bDe2|3Igu#ag77OgN9=~gaF4>AsiRN zFGs6*l6l5?m`!5uIX*rkz)^tvPbD_OmRQ^=Y;1y*griYjP`ZNGF#CnL5)CX3|U2^lWg~v8r^^&W8Nldw# zmXAoTwpFH0p1qO6FpU`4dKw~-Yv{uBze-)Fg*qCsQ-IRmg0>id#&8SggexF#0B%f) zeS?>IB%?6m0M0~Y+yV~_Km=|iW9(A+Ds1&Eyvf)BLP5j`jToUg1(+g~QwM1gXQ2>_ zPy^|N6_Im7#4}!Og9xa^JNdR}80g2?s*qn0MCWFU>eKQ6tfypU+yR zO7HS1P3E7q6Olg=TKozS{B}Dru1*XVnWE;AUJKA%VJe=Z6Ch6;dVszXFeq?PQ(WVN zq+j!#Y0gY)>-kW7o{4Mc@g(9rCvbQpFsV|rp)QP@8|Iif^IOVn2o#n%%OswIIYHfB z^VT_#MG!iU!968d=3wct<$2h7oYhd`f)X3a1EzxcS}l7{EeF)HC$ei%BDhb5PgAzvkF5*$rZzZT4`MF z4}_BmI1|{oDy0V4Q50R|o`6e)BG*E*B0JU@#a>ae;FPXHQI4Gf8JpeH!R}*05p8H$x3jwk{*U%__jh;q_jU)mdwa&(NLK<^TUH@M}{&skq5kS zVx~mNkxPdLp32y91rUoF2gV#9iH9`ER>yDOG#l6&WR z^IpldH#v0Q;oWfTkQ_Uf_AYyu2U3pKx2rb%2POZ(dqY2HOZiVqj+4nF4~mL!KE3et zS3jRTnzk1$nipJ4^qQ?24nt4*;`qYTtJZ2`{)3{j#mmbrD@}KHOTK_q6j-$eKCb+M z%e#1dX+|n&`QCi~^%&&OC479P`#_(VQ9B4g>8W56WH0vN$I^TRHcf2vrm?) zJ?X!Yi-Jo|i2Kxx1W*Mz4jgfmRY{oB@XQro8G^Mn;-aJ=F0>XpF6OL4O&moJ65=R1 zk-&N9tT>`tlPg6S)Teo8)Wq55;YgU1uf`@qUAqm?X>5$MaI>^YUpvAY2mFqnzC9`{6`4oc#eJ)#o3>?QlFtV^QAE;;9`1 z$v-wRA@XrHB&f$Q9yg)!aeg`uM>QPVky!K+{=z{$3;MITe9gq8u~Rt(;i3Qv4iV1# zfKxfF;Ky);Yu(9b;PwZ2XLlc*=530^5(1Us75axwWpfPgQ`;gxKA>Elca5My}K_Z)A z*Py~u1)+X+DlC$*ptCU4fPw^|P{CY)h!!8xfebZ5WR46SPkat5;d+GFw&%L%+gL6J z@)3do0vYHRWjwHLd1}434#4*{UKkGn2yO8;79=kMy|N%gw0R%NEHRi1u{QO7xZ{H0 z!otYxR7`-mTn#WQA5iwG!g`HN)H3l$!q z`BI<_${Qf##Ec-JmyBmR291K#G07~}@r)_X$?)K4 zpo~*S$e5uc5sxh-Q7yCrhewB;`K4YCW6w)!d%EHMv~&ax8f^ZSyTPuGwnSRduL=S>E&Y z;$+O2>3Y?*JeaC#*K?uUv~zgNOcx!aKcHyaG5UemxA^SR&Q-5JdGbNU&fCFT!R7O* z3V(7WZL3%+U9;7sD|RL$>9UF!CZT+}c)5PHq8l^nmZB@qO7-2V^*yU)y~)Y6&3Pjt z*>=DfADC!Y$GaW9Zyvq-XsYAzmc>+b1jaMjj?kdtE34TkZIVixHcC6B(vFp^=5^YRX9$L>^l$BHPG z_oh61Uf>^iij({UoBKvkvehk@t=XFIJKQ%ee09g-7goGd<*qfyuKS)UK-P}dcUwE| zOsrh^#uOm182Y9ieINmsRxW;FwX$v1+n&6fc9-8gvv6jqDdnzDj;9^&MblTRp?TWf zv*CV3azApfD&;Gjv@Mi!@Jn9P_txSbJV2m#jgx5*+CB9vs9caZ(k{u%6Gp# zc-MZf?A~X-Q*qC?+I=|HF(8!>{GeAV8W*Is@!IrP%$``+@! z3oq|L{irN(D}pXiB}IXlEeqVJoFy6qV=2~vpo`uGwfLG4F4x9by>Y7tDCj|H&&jVc!%IbLRBVpKu z*(GmdLzGWIlf~FKmrFL5#GMUGis$ zw^kW%pc+2CaC*I_Q*w8v;Q=q`JGv!z_s@al_P~y}^!^J%VI%^Q7*Tj^i^9{VPZ%{M zg;0o9J_3dMAh{^iOTGix6DBaqvmYSGA@sEa65G)i**CiiQ%a#3g61EIByY_fU{zCg zNttn%D4E}fHd}bl)pp1#Qz?UtY(NbfOF-!eK&Inr36+2{xKC(oG^-3$f>5UQM3|z^ z47S<-*|&%h;0A;dkm;ek@}{E5$FxzApD9K*YUB&m`iygm{sP<9LIm?Jt6Hz^l*&5s z@JM@osDAS9(vJ@fdZ>+QvUDdQ@$2Cs&Oj3q@MZ{D!G1^}Skalnc6=ZQEx;AVp}D;3 z9HtDo$ynuHvd~k4ILKlEJF@X(Ec+|yajOv`L{Rm5U6)kWMG#b4g}k7&bG_%79%GBqfz`5a!GX!2HvUWrD2!OK&F4V+|k?joN9F3{6b)tL}TFIAI zJ@=>3QXGW{F09Q|QN@P4UUJtf=7;+gEz8^+lXoW9dyl6oPCT@ji>%4v5A2lPlYIVu zQRDIjsc6@#br;+Mi<_5u$+LT-Xunjn|DH8fbZFIjD4#JfFcLXLUV_BO?xBKS7`gWi z<8cB?{EysK%JGBfB7qz~*R`#nE%(Rh^0;``CSZY_34N){B2z99A`%^VUd@1o2{*(= zbWTGmlqqKftXKB&5V#6)Ap!iqV0kW0W!!N4!DM^}OlvajxD2F4D2C9EYScdfQ!(;A z;ddazXmmn0s8YcuR_=fZ)_Vt4UVHn{twYPbZydUFDAlw#Rn{l7z%uj^S#Nwq@;;(5 z!#C*>f2q(6O@$VWS}|(F2<#`6a1f)XFnR`~-^GZ>XcD6-j0B9(IY)R7qc32zfDr>xp&iUG9TEqn<3>Sk;z;H-?fCpRvO28ce9RW%}-DX!k6BDfN z2cYJCVmE+)0>F(M3Jw_KiLA`8@Uf&GF~nu1Kr6-Juefk)xm0+ZGZ6=a0_|Ote(({e z8Ds-F0j)q_u!q*FA_0%LdGK{CJgQP3w(`6=x{qVF8(SZ_a6g5{+_oke4QzK7IBFrC zKq~_cwm8|*fF|}83zQQJ5jYx{IU8{ykV{-pVkdcEJ=9$WAjgqY%SrOGYtdk3A>+u$ zzTX|%Z9K*`f&o6G_yfpCV&M~bK&=E9M)Xtw1~ma}f<>>xET;lR34SdM&bm;Sxb7;4 zE_xDlZ0AbA@zcQ9P!AoG&rZ$!V01B1ddhM%0GD2LG0-MNw7miLC>TYc1RW0g*~T8R zu>;~jcTYE@ly2~ugr089Wg9!ew-J-1oJfws<3LqJnJyfLRKnE4WoS_dU|M!I5C!y< zQydLM#nC_nkIb?lamiBQ0-bo+ph*^xMZv|S9Dam;j5GmNbJdi6mylB?D%5VWTmtN{ zqM{Qb;LfF#r3#$!+^@QoGnnZ~+gx9sdtq)7oGB}p_P*Z#YX1uThmWU=OOq4nQs3>4 zTOEs@Z&;zvqW8+AmPb9mOBVOu?!VQ)@ceR_jsYMnQ8_IW1yTy_m~EO-lu2m?460MjAxItY8(qt}gV2K~5pXW*QL z=YWn9dar8lVAh2Tz51m70z|zZGm87u7$uH2A`;LE!f=S8S2-LfN*M!B8m?z;O_Z*V zXr=^q-eNGl7j~7P=PYXP>KtE$m6*3YZ@ETaqpq8uqOQ??Pw0@5A%|2B3k+G?>>ptl zR+zRdCTd(cix*GLh;bIUDobubZDJcSAUicuZ=KE^Z*bSImJg_j|fXw#ZyBPqhi!F8Q&6dPq5r*H^rkLX81!qV9d zwolo-%3w0lG#HzSaM89nF<*m$Sb1@TbihK~GavA~g<%BXC`QLHI*t)u#f1|X;b|b8 z!Ds}dS1{5J1iw|caSETyD$3Bj2$BUQuc>@spj4fxR415YacsvUqhCHUaxIRBHY$%w zl}CRtld3$Ea*wQ9N6^UD_r=8Gz>Ci>RV)dwRxgjQRr`q@anFXcUvl=}>q|KY(4;s> zOo|XQC6+-t?I!+di{e+$>Xxw5ibZ~DaOvFQZ{6xoSJc9L0${|f zf|m#;e|g_ku}PT#Xfm(v4d;Hzx&NN!-m^I~`(GcJvDSwovd16R9(i=An)*?-W7uT= zQDe=}W9A<{W`T5;*DVUS0wZ-e!u1Tdf%ITZEUOLtQH(Zx_6q32}(BZn$`{H0+3M3l2K$Y~h_WNxfH8x5T|Z z`Re5QuEVLK0gzf$Q&@-O>R7odx%yU_zJJ*`(iN`RI3fyN!cs0Hj%IUlG?|Yhy{q#` zAFpD&Jowq$su^ zAmL6^1M+%8vO|y{AYp$w0gNwN8)BF-J_EU`vA@yxy`;s@<2aZCG#alWO~Z zVWutnKVtUhp#5(;dwm-diA}+jf{R8C7sf4_gAB9qM=-u@c;PUWw<}S#lc>%@!5M?i zH3T@=@;YH{Pq^!O0qwC;v4;b8!2F{dmjmAdRE(~ZfJGPPss@ z?>?xy2vh|?e(LCcXg0aQNx)=L{7f|N1no6C{yliueoq%fX~Fl#4E`3-Hy*v8L>HdJ z6Lqv|sLUcJc(YYz0_51y{rSEK!x6o-s*-*ZGK`d#DMB5zj$B=8$;!Wu=tU1f1BX~T z^7_eFPp*`HtMbjt^*w`wzJub_m(#QH59F#!-W|k)D7Y+(?R| zvJCFBG;s{~K%Pla;+c?~pb?uOkRt)$GNK-WQ)+oLPGIYqM!< z(W3W-2rRrtRPpnVeU{Wq}Qzrl!{4Gv5p!;tSSw=ji~ z8NvPxBv6IluBhwM)mbwgmYwxPONY7HU zl;1LvIHwYm>Y@zF)G*i2Dr{bMK1QvAY?=~6QTQ&v?{x0z>Fe9SPu8V&u*Ron0*RB` z^hv~>?Rq?*h7MLu9e76GABmQ2Iy@h~6h*gg;*A{u4Qxel=)$>y(GzD!v=_S041CUT z|L%b$BWInF`N)^=SD@(2NQan6QfZ5Oy`*KexMj`KvI30d_?rLteP=nix;p&t`n%rr z-L<{76P!+6{m8-lVYiWewd!HlEbQ{|dgtS7&5tV$n%-^l-`Tg)@{Px^K`%Dwg$Ce+ z8hSCjcx);3wNuL%RzCBupSrvM-e>;gAhb%`yWog$5f`$a56slwL(5Nngd~8R7O5Cs zG=wz=)gY!oqy^<3vNEItv>3=t4Qvy@)Sv~}A53ssniCzP!c24=Oz84!!vc?A%iusO z0zUNMazB9z5-xmIem6i?jUf3GiyUaQi6^!VD?l5f+Riw%K5}&1FJU{3{*{4Kc__Dc z@tEYQNw%gvWs8>p zR-UvIFA~U-!z`um1K59zn*SEm#~^^(78tm;4|D2kGDuE+jSJ+|N3Sswbmxl+Q%+m0 z&z!cUTHA6pWoWw(Y)?KlU;mv%u9_3xQl5#`u27qroCffytFuA$&&C;ggpm-h*HWyS zn$TXp6%fKkHDCYzSO^QXY0=xOsT>H=z)XVv*4~S>-z;nJ62%vy{B`(l2b!<&Ep&f* z#u>#AZ4jFgQPE|Xi?LWFrhjdaYtvSF7kr%<^aQm;gtdF zdGdi6(gr>hqm)?&BRtyeXQt6_Aj5z&RXk%MX8VleG(3QXXok-?F<)t7g|F3s{+4ho zkd^)n1|-|d$gbe+2@ovg5lIii_n_K0aXyz3Rtv_ToIf2x$YBjX2tyd#8Y+4P?`jA~C>C){Yoc4+*9@l=yNQSwB z@6r&W_+w}%d>f;?7<~()??RL)A|ye)o8W~oa3FDh7QcmbHp<5)aR^e0<@0&hguEVXG@<%Uan!8dJlFS_yd z6<0APJ!`i5+~PucauevLQF1k|GL3pSS$WBMI5ii8DQC+n(*g&ky+S@D06ZZ)I5>Sgc{95raT-3K|J6u0ozA7y>; zI8^bA{8olt`QXlf#0(UJvaV|xKr!sWJQQnrKSl8IV?BUkrfhNO_NiN^md)@={4)Q} zC&6$*{Layjsh|q~8R7a%gbQb(etZDH0xd`$SX$m+16W%g0#@4YzUf+UEe=ZdDjB6v zrUgVVS#k6i`*@V*6Dkfu5Sgn4#?QWh+Z!yqM_YFCd>>(xSNy)qb0dE9xrOIau9{V* z=Fgu9T~Gm8s2#P}?#xO%~oTAN7qO zeb3`of&&6Jc`h!6G!!LV3Yb{qzaxk;-J!kX;KIQTR}F~YDOcSpQ#yL4+$+B1E@!fASK2*5MW_K%P(Gkwpu##~ z0%%>o9<&zRG-AT7085^JhOq9GVQugDsjG9j?8f=U=0)+Af6ZOH=IUH!IsxEL8DNi( z$x=jUTj=}H1CeatH#f-0Ekp;p%p^P8+H z%B;$&3V#b}SrRS0pyk=CCJ&mZDY&F^;pRs!>gU&8d$Si6mbPib>X)qkb?ffzMQxW{ z?W;_C{-SC;a00+b>88*XMBP3^)H5IiJq<)LZ<;q7G!F%@7xI@t^v_q()bF#5dWM5W z_&y>`mpNn?LioNP+&tlRhLA8T=<)~da~6WEVEy;-q_I}{8u}~5RS)C?YxS`kzE;WC zn)0=8!n=xH3(gzn8yD_dD;BxiS8iQdZi2EE%RANpyv}IpA~+fGdxd6%rv;-{jPM37 zyLkTi~^fh3#2?2vwzEDGRu=79gjnwT7W@F*g6S6pO#bi ztQ)>n@Ez#T`29BR-e2f0pn`$0XeYxzOSmHVZh-C#b}X_c39kkTNc}{%vH-mbDX5!I z{YX}XrJaVv$4h#JblB?N0R4@^EOn9EER#0^n=ywtPPr50t3IruY4jRSl<2_AIdg+Z*Ac+e-fG;2)i*3@j9YZ4*_g>N8`>{ zFLD-AZoF{_Se&TP*UWIuEXMiQlKH=io zL_?(QYD6ZUI6tF)3HU53ePz#L{N)3wqB`6<R9jg33yfe38V&6zgb+ytU(y%ht%R(1Aj;U_ z{iR4~oEJWePiA<5Q}{hhS>;bo$zLnR{YN|%WP9{W`1n1H$T9n;Sl^6Ld(OrKe z$|Am?@PV18>7SR_Y374+%CkG^{CleSZz$j2P{sd1bv>E{nsmj07e3!o4b8mFL>If91 zt2#HT`lPD9GCaCn#Sx29yZ?rz7@b}?idd5T_ShPN* z@b}@gWxzyN-njaZ!r#r~jEnBstaa0+oAsr1`{u4Diof}lUM76I}uTy(Ia8k89(`Ch|WjkGL_6l=&X6DSyne#U@NBb%Zl%p?y(PYM{vKO#dkpcH9-GKX*9>4=iFW^CCA7G!dA26gG06e4| z1U#(t0ro2)zyakD;Gl9Ca7gI~d`%euJfaK&4l6@|Bg$)lqskG$qpJH_sv-poyOy@F z%I`}kmn#$&_7X~F^;dphLaA3MENtE#JEjbSc2sR7XH;$_cjVS>G%}NMU;6ICD${_ z`IdX8dgP=gr!%@7mq&&N=90Rc&MwWVY;dyRLxy6a}5A`FG9oe5(P!inJ=`Y6QXZj9cQWprdYl3K6@;h| za>eT)yGyE`WzbtZEoakOav`lM*1nQyU0s0Q^s8}QR?~?Lw15h9m{e1WxoxrnpKRz> zUs+b=WZF|!+*noUpvpfy(k~y8j~|zZ-wg3t$lPX$rE&RuT9q^NocNuoOOcr$T!_pbk`tCC z4}zYNQgUsV(~IfMhv~|G#^wD=$XyQ1+5^vp-(@8Ea(#r$B*IvRl>;;3)3bcyQ&Th1 zkW}__DVe({du?tsT1b}vwlcJo)`t>9mo=4XLzAkmrsWBiRFXpzs&o&3t%_xTBcuYFCAe0z$%J%z5LUwVsO z;gauE!F_7O*Z%oH(Rc9Pn?>(vK^lFAu|mQ;7YOI}%x(GrDxV3kK;BFs=Y<6dy6piu zjGLEWjbd(b2D(h9uR|PMTPBlzp+Q+boxBe5yud~cBk3mvT81q5IVIoERmtrjBdr>Bo+iW4y~OFN6#R(xb*mfMthN23lVrPr%AjdtX-&2qG*IbSam{u!>15W*Lv@7 z0>z%A1@Blv8e?tft&#@qwMrU_xcDP@w`UdJN*)=7L<~%E<^0??-MOE~k_)l;f;8#QT2E-rP&_BD3)v@bZ*@j?u%v5^>`|)ItAu8_%>K& zdqI5;McW4enfZj8`rGkav5orRTKK2q1$WzquW{|jPY>N`E_yo)Qs>_#J~A4O#3zzD zaq)2sLNvtZ%5_Xt49Uq6tch=d;T9#ZP6B&~KZnZA9ZaYc@K`r`-yw<~fV}Y7+pyO1 zPrJW`f7`q<#*M<&j|dKD&}k+9ts)eEVNymROgiWSQ)zu{^wf&3Mw2=9zQme9TJ}I= zBg1CkFzk{DM}{pzb`WF<6s-{;FMRE7Ut3+jT=E_+NQbwJ)Mlv*)J~Rg`UoW4FH9!E zmNd=kK?UA+%wCDJ%T)|cXW$qik&&M}Mc7=$9j9W4L9;+~Cc9mcoL`3~M?gPbT=!_#4A;-I^2S-Z>-Yj{?3)1-i1AAOH6!O>*z;^a3p3RPdV3jE8_}$J5 zNr_A9c@JH+eG|bCM23gb&GWvBBI;q903@SGS-9vpHwgMlA^H#}^UgKIveSD9#FGL?zzwrNab-L>y#?QQ$7 zQ8HQFX{(lRnBZ;p`WLbGr{Br?A)H|pdbkZ*8+SbXkN>?5EO zTp^yEC#%m7yn(YIK%8h6JLMYV*=KQIqv^OkE>!W~5an&w5cVFHTt~6b2D*w|`PF;B zc<;gMrTs5G?Cq_@Ft&Ot)~QuFBXqhN@UL>FSyU7iU(|0zOXJLQ@leU=tSh@xYMMoX zId{c~3l8p551m&yLws#(sgkevYk%+Ex9^F+oGkedf8!GC`~Tu^ToZpb`He@aZ+Rj} zuGZ}#%Ql%)n2MhH&U>KEI<_U@R(Q>+W6;z0h4CX8+aQz1E1t}Xf_}Nq62EEQ{DJD+ zP&sg#WwOf_8B1W)uTeC*Ip&28U;W36clt{W2l24m@OR!m{m9>0^mms0U9`i!PXy5= zZ{HQEfja_an7&PEd}kzw=RRv^wiM9+ZL|($-ghXI#W9x60aWe1@tlz`vUfiZir*3y z9m7?ME$kazKmBOmXmQ_YY2R4M|2l2|jmOmzfu11|=|vK;_53@`T&-tCvUdo%RrFu+ zN!pd8-DT6G{Ud2rsyIO98juU{KJl9E5+F7|OR^uis>W94HO5M-E^`)oh`SBTG9o5T z%2a@m+qlBImb8VkPtWM_)U1XlO4)Cwb9hao?NbKFc%-zOa*wL|l&)5S+#;y{4Mn4w z`Kz$0`O`D&;wRI^V9(tjK4|*o`^DhM?-u{P`(M+=;6(n=lN!Ml_$qktp1%}4T9l6F z4?S*b{jBrnou72&`?q)UmNkD->dYV7@U|4B7Q=MS+bRrXprYJSxQ2#pdIN7B>t9`kp@BX zSsRr5vT2q{rJ%Z0CbKMOmi6RPGKZ`-@|OeeTu7=cp;AJT-fm-~@={jQDGg~QODQw5 zc@r|`4wKw^3m8RaK=$75hyjf}47b~YM4NL*CvTaBA!k10}`k)UoAHfa_|%T_Jp zw`m`mH)(XP{R-brCaaTNcovkhm77Ena+Q6Tr>1AdMrW;jC8OK`Y-|iaP8;L)N1#X@ zKL#)oHU8WBt@rPQH$3&XuRrv(-H8)+S`Jyfbwiq}P+KK#95F0#&`;pF_h%+sQ{Wy&YaHjUJuR4Bb=c%o(`h2fZ#CLVlI z657Zg$K^>%c_T4v{ug3=e1>w}+?@D0(^ifA^^C;=_xI{mm^ZnV0$l0lLQ!|l?a;x1Hoe5u>nLT~!{N)SfX1g^q zJz=&zH|@wUYoO&_@V>Ga>y8YQLEGrmv|;CtX2aw;1))>ZOrsfgPoBSYE<7_!UIFT} zQ!_IVHWr==PgiwfP<3aAIdbysd5o{_vu2$*f0=Yw-C382rxN^>YzS*O6)2|g{}%9Y z&lAcma#Gm$9E(v)O> zMk2M1uoi&7)g52TDA|dkVs?jU77+LhD9bdqHS6+k;K{ zz&CY5Ah;I5Z8h)xBQE2s$G3j`R-t9EzW%hKR^0Qn z)eW#y6#JjniQ8D+z~6*wp9@n3 zgQEXQA1+Fdq)uFY9!Y&gsc%E_Th)U_>7b(;DoP>> class Foo(object): + ... pass + >>> repr(Foo()) + '<__main__.Foo object at 0x23d8610>' + +are turned into '<__main__.Foo>'. For even more descriptive names, +especially in test logs, you can use the named_parameters decorator. In +this case, only tuples are supported, and the first parameters has to +be a string (or an object that returns an apt name when converted via +str()): + + class NamedExample(_parameterized.TestCase): + @_parameterized.named_parameters( + ('Normal', 'aa', 'aaa', True), + ('EmptyPrefix', '', 'abc', True), + ('BothEmpty', '', '', True)) + def testStartsWith(self, prefix, string, result): + self.assertEqual(result, strings.startswith(prefix)) + +Named tests also have the benefit that they can be run individually +from the command line: + + $ testmodule.py NamedExample.testStartsWithNormal + . + -------------------------------------------------------------------- + Ran 1 test in 0.000s + + OK + +Parameterized Classes +===================== +If invocation arguments are shared across test methods in a single +TestCase class, instead of decorating all test methods +individually, the class itself can be decorated: + + @_parameterized.parameters( + (1, 2, 3) + (4, 5, 9)) + class ArithmeticTest(_parameterized.TestCase): + def testAdd(self, arg1, arg2, result): + self.assertEqual(arg1 + arg2, result) + + def testSubtract(self, arg2, arg2, result): + self.assertEqual(result - arg1, arg2) + +Inputs from Iterables +===================== +If parameters should be shared across several test cases, or are dynamically +created from other sources, a single non-tuple iterable can be passed into +the decorator. This iterable will be used to obtain the test cases: + + class AdditionExample(_parameterized.TestCase): + @_parameterized.parameters( + c.op1, c.op2, c.result for c in testcases + ) + def testAddition(self, op1, op2, result): + self.assertEqual(result, op1 + op2) + + +Single-Argument Test Methods +============================ +If a test method takes only one argument, the single argument does not need to +be wrapped into a tuple: + + class NegativeNumberExample(_parameterized.TestCase): + @_parameterized.parameters( + -1, -3, -4, -5 + ) + def testIsNegative(self, arg): + self.assertTrue(IsNegative(arg)) +""" + +__author__ = 'tmarek@google.com (Torsten Marek)' + +import functools +import re +import types +import unittest +import uuid + +try: + # Since python 3 + import collections.abc as collections_abc +except ImportError: + # Won't work after python 3.8 + import collections as collections_abc + +ADDR_RE = re.compile(r'\<([a-zA-Z0-9_\-\.]+) object at 0x[a-fA-F0-9]+\>') +_SEPARATOR = uuid.uuid1().hex +_FIRST_ARG = object() +_ARGUMENT_REPR = object() + + +def _CleanRepr(obj): + return ADDR_RE.sub(r'<\1>', repr(obj)) + + +# Helper function formerly from the unittest module, removed from it in +# Python 2.7. +def _StrClass(cls): + return '%s.%s' % (cls.__module__, cls.__name__) + + +def _NonStringIterable(obj): + return (isinstance(obj, collections_abc.Iterable) and + not isinstance(obj, str)) + + +def _FormatParameterList(testcase_params): + if isinstance(testcase_params, collections_abc.Mapping): + return ', '.join('%s=%s' % (argname, _CleanRepr(value)) + for argname, value in testcase_params.items()) + elif _NonStringIterable(testcase_params): + return ', '.join(map(_CleanRepr, testcase_params)) + else: + return _FormatParameterList((testcase_params,)) + + +class _ParameterizedTestIter(object): + """Callable and iterable class for producing new test cases.""" + + def __init__(self, test_method, testcases, naming_type): + """Returns concrete test functions for a test and a list of parameters. + + The naming_type is used to determine the name of the concrete + functions as reported by the unittest framework. If naming_type is + _FIRST_ARG, the testcases must be tuples, and the first element must + have a string representation that is a valid Python identifier. + + Args: + test_method: The decorated test method. + testcases: (list of tuple/dict) A list of parameter + tuples/dicts for individual test invocations. + naming_type: The test naming type, either _NAMED or _ARGUMENT_REPR. + """ + self._test_method = test_method + self.testcases = testcases + self._naming_type = naming_type + + def __call__(self, *args, **kwargs): + raise RuntimeError('You appear to be running a parameterized test case ' + 'without having inherited from parameterized.' + 'TestCase. This is bad because none of ' + 'your test cases are actually being run.') + + def __iter__(self): + test_method = self._test_method + naming_type = self._naming_type + + def MakeBoundParamTest(testcase_params): + @functools.wraps(test_method) + def BoundParamTest(self): + if isinstance(testcase_params, collections_abc.Mapping): + test_method(self, **testcase_params) + elif _NonStringIterable(testcase_params): + test_method(self, *testcase_params) + else: + test_method(self, testcase_params) + + if naming_type is _FIRST_ARG: + # Signal the metaclass that the name of the test function is unique + # and descriptive. + BoundParamTest.__x_use_name__ = True + BoundParamTest.__name__ += str(testcase_params[0]) + testcase_params = testcase_params[1:] + elif naming_type is _ARGUMENT_REPR: + # __x_extra_id__ is used to pass naming information to the __new__ + # method of TestGeneratorMetaclass. + # The metaclass will make sure to create a unique, but nondescriptive + # name for this test. + BoundParamTest.__x_extra_id__ = '(%s)' % ( + _FormatParameterList(testcase_params),) + else: + raise RuntimeError('%s is not a valid naming type.' % (naming_type,)) + + BoundParamTest.__doc__ = '%s(%s)' % ( + BoundParamTest.__name__, _FormatParameterList(testcase_params)) + if test_method.__doc__: + BoundParamTest.__doc__ += '\n%s' % (test_method.__doc__,) + return BoundParamTest + return (MakeBoundParamTest(c) for c in self.testcases) + + +def _IsSingletonList(testcases): + """True iff testcases contains only a single non-tuple element.""" + return len(testcases) == 1 and not isinstance(testcases[0], tuple) + + +def _ModifyClass(class_object, testcases, naming_type): + assert not getattr(class_object, '_id_suffix', None), ( + 'Cannot add parameters to %s,' + ' which already has parameterized methods.' % (class_object,)) + class_object._id_suffix = id_suffix = {} + # We change the size of __dict__ while we iterate over it, + # which Python 3.x will complain about, so use copy(). + for name, obj in class_object.__dict__.copy().items(): + if (name.startswith(unittest.TestLoader.testMethodPrefix) + and isinstance(obj, types.FunctionType)): + delattr(class_object, name) + methods = {} + _UpdateClassDictForParamTestCase( + methods, id_suffix, name, + _ParameterizedTestIter(obj, testcases, naming_type)) + for name, meth in methods.items(): + setattr(class_object, name, meth) + + +def _ParameterDecorator(naming_type, testcases): + """Implementation of the parameterization decorators. + + Args: + naming_type: The naming type. + testcases: Testcase parameters. + + Returns: + A function for modifying the decorated object. + """ + def _Apply(obj): + if isinstance(obj, type): + _ModifyClass( + obj, + list(testcases) if not isinstance(testcases, collections_abc.Sequence) + else testcases, + naming_type) + return obj + else: + return _ParameterizedTestIter(obj, testcases, naming_type) + + if _IsSingletonList(testcases): + assert _NonStringIterable(testcases[0]), ( + 'Single parameter argument must be a non-string iterable') + testcases = testcases[0] + + return _Apply + + +def parameters(*testcases): # pylint: disable=invalid-name + """A decorator for creating parameterized tests. + + See the module docstring for a usage example. + Args: + *testcases: Parameters for the decorated method, either a single + iterable, or a list of tuples/dicts/objects (for tests + with only one argument). + + Returns: + A test generator to be handled by TestGeneratorMetaclass. + """ + return _ParameterDecorator(_ARGUMENT_REPR, testcases) + + +def named_parameters(*testcases): # pylint: disable=invalid-name + """A decorator for creating parameterized tests. + + See the module docstring for a usage example. The first element of + each parameter tuple should be a string and will be appended to the + name of the test method. + + Args: + *testcases: Parameters for the decorated method, either a single + iterable, or a list of tuples. + + Returns: + A test generator to be handled by TestGeneratorMetaclass. + """ + return _ParameterDecorator(_FIRST_ARG, testcases) + + +class TestGeneratorMetaclass(type): + """Metaclass for test cases with test generators. + + A test generator is an iterable in a testcase that produces callables. These + callables must be single-argument methods. These methods are injected into + the class namespace and the original iterable is removed. If the name of the + iterable conforms to the test pattern, the injected methods will be picked + up as tests by the unittest framework. + + In general, it is supposed to be used in conjunction with the + parameters decorator. + """ + + def __new__(mcs, class_name, bases, dct): + dct['_id_suffix'] = id_suffix = {} + for name, obj in dct.copy().items(): + if (name.startswith(unittest.TestLoader.testMethodPrefix) and + _NonStringIterable(obj)): + iterator = iter(obj) + dct.pop(name) + _UpdateClassDictForParamTestCase(dct, id_suffix, name, iterator) + + return type.__new__(mcs, class_name, bases, dct) + + +def _UpdateClassDictForParamTestCase(dct, id_suffix, name, iterator): + """Adds individual test cases to a dictionary. + + Args: + dct: The target dictionary. + id_suffix: The dictionary for mapping names to test IDs. + name: The original name of the test case. + iterator: The iterator generating the individual test cases. + """ + for idx, func in enumerate(iterator): + assert callable(func), 'Test generators must yield callables, got %r' % ( + func,) + if getattr(func, '__x_use_name__', False): + new_name = func.__name__ + else: + new_name = '%s%s%d' % (name, _SEPARATOR, idx) + assert new_name not in dct, ( + 'Name of parameterized test case "%s" not unique' % (new_name,)) + dct[new_name] = func + id_suffix[new_name] = getattr(func, '__x_extra_id__', '') + + +class TestCase(unittest.TestCase, metaclass=TestGeneratorMetaclass): + """Base class for test cases using the parameters decorator.""" + + def _OriginalName(self): + return self._testMethodName.split(_SEPARATOR)[0] + + def __str__(self): + return '%s (%s)' % (self._OriginalName(), _StrClass(self.__class__)) + + def id(self): # pylint: disable=invalid-name + """Returns the descriptive ID of the test. + + This is used internally by the unittesting framework to get a name + for the test to be used in reports. + + Returns: + The test id. + """ + return '%s.%s%s' % (_StrClass(self.__class__), + self._OriginalName(), + self._id_suffix.get(self._testMethodName, '')) + + +def CoopTestCase(other_base_class): + """Returns a new base class with a cooperative metaclass base. + + This enables the TestCase to be used in combination + with other base classes that have custom metaclasses, such as + mox.MoxTestBase. + + Only works with metaclasses that do not override type.__new__. + + Example: + + import google3 + import mox + + from google.protobuf.internal import _parameterized + + class ExampleTest(parameterized.CoopTestCase(mox.MoxTestBase)): + ... + + Args: + other_base_class: (class) A test case base class. + + Returns: + A new class object. + """ + metaclass = type( + 'CoopMetaclass', + (other_base_class.__metaclass__, + TestGeneratorMetaclass), {}) + return metaclass( + 'CoopTestCase', + (other_base_class, TestCase), {}) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/api_implementation.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/api_implementation.py new file mode 100644 index 0000000..65caf63 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/api_implementation.py @@ -0,0 +1,140 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Determine which implementation of the protobuf API is used in this process. +""" + +import importlib +import os +import sys +import warnings + + +def _ApiVersionToImplementationType(api_version): + if api_version == 2: + return 'cpp' + if api_version == 1: + raise ValueError('api_version=1 is no longer supported.') + if api_version == 0: + return 'python' + return None + + +_implementation_type = None +try: + # pylint: disable=g-import-not-at-top + from google.protobuf.internal import _api_implementation + # The compile-time constants in the _api_implementation module can be used to + # switch to a certain implementation of the Python API at build time. + _implementation_type = _ApiVersionToImplementationType( + _api_implementation.api_version) +except ImportError: + pass # Unspecified by compiler flags. + + +def _CanImport(mod_name): + try: + mod = importlib.import_module(mod_name) + # Work around a known issue in the classic bootstrap .par import hook. + if not mod: + raise ImportError(mod_name + ' import succeeded but was None') + return True + except ImportError: + return False + + +if _implementation_type is None: + if _CanImport('google._upb._message'): + _implementation_type = 'upb' + elif _CanImport('google.protobuf.pyext._message'): + _implementation_type = 'cpp' + else: + _implementation_type = 'python' + + +# This environment variable can be used to switch to a certain implementation +# of the Python API, overriding the compile-time constants in the +# _api_implementation module. Right now only 'python', 'cpp' and 'upb' are +# valid values. Any other value will raise error. +_implementation_type = os.getenv('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION', + _implementation_type) + +if _implementation_type not in ('python', 'cpp', 'upb'): + raise ValueError('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION {0} is not ' + 'supported. Please set to \'python\', \'cpp\' or ' + '\'upb\'.'.format(_implementation_type)) + +if 'PyPy' in sys.version and _implementation_type == 'cpp': + warnings.warn('PyPy does not work yet with cpp protocol buffers. ' + 'Falling back to the python implementation.') + _implementation_type = 'python' + +_c_module = None + +if _implementation_type == 'cpp': + try: + # pylint: disable=g-import-not-at-top + from google.protobuf.pyext import _message + sys.modules['google3.net.proto2.python.internal.cpp._message'] = _message + _c_module = _message + del _message + except ImportError: + # TODO: fail back to python + warnings.warn( + 'Selected implementation cpp is not available.') + pass + +if _implementation_type == 'upb': + try: + # pylint: disable=g-import-not-at-top + from google._upb import _message + _c_module = _message + del _message + except ImportError: + warnings.warn('Selected implementation upb is not available. ' + 'Falling back to the python implementation.') + _implementation_type = 'python' + pass + +# Detect if serialization should be deterministic by default +try: + # The presence of this module in a build allows the proto implementation to + # be upgraded merely via build deps. + # + # NOTE: Merely importing this automatically enables deterministic proto + # serialization for C++ code, but we still need to export it as a boolean so + # that we can do the same for `_implementation_type == 'python'`. + # + # NOTE2: It is possible for C++ code to enable deterministic serialization by + # default _without_ affecting Python code, if the C++ implementation is not in + # use by this module. That is intended behavior, so we don't actually expose + # this boolean outside of this module. + # + # pylint: disable=g-import-not-at-top,unused-import + from google.protobuf import enable_deterministic_proto_serialization + _python_deterministic_proto_serialization = True +except ImportError: + _python_deterministic_proto_serialization = False + + +# Usage of this function is discouraged. Clients shouldn't care which +# implementation of the API is in use. Note that there is no guarantee +# that differences between APIs will be maintained. +# Please don't use this function if possible. +def Type(): + return _implementation_type + + +# See comment on 'Type' above. +# TODO: Remove the API, it returns a constant. b/228102101 +def Version(): + return 2 + + +# For internal use only +def IsPythonDefaultSerializationDeterministic(): + return _python_deterministic_proto_serialization diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/builder.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/builder.py new file mode 100644 index 0000000..c22d994 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/builder.py @@ -0,0 +1,118 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Builds descriptors, message classes and services for generated _pb2.py. + +This file is only called in python generated _pb2.py files. It builds +descriptors, message classes and services that users can directly use +in generated code. +""" + +__author__ = 'jieluo@google.com (Jie Luo)' + +from google.protobuf.internal import enum_type_wrapper +from google.protobuf.internal import python_message +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +_sym_db = _symbol_database.Default() + + +def BuildMessageAndEnumDescriptors(file_des, module): + """Builds message and enum descriptors. + + Args: + file_des: FileDescriptor of the .proto file + module: Generated _pb2 module + """ + + def BuildNestedDescriptors(msg_des, prefix): + for (name, nested_msg) in msg_des.nested_types_by_name.items(): + module_name = prefix + name.upper() + module[module_name] = nested_msg + BuildNestedDescriptors(nested_msg, module_name + '_') + for enum_des in msg_des.enum_types: + module[prefix + enum_des.name.upper()] = enum_des + + for (name, msg_des) in file_des.message_types_by_name.items(): + module_name = '_' + name.upper() + module[module_name] = msg_des + BuildNestedDescriptors(msg_des, module_name + '_') + + +def BuildTopDescriptorsAndMessages(file_des, module_name, module): + """Builds top level descriptors and message classes. + + Args: + file_des: FileDescriptor of the .proto file + module_name: str, the name of generated _pb2 module + module: Generated _pb2 module + """ + + def BuildMessage(msg_des): + create_dict = {} + for (name, nested_msg) in msg_des.nested_types_by_name.items(): + create_dict[name] = BuildMessage(nested_msg) + create_dict['DESCRIPTOR'] = msg_des + create_dict['__module__'] = module_name + message_class = _reflection.GeneratedProtocolMessageType( + msg_des.name, (_message.Message,), create_dict) + _sym_db.RegisterMessage(message_class) + return message_class + + # top level enums + for (name, enum_des) in file_des.enum_types_by_name.items(): + module['_' + name.upper()] = enum_des + module[name] = enum_type_wrapper.EnumTypeWrapper(enum_des) + for enum_value in enum_des.values: + module[enum_value.name] = enum_value.number + + # top level extensions + for (name, extension_des) in file_des.extensions_by_name.items(): + module[name.upper() + '_FIELD_NUMBER'] = extension_des.number + module[name] = extension_des + + # services + for (name, service) in file_des.services_by_name.items(): + module['_' + name.upper()] = service + + # Build messages. + for (name, msg_des) in file_des.message_types_by_name.items(): + module[name] = BuildMessage(msg_des) + + +def AddHelpersToExtensions(file_des): + """no-op to keep old generated code work with new runtime. + + Args: + file_des: FileDescriptor of the .proto file + """ + # TODO: Remove this on-op + return + + +def BuildServices(file_des, module_name, module): + """Builds services classes and services stub class. + + Args: + file_des: FileDescriptor of the .proto file + module_name: str, the name of generated _pb2 module + module: Generated _pb2 module + """ + # pylint: disable=g-import-not-at-top + from google.protobuf import service as _service + from google.protobuf import service_reflection + # pylint: enable=g-import-not-at-top + for (name, service) in file_des.services_by_name.items(): + module[name] = service_reflection.GeneratedServiceType( + name, (_service.Service,), + dict(DESCRIPTOR=service, __module__=module_name)) + stub_name = name + '_Stub' + module[stub_name] = service_reflection.GeneratedServiceStubType( + stub_name, (module[name],), + dict(DESCRIPTOR=service, __module__=module_name)) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/containers.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/containers.py new file mode 100644 index 0000000..20c6d98 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/containers.py @@ -0,0 +1,687 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Contains container classes to represent different protocol buffer types. + +This file defines container classes which represent categories of protocol +buffer field types which need extra maintenance. Currently these categories +are: + +- Repeated scalar fields - These are all repeated fields which aren't + composite (e.g. they are of simple types like int32, string, etc). +- Repeated composite fields - Repeated fields which are composite. This + includes groups and nested messages. +""" + +import collections.abc +import copy +import pickle +from typing import ( + Any, + Iterable, + Iterator, + List, + MutableMapping, + MutableSequence, + NoReturn, + Optional, + Sequence, + TypeVar, + Union, + overload, +) + + +_T = TypeVar('_T') +_K = TypeVar('_K') +_V = TypeVar('_V') + + +class BaseContainer(Sequence[_T]): + """Base container class.""" + + # Minimizes memory usage and disallows assignment to other attributes. + __slots__ = ['_message_listener', '_values'] + + def __init__(self, message_listener: Any) -> None: + """ + Args: + message_listener: A MessageListener implementation. + The RepeatedScalarFieldContainer will call this object's + Modified() method when it is modified. + """ + self._message_listener = message_listener + self._values = [] + + @overload + def __getitem__(self, key: int) -> _T: + ... + + @overload + def __getitem__(self, key: slice) -> List[_T]: + ... + + def __getitem__(self, key): + """Retrieves item by the specified key.""" + return self._values[key] + + def __len__(self) -> int: + """Returns the number of elements in the container.""" + return len(self._values) + + def __ne__(self, other: Any) -> bool: + """Checks if another instance isn't equal to this one.""" + # The concrete classes should define __eq__. + return not self == other + + __hash__ = None + + def __repr__(self) -> str: + return repr(self._values) + + def sort(self, *args, **kwargs) -> None: + # Continue to support the old sort_function keyword argument. + # This is expected to be a rare occurrence, so use LBYL to avoid + # the overhead of actually catching KeyError. + if 'sort_function' in kwargs: + kwargs['cmp'] = kwargs.pop('sort_function') + self._values.sort(*args, **kwargs) + + def reverse(self) -> None: + self._values.reverse() + + +# TODO: Remove this. BaseContainer does *not* conform to +# MutableSequence, only its subclasses do. +collections.abc.MutableSequence.register(BaseContainer) + + +class RepeatedScalarFieldContainer(BaseContainer[_T], MutableSequence[_T]): + """Simple, type-checked, list-like container for holding repeated scalars.""" + + # Disallows assignment to other attributes. + __slots__ = ['_type_checker'] + + def __init__( + self, + message_listener: Any, + type_checker: Any, + ) -> None: + """Args: + + message_listener: A MessageListener implementation. The + RepeatedScalarFieldContainer will call this object's Modified() method + when it is modified. + type_checker: A type_checkers.ValueChecker instance to run on elements + inserted into this container. + """ + super().__init__(message_listener) + self._type_checker = type_checker + + def append(self, value: _T) -> None: + """Appends an item to the list. Similar to list.append().""" + self._values.append(self._type_checker.CheckValue(value)) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def insert(self, key: int, value: _T) -> None: + """Inserts the item at the specified position. Similar to list.insert().""" + self._values.insert(key, self._type_checker.CheckValue(value)) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def extend(self, elem_seq: Iterable[_T]) -> None: + """Extends by appending the given iterable. Similar to list.extend().""" +# TODO: Change OSS to raise error too + if elem_seq is None: + return + try: + elem_seq_iter = iter(elem_seq) + except TypeError: + if not elem_seq: + warnings.warn('Value is not iterable. Please remove the wrong ' + 'usage. This will be changed to raise TypeError soon.') + return + raise + new_values = [self._type_checker.CheckValue(elem) for elem in elem_seq_iter] + if new_values: + self._values.extend(new_values) + self._message_listener.Modified() + + def MergeFrom( + self, + other: Union['RepeatedScalarFieldContainer[_T]', Iterable[_T]], + ) -> None: + """Appends the contents of another repeated field of the same type to this + one. We do not check the types of the individual fields. + """ + self._values.extend(other) + self._message_listener.Modified() + + def remove(self, elem: _T): + """Removes an item from the list. Similar to list.remove().""" + self._values.remove(elem) + self._message_listener.Modified() + + def pop(self, key: Optional[int] = -1) -> _T: + """Removes and returns an item at a given index. Similar to list.pop().""" + value = self._values[key] + self.__delitem__(key) + return value + + @overload + def __setitem__(self, key: int, value: _T) -> None: + ... + + @overload + def __setitem__(self, key: slice, value: Iterable[_T]) -> None: + ... + + def __setitem__(self, key, value) -> None: + """Sets the item on the specified position.""" + if isinstance(key, slice): + if key.step is not None: + raise ValueError('Extended slices not supported') + self._values[key] = map(self._type_checker.CheckValue, value) + self._message_listener.Modified() + else: + self._values[key] = self._type_checker.CheckValue(value) + self._message_listener.Modified() + + def __delitem__(self, key: Union[int, slice]) -> None: + """Deletes the item at the specified position.""" + del self._values[key] + self._message_listener.Modified() + + def __eq__(self, other: Any) -> bool: + """Compares the current instance with another one.""" + if self is other: + return True + # Special case for the same type which should be common and fast. + if isinstance(other, self.__class__): + return other._values == self._values + # We are presumably comparing against some other sequence type. + return other == self._values + + def __deepcopy__( + self, + unused_memo: Any = None, + ) -> 'RepeatedScalarFieldContainer[_T]': + clone = RepeatedScalarFieldContainer( + copy.deepcopy(self._message_listener), self._type_checker) + clone.MergeFrom(self) + return clone + + def __reduce__(self, **kwargs) -> NoReturn: + raise pickle.PickleError( + "Can't pickle repeated scalar fields, convert to list first") + + +# TODO: Constrain T to be a subtype of Message. +class RepeatedCompositeFieldContainer(BaseContainer[_T], MutableSequence[_T]): + """Simple, list-like container for holding repeated composite fields.""" + + # Disallows assignment to other attributes. + __slots__ = ['_message_descriptor'] + + def __init__(self, message_listener: Any, message_descriptor: Any) -> None: + """ + Note that we pass in a descriptor instead of the generated directly, + since at the time we construct a _RepeatedCompositeFieldContainer we + haven't yet necessarily initialized the type that will be contained in the + container. + + Args: + message_listener: A MessageListener implementation. + The RepeatedCompositeFieldContainer will call this object's + Modified() method when it is modified. + message_descriptor: A Descriptor instance describing the protocol type + that should be present in this container. We'll use the + _concrete_class field of this descriptor when the client calls add(). + """ + super().__init__(message_listener) + self._message_descriptor = message_descriptor + + def add(self, **kwargs: Any) -> _T: + """Adds a new element at the end of the list and returns it. Keyword + arguments may be used to initialize the element. + """ + new_element = self._message_descriptor._concrete_class(**kwargs) + new_element._SetListener(self._message_listener) + self._values.append(new_element) + if not self._message_listener.dirty: + self._message_listener.Modified() + return new_element + + def append(self, value: _T) -> None: + """Appends one element by copying the message.""" + new_element = self._message_descriptor._concrete_class() + new_element._SetListener(self._message_listener) + new_element.CopyFrom(value) + self._values.append(new_element) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def insert(self, key: int, value: _T) -> None: + """Inserts the item at the specified position by copying.""" + new_element = self._message_descriptor._concrete_class() + new_element._SetListener(self._message_listener) + new_element.CopyFrom(value) + self._values.insert(key, new_element) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def extend(self, elem_seq: Iterable[_T]) -> None: + """Extends by appending the given sequence of elements of the same type + + as this one, copying each individual message. + """ + message_class = self._message_descriptor._concrete_class + listener = self._message_listener + values = self._values + for message in elem_seq: + new_element = message_class() + new_element._SetListener(listener) + new_element.MergeFrom(message) + values.append(new_element) + listener.Modified() + + def MergeFrom( + self, + other: Union['RepeatedCompositeFieldContainer[_T]', Iterable[_T]], + ) -> None: + """Appends the contents of another repeated field of the same type to this + one, copying each individual message. + """ + self.extend(other) + + def remove(self, elem: _T) -> None: + """Removes an item from the list. Similar to list.remove().""" + self._values.remove(elem) + self._message_listener.Modified() + + def pop(self, key: Optional[int] = -1) -> _T: + """Removes and returns an item at a given index. Similar to list.pop().""" + value = self._values[key] + self.__delitem__(key) + return value + + @overload + def __setitem__(self, key: int, value: _T) -> None: + ... + + @overload + def __setitem__(self, key: slice, value: Iterable[_T]) -> None: + ... + + def __setitem__(self, key, value): + # This method is implemented to make RepeatedCompositeFieldContainer + # structurally compatible with typing.MutableSequence. It is + # otherwise unsupported and will always raise an error. + raise TypeError( + f'{self.__class__.__name__} object does not support item assignment') + + def __delitem__(self, key: Union[int, slice]) -> None: + """Deletes the item at the specified position.""" + del self._values[key] + self._message_listener.Modified() + + def __eq__(self, other: Any) -> bool: + """Compares the current instance with another one.""" + if self is other: + return True + if not isinstance(other, self.__class__): + raise TypeError('Can only compare repeated composite fields against ' + 'other repeated composite fields.') + return self._values == other._values + + +class ScalarMap(MutableMapping[_K, _V]): + """Simple, type-checked, dict-like container for holding repeated scalars.""" + + # Disallows assignment to other attributes. + __slots__ = ['_key_checker', '_value_checker', '_values', '_message_listener', + '_entry_descriptor'] + + def __init__( + self, + message_listener: Any, + key_checker: Any, + value_checker: Any, + entry_descriptor: Any, + ) -> None: + """ + Args: + message_listener: A MessageListener implementation. + The ScalarMap will call this object's Modified() method when it + is modified. + key_checker: A type_checkers.ValueChecker instance to run on keys + inserted into this container. + value_checker: A type_checkers.ValueChecker instance to run on values + inserted into this container. + entry_descriptor: The MessageDescriptor of a map entry: key and value. + """ + self._message_listener = message_listener + self._key_checker = key_checker + self._value_checker = value_checker + self._entry_descriptor = entry_descriptor + self._values = {} + + def __getitem__(self, key: _K) -> _V: + try: + return self._values[key] + except KeyError: + key = self._key_checker.CheckValue(key) + val = self._value_checker.DefaultValue() + self._values[key] = val + return val + + def __contains__(self, item: _K) -> bool: + # We check the key's type to match the strong-typing flavor of the API. + # Also this makes it easier to match the behavior of the C++ implementation. + self._key_checker.CheckValue(item) + return item in self._values + + @overload + def get(self, key: _K) -> Optional[_V]: + ... + + @overload + def get(self, key: _K, default: _T) -> Union[_V, _T]: + ... + + # We need to override this explicitly, because our defaultdict-like behavior + # will make the default implementation (from our base class) always insert + # the key. + def get(self, key, default=None): + if key in self: + return self[key] + else: + return default + + def __setitem__(self, key: _K, value: _V) -> _T: + checked_key = self._key_checker.CheckValue(key) + checked_value = self._value_checker.CheckValue(value) + self._values[checked_key] = checked_value + self._message_listener.Modified() + + def __delitem__(self, key: _K) -> None: + del self._values[key] + self._message_listener.Modified() + + def __len__(self) -> int: + return len(self._values) + + def __iter__(self) -> Iterator[_K]: + return iter(self._values) + + def __repr__(self) -> str: + return repr(self._values) + + def MergeFrom(self, other: 'ScalarMap[_K, _V]') -> None: + self._values.update(other._values) + self._message_listener.Modified() + + def InvalidateIterators(self) -> None: + # It appears that the only way to reliably invalidate iterators to + # self._values is to ensure that its size changes. + original = self._values + self._values = original.copy() + original[None] = None + + # This is defined in the abstract base, but we can do it much more cheaply. + def clear(self) -> None: + self._values.clear() + self._message_listener.Modified() + + def GetEntryClass(self) -> Any: + return self._entry_descriptor._concrete_class + + +class MessageMap(MutableMapping[_K, _V]): + """Simple, type-checked, dict-like container for with submessage values.""" + + # Disallows assignment to other attributes. + __slots__ = ['_key_checker', '_values', '_message_listener', + '_message_descriptor', '_entry_descriptor'] + + def __init__( + self, + message_listener: Any, + message_descriptor: Any, + key_checker: Any, + entry_descriptor: Any, + ) -> None: + """ + Args: + message_listener: A MessageListener implementation. + The ScalarMap will call this object's Modified() method when it + is modified. + key_checker: A type_checkers.ValueChecker instance to run on keys + inserted into this container. + value_checker: A type_checkers.ValueChecker instance to run on values + inserted into this container. + entry_descriptor: The MessageDescriptor of a map entry: key and value. + """ + self._message_listener = message_listener + self._message_descriptor = message_descriptor + self._key_checker = key_checker + self._entry_descriptor = entry_descriptor + self._values = {} + + def __getitem__(self, key: _K) -> _V: + key = self._key_checker.CheckValue(key) + try: + return self._values[key] + except KeyError: + new_element = self._message_descriptor._concrete_class() + new_element._SetListener(self._message_listener) + self._values[key] = new_element + self._message_listener.Modified() + return new_element + + def get_or_create(self, key: _K) -> _V: + """get_or_create() is an alias for getitem (ie. map[key]). + + Args: + key: The key to get or create in the map. + + This is useful in cases where you want to be explicit that the call is + mutating the map. This can avoid lint errors for statements like this + that otherwise would appear to be pointless statements: + + msg.my_map[key] + """ + return self[key] + + @overload + def get(self, key: _K) -> Optional[_V]: + ... + + @overload + def get(self, key: _K, default: _T) -> Union[_V, _T]: + ... + + # We need to override this explicitly, because our defaultdict-like behavior + # will make the default implementation (from our base class) always insert + # the key. + def get(self, key, default=None): + if key in self: + return self[key] + else: + return default + + def __contains__(self, item: _K) -> bool: + item = self._key_checker.CheckValue(item) + return item in self._values + + def __setitem__(self, key: _K, value: _V) -> NoReturn: + raise ValueError('May not set values directly, call my_map[key].foo = 5') + + def __delitem__(self, key: _K) -> None: + key = self._key_checker.CheckValue(key) + del self._values[key] + self._message_listener.Modified() + + def __len__(self) -> int: + return len(self._values) + + def __iter__(self) -> Iterator[_K]: + return iter(self._values) + + def __repr__(self) -> str: + return repr(self._values) + + def MergeFrom(self, other: 'MessageMap[_K, _V]') -> None: + # pylint: disable=protected-access + for key in other._values: + # According to documentation: "When parsing from the wire or when merging, + # if there are duplicate map keys the last key seen is used". + if key in self: + del self[key] + self[key].CopyFrom(other[key]) + # self._message_listener.Modified() not required here, because + # mutations to submessages already propagate. + + def InvalidateIterators(self) -> None: + # It appears that the only way to reliably invalidate iterators to + # self._values is to ensure that its size changes. + original = self._values + self._values = original.copy() + original[None] = None + + # This is defined in the abstract base, but we can do it much more cheaply. + def clear(self) -> None: + self._values.clear() + self._message_listener.Modified() + + def GetEntryClass(self) -> Any: + return self._entry_descriptor._concrete_class + + +class _UnknownField: + """A parsed unknown field.""" + + # Disallows assignment to other attributes. + __slots__ = ['_field_number', '_wire_type', '_data'] + + def __init__(self, field_number, wire_type, data): + self._field_number = field_number + self._wire_type = wire_type + self._data = data + return + + def __lt__(self, other): + # pylint: disable=protected-access + return self._field_number < other._field_number + + def __eq__(self, other): + if self is other: + return True + # pylint: disable=protected-access + return (self._field_number == other._field_number and + self._wire_type == other._wire_type and + self._data == other._data) + + +class UnknownFieldRef: # pylint: disable=missing-class-docstring + + def __init__(self, parent, index): + self._parent = parent + self._index = index + + def _check_valid(self): + if not self._parent: + raise ValueError('UnknownField does not exist. ' + 'The parent message might be cleared.') + if self._index >= len(self._parent): + raise ValueError('UnknownField does not exist. ' + 'The parent message might be cleared.') + + @property + def field_number(self): + self._check_valid() + # pylint: disable=protected-access + return self._parent._internal_get(self._index)._field_number + + @property + def wire_type(self): + self._check_valid() + # pylint: disable=protected-access + return self._parent._internal_get(self._index)._wire_type + + @property + def data(self): + self._check_valid() + # pylint: disable=protected-access + return self._parent._internal_get(self._index)._data + + +class UnknownFieldSet: + """UnknownField container""" + + # Disallows assignment to other attributes. + __slots__ = ['_values'] + + def __init__(self): + self._values = [] + + def __getitem__(self, index): + if self._values is None: + raise ValueError('UnknownFields does not exist. ' + 'The parent message might be cleared.') + size = len(self._values) + if index < 0: + index += size + if index < 0 or index >= size: + raise IndexError('index %d out of range'.index) + + return UnknownFieldRef(self, index) + + def _internal_get(self, index): + return self._values[index] + + def __len__(self): + if self._values is None: + raise ValueError('UnknownFields does not exist. ' + 'The parent message might be cleared.') + return len(self._values) + + def _add(self, field_number, wire_type, data): + unknown_field = _UnknownField(field_number, wire_type, data) + self._values.append(unknown_field) + return unknown_field + + def __iter__(self): + for i in range(len(self)): + yield UnknownFieldRef(self, i) + + def _extend(self, other): + if other is None: + return + # pylint: disable=protected-access + self._values.extend(other._values) + + def __eq__(self, other): + if self is other: + return True + # Sort unknown fields because their order shouldn't + # affect equality test. + values = list(self._values) + if other is None: + return not values + values.sort() + # pylint: disable=protected-access + other_values = sorted(other._values) + return values == other_values + + def _clear(self): + for value in self._values: + # pylint: disable=protected-access + if isinstance(value._data, UnknownFieldSet): + value._data._clear() # pylint: disable=protected-access + self._values = None diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/decoder.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/decoder.py new file mode 100644 index 0000000..acb91aa --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/decoder.py @@ -0,0 +1,1044 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Code for decoding protocol buffer primitives. + +This code is very similar to encoder.py -- read the docs for that module first. + +A "decoder" is a function with the signature: + Decode(buffer, pos, end, message, field_dict) +The arguments are: + buffer: The string containing the encoded message. + pos: The current position in the string. + end: The position in the string where the current message ends. May be + less than len(buffer) if we're reading a sub-message. + message: The message object into which we're parsing. + field_dict: message._fields (avoids a hashtable lookup). +The decoder reads the field and stores it into field_dict, returning the new +buffer position. A decoder for a repeated field may proactively decode all of +the elements of that field, if they appear consecutively. + +Note that decoders may throw any of the following: + IndexError: Indicates a truncated message. + struct.error: Unpacking of a fixed-width field failed. + message.DecodeError: Other errors. + +Decoders are expected to raise an exception if they are called with pos > end. +This allows callers to be lax about bounds checking: it's fineto read past +"end" as long as you are sure that someone else will notice and throw an +exception later on. + +Something up the call stack is expected to catch IndexError and struct.error +and convert them to message.DecodeError. + +Decoders are constructed using decoder constructors with the signature: + MakeDecoder(field_number, is_repeated, is_packed, key, new_default) +The arguments are: + field_number: The field number of the field we want to decode. + is_repeated: Is the field a repeated field? (bool) + is_packed: Is the field a packed field? (bool) + key: The key to use when looking up the field within field_dict. + (This is actually the FieldDescriptor but nothing in this + file should depend on that.) + new_default: A function which takes a message object as a parameter and + returns a new instance of the default value for this field. + (This is called for repeated fields and sub-messages, when an + instance does not already exist.) + +As with encoders, we define a decoder constructor for every type of field. +Then, for every field of every message class we construct an actual decoder. +That decoder goes into a dict indexed by tag, so when we decode a message +we repeatedly read a tag, look up the corresponding decoder, and invoke it. +""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import math +import struct + +from google.protobuf.internal import containers +from google.protobuf.internal import encoder +from google.protobuf.internal import wire_format +from google.protobuf import message + + +# This is not for optimization, but rather to avoid conflicts with local +# variables named "message". +_DecodeError = message.DecodeError + + +def _VarintDecoder(mask, result_type): + """Return an encoder for a basic varint value (does not include tag). + + Decoded values will be bitwise-anded with the given mask before being + returned, e.g. to limit them to 32 bits. The returned decoder does not + take the usual "end" parameter -- the caller is expected to do bounds checking + after the fact (often the caller can defer such checking until later). The + decoder returns a (value, new_pos) pair. + """ + + def DecodeVarint(buffer, pos): + result = 0 + shift = 0 + while 1: + b = buffer[pos] + result |= ((b & 0x7f) << shift) + pos += 1 + if not (b & 0x80): + result &= mask + result = result_type(result) + return (result, pos) + shift += 7 + if shift >= 64: + raise _DecodeError('Too many bytes when decoding varint.') + return DecodeVarint + + +def _SignedVarintDecoder(bits, result_type): + """Like _VarintDecoder() but decodes signed values.""" + + signbit = 1 << (bits - 1) + mask = (1 << bits) - 1 + + def DecodeVarint(buffer, pos): + result = 0 + shift = 0 + while 1: + b = buffer[pos] + result |= ((b & 0x7f) << shift) + pos += 1 + if not (b & 0x80): + result &= mask + result = (result ^ signbit) - signbit + result = result_type(result) + return (result, pos) + shift += 7 + if shift >= 64: + raise _DecodeError('Too many bytes when decoding varint.') + return DecodeVarint + +# All 32-bit and 64-bit values are represented as int. +_DecodeVarint = _VarintDecoder((1 << 64) - 1, int) +_DecodeSignedVarint = _SignedVarintDecoder(64, int) + +# Use these versions for values which must be limited to 32 bits. +_DecodeVarint32 = _VarintDecoder((1 << 32) - 1, int) +_DecodeSignedVarint32 = _SignedVarintDecoder(32, int) + + +def ReadTag(buffer, pos): + """Read a tag from the memoryview, and return a (tag_bytes, new_pos) tuple. + + We return the raw bytes of the tag rather than decoding them. The raw + bytes can then be used to look up the proper decoder. This effectively allows + us to trade some work that would be done in pure-python (decoding a varint) + for work that is done in C (searching for a byte string in a hash table). + In a low-level language it would be much cheaper to decode the varint and + use that, but not in Python. + + Args: + buffer: memoryview object of the encoded bytes + pos: int of the current position to start from + + Returns: + Tuple[bytes, int] of the tag data and new position. + """ + start = pos + while buffer[pos] & 0x80: + pos += 1 + pos += 1 + + tag_bytes = buffer[start:pos].tobytes() + return tag_bytes, pos + + +# -------------------------------------------------------------------- + + +def _SimpleDecoder(wire_type, decode_value): + """Return a constructor for a decoder for fields of a particular type. + + Args: + wire_type: The field's wire type. + decode_value: A function which decodes an individual value, e.g. + _DecodeVarint() + """ + + def SpecificDecoder(field_number, is_repeated, is_packed, key, new_default, + clear_if_default=False): + if is_packed: + local_DecodeVarint = _DecodeVarint + def DecodePackedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + (endpoint, pos) = local_DecodeVarint(buffer, pos) + endpoint += pos + if endpoint > end: + raise _DecodeError('Truncated message.') + while pos < endpoint: + (element, pos) = decode_value(buffer, pos) + value.append(element) + if pos > endpoint: + del value[-1] # Discard corrupt value. + raise _DecodeError('Packed element was truncated.') + return pos + return DecodePackedField + elif is_repeated: + tag_bytes = encoder.TagBytes(field_number, wire_type) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (element, new_pos) = decode_value(buffer, pos) + value.append(element) + # Predict that the next tag is another copy of the same repeated + # field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos >= end: + # Prediction failed. Return. + if new_pos > end: + raise _DecodeError('Truncated message.') + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (new_value, pos) = decode_value(buffer, pos) + if pos > end: + raise _DecodeError('Truncated message.') + if clear_if_default and not new_value: + field_dict.pop(key, None) + else: + field_dict[key] = new_value + return pos + return DecodeField + + return SpecificDecoder + + +def _ModifiedDecoder(wire_type, decode_value, modify_value): + """Like SimpleDecoder but additionally invokes modify_value on every value + before storing it. Usually modify_value is ZigZagDecode. + """ + + # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but + # not enough to make a significant difference. + + def InnerDecode(buffer, pos): + (result, new_pos) = decode_value(buffer, pos) + return (modify_value(result), new_pos) + return _SimpleDecoder(wire_type, InnerDecode) + + +def _StructPackDecoder(wire_type, format): + """Return a constructor for a decoder for a fixed-width field. + + Args: + wire_type: The field's wire type. + format: The format string to pass to struct.unpack(). + """ + + value_size = struct.calcsize(format) + local_unpack = struct.unpack + + # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but + # not enough to make a significant difference. + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + + def InnerDecode(buffer, pos): + new_pos = pos + value_size + result = local_unpack(format, buffer[pos:new_pos])[0] + return (result, new_pos) + return _SimpleDecoder(wire_type, InnerDecode) + + +def _FloatDecoder(): + """Returns a decoder for a float field. + + This code works around a bug in struct.unpack for non-finite 32-bit + floating-point values. + """ + + local_unpack = struct.unpack + + def InnerDecode(buffer, pos): + """Decode serialized float to a float and new position. + + Args: + buffer: memoryview of the serialized bytes + pos: int, position in the memory view to start at. + + Returns: + Tuple[float, int] of the deserialized float value and new position + in the serialized data. + """ + # We expect a 32-bit value in little-endian byte order. Bit 1 is the sign + # bit, bits 2-9 represent the exponent, and bits 10-32 are the significand. + new_pos = pos + 4 + float_bytes = buffer[pos:new_pos].tobytes() + + # If this value has all its exponent bits set, then it's non-finite. + # In Python 2.4, struct.unpack will convert it to a finite 64-bit value. + # To avoid that, we parse it specially. + if (float_bytes[3:4] in b'\x7F\xFF' and float_bytes[2:3] >= b'\x80'): + # If at least one significand bit is set... + if float_bytes[0:3] != b'\x00\x00\x80': + return (math.nan, new_pos) + # If sign bit is set... + if float_bytes[3:4] == b'\xFF': + return (-math.inf, new_pos) + return (math.inf, new_pos) + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + result = local_unpack('= b'\xF0') + and (double_bytes[0:7] != b'\x00\x00\x00\x00\x00\x00\xF0')): + return (math.nan, new_pos) + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + result = local_unpack(' end: + raise _DecodeError('Truncated message.') + while pos < endpoint: + value_start_pos = pos + (element, pos) = _DecodeSignedVarint32(buffer, pos) + # pylint: disable=protected-access + if element in enum_type.values_by_number: + value.append(element) + else: + if not message._unknown_fields: + message._unknown_fields = [] + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_VARINT) + + message._unknown_fields.append( + (tag_bytes, buffer[value_start_pos:pos].tobytes())) + if message._unknown_field_set is None: + message._unknown_field_set = containers.UnknownFieldSet() + message._unknown_field_set._add( + field_number, wire_format.WIRETYPE_VARINT, element) + # pylint: enable=protected-access + if pos > endpoint: + if element in enum_type.values_by_number: + del value[-1] # Discard corrupt value. + else: + del message._unknown_fields[-1] + # pylint: disable=protected-access + del message._unknown_field_set._values[-1] + # pylint: enable=protected-access + raise _DecodeError('Packed element was truncated.') + return pos + return DecodePackedField + elif is_repeated: + tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_VARINT) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + """Decode serialized repeated enum to its value and a new position. + + Args: + buffer: memoryview of the serialized bytes. + pos: int, position in the memory view to start at. + end: int, end position of serialized data + message: Message object to store unknown fields in + field_dict: Map[Descriptor, Any] to store decoded values in. + + Returns: + int, new position in serialized data. + """ + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (element, new_pos) = _DecodeSignedVarint32(buffer, pos) + # pylint: disable=protected-access + if element in enum_type.values_by_number: + value.append(element) + else: + if not message._unknown_fields: + message._unknown_fields = [] + message._unknown_fields.append( + (tag_bytes, buffer[pos:new_pos].tobytes())) + if message._unknown_field_set is None: + message._unknown_field_set = containers.UnknownFieldSet() + message._unknown_field_set._add( + field_number, wire_format.WIRETYPE_VARINT, element) + # pylint: enable=protected-access + # Predict that the next tag is another copy of the same repeated + # field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos >= end: + # Prediction failed. Return. + if new_pos > end: + raise _DecodeError('Truncated message.') + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + """Decode serialized repeated enum to its value and a new position. + + Args: + buffer: memoryview of the serialized bytes. + pos: int, position in the memory view to start at. + end: int, end position of serialized data + message: Message object to store unknown fields in + field_dict: Map[Descriptor, Any] to store decoded values in. + + Returns: + int, new position in serialized data. + """ + value_start_pos = pos + (enum_value, pos) = _DecodeSignedVarint32(buffer, pos) + if pos > end: + raise _DecodeError('Truncated message.') + if clear_if_default and not enum_value: + field_dict.pop(key, None) + return pos + # pylint: disable=protected-access + if enum_value in enum_type.values_by_number: + field_dict[key] = enum_value + else: + if not message._unknown_fields: + message._unknown_fields = [] + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_VARINT) + message._unknown_fields.append( + (tag_bytes, buffer[value_start_pos:pos].tobytes())) + if message._unknown_field_set is None: + message._unknown_field_set = containers.UnknownFieldSet() + message._unknown_field_set._add( + field_number, wire_format.WIRETYPE_VARINT, enum_value) + # pylint: enable=protected-access + return pos + return DecodeField + + +# -------------------------------------------------------------------- + + +Int32Decoder = _SimpleDecoder( + wire_format.WIRETYPE_VARINT, _DecodeSignedVarint32) + +Int64Decoder = _SimpleDecoder( + wire_format.WIRETYPE_VARINT, _DecodeSignedVarint) + +UInt32Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint32) +UInt64Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint) + +SInt32Decoder = _ModifiedDecoder( + wire_format.WIRETYPE_VARINT, _DecodeVarint32, wire_format.ZigZagDecode) +SInt64Decoder = _ModifiedDecoder( + wire_format.WIRETYPE_VARINT, _DecodeVarint, wire_format.ZigZagDecode) + +# Note that Python conveniently guarantees that when using the '<' prefix on +# formats, they will also have the same size across all platforms (as opposed +# to without the prefix, where their sizes depend on the C compiler's basic +# type sizes). +Fixed32Decoder = _StructPackDecoder(wire_format.WIRETYPE_FIXED32, ' end: + raise _DecodeError('Truncated string.') + value.append(_ConvertToUnicode(buffer[pos:new_pos])) + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + if clear_if_default and not size: + field_dict.pop(key, None) + else: + field_dict[key] = _ConvertToUnicode(buffer[pos:new_pos]) + return new_pos + return DecodeField + + +def BytesDecoder(field_number, is_repeated, is_packed, key, new_default, + clear_if_default=False): + """Returns a decoder for a bytes field.""" + + local_DecodeVarint = _DecodeVarint + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + value.append(buffer[pos:new_pos].tobytes()) + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + if clear_if_default and not size: + field_dict.pop(key, None) + else: + field_dict[key] = buffer[pos:new_pos].tobytes() + return new_pos + return DecodeField + + +def GroupDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a group field.""" + + end_tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_END_GROUP) + end_tag_len = len(end_tag_bytes) + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_START_GROUP) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read sub-message. + pos = value.add()._InternalParse(buffer, pos, end) + # Read end tag. + new_pos = pos+end_tag_len + if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: + raise _DecodeError('Missing group end tag.') + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read sub-message. + pos = value._InternalParse(buffer, pos, end) + # Read end tag. + new_pos = pos+end_tag_len + if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: + raise _DecodeError('Missing group end tag.') + return new_pos + return DecodeField + + +def MessageDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a message field.""" + + local_DecodeVarint = _DecodeVarint + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + if value.add()._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + if value._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it encountered + # an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + return new_pos + return DecodeField + + +# -------------------------------------------------------------------- + +MESSAGE_SET_ITEM_TAG = encoder.TagBytes(1, wire_format.WIRETYPE_START_GROUP) + +def MessageSetItemDecoder(descriptor): + """Returns a decoder for a MessageSet item. + + The parameter is the message Descriptor. + + The message set message looks like this: + message MessageSet { + repeated group Item = 1 { + required int32 type_id = 2; + required string message = 3; + } + } + """ + + type_id_tag_bytes = encoder.TagBytes(2, wire_format.WIRETYPE_VARINT) + message_tag_bytes = encoder.TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED) + item_end_tag_bytes = encoder.TagBytes(1, wire_format.WIRETYPE_END_GROUP) + + local_ReadTag = ReadTag + local_DecodeVarint = _DecodeVarint + local_SkipField = SkipField + + def DecodeItem(buffer, pos, end, message, field_dict): + """Decode serialized message set to its value and new position. + + Args: + buffer: memoryview of the serialized bytes. + pos: int, position in the memory view to start at. + end: int, end position of serialized data + message: Message object to store unknown fields in + field_dict: Map[Descriptor, Any] to store decoded values in. + + Returns: + int, new position in serialized data. + """ + message_set_item_start = pos + type_id = -1 + message_start = -1 + message_end = -1 + + # Technically, type_id and message can appear in any order, so we need + # a little loop here. + while 1: + (tag_bytes, pos) = local_ReadTag(buffer, pos) + if tag_bytes == type_id_tag_bytes: + (type_id, pos) = local_DecodeVarint(buffer, pos) + elif tag_bytes == message_tag_bytes: + (size, message_start) = local_DecodeVarint(buffer, pos) + pos = message_end = message_start + size + elif tag_bytes == item_end_tag_bytes: + break + else: + pos = SkipField(buffer, pos, end, tag_bytes) + if pos == -1: + raise _DecodeError('Missing group end tag.') + + if pos > end: + raise _DecodeError('Truncated message.') + + if type_id == -1: + raise _DecodeError('MessageSet item missing type_id.') + if message_start == -1: + raise _DecodeError('MessageSet item missing message.') + + extension = message.Extensions._FindExtensionByNumber(type_id) + # pylint: disable=protected-access + if extension is not None: + value = field_dict.get(extension) + if value is None: + message_type = extension.message_type + if not hasattr(message_type, '_concrete_class'): + message_factory.GetMessageClass(message_type) + value = field_dict.setdefault( + extension, message_type._concrete_class()) + if value._InternalParse(buffer, message_start,message_end) != message_end: + # The only reason _InternalParse would return early is if it encountered + # an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + else: + if not message._unknown_fields: + message._unknown_fields = [] + message._unknown_fields.append( + (MESSAGE_SET_ITEM_TAG, buffer[message_set_item_start:pos].tobytes())) + if message._unknown_field_set is None: + message._unknown_field_set = containers.UnknownFieldSet() + message._unknown_field_set._add( + type_id, + wire_format.WIRETYPE_LENGTH_DELIMITED, + buffer[message_start:message_end].tobytes()) + # pylint: enable=protected-access + + return pos + + return DecodeItem + + +def UnknownMessageSetItemDecoder(): + """Returns a decoder for a Unknown MessageSet item.""" + + type_id_tag_bytes = encoder.TagBytes(2, wire_format.WIRETYPE_VARINT) + message_tag_bytes = encoder.TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED) + item_end_tag_bytes = encoder.TagBytes(1, wire_format.WIRETYPE_END_GROUP) + + def DecodeUnknownItem(buffer): + pos = 0 + end = len(buffer) + message_start = -1 + message_end = -1 + while 1: + (tag_bytes, pos) = ReadTag(buffer, pos) + if tag_bytes == type_id_tag_bytes: + (type_id, pos) = _DecodeVarint(buffer, pos) + elif tag_bytes == message_tag_bytes: + (size, message_start) = _DecodeVarint(buffer, pos) + pos = message_end = message_start + size + elif tag_bytes == item_end_tag_bytes: + break + else: + pos = SkipField(buffer, pos, end, tag_bytes) + if pos == -1: + raise _DecodeError('Missing group end tag.') + + if pos > end: + raise _DecodeError('Truncated message.') + + if type_id == -1: + raise _DecodeError('MessageSet item missing type_id.') + if message_start == -1: + raise _DecodeError('MessageSet item missing message.') + + return (type_id, buffer[message_start:message_end].tobytes()) + + return DecodeUnknownItem + +# -------------------------------------------------------------------- + +def MapDecoder(field_descriptor, new_default, is_message_map): + """Returns a decoder for a map field.""" + + key = field_descriptor + tag_bytes = encoder.TagBytes(field_descriptor.number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + local_DecodeVarint = _DecodeVarint + # Can't read _concrete_class yet; might not be initialized. + message_type = field_descriptor.message_type + + def DecodeMap(buffer, pos, end, message, field_dict): + submsg = message_type._concrete_class() + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + submsg.Clear() + if submsg._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + + if is_message_map: + value[submsg.key].CopyFrom(submsg.value) + else: + value[submsg.key] = submsg.value + + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + + return DecodeMap + +# -------------------------------------------------------------------- +# Optimization is not as heavy here because calls to SkipField() are rare, +# except for handling end-group tags. + +def _SkipVarint(buffer, pos, end): + """Skip a varint value. Returns the new position.""" + # Previously ord(buffer[pos]) raised IndexError when pos is out of range. + # With this code, ord(b'') raises TypeError. Both are handled in + # python_message.py to generate a 'Truncated message' error. + while ord(buffer[pos:pos+1].tobytes()) & 0x80: + pos += 1 + pos += 1 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipFixed64(buffer, pos, end): + """Skip a fixed64 value. Returns the new position.""" + + pos += 8 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + + +def _DecodeFixed64(buffer, pos): + """Decode a fixed64.""" + new_pos = pos + 8 + return (struct.unpack(' end: + raise _DecodeError('Truncated message.') + return pos + + +def _SkipGroup(buffer, pos, end): + """Skip sub-group. Returns the new position.""" + + while 1: + (tag_bytes, pos) = ReadTag(buffer, pos) + new_pos = SkipField(buffer, pos, end, tag_bytes) + if new_pos == -1: + return pos + pos = new_pos + + +def _DecodeUnknownFieldSet(buffer, pos, end_pos=None): + """Decode UnknownFieldSet. Returns the UnknownFieldSet and new position.""" + + unknown_field_set = containers.UnknownFieldSet() + while end_pos is None or pos < end_pos: + (tag_bytes, pos) = ReadTag(buffer, pos) + (tag, _) = _DecodeVarint(tag_bytes, 0) + field_number, wire_type = wire_format.UnpackTag(tag) + if wire_type == wire_format.WIRETYPE_END_GROUP: + break + (data, pos) = _DecodeUnknownField(buffer, pos, wire_type) + # pylint: disable=protected-access + unknown_field_set._add(field_number, wire_type, data) + + return (unknown_field_set, pos) + + +def _DecodeUnknownField(buffer, pos, wire_type): + """Decode a unknown field. Returns the UnknownField and new position.""" + + if wire_type == wire_format.WIRETYPE_VARINT: + (data, pos) = _DecodeVarint(buffer, pos) + elif wire_type == wire_format.WIRETYPE_FIXED64: + (data, pos) = _DecodeFixed64(buffer, pos) + elif wire_type == wire_format.WIRETYPE_FIXED32: + (data, pos) = _DecodeFixed32(buffer, pos) + elif wire_type == wire_format.WIRETYPE_LENGTH_DELIMITED: + (size, pos) = _DecodeVarint(buffer, pos) + data = buffer[pos:pos+size].tobytes() + pos += size + elif wire_type == wire_format.WIRETYPE_START_GROUP: + (data, pos) = _DecodeUnknownFieldSet(buffer, pos) + elif wire_type == wire_format.WIRETYPE_END_GROUP: + return (0, -1) + else: + raise _DecodeError('Wrong wire type in tag.') + + return (data, pos) + + +def _EndGroup(buffer, pos, end): + """Skipping an END_GROUP tag returns -1 to tell the parent loop to break.""" + + return -1 + + +def _SkipFixed32(buffer, pos, end): + """Skip a fixed32 value. Returns the new position.""" + + pos += 4 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + + +def _DecodeFixed32(buffer, pos): + """Decode a fixed32.""" + + new_pos = pos + 4 + return (struct.unpack('B').pack + + def EncodeVarint(write, value, unused_deterministic=None): + bits = value & 0x7f + value >>= 7 + while value: + write(local_int2byte(0x80|bits)) + bits = value & 0x7f + value >>= 7 + return write(local_int2byte(bits)) + + return EncodeVarint + + +def _SignedVarintEncoder(): + """Return an encoder for a basic signed varint value (does not include + tag).""" + + local_int2byte = struct.Struct('>B').pack + + def EncodeSignedVarint(write, value, unused_deterministic=None): + if value < 0: + value += (1 << 64) + bits = value & 0x7f + value >>= 7 + while value: + write(local_int2byte(0x80|bits)) + bits = value & 0x7f + value >>= 7 + return write(local_int2byte(bits)) + + return EncodeSignedVarint + + +_EncodeVarint = _VarintEncoder() +_EncodeSignedVarint = _SignedVarintEncoder() + + +def _VarintBytes(value): + """Encode the given integer as a varint and return the bytes. This is only + called at startup time so it doesn't need to be fast.""" + + pieces = [] + _EncodeVarint(pieces.append, value, True) + return b"".join(pieces) + + +def TagBytes(field_number, wire_type): + """Encode the given tag and return the bytes. Only called at startup.""" + + return bytes(_VarintBytes(wire_format.PackTag(field_number, wire_type))) + +# -------------------------------------------------------------------- +# As with sizers (see above), we have a number of common encoder +# implementations. + + +def _SimpleEncoder(wire_type, encode_value, compute_value_size): + """Return a constructor for an encoder for fields of a particular type. + + Args: + wire_type: The field's wire type, for encoding tags. + encode_value: A function which encodes an individual value, e.g. + _EncodeVarint(). + compute_value_size: A function which computes the size of an individual + value, e.g. _VarintSize(). + """ + + def SpecificEncoder(field_number, is_repeated, is_packed): + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value, deterministic): + write(tag_bytes) + size = 0 + for element in value: + size += compute_value_size(element) + local_EncodeVarint(write, size, deterministic) + for element in value: + encode_value(write, element, deterministic) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value, deterministic): + for element in value: + write(tag_bytes) + encode_value(write, element, deterministic) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value, deterministic): + write(tag_bytes) + return encode_value(write, value, deterministic) + return EncodeField + + return SpecificEncoder + + +def _ModifiedEncoder(wire_type, encode_value, compute_value_size, modify_value): + """Like SimpleEncoder but additionally invokes modify_value on every value + before passing it to encode_value. Usually modify_value is ZigZagEncode.""" + + def SpecificEncoder(field_number, is_repeated, is_packed): + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value, deterministic): + write(tag_bytes) + size = 0 + for element in value: + size += compute_value_size(modify_value(element)) + local_EncodeVarint(write, size, deterministic) + for element in value: + encode_value(write, modify_value(element), deterministic) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value, deterministic): + for element in value: + write(tag_bytes) + encode_value(write, modify_value(element), deterministic) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value, deterministic): + write(tag_bytes) + return encode_value(write, modify_value(value), deterministic) + return EncodeField + + return SpecificEncoder + + +def _StructPackEncoder(wire_type, format): + """Return a constructor for an encoder for a fixed-width field. + + Args: + wire_type: The field's wire type, for encoding tags. + format: The format string to pass to struct.pack(). + """ + + value_size = struct.calcsize(format) + + def SpecificEncoder(field_number, is_repeated, is_packed): + local_struct_pack = struct.pack + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value, deterministic): + write(tag_bytes) + local_EncodeVarint(write, len(value) * value_size, deterministic) + for element in value: + write(local_struct_pack(format, element)) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value, unused_deterministic=None): + for element in value: + write(tag_bytes) + write(local_struct_pack(format, element)) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value, unused_deterministic=None): + write(tag_bytes) + return write(local_struct_pack(format, value)) + return EncodeField + + return SpecificEncoder + + +def _FloatingPointEncoder(wire_type, format): + """Return a constructor for an encoder for float fields. + + This is like StructPackEncoder, but catches errors that may be due to + passing non-finite floating-point values to struct.pack, and makes a + second attempt to encode those values. + + Args: + wire_type: The field's wire type, for encoding tags. + format: The format string to pass to struct.pack(). + """ + + value_size = struct.calcsize(format) + if value_size == 4: + def EncodeNonFiniteOrRaise(write, value): + # Remember that the serialized form uses little-endian byte order. + if value == _POS_INF: + write(b'\x00\x00\x80\x7F') + elif value == _NEG_INF: + write(b'\x00\x00\x80\xFF') + elif value != value: # NaN + write(b'\x00\x00\xC0\x7F') + else: + raise + elif value_size == 8: + def EncodeNonFiniteOrRaise(write, value): + if value == _POS_INF: + write(b'\x00\x00\x00\x00\x00\x00\xF0\x7F') + elif value == _NEG_INF: + write(b'\x00\x00\x00\x00\x00\x00\xF0\xFF') + elif value != value: # NaN + write(b'\x00\x00\x00\x00\x00\x00\xF8\x7F') + else: + raise + else: + raise ValueError('Can\'t encode floating-point values that are ' + '%d bytes long (only 4 or 8)' % value_size) + + def SpecificEncoder(field_number, is_repeated, is_packed): + local_struct_pack = struct.pack + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value, deterministic): + write(tag_bytes) + local_EncodeVarint(write, len(value) * value_size, deterministic) + for element in value: + # This try/except block is going to be faster than any code that + # we could write to check whether element is finite. + try: + write(local_struct_pack(format, element)) + except SystemError: + EncodeNonFiniteOrRaise(write, element) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value, unused_deterministic=None): + for element in value: + write(tag_bytes) + try: + write(local_struct_pack(format, element)) + except SystemError: + EncodeNonFiniteOrRaise(write, element) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value, unused_deterministic=None): + write(tag_bytes) + try: + write(local_struct_pack(format, value)) + except SystemError: + EncodeNonFiniteOrRaise(write, value) + return EncodeField + + return SpecificEncoder + + +# ==================================================================== +# Here we declare an encoder constructor for each field type. These work +# very similarly to sizer constructors, described earlier. + + +Int32Encoder = Int64Encoder = EnumEncoder = _SimpleEncoder( + wire_format.WIRETYPE_VARINT, _EncodeSignedVarint, _SignedVarintSize) + +UInt32Encoder = UInt64Encoder = _SimpleEncoder( + wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize) + +SInt32Encoder = SInt64Encoder = _ModifiedEncoder( + wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize, + wire_format.ZigZagEncode) + +# Note that Python conveniently guarantees that when using the '<' prefix on +# formats, they will also have the same size across all platforms (as opposed +# to without the prefix, where their sizes depend on the C compiler's basic +# type sizes). +Fixed32Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, ' str + ValueType = int + + def __init__(self, enum_type): + """Inits EnumTypeWrapper with an EnumDescriptor.""" + self._enum_type = enum_type + self.DESCRIPTOR = enum_type # pylint: disable=invalid-name + + def Name(self, number): # pylint: disable=invalid-name + """Returns a string containing the name of an enum value.""" + try: + return self._enum_type.values_by_number[number].name + except KeyError: + pass # fall out to break exception chaining + + if not isinstance(number, int): + raise TypeError( + 'Enum value for {} must be an int, but got {} {!r}.'.format( + self._enum_type.name, type(number), number)) + else: + # repr here to handle the odd case when you pass in a boolean. + raise ValueError('Enum {} has no name defined for value {!r}'.format( + self._enum_type.name, number)) + + def Value(self, name): # pylint: disable=invalid-name + """Returns the value corresponding to the given enum name.""" + try: + return self._enum_type.values_by_name[name].number + except KeyError: + pass # fall out to break exception chaining + raise ValueError('Enum {} has no value defined for name {!r}'.format( + self._enum_type.name, name)) + + def keys(self): + """Return a list of the string names in the enum. + + Returns: + A list of strs, in the order they were defined in the .proto file. + """ + + return [value_descriptor.name + for value_descriptor in self._enum_type.values] + + def values(self): + """Return a list of the integer values in the enum. + + Returns: + A list of ints, in the order they were defined in the .proto file. + """ + + return [value_descriptor.number + for value_descriptor in self._enum_type.values] + + def items(self): + """Return a list of the (name, value) pairs of the enum. + + Returns: + A list of (str, int) pairs, in the order they were defined + in the .proto file. + """ + return [(value_descriptor.name, value_descriptor.number) + for value_descriptor in self._enum_type.values] + + def __getattr__(self, name): + """Returns the value corresponding to the given enum name.""" + try: + return super( + EnumTypeWrapper, + self).__getattribute__('_enum_type').values_by_name[name].number + except KeyError: + pass # fall out to break exception chaining + raise AttributeError('Enum {} has no value defined for name {!r}'.format( + self._enum_type.name, name)) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/extension_dict.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/extension_dict.py new file mode 100644 index 0000000..89e64d3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/extension_dict.py @@ -0,0 +1,194 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Contains _ExtensionDict class to represent extensions. +""" + +from google.protobuf.internal import type_checkers +from google.protobuf.descriptor import FieldDescriptor + + +def _VerifyExtensionHandle(message, extension_handle): + """Verify that the given extension handle is valid.""" + + if not isinstance(extension_handle, FieldDescriptor): + raise KeyError('HasExtension() expects an extension handle, got: %s' % + extension_handle) + + if not extension_handle.is_extension: + raise KeyError('"%s" is not an extension.' % extension_handle.full_name) + + if not extension_handle.containing_type: + raise KeyError('"%s" is missing a containing_type.' + % extension_handle.full_name) + + if extension_handle.containing_type is not message.DESCRIPTOR: + raise KeyError('Extension "%s" extends message type "%s", but this ' + 'message is of type "%s".' % + (extension_handle.full_name, + extension_handle.containing_type.full_name, + message.DESCRIPTOR.full_name)) + + +# TODO: Unify error handling of "unknown extension" crap. +# TODO: Support iteritems()-style iteration over all +# extensions with the "has" bits turned on? +class _ExtensionDict(object): + + """Dict-like container for Extension fields on proto instances. + + Note that in all cases we expect extension handles to be + FieldDescriptors. + """ + + def __init__(self, extended_message): + """ + Args: + extended_message: Message instance for which we are the Extensions dict. + """ + self._extended_message = extended_message + + def __getitem__(self, extension_handle): + """Returns the current value of the given extension handle.""" + + _VerifyExtensionHandle(self._extended_message, extension_handle) + + result = self._extended_message._fields.get(extension_handle) + if result is not None: + return result + + if extension_handle.label == FieldDescriptor.LABEL_REPEATED: + result = extension_handle._default_constructor(self._extended_message) + elif extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE: + message_type = extension_handle.message_type + if not hasattr(message_type, '_concrete_class'): + # pylint: disable=g-import-not-at-top + from google.protobuf import message_factory + message_factory.GetMessageClass(message_type) + if not hasattr(extension_handle.message_type, '_concrete_class'): + from google.protobuf import message_factory + message_factory.GetMessageClass(extension_handle.message_type) + result = extension_handle.message_type._concrete_class() + try: + result._SetListener(self._extended_message._listener_for_children) + except ReferenceError: + pass + else: + # Singular scalar -- just return the default without inserting into the + # dict. + return extension_handle.default_value + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + result = self._extended_message._fields.setdefault( + extension_handle, result) + + return result + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + + my_fields = self._extended_message.ListFields() + other_fields = other._extended_message.ListFields() + + # Get rid of non-extension fields. + my_fields = [field for field in my_fields if field.is_extension] + other_fields = [field for field in other_fields if field.is_extension] + + return my_fields == other_fields + + def __ne__(self, other): + return not self == other + + def __len__(self): + fields = self._extended_message.ListFields() + # Get rid of non-extension fields. + extension_fields = [field for field in fields if field[0].is_extension] + return len(extension_fields) + + def __hash__(self): + raise TypeError('unhashable object') + + # Note that this is only meaningful for non-repeated, scalar extension + # fields. Note also that we may have to call _Modified() when we do + # successfully set a field this way, to set any necessary "has" bits in the + # ancestors of the extended message. + def __setitem__(self, extension_handle, value): + """If extension_handle specifies a non-repeated, scalar extension + field, sets the value of that field. + """ + + _VerifyExtensionHandle(self._extended_message, extension_handle) + + if (extension_handle.label == FieldDescriptor.LABEL_REPEATED or + extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE): + raise TypeError( + 'Cannot assign to extension "%s" because it is a repeated or ' + 'composite type.' % extension_handle.full_name) + + # It's slightly wasteful to lookup the type checker each time, + # but we expect this to be a vanishingly uncommon case anyway. + type_checker = type_checkers.GetTypeChecker(extension_handle) + # pylint: disable=protected-access + self._extended_message._fields[extension_handle] = ( + type_checker.CheckValue(value)) + self._extended_message._Modified() + + def __delitem__(self, extension_handle): + self._extended_message.ClearExtension(extension_handle) + + def _FindExtensionByName(self, name): + """Tries to find a known extension with the specified name. + + Args: + name: Extension full name. + + Returns: + Extension field descriptor. + """ + descriptor = self._extended_message.DESCRIPTOR + extensions = descriptor.file.pool._extensions_by_name[descriptor] + return extensions.get(name, None) + + def _FindExtensionByNumber(self, number): + """Tries to find a known extension with the field number. + + Args: + number: Extension field number. + + Returns: + Extension field descriptor. + """ + descriptor = self._extended_message.DESCRIPTOR + extensions = descriptor.file.pool._extensions_by_number[descriptor] + return extensions.get(number, None) + + def __iter__(self): + # Return a generator over the populated extension fields + return (f[0] for f in self._extended_message.ListFields() + if f[0].is_extension) + + def __contains__(self, extension_handle): + _VerifyExtensionHandle(self._extended_message, extension_handle) + + if extension_handle not in self._extended_message._fields: + return False + + if extension_handle.label == FieldDescriptor.LABEL_REPEATED: + return bool(self._extended_message._fields.get(extension_handle)) + + if extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE: + value = self._extended_message._fields.get(extension_handle) + # pylint: disable=protected-access + return value is not None and value._is_present_in_parent + + return True diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/field_mask.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/field_mask.py new file mode 100644 index 0000000..ae34f08 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/field_mask.py @@ -0,0 +1,310 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Contains FieldMask class.""" + +from google.protobuf.descriptor import FieldDescriptor + + +class FieldMask(object): + """Class for FieldMask message type.""" + + __slots__ = () + + def ToJsonString(self): + """Converts FieldMask to string according to proto3 JSON spec.""" + camelcase_paths = [] + for path in self.paths: + camelcase_paths.append(_SnakeCaseToCamelCase(path)) + return ','.join(camelcase_paths) + + def FromJsonString(self, value): + """Converts string to FieldMask according to proto3 JSON spec.""" + if not isinstance(value, str): + raise ValueError('FieldMask JSON value not a string: {!r}'.format(value)) + self.Clear() + if value: + for path in value.split(','): + self.paths.append(_CamelCaseToSnakeCase(path)) + + def IsValidForDescriptor(self, message_descriptor): + """Checks whether the FieldMask is valid for Message Descriptor.""" + for path in self.paths: + if not _IsValidPath(message_descriptor, path): + return False + return True + + def AllFieldsFromDescriptor(self, message_descriptor): + """Gets all direct fields of Message Descriptor to FieldMask.""" + self.Clear() + for field in message_descriptor.fields: + self.paths.append(field.name) + + def CanonicalFormFromMask(self, mask): + """Converts a FieldMask to the canonical form. + + Removes paths that are covered by another path. For example, + "foo.bar" is covered by "foo" and will be removed if "foo" + is also in the FieldMask. Then sorts all paths in alphabetical order. + + Args: + mask: The original FieldMask to be converted. + """ + tree = _FieldMaskTree(mask) + tree.ToFieldMask(self) + + def Union(self, mask1, mask2): + """Merges mask1 and mask2 into this FieldMask.""" + _CheckFieldMaskMessage(mask1) + _CheckFieldMaskMessage(mask2) + tree = _FieldMaskTree(mask1) + tree.MergeFromFieldMask(mask2) + tree.ToFieldMask(self) + + def Intersect(self, mask1, mask2): + """Intersects mask1 and mask2 into this FieldMask.""" + _CheckFieldMaskMessage(mask1) + _CheckFieldMaskMessage(mask2) + tree = _FieldMaskTree(mask1) + intersection = _FieldMaskTree() + for path in mask2.paths: + tree.IntersectPath(path, intersection) + intersection.ToFieldMask(self) + + def MergeMessage( + self, source, destination, + replace_message_field=False, replace_repeated_field=False): + """Merges fields specified in FieldMask from source to destination. + + Args: + source: Source message. + destination: The destination message to be merged into. + replace_message_field: Replace message field if True. Merge message + field if False. + replace_repeated_field: Replace repeated field if True. Append + elements of repeated field if False. + """ + tree = _FieldMaskTree(self) + tree.MergeMessage( + source, destination, replace_message_field, replace_repeated_field) + + +def _IsValidPath(message_descriptor, path): + """Checks whether the path is valid for Message Descriptor.""" + parts = path.split('.') + last = parts.pop() + for name in parts: + field = message_descriptor.fields_by_name.get(name) + if (field is None or + field.label == FieldDescriptor.LABEL_REPEATED or + field.type != FieldDescriptor.TYPE_MESSAGE): + return False + message_descriptor = field.message_type + return last in message_descriptor.fields_by_name + + +def _CheckFieldMaskMessage(message): + """Raises ValueError if message is not a FieldMask.""" + message_descriptor = message.DESCRIPTOR + if (message_descriptor.name != 'FieldMask' or + message_descriptor.file.name != 'google/protobuf/field_mask.proto'): + raise ValueError('Message {0} is not a FieldMask.'.format( + message_descriptor.full_name)) + + +def _SnakeCaseToCamelCase(path_name): + """Converts a path name from snake_case to camelCase.""" + result = [] + after_underscore = False + for c in path_name: + if c.isupper(): + raise ValueError( + 'Fail to print FieldMask to Json string: Path name ' + '{0} must not contain uppercase letters.'.format(path_name)) + if after_underscore: + if c.islower(): + result.append(c.upper()) + after_underscore = False + else: + raise ValueError( + 'Fail to print FieldMask to Json string: The ' + 'character after a "_" must be a lowercase letter ' + 'in path name {0}.'.format(path_name)) + elif c == '_': + after_underscore = True + else: + result += c + + if after_underscore: + raise ValueError('Fail to print FieldMask to Json string: Trailing "_" ' + 'in path name {0}.'.format(path_name)) + return ''.join(result) + + +def _CamelCaseToSnakeCase(path_name): + """Converts a field name from camelCase to snake_case.""" + result = [] + for c in path_name: + if c == '_': + raise ValueError('Fail to parse FieldMask: Path name ' + '{0} must not contain "_"s.'.format(path_name)) + if c.isupper(): + result += '_' + result += c.lower() + else: + result += c + return ''.join(result) + + +class _FieldMaskTree(object): + """Represents a FieldMask in a tree structure. + + For example, given a FieldMask "foo.bar,foo.baz,bar.baz", + the FieldMaskTree will be: + [_root] -+- foo -+- bar + | | + | +- baz + | + +- bar --- baz + In the tree, each leaf node represents a field path. + """ + + __slots__ = ('_root',) + + def __init__(self, field_mask=None): + """Initializes the tree by FieldMask.""" + self._root = {} + if field_mask: + self.MergeFromFieldMask(field_mask) + + def MergeFromFieldMask(self, field_mask): + """Merges a FieldMask to the tree.""" + for path in field_mask.paths: + self.AddPath(path) + + def AddPath(self, path): + """Adds a field path into the tree. + + If the field path to add is a sub-path of an existing field path + in the tree (i.e., a leaf node), it means the tree already matches + the given path so nothing will be added to the tree. If the path + matches an existing non-leaf node in the tree, that non-leaf node + will be turned into a leaf node with all its children removed because + the path matches all the node's children. Otherwise, a new path will + be added. + + Args: + path: The field path to add. + """ + node = self._root + for name in path.split('.'): + if name not in node: + node[name] = {} + elif not node[name]: + # Pre-existing empty node implies we already have this entire tree. + return + node = node[name] + # Remove any sub-trees we might have had. + node.clear() + + def ToFieldMask(self, field_mask): + """Converts the tree to a FieldMask.""" + field_mask.Clear() + _AddFieldPaths(self._root, '', field_mask) + + def IntersectPath(self, path, intersection): + """Calculates the intersection part of a field path with this tree. + + Args: + path: The field path to calculates. + intersection: The out tree to record the intersection part. + """ + node = self._root + for name in path.split('.'): + if name not in node: + return + elif not node[name]: + intersection.AddPath(path) + return + node = node[name] + intersection.AddLeafNodes(path, node) + + def AddLeafNodes(self, prefix, node): + """Adds leaf nodes begin with prefix to this tree.""" + if not node: + self.AddPath(prefix) + for name in node: + child_path = prefix + '.' + name + self.AddLeafNodes(child_path, node[name]) + + def MergeMessage( + self, source, destination, + replace_message, replace_repeated): + """Merge all fields specified by this tree from source to destination.""" + _MergeMessage( + self._root, source, destination, replace_message, replace_repeated) + + +def _StrConvert(value): + """Converts value to str if it is not.""" + # This file is imported by c extension and some methods like ClearField + # requires string for the field name. py2/py3 has different text + # type and may use unicode. + if not isinstance(value, str): + return value.encode('utf-8') + return value + + +def _MergeMessage( + node, source, destination, replace_message, replace_repeated): + """Merge all fields specified by a sub-tree from source to destination.""" + source_descriptor = source.DESCRIPTOR + for name in node: + child = node[name] + field = source_descriptor.fields_by_name[name] + if field is None: + raise ValueError('Error: Can\'t find field {0} in message {1}.'.format( + name, source_descriptor.full_name)) + if child: + # Sub-paths are only allowed for singular message fields. + if (field.label == FieldDescriptor.LABEL_REPEATED or + field.cpp_type != FieldDescriptor.CPPTYPE_MESSAGE): + raise ValueError('Error: Field {0} in message {1} is not a singular ' + 'message field and cannot have sub-fields.'.format( + name, source_descriptor.full_name)) + if source.HasField(name): + _MergeMessage( + child, getattr(source, name), getattr(destination, name), + replace_message, replace_repeated) + continue + if field.label == FieldDescriptor.LABEL_REPEATED: + if replace_repeated: + destination.ClearField(_StrConvert(name)) + repeated_source = getattr(source, name) + repeated_destination = getattr(destination, name) + repeated_destination.MergeFrom(repeated_source) + else: + if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE: + if replace_message: + destination.ClearField(_StrConvert(name)) + if source.HasField(name): + getattr(destination, name).MergeFrom(getattr(source, name)) + else: + setattr(destination, name, getattr(source, name)) + + +def _AddFieldPaths(node, prefix, field_mask): + """Adds the field paths descended from node to field_mask.""" + if not node and prefix: + field_mask.paths.append(prefix) + return + for name in sorted(node): + if prefix: + child_path = prefix + '.' + name + else: + child_path = name + _AddFieldPaths(node[name], child_path, field_mask) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/message_listener.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/message_listener.py new file mode 100644 index 0000000..ff1c127 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/message_listener.py @@ -0,0 +1,55 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Defines a listener interface for observing certain +state transitions on Message objects. + +Also defines a null implementation of this interface. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +class MessageListener(object): + + """Listens for modifications made to a message. Meant to be registered via + Message._SetListener(). + + Attributes: + dirty: If True, then calling Modified() would be a no-op. This can be + used to avoid these calls entirely in the common case. + """ + + def Modified(self): + """Called every time the message is modified in such a way that the parent + message may need to be updated. This currently means either: + (a) The message was modified for the first time, so the parent message + should henceforth mark the message as present. + (b) The message's cached byte size became dirty -- i.e. the message was + modified for the first time after a previous call to ByteSize(). + Therefore the parent should also mark its byte size as dirty. + Note that (a) implies (b), since new objects start out with a client cached + size (zero). However, we document (a) explicitly because it is important. + + Modified() will *only* be called in response to one of these two events -- + not every time the sub-message is modified. + + Note that if the listener's |dirty| attribute is true, then calling + Modified at the moment would be a no-op, so it can be skipped. Performance- + sensitive callers should check this attribute directly before calling since + it will be true most of the time. + """ + + raise NotImplementedError + + +class NullMessageListener(object): + + """No-op MessageListener implementation.""" + + def Modified(self): + pass diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/python_message.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/python_message.py new file mode 100644 index 0000000..40c7764 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/python_message.py @@ -0,0 +1,1546 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +# This code is meant to work on Python 2.4 and above only. +# +# TODO: Helpers for verbose, common checks like seeing if a +# descriptor's cpp_type is CPPTYPE_MESSAGE. + +"""Contains a metaclass and helper functions used to create +protocol message classes from Descriptor objects at runtime. + +Recall that a metaclass is the "type" of a class. +(A class is to a metaclass what an instance is to a class.) + +In this case, we use the GeneratedProtocolMessageType metaclass +to inject all the useful functionality into the classes +output by the protocol compiler at compile-time. + +The upshot of all this is that the real implementation +details for ALL pure-Python protocol buffers are *here in +this file*. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +from io import BytesIO +import struct +import sys +import warnings +import weakref + +from google.protobuf import descriptor as descriptor_mod +from google.protobuf import message as message_mod +from google.protobuf import text_format +# We use "as" to avoid name collisions with variables. +from google.protobuf.internal import api_implementation +from google.protobuf.internal import containers +from google.protobuf.internal import decoder +from google.protobuf.internal import encoder +from google.protobuf.internal import enum_type_wrapper +from google.protobuf.internal import extension_dict +from google.protobuf.internal import message_listener as message_listener_mod +from google.protobuf.internal import type_checkers +from google.protobuf.internal import well_known_types +from google.protobuf.internal import wire_format + +_FieldDescriptor = descriptor_mod.FieldDescriptor +_AnyFullTypeName = 'google.protobuf.Any' +_ExtensionDict = extension_dict._ExtensionDict + +class GeneratedProtocolMessageType(type): + + """Metaclass for protocol message classes created at runtime from Descriptors. + + We add implementations for all methods described in the Message class. We + also create properties to allow getting/setting all fields in the protocol + message. Finally, we create slots to prevent users from accidentally + "setting" nonexistent fields in the protocol message, which then wouldn't get + serialized / deserialized properly. + + The protocol compiler currently uses this metaclass to create protocol + message classes at runtime. Clients can also manually create their own + classes at runtime, as in this example: + + mydescriptor = Descriptor(.....) + factory = symbol_database.Default() + factory.pool.AddDescriptor(mydescriptor) + MyProtoClass = factory.GetPrototype(mydescriptor) + myproto_instance = MyProtoClass() + myproto.foo_field = 23 + ... + """ + + # Must be consistent with the protocol-compiler code in + # proto2/compiler/internal/generator.*. + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __new__(cls, name, bases, dictionary): + """Custom allocation for runtime-generated class types. + + We override __new__ because this is apparently the only place + where we can meaningfully set __slots__ on the class we're creating(?). + (The interplay between metaclasses and slots is not very well-documented). + + Args: + name: Name of the class (ignored, but required by the + metaclass protocol). + bases: Base classes of the class we're constructing. + (Should be message.Message). We ignore this field, but + it's required by the metaclass protocol + dictionary: The class dictionary of the class we're + constructing. dictionary[_DESCRIPTOR_KEY] must contain + a Descriptor object describing this protocol message + type. + + Returns: + Newly-allocated class. + + Raises: + RuntimeError: Generated code only work with python cpp extension. + """ + descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] + + if isinstance(descriptor, str): + raise RuntimeError('The generated code only work with python cpp ' + 'extension, but it is using pure python runtime.') + + # If a concrete class already exists for this descriptor, don't try to + # create another. Doing so will break any messages that already exist with + # the existing class. + # + # The C++ implementation appears to have its own internal `PyMessageFactory` + # to achieve similar results. + # + # This most commonly happens in `text_format.py` when using descriptors from + # a custom pool; it calls symbol_database.Global().getPrototype() on a + # descriptor which already has an existing concrete class. + new_class = getattr(descriptor, '_concrete_class', None) + if new_class: + return new_class + + if descriptor.full_name in well_known_types.WKTBASES: + bases += (well_known_types.WKTBASES[descriptor.full_name],) + _AddClassAttributesForNestedExtensions(descriptor, dictionary) + _AddSlots(descriptor, dictionary) + + superclass = super(GeneratedProtocolMessageType, cls) + new_class = superclass.__new__(cls, name, bases, dictionary) + return new_class + + def __init__(cls, name, bases, dictionary): + """Here we perform the majority of our work on the class. + We add enum getters, an __init__ method, implementations + of all Message methods, and properties for all fields + in the protocol type. + + Args: + name: Name of the class (ignored, but required by the + metaclass protocol). + bases: Base classes of the class we're constructing. + (Should be message.Message). We ignore this field, but + it's required by the metaclass protocol + dictionary: The class dictionary of the class we're + constructing. dictionary[_DESCRIPTOR_KEY] must contain + a Descriptor object describing this protocol message + type. + """ + descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] + + # If this is an _existing_ class looked up via `_concrete_class` in the + # __new__ method above, then we don't need to re-initialize anything. + existing_class = getattr(descriptor, '_concrete_class', None) + if existing_class: + assert existing_class is cls, ( + 'Duplicate `GeneratedProtocolMessageType` created for descriptor %r' + % (descriptor.full_name)) + return + + cls._message_set_decoders_by_tag = {} + cls._fields_by_tag = {} + if (descriptor.has_options and + descriptor.GetOptions().message_set_wire_format): + cls._message_set_decoders_by_tag[decoder.MESSAGE_SET_ITEM_TAG] = ( + decoder.MessageSetItemDecoder(descriptor), + None, + ) + + # Attach stuff to each FieldDescriptor for quick lookup later on. + for field in descriptor.fields: + _AttachFieldHelpers(cls, field) + + if descriptor.is_extendable and hasattr(descriptor.file, 'pool'): + extensions = descriptor.file.pool.FindAllExtensions(descriptor) + for ext in extensions: + _AttachFieldHelpers(cls, ext) + + descriptor._concrete_class = cls # pylint: disable=protected-access + _AddEnumValues(descriptor, cls) + _AddInitMethod(descriptor, cls) + _AddPropertiesForFields(descriptor, cls) + _AddPropertiesForExtensions(descriptor, cls) + _AddStaticMethods(cls) + _AddMessageMethods(descriptor, cls) + _AddPrivateHelperMethods(descriptor, cls) + + superclass = super(GeneratedProtocolMessageType, cls) + superclass.__init__(name, bases, dictionary) + + +# Stateless helpers for GeneratedProtocolMessageType below. +# Outside clients should not access these directly. +# +# I opted not to make any of these methods on the metaclass, to make it more +# clear that I'm not really using any state there and to keep clients from +# thinking that they have direct access to these construction helpers. + + +def _PropertyName(proto_field_name): + """Returns the name of the public property attribute which + clients can use to get and (in some cases) set the value + of a protocol message field. + + Args: + proto_field_name: The protocol message field name, exactly + as it appears (or would appear) in a .proto file. + """ + # TODO: Escape Python keywords (e.g., yield), and test this support. + # nnorwitz makes my day by writing: + # """ + # FYI. See the keyword module in the stdlib. This could be as simple as: + # + # if keyword.iskeyword(proto_field_name): + # return proto_field_name + "_" + # return proto_field_name + # """ + # Kenton says: The above is a BAD IDEA. People rely on being able to use + # getattr() and setattr() to reflectively manipulate field values. If we + # rename the properties, then every such user has to also make sure to apply + # the same transformation. Note that currently if you name a field "yield", + # you can still access it just fine using getattr/setattr -- it's not even + # that cumbersome to do so. + # TODO: Remove this method entirely if/when everyone agrees with my + # position. + return proto_field_name + + +def _AddSlots(message_descriptor, dictionary): + """Adds a __slots__ entry to dictionary, containing the names of all valid + attributes for this message type. + + Args: + message_descriptor: A Descriptor instance describing this message type. + dictionary: Class dictionary to which we'll add a '__slots__' entry. + """ + dictionary['__slots__'] = ['_cached_byte_size', + '_cached_byte_size_dirty', + '_fields', + '_unknown_fields', + '_unknown_field_set', + '_is_present_in_parent', + '_listener', + '_listener_for_children', + '__weakref__', + '_oneofs'] + + +def _IsMessageSetExtension(field): + return (field.is_extension and + field.containing_type.has_options and + field.containing_type.GetOptions().message_set_wire_format and + field.type == _FieldDescriptor.TYPE_MESSAGE and + field.label == _FieldDescriptor.LABEL_OPTIONAL) + + +def _IsMapField(field): + return (field.type == _FieldDescriptor.TYPE_MESSAGE and + field.message_type._is_map_entry) + + +def _IsMessageMapField(field): + value_type = field.message_type.fields_by_name['value'] + return value_type.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE + +def _AttachFieldHelpers(cls, field_descriptor): + is_repeated = field_descriptor.label == _FieldDescriptor.LABEL_REPEATED + field_descriptor._default_constructor = _DefaultValueConstructorForField( + field_descriptor + ) + + def AddFieldByTag(wiretype, is_packed): + tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype) + cls._fields_by_tag[tag_bytes] = (field_descriptor, is_packed) + + AddFieldByTag( + type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type], False + ) + + if is_repeated and wire_format.IsTypePackable(field_descriptor.type): + # To support wire compatibility of adding packed = true, add a decoder for + # packed values regardless of the field's options. + AddFieldByTag(wire_format.WIRETYPE_LENGTH_DELIMITED, True) + + +def _MaybeAddEncoder(cls, field_descriptor): + if hasattr(field_descriptor, '_encoder'): + return + is_repeated = (field_descriptor.label == _FieldDescriptor.LABEL_REPEATED) + is_map_entry = _IsMapField(field_descriptor) + is_packed = field_descriptor.is_packed + + if is_map_entry: + field_encoder = encoder.MapEncoder(field_descriptor) + sizer = encoder.MapSizer(field_descriptor, + _IsMessageMapField(field_descriptor)) + elif _IsMessageSetExtension(field_descriptor): + field_encoder = encoder.MessageSetItemEncoder(field_descriptor.number) + sizer = encoder.MessageSetItemSizer(field_descriptor.number) + else: + field_encoder = type_checkers.TYPE_TO_ENCODER[field_descriptor.type]( + field_descriptor.number, is_repeated, is_packed) + sizer = type_checkers.TYPE_TO_SIZER[field_descriptor.type]( + field_descriptor.number, is_repeated, is_packed) + + field_descriptor._sizer = sizer + field_descriptor._encoder = field_encoder + + +def _MaybeAddDecoder(cls, field_descriptor): + if hasattr(field_descriptor, '_decoders'): + return + + is_repeated = field_descriptor.label == _FieldDescriptor.LABEL_REPEATED + is_map_entry = _IsMapField(field_descriptor) + helper_decoders = {} + + def AddDecoder(is_packed): + decode_type = field_descriptor.type + if (decode_type == _FieldDescriptor.TYPE_ENUM and + not field_descriptor.enum_type.is_closed): + decode_type = _FieldDescriptor.TYPE_INT32 + + oneof_descriptor = None + if field_descriptor.containing_oneof is not None: + oneof_descriptor = field_descriptor + + if is_map_entry: + is_message_map = _IsMessageMapField(field_descriptor) + + field_decoder = decoder.MapDecoder( + field_descriptor, _GetInitializeDefaultForMap(field_descriptor), + is_message_map) + elif decode_type == _FieldDescriptor.TYPE_STRING: + field_decoder = decoder.StringDecoder( + field_descriptor.number, is_repeated, is_packed, + field_descriptor, field_descriptor._default_constructor, + not field_descriptor.has_presence) + elif field_descriptor.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + field_decoder = type_checkers.TYPE_TO_DECODER[decode_type]( + field_descriptor.number, is_repeated, is_packed, + field_descriptor, field_descriptor._default_constructor) + else: + field_decoder = type_checkers.TYPE_TO_DECODER[decode_type]( + field_descriptor.number, is_repeated, is_packed, + # pylint: disable=protected-access + field_descriptor, field_descriptor._default_constructor, + not field_descriptor.has_presence) + + helper_decoders[is_packed] = field_decoder + + AddDecoder(False) + + if is_repeated and wire_format.IsTypePackable(field_descriptor.type): + # To support wire compatibility of adding packed = true, add a decoder for + # packed values regardless of the field's options. + AddDecoder(True) + + field_descriptor._decoders = helper_decoders + + +def _AddClassAttributesForNestedExtensions(descriptor, dictionary): + extensions = descriptor.extensions_by_name + for extension_name, extension_field in extensions.items(): + assert extension_name not in dictionary + dictionary[extension_name] = extension_field + + +def _AddEnumValues(descriptor, cls): + """Sets class-level attributes for all enum fields defined in this message. + + Also exporting a class-level object that can name enum values. + + Args: + descriptor: Descriptor object for this message type. + cls: Class we're constructing for this message type. + """ + for enum_type in descriptor.enum_types: + setattr(cls, enum_type.name, enum_type_wrapper.EnumTypeWrapper(enum_type)) + for enum_value in enum_type.values: + setattr(cls, enum_value.name, enum_value.number) + + +def _GetInitializeDefaultForMap(field): + if field.label != _FieldDescriptor.LABEL_REPEATED: + raise ValueError('map_entry set on non-repeated field %s' % ( + field.name)) + fields_by_name = field.message_type.fields_by_name + key_checker = type_checkers.GetTypeChecker(fields_by_name['key']) + + value_field = fields_by_name['value'] + if _IsMessageMapField(field): + def MakeMessageMapDefault(message): + return containers.MessageMap( + message._listener_for_children, value_field.message_type, key_checker, + field.message_type) + return MakeMessageMapDefault + else: + value_checker = type_checkers.GetTypeChecker(value_field) + def MakePrimitiveMapDefault(message): + return containers.ScalarMap( + message._listener_for_children, key_checker, value_checker, + field.message_type) + return MakePrimitiveMapDefault + +def _DefaultValueConstructorForField(field): + """Returns a function which returns a default value for a field. + + Args: + field: FieldDescriptor object for this field. + + The returned function has one argument: + message: Message instance containing this field, or a weakref proxy + of same. + + That function in turn returns a default value for this field. The default + value may refer back to |message| via a weak reference. + """ + + if _IsMapField(field): + return _GetInitializeDefaultForMap(field) + + if field.label == _FieldDescriptor.LABEL_REPEATED: + if field.has_default_value and field.default_value != []: + raise ValueError('Repeated field default value not empty list: %s' % ( + field.default_value)) + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + # We can't look at _concrete_class yet since it might not have + # been set. (Depends on order in which we initialize the classes). + message_type = field.message_type + def MakeRepeatedMessageDefault(message): + return containers.RepeatedCompositeFieldContainer( + message._listener_for_children, field.message_type) + return MakeRepeatedMessageDefault + else: + type_checker = type_checkers.GetTypeChecker(field) + def MakeRepeatedScalarDefault(message): + return containers.RepeatedScalarFieldContainer( + message._listener_for_children, type_checker) + return MakeRepeatedScalarDefault + + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + message_type = field.message_type + def MakeSubMessageDefault(message): + # _concrete_class may not yet be initialized. + if not hasattr(message_type, '_concrete_class'): + from google.protobuf import message_factory + message_factory.GetMessageClass(message_type) + result = message_type._concrete_class() + result._SetListener( + _OneofListener(message, field) + if field.containing_oneof is not None + else message._listener_for_children) + return result + return MakeSubMessageDefault + + def MakeScalarDefault(message): + # TODO: This may be broken since there may not be + # default_value. Combine with has_default_value somehow. + return field.default_value + return MakeScalarDefault + + +def _ReraiseTypeErrorWithFieldName(message_name, field_name): + """Re-raise the currently-handled TypeError with the field name added.""" + exc = sys.exc_info()[1] + if len(exc.args) == 1 and type(exc) is TypeError: + # simple TypeError; add field name to exception message + exc = TypeError('%s for field %s.%s' % (str(exc), message_name, field_name)) + + # re-raise possibly-amended exception with original traceback: + raise exc.with_traceback(sys.exc_info()[2]) + + +def _AddInitMethod(message_descriptor, cls): + """Adds an __init__ method to cls.""" + + def _GetIntegerEnumValue(enum_type, value): + """Convert a string or integer enum value to an integer. + + If the value is a string, it is converted to the enum value in + enum_type with the same name. If the value is not a string, it's + returned as-is. (No conversion or bounds-checking is done.) + """ + if isinstance(value, str): + try: + return enum_type.values_by_name[value].number + except KeyError: + raise ValueError('Enum type %s: unknown label "%s"' % ( + enum_type.full_name, value)) + return value + + def init(self, **kwargs): + self._cached_byte_size = 0 + self._cached_byte_size_dirty = len(kwargs) > 0 + self._fields = {} + # Contains a mapping from oneof field descriptors to the descriptor + # of the currently set field in that oneof field. + self._oneofs = {} + + # _unknown_fields is () when empty for efficiency, and will be turned into + # a list if fields are added. + self._unknown_fields = () + # _unknown_field_set is None when empty for efficiency, and will be + # turned into UnknownFieldSet struct if fields are added. + self._unknown_field_set = None # pylint: disable=protected-access + self._is_present_in_parent = False + self._listener = message_listener_mod.NullMessageListener() + self._listener_for_children = _Listener(self) + for field_name, field_value in kwargs.items(): + field = _GetFieldByName(message_descriptor, field_name) + if field is None: + raise TypeError('%s() got an unexpected keyword argument "%s"' % + (message_descriptor.name, field_name)) + if field_value is None: + # field=None is the same as no field at all. + continue + if field.label == _FieldDescriptor.LABEL_REPEATED: + copy = field._default_constructor(self) + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite + if _IsMapField(field): + if _IsMessageMapField(field): + for key in field_value: + copy[key].MergeFrom(field_value[key]) + else: + copy.update(field_value) + else: + for val in field_value: + if isinstance(val, dict): + copy.add(**val) + else: + copy.add().MergeFrom(val) + else: # Scalar + if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: + field_value = [_GetIntegerEnumValue(field.enum_type, val) + for val in field_value] + copy.extend(field_value) + self._fields[field] = copy + elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + copy = field._default_constructor(self) + new_val = field_value + if isinstance(field_value, dict): + new_val = field.message_type._concrete_class(**field_value) + try: + copy.MergeFrom(new_val) + except TypeError: + _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) + self._fields[field] = copy + else: + if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: + field_value = _GetIntegerEnumValue(field.enum_type, field_value) + try: + setattr(self, field_name, field_value) + except TypeError: + _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) + + init.__module__ = None + init.__doc__ = None + cls.__init__ = init + + +def _GetFieldByName(message_descriptor, field_name): + """Returns a field descriptor by field name. + + Args: + message_descriptor: A Descriptor describing all fields in message. + field_name: The name of the field to retrieve. + Returns: + The field descriptor associated with the field name. + """ + try: + return message_descriptor.fields_by_name[field_name] + except KeyError: + raise ValueError('Protocol message %s has no "%s" field.' % + (message_descriptor.name, field_name)) + + +def _AddPropertiesForFields(descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + for field in descriptor.fields: + _AddPropertiesForField(field, cls) + + if descriptor.is_extendable: + # _ExtensionDict is just an adaptor with no state so we allocate a new one + # every time it is accessed. + cls.Extensions = property(lambda self: _ExtensionDict(self)) + + +def _AddPropertiesForField(field, cls): + """Adds a public property for a protocol message field. + Clients can use this property to get and (in the case + of non-repeated scalar fields) directly set the value + of a protocol message field. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + # Catch it if we add other types that we should + # handle specially here. + assert _FieldDescriptor.MAX_CPPTYPE == 10 + + constant_name = field.name.upper() + '_FIELD_NUMBER' + setattr(cls, constant_name, field.number) + + if field.label == _FieldDescriptor.LABEL_REPEATED: + _AddPropertiesForRepeatedField(field, cls) + elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + _AddPropertiesForNonRepeatedCompositeField(field, cls) + else: + _AddPropertiesForNonRepeatedScalarField(field, cls) + + +class _FieldProperty(property): + __slots__ = ('DESCRIPTOR',) + + def __init__(self, descriptor, getter, setter, doc): + property.__init__(self, getter, setter, doc=doc) + self.DESCRIPTOR = descriptor + + +def _AddPropertiesForRepeatedField(field, cls): + """Adds a public property for a "repeated" protocol message field. Clients + can use this property to get the value of the field, which will be either a + RepeatedScalarFieldContainer or RepeatedCompositeFieldContainer (see + below). + + Note that when clients add values to these containers, we perform + type-checking in the case of repeated scalar fields, and we also set any + necessary "has" bits as a side-effect. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + + def getter(self): + field_value = self._fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + field_value = self._fields.setdefault(field, field_value) + return field_value + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + # We define a setter just so we can throw an exception with a more + # helpful error message. + def setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % proto_field_name) + + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, _FieldProperty(field, getter, setter, doc=doc)) + + +def _AddPropertiesForNonRepeatedScalarField(field, cls): + """Adds a public property for a nonrepeated, scalar protocol message field. + Clients can use this property to get and directly set the value of the field. + Note that when the client sets the value of a field by using this property, + all necessary "has" bits are set as a side-effect, and we also perform + type-checking. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + type_checker = type_checkers.GetTypeChecker(field) + default_value = field.default_value + + def getter(self): + # TODO: This may be broken since there may not be + # default_value. Combine with has_default_value somehow. + return self._fields.get(field, default_value) + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + def field_setter(self, new_value): + # pylint: disable=protected-access + # Testing the value for truthiness captures all of the proto3 defaults + # (0, 0.0, enum 0, and False). + try: + new_value = type_checker.CheckValue(new_value) + except TypeError as e: + raise TypeError( + 'Cannot set %s to %.1024r: %s' % (field.full_name, new_value, e)) + if not field.has_presence and not new_value: + self._fields.pop(field, None) + else: + self._fields[field] = new_value + # Check _cached_byte_size_dirty inline to improve performance, since scalar + # setters are called frequently. + if not self._cached_byte_size_dirty: + self._Modified() + + if field.containing_oneof: + def setter(self, new_value): + field_setter(self, new_value) + self._UpdateOneofState(field) + else: + setter = field_setter + + setter.__module__ = None + setter.__doc__ = 'Setter for %s.' % proto_field_name + + # Add a property to encapsulate the getter/setter. + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, _FieldProperty(field, getter, setter, doc=doc)) + + +def _AddPropertiesForNonRepeatedCompositeField(field, cls): + """Adds a public property for a nonrepeated, composite protocol message field. + A composite field is a "group" or "message" field. + + Clients can use this property to get the value of the field, but cannot + assign to the property directly. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + # TODO: Remove duplication with similar method + # for non-repeated scalars. + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + + def getter(self): + field_value = self._fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + field_value = self._fields.setdefault(field, field_value) + return field_value + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + # We define a setter just so we can throw an exception with a more + # helpful error message. + def setter(self, new_value): + raise AttributeError('Assignment not allowed to composite field ' + '"%s" in protocol message object.' % proto_field_name) + + # Add a property to encapsulate the getter. + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, _FieldProperty(field, getter, setter, doc=doc)) + + +def _AddPropertiesForExtensions(descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + extensions = descriptor.extensions_by_name + for extension_name, extension_field in extensions.items(): + constant_name = extension_name.upper() + '_FIELD_NUMBER' + setattr(cls, constant_name, extension_field.number) + + # TODO: Migrate all users of these attributes to functions like + # pool.FindExtensionByNumber(descriptor). + if descriptor.file is not None: + # TODO: Use cls.MESSAGE_FACTORY.pool when available. + pool = descriptor.file.pool + +def _AddStaticMethods(cls): + # TODO: This probably needs to be thread-safe(?) + def RegisterExtension(field_descriptor): + field_descriptor.containing_type = cls.DESCRIPTOR + # TODO: Use cls.MESSAGE_FACTORY.pool when available. + # pylint: disable=protected-access + cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(field_descriptor) + _AttachFieldHelpers(cls, field_descriptor) + cls.RegisterExtension = staticmethod(RegisterExtension) + + def FromString(s): + message = cls() + message.MergeFromString(s) + return message + cls.FromString = staticmethod(FromString) + + +def _IsPresent(item): + """Given a (FieldDescriptor, value) tuple from _fields, return true if the + value should be included in the list returned by ListFields().""" + + if item[0].label == _FieldDescriptor.LABEL_REPEATED: + return bool(item[1]) + elif item[0].cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + return item[1]._is_present_in_parent + else: + return True + + +def _AddListFieldsMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def ListFields(self): + all_fields = [item for item in self._fields.items() if _IsPresent(item)] + all_fields.sort(key = lambda item: item[0].number) + return all_fields + + cls.ListFields = ListFields + + +def _AddHasFieldMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + hassable_fields = {} + for field in message_descriptor.fields: + if field.label == _FieldDescriptor.LABEL_REPEATED: + continue + # For proto3, only submessages and fields inside a oneof have presence. + if not field.has_presence: + continue + hassable_fields[field.name] = field + + # Has methods are supported for oneof descriptors. + for oneof in message_descriptor.oneofs: + hassable_fields[oneof.name] = oneof + + def HasField(self, field_name): + try: + field = hassable_fields[field_name] + except KeyError as exc: + raise ValueError('Protocol message %s has no non-repeated field "%s" ' + 'nor has presence is not available for this field.' % ( + message_descriptor.full_name, field_name)) from exc + + if isinstance(field, descriptor_mod.OneofDescriptor): + try: + return HasField(self, self._oneofs[field].name) + except KeyError: + return False + else: + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + value = self._fields.get(field) + return value is not None and value._is_present_in_parent + else: + return field in self._fields + + cls.HasField = HasField + + +def _AddClearFieldMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def ClearField(self, field_name): + try: + field = message_descriptor.fields_by_name[field_name] + except KeyError: + try: + field = message_descriptor.oneofs_by_name[field_name] + if field in self._oneofs: + field = self._oneofs[field] + else: + return + except KeyError: + raise ValueError('Protocol message %s has no "%s" field.' % + (message_descriptor.name, field_name)) + + if field in self._fields: + # To match the C++ implementation, we need to invalidate iterators + # for map fields when ClearField() happens. + if hasattr(self._fields[field], 'InvalidateIterators'): + self._fields[field].InvalidateIterators() + + # Note: If the field is a sub-message, its listener will still point + # at us. That's fine, because the worst than can happen is that it + # will call _Modified() and invalidate our byte size. Big deal. + del self._fields[field] + + if self._oneofs.get(field.containing_oneof, None) is field: + del self._oneofs[field.containing_oneof] + + # Always call _Modified() -- even if nothing was changed, this is + # a mutating method, and thus calling it should cause the field to become + # present in the parent message. + self._Modified() + + cls.ClearField = ClearField + + +def _AddClearExtensionMethod(cls): + """Helper for _AddMessageMethods().""" + def ClearExtension(self, field_descriptor): + extension_dict._VerifyExtensionHandle(self, field_descriptor) + + # Similar to ClearField(), above. + if field_descriptor in self._fields: + del self._fields[field_descriptor] + self._Modified() + cls.ClearExtension = ClearExtension + + +def _AddHasExtensionMethod(cls): + """Helper for _AddMessageMethods().""" + def HasExtension(self, field_descriptor): + extension_dict._VerifyExtensionHandle(self, field_descriptor) + if field_descriptor.label == _FieldDescriptor.LABEL_REPEATED: + raise KeyError('"%s" is repeated.' % field_descriptor.full_name) + + if field_descriptor.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + value = self._fields.get(field_descriptor) + return value is not None and value._is_present_in_parent + else: + return field_descriptor in self._fields + cls.HasExtension = HasExtension + +def _InternalUnpackAny(msg): + """Unpacks Any message and returns the unpacked message. + + This internal method is different from public Any Unpack method which takes + the target message as argument. _InternalUnpackAny method does not have + target message type and need to find the message type in descriptor pool. + + Args: + msg: An Any message to be unpacked. + + Returns: + The unpacked message. + """ + # TODO: Don't use the factory of generated messages. + # To make Any work with custom factories, use the message factory of the + # parent message. + # pylint: disable=g-import-not-at-top + from google.protobuf import symbol_database + factory = symbol_database.Default() + + type_url = msg.type_url + + if not type_url: + return None + + # TODO: For now we just strip the hostname. Better logic will be + # required. + type_name = type_url.split('/')[-1] + descriptor = factory.pool.FindMessageTypeByName(type_name) + + if descriptor is None: + return None + + message_class = factory.GetPrototype(descriptor) + message = message_class() + + message.ParseFromString(msg.value) + return message + + +def _AddEqualsMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __eq__(self, other): + if (not isinstance(other, message_mod.Message) or + other.DESCRIPTOR != self.DESCRIPTOR): + return NotImplemented + + if self is other: + return True + + if self.DESCRIPTOR.full_name == _AnyFullTypeName: + any_a = _InternalUnpackAny(self) + any_b = _InternalUnpackAny(other) + if any_a and any_b: + return any_a == any_b + + if not self.ListFields() == other.ListFields(): + return False + + # TODO: Fix UnknownFieldSet to consider MessageSet extensions, + # then use it for the comparison. + unknown_fields = list(self._unknown_fields) + unknown_fields.sort() + other_unknown_fields = list(other._unknown_fields) + other_unknown_fields.sort() + return unknown_fields == other_unknown_fields + + cls.__eq__ = __eq__ + + +def _AddStrMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __str__(self): + return text_format.MessageToString(self) + cls.__str__ = __str__ + + +def _AddReprMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __repr__(self): + return text_format.MessageToString(self) + cls.__repr__ = __repr__ + + +def _AddUnicodeMethod(unused_message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def __unicode__(self): + return text_format.MessageToString(self, as_utf8=True).decode('utf-8') + cls.__unicode__ = __unicode__ + + +def _BytesForNonRepeatedElement(value, field_number, field_type): + """Returns the number of bytes needed to serialize a non-repeated element. + The returned byte count includes space for tag information and any + other additional space associated with serializing value. + + Args: + value: Value we're serializing. + field_number: Field number of this value. (Since the field number + is stored as part of a varint-encoded tag, this has an impact + on the total bytes required to serialize the value). + field_type: The type of the field. One of the TYPE_* constants + within FieldDescriptor. + """ + try: + fn = type_checkers.TYPE_TO_BYTE_SIZE_FN[field_type] + return fn(field_number, value) + except KeyError: + raise message_mod.EncodeError('Unrecognized field type: %d' % field_type) + + +def _AddByteSizeMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def ByteSize(self): + if not self._cached_byte_size_dirty: + return self._cached_byte_size + + size = 0 + descriptor = self.DESCRIPTOR + if descriptor._is_map_entry: + # Fields of map entry should always be serialized. + key_field = descriptor.fields_by_name['key'] + _MaybeAddEncoder(cls, key_field) + size = key_field._sizer(self.key) + value_field = descriptor.fields_by_name['value'] + _MaybeAddEncoder(cls, value_field) + size += value_field._sizer(self.value) + else: + for field_descriptor, field_value in self.ListFields(): + _MaybeAddEncoder(cls, field_descriptor) + size += field_descriptor._sizer(field_value) + for tag_bytes, value_bytes in self._unknown_fields: + size += len(tag_bytes) + len(value_bytes) + + self._cached_byte_size = size + self._cached_byte_size_dirty = False + self._listener_for_children.dirty = False + return size + + cls.ByteSize = ByteSize + + +def _AddSerializeToStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def SerializeToString(self, **kwargs): + # Check if the message has all of its required fields set. + if not self.IsInitialized(): + raise message_mod.EncodeError( + 'Message %s is missing required fields: %s' % ( + self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) + return self.SerializePartialToString(**kwargs) + cls.SerializeToString = SerializeToString + + +def _AddSerializePartialToStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def SerializePartialToString(self, **kwargs): + out = BytesIO() + self._InternalSerialize(out.write, **kwargs) + return out.getvalue() + cls.SerializePartialToString = SerializePartialToString + + def InternalSerialize(self, write_bytes, deterministic=None): + if deterministic is None: + deterministic = ( + api_implementation.IsPythonDefaultSerializationDeterministic()) + else: + deterministic = bool(deterministic) + + descriptor = self.DESCRIPTOR + if descriptor._is_map_entry: + # Fields of map entry should always be serialized. + key_field = descriptor.fields_by_name['key'] + _MaybeAddEncoder(cls, key_field) + key_field._encoder(write_bytes, self.key, deterministic) + value_field = descriptor.fields_by_name['value'] + _MaybeAddEncoder(cls, value_field) + value_field._encoder(write_bytes, self.value, deterministic) + else: + for field_descriptor, field_value in self.ListFields(): + _MaybeAddEncoder(cls, field_descriptor) + field_descriptor._encoder(write_bytes, field_value, deterministic) + for tag_bytes, value_bytes in self._unknown_fields: + write_bytes(tag_bytes) + write_bytes(value_bytes) + cls._InternalSerialize = InternalSerialize + + +def _AddMergeFromStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def MergeFromString(self, serialized): + serialized = memoryview(serialized) + length = len(serialized) + try: + if self._InternalParse(serialized, 0, length) != length: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise message_mod.DecodeError('Unexpected end-group tag.') + except (IndexError, TypeError): + # Now ord(buf[p:p+1]) == ord('') gets TypeError. + raise message_mod.DecodeError('Truncated message.') + except struct.error as e: + raise message_mod.DecodeError(e) + return length # Return this for legacy reasons. + cls.MergeFromString = MergeFromString + + local_ReadTag = decoder.ReadTag + local_SkipField = decoder.SkipField + fields_by_tag = cls._fields_by_tag + message_set_decoders_by_tag = cls._message_set_decoders_by_tag + + def InternalParse(self, buffer, pos, end): + """Create a message from serialized bytes. + + Args: + self: Message, instance of the proto message object. + buffer: memoryview of the serialized data. + pos: int, position to start in the serialized data. + end: int, end position of the serialized data. + + Returns: + Message object. + """ + # Guard against internal misuse, since this function is called internally + # quite extensively, and its easy to accidentally pass bytes. + assert isinstance(buffer, memoryview) + self._Modified() + field_dict = self._fields + # pylint: disable=protected-access + unknown_field_set = self._unknown_field_set + while pos != end: + (tag_bytes, new_pos) = local_ReadTag(buffer, pos) + field_decoder, field_des = message_set_decoders_by_tag.get( + tag_bytes, (None, None) + ) + if field_decoder: + pos = field_decoder(buffer, new_pos, end, self, field_dict) + continue + field_des, is_packed = fields_by_tag.get(tag_bytes, (None, None)) + if field_des is None: + if not self._unknown_fields: # pylint: disable=protected-access + self._unknown_fields = [] # pylint: disable=protected-access + if unknown_field_set is None: + # pylint: disable=protected-access + self._unknown_field_set = containers.UnknownFieldSet() + # pylint: disable=protected-access + unknown_field_set = self._unknown_field_set + # pylint: disable=protected-access + (tag, _) = decoder._DecodeVarint(tag_bytes, 0) + field_number, wire_type = wire_format.UnpackTag(tag) + if field_number == 0: + raise message_mod.DecodeError('Field number 0 is illegal.') + # TODO: remove old_pos. + old_pos = new_pos + (data, new_pos) = decoder._DecodeUnknownField( + buffer, new_pos, wire_type) # pylint: disable=protected-access + if new_pos == -1: + return pos + # pylint: disable=protected-access + unknown_field_set._add(field_number, wire_type, data) + # TODO: remove _unknown_fields. + new_pos = local_SkipField(buffer, old_pos, end, tag_bytes) + if new_pos == -1: + return pos + self._unknown_fields.append( + (tag_bytes, buffer[old_pos:new_pos].tobytes())) + pos = new_pos + else: + _MaybeAddDecoder(cls, field_des) + field_decoder = field_des._decoders[is_packed] + pos = field_decoder(buffer, new_pos, end, self, field_dict) + if field_des.containing_oneof: + self._UpdateOneofState(field_des) + return pos + cls._InternalParse = InternalParse + + +def _AddIsInitializedMethod(message_descriptor, cls): + """Adds the IsInitialized and FindInitializationError methods to the + protocol message class.""" + + required_fields = [field for field in message_descriptor.fields + if field.label == _FieldDescriptor.LABEL_REQUIRED] + + def IsInitialized(self, errors=None): + """Checks if all required fields of a message are set. + + Args: + errors: A list which, if provided, will be populated with the field + paths of all missing required fields. + + Returns: + True iff the specified message has all required fields set. + """ + + # Performance is critical so we avoid HasField() and ListFields(). + + for field in required_fields: + if (field not in self._fields or + (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and + not self._fields[field]._is_present_in_parent)): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + + for field, value in list(self._fields.items()): # dict can change size! + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if field.label == _FieldDescriptor.LABEL_REPEATED: + if (field.message_type._is_map_entry): + continue + for element in value: + if not element.IsInitialized(): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + elif value._is_present_in_parent and not value.IsInitialized(): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + + return True + + cls.IsInitialized = IsInitialized + + def FindInitializationErrors(self): + """Finds required fields which are not initialized. + + Returns: + A list of strings. Each string is a path to an uninitialized field from + the top-level message, e.g. "foo.bar[5].baz". + """ + + errors = [] # simplify things + + for field in required_fields: + if not self.HasField(field.name): + errors.append(field.name) + + for field, value in self.ListFields(): + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if field.is_extension: + name = '(%s)' % field.full_name + else: + name = field.name + + if _IsMapField(field): + if _IsMessageMapField(field): + for key in value: + element = value[key] + prefix = '%s[%s].' % (name, key) + sub_errors = element.FindInitializationErrors() + errors += [prefix + error for error in sub_errors] + else: + # ScalarMaps can't have any initialization errors. + pass + elif field.label == _FieldDescriptor.LABEL_REPEATED: + for i in range(len(value)): + element = value[i] + prefix = '%s[%d].' % (name, i) + sub_errors = element.FindInitializationErrors() + errors += [prefix + error for error in sub_errors] + else: + prefix = name + '.' + sub_errors = value.FindInitializationErrors() + errors += [prefix + error for error in sub_errors] + + return errors + + cls.FindInitializationErrors = FindInitializationErrors + + +def _FullyQualifiedClassName(klass): + module = klass.__module__ + name = getattr(klass, '__qualname__', klass.__name__) + if module in (None, 'builtins', '__builtin__'): + return name + return module + '.' + name + + +def _AddMergeFromMethod(cls): + LABEL_REPEATED = _FieldDescriptor.LABEL_REPEATED + CPPTYPE_MESSAGE = _FieldDescriptor.CPPTYPE_MESSAGE + + def MergeFrom(self, msg): + if not isinstance(msg, cls): + raise TypeError( + 'Parameter to MergeFrom() must be instance of same class: ' + 'expected %s got %s.' % (_FullyQualifiedClassName(cls), + _FullyQualifiedClassName(msg.__class__))) + + assert msg is not self + self._Modified() + + fields = self._fields + + for field, value in msg._fields.items(): + if field.label == LABEL_REPEATED: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) + elif field.cpp_type == CPPTYPE_MESSAGE: + if value._is_present_in_parent: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) + else: + self._fields[field] = value + if field.containing_oneof: + self._UpdateOneofState(field) + + if msg._unknown_fields: + if not self._unknown_fields: + self._unknown_fields = [] + self._unknown_fields.extend(msg._unknown_fields) + # pylint: disable=protected-access + if self._unknown_field_set is None: + self._unknown_field_set = containers.UnknownFieldSet() + self._unknown_field_set._extend(msg._unknown_field_set) + + cls.MergeFrom = MergeFrom + + +def _AddWhichOneofMethod(message_descriptor, cls): + def WhichOneof(self, oneof_name): + """Returns the name of the currently set field inside a oneof, or None.""" + try: + field = message_descriptor.oneofs_by_name[oneof_name] + except KeyError: + raise ValueError( + 'Protocol message has no oneof "%s" field.' % oneof_name) + + nested_field = self._oneofs.get(field, None) + if nested_field is not None and self.HasField(nested_field.name): + return nested_field.name + else: + return None + + cls.WhichOneof = WhichOneof + + +def _Clear(self): + # Clear fields. + self._fields = {} + self._unknown_fields = () + # pylint: disable=protected-access + if self._unknown_field_set is not None: + self._unknown_field_set._clear() + self._unknown_field_set = None + + self._oneofs = {} + self._Modified() + + +def _UnknownFields(self): + warnings.warn( + 'message.UnknownFields() is deprecated. Please use the add one ' + 'feature unknown_fields.UnknownFieldSet(message) in ' + 'unknown_fields.py instead.' + ) + if self._unknown_field_set is None: # pylint: disable=protected-access + # pylint: disable=protected-access + self._unknown_field_set = containers.UnknownFieldSet() + return self._unknown_field_set # pylint: disable=protected-access + + +def _DiscardUnknownFields(self): + self._unknown_fields = [] + self._unknown_field_set = None # pylint: disable=protected-access + for field, value in self.ListFields(): + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if _IsMapField(field): + if _IsMessageMapField(field): + for key in value: + value[key].DiscardUnknownFields() + elif field.label == _FieldDescriptor.LABEL_REPEATED: + for sub_message in value: + sub_message.DiscardUnknownFields() + else: + value.DiscardUnknownFields() + + +def _SetListener(self, listener): + if listener is None: + self._listener = message_listener_mod.NullMessageListener() + else: + self._listener = listener + + +def _AddMessageMethods(message_descriptor, cls): + """Adds implementations of all Message methods to cls.""" + _AddListFieldsMethod(message_descriptor, cls) + _AddHasFieldMethod(message_descriptor, cls) + _AddClearFieldMethod(message_descriptor, cls) + if message_descriptor.is_extendable: + _AddClearExtensionMethod(cls) + _AddHasExtensionMethod(cls) + _AddEqualsMethod(message_descriptor, cls) + _AddStrMethod(message_descriptor, cls) + _AddReprMethod(message_descriptor, cls) + _AddUnicodeMethod(message_descriptor, cls) + _AddByteSizeMethod(message_descriptor, cls) + _AddSerializeToStringMethod(message_descriptor, cls) + _AddSerializePartialToStringMethod(message_descriptor, cls) + _AddMergeFromStringMethod(message_descriptor, cls) + _AddIsInitializedMethod(message_descriptor, cls) + _AddMergeFromMethod(cls) + _AddWhichOneofMethod(message_descriptor, cls) + # Adds methods which do not depend on cls. + cls.Clear = _Clear + cls.UnknownFields = _UnknownFields + cls.DiscardUnknownFields = _DiscardUnknownFields + cls._SetListener = _SetListener + + +def _AddPrivateHelperMethods(message_descriptor, cls): + """Adds implementation of private helper methods to cls.""" + + def Modified(self): + """Sets the _cached_byte_size_dirty bit to true, + and propagates this to our listener iff this was a state change. + """ + + # Note: Some callers check _cached_byte_size_dirty before calling + # _Modified() as an extra optimization. So, if this method is ever + # changed such that it does stuff even when _cached_byte_size_dirty is + # already true, the callers need to be updated. + if not self._cached_byte_size_dirty: + self._cached_byte_size_dirty = True + self._listener_for_children.dirty = True + self._is_present_in_parent = True + self._listener.Modified() + + def _UpdateOneofState(self, field): + """Sets field as the active field in its containing oneof. + + Will also delete currently active field in the oneof, if it is different + from the argument. Does not mark the message as modified. + """ + other_field = self._oneofs.setdefault(field.containing_oneof, field) + if other_field is not field: + del self._fields[other_field] + self._oneofs[field.containing_oneof] = field + + cls._Modified = Modified + cls.SetInParent = Modified + cls._UpdateOneofState = _UpdateOneofState + + +class _Listener(object): + + """MessageListener implementation that a parent message registers with its + child message. + + In order to support semantics like: + + foo.bar.baz.moo = 23 + assert foo.HasField('bar') + + ...child objects must have back references to their parents. + This helper class is at the heart of this support. + """ + + def __init__(self, parent_message): + """Args: + parent_message: The message whose _Modified() method we should call when + we receive Modified() messages. + """ + # This listener establishes a back reference from a child (contained) object + # to its parent (containing) object. We make this a weak reference to avoid + # creating cyclic garbage when the client finishes with the 'parent' object + # in the tree. + if isinstance(parent_message, weakref.ProxyType): + self._parent_message_weakref = parent_message + else: + self._parent_message_weakref = weakref.proxy(parent_message) + + # As an optimization, we also indicate directly on the listener whether + # or not the parent message is dirty. This way we can avoid traversing + # up the tree in the common case. + self.dirty = False + + def Modified(self): + if self.dirty: + return + try: + # Propagate the signal to our parents iff this is the first field set. + self._parent_message_weakref._Modified() + except ReferenceError: + # We can get here if a client has kept a reference to a child object, + # and is now setting a field on it, but the child's parent has been + # garbage-collected. This is not an error. + pass + + +class _OneofListener(_Listener): + """Special listener implementation for setting composite oneof fields.""" + + def __init__(self, parent_message, field): + """Args: + parent_message: The message whose _Modified() method we should call when + we receive Modified() messages. + field: The descriptor of the field being set in the parent message. + """ + super(_OneofListener, self).__init__(parent_message) + self._field = field + + def Modified(self): + """Also updates the state of the containing oneof in the parent message.""" + try: + self._parent_message_weakref._UpdateOneofState(self._field) + super(_OneofListener, self).Modified() + except ReferenceError: + pass diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/testing_refleaks.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/testing_refleaks.py new file mode 100644 index 0000000..ca0f0b9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/testing_refleaks.py @@ -0,0 +1,119 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""A subclass of unittest.TestCase which checks for reference leaks. + +To use: +- Use testing_refleak.BaseTestCase instead of unittest.TestCase +- Configure and compile Python with --with-pydebug + +If sys.gettotalrefcount() is not available (because Python was built without +the Py_DEBUG option), then this module is a no-op and tests will run normally. +""" + +import copyreg +import gc +import sys +import unittest + + +class LocalTestResult(unittest.TestResult): + """A TestResult which forwards events to a parent object, except for Skips.""" + + def __init__(self, parent_result): + unittest.TestResult.__init__(self) + self.parent_result = parent_result + + def addError(self, test, error): + self.parent_result.addError(test, error) + + def addFailure(self, test, error): + self.parent_result.addFailure(test, error) + + def addSkip(self, test, reason): + pass + + +class ReferenceLeakCheckerMixin(object): + """A mixin class for TestCase, which checks reference counts.""" + + NB_RUNS = 3 + + def run(self, result=None): + testMethod = getattr(self, self._testMethodName) + expecting_failure_method = getattr(testMethod, "__unittest_expecting_failure__", False) + expecting_failure_class = getattr(self, "__unittest_expecting_failure__", False) + if expecting_failure_class or expecting_failure_method: + return + + # python_message.py registers all Message classes to some pickle global + # registry, which makes the classes immortal. + # We save a copy of this registry, and reset it before we could references. + self._saved_pickle_registry = copyreg.dispatch_table.copy() + + # Run the test twice, to warm up the instance attributes. + super(ReferenceLeakCheckerMixin, self).run(result=result) + super(ReferenceLeakCheckerMixin, self).run(result=result) + + oldrefcount = 0 + local_result = LocalTestResult(result) + num_flakes = 0 + + refcount_deltas = [] + while len(refcount_deltas) < self.NB_RUNS: + oldrefcount = self._getRefcounts() + super(ReferenceLeakCheckerMixin, self).run(result=local_result) + newrefcount = self._getRefcounts() + # If the GC was able to collect some objects after the call to run() that + # it could not collect before the call, then the counts won't match. + if newrefcount < oldrefcount and num_flakes < 2: + # This result is (probably) a flake -- garbage collectors aren't very + # predictable, but a lower ending refcount is the opposite of the + # failure we are testing for. If the result is repeatable, then we will + # eventually report it, but not after trying to eliminate it. + num_flakes += 1 + continue + num_flakes = 0 + refcount_deltas.append(newrefcount - oldrefcount) + print(refcount_deltas, self) + + try: + self.assertEqual(refcount_deltas, [0] * self.NB_RUNS) + except Exception: # pylint: disable=broad-except + result.addError(self, sys.exc_info()) + + def _getRefcounts(self): + copyreg.dispatch_table.clear() + copyreg.dispatch_table.update(self._saved_pickle_registry) + # It is sometimes necessary to gc.collect() multiple times, to ensure + # that all objects can be collected. + gc.collect() + gc.collect() + gc.collect() + return sys.gettotalrefcount() + + +if hasattr(sys, 'gettotalrefcount'): + + def TestCase(test_class): + new_bases = (ReferenceLeakCheckerMixin,) + test_class.__bases__ + new_class = type(test_class)( + test_class.__name__, new_bases, dict(test_class.__dict__)) + return new_class + SkipReferenceLeakChecker = unittest.skip + +else: + # When PyDEBUG is not enabled, run the tests normally. + + def TestCase(test_class): + return test_class + + def SkipReferenceLeakChecker(reason): + del reason # Don't skip, so don't need a reason. + def Same(func): + return func + return Same diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/type_checkers.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/type_checkers.py new file mode 100644 index 0000000..e152a43 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/type_checkers.py @@ -0,0 +1,408 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Provides type checking routines. + +This module defines type checking utilities in the forms of dictionaries: + +VALUE_CHECKERS: A dictionary of field types and a value validation object. +TYPE_TO_BYTE_SIZE_FN: A dictionary with field types and a size computing + function. +TYPE_TO_SERIALIZE_METHOD: A dictionary with field types and serialization + function. +FIELD_TYPE_TO_WIRE_TYPE: A dictionary with field typed and their + corresponding wire types. +TYPE_TO_DESERIALIZE_METHOD: A dictionary with field types and deserialization + function. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import ctypes +import numbers + +from google.protobuf.internal import decoder +from google.protobuf.internal import encoder +from google.protobuf.internal import wire_format +from google.protobuf import descriptor + +_FieldDescriptor = descriptor.FieldDescriptor + + +def TruncateToFourByteFloat(original): + return ctypes.c_float(original).value + + +def ToShortestFloat(original): + """Returns the shortest float that has same value in wire.""" + # All 4 byte floats have between 6 and 9 significant digits, so we + # start with 6 as the lower bound. + # It has to be iterative because use '.9g' directly can not get rid + # of the noises for most values. For example if set a float_field=0.9 + # use '.9g' will print 0.899999976. + precision = 6 + rounded = float('{0:.{1}g}'.format(original, precision)) + while TruncateToFourByteFloat(rounded) != original: + precision += 1 + rounded = float('{0:.{1}g}'.format(original, precision)) + return rounded + + +def GetTypeChecker(field): + """Returns a type checker for a message field of the specified types. + + Args: + field: FieldDescriptor object for this field. + + Returns: + An instance of TypeChecker which can be used to verify the types + of values assigned to a field of the specified type. + """ + if (field.cpp_type == _FieldDescriptor.CPPTYPE_STRING and + field.type == _FieldDescriptor.TYPE_STRING): + return UnicodeValueChecker() + if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: + if field.enum_type.is_closed: + return EnumValueChecker(field.enum_type) + else: + # When open enums are supported, any int32 can be assigned. + return _VALUE_CHECKERS[_FieldDescriptor.CPPTYPE_INT32] + return _VALUE_CHECKERS[field.cpp_type] + + +# None of the typecheckers below make any attempt to guard against people +# subclassing builtin types and doing weird things. We're not trying to +# protect against malicious clients here, just people accidentally shooting +# themselves in the foot in obvious ways. +class TypeChecker(object): + + """Type checker used to catch type errors as early as possible + when the client is setting scalar fields in protocol messages. + """ + + def __init__(self, *acceptable_types): + self._acceptable_types = acceptable_types + + def CheckValue(self, proposed_value): + """Type check the provided value and return it. + + The returned value might have been normalized to another type. + """ + if not isinstance(proposed_value, self._acceptable_types): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), self._acceptable_types)) + raise TypeError(message) + return proposed_value + + +class TypeCheckerWithDefault(TypeChecker): + + def __init__(self, default_value, *acceptable_types): + TypeChecker.__init__(self, *acceptable_types) + self._default_value = default_value + + def DefaultValue(self): + return self._default_value + + +class BoolValueChecker(object): + """Type checker used for bool fields.""" + + def CheckValue(self, proposed_value): + if not hasattr(proposed_value, '__index__') or ( + type(proposed_value).__module__ == 'numpy' and + type(proposed_value).__name__ == 'ndarray'): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (bool, int))) + raise TypeError(message) + return bool(proposed_value) + + def DefaultValue(self): + return False + + +# IntValueChecker and its subclasses perform integer type-checks +# and bounds-checks. +class IntValueChecker(object): + + """Checker used for integer fields. Performs type-check and range check.""" + + def CheckValue(self, proposed_value): + if not hasattr(proposed_value, '__index__') or ( + type(proposed_value).__module__ == 'numpy' and + type(proposed_value).__name__ == 'ndarray'): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (int,))) + raise TypeError(message) + + if not self._MIN <= int(proposed_value) <= self._MAX: + raise ValueError('Value out of range: %d' % proposed_value) + # We force all values to int to make alternate implementations where the + # distinction is more significant (e.g. the C++ implementation) simpler. + proposed_value = int(proposed_value) + return proposed_value + + def DefaultValue(self): + return 0 + + +class EnumValueChecker(object): + + """Checker used for enum fields. Performs type-check and range check.""" + + def __init__(self, enum_type): + self._enum_type = enum_type + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, numbers.Integral): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (int,))) + raise TypeError(message) + if int(proposed_value) not in self._enum_type.values_by_number: + raise ValueError('Unknown enum value: %d' % proposed_value) + return proposed_value + + def DefaultValue(self): + return self._enum_type.values[0].number + + +class UnicodeValueChecker(object): + + """Checker used for string fields. + + Always returns a unicode value, even if the input is of type str. + """ + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (bytes, str)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (bytes, str))) + raise TypeError(message) + + # If the value is of type 'bytes' make sure that it is valid UTF-8 data. + if isinstance(proposed_value, bytes): + try: + proposed_value = proposed_value.decode('utf-8') + except UnicodeDecodeError: + raise ValueError('%.1024r has type bytes, but isn\'t valid UTF-8 ' + 'encoding. Non-UTF-8 strings must be converted to ' + 'unicode objects before being added.' % + (proposed_value)) + else: + try: + proposed_value.encode('utf8') + except UnicodeEncodeError: + raise ValueError('%.1024r isn\'t a valid unicode string and ' + 'can\'t be encoded in UTF-8.'% + (proposed_value)) + + return proposed_value + + def DefaultValue(self): + return u"" + + +class Int32ValueChecker(IntValueChecker): + # We're sure to use ints instead of longs here since comparison may be more + # efficient. + _MIN = -2147483648 + _MAX = 2147483647 + + +class Uint32ValueChecker(IntValueChecker): + _MIN = 0 + _MAX = (1 << 32) - 1 + + +class Int64ValueChecker(IntValueChecker): + _MIN = -(1 << 63) + _MAX = (1 << 63) - 1 + + +class Uint64ValueChecker(IntValueChecker): + _MIN = 0 + _MAX = (1 << 64) - 1 + + +# The max 4 bytes float is about 3.4028234663852886e+38 +_FLOAT_MAX = float.fromhex('0x1.fffffep+127') +_FLOAT_MIN = -_FLOAT_MAX +_INF = float('inf') +_NEG_INF = float('-inf') + + +class DoubleValueChecker(object): + """Checker used for double fields. + + Performs type-check and range check. + """ + + def CheckValue(self, proposed_value): + """Check and convert proposed_value to float.""" + if (not hasattr(proposed_value, '__float__') and + not hasattr(proposed_value, '__index__')) or ( + type(proposed_value).__module__ == 'numpy' and + type(proposed_value).__name__ == 'ndarray'): + message = ('%.1024r has type %s, but expected one of: int, float' % + (proposed_value, type(proposed_value))) + raise TypeError(message) + return float(proposed_value) + + def DefaultValue(self): + return 0.0 + + +class FloatValueChecker(DoubleValueChecker): + """Checker used for float fields. + + Performs type-check and range check. + + Values exceeding a 32-bit float will be converted to inf/-inf. + """ + + def CheckValue(self, proposed_value): + """Check and convert proposed_value to float.""" + converted_value = super().CheckValue(proposed_value) + # This inf rounding matches the C++ proto SafeDoubleToFloat logic. + if converted_value > _FLOAT_MAX: + return _INF + if converted_value < _FLOAT_MIN: + return _NEG_INF + + return TruncateToFourByteFloat(converted_value) + +# Type-checkers for all scalar CPPTYPEs. +_VALUE_CHECKERS = { + _FieldDescriptor.CPPTYPE_INT32: Int32ValueChecker(), + _FieldDescriptor.CPPTYPE_INT64: Int64ValueChecker(), + _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(), + _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(), + _FieldDescriptor.CPPTYPE_DOUBLE: DoubleValueChecker(), + _FieldDescriptor.CPPTYPE_FLOAT: FloatValueChecker(), + _FieldDescriptor.CPPTYPE_BOOL: BoolValueChecker(), + _FieldDescriptor.CPPTYPE_STRING: TypeCheckerWithDefault(b'', bytes), +} + + +# Map from field type to a function F, such that F(field_num, value) +# gives the total byte size for a value of the given type. This +# byte size includes tag information and any other additional space +# associated with serializing "value". +TYPE_TO_BYTE_SIZE_FN = { + _FieldDescriptor.TYPE_DOUBLE: wire_format.DoubleByteSize, + _FieldDescriptor.TYPE_FLOAT: wire_format.FloatByteSize, + _FieldDescriptor.TYPE_INT64: wire_format.Int64ByteSize, + _FieldDescriptor.TYPE_UINT64: wire_format.UInt64ByteSize, + _FieldDescriptor.TYPE_INT32: wire_format.Int32ByteSize, + _FieldDescriptor.TYPE_FIXED64: wire_format.Fixed64ByteSize, + _FieldDescriptor.TYPE_FIXED32: wire_format.Fixed32ByteSize, + _FieldDescriptor.TYPE_BOOL: wire_format.BoolByteSize, + _FieldDescriptor.TYPE_STRING: wire_format.StringByteSize, + _FieldDescriptor.TYPE_GROUP: wire_format.GroupByteSize, + _FieldDescriptor.TYPE_MESSAGE: wire_format.MessageByteSize, + _FieldDescriptor.TYPE_BYTES: wire_format.BytesByteSize, + _FieldDescriptor.TYPE_UINT32: wire_format.UInt32ByteSize, + _FieldDescriptor.TYPE_ENUM: wire_format.EnumByteSize, + _FieldDescriptor.TYPE_SFIXED32: wire_format.SFixed32ByteSize, + _FieldDescriptor.TYPE_SFIXED64: wire_format.SFixed64ByteSize, + _FieldDescriptor.TYPE_SINT32: wire_format.SInt32ByteSize, + _FieldDescriptor.TYPE_SINT64: wire_format.SInt64ByteSize + } + + +# Maps from field types to encoder constructors. +TYPE_TO_ENCODER = { + _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleEncoder, + _FieldDescriptor.TYPE_FLOAT: encoder.FloatEncoder, + _FieldDescriptor.TYPE_INT64: encoder.Int64Encoder, + _FieldDescriptor.TYPE_UINT64: encoder.UInt64Encoder, + _FieldDescriptor.TYPE_INT32: encoder.Int32Encoder, + _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Encoder, + _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Encoder, + _FieldDescriptor.TYPE_BOOL: encoder.BoolEncoder, + _FieldDescriptor.TYPE_STRING: encoder.StringEncoder, + _FieldDescriptor.TYPE_GROUP: encoder.GroupEncoder, + _FieldDescriptor.TYPE_MESSAGE: encoder.MessageEncoder, + _FieldDescriptor.TYPE_BYTES: encoder.BytesEncoder, + _FieldDescriptor.TYPE_UINT32: encoder.UInt32Encoder, + _FieldDescriptor.TYPE_ENUM: encoder.EnumEncoder, + _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Encoder, + _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Encoder, + _FieldDescriptor.TYPE_SINT32: encoder.SInt32Encoder, + _FieldDescriptor.TYPE_SINT64: encoder.SInt64Encoder, + } + + +# Maps from field types to sizer constructors. +TYPE_TO_SIZER = { + _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleSizer, + _FieldDescriptor.TYPE_FLOAT: encoder.FloatSizer, + _FieldDescriptor.TYPE_INT64: encoder.Int64Sizer, + _FieldDescriptor.TYPE_UINT64: encoder.UInt64Sizer, + _FieldDescriptor.TYPE_INT32: encoder.Int32Sizer, + _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Sizer, + _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Sizer, + _FieldDescriptor.TYPE_BOOL: encoder.BoolSizer, + _FieldDescriptor.TYPE_STRING: encoder.StringSizer, + _FieldDescriptor.TYPE_GROUP: encoder.GroupSizer, + _FieldDescriptor.TYPE_MESSAGE: encoder.MessageSizer, + _FieldDescriptor.TYPE_BYTES: encoder.BytesSizer, + _FieldDescriptor.TYPE_UINT32: encoder.UInt32Sizer, + _FieldDescriptor.TYPE_ENUM: encoder.EnumSizer, + _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Sizer, + _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Sizer, + _FieldDescriptor.TYPE_SINT32: encoder.SInt32Sizer, + _FieldDescriptor.TYPE_SINT64: encoder.SInt64Sizer, + } + + +# Maps from field type to a decoder constructor. +TYPE_TO_DECODER = { + _FieldDescriptor.TYPE_DOUBLE: decoder.DoubleDecoder, + _FieldDescriptor.TYPE_FLOAT: decoder.FloatDecoder, + _FieldDescriptor.TYPE_INT64: decoder.Int64Decoder, + _FieldDescriptor.TYPE_UINT64: decoder.UInt64Decoder, + _FieldDescriptor.TYPE_INT32: decoder.Int32Decoder, + _FieldDescriptor.TYPE_FIXED64: decoder.Fixed64Decoder, + _FieldDescriptor.TYPE_FIXED32: decoder.Fixed32Decoder, + _FieldDescriptor.TYPE_BOOL: decoder.BoolDecoder, + _FieldDescriptor.TYPE_STRING: decoder.StringDecoder, + _FieldDescriptor.TYPE_GROUP: decoder.GroupDecoder, + _FieldDescriptor.TYPE_MESSAGE: decoder.MessageDecoder, + _FieldDescriptor.TYPE_BYTES: decoder.BytesDecoder, + _FieldDescriptor.TYPE_UINT32: decoder.UInt32Decoder, + _FieldDescriptor.TYPE_ENUM: decoder.EnumDecoder, + _FieldDescriptor.TYPE_SFIXED32: decoder.SFixed32Decoder, + _FieldDescriptor.TYPE_SFIXED64: decoder.SFixed64Decoder, + _FieldDescriptor.TYPE_SINT32: decoder.SInt32Decoder, + _FieldDescriptor.TYPE_SINT64: decoder.SInt64Decoder, + } + +# Maps from field type to expected wiretype. +FIELD_TYPE_TO_WIRE_TYPE = { + _FieldDescriptor.TYPE_DOUBLE: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_FLOAT: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_INT64: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_UINT64: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_INT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_FIXED64: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_FIXED32: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_BOOL: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_STRING: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_GROUP: wire_format.WIRETYPE_START_GROUP, + _FieldDescriptor.TYPE_MESSAGE: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_BYTES: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_UINT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_ENUM: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_SFIXED32: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_SFIXED64: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_SINT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_SINT64: wire_format.WIRETYPE_VARINT, + } diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/well_known_types.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/well_known_types.py new file mode 100644 index 0000000..5727bc9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/well_known_types.py @@ -0,0 +1,567 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Contains well known classes. + +This files defines well known classes which need extra maintenance including: + - Any + - Duration + - FieldMask + - Struct + - Timestamp +""" + +__author__ = 'jieluo@google.com (Jie Luo)' + +import calendar +import collections.abc +import datetime + +from google.protobuf.internal import field_mask + +FieldMask = field_mask.FieldMask + +_TIMESTAMPFOMAT = '%Y-%m-%dT%H:%M:%S' +_NANOS_PER_SECOND = 1000000000 +_NANOS_PER_MILLISECOND = 1000000 +_NANOS_PER_MICROSECOND = 1000 +_MILLIS_PER_SECOND = 1000 +_MICROS_PER_SECOND = 1000000 +_SECONDS_PER_DAY = 24 * 3600 +_DURATION_SECONDS_MAX = 315576000000 + +_EPOCH_DATETIME_NAIVE = datetime.datetime(1970, 1, 1, tzinfo=None) +_EPOCH_DATETIME_AWARE = _EPOCH_DATETIME_NAIVE.replace( + tzinfo=datetime.timezone.utc +) + + +class Any(object): + """Class for Any Message type.""" + + __slots__ = () + + def Pack(self, msg, type_url_prefix='type.googleapis.com/', + deterministic=None): + """Packs the specified message into current Any message.""" + if len(type_url_prefix) < 1 or type_url_prefix[-1] != '/': + self.type_url = '%s/%s' % (type_url_prefix, msg.DESCRIPTOR.full_name) + else: + self.type_url = '%s%s' % (type_url_prefix, msg.DESCRIPTOR.full_name) + self.value = msg.SerializeToString(deterministic=deterministic) + + def Unpack(self, msg): + """Unpacks the current Any message into specified message.""" + descriptor = msg.DESCRIPTOR + if not self.Is(descriptor): + return False + msg.ParseFromString(self.value) + return True + + def TypeName(self): + """Returns the protobuf type name of the inner message.""" + # Only last part is to be used: b/25630112 + return self.type_url.split('/')[-1] + + def Is(self, descriptor): + """Checks if this Any represents the given protobuf type.""" + return '/' in self.type_url and self.TypeName() == descriptor.full_name + + +class Timestamp(object): + """Class for Timestamp message type.""" + + __slots__ = () + + def ToJsonString(self): + """Converts Timestamp to RFC 3339 date string format. + + Returns: + A string converted from timestamp. The string is always Z-normalized + and uses 3, 6 or 9 fractional digits as required to represent the + exact time. Example of the return format: '1972-01-01T10:00:20.021Z' + """ + nanos = self.nanos % _NANOS_PER_SECOND + total_sec = self.seconds + (self.nanos - nanos) // _NANOS_PER_SECOND + seconds = total_sec % _SECONDS_PER_DAY + days = (total_sec - seconds) // _SECONDS_PER_DAY + dt = datetime.datetime(1970, 1, 1) + datetime.timedelta(days, seconds) + + result = dt.isoformat() + if (nanos % 1e9) == 0: + # If there are 0 fractional digits, the fractional + # point '.' should be omitted when serializing. + return result + 'Z' + if (nanos % 1e6) == 0: + # Serialize 3 fractional digits. + return result + '.%03dZ' % (nanos / 1e6) + if (nanos % 1e3) == 0: + # Serialize 6 fractional digits. + return result + '.%06dZ' % (nanos / 1e3) + # Serialize 9 fractional digits. + return result + '.%09dZ' % nanos + + def FromJsonString(self, value): + """Parse a RFC 3339 date string format to Timestamp. + + Args: + value: A date string. Any fractional digits (or none) and any offset are + accepted as long as they fit into nano-seconds precision. + Example of accepted format: '1972-01-01T10:00:20.021-05:00' + + Raises: + ValueError: On parsing problems. + """ + if not isinstance(value, str): + raise ValueError('Timestamp JSON value not a string: {!r}'.format(value)) + timezone_offset = value.find('Z') + if timezone_offset == -1: + timezone_offset = value.find('+') + if timezone_offset == -1: + timezone_offset = value.rfind('-') + if timezone_offset == -1: + raise ValueError( + 'Failed to parse timestamp: missing valid timezone offset.') + time_value = value[0:timezone_offset] + # Parse datetime and nanos. + point_position = time_value.find('.') + if point_position == -1: + second_value = time_value + nano_value = '' + else: + second_value = time_value[:point_position] + nano_value = time_value[point_position + 1:] + if 't' in second_value: + raise ValueError( + 'time data \'{0}\' does not match format \'%Y-%m-%dT%H:%M:%S\', ' + 'lowercase \'t\' is not accepted'.format(second_value)) + date_object = datetime.datetime.strptime(second_value, _TIMESTAMPFOMAT) + td = date_object - datetime.datetime(1970, 1, 1) + seconds = td.seconds + td.days * _SECONDS_PER_DAY + if len(nano_value) > 9: + raise ValueError( + 'Failed to parse Timestamp: nanos {0} more than ' + '9 fractional digits.'.format(nano_value)) + if nano_value: + nanos = round(float('0.' + nano_value) * 1e9) + else: + nanos = 0 + # Parse timezone offsets. + if value[timezone_offset] == 'Z': + if len(value) != timezone_offset + 1: + raise ValueError('Failed to parse timestamp: invalid trailing' + ' data {0}.'.format(value)) + else: + timezone = value[timezone_offset:] + pos = timezone.find(':') + if pos == -1: + raise ValueError( + 'Invalid timezone offset value: {0}.'.format(timezone)) + if timezone[0] == '+': + seconds -= (int(timezone[1:pos])*60+int(timezone[pos+1:]))*60 + else: + seconds += (int(timezone[1:pos])*60+int(timezone[pos+1:]))*60 + # Set seconds and nanos + self.seconds = int(seconds) + self.nanos = int(nanos) + + def GetCurrentTime(self): + """Get the current UTC into Timestamp.""" + self.FromDatetime(datetime.datetime.utcnow()) + + def ToNanoseconds(self): + """Converts Timestamp to nanoseconds since epoch.""" + return self.seconds * _NANOS_PER_SECOND + self.nanos + + def ToMicroseconds(self): + """Converts Timestamp to microseconds since epoch.""" + return (self.seconds * _MICROS_PER_SECOND + + self.nanos // _NANOS_PER_MICROSECOND) + + def ToMilliseconds(self): + """Converts Timestamp to milliseconds since epoch.""" + return (self.seconds * _MILLIS_PER_SECOND + + self.nanos // _NANOS_PER_MILLISECOND) + + def ToSeconds(self): + """Converts Timestamp to seconds since epoch.""" + return self.seconds + + def FromNanoseconds(self, nanos): + """Converts nanoseconds since epoch to Timestamp.""" + self.seconds = nanos // _NANOS_PER_SECOND + self.nanos = nanos % _NANOS_PER_SECOND + + def FromMicroseconds(self, micros): + """Converts microseconds since epoch to Timestamp.""" + self.seconds = micros // _MICROS_PER_SECOND + self.nanos = (micros % _MICROS_PER_SECOND) * _NANOS_PER_MICROSECOND + + def FromMilliseconds(self, millis): + """Converts milliseconds since epoch to Timestamp.""" + self.seconds = millis // _MILLIS_PER_SECOND + self.nanos = (millis % _MILLIS_PER_SECOND) * _NANOS_PER_MILLISECOND + + def FromSeconds(self, seconds): + """Converts seconds since epoch to Timestamp.""" + self.seconds = seconds + self.nanos = 0 + + def ToDatetime(self, tzinfo=None): + """Converts Timestamp to a datetime. + + Args: + tzinfo: A datetime.tzinfo subclass; defaults to None. + + Returns: + If tzinfo is None, returns a timezone-naive UTC datetime (with no timezone + information, i.e. not aware that it's UTC). + + Otherwise, returns a timezone-aware datetime in the input timezone. + """ + # Using datetime.fromtimestamp for this would avoid constructing an extra + # timedelta object and possibly an extra datetime. Unfortuantely, that has + # the disadvantage of not handling the full precision (on all platforms, see + # https://github.com/python/cpython/issues/109849) or full range (on some + # platforms, see https://github.com/python/cpython/issues/110042) of + # datetime. + delta = datetime.timedelta( + seconds=self.seconds, + microseconds=_RoundTowardZero(self.nanos, _NANOS_PER_MICROSECOND), + ) + if tzinfo is None: + return _EPOCH_DATETIME_NAIVE + delta + else: + # Note the tz conversion has to come after the timedelta arithmetic. + return (_EPOCH_DATETIME_AWARE + delta).astimezone(tzinfo) + + def FromDatetime(self, dt): + """Converts datetime to Timestamp. + + Args: + dt: A datetime. If it's timezone-naive, it's assumed to be in UTC. + """ + # Using this guide: http://wiki.python.org/moin/WorkingWithTime + # And this conversion guide: http://docs.python.org/library/time.html + + # Turn the date parameter into a tuple (struct_time) that can then be + # manipulated into a long value of seconds. During the conversion from + # struct_time to long, the source date in UTC, and so it follows that the + # correct transformation is calendar.timegm() + self.seconds = calendar.timegm(dt.utctimetuple()) + self.nanos = dt.microsecond * _NANOS_PER_MICROSECOND + + +class Duration(object): + """Class for Duration message type.""" + + __slots__ = () + + def ToJsonString(self): + """Converts Duration to string format. + + Returns: + A string converted from self. The string format will contains + 3, 6, or 9 fractional digits depending on the precision required to + represent the exact Duration value. For example: "1s", "1.010s", + "1.000000100s", "-3.100s" + """ + _CheckDurationValid(self.seconds, self.nanos) + if self.seconds < 0 or self.nanos < 0: + result = '-' + seconds = - self.seconds + int((0 - self.nanos) // 1e9) + nanos = (0 - self.nanos) % 1e9 + else: + result = '' + seconds = self.seconds + int(self.nanos // 1e9) + nanos = self.nanos % 1e9 + result += '%d' % seconds + if (nanos % 1e9) == 0: + # If there are 0 fractional digits, the fractional + # point '.' should be omitted when serializing. + return result + 's' + if (nanos % 1e6) == 0: + # Serialize 3 fractional digits. + return result + '.%03ds' % (nanos / 1e6) + if (nanos % 1e3) == 0: + # Serialize 6 fractional digits. + return result + '.%06ds' % (nanos / 1e3) + # Serialize 9 fractional digits. + return result + '.%09ds' % nanos + + def FromJsonString(self, value): + """Converts a string to Duration. + + Args: + value: A string to be converted. The string must end with 's'. Any + fractional digits (or none) are accepted as long as they fit into + precision. For example: "1s", "1.01s", "1.0000001s", "-3.100s + + Raises: + ValueError: On parsing problems. + """ + if not isinstance(value, str): + raise ValueError('Duration JSON value not a string: {!r}'.format(value)) + if len(value) < 1 or value[-1] != 's': + raise ValueError( + 'Duration must end with letter "s": {0}.'.format(value)) + try: + pos = value.find('.') + if pos == -1: + seconds = int(value[:-1]) + nanos = 0 + else: + seconds = int(value[:pos]) + if value[0] == '-': + nanos = int(round(float('-0{0}'.format(value[pos: -1])) *1e9)) + else: + nanos = int(round(float('0{0}'.format(value[pos: -1])) *1e9)) + _CheckDurationValid(seconds, nanos) + self.seconds = seconds + self.nanos = nanos + except ValueError as e: + raise ValueError( + 'Couldn\'t parse duration: {0} : {1}.'.format(value, e)) + + def ToNanoseconds(self): + """Converts a Duration to nanoseconds.""" + return self.seconds * _NANOS_PER_SECOND + self.nanos + + def ToMicroseconds(self): + """Converts a Duration to microseconds.""" + micros = _RoundTowardZero(self.nanos, _NANOS_PER_MICROSECOND) + return self.seconds * _MICROS_PER_SECOND + micros + + def ToMilliseconds(self): + """Converts a Duration to milliseconds.""" + millis = _RoundTowardZero(self.nanos, _NANOS_PER_MILLISECOND) + return self.seconds * _MILLIS_PER_SECOND + millis + + def ToSeconds(self): + """Converts a Duration to seconds.""" + return self.seconds + + def FromNanoseconds(self, nanos): + """Converts nanoseconds to Duration.""" + self._NormalizeDuration(nanos // _NANOS_PER_SECOND, + nanos % _NANOS_PER_SECOND) + + def FromMicroseconds(self, micros): + """Converts microseconds to Duration.""" + self._NormalizeDuration( + micros // _MICROS_PER_SECOND, + (micros % _MICROS_PER_SECOND) * _NANOS_PER_MICROSECOND) + + def FromMilliseconds(self, millis): + """Converts milliseconds to Duration.""" + self._NormalizeDuration( + millis // _MILLIS_PER_SECOND, + (millis % _MILLIS_PER_SECOND) * _NANOS_PER_MILLISECOND) + + def FromSeconds(self, seconds): + """Converts seconds to Duration.""" + self.seconds = seconds + self.nanos = 0 + + def ToTimedelta(self): + """Converts Duration to timedelta.""" + return datetime.timedelta( + seconds=self.seconds, microseconds=_RoundTowardZero( + self.nanos, _NANOS_PER_MICROSECOND)) + + def FromTimedelta(self, td): + """Converts timedelta to Duration.""" + self._NormalizeDuration(td.seconds + td.days * _SECONDS_PER_DAY, + td.microseconds * _NANOS_PER_MICROSECOND) + + def _NormalizeDuration(self, seconds, nanos): + """Set Duration by seconds and nanos.""" + # Force nanos to be negative if the duration is negative. + if seconds < 0 and nanos > 0: + seconds += 1 + nanos -= _NANOS_PER_SECOND + self.seconds = seconds + self.nanos = nanos + + +def _CheckDurationValid(seconds, nanos): + if seconds < -_DURATION_SECONDS_MAX or seconds > _DURATION_SECONDS_MAX: + raise ValueError( + 'Duration is not valid: Seconds {0} must be in range ' + '[-315576000000, 315576000000].'.format(seconds)) + if nanos <= -_NANOS_PER_SECOND or nanos >= _NANOS_PER_SECOND: + raise ValueError( + 'Duration is not valid: Nanos {0} must be in range ' + '[-999999999, 999999999].'.format(nanos)) + if (nanos < 0 and seconds > 0) or (nanos > 0 and seconds < 0): + raise ValueError( + 'Duration is not valid: Sign mismatch.') + + +def _RoundTowardZero(value, divider): + """Truncates the remainder part after division.""" + # For some languages, the sign of the remainder is implementation + # dependent if any of the operands is negative. Here we enforce + # "rounded toward zero" semantics. For example, for (-5) / 2 an + # implementation may give -3 as the result with the remainder being + # 1. This function ensures we always return -2 (closer to zero). + result = value // divider + remainder = value % divider + if result < 0 and remainder > 0: + return result + 1 + else: + return result + + +def _SetStructValue(struct_value, value): + if value is None: + struct_value.null_value = 0 + elif isinstance(value, bool): + # Note: this check must come before the number check because in Python + # True and False are also considered numbers. + struct_value.bool_value = value + elif isinstance(value, str): + struct_value.string_value = value + elif isinstance(value, (int, float)): + struct_value.number_value = value + elif isinstance(value, (dict, Struct)): + struct_value.struct_value.Clear() + struct_value.struct_value.update(value) + elif isinstance(value, (list, tuple, ListValue)): + struct_value.list_value.Clear() + struct_value.list_value.extend(value) + else: + raise ValueError('Unexpected type') + + +def _GetStructValue(struct_value): + which = struct_value.WhichOneof('kind') + if which == 'struct_value': + return struct_value.struct_value + elif which == 'null_value': + return None + elif which == 'number_value': + return struct_value.number_value + elif which == 'string_value': + return struct_value.string_value + elif which == 'bool_value': + return struct_value.bool_value + elif which == 'list_value': + return struct_value.list_value + elif which is None: + raise ValueError('Value not set') + + +class Struct(object): + """Class for Struct message type.""" + + __slots__ = () + + def __getitem__(self, key): + return _GetStructValue(self.fields[key]) + + def __contains__(self, item): + return item in self.fields + + def __setitem__(self, key, value): + _SetStructValue(self.fields[key], value) + + def __delitem__(self, key): + del self.fields[key] + + def __len__(self): + return len(self.fields) + + def __iter__(self): + return iter(self.fields) + + def keys(self): # pylint: disable=invalid-name + return self.fields.keys() + + def values(self): # pylint: disable=invalid-name + return [self[key] for key in self] + + def items(self): # pylint: disable=invalid-name + return [(key, self[key]) for key in self] + + def get_or_create_list(self, key): + """Returns a list for this key, creating if it didn't exist already.""" + if not self.fields[key].HasField('list_value'): + # Clear will mark list_value modified which will indeed create a list. + self.fields[key].list_value.Clear() + return self.fields[key].list_value + + def get_or_create_struct(self, key): + """Returns a struct for this key, creating if it didn't exist already.""" + if not self.fields[key].HasField('struct_value'): + # Clear will mark struct_value modified which will indeed create a struct. + self.fields[key].struct_value.Clear() + return self.fields[key].struct_value + + def update(self, dictionary): # pylint: disable=invalid-name + for key, value in dictionary.items(): + _SetStructValue(self.fields[key], value) + +collections.abc.MutableMapping.register(Struct) + + +class ListValue(object): + """Class for ListValue message type.""" + + __slots__ = () + + def __len__(self): + return len(self.values) + + def append(self, value): + _SetStructValue(self.values.add(), value) + + def extend(self, elem_seq): + for value in elem_seq: + self.append(value) + + def __getitem__(self, index): + """Retrieves item by the specified index.""" + return _GetStructValue(self.values.__getitem__(index)) + + def __setitem__(self, index, value): + _SetStructValue(self.values.__getitem__(index), value) + + def __delitem__(self, key): + del self.values[key] + + def items(self): + for i in range(len(self)): + yield self[i] + + def add_struct(self): + """Appends and returns a struct value as the next value in the list.""" + struct_value = self.values.add().struct_value + # Clear will mark struct_value modified which will indeed create a struct. + struct_value.Clear() + return struct_value + + def add_list(self): + """Appends and returns a list value as the next value in the list.""" + list_value = self.values.add().list_value + # Clear will mark list_value modified which will indeed create a list. + list_value.Clear() + return list_value + +collections.abc.MutableSequence.register(ListValue) + + +# LINT.IfChange(wktbases) +WKTBASES = { + 'google.protobuf.Any': Any, + 'google.protobuf.Duration': Duration, + 'google.protobuf.FieldMask': FieldMask, + 'google.protobuf.ListValue': ListValue, + 'google.protobuf.Struct': Struct, + 'google.protobuf.Timestamp': Timestamp, +} +# LINT.ThenChange(//depot/google.protobuf/compiler/python/pyi_generator.cc:wktbases) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/internal/wire_format.py b/myenv/lib/python3.12/site-packages/google/protobuf/internal/wire_format.py new file mode 100644 index 0000000..6237dab --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/internal/wire_format.py @@ -0,0 +1,245 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Constants and static functions to support protocol buffer wire format.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import struct +from google.protobuf import descriptor +from google.protobuf import message + + +TAG_TYPE_BITS = 3 # Number of bits used to hold type info in a proto tag. +TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1 # 0x7 + +# These numbers identify the wire type of a protocol buffer value. +# We use the least-significant TAG_TYPE_BITS bits of the varint-encoded +# tag-and-type to store one of these WIRETYPE_* constants. +# These values must match WireType enum in //google/protobuf/wire_format.h. +WIRETYPE_VARINT = 0 +WIRETYPE_FIXED64 = 1 +WIRETYPE_LENGTH_DELIMITED = 2 +WIRETYPE_START_GROUP = 3 +WIRETYPE_END_GROUP = 4 +WIRETYPE_FIXED32 = 5 +_WIRETYPE_MAX = 5 + + +# Bounds for various integer types. +INT32_MAX = int((1 << 31) - 1) +INT32_MIN = int(-(1 << 31)) +UINT32_MAX = (1 << 32) - 1 + +INT64_MAX = (1 << 63) - 1 +INT64_MIN = -(1 << 63) +UINT64_MAX = (1 << 64) - 1 + +# "struct" format strings that will encode/decode the specified formats. +FORMAT_UINT32_LITTLE_ENDIAN = '> TAG_TYPE_BITS), (tag & TAG_TYPE_MASK) + + +def ZigZagEncode(value): + """ZigZag Transform: Encodes signed integers so that they can be + effectively used with varint encoding. See wire_format.h for + more details. + """ + if value >= 0: + return value << 1 + return (value << 1) ^ (~0) + + +def ZigZagDecode(value): + """Inverse of ZigZagEncode().""" + if not value & 0x1: + return value >> 1 + return (value >> 1) ^ (~0) + + + +# The *ByteSize() functions below return the number of bytes required to +# serialize "field number + type" information and then serialize the value. + + +def Int32ByteSize(field_number, int32): + return Int64ByteSize(field_number, int32) + + +def Int32ByteSizeNoTag(int32): + return _VarUInt64ByteSizeNoTag(0xffffffffffffffff & int32) + + +def Int64ByteSize(field_number, int64): + # Have to convert to uint before calling UInt64ByteSize(). + return UInt64ByteSize(field_number, 0xffffffffffffffff & int64) + + +def UInt32ByteSize(field_number, uint32): + return UInt64ByteSize(field_number, uint32) + + +def UInt64ByteSize(field_number, uint64): + return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64) + + +def SInt32ByteSize(field_number, int32): + return UInt32ByteSize(field_number, ZigZagEncode(int32)) + + +def SInt64ByteSize(field_number, int64): + return UInt64ByteSize(field_number, ZigZagEncode(int64)) + + +def Fixed32ByteSize(field_number, fixed32): + return TagByteSize(field_number) + 4 + + +def Fixed64ByteSize(field_number, fixed64): + return TagByteSize(field_number) + 8 + + +def SFixed32ByteSize(field_number, sfixed32): + return TagByteSize(field_number) + 4 + + +def SFixed64ByteSize(field_number, sfixed64): + return TagByteSize(field_number) + 8 + + +def FloatByteSize(field_number, flt): + return TagByteSize(field_number) + 4 + + +def DoubleByteSize(field_number, double): + return TagByteSize(field_number) + 8 + + +def BoolByteSize(field_number, b): + return TagByteSize(field_number) + 1 + + +def EnumByteSize(field_number, enum): + return UInt32ByteSize(field_number, enum) + + +def StringByteSize(field_number, string): + return BytesByteSize(field_number, string.encode('utf-8')) + + +def BytesByteSize(field_number, b): + return (TagByteSize(field_number) + + _VarUInt64ByteSizeNoTag(len(b)) + + len(b)) + + +def GroupByteSize(field_number, message): + return (2 * TagByteSize(field_number) # START and END group. + + message.ByteSize()) + + +def MessageByteSize(field_number, message): + return (TagByteSize(field_number) + + _VarUInt64ByteSizeNoTag(message.ByteSize()) + + message.ByteSize()) + + +def MessageSetItemByteSize(field_number, msg): + # First compute the sizes of the tags. + # There are 2 tags for the beginning and ending of the repeated group, that + # is field number 1, one with field number 2 (type_id) and one with field + # number 3 (message). + total_size = (2 * TagByteSize(1) + TagByteSize(2) + TagByteSize(3)) + + # Add the number of bytes for type_id. + total_size += _VarUInt64ByteSizeNoTag(field_number) + + message_size = msg.ByteSize() + + # The number of bytes for encoding the length of the message. + total_size += _VarUInt64ByteSizeNoTag(message_size) + + # The size of the message. + total_size += message_size + return total_size + + +def TagByteSize(field_number): + """Returns the bytes required to serialize a tag with this field number.""" + # Just pass in type 0, since the type won't affect the tag+type size. + return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0)) + + +# Private helper function for the *ByteSize() functions above. + +def _VarUInt64ByteSizeNoTag(uint64): + """Returns the number of bytes required to serialize a single varint + using boundary value comparisons. (unrolled loop optimization -WPierce) + uint64 must be unsigned. + """ + if uint64 <= 0x7f: return 1 + if uint64 <= 0x3fff: return 2 + if uint64 <= 0x1fffff: return 3 + if uint64 <= 0xfffffff: return 4 + if uint64 <= 0x7ffffffff: return 5 + if uint64 <= 0x3ffffffffff: return 6 + if uint64 <= 0x1ffffffffffff: return 7 + if uint64 <= 0xffffffffffffff: return 8 + if uint64 <= 0x7fffffffffffffff: return 9 + if uint64 > UINT64_MAX: + raise message.EncodeError('Value out of range: %d' % uint64) + return 10 + + +NON_PACKABLE_TYPES = ( + descriptor.FieldDescriptor.TYPE_STRING, + descriptor.FieldDescriptor.TYPE_GROUP, + descriptor.FieldDescriptor.TYPE_MESSAGE, + descriptor.FieldDescriptor.TYPE_BYTES +) + + +def IsTypePackable(field_type): + """Return true iff packable = true is valid for fields of this type. + + Args: + field_type: a FieldDescriptor::Type value. + + Returns: + True iff fields of this type are packable. + """ + return field_type not in NON_PACKABLE_TYPES diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/json_format.py b/myenv/lib/python3.12/site-packages/google/protobuf/json_format.py new file mode 100644 index 0000000..1b6ce9d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/json_format.py @@ -0,0 +1,904 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Contains routines for printing protocol messages in JSON format. + +Simple usage example: + + # Create a proto object and serialize it to a json format string. + message = my_proto_pb2.MyMessage(foo='bar') + json_string = json_format.MessageToJson(message) + + # Parse a json format string to proto object. + message = json_format.Parse(json_string, my_proto_pb2.MyMessage()) +""" + +__author__ = 'jieluo@google.com (Jie Luo)' + + +import base64 +from collections import OrderedDict +import json +import math +from operator import methodcaller +import re + +from google.protobuf.internal import type_checkers +from google.protobuf import descriptor +from google.protobuf import message_factory +from google.protobuf import symbol_database + + +_INT_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_INT32, + descriptor.FieldDescriptor.CPPTYPE_UINT32, + descriptor.FieldDescriptor.CPPTYPE_INT64, + descriptor.FieldDescriptor.CPPTYPE_UINT64]) +_INT64_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_INT64, + descriptor.FieldDescriptor.CPPTYPE_UINT64]) +_FLOAT_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_FLOAT, + descriptor.FieldDescriptor.CPPTYPE_DOUBLE]) +_INFINITY = 'Infinity' +_NEG_INFINITY = '-Infinity' +_NAN = 'NaN' + +_UNPAIRED_SURROGATE_PATTERN = re.compile( + u'[\ud800-\udbff](?![\udc00-\udfff])|(? self.max_recursion_depth: + raise ParseError('Message too deep. Max recursion depth is {0}'.format( + self.max_recursion_depth)) + message_descriptor = message.DESCRIPTOR + full_name = message_descriptor.full_name + if not path: + path = message_descriptor.name + if _IsWrapperMessage(message_descriptor): + self._ConvertWrapperMessage(value, message, path) + elif full_name in _WKTJSONMETHODS: + methodcaller(_WKTJSONMETHODS[full_name][1], value, message, path)(self) + else: + self._ConvertFieldValuePair(value, message, path) + self.recursion_depth -= 1 + + def _ConvertFieldValuePair(self, js, message, path): + """Convert field value pairs into regular message. + + Args: + js: A JSON object to convert the field value pairs. + message: A regular protocol message to record the data. + path: parent path to log parse error info. + + Raises: + ParseError: In case of problems converting. + """ + names = [] + message_descriptor = message.DESCRIPTOR + fields_by_json_name = dict((f.json_name, f) + for f in message_descriptor.fields) + for name in js: + try: + field = fields_by_json_name.get(name, None) + if not field: + field = message_descriptor.fields_by_name.get(name, None) + if not field and _VALID_EXTENSION_NAME.match(name): + if not message_descriptor.is_extendable: + raise ParseError( + 'Message type {0} does not have extensions at {1}'.format( + message_descriptor.full_name, path)) + identifier = name[1:-1] # strip [] brackets + # pylint: disable=protected-access + field = message.Extensions._FindExtensionByName(identifier) + # pylint: enable=protected-access + if not field: + # Try looking for extension by the message type name, dropping the + # field name following the final . separator in full_name. + identifier = '.'.join(identifier.split('.')[:-1]) + # pylint: disable=protected-access + field = message.Extensions._FindExtensionByName(identifier) + # pylint: enable=protected-access + if not field: + if self.ignore_unknown_fields: + continue + raise ParseError( + ('Message type "{0}" has no field named "{1}" at "{2}".\n' + ' Available Fields(except extensions): "{3}"').format( + message_descriptor.full_name, name, path, + [f.json_name for f in message_descriptor.fields])) + if name in names: + raise ParseError('Message type "{0}" should not have multiple ' + '"{1}" fields at "{2}".'.format( + message.DESCRIPTOR.full_name, name, path)) + names.append(name) + value = js[name] + # Check no other oneof field is parsed. + if field.containing_oneof is not None and value is not None: + oneof_name = field.containing_oneof.name + if oneof_name in names: + raise ParseError('Message type "{0}" should not have multiple ' + '"{1}" oneof fields at "{2}".'.format( + message.DESCRIPTOR.full_name, oneof_name, + path)) + names.append(oneof_name) + + if value is None: + if (field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE + and field.message_type.full_name == 'google.protobuf.Value'): + sub_message = getattr(message, field.name) + sub_message.null_value = 0 + elif (field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM + and field.enum_type.full_name == 'google.protobuf.NullValue'): + setattr(message, field.name, 0) + else: + message.ClearField(field.name) + continue + + # Parse field value. + if _IsMapEntry(field): + message.ClearField(field.name) + self._ConvertMapFieldValue(value, message, field, + '{0}.{1}'.format(path, name)) + elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + message.ClearField(field.name) + if not isinstance(value, list): + raise ParseError('repeated field {0} must be in [] which is ' + '{1} at {2}'.format(name, value, path)) + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + # Repeated message field. + for index, item in enumerate(value): + sub_message = getattr(message, field.name).add() + # None is a null_value in Value. + if (item is None and + sub_message.DESCRIPTOR.full_name != 'google.protobuf.Value'): + raise ParseError('null is not allowed to be used as an element' + ' in a repeated field at {0}.{1}[{2}]'.format( + path, name, index)) + self.ConvertMessage(item, sub_message, + '{0}.{1}[{2}]'.format(path, name, index)) + else: + # Repeated scalar field. + for index, item in enumerate(value): + if item is None: + raise ParseError('null is not allowed to be used as an element' + ' in a repeated field at {0}.{1}[{2}]'.format( + path, name, index)) + getattr(message, field.name).append( + _ConvertScalarFieldValue( + item, field, '{0}.{1}[{2}]'.format(path, name, index))) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + if field.is_extension: + sub_message = message.Extensions[field] + else: + sub_message = getattr(message, field.name) + sub_message.SetInParent() + self.ConvertMessage(value, sub_message, '{0}.{1}'.format(path, name)) + else: + if field.is_extension: + message.Extensions[field] = _ConvertScalarFieldValue( + value, field, '{0}.{1}'.format(path, name)) + else: + setattr( + message, field.name, + _ConvertScalarFieldValue(value, field, + '{0}.{1}'.format(path, name))) + except ParseError as e: + if field and field.containing_oneof is None: + raise ParseError( + 'Failed to parse {0} field: {1}.'.format(name, e) + ) from e + else: + raise ParseError(str(e)) from e + except ValueError as e: + raise ParseError( + 'Failed to parse {0} field: {1}.'.format(name, e) + ) from e + except TypeError as e: + raise ParseError( + 'Failed to parse {0} field: {1}.'.format(name, e) + ) from e + + def _ConvertAnyMessage(self, value, message, path): + """Convert a JSON representation into Any message.""" + if isinstance(value, dict) and not value: + return + try: + type_url = value['@type'] + except KeyError as e: + raise ParseError( + '@type is missing when parsing any message at {0}'.format(path) + ) from e + + try: + sub_message = _CreateMessageFromTypeUrl(type_url, self.descriptor_pool) + except TypeError as e: + raise ParseError('{0} at {1}'.format(e, path)) from e + message_descriptor = sub_message.DESCRIPTOR + full_name = message_descriptor.full_name + if _IsWrapperMessage(message_descriptor): + self._ConvertWrapperMessage(value['value'], sub_message, + '{0}.value'.format(path)) + elif full_name in _WKTJSONMETHODS: + methodcaller(_WKTJSONMETHODS[full_name][1], value['value'], sub_message, + '{0}.value'.format(path))( + self) + else: + del value['@type'] + self._ConvertFieldValuePair(value, sub_message, path) + value['@type'] = type_url + # Sets Any message + message.value = sub_message.SerializeToString() + message.type_url = type_url + + def _ConvertGenericMessage(self, value, message, path): + """Convert a JSON representation into message with FromJsonString.""" + # Duration, Timestamp, FieldMask have a FromJsonString method to do the + # conversion. Users can also call the method directly. + try: + message.FromJsonString(value) + except ValueError as e: + raise ParseError('{0} at {1}'.format(e, path)) from e + + def _ConvertValueMessage(self, value, message, path): + """Convert a JSON representation into Value message.""" + if isinstance(value, dict): + self._ConvertStructMessage(value, message.struct_value, path) + elif isinstance(value, list): + self._ConvertListValueMessage(value, message.list_value, path) + elif value is None: + message.null_value = 0 + elif isinstance(value, bool): + message.bool_value = value + elif isinstance(value, str): + message.string_value = value + elif isinstance(value, _INT_OR_FLOAT): + message.number_value = value + else: + raise ParseError('Value {0} has unexpected type {1} at {2}'.format( + value, type(value), path)) + + def _ConvertListValueMessage(self, value, message, path): + """Convert a JSON representation into ListValue message.""" + if not isinstance(value, list): + raise ParseError('ListValue must be in [] which is {0} at {1}'.format( + value, path)) + message.ClearField('values') + for index, item in enumerate(value): + self._ConvertValueMessage(item, message.values.add(), + '{0}[{1}]'.format(path, index)) + + def _ConvertStructMessage(self, value, message, path): + """Convert a JSON representation into Struct message.""" + if not isinstance(value, dict): + raise ParseError('Struct must be in a dict which is {0} at {1}'.format( + value, path)) + # Clear will mark the struct as modified so it will be created even if + # there are no values. + message.Clear() + for key in value: + self._ConvertValueMessage(value[key], message.fields[key], + '{0}.{1}'.format(path, key)) + return + + def _ConvertWrapperMessage(self, value, message, path): + """Convert a JSON representation into Wrapper message.""" + field = message.DESCRIPTOR.fields_by_name['value'] + setattr( + message, 'value', + _ConvertScalarFieldValue(value, field, path='{0}.value'.format(path))) + + def _ConvertMapFieldValue(self, value, message, field, path): + """Convert map field value for a message map field. + + Args: + value: A JSON object to convert the map field value. + message: A protocol message to record the converted data. + field: The descriptor of the map field to be converted. + path: parent path to log parse error info. + + Raises: + ParseError: In case of convert problems. + """ + if not isinstance(value, dict): + raise ParseError( + 'Map field {0} must be in a dict which is {1} at {2}'.format( + field.name, value, path)) + key_field = field.message_type.fields_by_name['key'] + value_field = field.message_type.fields_by_name['value'] + for key in value: + key_value = _ConvertScalarFieldValue(key, key_field, + '{0}.key'.format(path), True) + if value_field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + self.ConvertMessage(value[key], + getattr(message, field.name)[key_value], + '{0}[{1}]'.format(path, key_value)) + else: + getattr(message, field.name)[key_value] = _ConvertScalarFieldValue( + value[key], value_field, path='{0}[{1}]'.format(path, key_value)) + + +def _ConvertScalarFieldValue(value, field, path, require_str=False): + """Convert a single scalar field value. + + Args: + value: A scalar value to convert the scalar field value. + field: The descriptor of the field to convert. + path: parent path to log parse error info. + require_str: If True, the field value must be a str. + + Returns: + The converted scalar field value + + Raises: + ParseError: In case of convert problems. + """ + try: + if field.cpp_type in _INT_TYPES: + return _ConvertInteger(value) + elif field.cpp_type in _FLOAT_TYPES: + return _ConvertFloat(value, field) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL: + return _ConvertBool(value, require_str) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING: + if field.type == descriptor.FieldDescriptor.TYPE_BYTES: + if isinstance(value, str): + encoded = value.encode('utf-8') + else: + encoded = value + # Add extra padding '=' + padded_value = encoded + b'=' * (4 - len(encoded) % 4) + return base64.urlsafe_b64decode(padded_value) + else: + # Checking for unpaired surrogates appears to be unreliable, + # depending on the specific Python version, so we check manually. + if _UNPAIRED_SURROGATE_PATTERN.search(value): + raise ParseError('Unpaired surrogate') + return value + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: + # Convert an enum value. + enum_value = field.enum_type.values_by_name.get(value, None) + if enum_value is None: + try: + number = int(value) + enum_value = field.enum_type.values_by_number.get(number, None) + except ValueError as e: + raise ParseError('Invalid enum value {0} for enum type {1}'.format( + value, field.enum_type.full_name)) from e + if enum_value is None: + if field.enum_type.is_closed: + raise ParseError('Invalid enum value {0} for enum type {1}'.format( + value, field.enum_type.full_name)) + else: + return number + return enum_value.number + except ParseError as e: + raise ParseError('{0} at {1}'.format(e, path)) from e + + +def _ConvertInteger(value): + """Convert an integer. + + Args: + value: A scalar value to convert. + + Returns: + The integer value. + + Raises: + ParseError: If an integer couldn't be consumed. + """ + if isinstance(value, float) and not value.is_integer(): + raise ParseError('Couldn\'t parse integer: {0}'.format(value)) + + if isinstance(value, str) and value.find(' ') != -1: + raise ParseError('Couldn\'t parse integer: "{0}"'.format(value)) + + if isinstance(value, bool): + raise ParseError('Bool value {0} is not acceptable for ' + 'integer field'.format(value)) + + return int(value) + + +def _ConvertFloat(value, field): + """Convert an floating point number.""" + if isinstance(value, float): + if math.isnan(value): + raise ParseError('Couldn\'t parse NaN, use quoted "NaN" instead') + if math.isinf(value): + if value > 0: + raise ParseError('Couldn\'t parse Infinity or value too large, ' + 'use quoted "Infinity" instead') + else: + raise ParseError('Couldn\'t parse -Infinity or value too small, ' + 'use quoted "-Infinity" instead') + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_FLOAT: + # pylint: disable=protected-access + if value > type_checkers._FLOAT_MAX: + raise ParseError('Float value too large') + # pylint: disable=protected-access + if value < type_checkers._FLOAT_MIN: + raise ParseError('Float value too small') + if value == 'nan': + raise ParseError('Couldn\'t parse float "nan", use "NaN" instead') + try: + # Assume Python compatible syntax. + return float(value) + except ValueError as e: + # Check alternative spellings. + if value == _NEG_INFINITY: + return float('-inf') + elif value == _INFINITY: + return float('inf') + elif value == _NAN: + return float('nan') + else: + raise ParseError('Couldn\'t parse float: {0}'.format(value)) from e + + +def _ConvertBool(value, require_str): + """Convert a boolean value. + + Args: + value: A scalar value to convert. + require_str: If True, value must be a str. + + Returns: + The bool parsed. + + Raises: + ParseError: If a boolean value couldn't be consumed. + """ + if require_str: + if value == 'true': + return True + elif value == 'false': + return False + else: + raise ParseError('Expected "true" or "false", not {0}'.format(value)) + + if not isinstance(value, bool): + raise ParseError('Expected true or false without quotes') + return value + +_WKTJSONMETHODS = { + 'google.protobuf.Any': ['_AnyMessageToJsonObject', + '_ConvertAnyMessage'], + 'google.protobuf.Duration': ['_GenericMessageToJsonObject', + '_ConvertGenericMessage'], + 'google.protobuf.FieldMask': ['_GenericMessageToJsonObject', + '_ConvertGenericMessage'], + 'google.protobuf.ListValue': ['_ListValueMessageToJsonObject', + '_ConvertListValueMessage'], + 'google.protobuf.Struct': ['_StructMessageToJsonObject', + '_ConvertStructMessage'], + 'google.protobuf.Timestamp': ['_GenericMessageToJsonObject', + '_ConvertGenericMessage'], + 'google.protobuf.Value': ['_ValueMessageToJsonObject', + '_ConvertValueMessage'] +} diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/message.py b/myenv/lib/python3.12/site-packages/google/protobuf/message.py new file mode 100644 index 0000000..29ebd7b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/message.py @@ -0,0 +1,399 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +# TODO: We should just make these methods all "pure-virtual" and move +# all implementation out, into reflection.py for now. + + +"""Contains an abstract base class for protocol messages.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +class Error(Exception): + """Base error type for this module.""" + pass + + +class DecodeError(Error): + """Exception raised when deserializing messages.""" + pass + + +class EncodeError(Error): + """Exception raised when serializing messages.""" + pass + + +class Message(object): + + """Abstract base class for protocol messages. + + Protocol message classes are almost always generated by the protocol + compiler. These generated types subclass Message and implement the methods + shown below. + """ + + # TODO: Link to an HTML document here. + + # TODO: Document that instances of this class will also + # have an Extensions attribute with __getitem__ and __setitem__. + # Again, not sure how to best convey this. + + # TODO: Document these fields and methods. + + __slots__ = [] + + #: The :class:`google.protobuf.Descriptor` + # for this message type. + DESCRIPTOR = None + + def __deepcopy__(self, memo=None): + clone = type(self)() + clone.MergeFrom(self) + return clone + + def __eq__(self, other_msg): + """Recursively compares two messages by value and structure.""" + raise NotImplementedError + + def __ne__(self, other_msg): + # Can't just say self != other_msg, since that would infinitely recurse. :) + return not self == other_msg + + def __hash__(self): + raise TypeError('unhashable object') + + def __str__(self): + """Outputs a human-readable representation of the message.""" + raise NotImplementedError + + def __unicode__(self): + """Outputs a human-readable representation of the message.""" + raise NotImplementedError + + def MergeFrom(self, other_msg): + """Merges the contents of the specified message into current message. + + This method merges the contents of the specified message into the current + message. Singular fields that are set in the specified message overwrite + the corresponding fields in the current message. Repeated fields are + appended. Singular sub-messages and groups are recursively merged. + + Args: + other_msg (Message): A message to merge into the current message. + """ + raise NotImplementedError + + def CopyFrom(self, other_msg): + """Copies the content of the specified message into the current message. + + The method clears the current message and then merges the specified + message using MergeFrom. + + Args: + other_msg (Message): A message to copy into the current one. + """ + if self is other_msg: + return + self.Clear() + self.MergeFrom(other_msg) + + def Clear(self): + """Clears all data that was set in the message.""" + raise NotImplementedError + + def SetInParent(self): + """Mark this as present in the parent. + + This normally happens automatically when you assign a field of a + sub-message, but sometimes you want to make the sub-message + present while keeping it empty. If you find yourself using this, + you may want to reconsider your design. + """ + raise NotImplementedError + + def IsInitialized(self): + """Checks if the message is initialized. + + Returns: + bool: The method returns True if the message is initialized (i.e. all of + its required fields are set). + """ + raise NotImplementedError + + # TODO: MergeFromString() should probably return None and be + # implemented in terms of a helper that returns the # of bytes read. Our + # deserialization routines would use the helper when recursively + # deserializing, but the end user would almost always just want the no-return + # MergeFromString(). + + def MergeFromString(self, serialized): + """Merges serialized protocol buffer data into this message. + + When we find a field in `serialized` that is already present + in this message: + + - If it's a "repeated" field, we append to the end of our list. + - Else, if it's a scalar, we overwrite our field. + - Else, (it's a nonrepeated composite), we recursively merge + into the existing composite. + + Args: + serialized (bytes): Any object that allows us to call + ``memoryview(serialized)`` to access a string of bytes using the + buffer interface. + + Returns: + int: The number of bytes read from `serialized`. + For non-group messages, this will always be `len(serialized)`, + but for messages which are actually groups, this will + generally be less than `len(serialized)`, since we must + stop when we reach an ``END_GROUP`` tag. Note that if + we *do* stop because of an ``END_GROUP`` tag, the number + of bytes returned does not include the bytes + for the ``END_GROUP`` tag information. + + Raises: + DecodeError: if the input cannot be parsed. + """ + # TODO: Document handling of unknown fields. + # TODO: When we switch to a helper, this will return None. + raise NotImplementedError + + def ParseFromString(self, serialized): + """Parse serialized protocol buffer data in binary form into this message. + + Like :func:`MergeFromString()`, except we clear the object first. + + Raises: + message.DecodeError if the input cannot be parsed. + """ + self.Clear() + return self.MergeFromString(serialized) + + def SerializeToString(self, **kwargs): + """Serializes the protocol message to a binary string. + + Keyword Args: + deterministic (bool): If true, requests deterministic serialization + of the protobuf, with predictable ordering of map keys. + + Returns: + A binary string representation of the message if all of the required + fields in the message are set (i.e. the message is initialized). + + Raises: + EncodeError: if the message isn't initialized (see :func:`IsInitialized`). + """ + raise NotImplementedError + + def SerializePartialToString(self, **kwargs): + """Serializes the protocol message to a binary string. + + This method is similar to SerializeToString but doesn't check if the + message is initialized. + + Keyword Args: + deterministic (bool): If true, requests deterministic serialization + of the protobuf, with predictable ordering of map keys. + + Returns: + bytes: A serialized representation of the partial message. + """ + raise NotImplementedError + + # TODO: Decide whether we like these better + # than auto-generated has_foo() and clear_foo() methods + # on the instances themselves. This way is less consistent + # with C++, but it makes reflection-type access easier and + # reduces the number of magically autogenerated things. + # + # TODO: Be sure to document (and test) exactly + # which field names are accepted here. Are we case-sensitive? + # What do we do with fields that share names with Python keywords + # like 'lambda' and 'yield'? + # + # nnorwitz says: + # """ + # Typically (in python), an underscore is appended to names that are + # keywords. So they would become lambda_ or yield_. + # """ + def ListFields(self): + """Returns a list of (FieldDescriptor, value) tuples for present fields. + + A message field is non-empty if HasField() would return true. A singular + primitive field is non-empty if HasField() would return true in proto2 or it + is non zero in proto3. A repeated field is non-empty if it contains at least + one element. The fields are ordered by field number. + + Returns: + list[tuple(FieldDescriptor, value)]: field descriptors and values + for all fields in the message which are not empty. The values vary by + field type. + """ + raise NotImplementedError + + def HasField(self, field_name): + """Checks if a certain field is set for the message. + + For a oneof group, checks if any field inside is set. Note that if the + field_name is not defined in the message descriptor, :exc:`ValueError` will + be raised. + + Args: + field_name (str): The name of the field to check for presence. + + Returns: + bool: Whether a value has been set for the named field. + + Raises: + ValueError: if the `field_name` is not a member of this message. + """ + raise NotImplementedError + + def ClearField(self, field_name): + """Clears the contents of a given field. + + Inside a oneof group, clears the field set. If the name neither refers to a + defined field or oneof group, :exc:`ValueError` is raised. + + Args: + field_name (str): The name of the field to check for presence. + + Raises: + ValueError: if the `field_name` is not a member of this message. + """ + raise NotImplementedError + + def WhichOneof(self, oneof_group): + """Returns the name of the field that is set inside a oneof group. + + If no field is set, returns None. + + Args: + oneof_group (str): the name of the oneof group to check. + + Returns: + str or None: The name of the group that is set, or None. + + Raises: + ValueError: no group with the given name exists + """ + raise NotImplementedError + + def HasExtension(self, field_descriptor): + """Checks if a certain extension is present for this message. + + Extensions are retrieved using the :attr:`Extensions` mapping (if present). + + Args: + field_descriptor: The field descriptor for the extension to check. + + Returns: + bool: Whether the extension is present for this message. + + Raises: + KeyError: if the extension is repeated. Similar to repeated fields, + there is no separate notion of presence: a "not present" repeated + extension is an empty list. + """ + raise NotImplementedError + + def ClearExtension(self, field_descriptor): + """Clears the contents of a given extension. + + Args: + field_descriptor: The field descriptor for the extension to clear. + """ + raise NotImplementedError + + def UnknownFields(self): + """Returns the UnknownFieldSet. + + Returns: + UnknownFieldSet: The unknown fields stored in this message. + """ + raise NotImplementedError + + def DiscardUnknownFields(self): + """Clears all fields in the :class:`UnknownFieldSet`. + + This operation is recursive for nested message. + """ + raise NotImplementedError + + def ByteSize(self): + """Returns the serialized size of this message. + + Recursively calls ByteSize() on all contained messages. + + Returns: + int: The number of bytes required to serialize this message. + """ + raise NotImplementedError + + @classmethod + def FromString(cls, s): + raise NotImplementedError + +# TODO: Remove it in OSS + @staticmethod + def RegisterExtension(field_descriptor): + raise NotImplementedError + + def _SetListener(self, message_listener): + """Internal method used by the protocol message implementation. + Clients should not call this directly. + + Sets a listener that this message will call on certain state transitions. + + The purpose of this method is to register back-edges from children to + parents at runtime, for the purpose of setting "has" bits and + byte-size-dirty bits in the parent and ancestor objects whenever a child or + descendant object is modified. + + If the client wants to disconnect this Message from the object tree, she + explicitly sets callback to None. + + If message_listener is None, unregisters any existing listener. Otherwise, + message_listener must implement the MessageListener interface in + internal/message_listener.py, and we discard any listener registered + via a previous _SetListener() call. + """ + raise NotImplementedError + + def __getstate__(self): + """Support the pickle protocol.""" + return dict(serialized=self.SerializePartialToString()) + + def __setstate__(self, state): + """Support the pickle protocol.""" + self.__init__() + serialized = state['serialized'] + # On Python 3, using encoding='latin1' is required for unpickling + # protos pickled by Python 2. + if not isinstance(serialized, bytes): + serialized = serialized.encode('latin1') + self.ParseFromString(serialized) + + def __reduce__(self): + message_descriptor = self.DESCRIPTOR + if message_descriptor.containing_type is None: + return type(self), (), self.__getstate__() + # the message type must be nested. + # Python does not pickle nested classes; use the symbol_database on the + # receiving end. + container = message_descriptor + return (_InternalConstructMessage, (container.full_name,), + self.__getstate__()) + + +def _InternalConstructMessage(full_name): + """Constructs a nested message.""" + from google.protobuf import symbol_database # pylint:disable=g-import-not-at-top + + return symbol_database.Default().GetSymbol(full_name)() diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/message_factory.py b/myenv/lib/python3.12/site-packages/google/protobuf/message_factory.py new file mode 100644 index 0000000..56fff6d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/message_factory.py @@ -0,0 +1,233 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Provides a factory class for generating dynamic messages. + +The easiest way to use this class is if you have access to the FileDescriptor +protos containing the messages you want to create you can just do the following: + +message_classes = message_factory.GetMessages(iterable_of_file_descriptors) +my_proto_instance = message_classes['some.proto.package.MessageName']() +""" + +__author__ = 'matthewtoia@google.com (Matt Toia)' + +import warnings + +from google.protobuf.internal import api_implementation +from google.protobuf import descriptor_pool +from google.protobuf import message + +if api_implementation.Type() == 'python': + from google.protobuf.internal import python_message as message_impl +else: + from google.protobuf.pyext import cpp_message as message_impl # pylint: disable=g-import-not-at-top + + +# The type of all Message classes. +_GENERATED_PROTOCOL_MESSAGE_TYPE = message_impl.GeneratedProtocolMessageType + + +def GetMessageClass(descriptor): + """Obtains a proto2 message class based on the passed in descriptor. + + Passing a descriptor with a fully qualified name matching a previous + invocation will cause the same class to be returned. + + Args: + descriptor: The descriptor to build from. + + Returns: + A class describing the passed in descriptor. + """ + concrete_class = getattr(descriptor, '_concrete_class', None) + if concrete_class: + return concrete_class + return _InternalCreateMessageClass(descriptor) + + +def GetMessageClassesForFiles(files, pool): + """Gets all the messages from specified files. + + This will find and resolve dependencies, failing if the descriptor + pool cannot satisfy them. + + Args: + files: The file names to extract messages from. + pool: The descriptor pool to find the files including the dependent + files. + + Returns: + A dictionary mapping proto names to the message classes. + """ + result = {} + for file_name in files: + file_desc = pool.FindFileByName(file_name) + for desc in file_desc.message_types_by_name.values(): + result[desc.full_name] = GetMessageClass(desc) + + # While the extension FieldDescriptors are created by the descriptor pool, + # the python classes created in the factory need them to be registered + # explicitly, which is done below. + # + # The call to RegisterExtension will specifically check if the + # extension was already registered on the object and either + # ignore the registration if the original was the same, or raise + # an error if they were different. + + for extension in file_desc.extensions_by_name.values(): + extended_class = GetMessageClass(extension.containing_type) + if api_implementation.Type() != 'python': + # TODO: Remove this check here. Duplicate extension + # register check should be in descriptor_pool. + if extension is not pool.FindExtensionByNumber( + extension.containing_type, extension.number + ): + raise ValueError('Double registration of Extensions') + # Recursively load protos for extension field, in order to be able to + # fully represent the extension. This matches the behavior for regular + # fields too. + if extension.message_type: + GetMessageClass(extension.message_type) + return result + + +def _InternalCreateMessageClass(descriptor): + """Builds a proto2 message class based on the passed in descriptor. + + Args: + descriptor: The descriptor to build from. + + Returns: + A class describing the passed in descriptor. + """ + descriptor_name = descriptor.name + result_class = _GENERATED_PROTOCOL_MESSAGE_TYPE( + descriptor_name, + (message.Message,), + { + 'DESCRIPTOR': descriptor, + # If module not set, it wrongly points to message_factory module. + '__module__': None, + }) + for field in descriptor.fields: + if field.message_type: + GetMessageClass(field.message_type) + for extension in result_class.DESCRIPTOR.extensions: + extended_class = GetMessageClass(extension.containing_type) + if api_implementation.Type() != 'python': + # TODO: Remove this check here. Duplicate extension + # register check should be in descriptor_pool. + pool = extension.containing_type.file.pool + if extension is not pool.FindExtensionByNumber( + extension.containing_type, extension.number + ): + raise ValueError('Double registration of Extensions') + if extension.message_type: + GetMessageClass(extension.message_type) + return result_class + + +# Deprecated. Please use GetMessageClass() or GetMessageClassesForFiles() +# method above instead. +class MessageFactory(object): + """Factory for creating Proto2 messages from descriptors in a pool.""" + + def __init__(self, pool=None): + """Initializes a new factory.""" + self.pool = pool or descriptor_pool.DescriptorPool() + + def GetPrototype(self, descriptor): + """Obtains a proto2 message class based on the passed in descriptor. + + Passing a descriptor with a fully qualified name matching a previous + invocation will cause the same class to be returned. + + Args: + descriptor: The descriptor to build from. + + Returns: + A class describing the passed in descriptor. + """ + warnings.warn( + 'MessageFactory class is deprecated. Please use ' + 'GetMessageClass() instead of MessageFactory.GetPrototype. ' + 'MessageFactory class will be removed after 2024.', + stacklevel=2, + ) + return GetMessageClass(descriptor) + + def CreatePrototype(self, descriptor): + """Builds a proto2 message class based on the passed in descriptor. + + Don't call this function directly, it always creates a new class. Call + GetMessageClass() instead. + + Args: + descriptor: The descriptor to build from. + + Returns: + A class describing the passed in descriptor. + """ + warnings.warn( + 'Directly call CreatePrototype is wrong. Please use ' + 'GetMessageClass() method instead. Directly use ' + 'CreatePrototype will raise error after July 2023.', + stacklevel=2, + ) + return _InternalCreateMessageClass(descriptor) + + def GetMessages(self, files): + """Gets all the messages from a specified file. + + This will find and resolve dependencies, failing if the descriptor + pool cannot satisfy them. + + Args: + files: The file names to extract messages from. + + Returns: + A dictionary mapping proto names to the message classes. This will include + any dependent messages as well as any messages defined in the same file as + a specified message. + """ + warnings.warn( + 'MessageFactory class is deprecated. Please use ' + 'GetMessageClassesForFiles() instead of ' + 'MessageFactory.GetMessages(). MessageFactory class ' + 'will be removed after 2024.', + stacklevel=2, + ) + return GetMessageClassesForFiles(files, self.pool) + + +def GetMessages(file_protos, pool=None): + """Builds a dictionary of all the messages available in a set of files. + + Args: + file_protos: Iterable of FileDescriptorProto to build messages out of. + pool: The descriptor pool to add the file protos. + + Returns: + A dictionary mapping proto names to the message classes. This will include + any dependent messages as well as any messages defined in the same file as + a specified message. + """ + # The cpp implementation of the protocol buffer library requires to add the + # message in topological order of the dependency graph. + des_pool = pool or descriptor_pool.DescriptorPool() + file_by_name = {file_proto.name: file_proto for file_proto in file_protos} + def _AddFile(file_proto): + for dependency in file_proto.dependency: + if dependency in file_by_name: + # Remove from elements to be visited, in order to cut cycles. + _AddFile(file_by_name.pop(dependency)) + des_pool.Add(file_proto) + while file_by_name: + _AddFile(file_by_name.popitem()[1]) + return GetMessageClassesForFiles( + [file_proto.name for file_proto in file_protos], des_pool) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/proto_builder.py b/myenv/lib/python3.12/site-packages/google/protobuf/proto_builder.py new file mode 100644 index 0000000..803d004 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/proto_builder.py @@ -0,0 +1,111 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Dynamic Protobuf class creator.""" + +from collections import OrderedDict +import hashlib +import os + +from google.protobuf import descriptor_pb2 +from google.protobuf import descriptor +from google.protobuf import descriptor_pool +from google.protobuf import message_factory + + +def _GetMessageFromFactory(pool, full_name): + """Get a proto class from the MessageFactory by name. + + Args: + pool: a descriptor pool. + full_name: str, the fully qualified name of the proto type. + Returns: + A class, for the type identified by full_name. + Raises: + KeyError, if the proto is not found in the factory's descriptor pool. + """ + proto_descriptor = pool.FindMessageTypeByName(full_name) + proto_cls = message_factory.GetMessageClass(proto_descriptor) + return proto_cls + + +def MakeSimpleProtoClass(fields, full_name=None, pool=None): + """Create a Protobuf class whose fields are basic types. + + Note: this doesn't validate field names! + + Args: + fields: dict of {name: field_type} mappings for each field in the proto. If + this is an OrderedDict the order will be maintained, otherwise the + fields will be sorted by name. + full_name: optional str, the fully-qualified name of the proto type. + pool: optional DescriptorPool instance. + Returns: + a class, the new protobuf class with a FileDescriptor. + """ + pool_instance = pool or descriptor_pool.DescriptorPool() + if full_name is not None: + try: + proto_cls = _GetMessageFromFactory(pool_instance, full_name) + return proto_cls + except KeyError: + # The factory's DescriptorPool doesn't know about this class yet. + pass + + # Get a list of (name, field_type) tuples from the fields dict. If fields was + # an OrderedDict we keep the order, but otherwise we sort the field to ensure + # consistent ordering. + field_items = fields.items() + if not isinstance(fields, OrderedDict): + field_items = sorted(field_items) + + # Use a consistent file name that is unlikely to conflict with any imported + # proto files. + fields_hash = hashlib.sha1() + for f_name, f_type in field_items: + fields_hash.update(f_name.encode('utf-8')) + fields_hash.update(str(f_type).encode('utf-8')) + proto_file_name = fields_hash.hexdigest() + '.proto' + + # If the proto is anonymous, use the same hash to name it. + if full_name is None: + full_name = ('net.proto2.python.public.proto_builder.AnonymousProto_' + + fields_hash.hexdigest()) + try: + proto_cls = _GetMessageFromFactory(pool_instance, full_name) + return proto_cls + except KeyError: + # The factory's DescriptorPool doesn't know about this class yet. + pass + + # This is the first time we see this proto: add a new descriptor to the pool. + pool_instance.Add( + _MakeFileDescriptorProto(proto_file_name, full_name, field_items)) + return _GetMessageFromFactory(pool_instance, full_name) + + +def _MakeFileDescriptorProto(proto_file_name, full_name, field_items): + """Populate FileDescriptorProto for MessageFactory's DescriptorPool.""" + package, name = full_name.rsplit('.', 1) + file_proto = descriptor_pb2.FileDescriptorProto() + file_proto.name = os.path.join(package.replace('.', '/'), proto_file_name) + file_proto.package = package + desc_proto = file_proto.message_type.add() + desc_proto.name = name + for f_number, (f_name, f_type) in enumerate(field_items, 1): + field_proto = desc_proto.field.add() + field_proto.name = f_name + # # If the number falls in the reserved range, reassign it to the correct + # # number after the range. + if f_number >= descriptor.FieldDescriptor.FIRST_RESERVED_FIELD_NUMBER: + f_number += ( + descriptor.FieldDescriptor.LAST_RESERVED_FIELD_NUMBER - + descriptor.FieldDescriptor.FIRST_RESERVED_FIELD_NUMBER + 1) + field_proto.number = f_number + field_proto.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL + field_proto.type = f_type + return file_proto diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/pyext/__init__.py b/myenv/lib/python3.12/site-packages/google/protobuf/pyext/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/pyext/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/pyext/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a762a3ba60557948e85bc53f95869331620fe4e3 GIT binary patch literal 212 zcmZ9GK?=e^3`ILuL4@AHtqU8}tq4MK=}xz$t+9@6XNH+n>`6R>m+%4}!xKn%U72qE zko=$U0(l3)#ACgxW8V9xZ~tnCym@$yHxv7(X9qmBJ<~a;6hQ_Dht|Ok3Dq>R@+2Wb zSCBSftiB>`m6K_SP&KG-P|6fcLl>=9;bI9+63$JM6-kZ`a;D0pMJ_=7rLWU&qhF;Q2e9_AMq3;p!_j`@{>^tm0=eUb{9nsA?!;VK< zWQ!!-$0WG`o&8HQ%|`mkpGw1C*&g&BJ-w%uRk0E@17p}8P@d%iGLV*8t|T2Rbzo?! zG~Kv<{mjpx-``NE$fcoU5IJa?7BY5rh86}AY88z&Fbgz48z&ab7(mxrW&KSsvF5qO zFlw|9u{D%gstaj(26V*Y19UbjsU6RG8Wm}ZAzfbU_qK!nBWn2wg!pt%sXYNftTMXt zxf(M`cdH+Rzg+DDZ}J+;dGy~x@8WeYszHbwwA|OL52tUS@Pq(CV#u(C1o=s8*e?A+ zd-Bc}NYGek(%`u>g>$#ef&J1VWCtv(O0KZ{Uo@s@CG*ugfanY$gQ!!wI}ZdFnsb3r z#D&(#oG2ao2GQaMd2IrpCj%Wdv^R9jU=JwW5FFhZ8Y6^E7)3KC3ntKi%_{Q2k+LI+ zp3Zw%rOZ$+r+L6b<~r+Rmwi?yGs17r6}J+&XMidxi?JI@dYhUu8z~Vb%(4+P5Ntxq z3Sn2~w1QkI5v(W445pR&7*2Jktf<*=ZHHcK|G^g6>fRzz=WMdFA}YcLw@k)>cJpqk z6l$FyRVqq3hy;~x+{A!bNW&BxsY9SO0`!OrL8Y?vNa=&B9V8fR9qMv00o_h%sR~px zV>dut#-d2T^?tUBevw+LAr&|!IB3BRJAkUFl>w@vAC^#+&X}6!ZaI##+^YttA_{fU zm(mHg&8#upe6bvh&NUjqlv8S~E@E3~2+(BG-@Nl+Y=`0z$(xP|v~+!eUSOgLQv&dw^_6sQOf zF+`p>LmuR%#zjo3*V`xwpd}O9E!oM%D6Rp~ZFgQit6rrvS*TZq+Yr-)mR!&(@@14>_HIpK{X{S0(XAtM z3tuO`=Xoz)X?yLHMRMtbpXs4|Y+nA_&E!H@%kBt~ItzLb5INCBDH=_yM2c3#7N6Os)>h z&g?P^^Nylf;P9%?h1ZWC|LDi=@(8+M!H&= 127 or o < 32) +_cescape_byte_to_str = ([r'\%03o' % i for i in range(0, 32)] + + [chr(i) for i in range(32, 127)] + + [r'\%03o' % i for i in range(127, 256)]) +for byte, string in _cescape_chr_to_symbol_map.items(): + _cescape_byte_to_str[byte] = string +del byte, string + + +def CEscape(text, as_utf8) -> str: + """Escape a bytes string for use in an text protocol buffer. + + Args: + text: A byte string to be escaped. + as_utf8: Specifies if result may contain non-ASCII characters. + In Python 3 this allows unescaped non-ASCII Unicode characters. + In Python 2 the return value will be valid UTF-8 rather than only ASCII. + Returns: + Escaped string (str). + """ + # Python's text.encode() 'string_escape' or 'unicode_escape' codecs do not + # satisfy our needs; they encodes unprintable characters using two-digit hex + # escapes whereas our C++ unescaping function allows hex escapes to be any + # length. So, "\0011".encode('string_escape') ends up being "\\x011", which + # will be decoded in C++ as a single-character string with char code 0x11. + text_is_unicode = isinstance(text, str) + if as_utf8 and text_is_unicode: + # We're already unicode, no processing beyond control char escapes. + return text.translate(_cescape_chr_to_symbol_map) + ord_ = ord if text_is_unicode else lambda x: x # bytes iterate as ints. + if as_utf8: + return ''.join(_cescape_unicode_to_str[ord_(c)] for c in text) + return ''.join(_cescape_byte_to_str[ord_(c)] for c in text) + + +_CUNESCAPE_HEX = re.compile(r'(\\+)x([0-9a-fA-F])(?![0-9a-fA-F])') + + +def CUnescape(text: str) -> bytes: + """Unescape a text string with C-style escape sequences to UTF-8 bytes. + + Args: + text: The data to parse in a str. + Returns: + A byte string. + """ + + def ReplaceHex(m): + # Only replace the match if the number of leading back slashes is odd. i.e. + # the slash itself is not escaped. + if len(m.group(1)) & 1: + return m.group(1) + 'x0' + m.group(2) + return m.group(0) + + # This is required because the 'string_escape' encoding doesn't + # allow single-digit hex escapes (like '\xf'). + result = _CUNESCAPE_HEX.sub(ReplaceHex, text) + + return (result.encode('utf-8') # Make it bytes to allow decode. + .decode('unicode_escape') + # Make it bytes again to return the proper type. + .encode('raw_unicode_escape')) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/text_format.py b/myenv/lib/python3.12/site-packages/google/protobuf/text_format.py new file mode 100644 index 0000000..b448f66 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/text_format.py @@ -0,0 +1,1834 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Contains routines for printing protocol messages in text format. + +Simple usage example:: + + # Create a proto object and serialize it to a text proto string. + message = my_proto_pb2.MyMessage(foo='bar') + text_proto = text_format.MessageToString(message) + + # Parse a text proto string. + message = text_format.Parse(text_proto, my_proto_pb2.MyMessage()) +""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +# TODO Import thread contention leads to test failures. +import encodings.raw_unicode_escape # pylint: disable=unused-import +import encodings.unicode_escape # pylint: disable=unused-import +import io +import math +import re + +from google.protobuf.internal import decoder +from google.protobuf.internal import type_checkers +from google.protobuf import descriptor +from google.protobuf import text_encoding +from google.protobuf import unknown_fields + +# pylint: disable=g-import-not-at-top +__all__ = ['MessageToString', 'Parse', 'PrintMessage', 'PrintField', + 'PrintFieldValue', 'Merge', 'MessageToBytes'] + +_INTEGER_CHECKERS = (type_checkers.Uint32ValueChecker(), + type_checkers.Int32ValueChecker(), + type_checkers.Uint64ValueChecker(), + type_checkers.Int64ValueChecker()) +_FLOAT_INFINITY = re.compile('-?inf(?:inity)?f?$', re.IGNORECASE) +_FLOAT_NAN = re.compile('nanf?$', re.IGNORECASE) +_QUOTES = frozenset(("'", '"')) +_ANY_FULL_TYPE_NAME = 'google.protobuf.Any' +_DEBUG_STRING_SILENT_MARKER = '\t ' + + +class Error(Exception): + """Top-level module error for text_format.""" + + +class ParseError(Error): + """Thrown in case of text parsing or tokenizing error.""" + + def __init__(self, message=None, line=None, column=None): + if message is not None and line is not None: + loc = str(line) + if column is not None: + loc += ':{0}'.format(column) + message = '{0} : {1}'.format(loc, message) + if message is not None: + super(ParseError, self).__init__(message) + else: + super(ParseError, self).__init__() + self._line = line + self._column = column + + def GetLine(self): + return self._line + + def GetColumn(self): + return self._column + + +class TextWriter(object): + + def __init__(self, as_utf8): + self._writer = io.StringIO() + + def write(self, val): + return self._writer.write(val) + + def close(self): + return self._writer.close() + + def getvalue(self): + return self._writer.getvalue() + + +def MessageToString( + message, + as_utf8=False, + as_one_line=False, + use_short_repeated_primitives=False, + pointy_brackets=False, + use_index_order=False, + float_format=None, + double_format=None, + use_field_number=False, + descriptor_pool=None, + indent=0, + message_formatter=None, + print_unknown_fields=False, + force_colon=False) -> str: + """Convert protobuf message to text format. + + Double values can be formatted compactly with 15 digits of + precision (which is the most that IEEE 754 "double" can guarantee) + using double_format='.15g'. To ensure that converting to text and back to a + proto will result in an identical value, double_format='.17g' should be used. + + Args: + message: The protocol buffers message. + as_utf8: Return unescaped Unicode for non-ASCII characters. + as_one_line: Don't introduce newlines between fields. + use_short_repeated_primitives: Use short repeated format for primitives. + pointy_brackets: If True, use angle brackets instead of curly braces for + nesting. + use_index_order: If True, fields of a proto message will be printed using + the order defined in source code instead of the field number, extensions + will be printed at the end of the message and their relative order is + determined by the extension number. By default, use the field number + order. + float_format (str): If set, use this to specify float field formatting + (per the "Format Specification Mini-Language"); otherwise, shortest float + that has same value in wire will be printed. Also affect double field + if double_format is not set but float_format is set. + double_format (str): If set, use this to specify double field formatting + (per the "Format Specification Mini-Language"); if it is not set but + float_format is set, use float_format. Otherwise, use ``str()`` + use_field_number: If True, print field numbers instead of names. + descriptor_pool (DescriptorPool): Descriptor pool used to resolve Any types. + indent (int): The initial indent level, in terms of spaces, for pretty + print. + message_formatter (function(message, indent, as_one_line) -> unicode|None): + Custom formatter for selected sub-messages (usually based on message + type). Use to pretty print parts of the protobuf for easier diffing. + print_unknown_fields: If True, unknown fields will be printed. + force_colon: If set, a colon will be added after the field name even if the + field is a proto message. + + Returns: + str: A string of the text formatted protocol buffer message. + """ + out = TextWriter(as_utf8) + printer = _Printer( + out, + indent, + as_utf8, + as_one_line, + use_short_repeated_primitives, + pointy_brackets, + use_index_order, + float_format, + double_format, + use_field_number, + descriptor_pool, + message_formatter, + print_unknown_fields=print_unknown_fields, + force_colon=force_colon) + printer.PrintMessage(message) + result = out.getvalue() + out.close() + if as_one_line: + return result.rstrip() + return result + + +def MessageToBytes(message, **kwargs) -> bytes: + """Convert protobuf message to encoded text format. See MessageToString.""" + text = MessageToString(message, **kwargs) + if isinstance(text, bytes): + return text + codec = 'utf-8' if kwargs.get('as_utf8') else 'ascii' + return text.encode(codec) + + +def _IsMapEntry(field): + return (field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and + field.message_type.has_options and + field.message_type.GetOptions().map_entry) + + +def PrintMessage(message, + out, + indent=0, + as_utf8=False, + as_one_line=False, + use_short_repeated_primitives=False, + pointy_brackets=False, + use_index_order=False, + float_format=None, + double_format=None, + use_field_number=False, + descriptor_pool=None, + message_formatter=None, + print_unknown_fields=False, + force_colon=False): + """Convert the message to text format and write it to the out stream. + + Args: + message: The Message object to convert to text format. + out: A file handle to write the message to. + indent: The initial indent level for pretty print. + as_utf8: Return unescaped Unicode for non-ASCII characters. + as_one_line: Don't introduce newlines between fields. + use_short_repeated_primitives: Use short repeated format for primitives. + pointy_brackets: If True, use angle brackets instead of curly braces for + nesting. + use_index_order: If True, print fields of a proto message using the order + defined in source code instead of the field number. By default, use the + field number order. + float_format: If set, use this to specify float field formatting + (per the "Format Specification Mini-Language"); otherwise, shortest + float that has same value in wire will be printed. Also affect double + field if double_format is not set but float_format is set. + double_format: If set, use this to specify double field formatting + (per the "Format Specification Mini-Language"); if it is not set but + float_format is set, use float_format. Otherwise, str() is used. + use_field_number: If True, print field numbers instead of names. + descriptor_pool: A DescriptorPool used to resolve Any types. + message_formatter: A function(message, indent, as_one_line): unicode|None + to custom format selected sub-messages (usually based on message type). + Use to pretty print parts of the protobuf for easier diffing. + print_unknown_fields: If True, unknown fields will be printed. + force_colon: If set, a colon will be added after the field name even if + the field is a proto message. + """ + printer = _Printer( + out=out, indent=indent, as_utf8=as_utf8, + as_one_line=as_one_line, + use_short_repeated_primitives=use_short_repeated_primitives, + pointy_brackets=pointy_brackets, + use_index_order=use_index_order, + float_format=float_format, + double_format=double_format, + use_field_number=use_field_number, + descriptor_pool=descriptor_pool, + message_formatter=message_formatter, + print_unknown_fields=print_unknown_fields, + force_colon=force_colon) + printer.PrintMessage(message) + + +def PrintField(field, + value, + out, + indent=0, + as_utf8=False, + as_one_line=False, + use_short_repeated_primitives=False, + pointy_brackets=False, + use_index_order=False, + float_format=None, + double_format=None, + message_formatter=None, + print_unknown_fields=False, + force_colon=False): + """Print a single field name/value pair.""" + printer = _Printer(out, indent, as_utf8, as_one_line, + use_short_repeated_primitives, pointy_brackets, + use_index_order, float_format, double_format, + message_formatter=message_formatter, + print_unknown_fields=print_unknown_fields, + force_colon=force_colon) + printer.PrintField(field, value) + + +def PrintFieldValue(field, + value, + out, + indent=0, + as_utf8=False, + as_one_line=False, + use_short_repeated_primitives=False, + pointy_brackets=False, + use_index_order=False, + float_format=None, + double_format=None, + message_formatter=None, + print_unknown_fields=False, + force_colon=False): + """Print a single field value (not including name).""" + printer = _Printer(out, indent, as_utf8, as_one_line, + use_short_repeated_primitives, pointy_brackets, + use_index_order, float_format, double_format, + message_formatter=message_formatter, + print_unknown_fields=print_unknown_fields, + force_colon=force_colon) + printer.PrintFieldValue(field, value) + + +def _BuildMessageFromTypeName(type_name, descriptor_pool): + """Returns a protobuf message instance. + + Args: + type_name: Fully-qualified protobuf message type name string. + descriptor_pool: DescriptorPool instance. + + Returns: + A Message instance of type matching type_name, or None if the a Descriptor + wasn't found matching type_name. + """ + # pylint: disable=g-import-not-at-top + if descriptor_pool is None: + from google.protobuf import descriptor_pool as pool_mod + descriptor_pool = pool_mod.Default() + from google.protobuf import message_factory + try: + message_descriptor = descriptor_pool.FindMessageTypeByName(type_name) + except KeyError: + return None + message_type = message_factory.GetMessageClass(message_descriptor) + return message_type() + + +# These values must match WireType enum in //google/protobuf/wire_format.h. +WIRETYPE_LENGTH_DELIMITED = 2 +WIRETYPE_START_GROUP = 3 + + +class _Printer(object): + """Text format printer for protocol message.""" + + def __init__( + self, + out, + indent=0, + as_utf8=False, + as_one_line=False, + use_short_repeated_primitives=False, + pointy_brackets=False, + use_index_order=False, + float_format=None, + double_format=None, + use_field_number=False, + descriptor_pool=None, + message_formatter=None, + print_unknown_fields=False, + force_colon=False): + """Initialize the Printer. + + Double values can be formatted compactly with 15 digits of precision + (which is the most that IEEE 754 "double" can guarantee) using + double_format='.15g'. To ensure that converting to text and back to a proto + will result in an identical value, double_format='.17g' should be used. + + Args: + out: To record the text format result. + indent: The initial indent level for pretty print. + as_utf8: Return unescaped Unicode for non-ASCII characters. + as_one_line: Don't introduce newlines between fields. + use_short_repeated_primitives: Use short repeated format for primitives. + pointy_brackets: If True, use angle brackets instead of curly braces for + nesting. + use_index_order: If True, print fields of a proto message using the order + defined in source code instead of the field number. By default, use the + field number order. + float_format: If set, use this to specify float field formatting + (per the "Format Specification Mini-Language"); otherwise, shortest + float that has same value in wire will be printed. Also affect double + field if double_format is not set but float_format is set. + double_format: If set, use this to specify double field formatting + (per the "Format Specification Mini-Language"); if it is not set but + float_format is set, use float_format. Otherwise, str() is used. + use_field_number: If True, print field numbers instead of names. + descriptor_pool: A DescriptorPool used to resolve Any types. + message_formatter: A function(message, indent, as_one_line): unicode|None + to custom format selected sub-messages (usually based on message type). + Use to pretty print parts of the protobuf for easier diffing. + print_unknown_fields: If True, unknown fields will be printed. + force_colon: If set, a colon will be added after the field name even if + the field is a proto message. + """ + self.out = out + self.indent = indent + self.as_utf8 = as_utf8 + self.as_one_line = as_one_line + self.use_short_repeated_primitives = use_short_repeated_primitives + self.pointy_brackets = pointy_brackets + self.use_index_order = use_index_order + self.float_format = float_format + if double_format is not None: + self.double_format = double_format + else: + self.double_format = float_format + self.use_field_number = use_field_number + self.descriptor_pool = descriptor_pool + self.message_formatter = message_formatter + self.print_unknown_fields = print_unknown_fields + self.force_colon = force_colon + + def _TryPrintAsAnyMessage(self, message): + """Serializes if message is a google.protobuf.Any field.""" + if '/' not in message.type_url: + return False + packed_message = _BuildMessageFromTypeName(message.TypeName(), + self.descriptor_pool) + if packed_message: + packed_message.MergeFromString(message.value) + colon = ':' if self.force_colon else '' + self.out.write('%s[%s]%s ' % (self.indent * ' ', message.type_url, colon)) + self._PrintMessageFieldValue(packed_message) + self.out.write(' ' if self.as_one_line else '\n') + return True + else: + return False + + def _TryCustomFormatMessage(self, message): + formatted = self.message_formatter(message, self.indent, self.as_one_line) + if formatted is None: + return False + + out = self.out + out.write(' ' * self.indent) + out.write(formatted) + out.write(' ' if self.as_one_line else '\n') + return True + + def PrintMessage(self, message): + """Convert protobuf message to text format. + + Args: + message: The protocol buffers message. + """ + if self.message_formatter and self._TryCustomFormatMessage(message): + return + if (message.DESCRIPTOR.full_name == _ANY_FULL_TYPE_NAME and + self._TryPrintAsAnyMessage(message)): + return + fields = message.ListFields() + if self.use_index_order: + fields.sort( + key=lambda x: x[0].number if x[0].is_extension else x[0].index) + for field, value in fields: + if _IsMapEntry(field): + for key in sorted(value): + # This is slow for maps with submessage entries because it copies the + # entire tree. Unfortunately this would take significant refactoring + # of this file to work around. + # + # TODO: refactor and optimize if this becomes an issue. + entry_submsg = value.GetEntryClass()(key=key, value=value[key]) + self.PrintField(field, entry_submsg) + elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if (self.use_short_repeated_primitives + and field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE + and field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_STRING): + self._PrintShortRepeatedPrimitivesValue(field, value) + else: + for element in value: + self.PrintField(field, element) + else: + self.PrintField(field, value) + + if self.print_unknown_fields: + self._PrintUnknownFields(unknown_fields.UnknownFieldSet(message)) + + def _PrintUnknownFields(self, unknown_field_set): + """Print unknown fields.""" + out = self.out + for field in unknown_field_set: + out.write(' ' * self.indent) + out.write(str(field.field_number)) + if field.wire_type == WIRETYPE_START_GROUP: + if self.as_one_line: + out.write(' { ') + else: + out.write(' {\n') + self.indent += 2 + + self._PrintUnknownFields(field.data) + + if self.as_one_line: + out.write('} ') + else: + self.indent -= 2 + out.write(' ' * self.indent + '}\n') + elif field.wire_type == WIRETYPE_LENGTH_DELIMITED: + try: + # If this field is parseable as a Message, it is probably + # an embedded message. + # pylint: disable=protected-access + (embedded_unknown_message, pos) = decoder._DecodeUnknownFieldSet( + memoryview(field.data), 0, len(field.data)) + except Exception: # pylint: disable=broad-except + pos = 0 + + if pos == len(field.data): + if self.as_one_line: + out.write(' { ') + else: + out.write(' {\n') + self.indent += 2 + + self._PrintUnknownFields(embedded_unknown_message) + + if self.as_one_line: + out.write('} ') + else: + self.indent -= 2 + out.write(' ' * self.indent + '}\n') + else: + # A string or bytes field. self.as_utf8 may not work. + out.write(': \"') + out.write(text_encoding.CEscape(field.data, False)) + out.write('\" ' if self.as_one_line else '\"\n') + else: + # varint, fixed32, fixed64 + out.write(': ') + out.write(str(field.data)) + out.write(' ' if self.as_one_line else '\n') + + def _PrintFieldName(self, field): + """Print field name.""" + out = self.out + out.write(' ' * self.indent) + if self.use_field_number: + out.write(str(field.number)) + else: + if field.is_extension: + out.write('[') + if (field.containing_type.GetOptions().message_set_wire_format and + field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and + field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL): + out.write(field.message_type.full_name) + else: + out.write(field.full_name) + out.write(']') + elif field.type == descriptor.FieldDescriptor.TYPE_GROUP: + # For groups, use the capitalized name. + out.write(field.message_type.name) + else: + out.write(field.name) + + if (self.force_colon or + field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE): + # The colon is optional in this case, but our cross-language golden files + # don't include it. Here, the colon is only included if force_colon is + # set to True + out.write(':') + + def PrintField(self, field, value): + """Print a single field name/value pair.""" + self._PrintFieldName(field) + self.out.write(' ') + self.PrintFieldValue(field, value) + self.out.write(' ' if self.as_one_line else '\n') + + def _PrintShortRepeatedPrimitivesValue(self, field, value): + """"Prints short repeated primitives value.""" + # Note: this is called only when value has at least one element. + self._PrintFieldName(field) + self.out.write(' [') + for i in range(len(value) - 1): + self.PrintFieldValue(field, value[i]) + self.out.write(', ') + self.PrintFieldValue(field, value[-1]) + self.out.write(']') + self.out.write(' ' if self.as_one_line else '\n') + + def _PrintMessageFieldValue(self, value): + if self.pointy_brackets: + openb = '<' + closeb = '>' + else: + openb = '{' + closeb = '}' + + if self.as_one_line: + self.out.write('%s ' % openb) + self.PrintMessage(value) + self.out.write(closeb) + else: + self.out.write('%s\n' % openb) + self.indent += 2 + self.PrintMessage(value) + self.indent -= 2 + self.out.write(' ' * self.indent + closeb) + + def PrintFieldValue(self, field, value): + """Print a single field value (not including name). + + For repeated fields, the value should be a single element. + + Args: + field: The descriptor of the field to be printed. + value: The value of the field. + """ + out = self.out + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + self._PrintMessageFieldValue(value) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: + enum_value = field.enum_type.values_by_number.get(value, None) + if enum_value is not None: + out.write(enum_value.name) + else: + out.write(str(value)) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING: + out.write('\"') + if isinstance(value, str) and not self.as_utf8: + out_value = value.encode('utf-8') + else: + out_value = value + if field.type == descriptor.FieldDescriptor.TYPE_BYTES: + # We always need to escape all binary data in TYPE_BYTES fields. + out_as_utf8 = False + else: + out_as_utf8 = self.as_utf8 + out.write(text_encoding.CEscape(out_value, out_as_utf8)) + out.write('\"') + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL: + if value: + out.write('true') + else: + out.write('false') + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_FLOAT: + if self.float_format is not None: + out.write('{1:{0}}'.format(self.float_format, value)) + else: + if math.isnan(value): + out.write(str(value)) + else: + out.write(str(type_checkers.ToShortestFloat(value))) + elif (field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_DOUBLE and + self.double_format is not None): + out.write('{1:{0}}'.format(self.double_format, value)) + else: + out.write(str(value)) + + +def Parse(text, + message, + allow_unknown_extension=False, + allow_field_number=False, + descriptor_pool=None, + allow_unknown_field=False): + """Parses a text representation of a protocol message into a message. + + NOTE: for historical reasons this function does not clear the input + message. This is different from what the binary msg.ParseFrom(...) does. + If text contains a field already set in message, the value is appended if the + field is repeated. Otherwise, an error is raised. + + Example:: + + a = MyProto() + a.repeated_field.append('test') + b = MyProto() + + # Repeated fields are combined + text_format.Parse(repr(a), b) + text_format.Parse(repr(a), b) # repeated_field contains ["test", "test"] + + # Non-repeated fields cannot be overwritten + a.singular_field = 1 + b.singular_field = 2 + text_format.Parse(repr(a), b) # ParseError + + # Binary version: + b.ParseFromString(a.SerializeToString()) # repeated_field is now "test" + + Caller is responsible for clearing the message as needed. + + Args: + text (str): Message text representation. + message (Message): A protocol buffer message to merge into. + allow_unknown_extension: if True, skip over missing extensions and keep + parsing + allow_field_number: if True, both field number and field name are allowed. + descriptor_pool (DescriptorPool): Descriptor pool used to resolve Any types. + allow_unknown_field: if True, skip over unknown field and keep + parsing. Avoid to use this option if possible. It may hide some + errors (e.g. spelling error on field name) + + Returns: + Message: The same message passed as argument. + + Raises: + ParseError: On text parsing problems. + """ + return ParseLines(text.split(b'\n' if isinstance(text, bytes) else u'\n'), + message, + allow_unknown_extension, + allow_field_number, + descriptor_pool=descriptor_pool, + allow_unknown_field=allow_unknown_field) + + +def Merge(text, + message, + allow_unknown_extension=False, + allow_field_number=False, + descriptor_pool=None, + allow_unknown_field=False): + """Parses a text representation of a protocol message into a message. + + Like Parse(), but allows repeated values for a non-repeated field, and uses + the last one. This means any non-repeated, top-level fields specified in text + replace those in the message. + + Args: + text (str): Message text representation. + message (Message): A protocol buffer message to merge into. + allow_unknown_extension: if True, skip over missing extensions and keep + parsing + allow_field_number: if True, both field number and field name are allowed. + descriptor_pool (DescriptorPool): Descriptor pool used to resolve Any types. + allow_unknown_field: if True, skip over unknown field and keep + parsing. Avoid to use this option if possible. It may hide some + errors (e.g. spelling error on field name) + + Returns: + Message: The same message passed as argument. + + Raises: + ParseError: On text parsing problems. + """ + return MergeLines( + text.split(b'\n' if isinstance(text, bytes) else u'\n'), + message, + allow_unknown_extension, + allow_field_number, + descriptor_pool=descriptor_pool, + allow_unknown_field=allow_unknown_field) + + +def ParseLines(lines, + message, + allow_unknown_extension=False, + allow_field_number=False, + descriptor_pool=None, + allow_unknown_field=False): + """Parses a text representation of a protocol message into a message. + + See Parse() for caveats. + + Args: + lines: An iterable of lines of a message's text representation. + message: A protocol buffer message to merge into. + allow_unknown_extension: if True, skip over missing extensions and keep + parsing + allow_field_number: if True, both field number and field name are allowed. + descriptor_pool: A DescriptorPool used to resolve Any types. + allow_unknown_field: if True, skip over unknown field and keep + parsing. Avoid to use this option if possible. It may hide some + errors (e.g. spelling error on field name) + + Returns: + The same message passed as argument. + + Raises: + ParseError: On text parsing problems. + """ + parser = _Parser(allow_unknown_extension, + allow_field_number, + descriptor_pool=descriptor_pool, + allow_unknown_field=allow_unknown_field) + return parser.ParseLines(lines, message) + + +def MergeLines(lines, + message, + allow_unknown_extension=False, + allow_field_number=False, + descriptor_pool=None, + allow_unknown_field=False): + """Parses a text representation of a protocol message into a message. + + See Merge() for more details. + + Args: + lines: An iterable of lines of a message's text representation. + message: A protocol buffer message to merge into. + allow_unknown_extension: if True, skip over missing extensions and keep + parsing + allow_field_number: if True, both field number and field name are allowed. + descriptor_pool: A DescriptorPool used to resolve Any types. + allow_unknown_field: if True, skip over unknown field and keep + parsing. Avoid to use this option if possible. It may hide some + errors (e.g. spelling error on field name) + + Returns: + The same message passed as argument. + + Raises: + ParseError: On text parsing problems. + """ + parser = _Parser(allow_unknown_extension, + allow_field_number, + descriptor_pool=descriptor_pool, + allow_unknown_field=allow_unknown_field) + return parser.MergeLines(lines, message) + + +class _Parser(object): + """Text format parser for protocol message.""" + + def __init__(self, + allow_unknown_extension=False, + allow_field_number=False, + descriptor_pool=None, + allow_unknown_field=False): + self.allow_unknown_extension = allow_unknown_extension + self.allow_field_number = allow_field_number + self.descriptor_pool = descriptor_pool + self.allow_unknown_field = allow_unknown_field + + def ParseLines(self, lines, message): + """Parses a text representation of a protocol message into a message.""" + self._allow_multiple_scalars = False + self._ParseOrMerge(lines, message) + return message + + def MergeLines(self, lines, message): + """Merges a text representation of a protocol message into a message.""" + self._allow_multiple_scalars = True + self._ParseOrMerge(lines, message) + return message + + def _ParseOrMerge(self, lines, message): + """Converts a text representation of a protocol message into a message. + + Args: + lines: Lines of a message's text representation. + message: A protocol buffer message to merge into. + + Raises: + ParseError: On text parsing problems. + """ + # Tokenize expects native str lines. + try: + str_lines = ( + line if isinstance(line, str) else line.decode('utf-8') + for line in lines) + tokenizer = Tokenizer(str_lines) + except UnicodeDecodeError as e: + raise ParseError from e + if message: + self.root_type = message.DESCRIPTOR.full_name + while not tokenizer.AtEnd(): + self._MergeField(tokenizer, message) + + def _MergeField(self, tokenizer, message): + """Merges a single protocol message field into a message. + + Args: + tokenizer: A tokenizer to parse the field name and values. + message: A protocol message to record the data. + + Raises: + ParseError: In case of text parsing problems. + """ + message_descriptor = message.DESCRIPTOR + if (message_descriptor.full_name == _ANY_FULL_TYPE_NAME and + tokenizer.TryConsume('[')): + type_url_prefix, packed_type_name = self._ConsumeAnyTypeUrl(tokenizer) + tokenizer.Consume(']') + tokenizer.TryConsume(':') + self._DetectSilentMarker(tokenizer, message_descriptor.full_name, + type_url_prefix + '/' + packed_type_name) + if tokenizer.TryConsume('<'): + expanded_any_end_token = '>' + else: + tokenizer.Consume('{') + expanded_any_end_token = '}' + expanded_any_sub_message = _BuildMessageFromTypeName(packed_type_name, + self.descriptor_pool) + # Direct comparison with None is used instead of implicit bool conversion + # to avoid false positives with falsy initial values, e.g. for + # google.protobuf.ListValue. + if expanded_any_sub_message is None: + raise ParseError('Type %s not found in descriptor pool' % + packed_type_name) + while not tokenizer.TryConsume(expanded_any_end_token): + if tokenizer.AtEnd(): + raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % + (expanded_any_end_token,)) + self._MergeField(tokenizer, expanded_any_sub_message) + deterministic = False + + message.Pack(expanded_any_sub_message, + type_url_prefix=type_url_prefix, + deterministic=deterministic) + return + + if tokenizer.TryConsume('['): + name = [tokenizer.ConsumeIdentifier()] + while tokenizer.TryConsume('.'): + name.append(tokenizer.ConsumeIdentifier()) + name = '.'.join(name) + + if not message_descriptor.is_extendable: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" does not have extensions.' % + message_descriptor.full_name) + # pylint: disable=protected-access + field = message.Extensions._FindExtensionByName(name) + # pylint: enable=protected-access + if not field: + if self.allow_unknown_extension: + field = None + else: + raise tokenizer.ParseErrorPreviousToken( + 'Extension "%s" not registered. ' + 'Did you import the _pb2 module which defines it? ' + 'If you are trying to place the extension in the MessageSet ' + 'field of another message that is in an Any or MessageSet field, ' + 'that message\'s _pb2 module must be imported as well' % name) + elif message_descriptor != field.containing_type: + raise tokenizer.ParseErrorPreviousToken( + 'Extension "%s" does not extend message type "%s".' % + (name, message_descriptor.full_name)) + + tokenizer.Consume(']') + + else: + name = tokenizer.ConsumeIdentifierOrNumber() + if self.allow_field_number and name.isdigit(): + number = ParseInteger(name, True, True) + field = message_descriptor.fields_by_number.get(number, None) + if not field and message_descriptor.is_extendable: + field = message.Extensions._FindExtensionByNumber(number) + else: + field = message_descriptor.fields_by_name.get(name, None) + + # Group names are expected to be capitalized as they appear in the + # .proto file, which actually matches their type names, not their field + # names. + if not field: + field = message_descriptor.fields_by_name.get(name.lower(), None) + if field and field.type != descriptor.FieldDescriptor.TYPE_GROUP: + field = None + + if (field and field.type == descriptor.FieldDescriptor.TYPE_GROUP and + field.message_type.name != name): + field = None + + if not field and not self.allow_unknown_field: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" has no field named "%s".' % + (message_descriptor.full_name, name)) + + if field: + if not self._allow_multiple_scalars and field.containing_oneof: + # Check if there's a different field set in this oneof. + # Note that we ignore the case if the same field was set before, and we + # apply _allow_multiple_scalars to non-scalar fields as well. + which_oneof = message.WhichOneof(field.containing_oneof.name) + if which_oneof is not None and which_oneof != field.name: + raise tokenizer.ParseErrorPreviousToken( + 'Field "%s" is specified along with field "%s", another member ' + 'of oneof "%s" for message type "%s".' % + (field.name, which_oneof, field.containing_oneof.name, + message_descriptor.full_name)) + + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + tokenizer.TryConsume(':') + self._DetectSilentMarker(tokenizer, message_descriptor.full_name, + field.full_name) + merger = self._MergeMessageField + else: + tokenizer.Consume(':') + self._DetectSilentMarker(tokenizer, message_descriptor.full_name, + field.full_name) + merger = self._MergeScalarField + + if (field.label == descriptor.FieldDescriptor.LABEL_REPEATED and + tokenizer.TryConsume('[')): + # Short repeated format, e.g. "foo: [1, 2, 3]" + if not tokenizer.TryConsume(']'): + while True: + merger(tokenizer, message, field) + if tokenizer.TryConsume(']'): + break + tokenizer.Consume(',') + + else: + merger(tokenizer, message, field) + + else: # Proto field is unknown. + assert (self.allow_unknown_extension or self.allow_unknown_field) + self._SkipFieldContents(tokenizer, name, message_descriptor.full_name) + + # For historical reasons, fields may optionally be separated by commas or + # semicolons. + if not tokenizer.TryConsume(','): + tokenizer.TryConsume(';') + + def _LogSilentMarker(self, immediate_message_type, field_name): + pass + + def _DetectSilentMarker(self, tokenizer, immediate_message_type, field_name): + if tokenizer.contains_silent_marker_before_current_token: + self._LogSilentMarker(immediate_message_type, field_name) + + def _ConsumeAnyTypeUrl(self, tokenizer): + """Consumes a google.protobuf.Any type URL and returns the type name.""" + # Consume "type.googleapis.com/". + prefix = [tokenizer.ConsumeIdentifier()] + tokenizer.Consume('.') + prefix.append(tokenizer.ConsumeIdentifier()) + tokenizer.Consume('.') + prefix.append(tokenizer.ConsumeIdentifier()) + tokenizer.Consume('/') + # Consume the fully-qualified type name. + name = [tokenizer.ConsumeIdentifier()] + while tokenizer.TryConsume('.'): + name.append(tokenizer.ConsumeIdentifier()) + return '.'.join(prefix), '.'.join(name) + + def _MergeMessageField(self, tokenizer, message, field): + """Merges a single scalar field into a message. + + Args: + tokenizer: A tokenizer to parse the field value. + message: The message of which field is a member. + field: The descriptor of the field to be merged. + + Raises: + ParseError: In case of text parsing problems. + """ + is_map_entry = _IsMapEntry(field) + + if tokenizer.TryConsume('<'): + end_token = '>' + else: + tokenizer.Consume('{') + end_token = '}' + + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if field.is_extension: + sub_message = message.Extensions[field].add() + elif is_map_entry: + sub_message = getattr(message, field.name).GetEntryClass()() + else: + sub_message = getattr(message, field.name).add() + else: + if field.is_extension: + if (not self._allow_multiple_scalars and + message.HasExtension(field)): + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" should not have multiple "%s" extensions.' % + (message.DESCRIPTOR.full_name, field.full_name)) + sub_message = message.Extensions[field] + else: + # Also apply _allow_multiple_scalars to message field. + # TODO: Change to _allow_singular_overwrites. + if (not self._allow_multiple_scalars and + message.HasField(field.name)): + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" should not have multiple "%s" fields.' % + (message.DESCRIPTOR.full_name, field.name)) + sub_message = getattr(message, field.name) + sub_message.SetInParent() + + while not tokenizer.TryConsume(end_token): + if tokenizer.AtEnd(): + raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % (end_token,)) + self._MergeField(tokenizer, sub_message) + + if is_map_entry: + value_cpptype = field.message_type.fields_by_name['value'].cpp_type + if value_cpptype == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + value = getattr(message, field.name)[sub_message.key] + value.CopyFrom(sub_message.value) + else: + getattr(message, field.name)[sub_message.key] = sub_message.value + + def _MergeScalarField(self, tokenizer, message, field): + """Merges a single scalar field into a message. + + Args: + tokenizer: A tokenizer to parse the field value. + message: A protocol message to record the data. + field: The descriptor of the field to be merged. + + Raises: + ParseError: In case of text parsing problems. + RuntimeError: On runtime errors. + """ + _ = self.allow_unknown_extension + value = None + + if field.type in (descriptor.FieldDescriptor.TYPE_INT32, + descriptor.FieldDescriptor.TYPE_SINT32, + descriptor.FieldDescriptor.TYPE_SFIXED32): + value = _ConsumeInt32(tokenizer) + elif field.type in (descriptor.FieldDescriptor.TYPE_INT64, + descriptor.FieldDescriptor.TYPE_SINT64, + descriptor.FieldDescriptor.TYPE_SFIXED64): + value = _ConsumeInt64(tokenizer) + elif field.type in (descriptor.FieldDescriptor.TYPE_UINT32, + descriptor.FieldDescriptor.TYPE_FIXED32): + value = _ConsumeUint32(tokenizer) + elif field.type in (descriptor.FieldDescriptor.TYPE_UINT64, + descriptor.FieldDescriptor.TYPE_FIXED64): + value = _ConsumeUint64(tokenizer) + elif field.type in (descriptor.FieldDescriptor.TYPE_FLOAT, + descriptor.FieldDescriptor.TYPE_DOUBLE): + value = tokenizer.ConsumeFloat() + elif field.type == descriptor.FieldDescriptor.TYPE_BOOL: + value = tokenizer.ConsumeBool() + elif field.type == descriptor.FieldDescriptor.TYPE_STRING: + value = tokenizer.ConsumeString() + elif field.type == descriptor.FieldDescriptor.TYPE_BYTES: + value = tokenizer.ConsumeByteString() + elif field.type == descriptor.FieldDescriptor.TYPE_ENUM: + value = tokenizer.ConsumeEnum(field) + else: + raise RuntimeError('Unknown field type %d' % field.type) + + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if field.is_extension: + message.Extensions[field].append(value) + else: + getattr(message, field.name).append(value) + else: + if field.is_extension: + if (not self._allow_multiple_scalars and + field.has_presence and + message.HasExtension(field)): + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" should not have multiple "%s" extensions.' % + (message.DESCRIPTOR.full_name, field.full_name)) + else: + message.Extensions[field] = value + else: + duplicate_error = False + if not self._allow_multiple_scalars: + if field.has_presence: + duplicate_error = message.HasField(field.name) + else: + # For field that doesn't represent presence, try best effort to + # check multiple scalars by compare to default values. + duplicate_error = bool(getattr(message, field.name)) + + if duplicate_error: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" should not have multiple "%s" fields.' % + (message.DESCRIPTOR.full_name, field.name)) + else: + setattr(message, field.name, value) + + def _SkipFieldContents(self, tokenizer, field_name, immediate_message_type): + """Skips over contents (value or message) of a field. + + Args: + tokenizer: A tokenizer to parse the field name and values. + field_name: The field name currently being parsed. + immediate_message_type: The type of the message immediately containing + the silent marker. + """ + # Try to guess the type of this field. + # If this field is not a message, there should be a ":" between the + # field name and the field value and also the field value should not + # start with "{" or "<" which indicates the beginning of a message body. + # If there is no ":" or there is a "{" or "<" after ":", this field has + # to be a message or the input is ill-formed. + if tokenizer.TryConsume( + ':') and not tokenizer.LookingAt('{') and not tokenizer.LookingAt('<'): + self._DetectSilentMarker(tokenizer, immediate_message_type, field_name) + if tokenizer.LookingAt('['): + self._SkipRepeatedFieldValue(tokenizer) + else: + self._SkipFieldValue(tokenizer) + else: + self._DetectSilentMarker(tokenizer, immediate_message_type, field_name) + self._SkipFieldMessage(tokenizer, immediate_message_type) + + def _SkipField(self, tokenizer, immediate_message_type): + """Skips over a complete field (name and value/message). + + Args: + tokenizer: A tokenizer to parse the field name and values. + immediate_message_type: The type of the message immediately containing + the silent marker. + """ + field_name = '' + if tokenizer.TryConsume('['): + # Consume extension or google.protobuf.Any type URL + field_name += '[' + tokenizer.ConsumeIdentifier() + num_identifiers = 1 + while tokenizer.TryConsume('.'): + field_name += '.' + tokenizer.ConsumeIdentifier() + num_identifiers += 1 + # This is possibly a type URL for an Any message. + if num_identifiers == 3 and tokenizer.TryConsume('/'): + field_name += '/' + tokenizer.ConsumeIdentifier() + while tokenizer.TryConsume('.'): + field_name += '.' + tokenizer.ConsumeIdentifier() + tokenizer.Consume(']') + field_name += ']' + else: + field_name += tokenizer.ConsumeIdentifierOrNumber() + + self._SkipFieldContents(tokenizer, field_name, immediate_message_type) + + # For historical reasons, fields may optionally be separated by commas or + # semicolons. + if not tokenizer.TryConsume(','): + tokenizer.TryConsume(';') + + def _SkipFieldMessage(self, tokenizer, immediate_message_type): + """Skips over a field message. + + Args: + tokenizer: A tokenizer to parse the field name and values. + immediate_message_type: The type of the message immediately containing + the silent marker + """ + if tokenizer.TryConsume('<'): + delimiter = '>' + else: + tokenizer.Consume('{') + delimiter = '}' + + while not tokenizer.LookingAt('>') and not tokenizer.LookingAt('}'): + self._SkipField(tokenizer, immediate_message_type) + + tokenizer.Consume(delimiter) + + def _SkipFieldValue(self, tokenizer): + """Skips over a field value. + + Args: + tokenizer: A tokenizer to parse the field name and values. + + Raises: + ParseError: In case an invalid field value is found. + """ + if (not tokenizer.TryConsumeByteString()and + not tokenizer.TryConsumeIdentifier() and + not _TryConsumeInt64(tokenizer) and + not _TryConsumeUint64(tokenizer) and + not tokenizer.TryConsumeFloat()): + raise ParseError('Invalid field value: ' + tokenizer.token) + + def _SkipRepeatedFieldValue(self, tokenizer): + """Skips over a repeated field value. + + Args: + tokenizer: A tokenizer to parse the field value. + """ + tokenizer.Consume('[') + if not tokenizer.LookingAt(']'): + self._SkipFieldValue(tokenizer) + while tokenizer.TryConsume(','): + self._SkipFieldValue(tokenizer) + tokenizer.Consume(']') + + +class Tokenizer(object): + """Protocol buffer text representation tokenizer. + + This class handles the lower level string parsing by splitting it into + meaningful tokens. + + It was directly ported from the Java protocol buffer API. + """ + + _WHITESPACE = re.compile(r'\s+') + _COMMENT = re.compile(r'(\s*#.*$)', re.MULTILINE) + _WHITESPACE_OR_COMMENT = re.compile(r'(\s|(#.*$))+', re.MULTILINE) + _TOKEN = re.compile('|'.join([ + r'[a-zA-Z_][0-9a-zA-Z_+-]*', # an identifier + r'([0-9+-]|(\.[0-9]))[0-9a-zA-Z_.+-]*', # a number + ] + [ # quoted str for each quote mark + # Avoid backtracking! https://stackoverflow.com/a/844267 + r'{qt}[^{qt}\n\\]*((\\.)+[^{qt}\n\\]*)*({qt}|\\?$)'.format(qt=mark) + for mark in _QUOTES + ])) + + _IDENTIFIER = re.compile(r'[^\d\W]\w*') + _IDENTIFIER_OR_NUMBER = re.compile(r'\w+') + + def __init__(self, lines, skip_comments=True): + self._position = 0 + self._line = -1 + self._column = 0 + self._token_start = None + self.token = '' + self._lines = iter(lines) + self._current_line = '' + self._previous_line = 0 + self._previous_column = 0 + self._more_lines = True + self._skip_comments = skip_comments + self._whitespace_pattern = (skip_comments and self._WHITESPACE_OR_COMMENT + or self._WHITESPACE) + self.contains_silent_marker_before_current_token = False + + self._SkipWhitespace() + self.NextToken() + + def LookingAt(self, token): + return self.token == token + + def AtEnd(self): + """Checks the end of the text was reached. + + Returns: + True iff the end was reached. + """ + return not self.token + + def _PopLine(self): + while len(self._current_line) <= self._column: + try: + self._current_line = next(self._lines) + except StopIteration: + self._current_line = '' + self._more_lines = False + return + else: + self._line += 1 + self._column = 0 + + def _SkipWhitespace(self): + while True: + self._PopLine() + match = self._whitespace_pattern.match(self._current_line, self._column) + if not match: + break + self.contains_silent_marker_before_current_token = match.group(0) == ( + ' ' + _DEBUG_STRING_SILENT_MARKER) + length = len(match.group(0)) + self._column += length + + def TryConsume(self, token): + """Tries to consume a given piece of text. + + Args: + token: Text to consume. + + Returns: + True iff the text was consumed. + """ + if self.token == token: + self.NextToken() + return True + return False + + def Consume(self, token): + """Consumes a piece of text. + + Args: + token: Text to consume. + + Raises: + ParseError: If the text couldn't be consumed. + """ + if not self.TryConsume(token): + raise self.ParseError('Expected "%s".' % token) + + def ConsumeComment(self): + result = self.token + if not self._COMMENT.match(result): + raise self.ParseError('Expected comment.') + self.NextToken() + return result + + def ConsumeCommentOrTrailingComment(self): + """Consumes a comment, returns a 2-tuple (trailing bool, comment str).""" + + # Tokenizer initializes _previous_line and _previous_column to 0. As the + # tokenizer starts, it looks like there is a previous token on the line. + just_started = self._line == 0 and self._column == 0 + + before_parsing = self._previous_line + comment = self.ConsumeComment() + + # A trailing comment is a comment on the same line than the previous token. + trailing = (self._previous_line == before_parsing + and not just_started) + + return trailing, comment + + def TryConsumeIdentifier(self): + try: + self.ConsumeIdentifier() + return True + except ParseError: + return False + + def ConsumeIdentifier(self): + """Consumes protocol message field identifier. + + Returns: + Identifier string. + + Raises: + ParseError: If an identifier couldn't be consumed. + """ + result = self.token + if not self._IDENTIFIER.match(result): + raise self.ParseError('Expected identifier.') + self.NextToken() + return result + + def TryConsumeIdentifierOrNumber(self): + try: + self.ConsumeIdentifierOrNumber() + return True + except ParseError: + return False + + def ConsumeIdentifierOrNumber(self): + """Consumes protocol message field identifier. + + Returns: + Identifier string. + + Raises: + ParseError: If an identifier couldn't be consumed. + """ + result = self.token + if not self._IDENTIFIER_OR_NUMBER.match(result): + raise self.ParseError('Expected identifier or number, got %s.' % result) + self.NextToken() + return result + + def TryConsumeInteger(self): + try: + self.ConsumeInteger() + return True + except ParseError: + return False + + def ConsumeInteger(self): + """Consumes an integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an integer couldn't be consumed. + """ + try: + result = _ParseAbstractInteger(self.token) + except ValueError as e: + raise self.ParseError(str(e)) + self.NextToken() + return result + + def TryConsumeFloat(self): + try: + self.ConsumeFloat() + return True + except ParseError: + return False + + def ConsumeFloat(self): + """Consumes an floating point number. + + Returns: + The number parsed. + + Raises: + ParseError: If a floating point number couldn't be consumed. + """ + try: + result = ParseFloat(self.token) + except ValueError as e: + raise self.ParseError(str(e)) + self.NextToken() + return result + + def ConsumeBool(self): + """Consumes a boolean value. + + Returns: + The bool parsed. + + Raises: + ParseError: If a boolean value couldn't be consumed. + """ + try: + result = ParseBool(self.token) + except ValueError as e: + raise self.ParseError(str(e)) + self.NextToken() + return result + + def TryConsumeByteString(self): + try: + self.ConsumeByteString() + return True + except ParseError: + return False + + def ConsumeString(self): + """Consumes a string value. + + Returns: + The string parsed. + + Raises: + ParseError: If a string value couldn't be consumed. + """ + the_bytes = self.ConsumeByteString() + try: + return str(the_bytes, 'utf-8') + except UnicodeDecodeError as e: + raise self._StringParseError(e) + + def ConsumeByteString(self): + """Consumes a byte array value. + + Returns: + The array parsed (as a string). + + Raises: + ParseError: If a byte array value couldn't be consumed. + """ + the_list = [self._ConsumeSingleByteString()] + while self.token and self.token[0] in _QUOTES: + the_list.append(self._ConsumeSingleByteString()) + return b''.join(the_list) + + def _ConsumeSingleByteString(self): + """Consume one token of a string literal. + + String literals (whether bytes or text) can come in multiple adjacent + tokens which are automatically concatenated, like in C or Python. This + method only consumes one token. + + Returns: + The token parsed. + Raises: + ParseError: When the wrong format data is found. + """ + text = self.token + if len(text) < 1 or text[0] not in _QUOTES: + raise self.ParseError('Expected string but found: %r' % (text,)) + + if len(text) < 2 or text[-1] != text[0]: + raise self.ParseError('String missing ending quote: %r' % (text,)) + + try: + result = text_encoding.CUnescape(text[1:-1]) + except ValueError as e: + raise self.ParseError(str(e)) + self.NextToken() + return result + + def ConsumeEnum(self, field): + try: + result = ParseEnum(field, self.token) + except ValueError as e: + raise self.ParseError(str(e)) + self.NextToken() + return result + + def ParseErrorPreviousToken(self, message): + """Creates and *returns* a ParseError for the previously read token. + + Args: + message: A message to set for the exception. + + Returns: + A ParseError instance. + """ + return ParseError(message, self._previous_line + 1, + self._previous_column + 1) + + def ParseError(self, message): + """Creates and *returns* a ParseError for the current token.""" + return ParseError('\'' + self._current_line + '\': ' + message, + self._line + 1, self._column + 1) + + def _StringParseError(self, e): + return self.ParseError('Couldn\'t parse string: ' + str(e)) + + def NextToken(self): + """Reads the next meaningful token.""" + self._previous_line = self._line + self._previous_column = self._column + self.contains_silent_marker_before_current_token = False + + self._column += len(self.token) + self._SkipWhitespace() + + if not self._more_lines: + self.token = '' + return + + match = self._TOKEN.match(self._current_line, self._column) + if not match and not self._skip_comments: + match = self._COMMENT.match(self._current_line, self._column) + if match: + token = match.group(0) + self.token = token + else: + self.token = self._current_line[self._column] + +# Aliased so it can still be accessed by current visibility violators. +# TODO: Migrate violators to textformat_tokenizer. +_Tokenizer = Tokenizer # pylint: disable=invalid-name + + +def _ConsumeInt32(tokenizer): + """Consumes a signed 32bit integer number from tokenizer. + + Args: + tokenizer: A tokenizer used to parse the number. + + Returns: + The integer parsed. + + Raises: + ParseError: If a signed 32bit integer couldn't be consumed. + """ + return _ConsumeInteger(tokenizer, is_signed=True, is_long=False) + + +def _ConsumeUint32(tokenizer): + """Consumes an unsigned 32bit integer number from tokenizer. + + Args: + tokenizer: A tokenizer used to parse the number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an unsigned 32bit integer couldn't be consumed. + """ + return _ConsumeInteger(tokenizer, is_signed=False, is_long=False) + + +def _TryConsumeInt64(tokenizer): + try: + _ConsumeInt64(tokenizer) + return True + except ParseError: + return False + + +def _ConsumeInt64(tokenizer): + """Consumes a signed 32bit integer number from tokenizer. + + Args: + tokenizer: A tokenizer used to parse the number. + + Returns: + The integer parsed. + + Raises: + ParseError: If a signed 32bit integer couldn't be consumed. + """ + return _ConsumeInteger(tokenizer, is_signed=True, is_long=True) + + +def _TryConsumeUint64(tokenizer): + try: + _ConsumeUint64(tokenizer) + return True + except ParseError: + return False + + +def _ConsumeUint64(tokenizer): + """Consumes an unsigned 64bit integer number from tokenizer. + + Args: + tokenizer: A tokenizer used to parse the number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an unsigned 64bit integer couldn't be consumed. + """ + return _ConsumeInteger(tokenizer, is_signed=False, is_long=True) + + +def _ConsumeInteger(tokenizer, is_signed=False, is_long=False): + """Consumes an integer number from tokenizer. + + Args: + tokenizer: A tokenizer used to parse the number. + is_signed: True if a signed integer must be parsed. + is_long: True if a long integer must be parsed. + + Returns: + The integer parsed. + + Raises: + ParseError: If an integer with given characteristics couldn't be consumed. + """ + try: + result = ParseInteger(tokenizer.token, is_signed=is_signed, is_long=is_long) + except ValueError as e: + raise tokenizer.ParseError(str(e)) + tokenizer.NextToken() + return result + + +def ParseInteger(text, is_signed=False, is_long=False): + """Parses an integer. + + Args: + text: The text to parse. + is_signed: True if a signed integer must be parsed. + is_long: True if a long integer must be parsed. + + Returns: + The integer value. + + Raises: + ValueError: Thrown Iff the text is not a valid integer. + """ + # Do the actual parsing. Exception handling is propagated to caller. + result = _ParseAbstractInteger(text) + + # Check if the integer is sane. Exceptions handled by callers. + checker = _INTEGER_CHECKERS[2 * int(is_long) + int(is_signed)] + checker.CheckValue(result) + return result + + +def _ParseAbstractInteger(text): + """Parses an integer without checking size/signedness. + + Args: + text: The text to parse. + + Returns: + The integer value. + + Raises: + ValueError: Thrown Iff the text is not a valid integer. + """ + # Do the actual parsing. Exception handling is propagated to caller. + orig_text = text + c_octal_match = re.match(r'(-?)0(\d+)$', text) + if c_octal_match: + # Python 3 no longer supports 0755 octal syntax without the 'o', so + # we always use the '0o' prefix for multi-digit numbers starting with 0. + text = c_octal_match.group(1) + '0o' + c_octal_match.group(2) + try: + return int(text, 0) + except ValueError: + raise ValueError('Couldn\'t parse integer: %s' % orig_text) + + +def ParseFloat(text): + """Parse a floating point number. + + Args: + text: Text to parse. + + Returns: + The number parsed. + + Raises: + ValueError: If a floating point number couldn't be parsed. + """ + try: + # Assume Python compatible syntax. + return float(text) + except ValueError: + # Check alternative spellings. + if _FLOAT_INFINITY.match(text): + if text[0] == '-': + return float('-inf') + else: + return float('inf') + elif _FLOAT_NAN.match(text): + return float('nan') + else: + # assume '1.0f' format + try: + return float(text.rstrip('f')) + except ValueError: + raise ValueError('Couldn\'t parse float: %s' % text) + + +def ParseBool(text): + """Parse a boolean value. + + Args: + text: Text to parse. + + Returns: + Boolean values parsed + + Raises: + ValueError: If text is not a valid boolean. + """ + if text in ('true', 't', '1', 'True'): + return True + elif text in ('false', 'f', '0', 'False'): + return False + else: + raise ValueError('Expected "true" or "false".') + + +def ParseEnum(field, value): + """Parse an enum value. + + The value can be specified by a number (the enum value), or by + a string literal (the enum name). + + Args: + field: Enum field descriptor. + value: String value. + + Returns: + Enum value number. + + Raises: + ValueError: If the enum value could not be parsed. + """ + enum_descriptor = field.enum_type + try: + number = int(value, 0) + except ValueError: + # Identifier. + enum_value = enum_descriptor.values_by_name.get(value, None) + if enum_value is None: + raise ValueError('Enum type "%s" has no value named %s.' % + (enum_descriptor.full_name, value)) + else: + if not field.enum_type.is_closed: + return number + enum_value = enum_descriptor.values_by_number.get(number, None) + if enum_value is None: + raise ValueError('Enum type "%s" has no value with number %d.' % + (enum_descriptor.full_name, number)) + return enum_value.number diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/timestamp_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/timestamp_pb2.py new file mode 100644 index 0000000..30e083d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/timestamp_pb2.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/timestamp.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fgoogle/protobuf/timestamp.proto\x12\x0fgoogle.protobuf\";\n\tTimestamp\x12\x18\n\x07seconds\x18\x01 \x01(\x03R\x07seconds\x12\x14\n\x05nanos\x18\x02 \x01(\x05R\x05nanosB\x85\x01\n\x13\x63om.google.protobufB\x0eTimestampProtoP\x01Z2google.golang.org/protobuf/types/known/timestamppb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.timestamp_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\016TimestampProtoP\001Z2google.golang.org/protobuf/types/known/timestamppb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' + _globals['_TIMESTAMP']._serialized_start=52 + _globals['_TIMESTAMP']._serialized_end=111 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/type_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/type_pb2.py new file mode 100644 index 0000000..9625f52 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/type_pb2.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/type.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 +from google.protobuf import source_context_pb2 as google_dot_protobuf_dot_source__context__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1agoogle/protobuf/type.proto\x12\x0fgoogle.protobuf\x1a\x19google/protobuf/any.proto\x1a$google/protobuf/source_context.proto\"\xa7\x02\n\x04Type\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12.\n\x06\x66ields\x18\x02 \x03(\x0b\x32\x16.google.protobuf.FieldR\x06\x66ields\x12\x16\n\x06oneofs\x18\x03 \x03(\tR\x06oneofs\x12\x31\n\x07options\x18\x04 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12\x45\n\x0esource_context\x18\x05 \x01(\x0b\x32\x1e.google.protobuf.SourceContextR\rsourceContext\x12/\n\x06syntax\x18\x06 \x01(\x0e\x32\x17.google.protobuf.SyntaxR\x06syntax\x12\x18\n\x07\x65\x64ition\x18\x07 \x01(\tR\x07\x65\x64ition\"\xb4\x06\n\x05\x46ield\x12/\n\x04kind\x18\x01 \x01(\x0e\x32\x1b.google.protobuf.Field.KindR\x04kind\x12\x44\n\x0b\x63\x61rdinality\x18\x02 \x01(\x0e\x32\".google.protobuf.Field.CardinalityR\x0b\x63\x61rdinality\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x12\n\x04name\x18\x04 \x01(\tR\x04name\x12\x19\n\x08type_url\x18\x06 \x01(\tR\x07typeUrl\x12\x1f\n\x0boneof_index\x18\x07 \x01(\x05R\noneofIndex\x12\x16\n\x06packed\x18\x08 \x01(\x08R\x06packed\x12\x31\n\x07options\x18\t \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12#\n\rdefault_value\x18\x0b \x01(\tR\x0c\x64\x65\x66\x61ultValue\"\xc8\x02\n\x04Kind\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"t\n\x0b\x43\x61rdinality\x12\x17\n\x13\x43\x41RDINALITY_UNKNOWN\x10\x00\x12\x18\n\x14\x43\x41RDINALITY_OPTIONAL\x10\x01\x12\x18\n\x14\x43\x41RDINALITY_REQUIRED\x10\x02\x12\x18\n\x14\x43\x41RDINALITY_REPEATED\x10\x03\"\x99\x02\n\x04\x45num\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x38\n\tenumvalue\x18\x02 \x03(\x0b\x32\x1a.google.protobuf.EnumValueR\tenumvalue\x12\x31\n\x07options\x18\x03 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12\x45\n\x0esource_context\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.SourceContextR\rsourceContext\x12/\n\x06syntax\x18\x05 \x01(\x0e\x32\x17.google.protobuf.SyntaxR\x06syntax\x12\x18\n\x07\x65\x64ition\x18\x06 \x01(\tR\x07\x65\x64ition\"j\n\tEnumValue\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12\x31\n\x07options\x18\x03 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\"H\n\x06Option\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.AnyR\x05value*C\n\x06Syntax\x12\x11\n\rSYNTAX_PROTO2\x10\x00\x12\x11\n\rSYNTAX_PROTO3\x10\x01\x12\x13\n\x0fSYNTAX_EDITIONS\x10\x02\x42{\n\x13\x63om.google.protobufB\tTypeProtoP\x01Z-google.golang.org/protobuf/types/known/typepb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.type_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\tTypeProtoP\001Z-google.golang.org/protobuf/types/known/typepb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' + _globals['_SYNTAX']._serialized_start=1699 + _globals['_SYNTAX']._serialized_end=1766 + _globals['_TYPE']._serialized_start=113 + _globals['_TYPE']._serialized_end=408 + _globals['_FIELD']._serialized_start=411 + _globals['_FIELD']._serialized_end=1231 + _globals['_FIELD_KIND']._serialized_start=785 + _globals['_FIELD_KIND']._serialized_end=1113 + _globals['_FIELD_CARDINALITY']._serialized_start=1115 + _globals['_FIELD_CARDINALITY']._serialized_end=1231 + _globals['_ENUM']._serialized_start=1234 + _globals['_ENUM']._serialized_end=1515 + _globals['_ENUMVALUE']._serialized_start=1517 + _globals['_ENUMVALUE']._serialized_end=1623 + _globals['_OPTION']._serialized_start=1625 + _globals['_OPTION']._serialized_end=1697 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/unknown_fields.py b/myenv/lib/python3.12/site-packages/google/protobuf/unknown_fields.py new file mode 100644 index 0000000..9b1e549 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/unknown_fields.py @@ -0,0 +1,97 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +"""Contains Unknown Fields APIs. + +Simple usage example: + unknown_field_set = UnknownFieldSet(message) + for unknown_field in unknown_field_set: + wire_type = unknown_field.wire_type + field_number = unknown_field.field_number + data = unknown_field.data +""" + + +from google.protobuf.internal import api_implementation + +if api_implementation._c_module is not None: # pylint: disable=protected-access + UnknownFieldSet = api_implementation._c_module.UnknownFieldSet # pylint: disable=protected-access +else: + from google.protobuf.internal import decoder # pylint: disable=g-import-not-at-top + from google.protobuf.internal import wire_format # pylint: disable=g-import-not-at-top + + class UnknownField: + """A parsed unknown field.""" + + # Disallows assignment to other attributes. + __slots__ = ['_field_number', '_wire_type', '_data'] + + def __init__(self, field_number, wire_type, data): + self._field_number = field_number + self._wire_type = wire_type + self._data = data + return + + @property + def field_number(self): + return self._field_number + + @property + def wire_type(self): + return self._wire_type + + @property + def data(self): + return self._data + + class UnknownFieldSet: + """UnknownField container.""" + + # Disallows assignment to other attributes. + __slots__ = ['_values'] + + def __init__(self, msg): + + def InternalAdd(field_number, wire_type, data): + unknown_field = UnknownField(field_number, wire_type, data) + self._values.append(unknown_field) + + self._values = [] + msg_des = msg.DESCRIPTOR + # pylint: disable=protected-access + unknown_fields = msg._unknown_fields + if (msg_des.has_options and + msg_des.GetOptions().message_set_wire_format): + local_decoder = decoder.UnknownMessageSetItemDecoder() + for _, buffer in unknown_fields: + (field_number, data) = local_decoder(memoryview(buffer)) + InternalAdd(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED, data) + else: + for tag_bytes, buffer in unknown_fields: + # pylint: disable=protected-access + (tag, _) = decoder._DecodeVarint(tag_bytes, 0) + field_number, wire_type = wire_format.UnpackTag(tag) + if field_number == 0: + raise RuntimeError('Field number 0 is illegal.') + (data, _) = decoder._DecodeUnknownField( + memoryview(buffer), 0, wire_type) + InternalAdd(field_number, wire_type, data) + + def __getitem__(self, index): + size = len(self._values) + if index < 0: + index += size + if index < 0 or index >= size: + raise IndexError('index %d out of range'.index) + + return self._values[index] + + def __len__(self): + return len(self._values) + + def __iter__(self): + return iter(self._values) diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/util/__init__.py b/myenv/lib/python3.12/site-packages/google/protobuf/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/util/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/google/protobuf/util/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0609a4d35415765df7f34e79e280eba958c5b0ab GIT binary patch literal 211 zcmZ8bOA5j;5KXLt2)%<_7j{s$A_&E$JKdIk#u}R@A(;w2iD&QKoEtIgv?(x+ZZO|~b8Z9geo+xRbN~PV literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/google/protobuf/wrappers_pb2.py b/myenv/lib/python3.12/site-packages/google/protobuf/wrappers_pb2.py new file mode 100644 index 0000000..a78126d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/google/protobuf/wrappers_pb2.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/wrappers.proto +# Protobuf Python Version: 4.25.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1egoogle/protobuf/wrappers.proto\x12\x0fgoogle.protobuf\"#\n\x0b\x44oubleValue\x12\x14\n\x05value\x18\x01 \x01(\x01R\x05value\"\"\n\nFloatValue\x12\x14\n\x05value\x18\x01 \x01(\x02R\x05value\"\"\n\nInt64Value\x12\x14\n\x05value\x18\x01 \x01(\x03R\x05value\"#\n\x0bUInt64Value\x12\x14\n\x05value\x18\x01 \x01(\x04R\x05value\"\"\n\nInt32Value\x12\x14\n\x05value\x18\x01 \x01(\x05R\x05value\"#\n\x0bUInt32Value\x12\x14\n\x05value\x18\x01 \x01(\rR\x05value\"!\n\tBoolValue\x12\x14\n\x05value\x18\x01 \x01(\x08R\x05value\"#\n\x0bStringValue\x12\x14\n\x05value\x18\x01 \x01(\tR\x05value\"\"\n\nBytesValue\x12\x14\n\x05value\x18\x01 \x01(\x0cR\x05valueB\x83\x01\n\x13\x63om.google.protobufB\rWrappersProtoP\x01Z1google.golang.org/protobuf/types/known/wrapperspb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.wrappers_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.google.protobufB\rWrappersProtoP\001Z1google.golang.org/protobuf/types/known/wrapperspb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' + _globals['_DOUBLEVALUE']._serialized_start=51 + _globals['_DOUBLEVALUE']._serialized_end=86 + _globals['_FLOATVALUE']._serialized_start=88 + _globals['_FLOATVALUE']._serialized_end=122 + _globals['_INT64VALUE']._serialized_start=124 + _globals['_INT64VALUE']._serialized_end=158 + _globals['_UINT64VALUE']._serialized_start=160 + _globals['_UINT64VALUE']._serialized_end=195 + _globals['_INT32VALUE']._serialized_start=197 + _globals['_INT32VALUE']._serialized_end=231 + _globals['_UINT32VALUE']._serialized_start=233 + _globals['_UINT32VALUE']._serialized_end=268 + _globals['_BOOLVALUE']._serialized_start=270 + _globals['_BOOLVALUE']._serialized_end=303 + _globals['_STRINGVALUE']._serialized_start=305 + _globals['_STRINGVALUE']._serialized_end=340 + _globals['_BYTESVALUE']._serialized_start=342 + _globals['_BYTESVALUE']._serialized_end=376 +# @@protoc_insertion_point(module_scope) diff --git a/myenv/lib/python3.12/site-packages/grpc/__init__.py b/myenv/lib/python3.12/site-packages/grpc/__init__.py new file mode 100644 index 0000000..8e1fb26 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/__init__.py @@ -0,0 +1,2348 @@ +# Copyright 2015-2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""gRPC's Python API.""" + +import abc +import contextlib +import enum +import logging +import sys + +from grpc import _compression +from grpc._cython import cygrpc as _cygrpc +from grpc._runtime_protos import protos +from grpc._runtime_protos import protos_and_services +from grpc._runtime_protos import services + +logging.getLogger(__name__).addHandler(logging.NullHandler()) + +try: + # pylint: disable=ungrouped-imports + from grpc._grpcio_metadata import __version__ +except ImportError: + __version__ = "dev0" + +############################## Future Interface ############################### + + +class FutureTimeoutError(Exception): + """Indicates that a method call on a Future timed out.""" + + +class FutureCancelledError(Exception): + """Indicates that the computation underlying a Future was cancelled.""" + + +class Future(abc.ABC): + """A representation of a computation in another control flow. + + Computations represented by a Future may be yet to be begun, + may be ongoing, or may have already completed. + """ + + @abc.abstractmethod + def cancel(self): + """Attempts to cancel the computation. + + This method does not block. + + Returns: + bool: + Returns True if the computation was canceled. + + Returns False under all other circumstances, for example: + + 1. computation has begun and could not be canceled. + 2. computation has finished + 3. computation is scheduled for execution and it is impossible + to determine its state without blocking. + """ + raise NotImplementedError() + + @abc.abstractmethod + def cancelled(self): + """Describes whether the computation was cancelled. + + This method does not block. + + Returns: + bool: + Returns True if the computation was cancelled before its result became + available. + + Returns False under all other circumstances, for example: + + 1. computation was not cancelled. + 2. computation's result is available. + """ + raise NotImplementedError() + + @abc.abstractmethod + def running(self): + """Describes whether the computation is taking place. + + This method does not block. + + Returns: + Returns True if the computation is scheduled for execution or + currently executing. + + Returns False if the computation already executed or was cancelled. + """ + raise NotImplementedError() + + @abc.abstractmethod + def done(self): + """Describes whether the computation has taken place. + + This method does not block. + + Returns: + bool: + Returns True if the computation already executed or was cancelled. + Returns False if the computation is scheduled for execution or + currently executing. + This is exactly opposite of the running() method's result. + """ + raise NotImplementedError() + + @abc.abstractmethod + def result(self, timeout=None): + """Returns the result of the computation or raises its exception. + + This method may return immediately or may block. + + Args: + timeout: The length of time in seconds to wait for the computation to + finish or be cancelled. If None, the call will block until the + computations's termination. + + Returns: + The return value of the computation. + + Raises: + FutureTimeoutError: If a timeout value is passed and the computation + does not terminate within the allotted time. + FutureCancelledError: If the computation was cancelled. + Exception: If the computation raised an exception, this call will + raise the same exception. + """ + raise NotImplementedError() + + @abc.abstractmethod + def exception(self, timeout=None): + """Return the exception raised by the computation. + + This method may return immediately or may block. + + Args: + timeout: The length of time in seconds to wait for the computation to + terminate or be cancelled. If None, the call will block until the + computations's termination. + + Returns: + The exception raised by the computation, or None if the computation + did not raise an exception. + + Raises: + FutureTimeoutError: If a timeout value is passed and the computation + does not terminate within the allotted time. + FutureCancelledError: If the computation was cancelled. + """ + raise NotImplementedError() + + @abc.abstractmethod + def traceback(self, timeout=None): + """Access the traceback of the exception raised by the computation. + + This method may return immediately or may block. + + Args: + timeout: The length of time in seconds to wait for the computation + to terminate or be cancelled. If None, the call will block until + the computation's termination. + + Returns: + The traceback of the exception raised by the computation, or None + if the computation did not raise an exception. + + Raises: + FutureTimeoutError: If a timeout value is passed and the computation + does not terminate within the allotted time. + FutureCancelledError: If the computation was cancelled. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_done_callback(self, fn): + """Adds a function to be called at completion of the computation. + + The callback will be passed this Future object describing the outcome + of the computation. Callbacks will be invoked after the future is + terminated, whether successfully or not. + + If the computation has already completed, the callback will be called + immediately. + + Exceptions raised in the callback will be logged at ERROR level, but + will not terminate any threads of execution. + + Args: + fn: A callable taking this Future object as its single parameter. + """ + raise NotImplementedError() + + +################################ gRPC Enums ################################## + + +@enum.unique +class ChannelConnectivity(enum.Enum): + """Mirrors grpc_connectivity_state in the gRPC Core. + + Attributes: + IDLE: The channel is idle. + CONNECTING: The channel is connecting. + READY: The channel is ready to conduct RPCs. + TRANSIENT_FAILURE: The channel has seen a failure from which it expects + to recover. + SHUTDOWN: The channel has seen a failure from which it cannot recover. + """ + + IDLE = (_cygrpc.ConnectivityState.idle, "idle") + CONNECTING = (_cygrpc.ConnectivityState.connecting, "connecting") + READY = (_cygrpc.ConnectivityState.ready, "ready") + TRANSIENT_FAILURE = ( + _cygrpc.ConnectivityState.transient_failure, + "transient failure", + ) + SHUTDOWN = (_cygrpc.ConnectivityState.shutdown, "shutdown") + + +@enum.unique +class StatusCode(enum.Enum): + """Mirrors grpc_status_code in the gRPC Core. + + Attributes: + OK: Not an error; returned on success + CANCELLED: The operation was cancelled (typically by the caller). + UNKNOWN: Unknown error. + INVALID_ARGUMENT: Client specified an invalid argument. + DEADLINE_EXCEEDED: Deadline expired before operation could complete. + NOT_FOUND: Some requested entity (e.g., file or directory) was not found. + ALREADY_EXISTS: Some entity that we attempted to create (e.g., file or directory) + already exists. + PERMISSION_DENIED: The caller does not have permission to execute the specified + operation. + UNAUTHENTICATED: The request does not have valid authentication credentials for the + operation. + RESOURCE_EXHAUSTED: Some resource has been exhausted, perhaps a per-user quota, or + perhaps the entire file system is out of space. + FAILED_PRECONDITION: Operation was rejected because the system is not in a state + required for the operation's execution. + ABORTED: The operation was aborted, typically due to a concurrency issue + like sequencer check failures, transaction aborts, etc. + UNIMPLEMENTED: Operation is not implemented or not supported/enabled in this service. + INTERNAL: Internal errors. Means some invariants expected by underlying + system has been broken. + UNAVAILABLE: The service is currently unavailable. + DATA_LOSS: Unrecoverable data loss or corruption. + """ + + OK = (_cygrpc.StatusCode.ok, "ok") + CANCELLED = (_cygrpc.StatusCode.cancelled, "cancelled") + UNKNOWN = (_cygrpc.StatusCode.unknown, "unknown") + INVALID_ARGUMENT = (_cygrpc.StatusCode.invalid_argument, "invalid argument") + DEADLINE_EXCEEDED = ( + _cygrpc.StatusCode.deadline_exceeded, + "deadline exceeded", + ) + NOT_FOUND = (_cygrpc.StatusCode.not_found, "not found") + ALREADY_EXISTS = (_cygrpc.StatusCode.already_exists, "already exists") + PERMISSION_DENIED = ( + _cygrpc.StatusCode.permission_denied, + "permission denied", + ) + RESOURCE_EXHAUSTED = ( + _cygrpc.StatusCode.resource_exhausted, + "resource exhausted", + ) + FAILED_PRECONDITION = ( + _cygrpc.StatusCode.failed_precondition, + "failed precondition", + ) + ABORTED = (_cygrpc.StatusCode.aborted, "aborted") + OUT_OF_RANGE = (_cygrpc.StatusCode.out_of_range, "out of range") + UNIMPLEMENTED = (_cygrpc.StatusCode.unimplemented, "unimplemented") + INTERNAL = (_cygrpc.StatusCode.internal, "internal") + UNAVAILABLE = (_cygrpc.StatusCode.unavailable, "unavailable") + DATA_LOSS = (_cygrpc.StatusCode.data_loss, "data loss") + UNAUTHENTICATED = (_cygrpc.StatusCode.unauthenticated, "unauthenticated") + + +############################# gRPC Status ################################ + + +class Status(abc.ABC): + """Describes the status of an RPC. + + This is an EXPERIMENTAL API. + + Attributes: + code: A StatusCode object to be sent to the client. + details: A UTF-8-encodable string to be sent to the client upon + termination of the RPC. + trailing_metadata: The trailing :term:`metadata` in the RPC. + """ + + +############################# gRPC Exceptions ################################ + + +class RpcError(Exception): + """Raised by the gRPC library to indicate non-OK-status RPC termination.""" + + +############################## Shared Context ################################ + + +class RpcContext(abc.ABC): + """Provides RPC-related information and action.""" + + @abc.abstractmethod + def is_active(self): + """Describes whether the RPC is active or has terminated. + + Returns: + bool: + True if RPC is active, False otherwise. + """ + raise NotImplementedError() + + @abc.abstractmethod + def time_remaining(self): + """Describes the length of allowed time remaining for the RPC. + + Returns: + A nonnegative float indicating the length of allowed time in seconds + remaining for the RPC to complete before it is considered to have + timed out, or None if no deadline was specified for the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def cancel(self): + """Cancels the RPC. + + Idempotent and has no effect if the RPC has already terminated. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_callback(self, callback): + """Registers a callback to be called on RPC termination. + + Args: + callback: A no-parameter callable to be called on RPC termination. + + Returns: + True if the callback was added and will be called later; False if + the callback was not added and will not be called (because the RPC + already terminated or some other reason). + """ + raise NotImplementedError() + + +######################### Invocation-Side Context ############################ + + +class Call(RpcContext, metaclass=abc.ABCMeta): + """Invocation-side utility object for an RPC.""" + + @abc.abstractmethod + def initial_metadata(self): + """Accesses the initial metadata sent by the server. + + This method blocks until the value is available. + + Returns: + The initial :term:`metadata`. + """ + raise NotImplementedError() + + @abc.abstractmethod + def trailing_metadata(self): + """Accesses the trailing metadata sent by the server. + + This method blocks until the value is available. + + Returns: + The trailing :term:`metadata`. + """ + raise NotImplementedError() + + @abc.abstractmethod + def code(self): + """Accesses the status code sent by the server. + + This method blocks until the value is available. + + Returns: + The StatusCode value for the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def details(self): + """Accesses the details sent by the server. + + This method blocks until the value is available. + + Returns: + The details string of the RPC. + """ + raise NotImplementedError() + + +############## Invocation-Side Interceptor Interfaces & Classes ############## + + +class ClientCallDetails(abc.ABC): + """Describes an RPC to be invoked. + + Attributes: + method: The method name of the RPC. + timeout: An optional duration of time in seconds to allow for the RPC. + metadata: Optional :term:`metadata` to be transmitted to + the service-side of the RPC. + credentials: An optional CallCredentials for the RPC. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + """ + + +class UnaryUnaryClientInterceptor(abc.ABC): + """Affords intercepting unary-unary invocations.""" + + @abc.abstractmethod + def intercept_unary_unary(self, continuation, client_call_details, request): + """Intercepts a unary-unary invocation asynchronously. + + Args: + continuation: A function that proceeds with the invocation by + executing the next interceptor in chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `response_future = continuation(client_call_details, request)` + to continue with the RPC. `continuation` returns an object that is + both a Call for the RPC and a Future. In the event of RPC + completion, the return Call-Future's result value will be + the response message of the RPC. Should the event terminate + with non-OK status, the returned Call-Future's exception value + will be an RpcError. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request: The request value for the RPC. + + Returns: + An object that is both a Call for the RPC and a Future. + In the event of RPC completion, the return Call-Future's + result value will be the response message of the RPC. + Should the event terminate with non-OK status, the returned + Call-Future's exception value will be an RpcError. + """ + raise NotImplementedError() + + +class UnaryStreamClientInterceptor(abc.ABC): + """Affords intercepting unary-stream invocations.""" + + @abc.abstractmethod + def intercept_unary_stream( + self, continuation, client_call_details, request + ): + """Intercepts a unary-stream invocation. + + Args: + continuation: A function that proceeds with the invocation by + executing the next interceptor in chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `response_iterator = continuation(client_call_details, request)` + to continue with the RPC. `continuation` returns an object that is + both a Call for the RPC and an iterator for response values. + Drawing response values from the returned Call-iterator may + raise RpcError indicating termination of the RPC with non-OK + status. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request: The request value for the RPC. + + Returns: + An object that is both a Call for the RPC and an iterator of + response values. Drawing response values from the returned + Call-iterator may raise RpcError indicating termination of + the RPC with non-OK status. This object *should* also fulfill the + Future interface, though it may not. + """ + raise NotImplementedError() + + +class StreamUnaryClientInterceptor(abc.ABC): + """Affords intercepting stream-unary invocations.""" + + @abc.abstractmethod + def intercept_stream_unary( + self, continuation, client_call_details, request_iterator + ): + """Intercepts a stream-unary invocation asynchronously. + + Args: + continuation: A function that proceeds with the invocation by + executing the next interceptor in chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `response_future = continuation(client_call_details, request_iterator)` + to continue with the RPC. `continuation` returns an object that is + both a Call for the RPC and a Future. In the event of RPC completion, + the return Call-Future's result value will be the response message + of the RPC. Should the event terminate with non-OK status, the + returned Call-Future's exception value will be an RpcError. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request_iterator: An iterator that yields request values for the RPC. + + Returns: + An object that is both a Call for the RPC and a Future. + In the event of RPC completion, the return Call-Future's + result value will be the response message of the RPC. + Should the event terminate with non-OK status, the returned + Call-Future's exception value will be an RpcError. + """ + raise NotImplementedError() + + +class StreamStreamClientInterceptor(abc.ABC): + """Affords intercepting stream-stream invocations.""" + + @abc.abstractmethod + def intercept_stream_stream( + self, continuation, client_call_details, request_iterator + ): + """Intercepts a stream-stream invocation. + + Args: + continuation: A function that proceeds with the invocation by + executing the next interceptor in chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `response_iterator = continuation(client_call_details, request_iterator)` + to continue with the RPC. `continuation` returns an object that is + both a Call for the RPC and an iterator for response values. + Drawing response values from the returned Call-iterator may + raise RpcError indicating termination of the RPC with non-OK + status. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request_iterator: An iterator that yields request values for the RPC. + + Returns: + An object that is both a Call for the RPC and an iterator of + response values. Drawing response values from the returned + Call-iterator may raise RpcError indicating termination of + the RPC with non-OK status. This object *should* also fulfill the + Future interface, though it may not. + """ + raise NotImplementedError() + + +############ Authentication & Authorization Interfaces & Classes ############# + + +class ChannelCredentials(object): + """An encapsulation of the data required to create a secure Channel. + + This class has no supported interface - it exists to define the type of its + instances and its instances exist to be passed to other functions. For + example, ssl_channel_credentials returns an instance of this class and + secure_channel requires an instance of this class. + """ + + def __init__(self, credentials): + self._credentials = credentials + + +class CallCredentials(object): + """An encapsulation of the data required to assert an identity over a call. + + A CallCredentials has to be used with secure Channel, otherwise the + metadata will not be transmitted to the server. + + A CallCredentials may be composed with ChannelCredentials to always assert + identity for every call over that Channel. + + This class has no supported interface - it exists to define the type of its + instances and its instances exist to be passed to other functions. + """ + + def __init__(self, credentials): + self._credentials = credentials + + +class AuthMetadataContext(abc.ABC): + """Provides information to call credentials metadata plugins. + + Attributes: + service_url: A string URL of the service being called into. + method_name: A string of the fully qualified method name being called. + """ + + +class AuthMetadataPluginCallback(abc.ABC): + """Callback object received by a metadata plugin.""" + + def __call__(self, metadata, error): + """Passes to the gRPC runtime authentication metadata for an RPC. + + Args: + metadata: The :term:`metadata` used to construct the CallCredentials. + error: An Exception to indicate error or None to indicate success. + """ + raise NotImplementedError() + + +class AuthMetadataPlugin(abc.ABC): + """A specification for custom authentication.""" + + def __call__(self, context, callback): + """Implements authentication by passing metadata to a callback. + + This method will be invoked asynchronously in a separate thread. + + Args: + context: An AuthMetadataContext providing information on the RPC that + the plugin is being called to authenticate. + callback: An AuthMetadataPluginCallback to be invoked either + synchronously or asynchronously. + """ + raise NotImplementedError() + + +class ServerCredentials(object): + """An encapsulation of the data required to open a secure port on a Server. + + This class has no supported interface - it exists to define the type of its + instances and its instances exist to be passed to other functions. + """ + + def __init__(self, credentials): + self._credentials = credentials + + +class ServerCertificateConfiguration(object): + """A certificate configuration for use with an SSL-enabled Server. + + Instances of this class can be returned in the certificate configuration + fetching callback. + + This class has no supported interface -- it exists to define the + type of its instances and its instances exist to be passed to + other functions. + """ + + def __init__(self, certificate_configuration): + self._certificate_configuration = certificate_configuration + + +######################## Multi-Callable Interfaces ########################### + + +class UnaryUnaryMultiCallable(abc.ABC): + """Affords invoking a unary-unary RPC from client-side.""" + + @abc.abstractmethod + def __call__( + self, + request, + timeout=None, + metadata=None, + credentials=None, + wait_for_ready=None, + compression=None, + ): + """Synchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + The response value for the RPC. + + Raises: + RpcError: Indicating that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + raise NotImplementedError() + + @abc.abstractmethod + def with_call( + self, + request, + timeout=None, + metadata=None, + credentials=None, + wait_for_ready=None, + compression=None, + ): + """Synchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional durating of time in seconds to allow for + the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + The response value for the RPC and a Call value for the RPC. + + Raises: + RpcError: Indicating that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future( + self, + request, + timeout=None, + metadata=None, + credentials=None, + wait_for_ready=None, + compression=None, + ): + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow for + the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + An object that is both a Call for the RPC and a Future. + In the event of RPC completion, the return Call-Future's result + value will be the response message of the RPC. + Should the event terminate with non-OK status, + the returned Call-Future's exception value will be an RpcError. + """ + raise NotImplementedError() + + +class UnaryStreamMultiCallable(abc.ABC): + """Affords invoking a unary-stream RPC from client-side.""" + + @abc.abstractmethod + def __call__( + self, + request, + timeout=None, + metadata=None, + credentials=None, + wait_for_ready=None, + compression=None, + ): + """Invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow for + the RPC. If None, the timeout is considered infinite. + metadata: An optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + An object that is a Call for the RPC, an iterator of response + values, and a Future for the RPC. Drawing response values from the + returned Call-iterator may raise RpcError indicating termination of + the RPC with non-OK status. + """ + raise NotImplementedError() + + +class StreamUnaryMultiCallable(abc.ABC): + """Affords invoking a stream-unary RPC from client-side.""" + + @abc.abstractmethod + def __call__( + self, + request_iterator, + timeout=None, + metadata=None, + credentials=None, + wait_for_ready=None, + compression=None, + ): + """Synchronously invokes the underlying RPC. + + Args: + request_iterator: An iterator that yields request values for + the RPC. + timeout: An optional duration of time in seconds to allow for + the RPC. If None, the timeout is considered infinite. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + The response value for the RPC. + + Raises: + RpcError: Indicating that the RPC terminated with non-OK status. The + raised RpcError will also implement grpc.Call, affording methods + such as metadata, code, and details. + """ + raise NotImplementedError() + + @abc.abstractmethod + def with_call( + self, + request_iterator, + timeout=None, + metadata=None, + credentials=None, + wait_for_ready=None, + compression=None, + ): + """Synchronously invokes the underlying RPC on the client. + + Args: + request_iterator: An iterator that yields request values for + the RPC. + timeout: An optional duration of time in seconds to allow for + the RPC. If None, the timeout is considered infinite. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + The response value for the RPC and a Call object for the RPC. + + Raises: + RpcError: Indicating that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future( + self, + request_iterator, + timeout=None, + metadata=None, + credentials=None, + wait_for_ready=None, + compression=None, + ): + """Asynchronously invokes the underlying RPC on the client. + + Args: + request_iterator: An iterator that yields request values for the RPC. + timeout: An optional duration of time in seconds to allow for + the RPC. If None, the timeout is considered infinite. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + An object that is both a Call for the RPC and a Future. + In the event of RPC completion, the return Call-Future's result value + will be the response message of the RPC. Should the event terminate + with non-OK status, the returned Call-Future's exception value will + be an RpcError. + """ + raise NotImplementedError() + + +class StreamStreamMultiCallable(abc.ABC): + """Affords invoking a stream-stream RPC on client-side.""" + + @abc.abstractmethod + def __call__( + self, + request_iterator, + timeout=None, + metadata=None, + credentials=None, + wait_for_ready=None, + compression=None, + ): + """Invokes the underlying RPC on the client. + + Args: + request_iterator: An iterator that yields request values for the RPC. + timeout: An optional duration of time in seconds to allow for + the RPC. If not specified, the timeout is considered infinite. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + An object that is a Call for the RPC, an iterator of response + values, and a Future for the RPC. Drawing response values from the + returned Call-iterator may raise RpcError indicating termination of + the RPC with non-OK status. + """ + raise NotImplementedError() + + +############################# Channel Interface ############################## + + +class Channel(abc.ABC): + """Affords RPC invocation via generic methods on client-side. + + Channel objects implement the Context Manager type, although they need not + support being entered and exited multiple times. + """ + + @abc.abstractmethod + def subscribe(self, callback, try_to_connect=False): + """Subscribe to this Channel's connectivity state machine. + + A Channel may be in any of the states described by ChannelConnectivity. + This method allows application to monitor the state transitions. + The typical use case is to debug or gain better visibility into gRPC + runtime's state. + + Args: + callback: A callable to be invoked with ChannelConnectivity argument. + ChannelConnectivity describes current state of the channel. + The callable will be invoked immediately upon subscription + and again for every change to ChannelConnectivity until it + is unsubscribed or this Channel object goes out of scope. + try_to_connect: A boolean indicating whether or not this Channel + should attempt to connect immediately. If set to False, gRPC + runtime decides when to connect. + """ + raise NotImplementedError() + + @abc.abstractmethod + def unsubscribe(self, callback): + """Unsubscribes a subscribed callback from this Channel's connectivity. + + Args: + callback: A callable previously registered with this Channel from + having been passed to its "subscribe" method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def unary_unary( + self, + method, + request_serializer=None, + response_deserializer=None, + _registered_method=False, + ): + """Creates a UnaryUnaryMultiCallable for a unary-unary method. + + Args: + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the + response message. Response goes undeserialized in case None + is passed. + _registered_method: Implementation Private. A bool representing whether the method + is registered. + + Returns: + A UnaryUnaryMultiCallable value for the named unary-unary method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def unary_stream( + self, + method, + request_serializer=None, + response_deserializer=None, + _registered_method=False, + ): + """Creates a UnaryStreamMultiCallable for a unary-stream method. + + Args: + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the + response message. Response goes undeserialized in case None is + passed. + _registered_method: Implementation Private. A bool representing whether the method + is registered. + + Returns: + A UnaryStreamMultiCallable value for the name unary-stream method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def stream_unary( + self, + method, + request_serializer=None, + response_deserializer=None, + _registered_method=False, + ): + """Creates a StreamUnaryMultiCallable for a stream-unary method. + + Args: + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the + response message. Response goes undeserialized in case None is + passed. + _registered_method: Implementation Private. A bool representing whether the method + is registered. + + Returns: + A StreamUnaryMultiCallable value for the named stream-unary method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def stream_stream( + self, + method, + request_serializer=None, + response_deserializer=None, + _registered_method=False, + ): + """Creates a StreamStreamMultiCallable for a stream-stream method. + + Args: + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the + response message. Response goes undeserialized in case None + is passed. + _registered_method: Implementation Private. A bool representing whether the method + is registered. + + Returns: + A StreamStreamMultiCallable value for the named stream-stream method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def close(self): + """Closes this Channel and releases all resources held by it. + + Closing the Channel will immediately terminate all RPCs active with the + Channel and it is not valid to invoke new RPCs with the Channel. + + This method is idempotent. + """ + raise NotImplementedError() + + def __enter__(self): + """Enters the runtime context related to the channel object.""" + raise NotImplementedError() + + def __exit__(self, exc_type, exc_val, exc_tb): + """Exits the runtime context related to the channel object.""" + raise NotImplementedError() + + +########################## Service-Side Context ############################## + + +class ServicerContext(RpcContext, metaclass=abc.ABCMeta): + """A context object passed to method implementations.""" + + @abc.abstractmethod + def invocation_metadata(self): + """Accesses the metadata sent by the client. + + Returns: + The invocation :term:`metadata`. + """ + raise NotImplementedError() + + @abc.abstractmethod + def peer(self): + """Identifies the peer that invoked the RPC being serviced. + + Returns: + A string identifying the peer that invoked the RPC being serviced. + The string format is determined by gRPC runtime. + """ + raise NotImplementedError() + + @abc.abstractmethod + def peer_identities(self): + """Gets one or more peer identity(s). + + Equivalent to + servicer_context.auth_context().get(servicer_context.peer_identity_key()) + + Returns: + An iterable of the identities, or None if the call is not + authenticated. Each identity is returned as a raw bytes type. + """ + raise NotImplementedError() + + @abc.abstractmethod + def peer_identity_key(self): + """The auth property used to identify the peer. + + For example, "x509_common_name" or "x509_subject_alternative_name" are + used to identify an SSL peer. + + Returns: + The auth property (string) that indicates the + peer identity, or None if the call is not authenticated. + """ + raise NotImplementedError() + + @abc.abstractmethod + def auth_context(self): + """Gets the auth context for the call. + + Returns: + A map of strings to an iterable of bytes for each auth property. + """ + raise NotImplementedError() + + def set_compression(self, compression): + """Set the compression algorithm to be used for the entire call. + + Args: + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + """ + raise NotImplementedError() + + @abc.abstractmethod + def send_initial_metadata(self, initial_metadata): + """Sends the initial metadata value to the client. + + This method need not be called by implementations if they have no + metadata to add to what the gRPC runtime will transmit. + + Args: + initial_metadata: The initial :term:`metadata`. + """ + raise NotImplementedError() + + @abc.abstractmethod + def set_trailing_metadata(self, trailing_metadata): + """Sets the trailing metadata for the RPC. + + Sets the trailing metadata to be sent upon completion of the RPC. + + If this method is invoked multiple times throughout the lifetime of an + RPC, the value supplied in the final invocation will be the value sent + over the wire. + + This method need not be called by implementations if they have no + metadata to add to what the gRPC runtime will transmit. + + Args: + trailing_metadata: The trailing :term:`metadata`. + """ + raise NotImplementedError() + + def trailing_metadata(self): + """Access value to be used as trailing metadata upon RPC completion. + + This is an EXPERIMENTAL API. + + Returns: + The trailing :term:`metadata` for the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def abort(self, code, details): + """Raises an exception to terminate the RPC with a non-OK status. + + The code and details passed as arguments will supercede any existing + ones. + + Args: + code: A StatusCode object to be sent to the client. + It must not be StatusCode.OK. + details: A UTF-8-encodable string to be sent to the client upon + termination of the RPC. + + Raises: + Exception: An exception is always raised to signal the abortion the + RPC to the gRPC runtime. + """ + raise NotImplementedError() + + @abc.abstractmethod + def abort_with_status(self, status): + """Raises an exception to terminate the RPC with a non-OK status. + + The status passed as argument will supercede any existing status code, + status message and trailing metadata. + + This is an EXPERIMENTAL API. + + Args: + status: A grpc.Status object. The status code in it must not be + StatusCode.OK. + + Raises: + Exception: An exception is always raised to signal the abortion the + RPC to the gRPC runtime. + """ + raise NotImplementedError() + + @abc.abstractmethod + def set_code(self, code): + """Sets the value to be used as status code upon RPC completion. + + This method need not be called by method implementations if they wish + the gRPC runtime to determine the status code of the RPC. + + Args: + code: A StatusCode object to be sent to the client. + """ + raise NotImplementedError() + + @abc.abstractmethod + def set_details(self, details): + """Sets the value to be used as detail string upon RPC completion. + + This method need not be called by method implementations if they have + no details to transmit. + + Args: + details: A UTF-8-encodable string to be sent to the client upon + termination of the RPC. + """ + raise NotImplementedError() + + def code(self): + """Accesses the value to be used as status code upon RPC completion. + + This is an EXPERIMENTAL API. + + Returns: + The StatusCode value for the RPC. + """ + raise NotImplementedError() + + def details(self): + """Accesses the value to be used as detail string upon RPC completion. + + This is an EXPERIMENTAL API. + + Returns: + The details string of the RPC. + """ + raise NotImplementedError() + + def disable_next_message_compression(self): + """Disables compression for the next response message. + + This method will override any compression configuration set during + server creation or set on the call. + """ + raise NotImplementedError() + + +##################### Service-Side Handler Interfaces ######################## + + +class RpcMethodHandler(abc.ABC): + """An implementation of a single RPC method. + + Attributes: + request_streaming: Whether the RPC supports exactly one request message + or any arbitrary number of request messages. + response_streaming: Whether the RPC supports exactly one response message + or any arbitrary number of response messages. + request_deserializer: A callable :term:`deserializer` that accepts a byte string and + returns an object suitable to be passed to this object's business + logic, or None to indicate that this object's business logic should be + passed the raw request bytes. + response_serializer: A callable :term:`serializer` that accepts an object produced + by this object's business logic and returns a byte string, or None to + indicate that the byte strings produced by this object's business logic + should be transmitted on the wire as they are. + unary_unary: This object's application-specific business logic as a + callable value that takes a request value and a ServicerContext object + and returns a response value. Only non-None if both request_streaming + and response_streaming are False. + unary_stream: This object's application-specific business logic as a + callable value that takes a request value and a ServicerContext object + and returns an iterator of response values. Only non-None if + request_streaming is False and response_streaming is True. + stream_unary: This object's application-specific business logic as a + callable value that takes an iterator of request values and a + ServicerContext object and returns a response value. Only non-None if + request_streaming is True and response_streaming is False. + stream_stream: This object's application-specific business logic as a + callable value that takes an iterator of request values and a + ServicerContext object and returns an iterator of response values. + Only non-None if request_streaming and response_streaming are both + True. + """ + + +class HandlerCallDetails(abc.ABC): + """Describes an RPC that has just arrived for service. + + Attributes: + method: The method name of the RPC. + invocation_metadata: The :term:`metadata` sent by the client. + """ + + +class GenericRpcHandler(abc.ABC): + """An implementation of arbitrarily many RPC methods.""" + + @abc.abstractmethod + def service(self, handler_call_details): + """Returns the handler for servicing the RPC. + + Args: + handler_call_details: A HandlerCallDetails describing the RPC. + + Returns: + An RpcMethodHandler with which the RPC may be serviced if the + implementation chooses to service this RPC, or None otherwise. + """ + raise NotImplementedError() + + +class ServiceRpcHandler(GenericRpcHandler, metaclass=abc.ABCMeta): + """An implementation of RPC methods belonging to a service. + + A service handles RPC methods with structured names of the form + '/Service.Name/Service.Method', where 'Service.Name' is the value + returned by service_name(), and 'Service.Method' is the method + name. A service can have multiple method names, but only a single + service name. + """ + + @abc.abstractmethod + def service_name(self): + """Returns this service's name. + + Returns: + The service name. + """ + raise NotImplementedError() + + +#################### Service-Side Interceptor Interfaces ##################### + + +class ServerInterceptor(abc.ABC): + """Affords intercepting incoming RPCs on the service-side.""" + + @abc.abstractmethod + def intercept_service(self, continuation, handler_call_details): + """Intercepts incoming RPCs before handing them over to a handler. + + State can be passed from an interceptor to downstream interceptors + via contextvars. The first interceptor is called from an empty + contextvars.Context, and the same Context is used for downstream + interceptors and for the final handler call. Note that there are no + guarantees that interceptors and handlers will be called from the + same thread. + + Args: + continuation: A function that takes a HandlerCallDetails and + proceeds to invoke the next interceptor in the chain, if any, + or the RPC handler lookup logic, with the call details passed + as an argument, and returns an RpcMethodHandler instance if + the RPC is considered serviced, or None otherwise. + handler_call_details: A HandlerCallDetails describing the RPC. + + Returns: + An RpcMethodHandler with which the RPC may be serviced if the + interceptor chooses to service this RPC, or None otherwise. + """ + raise NotImplementedError() + + +############################# Server Interface ############################### + + +class Server(abc.ABC): + """Services RPCs.""" + + @abc.abstractmethod + def add_generic_rpc_handlers(self, generic_rpc_handlers): + """Registers GenericRpcHandlers with this Server. + + This method is only safe to call before the server is started. + + Args: + generic_rpc_handlers: An iterable of GenericRpcHandlers that will be + used to service RPCs. + """ + raise NotImplementedError() + + def add_registered_method_handlers(self, service_name, method_handlers): + """Registers GenericRpcHandlers with this Server. + + This method is only safe to call before the server is started. + + If the same method have both generic and registered handler, + registered handler will take precedence. + + Args: + service_name: The service name. + method_handlers: A dictionary that maps method names to corresponding + RpcMethodHandler. + """ + + @abc.abstractmethod + def add_insecure_port(self, address): + """Opens an insecure port for accepting RPCs. + + This method may only be called before starting the server. + + Args: + address: The address for which to open a port. If the port is 0, + or not specified in the address, then gRPC runtime will choose a port. + + Returns: + An integer port on which server will accept RPC requests. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_secure_port(self, address, server_credentials): + """Opens a secure port for accepting RPCs. + + This method may only be called before starting the server. + + Args: + address: The address for which to open a port. + if the port is 0, or not specified in the address, then gRPC + runtime will choose a port. + server_credentials: A ServerCredentials object. + + Returns: + An integer port on which server will accept RPC requests. + """ + raise NotImplementedError() + + @abc.abstractmethod + def start(self): + """Starts this Server. + + This method may only be called once. (i.e. it is not idempotent). + """ + raise NotImplementedError() + + @abc.abstractmethod + def stop(self, grace): + """Stops this Server. + + This method immediately stop service of new RPCs in all cases. + + If a grace period is specified, this method waits until all active + RPCs are finished or until the grace period is reached. RPCs that haven't + been terminated within the grace period are aborted. + If a grace period is not specified (by passing None for `grace`), + all existing RPCs are aborted immediately and this method + blocks until the last RPC handler terminates. + + This method is idempotent and may be called at any time. + Passing a smaller grace value in a subsequent call will have + the effect of stopping the Server sooner (passing None will + have the effect of stopping the server immediately). Passing + a larger grace value in a subsequent call *will not* have the + effect of stopping the server later (i.e. the most restrictive + grace value is used). + + Args: + grace: A duration of time in seconds or None. + + Returns: + A threading.Event that will be set when this Server has completely + stopped, i.e. when running RPCs either complete or are aborted and + all handlers have terminated. + """ + raise NotImplementedError() + + def wait_for_termination(self, timeout=None): + """Block current thread until the server stops. + + This is an EXPERIMENTAL API. + + The wait will not consume computational resources during blocking, and + it will block until one of the two following conditions are met: + + 1) The server is stopped or terminated; + 2) A timeout occurs if timeout is not `None`. + + The timeout argument works in the same way as `threading.Event.wait()`. + https://docs.python.org/3/library/threading.html#threading.Event.wait + + Args: + timeout: A floating point number specifying a timeout for the + operation in seconds. + + Returns: + A bool indicates if the operation times out. + """ + raise NotImplementedError() + + +################################# Functions ################################ + + +def unary_unary_rpc_method_handler( + behavior, request_deserializer=None, response_serializer=None +): + """Creates an RpcMethodHandler for a unary-unary RPC method. + + Args: + behavior: The implementation of an RPC that accepts one request + and returns one response. + request_deserializer: An optional :term:`deserializer` for request deserialization. + response_serializer: An optional :term:`serializer` for response serialization. + + Returns: + An RpcMethodHandler object that is typically used by grpc.Server. + """ + from grpc import _utilities # pylint: disable=cyclic-import + + return _utilities.RpcMethodHandler( + False, + False, + request_deserializer, + response_serializer, + behavior, + None, + None, + None, + ) + + +def unary_stream_rpc_method_handler( + behavior, request_deserializer=None, response_serializer=None +): + """Creates an RpcMethodHandler for a unary-stream RPC method. + + Args: + behavior: The implementation of an RPC that accepts one request + and returns an iterator of response values. + request_deserializer: An optional :term:`deserializer` for request deserialization. + response_serializer: An optional :term:`serializer` for response serialization. + + Returns: + An RpcMethodHandler object that is typically used by grpc.Server. + """ + from grpc import _utilities # pylint: disable=cyclic-import + + return _utilities.RpcMethodHandler( + False, + True, + request_deserializer, + response_serializer, + None, + behavior, + None, + None, + ) + + +def stream_unary_rpc_method_handler( + behavior, request_deserializer=None, response_serializer=None +): + """Creates an RpcMethodHandler for a stream-unary RPC method. + + Args: + behavior: The implementation of an RPC that accepts an iterator of + request values and returns a single response value. + request_deserializer: An optional :term:`deserializer` for request deserialization. + response_serializer: An optional :term:`serializer` for response serialization. + + Returns: + An RpcMethodHandler object that is typically used by grpc.Server. + """ + from grpc import _utilities # pylint: disable=cyclic-import + + return _utilities.RpcMethodHandler( + True, + False, + request_deserializer, + response_serializer, + None, + None, + behavior, + None, + ) + + +def stream_stream_rpc_method_handler( + behavior, request_deserializer=None, response_serializer=None +): + """Creates an RpcMethodHandler for a stream-stream RPC method. + + Args: + behavior: The implementation of an RPC that accepts an iterator of + request values and returns an iterator of response values. + request_deserializer: An optional :term:`deserializer` for request deserialization. + response_serializer: An optional :term:`serializer` for response serialization. + + Returns: + An RpcMethodHandler object that is typically used by grpc.Server. + """ + from grpc import _utilities # pylint: disable=cyclic-import + + return _utilities.RpcMethodHandler( + True, + True, + request_deserializer, + response_serializer, + None, + None, + None, + behavior, + ) + + +def method_handlers_generic_handler(service, method_handlers): + """Creates a GenericRpcHandler from RpcMethodHandlers. + + Args: + service: The name of the service that is implemented by the + method_handlers. + method_handlers: A dictionary that maps method names to corresponding + RpcMethodHandler. + + Returns: + A GenericRpcHandler. This is typically added to the grpc.Server object + with add_generic_rpc_handlers() before starting the server. + """ + from grpc import _utilities # pylint: disable=cyclic-import + + return _utilities.DictionaryGenericHandler(service, method_handlers) + + +def ssl_channel_credentials( + root_certificates=None, private_key=None, certificate_chain=None +): + """Creates a ChannelCredentials for use with an SSL-enabled Channel. + + Args: + root_certificates: The PEM-encoded root certificates as a byte string, + or None to retrieve them from a default location chosen by gRPC + runtime. + private_key: The PEM-encoded private key as a byte string, or None if no + private key should be used. + certificate_chain: The PEM-encoded certificate chain as a byte string + to use or None if no certificate chain should be used. + + Returns: + A ChannelCredentials for use with an SSL-enabled Channel. + """ + return ChannelCredentials( + _cygrpc.SSLChannelCredentials( + root_certificates, private_key, certificate_chain + ) + ) + + +def xds_channel_credentials(fallback_credentials=None): + """Creates a ChannelCredentials for use with xDS. This is an EXPERIMENTAL + API. + + Args: + fallback_credentials: Credentials to use in case it is not possible to + establish a secure connection via xDS. If no fallback_credentials + argument is supplied, a default SSLChannelCredentials is used. + """ + fallback_credentials = ( + ssl_channel_credentials() + if fallback_credentials is None + else fallback_credentials + ) + return ChannelCredentials( + _cygrpc.XDSChannelCredentials(fallback_credentials._credentials) + ) + + +def metadata_call_credentials(metadata_plugin, name=None): + """Construct CallCredentials from an AuthMetadataPlugin. + + Args: + metadata_plugin: An AuthMetadataPlugin to use for authentication. + name: An optional name for the plugin. + + Returns: + A CallCredentials. + """ + from grpc import _plugin_wrapping # pylint: disable=cyclic-import + + return _plugin_wrapping.metadata_plugin_call_credentials( + metadata_plugin, name + ) + + +def access_token_call_credentials(access_token): + """Construct CallCredentials from an access token. + + Args: + access_token: A string to place directly in the http request + authorization header, for example + "authorization: Bearer ". + + Returns: + A CallCredentials. + """ + from grpc import _auth # pylint: disable=cyclic-import + from grpc import _plugin_wrapping # pylint: disable=cyclic-import + + return _plugin_wrapping.metadata_plugin_call_credentials( + _auth.AccessTokenAuthMetadataPlugin(access_token), None + ) + + +def composite_call_credentials(*call_credentials): + """Compose multiple CallCredentials to make a new CallCredentials. + + Args: + *call_credentials: At least two CallCredentials objects. + + Returns: + A CallCredentials object composed of the given CallCredentials objects. + """ + return CallCredentials( + _cygrpc.CompositeCallCredentials( + tuple( + single_call_credentials._credentials + for single_call_credentials in call_credentials + ) + ) + ) + + +def composite_channel_credentials(channel_credentials, *call_credentials): + """Compose a ChannelCredentials and one or more CallCredentials objects. + + Args: + channel_credentials: A ChannelCredentials object. + *call_credentials: One or more CallCredentials objects. + + Returns: + A ChannelCredentials composed of the given ChannelCredentials and + CallCredentials objects. + """ + return ChannelCredentials( + _cygrpc.CompositeChannelCredentials( + tuple( + single_call_credentials._credentials + for single_call_credentials in call_credentials + ), + channel_credentials._credentials, + ) + ) + + +def ssl_server_credentials( + private_key_certificate_chain_pairs, + root_certificates=None, + require_client_auth=False, +): + """Creates a ServerCredentials for use with an SSL-enabled Server. + + Args: + private_key_certificate_chain_pairs: A list of pairs of the form + [PEM-encoded private key, PEM-encoded certificate chain]. + root_certificates: An optional byte string of PEM-encoded client root + certificates that the server will use to verify client authentication. + If omitted, require_client_auth must also be False. + require_client_auth: A boolean indicating whether or not to require + clients to be authenticated. May only be True if root_certificates + is not None. + + Returns: + A ServerCredentials for use with an SSL-enabled Server. Typically, this + object is an argument to add_secure_port() method during server setup. + """ + if not private_key_certificate_chain_pairs: + raise ValueError( + "At least one private key-certificate chain pair is required!" + ) + elif require_client_auth and root_certificates is None: + raise ValueError( + "Illegal to require client auth without providing root" + " certificates!" + ) + else: + return ServerCredentials( + _cygrpc.server_credentials_ssl( + root_certificates, + [ + _cygrpc.SslPemKeyCertPair(key, pem) + for key, pem in private_key_certificate_chain_pairs + ], + require_client_auth, + ) + ) + + +def xds_server_credentials(fallback_credentials): + """Creates a ServerCredentials for use with xDS. This is an EXPERIMENTAL + API. + + Args: + fallback_credentials: Credentials to use in case it is not possible to + establish a secure connection via xDS. No default value is provided. + """ + return ServerCredentials( + _cygrpc.xds_server_credentials(fallback_credentials._credentials) + ) + + +def insecure_server_credentials(): + """Creates a credentials object directing the server to use no credentials. + This is an EXPERIMENTAL API. + + This object cannot be used directly in a call to `add_secure_port`. + Instead, it should be used to construct other credentials objects, e.g. + with xds_server_credentials. + """ + return ServerCredentials(_cygrpc.insecure_server_credentials()) + + +def ssl_server_certificate_configuration( + private_key_certificate_chain_pairs, root_certificates=None +): + """Creates a ServerCertificateConfiguration for use with a Server. + + Args: + private_key_certificate_chain_pairs: A collection of pairs of + the form [PEM-encoded private key, PEM-encoded certificate + chain]. + root_certificates: An optional byte string of PEM-encoded client root + certificates that the server will use to verify client authentication. + + Returns: + A ServerCertificateConfiguration that can be returned in the certificate + configuration fetching callback. + """ + if private_key_certificate_chain_pairs: + return ServerCertificateConfiguration( + _cygrpc.server_certificate_config_ssl( + root_certificates, + [ + _cygrpc.SslPemKeyCertPair(key, pem) + for key, pem in private_key_certificate_chain_pairs + ], + ) + ) + else: + raise ValueError( + "At least one private key-certificate chain pair is required!" + ) + + +def dynamic_ssl_server_credentials( + initial_certificate_configuration, + certificate_configuration_fetcher, + require_client_authentication=False, +): + """Creates a ServerCredentials for use with an SSL-enabled Server. + + Args: + initial_certificate_configuration (ServerCertificateConfiguration): The + certificate configuration with which the server will be initialized. + certificate_configuration_fetcher (callable): A callable that takes no + arguments and should return a ServerCertificateConfiguration to + replace the server's current certificate, or None for no change + (i.e., the server will continue its current certificate + config). The library will call this callback on *every* new + client connection before starting the TLS handshake with the + client, thus allowing the user application to optionally + return a new ServerCertificateConfiguration that the server will then + use for the handshake. + require_client_authentication: A boolean indicating whether or not to + require clients to be authenticated. + + Returns: + A ServerCredentials. + """ + return ServerCredentials( + _cygrpc.server_credentials_ssl_dynamic_cert_config( + initial_certificate_configuration, + certificate_configuration_fetcher, + require_client_authentication, + ) + ) + + +@enum.unique +class LocalConnectionType(enum.Enum): + """Types of local connection for local credential creation. + + Attributes: + UDS: Unix domain socket connections + LOCAL_TCP: Local TCP connections. + """ + + UDS = _cygrpc.LocalConnectionType.uds + LOCAL_TCP = _cygrpc.LocalConnectionType.local_tcp + + +def local_channel_credentials(local_connect_type=LocalConnectionType.LOCAL_TCP): + """Creates a local ChannelCredentials used for local connections. + + This is an EXPERIMENTAL API. + + Local credentials are used by local TCP endpoints (e.g. localhost:10000) + also UDS connections. + + The connections created by local channel credentials are not + encrypted, but will be checked if they are local or not. + The UDS connections are considered secure by providing peer authentication + and data confidentiality while TCP connections are considered insecure. + + It is allowed to transmit call credentials over connections created by + local channel credentials. + + Local channel credentials are useful for 1) eliminating insecure_channel usage; + 2) enable unit testing for call credentials without setting up secrets. + + Args: + local_connect_type: Local connection type (either + grpc.LocalConnectionType.UDS or grpc.LocalConnectionType.LOCAL_TCP) + + Returns: + A ChannelCredentials for use with a local Channel + """ + return ChannelCredentials( + _cygrpc.channel_credentials_local(local_connect_type.value) + ) + + +def local_server_credentials(local_connect_type=LocalConnectionType.LOCAL_TCP): + """Creates a local ServerCredentials used for local connections. + + This is an EXPERIMENTAL API. + + Local credentials are used by local TCP endpoints (e.g. localhost:10000) + also UDS connections. + + The connections created by local server credentials are not + encrypted, but will be checked if they are local or not. + The UDS connections are considered secure by providing peer authentication + and data confidentiality while TCP connections are considered insecure. + + It is allowed to transmit call credentials over connections created by local + server credentials. + + Local server credentials are useful for 1) eliminating insecure_channel usage; + 2) enable unit testing for call credentials without setting up secrets. + + Args: + local_connect_type: Local connection type (either + grpc.LocalConnectionType.UDS or grpc.LocalConnectionType.LOCAL_TCP) + + Returns: + A ServerCredentials for use with a local Server + """ + return ServerCredentials( + _cygrpc.server_credentials_local(local_connect_type.value) + ) + + +def alts_channel_credentials(service_accounts=None): + """Creates a ChannelCredentials for use with an ALTS-enabled Channel. + + This is an EXPERIMENTAL API. + ALTS credentials API can only be used in GCP environment as it relies on + handshaker service being available. For more info about ALTS see + https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security + + Args: + service_accounts: A list of server identities accepted by the client. + If target service accounts are provided and none of them matches the + peer identity of the server, handshake will fail. The arg can be empty + if the client does not have any information about trusted server + identity. + Returns: + A ChannelCredentials for use with an ALTS-enabled Channel + """ + return ChannelCredentials( + _cygrpc.channel_credentials_alts(service_accounts or []) + ) + + +def alts_server_credentials(): + """Creates a ServerCredentials for use with an ALTS-enabled connection. + + This is an EXPERIMENTAL API. + ALTS credentials API can only be used in GCP environment as it relies on + handshaker service being available. For more info about ALTS see + https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security + + Returns: + A ServerCredentials for use with an ALTS-enabled Server + """ + return ServerCredentials(_cygrpc.server_credentials_alts()) + + +def compute_engine_channel_credentials(call_credentials): + """Creates a compute engine channel credential. + + This credential can only be used in a GCP environment as it relies on + a handshaker service. For more info about ALTS, see + https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security + + This channel credential is expected to be used as part of a composite + credential in conjunction with a call credentials that authenticates the + VM's default service account. If used with any other sort of call + credential, the connection may suddenly and unexpectedly begin failing RPCs. + """ + return ChannelCredentials( + _cygrpc.channel_credentials_compute_engine( + call_credentials._credentials + ) + ) + + +def channel_ready_future(channel): + """Creates a Future that tracks when a Channel is ready. + + Cancelling the Future does not affect the channel's state machine. + It merely decouples the Future from channel state machine. + + Args: + channel: A Channel object. + + Returns: + A Future object that matures when the channel connectivity is + ChannelConnectivity.READY. + """ + from grpc import _utilities # pylint: disable=cyclic-import + + return _utilities.channel_ready_future(channel) + + +def insecure_channel(target, options=None, compression=None): + """Creates an insecure Channel to a server. + + The returned Channel is thread-safe. + + Args: + target: The server address + options: An optional list of key-value pairs (:term:`channel_arguments` + in gRPC Core runtime) to configure the channel. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel. + + Returns: + A Channel. + """ + from grpc import _channel # pylint: disable=cyclic-import + + return _channel.Channel( + target, () if options is None else options, None, compression + ) + + +def secure_channel(target, credentials, options=None, compression=None): + """Creates a secure Channel to a server. + + The returned Channel is thread-safe. + + Args: + target: The server address. + credentials: A ChannelCredentials instance. + options: An optional list of key-value pairs (:term:`channel_arguments` + in gRPC Core runtime) to configure the channel. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel. + + Returns: + A Channel. + """ + from grpc import _channel # pylint: disable=cyclic-import + from grpc.experimental import _insecure_channel_credentials + + if credentials._credentials is _insecure_channel_credentials: + raise ValueError( + "secure_channel cannot be called with insecure credentials." + + " Call insecure_channel instead." + ) + return _channel.Channel( + target, + () if options is None else options, + credentials._credentials, + compression, + ) + + +def intercept_channel(channel, *interceptors): + """Intercepts a channel through a set of interceptors. + + Args: + channel: A Channel. + interceptors: Zero or more objects of type + UnaryUnaryClientInterceptor, + UnaryStreamClientInterceptor, + StreamUnaryClientInterceptor, or + StreamStreamClientInterceptor. + Interceptors are given control in the order they are listed. + + Returns: + A Channel that intercepts each invocation via the provided interceptors. + + Raises: + TypeError: If interceptor does not derive from any of + UnaryUnaryClientInterceptor, + UnaryStreamClientInterceptor, + StreamUnaryClientInterceptor, or + StreamStreamClientInterceptor. + """ + from grpc import _interceptor # pylint: disable=cyclic-import + + return _interceptor.intercept_channel(channel, *interceptors) + + +def server( + thread_pool, + handlers=None, + interceptors=None, + options=None, + maximum_concurrent_rpcs=None, + compression=None, + xds=False, +): + """Creates a Server with which RPCs can be serviced. + + Args: + thread_pool: A futures.ThreadPoolExecutor to be used by the Server + to execute RPC handlers. + handlers: An optional list of GenericRpcHandlers used for executing RPCs. + More handlers may be added by calling add_generic_rpc_handlers any time + before the server is started. + interceptors: An optional list of ServerInterceptor objects that observe + and optionally manipulate the incoming RPCs before handing them over to + handlers. The interceptors are given control in the order they are + specified. This is an EXPERIMENTAL API. + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC runtime) + to configure the channel. + maximum_concurrent_rpcs: The maximum number of concurrent RPCs this server + will service before returning RESOURCE_EXHAUSTED status, or None to + indicate no limit. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. This compression algorithm will be used for the + lifetime of the server unless overridden. + xds: If set to true, retrieves server configuration via xDS. This is an + EXPERIMENTAL option. + + Returns: + A Server object. + """ + from grpc import _server # pylint: disable=cyclic-import + + return _server.create_server( + thread_pool, + () if handlers is None else handlers, + () if interceptors is None else interceptors, + () if options is None else options, + maximum_concurrent_rpcs, + compression, + xds, + ) + + +@contextlib.contextmanager +def _create_servicer_context(rpc_event, state, request_deserializer): + from grpc import _server # pylint: disable=cyclic-import + + context = _server._Context(rpc_event, state, request_deserializer) + yield context + context._finalize_state() # pylint: disable=protected-access + + +@enum.unique +class Compression(enum.IntEnum): + """Indicates the compression method to be used for an RPC. + + Attributes: + NoCompression: Do not use compression algorithm. + Deflate: Use "Deflate" compression algorithm. + Gzip: Use "Gzip" compression algorithm. + """ + + NoCompression = _compression.NoCompression + Deflate = _compression.Deflate + Gzip = _compression.Gzip + + +################################### __all__ ################################# + +__all__ = ( + "FutureTimeoutError", + "FutureCancelledError", + "Future", + "ChannelConnectivity", + "StatusCode", + "Status", + "RpcError", + "RpcContext", + "Call", + "ChannelCredentials", + "CallCredentials", + "AuthMetadataContext", + "AuthMetadataPluginCallback", + "AuthMetadataPlugin", + "Compression", + "ClientCallDetails", + "ServerCertificateConfiguration", + "ServerCredentials", + "LocalConnectionType", + "UnaryUnaryMultiCallable", + "UnaryStreamMultiCallable", + "StreamUnaryMultiCallable", + "StreamStreamMultiCallable", + "UnaryUnaryClientInterceptor", + "UnaryStreamClientInterceptor", + "StreamUnaryClientInterceptor", + "StreamStreamClientInterceptor", + "Channel", + "ServicerContext", + "RpcMethodHandler", + "HandlerCallDetails", + "GenericRpcHandler", + "ServiceRpcHandler", + "Server", + "ServerInterceptor", + "unary_unary_rpc_method_handler", + "unary_stream_rpc_method_handler", + "stream_unary_rpc_method_handler", + "stream_stream_rpc_method_handler", + "method_handlers_generic_handler", + "ssl_channel_credentials", + "metadata_call_credentials", + "access_token_call_credentials", + "composite_call_credentials", + "composite_channel_credentials", + "compute_engine_channel_credentials", + "local_channel_credentials", + "local_server_credentials", + "alts_channel_credentials", + "alts_server_credentials", + "ssl_server_credentials", + "ssl_server_certificate_configuration", + "dynamic_ssl_server_credentials", + "channel_ready_future", + "insecure_channel", + "secure_channel", + "intercept_channel", + "server", + "protos", + "services", + "protos_and_services", + "xds_channel_credentials", + "xds_server_credentials", + "insecure_server_credentials", +) + +############################### Extension Shims ################################ + +# Here to maintain backwards compatibility; avoid using these in new code! +try: + import grpc_tools + + sys.modules.update({"grpc.tools": grpc_tools}) +except ImportError: + pass +try: + import grpc_health + + sys.modules.update({"grpc.health": grpc_health}) +except ImportError: + pass +try: + import grpc_reflection + + sys.modules.update({"grpc.reflection": grpc_reflection}) +except ImportError: + pass + +# Prevents import order issue in the case of renamed path. +if sys.version_info >= (3, 6) and __name__ == "grpc": + from grpc import aio # pylint: disable=ungrouped-imports + + sys.modules.update({"grpc.aio": aio}) diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca709a766934be913cf5fddce13e930298175653 GIT binary patch literal 91331 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/_auth.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/_auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b103fdeb5a3a0b4a221284442f4f0068e0be08d5 GIT binary patch literal 3185 zcma)8-EZ606~Fw_hecVjT)RzXM@;M_W1Cos?XFqkWsv1AF1otGwhXIYIEJKDDio<+ zQgP(TL$Gx~HlV2YaP}VMF$^b4W>+Trb@PczDkJ z;<@Mk&hPN^WO9T+`%C5LrME$QhDNVNyGrK?DBDCQ1)?)LYcT}|-kil&xB^$<3p^9{ z3k5;v4WTUdHaL9ig25ZnlhC0@K#QSPjOfu1`9ho}H;Eqmkmzw(`_kc>p7xjvwL&78 zIRY~i-!fCIv$D9cc=IQ>^0}J#{yT=J>Z+&SvT7yMcBP_2CD&7JU8TCD!UV(iOilGn z$DaE;er!!{Ts4rm2>7N7e57g6G^dY+o=ab*R>LE^v_tiFW4(2nZMi ztIPx=L!!Yv?)DbhBD2Y{q(K^7gMG|~(-=}GGPmX@(KUyf8-ZsV@nu7$29{zyJEO^J*S$j zQm1TqIombwSVp!|H|%>^%e<4V*1-XLVeZO&)-^rjQWegxmJByrqE#)cpnr4Kx}Q{B zvt%pO_@HLE9!44_3eA#fQJx zsy*eWJ1~=ID0&UO$JQx>*d_)6(2)Xr8=_j^078P!F2RTq0gXcqpcg5!x&V-h0?1seh#D;3Q8*lbdB&}1mT7`>173gP zQTnIS8LyAOaxY^2Q3A8eh>RnxhrV*`$N-r40E-GjDrkU1cFiACb=?fpK+!DKthjQ7 zVs!l|WK-49Jb$!gc*UA!skDS0{t2)ZRnrXDRl;=Pafpt=D#$I~HLM~X2gAj)N)koR z@MDT%+NP%{8>f%GgSp-~0?Yj#hzDeE>cT_*ud$Qu7)eTBr6yacbIsJbox82`%gyu4 zyQzFDwc1RrwmByG7SrZPJo%AGNAYV>&9Ob>z87TBP#$B;AUJ~laf_W%FN3AZu}IO_v!u0pF6N!G#A{p|3!P zp8yKFXKIF0qn0lY0wiD!KmO)@%?K!07U(HhL8njz94FxhaicfE#ZKh6L+~I)zX&|x zcox>VAA>+@6606*QsW;t{?ORV%(OC>o0-e4Os<*9?Y}bpXuXx0Z)WD(9D89Bpd&3a z9l}fLf5pgn=8qS@j+3$Jwn(Je!F9Wtd@FOSnYpzk9sndyJ^Jp>kDtsw72o*xL6n?0 z`47UxU;j!x3EeAyl3U_pQ(XKHfHVI3a~C7@o7_xpfqc3UUmoW^T}m#Ga-WR~ps&dy zriZOo3`Oxr6s6+mH4Al7Q9h`tR(B+-D7vFTH-E=*EI*|vs%<-7P(fTpp$KdG9S}Z` z9PW?jfTViNmJbucKQ-7H7ENSBtbTL`)_y{Q3<{E#p1>VZWZ-ds2;z6-Oa9&c+9qbW(^YSGK|S=m>d%5 zgA5wn?8f;Qdfq3|Ra}gJe?X$s@{J-~e##AzBBop5+&n1T#Owdq0GS+1gTn+v zaT)lHKL_C%xFZSf;_kh44siDECkZq9ZCL2yAIAf7Fhb&!Tkr4iEor_f%|BUr8vA~5 zsx>)5XYt$TP+$R}7eM$N{IF0NP0R}VDvH-oTtqR0;t~oh86n`2KPZYkJnl6R2>7M_ z@yT6&vduHXt2;mK5O}pCf^cmB>tGFG9qe#h+)Pde{!l!IAMxr{(=LVCiog&33S3%5 z^9%|MrJw#LHp7$*+#GiOd2A`9jT`h0Sc^C47C`|2FwECegt`8VjQ)*C&q$&ji7==4 zM$@g)OU=>B;FjpU~w5ArCQws+KjDuAs V$z0o6Y0X}5&R+i~0V6o;e*p|;#UTIy literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/_channel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/_channel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d86f5c3539baa028408fa2425e363f979e952b97 GIT binary patch literal 98532 zcmeFa33OZ6nI`x^0K`s!BuH>4xJld>ky@;sA}LuLh2f%{+SMSk)m&&Cx8 z$E|QdZkP)if;p3hVFUZk8O~w9#$hA-H4U5CuX)(aeshO&*{@~T!hWs8R{R<#ZBzDP z`;=qYG36X~PPv9%Q+dOAQ|@8+lxNs8l|P(6RWMvIRXAK|5X76PXE@EM3 z_=|^&nLihP->{GQE%28NmoUF|vUI9!xQzL2ljTzt!xhYLhre>TlKCC*R}EJ&zZ3rI z;cDi0!S5gTGk+fZHN!Q`?}op2xR&`n@YfC3F@Mfv{jfKO3mGR)$epMDhPJ(J5Z{Kk z2lFRBqkfTnA>YJV*{}X8shWd^;TGg>n)tl>RrUo7>D!$OI|Y#9|)Er z#5=K|&LG*x;+Ns;At~jdvD{!e(j3m=j&Z??*SKJ1sP}E77=QRkuqt#USgoH|uq<>a z=nLkIS%ZG$&=;&h4=u?hslP0bT9jESm6;dvlMm_YkZvI3dmZXjk1t1q4Ivl%x-C?Q zyuYpHDfeyc=%g&zDlN)kGfOOA%IN@d8V(-Rv_R@7tj$CC_ADEZ!x)cVwCT277xhV!|MM)xQ%La{O^R{E7{@5) zg&e5I9l3P%_X03C%?Ox+XOY(nEY&&v6u}{k>LcYQLAR%o<0Q-RvyYWBH~2ZEoMI_I zkGia@wU&LsXE5JI7&?r&Gc4}253gPD3re~#BHhJDPDf?s2ET+fUk(P)nhLg3p2K|g zPJAfWO8sSDX$`S>NI8O(;ox~Wgh2x7s~je+M^kVVaU*P0gBaD2eh(-!W_m8CX>7jz z`1Ff2qa%^=nd!FhcrfH2pSn01nhH%vSeSoi%zxqRQ+@uY<|5C}Ot=3vRduk*o-p=K z&n2vVBa@RO=O;r6Q~&sABw;-s3GpM589re;H6F(MnTwS1$YjELF7)Nu(DZ01VLTU# zB+NszC?#QjdK#ab3<*nMbY^Obd7b3F$cMsV@slTTfxkF9J`2OGn zc22h#%hM=+Xyn3t9@Vq$BJ0kMR~8dB$I!ijbH@jdof-%XJ$ZJZw|}5N@bqBs*=GXh zhVXiNzH{K^(GcrN|0oJa{r#h2BmLpo^Wjl`T>VHjtC>Hv|CL1=IvTmi^CJ;I#${@J zni}bUX*}}$Ub`)f0iF%}5BOhMwA+Gc>i8tR)xNS=Yd<(Y{L5v44A0MA2!wckh7W`z zJXKlFJ7I~8PlaY?BZ*u-6q)6xMRKo5Tg|0Yf3NRXXJ4hu77TAosm^gtIfL`9 zn42$#cz+n{!Y>u(r&2Hp{3FvrzdR3U7N7@n$7cAckw{YxUyp401~_5L(C_DK@RKMC zC^beVXg8Zhd?UVnnc|AgPUdpXy)nmO!ErclEnofIhB3#Po8)rLxqKaBjpD!ZfI+~X zjb$`wg$r?D5pcsfPZLRORbnZg5Eume@fOMrStdM6u;L+bia0qejxA)D-i_?tfiI@C zFJ|f8IZ>u$qIjg#xl)`w>D`j{Ze{OoK*iwpu`LA)q#d8Hsg_zs`Ddzw> zLJ8aG%ye*^plHGvoDC&BnN$FE!U`zPKw~05!UMhl3aB4VH1F7yN)%*53*

    jJH&~#9I%f)u_{7f*BiwGA& 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 Xmg=9yru#(fm9vv)Kemvct#tn{jSkK- literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/_common.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/_common.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f2ba35fbe1ab268aeb0d7ebb890146a2f7b7002 GIT binary patch literal 9187 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 YjyIz-EspU^sW#)SaX#exT=c^K7wy;7AOHXW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/_grpcio_metadata.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/_grpcio_metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40743b1dfd8fccabbb47c2497332503294d1e22f GIT binary patch literal 230 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/_observability.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/_observability.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e4755693e8b447e5c306b6d5a08387784ed365c GIT binary patch literal 12724 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/_plugin_wrapping.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/_plugin_wrapping.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04473b1e9a397c142f2a65c6b58b072d1c3ddb1b GIT binary patch literal 5746 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 RE-)5)i$d?F06o-y{2yqWjV}NI literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/_runtime_protos.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/_runtime_protos.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11faa412511dc009ddaff7131e935e8e922c4ef8 GIT binary patch literal 6051 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≠B`*o}2 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 X%GQgKiZc(BRJ9g}k}30{%#18c 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 G`TqiX;EqKA literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/__pycache__/_typing.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/__pycache__/_typing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66328e97f746527b471c421d8557b578a57b31b1 GIT binary patch literal 2259 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 H<^TTx>Fb+N literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/_auth.py b/myenv/lib/python3.12/site-packages/grpc/_auth.py new file mode 100644 index 0000000..9cef38b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_auth.py @@ -0,0 +1,80 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""GRPCAuthMetadataPlugins for standard authentication.""" + +import inspect +from typing import Any, Optional + +import grpc + + +def _sign_request( + callback: grpc.AuthMetadataPluginCallback, + token: Optional[str], + error: Optional[Exception], +): + metadata = (("authorization", "Bearer {}".format(token)),) + callback(metadata, error) + + +class GoogleCallCredentials(grpc.AuthMetadataPlugin): + """Metadata wrapper for GoogleCredentials from the oauth2client library.""" + + _is_jwt: bool + _credentials: Any + + # TODO(xuanwn): Give credentials an actual type. + def __init__(self, credentials: Any): + self._credentials = credentials + # Hack to determine if these are JWT creds and we need to pass + # additional_claims when getting a token + self._is_jwt = ( + "additional_claims" + in inspect.getfullargspec(credentials.get_access_token).args + ) + + def __call__( + self, + context: grpc.AuthMetadataContext, + callback: grpc.AuthMetadataPluginCallback, + ): + try: + if self._is_jwt: + access_token = self._credentials.get_access_token( + additional_claims={ + "aud": context.service_url # pytype: disable=attribute-error + } + ).access_token + else: + access_token = self._credentials.get_access_token().access_token + except Exception as exception: # pylint: disable=broad-except + _sign_request(callback, None, exception) + else: + _sign_request(callback, access_token, None) + + +class AccessTokenAuthMetadataPlugin(grpc.AuthMetadataPlugin): + """Metadata wrapper for raw access token credentials.""" + + _access_token: str + + def __init__(self, access_token: str): + self._access_token = access_token + + def __call__( + self, + context: grpc.AuthMetadataContext, + callback: grpc.AuthMetadataPluginCallback, + ): + _sign_request(callback, self._access_token, None) diff --git a/myenv/lib/python3.12/site-packages/grpc/_channel.py b/myenv/lib/python3.12/site-packages/grpc/_channel.py new file mode 100644 index 0000000..bf29982 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_channel.py @@ -0,0 +1,2267 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Invocation-side implementation of gRPC Python.""" + +import copy +import functools +import logging +import os +import sys +import threading +import time +import types +from typing import ( + Any, + Callable, + Dict, + Iterator, + List, + Optional, + Sequence, + Set, + Tuple, + Union, +) + +import grpc # pytype: disable=pyi-error +from grpc import _common # pytype: disable=pyi-error +from grpc import _compression # pytype: disable=pyi-error +from grpc import _grpcio_metadata # pytype: disable=pyi-error +from grpc import _observability # pytype: disable=pyi-error +from grpc._cython import cygrpc +from grpc._typing import ChannelArgumentType +from grpc._typing import DeserializingFunction +from grpc._typing import IntegratedCallFactory +from grpc._typing import MetadataType +from grpc._typing import NullaryCallbackType +from grpc._typing import ResponseType +from grpc._typing import SerializingFunction +from grpc._typing import UserTag +import grpc.experimental # pytype: disable=pyi-error + +_LOGGER = logging.getLogger(__name__) + +_USER_AGENT = "grpc-python/{}".format(_grpcio_metadata.__version__) + +_EMPTY_FLAGS = 0 + +# NOTE(rbellevi): No guarantees are given about the maintenance of this +# environment variable. +_DEFAULT_SINGLE_THREADED_UNARY_STREAM = ( + os.getenv("GRPC_SINGLE_THREADED_UNARY_STREAM") is not None +) + +_UNARY_UNARY_INITIAL_DUE = ( + cygrpc.OperationType.send_initial_metadata, + cygrpc.OperationType.send_message, + cygrpc.OperationType.send_close_from_client, + cygrpc.OperationType.receive_initial_metadata, + cygrpc.OperationType.receive_message, + cygrpc.OperationType.receive_status_on_client, +) +_UNARY_STREAM_INITIAL_DUE = ( + cygrpc.OperationType.send_initial_metadata, + cygrpc.OperationType.send_message, + cygrpc.OperationType.send_close_from_client, + cygrpc.OperationType.receive_initial_metadata, + cygrpc.OperationType.receive_status_on_client, +) +_STREAM_UNARY_INITIAL_DUE = ( + cygrpc.OperationType.send_initial_metadata, + cygrpc.OperationType.receive_initial_metadata, + cygrpc.OperationType.receive_message, + cygrpc.OperationType.receive_status_on_client, +) +_STREAM_STREAM_INITIAL_DUE = ( + cygrpc.OperationType.send_initial_metadata, + cygrpc.OperationType.receive_initial_metadata, + cygrpc.OperationType.receive_status_on_client, +) + +_CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE = ( + "Exception calling channel subscription callback!" +) + +_OK_RENDEZVOUS_REPR_FORMAT = ( + '<{} of RPC that terminated with:\n\tstatus = {}\n\tdetails = "{}"\n>' +) + +_NON_OK_RENDEZVOUS_REPR_FORMAT = ( + "<{} of RPC that terminated with:\n" + "\tstatus = {}\n" + '\tdetails = "{}"\n' + '\tdebug_error_string = "{}"\n' + ">" +) + + +def _deadline(timeout: Optional[float]) -> Optional[float]: + return None if timeout is None else time.time() + timeout + + +def _unknown_code_details( + unknown_cygrpc_code: Optional[grpc.StatusCode], details: Optional[str] +) -> str: + return 'Server sent unknown code {} and details "{}"'.format( + unknown_cygrpc_code, details + ) + + +class _RPCState(object): + condition: threading.Condition + due: Set[cygrpc.OperationType] + initial_metadata: Optional[MetadataType] + response: Any + trailing_metadata: Optional[MetadataType] + code: Optional[grpc.StatusCode] + details: Optional[str] + debug_error_string: Optional[str] + cancelled: bool + callbacks: List[NullaryCallbackType] + fork_epoch: Optional[int] + rpc_start_time: Optional[float] # In relative seconds + rpc_end_time: Optional[float] # In relative seconds + method: Optional[str] + target: Optional[str] + + def __init__( + self, + due: Sequence[cygrpc.OperationType], + initial_metadata: Optional[MetadataType], + trailing_metadata: Optional[MetadataType], + code: Optional[grpc.StatusCode], + details: Optional[str], + ): + # `condition` guards all members of _RPCState. `notify_all` is called on + # `condition` when the state of the RPC has changed. + self.condition = threading.Condition() + + # The cygrpc.OperationType objects representing events due from the RPC's + # completion queue. If an operation is in `due`, it is guaranteed that + # `operate()` has been called on a corresponding operation. But the + # converse is not true. That is, in the case of failed `operate()` + # calls, there may briefly be events in `due` that do not correspond to + # operations submitted to Core. + self.due = set(due) + self.initial_metadata = initial_metadata + self.response = None + self.trailing_metadata = trailing_metadata + self.code = code + self.details = details + self.debug_error_string = None + # The following three fields are used for observability. + # Updates to those fields do not trigger self.condition. + self.rpc_start_time = None + self.rpc_end_time = None + self.method = None + self.target = None + + # The semantics of grpc.Future.cancel and grpc.Future.cancelled are + # slightly wonky, so they have to be tracked separately from the rest of the + # result of the RPC. This field tracks whether cancellation was requested + # prior to termination of the RPC. + self.cancelled = False + self.callbacks = [] + self.fork_epoch = cygrpc.get_fork_epoch() + + def reset_postfork_child(self): + self.condition = threading.Condition() + + +def _abort(state: _RPCState, code: grpc.StatusCode, details: str) -> None: + if state.code is None: + state.code = code + state.details = details + if state.initial_metadata is None: + state.initial_metadata = () + state.trailing_metadata = () + + +def _handle_event( + event: cygrpc.BaseEvent, + state: _RPCState, + response_deserializer: Optional[DeserializingFunction], +) -> List[NullaryCallbackType]: + callbacks = [] + for batch_operation in event.batch_operations: + operation_type = batch_operation.type() + state.due.remove(operation_type) + if operation_type == cygrpc.OperationType.receive_initial_metadata: + state.initial_metadata = batch_operation.initial_metadata() + elif operation_type == cygrpc.OperationType.receive_message: + serialized_response = batch_operation.message() + if serialized_response is not None: + response = _common.deserialize( + serialized_response, response_deserializer + ) + if response is None: + details = "Exception deserializing response!" + _abort(state, grpc.StatusCode.INTERNAL, details) + else: + state.response = response + elif operation_type == cygrpc.OperationType.receive_status_on_client: + state.trailing_metadata = batch_operation.trailing_metadata() + if state.code is None: + code = _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE.get( + batch_operation.code() + ) + if code is None: + state.code = grpc.StatusCode.UNKNOWN + state.details = _unknown_code_details( + code, batch_operation.details() + ) + else: + state.code = code + state.details = batch_operation.details() + state.debug_error_string = batch_operation.error_string() + state.rpc_end_time = time.perf_counter() + _observability.maybe_record_rpc_latency(state) + callbacks.extend(state.callbacks) + state.callbacks = None + return callbacks + + +def _event_handler( + state: _RPCState, response_deserializer: Optional[DeserializingFunction] +) -> UserTag: + def handle_event(event): + with state.condition: + callbacks = _handle_event(event, state, response_deserializer) + state.condition.notify_all() + done = not state.due + for callback in callbacks: + try: + callback() + except Exception as e: # pylint: disable=broad-except + # NOTE(rbellevi): We suppress but log errors here so as not to + # kill the channel spin thread. + logging.error( + "Exception in callback %s: %s", repr(callback.func), repr(e) + ) + return done and state.fork_epoch >= cygrpc.get_fork_epoch() + + return handle_event + + +# TODO(xuanwn): Create a base class for IntegratedCall and SegregatedCall. +# pylint: disable=too-many-statements +def _consume_request_iterator( + request_iterator: Iterator, + state: _RPCState, + call: Union[cygrpc.IntegratedCall, cygrpc.SegregatedCall], + request_serializer: SerializingFunction, + event_handler: Optional[UserTag], +) -> None: + """Consume a request supplied by the user.""" + + def consume_request_iterator(): # pylint: disable=too-many-branches + # Iterate over the request iterator until it is exhausted or an error + # condition is encountered. + while True: + return_from_user_request_generator_invoked = False + try: + # The thread may die in user-code. Do not block fork for this. + cygrpc.enter_user_request_generator() + request = next(request_iterator) + except StopIteration: + break + except Exception: # pylint: disable=broad-except + cygrpc.return_from_user_request_generator() + return_from_user_request_generator_invoked = True + code = grpc.StatusCode.UNKNOWN + details = "Exception iterating requests!" + _LOGGER.exception(details) + call.cancel( + _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE[code], details + ) + _abort(state, code, details) + return + finally: + if not return_from_user_request_generator_invoked: + cygrpc.return_from_user_request_generator() + serialized_request = _common.serialize(request, request_serializer) + with state.condition: + if state.code is None and not state.cancelled: + if serialized_request is None: + code = grpc.StatusCode.INTERNAL + details = "Exception serializing request!" + call.cancel( + _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE[code], + details, + ) + _abort(state, code, details) + return + else: + state.due.add(cygrpc.OperationType.send_message) + operations = ( + cygrpc.SendMessageOperation( + serialized_request, _EMPTY_FLAGS + ), + ) + operating = call.operate(operations, event_handler) + if not operating: + state.due.remove(cygrpc.OperationType.send_message) + return + + def _done(): + return ( + state.code is not None + or cygrpc.OperationType.send_message + not in state.due + ) + + _common.wait( + state.condition.wait, + _done, + spin_cb=functools.partial( + cygrpc.block_if_fork_in_progress, state + ), + ) + if state.code is not None: + return + else: + return + with state.condition: + if state.code is None: + state.due.add(cygrpc.OperationType.send_close_from_client) + operations = ( + cygrpc.SendCloseFromClientOperation(_EMPTY_FLAGS), + ) + operating = call.operate(operations, event_handler) + if not operating: + state.due.remove( + cygrpc.OperationType.send_close_from_client + ) + + consumption_thread = cygrpc.ForkManagedThread( + target=consume_request_iterator + ) + consumption_thread.setDaemon(True) + consumption_thread.start() + + +def _rpc_state_string(class_name: str, rpc_state: _RPCState) -> str: + """Calculates error string for RPC.""" + with rpc_state.condition: + if rpc_state.code is None: + return "<{} object>".format(class_name) + elif rpc_state.code is grpc.StatusCode.OK: + return _OK_RENDEZVOUS_REPR_FORMAT.format( + class_name, rpc_state.code, rpc_state.details + ) + else: + return _NON_OK_RENDEZVOUS_REPR_FORMAT.format( + class_name, + rpc_state.code, + rpc_state.details, + rpc_state.debug_error_string, + ) + + +class _InactiveRpcError(grpc.RpcError, grpc.Call, grpc.Future): + """An RPC error not tied to the execution of a particular RPC. + + The RPC represented by the state object must not be in-progress or + cancelled. + + Attributes: + _state: An instance of _RPCState. + """ + + _state: _RPCState + + def __init__(self, state: _RPCState): + with state.condition: + self._state = _RPCState( + (), + copy.deepcopy(state.initial_metadata), + copy.deepcopy(state.trailing_metadata), + state.code, + copy.deepcopy(state.details), + ) + self._state.response = copy.copy(state.response) + self._state.debug_error_string = copy.copy(state.debug_error_string) + + def initial_metadata(self) -> Optional[MetadataType]: + return self._state.initial_metadata + + def trailing_metadata(self) -> Optional[MetadataType]: + return self._state.trailing_metadata + + def code(self) -> Optional[grpc.StatusCode]: + return self._state.code + + def details(self) -> Optional[str]: + return _common.decode(self._state.details) + + def debug_error_string(self) -> Optional[str]: + return _common.decode(self._state.debug_error_string) + + def _repr(self) -> str: + return _rpc_state_string(self.__class__.__name__, self._state) + + def __repr__(self) -> str: + return self._repr() + + def __str__(self) -> str: + return self._repr() + + def cancel(self) -> bool: + """See grpc.Future.cancel.""" + return False + + def cancelled(self) -> bool: + """See grpc.Future.cancelled.""" + return False + + def running(self) -> bool: + """See grpc.Future.running.""" + return False + + def done(self) -> bool: + """See grpc.Future.done.""" + return True + + def result( + self, timeout: Optional[float] = None + ) -> Any: # pylint: disable=unused-argument + """See grpc.Future.result.""" + raise self + + def exception( + self, timeout: Optional[float] = None # pylint: disable=unused-argument + ) -> Optional[Exception]: + """See grpc.Future.exception.""" + return self + + def traceback( + self, timeout: Optional[float] = None # pylint: disable=unused-argument + ) -> Optional[types.TracebackType]: + """See grpc.Future.traceback.""" + try: + raise self + except grpc.RpcError: + return sys.exc_info()[2] + + def add_done_callback( + self, + fn: Callable[[grpc.Future], None], + timeout: Optional[float] = None, # pylint: disable=unused-argument + ) -> None: + """See grpc.Future.add_done_callback.""" + fn(self) + + +class _Rendezvous(grpc.RpcError, grpc.RpcContext): + """An RPC iterator. + + Attributes: + _state: An instance of _RPCState. + _call: An instance of SegregatedCall or IntegratedCall. + In either case, the _call object is expected to have operate, cancel, + and next_event methods. + _response_deserializer: A callable taking bytes and return a Python + object. + _deadline: A float representing the deadline of the RPC in seconds. Or + possibly None, to represent an RPC with no deadline at all. + """ + + _state: _RPCState + _call: Union[cygrpc.SegregatedCall, cygrpc.IntegratedCall] + _response_deserializer: Optional[DeserializingFunction] + _deadline: Optional[float] + + def __init__( + self, + state: _RPCState, + call: Union[cygrpc.SegregatedCall, cygrpc.IntegratedCall], + response_deserializer: Optional[DeserializingFunction], + deadline: Optional[float], + ): + super(_Rendezvous, self).__init__() + self._state = state + self._call = call + self._response_deserializer = response_deserializer + self._deadline = deadline + + def is_active(self) -> bool: + """See grpc.RpcContext.is_active""" + with self._state.condition: + return self._state.code is None + + def time_remaining(self) -> Optional[float]: + """See grpc.RpcContext.time_remaining""" + with self._state.condition: + if self._deadline is None: + return None + else: + return max(self._deadline - time.time(), 0) + + def cancel(self) -> bool: + """See grpc.RpcContext.cancel""" + with self._state.condition: + if self._state.code is None: + code = grpc.StatusCode.CANCELLED + details = "Locally cancelled by application!" + self._call.cancel( + _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE[code], details + ) + self._state.cancelled = True + _abort(self._state, code, details) + self._state.condition.notify_all() + return True + else: + return False + + def add_callback(self, callback: NullaryCallbackType) -> bool: + """See grpc.RpcContext.add_callback""" + with self._state.condition: + if self._state.callbacks is None: + return False + else: + self._state.callbacks.append(callback) + return True + + def __iter__(self): + return self + + def next(self): + return self._next() + + def __next__(self): + return self._next() + + def _next(self): + raise NotImplementedError() + + def debug_error_string(self) -> Optional[str]: + raise NotImplementedError() + + def _repr(self) -> str: + return _rpc_state_string(self.__class__.__name__, self._state) + + def __repr__(self) -> str: + return self._repr() + + def __str__(self) -> str: + return self._repr() + + def __del__(self) -> None: + with self._state.condition: + if self._state.code is None: + self._state.code = grpc.StatusCode.CANCELLED + self._state.details = "Cancelled upon garbage collection!" + self._state.cancelled = True + self._call.cancel( + _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE[self._state.code], + self._state.details, + ) + self._state.condition.notify_all() + + +class _SingleThreadedRendezvous( + _Rendezvous, grpc.Call, grpc.Future +): # pylint: disable=too-many-ancestors + """An RPC iterator operating entirely on a single thread. + + The __next__ method of _SingleThreadedRendezvous does not depend on the + existence of any other thread, including the "channel spin thread". + However, this means that its interface is entirely synchronous. So this + class cannot completely fulfill the grpc.Future interface. The result, + exception, and traceback methods will never block and will instead raise + an exception if calling the method would result in blocking. + + This means that these methods are safe to call from add_done_callback + handlers. + """ + + _state: _RPCState + + def _is_complete(self) -> bool: + return self._state.code is not None + + def cancelled(self) -> bool: + with self._state.condition: + return self._state.cancelled + + def running(self) -> bool: + with self._state.condition: + return self._state.code is None + + def done(self) -> bool: + with self._state.condition: + return self._state.code is not None + + def result(self, timeout: Optional[float] = None) -> Any: + """Returns the result of the computation or raises its exception. + + This method will never block. Instead, it will raise an exception + if calling this method would otherwise result in blocking. + + Since this method will never block, any `timeout` argument passed will + be ignored. + """ + del timeout + with self._state.condition: + if not self._is_complete(): + raise grpc.experimental.UsageError( + "_SingleThreadedRendezvous only supports result() when the" + " RPC is complete." + ) + if self._state.code is grpc.StatusCode.OK: + return self._state.response + elif self._state.cancelled: + raise grpc.FutureCancelledError() + else: + raise self + + def exception(self, timeout: Optional[float] = None) -> Optional[Exception]: + """Return the exception raised by the computation. + + This method will never block. Instead, it will raise an exception + if calling this method would otherwise result in blocking. + + Since this method will never block, any `timeout` argument passed will + be ignored. + """ + del timeout + with self._state.condition: + if not self._is_complete(): + raise grpc.experimental.UsageError( + "_SingleThreadedRendezvous only supports exception() when" + " the RPC is complete." + ) + if self._state.code is grpc.StatusCode.OK: + return None + elif self._state.cancelled: + raise grpc.FutureCancelledError() + else: + return self + + def traceback( + self, timeout: Optional[float] = None + ) -> Optional[types.TracebackType]: + """Access the traceback of the exception raised by the computation. + + This method will never block. Instead, it will raise an exception + if calling this method would otherwise result in blocking. + + Since this method will never block, any `timeout` argument passed will + be ignored. + """ + del timeout + with self._state.condition: + if not self._is_complete(): + raise grpc.experimental.UsageError( + "_SingleThreadedRendezvous only supports traceback() when" + " the RPC is complete." + ) + if self._state.code is grpc.StatusCode.OK: + return None + elif self._state.cancelled: + raise grpc.FutureCancelledError() + else: + try: + raise self + except grpc.RpcError: + return sys.exc_info()[2] + + def add_done_callback(self, fn: Callable[[grpc.Future], None]) -> None: + with self._state.condition: + if self._state.code is None: + self._state.callbacks.append(functools.partial(fn, self)) + return + + fn(self) + + def initial_metadata(self) -> Optional[MetadataType]: + """See grpc.Call.initial_metadata""" + with self._state.condition: + # NOTE(gnossen): Based on our initial call batch, we are guaranteed + # to receive initial metadata before any messages. + while self._state.initial_metadata is None: + self._consume_next_event() + return self._state.initial_metadata + + def trailing_metadata(self) -> Optional[MetadataType]: + """See grpc.Call.trailing_metadata""" + with self._state.condition: + if self._state.trailing_metadata is None: + raise grpc.experimental.UsageError( + "Cannot get trailing metadata until RPC is completed." + ) + return self._state.trailing_metadata + + def code(self) -> Optional[grpc.StatusCode]: + """See grpc.Call.code""" + with self._state.condition: + if self._state.code is None: + raise grpc.experimental.UsageError( + "Cannot get code until RPC is completed." + ) + return self._state.code + + def details(self) -> Optional[str]: + """See grpc.Call.details""" + with self._state.condition: + if self._state.details is None: + raise grpc.experimental.UsageError( + "Cannot get details until RPC is completed." + ) + return _common.decode(self._state.details) + + def _consume_next_event(self) -> Optional[cygrpc.BaseEvent]: + event = self._call.next_event() + with self._state.condition: + callbacks = _handle_event( + event, self._state, self._response_deserializer + ) + for callback in callbacks: + # NOTE(gnossen): We intentionally allow exceptions to bubble up + # to the user when running on a single thread. + callback() + return event + + def _next_response(self) -> Any: + while True: + self._consume_next_event() + with self._state.condition: + if self._state.response is not None: + response = self._state.response + self._state.response = None + return response + elif ( + cygrpc.OperationType.receive_message not in self._state.due + ): + if self._state.code is grpc.StatusCode.OK: + raise StopIteration() + elif self._state.code is not None: + raise self + + def _next(self) -> Any: + with self._state.condition: + if self._state.code is None: + # We tentatively add the operation as expected and remove + # it if the enqueue operation fails. This allows us to guarantee that + # if an event has been submitted to the core completion queue, + # it is in `due`. If we waited until after a successful + # enqueue operation then a signal could interrupt this + # thread between the enqueue operation and the addition of the + # operation to `due`. This would cause an exception on the + # channel spin thread when the operation completes and no + # corresponding operation would be present in state.due. + # Note that, since `condition` is held through this block, there is + # no data race on `due`. + self._state.due.add(cygrpc.OperationType.receive_message) + operating = self._call.operate( + (cygrpc.ReceiveMessageOperation(_EMPTY_FLAGS),), None + ) + if not operating: + self._state.due.remove(cygrpc.OperationType.receive_message) + elif self._state.code is grpc.StatusCode.OK: + raise StopIteration() + else: + raise self + return self._next_response() + + def debug_error_string(self) -> Optional[str]: + with self._state.condition: + if self._state.debug_error_string is None: + raise grpc.experimental.UsageError( + "Cannot get debug error string until RPC is completed." + ) + return _common.decode(self._state.debug_error_string) + + +class _MultiThreadedRendezvous( + _Rendezvous, grpc.Call, grpc.Future +): # pylint: disable=too-many-ancestors + """An RPC iterator that depends on a channel spin thread. + + This iterator relies upon a per-channel thread running in the background, + dequeueing events from the completion queue, and notifying threads waiting + on the threading.Condition object in the _RPCState object. + + This extra thread allows _MultiThreadedRendezvous to fulfill the grpc.Future interface + and to mediate a bidirection streaming RPC. + """ + + _state: _RPCState + + def initial_metadata(self) -> Optional[MetadataType]: + """See grpc.Call.initial_metadata""" + with self._state.condition: + + def _done(): + return self._state.initial_metadata is not None + + _common.wait(self._state.condition.wait, _done) + return self._state.initial_metadata + + def trailing_metadata(self) -> Optional[MetadataType]: + """See grpc.Call.trailing_metadata""" + with self._state.condition: + + def _done(): + return self._state.trailing_metadata is not None + + _common.wait(self._state.condition.wait, _done) + return self._state.trailing_metadata + + def code(self) -> Optional[grpc.StatusCode]: + """See grpc.Call.code""" + with self._state.condition: + + def _done(): + return self._state.code is not None + + _common.wait(self._state.condition.wait, _done) + return self._state.code + + def details(self) -> Optional[str]: + """See grpc.Call.details""" + with self._state.condition: + + def _done(): + return self._state.details is not None + + _common.wait(self._state.condition.wait, _done) + return _common.decode(self._state.details) + + def debug_error_string(self) -> Optional[str]: + with self._state.condition: + + def _done(): + return self._state.debug_error_string is not None + + _common.wait(self._state.condition.wait, _done) + return _common.decode(self._state.debug_error_string) + + def cancelled(self) -> bool: + with self._state.condition: + return self._state.cancelled + + def running(self) -> bool: + with self._state.condition: + return self._state.code is None + + def done(self) -> bool: + with self._state.condition: + return self._state.code is not None + + def _is_complete(self) -> bool: + return self._state.code is not None + + def result(self, timeout: Optional[float] = None) -> Any: + """Returns the result of the computation or raises its exception. + + See grpc.Future.result for the full API contract. + """ + with self._state.condition: + timed_out = _common.wait( + self._state.condition.wait, self._is_complete, timeout=timeout + ) + if timed_out: + raise grpc.FutureTimeoutError() + else: + if self._state.code is grpc.StatusCode.OK: + return self._state.response + elif self._state.cancelled: + raise grpc.FutureCancelledError() + else: + raise self + + def exception(self, timeout: Optional[float] = None) -> Optional[Exception]: + """Return the exception raised by the computation. + + See grpc.Future.exception for the full API contract. + """ + with self._state.condition: + timed_out = _common.wait( + self._state.condition.wait, self._is_complete, timeout=timeout + ) + if timed_out: + raise grpc.FutureTimeoutError() + else: + if self._state.code is grpc.StatusCode.OK: + return None + elif self._state.cancelled: + raise grpc.FutureCancelledError() + else: + return self + + def traceback( + self, timeout: Optional[float] = None + ) -> Optional[types.TracebackType]: + """Access the traceback of the exception raised by the computation. + + See grpc.future.traceback for the full API contract. + """ + with self._state.condition: + timed_out = _common.wait( + self._state.condition.wait, self._is_complete, timeout=timeout + ) + if timed_out: + raise grpc.FutureTimeoutError() + else: + if self._state.code is grpc.StatusCode.OK: + return None + elif self._state.cancelled: + raise grpc.FutureCancelledError() + else: + try: + raise self + except grpc.RpcError: + return sys.exc_info()[2] + + def add_done_callback(self, fn: Callable[[grpc.Future], None]) -> None: + with self._state.condition: + if self._state.code is None: + self._state.callbacks.append(functools.partial(fn, self)) + return + + fn(self) + + def _next(self) -> Any: + with self._state.condition: + if self._state.code is None: + event_handler = _event_handler( + self._state, self._response_deserializer + ) + self._state.due.add(cygrpc.OperationType.receive_message) + operating = self._call.operate( + (cygrpc.ReceiveMessageOperation(_EMPTY_FLAGS),), + event_handler, + ) + if not operating: + self._state.due.remove(cygrpc.OperationType.receive_message) + elif self._state.code is grpc.StatusCode.OK: + raise StopIteration() + else: + raise self + + def _response_ready(): + return self._state.response is not None or ( + cygrpc.OperationType.receive_message not in self._state.due + and self._state.code is not None + ) + + _common.wait(self._state.condition.wait, _response_ready) + if self._state.response is not None: + response = self._state.response + self._state.response = None + return response + elif cygrpc.OperationType.receive_message not in self._state.due: + if self._state.code is grpc.StatusCode.OK: + raise StopIteration() + elif self._state.code is not None: + raise self + + +def _start_unary_request( + request: Any, + timeout: Optional[float], + request_serializer: SerializingFunction, +) -> Tuple[Optional[float], Optional[bytes], Optional[grpc.RpcError]]: + deadline = _deadline(timeout) + serialized_request = _common.serialize(request, request_serializer) + if serialized_request is None: + state = _RPCState( + (), + (), + (), + grpc.StatusCode.INTERNAL, + "Exception serializing request!", + ) + error = _InactiveRpcError(state) + return deadline, None, error + else: + return deadline, serialized_request, None + + +def _end_unary_response_blocking( + state: _RPCState, + call: cygrpc.SegregatedCall, + with_call: bool, + deadline: Optional[float], +) -> Union[ResponseType, Tuple[ResponseType, grpc.Call]]: + if state.code is grpc.StatusCode.OK: + if with_call: + rendezvous = _MultiThreadedRendezvous(state, call, None, deadline) + return state.response, rendezvous + else: + return state.response + else: + raise _InactiveRpcError(state) # pytype: disable=not-instantiable + + +def _stream_unary_invocation_operations( + metadata: Optional[MetadataType], initial_metadata_flags: int +) -> Sequence[Sequence[cygrpc.Operation]]: + return ( + ( + cygrpc.SendInitialMetadataOperation( + metadata, initial_metadata_flags + ), + cygrpc.ReceiveMessageOperation(_EMPTY_FLAGS), + cygrpc.ReceiveStatusOnClientOperation(_EMPTY_FLAGS), + ), + (cygrpc.ReceiveInitialMetadataOperation(_EMPTY_FLAGS),), + ) + + +def _stream_unary_invocation_operations_and_tags( + metadata: Optional[MetadataType], initial_metadata_flags: int +) -> Sequence[Tuple[Sequence[cygrpc.Operation], Optional[UserTag]]]: + return tuple( + ( + operations, + None, + ) + for operations in _stream_unary_invocation_operations( + metadata, initial_metadata_flags + ) + ) + + +def _determine_deadline(user_deadline: Optional[float]) -> Optional[float]: + parent_deadline = cygrpc.get_deadline_from_context() + if parent_deadline is None and user_deadline is None: + return None + elif parent_deadline is not None and user_deadline is None: + return parent_deadline + elif user_deadline is not None and parent_deadline is None: + return user_deadline + else: + return min(parent_deadline, user_deadline) + + +class _UnaryUnaryMultiCallable(grpc.UnaryUnaryMultiCallable): + _channel: cygrpc.Channel + _managed_call: IntegratedCallFactory + _method: bytes + _target: bytes + _request_serializer: Optional[SerializingFunction] + _response_deserializer: Optional[DeserializingFunction] + _context: Any + _registered_call_handle: Optional[int] + + __slots__ = [ + "_channel", + "_managed_call", + "_method", + "_target", + "_request_serializer", + "_response_deserializer", + "_context", + ] + + # pylint: disable=too-many-arguments + def __init__( + self, + channel: cygrpc.Channel, + managed_call: IntegratedCallFactory, + method: bytes, + target: bytes, + request_serializer: Optional[SerializingFunction], + response_deserializer: Optional[DeserializingFunction], + _registered_call_handle: Optional[int], + ): + self._channel = channel + self._managed_call = managed_call + self._method = method + self._target = target + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + self._context = cygrpc.build_census_context() + self._registered_call_handle = _registered_call_handle + + def _prepare( + self, + request: Any, + timeout: Optional[float], + metadata: Optional[MetadataType], + wait_for_ready: Optional[bool], + compression: Optional[grpc.Compression], + ) -> Tuple[ + Optional[_RPCState], + Optional[Sequence[cygrpc.Operation]], + Optional[float], + Optional[grpc.RpcError], + ]: + deadline, serialized_request, rendezvous = _start_unary_request( + request, timeout, self._request_serializer + ) + initial_metadata_flags = _InitialMetadataFlags().with_wait_for_ready( + wait_for_ready + ) + augmented_metadata = _compression.augment_metadata( + metadata, compression + ) + if serialized_request is None: + return None, None, None, rendezvous + else: + state = _RPCState(_UNARY_UNARY_INITIAL_DUE, None, None, None, None) + operations = ( + cygrpc.SendInitialMetadataOperation( + augmented_metadata, initial_metadata_flags + ), + cygrpc.SendMessageOperation(serialized_request, _EMPTY_FLAGS), + cygrpc.SendCloseFromClientOperation(_EMPTY_FLAGS), + cygrpc.ReceiveInitialMetadataOperation(_EMPTY_FLAGS), + cygrpc.ReceiveMessageOperation(_EMPTY_FLAGS), + cygrpc.ReceiveStatusOnClientOperation(_EMPTY_FLAGS), + ) + return state, operations, deadline, None + + def _blocking( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Tuple[_RPCState, cygrpc.SegregatedCall]: + state, operations, deadline, rendezvous = self._prepare( + request, timeout, metadata, wait_for_ready, compression + ) + if state is None: + raise rendezvous # pylint: disable-msg=raising-bad-type + else: + state.rpc_start_time = time.perf_counter() + state.method = _common.decode(self._method) + state.target = _common.decode(self._target) + call = self._channel.segregated_call( + cygrpc.PropagationConstants.GRPC_PROPAGATE_DEFAULTS, + self._method, + None, + _determine_deadline(deadline), + metadata, + None if credentials is None else credentials._credentials, + ( + ( + operations, + None, + ), + ), + self._context, + self._registered_call_handle, + ) + event = call.next_event() + _handle_event(event, state, self._response_deserializer) + return state, call + + def __call__( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Any: + ( + state, + call, + ) = self._blocking( + request, timeout, metadata, credentials, wait_for_ready, compression + ) + return _end_unary_response_blocking(state, call, False, None) + + def with_call( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Tuple[Any, grpc.Call]: + ( + state, + call, + ) = self._blocking( + request, timeout, metadata, credentials, wait_for_ready, compression + ) + return _end_unary_response_blocking(state, call, True, None) + + def future( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _MultiThreadedRendezvous: + state, operations, deadline, rendezvous = self._prepare( + request, timeout, metadata, wait_for_ready, compression + ) + if state is None: + raise rendezvous # pylint: disable-msg=raising-bad-type + else: + event_handler = _event_handler(state, self._response_deserializer) + state.rpc_start_time = time.perf_counter() + state.method = _common.decode(self._method) + state.target = _common.decode(self._target) + call = self._managed_call( + cygrpc.PropagationConstants.GRPC_PROPAGATE_DEFAULTS, + self._method, + None, + deadline, + metadata, + None if credentials is None else credentials._credentials, + (operations,), + event_handler, + self._context, + self._registered_call_handle, + ) + return _MultiThreadedRendezvous( + state, call, self._response_deserializer, deadline + ) + + +class _SingleThreadedUnaryStreamMultiCallable(grpc.UnaryStreamMultiCallable): + _channel: cygrpc.Channel + _method: bytes + _target: bytes + _request_serializer: Optional[SerializingFunction] + _response_deserializer: Optional[DeserializingFunction] + _context: Any + _registered_call_handle: Optional[int] + + __slots__ = [ + "_channel", + "_method", + "_target", + "_request_serializer", + "_response_deserializer", + "_context", + ] + + # pylint: disable=too-many-arguments + def __init__( + self, + channel: cygrpc.Channel, + method: bytes, + target: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + _registered_call_handle: Optional[int], + ): + self._channel = channel + self._method = method + self._target = target + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + self._context = cygrpc.build_census_context() + self._registered_call_handle = _registered_call_handle + + def __call__( # pylint: disable=too-many-locals + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _SingleThreadedRendezvous: + deadline = _deadline(timeout) + serialized_request = _common.serialize( + request, self._request_serializer + ) + if serialized_request is None: + state = _RPCState( + (), + (), + (), + grpc.StatusCode.INTERNAL, + "Exception serializing request!", + ) + raise _InactiveRpcError(state) + + state = _RPCState(_UNARY_STREAM_INITIAL_DUE, None, None, None, None) + call_credentials = ( + None if credentials is None else credentials._credentials + ) + initial_metadata_flags = _InitialMetadataFlags().with_wait_for_ready( + wait_for_ready + ) + augmented_metadata = _compression.augment_metadata( + metadata, compression + ) + operations = ( + ( + cygrpc.SendInitialMetadataOperation( + augmented_metadata, initial_metadata_flags + ), + cygrpc.SendMessageOperation(serialized_request, _EMPTY_FLAGS), + cygrpc.SendCloseFromClientOperation(_EMPTY_FLAGS), + ), + (cygrpc.ReceiveStatusOnClientOperation(_EMPTY_FLAGS),), + (cygrpc.ReceiveInitialMetadataOperation(_EMPTY_FLAGS),), + ) + operations_and_tags = tuple((ops, None) for ops in operations) + state.rpc_start_time = time.perf_counter() + state.method = _common.decode(self._method) + state.target = _common.decode(self._target) + call = self._channel.segregated_call( + cygrpc.PropagationConstants.GRPC_PROPAGATE_DEFAULTS, + self._method, + None, + _determine_deadline(deadline), + metadata, + call_credentials, + operations_and_tags, + self._context, + self._registered_call_handle, + ) + return _SingleThreadedRendezvous( + state, call, self._response_deserializer, deadline + ) + + +class _UnaryStreamMultiCallable(grpc.UnaryStreamMultiCallable): + _channel: cygrpc.Channel + _managed_call: IntegratedCallFactory + _method: bytes + _target: bytes + _request_serializer: Optional[SerializingFunction] + _response_deserializer: Optional[DeserializingFunction] + _context: Any + _registered_call_handle: Optional[int] + + __slots__ = [ + "_channel", + "_managed_call", + "_method", + "_target", + "_request_serializer", + "_response_deserializer", + "_context", + ] + + # pylint: disable=too-many-arguments + def __init__( + self, + channel: cygrpc.Channel, + managed_call: IntegratedCallFactory, + method: bytes, + target: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + _registered_call_handle: Optional[int], + ): + self._channel = channel + self._managed_call = managed_call + self._method = method + self._target = target + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + self._context = cygrpc.build_census_context() + self._registered_call_handle = _registered_call_handle + + def __call__( # pylint: disable=too-many-locals + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _MultiThreadedRendezvous: + deadline, serialized_request, rendezvous = _start_unary_request( + request, timeout, self._request_serializer + ) + initial_metadata_flags = _InitialMetadataFlags().with_wait_for_ready( + wait_for_ready + ) + if serialized_request is None: + raise rendezvous # pylint: disable-msg=raising-bad-type + else: + augmented_metadata = _compression.augment_metadata( + metadata, compression + ) + state = _RPCState(_UNARY_STREAM_INITIAL_DUE, None, None, None, None) + operations = ( + ( + cygrpc.SendInitialMetadataOperation( + augmented_metadata, initial_metadata_flags + ), + cygrpc.SendMessageOperation( + serialized_request, _EMPTY_FLAGS + ), + cygrpc.SendCloseFromClientOperation(_EMPTY_FLAGS), + cygrpc.ReceiveStatusOnClientOperation(_EMPTY_FLAGS), + ), + (cygrpc.ReceiveInitialMetadataOperation(_EMPTY_FLAGS),), + ) + state.rpc_start_time = time.perf_counter() + state.method = _common.decode(self._method) + state.target = _common.decode(self._target) + call = self._managed_call( + cygrpc.PropagationConstants.GRPC_PROPAGATE_DEFAULTS, + self._method, + None, + _determine_deadline(deadline), + metadata, + None if credentials is None else credentials._credentials, + operations, + _event_handler(state, self._response_deserializer), + self._context, + self._registered_call_handle, + ) + return _MultiThreadedRendezvous( + state, call, self._response_deserializer, deadline + ) + + +class _StreamUnaryMultiCallable(grpc.StreamUnaryMultiCallable): + _channel: cygrpc.Channel + _managed_call: IntegratedCallFactory + _method: bytes + _target: bytes + _request_serializer: Optional[SerializingFunction] + _response_deserializer: Optional[DeserializingFunction] + _context: Any + _registered_call_handle: Optional[int] + + __slots__ = [ + "_channel", + "_managed_call", + "_method", + "_target", + "_request_serializer", + "_response_deserializer", + "_context", + ] + + # pylint: disable=too-many-arguments + def __init__( + self, + channel: cygrpc.Channel, + managed_call: IntegratedCallFactory, + method: bytes, + target: bytes, + request_serializer: Optional[SerializingFunction], + response_deserializer: Optional[DeserializingFunction], + _registered_call_handle: Optional[int], + ): + self._channel = channel + self._managed_call = managed_call + self._method = method + self._target = target + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + self._context = cygrpc.build_census_context() + self._registered_call_handle = _registered_call_handle + + def _blocking( + self, + request_iterator: Iterator, + timeout: Optional[float], + metadata: Optional[MetadataType], + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + compression: Optional[grpc.Compression], + ) -> Tuple[_RPCState, cygrpc.SegregatedCall]: + deadline = _deadline(timeout) + state = _RPCState(_STREAM_UNARY_INITIAL_DUE, None, None, None, None) + initial_metadata_flags = _InitialMetadataFlags().with_wait_for_ready( + wait_for_ready + ) + augmented_metadata = _compression.augment_metadata( + metadata, compression + ) + state.rpc_start_time = time.perf_counter() + state.method = _common.decode(self._method) + state.target = _common.decode(self._target) + call = self._channel.segregated_call( + cygrpc.PropagationConstants.GRPC_PROPAGATE_DEFAULTS, + self._method, + None, + _determine_deadline(deadline), + augmented_metadata, + None if credentials is None else credentials._credentials, + _stream_unary_invocation_operations_and_tags( + augmented_metadata, initial_metadata_flags + ), + self._context, + self._registered_call_handle, + ) + _consume_request_iterator( + request_iterator, state, call, self._request_serializer, None + ) + while True: + event = call.next_event() + with state.condition: + _handle_event(event, state, self._response_deserializer) + state.condition.notify_all() + if not state.due: + break + return state, call + + def __call__( + self, + request_iterator: Iterator, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Any: + ( + state, + call, + ) = self._blocking( + request_iterator, + timeout, + metadata, + credentials, + wait_for_ready, + compression, + ) + return _end_unary_response_blocking(state, call, False, None) + + def with_call( + self, + request_iterator: Iterator, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Tuple[Any, grpc.Call]: + ( + state, + call, + ) = self._blocking( + request_iterator, + timeout, + metadata, + credentials, + wait_for_ready, + compression, + ) + return _end_unary_response_blocking(state, call, True, None) + + def future( + self, + request_iterator: Iterator, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _MultiThreadedRendezvous: + deadline = _deadline(timeout) + state = _RPCState(_STREAM_UNARY_INITIAL_DUE, None, None, None, None) + event_handler = _event_handler(state, self._response_deserializer) + initial_metadata_flags = _InitialMetadataFlags().with_wait_for_ready( + wait_for_ready + ) + augmented_metadata = _compression.augment_metadata( + metadata, compression + ) + state.rpc_start_time = time.perf_counter() + state.method = _common.decode(self._method) + state.target = _common.decode(self._target) + call = self._managed_call( + cygrpc.PropagationConstants.GRPC_PROPAGATE_DEFAULTS, + self._method, + None, + deadline, + augmented_metadata, + None if credentials is None else credentials._credentials, + _stream_unary_invocation_operations( + metadata, initial_metadata_flags + ), + event_handler, + self._context, + self._registered_call_handle, + ) + _consume_request_iterator( + request_iterator, + state, + call, + self._request_serializer, + event_handler, + ) + return _MultiThreadedRendezvous( + state, call, self._response_deserializer, deadline + ) + + +class _StreamStreamMultiCallable(grpc.StreamStreamMultiCallable): + _channel: cygrpc.Channel + _managed_call: IntegratedCallFactory + _method: bytes + _target: bytes + _request_serializer: Optional[SerializingFunction] + _response_deserializer: Optional[DeserializingFunction] + _context: Any + _registered_call_handle: Optional[int] + + __slots__ = [ + "_channel", + "_managed_call", + "_method", + "_target", + "_request_serializer", + "_response_deserializer", + "_context", + ] + + # pylint: disable=too-many-arguments + def __init__( + self, + channel: cygrpc.Channel, + managed_call: IntegratedCallFactory, + method: bytes, + target: bytes, + request_serializer: Optional[SerializingFunction], + response_deserializer: Optional[DeserializingFunction], + _registered_call_handle: Optional[int], + ): + self._channel = channel + self._managed_call = managed_call + self._method = method + self._target = target + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + self._context = cygrpc.build_census_context() + self._registered_call_handle = _registered_call_handle + + def __call__( + self, + request_iterator: Iterator, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _MultiThreadedRendezvous: + deadline = _deadline(timeout) + state = _RPCState(_STREAM_STREAM_INITIAL_DUE, None, None, None, None) + initial_metadata_flags = _InitialMetadataFlags().with_wait_for_ready( + wait_for_ready + ) + augmented_metadata = _compression.augment_metadata( + metadata, compression + ) + operations = ( + ( + cygrpc.SendInitialMetadataOperation( + augmented_metadata, initial_metadata_flags + ), + cygrpc.ReceiveStatusOnClientOperation(_EMPTY_FLAGS), + ), + (cygrpc.ReceiveInitialMetadataOperation(_EMPTY_FLAGS),), + ) + event_handler = _event_handler(state, self._response_deserializer) + state.rpc_start_time = time.perf_counter() + state.method = _common.decode(self._method) + state.target = _common.decode(self._target) + call = self._managed_call( + cygrpc.PropagationConstants.GRPC_PROPAGATE_DEFAULTS, + self._method, + None, + _determine_deadline(deadline), + augmented_metadata, + None if credentials is None else credentials._credentials, + operations, + event_handler, + self._context, + self._registered_call_handle, + ) + _consume_request_iterator( + request_iterator, + state, + call, + self._request_serializer, + event_handler, + ) + return _MultiThreadedRendezvous( + state, call, self._response_deserializer, deadline + ) + + +class _InitialMetadataFlags(int): + """Stores immutable initial metadata flags""" + + def __new__(cls, value: int = _EMPTY_FLAGS): + value &= cygrpc.InitialMetadataFlags.used_mask + return super(_InitialMetadataFlags, cls).__new__(cls, value) + + def with_wait_for_ready(self, wait_for_ready: Optional[bool]) -> int: + if wait_for_ready is not None: + if wait_for_ready: + return self.__class__( + self + | cygrpc.InitialMetadataFlags.wait_for_ready + | cygrpc.InitialMetadataFlags.wait_for_ready_explicitly_set + ) + elif not wait_for_ready: + return self.__class__( + self & ~cygrpc.InitialMetadataFlags.wait_for_ready + | cygrpc.InitialMetadataFlags.wait_for_ready_explicitly_set + ) + return self + + +class _ChannelCallState(object): + channel: cygrpc.Channel + managed_calls: int + threading: bool + + def __init__(self, channel: cygrpc.Channel): + self.lock = threading.Lock() + self.channel = channel + self.managed_calls = 0 + self.threading = False + + def reset_postfork_child(self) -> None: + self.managed_calls = 0 + + def __del__(self): + try: + self.channel.close( + cygrpc.StatusCode.cancelled, "Channel deallocated!" + ) + except (TypeError, AttributeError): + pass + + +def _run_channel_spin_thread(state: _ChannelCallState) -> None: + def channel_spin(): + while True: + cygrpc.block_if_fork_in_progress(state) + event = state.channel.next_call_event() + if event.completion_type == cygrpc.CompletionType.queue_timeout: + continue + call_completed = event.tag(event) + if call_completed: + with state.lock: + state.managed_calls -= 1 + if state.managed_calls == 0: + return + + channel_spin_thread = cygrpc.ForkManagedThread(target=channel_spin) + channel_spin_thread.setDaemon(True) + channel_spin_thread.start() + + +def _channel_managed_call_management(state: _ChannelCallState): + # pylint: disable=too-many-arguments + def create( + flags: int, + method: bytes, + host: Optional[str], + deadline: Optional[float], + metadata: Optional[MetadataType], + credentials: Optional[cygrpc.CallCredentials], + operations: Sequence[Sequence[cygrpc.Operation]], + event_handler: UserTag, + context: Any, + _registered_call_handle: Optional[int], + ) -> cygrpc.IntegratedCall: + """Creates a cygrpc.IntegratedCall. + + Args: + flags: An integer bitfield of call flags. + method: The RPC method. + host: A host string for the created call. + deadline: A float to be the deadline of the created call or None if + the call is to have an infinite deadline. + metadata: The metadata for the call or None. + credentials: A cygrpc.CallCredentials or None. + operations: A sequence of sequences of cygrpc.Operations to be + started on the call. + event_handler: A behavior to call to handle the events resultant from + the operations on the call. + context: Context object for distributed tracing. + _registered_call_handle: An int representing the call handle of the + method, or None if the method is not registered. + Returns: + A cygrpc.IntegratedCall with which to conduct an RPC. + """ + operations_and_tags = tuple( + ( + operation, + event_handler, + ) + for operation in operations + ) + with state.lock: + call = state.channel.integrated_call( + flags, + method, + host, + deadline, + metadata, + credentials, + operations_and_tags, + context, + _registered_call_handle, + ) + if state.managed_calls == 0: + state.managed_calls = 1 + _run_channel_spin_thread(state) + else: + state.managed_calls += 1 + return call + + return create + + +class _ChannelConnectivityState(object): + lock: threading.RLock + channel: grpc.Channel + polling: bool + connectivity: grpc.ChannelConnectivity + try_to_connect: bool + # TODO(xuanwn): Refactor this: https://github.com/grpc/grpc/issues/31704 + callbacks_and_connectivities: List[ + Sequence[ + Union[ + Callable[[grpc.ChannelConnectivity], None], + Optional[grpc.ChannelConnectivity], + ] + ] + ] + delivering: bool + + def __init__(self, channel: grpc.Channel): + self.lock = threading.RLock() + self.channel = channel + self.polling = False + self.connectivity = None + self.try_to_connect = False + self.callbacks_and_connectivities = [] + self.delivering = False + + def reset_postfork_child(self) -> None: + self.polling = False + self.connectivity = None + self.try_to_connect = False + self.callbacks_and_connectivities = [] + self.delivering = False + + +def _deliveries( + state: _ChannelConnectivityState, +) -> List[Callable[[grpc.ChannelConnectivity], None]]: + callbacks_needing_update = [] + for callback_and_connectivity in state.callbacks_and_connectivities: + ( + callback, + callback_connectivity, + ) = callback_and_connectivity + if callback_connectivity is not state.connectivity: + callbacks_needing_update.append(callback) + callback_and_connectivity[1] = state.connectivity + return callbacks_needing_update + + +def _deliver( + state: _ChannelConnectivityState, + initial_connectivity: grpc.ChannelConnectivity, + initial_callbacks: Sequence[Callable[[grpc.ChannelConnectivity], None]], +) -> None: + connectivity = initial_connectivity + callbacks = initial_callbacks + while True: + for callback in callbacks: + cygrpc.block_if_fork_in_progress(state) + try: + callback(connectivity) + except Exception: # pylint: disable=broad-except + _LOGGER.exception( + _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE + ) + with state.lock: + callbacks = _deliveries(state) + if callbacks: + connectivity = state.connectivity + else: + state.delivering = False + return + + +def _spawn_delivery( + state: _ChannelConnectivityState, + callbacks: Sequence[Callable[[grpc.ChannelConnectivity], None]], +) -> None: + delivering_thread = cygrpc.ForkManagedThread( + target=_deliver, + args=( + state, + state.connectivity, + callbacks, + ), + ) + delivering_thread.setDaemon(True) + delivering_thread.start() + state.delivering = True + + +# NOTE(https://github.com/grpc/grpc/issues/3064): We'd rather not poll. +def _poll_connectivity( + state: _ChannelConnectivityState, + channel: grpc.Channel, + initial_try_to_connect: bool, +) -> None: + try_to_connect = initial_try_to_connect + connectivity = channel.check_connectivity_state(try_to_connect) + with state.lock: + state.connectivity = ( + _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[ + connectivity + ] + ) + callbacks = tuple( + callback for callback, _ in state.callbacks_and_connectivities + ) + for callback_and_connectivity in state.callbacks_and_connectivities: + callback_and_connectivity[1] = state.connectivity + if callbacks: + _spawn_delivery(state, callbacks) + while True: + event = channel.watch_connectivity_state( + connectivity, time.time() + 0.2 + ) + cygrpc.block_if_fork_in_progress(state) + with state.lock: + if ( + not state.callbacks_and_connectivities + and not state.try_to_connect + ): + state.polling = False + state.connectivity = None + break + try_to_connect = state.try_to_connect + state.try_to_connect = False + if event.success or try_to_connect: + connectivity = channel.check_connectivity_state(try_to_connect) + with state.lock: + state.connectivity = ( + _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[ + connectivity + ] + ) + if not state.delivering: + callbacks = _deliveries(state) + if callbacks: + _spawn_delivery(state, callbacks) + + +def _subscribe( + state: _ChannelConnectivityState, + callback: Callable[[grpc.ChannelConnectivity], None], + try_to_connect: bool, +) -> None: + with state.lock: + if not state.callbacks_and_connectivities and not state.polling: + polling_thread = cygrpc.ForkManagedThread( + target=_poll_connectivity, + args=(state, state.channel, bool(try_to_connect)), + ) + polling_thread.setDaemon(True) + polling_thread.start() + state.polling = True + state.callbacks_and_connectivities.append([callback, None]) + elif not state.delivering and state.connectivity is not None: + _spawn_delivery(state, (callback,)) + state.try_to_connect |= bool(try_to_connect) + state.callbacks_and_connectivities.append( + [callback, state.connectivity] + ) + else: + state.try_to_connect |= bool(try_to_connect) + state.callbacks_and_connectivities.append([callback, None]) + + +def _unsubscribe( + state: _ChannelConnectivityState, + callback: Callable[[grpc.ChannelConnectivity], None], +) -> None: + with state.lock: + for index, (subscribed_callback, unused_connectivity) in enumerate( + state.callbacks_and_connectivities + ): + if callback == subscribed_callback: + state.callbacks_and_connectivities.pop(index) + break + + +def _augment_options( + base_options: Sequence[ChannelArgumentType], + compression: Optional[grpc.Compression], +) -> Sequence[ChannelArgumentType]: + compression_option = _compression.create_channel_option(compression) + return ( + tuple(base_options) + + compression_option + + ( + ( + cygrpc.ChannelArgKey.primary_user_agent_string, + _USER_AGENT, + ), + ) + ) + + +def _separate_channel_options( + options: Sequence[ChannelArgumentType], +) -> Tuple[Sequence[ChannelArgumentType], Sequence[ChannelArgumentType]]: + """Separates core channel options from Python channel options.""" + core_options = [] + python_options = [] + for pair in options: + if ( + pair[0] + == grpc.experimental.ChannelOptions.SingleThreadedUnaryStream + ): + python_options.append(pair) + else: + core_options.append(pair) + return python_options, core_options + + +class Channel(grpc.Channel): + """A cygrpc.Channel-backed implementation of grpc.Channel.""" + + _single_threaded_unary_stream: bool + _channel: cygrpc.Channel + _call_state: _ChannelCallState + _connectivity_state: _ChannelConnectivityState + _target: str + _registered_call_handles: Dict[str, int] + + def __init__( + self, + target: str, + options: Sequence[ChannelArgumentType], + credentials: Optional[grpc.ChannelCredentials], + compression: Optional[grpc.Compression], + ): + """Constructor. + + Args: + target: The target to which to connect. + options: Configuration options for the channel. + credentials: A cygrpc.ChannelCredentials or None. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel. + """ + python_options, core_options = _separate_channel_options(options) + self._single_threaded_unary_stream = ( + _DEFAULT_SINGLE_THREADED_UNARY_STREAM + ) + self._process_python_options(python_options) + self._channel = cygrpc.Channel( + _common.encode(target), + _augment_options(core_options, compression), + credentials, + ) + self._target = target + self._call_state = _ChannelCallState(self._channel) + self._connectivity_state = _ChannelConnectivityState(self._channel) + cygrpc.fork_register_channel(self) + if cygrpc.g_gevent_activated: + cygrpc.gevent_increment_channel_count() + + def _get_registered_call_handle(self, method: str) -> int: + """ + Get the registered call handle for a method. + + This is a semi-private method. It is intended for use only by gRPC generated code. + + This method is not thread-safe. + + Args: + method: Required, the method name for the RPC. + + Returns: + The registered call handle pointer in the form of a Python Long. + """ + return self._channel.get_registered_call_handle(_common.encode(method)) + + def _process_python_options( + self, python_options: Sequence[ChannelArgumentType] + ) -> None: + """Sets channel attributes according to python-only channel options.""" + for pair in python_options: + if ( + pair[0] + == grpc.experimental.ChannelOptions.SingleThreadedUnaryStream + ): + self._single_threaded_unary_stream = True + + def subscribe( + self, + callback: Callable[[grpc.ChannelConnectivity], None], + try_to_connect: Optional[bool] = None, + ) -> None: + _subscribe(self._connectivity_state, callback, try_to_connect) + + def unsubscribe( + self, callback: Callable[[grpc.ChannelConnectivity], None] + ) -> None: + _unsubscribe(self._connectivity_state, callback) + + # pylint: disable=arguments-differ + def unary_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> grpc.UnaryUnaryMultiCallable: + _registered_call_handle = None + if _registered_method: + _registered_call_handle = self._get_registered_call_handle(method) + return _UnaryUnaryMultiCallable( + self._channel, + _channel_managed_call_management(self._call_state), + _common.encode(method), + _common.encode(self._target), + request_serializer, + response_deserializer, + _registered_call_handle, + ) + + # pylint: disable=arguments-differ + def unary_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> grpc.UnaryStreamMultiCallable: + _registered_call_handle = None + if _registered_method: + _registered_call_handle = self._get_registered_call_handle(method) + # NOTE(rbellevi): Benchmarks have shown that running a unary-stream RPC + # on a single Python thread results in an appreciable speed-up. However, + # due to slight differences in capability, the multi-threaded variant + # remains the default. + if self._single_threaded_unary_stream: + return _SingleThreadedUnaryStreamMultiCallable( + self._channel, + _common.encode(method), + _common.encode(self._target), + request_serializer, + response_deserializer, + _registered_call_handle, + ) + else: + return _UnaryStreamMultiCallable( + self._channel, + _channel_managed_call_management(self._call_state), + _common.encode(method), + _common.encode(self._target), + request_serializer, + response_deserializer, + _registered_call_handle, + ) + + # pylint: disable=arguments-differ + def stream_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> grpc.StreamUnaryMultiCallable: + _registered_call_handle = None + if _registered_method: + _registered_call_handle = self._get_registered_call_handle(method) + return _StreamUnaryMultiCallable( + self._channel, + _channel_managed_call_management(self._call_state), + _common.encode(method), + _common.encode(self._target), + request_serializer, + response_deserializer, + _registered_call_handle, + ) + + # pylint: disable=arguments-differ + def stream_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> grpc.StreamStreamMultiCallable: + _registered_call_handle = None + if _registered_method: + _registered_call_handle = self._get_registered_call_handle(method) + return _StreamStreamMultiCallable( + self._channel, + _channel_managed_call_management(self._call_state), + _common.encode(method), + _common.encode(self._target), + request_serializer, + response_deserializer, + _registered_call_handle, + ) + + def _unsubscribe_all(self) -> None: + state = self._connectivity_state + if state: + with state.lock: + del state.callbacks_and_connectivities[:] + + def _close(self) -> None: + self._unsubscribe_all() + self._channel.close(cygrpc.StatusCode.cancelled, "Channel closed!") + cygrpc.fork_unregister_channel(self) + if cygrpc.g_gevent_activated: + cygrpc.gevent_decrement_channel_count() + + def _close_on_fork(self) -> None: + self._unsubscribe_all() + self._channel.close_on_fork( + cygrpc.StatusCode.cancelled, "Channel closed due to fork" + ) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self._close() + return False + + def close(self) -> None: + self._close() + + def __del__(self): + # TODO(https://github.com/grpc/grpc/issues/12531): Several releases + # after 1.12 (1.16 or thereabouts?) add a "self._channel.close" call + # here (or more likely, call self._close() here). We don't do this today + # because many valid use cases today allow the channel to be deleted + # immediately after stubs are created. After a sufficient period of time + # has passed for all users to be trusted to freeze out to their channels + # for as long as they are in use and to close them after using them, + # then deletion of this grpc._channel.Channel instance can be made to + # effect closure of the underlying cygrpc.Channel instance. + try: + self._unsubscribe_all() + except: # pylint: disable=bare-except + # Exceptions in __del__ are ignored by Python anyway, but they can + # keep spamming logs. Just silence them. + pass diff --git a/myenv/lib/python3.12/site-packages/grpc/_common.py b/myenv/lib/python3.12/site-packages/grpc/_common.py new file mode 100644 index 0000000..475f051 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_common.py @@ -0,0 +1,183 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Shared implementation.""" + +import logging +import time +from typing import Any, AnyStr, Callable, Optional, Union + +import grpc +from grpc._cython import cygrpc +from grpc._typing import DeserializingFunction +from grpc._typing import SerializingFunction + +_LOGGER = logging.getLogger(__name__) + +CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY = { + cygrpc.ConnectivityState.idle: grpc.ChannelConnectivity.IDLE, + cygrpc.ConnectivityState.connecting: grpc.ChannelConnectivity.CONNECTING, + cygrpc.ConnectivityState.ready: grpc.ChannelConnectivity.READY, + cygrpc.ConnectivityState.transient_failure: grpc.ChannelConnectivity.TRANSIENT_FAILURE, + cygrpc.ConnectivityState.shutdown: grpc.ChannelConnectivity.SHUTDOWN, +} + +CYGRPC_STATUS_CODE_TO_STATUS_CODE = { + cygrpc.StatusCode.ok: grpc.StatusCode.OK, + cygrpc.StatusCode.cancelled: grpc.StatusCode.CANCELLED, + cygrpc.StatusCode.unknown: grpc.StatusCode.UNKNOWN, + cygrpc.StatusCode.invalid_argument: grpc.StatusCode.INVALID_ARGUMENT, + cygrpc.StatusCode.deadline_exceeded: grpc.StatusCode.DEADLINE_EXCEEDED, + cygrpc.StatusCode.not_found: grpc.StatusCode.NOT_FOUND, + cygrpc.StatusCode.already_exists: grpc.StatusCode.ALREADY_EXISTS, + cygrpc.StatusCode.permission_denied: grpc.StatusCode.PERMISSION_DENIED, + cygrpc.StatusCode.unauthenticated: grpc.StatusCode.UNAUTHENTICATED, + cygrpc.StatusCode.resource_exhausted: grpc.StatusCode.RESOURCE_EXHAUSTED, + cygrpc.StatusCode.failed_precondition: grpc.StatusCode.FAILED_PRECONDITION, + cygrpc.StatusCode.aborted: grpc.StatusCode.ABORTED, + cygrpc.StatusCode.out_of_range: grpc.StatusCode.OUT_OF_RANGE, + cygrpc.StatusCode.unimplemented: grpc.StatusCode.UNIMPLEMENTED, + cygrpc.StatusCode.internal: grpc.StatusCode.INTERNAL, + cygrpc.StatusCode.unavailable: grpc.StatusCode.UNAVAILABLE, + cygrpc.StatusCode.data_loss: grpc.StatusCode.DATA_LOSS, +} +STATUS_CODE_TO_CYGRPC_STATUS_CODE = { + grpc_code: cygrpc_code + for cygrpc_code, grpc_code in CYGRPC_STATUS_CODE_TO_STATUS_CODE.items() +} + +MAXIMUM_WAIT_TIMEOUT = 0.1 + +_ERROR_MESSAGE_PORT_BINDING_FAILED = ( + "Failed to bind to address %s; set " + "GRPC_VERBOSITY=debug environment variable to see detailed error message." +) + + +def encode(s: AnyStr) -> bytes: + if isinstance(s, bytes): + return s + else: + return s.encode("utf8") + + +def decode(b: AnyStr) -> str: + if isinstance(b, bytes): + return b.decode("utf-8", "replace") + return b + + +def _transform( + message: Any, + transformer: Union[SerializingFunction, DeserializingFunction, None], + exception_message: str, +) -> Any: + if transformer is None: + return message + else: + try: + return transformer(message) + except Exception: # pylint: disable=broad-except + _LOGGER.exception(exception_message) + return None + + +def serialize(message: Any, serializer: Optional[SerializingFunction]) -> bytes: + return _transform(message, serializer, "Exception serializing message!") + + +def deserialize( + serialized_message: bytes, deserializer: Optional[DeserializingFunction] +) -> Any: + return _transform( + serialized_message, deserializer, "Exception deserializing message!" + ) + + +def fully_qualified_method(group: str, method: str) -> str: + return "/{}/{}".format(group, method) + + +def _wait_once( + wait_fn: Callable[..., bool], + timeout: float, + spin_cb: Optional[Callable[[], None]], +): + wait_fn(timeout=timeout) + if spin_cb is not None: + spin_cb() + + +def wait( + wait_fn: Callable[..., bool], + wait_complete_fn: Callable[[], bool], + timeout: Optional[float] = None, + spin_cb: Optional[Callable[[], None]] = None, +) -> bool: + """Blocks waiting for an event without blocking the thread indefinitely. + + See https://github.com/grpc/grpc/issues/19464 for full context. CPython's + `threading.Event.wait` and `threading.Condition.wait` methods, if invoked + without a timeout kwarg, may block the calling thread indefinitely. If the + call is made from the main thread, this means that signal handlers may not + run for an arbitrarily long period of time. + + This wrapper calls the supplied wait function with an arbitrary short + timeout to ensure that no signal handler has to wait longer than + MAXIMUM_WAIT_TIMEOUT before executing. + + Args: + wait_fn: A callable acceptable a single float-valued kwarg named + `timeout`. This function is expected to be one of `threading.Event.wait` + or `threading.Condition.wait`. + wait_complete_fn: A callable taking no arguments and returning a bool. + When this function returns true, it indicates that waiting should cease. + timeout: An optional float-valued number of seconds after which the wait + should cease. + spin_cb: An optional Callable taking no arguments and returning nothing. + This callback will be called on each iteration of the spin. This may be + used for, e.g. work related to forking. + + Returns: + True if a timeout was supplied and it was reached. False otherwise. + """ + if timeout is None: + while not wait_complete_fn(): + _wait_once(wait_fn, MAXIMUM_WAIT_TIMEOUT, spin_cb) + else: + end = time.time() + timeout + while not wait_complete_fn(): + remaining = min(end - time.time(), MAXIMUM_WAIT_TIMEOUT) + if remaining < 0: + return True + _wait_once(wait_fn, remaining, spin_cb) + return False + + +def validate_port_binding_result(address: str, port: int) -> int: + """Validates if the port binding succeed. + + If the port returned by Core is 0, the binding is failed. However, in that + case, the Core API doesn't return a detailed failing reason. The best we + can do is raising an exception to prevent further confusion. + + Args: + address: The address string to be bound. + port: An int returned by core + """ + if port == 0: + # The Core API doesn't return a failure message. The best we can do + # is raising an exception to prevent further confusion. + raise RuntimeError(_ERROR_MESSAGE_PORT_BINDING_FAILED % address) + else: + return port diff --git a/myenv/lib/python3.12/site-packages/grpc/_compression.py b/myenv/lib/python3.12/site-packages/grpc/_compression.py new file mode 100644 index 0000000..07fa6f8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_compression.py @@ -0,0 +1,71 @@ +# Copyright 2019 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Optional + +import grpc +from grpc._cython import cygrpc +from grpc._typing import MetadataType + +NoCompression = cygrpc.CompressionAlgorithm.none +Deflate = cygrpc.CompressionAlgorithm.deflate +Gzip = cygrpc.CompressionAlgorithm.gzip + +_METADATA_STRING_MAPPING = { + NoCompression: "identity", + Deflate: "deflate", + Gzip: "gzip", +} + + +def _compression_algorithm_to_metadata_value( + compression: grpc.Compression, +) -> str: + return _METADATA_STRING_MAPPING[compression] + + +def compression_algorithm_to_metadata(compression: grpc.Compression): + return ( + cygrpc.GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY, + _compression_algorithm_to_metadata_value(compression), + ) + + +def create_channel_option(compression: Optional[grpc.Compression]): + return ( + ((cygrpc.GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM, int(compression)),) + if compression + else () + ) + + +def augment_metadata( + metadata: Optional[MetadataType], compression: Optional[grpc.Compression] +): + if not metadata and not compression: + return None + base_metadata = tuple(metadata) if metadata else () + compression_metadata = ( + (compression_algorithm_to_metadata(compression),) if compression else () + ) + return base_metadata + compression_metadata + + +__all__ = ( + "NoCompression", + "Deflate", + "Gzip", +) diff --git a/myenv/lib/python3.12/site-packages/grpc/_cython/__init__.py b/myenv/lib/python3.12/site-packages/grpc/_cython/__init__.py new file mode 100644 index 0000000..5fb4f3c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_cython/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/myenv/lib/python3.12/site-packages/grpc/_cython/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/_cython/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eceb735ce2025c290b5645142416bffaabb126e GIT binary patch literal 203 zcmZ8aJqp4w7)`8#2)%==gZ)rf5emi8P1n%IkD9hgLlT9Y#4~sdXOH0tq+2IbM;|5c`DNpA@9NbqZ^0hPCQxA!-JSGBi*p+E0D?ohoePfVUG^gJTu}fAVXWb zR)aQeg)UWA6b*v(sBX}R0KEC7CvI+Xwb literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/_cython/cygrpc.cpython-312-x86_64-linux-gnu.so b/myenv/lib/python3.12/site-packages/grpc/_cython/cygrpc.cpython-312-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..932f446f9996ea0979ce5d035a235fdc811e29ce GIT binary patch literal 13247656 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

    2KbpJTtTRL}Lue~s)v#m#h{!-xN| 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

    MW#q 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 z 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

    FrK@jY63q)-X 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�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℞KiYxLFSD*T8p`9@lY9WuQHtIb7 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

    d+z#NSvI-vjUs=5k`*i0OC2=ze_lr#0&J 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ⅅG}+9B2JpB(e%#Wq`e;i3jX3Y!hAVWauNh232JUCKvA5t*k=!@A zUvhu^#FOj0-^<{p34L*sky1^1rzwc|=UtZ5@q_N;1iJ!j!njq%WfAfJ3*te}4ot=y zqs4E$D{MdJ7arG>tSxBr59aL)JBUQYeqLY}^;jROn@VaV_r(>U-3sCdJxm_R-eIhC zhi|Wkp8&a0fK?3pzjW>Y=1PCxm6F8+*xxVdLmSEW&$h8;%|YDi@8==>2Xa|2B%`x+ zbp!{xub;ItBwfFrDDe#dYMwDjVS+id9g4Oj_VeWCr9mU8Ym>p%H>peYzN!s;} zqZp18Uek23=vTy_tl1EktLChwRM(4J(jp-m4HFf4vUvt?J$mN)oi_Z0|$=AsLTQ1G4T--i%5g)+0F>tJT zMViCtvCoD4n<*O|{noe0b`wrd+vXe&6iplB_BlJU+JvB>F+ZAt1kc{}Df+KJxPY%3B|yoLJ4*R^wW*Ur)Xt>@^T zfP47Aa~$#J?`Anh82P@qG5A**U*hmq1-xU-OJ>*Y_`T$>k!Ex<&yX{9&uC~USX{QhIh6=_1`JrT2z?r6s>bhv0dj z5RFTJpQ}E#icx)g_ZIuEdQSAML`ie#yNT;<m1SWV~TXDPkz|$9L-_?k-O|8MzN#t|gq`?q0Y zjI)SbWxuySb18U4%Dc0>l((Md-=31iJz3r*WS91NdL7FVG25(!a6r z??c?u{}94K^lw9!5z4=`o7ks}^2bp!S@`p8{@w4>KBFA`lI~y#K%AZ1hG!N|g z&z~wb+5xG*9`dmL^IhVPa9x1szp78BVqc=9q&v%d{sF7Jtwo;`h+E}7g>aDa_8^N# z`PX&T_OJY{D48w%b8P;@?@9Z2@J|iS&rj1BG0NYY{94}S`BL5kkoub<54*fS5P$Yz zDQ~>$Gf}ahQ&JvSc-t%RHjj%(vu&M)`WGWc*<6SMA}89t4-;*xO!aM zF-cWvBiU_ymlIu3Zp0POU8J7bOV#MiUaErBvp1|I>)02zS-t!QWdA1%BSrR8>r(3& zEl=+*V&7H&lCqbhqFTg=0r3Tj-$^{4e=Bw*C5wTD|97(VIsLBqKjM}?^AHZAPZP2vD1V0XZ}Ccb zYf{od_&eJC(}cf;gTGa9{yoowrMSP8w_>2Y{WOm?kou2yag_Hp;uk3XK$>lz#)_Xr z{3<6ti}(?WUmCz)o+4%FLHtA~zCH0tiXTHfzW=A#+bHP)EYAO?TK1g3hW6};xMj~& zgoD`g_zbWd=_lo_rTm%7zl)NR2gU#IxA9`$Z0VW@eq9pE;7!QU(I@1 z0gz?4H3)lLvv^z97>_Gg0^MNA$cJPf>^WG!CHl2Vg;_7^N5XGFU2_*A;seKdGK_*X@#@hu_WBUUoS74v!2*W-DVV^q@ z#CKs*O4(<}N!;m;D#AtVbNn6JXF5QZeP$wz{Z6**h+J+!d0a!tku?h6r+|JTSzT;n zeaP}wLMI4g`P5iHq(MXPe?H*uFxo-GO3z!Sx~`*`YNncM7H>V90#iMxrYhH*JB*8{ ziSgkjG1aSxoScF3yZtodf83NUQ`t#G{EyL8*v}Ypmw5`e1|3lLGq(4>%6>*TeUkeb zk7MJ=sP3XMoBaewO7Rxzentlf+})6ounb^i0C*+1{c>HuzC?LO(Bn~F4Q;6(J#r_q_9*UWoB`sbuh z(g(jgE$|&OyMO+ov&hy#_Q(D?@h9n@Ga<72=MFc!*gs#1!3FyllxY9_1adk-De zmv-!F&_B=Q{aJzj*#}nR1$2Xf{`u)t+KBx#zR|-@XJo}0R;M$+4P~yLxC{MrFWx-1 zeV~7y-h`b_0<$-|UXV_w5hBt*AN!V_&LdC+-#=4X79v;cpCef+U!71^54-7btcFmZ z$!@97bIjZq^}Gl5S@%Av&-aM*RT*)=)Y+o|Sl^Yi>$9BJbp~WfC>CsQkGDG?L>+@yMpgyabSi3&IOD$cWRZM_YpNykE8{lG&x3?hZaXr$u zRDG6AmHIr7i`3`rw^*O|0%X-^JA|?C!P{7$wIvX!&+WL=_z=4%f%<$?Y{dHH!&KB~ z`AT+u?oN{WoG#hcDd5d-wGGtgO~+Vg@3&!{<&;Q$Zb3xq^E#2u6xm>vy^hEq>(iXy zwKiQgdx%@*UXQTH^)kS^F5Y&5D_!+$nzJV>z7xo*rEIqDWNF=t364U?zV&}c)ooie3&L!rZ`*FoN zs7{s+1-&V)g*bWZ;rgc*%?_34mwo}Gv68D5l)nwiulo(H$BGU1LF(Vq&apoHl6a5e z*AefFs;=07Q!*P^od0P}O=SOnG3}LyxMi=Y2zy-JiQvaEE7P=rkB>I^h85d_c;g0a z(xGCzA|fBhy!$o|DhEY&`A3oMqYS%+?O-b{kB?d$;ba;9uli*^EoFI%k`i=koP>H@ zKe>=GejFzb$^1hw$_!!*xID#d=yjw3I{>x{@G-)FGG`LX^dqY*D|9O~iRSG2*7zyZ zSL^76%%1Z)UuE|E5fCzamfr*aq6u|x_AV0b+4HsUKVEy^^zWEMU%nDCX`9ZW`@(b3 zilet$-(dWU-ve(w8D3K$PpDlxTig9Z-BIFGF_8KfV(wt?N5&JMuK2mc`=ZW`6l??~ zBZ2j}M%@ihk^W)hLiP`X5x3lHD8heouYiAdB1?$!Co2C8<-e1X8ZwWGdWK0wVQVIt zzU^!FHiAfb(@t^SbL?KGEI>*qmWK$wYzff^`gh%nQrSn`?eg(MTZV@-V?6(KY5%AB zGc#j0?n3{UXqE5qtJ41=Zk2B;!a>S6oGdZQ-<$mA{%^L}@IgrZO{tmnd(cV5pXF)> z-@gptCn&xi@nxL&YQz^R{$eYezq8_h$_0K8#$KEMC{m09#qSK@>neU5@e7^!)x@VO zer^DNI!pAQMSP|cpG$m#;xhvHjfx*cd>bdeJMkfkPYmFvDV`q&^H+D`lZh|p%op$f z1n~V7e+%(Pv0q`A_h#Z3DE`1bwtX5azAW*pocMD&z>iS;(g6PQQ&Qe9AoWjl;}s#okXzNh`L`^UbaH z+4>c>&l8AS?ei4ELE2||vUrq#-QB`pUHMNd2xQxDr?|*>HECv2v;Ad|3Lo3l=DSM{pap>>hEo&7-z9cL4C&)kMAEVmKho4fyMqZ%BbUQ z=a*>j^GzM)M;O2F2e4`xE587;9dVZbG_EMW*pIc*x+$%5ht!uhEM4mAIs4uax%XM~ z-Z$mm=Q%5u)y}V}yf;VZ!(m(?dR(3Cd$WF~)Mef~NbYTDODBl5rYTJlX{aqN5b2L- zu(FO4=|RLa-xo#tu_^r-S3IY%r86(lB9lz%e37#0>%G%N+TWCp7HNttog&giQ`$wO zx7gB&BE8O(Hp2BP^}PtmMgmq%sK1P6Qh!^Xkh;#Nq(ckVU&kiYhwG_nbE$0$#4Uem zh49t-qvRe~-LcSk&7tV!8Ty*T0S4qXhfN4!OQX)W74Xa@XPd`ZhLsU?`0g&zp*3{S zcO0frjZMuV^o6CpFoWkC<*aK1u9@`w>%&M6oUfk+0Z;13{PEbU^Hn3BZP)i2_%4#X zH$iwh-;OX|4QkMvimXe8phC=EQ!^aD!pl~C zIf|#0lNd9P^ba+U^wS7(q(8Y^;7q@q3~8JO&BbsJh0fuFt*n2VKX_)kZ{Jr$OlU=4#fyuo;X($6gIZ z6-#w$ZJw$gA(kzzx~Vevu2a3sVqcJZb7L3aD(~Qc{|z&3C9Zrrbk(9cYruZBqH|d+ z9&)xN$-_Bs*aH*bB=)|n%%Z!yL20>rCxp>3J=R+W*!;*9B7Y@35D6?;tnu+9&>6*80l>E_HWA+* zkRkocN=lA5rOqcBK^e)gv1GUpaVx_^2&1H>-v$e;#~vrk2<2azApB*N|3OM73xA%? zzk4PNG|It0E;xT>vP3F>3i)+DHGhbd;q*Apf02hhpZXdp#u2OlP~KVr{4m9DBK{n9 zSZw@q;#Vr(e~0MbMzJ#~*#Ru}|8BGFQ&seT4{^&r>k$rOp9jd2ru<&zKRQ@+Z$`-= z;U8@CFMpo)>FMC_6P*9-Sg@SM3IOGeSN@60zn7Bo!e7DW?=1Z1Zw=^w3E?36KS!1V z<=@%ZwtrpC<0(k}3lkjn96)@!;^z{N_5UC#ubYyQz+(N6Jk9n043>AWL!Y4tdtB{_ z2%Ohj@e#KL69_ZP9+s`YBt))qUhkKuk;@UR5?KG5f2QVtkdl%+nE&~BEC1G#{|Usc z`aFej5PQrfi%0p_-7e*;uKfJsp)p(d=h*y*pJVy*9Q;!e#`md-2$b*Boh)A(Va6?A zOZn0fxk~wNXD%U{f1>6;<598ib(GYQ{A-e3{JEdxUxCEt^OMR5dtBeeF@Nm8ek*~S zrNo#pbPz>~kQi#bcu4nH5t04Z8$`BRWD``jfwEHjuZzY&i*&47VE?&|wEiCv{qiXp z*;wiyx0&@{AoWj9Q@^1I2eE$#vV<{}RM4{g)veME@ydNmBkX%D-oz*k>3eJ%qof z%|BoGJ39DNgY(CeY z6rZ9@rXex5-h_K)4KkrVR~f^_o_KzSEB5VWb;Q+8uOv$UBdbG<%eW%(V}11U#YodG zrPphxk!*};DfV6(FZL*-`tk;2@@=$tUVY2nyM46BD8wy$k3$&W{~#i(Ccgh6fes#5 zTM683Ip)jT*+Vo(VyF>%Kzl$$PJRNXeNJT6MfM#&eu;-B^(f=HtFY>PXtG#jJ5{!j zviauok~^s7N~|)_Ui@*Qf18KJ-cgk7xRv@B#ajAT75(2s+|qwN!a>?gaW+`el;5lT zN7IFWEhU45f3VHJd@AkJ)4|^-IRBGmIm_h<#y{nssQf)CDKGpLZ2r!|fBu$${+AHG zn*My=Tks_)o>%f+4QZTaJ{~T_W8OkMqb)0vDE<&66wU6xf{Gm8BX>oJEbM~B!u+@x-^PL6 z=X!$SH!zbzP7g~?QFr53l(;J;8-en;Hr2D*LHT^v(+b3`cCZHFha8^_K;9So3Blb5 zsfp{hXZwcuM}lXN^LgFN5E==XIV0Z;=Bx9&je6@dkow#39&0{3iTDu3C#s$^6#FD|JF)yg86U3U3UI^nTtp9 z>jL#zKs*#h4>J~CkF7-6n_`-)t&hI#20J3t{A}gQ+x&D zkJfjTx8y6}7byO~Ew+6cD}Fzu{#8zV5%D7wzchfq{E(D)De)5(?{ihWiH;CfhL^+( zSy4Dldbl34z>$cGSB{wD3T9Itb|UbY19gdSwuhJa%Wm&k_vX|0x;I}a>ki%F{_Jwr z^&t4&BnZE9ME%OT-{V?``$Dqs=DuZ?abTjJQSaQYSk=Pw!&jAz|G*!3N!Nm6^(w#=QzcIO6viE1G{-vpUBvfAlRjGQhS5;3iRZj|{`t|$_ZGLv7JAXVBA4tVT z6)5h`?|yZ?3s>-GU(Xa$_lRoHmHOvwOQ4=x3$)(4y7N0mi&Za#j=I5}KQ_rd=}K1k zS$EFx@X)NAAF}EN32~v>-{73|m9+4a`*5?a|6%8c-1$j%J8%@UP;0*hN_re$yJjVI zKoTpdhqT;H)Awk%g+n)OqW+RI17Tx1zoO-sYuR&9O2n}3soozrs?*y3?(oNg zfJ4F`yRo33s~g@MlI?Qm-|f!15<2R7)J(ML1GfF4${nHE-=UR-2gFy{X=wXN@m|`* z8iAJ^o_Z)@j%!LC={2^a-7KH1?WQV{*ly}#9q-P+db>IIEIs7@$adZ*;2rSN{IYIu zcQgum$U|u3s9taP7{31R_V!J1dppG$^Ou<(;yo=DM?Yx~KY?LwfA-hHM==U4eUp1Q zEfDEO^UJ=+vOsldo92f&&{D8prR6_imOoO>libhlcT@A5xQn=Xihb`(FoGDv77!Hgn{A3-jpqPEv1gq>Haf+7$k>g>l!9-@^g@lmb{EP;`k4}-zTKx4~>mWNj#HPPy8%9Ar)US!vg^{%Q=N*@N=aF8J=d;&oq`v?pRZUl>XCo;H5Kc;|lr z5lbJAJS~kKXj1+LNDlNTIj(TwxwRBe8Ixxbd49oNA0Xk%*@(?)7f#M`gg>|VwHl;P zlKyBD4Fz9~GwR(0OZlE+0b)|T+l+HH*n-;jO5qkaS!t?KFnpC(I9q_e##MfZIedTtz4L4Knoi#hCw0w6x%C zKAk{)ZGef{Q*_FICQ>xZ5Wz`*Kj_bXv{U}@1dL7xJKZ*%`m|(;BdYa{i^yHYrPTWu zXvr&Ao=HjE9+Ai2Wkw@2mehel-W}{)cXSHPUdvbpnH#ipQj*3f~k{#zij+8)uZj}L+XzBK4Cls|$V3FL?6=dUCS$p=*m@J}} zmf=q0B^>0!z+$yGw|57I|42+Gvwzl`F6g)-=`b$Rp$NKMka@?$o!X~~V*N!i*i#KX zX%6D>;kZ=q5v!BLr;G~F!dj;IvSJgG(WFE*wk4UM1qo`!dG z0p9+x^-J;cL5lZ784o30^@A6rQRYtZrpC5pD@~(g_-lbEVr|#BNwNyfPVx!os`%~eGk%95jY!Y00e~AepI5HRB*UI_G#F=+>V-Ww41uKeSd5T^Wi0$6Xm2 zb7f?-asBJ&NQ&oQ3Gf;Iu}u$&h|i7X8&|yYtq5LYa7A6mpmjv#9*ZZk$fzCxyLh)E zE$eBwZ)WTQfSQz0@&b0>q(5+Dg7#ZzL~cXgkIoq_>QlG(E2BkC0yewz!#Y*R!iKKo zhW|}!d<$`FBwx38YU~lo_i|W7UiX_J!I_0o>^#b?a)%akMCS9Q{IH5PM@}K847qxn z4_B7Sw>~xoW}s$#+6ghEcKsM9JCVe^3C3WV`3N%Aw@ish$hi0WCMBEX`Amx1rH;rklVgS_{J?`ZRnVeWfSrie)$>XFtXAvO# z#xMlXKjPH#JT)#TDdZn5+mebxKdiEHMQh$*)ks9Od9iT-Fs~y>H=e{pcmip0{sl@_ zCSp=95~2PhsBmU2A29td^dDcjPJP&hQiRPRxaAa7l-ZSkHy ztgvx0)MJepiY<_hniUq2w+_$i(E<~)OH~@cY65YM-){~H$)6c(urQ`Myfb4H#40mm zFG%vt*d#L^LTskai#d-x|cfNI)UjuEpa zBn+L70A!rMPf-a@^Glm56OlU^tu8R$V1^elX=yZbzWpf5?jNS(fVd3!nGfB?%16S; zhc!(_Fj+I5($dUo55|+!!cqVJ-_Wl)c|l?GO8CFyt@TIV*ElYi>z9bNmOG!(jRw;` zwB3||+DW#SAE*35Oa7`yz&@;y7~E{{T42OfE9<-f_A#cA0+lL_3Hi|rEj#gE?OMX2 zfzcP6aPD{{5Xn7v67o1on|XU3+}#?m-1-l^ z$uUnlEGhF3*pWK^!H&zcAW)b>{;^Q+n|8$KmU3hF|H+QaV&5?BNTrR8j=0NFWU*ta zZ;hO5N%f(sfQEdEW*~il2Vs7HIgPV&-fPNIF_aHZ@GQ%1`~ySbBwF*wy* zVia%*<=yAT0w{MH!IKJ;B4%w*O+1$rF|#Ns{P(0O_$*;WZW<1~=xl#lb#|7AttCnS ze;|r25?OqtU{a^+65mtsdaO-qW4iAiK|^9$!X*jTamH=dJ@(Yub&n2B2>CM9FKlbVk*W8#*Q-}6FB&Y2{4&aYUL4#y`OBk~@s z24K#wvM&9#Z1#1);PBPchWj4uDn?AY8#SAfU(=CNfEzj`p2%Ls_7!Qh2N^DOmSF5| z4@x#ZE@n-h$Jj!UhFuLEC!9CDY~GMWVI*qTDfEbN9FAvAUXvsonA{~L$ zjx6KO9|4z->PEA{i$+Jxze+W8E0kw)DCC4yx&*?%bm!?QkwlYK*r5sC0HXLl{p@!cg8#1{=qEH zHyW)9kC>i}aeI@ay@osI_yrtFD|^B1?G_s8_FizupLNG?#VeslF63MY&#Z}SlRe4a z;+!qvo%1V~?d+{wK5RVS&40h% znur^X+%x~D^;W{4*IO<9i6G+m!mdvm@dnHjF#j1Mtxmf^bguk7f*Z-BC3$9Sp&9p> z@edit{6}!+{AUVfXse{=AKP!S;Bswx6(CbhO=4e}N%pci5 zJRg{!(OwomsHBkOmoN(XU+~xZBmWQwKkL`xXX$7}@-vM3wde!detfTjY+Kv_w$k;R z{s(*P2cKn+HxMpm4}wd#pbRqyyETTu+SYuP_OSTH2GE!M5{5ng3;v3Kjk_(xJKc*G)inRTbg3!g5&AAyrjkGmH?aN}gePglt*;Z#~n3+Z7wLx`ZcJ|evQnRym zOvD0{X29r)dP*?HI(fWpb;{=U`Y~n0Owj0a{ui0DQSDGpF3o8^i;{+{`IqW_UD_}$ zCzixDffmIz30GrqD`bd@Dg;0Bo zN5n~t^^>fosa$D$qc;?}Sr=Eaf5cjucvaa)6Xkb9yEjY3hTbZ)Q>`D8bG|E!UEX@F zLfy3v<{T@F3F|*{3-RRsRo)WO9y5?{xEE1mc``j^bG?p5Gk9 z^zw782XFuYPUiXT7kq~yyKZXyG1i0!v+(gz?)Nbbe+K`qAUffF@BT@JqgQqE{%&pz zXRqjlS28etY1t|9m#hxh=8kda_cKxwzrms-C87gY8)QFY)Km7GI(dIhiT^6)Sqz(3 zo{5;Ai<}T)e&Z^%^A=Ak9Frvtyc6!J3b&UPOsW?L9frV|X)!67vK1xu!VNfo#HEyX zYl^p67B!=)fGcrtRz+!4x5Fm#-h(VSuq|}jnE$i3UM`W)dO6*->d2k5UK(&1iqI zPQ*&foRlWWe4CYwxfdp-*k&@_5XPDblb#m(V-jAmf$R%+{RzJ>66EHL7v$8Zy z)TO>tta)i*ANqta=svVeOR*2F4r&~Cvm~9c72OG2(O+j{tCpO2AcqAf9+E=^?N_Fn zodvY?AI7f^6hy4W{udR6+iE`o(Uh)n{z6FQIo^8hW_?d#n?Nx|Z4<B?`CVhjjhhW^Ng;z5swSlk4d`qydXC=Qr!K1JTtNM z>WbaywrO@zn2G;JWDuC=aJ<6$&7SA5$kw<; zKDqV33l4xT_YKCOD~C(;w9+owTTAlHSeAu7bDU-f#{oqgWO;)T6RAV&5h@y(!tBBQn8Nrkt%B=MdI7yosVU5AiZL6Cf!4u`)w zzqu2C&uVD-$x~e6y1jTJKr`fQZE3u47Xs)tj`0?8++4YTR5Z?~8MmJP1ze7OnB38j z+U3u2t^7?4H!&QByYGVU$t&K>3zK$6On(qCcG@YIV6%2|PZAm$rW{g<)-1!Q#q7~6 z*iG|K`vY{O;h5y=c$ooixzoPs+dG-EKDH1y82b*>Q8D}BJ_K8ra~J0WLF(!+Q0tSv z$1@h*lVt5(IPaM(_i(4hY9?6?&_s6pDkZIs{Y*y_d8QKg!Uke^l>V|$tUSEr&M980 z)UGn3T3K}Wa>R<3m!?$D)T;m`aQkqG23Q%U>AB z`vy-sc$@eB7<>m_=1d$CX+_fU51l2R^#<8pMA_q-T;V6=>5InmU#kt{@Ow7~Oz3z> ztox~%G46bv#2IF!<_|X9-tSWqPho!W1?LA9jj*3&>d`PI{*+8TQWCdC_(q=ur9J&% z(zI_dhPLw_*=*eO|CoChI6J57|9^&rq4W%O8Er8LCRI%OMKjX0C--yo3~Alc)+OX3 z>XMY1BrZutXGU@y!)T)@trRU)B`#kQG={`X+(V0?h`Q~^h@`HeD!=z&D+5dlu%%-?R6%JJ4XoZj{VO#nt8fo=-yo1 zBgYPp_(AQ5-X#o_OyLlacsA4U3?|UyLgFj3G_il*#zcU5>am1&&J27ea}N4ZhRV5G zeVp?lZM3A$zZ5+3%Of;S;#D|5Wjjb+YW)N!vzGbUo97y> zYIq3+Dib$LHqWs9;c%iiakKfu)B2sZcZV~FjkDpBIZIjQvys{?>VbkAO}2U4n5!!3 zoeJwujhfEh^FNVz%_0(&r>KLmD zZ4{Ur&ZnG_rP(?uxw8(l`j8qJ0y$dO!H(~&(huZv#y=qV05L{9UwZh( zZhkFZ_{l6m=B z$gg?%W)@SyuetI19S+ZSjH;7k$-A&z%QwY0qiW+xFxCD5f+1Jpcu>gZpLbin28`3+ zF0ls|aMT9v4x(scmP}nZ!`gk#HK^U68V@A3>(*)w{P!fcl*)F?{V@UO^4favlG*pUNj+_>KN2+Z-Ty({0-yi0E2zpw+&fzp~LFI)?t zbN)qROp~*?$-j8-nw^80{JJxw?bvm}QuK;uc9DA2x?mNziMQ_k_3MYRfCY$#)E3p* z{LyLtkxS+?-hzFZm&NDPyfo{gKS}e<=r^3$BI)EhPgiM?@LljKdQ9~f@_^^MMD-U% zzp2;7Z`EI}E9F*%?}B!->%BhZd3{ue--Dyy)Jv-#*Nm>b8ymh0Mj>lP?P!SdHN(66 z)l~$$Vd|DD^KTCtKyxp^_cgJ#rwNaUCX6f}4jcctdyBQW-RK ziMp$Go&5&QiV)qZ5Z&qs-RTHvwlHh3yZ*2IC>xY`UI_=sR*y4iF=5q2toFZV-2^QN zl(P1-g+?=>_O*o!p7{iS-qSocK%wWtFgJbK8Xw*tGlkQuwX}L{)qCrEF9!hmovWLE zp?+j?XuB%yLdoQN-6xNW$3~3H6v(-^bneR;=otqku-=OIVKz6%0OmcGrm}MlJXlG2 z)7CgQ-LbSsOU(=99?AqeA-~p*M{)&Lh2%^&HoVoehxb4A(T{0+DE|Id^UGEgj4!4m znzM5Q-*OwPFKtREbs4Y@rVF?^pa`n^0BNR`)XR!g+fJsdng&dfW*;mWaR@hwZl%H719-ZmzrFJlg?>Vz;%)Dr+}xKL*N&mpV_7lng>o;+FU{uH z$2$kkc~iP4)2d^JIm)M*y%A$fOUu+uZMA7?t1&E6$JDY0RKZ++UCA;~b|Kr<3e(Bc zxI0dFk>x`25OSr|`@)Zho8ju$zbLE~&{hH&T~~$oYq?6O>!e)`1`=EWEd9BD0|XSc z&kb3U_{&ZE>by7F#$_|9eOWxPFUF89M&2us^vyfia}{dqo-NU&X6d$Y}ARX<{Yh*e#X6VbvK=grW|UcCho zFA&Subj=#dk926{tDyT;SZkgz^0g*dt=+5^k-Lngs#z>F?Vi3@o6p$lp(NjLK_vmM z%@oGr_9mFK5EBl@+yw~w(sixaBZo4niw0Puv5Kbj=UI2;0L~Wne()DS%)M%gpOuwL z47trpr`qOJan}>=S->_CA(go`2znpz{XXf<3~sc5hD<5jDM{Au^P^$k+d>dZm>sw| zz&f_v)WGz+Ia9fuZDgIIrB)*91H){l9JBCfq?QeQ#2Lcj9C&}KZLN4I5g@rgHTN5} zJR%U(|4jyuJmnBtqNZ|fmS!rS_c=SK;_&y3;TvgK-gJ_V5vyjgq4}HW7*^!6;`$3q zrXF=@Ir=_-hvqC$l5Jf^!hSJ-$Jpa9T8Bdli!iC)n6n+zN#PldBvCq~3;RPrZaOCJ=&^dPx&9FM;6uy=ea1i7 zIFSCd_=kp;_iULs7#nBwSW(Wf2{DYwHO5>f$A7R;$`mMjzz-z2nu+#{Fcf|A6yzPRUc~X?`sD8)6xROa! z?1ioH+Zj&4%+JQS@g&UTXXDAd+j3&~U7H~n-`r+uo-txVIl}a1goAju&Tu>5S3-;i zhxi41dA!2BURFBSc!hA+jzB|gNRkGNpV^6ukhcHQNT!@Tt&3zBNIE4Nx~fTC>(w01 zq{C)nuoDGVVP*-&p!Xr;{BT0@qJ0mmU#q!_tNtP=k>d9)cp^r6!F?Gg@|{hmQ+i1M zf2=}%5Pa@Q*N|R(s;0`C$r#`LQthXFg}E7qSP0xkc^;nKTG&uPYKDEN6VXOU4Gv%; zku~fL?5&RcdxcX7vaN3V0VZZ`A8}+k1_nR>dE>}gLMt*&u_~Gvwl+a(5h5K9SW{BB=aqHMb4SZDClslR4cVr$@ukioo*wZq!pH zlS}_eFJdH!;u-;kmc;;smZuY1o=s@^egS0!^cVx-jZtPGM4@HuBp-y-iaX@P|N0sw zBR&k8jayYt>oaj+RPIY9 zXq(prh5j1@J~G>Uh0qjSKyBAwSW~egl)K<#Tnf^^^2!$B>#d3jzJAY(z$alXmU)+i zwa{R-QC@g@d9@YqE!w{ceJ^R ztNvu4q^+FSM7sCzSjy`?WmQLip_L-~*`SC0^9^IGtCNA`E{rhLpzr7s(*&%#XMlSz>>u>5WHXjI=w9?e{pP4(m{Sp>exq>%pb7**R zRiniqSs%|pZeh>6O+9B@dj`828soLrm0?*W5Bv}yvQR`;HsR%1CSLhCTy`MOi}M!^ z;&2@X`v>3Rf9UtSt%h5AACJDQvc~T@Ac=1p+utWr#LX&h=t*wi`>a=qa3&T)wsgV% z*pz=`s`WoKrN_*jYzCoMz1fZwTr77HFiMA(k_3KtWlr4<{rM6ZVxqw zYzrlM;p1i+f?Q#`%M_-%T>kA`!+U6BEddDLWu7*DzjJQjdzo_}qTGP}EL!$&Am9ev zYg?ja&PU5?g5Vv=d{M*vNXgofItebvl@+d6jMHK}e5>f0%OBIf|T>!DgFMg)T?W*Fg!Q0Cu zJ4??OpW1xND5hAyHSmNFD++{S2HL z*sF2xE0gPX%j8>honfgG(X}`pL8Kq+FVT+_l2X6bs zcN6oaQ7xR^d);%mf{L^IG!|Z^DPx6Q7|>$M*f;5Ia&~v5yp+xEZ@Cj5EuG!xKFz56 z*?n3~&?xaG9A)OU!grnWE%~LQSs9_u{TWu5q_TqHHd0QZ+@R-z1CfV#eBl?pW0hv) z&*Tq=0S>O^-jl!0L^F-RDDHQF)?A?~M5Nr8X+j1i=HzWA3n-uI=mRehtOG3SC*jav zBrsZj+q569=WLx~{)-W!PRF)q4K;EnHov0w2Zz< z5EH_Glv$oPn0X!PSd>fie!(xKdz1dvZL)<;!o~F_21{XcZK&8`3B!8 zF&cSB7_|H>^B%H<`62Bpju@6dqF&~SRz|j>H05 zBVDV)`V(9ES;o)v!F8w(a3!w!G{ckR+aq9h;c7#Y$2m~wzuVu68rL2J&6IM;q`{AY zCjQX;J+}t8p7XJZq=+dP6t{C)!PWGSlQVe>}UZLli*y&QYVQQyYYV%i6S zH&sUyVmX7-qK2pvIZc9Jn`JEQkCnfN;w$Vm^O+kh@G(7&ow0E)@I5$b4qQw7qM59y|DbFk)ga^^@Qa0V#%xK*m&l=UX{SDQ`mY_e};;- zeS5Wrcj!w`nyEh(XHJQ!U&Cv;tuz*KxPG8`T10?b@D>yy!}37hsUkT0O<`Fi z-l0qakvQvjl;`%63{=@0_n-%vWv2Vi0M9M$O;t8mW@}V%*ygz`={ZLHi zpsS+O>_&;>3q@|Y8qjbmA4o@#x=%K^4|h#Mk5VJhn{T< zy(~(OMC2b5(#;^95R)c*cq+4$$%uR$gJ_L*nlBA@hWyrxM;i;XIZkRaf%4ZCC{F`| zy}Swe$P#sMV=!#BQT-oQl*Qh!=qB`hJvZ<*_iPuPXh;4ByPZKim;rDtfe65h=q%(s53v=ZAv zi?5>S7t?z*y;*t>hlC_lh};z2={+lgJEVVGhfYI?r0?l-i5@)NtkAdIW{)uDleyV2 z-sFcI78nc6ir^qQZD1AV&$rwYOq0PbAX}DF;}@1uO3gS_MRSR&;J5~#Qj?Kxs+At& zuS8WS&&Iw0BfcdPX!>G`^u;uJJ!baqn-IN(x=1aT=E88>2*S547Z2!HN+ZY{oT?SuQdNE_406J3MHEx7J)Oplq z`{w=*&y{rR}l(pOpMx@QH8wBIDp?ayMMAV&PX=s7NXVcAD2p6H`f%>x-3(Y zz?3$>TQkSSQl7oWvXxX(7E&hPZ-7o3X=|2t>o|G9;NAmE{8vmfl!%)dZq1x*%B&x0 zYe2LN9-9lEprz?12>nF;ZPe>1i!SD?wma2hxKqq!lt3)b^~yQIwmNN;F8 zd7t{!0~i??xrT|#&uO8Kj&2Pb8Kg$;u|}TNV|IUilasecqT(7{^8vx`6vy9EgwKJ- z5zU$n{`Z798Y#meml$$uVI0bY;P0dQ^ezMc98bZ27KEdjT*JEN{|YXlu>222`1t$S zHf?s|b_RZt@Fn1rYaqq3X_AiSq&Ne5q(FyuVzzKB-o9_=8s2HD1zxQ0o5=N)ao8)C zYnH3})1b0ZNYoP8e{V1hYk-9f678fd;!^c0qM(C7d-O$U4vN>UdUP8v&5-_`bQ zd28zuqnVDAo(}`tS>_mbqPY&K-PvG^_U&!Fw((-v8A-H$s_k7+)95O*NPArUmi#Ii zeXrh5Q>`Uz(yq)w=7Wd@#asMSIDe!8I!se*4@=`}&&Qd8-NTO33BkjT4K4*WK4f>n!$tRJ%L44So*Bntx_hyK8m-6}#7*SnYnL2UmG~gvZQk*Q!Um@+h+Z zhc1WV%N2z7mqu7Dk^BKbDmPT+E>rhfht5>FRJ$0br0iG2vRkRF zG*D6L^cJX>Huy)D)Hx$mf6p(a&dJ;q>jY)57X$R)Mmj#73GY~hW?!XA zqIp*420A^vWD(ZN724Pb&h(t)D<_d1y3=lQCT?>_rt%{@Y}ngVG@VI} z>CScRcfSB+2X<%geQjgp$#j!zG^-gcmF3$6C`eg-)kMbz_s;ixkzKM*tq?QpeK3=s zMgkluac{{W-nm5p8ynsvk&r%RIz}qFc|SDL$vWoXjZA)|(kr(8?XGiCw?l8@Vmslr z2CZY?28J46CBT@mZYXIBZSi6M83VEt_B$_E`PBN?B!5{TX7kPTeE*yOB2QB{;VwOD ztj}U`)c2q94Xc`+u*HSB$`9AS6ylXFY=Le)LmrYdsF!MQ1?MbOtryl3_-scbXCl0o zY76ur|48sNdP)2N0&u(l$xTFxWXg_G8VM*=kIFZqxmas7<{LTSm??!H==j+vV%BgJ z!SRGAL#^1@>1z!e#sap)d!T1CQdL!LbvosP{=J7TIf^Dq$ zNcbRi`+ft4&1;6z?>W<=Cc4dB*B%z=-_Sg~RJve}t^Y-s8FbHAzkAcS){t-TGC~>!@%d zB79>mg~8eUn`(knHKL{SM2-fA;w}X*ai|4Y=4Z?1P@)8M!Dl!aSqN6(C=(&&*cAI2z@$0$~K z?91vIWlW>)^`m=(*1Jc3hs1|H4C?5H=6Jn_QAHBZ-T6%jNc{ZH$T2&rBKUViztru% zylJ6`RP#2mvu*u+=if8PW$?b0g!gBSmAnf|0bIaM)OPSoYpDW58ZQq+68CKueV>IS z_&x;(qQsg16@d5Ud_WbTlskfQVL)}ghsWW8)smTgqrkVuoiWA&;Q+tzG$eA=(Td`P z)K&yUbh6(S7{5xVP#eJ^=>J$h97#6lG{%Vz90)arX>WXfY;}Gn;>@Y$`I#{A9L7k; z_ngMFBT0kyF?Wg~>Ewo##oj$C8YydAxah{!Byo7?BkQ;AxEJPr;L zff`oSQ&dif7@L2yh}mElsd6g_>_@vuUu6X2^*s~y_`76h3@rR?-N=rE*N@C+*P&`J z9IsZ;7&Y!g){Dsfo4_EE|Dfr!Bz%rcvQ_wy&?KTNMO z1eXh^xZZ8d-W=mM`XZoBKjAQ-#=;4;jkN3VNRoZXmiOn$A8p#&&g6UzRpd6iEli)u zyTw3j$#HyQ!}3{Q$=nHEbA()`Va4n}aPH1kn7j(6GlT!0bA!@t?>8SRU|-cvcK>0B z{1yY;qFd#v+F}63Y8nT=l|2Unt)DZenjeCH_D@FU*8=S@R16vNoXwcfGr11f)U?)+ znKeyWtXLUJ(foF1s19OT-CQ-Tc(I|`m-PPk8P`zM4jMSRrs+{_qIv_T z5*9K&x;IytQQDiPZS0^UdhjkYL^y_DFOFgA!gs+u8pki$IHvNec$R5Bqo!gJKV2G9z&#A+E^4}^@IF@nz7F(@qmC=>+8C|evNK!JorqjCTp7*joqifD= zeo)yCX>#P#o~qu{M#+e>K4>_)w&@l1^9e0k3e%X0I7k0rPK0^{u85kTp9~kgx<#>{ zHQ9lWM6JQAzO_9^=4lOT8UILLiWCoyH67mqTJ-;{u>aZAs2BK$xk>+}8sc1a&xhKp za5Z{UoVV>CYd9`F`eck81jWPV+XNP3jj2lAj>g<{UfCkae?KNun1Q@}5A+hAg5Uro zFr<57D(^SdY?3J)U6t7j%R+`L+RJP>X8Kf{f?mmu4@*;XKbBtrDsF+YLfj;hHL??W za+UwmR)@$+u!Z#D2D3WXu%hV)jrph4PiasFAA@H!W-nVjcE^PO>-J{C&y7rY<5$iZ zS?}86d=({q5WBYt?3-oR%suX`u-`o#!RHWc8aDi&6=sU-PD1^W)AvP z7xroJo$Avvb!Sxu2AGqJZZt@#o3enFVGuixV|8^`_OXIhlHjVicz+*Hg z8o)uKC-d32hs`^nw>zHSk5#{)$nLc>DA-Vf|8}XiugM2e+HcLB8q4(JKKgx(`n?GU z?a!>a^duKknCPry!wzty{lu5OTcWMzKpR>2l3q3 zn4b)|G4)0Jp8X~)93mTNI`jVYTCMF9_L13wav$ICj<^hn`iKa4Bfa7GL#Ttq_xb&h zI)j&=%^G8LowfXHBOFVG8Om`r0%h|vXm2z8+9ou3=5v%@a88^~n)#=X}W5}($ed>~~)bRV3CO%$g`YgY0ZKich zRb?oTvVU%o{j*(ROtlUkII_CEYxediD-VB>Kw<2R;qjaxSdH8#AWrTCm_965MTHil z2;UzYUscqhCH4@##QP)9Lfhq<6j4&uIS#bOua;^%fhUAJb?RWMO`dTXFJ7>g;i zV3JC-E~_g}oQdzT{=Yq*5<(aJZiDgEbB*Vtyeb<{z0!Ez%BxQsPhWkFyD%(MHl7AT z<2lv9_c5LxKscURmFjyueYy2+4+HdEQ|Wm6w;#Bw;@jkSdNdeMx4`%EbB!m)45ta$ z7Z0lrKQxCHupM4QP2AWy^-?b1)w?y!?ezi5-S}|(OvBjPv;WB+)au#a*Y--RR&-pD zZFo2}zbo6&SkpY9t*fb4X7X}$X|(Qc%p<4yN%6WnVzNkogzBJq>)yS+e+8HO9vsM- z&A*RpzM83^CfjgC?VQ&&@zB9fdSA72+5Dpt->>xUOZPu%1%88;-7N9&WC;gC$rEFQnQg@x!-|rXU-uoi!JkIxq?q-1gVMw|8};T# z%4OI35z#kGJc-YHDnfH~wvfj08KtTGn1( zSNAG=o(|9P8+ri`o6p{WrrW<)r0MrR+K{G4s@m6=bOKEBQv>F~elbnI!7rxmKVGkC z`=~^GVa_8FVMqVTuV;Jjik@t<&J#bFYH<9BtXHNBBNAi)8J~z{$tu)>EZ1|DhcfTo_iDnm zn4dLRqtoB*!#awyk;uTPakso9>LIc{?sXi`7`&ck8`h-SyM+|?a3rmKnJ%`|O+NT? zU#k5xN(#2G!ge z2$M=RQx*IP5QzbP0G2vJkW%fx0`Ee`PS%`eCu>d@G<1MagwJ0*KkoSM)n)v+8=5!d#~Q#HKTgFC{}g_l5%c4jm&N=zEA75BSKZ{hh{lh< zT_}E>#OO|{al8C8X2>HrhwmSSR@N#d7|fdTGR;FECgUe^wy+<@_mz^!$1GAK*{LkjnYv z=k34$PyER)e(_J08wptPIWomMUzzCD_j7o-s1)S)6R--g`^j_}0;=hak%tqVfEQ zk4SLH`;8Hlx6t8YB zzZm|MT^QPxtwZZk9esTt*wgSKR%^D!FD_qUSNZ3;4a?`(U^Yp7 z{C#2^F46iuaes#gaNt@JCu~29jp1Ip-Cb;CUjh#{;b-!ECXL_g&oO?e$V_X`6nW46 z_?`1}RT`Df6n1>-w|@LG(oLJepeV4xS{-eM*~wD1vS|!p)?IY7X*N;Yjd(NGZZlDI z01BsDASmSm2BeuaORnR$v|BKIK6;IKEnfGIZGV5iswBoU%Le0cK=WXm#ZoAlfZ-Q( zblZRyu4aJ=Q$JykB>7KiKzi~=Uh90D`*D$kbLs1D`7a^)cc6>>Rro&;kn-`=fP3=( zi^W#(J#ORithe%|<7uDbH2OcJ@{h#hN8^m=WAS}r{61wofBF^!n2Fo}iEb4j4##s- zewL5t)Xq@DC=in0lmnA%+^uiKOZ0>E5=Qc-mF^$k$Z8fz0joW+uB9`m#s<_p+((6Hd^5l$jIAv3JOxb8M3T2Lp?BHJgvoEq`Smgew z2-QBk+*iAqXRWI%C+DYZyrLJGEByFh5J&!;T8G&J-}l_fOA8D-vgix_~d-uUl_Oblk;OY3J%f;M(b(o@1E2% z6WW8R3Bja8Fzc`)qW(_x{eABS-`^d>B2Pv|=EEh9d7@N>1-dBESO2P#{rmn##r|Cx0_eHS6KD2a5nC9#M&XYIVzCcz(W65|k$V`5?kv%}oggqnD z6xKDPD@ViEyWP%~hHI5N?rGIZQ-7I!>mq;Y(xszyr7k_KGMe?*W99XWhYNM(kDtr^ zFW#$y{&={`e(*Ej>hvVviczT->!KHClPHN$&geFKiauTe|5h~bQ8HhC1)h=)+SHxI z@-OHoSt{2}jagx}G>r($jevKzM7(SNJ5`}4}~ z?_GaxN%_3)$KGk7(T@Eup)^c+BNumJS2`{&C(liyrg4cP zHPYBx5x#Rehf~l)2KcT86mZAehOag5t0(g!wB9Cnero+&6ZKc9{;pyDXHQDjA9nb# z!$@-zvz9XIt-mrx9dMrJ^u3?_m2A_9IX$xy0VX#C(Fv`~GJtOKt82}^F?3EPg!T#Qucbxt188Kd0n3uHdD3Bf; zb%v(#wC3?k5v;O#>s-$>-~Kf`qkT`4J58LuOXEe=%g?AwhDbU^pIpZY^$~%TTgw=^ z!%oxLAwp-Au;4caZGJ?FQTr9)MFqcj3y%BggbMOssnfCT{dcQMXy1q%iuUUDPxN80 z8gmuAy;|6D%*6?FtYEdh*@}(Rd>Yg}b)H6zleT1uE&hjQel$Ukdy53Rc;=_^w-4gCtSh#_Y}^60_E!2VW{melH<`bGp3+u$mQK@16ely|1oc-}`g_`@i`eOjd1g zb?RKv1gV$A^PSc&U2`$~6a1$oO#cb<#c{>e5HUcXiWDu1#?-nOU!psn$@atC1k|X< z#a2`MzlykL^d0YwQv=C{nEd`1y0B zXwRMinaKZ1`1vypg#|RyT#u`tKv<6(`i2(rSL-2IUdly(JTVF+<_w%~;FNH4{MQK+ z$c=HZ$cK{!Qkm_(Oh53qKk^G%Dj~y_?1CL$We{MJl=!Hgm3!A(-6VNW4Kl z`4d?i?H2lmK5)m(g}++=v=AB)9$3@7IM^7_(mUBgC2HZuMbIfy3qD@Ccpin}>|Z{r zRZnHfqUUN}WeexDSP9$cu=hpsIxpZswlK^udxi|Hv4_`Kss4u&2hA3KhF+3y5rE7# z)$ZaK)G)uKC6>QTzrE{mSgkFch7A2%CyRtx;gabwck#KX3#}^o3QMZ}X_hm=mRi$v z5>;b;^CjN+XvZ74aM1y3tvd3L_|=TOo%Yzxdnxp*1Y<<#;)|*A3#BC|UK|m>Q1mu2 z!{Yz@41Vtt3B>QeVh)AhmvbNS`=oALW9!1u}TJHg{Izn?=X82yQdjM3rWC=xa90(kFC zUR`odU%dOwa{?0b?iNf5<-A*?`iI62+Gkqf-5CU@drt)YXV3I5f*=lS=mJWVj( z^DjiK>Q5Gld3ag$qW6-d#V7w*{_Sl3V@|f+ijMJlp=aMax571VycL|cN-L@a_bT56 zYwY6;+aEgizgY#Z;20k1-91|eZ`8aiv{LFw(+;dy(p8o6f_NygJ8Nm{NYDr z3Y7}!z6Zo3TW+=n{zd}t#vQj*9M1WixsKCnWclUtgEIMVM>8(7Z9ff1?1E&r{n@iT z@Uv~Vth>mLY>xctU!@|7u8$3J~pFk=a8`4KbuJ&u1<8rdUZzMZ^Hhcbg2^NJ$2 zO27RiGNV{yYKKvA{V&w$?3lVr_q(qb9SGxo66UKU-k+0rKR$lX@y&uzIV0`HCkjl# z1EKMc>Srq5u*Bz6QKWqYTP56x+cxaMNFK=u;Pn7r2h&WbTc8Jc54{u)uV~&UVYQ|% zlpjy~!1liY9Waa=Z?10g911`_yX1P{G4=mb*H?#5E?b}dLRlDKa^^9~_0^}=|4O31 z)UW$tSpUG1`dWQls~(juKx*AzCxr_T)`*PtU1lZ}_&`#$AR+95{eKvfd!1PoCv%(d zxNiroYs1A!(0%j-%w{|P+pkY{UntVr`lNYcac%PD?&8`+UK6EyosfywB{$8B*Cov( z;fKiY+Ps$t^MltDZuG-uGXSjBO4l1o6!0U`^bCuM2mJ3T`n}MvBzi9@)0ehB>w`jd z?q+6G=@|hLg`fiWeNyPPz9_T}6k?Y~w0yhjC}dg)1yo-HmeR>7>U#Cs?a;_(k3Z|*3aX}UhO6-rD08>|0~*CxVg z^p_5^+u2>jiK)_D_3Th6>^R|Et^X)M^A-1OVWp(<>>PXwslk21Z!A>1!i;3Vh4Cre}E7X-$(RW*Sze+W!h1OX6iw$g$aO=@PYTtKxZg@{@)KheMWX zKZ3&2JkvnhBlqsTA#!n<;goqhRV}~Vp4$xv)>HJ{c2Bx7TXRoN9Y}P$k3Jaoc`0yV z+z9&)sv$$%|C$Z@?~W(WNK4(#-#M2fL{B_r(&ZE4cOUvr`1|G@DIxM;s^dh6Z_=A&(b_uLV$nWQ%-<&#EwLO$NvTadbzQA()a)U zu>TKy!T!gM(ErwA|G)fM{U-}($)t(k8}hyUYBAqWm^5kP6~Osx$Y#v`MD&UOS-SI!xnXM~bz{ww5}@x*qgC z_Tiw_kxGr*&lIZVF3MCs#niJrTlqAX6`9H>xvW%<{u6Jfj$JW1RmUFedz+si8L@e9 zB|Nu}lm?R49nz=PEy70))+;k`@Y|`a*e4xoU-n2(MEf4xW7_utiQosRt#Z=7IceWq zLi_66oWbrZe+dWLwC}4epI`e{xu@}`nkuY`crnz$4J#9BIMsfi=^}7h1G1rcGT1es zhQh?GPh{jt6Nk|J6q;&p5;eS7e&DNmq>s5fM7pf}rj&OVRilLyTKVQJxL2mLwDLr3 z=twz1nZD;G-^hn|MIxZxVE;iYKdkH=v~ttx&(z9~nYTfd@UzkWXrhn?AKh9ik*Ri_ z(;4;Nqck~2DWp(a4@?aJ_nj3;&Yj#ueq8A#gv?mPefR$3**^_ue9o?ag7x6Fe__Wb zW*7C+XX)h!aS4BZy<8;0x6ni(2|mEQNh+mO`^2JN#@Qx*oe-lIk>DxhRwQV63=%xR zO+qh!683-D7wrGyME_?M`~O*b`N2y*w_aX_%CUsZkPG%@p%jwfUGt0-r>5qEN;zO+ zj9JwEM^VM<{(+Cu{d*(5yi||&R|>Q}AbUJuqnJ*`$$o;@)ebjhHDKFsmKp!eP2-_yBsmWeL$ zdS0ipu%@TeY;}_nQs;L0=J;5}ndv=V_)kl1)i$7osybb*ldJw@{sbvlsIQH2y&Kz=2DtQOB*Wplm#gCg!$_(i@fOCVW>^IO!+ts-- zQgPk{+u|mEqVYpt-*+f|qQg6XyC*le$*n=TwzL=&^C8Ozj)MQ?RxEA`%}{;e4O5hT zl_U>eZ5kgl)J`_3b0ehVJPoRD+<*p$o60Yv!LWXW*EFw1-@+H zg!k+RB*)Qz7&{<&RHsLgNj8#pI~YDOeTEHwQ72UbvJnpoKvJ>#NoiY>7f`3@K9ee6=r)Z0B_wX$y zv6VB`zLgAli8HKZd;~4s#|wq3E#vOJfuE(U^od$7$8R9`1#g>zOn=V)_tEuV&gi4- zkKS6=_09Y2`n4A^MVuloSv<9A%B0iiYSjN3zW|Nid%CDE1+qK6tKUeH zu#ZLM?)2^z!AeA-XdhxVRk=Nu(`99}c1ok~?6%YW6|hTqzlrYWp~MsL#P!|jZ&U=M zDHp>l;<1&z=ZxE3RWGua{ZKXHe>X_mRqbkmwlh8F#CL8$LV#M$_MSpAo$gNEvkkt8b_voO=06k?UsxAeHe;K zH=2bk>2pg>fl3dTdgTa)v#Q1P)%so(MP+TbZH%}Xrta_fUD$J4o8ikt2!UqVH^}i{Os9?F_?|gz>*2+T_M+D|Пh(SH#`ds5)Q-zPshN-QN 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%0D(k0Wgz& zXE+NTdoE*Q6930aRQZ{eQeH2F?0s z4Wz4lU!*%Quv)&;h=b8)&v(AhOjh;3oF?D30%`Yi@E^gBdx3ox2L5a(&M7`E(j63F z--MP3_6VWR0%$mlS7J8W78mm9GYIbouF|Q}goIVgx(w4N?$76-%7(FpK@2Jj;hWd9)D8F0N6S)t;51r3Z^h5*c1c(fQgQiaX z@B$u}C=O|0G;q+cbT)`(6}HMYVs8mS5Ut@-g&e>Gd2s;3Rcs;}Mn2)|v8hLm+RY30 z$ExPXA`hy~O-iHL$*i5N`;WCkZn1(migxPVv@ zQWR#aAV{12)m=rg`54-#R4XvBXJH`fZnrRXQ#GN1nOm(d zWvN?T(J-9(oIOBeRpDvvJ+YWM#vpyeYDAqj_+GRl0%w0FYd=W#Y09E}--rEt*GP1B z$k&ZIqRrJT-aBf~~H}^3dgGMKFam99j$nN_QU-vEw_Cpf>Za=Xs`>oB)M5pdO z1p*!2y7%g>-sf%g{=rt||FqTjowjbVAa_MU z?o*U|H&=HL<=)oM-5liJ%*OyH)ynM#vi8Z!X+_@ZmklT4VIPI73$lNA6xs2w3h;;4 zQu+Ns_B_T5vcIV88W^&VSN1;#+4Cqb$bL&f_Io(<$vZB{UKZO=;~8HvDFD1tdGX<> z>bY+L_})R@^4K_e3S(pBB@AbV`Ch`k$?SUxhh)0!V@H2*IbN(jnyFp7yQt|O(ad3k zfD$KLf{I1WA37R~roLs<$U^+E`23cYd%L{!LwmI599AyB>kEyOX>x9CC_;zB$Bh= z$os4OX3DI{S{12uMJBi+2e={+sEByadoUYPG!C($m>R9oj~d4K=Jz9VEoo0=@=CenRp}L^Q&(*B&`QY znXboy9qjL&UD1cFXzkfEL6UgNJHQ_dF`q_bLu`LeQQOJop6VK!()>Ss!7bb8Rj%vn{64p|Lf)-a+3048uH3p{rn|CejTVs8vqouGF@N3)kZZX zxNKBUT_IzbU>2e)eOD3IXS8N*C^UKrI66|T3zUUKWR?9|XVIMnMaj(}WAlc@T?*5AV^ zICXXf+Oa6vaPs-sHm${+FTBAUUAKwp@EREl@Z(sP;);{;EE7;cxWM)bdDr zS38wPZbjDBO$}r%Wb&1NW%v z@bC7aLKsZ;cTZj1eVn8bSUDSbdFmQUo++F?bME-YvwM#kcXqg@M=0^8)Raq# zop~-vO}(Z~DVxyytn-@oX`a$$T+<#zwY;GV+S}Xqa`C5WM;+04W-OFgM`av3rq5UJ z_HXVtPdfk&&(o&>e9GR~v9|#vtljmWR7LJ3VUgrbZNQ9D; z`OX4NMjKH$uc6@X@<2-$1N!+0~wOxKbVnKd{Qxe%P>pOidp znJBV=2{aE3KXb&HO|dZ-jz7;3WamRa(==h!_}*upJ4#8(Z7Dk%ERBnWlHbvoP;eB~ zpVh5)Ir{-TT`&qf#lREK6JlqE5-tAo*_`{jNSUWiDH(M^C^?7c<|*5b3MI9iQuY0P zJ@wsRSYJ5Rg`HI!>f0w)@P9e~m({ob#=CBI5BR{{4GJnAs+vWYM06sifPV03GPQRL%w~2@PdG>|lVxz`kU5gMJMAbeaoOgjG{UuKu7mS)sE)v}sc+M*XRY25#jA6zwqqL|@Ib8XF|Uw5X(xj3Y&OF_NIgBF>NMSNOko(S04z zGsn;aX55+Up`GSbH5oa{M*&$`w<2ZgN?>}jtQo^Wh?}IV!X~5V{@CEkb=xImA zfLUh}3C;_?AcMzC{`-`&*u|V+?bomlhi7($We^Br(QcvS^*n*M#+W$t!UDXVdG^@> z-Y%!mv?=96TPS(4-`=x`yX>Tn?UjtVFqCYjJ!tEkQ1T+bvGW)9_AMowaG{hf8sM$#5J`M9TW6$b+_JtE1AtgOjhPdOb^FqmY zd2XJv{kTx_HJ*f)dxe%)d1;}(Uxbp96XAImop)i=gx=#D3;NqQepJxk>&XtC^gc5d z8+AdWqm#=>qm_yn@LuHCeT4ee#EZ>)0YQ`%O72Mtq6}Q^;%DrujzukFo$%hHX>54j z_=|ftHcc3FRsjs-N9AaBXL5t{GtWN1cPLrP3ypWXfX2T?W7>GD&dsJi6B^DU+K*k_ z2u0lMk5Dgx_a-@Lv7~9YX-AC#XQAX=zk(|k@cC)?dAFumcwXaa7tK?;jce+rT7H;IE#KthW#M^^ zqo@NJ=&G0mMPGE`#l3@3T|`!4^c<8)@(Et3>da8`ex6j_vtqE>R$UICqb_VB?|J?x zzW6ygE+>c6OMPG4bZn>Q*miwi3&*#t4_&v!4&z)S@eq2dvC`{86v+f&1~)!E-La`Q zJlAw#Y&^ugEi#L`K+@TxdY=_a{!$fBo6SjcH>2Qf+}`_ALflc4;gyK zgaSm3J?o4dul|!z2Gx|Sle&ZZ6Szno>W^l0GH&gn@K{Ei?A@SBTr-PQK2v&Sos3O8dVhcEvv}=^ssjKf`(^w4W&dDh zQL@^OgKMkTfx0rH%od??qfO1KP;wm7AGdX8SF? zORqY(=($fG2;gJ#Fz^6JA(g5 z)~^_>1yMzj6@%ruD&jrNkKTv+zhnGgBenY0=`-B>bWxE0y!BTG;CwyT!0DX_hs&pZ za75V|#m@a(hXAS=pe|h^pzth4KtEvNgVa9&#%MUmIEUJSMg}z);gb*Cz$za)pA+h# zJ|8}J0geIK0D$hy-PD?h{5JQskly!s_V2LepdsZO5L7$Thb#5yPtv46fKXdO!b)jd1_cUApQBgWT;J?rM$Os7RZc!kSgE zIE^(24XL%ZjUlX?Vm5g{B;D;A!OFFlx@hIv;R1jb*I!1905TLnCiDUjh<=2fYwB(y z{X3nIglbhj?bGuX*b^7lW=gAvNPt{XW&Ce~!+T_kT?w;^M#z6l)gsEnW4rF)`17rh zTpuo}#IZ zTifrM(wmO-c|JDFdxKSQZ8sucy+3?>d{I_m2`4{w5X>r$?8zQv77kF`ZG5Mr6wQ9{ z-r0_G+Fz2Yw|C8d1!B{&1!1MoRgaQiv(Wh z~p5~N0L*S(qCIU)_h?*M?=N=c9Q4QDeqrRdlY5QUbzxwlyI?&%%v4xNm>VrhmxAVhST#`QP`3E{#Jhe%3Q)hE}=P>a3~4U^n+ta z2&W$$$xo!_i>6T9an{fH@;Y8)zhM<;rL9t&zMVBOh~9GU>l#L)XK~Z&F!>P2oDr(R zuR$!X|9*`+Ieq7F`iVw0!tADcz4zgkPjW=?B9Q1O@8&Q7v8C!Y!(ItM=~~ zv+J^>|6%*8E@*$Ko?ZKAx%Ner-kTp<`|d)E2T@x8t$q0={x|Kbx}g1jdiMMOqxD~s z+&kH|UtySiu$-U&(*LZ8{(sSbRTs2hsb|0c*8b!Q@9hs{LLQ0;yrgPZ`R|eTioO(i zS4~3vX^W^MC9RKv#QOxIN&IHR57{xfa>Jih2rxgt^uI?XPmDaW^%56_>q&YdtRKpM zS4i+D-@Cwee)(b^^WSsq@MyKn!P1vrM2K^7CkWD+R%Kq>bjKKRVNIvwf1a?@@x3LF zqmc_ZCHW>2)9bS4c%|mpCHbmSH@$DEIi5)pENS=FlA2xO%h}W#uN!h zC1w(bo_fu~KEKZxkh77Ip*4FxE*FzIwntDBp9~df;2w zXB$e#vgejNkgz=Z;2b_kURSf_Ae3|;Z|p^mMEZzCnjY|8dhdAMwV5AZ_62goK<+)S z57=TIPG2q%oix;~km)gX;q-KMSC>RKUn*;06c;y*sqh!cYb*O_-t<ZDRLrQh_*8<7{OQ+~S;{NC6VIX{ctOqp&R;a%V4dS&;IvY*H}?iy=P zUfiw+%3#IFfm5_*w8$GI`h`>c0_N|KeL>!X{k-WLtgpEuI~Nv-og%z)xlFS%=`Xy( z`e%>1oy<#H)cr|V&vr=NXWpgDdla<}Dk{!?L2agoj(ZoPJV89-^nHKc+wRQCW3QLK zkIa29m~TOG@pWTR!7KN_hu+C51z0gXQw^tnhnV`EF7AkMiUEYw)Rh5Sr2!LFMMNfb zTKwNlf))d!&O3r|Q-KNAM$A&LJ)KN>R|2uaa<5>W%r;j2BhmDIGmIXLEEpp!`B`)`=|qd>Q$Y31rEI* z{86ZL;A|p-ZFjpx(#^(e+UmNJ?I)4=Tn#_X+(a{xG}F-ESL)iqclZcY_=1SoP)ZzV z8)T=Gdvptq-q}k?8kFF+&D#m1)i=-Wi4ewU{lHag(8o?yZ%$EfteIFe$_*+&OCf13jN7mKbtvtygetm{>-O4!8*p7;H2o+~5d|ogLaE`0Ycoz2C zb-ZIge^9;xZKj6ABM2kMNCBm-(AP}YujXHD13Dj%PXW0JbqL`b#%3ABHg7XM`il0ij*18KYxB0*v z*b$f$l||T$tgz-(J1x%*5P38dq1Gdr$Ao=N!&ZQBjTVg!9qCQ^M4h98us=Rsf9;Qt zUrjJf;dGcj)Q=23J+xD6-A=`+H?{GawQ!A{{607B7@#4Pm;oH&^q(3XhiHHbM~A`k zl8qfkCE(GwYl#;^SZDaH@gQfe!S6} z|EAdi1?yQ&-v;d+v+rj}>J5uzeD#aU&%*kjdAeB}=fx>cTzd9wZ*Xmy zAroGpRHTL*=RP&V7O|?V{dB{2{ia38;l)Z%b78115hP~S7W<`}_oXi_aw6|Lu!xmi z# zi9KKiv+v6lNqlWrCrO*SHa}-v8A?7T!B`-FWuj}C8wqa*JAEfn zoH&DIKHpNM??%)STySEkNahMll;qaE=>ZAqU2!{#$9BjKYZE7tAlC34r5nqJ`?}E zh*S%Wjo$ZTJ8b>f@EAMtXBAKCGr4yH9qP@; z@0=g}#B+?1jW1%_6lkXFxA0nrA{AQP4(0mdJuAKKOGOpYADEae64R7+9?s$H>-;18 zCNH#JhspA&TrQTwO35jl*gl#bOO$mW+!Iu50geKJQsl&{vUxy4W?5BafFi>1!~m$@Q)op{~E0N1MxFTbEUp!x-N7><6Vx_Dggb{U_=6L19}5ha3;pU z%m6pjjZdr*W2pJhm3%nOwB1(9^AFGDl&6Ek$^|HVUEPtH2rxBIUR>n;pgmc6B;L>W zfHqW6f8fo?gjpvdgf~$N_LKxl4yVag?#+-MN-p6o`zrtReJ49h6Vzb7)z zd!gi~^uWShx$gl6LdiR!u;oNBPomvOrbTWnU&zc*QucPslrUf=8BC8yGL15# zWD81{_w@eup6h8vcrMns{-%a&rmyBZ7PS#SMPqv?Z|Ldmx!5axl|D+3vt<5Y7MDZX zb^RoAx=UYX*F1O2^VZYHr#rt8GVodihVVExL;ju2Z*3I;o4 zjwlJ(71p+@&HfXva{GlDC#gHrTFIV_rFX_F=$5^BDwtpT#%(AujM{Q?xCJvhdk3OQ zB2CI1dN~S_BHezqh9uj^1PsK83O2bRtvpW#pc`9GnPo+zEO%R=+x_(iH3igMxT9`< z@UWlg=F{PS&8N23%{8RULmieeQOEko*lyepcVv}%7#pXBlUg(Rh5O0~JDtp|AX@#Y zcURjdCh%ljH}2&Gf6v_XYmJ%&Td0Ed-dwZR0(qN!fsIvO)!#wgqWnHQZx<3=lV1~i zh8o+ZJ9)dH%4Q2Wed?llPR^n=53#u8f~vWO)WiS@hpm*Y<;`9Vf=9P_557#pUCAX& zAUl`R-b^K(!Z_!RgI>IO%}U>fC)sgj-s2DSz!u~B*X*5$E78OmWGJAC$57zjaVm7L zCPE!YQp<;bekAvK;O9s3gF}8YlK=P*Bl)PIn;?vh6)V(Yzwqt9+;|=?G&| zY#4;K$@feC!c>O3f|*wKNwLr#%3ZE?uvwrA~xp~RV^Z)=EE-x%sX69mqIn(0eY(U>1S_V3h3tu z(a#Rb(1#~9#W$+`yBA0}1Z?DM*VaPsL#3|)8XJh&BIH+;)BsxZS@#x_pFWMq!INtK zVddBp?(*)^(=lq`Mm=4`lkuB>9^t>u2{>(CKO{~#v*%&EIhPDqw-2yD$a#Ch@~IyO z_5C;;e|DuLSSaxrsN-#hI59Q_XJ>`?#jcv}JZp3L5A3-#ejnqIeptCoeg!q&w})(w zOM}qL0K{i&Qlhdrydr6Js(NM-WzEmpq$hSL(JH|=@MrE}ZhqFJY}4z0=GLT%*`}A6 zQh1*+jcr?Ebfeof<>(0|{;Hm)?Bt01q&recbt{^F+WkB#5C)~bsgHk#zxYWqbGXvB zs8Rru*RoPB?s}FRP}Ok0wkDm^he%7M<#d^Jdf=ztwm!{OisqVj@OnHS+&@hG%q!!~ z>g~HoN}x4qWfe$_>TbjPd?ObTFz4$-L3cGt$z+tLg!f{N}$pfjCvzjgd;Nb-SD>FQGy`s z8(zsrDU#EBcdC54Me-Kg)_k){mSdq-tEK>8;uElBg$Z*Cp#Lsb@xNIzuAQ@o=`+wYhU zI(nFRU=aDKC8<&*a?wXF))d^)=I6ZVP4SKU#KkLxVW{PrU%L859lM0nb8OW7Y3<05 zKS7OrR=+?f_g-TuxQ%*tuEbohU&3*U8wq*D@C8QQ>S4U!^)K{uSS;MK7 z*}M7VZ4)%8C5jRG-M{fREJspJ<2`S01(J>hC4-8xgLD0KnkxO68gzZW8LZTAYNfgP zJT;`A6e~ni|IQYx!T{g26i#^?uMf8-U(j08r z-|^=4Rr*1>bYmc6lkC3$+l_F&Kg76sl@<&yqiPYc>=;s=G;v)+Ao)F!T#D_auEw6p z{t7tU_z=mr{Py7vb=SV-;vpMZv>l8~ngeIEF;owN-4=rqUn}s>$Ja6IEA6$*Jq!{Y zDQ%kz)qK6H)WK#VUOi#Q7w(X%{oHMW0`@*e;Qt!uZX~x*4MI|bE+T23JA(niAl}Ho zP>h1wMXk+BWU$`hN90Mpr&d*JamL=_Hwi`z;fB=4dFAB5S@qJ1tl5XIfo_f5RLl(U zRq-dq%mu51%P>?L+tBw6*GOL9vSb{oufTDk5%hrhy=e^2)r2 zu19J%U@sF!LyBTAbKdK6V$U07U-4D^K0x+WozLtO);b@Sc*1%ZO7>%vh&_x5;+gel zEN$_2Sc>rXtGcu8iGYp#BBc~*dy#SRK3W1bjmwR*_qyH{ck!Or)13^X>GOikB5@fneZDmRye&lu{HzidO2HwR-U;Lxhc82Qi>AigJ?oiHW-aXg$DbkHZ zx#oAaMoKTBe24Jr6|Oj4BeZ%IrPYsfDO~`B@DO3#%Do-O9_&92R0Cf!IGMug*uBV~$Gc zEddj$S>Lo*+nG7}xV3& z7dutu0?~*g*StW<-%GA!x@KoIn~)HOXM~00eY#5oSU4YbCR>nzK6a>#Z8H{R8)F6fP9gIK_2EQ&XAt^Y;}*+p z2H`dsgR>#^Tuo#2Ez@Rk5NCK#ryczb;SB8cK>nbTyLf;7lZ)5ju{%b;PY!1LW#lF^!O3TCIz$Rp46dB zkpM6i$p;q=Ikm1!Q%s?*_fCJmLzfP+l1xCDAsM71!gSK+x47lbabr;sNj&}@Hy;L4 zHDwutarhE$awC}OdX(SZ`u94tw?+)72@mb5tp393>oiT4L+{waKBp!A9B(m==(>kr z<1HO)JW0&z*Qjc&#`v>y^%zRXFTEAoBi(Xn57vY*JXVVgs(^%4f$t$~^uohC;5$X` zJXKz>3l*Xqe3V$h03{cy-b`0-mLsUO?{>h(nFX*Lz(5;Je_1!DH)+Ms%kop;_wBj# z`zDv7G>zN z=c45E{2a`aAKPl4e82SQb8lj8+-~K)394@a=BJZOdE53cO3T@k-f_zJ`wscCd-Cef zyHqYa)Qpp6FjVC2uKX7WrUEz_j%-|ME#CL@_i1q${)aoX zZ^N5?Qfc`A^j#Z-wr;No%bf3Necx5j29M7XS54AbWo~ejob_H4TS)`cOw$%-I7`fS z+{JB(e3BOvj@?BhZfcXAMWWYB^>2s6D`;Q#xAlkVp^3iiqkIkKBi{GNF@M{fg9jE% zEs1|vY(9(RZD6n!onKtvywH?SUn(G}$C2fz>ITwFOycT1R z@#QjBvM2e@D*DjY<|ZDyWY;jX1?MXj%r~a3n?d(58s}~+W6QR#YUP=~I;@w}Nou1p z5StUC=}8FicCY_g*m9ZD1Z9*{v1iP)aB4MfYAl=_GNS2yEmpfb+H2E*^14vsx5m!{ z5CnCTRO?7-rr|%6J=`?tM%RnRAWKbDJmf;0oZMlUe76{4NA~{DZ zC81=R{5+LOI$K*7L6N2e>c5xf7m6)3!NkzzV3}l11ARF=UxWtUwaUzBa5puo41rsQA5ds$it%$53J!=&v^~lxAg7{7(Md>mwVD9A1Te z!zakKdXf*De9-(Nn!ZV*RKxY2mFg5sDHEqze;EcF5DTd|M?C8p=wd_aUvA2n>Au6Y z67qZ4rpHElQKUKKNbl4=3Y_pGqUk-VY`Md|X7k9PhPg)MmpfdlbdWhlbT^VM)v;eX zJ`bn+J9?R{?#GuB?_1r3v7=nccXYIl4jE0YF%YWX_XfU(EkbK7ZmxB_vSp9Zc6|k_9rQ#Zr@2~|d@q8#z1)>vp z_x9j75}$9@M<}tQ&<{pN@(Z0YX5Q|roqTY_nOqF~-hOisH0lZRc6U9`&&gwN2fhC- zC+|#OT*#|0w_INnJ2KG?r}N|dZ-^ng3;#gesZMz&>a(LZVK|=5o=YoMUoRf~`WzD$ zm`J^Dk%=U_ORdfh%fV&krsm6eXFma)*X6(0%ViWz8=+?p&A|^IIh)|QnII2?W-Sm3 zhlx)>I%qSqA(VWcWFH<40xMB8B|1X%`S*&mCkV!zewHx71+kP>C3{qPxBX4lE-6N88~~6U4&>QUd3-<^Im(0tVjXQOyI=NgystX<$wHD}S8_ic>MQpgZMlF&VRuRdh^(ZzgF@WH%=I0g} z4J36vPV;ju_LBI(WOZj-1b903#YkfLR2j*{SCb*E>JnRPP=~1>2x!~NnbZGHR{b4H;E7`sF2U9i zvMX6Go<>7AR{9)R<}IG1Pd?`jC!g$ClT6tcpcE%Z;RH6@(kQ|wIf&nahW91br8(Tn zN8KFG#I-@6)S3~a_=otWPGwKFK`b)9)|UIgE=rRjJ1^IszB}SzewU5s(yb5An3yZ< zMnCWSCklE|mh;a+h5!2TZZk>LgHot454m$@a%0vWRa$~4&14%C1Ko5-=3=LgBwI~6 zdCR*0tX`TYmJ34t1$wE)Sn<@VF&e^=QI_HP=S~oDbN)->!^;Wnwkh6E7J^B>Qo;jc zfK{*e9(~a%C8LAv9Uz1K=9H2s8TJVA`yGc!iOm!YSc^<#VYbM#%`Jl{9G*C1yDU~)Pzdnc))aP>(0 z6^?wy!BUxPksWekf9y}o3jJrl5?u?aTORUJaGAc%0}uL}8cDTk)5XYah-Az7Mv!qo zzW=QM65kn{ItWm$3$qDq)c1EoC%#EthU{|d>*sXA$(#CmbT~9_d0+hN2*tjyg?b?F zN7wVRN8jiBZmJLMR8l31?b|+xy(02jmLpyU;W(RX-~nJmW{xd$w6EHKWDnX1We+2f zP4*zIU=Ol6Mu#pe&5W9ee>hPkIjDW6rd+h{Rk1q#X~B#s$9fXw5!D~SU0Zc1FUqMc zPJW_WYpI+XMn7>*Rg@Ry)MhOGsZNb7Ehefo!_yyiE~pyIi*hysp8k|`lAe{=%!35L z=s^H1d9K8{K~A1c;JXZ0RB6?^b=53kN|=Dpl=zVs?8=dxzYIB_KJvue1eNM zJ?Ko{j#+l^m<4CHfbe`EyaP{?k)E6>h-q>o>GDr?j;3ZQPc&s0KAG!#7iE=c@`BW1 zru5^KcK_yAC|Bmd`ptG7z>)*Kb+~p68V;kWyJk=|XL?A_%{Oehb*Su^5z1^^1@qCe^)@dK_Qhe!>Kh8&()K(}jbw3*5RGy@NqL~Lp5y6royVp<) zP`wFHiS;&kJACtRYOtQQ#;vz*Il=B!kUfxpoZg}y(V*7}DOtG6|72o5Elz`DzxZ2)3zThsK=VJ7(vAHCMubU|BkT5_W{ zjZt&{sG*{XTcr_lA0M-i?8SRoA2X#-O=s{SB#os0IuhN`Z3_t?SIPY(YfQ**r|_+B zAJ(|l=#FmDFpBcCdpr2O-34l2Ky`R>`quiC-Hz1U5@7D;Kr-isQ4-d|indlJZ{Io% zV5(tRF0-bUeSF;zjC}mXf{|}3^{%-OQ47M;{AN$j>3J9V`5v*^2fQ4($%##t!MH;p zmX@i{lgqtjzZF*DRr3Sm3_U?cStTo`!Wu7ptS%r3gZ9;vhZ(YZX2K*j=I&?{Ic{m}MnyiuHF5#3xl2bB`Ds2|KgW+Je%Bl?6s(+c~)%d<5$+5;iE;gQr2ZhK*T zSu-bSrZ`sH-+QqffiqvXgelLw{To6Sduk-L2pX&eP_M0}m=NiaRo-~z+ShXF zG=*HQeUxiCx$O9iZ@fPqqsI;2m-WTQK%eug)jX;9``V#mWumzDVMKdNr~dIvWG0{1 zqw5DS-@805c;IBba#&$6d0=mp7b*F$B>rbmc-S)9~@7%?B_#|qn z9r1gT9oP|0y$l+N|Gv(MWxC(~i&+9$Du7T%ok7T?$>zr1_90QN0s?TSR4;rOW6Hd& z{IsR=XX!kHwvB;3ihKxX9+e^ToS1tUA@++^yIPwiA5P{RYD#T@1XDa4Kx-dM_zot$nxPpZO|DEXNZf=SM{0`h4&iTg3@nsM818&2(i+R_%qRX3w- zD-D0Y1fz_N;kW%HO?Vgf0qWDTZ#>5WP_3i%(s#not8@JPAM3Ml=C)SrzW=G#sa9(< zEfjf&sNOe;r$lM=DhYu%`zQyQXaZyiH_F0W>MJ^cj*<&$;R+7PDn^k&d)!%ChX{xXh7GZCF$2m~zfN|akI&yp?bO*%b(-0rw>rJ)Asjpm4IV~Fx@m>jNLt=- zusdAk1gaT5I_#Z6%N%fWpVg}KlW+`^ZKa>Br=P8#vSA^NB$U%gE{V#od(8q+s3~5% zxm7?>R!!`&+;#3{`szvl;22o zu8~abum2s;YyVD0uO*#~UVnVr=(Pcy{6Em^(S00hZ)bqiy+_|Rdi}sUz(nDGFA^r9*&R$%_jhz0c8;OMohib5fW`=vJdE%u<4 z(Q81bwqo0(f^e#YkWE0fYr?5djckwP;#`#A_R>$Ggw`kPtn&`E`{kMcm39v~%xHJ= zQgtRzySFTM{W;Z#?2^?5v^yT!eP+4!-qG&+2RZ~FMWPUVymAu}3ut%T%%7*-x*~6z zo1xpmIl6^Ai8Yld>|(er%PItd{c8*#yWAVF7&^Wrm*1PPh}Q}lXAx;}iK>qQU0 z7f-!aK-brct`DU+bZzV3IKzGU$S>QSQTY$wcwdLh?os(au=21fD{Ub?XJn-(h1*Xq z$G$rby;H*3suOZj;W^nF5jr6e6G?p>s*XwmAz!_w=Y_`g)TL9^mSFYu(WIn~03;SF zYcQ&a9aE{&Q-EfZhp zJgTOda*4P)Gh?V#7N-+$YN+GVOea6Q^KZnCc_Vkf4^VvT-HqLs`aYbQ8n%#gru5$O zSw*dbSD8!effFY(VuR;~R}9`vztL2K7fGjust2$3YJZKfoS8h-tGbA=Q>OH^GrnwZ zwcBA~>v)|;n?D}I`NyHbV=CUrBOfREDcn00#LuIdbIUn-3Ii+ky=?3_$6h^l%dn#6 z$rVMhU(mIlq~_&i_8-@BJ%sr?dRNmQ$i;aCH+;wWVDZV7MXdvv_pPvWQ>M}~r|F~A zMrIh;@`^VN=vf>qA!5Pc9ZBTkB+W3eZV9PWYC6n-3@Xwva6}krFE{Q?UI@{8-DX1W zqeQ-WSt@w8lBZzVKkz!;d#C3RsVL=2p-B3_r?3B?a>QK&>x${#{s**$&Ii43ZP5Ik z#ld%!hNYngjL_`_`^^uGIVCRo2-EH0+s5oGVN@>t@pmih!sgTYdJomKC|pcEH5pYU_;;^*8~IoZgjitt^{;)jZ5 z8oa<U%Phx6p(Q?nk~-$rfKV6!g)h()kg3JAaNx$Gd z6x1$6Z1Y1ztkFyqW&~fm&eMGbL15zdmrVgVCYnczRtcv3PMx#hRp4UKokK_=7hdsbLOrVA%@exqu@w$%Nwpi;b4b^~##APKZIwpTtR|TzSN+w*`%2RCtmgbE-oDpq zzoYffoqe6%73ydGH|bf$iGBM#H)M&6#3!fDN34(K$xTG9kod%lKf{OpbLDK9n+|Xs zF&IRN3itCnxI*(IMik;_lEi78+3yJ?cy(0K_HqXX%&q_bsXPgLBWDg1Q+@kUKCX4p zHzpB!=B}7Jn(L+dam`epaLuc+x^P;a9B!!!CS<8DZz9WkB9Foy<YoKzh^xW2IQ#H#KXp_JI6X~drC#735xLu@ z|7){E+@)H>r8uP|Bxi@yZnNFN&CAn*fvmP5QL88tO^}?)xl9Ri&IHeP(B7ajCUZS= zt^VDx!Td8mppp-D6=WGemQ2@wYnyqd`$Bxa(p{fBEfyNPTwK&hf9uRwz%kq`5NTiK z)K#FF8mZ<2oP$Z{1*d*gq?X-ITc*C}NsXK9T{|Z+lI5=+@L}6`>KKJM_Bc{hSPt9C_Z#8NOaN4&1!`f ztg*b}3(Uz-HMhl@nc?k=p@xbtuqYZSZ#UUGXk;cd=45%O`nYoExc`emiBj{SmcD|@ z_hr8+1GjFy-2UuF${QZ5G)Q$=9!oTML)+i*Eey^JmHTRFn2<)ZDv?F%JSLH?2J|N* zhmc56ghFX2g=FJ8{0-=ty#W3X{IBn{V2?b8uyFZpyq(0xLEe!10Q0FpWao5Pru##! z(_B#5oAeEGT5b|aSzF%ZCVQ7Ma>#VEo9r-`s|+BNqGUHwP9Jm>P=qkVadnIb@Zdo`ju=CC3HBt_Z=q|XLUHb`JY5@s><7jereDn zHLXoIwLK8@Po_pzN45L?SG<4qRmuwN&Yt+a zy|~3jU1#P|oVx_BHxkX1rce5^9i~aGXBDI+Vg7T#z~zC>R*xTUG#6$xpxPviGo`9wpGZ zy<8@?)+p$&Ib6d+mK_B4LIz5IoItTLb|g;v@HcD1HUADJYW20|n^59Vdw4naYcyKu z%5C+A%MdSIb(TBlr-oE<^^&&E;hN>)(4bcv()X%w8jGGb4M~p~VM7WFN4^jzm)^-K zFuBRYDzUF3B|V)PgVgL}^9XN;U$D>u1Dg6%t@Z711TzG%*GvnM)b%DmQ=h}?$Ug0? z5!dwLTakA<6BJRVg%@K3L`&zVhAFty3ngMES;t96i{KCZpG+qPt;+TVFL|5TYr6t| ze=5iCVGib~UN017bWcV&^+L8t1#b1pDLF*7ETtQEC&9y>I>o153`tM{ib8j3g{Vp}?i3p{&_nj!w8`Jm!s&}rvr z`q$wV+d7FkhQZ$89f=;7jV4!nlqF+j-Vj#yn1y6=V^>taGD>M>PnaR4-wYJYf9Yr8 zw?ph(E`EgeVW#+M8%IJ8#6^t1^c}7W%Zy#KIk20MUh%f#LTBUvoUO{(^kMxbX3|Z& ztI?%?{*2Ypw4m*ClS86z_LRa-$`oGw={DKNXMdvmSj_+bWPo2p$J63|;eb_r#wCXknJJd8XQCy z{Q7^S{^Pf*|2mT>nM;Ry-K_pg!`}H;|D}HYw_5#|_Td{`Dk`O;XwG{}=JOyZriY&evDx*EjdI|5BfeA4JdI zRDaTOnUaelsW<9}M>AC`AVWe4wp=2TK7hGAexaJ>O?zcOfSU51bXzM4g@qE^fdegn zazjdtqzH<#;jLME>01rx9%~?dsu98p9Q$8|5+73=5d%A}Cvm%8(!=nQ57^A32oCL` zE2RcXjjRq=dqf~2i+|V#nLD+tt(y3evZMzPl40KBmrC)uoq&zn<_NiU#Z7O^n}X0+ zrL+KyI#QNQ(7I;RY$hx8|F^F-N)4yl!kIy|zLAN4xaR%X5yab>gojhR1a&#cIuv&E z5p_2V-m+S!A^N^%*iCssLo!FY;7+EbU%2?KXwCCN zDV>KMJvE()cG9rLE`rB4M>7o|3Z1cmjI1ybp5yH_|DK)}Z?NW96h~6uMqbTE7JpFU z%OxW1!%Jzu8#^!-l}Bq)vd}q?QZEt>HTy!BR6TJCHm)WVn^G^oy9`i&gDdyO12LAFdUK4 z;AIfMYgc~wk}7Y1+#gYmW@?F}-`I-sNbx_ynIUD_^I`u;>K!)ON2=Q*#V@v%MBR;MdSjj1J6#Q>>i-E5TT~4Y5|3y%tSh z0QH|ni})>eYJgjD>NPOg!77TNWXpwbP}2=7@x9pYY7hT`_$17BP|dE}PppX4tZB+> zIpZZOL%@<4w`4%ljJLWTr~*GmYL zM{3@0`ZSov6-0LxU(1x1jb}Xp8(D2V0j+eM3CD zz{?;pOpxr~rw+qpEzpQX7O&jd#W%z0W65`nVw#ZU6kC$ev}5*naXY-l&A*m*C|>tJ zDZg8X@`cpo#{1&$ZukAm&q=(7Q`2X{cix@ty3u3)OfEU~dKC5Ld2*fCb)?LU2~fd+ zK7YuWA#3wpf_|#0k691)M2GrLwECX4`daPz(mL-JCD1Anu>+C+w6Kd@!1P2@m?c67K-MhF+93pg(K=-VE|0orjEXG%wfZDk0qLMG|Q z^}#@5-NS%BsK|aAD@6(_y~fYl+x@vUw}WiK;HIC!(vTjEqJQduEhG%=$obREj_mlU z4v&SLnrxjzAT*@DwJ9JJIU+J@$Q5 zYvv1qvBZX5^RYdBx#_R3<~CcM53$~z55ZC{|BTa0@TuzvhTW#Pd`VUI4F)$qUYg%- zZg%rqM{qZK9`9{`b@cANqmNV_t@(G;U)%1gAO4&Mha(D(*=)niK)ZM4X&U}(L=%vjsITuP&IRXHf4F#Nn=Y4r_`uGsdBty}4W{f!}% z>3*2`lL4B=793SQinM11o_B?6%s478`ccnN@i(Xbgo=%XY1(_|mQUE@3Nn3vOKL;= zs`rRn6192dtZI;&&MC$zSVhK=RM%hfAOvR@rP613gQo4I_(QLc zZ)4OBtGdbJ53&21ON+e1LbT!!cusuRx*kR-Sq~$F2lbwe__UaUkKWl$!CPlL5Z=VY z%?y1nt5y1d2nN}X_OspYXM0rH2<$czaA>xQE#NR_hgq@@VCCAe^x2B5l@^Q_xs``f z?PwL% z63%lf@nl-y&5MWG@whrSpGmrwFO1>1AF%HA+SOtP6Yf#R)3*eXmTT{FeIM?lF7^z4 zw>1o7O1S@10L5z`xsO7@n7mf*#^hiUg{@;$0%y=9lPL-pjQq2O3q)Rl@@GY~<8xdP z-o{JtX`P16fnH!WD^u94F3t4i%pfKOTG(R#%S_i{nr5dS*7_9byv%iBJ*6^34Iho= z^Y|^QpR0e_&95n}{=7ZTLmz@YAtsdAC`B`G(y*fJr##vGG&iUTt#I~Ux|6WOP6kD@ zRdAeuOiPA2xS-JrRX$(;WKXtg2GY>$cTmuSja@#UP;5qJt9Y)t$su@xkFH$^S$B+C zXcKoJ4}N8i7AFseBgqDRrDYN(5;S%4nl|UfLe`!U3u{OGXR)ws<|pmhf0|d)`UQEh zv{g%xz1;-)Dc0qV@kzI`b=tZLQG0sNKi%o%Lm%Nq@kw_2z615oyV3RRMz}$QP&1dF zx%lL7UJv9$6_EiuLDJWnr8}%ud~(l{>rFlkH*&;7y;7C)C#GAZU(!}7fj>R3c8~VF zw&2<0*~T7!{6?OEtM87EK(D^r!F9*ef~z*mE8VdcHoKgi{ha6eIVUP7u}W2h=KWo)w6WzM#V@@tZqwmP5nNbVX=5Se3YD#NY+eqYSeZKsMe%1;DwRU+`_e^>3N* zXv*J!<}K5-z!xBMsulrH6d3|bM^k;g$1arwVLNv6DQh6$nAv(`^)t-Vt3)NvA;g$@ z$ks}?9p=+9TX07dH4T(GbJ5O-5iT9#2BsBw!V37$>Udn$Wg2PqGw-wnB*v^|D6`|H z`FK}H6vdc|Mdf~bQX<;|0UIRAdjf2ccgZ&pDhKIS@(s!M1!<6;wh8=oljNHF;zFcj z0M=D58*94u*|f;TSk{ymbbnKxOzF$-p4E56H!f?rh@i+F2T$^g~rbJve?6 zYeb^G=`J@o*O_akCm~T4N5VZMz~Z$pxk1g*&=)&68fqY2gL<0E5f&BUCX;hw zlb^`BxbZ9-1qbleI+w-LlaNSIh4AIZC7hXKIFbsVWaoJoU?#bVBHrSONTPKnaO$Wk zP)3PCl3U$wgNgg+oWV@8F=+>3(hlmUj(B&zo3mzZEy}fiHh1Nn3uPP#^w~pz zBHw?Y=tHBRXOy~XFDuDD5&pZ6R&TgA9u4;^zjon@Wuz+e3+Mud3R)L4rTyL7ylq`sC zpHRKE=(*hZdpF+%;jaH~E4_J^`e54S z4&w{bgTcqGTUMSDFAL-Yr|nU5mApM?dw~5S*VX9dGi@n-GJW zu2g>LsSz^se%Y^w0>7AxInqjPAmNrOjajJLtz8LK-%>S;cki`Ds) zOL+8~{F5G?m45H-;7u z-E8Ob$@O3>`EAy9o7_v8t{XlV%=5KNK>GlgYRMl1tCV>M_(w?+muT0C=-La^)9%#8 z$;;$sS95T9hXJ%rg77^wg9xpl(wt~%{V8@vxE4V~Gvmt4y9OaMzkh?8wwy7=xelhS zD-(stsP-aoJDR8tzPyr}r0Ev%i}T5ewOPE783O!VdjvA2EBi^J>Eub=NT%dR0lDx9L2AQ%okW+;tSfo@)Am*YtTy6{isc?#iQAEwckx%pgr<~y zr#%CB9gF3h!?!uGv?y9b`xEaG^UP9>CRvZHis4eIU3xQg8%j>6+Xb{cl`UO_uDsJV zxjo42_KdR+0d!DbT-K7JBw2limULC0uQPx4Lse^eMZ1Y!^%qUeF*8{zUDl2M^ej77e_q8!h!v^^0g`WbS2dH$ zgInbns=nLM7^;5A7L<9}qn)6eMK1GxO;>aQ4Fcl5m+EETF`h+o5YO1s6$u@=1!PYsmlpNA%5^h59C(hAZNW=sI;|C9xfy7pC{gHssQM zd9KCDzC7QC$Gktw>opENvIRX7)Ki+e4!X;51Pinm&iJF%kwBgF5DXRB5dtsgqD9mF zZr8htylX?pvnnB!kT}oo`NpSct!DZOu4`vO*F{Z33)mxcmAiJ0A@%w*8?&vlK0NW- zM$3Odhx|IF%1FT5LHSqlS|IozE_i-5|D2uB0aQ0nh}V`|{XN*2lNs8cI;A|hXv(gL zb!We5c%@DTlRPz>y_IQbp+`8kzSqK?JrLwXbsAIGLP5S`+Q7}?{XGm`!tncs<3 z%R?JQl;Ur(pFJ#q!5j#X1a?0$SdkYy^ z4%C+ske8hy`65+7MDBJ1wAl)(ilom78e;#nvH&L`!Zq1t40a@adhqodZ+8Cc`&pgE zBQX4)P>VOi|GvFUuJY_C<%kED1e!Ubkr>z^I!NJ7FXd`5Wf}Sf< z2Hkzc`Sdv|c4WIy-2uTwgbWgDGTHT~kIWKqOCe&Fw3W6{G^3y!mO zMt;stYKX{uKZ_3;o`oif@AzhBkIiI|Vi#c1KyRjqICtw8PJK%-yOY4YGTIrE&K%kt zO)W=lG#;NQYO8g42tCzMys4y&Wdb^9i?>eh?F#p{jeEP2H=OS!;hObab>==5=~L5l zgwUeZ>?C|EbeX1+;p(^4aAtTd5n%xM766_PU3s=D_~vbP=l!Lvzw|-qsUcfj-FI4b zLwC>fcI z%C`gqlr_s=xJ0y;E}j3{L=i0uMa?Ur%i0j| zk?L2p#$FXhYF0!-$F6V`sn)`dBGrH>a*=*Tk@rIpcJTZX;SOlm>PwnKUnZ6DCMbqv zPOUA%LCRqwdhPpK|3uX~9zuz68bMjW#GUXr{7bW8ziu6xbsC?uL-=QOO9%Rtk;RD) zEvh4V0f4inVcIe=cY)pO_Z0A`6xAQDA=VW;NN(ey(ey3Oer7<}Z*#4)QxrOC;A(~B zMH+dh=c1T9V(7Nx13q@suW<1jU@lzqdg!vp(MDmGB7nJBYD~O57}UNHE@o@gEj|(JSwAVUu8EZkrQrX$ks)4>Fy_27=JC<5_ z=UiCJ*Q|GKTd&SW;@=_^W&r_D+i!X9-9{Srd-k=U9e`&^q2<4oTs)EgZ1+U| z<>Y5>rMX@+;ED^2!-XuDogwh@_DTHnP949G+4}o79lwY9E>mNYT}7}wwMvUpE92kM z0Ufp{-t5_STF`%=dia1``8-nmN<;N`NbS&NOTW`-Be^+Gg^vuJxFcHgdNgz_%TZp9 z@*jj=$R|cqTgau^xh>8O_#~?3n+@_9Ng)coQ1TDt zux-Qv{J~8$ifoq6nNkCN^>kzdt3_fIi zi>Buk_TR9V-2*6)_s!viB)bXhQ1aKPX$OY5up#xmDUxy2Wvr-@BTPER6P9Bm|@KD`n4o^%O5?sLCk0V37s(S!=-Eu5#z#8$?}R#o3s|{Z(tGbluhycOhZBMctD)**$(vlO4213-0(m!tdN&!NW8-)8BDiG%8vGUU^Ig1$gt)p8y z`csa-8oNx+6L&a5rt9*z@vO+9GQV76UDmA^IYB-_Uxb!_FK! zrO0g?A!I{@{UqSl-g0@QZLJJ<2I@(kg30(8S?;|3=*1q!z>n$@L)}c5<$}di@yhy% zs4eq_q8#LW9qC>FCq?Yhl44j$Rll|>Hqdv*VMTzfy>yM#^2rJKJ3`i~U3F5mySY3X zQ9d^+RRRI+kv`eer8>#$u&=_IDe|xmnIRAB$CTADZB%9>vg2vf`CBT;EW9tGdv*&K z-k*_0u^t-gF>VrATVl1GUQX$0%Y+C2uoWGt;ewE|1^n`D@8sog=CEf0U23uTubqpy z-A;W4AYFe)JB>xGA*Y>5eml2J7qk<1#{$Kyfc^MauL<1at*8c+0+r{g`G?3qbJ#6@HRC!|vl=`YNTK8#|Gk=wswu=~@^6-MExX#) z{+@4Kt~u+UQLJmY$Ac|#(uiTcMJZLMUru}&#N>0|zuYNoJPbz7u8E{ifm;27YXB&c z-Zl5Gb9!<8u&nUgrZUdkn+QK+r|2w|M(p!U{Xkhk$XR4`t+9Mv0u% z_w}qYWQyj!Bo`{1{ByIjw#hcNY5G9sb0ybCgfT1RipxRKcV~6yS_|Xl5?=cy!A8xC?`t983MHlM zHp?&Y+s!m})rsVg2lP6olvybYpMLK_w*Hh2viWn*(}%sVtqhZ>jmDx9t!9S(b6S(rCkWM@6J)qOp9Fz7oT2cC(jlQ0Bxo9@k&c+` z`&xJ{kc`oq6`{m_(0>?%McLf-(a$QIi8D`^JTor(rtxic<69)k^~aYa5rres!>&kc zrBl22M+jb{Hh%Ad3gk#0N=>llCMa7mEh0h-e45A67)?FTu%ADKVc)Ht#dVC^2!X3I z{At!BL8qxj;uILh;&IT>&``C@<<`Bu45oO(cKZmT>H7}rv5#ECg3n@aX>YlbDG;tX zwQ9sf*6y}@kCGO8%9Wp|W)h3o0^)YBN*h(U(NF9mV@VnzyBYOv;}uB2#5Yp-1p>F% zWfHh|LjxvovlTYNz8p-fvYPVZ`NwI>eP1rOA{^rnPb}rrjFT+SN5utsl~B2 zJ}BlZ-q%U-5KjW6XZG-bjtj0ID)=+7J5uxM@cBizPws5`}`cfwy3)KQgc84` zc{%%%V`vEE^liS=Cu|=>BN|dGF*UM-6y?Rr*x;_0W&Fy#ZUc3Cmk#>!ZrmiHy21M; zzlH%h^H5rTr#B&^7><$93EQbHhu!VTT6y^v{k8&9-Oz!+B=p`>O1yUaxG9b6KywFA z>q0(D;@uTT;yuobo6mY*oq{5GHuvtU2*}BMn=g6EkkEl&9i`9j;ZK);zVhF%njSX- zt&?mo8|-Y3`c$FK@ja5q7q)w14gOTv<~Z&< zyAvRiZg|E)$ZwdoBl7g?p+@JCpveyv{IYS!cgb8uAkp_ir|OdIoBz5A7)94)pXFK8v1)O@p2;<;Bqx z5$1e9C&KzJxMW zR7ai4@O?GE(tpaQ^st}4R=dOC-2pOgQC%~veSEjx zZ7eG=F+_?)&>S60z(BejFhl>^wu`X{5;yBZy!Ipq<$6SH2PiMG;|zQ#vzWw`%W4Tj0^5y~)4w_KkCtX!=2o*>2IsU7;a@T!je+x@5g z+rirFS4Ec%Q?0y>yQ@A;E7=D^rS*%f?u z@~30D+qW)vPsegobLBwFs>z0wuFVP-EfuC_GjBe@h zz0UuBioPFW-+fEpSzq(CC^?wb<{+<`ti^15etA&<`EoceXdl&XW?hAN8SNf54Ynwh z+}BjWo(m}Dhfz32LzXGj4W6<^459h8wNeFhAZ%!g@`NApWY3H5HHEr+r9)I#ghw26<^;*l;z2eB+BAQpcgO9+%GfPhE zN&oKsZ5>tUU4hxdcv0&_913l{LrnYvR3O+AU9}1|UK@pLV9cYLJ9WVLdX{2pL_WC~ zjDKJ+E4+TkV{rZ6kVqrGs88>Cb(4&DU*nd*;u?vtI)>zxN|B)dEsd?2L}PhD{|s~A z+|Xv-~6MK_m%#4C+}OD0fq?T#+l+ck6QZbJ14N z-gUWh*O03Aa&q2H_`TOqXkZK|bMS?RCrsGJe*4nxhty&kVR+P;J5F{vd-&ar( z&NZ^Qg1F@O{+x5~ECH?mZ~w2~>&Hto_ujKV=Q+=Ip7R{dnYq^r;E!8D%FKQrdKIziNPf+3GH(rq2REf^eLF*iWvC~J+z{fzZn0QHL(1|Mn5lHAQtwbpRw_bm%5~bN z+$s6xK9P9q4>5g^cnf7Tf7I+5`2ThK62cJE(Yf7_iB-b8Yd!GIcv&h#DJh= z%@(g8JZ8RMQRNozNN_cqDjxk$7Mkee({&8^Z@lCuPw@+C5~furtn%7_0> z`DN0|fcj9(G_o}Gqkmc^k>L3!mXLRs2AL{o91q)M=LF-3^EDfXlwAm|CFT|;G^nuo z@IpF^cZ@7_p4BNX&(=Dsb0NL$e?-#34wK$Sl4O(=yel9N`NON&Dwc56|pZpb4 z89`XAu1}h|#wx-*sqnz^TQ5=D3EQ?z0|&+fvi8CKWh$#4@}=43@6IU zkORXg4O&P$7@mHyVEB@qWZ#<4fJO$BXl)|iI^uK%GIp&6%@-2!^GHd>?^Uneot1F@ zG8yuVJhV-buK7h~Dg#v35;OGwi?R|;qDneLynKHs2Ho8tX}!iu>&z6C;GkTUVlIlL z*WDHP4D_VHRAial0@vOOR4ma66gKY{T06vDas@7GTR_H|`~thHyYcdwuD~H}3;cVV z0t8}fHCGG<3GaiHQFOQ~IZnmtf+wRS&nnx0Hq+`Gs|>=&kv5<;;rMx^<3+&0`FG9B@13L!@$$i}MUeF-1npd8oq3%P zh4(H7u^V|IZ?VfexozHGfLh{-|5o0;9iDy4N}}Gg+vfHBdK;DZUHh^r;E@@yVrAXF zexU0qvoLmX9RoPO?%-UVeBC<^O*IP+?_20^&TE(a*NZK6&NZr3Pt7+vykd`d%x^ZsrGvmqfQzX|wfLcE;oc5AAnk z-#QMNGbkx4hX;=m+?3-{dRZh+|`q*YX+^?1}Km z5PQ2`bZgs-2aqtNeJ?|m^ls-R2eal-4WT-Bm{D2m4Yzi`@+Sk1UKEwD>&fvp!%Ae8&X z=*vj}Ff%`|>r1WuQhuC<^zkY;q$3FF;SIlALrO4_kXO$6vN%}#x3F0AFzG#ir8SVv zBvj+d+%K2vOL_jZeM|K@0R9aEO3v%l{MTD}HP@8G?24I)__OX*mxsQReL0nFo=l3a z3e3EW%YC^f_hn}=B9pBYj*xkgFKg!I2_%-v=AlJ`LUl4+xqNWAIOOdP9*8(DdjUXQ z=fl)egopW(&)#P``RjtU066i!18^Bdybl0ybEU00n%sT);N7V>1T)#Txv_lB^ytCd z?!A)xvN`udLLa#S??CuFR2S7D``=MyWLrGgZ-Ud za;N=$q~sC%`*_JReyel~^vR5FIT0mdsq$~mg&x8ttkEwvfDPrI=<_z$ZA`U1*2-M? zwN~S*%^UyfE^PX6% zLMXUQ$%0;V$ZbxW{SW~&vwm7IJKN0q-zec`oj%j#L}UB>5kyO)D9(JjmoMt?6{TOd zdT)WjZok0c!wtfRV=m0Whgm_3eg$Z|8b0yzTVcb6HQ{d81j6uTqxmwq zR^qXQU~U~Gr>5CSymwlO7tE1h8}2sS7knS_1>eU@B>0*?J}1jy{izma+QhC%px-VM z7tfva#J?P0|IKghh&QUeT>a%*p#p^I+ut(YX}kpXLx%{~R+b)xo(WVCCRUkC&(R&y zZ(5%NXPzE?ptES)bU?=UVDH!6iofeMH+vNK=W~k2G`C|35Qvos4!4wO^gM9LlfQRb z_i@~rYIyNI+*xBUl7~~2cyjWYM4r)rd49w?vh(2lP^$r(>LXo&0)PrnoSNqE82fyY zElb#AzTk}FH8W(#hbtfyq5328pz}QXvqoNK-uVsiS;VV@PY(OhZhel}-GVt|vw8en z?R8X$4;ofYsQ!e!dXEBa1@%VN+J_hNEw=gc+i&mZJ4^Y#qV<5kX4`LhQ0?TrH)o%{ zQp)GN?&NUcRNK-%c|98E~fAJrkjd@LVLOj{O&# z4)N9PazfnYJX${>7vJrOQ#jOa-z!H{C%?C+oH>okA-HLu&Hyox;s%~0DefXs0PVVL zbbIcpf?Y@RJ-)ce9<!McM7J=-4=$;dpRXl0Y>}=Qbw{XvELN=PXQ>Z5z)XY6TWY!>w2`u& zEJ~rUw&E*D1r4LAliB1M+?|Jll%GYeDW z!nJ+Pct+yYiS}g9ALPu&8!GQ?#7@eHCbtlOktMKmxLcU*1UhvZS9A=qf%dSqo>Kvt$U&J`MOQ1LHUIA-+9*y(DOEeK&b(|tFiUM~psXINETq%ALY3UaD zZ^oAvMhEOwQg^g9&k;}dWtBR-ni!qBlLdFE&BTx6&PbSgBvki;v=$%+ESI-~+gBFq z?zak{f^l!7`Ijw?-_ddbiu>7LQf=}>iswax%iPzZ`{!N=e80a$CDuuKq0xL6zoOO! z<00O|Vrh$e5m#mmn`8q%@=r+G;q(aBlY%!^4|q46xL)OD0l}Z&4T)1%_Ux4#j~t@h zcyM30v`AD4jf}rUj^^(uOS;CCj1G5e&#R7LLBM8FZ@AlWB419~33oeLC0&@1X!5EC zo8b&N$8Rda-F^qZxRe?u)dp~~U1|*AV&SyWR6!RVoTe?)$aBsk~(dg%i({5KTq5MAIX)SIFU}uTZk9!7`qn zjxPCLVR5fK#QFRAF>w_h*T2srNt9iDFESqd>)XV|)lp||@+(oMU%9xrn)X6Bme$p- z-T}+&4vVICVQJB5&6Xe*Z8XU^GMN=*D?y(%g=@2)y~Ft8=#CA@E39s=via;Fwo^Wc zhd3ho1nW@$!V190F|(;GjDuszErI~Sbafmi@lVmN#>F;FNOkfn0;J;axgy$bMfkcU zv0iJ#bDz;E!N#F3Tewk&bL6^;?K2d5LVx?d6HRfQMtgl=)g7+bDwC?yBRJ|vwpgzZ zb(dj6_pLPu8QS=^uSer+ISta~ zE45Oc?%0KJw$TBf`|))Nlx8%j^hF&A;PQQ4_hG$=(5je4IxpAmdoyE{JK7trPF-H) z$8s4nOmvYhiY_nJpVuJHPZ8B#v2Hst2c@|UuRtH0Y>8Rj2QNh!(DnfHHWUQf~45~4NH$54YrtX`ksOZ?UmzXXS{hW zN3n;XQ%o#{lSX3ciU^xT_;1C_7mU1v78_SmM`e6yVY@}eJPA2)aDe0Qde+CS{uQB5 zXYPDW7tDT=14NeXR)x$)5LKuHzI2^)*WZE5M0g?$Tcm3wNLHnLA*u?|l612f0vmek zMIheQkL?IdT-3bGow38YrlGbvc}cAZRDro_C3%1XL&{>dH>#Jr=O&ttCw+*9=UPyD z4+&q1^T$}cK473vClw*)#@D~4qeu}%i0SgA25NRaj!++IVpk?}2sr1R;NH5UHu=5K z1W1D>#pcx4aB0Uavm;T-y3(m)V%*!ybHQisW#8eeJ`4wk&9i^tA^k*?8hE&~V(L60 z#oFAh=afAl>LOe`YLTK*xZ*w}^dbF(5YtR_CFg?*<|6w%C1T=Ccr10-O?>3ozYANa z_@|6+{-s+nP5vyg)~vyoXuy=f^uVifwt{!Gdj%cE8`+Y92pmCx#kM907u8 zvCMvb$B@^{VoL)xh8Somdbtg%nusSL>$A@DgC|&9n&( zsyFZZW7+SP>#QSG5KrLmV` zRG#HkptohfLO{-U>if2Zef`s!48<)A&_{FO((;e7O*!vfTAp|JIl5pIx*gn!y?6u6-?kR zs;Ek=A^tkiGY*h8z$r9nDB81Blp1&OUyXC_6>(7JQ_*zV3ZcRLZ;DrixWvOo9HBB* zrD^if`{7RLBy4ePS6*;xsgr5+(!f_Yv&&*`zzM2WOLwZgYhf0dtf=P4 zXuW_=xXYlkPJSO&`U7vl;z5+VuTj)HT5qOa zB;>;MxCIWT_nqiQx=;o1kP;vr4<{7wYx{rJ>W#(-VkRHRhJeieP7lZeqV6B&1$=N@ zZn5+@gQqAPsK9o(8f6}`mOAv$4!Ld|*y%>SEA7}(d!3<18TrWEe;gs_bRN~U@9y+)W&sYCBG7N1_bkmthlw^t(CW^7a%$Qm!7bvHm&QwqndQ)r59|bf_R?PtBCf zH(2|s1W-!VLZH{zp=XwtL01q&uVNThR!n0+R8RI>yQ7Rrm==eno|I$&@p(p(?JEM1 zAj+~UOz+_qEyEnQ7*dJGZMp4fR@i8iy_-#J3=J@478mEesEb^VC!Z#kT+c-~E=O@o zSBIaK@$p1bUoH%<$P-deQ3M3@h<06h7)Uj2c}Ca-~HXJgurz zR||9qdluHqVs{AE2T?d)QP{3J^?<}Ssgo~CoeXd+=+%v6x8sz&n%}E4)vNeXB_Pt1 z!a)DrJvtK$X``uoyGO{{Xk>^PgLahMNaeSUreS{X)^4+@ad{{~9*kZjJka1W%$2%S zx%_IWLqcZB!j;WeE2TraNlMa{n34CL|{mk^|Np;wMlqLL0b=#HV+bCUP$k>!}o8Rxd)o&YXBCy{nGAFUH zebmET4;+OI$q`N#+#gb9&r&H zJe!;CdTPz;R}vL#8;%BXMhlgsYMA#4bZ0jw>n9*T7Mn}(r*iM7Dfk&=>}|1hSuIoWWCR!nc;R(FN{Rt+rroGH;_)4cp5fjLPQNI7 zKkKw>v_D6zTi7toPb@Vz?|%w>=RD}(=3!8H;fI<2hDCN{8c-o&zk$)%1bDrs#34xQ z3+h}XUEFu^)mLfpc#l}b0A>(kbM}3r!901_`1q0$haI(=Lh-gTbGUIKnKK!SJ$bMM z@@8g!5%4@kp7!w`cEOc>jlTyK*vvw9@y3cxHxan=Vx31nfj6XhZgX@u<87zDF5XlX z$?9I3A9p{Jv$20=jjYo??XO8j+=-%*$$){pgq!AIWD0_LA#Iv<5dmEp;)?`OaBi6e zLM?v^U_* z3467S$@bahOunEqr;9Z==|72<;qNLP=7fk?+8J8MA646gDumx`KsLB)(^w-52uc}SYx7MPAmboMOw1e_K zm?R(*t)NwybImxKv@Mg^-<(m1$T)48fEuh80-6N#qdrV)w(a%JwAbA8ln{NYOG&sN zt-#+eYN$YvK?Qq@es>t5+1x>qkQEK4;6Fo>1lA!uID15tp^$$l1czwt>+>Ie_ta{x z`T*NXaw$Pw6lhR8q@iOZx^i#_N!Q*6<-+$z)7SWM2?}oPs$)PwOfa`OpiQrl^0&T+ zsyP4{G9#~2;3YhZb(lvc1j*z>ZG@VrqIJ)hrUOor!)a*b zGD#CWL9xyY71x&7f{G4;Nfelj2C+1C4S>Yn75cuVhYX+)gLgr+!|~dN>8wK#niZZ; zDw4B?KSej#Q2615T;RPZJx8)kt6hFAsM^m@E zC1kCUXLyPz<8xN`301NS;?R0x#9T+_D%qI6nJyab4|R03gT~w87Qb4}YHz;{-J7Sa zeoG3}r^d@6Fiu3p(q5T9fiwBfM+bZszN$b8ia&UZ9bX2eg*z?#+I?&nCydHO3X(6l z9WB=n#+JS!5}>kq^C^E=vE&DYUQvTJc1(TjmBU#CNuKC_bFP2n_til1QgA+y{yBp zJu^v+o&-AsHva4tS-yc=kHZ;(UN=r!F(#V20!s2HHHpE>Ofa&yQU%n=yO<_TK~J>K zD;P|w-*1*U*W_zY+e(w^^5b|ncg=V1U4!^m9iM`MGw~=u>bo9t;?Hpl(Zn6>%xPYq zP`ZlUo~Nq^RuzTgT~*VP)dkfZstTWEtpnU(?zu_1*ieR(rg>FT^5LpYJ5_G-HCYndd7Z0P=gt*_K}ACfhQf#<)D( z0^G0hVl4kWhMBpK9^+N=3nZ@o(A+nFBZ~~X(BZiiMc92ON7;8m>xzgB6i1t{3Y5!e zir9dIOCnqv`|D`x(*7ci$q!BG1CIJdEFn8oGf`-kYJ&4OEkr*y#W6>L3xzFDTD&l4 z_8?H%e=_=ds^8~}{Q0trF1I87Fuil4}a9%fyOV&ZwCKj604%Sq{ty294yWU(mk9jOp zPcEbAV$szOCkNYV8f!>o(&(|mMmeXmX5_FXcB_NfWZbeQ?h+wEgBKsxmsygkq$<2uG zde~CMwt07I#8mLnXWKoFNrvE2aP865&$wOt!TDM>Dz05){_|E_u6-O#O(+bbP1v}4 z;;I#(kgpt>apQx< z7VA2Q#bo3ea}ky31=uD#u9R3Zd*Mp z`Du0XJ>)50Ugr}Q5_|WS;-8YM#zY<$-y*nuio!|8%3>1vUBR4^nLI_N3wfYFMG{6= zOmmF5Ce{IGj9708GVPv@4fr^m=mAE=I&Z4KiAdDd$#>%nza7Q8R}(UJmIic{!k!0f zf=Hfy*H@<#B^PLPoEqh3>4aSzu>qU7a$b2KdT_y%>y?(d4hW{nk=&^cR#++Nfk)(A&q zcyOWv`_QT--0ga+gkl8RH=4R%&#~0?YUPCVm>wao)k=*GR1t#z+5~o_1^gC-z~H+> zF0spJ$mrcDUel!go=WSFv0xXz+I80|Q8{IO8GBT=mju2l#$>)oy7@x~|9bfM&AFC$ zIRSFy85UTL@;Na5iB0c4V`T!y4*$u}P7zL7*)3^YC{T0Vak}5qcHHo4cXhu%0O=Uw z5(!`u#U{)3lLtkU?SgswHT`g{O{50%?9M8Zow51?GtYif!>N#W3YoIL#nKBM;%m<*;t=O$jJt`0TEOA^zWhJK*>S<~XEyH${i+&UA9~Dan;U9!2+2VNWzUqQALAG8j9^P#1H=Tvl%U zi5cJ=-yUt^r;eLw-DdPR%9v_YB4mi8xvGFAj6zv20xE$Gw>G}0xY^N86MOZ7S>1TB z5KohgK8QY3I5^d4xe6)axhtdT5mBy&?XYzRHjZdr20?1DrFxNbYzV zVERVtbM{E?ne8?x)%3k&Sg6VL?kaftZB~%I;D#>A(85BxCVxBKud9*Bgt-KeFl9r_ ze(XNq2Yb7W|HJ*dYVS?j{#os9-1~oSkMUj%cos@g)p+?oi;UX8WV(OqzTdX_{ri7= zu@PeBG56jn^ZqmL@BQme|J(h&r{|S#Gakm<7eBdZ5;bM2L%EJ1TgW?rQjDMUZlt?q zkj-N^{zU=K@{TNJY#E0m)3PJ@gTUt!_a-s7#U_6TN5?7RpMp3;i!6sk;yuryZt{I@ z`Qc`tQ^4Ya4KIGi3w~O<*=G=0`9CcYvw4u}w=z$}Y#Hz0=|eek=ij@#56E05M!={B z<8Od`-16s~{ti@sgDmVn509nKk1*V?6xmmTjBcmhZRb-$4UZ-T4fP0>u{C;z1J`}7M4;Q)pdH08$^{ck{k?{wTy&CE= zfg^#Jl*I;&A058xpL86D!uXXDcCqV9I#(yx)JI#UI(bnufIL_Pg&Y@cx5_+B)lo@O zz@s|aVHC-*vAV9C?A?f+fDo4XXsW)<)>k(m8ecB>o8xvxInhQ-{r%y&R7$*?misgM zlU(mzsdnr^(vf=hf0spawm=-7v6|Qy*?@Rz16{^k113F8WaJ@s_g=5J*9^A^5k=$A*peng1x4?2AnHn z&9JLKXrv}xn|TrQ%te_iu(&Ru%{A2rGn(AHs4dz~c%_d;c<&E%-p9)hJJ@xTn^*H7 zeMROxcK34ct#0?_lcf?m646%UQ;qlzrGn+RoD{_=G|x8 z>bqyaaCGJ+KFV~B{n?y(eczCxjA$kvJj%`T8^3U~JhS3sC%}$P7C$CIc5Jeyz1K|@ zX7pY5{|^&=j^v5MqDlhK4rb+H^x;rmb0p#Svi%9@Rm^e8?}3!HbP=4MNipj?Nr%HX zn?3&F;kjp(Cf=zVqgh)GknF@u-hITrnvi60Gy$bK-E9K`zG(2;AD9T@yi+1ihpPY+ zTwV9HtAE7u@(0|y%`8eC4QC)_S=?cI`_n?mEPlbQRrw%i^4FCdVh;8bHtrx410|H5 zdFJvWP(v>)vV;!6$4xuwLem?0#+)C2VueM;#y?}X$yCX43DXghsg-$SXC(;BSn_xj zP|r$aX={b5wT0+w<}4`~JDNqWV0aJFs@dlWsSZ_TX#ZUGS!mwp;DUSKJPfCH6tB@j z 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Ȣ!k)k|nKoAuW)cjuW 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

    NXX_M!@|w0+YPgBg`@V{B^McC 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�@5OxAZ)xyb9{g4X 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�PPb$iMLn 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 |<)ijB02 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

      (I8)ztEQ^sIujh^0#YbUF$-3R-by>2J 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

      Lxi?d#87XF? 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

      |td0@w&V*?f#*ASJ!Qm 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 }$mE(B$yD+I= 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

      iCs|%d#Iq+`%7xqo;99V#7?@B%=FWHEs#;& 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�X@XD%1ga%-G1nRvhl`l4 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 z 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 K~Yt2oFfh>VYsmE2Uy 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�qZNE+6v~5jC#-BjgX~6)=lnH?qH;Rx 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%0AbyA2IP2?s68O#0zh^W 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

      v~0gsqBKz7402 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

      CyvD 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

      $ezpRZHt(e>b`Nyi&oaCXLT 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 z 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%0ACL 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

      pFClCH)yw*O! z5TTL&F`OpvS9I=zoO+G%(CJ=%B$5{<(>$8Gv=s0&<$Fl4mv6nu4zGmKDa+og+mk#c z>L@~yN0h!Jb0K)-S&{r9jL{GpZUxdX!@hZQ4Xb6aHIh6_{{M&*H30w@tAPLqa$l6b z{-^iB*tv46xDWi&yZMG57TkjU!+ceXXr|BbOWN+9b|oWsZxa9HTch=@x(UhiOqjtB z0LK9O6mW1eG8t#Zhz*vccipVj<;oq&?P>&b!B`W-_q6T`bZyL85hTX zx|*PS1-crptF81BSd`CeZ)^0fBUZ~~ z_n59O*VXTJ717oGx-ve7pXq9}?$vV@(5no-cY*9x6l17L{*cN-;~}u1yf|wSW=4bZ z@ZCIozjGZzo***7_jvM#G>$ERFFlTRi>7W*o85?pW&?4FIzim^z`mWT61KBr;CI1` z!uZIXYEXXZsEAXi>+Z2Z1a19=u}?QRkG`!F>d7>3_z@ip0^<+XUl3k+J_vjtrN5y2 z82ts?YxNgoAE&?I`Y-esRJZjPOut8eLG+*NFL-{R{(|PF9a#P={RYW@t-s*-Z}k@x z|DFCGI9(V%mH)x;#YXOrG@V;01TQk^${c!-!cSWd!@qMo7+xkmoQvPqoww0L7RLtw zzg^*Y$&dZ}9iAu9!*EdD|IMP~V;O^$^TG>2^#}7&eZN{Qd=p>lgz9G8{{g;35B7xb zkorC1`<-Kj@5U;e82sTlgYO#|RVREu-^X_&-lcCH@8Nr~dunHVFHRRv@bI0Yy!rTU z>i)Rbf_B39dVQf6^0QB69>4HG%_1{;6g9k3Qf zR&_`c*>9(|?_H%BOXH#O;uW!qP1aqiHyKUcP?|}0CgELK?NR53z|lZqNOKE&8&Q|S z1iFf+{;aN|q04}!_w4XayW%Y?u@y{;(_7qmKOWxDc1qR+6WICFr;Uc>biaYZ!KW(H z-dU$Fk=3h@#<`4Eyge4{5tTDHQi~~C@mbw0uPI5?Ic>(gNw|*hIoO!q0C#05CGvpe zDH3Fj)%8uh17SFhp_Q+q(!Zy5wjJs5@$yyfD*(o1+I?KUN-Z1TVT#@oHoU+i3MoaC zLxTy^{w9`evhRf1l0L3Z^(n`fxNp%mJ74q7KLJM77@>NE^(Hc7MM?*Ih zN5i{f6`xoWuccot9;G&8VYh9lfeU8+;sCml)K!$;hk3@kkH@yVA@1nU7FI6U9#J)| zAkJQEVwv_;$g(jO{zR)d#q?m7d_mjGlg&cB4fMHv0dDjoZ*bA%P0aM#(rD-c?JFZ> zYuQS>qHTO7;x>fT*MEF}MtbZ|_P(FgQyKSp`$?PedHeY-b;_a>dSiAX>I^NZy`_8= zdTnB8aY%&(8Xsp>yyaRe010Eb-VgwY5j`SJ)de&!K|8`vlw^C{^+c6;`;HiG)>m+; z^<|;bk6kY)x}n6KLoMXEYgM0sW0GU+>0D zn@ZZxc1LlY3rg$V{#tt<|K&`KI&{{bLHYWKOpjz1Z?zha;6|KU zqCPz^_#C>L?$K>v_jY&(l|RPS##7@y01Ghx@hu z_qL^r`C2@5bqPZ*Qf=$~qRHywt*B_Vr$m#NK&FP3*eTELmpH8$)o+H?*h|C@XP=yo zVX7}|^_`B9Is5ciKX&3Y00RkUAj3TxyEUvN#u^XQ3fOv3iK^a?!H6~KySu>*G_%)?i+}(7+Lr;Y-k;8 z*lZ78@HDR=RxAAoktmYR25Khq$2JJAgXzdUj9-{?31(yPV#X^z8+)B5#>Viiwkm(! z_@$N z#}#W9AKYq?wK&I>EypX~=>hf2e_X7)SU2){ngATI4YN ztN0d#MmY>2OP}rVY)l^^rEC5hynYN0;nFsix++w@9wezf)u$7C0qG~{kaFmNxcWpbVmx&m-}KmPJW^noG=~GM6hR`FlNXR~*LH-)>Gvf2Pvh2`{$bk4 ze4#d`S9qGUQ}(gOZy5IK(+A16svT5fB`)W_3~4XQiy3*LC);7*%^@d!WsX_OKI>PO;6IPWSiGxd@v!0rx0D;t?dY*0f{F+B#3GM2g@9<7n?GN8W z`?5W>KWq=}zrBa{{Y-nxrEfSa)n`g*Y1r60$qevZkA@;%R~!qcW2svTO9Mh_Dq&l9 ze%~iGF%_$Wi1{%x3fD07MM^Jt8cnLSY-WM)dQaH&x5-z znT$C%By}C21(T8dVQ9d0C8(7J{i8`t-r_Pb$~IGl1?o;=vBhRDGchW$&{(KD$KDr~ zMG>?rHdqsX<`b3}b8?!AQSs?zAg9QJvg=CG_v_%l%t(LM#V|&icp%@LLp%?a-zQen z85K^+;xIzopt8Ct#uQ{;oYD3&w2o6m3@CQNL|wC-UD7zSgocOmGKX~fK2Dzv`@5ui zcV=e0G_%A{vojOxsy2Fdo_zZqGcTftG%x)@zV+v2l=hed*O7RuaB3soGOthU3eC%x zZ;6CKzO}=1Fj`a+8t{oSl%?eu%==z|d7L%gm@ChDrnvM~unvXhXnO7h8blpWKMUk= z<-^pEgf_9eY#v}m*$7Sl9$}^C?S)o#;(@<1Q_t|g<0l94M(N||?7tjGwdM++|K*zu znM#(QFkhdacch=Dy(X-QXULK}3Yz;^aqYJZJLF(CaKv3Io?_sUVxaC<`Gr%}YM3w1 znY=M`c8rdZ361mk2uKjd)&4f|6^4!61{=XuFuSe7^poKuM`;kCfTnPRZTNlgzOwK2EO9FzU{5V_F2}Xe*)2t>s1k>{(Q7`O|*5L+*YxE zbB)t$CEZ6&lo;IOb<#u0`Ida+`aTPPo$>f_jG_k$sxWWE@ zV@McIt}x5QyYfa6rh{9oWnFhdd+v>gmc~3veL4#^PhApIGk(5~9ULBo)Q+&G>}RLO z@H+i8odLYX%7#;gwm;vq8u~LvWAiyzjLsM}?%c0P^Txj(rf%4(+H%J=atHA!>U0F* zVs@z6?l;$NP1A7*PN%*{G*LsoEmXJ6p|Vz=mmF79Vven8td950*#`x-p>khuMa|OY zEo)^#Vtb`^&qJ)KslYv#z$x5{p)4p3C^Ai+#r`woKc4KeM&zv<_2*G5yw$%jkZ` zbLuK~Fp;*foW)}vSCI&~VW&M}OUyRGe#}nsc+QYe|IQoqv1qBkL8;TwTomCS$d_i1 zYz`}nqAiWUvnb!&Sl87#8rsLi_6BRxiNH3o^olW4AWSUO4CMD-z;D)F?(2wke{;n8 zMT?p6G6UQ1L=(-pWtVhBTQ`;ylnWP+T2H>A)`X`Se+L`0EoN1B*!|=xjrGHGx`0!Y z{Jm;4`iQe4GFR3+)M%sD_FPi?V^1VtHA4CF&wEZme-3qu^;>H9LmF7hEZn6myZrAury&n`>ouEb zsuJ|B1Vh`SQzb9zKSs&#J>ogBGC6pDi}0LygAAVYuEBG{Anvt8TkY^BNtHwQj^_ak z0p5Fqq5WYpc`$S(WLEI8C-|w#Jco`z2lIAO;R*eX6*pSZKIUMLUJQDPD*8BtL%7S^ z$8L-`&={v3!qA%b_W??ozYDjwFK?Rl39 zuNw;Mp?r+men-l zJ-%(|g^}XGfE{E0NNi}5ug9G?HB?So;Oo1QkFH6)0_{3ekZ2ACfy9qA27TF&N?sJ| zIc}EU`uJvVd!O?OMf)NA)|1dFek`*4Ed#j-fe~^k#tIxAVK(;$FzLrIg?$ZEnC`q{ z0z#tKE!>X-@}k?;g1N%q&_W?Q#zo4gWUj@=>g$1~VtqEp`axb+*gae7 zC`vx0gP;mR6Nc<^S`?Zv4^w`49?r1Fdw4%X$KiW+ilC5+d1Fi69_nBDI>aYfjV_b+ zVie|4e~2G`oWfe-6b!>`dnW^LA{XYK|H9aV+KvKF73XlKe{0M)a^f7k_umWNC(^;d zs0np2j4+a@E(k>vtX9aKv@MYHh@%+aYT_PDBXJp9!68y9m32UxMUzznN#ay#;t z;vpEHSv+?uTtEx(rwsn&jVE^~!+4qZKQp^&pjK}EYctVPUiUAz-dU0=GJUEA1ANJL;Tvai@ll#t{E z^e=2pvzbJmlSc+!P5|5mLv2%om}2fx29L) z!FdaRh@rt5HSL3RPkPom$t@W8ocbr)CMH<|#oq{Xb_1 z^W2r0C%6>MlLP1g;C=>xJABt7k~LPBm5^Q;OB(2f>16=7BV9w69^hUN&@xD-&PahY zofxx+=_|ZB3Jo-v%w)qJ^qvd!UeENa@r$oCs{j@pnXez?W|^ErS)+++-zlWi7d3so zhha&2nAtog#rk2nr>X39*Oa(X_=oshm9woH6zeC^q_n)*X(3<}%hK^hl}*R*hmc8W zSa0R!1BSZ0qs@zKFT-L{(+8a&P&eoxSnK{8kd*#_qho9OlTNhH9cRSNO7<_q8M5P- z|24{Ce`el(aEBH|KCr^Fs;1+z!EpbO{9+`wt1BrTmm_H-6G2N<0J^D&&aNALb z7o^|)Dd&(#zQ^ja&4@)FykNI?&ov@K@O!7J6cWIbo^NDnWu;NryzR8Q`{uOw?EfY> zk|b?YGJOK8wd${BPxEKRd#l$tv+sCMkv^n>6c!XbcML%Kg8o^tW>vb0(vJe#)cs{G z{Eelk6USfcXA5Y$qItzTtByJIoMQ`C%wO%kwcMI0DI6e(^FojAkAA-(b>pXZyuXv1 zwckV!T(d&~OHasrk?OH#*s+}Xd;oz-{I;Gg!k-bxGdrWZfX}EZ?93?VjGb63yP2ah zlkq|hKy4ZVc5P4pVs=Nzs-w#q2!(F0J>;$BxU@7aP5{YM{VEHplXXOZZMB+KiRh0s zc30d27c(eC$`7G>9rT($9BZR~zEsJ5-Ke@qrMf1St>Jfd>Vjq^tyZdhJ_`G+Qk#XS z=ZRiX>v8LLbTIL1b67}e%5GP6w})wPA)&>WRw22US`(MRB~$iR1shNN7wea@KQ`Ab zj4WkuL4(rIyUN);)?IJg$-ZTy$RwH_Nwiez;x!dhsOL!}d3_NFJ_Xfwv8m0l8Lh-J zE8JkJun~zYrL5;>t8pV=GY)5HIe;!>z(BjDZ4huNp#sqZeZ{sOSy-rZ7Igrlv$}kK zTqlvux2CL&hUP_ke~K};N#}$`61z&RdtzKoE9G-`au95LK{QNMvawqvwwH2hACusS zxzn&&tRlY7T4T?ht6QA!hsjTgxJP+I%#PaxfW+Leo(?{M0m^r}SM!f-6Unc^3mzA1v zNvxdX$rkCd*e>5}_gqAgSWHd+YxJg$Dqh82VI^jxb7As3)Vk{?u7;#~DfpTLsLMMT zL#1{990YKzZSUKyAH+g)V!b(@4nxwXoH%k5xp*CxWAmDpxYX|Vk#ZrpthD=)@v?%& z_4yyMdX2?Qo>=4&7(oWlsyVj6#9TJT$}YF2^g5KkS7-}_KLY5+W071VTdNi3pn8o; z|4E%wHZs<8rq!?pP-E+$Cj_*`tw&l4tP-s>Q$A<47KhW;Mom!0$f%b}PANoZ6Cx z)nKwXj-9e$>|P1w7}2>G#~mmFxaLuf^fC&-C@4+d4s2~3 zds}Ajwm1*K(F|+>Z?JgzlHGiiS4Dd#?Zut)?@FkBi|C5st%D-iGcEdq;GHKI~PPQgz30HGaoYBZAi3=cGoik{dgIA+!D}m zHs~?#2U;^Wnt(#1gXyT+CdKGOmQg{=SH(lKqP#;uOKGj1vK4xJfizqUU%$ zhy%bH+Ki)-t0=B=$kL$GWo9M0GN(!E_}-@3+{9dx=57^*?K%GEw#i7AZPurY>RXlW zNboV8_qrFWGX`KgG+&9S%9x)chdsv2#HT&SFBa93xYEX?BpW9Nl@-)|Rg3>LcjWp^ ztWlwh#7d-)1OEBs;lv#Vga|co*jeTCDQnI)Uv!bH09Mev;=%71xEJ{L9nl#9TKRnU z8_<}^>RIquKcNFdmGS(^sOn>-TWG{h)=_Z`e}D~()Pw>7WNQn=``a`r?{NEg^p0JA zJ-f?4ujf~-Iw@pEjmtd%0%?hlQ0&36(VpIIqYqVtjO1;~?IX!@?F zJ^Q&37BjNHVH0P77GfG#y0YY%{f<0eNvrDc%bX8XZ%xt(x&d(2T@;x!Gz@e4Ynd^~ zr5-fE#p$sFR8m(fuGROVyVJwwOBkI&Ktlbk9Rq5~QM``BfxN>3OhRB^xJ$D;+{~?# zB0KDZvxS!lBC&g~#QTmJ6YFJU>nvlw#Dw{J0MDv3M8>aD*Cz2*`?-uk|D`POdh3OK zH153afzZDLOMd{rOAP$Zi19nT#3th{3%}8Di{O{C4~ycd!U$*p{N^+v-&OF-6e1W@ zt4v7c&Yt5Z+Zm6dM@Q7R)8>8O;73gOA>YS>c&IrRoE+;j2E{VlL$qU4bwBe*ja!6dOVb@^w$Na;RCfvZ42k=Thu(%1l$ z`_jryTpHj-(D0!50j4BG5`o7wOO|W``rmPD82!kWkKSaiTfImoKKs z`7JBDZq`4z%^U8W3>^Iz@zgsUd`POV5#(O90HJafYIas2-?NgQd^rDM)nh2># zbO>x8#riFb_d~CL8wnWzeH%g6^IdIAypNsbb!P5KqDYp!zcSWuPOKkZk4;G9ZV83e zrgeh}k!s8mGX3z9$n&~kw{E}_w$PJ_-{y0hl!k%1Wu;q7iLb3QLbZ>@_0s$*GSTa| zlh|=HYlR4_<6KsNI-$*W?;R3b5i$`#+jWVMxf*&y^2kar%*A4` z+6PkiyOEGQhW~F4k)@Pg`Vy36Fc5_@a@llYoE-W9-GgOogoG)tR&1o@(;j-j3dwPo z;vcx-Oi{#U)2zp}EBFdO=kfD2s!2q^FR{eMdTc#4L!nqCY2S`WlMNZQ?m9$+OMUf* z>YT7qq)Gw=AA61fzp?z|ZUd0Kd-vynS1rR*EXGdi!%3qtb2dfz2`FbhU?x) z-TO25?38x|2M5Kce}Vwu-pkEMVpbvhhko=NYgOP5W|y9WR%QtDv!(=SC0uEHr+A16 zJS%l$=Xi+O-odmaM7PQcZ}pB0Ct+zqO(gN@{?*m?00Ycuf?eTk1)6$>wig5v4@58@+UWg$8{ z&sLf!hD?0KvCI(p9AX~CM=aWFd_=@BhnILOFGAu$R>Erd${r#lvhjqOll=1as!tfa3! z#z(wx<{siB;NEyThv$Z{1g`DR36Hp+waIgBKLNYT+Slk6s@f@16b8H7YYXkL%Du8p?B?AxiEK}bX^WqaQTicPNA{2M`9W-nJP8UB zN;jM#w{;(k&+-^&z1CH5uD-E~rCvY_lP!%MywbR~t;9pn57mSjU>w&F(48jo9_wiq zzT!#wvAuAY7&{$R2z*;K&y8KguuK~yd{E1bjiir`^u}n$j}46YZfq~+C3f(?$NUct zaa`DOXQwwxGdjjk&Mt#8(bv0ede=_v=h>gmczI>czGL1$-?*~bxIj+Y6uquvzrc^Z zEaS(C0w>W8*d^{ z_E^MdEGR~*K`O&d3IN9XZHo2#^mF~!s;unGQJ%{=u>0hmuKIF z|5|jr%lMUyT$!c9f^bEf5dpI}+LG>mW~xuUh*maI%|x)6x-9v07;%<2CDaB=mDH(u z9v#+0bgZu9)B+^`ocNWi&?oYce2!62DzV>pjo*LDJl{k7%J+;>I9l;(SMe*KX5v>w zw{rqm5QU&pnJ}W<0G8DZanxj=jl#==@Rg^LGt6rF`tPTCp)|3cn`&)5JI6ab$P?qQ zfSwWWu%s@r_gIHHtg0!Rk--<>z$BD?!FY#8IuIYqa|*m58@lv@B;$o%9Sh?JS(i@zwWGtUoIp9lzAjq){R&`Fg|H+9slwE^u?JM0owLYNNv$3BXY z3xC9@Oeu!xHO!>SS#4D>!QO9Udb+|l`h(5LJ(s8dS|u4~WBRoL*!oEntTYiN%WI6$ zU((UJX=hbO$AyN}T;M7Z%+O6)`7!Sgz`Q@mnD-+umGUj4wTsSdu`X^gKxbRiJ5F_# zGj859_Wj69#=w6bkf7t1`eRlAMTyC=k{5E%$Hl8o%(L#Nc#><~KZD1{x?d}RO7-|Y zzujx}y7+h$vdlWyQ6C}lqV^O07(vc))8F6#09m|G;x2MYUm&ze@+roA1ufmBiVoVC zx@wv7n|U=bt>&JVuj31cCiN@ZKH##*n#~QqrF>Zy8$|rWWjE z8!&>e$%ss{L+@rM`}ou`Sk0Tl%&h*ljsaFfU)Cm? z8oSFqh>OXP?ZbdGY$tEiLe#g+z17IJ-ueV&{o`W;du|y|v-+L*5oho)n1Fr2IHLVl zN3H)^WZn5|pulbApA0=Wv?zk!;j~Z-H{vXel+TQW@wxOp)%^@DJny$>>}@wB8* zRY<4MUd3Cmi43TzjyaVR+hK0LuGmkrjX{RZZdRs0i+N_(w+IO2oS#8B3x zf82?*K{(-Fo$eLu-k8k2%XRPNN4R%s=3ZR)nso1s%)JWTtJ1yib1(8de8XSP*L89V zsDM3c0cmQLFVN;d+C)`4SpU^qQ_i3TF-#SU>b}-?)TqhzpZ2f&Y5k`awFgj_)6jB$ z)VZKW?(Y?CZ_*G;{4U$7nrls=PTKqkvGhYygL;-hS_j}joZ?>Ls8J9TE-EgCj~L%r#ab(Iy5GC0s*@(!qpe2k_hJRzD21j} zaZ@EGpFaKPBM{~>+%R_3n+?(K=a)pC^NDsh)rq`-Djt`b5crBE<4%e>OND3QC0_ZA z$4y_{^xijz0VulKoEczV_um{(eBJ_o2q;|??nxhIzRguM^h3fqS{QIVI9>;#)HbUzgNnJ}hW7fBlr_t19T3@Qz zvc9GWpu)hZ+@cRro!G0B!>8=TkpvCom1CtSjav)Pm%``lbceth*~~G&H3y7;#FzcA z4KQC@sT+Iz8aR;s+EBulL5cO)C8VO7BW=j0?kb5|Sq48;xecQ6z?|NXuepy!8H<1e`(KT~sh-_ufkLR2EH3eQl%%f@v)amVwI*%@}o zeH#TUhd@kr&wM@a#z)qL&F+Z=Wcd8iJ&NlrL76PK*=rbeULR&xkoZ9up>_HVtlz0j zA^p^M@9Ut(#hFF?b5T*o_VAh=Iton!tIiIrH?QFwn=`MQ)%(mM8BS*Aj0Sq(RUi5! z_{`2>Dt|T**(!-So;UwIKZhcN_OYs^|pKE55Kh_eZ(oMiCKHl z-0C9CBn542a>jEIQcj~PD$%ifDSxxigx`_#v52F?o)>lgKlaWAKC0?!^qFJ=0fHwW z2r6ooXSrBh2O}9Iw13F#-%lMKUV-b~Jb^ zhioH7Ik6#n9pMiTG_3)uuUYaK`a8@Xe)tLjjQ`kCf5g2r5GLeYYw4>2;#LKyY!&lE z&pc_ta=(=gGwqBqiVF1!AfbTf*%s_W()bL!b*OY~H^+gkQfV<@;jHiAC)xy0>G2Z+ z%CtBwVPy!?PBZ5e3SN%!iZyJfNss*;zl}bdsE^;c#NrA>?jObQSS*NdU3;`YW%k$3 zA(v5C`tgPPD7%wSCSOSua6a=G@wr%WOm)pLR-adK0>=~aTdO!R%6Q~OGR(8VgdJ(C*#dinhAavqF2$%bJ#LdJdFslg*HZ zWFO?cD#<1hxw^%u-Aomu@~hbGq+Rgg@;hQF708I?{5Hm|BUv6$r{q`|aYJ(OQ>`0VOw zrx8KkYh7+#21?^}E;RHuphnLl%hgnuH)3w9XwNcMHdE*g*`tbxrfv%E#t1@cr-Qre z!JQv8w}WO0VZw5u!WZ#*!SN2GvcIl}gj!Wzi;H;7FGp)$_D$abOLfX_6|ArEXRW> z1X{swR2`;4DLd4Rj2jSbm+Hi zO^1r9UuU&K7shhN-xZnOqRE05m3)A3W`TO1qiaVBp`7Us<$Q%=A2Iq1joNKU2*0L^ z;Z9|8cN9WC@yY{wtb79GO3S44D1?UMm4${*ZF#FxnG7F=5K_GIb3Io6xl=il%1~3h z@`F884wg$7dQlOQ(iO|T+5Pju8B&S0N+ERRR4P2B(j`(Ui%JleQ|ateDoG&y@;+4R zYfVE=4E|AWcYId$LaW36Fi9D{D(Exl^B51C+?$pi-2uWJ{iF~b|L>TerZsgR=np?=Jj$huGV^rNQ zBqDEBE#j(TT6S(!*2=8E@5^T4c^%jEcNO)We(@R;jhjybh&UmA3nHLP0q86aA7kYW zO3bH_k)p{yLVu7PbyG-gWRG>eLz6P{~{tz&Im=4r* z(tm`=o{1%?bl=^oW5Ih>|W8t?K?!*X@RZZ9Udq zuIqNgz%P5Od!4S^4FhF8*8MkKw;Kko?y+u1j~F$Qh5v<#yYT;Y zVyuCOOZ(Eu?YL`6w|eCN2(JqNSMjU4{BED427abSDi~GZ&QY>M~u~mFXG)se^GvVQ67qp@)@=Diq`!ic}~%N z{zz%6Zh$tf>vhw8B=~izj$l-_Gcwxiru*D_N_*RNy>7aX=v-af`@OE$P4_wNl=hbC zdR_D%W90{wrnVQnrMnJftlU7I)UgIV-Sr@2<&V3!Gq{^BWUTxyRg^vyEeFK&SdUD~ z)~bYBN<7RFH2j-gsK9DDQDpV=9^39i?~V4MzM91@gD#l%esLz2W^9ejhS_ID2k}%> z$%{$a32;v61E`!sEYT6*-oJ`Zqi`8jU*H@(*7&QuR$F}4gcBRmFSPf(!mRs5K$gD9j8@0yv?8Ftae)rb zOIi(zT#Y8)@7VU}ShfHZ@&1{PCW!ZH2(%mV{*dR4kZF7$uh6rf4^;q=?q^>WoxmFj zmPp9x4AlkhVo34daHqpawKpn&uys`waCThXIkLX&E z^lTKcuTo1^l{cl>Kg6koaMxO#H`oa?<`jH)|&r)rX=h9Chl4;I??>8^?C?Oc7NC=W|77 zm0W-xvO`WzkFM2d+joX6(=_>1w4;1iKsFNgyxJuf)%Tqiy@dujvk>jWubLmni#Pjf z!BJs)0*@C_h>VKQw;GS4#Sr}^a=imDF*BoMM*`EqBT&_NEO%zlc&&3%YoW1gJeE5c ziq|?WcuZ+a0Rmc}EVED;kd#cTaBwboX_BPU*!juNk7rPgQ+UQG?K zWr8hTqwJ1_oBKuxgT}amBY6t83i~FW7AKxI1`SxLFYoq?Oa+%^W31+5E!LzgRz)xz z8Q*}*;Dd37W0Ju_!fbI7d?FI$Fg#Sevi{h1QMaY;A3+POgc$i1SK!x!GM*m25Bw(D zdyprZffMcR6#UcPbbdvURCNf{StJ^@T1MQ(J%WZ|px(yUuYW`y;h4)zw0TlwiNR=r zsbm$2(?haqsHduT=&Fut6>oKRPgN)Dst#?$tB&lc>QG(PQLN%s(|fA=u^N@>P)WS% zPD)Q1)&^bGQEcN?pYExu9Nh&14$Z`?F6*i4?YgSKwGZ%5!b?(Ch$;fxvSnvfeGLgK z_ex;9iGnUtpDiNP0=S7(tSiMPrR*W-T#|dUQmnHm4w4Ql*>0UskcSM3va~E(Sf`LT zHR8)^iEUxi5A}<=C@OhBD%w$Yj!}#62P>m;Ud(C_?WwD1XFaxjKm5ISqUz0Jt{u{- zXlE_<6z@QS>7{)t+EK+y=ogZsKf^OtABG~wU#3LML|#*(q*gp+EK(- z$%QP$EV)q2u*F<4Y4xMB5B^|Fk7?$rfnDWQRf(?kAz{5$|M$`tM_J>I7=hdCqQ7Qv z@?m8Omsw4b?Vor>$X2n}40Nspw11$U2!AK%spXU*->BSI$v8Mq(#ZmU3<>wTiXtVB zj1w>`c(-x^+jHIudxEPa_F}R1O0l&i`VA$hH$_d=WoFP7V49(QZGf6VHw(b}M$4&H z%wb=)R0_BhR+e5@Nje3f^4UI_%E9?QE;RF*Nn!jNg}Sr-bZ3L*-8)(~iB1N;p4!2k zB2>sIN2`z007QmRc~G@)_$33uTvXd*BsdfWC`h>yLb}=64c8Lf+wiY?U8`_9%d^g)MaXTTK ztVY3615S|!L3hfwj^HP#~;((HHH%Br0| zA8d`w{3|cdv+f!yF9#c%3bkRsDNQOi7M_(R+2wrHO#SZ9WGif3X1V_E?dsKPZC6V+ z04vbInQ765;H@V9zWV;xcz^Bfx2x}8uD)-o?;Dj9sT(chPrSagVqdDim!-cKkna(2 zm|C%#_M5T)wUAe*j9NxA4-b;FvGFW2>h zy1qm%jegFbQ`^5&*EeS<|^?^nR3VMeT^E_^>{6g4B~fhhS!b$Xre_;{73R z&DfgfavqbrTyE0jVz^xJ%eFe^MwHM0PbQZ$+y~**_SExkqvogeMQhCf1F8q&#o1!wtv{MioM4- zOJlN)%T^p2Q-m!BZIX)imfjGJl$khx4NX8b0q1~cud@SHBJG4W&h}Y$%I=z`fA;FL zB?9^KJE0s7d2DS{*{Mw;Ay(c@k@yN{i$idZ+P1TU#Z7{d zaFT12x6j9l25V51e7yL>00~=Go=!vFqrS#A5FtU1x;J_rjYh}OSQ6h|-hYKh@%LrN zto!@#zQ_9q5qZh?6XSZE`g&Z@Q(E)_KCj>(AGhpk>*r!Nh{}?_%X3M-te*=`qVIFt z<@uF~=ehE{q5Jb8iRXp#{FmLIOD<;JeuX>_b$`Ay@jML@j?U@+{JG?FNXu~~g}&nB zdp!9Z07Nh7{(f2VIRJ=ebbo$*@;LyAzRzvf@h6|>^1OlD#JA5*J}czeZ&ROjGL`Ca zr=?}3MJ26R;yuY=;yeQ=(K}P0H6@<`km!umXMad}mYx>9GWFRbDbL(#QRx~R;F@MX zi$1~Anv^Y5{GB9SFZs*VetRPBxpG**Ss}EafN!m(3&b~}S^nVOOo-Y8xF_IdI2m7y z$wDp&yU9bH-(2}M@|hz!UMS8pS+*#%#3WIMCf4$$|5lv=pAPNHq?Pg>a$%=k-oC0c z7SVi*>Ooj;d=`k@_^y2idPnGxE4Dtd-;?66^*kgk|7d$ZM*{H`2wxj1 zXYv0xNS``j*cJSldqoa@F2O5J2}X+-)NbNS#^*mOie)61_(r+LfN8tAFF9lkxb_ek zo=V^IM{YhXH{kg^ILM!mKhe8DR?b|xPS}rT5zepbgP`GOUth(X{K&owxQK|%k^?G@ zf{hq>*u;jpbOo1$P`4~xjg~!P*&QajSNc%IzXNq`K_T+vdR#jvw%H))(Bx|N| z$v_$%3LN!(`TTAL)Xt@`^@M$jd@C=_&Ppd~pc5}p!=HWrD^&t4j)ns+Hq~WvJ7`qO zwv;;J_!52`_yE;j$P;|%{rL>^i2Xn|ogjOa_)@$9Tg#cW`~$(!3J!azQSAEEwwM3_ zsy|#d)IVZsmVaCs^NpAcD<0ULW>noL$g-x`0XA<{x{7)VNKQ_csQy3gg#v4}7^?>j zAhB(=9AE{0*?g}0NorxS@`pB3abdbhabxw>F7bbMc{#qqC-?YAu#*Y54quzbhJbW{ zYPccz@7*xI;$4 z@mgcRVl|5B7#VpoexSTg=PE-Nr>&PhOT)k%5Y5ALay++RIbFBBN4G4ld$cU*G6q~H ztrN7)7;vjQ((y5Eb2WxCX1Q zOMio-Rqq^Zb?>$z`e-&qo#as)5Zb)Eda7#;N?}^{_370{ z0~;vy2L@J8O<&`tEVQ{IwDnN+^%>REU4_+GHq5KxuVRh(x+>IMSAD&!y0_BSc#bhD z*iUWOSMt6{3{C>?hf9&WjrM^99XOtmd;k{9qKU#Z?<_5wv=`pX#IKM^jTq@$?>QeA zJawYyU3;~9FZd-n5=?9>T+B_+rp50{D{&%>`zKJ8!n+N#jMYS++MkQCxqEE^gio+& z{I|ckt^gU7?UJ+j#%g!3vCY8=xH;j}E{r=ctr}<7gVkGwopWsSIC96D!RVBo-w|%o)MS;)Zva>ZrcCbXS-@*$r36Xg< z;%JeiR$YHY0*K^B-+Iq^ri&@J(f)atR~@~b_n8KE?PMC*eo;H?M-Q~9>L)JVK<8W=piKE3cha^9QwpG{$5w#mO%zS7lDrI z;&?~n_q0t52VIz0{IuUjUHrL%cNetED=k#5Kb~REA^F4>fe#;cExy@nJU7aCuJ=68 zq0*U@WGudglDpE4=ccC5W5?k-$}$&UFJ*4Z-0Luwr^$n>>0WRdh#KM@>&}6GjMbcv z*r1lkKruQ8mMLhBy3e_Qgxx#OEcyDb`!)6=wlsH`34f|kb?Z7@mE zm0QqhE;y=g7Hn2O9IaT;s-N!8MIpjHu+Ui5M7+&hP=#MxZM*baZ0= zF&TqR)X!J;$PlsOk7V-M%@;Tl z)=)!vtu!6`NXu8^vh|Y*G>$)9gPBy?p^+JAsp&erPL>=@hIS%@u9Qjr;Z|!6=N{uXia zUp|vc{(LyAaav?hZ_crq^&RPwC+cB26=xoMhc5gj=HwOPph$;qTl6pPKG%0k^xa8) z_kg?@+Q)bCdplo0>QoqT5L%%8}j+hp?SnLwqtd(g41qQKbyNS0M zI(`NrRXv-6c_Cqn`0C2LwCgD$E zbS4Om<5Mi%NtlM77F8xP;diab%b$Nqw#P-yZ!dH@e@`I^_PB$@|ac{`+#j`X1gN1+7$ZC$c5c zV&!+7lGqav*>9hf*-KG~QS}i|qOU16BJ<&t2bJ|w#&Bc!MP>$5pU47OJy{1*`seqD zc`t1?R+zM;kV2d;`J8n)x{%*4^HIaDtk zyZ?jy@c5ro_yJWh!4D6lJm|^~b5oxr`9Y#p-23Z1=4WAuslo-}F{9p8NQsVhnBoq8 zglYB?A>SqZ3D){2rrP<5;q>{YmKyg1E{vd_)&_`!`Cu7qZq)DI$qf7~)AO<6ox z5sD~XtLm4w@P4n>5t^!;M?ck%{>Gzc8oIs}(vJ`igMTt(WS0i#t4BuFcLm>(!Fwye zoVGTTZaR(n^_!(Uy6Zo#?DFO%`q7O%8nU1u&569MdU?8jG?7OYU+((7HhfaBBIWVu z^=rF6dRsj*DrK3iyWFm-AClw{DRTc%=V~o52COd?{Qn z(~kW~UkP}hhT^%f?px?keFmArro*4f8uHy*D; ztLx=zOix=p2h)Qb?Om|>ysFq&k+(?xt%TRO5asDY-@?YZzWgT1z_1OaVc}*z5@mbd zZH4Mb6}jqs`Hi7QBG2A~HNxLP{DA%{5bb@PpqBZJzZHBnjY7V{-lkK&tkbxN`FQ0K zo}n75m6uv-S?$Y?%ee%#-%YHUx4;-o}deK`St}+M|zgwXAdEBwAZpK_?38mUaGYg)7a$iLX~C zW3E{zy{GSl=9S@%WOySN98p8i!&CT*cYERCx%o%vDE*9-oQ(Hy*++3#B z&ms? zO1?x10wBjW<;jY9Tuji|K3y&~vMabm%ZsCX8?A%xgPsMQg6{k_2{O>URsoD|7|*l= zoBD$zeG8f#c&(2k+y|C8jvG3Vr4|f*p!w|@hWkMMaUv{p&UO5HvwknAZ#M~Kip84yK)Si0RWTN7Tm3$m z>fnV7JLl4E)&MPFcVR1y?(569iN@gStUe>Z9oDM8hO@B2UWrg*&bprN$9@mLd(|YX z)^HPqlgcjlE^Bl62FNCXYl&*d`uSLEqx+1J0_BxYP$KR8a)PG9h)`kc1R+9@!zws4 zrGfHIijS>&MUfhMZcUhi2nh4w$OWAOXhwv!pt&nyw$IH!E`*tY-LgFbQgQ|eoHYOe zTjbFJiYCv9ZlrS%jdyKtdR4rjPRNm^mbkb>F3#I6ZT!^(kqqS{vGOLE!d&@%L(Y}NZgSJ8s)f~z7T;O4_6dvXJP zHv8Ac`NLdLui3#KL|RK?GgnN<1jNP&6J6PKF09!ysKXXB|3_{9;rw;aGs2C06oV;+$T<#;+oUGrS!%BEzi{h_k z?@7N2wJbv_c5Mz&r+#-a8RGqkNGN)p5bIM)9Oq!pMqXfQX?4_VRI z+aqF{}+ z_S_EbMIVB*iscaft?HtA@oRpo4vG%d_wp0c8$PMG2l|(_2_Kg2AQBzPZT3aLA#lcBy2{HXPyv$01250{|a-E zF@?F+)yPDl!o>_$k2$ZlLL3InW$k*hka>d}%`AK5NrG8KVtMM>^On*iGWnkH3nU=? za$F;_ZM{q)nqRhYY_%J|Kx%v8mu;#1lECRH{6e(^!8q7m*am73_LZo>r!~bw{QdM zTwRZx(UQ;;>QXsl>d9z56r|Tn0#4>Enbp>xB1iYqfutN|E~O?IRV@#Gqr2cIR^;1`(douP~~F{eY{h-2dox6_j?h*DZ%r{_1r7DbN!w-j1{+2 zt=RL%;-@9t#WtlMC?$6gxQb6<8z33$czgnrv!tj&T3;7BMS-(D3z~)RloVImMSe5X zg3gN`0qgk|)GJUkqTSFqXnrl;M zD$(4SFaS2gSv-juSUe}EbeIe3v;rqG9tAFX;lj;x^S3E20j`TLyt0L^U7M??bmVVQ zWZj8wa2ld;3|f$KH+WfwCs~Vsy!YlmCyd1iDzq{$IhDY+1+kAH`5|b~~XI z%BiA+M)(#uO-^#+HM>&u%oGvkC`>(Tgmtn7AsV5LMyQmjB0Q>ingQZ~+UDKaf^ zejSTlG(vX;nXk|Ysg|7Kv~K7qFJvBrw&9()rseO#X90+{2aV8Jaez_5FQU~c&ild{ zuB!$JA9vIK{+IYfMR%U9zI&W*cbIEWnc4Pqnc0vYj@qUd3W=FbNdQ<85kOWQEdykM z(4!EjV6f=0JEKcLdqUrowdohmL;plgGr6`+D4fYfZClEsmIWlOWxOhYw{ z>fUU2>k<-0Yx4g~1S?j+l(GJIB-oGt=LGwoTdw@;6KvdGzB5+gtZS9Um=9CRBsMA&I*uOs3B1RY4(LnyA`*fzn zQ&6=BrqPSqg(AJ*}C^~Viu1Dl5htn6I=I;$F*wl>VG>O9tJm>V3s&OEF*WdrA- z=<1bEs4gQ$PQ$b{VxW$-)Xc-aQO5W9l~!m%e{Y`H70L$iKol?aB!egVy_EhsW(cAU zTN?_F=WhrdpHp@=wqVZUJznQR(};J+nSYddNf~699ar|He%dU{CTOe`bKr4pEutft z%Z`hJx%lr^i?Yk0ENK&>ec3XlI09vk;HQ<uRvt)`>kR^}EV+X*D_DT_>ib*yAb7QRJ7^R*U$- z=-ZaE3S|jec8(a3SVhpILnvU~;Nq-H1Qqes=i_ylMAKuh_}3*=@wEv(d`)*f{4DjN z13g}J$DUwwnPt*qV)izN8d+@XrJOyG52(d9!nZyup{N3$&1J3J#Fp1+qmlq{aKhl_ zYEIHCih@ELlo3}Tq@S+z2LIYbH`m0wY1SsYsZ7&lXR7xS-E_Gd@M^&*wwO(iHf0jn z<17zoKHkfw=v}IpP14JzSY-;t|3ADj&HP`4cZ$EU@+2EB;k=CpzX>bMGY)R%uHFbw z#U>&_{nZpjSrMUc7=k5&dh~wXEgaYvCnkpE``*)F0 zyx6}F5AW%B#JHheOJQhZp_F!f94|e|6{WdS+LkCis!MaE^hl!g zkS@)V(rj~77*F(4QklFjlifL4QCf`)o9CLUI(t=A&tC1? zoZqY#bF5G06GzR3Ta{f<_8qLPKI^cnGrwK!<`hT`8ZyhD9+B3VF%rK~7huc$I=9A( zV@#h-MQID}n8&+C8RBx-)qPv*1xD3hm3g9s#cUgq3WL2Hd(+ZX*Lpe!80%c~ta5hQ zHx8$T9{h=A!+H3Ap{`4Do`S+wN__D(Rmc-fVS=h5y2AFwipmCX2bIZ#)8Y>lrDe&3 z(EdVs;_mXKBc`6@%9G<<^R?}Z)jOZ+Cpq$@rgKEfllSx!N#HPe%8g$ZnmK1j{9UPk zPP4AzhN>jB!|RKwd&3rbkS_21#i?toSOJ8D@@^X}RJh+2Ev3MjZ>79$UjZX#*o>IJ z(chwT#PK7~b7*OexWw=rxJ0AMT(0$##-j955)ZEXubfn}itsEX%D%Ds)p=GCF(Zny zBm?egdf$XZx8)?3JSzJSJt0@OPu_qniZ{p`&^ECfgRFd)o(gM-*XJPeufihsjr-*k zK;|dU!Co8zXki3IioA4#5fXLqCA0U92S`4f(UKfIrbRz(|Wdmz^xMEy=_dj=qxNND{28kOU3C$mJBl*pxOb(T zerhbrB#dxT@9N@S>WEQ|QTrNot(HE`Op?W_oKJbjjdR^0&%i3gI>zvxXA>G7(AHsbi~*}kZs#CnnK zW%|LrQT1zlyuA>yH}qjgWnGa`^jUNjMPK->e*llQBOtOApnTILEJjh)2TQZO$KF~y zl84o%P~4mc&h?Qi)p30g%ii`Miyhib_qtx?9pZ}aZk&{!mSW^{ZT9BB1s_jy9L3oEu3XD4vRKXl zulNtH#T6qm_{9kRVo7`}|0FqI9Hs{GLGXL5n{?Ejo`t`yr=x5@Y_S7hBCd=7@wccm zrBm04QLyN`NXctDRkh@^ZgNSOYKkWjJ9RRSx+?vW>}E@R&xhqaQN_ejr9?Wsp18B` zRve#AVt45$Z?4VaBK9TyJ(}^c>sb?O=djD;JcxX?gEBlF%l3{RX;i){FU=tb?BM&} zC?Ju=u;qN!2#tpkXGq%8%sC$vq&*LLERAtiqcF|uX)qo#gx8;`_gZgw^ILuFNj>tp z^KGoN66o+;sjzy8*QgzoVt#mp4=h!DLM}z!fh>6jOPp>?! z60%GgVb#@A5ywXj8zb~3?p3B6uk^4tDfPwD(?y7SS$iA+eGSD_2uCPvAtfOlSvzUSjhZ<2xn zqD5BllnKxYj1(>H@_w>h9Ew=)q!8TicrQ+HaxNFQdg7piqU*zSo@oKOD1C*nf=eYT zg4KM~-8YMKuTYv1yIs#4n$EsvtiA?kO`d)%_=*ZzeO60D4fzToupKgDMPaQ_n6XmkCjT6^!?p{pNytH5JPUT< zHx(YHC?#|UWkP3zPwYYK5j4ubrLoJM_WeR{;(vnnhHuF0{(O9Wn~g`rUq!*dp*U$9 zr1_z^fu?86lBW3k76~e)iz*an;VA<#s=mSZ6t&&Jg*2)7$E*IX6IO~A$^%$1hZ~1T z*U7c<@R#H7p2GzkeLW)Uy?2SAGux=@tDA#Z1;j?EoO^$KfW1{?La?2n->dF)n{j{q zNap5OfCzBX#5)Zb?c7bt3w&ArRm5_YTy9u8L&3%s3wU-dnW})IsdxwgDK=_{4GdUs z6nS1>`bt!M4k28%xc6IWkZOyZ3K4o*L-*w0(&%O?)tHh3LH<=l*K(iAg}b4_Aw7xTPog`4lx$XnL>E^pNO- zQmW}*(X~-ouIf3o9aRwiCPhj5&JjqEA3{AU=24MEjLs9fNs%=^9w;gw#!5kDP2psw zSJAloBPcpg-XTBwE}&oko|^+5P;B_DK$y@r8n+TBMh;c&3PdJc_Ab>J{O;Jd1wTxV zyCkOk?qbdXSTC8+Yp|wOnDy-wvGO;o8pK%VK!NehYkpjVj(x~slz?kbU_eaf8c(zT z%-5Gp9j!#+9>VPFghoLOf?ZU=8t z^N^f?Xrik?$jD~_(^ct5kCXf?U*%;gTqmfy}0$uX%!$d^qqn4XKqi~%^?@^A#G$}E^A+PE3Dp!}7j*y| z;-`S^Ll6PjkQmvdGQiQGeIkO?@3C=33Y>Y!c<62iR2qG9WdD#vo3>_T0S;Ja7g5x` zw|H+QBscNZs>IJu$&uAu$oF0l;i0HWF0?3lNnn*AzXz`2g;FM)_#|FBfftb&LbQv1 z{DKG>8t^x5QZW0w{N5<2 z>AdEvI8FTW?JuB-L??;nM<=4!@+UbT>gfw|4KVQv*Eh)L9IZ(Oj)@HZVI|X7JRgxD zMD(R6sn?y~PmhY_B9-5RWnJg7`AI%^v?Vo<&6Lz-GeuU5MboQYCgVy|Jw*cV;v~FT z6;r5Tt{OO9s}pMk^07SVF*(1HTCeg)(rTongS3`B5GCq8e#egtzKMLe_vM1LDdAxi zN?seGE!0J3U%+ZUHbV3bWBG3>QhHO1_gIV1Q)jG{Sjs{x&Mfu=si5_yfu1e*XuYX5 zdLN*6=CjgAWC#z+J9?g4qo%0E)aW)v84rJ*LPe3Y<^2@=nNnL3ni5~j$8sMX%%3Da z85a5tMMNmV%w8kUMZtswj_G86~lzme<6;NLE1>;oMlx1h!E=BCcSCVpFP@q@+CNEW^k}^bv3%#A3u9TTUtRGlL97M8 z4st)#$mPIN=FMA>U2~ezTbdpGuA?saos7tfjjRzpWx43rYA(iK`&dgr5G)#yAWQrf zL|DsxQcu}lM(lkisa6#eNA$MRhXlVX_I&kzqVMpL>PXuW^w&&goJy1*;Re zkDkXLX_s&KQ}M}X9ehein|U>A_DKsZ-Ytq77rvP&wbXd42Nk#lz9-p}dKJ$`F{ zfNa>i%>l3Y>rXOQ1oCW1fppopEzQl_6_o&diS;?3!TAPB&NN1dtiXUbWTIOmQ?D&k zcb!aShs<$OhIh%?zPvhP`IUTEQj@8N#9Me~rha1$dctRZ*AAr_9PwLQ{l|8YbJ1_T zBNu1xFqVHVWXAq4pHT>b(p3IGCav9YTM?sa;@Bg#B$j7(Kk}K#oX4EX#CL+h+?>}U z^F&L)RUa6@1WIbmcLHYz^L81_3m_q}5Y@>aGLU^BIYqoie(&gmkd6aqqe@PS30+ps z<3f4St93|XvNIlD=G3Svm-kZS(R}VT?2sAsmO{v;vWt!zof z;l){I#yz6y5wy#+dfTI#S8?oqd|r5JTUA{-ffe@J=d961f$(>-iXmcXX$JW*T1zjL z1BTFm?orDAPq-9MihcH{8^sDoUHq9j1iIY}UmkEBwBMHEu5Tt~vw~|l^Y!)9<7r!@ zXYu}%AttPPORfs5x0!KwmOrC3%l>ZDDV?7GoG$W*XJrKng>IWeoH6mh6*yqIu#fa(|(bbXhm)LzN?9x=~fXLV4gpNTIPL3o% zOb?BT{k4J#8OvQM*zjk78!+{QB|ZWX1?*;HjO^&f1i%KAFKsj9S~6nLo});OuC zaB9M_8~@$~XrYcdWiu6Q+8o%t?6VGN$Si;$dw|Tf&vu7Q&Kun!gZ{IuL+#(5p6dI` z=v?WspZ2(eyFR&t+o2pj&q#InlsDb#xDTlAwtd^7y*tHOkT{8pA7;8;+&~h<*sCcE zaPKVZh;`UIlfylTvHIwFvvi0#fytkqPrw9+heP=-N|6(%hZ_J5ZV#GjUYisdov%T2 zjUwn%h~~<_rh*2VnIe|^ZZsnr4$B>u(`nup-2Bz&U-~H@VV^N&U+i(ds=VCQcSD;p z)j5~NgaPsDiGM+B{E(A6RbsU$2ZFK}l%qgYwAUK%EHwy?|Kw0NtxFE|kRbp1lo3XP zgVA6<(?eXip-1e`{7bhXHoSW35Pi7OYV_ynV?Hw2S{bV|V)1$>T+(4R+((vagrB#p z<0+2tm}ed(6hp6NpUX|rnIB_N?-doL&N`&Vm+B|spkDNIeWpenDQeZ)MnNj}*gudT zYu6@V@xLKICfD}}r;Gob3MY{t559gXpbFFC{uuvVUlyhL!Lsu?y}E)h=X2$7b`2J=e6X8Sf#tDISf$hopOj!Zale1se= zjEot0S3#Qn@j7&?q=Je4BBg(*l*A6o{L!=1*r-!J^mtY%#5P=oW+$tN@Ewl6$71hYd&wVEsREnp zfX_njI;htq(e02I`iwfy(_PP-i=OwZ|B{|J7d`J=N@Y>bbN^V+8>K30=Q*Y4F~0*5 zN5yj%Wjf%NaMZPG>`HH8>@WGOkMz(VM|C@O=*#~73x|G13rkyVpXynkn~Og8)PG5z zn~Odt!B)OdpOZ=bi}g87TeGagXmhA^qRh3R;}E&ZI^k$iY@?oU#zcP#nbNknu1VLU;F3r`!CSMPKC=uzwHK>B){+3 z_WugM{}xs2)S-XxH(xmPDKGu2^7}uJ9#%cm6Hu1?`U`=w9oGMUME;{xo=OkPe)WYz zzhcY3Dm{oY@SfW{lcD@m&1|_L^iIiL+{~AoA!ejTI?R2!++(}^Q#JQ`z5cvfm}lpOy`nsxFIw5} zej$imnB@;==ZPV2u-cDk$O(92L6ST#6zg8_00cq287y)H<;<}wg*&jHxuVo6#aiCg z;Kj%ARGhB96<1U-;qSG_^R3wSf}_!sV!IZ5u|S5v&w`@7GvfH^ZHDLDe$S^yr6fHe z;PgL4j3n&rf|$aze*#`!O~uQrsd#xc6)&%*;^oy;yu6x@C|fTi z-qc8ptFx<~T7|c1bU%1XSpkUtul2}qZ_%nT>IcHN+4fwe9A-F6648{e<$ba8iZ#5C zd>aRuLTu0D#M*n)EdkeF@6FK(bTg%O))#93;8Q+<{oRQT%a;;+2Lb59KBm;KaeCiC zspTL3Og=Ww&(;eOi4IEkg2C~ROO_93pT40+EupP9?2W8MR0X|X@RoE+>Y1*09d-T} z)Sy2)5WC-c4F$`z2w3ZkTWt-fO#uf2-#DdHCGk#SId|=ayp{3%9Dn#0fbwSPh4BuK z)?f7A%Kos}$A_!MoT?OjQ=7rx5Z=j&_nGa0m!!kk!H31)jUIu3=r8%&tV*`d@(P z4f)LkoH8YzuJH_^WA?d%KlO8_=})nnYKWlPSXg;982Q9_ps)}rmnA!Luj3*;TxOxM zfpB4o87`k~hVQzK*{H!7V3q{JC8jZ;gc(-WXe@*L8sGkUzZG4&(!kgR%z;WM}5h7ElUcOC&c&E~Cb2 z5R2`WKn9_eC8~9aZ1(1=sO|Q7C-GR47udbcihd8t0)I&=m(Suxv)7oO#|CH$Y%v*G zd)NjG$j5A%2bi}n{uT4Kirp>721)&6d!SupCGp`2P%i=XY;hb?8A>Efn_wi@%RAb=?00zX$l=OI((V*f_`)SYkZyx_%eg5A)~&eE%t5~drlXBL&k5KVJ~SUri$kdke-=0)?9bF{)f+&3OwK2#8r9a z%h={6VFMl{X8~4|INeG9qls zKIEehK*YIVb~w?wh=Tu(UEI&NjRD`bAx{Wxn#2iaIs-h}yq_b`i9U|tg9$bT!ix~J zANsBDV3ryI_1F39Kgv|87^X#hV;GH4t!I;VmlnFr32=~ORP4+oL^xXla&ONgDC?P` zd4#{i|D{<3TecuFBL5$;`>=W7w>F9(2(}bg9Sy$di zN8EL>8}W||-Kco=E>SxB2EwWAk3fKRq3`$MdJzZLabaGD}*F%zW}FFeaA&AUtfQ<(57M0RydjvdSJy0;MXZ)V4x^0`#J8Q4X{| zQX3zUX}ym3Als2x;bbh0W^ICgJco?R`-PFK2z-3fsLo;>-@)5TCq_5k}wZKCDohRW_;0(?#^3ihQofe*#Qrexrh^i{ z9{Ci=GwiozJ_~Ien&fZnzdubZrSMKiJGzE0N#R}Qr$uQYNY;M&bOjm}bX)w?gonUnLAR2C_d_`Xqlg)Gw$ zE7$gtci6^f`Br-r^xJJe_5^Y(HQ$?`1duP!V>Bj(p6^UGwg$~bo_N$~I;vONN zYN(NWKubGDEr8<8v2@$oVpjlhauZdq!G?x1mV^J#_Ic|fzHxD zaHK#Zu8@faLC3+E_S_eO~dx9zjX)yGCu*ZZ3?~ z1m^q5`$8_)=6aX&Pb5F#$Bykqo^p~N&Z0nk?x60VP&Zn*h|3&d{&Nuu2+NOkejM-< zV+~+GE@CY|R{9>4q1aVCtTi16!vArI&*2*uob9c+e{5Rt98O0S-C%8~erz`n8mpv_ zuIO#ZG+7_WBDxyGl`M1Dno8@sK=PcxG-e*S`PZRT4^hh#7v~rdOip^aBB%C8Ina(o4@ z7KQL7Ta0~P*9ld!ZZeOho&ivN6$oGIkKEoL2)r4*NrboOjeFLb`EQU{_zGqi^tQpS z*iiV@Vrk47*e3hEM^}+qg{)s3tR!g{Dz=;^&);YN9vh12nJB8;oldDlBAS1zJ~k?E zk$%!eoLO%Ipovwc_-oH}d?f|z3~nm3%7#T3nBns{gGwf3@*<8uovF&6tiG~=F7hGN z8lheIaraG3Ry9cpqgx=mgD51`7Q|YUQdJG>+l~uLu??>+UFQRgacWN;V*p= z%mE*5XX%|??AdQre!xq9&rzdN;^niN1=3_%mUC{!tXL&;A|Z@L6_Diw%K_#BfP$J7 zq!35jTv1dMCo*m}W7AIn1g1@>_f?~E1?>b_PZWDz3f`|LNp@`gk!w1NiTIj4ujv;F z6N-}QYh!R0j>Q9t5Im)inx5B7Kky%WGsfAS3YtO=6IpO-J;`dw7v)U%bVRfY{;1xm zF3IdKiEZOODP0E~N%5s?}<$jCX8yI>tQ6=}5e_B!0nl z@&-B&(74P#g62BlP%Ia6j$;N{MnrR2wqNoq`X#l+O)!PEcWo|DKQaHna9Bt*2C>F6 ze;ccrSQ}l9Zj>g^q0&QSeOYvqKitQ(S{(mza;JGV1o7A(KrI%QmEbQzZ~yIKwGV8F9w(ZBg+mTQUi6a7fWRUhOG z9^+avs5-55zhh8Qb(NXwH+ zj07wwE6tWHMlrwcJspmNCPDAC=e;UDcpmkFr$dkG{j1!rV1Ie@a82@6Ue5~e`Y+su`R)Yv0)4m zI*pGWG39z~ppI#C=6E>uh}_>exGCxxikh(y`r%LE714V1ogN`-Aq= z)w(F)I*bK1c3QQve1_^tfd28~36r3-5&p<5*Z92B4>{rIJI58dt3{>ezDCY__=yZ4 zQ7QN^Qs8Lmwf@kibeiJjvWB?$ReV~}o=4_*w2hc8s{TRy@>OUN5{X*lX?$KV6Ps(S zy3v&3n1sxLnBqK51htncVqRZ_U$NuvWm6Xb+h`34x!eGiSzQa%*dUi=mYV+XOQa7 zZ_)ONdEWZ=EPwt6!d&L49yLiMFf|DE3jq)qXYoY;^Km0hl76JW2VE-i^&w>iNyLnm zko>)6Je*P$7nxU8{)@6sGR6iA&B*kQ#;F}68Al+$RYow>%-`-M+y?6(b|8$^hwY~# zdMu2Zp~#5zaFm>hOlO?&ci)nCd4)IaZ|k>WMC}m#MecRgj$#z{wUmQ1g6)`{u|LG; zpKx!LO)nwOmkS-0~0{niI&giWc)7&$*HD)6+s1XAiW ztl$aREfs{ z4SxUFD1OE)qfqBBx%@Y6oxX5!_PX<_po+xHuK)gD$x?RA4b-!9s6xbx)P#UFRYy&Y zOm-QXrm94)#-men%BiK{qu0l?^v5rtZPv%VexugM27ORp;se$4foFbw>iQV_!x|tV zw&AH+a7y_Ybz(h;*v7C>Bikog_LKz-N>&1mQ*&H)`PT_cgUAyl3)_S02XOH42|hk; z%_Rbd;TjI%qY4gvc&6bnLiHg*&l+D4?Qna~dJ zd{vC+A2}$q`^{7R7)~jAd-Sc_kfoyUMEdUmwDc!igXT)zpA(;{{@lwm-Jd6ag+V0I zof^g4;iY3`<&|k)61yPHw*K1IN&e5N*QWiB#9u>hezMcr5ZdB8Wc+#XxlUm^g=|jr z=GL^%NmDjf4f(^BdD1J> z%DkEK@R(cqt2#GJszsj0QbsL)r3e1VkMrdF@lKz{wYWYo&yh1T2NAoM)ofla4GRfx z07dd(P@0$0p;C(J-JQoDmLXC$Ov>hYS^E!^iUT;r?#ml1h5n|>yh56nf8M4d_3QkQ zFi4(Cx8t(I5@!}{=Hc+9FIXDk*M@jkD-@yX8hUrXn`_xD`@H9XZx8%3i& zpzqy>YyW&)a?D;n8OMiQ$1&nbiymRP(P=cFBp#tV?@TZDPvku$Jyy(l_=Ozj z1n9GT7ll-my`jHzmCm-mKSt%jUgv{6uJZ+?I&+p3#gPXIN0C4LPP*)(JzSs#(7a07x{uaZ(Ri~ zN&d!Mdx>tWpiUITzu9l!zp67Vd@U^=+XesYE)tgI+j_e0w!WFA%=nW13ZsY!+f`Nf09N1r%}*7itz)i`kDjTz zpg(K!+4y(`ezeaTNC-IP3mMKA#9o?}gpYkw*YE7%JGZ5L=g(Xh)amc+{u!*mQdN8u z4ig4M)K4r`M3q8`dle$wWY&K?afa#IWN!c5#LFon`f^h&Yy$u;58pM(c`J!dQ-(BCk5X~~P& zGy0js=kTX#T=5B9-g`Kq$q^){p^*|ViCt8Kgi|LrQrm8#2ZXD z{R@qU(~%?MZ*Yj?+XC~gj=s-!N91cL=wMn_17pFo?0w<-;77G8j@(?8<_#CQz2VbE zvkSY4`;BwKpdG$&R`@D!xa1`L)%OFv;aP-+YBwUX{PKBr8V|K{QAE(N$O4)zvc3rk zmYk$H_`%&6M#Q|0s+*KSco1>GTCxCzv$uLYOFRTV5i>J)<2?7DUK2KD_?VqBi%W&2 z2hd0tok`?0`r)&(yfh$B!XE5s?%1CK)?w^MDrWdW`=D^EWn&`K0BNFc#Y~g|zhy`J z07^P~|Jj^DzzOb-`gz7T>gRcl9Yu`3QW|2*`ui#p2qcQEnf5bg!yzqUuMbN2&qX+1ly z08{7ty2(I(%&Sb&Z-`Cbu9Y`JC)`V0gbU+jC4opdq3w)eL&_K)0syJ%8T2Q?2m}s^ zgSXmLoFoa)J4WS0RDft+aPu1*uISYBR&XHw$A#x&w3$Hud-i}IB6C6w?jq~rJiq6i z;EiEOh>$9q%<%YnZx};**j*pKa@;8REL-f5qXe5}fJk!go1X z#^qr2;qVonE0=s!WDS?rX}R<_-9{_$vUX7+_IB#%)O>cmn2NkvVwoKOgM{{>?S_6C zyjTSMk~Z%%_W5IHJ90Y^zCZ|wu~dd8566UaFt`NT_Om%2c4H-a4W5SPzI$^fWEfak*Tbp0={%)^{%^A7kAF)GCsz*wgo1kQSaX9G4*3f3JTp9pgBb z-(5cdaJUJLV|yWpv^{1oreeUlfOex2(Sz|Z;-M+{#nw?tztJ0}vN_w^htwi=X~f;= zJHG`t{P3U}$&fpS{VMQk9WL0c_eJ1z>jb%)m+f!n-PrJXHKF4j)>h*0g^s!k3Ab4! zyNqot)f4S_$z*-4Y+}AvNnj!$en;*#;T)f5OK`lDx zAix_s;_~ITY787w7)ZYKBLVfR3IT^ez@Nf7o}IzU1pKYBzVITze}urbWcJB#@k}0N zESIn^V)@RIPTvN+%qIk@m3h?+B;Y}3BN8CJc0hZZ&w5rpqK5FhHkuRYD4c1i7ZXrE znt*bnvGTi2Dn4rwP?n8$4P_rGWln{2Fz>do{&;aDZ$+`^Bct+n%n9PhGCVfO;X8k* z5qRP^D+y-3;jaMB{r?D@+Y~rQAw2%6@PwMJeU_aBro8#OD=*7GmR~@`r)^1G}!T8&;2*$|xDjA@C88zd=kzmYm;rRUbv~cu%rbXjT zR0~*_N590>2R}=Djq&!bPi^nLHl8`QL_re3R10U z@^AqJ&k6t7hW?zQ_wcidj77Z= zWFX|4>_;AvFX{*K(V_aI!&5%0iC+b;Qr~sxkq@4g`avcb`{%FIS6oD8445o6O{$Sy zq`pI`d;~(5DZ4>xJ0s&s^mNdVe~hC|g)5;$y%x`M;d$vc$BWtf0uQEeBwcP$4&_^@rQkPiUc%(#3#tm8a zNUnLWw3)ChRC_^nCsL()tSV=#*I&>hsZ!%o<)7}9W?#_btx}^`#pUc%2~5yUK&5!5 z`0@&wpUYNhb!mPf`fy$i z58Gg_`R>=QIwb#_;YB&J7hfgDGh_9lZ2Yy2s#nkyeBlhH!1)1ADHQr5^E)R;+!bCN zJALQdO27HO7suMlZOnlMov{L?=PCW>sM2qaqTirl62;rmFjHT8f|o>}*~Z5lHS_s! zj%shI^C&aKD9|437NeL&2h4sV;^}93eelKY69z`!Ln6#3vuA; z(d1dzhtoWbOClvjKr+(*FEvo_ewXGi zIP5>RCxCxZJ_ZC^qK~nzt+%s@{SiBlLF8`;S3V}pi}#FCISxRW;m4pYey);j^TM?7 zq%85Q$+kAI0^ezlyCf^q8c}Hjv>hGH5OyvcoYANLa8}Fp?y1KCR6+(sW)F_ zXJJ8|sNnkCkE0j%tj6LQf>wAS$i`|Rs^1l&zQ_j0ndD&CYT;+4w({Ez zpu3>Fo+dLaTN~!97oGA=qE0;Oi|t zQ-S)?d0L!*N_}xPDU6P$tDyDyhe2xuU;w@#*Ks4(*^xG4p?{uLHkPGoo(v`nx|HS> zpc3EsgpEoe+_CWDd@z_sFK&-E(d%yW(5g$jbbY*irqlHt-Sx3uy8dIDm2u^ytRBbm zf*PZYR|b(26*p|PO`>SyA{2z^yP~tz2#Gw{g+%_HfaZ*`h9CPY4|Vajly&I3IPqe& z@?J-BR(;}0IhUFF96<HwMHu#-WLDg+tpx(+oeZ z>AG(hx@Ivrh@j-7HwnbdaX03aeuQI-up$pG6SunXwQdxET(gg)B`QQV+*vNv_B9*< zO1zO-0OvVrSXS(VYH$SeS$CG3;VVp5@gQu6*`)d)%@>8M^*lKn8owsXYt_hYxX^vm zEr2{%j_&Xk<;YhEEscqeWD;%xc6QlzA+9lp9ummmf{w0WnQ+xzkiMfwr>=**o+*W8 z2mF!iW_z2anDS}AbzOq-I3=6?g%#3M`G?6U;I+=McKEGZb8!3ca#)LO2OQt9npjf?tkEaDRuRx%RzdCX z-+!-0jKv&qSmjyPv#J2coL+!fc`ZgtT%MLi1n;br_R+UJE%zL!jQ|7Qd$A%_g&g~y zmJ3vu^nou<0=$6%{g1lP z8pe2N-mYgk$$i(c~;*UJ5u|cfx5LpLO>3BO#mQb7NKj7o0e1hMsYaH>J@Q6S+KcjlAJ>5oF2{_ z;EN1uD1!gWg&rmTyv#%A#n-pU(h__F%sGSb5vX%xaJAZK*5|3e=lx@Crn?ep0zyQkkl_WCMsjp33p-jU(JhoG?H#AKQ(hKJ>JGBk zR3Yu~&(GA5;{_0I0c6z(`kd5o;(nC=@SyGC|3TcDz(-YGkADJ*CK7x>P=lZbjY^a% zsh~^&$;brW-~>@bvAE!dP+PS+BXNV!WFW8OASzO;wc1*(cC)q>F)CyM0;tF$i{gSP z`i7_=RuVwT|9kFzZ)OrQ3by_I`FzOCymyy#&%I~8=bn3RNih18d_No3B$@U1*=W_5 z#X=9VD30>34UH@27-!QD9sGTpK9O4Q?a;BJPONg&3EF!Fuh4NuCEB&S!{bo<9ev?{nKX~pEc#bzBJzRJW z)$lO+aSvZj6jmr!b{jLJrFVHt%R|Qnqt}gzmX`ah-c^;Q<*bG_K3`3#IZ$Xl7HsKV z5a@`aq%5&lzb0HN45L|0Bd!!tX)7=Og-DUGqgFd4`UT~K)^%f=?n&9dg@al<*&Qh` zg=zF4DZTfW%<$pK6=0ruZeH5*nX9}vXA*-Tv09p+5UI|UmAc756a}@`X;_-Qlh~4I z?lL)ERc9A?eVO4Y(Q}!b3&;4Zz5Bb@?)UBqol6V&*Ag4z`}sEsZIxU3{EkcRejiiX zRhA0=%~0m>XpdibH~0WiZf}tD4bel1qz67CEbHR#sJ){yjYu~kLK0n*3OK0tfeL)y z;XIdkR>|JeT*@ZaSO7LzOss9R<@?c=>-%hE7j9H66!Aol@_E^C*-QmFECks5`(x#V z5%9LHM1bp`sU%>ptXghFB*;p&sM-_vlrK8Gq%1liU+^TpVeN(_?56g-*nmn1YeVQV z-RBQnJ-w|T*y-2bC#BBXP+#eCZPoJdFlmNHlq^n}Z-j6K-Fq~7Ip!Yvxc(iNeJs@< z)uYj)nqC3w7h#{_C-fx_kIzGPDM%IA&iE}n9pP^g}kyA$BFis=M$g# z6VxL~G6u|P!Z#Ja*{$gN3+Q`=QMw1rtWqloexquw3jJKr@+Nmz1`YqJQL)T@09yt~AhyVO@H16*m8?!!Ra=nOEWB1hl;K*h>^t>G1n6eDdTt^THTa2S`x zFL}c(kO~)8e!gPmR%T%=(~4!*33`{ZPxM^$Z0{FF)kPFV#Px$vo6eB_{niHQzp|Mf zh<$#ebbW$Ell8vjdIP8P*GsF`fM(Y5kQsvwqbgH%9TCer8k@*p)WvGiGkVMXMcDzb zmF>e7OMSW6>Py3)sr6S}8(#>Qg}z@&wb?m=rrhNPeo&V$ru}g;4gLLUF5Yhx4k|z8 ztzQ-98(cv<7Ayq?2Kjp=JU6X~hDLiEL>NkYCrW#RWTI80`SvfJM)BdxGaAiTUVFdw zymqWaT4YestmpcuM#Yt)W?zj%Ecx+j{X8heVmISb*%2M^53%g6h?EUR3*la067l-e z!raoT&%&=o9~8i%k!$%Yfh@Th1Zq}sc@kwG6l@@1?&qcl1%HMQrKH@v289ka=E#83 zUm7r^wf@3o8n<`%etF9$QPr6;G?d;Wn`PMG(aiejAlVVFx(a)vqC7Vv^iO_H`&;xu z0WKOT?$3l>X^X$n>^s-aM^Wv+;k?zV*q#K!j63xlUOR14>pLd67>$;$(0&p7Y zjW|mww4N5#X-!24W!Cj$6g8n&X(i;yRQN<2QELqdpD##4DD9;ZLNSf%rRfmC^RgBd zRggkmyu8xopimz%D*kZ0Xe`ozP>mUN%7QZ~>lL?be+T9g85kWwxB6IXz5{)U)TIG= z!LnxJ)autT#G5gaMg9*VInATu=<{=iCHji;{CVFG9Vy^vTbYIS@&=8J>?j_&=+G_G zWGz0b%2}_7S>dt=&fMpPh@r?Wv>&8SG@@UUCjdP>&x#4TJK;#0pG1ega;!A=ija!7 z1LUZ}Miwi6AVu##hu*(%={=_DeF(>Lzw%W~&-H{?`Ie4^yd!e~!>BqlOK9wQ0ga9A znNd|<65}dJAhxL`fot%mL+CJ1N}=m~8Ztw2%es#;o8hqy@67UGU zFBN)+$UWf~{DTYb{)aavF*DZKIq#x9SMDt_X8tpi z0mLpZ(Rn#c>pi>c`;Z`hwp z^7gKeb*MwOc$aIUj|xWxc3H8Uv+k6H`*#Z71A+U3cU-s+-w*C_?`gO%J`lLKAP-#r za6s@QEgVnxqmRotVoyFK<6xC%*-f>wy0dccDuy^^!IGy!yzADZs*GMu$huly*|Pyt zlaEtM)1`fzdM>rKh>k}7&3AvS@Gu|IO|#zc$bx=!nLM+e+`$I~Ez2MneNr%ro^cQ1 zPV>n98R{=*rAUt8*bjs{6h;rh?L2#129phUwYtm92w%=Jy3g7V-GCRFicjuE@pgOR9mw_+IXnWPJ9>MZ)QvaY_%eVI#X(hOoBfAz^LL ztLHIiOTsb9uAm~AmsbuV)s)1SqRME_%NZG7BG$AOsKhJX4^8P_7*`5U^dlYf?SCyi z5eCOM#SQ~jgQii%Apxd^Mupv$xMm~So!+;PSCC3;!bqKBZUd?{;lz2NA32=Z6i!Un zux)WAqX0?Q7F|o*rnEv+@)iXVRY>tuwsVY2A5?n%2qk+WV#Ug3YEz z&{9j?VW-#1*+FZYEJ-}uSG>(=9z)(IADt(Ug2*N!p5lX?&zmXIs2m9KFaC{tr?FIA z2(9rc{7?!{f?l+~0OY5oKrWalkY$n2m%HqzUzQ1xoH*bFdAb;^lnZJK+}ZEb7KcZx zp*a;a67`;MJGJ34)o=pOj!Ggs!DHf=$rAQuc$eKaEn~TN89IZK9Y8uGU*R~$lz8l1 z)r4A)5+|m#L>DUPxzUdPT%lPOECuxXLr)|N52E@wYD*e|prvGy7J%_7yB+6v{8WHY z88n(^aTAX0Bl$=iPk^ejMomdjszaxO(X&BUu9%dENL*3@zGVCqaq$s&M`M02XR#<* z!c&P674HR+?mRVPItYffU&5hmixcC-mz!*<12TBedgeBf`BjBa^Rt~ES~XYvwajd* zSHGY7Ng%pVjWsq?)Cb&ef2V}}lV%6$&B;?aNc=3;gCUEmxEc0CeP@~LOQF%i)D%*fG8w@#njg8gYX-fryx-f6?}@( z9rORy6Z0?eh}~O{oVee+&8WIrwXS?TYF%~Yml8iuveG&>{HP=@gf&&mgNA<@d31hB ziN#F`ud}PP>_()nKVm!UsS)mbvT%nQTn1YU2E$CkXsggO066TX@t&w zR=>GE2g@i!MD&d;*LOau{Zz<5VQ#hFDk~JG5FC6_VPB)_l?>!jRpDO*5iIL5e%4Gm z@3BeRF72hNqDGnGODXHMG~*+s49H_aw`QN@dXYZ4_n&$V!m-lL|iD1g7lzsW2t|LO5ez&HnGDTG0B7Dj%2q zgGqBZ``b$ch90mybwd%^o?wJ^ZdQswCyI8#;pjYATgkYRNidkNXhzTD&Fv zy~%kRmC~cEMSJ!0j#y)AWU;tnLyhes`qVNn8LYH}3KE?-rrp%WKVqv+ zkRo_v9>W;nK!nRLabc=JmP4_hU9WlX7VoW@;eOUS?*qclIZqjTX%1f&_T^9OYT~w+ z@PC<#KR4E^YuL4`U(S2rf5#K;_}?>^;ZG0uGGozY#?YR3)lX4($Vb31&A;dtz4o@7vwTGI$@v|qUz z$djF8^LgLCs}~uH;QgKqlUvZ~kwEF>cu|EMK;*IDkJ$g#(Dg(@6PDk^Stc?;Zqn{l zqqKpuYKmXjW2L8}hVs+xU(cfdHht2ackQ${lW3A*R|&A53Gts$JjGw7cHIS2&iVAj zZ}zd}XjNz^kgNrg$}Jh8KK46TvG&nhuyj>(!6F83)+gGxyU={oy8x;CYje66{wT{W z&lx0<)3lKo=K#iOLn|+jB0_$ zM$2f23-4O)9gYp?Y}Wj9?)sDME~j^sUD;-i_2Q3j8OAY%W7y!46T?#)Ju4m_Y!(qn z_i?A&@04S^Gd}lhoJ$3@zeA`*GOx*^%)9GOszFM57Jhx@tFNl8F0y{inz28AEI-50uLI_(z?+|OOwp+;8M8vOBEA8VS7dMsM;Bn&;IVo5m zYYMK?oBw@fX>s_83FC~V{J{XbR*np=XOqHa7YNcF+USe(0=egJ@<0|0Owd z2`#OiaJjUxfm5;3P(Ig^+eT>LoIYzaP*u03y1=W&bp;CwJl3H7w=4K?aK?oW8A!oBP+ zQ{>EELLRyNW@>`pgo1YSeZj(JMRXPBGQ#XPH@YJ=g@ZX48QA8-DR#uivDaSeH+n$e4s*j<%-&Q6dlFbhBn73I_kC%k?GR zSEv8c%xFkym1~IWxOftVQMcz%$v&i;ZmMwRx0keLH8j1Ze}6ap$J#b3N5?$0g!84B zkyG@81il#eUVG|oM51z_k^@Z-l|U0p2x$IlpVuJ#!hNjHliDK_<)al+o&~3lKnnf# zlJcpKlWRfn+&Hp?h2u%iM`dG4{FJ4#b}Qrs*I$;zXYt$7FO*>7yyq-A%^UrdoZ~g- z-z$-sB>FiVgP~|uWy_FhnX-9Jqn`LnpgM)2Ifko_a?vC|h_dbFoM|^>cVmJ> z`na4V#gj61^6Zs>!{inu^$9n>oH`>d!lJ-_ip1Eqow03OE1gdE9&HSyFicQa*k^!`7aY| zUq4LBhc@W}IpF?QcU6(->VgC?d#+Oha=^VJQR0k5iHIJM1MZMSiLR7LmCzdA7bYlp zM*%OeBK)@7p)&R8QgyVP^(+g}UUZIv^L-7cPxs-#xe=H&N}jpeMcRdJ;GCZ*F)LBx zU0uR~b8e!Qcem#BJ94hv9Eomf(1FDcv}LW8nmZ$vkquO6U`n@vq{`5 zeNF6*k+fBF3;0$8fR5);!%qNFY~Tl~C41df4m?m4c|r;(t5f`cs#KM5mIA}xHW#bpLKcap_0;;li`9;t4swO)V>cCu z$dD$5kh6(OVP*BvIRnOd!aKDk0VTPvB2dfx5~WimHkx7tqf~})OlnQ$CIFGoP?0(0 zt-)!~Yhj9g7-I%kzRH%&&};m?F?<=u)T6Gvzzv^&p;|WQ*zXTX7X27BzjZA!%a_qB zh%V>58?$`Ah}3aNILuI5Xr)}LywJQ`WRusiAe3ic32~*NIT!{vB z5m`@($W3P!*edwJm{I4$@?fnd4$C|O8uB^S{aL81JxqxYBk~X7%wxyPn+##k!^cO5 zEB0K?i@?hX!zFe@U-4K$022AB+#w<+M2%i7xSGyp06u;D?2FLfGM3tB$R|GMKMs~W zm4qSbMHMXC!(n6gCR+l{pYk_FpO#<9m;$sMtyizo2?bGy``Qx$*PcLI0dM2<;r8mW z@@?sKGPB~ItGq$6dWrT@fK@JLOFNNCQyuwMemZAi+ns;RzJ`o4e2x7_h8Y*1;iNhC z-mh5w4xo%hL724Eis~hfDlLQynGpNMA1Szu*>WaQbrE_rdfs>hiz8KrUxu7fKwD$S z%feST(#swyjwIaZP0{vbnMDXjI~&&lc7mEAMar_6hOm?P~Oh0mzdgT!BGrVxHMplCNg3v7|sgmzMPP z*gp?YOFZLdH1n+h3Aln*zqg_TZ#m96mp6qk?zy~y-5FKo;=XM!5fEmQF8~Fj{Zc?w z;C)8imJovXy1dY_$t7OKW#o!D#P=^R!(0qp>d9!DN!p?Xf-4yGhO2}@3&vstpS>Er zKn&|a35a_Y@e=M0*vhL-#LZj&Xv8M+WfR5;3GG2tcHucf=l%&5nii5gk(dpTh zXJmx8+j}0z&q|SPxbUPgIY(!D-wiK`-vnb{)SpMe*uW`&EcC?x($;y>hJK=1fn)VD z2p*BL3K*n=-FQae!wO3QVqNXb$8t||IL;KU!AT%cBq zD2J?5B^qRrk{c|VRo@%W^OQAexfZRHd{eJ=O9AK!UdzK5QH;kChgU2}Xx!%e4rkh_c_mgv?}}e|+iF zox;aSxGj2;+uB@OlWNh-{HG-@qVn#1kL+V?w~t}3n+-XQJLj?|IZY6sfnG63jyD!4 zEGc}kPi+?kcegHTi>jAhR7KXYgcC?{Mgor1NC=0|$^{MuEW=tnK@Y_p+JGx@2u1z* zjK}W5P=IO>GwLdS$Yi(W_y)RBm~|>||dkbiQSP=CAOCaIjMoc^}xfA(|oB$`_&JN;n#ePs(AiMlU1ZJMVlvjRr_<>lC-Tp3M_!Obwj!7vg%w|A@wXWDhA^l5J&m z=ZiYtt@)dvU?HfW^P!swB$yEY)A&>yWybCdflT^6cUjZSIWu+-6Ra8|8k(Ns5KipK zSK+SDntOno6T30R0f+?E4Qnlo;!G7jK7w@`SfOiTEN=nsC*k7(AFiAR%T z!!x|^PVW~TIzhd;RQ?XUgukJaaCx%#BaV6U4~akCp32N9QLea&nos+mtajlqvC<4- zF|Ph$|C#4avy;Cck>B?ve!Kj~Ne3^g4m$4@eNkzQh{#KR6a=jGKI?TeI=n#ke{zH) zMb1LpYum=Up7P1;z*C_ zFYL~)e_^S2pE3J7x~igC<#)2UYtYr7E>RpM7N$zEpt(6qWWp4*$B;F}y%Tg@(Qw!bh zAAC#xUAK~%e}YMT91|;t@zq&+`i=g`^bQK21P;G3R*y1J=8~3M>E|vvQlp*uK@nyN90V z*0q8F?8b#5N7hEwK)|Ma(>(l{rqzqDK@!X?9p2p&uV8kZ`9C5qC$^1ZHmM8H1kKfZ z$WW!SZipUY--_3nz~*S@_)MYE#QL(9#n(d;iQfXIX$>|}LySlsJqM#V0267*h$FbF z;_f^T`TL`iTOd1pA>f6}1VifXCoyJ5Q$yu2E|o9Q5ybe9%nNgW%Lq;nj0B%Gc{2Mj z&urT>P%D(#*bpS9y*yjSC;1FY3k3H@H$a565g9F|Nn9H*kM8kc5$@Is-7!}$Gb0~uWU zb7%kfNKmGx&4?@oMG6s>COAIxvfnB4(=%g4&S7Nk>=5+BFO9Nm&eSM7jwb=aM~G2+ zH{Q)bgG`ai(BK_pL|Vb6tkcLY!ESOfgvLq|XCjN;uGXvfdLbB*W&F}zwfsN( z`{+W}0r!Vh#}DC$qPO?>65s6p`kDNyrnKz;XVn#7;1Sj_^zVF0RW6nN7tOlQeP7Y> z`>WjdV>)>6$gjT9tbcS%$S;`YANXZnvn%@3zh_6YewBDNF(Jnu;2C|(-+}k?w<9_B z>|{rd_0=K^{%AK5Fe|J?%dt6V!nyV*Ji|qii#)bB@xAHSNq>^n9AEZv3jIR!`Jbfx z7W?^+m$4R5(leKq^vGz;x~RW4i|8i1{eHRF2x?YdEMb}0->?CP@s}YiznHuOjQmeW ziz`x8CDCm#D%#vvRAS6;EvX*5B=17m(1V<4dXd{GEzrfuHvCYYqM78O(YTAH*{d6Sbv`Sc1$@MgvFk z2|62xcrl$+(y~;J*8BeENfHZz&1+P>!)PU0VYGix5^+5Ve=mbi7nF*@TNdq<;E&M} z1wpSTe3;)mnsiZ16fKQL;C?CM`AjowV01dK?3z9!NHzTfzY!bi?gq67^wF?Yl;0!=Y9Air64z!45xER5V}&(GTbhQF~~4}CgE?o|@4Gh6Y4@X_#|o3|4_2PG+F zIQz58R|aVI!FxJ4yioU=ky<#kmKRTU^rD6r_jL5)cTeXUk(*@B z_U}7X6(1+$lb8>QH?ZoT?rlUQE>*Pl)ZTpxKA0ni#r3*Xg~LkfF~J4BjA!v!zO8ZPPIYR~*auwAE^?HcJj%3ZAWGq$`W-*X5*(~Q1*_~R5V zUBOF2)l?&NV*8{KVb`@h$DDkVY%FHwvP@b60M&V@R_L`{WGdZ5t?{$Ki>x!~arbCN zkKR#=9)F%g*RigDo~P(>N|{TK=atIdn3VrQmp@ULzg3sNQH{wDzp$SB3Aw2klXo@TzTvOY)xo>x?9_`ca#D(FC_ZEq}9Ji*0O z{Ka=u_uHWLZ1e!pYs9sfZNI%uu)#Nm^w0YW#qJGd24g0^Z%J1*m{Ha|0~FAEY~WRN zsx|lF^sMtAJe|{~yEo%8M-<6caEalX$}ZqNCp&iGG9ie5n+BMh>@d05dj6)EUh)-gfCPHb?Yx{cs8Q zd1`;FbNxACFiItpEf3gKPYE;0D!M>y*3KoygG*zfvoh^V)c}VV$YFrWaxux9;YUz~ zhk~TwK=UAH7c2gYOf%Nwbu}w}R#a~3Yec3|(2RC3CC9Y&fe)vMdEzLfsmNMYWAitq zk=lUaUuiVhuhrvz7R^) zgPOo0?R%3j$HfET>UGMc?OtQvFvl-PF}Hvz>peeizg+u~&sy28=9?axS(zBKTp$Av zs9c_@(v06BNcEm+R29pRb5=MsJPv$sQE0psC1Ja-@^vCyTJ1~;g-Ie{D|P&&7ma-? zxwsqS*D>c>uVd$80$jnDirMgz{@g6Zo{sdS6+;%`bE0_CnMeZ%ZKe( zzZ;04{&vdHe+!_}e=l7>K1cQc$3%TAwLVJkf&%bT`LUpCNBoy+p_I@}*HNXawVV8^ zwYT(W9?`8`nrLk>tqIbeX@j&J>H_;D*fvNzjneiJ6r|N|y49Y#)ocx8scyA%qSdYE zh_?cIZY&Y#Jn=KYkj$$NH2E40kj<=h4!bg2FNO<*@?34m)V#kzi~(HKlfmcHTnUu* z7+)AAr>U0MPn0Pe*rV~$o+OPc@>KjTmCmvGxd8xH@ z|C`DXc%~K>=7~ock&ggONU(CtH@;nLGn1Fa>~b+Y_u@Q9zSK(z*~I$2D!RROoB~#Y z@qCM*9FILQ=%8@BDgm+tk8ERQ-M0P$h11t1fJftUKNKp&Mn&8jRr6>-xtSFnHAab0 z`H8P`Wv9|A9IbEcdlHpy_De-pEBd4`q0AD-w>2BdJXd=fGR~=b1{d3NtkcWTZD-cZl5E@LvD-uB& zB}RCylJ}x)-#`&HeQkB$@Q3Z~8~h!ytUuDKb9so|-pwvBM-q;`K!}rVHI+7fqq{b6 zxG#|D6t6^1z1exJyB_p1X!a=!ND*9kntk~wX9+BBzXWc5lO+H}y(TAwzH+CSM>ci3J4YUV()#|^?)sjX3ZpkKsGJT08pGM`qHSMI}eZH zA;Q$%!v8Uk)h_r2d~tWdw|@PwY~ibT74iAa0Uo?T5|ML%h3wz!$#VQ;(L-gABz%oC z^IA5CNu|Xa`QU2~B3UcggV%DN3kYz?tv91ba0Dp41FcK0r}nJ7!J2> zpUt)un}Z{UIb66WB{{BXo6)S#dtCtC`#?*0gxw8GU(`C7y6kwwvih&N0Or|Gv0vnb zFf54`fu*3jlXhKiQib}drQ_t&U5NXea@*~HzRy0@!jY=U@L%me%!Qzznl#5<5BfqH zqGUc%EC)8BxQ_kxj)z<0bN52g4j$33g+skevoaUOt!f#_q|Z=2iO;~%lEUoIHdKDt z37zii5Sb|YbCYXmni)OHwDQcHjS9!O3vs{X+f`z$v2T40%z%|08#?-&Vqt+ShLfB% zurQYnSP1d=)MBjSmkjN4<;B}1g_te-&s*Gi5;!B*uyUI|Oxov!LRN{~gfHlI;f&`G zv?aDL7g}ymt<8}5&hm?>u`?5nKhywg#eQ(33HjAcE= zBUQBRZIg_z_4>Rv^d!4kb8E$WIJZ7~RXER#j>g-1eqQJ(#}CJqEaV3SY0i4UBgy;x z@Mgh=+;n^9A?BF~@|=2=M^N#{6#0|#RpI?$f47f^6PmCO6=7^`Us{@-ae4eltnB3a zQ|~_!<*n0#m~c1gAhDVA8JSk^sg8gLR8n+mERYBx)5 zy0X=f?_3cm+L^;1NMX=LV5wY81^W9NOS5f%T%Yx_C@<^)d^+B=^chPBi0;%IPtYjh z0B{`q0uH$gP$RQ41QdXxYq`A|g_3Q1fvbd<|E5jFNd%ffG7`IZDUeW*0~3-8-`cK* zW&cDY!)GnF4ROSz_KAM`{o%Vxfsh8ii}r`F&yo(|TOkq_!xH#z!p+$ZzV`FaeU_-O z57xT#$2I2!N9cSIL2HSd4?X$v!b?y=@mn;I`yq#v3vI$CpZq zFV=LqO0cgetxeCr=!bwCRlr@n^fXViV`CyF6G8R@9J|Z0$3-2j>Sbv#Y z_-p;;UwT^Q)o*xWuRc>&Nv#}DT;b`1N?UW8p2s!A0Uga-}HmU`hyZR$vfMbO%3KPkmOx;7s}btG2(@MQaKEf6(-{ zw?~rR799n>t>}`L-i)pXNpGJY@xQ0HJNgMK)6m=H>`vI(ze`7NA0q3&i{4(QOo#M# zxGV#xx;?$gk?8}Xx4+LwPj7`C)7w_*vkko|a`;wyi}yHadRxy45K)B>fXos!XdG_hRH1sCE>5k-C zPx?F{dfQ9{`$6iD--q6M9)8gDcF1482ff`_B=nX8xhZ<9Mx+hXOH-|xm6x90ekR4+(c9yy{I}BESxU(Kf1$UR4olM8^jzremlcKmrbGQvf;~E-w`YhLJ|KF#dFnya+xM~8o;mEG z>1`etl^(SI*yrS={#aZ)2^DgZReD%l4)!HoM98Z-T@~GZyS-M37-(m&jhA}u^hwuV z`wGj(wb%Nqa^FgCOO+vXfb{m?wb#x&G)Zqp4)k`+zWWf>9r{PEY~|I#_(#sk`rp&r zisQb8-u^lgdK>>hI(jQRZM>P$y(5h?EY zM`~5MZ>6`3m5}-G&>N>-lKwqs%fok3nX&K#eABOU-91|h+f`yOZlxn3+l)`2mW7kS zVJXfw1&oDkv*BXe%tLJ7dkS~RTReiw5Vqxqb`26q(t&qyNFTij^DL5rz3H>oPpWHS zgKw>hmG{+s1kcMX^woWx&tcAddo<^lIbrCl+sE&{gOr<@8xc9$T=#K4M=43bIe$|S z7gowzrW&WHG1EtjoSG$LaiqA=+1IjPH^Yc0qP`@Ury9r6~vPBzS3%oQxbJNABuW zRx-{v-oWUn)>rm|z+!ZaEfVf#8C|)(>KHL9Na8^N|>pGtCsdhuN&!5@e ziF_otS+dzCnbmyOy3{pNw^c2Xx^MIf={K7b?zqddi`Q_p;&tYn^%0dN^i6(A^-dNv z>qb^c|LUc_x~=(Yz2p`eFRak(WoJ&@#05UlpA#2XxNJ+Pweh*V1+N)vW1?Cc`ko)P zEUsmmCQHQHPi0xin#iva*R!mMzOpn3Tez(VKF#7NNiL28+c!lo4xHJlSzAO%QU%~6=&f)+XR+;^fPcIHOPSoPa@5JIboyFm}@l%}4>}s-dZw9)MfLI>K z_wD+5$7k)g9$sRv)!vQJYkDr-dbo%<57Jf(xvsX>!zPKQ=LlUs6D(9I;o^0B23^Ra z*qvP?Ey!AS=J}hriFE#wK!wygRigtV#sbT1o#p`s1p|mCe1^IRZ@fK`^Nhl^-UbF?!u|2a26Z7JZ-i9q{@-rWMd}Tn?hA==&ZEWdU9@oleX6f9`K zI)wX1HiVP&$8Mmi>C9iZwAE%210vN{EAZTE&iv)1t#&g9_>%MIR&(aB@x*jMUP`>K zo(aElC;(0iWp@6+$s*e9htVu#{^lq{L-ley{)?< z-TWP;=rcKg4!t>3I2L7dk~Q|Ql&M4bY5C^TU+TLg_iR6(GS;^IbK>#Ne0El&?0_Ek z=b!zhPKW&SbVRRENNz{-x%#+t)kYF)CebjP)tM9WO7b3E>Ab7=PDW|CzvAx8;3it?e0R5+0||M=zjAV4|Tv# zg?*6x zOJw=bO#9n_9JFS&?mr*TE8&V?l=6o;s)iDb(C64GNc20Ij zLl}$OG<66KUor%VyH?4I#edLufA}}2z+d0&!oT9b4!>)sU3`qdZz9_En}P?vX$ybn z{otRxYd`#_!r$qC2)~e;;Q!H{0)I7hwIBRzzitcv@SW}P|MXYi3jevg{&)Bn0v7li z@&*27NRj>E@7@mn$}if(Z$lLA)_*GgfAQ7-4t~*C1pd#DR_nhb_{Z*Ti~oil?cwkH z?eN$C`#|7ttG@|cZS?Ol0Mz#G+I7MbJCOJL+q)%H>R8^Nqh(yj_U;EqrK@&{>N}0S z`&Qa&C0fhv*xvnB+G<5gTkJsp9+$St$s3itXlL&pIWC>NxL6Co{{wsXcXCIXi2TY8 zY36T#d0!!QI@H&uX*uW2pR3+F`gfnS)qb^B`c7l-_Dox?!f|tSsDE$hkq*cyN;~X8 z|9&uSl}YQ>{I#=p$Bj)lfAcsWzE`QWwfK|s zCH|%VjlJs^n1$ZPDiyMW`P-k~^3sm;aMef}d-u6+>Ckh^s?_;&$<)!WpGjLS&!O%P z>FxTo)pjdl=z!i%N?T>un&kW?ZKJK{r<=c%6@4b>@Bhx;y*baB&+clJ2Q;50Ql~@y zdCog}Vmh>UKQPi&yJV%V)}g)oR@!PM4)u3v@BS)nwIU_V(%8Efq^)*>VjAu3-EO1P z&FO`ThX1Gb?%Xmu7h?Qa37`YDcPkE0Hxbj`))Ud8z1t^kwO_rat95Aa_Dox?!f|tS zXzy<5nhwY*TA1x`?>?Be%A_|0!1ng;xL~@uo2Tga``Eh&x4-7<$xCxZPu|RW76b76 z@7K9@LsYdl=Ra=GwWG$V_JrR4Gx%J)a$gr2?+&>Cf7YJ(w#3f(lWOnr|Fk`4|8JDq z|7+ivvwz0^{2u2#ne4g*Dt8YyX8o4aPJzl6zWF(VWmfJ!+L&3N&9|CA|4IEj)wGtW zn2u#CrlW38C%p@QAxR@R8q`@O<6m(*TM3_WH$Z)U^+km*_+F9&w`S$O+|c0EhEi|q zTfN6=Cy=p*c4&2}kHguKUDLAz>V~u{a+9G0L3}Y1HbAIG%P=ldKf=a5n8=dhd+K~pP)T_eMPR2?uB{MUcBuU}yn~so{_R34+-umw9 z$IocpnEf;>GdZy0<-Ur&os7rW`tL{HT?KJ06P$0uxx|%*M7R{KQiF>1s8D0s!il+6 zu{i=Nw>1v!C!deiM`}xqxl3}kakV2^!~QaxKDak>u-f-5S{oa4Ew`9o`vWOFW6!-( zW%RdJefzHE!PunCrc(SfvB|CGHN;YUMr!-xBTW|&A8|auo#ZdtcEg%$i`Esdsr=?j z!n3uQ9tsjsO>}t*p%qR4&d8;JW&n;2b zwcZFcHw8J=rs{GzbKN)8U7~O*rw~~tQn!}IC~Jk<3{z&OaUx~wxlyXB0AfjwivBy zeLw1h^cX3$kYmPzN3y4yZe8`X+150)Z> z8Sg2Ie2e^{It{ovW4ETriIRe6#%@iKFR|2;6j@rl$yd?R$!9#)5Qz0YQ|KP*k7aVV zC>L*bK$FaETbd+!z+9KQ8gkxFCCSy(h9&j~7}$5vr7^c%^%Zw<>;}uF^q5cuH=IwFcf?}!0$k1?U4A-^l!N(H&9tOB)*vVA>NaNJ}!ru-2KVGD=szz zu^wjzUUo5RzT(bW5|d3ij2|**mv0=j!(y3`?d+*;f(d zgVq&6^7qJZ^?-WICtOZ^A_!g~;YC4^&b1)!{!NO!s)cuqiuLP6OsSGL@Q;A?X`tv$ zIT}xXEF~N^JHnyNTCCM5Waf~-f;KXOV9@pwAdsSe*@0$CAi~=4{<7F*2nNOdmzWvk zi9?ih)KJD+U8wGMRIer$NnL(5%dM2eK1o4waEhD=3RjUE@gFL32vX1}fA#Rv2n$i< z0!3>RidG-Iij4{;?QVlBc-L~bbUenf8k zMbcxyXUrL&r^*p-Pj$*IbomXrFN*^S4jyFY89da!&wEm}T6UIS}@hkS`6>PC&)+ks2Q}A~zgL z$QIFQJR(~froTrzw4!}VfcUH57Qq6WgXcM{PPpI%_?_@S;cS;D8K1B?;cvp`;BPR& zzyg;E2K&^*_K+>eiH3N89w$+v<|~1g6m%pc?RU-B>u7#`v`B3uAA%WQ9Qb_Q@U@<= zTlq|<3S2Mm5^6_MfF)Id)cHCUuKZ3h$`4NI7o*&m9bp_v zcGpJfKVXAAjUnAu={Ga>!GDDL-aAVc@r=D%oy7J^sFQo!sgqYE)ybr)mt+(Pb<)gO z;&Or0%o>+_m>H|g8kauJI`TYwS81IBn^q|xNJy9Mx3w0EKNI`C#CU88=R^i_-eR+o z_?agVs?#CkN7#Q0<6rF0A*pJr3GYj+zXOs7?HfQI1VtVU7kMxddGKbb^>M;r*yk7w zJ24o1MQ@5c__~eBuy$HN%Yp#rLZFSg@OMWROgm+N3w}AGQOkkGWCUAaQIeluG|&@R z=qiwbgaX-gn8*XXD5-p$)VJ$gKE8dlU^!6tS|@HLn0l(YAUTCgl3FBF%oHx^h^7Bt zv-D>imTtCa7BPm;KtkRmWsR_Ozr5=}<{U8pUXSpBA1L8t%-jlRPVj?v{JUR*A9TRK zmnXP)d?*_F9O1j=DfFEnls_w#S=(LTMkp`36OiQ4DTGqzNSvt$Nht9nh`CXI8<%j; zOo6Ap9hgeE33!qWxjj5^)PsiSyj>a|4i#y8VQ0c#coAJAL0=u%69Mp?c%RT`nv_0s z8lgFkz3b>X`uRJA^6TdbYtrf2OtDm2zmZZEEW@P!qtw;-T0%~ob{)M)Kd*Azb-knU z8?~Kw5PU5D3URZpJV@wWy8T{Qf!3<{pC=Otnf?T!rTAdU-A~-&xhRiB!h`{?R+*WTx{SQJk)s$pV-PY%12}VyU>VFyzy&)vW%jCetR!&c5OTfNLpZPdYD)^1rD+FL=mcj<6OE%B`9AX*7 zQ@p>+^l1{(aaF1NBw}2}D9)_tAi3$wxeByEz7*1aKl^7VQVWDqh-(;|x{zP8_P*B2 zL7804E=LmIwrVC%>I$+_#L~J0y5t~#xcEM_@NXi5E zU3`jSV>jk9FtWcku!oJ{&`EZWjVK1)Q^-C=r+Hsz!Q-mF_i+vW@n$Tkeya#w1bP zMU8yrvN7&K+Ziy`k#a%7R-^ghrOHB4=5@VxUq?-RSh(OU|U*+QdrPT!i>rENPipt#?(+Xl2 z>|036Ddu~X@~t$l3S`uBF|(b&{63OH*K&Q{@#Ljrz~Sym{s%o(+|k-Uv@0lgcP|y# zvl+3vRj9F~h4z4HvVHDSfBy_moKy^{tDE@sOML7SFXUVvORwom({j2Rd*5vxLoK>W9HrH97^fh zhKq$M<1+A5q_(xftlKsW9RgdIw)-X8{tXqF#M=+2`$e93 z_HO&lbtiaK&R@SVpMvZ_C?iUdthd(ex!S1w9fR--BP*4`J-{#Dpg8y6WimElvGT8? zcnz-UGOIpb$uF_HX0(Xi%%xELm3kkFoUOU&&AE%#Q$mn3OY))kt+&diyjd~tAzuDm zGBc8%(YPa-XqT7e8gna%naY%RItY^s3*QkR6{-bCc$jdH>CEVgLyC zZ1EZQv%j$$%bJvfWVwBI8IIXN^JX(+1xqf_b6wCXdl=L>-layB#T(8N0xjk{s>!3GTzFpSNMzv7t2XuU-LWh93dyw z4)gvvjM0dkM>{g_!}&C8#+|q7&TC+aYTm!(76m=;CFdHvynEQdD{2C{o!ZR%+On(j zKxvkq_r6n>OS7r-zL3?E!mq(4X5R!5yJMJ>=UY2Hs}veoWFidx)<$3Dhn)kBK*fkG zZf&b;A(698L@;BO&Phx?;_tJ3MX3ml|EW!XLF>d~F4F zP_#5)%5rrZaox5asd$}4my_lw4iacy=P%kUa2)NzA>3iQ?`2tKGWm*G@TFE=*(iF5 z>}H)!X<4h0)A_=3F290pkc`k&2u@ID{@QHb%`w0DUKWC*XKLS#G_E*F08ZlNZGyiG z*;VRw=XAauCF{mz@!6CrC7brC0Yp!RZW>uY^J;b;;-&W`0If161nNE;ru4 z8~%ZR5SL9z9!zL#>q(~(IF25PV$8I(;f57LqUVQp(I5kh_8_5^q(i*Pp=}Xu z`?N?CDsbzSZQVfp&VqyWRddKs*IeQsg= zr>sP+A2q*4i$>%f1q&i`hwQ%8Z7T@fZ8m=pu+|_lk?7J%73rj4ox3$3?WKPxK03F) zOgMLKRedNY;6>70!AsDf)^m+4dZi~D4>lNnHj6f)GsUk~5D1Q5EYvu1E>G9|%zVj} zQ{q6@dPEn|n3_M7Gs|^NIa3;B*%s9)ba$mS0dWJvP|MkDUR$)xs*C>{?xpNu7B>0I zM`LS{TFA@}Mlm{qqIa#3EED-=w>?|~&gIbj$dmg9tha;An?3h+VP8B8qGkuZJAys; zlvyi`Ux;ikBTF*)YW^^2JiAu#l(B}5_V_AZ$^8vw)`sFWWsWk^oZy`Mg4O_7sa)B0 zHjN9%Oui%WzTIc#2_7Jqq`gV{E#71{Zz^6MFLcIJyj&r-c$2z0@kK!ek{4%l^A~=L z9sY(XwHiI~cc_8>chMxH?=sFXh?PUSi_>ePSCSC?P~(?!Kao<-F69d^vUWdss>hfm z@@=P)m$m6BanhV#XUy`d_uFg51jySdTe8X!5W`LG7e2KX6QIt1V!hY`dGbEHHnTBRhGoJ2W4zV-bp{8XP$00DrKu%DXda=mC5`Y&%R+6ExVnYUt!A`u(9<} z9LDnJ%HUnubc3wFNyZpLLF{4p7YEgc`uISLW}Mvf+ovs$kenNHQVTq^e}OqlPKkg> zNGRva)pb6EGYo07khzMVSV8%<@Sf1 zpfEjwk8U-;<9mgg5n+0zt2NVWvXcC{d3_Do@Wi{QHeC=`6|I1SY*a*E!E2bh$|}A~ z4Z%KS`3Y^G2*3D(hw)qoZn#9eC*Sd?P`d*Da0I`;h5jF|6XNHRhSlMth5A1{?lg}| z@NYa^58zd6!UNi@U9FF&PJ71jiD_3dPOV=>bmiMNv|DXx``T2=X{~Ju=so$RHx%FCM5V`cK z8N@H?@8B53kHnr#VF*tjyB|XT`}EFjJ71_YQC|nF-B3CXytBD>gDdz}<90+};er}T z|KsRUmHS#l6U2v+En=1g#U4@AelF9@@Q)n#L4S|6%Tj!_(PgMBVe|ExpK1=ff(I*j zyGA(eYToeRiaNR|L9cENooCi<$5+roH=*;zZvdw}iPp15atXW>-yt1R0nb7UTmyzm z#qb6xbgENG>kr&=39vOyTOIg|*EBts;_efF>UbXkMA+a+0;I9JPN2kZtwBZZD-TNe zVshmV7+J(YT=dtzV#k!ojRbrah*nU*|3Xn#O*B7!zcdP6u&CC%VQLw7KBLVwiXgDq zIQ_W5%-M&YRDMa&yK*5!*=ic+uU`lzD~$73%BROTeNPWX~9$X^MV{*-{BYt@=>E)yqbq7NVwk|5{j{-Fad$5N* zod^ymD;$bn^JZR^gKobZq(_JcEy-wueqdk0t_8bac;dJ@0h~?_MthLgjWR|RDcxnQ z8C7y!Lcn@AP_)kP{b1^i_$B=8rU4VVdy7`$&j!tYym~o1z`RI|>OWG0Ovro;Y z?-ez7-Y-LqruRLUApt+&+(WMa%57!6~2ld`x$e7fT*0_1m|| zd8aB! z*0UoD2e@G#-=Yvek|ST5N( z*f+8Zu)F!fY>YF#ZzvHbsGV+{zteA=UuT?O?{=vqE1Z9s605?-G)QO@@EtMUW_+&Y ztLm%ieuppXMvdT3rBM5gV7+|t@Y(c-IXiL)Psjy_VuS;A9Is zv1;S!2-%^XQm*xGQMOb zh-TT%TqJYGzY5bZ8+q^QwSs4Hsk^_E`wHy$BaqNlm(=>huhEE`E@08Ydn+6)OYz`>o zD!kq+xLe@vIe=GVrsSGR;P!>@i`(f{$ED&{wk7NzDd1CZ8*GQ$3VQob@%yg>#;<^A z%(@*+Iye>}!SMqNG>)(2jasG(jV~tlUZ9`m4=~m=8WZwE_V%ro%6;EV?ZQon87xf* zuU?EeEk6VDvNbe_7q=UcU1n@#hVfv1)taDDT5Gn8;g>B%cw{gGkIx=XgK_WmDxNi@ zO!*wAy@4IKmvz^dKiP8WYExR0V0P6WjUCouW3qk(xYNYgv}8w6+qGD)SwCHaBLeFc z+jcyjiA%Gt;Q{9|f zrWZ9_$^Ave^w20yvc1}LvTdz$LwTUOKE`D10!UK`#N`fZwm0VZg zE4i*%O=>+PLkvvs24hx?-bARq(JsQE?sL=!M`P&L^qZvo?GWDz%PB}p>H!6!1h5IF zMXf#iA4&*_vXq0yusft=RrAL9*`QD9wW@uerSu|Y+X!Aka$EU*q*5=G_@-_9Y}G8g zRm6fVCf|ID9_HY;B!S;(0>1;pqrOv~JL*XZ5qi{k}`R3C@HtF zjg-UJq@-N8rr%APbKv+?vOkGWCHv3e4hs;lKR*2jj8E09gHILa06stYyEOZ4_{?Vq zr;R{%<#7sXI;2-7UCC=*f21SOmnB8DOrkofdze|bdl*a$LA@*~?@eVibu0GD^jDA=JbM{a+4bMk)>ZhKc^;Z?cSmNxSrH&6s?)?N9jH=%et0Wpm zvDM!L2q8RYvYn@ul%=ARG%nXdQEg_*gM~b39avEnlwMi~-o%&Ifmf-&WBF?zPHGfL zrXXJCu0Q;WRh#Ju;C|n!(4zpAq0N2hzE%u*JbwcU*C1sMh_pUdpydtTZ-@{Xo z4ZJBavK-jO24oV-@V%?1{@ahp(u(=N-@YL-xvK(npZ zRQsq+wuNK9{+K+~hsYMfO0E$OXAbEfIzfd5d}0>uwD0}ZeXZ`)^|Vh_Q+FrN1Staa zi$eechygORjPnatT*2&u*A{5|DnWibV398e3+Isj;VfVU&Y~}wDWJ7KnU{pKZmC|I zYk8(8ut%XR;HqOlr>r1R{AM@GX20H_sTZ|xRjS(8I`F+2&I)>+FRcR?slU(h*M5ym zLTUwdQIS-hp^srd8Z%32d}wPnfn77-1}Cy?e=$=p+n%aZ`k?3WSwHRc|9CqW_^7ID z|7S=7L7^uoYHYPc4N80ll}ZFO0|}ggiH#4$wrWw7LVXl6NCGB^R%28|t%{H8IRpi@LI5HE?{A-Z1%kEr(|hw#=A3=@d#%0J+H0@1 z_6dBwG`ENzbPc;Z*-o8lVW#C?45c<%H&4H?v^Bik|WGzyrGfo;!#XgNhjjqMFJ#krsOFuDbj-^BE|e|@C;@}qwBxUEidZoB2|Ld&Iuzmnj6 zB9&K){&WrNMfWr$v%)^E2~*S`+8u!t7}Coo<h!$k#>@^JAl6rwy z?jz*a;$bO*7db`V|Ksz}ZQdbtIVCS>6mP3ji{u{Q{ml$VdMs>&o&xW#&ZtCP&e0fD z*%ziQ?u$tUqp96IO{X)c4?^UPqOOHV?BmyTX9PMB;X%GD9?kM?%F*_ zjlc7svaRTaTJ-d~km<~-j2E2|dir_)uV1J^BjIl@--qZs^IBQ@krh3H;@rzKblcQ= ztD%?ERO^=1cJ{Syzg_92pKz76>W`nk)V?Ro5n6!DcbY_<7k}Hdi(fj{HKngqH;0gk zqS~q(&mBo@8wna>MYquye&+#eX)i1K2;WCuYeiomab&d>{T`%i)+-R#S486vr({cu*i4Yy^Rw~(~YP$(-JEE(m#|-%yq{Q$@AgTj=2Y+mURGCJm;4@*+dzj;#R-F8d|X$ z`uGsO@g*F=*zY$2x9U6vj1=EtL*ne8&ES>8^Fnm->H zxqJ8XW~RLEQo2nKdj*$E1gk*B*Jj9HS(g9(M!zP$OP!|gkMn)x3DvmzCsviI|F{0q zX8roL<CV*+L#vRtOdY-+vN0bR&Ys2C{;;XB`L#wQ8s6ry~6b+JJ#70=09Xs-od(IJOmL~=76r4(PX_EXm zhPV$*&;YcobTL!uJ67FW8WJurNx=(y)gz}Xz{-N7e z0btCNre8aC`nA&|SGp6PxT9-%_4TBU$Q@*As-lvM3R*|!oir6+ac6wLmeJq161Y+> zBVFZ9pZx@^e zbBG^zuOa&l`|Bz(F;?vgiFt1465Sw~05Avtg0XSXaT`KDfQJ|Wj~I3T-E!qwOQFOp zCod*ahpf6edx6ni^mr0@tC9d^)-R$Kf7WO13&uZCc?KB$2Ga6DCOq9!sGj=rRA0IQ z15dx^Bs~9=p86C#?@hw9>=*mO^GHU5nZElLI}k6Qm*oB~6P}{i>55Y@Jxef6=I;rL z?qNsi(zbp@X&VKs@K{H{_tOM?&GJp3FDU(WO?w7(S;e-$iUrF;Kx@DWd|!K7@Wmrc zx2Jvc&iz4m%$>qow}2# z8n~9IuH`AjF>tjF#w6kTM0)yDaOH%F{_6fe7I*ji|E$HbJQQ4W*?xJ4@{$41clHC% z@!jBwyjPj@`+DBD;xU4s-1%5=1tO;T2sqVN$2XDB2tPtRqRoLwf2(13mfPPk8&>Yx zJ8AUds;p4#5{&QPw4xWozQU#NTk}WqfSYIyQ5Dn3 zB#W3vWLhP6NBokaVo_n{u}sTp@2sLb!zgEq<*Mm&J-UtNUOANsLg*{Uj?9ik8y5#rDFE{ESZYs3h+NFu=q zCYq{|#!@K?K~NEuKa_f3yRzs(4I_fRod2ln<}ZDK9#RkO`SloL2Q2Tq3s_opa$(B6 z&+$e^=$68!I<8L0{h?SjsQ-r8SJNWRwN>{=h_M9O_ytGemcJo#qHX{s!d*u{;3N4V zT)HcASkP)X+r9R71D;LZO_VWs6pB^k2UpT8M5%W$R)M$8SR*@@cQ?#UuJ;UY8iXO{ zhr{(9M%%)$s;C1Uc)neXeb|M0-T*KwxnD7G5iAqX6C7~>pdUV@nOyHWz15Cd%(}>` zo{}*U*5Z1TF;aAjd;DFXHdX`5d8NsDQn#G5_@pJ!OZl$iCA|c^N4mXsw530F-0Sl* z-H(Z78@9y3iIvXZd?Ccf&^hc7@L+SE`%4@e^bq1C+4(GpTjUP2i^k)y(QQEBf^#G; zTJytArD?m?pKRr@k_$QiWNrNo3%Qp~treNIZlY3LDjK=M=;LK2Sq+AXP3cxOx-eh9 z>XH6#XRrRhNq;BNs}%jcH@-jmJ9)I0AA(eZyOu5fcj)h_Y_fg9D9!pt9= z+12&^?`a1IQW!^Ua|1<&RONnD@V|=>NB^!TeAvA3 zKY$Od|7GyuLDls?$A=A|_x|{CHQeTZ%#XFkQAE$%ya76G$4)9xKVwHO=O-M0w8)67 zSWY1oUm?f)3V71_Y{QU`V4o;}u5H&pYt7aq9A8=VIMjZsb@e){7!k`opiYc%*n#vO zeb5!LbF#SIvo%^I?T!AVs|v*~%}46VAKGXYM~fcki+&sVo$5r39_BX`8wBC)47<$>QkKRFNIKg=D;=0w1||A$L~BrWT6H&fu1)*jRRHI90(OLfIIBDK5bb z>DWohbALo`vgCzg=ak^)K)e?^ZggmDN$~8)4IlZR_9dD)VcLvOCYZ10Y z=WJv5jXR>8QXY~p!ssUH?s}QVFf{ipv*ToLRi(U6d@%yk*l^76mmOPJbdSEq&U3@1 zjn?fjhOAKW+M&3uZ+B1rjao8e2HxhXs;k)CNXEGcor|ujdehOOs-%>egjoM4K$Fj{ zIYv2@n33e5?fAL*LJcG^e<)zZ>O?(vs-9w?lh_Z@|3YS$@(clfj z2@*UD5(6iP=#_cROF*-H;0#-+5#y*MjUKVwtqYjd6qcBpeMEB4s`V=`#N1lQpP{Ep z$`y&J5%b_Y-gqE96JW9c%k2xvoO(bY}qxyMk>&6TjF;kzhUP|Gf4Nk zUx`p2c{vM1JB3*P8S_Oeo-{;4@R~(yjJ%UVq8Xw1n0!LDvSV6Uloe1#Mqu`dituH! zyT~kFz^DopiX|NDEh1RuM&=4+%(2EcbelRg*9ig}xQ=tG{se6sYV+nx#UL+-%d83RWkRF1S2u(!+s`w!>0yb>Cy3 z9g0mN1Cwhoh7AB70MOz>=GHWzxl-4{%*tf_iuNruebAh%A@#W=@mrSot>V``=s``d zrU-PKEHtN*A$+0J)A-SpYAR>&Y&%i&$*t7ppZrycp@?)6^~4>lg&2<({oK5B$Yls{ zq5Cv^*oM@qMMHo$n`v8OXs&3mx+EHGo8JTtK8#EW8vK#_`} zX5RP?3P;WKsueR0+C`2S<<_c|cE6Q}D8sZ1iwf0FYO0O~z-DnU$A(z5Sp9YcbX;hX zAO~VOf|Ob2G2vSZixLHL&!WXlWJ)$9*t^bbA0~z3R3+y8v&A3MNn(sE*e_@Rl0w1| zgMx7OG&flD^t-%sYW*fFCD>B8k(UxXR%XzRQ;29zBPmo*x7aFL4KwoGdRR|bZI~D) z+ue=8Ks9evE^*f_)FsxYVG6if)&lMZ^Xmh5{&~uj!9~{H=fl^Z8&O}uH-}#1-Ky%% z2Y=?Ty-hPOBn6W5cwsqQZQu(m6Z8z2J!sm?olJ%#7!BE^G7*LZvK(b9`-ACo?%$Oc z%|VTdCcwCiXZHu}EK*=pjs?n*B)qWT%_-zP4N5rx^iQ>{cqL&VG{n zd-B(q{3mzIe=toOte3n}kmymN_oWVJj9w>0vti_pjQ7QYL;BsT%GCd5q$`$beM2F` z0vKIwUL6B)FNUyYDD)LC3T4T*)E1?aX$PsQ=lUXyOKEZAGKnxXdWqX*eBZ6_@Vxj+ zBaKU5!H`U6FA37v=5J8?6}dm2rS+Km+#E{8244Xd`1_MaTGF3kMU+a3E^X=pt4?hb zfsUuOq@;wHjpj4PPm)s;%c6#?S}Nujexo&|KO?*#xO~W{jo_kMhR}XOV5wIgQQB~T zW63^lgUQF1B?Lh=I}`{)zankS5SF9~5k+I1C8^e8xgka-?r17ATp&R)=y{FlMDDRB zi%&B}LBvEG^(iq-vAQ<%-l}G7_ZhP#$z58*+6Lo&wx|t_NMC_+CRVw=FuT8 zyH7sdf10&-C}HZyBEAzMN*-`GY08b{x1b!+zl>mqK6x)M`pHSMQ;YLpcx_IR+m5bL zE7S~&jX^lDvu4G+Q~;4*N<}TVZREKGz2uF3wWH9?K;|DLk@boG9oBBg6awQTw>N5K z)z!!cL)rg91x7p)S$|xqko9HeH^H+xn(ao~wcqhMqM_@{w10Y<)o_HL!Poj7dTfBEO z=sDQCku1W3!UgnWSfU@Cf3PS-N7MH&TZ_y1Dx}dWD092!_)}VDI+i>)DKX_T?`^gg zUrssDTmW*PHKj0tsU$IDzxLW*`!_>JwHm4nk?d+q_FvE)XF8Zq?puSt5@QeJecPb`PFPX$YEo(fK)FX_x6 zngmzqPBj1DZ314;L{paR8AS7do`~jbBLe$G^ChD^$sn386?`?(Jc}GDqS+)37IIGp z(cEJc32CBv?MxBPhfTf1=JB#$qIn_+{B?-t5vnmoH0P^k)};79AND1hm4=G{CyC~i z8);{MMDtHGG$lO~&3)zJ8Yz8OKnC`ro5wP$?sRi7nf9TZzp7DV`_j$tnMq&W1KoVP zXS(TvRNkqHexUzi{p_v(lGl8iZnoZ}mZ6}YI+moHo#6c5`mZ1IJxMq3Fr}cI<4qxd zJ~HTMkNU6u)6b36;(iRmeI5FlTm9AaGp_GnkACjFMuX4&LB!C{e=^zs_w@5dAog|W z=Q$?dzezt|zu{lf&!r~Izaei}cOGD) z;G6+=iF(fRiRdi|o;SOH&7`5+0N0&{eh>Y_{%Gi5Sb7;Wl<2->-AnK+HNvJ(L*qsk z$e^Jg7+MDf+^^tyCOJ|xbhZ)dy3x=Tx2k(-8hZToqM^Sr_4XgdOOl43n<03fi{RPc z1trroG(&YS0VzZ9+;Ckc4ZTe@`!w`+YTuWJ_BA}`KS@Ie(SiNa&>vr=@%Kza%eu*( zW$Zybg*W||^s|^u`_RwJq`T;WejaWnyeInkUeEONVGzoMH&s7sM{Nan_okmgI*_KH zw@1{n=%+fCq@T-7x$fr&Q}~{wpXZuV(9d&Bq5lZ|{3FQrb?E0aKly6nKW{Wy{tfzhh@m;Ty|r+@4*mS% z8Zu_epXC5r@+YUH;1gsmEq)rYbIn(h%wvs?rDw5Iag{PiX1|_DW^Xi5LVxYjzHh{U z43hb-A#GnpGS47Kie!#AB3(CWn|*pddl0Y5 z5D)sC-ly*?Z=Oh|edy)T8`a9b@}_5IyC-`2kDlq}EU?KdP4uI7R3nRFZ+cnI*EGGH z^b@r#dZ~^j>E!}bt~4{P|A# zyW3N8p5QW~u8l^I%JrEn*&A?-{UH+AvD0T= zdBrIcFR)9qBYpYMu~g-1Zpj-{{VCDFuj(6&SG@Z0?&=3>Zs~Vs^)G5}vCgc%(`vZk z0L`?NkNG(wzZw%C_#2YT<3&{pj}^hK z=!X7ea^vJsFgsNd)(`j)lVj!3YMA*PNxEeT9KhUnK@YNa_wZ!@A!!W z{2oXrmFJ$2{CGGYMbz^68Xx$x_`oXJm`8h&9K34HNM@isu=T3Ok%6{RHQ0q(iys2b zoo0WMx4#jr*?kh89NZq~RAhO#C)Z8dYof&F=!E;6G2E$F1q21idZ<^{jTN$T&c_iU z8<4rrBX=*Kh$|8&ED!z&8iW<{RL3r88Qp6PJ_jPqj_l9YaL8sNwI<>#+Edyv1eo5g z%bS~aa6{Fm!ay@oH=Omw>xy4kegbu0wPz#&_x5Nm7YwE%r)`zF>N#9=xcoEo@rP;+ zF8dqaU+}7eG5mAHnfx>8Ou`5Z=0VYouj(ABdkczp+N)Cd(c~Rt4)}rlIRtA6PkA=p z&j~y`mWvy#;1e6rHBBJt!2ybEqwfrv8ObV*oW66x#~F3i09uFE^*5_ z%-j##M*6oI2HBbchjIqmNh@@=7Pr~==pE!G;V8HBauAKPKqhyxCeuQ|;b3!~_Umz* zYjJkt@>a_X)b7r+YVYNtY}+&3i=hi2>OPLlu$CUYpsIkhUXd%DP1au{2k)8cLel&gvRG!9wP(zXB~Hl zaI;u|3(JXtk$3%4eur*zw%4{07rWnxN~hoO()HJG>9{|3uqjK?FDdzDM?BU3zsASP zZumG7y9Xa19in%Y6>z^wU;2(4OhHSTQ1U>=DM#sp6fWJ0n)q%RlVb3a1-vh27O%T% z-N*!L8l0TRF~k1?POgamCvZ~OXzuJF1dR($w#9R50$jE`@UY?*d&;&2I7EPwXCzVb z%E?KTw4yIbdP$?@CT)iklW8#1i9vFI{ zFf?zE_utAO{{upii}T1V?IZW2>m+>U6g|aPBoCV-u60Bq>up;Vm^bgpwdVhmFGHVg z5VKK%rHKORyxEDoy{!4~`FVxU%KOtqUd}(|Tl*%-HM4T@QOpI;P2wzM(vRFHzVCOU zW>#-Lx`-yKeHkNTHqPB;*K%*WHIA!vcH~&|@A2EnO|)@rW*dHWQ&QDsQ{6A9E~Bln zsgF5)ymha(c4xH3cn<15o)zd2y^xWdn8);bzmBA-^%{x$J%1#gVoIjYwQ~cPLkE!g zz1`-B-IsS-M<>>QFSGtfv;N=ab87vyjMn-;;C9R_?xT0NCmg}UoP;!RO*YM!k5eZFK7B+PU8#v zZ=$>emx;R&=`L^k+red`mCM9e9Q@E9BjUrR!9*d`T{m(~@CJ*SlwZ|0(&5^mHm*(` z!0kQN)18*SFIaVpDcdrxtHiI7E5SZw?Y4~DQ^GCVy@D&mnjE;vxZSW3+{E2u;-}XH zwiSPBPk9yv)xf?BCc%*TMu6c>$G|iK?P3*t$_XqOx5ti;+r2tib5r2>NTR(TfeC8Q z=87dV2%5Yh(WIxq6I1J*<_0y(hwt-&ajZ9WpZ+s=6-{qVRWB7;&H$P*(c)6@zN&p> z@p>BVb!OyN+!LNkRMwx$$`?%1KnQ=n>6r5P5vs8w@TLYbpuG5P5tT{wdD3oDP9Ivf zU}l%ovP#A2#CC!c9}^$BluUuH;?86zMw?CyT`-zEP|w@VLF#U=#Rwv0fTz01pX5gw zS8B9%3-O5mwaMe-Z$=-d^X=d6Bf>@91uT=6abK3SjN4V>U2oP*R(c)}qS}8sk3d9I zsd%|e{X4OeEJ=VnSdt9~(End--@|N~VGkVO!*>!y)szWPChg-9oK!KiE5l`8VRG4# zvv<>p>D|;-bM{FHHx^;fb`dL?$8TggTx6vCq(aU++y{a0)TML)kU}3g9zO%cwfoPD zpyCJ|XNQYjeBbAu5uCT@^wUoJ{MIoNMdLc?stL50uAh4vVbAdS2|DY!oGH?XcpHcu z;0ui%PfV>35&0pXvdUjQo-4$@kySm0E=y_;JDnNFz<&F6+jPH?UAsEK+WCMEMqX9# zv()c^@7`(pSpmTNP@R<(`R{UP>-G(%>T;`mYq0c_TkkI)5h==>`*Uq#%bk*rJ5unpi7D7wC!{V=Wy-{OEA}M}hblWd2BT?fdW4?E1b{*Pj*CDv}N*RELd78ob1K z+L(T@Q}|9eUS5>5Tmc(~wl^p23W92MhNJ0kt|)2}OONrqj5_hTf4i#M8GNoTL> z`zoC+713>xZ!kXfVClGe%qMk~~@d<1!iwj=JF7Tg?D%^HCyj6hE?fnL>PDxHtg z#w5UBeQ9cod7@mYIdCz`4$p?rL)<1;nG*{ z(~R{*ti*RKoqu$+CiuqQ_&8jmGp2rQ0gTPOZzm|+e1`$~xOqyz`5gG3499p&GlEVa z&&SJ_1+1l~!8`qZ9$Lv){bk%2n8ere3w?Y&Gl8$ChKSR!P!69Hz*lxHf%ft7(+i1@ zV=aD|R0Y^m3;<_6cNneU;+N{bgh$Y>6;+)4w4-;Zw8h}r$yt#IMr7vsl&r`!bHR#` z?&Pd6NEZg*@^3v)KLv9qNViZJb|C9(u(ZuY^7^`M%fyI?V_{WnP!A&9=R&)T{}dtl z$pP<6rZM9h_OZZJ%l3Ez z8hm4}g?RQyUHr|mvg0RKg}6zViTjQ=j|WaP6IcC0W$A~Jq2_W$G!K6v7z)09(6JMV zYIu#XAF8r7W4R{a4V*gO>(;-7Gn?sHaHW>R#PgrhTA*_U1{*@Li2(U#x6*p-OI`A_ z;O~5mT%z90X0MKWMto9N3kBk{pjywk_dttG8Rt`+8s&<(?GnG!-}B!q10T4@e3yGE z0V8+$cJqfz^mFL8p{Pnebyp@zewQ+2x9SvNZl5A$Mh6Gl61Jt;9bQFiX8Eh}^c;AP zos){EBt@3|7#U&n&}|uccF`{+k>7k+guZ1`H*JsLWa4!Px$@vb-=xj>=M^GuFHT>p zZDLCik(E%B@tiY5O`Un6;>HOG=yrTyjem3WYas=cYuLsAZzBiL-Og`Wx1SBF;q9om z1FhQ?FG_9?^~`ow85t{`)uH&Ge~4U-)mZNJio{}&(*SG5f#y!Y*B+7@p;5uxob4fG z9^zazb)6j|E}^ce|GP@sl%(FZlB1Gzj{8#deY3s~SItd3d)q`kcTDn^N*-#GH|2z} zz)#;n=(MTa;~|2}241sQ3=aLQNdMs@a~8-z2)R^f;+J+Rm`*(BRgH(RDnwd z<(UQS1B*XHo(RQbGoURE zPn_9{`C2c5H4WuNj5J-0NytcWOf#CqF^RUB7nD~t!@ia@k2(?d$TjD!eRpzy5Z9tV zx=6TW{Kbpc$E&Weofl719xiOVV&2ZhJXz=XrK|_20tVGw-nTtn)-L_*)@O*#GOc5L zV%?U#apEg24>1wlRmga_snb zzl2TpF};r9_G`uKyAy{{V5_RjsPqUzQtqP0)ztV) z)_Af;E#!KVy*?THIa+*5C?8y|f9Va4&W#Oi4A$)E6^dWqWj)Yn2ev-Ux;dIjvg1F$ z1|Vwn9&?L-N%{%=+D|7haSuI}ygr;f{RipWs*4vle=+3Z#l1pLC+}qstz57BMqhg< ztDgJPn+zd=AH8l3xS(jW?$P=(Rvz7;E>xfLlsHJ)wwCN_Zb{w7jb>kbH$L*)p{5sm zg-W}u`B%^@0)?jdB}}fg&5FMYo4bLTYb0(qk{2$~?BiL9~|&&V2i zHRv>%V53l?L0Rm8rnG_Vi&rse4U8S(?)9LtLVa3qpjo*1^>VA>ilW8P)NN^KhXQN6 z0cL!BWG_f3>k9LMoKa$wg{#TzQ?-VDWmkR7r@Z&pr!R`-(!2Ads&MwqFd}# z14a|W?L3)%vjeT=f%b5GQug$A)1zj3go3tPkBD2?mF|4l3cZ%-S3J@iCYeM0Dk3iD zw2Hf^TOlGV!`E1Ax~09#bPFaD3hWFA)`tTx*u|fQ9PVvxv=%MVyg=}r7!RR&O_x{a z@Z%Oj{se{EHHGPhsW8o;$H)7zURcLzR@1Zt9XZNoGi8k4?Cf`#paU#+2S&3t)ziyoJ0&byQ(qi5K$LIwAlQ}1_)dO|CcOU!;c zxx_*%QcJ5LwX{PHt_3=T zo9>4~me%Ejbt8SFovR{t>DF6U5>xF6Yf%Rak*7h{qSZXD8pJ%C6%aK4iX`OE^hrX2 z|J%Qi-}3mx09R#}J0EM6-xsXe*-xwdQF~Rg$3biCCX)MW-LJF{Z?xm#K)_y>L~(n& zXXYOW1;m?>B19v9X0J$1h)*$l2}$87Eew;NHOQ_nRXE!#j`~R0vnok(G(x)+Fs>`J z?rxv9*^Pg7;!lTgzOIcySw*4-`a&9`w{@PcJMxEs?BF!{swzu9~y^8XC)p}x~WHrF9 zv%IN#)l&n6Kg*k>S3Mb3uV?dWr`b%P!%i)SP}6fcq0$a({z6uicN!C6@Yd6vBz{Y8 zC0p`d<|%{5d*5W3M4*0*(fRh&1nck*8p6&q3Y>ti{4BvRmiv4dr764JLf=|~XkhXx zms8OU*L_hNiMa2ALNE^nTiJ~Civ8__3;`U98qW!Nm{<)fi$q6Be6r|19%L<0MjIsD zSM*B~;O6aQHvy3aEc3QgHs9$WaNx|G?qrdg>8IfvGQfgQ=d zso_8KwGu8IFe6oWVDm;*vE?R%>ar=rz|3$fj(gUa+UHnpfpd+0$NOVNG z)7aEGsJI2~i}R_oHPGI)V^C1#*CWXL4Pb!5OdnmmE}_bHc2cn1p3>S)Y@ktEbegF6 zHDs|wX>=y2R<@`-6{o5wciy0mks*YkOwl73Yfu3{cgr7rJVXV40!4q?f&_ zXwR(T0$gj%K#X6j8IA3{VCErgr(^x5IT-|E1|`@l_`EED0ROtdPh6b$DiKj!3m+%g z3N-Cu%Migy6l9L)EVU_#sDjd$OXIZfl48l|acj;V?C)C=5t*t#4wde<>ZSu^yL6Wo zova64CQL}HkHW>9-1E*xIZ;pSCM!B0f(`1i0sd1dlrY<>{Ius3WiBFC&HxmiKA$qc2G|MFV zZmzeRf)wjjGA>@<4dV{81-PrZuo;DR-H#cN>HUunQGwkZ1C0Dbyf9nX zeGApp%+4Ad;p)3B6gsMn_?~suq?*qdEHHPUV0aO%{g5#Yq&BO8*jMpU56nQ@=4^N0 z4Kgsqxv25KjaPILOw5YjW#)>r%rg(A*mxo`P31n*S?qU~tyb^4zQi(V`s91|LSIQnLM7 zyRzCESz<-U9>k;!s$s;;%acX=Xjms5a}OScEmHiNfEJ}9SKfd$i$2@?1HZCk1+Nm5 z9*x0rnQI^QDvNpeEL8j99{Z(Dm4PqZbtBRCac^z(3bF|{b$ZZoZ)JS8P6e)kvdwTq z@oNM2h-q7``335=L1XvYkbjaXf41@kC*q^YK}eh+AtMestwJY~N79?tvQ9GsXPP^@ zrMx7N<@F)ej#q#vt0UjGmR1Bt-fTrhl1HA&848$?K5sz*=;>~IAApIaa~NGVs8>lv zj*B9*(%J3J;-wx4oEdqDe=Dlj*!175y$=|W)j%^BSkZZEhUR`npGF>UMgIxM8hN@E zJq0ZBqtaUQzr(Zb>{i=H&^8{A@%kkgST4H?{!9$ZWk{fNF_=QR0zns_hFf`)$Pp{+ z1Y;K~NQw8p=5tv}JYA98Mj$9Z15Vhf-Gtq=wwHF%KX25IYDsh7Hfw34_eVsgaJ-r* zz@H>31VAchbpygQ*2|IlBb2P5zAYmX6OZ{?A{;^?05m{%7uaS+go%GSM!5cXz81v( zDa6Ab9q&#dt~3Q7>5uS);$3dNxf*r+kl*hZMqR?hUT)cY2{@T}48_gvPtKIR+!pT# zKn4`A$XXCA@Epx(ay2_Zp;DF!SA**NuI3iE-`+!;VHRp~Xn!1+9NOy98d?Vf|Ei(= z&E02cKQ#rrP{&Zvh{T*t-!tg+EcfwJv&4F72*N>n4V+e6(H}7$hSN)UbO>_-+SZ*< z8X2-phOxZV%+9`=9F5U}@zav)~ip^t_L){S6P;cPtR}J;OkMDod|!fsFQ_Q+;$UZDJ|YLy%{FBQeM=u8XyXI3N_?x6OJIm=M`9Me%R1AVZqs z-&3afyZ&EL{9k{#&;0$+6dVeU5g$Y&LW{lVhhUBlpoZA7yxKhnS&Md(u!=d(TBgfG z8bIvi1n7~~&ozb5S_|q_E+wqM8ba5=Glq7V4S1U@Y<$HqLW_Be=hPVKqgl-2kQDon zQdy_?`isw@^n03h!&$JCX!5cn!$ZrH84zrwCUy3pRSKEwy0XpQ-bgj7w?FgtQg8vP zo%ZT>NXeYS_}D!SCF-}+%&kV!xyGwtI<4;YX9-;!E23SIzQLBVu9H-Au;#4ulhgqR zVuol4_eYg*58}39Z{~jgJ3cy%6$aIgx{c*0ngki{76IXUHh*Gz3u)UubPP5%lS!!; zhY>q66~c~Y_Aw-P4xT;|tlYnkPIIJ|oczJcpWsNpIt#Ez*FvQe94VaUNKcR|PHY2* zCKf}AAtzaMIKhWgAHCEC<%_}1Qbj#!x4L68?D)E17|DAA`O9qp$9-!HbK5srnj< z&+sjZ_Tm7}uZ|H1aBqEMFY5n?Q|arSM1nAf>;%6vvp-Q1QYP_QI8DThZ52YcKi{H0 zJ0M=rWi$z*FfD@3uoUIeg2+YH(Gx%*H(whbCI~E)WH{>^N>a@l>qbc~{U@DIQj+JP zT3*( zYk*T_fayQZSw^MTP>Qp_R^oHJ_JfgMkFyl8SPW;`mcdz)tFE%NlT&6EKh&+Ge~1N8 zSqhBeq!4SUt0c172ccCrUr8{glg-JX=ot@athMr})c;qy)s$GoIomZAQv^H;D>~*^m4$t%ZKWzG5x-Ob4L~!981H@%EhP z%T}AVF!tI}$3i5Ssm-8uH;Op?Gd?FN;tF;--myxl9reX zJf(|RmsOqKc!+4mYaM8^@2+P7^STezPrzQM+uk*Y-llgw&(oL;lt+wu?{q=kg7JJ6 z)HlDe57Zwq1%Iwd=)QLyduejllkG;iPb$H~9bFpb{`mxdDj(nmc!)#=Bx78GcPGT4 zRhtm?@e&Nkj)X!iLN}Doa@STVVpFtGhGG;;?$ZB)KRi%4vNxW&FbKm`( zuG&48wODSYD-8eP3eI@$D?cpBD*h~tk?k)gY#&JtP2M(8C`F$=-E3ecQ96Q2`jndV zF80vD)^TRmE1fgOw3MI0te**v@0;31YR34!p`=8|YKRH~8>x4DlUF z{23J*!f&Xw2*1e6v<6UA1oI}U51P|9h62y=9s|}1_F_B5E#<|G;${$vg?H;P7GCuU z-4@+B>U(mP4rJHlNts|fZ+R;=aqrJMf9Z9+vhO6k3DI3)sI+N5P1eozbBZSF({vvx z=;{ls1aAc0i;w*jrOt7@BD=?On!QT;C;VKd>f&>Dr|VMSwY{pjUDYh21iTsPG*rCJ zn*&Ptdf`#`unx1TtGbQxNfwL7C~db}0A`Zlgx-!`!FQ}e$>d#4uBf_)HiW;Y6P zF>k4kEZaACh;45gwNLgp!Lv>C=XY!Vdq%^O*Z?1*=Esq;TyPNY(bTVEvxn={!UP;n z>T`)?gd`95E@hmlt~~0WS0wGRF~)Xwag4e^G$(eJj!;WXfIb-vmnoEOen%hKNyye* zS4$i`*f@hKIPqGV(V1z&$55wiQr_Ai#6bPhyE60MoIHS&8RSJzNY+Ocga+9B@z{?? zz3Ka8CGuOPUuo)1Na8|1yM0hIC!HAIJb7;?#>Hsh?HHH5v-WIkucrl9!r@ib1!7R3 z_m=N5FTBrC)z(tc?V^zW$nH~*m$}HMgBz`vU#c5#WBxe zY!rfL4zi*;6vrkxCo6I!KY3Y^Ls6UN(Pa!k=N?eo*pDgEt8OjH=c_iy`71atVUmWu zJPD`PF#L^{Lq>3<`zGM)_LIcweu9nw!htO&0XnH9Z9|iBA7~0bHyq=`hih6egL@|6 zUY(d-Qe%+b_e(se(bC+i+*g?U5=8C@*#S9 zyZ<{0#tq1IIbFdeZCtP%}dEkipO!I&pZgHVLaWGcNgErw8@VlI;^^I|j9d3E)Z=z+) z0nXOcXl!w}mXG+&lYZKER-A8-OIjk|8>AVV+>CrLnlud4GSZ$hY1rmwr2WpMVV|3k zcBe_hMmHmEu1UjAHzVyTlZLHsM%pBkhP`e^+8C3D&2C28DJJaz9BHiRF+9s~cby!8 zK;XhvzS%A|(Mj72;3|7w1J_SwC8wKl;yI@R81QDTaKu=MO99f|de@l38WUV=NmJi- zX#-s1JG^G>c0Wzn?Y8X4Znv?#Z*#gB234}#ZJO3`enKy4T9{i|j)6*ON?Qf$HQ#(U zXcTWd2bbd>+kOQG0W#q2>}J5b(~6(3Ra^X;G2m^&fcH8Kc&i_^=XJ?a*IINspN-}2 z7QH7ecYg}n_?Elt(&u#uZ2?{6_#r!hT6eG=zogg5i8BwkmNtf_l-IH9+^&s=<|g_r zR#pS*X|IeeKNlaNB*RP$qVZ$nAiwKAN#kY~pfzlA@=nw8bK8uqC z>7@4*8X}l0&yiu$n3$@4qWbG0BC0nr07R%tXS?@4U91=V6uId$9mJ_Vypb{HQJMcuTyKVI zO4)t?rBLX}o`sl7^RH5%A3Ylup-j85yRn z!UP*}Xt&R^IzVnsa#V?+|Aj09K$J!2!RFjYT$gX|hP5WUcblKbSUPvFRpNsC-+nf^ zRQwa2v9?cqb(CE$pXW;SpErG@^oOp98$O)|EgeZuofRmcEBWi}D4h!xw4N zjuXdwM6N|QBLAILZ)DWxQrvd2{4w9XU24 z=JTFC^5)1vdY7wj&Fmab9si3bvs`p7ZG2en--l(n*E8ML(s0pubMV$`6h2nPTB$zG zGeH%`NBR$KH0PFgVZz&pP4J1?-b#94TIKNkG$uiZo^p85;rVBbUx(+F{8|ldwVO(6 zclNdBE4cp1DUqC!7gbl9#cszh$@T{Lof67OCK}of*o+sS?_u}r76VPph@Dn%T(VI+ z(l9bq-N&G5$1+itb!<~Q{*=_0sW$DKmrHbD$O(@?q2akysJeC`24_sh13x_`%e}HS zjYcE*PW|Hz8oi**)F~=suJ7*neF7sdSU!vZ6irr)Q-AS)mQ(dTh&)Xdi|nWbj+GY`m?LFPJ%m)mQ-3mzx^|7`U*TLL2b(iw3}5+-z9p*AqC#6whA}Hd zMvSJaV^QV;Ty(TZ=q~Nc{Y6Nq8%c0kEfqANb?Cj#$8>Su7t>#J6(i5LqA!wJ>YZ=W z3gjViv9UG(Nt%bR9w3!rD>C4>oX=oY-x$_oODfi5;D{h1X??*%{aA zJ)0oex@9@(T$@-8ZeVqK&GcayHN&|Lx`48>qk@fcP-4`C7|^-TB-WlTl1)#`jl*R{ z3fXnGa{PA zhw}Keu4NJ*g0;JQms?|8WbDxP4zn#{(_<`zwKYp_#e9dYmdf}d3FM)9opQFZ7Hwh2 zjBo^UZ4K3SVt>DeDz&@&u)_D0_=Mk{Z2ig8|2=(6+59K@3l5$yC3lfw^Ss3D8La^e z%_cFnWQhopT&GS9O0}4UN5Ii3kAQx71U!pJ!0Xoh-DZOkNX#R|^m22^F{D zGIir!xJ)(6B_MMyO|Dzt2p4bFFcwe1!2@6RRmoWl$4@V*uo@ao|M>`ce4H*I;{w#J z5-lI((caGGLtB%hP(|y>tL>ylk=OzEe}XjSNzPd_@8`t(othk}+W6Dq%n|nD%J&L2 ztFGUZ4`XRX?5^>X`oA{51UK*;r_%XUIX@uTY@o?f&ojM@FlR`C5IxIR@k5z}xyRH$wk- zdf$z7OKi!L_s}Y*LeWKNu4{Kf($<;>cFixC2lmnLn+JB*Tl1BNz4kU98pN706pvWO zne{0R&iJ+lOW%T#Q6@fC4y)xO9$hJfv7)1aQhcnOR?}%Gn>0DDrqjM@(&W6FPU~&b z9n^^njBfvY3odyoLSRpOHG;_TGMI2HfaZROIu{p4$MfC#Hd9J zXNs4X^utuiYIsYw+JTpKG4SF)qoS-B`lj)2ya`tDz-qz*43d8#F2a1X=dJcV9257Q z3ZsUP_E&2eziI!TP|AQ(n0UIrElYXmtW0`0r5#XweJ9<)-_gfvYrqnNwZiBRfKMzM zZRAI5cSzZ`RcKWU*L)AiQx(@R9QPW!T!j303+4=ND}s%N?Jegr|gya)PyMFa$$L#V25)*$0H-NX8y# z%0Jz=PZ#%JA9V1qe_lp94beloMW%zgZ^p^?JzSByuNAnvw$iWCsH{)0-|uSetJO*-9ybd8l5(0z4Kbr z#=NObd-9q(3)JBzou4&rEP#*=uPlAWT6ln_2(3eoSTa@w^U=iF+uy7d%2*9w;INCO z{|1?P$FIf@A=N$ghmJ_X@C^lXjiF%kIq@7Sm;R}l9}I9_riykb`DyOl(~yAJnX>QI zb;k50F@MslG%`qaES#8Sb&x}E&8FM?SA0VrkS-zv{IZ2TR*QHUne@jAB1zXM31l5E zIiyS?3Y!@2;z7rcP~sgV^Wt;~ABPsLMCy_L#c0Z{sO$P&&0k@RCga1NDnsP?_R)x} z?R-kfM=641IS!J#kLN@mS)D@gjUck^V|Ey)2_g5QD-aC5JIGHiksoW3F-cEp`i6cC zQNYpunQ*+{$=&>f!p12wDT{eX^?i2f8?#56^RVKV zrT43Cxxy&^dUn>|yX?zzIZC}Sr(;4|e^VZ}QTX9_`CLljhgUKV`{l)N7=_|AxBlZyh;)2&jx+kcj!b=DHDLAieXZ&CGo-2bz?0MRQ-;@U z58jg_)11D_6UM4G}U(zEVP z`pecf%Zp&{G9RuJ0I4|0wh=xD*~9PtoaH~`TZTt(+KVyeEN|eH;2-6}68MLtrKCgz z|47Py@DDuZk^2;+>{S-qH+{M9C2Rhv5XZgvhZX-d+paVZ;cjx@TRz1@)LepxcsG(a zh41dJ`}u-ybe1Or<@%vrKBl&gkDqAa^=G7J*O!t|P@4k{Q1oY*LuX)W{5H{htD+5A zXG!C{ohR}p-dx^yL+!?Zotus;0eOp$zM|53Zr&zk;=ao(M)`3i+WcY!EU0TQvz9#5 z*G(1WV%u9=Lba=>b&QVxxGOy6Z$W1>p63cD5p4Q$5EA6zisE-Gu6p*0^5VZ?;%zdTtm z9C$IbJXz3p2YylB(PelH1$KHHwLcC3J^6;e=hql$^O~TL;lO*oLp3hrYKY_?qbf^E zSj)}%M2d_h#jWm=Z;!hvL~Unl!ygxc6?MNwyO*3l5vk(O6NeM6JsnN}`1-nY zgz&~Lef!pD*@fkF1fl2g8Sr`-I?jzIoCu6ML7v(nPsQtpVrAZqIK45uJV~4&Q1MwA z#OcpT;&k-B#AyricY-+i_OYoD8RO#v2W71DRKSd$!eeywQ8W>tmZnFxv)<4n*7X;# zRw7}ng&wuZfBzHt@4oqztW8vbNbhb@1yXjw z$<13Lsz7oXz-epJ-cq5acY8tD;GfMJJ->=C&{E-iSaB4QC?Ifai7J2@(PvD3xOkly zZAJ9c>V77wKy!KYGppj6is&oGY1iLS6HHlsMivc?e@xG}lQL{>+L{id`??C`y_ zFd;%x@LpnJrF&$jwjXH-s!KL8Ghk6{=4TeANrUn4N)9d2S?hL-h0TV?4?nQW4?l3A z(o!q->#kJGxfc;8S5(})jwcy{cN1EIL}iHdOYE*Zmy?4Yhm!I^W82e|8cO?2qIV>T zRZl~i`CoevW4>BQ4ddStnVe$g*&oSj)ZE%X8sXYoE`=8Z%<`_rXUItCCYp@*2qr=t zJR51$ioOE1(p#9UR&*tA#IEJvEbp3k(dV@r)c20%*_<<&_%_~DsxasFPnn#PcwG*k z_Lb}24(zQ>_yZG1%`4@rQSEpeWr*#(-hd>8(O7b$V6Oso^fwoo+-xHJtwT@Jc{pA+ zqMLO7(h9A?a6B}^oQ1e=9w!Z4ayvkTYp2m{BHqn28;AD_%wA%L_7bpnvxQjPiZ0Ho zYXy_ahCgF1US?jG@fsZdnYH*4^ZJN+ebHKcuX(-Kyza6V$INTYyb{XkHXgj0O7r!7 z%aNY5{ONrE9cBe?oAs3b@s44cm?#iN*WnH1b-6y6Xc690G8+dG6D`8~9k2e*gPleV zx!8f|-eEnu7qJb~VQnKXc4^{xG~TW^_6+$(dHdGifk9#`@c8LSbxy0Be<-_wHGJ4_ z&3lNtshTCGsb;lc#dZ3W)~nWL)O;Z|yUP!u+G|KH8~&=b@G2(6s=Erks3vpa#pd;5 z^ZKH-u+qF%n%7;{!n1e{4sWsIBN8cfr}E$(r(FJgT6MCeRYU;oTZcz|Bwlzh*aHL; zpPuzUg@n-yJJE1jb&n=Kt@A&PH=pEYYSrD5`1G9rX@dFGY(CwX`1HL0$t;ohWh5qI zw3fl`&r9Ud-j4pLTh>Cq<}(tX)Db?ZTh>Cq<|7iH)Db?ZTh>AoJf|*@_@s{TN!_v* zDhh~ICtG@rT^-?*x@E;*BGJ2A-?6vyQSFwulPm5zo(KhUo+j211AjT+%N~;C4Ui6} z*?X14DBj9IG7~0*$cOoM9D^*k{|!D88YzFTH@Chn#nN{Z;o(q9%sL2a8NVvK%Iz9$~dH%TS&d`(f#h|>NwO4L$9lQ7|A8Ui-VV} z_InT?Hm>q`R6wIP@k0#e_xqc8%IRa0j{nm9uCC7r9*KO`kjF^83wPIRi%||Zmgau? zepME(O`Kupe!?T6mq-%soY9P-n2wE)fxO$XBL^Np%dwM&sWKvw=F5LHufVtO+bvB&?WjV&!Ab4~ zM=AgLdw%&FU=-olupB;C#^&T3t2z_JV5K0>pVcvl`3%J-3LzsyahXMTyBO zZFx9$(jTcU6ss%?#VQ!`xt+)`)z4SPs_js$dPwMmis6+;J)IpYCdynZR$~}h6N$L# zz1}cq3KfzkpWR(HTsd62(Ta|u&y}%CDxH{zl0RIGTNvT0JE?(yt7x$2Yt^jEV)Sl3 zD53s^oUvSBOa~ks_9xnQY&4NHoAah}N%K1W!`@o?xpAy9Xbq?+F=@Ot>8*^>X+(7= zGiKsf#D;zPuBK!vQ}RJ%G-E8y)m>A!7M;QbSISx?Na531LPxZ)@jJBt+?!yc&)$R|H?RLx;{(yS}7>^sl%0sayo@LXuY6um%=dm7T*+Y&k z8^NB|vO+ar4dA~r@F@3PQr(MlVIE72E~`eL)xC7zR@Y}Nb8B%I$S%7fw)1)JsdQV1 z-FfC_*<}BT@Yai?l!NTjX6yFH03`yhG1nlTK5ie8UTj7_v~CYEBm&-jp(exVEz#n^ zIom?c z52z^M3V5;)_doGe<|(X00&ke@>)v5rKlr8(kDI;(9<0wSxA_1c9;?cDOB`}?2@G(_ z6HOCP_`i_9p~}?=nMs(ac7XD(z#kjWuv})8xY6q z%{tJMFau&@3$-eg$qq44|%;iMIxO8N7~??!;`+;BRQ7!o}@G|IJgZjd;J8 zWG{vnMCl7RP70S|arC-D0D>6^0h$nJ3<5CY-YUKbAJg<3Rn20>6-XgWpm!2sPD#&~ zsrEJsvvmg0bP2mY!7UG^gL|oILN5Z6_kHp)*5T(KpXJ_=bw?M=@I*T9j{CB{tKR1a z=Zh2W@`?pvNnoDKIi+9p^B z6!R1JDoS0lx;}~jP~gknO7Wvhc}(*on>WLcS`7g={Ai>}+nXQVEf%sDKY9X;N)BRv z)?R~1@uNqz35<_=>+dw>9Qigs?o9#1kJ^=#7~a3)MQVvT$4-CbR<-hR@84}k}nE#lJLxilpn_7UqJf?JiXtM^7-M=FMn5si2aDFkzNJdOr9_!)t))n)v_0~6T7FUoz_Tv*&R%zPtrBT=i~BG?I$*%8 zxz*jZryg9KOP)RMV)l0c^zk?S;Y>44njITeuM9GQkiCI$ zUyY^Hf z`o2Ti2K8A3IPahJT^+qEoh!2l;R@AuHe}H46hF~?+OZq*?ARnM_%3v72>sP*+%@lnnjAlqg(BjQ84 z48`X|>)#@GRDi>9K-=$E3 zE{AI8=7FHInY_x7ojl-EOgtVehn;{Aavsu~RpG+~IAFmoN6zNTy0GbPc5JLLc zt>d&MV<^6l7r%zrw~j01Na<`|%>v=Kgj`_2s5!4!WqF@5y85tFIP^^cO%2!eq9v~n z|D@nWa&=)hrhA||$KpHAZB*yJq?R<1?RX3H8^TzV^d~sUtR966@3x3pC})`^^~=u% z`-Le6Xc0(;(y{#u#*1vVgKfo%(wz7~0VRUu#9 zcOb?JV$#ZsYFrKW=DCl6S9WY7J*dvJTgM20VO6sW&CbZZsxN5otdBNUN5W#+7_qVT zrW8~LcEiS5Mn+`L(f{__i8YMn?TvMs^uQ5)9YOjUpmso3U*Ydof|VjzJC!$0uSRTb+*;o4>vYcR!H4oePkdflQ!! z4`<*r5T=bw_&-}f{sy-Vi&So>sB^??cD%xfLf$V;k#bS_Hm{sXA)Y`9!!!t8>Fo4! zNpoL>1f@x9Vm~&v&{}%oQOoIf4ac*2c3+}HU3hf*@tDM;UAp%AzC#<6_qREHxMI18 ztlW^3EOl)9@wjxU8`jy*xIA(XA$M^)%kk;Q6Ebq&NA7%bA3^RT(^E>BnznmKg4rVAx{^QsR(wwnNj8hh>)N?Uxv01mo2i8(i+& z*@^-`b`V$@8ORM$k#R#gu8JIPXOGQCkSNQtr;p7ux99l@EQ_&uWi?%a>H`SkKf+r4 zH!ZGOB8yLN%*a-zu%Ki64t>^YxG=AbQ=8E8WZ-;s%(*C|IVO(x+f88tytUiKJ206c zVLZ;2n~F=Y_FKhsfP?)`6AZJ{9N6t^lGKVebnF2{30JL=^R0%?AbqKA#iFMRx$a*U z#}Lnm>E)Ov1a@$s7+BkVAYk@fBK*Rs|5Zmg6wxrIH)$HYmEbcn8uJ%BB(%Mf)!4}v z61#%KGN&K8PePB;+nBJeT$f>&&MdI4u|I@-&1KcR?fxDrj4}axg-f7AYw~`8^p{=) z#!b=L?)$Npo-g@?iv`D?U*P^)GF|bQ0yGcl?Dcj$_tV!Wm}X5NSlWR9XLn6RxZHAy zH#?ShU|s)(_;X&bFO1Se)u# zX{+X|kKVAyjOPaT+h6yEpMpQm7PDEs#CyD>z6*6#ZVd&PR*Al5jN=MzU#GO{i^{C( zlMLC5=Wg1dT%!1i@gu96Ik<^RQ~VKqN7jx?6j0yJV3KoJia}cL18nX(9yfF-gGIiR zIp6BfGSgBI{W&GGKi}V9e>|sqe`a*(Au<_2+?qGC%kQ!4~4V>t5Syeqc(M z(iO?{nsdnKrllU{$I9%_nLYI9 zg#~-}=TR@!AA7(3`Dpuo`xBf*Kwkgy6Oa}!;CY+xG15Tp%>XMLf3%1up$b>y!Kr|w zvD{PXBn%r}L(vRrf}XXVeyCC#^Yx-#{5q=`Z(;Y>n1iWH!`XVxlAxg;s*T}%zvVMJlel@i zhHvgV=+g>WcY+j{ULSQ-NtU~w4RR1!$aT;JYG;+{+AL$QIxO=D(clXa0DI}a6HqjmdV^eJ)0wEH;PB4*$^z`=#v z(w8@uC8v+{5L2$165KZ=o$G+Vq*C@mqk^BZr((*vF%dHWI79AsQUFkDdfhn&crxz> zs)B+sj&v^0LF~(YcB@~1vPriPdWY|`@DswEA(p~dFvmA{Q*u1!cA~fO#vlVIonQhr zw60lbV-~y<66v+03h00L^=mDjWF&`A+`lmK-gsUz>73Rt_XWlKj~$deAMh`M3SIzP zf;z$j1$0|F1K8iR|h0Fu~{OVQbfBYgS0T*?|tUS>90C8f_YBDDLy zk^2)dKzC!g{C#Nx6ay5K=eOOc!7RkxBk$dUwpbBkZ$fn}JuP7xua>(2E5_)Swz%WA z_~^rhTC?QWv)xQ6s*1!Z2QffCaZg2H*G_vlDEP{FG)R|`knG&Y+M&nCAP{I(VzLhE zC2P|$lD?VktjXYRgLfiHEEWdD`#;z|0r*X08c<2LmK6XN5SxWI4MxpYUR4U^G>Cpi z-=U?OOgTQ00{u$lv6V7!jlhKJb1yuK9Z3{oTAfhfZ9%A6o@aUo#JnpdSD$_&2xat%Nm%1|(=3(A?pUfYC%W#{(k#Ss zXEUufAi0N;YeLo1WVcHcQnQ203Y%h(%FI%PS&HS3->hj(PL?T?n1OpfRI#hMzP}mS&rPKz~4i?90KKIM~}jN+_Qk`5FzbHb>B5SracTAD=PGhFaw*kmX%$R5fM5 z*MOmnKCa9$$JSDO9ZY>SbBD8k)zxiQ!=y20(&1rc?h4k9x5i*3`%C1M5~hYl`x!Yi zWIAi{t28IJSLL>{zP%P+kw20D{QU3jo&T??{6AOzhm-l+fClyddhh%SGUnI+Bjx|8 zpC43+%`B{aA;%p6@%J_-#+eR`a>|&N@>7U}bDeBA>lHV)z?~1y37!Qj4xkm3cZdTe zILw{}jI3xD^uS!(+0};Asd33m$+Kzt?d6fJKI8qOz1~Gv%=rEBNHfrFzWj*3QWX81 zwd|D(_R8M|Ze>;fuv^}vn16#+?p4Zr5U)O-kpDrGe?+(Z?@*bae}wW&QJ2xvIrJ?3 z+HrrzGgedR>j_+QKCHm~6R^*a#^Ha#Njf;|zodZJLmABKRdYz3;8zbbQulM9AvP7u zb-YU0)W;$M!PI5vw&;y)yk_(kc^t?(zY>!UtSWKuM7Vz(mcNPhFf ziGScqVJoN36c>W88DZxULxXNr)?pLMVMH60fU=CP&F~dzccasRznrp3RH1*{bCUco zf+*lK1dD-*P8NTO-z+hPdlG5G=Q`D+L(aEh9h$MdS%da1K6p1_FTcrTcYGwt}LT5?-gNQdg} zn~@xb9${sG2U8el4Wx)URXk{eI0CoRW3bzw+T4lIg=tfrQ9s z0X?g)`;Or>*mJsQUSL#E_hM86R|)5r%%b_Ssw=ARmozic#BxE#i>{<@t%=dx@8pV8 z(SMY+T2I&|&=t^Sj|iw*2~6GjE+*&T$p$UaZOf>3s5--#ND znBJ{cqZWVMDC_rr(Yi~K+oP-v1yKULV7Gk3iE$Qmo%nn-ws*xSdTju!*y|^-_XDt_ zs=th%Q4>#^e`I17rv|5CSWm`YMEjZJsqsqIN3HRRXy0o!j3;jz#`#d`X$vZ1e~+>> z6}eXmmS#V>T;Sp4^7t-yBTQlmQLyKBi1|ljyPdvc3JL6{k7gy-K#w5&Xa%#dORgn) zQe!2rcHZyvA+uII&F<0tmKa%5znxrvj-wD&v&nedvpb0+K@vgsNh%qxC0p8;m|g^g~&V#L%_TUaS$o4Qc|3&5C!NzJbw)*wqLF{e^*p0 zGRnU-H`?6CZoY*zdR=t%#5^nhSwy&K^Em|$zW)oGj%NL7xbsx`tP>vz(J#A{dCYeD z61K%IxjNrk+<3C8oWbAd%pCuC&ngpuD)8FN@KHP`o;|?qrw)0fX99?d(r;QWe=ZrA zib8}T4aYpxx|HL>!U39cjL@8&;Y`wpIT3RzWaYF0IuFGOAl~g?F_SbdYm~2Ldrrm7 z7by*|CU=`?AdllpEusbG?+LQ_U~EShdw@eHUJep00`W1mrvC&wA}-LI*+zdDKH&KU zn|wY1B^Hfs;74j>v}>)X`N)gV2M=H%=fvL4Onuh2oXPDj3w6zIxfgs=^oNpQTC19@k>9=N`FCL+j6#W-)7HDCcN`Lr)+Y=nfYBQk5HXflIQP%akPZS zk@pA%%sCw=^gPNYn`*ILCJ7&#Ba?)WxrIqx-1qR^(|9+~t>^h| zEsvKCPIF2n(T;aYF1xm3CZ5|ICgqqA@Ke_|nqWSrYn$xQlTL`dVQmhn;1RzTP5m5J zE+QqxCUW5?yR++dDxX~12vLEmrG0+pJf>@(J$to284azsnr_ng;DvdNyp&|>Woy{m zwOCE#&A8DpBffjbww!p`cgL7#7xeb*J7Xg4<)V2e5$}nZF)`%0S0PBwT4FUk0N;0z zoq&IrjT_PEN!zXXWjqWLYNDm+%EosYha%<0krnk0TEk3p^IWpQowpydvs+)uwnOhm zM@RDJ&$JrKKg08Q?s=v-KKSV9=<#{;Cy@7KT28f7R(xK5&Dq>s(!V-VR{Yf=HR0+K zZf_q@R(#v>HAAb1>t-M~C)8NgC+jAco1qH^BTt3it*%CHp>SFbe=g~7ExTp_7dH>Y zvSX@t4(2(5sK|}O**ZHud4v;>=y?5tp(4IbU91t%KPTQo8>1!T^A>ROw59rQX~SiX z!#efr4I28Iqj+&8?^+H2p)+75d##2k{WLo_7U;|L12Pq{(~*@^2J&Y@u3hpEYtcEJ zF+p0N%>w=UPSq@ zpd8ncm8xBg8h&Pb>TtIhLMhMM;T<1vZF9Yr-%5Vl`1P0sN-=ZXCmPQ_E#v4Y-aSKE zayj!%70yn-W|%}p?1hT(Hu%SxpeZPd!XSHJ%N6Z#lR*&shCQ@E!vY^BPRbh4%;)$$E#{j(YlvT)2VWyC zX5h%q9oaEIgcp)?BAW!6YeiM*WDYMQLFR|i(CaoS`@-*5Ku(M9I^Jg(cW@D8$J~+0 zFrt_s_w1OAa~JtHVT)ZkQ4S-`ZqeA4rmX2QpG>MhS|Md&Zl z&?|Px_3(U&I41BUcdwGM@`m57mLx9aRK#a|M8A|EyoG*kr(Z3R__gV1UNQT{RL9;9 zI@TiC;?}8<1||V)M+N;2z3zlM$#H8C=_#0=Nf@zK7s)iMp8%1t_*qS>7$B2hx}TM$ z)x)8`sVEbN;$`3W(C0sTdv?zljz)nqveC_r#u6E7v{Lx<#{RTOe$IyJI>pgEb(bw! z?N9jZ!z`zE@n=Ggm*)q(x^ORiwtuv_Mq<;|`N&Cv+^X9I!)MJuKi7Fqa*~%*gX2B=22x1dpkB=IV zCRuqL6UnR7uuC#av2Rc{L=rM5A|k*sy?h2^1 zZF{RH`#pUSKhO6Q1l#e$vvv3lhSl9->t*rjhHIv!Vut+N#M6;<4JQa#JFAhvsZL4= zBuWG-$qvLLa0}A57X6qdNBg|kQeD)o@iO;z_GFw&oebmTknIOP3dO%ks^$OUlNqB(9$Of2;rx7@3^{GyfwKMJ`s&aa2Q7dPRAJ`tp2Zs(SRu}y@|Xe z&#nlqt_W>n$DYSG{%Tebl8eONHG;995j(l^lZ!SQpLke~=x-IkS#4U{;`7rPqMz$o zoni$E`qdi-6S<`w-vuX3-f0kIC>=AR_@}uDR@Pn-B$Zp6h4qDWQT!VQf*wD_=Sfod zC?ii~tf}#`?|J+%tG8$09pj#ca#CCk)^3yk8{0wwV=g%ZR*P`vE(~y9NX7*oS6|$nrI=BKBIO?ls|^ z6Z#;uregNr%=#8!-N(q19*LJ_bt_f6Ju{&tUCa4Lq(^6yeu5K9RD`yZ9vURI$pGo? z7@y=#xU{!!CwGjIPw&a3D(6_Z^Rqwe<3A z`nSiJ$!0lYUi00PYYLJnXoj2m*Kdi+%g2mRF z6hDg8YAuWGjW*ANF`oNjQbdHMzJUdS)elC9P`54og0AeDFHq|Pl}hA$-jwEhrR=^h zHM{Q@z~l~~Y91Ex(D)%x{l!#ZIxp-TFBBs|zO1F0Q!-~lojEW=7*&joHrr|i+Hk}q zB_ty3bd5vYJ6KUC?klD%hFcm9zr@}f??TY*!=spY&|jx*Kr^t$-*b4{t`s7}T}22l zigVSkVI#Vxl>jeZS~Wg)@G#Vt|3SKClb1xM5m>4ddp_dH7i>t)W+)O`%Z{|z=aK4K`Ru=`Z>b(f>es?w z*DBIST0arw{f@@xA89(M-pP*9xG+FRqiC^_J9{DBS@5erfx;_baw zK&j`8h}N>%iD>i1+l^ot?kIzk=9FQB$WH-C$Gg!Wt-QkZ17p1jWxEx^Ec8LC^1m-`RXDMaQryn=g~fO! zD7?BgJz4lEh%$|7A}dVQ^%XLa_5dwa(IA=C~|WUqUx8BbAY@5Nm;u_fgElCD69#QuiHM-h!R$$P z1jHs|Y5=nWI|94ibObXXHxl6*<138DUbwYHN@X^>HUSzlh%F%+U+^(E2?zKF z+Cdo>f;HS{GWt4lg+mGjVAwlC?x`?5f;Bv!j%}4P_s|$whK&t^ot-8cMnY}nvv+&a zVH@15Ez)`*lY8wFj;3SgrAf?ukq&+=%F0D-Zy-SxsNiKz+rIkC{f1eF)673|x8$2TR68iA|fM^;Q2Qq{P0S&;NP+pW_}y zJ{#%h(eYc0?@ve=xP`w`^IMC*Ywl<9x3u`1$6Jf*&HV-D`AsKSi*Gjf6V3f?1Qndg zmHQ?B1olTA3n(6soN?0M)bs?B7E?5&csz2(KvOirD>}Y-JaR_YYpQjkS9C)0c;t-N zP0;|aXlU{HTx;QGirg;3W6fGpUfeo=3Pj{7oQU2}{wo4G%>Rf538>PVomXDI&Wbmczwc46B!F>wT$S zXu`MA1qOlqkJ23ZdI4#U_(EGI#b+o=U(7TMWN5bR&_C=@CsKi@SU%|^mmov$hgZ8L zZHKPt8TH$-8LTL<9iq?)I(CR9D4ozRVdXJ|ejXS9G@*Z81I#4!JI$DT5VOAoP3-NN zx9>|4db;uO^E-sy_>Wo3<`$F|-<~snqSe?+v>WbE;lBU;v#rMe^zJ{y{ebzOBLky% ze=7F_=O0TT67Rl{dxZUZ?y&DIH(UkpkAT6XfA=Bcc$n{sDaQI>jWg@^-hFt+)pbg= zv+LR=+PO+70{!)39hTkNEi#Wwd4AAZWS-wZI479W#=2>@{_+Aj- z#C)&mb-|VI)o|fte(zd}3|tSgqnYphK|Gl6nHZA+7s>+(>(pnfTOmY1ylgo$?qTZ9IdOK5A*xy&s%H49Rmo0^`l3-@v?i?y3-7d zdYeC*{Qg?^xU}bG#dGuKPZnpk8fP%C#g&8RkG2}m*Ay?CGN9Q0)coOA<3#UvV6pw_ z`6pV9U-E8qi|xTy{4{P-@J?cRaQd-E+iIyyBh!#z3lr8y!$G64)8Y0f#D#N zF$0~-g;Te~!;=<+CwUZ^d3)c-gUsF9yRPE;%)(y?86%H97cE{Q*^3Vlv_M;xV7*hirhgek$?ZBZYQ?3rxJ3F*_^sJb|&%A z(4Zl`uZj-^^w5h@#=w1+nHb^eAq_X~%cfJ2y;kEl&|#DnZzKMbiJoJ#%C>tt@sscP8kr5-xT6vT7PHu0Tb>qv@`Lm7Y|@m#h$Q}^ANZrVXMDdK3X$a zz)ipoE{Nt^R(P$`oL$&mneWsc*mQe*n6-F1qqkSoUOZ!$>~E=*JA}P_4>hL=E2CI6 z{~%J0weSw4m}uxd4%>5<{(PL*D7%0%JG6r`MU%-_S^R938P_#$!(@_wx=kC+7tyg+Lg zyMjcork#tp@Y^AFwrQuFBGZmJ%jwfeySomI6g~H%<}~dO_Md0+F>NN-y1yeZ798sm zf4!>bw#RzqsqRoctaWP*Mje{Zj_d8Yx87Z;s9b)$oIocc{>>u!rV;-c|3UoOn9bI@ ziw%HMI%>VQCgEO~gxf*y85Q(ecdq|l#&i1fowe>%0~4Qr`+T1!hf>^Q{7!s2a2lOf z-|)NlSToFe=W-FOcOJjn;;$zM8@9}Re8xOxyq=Q1w*ekSFe`zbQ`bdWck>F3+qJiIdP z`~kLZ=pi?KpQ6LG^NJXh!Ow#vdh?yI|GdZin7YnQ`{3j!6W+jC@=~#xSNPX_Z6xyNZoY-~w?maL^`!P6>{=q>n%X5E%py9+Sa@;zJA4z&8=2!F7 zJVH_A5LU=)P-H#ZM1p{wcX|G_@e4-aQ;Qq*(a~nua&T7BioT}+=3yB9KQPG4I}T0U z<^>~^)0_oo(_XuN`vIL9m+l8sJpmLJ|3=FMSrX${(@}vdKloc2V_0F2coj*lMidDNfTP+_Sk@!cM-}9dBN!WgMKmS~Iex^Wh*K z5eNTv`A*7M$u2a2w@bEI4Krj6HQ(l~E<1kCh-k?XJ>mUsCa?`3I1Ic;6PW%nn(GN~ z1LmE25U)U6crH_mFQWoxVlmkUzBT;bJnS9jWzC-|E6J;>Hm&?x6#@B&g8K)8`#!;a zui)MV+_Ccm_leJXaNm9yxC`WF{2bs+u5Ka(p0?`&w+XleCB;)iv}?6{ZU zV2%kZ9EGUyF2{U@_4b9t&3v<5-m2b|Mi3bdF;&Dkp9VEWkQNmzxx7eMgLM^l`c5oW zurm{Ha!uaqv6CC*nYw>vqm?m0EvyBaob4;9LP%N}oYjHah5oKo? ze!BLKi*O~oP*v$XaSe6I07dpY_KG(z+F3Sn=UKl~3i{=Nz}mXw6g&Rakc3^%jXbo* zz!wEtH(rkM>>q;FWrZg&?r7oh{GDDngunPQ8V7on4mDcuzI-HcMTbFh%-n$xo$s+1 z>Cy!fYY=BifW}aG5M_!MVGROY^=n7S9S)pIXRk?)+FX9M7%GP|&O|uA`E-VaC11*R zj3~{=5jnbM2z@Qp+(k>W0oCL1lB7K#w#V0xY!F{w4?W4_x&Br7vga=z+7}(&$6DA4 z42^TzZSZBh=o>fGbfmjL%NLwM7#HZY(8aOxtEIe*4x6ORJyYKTV3+UU5Kbu@ey%Tc zDZLeqBBrMnTRy~nFDnpA;hhpk$ zgI5B50fW_EYtqmZ3^e2uG*)I|XsNL;yc!HugG+GU3I#t+m#x}OrW<0DR30KK)xcZTRYV4s1nFqy6p{3Z$49ein%_a*(1OJ=?ICB6VO zkMKab1^RU#h)+xqVTDIZgMX%{Nyr`60vL}UxV+a z77ysjjEx2NNh85DAHm+0ECAZOE+|ajVZxNu65I^p*E%6&fh6rmldQtTeuPClpW5V# zp2D0u>zHrb`0j`Ws+RV(^UM7bHnln`R?=}tw8!_-zLM&)dEenIJ!^8u9go?oKnMM+ zG0iw)xN7~6OmH;^`)5>_AxDLdr_m2xn8f6PG=*L@8+jDGOY8;+=;$OD|ZtH!)!CyUcu(aiY?na|L9{ z*F-j-`0j%ogpdEWutne?UVQvE*v|@vixL)D-;?#n~LbmH1{r767Ea8Obiq*_8Jlg1&crV?_&X$v1cC9D< zwVFIO#i@J`WldKVej$~=f==R5i*S%khC_Y|&cJruIsl=esvr5fz5w2x%UXRPWs8r- zwm2+%xR6xD?`qlG-JMkaZ;8gg#@;%6H_jt3@!Mt&v(Oo*?$xQJGR00P*B-O1_BaCQ z#2dbNCQ!zE-HHGHqFwtv<=U^a0g}{h_i@346<_a@#YgYM-z>d9nWrc4?^zx7PTM)5 zT~=pP+=A!huFegTlj^vRGXYT^Fj^b)UJz49dC@8vN?(YZRw8dEwsCaoY z$2@@nBMF4Iq;ghr3U6d+r3r{ZkF+v-yNaF>;#Qa{;nrEK4Rf0t7OIO@xS_Dt|Gkf2 z_HXrFM=a+mYgX)!W|-D^{K0X=d{nQi{t_N4q{w~zs!OqT%e{}|C@~8Li;M`_k;SPj z_O|M&zUo!P_QOdp($k7rv4sXiP2P!QJAU`KMM1osW5*i|Vd@6n&|s*L-~p~?A5t$< zy^d7$XigAuX2@KH+^I&j;r=F@1ma8Iz-r${gy(ZQbW=&_lnb`& z>LMaPe{Gi&)2rn(6mbJ9{7JlH&wP#;0MlOp6Ql#0IqKWo#FbKZ;>BJt6LD-gnMWB-T0`d7F|3v0(=49`)4#gbcw95SJ^?jAA4mo-H*L0 zpfYJ!m}K%w+T;Pg`%Voc$c-kUYh@~7%to@?yhlo?b=EzQBRku-{rvz|q#4rD7L>)_ zV6i>%AsyS^XKnyl;wbJbIQ0P^TTeg9eKf-Md78q4SK1`}tK|Vve64sBEK@)?i)Oy7 z6bndRsh-VLUvH-RMyC1} zGu7^^EL7&b6}0bV{C4N0uP15cQVT5+EuT@^1VOt$)A%87$UWI1_n|JoJqbPRCRQh! z@vC-!&1by+89UwAb&6DOy_a$U$J%|{-flS7c2+0Xp-8^l@W{dI(D$*?XGz2;$I~T47g0Brt1Dij?q5Uy`Sg} z=6t=0_ZE$x_50tkRQYlu)o^hn4^|>u_u_l_y{#v{#f=XFQ^M#s7Qh7@!cY<&I?p@wZ%t$uN34gO#L(Y) zp$xGjB6b#7)f;%MM&(%X$GVwI z9})u}PzZ2hUF$uTt*prM9R7BW^zhA0$_h;pLJ+TXcepoElZOqIk?0FSg;&h-2BZu) za7t{Dr7+t3TLTYbNLY=RQy{UYh5B$=g5Tm(+vu25PXr|FM#TEwS`fR``d)ja03+sU zdTc%9&j>6_Y71l~Ga>Qp@y7q1y^q!OW4a!Z?lP-tg4B8nM2760$b}VXkncB64;1&-3HQ{P28>Wx%J zN*lQWudLL5v>D-iZnm{iNkLE|_Qw}~tF^4MANr@%-4XsBRgdIgK~VEp34{aek_#~D zKB=K9WhJYvQ}T56udHSB3y&m&XbxV&(zk+3!nQ!KiW-Vs=1u6lwpjIX-Y#v}U1pWF z^9ri*UDbcJmp|bB!=-n!3Bq#s&5Vesj|Id>ACZC;X@(sHTpu!u)^hiS3^uJo^Axs- z>veP{sMKNI*`G?cZ|?#K!TQ0vHmkp=y; zl4M0V$VL1X7E})T+^5e~U8*kB&MSiR<(rKgr)8HBI)&AO z0U%;_4uW1r)ZQiqX%|$Ek0;x{P7Hum1;oHH#+6sIYv&JA6R)WPNvoH2*d_a_UnMj_ zsU5E#VDQt#C`kO_eh85{Gaz84fr#)3zqvB8;sM2b+mkpGPH5PZK~1ZnLtGOwj3Y)E zA~OsK-H2hKU|x46f`o{Vo>`4QWOd^8O167TxHQ4XNED*)N6&jhN`Z4LS>XxO-}q=0!>v0fu_I_ zRA+mls6<9IMLArFM3kR+07fH;is;moNgf)Z2JGfJiKbldGCqgEP-k8769pfWv7$X0 z{HRjFkJu=>mlHXrj7kC&DZYyK8%}e~wi)WGSfh&o{z6K<1o@Sr}BV8v)wT3%HZz!)&LAR@k zBE6rV_{uK@JJIVj4m2=(hFcdQi5fV{ikh z;&`zgo4{an(3qWW3iB&se3T@<}6-A z2#|j@(b#hpC9hXiL}RZgqfhK5={@CiPJwsFxUMR!bg)3!T2u6|mXTdmxGnJj^>|F= zNeZqlOwdyGvWnOTW^6~gGfmVr4~1D)D`GFX&obQdk(=EIq0W&l9#6L#o3lA`>S0;C7P6YMra3t#$e<~7yQNBrkFEWDVOHXH#2&8iT}4d68+2Vi zb|=`3QY>ThSEwaSn?LUZjXxF{G9&Il9@KC2wpyLf5zi~7zm^H`YBnf9@f!sauOUN( zuV{F?)lel`sqY$L-F+UYX(YL5d`5>ZSfP=-N%7D&aW5;*)SR}7U0Jb-9UQ>V@iYjr zC!Nt#^Qy9)*ikl_nG@orY1#v`;9|@2uFAB5P1zhl~egH8Rt!)u(Mj4u|*JauP4S zV&*bhSZWPYT>6z0WOh+KcrzOF+u2P)E(iXQw35VNu*Nr!k3u9(6NXom zyi;|f(|kE2nu=6AiCxFBsLhednL%&K5TfZMnfOxTJR?`?*087WlTP2ubKLW(Z2Wo9 zlOk&vt%u1t6Px5g-@O<7PRWO8CyN2UnVX#z@f%7Lr=2N0CT7q(iS7qIURR1Xdgk|K zjP+H^N(dRKwRa|tyB8^&jc9WzVGVV$U~W*=*7Tyi28NYVg~Em)8bQ%EdvT#>;vRf7 z<*CDpsfUIq%JqMn+4t~Kc91Zw!J)0FT_Y=w&~d7)})a*b{; zO{fj_8SWhdBqjs1S4jMxZ54g>aT45fYe3~yr65mY)=xB`8ne03QAqGh>)2kij=_Jm zj;#h`&eJ+}5$o7jwT{hT9lMfstkqk`a?yk%(jQ24HH*aR)v^=292|b0A1qaq^4;@A zR`p}=xK|W6J%i$Y#5{@O#wGIqjh%@kXlhO~HPeIjTZ@0JM@-i)rommpO-jkp`EuIz zucZ$l%-)Bq<^mB>C#2TzTi?^fUX(wJu-@1`u5Gcx*@cO#AaFFMXyE8VzOco>qT3K7<+v{Wo zG0^}OVOto0@ykK6(4JkWSCO6)&M>n>Zu~a)DE}3hp4FMt+rWU%?PCLtMz8)SLgV)| zs`dJV#Bpiu^;3qES)dTS+ z1L*{XiBd_){DW4*H~*yUMW&IRiGPSGQ-zl{;80r>BLC~P2(bDGB#IzD(a2Z%UjqOPa8^DI$5 zgJRPQlgkWVglc3`B@ANxcLN4dJsWY|4p=~wy4qY`8WjAyDYygJca!U^ne3lX$>t_8 z8=XS0X@?LV8`*R){{bT7pMqha+#Tf)N*O0sNSZuuq!kEpi zsh_9%)wg8Sy)3Bv8`V8Wbv^xK{n+ggNLKaP8TG#s)W2Qz&j{+L$j#OF)8Y?zwu>*P zo_F4@d%-hNty%2}&-cEag6G9)@T{)NfaQ04gXLX!_X5isRan1PFa&(>vo~Qqgr#Je z@hwOjUkz;3u%xvlibNz~N@p8ppxys4^}mwVE>1u}{Ryf+ zA*i2%i#y*dY+ztyljg=3E>>m2&(!05QBsNE>o$#}Bf66(1((2xER|>TI8xu`IpHqj z%Hn&%l(gN7lfAOeh(^~eVHchgjThch5qn+g%h*#+>+9%h_lqA45kHtB8L4@+no?a1 z&8Edy%>waE6$cG!)o+#qf4`%3VtjJHGda26IgfQ>y|+%V=(Q#O+^AjmsYL&(2oY=c z8VYB!&;%VrMBDveh-iOW1l9+q8Nla9lLCKQ=352}ZzsA|PPF;+_NpX=2-kt^<*P_q zmGr*hUaiiJEyiI~4A&~hOK!dOoz`gh4Qts3?fn{Odv(y8>VlPkg%i&Egm`)R$lZ+e zGyMO}JpSAy@xAbD3AShBGcc&?Z1x|oS6u}ohL>pms08m!uAh?ymrB;p^8}ZRSUqj+VIMyCwr|m8CrvI~qWc7~7!PX2`P~>-skR+0O!kr{07-IfIvuzQK~1Tv2P z)pV|5&M$lK6yjMgOy#2k53Pnrn21!)5nL2kB&S$ziks3sf{FJ=S{@Jl6tfRlyoj3Az_M1$- zj=MJ+J$*d;B(%D|e69H< zs^Ny;d>lMU(vMb;rFTLkyqm)PEIxLg(wZ|qXaHy?9n*9_lMZSiEM^axd%W7;# z8bu+O{4@PGAN91ft)BZ&K)V^=NGQ9W*eE7uu|0ujT3_iT_?T?QSvAe;Chb1f}8RrAAg-26tAy^&J(3xc+ zV==(6u-U@v_SnX7;!xzG^S?RdC95iRcXAQEf zL3no!y1amqpud~cq4FZTq^)YO+=-=jX;1Y3k-FSB8rqI*P-Ms#&pRZ3qTEPaFd7wF zy-GW@^9!s;h`OWwq+fHWktvM2g-X{J=Ff_qkJ9DqV9RxqfJz0rfM2KM)FirgBzqcg zYLbsr9LQ*&F39Xq@ROGrw7$MYxWVM z8lzkh8}w)d(kSprqfkXqglZI-iZ!UZAfT3%Jkyh246*n)gd;i% z1CIeurJ*AYl^;wmiNnx~$zqxM9Q&tZO6u9TqAu$-A814y-f#T&j4aP-T?&x=+66fw zn*=l%Ff6jq{(XM}u+co{Ug>jvA%YUKLwaW1`etG0>a*ZY4hWDUZ&9DC; z=ccPTevIC?v;aq0r+#}EnI`gMFCbAJ(}hGfh;84-Xc&&QCGVeEz7YqG0LNbC7L7KMte zCOd!k>ONJN8Xk!rb6{444;|=SnF2_Asi&cd<+o)QWpzFn;Y>@+&X3Tm4^{cY&TprC zye~2E8TZE|e0&|zMbYNd1cJ6ngW;A(YRa@j7qiO|J|y)(s1%JROvy`fypwl{+mL{y z!<56rPeE60TxZ@sI68Aewmox7PJ9kNaMN<5GY4|=^jbAMb9dqbREkN14r`HT&OsN5 zrn>fyoGiIdqqpIl2Ksz-Z~g9h;Eb&5LgUKcJfVP8=QL+mx@o_pWos94&b+lUxjcj0+(J3c=7m2K63R3{CuwwrSc z^~OUuJ{VoC{yeGk7<~BJ)(8TofP+GTLAvGW(Np~y%e>T*;DSApJbZuD5zcDo!+a~i z2$Oz#(4-t!x#wsr-J66&1dExfFY z_+mM3)B8-vZD}8HXzn$rsZ>u*@?&DxWP;WEK}|(}@+y(QsiOoOS_y)h{-(EQ-yW0P z-wTskgg`O zrN&>dLCKjSj|%bpY(viS&v^g(m}8=5Qt8Sl`D)x&MDDVfGl~4ouF=qJ{YWLy7bFufZfAXR6L1ebg!!f32 zOQ`nt0k}MTL3d;%u^J15@`02e8Df7Xi5n|@<&se?bRJ`N{K=86I1#QCM@cnZb}J5(nP8I zyb7gXS4N|Q2v&}r?qnlZ$q}i<&aoOFR@VV5oUw~@?u7QN0jFG=#7p;lTef#0MTReI@LThK$ zDdw&87pk|qD|tgI2X_b`Fkvp-->4||y!$Y}$@A;R-YXf@C`#3YEjOTWVw^^PvzAUUMv*mX(i3o)M*SvJpIFO#c#D>{|N4xqL_IHqOnNKb zUP$$eP4y$)x*IhA@qP~XbY?%M!^Cxz$)=|cUgkb?ZMt#8$cvHbcJtYotiiV`95CKY z{07KK6qHH;dQMEC1C!plKWuwC%GqmszdB@l%56%wun5dWPk&_hi~^tj*cX|;*l4s9vy$)I z&FHtis(7Sp!_&KSOFVfUNe15t z;$s}Lez9Nwhne;L{^kUFQ0x_nTd6}=a@NdR;yzXd`K0F4y@Y3J_aM>%rWX|ulmrsN zaI|5TKUS_mEwfKbRMU!xi0u(BEThMMuZsO0;}QAQuPwMN&@W-P+;yw$oartWHMma7 z9=aHw+qu!;-3kc?U=q^J7)hj_W56F|HeTJtZ<3rwf_>E-9+zdi@%IZrPc5! zt{){JB;6hRGiu|y5FDI9{MG}8aKjuC>ly-Z*gBb;pjfOUAC;^e1a~CfK^2Jw5+)7m zeGsa;0zZ2@_JW*2zN_^?zObkN`sNC3Id55wyUh2niF05;_nb3411Vu3%=Rz8^OxR!E`Iu^U($b^=}fA1#`6;Qi9*9?a2~}%G!jtx z{a!_EP6o;rg+aw`hJQX4sWY z9(OZGoiG8{=8GQQYs+ZxLX3^g=s6_rRIMqTdPIf^cyess@p^m@e{j$aRwbcJ;WF~Kj-f&%H%n^Gx6E$%%oSJijttJ5I@7UA-y;l zi67Uem#LNL<5j78DjIv$4)5UjNS_6#Fmv*~J{!?b1OUxsD2_`py#1~7b+aDr>pYTQ zoXFpDIE1#0jaB{X(3r1OzpcjN)gjv9vwdVnNxXq%*ZI5T_ySu%k*tz1yrEjUqU_$} zd|@>do2|@|3^HE%T-~et8MW0gnnE(6a=82nfLlY7-~J50^Gp7?qv5XluKqQnBX#@# z^rt`NT8rQ3tqJkz4`#*Q32hFymAq#y-cC_je0U#R=R!oRJsYD}?ES>PYdlarQBm@D zYiVm4xl8k`pSI+Xll39J!2M8b;V-zX{ou=1gY5bM0Rv>@ny1E;v4h0{j-Ho=_Fl7L zOj+oaGV39?V&>b?SW#!S6Q3BO@?+|;cBitafpt^wr{}{x{0%46?-7x@57qCQaTDUX zzlgmQ+CZ1ztr=Ms*W`KK6-8F~on0TP|8VrJpNf_MK&#O^%w0>*WDsZKih3ps&Wddm z4(xeh%;{G7CT(ophrq&FOS~R-8<-}07>$4S!JpH^VazY4Z}snsk-Bcvzn@Nuk69Ia zr##dhZi|%csaZ^xlVk^3)_~^&-}KS!OTsR+lpM1vnNEVQtDN;LzbFmFNx6(j`% zea1|-8Xl*5G=2lKvfGTgBK8)jwDM=(gdqQTcywl@?tmHZ)JgGC%VImqL%YdJShA&N z9Fe*ON$_VBDxvPgW3#>Cw(-VweB{;><(ivcF>`l&UvA+uH|M1B0}Z9%$EH0m)Dt6{P(G#Yy4jpnvA{)JJ7{=i<(y6rv|odA#I zm_pcxCDHIM;m=qff2_qH@Un2IEanP{S|cUTSc~7F&>&I(*gdg-Bxd;CdMrZF&HAo^ z*4-uS1Vzh0N*O^y9ssYB_@yy zel%G15YZ~uEJ0sy_#R!zH(fAaAGtg6n%8#cicEfhK7aN#htuazx9e}q%c?pCWrpDp zxWl&*q{Wx^PM@`eok*(5B|YQ2tduj6yJdzv9VO2v%>slyse9{T1HdDi&*9*lz{S5B zP9<6mKLO_Td%Ka~%vmj}p{QMNHM}F;9o%(}^r|SPrMrG&poyru^?u24a|~uC-gqAl zz)=Ph%OuY~_?}HOs1Q%wFpIO`9IHcen1Lz}AJdjuD3MhEc-HS|;Sei)X(2Y$8%})Z z`&3m*uA$UeuNo)lS*f1A$}>vQijoir2bwNDsnnBgJdxT@1#?ueRRw-T2P^!e!dky4 z&!{|%=W2G02oHL)#DB8RypfHLP$!97N4A*Ma6f6W6 zGO!V5VAw)NDSAuLW%LiUoujs6mMq_@Msr82q}_O5*Q(jhe^0JY+L9RJpwaxS{$r`; z3&@FAI43~B!e-;#j07W2LAx08h(EOA4@#wXw;fuO3;fy6!>8kt-OkEF>7El_LEuG7MVkS{|o6tMW)R;eAD#D>-|Lx zo-iDmEh7@?&_h9D{QU>IjWxmFv=!66Qbdm(p}L(}+m;UUzuS3N8oQab1neee(GU%z zHE~LHUUc?W^|p0KpBQ;3JJv8bd*lW-k=~it)DHM^ zJtN4P_f|^hD2vheR;!MJ5r#X`6)4I6guVU@t1iGsFneq1cq@yv9?w=>nMW^+)UUMp zO7`zQ4(lDRf2aJ*`*)V#Kcm>6-BSP32@~kws6+Hm*mSu5)&1~a06zei4$vjs*B|Jv zO6d<$Rv!|!trD^EuZDCJ?FL^)Zhln#bVvP$W4i`_-m)Q>*I{5BqJ_s8UqO&|gm7~N zcg6O~tp3+G5hEG01#!WLBJd+CaqiEc7vW1}xx6GjtTDKJ5bg+rM}X28n>o6u#|3Ia zP3hIdtbg-BgAUxFmhjr(6^CS0k$=V#nSoc{{srPpeE;{n&S`_#X5n*j;#Pz+|6afu z*!m7<(Ys>rp-)Lu*vIw}!EYSokp`wcn+2)5SGza-+h_wX$AfPXO+ZR3pV>3*wO{^l zZ2?P0U$b6t5WYq0N0J`Ald7h_e*1ei*S$JU2%i2S3{RXRCCX+RV`;WzP)r58>A_x1 z=sgZpdh7)$Bh~?bY2p8;V_Fhg(ZVhW;(BUDsdGKP&}O&3Q_#6N2`?<3T@kI09A1G@ z(XXnD@wl{N-r{=wGc>skJn`g#E1y)m&m>-Z0GKlWd68I0{l4z1iJS?^gB1;?c02!f zl*QWUg>=CS+7qvPGh(k9+06`8znD@mn;A|CL=w+lowq%0T7&_q=X(3coh^ZWE!B{b zln^Nu8P8T+i-uajp4JfOY5Qv#Y7j|CDl)zS1(J&L6Mx$QI&0~SXd%_wnMW&OeU8ep5?ImqBm9*>Yd`Z7w@p97Fq4Uu+2G4mKkOsl? zeA&>9w*)>4KxBpnj0C8Y)(qH0?Ua@yF`9wX^#Yw9Z}=Rwr3hVq z!DI@KpMM5vJ^X?x6r3>sB&%_%Ul65Ws1+~eHqckBWDK;fueCE}jUjfJ< zI28<`z?nY=kog72Q!sh{FhJ%PoIt^p`Nvz0pYjWaQV_M`eRZpS=}InY{O?}>wC?!k z^=+;RTfzKhe0RS;lHj{<`31puU-S!t?;5K!UG=~Fn4SmUH5>Kd<9xT(bp)H9-_-%} zjPd@+F9^Qd>=y*zz0EK1zv~U>FysBKteL6hX^Fo8LF!dv=p5kJHrseC8qY$BIKIas zF2UT5@ckHz{n9a6i7o;GpvOK#7PkVImuD@%>iKeUP%I0{lR2^sUCnZoUFIz(Z3`|( z(X#vrRyi}xLN??6B=bdqkWC9_uI>hVciDxy$XHD_H+ zKkOfVPOFeS`%BvHIF=7iH6PTg{HyJZ1HX!y9p$lSA_NPWxgk2!i)<8)b&yyxI&+6p z--R0a*J5+aytp+=NO_!7zn9{h21*TvP~_C_JI=bR6JM^tnff%uI$ALr075Ei*BH+} z5BCBh{jqTOrC=V;A)T^e!)p< zBT@v8n_s;0DyP2ns?+tjZr@_PagJBn`YCUgT1(sdzgPci$gW%c+eP%MWaIn|PJCW= zXF2#3pVMv6+#+#%_U4ltJI^()Xs!D`TNYk@&E~7ZTSjiKKXAGAlhwTZN0e=HHCePC zpCP`hz&7>mgdd*zAwu$zrh5w>0xXRnXl-^aNV#$_%CLpjk5?f({g(pR-->s==Vy$?-7* zz!N&v&K8BN$6j?b7wT85)%2!h!ej_B=mC8l=E9z2ML=iX=nEFBbE@HCacnD%^Ic^t zuaWnjskEj-k*L$_r4eX|SJcuPtLYNHUDkAI;jv|ePJ+fopH>EqACf+E)9BM$v_rrR zFxLP8qBd|&L-yxrftMGuHJRIpR)5?Vp_6gSA>o99L*sQq2 zZ1xCuP)%+m_8dBS!$%N^N*MC0vI%bF5Re^LOlV_RR%k3DTYf-V`B)A~kU|92rl zgeos`Z-1PwU$FagoEd!-Zx@)|Bobk?u+XFx=Mt$2UxG62Ke>~W`oz^rLtc!=VvO-a zRX*}k4w#nNC4a@f%TT0Ze^Gy4)gL#4G>4w{%4hliPb%4Ewuh+MrDLmkYkT zSNE-+Y_AIY^R?VemG#iRbK==2J1E~Ph*^D_y*xEv?e_B2d_BW_wOjYJpp>`!nd!p9 zKya3tAKCSLhgyrIM3?q_3s?V?k6qSX5Asp`{!;L0kN+)`xUbrA7Izxpy%z!5kc^`P?+NYfsGLF z?M^;oPi};M-#X;P$iUv4+@IW*J8Yymo<<6+`GK4mVh9pO@Ec@}Hu42~U0BsK#^hg_ zX7Ue~{@ycX#M-=-sbtHo1nTTsY2?{^?L7y);`)8C)D99kw(@NwjxJit5}q0~p&Zo( z_64ia9}M^>w(Fgz1oP$X2mUAMwfNBVdg8(K`aQNrKD|22lcLp>_}~HdV@Yw`3DPHY z=B16VRcIT?gA<5jYv7D%^&YF-5fThYcatdyemue8eoqjTx3vhi^*WDWH}LB$Pf8(~ zg25Ad7KpI+V@csC=M`uY@7jz z&U`&O^V89pQ?i}97Vk9q?IgnF5G-Q);CZ%XlHgn79{^t#q5gQePuhF*pdM?+fftVR136xNd= zt;Ln-LW4EvSE%PR)*y~Fm^G*(KJ?2*0k~swJo|W33!)A}D<+jOJc?nVn=&fIOx=_b z^o#%}<@Js8*W2+MvO6cuT2dCjsN0$OYfh(|y1oMjim`#1J`r|gM=}VF|f~>G8H_JJT5#)wFhgFZnQfQA+&~{Xy6EX^9 zA04GYrmn9*j>ZR{nX2notWfq>vxAFB)zpm;pnYDB zp;K-9ED`IMJ~6Rci-sCjk#z0N(CvS0Iz{OXoqFPDFFNEToeqXhpS7A!Gs@j`!;YBK zM^fijL!F*s=M2e#N$MQ$ZTCD0u~AO~u^0*Qze$~)C;!jV-*th?n3G|Lq`yhMs*G<- zsf?k&q@H(zYz?R@Mz#nvDLro&dR`DHDXyjTc1|EzDsH6F^D5CCLP`Z8Fz#9-&w03} zFQYGBU=+E0Lb|~=h(#jd?`C=;;WB=m$CKZ%pGXR@(iJ_RXTi6eVEuQVNXkA&KWwdR zlYXa6`oihb7hZ+FuvBA_zOdcs3-=)x{uz=#E$F3`e+TK0S{F!v#L*_+&b1n!H=UKr zu-&MT%Di+$C>C35wnoFxIH4}3!^R({v}qSw-yBcVY_-0T-}*`(dFmcn&ndNbRLdxu zqp{U!oLL2nY_!Zjc>ygmDHS-~aVa5h`st#~^AXl@u~GOUOCW&!GR)1$pHAHlZ&fn} zQFo2e{;J#sIXmc;zwA7ooFV&(V0#hFOy{69c~ko4_SF8O#EES-0xi)npPL#V`WdJ7 z$v#d=Cpj$x-7*Q*n4oM2pSxbv%MZE=$C2DmM@f=I-Dt^48>;!(P^~kfFu@DWALO^Q~>$VenA7%wpBRenCnP!))h&?Hd z+dHzdjQJ$|-z+dN_FX+zh>G}hkN?Yt8sbzV%T_PdScSZW1a+f7*(m%tO>5QwSrl{r ze-_yOqIE2}Bs?Oceo|@h^&ZB=|L&5Ivhm9z*@>0G*xmkTAkcQ_VVbBD<=C)}eK)_bt#lpO}qFK`aEcYYWcXz#q> z^9S?g4S|ZcJ@x$*2}v$XNzP7ha@j}F_n%Q!AR0f30RKtkF^|6AM_d$rzj&cX->>nT z>RhU066v?<+5c7ge%+VrllGeP>D@=u_j)TnJfq^l^c|4O{ld}zF;a0G(CV6fPm*+p z{m=I2mqtNbniZAqMDln_of>9|3f7}up3gHYu^-QXAerg%#*dAbRC0M{`PoT*a4+rk z&yfE!<&lb1dl_=d8>EHrA=lijZlRw_F7_YkuH+tt^1p}t6ZSN~x6)m7z8!p>AIDP! zAK)41#aONNuO>2GCn9vzW*SGc?-N^YpEQD>ES+w{X%G87XKsiZt+>pbYQ_Jd;X&j) zPD^o6J9X?uR5uO&%?#b#?cdDN&9}@=Lt!lqjc<-N%qR;H5D~t zab$8FIxVg)n~t57-mz2CIu@z@pwEI*<2Uu?G>en<&@MZ$7TWk@23CGAje46oeBF)n za{mteyvFw}YnY)!-vyC)SqNVl&QqYGxR37n9`S49ilvAbrK#M&nM$f zC{urlEG*7QHHLI`1%tq$Pbd|_VW=4xkTOI;0z8?r*xzxDjot!20N zUoO0mMzE@rzoDvWeECbwQ*-&buX$2lV@vhD%LU~9-p4`mGPB-vPcaKb4Xse8#51M}VY#1CNJN z@c2dg>2mNj&Hf4Iz~FzH&)4|X91=CO%|V{RcGE#z(l~*$?%( zk(-J2V-A{+Y@wZBs~z6m->2#*{ZQ?Xv>NLwUR`y|$d;0Kt?#wO%d$);u?z*R;GF{= z4s4#3t7ES#`EaCmZVos+jZ4$vkzOK@mFlKD3CJ1w14bPhf~t9KPW|>ims}>3sUIWB z!{f*b-lxlSDKBCs#)CtY?nhRcXJ*KQB4!x=z>n47O17GJiKL;iS6Tks8vN&YZZO>& zY@Pw8KVlt_$1!_pOL1$}DS)M9E2CBiFVWCbr=UQIG6PJ&y4&^e0}s<<0YQ${V|@k1B7Tom<}cw$<=+02is9 zCzyVTOK-fh)WBO8~BmUgA3iy@ewD!T+b6#Jcz{F z-7V%te;X(zXkfURrQ^T5Bt8>UWCF8>UF%;Yrw zh2cb2oN8WgPsmf7PnE?w%EDb%qkrAyZY9@a-{u(XAfWm$?eOZ>^`Twd&;ho)~aWn_^;KJ6TdhI5%Dp- zW?YlNBa~rdbzk+lSX->MJoZBC0n^UR-H~VaS@YcUX

      *GBDPVFsmu6MzuKo;{_j#qqMd}{?1(*B_RSzhO{U7$; z1U!l=>l^P5O$ZpMARs|mf(8X)fVdLb($axy?I;Q=3b+MPTp8^a9F+vS8&b9n8O3*8 z#?et{2Dh1cM~8`^kOc_10*WB0tU{G7iwj8rA>Z$JZdG>&aAw}``7iVTKcCMG>8iTR zxo5lQo_p@OO;#?d65mqqs20s4*|bG(KaC>c-Pk2-E)Qx3-7eKJZf|)N>mL>ErA4nK3u=qXrBlot z<-rezRclYyXub`&J}z97VGWj=NQS$ps4aDLdGO9*)n3VJQH6$Z;OxnjI6_vBnDZiS zQA2oThP6qyej@zJdS1KUJ*c;g@8lnZ4b(!=E#9;VK9Pw>i(ZJ{>^TG>@OVJDpXiZ- zYWu!g>mjb2lJZa-yMm0YMR`YhlKY~g@C1ofN~!={YsFPRsx|9Vd>8qJyqOzeQF@J9 zidL|fNL1u4e1~q-BI^KybZOhiVeugpSRTAF{7pvr!D^B# zhZ31W*;znp^mWvd)ffd!i=4&!&`80dVmDY_@mvL2w-r{F^I1*CRufja$cbSsLMwt1 zYbJk*DS9`4+3@j*Qf&CtpDu?}LFRD_u>(O9gb7(wk#KM^ zOH72ByB+%q$=Ss^ZwT*@DT2!d_w9v;=c5aBSbOLx@Q!&68#P+zuwP6}=@^jmvEc^} z+4y=AHEevu5ar_=kr|-ob!*KMhu5_!kF}@b8rTBK(VM&v9`geqeQv ze;>-9E;nb#)cREGI4)1?I1#74!|XxpSXzXOpHbt!8?}xPPPc}Ty;JPN^#t&}EDL4L z7thAv;$0qeb2Y)NzRU^avJ#UpJEW@UFf?Or8fvpbS0R#cFm%M~7Y^cT6FRVMXp*ANpyrDKPG%~y$+N&m9lUdP$ z{e`!;;pEE6%D1-Sl)8e|iCv;X6I_nulGV#cvQ`7s z&_4aC#P&4wKpuHY9hn^M{KYCG>^cAmNOEGmaC*F<1_y{f^DYv3xduqYF->1a zbE1>7hq!}{t$y6;fr8qioXEQ1x7wmw1c@QX0_rTx(4tHcyAWrS+VL4}w&!1@Q_bPu zJT2OZe~DdR{Fj-tp-35M_$(^<;&-_9=$_z+KXZh1t;mT8Cl4v zOZ%u2%T?TZ5Zyd$bX7B}8Q*=fbyS|`tP=O~fN_h6mCrEKEaRz_(aoU&_K_=e@FlL= zr39>mfW(X3cD=;P6hC>5kG$bsZLG%{ZYjF zwuL?Jt$G4Q7ymh}e79uz=UM)pmgTPzt4XDj@WrRLxk}ClGND9Pw85wOcQt-ydyKsBA30Mrge8n!w`t!)||Rqm=yu z@65k^P0B78R*A7tX)B*`s9!BA%_rEnqd3cF3{7-R$wMG^YnGJfccfu%T#x&Vy{8Yz z_q9FXtr(E6mv)M-n{{^lUd++oWbg)My>z9~fD_mWjq-yF1;7eOXBEsWALe!iaRL1D zEa8zfF%><%95#82cjf4jStxPX+Jl6q>$>ow00GcKc5}MGsP`~NL^8eNFKsrr?vUYG z-G#gnR(C}k;-lMW{*};=SQ!8n!Ltk7%sP|k;X{wc&-ACnd_n=^J1iF30N0;vkJfr& z2vNJHDN~NeZ|pa)k%@d^R7||ZV0f$z6#IqonXn8JuoZYCN@&Ppz|dS+Gph}(zRs@3 zb*FdE#PQY8)`Du>m$HCq%@llsiZp)?^0}sv54?yyAZzxk#>oYcm`lHAD%(*#+?bSt zg9;j=oAFGu+Z;4j-r=76T`V%Vi<{CqSPTPOUif|?s*2&6*jA}W*Ug;B+Z$kV`~arw zi|YaC!_Q&NShmVC2DfXDS$B`LeLnO@_F`&Z2xM_BHA5?-80^NA&qgP7hZ~gBh9Lda zd8@8M4aiQ(C6Kba@Y|8n$Ka|^uq+pPdarsLh%58+I*CT_ct{+8TMxkUB<&ZW$}$^k z*nMz-N@JwDMlJ_SrK$nAx#n`9SEo7yznd3shk^+&&x6`hS?^OQW_I|`yjQ9I3L2nz zi3IcfZK#eeZcFvbM7_oefsTsgzT;p(g7%g$6s5!P<~Az1edgh}&@!;(z=BJP)I2i| zSXqo1QkiF{XKwO4dgj)5p^DT!1;~#U{uYV;)dfi8zYo`3x^KG~cpS~c0E%H} z0`LzOgawRk1+a;IK;7$M;sy5+11)(3DeT;EVapR#T=Es|pIM&VU^~e&Tn^Y!9`{(p zu7;FnBFUy7QTT9kU~*=%MYccS0kR2X2dyBp&vEh-E;~_sv^Ux?dGc;H=d`tT<}qzi z9|#_IB)Fg12{AV%L`IJILw*e)FX(g@=08kMiWo zxR&Q8ZHF}e^Wn9kTYmKFHVVE$9YgZ;yNuvD<<$T*X(`)|Wdnilo# zeF_)r?F<%>qq=qA2drg)yjt`9D`Z@wW%9O1HbF5P?OF5L=bZU8csgruZl7K|F114l zWZ!MhMoA2RLP0e~j=JT59Q!1{;sE09TLJRLkK(r@$+htIr59KFO=U>>;3{K%ieeMw zz8oyS%&)FfsA5(#_}G-c2Zl`aNxUE`THR=$EdY?J&W&u5VwM;hLDM`P>&}E(rUko`B zLb!uH-KTo8snkdHR2VRJBz~>r-^S}}#mC_FcC0KEUTr{ZKgDiyD{N=XIdf7R3Hvck zmEj%I$as;!=wivDt~Kei%(mox%%Ophe7CZ}KIys2A$u zyDyXmEBq^7LPuc9sYF7-KMD=C&|ifZiL#Ua1Yd898Yzf5zcuN`1}b{QDl?fCHH-t9 z0Bp{HU3VO8+y9mZ+f{@OqN-p@lV9t>k{0X5aj`L;*!7-1yq$6O4*pwM7d+i7QxGr& z^9Nbgsb`dpLJL6fZH@xPkU1QT^F_3J=2n^q6N{nXyp0=GA)DXTH8F$5=wfaqy|k+y zVsB|YYvc=-YQzl$@LxQ-I|LXzTNkC;oIbp;5HnE{?klC`~FclY-pj# z3T>n|_cx?_EHl9A0Jb?iIKycgd3Vo!!tP*gn= z#8LdJ=vr_bUHygCGj{mhFz~@FtpY}WAP)9Za&hg<2ZSX;B9)JTf9wwY5KiW$H``#1 zrhvCDC*~^6)1caM(=W)SMSI{C*VM-~U4%#qK#XD7hu4XoVCz6(|KP_MH0qc;7QoN4 zqOyDhoJ6DD$hMD!nOuq`I@$Ec9fLEQ0n?r61V<-Ad#n%f*;};;tuFp={Nt?W*A_YS zZhlkfeWG!Ct2jq3UY=I(>14fn)U!5oUB~>1hpBU+MK$Ajl-3)+(lwmwf@X#2Xwe}c zL*q&pENJA=RKM|{oF#aVjbAO=3-2Y)#mvKnrqQm+$G&{jl8=M=*cp$om}>S8siHF1 zq8<4?9`qoDXN&ocU#7HdOlf2Q5d`2n2X0%1r*zofL45}{j+F2aHiG5AR)gPZu#vsg zqrgVIsz-s1TRAOY6O1^pqHM}G zRAQTKA|^J;-gn}Yg6d@X#M4!osF_&il&58#_-|G>ZgpMQmko<`6AQ2FG9q*SgwXNIP!IVp6PnvX(vs<|k1M{*tt-I|<(LZ!+1 zCv-#F+!MMsIVUc>I7uVUIcYi+(G2!{lUS=Jj(uvzIPrX=W{eNijIl!I({VD{|KAJ0 z=}p2<8vb7jKUZI|%RI)a@|{PSNk94;wRkDEn~E^qB-dr(rmV8NVZ()R9Y7lap!{oh z=xR*gxoW+n@EE%v0lLWKIleO-qfJ>_IEvP|Mf4$Cg~hI6zbn&Mk-_bw5BLryY?iJe zpJ%ew;H%y$2A#q(KkGuQjg<+e7M7R2>QO6i_F9hmShw+FLzF#y0m|0ljpLsza@6D-VSjYYk z_?K}HKgYj5hkpsLv0oNQgwx`6gpzm@tC$6mi2YI{`jZ-{r?jFx1Vzi z{@ecXMEGCAV(Iwb{)c3-|6u%M8%tbIJIQ*~HJ2xKdFYI!`i8fis%`#2vLvJcen>b5 zpu1E2x1`|M@xSbGnMZ!(arx`3LH6dv`{WN>&toerP0!!=OX~P-N(_P>v_&I|DlVdm z--1`rx!9G_R*9(4&s#!Kp9)9>OE}VX{&j#uHULHM0&uAQA_(9J z-M9$8%1n3@AId;-^j~4h+1P;U#>-r@Ac9P88KikJ++NY|JOE*YV8i4ixI++Ci(*Y zK}CTudrY4ojxoT%9+nJW4q}tM)%*Ij` z=x#u(&1%1T8XhzwsCpx z@F|QC3Y!!qwD?sq{+w*cVRY@mC&yO%Q_({(d^q zJ9D4r#sI*|D%f0NG{WB;h)>BM>o@lPf*tCy*Ynq)x$xE_sG4IvjNi`sqoF=0coOz+ zZY;as;}7rN=WVF>1aq*5cH``3IDK9B{{n9hdmHOrSZM}3*&p!b{?7i{yPFY&TEf^K z&VKx6o^&hsgX-LVH+<%MX0>IC_ebu>S8ftbz}R2qZvYJur-o`?L(S2eFA@883bsag zK&iuQwAFl+xEkIHg4|G#h~u%)9N1yFF?_IW#)ZbmK=}akq4%=sBaoYw@NGc&;K&)L zsl%SL54&F0wU<_Dk1(vw9xn!S#A=gzMn9cBKv8Hkan9)-IB&eg?Xu>If1GdsOTFzl z1#jhcFU;S3j~z&set@N~MQP6KUWvbhX1k*w_=~=KTeHd4*v)3(w_q?8&zs!7_g*iT zMgO9D)&#Y8=^P6W8e6ilyFF}Y%70r5y z2$Mx9>U@loo@On|>9MzjG4%NG2E4c!ZzX1DfyjoFEdNU?{o9@ zI=sg0bsw9{6>-qxlk)ZB#VFLr+KGA!9&GEO$UblLXQXwiX>0VUBian1+O)mUjrD+Bg2_QWO4%#T|ua~n5zd1pzrZ5 zw(jo0dEQek=GX*o+Jm_A9_d`7O-MGfH+h>bIZ&Zua0M9)FTR4voL?R6xH8L6<)v^AHEYsARR}ahV3|<=N4wA6%T)ijz3au1yRtv6*a9> zP)yEy<`fsKzTIX1?I6u~tXa|)pi^-ldbqjl{dqYbm}mUxtv z86@&w4+!H07~V2?F}I)amSHYkPm!JRiqvfrPR4?!0%h1jm)5 zqH9T8{G-Qz@n~>>D^Zowr@r`f#JCr;|~mUV{m}YB%XY8{0J2a@Ds`gV#oy? zfGWUE#N04tI6#H$tTOZ?07D7?+?n6k)Gk+*=A)3`&fGiq8$9qdIpahS#sU57C@CK* z`S38dJ&H)$0rRd8C1jRpD`YI^F9NZ<*k3Tu8!OJ^Dn5a-4CY_LzizH}_L;kJSY86| zV~8?jgzxejlk1seJmVix0gQUm=|I}!`0X(2GYgeQ_>I;ow|x9)b+0L0#4vD5m5eYP zmP71>dGsF?4II8_VXb3{%lZzAE=}Pu{zGVF8?@nXi-hD#&u20w2hQSp0U6EX)esvd|s6qJ+mI+>?p;qI6OLf2317fxx>!|M)!U-F=S>san*q^#;Xt z>!NH|;tvkqX62e6Gj-j;mrwcVZk_=n3TjfdhcRF^FlF`9Y73G)=Zl_Sk|S;0!jbbu0$5gP-Dku34|% z>o%*|Tn6cR8+viFwGf{jeVaaei61Nct|J&%!#Q-5vyF{PX}@yr(San{6sEuIm7Z_PXlm~!TaYf5mP zq$oLPxY^&Dz#`XgH!^9=SVBI1_92?3TEuFNf9GH7k@NcU=6SrCeMl|KB%e{d^`vXv zWbBy`QRr!8o#c9~6bqTR@}ZH@^jrB)@h^Qe{WB>qT(!j)$XBu|&@hCvjIlDjBPYBI zrs^b`Ty^0cn3Ki$!A!HyMLR{Igby>zhaM%7T91KHbdA`o?1=a z1h{Fs7NPs!3Op+QD)yMPQ1Mv)3utII3=)iZu7L#>e&dZc_e=b4K#%SquI|Pp7y>rf zQeRi_o)+P`?C?RHPW^BENRCfM-pLYk5Z>$Yw*+=M0>QI5 zKUHvI#vw!OV`QR$n&Ys-BB9gfWm#eQ*gz!zQGC+lujl_2f9)9!w=m+)M6jxP+8!*z z-m)>h&%ASj(tQ_TEHn~cZ{S}E2aC|e<~3;()KC`q^2=aYz&gWijk6qkWgVBb?R4D5 z7AV}0Gs7fP77}@64+a^+fWTN4S^dCCX&G$-oC53clyo!}*@fBd*7tl0fQpzr|b4Q-fYIEOzOCU_Snp#YFd z39&ALou1NP0np(Eyhdz!*T0;nV#_gQ!`7~CoR9M}`^;~)%*W~G8o&{J+(4i=55a;` z-AS$-^QSqei-msxpf<}u@K~u;u^P8)b z65%?^Q6knN95BRs!RAZgBO}!=Iqz=`G*9=Lo4yh=6--Z*bYToKQDS}{MQrd!j34U` zhYH2+Z!L~Lh3~ZXU+I>Fo9$kS_7lGo{AiIV8i5E$9%f@UNN-O9xQWr=XDxaQ-h+>{ z=p_75^MLSAUW$J%#uxC9brJrau>Z5(u<4E7LGN`3fVa~eIys#J4?pI%fb&(B`vHSe z^IN?216L|+(oK`Z=5089NVpt23Gmi`k@uW>HHciMD(C7rS#PjiPX@OI#c}*8!X>p5 z5G}eH!?8x=1y<`b)oDK4QiK)K0ifDeb}91QTaq=SN}0m#zw3&b4Jyd7EY&Gx^CA|! z6vW5uV2vUZq_CyVr*Gh)p9Znm6Oe=*(~; zJAC-$86ClELjjU6mj4u%l1PI_KOU-R(RWx@oG!F%ys-^aZT~_0|KGmT)PW4r}G%x40g`*8B_AJ{q8UPgx4<8yzRtZSe2B-5bps z^#~$1dv2bO6TvuSu_t)0=rRgkAu9R`w`$QlU0R!|Cn}=QVsR#zNg~X%uK@ z{aD$&|AD2~PSDICKVAfHg*A?T@nB3yyLxeuUy|)y* zcbflrEgKscJGF`n@YNe$4h{dcHJII2dSjWa3g=I@d$U&21uuQ^Qg`A@df1%);U`o5 z-|h5|H>v)Ir1k$PMT?hm1xnFBiE;`E^jQ}qz!b7*5pG?kBtl4{hKQ5GTeWJ-CdxJv zMN3)8YVZ|& z_6kWTtM${B0|Z-S=8aGVKrGLitcOb-)`mJ?qBKBapY%gR@CEQGm)C=1qdj3WJKS{g z4A85~3!MkKV%d*`4>kuU=%u(29nnYFzJV0tteOS*>7Q;a6q#*ciax_wupg^irNDS-wN5+ST^JF9+WVF5pG6i8$^e6p=y^^n-GE zpE|c&2mf38iU$16(|SiR$O)uXQ&;R)5Wc3|U=L`!hff|PhmSJLrKJgqQJx3-?N>=IDt{BzN;9_zdY#LI8Z<99qxmphh5 zO@2W&Z_n+^-3{{%%q7=d8?8nP_2n3f13-#@{|OxK(GDEZnbgft32?V|#Jc%HAUnOa zRC8(g_$Mvz9!VoPII-o>W-pbYO+XL-&d}EV^@KyS`Ab22BnR^=#BC19d}4r8^!q39 zHu_Ek@7i|--i7Gn-+}k^e*@kU8{W^L9@61WsvGRDHZi@4@flOx2p{t~mG35&S=dI- zW`n1}&RPJuO6V#3nfad{v% z3ckZjagYs`z;>}^aV)vI4^>~osJsl+tVZiu&G+S)_iS%&CiiReD$$G|F3Rw7-O&TG z!hq(H(6tS5E=S-{l!-l|%Rdhx~hhev_v^;+4%aWVZ^rd(fX zOJ33cfWJ`S-y`_A1;2q0EyAd9H1IH|-*}ff_(RA4-e(0TZBWW@tTeZv5>}9*C|dd9 zZ@|KzRV%%mR(1gvv~rKyM|5kDw4^H)KcP}?ERdF$= zodTC^Z1{(09pm2188zOX`Kh#yMOkzutq>0qp5&0F%zfsCzs+_uD&w$}A)V->=DSZ7 zOs}=ae5Y`wVsF>Y@=$kUD1AAUGdL7@7h58X9MP7acYfR6WiedP(LeF?e<{EXe-(es z^-p7XM(a~h6l2n&r;urWk9mM|*Gvo+d#EDM$I2U2{xm>_C{DdTlTwr>Yho|N+rRSm zB`)hN$f|no@-(0G$2rf#4L<)k*?B(y0X_#OsAr1jPa>I6?-WX7m)WuB=2{)DA-@$BK2c&~{d1|`Syfj->l{|@G?gks5VBW>Q#Baxbc;sRF z)Dg>{p#OzE{%QY4ZF>LjpLF8>`ybnX#)xj0ZNZEBv4*7b#ML)5EnH zb^zHrv+v15zdK{CO5knG^2Kj!rN>5PA-hWXkn?~LZ4O)|keu_E)}A8*@Fz?+*f+%9 z3+^{-G@JOy?wBY?4?hgRqf_ydTQYXyBD?r*^PP@@)iqoqwPPk6Eiy!k?l!l9H)W9P@Yh z$Ot!Jk`Z0Oj*ycq%1LtlWp9UeSt|2@O8lwJPN-kVux*bRjX0S10|aucdFqE;1MXx3 z2(F5Z?)giY&{=sOCnM(!`YBW@jYvTD3hu_l&co))KJz&!KzzT}nCt;4&c486<0VP(gc8!P`ArwMD=|Mg-=S47jja_CUkiCki@C$> zg?`JiXB508b}{(vGcx9{$aGyWx^l_Az8m(C6sh(=dE_A>d9GX{C{a7iyUlY?BM?dpL$1wH09*>!14{E2 z&@ZtT?^S&q?LZ6V9=v>~rM~#zho=^1CRi&8PnVYPy!mN5JnO--$HB87&Sk)pG;S$( zF$8Y64t5PUWd>W*Kcwm5vMkqPP+syRR~|b*#@ZkPnN>O@t7Hd|j{qj2*fXf@F6mb7 zZ(PG<27G($_+e{7=N}md|Jdxq3{4F_IQy`iZG$#OryH?@$qq)d10|k|vBz~w7A;KxQBL5cO4&~6vldlCA5L^$h?=Nel7YgB z$CCUq5yhMFN;OsF8i)LrRNAeBod{1J;W<}gH?I_UMhQGz%SYHP`bAi08|gRo33{e} zOcvO>xkYwM;$O`5t2jHf=*Jm18v6!&w0ga2%;+CJ!eJlbu#dQdh_f$shMm^`+#MWu zT9wd;&ZCVZ+^hE!@-#OxE50$xX##L6ct{_pL!QOw&U5%Ec5hzf=!^~FqnW`g%@Am1 zYxl_K_+ZnFe56IPKvd$Xtq|dCz^~|~MSp{$Ndk!0cJOST%Si~^YSaL8k8N=!UZh&w zNE67IY^VLIFLq_(vuelzM2K}qih2IPDlIrci!kX|l7Y@50|`Wep%g#Z3c{gpI^K#^ zg~W%Ddl{;R^^em_;wd%Xk#!rl!6)5>H3Rk!_`I9X7omGRLn~bhr%rHmtj*BOP!T!p zG;-RR1iqX2oWN36XAFS+BAJswCx~4C(OK{Z(J93Oqu@OQ9Li0Ul5yl)>UvzhCFEL) zT?Stk^DQCQl5S*U^1|ZJoOM2@q_k{HmB_Dje0?MbPtUJpt6w%S{MZI;ulNBu_ipD` zs#-Dsg!z?RQu$}{D~&?H4%8p>E6H?>NUfyjI&FT1ivFMGS9(RvCoQs(TnB$n-1`v> zZ*A@>JnN-3xI7WA+YC%0S^BiWuM@1ggACr7fy=k?J8_Hoeu--wQX7gxSk{~oSxgf~8ktG~Xa(kxw1T-{$MxPm*Jxatcl5V$HxvBrc{ znk9QaNak5eV5a7Za0J9pVMRG8?05|G{VS7r-O8>`Qe6R&?CM>p8g$i`d6p_Ek3{f7 zR7t$4>>4F6l4n`wLx=zE+`CBMO3_gXtKw4-dVmcIggNZBjU;q}{c5wJfUdx5X@+*~ z7~70Js!8{k(1y$wA2il87@Bz%tP`RDG*L<^y1MM-(0MRTv!m<2CG!c+IhNj{IcQ8K9Pr8^m ziX5{DiCh5`QmzINGQn_$=8-clBTPuGzM;mUqZWRZ2{)k^b zV{O5@N_hHlaeb%>NhwQf!>h{!?rLvER%$-+RbcZ1xmarsWg(?cXg}h4boXa$Q1L(8 zn{|n_C3yVbXm6t3pwus}$gzi_>>E7WovCLqW5K$q%;#K<_?$L!%qrdFj5f@?R;Kmv zp`K;ugqt&h#mJ}`K3X=bz41NqQ|-o3LQVAHmi7C-uy)qj?)_==iF|JpT&ezs_QQTw zJqX)kef5mr4_=rvyTAt9&PU9_#=yVFZQbn z2jpw>-^3d|9zuKvHmIm~xq=!|NjDuPTCA7EO}HK(iXj|~*lUl)n>zo!5|dGElt+$N z!4r_fDk=>QBuI=sdkHwTk`>_u*k_)xlqz+FZbLLjMXE~Xpm_T~9~sypQq}BphX~iP zDOQUFWI!r$E!-L8X`83!rJ%No@e+6kZ^w0 zJf=-q$VZ126!lS-jDMFjad;V*&*ot1hbi*3$cK30cO2S!tn~nlfY0Kf48-n00yQ`` zOZ!Ln%$#J8dB&YOlE0eY#8c4HANqjT7?6hF7#cnyeu>&-C?tlb_>=g3koc{8Cmp}{ zFA(kHt+EkZ^3y;lE(r!US5LzkOya`)7@%;1smEV7pYAPk;s+J}R$%s*It0z)32hs{ z1u-W|i>321bC9;J!9|^Fb4f zNHJq%5BTJm@e+)A9>!*LnKHaCa<7%=Vv z%@fEF2Y*xp_N%}=u_eS?odeyRn=!T|+DEfv+Q{DehVqLo48iQ}tMvuMQ!Yp}t7ge)ua)Q3A=i?df){sq6wa38<0GKTo0Va^|34@KVl_@c&@+?(L3q7P1cXe=z4Kq z<--1G6&r-`kPe6{ITL?1SMWY~4O<1T@)drqJ;wP#NK}lrj)#86t?0F&Hge%Yzmh~8LY8^y zP_Y+fen(6f*?nRlb_RL>3xA~@QuABkOi5k6RYf+8>Aa$5sLUy;Y+C>f-76$JunUng-f=GRtm3=+f;#eo6r- z{}YCbtJqam86XrnC6UjU!&S?`4gHfga4+Qa)?1B2dJMDk=hiX^k97Tt@!5aB`v{}O+` zi+`{$HT>oK`+;0{=J)g(8_PObJQ`xlxgXbd_>4L~Qw+=E3Kwo_i!!QB4-8@n7eX*- zPrQ+k6a=g|?|PZu>*;jJ2u<!;7KCaDq|=x)ECC4qc-8BRcq_` z`NgN5j(qE=he+fmcW8}QQqEcX!0^gWLKFg=ZIu?|kW%DU@gj}HRmxH9SR=U#lfUQJ zrTE8XqjO4r2jFyUsGqA$vug1k<6y+559}Wshe?iJ*?{}|g49DS7GY?Kuc%0;m z7Xy!@-G!}YU7e1`mmDPB(Lf~aGwbadXQPHE5uu)Q@St})+hzU<-?2QRhorqt=Oq5% z6-dV)yp_ZY{v@``daZO!cA)ff+)+?HtHd9_0{29$o8{9>FUKtyf%vZ(+Tovlh^dul zbjNw&>=}In@g5rvz<4P2JP~kjY~HHuKS!_l<3$k5rXKg_h-U_OLCJH^8T$jJH()aJ zh7Wh0u?`q7g(ThM2_GJ+%`FGJhmYXL4E#VR8QT01e))~}{IhHC00f%xCBMwB`2x;t zJ$c8eeG6xNSUbJu;7D~_>BsuCkEes=0r%QVft(C|@vT$Ue*t5a zpH&*a(bpad^n1^5AnY0Og#K1~+_O5>LqPMd)~7Z9_eDtJ8u!$cOxv78FK66Sj_SD4 zv_^q|o-&$s_j?KqTzuMZt>3*GpZ)Pj;eyr&n&BuZ$B|RN8*%ieUbEGs_cQ%*Pgr-? z$>gIOJ(1O2=C6j@R-u8ZD?R;7s(Ql3Qq{9H?wGFy!c+Gw>ouz~0)-oAv?%S|ZksIq z*-O)hx7+ZN3#D<3@5ULkY>IT(=G+cESyzd~z>jAAit~Tk*m+AURQVeCbVgnhA9k{R z9W2p`4BxdjqKREBcylsOX(uc3k$F0n}PANFU`CDZBU6v^n2Gfm@7J z6?y&F{iXX=UPwCYN}@~aBsn&P!EmxYYw9kknB(v2ALV?w-NX8R(svmm&845$mNUccdXx7dduSOCH*!D zAG;Bc-9)_99LknXW9M&ul>aMnZwmBV8;Ex|{P72|mXt#HSK+QTT;KZQ+4o#uGOYip zZ3)Qi!;O&6_?T9{_%)3_?Xopk_ha>o8{&S8!yySzxCTq|Z*YEOqtCcHM+bM{-T~O# zi;W8PpI)=46$-Y}r>&rr8P{h`^!J0uZdCwY6k#TGy2iNLqXYkl8pNK=*)K}C5*`Ur!nXYoA4UD!Q=5CS zG&M$aF5&{`!uf=zyXvK79*_mvmiz7DX8g#-52beJv5fIKG_6v*4S4p)UprRqn!qO* z<7~a=$VhM;m^I;_R!6m~gR$ej21o6}hH6O-+%0|7R=c>ugd7lEt;c_PjM~*T|98-} zDYaYes9jXg;JwBW8nA2&jjOvq(&K?10O6xc;*p*$)NZx#0o863)NZ-oT`OErVssR> z3%gBMcf&Ec;J-vv@tQmrqldZqF6-MSy37Klw?YS( z!SLNV>k>caq4+go`;I6n)kXapY3g^z*<$;i9*B1tl@PW2c!0OLPp$MLZd4h(c>;$M zQ0dGk&i9@(zAh=n4XZGK4|ScfxumqOzw|aJ;v++6e87L|l>(-n8!%QU6>tgoAJa=q z1q^wC)LbHhPrLVUR-oVedb$E`PATByrbB8DHH!o1n8f?RbDA=JaWs@RFO1!kMW!cJ zv6#Ij)7DWP)B2s(AQPX!(^4D5{=Fm~IIEdqy|I{Oh!aGwrtckj@Zq|>gUCd*{n1!?9xf| zYY+6DG(SU`&1+_ylV)TuZmFM9x}|=GG0F9{Lrf^?L87GPY>Uuci%bH@x&(@#Bm#?U z*yk|?WYRND7^`C^h=Q=T$KbjE)&-cyU(X?twDryR@43|rV}R~Z{Q>%&cgdptIQS-6D3 zQWF+*a*5;q{F3;jyk`!9@i&%i3Gybwzr+(7xGAJSyJUu>+@B1}}}i%sL4@sk$$E!u*)n|~fR zn+FHtlk$fI@T&*{fi@PQ4L{hb#6b3Cq=7;s0UTLlqiOyJt%HO%uamIdsIWl+Ed6%*wHmOB7a`H=##D+g@kjatsrHmanoSU|$ z4`*RHH_Q=@ioJF%dIV#^NzLa(O$H6MCDy&Zh`Tw zsD}^~8}}f(1-@fwa2~#Y(1Ux6e5mg1#UY;naE8k5w7FxbyyE9q>==kmrf>98&wuIe z{XA<^gaS?Af~9}~74y&?wmq>FKAs`0A6v*vq&n12Ad8*~ln}?Z4S*S#`_{wo48OO% zWrlvL77=pX|G6FhYqYbrKBo! z6AG!L4!cWG^6!Kb`y0IO?kh%`xSyiNgll^ZD(SJST(OHieRvw!*VZ&H_Fzjj*a1Un z9m+yZ6tzPE<(Q@JAm?_bb+dF{j_RmSBm>h$x{TSEucK~HEwTd*;#YS>dt;#Zm90fr zaL8fuWMnp=W?mn-kKQja*7Noo)t;S1ViLZ~h1&bf-{Xu5c8I?AR^6shR=y1=BP%#4 zYYuoEKRkD@T?Gm*_yI7=zyE~c))Q8j^$LF5c5MnD-(jzaC8J%yk%^^_-7BK=961G% zfB56FwhOaHq^Wd#8g~8l_-;LjMxehrOymqeq?tkyZ?r9TS$~rzd_YJQ6JC)1TQQhh z(WWz)b1)d|uwWSF0xCO>7D=F`;=+N!{srrN++e`rD8#K$^#Fy)dtjdWnG(}HY8{bJ zL@?mmE`R*)EX(7x=dF5<{K7#vs-pl9D1P||lAc&m9z93=%4Sj^-o6vzV~~IY-{UNF zBMOOqCMbRjpVNui0sLmuaRENrbi6i6$E(%QtG1x&d1*~w$fhp>ir9ZIRp<#8x;?GX z$t=Y4#?rsHs;eq@2g|*jR_>ciP>xCCq+Cjx_gWVn!eM3TDTj<=(KNI9@*or@Nd`v+?jUYD>u z!`U3XUPO4a0GhyiEOomNBqM>&in`HiPB3{mN~J}va6tTxA0R%1!9bk5hAxu55}sbzV7`G&ao(zX zP>&dUnT^KVZ~PMV$pB9MYgqp}RXD1GY%&1UW|fZNaDd!)T2+fH`O#suoxoY?DP1aJlzA}GO@_gGj4FW|wx z@(g>E2uhUPj3WcuW#1tB2C59(Wj(d|Cws(Rn9)O9gloFG%*9|}FJQ8G1c|vhS(LL; ztVb|Sx0s{lJ?0TiO}*`)#HV|(Fx^G|D(uOL19?9SswG=8 zW~d@i!2AwH*hveUU61(@nSzVe#G)X{A5pq3~%- zR|Jf07(?^e9BTo-r0fT=*JKZKlFph`x$># z9XthTqWCHkuk2GSujMI#auRQmpUfpt|45JHoxQCbW6`2RK@6{4(dt8jC776}q7%$? z&CS9i%v_SRK?ZFC4bp9pKNnMX-J>YfkzZ+wSYt%NuzgI5ws}PKC z$b35UB>gG6Cm)*tJPXB27@3eH4L$QFKf&2E1XddfmJ8AuUm~|>iE#uejB!6W;$lCP?*0%Sh>;>yHY;mo_(F1n|gegTmGi)X>hn z)`{(>&ufp5B5&~QiZBI0*uP;Q4&(`B2rhJZ{autO*yFS>bA?cH3#~pgAfX>*ZY}Z? zCOvRBc--uR*PyBdBU&6humsMiCVKKHe-ag{7n;E~#j!SC2`>4MVCX+Uw3H=0!O{n6nBJ>z& z8w_+Y)u=T*HBTRPYMZ$|fZCy~{}{dfiF(XSwx0J^1<-_puw|b?tzU9+QuB{QSfPZy z9YO4}KXy${35LOG0JLJi7lHF3CeL^-}-d4(k^vW3XLjWrnkJA7{2HJt!!OZs~;iEl~rq3nqrMZ^A5 zoKI-K0LA^KxPCxC!?RY4e9ZyKRD{&GGWjTlPG#nY2gf_Xd#$w?Q+S~Cq5RyELd0}y z^NO)0E z?|O{r0RZOA!PP}cO8os45SN*<2y~IQbk9{5?H@mi8SMoLEZ- z3>+t-XNMMb3>)Ad>ah;UT#7I(1PGFEFw1*q@2tjv!n?8-W@-`M$Hh43ukaV4E71PX z9`Jg=mw_EMt87i;xaSKJw7Okm6&+XGDHors}>fukKNOr zwTG8#-1MZz@`kr6g2t^uKtN@Rx^RkswhOUA%hMq?b%oTx53a+mH_JZ+$A;^3`ji8q zV4cv-K2b!Gf8bg089_b}o>Wg-Oh?uLTTAiT!PY~=I4h1-xZJ|8$xh#%#A zu`3Y!g{h;3*wFTdR)AdwZuh~6&NlNupt+4-zF2lXT%k!X=n|l(IJ$1;Xx~t1qu^P} z^9e*pI--3J-)FS+eU_t!3-)a_{`iJMR73BluLmZ9y66bfI0?pm9`d-NoG_*0ooc8! zGERx{9n8tGwDEJyKS14HdwsN;?i?+$g*Aj7jT*h*=e&G8x*6|?H|74aFHkB1t!?`K z@X;~!yZ0h;LVLvt>-jaE6UO5!IMPmVSR{N6h>EqP)xyREaovJ=cH0E zv|+xAdZLyg|Ik|&SLP{vGhcnr868v*^z$gMGYC5M-8()ht%x%JP>yA$2R$=Q94@;0 zHtTk3#M@m^ONFopKzFF6Sq0E0Aze$2_%>y0a zIH(o>+qY14P z5}58W%zhiuEsnFK2aM}t0RxN8B1y(a`rAOD_z9UN;Q-_P?1rXuSGm~PbdN0oKj($2*-*3+xTKbI3ZSyLy>s#eniP?zo}tkPgeJ?;fmX* z`3{I#YoMvfYAt#i{-zLDg2@kvQG2`if_^v?6s`%L!Y^!l z8}-^e10UZeBz9VS(XS(&($kQ(B)#-Rl;$vlBQeO(#R}Ws`;4On_P#VXSFIhZ#XlwZ zn%S8Mi_Abpt)jbKJyhd0_VTF8QXfwM9->2SpZRTlbF%{Feac-W$eDN?^p%~3*z~Me zE+UJAJs>7XcSJZ#aju}gB7jl#{`LH3p1H_|XR~4vhC@XAOA*poT>?c0LPWOHP?IB1 zN&OP@ZXlX@JVUY9lc-LisAg|Vz;I9Ebf>pMnq&q}fhRTrw?j<&dE z7Sm_pJ07^Y&m~<5T|g_YX1GCjWXeKw^G>nh6M(I&QAybq$MWahC}-ft3v~uVi#A~d zPTT42p7$`@EqmSK@{|3?^7Fm10r}vF0pLx{GgVW8_{GbF4b}AK|sfT#k|=lk@N4LK+9{#QSs#=tyaZ z(sylrgqFNj3`0TJx1#HGh|GZiLrsX*g=hogKr_~S0mqg<`c7_TOAOleR{cam#oPB_ zOV6TzTl=d<%&*SHu=a3fsk&cv`QvI7oRcbOEi^qzOACy~9l1|l>eiA*l4MpHCQ<7z-nS@g-kt|b-R?7G4w*jpvJ8=my3395aHBMIQz|BKU z75#a@IAj)KO$6Sn7=h~C2k0Jp4rVe|T9jvG$L)Y8q(Q*bJ307Q4?ma#JNu5TSr202 zV)KKu+++r*a_DSTt)$f5iJxp5S@3aJLN&LEt0uSvls z&NwURVGo=!NCz7zEX8ttGJ0lSA{!;m=5#colDvf$TAu?3@Q=`IBe7|GW!{5THXGw} zpmb|sD4L1Cj|YFv&enlerCHtv4|mVHpfi{t1T6amfFaU(FL@)4+6SaJ=tJr6J@$vZ zg5ZnhvAIAQI*tArQq&^-vRvDx;K%uCtH=~9u)KJ;)C3#QBNyX0&0 zbQU})E;%YK3yKr6$)iVhHuG})Osoj?Rrv(GU{LK}RZq`Hhkk4`54TPpnfZg#Jmhpvk_bvtJPH1VJ$$tLqt<^*s zF^kN()h%ffy%VxlY*^m#HaBM3i%AwajVef&GlI;g4ia6m!u4r-lf_joiIQawyaMMK@hjKN$1i~! z&0zBT2a3qNLSp8Em{=t2qn{Ce;`D7fYZ%&QJr)B_2jFiOnbMjH5hNuqje#z-VdpTf zwqAPJ^pBN8u_R?Ky=whXLN-*O$IXYv@go{>HYa)Uw0Mj!!4Fgn16?tWunLzmMZ!IMZH$cCZ&oznRO_fFa?k<5BCm2NED_ zu}oFizx#pXf%9uiAYO`VAkEW%%fr(2oU0wNqC|nel-u0QwT8L6lOO16G81!H4DaNl zdjt6uIvxvumP1cxvnMdF++0y4d(lE1-Ef=pE_dh?!7r<~sI@c5_3`$P*0fZdwn=hn ze{f+F)S9rA$gHuFEcLggit1n~OmWS@)4@)`9ztJO$FPxwm5Kq;s&~Kv7oZ6|Sa0BO zn#(Yi4^h@%7z7NH1}?uwxPs>p{d6Ze?9LhPR5&Q%{87fnR>@J4mM@x)!t@%n(&5$X zoNsQ2uM+jJYDJpsCbQFJJk~EM!Y}3I&tmk9wdf5TWxgu)R-)cXIFIg1%n?3@?kF~X zG>4-Vi)j)a`%>i+x2~60nBUNxbsJi6zKaLvR%kcJv6DP{kCZArYnl)H>{qfoBTKU7 zEZTsSR$AmBelqzZ^&8g938d~9{f1>9nZW$-3hL-IH)f@9_-->7AIK3{dF(bf^P#?& z`W|w0i~|qt!IepB?i|*7##XG`@~YF!KFEi&w;IICzKENp!NqJvIUrIKd~)C2DX&H7 zPz=OwL!d0?rn~T9Z^iDFO>}SbdK`Y$BGUxsU1a3%+AHg$l8`>-$AM!QF=0NWJn2y2 z5TQErNl2B5c|$8;YL|3{9Kui>5NsM#iL=ytK-9j7s5yHsMe;uQG#T`TqUH^dUK%mG z=P1cV*1l%*RVhXdQcs+511Ol2gdH?-0d}Iz92|gjofx&~T&)LePt7fAY!Pl@q)=2w zNwl}^)kgkZc$4f4qr$e3py^_PRL}%*7ph=-5Vgwlo~_|G?YNbmRJEVYMV4Og$;Th~ zvG2_9n}mltI7==~FmIy&MnX7(w+mYLnIq&C5HD!W126$N6QC;lrp5ySQ}`?Z*6iB{ z6*_aEUWmb`q6(ehzh-lyl%kqb=%kVA)?=Q0J$z?=R-PjBeBS@Uos3);vhicARE)Vv zL=frCYvdS@xp^tRo*3zr59b_$jrZqHQalx4n@?fQ;vY)3dW?6*SQn;{dOp?_vW=;b z3JVFYb)x44*q#3(>RG(T2J#^cg?Xnl)SQ(kTA-XYy%+$pXu?Ob2?fiL81JXxI80-q zLF^`v4&S>`1)1JLJ%pJ)c>)d423CBFO^jUY3z%8*ao4-}_-lN0x}$$o!u@RdMK(Kp zH81;%UExVT^wf>45dIcsHnl8OtI2IF$Zsytr1;ax9xiDxXr1OXWM&3$(qn^^S(TMI zQ>_oht`fad7@^*Q>a^{tEVC%W~ zTc5zD0Y1w|w5Croc%h{CZyn4p>q68qA0qCz$4zub8_APF#NpnEk><0Hqwjihh)eFn zjtw=d-oYksLg5ibsNTLb&;2vX;p2lkl0Scxlm~55=CF*i-jV9E{Lm=0FDmZrMi=j@ zLb?OEPZD2{ufnEhn0rPKy}k{5O64;_em!@{Qh))e$K`Lwc(l2{L1W%)pj}U0GBBBO zT(UqD<5_?qxzhIAQtQyi*?57QlP5ru=K|0pHAZj?tq1(wAn`qt<}0yA_)>YP91w|C{?x*g2G;RH<`q3h9qG%vC9qPOx z*prb(SboBzCKvI-{fDZer~(w^*u#0|C~zPfla~AAv+@K(1kJu#&Xf5te}*5WIjyNvyqe}pmWAXjK^eGXYCpHk&k;5YlE55n#pOaF_I@^oMzx>P$hwBqgeSF}X+Lu>~#^w?xmv zduuN`o?1D3yO1TyKvEP2CQVGgu#UU%LonNQ= z=ks`{zW7%!NY$TsT>YnSLiv|d^$k9EcIs0zTMdhn@Sk>E{cbEjB~`yIpFhQNNybly zpS37ee=~o!9RH0dpP#C4@Ogn#zmtqVRsY%J>UU%Lok-d1;GfUqo%+~fb6FRp>Q6kb z{?j+0{L88O2A?}S_2E*(`2U_7|8e!ZvHX-&{kDAm^m}{!r^)zJ^*8fp%kf{2^7*Oy z2A>x=^}EXWQ}v%cu6{R`-?<|-em;+P>eCLgE=bj%cwGIbC!_q!srm+=J3IB^YsL8A zN{#=x`rTN5N~(TaK7ab1J$|}>twpK&oB6Zl_$Q%!eyYB~=LJsvo-+Pa{b!G>-;L#W zB8c3fKcC0j^>N?C!HH~N1f24DzQyO48=Ug(ua)OieLtT&r|K8-c_%c0YXAIxe4di3 z|MYcyPSrQ~{3$kFRr%o$@cHFb{b_v8Pu1@x&#C%t`Me-i|KPQFo|39>@pU?%PPpCKVV}>w;%CT%45=%+pJ+%*Fm? zu&c9lIVR&9?LF3qKSAolepK}@lKST%@5Oa!pf1=)k39&(qB+>l%W?Z@DdC) za|yS7k29AKrm`OtNmBAG0SU1(!PXh(S7-e!h{P881^q1? zhW<7xyMyE_)nm8>k@sE2t`K@&Df9@)DFmA&W0=Vb@vA7_UmZQ98wx9m5qj)g^Zxtj zbQ_oDcX!TLV+KN68CSVDN_1R=s3FzAN;a5U4}kTuz?=A}#)q^1jhPZae#=$kWMd8y zVRwT=yW*y9{2T^In}dbs0`a7V@(|z>D+bUFvxXO}OLPE!YY~rL-B&OCEZDy=D}+m9 zmcx3eX4r$sPpo(_$I8VN-{ECBnF+1*CALl6Zi{K})5N8*pR z2#Y_QMK;}f<66CU4O2v+1g;t0*1vI0cwM8=g)xNfy0FREi z5mW~pdgEt$Zv-ZNWE>3Fdwjh=W`IEvMo-6U(qb% zUdui(t~G5De3QZ`;{`yAqeo`+!=dpEed%kjs{iDC`!2*_sQ*UlYroNZuVKtZ2Wr7o z3ph{7Wg7Os_%AZv%IDPgWkc}VS~=9YPt1xH;%Dl+y0m=EV3fjby;etJD?^)fSC{N4gdlp47GSX^SQ{ z*KEzI*`3q2-rM$Y&AyY(w_$$!j4j@Zi+`%wmyOKHSidA+9jV!uDX+Mv4|*O(vHwNg zo4{99oqPW|Nq_)>9ThbwO4Mi*MInkUQPdnrWFI|ITBLX#+oEV4YA>D;tOLQ5NcKHF zO0B)M)2;38;B9NQ6Gl`dOcAYsI231a+=nBBqG1y9|Nhq6XGlPM``+I7^MC!c#`<>}h zb*KA_)sVN`m;Mp!M0x%3b!90UNNEQ44N*CBqtQFK&2&Dqs3{9uZ*8OcW6j6>m8u>He9~`;rA1DR#)$_?i9%beX(id9CHvTOlOI^}=cWfFI#$9a?%> z!5h8hTI}FhklfH%0!SfK{UphBoOxr}-iWsy^@XFOZ$(4t^ydw|Td2=b-Xif$WBl_` zLmrWU9!U-(XY}GwG_-YwHz=C?R!9+Ox6k91g2<{jN8)=%H!n4A4og&jE?@S{F$zgN zM((IHX={T=v~HHP2Zjb|K}{EvhqyS?G5qYjVhhs&1XLzx~ zy{Q;YX6Re;)?xyX{J&n$ZNn$#m1Cz$-s13XiT@Dq>Oz#~Yw1~g4!W|^Ch*Ur8k|-?x<_@5}#JPR9^gW(xx*HS4HRL(?f*W5!PRti) zZb`ktyTmEp$$b9_pMR2CMM0Lo*)5)uIF!3F4+7GHWq^wW{7Sc9ai?f=vDocxfRme? z99mJ|uV4`WZ~?OPr-F;aoM;G4$uC_e^G%uCxw#NpFiSbFMF}$N{CDwtnxQdy87(R- zh_=i*6)LOrJj@@Y!%h|U1Lb{{9qxB?Y8Y%By zEVz4y@Yk950IkZqw#+N6S=@5#*aGJs@%joYjTvyaa2DTL6r0|*GWNLuf7J4+Ap;Bh zt?zZt=v<7TQCx{{=ZYdmH^V!7Z~J+BGQ&%mTtxG6{boum$-vd|o}#AvJAEj!Ed2NY zw4dFRt*vw*R$jsWZabG0D|WK1!VDvC$XKd$<-6+VfYVfJ8XP~1du!tBl^P$I&mOB8 zztJl0>{FW{Xk|FQzDQ71VeV{n+D-#F+{6e@en^wy3wP?=+9l5IN2^>eaxMCiocIa; zRJd2;-NX@5dFnNq(>M%_9qhEqy-_eVs!;HBh=1L73uB{-fU#jJJJi3BGG{>yKko%Q z>RJ@x_&8r#5EFp|HtH)6Mt13Zx4(epkk0i$+xk+(4Z+#Kt>Kovf|3=26qsXo2F~6s z0_e|(%@jZZrd)oziRNn7w(MjFmJEE6dwQC_;l}GLO9~~NEF-3+Fx)<=r*mUjxP97Q zm#Ccbrm;j+;qpq3`8$$!GUG>uxpwd8Xq0AVA;oFz@$crjWjEejA+~~DBJL?~i!$Jc3y&-D)InA^71X&c5{ zq87vPcZ;01(SS~rcNw?}kh7fPNOICAQT!Z@NCoJpo@dR0TLVu+oYs$cq?cQcHSjdl zAAw$No&`^(f+xo>q0GPxV}@oafVnq73D|~oz9k^)Z^+Nk&UZ@(Zma3`)(zYNR6(5v z8G!11SCncnweLB1d_OaZ0u6YOKkcJn5+P^7Iu#A}>nSqORAdmlAVYb|^EOv_mVqZZRmiTd zUekBwGlH4kFp}Rn9#zh!GC1QT7h&ui)8M_ zmFjE4iuy4T`8qdfrK4Nagc9c zqBP-6lE=c2@lOlVG!ao;IT)>dS4%O+btZ7Iy#&R(sX86Y&6hykP(vMwi^!A}J11KE zR;D(Yb@BMXQyXci-W($Hhz-@vR2O;nsk#>p){NQFKZ0QUzgFmY$?MDb#{}tR{BE@AA+x4(;ox{EL>f| z#fBp3$%>J-uef zCw{2)u>DQ=AM|&2(BFA|``a_TPk#V*PwX@qz>s2DT5M=8=8KiF;}VmIG>_HSEGEJB zke+Apry1Z9iW-_Sj&s^<0{?KwT!Bh*NcyLMlm$KuQcL=CBM(9kcjkpV+H9p2s+13R zKgm_Ha?bw7gCXP}7|%VntBd=N=j2>h;f{N4rO)>r&yZZDPahA)txARR0EZnW*q;+LgnaldWC#X+%{`pqj+J&Fi&RhUSlHbRX??kf zdVqOP`oFUD_4Ob3na^KTNyw0H%_DvRzMo)-khMYM>R)FJg2Q!_^dj6}@SMqzBLq{3=VyE2O2bwvQ4RDyJg{#cl4*O0+`a63+EefO&1Bmzr+t5SA*8Eo zvBqwPk;8q_Q$98qhugzaI%^0z8=2|s5XFR+FbOCKk%S15v{Rm&#UFpvXBHkk8jEMS zu}{BWj$2fz=5b8WbZ(8*bg5Y%>KeWne3+fX1$|pTAvd3N7xr)3{fzY&hx^p^-|@pf zBVQfL>~gR5|BUvfetv5E_x5f7hJD)~*v!mxTf+S-NFNTei^O`|y~urUNrIQq%~(_jcq@C+~i>+83QkA8Kw_B)`FB-N!z0H+SrKyVIm9 zW4wrR@l7G5xjMPyjEV2*iPgCY!$+emK$*~HVtwLTw2@7*OM?(3{8!&FDoLk}9#e#i z)vuPK*Xcg)lJMgqnW!tiQCHZkURuc}*jDHFGE%@#KPf6mKb+;7_w%Bc6fj5czu$ZP zxNAIl#tgg@QZ>7Z3i`&|%j{^Zpsp7ru~2F)`ClK8zGlW2eoRC+>TL@v?58C?+^)yH z_?Ctm#$g_hR4;Q{wff2;!8$mtOPCXjf?UkQUw8;7rj|(nbFuC=)_$@O<~T=&dT&d_ znee<>qTf4h3OSSW^w0D~hvHJ1{nC4wEkP#OUT~Ys!T88j<4Dtzo;Jnkk?}s zJ*vMx2B8+J6mTbqx0(ws!}0g#++PtZQQ`oF17ZikvVC3UsEq!LaSgM7ku&cq-sb2V z+Iz4X#0zRQ{^tJxR~i=X&ZP`W>hSVNbyw5hoCVLR?IY#X#~eq+cZFiaJVq-|!Cj&sLbbd0H~+*=avn8t6+xX*3WuGG*`^4h|-#TZBS zc*~u87pGoDe#xpTb>HnnmktGz!W~D_1{-v=-u^sqxpv~nzn|sG;3q~Q*Bj^Gc!W;K zAs!NNJZ=**hi}KyFTqIRcu$EFe}+cG-CZ1$e2K0=u%X!NhPDs7pL;*2sB?Y$D3w~G zMX1x8n#xnhGnD{7BcU!*JUgw2Y8h)^GplTpk!->C@PdB|D1ouyZ{ZI4>NAgv?(Q>> z8qLEDFEP#^%W$!Av|;K9cU0Lgs`SP6c{A_Xv7ecTJCu{!#ILHg_oik~)8JY`OFB1(nB}%SU$;%CMf9yNTNHBAPQ-X|<$}j@Is+Ih$4X zTSsVn$vCX-g{a2Z^Tyh}u^R|{H44``$+2Gm;-lOWQoGT0Ca&>+h6@e7OtW1kY87u& z=aR02;E2!)TAsBCqhqvsEBed;?yGtzGPkRM;YQ|S`{FqsCD0*#d${9^nxE$HvT-*v ziBySM0U$5xjj@w{4F8^RVyHJLoQU@S#EWu{^?>%)c{tji)3+$6Z$IHVv;XObgL4Gr zvwryuM2sbe&G;K!0J;7C@#h!#2NDBOpEx!VIgex^pY*UsbB+!Zu@Un6HB&~lZ>rh} zs^+cF*nMn#O?pFyA5Zo6JTaMXu`+Fw80EjBg=LxgdsVJ?p>zXjW?A}|N*vbf{M+@K z$63owhW|C!^?9~8rDpkKvvr}#JzJx6?%A$j?zt*|1z_d9p1tO>{MX3ay`R12VSV2B zeh$W(l?U;|j&h1*xY}g*yn@tk6UF)G{U*sm^S85kc+K;GWcE2RZ5S>vwNn@e%$;>4 z0BsHi6SThWiNgzHM8Qllx|#ps*?@P~#3~lw8oG?XQs42&`sY8as$aU^kD2?%+X-+1|5J?TI2U1R7rE<}AT{mabxGuFb%FsAf9dEidH z@C9LWq^~gi-Tr0NXyC$)YON*LoF#7N8jR; z@>pxxJ5f$zRo#;;kTe(|!G>yskQ9K|DKXKIOTz8EDZ^}Y-nmuj-{vTUnwK2G-n7s! zAKYsF$pnINvS62K=}29xcWljonr^?`#fH-*8wzE7ZyGjD)EPRX9u)1sBb5s2Hz4v^{P{^@HcNh z)qit~2&uzY%=K<9NjjQ)?m$XZCO{F4gc1>TnW5b!k$V?YBz;7dek$@3)VifUaV4nrcGDLacX$PB zkBFWZj7c7h=QT!m`pX(-+rMbFL6J)tMtZgER6JDhz}wl&BGZ>~q9Gn)%EwWjnii}# zd;C+OpPL*z(qDBk=r`Y;zAja7UIX8<@EiS^o4qFhBu)J|T4{2{4w7dK9eYlJe-pRL zi~0~(H5s084f8$B^)4!#>y{V53A^elSSkUI7=?erL>ACnn(nmxAlz}TUM7cp*8}Np z;CIGOcQWaH^pSzq?D}xk><>;kNA4F^o; z%)-`py$>+c$;l)2o%aQ=I!`cVGR*n6Ql?I`?Fa9SL#S7_{? zk$asPUwrS-*uY$S8lN{`l*WK|J~5WPLgb`t5>f>VH^~t1u1RtUFL>f1{_!t8IN-ir zDihHct-m;XQH?pDk0xhT$X(UaExUt;dyk7Iey^SrMN%S3>sR5AINIbp7zIeTDc5{g z5&tL#(`j4Aukd4#C~X5-$PC2{LZY(kX`*y~O(g)}aD{F@M}m&TDS#hQn*eh<;M38> z%_ZiT_c>aPV(>NIF3R8KCck^1`EzT9NnP6Q-#=2#Ijv7qm8=!Cd@w^b2WWojQTClu zY*Q$M;;3*(F%2w~>A_SY7DVw;1^!O~XA_d_v}-cLiSe889x@&BHNmR>xsgmAPw^&R zmmdkbIEF43DI7xI)w8i(ie_0MM-IuRQk zO}ZgdYWy3b-s&jk(K7!Y-bW$UM2cO2W~Mym^_3;DZ|d8UI-!WkL(+Jpj`J3i(#Svg z05pIe{{;Q%4tFfoz>-5=y(7>8tZ{qK`_dVvlo%ybxN++Jt)*dOiY*4I-B`2eE;QgN!AROK|8HKV$yPS_P<*e ze8dwRe`1+GS0x?~>~>07f9eqe-e+&^mbA{)dIjqnu-Ml(_FZKKjtVapT^cOx#b;>Y zGTnammruYMj^GD?J-oMc_^dYYn&aj`=sG)(vntc9z zf#?%dv^<))3IWQQGt~%CYvkQln_%7xnc`Fv6Bgf{-Y_hs z;QK(X@uph&EH%}>&&fIByl?;pW(2VFG?QIKl8&N0LShQ^27%`>LqJ2T9Iy7zwrn8+ zT9#Q}klGW#B`$_`fT=Vk^VI?jPc3XH&1<1J*Fs6qf+7_;Nut}H)Ptrq)+I>l7l=}Z z`z4yI;%64J6?pdr86ZCA|M_rBpQk^ksPfJJ^W#L*kXDtG)?a|gfNpW1SZ$WEz$5X0 z=Y9!3h33B{NWGMb>6h{V=Ck@Q$m@S>pZ>>=&+q^9pVfaPum4Si`St4G_`Q`RCXwmw zhAITL(UQvXYPq$<|IT2o=dERayM8eE7X4+0W^V&|8TOu-!zDgFu@&)K3kqY0`WrbR z&FE=~Ypc?~H}GdDmj4ap#l+1O>6f$oR`cHjT6}c;Ip{uGe}Cs|qD02!nr(+rgQR2Rz6ar{-w02*809T z24~Z+e_F1J;01fc!T&Y>6cmLFq9=wf(y@dxUlvI(OihNOn?zlCt$aj$6&+a&&Z8GO zc}rBqf5ukpJsxusd!=6gKJz-eeyluk=UTRtYgpTo_|Cz&^2K)+%l|K)nnXU&oujxp z*X&st^u&FRL{OoDA8OVEaq?Tj)R~tt`SUjr(oA*U7jHQH-bEGIC0`(OJ$2Hr=k14Cw7m98Kc8*yUq7Y2;d$+yxS#f3$f&GRS4X3) z9?p+uj(rb4d`>`X{}`l^tTXzZQAh*0fq2>wh1*V?ySIfkZo0DGa4jz6iaigkYSU1- zYt~+TY3ji#WMH)L7Tb;>eAF{beaR0noX%osFmG+cRHxc5Y6(lf8Gt|G1Hsu zLrjEYog7cF;|cbQJ+;*HlndAh(cjcK+RxC*)zHbj-6J2pvG)wm+IyOg45n;*47{3h z;}y)TV+Orz<=*4ma|`el{xWAIhx7#0Fi5ewEnP}{2>!!ML*oadbI2~(W5EeHvgKJvgGI>vT@c!kFI9xM33HhLn7q*iwz;N?LlumKJ7(MNKA~n zrH}jv_(J&7>%G<2zOMJrK)-suH;hU6Z8j3WeLiOEa{HfXME}~Z4g_re`-uNRQkGKH z4G>d=yviSqvJW)87w-5Ob@N4>Q*S}UnZH4@($9H?2z3l4HQfs(lvz=HCU2F){aXUR zto_gqE2j@m;kru>%&RcEO~Wwy#+VLEosU)sx9XZYh99BVnD&*-zv_hUCPtx9Qn zw)jV$%WN3&0ea{><*uGAy_X4rWeDIg&;E#$iM2lt@wZB62`rAE27i{&<>q6;BJr-w z&=j?{4_&$T=1-+70Z%H3Z@wnJ_wZ)!3px0DYU2@(y(~k9L~rpAhp70a(v5__?!ETF zGN3R1ceRoCrvEE=Hg!ym)Jw-h5HjoKVt>M?C%Yfe9W$lW^=uRL+dn+4J;$C!>{{wV z?VX|brjjvi)l=qrwW;xXH$O2&_S_0cAj^KBjA%pr`%zK)tfR6ChP;Wx>bjSgIBnLb zqy&Q;$&qv8VSt7=95g*HVDkKE^27taQ&oW5z0;~|)N|uSmJ&)foJAMXzkX~!$eMc% z1x@`7Dio|k;zpSehbPW0gQ5lFD`9+@^`I|rdKH7qQr}=bl+BX$h`&?FU|Mb>OI5Pp zt^A2P^?qtrc3pUR4W+3oC=q<}JXy~d1kd4)zS_aA*`UtU*L8@>{V>Y)mK<_|X@AJ) z_+u{TK=&ERZ+|bKjc`ZWR{AlO7GA;cK>aeBs{ih5Qn2bF z){1n?Bhcpj9r6kIZu7Tl-`K_}(6bAUJ_jIN?*I7tEHxtzBxNNOqhdkN&VP9ydWNCT zzyEYm*?`Oi`yk>G?)U}+%jj(%HZ#FS23CW9z0R(~F^ry>j^s~f9S-HU-%T~*hwti% zk1LE}?~rkN;Wy1Ju@CaaFKNt@o!zgZDPEP`pKyoFRtwd!yo^=%rfl8Ssw*8X2VWWa z@`9r>^!$gndL=|ep%~Fx{2T7ogEUF}F)vp;#3mJ1 z;IFXWS-i2BGw$O4@i!g*4m*UPh*0~m%J}X9PMf5yg~fI#d{IRH8jyqWc;Dm=yILnx zZQ$LWp)UkvjnmP0kAEO)ig0j@;*~v|UAy2}ov9Ko#U;9K3u$Rr#y2=&kLcm2IB{O@ zgcqlZ`JWk2m{*KR6*R2yV!t^4o_?1OC0iZWG_Q9$H;-@!J~@%1LsS&}Hm~{pNJRyc zrkt}?6ySkts5q>@t++;Q5{E9`+I(pWKF^8=j|&GeYu6){@lQYo?Z8lGq}4YcrR2ku z;X7)j;}$+J*$x*T$d@xv%d7ma1)n}gWo?D5l)O~BK{lmLw@^WE6&ZCarNsVK@E;;s zeP!`20K}|=(`WIX1sr8>=NlE@;WUpj8xr3!AXZwlmI8E{`GmVZXEU&r?jne#aU zR&G0tU(E+Yzt4$@!AGVS{~;QBQYTyxHBcP z(;f0jBvDtvmm-SsaRsr3VQl$C4WX0Rl`Id#7>Zj8#z%YBsOAHaw10~W%}bBFoA4+2x$Bl*#4aZ8n6r_f{x!k7|7e= zkL9nKTd&&}X3Uq|Wn$3%345ps_abLnT}6RNBPRoP7kl|L_7W+fUlFfc-z7L*8Q>1&ctDkQSy&v(ONw?=o4}w1;%d^*9AO`!d zKogaWQ1T#}+A}&zX}wLeMF6`=S0Gj?5k;2`lVR1`{;ZcAyaFYRWeMjVW^I;orA?Kt zU$1@Ibtb*!7EL9$+N;5B%C$>yBH9&6mX3F8JDX2-L)&fATz}LUWRK95Wzu7^q!?hZ zc{5BxKm-58t4FH$#vXFLUFPG>jiHa->LroT^CUX=-yN+5omv(Rk#%k=XEkrfes6}S zAu$kR)eLuhq=6=fJoHUut}FSSF?lyXk6))*%x3=8TK^K_XG^Z6ByR~7Ke##oLTlMN zZMY;4ovS|wb1(M~dzx)Zo^cGt(pv}fXslhE$RooV`%8j2^&@_m1KYrB~#J&{n zI8{6@IpkmsO`2k6XsD*}ICcZ~Y!FLG( zqQt+$e6Odl{eCCxz<$qb=YVio5Yx}VW>%!*Ie9SZ-BgkOQ|{TwLrDgj`qFC2L+1J0 zdY)jOC6AdhC6Mz^qRfbUS^i=DP1xzc-(>FlYqV3|JxDD2`|Zkc{Ed38m38Ltw<}%# zwl0p`3d^aE8Db5(_B`f^lD3IQm z=>0?1AU3>m+aOCt4Bvahuc0;wm)2BYU}NPZ#(6adj3t%{kJGv>OOK_kg2vRoR;P@Xi?WMnXBE8txEH~3wiYp{!Y;i<+~ z${qtKh0$mjCzQ(j*zW|mjJXXhNiIh}!&D22F-IQD{iUnSk~%_%tgF=0`PhG7;yc!r zyiM=<*HbI~Y94*G_QUF&{qUrG%SV+U$Q%93Lq)FJKsOVSggYTS0F8tTRMi=|=cHn+6Kp>YedaOJ}NRoBP|u z6l9OJP584FS0<*ECT=WA++6HGJ^~DHU^`~dGDEOoy97jM@JEt}5N{bsio}s#9N=TP z<8(U6Hxa)4brkpOpD6+>l~%?-5ObV~cITYBX0doEr}1|5ugqPjiJ^G_B6{##cJkFegf;jln|dy52N+z!m7y z)w<1$ckTLT+>LbE$>BdWbOD1_slx4e_V#xlnDeEfUyMBZ!RL>-{IrkH|D{{ACW=nH z#x*zdE*yE?nJ0Yv>V7}cHF;0!%Q0@vvynwN9d+A5!=G7yvDEkb)mB|wcjVC%cHFaf z=C*H)S7mtaC3tKsy7uw#?%%!?AL%Zgp)!O#^s~%P5dmj~2L>?(w`PjCr-W_<2u25L7dpGVy z6WlYDe?D>eXLl+8>>9#9J4swqxnnT@Y%k%T?t%RCaew~#XaJkkPGbf2?H5$;RbGIe z;5w)}&RMw!_OE~aYs7hwJPKQmsZSO^(GXf(U%fP%?ALr1>f9Th?-g^c-Fc)LBH`C4 zCC~p>KmNHW#N*eB_-BI2p|DpkicRbKH9)^U(l3)0=41UDsIqSTGC5|rZF0f42CHm` zeht#Eo%%IIzjo=D$;7Z*zZ{i)qF+PxYtQ+KVOx}A1}Bi~D%V9qA4WqjxHW#HXw(~S z=i-V;s54r#%I#c*Lh&)>Zs(I_k>rSwJUJG-HQcXpN#%X#CPs9*&#s7uo_340`z*2V z*1U9X(TMky+Tmljv$H}Mimr)-o^GspsnL6?F;NOfV0$B-PjL(BbB&=7_`vO4S=N{= z9^6>7M4mJE%2VW_$g@itLr+F)$Yj2R;k?jTvzdzx32lf~?u~S=EGOu5dt+kkc0s`X z)Qp7oQaKvx)+VoaJD)1!qX?OgYEq5fHuK#_k!L$2ol7ekL$97&G3q73s*#$sUg|^YHilkvpY3X_*=T1#J#H3%J<_>~s^lo7Yu-gY zt?9GO=7LH^V_Z@xi#yug}dyUFKevXpt+rw97{0OC6#`(W~C(H!>SC{Rz{D~YFQ)ZnnL1DL1Ig#Q)x53HTRy0->@csLEh{J;gX|{~no;*8 z`Sqf=RzrP3?tm@Svj=3>ncq#!TSE~6RFT@}$w~I66g_VKy=A~;1Z01`1j0m{szgIj zH}k8p`W@oh5MuH=L=KE5Z=GDTa-n)aK2)3wSM@q_mFY5{QBI)59=)G+ZDaB;b6{hU z&dmcFlQYN~`1XKEh_vtUZ}u_QjK6B9^oMi{c{rNhiEIa4-yLv%^14%7Q2r5F<=u2T zgN%9)XpsAiO7ejBYOj=@ZkL%dwdraXdBAXdCHtkxN%ld_Vm7YdQPVL}Rqy2IkmLBt z--A!$@7zxHVTA`b(eDI`P`pr{&f&a!!Z^31YUSe}ielq*>KyQ;Dl3o3hk9^omQlAf zzx>USd^alMx`ka~LyC#7%kf#>vF?nTrvX zdF@v_dU_aV5oRNe_go~b#_Z8&4jR}eysIMK&PNWieLd&Sec$IN-}F2FYi6!PPUf%V zwK`4wR6TguQ~o9~tpvG=sgI%1IeZxkBRN;m!fm%K&tZ)f~hZn4lEfXlM(I z6C19@vCXG{pPO>{0&^s5VjFY;DIsxX63&0YSpY(Jo%$}7MzalTI|ZYmIb4I;L=+Gv zQjvT#!#Dl5GyBW9hCL7&F_;(Q}!W@U|P0`5yNFrd-cCK`K5t)NYe=XcG){btfMmLM! znc4heiJ6VufP2}M!X4Gr3MOLDmxlALU4k3-{YXn)a+Ddy-7Mue>yK(9FpPC7w{?ad zWUlc+;hO$3m@!VIyF?tjY%U>GJtLjFQVbwD_9y&{w%F|-_64&ztxxbQFaP^g&aRdr zfXU}*v=TQOeIBd&ZMOyTdwuf8t>&^ecRKRG%Vy&x9F)7&PrKDmC9m#rL$5`X;}5NQ z#g5BaMEKZyh*_gKR(Pve4ygWvn+KcV$kFb=rP10wO*8}2gp*UbfTiFZZ-lQ5OG+0s zJTm=tdY|KY>rf5SiJG-J{emyN$w5p83)G9u)&V~;%?J3oj2)5>RAz??JM9kT46v{Q z;=!y&_AyrrNR}78m-yY|&3=oHTMw(OzNm@IIwBnT$^^5L2Ik8Hm^UX~nV10o^;&>v zx?k^YL0BZy81kZj*xRy#$Q{jQGerMQG{_n{D7>P$^2A8;5@k2!zLK*o5bOF_6k_tr z*_$ZY0B>>4+DP?smk3eL6C=!&;Gj)JE%c;xVUOr0R8NOKZt~_r4v>mDz$t4#h(un) z3fiZz+C+mShLM?e;}{N<$dTK*tJqe*ypW?tQ~OX`ds=?&sy?-8JgD8P?ZgFxiu=_3 z>~=Za>NSc_X*U=%H-7c1{n>33Ce^F3>o*b2wrayXX%QfF>;7X{QxGUYQHk$ zdBen?>RDF+=Lt+EZP=@74I*ANo0>-j{^Zj!N2lYW<93VKDq&R(7hCb1;G9atv59V@n-HlrH9L+|* zH&+8@^?MT>ccIvBh3n}auq}QBjw#}>fqB^b6}O*dOIB0Dp7@h2;W7C^7mYE6Tl}>_ zrQew8ZvrMO{mrm9D9gc%P7EqN5LA-dDLg}26i){jlZ;;$HC zg<%xQLbaVR_hF~GA<~2{4mk^I+PRTPjhGstU3Kkag91*mo=xfKkdvCVJokbIaBbGTU z^`5T!)ICeyHX%)zCssljbGmSg85Fc&yMy`RZs>a4frKt)?04h_jMk2=j17l8k3Xfs z+g|T|JSlm_sRjN~?+uoa@|t0)hP}wf98HWdci+fK2w}!g9KyV(FZVXOUthfKu&1u= z+%=MvYF40#ZeqwvE&sOk0m<=^gq`xyg)7aE-1?k7i?$B3G#*#sA>eWU3wmS1i6 z*Pkqu-0oj}mMS%Yjo-jr#kLU@E>4VWl?Ob5y;kpC9ffn#-rMPQYS`xNNG*Vp&G&ya zK#*b%9omY8s<;wu_ov=QKCV^B`+56gGz(-`HU+6xB2@YK6PvgV>+F!5yeu?+jMMfF zvuhJW>{WdI8{;o@T7O50maC;^6W3B!V+=-qNSEjAq0kTIIW2Kozi2)le*)LIhrRb3 zlDC|Q{qr5OXC!^5OK8_?G^HssZ!Ec-jGA*g!1(!LOk?^og2(p1Z}rvd^EQsCMzRnl z&lVZR5tgkh%bbgt{d+w&jr}_}S^A62_C=E<+h+UT$ZenS@tLO$UbX&`v7=C`=&9pv z(cKhjwdq3p_ z2Q9ixM!p)=FP3|zRuTFE{f#lX`?QWZk8K0Q(;~U7Hu;Q)31rw9eGc3LZ zd$%{UcRDBGo3-38vyE-HsaB#0R|{6TAa#Qt?S$G!GlbM+3NphzYqSuw$L~7bPR1hX4R&**-Z;g5 zRZySa&f|~Z!9Tp%)-~+1%V|^Ua^9cBAC^9~7?V;j{)j#&ncUt+mpEI3@d;MyN}jsr zx}ysG(;n0{g`wENc}Mm+2CE5IF+8nkSuyLw^Mx=Aytg(YKvxTBQIzh*5A%R2SaH|7 z)oajCiUip%|kD?pI{v{m^MsxR+eAIya8P$;xR{T)KT8Yo5nvpU0SI zMLOE|qs;TH>~ocQ{%-cU(md-J*4D2u&ntQMmUM0$fypiVs@%LPMjNnIhneT2vd?Aa z`ONHdsd<+6VC$Ed=h@lkV)Ohxo|TD*S?NYSj7cT<#XD`?>`ykgs8u`-|A~e+o88c1 z+(QqTop9RBtz>4|hLs14gkC_ENHTVCfvNAuGnE@?*{-pvtQFj+@|QD}%X?SW^6pc) zI#W3<5jHmrt^GcgKlxoS=0&|LYh(7QygF0aUUezBFk{xP?Nj;ZnaWoLEhjE0*Bb9r z@up10)ANSFX75vRa;D;ec@hHx(2STQNyvvb{6}WdU zpFm{ffKYJ1VtB3n2jf=@^b}7W(K4AW{V$e^40$lJ#RK$x=O#i?@Jy_azd4}kEGZgF z09xhwD<&2fERs*F^CVXkh0OJl#gN{N+Y}iFHpwd3P%Ms_v7^2cBLrYcUHi2~<~$QP zIlTQKgZlnp9u8`sScvMMelU=m_`2oX;uh0F-jt!f9g0~t9!4^>#>psshqSN+hM~>H z95*}9c$?hX%}p^ZCy;RCwfi^~(iNNnr9)@9;-}SrqMX5{?s$H1L9lPgPlp>@XJQWW z!&>~Fye*fePUVN8&wcIZI@Vypl!v9ZxeTi~8Ooj86O_0MbC>;Wb+^B{zsr7V!W|b= zHIpB90Ke^WZ#tLde&_)m-W!=5APn?n6x!sdHY!3a=U|B3><`xb)eYyfiduj%$HSKB4$js_Y4+@fAnS^6*Y(L%by9dqa*bpr&!f`^F?viP0) z(TkvZj^3p%?)&^o@Aucf+WYy@KF=q-#`~=KdVU^mVf(><#Kp61-q4)w2hD{8s=1ie zdge5LQ5@-Ws0(s68mqIqVNs4l-YeF@=jpQj*y(pKbiD!Z3_7l)znau>Kc$l{+dI@73V^mdvcB2L+HMKmE|Gtak1wIA|b z;vig|u9M#VUp!UB&Xck94er>E?>MZP1K(3moy0lc^x`|*&{nzc*BMO>a4F8EO+?V8^%J-1GaH0qu>7ZbUZ3+tu;3}i^x)~@6{Ag_sl{9@=dJ4Schxhkg zpQ}+LOT%+_*ado;!IR*JJyq^|r}fV~bFwGbic;@|25))%-B4Y7ta31NM<_N}S8t#v zeii{3bZF`n<6V$GPBS)$sFPTN40a@kCyw;}9p zQNIi6w;|aOG6$CR%5JtwX3ILWC{F7-UWuXkOZgyI-C4C(oMc-EQ zE%?39s9P8l+fvjbrTn{8ZkZk8m&dOl@5&qg_e?iVYm7nz8mS(B!4HLFRT@!+a?6}_ zxLL6_T^S8z+@t&ZdQ!*GaRy%U>{)Z)zn6|J!rY?6=z30(L6!><8E8+aRfPu>M_pi2 zb#bNBs(UbmLiKL)lFIRd30HW8Pk%7IQfPD`TLjs~C=HzpHs@L}q) z@N<`G!o47d_Lzk5^pvn2=6_PfDgg#r{RHwmZM8}yqVMr)S6=ycrJS}w0Yp@oL1+a2 zy%964yEIm!KKL*&Vx?}Pav-N+XQ?uRFgZP5_m3TDdpCzMq$TDp8^B-f31X4m^V7^m zwx~T!B%^pT{(wCYL|g);iSP&4|9WpJv~jj}u*5%YvT3?abW9sn7fCd8Ahb-A-pi6g zfJisC#lPFA_seDn5}TMEG)ML*;XY=axlhpoKf3*2n=OrTgQZBTAYx2YW%>$B_i!oH zqK;9U|ABPM2Hj^X#wI9{+g{nkeV1k1XKQniQ_a4}>j$^3DO{v_ zP{bQnsUc_N15)*BBFP~aPsqs?u+swn?w=PGw47VcJ!tv$`{oBQTn+)@2L68;!`$fB zrU?joPQ2D}6Q5^z{?#Af35Yg1fH)^-96i3qjbl%WJmO^3Ti{1a*s?hP9?hvLFh_Lo z1oXMQcc?3Va=GTaDJJZK{Mvi~*4Z_HV`7jnl~#q#O0Xmq@%5jqm{>ySekh0rX`fid z7nw++U{o1;r0&h9nVUUHc#0i(S_K1P4GUW4loT}e@19f@YAV( z)O3UL51E<`<&B{&(b^r(y!&`=1hh*?gzMaXH&4!j#-kdm_r^DnUr5+tz9%X>Os?_9 z>6;pBm*04-U8e|AQ#9neMGfU#g&C@EA4A}11s+_O)BNTQ3R|fpsHu!b0)zK{Lut4V zw-}rSo(9+Tfu{-g6&1{w-*R&aZzq;D9oOOtw)P*9lN0#ht7W}vrk^)@$wD{?(&uXo zCsO-j^PTnv&VuI4%@1ZiPxI9Sf1G(Q>LI?D8~)^C)IdVOl|W3S3txEIal2UrE3ZTn zMB#Ajrt3A8*SD7zwl`L!UNEf8z7IbxXP!rj`NyWE3qR6I6Y{^otMa}2_GqQU|A$6B zqDef6+H4|v6ICW5rZP?M#ST?!hLHh<~p3ax~;(|(mew7xHz~MIm{kJJ+ z2=J_k_X@|O?(|n8wXe)N7JM~1GAjASL;aPb>+wmz>V!fzIun zz!oHDoLSTyFM*V_s(BV;cLrr*TM+q z4?kK=LAWCWw@O}GPayb6xse}fQUx;jBjlA^;$Me{rg)elY2+P@zQk#|0pd&9q9zs) z-HgnGcj4kUcABEyypDnu0Oa zd?ccgUiqj&8555mwyV=2j7p{W%J}Gqjo)3^*6T1x^$hQ7UJ2XR9R{aFi1KhM51(*m z6QOt7O6UovOo)FZ-bt|jNel>tK)eD*lx+S83Ze-jjk+-x81%SFCEk`sXg<&e&Hpp| zprtR-X8er_0J!Dn=m-xl1?TqVl#qh6oGj+fybc~fgNCCb)vNJ}!j3HRXDDW*_HWL- zi!>e$z6Z+qCwejuB9oJYH&l1#U9N|?Zbj9lwGG~GC??zBW{9RaA49AF?p=1YkqsTe zhLU1$c8-3VIcE2%ySC3ho%q8d#?7=c@Gf8%Ydp6s+!84-3?Lmo(c4unORvr9M7)i{ ztLdAfh(=&F^h&7Wh6o#I0IkK(6yG3*wgs$SK6AYeH`^{}35XpsNG%~D=Sd-!?L~U)-5_0sb{sH zEE0YjKBcxrQ;*aBRjHMd)MkTXbZt3vY9Q?!#uf0a0NV_n>DGY90lo~|3b4)KnamIH zE<;Phj~YBX+RWX^TbKySn)*W`*=J|LG{qB@yG4v|&C>b8INq0M-jh2C`S1J+mxzCy zk!579eljm!-r{Q%u4U}D9|s~DZWPl>TGt8^Z!kg{a+q>#1T54<235aCA$W~k1*%Tv0aUH8%;IX>fwl;?M_5TXz8OKS z8}2rXn}(UM_!YO38-5kxr3GxmueOv#YFCI~0ol59BFnFw1&IDuT*FO(!wXGodYKg! zy^rOz>fAn z1eMKA?FO;T{#$*`T+?fxO;}(?6fM@;EX)vsrwn7)<=M1B1dUE45~XPr=y2{bB5<;p@jWeeiYE-T!2K{chhLp8C%J z^Z5GSrhf=u{oVgh;;Ve=0(=#Z{0w~k^=7*sbM!@D{(23CS^jz{4}JLSVYcXh#$Rv! z$M`Gfdxz8QzWntkl#5de}~Wh z+|Y07N^rq5PU?fVu{-`rT`sn}4CFZG#5J=sm|EcukZ4JEHp z+KKFur0K()cE2rcLP7a3tDwAi<1v!E1O3F>k&SwiQM;v_U`IwdxfJ8Ud_n|Vs@OslTYloNa5NJ;F6hq$6rgkx>PtqT*ElcTCEZ8qhny5{8 zXmG?>7{3YJ5o*_Q1Km0ur2X{)L)v3!n2E8Zj33RFbD-pi@hN#MTR6|s!=+VyM!Kt= zbD75SLIz}vytaOZt_GtG1oJv(tn;1pf{cA7u=_Mm%jzc^d7sr!cImnuw7(+z9 zUSbXD`R0g=S^7XPvBva#d&HT%lwM-!LST?MUVFv)W?^QWv? zK63g`2kUT<>Lc6eR3KwIkPex}P3e`)IcMc-(|Hgj!pofDVAX#gFE9LTyfk@xgqPpZ zm@QrgV7d=>e$Q0FiMJPaUS_eAaPD8e0&<>@{XK`Dg2OC+K67jzs4u>wFMdis`ETN9 z9z7L)#)tqjxS5BSV}Fx}m%VUOX1km{BYR$YLf;X7tu2R_Gxd#ux4w8el{bb?TKlWc zt0<9a;4|@1c7m*tfTJtgXl4E&YhW+1_&BVv9{X#me~zC7_-JlW3fp6=zi%IC-e7U@ zE`y7I*FG?Ni$z9Yua9})vg|ro6L9J%GqQTo34rZ?#Xdmx_#8^&F80Ew^2@*EQ1UnY z%qSc}BMf@3S6Z2G)I0f2yC~8xj6v`GWbv7i+QrW87g8d$Y}6s_xjdk8M0Ey5=wWHV zGbPDWY_yJirdb{EjsG*dUY2(nyB@rA4`Vl0$(IalAcEi(kU`QFIG#DTZ#8dZ^R0bx z*4Y_D-}98Zp|vvfY2t3}hj6Ty#jy_ib)bysbWJ8cO&*I;X=Q{HB8>l+^n+cmj17ns ziJM`$;*?0Na^E8@_C1I1a(K+*`)fz_!S`Xe_r~|8Z{*?nK8Cj(e#)?!+LZ_Y8UKcx z`}Xk1xu2z1^ugQow=??`;O#%aKRGkWqHe%HvnOCWFo|N{`yi`t{2l%&h6(?Siho`L zyMvv=CE=e-U$fw;*fB9damIZ9Y0v3aG=|nhLtXyzbf990&Dv9EF;KNA25Jt91O3O? z_5P&~-u@H$=YJnxW8hH0Lch+>zk{#0zit=g->BLfUuRR2#n)?j*blzyg1LVJzBWST z^6c>Y;Ok#N0)wye{E8G^r;`(T{mi^xLk2~c&l+n{G&VJ`6Ik>l>+VEf9zQq#r)6Ad zXrQ0LO0*G!d&0^FV?Kx!Ay9b-2yc3+PIZBNh=zahk$o`m?%Oi>VRWwEAF}x1*#yJP zS{QE@uV>B3;`G42E!NRu)-L})v=?OL*c|`-OglSgmvGHIJnYRs_rb>la`67y^6aPL z<0&s&@Egn;{e65q)&Ixv@h7?Q89w??!$)&|mYiht;7Mhi_7;7!#JPJ3;)hFe0$mPD zz9VG_2KO_NN*5+he52K#%~ zY1Lv!{N3*;)wvYu)173pE*vF+R6t+u~Nw!iaje_Ay4m$dy=XZtH8 zLb<;EDfZ!5i%yU*`{@Z~xK6m1XJQF z)MoyFGXpdZDlqMak|NFD+rSbO+9kLeW6ZO5c{)?%&)-&n4L~LiOtoj~?y#oTu9_Vt5GE-plPbF}%#;ZnVR51JEOky7%yc^`kT&?#=%1 zJ3b^m1Aw=h{dHR9SCs)mr|m&a)EMGQ_@#wxdqE57v?>N9x0nczFSFw%?H3NPz%aSL z$(;m@Qe4(PxnJI6dHdwzyvK_6$=H}}h9oLiwNGZQnaA`vipI204(8ei#-$(a56)Ar z)QQ|)s9vvVt1>@n7TjqSU(L<;;eF=&z31(GXB>5vBfW zvnx&9@r1=6l!_!9FdJ{6dl8lVoWFh2u#jguT|%p|e_}cf;zTeT#U29=N624#pM_5eJ7U2BHZcD^h2i#2C4>IQCAw7Z1K-99mHIsFKClZ0{=_yaS5EY}Cwh0l&rF^dZe!5~ zj>pQ{1dUf&r$2^G^k(p=;(N2jRVv2pX^Ios;tCbt5)>n`1&x%eShq5(k$=q=%VO(& zEhs+O7CQ@;skAaE{W^c^oJFs1f37nkF*q2)s}0$p?r( z41pVj7SK%F(NqX`*OeCY9s0@%CP&4u01!?S8WYWOmb;;pg#?DeU-O7c4eaE_9UzL;u_7#&?%Zx$BUs6vw}pXIAri|P>t}R| z3@Q~@YD9oxep6Xbz372`)PeX+DdYt-=bHVREU>3fHJAPYz?tPwdF`ccB|7C12837Y zDrcVZPy}A7&Eo@y&%if39`mubBac0$_Tt#E(LM+W=B8hQ1f7YM8D!F`; zG-TS8S?44%$}j6S7Z|7|%37E2Pt+KzR*?F4 zD&aq89<1xP(ys|lEInDkw&c?jB6Dma!9eo5(63)@mr9PrhMon_vIb;?NqbgixJgEU z*NI;3Gxk%Npadcn7MeNTSy51|Z=JS7)M}!!M4>sBU4R0F-bkA&@pt^yHXxnY5aR5K zn^=WJrxn4;Thu$n9JcA7Iu6{b5LOA9R5RmrD^s0+i`nwng}szM z)|-WD`f>V?Ieazp@dmS5ElfY-pKo&b2b<&izYbQ|=5cw$|9}PYXsI;e&2lkCd&^q2;$l5 z%-h4qe5EL!6*BJF16VN_(^jLmF&oPB!i`5mpN+ree&cxX>kRnQ4oM4L*6lg#7kY&x z7^3gAG5qr`Llzpj{vgN1$epA}O87Hqy4mlx;ec&-G7z4%OK;)CEcWvwiWrBn8Rerv zAioCo-xr-bW@^1m01wuu*9P}tH^Z(IyUF31l>;pA`Yb#HlE$6XG*=OTX1}2*tQ_2&?Is~h;97PKlJ}T(ybzWw=TFdWz{5SHz8~$|Dkkk67 zysFo+WI-0Q*bp0Acn`1BKg|EW50snerQG`r`^7(%FLmx@j(juh*Tjt&_WL>dYVfvY z>}DDE+dDprOzb-Uodd7S=qK@A4?6R7Ae?%K4(8i@oY{=KWqraZ<|Do~Rk#UM$Lda!1Gq(K=}TPiNw<1y>g&t{XMm7% z#|+`B(Z~|F;x~R}xzlFVw|D)-j|LZ*l%NWWW!z6`s_Nhaa!Nd z57LssJMj0uqLP${YZcH+wTd($AnZrPTVkW6p)+i>qS1W6)WZ6Gd~V_lTy1}H0uu6y zvS{sdO;4HFX6E}1z;vNBU|73}V zf~j+ow?KyD%gX#^OYZDxEQ(d`h}6E?^s)hjwBp5-o`5x*S`n>YuglbmK1TvJcppi3 zQkwvH=pLNDjOF*gnqVEo_Wf!6+IR8oeCdoXoVFWT?DY5NTacSdOVSAG>H3OD(e;Ek zRHe?M2L2|bN6=cvnPvC_H|~cxf+# zlh-1YoTIz1kQn0YM}|A!F2}cQWO(k|)L0*G*)uYBb9msg@b+bl^$n+WDaDQKV^M>5 zGzT9}tIij3j{p=?oJp>YR6m6_+5S69qoFm8RIdfeJ4n>!=%Pl}o!mBavYkR#(neicSKHKAzy#!C?&|CIS3=78AXl5Z!dpXs+}dd+u|ejkMVoG?ewIJ>+aepm?NRiQYu~OX zQ#(R52TGD#(17$f3kuu&+cP3VFU{f6j?k>5?FWUuK7iji&clT>Iu~Pt37Pqv^Pi%kyuI50BJCgQ zEI0tXa29-#E_Czp5@$h}8NA6)l7DId5zZn`Bk?toc0y4a56GHnAQ zNteG29O%IcZwCGpnhsAitZ6*uEO3i#AJ3W+PbJ0fK-KBj>x=%*g1P~j5;LkLhHJRq zAxlMIgZ^jz-|K&k>pbat{mm$P^QT}upa-|x4#3h_*3)k5x$zrHLX0<{7fYG}H%Hl3 zAurKn@c~ep%*GFOp)=;Blk-OV#oOHM+B_0pT{rOsJ_?e272mwL~l)q$|8nMX+AU_5$bCTK{Y84~vXzWmsJLVl7Zj8{aJCsQmGpVMjx&0A74^vwf7OGb!P$D^*8!2 zK5j@}tQO1wyQ0;kCE3_K+^v2AvYFY%Yl&JMg%gv+Ohe2~qLZ*lX&rQMnfS)V?6UDS z&(Ob&Jg++yCC@`_FNYy;tM~WC6urIp=5g=)V?VI}4Np(8d_9sl+lXHrn);zgygwp| z3SNQ2*0=6xa=8Jid18DMI{1hm5yWvrh7Y?9eFYfg6Gi zea?_a#IAP`yZqLbv%8>s8{D}&t<-fo!_UZDnf;BgpF>02~2yG1$=RW7{D7X6aveYfbR zc8erN4~Te&2|m~^GBG4eL;Deo!PSiTlcf*r&jJ6e{W+7RvHFHV$`(df5bTe3hJ2cA z(*N52%xq;HoVJg&Ny;W2;LkKbJenA3?SYU0i$>a}_oGfd=Q~nx+PYnIoc*XbvgiGO zti20(RMpl0p9z5^5ICWtV2cuTw4`cF6qG2|9GU2hP81as6_tu2UW!yEfL0|q3FI^# z<+Zlj*0#3weQV#h7h5exw2}#TyaiB16bz_vhNw`i1cD_0&v&0Q$s|H=zdz4I=A3;y zd+&AGYpuQZ+GgIJwUK{C#hDw*Z}zFIk*YojJN27r;?@r2cZ5x-tfhL5r{9DFZ+8db zI#0ieaFro<9fh4-e|d)d9nJ+`l9$0NeEo(?{r-Q{Z_X5w8~&4~H~&s-;^Dm(abB_G zJ5X;vn5Uy3Mz10M%)>laz@0Eb0OnN{r61mflv57#{M^@TJYi@x3BF#_mEh|&egd>Q zZ%(eSOQ40kO4IP_mA-nD&f!WsF(^d02jr%0z+W%$%V?RlZ%IE%lSfbe#2ifdGF2g% zub9Owg{Fd*lCf4Z-`D4*T1|_{0rrHb(dhSqN@?BLFj3ioVa3jdNMgKU#u4;-+ezBa zGNTS}Lmhq}b=YubyXxRDtGbF&+4)JkHAxrX%d2@eY-1@8)?%30E*R#rNbv^o<0T|U z1Dm24ofrO`=SXowBr%9xR!;zO21gwPmkaVjr7v4GRVrM%>8|fai#JsSHm8?Ra-9as z34h?AjOXISsfy}U`l|F|UE8_~%Lw}D)#z+%Bgv1t^x}g?FMii!&>z5{o6D=;kzPCr zz4)NVp}*dVH(hJ7_Z`Crro*QX!KabE?%Ha^V@F^T#rt1ULTAf1h$#F!m3NeJg*HPu>4Rnj!0-sgZ=O7Wx^oUM8|O z=P3ejhfCMZna4!hrOAp!PG5uvBm7+@9ngTwBjpTvGLkrz^)gzzC3d0K%dnFI9$L~m zqQ!3;cpyO;JH`I0Sg?YyduGA(;n5&?lmUJvt&l{A!e4$$Ga>A>2=e=ICDxgkhJ3a z1&cX!#M58vE+tqXyTlFhc17bmiwjVQQof3bPHrC(-#Ki)z|ve+)iEq~LVlAs-9MC6 z$Rz4|WP5m%r>j;`4ja(@+#||Ok>Sz~8-G<3XCbo?DS6ju& zpP?^^%2($;#tUm0$BGYE_c)2app%m3BwZaG|Ft$i)=(x|frr?oUM_3&j4d14gc z%YN`hf7{ci#*tc6B*O$R%G!>+gcV~EV_buz8t&2qbbf1t?+4T zt>&om>;8JvhJt2jscUZ5&s`Z!jPInS1v(CE5U|TWVl0)&8D{;TG6%Xq|H#`aS0uSnGGV5AW#cxCS%qX#^6?spR~; z*%uXkVTs~eQ!Y0j6g1nC5%$;eS|0J%OFrVs;GP^6PQYygYX!2sR`u-+(yVy{wB}hg z*YYlK<)cn}LCqo{y;=HJvh;0Z>01pWSf-T^Zt5%63s0t+A*rJ*;R@EYmC%MW;*mb<#atpyCtgxfp3cfn0j3y%c1@t8yWl}k5g8i%wDa|H4(HIYz0 zyFv?p7t)XV=YacVcYI$KBf@@#52`e(FEaR@o;}SSQMwIWcDR3f-$f?3ZTx zd_c&^%JC<5UOk9_;zQhD>@!>IzwDgRN0{19qN<`lLXLlc|H5~c32QO<-va($%zM{7 zo@;X9ViNs?|J%X;CJ+BJ=22d}sb2h%Jq|m8v&I-L%|X;pnZr)}{}<*^{z09{FP#CYoCdjlLla6}F4>fZGPq z4SI76!6%}foo;_x6BC*)91m1}%Uj@SYlI9(m&+TY$jBi|2_yjw{vJgV@2r}$HMu_K zOVLAkMP#iJ{dx3l#+f>btSOk(C5vEY}n%FR5BBJbIlYkHDF&!J4 zv5M9-qIhUmZIQHpKSF&!38*;=5}n@j{a`ftg9U6>@8{F zGEZXiMoSxK6}E0`76^KdPfY;x|C?5|92>P+&xQoY zJFq2nM7W$Z`3Z!+l`J}u4_mjY*Qp%GhLZ2+vc!e+Uq)zq2@T~^Yr&gj85dga)cEUP zIs2d>Hmt7hgeBgG4dEm%e%g4&h7(8IAD))=(hzFlx?0lUZu#SbRA_a3Kc-)TMt877 z;SQ#<@hAojuJYC^V*@&mQCyUm(3?f&gRs-0yAms$6)gVJ-y_9aB7}dZ`;`hrS(!7o zDn_9EWF+~4x*f@X1u4&YQe(kI2BUL_dnvOcjO^y}?dvJdCevlp*YJ{8y}N2(;a(-v zaWhEH#c<#UXZwxH>}HOr7-rbvUh`GQW%ph ze8QE+c-(yEu{N+_1oE!&y}5Lz*+j3lR1gtjgsB!VZ;~p^{)m!I129G^evQl4-DCWU z8x0z#E3P(gN2+*w2)x>Ir}xF5b*rf8)gFWY!WXeqIjiV%j{7UW>W$s1PB?N^I(v4A z$-ULDXzr%$9Hru&dF;RIo3Lsp7A&$B=R2=Ec)@&Jc+eKb>H_q^;;YX%$dj4w78y(1)c&t4*ywasJomTo*;QrK9 zjorY?m51+5L896*eTrVtRI}#(aN0Wxf2N#qiDwrpuWnG#PK3&vZg03Ll(=I~lO0$Q zZ|kRfcg~G$J1vXrmZ#=C7Y^+2Xr8txeqh-BMaKRC8IH*iQ+>HEe&G0d?;BiUq0I3H z9b2ypD-P3ZAaJsLymo$D!{yRvfA(X)JaUCIg(izl1*>{Cy-$yb3wa2V)60)bjZ8>GmTJZWwr|zNJ1I` z;^Y`BqK{XsfTvm27eNj@T?5zP3FG5S{3zuVt7b0_rarW_{A}Y@2g`~Kr_w=z+)W;v zT1AcoCP4I}DHID1RsK%@l;>|qr0YZD?R51gyxhKTEZtI%Zbd#W#1k~ICuIF`kHjwS zoT{0vR#2NRoMz2voMu}y-sIu!Pp$j=|9$Ie+{JODN&H}%)t*%D>!iFq&DvPbW!^KG z5?+^2v+hVLGAN#DmESP}Md}1vP1`%|eJgrZ9%J9SqImK{jlIX$AKyEWZ^>%le-u%tHeCw|~K>%ouoww6D{U^0gx?f7dQDcM>|_C=;* z+}rKmw4+__!p0bp`Xxnudh+(`bt?J|6nFe@Ga0zH(+|tQJ&(vmw|U6)n2L2WHpP=T z0y9ms@2mWZH&8TD{ZsJ>!ypom-ND(Q-c9_OfAHu0wW6Em9}J+vS`VGk?IS1s^N;Mk z)$5)7x4U}xk$IcYja$ec)LUH48u7eeF-cL7{P*f!dEyReE>Z3=-QRR;^2h(Y$!Vs^ z*j?#<#HJs4hRm8V+N)rvi45j*VG}-~_kY8VAL@svMq>0g-#v}U)?z6dqOspI=1JZ;BrnEP}Qky3Vk`G{3miy!}H4Hq>ub{*vj=aNgj^6|Kd`m=5K+ z+ivj?A|(cfuAJ^rC=ogze!Bmhkl2{@kg-vAqO-gukH8z59K%#={e~BrqUpgraO8^V zJ{7nXepNX%)2D*2KE>20@u{=BwR&o1t08)cbI1{y>Nla1k_L~h%B93(r;6RlflHlK z1A(}T4N&B9qdf69$uZaI`7+>6_xJuu(Z7)6bJqXmQTaoq-zNP0AClO~S!;O_XQf&7 zu%L^#T7TrbY3BMZH3V}l7wcRB$K0TY_rzU)^mZ3_Z8qH1nz5#fxl(LpCU3<8H`QaU z7Ht}RXy3A4m4&x16IbnIs3)f1eO7uDL;x?6|vR!3?B z^Nuz)70qb3J9t|LGku(5UG$de|75QDjDN(jgqwoHWRiT(91CZjnRx{h8dm*|<;c~< z*%WVX9*gw$vH!AXY_nC};J@r2yT>~>L~n5Q4`jvP&-LP#nLuY%6hjBli6r+v^M%-V z%MX-UcFiJQ+zgKK7E@gMwVF6a)17Y(VWo6LqW^wWnj*i3$Mjk>*?c} zSnkBsXmh&^NVKc=+`-Yg}^MB1UyyJ6o?Fr7Fi3V2OjEY;G2eHc%3(^p~AhDne zVx=5^*D0k1zt=a~^$lympS)+jGN&Z@NkROz<}z#XKKCA@jaEjy^~02Ee7}o+ zfTq5l`T%`ZdT;WRKJnKY%y-xMD(uzFRLh@z`GvtTtl8L1e0x1}X3fL@%-fAKQV=f!0uo8{&Y~fn-Brva!$(G}wU+$z)-uWJQPzfC8^1 zR}>_d6@*H5comW>c~*@;D~{|q)s`Ia>Ub5j3_YG)k(*qW8{#+@Y4sd65D@X7`B~5m6RRI~)DKA+~5o#|hFL714yyQKbm%wt$ zvb1v+$(zE`n4OiK(+#b-@@xEG<>?p~nqWhn+aMl4Os_|8nvJ>m zM?>toG9AnhIRr73oF)OlL`T*+8Q2C}84>xM?QAI#K64n1eH;aSG34t$-g{tH`lv?$ z1KYb8zOl4<_iKi=iEmE7lsjvp#V=za>=P|*iC7nI3C}-RMc(W`E*0BzYj}C8D0Xbm z=KnfqU{=d7(Ep7muX{bkoJMy0WfGcyuz{+xN9h>U&G3Mpb${7+U{-1h8R|EbKO|#~ zlH*)XWiCHuS(Q0BEHv(0o^4ehf0$;@&ZC)QO*2~868+aqx)?SXcGk8Oa^6DD9q~ra zz3)FJ_NCIZD?j0MYgxxlNmM?cUuKxcD9-_v+i`+VjDD->G|ewQ4yVnd#Vg#B>m`qd z6TP1%M_ZUB@3ah%4HFwI?H@cQM%*i1EWN|+V~SR84<`m)ONFzjf9-XMzfFbqWbeLW z-|NWuw`Xt+b3Pt;+7rv2SG_3ZtY`e=yG+5Z-{>V!i zZvr@=5e4RqO8tt`(-zV2SijI^UZGREs@>qF9LpTrczn(3?B|uHpOtt$eV`8xW-Kq2 zsW*sJ_gu+&qWQ};UmQlrz$pXojPGsp23s=>+-doX&%eb?3tEIBs`k666!GwREaUU?C2T9deR6F5W2K=W=tGR++YOAy6{AY3=??mL@A1roA;Njch%clgO#qT&SXBu30H<%x7>@ z;eFa(WsFtRt;Gw=vYE4Us)M3W@1{W9-V0(JW86*(?E9iuPRm+yH_u!ocRWAt+g~#m z$xZK}u6W~%CUoXQ+|7Bj!ddAbvgY*6XBD_%UlvY0S|uPQo-5=h;-u{HQP5*G?ZP-j zUJd%h$x>|rsKK$tKTsdVS30ifmvw_ZNe=SZAFP^Hl;!-RxzrclIh0o%sW3(HGS+(m zUhI1P)@Ni))d^+#j1VKI*Jvx7i?HtDItjp&_EIW{!HR+m`ANzdHu5Y2Omj3}h^_TM0 zxd9pfD9je9&hVOfJHILX+udM>4=SBY`V9VKRrgYM{6LYlPzB}rlDMro>ZGt>>h!o9 zPJEYxUO!N8+(#{iY?^@mtM=EL+iBLF{hwKT8Z=`j1`_ykH1TUeD4KXi@S;HPhbe%` z!YUpbq`>8cRxuN;KO@O42y$V?YW_D`#RWmD80RAQvJ%L+jIoGhv2_eQE8jG9D-D?{ zY`Uo=jQ}Nm;yjaM+M$82mU6qb)atG}Gr!Z%BQwMba*zFD5nnVB)$IC-Jc7ZsYXH?W zp3|TjJi>q~+zo^6`s=;oSF3m|qqzIkUI;KP4;#4%J%-sQw;Lseqp%@yiinO7E4D?N zw48&+1OEFYh2t*M%<- z%bb!=RWb=9!gULU#$N0j@scULjR(}+&nQeDG+qndW0a0M9{X~CelR!7o@8I0?yY?} zC?Nn>INRWd_EjRr25N*8&j|b?$a-GgA0A-Pi{nC;Yp#ZHDlvVek2Q9Sa%0!8G}Zeb zwYmq}_|?gWnRMvsMX&t(t0-T|a~eo@9kx6+8Mt8lFBE(#$EwkRGGYG=0foc(c5Qjq zz9f=qk__v)Q2%z_kkY^1?|VvtIy^nFUL`<|+x6XBcus$}?WDu>vs3=)c+R6|0uVq_ zhn?iqXSrF|-;kc-)MH}8og!tJc>0mVeOMjwIo`RS+u51q3B7sHpW;J!rjLjgf09h~ z`ZWCCey`J0osxkRc4redp)S<_bB*lt^vLcY5Bx{Ez54b@R;N9O_tb3}?}w8g!vM{$_&toV?{J{lZ^ z^xX%=Xs9R8*AiULa6espZ+AQr)M93g_l$T8B!ReIx}_5PIp2c^h+jhkW!Atx;lz(L z*X(sEPDOQ4-NO51Y#@AW1E$1y^Bx>si`=z+xselIoyn%V=G(q1;=C?qierODsa+Z) zzfYnyN!~0Ex-^@6Fn$+Yq%^Gc&*AkK6&a}RflxP45q?WV+LgJ%fuk>rQHR3`aBFF%F|q;0~KxEn)^!P%;BAEatH zF_A5mO>#kt@9$$R*h#-I>-OS*1*~&7I_$I{i>!~ z^G1&AhYX@IW=xCWUkn*l3$_zjW!N-l4WiEecpF4Dp5i5I5KXL_-aPJWB+}Ho^xoWY z{R|I&w_Dwl>2Inxw6rK(M?n8{o1F~?a69qZ)c(3@v+_FHt1P3f%CB^`vz3YVTq4r) zG@eFz>1?|;C(nIBMP3vQ8M+Nw&lTiND|ZSwMv%;=wb-9qUIy>$IHi$i?w{Z@u^-Es zr;1O*hI_PkyV|?x$nANXAuX%?`rX>Ks&%B&e9v~)vB?_WwjYMnz&YU@P8R132;l<% z35Tcqup95qPxo>aJttgJ%*i&Tj+_$)RQEn08Q zxju{q&HNh{E`21}MDm=A@DZ~xf~q=e*Ax5}#ICdJUt<}7bw1tLgT*f`(n1O1>BHR+ zk4Rk0y-MFzrA$8mJyWTL?Fs4slI@YnaGPEQkNiw}uvWmR^RjyxHh0+)S*!4Xy+Ui# zCca~C72c(ct4Fbbbdshm5^ozYyAs!Q{Qh~m9r-GBoCuwd zTLS|E&!g&jk;cHfk8l)rU|i!dQDSoluQDJt!fHyMgLeHIZ?Xp@dn|6p4HJY?S7+e= z;t9uPg-)M9ywh5kIKFy|6o%41-Lh+mYDx;LsrDdAJudt7Xz+Z}k0ZGC{$5t~jedGB z(#I*CV;B2#@J8^{b4U*3yu~FZ=0zNWVboeMrx>s@Y93 z-_0fcLZxH&WBIS%MgP^GJkrBTha2qAx2hHEOzHWgN0gpVdSCCHgwp$xev#5q_woLz z{*_<8AL$n>y&vfX_-Om-1*Aun&awLa{jKV|{Pg~$S17$d=>x3lYy9*9q+g`?m& zs(QXj4;^Qn9tvJ+*Yc4121yw@SyURRUTS{T9SZ5o*;^qJPfP9<+MYaXzi;Q{8B_N<9iEE`-otl`1!d zEu45W!oZV8!o^)T7YiuZEfbZ;R#+RS*mXABmEYS#WnQP3%cgNMy>atDAyOCQ`LvoP zYo=Zr{Fk|UX)-UK%B}Zi|Giefye~4pzcYi?+NE`-OikhHTpfIZ-1vvYR5GfaH&sL> z&I!+d(bRZIwaG*^I$pCwvN(m3t%U_jfs<$+6%u%)WP&mo74}mmDh;;P81`TiIqn~p zGZbP`it0>9YEI2jeKeuWqSW3*ZFioE!))|9QwJewj~O5d@n+LyLY)=r+s;aJDY4;Z z1R?bxYrGig`jm8~bi#D^MB1*pDR}8TBVFyYQE*E_@G^uaSRXCGB#;-Fs84N)4WYU! zfreg7dLX%6DueV8_pud)Fe1bq`08FEkNP`L%7aEBSJs6m^`czX8iwOLRKKE}x*XKL zJ7FExz(OMub>l=&pu{8J8xOxk|M-hN`2NFRHmv9#v*VoQj$8GQuq5@FDTe)`Ubhf} z&}XQLOid4)sBR`#2th!Ra%vh3Np11^ulBv! zPs%@jd>ZY?hcPq;h={o-egKi}T;PIu1v(!LFw*I@p;O@Z9q@aDJS69nd@ISY`wrOsRKIjzl5Zm!Zr=g7kNU~|NWPt9n0-fq zRXy5IE+F|1lHv6o@cQHZZ6FyHHr{F$?VkmCb5d1AlEyV5$lcDpR*ea z|IYo+Yw;v9cL9W2aC+&1yLJ;AwJ*m%QsbcGe^%x|SI~B^wE<9SQ1*9@#l$-$XWoR6Bx{yeKjo?@jj2 zWFt>OQ`I;2$nHb-G_paNcEqZ2J+gDjzJ+Y0t9FPj*dsfG=-MH=-aWE2h_4;u+kvSl zvuhbd*bWh{>XDs6jO`HPQ$4aXh_W4`bb4fG5NA8Yd0UU{E+QRIj`Smrn!U*`;G0!o ziu^V6!mW*SdG^i)g$Ya=Z{BUy{5Pm4JHe_8^Mr-6YKIf^3NaRAFv|j>GXJbvC}W2H z$&?c=J}^I-N0zbO{2$kjMV+?@kN34UO#6%D${`#<(Mn@PE3_Wrm~DH0Q>~w|+>5ov z;dPHb?D}Hy#YF#$|H3+#X}rAVC}W?(V}ru1uO(i&6ICwLYI%BQxlaBxk#nlO2nBL} zl^OhRHTKHe!mUZqsGQJX6z3B&^|(BwKJ1UZjInBdTNQb+ue$&HVqw;*8p#s+=MP7Y zBK3?ANz(Hpai4i1T};WH`nX+xF|Ukk*0Vjv^}v@h#?{$hX0D&!Q`g+>>uNo9&A0sYp1S5zKfR}}sdYsC>8We#Fo4o~>Y8)> z^q#ur4Ssr0UGqXey{E1z1yb$z)HMg2^lrLl4oP->A7n%bF8faqQ09i!K+6c=5ega1 zHK^(>(Ov7~#0U|ByD@CRp##EcL!v$fkh^$f7IdH4czdx=>em;_PW$btjR{M zu+@AU;Zj-!uFN0LYujOe_&k7%`>~~;vj0Q zF5B#TmqR&Xi{S*~KEKh#i@_&}ON$RH&iQ)I;KoFI8FWu+}w?-ALZ!*pr+ ztTHuy)o+piGF>@pvz%Y=Tj=LBrMWT6@Jzqt7^B|31nAx3#hzIH6nzzp*=pO}Ku@IP zKA|*cpH=KD-6*+wR@3^`N~hmK|F_8h9qIp;`M=}&b^q%xUEk3s;@en}qXzjrF9Nf@ z|GF%XBiuoMR$bifo4miHkvgt^9a(=j0rvzoTT|0@4okJq3r7Y;Oyw#JbANF z;=x2)H0+7_GhOv$a5u9u&(}-5lI$Sg?;eZ9ug-dQYca;FM)zZrronJT!J+1VgeI6p z`RQhADa&$O-c{{?1n(ypmijwW#h&(G=9(*Ar!8{(y$cqyzgoT_*OCdDSE%1cNr!^ zM+*Xc)Sp+1%fKhwE1N#Cqw^$fPqJ%cU&yM&lwyKO}K(2%(4f~SV1s>y(P0`9( z?BZ2k-~HR}JAb16YdYJ9p9;eg{Wtt?5B|74&ny>4TOO9>o`})Nhdelt`aG@2EgqCz zJE%{mUjw>ocBiho4OQtrmgSbWJMpzH+gEMPuC3xDw7g>WF&yq6F#9VT zr6(hOx+vlpiXePhS#4~v@DJr}kXI*mbhdIXSB`J;ZeySZD|#vC3g!4l@8)z)j&dd_ z$2WVgOy~4g&P3(-hVS2{bNVRfO6B;b?}yVlxyrdpIll3GZaT-K4docxAbff{$D)0C<@hFW*~`p$JUUU1Zv-z)=XkWD9N!GS4|FkgJbF=%p%=Cb(>Wf^C}%)w z6^ZHf_dk{=I(M#+BCLfqptMAc%1(LW=N{S)eX55%aSGy(ga)H7;ZMpo4r^~udE)5( zo$|!PKK}ovhdi;pcVrKOeTdgeK27w-LpL1L&tzM6ym|G+#Pb zf7q_SCK|~ix@V(0P5g<@@(+9Ee@b?@@@p^7EdNFQN8HN3l3@FI8cT#ZWKY}ferUHZ=8bE9=n`kNQ*rW(~zYqaOhwk_PtbK}&ST4X)& z2P7fI9b5P}O#oK*raW!Eag+@Y5v%LZQ$2hxX(9oT9Mu=F;#l&elzsVu57fBPmyL>(sfqs(u%-G{tLF%Wt89N33)7!`+1`g z6-1sp3C7k3&x4>}AUk%HpJ`jqP3R+kq6sO>#G*T`3Ym}a57*08g&Jft?cn}3o*ytc6r5m8?Y!7BOvuex zR5M+q)}SK(R2mOGicgjdUFN=f6yEtCu)6vF4Z0gFmn;7)QtCe~UKzQ_L*BkHjME_;KVjeR0ZN8Uf z`0Csq&Ui+3O!R+5#WU5qYbnkS_Hwg$gUS&&7ScQZK=P)_3Hrd|-km;js>;Es>hoyv zj!>^B4TSCFM_fU@4d<%V7_ISjeeAAEHkI(InvnB(>MP2uzlWix6vUtt|AmXbYoBp- zb>13}2_<}_|L!ZsX<>O7t5_9{Wr+iuyAV0ZU?MiXtQOr5F9BkNlLTcC7S6dwr^pT! zak)oa+O9phD?T+=HOY0#uG}W%DEAC6w%h>olu%J<*FGLBgLRN5wv^ch`)B9S0Qh*$ zFMCXEc1L!W%BJDq+3_-VrHv=*i@_@D50QWH8(u?upXhX z38o)mA1g5j$gRZ@0_P|U44kGw9bDl~S}TR6ypT96oSgyZ2k|9%S{p_(Vg3-`=WRTE zK-}VA__?h>6cU!MIKdqw19p6Q8UMR`kFrj58}D2kYKO!|+4bhQe4>AD&!N6{DBA#| zTfiH$-e@5$lC9Yc)*C4ddg@FZ%uTUTc67668cb!aaST)@Gi}xvgDY05T^X*wUTP5Q z*jj*a{%L;X;aj5rDL?B0tG#VLZfDX6`wb}?XC4ne-h=EL zDKCoZM)s^{xfpX~U)e=JdAt~}vufj&Y-T{N3czfXP23~acnx_G9{`*q`4KqB3ceVB z5Te}cTY%}8Gx@Py@5A+W^(PaqrqB*y68VIC z-!3hTCN3PsPLBJ)$m~w1^Sn;~T4F5=h-{cd>Sh+Y6{mDBlqLCELHSq{F==s$BcUKi zP$-=EOBLe_ODmUQ|DEfn8B@l2Vzpd%;ZQD6W1nV} zH|6h+zbcw=)ct5;zDA|#KWbFh%ns=~-`$N~k;u5MYgEu5(KST=r~ixzzrEt+o>EbF zOJM~DTD4w*fmY2Mzu3B*V8{$^?D1yZA#Nwf1xF2W&psn_gt{#|Z`L}-n2s*oIYy6< zC3-(^cgL?=d%Pdp<9$t8_wsl5crWhper)FZ7v>XsD%~3+pwXJxi5_NRIA7~dxctEm zQ&!N)nEx--PxLO$?4Nw5k)uA1IDeaHFX_!}T~RmK+!S4RVUG3O*BwIr6*{YuZeh#$ znn!M2|O=4?06%A-Cpxv2hGCc!FwFbW4rg5GYj#$*jZ^ipGVl- zZ{27QUp{;zwJ&Q61$G2J3H;4jIc;5X_-lcU&f3=X!`sNZ`}4qF=QXYv${xNk(C)m| z`quDOB-`zQR%he1l7+XE||{jE*IR|ob?OE&bj32<2XXuJilmsme9=5eq0SfI9xoyKX&*Lp|dsl3qe#=tITMe)Xv z)7bhZ172$$ZD+MTykS~$ZLewNz3e{2KMNI8Wpy@<**V3#Y^TXtJA7|3f2XZmLt-Sm zbv;dyuvb6poV_%~ubGL2nF;x75{CY{HO`)EnGvSry8N}yV7k-9m0}m>WU`-Wi*UQW zp^zYtgX^i*fhR*{u5*+@BE^uvp8bD6?~{d<-48B7 zDdNHV%!B2XVxcPML32 zB$T;sq&4u`QSmnXINIqMDL3OHH#HP*!*$~$FXh`DH@tm9ybW)S&0b376l>tDo8oxl z*GR;n)_pUrf!~dxkWR>9s^?h`{hIa(J;-V3Q9r_tQM_VN_Jk35gs(>}Kc;pBGzVoin@xz=IdIk=aRbEXgK|-qe9NE`1bvQ zb)nK-R&@trS$OI?#IHM!=D6A&N980g3t$0!ka%1gM7NA=W$4gj&x~Hmc=j+EIm-Cy zVKRCv;{h)tp6rwH8RD5gc&o`+17P}R)lTS_(*>djuTxfH^dpa)mX*?$Z-ukneqOXf zfYYT_OrnRkpyNZ|@eHg0H}zFYmaIqqWM}v2tlH>NK(di>&fA?jL@6RgtVuOern~)V zic}`HUgjYQu&*aUevH{(Q+k+i*(M~)g42ce+@+bAlcRD&qKW@il!5SR`YT0+?XXqT zP%4wVvHew3niY>0$|RW;dHTEOq`+b9A&~^i1?P~i8d`V5sJaWs=nS*&1&BJQvhxOP zw?wq15yMd6tVI4BZ1%=NPD{x7ti0|UnAC@K*T-WvpLC>V1`3WMdGfSOy~Dhv=yQ!&MLc)e zN$y@u#2B0=Ih#!Xl5Sq@(4gs_wRn%SNoxT;X|opZ*9(0M1rLHY4X7%U;s3mT?j%WA zo!phj(A3#Oysj6Qq3VQSJ8zq<#p^Vdj%ew}R?Q8djpE8f$kF`GdWz<+_kM^nthYw} zg!9|HpS|8sqm(I7V*IG^eDp{`IWm8R0e0yfm?CTBLZC8ez`AOqne7zhZT%TzJ;!d2 z;6B0&GgZlXuH{oa2Jcfe!HK*N$mS$VUN}@YeN?D!<`~pmWQEV`%8;FnZ``sRIftGj zt_8x^=EJt5;1J$3pY$@m0zUS!(~GS2S)M_oW>wD9WzkMf5R1nBinPJmD0Fs!LO72V z`mVM{ts&olNHT)KKlW_lKOl+@Y`%c!g>!KL=}S%MTE`#BqUG zZFw8_9hhg54+0-8>Up*0hqwvJJX56ISyej`fCPh9&9{Mw%#KK!piFJve<7_s2&x2j*(Y*2QL=we7X5gG}6!<_s$m}@QkyGS*0 z?lFr_%erXlpkIUoZ5^m_y70@YbyYFx_VVV8VM6djIeayCh2~8#D+ArVrlH=Va!v+w z8FoM>d@c_*vnqWoTsJCcJ6p@0kL6;SYz%Xo5tl!9aE~CX63ln5Bs<+BdKE7h^1|Yz(jFFtz^=*pO*WBs z98ksm@@I^fu?mutFndq37Jn|fwVeZ!Ylqm*S|hBUPABF=dOUDt=mLwh+xh<^ry1E=}`(9d({aNfTEu7ts*UvdjW z$99OpOd_yjf>BJ}K<$`N?Mxhra188VXtfu4FXMSBtPS(hqMX`$IzqM6Vey}c z%JNbZ%&L`|A$H;$&hq6AMBT*mwPc<(h9eG+#`Khn6^U(D8eH@ zXD14-krq!7SRuCF`I+C-O%jPa^TP92JpoZ6s(A*Lz%Cs=MhmVFplXm?9 zDp?O0M~>3(2bE?ml;3}(?mYMC?=qUwWme6-VqomFj3B!oK??NBfg6>Ebke?!5Fj-=s6Zumqn51q^R> zKLp@f8ed}EqTswG{drQ(?eVUVKMc*BvTAiF`l;F#i6$oFv6}GW4NxVj#SyE7JKhwE zeVZL1+0e|U8+Mvg1%7zQR(EM31TeLU2xyY=b^GgZIM4p`!Y48vR<$aL&lP%CmWQ1Y zEyL~lzmvLTCVxuyahW&_<@xWOmgPkPd3^_h;{4?X&C*wud*+@l|N44aTBsGLR=0hh zhpF6>^vsduPgVZ6&1byE?^6CR?fSXY@1h?{ma62<870G%?7TmxUPqTHb(BionNjKl zmAV9&dvsQB5Gv8X#i3lL-LMS=F$aQ7IS*ubdmEhH3jNEU>nfI{lny6G>XtsiH{9~C zX!FpjmJ_BAALbnMH5bUD94rj0Q!=7CTPqTe%AoAm9B*HaN{x$~KsdrZjdoyBMFw_i z@F%ox@`WV;aXTR=qlsrd01N8EnN!t5zPO}I67i$U2|JDagQ7=AW*I!AgmQ7vo=`bKjj+*t% zfNs1=+@9xtol-`cS?Try6p*&l;Pb2dHMqEd!P=v=LU+&X+$=(F#qg?lK~v5i2IS;M z&hst`8-hawr`ZZH2egN3pAm>KS|u+|6pSiazcMbK6o^U+-CdE$$#HLF`cR{}wHuua zVkWkV-{6qD4awFR`e7`OsV^$!Zlwo+b3`|rxQ~A@d*SKr3&Fok|NeX4hp2ki>9n8P z^~Obj^KYtm4{fC5R-AvhdRm`2gK#E{NNv_Lrf$9w=#x^+y>d@@<-jJ_WyxUuUMW`I#3$KO#u5?WdhC7S;iM3Hs(sYnbPPAqu3P7RpUN-uSlcJI{%Ra?!k zYFzE*{hzm=$DSeE5p0@#;!g209@ZEJecxM6`&Yf-FQ#!-=ObgZn5s>)lprsD-*0)Z z`#Oj!CZk<4HS*r~G!a;5ARjawe>Pe-|HS?@rq?LeSY6)@Mx#u_ur%xKqu6KdlVA~Gjm^<%WpSEpXcU&=P-;O z`Y3%6eZ??#SiR@F=JE9`_#PUVV>)rWAvh)}{QA!)U^U&-?yJyYv7`%>* zs}Ikq55iRU&`iVN%{7)88$sezK7X&9&-`Wb_n&Mr{JndX4EXr`{R-8~BK zXI>9@?Rw{5T91FNdYSP0^Wp0G@cJJZ?UB}Fe-riy@cMqzgI5skDHC3Uo~Ol3c+L9u zVc_*ieJ8w@sS923x~Y=a9`Jhl+lPf${+a&~yiQnfBzSECDw*(_q`nw<{hS{B6L_6+ ze-C(_z4>2)*QfXOfLHe6>iO{6S4)qMAU|bpnjeP$Eft)WyE)r4=?nh%94&U^f4BSa z>c;;lmF9nNC&T|{@!Jhh@IS8o_=2Dd{~Pu1@jomQX@cs(|7P^yf9iwB|8D=M{O{f# z@cGH6e~tgCUM4-=c({6L{s%7rKL3dS8MnJH!sqdqJorptdFi63o$m6#&|)ThPQ2|f z@cB8V()>?dU~TxyUHtZd&n>qd7CsH9|6B0c_P~+g^C<8a0j1Zc!Rmv7&vkrR6VpQh z$ylFS?&$%awvGQ1e4bIgO!zb&uAUE{#Wi&3KZ6evfavF0mX}QU1fQkFO!&m79|k_{ z&ve3PgSr5GzKfjE6F#e^9~M4ECI1$D?D4=icYk+!ydT@+{kKKk%a`_eUo$Kt zALkF^U9GVezK^V>HSkk*E+bAGZnJMhoYmZ6AM4u@2@p~J(`fPP2)Blotd?!P1cN$; zEL8v2x3uv|ZEJz(;jgkkRX9n`IH153|E(gh&G`E`doX=QN?r+#iDfQ6h)kSwZN~OJsMHbc6#PXn0wd~HY1%@sAs~iAjAom7`)J_PVL~fc%SM@m4Dy|Mz(Y$^oeFIN+9jX<-Qflm&Na-pI+|l&qx$zo5U0w^ZE5_Gnqy zy08iKqimV9*zp%7MvZYFI|YE$$><$Fc;1}LrN|X;_4n_I<#C4W*+g+J-V-hPo5)%0 zfD{~jAmvsz%)!eOa)yS7vuWOTUVM8MyMML33uog8%PL>c_eS8%5j+V)V@2RSm<)q2 zadpTg>?||n-MS$>e3M5C%SsxCZ|?g@@Nv36d}~?XXM?}ssTQWdlyE=0$^4m;-cZsI z>p8Fd&q-o?P@9uY`5@~Kr`ojPKKgndkS)&|z9}Dv3!ZY!Q=Wo)nWqAt3Wjg8PrR;> z5{3Db@s(yPf239OIJl|Z?jnXz=s9fb>Jj!W@Bp!`*R)l>QUwYuEMqg8C^pEp%xxL( z`PsSxgWaPW*IKKc3yBSS2lwseLMaB7oz)q{0zH9nE$8NZ{m8;8@oK_Q=C;c^hPYO!_Zp}sdZNs{bPE=ZP=qXozsHerb9D9zQP8bp*LQO z^x8#oGt(qD)TDbPH^e-9BxlG~L^Gz7hsP*TgfQQcW-sv7}?jrOQ+gs6@xhK@-- zQ;kg*#|n#f*-}3u35pb-pf7295j~!zA%Y2E1A>8i`=|6cUi3J{&|}^Rj~=HSo*s`k z7oIeQOGJ|YF+GkE>5T58$FoF_N2bN!F+`6R|HzX^i)W^35r-w87DuFM@ei7k9<-=7 z+`6|jXmMmGEs6p?S}gQvF<*qlAr(WP+zL}Z$UF_@X^43$f?DA*D*{k!P}Evx)hIZp zh;gK7w7?@*UI+13lu4`{t$N*~T@F9Y*lNA5OfITSvs;(>0kl zZm?EcYbmuC5^l7Jr#d6mb4v_| z1)=nPx=-Jqp5)PYxI2BnEfeTr>3b&F(N<&wCn%f||8pv!V59u%?5_b z_Fy=JUJz*+Y5P3nVed)avSGFJc^hNzmU$@&b%oBr zB{_V+9Q5jXyP1k1XCMAGJN9d9Of-zgasvWX!N7=9Ft~KjT|0?olB z&+XXLmr1=Z&spaFU5_wIHuw`cl0{K^LR|8v%A3ebe@`klM^XP;a)Qcam7!n{vtBw_ zb#QWQgnQ@SzSu1)`zOY|H};!zO2XE!SIoK+cZSKqKqS6A;FYV~x+^-q`D7uT&kpH?}J6Gv(Ra)k-#{vs)HPA5V;XbL`P`URyFas{|$X*Nt~Q z*7CYJFMvN53a|XI269U+rl67rbN)R5EOfx_D}xb6oSli8f$-FQ?iR|JYuqieQ6zhn z?6a5TGqA|>!_5G*V57#*Dp9s|>^EnRD6anxk z{yJ&JKcb+ucpS02uL!83Sw+Y2AfY2X6+Lr9%W0(rG2(Eb@6AQ%Xv0@;#l`R+;-O>UV?SpVOB{Jx7L8hg#7w5$>@{j zrR)4xPx|=+eQ~|li9#U|-~Gl8k3QVl!-*8(?7l8_94Q7~_yShZHB3(F9udP7n8rUU zbZb9k{+;EzFDNEU!jMn&o)dICh7|yqv0U6Di1DSHRc4CmG>bX#+8)Kf5QZUz+*7<0 z{q^oH->RnD2;h3;{B&_oR4LG<>8^E%uO!Xyka7Ko+Hh?y3*@`Lo0Sk)YC zMQj*-qfWXf&iyGrZl8B)HgWC^CTa8#(7;TQ`^h_g$2EQGT5l$-az@1Y5If^#6r-Is zjstW~mk~CY>E7GZBmN3aYZ8=`=zSdMNS%$UqbAeS?7p$hE9SQFNn!pO^cehRrkKtl zOsBSMmn~X4gx;qv01Z0l%c`D7n(iFz{Sus;=5L{SGl!apx_LODe$ee}a-o{a2My%z z;e&!DiL`L9H>lBH=-?S%`7HM$m8VMr1H1Kg@0)(6@zKn^`Q#op<6lyIQx3r=j$Y1F zwA+XuP&;5#PM8}i)gVoj34u8axNln6n!#z-^XSn7Q+1DGGp#lGi0LV!R){Yg{X5cB zcqJ>4Q5TAt{jX*;T}aa-y6CUl`Ac*G`EbZ$WJGU)V+?bd&pDCGC}qs?iBTxECxjSlS=0UruP`XfNbQi zStsk50~s%***%9;%XNf2z5XWt%;^^4eApQjbagp>xDGddwRizt3-_7`(}A>BW;070 zmnhVkM3f27wRhMn7wDDuR`%mDNbrj~uyPuH= z9n(=YX0latE?Hc$&2h9x5oW69c953fiR;H>XQYOao7VFm3v&lWVZdIQ!xjjQ(enKR zX)%&+t9o>A4P}pq_txT(+-_cEEjWdq@N}Y8^EbM*QUb17FNumG{;$i$gjZuJTFCR* zYpt3pevtt#2vj7dv4X|=L1)UBEL!30XgNyn*ICtJJ{T$87$Za%ZbGeYl|l|+U|pO= zB^|dm_2#_6TDxM_MsLY9OX4oO-T*Dpzh(*x+s$;$U)UsXm$?_dh(F?2q);tFcGzIW zS5YE8uJNqa;XpMOr7@bG#dinF#%zquV_TuBZF1#%vMZNWcT{dH*{5+OuH0JH_RZP# zWz}5O>4gwQvQQc3q;ebck$;jEAKriIz~kFJ(DQ&pN(`F9V`xl5C4#S2aQ zvM;SH3uGDQ8g@nn-4C0^6i129SV^sFd|5}DKabKL)PK`qDYbgb0Uha!!{zPx-yu{kNys3!5hNh0aJandFMmny16XM zoNRL^Y-D}#In2XgPNeReZW-VA7AD$Uz|=(Q?x*+;_bk?V!y&$-c{CqlEZ*u~CnV-m zW!|Uy->&z%G4A_(APOTXQwL}A1#_p&-vPhZYP-AbE0P}0bAP-=OBEjRi@b+IcOefN z-#mU(NviaK2Zv4o7&r%PYrZDjsUNB-Nc6w?x~|OB&qxiITJTa)^;H@u|@#{NSru?$6Y6 zeEIZl`^z>vI-MLX^*xq8Q1@)B=1Q;?0*WT4WLL;-eJ9Mp{qCn}j7?px$pPQ2xNJkR zx~Kk|hp6y|-Vg8W{VftN07H=hO0)Vy*TH(09sHV)esr?mZ-znFSD)}8zIJpz-St}@ zrt915;qa2Cjx`d6q$$gPDs+4EB&p#LD<8%oMwnp+hnQ1yw4f)nO#w2FkTj5zn%B7? z8OD@aXkhbC)~u;D6D6>T zy1WHH~bi#GdeO{&fenKd7KmU}C`@JY31A|k*S`%vcfVY>Qoj@o{ewkz-#rH7Ha zd-B}>8CsB)swdF{%O7}3%lm9BbGJ82u+;Lz=*_o$HEW`K@}_pFk+EX=u1e|R{Ll)w z(5zRxxyaWY{rh&z2F>O~q>;103A_GV^uxIHay?z5|Jzq{PQqwkzxhix8=ijYjO`5g zaX0x1^wo(QWPs`+nm^}|vw_{;koD4zmRmeNA5sXU-R=+j$Y+%eLYIh|pi32hJT0_> zi!}_Z;f!xq%{x}j0)CNTs3oYw&vu22G3p%>KksO&X}JG#vq$#>ipg3{5UQVAi|@-~ zO^gj8zU==Yc{39WNrUCAFl!|Sz}}PH!6T$mEbNgRsfwa7rxc8gc=6nBp72oU4 z_gWrgUNh=%r#|}xE#2#PLr3mMC}}X^WlGjqznXvW!kcGQYGCu*Zk=&+gr}8d)vd9D z`3GjiZob2+-VKt@KWJCRrYmcH+s!j#w<6eLuOGf~{(-4>MMx%lHqGtfd(1_K7f_*I z3V@n-w%X1b10VDDx`Gr8!xUl9-;-q_QOz zjmywH?zvK?O>K_!a?c)QkXqz_x*`1c+*bI-OJ~!vu=LBl$S3n?K!Alux9ZLeV4qk| zp)cAe7+Ro-J&WY_qHsP}J}A0tAFJkPUN^Vz;J4}n4q3G6$*P{fFjEnOzSSi7<6LUS zS*UTQjxw3rhb`HcdI>)1@de`GGIiW~WhYw(*-5v6IGXrpyu&Q+p&2{A%nIc<*ztqM zSPTA0tx%$DkxhtWYvFHsBYm({^9!C*5Az4SVGd2_GG;QR_1iY96A(_FLP5m?NsM02 z$iq|LV;=wTK}D7uk+hWP{V>mUIgfRV0K)tvM*mpF6X!lae(E^NW?elV!L3 zp7ab^0)WxwUYlRn_tzX>kmbf~Ov(T#b#N0$E4$>Uct_5hsfY;ga{Do-38v;O!Plar zxl^8}l08y;JYpOTL=5Ed9MI5|8k`aXsoEf?;HS|EM1M zJA34RsCT~iY6ah`pI2B|n8EM9@D4Fyu$r8f;3(?9jU#5`x~ba$XUM=jO;jo|}0V3tr7z zxb>#s(6t%8fb_PT+2tc^AT zFfF^?T6VV4c#l$nZ}{-G4@8xEpn572)c`m&buFy4gAu+!P+} zLcCf{c}VWU52#l(K=>)nwDR)*vG+D$a#iP@r^+px#+KdPNXBizrpi>}ZcBE$fiUev z6H4gAx8N4^M1Xq@I6WZaer9movBBwJ3?h;}eO**W^MpLB&62Dp(R#HTHmmVqMi2#8 z3n8@xhUUAG3@Ql_1;SE;Kh%Jc_V<6!xwmdf!hr2~ldSsz)xGE5dp_Rtp7;B_hq6d{ z=W6yEQ?k@Js+S?+^{w-PUyboID1SB^mahac&xfeYBo65hLCOz@l`|KfSHZf7C|u*> znF}iO&SI0&B3#0piC&p`7W2sfnMp%B4^!gX3`$QYb5%U}jAAwzO_-m8w`gCLAopwl zKq@nj4>}$%9(-Ci46n|eHbxQj$A7ONVzu2m!5I0f7G}1D9S;=MrFzQEu;A9ZWs&Z{v zA8AJuk4I5c%7Qz3qTSR!Z&Q1}o7y0^UsLL)_C;n{Gh2!-PiD4$NhyLv95KDch~v0O zW=25beoZexK>jX9=d>=ktQdW%-F6-?RYE@0b}f!OW{ZQ)m_8h~ye};Gv)^-PV2OpT zjQFsBh!K*wurrF8?FUJ}@(^48f^t78Q8*ak5J?k)mLMC99XjLSQ-!wM*%0`$4s1*A zi`{G$OWgDSPn- zq6YW(5iLizE+%YtK{Py@(=W*n!?7CMNGeS<((`2V=>On?(O@Qtr)l1b7LNw+r0Ct) z5A2Q6k@s*58Rxd%vtYDvf=!;juLIKkT|Die_ye|N>)8dP!=%M2e8{cf9^T@O{!=OX zaKaDUZa<$hk1w9N;6e zh0AqZ7^AjMrm|VCvWvmGJ>+~OTvW5o3)_P`9HJdJBgoxb%-vVa-5cb_gXppumxR&h z+QaBFmgQoU+>5d-T&8ppCN?NrRr2PhXl(4&7LvA+yGz;39)6X>y%&tmF*{fAZ)MfL zW=E;=U*z{KR{kjC(r7I>_=HlK7LfI}kgDvltLHDj{_u>eUs_O^-wU$YYQIrgux8xw zWZPZsvTg>I{tTwe6zZ@ZzC z*)e*t>{ds9c=c>w^Lt#)TlPIE`QP=UbaX%VO)$>xhgZDz(sfTP=tj!v$IHCr@M025 z5g?VB*w@B$wS!@=_{r+kf4;nL#x)1F%*gDE>{PYoB4*eNWP}Ua?s{1pkEZXKMPXR^ z(4zA{PUhGJ|A=BNA0`^>4}-DS&L$9QmAw$=*J*?38i>XZ0}iK~3Q))!@!czG83KOS z@&9=7icLXfULl%PZir`FGgUa<+-^dGcM$%I32-}!gNXPR>&HS@Jos4XLc~>|0CA2y zBMHyJiDGV3Z?#CktDXzGCF#P1B*W9I`-@jMT z;X3-2zm*jg=Kni@Qu+VQ@gezd(=bG7Hw5O=e3gWBc}VBpE*35n;yFme7FqEB4r=ky zAoH@0q*QJH7hg%jeHY86oe^M55A(O_$^WTCwZ=%_HMaNToM#e;haWfN+{!GL`qlaW zhO{Yajhy>QeYL)ryPKEa&zkI|AMdp;-bq7*7lir$M}545-h7N_@1#c`3D_o)A@fm~ z|A(0F6Cj_1PwYKCZbL$}RsKIHJ;~P$!Etrot~$Ry@LgzDW4Vt!EL5g5o8eJSUYkL`vao%tS>GO*oHq?c&5L&&~b-`ua}U<6_Q zK0ZpbOte5rsJwC`5$M!;|_jVy$XjbkGGCx#>%uJ^~C4bkf6ZP^#=T_$Q+UMKo zGgH3zLwwp=bf2Lv{Fos0V(uR5{5bU0`pIdLr<|@@SxUR#@2h>Us@>tLy)e%zxH|s? zt%1|qi;`@{p8lAxbSI5`q{KEA6|3^iR0E50mBT??DsJjYI>P+9=DtsJZN9nV^lAba z45hUA0_^Od0cvlM+fp2Rjs!G6R7~*L?tIBl`?K7TNcc?fJj_4C%^Z(lPt($@Aj7PM z`8|}o`6S8<#c-8Cwcl#4>-md*8h=2yZDI0lJdOLLNKn7M{Q@s&4W6jEPI~*ipFVo4 z@fUMMC|#Ey<%{d`KO&CPE}){jKd#i=V|#uhtjxF73+`N)*KpvcdsvN}TI=CGMZtSL ztPk*l&8dSlxio&_=TV=(3TSxYbUyf){{T5^_eW^M$OcKn_OKi!W?YyTG_T8NC_2Hv z`xD-cC-ujgRGUwZ-~!A!WQpf&D%D5H)?kU%$?ETl~^bdFiLKDo*bzOe26b+G0eGu7s zsIM3e6pB${ND6k3k|*F=A^KK$HzXUxFsCW##Ii3IT!%Y#J|1HiC!<_SBStlrwdZlP*Bz$tKE{n{=iVN|p$yixxN9^? zYG5dAsbe2HaY#Vcl=Y;F`GyLd#=J*4H=JQeI=+lMY&U}W9enz{3a&=8h|nYjve$5d zZu^93yyFd-ST-MCkw7d@H3MhV(Pka}BbD{K{05nSSQVSOM-8{iHgiEg#%&;*wIywo z63OK`7_V$TFQN)>FXqN&m$2}gVr9-E*(0!wlrIj{U(*G)@D5OV$WuGm{yDNm3|s(J zFXkS&0P}-oYqV`1s;Cx}m*Cy}3Q47|?}7Fssv{WAtcK;!c4;c=rOKRh&a2Eni>W?A z`CeDcFu{6Vhq+0$uz)cbOq+3{X2t{TAu=A|_T?B_n-x}R;t=GWCI}cu8G1bsAAhalH zYvn;h4jF<-3$7h#K(1gj?{S|sHB5Je0ISV%$lUw>IUICzze$7ABNhkKMF)4lv9`I1 ze@N@2m4l6SAYT^O&5*IK3TW!X$bz1N1k4CSv4862ck719eimH(*(2E3n zh7O~KP7T{_10C9KeL-tHEZ=I3(5i$Zv7YOS=uPn9LOc{K4r)$SDEy4^i{4a2Fy9&P zcUYzBpDME+iMB|hU{Dw4S-h9#G2nsTQ|cRF>~jtRZ{RiDx8)}OGf8!}Yc_ycmNHv7 zZLQStfRHnHucOvNJuUq;nvucccVqdBX|0wruZfnlhAkYs0zzSMNA3zUKQ2Y3Ajs?j ze}r6xV)O+ph4*5;D0V-b7Rx5_^OT~+Sl#wPNH6Ozl5>lZbP9FBkp3`Zc5ax|T!L1L z(Pag(#Zf&2fYU zh>C280b(n1HtGX({@X5gkCdTEbus%mUT|l8vvML6ZcY##e~k zYh*)V_rW0ZIxmDISQTLYZd8xDp=~Q9jq0Tl`+if{y(ftN+-kmYv!u|Jq?&T(V)rQ~ zYC}qL#l?sTVa1C*?4$`=mUJo3xD0$-mh>RTf^Fp4TY_ijD?s(iY}oRZLfCR8bB?w! zH;nM;Z;17aFgmXt-&1E8UBP=7cS-7NSyBk*zOR_*Ae8q6bD1G*>vJz|ZFhQab|Dm4lJ+JO-KMNQ#!B75 zK=lC-30B;+(*u##s9s_fc05551dGON>If8YgZho}_15iYGz5EWYx1j2h?)8x8}0d? zSW&AJ@kMv7G1EbS8@!9=#Jo%tS?5Y<4c1n7H(74DVrUWpMUFR=TnSl`CG&6N(Tl9o z`K>DmiJl=#bQ7GLPxPP%nJkCjkVfli9=bGb5>L5iP{%1@y z3wTga0r;frK6gFK>vxq4rOHi6yj~-|$GTl@b196{-73Q=WPZCFwL6D-9?)F|^>K}9 z4Nq}dqYiq9d%da3xDr>TDp3Qf5&*htT%FGzo3$sdc1ez&6VqAqqfa+5nd*hHRA`7z z{oJBUHW05bLFU-YZnHOKa|Iwu_(0`S#d!!gTwUfPrD{_@omZEdx%+${nuT6m=WYw+ znGHK$Wj<40c0C6=)~^yYS2UJT=oEOYiwVSCwQ2YiJh*5@;0m}Ev}1(&GZ9$0lFh(l z6z^aOJ?-%6A&9?FisL@eCg@2W%B)3{fgnvdfzveEtR7D5VP=!Vp@;OeQ~_I1P%}&} zhj3je&w~V+@*fO`dIY-QO^%cSfz2@)uDuZs>Oi_-A4iT1}#Q zAmtH=XufYFYceGmj`$UQ9An9+5))1 z3gprdVmfLqh2=jSkjw%}OF`N<3UKKJpM6Ux$Q#@kT1xju-J&k!yezU*spB;WowT)f z2~EOL+st=ez78%J!)pj?Qai>ai*(nD5}ZsOJ5UY6=P}SZ_J07Y2AQWlum7JHIlIl~i|^bNWS^ zt#noZtJfu}7em6{jG$OK^CxJ2UqQh{fCaP?xX>-dPpAwHGxK9oo=R9oYQ#%)QYrHS zGD<%tZj62B4PexJ2fu^-ev;oI%Dea-4(^D>pf zA-PuM(FHrOe(h;CZ0JjL%zGg~JJIZH?boFctMf(*pHWyqSus;0$$@OS1T=|IfDYhJ zzPQm$_(X#R9hh_;rn;Rh?WbfWVUcX1wBZp|7BWT32?Y!2MvZH_bY6wMC5*)xwD6ay599^XFm*bKc?_CQMH|fyew?YQ*asx zk_2^0mQE@Ub5Gk0ArMQ%#zTsyqVaAiR|`(N#fE7@Gp9CZzK?@>G3y6L!bvNbXqiOo zIg6yRnh;0kEKsMTpJ)XGh8aa2aD+z#5F#EjoTrOPr>p{I#aF;AV>z}lvpT0lnQUbp zVj?*D3uWF`DUzibgs7_~lI9n7ygGMdwt(L94#-W-dEL1A11S!jA)_AtP__m^Q91~Z zcs3}{XDKl~PzL6ZMX7L!6oSMvE5!w5bhe@+XB8{LHX9I#&U}ebfDLq`W+Qs$7&F*F zLFTdnmD~@R(nFe3dO2@Ndfq0KaXp#GAYPxjea?)NewKUQVo_w>!H4az11>MBDe5O6 zPFgQzd(r}Io;!Tn$1`_YajCfrBW?9#dsu4jffsd6gcU-w-`eCMJEtcvghfqC^by77 znWyB`iIgRTk>&yN$dV^3ok8BPpoT4vy0GP894tjsCF1YmNK!s@9WyKtx#t25AcPjv zOc7KfjMI?v6<)QoemsTeASJ^BZnXl1A%=J~zs;{cPzwf0(8t}Wd274%!83x>SRR!* z+gKl*H#O&jsmFdvNmP*-65(OTq}4R>lY~PC@G7xNP*!wSleE%!rtmX|Wy-PD01K7a zYzb~))onCJDw&l?&FE%hrCQtKvGCf~yt|fhN>my$Zj&c zF4}HINHf9z)ndm!ObcNS$Je8@u&2F+TNQ({w0(!~!M z{=p}WC3ew>{)#3@dp_Cc3uC;5)SfK97$h${J~`m;-wzJ7aVAM^r+Z&^<^#LJ70-Hl!!_t>P-B(x&H(CBkRoz2<;`Z=KfdK@4b1a6MI4rhK zOYCgIVohejx;YWF+-8@-?2QIZeIRvdAF02&ND$hTlVczEBmx%TX^gXMt~dKYsCJbLp~yM5B=eP5a{?iY@~q-uxN ziI_>YU3HJp+a$zs}Bumi^uktuZ)z zda4`^okC_^4C&&S6jo11^fVUtWZlx=uLzBG>MZ8Nb}jhXQs>VUX+Y52y z;thN2r1y=GmSo|I7#TJW`f@P)I=OydfDLFZHO$H|*&iA^I+Ex*TwN}}f~)rHa8>aB zC&JaKG_D>>lVXzXUS(&u8QywaJpw~TUU_XSLC@WrCB|VC1dBy|6K%Nuc@P&o8oWZo z;|&pZx##=%6{?D8OOxrc^4pBe`#b>1Ux%>oMw7!A~c~NZpYn77GMreS&keGt4}uP%O8jauH#^;9@~o7?d(3*7%`#OKzt|EXG+k z&SF z+mvwpS3yHip~ulfM`quYE+(72Q}l7Ag@Oo?8k7;fzD_0l#r$4!sQCQ`SDX;aaex1I z2_;7xO9<>tu!z}t6AgKlx&u45U&rZJQRuAW>p=7ZrZP-n*#qa>827Zfw@`ah_}k!uR_pi z`}*!Qx!fCbb)oa~ATNOsx0xs#v-Ts%rAOI&5_0)%)O{zU#_pE-*}`H8)}o-$#Yy|U z#ouqtkLw;i7xi`_zsIW&6Gm-8L8s-P1-dN=GCO^wVQ_G*yGIIF#NF;x= zRYC|b;7~9(JizyWdQCk`0YVV8sD~Pm(M25Wejhg>VG!`~TphEcLermz<(M}_+n91M zD(sK($(*kZ-1I?lq3HB@9rodz%rDS@b1#GhlFETY{w5t0KksBM@hkuW^-V~C6)~-{ z7SCTIH~?&m2IU24y!acXOo$?*VGI`JYpyNP^afaM9g8j_uqzs+lWvcjwUh-eiluTX z`NpmG7$34;IPV)+O%FvDCQbC02Tlu~4jHpjgq_zw!I7WZm-4T{VPbkxw-3FI17h+T ztrM7)z#gCP=}sTqHvvT1Wwh?WGPvk)CGP zz0C=8!&26?Xk$i?LWVTOyv&p+ibX*~+(=ZwpkA4$u<)}8z0?CS-K@B3?!X0N_*e*v znI9SIq13`@WoYAl?Y&we95dIJ3?ap6J8r+T4ezjZ?o`lGyV-%vUJ`%n>?PvZnQ;Z% z;oA~=g%Nw<~(sq~tYdZ2ok4z^fYS!ha z=F5(qS~{}oOxalUoz}D@2- zwW3gt>3O7F&9j;y-*O2e+nHci6C$#HP3u&3a)CMpUY&|Ii_{8NO*$i5t<>?P$xk*( z4GEMeE<`fEbe+<0s72IR{YrU6LG}IK?}g9?-9>0)ZW|)2cFIYflWmjHg@lN3Yh5r? z;44i|$CoriEF3BHmcGKLt=MKp0kIUs^yT`M69mrY6anm-l!Y0HI{5Lt8S5|yh_-9T zFN8$|_~yJZD!DYE#H02_Er_t(b6LL=Yasiz6zGtOiHPleI)Cc$f{PcE=lmj=iqcmn zD)LetgV8dB9AIC(Ui;6^3M$AE6evKVDtS>+5&X7wZ_L;D<(+HW0aDxTx8x64Ii`PC ze)@{1Z_sO1K3{QfLA@LIZ>YxQuuX2K`F()f8%A9P^%BN-G0zzk_WlG{CkF|j@o*=A zweyRSPnt+4;s^b5MlxQ)w_w$8%&)SS5iac)Cy#G-x!vECAJs1(&Ja*(s@3i{n%t@K zQB~}_pnDniHk?BGYA97c7+;IwK&N=DiB}a|PV;k!|3gC5(8Gy|+IO{|pRwI?ZL zS8(u&pqH&7)0!%EOrb*Bp9pn46!zkAyA-8ekq3$|?>$J7ny9G{Sb3}Zr6~hOVfXz-B@T9lsLBLZvH6@Y0x8Z!qupksRv(Aibr5!|Q6jk7=y<9X^w$wi zMJskQbKYOq)Rv&HT6^@^a5s4zX7+~Nx{m6U}Ii3K29U>?DE@tY=ul1Tx-`2_DXgMC27h2wVyw1TTgOC%hHA zP1|W!)!;d`OYh4x!OGYfD?r9;Sge@akc7s}kBS|y;~JBcN7*1Uqj}uyE^DIXvV6Y@ zmRLI^-%ld=t#pQQbu(;PYd7I+Y*2K-wPtd%YfIXYYmP9(j@LA%K$3@R&Bh2KaF1FA zD2#bqlW=p17|2)(7r|V;4iQgXAZ$acqDNV<=o&kEm_cGM$$?-+D~;UZ z=#&+m*uYtG>AEEsA~fqO$M4(M%bBb$BJ!2!nm< zTG6;|=?uhE#`F!Pu1EZ}HAG-ARjE;v+e~b>z1of@p5J;4(jp;{bPiy)YOHB97R z&`dz{;-lDOW3UA`STD|wn0&ho+U~^L9)I8N?>p_@p_hdbYHf{DxBhg!I(5A+b-f|J zre2FO8fP`EbV4u_v7E<3Yvw|=NozH`0MvvyFF9+B>9VpwPSp50OB6u}ZnFW75h{R! z*=B$&7BTUHwz=`Rlz9vWgFS#R!DcqC11=bm78LsA(*!tR#0J$hpoAV>iXM=% z-<}wBjer@Mg&d;^Nc|)&7&e7wvTI1drf$v3Dn_O0hVtrC0V@KPzLlDRB?eju_2ybS zhOfwn>gCQpIDR>b5Om7eCg{)ExGF2U}Qwwc~m z=#2g}klX<=9HTsRfiA*V8HqE#7$J8YLu*fD&cb*R-DXgSFx!5?Y}Kh;l%Sv)sIb0? zPV5)M6t9$wAmzgXoz(Np9?57>^oLEIW}`fYY4B3koXV^du!~6CACe3=gZGuhQDOmU z-1Mnf5jp3yLvF-2eBSIBYqFcOB=U2Ui+N!YI7z~(1|{ta92b!@)g;*;tPyrk2Rg08 ziSbCPYC7zO%K5MlDAGvt8?E-nr0NSh2Q$b?6Xwl9-O(*Y^0u^ zxP<_|xJ6+ye2D(p)l@IDY&NF2ULi!Qwc_kXj+@GEl-j)nX;Qelj7dH#E{LqGxDu*+ z^dh9F&*-?8jI*VwX2&;8L~!kR`9;s5hgu8HKU0dHu+3;~x9)}}KB`%7XFr;)Y}8tu ziZ&`>WGFo7){$YaIIwS#1)GQ@Nehmr)Ocdcp0xTUHe7B@)IOo3IJqG|A}WYrGp>kF zHz)8)<~5lXb$-x5)&Qn;z^0F3rKT)4Qafq^OTex!aw*9Wgw~R>1R>G))vgvPQ~Qwi z%(rVlpWu+yGD~gdvmOfD)sG%((u^kiprLW>WVVg%TxA|*A5W2GCw1f&w>+WJ()1mE zuyAUO%`{jn!N)lT4n{uL4O)z51cD#Tg%XEz4TYf~bn-BW`zbTPasaBt-YWHION9L2 zS{lN=0*sZ2^SoGtSPxlf2y3P<=yeEfvfEM>Zih1$Nux3wH1UY$0U<3|bf1J*{4LVQ z#GcK)i#h~oOGwh_c+I99DZ)`8)8iy4>@m|MRdcOLv{l2j z!Ai{VNne~Ug||cK!3&^=sYAmA&lwg%pVfMT?%IB^%W%X)u zBRhd92I_q%2Z*%3Dm5`$Sv!o_duDB@c_e{GF0+jSl)oZxgA^Dg0TxL%daSJnszr2J zEDyBKOvpnn(`9CC!#O)MGkDeXDURf|h&CzJrOGMq20gW`nRUD$ReM$M4H0=xAUY$8 zss`PUT6C~o3=1l z@Diij3uPdC%i8>?J_5^3ER*MkYY}?MLKA{1VGV#$LI-g!5?nk49z-+ena^%sXeE zZL4p}Bvj-R*GIWVCpAOTdmPtlMsAEyZcB>CY~i%C7YVJAsr0oFMiPkMcVG=U3xqIS zLXk}PkZH382{vyB*}bj-jB3^v0*!v**LDxob>F-g#K)u~IZC{YK}dsgvF$7fqjp+B zVkh2sBgY$R2FpU|f0LV5w?f36kp+)WR)}a`zeFkl-`0jB|Ih@Z-?1|f!JV}cLQ~f> ze@@Bw3&d;qHyg@;@CEc1Q&;YmFOPl|Gvvgz1uB5Wg|0-+HUNO_TF4_-BdM#C8~w2u zC8ZC_NuX882u{*R!h93QSY7H`jc4Zf;{$WlU};ltGx$l&iKmxa;C<4e(1A8v#SVpW zDOsJ%sY8todq!ZEIZV=Ouc~LZFLCBWBn*|A4(wDoppU4KL&s)kHE$YAb(1&AObN(q zC4OAcn=tqQxfNuG7a25(&3Y$R*3w#5ikYmEMaj80v$yYC?cVk~Mlm z++6Niq-A;AT~E}8lN7*rd~&R!c0i@r5d8|-3DwjDcr&q>Y<_l$oUSf7 z2bZa6&aBp`#E5})L@F8WT7e+f(9x2P@P-_if~l#hiHb_oJ+vd~-G0%$5#TjqaRMz0 zRY*Nm{W1d0M65M>Wg{6EJphI@uNMVYQ=_Cas=)fHUMeMwE3)3kx}>u;6x1|oq<%Fe z{iMB;9{|qSs>ui_*PjK%>Ro9T`;1Gl6wNg$@-2TTbD0IHF+w0GNf3D1c1vU3<{N@& zWt{`*2KioWY&fi((u;f{Ijz*B86!3;}GAb0=2{% z#dI#|M*ZuTG%<;R)gH%_BM+R%Uf!tiFjxkEt84Mo(|b6qh=|yUN#kA zB?p-)O$bGG%|ehV*=ob=CWvq#AodrVd?4jnyu0t=UP7^(p zvf7$AzJUmr1Ew;Tf+0<3V3T}c<%b`c1-(!=jx1ET^l2xEsRmyKNd0k)s zIN;!e6P*d2hkF%DwO%h$(F^1Z#ice8oB;=QAERbGU+g8^6=Bdyc0Sp5B8ogrHOM`v z7yGUFz>cu8Hs9Z3y>QGusN9;*QeYvIH{}als#m5gqxueWPkRWg7{ly(=c8@ix7a5t zr`KVAu&o<^fPER}l@OJ*raQlCsaY0>{8$F+BpNBiq*|H{1Za;K-f@K^eL1P~pUbp18C+<|+sym(mI zR~K6j*3w{5iJer=5h`jq!Fy_5R8u{y@>@TJUKGovY^i)vr%34<3e^wyd#huZ<;&VZ zs%okHIRt&Tx5P*-@9EdFLFxsPJ=n$*Bb_|7Un?iUpKX9PW-Ci97I#~I1hBBcoY`{9 za3949K?*`b`R8OscE&DI>E$%0wcww!ERhTmkDv?|cV#tBB{hnGv?g@|BHc9AQ@5wA zFPc6^Y6980Sh{K;E52g&HTo+v>oKZ3qSFQhMJTg|mBfHkXUGab$Bl&1CDI^(fzUby zlwc|h)RZiLWIRg7?2Ni@V^L}(uJRO!Y+jCT&047naLI;fqpYrewcf9$A@S5TLF+p9 zLAL9$Qh9N~CSkHvzO2uW*f*Q%h-+6J0ZT--)b}+uUmms(TH1&4Qn?hA%3tWBM+)5; zbktu&GS*&1a+puWf#O=P%x_mgR=|hzK)dkG8hhj+#yGwlaRyVATbp`kAl2kF=(=Ve zf^7rQq{omYza{o}6ZI_XiEK#JCZ3m77rG1}uHH0{FdmlzyT?ptgtl4oqb4OVs~lBZ zEJ|ho^8?XDN%=c3RO;tT?d)mvH0ym$2+mmBQ@ylq%i`C|=Pl8HGjsPJpUyP@^#=vA$ki5wz|EuJ0_vSw*RH{}3 zZ_OkNC!<+Gz38^Rx%Y%B6!Q{GtgWDeKdPLH8Eo5)@Q9_8Lm-qj{^&o>=4lW8$g1zkpT23)=$Ai$vy4QW zFJ#H_3c$M-jV^rW=+c?UKlUaMcrn(;H&;nuXH#Zp1m7i9D;=t=ys(d;!X@I zD@~S=;ax5oQU!#t>R|*J8I@Y?mo>XGKWq!a`}AyGygO3 zJsk@N*o~%yoLd+6^CkN3K?<>U5q-mbedV7cPgLORw4kgXmG^H7*gr!zekth#W(9MAedyG?Tk2&_Zi z;GT<{tZhZqa;VnaFY_S+0&SxdT-o->R{m#!)b*i+6H~P^Y+NVcj_)P6NXnCkH}jyJ zwZU9+LE)rYMXCHx-46v7L{EDMgwUdbqCfBARz zF&T|iW&QO(i>s1lZi0q|0aZ=$pQ=6#+*z6wSUdTZ0j}MCZ?!l^X_K-NsMAu=JHL8SC%8{W$__XXT|oV6wd@r;q5L&!w(7W zLWmoN2kp!^{%&4X< zB}*#seFR6Jjj;0sH0wnN%Xte-;ub`tcd_XdlCL~yutp$MjY}uEz!#WK_rxn?d_tbE zbPDR5IhGS%EbA4GSTK$luel_c7+zq>(4yIa#a}06O;}9{l^8RpahSPPfVd*=Y-t8j z@bsM}e{vs~5!6{4tzAh@H79WhYA!2KEXfPFnskG2DxMu$=Oi^INrVJ5A@F5jHd!(x zSPfRSj0y_!e#5*^HiT^oY8U((^3)Nr0X7RRwB4t8l55DeLRbiZ%kl*2vnkfpY*yE0 zI(=F;bh-0{PPu(P*}a?vyry|WmfY;Trhrx7+g^0m6_M$}z-diXYI-TcJI%yqA!P9%m z;?l61=S%Zw5?$K1FQ=EGm2E`OT)D+bPbB<0iPQ<}5;VsLbo(lbzH?&<0yiphfTsX6o&x zaWcXO$XGLsgaCgcinU;18|w^Aj7$@5^or{V*|rUUdLJZ!h9#2r(b>4h&972Zwd;Mg z8~BwPiIGe8Xy>0Mw}p%FkZnqY7s)w+zR{K18)S5H6j|!G&4;uNp(b+x2K=m)PFfs> zk@(hZ0vlu*YEJvHs|`}hJ`JcRjxOu_-OMftotPVq3BjIiCi_?+|4wtH)K0uPp(l(F zzAT}FsTOxqb_vcQlv>QI%1H%R7AK3U7VYR`eQZ?xG>?RSS)B4na49-0?5*h?M?oBBnhbcWarW6#ouTN_n|Q7XX-q~TbpDT<`n_k2b3*khfYkfC0eGR6z0 z5;k%_eCw$x67qJ7kGS=bx2W+rKr|}|jHR3c;7BAX65@SQ1{?NQiygdqUJ9WVn^&9i zQm{kPWfqmS^a;1~nhhhosR#t2c|*&PWNc{X(ymB6aPmH z!Rmf$0jmWem&A!cVpR-Q7xzc1xzaFmz1__`) zFH)y5dWyQV^ucId3Zn&0Vf5S2w=zS}L$|SChs>IaWA4Si#SsJOvjN8Q&bO3rMTm7I zUhhrgb+Rd2m?^v#MmFPh4<)I5E8w+l&lY~xXa8xU0<8nZQ-oR|dMkvw?NrW#ZNldP zdZNE3Iz8kIkHqJZ{Ic+Q*t%)>tV`jup!sv)GlWghld`*9m4esy>+o7rA|h?+v5rV3pf{H(-b|ACuh%t8 z61|`+*fV^E2EpKrekblFMYB19f_Mp0c4Q6-6k0N(>rMHCuqshgClwjGcIkr9Aj=;_ zlmluRL2kU!7rzncLg`VZEy{4QSsr<%&%nsRHL(jmL4nLuw%<&VqWvM!oC887y^YRf z_9;s&U;#Wxtf=(lU_j$RH^e{HE?jC?{a|OOS)!=;Idl&q`%&_iv3EhcV^eh!flU2% zvw3k!h%yLL9f4v@XSssw?IZ%L7*UjM1-1iEN+CmFf0f6Cb6hw4yR;gY&PV8F7C5 zb)0{-T5ixz+W`EpG@lSi*e-@&)sSVRx1pO>ra5>cBC2)w7P1W@K&87 za~B-0|M)8^0(s?vNRBL%zhsR{=HBdF8q~91_o*G>kD2A{1x3!Aw?hj&^FT0nqf7hA z7q%L4I)iwaUhKJTnpe1v{41IJ&A&4DHWwwxb|1M>6y!GdCUcW0Y(u6uC228NP3)lY zTk%vYr_f847sHUPj@_-eWz0V#dtPSRY&y3YhrwLKsAU*3{=#R*Z*atjBh^0xp|~?E z#HjrC-*1}-gbvn!^Za+u_}Ko*SoZf+@pL_ldXB`6=fU zdqxC_I>Z+Z(6AlV61mE8l|kynaOL%OLBy%@^#SlBhQO`k4g&eoyJswjs=d|4U$0($ z0zS?m8cX>&aS;Cdd2$dM(tYb{p;L^X4P(Ng5tVN=za?299Am%z)2FVeWvVY6*SG1K ztjKqa)iX5g%Jn1lPgC6nKtE&OH&VXFxxbq}&=Kps+=Q5d9x^-a+@)~g2gAANb;>3= zcWG8;WI$^MFkITY8Y?+`GCZ<#h%q8ovCH%acgjJ2Sf_vB+|E5#%so^jc1$3nLQUF( zHc!!eu!nimFl7p7RtVpDI3+l8Ct8|)elE47js#rr={vg^h@8L0e?0LU=M+x5JeZ-Z zD0mbqU+G`Uv6MmOhJFqQ?89BUq{=@R*ZJrC_5AbMNzMhF!1K9@L;g60`;mLwIzCm! zSNhJ2<_h+onrNIg)Yfr-n0%v`6mYtH~?dUb~O~ zxA0Ak8mH>tx~alERm3EUcfN1<6ZcI2`1e5k|6L3OF(WL0XH-|^e_XCNHvFLb|M<>F z#y>_(?e3ubg^}VN|I_{J*LO)5OvGtvda24>#j6jgUr|I!j%Zaak3vTj>q3Qt8mTPn{004nw#e4yIKWW2Ug1KQ}*uRFWmE2Unso8 z&5ZnndMvBIP8zhRoamu2cc_$;IbTO&{dXsOOt8Snq2Z3s)H zyiKx(gETws<#V#`(?->#X;m-GONiSS+HiS0Hv*g8{f*6&3f|%FZEj(+=0w~tmpW@# z+kkd80vWYPSRZtpNFc(L%vr^8vpQ=j`dlZ!pyeXY{ga*okwBIhclfw?hT{|_ujIx{ zBK-u3(nM}Nj25$i7ia0)aIyRu{{IpYitG_CUpqiB{zA$I9qJHa4JzTj5h@YRlV?An zP$`IkC{!vqi1fQz?n>arqdvQtbWeKpp3)jF)A{ySaUf&)9OC*f?~iAlxbw^1=T-Mb zkgiM3NJ%wZ>I0Xwb9Xh^q|og(!X~9jRCxy}=!D#TrWsz2X1q)%`d+1DQmfL9!I^`X z)19hm(}Z8BSs)7i(hbdWLrc0TG%L<_DysBe*F?cLk*=6#g}Bs>HV>Ja z1zn|j-Ov^{HHWozJCwojIB*{Vn?{d;fO;Gfv0+^Uy4?FtYdDO#%RM5$kvd7Fi5>4m zd>lek$733=q0tm1>nW2UxV1B>V=O|yUZi9AUX=WvC(W+wk&gJ|Fg_PiG3Oo~DfnR^A#ZW4LX}DCrcBE83cRm)zO=NauUV(89>5bJ63+I4^6BZC*fpd@|R-20enKu3_Zf(ObPN2jiy4zrP zj#ELO_{KIru^cYdVc<~cX=*a_0ep=uiC018^qOP-^`k1&W`}jQE$l*$6n965O&HHs z=!j&1)!IJ;vR^6$C5TVEvo(-OvG1C7QFyu9j3hKVZXJ-f)97i^8N+oj#&@PMnrGEZ zJcp{-@ZXxLft-4W)xklnmVklbXW2i|Hy4>9P5) zGcWHKSF|MY{~t2lx5RN3o?{kq;yYVZ9}jF0*xL6+J;o8u`mVwhJJrzdZ7F`Zwbvn4!7|r zE#irdifbNQ%zG22iDJM8C*n68@U8x7e?PPec2mWqQ5W#Cr#w* zQZZ7Z-Cu~vrKG#Yh8C0Wq$?!ZrW($HwAp3F=H)^8U6>)eIC#CsMA{`}Yq-8WY`MNq zXBC&1bn>*o>E_vD%a?*M`ZrH|VD=wpOD*SgLH~;_=k^uno@6Vbm?Qw= zVNY@Hx$QbseeSibO%Dp%&NcVu=y}#5=cOa9Lmb2WdiUr$j-4<6uFfgsDUDy1XIqx^D-wE@7b;;D*E6Y@ z9d&q}t4&-_Muol2n_GUVdnmelIf0HWzD!@|}1p;GzFeP~fjG>UpC4>ut78|U%FJfQxV zGlmVR_s;94zXx$%5_rsTNmnLG;=Df8Q9H!t#%yzyZm&Fa!aNDjzDlGhdm)o zjN9%*E_pg{LXOQQ;{$tvj7)}33ZT+;@sQPk>t+*l+yZlp?Ft#CkTgLo42RmestKbP z4xI`b{(7q~4JM9WycEc#Va3dT+blJ%(1WbNJ8l(GN5GA`BNUQqt`(%ICGj|C5G$jV z?FPM1Gh!s@x_qFdRvbMXi=$X3F&Yr{jwuld3V#+GhGHv_c3-k*6pZS}V(H$ol%?RO z3_w4zZLP?me23`w=pPbF&+F{lYkpi)!&LmsPiVl3Zq6ec9|-;`CC8i zc$|N0wd-v&+}k^svm0}>$GA~HQ;aIE$jyaoHdV22HmO(*y#XboG3$m*G%~9%ldVXG zQ9laWiu+|ImZJt?LvBo#4f#mY=8=!KtY>CE9r2__qcKQ;LbPD0Yb|o`E#g*o1>Ox2 zBlm)FVmWR1x;+rWK{EE)H!JKRsHprMOshOQj4eH)1VE{o5S4>HT>@p2ZV^v|TkD!H zGoRaog(EgOCJd{fft%&8@+nrvFAq>?i7+94-@`06P9`gH#vJ?JlslRb5}{}bgI{hN zSXV4B?JvQN!OT)-+~^->JGidlDy}XB+G~ePnL4kR%Ku?V^q~)?IV>6h3;s;Ms~4(4 zXjj1@@uhIz*l^CIu2*^qaB)Bcf0S3y!sdX>7&0-NA>h;{ns|p|&CF>vZ@6SxrVM|p z%~rPzf+4X8Vj{zv%RDI~rY(Kd6o0*;>FZH}blO(|w$01?M%G!GjDF3gL^C0pd&dlk z$`R{`%6e#}*+xBc7i9&3wZ`a!NQvYKcSq&o$cCEJPDOsfY~BADC;GH@(eJfC4!<}< z5^P&#a%^YgIXN4=@}=?lhKw{bJlPPXhq-3CgOfP2ZO=$xiM}LSyn{BuRL**TOlHh! zQ_;X6K2gsb<1*pmC%*Hvpw2f9%tfq;YP(_AdCDd9&{Ik6OYc_+OIcP-rR4(+8Ph7^ zqPJxlCd}y%Gk9Ph(Xh1zPuuvv&yM*M*!z8Y@gL$en57I9ce3~o3B))DU_zU{BT|>* z6@a)8gx!;J^Mox|N&Z5x(Dpzc6p9I;gSqfRF;$M|!=t{qT}!Xa+q;JXtDv)ytuoBi zgYIeG%ZkM?sPQmEqGtF%WnBXK1O|vcu`*=~&P-Y+fWaehvkORwOf|6qr6r9LX>R zreH641t!q5x1+#dbb31qOjeWv)_ar!(+T4IQz$T}iDCT0`is>9t%D@~a@Cj9{9OFf zw3oQ2tBobb3{rA{lM-Tq_=--qEZ#(UInA?Ur{cY3-KEo32?CB}<*Y;BU+XRned3A{ zhn5DQU+XTWKmS^HfwBBrclovM@-I?%>G_3q7nBwPn$TEGLrK&Xuc^31&(ecrOHJu4 z(IGUPYo*~JS{$LiScY})*Gj7|+nxHtej@TR9Uutn5Soip*<3HB1@)>+7GP;E>`qb$ z_XE;gEEH?Z>o0wcz-ets=$QcC_bXl6tlKYoSKIB2-`RG1={+Qs z>k7v9AaHJ?hzwo3f5TnQbeHeovfW)~xNLQovy_TWvAkookC$?QbeyW+ zOfxUa#`b>9fj7?^ekxAm(huw-T>7cVap|XG zp2F0Uso*qOO~uEk)=xz@mwqZ}G@go&a;d3s!(?rd1!vFciqOuyOc#5t_hZlT+FqtY zMLk@ed(B;ROhHtz6e^Mp|4}QYMSx*f0-;i$*@avLugP#NZy8LY} z0lzNK5^oB7H*g zO20ZdU}}P;XmP$pSybJ}>B=lV)T(Z`r!qy#gw!uD3Pzy;vl5HeI_1P$QgQ9!{98s= zZrKKXE3P9lUVCq5s>4~qvLHwWsjkOcWh1Q83ezM}8kmG3E$qPXXEs~46tY`tP$W(p zNH_|QOWHMqC{3wZ!KR0X_h zjHNMr)E1Q@bXVHoAxX*yD){84p`Qefv_d0F zr8?O^V@2lJPAZ~^>N!n;QyG<;N3+-poUFBYH&EPKW4}*48O@^qpbM%=W|*^F~u&Y}71YEp|Hr$Ii2nxe22-xX9igYy_kd1KpyfL&1uBAY1IN zi@rP@thjr`cG+oxu&tBR$A!7cwx3D3LweiK!kQ2~tEHv~OY6b!-s0qyub+F69fcLY z^OGHil5W`B-G4R?LSIw?G(?e;mdkDsQg!w(;N_|-d94R5X3lR18BY){Kwx<4ML zF?qh|QqXo6uz@M~yb3ZX7K*(O$e^_1KqffIMnX;guSm*I9cl5Wp8jU(6zNv?{jv;!Hd_{ zi}ob!)sv}`eOt0`rb`^hotrLl(DsT~+S|VVPGo0g8rY(LzNb_yk0|kku&C|CnRyjF zsT6uj5zyA{P)4t^S9gEgiA<0RtGul@t18K=WWtw>sia3GHD9uc4c=oanDPaL%3rlf z1v6+uRo^YF5z6v_VAoxG*3Pr~*gbCZ>>$sS=zy&M*W*bMjUSSX&u8`v-V6yb;Qv+9 z6|$=hl=m;#FXgO0DL zPJyRqv={KLg*9-V>{?rRA|P_C8k?)>Wzj81>DJ~aU4go4m+m#yk~r1liW2*F+zpt$ zBnm3`XXg6O$dgO`ko~oJ*B}LOQDqD#zyjnSEO7uGP3kHBP#pq37|vdnAJQjBHLi}C zeV6l_)iHTE-Plx0gu5#cWJKNDwSY%#BFG9MPgQ&^r<7gGlwbFs34S&-#U;_h8hOb{ z(M!G*vU-O228Y#Cy%o+TrS&m;sB!onT4!B{th4eFcrz|>r0F=N(=%+9Tr8To( z5RXhyf~FkLNY!rPIaEUaAs?$p~(sLg`x7Let! zS&y@NEY^s)%0pxVuBYs}u{A4x(cJ%D2I94GtFPuG7LZGA!B~Th8j+2X8e#ks25_Pn zlZhUw2qb922 zV@DudT)XXX4z30;Fc9-n&k-;KcMN=dqR<5`qpF&ZbC1xr1{}8yg`;OOQCa>}!AeWu zS)&G`Du~&3UG+;tC}jl`6qu5r5l*N|mWKT%7_Ai|K&lhNVjR|^)8JgvTt`#_sO!9; zKLj*9{_`(R(y|lM-l&SNvf9HajK?W3PxIrQ97o-;~h4cUzZJtmq&9n8Bv1lI@-E?t{ zO(Pj_lWMIpBh%EPKg~|7L^oYG^-p|PxFI}I_uKUtobOCoSQ-41s(eZIvR_h10rd8GMo0b2a$r7 zdBS>_N_D5+$nxkx5O+*xXf!yU*Rnj8D$_=`eE@OPA5}_76`VO1}TKk>$jy+My%2z z;7hiW`(!WUmNQ0>jFt{y=NV)MLbA0)3$X_~`T-xPQuzWn#$h;xw*bvoOt9tt_N>9N zVJ8AjYi>;vlkg*1M+M@l3H?@qmxe_9-5cV@ywUhX1*AdbBvL0`L6w_o5}#3lH6GJn z75K&*RjVx+Mv24CY&Y%8#B1H`(u0B)Qg#|yeKDg{b)HJxMHB3N(|LDKOU1WCtjXz@wuJyb)dM7r$~(yhkhkvdZ1d+4RFn0`B< z*66fCJoSktLU@)eF!jRTXrkl=*QnO5E`@s!LjvDTe7b%_nSV@q5vGj?Ip-OOzOkI;hiUT!g||lE7}a8A#WF+| z%{Nzb8xqbOx$SqTuWQt5w59%E11UeT(t{F2$Mna#A-jU~o?D#WW9p0a9Xf9-&h#AK zIVGj%5YML%=|6gots@8PjqcoC(Qc*9h-dy+r|L-lji=r%MlG(lr|Ka2Yu1j?b^s5h z;q0{rI<+A-<#ZPtue^7ZI&3io!r=F2$Q<(puLPt-cvERslIV{KmsSJs=Tc~B@3Ndn zxYu6@((5|zm6rXef2Qlz@q144*X;P-{xXyxgWGve{YnYqS4RcV zZz0LATnV!7pakg`P6?<44i@b+F`GVt6${0dXG468l@4?qg0N9@Vik!zSR@4CKgKgH zip1iKzJ$4LTcSOgZ1?V1|Iq}jqecB0-DQB^4*g5gglvl35fY{e*;FC+98(kWpcGig zW3V=9Lh%c~6itZAVogYw(uDZcLd)9n|0mXj)TT5c-?j!Ew{4Q&FF_MhmC}Ut+rWR8 z$)rl&SQCo1pQE*&nAtHyb?VUH8)-sPb|6MrD{axds>4&I7Tpya8G_SL85{bLHZ^%A z$W)_Gp@MoP2%U&ov1Jr}y1*XDKmv!UD*uf2A%i~pkbb2P8O(nneaJB!qZzUYy^-F- zZOgH-Z z^rAP@holGn>(hq}hmR50sScQsbD^{2SUqGFb zf0@vMxWx1U8Fz5AQ5Ne%x|BY|ugH{1a9&I{W$~A%52=OdbyE%xDw%3Q1+#Cp^V8L| zlhjFIirYyV;6JHiv>!m+W`_%!Vq|@DiV>G6M(9FFVmR)b6{1*QLNOxMb${k)?Fc^c zhKf-`D}ws>2ho2{)S~~fibZE9aNqbe`p}J=75DW<+g%FmcX3f-#pp-m9DV(}^m)e8 zpmJGPSh;3|sIk?o=K9uCsEJ^SH5y#yvVIKD+^ys8#yzc2%Nt+SzilhOc?w5Wa*8yL zvbF<1AP?zpl(O^q!u!eEzWDy{J;ptFBU}n98}kSF?Ip?a7s);PMe>dgan|+V_pWUF zqluXue7%E<2X&!Su*pdJdA)^$Y=|>$2JxDa!CDJ2*KfjZ!vg3%|PUOXzo%%kN-pcmx>Yru3|6kiJ~(%IbTS$cu6pR5Yqf!zc( zQ5a$fE2v_7nKQYaVl2Ok)S^|^rc;b<#kcYx-cg7?t~+HNI~=c3?I092GJST2J*HsN z7fAK6J%&yT@ujN8nOP(jsaHvDv3aPW46A2Gz+#eTJrYHu5wm=_R1)i-%s>6?Mm`BBwPU%FhEuGH~|s=>y* zvJQF_02}R1cd!{$WqPDD0|s?wz)+)otE77dGZ`MZBzbQ0~4{ljb53F&${AD ztt;BVzcxRrmXy95FULvVRDxE#v<^tG&(M8Cj<)d`)Jj6YbAF~zAU zL-JZSl)gY5F_Fc$Ir|dEFFE+Mtv0WI%#nj^8I`)&k}bz^R*qE_W%lUAb5fiNDmH@X zG8Yw!g-E^BW_X3=*@7?{HDvft!GuvU_pol)d+nI-`*d!(){g}y=ye%1Sr*H*BC1p= zM5Vo9SChtMZ8@T-URZ;wKW^OB?{?Zxx=_O!OM%EApd%35FCZ4g45O#bckDQbr_xQW zHU>1}duR@-Nxs*gpkH^Fc0KK{jfi7Kvhl_s6F}ow8hYFaMpR6!Sonl$q?h(fFV%`I z1A1v>z<_G7@f_Y@6R!)x2Q79mrsJM@3Wm!KT0YjcfryD-lB|ZBx&WkYlCl2iUdn?8 zsfrpskSjbjJ6e1;@q&|v@0e54b_z8{(^E&wlcupusU-$)zj$(3hk~Xt3swQ|jk`>g z+XZyVwffUifMI~&`1sE3hrSQ#%o;dMHcqAG-5TUXh1hGwDuf)v4~VTVGkf4A1L7s3 z5+FHz6unN@u{0%y;gSYE1k*T&a(ohVNW3y32()WBUc{-Ypj8FPGJr9)@EsS2R)F$p z38z6lB?yq5p`WfPJr*1h;`I@epE+O-4{xvyD!|0k=Z)# zb>#_nL}`Ms*;G$t#k6~Dml~LQViS_?i5pN=U`~N7)xT6vQvDNJruqljC|U|cOXDx% z)}sblIra1%0(kyKprfX%!--$cW}X);63s-tYRjRuq0Wroy!SS zaax8lf%ch45U)l;@}H3C0+vzIviXbUe8nE9QBC8D=>=_H|H;czX%H@83Y=i^wf3+A z0SB+SxdsHg#q=NL&Y|C{DA&ttc)6_`{YUrFE?ymJ56T4sG;urmZ!y&(cK8q0>4Odq zsdW#(*3Tz{?voDoOHr!os(PERWZr1&&ga{@onyED?{m_cpW;ZY`ZxYJoyN%C^qT0|L`e-%Jl&*(nG$>47(L^oT$+s#U_H<@#k+ z1k9uUf?t{{`2Vu^K5$YNSHAZ&3^1c4Jt#(E%sP`DcbVuWGts>ZiTm2EO?+Cr<7Cl5 zZcH*sjA3@OH{^HLR23JRxh()2mac&iIgW8m+K3REBL-)+eGS$ zwuy3Tniz zUucf6>X+CKM!P&aLh4zx4$V&BzCXe}n_Am4 zmVAIBN4)!0wu7WnxA*Bwx2woEdON79Su@lst+NC8Z9AxNzs^RR^>N!lw{iOw_k^kr z3=HY(_k^n1?scu+5o$TmZOVS@XWK!svRiFK7+JPeZ2{?oI=D#ve!CrHUK_t11UKq; z?Lciih~Kt@3a8)2cSYioUv4{i!d6e?Vn);@xMxjB144PI0fbF2ZulsiJ z!SZ(SyM8;Eh%Y;&?ckD)D`-fSrt^C>HFYQ@{|q%~CcoO$b?m`1Y^KiqXN~iN+E-mu z=k`h390qx894Mo7nGe(kP=Ufw={*X>(~d`PfW8C&{xCUDDnRK_(`B0rd%kh|T(qZk zX9y?kAT|C`cdqnza3rQE{I=$P%Hqm{48^XTOtI`@`|1dSE^A229Axg9RqpmG_X^zl z#iudN;MRABzAbc%|0aC+eE(hGzq7^bneIYL_%xPqU%c&-GyYna6Ui#_=Lbwl| zYePB+(TS>A_GRHw6LNC`5`0=uQ~r7TX7>63qrEVQSL8y%Z|G2Yeb!J$nO8@<QbCdlONy;DJubk+GCpWUlqM2N zEsp}CObQSK+Ne7rqQmNLhhJ4*t1r*M(7YoFk*l=~MpT8bQ)wEN24z5WL<=TU3Pwb& zebO<`SH(!}?S=ANnw3$QTVR-r4pv6G%Crg|US1p1@;cX>*ryG5_1wF-A#11Bwg+vYdNCESTY*8=_hIfe#$3soeQf;5AXIx3+aNRx*}<~1eL3(`o0p4o`_hzj??KIC3MwBQniY394Nw? zCmauhtcigqYNPt8s_F_LuIdPo6Debj>e1Osr)yNzYFl;HjjCExNK~~oMEYDChQ8_w zEb6f279SRKVh@Piev8R#Ag8?M-K#*Ie|*)tD$nk*v_z4fo2UYkE94I z%zL6-53q+%V-#Q2&qpX;s+k})72M?QXA^MElBn04GI{!KpSD6wz?IRk+==|I^C z<6x2QeSV_6)YS$b@Xs)pt{Q`Q@xz~qz}mz-$atkJPDZf9~shZJe>yiUm*m0W`= z)vP}D1E#lh#XppnwvOdm!G5yR5OuipiDh`17SxJvR!~h5YQ2^nO%=lONQ7lGXgJ%< zhlC61SQ+rnd`ROf>#QB_Qopl`U6@pxp~Ws06lp#buvh_3cq%&e)-)Y1RPtnJL$ipOLdPuXKD}#Ix8$X3+6$phQM&+fNB)7>&T;@+%qEgIAE(x zg*z5*(%RTMkzT5QPCEhM^8#1j&E z)KM8dc(17G7FAMGqV%;33S1=YFo6RW$OSb7`kP4L&U9QpIy$dA51dYvYWhiDnIbyO zr#aBi4k8}rjEV`y0v8|%&3WP^VzLMoR5gU%Yw#L>RBquzenfcc95-?F8FDHUhxr)_ zLfn|45Sap5r3O%0l_u`0bo=^_gGB=5twIu5~0|;vsfn@F>g-6Qx0cz5jJNt6W z0KHZsNIxC7le+@Q`F7HF#9|32ZJh{--x&BDGHv(daA!6Mg43HSsIR>#frFRr5fGAW zmmLd!&K(OrYNlmF6fYTreGyHndfn=&WzQ^CtZOTmGr%fY)dqz#f2gXu3Lt~Rr8OvA zTG1{*q#3om=^I~-NfOj1a?fBFrR}(Yu`j@={o*HE8Q)o3v->deKBVcuZV_QJY1Gvr zIs=YPAtz#CZ?O~%Pt}74hz<4lLestss?cz5orZm@me@W4!C>hXqQWoFU@Fl4AO-VY z&lPr;>dp{`zT5n9SBRYimr3Fp(%9k<^$agY1$nziBsGU=Y0Sa7RaT&s2!7wVQUS7W zgGj8`dR#!o)MG^yz%Ig4EFYgm0Vbvv1HjX6#^m|yctlISNNSWC0p`t$F;J>)N<1hP zn-yQPgUwxe$CT7SJ0&i*ZKfWA}p2aw~$PP}v+h5D17iNCH8)v}sdhhkKUC ztK5NikG*eByPrm4L?`xzPE>-?3DChjWB2F9ieKVu0Fo5BWsfZ(W_>l^|(sm4=N z?s=lE#@Z%))9p*sg(Nk-J*(Ya$?qNQQ7JD;*B}w;w+pB9Nv>Zs>J+vh3S*>DLTm>E zAW)7Dh7b#IRu^R2u)2O`UK#3-GwZgeH{Csgc!-B!y~rv(7PmglH`IfK_V)(%ql3V#T7)MI_kaRY@-_CQ?83NKfPzD5Wwe6|{IzDzFVjuz6@e%8>dBK<#=ENjcoTI14>c z_5~=_8-!dR0KGGG>dG)_p&#&d`#D;82cDd6d>D(9a))_9Dv*sBWWFZ?1cCmz0zInt z1ai&EMg{t zaqKuLi=5k`8$W>0C0$rL`(^QeY_tR@4Ye0hs3aT^?Z_E~=QoS!8#RVj5ul%_N$xU4#I5sj zO4sY%V}MkXJfmaqx62HQJY^3rTAFYvipW zop&{FC7rQ;+J*eb=B-SB5Ay5_@`R1ok+*8}ePv&&6QW;{w~DL|GztRWBSu2MX5Pva z_26Kv!u~hPTP0|&)<^p~-bxsFgLtdL^C#!6=0~0ITi)vAyj430s^+cC4<{qUl{pzC zqOTus)gdZzyp^0|c&h~j*sKOba+e`ud@c5I8f!h?{W|hi3spTs&c4h8s{S{|TXlJ0 z>pLfj|Ir<%3Bpw15LLtO&5}W0p6;gM=aFY$kSA=s zj=a@?ug<maup@<7=apj7W~SZ-BAbH!WP*YQ@uz#GI{ zUAwQEw{k`V>Vz3lC!o?8&|b-Oe!6!gQU~7Q^vf2`6(fX8vLPv%z8SmI$09G}`h@6a zK=&>IyP*zE6kW>T??N>zgT)qrcn}q@(+38ztwBX=WxrR zvAj|uVabZ@M6)4Jn#C(r_)D+O8vqUpF~IEUWJ!(cbQU@7R{eu^}h4)v=3B&tGn zlfefSmz6J6EWT@@zVKaYeYsjKnvrpk!Be?;QPvJRt{>^URJJPj6J?*ACuqC6R5+E{ zmsShCCuO-ZxwCnOhH;@`B|4;ER*={TUWakYDnt=414AkpX$Au_1V+eO7IX~*q(9RF zq<1}0O(;rlRXnH`&{F!(!tY-bsnQops}~V^^>PrM%8hh=!pYB78X8V*0ypwgsZMhk z!C)&>Um3N|8ZFZ2jnTa>_XxEw2o;VPpzM-Qu0E7nb6gur)>8(9bcj_j1UXc9AbwSZ zc--qEx9|7y3dWTlAo~K4@~VeXFq$&2qF}5j^9-o6x~>e5n^HVTLlKmwO{@U<3M$1l z9t`^ehQJnU=Jbh>s?n!k988Z3bhQ0xr%60)x>n1E3&yfJDtA>C)|bXsX%w5}cThFRm&URbnxC&suvh_Va*crw^G}tTiNBDUi%D3t z>|1D+7b@l$3w(f|Nqjzqx=VdB;n{$8 zZTaaycUeeBR7^Al8a$eTdwmHJJY{Y|HQSUt<{qCu^#%RZU)4_*Mn5UcU-qpgDOo8> zhI_=j{UzYmGLMmdVZ^tr!q1d}j$kYU9jzk*`a~E9s7Mp2eSu3rNVXJBzRo~Od1Xu4 z5a=GvsBa7skMs&8RY+e+w(*^Xg5|gmi$JXEo;a_(Yl0mD3{#BgE5(SwqTR}ZEo7t{ zF$fGeTSt=i9GxHF0?bcNg2Svez^o3k*`S&B5PVSqXM|6k1W8yFj#lTWZH@vO&EY1y zRVtdYmMe^(ud%}icUhp4r0kXeb95+B77GNno15F<KX{$=lH#k=WKOzf3J=Otl?01A&U=z|!U}jYL@w z2$lxHVtN}U`2x=d+RDdDN}_P*@B>=^mMcTptA_<2Cc2yFg$Z3j=(=;r-O?x9Qkg9C zsNfVH3LI&>E8NiiWL#&q){vm>5f=7L_&luib@6jj>I@8TiFn1Q0rdo*J+yZdXLq8v z0p+&G0rhI1z1DXVr)esW19lM0*MY@ z!VQ^l7vof&)e5QV6~T5L@>@wq>W#oV71E)QH9o{%8eFK5f)C*}LI{YW71*aho+#X) zK*6QJ0Ux+trP+O|Lq5bxYgC#VPUHEv4QsjTW@&SS0_+7u`b8GOb%Y4bCrap|=%T9G0nVho7KNDNA(D;p4VnJM# z*&=rtB4*uLK29@m;N4zm;TCX*(O;MKaI30kPPQ*|vZ{Y$wJ$JF2@iyQ0YdE-)yZmD zo0JnRTGY2@bL=0&HOrPDtdm5mVmKT-Yr!aI@Xuww++=4@3I5b>O1 zSw!FqJeuWRT;=ZZ?vn@t1O@ckp)aJO5{y(dBfOEuEeomG1OfU=5FkK6kJ=i|WM=zg zZH2Q!0P1EeA<(w013o|qw17yuDg>4{N3c=OaJWk~&~*FKbRkJie~rd1D@d-NZI$?% z%mBQv^5M44k@0X4URG^9oCz;8<6)lCctzvkAe<-T;Y>IWnc=Y8`McvJuAq|`4lnn}voFXKHkejLw6BNZ@Je5ueW^}JR$sBN9}t<& zsGjoI5viX>L2u-K9TYHYJW%!pDAlW7{%_E5xBv)Jz}VL*V1xlC{Z}#^{spXtjn^M< zE!+*a2d-;bK=l3N8a5X3W$7(2T1z(SE{dw#G5kB<@wJ!5;%nzkNY0C|jVC|EFR`+So{b^TO)W;)zV-nXc_QIWJ-bOiRCRGpxz9DH ziwCEqi_g@ia#vpHVw!{EGn0L797mXtT=KMla(`7=(lsJozmam@;Xdc3w;ixPSn`y$ zz*^o4@VP775Ip2AJD>XM5Z+HomQgo}RSP3?;A~4S8E_5X&45fbkEC*!%?=FCce~Fl zF1vU zpZs{x`S^@Kn1bsuT%S2skLyufb2km4fOssv_Tw{y;*)i0o-kkg@fMs7nfha(_$$B9 zH`951+ZhvTg3iO;%U>J~iu)&KV#m_4=hK}-uJq?{xzZ2gQt6q_5k+Mt-qbvlj=e~z zYD&jmz@@UXodqi^b}-#JsFcCP&o-Abu??Bdf=WU`hD#-7Va7WP%AJkfiOWG^xwEm2 zfOy$ytYPWSq61(vF4w&ExLl=*b(P+wO4G4B$#r@*b`P|LYkIo4i!K|W$-SA*Eh;Bd zU&wS84X$E|*2-t$+;1Q#tcq-GGcE@i&{`Eir&VD6Q)Y{F11i zfL9l|6(Oq3YAUAl|4s3+q0dI7`?jW+1L}A&PQB1%!(W)4qWbZY&$OHmR8T_ zc3E}HUgr)~#&~1oIg+@hxsZ-MK!l?e%Gu%SrkouPayRG%)`JezXVaZ8xZI1lJ|Ol0 z5iYk}E_WX;<<53KrQ%1Vv&9)3=^53>B zvF+R{tnxrolp_CkmZfEvgtdMQv}{+I>HOCfm5uGKL|J&t{Xza4E^5!%sGwy>+JTpe zadk*kpvwh>1KIp{t-5g#KAm+C(wn;XxEgql6z@ytZ&j{zcpzBvwA$qgJe1D=n*(F_ z_$a2k1J-wpg3beu8WiTbU_UO`1#*q)K(>Q-`h{M!52uL^?Zs%Ve3_ouAB2xZYtGAH za(^a#th@**pu{^J<+bA_6_N>`@vC0IhzerdS#hsi>DXYj{?v8S-8JW)AMtrdWT#g|3;8OGH8C+^U6oboApr0BCxb)DP zZy08jaWE+M!gb-9qCL%5u?WS5XhKlOjs%- zLWLm;?~N8-C6G->84*fwCk%Xqh>R!BPA~(B058Z=&6*{nF{+?9`rlwMe4>Z+OI-WIb1^?F@>?-b}>gRL^H7^~{@` zQONEo^&Ab}8EiY+^YJM?^XhP?i^rystiESny&YiQU7M^&&dgEfqqV7?kDt;r?^N?0 zpH9fso_SNR$Y1pbHT87RK4x4P!lP3XJvY9oXWpCjCU$Z6_?;_gYQo-3!T3_M3CCVD=1X3xAC z&UY$(c6!gew^9bfoHF`)E;}p3ssG~9H-Ch<$sbK#({tI|*nK5G%E~+?S!cJ&yD9KKh|^E?<7CI;kxVI6+dUG3bcE;lk+ewaZhMnJvRuS z|7jx;-2ApcYL7g&FtFg#{7J?daN|pUwR?sY-JGPuy78@pB&8R=GzA&_(&mdT{h_W~ zEayn~z{TCYi5?eT`uJjI_B`hDF466(tF-ekm~um&8sOOBp$t`Z5h_l4ap`A71)=V! zC|wvT)!x$77uXDNdBy-ma2sCfrN4Dj*!BsCapRvuScXFhhA4%Auet}HLUt6YlnHvJ zRlZ4bTsie<)*1^!uRxyCDG$r?3mXyzBEzk*?;Un-MPjG{`E?W>S(Tlh$*p$BcyuWY z`Rbzh{MqKWGymnM5M&ELUKoDve7`7}4Ub6vC14pox^8MEPTkgIQXINln^7Ik!Lo?G zAd*`%3c)QYt}~f%YRB~O)7g*#bvGs|j8*JcY}bF4tk?_EAnNgv=)R=}69Ky`khr$q zn*zCNqT-$sPd9A~h9^5OK>K6Q(eMU}mNNF`zVKEZl%GWns&c$NhpWw(KlU0THOZGB zZlj8axn5+;*jkt?%)-o)g0O_D3alysD4VaiqvpC~N)+!}qCOxXvRv6SR#s)zsA(o- z7zuvHO?Uj@{L9U1S6%a6CxE*#o#5~py4VYM9#f@fEG3)Sm6q#B?~q}r&$##z|ZDGW5_tcxI^swVLI%$6+gDr;T` zt@qR4+3*1Z1@??Fm?;-yG88D=_ktj-F5a2$1|S((4}xwkafb(qw29hcuJ$KS(HE;Ng}iR(y^`Fl_J$=)6p!_oA~NuybA*{ zO-Fk)b#B0mT8P`B9Z{Oi?oG#n*uz1N844HrjPUND=?FX73p6#u53D;K;;X3{fp0IS z!)JB<2Wiqua|~C%ifkN4j!~e1bW4${E(q3*SlceHNw*x)+(gpk@FR2LYahw9>)p!fWLO?* zOgFs@4rk8k`HNcZy14XWVY26A$ZgO`AJ!!z3B)dq;T2QC=gd^k^{1pmUVIy|z`3Ur zzyRjmw!zk(D^BCCG-Mx0AqE?J=FT9=%$_UY?(R|mDW_#IaA+Fsxq`L-E@Cerd}gBO z`ct{@v*(K6$uL=n!5Yc5>`H}Kyj83U7o2qPtQ9;3$T*T5-l@rsz;=4*{wy07P~8GB zBlKE7VTDY~rl93`P&|Ht>zknE*`Vc!8VlQV!SKWJwRZ(Ay+I3oa0u4pf=tsu5bG0r z(pF6MTyak6BMY^rYpu8CUy6EBU+IA_5DsOFt0+fy7a9@tlzwP&H#c`F4*S8yBq)8y z0y%tQ8Q}DvD8-kk>?cZl_m7Uo*WT9rZ6;wcCEu~{SDXKbeQ$Ow0K$x*xTlU;Q_(3_ z`hVsd)Ng`75ST4BZ;F}ohZej8QP`yT+MAniRqFWKJDPv2a7uApvg34#Sn7DDdc-D6 zo4>2XFa`h9%CMk+vuuMC9PgYi?loAja>4kcA>aYXz$U8VTiO7eQdVp!;7I>cyTnH~+i5u3~Gmgpo^| z*IJ@OaN#Nry9a@)_W!^o7n5E;0$m~(-JlEtKoZS`(f$HNGp{aA*IRkA7QxBbK%8hY zPBDGzc4clNRxN)AU%Ese)tAC@;P-KZ-&>mhzybvgZ<6l^R}U%2?-7cOa*C@pQ@=Sy zyWdG*d9Ss*&dXFKXmsTvFRZN+IGTWQY4f?NKqAMb&F`|h_Dw+WD(}1TdXXozqu$Td z4`u2Hgm}dvSfu+LnzP{^1NQ>L%QDob*oIu#O!#fhe@J*XeA?1nh#SFdL$>|^{?*Oz zQJi=Gk;NTg|8p%%Yw_s@%kiIFjyh6h>tD!*dj*1$mXXTaULqw@-_iU&l^5=Dv}BU$ zZ1|GJTx8|!rRKd>?t7IIH>J6#LlYGE05PkZ zKZ!$9XTc7*nNwXZPt>4*$9psJTlZ#T2h!n-b?c0|dQ=otbJu{pPjud|9* zo6cF)L^%D7tG0~OPvfV0RT00H{oDcQ&xRERrNaXRvYHTmuPZ!)WsTYcEGjPRGJ=h< z8FyO|JicZ{WJ4YdbMTSxPd#|+D2KW!LL>s!`6ARDm0K=Cg=ND>%Y}J(Tx0)>FRh@` zsv7$_!mA1B&jqbD7HPb%ixNxLLe=M7_xhS$eXi!H8IC)!h8)P`&WFW9Iq#97>L~6Y zEkQpp78wH$i@pw!QLaNJs}9HEI%KJqcEah-1FE4vB+BYG!#@BBLCI3 zQ27}Z3=hDuvYVT6K3ztqz;QsR$=NV!as)&Kkbn>Ys6g0q>p#8l*&hM)1u8UpzR{qm z&@&ktMbs-vSwS_xSXm8}^-Kk@T{s=K9bf`SfEl(urUaV6i9i!L5on7&Xd+1gA`n%v zBQ14E)ksmHjjsMOEQ1~v>Y_|wQLhM=2!aTj_9|!uK?IE;aL^zNpk};L=MCVs&igWu zMV)sOZifDt&ij($jXbI35I~O|iv;fR5D9!hcHk4fzXHBc8TDe+00A8}paZvtmC^`k z*8sO>R<*%6j`*#M*kHO|7it~Q2c~3Vh)EAn5Zl)m0$8*7t%v1;3uz4Ex9X*^_^qFX ziHqO*JZV)`1F3g;cPm9UH~S3jBt_F>nLEfZ!)|kzVdDm6lHKOGp-R!*ojWXP zObI+AjiC&faUPO?0@rcOTXj&PQDRT}y_K*d{-uuwYJORHa~C!f{DL_bv6KUZPqLWs z5&YL!i!zv&>5&j8jUfvDn%rf8o{OFk31ZJ9IV1sa@hqwK0E=B^&t@F9u=Mtjb?DF< z%w+?~?=kmOOv`V*&r&?@V0l)Rbg6mqTVWwU-!+C@z$C8|I+1;g@y-9{Vcfw>u@k>EK#iQuXm40$`_+4R_I#)QD_I7ZzLUyR5~eK`wKb%B2hNDODDm zR`3NJ2w863aCv?zYR#kC6TsR`Wxm}-g*#NK#LgPZ2FAl=zZVw~NNu7^>xWdnB$ zu{$i?5tp+M@hC3tox7XVk{d(=^^oF4IL{MPN%{*X3L;oZ3U`M*&L7g`6Ei?Sai z(Q*DiP9otL@V2D&I;ben0OTcHi3TVO{7_+r9hh~CGA|@SsLSi{B%h}ko>F^%yiX!C)`?n)# z?o7)fim61wxhBxGSUd+3wHk|J7wUoF0v-{F)*d@cz&D*=?(`NrB2`UGpGlArj$;(j ztE5ZTD~Yt!>`1nk(}B99rYxA~R*!PJZ#8!*8{6A5ylJPyVZVDuFp-;KiBBW+^Bl2& z(O5Tqq}Ld=Y|o%nW!5(|X`pAF4l{$iKhhfBi8z@884e~NvNbK6M_?{JVt;zclTNw# zm?3X=*Ypa4N@$m-Q))Z1AeobadExqY{PGw{!GKEN?gJ8hL2fXUQZdQqyW}Zvue_-iCWH}PlFeD~| z`C!Q&E3DhX?j=Ppw(#S|koR2CIr=aWt|hh4+7P9cSs z4bz5aO(*3P`+6I*^LeMZ>dkiE=WW#? zt(?wXrV-=8UBj4+C5ByL6g%t+qu60r*r=(YdC)$B`*@nw!T}t_Uc}{c4C8VdG&4wG zDNA?0sQNTpb>3@m`>BHEm^f8QQMgm0Ur~bJju!gG^pERI{<;l_Zi5I&xD=sTf5bp4R9F zqcubNSXzT3%pfNddo0u0@90ZX3ek<(=THtV*V9VuNX4uBWu)T>BwCef4-BIi&R~W@^a)p`U z1IpRJ8GU59!L##uSAdr8Sb+#PP&VOmxi{c)Z84(LiRR7?svFCUbZj#oS08ydxYm<* zgL0^8Zi1DH(wlqOT(0GY={242GFpjo(l)Zdv6w;{&VjpcJ!P`O`4y09EZy>eUj+q9 zIV#<Nt*_*WO{LUV7c zBdmKtp)~Zg0p?f=y0rvll6$R47{)NDW`WhNvvjk{W)zBA-%rmNormkB|+w zmzD4`Y1#q2x4gs>Pag_Ivx3MuhA+xb@b~lbt z{h)imRGUL(TM4xnR_It60Wd4E4Pz`DG=L&Q1~EHYVBqxN?O6D$5p~_1@cKq8zuGt> z6XWvpK0z*}NAY-rH`*L)`Y;Y3?(H9M=5Pd%?oEe-PChI)Clk95wJ!#BljhWKHP?}e zb9%0S$DE!ke%HLCr<3edys%_b;n`|x=G5Pp4j+aF-%QNpIXz!Km)PG!2}3DUQuTMs zwe3i<=Oe#QI0`J*{NvL|T93CSix#iAtCj|S>JL-(Ta!K4zf;#<7mwHCJkL3&f}81h z&%Yvn;c2i}4N1hB;SQKKj2@0pnbULW9}xR4T?Aj;gVn=x<~lxMPS4zT6VYnkqnJG$ zKLu|aM|7Rt!*j`=x$ki{5oY_4?78AXg3#@l^@AC2nCZiuo=^P|5wk2}#Ed-f&PIpy zuR;LEygiq`S9bcvmofAhnT+>+MpFY*>M=AK!R{g1^JfUifnIDmEBb!`#o+Yj|&lXjp`G zAY3oC)x<_emlfhm-;UNV_~}m5BgOTEdsct0ZV1+K{Ec56ZjdrjnsJkSF*uK@of1$p zlIo+JO8ct2vWiW^d2p;M{Jfi+b=*7N!dHdsCUD}`SseQni{lKb;@HHV$E_N*_Tb&8 z=?M%__FZ7FxD)NnjTD027)B`0#ZCsSQ)vF|`#+FB`#%S_8=$DbgQkaqrfun_`_oN* z8BF+OI6-aFiJr%0E7Xz>kC7-%B2x{z#<0tl@qz$U6QyNCBMoR2N4OeeoT#p(<}|o@ zHwzPulo-Ugf1DhLfN@0aY*k>>4gkp@;-}tOs<(-8c!)w73P%J1HK;Hpb|Wrm>T`iE zLm)O?zlJOG)9<=6KlOtdbfS!nCg@su9oD2GGz}XXupM?A?`;k$;8uHs*&L(;lQ+)3 z;ZK5Y&IsbJx#9d^-HvY!f9LTdk55;EUL}}uLtC)!nFn6H=B!VhHeaFYpBpFK@V2&s z?AM{5F|^ku*z`1E<7B?5trAy*e?9B?gtLq(d}IoAwx{f0V}8`52W5t1_eX_KWN_Bh zi7@Z5vs$IUB9&9Hsq7jZRUH1bf(~W!$SCXaZ|=ir#ws#OIlZPw|Ta17)Z!|*-8ST1V|m&Ko7)Q&`{&IQguE%KF!@IKmc|*>LZFAB1L=} zn=^gM(Pv*Qh4_~KZY3`lA|FF<_}<^s1Bgsu*cFYIrnc&JO?SSN1Pp8K%L;1TG)u_A znZu>G&`#;OT%P`SE6**>37%qfc}h<++hd-jwENDgPP^Kt9jK)JQ6=q9$E5A@X}fsR z(wCdBr2YDsv{(7GjrI_w;4XcllJ>eWX=nPhg-Y5#w6uq1QT5(2X)3f-bi){&S5y`i7n0dDYS?uFhhE2~EJ7~fX^ZTH^}eR;uivH$k) z-G8Q^hr3Wd-EdmaU5ds3@;x(ZYPv3(SQD;aR0_(klm?$#k42+;zE_oE*`xrhVzN^@%yj;G5f?D7d0d%x{niC^gbVnURDxzCLB)E&E1qfB^!zr!b9 z=@a*Rza}@O@AH`x^7ML7qdWzlvfxv;`$#0D?)a)?Ivw&Ph>;n{I-g>p@T3a#?4V_* zd;9V0XR;*qcggu>4EG2N38$73)uP&P{#x@lI^mc%f4c(Hx3pd}jAentwj z$|_<_Lg0xZmt>#i1JVK_&2w|Ict}rsID$j_ChA^n_CvB;lcA1Geku`o3EyD@X$BkHJFOrLu~_A(MW(q z!kirYR1Z**)Ml#`OQ($R)lY6&!RaS)991KE6Cm1T2`szd>RN<#&Y$ppB*U`slgZdh z$U#DWYZ%5vOGA$ju2fs#+F?AqOU~XdMwY3kr*Ebk$Ge$s?=K`~YD7gpXfn z{#zW~A!-UA%uL&dW#FTj{M<6;@gi!lD=O4^Is>ex#aBPbeHOR^-VAKocSU~sQ+E9k zQvxpxU8S1`L=XY#b;}Z5$NpK9Ylr}$-mrB`teXY$kE?=3vn2v6!JW)E{h z0}vZMQLuh-8guI^XCh<$;!Lx& z;^d#|CSU!u?P*o7l-4VlquL`#hG0aL^Ruzt*=hTs2CjhvFAYMi2EonlEhEM;1R-Pq zjJk`0ms`8aAYd-$#Noc%S13BhPRi9-fk}q0T2N)9<~usi@8t!{f4Q%(&)VIKV1 z0CecGIVB>^2pA4GO?ylv$#o>KjAYVJ?!dc^G-VuVSn?o>w6#2t)=mjECr763 zFOS$(fk9$MtT{o6Dp8HC9w}Waq}(q6rZvJ!1uCoEBTf)VkyzKdJ(?RT^zH(q`lZfHdi>DQ zs_!-#dasCagT_ZgN2|O5#5rI24M#za}16Pl^4hHIrLtVWfCVBBi6P^CNC zl{27K>H<|nZ}i~QPkRBtvD+y@ox6F>p6;`G-W@bIKl6_HTFvKXd3({1_UT1Gx0rUR zRRl4Z_qze{!RMx0A&BYVCi3pk%*NB_hj!lBx-RxWdEtWrmIdt@u z_>)~1*Tnz&8@y>LMyg;b9v4@B_ghCtlkv5fY4Ya!6JcMWG$q#8ho=3f1;Fmo8IScO?qcx&;aG;1EBpvv8^?T0ch7Jo_FAA*oTh)gGZKsdMjab8JsLlQZ~Ujz;e!2k zjJT3GQkc+2;@}Kp$B{`$Y%oALK&7G3pOu9yG^K`gvA%4+`MsI*IG#Z&A#jB6wvkMT zWl+9(wos{~NlqH&G4?+nJde%v)IOo1f#SqE%;YQ4IC_!uV0_8UnLF;tZZ2a8Yp$xW17y$u zF3}tM$vxuTs>4~R6DTWpOW>|NW%lTxATD_rQ=KuB#uzd&=zs{kK|60x%B*3&9URd( z8c^3WW7(Ix4OF?1*CBbfEk$aE4wg9kc*n|Uk~MzCTCV2#+I@Xb`}#V3eGAI<4f*=) zOMPmf>PxUuP_RB86t7uhpr6}1fiU%YLA z8GYVen5gxHS&|!d-cKZU9%eO>&V9H6yKyH?+|J}oVeGmPF&; z4dz#g#Jlo5*(5yK1ZA>mG|VlvlQJR~mK2J_zCwdUCpPrc#zSt=(R@Hr+^i@Lci`Pd z&Lxo-f%BsTj=!)wgMFjv?%X0+JvG&XZ6lk8zv6gmRsD=7``RP~PyzyWN5VlsnL>bG6r#xv{RQ79JHw#MoMf zGCp-I{Ogk(?2un|!@SZfu=@pbD;*A&_(x!>zSZ1rmEGdLr>}M|vtZoD5Z)z>E+Ae% zI`050_#lI1VLJEu4$Y(N>$15I&lhuGdk&^mEiWCK%Q0G_l=igr7+U(d&+niQY}Hj7 z9iH474=})oMDh9BGqsp4R(9wPs?fAA^3I>nC2n`vJ!YA3zk-y2EuOA}=j|5duynP$ zdh~uq_ySg@OGNbA&RFBc`x}z{zDG!55;3IEQKS*F#C^`ExN3~qau)JfB;pKBQaT<* zNw~?ab5AC>aPBB~K|GHgA+%FU1MYYqToGj6kbwp2Px=fDcnDuam`m@Ie^1OHku9=V(Q3$JvT~}=jrDJf0-_WmGy;^~W^0kL zDyQB020x1U9WnpHQig+3O_wwm~*t#b;oq;j3j( zn+*?me9hC|K-<#MW-4XF}wxP?$UNTf4uT-3E zc_GuX6`PG<;vLOhDgf)Oh1#}a3zc(&RCnZ10e3$UpDwd>=@zW}7_TZ4u1zzHgh4Cy zl@(*95=1(}P?ut`by}>2O=T&$6K`Hi1ues9m8GcC#Gt4^OdBOJs@>jOffAHP@-JzL zx_sge@qJ|0&R^v(P&$#Nec3-)d?Y9)pZv6GmMDsJJ(doe)7zQ@1xX2oR?2Jaq-Q2^ zLNV-Tn4)xqE1R$Vf-hX^7S+Qr8i%FQHh?sEGh3a-B!|I?GHXUm>;EzSwTsmyHzP!HWi^x?m~S zj*gzyj?L|Rw2$i-KL}2vecY-?obGESgUKICd!jTkTd&RE%>@p<4gN7F99;f!=jD&F zLqaobCFWPVciuh4xRdnZzS6_*)6w`ln&YZAJjl`bA=)z1z4t3jPk9uWgu6rXN>O^} z)o#PI5)TTlrM4M1)f~A9fOu698AZfu-2mTs3j%-pe%0jArAz<89b*@<>K4V7_PxW& zC=l*iW;@1yn|olJG_$N=cZ}U855@aq>>5mgdyD<5IgmZ3g~mV18d!{@aFK3;geg4X2>VlF`WkIM)f#7PL%}f^no(`V%Zb6T z>DAX&nQv9TKWcpPbL92j$rl2S{; zv#&xC3u^>`p-A;{@!psPK|Mi$_GXIwg$}bD_Lxhm>MEni)m82SV~`DrzCvR?EI>45 z(qxVBM(wB7dMBM3xQ3YhN#d_UR#g3ffS>WPQhpL(Uk z?B!x?x`VoX@q$CWP@%Ol1P+m}cFr6g#rBsXF&YibY;8P=jf21HFnd&Onc!6GYa}>J zs?npqn>miQBh-l2gm-JV!(^G@$}GuA>g?qf1+v->&hRftxjo0&V|6;WO~NR%2@&}_ zGItnb^8vD^kOqGL9-VKG?XH}fCs;=rI5XX(d(C&k z&6>e_A5_O}M^oAB9;+N)m!(QhcF|kiF>*V`4!ak7T-MN9UYm|_FoV+)?zB1PV%PX% z?K*TW6Z2oKAcX6@j))CYYGtYzRKBkD1mb^m7aO!6YVEC&i;Hd z{yDaXEYgr@d|HG2A8&|Ho8N#n%X#r>3mW-e&t2pfHpizeYz>xd>}Qx%nE@rQmWkO5 z#w=iG_HxjDpfMdjjZC++v5{MUk{{gwGqRK#kvm^a_gWFk z{WCb2no@tKj9pMa917Pj*An98#vnZC7@hndfB9$U)s)_ns;{Bo zWrgHN<9{cP2Xi=A{`YDyE?Tsu^b{r%`+Kijo}5>?Ea(`Vk5&_!_yM(dvY3*UKoI0v zCgLrb=GOSyRP)907Pe*G17GR7wz+XcoDN~7OEY3~ZZoa1B(i4-^+;fD5ZTJcPNrAMsL!%->Z63ebnkL;UF_5>(z9rQ-6cO4 zxMLV;7r*!Tc>7wodnztUm%&OxbiLS^Ech$qr8uU{9rX2jCNbgcoxdbi&Zo$rOKXR zWovzNWk+0vD=%7fwDOr~+ExxV`sXfb0#H({r`eov$31I~wN1T@3{_VZ?=m;?2D^9O zu&BrpA7E&X4Iw!V?Cp!kb)gYTYiP|{W9O0KHP zdR}#-?0d*KpgC>Nu(#3)glQbr9AIP;jLfBpqZML{rnZZz2yTzASIIOD*?w1yPIzCY z=~)Y4hC0L?jUja}maPcMxK`xQ1;hQBrWbYNO3R&4NT%gQ(jsxij227T5u%Apw}@!6 zExgYG29VhvyzLFNw)C zF=Zn*!8jE&jAE&k>h*HTPs{hWV49)3MmVC$g)6D>(#bmF*EAH)<^GhxSsbBcJI!?| z2T20dECq*V;$uDf@+8)zTGn8SwV+hbrKb{fikU7e#r2?DV!>7|VtA+Z%stKR&AFZh zi{!zXJ#)`AbnR;lFMVsz+_#&jMEZR!S~Gg){!Y)O=P<=jQjt*ucD7l=#XX9Uot^3G~bjw}A?5&*1E+peOZ%8(6 zzy}2?w&h^5enWcp0rt2kDDO@+_2bFpJ~@N)o5}dsHxSF3o0+Z|5uHTo4{;6DXF zb|Z20D?u)(3v!Dag6`vh-##N5|Hhp>KZ4fv=HeWrBRB!znfTwWPu6b>xr+iz z?N;kpFxP$xEi? zV9>NFsOOC8mG}>3z&0(e=Qt}C())szCxRC2sYf#Ped+Fz0||pn%kO4@Tc0FF_wmt$ z0axJuz6#X9X;9w}aLM{&F#8DybY}Km!3=bim~Z#MF}(m>wrK$VE>q7rl=sInO?&jJ z3CCAHhpEl8DZ0hA+6EPd| z_K{#cahEoXy+E)=@{niS3QO-#en_BR9Srv;uhO^}?z?(!HrE(nEskw>t}UHgP?yPl zP`7hrbMqSzU^{(z+P4T6)nz_ndndnlK_kwI2&&hlPt#jv|xu@N~4U(Og_UQ zYSuKCDwT8ZKIMJRY>4-k9#abQ$@Kc-W3D7jsWW+Z>zK^ehpadZueX-oP73Z%wVFpu zai!-(yqQjvHtrRKUxuW_6PJGAya3GJ=wRu8;AP`7b!lPI+n9regz7ms;%6zKL)Bxb zy@(w9AFP_4JLw&K43Rlc{X>dvjJ3q#GhwJ(N8qNfG!+V|^$U1fOB-#|?UyXbx%+S{T? zE*juWbGr#}%XZkQurC$vERIYJR?x26R#uXJ!gPyRIM_Wf#rpYB3R0WC@sckMKa%Wz zGL~xFnSvE;fZZ%TN*Ct1nh#YfnmePQQg77Bh<}Dl?>wSTrbl$}p>%fHC(`@JmpnO; za&KulJ|jykX%3Zs@HFJ0n+71gy`_IP-{UIqijpYMN=uk?x79mZYPbB(x3~1~+)QWZ z0LXNx^cnIypP=}L#aY2GLnXIg@<^;^<0t>+uQ4OAcVe`h_#}1=DCONBUF=+!FhOY1S-=imj?!Fo&;Mh$c z(S^4AlU)U7fNkH7S~Nabrv_gUxe(XeO-39A1e_ozN~sK$`!wv;1?Tuoa?dK*_#k$(XuEO9_hrywTDh;_TiZy8*6{@^lj9#~f*? zDgBp9>eDKzr;JTa0Y4UdUP>r6eL908O1q8b&PN6E+2$Gk+=7Q;Gf}QKa7$w5FwlH{ zv#ayyZh>xK{UZrA?|ARul=GFLY*W3x)4qkP~9VGEs`F@nzMjAb|w{&QiP@&PU zQMk)|=A3v~gqdod$)v|r%3r65i%*-0B&C5VUUTx;DL%!(()|5Q)yysXR3_2M6mafW zt~pN{lryHB&TXoB6eg4)MXA$m+|fLWpZH$>_g@!Zz_~)E((B?K_g)wOd|&N#@ke&z z*e1tD{@-(5{4+|5FlGS^R7Wx1f*OhG zM+H7ef$K@JjTA6k3wm|_Z-5fwEnl^(hINi*Eqrbv7JDv#d0n`*d)H9QmPFxrZBP4X zFni>NT^d9Mgg|YDA2rbbiJIH2QP6`P5eYQ%I*8UtT`5R|e-R#P2>KabTQUalm|HU$ zkqP`-pc?s#`vNC372c(AJS>8!pu7iN5XF&QF^K(9!I{Si$mCzCYKUx?r{Fz}mXe-Q zOshNtJ|-bgjgMi00v=!bEO|P-XTCgL@?bikL z&@F|$ZW0cqnwY_#h!v78>tWUJPv_?_RjzKnnHsrCO0!QJ)f9EKDLuR`)5L~$pho`hFjxnGqXO<&Z_O%p39L5j&$7c zaJu`>3Bi)h1y$1ha@`GK@TsL%C0mVDJ`wW}PRf3&z+OF-|M z{?86?7b^9{7C;R0fdJ8VMzVw>FdwoTjjw%=Kxx{VXl*sPW^cY>e;NSO-NlaV?EV{m z3IU_N0X1Tzn4s}9v77&Mw>YX{MVZOuZ|n{oMT*sC+n{56H7@11>`W{%?gVVSU%hmQ>T``lB|SHr%i~$f4lIq%VJEf+M_1j@l11FdZHm*fhfwThlj^bA8j1`YmKk z&o17u%Q8Z8H1pYH_-rPBSqIg+@jJG@reUitJ-cuNmKRqw2d2G9cW<5`qnrgYvyvU| zq0-l%7r)|smJDRlCJEgdG?VT=r1*o%g+NJ?zC)$2J*wH&ZY66pUTJUXF9?#Ty;ZCJ zOsx%x(w|yb3I-4_vLghGn@aDn`k0xK+FH5SHqTc*U#is8p@N7!RC@6_D#w!$^t0$& z2Wjasg&WXX3N9wAst7y_|J);Pbpn1i3X`JV0qZ{&Y7R`(=M1 zR!$}9Hc^^rYw3_xCZ~m#2FCgO%Kom^M#)(zUxbFKt^0z;XM>{yp;2v zR(bvc&vmHu;?n7eOO$6`V|-ej99N>~Yj3n5_Ul1|g|!lvu&@roS}m-dF!|ce$E(Iu z(FO(!B`Sthspes&UkgWnrmcGNL&(UydJiG!y>qeiLs&esRDUkFP$BVKR#@~WL4Nrv z(x$?71wLHWv{D}(M8A*)0OQbrKQt1>Olj9Yyv%hKi~dkI>Z~J~?vs)TAV5UaP}<;P z&kVXZGS&vFfU@;2jrvPvmp<|iYR99Tr4Qg?P2geh(xo`}uU{T48(nmsRFOgMXO{jv z!h_sTEcrQdhlf5o_!b;)9UUvqO0e7f=0-}Mv+VvGCL;qq=f=r)HwSz@ciJaEglJDF z;a(2v*p9&K`JX08j?`-%n9Sr6h-i&^|6faWy0`TB-xy7*h3##3Y2OlGI|2Ow986d& z4os{cDhy8Qxdh(%=nYT9Y@o5^ua+@{HLWZy8X)0b#C}<}?9;ApD1G(al$eK?G(uvT zTQ7r$Ix*A@27%*sN>80JMSRUQBxFUY!|9f59Pm1TjKi7UQ|?DQu-@eR>4p6H*DhlD z{y?cpXVU_b-b6VFXBu!iWn!}HC%weO2+?_x2sOr+Zo*FjG;#dJXd#U_FUX%Ud-C~U z#u>p;?$rq@i%Z@m46ra;qy0K29Q_a%8VN>bMol+>XheaZS zB++$#Hvj3y(!B>2gCt?J^hsoWhLpXfdAA)Ol_vbtjoPEt#HanPe1Fc+_%lp^=hQS3 znB2Tf9j$on<;IQ!t-=kkPFCqKt(o+~)bneSvi$>I$yHDUcK4#**@Jd@X|!BSdYn{_ zYu}_`Egs@R6(qlUNMD%+mcFxSA{L311@rMESMXMZn5BK^6RyUJk+6u;Lj-9KbRYo_ z5<-JTR&U)~UXIF!Uyh3J9+(j17fM!5S*pMEo>!>vODER%nV( z9ReY3Eq(hT2#TBos;nQ{En1`xxpwFA(u_3A2vb0# zD3vUY^tR-ub)|p%zS0esHpQpZomQ5m)i%UFL{+~UiAD426O&9IWACvLBkONOq0 zyV6{cNQTJ*=_jOt@cYegnL-AxZgs@M^soh;b7`2#z~?0g*>jqIDMhp5xFYT*?MaHb zZEO(|@+KO|UHb1tfa6B9=TKYz>XlM{-b$unQBn=m zp``iiJE;A33z$NHpA~L8hq&&S6F0sqSoX{f?@EV%USo5@=5Em)J*&|#f*P~nBx-)5 zg2EDe*?9L1x*>7+&f560Pvc?<`;iV*CVQqgubQyvUz714UNzpyy+*!c|yUO2BPea5~9u@)AQ3$Uc}3%k13+kZBHqJSq|CY zu*dMG(tWR#dMy!SI{CW<45m=7Xr@f0(e^Nn9SOSkpggZ_#=b6h)fAjp)sCcFUbrNm zI=3d%va5Swqt&b-pQf-@;?7e_rvTY=P;ZGo%n%oy}N`>p&HWl~P zwLQmuZ8f7cZ99s)>v$-wt&cY{+6w1h%`e$jh!sef$|dKw4dp(+xVU~|u`n^k(7%na zK#q+9uot*zo>H!}LFqwVi?X~xmO3Tp-PSv)u)Sv+)BvU|_Pmt3&)M>Sk2b;$*_-zP<~_{?cUpOWl; z`eGmbeGR-h;U-dkuZGEx=(Fa8FA}11ER<`bqL9*Qmeq(#80e(&C68GcZp8A zCfhdf(#sqk6D;0kP|cCd1>Zqn8@SlYeEgCNZvLKwaQYH~W@)x2i~Ff*;9{5dNs7LC zi35}pw&MGH4=WH7V-PAPSsaY=(a2pcpFs#x7d5}6GA)OJd2=W*+qNg$c2I3n_z~)Q zYv)K(BOie70?_C2dDPLkzxNmoX)`H>DywQ~C=kcs(IOolLkFb`5gvD`bwFu&3>_Yy zEtgb{$FRW2enHgElgT`T3=)m>0WU13Lg?#7o~QPR6tXGvg6T_$5gv;rDtQud<;5O} zsjxS~V6j9I8!pMwCUDr+mkPJ&Y3J|(bGUrF)vL>e)02<_ za1P3HPczs(w3l2kT_DP9Z3iwl7HkZ7_=*GpHe_$;lXrsaKZ0zO5Cmx!2aPPtQEsq! zz!qt;V}eT|a=XJu&a)a?{caFhk3@sW^^XS8lNUn+RlVhrE5xc6hg?d%$G7LTBi9cj z>jZT;@Y4~3XroFl53j26)OKf*f8k*9nF&S)`-Nggz3+UFT>^zvVX^oO_@Jzily?e3 zQbt%dbZXuV2Z^M}2){1C@JU`P!sZ^sv zY~yLAMa{R(36F><)-dJI3H#@84XYNQ;{FLK_UBrYK$^$voN%)v*1LsT(m34Of>j~j z2(1)M21+aAH42G5YVs{Cvc&`_&OkLszRo<0k-33cunc5RHFNqMD!}Q4uEN zUx+Ltu{`$yi0d(tlT8A)AX(@MR9X#QGz~-xm`bUj(N-c+Z$zUSNt&Z>A)q`*txC3S zn-kt`b5x)DI~qgLRNq_cCeN{*eG=qJ8Dp~(lj-=`iJ(`SortO$*~zwzNzMNQ$>J6k z@m;_V)&`B;uyz)v~@52SLjd@RPr-igI66T?m6L)#9v?O3u$d~Vxt>~MIbZKya{ z*H&Dz%h=&wmV6lEVz{a8DC8dA-g{%S~Y z1d-zPH6(Y?gjUf*X9-s~8(+*CcFP6RzfXc>@qjQXalzfdObSFvFpFZAL zAoZvSVHnuu79rrCKr(qn2*Y5ncu2_efdD|`RttR)0}!lf+w5RygR^%~xH=&A2!`n= zgW+Ze0|+a_fV&z7ybcBc03^KB4nP2Kn@6UDVVx*Jc%c1bV0gXpa7P6Xg|^LLz@Px{ z1_oWBPO+|bGsLfmhw8p?*Z>t9ML!M?y{{DyB8F;8fIfWxmiyutqKA7bc<6fr=;5Sz zc(8(p{@03!U-!6pw1S6$-v}Ne9Ng6W6l1g0_7Edt3{66h)lGe-OgpA-Gg{zxI60$t)e(4{CJgrhmI_J$9#z4Y#*t z(k<_8!x2XD*ECbHwe@RvIKs;7lW3m8dkS7ZmRQWSXacRqCNdV}0pY%oF45ee4KmZi z1-C7+N%FqhOLDbeYa23gfEKH#qlK3ZS9o088dd$vtk+Ijl5*0LRQSaBrOK8mgePq1 zwM?<0*DB_hsj^6Myi9wJiAx27t2UAXrRH>gC2D~FdB2sN; zfkqf2%CYS^o8qV8T$nyx>lH!Ar@~FXe#fiehs|-o4@6kA`j;9zId}!98mla@b-r+{ zd=XjM0tAdm#Skne=OYWdMxsPyi@7P1j@?3n_S`%qWylr1?C!%?NsebCJj9EL^~jZR zLPc`ik^918lO#$`h>+2wi)C3KBDvKj>-*v?C+m~UFWE})J(O~xBz%9JaG=FZ(@pne)QrN|r|o28#trB%m!Y z^0+9<5sr0Svh4xe1w1|{d@PdmsZ=NJGpYb0$2r$75sUXqGCl|aigK~!tCH~%WAL3^ z#z(AyS}o%v%n_H9@v-IKM8U6B#)pK-VR5{Sk4+OGdi2qjF&n-yJE{|Q(~*qD%lPmD zpmtO*fb8;)YQ%84m7z%Kw&im&AJwH%|7voSlWk02)80z^_ycT~PBAH;+eEwFm4>bB zK9I^JX{a<23sQ7p^|cCp%97r(LZ7Duv)Tt9{$A+idxAvmm%wd=R!wZ%e=G2FRPe?M z{5Dky`j8VqUQ8vC#OL5yk;KmiyLCJi#{ya{rXa+I{#Y>up$vIZ=5M8al3Y8h&fJPiCs@DSl3lEa-K8!pS?+!TR|?e&liAE@AA z=r@7~`r?HM7mJ!l-T->AIf}{2#8^fT6&xUgLkJb_YukaAgRyrOLT?rTlm8*Kzo7O< z;UPp&Qg|SMb6OBsvv4>P!2Lpc65sCs?FDe_#tPt;V_g4SCja(x2lNQSq>sTs%*|a^ zoBJcD{(IJ||F%l~R}7yEhr;`cyH6|bJ+1Azw)^y??>+Y{*{i=8=j}VK?Fe&6xTEd9 zwoT!YZG&xOH;v@hd~JRBT-%5&^thqSRFZwBkZgM{+)P5$j7mtdwk_P$)HV`sMzT22 zfO#N~T94M$oLj?RZd$l6d`K^{j>e0JYE^MfyneWTB)qSF^B}2eu3H{%504dhpM{Nv z6xDmrs^4CJ3`y@3qM;`*c6s$E?Pxsg<665N#nPLLgKz5I74IHsEgqaw-y3f0-g8lL zaB}yqiS=8PxvzFQ^}w_jN4ULyb9iiU$jmwunBQ{SPKv8@k6{^JC6WDqseAYM zsEh0We*+N{1ve_zv}%ntRq#?1FO?Kg782a88^tSlM?s3!R;r28dLeNW$#z+bO4U!R zt*y3NTU%?DMpR6=$i*8MFDO-zs>~WR@dg2b{GP8f?@c!G^6BsK>-X_}{QgMx{hpck z%$YN1&YW}R%o!YQIT>))n}>38VsKH@-r+gp^6W`JJ73gNR6ala z&tdn#=-xFT<5`SRqh zc2baCY?mNpFo8CF+=#1rv7iHM{Yk>fyr-_pPYq9gwBo&^_6(|cHJ!i5=XTax-zosu zEs*OMgVqsrgVtNu7YV4=_wogm?W?aK;G)0^_SF{{eqO@&{!_wQX(s+(KvDTh;b)@j zjgr%O_t@evl{QZxkHDJK2_|l=LkNP*cgqZimOu77>zUJ!ChHeQq{OL+#r?{O>EsceADCh z^d3#)nH^1Eu88nN>3pw02eDt4FSC^GZi1S2vvxuPJJ}eoIr;*5v9|SKL(f z84iWaoTjR6&|K3c+ndhZA!;jbI~Vq5L(Xkt=n@y^xB9fW_65I!EuTtU1)@gWif zxCn(C%24p+UtY}3Gy^!x&N-<>=g#37`@zhj=@Ip>aTIpq;2GSX(6zohzK(T&v3i(3 zjcG{qA?v>Nog)(6{bw(vDEUTZlJHOpD3I4-gElLc`dTz~bZJBot<~8-jwyYI)9nSZ z#4})%qgmxEBdH6vxvN&tb6(ZQ%JTJ<<(=U<+--d(TZwcr(p0^r^#hJ}KS$DM$@vkF z1ke&`s@+QNcG7o{+7+*$*R@R^7x7dnO|MP1#Zeo};{A0(+9RX!ALNg#1!lN{bf~`cFSg^%E`R8gTu5=o4H08*xwzJ`WQ79DGJnV>laR z=OEq%nE?`$`K9g%-2)7ci;seYDv!FZv@({i903V;?R-r~S8asnMe{!DT3^XI zCSn$dlmxw=n~26bjiWVVySSV@J*ulUQ%pnxJ&)zNs43dj^fR(Ybv2Fes!SbMnrzGH z_JS&0Tf=is>xvO(fmNU2YernL^v}9@j+DO|Pmk*g&zauUx}i9^m7+iEs#fhAiV9!l zZ7grpzrMiUP7|Zno?K<&R_kT?D$mpDk~{fDKRwuR;SLZ|YJZBN%jFwg> z&qrY{Vvraix<@ZE7XxN>a(Q`I+s)-GGe1=XtmLbiN&ND9GCzV{=MXYS^1_Mv%vQe8 z?=C9SmARN7okPhyL4ci{^)%o=3aF?U5Pf(ST%=|{=ZHR};fLM>#?=$Az_k%Wr%z^2 z?&MkjN&QVsP!t0_`kUgcVqtk31`uNX&sJEyzNOkXV{4%+(L{`)3os4+X zRa*%2xK*xQ#Z4z|GKvCyy)N&UD}>{Fuy zPPe+dz>D@H3o4I_mvZK139k2*DHf)qDof)qE#^a26Q@xkO_ilvDw8ej=D=USu=3RW7sQtjzKEVWD6j<_cGRr+_CC zyP}1QvNbC;UdV#1pGEqK7QW$sEHPS0bX6rHcCiBVg20bkjJSUqtay@GmLF85j;u=k z3~>NTb+K&ZBDiYwsLM;^+}fjIzUC~BME+%^k-&}7yyac%IH#4^mFbbB*IyGLYG!;xGcAFktBSB;VyWu@*+*=l@elRdu8(DOlvoL9p%~UI@qgl z!K<;?mhwee?#jBfj$oNN+?6xPb4GgZx~`y5Z=>LQ>L9cfFYL4)moLCuA?ikR;~zsP zt{M%`d4_SAZzIF$6jY7(SnxDLgdW$dV}$5sEIGI|bAC5xy_K_ibz-ZRiDkBA&f=$= zt$vRej-h9^Q(V7AD$|v@l%E`KI(b&+vflhvY;$bn)L3$QBl1Qk_HQ zKw?BOP$Hjgv-9`ehN3jG`7?prgL@8(?t2{L2Yjx z8k#$W=kiTYqXmZC>+^I*)Xvz4fe&gd0U<#c@L3AAU7-4}y39cPr>zZhK@*4CmtXUM zZ!Q914ypZh+t1M_tUn4uYfD99BY_Txt4#2fa;xCFXzHkFigMW{T!Xs&yP5~ z7in(vx$j_qn0skX?n~sV#_|@cuAARQ8&^)d4E<<(&>JG!5QZGFQ5>#V6SBw^YiVYb z=-2x-L~FmE#fi~zEi*x0Jk;d&md1NPhwKU`SmN72Vq+u-W>rdcD`_V4cg z`FO$Q?^87+&{cEr++snMK4w8178S!K?kA>Kph!!N9`&KwI~s96TG%f zA#RWd87)O?c&9!u)b^a{&f*d0)?ec5pZK1y|JPqq|EgWSs{Y0=ufNRKpK!kZ;a^h! zRbN^Ex4*ppk-q)|-}Uvc`NkLHXV0&!e^K3+;%9=df5CcR|FvII|33=93O|>8dHr?1 z{)w1eG`{jrmH&~USebMi15MKkY-d$P{G)g{3McmnMk_ssw!d} z5ad{g_}c|Sa0Z3lhXcfafYZk)bLEJX2Jmm`V<-<_%UCg-$wY4>;g^Ih9BR&E}?eAdm& zzSci9Pv8l0(j;tY>z?nPGhMxN&})VRB_Q1R0Q@6ULTSUJJF8dz=z?(Ltty~+yaAt@ zCpICpezq6w?HaWArb^wzzwY+RR~j&!LU$Lvs{sf%NJWdLt}Td7{M0?g*Gl^XX^|&2 zGMOjzdG`VuX}*S3uzb}TIQAq8WY?{4HBw z6!Age(StQedmP$BkT+3p3w=E{JbI1=f^RaDPt)`>TQ?x9B>x!|LDX+gVIW@z2JaY$X=Q4XO?Bt{aIl z=%l6=WLA8*t!oxBtqU^u^VA)OkoSXg-%mt&=q#xD8vmIR8|f)eg*D&xac`n?54kCN z)8;|_@@3qrC<-?mB7A34cOt3wWm{(3CW-Gy=T5jOns-V6e1gOK@^e*VPpYbT`twOG zpG#`I7ILebRzTQ=pYYU-#Tt9M!tNu+UIKSb#rqAEVs|>ZEJ#2K@Dc{>)3tq2ARa=@d)H!*+=+RfRCU=?G;`n+x$;B$ zn6rbnJ`&s@=PTM9P!PyxXEHrd_DnGQ)A=S!R4KYq(OeA!?JFGKET3_hmWf9(+Xu`2 zb&~lCLba8Ef`(-xL3jTn&3~bSxtH*diMk&@o=G14HrK#h@hElod}QN;d|5JA=+sR6 zrf+eemzs7(sI2)_q*>(D_7|D}Z;|FlR5m^6-~Wamc(!QGxIL)+^YVM-ER#orYjA{S zVmaMO6?O^E2QGfFI$v81Wz{cKx`|AY3$pT<0-cu`QV@cPIpX%Q4{8V$v%#HkOMYlX z9`mK<;zVbDxIt4P(K#~Q0BZ`3xCaUgH~dzQzq3c~x(SW=y*>Vc$9Y2ahKi!f1gpfsB2ie~~=O<8s0+cn`pI&Jo8`z96OT&7PP(`UI{tol!mU z)!4*W(kFw|eQo=P!1@vFhx&A#Zk0r9#o~hav6>RMMK^OLnBON-nv?m{jZWtu7tLE6 zsaP0JzfQCCk0T#(R5SS{&iiL5z`Or zAzI!VsqavMIL6!Z*7A<%#7)sV6*)CZjMwsx%Jjf~L+8iRNtMPgwkln(Cq-o{UmB_Z zSf5swKcfh(*mx&yBGrHVVfqoPw!Af(zR9=QkqlE~&>jaS%2&h-TcQ(Jk{F%HXPv&y z<)f1McSIA5^P?4?g&T)LN>zEEMEipnS-n@+>=8-*C?Df`e&$m+m*IKEB#=B2^d~Ma z{Uom@3=y4;q?SotzH?rqGjbLYCiAmPJI8q#zm35-I*lXmZ)?DX@($mQ zoG(aaO59vU4g=+|>T*{O(`N&^Vcv4a`gI;E)5q--y)!oP#dx~(Chn}^3MD(E>W8(a zbb0d4^hpRT#86T7OXTpsDL(NPZlYkoQ_Mj#BNEWr^dA~s{gm(-ITSG>eROeE#i!x) z12*dLuhed1Qu()!Ne|4cZ&j(7A0@_%SWcBgTjS+RAd2TB>Bns({IHd8jTf$tPV8a? zlyB%?9%a{hz@@EUL^-qcZE~@vpeS45o7Gel19tg*zGnoXo2?dmxO@p?czZPQ3}g6l zxbb`&!|j-j@~d>A?s=ulWnxHJ>M5%5@aZO|d(r<(;PAjPtDJzwy3s-r#dbtWU*q7@(3{xO#{dKiH8;|?xw zikR0F+UDZ<0NQot=}&~PtHc0~$c)Uls#NJwM5sl=j?};1wZD#X4XRAOQbuApk>qpbOIf=&ihWr+z-M zmxF^wPYsP-wS#EssHZjkV~GU})AGupEftHyCog7xbK~>GmBgss^MDUA$!-eIAyiCj zB(G)FdVUI5tlCjkF@O3K)LHR7w;r(YpHrD!uMSiWT~?XC(a*>_VUv>$?4ZQiN~-@* z$>l3F`wBICNbF&O$*OI!iVwn#l2XsLwI?e^ve3l0;BP?wf1x*k_W`R z(!`dfSNImV#ve-x{9x|4g7=-S(EB@c#Yf1OJ?+Taf>1eqtsI<3hX)fLypWrZ;)DBf zoWB08P-uFnaLI@ekY6(}Hjx-83-hqjrCF}$_m9?Zy`PG%`9`FETNe*EJdW@q5CW=X zT!WnH?*>h>d%V^?U85%3QaK|E!Oq)>M*8$ivb6eznZWvGsysD3^dsM|QNADUaO>wg zbDR9T`gM*PLDp#?iPFFRD?^GniJkQCp>LwOpcQvwTT_|DJ|}k$5IATEAlky|`wN0N>%8 zrKMz~5M@(-A=N{)5a7sFTqOi$2tnAT`4pL_{jLE2y6RE5$M~8>z7Gc~!LRJ{0;I-w zEgYQQALbo%VooF6-Ul;OD@UBWvhE};h|(D? z-w{dHq~X0gBp-wuwHMHLpmWIC_!ACl#-GH4BTo#b0})pA8Dhjw>blAvK6L{w3Ryn2 z6jn8PR=}T*4EPg)vI(UHf9edM@*nZ1NTPGk8|I4ZYzeV~h3^oPI=eFYUM1Jt1bm8H zwAdgehQ>0OQ7mojD!_qB2raOwZXU(@v?R-;#E-w6M;X0G#);u#(X-&d@$`cs`fo;D zI{bC&1E^k4g?G_j4buxdrNu>2%T4HK{8%w@c zoz!Ni=O>X=UIYsxG776-J{$6cD)Y1yOW$g%XdrSKG2yUvXT0$BIKL(@A)pXxV(hkf z#q+g~MLqFH>z}dJofV~V2nfb|W~W&FLQ5kH^bsQZo8iWMPkBOAmc>LaT#$`}YCGL8 zf!{^iXs|g9o|kZijDnFa7aQdw5wU+o7#+(y#y8z(??`fIO@XZv2zBmA6~HR@G6_DY zz1|k{7Gx=uZk!7zG#gwy+&3`Kb-6u!9oayiUG5frRYHX@AJtOdyB7Bo`+#eaoh2$@fsM#z3VhJ51GaYurETtm2t|#Y-jh8c+Xz*hu9+A5G64 zW+iX557IZ5DP6Qgh1@KVm?pIHj7ZM)a-HcW;W;|=86&YjM7fLT9x8;%Me7%7B;4C< z%SDG@URqZB9-r5#G#fJTxebCvuU5Nni2Buf`oUr2RY?_BNKaDW=XEqiBeYhm>>JC- z&bC;o-R2F!z`I(Siw~bvI?Okx+SHr?qB*?=&8Y#JW2K2EZyYjJZc3hY6l?NXCCY-9RYOOR zRpx7$qAZb3vZ1ujvJz!M*E;n|a#N5jJk&2JyGQj@mX4PV^RCi$WSTH9qgs08PI3rS zSZ%KK7335g8&CbEw2orBo1_IRk>yg0B`nV-JRBsf%O~{K^ITm z=X;tOU>nwW>9mlnyOeFnQzv$KT94pVq6ySzuI5adkqXXFtK*?$X2E#fx@<@UHzNTM zH$rzF?n69g0ez!gpIlx#q4qt6o!7iXR>KaefZ+N0lfyf($6wJgIeg_SJM+Ljj#qZ< zLMjhCaP7Hr`PaBTsWrSi=IlgEQFMf@84Ci!7c3KM?~h}`;noySn2{%-sE}9EB2U80 zL)FPG)hKGHnK+WSRHdpA&MZFVt3y8;`eMb_@JzA%0ehQbcnFb0KIIlx=gZ2!Y-f1;Len`>BxK z4Be6G4YJ5tzkG{)|}@1~Q(B^6|n~qD1qR9B)PpU7*yFdSn}2Lby-fxNXn8 zPzr;=f2n3)=icnqR6G}M9LWlvz9x^Wb7J)^$bq3m*G}QaVy){~eF|icYkhZ@X!^;r zvXM;o{sHe24p8#FoQU|5nibl}9j$=~^1q5cJxDl7^+|&>HqiRbYfn5T+cZ54>vrk zS@>#ZFvEqOg8fAEZ0P3b#LeM3HOGV^2XsVMt;<`1I}?*H+;|idI`cFBS&(u`nCo^S zTKoW8Ho#g*JUz>V4*7N9#FWKbztrDDFKKw8Z_)XeQleSEa?HDnyUn|cql6R7ns>XP za7;NJn8D%|>yc-@)LC7zqP9U|$+R2>`r>=yhWFW8Rl7kRaK*9oBVtY6@^5Nhh-K=~ zc_An?J;Pg%%peCOSfWk7HvP4Hi)m9b$weo&rfv>tiOd=eJM&r-Ez=`ONN%aORJOXE zW8Sit)yB5O%jYAc^IxAGu&n&m^tkD*@9msi(fZad>Dla8mxMU=^VTk{?|m)Zz-%fB zCDw=SWJ|bWK9~KW2m|(RxitTFgpB!#SVQ0~4-!uy`3|X(GXmVxv ziWZzm7xVDL#oW{K5^pbc#49>#|D}Z~&?4gLhtIhMz$azAVB zgUOZkABMWvjZWVf%G-wRba@nuRQd9`$7+TT-5N`5KGv)ZiI0xuvWR%0hq`dNWbnoq zGM!+2fWp$*N?0Q1zCVx`i~*xJZ-d8Y7X(tYApCWZwu)+gA`uTUCN#G$D7|Q~Ww1ow zWf|4!$z}2MpOtM|{#rZ}&>j$wB>R}8;Z-8HYnzx)TP?=(N9~T&xg%5v2!3L9h8zC^ z0<>w!LR8@5PqLiVFO(wG+dCp>T2j-1GRcEtVeF1;{ZHkk?#QxP(+B^H8s>=*Shgi(TFPMgC zyWY;xXF`c1Xf~mdW@nYr<44I;Vf)K!AC1+|x7ks_ys!P0T9p*s-C7-Z4yDQu{dI<44(6I44xmUJsCXNbO;Qd7!x{@_1n&6l;J=Bh^H+oTD)Smxny(V1D1n3 z8~hcz&+qpiieJ#bB(zNkW?MUg53k%*$QxqX6`v}V?05G^RQp7UeZ;ldQQz+ju1`%qBsA`Grj<0X0I$c|MPsIk{uvsdL>g!oFO(5Ht-Qsj9ca~6&PEN4}G0S znVB#M_c9KA#NCb+TWWt5P1|-vv;tquaN{&_F66b<;9q1?f~Bb1!!@fawYwQ3n9!k6 zT~+#5`l(F58i&c0FW1>Te%0qJebL+y5@_#j{(T^8>oq zR;Nii)rBi!-CLb8`lIVCxlF+XKBT=vzf#)!e_by%9+3xWzZGt*1Uc!?$q*fA!pIPN zlPQsJZ02}w`4dYmW}+d)v-f)gNn+nN3)L>eN)x(-W{|N*6A0)8UfNfqK|JXM5S|q})O?90Q;8Lo`CKRJfG@q0G9*?GCxsi-y7JHr$R|_g# z!p%_P3U^tLxsyt_ocp63JotNCdGNvu5A4eUD)&hh@)zMU%-t_4;oqfP^2Eg`x*dIN zWwMRKZ8Bh>0GbN(F4l{t^GYv@c>&nn{I0iLyn(D|dK4(;{?Y-p3u(dMPNt5Ra7(LH z?-sf$`wL#{yK@{Q{XgnE_kxi*+k|M+L0v5QCMjNruTK9-)*~{wsgnQaal=<&53_-)WQsSXyqW5uUZp;$eJhrlAt0jZUrv~1x@I)})D)gX zR`K*h6Yir!$ycMvMrC73>f{<}-o}&8DH<~(EeJI3s1=B?*926F?PB-z^dW!`1A{yv+$!p^C3?dy6OEuTH*GoqP@w%v#t^V;eQf z!cHA>j7z@tw5mpDuTFl-8Nh%Mb2zzB2*}#=Zg7k9 zCC${rmvLoocdP$lGKZ#0Z<&K{qv@K`VRP%K$hGde9ruid$Vbb>42B6aXax_I&~3JJ zFK)$02aFAgJT2c$yO}#O4>^~Ck+zs_ECJlelT>9X#gf+xV(EvpUdfcuHr(`-^_6+g z#NY>JIbiE^@SX>3UBzj+*24L#+P&f6Gz zUKC6JbYx&t5<=&VR0p)Ic?VASr?Uz|8E$AZ`+nefHLrw1+Bd;lsKi{a+FjoM0~ifm zyeg!h&S?sqd`fJ~wCB80@AI+RHq~LU@nT`cPlupSH}~(17R#}mpZ*QhviwvTMvKIX zN}`MD4y|jB4p3&bn90dSdOUL^kGGe=#PoLlSl)h97Q9_Dfww=74Bmb;mAAi+4c=<4 z{PjiQ-SJ)%Pbdq|(X?RpU~}!NY`V^Fg`#T_c((XcB+CargBl|k4r*VICIBqYn+`yE zk!h2O&H=Umh@~3q063ohM`#+jO+QhfA7*?k{g`FwxOPH$l$0qvp1wCUQ)HCrOo_xh zK5u8snW?K^*KFTdyV0&me-o;%#@nwStS6fObBI|9=gNY6-M=KpepoNdAzGyMrK9$$Zn+E;x|(KJoXzY%OtikkC%0;QCpL^lIay4vms%#!CBzKW9U)=kzwFuT4&+n=&? z^V!p7Whf$C7YWH}hm1PKgZBEHwpv>t(wZZ5>Sv^x-E_Jqsr&74_ase}8r4$nUO99- z+?Jc-JX4aR`eh;QkSe3@wiE0^6G=iHR#30F1^ZhYYhO34aI{XIO@AqU7>WqAH#Uf@A8z9z zS;)f;(%56^=3!cN({*MoM<>x&<(o__0?e}5V#}eu5Jbz{ki+yW?6sD+Ania4USi@1 zSp3LiqZ4;TDq6!c-+{s44{&Vw7i;uX(R#!8qZ5}%UTWP?K+(aw@Y>cNs;r*)dU8oD z@3Ya18}1Ykpdl2gSbD=ZaC_MW>dULFSU&yL%xtQmf0>#5VmQE$i5(6W)MGi%RuH_j8?&55C=-=DV*4}qm99`quzEl6 zhETx<%}dclekmMekup{>_v_On3<7~H2;Bd-R@1fJO?pN0gWA{; zON}h6PCs0BpU9$l7(XJ0>huF;&7>sjEF(2Tl8nVJs2f817xJ`tvJ^_*2u`771i-A= zxA|pGS68%qaRwH`L0W*&R+Uijj!xmbJ>kQ4@Ix-BY8)des}XznwhzwW?pb_CwxTZ|}8U=AD6#RGIp@H;FGtrC}=`llXtF zZq!mL-G@$8eCR#rvwG4ZZxiodvoku9c^lu!0GBc0WIU}-&kT7iEu;I{{dn2KZw)Ed zhuOnzQ{byy0g_?M(3(l2Kty zq{fP+vcs5;CKK)5ED6==d&-a{5q_#U|I{NeA7IqMGA!HRw@-iKPzcEBdB1TyvxvQq z_2Zax?fL31W$bl|(zTug;9Ye&KrP z-5;AE3FIolk6`A+L^hobXeei0l&nP zW~?^bem+M07FHXu)-G3YqE9KZtvi+3L>YbqA>vJUP_<{eSi|R^Wk0+9n<6t_@2t z%}SLx1WCaxHU(45=K0(0%=a463Qh|Nsf=-c7}lqxReCy3fBVx%4h?yFpJ(*`6!!8^ z+qlWI6v;Yor5t4=Lzl8?dLo{810x3r?n>@aEPQd*2ikhRmc#Fft%Wxn$5^04w$vWs z>2|nwI%y2bl|~pJ&a|nCR3|@U9tHCTtW>hXlo2OA9x*{Yrgq7OrwS?&nP}d?BEFlu3%AOQ?TU z#{Tlulk-`5Or94U*O7dbz20TgKCi8q<| z1QQkBZ$)dk88&b+Q{t^Yu_cN}sq_S;{dKF6>t7^cX*-A!u14fhwmvPrqnV3Vp zs{N#P&0Oysu|pv48q~Oxp%kT^^~CIO=|8BH98i<(kL&Qj+(Ceeb?Y7oH7jaYt9Df9 z)rRQId?tO)WQR^TZ&t!*!E8rO-yyA#D$y^?+>ZT>SobiTcYD%~ICPZ&a*?zvV9Sp5Q_JzF!T$>qY?^>_}?Zpl2|qi0F~t|n4_aP0S4RPQFkf-FBW5}CGb z+(MR3=xc)1@*=ltSwCp9-92l+U2Xxt?u7x_lfL1GTQ%&d;ci);KQ|t+^Kn9wqm%#+ zMc6Fhy%W}`Rk?#-RCKjpne6B_qpYT}Z}#J`bM2g1>T1~7aJQ~Y??3&c4nw<%)=cgH z*vmn_2OOwC0idnY#*Fl5KB65hf}9Md&i&1zAeZkTt_y)-Mwj1uB#`|Y;|h4GZATpnw{4651n&1^mhVf3d&KmNyf_j zt~+;?eS0wNsQKr12zFQ?0M5qiz9rc|bE6G+0|1HN?aQ?9K7YT7Ba@dtj5m@NLl^!T zXC=?koa{M2e#X;v$~yWU8DK12#Wxm@#Fv4=O-~!*p4?D~8gO0dG&g^Djp91uTjb2> zS;WK$H%zCr7NTf+`c(I`nS~m~0Xn8Ql1k2;hJlK+WVb$aQplyLL;*lt!xHu5`T}>Y ze<*TS`iEk7sedSO6a2#j_bM*Q6rSQ<&_nwAA#M?1L2Bn`;&(&xw3D?r!A3X>xp=Bu zl`8Z%-NW_^dhDgq)Crl@FZJUakFRLz#Nylz@m|vVohX?-=;A#2iPYAUzV6-O4=&+ihQz+x;+5A#2h| zZESFKr08I5Ml(2s4Co5A5o7x~`F#Bj1Yyz(Nq2{xPapw4DO0?Sr_WG0gvHf#W+=8s z%zk`X;leY@RRyziPwnrCE#RXq|Bnw=q`KVWaHj6kK?DyS0a1(&w>%$1y6?^7MmE!8}{u5_x-d0~%wa*=0mU#9}>sB@ox?z!ja z+$73|@YP~F{c=^)5VvkaM2_(;gjZvqofLwBqtWP?Mgfa;t0knUcGwfy2`ym zc{SKE@3NgtMLi}mVTW*oW$<+gTOH#RE-Kv62}s$Ny33_!TLYBScrOZyK2K4L)gscg zSWvr#ZyE+Qp|&+xLuh*q9<;=hrFFob7arC>vGuAe!gFTkE1Y0YdVi&lQ#uZ&Iq697 zuU>tE((yabN#9B72P=Iq(xH<9L0z$m#aD;>!bE3_HDX1E-L-Wy4RdvMGY#ZCxAzAS zG1K#6IpK<6Oo8P@(7YqnC5Eub9r*T68oXcpnUvZJww5O4m9NR%zCG{*aEY^f7(wPE zZMJFTHS9m_?_=EjlCtoB=s!E#gZjAv z>j!8J84-a@c2ISJ)+vrBBWF$p&;BN^smVs^Vbuhqk^{Z9%@Gyq+H zd`*&GxZyXXGBgA8DhcX1K?tmXtAx{&=~3!Y<5(&_1LLiVU!h9axe<4yCdo(FwFJ$c zPM*kMs@du{xY0oq!z~?|Ub5i@3w=cgSw)qlQ_2Afsd0Uj){MvgYpE}hPYL(ig;XBo z@HvZsJMMK4`P&eOT0#daF(hno2LxG5$&#T5NH(~`5H68vPe}Oj$%A0;0s0YAsA|sa z9_>w3ed=$l>BduNI@4f;Iuh$;W;gV1BXCh@$>We$$ml#v{B9VBQyN>Q?_Tq(Otrug zi_YxAlbs_pI?6U=&;Ls4Vy4 zT^`m7!HT+Zs_dRpHKP8Z$emyhAldD-ULy}5AsUqHe9ONKi6%!ExcBr%@GV{l?X%Ig z=`8@)TY6OIRvR}#ED?_?gnl&Q$ujY9ZD|hF2wK6vQLr+(DVi+H+{dHj+Q=EUYg(rw zir6%BcDI~C){qE-?J7f=co4v%{ z)(M&d>8Oj|#8X$5AZWoK)V0*<1wQT=1he$F#;F^YTB*y55gr5iGll$h6{nc4ogl3$ z0%6hCF_In{2Ut21;^XbP!Nmasgouc*?bgD?J9O~;qO&r z&0ic_?t>N8A7q{Iv%boiKxbyw6!?Ky{;Y~gGaKkNMaVNu#-zF=| zR}IMbGdc!udXc>oA?^K)j!ksido^R0l;?#q5i1D(+g-EXW!lFM@-%!Rl)35F0%QW& z6{QFqXu4PG1osOHno@O>9;6-}K1=Em<^C7_gX{(>R(+dlPLkp>=5)-*KW3}^GySqP zad|5Qh}?cccqjx_YE3a&_Td3JCEp)c4)5L_>fP7(xp3(PS+U3+M2c&DTofizL7yj>RqmTGku1?& zNkTL|dI&S_=mTgKlF>GAod5{-mrd~Wcx4=_Vb{-7r<=k*>BcGT+Dg_QXD#KIO40eT zCe5Y22)N*G5pc~JQRo#0id5AQEqU{ers&1aXx_J zpV53Lk~wn2ZTBEI@YpRk9Qi{n^_$%x0LQGYPHuDi3(nMWrS5C?0O(PeL8SR%M2TJ| zf-zL)rH_r5s+J9|5=T!lykhq~J%RN-Sh|~Jj_^N2_%TL)$|6>nmZ*&K;TwfNVI9;%ZmiL6-M=X(T6xc80*Lu| z*gSoVPwbT77h3Dr_Gc{{=C8!IH+|w9OB_vY@zM#^$xd80sCQ&ERpeGn2!y?XwK!U> z$hySsiPNai_^f`ltcq^-weF&;7#)|md5wxY$f`!a4_E2!+xmqvC(%^*{L}(<4RQ$m zf))!hiYg@gD2>D2u^Mebd?Bcj8#TkEQd)W3&7m4$-Y=4Bo{6l%eaeD9h8r9!egLk! z^kWa{0fJQMxr!$A4K@u1rw7`i9%y|iMXNK)u3;9C7u=IK1yF<=j-VQM7?6m*X1{Oi zcp2exjwW1ATI+xF@1RRayZLTN`|=#p9`^&rzX}lj_!qmg?CaY3#tq%HwAMspxefcP z6r6iu_-oQTcMoMoDy7@r#fjg{sib7_8EGEp8y&4iFUe_iJ;Bp5ga*qsU^D-^U89WY zCSPRbdltr6oYe{3)}6$^nEi=si$gU>L@}NXG`}E|D{&RQlv79)IEv+eAZu!{wGh}h zBF)I;Lc%}p>I2Vdz@y^LpfQL8^?83S0d+dg9*ePXXfiH#mw9liJUAuZZ|htWQQu|6 zgGD;?68@_uZ)Dp)s&D%%K~7G{mSA0@L3~?Y;n0AZ6(Z!&Rp18WU@ZziLB{R^Bk)D; z!my^`^&w=aw+W+YOVt`ZKEWyp<7QMYD`AVPi+DKjjHIoLdK-gIMjqYd%~em`CLZA?Cp zPR*H;dztcG&NXR&Sz95JL{?H``5JY@?Vs($*Md&Wqh#ZnaKm3I!|-y#t=HaVFi-Jq zWdgcWY1G^lW=6Q-pDCIA8?V+3Os=Ivtb_V$5-3K@h0wwc zXDHK%t&-7I$MOk7VfxtzZX3sJj5j0~xRPG|&}W%r_-FEgQB@|+Yc~a!|EdoKE}s|x zoOu_He`-Uq-H#08@mw$-q6ds8N1K?-W*kVS3nhAR3pC!0iB@YrCJYQL30sTC zWQcnN4cNwnrG7sflOZ)R>7TeEqiQX7r_S)hLJjZNe8UFhW*wK8Rk=|QP}Sio!@eIE zf8;Dn!8kw!;>=5F$m(Sr?u$-bPW91>*K6;R6to{cTH=c$9@p_0wj=;3(2)F0s9Id5 zzKEfjP2TN*c)7`i9+gO@X8wOGnmW3a02|TdYc?Y7?uU3v+HEiNBy)5w!dvd_gYXM4 zh6NQ;q=$bgo~dNMD?n|5`!On$X*ZlqOh<6Z>zt1D#NmtT;03kFV+F;Eo z{1k<1qV6)(SxGhOmb<`SYA%j6p93xeGmxqz4*l&}k?iaVLZhttrj!Nqt~sVJ;K>Mp z{)@-Ezc{$}7hc~O?n>UZrf;>T_w+A~QWcMNUZ$yq)GYI$Ai+W_X*5ztxhvncLdmhd zP?7uHd`oCNA)CZ1)<0dp^&a4_+0{<)gd1<> zMc@o0e}uQ)w_1`Pxl?Nb^N1mL7EeFPWN?c+Ohs7GA*AoNPs= z`Xb*`kz7OG?^I;86`A6T?5!d!g`i6QMoLQu_ciRnlE%3KYOa1UB0Tr0?hrM0`gd@e^KSO!BiM?zE$ zG$6a=Z~0G;FPjalCj{O04jS!^OV`J?VQvYrQTr0M1`{I2YUooTGE#JOns>lwEr9 z2j!v|b@yT*xvI?XA#uN3;C5vAZpXVji|@Djs1LsH*-7{gH{3&(JN?g|8L?n_$x{R+ z)Xu%rK)%71TZ!&b`H?d3_L&#C!NKR*Q8`7q(|zt}x9Pzwr}HCPuH1`!?zjDz)iRD7 zTpBYGBYs4$(eQE{*H&m8@4dCpIPP*@_c)$Fe|vo?{`F<|Q;d31{R%hu$#)g(b5qSl z8l$9#>#AU2tCd#k(=N;oEK)$bo8S|_FEv+RAE?BWeBv?c&Hi%@bwf=CY#ZhK5sdSi zTl$RisB<;Wt9&n?Qf}@zmy+A#MbfkX*=xMJIFgkeZ@ganj`zd;ZGK(ne(r^m)`w0Hrd3xj78b2fj^=|tw`i$Qsa#de2PkZ=N&wMR$C#>xm zKb^>sg{aqkF(2gl8G8_NnJFT|{?cF?@2O^pCC8j8#N~@_a>h^%5DFnpZFyKxs)k)iq9<- zuv}fUugFFBX+bXE0Y@d>Y#6yV(o8fKVf4>8_o0_P#&^@piEkRc^n94ZzngU?zHMI5 zdN9b>cdqKwI+k4l=Z~Y@U%#AR?D4F}TC;s4nyFjwQ~sziw^bnAaGjpXtF%6PY-Xu% zqB0Kkov+PO-^oh+nopcSqVb^$CFc3WlSpLo-$XPY5;xvvwE11(tc6_$aCV4iFQZMa z?OsQ&P4}VC^=FAbF@6b~=PNgtzbqv8i}=fbbRSM9=m(I#_u-Ub7|^BwYeE$WV!t!` z|KUCy^Q%j2oMKVz+g<-hJ@W4d;X3zM)+0&0>n1NX%uEef`1ggaM{c#W^RlC19Qtmb zc%o4I6RT0uhV9`!@@Gz3Cl*c#JWjImes-PSXJ#M#-gsutI=wyB2fvfZwekDMw%|^l zd%d3WAKW)ItA;C7}V}QU2XYU)j{XxS`pZkW2y8HI; zZvOV4&`)PzTj@(bQ#rTz-=m-2{ag6=Uj5q%dtFZd=KSf4`d0={%&w4gpVEKQzwuu( zezRWtKi9vvAMVw^MZL%Gl?T44e`CQ(-~QoGjLoT}dy^w@O45Xr5PZJByX)&(jIcp( zaL097yZEeOl+LRe8EKZA$J{z*DU23-nR&aU2ko2Weuz^}V^VmJ0`1WCxFq-RZ@cW( zK%jPr(Y0;02JTmjW3#tcxR-tEEoyfB&b3LA&Di>3+;#GTkH;~&ep>zr46~P`$kk07 zz|+M%#qqCM4oqyf*z{!TyPsQC{xqXjt3x>Ut<};l=A`;4kr(V-3XAiET*yuhK9qqY zntrr&ohr`v6}zK@Od^3I6M++fCe+MYt&4_XZbpRu|F zth~HMSP3_z$yBEd>FN~u>eORFzV6Rar_N;iT;+9pUNqfMTBionXOxz*v0@)-y_Pl0 z9U6delu81^FhDq%XC6yKHOEKs@{t6cCkueDr*2qY%|Vf7ELNep(gL&k{LmR#07L<9 z+*s7a{?>F&sY%U?-uLit1z&a7l^)0?G3`8R7^gkJV7+QDct1o}IJsJBQCHN@kbd*< z;+pM!j>sw|$u<5)a>pWfz5PDpYVCKi`w_n!9(R}6uXen!fUX86+q!+x9=gJ_=i`rs zJ8HrFaN`rCMYXr=R?&xVm(`oyzTa`!iti56oMC2SZRd{4S}{wrYQw4 zwoSE%W+W+iIkMZi_}Vt6BAXG@C=qUGRBLp4YTd9<%^HrRj=K69J2#GAuZ1){=!t7- zy<$o2jgjU*s)h8R6^*Pl9?>4XohQpY)j(B#SCH|p!d*$5X(Q~n%N@h7d|eLLuXfZ* zdB{wK3kK_)wtuu>+pfwuqECui*j%ABQFnsflXmw8&?{#=G*6Tp+pWQ%X09u@jPZUn zI@%zFXrc*ALbu0>VF$z8*SG?sd6%lTS!r zc!y`r=3cIZ=Y?sivZZo z%qElYDhd3IhXDA=V_KANYHN%%9|LkSudzZ$nuW``R{&&|X?{|lWt!hQiBd06D#tpF zeWSW}EJ?m>s}-uVR)o>>)T5f+ZNRi7Jo2&< zYA=X1zpQG~gMLcWbL$Nj&sXmGzUc_{3)N1}YVGYB%lucP^;Mu38?*nReZ{p9Hm`KQ z(%4|-VjE(Ud*UgBBPnk5^p8Y}!*wsmXzi_IaRGaBA{T zv9y|9Os~ugq^?{tP{WbtPiO`jIdeKbmh2zSuZ;>+%DRv29dcPZL zq9E(C60Dz$gxz-bM2FGWxUM}>zru57so`k)VKuC!d*64IU3-YG_qH&Fk>*Q)zn9=L z^@i*m{LP7coLC5_52V!vk>;~iybg3^r);FV_!SiIbvjh@HCLY2NdvArH#?6e{N2A+I^{W$(aW^z>^UplOlQmP>stO(coi7-W+?WDT=bj(yUy>`awU%FaPw)>@{br)a9O zbuApdM=&R~FrQ3Kxt-O~#((?7he$+zcT47`z>HpS=~J2pEVbz9MG#`hT6_b!`b-;U zY!U8ah@3h>=dR~xe%TSM3+HDJVGE>3|BZ~RPPSGj7ele~5!r#gKlwZ-xE0`!C%f@J7*;MVQqqIo_fo(LO%!6dZL!578v`k% z$|_c)2&uMnIq}k?p?C9Ni!=xn<(mQnoo!d+D0r-Bc30eK+-kTBB!JvBEgB_WdQ>{; zBrTvgUbbQU@p~3Em_FC=1v{o=E*4$lKd9X%KJa@15;@qlw|+#LpJ7h+;=4CtABd@y5ffIJMbLe9oxs!ftWu5Wve_N8PD{k_KO+K{LBx3K1kZ zk`?sa9LQB|*YJ6+T(t+Ew>=$CKUpe-1nU5z!45aY!_uf8T+R#!qlW6K-_7kDLdR+pEprbRhQd+p_M$dGIjdC@zg$Es)`3v)yjBsZKb3t>WnA%Ep>^%3s{AD zV_&UXvg&ffP2}0Pv@(#crf2!G$yW;M6v$WpU|Ya)4KHIoIHT~6u6x|r1M3tZOT04B z2k1q9`Ai0rv7pa=_$V$q)C_?wH)`WL5VLg5Lh0RN7QF!aweFdR0bXL(B`_ti#Jzsw zk$k4HKG>B8K4ghCkf}V^T;!MAx-y+6LP@&HEXkFoHrDoGFMFOqks4Ju=N8Yg{+<=4 zob{8lWY&0>yYp_}_?Q5gCjZ{3d+amiB<9W!f3RBeQ{&2Tleb53(*sO&JA5>|PU%dw zpTECGowNn3rpCQUtY@q)Ivsh6`_}ncnWE-_UFN-sO7jJG8gEFr3HuLYUAtgMgUo`K%tlYzPO_qgb`MrDM z*g)PhsRX|zHPH4*HlHzyH1CFR9q=k3F9&k3Kwfy9=9lNm-F$p+6_%!$m7nvv%O64c z%+Exi-Rm>;XQq&nZ7<8uZPiEA>#9M&n!pQps_2Mc*^ovJ?Ky1P#_3!1gWit5vd=jEa5(7+ zg6Fj4d;zg~`N!BwR!hsmGJ}xlu#ei5X>A+a!M6~<6b#8i5}mKga;xe=j^Kd)BTwd2 z)-Zw{en);hJmy^u`H>(co<98SA4EgM_w734ec)Pzlih+MuBZ_7sk%;xEqQteXMZ{g zdvOghD><~R+I)lfmzcf5{8W)W6x~Lr9`2-sD?d6v#3X-^A5#H-D#G;!((k4@qMGO| z3eT8Cq887hx%=}CceCF66T8}&dqx%FXtO0tN?XOdCh0z$RUXkq+3?L{t-^NO?Q{1Y zq48SmhTkp&!RE^Jv?BN7OqxMp$6t~_F9<{$YWa}DqoD|d9*$jYIF%!D3UGYZ4@2&u zf2-WW63N?tS0^qXFY;dG9$lzvcM$Pg+YSp{!=v3A&*OB^PF25ObE+hRxXxFfsD)}2 zVS8m8G3Q8G5{yl{@%`;g085B5O&lkc=YDsVKM3(VzUZb0v;$ysRh-_O$Lm=4E zm19M+`KNMAyUYDeud)1a zL#ZXvZ}i!7tyJT_BxMHjuZMuWJGl3FX%{^U-;`GW(3;+qATs6a0-zR)Cwfqq8~QavqZ*J)Vy=ukGBkI0 zzJyHQ1}Q4M&AzQ!sJn`$@&%--@o!n6 zo~bN7CDc?|dJ-YwT3ZSx)4yu>bg{>$4q0L228=g;?7^tDnz40}V`ODC)#c6)(k*}x z)2uqHIlIw8&d&BlFW`p+S=yV@+&szrX{`^N+^#{U_NJl;N|OJqgW~@{Im8tPB_5&# z-H7Lzp1Ro>3jH=wUy@@7U&_;)6`uJYO-GRxsDjfWx`?DTldtD8Jty9R1I0^+X=1Sj zVOxvvM)a>+Qf!a~!}zb*=5uXp zX*`zq67fnIb;LJ3U#!2N60~2Zffj&wP+WJElde1k#bW?v6(#iv9?}5YZJv?^X=et9j z)o+}}dP>BUtTLq;H$eeDhQ(9U@b@0i3&YHW77dk%Qqd;hbHo+yT4h0sIS)lE z2#u7MIJS4?j}!hrTwDL&4nIu2p;K znWZC*|5;TU-0>V?vqsdLVpU!RoWKM&xLLpok7x8pPKXn@c4SIyb*9L`B7vwPrZa|I*e<2$MWpN2 zI#IN}2p#~8>O*Q<5$Rf`qGk3@5sz(41v>kN4$LmCGYBEqc=8osrizlF3J?Vy!8c#w ztL_Xsn8{|aCZ8ea5n6OVl0i~!TjrZC?a2xZlfXJ3Pv2EK3uMJMzf1@18%E6yuptDo z0X1;XhRqpU zKFhRA{5#Lxq@u~!4G@mq8O3jY-GvPhV1-OodrGlgQu{)l%a}i1t77SEpoR~9Kb zyKRyfoDDXOd6-!`foa2omk4;ctF(@kSaQa4sDdE)GiLeUU)&d;Os`TW}J_} zXkg*V&Z$gI={isDNT7z zMKJld)pES~p?5%RQ zsoW@@vqt=H_;UAnIg-sYDY@r~^kEI|@*8!gORw~U1GFuf(JWd$5_V)<71s!z#f{e^ z0Z!Uturi^MAZaU}Ua`@t%!BYmcWsjnw?xt>?i|fqj*HM9jE5w&PDR{FyrCf+;fG^| zo^b~n&-ZLayr)+p(aA7q+9hLSqfjYWId3&M)b(iT1PaHQK>oL(bebCHeJa1M{o}5# zvoDZt_5_us8ih}dQwhJE{fbY_R3|gB*0&fU+jxSrF%`B}r%M^Gb*8t3=MeH;<2668 zi48s*uPX3L2oW1FW)thGO-8pfx2Rq=XC~li}0KxqE1q8 zOJ1aju)-X6f9+XlXBUzn>`&h?<{@ z8x@&Dnn{xFu3|bzjzOLU1zFuCX;=bku%dfLzRBH&1GNTzh_~Vg3?8nfr7NDqqWTj` zco1QOTST_>x4mm@(fDTi7dl7gXRzLjV9_H3dfoNnKJcW|0Z^D&OSpB}=Idq~`Dx?T5VB69UqkAU=j_ zo9RL{i5G`a?H^z$BYsP_YQ7t3{-uU5Jt!u~ZlqXtCM_ST9?)%l+pF6nk-6JjWCxsJ z)+9=$pVEZUT|f6wTK7y$(7&nS-Qn(*0=wbYJ=iGAL9kpTTc4>Mc;PPYG1GZ#3z^`* zFnm2;LfL3~uZ;lZWh-}!m8tnxk2v%TQrz4ydk}EZ*CNezd=ohf#miF}q+lb+k1N$S z8-|R`;hOHb^WE^3Jto2w7qXV9@zi&X`AVO%B?M}B?|XH<(VXOwFp~@2Ip4~n@~Cc9 z?zpfIDjSDTA=ma%Z*LvicZy|&8?FQgfiOpEj8s>%o3I#9p9By35X6;$MUPMl`uBGIxHarY z36XR?a|rcx+bRFV@CPpQ7!IJPEf-|%DKid6^4~5(Mc)69=yRt7KOd>h-S;hcBp92}`fIdGQZ-~#K&vsJW_Xl;;XA9qa z34Jzf`LEDtHI`9r!sO8B-2JntggygQUT}UNRKD}={}c52bp7Y(bD&!`E}+iyqyYV8t!G&HooSD?}{jAOT89CO@|L{H{?U#j;`Lo_bdFi=*pzJvC|HS-RHvJ3c&&y|i$^3Z^po01HcPo?2-~UF6``#}9 z$^5BQaQiRk?-mmI3&-=<`(`o4cy98TI^mo?n0n@0Upk(@Cama}j^{T&ksRH3Ji9k* zv>##7k?=W;CSPPnqJE>y2hmgv1rLjZx#pazl;kQd%ZR6cQtTeAqQTTrT9!}<7P)i0 zow>1}!A_*1^mz(BC%qEo$~}wzVG^RI3SwOeGOFYWk=)~wo0)s=YsdRSCd)|h(H7-# z(X=W3NJE<=U2KXWXTHw|3VlG7aI807)2}(6is}~%=q$wsaRaPS#m7W;wvMo@vK0W# zsL06U8{ECurMlW4k2GJS8qi7-U94$J_ z`hU2@XsOSsv8T{D{`p$JIE3KJpd)95%Pkn{(*#OYu2f5*h;Wvm=3izVfD`=;R zy%Oi@i^Rq$u~fu5_iZ|75BpNn6tgY8hnXPQCg@t{Np4S&Ds41PVTBg#NM-@lJ@`<>aWy*|KP}+K4VUwoK&Z(e z$9*Z6vK+e62`g}u*`Omy!fyG?FMgB5zJvWottViRc!Mlzfp5>$K4;HM7h82@vDDEh zn(gk4bL_puwy2db+9!l%2dIhf$F}f1cmV zXF0EEGtUgL@9zKoy?$i!JWp3wS65e8S65eeOGSV|#$u!gW}$Ob3?Q=h6PC6*S_v%5ybqX@qD( zld?9#2_qzH8&K1jxIj}LP(PJvxNO1|+?Z2hl=s0SLl?4SiYl`q?5CZiPYybb4FC-e z-P0F>1Gm?1#rP1K>x=;8r7Ju%DNF}8z|?yfzqAaRTm3N)!QivYY?7bVqdF{UASIE4 zzIKGP&!5a-i8{4de~@zu5boGXOJpgwKCR5v66QQFqVg%-JTrzR$>$AF`=)$;2Ab?6 z9j-_QEQkZXCWEhC4EvWp&%iX<_MxuUc@%fvFLWCiJ30QW5UNYN+ak4lXp%^6f<&MW zR)C_Z$8gaAvxju0aWYPwx(fRoAjSVAu(%2+C6;_(e3xhdb4UIbP&CHeqFXYZ{eT#* z#1k-JG7Z0r$$2;>_NxzYP#O|&Mk6dGb36x?lQor(L*r>5tGaZSkoO{U*fr<1DafS96E7}9 zi;s29aK3Q-oT6bD@yMZq&!+XlNY~n1uy)$H@sSQPh?9!Y0C9LvtCS@W9)x~WdyPTM zQAQ#Bo13TK=4fqr?i=%5DP)J4!!?3TwSZGraPgS^vrW*o;kH7Dgv*Qm!2gH)uY*&C zH3KCYBi^Jxs@)Muu;j4MaB0E|Z8^N*@}#EmLCI1`HUT3TJ>C&rv!X&v!Y=jOFu}T* zfFJ6jUo{8NrV|qat>Usm{^|2Y&$`$?UzBs4U41f~cPYekjH{r%aJZzjW!bDWR{)H= zP?|kHUSi?SX+UWB-lc}XH}!_6=`;T0@{x4Ef-^JebEpoPKSkO{8dvW&s+Cc&d3%${fD_FYf09?4N0c3C*XzCGe3~(*0V7W~vGF{NL z#nENawz<^#m_23#KeWNK%m_IcIV!duTu8D%^nR%DQ8N&{H&!$n)60a>WFX{UdIJ`~ zWaH;il<8qaf-k&3e;dy8OvC+If4GBxbT{Vn-1j1MG#*psO+_|O7{jJF(wiJ^uWlSq zB4geIo6uX0xg7t!DXX|FfP1wAxR>CM?o;13PtV@&1HlY~$hNbeDcN^>4{Y`pEH~!L zyhLZmCX_or@&=E>%q}BRMrc9ihuuYYsN82V!M!>y2S@hRc7y)Fxl>gczSJu--MD}w za)B9h4gIxC{do{Zcn}1PfjoDlaqwXGsT<`ondl`rIdfn}?RvSSQXNEtn7A`xTu3_; z0S|Hlubr1{p+9z1yq9tepEc3-;fQrkPdw4#_U@Z`*2W^2E5fM@7BVrM_D>^=BWBR%ED?%=-Fj23mD(9ItBP zL4V^a9QFO~)};FK0yFlLgL8C!88(E&|7!omaRw*z_c$MxQ1cw?l)utue>yq< z$8mIJ*;yd9&QjL_k*>87+J`hqExxyPgcT1!Qb>9={#NZwD z7gQC2#Gy1aoe%Xk{xux+Z^uIo$sr$llM&)lpAQxrFTQBvuEF&KY-e2l6gb-(d5_8n z{kFL{_P?5fN=JrgKn$B>;Q%tYkm>miHpCJ@Fhwi3BH^jgsz|Oc2uDm2I_CZ}2VcXt zB=Pk{j<4YBQ)Qa3zw3T+g8db})_>dywZSQgW^GUzjJ`87V%)Zf7_I>qupLSn{?!9Iv!4vlhp1>a`Ljn1UP}bJbaJMBHZyE zXOR(F$le+KcariFApX6i+-f!7@gzmhs~mjqdXvp}Jx+P)+XdeXK_um5r0DGgIkEKv zG;mDP)`rtWs0icgrSzSiZm#OxS#v;2L+5Fy;~Fs$p!6rN9tcgJ zhS#>$0D%(m8lL5e`41wJx>{LzGtHbgAt&MuHo{Cya8Ob|%mXT0-|!NupR(rcYJkrd zXc*e*4>ok3b#|~}tnt7skQ}UY2OH9i`G@*FMC18F9|#$nwgk}|@Kpj|o7uqm`&A~T z&~x-_W}$#GRyf!&Yj!g=a3q}9J7oSDO~05`(IACjZF)Pr*RHeWE&ad%yuWAVKiGfT zNHC^}%QbB%ihsXJcUSfHQ>u3v&}7T-(zM186#E()7N?;&Z=^NM>gJr$HdlGKqho-e zQzNc38)hRhHT?-}8jpmU`RT)`Pz)|M<51kRp$ws9mC@6 zxPOdSH-%FlymE=7e9-e;()*i9@0}k!+qD9L2=B69?h(jwc0Y6$hH1I=22)I)7!^b# z{wmBU{Dx<{ySgsRJ?BS?ofdmz{+sCQFi%Yhe&$MY=G=`CzD9w3cd)+mtSR_~P^Ms+ z+Z`RaEO-!7IjN6G<(h%Q-?<`{LPxNEmhr$;L3u!}zKW`%8e?*45jSRLdcud6Wu zJ&(3cM};sa((y?z->E}LGHOpH9$ds}64V+5`6JCYa$tXtVLYMEz>Yh1!^#tmEuBv3 zi?;o(i0gB^)QvzBJUDH3dq_HBHJy%7Yd*B}B4kn9KpK`Be9$dZytuGz?ytZqR&0z9 z!I~5e_jVjEAaI*4xHSoIkvLqbx1h$DPZyEkBY)%g#tPhWmOGWxiKd)5&bt(1Eg}9Q zSY2@kT3>w0-yGfwztZZoyo(Cf-nq~03}qmn8-LI=#sk+w?Zp_=Z}nrI1;D)$Twcrb zgnx;%`)`G0_qWP@2OH&!*kY%>>W{W)%yeWge~LJZ1t(;>#U0cWKbrU<7X7E);MR8) zPP-aH_jGD^wAL@^125u<8X&LwI|F^;(9akaB53l1P#jG^l$yc1&r_K+%&8wdkqq~o z@2DdDsV(jv1r^a=N`-#}8-8LZ$&2>SfsPrUqyKYErF`Ihbr0wZJtoTgh5ex~IIJ*T zq)iUNf^a;Jl>92;1n1y|lOqkWuXO$LH_L&_72?o~&B8}L&P(7{Y@+?1us;o*2~#1q zKl~HuZ{a`SI>pjw^&a#sQR(K8atmk1v`NzaLn*~QHwKS33iJRIJI}fjzvxx#fCW)` zx>t4XExl?!G!b;Y?p2x|0Ha^=yigB<6DJOrepQ=e>ksVrC)U~ji1*|#uFxGv_9FB| zPU$>9QFy9wgCMS6yC)or{ftJ&c?o;C`H^x}-?y6_ zBUb(?66op9gnua7b_BASLIjt#R$BWp(lPEWBgQ^MxeFfcZ_IxI%yR2N!$Oar`2C307Ja0DigJg@nXFEDy^QXagC9@hF4>X zwmR*CiwZu3dYXi9;%2S=95>xy%h{$%PPb~;a{lK$->4EMgBQbOCd@}H?jU|}vSr2^ zA<>%{EAklV{s!{Ls_|p|%i9L~Dl*_aXf7958faTzWGRhS?l;Hbzi?>bAy>^A3&zpC z1y6Y{OMo#vnTwSY6>@udjt@* z!D2B3RN0x^j_uP8=dwrzzAeeGQv1YP^{qN}7)wQovh2882x!>I;AG=|#x=tq@cAUx zlIzMwNOqq`=CN>hpLsO5jSxE?cG3jDH)x5b75buStNoE&Po#vN7^D0k_)8wZo7Nnl zX#4Y)bv_@m+F+Fbf;4UBAE$1C%boSgKf>njSNDD=SFEFm0rah7UUNA{D0BH+&ub>* z4i=gJf_~cf9%N#)C79socv??6@H7=X;_B3Ra!owhCZ2Yn8B39|miVi0Zun7QO_p`9wca?Q+c*EKYxpCZo7RLWXgF9Cr#qXbY)IyrHVVg+^EG z#W1@15s}(;7$Q=;KAuyCJVw`NB_h@6`by4I@~+RlGP=H>Q-ybL)I19hs*19ak-?9^ zoQbgeoNP)CnOG|i*MIrvWrhvpx5co%bH+2ACBXnDf6#r zm!cOJ6a9H97`_tLL9$U4<%IYw{|wyi+SmT}Z7c*wl|V^w9Ep^Rm!q7592jDc_Y`87 zc&l9d2eeBm9WM(q3r5>heN(@s>fEUA=?I<=3#vYXs&pxaPKo=2RHOd~KVShyjewwE zxB}l+@=roJfkkCw+to9pxriF)x1-;;q9&9Y1Rj%qk@thHZ!W6Fe$kcvqRcT_N566k zBl-QmeW$;{Tt5R}XTt^ED}Nix@kOweE81ox7gXTo-bjb8x@?rixVW3ySAgiTX;^20 zz;#EuwSsmAo{vMXdjwqW&{^i1NtUX;g}O?&<0P=QDDqD>q&xD2==_3j5XOLaeN))Q z*HM*FE)i5pC?p4)@*%i7)7|x(%c40`ebqa$A7+YK{9t+!1MZU!=V+Iw36uTVN2j)p0o%Z$xy8uSJ_hJ-17|JeCqgelSN_h4sW# zSSMU?#sJD?seTe@#gL5LVrDAAy4Gim*jLjbe+(OgxWT)O5Ppg8KseWR(gP5KFa%M5 zCd> zgPn2+gGr*Eo^v^2*%ARg4n4)|CD8vCjo0$XITY7d7GU2G{;EQFO=MBUA)+#qyN)el z9-Lq;Ou`X8h;C*h^b5O7@StJLzv0}68h}UL%&rWDEXli(oWIA% zEOH6gHGOvE4_4Bat0mW1LaAE=4I#oCPA%pl8&@Urxl!q941fOUWazg8YCoG%w?Hci zxW^`+8nu0>{tEWHVb0(VAvrA~3x`8s9SiminE!__Qj{Tg$}{MmJ8jr_dKj&dQB<@6 z8paw85n2Sg*;Mf_v72DbCa)i)Kml892z($K;k55`3$z1=s1bIe1!|vWzmJ_E7=ZVu zjAdEijk@48Fbr+i#9QM6|5;)N{Ozdz5UP0f^hw0Qb5M$~x`7+6aQwwngu`P?2H) zE?{OnyPcvg8vXcKWo$}0GWsnvLZw&mtXv-%jH`V7QT(r^?263hPtn@EP(q#EU1 zO_8NJkv|H0T0s#q@sv7HL6%Ft{&?5e8#ZFcy-|KXKFFZY_KW9hFZpzhm&t8sl3q#T zQS~D|Q1zSfY*l?Qyx{f<2jn2OA5CVD*Y3*4b-oqMH`S4^HSz)aLqf;(wIwa><5dha zlOWX)@}krP_cG)W{Q;MiYN2cmNt({~Yf9lM`%mD@2*oUMId)Jpt^!i!>>?HDdcVtw z9uCPqM#Kh4x093NZp#c0;I)H{6d@nO2c77~RSc&CWoz(gAaLgFlY>Va2gU`Db}a2W zDmJB?=*Kxn7eN9`vqr_b6morIRO}jT(~tAZU3r)lh_)De0r*>nXRBS_f{!}($+97!_3bp3&feD8+IaMmT4)P+Q;c109}z( zANCUKy`?zlWEYP=O=}ohi0Q_?G$Ld$bcGomrRZ^FzE zPxOiMkJI^wGXHDG%ot`{?IY$G^&;Rz_#NCeA>LDw&u ziB(9{!R$u)JA9`1)I4Jxd#ip{vjq@WlSVs*PQ}UE2$jSkHCU)I-W|{a_xtMe*OB^T z2OK_ZeJhX(cDmx?f$?v}`rE8i9B_B&Z@Yon&RdRe?#f9ZCPDqR1hcgI>-ZBa{%+3k zn|q+F4O7&RT48>54%k~q7dcMLvvq-aI+{nOzJXKe%85=%<7{Z>#d?1MFZHGz$%$qM zd|386$2@eN=MUj%={yWF^slG~VITN(2nC#S*tK4-PDkL1){K$DEJ%P6`Vx?O2ear# zd@8>UCEx{Qs!2d0D^v0MU`iecI_UD7biItRBzCh9R|cFibq{f2+yR?y!Y(ANUeE$F zX*0&Q;gj?)PWeNpC+1WAblvHPkEKc(8vg-&aNw^p;YJdU7~PdYAcx5?v1^jaP`Vo+ z?SRTOy91o>WV2J4cB1I5GUT@PmJY;eaRyMSKOwuRw;a}_j1LL@0a!|8#g5XtNj6d$ zA#KKB77B4!uRNlA3CCAU))k&*J9<29{b#k%%+2|a-lo8@%j_{z&BWLE3GUKDtCy&2 z_3kZnk@K$4(p?0H=iI~N!;5qmq1+&KMLUYQ`K_^t{(0T|u#1@ATI+8k+dJUS(%)); z*@nAFy2y*bn$SgR&$hbAA-HO5b4|O0M|=t%Etrf;SUP7`9vP>7aS_74YarU|=*utNk^!}U*uQy1yFJx{nZ zkmjzG9gfi!kDQex*H6HO94io1Ar@;*D@DG0|6BR4AvDeh1xj@#(40uV9jZQ;k%|jA zSb8Ik==jf)Q%$kY7eSFc2T=mrGgTAVJZ4+?f=2>Ih-V?sIYQtAGG;1Sr-9Yk=L z1Tx+~6E)+!*zA9TO)Z6onJu{$ZzB(!JQO8Ps*mh zlkSR@LKtBmJEWnIGsgv|iZnFl7E3Jv*an2?ZODWy-RScxz`8$?MtA{cLWhB8Diwrs zaS>Y4+zjMH7Rz8PXY=G?T zDs3Yn1>hrHwEA11XZ{*qX2#Hwfii}cVy86@1;C+aKkLEVz>1xAnA#SPFZf4V=_zqI z%COo6nTzqB?r{}JZ(Ld#PY*zL6!wxf#PTHFU74>Xaa$KiqE>slu_!TDX{BjM4 z!3CE@@L(X&v!BeCM+FZy=Dl@SYdi~yXAVlS`~r^xk65*w`?^%0Ga&fkpGUz2h`oM4 z+pG-0E|oeo{(VG!hBa?j>$=Ck_kSV5cO&DQj={1H*u^9fXEJdwE&ZEjABXY2jhlm^ z70{H1_X}^B=geW<0rT6&rHHrPrPB6OjAbwKJz9*F`wF>h;&yL@&# z#XN;OD0^ld5`msAmt#a*L^>z&;X!!AO=bQ9@*kVGj3m;#{NkJGuG&w`_00cZKU)Ul zLLtJ*``HRvOo9mi_xstPb>Z>4n$z&#my$x;(W>`R?o$8gFFVa}PpI|_!|$ps7ju}S zUo&tq_MTBuMlY1TXZA&y3-Q)}R#6{_nS=~&=7 z7t1Pack_&OGxTKznhocw@4=k>1p8sQo{pd~*;b1It|0)ecoYgpJqY7L3#49*KqnwA zk6k9mREOAQFjEm8(-0eav9R?f+jG#*;%iUKs|vmjG!3p^f09$>arc56tc{f3){Y(7 zd>QBOzSENUd-z*2r%ug9f#9?I1L%bYm3BNV&{zKvzo)?g=H&PM(`|mgf{{Fl--~hR z|NjBMyP%}w@O#K<$LIHszW)usSM{{{{UukKvFqyu{0??X;`hDZXnwcu=j8W8$HVfU z^1BIrTzchA%Qub?Gv&K4@FwxQLw)N1g?zt-!TC7+ehi0(ab}k+-&6YhH~b#n!{+y` zT;)D7zfbO%#P3tS*8F}N1;*t&=XhAiZ@m`}h9W0K=)M!h!vQ-Iy$xRF@$d*D^0OSh zby*&M)R9J(Z!B~MFbkb{~no{sg7_FJ2Ep%{VJ>3SknBWz6qUgAr^d$|4b`>EJ8K`Hoa5N8=Rhr zdByvHMj={iR=KQN=$%#Abz6iG09T|ao2Al?oK5L#skTY^MX;5*q6|Xx=au?1Oj!?i z*}|@o0T!ndVwJNsB#I7iy@pvvI(=pYkY>bL$jzrL)e%o%iAqDI+?Cp^)xzk2hS)E2 zcHKl{uk`N7plou7 zOMJn@_*TA=76NXUSnfg45{P#<>@el8vI;<$Db2`2zrG32mR)cOXtI5^pnbiD8%nr4 z9dM@ru6C={Uhc}38m=4R9FAc1>*tC1)@Zm?!p(5tTMM|_c@{p_^&GRVUC`3Gu0Wfb zLD^g!kcAq{zClu+tMmtP<2XunSAMRGdAvQQxs#kEnEW;QiH)6naGe_ zzry3zkJDYwpWC5+4>(buxPIanVErX(@!42uA7 zLjA6Ym%({%B`zQ)W5*KCS-*1<;F9Zim9Age|6IS08hiw{5SRU zTKzBkcM5Aw-?HOR*R;8*S9 zIFsaaI9F9UrWm0E;2C>@*g8gtUSD*GF&J5X*XzqrJ(E#&BlIznB15yIgR6qyEekZC zbC~29<&<0=Ll;|`%DiDLVTYIJSCwy`HA86SCbB!k9w8F0*+z=f3cQFNd0yb_)I`|E z@KzzJZ3Zl`pVd;>C4@bVb&1T#Qn$la@G_R>Hk{=Wlg%V{VI`9RdOuyLoX$K0NGTQK zhsY_19xef?`7m%$IUYrI79QP|!&pMJMcdX%t@hPs0_wW~fdl<+qK2$(1xTmo?ky*z zZ6CNRuhH=D5#HI(a{-Tdlu;-ic(K->1fykW98@PcYl@`(D-?ulMd zz-gt|(MQ0Wqcy@rchbztX$XX-0{u@P7GI?r%b3A@t)A=6Z zoqU*kTzKp=tdMad(g)3$q3*$`?X6*d;(-hqvB}chg%EMXCaQ~>3KxZTT(#m!Wny}w zin5^Pu6$FM-jAhowa=2CG?Wfm>r7dTQ>*P^=Xf~Y)HhgQ{vX<-N|&^yCEDZp4Yn*e zu%EC!##7*WVZh+I=cU(LO;QGWttMeqmo&*#N0W%0tXxOB+NZs`l~IH+9QC{(H^|^ zDc&5cUwl6gd#a8iFhZ-y8eAn783Emm_^5y4-5(i)qxmn9b3&#UgQHXYk!e^xsDbNF zz4K%$bl2sQO+s|9g;&4`J;8jqUKDqTe*XfFO<&~0mdd%5e;k0rr6JBLaOZ02&1&xR zNFTeA`h0qUb|hNi>H2U6o`Hw^H;1r{Xp3g7VJV(1iF@#4OC~ITDKY@w1DM+NmOZVS z>0)aCqWc@?CSIWoe3hoJeV^@NpX>QdbCh$VqnvZ3oZ3gs{%Y>b4IfdRA4dhWmjv{4 zokZc#D#o-u|Lq9A3LBC@v)P&HK9Yx^!R*_LrVq_nGuK;@HZdvMrP-#6?>ad ziRXe6mne%6pX4;DWhlj^Hvb9$;6-fLfLy5w&m$3S5pQwE`yCZ{Al^sitR6M~BV#qqrXqL=tV;>(iyn-mnRPlY{Je=@B0QUniPmK$zmjfd7>7Ui5?*$1%> zXomj0b)D6A&bgknLwGN?wk;;=B^)l6c0^rc`+t!k%%kfM{$!{vkAnMVK%0X> zcHqa&7$Eyrd=%WP)OAePZr+}kHNqyis{E=Vbf*4cvOGDJ(6SsDt4C?h=7uM@FWO>D2K0b4-nYvd z(dYJ=+mLjR#-b>SaJ}cni+qqi(kS_br81n62^YKi4wQkPB5`OnBSf#5Gzuj%mL2T50#9_xj*%>&!GcEWW}5I+2wR6Ty`{PFg*S`Ro{0f*$z(AIkSHiV34 z7!OyOd4&Gp?6i)hCt)1m$-XFG`t7}7fvINQl@l~SRy0AsJ?%rg-&*spVS)kIok(v8 zpuW4*zn-RuY)8a9_UGb0QleO*k%F^#0h4wEZK$EMh;X(%n))w8?JGv5kL};m|NN1O z(*4+kFJCGSCpP_4cr?YatzRzlXf+Dgc9XX@er8z^&oVQf<@+JbQu;9=rp6&|i$hca z0!>w3jR9k?HE`et>d~=Yh z73w5xIYq-E@SYahM@$aOAya(;k)diMl8nrByuKPw?nK9*`bZ~d>H&fdJUxzC;|<$e z^yygg8(o3xs7-K}s#E`cHr8HOwb#Sv{8UB3h>V7|-4>XRTdHAd-+_yY&Gl-z>V0&9 zIOWgL_rPu}k++U=6tjRqSg??%E)=lRv0{HM*YdV79sTbXJX_=a)2l@G=B#A7){qbX zwoK6Aw;;T;zupOW>^3B{W67DJMPsb!AqL~U*IS61zoZEO(Q8g`kKOlJG(F=Yem6q5 zv6J%T;5y~PGe2F0PrO#90y&nX;m54TWI?54m|+2AGtc`e8VwCGiphOv==U~wmo|~e z=JOavp1lpc>f)brg;C!=g{iL<%} z;(_LXk*n0*#>2RW&T2G-C;q5j!kQ|_%ww9VLJ~^*VlF7WYEhS()JF9y%r^QE09G5( zj2spg5dUv7{>h@w8DAn(o zf)!4V8jgs#Hy02h+7X1xM@lncbm4Y0Z=~3zUc%L(O!fl-OTGm-&@mddVZ+p^C9sEm z;oG&XZpLC2GU`*#Cg8&Ur)1V2;t7J#&B}0<-lBF6vKWT_6`)X!wJDMy32ce0QyY#- z9h=BzyTG;X%2BLYw8i`s$eA;ioWEdbU#g zhSq=VQ_)`MpFGf|Vjr)y$3COa?$8+@zY=;ZYTwi6; zlVArYz?*);w+X-g7P;nvk-;Dp41BV{}k)O813C91xG2=hS zYrB2}b^TIF?`g-->*n|$C`}yyYX(ws;^RM2EYV2Onu{CGvBv*p7Mwjkn^F_GE*Fyw z?7smev(NB`KMvNX1f~S*8*!Hn{1bY^wr$98|40kYMzV4K!{WD0i?R%vF*$O!E5?hp z{2FaB1yndEDC!arLxg(PWA#T|o1s30IUPJ$7&z&?ry5~_>0s(K%=fxEq{X4%oL@Pg z!5sWb^dq}|@Sy1O_tm3(23lL=+w!GsB{?g|A#j|b`@+BaFgNGDh`8czQ*rq7e4HoY z&4|7JRD!of`xR#A(mmBAHurlhD^?`WuV`QCy~_{o{Ez34;4Gz4&mXTb^POqUAF>@U(tLPU5W+CDYQV;@bl$9msZr3i@&y~$M7fV zxSvm(VtkPfpw}cZe>c~k9y#ZL+_xE8~MEQE}1gd0tJg^lR-VWN{7;bL! zM()l~4}K4_B0YFhJx|=h5v!OlJj!*;s`9Go&Af};x&ww&&2uTy<>^O=>h?XEbU6JL z-@h+;&C@3>{XhlVd%K=Ll)X!z3i=9;b!~#1`{1F#NtH62ipx*je*@y_YG-94<6(ut z(TM2`rkEFjR4^7Xs<_idt$hsYt)S-4e)-UHF+Yx$fL8*yC1OspU(I}6d=t&-%(WaM zXfnsvV9Tzkq^}tLrq3U!*Nu3#_}ZkjMS+&VbP6} z0<9?k=Qn2CBQkS(hFbbfD(8{4_uKTkD?cH&Xp5molH{n%d+eXJVMphry{i2cR6a}6 zpdFSjLi@!ABE}3TQ6BVGX|wQNGiHFe7i|67QtQ_phtF}Tr8sh2k7t&Au)m6Z z{x(^1?0kr6?C&@?4ZfY9(N#FKKUBqjM=yue-=UvO`;ytj#zfY>2$6Y# zXlQ@z!TK;bdJ0!z>QqUg+~Ond6XIvr6aPW&FE;<;^9fB#pe4F9fn%HBNQFL9M_zGM zu~7IS^*iIQTKy&}EVLK=F$bU_Ed620zr(m?MR2_dyV4#ss5!HcJL^`cZRgUu3$)bs zV6lg9r3LOvjx1>AXAhy7ozsjyi-o>9E0auEvwXcZ0j-@4gM~e4hQ|Mz)3C)UQ}yZw zo$#<_*be-05cu1m)}E)$&AUwV>LOGQ6AtiOEemM-b~KZs?>HwIQkEeojSyYG!F4z} z;74Q(f2pS3uJdu}i4ApjdtF33yo&(D&c&0+<1zE+_t2NjW`9Z~0IFl9dKi!SYozPJ ztFl~uiXF0AHG!7~RABI6iW_1!h!@0K=jlRbfIlA0~_uj4lxL#eI#26%(}s?L!z{%JMK z>pS5kL5Oq@-CR!yQyWxIIO0*&`+0k61WOcqrD%EFxi zccZAdeV}H1LTDIia*RspX9ToNFz8Qr<#)QpkNl1ncdl1H_)o1cEMTo)-IYIT_;rML z`U7qNeC^-k`ZD}${+gw1s8~kNG^iJypZd#LjJtA$#y11_)M>zxsGlu-O>iDtnUSvb zyMs)3Wu?yFhxxyGCpka+qeK`VfaU)wTU!+Q@H-M(Jl|bO_ZbBLx8G1L=Ts;HlorpN z;~dmC+N%XLgL#Guga=2M@V-mRGf=&hjH(c**vMWsiP;RMXHrx|wAZZf2D#MYWt4#v z%$Lmh%Wwc%lA#tLL(=>u{j>kTe+eAI3@`GZX#O&1b{a?A(k2+#am|>XpWTWI+T&}X z9$(+v2mX(K`xyQYvoLf@aADqv-ebEaA&26}Br5aHH}LNkVAOuhCO~V>caq23;mh3Q zwmzjGSIyiCqdSb#U+FZO47{lSRO}a7uI64Q#Wcri zW+Bi?X*ln`vX3rj2Ftn8QO@Q!S&l5-fWO!`qTz-TZmt9F9|>@kg-CMPGnGdZ-$m$P zGpOLF;PkQflD+bT4f_gX&i|^kMzRp?6V#Rhfcf*$99rZU2l7-BdP=Co+yIPMA$Cw#M z#Gx3NF9Q?=>d9}knKAZEJ;>0>b39vOh3SZdQ&F6mRUpE2W@3;-{mt}lNMDkTMANEn zX5u}W`7lVl*HV|0ig#&qy#dSO2fL*&yw^uzj84w>VtkQ+i5{2ddV9FDy-k;wwv|1q zkt?(CArvGziu`WQ94FW$mcPBzwv_hBtGV1K-8HV?-W<16;#{FvZHr%%OE zM1wLg7ca~$_sUl>zTtjBuXvN0=?j4RC*WY}_R%dQ-~(DI2#`Wd~r7cGfg}y(fu=->hj)w$Kru zADQ&f@iBQL2ZL1{4E6**f%ew{5^8)H13(c608sIs0Lg7l+0u%M_}s(v$~x>Y@wATe z2JgPy2F7Ou%p4fG-8zJppdNijx5$uWI&XN{l(#&S)-nyx7L3P>%=x)xrX}^W z;e*7H>D)->!VavLJZ@yk>U2jZZnV2>)C$>`Jg>WC}$k|6#^9-N;MM4Z?EssN2iT<#MP&eB{Q;IINltOo(Md$ zzjMbceNK!=#C2OKMrb=q!c!w7G!IWj=wz^4`IvAS=HcCz*|hN`c;;{^ggF?39fi=d zQ}U=rKWW9?H8=obrFsdER9pVYkZhV?Yz|W~rkev-6uOF$-&yM71bgMsyqscw4U3QFI7yA%N=`o~j-~G2+A&=Vjdg zC{t;{FPcfFS6S*27Q;2J4^Xf_Iwp_Xq*u|LIakUuLfpB6RW9^_k-1oKz|x^?+vYqK z=Pj1+FU9&ini%6DPIH=(t#ZC3;aIkV%?SVT0JJ`$tD?8%kq1o-;RRhBU%^}w&j1{4 ztJTs|;~F6=9-YH+8WGEC!xw@Sp=5}E2U5sA#i|G~diw)UbJGY#-uAr8_-^tewARTF za~4NEuKkr%ayq_h1?-d9BOjq{#Xn@8|6?SkPqow8O7w7KQcL1eBwzTur9>h7V+Et~ z0hnY-f41OTofy8u@!(sZ7(TYnfuHdgB8q3pbm?nM{qT^dLTkXf$jshq1|N8GV@jgF1k#Bdnl-bJ(<#&V5R?i_rHLW>}BZir*N z`zE}@Ef(m=4eTStO>nFqUCo%w-I9kaKRgev!Hn%^6?|BnEo-$W9{aD3<1Gihlq__> z;_xrUVWsT_sKD$I^fS30qW@uKHnUoK3%+>m_p4+`C$!DFA21G3XITFG!Ov=T#(hNz z{(CCk@b|hrSQQB0Y*05ZOn1q(^Uh*Sdrx>sB>@F(E%RKYez+8*=`|id^)Bw0U&D2t zCl*PqeS&zGI_+f8h#1?r^`ZLwnu45`e<;ur2NtKe)bEJwg&+3?0&Bv}d4i=6-nlc~ z(g$)5IJi)TN{drsnHLZ0K?(*s)|oXfY@T!BY&7g2hA0asTBTkrYh?@^wtOh zdOC(Gzs92PvC^0@zfVNQJ#`SJ+jF_C4wHH;g<$I3Qn}i3Q65zT6(hLYJvg(sD?A`G zQj|;M6z9C=;#SbC0QPFl=&jybO^Gfo6si6vXSd-2y_vNmw(Aw*r7*rA7T5P?oR4jP z>iI9$g&e{T9UlD2%ivzhyBC+TiOgRQGul6PBZS@v-A)Stg6}WbWXzq87o5DFRU}80 zLh@-JxPwPh0v(F-x1mYAp77@h0?2z|uFdJ_$0qtr_0nvND8X5I7)#|!To3N{j3Ctr z%{CD`fc*fLn;N{)VL3Pf8uu6DNJkijxwxt1fgPB$tSu1{Di<7r5@-HHN(qbYY(K&L zx)K*jT$_X7k4?9x@C=bm)eF7t>d|1{G@kvR=PekP)0+q~OUI#RFokj4yC>W+$J=cf zg05^q2- zDTkmUhXc?$d}5e=uG+j38)e@Y2=#aRJ#%9ZO+VWj8iHFBuzk0!85!IN9yl+GdxP$7qu_g z{04j)_IRRPqr548=hSCNuBoCVis{$37BxjbfDV(k*mVG5dC1SI8Rcuxn$lMz!+U$f zZqvRGw~F-wq$w8~eviOQpe)8Po;;MH-dfK7k0);gCwCY1_D0+^MhZn&#(o92sh{Q? zX+SB){m%jef(CUWFGMl%bFvA|3p7S(sWcp%j4zBOVfZHC;8#ZMX%iplNi|RGYKcLxB{8c~IkNL#24! zWV&Vhi`N8-q@mG8n+6Xf5`^0an(hZo{;+70w~%Qm0xSPk%YU$0rw@A+);101^2dw>p{554!E~8Tn7z@dSw|Qt{4fG zEe)h?gmbZf59K<-QC>hpQRpHlHr2R zxf;53&l*gF&rSSHst29BXk<-U*N5ps_JHg}=WQraF(xVm_F%%z6s4j=l~} zEA#HSl`Y=a3NJ2#b@X99*%PBl%agmZpKhOpUxBSoyQwv!8cbogvsF-k%Ap3T%k$*j zL3Qs^_S*ml3TRDG8m=+Qx1u>91U&TKG5I#_Q9C9=7KAuBBQ(MqoY71D;WRx$FMCc7 zKH?ZaUaT1!R+#DUzJ${`_3wfRVMsdS(; z43-(}I*I+Gb1-ZKJS~wtv;@CiXSPdX2CH2z?d^+Pn&)nqnvH*u19SfmUJ8k#x0?BZ z9J`urHBYWR36ka+hvVvQV*6;loIsS-KBIK|?E5mQeeTo&1-S`!t+bCH7LE$i>_zj` zzR!`Zd5$@zVX+(PL$?n5jCnt^IYp4j#@}Sl%2tuN2Ti6(G5XF3v@ld87wR|~VJ0w` zGl90pVJPgONHH3%{IvA7IUh~Ipo-X+hK8k$QQ27IrI!A+&ZA9C z|M3GWJ^4J^|LNTh9iCd`&NBT{7spD(9XX#Ii1#zBmG@F9bzl<_hta_hV}fNEZ6gQQl!EF zreYI&W+*26Sd?B&+bvEIut2?jr$z%5BQ#tfFyg)a(0;S0=_^EV?+B)5BUei~+ul;njxZ7(<% z2;tA)uSRO@Zyd95cZp8;%aW$7Mzq)SD+ZyrHmHB#{xbHz8DNSxY6bzN1BPzV7Lv&b zjYc9@^{Vhaz6D{w+S5d5zL@EptRGNczLLS-8sb78olz(4W018GIu-BQe#*y_-5m!+465Qn)C_kzN|vy&$#{hJ=e+%&S@G>>fo3vRKwLZ|vQAwU&r%%EG8b6@=-55O z_C9g@OtsplgVgCb`w?7{P>S=~uMiftSoUdBQ%ziW+@^xQayAEItLoL;@K-{V-?o~g z{c_zLr|M>UEU77QzM0N2mkWK;4Df=HQ*`ExlQbiA130S}`W|Yh8>R$bAQog({tLQc z*lpM_cl@Fo<~+RXh8cjT1oHs=l6a9%mQWzzfsmbgSXN=T#wv>{)~8?@`lww*MM&&B z)~PBqho1NZ92$pbtNZyM)ScZLCDDpyNM=RUUJz&ok67Cddb=whK`QO}WK4~KiPgI3 zdPs@GF4A&=3PQ%0Rv~`mt|th1JHxWAsguJ$`S0s@y98R{v{%^$;i%vBnyL@BB-L-i zpHE!BG0z^aem84OQ<5=t0VdY(nlUG?-#5!pzrQ~IZ|Y~p$NUq3qUvCXsqx5=6dzOC zFI~^wz$9^*Tm92+^JuR-fCKH0`<##;3h6}g{f&=_@4pRIGzGw2NmHKlnay1Ptq@Eo z(~<*;?{AzG-~U-(>V$ZFKT#~vNP(#Um~>oB-2>zV;q3Xe2)1KA%k&iLfNb33ZUOs)4m8q6OtZ3?mxds!#zW|xp=mEPHQKe?Qd~c_5w`p z^HzJgC13^RjAef3{9*I`j&kh$OSoQU7NO7GfKnx$XCS}&8}eYNZ64Dq8%YWAMH#Bo zTbOKE@kROQam|-PNFcRokD@dL7;p*JdzWJ!b)@8o2N;R8#r;Rvg;Cl}H<~>Ua8Bdx zh|J(d&{rQ#mY>ROknd>k6UOUoLAdsD#(R4`(hAoZol!OeZ9gr(X-#$-{wABc0$9kQ z<{FnJ%Dl@lTi8Apu+m#>d9?R~q=Np0Vg3SL7d^~d207xH7VGxdvLQ(x8Ufxk3M^%c zqcV?)8yTVrwc~Xrz0YyxfO^~9D0mwOh~sQ7JX!J?p&^p~tR8aGKnrvd!(R3^=+Q%l z`FJGBE_IEGxHU4$_+P658{u6KGg)}D{QU9y`8o(fjA#w&HaTEYah8AKf00**td)<4;N+ZHnn({9`lP=@zie zjMb5`{CAW4mzzv}E~c66wwXLam<**4gO%=o>=WL%G#m9&u@4~moFAo*gpY!;1J&Ep zEq=PKeHUXtM%||a-qJr0-pjf}N5wlU=V7uU>5KCjc`uA`)DGZ zBOZvF7nBz;httLxFFDwSSHRyBj|bZO%JJfX(sGi+fgtq=#JS+rCg^L4;Xts*9OZY` z+cKfZQ3)f z>nh`r9%s?oL)Ip7`|kNRx9LyQ@km%(!#-4_yqryROiWVyJQ*%-(=kam>X;;>d;x%^ zu_P{O`9B=3HRj*8)(aCHt#w%PS%FGtn|jh+DZwK+*LzJ8{Y&PV{UBl8Qb(HAuD90j z?8Rz~ejA2jQkwxcn6+7fllg3aKU58PtqXV1;VaAq|h;V|FhG zRLHV!#i*)vrah*O7b@&14q2Sn<;W&Q~5Tdd^K2PT7 zYAJ!RJQkEurg6Z`bAC=wR5JhZ;{k%NO;hyY?Bg{Anfl zO+nV`amH3G_H6P7zdMMaGjGA#z&*yh!_rFJdBZRZ;T^68Tc+M(yz5W9+@0rd%TJB? z=}LaO!upiTPXqXAsP!q0pKy@zZc`u&S~CT(Dy5N%0bK0cip5D8d!E zAm46XHsCPG6RhzvxPlNjYbop{V+e<$DqCa$E==;0U$66Zm?}LvOj&NRsF8vxI zNzD91J4AEMSxKRG1YyB1?+t$`=<3w+Z|-e~wLrcgWzv`OwHNnpQ(ld7uEBuQc|Znt zgYodn+LtZ+#yz4qyn&l+*3-*w`g1vt_TW$rPNr_VCDqk{8)n?$&$)bozzQDT0>cT> zVQSVNVzVcNJ=ms>)=MLz?lfN*cMAKK*8QyiLrEXBGXIM&yK|-dr!0tI^V(i<`IGyN z3u*(C+~9ggnCvaCdZ0VjCt=F}ebqVWvJI->4cZp73cLUt15x%FudntOsA($!v+3ea z0`vP!foY4b)O-oWj~O$|`LXnIjK+4%kQsvx@idF80EXHJZ2K7bC5_c z!q;B;l{vVp!Sf*wgg*G1Fy}tvzUS){7g|0#0Nt!c6ovZYSq_8TkBoaFVYRKMV&y&L zh>QPGZEHw@NFJgPH*=TGOmP_t9uvACBVW?KJ`CXlRdf|J08^|BP{iAp`gS+S*|h?z z+yI#XT1+v0a;0_kDC(^iLgAUqEV?RwZ2sxXs%He3BhCqh$e3^n+ zzg1>6slQY!siqNay%1ls2pH}4xJIck6(T&&BO02mQx=*j8ziN)59~Au z1ZEj}nhnX(8qZ_G4FX9ZVjGaQ!Y5GY!k^f9G!l?PZ?L$5CNQ|p;$A}v!hV?2(@Yto zQyxMJZdYK+nP$pBNijka)e#w5s8d^;sku5;=4LSpk7LTE?J;K$QZKy^vYYB;#A1`do4${d4NGwmX+eOZ>S?IzYG@ZS<#q2t!tD zkwQhb0)~BP=3%M)tCDaS2`kKm8+C$oo9V!>JJsys9A@JV-vI((geH-xXyvgs&{?`* z0-a_84K{%;wSgYE;7kkCp+lrWPi3|Ci>p8E_m|sDlI3@JEt}FIzoE~Lk>AT_vC;t? z=>@?>)y^VcKxx;Pgc*nz(ISdXbxU>1B%vhG4JnjV03+KfB&y*SjUsiJb4%Bg{eyb@ zsp*jxe|wx*6|DiCAYw9Gx9o4!DROYd7-vU&Q3l`A<|a;457w!Q0F_dU#vlOd2K~2A z)ZiLY8|~GUbd7rPNCUFTBFU3-OrbqrF!fL^z!LP(y?5hyG3%JK3Xt^@iwRfPKB?DN zj-%l-)vDD}4@na4yoWFd_Vc*9+2K@1Xu}L~~-SI~#|IlB>@q=x{f`I(7J%gCwv< zH2xGwpp(F!n!pmR!{0Db<%!{uGZ)CRCAX61vIwRZdlK7$`6)09iqaB@VjRaZD~vE zKntjP;b)!N*ietIi2KMs5k2q>=m0rk{=t|=J#hZ>Lek3o&01q^cu&&QRL}%|zG8j< z!2CX1e}9O^$(_KibKT{GX~feLm#cmPptS&jM%h5wx>y2bnLyM61oGNI;q%Y5Fzx$2 zSqo_U(6Tqo;Y&uZY1q7vigL5Z`}Oq}gE*{Eb6zduXsM2);Gq)<`!OI;FCq{5RI)|* zbT2C#?RCAbv+$|$bHb+&$PXG5FD%h~x>Se^JZJ0Chs=atIsqo)F69Gyovp-cGpdcQ zUg&1w!7kO)20EZokWqEN2@gV-m_Vo7Kx59c8MRge>CxpBKsrVjtUp-R83WTf-m7!w zHZ=4}e`k%)6&TPb{UiRpp-=iw{=FXd7?>skrn=m9go+#kNC*_MBleny2X*)vs2DLf zM8_ck?nXe}01TL)He#$s;9aO#J?#;GH*A*-wVzaC=I*NfINo25rSIN3q_2%h-?=7z zo@3~nJKdtMsYTz9i$UKtC!lZnhnhaw4e`IAZ+98#3jiDWcOUhGI)Q`SKFwX5R6+y~*2#GyX^ zoV`X@C>p%ooyn&xK4tTX0poY)@u{~F%1xsYyccHwxgPpbs8wG?ySWhH+#DZp3z;Y9 zjmU(YLJwneJc!L(Z~J@auGHCP*?#`o(DfY0a!tdeLcwR@qnNO zZrrj0wAmhHX#;gq6#fKhi`?PEp74R9@M?E>BSfhv{I#hM{Q!OgC?3M!1@0bG(u#Ua z$tdbEqq)1ssX+gfKm3im$B@jT9z%gGkn?O&kK3|5JuZdecu&szo*n~pJw3*q3$iME zOax8W=2U=)Do>Bm9ZA=H9uU9M(_?B*k6ArEIHKS~;`oH|%pZ|jkmAYt+!MYr=PM*` z2g;p2uI$@mU~gpmDZJGa{uSwpn4Sg89tRs;EEjdYC+8`my00kwjVIc%o4a~N6HopZ zcx;BprbYSd21c8AU^x%DtE*eM^JAXy$3@{U21PsOx>I5(Yyq>ltJk!2=dbYOuNxF? z-X4%ZvKBd89nKc^zv_Z;M0R9ypv4VOgk>F286fc%FCMEj;z*EH>M zPtJYrXj-4@Dx|NvB%0Q}`a>jF;ah%nRZ~y?UU&4|lQ@C4J_lRDs&y?r`QHR5!1R5W@~c%QU0nqrYB70raE`UqTK z07-aioG}qk<3Q{8eP#*k+{<63U4gjjHlw?&`kUc$;QusJYRU9 zFSr7?f}+zG`cd~6{e7;5Dk-0=y;&uC)}`ZN&G`(y=5v0cmyh}Fmm zyhc$-o_y6io8Yjj$bCYAH*9`A@S8V!Ieewdjrm70f_cMhy$3dXQ#R5SJGYi!BARBn zyOtIT!q<<$uU6wt5vNe5Kc&H&(x6&C!ZiR`UJ^ks;hv94Zn|}=w>P0;EmRAJiwhBR zeopw|O!UHc=$4AmcJ$I(EL0b$hKAAC(R*>4pnxVuiP+u>=i`uQ-~MF$RaD(x*3g%- z{<7$~STs~P43R|*iTck3KLhC?$e)AxIY{usFLmGxHdaY=3I_iT{*;4w!FaL@;|Yky z1{b0oPdanCo2{iCldJArb8mxeI3cPr=8eM>a;B3Yy`*c^a};=M}N6L4$^ zu2@FtIqow&&8z5Qo9Q)PU*ScML9nX?A6IX0%-0OdpNny?B$KZ8>*0-GUI@o^A>VG1 z)w4VDe8K8MfOxsvzi=-+>Yw1@sw#rqRb{lgVk16%jDP5Ib>AAT25&c7U4!qJ?DZG? zTKWvAmms=bQpd{=!b*kvJJXoYP1AmyIL7hPk2n={EpJM3_-D=rLBH3Z@`Ja)>;>~5 zg7Q*ICc4ex^+k@r^{#M@8R?fBJ@`TDPa;i9g|Q;wJiIBM~89N zh+EU)udP?LpdSWVHBl`StabVO)lCe((Np&qICUsT@R~ck8i1JI^e&<@jM^>=; zbZ-=*N6Nxp;SC=z9W0g82d0ri9O5X^jK8B4FfAXi@DJzjQ7a`=ow`;>ErEFnzIJ;N zgIE^<784)2FH-ekSc~S=GIFYqR2)A0z#Ar~UYa2eZ+!V1Ifc_D!6XEVi(7Dl2CofT z^I>c0MQSHb%w^e-!J+DgD0C~3+~W`PBu-36SNOxZ{_td+VN#d{5SLo^S%!<^GTR%) zzTaY~)sKvKOZ{EFxWh)$b;PG8i!c7q6G?KkeqMJNxw>i1XCM~d)_Ue%H$bVTF_(FIIW8fxEk^bVP? z4IAzq`?I)ZaU;rtlOJD*6S)5HM*7Qv2@Qc!YJ3egJ-|_0pr*E}Jzw`@bKPg!={y7; z0-ClSFla%j9*08;_irOvZ^BU3M1xcrSWM4pg?f24gBsId%H{3HvsZ~H9>6zm#SbgUM$cxY(6jS>biHBkNe_{DGY<36%obwJflfOR(EgAR6 zJ3`w`KK(RioX40nd(1dv(&>1rn_YsZ5tH#VsE{dxGGXV{eT(-=+4wQ=?^pagLfGX5 zQ2d#ei4o~AzwH6|r0tyA9R%3yJm!WmSob@@HWOl>(KP_W*Qoo0ZyP;)C6c=R_*RF1 zv&YCc7_@bebqsjODL)s|X3U@k3Da`YhH*tk9qi3XD_O=`qw9@1-f_k@*twH_Av*av zr0q=r{31vf5!qgVV6A%6kEC@Cezq+q5m|itfynBCdeSat?M?Wv@Vafg#%WBt5yrB| z*oN68zkteZXA{pyAoWHu=<7aX0!j3UAx0&YpK+lXw{Op*GM%1LXHgwJ(b@p%%tjGE%- zOZ=cbVB3VmPnZZq+jimeHejn;NuZr^HjyL9@grdNYD_5QBLe+M*6%=;_56<6$F}8o z!1_PZ*6>G|#cF>}4Br8#Kc|uj2EI+eBeF?NSa{v{_}NBibUmi*B;Zz3oO!BhV}&MBngfA4#a=)7N~GYOUd`@C2>~JlAa@KKK_1@uQSL)L<_f9BkV* z3_M3s>j(>;*ReRX*XMj+NuU^?4)Lq5Q61zBjY|QBNI(D)g(0oGk$}sQNNL66dOT9@ zfxU{Q6B}e3Pc?X&%6?NvSp-7-e8wLV5Hq@>3$k;O?nQXQoDgM@F?HVJ53*vObCmuQC94vwaQt94c0O}pWPO7o^Hhq(;H zx(W=dUG6Q|SXze)eTezfIAh8eh~WPo9IdVPrED7KHD*;YKIJqYW?F-rrLFfNnxqx% z??&EcXcsMFEn*e zQV$DtP@7Kb##Mkmj50zW2Gr#zqHl|nzM-V=TVKH@(zk;2eO6rXh0yn{NuL{0tRv$@ zx;t0#3&_OLjWIfDt?>#C6nh>9K2C;yUd9ie!g!!zyOo|W9%5W-;)zU8^A&8EhH3dn z*gu%5<06W?{*k|p`DJ3|i}pRupK=7lUBkl%QFmX#S5tn3XgP;^bAKe|tFlDo>yF#g zAZBd`4@+~^q)&czunR{gh<(GOtA?FTdnWzWADDPE66c+c`FpGM5V+Zx?7Z3@Nbhh3i*I|usW=@ZJ?q)Qt`u}lsRMd*Cf>oYI$ znG#9gart>*8ra%3eeW~)5>8J+f^9DWVlg0qzqR0>4wy7FxrKi+^F-5o{nM^$dQwdH%#=uak2wA} z_$8cPjXzHO9W?$suP6TANPGtV42%9e=82}ag^_3R=g>`p{{p6fKM*F9KbiazPVbCA zPW)>`+}d6t_!s?su#2}aSokaO4*U-X_3iuPpKbc>`>2vVMfqzg2W%}7- zG(x29O@PK-2K@3gzl19|V>enALIF-ne-fYYoXzKF^m85+6229h@`Dn)YI>iBmZ(X8 z@u|VCzdPuC3h$t|{QqO`UBIiZuKe#Dk^>0@emQ~~s;!B}mUyXzi-lH8LW2Abo=7U7 zwAz-cRcdWR;Y4X`D;UrmkEcUhJ8h>aXTFpuPb$0#p-N`_hU-FDB7Cl5lHu#J<>x3Q5svWFTRw`N;kw^W&hgF&e@#E- z;eYyPqO<#-RQSmWdT;0SH*W0bs&J^D3V&@J0ZHL;|9kw?y`A%3x|fsIFa zM38S4(U&P4VY7-(5g=$`+N- zP4r>HDRHIzkk8W(Z)L)jhYx(ub&JM^@0e@-S*0ZE^6nrGHs1(q#t(DIdgbDS`51kY zY1kvf2hs$OVJ0?~yrRfY_V<&w7uQOeba`#T8ozYEpV${GMS{J}Z)qD>Te=2mV(6;W z^r9ZWe6`>5`iLl;RIFfq^eHQk5=k8^-Rw8+f$KUv0j2WBH$r}StKYT3M?PBcDyP}e z(yee*JOa1JFFg=#IXb~_*)t(ly4rt+_UNB7L`&I~E{~PAN@&<}c%1TuS`lQAizQlO z1#d@Ny2r&z*P*Sg9W(o( zPCs&(aX-9MZ4bgLn~vnKeENbzgFodzV4H{E|zE}^-K$`nuT-ri5)^e zhvN-~R>sp~NrV?4z^Ve0_tseQD%h=tA~n*iMScZ|&;V7ExRyTc?Ck~pqZdS|BLEW_s!3)nmo?P0NcDx0KW-Z$t!KKO(BPc{sh;KpD{xq=@tzqFry{Ryh&E z$!lrkChxVt;`0nQX*(^Si&t8g&!@ah+Dg&_5yq53QM@0*o%Ss)16}7QK0i}(3Q%Dd z@J?Ji8=6y@<3Gi5xBlJL%Zd7bGTZ}&H6LcjlGn`QvUgo=Vh5Mvk;HF~wsaI>52Dt4 z^tGZ`E~Yw$e%og&k$XjnKlB0u{nh4d)wMpUhbxVfl7aY#XP8jGg`;tsC40jkdIp^K*yzLz&#=`(nd6bzAN0 znjZfa^wcuN60iDyyh~634lxAG>DuA1iVnmm8qB|{Se0?Uk*3C2`RkJFcgBXdM_YD{ z;9)fGYx||h_B*5W24OuT`>J}N!W2L8qNaB*s!+gcX8#)IGv$CY;N}LA5Hgl_0?lp2YQ|44 zBKLK%P^%mGVrj-mbvi4rXUDzh*fNf zR_u>D=z$`&6)k>2w_mU?29<1V3;6|y{bvob$9r<372S|T|Jk5#$N49H3-nkAj_(wBBy^E`iw6mPN2OB10 zZz}+0jGb!B&NF0I5NqG%S3hjpKaX5u%L!l&uXaU$`Z`zKR#t|84l-y}Y567LtbHnA zC;o-&ZAbLmAc?IuTH;>4)m9&fUU)Nc?1%m(NTT)TdHlb|AFMaB7sG2^y(%5CRt_*j2tT2@7OTg1;$=_7 zLOUf&g&rO!e=$ibdTNuO!te}{_Ff1_m7Da4U#Lq5Nl(NgoS5)`du^zdnQ1c#p;&F? z)r$4eP}=7xuQM81H>pBqgrOa)b&sjFYg=vNLuC{b@ElXtS z=2*eOXu%7$r5lkh#Lk;e5q!4Z90f&U1v@p;Yr)tICaw1(xe9A0fPHSY-M9+oQ0BaX z@jT!s4n-5|tF95GUZ_o0=cDyx>nGNLH97}kx?bhtMT=if>WM}E@GX=kHBMMK?wV)%7%AzHdgR2$#*BS{i&J_+dynne(_n|>Lo6Ah`(fG+;7z9g1urlyN z!*Zfe6=iPnTpN8hbE_x%M9I1CpRCDlh?cfSpIOl4{=uP?62b%u0-CC(GxMXRYobrq z1pjnS8ZCWcTCDV#|Hq)DbN$j6HR03#vz0+IzjTX80jtMmI0#LVhv6->T0N|(@)*pP z&fOo2RzR$}qZP)xRKUk{;ua$$_g3fD34F7T^OuVzfU@lM!FM{mR3P?MB zgNJ%k3oOblEpJ{PZ88U&6=alu~Jsh<^B_y;f|H=jN%t9i$NGFfL~7RygM0+C$jmW!_k6O*-ZX< zHR2ac!Jso*aICh1|0tLQmnQni1Alb6Hpt=Mm?CO;;N6DMgZM$-Y~qUY@DCOeSRVc< zKP$sYz9D=|UEsgFpWpJc!qQXL^HbBgr!N2Zv#tF9;IV^M;f;te9(C=1FOX(9 z_*nUC2nyiyyC61G{vYt4R6Y`;3edt$gVV3F^8bo><6ndFak41w(N8k$k&;2l$rMY> zpA~~VYH}ct3TE2N1iSrTGQ1A32IcSlw6z~F2IX(UNhxdelMMfwl$5^{pMWMF`f0_$ zZ|~;J+s$*E$-g2vQ~tti`QNef|N7l2IsX>4AE(-{pJaHdD?f+EWy=4vVvyIJ+lwU#3034BSC` zZpB-&Dtr?^L3;iokSa7bv zWFo#y8?Ff4%Q7LqhgjhmpR@Yce#q+o-F?0F--eU=zoMU1_;arQ zTU_957ns1#0f4yyU#9+>12^@51ZUCU{QRK)8oZ~de-ng7{de_mNc7f!KThgT>4*ML zwEo}g0-Ic5fvf*+e3|<13Eb2_8E4VpqN1SwoACCnU$%tA8^p(oC;3J(^0!qJiv)bX zad$UvnS;qG?@syGS2VY@sN4&vSLZl-oeii?#Ax#Z1cq1yvV>+6K``RO}x{K+^uKE_<7L%JZe8v zu!WYD&WInYAHd%&C49zy-YTvC{H&Y3xve3pm!d*F3JKoajq=_y67SSX^d8Vxox4Fn zpPz#!LjCDuE$4PLOVCpxKt;IR?~ro8Ql5$9Jsfk_$v2hWcN`=69!h(S&`tetaQI(; zfCx_c=N?otYDBwbkF*_LQ@Jf9c+VxMN2_M;7IMu!$j23U6vt-%XcgHG^O@TjQf5@2 zq;4Z660iPHkjHYPdW(WeCs9WT-rO&fu|w_HA>V#gEWH?lC~#jtsbxqLqh4x0mk+%1 zf*gf+Dys{Z?#$fQJf)Kc&35U702lKTvp)}A4O&F<^2Q6maO$tN2)0+^f{o96fo{k+vj!`>$^E$p>GgcUq=ty zJLO%a&#Q#pGAl@lf3pHncCMeS(V4qRnn80n>dV-YGp%?7ohx~RMIBR=Df~z$DyVe5 zMQv2nR)wy!Mrb6J0AQOw&r6CobTkbdsa*y6Nl&f&6))`|fR%~r=wNK_H1(i%8{=lB zl#W&3l2^-5A>_A2Qv90RS)`;bE>#E8srpSygN_Zspj0IxjN9CON<(Oe)VEAm&9b4V zX3BEJd*yf3SsJo~nH_D!s0GRi6r`p^wB`g2BaP5+PG9s}Qg!VlWJ$WD=?o{0lk~k< zGGjy$MUq_Q$HupKi;uF{%7)7v&rec=NnPiv#Z#M-tfnou-n2*-R>pz&jX3TY~VSA`TBu~5cI*RmDbPoX>`OIn6& zXAqjJ(4iK}sI3V?^AtMFLc>m@SS5rNdb)-7_ZIy$NGtnAWxQ2MxdWWNBBdRmP%PFF znjgPiA^8eHg^Z8_hMtfDg$%clf$^&qGEgBOu#iFVN`(wk$XOOr82_k33Kep;g$$0L zt&qVA`Jjb(4FeToaQTpp`fm9z zQn>kfa=Zuu(|ZO=ibv4s=G76|hSbsOC9=bluQ!XmHO&6>8+#BeCo!Z?aIx>bY%ez= z_fNk-1izWM5m7Dx=Eo{9;c#bJN%|4RDx1(-NDL-py^PCCeg$fd%elKW!5>{ikrn&( zJHoFx>{lQHeZ`K!cYo4fxA(-Ly~y}>j}O9H+6MR)h&b0tX4>-l1WRrHme)TS#I(Fl z>eV{gqus>uA`_y#3SN&O%bo!o>GhMZVhug@&9M2nK;0gF`ezn^-VQn|#^^S?l=>Rq z&i8ZcnPMI3KhEM>L-J1x5NY`1cgS+F%$&5nb-l)<(iHgJV<~R`1WE*SYVST+to3SAtMRQ#fySNr0^61e;WwpuA7S$%dRqQ9Y z4$y^RYDf+b9CA8-eOaBIu}tS`8qlVp+*^|Z0a9d6%t^{6F%E_}B-HgL9cu4JVk*Ha zkmNFwkNmkdu@Z$Lh5p4oEm|ioA-uHq?!ymJ5KS0lJksEq*DMc(7~% z9pO-xGbTIv_3a9S9Rx)rAii!>Io zacJe0sT%ILF&pPZBS?=~6YW;Z2A#TdRZ#8c=v{{_EzwloW#+c7>-a^-YgQ>xZkbAedN^lTY1*l2g`I@%k@iLv2{-x1@5$`#OW8<*{vIvx4C6SGxX#) z{fdTO(qKe3am+-|)=>i*Evk%zc`9X4I8WALa-vhM+=jEFNAb}6>7YR5a14By!*MpF z&-jNn3t9YFL}!Gt&}KiesB8%>j74_nBw~&l-8*=kOjdB$h2u{ig?!vPO7FXk>@52~h2mQ>Sns z4iqWISh(gmv^n%Q(5A94+W3DPZFJ@7UEw#!?%)z*4HpxQyyq|{@}lB}HahY%95oC8 zw1zJL{h%LO(TgC$S3kmmpb)7}F%baB%y>Z~c0j~#q()you=(LLHSFS%=G<`&N`(1^ zDh+Mnmf}WB0N~FvKau(b`BG)zpTzI)_@ZD;D9h*}JjO z+F0@-*C|k>Qf16>QKDkLuu9541Uc0R;ZaogL{CJSUTp}gXJak%7yJc*((X9ZrWFK8 z3Mip{I!>)KG>S$@W;l%w5NHM##e~*i8sW@sKb3b5Amq?}V8wRfKH%F%*PU_)BeqQt z10DNfHU&w6NAzyHh!KZJFP22hSr4)#C_3B}LTui4y$&u5QSL08uSo&HVqW>&S)bz% zCCp|bxk2dd)C8W@8L*kIHq+L{2&ZkYi%0|%LRdqIjz(C6r=$wuzd_gD9z>K~jRK@3 zpHA%@nlrmWhgH(_vY8A(v}?EPDGddE zpiELb7-_*qdZ5neZfTK-xkaK&l&LoK9JmDOMU{=Q1Ebg^$U%LY*31R24Wp89NJ9n= z9fZ=zaOnc31VP*b@HMtaz*r2)`;j9jqyw0O3CsgHM6)12>Z@=25sal68_d*0zspb3 zBbq!D;%JrbGPu<`Bz%|4Vfn<}sQ>JB2+jfIR@AFZR4j^95Rx#u94o7&^vppb=tS&}zhJ z@$8Qqau?S*B{jyg0Eh;^jF`g$)J))fU@dL9Vv%-@@jf8}C?mBLH*Fa5XhQ3w?D^eR zHWNy(xl`hc@M=_m99@Ivk0~?!IxfV{*L2#iW=11Ncy>sz+EyDn6jcLyqKzv<(uix^ z0=*8JQ)&0XK_RU+zS9Un-zxevTuhFw|HIq4=+Ubc@&*VWOO}a&J_$%0lKbJY{m>V z8TB8fuXi&AjDKC@I#SwTj2#MIi6hZ26i&9r^#8S3DcUA$W2G;~&bz*>GK#VjsY_z0 zKNY-oGY2Nk(mf$iSL#bK?r>X6wBSW)Y!kOqaYzEBds111xl?g^eRfph5C2_{lX{EJ z!Q_$0pjIF_MPAaT z?~I-g@8~CM^H~ltK`?@b!IgAt)a#_>C${B!T9bIROczvKs&OurFxD2Ed_VC(S*LQ6 zJY&cpMwTZCGj@^*fJVckWoeg4;su8H>9U=c0Gine5h1tGrNo}7dZ_F%i`yK7l$OLG zr3@B$dnATcfRR{_i47HMgy1=wvokOjVNDX5aI7ahCF`#&xaS`WASax_+ zk!bjn1JTG)$AyXunj^XoFDhJ_pJgaS5PMlrH-piVH4c;kL#pvW*;1OUHBr9;L@~cu zbb!NH8I2qh-CG%pyaG)zHp1wbEvIa84v4_P3LFTgAl!uNc+kp%&WRzIBf>Tx6)>Z7 zjt!_y?5`Dtg%d>ER|)b}bH1xtO1l9!Xe{9R+Rz?xg`wl3ujJ@7=HoCRf|G@_XeOUq zq$2wnZ2GjC5V1o&P%A(2c-dB^VEkwdxGtJAU&&e(EYjBu7o*X3w9UAhb+O#XZ8&2? zpEjIeg6A?yL!sMR`wnUC6FX{4hoKZWDR>iDEIe7D(pkUNf8kM+{1NDNvzV}@@}Uni z%W>c!2nwu_;uswg7HM5>jj^~od_1JJh<$?ABA6U?ri7IVg;;T%%m|mOR{V{#FQS4} zNi@RZg@q13`GA$BO^1R+J70(qC}3r=(U!5dY7^|BjzTtJ+F2oCwb^Be#O+fi@#W&$ z!B8LyNghtS58*=`9%|8n36Yj6z)~+M6xfZ>$Or;{FaUlq0HW<~hqIJe zSP&!j?2@!-h#^sIWCKd=9s^{}O1ws0V(3_RwnP&L#ZSPtufztj#%hi_s6|WN*<}ii zZ^c5#W0BqJErYx|7Gck|0xJbl5el)6fGlu(FNrs;(^jCFrq~ATAqPi|i>WJ#&}cYm zhmjiV5t`Mxi;RG1=Bdv@0Vu`&MrG8Y-g$t^cJ2dZ3zQ~t5rwtJhC1d78dw`zqs>b* zk#N8CJeTUgo_uyNMEl7{tu>l*=s9Y@HPu9flxiH9Wt(A5o~4vw9M7RXI6&hbRyf+2 zY;8Jg0|jC?d$kf#=>3M!U_V=Gm(bYVXlS3C@wU#2`e6Wu-JT6?%y=Y_k)4vCij8H+ zg@(+fBTRCQ0t^8Qnr!5#VF6xoBmb0mB>|wLZeW$^{KMFSP@q-7)RtuTI}l@#L4;WZ zRD?MiT4Nh-<8mEu3(Fv1z)V%VV8{g818(cas~}hg(HyaR4GzRGhh5(;X{i+%wbV9{ zHA#x6(wx;!$q2=k+R$F9ofX$cU<%@ZhE)qSca|>krbst(AF^dBHq@B~;S=4|%)$N`r0vp>PiaqV+O(l{@9M<(~Njti@6@)MZ#oIUjcbQXd z^m`SexzY`DI>_XEiwvLo2h3uMZ2m};#icVtBF<p)1LtFXJoBnidd~ti6OlnsTRur->}iyxVw(h;-<5vOQo(|g>Zu}2Lip}jZK*$v?RdJ&&0 z-^Lr)FPFOf(V1R^osuj;feY7{jU?{7%E|AKmBx$QR95LlZY!(vB8D#Ps;6GVY z$Ec~CSMz02=L^Hb7oyG=fshv&O%rKqHBG&erheZw^(WR;Y5WW>AAcx#APAbld3`O9K4*+-ZOS|^ zqW4T*q?qEW#@7e1tk%Up%#u+Dp((D?hG0(?7u%xWE7akiJAX160Z9wfH+=1H zEel`IM+mX-kiPMc_9>?}(S4n+1D;?jSc>RvV}DeLI0AZh@VQX@<)B)UlbRfydLuvR z2uwMX{NEn2CXhZE{`hn(J2c1p0}au`>Cb+MzUy6z{Pcu|``G)+;QF_}1k+Y!*1DcN zSAgnq@48_w`tW`Cv9Eg$%OO4SYP+o)yjlCHyY7=w?8~1zO~7<7S6psk4dn*^s(Z!x zgl9~1s)Vt``PbkSai*mKeU{JVC9LiE-1|;EpoM;8fc2VKYU~^Deb6qaZi2J5`>F1! z*3{VXU%epbs??pR!_lQ!^89Z!Oy=C~va>2za=AXSdBDsvnpo0!6l4G99L57-&Qyokl;ST!x2! z9uF{`gD>62G9-_UUp}v}mfQS^jZx_vymwXV?03NcR)x2`MG>&OqPceQyYbVIlsZgB zt)nZw8numDgolaTXyZ{7V3Z}A`dkTWP-REkeu6KHW0JA@sc)tY&yS~5=z~O2Kp-PJ zGLMs#1aNfU>2_UV^l;i0uU4r6T9)i4sxDppG{%fR*DuJvp zSS$ElQ4&pEaWvZaPF}R}cql%ZogMx07T*k_MORgemC8|5;uqs93VgXd=CrE1SUy#9 z8m5o_y%!&97jJJsZznTNgNuWe!92wx=eCN2eb%1Kzj6WrMSn$8V7Z1oKHcd@wB^ZK zL*uGSH`hR@YgcpgxtW(r)4og%T)P!-E8b4$1-mBi#M^D&$>7zsI2{^2hRxnMZ`Aa+ zxB)~lBS9bzTdrV}OKFqA4Xh^!bvRnP0&NHdmJm2X>$BuK&3^g%_WpF4^~p~TTNxcX ztl3Wt!#qZ1$nSZfq1_*j2(^`aWGj}OGW}V9J3Y8}3>_Y}L8tv0B9$8Z$nUWpd+F`6 zSop2{^shcXAjfoi9>O8`n3|r>+v`jGByIo106cV(xcm?zj;&Gv$ zF=BB}EQJ7k-8<3o8}A6m#_yb4`GgraN>q<<*_J$$1D01kUBY17E0~X31MFcY#Mfxb zB&&;f1+v(l39sF+|c9_V7Wl)PCl=gO?BGc<|lvX zo0AO<=Fq;g0zSx3-Xk`x@i230Ar61gJ=$kB9_|-!z`fMmx$!UImT0Z3->v@Q<=&5)c|-wsa{h^Mw_8lt;>}j5-uw}}WI5^gwz&$$L0HnB^tstu&NQdU zo%;BKrF}GbfRdn&^uf1KoHP6jwr+0|VD(7GRO|x(xIi@}$!+Vo!T3*^bOrzg{jo%; zzG$hy@1VRNyg!}T)b!;irTa=Y9YEQuy?dn^c)Hqbo5l1Ll9+RMdIC-z=@qO3zdIUi||GRvZsnCNDD7i(KbkeP&Ci*_x&1 zJdXVf0@$Z~@>y7gM@?X4-R?*a zA;Agr{MfgHdQ6t=W|*7jx#Z5y^G%s_C(ZM}d{e2i^ZZxuPiOP|_a~)WoK2UR=Ovow zDbfY={05Q)^ZZ(zPL9iJJOq&$U6*a`&y!jcxVY+1zytfw+v69w$(t^-EUb%us=*gC zH`+>mg9Syt^ObYqbDBLhiS!9mQtI=;T+|6fYH-^$-oLV0Idw=+Py1>&Co5qNflu%I zsKyWT$}mz$)IX*9%TWrHQ_|{(D3S^)9Pe|yDt`@pJA(W=?FFlPw%8Ftst%TH zr9Xa8!}1u1Kb*#Jg5LP1XBq(5$;y*u6yE<`G}ES@51+9onz}vYqn*`wSm5=3h>4B; z@_0X7zGxlq`~ed`HH}T+;r`w|qGAxyZ}-PITRuwoh-NoWVv#?RAO9L^+t=ies>^Sh z0Sj}a;PzPxC>T{&&@`iffPwL;3K%%5ZeY`lfdmYSe^LR1M%4{!n!#0vBf1zsK;fvm z!loI81UT*RYX*<18{9NwFach}Af*^Gs%}Wrj3G~HWc<{XA@rzu?X!HFpSp~y)y}kH z68rsf-dvDh%nAG_JDf92q^ZP>hl-x0JG_W7nOB1k=f}Um!>+~oP18T9_78|(EpGu{ zwZ4CxM}emo55%jshvQ@99fVgc&x@ZgZy{c_J2!rYyo2$o)uDy~-m*%sX_CiKnS`Z- z0b`+<;ZWNvABLO`TzM`~mbR_Hk_xW3m|VwOR(Qs!!lEWUT8!-(-X3mfZ{s1cVBPkX z4J&R!eg9BV{9n9fXEseAtN|Gk|DM{=k2dtfJJ?%v7dr(7>uKB524!n4qntgQY3*auVxfoJQBWY^tvJWH6YA*z6ix^dQV~M{)m^HVUi|AXvL+`~q_sHn?ERTmOf*fb67KQ=f% z(xL_{>he+5gNYj4G>w^X%xgH^qJ}8ylcTDK5H+M}+7LfAiAg-{Le66INKklD6V-Qf zn@985TXseh#{3$)J#Ufbu}a7bHBHauou2L?-lFF+Vc>c$xZVw}Ya?UnK=xea1=)4E z)WX2_T(G?xY;Vehf$q7Wd-uTjd`kna=Ys3q1@YPD2hnpu^zQulO!Gq~ashDnfVgjd z=tM3M?e5P#C$$ekk*hw0<0H%urN|w`CI|p^=f#H+7RxJaisj;m)GoTt5dAs7&vLXR zHonul`#AhxZKBJhw3-LsVK!+V=&qQb`a0yEn;~pX$LWg5NcoC0_-`u)?4b^#i=&OJ zNDEsf>;(Hke6ZCYJzA?jNzlT$gF>4v^*EoG#{9%5cxIGa40m+1-SrdS%y0NrEJB*(1QKMRg9_*G1#G|X^h%21UCPXiSDQ9 zQKPE+5#6t88UuI?am_zuqH`5JdQ>$svUeh#&^jMgC zXo?CeYV4@$Fj3*AX^iZ#{0(_OVgb1Be>X zG>!3Qel1>VEO;g4XV`^8R3WKkFXj7e;@%@M(v!9nmAAQ&@q{o}FY*)W4O6rf+DHvG z7v(qAT&Q`;JuAJ(Zeaz4X)kt_&Y#?Epf!y7CI}F{|q2?_(ZPMu|P=dV*vx{v=v(TVjx;!FZmk}s(L5Lu{y z`F^Yafb+fekk$XLe2MU07kG)QKaDR_|2u&@Q~yT%ePzn;>;IJ>G?NG=+4^5~gfhjeH@W&>mM;-r>jHm$y7hlGzD)fu1@27!kK;eF{*(Iu;@MVzPPYChUE%9Ht^VIR z-&;So{{Kq8MEE~k;3cm9hw)|Ve>8As>VE+LiS?g6{==>QrP=yFjT88fa`2z#d^frJ zYvoIXuX2IE9%lXb@n!0d1@27!WAL9?fALAy%vxz82|A&ssFbQ{-d4mEzCoM zUKh)k2!GTCUgGK>fiF}4MS(k0|1kU~)_)TGFLd?KB3)2_fd8Xh{Tcjs^`C_QSX!r1 z{}uf2+ZOFlE1DM{^cE$l+D}4A_JxpxfBTNq6~}8*SM=~S!tL=I&T|vkI_PNTc-J09 zILtl?KB*3xmwgyvue)l^s|a?(+MYuwXyL^G-eRai6dXU7x32s_gEJ9ZjLc@IDAz5xfkI~(e*|i*?4%s9T%kvHwpAE z(Xqzr(%TG}To<=T*LVl8d#feZbY-WWd<)1Md^ z(8awmb(xqjF@xguuB4fn&^$s563U>8) z@iSfM{2(+p!!N~B^S}%?Xgk<8RP}5$#{OQVLTzZ-v?6cWl@V#I?9KNV9_u;IsNCB| zY{mYH=8CqaR#UiXdgNTHD~B~FuUN?-X0Lr4G=AQ1-{zvd7h&J#HVi~@rU1`TAHIMP-8X@fuz&r}@)x@N zCE5G~PslIQf?9B|-igx?NS}Y@(H_GW9@R@1a${*+_Rl>$m-&cZiUV0;Mazne+l(E9%L zi;g>aWk&z*7)Cl%H;mvo?!7<&mY(E78a(&4o*G92P7iyK%6N?zk*M(v3^_>n1lw72d3g*2MD0W;T46oiTnj1^tN#mz&H-mAUPg1UdbNXtFLpIrp}<v+Yy}tpfW*nmSCB$4JSFy~U;4aMc2I44 zOkfjd_}h)$A8tSq`{FN>yM3UoM~$DzYdF86`59e%l=+N5Uv(dBcu#!y;^z5-6X7Q> zWG1*`sP#jt^#auzwpzhM2=?0Rg=}>BLVe z151&Kraz(7aDX%sZJL$o3+2}#;O=yZ74$$^31VeqxwzubrIB=gP{9HkZb@Ottb$5A z(#wgQb{u8bD625CBGTlVyKS~$qK^3&&ii4!u;sOlsztZdUFEjq|cwIq~0ZrIll zUk;nY(N(@*u(~F(56xMa{l=XWq|uvbd18XfZrKy|%Mo#-zxEn$F*NQ%Vvpj_#2(p; zF6d?$NX>Rny1=1UKb3a{s9*&!WCW&vGFxYSrn-MT{U4vw`DF($Oz0pFc{qvS(a_$e zUpOAL%SecFnlT_3&e?tzsgGdLYh(EF&JW_&yOTVJh|MqFh4i+&dzuu;rQ(hjuiRa~ z^vYd$x?~PjyYs^LZtHdK$vSsrog1^x7jQ~VjLDvN`_yRT-f(o`agBwy_!+25P~y+C z8Ge*?rn1hvv(7tkwlA~!F1h9$1Fb+8g8$vzxC@AL%GGJWMkc8zc6ipjbiY7Zy1Mc8 zkYCW+7tFELm?{k<;JxgYKH!~N2Y9(-z1G1OIC2A9=KFdfynXN^uL`KWkUjzWGWg|)J}oQ1n>c*}2-@cocq zeq4{aR%%kok`M1QMr9wpJ65_CN$eGC3BDDd}?nW#dv@TZa13#UL3S;Ts0ut_w`_k6Kp+Hy0G-IIa3rD=;@~aod_wT+#a9ln&|d^s z4NEhWp%co`7hfSrRgfkF(briRr=)5|^awb9Xe+Ns(OrZ{ylc;Arch!QU~$-&ozoAN z?WAHYGM)Nebe;2S}8Vn2dX}%4U(^!33(nt zRhSsy%WWEp!Eu`n#v%vp$T&itb|Vm(t=2v2z#o|dZq5fc7dYH}cqzG0nhTnEjJ*un z&C+L1W^nau+4xny-a%b-p{NU8T0m&ibj-HVtvh4v)1Vn=w&|#W`w#3t?a(#DPtJso zWMRLt7`}2C{ABThzqL;*V8r|G(@LwgDxI`X)A^e5lLv78UHqgt$zFES$oLH{R*iOO zb?HA&G?LE_Z6+nM6R$3Q|NbnQ>-floagmOPybcyJ!zpI@>A#m>yctY5CBIlp1oPr# ze(_D9tM&1uEz>zdsBG;wFKN8|{Bz;%;sb*F5y|jr__;LG(U-F0X{AI-{ z`OAluL`XakKADYW0)hfi;uC_Hh->={Z;5*V8`8%@6UN4`bA&`9xOtgPEr6Xq%(1qtClf zG?4XQrYN7IGT8)Tg^J(hr%-d{8oV8I=X>{PqX)6%J*4iCchAr9#S-h0s5&unu)l{8 z=MCT!8^DyGC!@df_DzrknR`y0;&F7zqr2QkWfgq=cooFKBz>=N(#dK!u@~p&)U5pniuw^HOWl1o`H#fYI)ep|TH%xl% z!jmLh*M{JGf?q(U=_|XVJhQvAeTjn`!k-PuNSww)3rY`|;9!NzPjArVMS-c1C%$;0 zV?wOp`W@YjWWKE3WydSStIL!{VlAuJCT&P&ODrXUJV(DHWRuV17RGYF@i>RYw=r$~ z#=XpOjM(VbBWn}_?OmNxxAS4~#x=NSr3 z2K`Jvju}>Df!G0ix@dx_2=FeJ5=6t>5MF|`I^W{=Qt7exy8%{9 zWd;LKxu)Ll+LgqP2~pAP$N+7DKNgIT?4elC!x|vjs8OXF1_yGkoh@v!v1{C5!$@8R zB82^kSUGp6TxlA^ACWIMe21TKSuupe&W-S;ghz*CR42yZ7|aRRqzo!1RIL|YJgllU zIGJ9c^#i(=xA?;$P(ha%L<98&DRn(C$ngYfEImC(dU92xa8o^K)o-eBiBj#v9lcNn zVqDT5l2YPUOEPSUpUQhIdZCnsoNg4$8Y8H55QGa}&8=IZhy9dhB_RGBv#nYr#`Mrmh=dyn1%Gh0wc1g5*wIUL3 zs&twg`~_diSb!etBKa=5`9N8>mGfZPR!fp8_vx~H6~ic4F`4qUL9m7-KzNK+ZOG+A zSwOwW(u4TewaVqGODnvXK&re=CfZJJDkI?PwD|yK3y->mL$woj(Qagk%Ux|j$?20DGew8z|)5eX=HK+;~ZFOnXT^T-tUkGJ3aFS29zXO z-N}j&q=L;o`VHPM{RD0H>ie@EVV&O4t zBtB`4;Dt*i|B-@e&Qkr-kcauz4%E6&w#V>`;60&u8ibX{`yHvHl`}2yHq29@StZKl zqNI3P=?}+%sdyFut8}&HScah^TE=Jc!l8d*VVQpx*Fj)fDR21Cx!dQsYmQ-$!?WdS$nmdZk2sDsG!N5IGmTwg!@mmT^oXmrELM_pP z#9_j}$B4=-E}C=A=6Cc_;XBRmO!T#%=J@$u;m7rPbte4K%d`@Y=6%YEJ&=qZlGwya zN4;gM0|CeyiA8Nd{-$UY#x6S^e(G#QqX(m`^+m$0ZIa%7Zn`89Vh}*t{PaIu#t^`G zvZ+8a%;P2+feuY`gk&tk03+P~yvgs}2xO$A|G2#uxQMs}GyWW`1f^2}D1G-0LWb~> z|8r4Jbo@$h@qTf@NyKw3#E?T97C}t@G70SvUi&;QShQ$|$D`&a?en+@&4f5%|8=tbS7d;qFhe}lA>U8|KwBd|NK18 z&fkhMQWepwzgM1e4Kw_d@|4SoIE6e#+u>8lQ#?}l8DNty_&4rjQRHTIg`e0b6d2Se zMJ;0+J8RhTSl|1`jK3S%NkAAmElYW*3-|o-wKq0nkJ&C=EE1rEA6(^sAqsCLRWo+% zgKC4|hk)k5#AgE~+i>0HIJ~nEUViR;-t5Reo(UkNY)w-uUHnJKDcX z`5CxI$$?;Lf_HBoC`5zPza4#FPfh5?*=@H7r!x9q-0RPuH@E8GN|XuSrXk$e=amhR z5smBtO#_HP%dQoFwfBdbj~%~xVuEj*uD!VRfL@dHAIZt(=0$}RO~x~urj2-*e8;Su zKTIER{N^fpa=cAa1DB5uOCBaLHoifh2V9w~`B?W9N=IR13r7kuUa1x|q+)mXRPxCO z-X{w=wJSu$9Nmra-E%wIMyt$T{pv}HU2Q)lB-6jD_5ZDFOl`X zj*r*>-{9lf{}cFlZiV6F_5VBgc=rFB@bT>bF?{?VqmN^@o`8?DnebXwr91YY;p3q# z{~dh%U#E}X`{@5qAOBAJ*k$WA2DV@hYf=~4vMpimM&$GFNj}ex|MU55+w*G@dvd2q zqbZj9W-&xEF|8<|kXzk~y&9UCte(m7i+kKDn!1b=SFPE_l&;(vN>Q=#h27Hb!t4Z@^t_Zi}+YX4bbF z1Pb}|JU`K>hV~NiF?7vOPJ#(?uXn*!%qJ3o6%2)*@QRinhpQM9D}T>%6)dt8o8>H! zRt~0(##-!cv#YNdZwN=4T(LdUj-u%0so~aq` zDi%6sIV08csiZ7_m9?DwISk7cVz#c(0A0ZV{gB1F?YCOsv;75XfPH6T+DvwfQt4c% zaY>#LP2GjG+x56H~+3YIHZEUVC?hGI65>x)MeL zF6vUc`Y|+0JK7Gy3}pF3+;F^UGz7eOd4`B{?>G+C3eN0HmY*9Hv(?CDlXAqey%^cG$Sv|R61?G*3XOO{R51g*t!14+dgQGUZA1Vn{$${ik*L)mcRw} zZ>lanxSVVcng0(pXDDCInaA6{Pe6v>N^&1Obq9CuxJHPwZsN=-$?0QZ1gDD;?248j zI)M>9j8cp-g6rAnMA+nT1$;S-;9&;tHR6!zPNF;=wC)WUOKdS-F2-^~FJoyXIL6Yh z1^f-h@=|)Ygytot&1cq#ee8dnU%pp`ZK>-z4h=iL6Krxqwm z+T&L;G|pPy>t{Lr_9Acb5CZ#dwXf+{$lQJXsX63gOD~1;8%bgtZ3*bu29`L5^5GeU za!9AZ-k zpUkzqj1QWx&dIJ0d%=2BZ4x4#>SE{Qw5PhnIZJSkxX!spNTisz^tb z{@E!V6J3eH$8^gF0{wrtq3N6BQgXCy2jQ1+#shff&ey&^t34j+rY3f8rakUs>0Nsi zBOD9KB%j36m+1f=p+kT?@4=&GZ z7{i58E-m3@Ol-!Sg&QM!iFo9An}^#K*Q=QRg+4)%qiSkfn@vUN2NaN-)7j>0LTu%77p*lFVT~}@H^P!RAKtym+og7en}ww{|tWRWEx=jwZAwR&W0=dHs#AS zMfi2)--BNPCKdN$(vrSKl|&pK{r*He`g*2fZ&5dZ@0(*UcT(C85ZJpu{a5ixPdJ_m zpT17`e-WP^Axj^8`WW5}K1ow5gHPw+J_(<`)+Z>yCtb=`{eAH1H-=9$VyRo}+{u04 zyDxW(cCD=GmmyrSFw>`d&h58kDOXD`W_{$$Ud+0azyP8W#iSoRCd_K zX~3)xIm&frhH?#2JA3IC_qP8ty7llGLG{=s>`DJq;H$)%M;6VkF&>REQ;v$ziqf)| z+l5W?7%__`IE<5F#Q9Vzk`@)WLrA~)&4h@uDFnXrcy4?;AtG=JDJCQ@K9La7IfaxE z5{{1~WJC}$f{_044-qml2pLJpfOsJx$-mizkiJTB>Wa}%mfAaJ&&Ni_|5&E-)>}J+s-1Q@A`bLkMgUNNZM1U5=SQV)G4R< zj6Ss9Y#HeUc~#8-w{EQBHi4Fp!y#|6t_~xV=UJ>~48urK3yH0a9cARL!&dl1`AhJZ zk=J7%(jF~=eMCT}i@V`piJ4qS3Ccb&JAQt0*b3}Rww#=w;V$a4^XOCGkXW!|i={r7 zKP7b$@3dY`*%)uX3-e?1iqqx4WXRAjgh}sr`^TcG+sck#mAdW1eB%$W3(DJ}dX%|~ zn}=kR;TTk8^V9nu)@`XttdsAC8n*h}GeYmSpD<5nHENIRPPSETmppm`tTi4omDAcs zWfNf^#w#)VG=7`c{2+`tw%O(8jGk3oHjwWnP!CIE1356E>?hh|sjpO;C1tb; z|3oR=L-{DBq}L!v&B8w@3*r!z^$E&4$)57o^81DK4*LieSychW(0jH zp)VuUm&IcYYF9uFuE8qFWGt3kJB|pO=<(*Z(}~XD&))$rNXQj%S0}*Bit-ly%mMAp zv$8-d0cgvH8qg;EBmmki<);AJ)dZdjXeAk-HBkycJM>Qg?FXZD>j(bweefDYF(<+6 zVZdaAb;)_}gI7i$P_uA@Gy$C*Kp3d+{ET(NcP2p5D`RmoL!fqbKWhl|E{t|ArPqyz zbK~=HKWy&2_${~}Gj}+C9d2!=F`^Zpio4m|1GsNJ=pHe?FoM{K%^Cu|5cgIK9~eL9 zl!idF_`*(J3h$G63AAgy41+f5MysFt{StnpvRD$8W+GP^deU<))>??#%WEVtPZu_d?Y$eJ_2iu==3U}!x7olM<8ATG~Y1VG*0aN@;f-(CxgDI{O ztSpM@@5-)fJQ!-5YXzcu^o|{M*Ld|4xQoCGl6t)U<9zCGom1nLn`?5B0w;1~yL_U~ zUMF)L+cB{OpU!2cj>Igy}<-CF6D--@IDjyimE>%8*0IO=bih3|%0Uil5P zRA9X-xOEPzGWxr3>1Jokt^p*w{A0hlDCg!$UOlP@_bveXYRw@YPb2OnX@=}n80pSY zIE1+%yxW!NW!2a$*AZen-qYuKI)e_X(yUVSOO*JYlC0L}kSc7|MT|PR*62fj zIyRH5P-oyB@WAy42*JwC17*!>Gf7@mnX_CDn(;RAJNSD=MZPVa1I;QR@I|-t4c6KhaLcVkKx!%NPU-Lk1AcOz-6ujicp6H zb*{irDEc%?^Qu07RhHKYd=W>-UVYvm;Q{4OtF=eL@FDp~Wwh1QtR8Ei# zpg1jIf}7qkImT3|S8QSF)$^}7|f$1A^Dr2;{({uPC6z-O~!-eDEK{RJWp z^S58AG_N5xMO3v7xXgPkPXR4NwKMJK^{9HLEN$wx=HwIIE@GhpqRSNV9`!?Vw?puV zv6_jZ7Ul$Htz|J028)PNFC`sP?P0xC0r)3WV~&D3Ls&U;O;v3lC~Wy|;4Au>`_ zYPU(FlJ|S%pBbrY{zA-Z{!LxueiI&nL(Sj5iDj}<9#oUJ3xkTs2*DN?V?y#pBe!5xV4UqjCuVY{y+lZJe9wx%GFCM zpqwsThDF=*4tuNV@`V7?d)v;J$iHXbB+I~TYwXegTQZys?<;6 z3Au9OJLW7Q<_7g~$}C0PItPZMh=|Ii#-lK`=Rc-mjTrgOIH!nC&0;}Twhn(MA-hQ}HOE#X>D|J>-}RTmhlN6)+$`;5C6kBjjA5 zh}|M?L{ zYlhduqfzl&Uiqk?#x%b>iLhBM)Psc2J6xz9Jcp0Q%-gPtL3XcRxN)K483S`F1gJ;)bjX^)N!Wmf&F;QSBi*G|wQp zL-klu%|t*E$OK9-R3gUKGN`)H(p77iuG`@4#uk7IK!G`;SUNZR3pk~=J91(5 zg7?&ZSm0DAq1~(~>a!!7B5)89SFcsMLoEScL|W=6)+yyiXjLW6q|1B&Hjp5ZRzbLs zfJ(YiG>WYOQk89avJ3V7`8s}0p~=A>%TEeLBgcvN-I8*+b~pQtHE>DaDrAU zQrwglXq8TiRV*HLIO-W|&2Um^tqE2|DkMOVX27UIL<<&New#s4=2%GvpsluWXtmzH zPic)NtWthsAbaFu;SidVy*ZPPm6+N)nCV7$ESWX*xSAI%^1W+x0C`~=jigG75?jNf z%}4!eKP=a3xekdGK_4n?E_FnU9C~+r2|O2Gb$nr@8|{uySK9b^9iOT*cz7LEv#dp4 z$Jghm6x6r1(PBE)pMUK`+L>^1!1$1?-?2ei|B@5pZ{pktJH)7h=MC}7D;My$gukWyJ;q-%f35uOXJjHOubxlF3pDtt-RcIf_0KF2T+NbO+K-&clZ${@3yzu0Hwa#$JN zC8v+__X48uiN_KNWr{eCUpoeEd4hP`TClB{qdkWJAV4j(-{3YhyPjtAXEd$vH$bWk zRi7@PB^3T(*#dkVgbxSwf|1FKPO_%Oh~%WVa>2!EKywvE;)H$;BV}wNo1?InQ1b26RPv!zK292eCqU>rO%wU<#fXK z(O!LFnYNM=mFTS~@18BWHqbDt8WQPn+e1-v858! zY``2@V96#RU%=k)?|IJ|$v_hN-|qjvpZ~5u)|_+R`{j9`_qn~#YX?6FJE8N}2*de+ znBX>-?!;R;&_%iqrRyM!=|spH9{hraYPk)SgfSH(5(Y!9&XMRvKg_gWh)w<;EowKOh8wW>uu_Jo(RC;YrUaW`U5cVtKzNBIt0X&=Smdx0-r z+_4%JBly?gr4|eNh~iFZE5Y3@P1NMhFIupx$Q^hixV-bz1m9b#x9AF*(s>cVaDi5c z;|6Uo>j;K~v0z8a5PagTX-lm}T4O0h%YHhDZ*?j?S?`xr^5ITYV$OynTa8t-EwaWU zd-x=>hRDgCU$F>QKe?8<2&{r>@E=%2lSLF=L=zEHI_FqKi$(Oih!!GF=sepZ+ALzw zMYIud;;pAzM2AI;x`>W!{h`$2-=rsg_i&fTUvu{=%&YpzP|^HT(1V}_cTuxzr#2TZ zPGnQRd&s^{=WEhKl`2J%XY(mHRQNCF4PS1&1-wnMw;Omn!QSTacA~xAZrW;0xKm4> z#-1U9$(#Q4c$n;bEr!XJF-*F(W7AkeyLpLE=z>gL0RDY!ZeT23z}*I$Ca!S-_uAsn z0u_W<86B3zou|_(>$h+GUDy+h!ZTbmm!^U@!C4c8l~LpWk;sV)>Lp*$~m`b<@xy! znY>xr9Y6K2PlnUKCAZ$^?wiTw>RY|Us5c91s`7oQ@AUe~4V)~UwH6f>PX4onuXA7a z+6q6jLAOzIe}Gh>SoIVx2qk^qJX|h(i@s`|Hyxc-?%Lzz&m2&}d4XTQC9(_h^8xWn zEQbW!`E@xYKF908tmhWI=yk7giu?%^ytH}6uQOcSVsh$eec8ho)6M9P)bJbs#Q9^g zj4NQc%u?g|Z#jQZnZE{8#xKZ}G5>{Dyq>>2UY(o?7crR`7e*j1n&PGd+)0Mo$S4_6Z@d&56oB1 zJ1Dlera5dVF_In-otBt&b0dzosSS1=J*_bC|YOo_OpG<;Su}>!SzT$jckvfn>+Mv{1D0n)iChM6P4fCvPiPoRwHHzK@Go1 zYRJY7r0t)4`g^1!2vGsQuyU|OZ^Q6dYGd`p&yBP;h+&f400~ZNKvMYjQ*KdSf=5lp zmKtdh^V&XTo`PwRG$_NS64;?niA~!#!8tWio@Wg2L8}=)ec?MPfsg%IIjwq995S}@0Ff`!0s6^2e=bUZxM%n^ z0;~aFboC)>8-7LgXZ20t&#R+|UfujiOp2tCa7icNPl<%7k0q}X@;ccD5*y-2Nqxpy z6RMNM{^JL}qb}Mg04MFAbl)gJOq|kw;VQ*jzb2IC#L$OJRZGk`vFhX6X;o9gl&@G- z1E+moPiwGvY=%?vNjoHUS)xea0aiuZ?QLkAKCXzd)Q!!FgQFg1n zORU=d$$2gZ>jCkP#)ukudsAg1uHyT+A?8~k;HJPWNKMYb$IrDgC5n$)q-yCdUy`+J ze32(fgEI0Yf2Tb2{WCxsClQbO$mvlwIN^q+Glh*3BJ?+{*(pD;47b69A(?mDO|==V z96yrRHxMdpfNT=A41sI(qcZx5Z2}FnvA#RP^Uj0Yp&#?x$na7Aw3gd1?%?NUmGLo%|Uua$4 z$p{E<&3~iv^NJ<;@Kcmd~Ev4C_a)vjMMgmA-Txu}+^UqTC=zl5e zfK~MzRT-vjYM~OeAg0WbVuFIeoP>_FF+G$>Vb>zDp^MBSf_=lNR*?BDBs*o_Agv|h z|J3~FD*1WC&W$C7e$>E zPR~sjyv2$WZU;iip;>M}Kp^@7frRvc#A$p`KJqq5(9^`vr+)^jk_)DWQN0t1L=%;E z1K-lOQkDMj3$QgbLsA`te}k|>KF->84jnG0cuShaK`VsG^hNLJxv>FI?6~hBs90Zf*S@go$-Q8dCJT7bgC(--JB}I zZNNf;RBRi#(+-)Wc0c(~yWR4&gCmGm*QVU|LFyh*-Az&5bALhIl5nfj?H~VyQc(%u zZyG9V1B2Rrbpt=AOpc;K3fkia0B$o_P%pvC?NUA*rLaiD$LGLlBj2RR7`sZp=j7#3 zI;K37lCS-f54%LjpG}(Gj#NGx`lX67DSG=Uo%U`Ux6^2nm3_&nMcJwtZ>MO{OlmsS zC{uq(=f;ZYC-E77V5K-BLX}^5MpU_o2m#M2XS+IwdH+lcf!fYbJJD6n^ip4>QZ;?F ziQG4M?{dRoiYe

      4mQ2mW>CP36geUc#{?PzqJ}4Fk4sJn%>j4NF4;h!`y<|T zI2sbHUig#=&WIVin9T|#!^qH6MI6;eh?qtY}8OA)uAIt%*etF zo}{RCZm7sCD#8#j4uY6XX@Eu!DBSjX5To-zi}DgBH*sd+A=8r)j1Lek6NWC5^gF0y zBPC;@r`QeZi`Fh4SEM&0sFzqL+*iXi;L@90?h#YDLRk;2C6P0=k(PVp23gdw36NGz zFioNeZd8)(=v9bQ5o(8QSlX0M1mTE?EjAZE-Od0CAwUcS0Zn9+@rlS1?bhl#;LaRi zMbo7*r0q{CgX+V;%d+xgI?AFx_vpvS5D~i4kb#gX+$_j!<0|q=Rw9gG5F-b-L>L(` zz5$A5Xk)`{gpcr@)`isxogGy!6_=3{P_INP4;v$IQj#$y{K#-9vaTW0NDCSFut||s zl$JmS%9Kt42!_d6Vayv4IxwOVqFyrwmQesw3Sx9LxUrL%f!G!XZJ;I^?IGDT9RPJ| zB+6#nYy=MEZkJ&cjS&MhAbUGNoh}$fV0{+JIUu7OW|%SsuhvuRvyqb`Rp^}vLN~(( z*rjfdn?FIm(je3ylrf|}3!B~~ySE5bM36BM{8&oChmAU=3(WvJpyw~%ZOhWC-mB1( zp6iUO6-90>RQU7Mh+EBPoTqS7zNScF3o|y8I+s>Q{Si=zv}!l|GcnJA0zU*9Jq!*Z zxskp?Pe%6JY)hNU+T%y|8zaJ4hHefqm?BM2TlsB64>9mCQ#pLOQ_mGD4 zMit*yBT`bNp=ci?ikDQpX#`M$Owh{|+umHs`^6$Hd1-I1(H9v-thG05gfDL3i?&29RkA_O0fV;E`f;7htyNmNkq$(~iZKI~Y1q$vM>`q1T9 zeE@xEa)LgzTNz6F&?)dFPgdDVeaMR-s?Or{^cdF(1HS+lRRPF(Hsu{E;+UiYiKze z=ZJh05!{0@`^8ZushE@CqHP&DE|mkeiaEKF;j^4RHGJevnRMf9ySaM=hjb_4S)Z#& z-|YOnpIbXScW`#Y?X|yQ=kvG*tzmZUuM@^yRJ?u6-l}-3_46E?pos9XT^b499l+Tt zry2ebn&Ab16W)z7VfcHWUm9-s*OSVIzgZfO*)!(VPV2@(h@&fQb_{_Yd3if*j|zTG zjc4PB|vodym1OKjeeB&A*xlS5m8p3fWt_7RMyeVXYxSsx_?(LDpKDWWo9r0!O z9^$C4V#s+C!`&}4{VTIk&B%))`g`pU>ye-PBwvrdcu%&BL zx-v$FFcia9UWdx7w9#@#3p?=6?RqJ_aNFKkjTM`SqAFESz&6h2fEQ$i zAofr8fa$UcaEf@fqsgUMZk20OY#~5{&}PqABZgJ2eLGEX*hK3zLKFp`nrdHsyl$GM zJc+;CxbgT8oyz@QtBA1A)VNW!MyM{rZbr?@Ey9-(w$kcV-X_AFdVRTR%n6&1a#f>9 zIyNhp_v$vnoO<0UyH#EX*tnOMNyH%vxrc$$C=11p0QAIMTxkI{7Qp?^>5Hvhw{}=? zg9SG!*fs6r54M%q%^^}7U%CEo(~Qo%I7>5ir+pJaVm-X@LrJo7`7f~;yd#V?;lM4 z*=I&DV0r;v4>ef#mz)JcFk6`N+VGCcCxTTnjKL~0qSpirl93wFwz?N*i6D@uVaSPz zsPNb{K|tex<=z;)(C(90s@)ER2AH=s7cAzOsO$sCTXAlHOx5G6ovaXr1hKKEHcaB`4ej0nqD?)(iiP`oUnv<21=bT4NEj&PED@fH@IHk6)moDdyTl)@wmBRg0!^Zy32It z;Q-!1sHij$7msFVtxqjEJ;L2pxZob@Mq8{dX`Bqa)WI0UhrZ9um+=3D^Htz)Dzd%J z9kTLra4 zP;9ca9j#)MEE@0?Boa9Ey@ncq1@iD6nONrI?Fl+tSN6lU=I$u?c&sY7; z6rpl%4FT`xm73?bdwAL@Bu-bdLvqKYojB2w=prio&eg02&Mo2y-WiA3IjptXRolpa zCV%afY)k@9m6@tPyH+M9J<8llW)fV^p}TWRO zuQF-4D&6Dfo}bB`lWVc(sJ)0_OU!I@mU&e5Jvi za%*t~yt*b^kBfJiQMtzW)km_qX9N{3WZ-JMKwjX@!m1x5Gy?p@nt<)L$xn0XI<^Qj z^|C^Fy@-egFJWPIJg+ERdy0Hh`-xF}clv2OL1%M)1O$n-LHcPwallU>nK?iwuscX^ zR~JV0Jf^op9&yJ!b?QkK+-l!`?!}n{S?f@HHP<^>m9j8Sb6VZN98U*v`{+Ng z!0hGks@1|E6ilt5;W`~HN;=B;&{4Hzynng=Y@**!Z?g_+U^Kc+a28ribq=Vz1G1iL z5TGGCucq!>&w#9o0id42+~QX&cOcu5*EMn5yaawDtyeWcdPLn6 zVD6_D)x4bm%?e-9aQHN$P(I5+MQ#UB%jscCS!)9$f5nYt^U|yYFR@YWtKq{-gkJ94 zTEYrb?YLo+)&UNo7=$3t8OTJRZY8TTK+yo^&#h&+Y}9S_Hpr)Q;xLGwt1B2}zk3S+ zC8z^nFf80TwzDbq;L|?NYVBq_tv|ndo6kV6TWufdZFJed=IODWT>tuNww?w1OtyN& zfC79H7xARIiT0~s^b=2(aswpLYA%Ux0s?qzJo!)`qa!=LF+65&^D~G2%t0@+BS>xv zl54#Tw<&G^ylz+sa{Kjs4j0Bj2ATQ1RdQpTJgm)1xI~ebvM8V1B58yfgrU51@X2h? zC}nEiYK~?qW0Bz0;=fcRLt@6R{rb3ZnWqf^PosD$SX!ocrlpEmb;n63n|*;hPs*%t z%~|AcmgA&4OM0d&E-EI!w8^%U{b3z<5pkF_;7Gh!0z$b4djePB?1b)iZr^Es4~=Oy zuvRB*1)LLMQVxZ#9MWBfLe_0UH*?>+{Q@8&CNv5q9KAeHo?kpfI=Py16*qT}CWho7 zOL?@JX;{^+_i53BC+QgSR%f5ZMHg>k)DbxisF9k1;KKob& zug>Ml#{Y&TM(%Mul6BtX-FOYhde7&2j>!wY96ocuVrHznWGcf|w(gQje#@Fy>LbW~ zQGUPHT_XEzGvsh%>FkA9%q0|isLMBC4|OvMVtc6hi_IPi8^XZ}>An1K5C6UGqb#a* z;n#M;%I41>x}C0Df4mi11pG5E-Oe=F?qm6c?ucwMHp)&gv&HShYx__Zr(+r16X2>m ze;Iobx6%wXc)hPyc*&z)hBXQQ>*eROnR3I)zB*zmz2qUwf{Kegux-1lyySioc~P)H zP{l`|HKb~J-;(Rd)cU?9H;|{TRPv8(g{YZ<(BQY9wn(5bN%~a8XhZEcN!`J_#s7dqIF~1(@Dty%=ark+A zf5ckFG4Jd3S-MAMqI>40%}6DlxBbmQ*`n9nqQ8aFIIG|Ww2_7&*_+LC z%M68Nws;u~_2pkaw}#8H8AN8!PZopRR=;<+&d)qUy2@-4+}7_UxlSeY$&h*8AA4CN z!Da(u$G#hyf^7tIHr*QpC6wU3sO@oV&-g|)Aq6`yt36fwg2lsi~YCBP2Bfw32<@7 zPI_=`srnNXxSwiGq!#b{(O)w{_(FJ4Ia9+zjAPtOz>A z-qv$hKM4QDlCDQ#Fv=wEYMn$p^I4@H=f7w3QE+z2u`J2UIT=d8ffBKGe(nWHz{Js+ zE1A74oR#LhA8*?MiEY;fR%)!wI~*o*q8kx~y&<@C54iMz$E{t|UFYiVp-H-gjCQsy^g&KeiV|+!9TIq!Bv~Q1kk(KUE9JnBe}cW)hj9h0&c4umyB_jDcsn06{)LE z0?aA}If5YZe;8HwLx%ffc)Nrl+X6xXGr%ci(?<*y-fh>5*v&--bxf;0tr*?2VX3Ui zO%`!?t;aK*s=>lTPio0tCi}=e4Z?99rk$a*{Z@?JgI`d6oN>hH+n}f#Q3Go*L&1KE*g+iEQe9$C>5$o^g)1 z1+*gIZEXues2XREi&_5|=X;MEXGVgggYO>agA>Nt=7Tk%tzbNzL~C-iq}8ON-Nb*e z;r(X@%?+=-!i^8_y*5hl$B+JstxRFDu#K^dMtFe@wvF&@zhZU5j;crY|jXPE#n}!I1af71-XYwJ-)vRPgn}Zxi5m>{s?}z z{{J6-U)LbLXPkq)TjdUT!JryA^GwEC-5%ak6T$JZ@Sn-=BElb?S%Ty55jp{m{|_GD z0z>uQ@fG@YL%Q!#DGY@iE^)&r^xI0N*x%Rx-N)QMHk;vb1L^iLN27?90z3y9L+??T zRQ+Q#5tr=@51c^`qiDht&on4i=+yDh{l7{AW}?gxgpo6kjmK`WSa(*_TjwrD{3F!^ z!kB9aVx{RZL|`oBn>$6dAIiUX;oKzGrCfx6z}hNulg`aPF|u~9_g~dJ@$1IO~Qflf325#;JHdT z!%8G}8W*F0(>v!Nu47d0Q3LB&`PEypY~Q&)WYzGKb-vCYm6b73*-S5X50c+iV*C(H zz7{_fr@~VDsRs^L`n^MymaiD)3v$!oP1lcS7heU}tIz=}s!zhT3YAww5nCyAn=56o zd1YCbgylm4QrDW`R7ng|53FzWAGNlWm2uL1sL_}76cU5M*$|{2c%l)Ne`7G21G>Sf z+}Oqxv7zf8`s%|P^%X8}*D+7-Laj%B{gb+&?%}UTgM}ajF@_mP*{>XI`Vz6(Tk#>ykM}zLjCy+z9{9P{3U<4uBrw zOJtOxml?{Y9@yR}?!Apt1VB{P=5;?{w5>3+$EoKN23L~T8YG=DWn9^ky?u4 zqeKKt);Y+x^f992rR@>%C?$@Fa0v-T{7FbCaxeU8b!j(y=A%Lm?xt1Iw4TZZs9Sg% zO*<{=XxizjRkaYR1rzehQdFqwj6x4u=pc(ns$CKK5TI)%;1V}i1b~Eb#~-t^Knl5g2>0{9TLBO`o^=;I>v}JPI1G8JMSi+cz66Y6-Bl^6 zw#&K9<*b^>ry4@{GLL&Xa2fI8M{v%su{mh7z9al~+K1FvP86qqL{axTrhLgjYVp%b zLt1Mp&p~~cxO%&9lOnzR^ja~my+m~ENmNZ@#v z>%q0Z5`o%S_@~yH<vd(co!w64+q;gnH2_Rf5#k% z#myw7>MuZB%=RV>w2X981s8dSUz?_hH7Vfd1h~2FB5C9X;&jS65`J8>ZJfAn60Hm` zH0VaNL(7dF9|=z)Nq}}jAcwk0$Vz}Afk%<2E+5ru6!PlRHP<T2xnk*fYz#DE zzkCd|I_xrN=I&i%pqaKl#{;3hGhK42h^uzdWM#q#;M}u^ImeyJLj$_baYa{yLChA7XH#>+0(d2K7gj zDziGvp0eaqW)L%ts|h3Vu3NMSe+4XHlMnMZzcR>iR_*S{&c_)ShQFV-6)l-shoJcj zAJ#@7C=w2Frnpk^5)*#ZBG_nmXl1EJG=Qmy>78#(DJMs2psEF5$K1S z1jm(>pdGq~CrdD)rO;({JIS|j!kv6e-@j;$a{1lQl1d~y`u&BtK2Hi5Rwxg|gUW-_ zk`W2(%i2e5kyz1RFb-_!cSW-I$o2x6V|_8GUN4h@`cTnzYE(7!aU}9Zhu)?&?+7+D z(h-8J#teZxgGy+fCl7tA1 zjL{9d+>#C?HK<>t7Zt0dnvXE8$#s*8+*#l?VFNBBYej(VlV9d(RZZc$MJ zKqcj=ff27`1423tNI0E&5y+sbHtYSnBmK|4Ml&$^&Lx#MwpF$xu*`IgeBi5dFfVz6 zr{3qvVsMYjY2g@&4h%gI!NZ8lPe{MYaBhD&(-tS7(4z7+66ET3*EF}k7#GXgKU@r_ zMurLaeKh_z*ukWGjVmPR{5Lo&atZYhU@U{pD2*eri{^zRH+Gn>OX2i~V7b{;e+D-2@lgWri+Ifur!OLeBU17QX(zW|B2^XN>|wJp z-`C+59n9vAX99JisXvvb3&?j;>BiZqbd!BFZ~=5G?NvgjFQoZSscY8r*#A$hHETJ^ zDzN*4O4J&ylRZmKxbZfu^q-huV!yQcdNiiE8t0;fl9_#@K%{_$qv+DPqEs8DOf4{z zBoyUYqrI#_AxkYp1Suc=(MPL3Dpd-}TJ$lh7~~99t9juW5NWY()-baJk`+`DD_gLd zSwtb^xwNW~zX1&3<$p&W?#Wm|KA~eaaoH9)%6ZG)LjER_A-wRsEul5o92AZtKw%?S5umHhF}v`|a&0Z_DiMFmEgD?H%5V z_I8N3K6`tcw|;w5Nn3dfl1evdZ){YzVcbBNN*?9SJL}?uUXrm0FnQ@d#C=_VKz}~( zr@pjWKO6P)Y@R`8W%TOf1uaF~qq`YW$SQ@fQ0AGz)*xf5&|U&oE19NC0f7CyH3}#b zgp-A%ZSx*ifM!<#Yf~SgAquG>L~8Z_YzqoBAZTFOIFn^wN-Ruls?08G%SvTQM$#2$ zP*LJ-mJ%RVrpKQ58Tct-k#7T;0QjykxM6y{66|nT2Gc~YAQ&it3{rv<3Rm{|`SMkQ zfGd|8XaE;T84H*2HGG1S`1xtX@8zhJZfVI+Gc(A|1|Td^ts`LVTdf9KyC(~p_5okA z@Bx4dr|p}0HjHHVE`Z2ve=27_@xKxL+%B8O5(Ei&AdKG&KW}N~&1Ddiy;dJjYNqkq z?4;BRG5Fz-`aCR_7aOIlP{EJcxgTVL6d?F92&-U54SobJV9v!x92o$S#9&Tj&#}(h zR{lElC*0MdF*g*^YHlP)aRn6SMp@V#DQYx}%SO2K8t=k?q{hxKmhfGZ&`RTYo@WM0-V<)jU)p_+Un&ls1=Tb)Hmq>yK;{OJ4!zM z+HX-T_;t_%olM*)a~O=(;U8LTB;ph6kAB^8S)P&Dfbp^LFe*(htmHzWC$No%RxDB$ z#x-m$@ zzSM&Ue3w`_!LP6Cth-E6H>GfmVv3}hg)IX<2h~WyVcS6)@6_c_iTaQ8T zv268Db1oO;-f708TmlAVt?arnbe1izESdXd;@uylWg|?ha*Lf2OX9ge%7DE=dZ(8e z_7YgkEqAnw?4gf}O=)7}O9VRN)11k&mjh`cg!Y8rs?e-D%2i~)M>v&n4`?YABkzQ0 z{nULJ1gj~s10ZROik5_Ywf3%l;x{A|30FWp&u1~?Shq^^5ve*_tx5^w#aozg$xH8a zM%l{i)8Yii*Vwgh1pWBZipUH<09cyP=g5qjabuT`M|O8mzbmL7#!eb34$+tj$#nPz z*`)2Zu~&-bm1>02C7$%xJ+2Q7(NO?ob8j0XHB44Hub(LDgVl%C1$_f?@_cPjP^n z5)?F!Cdld}z+xNAZ2GBe?lszyO+1rLzvyK)VlyaEkv+^CB#)SWjiaB~nw6FHKsFKb z;++++O3#8rRQlv5Eao95G)*XW02>rf8kj+u@aLWn3U@inDn?%?A?)Pf7U1=mziyp| zhvlYfK{sPNF!kQ(ty^osVxG2-uQLxQOCQh#QZ^P(C{V_>ryhh21GgZY(kkaz0Fj%r zxdY9Qsf-{;!RSt`UpCsUGY2de8AzK=JeSqPV-k;2GFm^g0H)nR{wAyyv8mT2LFa0u z3%4Yg1TV9}W`n7~9CN3i>C!Qj%s9Q7IwX$#uP&Pp%VouxzHFww$(SBgA*WD_oVx&Kk`Ml?tv^JjYRt z*A-p~VU|UfbKdHr6|*y&*pp3)YGQ3@%0h$eZfl3igp4{eb^2_TcnrO5W4d^ZU{GL>-)3S2ALoaZLSj_b8QTnPiGTrW5`TD zjaJ=&_%L8+L%lhe^{iL;61aR@kUzcFia|w~&7W$+$uSb9c9WNU)6d^hp$V<0FQ8DW z@@MV!@@LnQlMN3DC#ZRB`<&E+tAhHq&=LWt7AtWqypekLQYZ-|Mum>fFQ^Ri^Pv3d zd&P6r1l2tq5?njoX*N^%O>{+^&7ovu!_d|NRZezo9cDI%HTkU zu%Mc}+}RumQXt=&2H_wtmxU+T8stj!RFD|-*R2r_03+#k;%w%{Y+@()49qqu$bGFW zfO<(7K^4*(9bY0DN0Jsh0*fi5T$^WI;h?W z={fS<7QVG&wU*57_&`q_k)AQV&jAsKyg1^(Mu{~9DH7|lIp}T{w5?m66x3-a9dy#3 z)fnLhgG0;YPcaz{0s=6Ns3mx@T}Gn>|ANd@6J{agOu1q zg_2nFY^BES(F92t*iBo2uU2^nQ*a_kt87w3{HgQD~X7iuNtmFy5e!p8a-mLw8{?;l{5;+K!v2Cdb zdnagjd^B5|`L?HFz$c<4YXmt44Asvn$r@izt>K{wi$KMB^_a*GK#gD z&sKV{2Sk~*kYV6z(Z!}SCEk0;p0jiC@C5D&r_u4ac{!{))L?DG?*&Ke~)NDMeT9*0?A@76g4 zlz{(xHo`bw?(|w$uI#fqv1tO&ZnB-URszg9#1G>Jx=zJ2-7`B z$LY1c*0tNqp?ifuwX`MBY@vA3E#r&ZR`T8e|KOP?SlB^^{bPqn-3HdRtQ+oUgjneD z&fm{k_mVq;B>YFOTj{LReOj^X*f?}@lC42<#S56rn;gasr=2NUbsjSeENUaRqgNy0 zN>lUQWm|}LhUXaRjR{yn(+jy7d;`&CZmX6CTauH4kxD$=YIrz5u|W)?Aj(g_09bIm zbqDcd?EG&9P(W4Ef&yO*UM2eo3r+A`&W3EI7!P@^L_4*$6G#N9=Qenb?(`B{Vk#|t zl=1bon+*EeBQ!li?lorBh=9wc2C8r`YAFsmn`X)-65+yZFwX)Ad|E!Z`(eQy6dBVP za4acJQA|->DjQuOE=MVYS$o76diisq3beEgaKM;AkY>-ZhsKIr2c?gB;qyWLtNtt| z{f{f4BeJ>Scwq{z^@PG^&xWxSpe09rBhF*E+iLs#pc>p@l;a;)QN2#iWj2zA z6KW=y=rnpVhP*z@#F!t<*8hxML|jn~>=N^v+%FTnYB&P%D=@Z+zUJJ4vlRH^d4G@KEVn6@ z#ws$EhDk`JSuv?JBy}nc-4)*ax_KMG{3O*5M&p;&&o2}kzm&@_EP5(^PAdIXinzo} zr7v$yrN6BjQt7`{1<1(Se&3xJy*`^;7wHxtV`;t&V^&O}5&49Fax-+&?U2o^*0Raq zGmQ2m4VL(;gC_|p`C|pR4FKj(c&f?EpXi-@X$60bVq_PZ|9VxBbH)l%Vp%hEFfcNU zq#93l(3elQ?%ha6Hl=-Z=2WA#k&TrWFs=6r z_(-#)=*R3ijqG=us381D(~Pp)6A?4EDo^YD9-e;gjconufU6GJczYCqnl%S}*><-! zGHq$J2$7cc?1wyUsqS!TA|gPojfnv5;`c}22A$=Y_+YTwJhly)-Tp{iCo#(eah-%6 zoSWNxd12bAvjJQ|7s?N9@@%40p>54Efb*GPTip1rW&p1p58dE06^nO)w}hLFB;&>h zierrNB%w$S-7~BGmTqSjv|PZNL0@bdZRYd=63D)Hz%-QvmAGbLsI}Rt=n$aV0rC9CP&pOlTuBO!u1i)MT@Fov<~tt&BeP&4v`vnIeW>N+~B)R zQ!m}PlfxX43k@KmO$AmXg^a#UHC%m!2@_g~*jjNaR63WmFdM>F#tRww4&r8cK` z?#mXY%|McOxik=Xu@KRg*kPueNA)Ua7J>z+g13!>MEEBO1+F4Y!m%mAw(tfV=^jVD z_;O)Dnr+IwhwVCb->Zoru~9;=+__BfPTM)`mSu;9kkFti&`t`eAl_P7`-;N3^~U%> zBaFewvo(z&gcU9`vmeWvhSNglvRWUQ_?oi@T56mgMzLxRx;av9dOZH8TGoHEevWkN@Gg?RVx^O9R7!pdxf za(DYX8~vOty})UNXoK0KlKHvM#n0+6m=S=M5CBy!l3^svE>H-n7)r1)5o z5kr0wz%_?4-WXz)_1f6Ra4I3yd{jqGuq-Zq)rObA}_s~Ti?LvKsG7)ar zZpK-FUo#0-MZyRvHYhR6M=kM78wU8y1bjQfH}}I|=y2Vu;mtDPD=dz*_KX~a0BDe| z%p3?$nd;U|VYw51vr0NBGJNx7G9jAddl^-RA2T~Zcb#%+)u;^suu(s;D%O;`xtbmLVY1uwr0N4E9`aIwufBDMH@@)dGF{;_1V|jJs`=MVUVl zoX;RnXJ5hX3!lwn1ITq&J6skuqB3ek74h0#-bBd(_pfT&#wFsAbdvN`9ajRA6wH8v zktxq~WD^os1Hs5<6KlmVA|ir)FYS}YsoKCcXkZ(u5TUkquY=8K=nLnbXH!U^gXMT` z5o!3M+a#HS;1XV`zQ!cKU^9TH({g4q@OT*wbF-gm4k)F<2hXRX__BqCbj6 zv+^b3;*`TGMD$+$8(JLTP@{RB#w?iSM6~F*0xGM6z;~SN0lywDp_BQjW=G&dPl(5T z@xHGEFHE0^UqHe>aMKpY($K9&5M=8|^)y0&y`c}vNzQ-9_v}6H+fE4pg#yWgTL1lY z!1QN(JvbA(t$^`avk8e6jtmf~wrX^@DitR3iK1zq7zr^y;k_qRYTGq%GdtQ?hz?q;Od~A2=<-mKu!0V86dGzU3e*QFvU7CfRoEo+WdXZrnKD_D=dDX*OZKTKL5L@9onH6eX%hYcMJDYG5 zg!H-z5S$tHau+bPY-R@HAg?iK8xF45Awpw#B=j1!VR_51K4uHkR;4^NNpI`tzgU$` zte>63*%de%oT9*l0lS455pYCIe5FN;iM7E*8;j^nWuuR!)!m4(k+wxX{Jyiw$GON% zI^gu&Fp)aUf%Go_xeBHA%2MAc+Sa}SF|?ngB{(A)+X|*<7tLl?dzsaKW(^U-*4i|* zKci=K7PJE5`OmUD<3D&Fa&B}ZRPa%?M&xBw zyenHsL1k~yGG6Ek#xLF_m2f&LoikO*S5)LXUP<^&sZW#UWO-0gq4x;fqFO$KXxLhx z90)Q`p`Bq{w(`BiQ7sOmZ)0`|DvYyL4MF}-Xg`F_6VNtLG>lSJkXg$B@S(cj!hniO z(UCp}iQ?x!p*g3bUOeWA^M-86e}!d)FTkif#E_JUyoKO*#v&G*21eP< z9twlIc^hOumr7T_TCZRlC$QGz=e2dbL5&xsu4xeyu+*Lr9|<1nvTxYd@IUOpo^IJM zw5NOIBBfsRn(hdudeVAQc4I7Y>%~ebp zA0WL>9v0Z9eW*ob1yl=|7?faga`5Y=h#J3A0j5`G?3gf<8^py5HW=MF+>w+IW;%b7 zVK^5%N!Y<`=fLyYJGSgK`#8SPR(>**#K?EcUU43qyLV5D?B*JR!fos_>m$3TnZ@iZ z#PFYDx%%CRHoMn0u}r1S60wU(0Py!DfSbj!QT|pY@hM*>0<7w%(GL-wP5z7s((=aP zlUp&5gA7N%ck7^qjq(=S+Z()%^5&iOyO_uI1*o&J^zVKrm0EHu{D>IQDjU0A9qGBf zwm~>#Hd}3{JEke7MV7fX+GA)M?sG=~#3#|p$0b!5WtXiervbyr63J|yoZZvy*lx2v=ZXwy6T>7u@M!qM zecDQ)N)(v&#%5;2#HM z2X}d!VB}?i0+0~{0(+cA4#q}u@F#ipA8g+)uZci_23Ea$_H|&vCVzZA{o?s&=0OQe z`35)5%se0g76TBX`FC^e=3g_c`FFtL=3g-3=3kKT0p?$me?hJ0UK6UR(+ue3hvpn+ z&nAgEUu#k_yXA^Li9O3R!=eIq0$|U=;yo4qA)? zl*NSR{R9l%7Fo#wplEim^*kRdW**ujP_?Gg-27yL3%yb((!_u^~r=Cve*kwUXl!Q~youH+=-0Flt6IIvHXijL57bhVa=jX!vb)6Re}lXx=rFE-%}b<>N_sVXP+tXS zxHMibG!%koX!^(|r;PGBLSzyG{23fkZS3kAm)u_P1D)=nJ>k|UMjuWXz}W!awKv|+ z6XYZ+W*M&{)5RfW>-&OPXwPL#@LtKL?SzmG!BnQVuBwnt(7S0Ram*z?!3fxH)$qW?9S`u$Uo;${0 z%CYy6VXs;CXy$7AkBOc54pG0L<{(C|n=0K&DM)L8q9sF$Z#7?oN}`a~rNq z!Vtl{pX6n(vQ3b@R8r*oNM1TDStNOpY}15o$TH2E6N+-V^Gi{EOl+$711BDkVP;5g z{@uiw-ov!SSngP0@$&_mvh8FjIV3A>SOPOhRt22-%mF9AL@x+1{5wf75&GByM1~$n7SuCRR#b1V!V zOE4QH!K{fSm<{6+%x&WmOv+h}6ceUP1vCgqoct1@CC8ghpb1?-3Oo6*O#~gXOsQcx z2C(GDNP;QY*Me!HfN^={oEJ-Y?BN7Bu&~&US(!LLmRGhRul($oTMoj9iex!-QBXKX z;bc<36j&tQENP*O!?`LE@Kj)FttcUDMXcZi*#Zm>=MEGX%N3mLQqBmLM!|JtVSyZx zsgKr}i6>;7Amf=D!$uoDC)Av)EEATNcEML3}8Vw@R2fw(VWw%+a8JRQ*rZc{5v+PpuIYzXmkfaIl4JWXCU4YFZEF(&bEqHj!&s*x)7A}vNI zkF?QbIz`4csNWw5?J^gbyCt^H&h5CeFs;g@c4AYCf*5CEJ}R=X#l<8Bd1|Q5qlidI=BaIj6trBFIC{xfY!_T zYcByoltQgY*Wureu_9wus1*j#)`yT-om!E_ga6lbsoIOy+!*VBnNolsdU%E_Eyl?v=^q%TM+=l>qeL57#P#_Hq zEu&aYP-wESh+-=jJ_5H1R40frftqnKrpE*pE@+6vnCSe>Vwc{c`u)X{OmD^mk+hZ6 z@2?+;1ehfxVi*jG;J6U8dOZh{eHNOG;266S+zPBQdjZtF3`>9yq?kshjBS?;Q_@RO zvyNcN=Kq+}ChsG}{GSnE8nGM;FdLX}CoWG-6ky)T_?HBj5s?6Wt;BFyAd+5AaJ_e@%eFjW#=Nd@;HCJ2&G8Ph7EmR=tB z@<`-psS|RRB$r~I-XpoJ1of$H?<2XqN8|GgC6`soELuv)!07p(E4h5tNiLa$lH{_2 z+`mk6*+m;vgGnwq%B<0kC6|3H>A>~KI67TW@2PkL`0c~n`TV=oLs@| ziU>AiBc48jOH_YmX~gGWsi8doriZ7QDBZ-CS%_?Q5XQ(5iONt_rqWDmD(!^1skG~B zD(!scr_xR**L)S*T5}6*XiNC^h?)05Xi&jCGg(4n!aHJ7erW~2SdpaCXQk3#KpK1t z0*9|sS+^RMN}IS08N(o7zrR}YgqcNWzSO*ukuSqT{i4_AR#^K#K~c9=iu^1S?uMZg zTs`z8$)u|6({*Do%Al$uNw`{wD(a`l>wdhgMRTPR!u1j> zcCV@NyWdWCUg{ODL*%@mrunTki3LAGlO_C2c`9tvkSA#uxuIMT4Nmb3!IZKrKTX-f z>?t+jZ*w3@#VmM8gVIDhqr>I+H$0m!{?mh%PUNCp?kE8|S`H4cbN3q*IuZqM3MON@ z(e6DLHTNDoVbP&uq)OfKBYdLd`hF`F?l`6TRNk%KpL z4pL4U@OVqLB;Tkil{6JU8^ii z;`bU0C*U9d;QYUWMbkN&8mrah50CNR6Z{iy*4?*YFPK<8~a`?)L<@%nzN!H(j zWxizpPF>JOxFq`7(<6j?=+9KbX8l0ia_~SB15T#T9zsRLbCZf#=!)Qst(<=fW9y$k_5u!O zC<<=JAA3;@Q;WEzR!qz(^ubZ-Yal{pN5M39Z#KeWhI9h(7z;%ZRXM6oRHKkZ7p00C zb9>fcR#@&>?d8rh_}$Obig-(*EPo7bcyxXNFCyA_e{}>l{4#YlXn)=&H+Bu z7#I|Te*}7aXR~t)Njku$ED zvICeL&I8fkPok?8qwH5BUuY2n)1<5%sPE%KKJ5VBBCweuw%-$+8vR^jX<*@18r-^x zDM!LNy<}PO)RXR?`JL_ex_7^g4~0pdE~psvyI)Iq_1G%t@|i#L7rm{5Z(T0lL>m|q z{^iyHURF8_+H`{jwhW)uIRS0)cL*Tn7VdyE` zM3wvlYDkaJ#?F}+zO9FUq4vB5=V%-%$*p~7|7H1dJduQ+4w8e-2PX~vfM&+~3QJ_@ ztO?&UHxFGt@v}HoW1Z@vV7o;k(tjAKQpK(b@sQ!~Pi4#fWf_Y9S*uKOO|1X~X#_;C zwDDBWonpl4B1ruAHpKOG7D}4$f9jzcQEM%H8$@720*p2AiEcxxk`8-C8m*Fb;1?YR zuL$r&wJR zmIq=bTgVPJU!R4(Vbf^4E*yKs0kl8s#RXU~PpfUtpCF3lh#JAPsnFoYZ)l}=51#q( z6h4Q~cl5`mgOaK}cjwe!;ZmCu{8^*7p62Jz<^0B`?p+t*?Sq>_y7yEfFwuoyiw>Va z5uLwvf1-0;ZY|-RX~Jv;eW*LEd90FxbG^CI;eRG}Fx93^-&ejY(j6wlS6It0yjtkV4aV9cYdI-b=WdPHfW>^f3K+A8@O_woRv{jze2N_=5AcPZW$(c z68INVtQ=^-(@Hkk=R@6P|Am# zam(DxeWqR_#F@{hB19>WC?U#G`)GrinF}-XF0?2la2#4}QVTl&(xBmLsvr7weo|+0 zzJvwdEIg6qPfiA_M82pUyz9bp$OP3yV8085F9mxREf9~2QKXtP)F<^Xv`!V>geKB! zon8S?UK{laobu|~s{oddR{Mav(8pYT_ys`Nll_%0{6Z8iqKzL+$s|W@fJ7q-?@V^< zorzXueu;|BnMFcKo3#XHrH){S-VuER#XX~w>=^iAP;oA2d7WXYrEl``k*eMEj!WO7 z^sSm>O`qivp)L{v;hg1dlTfP7%U=zAqaTDM=pxp4L$Hw7GOdIzo^ppOs;$GP4>O?S zB#B-qGUQHT^^e1{0fbl?11gYFu<+?pJtt!%s3*zq;i-SRm-1A1LRF??PD&|aYZ;NM zwTGvO6d^wqpm4k`sEqr0)j!pvcZIF65Z)Qz^dKA+k#7>sO@-q(BoG|d2?(O1#V>cp6ij1<$TO9yp=waWXn4PUZ<}yDie_10=6Q`sjnYBV*pu{w zN{_ofd(z6SeCwaC(Bw08Usi<(kfHD}+w@YuJH);Ni)O=O@mdGV*jfhzu*eqAkekDEU#%MYLS&yolA$aui2eWA zX6-afjsk~J?FUZ_bQ?tV1EB!Dd`-Y^O|1owFXmEtyJ5P;PA4^L4_~H10r*&y*J5B% zkD!eZP{-{i1Zg4MvEMA`#wZPv5rt}KwUh@nX5cEgeko|!l$H@9f?<^BxT9mHKK#{{ z$i;R3=GAcWV|qn1xQC1$BN}dsBS*qLk4k<{*|zgQ5R8OBRxDVrpZ3X%HL+Xus#Nxb zV7DkV&DbmOs>v`Y5?AR(+^U3#LFk@y6+?G;0H9i~9@Ob6*|h6{OcA8hFjF#B zKA{zt^Q}{2B{QC?-+<6U#Es=l2AZVSu-yjSU?v7LcoI&91$@m~>d3}&U zc)@xcDN%k(CaIv9b;t8rKL`^4c#!9~kKyQA2J)r+!1HCfMOJ&QoUUhJ@{{mii4aF1xHkI$ z7T;=g{o$9Rnw>q>{X~a z9QQ^Hnz8Ve&V?#yqlItz9Tq}CtkIxoHn2vX*i!n7)|z`^?dpQ(R)P_yaP-*?p-hk# z%Es#+S}gk%Fcj36Kwe`46~j4yM==QV4U$R->P|gLW6K+-!L+}Ts>1u2bnG-;UvfNzrcISwtj?smLDG)WA^fHhlA>*) z4i{9fr}6b$$Nl^&xdub0S!te{B_gU#IW;&MV|6;H$6jH#GE@0Jr6!{WUAelHiws_r zLH!QuM==9X2FwY}A#sZuOfH)WQfrXIF6I>&n-U(=My*|juT%E&rJ4mG=81UFz2HjM zUhqWRMrr1WSjCFART9yb*kivSZ$Xl zVznKn6S}C4H<3bf6~k`VVJTMHX*2D9T^5fJPfv=ivF~VFW;i4(pz<~SdXm52(mT7fV1_et6RBm*pU(X%DrW|QEu|BfsD8>nsP7pl!>l|w zdOeX6Rw$nENTB+-Et?FL1V*hW&pxD5sA7V;f_@4ssS&qk68 z@reB05f)6g6XPHnjeY#KJ3)?QYN!q%3dxR0O>T%A4b9t6qde#!=p=%kC+<9o z!3pmWf18xQXmnL6JukX1yGS(den(tAWb2Sg>x+cAw(y}d=5V;D*Af`{CT_>ug!w1_ z45{UEcq9_!(Us7eh!0{M6dxB!QTLe`it;{TZix9AD8_Dx<$d^^*gLVxwRSnt0_C`@ zgl?dm9R$Rj9D>W#$O~k?MS1A*NaU1w1gYk1gyVQ8CNOeJECTgLT7;bc!Yoy?1(pq#Oj9Sbjrqh1ZKB5LTvZ$|fkR% zf1WP7F3giI^d?wU4s!O6VCRjyinU%&&6|&qWE8nn1N=!vfSs{q(YK4|x~&rN3CZh- zsSJ`xnaR>ACV74pw>?#v#`!ic3a*OEjy`KhCE?F|OQv_XwZ3o34diJnmHe>bdRHfm ziZwhcoHhC*A$`i9&}#aimU~|Q;U4R|-FH2qCZsJ@>PHd_;z1RKZj27Kc=?&)ms@oN z#cu2-*z9tyLNxF^*Znk1xK*1BbG`hRE04Re`>+*doAXtSjjq*3wf1Gk#)?`vvE;jJ zyR3CrwY*Q^5i_3uGL4yV*SIS`;?VO~F-TDrKXijcEp8h;zM>wh=&v+X?^~C)FE9T? zOLkm!;zrbTr(f~%f2EX?%es2CTF|G-z&N6d3vQhvvvN`f39o89T5c{2+xJ6<Q>6T(m}D>lQe^J{I#K`SWr9#PLyZUABM&sVs}Si}*)b z*k#vbA;@}o@e581B)OXOz@^3Eap6-2Ggh10k9hejDwtX>8;h=avKXfJiptbaKK&tr zD?Q!*WWf+!T>X^4g1OaY#k%V~j#@~R=GkYkx~QI1EvW}TedWY*<6~Y|v{Lk^Cl(z~ z>8D%C$Fv?_dNil`??$t%I(n!h_275EXH|XErglOP97*EkziG*S^4-5vvI$*@C-l3D zCz(OO#9I6PXiA4KEa@A(!X<+yHO8-!#FCd3Ws#05Rqs7s_v$uH^j}~lAqj zuW(J1SGc97>8-~T3m&tZ)6w(nR4!?gyLX}UU)_fJ7pBk6M zM#AvFB1Mcu<{)rE$+~hQ&?K9#aB_0#A2jYm9|62ll4E*{F0e$ib2rsibWV42xPuIZ zIr%;tvw_#W-dCn{zf!}vlou{9cM)b!P`DgX@u2JmWKvwXgfH_9P9_dOP4Wum&r%nv z15geNZ&dCZ3fFLP{a*PGmuW%jLC(js0C7Gq&-1dOpa?JdEdIyMVnOx<2%I1H79H71 zQD6B8+GB**R*$9V9)!K+Y-;$>MZ^<<)c}(c`IgwO)2b*E<-9WNe#NFK@witAz9PZ({e2`4+^#SzZDIGraicUx{=?zQZquR8d04qZfPcUfhq^X%!A&}xjP zUX3a8WRL_osXLC+fF2N0;mN|~*EuT@zEN**nBE0#Q)|4s?ibjvJ(F-JDh zh|#8`+Jx$4SAq<0G7e*4*uv$r$ce|Y?mfWu0q{W;UAWq{J*aG=;X!2$mMOGVZEn#d zH86(Z!+#y&q9v~@ta3K|B|ZTe*3{xTT=y7H#9w>`VoC)6TqEr;VaV+a3;zX5FVDN} zQ)|Po@$EU6>(GMXm-M-4jWEpw>?FNe1UC^ZNscTq*Ou5%pXrmS%MbFd(FJE}fa}8S zUe{Oyv8ZJRbE&_$5uh2;Wfg{hOnnF0Tol)#6(wy(9ZxHWv2paJw2~G}=`|~~;&fKO zMtgOGK4dwr64VfDvi5m#>p-_=9EWd4P0~&BH7H+`@{z>~qtZrIs)8Doqsd!WR2G#Z zE}wG9*rbdtQN{{A$>_xyJ;5`$4mR86pq!Sd9IfFFLTxQa&!tfTtyTcVqcSm)&2ic) zXf8>@{(scup&zml)Vx;=-G_X90>xbNk8kqvR_z#t*qp{`Ib=a4|2F0s%IyN-SH|d| zHWeBWkt4=q@~QoU5(aryAFK58Q(+g4K$o7x7I_kR6OAMsW1ZpOjOiP1(K`+oojC;= z+O@Se2@n2lIqA5OpbE*&$T*_$3hmrIh?w*_hivwNY)}p!_3EEn@Do#C$@*o{kwL2I zJX4HB2it({6#4RAwgVO+dN60&rt}?N;nK;4tnF1^e%fk2*>%DbSOMCb_)HYCwp+mp zoPgex?DyBi*|zo3VT&K_Q#)lbfmNvcj|_N}`pHuh^u!^P(RS zBt4F|sJ)^p_ntu2+T>#MwpBm1EedO@xptIzFI&|*(65ddbKHPC+nk3B45>0QeA7)X zobF{8w+eMx#`9vmmhve^`w4mCJlOqe!rv77h4MyObQd)ZIE3(Wk2^hmkiQ-7ru&!P z#}XuU3(Ni3on`H9nY|q%Y=ynW_pt7JE-dppb<2ad_BJ6ZkNY^nHHtWwIjRYnJQ-5!LFVt zyr^u3E68T2ewQhRg4by&_483e3aO6>`<5d(XooF*7YY)lQH4ci7Xl<<3F%NRnJ%bx zbvKbjNn4_4Ta-oAMwz|0_s2RcLsJOpHmOJ6y9=F(ldX1X@ooay%rNv6Ymy!6QG;FO zXXB?YrbZqxEE`_>gQLgttar*lqv|Sl(lA1toP?e@i#|eL`h03FQVY^e;%zlQBWsX~ ztmlu>C0&o}hmE3&i`C{5wtrtxo@z&;`U+f6%nw!~DVi8A#chTqGPmZ{pL*dMq+};?W$XoA}DEc0fjO(p;hA;dbTUB1|V8;$O z+Sl^hE~ScYN_kjeTtEx1KW@)nOd6^yv4|zjsh4~68YnQ>!Ov89a&3YsK>oHWp;FYh z5)vRSK{L}3;O`{K3hF~d0Cza3JHYGYl!OZ?@H|pD`%^(?HJ(T0lddr+Or5Tz!r!1C z9U=mNs`&OfIhKQ_4|Pd77g{5F(WU3y`p6s3;12XhtnCPWN;jx; z<8qLz#Zu;F)mGs@+GYFrv9DW-KD%Rm7w^1e%?YXByBilnLVH!_!k=r&Gf4EK(^`o^ zdFki=Z2B}@DfdlyptZX!*5D#bZ5qQw2dR>3tFz|!(QHYvXo>GE_PDQ|i^1h=3R_(X zk1{*`1kTa6Q1DTR?7co$v1bzpvgsp1>Vc4P-HUh%K~o=It~40Y6@6XDxIuy2tD)2U zN4_5QiyTKArRX)8*3TX*>k{nXKagV-AfD)cQQefzrPVV)D_B`n1oeA@YP|RFqDT19 zl5@5hnhe%-mEXGyc^~$exKE=OKrj#k7)@rWb3J*5-}`bMTaYYxGTQ=~ zbcI5u=&5&-8v-LBCm|rfFEQ%D&o=41HQfETz;*YUxyJ#uq=30M<*VRr^XhjUZkvJS z%JACRM`+C6*(Uz{82$S2h5G6Io$$QhJ_)T|=Z7e(^0Uo1G=J9otWr0%Obu85)=6cI z=hX37w_k=Y%{-}Wc-_+G>l`nh`x#ZeV|9k%B}WkZP}d$xnNZiMR{YQt6j_olxS;P+ zm@8MuA&RtY(NX<&HY_?S#GP7v0X*Ug-iYYpH?{a0ctw_Vkq^#Q{8mg)t^0;hl`f!z z55>;{UYrVN{0>%C-lA1PYC!>3Dkxy(ld2bCtnmzxSGA=KGNH=GOV$s~ZqrOoHtDJhv$)k<_K?16f8)tqn()9X%F4au+{)cmoAP2&W#r z91${(F50JRdqW&Pzn?AZOPj1jSIo$V34H?uGxqt^Fqib*a+nmi94rU_PkHi{8H~&@ zd%*~fC6+bm9hGwX!_I?77 zP~0ttiMizv8Ai0@Akw#jEn`~Vrv~}ChP_ixY3WrsMP2RB^K;~1t*dr-qXy!^%jx+o z+bOCYH?j3;)ynxd)GeTJj%&A!xuDip0l30s=8HP|Pf@`^F$M zulvA(r{4(*rws3!!4Z|KPD-Wcj}mn8Xbc*u`tn+z+kC_k2r9${QCPVBUl^r-_)Co! zZ}jfk+9v$x`g%2zXFD%+?Oh`j&y@`fy=g~z)6Tt>?Q|%bGY!l^b$E;G=g6v5`r^^- zto5lSe*!4aEDoVFpc<23b+4KL?CO_RgP@vDT-5v!Bf;7@?G$>aj;7ML4f6bxO4A0V z(w|dbZyrt6pIu86UWxlm2W#T~-Xui#1c!RU5NU4s;~YObcq2VdPfxr$D6h%s~K@*WmxF}OVGBANX zFcB=Ew0MuD*1IwTRsqpTG`n-gqSe;g)7JL1{b_CMIo8*r?a_ol22g>30^$wP${t1p zQ9=MA@Ap}2&n*ON-}5_vynHmX_gZVO%d?*KtY`hKO1se7P3zEh5vN%~{$ zR}?Y4^JPVZ=UN9RE(f$hwmbCDvEiW-YtB`6Ovs=WcOW#uTSM@J+y8U6L+EvO^%b z^4F!xPoY1F#uZ6E=JR0`iVj#>+)HLvaWp4%#b_MC=kXutK{Uv)auniON5MUja-Yio zSC;Z;LAl-wkq#SGu)!u6*YLi~NAz|;e7vu5e;-IHCG%kYAXzYxEp~zI5hgeqJe!=! zLg}DXid>PJ7nGVOm#b9jS8_WH({}FfXfce2u+)x+UlqI}^5qz<6fPRZUge^hWhMC8 zE-U0ywuh~SA`}XL)F}+3=TLB=@%)&)nvr7)OuQkv0cO#)#`8<^a%)CT7(+^)q@cE1 zl1CYpk}oM2NlLzxQXnbkNlJl};*yjzB*o>V6iN#5gME30BMZhrC0#Y|2=Bts)mjZi z|3g-RfIu=w>&)c%C23?bNe|wB!XrHEj+YdkJM_qC3{#0L*nqtWT|4q)YZ7-xG=2yN z8y!$LP8RQvr6Fp(NhF_P`CP40GZr4mGyh@d{4MJUj*P<3qp@h2X&o`z;V$KCGm~dxe6D$qz5-&x(*pf%dkqgNr-Z zk0*d%l)F%JM6`=PFoDGsY2&C_WIUf^dR7^YF=_cw3re*vqw$Bl1fsVhFFmT@=;ziC z>kT_R?r2wZ%w96#OCe>ur9*i}qbS2<9XCG9gZ-z^Rf88?NLz?rnrZwy7wKnCFRq`w zEi-geOIuh>a`0YOz+wocf^6Z{?hM)nWn&$BS5`_^w9kzrAubXlE=gQg*^0Qhlf)%i zeuyqVUdk`XDF1Me%a3X@URi6EyrA zCU%4W2j#lJUz`Hg#W`mmbYJ-=HR~rx6cHzd%%AOz2}T~@Soz@_&>zKf2Y6){PqC< zc!c|iGnRz+GJmvYf9mq~@W)6Y=4g%RKy%{muC9BG2Tqq2jQ~Vq{IrDMFESd7B&CrE zf3DT9iv!aaxD1+xZ@U@2%N-zSYRf06265}N4%$!86yyASu?2`Cu|~{Ng4&V#*zROK zBJ+rxS5aGaC^1>iWAcDk+D@P6Sa33$Qq9;(^_BL_(ZY4_!qWg+NVR3iemrBh_}PJxI|vG1Y?9A4JJRPwm08y1Ed~Y(aKDG9^hJ?MLGA&s zjk%hg0DO(jq35Ko=#);UrX1CcR*5&keK~beZ;?I~T&jFI{qP2wvDrdrD$N+gUyNri z>5}c|fyd+}e7w_Wcu*xzb(@~G#sl~A;zNQd-jfIGtXGY-OkU~lzy0ms1Kcu>VeUmg zK-6b{yRZ;sXb#Sq9`lWqO_c8LQZlfZ{n|ukU#zJS2Vziy5}3_PCdX~xhrUzXtlVb3 z%|)^HeN@x9_s+hiHC*jNi9*2#j_cvol^O7M=sj*tCU!vs#oz$ zIPF>0N(QFy%hS_8Ql@{9eJY|KGnQXUdEM6I$@#ON_Oa_Dp?B<&?4!qva}pf5o%bZ{ z!iSATvqgkl7rnhxZz=?}1G?k9z7YF*lxv&)o{qZHn@z6vu3jHN-4@AVng8nb<$mc!Oaxh&>fzhz? zE7WqZhgv#Pwb-uUqJP$pjuUDSSZk05q1?m{MLXPXR&O<{4@+zS{-$T+&`G{#RfaJa z;(A~Uqmpd$rdLwoH&{umv~tCIDqc7*G)C6aIra{}Lnjr=%G&0uC zVcb8TrR|SiwO^biO3^)Wl$(Naz~$nx$|4ZwW%0MU$(55Btl|6FBn~m*H3&21>VO>q z&)(oACYz63jyXC{O`~b$^XfK7PiDuN;ofKNxa;f+L(eFq1C#yQ zZ26!dkb4mI`q#YS-JDi`!x(U-r;nHs+)3mHOn8n!%lFh6KW#Isj>wzw(^WMMTaAV% z^e~Hz`+vd{BUc)1zfp@Z5k!h}u5tfG)c2X!SXL`sClW(-&Sfa!BW|PNaTXf_#<}iM zv)oN{-GHpvxL?ckm%1dmuS#~2>>}BfJ)pn<`fwLF zIu@`#HxPtVk8d@!>m@^oMitf_GU8{2nnlJidDSw?-~uG5rS7J{062~#MZwGDwV2mp zUJHY!y!PU?7q70MM_zmL+MCyc;JNZz!fS~co!*C}{NQQE^TEsNyLfh;gPZU1&RtN-(8yNbWj z`}37)8N#=HN`mRV(tB0>`)0=a`U>Tr>YbrK0=Pjd^${)50F87YslRtB2%FhZ=|-f# z!z&T-Oo8WONpqgHhaW1=iH}abr;y%0MKWIe!l74U5TMS#fNeld&8RV@0y^-In~Oc$ z7TfVtmE;NYT*+a^y4d4UlHjlZyi6K4gCKkZx@hi*36$oMlt)q@qX8v~O3EiGpQI9_ z;Z7&1fTRMFdK(Sjb&^~pxk&0|GaI!z3rEh@>Kt+(u)Yn30`BIvtst zGpbbG%hohEC;ktHhWShULh}69UNwy{=<%tfr;o^re-wJQK`1kFWat^{aWvF0j{aF$Y^+}r#$G-QHbtuddhMP2+m!#Aks1 z_Sv7Y*1bH5IfFZ%$CGoeP%OQ~|L+0$Jz~AgwLw-%MQtOWvJwc?Idl_y^wnb5ESl(s z=HP{TU34<5bD8Oxm=Lew!bEUg)=47Qcz$H{*6{mAO;d;)8#gwU>IL!|!(oBk!0Gr) z7s!)iGR((8E*yc(>O+2O0!+dv&MAveWt;AcSO(S=Txkv(L8feJP8qclCV zkM0Lm?oRC&c0%66AdIF{N&2CPhuD|v7T!4Pgcgj(+hOX2dNka@gFX2I5p>|`8V~`% zdonDDXTMQ}O@-d*;@l<~A?G)v;kVRk9jJ?zsC@6JTyK-g^@{bTq9ONDg8V`VP_B1W zKW|e%O@pR6WaQeDX#w5&Q=zC&Jw^z`_> zA~8n8eJ9J;q-H^n-)eF*y~jLFa=y`Ho+dk|)I|#%c$a#cN(J7&=!Ao zF2%ld`InR`)TP*=F8GpCMYRNv&dEyj(Ixr>$DOQ1UtOYa@KlX{B|>n=Rc};i;B9h)f}`Sh z!U5X8k0Dd*>d9-uB)2f zA)o3Y|NiH`Jbx=L@cR4AuVvprzSp=ecurkabD}`r1CfHZK>q^FBMYz_uE{mK)`b$t znz$|i8Aa=g9?K6pd3o%`#Vb@I4Q)l^#?6{sJ1TZ7ht9%k5z9T32ugJp!b!rO7nz3^ zxc#}UW4M#cAeB*l_MoH- z=@jWxc{+h%maAb(dS!YHPG9lDNe@#Xv0z|U3VqESx$b2)aHdse!4KdlQ_RS;ky+#9 zQwnwi1w-xzE@?0uq|zw{l!TYl@yg5;8QaKo0w5ik!hvyVSU8_jG7T;@W-7}_kuGFF z&>3?UkkwGKCxX#-o2+qJ^T|Yv)A&YuHwenN8TjRZDtjgbRN1p7{mh-hfEJ>bpDH8>x((Edv;p}E)9<#e51IX^K3^HR#G;HdIX;B&m=d&A@ zDzYn;X0jWWu4H#kx|=<|S-KgJzQ^%NrP)DXh5yz;P|@3&^!SzV7ZCsYR0l3`sO zZ^6)Oh1YsDP~Q%NZ9I4lrvqYKN6&nNeGtblR9o$xGot4Wr_BZ^rh5Jl7wYu+2Yc z$r~scC!oXlmMXr-JiUv^i&$7oPTbjQbn1ttTSI@#+DtSlxZzhLgy%&Z zb(`t$kUV1+3 zPT%VlH)QccZ4XrKkuNm9Q2w((|C_{3ls{&4k;WH3;PxQ>OI53gZD-Q0A(7nN%$p1ssE?Aav)uQvu4ur{alg7E?Ziwb|lX_2%0$z~bD zTbb%{_5g%>qAKJSf!HS^FdZkK%5)!w$ID2_n0otNveX=_*>>h#YLV~b`J8%@k67!q zxj?P8T3IsDUll_{hh&iT$hybDLTJj>wdktnOTg)d1CWm?(KFAQ7A-(RgLYG}4Fga4 zwtfq7jD6r|xwwkXvQK^bc$bed<>J&it2Xylqp3e<=5A0EczDA{jAc*yIPTQ%sI_)V z9cFtczBun_TEvub*>!DnOhIjQLN2hGrB~1N=;b3get#}ZpZ*pbca7V6N1B86VYeT)ETC+Ho9fMfWQ>fDpWfp+i;XN7B_`145KEQ+GxjeE%9fz7yfTTpfZyyP?vhIG3&L@Y0?^Q}_{EVi z9>0*?PXl->p(3}YL%-e-`Xxb&WC@9jD}X2u?Vnx*UQcR8-;apYZTCXW9nR;$U_!z220NO~Js3D|77Yml37d~8MJos~=N6`XBW)N)(@&XyrWJIrX z<(Ty?m^8^YU5hOfZiJe`fSoK5O<}~QCxgQLE3b+GDKyod21n{fo2n9{7mWx}hZB!_=vAkK9@H_S!Tqx_a zw##?3syEYpxD2(uc&l5zRjpH^V|ttQ9cE)k5MyD{yZIv}uS0h>E4tIE>CR@MJEmuA zXqV!LCPxdzY#z>lKv03mgbKP>9>|9w@`jH=V}5|-%&eC*3kLv#pTO+wmTt|%0c;JQ zu^HGOV=ybb8>D7Jg_L42zy(@iw~H+;uY?yMU%Ea|q#<9Eg~(u#{!0~ZyQ)90j*>wVn+aQBkwksB24{QtLqh{+>#2HyXC`Ap2>{o*~}c_1^X)J}x5i ztXle}qHtAPYpdF6%S-2gBZ#3WoNYqfzI~;VI8T6%vhwlukBni%StVquB!eYg5r7}9 z>o5GM4?2{jKVrO74@)T@!fHaWvF@0dQ&+XQJO9lj!K)1_dp%&4r5IZH-_3klSGDd0 z{ulBJpWMG>b)8kRIw`=RJVrQBEA}+GNr5E_#gj+@Z%FeI)+=^(Rovh{;hX;IjiNIi zxZ;dre_37iEB@%2{UIvlKJmzLul_=sC+@zm-WA>a8iA zPhnO6-{@uLeo?H{d{qa05Mk~ff~w&O0`ZfcPKo;Zma3yyTXl#1M5)yk$I28&F=tv- zG$B^|lqg0JM3dxGhs7FbulzOc>T@d23)I7frE8W*6r)gd)Deyw`U#rneug0Oy$k|+ z5iRKTneHy#udBzbugkugdgI^K?WYk~P&$RcYM|`W_H)?s&-+gNLP}?#EAh0gP6=v} zme+}}P6RU|uS*JC>MSJ+(DJ%0QG~m@T*)QL-ai+O0LUx{`^EE=#3GR(+SfhsjAv1ofv z`YB*t=H@$HVy7B}BRHKZ0MAH}I(3#c6S66lY7mJeQQAtkN|po96Y~PrOhzwXQ-q!- zyQHgA6M8}?$wLNovi>9Uk^Wbnth?%CXUg;d(nC>Wa3J43&zi}(&lzS0NOflfeNG&l z?uHDa$Gnkh5GQ5<6DC%g8h4UmlEud-g$`p^n12$;DbeZ)c})E{4LX3EJ@rzb#^3Hh z(f!bFr>8-S!o`>|4Zs25%OUJZ~u6yIwOj9>dsT$asUB9li z=Pwo1PcmFo2M&bk{SC6T@$FC?8~ba-H_(FuT7-g zEovSKaG!btd#=~0qbCu4#wPZSnYS^)$P8B`>4Ojl!LrO%7qCv#DBwQX>ak`*e+4xu zk-Z97zbwffv6>Ql8AdV~{1RftwL zoJPt*$dKQNeD#pyPJt!pZ1zEv!D6(S2d_u$1WZJE$0&n6Hp7n~{`F5pz(WblGd3e6 zZ2yFa9awP0E{+x`hu7)RGy6@Cj>(-FEh*w8D4Y-HR{{oh`3IFDjHLKd1g%;8kMK<|iz9=b z_XfvEEd5V4V>QA8ifd(atfmZ(A9qHn$j$mpm*4#QS1B)*n6YW9LZe?%tBIUv{M^X2 zGLZF2JW`*`4Gl75wbEYB6;gj>l5JCSq_&J(s{SGNmGSMoC*=#->;&>SWd;3( z!$uPP^&E)7W=xNFl4+ZI9!l$c^sElu{|pCxVrLlcR~|bu-uVN(nXh;tlkmx)iTHruBfkc>5FAE3nk+o*z zBJmP7?yr_)cu}iU&0hN+eRet`_=HI=eQ(CKII&73F%q(VErkhn@FvHqT?7hGwBUZY zthu8lH~6(cbb7AYyI`B&vu{c1UJ8REyQ2--A~w9>AOGrkTj%*Q0HlpAxw6Lur@V>Sk@34i=~6nr339-I9{kh ziQ!44w%m-=4V0nXCI#wQ@MZ0ZQ#73k?{SB1MkdRP9Lw->MHPZGc4pC$3@sy`h=(4Y%CazXIMyYdh6$@kSK;NuIa^5egY2-X<#HT*gjr?4SGp#L@^X6f{b%a1(@BnN5XbYK3+@AbHTX?A>39mzm)Qb4~(7OcoFu_Q{<;Lyawv`6Sna{qBnGiFpF+Bn?+{ihE6X%;c}YBy+L-@ zefFEo8s!ud;q>O8L*4@~Aw`~_#p6&euP zgMsJ+m6TPEtr*O{{=z9#KoA*Xvx(@|X#7NgWqkkxuJvfhtL-zoj^m)wlxaC5CV+uB z-q^WM9)pH;Lpy){A;f-a4*Z@q#smG|dI(Hmerzxbk0m!f)AMMvy|%!SlognGT3VNM zvhNiwMp(XwODj==?d5XtqUq5kJRf?4o6g6=%^_jCkESu&lei#9a)URa5%%FJK!m{n zH-m?dVRY?+5+$mKM9IcXwO)I&Dhee@f{a_( zG{V$pj5B^1fZ$^GBgaJ21!IVK_m&3$ZE`&L{FC)u-fk?VJk~y)qgUFQRZ^wSx=)@Di~*U=>u@<#In>%ZG(8%00t@ zNI?Z|7X{4LGf2GcvyeRdEE^HB1WoreFY3e5Ato9CZutBtm!boJ12L<0E~e!eByO=) z;Pv7*^qycDET_cBCRDDcbI~dAp8UKk`e+YF=;j6$6J(Pd_!J}lEE{3FCQ5dGdtbPUz|(G&@x^&jG5_Ev}-TMMQ` zLT+a#*Dp(#^OQR1VQ+$Z1=MZPs%K71z#;Tbbu;yH%2{I~OpgUPlnvd%UnyjYxL&EK z+e7b|_r_KTGKUWjF&cwlfT*Wgg5pX%w2dCKRZ82+Pl&6iTA!daVL;c&SJJSky=mS_ zP-o3%@e|702jF7nf;~Zqj@q=$`n6sQ)z*^ro$*rytLKv z{{{7L;DCO28D^L-1b#dMb83z!$WRZXL5ZL{wH zH6{8hNITiA=k|igQn{)iKeWVNyjsQ)LN)rfbp=O)57?`A1bb_4%l2$vav= zd{Lx5NqNC48Ap%u0!nAe3(VZD>b&juYzlr2FK0P#AA)t4^LAUFk`xg8OGE~Tm_9=9 zA@FkOnqn5%dlCdeQ~tAxeqE~t2VK(V`WxH|MGiW$1B-3THY2^*He?9wg=!STnKM0# zPqRm%>+NwI-DL-`-F+Rw!P=DIpgrJOvnVP1XyN#x2GTAuSQv|n4+ujK#vKTa!hc<( zmqN_m&QfP`n3vJ^{?4Y1JI&Z-TyN%$P!TvRmFm<6Ik|eE>?InQSecpuE8Vk zhe>?A^%rTwkMS4xS#tt3j zMd6XioFpEi;E@@*Py>FMB#5+We-_*id%E|1^LMb0D&L zs4v3M7;piX8~#J466q+i_7X86DMcS+*5ki&p%OPfMz)rVM|xE^*F|!Au>Yuwl(p3L zFKfp9gR6`jc{=7FO0#q!3ItDL=>>sE9+p=MzhEsnT)&D>Dd)Wa+dlTZ-1yWl5y;(z zj)Le198Rq_J!|g4^rPexMJ@n+W!5niJgt5!@jJ!OF{k!!HJ;$`$P_oco!5+DETn~Z zI0!1a9fuDkv)fNx3somFBh{a5L6MWCeu4?gB;#3U9z-LA$EaWA_Ouz%`&pcIy zmY(fp4xv9H{7tsKj4x7$_$jy6^Xk&`oeC8^F|EhwY=cCtfO`~hsm{|>&ScXWrV^+j$e^?7a}{=;sDQHwYS zzhs1BpZl?|0hK}`BtT%XG{=5vjL44e{Emt`A=Z!f5`;c7OaIQN8odW+pm(noN&M#I zE;8v9exC?djqhwZa$_GgpQUOJPSv#z$*7eBk&^du3JUg6FW5|W@(|{%BT2}Z5%e<% z{DJZLy87~r>ifvLJz2kf){UhZm8*D|CkTRWDUD2qW7r$K#{1vW8*Iq0NrUW7_(}np zgr(E1pOw+N;lRP63*E=py?v_wosQIH*4Lq+&>AH>g2tPtboE zt_%p-2nwJl-xs3a^#mOwEo|5G4>u%kBbv zGxELG8noAWKI?rS_FWjlqu>%@ln4vfn$a1Eq=+`=Ss%O^>&?7H--90BvbLJ2;oMTA z`PPEoFnwjjy?+Z0QG(d#_z{F#N=?t<(EG$MC8^4^9E+^G$?j7z62s=ulP~o6ql_Rd9@$!kdG73`-POkS#{XHcvDyWFmxpYmeMcp z95_0C_Cd9Y{pyu3705iZ0KJ_3>`}$weEPJ5b3Cu?C!5s-9*E*17egq!N1? z4r~^-hTGMtoK7}SEmF(3-WNd&dfVpU8C(~VSmE^F+HJ3xcf4zUb+f3IV8A&o_@J|M zgd!@9vYf!}KRz!E(Q36b?30dWD3@Q7GZoBgTFGoL?atTep4 z!|$g5CkemcjajfOKLK`LOdOe|xdJXOr|C?BP)er37i|&|Olp2b;v~kf;eAf$+4NCs$c43h4lS67>IDwys=|jkCCasg%BGtD{c=eBM6?(j{G5H1 zrN$Yl#nCH&n$#<|Ip@TWQhMbU%mUEKPUVbPasc_EJ|j-=U4lBgZ6RmGk^_p_6kaqk zqm-??QPd8NUH6nECX4-ooeNKgjSS*q4*bo*y@Ur0ffdB5M*jX=%9>TSSCJkpEP~Ty zntWFCeCOU0Rc_JS$@!wJSYWV()y`pBlRKp<=HVZi)r4L^FRLqsO8gOKCGmgMdQst$ zWc7xL@Ik_tnpR~}RK&LQZ5A@%gNc#9>JVmDaoOg%PI`QvoWmUcQ?C-`>tJ6= zai@$7gZk%R!B|?W*Hw4K{|a?+D1=jSzwXDm8W_J0{P89Dl&)X(Ak$t!u7c4>P=6J( zPe`M~0zxF5iVLyc(>&{bHT_tBZ_?Ax#cbk%(w=>;UYneE6imvVKJ||W9Kf|sovGIg*q3?5G+w6tzoZ{PZzOSIRJRdbfCl{&Lli&K?97;F zZSX8YGOg+qhXa1@K;bQ5Mo^CMc?EzA)wg3C8G2zT}UqWY?UD>KLT4^Wc>BmATfyw z%$GA+3dD_XX(TdgKO@dYzHz_s<>*QjpgFs>Ct>aEYXe#Evd*x9NWq)J4!qGtkf%*J zGU5HMEVLxN-;{;MEXZPi9o+EBVNad=xfX$qxHSF}shq3V#ivWQ8h`v-^jOjoPo-t( z8o!>0cRU$>iAfuX)fHTl+*s_({xd}szo$m&Y$}*3IeUreX$^YJ`h|#oVs_Op|G#nDZN6x38 z!s3B?gT#!906ae-<4I!tDp`kP?WC=){_PnhN=JJ^@i}@hTGpsw7OQpauWEDro{xj0 zHN%LmY!1QO1^UlXvockZQ@ThqFScskUa@<#YW2+#Nd4$}sovI+7wof}XfwW)$&hs* z$ArZsD1$4b;YyMdJ2K{nd=ym`_QH>vm}Y>~z5c{66<@M)o(w+PC$fd})fApNUls6U z_ll_V73iV5;Lv;e0mMtH_uA8Esmtt2;MZ>!SHwNhxxf#q~+4uhH1Z2aZtYJ^Rl85_D1Oit{rizbUJ(pZ-InCjjD> zKZ}s&W=C-$vS6rYrobH%oFSA|2S~w;XrGTaRdWBu4^NQK^dQe^p{PE3?z2uPpJMG~ z>`L~E96;{ill!@lqhQSe2V3=?+zzJXmJ*L&49=nj?`q2GSZg6+6@Dz6zB=|=7=JkO zfSqbzMQ)j|Xl%d})A9gT_f{BPEw|+5cuI!Gnh#C3u1N8>h>tlj=h&?ut3|fgtS929 zwZp7J>51Xo8<;?W3OL5K*tfmg)RkDR`{iBvBW4-E{bge}IpdC|^m)7$e3g3*z7J~X z@6bt({FpEeCQi$Yr(Fcl1 zfchBmv9SF02W276gtoC03=(q^wOm0Lhu;S#%V}IKtGr+}R$Ih7a8`asDYYIupQgur znR(t-==dHPtV^hIia&JLja^o!S54yIG+dH#oE?1-*yEVbg_Z)C$Q|XJypR&05F701 z`kY0Sh2RTTz;&<9=P~h4IT<#V&`1TS|Xh21hA&!p)&w ztt+&8bZCb9wXeea?(%@td?Vs(!a2_=RoCMsLl#Wdk)d?!;Jgk zQ_=LJvM;KO1`fOZRh?pk6U0OYemXaJwedV^635O020J*D1ZBh_h8N+(`4ZUhQf0!S z6AFSONKghGI>8k@lLTeHp%aQiy-7$KZ}=_Z2%_5;n-h-HA)3Vic!gs|wNc*UzuM81 zl!MXj_PC=xd7Yk)=Tx)szYiB-ZC2GkUjNxtJe_ z-ilEL)-9jd-?#Nv=cNXJ{jpj(`q!y5PQfv$C(SZ>T8#(Z{;QZtVPdcyW~gYFfw5)KT@RPI#k5gjT|F)F^j~@ z-zO*19Q#~$0Y}W>y@HxF{nFgfvfm5sR>Fo0GU+yhNDB$#*D&B@`;3Q$bR51?!C?iz z&S6OR?|)-_+yC)pc(47-848+dlj{5~XN~7(UAZ+)Mm_Y+Xa#?)6GyTfv@Wkz()FtIztzH_8df5>}J_J*=i^`g(2iS( zD;c=lqJpVbcpBb?Ciz7Di^FeG(m7x4+AoJIrl-Hyo=akZI&C>Gd6_Tz9EK&m-vj+r zrlH(iP=)*A;i5%L0vP5-%FeLbjpq^U;}Kts@hmZQirH~cF5@#|w!};2p*)o|kR(KW zoYhiE(2_U+F00TfTriw`&^3u)aZ4O=$*xW^xHi|bIk-Sn^xj?t)h5Bnzs*aYx0kOP z+s|!_X7H9TZ%9+NEt<$%fxH3DZHvz5%_VQ#_O)%%P~HmVjhnuFS!amfXh%5uH$p_|)|}i!dWEy}wAv z9~^*Ux)S@}A?Z|!c2i6~{xk7%HO^4+A43^69?M3C>FK9(3N-~i#Bv~s9>T)P-Mm$w z$z2ZwaZwkuZB)3i1FxmxEZkTw2;U<=PH>7W{HTkT_4^m_BjDMQ#E-51sx9;a{J@cX zdZetE@%+0u2{7g3ir^O}M6b_J{UrOz>A74nBwdyx!^8v@85cR*Yx1!V9iM?nVza|LHj?KRGB6ncOMt z>?i(MGlWNOkc5|t6a^v>kmlBqEs~#uDg4y+O*mPV8kL13q zZsv=FS{{3a_-}C|VfI<%wlt@%dnD&}Ol>Whq>^1>s_ z(N++!9cI!VL~&szTkIh+f03DPWOvGHS==;6UkJ0iY;n|k+=tBw2i`?NA9`l(nUpj% zI>L9XD|8xKu!SUeQ|OcA0^%|UN1SCAw;^{6uO+m@&Rm3k==6J!*%qCZ>uFzBM!f>Z6_|sym=ng2~HD868{`<^ih*>iv_* zOC4tYVgNnKcod312PehzPg7$Zm?1w+*~Nr`Qifd&3%Dnnm=!(JkCWTOh;Cn>nSDO@G?b3MV?>(kH3$G+W;}uT?=K?uGWvZh>8+s+Jra(1ky>vspr<3bD zav5sz#?8x$C9-QI2SmvP#A#-;D7!);e=nZUeCmenH zD(wE+gJ+uIZ{`F)l`y;to~^+lbQX&XE_Aq%RTA;F5w>m?UT>=$RLbs;j}AvJb$el9 zqT|>Yqm$8cvm`_ch*_3IE^OA>EIsDd$TSxbj}#>~yN98Dkm zA#?AIehU|0sB&N2B#isVsxGz5tsMK-X#u((KX=63TF_7aiVx>1gt;{99z6x0si2NBxzu-Q;v4x;GKwJ zK7SgtkRU9uQR0Td&kBB$_$$Q!<&kvSe)uuYLLmR?nEJ*n**_z%1OY$3H?!*%XYG?f$@&M&7Fbi1F`Bc! z`$N zw)_owZjk4seN`_ci6Sh$cHHrasY%v!BQYjMuE)N=h)y>QA zsmd`LL^nh;PTU=a(ST`wuJ!LM=oic&?1&BtcvyFXd zG>Fr%3KsbW56gd02{(^l9<0eLM#C8-`91rLhV$gX+UxgxVl;+G}qo?A`U0Vv{ z>8n~BBL3DFZlmEDa;HSgO5n3uTVD{vc7T*uvAKHl6g6{27yf|QC5Jn?fa?PMjr{dr zNN}$b`~5XyZpIUubG0=fR#9QUw(OLA#yHSEhE!J0Dqvx)iUEef9Pt#T*qH?UdVM_M z!;A+nqb+U$swhz^5Dq&5J}%wzk;ruiy`iLOja#J55Q)dL{O-z}&_F>tWx^nWM@yay z;IpQbgCUiot#pjtxq(vQHNs74)NTL#J5JmvfmNd@1D$TW?OAkIIw?j0=wFP+Rpg46 zlXYQ=-{N4W9hLZsY| z`3X%|{D!WF#lKX*TEGNmgLU;5Jp#g}%56)OVQML}Pec88WQ*x*slek*8ERM{1u^t? zjU==rEs|SFt4f+))#9ycwp#4te~_qE0ug~hJSW|6e?1{OX~urK)xnzh8o-^^Kd0@g z6WT87*7k+EZ3ewG$D(Oz-Tu}y67?-{UlsvMuO~SWkBeX^{C&4k_kGBv3coA?*XoZE z%v0Zl;9Y*FtSMPgb=GR5p-sVLw|xN$J48Vsg*{w9>LvU&Uhq%F&J+8L3O9toR{=ef zebC(!nj!AKQ`HqQ%-2i6k7aNHzEWVA^{)Ntf9n)3k->?1pZ#AS%9I2Lr~;(fPpE`Y zQ1%g!#k-tH(K(?rxx}TSl#tsaWZ z<8Tl5*4UwS1_qTKsk6#b;fIMIt>V`SI!JZcYFmT}+JmFtoBp8(^!mjv7rjg~dYPnK zUs5jgK@E4Faz~q=2A26IKO? zIXU!@{Iw>46r%T0^^0DPbI0mjm^KNCAQJypIoFA2JP=~Y#h?14w{_J2HEAyR{4vu zPzU{>zL!gQ$KyT=oPW<=v{6$Nxz19;+al$NjMrD&+3S&S$~UDN*{ti`&b}TWPHFGT zi|Ll=;h*cKSH15>{5M<_QF=A(s%gEXEeXB_?C2+^a~r1brR!N-4}u_#17*9yk%Nr-ZP`~_4p*-4^aa_cF+YE*8XLyy5l#& zk3Ir7-<5GY>n7=snjCjaXxIGK?)>gtB1tTS-4Swoy=l41{ynMMJ1+8dv<&x?a%af1uVKs35ii|kpis9hJ*thD2Q*tOJ<)7sm!c)YR z%U{zPd;CfH8PUa$eEcKlWLP-?)@huoqPsRRt9>*CtBH zKOh(9(f(p}&dW;#^ubss{h^_tNyO z11{xNDtMP{qiWbsNsjb+f%>J6H&vqRS`v+ZBmSa(#{OM?swVDLKLa|{&)|K0!RMX) zAhA$U2@q5m4buP!jH9U~h^D%}l+}t_$A{Y;hwnoi3kP`ljI*yfbd&ir^U!8Sf0?9M z>)?x`FO8#o9g(QI-FJW@6?$9%hggugewrhFj?gFR#Rfp3dhrTCfxPv}rB<1NRU#|7 zskz<8LVB&yuTPv0!gAGe6JJO{n*=BC9hH|CyiL+~rqkb0>G{EVlD<8i{+dcJ2-ZmY zrgZummF@~w;utvVWtVQKFW0m4&RJagaq)gnEEG?k*Q~V=TnRUA-iR%%ezU^l8*|k)O0?qzh*pm7_2gx-feLj*Oe0`%o6)@V{$TTCaCoVoi z@aPxR1)p%eoTHG3uA}@4Z?jv1NgCDShWA*LO!={&~!L6h0U8)%uf zBNIK6|Dh%MlO_LeSpH?^tM6Buej%UOl<>kg3M=&vukpM z-t_&erZ@8#+=ond#Pv=7#$0dncO9r0b8Y2m_`L-Xnk_sHZF9BrjTx8~MqmHzB{GH?qDg*Khe7aV=71Cx-cnxh($5Kj@8= zk;Nbt{5eH$p3@bKCDU?^=WoO{n7`1QGx&+Q%K0n*jCN{dF*>SdE#zKj=4&xO$bq>&!43W*5L0^F6R0!U6*8| zYQU8wK!zmU=r`;!^)uqvDsk*CzJbCd_>pDYU(pa&=O2W+MqGcRlo|cY6I5i1tQ8ZI zg=TNpA4wMLk?-;Rqe&^X$@3HHxiC0|=YLnvMZpVsmiD=X0r^O8*CXn= zI5>po73#THu>Xs_q%|=uLki|;zvpx8u~X!06{RxBmqWKEZXsFdmJ^@Pp;v9ttE~IF zB7J^H!7O^U*`Zetk926x8ZY`AJi&Dl(by1AaxV&ZkFE zt9gz+yQWuD`NE-BVESV;5nlprKt2FH>PMzMr%~w989c_j)0<++AEWY5k^C%r!}kwS zon5B#AD5aR>PD|D$^X1T>VH`B$7kkiK}d9Lf#ht|WNVk|nx>aRufG3mnm-D%!XmEq zKbM7a6VIRu|4f0pYWo+7Sm z_zNkxQvHm$iXR~yw>lq3Cl0HTg*@ULWLT~-{EfH@RoRLC`H8ts=db)@RZAIJzEVNo zWCeqNt1DRZxK!{8eBbOL>jBV*Eg+_R|Wfn%DZVN*ngE z48n3^Bs zn(*O*;P~)iSMY-H;X>?24;KZw|G^zRCw#aVm1S>Nm`;Ze_X?hR0x{L+@)SLNmV!Od z(^itd516}B8FB4k2r<_Zo?lV)auH9OUM}S6tTxx}{B+~*c3jLl zi;lgKl^=5nEs}qh>qk6AT(=8Mtg*MKpAon6BZMn`o(!>epja1?VYz%#N)dXsvMkq3 z5+W{_BwG_t;V0%A$Y1#<)l{aqyg%z|HUe(T^#*?pExbP5hd%Rl>lMJn?3oJRrm` z6!Z9_(g}xR-b=qY9UdVq(&tRoy<3MZQHdiCl4$fBdn%)n+82?^@7M>Wntl@vojmbJ zyy^}A4N{DL0}6GGXD;QSFH_|wO{ym8})rK{e5@- zPJKTo{k`ya(328D*%kE1Xm|jm?pbCgzC%0w{r`!)Y|u&MWpas1pb8h!8tN%&cI0SfaD<+qUq5|VKt}&9>;%-qpO7zEwmz-CSzL!bLF9ogZ{V1*&-3toG zC1TBJjM@nz=s4a87uJ)FPErnx{yG^a*@?qJ@uZ!fvReSlojA$=+)k%qlyn2RuUm8~ zAv7K_d&ndaY0K4ijodoC76TXp6TgD8#9JK0j8-1pv0#}}fY__Vky{jTsK_YCXXSim z5*gEYgb+FUv$o`CZCHMYVuf>7h5Z1ZB9O1(bF{*$yv{>eVc(z}#8qbS{95;+(7B@M zs#Kn8q9yqQ#!-liF|ZPEynXiL>fLC(52R6-XDR(7tvUKf8q{Lvv<{N`D*tCZ6*jCHv?D97PgdL;q9^L4ix z#MMYbhhqoKC`7M-_X8@ZV3|KM4$IP~pAtVfFh}KkEfaG(+y@;Qd`5YM=u1(8i|Vz~ z4)IlFhW^H?b30l|LQWWsPtiZ^Shorli_tWM_dxvt^D%2PQEkksO%f6TH+$>WJ&la|N(Wjg7gkBg!Z%?Ik| zQ_bkKIGDwAutFqIu;ZrMYx&EirW_E+Lre-~0IxCC5t;xqY3VTSaJ2)Tt`&l+rq za0@2*O1qy3ry;km%8nCrMNM0zOhH&704AuYDAwB}{^WR3D(sQcg~FDl<%21D<=86> z^hNH1GL4~=sKg~$ZR7iN20}zk+d6AQ^;<%t8YQ?5zSoUw`1LMdCImt}BaUMpBfo9$ z&~@!su}r2lVk!@5u|rU8Q zFj?t-i`z4l!gXqSqRg?^iPh2_dZ#{R?GGd%Z^rUZ$ulFjm;Oy=2RqHiqXPK)J6Mo@ zI^YCV`P<%OU57SVtu2Wm;+*~-WfH&1fcMH0#TWMZ;Ah?F$hRL*Wov=Nl~f4uWA?osq0X$K`rGJIEjJe(6fNQd5-na+7|(v=J{1oQ zmEYIjmMMxsVuO=VaSM6B?Jo-WBfXCIS*>*|JJR0Z5OJkAL#kFJ+N6Hlr^*_QXHxlB zvFQMwnOf}>JVpEX*jvf27!4KF=XB@&XSGtYA4$nBsVh3Vq+|9Szm%`E<58jhO77Vh zj#UfWh64v+U^GbZ&pPXixJwbV_w34y_QadSY43KYJxlPw0fBOcr@h5)JCF9Xjgt2B zRCWPf_TN^Y(B6}(&SQ#a3gF9JCw6{J6?(XeIt-VwGBG0|NYo^I1hO*G%6rvuB-yIh zn&yr_1?C{HWFQ0@1LO=PK33B7xtnwx7Lpm~l95VJCJrDm0}$~;5EQli8;Z^MC=GvFs?h@OpU{I_kfdsl}Y$~vw!!1*X4;Ldk8c3SgRW~oN zYAbCI^$Y2TIo&`+TiEySeSC~L!g6M{{qY|~-h&Zcz0}TjJ)d7g!>QD*JzDJv41kb|q^)v|}J6))^;R z57+*@$MrCXv)(^h4+AsW%UBQBIPINeJsfzv$Mx`Z%L(oM3+rL;&j0_c2k$NaF`zdEV%$C|&4>S1vr|Y3kB8?Ld7DLt7k_MZm=MeW0vvU1VcjEoo5B*8w zk8HgDdiFvc!NF)0KS|6$p+lu&h(|y-p~|~n*2P=N^)6qkxA=YbAcBTT5iFkMRD-qq zA$uD(escMxHoU`dMMv(7*ylbnC4UFM(PFPVP{k1PIn2jZLAO5hhR#r#dW zdQA0F==bMy#qQ63_(t8`P>OsDz*7(*BcFX)`*bieJx*X(^`TB>NuS-=#0>#aW8@L!vne|galh1{A{*Ko` z^aeKaE!<#G=*NRN;IWPS{v_$J?l)rqDdkr1&h_5PXH@ns2}!~pXTS67rmpY@lY$(! zh+(G3!X2|)c487SeW-6#XEGEDq4(vq_29kIK4t6b_i~rTo=z^5)%$dKj~iYT{igDF zz}iwFc;bu{KdM%VN{rRIsU;_g*$lZR$6okoSJ(V2*pFqS#0J%Sr35Kn;god_e7a7& zMV$C>!QF`$GT2MmPg9Qbb_;kZW0wP>1PfHch(F4U3ZENdUd3}o-AM2iG?*VHV9a&SH4W)K=^hq&Q7yJ#K0m-vMcXxg!tKp_DfM9#9W zh4n%JhR#sJ+Ac;P#ETL?u0xpE)wc@Ej468z%7b&l`{tJ2=Amuo&?RkPfXp9$OL7(= zG}uzkk8Om$+zSps3+BJCWW7s}_1YVsEzFq@3o0Xx4!E5pkU#$IKW6Z2PL!Ke|MZL} zqfh3MY7X`7=uD2sTI$Bb?g0m1;&&@b$w{;xWI*V49`6|l1AQUX0&98h z>;>WD_^tE-R>oi7h1^&NiKJlsm3S;&_5(kKc1LR6)tjScxz(onByC51E^LPmdKtLU zv>BL7+*acJUM#*IdR@%mK0ofX;0P+afZ4KVq## zTeZX6zNa>Khj+^!pYhBVU)AQ8U8ThbFaS25*)JbrQ)g}URc&qm#Fx8u%O}P&pH&^O zjvIgN!U^>&6!p_nDYnfz;{kXx3;!te@Jd5Y0mJ6Tx<3&+lZ5bXM^}du2cSyWg9(h z+Rv^``9p5jLloJfRhttZ0*v*Tn^n8X^D%xZ_kR2sJ=BKLzQ_$q@>;2Q6eaiSRRoET z^b3ejHL*ag*8=soBZK-ThT=G#D_dA4-TBm~g|&FC+n>B6JDp)|z`qqEbGaH(S=1vX z@l}-L1WkI{KzE(AAb9&v@3C{_vlKp2KC7&C2|Sm)$ZlgQDAGnh{>=s0v*?TLZl`f^ zCV6lZ4;@8NE*ZOHWe$I~+rG6*#4)?=3tvT^YV9^H%+Bm{(=P+&hto~f9O1q<9V6$T*LDn z&NKR+h6VCWZ)dRsU@xWKa3|krFMW{aB+VyjB90S*+xL>G-*8gPRfIZwAMr}0@M%tR zjZWU~BWQa-;DK`7J`LN=@3F(1M)77RYP+=Mk5-Lp@b&Hul%nZV@ z(ZrDqL{3E(D{2t`p&eWmN5oihk7($mIN}QAaQ5HMJ`UfFW@5FHrI9#vlmF1$Nc*s* zx86*g9*AJsDOSnVtB}0PUneX&_f0L{CAWbgM+Fh#S><}u$VmHoRplg=S~nD9Y%T*I z2}AeKt1=q?(-{bpKwX>!SeH`ghr^(%N+x$9Iey3%IkU{jIQs}WjKyE2lZeiM?}F1B zNlwQP=#D#~pXj)%IY4lwi13=H*F`Ftb>Us;hXU2R5J)$}7~n796sAY-exJ*MyeH9 zw_+E*El}MO7~0NXWQfW{j(bf)3^Y(tLr^6%Qk*z_dSuL}$f^$^K)8yE>PiYYsXRk3D=qu~a_;x^nigtXsj&%aWp6ArI` zo!qp+RYp`RhtWG_vL}+ONhv0OC*TCZ3AvtOofx;qhWhTm^SbP@6; zlB}+Hoc%L30>9)#J-KBzY_8#dNVMEQ_ z_>rR`_>)n?ILMj&#T)q}S77eNgJa!&$v9~-M0V!At7SXo9FshEh%9bJq*i3^)jkp2 zZ?iAP#}cmOEEy?kBACH$PM?XDPJ2=UDd%6Mgf?i3_L)b6FW#nlpjBiuX;-dRf}en) zTGq?kkw*~Aa}UcFqdt$NK2N-?Tv)1`eR$E_BwjSPh3_uS3H3%9AdaHXU3k1JydVBL zv_PO(F3_uFoc8!8wSyphT%*p5$|=ie>;qpRTjkql;bSHCy(<33qE5vH8^F!GQp6;H z>HnqeZQ!h`s{j8P7+{dmGbrX{rejXVloccu<3rAsJ9@6(QOYMuQ*unHOiAt_J|TGT z0JrN!N-X(A@O z+;jHXXP>>-UVE*z*Ip05m`SfMFX{D<#?tGD!ycXr45)Myl}7Kd!P(HZ(aYy)GftjjZ}{oe{IBKzsL~_ld6EAuyRqKX!Q|K>!Orm{G5&(z$$2o}%DzMx zteVszxpBwwXgrU`_?_cw>>2xTGrI(y!jrO#II|z8Jjc-F^}$;g4l3(@BAOrSvdy^g ztA*z&?mL0NiMS@{q=@!8$CxKo!V`_O9-K-ctT;tvAq@fZjz)&i$PgMwNdtgnsqfP5 zGuh~~A=j&J0H@N+<|sO0BD*DlW`+?oX#^MZ>{Ol=M?kN%>lw%A*su1MaR6p@!n9w_iBO* z?R&Mw_qvxEoWr>2^R%ycuRVv`Yg~L3w1BBU7NxK|%ScVfjXZTy80WP!xbjD~&zMvi z<27|~qyh`Fk{xEBmQ9#X zY$1guom$(rV>%*A6QKoe+}=~>%~`~B=`*QoHJl63Ifui!8UCC4Si*FeoxxA)NBwx6WiZ58HE78i60by-g4UK?E@SYWE!QI2h=f|`?fD5G#l5zqn9L6Rg7v_I2h_jV;Mfen#lIpZ$cxZe|eAMEPa*`SnlxY$}~PX(sg$1&P67kx=@w zc@@V~V%JjCClTGHB>y*Yz0I`6Z&<5vvR_ns86spn=R$UK)5Yg4z07iL9{y84FJav~ z;Z`!y(pU@lytchxCrN609|?Eg;VPLQ@ga*Rv@$_lid#15VRn;p?(VV#yVBMWik4KC ztqqc8g=8<27CC6gh)T5N4|=2H)e2Qaaa9jB3c0OO>lr|#EWNvO$|1NPKTZJ7IZb8V z4~2A%xG!%YM{Glc8r;+I29_epK|R@3WT)-E-S`>$ygjU%QG&ŧOEG`6E-VCzLs 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ℑb#H51T5YXWTkF=iCkO_p3rpRrqIG$Oh`3Z1 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 z zBd!GnP9opn5C%~mgNXMtsQG2mXR=jm)V1zEO8E9j>ChYe=&$0_sQE4{fSO_+xW{YE z12x4==;G&9{S9I+xZqNs{tJ)!_GP?Zd+pbGjXXvi!KeGywNCsztLoaT{t8!dUth!I zCs_ga{Zpx^AK8F8c_h6X&W1UeKAgp*T)x=5N0_qpcaSLpNuLgk{mrwNLL~M#YjLH! zM*Ew-j$urfn3mJKxzgjbjGnAIpVH8I=ZdtBQ$#^^C<9;U_5~*Kq9PON-IuH%gS{J^ zw7i+!;=Hr!1L9lDEoI30}=55-=CzJ^xO66|i?(hgCJ5 zw&=)KKEx~9dJ}B|JPn>nugX>rO6kxBh&%rq;M+`?+QY(;&hx)Pu=D)!7=oO`bC;mF zK3jPStKkhzC6az3r9)hF(UW(#He5oY-R)KFLIfa|;en0uH&_8rKAYD@Omw@kG3NRY z*rPYbyUUSyyYOV|U!<^TV;m?Xt~!df*hY;cc}w`QOb%G6J_<~KS+6K%UyPaZ$0SDg z-6*0OurG%9d4T|N1KuQ57?<-T!R_i8*|@4XyMsWShL_2{cz5x>7z15?w~Jo5fjEqP zaYymK81wgY@Ey7-63fM3;ldar94y$ibmRtbEACMFN=8QppCN|_UzNN;mSa~XZY+=@!gCY%Vvz5O_1!dl)470s7fV zGzhj5QV4wX1G@4yEEPUON$G6uf2wQ4RV5NdezX@CMge4uro9(~ad)=1gNztWjU|jX zGuPKKgs}=&7Dj`}50f#Itv!v5*aIC~!uV}rG+S|D)R6r5qz5F6rQpivFb_x;i=ne; zsQj&F;kq=WD`#4(p6uX_+8b8$8o7?RL`X+o)mpujRXE}CaTQ1oH6-7_3OMq0QZakv zm2|_%Myw>Z753ja;VIjH|0!Dt4L^o!0g^)n$(3hNBsOfPiAc3%#ReRcIo7OPS@4L5 zLk_Tv3G!)@qYKj{KeGiJaCo5~iZ8e1dqY8Fyv5A~mkfn7p7bg~WLYT41{~{x!g4^h zpMczu!;XO)a9QJ;4S0Mu4|eLJBOb1LIY4Bj{H`M&0O%vK?89n8mV5ASF7vRU*qz?Z zMMXUZ2-gDlUWBH#WG9}?CZefh*hBy_&ViO^tIm2?Nvn(rj=bxjaoyYQ#PAMbS zbu$3h&yD{Dls7v&aWk**2+A+W8%Msuq0O@I7d}B{jH;7Kk7K3V)V1=;627OTwD?ph zG^qUMKY_6}JF%T4wb|-;3FA#tI<%Qq1X@s2jmke}4NzIk1V>4!{0cD_`uYmyF`ymB#~3tQ+txF^nqxzVBj-Cd(r$T=ON4k8L)`6JGSZTP#2dr)Taxo|U8 z<_2NdcUHN^omb&Q(I0g$5@HCq^GtWC7WkuFv0Jlr6)L+=sG%Jh!LA@~K) zC|K5_pD5c)lNjWXtrlnzuAnoBam6iAc1w-*5%5RGbHg1wz6NNq5a_Eb50Bnnc8niio_2~7($L_un= zBuE`Z6n+$>w$)p!@NXvyLHkjVIw%QJTN03_e}_?!+KqzLlv!$Tr6ujH=xJ}Zpa|WXAFg{Xkl+( z%4qM9x|Rf~m6n3vS|acpZ7A5A5)1aGex>#n31V;2UF>}nm7ss?#Nh|2E01Z#au7R) zF}QN4i=Z%1mS|7ks(>;rtyQnOpg{=nC0tn%#i*ZV1$HoLUh77lPH!<0L>??L$b$f4 zX^8soct0#lzsmbXJ8=sQ!FHud$P6Dq!i&roG>o6xwOyZcX5Z=!;BnJew_mFG{rOOI`KbC1niSi z6=qz<9R$7bO(lUj2DOhT4Prspt84Y&mq@r@N{85!_#Pabj|n_0LLKOeaMxdx1i|g^ z(ffFRdfz7c4Ep2Wm`B+0bN~VO>OWBRxAqDiNN^jSJ?T79p|g+1wWPBVF_JCg?AFTH zzXcjZgSO);-sjN!a0t1974W_%d2K*6Xb?fic-`$9NEs?|ICgI4&=aIld@|hJB0&?LNeKkQ^~q zvvI4kRX-A|Wh*;y)q$1{JU_#nL>-BI4!sSDO+=j@$?+U!^WV`v*{ZKn1p4;m5)t2L z4i8`;iU{O$6!NL44Ksp#y_A5c%_K^IEA2qOpu}H`gjqv7VRd|)nC`YEkB3O812aIr z&yf*_g##9SAzS}x=HY%*=^N;iKUVoWd+2`XtMQ8d<~@Q367@zf=f-b>3mu-~wb0?x zk1iegp4Qq9)*+fR8&`2ZSA*XAI4{FS`HY_c}cjk^&80* zfuF0uugYTW9qqOIzQLO@oTD)r^R7I>!(a{v3Mb%fmFN#>r~dtCb|4@LT<>w|ftWLV zR~n0G4ig8A=E#JLNqD?W!qI~_$^ZmE26GVfMm(~vI35{qVF-uke3*@qYM^%>N-#&x z1(%?8I2Ww^7+Z_Z+QrsJftoX6Up4v4P$fvUe5@BVPXt^?u-#7sOFgy`~0TuZtfJt;AjzM0x_OIU_-v!69{a`d6GC_Acm7JCSpLKOvL)J z9L$?+zCa*DF@V6=0COguh&dH{6^CNBa5>1S`Cy?KgkHp|h@gZtA`Y`1(XvH{V$wPk zvv(Gnwkq4uK}(>ijkpq`9`0i`V_i6 z+i(J_;U#;JF9Yfr2`${ZomARU!ca8elj+rb>6`LzAL|2HywC2=Em{!j*o(Jiu2B3U64V z^0$g%(UD7iqBJ5klg|Mmyz5VREqE8lgXeP~Aykw98tM?L*^8_Ay07teJ1gMpFG|Ji zk@qB2lOD#8FJsQf6bif@9jm#Rw}OssxEAo%S9n|5Lz&olb&JfRomb=VK8e++$Ju1s zPiGrMf6OM-zaNjY!OD0#$QQhA%=h|&w|Jb52|oN&c%1DJVl_VTma!V(t$7~zgMu{& zd>$7+P27l6ba|G|JdexJqb$h~WRay9{GUs(^l}rdX<@Jifx=3f0)fJL>e?`iCV{^r z^oYkf?vzqIvpbSJ_j|G-;b}THB+nDve$LvFPSzmyDCg{4C*1p06ys^RlUWVF7*ith z94STkggEajoF7sG1m_XBxr72%WovixiZR%SYeAxRw}3G1X(MR0n2!Fl}zr_UT$CeM%rI4?$oAN?PdUm?bXEBtTf5y~;^+TMV^ zUfWt(|F^tzdvzVIWt;ky0e!u(wdy$1;DNdcLQ@o9-*+}D;Ol#My=P<)&(mSg%K)O; z)Z=No(oOxflm!LnQC5WOfx`8MJ1Gd;yjyuyk6o$N#qewBO)M_txpS^AI3Z7?EcENC zBFn@i1A+CHd`}>Lj+i79r7=mkpxV+yZ9#QDD_63mUl|ChH{vmL+0v)WxAgDBt6(uc zOgDIdhw1RFUG6nFIUdn%R1ed^CvTN?A07;m^&Wg))_L*S!1PrJuP@gD$;oUz0+K)G z745tPS1vr{!Su@2%yG-k=cc%@1i<6dll1e3e82b~`LL-`l?eE;QdT5uzk(V(wf6;5 zz%Bl`L~=WG(Ro6kfgOQEiV$GO0KA4G@YMYKyaH^V!?mE?rzirEdVHl3tLi`jyFA_3 z&5W$7&m`xp?8FCoh3_sdk+7XPJOr=K69W1-&l5xk4eVRV2w)d$!k5-D4`3Io!XNrn zK3YXD4e9Ke)`rBFdFS>jhu4C85gz@J&c3C!s)ltq!TK{?1=wY}z$wB0q`%+MTDxKIA!4>_<%D~cPO}yGpvyQjwheGCBa9B3ujnxe>^?PrAeP0B48m>bci7B zC$94$c;GsoRFoyRIYhvcWjj1nKLyVRruq)y1dES<$T|~?7g=9o0B~KIz6YQ#kM;4* z4X!t)viW!zc`2`GsD~>7RGwmPSTChR&vFsObu9cVzcQptBax#I4v+#53#(e3JV`B= zAsd@fvpZY;Wm3R3K2;+5dr~@t057mTRM?IM1qFz^Ei3kKiK_bPLm`h#=0R+UdG%AJAXxk+ zvaC(VQMOkUFs`S{U|gSGA;z`X*DyF<{X}%UU|d(q#r%pE#w7@n7V#R1q|><0v8wFu z8h0Z2Bjfr~F6LLXh&ouHP{wuWq9suWOSGhYJ)x(4*@l9BDY0N*>Q`)Ey!b~6Vq(!< zq7KTN5OvUr!+n+9M*Lb?(^DySBqQIEy~BtikXF)}9Z=9-h__2@p4JQ`MSF)OQF=Ry z(p!oa_V%JEy&pyCEs4C-neCD&y&Fa8ohV8lL{WOmEVZ}NlJ-{gv^U#Ous0`nbj z?JW|--lDtMTgKrLh|-5ql-@xkn>IxBuOv$Et8&EMyeLX5~a7JD7~d<;on{qrKikNdn+wzZ$(dgvke7%Q)0p1)UVXu zB0=mex{JLPGXDNidOwQNTRQTNr#DKX^llWTccLhL5Jl<3C`#|>$UDHgBuei~xqx*P zrMGna9AIs;mjx{(C15>SY^Wcp3L}ajiqbov&|p0(O0TpOypE#uY(v4`lvuDg^((cv zNDzCA?qY8>yTIN$ak#INyPp)VhW7?4Mg0DAXb|CvjhsRpOHmNNRT=TShPAY&RV#GF z?@xh0njBpz7yMSV#BWUt{06PExASSm5Bxp}{001$a_JF8OZ*0f#&5_h^>3x6;J45V zezQeUl-`HLg1xC%`$k>9M8w`#9H|?N#UT z8f__Lr(jh;m-^PqII9pSorWvz90lo5Vgn!(rgHaU=kz{LQr>V#GuF-VjYt9P7U$+PnE+6PWv{*ltKo_9ssZ1vhl zuQe9diR0}!wa7%2l!?+PDWqdVk5x3@!&IRvo;~p>m#=^$E`W`aMQ6tTh;Kw7RK>^Q zRj3NbQB2|G%f{$6Odj(dTAY**#3$KMM61TL0a%ki!Ukglvwk5q9ks_v=@6b{E(+6c z>c=9#$HG!ewm@~1fX9u~ykZM9uSCMLQmO-`)&%fKpj0F<$1wfS7r=>NRTpWot^Rz8 zghf(11XSmbw#gzcpI0g{gN?~TQe4@2zSBQ_-n48*`ihO`pUsn+%UC|#xx$C{^uIE1 z+B+5L+{P8l=u7CTS*rFC=_J(dXYC`C&}BSI`<$x1)kTMq7h-c8Z=J&&{7&9XpZM$l z1^IB2yKpUa5`-VPfJ_gzHvB7z5MBL&5W!__EO{8)pUVokY==}dBD}@$D$a`5Vca7Y z8gImTD_*xN3+|5yTekikvPIi+4nJ(mt8Lca(cW+Zuk!X34-4c_Ys)ZB_~rbG;Z^J? z?;{O1hIfmk4)sQ7k4>LNaBHQSu@Ky1qAa*I$UQj^mUtS)m+j#E>e~nJ(>%RIUzFlg z0211g;49zR#K{s^5K-m(7<~tP)edZ%0YV!9OE^~7FWSigYJUUt#S7@?QEznM@zfiK zOTj`o?!-3c_)?~9iDe^@$-f~XC1&LL_W6{6$4~y0641%(kuON75eX))YQsCzd>bx~ zpcFH*Cw3?SVXaN-THRA3VHQ#9saTJ^RxgzTc8e;7+0sm?ryE!!YahVGPnxHI=nj`2k2)79QI*eTM!HDKsc5! zy5l4%&38jbg~GndyP;KI!nJ_04t*8DipwbnZ~9%ttDGJQ=<^X2c{h}YM;ulN#R8a) zqAbA62&ntdY*6opdX9K&1A^GnOhm#Yall9zPmXYyG#=iyorkJ;n+V@PU=w>BSuN;5 z7?k0$Xwj>ocoPW+obpN%-fLpwpmDH%KEd=cwhZ4x_=URGUO?ReuKO3lf2;44Qp91+ zlK|$W&6SQgEDnLz{WVRKZD=Pcx_EMlfXk#*$6;lItlt${$&5g24+S6;brMP8eIfD% z4gOL}hlVg;;I}S`rusF`m68FpP9?>aowx3xw@%mSdaF#w=vQeU0QPKn2>nq3tV@4E zPrc21U)g!XGWHR8A15;35YSuEpBq)}b(3g%)CR1*PA}W|(mXumtJA1;d+nEajXZ?j z?78&ThSrInWfh`XpT!-q$t^YBZ zB5-x-u!uOUJ{=S6P3!j&1IncXD2MTA& zjQ%aQb9uJ*End-)cd@;2+wBYC%vE_QMGVzEKEMQ?BtcZjl{EoY6@NmSRrtORujuUd z5(%_l6jyTTs#p`KxRT@;S9<<)pg~+INm@AKr%NPUA*Bp$A%yA*&LR|{bf6o<)4xj+ z;A}!8slwTBFvm5=&5%#}r91>8MtxDyuUJ~*%PX1NHq)yA2Ti}sCOta!taQOaAMf=z zDZuak=6})#?GvZtTIzQQj(Qvj>DKB`kqDu#PY4m#86JlrV0$7fFc2zv9ULiyx@4_^ z6$Xy9%VS+X7M^VVjT9Cwjy(n34G+~rQl`E7*SyO5LS_F0{EH}n;xgjs#ae=^*zS5&5F@EsEuDnRv$QMZ&(8cP3 ziJ~~y@Y9`B^ zj&q&m^fSoi(F=5t>qRnM*@+qhduN@^Rfc}YAI`J+G*HaWR$WR;_}a-O;=eEA@c|y0 zI6RCwOdNQWh7x4rfHU<{LSwdSDkZ@Cb|7C+@UKOJiFJ8urK7%N!Hf)$uT#RTY}Idg z#d!M95()d5i(*|K$DEFJ^+*OIb}tz*bYy*}wYxq(smozBA{4hEub~U9z`zt6dnjd_%_^$mKMPdW{6JDbYEMz{% z*R0jUjU2!DbWdHjs-CidjdhfTk6i>D^ZN6Rc-qD1$iPEkD!~YE;pxVM$HaV24*J7T zFCzhLJa9KPKNv#P4u zdPHiMt7}yUu5`V}7xKZJN2FA~bn%ERfw`;miFioJXD?Qf0zhdN$ZB7<6kSdi?-p7H z$d;c9Iy_N1ll1VJ%98t>E2TO>=5vhbCw#k^>F4U~atc7O`dE@;5ceZrQ1s(cssm)c z8X|8i4LC$NNBtEA;O*5X)wQ~-L_kJLb%4z090eed2YkDkM4mkT5DrdK?a{3&uiq9;%WiAvkuSy zeil`D0CPL8GDHGBb8KJ*hRBn=HsH+%eocd)IWvbU_?SlNGZL-53snCmu7!Cc;P{x; zTGd54*f0N!+=!1y=-CX7tEev#V2H`%Z_nci&9Y+^Ja<|6oCe>AD18ExqZ5xs z)#so)ziNfr=z|(Jb4iS`awiwR96Peijdx%k*@EXK2Jrv}!^dxa1`R~`I7Q2#!Ess! zE3NE8z<%vbQabb$<;ViO4^Qg`GFDphTj{bll47`1)dDBghR`D7_8}H5v^?cW@jm!Q z$7IsOd0s%iaGz78RG;z$93JM8sX8VL^d0+ zgc>Y#6*^G6s(nOy0ksNK%w|J9WdR4>_7@NW2i=UTdQ{XnD4$l~a9Q5ku!=-DgIq2| zm{CGKqukC443}G^q7g4^Ea!pF>|rcdq63}LZ)?=mku6(ai)&#{3Durs;#VjX8}_qA zD0drr$Ij1yaK$B?4fRpWZ1q-B!!KSS^)~a7u8;$!Z#Eu1ka2=zNG3{;A^D6bP9bFt zC1*NVG8N8rIP5}BDf(Rv981dH#GL8G8+iuV5}iSEw{mD_kgMlS3oGQg`AX_6XUZRe zx+veI%6Ffl%NcHF`94*iG35@*xn$$Yol7>Z$Y-AVcyp?`W)J`DYhHK*SKUm9NYByf z9c?of-oW*D+YFLol$}!(;$e~9c+BG+EN8aMLjKFR4F+S?tLj?)AG|GwD3*F1*{VIv z;aU96ys>OG_@rvc)gB&n<3RZh`L66#mD6P@bH&D+Wgo(E6{7&mYdw~XYb3}l8-nLf z24^~3brB`NiEBt2-TAxB@yjCIewjx=-r$hy2|0ubFN-MwN3$nW0^nsE@&yT}Q9_(g z!*bMy9H&UgNAr3l$2smR6mbXMpWzjw@YWI$Z!(7iFM4?14>`#pfhWtUg`VVglM|Di z*;uJbjvFg_{j;ieh1o`_am#HK{rFd^_D-{D+Af=>J7v=Zi=QYfV3!7y18O<~bo>`` z@tdPpCFT25QYkGW72SwbvlNy3LKP@E>nTb$L(XJ0t~6j4elNN|G8Vmwx-oj{P*1gs#zGFkCZVRIv2-{>crk`$zz zWHh(+y{^;*tRTT0b1z%p>zkT@6(l&?XzQ4J1^Ql})s&#R5&h3QCBK@9A5# zYXVk~ATqwEZ;{Xh#`xbexA62WKCKB@K?#w~eSM3gG{GpF`}!7xpH_A-HXksz@bxYF zH32Jli^$Z0zQxZp!6;J)`WEvwfid+-05>sIpl{Kt30M(7uVr=Y#2NT0l$F2G|IKQ8 zV3z)`>A}C!|1~}Il>YB)iG?3eEE@N*#JXM0lb>jw93&vlI!Ufn$T>BNLBiPTV{Z*WYaZ)i;ONaf!a&5V0Xa zx}iku$wcbB8XwXo{oYcRLdprhx0Gd&Vt;@Xwq^qxhDQDF7OjMolRiMoq1z>Zl&J@i zvf-e*JO(MJA4JN*`)B}CoDU%dz0BT5H>=)PJx#w!d9!3J8P2At^6Q5P}oATR0Jp>Lki zV(zY#1dRiLaI9HPsa*4-bHCAeYS8o$M>ziTzLrS6d+PecqW`!OP;%-!q>HVH0T~kO zeiQEsDiWzo-`25heYvr*NBY`>S+gvwZ{MUvN~(M_o{_d(@T-+`LbUdE3=p!H+ z)3tT15RGLaYmP$AQK%W;wY5`f#!2D2o!wumWQsILgJuF~#&vCt3C&Tua9sD7#xqHx zV?cClW5wfLTPuX-XqK_!SX7J$_fcJ2zaTXebm5rpFQE~MV@dQ;5FOLCm2^tMkLbe6 zMAxGe6J5ci?l0|6O#5x@S_?*r$5wb;6L()ngT!O^dzWx}h^^?k6xXis#J+8n69&4k zyGUwRcr0z}+cCELx{jg}(qFD>KGL^sOjkITJQr&U){x@6isGoQu(NO5cv2)ah19Iu z(S03H`KXd6ozNA=y05zgg>Xg>9$KDy;CisY z`6KxE4!Wmn+gN1JeLppjdM4iW%2@p0wr)ooeRSK{QwL6cW=3jr>V-w)f<>o&w{6|7 zwskuz*33u^%s6%PsZWA%(edjS9s7wHrw%YN&Z&3;lobQl1Qs<7r{^hK3ZShl@_-6uq|0rhOZ%Z9}781wd-`~E^KO=3abIuym)_6)> z{)`}10p1yBQJt}ghKI0(o4aD@SZ(K(4P&BSobyMEdkkz%TV)7HIb?}mRUzqSjTS_><$Pw}37|8)f4vP=RNDeU4*FGF0 zIl#!SDrY>lY049+jcw~jCU3;c9)%XJYfH)gIQ2wq#pP#>#8Z3XQwHEL#rvKUKhdvHKGk)At|UxAo|@tG8Oj<+ju@x->B+*jY)O zi{1Y?DnOSQi|j|*;vhXiNCDjU6P{56+>8f1$3RSQVx!_{OMPjasjm!njtA%#L=np; zh^S8}QAdFkD1Lupe6VvID#2=Q%W30Sp`D~?j|SNU(n9m`@qwMVt5+pH6WhaO8Fh1Z%OJSx~V zrmZ$OF?RoYp;9;7@S-FbsX@n~Bsu?Kc>w7Uw98)jebJ zCmb7_;$Wcm%^iFzcGaC!{?q{FZ?kec{%n-8_&XkD!wT2Yv0`sLj(_Vh-$NdplX#OP z3_S|;*xVKy!Kz{8F%18?FQWngk$w)qknXpNoHKUWrlTtcSOs($c}yj7!(?9tq+GTM z>$MR;%vGp)7ho(n2-TE7bFWFKw&Lf;zutuD2kWRz{G6uL`?J25xcc=3aJ>mbCU(u` zz|onh)yRyEUGqz9yn&yS9>kBIr3sKdy=!|iR)VP|&LJ&8n)-|WF!25p9B;0Su zi*Q;YnhDm_o6V_R&8gRRtU+n>LZ~8D!q?RG%E-*rrpr&mB7EGb>;Goav49$f{X6cD zsOz!E1MZJKjuQb|{YPwd)3kxPFQe6$PfaX519xx6E&ExM{H|V-kzb z`8@q&OxyHWZpImtSX2>QeqwXQpv+f|xJiC&qH8tKEREVmxZ_)MUrk)y&u;uyOZ>ce zOZ?mM^JP6C25H8cIkgWh5)+`KU@n+1vFNn1FeGj4(v)Y@gpOE7EI5#-EymT*glE$p z&{$c37A!K{j{g)&n6|`fJt(Es+)-AGT}zAZtmRav)=_OUVo4Y)dEq3c#=wHt9Z{?jHM`|dPI`9YJz`ykB3f66(5u0**%~TOI zXCH*1p6XH?P+j&u)Kj3QUd`FKA8$2`wk7*f^l(im_oAI3WV6y2 zoIp)B9=3u&_O9v~-t?B5IkW)m@oJ%sY@bWo5s0S2Rd)@+*5HH{-lBdxL_d(wOqGyz zQOz7y{swniLxo>g3db%E!G}dRdfQMIbmHA^so`S{ zyxSI7VY}SyJ!}=BMh`03jXrNkEveynkX}5%Rtd9BW;Aa+Zq~XUb#q>)h~#U?&sonF zzE5Fy*GwWI6nX=>AJ*{rm-jq}{+0Z*8tS$Mtr)spsiQhzMl1v0&osm1(6qh0^A6r; zH-+yOaody>2bawAp#464qcN6$j>WgD;oTU^gsjF(b6STNSzA*B!pv6I09ncO3jb(< zF3ZvBnafqrZYB#}a!`6_U;xOIo&e8=qFef!Vh|LCR?8jHHeHE#fRrkET`^T>H^UGa zmgS#>U2f6%l)+bS6=!}mZ-sd~c^)hWmGIsjS-}NQ7bZ+Qxb-c1@aZB~ib4vB<=>-x zKw2JKm*n*|o|NKdTDv@UFx=5V4~RuO@>pTyhlJKQw4y(%pCt`EN7Fzsm74*B@|?(? z5j*Zgq#o8_qk1~O6T*L}tQX^(VY&tVY|!oUqG{~7q#*kb)fnY{PzPN}8q2(-ZioU) z72rix(M&gYD(Z>iFpAiSo(wgxY=Ye!R=fxbSPb?X5XQ_5f{GLo0Al$UP>I)+RAn=q z08EdHSTcDmM+q&%2CLV9kzuzHpHLT=`wSo7{%(bJPeM}FqJ%O z(8n1}Np$FZi1Hb@eJsyS;O)w4AbK=*+*fQ;Z$*`A*d%QktPs%jCvOvArV;@?-r;1}8$&1+GPkp|NZLzU#93}A6lj7!WX_zSebIOI^K zCx8IXjkO>kWG^toOq|I}pi_Dc#lcE4jqXGy`4kahnd+2w8zAulVS7lHgP3B|X%KO~ z#?9A4Hq0inf#lE$-jiO7^)B!jieOrh`68A??*RUZXn~T}m#szu_hv zr!q@|m)?je5`SJGbDDq9tI!&Rx7199Hb~r8V~bj{U>Snls8o6lI{tYQgd7k^uAyl_ zguj?uQ2>8aDJ*!9mHC+-t|w@=8E>&m4``0ZaED|c%5PUNfcA56vbLyO#!}h~pt_~z zY}G9RJV^$lYNV_psBED@oW?me!HMys90F?s(ClG@`gj-i33UU_Fv#`nirjN38rsM5 ze$s(Y=>%mt%V73J9`iG(-emqs=EW(YKBl68y)q6pxG$==;t%YITj+^FlcXaODy|FH za?yad@(3eFz_S#9KE?gng?f^NC|R`lxz8i6Q*`EF_SbL>tGP=Wc^dR zAtg;v8uTcWNL!5ddy2I`3IbGZ7&U1v;vN^%X;6XgA1@|QlThn^-tblYk&!uPzqCip z$w7hlP=yk|>h5Xg2$fE*JPIpJHk$hr=rWj9EFShGh9%%CnK0|AR(j8Ob+0EK`7 z7zh1a%9Aza&<2#wc?kn7L%`1GNCcP!Kl>5$A?6t}J*=nr%sx_J#zRR!1IIECD~ANP z)Lo+%I*@RUv62#dy_zslaea+g1oAnm^ZRJL0ct2xRpN30Gwy^rRku|$#WHV!XXt%Y z&KV@fUx>E-lp(E*CAs;6R+B_f25+NMLM+cc&%=5bh-#aqqO_`Fw~@^zn{K1*Wu(tk z+lXM&FlQ9=95G>Jn;v5uH=>l*_$-HrK;2r(0$p~EULa{r^#4BoL;-fmNO?2lYmV=J3>Q284E! zQVG>cQ7nki7t2(Jx8qSE+6dz&&x7G0R+ijQ3&wGTPS%_x!@5MTY*jDeW&z~OtR?qB zYjt;Cue(|3$8jK0TizXKX=2Z_MRt-VHue%DMD|V#C+ses^T*PlF2-$3b>&`6IDN= zL&fm`Y^qqs8T8=xhb_^jnqzt(q%2WUI#5*XVI?F4qJyQ3_(KJ7%4NCRl;#oLGwUgv z#EdMl*F>JDq@aC!M1odGx?IMpQ0ca0D2L9b;8=CB)|I^p<6mPsPxY6LqL+E&XL!5& z)KUyW)-kL1LvT*njsf453Ti;9PLy2@H!Nr~;R3rE71)9-bw|AdV<}vc=P4MCqCa~A z9KS_-qty?0YU~sAp~pUi0bini1LV^~2e+ali_38+C?_!_%F@_zL2v$n#eio|lmBir z{bimmsnE`AlZDGNY^UUI;smh_&5A=h)52Y7p&Ef6yItBWT_-#t%CJ|P3cU#%O5TUReW_R!L#=_aP}Twi7zeSD1L;;z&sS5wBzyDc#MlwbLzLO zSo9D%4B@&RKS%w{ML%-UpqYzqkpXsUVA`YfW8EnIOrg?`Ii(*{bJsR6TF6B6qU8>r zIBQPf`3yYXf(L2eiLd;)sE9)z9$imG6Zlvgm9=;LnJCLrXl#QzvG9xThiBzuVN2ec&-BHnh&=&=s8;h;Y)Y4=Pc}|s@wEZy zV^gLx180>o1!f>+o!rM3(g8)v3`nI+c|Ay3C!|w_G*qO_fK;sj5HPXW6D(RfW5;CX>W|FV z&g52{FKKnm)x@4#Z)#c}>U_2HO~gTBohCeW?3CKjB$e|Ew}Yd8Yo|KHOzmr&sr^Z( z7JRC`3FHBMN#vBHn;V5+LOJ{;Yj&KwI0Po!@_h=G=4k!`f>*D&gp+6R(UFmXc~-f zBC4@U1M`h?M`?;)j3LkbN5V!4Ym*o8O1@qMK8AYOD5YUT6)Iy`9mq;pr$1%LTu)(N z7j)rO4iw!i4Y*vElmbnG-wOczmT_z}gjtz^5f9>mOGCrp}k{p4eNBbn9P} z44mV}kgO!8kH;FT;BbsB+Ub_;tCY(0=N)aiz}kdz=_nx+ww#F-p|lUO{Fq6FRqceP zL`H^=^=6$)(WC&7QOOw+QqGDLT5_le`7j9pX(yA7%qmV9R^Q3m??Fd)Oj1n!svvLD z@@})Gm4Q}G+&YsLp|f5XML6ZhdbLIh1k%7Ybx0c~BNN{1GcL-|VsQ-`gF<7wG&)5T z!fH^f$xsQzYVOfc4)0h$S%~0p!+M%h5d#4Y^1}cz-PU3ouck~xPeDw-bw)}Z=j=K) z*2>N-G9umBt;XU^!&g5-=^cWsH6i6t7|3RkA#rFGBz(6jk6D7mHX85{0vAREU7(70 ztXFvtXYEL?vT9_*co6ldQw7(fuO>Yi-_---P)FMo%5<$O6OfvSQfPimm%yD8YQAKz zbc&80loZ;I%oQoCZ+lyXG`M_bLXlyNY;LtqK~n+Tup6XY^`%{SIMO)Ly;O5Ai3cr* z*^uhDTawjoK&xS_DL~KcO49tI9F`RZM5mHA)F@C4HW`cSXp=(X(Qy5b?iUDZGqRWx zSm`>}pCKfz_8XuTR*i;K{h(znRq-?yO+p$iJH%VEIS@sS;DCFxt!Ex~->7*cmwlxl zR|e!TsY$n>4rj$#q}QypJ@}|wyP(F|Lm@JI0ZEEgcmerj&qd}ha!r8rOsv-Wh=bBs zU@R!--5FAp3tmSd2-(=5YLxgj3#41NusA@*ZgjX~9w3tT3O_?J+G+;aXPhj~+YW&j z&7yrM53!K`amzlnL`osZyAq2rV|mh72qHl;5{NC4U8b{#vt}SAy_Fg$s9$Ma?pqD< z&`?Hpw^&*g0)so*l9&kSb&FJ6Cg`$|R|?RPg-p7_EsSXsnkSZbhspbJcKt6k-WIjA znUmUuXb%}=k{mlEitAC0TxAgb3+;K8}?z+Wb`d4b0wvO-Ar31~h1aMLqGdbQDj`H0yEHulmjY2%z$DlQs0SmK zJlo#cuFyQn%ETMvul^3hj5ZFXfGq>2RSn^$NY!s~U~Q%-x9C_UG+dFUVG+w76Ft=* zP?xz0U@Lbq-u!KeMHYK#Yg6t zax?&}hx9_nD+w_j`#R{4&8<--#qzR+)c<(3P@uxsl5cd-E4j9ag!iUEROP^NvvvG( zHPT2qc@1lRvsvqt+SfwS5B0m>WR5jJeM_OM$=DBi1kM{ZB5&z&seWD*))SFqRHS_W zkVTAszh9{(KzImkRLj&+5nKHa%N^YMhpP2LTMY>w z(c@l8h~j8gL?5GqA-bba8{N@BIDR->Xzh(&$(O6e3t$SPKP}aGD9P4q^atfahGzPH zwMAH!XrK^h!vq`+5xS^`_p8-C-w%85-c`cP8*@u6Z>%ZBH;J6^?~OgJcJoTI$$#3< zr~2v#s*zXXvh)3YHHueaV91@a*f6tY0;c8R*QGtbLItxt)(VoBX_G-?#pD{*$K0}9 z%qgqRUM*Z3fo%CEueO&lmrRRj1)P$6n_T~Zul4Xr__pp2;oI8!37E;DO&uerVPM$>}?#$(rXT$7>{o1YC7pjdwpIOK5l5> z6;C2jv#LJnQ+IY|eB37W`W1O{qh#>bH|M$fEqd)tq=b>FNSS6F$jg&jev5;&cgA3PpeuEq~mL>{p55&Hkq z@+b&L^AK3_avcIfcF8`!^*{9Dqw#RVE0gknG5$^WpZ{b|qx;VfoLMd&u$gDbFGhXh zX11>8$fp>V`sWYhdispbZQ7Mqa?mF-hn5GCoM-j$quu!MPj8N>xG#?)2|`0a{I{w|0`htX+Ml zbaNEKuP-3pS5w*#!`L*1tA3>w)Nf<>yE6P;rQfw>es8*|GZ**G%l(3prW55}bAj5s zsSTg&jZ1dez8PxR`nXN4ws9uMZ)F_{uG&GN`Cbj`Cuej}p&Y;M=;iZ#?bT&$Q``cQ48hSPfut*e@@Qj_pKKm2|q{PrzvMdVIJs*99Z3|rr70YPoh$DLuM z@iM+|3?t_&Qk|-tPlRCAOv+iK$mL;VDvLuHd7~mV43x7wj8qdUXSE_92qPQA$UDPG zUy&L(%DFs@R3|8BxgsA4BUgrz%frYyid-E=>U0);uM8vcuXO|@up?n)ewbKPrT9X9 zLuhyM{WnuoB;*ywiGYZbb29&1RACrZL{tK5-5Q3^48vy`cm&@tyeJGWwQ%Ros3K;C z;UcpH%po17FAc-XEj?rye*58fdH7u&e*1i*|5Z(_$kwGAfR8)8q{{Mx_C)eL=qQiv zY#ILcU+%Zw5h?Op&qJ}x2&G^R<9;Df&`!EPWA7kTi)uKpz(<>!pJ-j-@GI!N8ZdFd zBw8PitWwV4Xo4bV`fUT3`@v$0D`@lQK5k7WW~S!J<`Glv=i3k1PS;LoL7ZIdCW{wz z@pX1ws8Qa`ctIQAIq|mi<$m&p@pwUdRnX}tD?R~>d@Wwk=?7_5VU`H&5dkD&0w?YU zb%-@&?tw&bUu3@8svsS_n*g&SjU{%g4z(RPA5NP9nHt3x_XPWccm1}J%YC-e_{AH= zhS~j#nzfO20fd;ld73B2%2?CsVcfnEvZKGDXZGQ znA#?Il*fxVC%|(~Jlf}zqERW>wHqB&V+&2cm}WYV;LGY)yrn95OJBmfDtbI|v9KkS z=7PXR6dGjWZEs#~TOv>+R0aFuZF}@tRWQcKNg}y}VuJ(hm>}{%RY4|h+r;&e2=FUN z6dX`UAXJ0x@wVNUv(G$UK;#xS@aiK$T(yu9BVyw@$+QEVj?Y&%n)HQu+Z&cmky{c4 z+tmy`suuAziJ*fG3ND_l3@;=KwkUkQAB@=?t>V)9V1R8UQvzaXhzH&A-gKg%BVPQn zfAQ={RdfeKJ|5jphp__#Xm2wF1n17G=sT*dF;3_$3JziE1uyskSjMBr{otZVym);g zx-ZKa)bfs@!a3BzY2gbBjys0zLhTJ#5T7a1z|>fHFk%ch`gTi7;S;OKM8YaEmj z74#{Y_-{NqB*AV-z>C+3JBsqFqI5o{ps>{FFr+ZSq8MJrJ&L;+P<|9Mk@!+@NSTc# zM_+{8;RLji25h+~n9)l4zIsS>X{Wsu$(}H)D*95Qn2i(9SdYY`ZE?nQU=b%0Q8$=G z4f*lnS2Vt&uA}3@E9!G~NLBGGjJ-s3xGMTqBI;T?(Tak@kGd+0BCLkNt8`ZaI*h*Q z1IM+m)50>sHQu9P>oIy}LIMy(f*`e&T1 zMH(ZOs_#b;7WLcos73r28)@gkW`o!EyNw|3g`&~Qp#MUkbXkgsRdk$_0C12&@T}+ zOr#c3O$tS<4kH?}5l@6UQei}6HljO>XbdA(W+Rq|5i7%pRW1S>2k6|XQp@wL)KC_C zz|vQU97Ab_roi~&L^iOKc5E67)ngf7cfuAn&zYIH$P4pKF9 z1cQj2EYkU5{WV||QJ9Sor71^I7*Ujsm=#8ph7qON2#plwC=Vmbi4gwP`lag|3HO5& z>2sfP<6{-yPx43PgSP(CR`_ct!Cw+dTTC|f=gtcz+jhKWlI7$C!%c0uP5TJ_RMRMn zixtY;)NWbWu-tDv9f;AC*wRYgp3WnQsHuSuG4KcY?P{4=s>XtHc7qMrdX~vi2S`tg-o2*m?7+okeZ4=pa>M1a&l$003+qeljI@baDoEVln>>d9%;fb~gA8}<(S z$*?Po$Pw9hN>o#k48!r9=xikm0^_jKC%!b)SxM9h^Y4kt$uGR z8$T{cuPb?Fqu<2(QDLhHW6d_DV!=6}@=Rp86%BPEQ7gXM;=h{Gdtn$>6#kZmzvbDq z{Q45#_)Wj_qDzf?>j;cVq39~nQ6~0;mNb$ruua zVRT_Ox*?1%wdkTSx+ojn7)F;{bZHn}nvGr=Mps*Oc^F-ujb0T-*ARU|4)%o;=RXj# z7`?z;^V)S*f056_HXE`b+D~2s?P+(xq9d$_Fn28Ky_|qoSTF^0opT;#rlmnu);7TI zphYA3JYLK9n+9AK+`HL#Kn{b#qX&)BeOYf`3>ho%CndL&PDMN1#(90AsD2Mm@y{g6P5YUUlGZ&nS|K`gT8~W_4CfSnAem=NC95)9F5HxLH!x~Ns znv18)JHV@USPCoRhg7)jftAVAS>Z`eA!aPu2nue^Ne+6>fgvF_&PBsCrh3MDz#B9J zYrnF}O1bC=E##`MyQ^_Gd+#@4-kwoPmC6*4@U|GRp)(> zP~Mk)DZb>FNDEYY8FDT>V!1f z>DbqgW`ty{Y?K?QkOS>zNkzsvjv>+2_Oj@Z3ha}uExQ+S;VufyXfIjAe(KRT#23RY z%u0<=hg#muQZvkB)^{y=QG}vcPb-o-X$Ms11VN#>mz*I_1sQEv?UMuWF5xJnIYC}M zy-seB3Cpn3id<><3G}7G1rL+35S6yl8Y#0IML9s~U-qMN|A1X76J_)?akLePyrGA- zuV$PtYpDV4>sN~w+B~b!X5VXqs^T(zf@)k=t`cm; zCQMt7`{b6xCwcEM4+59S=_H974EH5hpDc?^8w9skFtnR5V;iA10wbe=!p}yC{aDIN+|i4=zald=%|4kc1uK#I>hU>th_x|$`#^MR%*%Yi(m z@A_SWwMva++*(E8c4f2MZpvZF7nZY!aG(L`uuZgb{jwg`bYWS%!QINRTEK|wSK1!U zHZFr`RKkV*iP@_d+{&y)ET{M&@oy5kv6(mvTxUZFWfydb0}iGe%L!wC@MWZ7m7t6i4j{a_nPxV*74a=q|qRuDtSB?QTD z`~_bZ%|8xjn6ABKb!^CJ1@X}NQmGo^DC7K)<=7KA^s+(u4@p!}x;HvZt;!FK?k!s*#G7i%@dl5ll z`-0@7Zm$sK^iW0*1u|nOyJhTAB}v5s-UOPAwL<1rIiF>2Hb=}1lQ6ufn%tUJGF`%1 zAZW1~TaHrO1_qTE_`AvLuo}T8FF6DuT@Yb|OFRFU@ z=17O^1%ajJv4~qEP&6koGgA-w!ezu1YI)g^Dxx3+0p3Db*Q#{uPmvCrY7AZ@@I;4F;c)EmJQUe@ z@nEeZwUv2Cim#H#vtud#7(rh%& zeaJD{Xbm|(xc`x`*UGc0YLse~zUZQ!c?s_>#@ij6@WElQZZxkGb_h(bx{)f0HpIMN z_k&8dc2%jGjPE|gf1FRIe`&tOLz>%(EEJ961UM0UXEs*g#4?zU6bn(aYRPnqraHap z4=o2pOX~G;O33|YHJDyi>P@dKPe1pt^vif*Wzs3VE?eJ^w#p6xbLYLGeC7MVSTCTH!*Xy-nq z7>Yq{Om^GM<>$8hleH&gDb~?|^`1pITdZ`$qBGPVuPH!fXSF?@h zR;+2s`5e1DnkyUJ9PhjMl2j!>pMOnqTH)uC=Y3Q*y&75J<|mTZ?yzH$o#xJ`F--$O}cyGlYCIDRadZINFChfJan^bwI-2_=O>a^ z@poQXB01yF6J^`Vz5BZoWt;fvD9)7sp*pH;qx(vfwP#10$DI_a;dmcq}`8Z6Hm zELYFSR0#3cHQ0HRXf<3-no_h^_mU?P__rhi3QCl%Tl`5(<9SuB6_@2ywNAS<(K@5d zZ=L<;>^@XeVfu{@$@hSP!r{=tv`;01ygB}-Z;s4b{HO8OX*<+zkjk{3YD)rkx_2gT z-+gS0w_dlMQ9NU-Ouw^~z9^1E2$q`^!x>kCJU{8weLi*?4RQHdww{p)-mSty#`%kW zZdz2J8F)_obGcg(dofsFbSZGumC2&l+nnSkNHM9(%niz zhunzMq7{r}CnRU4|36}MqFRj1=aQ`VV%;ds_N3;F0QKIkVGawgR{P_+*+ zd*A*CzVL&TKj}L#%Zu{iA=C2p8Y$p4?@Xuy?pu#^G12*=6evcAjrVQ#rq4K&ZbviS z#%YYtFL_ecn&sz?d(GcrYEoUO#tO4nOY^N_1)WyCKY(dfHXrbs&*8;S&K{#dt%g>= z*{amEGp&ASs(vi>GE#M;S^dEJ_sZk zUX?ov>3H|H#qwcq-&GCT_Dw#ef9M*Hf)nNuz2$uvwAsU=)eZ_Ax1bS2ql-BIc>0VF z$FhCnmyIs@Ia8VDsrMLJVVroem2jdphRD`GsA?^Zj#ozaR7U#->ug-ao+>8~CwW!` z8{)ycl_eYFoBJ!c5Mpy$A)DW{ckH~camp!9OmfnS!u-19#m^;zH{!v1b8dJg9(_51 zCtMT)KNK&19=|o_lgk&EbD%ZH$?uRSTJK=f-drR%ymb8G9f)g*;v5T(RJ~l4^D(*PE~ZbU$CR97-G!>-`N}K{#>6k!8Z;Z*TI}jcMUcL z&}^E9@03%~{6s5Du9a7}=Dl=v>x>sa*Lohm7j?&jO>scuTNX_xqT8x;c}CAQ!Hnmx z4k})NUAE;W%AQ-YA<-%yB4+OfRp`!v9vnW@^EvU>OS|K(vxO_ZT9J)%olz6-#rr3Y zM@_+wMDeSBa49FQ&h8eTalmaHSbSWJ1@;?7?05C87!&tBo@hO9)Nj3r0lN{uIS`9S z)3~UBnB9Re<0zFL;k0!sdD%uk-rgdNO3n)A9L*V-%@P(%hfNu@$YWc5q`-9z{ ze2LqB(z%*sd8~Rgr9g?xep1`X2*J$(wFe|aUw68#f!TB^g}NkHA!6RqsgDsqc?ByQ z+(z_eL4a7yr^X7aibh7gqVVGk)!7EP+4y|=$h$13Y(+9eI%v_kgFuh0Tfs|l;RZbH z9g~qe7j3>wfuVZLt7l27bZEL1KDgCjJYqrFl`xrlFH_c+Ei2147tONMWz_-7i(b8q zQdc-Vtd?0RA?{9f+kBZpl|KqE51R{;kZ@8Sc>&L7s4h1|QK@NnshwtJi}%cCgCXlX zD@E3*Ja+QvL+!4bk+$Db%v1{G>%$iAl`J*|S6?UCp+DjnF>mm&CG0ljLAl4hxFxeP zlsk}ym+fn%SsN^oj1C$4h4l>6jUYDlx#{~zyy?O6PzK-?Y#79$wBs2!N5=~qy=Y{VwK&?NF4%@ zhn?ST!A2jqywGWl*auykq3dO7l#%Wx!w5DkGKeVx6Q!93clsA23+c1CTRgfzm;7W= ze^Dn#CuhH)n&?iSV58r50-xs*+dHsVl#%kIhiol=#~z4=FT6}q4w&trUNZITvL(?j zrf=Hj7rzMS6W*rLvbX1bJW=f5`5IC?i5=Xcgw7Zx^^8}K>M!#=$ASDlf7jlqA(kdF z6Ca>beAbH+5#*^b3rd4tukgP8WVm|1BAFHjcY4#mYzxMWH~l6SiuKa8N#9n@)AUzq zQX$cNnIR_p>-k1ULwPdCqI5LvOdku+n@UxzR5n{(mV33_B1exBvQrQxq!W;KdDENR z>T+(mA1tc&gQiE+qRZBcwcWIC-pYY5_r1qON#}{{e3ExM6M04?0ZV*JL}qt!dZ!e(n~p`RIowkiK1&yhpoQB=r15FY)9u z-R%%(h7AA{bj6d+Gj7D~E7r8v}% z3YZbSyLV6uH9u$1^%vqJM%9nFiz4bj{x3IP$bAsXmL~;JKYuU*ZKbb4>ouRD;tp5R z!8ChB(psL^>QM)rg}NAGAy-5&fDknaudr}FEP*8@j>+BP3<3!k3{7Ht5d*vB0W{nu0AR9bP`t|G^VOq z1gd2hm`$xi=g}Qnpd2Tr#Yhcq3$P`b*rxj{bX7$~jI+memdt9p#%t+9P~kZKpXe(X zsykx$Rh;0yim#Ro1)aLfp%blMvAw_DbR?ILf}wdqOS!s{d_OtOd{>0|{^Kpc`PQ6fzC@UB?P=!wT$t~P)67>L=6muq^L-)A_ta_T zyDrS9yJ1eJA8sI@)(L&=LY%P+Mxi}}KNk~WSa0ZR`Cq*0A9sg5^q0IN$1;`Xp+nf> zHvK^o-Tq|_u%jjLf_fY?);^?4cxzh(+fP2}be`sSG}c|gZ8*jT9%~WG(CcFlsjZlT zbxp$^-cKd!7f zxj&Wdh;2oXVUZ)!+Sm}6NyK@;*WLXzuyx%q!LeOl2j`~-4G?_C5Wcewd-TFhC=E;+ z9mobj1JhQ=P#!M;=op&93nE9y&{SSvgB?R>@N!&>iWVv@!etSuI|ShJGfhz#^B!9# zr5b7+i9L?GN$ZI2v2}##l@Lc37NS=|+`zREy%OSvmWAk*5ZC#Hs5Pzcg0OW1`%J%a zuQVG^ucjkep{3hjmgH~y2SCbCCToC`Xho%|8D#4{q$)$5nS5r3A{Ko(LE55t*-`KA zGu__pb5hs5e~!583(OHF_iLVL&ehCBd(*7{Jy(3j4Z~laD?am{xniB0E0)~>F$J9y zm$6kOXOx$FYdR}RdNgB<6c06}f5nWEqT84;mi_f_mAgI6{gvM;_xdn*{cn}KGt4a} za{Be|4s+`=wA0VMG0eU2x61u|n0wK0mHWjow=Uy3eaw5p+)I9|+?&GOy3*(L%YNDA z{)xQKPnm5hlGDCgQPTbEM(Hc$>}uJ@Q~%`IuXzRrD6XTq=Vv>3(PVUsc$?`nv-8av z60CmJe51<11_e8j{O$+MH$vJtq+0HS<{Pt$G7Ejslr!@FDW_aqZmQqZdFp&~6*EQM z=Xm^z`3A_{noj+G71E8bXW;L#*GYPnb3#WqtMR~>yG%!So?eISb&6hPE$`@_s#h() zI=Z=~BJht(QQ5M96&MZSSb@zDdL_gWsD0eZEdJ^h_$rN(1_F&a1W zWTbgR9@v%$UX*nY2xub`!L&&FKER-NbGINFkc}itf5U=FsW|Q75dzHFMHA;qvezX4 zYGz>;%z3%7_npe{hM)Xt4JraFlKp|1tCP)z;<#wleSG+}7`LM)a$j(_m3=mOU%smG*<^FR zWW+@B$5yN4PgFS9wn+`}ig)*>P{i9_`F;`a`~HPl`5%)0Z_!R_fGcQ-U#SMT;yt2W zH=>=l<{r}m^we##k$1E(dFdBQM&LY*yB>|Z9=-2xI+V+RY*GSH zn&|*eBb%*3*4$$%fYZn(6#%7~2H-TZ+4^S9J*EISjcif?P@1j(Pa~VHoz~oA%m35J zrsY4S+3No^ve~+9%{{jGKaFg*ZeDYbt^H3Uo0fkdX-ogp$d+CDr{K)fG|`^2+IK1d zbcmV-Vf54V%bePx$=5IITvX^MmuYtJ%i6tf$r}MWIOpGE?`IkFE5tG!Ka&dnzn6u` zLMR(eh4`Q39qS$MuvOtH-8=gWXb^u5?=Z=4%{{gpJdJEx2r` e5hqOsZUSk1YUC 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%0AJf~KNO3NLe!H0cl(mf?&J@!^WkKv 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 z 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

      W2m3|!3b?~M_UK^?<@4Z2GGOrC-Ob>BSA*~YfH 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

      7HcmdFxbV!vb2AM(7t*W+-^@9 zOwT*u{}(5Xparv8r>)8XSFB%+U?#_3$l-sR&vO3YARUH{qW`o4x)u}=>xbnJs)M`y z%RNAWvb*XTe(}a~v&N?t=d1M1aQ6`!M(eX=)>l#1W~u6U(_fb1_24YO*qygO?)++# z_VJPrmt@^CeLpqPv}5U5eLo}o&W>bliE^X{=ccls`OI^>;z#VGlsP2gw>JGjU@X74 z;I%}{a+acTR`9Inv-Ju|S*^({fX!D(L+_+W`r`gY(%X^H6%uo|QDxTv+Qd5RSFcp-uw^s|94#j5ERc5av9+O% z9eNKZ)m@;**Qh7$7eM43jB+v(_+10OEKhEA8B~-6jijwMUv*5rYryGZ3}5Vt8$e9qrv$U}t=<8vwwj?xd0 zgX63@E!MU>wb0LyJ(;Z|W~QMVXU(-x)_RT??dC4*p2XJ)*pio)`u(9)Yhs+F#<^Ok z;0N`pf66d(j&2kyI`+;K{_aFZH#r&|bM4GoC9NNxm%6a^!}C*IdBEW%N;7-_DxUqkSky2l?L>^yb{PfVU-h->{w- z`>v4oxuDM~s(&{gc3OzwcQSsQbNk02+%gQIo-xW#+ry?f)EA#zXj zXK57!a*z05@p>9L|8MX*X~?JH^(j(eNdG6io-DkcD7>EdDR>R>559ICg0B|~{WNxE z(|6}*>zvG9@aE=j0Ehd6qe1!M_qiAOiCOGAYffxKAnr0G&GP#LT-m1go>1bSZ5Bpj zF5?+Ap(Z(N%l=98A?baj0E(=SCK>v|_vZ+{P3(EBCY9HHwWId8WcHUkw@W5IFpxiN zcOoH*UTA3|`ZMvm2c`yNuc=^ko78${|Dc=Be1Lu^Kl?q;9z3C>uMFCy%3y|`CQ`^O zEu-A_el1YqzC%hZFSH{2olep#K6(Kjgic@G&03z3sgjew@$P0_{X3Zy7cWXp6(&SIjoI}8 zv-VI=Z!mZL0Y<5=bJAUTBs{`Vvcujzz2GJDUf34YZ2(HZHn!PzK-;L-op@tUc`rJ4f=I|-(A z1y|&LJ)-L7pxKa_xEwsRc)O`O{Y=vHlcV+_NgU_SG1Q@R!Zo}`nH#ivABt`sdx%u| zqp8hVc{Izc_66kZN|e<|AFdaXn;j0k$n8FSSI!uK?mST)FtK{u&!SD%!tN+;(mFs} zuc%VBr9ymzBc_mTqrYQHuF|1dQ&JXGZj1gOvLFnnJC7p{SH6vYj@+87^@sIk!e(Dd zimu=^J{Bo$3~=}mGm3i;f$&;UOy@c*csh3u2>0;i$JsIuT61ooV$2%f;ol}_NGS;z z%bg)pQCpL>3#XxS>8Q3hAfCY{=eHau3=`jT%@s`R^;V)2K&_RgWvRIeiQgS5d`a(a z+nPE;qu4&3AxG1E8l)8I3*!R@bzn8>rJ|dr09iee(innH$14Rmz8Q4mdqt;mJiTh#pm39WV92+_9LT~kc?hZ@}Xojn{hN` zWXSRg^~T$6q9+#TAHyFtdsYQH@xRK}8l7MDTbeGS&%`Cr&JEWG%q-$i)Bp~32Gvl& zl}GiX00N)e(Z9O?=${12t`o|>Rv9Q-UqNoDYLH*08nWXcAsdF-hCTbl-cJ#q5IZwT z7hu{&<4l8u-6=Ll2du<5k9B4HmkhqJ+?#pOl^9)9;@938&LBVt2K2%4Y2zbS@(;$R zh}`y{k*OtjMXCQSnV_=K`_BM3c{Y-pkxLtN(t7atabf7^6lSB4D}2Ve^H@79;t4mN zCw}m@u*yIV6F(5eMOQjv3iHTFgZ1H*Z@Y(gP2Xtn3hO5expH&oiO35&%N&d@dP+v5 zhK<v#95sLYp1u^QScxH!~kM6LSwHMy%5y*jdz=IGq~zL$JRy z2-&d@r7K&((d~+XEHfb3O%SXC|Jw>sc{_j$4pzf*?J68U4+O99HJ)|6quB@;^s$#5 z_;E0tJS3TZdQLn$lXU(CLzy<_^ot>r!wM-v9@zPMNv!q2IOp#5sFkR`pIz@)3^&+s z+nPQuFa1TC;1?T=;(3&EYYe^`sY$)TbPm3&#<_fV5LU|Mz=Od`7T!{E1|2l;K!S77#eWkv~(iv0dX)<-5e$WK4HuE!>Om+Q?CxWNo-)ABf#2=Ej zZ#GV~Y?EM$`rpLwhxyl@gGFPnXHqyv%A1iholFa(Dm!i88^n@#`NQHYH+6J3%lwL- z^>7EZI76DTVm`b@73O}pg(On&h{L_7xkmZ=4x)B9*PDc9xn`4oA7%7k!3CAyy70Zx z{uWQOarqBt?}}VUsFQ zXH-6>@-CGbt!+@Kw2`?oH9WJlsyFRGQeX0&W4V{l8r1?~>`ruc% zkY`K>sCfX}JxWF!RpTRU<5gbs2&H0@R%(q+t@fI0l-g=jr`y!4z2@n(86)Gv_kb<> z{ua70Nv*;~J@5NMTrf7N!ER=$OT&`~+lC=TWs8yRhayVq2Sx*;P9BqUNtm;w%qE*L z<}xf6`w8ziD`^tF?vL-G$)8Zg1ckYU%^pMy^XZrRRH9GDs>!0CYEg^*zu9=xZCX-g z|0vkA)5@~5qS@vO^qCrsV;Y2$4)#AZ&t)rz$?j;LqkyZxILc#I;l&X$1vEB%sVX^J zW5;OlQf*&^Ip$S~MwRVux_%iLBk+_(*Im2_BLpk!Zf;a%-OVxmgs3} z2FhT^F)#n3Yt^gvdzCNTr1OE$-%0v>ubrK94xW^hI&J?BF=owqakHF z3GNKJFy>dnj9l;9h24{uP)A9k$>4kW59~gMSBC*m190eWA2bBKo8W+E71Z9vQ~axw z%X~m)5(R5`*B!#5DDB_OQPupKgBD7ds|2*P+SHkN?X+)Ra#}X0W>D2?+BYs4+1|0_ zI7XYFp$t7KnA#OX(kqb^%G$H)4i1!^tQ>&d={DzI49*1F0mVGF)4zu2u8OHq&WYu&iOt~|mw?c*=?qyPB!wk0k zS^Yk@>+^Mdw)?&P=JxD@^a^`?@wWZEkJn~>>B+pY}9vpB?$cT~k zs?-ocAtvWu!1UO>DEz~Y{G@ZTN(@Ar9nGQ!PK2s19|X_ zI>Uk@YH!CVT(;IhGS<*~s30}UpAQbPW8es$uY$A^#!|WvMX^Ko)}*5L&YG0$L(CmH zW1PSqRGm9-umAltV;73$P<(6eU?H?O{fkwSgTAjUpr7SPbDcK}7YvT!$PL3>gmGxu z;4~1|GVjtxS+0*|&VsjlBL;8J3)cp3Y+QDvCdRWi*E@(O9F{8eE^|cFU!7Gila|bl z--63Xy>~^uOT-ZW*+p7z48q^6&drS9Qi7{%Zsb_iT@10I8%e?r;+JMS_#l#>XA|s# z&pf&!9P?NVbYb5LXY%aZy@0En<^GiUJaOF8+)vUwESMzqc;4hX25Hr|luMzd;J>-@ zKbDxao@dmW0(A_Bx1$4)ec4rXsK)J{SVgIl?oxV*kAgR`OrPP*%O;o&3uEtV$=(Eo zY?1}Nb6dGPz*K2ZpW{$%D#(sKhNEa@-a=Epsq@w+J;T(48?ki&&F6vU(N@|J)=hc2 zF=!Hw)QmQ<^OiF)@SQOA;cwkfECg45XlmKsdk(^=o@z=SjhV^{wdii2KPd_BrESGK zvAv48zJ^I~adCg~n;$KP8LT($9%rjuMU`Q=CDD|%z{$lxq?yF7V^>s{YkU80(zm491mPXvjRsaJ$Fra>y12NE> zsB{d43tFVr@i?7FX`R829&GNp@+WuWT%i+y3_NiMlDEN!FW$w3Y-I4Wv+8xUw0%F- z6=usxmm(>=ZvR2ZwEt{jBDB4zNlg3gM=`;Jjl409f|qGY7f0hTm(pz-cqAy^`e!ge zjQ0N}${mv&BhC_ehWTvF6H_n|mA8I0Iz57H*om|b+?sw}%V_GLc<>wW%eQ9EA?#s^ z__@`DBH@w?88~_pvm-T5`}aZN_|ev0NKOtnrio#K!w47r+R)nmoL1>Lk@T&IEMuU7 z{nUtISL&c>uKe)>Aa>q!1j-x4%`mR_LWtbIfDL-GaB6NQXPrYL_s%3lVd^XJzN-;} z$i7N?T;mM+a+x_ZTY)qPz4U37c>;?HZXhuPNLCfU8zL1zPhnw79Za)Fkf=?6u<5>z z)Sm>R@&t1zL*so-c#F#NKR^}y&W_{ppS_+z@i>5|LHHkyaMsKR-7jgbWP+6hAD;ue z)0IShF?I|Sfd|xtcNXF3ZSO3Ch4rS6RNin!6S5VX zTRxcJEvG|YM!O4YdD42kQMix6P5foJvj%ISf83~Ie#h7Qb?WCjSCWUk3iSA$8I~ST zHFN1xxcBpvD1aYw{-BdI>R#YqZR&0p$OdOO=tE|iBAj2XmR6`G!(jAdm46fMTm7Hu1y-ckfD?i}jlAijb0oRZZFJ!%CqDQLg)kLY^DMHn3{6;=TU69_ zroQb9g5FCv@@1x%js+7f_G=$f~llh*-U?H0=fA1Bck>{k&!|_SD`(6&O&V> zchHwQsi^%yuQk+GVs^91pHlu7Kq`Dd?mj(*k;|Qb#4hP$1KFN2ilx*^7$wJ*hVns! zV$94|chnyBCEu5Vl|J9}hFyk+&Hjma%vn7w^`aSr^d?x_OFO079<@b3hPhobawzA` zcMyX6zo`hItNs5eHCma`xZ1xaMrDSuU4i=n@iYtKH>twkSpG>6+f+9lpVtT8@Bht! zXNY-@1#kIlp9bFc*A3^*4c~I>5CQ0K*$!lD3XmP&AF@sF7a`MmFd+N(WQ#mOcE+bb zcJPf5c{h^354x&PLbn}+d=hyR{%yGALT>nZA#~>*0^O|Xj<3Kw1S=tA3`c6++%kN+cHw6C zVWxA5whi5GBqf2Hf&p&#WM;ncFS921%q?1j>p6R2jALReb=WSEH6gTgr|HTcn)iA2 z9EEmPu2#NlE0o@D(l0A(#<^tW67w=6s*5RBUdu~&>4DF~o^PpSYy17T}oKdec+lho6DW!BBxTe&mY+SM3q;wv*hN+wRli`ydj`OmwdS{Yi z7-Xu{lL|cyXDMgMtdi_4RsPc~1#nuFwPU_+O?!m*@MS3e64qeDJj`Y!+7STL3!%lF zRZoH&H~TMQG&z?D(676l+XuP1+gg<#>C6u|a#uPWah==lQYxMdne%W|Ph_WZ|MkZ7 zj?B%~k$C1WC3&`G+sL6BZ*jd@QZ}9Ty?UQ_OH9vYV9HxM*Ug&ViT@4tOBV3mYhGaH z^6yMx(^LC(hmhelFEn4j&DVyGL$;)Cdm5{DS$y4jGwKuGSL&p0EQU8Br|Wu<)4B0| zdbiQsTe36irJU<90=*9VNh1FEM9bOXtZL*7w;pbDvy-^a_A8B3v*Wk?e`5>eaomhR#8sMtrauiMRD$l;>GDk`+gK>%eerpnBwj}}wO!xvL6T1*A2sl)7Zpa;@k%e;?SwUwIH zM~%Vg1Ui{DZYfNKRgaKeQ%!rnt>BumUKeS4)>-un!QyQ)8vX#|fRkw~O>a+RV^Bax zdJD1tad3V%yQB=n)VTAW#&F_|UukR3Kd_o@>hUm|;(XRY?Dq?^*WQ)qc0;wYv7l#O zhrD3*#WC!+{UI;|A@LGM7j8n@t4cmnhgVpP;Gn$xw+g)VIt%5)EGcp>D$wJAmh9cK zp|<4GGhJ`BdCcA|Qz~!z;k&GCK|uX=>SfS03QiLP(W=E#e14#HZ84;hQE7`Y+)6>utUD1QQ>esqmkz-Z$=D$QbQomK5s?*QSXqg46<9r#;$Qn zfkz;74#=N^$h2d|r8&y3_zSPed@i2x|DT<3Qq1?&x&C&-UkC>5gqflTPLZDbp~~`S zkTN(JSh7S@EFmU&Xn!*0U!Buf5>axPzbD07{p^Z&U_zYE;Q6S1d-c3o&%ZoO?R&hfSHnf-2;N+8 zg6l0uOi!t#k0tBF$oqxx}2x>7PAS5U4*A4 zJYCSg0?z$L;diMaZk9{$2}s~gBny0V5H)}=<7%{aP`vQ>t zy4G~?8!g@o)|2C{U#eYMB~!N&KO=PmCKML-iksRpz=lm{>!`|Edy&Nzk%j5Sam7$J1E>Ondhz-)t4zK*Z8?pA_ZuOzVRQb1z9}1jNOU7k zRNSV3_G7vzdJ=(t-fV@=5d8|iojN^~aoG!_Ze&xzNaq=PdM10J$?myf?lcFx_V_t1 zqYtaRl?F?!tucQ)6#wvWz0b5vIK;;QtK3_7j>-c!n3F7@cSNXZ+zleE3E8NP~|V zbntEPaY+Fm)7)%MlZv~0xT|7DjT?E#DCeC|Sen~Rtn-lQkcJRl6EqjE63zWrR@i;J z)gvN}L2mjF>dcig9~yKO+KxYL7U$Q(lng&B`2Sg{^}eLm0&RoWbJWdjH{9Z5ja2tG z0T~JmC&AZ)h>zdI5&;Gvb>t>HBn#_FzBU!RG$u%B`Zo}p=u<2WMzH0nssq4m%PA$RoHc*>v80o58a@Y5c zKQH~d((L(5rKf!^%L&A?=8`Z;daS)t29W1vPU1T#C9Uw=zc?xvMaz$TSq=&#_n|dj4y-~2Q@O! zB;g7C)VkeDpy>Vj;c^}vJ7m+DA9t?rp6@K|V6Po+;L5VOLH0zPOpNUDOfQj)C#WFX8ALL6y|UVTL#Q{#TR%Q8b*%ptDWT4qzZ*}wg%KPn zUjvY7xhV%RgeJ$0t~I{h*Yr-qb#$8NQ|gNJV_e&KUiz`5H@>!Sz6+kFgaQKS%E1-*`et~Z+VCw`D% z0)+Rc8)~svsXqbXC`TZntA}K6ZX`be{*3ebd0dNXlCd!QwW4rm&5NPE5r4$#k!b2C z$t=C|#@4nFa3R^W(`l10q)Q@uPZ&CI3~KTAQr8vf-?lcMm;M7=hrzFetA~aFdoY#u z8@2{#@lzNtPU98gV@CZ~Ff74|ju!(vMHAbe`EJ;Z-*wOcS6{6}<$c8C4> zon*6CY5x0q!v6KfIVGkeBr3e>r}hVQay6d!rn&uFE!>x;JHHL(5&ln-k!sy6t21vc z3AvH@OSJ}JF5j?CCu*^`V5#DY`P$+Y^XcQb0&rk>UmtgR$Y~}~EAcoSXqIq;S3!F- zF|?VhxE#1#K3}|YelAzebLz*e&dX~3Jc=LpYf-_Y;$`IRcjr8e#audnr9=xg!K|;V zO+s9Pu13)5K^zx)f_n0w$J~3#>vqr=C_p?xjfy?dElaM`)Hruj-O+YPZS|HciEAyE`pZ}r?Yk{-9D3B{7UDWJL9{eT(;7w8%~mu^(Nan zWFtx$$MA^JCCm5x6$c|cUdiL5xat5c$IT31M9kIu^M3&E3>{Kl5a$LHHGoIR2)ReF z{EQhHJehAvuMzcAW$QCs1-a@8s^gZJBjer_4nf>J*v(C3%}V(eZ@ICkw%tdLOi~)e&2Dovr!~Q}yf`s;@H_7pvAF z4j){d$TGlx5_Jmqb7dE7Yvqk`{U$YQI7!C@$R#Pf5I1?akOj=B7Ooc!ZZf>nl&*^t zbXgUAnKb`9-@|k<$9!cSXQE&Rf1t^bzvar0qkhw6=cBn?QWR+CBNvI7`N(`Z^sYn(|0)6s-HMQUm%z)?yQVWA+45vQ`d9r_ zbFquU=5}!Ru(?=i=Awjynbo>$Z9Hu8khxfIV1@ju^WTu(pY#A};*l=bTejp{qBLY@ zTvDo^0Ok~PywZQ;ClYK<`z8@MLy2HhjF?<`+crBWbK+W-P;a!iGSPIMCWV*-*fB`K zJ4|3vlH1c}!h6raYv}w65D}yb zbZpY0^K(eBeKK_Z`NAuoPT;u^uc*KLS{?Vt)AH35F^nRH9N#?GB-r@V+ zy95&{lKWmAeOvhBg6Mfn_;jb`t}ZKc=MlJqML5!gSQgG5CxoJB4x|<}#9fp)JoJ&f zB-8jn5ey8zxLO3C(Hp6}WGC=OOVr6(H%y5U93$})uVunbszbwq4a~1NRsDqiE^m1W_^&Xp{ zkC8(r7P@_fJ%vnqupS$u%vqYg+D_Ba=-#7Tq8$MEP?r z|1Lg!YPCc@R;HoP(wtj!|-I`j~6-PTmmi*PQ?m{=7AVH3& z`KuX|MoACxTA~v{v}Pu>lSE(7`CCzh7$TPlp}S(2$EeO4xrQ*Mssp*08+()HlPZ&m z*j`2NyZ-{^uQD0ngyq|}7Uq+oYUb0TzWF2s8CZ;yhLsnlX~~g)r)2O=^|j9)B#?*kSU*>TWkPUferJ2%B7a*I&;m;p*p}cy1Y2 z_h3OSxCV-wF`R8_W}9xXZ9C6QyYhAl$ZkJJ(`$qjKT0*4*(n*sIk64Fn;-$8Ek6~9 z2aa1%*U+1t+eXm3vvwFJl~QNzWw7;iR_btfptE)>tle$8T>1X4N{qVJYMzMmaV5E@7qcEx*sN5~;HHzg_3Yp2m#i5!#+TJ$7brarh23X;{jMG)6?%)!F&=bf1 zP0ok$-ea0xUjB|bnWP%(Se2+Py#9W|EHL^U7bWjbEiqnKE%P=!T0?QSyKKFx0aL%< zVl7FU-3rH1{u2`VoZYIGJX!dI_O2i>31&)cIoaWhHpm@=IRD{#5|lA>>x|MyEf-RY zp%c4S3H}M>ShOk>r}||rVLFk)`koTUsf5Lo<`wf;?gf3gkvKLr^j6YVG@(uxV%MuCj1S z!_&J+)iv2|D=~CZ;JFt>_{mz9g4fj&;iU&Yb-4tmio*l&Ka-4aBt@QuGV{6lseSay z04&rhVS$dYGG!DHpnIF7+L z4|9{b83-p1=-!qy?1AIFGeY(t%}*>s>;W_X)@0;4w`l}9b@+=5?DJAAg>>1<{Q|<8<<^TAt+LSHe~hSD0J0{8E#}*1FYTqyNjzLa5|bm@>Yly2_HuV#ia&jaQ*RKQz*1*BUvGNIy3By9IahB!g#3u0HJA!2AzN5Uwv3|+ zE?HnnR}-duD++#p`gs{kZ{aFFaVYo`)}6i7P((j>LQsoru8nMC5QVJ&M}lSZk>p}_ zMk{E87r-YBXeLS`O$uI9he>tXhFGDs?K$R54HT+1a0gg(+T;=>^N>qJkIKZY0OtyV z5C0>#f`$T*w}H6VLbKDR`=c13v8q2-!U;QFCEh`}`nDhQg<`i*%$@gPp=2{0nWCA- z5~r=29C6M>lWP{a6cNOox7+P}gQJ4*KHJnfnlcNMwji8KjV+!Se`>Y{7CAN<`Mr)n zuco$U9F+$+w=d%*LF}H6X9L`S%I0f-t%42z3a%#WV13w`ejCn|*>;fo(j%#(ERAI$ zDX(H3)Be^%w)?(Ys$^j5{0?sf@x(=!w^!~Dt1qBv$% z@hmDp(hCnWEI{VG!v0Vn^$6Q$5N)UJdbHbr9BtAtXoc`dwsm zaXyA}VaXw_6bc)%2`-@=ex2%PNpKTn-O%gLR)b*9$kq0^asatu1a($CL10oSO;1rJ z#+or>7-IM{`*Tn*gr-0~L1u6oI*R&EwgQi9kc+K9+2p791b5puU%Sgp!o;(h$TXJ! zcCpQc215in@AV%hmz7n&vh-cp4~jn|JpiXU-Qo^oK+H0~)u|%)Ml#{=Lkgni2KLeq znEQvVZi$iyYJbc};kfNzRW6iFby6mKBq9*k{e;rH-ZVsXaT3s~D zS&Iyrj$DZ$PdY=nVk|V%a-#<%F=9j))k~zLiQM(!z|_^u*SnvwwAL7B(@}cg)#!b9 z%0D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

      lX(JU2c@C$5`SL}JJS%BA5^Y_9nN;Bo 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

      %hO9F^s@2099vqiUXF1k1k$lY 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%0DBGUJa*stP9DZjTFYZ-TT4a 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 %l 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 %wpzxBLHFdgeW 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 z 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

      ?~Ml^qri}TooV9TFGr=tKyUVP4OW7G5)5r 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/_grpcio_metadata.py b/myenv/lib/python3.12/site-packages/grpc/_grpcio_metadata.py new file mode 100644 index 0000000..eee38c1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_grpcio_metadata.py @@ -0,0 +1 @@ +__version__ = """1.66.2""" \ No newline at end of file diff --git a/myenv/lib/python3.12/site-packages/grpc/_interceptor.py b/myenv/lib/python3.12/site-packages/grpc/_interceptor.py new file mode 100644 index 0000000..94abafe --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_interceptor.py @@ -0,0 +1,813 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Implementation of gRPC Python interceptors.""" + +import collections +import sys +import types +from typing import Any, Callable, Optional, Sequence, Tuple, Union + +import grpc + +from ._typing import DeserializingFunction +from ._typing import DoneCallbackType +from ._typing import MetadataType +from ._typing import RequestIterableType +from ._typing import SerializingFunction + + +class _ServicePipeline(object): + interceptors: Tuple[grpc.ServerInterceptor] + + def __init__(self, interceptors: Sequence[grpc.ServerInterceptor]): + self.interceptors = tuple(interceptors) + + def _continuation(self, thunk: Callable, index: int) -> Callable: + return lambda context: self._intercept_at(thunk, index, context) + + def _intercept_at( + self, thunk: Callable, index: int, context: grpc.HandlerCallDetails + ) -> grpc.RpcMethodHandler: + if index < len(self.interceptors): + interceptor = self.interceptors[index] + thunk = self._continuation(thunk, index + 1) + return interceptor.intercept_service(thunk, context) + else: + return thunk(context) + + def execute( + self, thunk: Callable, context: grpc.HandlerCallDetails + ) -> grpc.RpcMethodHandler: + return self._intercept_at(thunk, 0, context) + + +def service_pipeline( + interceptors: Optional[Sequence[grpc.ServerInterceptor]], +) -> Optional[_ServicePipeline]: + return _ServicePipeline(interceptors) if interceptors else None + + +class _ClientCallDetails( + collections.namedtuple( + "_ClientCallDetails", + ( + "method", + "timeout", + "metadata", + "credentials", + "wait_for_ready", + "compression", + ), + ), + grpc.ClientCallDetails, +): + pass + + +def _unwrap_client_call_details( + call_details: grpc.ClientCallDetails, + default_details: grpc.ClientCallDetails, +) -> Tuple[ + str, float, MetadataType, grpc.CallCredentials, bool, grpc.Compression +]: + try: + method = call_details.method # pytype: disable=attribute-error + except AttributeError: + method = default_details.method # pytype: disable=attribute-error + + try: + timeout = call_details.timeout # pytype: disable=attribute-error + except AttributeError: + timeout = default_details.timeout # pytype: disable=attribute-error + + try: + metadata = call_details.metadata # pytype: disable=attribute-error + except AttributeError: + metadata = default_details.metadata # pytype: disable=attribute-error + + try: + credentials = ( + call_details.credentials + ) # pytype: disable=attribute-error + except AttributeError: + credentials = ( + default_details.credentials + ) # pytype: disable=attribute-error + + try: + wait_for_ready = ( + call_details.wait_for_ready + ) # pytype: disable=attribute-error + except AttributeError: + wait_for_ready = ( + default_details.wait_for_ready + ) # pytype: disable=attribute-error + + try: + compression = ( + call_details.compression + ) # pytype: disable=attribute-error + except AttributeError: + compression = ( + default_details.compression + ) # pytype: disable=attribute-error + + return method, timeout, metadata, credentials, wait_for_ready, compression + + +class _FailureOutcome( + grpc.RpcError, grpc.Future, grpc.Call +): # pylint: disable=too-many-ancestors + _exception: Exception + _traceback: types.TracebackType + + def __init__(self, exception: Exception, traceback: types.TracebackType): + super(_FailureOutcome, self).__init__() + self._exception = exception + self._traceback = traceback + + def initial_metadata(self) -> Optional[MetadataType]: + return None + + def trailing_metadata(self) -> Optional[MetadataType]: + return None + + def code(self) -> Optional[grpc.StatusCode]: + return grpc.StatusCode.INTERNAL + + def details(self) -> Optional[str]: + return "Exception raised while intercepting the RPC" + + def cancel(self) -> bool: + return False + + def cancelled(self) -> bool: + return False + + def is_active(self) -> bool: + return False + + def time_remaining(self) -> Optional[float]: + return None + + def running(self) -> bool: + return False + + def done(self) -> bool: + return True + + def result(self, ignored_timeout: Optional[float] = None): + raise self._exception + + def exception( + self, ignored_timeout: Optional[float] = None + ) -> Optional[Exception]: + return self._exception + + def traceback( + self, ignored_timeout: Optional[float] = None + ) -> Optional[types.TracebackType]: + return self._traceback + + def add_callback(self, unused_callback) -> bool: + return False + + def add_done_callback(self, fn: DoneCallbackType) -> None: + fn(self) + + def __iter__(self): + return self + + def __next__(self): + raise self._exception + + def next(self): + return self.__next__() + + +class _UnaryOutcome(grpc.Call, grpc.Future): + _response: Any + _call: grpc.Call + + def __init__(self, response: Any, call: grpc.Call): + self._response = response + self._call = call + + def initial_metadata(self) -> Optional[MetadataType]: + return self._call.initial_metadata() + + def trailing_metadata(self) -> Optional[MetadataType]: + return self._call.trailing_metadata() + + def code(self) -> Optional[grpc.StatusCode]: + return self._call.code() + + def details(self) -> Optional[str]: + return self._call.details() + + def is_active(self) -> bool: + return self._call.is_active() + + def time_remaining(self) -> Optional[float]: + return self._call.time_remaining() + + def cancel(self) -> bool: + return self._call.cancel() + + def add_callback(self, callback) -> bool: + return self._call.add_callback(callback) + + def cancelled(self) -> bool: + return False + + def running(self) -> bool: + return False + + def done(self) -> bool: + return True + + def result(self, ignored_timeout: Optional[float] = None): + return self._response + + def exception(self, ignored_timeout: Optional[float] = None): + return None + + def traceback(self, ignored_timeout: Optional[float] = None): + return None + + def add_done_callback(self, fn: DoneCallbackType) -> None: + fn(self) + + +class _UnaryUnaryMultiCallable(grpc.UnaryUnaryMultiCallable): + _thunk: Callable + _method: str + _interceptor: grpc.UnaryUnaryClientInterceptor + + def __init__( + self, + thunk: Callable, + method: str, + interceptor: grpc.UnaryUnaryClientInterceptor, + ): + self._thunk = thunk + self._method = method + self._interceptor = interceptor + + def __call__( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Any: + response, ignored_call = self._with_call( + request, + timeout=timeout, + metadata=metadata, + credentials=credentials, + wait_for_ready=wait_for_ready, + compression=compression, + ) + return response + + def _with_call( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Tuple[Any, grpc.Call]: + client_call_details = _ClientCallDetails( + self._method, + timeout, + metadata, + credentials, + wait_for_ready, + compression, + ) + + def continuation(new_details, request): + ( + new_method, + new_timeout, + new_metadata, + new_credentials, + new_wait_for_ready, + new_compression, + ) = _unwrap_client_call_details(new_details, client_call_details) + try: + response, call = self._thunk(new_method).with_call( + request, + timeout=new_timeout, + metadata=new_metadata, + credentials=new_credentials, + wait_for_ready=new_wait_for_ready, + compression=new_compression, + ) + return _UnaryOutcome(response, call) + except grpc.RpcError as rpc_error: + return rpc_error + except Exception as exception: # pylint:disable=broad-except + return _FailureOutcome(exception, sys.exc_info()[2]) + + call = self._interceptor.intercept_unary_unary( + continuation, client_call_details, request + ) + return call.result(), call + + def with_call( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Tuple[Any, grpc.Call]: + return self._with_call( + request, + timeout=timeout, + metadata=metadata, + credentials=credentials, + wait_for_ready=wait_for_ready, + compression=compression, + ) + + def future( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Any: + client_call_details = _ClientCallDetails( + self._method, + timeout, + metadata, + credentials, + wait_for_ready, + compression, + ) + + def continuation(new_details, request): + ( + new_method, + new_timeout, + new_metadata, + new_credentials, + new_wait_for_ready, + new_compression, + ) = _unwrap_client_call_details(new_details, client_call_details) + return self._thunk(new_method).future( + request, + timeout=new_timeout, + metadata=new_metadata, + credentials=new_credentials, + wait_for_ready=new_wait_for_ready, + compression=new_compression, + ) + + try: + return self._interceptor.intercept_unary_unary( + continuation, client_call_details, request + ) + except Exception as exception: # pylint:disable=broad-except + return _FailureOutcome(exception, sys.exc_info()[2]) + + +class _UnaryStreamMultiCallable(grpc.UnaryStreamMultiCallable): + _thunk: Callable + _method: str + _interceptor: grpc.UnaryStreamClientInterceptor + + def __init__( + self, + thunk: Callable, + method: str, + interceptor: grpc.UnaryStreamClientInterceptor, + ): + self._thunk = thunk + self._method = method + self._interceptor = interceptor + + def __call__( + self, + request: Any, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ): + client_call_details = _ClientCallDetails( + self._method, + timeout, + metadata, + credentials, + wait_for_ready, + compression, + ) + + def continuation(new_details, request): + ( + new_method, + new_timeout, + new_metadata, + new_credentials, + new_wait_for_ready, + new_compression, + ) = _unwrap_client_call_details(new_details, client_call_details) + return self._thunk(new_method)( + request, + timeout=new_timeout, + metadata=new_metadata, + credentials=new_credentials, + wait_for_ready=new_wait_for_ready, + compression=new_compression, + ) + + try: + return self._interceptor.intercept_unary_stream( + continuation, client_call_details, request + ) + except Exception as exception: # pylint:disable=broad-except + return _FailureOutcome(exception, sys.exc_info()[2]) + + +class _StreamUnaryMultiCallable(grpc.StreamUnaryMultiCallable): + _thunk: Callable + _method: str + _interceptor: grpc.StreamUnaryClientInterceptor + + def __init__( + self, + thunk: Callable, + method: str, + interceptor: grpc.StreamUnaryClientInterceptor, + ): + self._thunk = thunk + self._method = method + self._interceptor = interceptor + + def __call__( + self, + request_iterator: RequestIterableType, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Any: + response, ignored_call = self._with_call( + request_iterator, + timeout=timeout, + metadata=metadata, + credentials=credentials, + wait_for_ready=wait_for_ready, + compression=compression, + ) + return response + + def _with_call( + self, + request_iterator: RequestIterableType, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Tuple[Any, grpc.Call]: + client_call_details = _ClientCallDetails( + self._method, + timeout, + metadata, + credentials, + wait_for_ready, + compression, + ) + + def continuation(new_details, request_iterator): + ( + new_method, + new_timeout, + new_metadata, + new_credentials, + new_wait_for_ready, + new_compression, + ) = _unwrap_client_call_details(new_details, client_call_details) + try: + response, call = self._thunk(new_method).with_call( + request_iterator, + timeout=new_timeout, + metadata=new_metadata, + credentials=new_credentials, + wait_for_ready=new_wait_for_ready, + compression=new_compression, + ) + return _UnaryOutcome(response, call) + except grpc.RpcError as rpc_error: + return rpc_error + except Exception as exception: # pylint:disable=broad-except + return _FailureOutcome(exception, sys.exc_info()[2]) + + call = self._interceptor.intercept_stream_unary( + continuation, client_call_details, request_iterator + ) + return call.result(), call + + def with_call( + self, + request_iterator: RequestIterableType, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Tuple[Any, grpc.Call]: + return self._with_call( + request_iterator, + timeout=timeout, + metadata=metadata, + credentials=credentials, + wait_for_ready=wait_for_ready, + compression=compression, + ) + + def future( + self, + request_iterator: RequestIterableType, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> Any: + client_call_details = _ClientCallDetails( + self._method, + timeout, + metadata, + credentials, + wait_for_ready, + compression, + ) + + def continuation(new_details, request_iterator): + ( + new_method, + new_timeout, + new_metadata, + new_credentials, + new_wait_for_ready, + new_compression, + ) = _unwrap_client_call_details(new_details, client_call_details) + return self._thunk(new_method).future( + request_iterator, + timeout=new_timeout, + metadata=new_metadata, + credentials=new_credentials, + wait_for_ready=new_wait_for_ready, + compression=new_compression, + ) + + try: + return self._interceptor.intercept_stream_unary( + continuation, client_call_details, request_iterator + ) + except Exception as exception: # pylint:disable=broad-except + return _FailureOutcome(exception, sys.exc_info()[2]) + + +class _StreamStreamMultiCallable(grpc.StreamStreamMultiCallable): + _thunk: Callable + _method: str + _interceptor: grpc.StreamStreamClientInterceptor + + def __init__( + self, + thunk: Callable, + method: str, + interceptor: grpc.StreamStreamClientInterceptor, + ): + self._thunk = thunk + self._method = method + self._interceptor = interceptor + + def __call__( + self, + request_iterator: RequestIterableType, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ): + client_call_details = _ClientCallDetails( + self._method, + timeout, + metadata, + credentials, + wait_for_ready, + compression, + ) + + def continuation(new_details, request_iterator): + ( + new_method, + new_timeout, + new_metadata, + new_credentials, + new_wait_for_ready, + new_compression, + ) = _unwrap_client_call_details(new_details, client_call_details) + return self._thunk(new_method)( + request_iterator, + timeout=new_timeout, + metadata=new_metadata, + credentials=new_credentials, + wait_for_ready=new_wait_for_ready, + compression=new_compression, + ) + + try: + return self._interceptor.intercept_stream_stream( + continuation, client_call_details, request_iterator + ) + except Exception as exception: # pylint:disable=broad-except + return _FailureOutcome(exception, sys.exc_info()[2]) + + +class _Channel(grpc.Channel): + _channel: grpc.Channel + _interceptor: Union[ + grpc.UnaryUnaryClientInterceptor, + grpc.UnaryStreamClientInterceptor, + grpc.StreamStreamClientInterceptor, + grpc.StreamUnaryClientInterceptor, + ] + + def __init__( + self, + channel: grpc.Channel, + interceptor: Union[ + grpc.UnaryUnaryClientInterceptor, + grpc.UnaryStreamClientInterceptor, + grpc.StreamStreamClientInterceptor, + grpc.StreamUnaryClientInterceptor, + ], + ): + self._channel = channel + self._interceptor = interceptor + + def subscribe( + self, callback: Callable, try_to_connect: Optional[bool] = False + ): + self._channel.subscribe(callback, try_to_connect=try_to_connect) + + def unsubscribe(self, callback: Callable): + self._channel.unsubscribe(callback) + + # pylint: disable=arguments-differ + def unary_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> grpc.UnaryUnaryMultiCallable: + # pytype: disable=wrong-arg-count + thunk = lambda m: self._channel.unary_unary( + m, + request_serializer, + response_deserializer, + _registered_method, + ) + # pytype: enable=wrong-arg-count + if isinstance(self._interceptor, grpc.UnaryUnaryClientInterceptor): + return _UnaryUnaryMultiCallable(thunk, method, self._interceptor) + else: + return thunk(method) + + # pylint: disable=arguments-differ + def unary_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> grpc.UnaryStreamMultiCallable: + # pytype: disable=wrong-arg-count + thunk = lambda m: self._channel.unary_stream( + m, + request_serializer, + response_deserializer, + _registered_method, + ) + # pytype: enable=wrong-arg-count + if isinstance(self._interceptor, grpc.UnaryStreamClientInterceptor): + return _UnaryStreamMultiCallable(thunk, method, self._interceptor) + else: + return thunk(method) + + # pylint: disable=arguments-differ + def stream_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> grpc.StreamUnaryMultiCallable: + # pytype: disable=wrong-arg-count + thunk = lambda m: self._channel.stream_unary( + m, + request_serializer, + response_deserializer, + _registered_method, + ) + # pytype: enable=wrong-arg-count + if isinstance(self._interceptor, grpc.StreamUnaryClientInterceptor): + return _StreamUnaryMultiCallable(thunk, method, self._interceptor) + else: + return thunk(method) + + # pylint: disable=arguments-differ + def stream_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> grpc.StreamStreamMultiCallable: + # pytype: disable=wrong-arg-count + thunk = lambda m: self._channel.stream_stream( + m, + request_serializer, + response_deserializer, + _registered_method, + ) + # pytype: enable=wrong-arg-count + if isinstance(self._interceptor, grpc.StreamStreamClientInterceptor): + return _StreamStreamMultiCallable(thunk, method, self._interceptor) + else: + return thunk(method) + + def _close(self): + self._channel.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self._close() + return False + + def close(self): + self._channel.close() + + +def intercept_channel( + channel: grpc.Channel, + *interceptors: Optional[ + Sequence[ + Union[ + grpc.UnaryUnaryClientInterceptor, + grpc.UnaryStreamClientInterceptor, + grpc.StreamStreamClientInterceptor, + grpc.StreamUnaryClientInterceptor, + ] + ] + ], +) -> grpc.Channel: + for interceptor in reversed(list(interceptors)): + if ( + not isinstance(interceptor, grpc.UnaryUnaryClientInterceptor) + and not isinstance(interceptor, grpc.UnaryStreamClientInterceptor) + and not isinstance(interceptor, grpc.StreamUnaryClientInterceptor) + and not isinstance(interceptor, grpc.StreamStreamClientInterceptor) + ): + raise TypeError( + "interceptor must be " + "grpc.UnaryUnaryClientInterceptor or " + "grpc.UnaryStreamClientInterceptor or " + "grpc.StreamUnaryClientInterceptor or " + "grpc.StreamStreamClientInterceptor or " + ) + channel = _Channel(channel, interceptor) + return channel diff --git a/myenv/lib/python3.12/site-packages/grpc/_observability.py b/myenv/lib/python3.12/site-packages/grpc/_observability.py new file mode 100644 index 0000000..274bd82 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_observability.py @@ -0,0 +1,299 @@ +# Copyright 2023 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import abc +import contextlib +import logging +import threading +from typing import Any, Generator, Generic, List, Optional, TypeVar + +from grpc._cython import cygrpc as _cygrpc +from grpc._typing import ChannelArgumentType + +_LOGGER = logging.getLogger(__name__) + +_channel = Any # _channel.py imports this module. +ClientCallTracerCapsule = TypeVar("ClientCallTracerCapsule") +ServerCallTracerFactoryCapsule = TypeVar("ServerCallTracerFactoryCapsule") + +_plugin_lock: threading.RLock = threading.RLock() +_OBSERVABILITY_PLUGIN: Optional["ObservabilityPlugin"] = None +_SERVICES_TO_EXCLUDE: List[bytes] = [ + b"google.monitoring.v3.MetricService", + b"google.devtools.cloudtrace.v2.TraceService", +] + + +class ServerCallTracerFactory: + """An encapsulation of a ServerCallTracerFactory. + + Instances of this class can be passed to a Channel as values for the + grpc.experimental.server_call_tracer_factory option + """ + + def __init__(self, address): + self._address = address + + def __int__(self): + return self._address + + +class ObservabilityPlugin( + Generic[ClientCallTracerCapsule, ServerCallTracerFactoryCapsule], + metaclass=abc.ABCMeta, +): + """Abstract base class for observability plugin. + + *This is a semi-private class that was intended for the exclusive use of + the gRPC team.* + + The ClientCallTracerCapsule and ClientCallTracerCapsule created by this + plugin should be inject to gRPC core using observability_init at the + start of a program, before any channels/servers are built. + + Any future methods added to this interface cannot have the + @abc.abstractmethod annotation. + + Attributes: + _stats_enabled: A bool indicates whether tracing is enabled. + _tracing_enabled: A bool indicates whether stats(metrics) is enabled. + _registered_methods: A set which stores the registered method names in + bytes. + """ + + _tracing_enabled: bool = False + _stats_enabled: bool = False + + @abc.abstractmethod + def create_client_call_tracer( + self, method_name: bytes, target: bytes + ) -> ClientCallTracerCapsule: + """Creates a ClientCallTracerCapsule. + + After register the plugin, if tracing or stats is enabled, this method + will be called after a call was created, the ClientCallTracer created + by this method will be saved to call context. + + The ClientCallTracer is an object which implements `grpc_core::ClientCallTracer` + interface and wrapped in a PyCapsule using `client_call_tracer` as name. + + Args: + method_name: The method name of the call in byte format. + target: The channel target of the call in byte format. + registered_method: Wether this method is pre-registered. + + Returns: + A PyCapsule which stores a ClientCallTracer object. + """ + raise NotImplementedError() + + @abc.abstractmethod + def save_trace_context( + self, trace_id: str, span_id: str, is_sampled: bool + ) -> None: + """Saves the trace_id and span_id related to the current span. + + After register the plugin, if tracing is enabled, this method will be + called after the server finished sending response. + + This method can be used to propagate census context. + + Args: + trace_id: The identifier for the trace associated with the span as a + 32-character hexadecimal encoded string, + e.g. 26ed0036f2eff2b7317bccce3e28d01f + span_id: The identifier for the span as a 16-character hexadecimal encoded + string. e.g. 113ec879e62583bc + is_sampled: A bool indicates whether the span is sampled. + """ + raise NotImplementedError() + + @abc.abstractmethod + def create_server_call_tracer_factory( + self, + *, + xds: bool = False, + ) -> Optional[ServerCallTracerFactoryCapsule]: + """Creates a ServerCallTracerFactoryCapsule. + + This method will be called at server initialization time to create a + ServerCallTracerFactory, which will be registered to gRPC core. + + The ServerCallTracerFactory is an object which implements + `grpc_core::ServerCallTracerFactory` interface and wrapped in a PyCapsule + using `server_call_tracer_factory` as name. + + Args: + xds: Whether the server is xds server. + Returns: + A PyCapsule which stores a ServerCallTracerFactory object. Or None if + plugin decides not to create ServerCallTracerFactory. + """ + raise NotImplementedError() + + @abc.abstractmethod + def record_rpc_latency( + self, method: str, target: str, rpc_latency: float, status_code: Any + ) -> None: + """Record the latency of the RPC. + + After register the plugin, if stats is enabled, this method will be + called at the end of each RPC. + + Args: + method: The fully-qualified name of the RPC method being invoked. + target: The target name of the RPC method being invoked. + rpc_latency: The latency for the RPC in seconds, equals to the time between + when the client invokes the RPC and when the client receives the status. + status_code: An element of grpc.StatusCode in string format representing the + final status for the RPC. + """ + raise NotImplementedError() + + def set_tracing(self, enable: bool) -> None: + """Enable or disable tracing. + + Args: + enable: A bool indicates whether tracing should be enabled. + """ + self._tracing_enabled = enable + + def set_stats(self, enable: bool) -> None: + """Enable or disable stats(metrics). + + Args: + enable: A bool indicates whether stats should be enabled. + """ + self._stats_enabled = enable + + def save_registered_method(self, method_name: bytes) -> None: + """Saves the method name to registered_method list. + + When exporting metrics, method name for unregistered methods will be replaced + with 'other' by default. + + Args: + method_name: The method name in bytes. + """ + raise NotImplementedError() + + @property + def tracing_enabled(self) -> bool: + return self._tracing_enabled + + @property + def stats_enabled(self) -> bool: + return self._stats_enabled + + @property + def observability_enabled(self) -> bool: + return self.tracing_enabled or self.stats_enabled + + +@contextlib.contextmanager +def get_plugin() -> Generator[Optional[ObservabilityPlugin], None, None]: + """Get the ObservabilityPlugin in _observability module. + + Returns: + The ObservabilityPlugin currently registered with the _observability + module. Or None if no plugin exists at the time of calling this method. + """ + with _plugin_lock: + yield _OBSERVABILITY_PLUGIN + + +def set_plugin(observability_plugin: Optional[ObservabilityPlugin]) -> None: + """Save ObservabilityPlugin to _observability module. + + Args: + observability_plugin: The ObservabilityPlugin to save. + + Raises: + ValueError: If an ObservabilityPlugin was already registered at the + time of calling this method. + """ + global _OBSERVABILITY_PLUGIN # pylint: disable=global-statement + with _plugin_lock: + if observability_plugin and _OBSERVABILITY_PLUGIN: + raise ValueError("observability_plugin was already set!") + _OBSERVABILITY_PLUGIN = observability_plugin + + +def observability_init(observability_plugin: ObservabilityPlugin) -> None: + """Initialize observability with provided ObservabilityPlugin. + + This method have to be called at the start of a program, before any + channels/servers are built. + + Args: + observability_plugin: The ObservabilityPlugin to use. + + Raises: + ValueError: If an ObservabilityPlugin was already registered at the + time of calling this method. + """ + set_plugin(observability_plugin) + + +def observability_deinit() -> None: + """Clear the observability context, including ObservabilityPlugin and + ServerCallTracerFactory + + This method have to be called after exit observability context so that + it's possible to re-initialize again. + """ + set_plugin(None) + _cygrpc.clear_server_call_tracer_factory() + + +def maybe_record_rpc_latency(state: "_channel._RPCState") -> None: + """Record the latency of the RPC, if the plugin is registered and stats is enabled. + + This method will be called at the end of each RPC. + + Args: + state: a grpc._channel._RPCState object which contains the stats related to the + RPC. + """ + # TODO(xuanwn): use channel args to exclude those metrics. + for exclude_prefix in _SERVICES_TO_EXCLUDE: + if exclude_prefix in state.method.encode("utf8"): + return + with get_plugin() as plugin: + if plugin and plugin.stats_enabled: + rpc_latency_s = state.rpc_end_time - state.rpc_start_time + rpc_latency_ms = rpc_latency_s * 1000 + plugin.record_rpc_latency( + state.method, state.target, rpc_latency_ms, state.code + ) + + +def create_server_call_tracer_factory_option(xds: bool) -> ChannelArgumentType: + with get_plugin() as plugin: + if plugin and plugin.stats_enabled: + server_call_tracer_factory_address = ( + _cygrpc.get_server_call_tracer_factory_address(plugin, xds) + ) + if server_call_tracer_factory_address: + return ( + ( + "grpc.experimental.server_call_tracer_factory", + ServerCallTracerFactory( + server_call_tracer_factory_address + ), + ), + ) + return () diff --git a/myenv/lib/python3.12/site-packages/grpc/_plugin_wrapping.py b/myenv/lib/python3.12/site-packages/grpc/_plugin_wrapping.py new file mode 100644 index 0000000..79900ee --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_plugin_wrapping.py @@ -0,0 +1,136 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import collections +import logging +import threading +from typing import Callable, Optional, Type + +import grpc +from grpc import _common +from grpc._cython import cygrpc +from grpc._typing import MetadataType + +_LOGGER = logging.getLogger(__name__) + + +class _AuthMetadataContext( + collections.namedtuple( + "AuthMetadataContext", + ( + "service_url", + "method_name", + ), + ), + grpc.AuthMetadataContext, +): + pass + + +class _CallbackState(object): + def __init__(self): + self.lock = threading.Lock() + self.called = False + self.exception = None + + +class _AuthMetadataPluginCallback(grpc.AuthMetadataPluginCallback): + _state: _CallbackState + _callback: Callable + + def __init__(self, state: _CallbackState, callback: Callable): + self._state = state + self._callback = callback + + def __call__( + self, metadata: MetadataType, error: Optional[Type[BaseException]] + ): + with self._state.lock: + if self._state.exception is None: + if self._state.called: + raise RuntimeError( + "AuthMetadataPluginCallback invoked more than once!" + ) + else: + self._state.called = True + else: + raise RuntimeError( + 'AuthMetadataPluginCallback raised exception "{}"!'.format( + self._state.exception + ) + ) + if error is None: + self._callback(metadata, cygrpc.StatusCode.ok, None) + else: + self._callback( + None, cygrpc.StatusCode.internal, _common.encode(str(error)) + ) + + +class _Plugin(object): + _metadata_plugin: grpc.AuthMetadataPlugin + + def __init__(self, metadata_plugin: grpc.AuthMetadataPlugin): + self._metadata_plugin = metadata_plugin + self._stored_ctx = None + + try: + import contextvars # pylint: disable=wrong-import-position + + # The plugin may be invoked on a thread created by Core, which will not + # have the context propagated. This context is stored and installed in + # the thread invoking the plugin. + self._stored_ctx = contextvars.copy_context() + except ImportError: + # Support versions predating contextvars. + pass + + def __call__(self, service_url: str, method_name: str, callback: Callable): + context = _AuthMetadataContext( + _common.decode(service_url), _common.decode(method_name) + ) + callback_state = _CallbackState() + try: + self._metadata_plugin( + context, _AuthMetadataPluginCallback(callback_state, callback) + ) + except Exception as exception: # pylint: disable=broad-except + _LOGGER.exception( + 'AuthMetadataPluginCallback "%s" raised exception!', + self._metadata_plugin, + ) + with callback_state.lock: + callback_state.exception = exception + if callback_state.called: + return + callback( + None, cygrpc.StatusCode.internal, _common.encode(str(exception)) + ) + + +def metadata_plugin_call_credentials( + metadata_plugin: grpc.AuthMetadataPlugin, name: Optional[str] +) -> grpc.CallCredentials: + if name is None: + try: + effective_name = metadata_plugin.__name__ + except AttributeError: + effective_name = metadata_plugin.__class__.__name__ + else: + effective_name = name + return grpc.CallCredentials( + cygrpc.MetadataPluginCallCredentials( + _Plugin(metadata_plugin), _common.encode(effective_name) + ) + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/_runtime_protos.py b/myenv/lib/python3.12/site-packages/grpc/_runtime_protos.py new file mode 100644 index 0000000..7ff887e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_runtime_protos.py @@ -0,0 +1,165 @@ +# Copyright 2020 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import types +from typing import Tuple, Union + +_REQUIRED_SYMBOLS = ("_protos", "_services", "_protos_and_services") +_MINIMUM_VERSION = (3, 5, 0) + +_UNINSTALLED_TEMPLATE = ( + "Install the grpcio-tools package (1.32.0+) to use the {} function." +) +_VERSION_ERROR_TEMPLATE = ( + "The {} function is only on available on Python 3.X interpreters." +) + + +def _has_runtime_proto_symbols(mod: types.ModuleType) -> bool: + return all(hasattr(mod, sym) for sym in _REQUIRED_SYMBOLS) + + +def _is_grpc_tools_importable() -> bool: + try: + import grpc_tools # pylint: disable=unused-import # pytype: disable=import-error + + return True + except ImportError as e: + # NOTE: It's possible that we're encountering a transitive ImportError, so + # we check for that and re-raise if so. + if "grpc_tools" not in e.args[0]: + raise + return False + + +def _call_with_lazy_import( + fn_name: str, protobuf_path: str +) -> Union[types.ModuleType, Tuple[types.ModuleType, types.ModuleType]]: + """Calls one of the three functions, lazily importing grpc_tools. + + Args: + fn_name: The name of the function to import from grpc_tools.protoc. + protobuf_path: The path to import. + + Returns: + The appropriate module object. + """ + if sys.version_info < _MINIMUM_VERSION: + raise NotImplementedError(_VERSION_ERROR_TEMPLATE.format(fn_name)) + else: + if not _is_grpc_tools_importable(): + raise NotImplementedError(_UNINSTALLED_TEMPLATE.format(fn_name)) + import grpc_tools.protoc # pytype: disable=import-error + + if _has_runtime_proto_symbols(grpc_tools.protoc): + fn = getattr(grpc_tools.protoc, "_" + fn_name) + return fn(protobuf_path) + else: + raise NotImplementedError(_UNINSTALLED_TEMPLATE.format(fn_name)) + + +def protos(protobuf_path): # pylint: disable=unused-argument + """Returns a module generated by the indicated .proto file. + + THIS IS AN EXPERIMENTAL API. + + Use this function to retrieve classes corresponding to message + definitions in the .proto file. + + To inspect the contents of the returned module, use the dir function. + For example: + + ``` + protos = grpc.protos("foo.proto") + print(dir(protos)) + ``` + + The returned module object corresponds to the _pb2.py file generated + by protoc. The path is expected to be relative to an entry on sys.path + and all transitive dependencies of the file should also be resolveable + from an entry on sys.path. + + To completely disable the machinery behind this function, set the + GRPC_PYTHON_DISABLE_DYNAMIC_STUBS environment variable to "true". + + Args: + protobuf_path: The path to the .proto file on the filesystem. This path + must be resolveable from an entry on sys.path and so must all of its + transitive dependencies. + + Returns: + A module object corresponding to the message code for the indicated + .proto file. Equivalent to a generated _pb2.py file. + """ + return _call_with_lazy_import("protos", protobuf_path) + + +def services(protobuf_path): # pylint: disable=unused-argument + """Returns a module generated by the indicated .proto file. + + THIS IS AN EXPERIMENTAL API. + + Use this function to retrieve classes and functions corresponding to + service definitions in the .proto file, including both stub and servicer + definitions. + + To inspect the contents of the returned module, use the dir function. + For example: + + ``` + services = grpc.services("foo.proto") + print(dir(services)) + ``` + + The returned module object corresponds to the _pb2_grpc.py file generated + by protoc. The path is expected to be relative to an entry on sys.path + and all transitive dependencies of the file should also be resolveable + from an entry on sys.path. + + To completely disable the machinery behind this function, set the + GRPC_PYTHON_DISABLE_DYNAMIC_STUBS environment variable to "true". + + Args: + protobuf_path: The path to the .proto file on the filesystem. This path + must be resolveable from an entry on sys.path and so must all of its + transitive dependencies. + + Returns: + A module object corresponding to the stub/service code for the indicated + .proto file. Equivalent to a generated _pb2_grpc.py file. + """ + return _call_with_lazy_import("services", protobuf_path) + + +def protos_and_services(protobuf_path): # pylint: disable=unused-argument + """Returns a 2-tuple of modules corresponding to protos and services. + + THIS IS AN EXPERIMENTAL API. + + The return value of this function is equivalent to a call to protos and a + call to services. + + To completely disable the machinery behind this function, set the + GRPC_PYTHON_DISABLE_DYNAMIC_STUBS environment variable to "true". + + Args: + protobuf_path: The path to the .proto file on the filesystem. This path + must be resolveable from an entry on sys.path and so must all of its + transitive dependencies. + + Returns: + A 2-tuple of module objects corresponding to (protos(path), services(path)). + """ + return _call_with_lazy_import("protos_and_services", protobuf_path) diff --git a/myenv/lib/python3.12/site-packages/grpc/_server.py b/myenv/lib/python3.12/site-packages/grpc/_server.py new file mode 100644 index 0000000..c8af57c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_server.py @@ -0,0 +1,1528 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Service-side implementation of gRPC Python.""" + +from __future__ import annotations + +import abc +import collections +from concurrent import futures +import contextvars +import enum +import logging +import threading +import time +import traceback +from typing import ( + Any, + Callable, + Dict, + Iterable, + Iterator, + List, + Mapping, + Optional, + Sequence, + Set, + Tuple, + Union, +) + +import grpc # pytype: disable=pyi-error +from grpc import _common # pytype: disable=pyi-error +from grpc import _compression # pytype: disable=pyi-error +from grpc import _interceptor # pytype: disable=pyi-error +from grpc import _observability # pytype: disable=pyi-error +from grpc._cython import cygrpc +from grpc._typing import ArityAgnosticMethodHandler +from grpc._typing import ChannelArgumentType +from grpc._typing import DeserializingFunction +from grpc._typing import MetadataType +from grpc._typing import NullaryCallbackType +from grpc._typing import ResponseType +from grpc._typing import SerializingFunction +from grpc._typing import ServerCallbackTag +from grpc._typing import ServerTagCallbackType + +_LOGGER = logging.getLogger(__name__) + +_SHUTDOWN_TAG = "shutdown" +_REQUEST_CALL_TAG = "request_call" + +_RECEIVE_CLOSE_ON_SERVER_TOKEN = "receive_close_on_server" +_SEND_INITIAL_METADATA_TOKEN = "send_initial_metadata" +_RECEIVE_MESSAGE_TOKEN = "receive_message" +_SEND_MESSAGE_TOKEN = "send_message" +_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN = ( + "send_initial_metadata * send_message" +) +_SEND_STATUS_FROM_SERVER_TOKEN = "send_status_from_server" +_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN = ( + "send_initial_metadata * send_status_from_server" +) + +_OPEN = "open" +_CLOSED = "closed" +_CANCELLED = "cancelled" + +_EMPTY_FLAGS = 0 + +_DEALLOCATED_SERVER_CHECK_PERIOD_S = 1.0 +_INF_TIMEOUT = 1e9 + + +def _serialized_request(request_event: cygrpc.BaseEvent) -> bytes: + return request_event.batch_operations[0].message() + + +def _application_code(code: grpc.StatusCode) -> cygrpc.StatusCode: + cygrpc_code = _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE.get(code) + return cygrpc.StatusCode.unknown if cygrpc_code is None else cygrpc_code + + +def _completion_code(state: _RPCState) -> cygrpc.StatusCode: + if state.code is None: + return cygrpc.StatusCode.ok + else: + return _application_code(state.code) + + +def _abortion_code( + state: _RPCState, code: cygrpc.StatusCode +) -> cygrpc.StatusCode: + if state.code is None: + return code + else: + return _application_code(state.code) + + +def _details(state: _RPCState) -> bytes: + return b"" if state.details is None else state.details + + +class _HandlerCallDetails( + collections.namedtuple( + "_HandlerCallDetails", + ( + "method", + "invocation_metadata", + ), + ), + grpc.HandlerCallDetails, +): + pass + + +class _Method(abc.ABC): + @abc.abstractmethod + def name(self) -> Optional[str]: + raise NotImplementedError() + + @abc.abstractmethod + def handler( + self, handler_call_details: _HandlerCallDetails + ) -> Optional[grpc.RpcMethodHandler]: + raise NotImplementedError() + + +class _RegisteredMethod(_Method): + def __init__( + self, + name: str, + registered_handler: Optional[grpc.RpcMethodHandler], + ): + self._name = name + self._registered_handler = registered_handler + + def name(self) -> Optional[str]: + return self._name + + def handler( + self, handler_call_details: _HandlerCallDetails + ) -> Optional[grpc.RpcMethodHandler]: + return self._registered_handler + + +class _GenericMethod(_Method): + def __init__( + self, + generic_handlers: List[grpc.GenericRpcHandler], + ): + self._generic_handlers = generic_handlers + + def name(self) -> Optional[str]: + return None + + def handler( + self, handler_call_details: _HandlerCallDetails + ) -> Optional[grpc.RpcMethodHandler]: + # If the same method have both generic and registered handler, + # registered handler will take precedence. + for generic_handler in self._generic_handlers: + method_handler = generic_handler.service(handler_call_details) + if method_handler is not None: + return method_handler + return None + + +class _RPCState(object): + context: contextvars.Context + condition: threading.Condition + due = Set[str] + request: Any + client: str + initial_metadata_allowed: bool + compression_algorithm: Optional[grpc.Compression] + disable_next_compression: bool + trailing_metadata: Optional[MetadataType] + code: Optional[grpc.StatusCode] + details: Optional[bytes] + statused: bool + rpc_errors: List[Exception] + callbacks: Optional[List[NullaryCallbackType]] + aborted: bool + + def __init__(self): + self.context = contextvars.Context() + self.condition = threading.Condition() + self.due = set() + self.request = None + self.client = _OPEN + self.initial_metadata_allowed = True + self.compression_algorithm = None + self.disable_next_compression = False + self.trailing_metadata = None + self.code = None + self.details = None + self.statused = False + self.rpc_errors = [] + self.callbacks = [] + self.aborted = False + + +def _raise_rpc_error(state: _RPCState) -> None: + rpc_error = grpc.RpcError() + state.rpc_errors.append(rpc_error) + raise rpc_error + + +def _possibly_finish_call( + state: _RPCState, token: str +) -> ServerTagCallbackType: + state.due.remove(token) + if not _is_rpc_state_active(state) and not state.due: + callbacks = state.callbacks + state.callbacks = None + return state, callbacks + else: + return None, () + + +def _send_status_from_server(state: _RPCState, token: str) -> ServerCallbackTag: + def send_status_from_server(unused_send_status_from_server_event): + with state.condition: + return _possibly_finish_call(state, token) + + return send_status_from_server + + +def _get_initial_metadata( + state: _RPCState, metadata: Optional[MetadataType] +) -> Optional[MetadataType]: + with state.condition: + if state.compression_algorithm: + compression_metadata = ( + _compression.compression_algorithm_to_metadata( + state.compression_algorithm + ), + ) + if metadata is None: + return compression_metadata + else: + return compression_metadata + tuple(metadata) + else: + return metadata + + +def _get_initial_metadata_operation( + state: _RPCState, metadata: Optional[MetadataType] +) -> cygrpc.Operation: + operation = cygrpc.SendInitialMetadataOperation( + _get_initial_metadata(state, metadata), _EMPTY_FLAGS + ) + return operation + + +def _abort( + state: _RPCState, call: cygrpc.Call, code: cygrpc.StatusCode, details: bytes +) -> None: + if state.client is not _CANCELLED: + effective_code = _abortion_code(state, code) + effective_details = details if state.details is None else state.details + if state.initial_metadata_allowed: + operations = ( + _get_initial_metadata_operation(state, None), + cygrpc.SendStatusFromServerOperation( + state.trailing_metadata, + effective_code, + effective_details, + _EMPTY_FLAGS, + ), + ) + token = _SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN + else: + operations = ( + cygrpc.SendStatusFromServerOperation( + state.trailing_metadata, + effective_code, + effective_details, + _EMPTY_FLAGS, + ), + ) + token = _SEND_STATUS_FROM_SERVER_TOKEN + call.start_server_batch( + operations, _send_status_from_server(state, token) + ) + state.statused = True + state.due.add(token) + + +def _receive_close_on_server(state: _RPCState) -> ServerCallbackTag: + def receive_close_on_server(receive_close_on_server_event): + with state.condition: + if receive_close_on_server_event.batch_operations[0].cancelled(): + state.client = _CANCELLED + elif state.client is _OPEN: + state.client = _CLOSED + state.condition.notify_all() + return _possibly_finish_call(state, _RECEIVE_CLOSE_ON_SERVER_TOKEN) + + return receive_close_on_server + + +def _receive_message( + state: _RPCState, + call: cygrpc.Call, + request_deserializer: Optional[DeserializingFunction], +) -> ServerCallbackTag: + def receive_message(receive_message_event): + serialized_request = _serialized_request(receive_message_event) + if serialized_request is None: + with state.condition: + if state.client is _OPEN: + state.client = _CLOSED + state.condition.notify_all() + return _possibly_finish_call(state, _RECEIVE_MESSAGE_TOKEN) + else: + request = _common.deserialize( + serialized_request, request_deserializer + ) + with state.condition: + if request is None: + _abort( + state, + call, + cygrpc.StatusCode.internal, + b"Exception deserializing request!", + ) + else: + state.request = request + state.condition.notify_all() + return _possibly_finish_call(state, _RECEIVE_MESSAGE_TOKEN) + + return receive_message + + +def _send_initial_metadata(state: _RPCState) -> ServerCallbackTag: + def send_initial_metadata(unused_send_initial_metadata_event): + with state.condition: + return _possibly_finish_call(state, _SEND_INITIAL_METADATA_TOKEN) + + return send_initial_metadata + + +def _send_message(state: _RPCState, token: str) -> ServerCallbackTag: + def send_message(unused_send_message_event): + with state.condition: + state.condition.notify_all() + return _possibly_finish_call(state, token) + + return send_message + + +class _Context(grpc.ServicerContext): + _rpc_event: cygrpc.BaseEvent + _state: _RPCState + request_deserializer: Optional[DeserializingFunction] + + def __init__( + self, + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + request_deserializer: Optional[DeserializingFunction], + ): + self._rpc_event = rpc_event + self._state = state + self._request_deserializer = request_deserializer + + def is_active(self) -> bool: + with self._state.condition: + return _is_rpc_state_active(self._state) + + def time_remaining(self) -> float: + return max(self._rpc_event.call_details.deadline - time.time(), 0) + + def cancel(self) -> None: + self._rpc_event.call.cancel() + + def add_callback(self, callback: NullaryCallbackType) -> bool: + with self._state.condition: + if self._state.callbacks is None: + return False + else: + self._state.callbacks.append(callback) + return True + + def disable_next_message_compression(self) -> None: + with self._state.condition: + self._state.disable_next_compression = True + + def invocation_metadata(self) -> Optional[MetadataType]: + return self._rpc_event.invocation_metadata + + def peer(self) -> str: + return _common.decode(self._rpc_event.call.peer()) + + def peer_identities(self) -> Optional[Sequence[bytes]]: + return cygrpc.peer_identities(self._rpc_event.call) + + def peer_identity_key(self) -> Optional[str]: + id_key = cygrpc.peer_identity_key(self._rpc_event.call) + return id_key if id_key is None else _common.decode(id_key) + + def auth_context(self) -> Mapping[str, Sequence[bytes]]: + auth_context = cygrpc.auth_context(self._rpc_event.call) + auth_context_dict = {} if auth_context is None else auth_context + return { + _common.decode(key): value + for key, value in auth_context_dict.items() + } + + def set_compression(self, compression: grpc.Compression) -> None: + with self._state.condition: + self._state.compression_algorithm = compression + + def send_initial_metadata(self, initial_metadata: MetadataType) -> None: + with self._state.condition: + if self._state.client is _CANCELLED: + _raise_rpc_error(self._state) + else: + if self._state.initial_metadata_allowed: + operation = _get_initial_metadata_operation( + self._state, initial_metadata + ) + self._rpc_event.call.start_server_batch( + (operation,), _send_initial_metadata(self._state) + ) + self._state.initial_metadata_allowed = False + self._state.due.add(_SEND_INITIAL_METADATA_TOKEN) + else: + raise ValueError("Initial metadata no longer allowed!") + + def set_trailing_metadata(self, trailing_metadata: MetadataType) -> None: + with self._state.condition: + self._state.trailing_metadata = trailing_metadata + + def trailing_metadata(self) -> Optional[MetadataType]: + return self._state.trailing_metadata + + def abort(self, code: grpc.StatusCode, details: str) -> None: + # treat OK like other invalid arguments: fail the RPC + if code == grpc.StatusCode.OK: + _LOGGER.error( + "abort() called with StatusCode.OK; returning UNKNOWN" + ) + code = grpc.StatusCode.UNKNOWN + details = "" + with self._state.condition: + self._state.code = code + self._state.details = _common.encode(details) + self._state.aborted = True + raise Exception() + + def abort_with_status(self, status: grpc.Status) -> None: + self._state.trailing_metadata = status.trailing_metadata + self.abort(status.code, status.details) + + def set_code(self, code: grpc.StatusCode) -> None: + with self._state.condition: + self._state.code = code + + def code(self) -> grpc.StatusCode: + return self._state.code + + def set_details(self, details: str) -> None: + with self._state.condition: + self._state.details = _common.encode(details) + + def details(self) -> bytes: + return self._state.details + + def _finalize_state(self) -> None: + pass + + +class _RequestIterator(object): + _state: _RPCState + _call: cygrpc.Call + _request_deserializer: Optional[DeserializingFunction] + + def __init__( + self, + state: _RPCState, + call: cygrpc.Call, + request_deserializer: Optional[DeserializingFunction], + ): + self._state = state + self._call = call + self._request_deserializer = request_deserializer + + def _raise_or_start_receive_message(self) -> None: + if self._state.client is _CANCELLED: + _raise_rpc_error(self._state) + elif not _is_rpc_state_active(self._state): + raise StopIteration() + else: + self._call.start_server_batch( + (cygrpc.ReceiveMessageOperation(_EMPTY_FLAGS),), + _receive_message( + self._state, self._call, self._request_deserializer + ), + ) + self._state.due.add(_RECEIVE_MESSAGE_TOKEN) + + def _look_for_request(self) -> Any: + if self._state.client is _CANCELLED: + _raise_rpc_error(self._state) + elif ( + self._state.request is None + and _RECEIVE_MESSAGE_TOKEN not in self._state.due + ): + raise StopIteration() + else: + request = self._state.request + self._state.request = None + return request + + raise AssertionError() # should never run + + def _next(self) -> Any: + with self._state.condition: + self._raise_or_start_receive_message() + while True: + self._state.condition.wait() + request = self._look_for_request() + if request is not None: + return request + + def __iter__(self) -> _RequestIterator: + return self + + def __next__(self) -> Any: + return self._next() + + def next(self) -> Any: + return self._next() + + +def _unary_request( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + request_deserializer: Optional[DeserializingFunction], +) -> Callable[[], Any]: + def unary_request(): + with state.condition: + if not _is_rpc_state_active(state): + return None + else: + rpc_event.call.start_server_batch( + (cygrpc.ReceiveMessageOperation(_EMPTY_FLAGS),), + _receive_message( + state, rpc_event.call, request_deserializer + ), + ) + state.due.add(_RECEIVE_MESSAGE_TOKEN) + while True: + state.condition.wait() + if state.request is None: + if state.client is _CLOSED: + details = '"{}" requires exactly one request message.'.format( + rpc_event.call_details.method + ) + _abort( + state, + rpc_event.call, + cygrpc.StatusCode.unimplemented, + _common.encode(details), + ) + return None + elif state.client is _CANCELLED: + return None + else: + request = state.request + state.request = None + return request + + return unary_request + + +def _call_behavior( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + behavior: ArityAgnosticMethodHandler, + argument: Any, + request_deserializer: Optional[DeserializingFunction], + send_response_callback: Optional[Callable[[ResponseType], None]] = None, +) -> Tuple[Union[ResponseType, Iterator[ResponseType]], bool]: + from grpc import _create_servicer_context # pytype: disable=pyi-error + + with _create_servicer_context( + rpc_event, state, request_deserializer + ) as context: + try: + response_or_iterator = None + if send_response_callback is not None: + response_or_iterator = behavior( + argument, context, send_response_callback + ) + else: + response_or_iterator = behavior(argument, context) + return response_or_iterator, True + except Exception as exception: # pylint: disable=broad-except + with state.condition: + if state.aborted: + _abort( + state, + rpc_event.call, + cygrpc.StatusCode.unknown, + b"RPC Aborted", + ) + elif exception not in state.rpc_errors: + try: + details = "Exception calling application: {}".format( + exception + ) + except Exception: # pylint: disable=broad-except + details = ( + "Calling application raised unprintable Exception!" + ) + _LOGGER.exception( + traceback.format_exception( + type(exception), + exception, + exception.__traceback__, + ) + ) + traceback.print_exc() + _LOGGER.exception(details) + _abort( + state, + rpc_event.call, + cygrpc.StatusCode.unknown, + _common.encode(details), + ) + return None, False + + +def _take_response_from_response_iterator( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + response_iterator: Iterator[ResponseType], +) -> Tuple[ResponseType, bool]: + try: + return next(response_iterator), True + except StopIteration: + return None, True + except Exception as exception: # pylint: disable=broad-except + with state.condition: + if state.aborted: + _abort( + state, + rpc_event.call, + cygrpc.StatusCode.unknown, + b"RPC Aborted", + ) + elif exception not in state.rpc_errors: + details = "Exception iterating responses: {}".format(exception) + _LOGGER.exception(details) + _abort( + state, + rpc_event.call, + cygrpc.StatusCode.unknown, + _common.encode(details), + ) + return None, False + + +def _serialize_response( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + response: Any, + response_serializer: Optional[SerializingFunction], +) -> Optional[bytes]: + serialized_response = _common.serialize(response, response_serializer) + if serialized_response is None: + with state.condition: + _abort( + state, + rpc_event.call, + cygrpc.StatusCode.internal, + b"Failed to serialize response!", + ) + return None + else: + return serialized_response + + +def _get_send_message_op_flags_from_state( + state: _RPCState, +) -> Union[int, cygrpc.WriteFlag]: + if state.disable_next_compression: + return cygrpc.WriteFlag.no_compress + else: + return _EMPTY_FLAGS + + +def _reset_per_message_state(state: _RPCState) -> None: + with state.condition: + state.disable_next_compression = False + + +def _send_response( + rpc_event: cygrpc.BaseEvent, state: _RPCState, serialized_response: bytes +) -> bool: + with state.condition: + if not _is_rpc_state_active(state): + return False + else: + if state.initial_metadata_allowed: + operations = ( + _get_initial_metadata_operation(state, None), + cygrpc.SendMessageOperation( + serialized_response, + _get_send_message_op_flags_from_state(state), + ), + ) + state.initial_metadata_allowed = False + token = _SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN + else: + operations = ( + cygrpc.SendMessageOperation( + serialized_response, + _get_send_message_op_flags_from_state(state), + ), + ) + token = _SEND_MESSAGE_TOKEN + rpc_event.call.start_server_batch( + operations, _send_message(state, token) + ) + state.due.add(token) + _reset_per_message_state(state) + while True: + state.condition.wait() + if token not in state.due: + return _is_rpc_state_active(state) + + +def _status( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + serialized_response: Optional[bytes], +) -> None: + with state.condition: + if state.client is not _CANCELLED: + code = _completion_code(state) + details = _details(state) + operations = [ + cygrpc.SendStatusFromServerOperation( + state.trailing_metadata, code, details, _EMPTY_FLAGS + ), + ] + if state.initial_metadata_allowed: + operations.append(_get_initial_metadata_operation(state, None)) + if serialized_response is not None: + operations.append( + cygrpc.SendMessageOperation( + serialized_response, + _get_send_message_op_flags_from_state(state), + ) + ) + rpc_event.call.start_server_batch( + operations, + _send_status_from_server(state, _SEND_STATUS_FROM_SERVER_TOKEN), + ) + state.statused = True + _reset_per_message_state(state) + state.due.add(_SEND_STATUS_FROM_SERVER_TOKEN) + + +def _unary_response_in_pool( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + behavior: ArityAgnosticMethodHandler, + argument_thunk: Callable[[], Any], + request_deserializer: Optional[SerializingFunction], + response_serializer: Optional[SerializingFunction], +) -> None: + cygrpc.install_context_from_request_call_event(rpc_event) + + try: + argument = argument_thunk() + if argument is not None: + response, proceed = _call_behavior( + rpc_event, state, behavior, argument, request_deserializer + ) + if proceed: + serialized_response = _serialize_response( + rpc_event, state, response, response_serializer + ) + if serialized_response is not None: + _status(rpc_event, state, serialized_response) + except Exception: # pylint: disable=broad-except + traceback.print_exc() + finally: + cygrpc.uninstall_context() + + +def _stream_response_in_pool( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + behavior: ArityAgnosticMethodHandler, + argument_thunk: Callable[[], Any], + request_deserializer: Optional[DeserializingFunction], + response_serializer: Optional[SerializingFunction], +) -> None: + cygrpc.install_context_from_request_call_event(rpc_event) + + def send_response(response: Any) -> None: + if response is None: + _status(rpc_event, state, None) + else: + serialized_response = _serialize_response( + rpc_event, state, response, response_serializer + ) + if serialized_response is not None: + _send_response(rpc_event, state, serialized_response) + + try: + argument = argument_thunk() + if argument is not None: + if ( + hasattr(behavior, "experimental_non_blocking") + and behavior.experimental_non_blocking + ): + _call_behavior( + rpc_event, + state, + behavior, + argument, + request_deserializer, + send_response_callback=send_response, + ) + else: + response_iterator, proceed = _call_behavior( + rpc_event, state, behavior, argument, request_deserializer + ) + if proceed: + _send_message_callback_to_blocking_iterator_adapter( + rpc_event, state, send_response, response_iterator + ) + except Exception: # pylint: disable=broad-except + traceback.print_exc() + finally: + cygrpc.uninstall_context() + + +def _is_rpc_state_active(state: _RPCState) -> bool: + return state.client is not _CANCELLED and not state.statused + + +def _send_message_callback_to_blocking_iterator_adapter( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + send_response_callback: Callable[[ResponseType], None], + response_iterator: Iterator[ResponseType], +) -> None: + while True: + response, proceed = _take_response_from_response_iterator( + rpc_event, state, response_iterator + ) + if proceed: + send_response_callback(response) + if not _is_rpc_state_active(state): + break + else: + break + + +def _select_thread_pool_for_behavior( + behavior: ArityAgnosticMethodHandler, + default_thread_pool: futures.ThreadPoolExecutor, +) -> futures.ThreadPoolExecutor: + if hasattr(behavior, "experimental_thread_pool") and isinstance( + behavior.experimental_thread_pool, futures.ThreadPoolExecutor + ): + return behavior.experimental_thread_pool + else: + return default_thread_pool + + +def _handle_unary_unary( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + method_handler: grpc.RpcMethodHandler, + default_thread_pool: futures.ThreadPoolExecutor, +) -> futures.Future: + unary_request = _unary_request( + rpc_event, state, method_handler.request_deserializer + ) + thread_pool = _select_thread_pool_for_behavior( + method_handler.unary_unary, default_thread_pool + ) + return thread_pool.submit( + state.context.run, + _unary_response_in_pool, + rpc_event, + state, + method_handler.unary_unary, + unary_request, + method_handler.request_deserializer, + method_handler.response_serializer, + ) + + +def _handle_unary_stream( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + method_handler: grpc.RpcMethodHandler, + default_thread_pool: futures.ThreadPoolExecutor, +) -> futures.Future: + unary_request = _unary_request( + rpc_event, state, method_handler.request_deserializer + ) + thread_pool = _select_thread_pool_for_behavior( + method_handler.unary_stream, default_thread_pool + ) + return thread_pool.submit( + state.context.run, + _stream_response_in_pool, + rpc_event, + state, + method_handler.unary_stream, + unary_request, + method_handler.request_deserializer, + method_handler.response_serializer, + ) + + +def _handle_stream_unary( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + method_handler: grpc.RpcMethodHandler, + default_thread_pool: futures.ThreadPoolExecutor, +) -> futures.Future: + request_iterator = _RequestIterator( + state, rpc_event.call, method_handler.request_deserializer + ) + thread_pool = _select_thread_pool_for_behavior( + method_handler.stream_unary, default_thread_pool + ) + return thread_pool.submit( + state.context.run, + _unary_response_in_pool, + rpc_event, + state, + method_handler.stream_unary, + lambda: request_iterator, + method_handler.request_deserializer, + method_handler.response_serializer, + ) + + +def _handle_stream_stream( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + method_handler: grpc.RpcMethodHandler, + default_thread_pool: futures.ThreadPoolExecutor, +) -> futures.Future: + request_iterator = _RequestIterator( + state, rpc_event.call, method_handler.request_deserializer + ) + thread_pool = _select_thread_pool_for_behavior( + method_handler.stream_stream, default_thread_pool + ) + return thread_pool.submit( + state.context.run, + _stream_response_in_pool, + rpc_event, + state, + method_handler.stream_stream, + lambda: request_iterator, + method_handler.request_deserializer, + method_handler.response_serializer, + ) + + +def _find_method_handler( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + method_with_handler: _Method, + interceptor_pipeline: Optional[_interceptor._ServicePipeline], +) -> Optional[grpc.RpcMethodHandler]: + def query_handlers( + handler_call_details: _HandlerCallDetails, + ) -> Optional[grpc.RpcMethodHandler]: + return method_with_handler.handler(handler_call_details) + + method_name = method_with_handler.name() + if not method_name: + method_name = _common.decode(rpc_event.call_details.method) + + handler_call_details = _HandlerCallDetails( + method_name, + rpc_event.invocation_metadata, + ) + + if interceptor_pipeline is not None: + return state.context.run( + interceptor_pipeline.execute, query_handlers, handler_call_details + ) + else: + return state.context.run(query_handlers, handler_call_details) + + +def _reject_rpc( + rpc_event: cygrpc.BaseEvent, + rpc_state: _RPCState, + status: cygrpc.StatusCode, + details: bytes, +): + operations = ( + _get_initial_metadata_operation(rpc_state, None), + cygrpc.ReceiveCloseOnServerOperation(_EMPTY_FLAGS), + cygrpc.SendStatusFromServerOperation( + None, status, details, _EMPTY_FLAGS + ), + ) + rpc_event.call.start_server_batch( + operations, + lambda ignored_event: ( + rpc_state, + (), + ), + ) + + +def _handle_with_method_handler( + rpc_event: cygrpc.BaseEvent, + state: _RPCState, + method_handler: grpc.RpcMethodHandler, + thread_pool: futures.ThreadPoolExecutor, +) -> futures.Future: + with state.condition: + rpc_event.call.start_server_batch( + (cygrpc.ReceiveCloseOnServerOperation(_EMPTY_FLAGS),), + _receive_close_on_server(state), + ) + state.due.add(_RECEIVE_CLOSE_ON_SERVER_TOKEN) + if method_handler.request_streaming: + if method_handler.response_streaming: + return _handle_stream_stream( + rpc_event, state, method_handler, thread_pool + ) + else: + return _handle_stream_unary( + rpc_event, state, method_handler, thread_pool + ) + else: + if method_handler.response_streaming: + return _handle_unary_stream( + rpc_event, state, method_handler, thread_pool + ) + else: + return _handle_unary_unary( + rpc_event, state, method_handler, thread_pool + ) + + +def _handle_call( + rpc_event: cygrpc.BaseEvent, + method_with_handler: _Method, + interceptor_pipeline: Optional[_interceptor._ServicePipeline], + thread_pool: futures.ThreadPoolExecutor, + concurrency_exceeded: bool, +) -> Tuple[Optional[_RPCState], Optional[futures.Future]]: + """Handles RPC based on provided handlers. + + When receiving a call event from Core, registered method will have it's + name as tag, we pass the tag as registered_method_name to this method, + then we can find the handler in registered_method_handlers based on + the method name. + + For call event with unregistered method, the method name will be included + in rpc_event.call_details.method and we need to query the generics handlers + to find the actual handler. + """ + if not rpc_event.success: + return None, None + if rpc_event.call_details.method or method_with_handler.name(): + rpc_state = _RPCState() + try: + method_handler = _find_method_handler( + rpc_event, + rpc_state, + method_with_handler, + interceptor_pipeline, + ) + except Exception as exception: # pylint: disable=broad-except + details = "Exception servicing handler: {}".format(exception) + _LOGGER.exception(details) + _reject_rpc( + rpc_event, + rpc_state, + cygrpc.StatusCode.unknown, + b"Error in service handler!", + ) + return rpc_state, None + if method_handler is None: + _reject_rpc( + rpc_event, + rpc_state, + cygrpc.StatusCode.unimplemented, + b"Method not found!", + ) + return rpc_state, None + elif concurrency_exceeded: + _reject_rpc( + rpc_event, + rpc_state, + cygrpc.StatusCode.resource_exhausted, + b"Concurrent RPC limit exceeded!", + ) + return rpc_state, None + else: + return ( + rpc_state, + _handle_with_method_handler( + rpc_event, rpc_state, method_handler, thread_pool + ), + ) + else: + return None, None + + +@enum.unique +class _ServerStage(enum.Enum): + STOPPED = "stopped" + STARTED = "started" + GRACE = "grace" + + +class _ServerState(object): + lock: threading.RLock + completion_queue: cygrpc.CompletionQueue + server: cygrpc.Server + generic_handlers: List[grpc.GenericRpcHandler] + registered_method_handlers: Dict[str, grpc.RpcMethodHandler] + interceptor_pipeline: Optional[_interceptor._ServicePipeline] + thread_pool: futures.ThreadPoolExecutor + stage: _ServerStage + termination_event: threading.Event + shutdown_events: List[threading.Event] + maximum_concurrent_rpcs: Optional[int] + active_rpc_count: int + rpc_states: Set[_RPCState] + due: Set[str] + server_deallocated: bool + + # pylint: disable=too-many-arguments + def __init__( + self, + completion_queue: cygrpc.CompletionQueue, + server: cygrpc.Server, + generic_handlers: Sequence[grpc.GenericRpcHandler], + interceptor_pipeline: Optional[_interceptor._ServicePipeline], + thread_pool: futures.ThreadPoolExecutor, + maximum_concurrent_rpcs: Optional[int], + ): + self.lock = threading.RLock() + self.completion_queue = completion_queue + self.server = server + self.generic_handlers = list(generic_handlers) + self.interceptor_pipeline = interceptor_pipeline + self.thread_pool = thread_pool + self.stage = _ServerStage.STOPPED + self.termination_event = threading.Event() + self.shutdown_events = [self.termination_event] + self.maximum_concurrent_rpcs = maximum_concurrent_rpcs + self.active_rpc_count = 0 + self.registered_method_handlers = {} + + # TODO(https://github.com/grpc/grpc/issues/6597): eliminate these fields. + self.rpc_states = set() + self.due = set() + + # A "volatile" flag to interrupt the daemon serving thread + self.server_deallocated = False + + +def _add_generic_handlers( + state: _ServerState, generic_handlers: Iterable[grpc.GenericRpcHandler] +) -> None: + with state.lock: + state.generic_handlers.extend(generic_handlers) + + +def _add_registered_method_handlers( + state: _ServerState, method_handlers: Dict[str, grpc.RpcMethodHandler] +) -> None: + with state.lock: + state.registered_method_handlers.update(method_handlers) + + +def _add_insecure_port(state: _ServerState, address: bytes) -> int: + with state.lock: + return state.server.add_http2_port(address) + + +def _add_secure_port( + state: _ServerState, + address: bytes, + server_credentials: grpc.ServerCredentials, +) -> int: + with state.lock: + return state.server.add_http2_port( + address, server_credentials._credentials + ) + + +def _request_call(state: _ServerState) -> None: + state.server.request_call( + state.completion_queue, state.completion_queue, _REQUEST_CALL_TAG + ) + state.due.add(_REQUEST_CALL_TAG) + + +def _request_registered_call(state: _ServerState, method: str) -> None: + registered_call_tag = method + state.server.request_registered_call( + state.completion_queue, + state.completion_queue, + method, + registered_call_tag, + ) + state.due.add(registered_call_tag) + + +# TODO(https://github.com/grpc/grpc/issues/6597): delete this function. +def _stop_serving(state: _ServerState) -> bool: + if not state.rpc_states and not state.due: + state.server.destroy() + for shutdown_event in state.shutdown_events: + shutdown_event.set() + state.stage = _ServerStage.STOPPED + return True + else: + return False + + +def _on_call_completed(state: _ServerState) -> None: + with state.lock: + state.active_rpc_count -= 1 + + +# pylint: disable=too-many-branches +def _process_event_and_continue( + state: _ServerState, event: cygrpc.BaseEvent +) -> bool: + should_continue = True + if event.tag is _SHUTDOWN_TAG: + with state.lock: + state.due.remove(_SHUTDOWN_TAG) + if _stop_serving(state): + should_continue = False + elif ( + event.tag is _REQUEST_CALL_TAG + or event.tag in state.registered_method_handlers.keys() + ): + registered_method_name = None + if event.tag in state.registered_method_handlers.keys(): + registered_method_name = event.tag + method_with_handler = _RegisteredMethod( + registered_method_name, + state.registered_method_handlers.get( + registered_method_name, None + ), + ) + else: + method_with_handler = _GenericMethod( + state.generic_handlers, + ) + with state.lock: + state.due.remove(event.tag) + concurrency_exceeded = ( + state.maximum_concurrent_rpcs is not None + and state.active_rpc_count >= state.maximum_concurrent_rpcs + ) + rpc_state, rpc_future = _handle_call( + event, + method_with_handler, + state.interceptor_pipeline, + state.thread_pool, + concurrency_exceeded, + ) + if rpc_state is not None: + state.rpc_states.add(rpc_state) + if rpc_future is not None: + state.active_rpc_count += 1 + rpc_future.add_done_callback( + lambda unused_future: _on_call_completed(state) + ) + if state.stage is _ServerStage.STARTED: + if ( + registered_method_name + in state.registered_method_handlers.keys() + ): + _request_registered_call(state, registered_method_name) + else: + _request_call(state) + elif _stop_serving(state): + should_continue = False + else: + rpc_state, callbacks = event.tag(event) + for callback in callbacks: + try: + callback() + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Exception calling callback!") + if rpc_state is not None: + with state.lock: + state.rpc_states.remove(rpc_state) + if _stop_serving(state): + should_continue = False + return should_continue + + +def _serve(state: _ServerState) -> None: + while True: + timeout = time.time() + _DEALLOCATED_SERVER_CHECK_PERIOD_S + event = state.completion_queue.poll(timeout) + if state.server_deallocated: + _begin_shutdown_once(state) + if event.completion_type != cygrpc.CompletionType.queue_timeout: + if not _process_event_and_continue(state, event): + return + # We want to force the deletion of the previous event + # ~before~ we poll again; if the event has a reference + # to a shutdown Call object, this can induce spinlock. + event = None + + +def _begin_shutdown_once(state: _ServerState) -> None: + with state.lock: + if state.stage is _ServerStage.STARTED: + state.server.shutdown(state.completion_queue, _SHUTDOWN_TAG) + state.stage = _ServerStage.GRACE + state.due.add(_SHUTDOWN_TAG) + + +def _stop(state: _ServerState, grace: Optional[float]) -> threading.Event: + with state.lock: + if state.stage is _ServerStage.STOPPED: + shutdown_event = threading.Event() + shutdown_event.set() + return shutdown_event + else: + _begin_shutdown_once(state) + shutdown_event = threading.Event() + state.shutdown_events.append(shutdown_event) + if grace is None: + state.server.cancel_all_calls() + else: + + def cancel_all_calls_after_grace(): + shutdown_event.wait(timeout=grace) + with state.lock: + state.server.cancel_all_calls() + + thread = threading.Thread(target=cancel_all_calls_after_grace) + thread.start() + return shutdown_event + shutdown_event.wait() + return shutdown_event + + +def _start(state: _ServerState) -> None: + with state.lock: + if state.stage is not _ServerStage.STOPPED: + raise ValueError("Cannot start already-started server!") + state.server.start() + state.stage = _ServerStage.STARTED + # Request a call for each registered method so we can handle any of them. + for method in state.registered_method_handlers.keys(): + _request_registered_call(state, method) + # Also request a call for non-registered method. + _request_call(state) + thread = threading.Thread(target=_serve, args=(state,)) + thread.daemon = True + thread.start() + + +def _validate_generic_rpc_handlers( + generic_rpc_handlers: Iterable[grpc.GenericRpcHandler], +) -> None: + for generic_rpc_handler in generic_rpc_handlers: + service_attribute = getattr(generic_rpc_handler, "service", None) + if service_attribute is None: + raise AttributeError( + '"{}" must conform to grpc.GenericRpcHandler type but does ' + 'not have "service" method!'.format(generic_rpc_handler) + ) + + +def _augment_options( + base_options: Sequence[ChannelArgumentType], + compression: Optional[grpc.Compression], + xds: bool, +) -> Sequence[ChannelArgumentType]: + compression_option = _compression.create_channel_option(compression) + maybe_server_call_tracer_factory_option = ( + _observability.create_server_call_tracer_factory_option(xds) + ) + return ( + tuple(base_options) + + compression_option + + maybe_server_call_tracer_factory_option + ) + + +class _Server(grpc.Server): + _state: _ServerState + + # pylint: disable=too-many-arguments + def __init__( + self, + thread_pool: futures.ThreadPoolExecutor, + generic_handlers: Sequence[grpc.GenericRpcHandler], + interceptors: Sequence[grpc.ServerInterceptor], + options: Sequence[ChannelArgumentType], + maximum_concurrent_rpcs: Optional[int], + compression: Optional[grpc.Compression], + xds: bool, + ): + completion_queue = cygrpc.CompletionQueue() + server = cygrpc.Server(_augment_options(options, compression, xds), xds) + server.register_completion_queue(completion_queue) + self._state = _ServerState( + completion_queue, + server, + generic_handlers, + _interceptor.service_pipeline(interceptors), + thread_pool, + maximum_concurrent_rpcs, + ) + self._cy_server = server + + def add_generic_rpc_handlers( + self, generic_rpc_handlers: Iterable[grpc.GenericRpcHandler] + ) -> None: + _validate_generic_rpc_handlers(generic_rpc_handlers) + _add_generic_handlers(self._state, generic_rpc_handlers) + + def add_registered_method_handlers( + self, + service_name: str, + method_handlers: Dict[str, grpc.RpcMethodHandler], + ) -> None: + # Can't register method once server started. + with self._state.lock: + if self._state.stage is _ServerStage.STARTED: + return + + # TODO(xuanwn): We should validate method_handlers first. + method_to_handlers = { + _common.fully_qualified_method(service_name, method): method_handler + for method, method_handler in method_handlers.items() + } + for fully_qualified_method in method_to_handlers.keys(): + self._cy_server.register_method(fully_qualified_method) + _add_registered_method_handlers(self._state, method_to_handlers) + + def add_insecure_port(self, address: str) -> int: + return _common.validate_port_binding_result( + address, _add_insecure_port(self._state, _common.encode(address)) + ) + + def add_secure_port( + self, address: str, server_credentials: grpc.ServerCredentials + ) -> int: + return _common.validate_port_binding_result( + address, + _add_secure_port( + self._state, _common.encode(address), server_credentials + ), + ) + + def start(self) -> None: + _start(self._state) + + def wait_for_termination(self, timeout: Optional[float] = None) -> bool: + # NOTE(https://bugs.python.org/issue35935) + # Remove this workaround once threading.Event.wait() is working with + # CTRL+C across platforms. + return _common.wait( + self._state.termination_event.wait, + self._state.termination_event.is_set, + timeout=timeout, + ) + + def stop(self, grace: Optional[float]) -> threading.Event: + return _stop(self._state, grace) + + def __del__(self): + if hasattr(self, "_state"): + # We can not grab a lock in __del__(), so set a flag to signal the + # serving daemon thread (if it exists) to initiate shutdown. + self._state.server_deallocated = True + + +def create_server( + thread_pool: futures.ThreadPoolExecutor, + generic_rpc_handlers: Sequence[grpc.GenericRpcHandler], + interceptors: Sequence[grpc.ServerInterceptor], + options: Sequence[ChannelArgumentType], + maximum_concurrent_rpcs: Optional[int], + compression: Optional[grpc.Compression], + xds: bool, +) -> _Server: + _validate_generic_rpc_handlers(generic_rpc_handlers) + return _Server( + thread_pool, + generic_rpc_handlers, + interceptors, + options, + maximum_concurrent_rpcs, + compression, + xds, + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/_simple_stubs.py b/myenv/lib/python3.12/site-packages/grpc/_simple_stubs.py new file mode 100644 index 0000000..3e88670 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_simple_stubs.py @@ -0,0 +1,588 @@ +# Copyright 2020 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Functions that obviate explicit stubs and explicit channels.""" + +import collections +import datetime +import logging +import os +import threading +from typing import ( + Any, + AnyStr, + Callable, + Dict, + Iterator, + Optional, + Sequence, + Tuple, + TypeVar, + Union, +) + +import grpc +from grpc.experimental import experimental_api + +RequestType = TypeVar("RequestType") +ResponseType = TypeVar("ResponseType") + +OptionsType = Sequence[Tuple[str, str]] +CacheKey = Tuple[ + str, + OptionsType, + Optional[grpc.ChannelCredentials], + Optional[grpc.Compression], +] + +_LOGGER = logging.getLogger(__name__) + +_EVICTION_PERIOD_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" +if _EVICTION_PERIOD_KEY in os.environ: + _EVICTION_PERIOD = datetime.timedelta( + seconds=float(os.environ[_EVICTION_PERIOD_KEY]) + ) + _LOGGER.debug( + "Setting managed channel eviction period to %s", _EVICTION_PERIOD + ) +else: + _EVICTION_PERIOD = datetime.timedelta(minutes=10) + +_MAXIMUM_CHANNELS_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" +if _MAXIMUM_CHANNELS_KEY in os.environ: + _MAXIMUM_CHANNELS = int(os.environ[_MAXIMUM_CHANNELS_KEY]) + _LOGGER.debug("Setting maximum managed channels to %d", _MAXIMUM_CHANNELS) +else: + _MAXIMUM_CHANNELS = 2**8 + +_DEFAULT_TIMEOUT_KEY = "GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS" +if _DEFAULT_TIMEOUT_KEY in os.environ: + _DEFAULT_TIMEOUT = float(os.environ[_DEFAULT_TIMEOUT_KEY]) + _LOGGER.debug("Setting default timeout seconds to %f", _DEFAULT_TIMEOUT) +else: + _DEFAULT_TIMEOUT = 60.0 + + +def _create_channel( + target: str, + options: Sequence[Tuple[str, str]], + channel_credentials: Optional[grpc.ChannelCredentials], + compression: Optional[grpc.Compression], +) -> grpc.Channel: + _LOGGER.debug( + f"Creating secure channel with credentials '{channel_credentials}', " + + f"options '{options}' and compression '{compression}'" + ) + return grpc.secure_channel( + target, + credentials=channel_credentials, + options=options, + compression=compression, + ) + + +class ChannelCache: + # NOTE(rbellevi): Untyped due to reference cycle. + _singleton = None + _lock: threading.RLock = threading.RLock() + _condition: threading.Condition = threading.Condition(lock=_lock) + _eviction_ready: threading.Event = threading.Event() + + _mapping: Dict[CacheKey, Tuple[grpc.Channel, datetime.datetime]] + _eviction_thread: threading.Thread + + def __init__(self): + self._mapping = collections.OrderedDict() + self._eviction_thread = threading.Thread( + target=ChannelCache._perform_evictions, daemon=True + ) + self._eviction_thread.start() + + @staticmethod + def get(): + with ChannelCache._lock: + if ChannelCache._singleton is None: + ChannelCache._singleton = ChannelCache() + ChannelCache._eviction_ready.wait() + return ChannelCache._singleton + + def _evict_locked(self, key: CacheKey): + channel, _ = self._mapping.pop(key) + _LOGGER.debug( + "Evicting channel %s with configuration %s.", channel, key + ) + channel.close() + del channel + + @staticmethod + def _perform_evictions(): + while True: + with ChannelCache._lock: + ChannelCache._eviction_ready.set() + if not ChannelCache._singleton._mapping: + ChannelCache._condition.wait() + elif len(ChannelCache._singleton._mapping) > _MAXIMUM_CHANNELS: + key = next(iter(ChannelCache._singleton._mapping.keys())) + ChannelCache._singleton._evict_locked(key) + # And immediately reevaluate. + else: + key, (_, eviction_time) = next( + iter(ChannelCache._singleton._mapping.items()) + ) + now = datetime.datetime.now() + if eviction_time <= now: + ChannelCache._singleton._evict_locked(key) + continue + else: + time_to_eviction = (eviction_time - now).total_seconds() + # NOTE: We aim to *eventually* coalesce to a state in + # which no overdue channels are in the cache and the + # length of the cache is longer than _MAXIMUM_CHANNELS. + # We tolerate momentary states in which these two + # criteria are not met. + ChannelCache._condition.wait(timeout=time_to_eviction) + + def get_channel( + self, + target: str, + options: Sequence[Tuple[str, str]], + channel_credentials: Optional[grpc.ChannelCredentials], + insecure: bool, + compression: Optional[grpc.Compression], + method: str, + _registered_method: bool, + ) -> Tuple[grpc.Channel, Optional[int]]: + """Get a channel from cache or creates a new channel. + + This method also takes care of register method for channel, + which means we'll register a new call handle if we're calling a + non-registered method for an existing channel. + + Returns: + A tuple with two items. The first item is the channel, second item is + the call handle if the method is registered, None if it's not registered. + """ + if insecure and channel_credentials: + raise ValueError( + "The insecure option is mutually exclusive with " + + "the channel_credentials option. Please use one " + + "or the other." + ) + if insecure: + channel_credentials = ( + grpc.experimental.insecure_channel_credentials() + ) + elif channel_credentials is None: + _LOGGER.debug("Defaulting to SSL channel credentials.") + channel_credentials = grpc.ssl_channel_credentials() + key = (target, options, channel_credentials, compression) + with self._lock: + channel_data = self._mapping.get(key, None) + call_handle = None + if channel_data is not None: + channel = channel_data[0] + # Register a new call handle if we're calling a registered method for an + # existing channel and this method is not registered. + if _registered_method: + call_handle = channel._get_registered_call_handle(method) + self._mapping.pop(key) + self._mapping[key] = ( + channel, + datetime.datetime.now() + _EVICTION_PERIOD, + ) + return channel, call_handle + else: + channel = _create_channel( + target, options, channel_credentials, compression + ) + if _registered_method: + call_handle = channel._get_registered_call_handle(method) + self._mapping[key] = ( + channel, + datetime.datetime.now() + _EVICTION_PERIOD, + ) + if ( + len(self._mapping) == 1 + or len(self._mapping) >= _MAXIMUM_CHANNELS + ): + self._condition.notify() + return channel, call_handle + + def _test_only_channel_count(self) -> int: + with self._lock: + return len(self._mapping) + + +@experimental_api +# pylint: disable=too-many-locals +def unary_unary( + request: RequestType, + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + response_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + channel_credentials: Optional[grpc.ChannelCredentials] = None, + insecure: bool = False, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = _DEFAULT_TIMEOUT, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None, + _registered_method: Optional[bool] = False, +) -> ResponseType: + """Invokes a unary-unary RPC without an explicitly specified channel. + + THIS IS AN EXPERIMENTAL API. + + This is backed by a per-process cache of channels. Channels are evicted + from the cache after a fixed period by a background. Channels will also be + evicted if more than a configured maximum accumulate. + + The default eviction period is 10 minutes. One may set the environment + variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. + + The default maximum number of channels is 256. One may set the + environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure + this. + + Args: + request: An iterator that yields request values for the RPC. + target: The server address. + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the response + message. Response goes undeserialized in case None is passed. + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core + runtime) to configure the channel. + channel_credentials: A credential applied to the whole channel, e.g. the + return value of grpc.ssl_channel_credentials() or + grpc.insecure_channel_credentials(). + insecure: If True, specifies channel_credentials as + :term:`grpc.insecure_channel_credentials()`. This option is mutually + exclusive with the `channel_credentials` option. + call_credentials: A call credential applied to each call individually, + e.g. the output of grpc.metadata_call_credentials() or + grpc.access_token_call_credentials(). + compression: An optional value indicating the compression method to be + used over the lifetime of the channel, e.g. grpc.Compression.Gzip. + wait_for_ready: An optional flag indicating whether the RPC should fail + immediately if the connection is not ready at the time the RPC is + invoked, or if it should wait until the connection to the server + becomes ready. When using this option, the user will likely also want + to set a timeout. Defaults to True. + timeout: An optional duration of time in seconds to allow for the RPC, + after which an exception will be raised. If timeout is unspecified, + defaults to a timeout controlled by the + GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS environment variable. If that is + unset, defaults to 60 seconds. Supply a value of None to indicate that + no timeout should be enforced. + metadata: Optional metadata to send to the server. + + Returns: + The response to the RPC. + """ + channel, method_handle = ChannelCache.get().get_channel( + target, + options, + channel_credentials, + insecure, + compression, + method, + _registered_method, + ) + multicallable = channel.unary_unary( + method, request_serializer, response_deserializer, method_handle + ) + wait_for_ready = wait_for_ready if wait_for_ready is not None else True + return multicallable( + request, + metadata=metadata, + wait_for_ready=wait_for_ready, + credentials=call_credentials, + timeout=timeout, + ) + + +@experimental_api +# pylint: disable=too-many-locals +def unary_stream( + request: RequestType, + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + response_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + channel_credentials: Optional[grpc.ChannelCredentials] = None, + insecure: bool = False, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = _DEFAULT_TIMEOUT, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None, + _registered_method: Optional[bool] = False, +) -> Iterator[ResponseType]: + """Invokes a unary-stream RPC without an explicitly specified channel. + + THIS IS AN EXPERIMENTAL API. + + This is backed by a per-process cache of channels. Channels are evicted + from the cache after a fixed period by a background. Channels will also be + evicted if more than a configured maximum accumulate. + + The default eviction period is 10 minutes. One may set the environment + variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. + + The default maximum number of channels is 256. One may set the + environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure + this. + + Args: + request: An iterator that yields request values for the RPC. + target: The server address. + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the response + message. Response goes undeserialized in case None is passed. + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core + runtime) to configure the channel. + channel_credentials: A credential applied to the whole channel, e.g. the + return value of grpc.ssl_channel_credentials(). + insecure: If True, specifies channel_credentials as + :term:`grpc.insecure_channel_credentials()`. This option is mutually + exclusive with the `channel_credentials` option. + call_credentials: A call credential applied to each call individually, + e.g. the output of grpc.metadata_call_credentials() or + grpc.access_token_call_credentials(). + compression: An optional value indicating the compression method to be + used over the lifetime of the channel, e.g. grpc.Compression.Gzip. + wait_for_ready: An optional flag indicating whether the RPC should fail + immediately if the connection is not ready at the time the RPC is + invoked, or if it should wait until the connection to the server + becomes ready. When using this option, the user will likely also want + to set a timeout. Defaults to True. + timeout: An optional duration of time in seconds to allow for the RPC, + after which an exception will be raised. If timeout is unspecified, + defaults to a timeout controlled by the + GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS environment variable. If that is + unset, defaults to 60 seconds. Supply a value of None to indicate that + no timeout should be enforced. + metadata: Optional metadata to send to the server. + + Returns: + An iterator of responses. + """ + channel, method_handle = ChannelCache.get().get_channel( + target, + options, + channel_credentials, + insecure, + compression, + method, + _registered_method, + ) + multicallable = channel.unary_stream( + method, request_serializer, response_deserializer, method_handle + ) + wait_for_ready = wait_for_ready if wait_for_ready is not None else True + return multicallable( + request, + metadata=metadata, + wait_for_ready=wait_for_ready, + credentials=call_credentials, + timeout=timeout, + ) + + +@experimental_api +# pylint: disable=too-many-locals +def stream_unary( + request_iterator: Iterator[RequestType], + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + response_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + channel_credentials: Optional[grpc.ChannelCredentials] = None, + insecure: bool = False, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = _DEFAULT_TIMEOUT, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None, + _registered_method: Optional[bool] = False, +) -> ResponseType: + """Invokes a stream-unary RPC without an explicitly specified channel. + + THIS IS AN EXPERIMENTAL API. + + This is backed by a per-process cache of channels. Channels are evicted + from the cache after a fixed period by a background. Channels will also be + evicted if more than a configured maximum accumulate. + + The default eviction period is 10 minutes. One may set the environment + variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. + + The default maximum number of channels is 256. One may set the + environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure + this. + + Args: + request_iterator: An iterator that yields request values for the RPC. + target: The server address. + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the response + message. Response goes undeserialized in case None is passed. + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core + runtime) to configure the channel. + channel_credentials: A credential applied to the whole channel, e.g. the + return value of grpc.ssl_channel_credentials(). + call_credentials: A call credential applied to each call individually, + e.g. the output of grpc.metadata_call_credentials() or + grpc.access_token_call_credentials(). + insecure: If True, specifies channel_credentials as + :term:`grpc.insecure_channel_credentials()`. This option is mutually + exclusive with the `channel_credentials` option. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel, e.g. grpc.Compression.Gzip. + wait_for_ready: An optional flag indicating whether the RPC should fail + immediately if the connection is not ready at the time the RPC is + invoked, or if it should wait until the connection to the server + becomes ready. When using this option, the user will likely also want + to set a timeout. Defaults to True. + timeout: An optional duration of time in seconds to allow for the RPC, + after which an exception will be raised. If timeout is unspecified, + defaults to a timeout controlled by the + GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS environment variable. If that is + unset, defaults to 60 seconds. Supply a value of None to indicate that + no timeout should be enforced. + metadata: Optional metadata to send to the server. + + Returns: + The response to the RPC. + """ + channel, method_handle = ChannelCache.get().get_channel( + target, + options, + channel_credentials, + insecure, + compression, + method, + _registered_method, + ) + multicallable = channel.stream_unary( + method, request_serializer, response_deserializer, method_handle + ) + wait_for_ready = wait_for_ready if wait_for_ready is not None else True + return multicallable( + request_iterator, + metadata=metadata, + wait_for_ready=wait_for_ready, + credentials=call_credentials, + timeout=timeout, + ) + + +@experimental_api +# pylint: disable=too-many-locals +def stream_stream( + request_iterator: Iterator[RequestType], + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + response_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + channel_credentials: Optional[grpc.ChannelCredentials] = None, + insecure: bool = False, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = _DEFAULT_TIMEOUT, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None, + _registered_method: Optional[bool] = False, +) -> Iterator[ResponseType]: + """Invokes a stream-stream RPC without an explicitly specified channel. + + THIS IS AN EXPERIMENTAL API. + + This is backed by a per-process cache of channels. Channels are evicted + from the cache after a fixed period by a background. Channels will also be + evicted if more than a configured maximum accumulate. + + The default eviction period is 10 minutes. One may set the environment + variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. + + The default maximum number of channels is 256. One may set the + environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure + this. + + Args: + request_iterator: An iterator that yields request values for the RPC. + target: The server address. + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the response + message. Response goes undeserialized in case None is passed. + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core + runtime) to configure the channel. + channel_credentials: A credential applied to the whole channel, e.g. the + return value of grpc.ssl_channel_credentials(). + call_credentials: A call credential applied to each call individually, + e.g. the output of grpc.metadata_call_credentials() or + grpc.access_token_call_credentials(). + insecure: If True, specifies channel_credentials as + :term:`grpc.insecure_channel_credentials()`. This option is mutually + exclusive with the `channel_credentials` option. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel, e.g. grpc.Compression.Gzip. + wait_for_ready: An optional flag indicating whether the RPC should fail + immediately if the connection is not ready at the time the RPC is + invoked, or if it should wait until the connection to the server + becomes ready. When using this option, the user will likely also want + to set a timeout. Defaults to True. + timeout: An optional duration of time in seconds to allow for the RPC, + after which an exception will be raised. If timeout is unspecified, + defaults to a timeout controlled by the + GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS environment variable. If that is + unset, defaults to 60 seconds. Supply a value of None to indicate that + no timeout should be enforced. + metadata: Optional metadata to send to the server. + + Returns: + An iterator of responses. + """ + channel, method_handle = ChannelCache.get().get_channel( + target, + options, + channel_credentials, + insecure, + compression, + method, + _registered_method, + ) + multicallable = channel.stream_stream( + method, request_serializer, response_deserializer, method_handle + ) + wait_for_ready = wait_for_ready if wait_for_ready is not None else True + return multicallable( + request_iterator, + metadata=metadata, + wait_for_ready=wait_for_ready, + credentials=call_credentials, + timeout=timeout, + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/_typing.py b/myenv/lib/python3.12/site-packages/grpc/_typing.py new file mode 100644 index 0000000..93ecb5c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_typing.py @@ -0,0 +1,95 @@ +# Copyright 2022 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Common types for gRPC Sync API""" + +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Iterable, + Iterator, + Optional, + Sequence, + Tuple, + TypeVar, + Union, +) + +from grpc._cython import cygrpc + +if TYPE_CHECKING: + from grpc import ServicerContext + from grpc._server import _RPCState + +RequestType = TypeVar("RequestType") +ResponseType = TypeVar("ResponseType") +SerializingFunction = Callable[[Any], bytes] +DeserializingFunction = Callable[[bytes], Any] +MetadataType = Sequence[Tuple[str, Union[str, bytes]]] +ChannelArgumentType = Tuple[str, Any] +DoneCallbackType = Callable[[Any], None] +NullaryCallbackType = Callable[[], None] +RequestIterableType = Iterable[Any] +ResponseIterableType = Iterable[Any] +UserTag = Callable[[cygrpc.BaseEvent], bool] +IntegratedCallFactory = Callable[ + [ + int, + bytes, + None, + Optional[float], + Optional[MetadataType], + Optional[cygrpc.CallCredentials], + Sequence[Sequence[cygrpc.Operation]], + UserTag, + Any, + ], + cygrpc.IntegratedCall, +] +ServerTagCallbackType = Tuple[ + Optional["_RPCState"], Sequence[NullaryCallbackType] +] +ServerCallbackTag = Callable[[cygrpc.BaseEvent], ServerTagCallbackType] +ArityAgnosticMethodHandler = Union[ + Callable[ + [RequestType, "ServicerContext", Callable[[ResponseType], None]], + ResponseType, + ], + Callable[ + [RequestType, "ServicerContext", Callable[[ResponseType], None]], + Iterator[ResponseType], + ], + Callable[ + [ + Iterator[RequestType], + "ServicerContext", + Callable[[ResponseType], None], + ], + ResponseType, + ], + Callable[ + [ + Iterator[RequestType], + "ServicerContext", + Callable[[ResponseType], None], + ], + Iterator[ResponseType], + ], + Callable[[RequestType, "ServicerContext"], ResponseType], + Callable[[RequestType, "ServicerContext"], Iterator[ResponseType]], + Callable[[Iterator[RequestType], "ServicerContext"], ResponseType], + Callable[ + [Iterator[RequestType], "ServicerContext"], Iterator[ResponseType] + ], +] diff --git a/myenv/lib/python3.12/site-packages/grpc/_utilities.py b/myenv/lib/python3.12/site-packages/grpc/_utilities.py new file mode 100644 index 0000000..620cab3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/_utilities.py @@ -0,0 +1,222 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Internal utilities for gRPC Python.""" + +import collections +import logging +import threading +import time +from typing import Callable, Dict, Optional, Sequence + +import grpc # pytype: disable=pyi-error +from grpc import _common # pytype: disable=pyi-error +from grpc._typing import DoneCallbackType + +_LOGGER = logging.getLogger(__name__) + +_DONE_CALLBACK_EXCEPTION_LOG_MESSAGE = ( + 'Exception calling connectivity future "done" callback!' +) + + +class RpcMethodHandler( + collections.namedtuple( + "_RpcMethodHandler", + ( + "request_streaming", + "response_streaming", + "request_deserializer", + "response_serializer", + "unary_unary", + "unary_stream", + "stream_unary", + "stream_stream", + ), + ), + grpc.RpcMethodHandler, +): + pass + + +class DictionaryGenericHandler(grpc.ServiceRpcHandler): + _name: str + _method_handlers: Dict[str, grpc.RpcMethodHandler] + + def __init__( + self, service: str, method_handlers: Dict[str, grpc.RpcMethodHandler] + ): + self._name = service + self._method_handlers = { + _common.fully_qualified_method(service, method): method_handler + for method, method_handler in method_handlers.items() + } + + def service_name(self) -> str: + return self._name + + def service( + self, handler_call_details: grpc.HandlerCallDetails + ) -> Optional[grpc.RpcMethodHandler]: + details_method = handler_call_details.method + return self._method_handlers.get( + details_method + ) # pytype: disable=attribute-error + + +class _ChannelReadyFuture(grpc.Future): + _condition: threading.Condition + _channel: grpc.Channel + _matured: bool + _cancelled: bool + _done_callbacks: Sequence[Callable] + + def __init__(self, channel: grpc.Channel): + self._condition = threading.Condition() + self._channel = channel + + self._matured = False + self._cancelled = False + self._done_callbacks = [] + + def _block(self, timeout: Optional[float]) -> None: + until = None if timeout is None else time.time() + timeout + with self._condition: + while True: + if self._cancelled: + raise grpc.FutureCancelledError() + elif self._matured: + return + else: + if until is None: + self._condition.wait() + else: + remaining = until - time.time() + if remaining < 0: + raise grpc.FutureTimeoutError() + else: + self._condition.wait(timeout=remaining) + + def _update(self, connectivity: Optional[grpc.ChannelConnectivity]) -> None: + with self._condition: + if ( + not self._cancelled + and connectivity is grpc.ChannelConnectivity.READY + ): + self._matured = True + self._channel.unsubscribe(self._update) + self._condition.notify_all() + done_callbacks = tuple(self._done_callbacks) + self._done_callbacks = None + else: + return + + for done_callback in done_callbacks: + try: + done_callback(self) + except Exception: # pylint: disable=broad-except + _LOGGER.exception(_DONE_CALLBACK_EXCEPTION_LOG_MESSAGE) + + def cancel(self) -> bool: + with self._condition: + if not self._matured: + self._cancelled = True + self._channel.unsubscribe(self._update) + self._condition.notify_all() + done_callbacks = tuple(self._done_callbacks) + self._done_callbacks = None + else: + return False + + for done_callback in done_callbacks: + try: + done_callback(self) + except Exception: # pylint: disable=broad-except + _LOGGER.exception(_DONE_CALLBACK_EXCEPTION_LOG_MESSAGE) + + return True + + def cancelled(self) -> bool: + with self._condition: + return self._cancelled + + def running(self) -> bool: + with self._condition: + return not self._cancelled and not self._matured + + def done(self) -> bool: + with self._condition: + return self._cancelled or self._matured + + def result(self, timeout: Optional[float] = None) -> None: + self._block(timeout) + + def exception(self, timeout: Optional[float] = None) -> None: + self._block(timeout) + + def traceback(self, timeout: Optional[float] = None) -> None: + self._block(timeout) + + def add_done_callback(self, fn: DoneCallbackType): + with self._condition: + if not self._cancelled and not self._matured: + self._done_callbacks.append(fn) + return + + fn(self) + + def start(self): + with self._condition: + self._channel.subscribe(self._update, try_to_connect=True) + + def __del__(self): + with self._condition: + if not self._cancelled and not self._matured: + self._channel.unsubscribe(self._update) + + +def channel_ready_future(channel: grpc.Channel) -> _ChannelReadyFuture: + ready_future = _ChannelReadyFuture(channel) + ready_future.start() + return ready_future + + +def first_version_is_lower(version1: str, version2: str) -> bool: + """ + Compares two versions in the format '1.60.1' or '1.60.1.dev0'. + + This method will be used in all stubs generated by grpcio-tools to check whether + the stub version is compatible with the runtime grpcio. + + Args: + version1: The first version string. + version2: The second version string. + + Returns: + True if version1 is lower, False otherwise. + """ + version1_list = version1.split(".") + version2_list = version2.split(".") + + try: + for i in range(3): + if int(version1_list[i]) < int(version2_list[i]): + return True + elif int(version1_list[i]) > int(version2_list[i]): + return False + except ValueError: + # Return false in case we can't convert version to int. + return False + + # The version without dev0 will be considered lower. + return len(version1_list) < len(version2_list) diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__init__.py b/myenv/lib/python3.12/site-packages/grpc/aio/__init__.py new file mode 100644 index 0000000..a4e104a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/__init__.py @@ -0,0 +1,95 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""gRPC's Asynchronous Python API. + +gRPC Async API objects may only be used on the thread on which they were +created. AsyncIO doesn't provide thread safety for most of its APIs. +""" + +from typing import Any, Optional, Sequence, Tuple + +import grpc +from grpc._cython.cygrpc import AbortError +from grpc._cython.cygrpc import BaseError +from grpc._cython.cygrpc import EOF +from grpc._cython.cygrpc import InternalError +from grpc._cython.cygrpc import UsageError +from grpc._cython.cygrpc import init_grpc_aio +from grpc._cython.cygrpc import shutdown_grpc_aio + +from ._base_call import Call +from ._base_call import RpcContext +from ._base_call import StreamStreamCall +from ._base_call import StreamUnaryCall +from ._base_call import UnaryStreamCall +from ._base_call import UnaryUnaryCall +from ._base_channel import Channel +from ._base_channel import StreamStreamMultiCallable +from ._base_channel import StreamUnaryMultiCallable +from ._base_channel import UnaryStreamMultiCallable +from ._base_channel import UnaryUnaryMultiCallable +from ._base_server import Server +from ._base_server import ServicerContext +from ._call import AioRpcError +from ._channel import insecure_channel +from ._channel import secure_channel +from ._interceptor import ClientCallDetails +from ._interceptor import ClientInterceptor +from ._interceptor import InterceptedUnaryUnaryCall +from ._interceptor import ServerInterceptor +from ._interceptor import StreamStreamClientInterceptor +from ._interceptor import StreamUnaryClientInterceptor +from ._interceptor import UnaryStreamClientInterceptor +from ._interceptor import UnaryUnaryClientInterceptor +from ._metadata import Metadata +from ._server import server +from ._typing import ChannelArgumentType + +################################### __all__ ################################# + +__all__ = ( + "init_grpc_aio", + "shutdown_grpc_aio", + "AioRpcError", + "RpcContext", + "Call", + "UnaryUnaryCall", + "UnaryStreamCall", + "StreamUnaryCall", + "StreamStreamCall", + "Channel", + "UnaryUnaryMultiCallable", + "UnaryStreamMultiCallable", + "StreamUnaryMultiCallable", + "StreamStreamMultiCallable", + "ClientCallDetails", + "ClientInterceptor", + "UnaryStreamClientInterceptor", + "UnaryUnaryClientInterceptor", + "StreamUnaryClientInterceptor", + "StreamStreamClientInterceptor", + "InterceptedUnaryUnaryCall", + "ServerInterceptor", + "insecure_channel", + "server", + "Server", + "ServicerContext", + "EOF", + "secure_channel", + "AbortError", + "BaseError", + "UsageError", + "InternalError", + "Metadata", +) diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..025debb5431438d5eb20ab827f5267bc4e130580 GIT binary patch literal 2172 zcmZvdOHUhD6vwZzF~-J#c|Qyc=3xxM6CiC>wW{PoBC$w7Ayn1fjK(t;Jjp!VnQQ2D z*M5n9hOYV*y6CRU?natb)J1lwvZ$0*&pBfolf)YT{X6&E*ZI%P^%?2O>OABRiMQEv`}Onl z<7%KZg3vWuzUO+KKsgU(%X5{+`Ds0$#|}vv8x*hkQW!E&96eM#*AA7YP&$DyAy8yX zz}FW#MYk=>XklBZ+zMah4M<2~)|1Ij&lJ-Wfm@YI+xKoPvp+P@uY?ShE6-OPFOZ6N zrC6{aEFRSJZ}1tcWukP$4WryyTUws0+fnX9{Lm4uA)?_IowhBW)lyNu(e!-z*!Mjj zqS0^lK=gw2;=y3R)d$dbe)B@eRBQ z3^JKx-L~O3|GaG+dob&d5~9fq2{k*3c6&@D(WR^VVXujTd%eb~X|U7CaZ7hyfr~5- zPW!ZDOA9B`o3?=D!od6=vy3MD}(MN z>)h{99&qTB`2m+cm0up%2bFPu`rK2f$ke3{C1r!2bJN}1*YK}94wU{PY>V2u4@WHX zizsE3Nt6kc8I)<1DU=e*EXpFv0?Itf9LgGsg0h9Ojk1ZdfwGQLL0LiBL0LjsMj1s} zMHxZKp%hT?f55MT)E-46nr3>2rbSs9wk`MCPh&EJGK`W1i8A=6MAN8s&7dQsZiE;P zOijzt)U-&y{wS|C;RV$Ucq9@B$P22Q93U^ym8jV5nLJ;KD`W#1Le`*3(OA+ixdnF> zN5jb?Xn2(CJ*J5_=mU(i@K{J5!2xgYd?Z`R;J)9{sOEI&7cM!2%U+SK-uBHK+zoF|FPX-{-z|JhNkqZ~U)dSvoOy=_vvqH>vV^)jVM$Gn!K@a|6<(O4swiB}|UE35sirEoehcQ!V o)N0HiwHdQLx*!YiMa({@>$8}x#cUbod7G;ghJGILzl3f44-#H!IsgCw literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_call.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_call.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bfe03c1046a1d6722418f6231089539942541ef GIT binary patch literal 8958 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_channel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_channel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e63a9ca159c90c9c45c4c74c2f662f0b3721fd6 GIT binary patch literal 15970 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 Sez)>x%YVB3?*`Q++5QWD!QN8< literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_server.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_base_server.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b18bfb12b9e144d2181038c0ffa107d04b8ecf41 GIT binary patch literal 15931 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 BytDuS literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_call.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_call.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f71e50c20a7b916e8bcdb9b2cad7a3b58b35bec GIT binary patch literal 35313 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_channel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_channel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9f9a08098a7ff3a10193e82784956a064e8130e GIT binary patch literal 21773 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

      3Z1gf%*(fg6IE<=?G{1AVSmUTm#ti!!V)={cP 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_interceptor.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_interceptor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67e546c22d6fdffb6773db88ef2e2c988fcea304 GIT binary patch literal 48935 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 Z7R`t+*3^l8O5(Oe+qNH=5oZ(c{{z}lLe~HQ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_metadata.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57aaaddef9527622fb1be93be76366781ad89578 GIT binary patch literal 7577 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 WeIxe{*GG=k@VDpqS2Pvhxc>y?_qW>s literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_typing.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_typing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0303c4757d0a2da4bdb2f3790e319a68d8abad3 GIT binary patch literal 1174 zcmZuv&yU+g6duP(>?G?XtvB9ncj-oSTM+><1yn9% z7kW4vmI(Qsi{&aV$k|1KkROOm3}Op*!4+u1C{WQ5Y0)Usl2M{%qf8}3qOu{=ict}` zpXgR;&8Q(S+9h{|Du$BtGV;1n&$)!WVKf9%ARycFPnd@zL&N)Lv(~IL~5N7k4%=P6_gi zAkO#2$>vfUZ^YG3?eW&GN2$l!QS3w5e&_}5(ZSu_b}x*X)$ZNB^@4ZRku$N!;!MfS zw;~A4p$nP3Yr5{7{cG#P7h_-+WTks!ADyIo82Qi)veJF#c&sC2;?2+YU+{S$m+wGi z+Gb=TuPym)h*2s_d1$(0$Z7{Xa2WA$*~$TgzQ;n~>eJ4pOd1Sq&l(J}GB)C{Q6OUc zfPaGk{{{)l93&1hhYAP&eKK_v_*Qpd#nB^=b*-4opvF%s1G=a!P`G=YLxV$;!#RYk zG>jt%Gqn$aW4g{`%)CElR)mdatvv|;$GmK7Oy`{}yUdjsMnR_TJ~9~tw-=1Y6xh7u zBKC#D#L?xB%{`9+AOFy_j&h5-n9uSha^vc9PXD$3NY1c!@(OgyBHhyOW0|484-v5T zUf|e{j+Gxpp0E3X_c=s87CQLcI*oySsk_cl_w#9e(7pD)9y$@c>thk-2tu7tPd6P; zA7HsSjIJNQl0T-NJ$B(na0RpScMns9KSe@51jp z$I?vQnDi$%lMg4iQ}wMWY0k8b$tOww$(_@kpVjp3o$2OIs@>q3*S3>>y4Fd_YH%65 F`Uk5hSS|nn literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_utils.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/aio/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b292cd802e0107f9c2555e54e73431fb0d8be277 GIT binary patch literal 583 zcmYjOJ#5r46t*w9)2>#NAp$d_R$`i;u@KMitSeRe|X!HJ+y1leH3BW&v#uStbBW>T|PNvv=D}-^nnJY z=}j;o$fn|q(@oGjMwYZxavRKs(0rT&Eou;tXwJv9tj$D2BpRF-H~OAmzSX^{hMWUHiN9>uO-B ud$PV@-OR%n|2m8C>Q~hNj+SSEhtIt{|9a&WogoX~O+Hlb bool: + """Return True if the RPC is cancelled. + + The RPC is cancelled when the cancellation was requested with cancel(). + + Returns: + A bool indicates whether the RPC is cancelled or not. + """ + + @abstractmethod + def done(self) -> bool: + """Return True if the RPC is done. + + An RPC is done if the RPC is completed, cancelled or aborted. + + Returns: + A bool indicates if the RPC is done. + """ + + @abstractmethod + def time_remaining(self) -> Optional[float]: + """Describes the length of allowed time remaining for the RPC. + + Returns: + A nonnegative float indicating the length of allowed time in seconds + remaining for the RPC to complete before it is considered to have + timed out, or None if no deadline was specified for the RPC. + """ + + @abstractmethod + def cancel(self) -> bool: + """Cancels the RPC. + + Idempotent and has no effect if the RPC has already terminated. + + Returns: + A bool indicates if the cancellation is performed or not. + """ + + @abstractmethod + def add_done_callback(self, callback: DoneCallbackType) -> None: + """Registers a callback to be called on RPC termination. + + Args: + callback: A callable object will be called with the call object as + its only argument. + """ + + +class Call(RpcContext, metaclass=ABCMeta): + """The abstract base class of an RPC on the client-side.""" + + @abstractmethod + async def initial_metadata(self) -> Metadata: + """Accesses the initial metadata sent by the server. + + Returns: + The initial :term:`metadata`. + """ + + @abstractmethod + async def trailing_metadata(self) -> Metadata: + """Accesses the trailing metadata sent by the server. + + Returns: + The trailing :term:`metadata`. + """ + + @abstractmethod + async def code(self) -> grpc.StatusCode: + """Accesses the status code sent by the server. + + Returns: + The StatusCode value for the RPC. + """ + + @abstractmethod + async def details(self) -> str: + """Accesses the details sent by the server. + + Returns: + The details string of the RPC. + """ + + @abstractmethod + async def wait_for_connection(self) -> None: + """Waits until connected to peer and raises aio.AioRpcError if failed. + + This is an EXPERIMENTAL method. + + This method ensures the RPC has been successfully connected. Otherwise, + an AioRpcError will be raised to explain the reason of the connection + failure. + + This method is recommended for building retry mechanisms. + """ + + +class UnaryUnaryCall( + Generic[RequestType, ResponseType], Call, metaclass=ABCMeta +): + """The abstract base class of an unary-unary RPC on the client-side.""" + + @abstractmethod + def __await__(self) -> Generator[Any, None, ResponseType]: + """Await the response message to be ready. + + Returns: + The response message of the RPC. + """ + + +class UnaryStreamCall( + Generic[RequestType, ResponseType], Call, metaclass=ABCMeta +): + @abstractmethod + def __aiter__(self) -> AsyncIterator[ResponseType]: + """Returns the async iterator representation that yields messages. + + Under the hood, it is calling the "read" method. + + Returns: + An async iterator object that yields messages. + """ + + @abstractmethod + async def read(self) -> Union[EOFType, ResponseType]: + """Reads one message from the stream. + + Read operations must be serialized when called from multiple + coroutines. + + Note that the iterator and read/write APIs may not be mixed on + a single RPC. + + Returns: + A response message, or an `grpc.aio.EOF` to indicate the end of the + stream. + """ + + +class StreamUnaryCall( + Generic[RequestType, ResponseType], Call, metaclass=ABCMeta +): + @abstractmethod + async def write(self, request: RequestType) -> None: + """Writes one message to the stream. + + Note that the iterator and read/write APIs may not be mixed on + a single RPC. + + Raises: + An RpcError exception if the write failed. + """ + + @abstractmethod + async def done_writing(self) -> None: + """Notifies server that the client is done sending messages. + + After done_writing is called, any additional invocation to the write + function will fail. This function is idempotent. + """ + + @abstractmethod + def __await__(self) -> Generator[Any, None, ResponseType]: + """Await the response message to be ready. + + Returns: + The response message of the stream. + """ + + +class StreamStreamCall( + Generic[RequestType, ResponseType], Call, metaclass=ABCMeta +): + @abstractmethod + def __aiter__(self) -> AsyncIterator[ResponseType]: + """Returns the async iterator representation that yields messages. + + Under the hood, it is calling the "read" method. + + Returns: + An async iterator object that yields messages. + """ + + @abstractmethod + async def read(self) -> Union[EOFType, ResponseType]: + """Reads one message from the stream. + + Read operations must be serialized when called from multiple + coroutines. + + Note that the iterator and read/write APIs may not be mixed on + a single RPC. + + Returns: + A response message, or an `grpc.aio.EOF` to indicate the end of the + stream. + """ + + @abstractmethod + async def write(self, request: RequestType) -> None: + """Writes one message to the stream. + + Note that the iterator and read/write APIs may not be mixed on + a single RPC. + + Raises: + An RpcError exception if the write failed. + """ + + @abstractmethod + async def done_writing(self) -> None: + """Notifies server that the client is done sending messages. + + After done_writing is called, any additional invocation to the write + function will fail. This function is idempotent. + """ diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_base_channel.py b/myenv/lib/python3.12/site-packages/grpc/aio/_base_channel.py new file mode 100644 index 0000000..715cd4f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_base_channel.py @@ -0,0 +1,364 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Abstract base classes for Channel objects and Multicallable objects.""" + +import abc +from typing import Generic, Optional + +import grpc + +from . import _base_call +from ._typing import DeserializingFunction +from ._typing import MetadataType +from ._typing import RequestIterableType +from ._typing import RequestType +from ._typing import ResponseType +from ._typing import SerializingFunction + + +class UnaryUnaryMultiCallable(Generic[RequestType, ResponseType], abc.ABC): + """Enables asynchronous invocation of a unary-call RPC.""" + + @abc.abstractmethod + def __call__( + self, + request: RequestType, + *, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _base_call.UnaryUnaryCall[RequestType, ResponseType]: + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + A UnaryUnaryCall object. + + Raises: + RpcError: Indicates that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + + +class UnaryStreamMultiCallable(Generic[RequestType, ResponseType], abc.ABC): + """Enables asynchronous invocation of a server-streaming RPC.""" + + @abc.abstractmethod + def __call__( + self, + request: RequestType, + *, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _base_call.UnaryStreamCall[RequestType, ResponseType]: + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + A UnaryStreamCall object. + + Raises: + RpcError: Indicates that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + + +class StreamUnaryMultiCallable(abc.ABC): + """Enables asynchronous invocation of a client-streaming RPC.""" + + @abc.abstractmethod + def __call__( + self, + request_iterator: Optional[RequestIterableType] = None, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _base_call.StreamUnaryCall: + """Asynchronously invokes the underlying RPC. + + Args: + request_iterator: An optional async iterable or iterable of request + messages for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + A StreamUnaryCall object. + + Raises: + RpcError: Indicates that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + + +class StreamStreamMultiCallable(abc.ABC): + """Enables asynchronous invocation of a bidirectional-streaming RPC.""" + + @abc.abstractmethod + def __call__( + self, + request_iterator: Optional[RequestIterableType] = None, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _base_call.StreamStreamCall: + """Asynchronously invokes the underlying RPC. + + Args: + request_iterator: An optional async iterable or iterable of request + messages for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + + Returns: + A StreamStreamCall object. + + Raises: + RpcError: Indicates that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + + +class Channel(abc.ABC): + """Enables asynchronous RPC invocation as a client. + + Channel objects implement the Asynchronous Context Manager (aka. async + with) type, although they are not supportted to be entered and exited + multiple times. + """ + + @abc.abstractmethod + async def __aenter__(self): + """Starts an asynchronous context manager. + + Returns: + Channel the channel that was instantiated. + """ + + @abc.abstractmethod + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Finishes the asynchronous context manager by closing the channel. + + Still active RPCs will be cancelled. + """ + + @abc.abstractmethod + async def close(self, grace: Optional[float] = None): + """Closes this Channel and releases all resources held by it. + + This method immediately stops the channel from executing new RPCs in + all cases. + + If a grace period is specified, this method waits until all active + RPCs are finished or until the grace period is reached. RPCs that haven't + been terminated within the grace period are aborted. + If a grace period is not specified (by passing None for grace), + all existing RPCs are cancelled immediately. + + This method is idempotent. + """ + + @abc.abstractmethod + def get_state( + self, try_to_connect: bool = False + ) -> grpc.ChannelConnectivity: + """Checks the connectivity state of a channel. + + This is an EXPERIMENTAL API. + + If the channel reaches a stable connectivity state, it is guaranteed + that the return value of this function will eventually converge to that + state. + + Args: + try_to_connect: a bool indicate whether the Channel should try to + connect to peer or not. + + Returns: A ChannelConnectivity object. + """ + + @abc.abstractmethod + async def wait_for_state_change( + self, + last_observed_state: grpc.ChannelConnectivity, + ) -> None: + """Waits for a change in connectivity state. + + This is an EXPERIMENTAL API. + + The function blocks until there is a change in the channel connectivity + state from the "last_observed_state". If the state is already + different, this function will return immediately. + + There is an inherent race between the invocation of + "Channel.wait_for_state_change" and "Channel.get_state". The state can + change arbitrary many times during the race, so there is no way to + observe every state transition. + + If there is a need to put a timeout for this function, please refer to + "asyncio.wait_for". + + Args: + last_observed_state: A grpc.ChannelConnectivity object representing + the last known state. + """ + + @abc.abstractmethod + async def channel_ready(self) -> None: + """Creates a coroutine that blocks until the Channel is READY.""" + + @abc.abstractmethod + def unary_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> UnaryUnaryMultiCallable: + """Creates a UnaryUnaryMultiCallable for a unary-unary method. + + Args: + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the + response message. Response goes undeserialized in case None + is passed. + _registered_method: Implementation Private. Optional: A bool representing + whether the method is registered. + + Returns: + A UnaryUnaryMultiCallable value for the named unary-unary method. + """ + + @abc.abstractmethod + def unary_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> UnaryStreamMultiCallable: + """Creates a UnaryStreamMultiCallable for a unary-stream method. + + Args: + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the + response message. Response goes undeserialized in case None + is passed. + _registered_method: Implementation Private. Optional: A bool representing + whether the method is registered. + + Returns: + A UnarySteramMultiCallable value for the named unary-stream method. + """ + + @abc.abstractmethod + def stream_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> StreamUnaryMultiCallable: + """Creates a StreamUnaryMultiCallable for a stream-unary method. + + Args: + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the + response message. Response goes undeserialized in case None + is passed. + _registered_method: Implementation Private. Optional: A bool representing + whether the method is registered. + + Returns: + A StreamUnaryMultiCallable value for the named stream-unary method. + """ + + @abc.abstractmethod + def stream_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> StreamStreamMultiCallable: + """Creates a StreamStreamMultiCallable for a stream-stream method. + + Args: + method: The name of the RPC method. + request_serializer: Optional :term:`serializer` for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional :term:`deserializer` for deserializing the + response message. Response goes undeserialized in case None + is passed. + _registered_method: Implementation Private. Optional: A bool representing + whether the method is registered. + + Returns: + A StreamStreamMultiCallable value for the named stream-stream method. + """ diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_base_server.py b/myenv/lib/python3.12/site-packages/grpc/aio/_base_server.py new file mode 100644 index 0000000..237417b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_base_server.py @@ -0,0 +1,385 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Abstract base classes for server-side classes.""" + +import abc +from typing import Generic, Iterable, Mapping, NoReturn, Optional, Sequence + +import grpc + +from ._metadata import Metadata # pylint: disable=unused-import +from ._typing import DoneCallbackType +from ._typing import MetadataType +from ._typing import RequestType +from ._typing import ResponseType + + +class Server(abc.ABC): + """Serves RPCs.""" + + @abc.abstractmethod + def add_generic_rpc_handlers( + self, generic_rpc_handlers: Sequence[grpc.GenericRpcHandler] + ) -> None: + """Registers GenericRpcHandlers with this Server. + + This method is only safe to call before the server is started. + + Args: + generic_rpc_handlers: A sequence of GenericRpcHandlers that will be + used to service RPCs. + """ + + @abc.abstractmethod + def add_insecure_port(self, address: str) -> int: + """Opens an insecure port for accepting RPCs. + + A port is a communication endpoint that used by networking protocols, + like TCP and UDP. To date, we only support TCP. + + This method may only be called before starting the server. + + Args: + address: The address for which to open a port. If the port is 0, + or not specified in the address, then the gRPC runtime will choose a port. + + Returns: + An integer port on which the server will accept RPC requests. + """ + + @abc.abstractmethod + def add_secure_port( + self, address: str, server_credentials: grpc.ServerCredentials + ) -> int: + """Opens a secure port for accepting RPCs. + + A port is a communication endpoint that used by networking protocols, + like TCP and UDP. To date, we only support TCP. + + This method may only be called before starting the server. + + Args: + address: The address for which to open a port. + if the port is 0, or not specified in the address, then the gRPC + runtime will choose a port. + server_credentials: A ServerCredentials object. + + Returns: + An integer port on which the server will accept RPC requests. + """ + + @abc.abstractmethod + async def start(self) -> None: + """Starts this Server. + + This method may only be called once. (i.e. it is not idempotent). + """ + + @abc.abstractmethod + async def stop(self, grace: Optional[float]) -> None: + """Stops this Server. + + This method immediately stops the server from servicing new RPCs in + all cases. + + If a grace period is specified, this method waits until all active + RPCs are finished or until the grace period is reached. RPCs that haven't + been terminated within the grace period are aborted. + If a grace period is not specified (by passing None for grace), all + existing RPCs are aborted immediately and this method blocks until + the last RPC handler terminates. + + This method is idempotent and may be called at any time. Passing a + smaller grace value in a subsequent call will have the effect of + stopping the Server sooner (passing None will have the effect of + stopping the server immediately). Passing a larger grace value in a + subsequent call will not have the effect of stopping the server later + (i.e. the most restrictive grace value is used). + + Args: + grace: A duration of time in seconds or None. + """ + + @abc.abstractmethod + async def wait_for_termination( + self, timeout: Optional[float] = None + ) -> bool: + """Continues current coroutine once the server stops. + + This is an EXPERIMENTAL API. + + The wait will not consume computational resources during blocking, and + it will block until one of the two following conditions are met: + + 1) The server is stopped or terminated; + 2) A timeout occurs if timeout is not `None`. + + The timeout argument works in the same way as `threading.Event.wait()`. + https://docs.python.org/3/library/threading.html#threading.Event.wait + + Args: + timeout: A floating point number specifying a timeout for the + operation in seconds. + + Returns: + A bool indicates if the operation times out. + """ + + def add_registered_method_handlers(self, service_name, method_handlers): + """Registers GenericRpcHandlers with this Server. + + This method is only safe to call before the server is started. + + Args: + service_name: The service name. + method_handlers: A dictionary that maps method names to corresponding + RpcMethodHandler. + """ + + +# pylint: disable=too-many-public-methods +class ServicerContext(Generic[RequestType, ResponseType], abc.ABC): + """A context object passed to method implementations.""" + + @abc.abstractmethod + async def read(self) -> RequestType: + """Reads one message from the RPC. + + Only one read operation is allowed simultaneously. + + Returns: + A response message of the RPC. + + Raises: + An RpcError exception if the read failed. + """ + + @abc.abstractmethod + async def write(self, message: ResponseType) -> None: + """Writes one message to the RPC. + + Only one write operation is allowed simultaneously. + + Raises: + An RpcError exception if the write failed. + """ + + @abc.abstractmethod + async def send_initial_metadata( + self, initial_metadata: MetadataType + ) -> None: + """Sends the initial metadata value to the client. + + This method need not be called by implementations if they have no + metadata to add to what the gRPC runtime will transmit. + + Args: + initial_metadata: The initial :term:`metadata`. + """ + + @abc.abstractmethod + async def abort( + self, + code: grpc.StatusCode, + details: str = "", + trailing_metadata: MetadataType = tuple(), + ) -> NoReturn: + """Raises an exception to terminate the RPC with a non-OK status. + + The code and details passed as arguments will supercede any existing + ones. + + Args: + code: A StatusCode object to be sent to the client. + It must not be StatusCode.OK. + details: A UTF-8-encodable string to be sent to the client upon + termination of the RPC. + trailing_metadata: A sequence of tuple represents the trailing + :term:`metadata`. + + Raises: + Exception: An exception is always raised to signal the abortion the + RPC to the gRPC runtime. + """ + + @abc.abstractmethod + def set_trailing_metadata(self, trailing_metadata: MetadataType) -> None: + """Sends the trailing metadata for the RPC. + + This method need not be called by implementations if they have no + metadata to add to what the gRPC runtime will transmit. + + Args: + trailing_metadata: The trailing :term:`metadata`. + """ + + @abc.abstractmethod + def invocation_metadata(self) -> Optional[MetadataType]: + """Accesses the metadata sent by the client. + + Returns: + The invocation :term:`metadata`. + """ + + @abc.abstractmethod + def set_code(self, code: grpc.StatusCode) -> None: + """Sets the value to be used as status code upon RPC completion. + + This method need not be called by method implementations if they wish + the gRPC runtime to determine the status code of the RPC. + + Args: + code: A StatusCode object to be sent to the client. + """ + + @abc.abstractmethod + def set_details(self, details: str) -> None: + """Sets the value to be used the as detail string upon RPC completion. + + This method need not be called by method implementations if they have + no details to transmit. + + Args: + details: A UTF-8-encodable string to be sent to the client upon + termination of the RPC. + """ + + @abc.abstractmethod + def set_compression(self, compression: grpc.Compression) -> None: + """Set the compression algorithm to be used for the entire call. + + Args: + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + """ + + @abc.abstractmethod + def disable_next_message_compression(self) -> None: + """Disables compression for the next response message. + + This method will override any compression configuration set during + server creation or set on the call. + """ + + @abc.abstractmethod + def peer(self) -> str: + """Identifies the peer that invoked the RPC being serviced. + + Returns: + A string identifying the peer that invoked the RPC being serviced. + The string format is determined by gRPC runtime. + """ + + @abc.abstractmethod + def peer_identities(self) -> Optional[Iterable[bytes]]: + """Gets one or more peer identity(s). + + Equivalent to + servicer_context.auth_context().get(servicer_context.peer_identity_key()) + + Returns: + An iterable of the identities, or None if the call is not + authenticated. Each identity is returned as a raw bytes type. + """ + + @abc.abstractmethod + def peer_identity_key(self) -> Optional[str]: + """The auth property used to identify the peer. + + For example, "x509_common_name" or "x509_subject_alternative_name" are + used to identify an SSL peer. + + Returns: + The auth property (string) that indicates the + peer identity, or None if the call is not authenticated. + """ + + @abc.abstractmethod + def auth_context(self) -> Mapping[str, Iterable[bytes]]: + """Gets the auth context for the call. + + Returns: + A map of strings to an iterable of bytes for each auth property. + """ + + def time_remaining(self) -> float: + """Describes the length of allowed time remaining for the RPC. + + Returns: + A nonnegative float indicating the length of allowed time in seconds + remaining for the RPC to complete before it is considered to have + timed out, or None if no deadline was specified for the RPC. + """ + + def trailing_metadata(self): + """Access value to be used as trailing metadata upon RPC completion. + + This is an EXPERIMENTAL API. + + Returns: + The trailing :term:`metadata` for the RPC. + """ + raise NotImplementedError() + + def code(self): + """Accesses the value to be used as status code upon RPC completion. + + This is an EXPERIMENTAL API. + + Returns: + The StatusCode value for the RPC. + """ + raise NotImplementedError() + + def details(self): + """Accesses the value to be used as detail string upon RPC completion. + + This is an EXPERIMENTAL API. + + Returns: + The details string of the RPC. + """ + raise NotImplementedError() + + def add_done_callback(self, callback: DoneCallbackType) -> None: + """Registers a callback to be called on RPC termination. + + This is an EXPERIMENTAL API. + + Args: + callback: A callable object will be called with the servicer context + object as its only argument. + """ + + def cancelled(self) -> bool: + """Return True if the RPC is cancelled. + + The RPC is cancelled when the cancellation was requested with cancel(). + + This is an EXPERIMENTAL API. + + Returns: + A bool indicates whether the RPC is cancelled or not. + """ + + def done(self) -> bool: + """Return True if the RPC is done. + + An RPC is done if the RPC is completed, cancelled or aborted. + + This is an EXPERIMENTAL API. + + Returns: + A bool indicates if the RPC is done. + """ diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_call.py b/myenv/lib/python3.12/site-packages/grpc/aio/_call.py new file mode 100644 index 0000000..24f2090 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_call.py @@ -0,0 +1,764 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Invocation-side implementation of gRPC Asyncio Python.""" + +import asyncio +import enum +from functools import partial +import inspect +import logging +import traceback +from typing import ( + Any, + AsyncIterator, + Generator, + Generic, + Optional, + Tuple, + Union, +) + +import grpc +from grpc import _common +from grpc._cython import cygrpc + +from . import _base_call +from ._metadata import Metadata +from ._typing import DeserializingFunction +from ._typing import DoneCallbackType +from ._typing import EOFType +from ._typing import MetadatumType +from ._typing import RequestIterableType +from ._typing import RequestType +from ._typing import ResponseType +from ._typing import SerializingFunction + +__all__ = "AioRpcError", "Call", "UnaryUnaryCall", "UnaryStreamCall" + +_LOCAL_CANCELLATION_DETAILS = "Locally cancelled by application!" +_GC_CANCELLATION_DETAILS = "Cancelled upon garbage collection!" +_RPC_ALREADY_FINISHED_DETAILS = "RPC already finished." +_RPC_HALF_CLOSED_DETAILS = 'RPC is half closed after calling "done_writing".' +_API_STYLE_ERROR = ( + "The iterator and read/write APIs may not be mixed on a single RPC." +) + +_OK_CALL_REPRESENTATION = ( + '<{} of RPC that terminated with:\n\tstatus = {}\n\tdetails = "{}"\n>' +) + +_NON_OK_CALL_REPRESENTATION = ( + "<{} of RPC that terminated with:\n" + "\tstatus = {}\n" + '\tdetails = "{}"\n' + '\tdebug_error_string = "{}"\n' + ">" +) + +_LOGGER = logging.getLogger(__name__) + + +class AioRpcError(grpc.RpcError): + """An implementation of RpcError to be used by the asynchronous API. + + Raised RpcError is a snapshot of the final status of the RPC, values are + determined. Hence, its methods no longer needs to be coroutines. + """ + + _code: grpc.StatusCode + _details: Optional[str] + _initial_metadata: Optional[Metadata] + _trailing_metadata: Optional[Metadata] + _debug_error_string: Optional[str] + + def __init__( + self, + code: grpc.StatusCode, + initial_metadata: Metadata, + trailing_metadata: Metadata, + details: Optional[str] = None, + debug_error_string: Optional[str] = None, + ) -> None: + """Constructor. + + Args: + code: The status code with which the RPC has been finalized. + details: Optional details explaining the reason of the error. + initial_metadata: Optional initial metadata that could be sent by the + Server. + trailing_metadata: Optional metadata that could be sent by the Server. + """ + + super().__init__() + self._code = code + self._details = details + self._initial_metadata = initial_metadata + self._trailing_metadata = trailing_metadata + self._debug_error_string = debug_error_string + + def code(self) -> grpc.StatusCode: + """Accesses the status code sent by the server. + + Returns: + The `grpc.StatusCode` status code. + """ + return self._code + + def details(self) -> Optional[str]: + """Accesses the details sent by the server. + + Returns: + The description of the error. + """ + return self._details + + def initial_metadata(self) -> Metadata: + """Accesses the initial metadata sent by the server. + + Returns: + The initial metadata received. + """ + return self._initial_metadata + + def trailing_metadata(self) -> Metadata: + """Accesses the trailing metadata sent by the server. + + Returns: + The trailing metadata received. + """ + return self._trailing_metadata + + def debug_error_string(self) -> str: + """Accesses the debug error string sent by the server. + + Returns: + The debug error string received. + """ + return self._debug_error_string + + def _repr(self) -> str: + """Assembles the error string for the RPC error.""" + return _NON_OK_CALL_REPRESENTATION.format( + self.__class__.__name__, + self._code, + self._details, + self._debug_error_string, + ) + + def __repr__(self) -> str: + return self._repr() + + def __str__(self) -> str: + return self._repr() + + def __reduce__(self): + return ( + type(self), + ( + self._code, + self._initial_metadata, + self._trailing_metadata, + self._details, + self._debug_error_string, + ), + ) + + +def _create_rpc_error( + initial_metadata: Metadata, status: cygrpc.AioRpcStatus +) -> AioRpcError: + return AioRpcError( + _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[status.code()], + Metadata.from_tuple(initial_metadata), + Metadata.from_tuple(status.trailing_metadata()), + details=status.details(), + debug_error_string=status.debug_error_string(), + ) + + +class Call: + """Base implementation of client RPC Call object. + + Implements logic around final status, metadata and cancellation. + """ + + _loop: asyncio.AbstractEventLoop + _code: grpc.StatusCode + _cython_call: cygrpc._AioCall + _metadata: Tuple[MetadatumType, ...] + _request_serializer: SerializingFunction + _response_deserializer: DeserializingFunction + + def __init__( + self, + cython_call: cygrpc._AioCall, + metadata: Metadata, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + self._loop = loop + self._cython_call = cython_call + self._metadata = tuple(metadata) + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + + def __del__(self) -> None: + # The '_cython_call' object might be destructed before Call object + if hasattr(self, "_cython_call"): + if not self._cython_call.done(): + self._cancel(_GC_CANCELLATION_DETAILS) + + def cancelled(self) -> bool: + return self._cython_call.cancelled() + + def _cancel(self, details: str) -> bool: + """Forwards the application cancellation reasoning.""" + if not self._cython_call.done(): + self._cython_call.cancel(details) + return True + else: + return False + + def cancel(self) -> bool: + return self._cancel(_LOCAL_CANCELLATION_DETAILS) + + def done(self) -> bool: + return self._cython_call.done() + + def add_done_callback(self, callback: DoneCallbackType) -> None: + cb = partial(callback, self) + self._cython_call.add_done_callback(cb) + + def time_remaining(self) -> Optional[float]: + return self._cython_call.time_remaining() + + async def initial_metadata(self) -> Metadata: + raw_metadata_tuple = await self._cython_call.initial_metadata() + return Metadata.from_tuple(raw_metadata_tuple) + + async def trailing_metadata(self) -> Metadata: + raw_metadata_tuple = ( + await self._cython_call.status() + ).trailing_metadata() + return Metadata.from_tuple(raw_metadata_tuple) + + async def code(self) -> grpc.StatusCode: + cygrpc_code = (await self._cython_call.status()).code() + return _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[cygrpc_code] + + async def details(self) -> str: + return (await self._cython_call.status()).details() + + async def debug_error_string(self) -> str: + return (await self._cython_call.status()).debug_error_string() + + async def _raise_for_status(self) -> None: + if self._cython_call.is_locally_cancelled(): + raise asyncio.CancelledError() + code = await self.code() + if code != grpc.StatusCode.OK: + raise _create_rpc_error( + await self.initial_metadata(), await self._cython_call.status() + ) + + def _repr(self) -> str: + return repr(self._cython_call) + + def __repr__(self) -> str: + return self._repr() + + def __str__(self) -> str: + return self._repr() + + +class _APIStyle(enum.IntEnum): + UNKNOWN = 0 + ASYNC_GENERATOR = 1 + READER_WRITER = 2 + + +class _UnaryResponseMixin(Call, Generic[ResponseType]): + _call_response: asyncio.Task + + def _init_unary_response_mixin(self, response_task: asyncio.Task): + self._call_response = response_task + + def cancel(self) -> bool: + if super().cancel(): + self._call_response.cancel() + return True + else: + return False + + def __await__(self) -> Generator[Any, None, ResponseType]: + """Wait till the ongoing RPC request finishes.""" + try: + response = yield from self._call_response + except asyncio.CancelledError: + # Even if we caught all other CancelledError, there is still + # this corner case. If the application cancels immediately after + # the Call object is created, we will observe this + # `CancelledError`. + if not self.cancelled(): + self.cancel() + raise + + # NOTE(lidiz) If we raise RpcError in the task, and users doesn't + # 'await' on it. AsyncIO will log 'Task exception was never retrieved'. + # Instead, if we move the exception raising here, the spam stops. + # Unfortunately, there can only be one 'yield from' in '__await__'. So, + # we need to access the private instance variable. + if response is cygrpc.EOF: + if self._cython_call.is_locally_cancelled(): + raise asyncio.CancelledError() + else: + raise _create_rpc_error( + self._cython_call._initial_metadata, + self._cython_call._status, + ) + else: + return response + + +class _StreamResponseMixin(Call): + _message_aiter: AsyncIterator[ResponseType] + _preparation: asyncio.Task + _response_style: _APIStyle + + def _init_stream_response_mixin(self, preparation: asyncio.Task): + self._message_aiter = None + self._preparation = preparation + self._response_style = _APIStyle.UNKNOWN + + def _update_response_style(self, style: _APIStyle): + if self._response_style is _APIStyle.UNKNOWN: + self._response_style = style + elif self._response_style is not style: + raise cygrpc.UsageError(_API_STYLE_ERROR) + + def cancel(self) -> bool: + if super().cancel(): + self._preparation.cancel() + return True + else: + return False + + async def _fetch_stream_responses(self) -> ResponseType: + message = await self._read() + while message is not cygrpc.EOF: + yield message + message = await self._read() + + # If the read operation failed, Core should explain why. + await self._raise_for_status() + + def __aiter__(self) -> AsyncIterator[ResponseType]: + self._update_response_style(_APIStyle.ASYNC_GENERATOR) + if self._message_aiter is None: + self._message_aiter = self._fetch_stream_responses() + return self._message_aiter + + async def _read(self) -> ResponseType: + # Wait for the request being sent + await self._preparation + + # Reads response message from Core + try: + raw_response = await self._cython_call.receive_serialized_message() + except asyncio.CancelledError: + if not self.cancelled(): + self.cancel() + raise + + if raw_response is cygrpc.EOF: + return cygrpc.EOF + else: + return _common.deserialize( + raw_response, self._response_deserializer + ) + + async def read(self) -> Union[EOFType, ResponseType]: + if self.done(): + await self._raise_for_status() + return cygrpc.EOF + self._update_response_style(_APIStyle.READER_WRITER) + + response_message = await self._read() + + if response_message is cygrpc.EOF: + # If the read operation failed, Core should explain why. + await self._raise_for_status() + return response_message + + +class _StreamRequestMixin(Call): + _metadata_sent: asyncio.Event + _done_writing_flag: bool + _async_request_poller: Optional[asyncio.Task] + _request_style: _APIStyle + + def _init_stream_request_mixin( + self, request_iterator: Optional[RequestIterableType] + ): + self._metadata_sent = asyncio.Event() + self._done_writing_flag = False + + # If user passes in an async iterator, create a consumer Task. + if request_iterator is not None: + self._async_request_poller = self._loop.create_task( + self._consume_request_iterator(request_iterator) + ) + self._request_style = _APIStyle.ASYNC_GENERATOR + else: + self._async_request_poller = None + self._request_style = _APIStyle.READER_WRITER + + def _raise_for_different_style(self, style: _APIStyle): + if self._request_style is not style: + raise cygrpc.UsageError(_API_STYLE_ERROR) + + def cancel(self) -> bool: + if super().cancel(): + if self._async_request_poller is not None: + self._async_request_poller.cancel() + return True + else: + return False + + def _metadata_sent_observer(self): + self._metadata_sent.set() + + async def _consume_request_iterator( + self, request_iterator: RequestIterableType + ) -> None: + try: + if inspect.isasyncgen(request_iterator) or hasattr( + request_iterator, "__aiter__" + ): + async for request in request_iterator: + try: + await self._write(request) + except AioRpcError as rpc_error: + _LOGGER.debug( + ( + "Exception while consuming the" + " request_iterator: %s" + ), + rpc_error, + ) + return + else: + for request in request_iterator: + try: + await self._write(request) + except AioRpcError as rpc_error: + _LOGGER.debug( + ( + "Exception while consuming the" + " request_iterator: %s" + ), + rpc_error, + ) + return + + await self._done_writing() + except: # pylint: disable=bare-except + # Client iterators can raise exceptions, which we should handle by + # cancelling the RPC and logging the client's error. No exceptions + # should escape this function. + _LOGGER.debug( + "Client request_iterator raised exception:\n%s", + traceback.format_exc(), + ) + self.cancel() + + async def _write(self, request: RequestType) -> None: + if self.done(): + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + if self._done_writing_flag: + raise asyncio.InvalidStateError(_RPC_HALF_CLOSED_DETAILS) + if not self._metadata_sent.is_set(): + await self._metadata_sent.wait() + if self.done(): + await self._raise_for_status() + + serialized_request = _common.serialize( + request, self._request_serializer + ) + try: + await self._cython_call.send_serialized_message(serialized_request) + except cygrpc.InternalError as err: + self._cython_call.set_internal_error(str(err)) + await self._raise_for_status() + except asyncio.CancelledError: + if not self.cancelled(): + self.cancel() + raise + + async def _done_writing(self) -> None: + if self.done(): + # If the RPC is finished, do nothing. + return + if not self._done_writing_flag: + # If the done writing is not sent before, try to send it. + self._done_writing_flag = True + try: + await self._cython_call.send_receive_close() + except asyncio.CancelledError: + if not self.cancelled(): + self.cancel() + raise + + async def write(self, request: RequestType) -> None: + self._raise_for_different_style(_APIStyle.READER_WRITER) + await self._write(request) + + async def done_writing(self) -> None: + """Signal peer that client is done writing. + + This method is idempotent. + """ + self._raise_for_different_style(_APIStyle.READER_WRITER) + await self._done_writing() + + async def wait_for_connection(self) -> None: + await self._metadata_sent.wait() + if self.done(): + await self._raise_for_status() + + +class UnaryUnaryCall(_UnaryResponseMixin, Call, _base_call.UnaryUnaryCall): + """Object for managing unary-unary RPC calls. + + Returned when an instance of `UnaryUnaryMultiCallable` object is called. + """ + + _request: RequestType + _invocation_task: asyncio.Task + + # pylint: disable=too-many-arguments + def __init__( + self, + request: RequestType, + deadline: Optional[float], + metadata: Metadata, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + super().__init__( + channel.call(method, deadline, credentials, wait_for_ready), + metadata, + request_serializer, + response_deserializer, + loop, + ) + self._request = request + self._context = cygrpc.build_census_context() + self._invocation_task = loop.create_task(self._invoke()) + self._init_unary_response_mixin(self._invocation_task) + + async def _invoke(self) -> ResponseType: + serialized_request = _common.serialize( + self._request, self._request_serializer + ) + + # NOTE(lidiz) asyncio.CancelledError is not a good transport for status, + # because the asyncio.Task class do not cache the exception object. + # https://github.com/python/cpython/blob/edad4d89e357c92f70c0324b937845d652b20afd/Lib/asyncio/tasks.py#L785 + try: + serialized_response = await self._cython_call.unary_unary( + serialized_request, self._metadata, self._context + ) + except asyncio.CancelledError: + if not self.cancelled(): + self.cancel() + + if self._cython_call.is_ok(): + return _common.deserialize( + serialized_response, self._response_deserializer + ) + else: + return cygrpc.EOF + + async def wait_for_connection(self) -> None: + await self._invocation_task + if self.done(): + await self._raise_for_status() + + +class UnaryStreamCall(_StreamResponseMixin, Call, _base_call.UnaryStreamCall): + """Object for managing unary-stream RPC calls. + + Returned when an instance of `UnaryStreamMultiCallable` object is called. + """ + + _request: RequestType + _send_unary_request_task: asyncio.Task + + # pylint: disable=too-many-arguments + def __init__( + self, + request: RequestType, + deadline: Optional[float], + metadata: Metadata, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + super().__init__( + channel.call(method, deadline, credentials, wait_for_ready), + metadata, + request_serializer, + response_deserializer, + loop, + ) + self._request = request + self._context = cygrpc.build_census_context() + self._send_unary_request_task = loop.create_task( + self._send_unary_request() + ) + self._init_stream_response_mixin(self._send_unary_request_task) + + async def _send_unary_request(self) -> ResponseType: + serialized_request = _common.serialize( + self._request, self._request_serializer + ) + try: + await self._cython_call.initiate_unary_stream( + serialized_request, self._metadata, self._context + ) + except asyncio.CancelledError: + if not self.cancelled(): + self.cancel() + raise + + async def wait_for_connection(self) -> None: + await self._send_unary_request_task + if self.done(): + await self._raise_for_status() + + +# pylint: disable=too-many-ancestors +class StreamUnaryCall( + _StreamRequestMixin, _UnaryResponseMixin, Call, _base_call.StreamUnaryCall +): + """Object for managing stream-unary RPC calls. + + Returned when an instance of `StreamUnaryMultiCallable` object is called. + """ + + # pylint: disable=too-many-arguments + def __init__( + self, + request_iterator: Optional[RequestIterableType], + deadline: Optional[float], + metadata: Metadata, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + super().__init__( + channel.call(method, deadline, credentials, wait_for_ready), + metadata, + request_serializer, + response_deserializer, + loop, + ) + + self._context = cygrpc.build_census_context() + self._init_stream_request_mixin(request_iterator) + self._init_unary_response_mixin(loop.create_task(self._conduct_rpc())) + + async def _conduct_rpc(self) -> ResponseType: + try: + serialized_response = await self._cython_call.stream_unary( + self._metadata, self._metadata_sent_observer, self._context + ) + except asyncio.CancelledError: + if not self.cancelled(): + self.cancel() + raise + + if self._cython_call.is_ok(): + return _common.deserialize( + serialized_response, self._response_deserializer + ) + else: + return cygrpc.EOF + + +class StreamStreamCall( + _StreamRequestMixin, _StreamResponseMixin, Call, _base_call.StreamStreamCall +): + """Object for managing stream-stream RPC calls. + + Returned when an instance of `StreamStreamMultiCallable` object is called. + """ + + _initializer: asyncio.Task + + # pylint: disable=too-many-arguments + def __init__( + self, + request_iterator: Optional[RequestIterableType], + deadline: Optional[float], + metadata: Metadata, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + super().__init__( + channel.call(method, deadline, credentials, wait_for_ready), + metadata, + request_serializer, + response_deserializer, + loop, + ) + self._context = cygrpc.build_census_context() + self._initializer = self._loop.create_task(self._prepare_rpc()) + self._init_stream_request_mixin(request_iterator) + self._init_stream_response_mixin(self._initializer) + + async def _prepare_rpc(self): + """This method prepares the RPC for receiving/sending messages. + + All other operations around the stream should only happen after the + completion of this method. + """ + try: + await self._cython_call.initiate_stream_stream( + self._metadata, self._metadata_sent_observer, self._context + ) + except asyncio.CancelledError: + if not self.cancelled(): + self.cancel() + # No need to raise RpcError here, because no one will `await` this task. diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_channel.py b/myenv/lib/python3.12/site-packages/grpc/aio/_channel.py new file mode 100644 index 0000000..62537f1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_channel.py @@ -0,0 +1,627 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Invocation-side implementation of gRPC Asyncio Python.""" + +import asyncio +import sys +from typing import Any, Iterable, List, Optional, Sequence + +import grpc +from grpc import _common +from grpc import _compression +from grpc import _grpcio_metadata +from grpc._cython import cygrpc + +from . import _base_call +from . import _base_channel +from ._call import StreamStreamCall +from ._call import StreamUnaryCall +from ._call import UnaryStreamCall +from ._call import UnaryUnaryCall +from ._interceptor import ClientInterceptor +from ._interceptor import InterceptedStreamStreamCall +from ._interceptor import InterceptedStreamUnaryCall +from ._interceptor import InterceptedUnaryStreamCall +from ._interceptor import InterceptedUnaryUnaryCall +from ._interceptor import StreamStreamClientInterceptor +from ._interceptor import StreamUnaryClientInterceptor +from ._interceptor import UnaryStreamClientInterceptor +from ._interceptor import UnaryUnaryClientInterceptor +from ._metadata import Metadata +from ._typing import ChannelArgumentType +from ._typing import DeserializingFunction +from ._typing import MetadataType +from ._typing import RequestIterableType +from ._typing import RequestType +from ._typing import ResponseType +from ._typing import SerializingFunction +from ._utils import _timeout_to_deadline + +_USER_AGENT = "grpc-python-asyncio/{}".format(_grpcio_metadata.__version__) + +if sys.version_info[1] < 7: + + def _all_tasks() -> Iterable[asyncio.Task]: + return asyncio.Task.all_tasks() # pylint: disable=no-member + +else: + + def _all_tasks() -> Iterable[asyncio.Task]: + return asyncio.all_tasks() + + +def _augment_channel_arguments( + base_options: ChannelArgumentType, compression: Optional[grpc.Compression] +): + compression_channel_argument = _compression.create_channel_option( + compression + ) + user_agent_channel_argument = ( + ( + cygrpc.ChannelArgKey.primary_user_agent_string, + _USER_AGENT, + ), + ) + return ( + tuple(base_options) + + compression_channel_argument + + user_agent_channel_argument + ) + + +class _BaseMultiCallable: + """Base class of all multi callable objects. + + Handles the initialization logic and stores common attributes. + """ + + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + _method: bytes + _request_serializer: SerializingFunction + _response_deserializer: DeserializingFunction + _interceptors: Optional[Sequence[ClientInterceptor]] + _references: List[Any] + _loop: asyncio.AbstractEventLoop + + # pylint: disable=too-many-arguments + def __init__( + self, + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + interceptors: Optional[Sequence[ClientInterceptor]], + references: List[Any], + loop: asyncio.AbstractEventLoop, + ) -> None: + self._loop = loop + self._channel = channel + self._method = method + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + self._interceptors = interceptors + self._references = references + + @staticmethod + def _init_metadata( + metadata: Optional[MetadataType] = None, + compression: Optional[grpc.Compression] = None, + ) -> Metadata: + """Based on the provided values for or initialise the final + metadata, as it should be used for the current call. + """ + metadata = metadata or Metadata() + if not isinstance(metadata, Metadata) and isinstance(metadata, tuple): + metadata = Metadata.from_tuple(metadata) + if compression: + metadata = Metadata( + *_compression.augment_metadata(metadata, compression) + ) + return metadata + + +class UnaryUnaryMultiCallable( + _BaseMultiCallable, _base_channel.UnaryUnaryMultiCallable +): + def __call__( + self, + request: RequestType, + *, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _base_call.UnaryUnaryCall[RequestType, ResponseType]: + metadata = self._init_metadata(metadata, compression) + if not self._interceptors: + call = UnaryUnaryCall( + request, + _timeout_to_deadline(timeout), + metadata, + credentials, + wait_for_ready, + self._channel, + self._method, + self._request_serializer, + self._response_deserializer, + self._loop, + ) + else: + call = InterceptedUnaryUnaryCall( + self._interceptors, + request, + timeout, + metadata, + credentials, + wait_for_ready, + self._channel, + self._method, + self._request_serializer, + self._response_deserializer, + self._loop, + ) + + return call + + +class UnaryStreamMultiCallable( + _BaseMultiCallable, _base_channel.UnaryStreamMultiCallable +): + def __call__( + self, + request: RequestType, + *, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _base_call.UnaryStreamCall[RequestType, ResponseType]: + metadata = self._init_metadata(metadata, compression) + + if not self._interceptors: + call = UnaryStreamCall( + request, + _timeout_to_deadline(timeout), + metadata, + credentials, + wait_for_ready, + self._channel, + self._method, + self._request_serializer, + self._response_deserializer, + self._loop, + ) + else: + call = InterceptedUnaryStreamCall( + self._interceptors, + request, + timeout, + metadata, + credentials, + wait_for_ready, + self._channel, + self._method, + self._request_serializer, + self._response_deserializer, + self._loop, + ) + + return call + + +class StreamUnaryMultiCallable( + _BaseMultiCallable, _base_channel.StreamUnaryMultiCallable +): + def __call__( + self, + request_iterator: Optional[RequestIterableType] = None, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _base_call.StreamUnaryCall: + metadata = self._init_metadata(metadata, compression) + + if not self._interceptors: + call = StreamUnaryCall( + request_iterator, + _timeout_to_deadline(timeout), + metadata, + credentials, + wait_for_ready, + self._channel, + self._method, + self._request_serializer, + self._response_deserializer, + self._loop, + ) + else: + call = InterceptedStreamUnaryCall( + self._interceptors, + request_iterator, + timeout, + metadata, + credentials, + wait_for_ready, + self._channel, + self._method, + self._request_serializer, + self._response_deserializer, + self._loop, + ) + + return call + + +class StreamStreamMultiCallable( + _BaseMultiCallable, _base_channel.StreamStreamMultiCallable +): + def __call__( + self, + request_iterator: Optional[RequestIterableType] = None, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = None, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None, + ) -> _base_call.StreamStreamCall: + metadata = self._init_metadata(metadata, compression) + + if not self._interceptors: + call = StreamStreamCall( + request_iterator, + _timeout_to_deadline(timeout), + metadata, + credentials, + wait_for_ready, + self._channel, + self._method, + self._request_serializer, + self._response_deserializer, + self._loop, + ) + else: + call = InterceptedStreamStreamCall( + self._interceptors, + request_iterator, + timeout, + metadata, + credentials, + wait_for_ready, + self._channel, + self._method, + self._request_serializer, + self._response_deserializer, + self._loop, + ) + + return call + + +class Channel(_base_channel.Channel): + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + _unary_unary_interceptors: List[UnaryUnaryClientInterceptor] + _unary_stream_interceptors: List[UnaryStreamClientInterceptor] + _stream_unary_interceptors: List[StreamUnaryClientInterceptor] + _stream_stream_interceptors: List[StreamStreamClientInterceptor] + + def __init__( + self, + target: str, + options: ChannelArgumentType, + credentials: Optional[grpc.ChannelCredentials], + compression: Optional[grpc.Compression], + interceptors: Optional[Sequence[ClientInterceptor]], + ): + """Constructor. + + Args: + target: The target to which to connect. + options: Configuration options for the channel. + credentials: A cygrpc.ChannelCredentials or None. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel. + interceptors: An optional list of interceptors that would be used for + intercepting any RPC executed with that channel. + """ + self._unary_unary_interceptors = [] + self._unary_stream_interceptors = [] + self._stream_unary_interceptors = [] + self._stream_stream_interceptors = [] + + if interceptors is not None: + for interceptor in interceptors: + if isinstance(interceptor, UnaryUnaryClientInterceptor): + self._unary_unary_interceptors.append(interceptor) + elif isinstance(interceptor, UnaryStreamClientInterceptor): + self._unary_stream_interceptors.append(interceptor) + elif isinstance(interceptor, StreamUnaryClientInterceptor): + self._stream_unary_interceptors.append(interceptor) + elif isinstance(interceptor, StreamStreamClientInterceptor): + self._stream_stream_interceptors.append(interceptor) + else: + raise ValueError( + "Interceptor {} must be ".format(interceptor) + + "{} or ".format(UnaryUnaryClientInterceptor.__name__) + + "{} or ".format(UnaryStreamClientInterceptor.__name__) + + "{} or ".format(StreamUnaryClientInterceptor.__name__) + + "{}. ".format(StreamStreamClientInterceptor.__name__) + ) + + self._loop = cygrpc.get_working_loop() + self._channel = cygrpc.AioChannel( + _common.encode(target), + _augment_channel_arguments(options, compression), + credentials, + self._loop, + ) + + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + await self._close(None) + + async def _close(self, grace): # pylint: disable=too-many-branches + if self._channel.closed(): + return + + # No new calls will be accepted by the Cython channel. + self._channel.closing() + + # Iterate through running tasks + tasks = _all_tasks() + calls = [] + call_tasks = [] + for task in tasks: + try: + stack = task.get_stack(limit=1) + except AttributeError as attribute_error: + # NOTE(lidiz) tl;dr: If the Task is created with a CPython + # object, it will trigger AttributeError. + # + # In the global finalizer, the event loop schedules + # a CPython PyAsyncGenAThrow object. + # https://github.com/python/cpython/blob/00e45877e33d32bb61aa13a2033e3bba370bda4d/Lib/asyncio/base_events.py#L484 + # + # However, the PyAsyncGenAThrow object is written in C and + # failed to include the normal Python frame objects. Hence, + # this exception is a false negative, and it is safe to ignore + # the failure. It is fixed by https://github.com/python/cpython/pull/18669, + # but not available until 3.9 or 3.8.3. So, we have to keep it + # for a while. + # TODO(lidiz) drop this hack after 3.8 deprecation + if "frame" in str(attribute_error): + continue + else: + raise + + # If the Task is created by a C-extension, the stack will be empty. + if not stack: + continue + + # Locate ones created by `aio.Call`. + frame = stack[0] + candidate = frame.f_locals.get("self") + # Explicitly check for a non-null candidate instead of the more pythonic 'if candidate:' + # because doing 'if candidate:' assumes that the coroutine implements '__bool__' which + # might not always be the case. + if candidate is not None: + if isinstance(candidate, _base_call.Call): + if hasattr(candidate, "_channel"): + # For intercepted Call object + if candidate._channel is not self._channel: + continue + elif hasattr(candidate, "_cython_call"): + # For normal Call object + if candidate._cython_call._channel is not self._channel: + continue + else: + # Unidentified Call object + raise cygrpc.InternalError( + f"Unrecognized call object: {candidate}" + ) + + calls.append(candidate) + call_tasks.append(task) + + # If needed, try to wait for them to finish. + # Call objects are not always awaitables. + if grace and call_tasks: + await asyncio.wait(call_tasks, timeout=grace) + + # Time to cancel existing calls. + for call in calls: + call.cancel() + + # Destroy the channel + self._channel.close() + + async def close(self, grace: Optional[float] = None): + await self._close(grace) + + def __del__(self): + if hasattr(self, "_channel"): + if not self._channel.closed(): + self._channel.close() + + def get_state( + self, try_to_connect: bool = False + ) -> grpc.ChannelConnectivity: + result = self._channel.check_connectivity_state(try_to_connect) + return _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[result] + + async def wait_for_state_change( + self, + last_observed_state: grpc.ChannelConnectivity, + ) -> None: + assert await self._channel.watch_connectivity_state( + last_observed_state.value[0], None + ) + + async def channel_ready(self) -> None: + state = self.get_state(try_to_connect=True) + while state != grpc.ChannelConnectivity.READY: + await self.wait_for_state_change(state) + state = self.get_state(try_to_connect=True) + + # TODO(xuanwn): Implement this method after we have + # observability for Asyncio. + def _get_registered_call_handle(self, method: str) -> int: + pass + + # TODO(xuanwn): Implement _registered_method after we have + # observability for Asyncio. + # pylint: disable=arguments-differ,unused-argument + def unary_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> UnaryUnaryMultiCallable: + return UnaryUnaryMultiCallable( + self._channel, + _common.encode(method), + request_serializer, + response_deserializer, + self._unary_unary_interceptors, + [self], + self._loop, + ) + + # TODO(xuanwn): Implement _registered_method after we have + # observability for Asyncio. + # pylint: disable=arguments-differ,unused-argument + def unary_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> UnaryStreamMultiCallable: + return UnaryStreamMultiCallable( + self._channel, + _common.encode(method), + request_serializer, + response_deserializer, + self._unary_stream_interceptors, + [self], + self._loop, + ) + + # TODO(xuanwn): Implement _registered_method after we have + # observability for Asyncio. + # pylint: disable=arguments-differ,unused-argument + def stream_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> StreamUnaryMultiCallable: + return StreamUnaryMultiCallable( + self._channel, + _common.encode(method), + request_serializer, + response_deserializer, + self._stream_unary_interceptors, + [self], + self._loop, + ) + + # TODO(xuanwn): Implement _registered_method after we have + # observability for Asyncio. + # pylint: disable=arguments-differ,unused-argument + def stream_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None, + _registered_method: Optional[bool] = False, + ) -> StreamStreamMultiCallable: + return StreamStreamMultiCallable( + self._channel, + _common.encode(method), + request_serializer, + response_deserializer, + self._stream_stream_interceptors, + [self], + self._loop, + ) + + +def insecure_channel( + target: str, + options: Optional[ChannelArgumentType] = None, + compression: Optional[grpc.Compression] = None, + interceptors: Optional[Sequence[ClientInterceptor]] = None, +): + """Creates an insecure asynchronous Channel to a server. + + Args: + target: The server address + options: An optional list of key-value pairs (:term:`channel_arguments` + in gRPC Core runtime) to configure the channel. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel. + interceptors: An optional sequence of interceptors that will be executed for + any call executed with this channel. + + Returns: + A Channel. + """ + return Channel( + target, + () if options is None else options, + None, + compression, + interceptors, + ) + + +def secure_channel( + target: str, + credentials: grpc.ChannelCredentials, + options: Optional[ChannelArgumentType] = None, + compression: Optional[grpc.Compression] = None, + interceptors: Optional[Sequence[ClientInterceptor]] = None, +): + """Creates a secure asynchronous Channel to a server. + + Args: + target: The server address. + credentials: A ChannelCredentials instance. + options: An optional list of key-value pairs (:term:`channel_arguments` + in gRPC Core runtime) to configure the channel. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel. + interceptors: An optional sequence of interceptors that will be executed for + any call executed with this channel. + + Returns: + An aio.Channel. + """ + return Channel( + target, + () if options is None else options, + credentials._credentials, + compression, + interceptors, + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_interceptor.py b/myenv/lib/python3.12/site-packages/grpc/aio/_interceptor.py new file mode 100644 index 0000000..1401a08 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_interceptor.py @@ -0,0 +1,1178 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Interceptors implementation of gRPC Asyncio Python.""" +from abc import ABCMeta +from abc import abstractmethod +import asyncio +import collections +import functools +from typing import ( + AsyncIterable, + Awaitable, + Callable, + Iterator, + List, + Optional, + Sequence, + Union, +) + +import grpc +from grpc._cython import cygrpc + +from . import _base_call +from ._call import AioRpcError +from ._call import StreamStreamCall +from ._call import StreamUnaryCall +from ._call import UnaryStreamCall +from ._call import UnaryUnaryCall +from ._call import _API_STYLE_ERROR +from ._call import _RPC_ALREADY_FINISHED_DETAILS +from ._call import _RPC_HALF_CLOSED_DETAILS +from ._metadata import Metadata +from ._typing import DeserializingFunction +from ._typing import DoneCallbackType +from ._typing import EOFType +from ._typing import RequestIterableType +from ._typing import RequestType +from ._typing import ResponseIterableType +from ._typing import ResponseType +from ._typing import SerializingFunction +from ._utils import _timeout_to_deadline + +_LOCAL_CANCELLATION_DETAILS = "Locally cancelled by application!" + + +class ServerInterceptor(metaclass=ABCMeta): + """Affords intercepting incoming RPCs on the service-side. + + This is an EXPERIMENTAL API. + """ + + @abstractmethod + async def intercept_service( + self, + continuation: Callable[ + [grpc.HandlerCallDetails], Awaitable[grpc.RpcMethodHandler] + ], + handler_call_details: grpc.HandlerCallDetails, + ) -> grpc.RpcMethodHandler: + """Intercepts incoming RPCs before handing them over to a handler. + + State can be passed from an interceptor to downstream interceptors + via contextvars. The first interceptor is called from an empty + contextvars.Context, and the same Context is used for downstream + interceptors and for the final handler call. Note that there are no + guarantees that interceptors and handlers will be called from the + same thread. + + Args: + continuation: A function that takes a HandlerCallDetails and + proceeds to invoke the next interceptor in the chain, if any, + or the RPC handler lookup logic, with the call details passed + as an argument, and returns an RpcMethodHandler instance if + the RPC is considered serviced, or None otherwise. + handler_call_details: A HandlerCallDetails describing the RPC. + + Returns: + An RpcMethodHandler with which the RPC may be serviced if the + interceptor chooses to service this RPC, or None otherwise. + """ + + +class ClientCallDetails( + collections.namedtuple( + "ClientCallDetails", + ("method", "timeout", "metadata", "credentials", "wait_for_ready"), + ), + grpc.ClientCallDetails, +): + """Describes an RPC to be invoked. + + This is an EXPERIMENTAL API. + + Args: + method: The method name of the RPC. + timeout: An optional duration of time in seconds to allow for the RPC. + metadata: Optional metadata to be transmitted to the service-side of + the RPC. + credentials: An optional CallCredentials for the RPC. + wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. + """ + + method: str + timeout: Optional[float] + metadata: Optional[Metadata] + credentials: Optional[grpc.CallCredentials] + wait_for_ready: Optional[bool] + + +class ClientInterceptor(metaclass=ABCMeta): + """Base class used for all Aio Client Interceptor classes""" + + +class UnaryUnaryClientInterceptor(ClientInterceptor, metaclass=ABCMeta): + """Affords intercepting unary-unary invocations.""" + + @abstractmethod + async def intercept_unary_unary( + self, + continuation: Callable[ + [ClientCallDetails, RequestType], UnaryUnaryCall + ], + client_call_details: ClientCallDetails, + request: RequestType, + ) -> Union[UnaryUnaryCall, ResponseType]: + """Intercepts a unary-unary invocation asynchronously. + + Args: + continuation: A coroutine that proceeds with the invocation by + executing the next interceptor in the chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `call = await continuation(client_call_details, request)` + to continue with the RPC. `continuation` returns the call to the + RPC. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request: The request value for the RPC. + + Returns: + An object with the RPC response. + + Raises: + AioRpcError: Indicating that the RPC terminated with non-OK status. + asyncio.CancelledError: Indicating that the RPC was canceled. + """ + + +class UnaryStreamClientInterceptor(ClientInterceptor, metaclass=ABCMeta): + """Affords intercepting unary-stream invocations.""" + + @abstractmethod + async def intercept_unary_stream( + self, + continuation: Callable[ + [ClientCallDetails, RequestType], UnaryStreamCall + ], + client_call_details: ClientCallDetails, + request: RequestType, + ) -> Union[ResponseIterableType, UnaryStreamCall]: + """Intercepts a unary-stream invocation asynchronously. + + The function could return the call object or an asynchronous + iterator, in case of being an asyncrhonous iterator this will + become the source of the reads done by the caller. + + Args: + continuation: A coroutine that proceeds with the invocation by + executing the next interceptor in the chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `call = await continuation(client_call_details, request)` + to continue with the RPC. `continuation` returns the call to the + RPC. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request: The request value for the RPC. + + Returns: + The RPC Call or an asynchronous iterator. + + Raises: + AioRpcError: Indicating that the RPC terminated with non-OK status. + asyncio.CancelledError: Indicating that the RPC was canceled. + """ + + +class StreamUnaryClientInterceptor(ClientInterceptor, metaclass=ABCMeta): + """Affords intercepting stream-unary invocations.""" + + @abstractmethod + async def intercept_stream_unary( + self, + continuation: Callable[ + [ClientCallDetails, RequestType], StreamUnaryCall + ], + client_call_details: ClientCallDetails, + request_iterator: RequestIterableType, + ) -> StreamUnaryCall: + """Intercepts a stream-unary invocation asynchronously. + + Within the interceptor the usage of the call methods like `write` or + even awaiting the call should be done carefully, since the caller + could be expecting an untouched call, for example for start writing + messages to it. + + Args: + continuation: A coroutine that proceeds with the invocation by + executing the next interceptor in the chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `call = await continuation(client_call_details, request_iterator)` + to continue with the RPC. `continuation` returns the call to the + RPC. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request_iterator: The request iterator that will produce requests + for the RPC. + + Returns: + The RPC Call. + + Raises: + AioRpcError: Indicating that the RPC terminated with non-OK status. + asyncio.CancelledError: Indicating that the RPC was canceled. + """ + + +class StreamStreamClientInterceptor(ClientInterceptor, metaclass=ABCMeta): + """Affords intercepting stream-stream invocations.""" + + @abstractmethod + async def intercept_stream_stream( + self, + continuation: Callable[ + [ClientCallDetails, RequestType], StreamStreamCall + ], + client_call_details: ClientCallDetails, + request_iterator: RequestIterableType, + ) -> Union[ResponseIterableType, StreamStreamCall]: + """Intercepts a stream-stream invocation asynchronously. + + Within the interceptor the usage of the call methods like `write` or + even awaiting the call should be done carefully, since the caller + could be expecting an untouched call, for example for start writing + messages to it. + + The function could return the call object or an asynchronous + iterator, in case of being an asyncrhonous iterator this will + become the source of the reads done by the caller. + + Args: + continuation: A coroutine that proceeds with the invocation by + executing the next interceptor in the chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `call = await continuation(client_call_details, request_iterator)` + to continue with the RPC. `continuation` returns the call to the + RPC. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request_iterator: The request iterator that will produce requests + for the RPC. + + Returns: + The RPC Call or an asynchronous iterator. + + Raises: + AioRpcError: Indicating that the RPC terminated with non-OK status. + asyncio.CancelledError: Indicating that the RPC was canceled. + """ + + +class InterceptedCall: + """Base implementation for all intercepted call arities. + + Interceptors might have some work to do before the RPC invocation with + the capacity of changing the invocation parameters, and some work to do + after the RPC invocation with the capacity for accessing to the wrapped + `UnaryUnaryCall`. + + It handles also early and later cancellations, when the RPC has not even + started and the execution is still held by the interceptors or when the + RPC has finished but again the execution is still held by the interceptors. + + Once the RPC is finally executed, all methods are finally done against the + intercepted call, being at the same time the same call returned to the + interceptors. + + As a base class for all of the interceptors implements the logic around + final status, metadata and cancellation. + """ + + _interceptors_task: asyncio.Task + _pending_add_done_callbacks: Sequence[DoneCallbackType] + + def __init__(self, interceptors_task: asyncio.Task) -> None: + self._interceptors_task = interceptors_task + self._pending_add_done_callbacks = [] + self._interceptors_task.add_done_callback( + self._fire_or_add_pending_done_callbacks + ) + + def __del__(self): + self.cancel() + + def _fire_or_add_pending_done_callbacks( + self, interceptors_task: asyncio.Task + ) -> None: + if not self._pending_add_done_callbacks: + return + + call_completed = False + + try: + call = interceptors_task.result() + if call.done(): + call_completed = True + except (AioRpcError, asyncio.CancelledError): + call_completed = True + + if call_completed: + for callback in self._pending_add_done_callbacks: + callback(self) + else: + for callback in self._pending_add_done_callbacks: + callback = functools.partial( + self._wrap_add_done_callback, callback + ) + call.add_done_callback(callback) + + self._pending_add_done_callbacks = [] + + def _wrap_add_done_callback( + self, callback: DoneCallbackType, unused_call: _base_call.Call + ) -> None: + callback(self) + + def cancel(self) -> bool: + if not self._interceptors_task.done(): + # There is no yet the intercepted call available, + # Trying to cancel it by using the generic Asyncio + # cancellation method. + return self._interceptors_task.cancel() + + try: + call = self._interceptors_task.result() + except AioRpcError: + return False + except asyncio.CancelledError: + return False + + return call.cancel() + + def cancelled(self) -> bool: + if not self._interceptors_task.done(): + return False + + try: + call = self._interceptors_task.result() + except AioRpcError as err: + return err.code() == grpc.StatusCode.CANCELLED + except asyncio.CancelledError: + return True + + return call.cancelled() + + def done(self) -> bool: + if not self._interceptors_task.done(): + return False + + try: + call = self._interceptors_task.result() + except (AioRpcError, asyncio.CancelledError): + return True + + return call.done() + + def add_done_callback(self, callback: DoneCallbackType) -> None: + if not self._interceptors_task.done(): + self._pending_add_done_callbacks.append(callback) + return + + try: + call = self._interceptors_task.result() + except (AioRpcError, asyncio.CancelledError): + callback(self) + return + + if call.done(): + callback(self) + else: + callback = functools.partial(self._wrap_add_done_callback, callback) + call.add_done_callback(callback) + + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() + + async def initial_metadata(self) -> Optional[Metadata]: + try: + call = await self._interceptors_task + except AioRpcError as err: + return err.initial_metadata() + except asyncio.CancelledError: + return None + + return await call.initial_metadata() + + async def trailing_metadata(self) -> Optional[Metadata]: + try: + call = await self._interceptors_task + except AioRpcError as err: + return err.trailing_metadata() + except asyncio.CancelledError: + return None + + return await call.trailing_metadata() + + async def code(self) -> grpc.StatusCode: + try: + call = await self._interceptors_task + except AioRpcError as err: + return err.code() + except asyncio.CancelledError: + return grpc.StatusCode.CANCELLED + + return await call.code() + + async def details(self) -> str: + try: + call = await self._interceptors_task + except AioRpcError as err: + return err.details() + except asyncio.CancelledError: + return _LOCAL_CANCELLATION_DETAILS + + return await call.details() + + async def debug_error_string(self) -> Optional[str]: + try: + call = await self._interceptors_task + except AioRpcError as err: + return err.debug_error_string() + except asyncio.CancelledError: + return "" + + return await call.debug_error_string() + + async def wait_for_connection(self) -> None: + call = await self._interceptors_task + return await call.wait_for_connection() + + +class _InterceptedUnaryResponseMixin: + def __await__(self): + call = yield from self._interceptors_task.__await__() + response = yield from call.__await__() + return response + + +class _InterceptedStreamResponseMixin: + _response_aiter: Optional[AsyncIterable[ResponseType]] + + def _init_stream_response_mixin(self) -> None: + # Is initalized later, otherwise if the iterator is not finally + # consumed a logging warning is emmited by Asyncio. + self._response_aiter = None + + async def _wait_for_interceptor_task_response_iterator( + self, + ) -> ResponseType: + call = await self._interceptors_task + async for response in call: + yield response + + def __aiter__(self) -> AsyncIterable[ResponseType]: + if self._response_aiter is None: + self._response_aiter = ( + self._wait_for_interceptor_task_response_iterator() + ) + return self._response_aiter + + async def read(self) -> Union[EOFType, ResponseType]: + if self._response_aiter is None: + self._response_aiter = ( + self._wait_for_interceptor_task_response_iterator() + ) + try: + return await self._response_aiter.asend(None) + except StopAsyncIteration: + return cygrpc.EOF + + +class _InterceptedStreamRequestMixin: + _write_to_iterator_async_gen: Optional[AsyncIterable[RequestType]] + _write_to_iterator_queue: Optional[asyncio.Queue] + _status_code_task: Optional[asyncio.Task] + + _FINISH_ITERATOR_SENTINEL = object() + + def _init_stream_request_mixin( + self, request_iterator: Optional[RequestIterableType] + ) -> RequestIterableType: + if request_iterator is None: + # We provide our own request iterator which is a proxy + # of the futures writes that will be done by the caller. + self._write_to_iterator_queue = asyncio.Queue(maxsize=1) + self._write_to_iterator_async_gen = ( + self._proxy_writes_as_request_iterator() + ) + self._status_code_task = None + request_iterator = self._write_to_iterator_async_gen + else: + self._write_to_iterator_queue = None + + return request_iterator + + async def _proxy_writes_as_request_iterator(self): + await self._interceptors_task + + while True: + value = await self._write_to_iterator_queue.get() + if ( + value + is _InterceptedStreamRequestMixin._FINISH_ITERATOR_SENTINEL + ): + break + yield value + + async def _write_to_iterator_queue_interruptible( + self, request: RequestType, call: InterceptedCall + ): + # Write the specified 'request' to the request iterator queue using the + # specified 'call' to allow for interruption of the write in the case + # of abrupt termination of the call. + if self._status_code_task is None: + self._status_code_task = self._loop.create_task(call.code()) + + await asyncio.wait( + ( + self._loop.create_task( + self._write_to_iterator_queue.put(request) + ), + self._status_code_task, + ), + return_when=asyncio.FIRST_COMPLETED, + ) + + async def write(self, request: RequestType) -> None: + # If no queue was created it means that requests + # should be expected through an iterators provided + # by the caller. + if self._write_to_iterator_queue is None: + raise cygrpc.UsageError(_API_STYLE_ERROR) + + try: + call = await self._interceptors_task + except (asyncio.CancelledError, AioRpcError): + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + + if call.done(): + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + elif call._done_writing_flag: + raise asyncio.InvalidStateError(_RPC_HALF_CLOSED_DETAILS) + + await self._write_to_iterator_queue_interruptible(request, call) + + if call.done(): + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + + async def done_writing(self) -> None: + """Signal peer that client is done writing. + + This method is idempotent. + """ + # If no queue was created it means that requests + # should be expected through an iterators provided + # by the caller. + if self._write_to_iterator_queue is None: + raise cygrpc.UsageError(_API_STYLE_ERROR) + + try: + call = await self._interceptors_task + except asyncio.CancelledError: + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + + await self._write_to_iterator_queue_interruptible( + _InterceptedStreamRequestMixin._FINISH_ITERATOR_SENTINEL, call + ) + + +class InterceptedUnaryUnaryCall( + _InterceptedUnaryResponseMixin, InterceptedCall, _base_call.UnaryUnaryCall +): + """Used for running a `UnaryUnaryCall` wrapped by interceptors. + + For the `__await__` method is it is proxied to the intercepted call only when + the interceptor task is finished. + """ + + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + + # pylint: disable=too-many-arguments + def __init__( + self, + interceptors: Sequence[UnaryUnaryClientInterceptor], + request: RequestType, + timeout: Optional[float], + metadata: Metadata, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + self._loop = loop + self._channel = channel + interceptors_task = loop.create_task( + self._invoke( + interceptors, + method, + timeout, + metadata, + credentials, + wait_for_ready, + request, + request_serializer, + response_deserializer, + ) + ) + super().__init__(interceptors_task) + + # pylint: disable=too-many-arguments + async def _invoke( + self, + interceptors: Sequence[UnaryUnaryClientInterceptor], + method: bytes, + timeout: Optional[float], + metadata: Optional[Metadata], + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + request: RequestType, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + ) -> UnaryUnaryCall: + """Run the RPC call wrapped in interceptors""" + + async def _run_interceptor( + interceptors: List[UnaryUnaryClientInterceptor], + client_call_details: ClientCallDetails, + request: RequestType, + ) -> _base_call.UnaryUnaryCall: + if interceptors: + continuation = functools.partial( + _run_interceptor, interceptors[1:] + ) + call_or_response = await interceptors[0].intercept_unary_unary( + continuation, client_call_details, request + ) + + if isinstance(call_or_response, _base_call.UnaryUnaryCall): + return call_or_response + else: + return UnaryUnaryCallResponse(call_or_response) + + else: + return UnaryUnaryCall( + request, + _timeout_to_deadline(client_call_details.timeout), + client_call_details.metadata, + client_call_details.credentials, + client_call_details.wait_for_ready, + self._channel, + client_call_details.method, + request_serializer, + response_deserializer, + self._loop, + ) + + client_call_details = ClientCallDetails( + method, timeout, metadata, credentials, wait_for_ready + ) + return await _run_interceptor( + list(interceptors), client_call_details, request + ) + + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() + + +class InterceptedUnaryStreamCall( + _InterceptedStreamResponseMixin, InterceptedCall, _base_call.UnaryStreamCall +): + """Used for running a `UnaryStreamCall` wrapped by interceptors.""" + + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + _last_returned_call_from_interceptors = Optional[_base_call.UnaryStreamCall] + + # pylint: disable=too-many-arguments + def __init__( + self, + interceptors: Sequence[UnaryStreamClientInterceptor], + request: RequestType, + timeout: Optional[float], + metadata: Metadata, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + self._loop = loop + self._channel = channel + self._init_stream_response_mixin() + self._last_returned_call_from_interceptors = None + interceptors_task = loop.create_task( + self._invoke( + interceptors, + method, + timeout, + metadata, + credentials, + wait_for_ready, + request, + request_serializer, + response_deserializer, + ) + ) + super().__init__(interceptors_task) + + # pylint: disable=too-many-arguments + async def _invoke( + self, + interceptors: Sequence[UnaryStreamClientInterceptor], + method: bytes, + timeout: Optional[float], + metadata: Optional[Metadata], + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + request: RequestType, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + ) -> UnaryStreamCall: + """Run the RPC call wrapped in interceptors""" + + async def _run_interceptor( + interceptors: List[UnaryStreamClientInterceptor], + client_call_details: ClientCallDetails, + request: RequestType, + ) -> _base_call.UnaryStreamCall: + if interceptors: + continuation = functools.partial( + _run_interceptor, interceptors[1:] + ) + + call_or_response_iterator = await interceptors[ + 0 + ].intercept_unary_stream( + continuation, client_call_details, request + ) + + if isinstance( + call_or_response_iterator, _base_call.UnaryStreamCall + ): + self._last_returned_call_from_interceptors = ( + call_or_response_iterator + ) + else: + self._last_returned_call_from_interceptors = ( + UnaryStreamCallResponseIterator( + self._last_returned_call_from_interceptors, + call_or_response_iterator, + ) + ) + return self._last_returned_call_from_interceptors + else: + self._last_returned_call_from_interceptors = UnaryStreamCall( + request, + _timeout_to_deadline(client_call_details.timeout), + client_call_details.metadata, + client_call_details.credentials, + client_call_details.wait_for_ready, + self._channel, + client_call_details.method, + request_serializer, + response_deserializer, + self._loop, + ) + + return self._last_returned_call_from_interceptors + + client_call_details = ClientCallDetails( + method, timeout, metadata, credentials, wait_for_ready + ) + return await _run_interceptor( + list(interceptors), client_call_details, request + ) + + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() + + +class InterceptedStreamUnaryCall( + _InterceptedUnaryResponseMixin, + _InterceptedStreamRequestMixin, + InterceptedCall, + _base_call.StreamUnaryCall, +): + """Used for running a `StreamUnaryCall` wrapped by interceptors. + + For the `__await__` method is it is proxied to the intercepted call only when + the interceptor task is finished. + """ + + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + + # pylint: disable=too-many-arguments + def __init__( + self, + interceptors: Sequence[StreamUnaryClientInterceptor], + request_iterator: Optional[RequestIterableType], + timeout: Optional[float], + metadata: Metadata, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + self._loop = loop + self._channel = channel + request_iterator = self._init_stream_request_mixin(request_iterator) + interceptors_task = loop.create_task( + self._invoke( + interceptors, + method, + timeout, + metadata, + credentials, + wait_for_ready, + request_iterator, + request_serializer, + response_deserializer, + ) + ) + super().__init__(interceptors_task) + + # pylint: disable=too-many-arguments + async def _invoke( + self, + interceptors: Sequence[StreamUnaryClientInterceptor], + method: bytes, + timeout: Optional[float], + metadata: Optional[Metadata], + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + request_iterator: RequestIterableType, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + ) -> StreamUnaryCall: + """Run the RPC call wrapped in interceptors""" + + async def _run_interceptor( + interceptors: Iterator[StreamUnaryClientInterceptor], + client_call_details: ClientCallDetails, + request_iterator: RequestIterableType, + ) -> _base_call.StreamUnaryCall: + if interceptors: + continuation = functools.partial( + _run_interceptor, interceptors[1:] + ) + + return await interceptors[0].intercept_stream_unary( + continuation, client_call_details, request_iterator + ) + else: + return StreamUnaryCall( + request_iterator, + _timeout_to_deadline(client_call_details.timeout), + client_call_details.metadata, + client_call_details.credentials, + client_call_details.wait_for_ready, + self._channel, + client_call_details.method, + request_serializer, + response_deserializer, + self._loop, + ) + + client_call_details = ClientCallDetails( + method, timeout, metadata, credentials, wait_for_ready + ) + return await _run_interceptor( + list(interceptors), client_call_details, request_iterator + ) + + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() + + +class InterceptedStreamStreamCall( + _InterceptedStreamResponseMixin, + _InterceptedStreamRequestMixin, + InterceptedCall, + _base_call.StreamStreamCall, +): + """Used for running a `StreamStreamCall` wrapped by interceptors.""" + + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + _last_returned_call_from_interceptors = Optional[ + _base_call.StreamStreamCall + ] + + # pylint: disable=too-many-arguments + def __init__( + self, + interceptors: Sequence[StreamStreamClientInterceptor], + request_iterator: Optional[RequestIterableType], + timeout: Optional[float], + metadata: Metadata, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + channel: cygrpc.AioChannel, + method: bytes, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop, + ) -> None: + self._loop = loop + self._channel = channel + self._init_stream_response_mixin() + request_iterator = self._init_stream_request_mixin(request_iterator) + self._last_returned_call_from_interceptors = None + interceptors_task = loop.create_task( + self._invoke( + interceptors, + method, + timeout, + metadata, + credentials, + wait_for_ready, + request_iterator, + request_serializer, + response_deserializer, + ) + ) + super().__init__(interceptors_task) + + # pylint: disable=too-many-arguments + async def _invoke( + self, + interceptors: Sequence[StreamStreamClientInterceptor], + method: bytes, + timeout: Optional[float], + metadata: Optional[Metadata], + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + request_iterator: RequestIterableType, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + ) -> StreamStreamCall: + """Run the RPC call wrapped in interceptors""" + + async def _run_interceptor( + interceptors: List[StreamStreamClientInterceptor], + client_call_details: ClientCallDetails, + request_iterator: RequestIterableType, + ) -> _base_call.StreamStreamCall: + if interceptors: + continuation = functools.partial( + _run_interceptor, interceptors[1:] + ) + + call_or_response_iterator = await interceptors[ + 0 + ].intercept_stream_stream( + continuation, client_call_details, request_iterator + ) + + if isinstance( + call_or_response_iterator, _base_call.StreamStreamCall + ): + self._last_returned_call_from_interceptors = ( + call_or_response_iterator + ) + else: + self._last_returned_call_from_interceptors = ( + StreamStreamCallResponseIterator( + self._last_returned_call_from_interceptors, + call_or_response_iterator, + ) + ) + return self._last_returned_call_from_interceptors + else: + self._last_returned_call_from_interceptors = StreamStreamCall( + request_iterator, + _timeout_to_deadline(client_call_details.timeout), + client_call_details.metadata, + client_call_details.credentials, + client_call_details.wait_for_ready, + self._channel, + client_call_details.method, + request_serializer, + response_deserializer, + self._loop, + ) + return self._last_returned_call_from_interceptors + + client_call_details = ClientCallDetails( + method, timeout, metadata, credentials, wait_for_ready + ) + return await _run_interceptor( + list(interceptors), client_call_details, request_iterator + ) + + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() + + +class UnaryUnaryCallResponse(_base_call.UnaryUnaryCall): + """Final UnaryUnaryCall class finished with a response.""" + + _response: ResponseType + + def __init__(self, response: ResponseType) -> None: + self._response = response + + def cancel(self) -> bool: + return False + + def cancelled(self) -> bool: + return False + + def done(self) -> bool: + return True + + def add_done_callback(self, unused_callback) -> None: + raise NotImplementedError() + + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() + + async def initial_metadata(self) -> Optional[Metadata]: + return None + + async def trailing_metadata(self) -> Optional[Metadata]: + return None + + async def code(self) -> grpc.StatusCode: + return grpc.StatusCode.OK + + async def details(self) -> str: + return "" + + async def debug_error_string(self) -> Optional[str]: + return None + + def __await__(self): + if False: # pylint: disable=using-constant-test + # This code path is never used, but a yield statement is needed + # for telling the interpreter that __await__ is a generator. + yield None + return self._response + + async def wait_for_connection(self) -> None: + pass + + +class _StreamCallResponseIterator: + _call: Union[_base_call.UnaryStreamCall, _base_call.StreamStreamCall] + _response_iterator: AsyncIterable[ResponseType] + + def __init__( + self, + call: Union[_base_call.UnaryStreamCall, _base_call.StreamStreamCall], + response_iterator: AsyncIterable[ResponseType], + ) -> None: + self._response_iterator = response_iterator + self._call = call + + def cancel(self) -> bool: + return self._call.cancel() + + def cancelled(self) -> bool: + return self._call.cancelled() + + def done(self) -> bool: + return self._call.done() + + def add_done_callback(self, callback) -> None: + self._call.add_done_callback(callback) + + def time_remaining(self) -> Optional[float]: + return self._call.time_remaining() + + async def initial_metadata(self) -> Optional[Metadata]: + return await self._call.initial_metadata() + + async def trailing_metadata(self) -> Optional[Metadata]: + return await self._call.trailing_metadata() + + async def code(self) -> grpc.StatusCode: + return await self._call.code() + + async def details(self) -> str: + return await self._call.details() + + async def debug_error_string(self) -> Optional[str]: + return await self._call.debug_error_string() + + def __aiter__(self): + return self._response_iterator.__aiter__() + + async def wait_for_connection(self) -> None: + return await self._call.wait_for_connection() + + +class UnaryStreamCallResponseIterator( + _StreamCallResponseIterator, _base_call.UnaryStreamCall +): + """UnaryStreamCall class wich uses an alternative response iterator.""" + + async def read(self) -> Union[EOFType, ResponseType]: + # Behind the scenes everyting goes through the + # async iterator. So this path should not be reached. + raise NotImplementedError() + + +class StreamStreamCallResponseIterator( + _StreamCallResponseIterator, _base_call.StreamStreamCall +): + """StreamStreamCall class wich uses an alternative response iterator.""" + + async def read(self) -> Union[EOFType, ResponseType]: + # Behind the scenes everyting goes through the + # async iterator. So this path should not be reached. + raise NotImplementedError() + + async def write(self, request: RequestType) -> None: + # Behind the scenes everyting goes through the + # async iterator provided by the InterceptedStreamStreamCall. + # So this path should not be reached. + raise NotImplementedError() + + async def done_writing(self) -> None: + # Behind the scenes everyting goes through the + # async iterator provided by the InterceptedStreamStreamCall. + # So this path should not be reached. + raise NotImplementedError() + + @property + def _done_writing_flag(self) -> bool: + return self._call._done_writing_flag diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_metadata.py b/myenv/lib/python3.12/site-packages/grpc/aio/_metadata.py new file mode 100644 index 0000000..6303c17 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_metadata.py @@ -0,0 +1,137 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Implementation of the metadata abstraction for gRPC Asyncio Python.""" +from collections import OrderedDict +from collections import abc +from typing import Any, Iterator, List, Optional, Tuple, Union + +MetadataKey = str +MetadataValue = Union[str, bytes] + + +class Metadata(abc.Collection): + """Metadata abstraction for the asynchronous calls and interceptors. + + The metadata is a mapping from str -> List[str] + + Traits + * Multiple entries are allowed for the same key + * The order of the values by key is preserved + * Getting by an element by key, retrieves the first mapped value + * Supports an immutable view of the data + * Allows partial mutation on the data without recreating the new object from scratch. + """ + + def __init__(self, *args: Tuple[MetadataKey, MetadataValue]) -> None: + self._metadata = OrderedDict() + for md_key, md_value in args: + self.add(md_key, md_value) + + @classmethod + def from_tuple(cls, raw_metadata: tuple): + if raw_metadata: + return cls(*raw_metadata) + return cls() + + def add(self, key: MetadataKey, value: MetadataValue) -> None: + self._metadata.setdefault(key, []) + self._metadata[key].append(value) + + def __len__(self) -> int: + """Return the total number of elements that there are in the metadata, + including multiple values for the same key. + """ + return sum(map(len, self._metadata.values())) + + def __getitem__(self, key: MetadataKey) -> MetadataValue: + """When calling [], the first element of all those + mapped for is returned. + """ + try: + return self._metadata[key][0] + except (ValueError, IndexError) as e: + raise KeyError("{0!r}".format(key)) from e + + def __setitem__(self, key: MetadataKey, value: MetadataValue) -> None: + """Calling metadata[] = + Maps to the first instance of . + """ + if key not in self: + self._metadata[key] = [value] + else: + current_values = self.get_all(key) + self._metadata[key] = [value, *current_values[1:]] + + def __delitem__(self, key: MetadataKey) -> None: + """``del metadata[]`` deletes the first mapping for .""" + current_values = self.get_all(key) + if not current_values: + raise KeyError(repr(key)) + self._metadata[key] = current_values[1:] + + def delete_all(self, key: MetadataKey) -> None: + """Delete all mappings for .""" + del self._metadata[key] + + def __iter__(self) -> Iterator[Tuple[MetadataKey, MetadataValue]]: + for key, values in self._metadata.items(): + for value in values: + yield (key, value) + + def keys(self) -> abc.KeysView: + return abc.KeysView(self) + + def values(self) -> abc.ValuesView: + return abc.ValuesView(self) + + def items(self) -> abc.ItemsView: + return abc.ItemsView(self) + + def get( + self, key: MetadataKey, default: MetadataValue = None + ) -> Optional[MetadataValue]: + try: + return self[key] + except KeyError: + return default + + def get_all(self, key: MetadataKey) -> List[MetadataValue]: + """For compatibility with other Metadata abstraction objects (like in Java), + this would return all items under the desired . + """ + return self._metadata.get(key, []) + + def set_all(self, key: MetadataKey, values: List[MetadataValue]) -> None: + self._metadata[key] = values + + def __contains__(self, key: MetadataKey) -> bool: + return key in self._metadata + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return self._metadata == other._metadata + if isinstance(other, tuple): + return tuple(self) == other + return NotImplemented # pytype: disable=bad-return-type + + def __add__(self, other: Any) -> "Metadata": + if isinstance(other, self.__class__): + return Metadata(*(tuple(self) + tuple(other))) + if isinstance(other, tuple): + return Metadata(*(tuple(self) + other)) + return NotImplemented # pytype: disable=bad-return-type + + def __repr__(self) -> str: + view = tuple(self) + return "{0}({1!r})".format(self.__class__.__name__, view) diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_server.py b/myenv/lib/python3.12/site-packages/grpc/aio/_server.py new file mode 100644 index 0000000..0eee6b1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_server.py @@ -0,0 +1,239 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Server-side implementation of gRPC Asyncio Python.""" + +from concurrent.futures import Executor +from typing import Any, Dict, Optional, Sequence + +import grpc +from grpc import _common +from grpc import _compression +from grpc._cython import cygrpc + +from . import _base_server +from ._interceptor import ServerInterceptor +from ._typing import ChannelArgumentType + + +def _augment_channel_arguments( + base_options: ChannelArgumentType, compression: Optional[grpc.Compression] +): + compression_option = _compression.create_channel_option(compression) + return tuple(base_options) + compression_option + + +class Server(_base_server.Server): + """Serves RPCs.""" + + def __init__( + self, + thread_pool: Optional[Executor], + generic_handlers: Optional[Sequence[grpc.GenericRpcHandler]], + interceptors: Optional[Sequence[Any]], + options: ChannelArgumentType, + maximum_concurrent_rpcs: Optional[int], + compression: Optional[grpc.Compression], + ): + self._loop = cygrpc.get_working_loop() + if interceptors: + invalid_interceptors = [ + interceptor + for interceptor in interceptors + if not isinstance(interceptor, ServerInterceptor) + ] + if invalid_interceptors: + raise ValueError( + "Interceptor must be ServerInterceptor, the " + f"following are invalid: {invalid_interceptors}" + ) + self._server = cygrpc.AioServer( + self._loop, + thread_pool, + generic_handlers, + interceptors, + _augment_channel_arguments(options, compression), + maximum_concurrent_rpcs, + ) + + def add_generic_rpc_handlers( + self, generic_rpc_handlers: Sequence[grpc.GenericRpcHandler] + ) -> None: + """Registers GenericRpcHandlers with this Server. + + This method is only safe to call before the server is started. + + Args: + generic_rpc_handlers: A sequence of GenericRpcHandlers that will be + used to service RPCs. + """ + self._server.add_generic_rpc_handlers(generic_rpc_handlers) + + def add_registered_method_handlers( + self, + service_name: str, + method_handlers: Dict[str, grpc.RpcMethodHandler], + ) -> None: + # TODO(xuanwn): Implement this for AsyncIO. + pass + + def add_insecure_port(self, address: str) -> int: + """Opens an insecure port for accepting RPCs. + + This method may only be called before starting the server. + + Args: + address: The address for which to open a port. If the port is 0, + or not specified in the address, then the gRPC runtime will choose a port. + + Returns: + An integer port on which the server will accept RPC requests. + """ + return _common.validate_port_binding_result( + address, self._server.add_insecure_port(_common.encode(address)) + ) + + def add_secure_port( + self, address: str, server_credentials: grpc.ServerCredentials + ) -> int: + """Opens a secure port for accepting RPCs. + + This method may only be called before starting the server. + + Args: + address: The address for which to open a port. + if the port is 0, or not specified in the address, then the gRPC + runtime will choose a port. + server_credentials: A ServerCredentials object. + + Returns: + An integer port on which the server will accept RPC requests. + """ + return _common.validate_port_binding_result( + address, + self._server.add_secure_port( + _common.encode(address), server_credentials + ), + ) + + async def start(self) -> None: + """Starts this Server. + + This method may only be called once. (i.e. it is not idempotent). + """ + await self._server.start() + + async def stop(self, grace: Optional[float]) -> None: + """Stops this Server. + + This method immediately stops the server from servicing new RPCs in + all cases. + + If a grace period is specified, this method waits until all active + RPCs are finished or until the grace period is reached. RPCs that haven't + been terminated within the grace period are aborted. + If a grace period is not specified (by passing None for grace), all + existing RPCs are aborted immediately and this method blocks until + the last RPC handler terminates. + + This method is idempotent and may be called at any time. Passing a + smaller grace value in a subsequent call will have the effect of + stopping the Server sooner (passing None will have the effect of + stopping the server immediately). Passing a larger grace value in a + subsequent call will not have the effect of stopping the server later + (i.e. the most restrictive grace value is used). + + Args: + grace: A duration of time in seconds or None. + """ + await self._server.shutdown(grace) + + async def wait_for_termination( + self, timeout: Optional[float] = None + ) -> bool: + """Block current coroutine until the server stops. + + This is an EXPERIMENTAL API. + + The wait will not consume computational resources during blocking, and + it will block until one of the two following conditions are met: + + 1) The server is stopped or terminated; + 2) A timeout occurs if timeout is not `None`. + + The timeout argument works in the same way as `threading.Event.wait()`. + https://docs.python.org/3/library/threading.html#threading.Event.wait + + Args: + timeout: A floating point number specifying a timeout for the + operation in seconds. + + Returns: + A bool indicates if the operation times out. + """ + return await self._server.wait_for_termination(timeout) + + def __del__(self): + """Schedules a graceful shutdown in current event loop. + + The Cython AioServer doesn't hold a ref-count to this class. It should + be safe to slightly extend the underlying Cython object's life span. + """ + if hasattr(self, "_server"): + if self._server.is_running(): + cygrpc.schedule_coro_threadsafe( + self._server.shutdown(None), + self._loop, + ) + + +def server( + migration_thread_pool: Optional[Executor] = None, + handlers: Optional[Sequence[grpc.GenericRpcHandler]] = None, + interceptors: Optional[Sequence[Any]] = None, + options: Optional[ChannelArgumentType] = None, + maximum_concurrent_rpcs: Optional[int] = None, + compression: Optional[grpc.Compression] = None, +): + """Creates a Server with which RPCs can be serviced. + + Args: + migration_thread_pool: A futures.ThreadPoolExecutor to be used by the + Server to execute non-AsyncIO RPC handlers for migration purpose. + handlers: An optional list of GenericRpcHandlers used for executing RPCs. + More handlers may be added by calling add_generic_rpc_handlers any time + before the server is started. + interceptors: An optional list of ServerInterceptor objects that observe + and optionally manipulate the incoming RPCs before handing them over to + handlers. The interceptors are given control in the order they are + specified. This is an EXPERIMENTAL API. + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC runtime) + to configure the channel. + maximum_concurrent_rpcs: The maximum number of concurrent RPCs this server + will service before returning RESOURCE_EXHAUSTED status, or None to + indicate no limit. + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. This compression algorithm will be used for the + lifetime of the server unless overridden by set_compression. + + Returns: + A Server object. + """ + return Server( + migration_thread_pool, + () if handlers is None else handlers, + () if interceptors is None else interceptors, + () if options is None else options, + maximum_concurrent_rpcs, + compression, + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_typing.py b/myenv/lib/python3.12/site-packages/grpc/aio/_typing.py new file mode 100644 index 0000000..0bc32b2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_typing.py @@ -0,0 +1,43 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Common types for gRPC Async API""" + +from typing import ( + Any, + AsyncIterable, + Callable, + Iterable, + Sequence, + Tuple, + TypeVar, + Union, +) + +from grpc._cython.cygrpc import EOF + +from ._metadata import Metadata +from ._metadata import MetadataKey +from ._metadata import MetadataValue + +RequestType = TypeVar("RequestType") +ResponseType = TypeVar("ResponseType") +SerializingFunction = Callable[[Any], bytes] +DeserializingFunction = Callable[[bytes], Any] +MetadatumType = Tuple[MetadataKey, MetadataValue] +MetadataType = Union[Metadata, Sequence[MetadatumType]] +ChannelArgumentType = Sequence[Tuple[str, Any]] +EOFType = type(EOF) +DoneCallbackType = Callable[[Any], None] +RequestIterableType = Union[Iterable[Any], AsyncIterable[Any]] +ResponseIterableType = AsyncIterable[Any] diff --git a/myenv/lib/python3.12/site-packages/grpc/aio/_utils.py b/myenv/lib/python3.12/site-packages/grpc/aio/_utils.py new file mode 100644 index 0000000..e5772dc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/aio/_utils.py @@ -0,0 +1,22 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Internal utilities used by the gRPC Aio module.""" +import time +from typing import Optional + + +def _timeout_to_deadline(timeout: Optional[float]) -> Optional[float]: + if timeout is None: + return None + return time.time() + timeout diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/__init__.py b/myenv/lib/python3.12/site-packages/grpc/beta/__init__.py new file mode 100644 index 0000000..5fb4f3c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/beta/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..710927a639c4b5d8a30ebc22fc33b1cf0b9b9540 GIT binary patch literal 200 zcmZ9FO$x#=6oeD2AVTlp)`fkjTM-Jyr90h*wmxEP^FtDaoWwJD3-=zw6G(SmnQk2z zm>E8pcbd*f)JvXtJ|g5Zlz(;OxI9Q83wn4G8!^%iOwU0o4>cSeS_gadsOE(gX8{Ge z#%lw{>MQzOIZ?F;GN8IcD=IL-U$oj}t2H>`acRoBDLFde*3?j;FM%p`UK0 VKHpm0*-8AR(QXLegi>mgn0~b3HX8r{ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_client_adaptations.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_client_adaptations.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e47969b09db300fd15459a7cc9b857f5176e0112 GIT binary patch literal 28305 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

      r+@ zXF#1~pTA^*9ZY#uYYBJAK z!a9osAes?iTN`&aU|YM^Ac!cR#Mz4G#1&@U!+3fMuslDudJG>&R*&H0=<3me(_3&h z7Mz<4P9Fs2oxQxXmj;5rn|F58z&_sDS8R5A?AIBmO*&wzkSvsdWJ8At8+99o=++F7 zv`8!s5Uyow56~sE?f^Xl3F)zGIyU0eKt{2&rRvlW4-3D9V{!yAaZ{ob$3TBXHZUBG z4jc}LJRG`wstHO`565MAM|YN`wrM!8?wv@c56{id#^&I&A?Y-q%p1^XfM%{p48Ct7 z;uczoNNFEnsUm$!HUo3)amZ+?y=p(u_%9)Uz} zFtmpA-@q^|mf#MD_5l0mFpL81=pekIjl0f#;CesP&{Sw>F0}fKE}z+69CVuPVqmL( z-EET%)R;B`|B6$jOD_azrAyQ-$`vY4@Q^#m7LX?vp;c`ENxC%uaS$lv^H6>A>j0`S z_0Fm_R=E0Cp-;)Hn2!g*MC2!c1E8UzHU}UVvCpuns=1CtxKy*pL>ByK>gf)1`u}#i zli$SFei_@Nowsx{$=pkaYKQ2weG3WTcQ6wq0P-4uOP1=hRBwXfwi!Y273>=P3`v@x z#en{VL|pv|xd&pj6S7?01I4eJ!q*xSTlr(7@oiv&R;#fxLBFk;pcd#M+5NxOqR?nk zdy2|h6kX>WLiE~N6p^NHjs6s;@4q08mNY2Pi>giFN(~BU`%k_Gg~o&0gClEDn!%yk zgNCajQ(6jCotQ(S3S|a~oH_=mpgUL?4=Sh|Q=;@nM59EhCkzUHs?**;iK1K;*dSHp ze+&C#7D0&)X;U$0QBe}LMdXdZZ>y3Z<+qJc2U$(>l&eYP3KoJKnEWmR)NMtsO!xZ# z5ML2|3rYA6@Kn)*t`9K}uoG<2SO@CR0P0Af4!Jm49l|X1xo{3Q?QXRI$PT zFEpaA>Qz=aZU>CePnb%ChMw9}n*0f%=&D4uyG&%Na7~7K{$~b*Nm)4#}5N#$SNveNcw=JyQm^ValjZ7uF1S83zrVY|^Ws zi%&yjY06)+-GDA|$W$bOCpi?75GkTTR6^B9VnB^k(?cb~GExKb4QdU)Wz^86NKShQDO2aYS9&`11x}Qve3nOZ;KTSyrmmYDWE69<1NyrOvzETXRMpC*BTwt8C96zdYA<7(74bpn zJ=yBjRBrW(yyupXcc9&RW89!FUmD?Zg{~4|57dx+8#1IT{<1~a&2=xQ)kmxLEDCg4 z6_qqmv0i2DN3Y^)gi%%3`ZQguRvB)p7390vwUrh0mQ_&d+HwY|gE5JH`+cQv;Z1Q^ z1ily1{`5YUEqI#1q~xl2Hn5;IZD`q2Z6RyAj0PrfRhKKc`>a~7NG6A~82U*Bc=n2Z zp`x`X;1>f+EoJj+q4d?wN1@lGD^%e2lv}hI?bmQ4wlMckS*wkKNZ+M(|SiiH|QpkKJ+}HE=T&4?AUwLq85-5ji%B z8i{3#HvK^eRDXAG3x)9X6y7$|RMtWz{40V30Cwy9-b8}H0X5Y#gVZm>BW&+)3O-+`%q31H(l}jY9Fmi&^R$MLH7}Z zKHZZXe~XoV3&A%K{2hX~5&S)ZZz1>&g6|>tCj=;q2=X`a+&d0D`4xueDb%Kc+sBfMl?wWlMBG7-r?T`hV<%hN$6e644Am@u5oa&lhhWt zxcx?Tz|BLAt5FB91{Gd!K^=URxz?zI@&$P*)h(z)ODQ+mSECM_WSr9T#&t;hW$Y-M zVV8g+WLi1P!ZmG618VXOBu~%475{-p!>K?b83?D-Bz}4!9Sd~!q&ho-Zt`D{nYa~& zq$M~;mFcu7I3AoBIq{JYh2%$wNVy}P2N#@T+{sfX#z&4(hABA37YQFV4#6b_NodGT zg}M>B67=>>_~;(Dy95)~O=u85epk)v#j?8=;ZkIn({STY8s$}sx~VWzm6)qIS=S(2 zNdvuu_urBC@8bQt#P7pl?mGOhZpwGu$#>kD?-=9Z&oKr!cILf3ytgOs-OhWrU+MnZ z*4MVap3Zs4vd*!BYs;(q^IiM+u6_Bg`*`?s-KR>hgZJ*Zvg>R6U)z7xl=F^fo#XE> z!To&K{k-dbRS7$J@6Ib@Upw;Jk*mI(_fXb(=z9%;g6F{NY2GthG#b3{DZ9Z{C(3A< zc|#X4H>D0xVF!vpISZ5&gujJu-KZi!{uPQA1tt!JhS8!ltzfjGoPP@o`43EtOl2ad zf0CMmR#g|w|B1;F{2>woo`FKaY=p}_>@IWNT6?+ZL&UOue4Gl9kfC4wtB;^(@Oo_{ zeDW-bHhC?~Qt=79?4N*Cg6YvDsD-#sN&Xta-vH1op#*1{WO6}k{tl~(a~qC^)iKT% z{BD@rT;Mhpxb~vva(MM7m||Gi1!>ilEnP1F)y6MHEONDRk6iWPeghnJZy;TE8 zfuKq#G}6Fn0{6y0ktB}|iN6d(C{JtE#7!p`67W+oaC<#HiZ8Tl;!8gtGlV}8Lw{+2 z%+R7oMcYC|)RReQ@H)#N^LR2z4jMk4>H$SANLCaUwRC zOvgm5`mynmv7?74#zW%|jgF6xjgJY|@rRBdJ^>#0_>=Q-xRxC%DI&WboH%^!_|frW z;}fT#_{~_d{V3joN#n&IMsQ=L=;aDs=<7$M#{1xRc1k}EApIx+y@E@y9HO@-3#L){ zEJwVaWEB&B8UfvMq+3#S_W`ZWLUWaGr|4G;LJN&OS^3!jJu@w|h%uFimg!kPp;e65 zOa3O7?NDu3(di~QR7^^wUYth+sZOJ*!_A`N4+-2&f)ERTOzO`8!sQ+;`>&fB_5t?0 zjN=`qmvZ|czC#L&k1)Xl;URVeeVn)54CjYkM>S z>wE5IyI)M_x9sP)>|bZ#W&K`5Kihr5ln)%_0|(a`cv=52dyhH@Ue?D9K?w5YJMQ5- v?pbHxW&I)cF*Dov{I0yWi}!Y|Gx)atu%lHS1}|%OI$2Axy@3^fCgpzs#s^UP literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_metadata.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e8e54dea65756cb9bb0c1f70a4be2cc9f3f90e4 GIT binary patch literal 2009 zcmcgtO-vg{6rR~1+Zc?^e{iT|0#qy^-u#FPH3%sRt!PW!sEDX?TUlmzfCYPP?W}2x zjAT_g1gQrqRfR(jKJ?&}R3fJmsZuyb>IGsX(24_9dT4Hdb7-PU^vxPOAT{ctQAe6@ z#`9+1d;5Lwt$+1++z7^c{MO`z1EHtvM|lXxn_>tyOGrgwq+*qe;V|Y9!P8}X`97>F zuL>(%=^)Ij;vEzgR0p7_IsqN33(%S7q^h}d*KU3gh!ZoaM$KqIN$9i0pjtu?q)aWQ znHr(NXUtK^az}2IuBGAC{;8~5-hhy zHJzGKT_Kh@o;C@!97I;V`rr{uV9%8EQj zfmZo_ViG+tWN4};4-qJ=p>=?q>)r)7E6wlbqglbmN#O@KR!yujatazEKK?yKo;#b2XYNRq;gYR&GG_W z9sN1{AiVA@^bKc+cm18YvHN5B;VpmPH%)7Oj|LtNJa!hY-pqcuTivucm2(%W&u<9l zi{J?Tv)aFa<^NNgx-y)~smKqNKGO|S@EJVM>vjJ@e<5TEDRZL#*@Q|15z}>K|4(PDL_ezGxx9O-`Q%uywJVo zdgOiRee5Xof1JI(>#SSs`JOIMY&pB~4f#*cYOW@anI-9_O);N+H-Fg ze9~Q!siQ3S6{_1egm%LV&Xr2P!4H<2-HW}jS%MDC;xvBMNh)^-&W6wmSlK9d8*~F7 zx_8AuETKeWbTC*k1mQkq_5BC>GmD-yjywpj zj;?im8_A94ySAGyZZ?j*C^81VYCQ{aEzwLRV?@H1tK2n|aa9Uv2`q{cfP)^Gv<)DO zcAVY~XUmSa?ssn^xLfbvY8)weM>bp|Z~;4&7hx?T-sj#&e3jc~UvgQ_NJLF2 zk%(2TBw{h5nDD(x6V+DR{#@JTW>aA6Ysa%0x80QL%{35DsHqqkG~jCj)eYGU z0POP^VT}WyJFFM*4P2~s I;!=`-1DRs3+W-In literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_server_adaptations.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/_server_adaptations.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..872946549eb05ea99344fad20b7d31b335f64829 GIT binary patch literal 18980 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 aEZe}=uguCdol;Hb76Uh%`x{sli2n=6dleS| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/implementations.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/implementations.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..486f05c6191650329ecbfc44ae5387453a76987f GIT binary patch literal 12184 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/interfaces.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/interfaces.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6583f352e698c64986facf97a3e112afe7c82a75 GIT binary patch literal 7306 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/utilities.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/beta/__pycache__/utilities.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2892b8aa51b0d086df9aa9c18f380d7be46f36c1 GIT binary patch literal 7144 zcmcH;TWl29_0G?P^LSq8{!ImXfTt7@G;sV|!N_;JEBL`GRv6pZbTjjd=hIc_O61qhxk6}x8yTE?n-#t^J zD3T#r+tr=cxFo#Q>#S`_&qSx(C`Vyf9M@o`o2j2lb!fskEp#6`_G&df<5n3_u#Q#^>IG_4>TStv5t zb)waAlgV`K!hEZxoa$p;Fi-g$z*PcL`H}CI{r>oa^GoON{rdAGxdQ{&nS!_R1MWTU zDQR#GQiW~X3r)?7uik$3aVwi|4d+_Jk6L?|1HFY8b}YVi`>jHtb)z09uIkfQ8%WEp zn+t`O;3vM1efgH|Tub-YEj>>4jy?DWIq}Ecq|`0m8%v^Z~EA^Noa!fawB_j#DBiCz60)?Qa zz)XM5Bj}bz4#qbRlLRuorj!*(eW5r6tG5^1<+`~00vH!C=Jmx9$x@9stM(P!AbD#S zs-C)|xHi#RY?bRQtpc+$xJ4DMcQro=v@DL@9xDXcKl~!! zF_7yR$alP+ga5$mPuPx|_7A-Ue_+vj%bWLya{kcWjtAXK-7Eeh_|$jHm-p|>`S-2( zyC3iAyrbs3UdeU6@@UWTn+=7o{WtAj`#YZaw{JAVdsYd8ZKQGUMiaJL$&1}P6BsDD zym$UPjWsl{WX?h2t+dt!Z>lLU)54V%bwjrhH7l@dRJucYCy`+v~u1&9|x^GdGP zQuAyUnn#(MXH!cSz$(ZF2U^nmO`1n-sd@D1_{osRP(5@@hSx&PlG_lVsLCA(_97@L zk=%)0bTA>>a9SaJun&NO;Y`_08R4F_n=-~maM4`=71Hi>?LueNf4jfX)(MjB`yVB{ zIk?dXd#(}$9+Ye^wgNvS*{dkot8U^CZ0s(sH^n>BJ8+2p`ypoF_!i>*8#od~be86P zYljpA6I~rwo!ewMi!sO&H5#&&?dB4tvqC{-Gou7oDcYXjWo2+m!-%YcJg#5@ zf?Ka{(9qr>0M-yZQ&5g?c-raTGu>O9{vDX{{HOPj%arWZRnZO`)D#cI&Oe?yat|zD zqRaF#+y;j2l_YY=a}vf^))v_uoWwmOTuU80I2&EXYiu;6Qw zF~0gq(3FqBPV!LzRoJ;oVTiS!mWCxoOWhz_DR?osaX1pB zzX&psy<1rJ4`I^t^Ddia9iSgmh5%e6YqmP3ZO!jz2C21dZ2T6e zES11{HKly}$x`Pa0mgTNwniZttU@-QH}mN|M$(!^H*o>NEB4Y1WNmqgt;yr}nAdzZ zuCSO-&h)t5nB|HZIWt^|9|vR+^2d@W)a)*#;gxXNXH`fk8($IP7ez_mVXGIZX_lYl zB?wrpP0~C z1pVw~M61#4QuJL+<70e^04(&69*FK%H0e^RzEqf$iOAE+F?~apH528>*vOWfn5)j} z1S~C#RAUIZ@JIqo(klk5%Geb-G{aZpW8%QF>ZdN93di0!4k3Jh5qAupB0no<$ zp61cn&KaL!s@!D2JRVm$Lmq=g*WstI0IrhnUL=98JC`0cg|Chj?Ebucd(OUn#okh= zZ(g=H>(U?cLTU*7ZH(h&%mBzO05lhV1L(nT05S@>Y{!Q?^oLV2X#Sjr;=W)YooRG(%ivfl58h}-rqNt}qLiK!0 z{Qo5N-`5eU^Bcl`Lk@jIx>xH6)4xg+YVUXMX^J}fQRgQIK0fdr!S?z%-AJ|QZ}>NV CK)IU$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/_client_adaptations.py b/myenv/lib/python3.12/site-packages/grpc/beta/_client_adaptations.py new file mode 100644 index 0000000..0121492 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/beta/_client_adaptations.py @@ -0,0 +1,1015 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Translates gRPC's client-side API into gRPC's client-side Beta API.""" + +import grpc +from grpc import _common +from grpc.beta import _metadata +from grpc.beta import interfaces +from grpc.framework.common import cardinality +from grpc.framework.foundation import future +from grpc.framework.interfaces.face import face + +# pylint: disable=too-many-arguments,too-many-locals,unused-argument + +_STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS = { + grpc.StatusCode.CANCELLED: ( + face.Abortion.Kind.CANCELLED, + face.CancellationError, + ), + grpc.StatusCode.UNKNOWN: ( + face.Abortion.Kind.REMOTE_FAILURE, + face.RemoteError, + ), + grpc.StatusCode.DEADLINE_EXCEEDED: ( + face.Abortion.Kind.EXPIRED, + face.ExpirationError, + ), + grpc.StatusCode.UNIMPLEMENTED: ( + face.Abortion.Kind.LOCAL_FAILURE, + face.LocalError, + ), +} + + +def _effective_metadata(metadata, metadata_transformer): + non_none_metadata = () if metadata is None else metadata + if metadata_transformer is None: + return non_none_metadata + else: + return metadata_transformer(non_none_metadata) + + +def _credentials(grpc_call_options): + return None if grpc_call_options is None else grpc_call_options.credentials + + +def _abortion(rpc_error_call): + code = rpc_error_call.code() + pair = _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS.get(code) + error_kind = face.Abortion.Kind.LOCAL_FAILURE if pair is None else pair[0] + return face.Abortion( + error_kind, + rpc_error_call.initial_metadata(), + rpc_error_call.trailing_metadata(), + code, + rpc_error_call.details(), + ) + + +def _abortion_error(rpc_error_call): + code = rpc_error_call.code() + pair = _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS.get(code) + exception_class = face.AbortionError if pair is None else pair[1] + return exception_class( + rpc_error_call.initial_metadata(), + rpc_error_call.trailing_metadata(), + code, + rpc_error_call.details(), + ) + + +class _InvocationProtocolContext(interfaces.GRPCInvocationContext): + def disable_next_request_compression(self): + pass # TODO(https://github.com/grpc/grpc/issues/4078): design, implement. + + +class _Rendezvous(future.Future, face.Call): + def __init__(self, response_future, response_iterator, call): + self._future = response_future + self._iterator = response_iterator + self._call = call + + def cancel(self): + return self._call.cancel() + + def cancelled(self): + return self._future.cancelled() + + def running(self): + return self._future.running() + + def done(self): + return self._future.done() + + def result(self, timeout=None): + try: + return self._future.result(timeout=timeout) + except grpc.RpcError as rpc_error_call: + raise _abortion_error(rpc_error_call) + except grpc.FutureTimeoutError: + raise future.TimeoutError() + except grpc.FutureCancelledError: + raise future.CancelledError() + + def exception(self, timeout=None): + try: + rpc_error_call = self._future.exception(timeout=timeout) + if rpc_error_call is None: + return None + else: + return _abortion_error(rpc_error_call) + except grpc.FutureTimeoutError: + raise future.TimeoutError() + except grpc.FutureCancelledError: + raise future.CancelledError() + + def traceback(self, timeout=None): + try: + return self._future.traceback(timeout=timeout) + except grpc.FutureTimeoutError: + raise future.TimeoutError() + except grpc.FutureCancelledError: + raise future.CancelledError() + + def add_done_callback(self, fn): + self._future.add_done_callback(lambda ignored_callback: fn(self)) + + def __iter__(self): + return self + + def _next(self): + try: + return next(self._iterator) + except grpc.RpcError as rpc_error_call: + raise _abortion_error(rpc_error_call) + + def __next__(self): + return self._next() + + def next(self): + return self._next() + + def is_active(self): + return self._call.is_active() + + def time_remaining(self): + return self._call.time_remaining() + + def add_abortion_callback(self, abortion_callback): + def done_callback(): + if self.code() is not grpc.StatusCode.OK: + abortion_callback(_abortion(self._call)) + + registered = self._call.add_callback(done_callback) + return None if registered else done_callback() + + def protocol_context(self): + return _InvocationProtocolContext() + + def initial_metadata(self): + return _metadata.beta(self._call.initial_metadata()) + + def terminal_metadata(self): + return _metadata.beta(self._call.terminal_metadata()) + + def code(self): + return self._call.code() + + def details(self): + return self._call.details() + + +def _blocking_unary_unary( + channel, + group, + method, + timeout, + with_call, + protocol_options, + metadata, + metadata_transformer, + request, + request_serializer, + response_deserializer, +): + try: + multi_callable = channel.unary_unary( + _common.fully_qualified_method(group, method), + request_serializer=request_serializer, + response_deserializer=response_deserializer, + ) + effective_metadata = _effective_metadata(metadata, metadata_transformer) + if with_call: + response, call = multi_callable.with_call( + request, + timeout=timeout, + metadata=_metadata.unbeta(effective_metadata), + credentials=_credentials(protocol_options), + ) + return response, _Rendezvous(None, None, call) + else: + return multi_callable( + request, + timeout=timeout, + metadata=_metadata.unbeta(effective_metadata), + credentials=_credentials(protocol_options), + ) + except grpc.RpcError as rpc_error_call: + raise _abortion_error(rpc_error_call) + + +def _future_unary_unary( + channel, + group, + method, + timeout, + protocol_options, + metadata, + metadata_transformer, + request, + request_serializer, + response_deserializer, +): + multi_callable = channel.unary_unary( + _common.fully_qualified_method(group, method), + request_serializer=request_serializer, + response_deserializer=response_deserializer, + ) + effective_metadata = _effective_metadata(metadata, metadata_transformer) + response_future = multi_callable.future( + request, + timeout=timeout, + metadata=_metadata.unbeta(effective_metadata), + credentials=_credentials(protocol_options), + ) + return _Rendezvous(response_future, None, response_future) + + +def _unary_stream( + channel, + group, + method, + timeout, + protocol_options, + metadata, + metadata_transformer, + request, + request_serializer, + response_deserializer, +): + multi_callable = channel.unary_stream( + _common.fully_qualified_method(group, method), + request_serializer=request_serializer, + response_deserializer=response_deserializer, + ) + effective_metadata = _effective_metadata(metadata, metadata_transformer) + response_iterator = multi_callable( + request, + timeout=timeout, + metadata=_metadata.unbeta(effective_metadata), + credentials=_credentials(protocol_options), + ) + return _Rendezvous(None, response_iterator, response_iterator) + + +def _blocking_stream_unary( + channel, + group, + method, + timeout, + with_call, + protocol_options, + metadata, + metadata_transformer, + request_iterator, + request_serializer, + response_deserializer, +): + try: + multi_callable = channel.stream_unary( + _common.fully_qualified_method(group, method), + request_serializer=request_serializer, + response_deserializer=response_deserializer, + ) + effective_metadata = _effective_metadata(metadata, metadata_transformer) + if with_call: + response, call = multi_callable.with_call( + request_iterator, + timeout=timeout, + metadata=_metadata.unbeta(effective_metadata), + credentials=_credentials(protocol_options), + ) + return response, _Rendezvous(None, None, call) + else: + return multi_callable( + request_iterator, + timeout=timeout, + metadata=_metadata.unbeta(effective_metadata), + credentials=_credentials(protocol_options), + ) + except grpc.RpcError as rpc_error_call: + raise _abortion_error(rpc_error_call) + + +def _future_stream_unary( + channel, + group, + method, + timeout, + protocol_options, + metadata, + metadata_transformer, + request_iterator, + request_serializer, + response_deserializer, +): + multi_callable = channel.stream_unary( + _common.fully_qualified_method(group, method), + request_serializer=request_serializer, + response_deserializer=response_deserializer, + ) + effective_metadata = _effective_metadata(metadata, metadata_transformer) + response_future = multi_callable.future( + request_iterator, + timeout=timeout, + metadata=_metadata.unbeta(effective_metadata), + credentials=_credentials(protocol_options), + ) + return _Rendezvous(response_future, None, response_future) + + +def _stream_stream( + channel, + group, + method, + timeout, + protocol_options, + metadata, + metadata_transformer, + request_iterator, + request_serializer, + response_deserializer, +): + multi_callable = channel.stream_stream( + _common.fully_qualified_method(group, method), + request_serializer=request_serializer, + response_deserializer=response_deserializer, + ) + effective_metadata = _effective_metadata(metadata, metadata_transformer) + response_iterator = multi_callable( + request_iterator, + timeout=timeout, + metadata=_metadata.unbeta(effective_metadata), + credentials=_credentials(protocol_options), + ) + return _Rendezvous(None, response_iterator, response_iterator) + + +class _UnaryUnaryMultiCallable(face.UnaryUnaryMultiCallable): + def __init__( + self, + channel, + group, + method, + metadata_transformer, + request_serializer, + response_deserializer, + ): + self._channel = channel + self._group = group + self._method = method + self._metadata_transformer = metadata_transformer + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + + def __call__( + self, + request, + timeout, + metadata=None, + with_call=False, + protocol_options=None, + ): + return _blocking_unary_unary( + self._channel, + self._group, + self._method, + timeout, + with_call, + protocol_options, + metadata, + self._metadata_transformer, + request, + self._request_serializer, + self._response_deserializer, + ) + + def future(self, request, timeout, metadata=None, protocol_options=None): + return _future_unary_unary( + self._channel, + self._group, + self._method, + timeout, + protocol_options, + metadata, + self._metadata_transformer, + request, + self._request_serializer, + self._response_deserializer, + ) + + def event( + self, + request, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + raise NotImplementedError() + + +class _UnaryStreamMultiCallable(face.UnaryStreamMultiCallable): + def __init__( + self, + channel, + group, + method, + metadata_transformer, + request_serializer, + response_deserializer, + ): + self._channel = channel + self._group = group + self._method = method + self._metadata_transformer = metadata_transformer + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + + def __call__(self, request, timeout, metadata=None, protocol_options=None): + return _unary_stream( + self._channel, + self._group, + self._method, + timeout, + protocol_options, + metadata, + self._metadata_transformer, + request, + self._request_serializer, + self._response_deserializer, + ) + + def event( + self, + request, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + raise NotImplementedError() + + +class _StreamUnaryMultiCallable(face.StreamUnaryMultiCallable): + def __init__( + self, + channel, + group, + method, + metadata_transformer, + request_serializer, + response_deserializer, + ): + self._channel = channel + self._group = group + self._method = method + self._metadata_transformer = metadata_transformer + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + + def __call__( + self, + request_iterator, + timeout, + metadata=None, + with_call=False, + protocol_options=None, + ): + return _blocking_stream_unary( + self._channel, + self._group, + self._method, + timeout, + with_call, + protocol_options, + metadata, + self._metadata_transformer, + request_iterator, + self._request_serializer, + self._response_deserializer, + ) + + def future( + self, request_iterator, timeout, metadata=None, protocol_options=None + ): + return _future_stream_unary( + self._channel, + self._group, + self._method, + timeout, + protocol_options, + metadata, + self._metadata_transformer, + request_iterator, + self._request_serializer, + self._response_deserializer, + ) + + def event( + self, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + raise NotImplementedError() + + +class _StreamStreamMultiCallable(face.StreamStreamMultiCallable): + def __init__( + self, + channel, + group, + method, + metadata_transformer, + request_serializer, + response_deserializer, + ): + self._channel = channel + self._group = group + self._method = method + self._metadata_transformer = metadata_transformer + self._request_serializer = request_serializer + self._response_deserializer = response_deserializer + + def __call__( + self, request_iterator, timeout, metadata=None, protocol_options=None + ): + return _stream_stream( + self._channel, + self._group, + self._method, + timeout, + protocol_options, + metadata, + self._metadata_transformer, + request_iterator, + self._request_serializer, + self._response_deserializer, + ) + + def event( + self, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + raise NotImplementedError() + + +class _GenericStub(face.GenericStub): + def __init__( + self, + channel, + metadata_transformer, + request_serializers, + response_deserializers, + ): + self._channel = channel + self._metadata_transformer = metadata_transformer + self._request_serializers = request_serializers or {} + self._response_deserializers = response_deserializers or {} + + def blocking_unary_unary( + self, + group, + method, + request, + timeout, + metadata=None, + with_call=None, + protocol_options=None, + ): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _blocking_unary_unary( + self._channel, + group, + method, + timeout, + with_call, + protocol_options, + metadata, + self._metadata_transformer, + request, + request_serializer, + response_deserializer, + ) + + def future_unary_unary( + self, + group, + method, + request, + timeout, + metadata=None, + protocol_options=None, + ): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _future_unary_unary( + self._channel, + group, + method, + timeout, + protocol_options, + metadata, + self._metadata_transformer, + request, + request_serializer, + response_deserializer, + ) + + def inline_unary_stream( + self, + group, + method, + request, + timeout, + metadata=None, + protocol_options=None, + ): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _unary_stream( + self._channel, + group, + method, + timeout, + protocol_options, + metadata, + self._metadata_transformer, + request, + request_serializer, + response_deserializer, + ) + + def blocking_stream_unary( + self, + group, + method, + request_iterator, + timeout, + metadata=None, + with_call=None, + protocol_options=None, + ): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _blocking_stream_unary( + self._channel, + group, + method, + timeout, + with_call, + protocol_options, + metadata, + self._metadata_transformer, + request_iterator, + request_serializer, + response_deserializer, + ) + + def future_stream_unary( + self, + group, + method, + request_iterator, + timeout, + metadata=None, + protocol_options=None, + ): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _future_stream_unary( + self._channel, + group, + method, + timeout, + protocol_options, + metadata, + self._metadata_transformer, + request_iterator, + request_serializer, + response_deserializer, + ) + + def inline_stream_stream( + self, + group, + method, + request_iterator, + timeout, + metadata=None, + protocol_options=None, + ): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _stream_stream( + self._channel, + group, + method, + timeout, + protocol_options, + metadata, + self._metadata_transformer, + request_iterator, + request_serializer, + response_deserializer, + ) + + def event_unary_unary( + self, + group, + method, + request, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + raise NotImplementedError() + + def event_unary_stream( + self, + group, + method, + request, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + raise NotImplementedError() + + def event_stream_unary( + self, + group, + method, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + raise NotImplementedError() + + def event_stream_stream( + self, + group, + method, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + raise NotImplementedError() + + def unary_unary(self, group, method): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _UnaryUnaryMultiCallable( + self._channel, + group, + method, + self._metadata_transformer, + request_serializer, + response_deserializer, + ) + + def unary_stream(self, group, method): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _UnaryStreamMultiCallable( + self._channel, + group, + method, + self._metadata_transformer, + request_serializer, + response_deserializer, + ) + + def stream_unary(self, group, method): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _StreamUnaryMultiCallable( + self._channel, + group, + method, + self._metadata_transformer, + request_serializer, + response_deserializer, + ) + + def stream_stream(self, group, method): + request_serializer = self._request_serializers.get( + ( + group, + method, + ) + ) + response_deserializer = self._response_deserializers.get( + ( + group, + method, + ) + ) + return _StreamStreamMultiCallable( + self._channel, + group, + method, + self._metadata_transformer, + request_serializer, + response_deserializer, + ) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + return False + + +class _DynamicStub(face.DynamicStub): + def __init__(self, backing_generic_stub, group, cardinalities): + self._generic_stub = backing_generic_stub + self._group = group + self._cardinalities = cardinalities + + def __getattr__(self, attr): + method_cardinality = self._cardinalities.get(attr) + if method_cardinality is cardinality.Cardinality.UNARY_UNARY: + return self._generic_stub.unary_unary(self._group, attr) + elif method_cardinality is cardinality.Cardinality.UNARY_STREAM: + return self._generic_stub.unary_stream(self._group, attr) + elif method_cardinality is cardinality.Cardinality.STREAM_UNARY: + return self._generic_stub.stream_unary(self._group, attr) + elif method_cardinality is cardinality.Cardinality.STREAM_STREAM: + return self._generic_stub.stream_stream(self._group, attr) + else: + raise AttributeError( + '_DynamicStub object has no attribute "%s"!' % attr + ) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + return False + + +def generic_stub( + channel, + host, + metadata_transformer, + request_serializers, + response_deserializers, +): + return _GenericStub( + channel, + metadata_transformer, + request_serializers, + response_deserializers, + ) + + +def dynamic_stub( + channel, + service, + cardinalities, + host, + metadata_transformer, + request_serializers, + response_deserializers, +): + return _DynamicStub( + _GenericStub( + channel, + metadata_transformer, + request_serializers, + response_deserializers, + ), + service, + cardinalities, + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/_metadata.py b/myenv/lib/python3.12/site-packages/grpc/beta/_metadata.py new file mode 100644 index 0000000..3010108 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/beta/_metadata.py @@ -0,0 +1,56 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""API metadata conversion utilities.""" + +import collections + +_Metadatum = collections.namedtuple( + "_Metadatum", + ( + "key", + "value", + ), +) + + +def _beta_metadatum(key, value): + beta_key = key if isinstance(key, (bytes,)) else key.encode("ascii") + beta_value = value if isinstance(value, (bytes,)) else value.encode("ascii") + return _Metadatum(beta_key, beta_value) + + +def _metadatum(beta_key, beta_value): + key = beta_key if isinstance(beta_key, (str,)) else beta_key.decode("utf8") + if isinstance(beta_value, (str,)) or key[-4:] == "-bin": + value = beta_value + else: + value = beta_value.decode("utf8") + return _Metadatum(key, value) + + +def beta(metadata): + if metadata is None: + return () + else: + return tuple(_beta_metadatum(key, value) for key, value in metadata) + + +def unbeta(beta_metadata): + if beta_metadata is None: + return () + else: + return tuple( + _metadatum(beta_key, beta_value) + for beta_key, beta_value in beta_metadata + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/_server_adaptations.py b/myenv/lib/python3.12/site-packages/grpc/beta/_server_adaptations.py new file mode 100644 index 0000000..a6f730b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/beta/_server_adaptations.py @@ -0,0 +1,465 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Translates gRPC's server-side API into gRPC's server-side Beta API.""" + +import collections +import threading + +import grpc +from grpc import _common +from grpc.beta import _metadata +from grpc.beta import interfaces +from grpc.framework.common import cardinality +from grpc.framework.common import style +from grpc.framework.foundation import abandonment +from grpc.framework.foundation import logging_pool +from grpc.framework.foundation import stream +from grpc.framework.interfaces.face import face + +# pylint: disable=too-many-return-statements + +_DEFAULT_POOL_SIZE = 8 + + +class _ServerProtocolContext(interfaces.GRPCServicerContext): + def __init__(self, servicer_context): + self._servicer_context = servicer_context + + def peer(self): + return self._servicer_context.peer() + + def disable_next_response_compression(self): + pass # TODO(https://github.com/grpc/grpc/issues/4078): design, implement. + + +class _FaceServicerContext(face.ServicerContext): + def __init__(self, servicer_context): + self._servicer_context = servicer_context + + def is_active(self): + return self._servicer_context.is_active() + + def time_remaining(self): + return self._servicer_context.time_remaining() + + def add_abortion_callback(self, abortion_callback): + raise NotImplementedError( + "add_abortion_callback no longer supported server-side!" + ) + + def cancel(self): + self._servicer_context.cancel() + + def protocol_context(self): + return _ServerProtocolContext(self._servicer_context) + + def invocation_metadata(self): + return _metadata.beta(self._servicer_context.invocation_metadata()) + + def initial_metadata(self, initial_metadata): + self._servicer_context.send_initial_metadata( + _metadata.unbeta(initial_metadata) + ) + + def terminal_metadata(self, terminal_metadata): + self._servicer_context.set_terminal_metadata( + _metadata.unbeta(terminal_metadata) + ) + + def code(self, code): + self._servicer_context.set_code(code) + + def details(self, details): + self._servicer_context.set_details(details) + + +def _adapt_unary_request_inline(unary_request_inline): + def adaptation(request, servicer_context): + return unary_request_inline( + request, _FaceServicerContext(servicer_context) + ) + + return adaptation + + +def _adapt_stream_request_inline(stream_request_inline): + def adaptation(request_iterator, servicer_context): + return stream_request_inline( + request_iterator, _FaceServicerContext(servicer_context) + ) + + return adaptation + + +class _Callback(stream.Consumer): + def __init__(self): + self._condition = threading.Condition() + self._values = [] + self._terminated = False + self._cancelled = False + + def consume(self, value): + with self._condition: + self._values.append(value) + self._condition.notify_all() + + def terminate(self): + with self._condition: + self._terminated = True + self._condition.notify_all() + + def consume_and_terminate(self, value): + with self._condition: + self._values.append(value) + self._terminated = True + self._condition.notify_all() + + def cancel(self): + with self._condition: + self._cancelled = True + self._condition.notify_all() + + def draw_one_value(self): + with self._condition: + while True: + if self._cancelled: + raise abandonment.Abandoned() + elif self._values: + return self._values.pop(0) + elif self._terminated: + return None + else: + self._condition.wait() + + def draw_all_values(self): + with self._condition: + while True: + if self._cancelled: + raise abandonment.Abandoned() + elif self._terminated: + all_values = tuple(self._values) + self._values = None + return all_values + else: + self._condition.wait() + + +def _run_request_pipe_thread( + request_iterator, request_consumer, servicer_context +): + thread_joined = threading.Event() + + def pipe_requests(): + for request in request_iterator: + if not servicer_context.is_active() or thread_joined.is_set(): + return + request_consumer.consume(request) + if not servicer_context.is_active() or thread_joined.is_set(): + return + request_consumer.terminate() + + request_pipe_thread = threading.Thread(target=pipe_requests) + request_pipe_thread.daemon = True + request_pipe_thread.start() + + +def _adapt_unary_unary_event(unary_unary_event): + def adaptation(request, servicer_context): + callback = _Callback() + if not servicer_context.add_callback(callback.cancel): + raise abandonment.Abandoned() + unary_unary_event( + request, + callback.consume_and_terminate, + _FaceServicerContext(servicer_context), + ) + return callback.draw_all_values()[0] + + return adaptation + + +def _adapt_unary_stream_event(unary_stream_event): + def adaptation(request, servicer_context): + callback = _Callback() + if not servicer_context.add_callback(callback.cancel): + raise abandonment.Abandoned() + unary_stream_event( + request, callback, _FaceServicerContext(servicer_context) + ) + while True: + response = callback.draw_one_value() + if response is None: + return + else: + yield response + + return adaptation + + +def _adapt_stream_unary_event(stream_unary_event): + def adaptation(request_iterator, servicer_context): + callback = _Callback() + if not servicer_context.add_callback(callback.cancel): + raise abandonment.Abandoned() + request_consumer = stream_unary_event( + callback.consume_and_terminate, + _FaceServicerContext(servicer_context), + ) + _run_request_pipe_thread( + request_iterator, request_consumer, servicer_context + ) + return callback.draw_all_values()[0] + + return adaptation + + +def _adapt_stream_stream_event(stream_stream_event): + def adaptation(request_iterator, servicer_context): + callback = _Callback() + if not servicer_context.add_callback(callback.cancel): + raise abandonment.Abandoned() + request_consumer = stream_stream_event( + callback, _FaceServicerContext(servicer_context) + ) + _run_request_pipe_thread( + request_iterator, request_consumer, servicer_context + ) + while True: + response = callback.draw_one_value() + if response is None: + return + else: + yield response + + return adaptation + + +class _SimpleMethodHandler( + collections.namedtuple( + "_MethodHandler", + ( + "request_streaming", + "response_streaming", + "request_deserializer", + "response_serializer", + "unary_unary", + "unary_stream", + "stream_unary", + "stream_stream", + ), + ), + grpc.RpcMethodHandler, +): + pass + + +def _simple_method_handler( + implementation, request_deserializer, response_serializer +): + if implementation.style is style.Service.INLINE: + if implementation.cardinality is cardinality.Cardinality.UNARY_UNARY: + return _SimpleMethodHandler( + False, + False, + request_deserializer, + response_serializer, + _adapt_unary_request_inline(implementation.unary_unary_inline), + None, + None, + None, + ) + elif implementation.cardinality is cardinality.Cardinality.UNARY_STREAM: + return _SimpleMethodHandler( + False, + True, + request_deserializer, + response_serializer, + None, + _adapt_unary_request_inline(implementation.unary_stream_inline), + None, + None, + ) + elif implementation.cardinality is cardinality.Cardinality.STREAM_UNARY: + return _SimpleMethodHandler( + True, + False, + request_deserializer, + response_serializer, + None, + None, + _adapt_stream_request_inline( + implementation.stream_unary_inline + ), + None, + ) + elif ( + implementation.cardinality is cardinality.Cardinality.STREAM_STREAM + ): + return _SimpleMethodHandler( + True, + True, + request_deserializer, + response_serializer, + None, + None, + None, + _adapt_stream_request_inline( + implementation.stream_stream_inline + ), + ) + elif implementation.style is style.Service.EVENT: + if implementation.cardinality is cardinality.Cardinality.UNARY_UNARY: + return _SimpleMethodHandler( + False, + False, + request_deserializer, + response_serializer, + _adapt_unary_unary_event(implementation.unary_unary_event), + None, + None, + None, + ) + elif implementation.cardinality is cardinality.Cardinality.UNARY_STREAM: + return _SimpleMethodHandler( + False, + True, + request_deserializer, + response_serializer, + None, + _adapt_unary_stream_event(implementation.unary_stream_event), + None, + None, + ) + elif implementation.cardinality is cardinality.Cardinality.STREAM_UNARY: + return _SimpleMethodHandler( + True, + False, + request_deserializer, + response_serializer, + None, + None, + _adapt_stream_unary_event(implementation.stream_unary_event), + None, + ) + elif ( + implementation.cardinality is cardinality.Cardinality.STREAM_STREAM + ): + return _SimpleMethodHandler( + True, + True, + request_deserializer, + response_serializer, + None, + None, + None, + _adapt_stream_stream_event(implementation.stream_stream_event), + ) + raise ValueError() + + +def _flatten_method_pair_map(method_pair_map): + method_pair_map = method_pair_map or {} + flat_map = {} + for method_pair in method_pair_map: + method = _common.fully_qualified_method(method_pair[0], method_pair[1]) + flat_map[method] = method_pair_map[method_pair] + return flat_map + + +class _GenericRpcHandler(grpc.GenericRpcHandler): + def __init__( + self, + method_implementations, + multi_method_implementation, + request_deserializers, + response_serializers, + ): + self._method_implementations = _flatten_method_pair_map( + method_implementations + ) + self._request_deserializers = _flatten_method_pair_map( + request_deserializers + ) + self._response_serializers = _flatten_method_pair_map( + response_serializers + ) + self._multi_method_implementation = multi_method_implementation + + def service(self, handler_call_details): + method_implementation = self._method_implementations.get( + handler_call_details.method + ) + if method_implementation is not None: + return _simple_method_handler( + method_implementation, + self._request_deserializers.get(handler_call_details.method), + self._response_serializers.get(handler_call_details.method), + ) + elif self._multi_method_implementation is None: + return None + else: + try: + return None # TODO(nathaniel): call the multimethod. + except face.NoSuchMethodError: + return None + + +class _Server(interfaces.Server): + def __init__(self, grpc_server): + self._grpc_server = grpc_server + + def add_insecure_port(self, address): + return self._grpc_server.add_insecure_port(address) + + def add_secure_port(self, address, server_credentials): + return self._grpc_server.add_secure_port(address, server_credentials) + + def start(self): + self._grpc_server.start() + + def stop(self, grace): + return self._grpc_server.stop(grace) + + def __enter__(self): + self._grpc_server.start() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self._grpc_server.stop(None) + return False + + +def server( + service_implementations, + multi_method_implementation, + request_deserializers, + response_serializers, + thread_pool, + thread_pool_size, +): + generic_rpc_handler = _GenericRpcHandler( + service_implementations, + multi_method_implementation, + request_deserializers, + response_serializers, + ) + if thread_pool is None: + effective_thread_pool = logging_pool.pool( + _DEFAULT_POOL_SIZE if thread_pool_size is None else thread_pool_size + ) + else: + effective_thread_pool = thread_pool + return _Server( + grpc.server(effective_thread_pool, handlers=(generic_rpc_handler,)) + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/implementations.py b/myenv/lib/python3.12/site-packages/grpc/beta/implementations.py new file mode 100644 index 0000000..ffa4f0d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/beta/implementations.py @@ -0,0 +1,345 @@ +# Copyright 2015-2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Entry points into the Beta API of gRPC Python.""" + +# threading is referenced from specification in this module. +import threading # pylint: disable=unused-import + +# interfaces, cardinality, and face are referenced from specification in this +# module. +import grpc +from grpc import _auth +from grpc.beta import _client_adaptations +from grpc.beta import _metadata +from grpc.beta import _server_adaptations +from grpc.beta import interfaces # pylint: disable=unused-import +from grpc.framework.common import cardinality # pylint: disable=unused-import +from grpc.framework.interfaces.face import face # pylint: disable=unused-import + +# pylint: disable=too-many-arguments + +ChannelCredentials = grpc.ChannelCredentials +ssl_channel_credentials = grpc.ssl_channel_credentials +CallCredentials = grpc.CallCredentials + + +def metadata_call_credentials(metadata_plugin, name=None): + def plugin(context, callback): + def wrapped_callback(beta_metadata, error): + callback(_metadata.unbeta(beta_metadata), error) + + metadata_plugin(context, wrapped_callback) + + return grpc.metadata_call_credentials(plugin, name=name) + + +def google_call_credentials(credentials): + """Construct CallCredentials from GoogleCredentials. + + Args: + credentials: A GoogleCredentials object from the oauth2client library. + + Returns: + A CallCredentials object for use in a GRPCCallOptions object. + """ + return metadata_call_credentials(_auth.GoogleCallCredentials(credentials)) + + +access_token_call_credentials = grpc.access_token_call_credentials +composite_call_credentials = grpc.composite_call_credentials +composite_channel_credentials = grpc.composite_channel_credentials + + +class Channel(object): + """A channel to a remote host through which RPCs may be conducted. + + Only the "subscribe" and "unsubscribe" methods are supported for application + use. This class' instance constructor and all other attributes are + unsupported. + """ + + def __init__(self, channel): + self._channel = channel + + def subscribe(self, callback, try_to_connect=None): + """Subscribes to this Channel's connectivity. + + Args: + callback: A callable to be invoked and passed an + interfaces.ChannelConnectivity identifying this Channel's connectivity. + The callable will be invoked immediately upon subscription and again for + every change to this Channel's connectivity thereafter until it is + unsubscribed. + try_to_connect: A boolean indicating whether or not this Channel should + attempt to connect if it is not already connected and ready to conduct + RPCs. + """ + self._channel.subscribe(callback, try_to_connect=try_to_connect) + + def unsubscribe(self, callback): + """Unsubscribes a callback from this Channel's connectivity. + + Args: + callback: A callable previously registered with this Channel from having + been passed to its "subscribe" method. + """ + self._channel.unsubscribe(callback) + + +def insecure_channel(host, port): + """Creates an insecure Channel to a remote host. + + Args: + host: The name of the remote host to which to connect. + port: The port of the remote host to which to connect. + If None only the 'host' part will be used. + + Returns: + A Channel to the remote host through which RPCs may be conducted. + """ + channel = grpc.insecure_channel( + host if port is None else "%s:%d" % (host, port) + ) + return Channel(channel) + + +def secure_channel(host, port, channel_credentials): + """Creates a secure Channel to a remote host. + + Args: + host: The name of the remote host to which to connect. + port: The port of the remote host to which to connect. + If None only the 'host' part will be used. + channel_credentials: A ChannelCredentials. + + Returns: + A secure Channel to the remote host through which RPCs may be conducted. + """ + channel = grpc.secure_channel( + host if port is None else "%s:%d" % (host, port), channel_credentials + ) + return Channel(channel) + + +class StubOptions(object): + """A value encapsulating the various options for creation of a Stub. + + This class and its instances have no supported interface - it exists to define + the type of its instances and its instances exist to be passed to other + functions. + """ + + def __init__( + self, + host, + request_serializers, + response_deserializers, + metadata_transformer, + thread_pool, + thread_pool_size, + ): + self.host = host + self.request_serializers = request_serializers + self.response_deserializers = response_deserializers + self.metadata_transformer = metadata_transformer + self.thread_pool = thread_pool + self.thread_pool_size = thread_pool_size + + +_EMPTY_STUB_OPTIONS = StubOptions(None, None, None, None, None, None) + + +def stub_options( + host=None, + request_serializers=None, + response_deserializers=None, + metadata_transformer=None, + thread_pool=None, + thread_pool_size=None, +): + """Creates a StubOptions value to be passed at stub creation. + + All parameters are optional and should always be passed by keyword. + + Args: + host: A host string to set on RPC calls. + request_serializers: A dictionary from service name-method name pair to + request serialization behavior. + response_deserializers: A dictionary from service name-method name pair to + response deserialization behavior. + metadata_transformer: A callable that given a metadata object produces + another metadata object to be used in the underlying communication on the + wire. + thread_pool: A thread pool to use in stubs. + thread_pool_size: The size of thread pool to create for use in stubs; + ignored if thread_pool has been passed. + + Returns: + A StubOptions value created from the passed parameters. + """ + return StubOptions( + host, + request_serializers, + response_deserializers, + metadata_transformer, + thread_pool, + thread_pool_size, + ) + + +def generic_stub(channel, options=None): + """Creates a face.GenericStub on which RPCs can be made. + + Args: + channel: A Channel for use by the created stub. + options: A StubOptions customizing the created stub. + + Returns: + A face.GenericStub on which RPCs can be made. + """ + effective_options = _EMPTY_STUB_OPTIONS if options is None else options + return _client_adaptations.generic_stub( + channel._channel, # pylint: disable=protected-access + effective_options.host, + effective_options.metadata_transformer, + effective_options.request_serializers, + effective_options.response_deserializers, + ) + + +def dynamic_stub(channel, service, cardinalities, options=None): + """Creates a face.DynamicStub with which RPCs can be invoked. + + Args: + channel: A Channel for the returned face.DynamicStub to use. + service: The package-qualified full name of the service. + cardinalities: A dictionary from RPC method name to cardinality.Cardinality + value identifying the cardinality of the RPC method. + options: An optional StubOptions value further customizing the functionality + of the returned face.DynamicStub. + + Returns: + A face.DynamicStub with which RPCs can be invoked. + """ + effective_options = _EMPTY_STUB_OPTIONS if options is None else options + return _client_adaptations.dynamic_stub( + channel._channel, # pylint: disable=protected-access + service, + cardinalities, + effective_options.host, + effective_options.metadata_transformer, + effective_options.request_serializers, + effective_options.response_deserializers, + ) + + +ServerCredentials = grpc.ServerCredentials +ssl_server_credentials = grpc.ssl_server_credentials + + +class ServerOptions(object): + """A value encapsulating the various options for creation of a Server. + + This class and its instances have no supported interface - it exists to define + the type of its instances and its instances exist to be passed to other + functions. + """ + + def __init__( + self, + multi_method_implementation, + request_deserializers, + response_serializers, + thread_pool, + thread_pool_size, + default_timeout, + maximum_timeout, + ): + self.multi_method_implementation = multi_method_implementation + self.request_deserializers = request_deserializers + self.response_serializers = response_serializers + self.thread_pool = thread_pool + self.thread_pool_size = thread_pool_size + self.default_timeout = default_timeout + self.maximum_timeout = maximum_timeout + + +_EMPTY_SERVER_OPTIONS = ServerOptions(None, None, None, None, None, None, None) + + +def server_options( + multi_method_implementation=None, + request_deserializers=None, + response_serializers=None, + thread_pool=None, + thread_pool_size=None, + default_timeout=None, + maximum_timeout=None, +): + """Creates a ServerOptions value to be passed at server creation. + + All parameters are optional and should always be passed by keyword. + + Args: + multi_method_implementation: A face.MultiMethodImplementation to be called + to service an RPC if the server has no specific method implementation for + the name of the RPC for which service was requested. + request_deserializers: A dictionary from service name-method name pair to + request deserialization behavior. + response_serializers: A dictionary from service name-method name pair to + response serialization behavior. + thread_pool: A thread pool to use in stubs. + thread_pool_size: The size of thread pool to create for use in stubs; + ignored if thread_pool has been passed. + default_timeout: A duration in seconds to allow for RPC service when + servicing RPCs that did not include a timeout value when invoked. + maximum_timeout: A duration in seconds to allow for RPC service when + servicing RPCs no matter what timeout value was passed when the RPC was + invoked. + + Returns: + A StubOptions value created from the passed parameters. + """ + return ServerOptions( + multi_method_implementation, + request_deserializers, + response_serializers, + thread_pool, + thread_pool_size, + default_timeout, + maximum_timeout, + ) + + +def server(service_implementations, options=None): + """Creates an interfaces.Server with which RPCs can be serviced. + + Args: + service_implementations: A dictionary from service name-method name pair to + face.MethodImplementation. + options: An optional ServerOptions value further customizing the + functionality of the returned Server. + + Returns: + An interfaces.Server with which RPCs can be serviced. + """ + effective_options = _EMPTY_SERVER_OPTIONS if options is None else options + return _server_adaptations.server( + service_implementations, + effective_options.multi_method_implementation, + effective_options.request_deserializers, + effective_options.response_serializers, + effective_options.thread_pool, + effective_options.thread_pool_size, + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/interfaces.py b/myenv/lib/python3.12/site-packages/grpc/beta/interfaces.py new file mode 100644 index 0000000..c29b291 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/beta/interfaces.py @@ -0,0 +1,163 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Constants and interfaces of the Beta API of gRPC Python.""" + +import abc + +import grpc + +ChannelConnectivity = grpc.ChannelConnectivity +# FATAL_FAILURE was a Beta-API name for SHUTDOWN +ChannelConnectivity.FATAL_FAILURE = ChannelConnectivity.SHUTDOWN + +StatusCode = grpc.StatusCode + + +class GRPCCallOptions(object): + """A value encapsulating gRPC-specific options passed on RPC invocation. + + This class and its instances have no supported interface - it exists to + define the type of its instances and its instances exist to be passed to + other functions. + """ + + def __init__(self, disable_compression, subcall_of, credentials): + self.disable_compression = disable_compression + self.subcall_of = subcall_of + self.credentials = credentials + + +def grpc_call_options(disable_compression=False, credentials=None): + """Creates a GRPCCallOptions value to be passed at RPC invocation. + + All parameters are optional and should always be passed by keyword. + + Args: + disable_compression: A boolean indicating whether or not compression should + be disabled for the request object of the RPC. Only valid for + request-unary RPCs. + credentials: A CallCredentials object to use for the invoked RPC. + """ + return GRPCCallOptions(disable_compression, None, credentials) + + +GRPCAuthMetadataContext = grpc.AuthMetadataContext +GRPCAuthMetadataPluginCallback = grpc.AuthMetadataPluginCallback +GRPCAuthMetadataPlugin = grpc.AuthMetadataPlugin + + +class GRPCServicerContext(abc.ABC): + """Exposes gRPC-specific options and behaviors to code servicing RPCs.""" + + @abc.abstractmethod + def peer(self): + """Identifies the peer that invoked the RPC being serviced. + + Returns: + A string identifying the peer that invoked the RPC being serviced. + """ + raise NotImplementedError() + + @abc.abstractmethod + def disable_next_response_compression(self): + """Disables compression of the next response passed by the application.""" + raise NotImplementedError() + + +class GRPCInvocationContext(abc.ABC): + """Exposes gRPC-specific options and behaviors to code invoking RPCs.""" + + @abc.abstractmethod + def disable_next_request_compression(self): + """Disables compression of the next request passed by the application.""" + raise NotImplementedError() + + +class Server(abc.ABC): + """Services RPCs.""" + + @abc.abstractmethod + def add_insecure_port(self, address): + """Reserves a port for insecure RPC service once this Server becomes active. + + This method may only be called before calling this Server's start method is + called. + + Args: + address: The address for which to open a port. + + Returns: + An integer port on which RPCs will be serviced after this link has been + started. This is typically the same number as the port number contained + in the passed address, but will likely be different if the port number + contained in the passed address was zero. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_secure_port(self, address, server_credentials): + """Reserves a port for secure RPC service after this Server becomes active. + + This method may only be called before calling this Server's start method is + called. + + Args: + address: The address for which to open a port. + server_credentials: A ServerCredentials. + + Returns: + An integer port on which RPCs will be serviced after this link has been + started. This is typically the same number as the port number contained + in the passed address, but will likely be different if the port number + contained in the passed address was zero. + """ + raise NotImplementedError() + + @abc.abstractmethod + def start(self): + """Starts this Server's service of RPCs. + + This method may only be called while the server is not serving RPCs (i.e. it + is not idempotent). + """ + raise NotImplementedError() + + @abc.abstractmethod + def stop(self, grace): + """Stops this Server's service of RPCs. + + All calls to this method immediately stop service of new RPCs. When existing + RPCs are aborted is controlled by the grace period parameter passed to this + method. + + This method may be called at any time and is idempotent. Passing a smaller + grace value than has been passed in a previous call will have the effect of + stopping the Server sooner. Passing a larger grace value than has been + passed in a previous call will not have the effect of stopping the server + later. + + Args: + grace: A duration of time in seconds to allow existing RPCs to complete + before being aborted by this Server's stopping. May be zero for + immediate abortion of all in-progress RPCs. + + Returns: + A threading.Event that will be set when this Server has completely + stopped. The returned event may not be set until after the full grace + period (if some ongoing RPC continues for the full length of the period) + of it may be set much sooner (such as if this Server had no RPCs underway + at the time it was stopped or if all RPCs that it had underway completed + very early in the grace period). + """ + raise NotImplementedError() diff --git a/myenv/lib/python3.12/site-packages/grpc/beta/utilities.py b/myenv/lib/python3.12/site-packages/grpc/beta/utilities.py new file mode 100644 index 0000000..90e5471 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/beta/utilities.py @@ -0,0 +1,153 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Utilities for the gRPC Python Beta API.""" + +import threading +import time + +# implementations is referenced from specification in this module. +from grpc.beta import implementations # pylint: disable=unused-import +from grpc.beta import interfaces +from grpc.framework.foundation import callable_util +from grpc.framework.foundation import future + +_DONE_CALLBACK_EXCEPTION_LOG_MESSAGE = ( + 'Exception calling connectivity future "done" callback!' +) + + +class _ChannelReadyFuture(future.Future): + def __init__(self, channel): + self._condition = threading.Condition() + self._channel = channel + + self._matured = False + self._cancelled = False + self._done_callbacks = [] + + def _block(self, timeout): + until = None if timeout is None else time.time() + timeout + with self._condition: + while True: + if self._cancelled: + raise future.CancelledError() + elif self._matured: + return + else: + if until is None: + self._condition.wait() + else: + remaining = until - time.time() + if remaining < 0: + raise future.TimeoutError() + else: + self._condition.wait(timeout=remaining) + + def _update(self, connectivity): + with self._condition: + if ( + not self._cancelled + and connectivity is interfaces.ChannelConnectivity.READY + ): + self._matured = True + self._channel.unsubscribe(self._update) + self._condition.notify_all() + done_callbacks = tuple(self._done_callbacks) + self._done_callbacks = None + else: + return + + for done_callback in done_callbacks: + callable_util.call_logging_exceptions( + done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self + ) + + def cancel(self): + with self._condition: + if not self._matured: + self._cancelled = True + self._channel.unsubscribe(self._update) + self._condition.notify_all() + done_callbacks = tuple(self._done_callbacks) + self._done_callbacks = None + else: + return False + + for done_callback in done_callbacks: + callable_util.call_logging_exceptions( + done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self + ) + + return True + + def cancelled(self): + with self._condition: + return self._cancelled + + def running(self): + with self._condition: + return not self._cancelled and not self._matured + + def done(self): + with self._condition: + return self._cancelled or self._matured + + def result(self, timeout=None): + self._block(timeout) + return None + + def exception(self, timeout=None): + self._block(timeout) + return None + + def traceback(self, timeout=None): + self._block(timeout) + return None + + def add_done_callback(self, fn): + with self._condition: + if not self._cancelled and not self._matured: + self._done_callbacks.append(fn) + return + + fn(self) + + def start(self): + with self._condition: + self._channel.subscribe(self._update, try_to_connect=True) + + def __del__(self): + with self._condition: + if not self._cancelled and not self._matured: + self._channel.unsubscribe(self._update) + + +def channel_ready_future(channel): + """Creates a future.Future tracking when an implementations.Channel is ready. + + Cancelling the returned future.Future does not tell the given + implementations.Channel to abandon attempts it may have been making to + connect; cancelling merely deactivates the return future.Future's + subscription to the given implementations.Channel's connectivity. + + Args: + channel: An implementations.Channel. + + Returns: + A future.Future that matures when the given Channel has connectivity + interfaces.ChannelConnectivity.READY. + """ + ready_future = _ChannelReadyFuture(channel) + ready_future.start() + return ready_future diff --git a/myenv/lib/python3.12/site-packages/grpc/experimental/__init__.py b/myenv/lib/python3.12/site-packages/grpc/experimental/__init__.py new file mode 100644 index 0000000..32a53bf --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/experimental/__init__.py @@ -0,0 +1,134 @@ +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""gRPC's experimental APIs. + +These APIs are subject to be removed during any minor version release. +""" + +import copy +import functools +import sys +import warnings + +import grpc +from grpc._cython import cygrpc as _cygrpc + +_EXPERIMENTAL_APIS_USED = set() + + +class ChannelOptions(object): + """Indicates a channel option unique to gRPC Python. + + This enumeration is part of an EXPERIMENTAL API. + + Attributes: + SingleThreadedUnaryStream: Perform unary-stream RPCs on a single thread. + """ + + SingleThreadedUnaryStream = "SingleThreadedUnaryStream" + + +class UsageError(Exception): + """Raised by the gRPC library to indicate usage not allowed by the API.""" + + +# It's important that there be a single insecure credentials object so that its +# hash is deterministic and can be used for indexing in the simple stubs cache. +_insecure_channel_credentials = grpc.ChannelCredentials( + _cygrpc.channel_credentials_insecure() +) + + +def insecure_channel_credentials(): + """Creates a ChannelCredentials for use with an insecure channel. + + THIS IS AN EXPERIMENTAL API. + """ + return _insecure_channel_credentials + + +class ExperimentalApiWarning(Warning): + """A warning that an API is experimental.""" + + +def _warn_experimental(api_name, stack_offset): + if api_name not in _EXPERIMENTAL_APIS_USED: + _EXPERIMENTAL_APIS_USED.add(api_name) + msg = ( + "'{}' is an experimental API. It is subject to change or ".format( + api_name + ) + + "removal between minor releases. Proceed with caution." + ) + warnings.warn(msg, ExperimentalApiWarning, stacklevel=2 + stack_offset) + + +def experimental_api(f): + @functools.wraps(f) + def _wrapper(*args, **kwargs): + _warn_experimental(f.__name__, 1) + return f(*args, **kwargs) + + return _wrapper + + +def wrap_server_method_handler(wrapper, handler): + """Wraps the server method handler function. + + The server implementation requires all server handlers being wrapped as + RpcMethodHandler objects. This helper function ease the pain of writing + server handler wrappers. + + Args: + wrapper: A wrapper function that takes in a method handler behavior + (the actual function) and returns a wrapped function. + handler: A RpcMethodHandler object to be wrapped. + + Returns: + A newly created RpcMethodHandler. + """ + if not handler: + return None + + if not handler.request_streaming: + if not handler.response_streaming: + # NOTE(lidiz) _replace is a public API: + # https://docs.python.org/dev/library/collections.html + return handler._replace(unary_unary=wrapper(handler.unary_unary)) + else: + return handler._replace(unary_stream=wrapper(handler.unary_stream)) + else: + if not handler.response_streaming: + return handler._replace(stream_unary=wrapper(handler.stream_unary)) + else: + return handler._replace( + stream_stream=wrapper(handler.stream_stream) + ) + + +__all__ = ( + "ChannelOptions", + "ExperimentalApiWarning", + "UsageError", + "insecure_channel_credentials", + "wrap_server_method_handler", +) + +if sys.version_info > (3, 6): + from grpc._simple_stubs import stream_stream + from grpc._simple_stubs import stream_unary + from grpc._simple_stubs import unary_stream + from grpc._simple_stubs import unary_unary + + __all__ = __all__ + (unary_unary, unary_stream, stream_unary, stream_stream) diff --git a/myenv/lib/python3.12/site-packages/grpc/experimental/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/experimental/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a781ff88502b49bec6bbf013dd4357643014c40f GIT binary patch literal 4437 zcmb7HOH3Te8LsYmG7Jm`Y_NH_@RM=k8MB+!dRfN`G1x{n12KNA=F;0t7tpw;dtBWE zI|NItWNG6|!ewPgImCx3l4Bo|n~%OH2gX=|ZLcLqn~M*Tu;CExDgR&H4HJyBO2PbH zU5~&1cYXcWhK2-z_Oy6?D%M2EclZ*th~L?`ED>^#Xe3WGNs|pJFNvp|m&G%b4~b_u z9~RF@J_65>5iQ2@af!%;)jjfADKv)sVigWj@y)dQDR&#GSg8FIxseDXA+64)68b#g{quUyF4+&3J!HF zI>9JsMQfI6R4a4coT92(p+()aIGttO)-4kj7)-TUCh-~-$fYGWTBuC%QlU_*kZ&Qf z(F&vY2qWNAg8l?w%K305ln%R%=cZNDWX5R80mk!7GvE;6nnCkn46l{?g$1o`REXJbQGhDU~SR|hVm*8Z*m z$Km=!8BXgLTqqp}g$;Ifnln{n+BH+iU> zQb%mf2zKuN_p-~SBW_$#Otr`q#Z4$m(bCEW_LGWotE?LSOiWQUtDq=63O0O5HqgG` zTiK%NWDD7AHuxiZo;l2>#smI#wxL;?@jv225L@Fj%%&VdiYs&?mAbVY3f2 zeII0P-C-w7YT>3j#q2CPFIyWZSw+!J-BFZGslqW!1;IqIQ$X&JH*z!*UvDBkXR6^Y zo(xv(9s!W{J0bugG~_0(*>L(0=N6wIyrSwh1l>dhY{)zpgUB3=jV{;yxS(a+LQTt| zs$p1j+dI&$xrbpMLs8;L>X2aV;q^#_j1AaB4Fov>9UHZ~L)>uATY;1BXc2E^vsqS@Ab3h3%7esOWb7&&4gEz(?@2(K?G{GeMH+<#4Ysz&pC5vK#O5 z;J%@n;xbUuZ>ZdaM3_G|KSW+gtn?XDSIwWBSNppauxoe8d^npN8?G#Sh5ZP~#H6Kw{= zY)4y=9dX^^uoha7aL?m#a3x5j0)Od9ZvOP~U*0~B1_9I5+C-EmI_%(7O<6{lL)=3+ z&3`27Gt}}4=FBn3eXltCMcK~KF>VzYB!&pOf?CFcn0bvhgD^_i4kW$7W|@(Wx@}5r zX;i>RUmqH8q0heKe!q{T#X-oaPfKkD#SKjRaO?u=Xi!kP{yg+oaApJr5wa5H5N|%;}wM1zHyN6XiWxLUv zU{iQXlfJDNJzK|>Ij)xA%AY?}Yi|Xdl{sTr1t?2rGr^i1aJPGa{Cko7Gk)NH-|zc> z+yCI!^LYB3RMXOtr zH|;#0{|IJBaM@8HaN@U-#;=qwm8D;-MA|lFIdW(tM568M*jta2Wb5Ln=f7INpn-+| zJ_pM{x=XfH0Z+`p@XltB!FcUne}R1n#&=0|8HxwYU_sf@f+F!)4tnFb^8Gw^DGb5R z$DyDnc>MqJZIzd8Ap?$3X#8mY0r~JQ+|h!ak0U`3qC2Yo3mD!&KZ|P_5C?!jT4aE| zGzv9IGvHN(1QwY9i~*wb7V5>4!36XasEo5)Wt}6qGmKz~&%}muhG^3ZUX7}D0x!NR zrNW3f?4o~`C6FpqIRW{mnE{c$B>+WODg-U5x{2U#j_VGv6})_z0;&BpK{$*j4L~vl zFp&CU@O}yxnU_x6hlm@^QE!4CaEQ9o8WU_jW-0ugFF`z%5{qfT{@Bgi2}oHP*h@SfcocNcxauk(>mQJ}B_68!lJ?+tV=OhU|*X zJFyo=knbjuW|V^X65z!dSF*Eb0~Hrpj>R9f1K-xOefwYPh!= z?p+C=0D#gXFO#mfiHMZmY?7qD`!{e?-`jYdG$y@mk4mj?n-5Bj>w{9XUS5pB_ft5w x8fvMAT9ziCg*sn`PrVFh#ee2i}+G%IIqcAeWV*-l`oDEJTe z8xVhj9#K#rq_l{F4iu`Z7(1Jhc5Khu@4b1NFP%=CV0=zrMPKWL{B(zX)T+()7&li$ zkU0@l)DoK3=50Y_|d9B31^{m9hRNPZB9$G`Sehz{V1aT_eWwOmHm#p&{l5@5&4i z6lul4<1AJdo{c9jW@8AoM7k^jeB?DjzF5l8nu_u)gIo)#;dQQ|(0Qb#*=tR?kONQ6 ziy~1W0-=#!pU`S8{V%T{k~}Ylp8LFC+Z+ZvV>exuDH}MCgI%K^$<|qRow78uEMzZ@ z)P_x@#THJr5{jKlb7}K}p_Zkzqs%z3SX#<#&9Gy(bK&vu(Frrk%7+CHFL@*lb1Y20 zEu>Z{TFMhvd0Uj5n>!s|t9HY68$Z*<^q&0dlIGEmM(A>v6rZ^-ANB=uBd^h%fF*ED1 zmJ1gyXpn*^uHheu+|ba|(*(Hyt>_R19m$0z5)$vt?wZ&jBu3gdAMee3zj^QX_WKJL z<_V1N!cWG3HVOF!H`Rc>9kVxKni8Lkh)?}mK*QRoPKjSXBBMr)d_?@l5%HU%d0a0p zj9OW%H@Dv(Z{AvaO|!wRo0@IMihaC3WJ95~j3c%wbQ&fGmpV<7Sef7Oa*yUMFB_}G z^JwABN`!*WXV*YXi8ZiBLp_C2=6VY<`}>7^tznVpoiLJmH=+*%daF`+~*W%zz6I9Tmo# z!lWuXwIBSic;Jj1@D{Nx!4j^u@EHftY>x-2z@(NiFeqlNuXW(+BFC;p!QvvzCWdR) zWNpHuNCbU+I4f-n#Nb&8mO_-uZOpWZ;jA(<(%ThAUuJhE(wi_ZkdPd05hhA#%oGHI zRT=_dCH7>TYFqfygDySWBy;eq_Jr!&!(KgKJXec+&MnxGFP+mseSjj23q2ws7A%^*)p6=i6A2i%~$j3sP5OW>1^vYvqrC}urv0* z1y+d&a-q|J+nxd*VseXKD|moqJ#E8EWh-R~(l6+GGt!1f9(0DKvV__Oz`JuCv}7uI zgoLzoESemcXsh|3Y_t|$t$HxbxUR!DTLLj92lRlruqsAI?$HhWH58QY)$)cG!FJxX zFVlFJG4&KodE0emB#rCtUpmK_ex>PwokrtB^3(I(&l_JXs0G-a`QacG3+FN{p8Vk) zkew%CgBHheS+XHfPs0`f)@5YWBCe@=2Bw0b1;#l;`vuHv>Sa)1!t@G=-|Ljp2g`)6{z_hd*y_*$ee}u#Wp}s#ATU`6e*x(G B#s&ZY literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/experimental/aio/__init__.py b/myenv/lib/python3.12/site-packages/grpc/experimental/aio/__init__.py new file mode 100644 index 0000000..576cb8d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/experimental/aio/__init__.py @@ -0,0 +1,16 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Alias of grpc.aio to keep backward compatibility.""" + +from grpc.aio import * diff --git a/myenv/lib/python3.12/site-packages/grpc/experimental/aio/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/experimental/aio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff99f85d65cc97c390563651e9ac29026f6fc733 GIT binary patch literal 311 zcmXwzy-EW?5XW~fLZXny!pdUX2;LBFEJO$dOFJ#nEPJAHrJ0)Ez_k{dmX7~^D@%tDKcUabYb2Wc182jwZM%n*swVTTe(`?2x*M;G41!rw< zwDmNe7*bKVYcUVLE)_YEoLC@wQK@?Ipn?{)YrINSk)hO<-`&L#U-E;CQL*exsa-AQ zaD%?-v~l{*;91zt3_M31=JeC!od51K Me)7fkLO*x@0PA*KV*mgE literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/experimental/gevent.py b/myenv/lib/python3.12/site-packages/grpc/experimental/gevent.py new file mode 100644 index 0000000..159d612 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/experimental/gevent.py @@ -0,0 +1,27 @@ +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""gRPC's Python gEvent APIs.""" + +from grpc._cython import cygrpc as _cygrpc + + +def init_gevent(): + """Patches gRPC's libraries to be compatible with gevent. + + This must be called AFTER the python standard lib has been patched, + but BEFORE creating and gRPC objects. + + In order for progress to be made, the application must drive the event loop. + """ + _cygrpc.init_grpc_gevent() diff --git a/myenv/lib/python3.12/site-packages/grpc/experimental/session_cache.py b/myenv/lib/python3.12/site-packages/grpc/experimental/session_cache.py new file mode 100644 index 0000000..5c55f7c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/experimental/session_cache.py @@ -0,0 +1,45 @@ +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""gRPC's APIs for TLS Session Resumption support""" + +from grpc._cython import cygrpc as _cygrpc + + +def ssl_session_cache_lru(capacity): + """Creates an SSLSessionCache with LRU replacement policy + + Args: + capacity: Size of the cache + + Returns: + An SSLSessionCache with LRU replacement policy that can be passed as a value for + the grpc.ssl_session_cache option to a grpc.Channel. SSL session caches are used + to store session tickets, which clients can present to resume previous TLS sessions + with a server. + """ + return SSLSessionCache(_cygrpc.SSLSessionCacheLRU(capacity)) + + +class SSLSessionCache(object): + """An encapsulation of a session cache used for TLS session resumption. + + Instances of this class can be passed to a Channel as values for the + grpc.ssl_session_cache option + """ + + def __init__(self, cache): + self._cache = cache + + def __int__(self): + return int(self._cache) diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/__init__.py b/myenv/lib/python3.12/site-packages/grpc/framework/__init__.py new file mode 100644 index 0000000..5fb4f3c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..374cbf5077cd73de1887fadfc0534fd97e236ef6 GIT binary patch literal 205 zcmZ9FJqp4=6ohw;f(W^Tt%Z50tq6f&X{T*S;xn$v{_u8HauUzrF|0j?Cy;ch+_Vl1 z%nTpQI}9hx>m?6mJYek8mw&ZGzdTsOW_tqksf$ z<+K4q`hqT2R^&B;Y*5{x7CD&4owZs;izQg$aBi}q%1X3Qk}2RsnZ&!M3er?4;nFlR ZO*dXkeZ1DVp^-o5-nI|lfOAfPPe1&hI8y)s literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/common/__init__.py b/myenv/lib/python3.12/site-packages/grpc/framework/common/__init__.py new file mode 100644 index 0000000..5fb4f3c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/common/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ab9ff0661474a3bbb37326f983be039f1583e5c GIT binary patch literal 212 zcmZ9GJqp4=6ohw;f(W^Tt%Z50tq6f&X{T*S;xn$v{_u8HauUzrF|0j?Cy;ch+_Vl1 z%nV;K?=YM&ua`WO@qn>UU;fn&{qkT9oAKR~k;houGo1yg92Bs(NEWu}P)!pOM*#`i z%4q|J^aWk4tjKEw*`T^XEpjl8J8QLy7E7?g;oM|Jm6d3rBvZhNGKqIh6%<-ZtsqT> e5-v?6({$st)W>U$8yfi!+}rly8*t7k@aYG}Z95VG literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/cardinality.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/cardinality.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42deac8d725af741581d098ec2e222500311c995 GIT binary patch literal 879 zcmZ`%y>HV%6u+|_Cu$OqC<|%_4_!PoN2yr&lA@#_0gX_g2)tO1?~-0)pWQpV$eCKH z5-Uvk8&LlWX8r+WF@QR;wF*-w?&5q%sJ!95-}|`tb?;lfz5*nD4c`ua=m4B6WlrV{ zOx{T_1{gR1L#zeRfdn2H^RT7Vz%zjLQ-BTWpTAzZ!I`X}=&TUHF*40AjaqHer;G^8 zV-{g)X!Rp*`GF?{?Prt?tnRCp6_R8>!ouohmPk19Lgf%7^jJcD(fF-WcKli5sem(O zVo5Lt1UOKRpke6fSaS@lJ0)y5CN4SU%(TmSwdHY4nHSI`8*R6V@Hy?tu9AInT}dnI ztA>}oHAd^49HvAhnN)p1XHm8^(xx`@-#VF>{0ZE!n&|W}Lm=Sh_0@_1yCO?&JH@5B} zK@+kWd;ZWH5P=3f_EDe92|h%8i2NuFBZmCt2Q}i1s|%d6RSCo$$xgv9t>V*k3^W)md+8@n?4?k^;?a%fENI21fR=-rnY0AHHJpEt* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/style.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/common/__pycache__/style.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e192cb19e1379e2cf5bc53109950e4a08254394a GIT binary patch literal 703 zcmZ8fJ8u**5VrS~DCD3BNJyb@dj)3&8VVE%ad!|2PKZZ@wps11=Pu5z?Tx*6(WW9& zB%q?qZ$SAK)cgUo6(|*5qN7TMeGdgO#mqMkf1dI9d!w<2tb7x@!$&?s=gwJ5v;foh z7Mvo6V#F}>avWp8`@yp8+Ir|2V*UwYfz2;ZU#HQTy}`-Z+@Lt9yk>aRZNq>|FeH@( zlAZqYWJA{iO z2LZB7ORi+Aj=0S2D0K)E8|*csdNoO8Dj-SfwImUWjdO?BljLBW=8Mcqk}#FoaJ18V zvD53+VQ06~d;1klUH?}F6|$rmeP=)$+JzD%X=~0nwcUDGCI(x#C0qE`- zPCNxA;tjUt1%QR-D(qxeS~11so6O8N^V$A>bTmc5zN+_?P7(SMgPo1HVDmVD8zj&i zCFm^@_!@}>@Rv{@ZJu=LY_xiD?qw~#1V>6^iPSUirv_7Pa z&WnL!@OT?+?gwy#0L^ijnFu^jyJVKGC&vR3h}E}u1AQ3gFSsYpDA*?^(vb!14F{1= zrzF^xqfhY?(I*Da8s%W~<$ubwN^z^4M5C}m%8zl~|Y_9A&5 z`xk+~)|J)nn?DOO=3ZK639}%z0B>(^b literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/callable_util.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/callable_util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54cd82af150407692b14edcfdb091e98720d24fa GIT binary patch literal 3902 zcmd59OKcn0@$HApk0?{NQ-35Od5&!;RAaJjkir(+plmG5fmFGW>@;Bx%!>O+twiq9 z?=2{VCm8n2m+@-fwn;pHiQH|1wIw=xhNpnEtIZvXwdf1n{4Wks+Z2}Pok=z zMNVCS^M3Q@&3}f!@9s_!_#V_>uU<|Q@>g7hUox1qe+QG>#2`gtNQPXK>T*$*aIVyp zqT-EeQT4`HG3Je0QIiSNW)6hJc1D(1mHbsPDU%Ums7u6%F?m%9c2nN22D@>fq0AiF zxf{-mc$FB552aPv-(jg$HMpHNl1rr6ZKMDmFuDL{T1qy3teK9<1g+Sd&f9#} zw5oL8bf#%puhsOa8WXvHAeF4-Duo}sI$rik`cMlN?Kfa@n=n$8KqImt6&0q=cv{?z zPKYOk3{v1Z=yvZH%DWmI6yq&58*}5An@-uTGyQ$gQh|zQojR=sqXrXYZcZW3&NQR8 zk45bY6@cxDkV~Z~dcHibi{7;OMg%yOt%@#LVUh?wXQC441%)_)>e zhMax9M?CfTPjt9N;DDt4BABt$Ex>uz$hfhNmDZB8%62+1bq?jYarQL>#561Dp=jYM zvl!QFzR+N|ueADjHtr@$B}=cfQprt~N_E?4)^MIKm991QT5u9Cl?=NK+nPN!14ece zp%=K?geTu!(ne?8UdY!iCtuEA6^x7gMdmPzUf`x-<}WZY>)4HagWEIADOkdUu*uh3 z%$m#B%&B~%j!Zb3&C-ih(Q2LF{J_%PSXPVofZS7$-RZhCh>y2&U~ z%Ar#OGC|Fv!rI#aZj&T&Lg9!L;mriu7f_;aCd`=84(7xKvLKseLHVupGsvG|4xA(> ziGweB-zmZ`+*F+?r_OYTCp+VUv>Nas{qG#@Q;iI=poUzO~P6p$=G*7N8 zZ<2ZGu7qypY1i`?bUcoHxyj)$&$;o^*yWLt;R)W0r}!Eq^u!dK*5^!{yYV^`0;0iH zbzT*&HaqW)5)()gQ#a-4k?ye)21Ti6SF4bGOOas&KLy9%g`b!Put+v#EjILdrtkCg z;djSY#x~L?*3&0`bN0@awUg)Xy}o|({C%UX$UUh|A}3Q{ZfPX_ji*G0D~ZfT;`n;v z_y+@jOgs++emU~1v0sdB^yk<6^Y@;)ckNN;+@BKX{x{1-NRUvYKxcqtwRWnHpr+&Jei0T((0*7NL*oq5 z0$d7nQCLd?gTWyc5TaOnZF~ZY5$5CYc0hkm)${7qgjXY@_X^P)KELzRkXzYxR)%_Q zfJk%pY?%L{2wTw$Ij>%Zl`^V;A;Z+s!+Qd9ECt7EVj2Nm1l6R28in>CsNR4PQL8ke zp0iw#a(1^Iz$VDcJ)x_eq(Yv+7-16-5&X(#pd6YXNA&*Z;MYd)eqY}0F)Q+lQk56T zhtfwHqzwtv#w6kWfOuE(q5;z430U#x5g-*#0SHV;lrAp%0o5}P&eLEt#BlBL*~gr(@YO>eph;oZNc_IYe{1SKli%i*Y`-RgyGEP;CEK)qg8hJcgwk0Ib* zg&c$d7wYW)Kj6F+N(V8k4$&Xk(1AdM0abM;8X$Zdx`2?d_i^Pg>IVn?%sfO#Sqs_~ z=w_pE`Y#0b4S6dp;$J_ag61^}tp9AU`2g4!f*}flov;XkA*?P(F=^~qT(D)h3O~^Y z0NkyYq)+|&(w*vB*T{YKVb{o~+IrW>nmXe9d5_;^Df(2IqdU7@WxH0xKM%GgICgD3 zi`(&_jJe4wbH<>gG43}q&ms!CrklbJ)o_~7`}idm6M^Uc9C_N)<7_9+`yK8p{3STW zHbB$>Y$}o@J?SUXi+?AFACp6mN!Mf2^Ozj?OR8^qU?bJHp6dJH(xcSr#rT$XQ0iSS zZxI-_UeKicXKL@_=!V+6uJ(SGIP&n=_n>UXG>E8JdMgR%PY=bVp{LIrlKR_&-O?q= HQ^CIhN&x0# literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/future.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/future.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf0a03c2b0638f1806c8a78939267d9e49e2282e GIT binary patch literal 7984 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/logging_pool.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/__pycache__/logging_pool.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c1130ac0031f138efed6baf664a029c4c2b9fac GIT binary patch literal 3158 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 + # COMPLETED + # UNCANCELLABLE + # NOT_IMMEDIATELY_DETERMINABLE + @abc.abstractmethod + def cancel(self): + """Attempts to cancel the computation. + + This method does not block. + + Returns: + True if the computation has not yet begun, will not be allowed to take + place, and determination of both was possible without blocking. False + under all other circumstances including but not limited to the + computation's already having begun, the computation's already having + finished, and the computation's having been scheduled for execution on a + remote system for which a determination of whether or not it commenced + before being cancelled cannot be made without blocking. + """ + raise NotImplementedError() + + # NOTE(nathaniel): Here too this isn't the return type that I'd want this + # method to have if it were up to me. I think I'd go with another sum type + # like: + # + # NOT_CANCELLED (this object's cancel method hasn't been called) + # NOT_COMMENCED + # COMMENCED_AND_NOT_COMPLETED + # PARTIAL_RESULT + # COMPLETED + # UNCANCELLABLE + # NOT_IMMEDIATELY_DETERMINABLE + # + # Notice how giving the cancel method the right semantics obviates most + # reasons for this method to exist. + @abc.abstractmethod + def cancelled(self): + """Describes whether the computation was cancelled. + + This method does not block. + + Returns: + True if the computation was cancelled any time before its result became + immediately available. False under all other circumstances including but + not limited to this object's cancel method not having been called and + the computation's result having become immediately available. + """ + raise NotImplementedError() + + @abc.abstractmethod + def running(self): + """Describes whether the computation is taking place. + + This method does not block. + + Returns: + True if the computation is scheduled to take place in the future or is + taking place now, or False if the computation took place in the past or + was cancelled. + """ + raise NotImplementedError() + + # NOTE(nathaniel): These aren't quite the semantics I'd like here either. I + # would rather this only returned True in cases in which the underlying + # computation completed successfully. A computation's having been cancelled + # conflicts with considering that computation "done". + @abc.abstractmethod + def done(self): + """Describes whether the computation has taken place. + + This method does not block. + + Returns: + True if the computation is known to have either completed or have been + unscheduled or interrupted. False if the computation may possibly be + executing or scheduled to execute later. + """ + raise NotImplementedError() + + @abc.abstractmethod + def result(self, timeout=None): + """Accesses the outcome of the computation or raises its exception. + + This method may return immediately or may block. + + Args: + timeout: The length of time in seconds to wait for the computation to + finish or be cancelled, or None if this method should block until the + computation has finished or is cancelled no matter how long that takes. + + Returns: + The return value of the computation. + + Raises: + TimeoutError: If a timeout value is passed and the computation does not + terminate within the allotted time. + CancelledError: If the computation was cancelled. + Exception: If the computation raised an exception, this call will raise + the same exception. + """ + raise NotImplementedError() + + @abc.abstractmethod + def exception(self, timeout=None): + """Return the exception raised by the computation. + + This method may return immediately or may block. + + Args: + timeout: The length of time in seconds to wait for the computation to + terminate or be cancelled, or None if this method should block until + the computation is terminated or is cancelled no matter how long that + takes. + + Returns: + The exception raised by the computation, or None if the computation did + not raise an exception. + + Raises: + TimeoutError: If a timeout value is passed and the computation does not + terminate within the allotted time. + CancelledError: If the computation was cancelled. + """ + raise NotImplementedError() + + @abc.abstractmethod + def traceback(self, timeout=None): + """Access the traceback of the exception raised by the computation. + + This method may return immediately or may block. + + Args: + timeout: The length of time in seconds to wait for the computation to + terminate or be cancelled, or None if this method should block until + the computation is terminated or is cancelled no matter how long that + takes. + + Returns: + The traceback of the exception raised by the computation, or None if the + computation did not raise an exception. + + Raises: + TimeoutError: If a timeout value is passed and the computation does not + terminate within the allotted time. + CancelledError: If the computation was cancelled. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_done_callback(self, fn): + """Adds a function to be called at completion of the computation. + + The callback will be passed this Future object describing the outcome of + the computation. + + If the computation has already completed, the callback will be called + immediately. + + Args: + fn: A callable taking this Future object as its single parameter. + """ + raise NotImplementedError() diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/foundation/logging_pool.py b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/logging_pool.py new file mode 100644 index 0000000..a4e140f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/logging_pool.py @@ -0,0 +1,72 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A thread pool that logs exceptions raised by tasks executed within it.""" + +from concurrent import futures +import logging + +_LOGGER = logging.getLogger(__name__) + + +def _wrap(behavior): + """Wraps an arbitrary callable behavior in exception-logging.""" + + def _wrapping(*args, **kwargs): + try: + return behavior(*args, **kwargs) + except Exception: + _LOGGER.exception( + "Unexpected exception from %s executed in logging pool!", + behavior, + ) + raise + + return _wrapping + + +class _LoggingPool(object): + """An exception-logging futures.ThreadPoolExecutor-compatible thread pool.""" + + def __init__(self, backing_pool): + self._backing_pool = backing_pool + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self._backing_pool.shutdown(wait=True) + + def submit(self, fn, *args, **kwargs): + return self._backing_pool.submit(_wrap(fn), *args, **kwargs) + + def map(self, func, *iterables, **kwargs): + return self._backing_pool.map( + _wrap(func), *iterables, timeout=kwargs.get("timeout", None) + ) + + def shutdown(self, wait=True): + self._backing_pool.shutdown(wait=wait) + + +def pool(max_workers): + """Creates a thread pool that logs exceptions raised by the tasks within it. + + Args: + max_workers: The maximum number of worker threads to allow the pool. + + Returns: + A futures.ThreadPoolExecutor-compatible thread pool that logs exceptions + raised by the tasks executed within it. + """ + return _LoggingPool(futures.ThreadPoolExecutor(max_workers)) diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/foundation/stream.py b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/stream.py new file mode 100644 index 0000000..70ca1d9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/stream.py @@ -0,0 +1,43 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Interfaces related to streams of values or objects.""" + +import abc + + +class Consumer(abc.ABC): + """Interface for consumers of finite streams of values or objects.""" + + @abc.abstractmethod + def consume(self, value): + """Accepts a value. + + Args: + value: Any value accepted by this Consumer. + """ + raise NotImplementedError() + + @abc.abstractmethod + def terminate(self): + """Indicates to this Consumer that no more values will be supplied.""" + raise NotImplementedError() + + @abc.abstractmethod + def consume_and_terminate(self, value): + """Supplies a value and signals that no more values will be supplied. + + Args: + value: Any value accepted by this Consumer. + """ + raise NotImplementedError() diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/foundation/stream_util.py b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/stream_util.py new file mode 100644 index 0000000..1faaf29 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/foundation/stream_util.py @@ -0,0 +1,148 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Helpful utilities related to the stream module.""" + +import logging +import threading + +from grpc.framework.foundation import stream + +_NO_VALUE = object() +_LOGGER = logging.getLogger(__name__) + + +class TransformingConsumer(stream.Consumer): + """A stream.Consumer that passes a transformation of its input to another.""" + + def __init__(self, transformation, downstream): + self._transformation = transformation + self._downstream = downstream + + def consume(self, value): + self._downstream.consume(self._transformation(value)) + + def terminate(self): + self._downstream.terminate() + + def consume_and_terminate(self, value): + self._downstream.consume_and_terminate(self._transformation(value)) + + +class IterableConsumer(stream.Consumer): + """A Consumer that when iterated over emits the values it has consumed.""" + + def __init__(self): + self._condition = threading.Condition() + self._values = [] + self._active = True + + def consume(self, value): + with self._condition: + if self._active: + self._values.append(value) + self._condition.notify() + + def terminate(self): + with self._condition: + self._active = False + self._condition.notify() + + def consume_and_terminate(self, value): + with self._condition: + if self._active: + self._values.append(value) + self._active = False + self._condition.notify() + + def __iter__(self): + return self + + def __next__(self): + return self.next() + + def next(self): + with self._condition: + while self._active and not self._values: + self._condition.wait() + if self._values: + return self._values.pop(0) + else: + raise StopIteration() + + +class ThreadSwitchingConsumer(stream.Consumer): + """A Consumer decorator that affords serialization and asynchrony.""" + + def __init__(self, sink, pool): + self._lock = threading.Lock() + self._sink = sink + self._pool = pool + # True if self._spin has been submitted to the pool to be called once and + # that call has not yet returned, False otherwise. + self._spinning = False + self._values = [] + self._active = True + + def _spin(self, sink, value, terminate): + while True: + try: + if value is _NO_VALUE: + sink.terminate() + elif terminate: + sink.consume_and_terminate(value) + else: + sink.consume(value) + except Exception as e: # pylint:disable=broad-except + _LOGGER.exception(e) + + with self._lock: + if terminate: + self._spinning = False + return + elif self._values: + value = self._values.pop(0) + terminate = not self._values and not self._active + elif not self._active: + value = _NO_VALUE + terminate = True + else: + self._spinning = False + return + + def consume(self, value): + with self._lock: + if self._active: + if self._spinning: + self._values.append(value) + else: + self._pool.submit(self._spin, self._sink, value, False) + self._spinning = True + + def terminate(self): + with self._lock: + if self._active: + self._active = False + if not self._spinning: + self._pool.submit(self._spin, self._sink, _NO_VALUE, True) + self._spinning = True + + def consume_and_terminate(self, value): + with self._lock: + if self._active: + self._active = False + if self._spinning: + self._values.append(value) + else: + self._pool.submit(self._spin, self._sink, value, True) + self._spinning = True diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/__init__.py b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/__init__.py new file mode 100644 index 0000000..5fb4f3c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..779b3e0a2012e01acc41306b3d2314b55081ba30 GIT binary patch literal 216 zcmZ8bI|>3Z6iobp2;RZg!hNW%2!dGJX&d7DT;py&yhJ4@@eCfr+GBVE+0M#r>%hSL zig^tNeU|XlyJFd5?A@4u)SZ;vS!5%=c`!;dRyUjP4YUc6!`35tSYtplT#-5`SfMY2 zb>PUJF)WQ&`wBrvG*_t99$XA3Yi8MG3SI>qJDHcVKo14E9F8P4-Yk`%Oh7uyJT*cn eqk<5bi{IW{+ry>81$EO8p6DC#X>-o0ozxH4y*#l1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__init__.py b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__init__.py new file mode 100644 index 0000000..5fb4f3c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c92238662fce2b202ea11a9fedc8a038785657d GIT binary patch literal 221 zcmZ8bI|{-;6x=lmB6tT|3w@}q2!dGJX&W~2C9cVSc)KbA@8KCdhPB7=1d=Y5o7RDW z`4#gX4hJmYr4ISJ!`P=a|ERkmd9aF&`R>Um%vjxSnmZ`%A%(p|alXPew1MvpG2FabiVUh#Vc{WK+mUD7+aeKx&Vai8M5c ia0qcMwe)d3wN=w!Ds#M)xT0P-!vkF_z7gk~qM&{&bUuIp literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/base.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01d013f66437ade8710940fe346c102941b57808 GIT binary patch literal 14898 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 E1O77jG5`Po literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/utilities.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/__pycache__/utilities.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..208f04149d08cdf0d665d644df9bc5da48c90de3 GIT binary patch literal 2421 zcmbVN%}?A$6d!xNi`kE;P`*XM3RTsWT3c-+1(K>2A*G5EEr^dE_F@@(SiE@c?RXYM zM5RYspm;|SuyztD3pta?~v^%nKe8_9CYsqgt?S-w)WW9iL!=I1wW-uunZzZVKw z0`0fj50#l-LSExb(%?O8?Gb^HePWR^u>?zWgt7pA$`Na+a!Mc~`JPzP9kRlId&X>m@OXGV=~du&tv8@-l_LLed1?A{-e9=7%e(CrgSAnl|qT0%Jm+opn? zKIhfy4&}DzzWi)f;mqE$4M(wYvPNBQ;0kVuuGLGhS~`*fS=U_%Lf3<=uGc)P;ovy0 z>pwOOCtm5%b;~n#{fM+Nl6OC8HJ59qw(3*nYx9&-S9!{8%hsM!f0KK4t>_bc^_FE!uh^z*u5ZWEwe=(&S|?M!hCyqMB(rLL zhhYUmGYA8}2h1LMJ4DhCSw2}gN(Ft8>zeHvj$WhOuncYllIdAA=&4cPhfV)ek_-BB zW6d|2T@TZ&{%e}M;cAIxFtQw)FvbFoK1|FM43cwuQnZZ34^g;5uXL^p#s7dWD%FGnFN*ZPl-`nG0_6bkuMRv)q zuqz(N*kw`_jBjCaj!}aHrH$+KQH)B3(F(B3t%Mw}z+S+!Fb-tgmf5BJv_j&ncC zPB-1dlA-8Dga}ndJh^y)0bDDEYB@HTU>dzPztX}c#3OM`cD2j z`gMK7J^>FXY5uQZ&QpRQycs9L6X7-K|BGlBnVj(OOp8hiD;C5<(uu`_w_ zT$FmV?Q~B%bCCwj#dtxO0bolSY)XSypu^{42BEzO1=Jgb3{7>Qk;9fW*_0*^1`hb) X%E<%B;*fYs`rl@A!b}@HN7?)bh+1#C literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/base.py b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/base.py new file mode 100644 index 0000000..d1c0b07 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/base.py @@ -0,0 +1,328 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The base interface of RPC Framework. + +Implementations of this interface support the conduct of "operations": +exchanges between two distinct ends of an arbitrary number of data payloads +and metadata such as a name for the operation, initial and terminal metadata +in each direction, and flow control. These operations may be used for transfers +of data, remote procedure calls, status indication, or anything else +applications choose. +""" + +# threading is referenced from specification in this module. +import abc +import enum +import threading # pylint: disable=unused-import + +# pylint: disable=too-many-arguments + + +class NoSuchMethodError(Exception): + """Indicates that an unrecognized operation has been called. + + Attributes: + code: A code value to communicate to the other side of the operation + along with indication of operation termination. May be None. + details: A details value to communicate to the other side of the + operation along with indication of operation termination. May be None. + """ + + def __init__(self, code, details): + """Constructor. + + Args: + code: A code value to communicate to the other side of the operation + along with indication of operation termination. May be None. + details: A details value to communicate to the other side of the + operation along with indication of operation termination. May be None. + """ + super(NoSuchMethodError, self).__init__() + self.code = code + self.details = details + + +class Outcome(object): + """The outcome of an operation. + + Attributes: + kind: A Kind value coarsely identifying how the operation terminated. + code: An application-specific code value or None if no such value was + provided. + details: An application-specific details value or None if no such value was + provided. + """ + + @enum.unique + class Kind(enum.Enum): + """Ways in which an operation can terminate.""" + + COMPLETED = "completed" + CANCELLED = "cancelled" + EXPIRED = "expired" + LOCAL_SHUTDOWN = "local shutdown" + REMOTE_SHUTDOWN = "remote shutdown" + RECEPTION_FAILURE = "reception failure" + TRANSMISSION_FAILURE = "transmission failure" + LOCAL_FAILURE = "local failure" + REMOTE_FAILURE = "remote failure" + + +class Completion(abc.ABC): + """An aggregate of the values exchanged upon operation completion. + + Attributes: + terminal_metadata: A terminal metadata value for the operaton. + code: A code value for the operation. + message: A message value for the operation. + """ + + +class OperationContext(abc.ABC): + """Provides operation-related information and action.""" + + @abc.abstractmethod + def outcome(self): + """Indicates the operation's outcome (or that the operation is ongoing). + + Returns: + None if the operation is still active or the Outcome value for the + operation if it has terminated. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_termination_callback(self, callback): + """Adds a function to be called upon operation termination. + + Args: + callback: A callable to be passed an Outcome value on operation + termination. + + Returns: + None if the operation has not yet terminated and the passed callback will + later be called when it does terminate, or if the operation has already + terminated an Outcome value describing the operation termination and the + passed callback will not be called as a result of this method call. + """ + raise NotImplementedError() + + @abc.abstractmethod + def time_remaining(self): + """Describes the length of allowed time remaining for the operation. + + Returns: + A nonnegative float indicating the length of allowed time in seconds + remaining for the operation to complete before it is considered to have + timed out. Zero is returned if the operation has terminated. + """ + raise NotImplementedError() + + @abc.abstractmethod + def cancel(self): + """Cancels the operation if the operation has not yet terminated.""" + raise NotImplementedError() + + @abc.abstractmethod + def fail(self, exception): + """Indicates that the operation has failed. + + Args: + exception: An exception germane to the operation failure. May be None. + """ + raise NotImplementedError() + + +class Operator(abc.ABC): + """An interface through which to participate in an operation.""" + + @abc.abstractmethod + def advance( + self, + initial_metadata=None, + payload=None, + completion=None, + allowance=None, + ): + """Progresses the operation. + + Args: + initial_metadata: An initial metadata value. Only one may ever be + communicated in each direction for an operation, and they must be + communicated no later than either the first payload or the completion. + payload: A payload value. + completion: A Completion value. May only ever be non-None once in either + direction, and no payloads may be passed after it has been communicated. + allowance: A positive integer communicating the number of additional + payloads allowed to be passed by the remote side of the operation. + """ + raise NotImplementedError() + + +class ProtocolReceiver(abc.ABC): + """A means of receiving protocol values during an operation.""" + + @abc.abstractmethod + def context(self, protocol_context): + """Accepts the protocol context object for the operation. + + Args: + protocol_context: The protocol context object for the operation. + """ + raise NotImplementedError() + + +class Subscription(abc.ABC): + """Describes customer code's interest in values from the other side. + + Attributes: + kind: A Kind value describing the overall kind of this value. + termination_callback: A callable to be passed the Outcome associated with + the operation after it has terminated. Must be non-None if kind is + Kind.TERMINATION_ONLY. Must be None otherwise. + allowance: A callable behavior that accepts positive integers representing + the number of additional payloads allowed to be passed to the other side + of the operation. Must be None if kind is Kind.FULL. Must not be None + otherwise. + operator: An Operator to be passed values from the other side of the + operation. Must be non-None if kind is Kind.FULL. Must be None otherwise. + protocol_receiver: A ProtocolReceiver to be passed protocol objects as they + become available during the operation. Must be non-None if kind is + Kind.FULL. + """ + + @enum.unique + class Kind(enum.Enum): + NONE = "none" + TERMINATION_ONLY = "termination only" + FULL = "full" + + +class Servicer(abc.ABC): + """Interface for service implementations.""" + + @abc.abstractmethod + def service(self, group, method, context, output_operator): + """Services an operation. + + Args: + group: The group identifier of the operation to be serviced. + method: The method identifier of the operation to be serviced. + context: An OperationContext object affording contextual information and + actions. + output_operator: An Operator that will accept output values of the + operation. + + Returns: + A Subscription via which this object may or may not accept more values of + the operation. + + Raises: + NoSuchMethodError: If this Servicer does not handle operations with the + given group and method. + abandonment.Abandoned: If the operation has been aborted and there no + longer is any reason to service the operation. + """ + raise NotImplementedError() + + +class End(abc.ABC): + """Common type for entry-point objects on both sides of an operation.""" + + @abc.abstractmethod + def start(self): + """Starts this object's service of operations.""" + raise NotImplementedError() + + @abc.abstractmethod + def stop(self, grace): + """Stops this object's service of operations. + + This object will refuse service of new operations as soon as this method is + called but operations under way at the time of the call may be given a + grace period during which they are allowed to finish. + + Args: + grace: A duration of time in seconds to allow ongoing operations to + terminate before being forcefully terminated by the stopping of this + End. May be zero to terminate all ongoing operations and immediately + stop. + + Returns: + A threading.Event that will be set to indicate all operations having + terminated and this End having completely stopped. The returned event + may not be set until after the full grace period (if some ongoing + operation continues for the full length of the period) or it may be set + much sooner (if for example this End had no operations in progress at + the time its stop method was called). + """ + raise NotImplementedError() + + @abc.abstractmethod + def operate( + self, + group, + method, + subscription, + timeout, + initial_metadata=None, + payload=None, + completion=None, + protocol_options=None, + ): + """Commences an operation. + + Args: + group: The group identifier of the invoked operation. + method: The method identifier of the invoked operation. + subscription: A Subscription to which the results of the operation will be + passed. + timeout: A length of time in seconds to allow for the operation. + initial_metadata: An initial metadata value to be sent to the other side + of the operation. May be None if the initial metadata will be later + passed via the returned operator or if there will be no initial metadata + passed at all. + payload: An initial payload for the operation. + completion: A Completion value indicating the end of transmission to the + other side of the operation. + protocol_options: A value specified by the provider of a Base interface + implementation affording custom state and behavior. + + Returns: + A pair of objects affording information about the operation and action + continuing the operation. The first element of the returned pair is an + OperationContext for the operation and the second element of the + returned pair is an Operator to which operation values not passed in + this call should later be passed. + """ + raise NotImplementedError() + + @abc.abstractmethod + def operation_stats(self): + """Reports the number of terminated operations broken down by outcome. + + Returns: + A dictionary from Outcome.Kind value to an integer identifying the number + of operations that terminated with that outcome kind. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_idle_action(self, action): + """Adds an action to be called when this End has no ongoing operations. + + Args: + action: A callable that accepts no arguments. + """ + raise NotImplementedError() diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/utilities.py b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/utilities.py new file mode 100644 index 0000000..d188339 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/base/utilities.py @@ -0,0 +1,83 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Utilities for use with the base interface of RPC Framework.""" + +import collections + +from grpc.framework.interfaces.base import base + + +class _Completion( + base.Completion, + collections.namedtuple( + "_Completion", + ( + "terminal_metadata", + "code", + "message", + ), + ), +): + """A trivial implementation of base.Completion.""" + + +class _Subscription( + base.Subscription, + collections.namedtuple( + "_Subscription", + ( + "kind", + "termination_callback", + "allowance", + "operator", + "protocol_receiver", + ), + ), +): + """A trivial implementation of base.Subscription.""" + + +_NONE_SUBSCRIPTION = _Subscription( + base.Subscription.Kind.NONE, None, None, None, None +) + + +def completion(terminal_metadata, code, message): + """Creates a base.Completion aggregating the given operation values. + + Args: + terminal_metadata: A terminal metadata value for an operaton. + code: A code value for an operation. + message: A message value for an operation. + + Returns: + A base.Completion aggregating the given operation values. + """ + return _Completion(terminal_metadata, code, message) + + +def full_subscription(operator, protocol_receiver): + """Creates a "full" base.Subscription for the given base.Operator. + + Args: + operator: A base.Operator to be used in an operation. + protocol_receiver: A base.ProtocolReceiver to be used in an operation. + + Returns: + A base.Subscription of kind base.Subscription.Kind.FULL wrapping the given + base.Operator and base.ProtocolReceiver. + """ + return _Subscription( + base.Subscription.Kind.FULL, None, None, operator, protocol_receiver + ) diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__init__.py b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__init__.py new file mode 100644 index 0000000..5fb4f3c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f57d055ffb4ca35d1f333ad0ee621ae2f031c0e9 GIT binary patch literal 221 zcmZ9GJqp4=5QTUB0TH}|t%VM1D?%Vx+G!hNoWwQRA7)o&!FzZHk74aGJb|Q3<)-z) z4DZc+#e0uNLl*Rs`y%Qv_G!bv>Rz}!m}e8deKHCdt6QeIgH#SO*jXeC8+53~F^Qvq z7;Wja0YmzXE>cz;Dg^0KU7->OFy5WCTF&MRu)^Wgq*<93XrUmJK~AZ}o2C+ka!7fa kg-^R7NrVzENoK}3gO$|BONDFdhcY~jZOymKIj3%LKPfyubN~PV literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__pycache__/face.cpython-312.pyc b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/__pycache__/face.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a9d89b097cb54516a3afbd5208c52a2ecba8d6f GIT binary patch literal 44211 zcmeHQdu$xXdEX=N$RjB}MM>1lT0Ls(Wa;R)4cU%E)0D$VIysaSCv*#DdAFoaI^Hq6 zcanKEQae!-8P3CQ8`y4Y*g=Xqii4y@6BH?o25B1vXbYr93|PG+fQu9;3KS@9(rMs- z+TS;?o!#3b??gJ1Y@Woqx!G@Lzj=Jm`DXT?J3HGAe10_Z@#+4r8OE>Zhy27vW?`z? zFrGCs#<-D*WSVl3@d*2F8gF9X&Ew7ZZq7w#V&kz0!9uIJv)A33ZFH!e(visKIzD~Q{ zj-1}6-@)_W?s_H4bK~6%x*O0vcDJgdhn4oCv`;JTWu@y;+OL)NvC<7F-KdqWXQi7^ zI-r&Iv(n8d-J+FlV5M78x=kzH$V#`P^g6U6S=|bS?Er(^0Z7vxShmHR8T3v-@2UfO z3xnPb=sn9|v6Vso4j`{z267vNyaAAVmx0{QAQOPxw+!TU4Dv=m?q3FS2ZKBS$mBAR zCW9OVEDbjd9iW`J(Gkg?5T!OZ3}*|b%( zO)GDf@{XM@Oy{#@0MD=rlI`s#K10Q#lbtLTZTBGiZJN_gp)`BYJb_MNS!zG^NN62Y zg=yx|GyD$9Eqg;+@F3PHl&8OiLrA_FdDbYhVoHj#r;NvpFLfBkE8sa$1#k#NTR9yo#8?rU0+HU3yx?hAv)wtt9H`wsK<*Wmg(@CIh z6BFs2<+>9SE_DGAdi>o-2WRrd!Svus*LK{&Lw3>5n-4hIOm^@A+dWe(%nr^vh0}I% zDDP$`bN1lOoSi>An9EKM&dyie9NGlE!qcWt@Igd+I9!0o!Ru@lq7+{tRkC1 zA|93`XXhM@l2P7LHBpnYJ=f#9yA#Q89yb=djJB@VyLPDQ zqI=6t`^|SFiA0mv#TO$^7bT-WoJk3RL$ zOZYnc)ZzJ9b5Hxc(cISV^x|@&mFlBuh4F5mn3ySKN;%4}o0#}?$;yc;C_8$Z=`jkHWf{W4Dh*Vco8xs;Ayc3up;eg9N)zq5p-KRPw ztjQVlZ8qofXNezT=o)#PdWOG>>L>bUx8y4e`!P%Xvpds7vUfa|iH^5qV&koumhpI| zb-XPTA8(&)OSHe+DQ9ewW?OmViMd&54?;^&Gquu|w(>-ncBay5KRTOr>`b{US4dkq z(>+xxW(w!>Ew6FpIzbx@%y5|xEE)LQR)h32cA8KKbJI{^Txl&_q^G^<3ih| zzO5HpFKtd-=(@D!#tYp%8Mxs>C(54e; zCeskiBIcVpRd7uE(X>5FtkadsUJZU3Y{&|koJQ+)v$(3B<2cCT#u=Q3M0F*#*xP%+ z+^QMP>N2)v*&3-u@IsiU@k=TO#+;Feq!O(T=>pDelrYU? zka9OsLJE*`3z9?&)1aJ?OI&54I-$8jcjc7K)X0sJ&oVktDr63@F4^l)A%79?{Nl`W zCti!+_}pii!21n$!(>7lH%P9gIwY>d%ZV0K)p+_IPE;l1UK{m^rm5WII+xoKA-5oNu>d7$b% zrysTG$|n>-m^RQoHv~I~6}tp}1Cqy?+L?MX^~Sp0KU=q(l+V$pM(OLwQ%B}oqojjI zl@1!ldHI0eiMkxpW1X#3HHl84Ua~=_WP&az^|Br62>xaFG|73QrAwahA#kxPo$Dd<*{Hq0F*e3Pk*(a^R9 zgvUWV+M(q4@#oT%KW|i`w{p2aH`C>3`lk}2nI zJTxfc?xiwH{s4ap%Yz(CDsKqOz9XcL92eRM@7UqmhzdSi1dbW#=65bo>8nCj$5{((l259nUYU_V6IQ}P8J`xM8X${WIdU5e{@yw7h5 zpzXquW7_25F$?K*$${!k8sL@;X zw6Mg)fJey*K@m7bBJRsX}pdW;SQf zz>#NjH))jwZOgh7gxp!X-0!t2sY?G8xVhwAgOjSo=-&0SuHF9{-_6Fl@y1wKnK8Wf zP&;yVe!6&y7>`{EVf1O$Xmrs%@TZB!mp5xe;=lBwHZFaEagihk5G;7rGs*sC%%0A= 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 Zrl8l8caI9`CujSLH-vQa90)$2e*gq{zd!&0 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/face.py b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/face.py new file mode 100644 index 0000000..9239fcc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/face.py @@ -0,0 +1,1084 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Interfaces defining the Face layer of RPC Framework.""" + +import abc +import collections +import enum + +# cardinality, style, abandonment, future, and stream are +# referenced from specification in this module. +from grpc.framework.common import cardinality # pylint: disable=unused-import +from grpc.framework.common import style # pylint: disable=unused-import +from grpc.framework.foundation import future # pylint: disable=unused-import +from grpc.framework.foundation import stream # pylint: disable=unused-import + +# pylint: disable=too-many-arguments + + +class NoSuchMethodError(Exception): + """Raised by customer code to indicate an unrecognized method. + + Attributes: + group: The group of the unrecognized method. + name: The name of the unrecognized method. + """ + + def __init__(self, group, method): + """Constructor. + + Args: + group: The group identifier of the unrecognized RPC name. + method: The method identifier of the unrecognized RPC name. + """ + super(NoSuchMethodError, self).__init__() + self.group = group + self.method = method + + def __repr__(self): + return "face.NoSuchMethodError(%s, %s)" % ( + self.group, + self.method, + ) + + +class Abortion( + collections.namedtuple( + "Abortion", + ( + "kind", + "initial_metadata", + "terminal_metadata", + "code", + "details", + ), + ) +): + """A value describing RPC abortion. + + Attributes: + kind: A Kind value identifying how the RPC failed. + initial_metadata: The initial metadata from the other side of the RPC or + None if no initial metadata value was received. + terminal_metadata: The terminal metadata from the other side of the RPC or + None if no terminal metadata value was received. + code: The code value from the other side of the RPC or None if no code value + was received. + details: The details value from the other side of the RPC or None if no + details value was received. + """ + + @enum.unique + class Kind(enum.Enum): + """Types of RPC abortion.""" + + CANCELLED = "cancelled" + EXPIRED = "expired" + LOCAL_SHUTDOWN = "local shutdown" + REMOTE_SHUTDOWN = "remote shutdown" + NETWORK_FAILURE = "network failure" + LOCAL_FAILURE = "local failure" + REMOTE_FAILURE = "remote failure" + + +class AbortionError(Exception, metaclass=abc.ABCMeta): + """Common super type for exceptions indicating RPC abortion. + + initial_metadata: The initial metadata from the other side of the RPC or + None if no initial metadata value was received. + terminal_metadata: The terminal metadata from the other side of the RPC or + None if no terminal metadata value was received. + code: The code value from the other side of the RPC or None if no code value + was received. + details: The details value from the other side of the RPC or None if no + details value was received. + """ + + def __init__(self, initial_metadata, terminal_metadata, code, details): + super(AbortionError, self).__init__() + self.initial_metadata = initial_metadata + self.terminal_metadata = terminal_metadata + self.code = code + self.details = details + + def __str__(self): + return '%s(code=%s, details="%s")' % ( + self.__class__.__name__, + self.code, + self.details, + ) + + +class CancellationError(AbortionError): + """Indicates that an RPC has been cancelled.""" + + +class ExpirationError(AbortionError): + """Indicates that an RPC has expired ("timed out").""" + + +class LocalShutdownError(AbortionError): + """Indicates that an RPC has terminated due to local shutdown of RPCs.""" + + +class RemoteShutdownError(AbortionError): + """Indicates that an RPC has terminated due to remote shutdown of RPCs.""" + + +class NetworkError(AbortionError): + """Indicates that some error occurred on the network.""" + + +class LocalError(AbortionError): + """Indicates that an RPC has terminated due to a local defect.""" + + +class RemoteError(AbortionError): + """Indicates that an RPC has terminated due to a remote defect.""" + + +class RpcContext(abc.ABC): + """Provides RPC-related information and action.""" + + @abc.abstractmethod + def is_active(self): + """Describes whether the RPC is active or has terminated.""" + raise NotImplementedError() + + @abc.abstractmethod + def time_remaining(self): + """Describes the length of allowed time remaining for the RPC. + + Returns: + A nonnegative float indicating the length of allowed time in seconds + remaining for the RPC to complete before it is considered to have timed + out. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_abortion_callback(self, abortion_callback): + """Registers a callback to be called if the RPC is aborted. + + Args: + abortion_callback: A callable to be called and passed an Abortion value + in the event of RPC abortion. + """ + raise NotImplementedError() + + @abc.abstractmethod + def cancel(self): + """Cancels the RPC. + + Idempotent and has no effect if the RPC has already terminated. + """ + raise NotImplementedError() + + @abc.abstractmethod + def protocol_context(self): + """Accesses a custom object specified by an implementation provider. + + Returns: + A value specified by the provider of a Face interface implementation + affording custom state and behavior. + """ + raise NotImplementedError() + + +class Call(RpcContext, metaclass=abc.ABCMeta): + """Invocation-side utility object for an RPC.""" + + @abc.abstractmethod + def initial_metadata(self): + """Accesses the initial metadata from the service-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the service-side of the RPC. + + Returns: + The initial metadata object emitted by the service-side of the RPC, or + None if there was no such value. + """ + raise NotImplementedError() + + @abc.abstractmethod + def terminal_metadata(self): + """Accesses the terminal metadata from the service-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the service-side of the RPC. + + Returns: + The terminal metadata object emitted by the service-side of the RPC, or + None if there was no such value. + """ + raise NotImplementedError() + + @abc.abstractmethod + def code(self): + """Accesses the code emitted by the service-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the service-side of the RPC. + + Returns: + The code object emitted by the service-side of the RPC, or None if there + was no such value. + """ + raise NotImplementedError() + + @abc.abstractmethod + def details(self): + """Accesses the details value emitted by the service-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the service-side of the RPC. + + Returns: + The details value emitted by the service-side of the RPC, or None if there + was no such value. + """ + raise NotImplementedError() + + +class ServicerContext(RpcContext, metaclass=abc.ABCMeta): + """A context object passed to method implementations.""" + + @abc.abstractmethod + def invocation_metadata(self): + """Accesses the metadata from the invocation-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the invocation-side of the RPC. + + Returns: + The metadata object emitted by the invocation-side of the RPC, or None if + there was no such value. + """ + raise NotImplementedError() + + @abc.abstractmethod + def initial_metadata(self, initial_metadata): + """Accepts the service-side initial metadata value of the RPC. + + This method need not be called by method implementations if they have no + service-side initial metadata to transmit. + + Args: + initial_metadata: The service-side initial metadata value of the RPC to + be transmitted to the invocation side of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def terminal_metadata(self, terminal_metadata): + """Accepts the service-side terminal metadata value of the RPC. + + This method need not be called by method implementations if they have no + service-side terminal metadata to transmit. + + Args: + terminal_metadata: The service-side terminal metadata value of the RPC to + be transmitted to the invocation side of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def code(self, code): + """Accepts the service-side code of the RPC. + + This method need not be called by method implementations if they have no + code to transmit. + + Args: + code: The code of the RPC to be transmitted to the invocation side of the + RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def details(self, details): + """Accepts the service-side details of the RPC. + + This method need not be called by method implementations if they have no + service-side details to transmit. + + Args: + details: The service-side details value of the RPC to be transmitted to + the invocation side of the RPC. + """ + raise NotImplementedError() + + +class ResponseReceiver(abc.ABC): + """Invocation-side object used to accept the output of an RPC.""" + + @abc.abstractmethod + def initial_metadata(self, initial_metadata): + """Receives the initial metadata from the service-side of the RPC. + + Args: + initial_metadata: The initial metadata object emitted from the + service-side of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def response(self, response): + """Receives a response from the service-side of the RPC. + + Args: + response: A response object emitted from the service-side of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def complete(self, terminal_metadata, code, details): + """Receives the completion values emitted from the service-side of the RPC. + + Args: + terminal_metadata: The terminal metadata object emitted from the + service-side of the RPC. + code: The code object emitted from the service-side of the RPC. + details: The details object emitted from the service-side of the RPC. + """ + raise NotImplementedError() + + +class UnaryUnaryMultiCallable(abc.ABC): + """Affords invoking a unary-unary RPC in any call style.""" + + @abc.abstractmethod + def __call__( + self, + request, + timeout, + metadata=None, + with_call=False, + protocol_options=None, + ): + """Synchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + with_call: Whether or not to include return a Call for the RPC in addition + to the response. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + The response value for the RPC, and a Call for the RPC if with_call was + set to True at invocation. + + Raises: + AbortionError: Indicating that the RPC was aborted. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future(self, request, timeout, metadata=None, protocol_options=None): + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + An object that is both a Call for the RPC and a future.Future. In the + event of RPC completion, the return Future's result value will be the + response value of the RPC. In the event of RPC abortion, the returned + Future's exception value will be an AbortionError. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event( + self, + request, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + A Call for the RPC. + """ + raise NotImplementedError() + + +class UnaryStreamMultiCallable(abc.ABC): + """Affords invoking a unary-stream RPC in any call style.""" + + @abc.abstractmethod + def __call__(self, request, timeout, metadata=None, protocol_options=None): + """Invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + An object that is both a Call for the RPC and an iterator of response + values. Drawing response values from the returned iterator may raise + AbortionError indicating abortion of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event( + self, + request, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + A Call object for the RPC. + """ + raise NotImplementedError() + + +class StreamUnaryMultiCallable(abc.ABC): + """Affords invoking a stream-unary RPC in any call style.""" + + @abc.abstractmethod + def __call__( + self, + request_iterator, + timeout, + metadata=None, + with_call=False, + protocol_options=None, + ): + """Synchronously invokes the underlying RPC. + + Args: + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + with_call: Whether or not to include return a Call for the RPC in addition + to the response. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + The response value for the RPC, and a Call for the RPC if with_call was + set to True at invocation. + + Raises: + AbortionError: Indicating that the RPC was aborted. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future( + self, request_iterator, timeout, metadata=None, protocol_options=None + ): + """Asynchronously invokes the underlying RPC. + + Args: + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + An object that is both a Call for the RPC and a future.Future. In the + event of RPC completion, the return Future's result value will be the + response value of the RPC. In the event of RPC abortion, the returned + Future's exception value will be an AbortionError. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event( + self, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + """Asynchronously invokes the underlying RPC. + + Args: + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + A single object that is both a Call object for the RPC and a + stream.Consumer to which the request values of the RPC should be passed. + """ + raise NotImplementedError() + + +class StreamStreamMultiCallable(abc.ABC): + """Affords invoking a stream-stream RPC in any call style.""" + + @abc.abstractmethod + def __call__( + self, request_iterator, timeout, metadata=None, protocol_options=None + ): + """Invokes the underlying RPC. + + Args: + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + An object that is both a Call for the RPC and an iterator of response + values. Drawing response values from the returned iterator may raise + AbortionError indicating abortion of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event( + self, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + """Asynchronously invokes the underlying RPC. + + Args: + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + A single object that is both a Call object for the RPC and a + stream.Consumer to which the request values of the RPC should be passed. + """ + raise NotImplementedError() + + +class MethodImplementation(abc.ABC): + """A sum type that describes a method implementation. + + Attributes: + cardinality: A cardinality.Cardinality value. + style: A style.Service value. + unary_unary_inline: The implementation of the method as a callable value + that takes a request value and a ServicerContext object and returns a + response value. Only non-None if cardinality is + cardinality.Cardinality.UNARY_UNARY and style is style.Service.INLINE. + unary_stream_inline: The implementation of the method as a callable value + that takes a request value and a ServicerContext object and returns an + iterator of response values. Only non-None if cardinality is + cardinality.Cardinality.UNARY_STREAM and style is style.Service.INLINE. + stream_unary_inline: The implementation of the method as a callable value + that takes an iterator of request values and a ServicerContext object and + returns a response value. Only non-None if cardinality is + cardinality.Cardinality.STREAM_UNARY and style is style.Service.INLINE. + stream_stream_inline: The implementation of the method as a callable value + that takes an iterator of request values and a ServicerContext object and + returns an iterator of response values. Only non-None if cardinality is + cardinality.Cardinality.STREAM_STREAM and style is style.Service.INLINE. + unary_unary_event: The implementation of the method as a callable value that + takes a request value, a response callback to which to pass the response + value of the RPC, and a ServicerContext. Only non-None if cardinality is + cardinality.Cardinality.UNARY_UNARY and style is style.Service.EVENT. + unary_stream_event: The implementation of the method as a callable value + that takes a request value, a stream.Consumer to which to pass the + response values of the RPC, and a ServicerContext. Only non-None if + cardinality is cardinality.Cardinality.UNARY_STREAM and style is + style.Service.EVENT. + stream_unary_event: The implementation of the method as a callable value + that takes a response callback to which to pass the response value of the + RPC and a ServicerContext and returns a stream.Consumer to which the + request values of the RPC should be passed. Only non-None if cardinality + is cardinality.Cardinality.STREAM_UNARY and style is style.Service.EVENT. + stream_stream_event: The implementation of the method as a callable value + that takes a stream.Consumer to which to pass the response values of the + RPC and a ServicerContext and returns a stream.Consumer to which the + request values of the RPC should be passed. Only non-None if cardinality + is cardinality.Cardinality.STREAM_STREAM and style is + style.Service.EVENT. + """ + + +class MultiMethodImplementation(abc.ABC): + """A general type able to service many methods.""" + + @abc.abstractmethod + def service(self, group, method, response_consumer, context): + """Services an RPC. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + response_consumer: A stream.Consumer to be called to accept the response + values of the RPC. + context: a ServicerContext object. + + Returns: + A stream.Consumer with which to accept the request values of the RPC. The + consumer returned from this method may or may not be invoked to + completion: in the case of RPC abortion, RPC Framework will simply stop + passing values to this object. Implementations must not assume that this + object will be called to completion of the request stream or even called + at all. + + Raises: + abandonment.Abandoned: May or may not be raised when the RPC has been + aborted. + NoSuchMethodError: If this MultiMethod does not recognize the given group + and name for the RPC and is not able to service the RPC. + """ + raise NotImplementedError() + + +class GenericStub(abc.ABC): + """Affords RPC invocation via generic methods.""" + + @abc.abstractmethod + def blocking_unary_unary( + self, + group, + method, + request, + timeout, + metadata=None, + with_call=False, + protocol_options=None, + ): + """Invokes a unary-request-unary-response method. + + This method blocks until either returning the response value of the RPC + (in the event of RPC completion) or raising an exception (in the event of + RPC abortion). + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + with_call: Whether or not to include return a Call for the RPC in addition + to the response. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + The response value for the RPC, and a Call for the RPC if with_call was + set to True at invocation. + + Raises: + AbortionError: Indicating that the RPC was aborted. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future_unary_unary( + self, + group, + method, + request, + timeout, + metadata=None, + protocol_options=None, + ): + """Invokes a unary-request-unary-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + An object that is both a Call for the RPC and a future.Future. In the + event of RPC completion, the return Future's result value will be the + response value of the RPC. In the event of RPC abortion, the returned + Future's exception value will be an AbortionError. + """ + raise NotImplementedError() + + @abc.abstractmethod + def inline_unary_stream( + self, + group, + method, + request, + timeout, + metadata=None, + protocol_options=None, + ): + """Invokes a unary-request-stream-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + An object that is both a Call for the RPC and an iterator of response + values. Drawing response values from the returned iterator may raise + AbortionError indicating abortion of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def blocking_stream_unary( + self, + group, + method, + request_iterator, + timeout, + metadata=None, + with_call=False, + protocol_options=None, + ): + """Invokes a stream-request-unary-response method. + + This method blocks until either returning the response value of the RPC + (in the event of RPC completion) or raising an exception (in the event of + RPC abortion). + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + with_call: Whether or not to include return a Call for the RPC in addition + to the response. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + The response value for the RPC, and a Call for the RPC if with_call was + set to True at invocation. + + Raises: + AbortionError: Indicating that the RPC was aborted. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future_stream_unary( + self, + group, + method, + request_iterator, + timeout, + metadata=None, + protocol_options=None, + ): + """Invokes a stream-request-unary-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + An object that is both a Call for the RPC and a future.Future. In the + event of RPC completion, the return Future's result value will be the + response value of the RPC. In the event of RPC abortion, the returned + Future's exception value will be an AbortionError. + """ + raise NotImplementedError() + + @abc.abstractmethod + def inline_stream_stream( + self, + group, + method, + request_iterator, + timeout, + metadata=None, + protocol_options=None, + ): + """Invokes a stream-request-stream-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + An object that is both a Call for the RPC and an iterator of response + values. Drawing response values from the returned iterator may raise + AbortionError indicating abortion of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event_unary_unary( + self, + group, + method, + request, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + """Event-driven invocation of a unary-request-unary-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + A Call for the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event_unary_stream( + self, + group, + method, + request, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + """Event-driven invocation of a unary-request-stream-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + A Call for the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event_stream_unary( + self, + group, + method, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + """Event-driven invocation of a unary-request-unary-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + A pair of a Call object for the RPC and a stream.Consumer to which the + request values of the RPC should be passed. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event_stream_stream( + self, + group, + method, + receiver, + abortion_callback, + timeout, + metadata=None, + protocol_options=None, + ): + """Event-driven invocation of a unary-request-stream-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + protocol_options: A value specified by the provider of a Face interface + implementation affording custom state and behavior. + + Returns: + A pair of a Call object for the RPC and a stream.Consumer to which the + request values of the RPC should be passed. + """ + raise NotImplementedError() + + @abc.abstractmethod + def unary_unary(self, group, method): + """Creates a UnaryUnaryMultiCallable for a unary-unary method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + + Returns: + A UnaryUnaryMultiCallable value for the named unary-unary method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def unary_stream(self, group, method): + """Creates a UnaryStreamMultiCallable for a unary-stream method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + + Returns: + A UnaryStreamMultiCallable value for the name unary-stream method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def stream_unary(self, group, method): + """Creates a StreamUnaryMultiCallable for a stream-unary method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + + Returns: + A StreamUnaryMultiCallable value for the named stream-unary method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def stream_stream(self, group, method): + """Creates a StreamStreamMultiCallable for a stream-stream method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + + Returns: + A StreamStreamMultiCallable value for the named stream-stream method. + """ + raise NotImplementedError() + + +class DynamicStub(abc.ABC): + """Affords RPC invocation via attributes corresponding to afforded methods. + + Instances of this type may be scoped to a single group so that attribute + access is unambiguous. + + Instances of this type respond to attribute access as follows: if the + requested attribute is the name of a unary-unary method, the value of the + attribute will be a UnaryUnaryMultiCallable with which to invoke an RPC; if + the requested attribute is the name of a unary-stream method, the value of the + attribute will be a UnaryStreamMultiCallable with which to invoke an RPC; if + the requested attribute is the name of a stream-unary method, the value of the + attribute will be a StreamUnaryMultiCallable with which to invoke an RPC; and + if the requested attribute is the name of a stream-stream method, the value of + the attribute will be a StreamStreamMultiCallable with which to invoke an RPC. + """ diff --git a/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/utilities.py b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/utilities.py new file mode 100644 index 0000000..01807a1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpc/framework/interfaces/face/utilities.py @@ -0,0 +1,245 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Utilities for RPC Framework's Face interface.""" + +import collections + +# stream is referenced from specification in this module. +from grpc.framework.common import cardinality +from grpc.framework.common import style +from grpc.framework.foundation import stream # pylint: disable=unused-import +from grpc.framework.interfaces.face import face + + +class _MethodImplementation( + face.MethodImplementation, + collections.namedtuple( + "_MethodImplementation", + [ + "cardinality", + "style", + "unary_unary_inline", + "unary_stream_inline", + "stream_unary_inline", + "stream_stream_inline", + "unary_unary_event", + "unary_stream_event", + "stream_unary_event", + "stream_stream_event", + ], + ), +): + pass + + +def unary_unary_inline(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a unary-unary RPC method as a callable value + that takes a request value and an face.ServicerContext object and + returns a response value. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.UNARY_UNARY, + style.Service.INLINE, + behavior, + None, + None, + None, + None, + None, + None, + None, + ) + + +def unary_stream_inline(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a unary-stream RPC method as a callable + value that takes a request value and an face.ServicerContext object and + returns an iterator of response values. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.UNARY_STREAM, + style.Service.INLINE, + None, + behavior, + None, + None, + None, + None, + None, + None, + ) + + +def stream_unary_inline(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a stream-unary RPC method as a callable + value that takes an iterator of request values and an + face.ServicerContext object and returns a response value. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.STREAM_UNARY, + style.Service.INLINE, + None, + None, + behavior, + None, + None, + None, + None, + None, + ) + + +def stream_stream_inline(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a stream-stream RPC method as a callable + value that takes an iterator of request values and an + face.ServicerContext object and returns an iterator of response values. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.STREAM_STREAM, + style.Service.INLINE, + None, + None, + None, + behavior, + None, + None, + None, + None, + ) + + +def unary_unary_event(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a unary-unary RPC method as a callable + value that takes a request value, a response callback to which to pass + the response value of the RPC, and an face.ServicerContext. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.UNARY_UNARY, + style.Service.EVENT, + None, + None, + None, + None, + behavior, + None, + None, + None, + ) + + +def unary_stream_event(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a unary-stream RPC method as a callable + value that takes a request value, a stream.Consumer to which to pass the + the response values of the RPC, and an face.ServicerContext. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.UNARY_STREAM, + style.Service.EVENT, + None, + None, + None, + None, + None, + behavior, + None, + None, + ) + + +def stream_unary_event(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a stream-unary RPC method as a callable + value that takes a response callback to which to pass the response value + of the RPC and an face.ServicerContext and returns a stream.Consumer to + which the request values of the RPC should be passed. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.STREAM_UNARY, + style.Service.EVENT, + None, + None, + None, + None, + None, + None, + behavior, + None, + ) + + +def stream_stream_event(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a stream-stream RPC method as a callable + value that takes a stream.Consumer to which to pass the response values + of the RPC and an face.ServicerContext and returns a stream.Consumer to + which the request values of the RPC should be passed. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.STREAM_STREAM, + style.Service.EVENT, + None, + None, + None, + None, + None, + None, + None, + behavior, + ) diff --git a/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/INSTALLER b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/LICENSE b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/LICENSE new file mode 100644 index 0000000..0e09a3e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/LICENSE @@ -0,0 +1,610 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----------------------------------------------------------- + +BSD 3-Clause License + +Copyright 2016, Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------- + +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/METADATA b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/METADATA new file mode 100644 index 0000000..8fbfa92 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/METADATA @@ -0,0 +1,130 @@ +Metadata-Version: 2.1 +Name: grpcio +Version: 1.66.2 +Summary: HTTP/2-based RPC framework +Home-page: https://grpc.io +Author: The gRPC Authors +Author-email: grpc-io@googlegroups.com +License: Apache License 2.0 +Project-URL: Source Code, https://github.com/grpc/grpc +Project-URL: Bug Tracker, https://github.com/grpc/grpc/issues +Project-URL: Documentation, https://grpc.github.io/grpc/python +Classifier: Development Status :: 5 - Production/Stable +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: License :: OSI Approved :: Apache Software License +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-File: LICENSE +Provides-Extra: protobuf +Requires-Dist: grpcio-tools >=1.66.2 ; extra == 'protobuf' + +gRPC Python +=========== + +|compat_check_pypi| + +Package for gRPC Python. + +.. |compat_check_pypi| image:: https://python-compatibility-tools.appspot.com/one_badge_image?package=grpcio + :target: https://python-compatibility-tools.appspot.com/one_badge_target?package=grpcio + + +Installation +------------ + +gRPC Python is available for Linux, macOS, and Windows. + +Installing From PyPI +~~~~~~~~~~~~~~~~~~~~ + +If you are installing locally... + +:: + + $ pip install grpcio + +Else system wide (on Ubuntu)... + +:: + + $ sudo pip install grpcio + +If you're on Windows make sure that you installed the :code:`pip.exe` component +when you installed Python (if not go back and install it!) then invoke: + +:: + + $ pip.exe install grpcio + +Windows users may need to invoke :code:`pip.exe` from a command line ran as +administrator. + +n.b. On Windows and on Mac OS X one *must* have a recent release of :code:`pip` +to retrieve the proper wheel from PyPI. Be sure to upgrade to the latest +version! + +Installing From Source +~~~~~~~~~~~~~~~~~~~~~~ + +Building from source requires that you have the Python headers (usually a +package named :code:`python-dev`). + +:: + + $ export REPO_ROOT=grpc # REPO_ROOT can be any directory of your choice + $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc $REPO_ROOT + $ cd $REPO_ROOT + $ git submodule update --init + + # To include systemd socket-activation feature in the build, + # first install the `libsystemd-dev` package, then : + $ export GRPC_PYTHON_BUILD_WITH_SYSTEMD=1 + + # For the next two commands do `sudo pip install` if you get permission-denied errors + $ pip install -r requirements.txt + $ GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install . + +You cannot currently install Python from source on Windows. Things might work +out for you in MSYS2 (follow the Linux instructions), but it isn't officially +supported at the moment. + +Troubleshooting +~~~~~~~~~~~~~~~ + +Help, I ... + +* **... see the following error on some platforms** + + :: + + /tmp/pip-build-U8pSsr/cython/Cython/Plex/Scanners.c:4:20: fatal error: Python.h: No such file or directory + #include "Python.h" + ^ + compilation terminated. + + You can fix it by installing `python-dev` package. i.e + + :: + + sudo apt-get install python-dev + + +Versioning +~~~~~~~~~~ + +gRPC Python is developed in a monorepo shared with implementations of gRPC in +other programming languages. While the minor versions are released in +lock-step with other languages in the repo (e.g. 1.63.0 is guaranteed to exist +for all languages), patch versions may be specific to only a single +language. For example, if 1.63.1 is a C++-specific patch, 1.63.1 may not be +uploaded to PyPi. As a result, it is __not__ a good assumption that the latest +patch for a given minor version on Github is also the latest patch for that +same minor version on PyPi. + diff --git a/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/RECORD b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/RECORD new file mode 100644 index 0000000..d3ff680 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/RECORD @@ -0,0 +1,120 @@ +grpc/__init__.py,sha256=KPol0m9alVrx4tdvWZGyv2PwPZyZk-5nkfw33MhFN0I,82333 +grpc/__pycache__/__init__.cpython-312.pyc,, +grpc/__pycache__/_auth.cpython-312.pyc,, +grpc/__pycache__/_channel.cpython-312.pyc,, +grpc/__pycache__/_common.cpython-312.pyc,, +grpc/__pycache__/_compression.cpython-312.pyc,, +grpc/__pycache__/_grpcio_metadata.cpython-312.pyc,, +grpc/__pycache__/_interceptor.cpython-312.pyc,, +grpc/__pycache__/_observability.cpython-312.pyc,, +grpc/__pycache__/_plugin_wrapping.cpython-312.pyc,, +grpc/__pycache__/_runtime_protos.cpython-312.pyc,, +grpc/__pycache__/_server.cpython-312.pyc,, +grpc/__pycache__/_simple_stubs.cpython-312.pyc,, +grpc/__pycache__/_typing.cpython-312.pyc,, +grpc/__pycache__/_utilities.cpython-312.pyc,, +grpc/_auth.py,sha256=UNjlkWE4rTsTZlVzJRpgupTJgEJYop-fpTkgJmvien4,2635 +grpc/_channel.py,sha256=sPVbiPQ5BuDx1rgBPlajXi9XH958XCeGGsKXie08Ttw,81346 +grpc/_common.py,sha256=PQdgX83qEG3BUCfXlQVnrv9t5yFD9wjHhrckvX_UkfA,6784 +grpc/_compression.py,sha256=0P9yfNIn33BmcQmOdnMUTogbLIPR0eT_Lmmnm3llcFg,1983 +grpc/_cython/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/_cython/__pycache__/__init__.cpython-312.pyc,, +grpc/_cython/_credentials/roots.pem,sha256=lhQzRMSuEJWIElssQdXa9lSl-vxuI_rDf3uj0p2n53Y,264440 +grpc/_cython/_cygrpc/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/_cython/_cygrpc/__pycache__/__init__.cpython-312.pyc,, +grpc/_cython/cygrpc.cpython-312-x86_64-linux-gnu.so,sha256=NOjtMlvs8OzEwurHxTEdn4Op5gL1ALcFwhRmI5O9Kjg,13247656 +grpc/_grpcio_metadata.py,sha256=x7NVM-VqEpGDz-0JF2neU-5JtESmCWnt122_X9K14Cg,26 +grpc/_interceptor.py,sha256=5qiM2lQWabbBd8IeR6VHzTJKmhz7R2_Tf3m5Xp3C6Y0,25862 +grpc/_observability.py,sha256=U7AOChe7YO61jLo5_8ow0tO83xHInh7mQRuXc9an3m4,10414 +grpc/_plugin_wrapping.py,sha256=sbJLmw0reHc0aBaSQuPuFr9hHnzllEVoDYgrkre7bkk,4382 +grpc/_runtime_protos.py,sha256=CoStQ4extmSIdpxLL9tVEMluMaeTxd768ISfV89Xf-w,5810 +grpc/_server.py,sha256=-gSNAIxK3lkDSlKhITxC_ZqYYwt0hkTDyaWsYNfdbtc,50886 +grpc/_simple_stubs.py,sha256=2hK8LsbRdWhG8kT5DR1p0gLNr5Q818XYox8Sv__w0ws,24610 +grpc/_typing.py,sha256=-wdtuGJpvR10J6r4LSUYTDeRCWpMsQTo67HwowaVOCk,2758 +grpc/_utilities.py,sha256=befrEhsHGPfSuVPEMTNEVaQCPwTD8tKV8yIrge7I4Vo,7043 +grpc/aio/__init__.py,sha256=80Ho1FolpueFqIIvyl7d5b9FJgvw5ilZgHcXxN1NmUs,3160 +grpc/aio/__pycache__/__init__.cpython-312.pyc,, +grpc/aio/__pycache__/_base_call.cpython-312.pyc,, +grpc/aio/__pycache__/_base_channel.cpython-312.pyc,, +grpc/aio/__pycache__/_base_server.cpython-312.pyc,, +grpc/aio/__pycache__/_call.cpython-312.pyc,, +grpc/aio/__pycache__/_channel.cpython-312.pyc,, +grpc/aio/__pycache__/_interceptor.cpython-312.pyc,, +grpc/aio/__pycache__/_metadata.cpython-312.pyc,, +grpc/aio/__pycache__/_server.cpython-312.pyc,, +grpc/aio/__pycache__/_typing.cpython-312.pyc,, +grpc/aio/__pycache__/_utils.cpython-312.pyc,, +grpc/aio/_base_call.py,sha256=3B5FeHTuPLxmiVEVObkWPRv0sSonjpfbpPrznSIftvg,7561 +grpc/aio/_base_channel.py,sha256=ZuQnJCQhJEwiigoSi_Yq_psPEx7jIURfg-VtXv2rZRY,13894 +grpc/aio/_base_server.py,sha256=hA0x-WLZgivahfl9mFIlHhEhzzylR-O_NcMoYosXKME,12560 +grpc/aio/_call.py,sha256=N9rbvu8-0B_rV7RthtSlp-nZakDoshHgptOozEuVqtU,25356 +grpc/aio/_channel.py,sha256=J1opppQ_zkyhYTqh0cxo85tX14wdki3qccp1BFSUzd0,22099 +grpc/aio/_interceptor.py,sha256=ONvunL_Di4jL7THpezOOwESrV-WvADnsP4SZpQe0SH0,41338 +grpc/aio/_metadata.py,sha256=Bhxf6d8r90FQe-HPEUEOrowfAb-DA_6OfaQejcYJjog,5009 +grpc/aio/_server.py,sha256=_7v2-W92W1Ag1LINrxCED-647nAquGFUKbgGnKN06_s,8931 +grpc/aio/_typing.py,sha256=xMlG33vn_UkdkRv39Udx421BWVgt5RHCu8gJXAQ18do,1378 +grpc/aio/_utils.py,sha256=Bh5-lQO2xszdZeTFAWFfFhhaKy20ll4kucD6f_YZTlg,821 +grpc/beta/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/beta/__pycache__/__init__.cpython-312.pyc,, +grpc/beta/__pycache__/_client_adaptations.cpython-312.pyc,, +grpc/beta/__pycache__/_metadata.cpython-312.pyc,, +grpc/beta/__pycache__/_server_adaptations.cpython-312.pyc,, +grpc/beta/__pycache__/implementations.cpython-312.pyc,, +grpc/beta/__pycache__/interfaces.cpython-312.pyc,, +grpc/beta/__pycache__/utilities.cpython-312.pyc,, +grpc/beta/_client_adaptations.py,sha256=q4rwPyIv9ratLPhC3xmq9M1_fuAVTW71slsBChHP4T0,27023 +grpc/beta/_metadata.py,sha256=pC2-RLU3nHhTXTk_RMyoA3WwmRhm_woLbB-13lKO-aY,1638 +grpc/beta/_server_adaptations.py,sha256=-f_hSbqBZqNgaz55B1zbE7TK-kwc1oHnngXHMDU-kKk,14611 +grpc/beta/implementations.py,sha256=0yITggzqKKo8Lb8ZwPx2zIu414mIQxfan3jmenchIHk,12058 +grpc/beta/interfaces.py,sha256=mtQnvm7Bg2u5MQZf2_nmxUxKFCANDw7VUOHHvE7cBhM,6082 +grpc/beta/utilities.py,sha256=h_2yPH_5sCsFWKr9bBfa-JXj0CnSFaSa-_snKqtUUTo,5005 +grpc/experimental/__init__.py,sha256=uUcQbntsX9ROKozWD6eTVnAYJ6Dea7VUSpGGv1L5Hz0,4103 +grpc/experimental/__pycache__/__init__.cpython-312.pyc,, +grpc/experimental/__pycache__/gevent.cpython-312.pyc,, +grpc/experimental/__pycache__/session_cache.cpython-312.pyc,, +grpc/experimental/aio/__init__.py,sha256=bIyDdGBbNHi5F_kHvwByONjc4M_74thy53YmBDr1ZPo,660 +grpc/experimental/aio/__pycache__/__init__.cpython-312.pyc,, +grpc/experimental/gevent.py,sha256=_YAk9aH2PCZCpaCnW9uGY77W21342dEWm8wOVApTx88,973 +grpc/experimental/session_cache.py,sha256=wAauvDzxvTC6-p3jMbPnTc7y74nhDKSRjb0ktfMPCm8,1533 +grpc/framework/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/framework/__pycache__/__init__.cpython-312.pyc,, +grpc/framework/common/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/framework/common/__pycache__/__init__.cpython-312.pyc,, +grpc/framework/common/__pycache__/cardinality.cpython-312.pyc,, +grpc/framework/common/__pycache__/style.cpython-312.pyc,, +grpc/framework/common/cardinality.py,sha256=ygWtrjjsk-SOPLHaey6-7ekD23Qhu3k4QUNmYI1ScVU,988 +grpc/framework/common/style.py,sha256=X9wN-af8T7WWhFfdtmFkdqPN5PbpI8FJsKGdmPivaAU,824 +grpc/framework/foundation/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/framework/foundation/__pycache__/__init__.cpython-312.pyc,, +grpc/framework/foundation/__pycache__/abandonment.cpython-312.pyc,, +grpc/framework/foundation/__pycache__/callable_util.cpython-312.pyc,, +grpc/framework/foundation/__pycache__/future.cpython-312.pyc,, +grpc/framework/foundation/__pycache__/logging_pool.cpython-312.pyc,, +grpc/framework/foundation/__pycache__/stream.cpython-312.pyc,, +grpc/framework/foundation/__pycache__/stream_util.cpython-312.pyc,, +grpc/framework/foundation/abandonment.py,sha256=AF4Y734bGIVaX0CL8W9XaaPYuPUacgciBEZ9Wb4fpGA,878 +grpc/framework/foundation/callable_util.py,sha256=_uvikTKQnBPQv0Bfo59FkzwvclWDLxssFqHhdn-qqEY,3151 +grpc/framework/foundation/future.py,sha256=djoeNq-Wd5_tkzQwF_ZeL1nYAWKJ5rwzelGoTPdR1ME,8373 +grpc/framework/foundation/logging_pool.py,sha256=j8PFaWarQrnDebsDxmcJMzfFsJH8xGY2A4z6Plo_Q9c,2248 +grpc/framework/foundation/stream.py,sha256=F6XQUJC8rT-ciybPtHP7PTMlMXNoVXyzmnRwYKos0Ms,1377 +grpc/framework/foundation/stream_util.py,sha256=CUx6geCSB9zwgdlE0XHXcPSbuLeuNfClsZFyjsQVMB0,4772 +grpc/framework/interfaces/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/framework/interfaces/__pycache__/__init__.cpython-312.pyc,, +grpc/framework/interfaces/base/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/framework/interfaces/base/__pycache__/__init__.cpython-312.pyc,, +grpc/framework/interfaces/base/__pycache__/base.cpython-312.pyc,, +grpc/framework/interfaces/base/__pycache__/utilities.cpython-312.pyc,, +grpc/framework/interfaces/base/base.py,sha256=C2ReCMSCCBtPmpKR3-9bfpcNPCbnBJEg2ogBI5T3KQQ,12233 +grpc/framework/interfaces/base/utilities.py,sha256=f-SOSnkyhZx5IM-PjWAKuuW4eGy6s8z_vCPb36JIU9g,2361 +grpc/framework/interfaces/face/__init__.py,sha256=w3kqSAyaZgP-W0890xR4L4WeBPGrtsQCQJe0FUFR0K0,577 +grpc/framework/interfaces/face/__pycache__/__init__.cpython-312.pyc,, +grpc/framework/interfaces/face/__pycache__/face.cpython-312.pyc,, +grpc/framework/interfaces/face/__pycache__/utilities.cpython-312.pyc,, +grpc/framework/interfaces/face/face.py,sha256=OGyApdjsZ8BF9nNq-2sd6WXd9bPpbvj4jvXrGdJu-nY,39700 +grpc/framework/interfaces/face/utilities.py,sha256=0VfFcLyDVsDKmCC31xA7NOH3xNE3DOeWrIqZ2wnm-hg,6781 +grpcio-1.66.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +grpcio-1.66.2.dist-info/LICENSE,sha256=WQGY4_MF8sNH_eZNY3xlSSu-9VTbbINk4UnNN143l-4,29687 +grpcio-1.66.2.dist-info/METADATA,sha256=4ujmOf-hSypyIQTS1NV6hbLikHz6n9pzy_yn55LjxpE,3888 +grpcio-1.66.2.dist-info/RECORD,, +grpcio-1.66.2.dist-info/WHEEL,sha256=OvtvnbpcaxHa5TgXgfC48E6JA7zLr7svMspPP7Vk5o8,152 +grpcio-1.66.2.dist-info/top_level.txt,sha256=eEd2Jq_aVQFp38bWW8Pfwjz_5iibqeOFT-2zXlPAq_8,5 diff --git a/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/WHEEL new file mode 100644 index 0000000..db05d97 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.43.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 + diff --git a/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/top_level.txt b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/top_level.txt new file mode 100644 index 0000000..3b2fe54 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/grpcio-1.66.2.dist-info/top_level.txt @@ -0,0 +1 @@ +grpc diff --git a/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/INSTALLER b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/LICENSE b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/LICENSE new file mode 100644 index 0000000..fbdcbfc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Frazer McLean + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/METADATA b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/METADATA new file mode 100644 index 0000000..72366e4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/METADATA @@ -0,0 +1,82 @@ +Metadata-Version: 2.1 +Name: parver +Version: 0.5 +Summary: Parse and manipulate version numbers. +Author-email: Frazer McLean +License: MIT +Project-URL: Documentation, https://parver.readthedocs.io +Project-URL: Source Code, https://github.com/RazerM/parver +Keywords: pep440,version,parse +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: arpeggio >=1.7 +Requires-Dist: attrs >=19.2 +Requires-Dist: typing-extensions ; python_version < "3.10" +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: furo ; extra == 'docs' +Provides-Extra: docstest +Requires-Dist: doc8 ; extra == 'docstest' +Provides-Extra: pep8test +Requires-Dist: flake8 ; extra == 'pep8test' +Requires-Dist: pep8-naming ; extra == 'pep8test' +Provides-Extra: test +Requires-Dist: pytest ; extra == 'test' +Requires-Dist: hypothesis ; extra == 'test' +Requires-Dist: pretend ; extra == 'test' + +.. image:: https://img.shields.io/pypi/v/parver.svg + :target: https://pypi.org/project/parver/ + :alt: PyPI + +.. image:: https://img.shields.io/badge/docs-read%20now-blue.svg + :target: https://parver.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +.. image:: https://github.com/RazerM/parver/workflows/CI/badge.svg?branch=master + :target: https://github.com/RazerM/parver/actions?workflow=CI + :alt: CI Status + +.. image:: https://codecov.io/gh/RazerM/parver/branch/master/graph/badge.svg + :target: https://codecov.io/gh/RazerM/parver + :alt: Test coverage + +.. image:: https://img.shields.io/github/license/RazerM/parver.svg + :target: https://raw.githubusercontent.com/RazerM/parver/master/LICENSE.txt + :alt: MIT License + +parver +====== + +parver allows parsing and manipulation of `PEP 440`_ version numbers. + +Example +======= + +.. code:: python + + >>> Version.parse('1.3').bump_dev() + + >>> v = Version.parse('v1.2.alpha-3') + >>> v.is_alpha + True + >>> v.pre + 3 + >>> v + + >>> v.normalize() + + +.. _`PEP 440`: https://www.python.org/dev/peps/pep-0440/ diff --git a/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/RECORD b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/RECORD new file mode 100644 index 0000000..3949a35 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/RECORD @@ -0,0 +1,19 @@ +parver-0.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +parver-0.5.dist-info/LICENSE,sha256=J7Cg8x-FSiHwTtKtPY0oRrD2zjVpveDYfhpsLuBXRQE,1070 +parver-0.5.dist-info/METADATA,sha256=dbMLGWZeqb0HI6wRoN75hunLTU9vlpyXdUP5DpVNbTI,2717 +parver-0.5.dist-info/RECORD,, +parver-0.5.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92 +parver-0.5.dist-info/top_level.txt,sha256=kDYxWHvilbtfOuZPkEplGxIP-JJ21Lmnp1LOsxc9SN8,7 +parver/__init__.py,sha256=5UXXaU-Tioy7KiXC2WpQNq4Khz5Ij2S2vFbromIHdz8,213 +parver/__pycache__/__init__.cpython-312.pyc,, +parver/__pycache__/_helpers.cpython-312.pyc,, +parver/__pycache__/_parse.cpython-312.pyc,, +parver/__pycache__/_segments.cpython-312.pyc,, +parver/__pycache__/_typing.cpython-312.pyc,, +parver/__pycache__/_version.cpython-312.pyc,, +parver/_helpers.py,sha256=1Py_vu2eChT2nL9M-5vgHaIs6CjRqJHRVdxL7wvofT0,2564 +parver/_parse.py,sha256=rCWTQ7f_ng2XLaA-9vsz-kCrc6DLWwK2Cov2zFJt-58,7819 +parver/_segments.py,sha256=4WkOJamFJvWoQvyqNEby5dO57IYsv2IwUPMot2EutLY,993 +parver/_typing.py,sha256=jw8gEC91b6AWhp9tgO9CCXod-tRzshp1lKHZduv14WY,526 +parver/_version.py,sha256=mJ_-Fo7gaA42CAC3IkaOaW0YPs96W1bYPb35Keq7ajE,38439 +parver/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/WHEEL new file mode 100644 index 0000000..7e68873 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/top_level.txt b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/top_level.txt new file mode 100644 index 0000000..a8a5223 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver-0.5.dist-info/top_level.txt @@ -0,0 +1 @@ +parver diff --git a/myenv/lib/python3.12/site-packages/parver/__init__.py b/myenv/lib/python3.12/site-packages/parver/__init__.py new file mode 100644 index 0000000..34c8665 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver/__init__.py @@ -0,0 +1,9 @@ +from ._parse import ParseError +from ._version import Version + +__all__ = ("Version", "ParseError") + +from ._helpers import fixup_module_metadata + +fixup_module_metadata(__name__, globals()) +del fixup_module_metadata diff --git a/myenv/lib/python3.12/site-packages/parver/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/parver/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd783a6d11e6caf1c562848a468e8e603efa291f GIT binary patch literal 431 zcmXv~F-rq66i)8iyS7lB92^wUsfrEiDuPfQ9K^*AbqHxMwz0WfNYdhM{scE?agzQN zR~Ya; zV^4aq-|_+btpf0ZEXF}Az{o>9;34GFXwhKg%>hPNL0YT@KNxroXO#RF+lGB(w7BR=pYvnAUIGN zsX;RNIzXvnF$W>+%B0PteMS=y&@>{ka->5pp`#_I+;O$hFd`D9!EN6qnrM^UaCfY% zXiHAwl&c|;qD^$_dWkxy@9h&S9N*Qf(`Q|735*9r5lV#;j?%hLr=`RBB1dK!9?k#3 nZbJI?F~(!GK1ORFm94w*8|{3emHXaf_*8yH+wX-{Qw7@}AGda3 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/parver/__pycache__/_helpers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/parver/__pycache__/_helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8e34ae812b613e748d4132f67456fa05af2a39f GIT binary patch literal 5984 zcmd5ATX0jyb?-wjOO|9?#>U36Fi@=4SdieBG&IDup_ry>f=#Aq+96mFpKR47`3qP0TNrZm%l;-xYT zP-#ls341F(#Xn_NTCT{^cIr}Esf~I}JoQY;O4}8=vU*3&e1LisAJEv9_8Jk5Akpw**7hXlhEs6~U)UIIZg8MEHzGnHD}lb*ctOSyD-cN2&I% zp2>!@EHg{>VO2}QNyF(JRnLc0$;ogwr_W^6mj(~L7}k?yk4cJDH5Y&i!&bTq zp#BBGW!T^{B)AN_B2x#9onVwU7`v**b{IERjU6y{SB;%8_Ee2sFmA3IH^JDeG%IfS z_2oPvFBp$Hl~j{@4)2|{fPi0q=}v2nsh@UOWZt`}CDhz}yG4WhRxYItNv%uS$<M6cMNj#%FE#0n+W?>JarWD)z+j)72}VHBI6$+N^$9u2AEDE6J$as5mcGR!9T14=G+02uA}L1-jz!zn zoB+@SDsC7Fi9AFZfz8|F+K``h!3x%mfLnPF_Ane7Qc~5~ejK8W8}ei(lVS&Oj8?;j z5F9~(8JZnK@LdF(5&&8zL(mHU+D8D)1khF3Q-TE0RkRDXpxF;%zr8S01bq9-C{DLG zKpirv4w+PkkZQ<84VkDRLwsl3=Jjlf_58x;d+J$8B@ev>+$wpfYpaES#XQ7=Alr*a*(?;= zUPGbG9P~|G$K4J+j%SaW=nTl(5VDPHbK9QpZlDCrH!mZPFZ_FRaOeJwMzc(E!gh?% ze;PA_K*Bw$J|o0r2la?;nAg`P?%D9yy3U9 zMJQ0yrkih^`*{Rw$Ou!&aoDZF1K_zBp%xo6f)kyrW%PV0gzd)Fo81VNG{38XS*w^& zz7G@{7POc-Iu?E0xg(*LhPi=_BBM%fU|c=hrv{z|_@yp-{LAm;@|Mr$4=Kk*TANrZPKuZ}NCBKf(Tm#ineK(4mP zBu7HFh#_SrXSZeojL7&TEZqa}E3xLC2SO<1HU<)CmxR3V)6;ojwmdemCR9X=A$twj zlUT*`b+j1X@j>UI#m1UROt9@lkdG{GyH>Dq;)K4U&AvS<{l0JSM&G_01J?&0^bM``4XyWm>j@EB`j<{U40IPx{Uxyfu>`}SMEv`T zHWGY!@ff#F10IO+R4Nt=3H;3lC&VMLHvt$9un{y=erSfr;75B0&i0yFYPHur6^jAs zX(Y#l^q&Q&-tD&jYvV-%KZS{Z<4@5~0zHMZYi;|V5Yg7Y=-BXf6dY^b;G*=<>06S1 z;dyKWyeXs;zESXxH8o`{>|GPD&FYB1R^T-6z-(2$Y{*a}=?qniGv&wq-(_c64GNu# z&!zMV11pT8eOupRsu)1=iQ6y*Ky~rS8E`;xI)MOP69huin(fiq`1T(_XPLOF3h_KR z+wVlnG3q&)OD-MSt!yjkc-k; zazQ|MaRWKj7xr}gVv4FEJ3~1QDVxa}O=GG;FCJ$s!x)ANhFddqQ8opjzA|QUW)uM0 zg3T6umKu z__MRO=zz(m8U#7=URMwKP2aF6{ZSAA8pLQG`@tKpkBy8?#G=Pf|1h-Ea3?aU6iw*x zQBN}uUSJU<@RVdlpver}$gc={Z{iD3ji z2+;aXJ4iv#@PUV^Y6ij$3IbJnZ8m%AJZff!SJ^orN4wMf0E?0!2!AC#epV>vB<1sJjueJJdIgFs z!L@P-0*l}(N!DD^Y4xh8ZVq$eJG-|Mj|eA)C&VrUEpq7IJbov1_su&4YXiq1NC?4u V!zKJFwvyi63(br9`^2oc{tI_qzU%-1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/parver/__pycache__/_parse.cpython-312.pyc b/myenv/lib/python3.12/site-packages/parver/__pycache__/_parse.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7356d3387e20e44fb86b31768ac10e3d932a85e GIT binary patch literal 10884 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/parver/__pycache__/_segments.cpython-312.pyc b/myenv/lib/python3.12/site-packages/parver/__pycache__/_segments.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2fac13b7f313b7e4fa649ad2ba39f9284fc3ee5 GIT binary patch literal 3507 zcmcgu&2JM&6rcU@$J%ke34uUC6k--iET9OepjAbns#LkCB%to0tHnE*h28Zsy9x3w zm8hEDj5s8S10W6*1*v~XFGTSn+6z>umAJWbB_vLLZ`KL1oz^au7|B2H%)H;5dGmYo z@oOfNB2aqWi^bn0LSABJt;8E2^>ZR23&bR*U=v5s1V_|FN75t#+eBN|WK%L_JLbf- zIJ8M-%uYB-E$Jwl;-s{clh)D#5eb#AjjlO=`)|gdCYFS#E|M>ZnY=|zWeLW_vK0Lh zEz>nW1^hJ4EI~Y2);;ug?V$%eWZGuX*EPQv_*P5UweU7at%9-P0e^V4P(rTm>vGKb{*Kf=icGUBP)Y0o3 znseMBSIABKl=-=HG@$P8NoJW=Zj$=fgOZo?Sm_!KK6icVvJKW{>dxkD>vGO32Ukn( z(TT%Ha=sPNL!ME%ZWO7XgBWHh%jteJA%DUvvtAgBg90D*7{D#^LQb;bwf3fWjj zAF_rJIDZR%;g00MhZ{!wXw)Z@sf^?(F>0s=Pgl8_hNkZ4!FkCA2HzHek}EDe@pC$l1g< z)TV|{CwLHfRcVQm?EnVbiGWcu8Q}wjT?j2I?ZGw#l*LCXgtv3=;?(_1cQ4)h7Q#DL z8LAX2qd$FCmB*tn(R}kTtI+e`!=%YZm`bE&N8M92O?&vlDAB@nWMpVBRZIyNv7>F@ z2JbRo_Lv$EB{&nJw2^)49S)@c4hZ}_l2`jXNPydmVIptPVINj8^;sHW909LPmPKe$ zX)m@RpsfCP0HD(Np$F#U;=|%2i>tI_(SJ6uXF2`hikw^BoqZrbPCQIJQsyS-_g79X zr*^K$>gwRO%HDoiUZL)c*i@FFMCj3sbxzHPr4- zK~%f1!QcvZ)Vv=~lID?OTzL_cm+@MNHXGxrajj4$b>Llv=b9(LMI=1W13Za0RbRyp z1RUMJ0nkDHiDN&TzZ9Pomn=|!Uqx9w`M`YEe_%Ova78}8x?y*pnIElWmzC`+^7!gM zldAIZC?RkTO$mYX#!{aJcrOXjvhmA!B1)5VHrkpJ?8m&Cc?VTKf&eyb$Cmwf5PK00 z!OuSi&_RJ+zTw>g51p&j_Tc5hFuB8o-mv9| zA5U<8#$o!0f*-v?_(OqTv-~o`Q-^0eUvNH;mgDeE@>KMO`jmYP#`p;HPXg8?K@gr3 zb(yFyN&0uP>p3~SLQdD>L`=>N|2Xpf$h=t5$R3nEhlHT2@dRczV9*jr%I7nHuL60|Do6nQ62WB2 zV{`SBoA+Q3xWI)Tu*5ET(3dR9mn|8JSoRcOwNziTGzbtlEKHL8-(BVCB>*(VZ>#*Z zZs`yZEs4_C5t3YOoptJf&;=ywjPjOM14#+)hEu7F2#^8#S9I| z(!1>tZF<;=44uIylW3Evju##{3_46{pqQHmONA62V|2n~ZkV=B(XP`nWSZw$Xi-R( z3oF$F>N_5OgWSoL5v+}1l|h@OcTnh1Cl06~GbIe7n8`dVgOsJVdBig^z;aLh(8Em} zTZjfssRu4HrkEVHBc{de5R(=a{ZmEM(;XV3RtpDI6-*N>cZ_JnCtzc;AJDWwQ`Zk| z^g2dFoJDk6@S<%ygaok@3ufDNMr0`qSrD=$q{8JRxZ(;%P17f_*);beUc-EXc)D9# z6ua2mLeWtigl0&CLlkfFDh&^rejAZv)58rjY{v%yd04yuz>N5hs)kPU$Z4U-1SB4ON1DPLS`46}^l(nz&OkbWkJ^3tGzALwW zE33oVh2G-x{_IXi>!t@_=c2N5PWqMg9w?m}1F(KkuAIH?m#dw0_t5}UFXk3|OJ;v= ut&{4`55U^+=JNUN538MA7Z1S7aJqb^pRe|ARQuDlj?%$jK#ktvef$G#OZTM! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/parver/__pycache__/_version.cpython-312.pyc b/myenv/lib/python3.12/site-packages/parver/__pycache__/_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de0dc59f08e2b2098ebe193cba1cd9c74e1997f9 GIT binary patch literal 46737 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/parver/_helpers.py b/myenv/lib/python3.12/site-packages/parver/_helpers.py new file mode 100644 index 0000000..5de1978 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver/_helpers.py @@ -0,0 +1,115 @@ +from collections import deque +from typing import Any, Dict, Iterable, TypeVar, Union, cast, overload + +from ._typing import ImplicitZero + +T = TypeVar("T") +R = TypeVar("R") + + +class UnsetType: + def __repr__(self) -> str: + return "UNSET" + + +UNSET = UnsetType() + + +class InfinityType: + def __repr__(self) -> str: + return "Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: Any) -> bool: + return False + + def __le__(self, other: Any) -> bool: + return False + + def __eq__(self, other: Any) -> bool: + return isinstance(other, self.__class__) + + def __ne__(self, other: Any) -> bool: + return not isinstance(other, self.__class__) + + def __gt__(self, other: Any) -> bool: + return True + + def __ge__(self, other: Any) -> bool: + return True + + def __neg__(self) -> "NegativeInfinityType": + return NegativeInfinity + + +Infinity = InfinityType() + + +class NegativeInfinityType: + def __repr__(self) -> str: + return "-Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: Any) -> bool: + return True + + def __le__(self, other: Any) -> bool: + return True + + def __eq__(self, other: Any) -> bool: + return isinstance(other, self.__class__) + + def __ne__(self, other: Any) -> bool: + return not isinstance(other, self.__class__) + + def __gt__(self, other: Any) -> bool: + return False + + def __ge__(self, other: Any) -> bool: + return False + + def __neg__(self) -> InfinityType: + return Infinity + + +NegativeInfinity = NegativeInfinityType() + + +def fixup_module_metadata(module_name: str, namespace: Dict[str, Any]) -> None: + def fix_one(obj: Any) -> None: + mod = getattr(obj, "__module__", None) + if mod is not None and mod.startswith("parver."): + obj.__module__ = module_name + if isinstance(obj, type): + for attr_value in obj.__dict__.values(): + fix_one(attr_value) + + for objname in namespace["__all__"]: + obj = namespace[objname] + fix_one(obj) + + +@overload +def last(iterable: Iterable[T]) -> T: + pass + + +@overload +def last(iterable: Iterable[T], *, default: T) -> T: + pass + + +def last(iterable: Iterable[T], *, default: Union[UnsetType, T] = UNSET) -> T: + try: + return deque(iterable, maxlen=1).pop() + except IndexError: + if default is UNSET: + raise + return cast(T, default) + + +IMPLICIT_ZERO: ImplicitZero = "" diff --git a/myenv/lib/python3.12/site-packages/parver/_parse.py b/myenv/lib/python3.12/site-packages/parver/_parse.py new file mode 100644 index 0000000..3a25e44 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver/_parse.py @@ -0,0 +1,244 @@ +from threading import Lock +from typing import List, Optional, Tuple, Union, cast + +import attr +from arpeggio import ( + NoMatch, + PTNodeVisitor, + SemanticActionResults, + Terminal, + visit_parse_tree, +) +from arpeggio.cleanpeg import ParserPEG + +from . import _segments as segment +from ._helpers import IMPLICIT_ZERO, UNSET, UnsetType +from ._typing import ImplicitZero, Node, PostTag, PreTag, Separator + +canonical = r""" + version = epoch? release pre? post? dev? local? EOF + epoch = int "!" + release = int (dot int)* + pre = pre_tag pre_post_num + pre_tag = "a" / "b" / "rc" + post = sep post_tag pre_post_num + pre_post_num = int + post_tag = "post" + dev = sep "dev" int + local = "+" local_part (sep local_part)* + local_part = alpha / int + sep = dot + dot = "." + int = r'0|[1-9][0-9]*' + alpha = r'[0-9]*[a-z][a-z0-9]*' +""" + +permissive = r""" + version = v? epoch? release pre? (post / post_implicit)? dev? local? EOF + v = "v" + epoch = int "!" + release = int (dot int)* + pre = sep? pre_tag pre_post_num? + pre_tag = "c" / "rc" / "alpha" / "a" / "beta" / "b" / "preview" / "pre" + post = sep? post_tag pre_post_num? + post_implicit = "-" int + post_tag = "post" / "rev" / "r" + pre_post_num = sep? int + dev = sep? "dev" int? + local = "+" local_part (sep local_part)* + local_part = alpha / int + sep = dot / "-" / "_" + dot = "." + int = r'[0-9]+' + alpha = r'[0-9]*[a-z][a-z0-9]*' +""" + +_strict_parser = _permissive_parser = None +_parser_create_lock = Lock() + + +@attr.s(slots=True) +class Sep: + value: Optional[Separator] = attr.ib() + + +@attr.s(slots=True) +class Tag: + value: Union[PreTag, PostTag] = attr.ib() + + +class VersionVisitor(PTNodeVisitor): # type: ignore[misc] + def visit_version( + self, node: Node, children: SemanticActionResults + ) -> List[segment.Segment]: + return list(children) + + def visit_v(self, node: Node, children: SemanticActionResults) -> segment.V: + return segment.V() + + def visit_epoch(self, node: Node, children: SemanticActionResults) -> segment.Epoch: + return segment.Epoch(children[0]) + + def visit_release( + self, node: Node, children: SemanticActionResults + ) -> segment.Release: + return segment.Release(tuple(children)) + + def visit_pre(self, node: Node, children: SemanticActionResults) -> segment.Pre: + sep1: Union[Separator, None, UnsetType] = UNSET + tag: Union[PreTag, UnsetType] = UNSET + sep2: Union[Separator, None, UnsetType] = UNSET + num: Union[ImplicitZero, int, UnsetType] = UNSET + + for token in children: + if sep1 is UNSET: + if isinstance(token, Sep): + sep1 = token.value + elif isinstance(token, Tag): + sep1 = None + tag = cast(PreTag, token.value) + elif tag is UNSET: + tag = token.value + else: + assert isinstance(token, tuple) + assert len(token) == 2 + sep2 = token[0].value + num = token[1] + + if sep2 is UNSET: + sep2 = None + num = IMPLICIT_ZERO + + assert not isinstance(sep1, UnsetType) + assert not isinstance(tag, UnsetType) + assert not isinstance(sep2, UnsetType) + assert not isinstance(num, UnsetType) + + return segment.Pre(sep1=sep1, tag=tag, sep2=sep2, value=num) + + def visit_pre_post_num( + self, node: Node, children: SemanticActionResults + ) -> Tuple[Sep, int]: + # when "pre_post_num = int", visit_int isn't called for some reason + # I don't understand. Let's call int() manually + if isinstance(node, Terminal): + return Sep(None), int(node.value) + + if len(children) == 1: + return Sep(None), children[0] + else: + return cast("Tuple[Sep, int]", tuple(children[:2])) + + def visit_pre_tag(self, node: Node, children: SemanticActionResults) -> Tag: + return Tag(node.value) + + def visit_post(self, node: Node, children: SemanticActionResults) -> segment.Post: + sep1: Union[Separator, None, UnsetType] = UNSET + tag: Union[PostTag, None, UnsetType] = UNSET + sep2: Union[Separator, None, UnsetType] = UNSET + num: Union[ImplicitZero, int, UnsetType] = UNSET + + for token in children: + if sep1 is UNSET: + if isinstance(token, Sep): + sep1 = token.value + elif isinstance(token, Tag): + sep1 = None + tag = cast(PostTag, token.value) + elif tag is UNSET: + tag = token.value + else: + assert isinstance(token, tuple) + assert len(token) == 2 + sep2 = token[0].value + num = token[1] + + if sep2 is UNSET: + sep2 = None + num = IMPLICIT_ZERO + + assert not isinstance(sep1, UnsetType) + assert not isinstance(tag, UnsetType) + assert not isinstance(sep2, UnsetType) + assert not isinstance(num, UnsetType) + + return segment.Post(sep1=sep1, tag=tag, sep2=sep2, value=num) + + def visit_post_tag(self, node: Node, children: SemanticActionResults) -> Tag: + return Tag(node.value) + + def visit_post_implicit( + self, node: Node, children: SemanticActionResults + ) -> segment.Post: + return segment.Post(sep1=UNSET, tag=None, sep2=UNSET, value=children[0]) + + def visit_dev(self, node: Node, children: SemanticActionResults) -> segment.Dev: + num: Union[ImplicitZero, int] = IMPLICIT_ZERO + sep: Union[Separator, None, UnsetType] = UNSET + + for token in children: + if sep is UNSET: + if isinstance(token, Sep): + sep = token.value + else: + num = token + else: + num = token + + if isinstance(sep, UnsetType): + sep = None + + return segment.Dev(value=num, sep=sep) + + def visit_local(self, node: Node, children: SemanticActionResults) -> segment.Local: + return segment.Local("".join(str(getattr(c, "value", c)) for c in children)) + + def visit_int(self, node: Node, children: SemanticActionResults) -> int: + return int(node.value) + + def visit_sep(self, node: Node, children: SemanticActionResults) -> Sep: + return Sep(node.value) + + +class ParseError(ValueError): + """Raised when parsing an invalid version number.""" + + +def _get_parser(strict: bool) -> ParserPEG: + """Ensure the module-level peg parser is created and return it.""" + global _strict_parser, _permissive_parser + + # Each branch below only acquires the lock if the global is unset. + + if strict: + if _strict_parser is None: + with _parser_create_lock: + if _strict_parser is None: + _strict_parser = ParserPEG( + canonical, root_rule_name="version", skipws=False + ) + + return _strict_parser + else: + if _permissive_parser is None: + with _parser_create_lock: + if _permissive_parser is None: + _permissive_parser = ParserPEG( + permissive, + root_rule_name="version", + skipws=False, + ignore_case=True, + ) + + return _permissive_parser + + +def parse(version: str, strict: bool = False) -> List[segment.Segment]: + parser = _get_parser(strict) + + try: + tree = parser.parse(version.strip()) + except NoMatch as exc: + raise ParseError(str(exc)) from None + + return cast("List[segment.Segment]", visit_parse_tree(tree, VersionVisitor())) diff --git a/myenv/lib/python3.12/site-packages/parver/_segments.py b/myenv/lib/python3.12/site-packages/parver/_segments.py new file mode 100644 index 0000000..4f0fec6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver/_segments.py @@ -0,0 +1,53 @@ +from typing import Optional, Tuple, Union + +import attr + +from ._helpers import UnsetType +from ._typing import ImplicitZero, PostTag, PreTag, Separator + + +@attr.s(slots=True) +class Segment: + pass + + +@attr.s(slots=True) +class V(Segment): + pass + + +@attr.s(slots=True) +class Epoch: + value: int = attr.ib() + + +@attr.s(slots=True) +class Release: + value: Tuple[int, ...] = attr.ib() + + +@attr.s(slots=True) +class Pre: + value: Union[ImplicitZero, int] = attr.ib() + sep1: Optional[Separator] = attr.ib() + tag: PreTag = attr.ib() + sep2: Optional[Separator] = attr.ib() + + +@attr.s(slots=True) +class Post: + value: Union[ImplicitZero, int] = attr.ib() + sep1: Union[Separator, UnsetType, None] = attr.ib() + tag: Optional[PostTag] = attr.ib() + sep2: Union[Separator, UnsetType, None] = attr.ib() + + +@attr.s(slots=True) +class Dev: + value: Union[ImplicitZero, int] = attr.ib() + sep: Optional[Separator] = attr.ib() + + +@attr.s(slots=True) +class Local: + value: str = attr.ib() diff --git a/myenv/lib/python3.12/site-packages/parver/_typing.py b/myenv/lib/python3.12/site-packages/parver/_typing.py new file mode 100644 index 0000000..4441ac9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver/_typing.py @@ -0,0 +1,18 @@ +import sys +from typing import Literal, Union + +from arpeggio import NonTerminal, Terminal + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +PreTag: TypeAlias = Literal["c", "rc", "alpha", "a", "beta", "b", "preview", "pre"] +NormalizedPreTag: TypeAlias = Literal["a", "b", "rc"] +Separator: TypeAlias = Literal[".", "-", "_"] +PostTag: TypeAlias = Literal["post", "rev", "r"] + +ImplicitZero: TypeAlias = Literal[""] + +Node: TypeAlias = Union[Terminal, NonTerminal] diff --git a/myenv/lib/python3.12/site-packages/parver/_version.py b/myenv/lib/python3.12/site-packages/parver/_version.py new file mode 100644 index 0000000..91a10ce --- /dev/null +++ b/myenv/lib/python3.12/site-packages/parver/_version.py @@ -0,0 +1,1144 @@ +import itertools +import operator +import re +from functools import partial +from typing import ( + Any, + Callable, + Dict, + Iterable, + Optional, + Sequence, + Set, + Tuple, + Union, + cast, + overload, +) + +import attr +from attr import Attribute, converters +from attr.validators import and_, deep_iterable, in_, instance_of, optional + +from . import _segments as segment +from ._helpers import IMPLICIT_ZERO, UNSET, Infinity, UnsetType, last +from ._parse import parse +from ._typing import ImplicitZero, NormalizedPreTag, PostTag, PreTag, Separator + +POST_TAGS: Set[PostTag] = {"post", "rev", "r"} +SEPS: Set[Separator] = {".", "-", "_"} +PRE_TAGS: Set[PreTag] = {"c", "rc", "alpha", "a", "beta", "b", "preview", "pre"} + +_ValidatorType = Callable[[Any, "Attribute[Any]", Any], None] + + +def unset_or(validator: _ValidatorType) -> _ValidatorType: + def validate(inst: Any, attr: "Attribute[Any]", value: Any) -> None: + if value is UNSET: + return + + validator(inst, attr, value) + + return validate + + +def implicit_or( + validator: Union[_ValidatorType, Sequence[_ValidatorType]] +) -> _ValidatorType: + if isinstance(validator, Sequence): + validator = and_(*validator) + + def validate(inst: Any, attr: "Attribute[Any]", value: Any) -> None: + if value == IMPLICIT_ZERO: + return + + validator(inst, attr, value) + + return validate + + +def not_bool(inst: Any, attr: "Attribute[Any]", value: Any) -> None: + if isinstance(value, bool): + raise TypeError( + "'{name}' must not be a bool (got {value!r})".format( + name=attr.name, value=value + ) + ) + + +def is_non_negative(inst: Any, attr: "Attribute[Any]", value: Any) -> None: + if value < 0: + raise ValueError( + "'{name}' must be non-negative (got {value!r})".format( + name=attr.name, value=value + ) + ) + + +def non_empty(inst: Any, attr: "Attribute[Any]", value: Any) -> None: + if not value: + raise ValueError(f"'{attr.name}' cannot be empty") + + +def check_by(by: int, current: Optional[int]) -> None: + if not isinstance(by, int): + raise TypeError("by must be an integer") + + if current is None and by < 0: + raise ValueError("Cannot bump by negative amount when current value is unset.") + + +validate_post_tag: _ValidatorType = unset_or(optional(in_(POST_TAGS))) +validate_pre_tag: _ValidatorType = optional(in_(PRE_TAGS)) +validate_sep: _ValidatorType = optional(in_(SEPS)) +validate_sep_or_unset: _ValidatorType = unset_or(optional(in_(SEPS))) +is_bool: _ValidatorType = instance_of(bool) +is_int: _ValidatorType = instance_of(int) +is_str: _ValidatorType = instance_of(str) +is_tuple: _ValidatorType = instance_of(tuple) + +# "All numeric components MUST be non-negative integers." +num_comp = [not_bool, is_int, is_non_negative] + +release_validator = deep_iterable(and_(*num_comp), and_(is_tuple, non_empty)) + + +def convert_release(release: Union[int, Iterable[int]]) -> Tuple[int, ...]: + if isinstance(release, Iterable) and not isinstance(release, str): + return tuple(release) + elif isinstance(release, int): + return (release,) + + # The input value does not conform to the function type, let it pass through + # to the validator + return release + + +def convert_local(local: Optional[str]) -> Optional[str]: + if isinstance(local, str): + return local.lower() + return local + + +def convert_implicit(value: Union[ImplicitZero, int]) -> int: + """This function is a lie, since mypy's attrs plugin takes the argument type + as that of the constructed __init__. The lie is required because we aren't + dealing with ImplicitZero until __attrs_post_init__. + """ + return value # type: ignore[return-value] + + +@attr.s(frozen=True, repr=False, eq=False) +class Version: + """ + + :param release: Numbers for the release segment. + + :param v: Optional preceding v character. + + :param epoch: `Version epoch`_. Implicitly zero but hidden by default. + + :param pre_tag: `Pre-release`_ identifier, typically `a`, `b`, or `rc`. + Required to signify a pre-release. + + :param pre: `Pre-release`_ number. May be ``''`` to signify an + `implicit pre-release number`_. + + :param post: `Post-release`_ number. May be ``''`` to signify an + `implicit post release number`_. + + :param dev: `Developmental release`_ number. May be ``''`` to signify an + `implicit development release number`_. + + :param local: `Local version`_ segment. + + :param pre_sep1: Specify an alternate separator before the pre-release + segment. The normal form is `None`. + + :param pre_sep2: Specify an alternate separator between the identifier and + number. The normal form is ``'.'``. + + :param post_sep1: Specify an alternate separator before the post release + segment. The normal form is ``'.'``. + + :param post_sep2: Specify an alternate separator between the identifier and + number. The normal form is ``'.'``. + + :param dev_sep: Specify an alternate separator before the development + release segment. The normal form is ``'.'``. + + :param post_tag: Specify alternate post release identifier `rev` or `r`. + May be `None` to signify an `implicit post release`_. + + .. note:: The attributes below are not equal to the parameters passed to + the initialiser! + + The main difference is that implicit numbers become `0` and set the + corresponding `_implicit` attribute: + + .. doctest:: + + >>> v = Version(release=1, post='') + >>> str(v) + '1.post' + >>> v.post + 0 + >>> v.post_implicit + True + + .. attribute:: release + + A tuple of integers giving the components of the release segment of + this :class:`Version` instance; that is, the ``1.2.3`` part of the + version number, including trailing zeros but not including the epoch + or any prerelease/development/postrelease suffixes + + .. attribute:: v + + Whether this :class:`Version` instance includes a preceding v character. + + .. attribute:: epoch + + An integer giving the version epoch of this :class:`Version` instance. + :attr:`epoch_implicit` may be `True` if this number is zero. + + .. attribute:: pre_tag + + If this :class:`Version` instance represents a pre-release, this + attribute will be the pre-release identifier. One of `a`, `b`, `rc`, + `c`, `alpha`, `beta`, `preview`, or `pre`. + + **Note:** you should not use this attribute to check or compare + pre-release identifiers. Use :meth:`is_alpha`, :meth:`is_beta`, and + :meth:`is_release_candidate` instead. + + .. attribute:: pre + + If this :class:`Version` instance represents a pre-release, this + attribute will be the pre-release number. If this instance is not a + pre-release, the attribute will be `None`. :attr:`pre_implicit` may be + `True` if this number is zero. + + .. attribute:: post + + If this :class:`Version` instance represents a postrelease, this + attribute will be the postrelease number (an integer); otherwise, it + will be `None`. :attr:`post_implicit` may be `True` if this number + is zero. + + .. attribute:: dev + + If this :class:`Version` instance represents a development release, + this attribute will be the development release number (an integer); + otherwise, it will be `None`. :attr:`dev_implicit` may be `True` if this + number is zero. + + .. attribute:: local + + A string representing the local version portion of this :class:`Version` + instance if it has one, or ``None`` otherwise. + + .. attribute:: pre_sep1 + + The separator before the pre-release identifier. + + .. attribute:: pre_sep2 + + The seperator between the pre-release identifier and number. + + .. attribute:: post_sep1 + + The separator before the post release identifier. + + .. attribute:: post_sep2 + + The seperator between the post release identifier and number. + + .. attribute:: dev_sep + + The separator before the develepment release identifier. + + .. attribute:: post_tag + + If this :class:`Version` instance represents a post release, this + attribute will be the post release identifier. One of `post`, `rev`, + `r`, or `None` to represent an implicit post release. + + .. _`Version epoch`: https://www.python.org/dev/peps/pep-0440/#version-epochs + .. _`Pre-release`: https://www.python.org/dev/peps/pep-0440/#pre-releases + .. _`implicit pre-release number`: https://www.python.org/dev/peps/ + pep-0440/#implicit-pre-release-number + .. _`Post-release`: https://www.python.org/dev/peps/pep-0440/#post-releases + .. _`implicit post release number`: https://www.python.org/dev/peps/ + pep-0440/#implicit-post-release-number + .. _`Developmental release`: https://www.python.org/dev/peps/pep-0440/ + #developmental-releases + .. _`implicit development release number`: https://www.python.org/dev/peps/ + pep-0440/#implicit-development-release-number + .. _`Local version`: https://www.python.org/dev/peps/pep-0440/ + #local-version-identifiers + .. _`implicit post release`: https://www.python.org/dev/peps/pep-0440/ + #implicit-post-releases + + """ + + release: Tuple[int, ...] = attr.ib( + converter=convert_release, validator=release_validator + ) + v: bool = attr.ib(default=False, validator=is_bool) + epoch: int = attr.ib( + default=cast(int, IMPLICIT_ZERO), + converter=convert_implicit, + validator=implicit_or(num_comp), + ) + pre_tag: Optional[PreTag] = attr.ib(default=None, validator=validate_pre_tag) + pre: Optional[int] = attr.ib( + default=None, + converter=converters.optional(convert_implicit), + validator=implicit_or(optional(num_comp)), + ) + post: Optional[int] = attr.ib( + default=None, + converter=converters.optional(convert_implicit), + validator=implicit_or(optional(num_comp)), + ) + dev: Optional[int] = attr.ib( + default=None, + converter=converters.optional(convert_implicit), + validator=implicit_or(optional(num_comp)), + ) + local: Optional[str] = attr.ib( + default=None, converter=convert_local, validator=optional(is_str) + ) + + pre_sep1: Optional[Separator] = attr.ib(default=None, validator=validate_sep) + pre_sep2: Optional[Separator] = attr.ib(default=None, validator=validate_sep) + post_sep1: Optional[Separator] = attr.ib( + default=UNSET, validator=validate_sep_or_unset + ) + post_sep2: Optional[Separator] = attr.ib( + default=UNSET, validator=validate_sep_or_unset + ) + dev_sep: Optional[Separator] = attr.ib( + default=UNSET, validator=validate_sep_or_unset + ) + post_tag: Optional[PostTag] = attr.ib(default=UNSET, validator=validate_post_tag) + + epoch_implicit: bool = attr.ib(default=False, init=False) + pre_implicit: bool = attr.ib(default=False, init=False) + post_implicit: bool = attr.ib(default=False, init=False) + dev_implicit: bool = attr.ib(default=False, init=False) + _key = attr.ib(init=False) + + def __attrs_post_init__(self) -> None: + set_ = partial(object.__setattr__, self) + + if self.epoch == IMPLICIT_ZERO: + set_("epoch", 0) + set_("epoch_implicit", True) + + self._validate_pre(set_) + self._validate_post(set_) + self._validate_dev(set_) + + set_( + "_key", + _cmpkey( + self.epoch, + self.release, + _normalize_pre_tag(self.pre_tag), + self.pre, + self.post, + self.dev, + self.local, + ), + ) + + def _validate_pre(self, set_: Callable[[str, Any], None]) -> None: + if self.pre_tag is None: + if self.pre is not None: + raise ValueError("Must set pre_tag if pre is given.") + + if self.pre_sep1 is not None or self.pre_sep2 is not None: + raise ValueError("Cannot set pre_sep1 or pre_sep2 without pre_tag.") + else: + if self.pre == IMPLICIT_ZERO: + set_("pre", 0) + set_("pre_implicit", True) + elif self.pre is None: + raise ValueError("Must set pre if pre_tag is given.") + + def _validate_post(self, set_: Callable[[str, Any], None]) -> None: + got_post_tag = self.post_tag is not UNSET + got_post = self.post is not None + got_post_sep1 = self.post_sep1 is not UNSET + got_post_sep2 = self.post_sep2 is not UNSET + + # post_tag relies on post + if got_post_tag and not got_post: + raise ValueError("Must set post if post_tag is given.") + + if got_post: + if not got_post_tag: + # user gets the default for post_tag + set_("post_tag", "post") + if self.post == IMPLICIT_ZERO: + set_("post_implicit", True) + set_("post", 0) + + # Validate parameters for implicit post-release (post_tag=None). + # An implicit post-release is e.g. '1-2' (== '1.post2') + if self.post_tag is None: + if self.post_implicit: + raise ValueError( + "Implicit post releases (post_tag=None) require a numerical " + "value for 'post' argument." + ) + + if got_post_sep1 or got_post_sep2: + raise ValueError( + "post_sep1 and post_sep2 cannot be set for implicit post " + "releases (post_tag=None)" + ) + + if self.pre_implicit: + raise ValueError( + "post_tag cannot be None with an implicit pre-release (pre='')." + ) + + set_("post_sep1", "-") + elif self.post_tag is UNSET: + if got_post_sep1 or got_post_sep2: + raise ValueError("Cannot set post_sep1 or post_sep2 without post_tag.") + + set_("post_tag", None) + + if not got_post_sep1 and self.post_sep1 is UNSET: + set_("post_sep1", None if self.post is None else ".") + + if not got_post_sep2: + set_("post_sep2", None) + + assert self.post_sep1 is not UNSET + assert self.post_sep2 is not UNSET + + def _validate_dev(self, set_: Callable[[str, Any], None]) -> None: + if self.dev == IMPLICIT_ZERO: + set_("dev_implicit", True) + set_("dev", 0) + elif self.dev is None: + if self.dev_sep is not UNSET: + raise ValueError("Cannot set dev_sep without dev.") + + if self.dev_sep is UNSET: + set_("dev_sep", None if self.dev is None else ".") + + @classmethod + def parse(cls, version: str, strict: bool = False) -> "Version": + """ + :param version: Version number as defined in `PEP 440`_. + :type version: str + + :param strict: Enable strict parsing of the canonical PEP 440 format. + :type strict: bool + + .. _`PEP 440`: https://www.python.org/dev/peps/pep-0440/ + + :raises ParseError: If version is not valid for the given value of + `strict`. + + .. doctest:: + :options: -IGNORE_EXCEPTION_DETAIL + + >>> Version.parse('1.dev') + + >>> Version.parse('1.dev', strict=True) + Traceback (most recent call last): + ... + parver.ParseError: Expected int at position (1, 6) => '1.dev*'. + """ + segments = parse(version, strict=strict) + + kwargs: Dict[str, Any] = dict() + + for s in segments: + if isinstance(s, segment.Epoch): + kwargs["epoch"] = s.value + elif isinstance(s, segment.Release): + kwargs["release"] = s.value + elif isinstance(s, segment.Pre): + kwargs["pre"] = s.value + kwargs["pre_tag"] = s.tag + kwargs["pre_sep1"] = s.sep1 + kwargs["pre_sep2"] = s.sep2 + elif isinstance(s, segment.Post): + kwargs["post"] = s.value + kwargs["post_tag"] = s.tag + kwargs["post_sep1"] = s.sep1 + kwargs["post_sep2"] = s.sep2 + elif isinstance(s, segment.Dev): + kwargs["dev"] = s.value + kwargs["dev_sep"] = s.sep + elif isinstance(s, segment.Local): + kwargs["local"] = s.value + elif isinstance(s, segment.V): + kwargs["v"] = True + else: + raise TypeError(f"Unexpected segment: {segment}") + + return cls(**kwargs) + + def normalize(self) -> "Version": + return Version( + release=self.release, + epoch=IMPLICIT_ZERO if self.epoch == 0 else self.epoch, + pre_tag=_normalize_pre_tag(self.pre_tag), + pre=self.pre, + post=self.post, + dev=self.dev, + local=_normalize_local(self.local), + ) + + def __str__(self) -> str: + parts = [] + + if self.v: + parts.append("v") + + if not self.epoch_implicit: + parts.append(f"{self.epoch}!") + + parts.append(".".join(str(x) for x in self.release)) + + if self.pre_tag is not None: + if self.pre_sep1: + parts.append(self.pre_sep1) + parts.append(self.pre_tag) + if self.pre_sep2: + parts.append(self.pre_sep2) + if not self.pre_implicit: + parts.append(str(self.pre)) + + if self.post_tag is None and self.post is not None: + parts.append(f"-{self.post}") + elif self.post_tag is not None: + if self.post_sep1: + parts.append(self.post_sep1) + parts.append(self.post_tag) + if self.post_sep2: + parts.append(self.post_sep2) + if not self.post_implicit: + parts.append(str(self.post)) + + if self.dev is not None: + if self.dev_sep is not None: + parts.append(self.dev_sep) + parts.append("dev") + if not self.dev_implicit: + parts.append(str(self.dev)) + + if self.local is not None: + parts.append(f"+{self.local}") + + return "".join(parts) + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {str(self)!r}>" + + def __hash__(self) -> int: + return hash(self._key) + + def __lt__(self, other: Any) -> bool: + return self._compare(other, operator.lt) + + def __le__(self, other: Any) -> bool: + return self._compare(other, operator.le) + + def __eq__(self, other: Any) -> bool: + return self._compare(other, operator.eq) + + def __ge__(self, other: Any) -> bool: + return self._compare(other, operator.ge) + + def __gt__(self, other: Any) -> bool: + return self._compare(other, operator.gt) + + def __ne__(self, other: Any) -> bool: + return self._compare(other, operator.ne) + + def _compare(self, other: Any, method: Callable[[Any, Any], bool]) -> bool: + if not isinstance(other, Version): + return NotImplemented + + return method(self._key, other._key) + + @property + def public(self) -> str: + """A string representing the public version portion of this + :class:`Version` instance. + """ + return str(self).split("+", 1)[0] + + def base_version(self) -> "Version": + """Return a new :class:`Version` instance for the base version of the + current instance. The base version is the public version of the project + without any pre or post release markers. + + See also: :meth:`clear` and :meth:`replace`. + """ + return self.replace(pre=None, post=None, dev=None, local=None) + + @property + def is_prerelease(self) -> bool: + """A boolean value indicating whether this :class:`Version` instance + represents a pre-release and/or development release. + """ + return self.dev is not None or self.pre is not None + + @property + def is_alpha(self) -> bool: + """A boolean value indicating whether this :class:`Version` instance + represents an alpha pre-release. + """ + return _normalize_pre_tag(self.pre_tag) == "a" + + @property + def is_beta(self) -> bool: + """A boolean value indicating whether this :class:`Version` instance + represents a beta pre-release. + """ + return _normalize_pre_tag(self.pre_tag) == "b" + + @property + def is_release_candidate(self) -> bool: + """A boolean value indicating whether this :class:`Version` instance + represents a release candidate pre-release. + """ + return _normalize_pre_tag(self.pre_tag) == "rc" + + @property + def is_postrelease(self) -> bool: + """A boolean value indicating whether this :class:`Version` instance + represents a post-release. + """ + return self.post is not None + + @property + def is_devrelease(self) -> bool: + """A boolean value indicating whether this :class:`Version` instance + represents a development release. + """ + return self.dev is not None + + def _attrs_as_init(self) -> Dict[str, Any]: + d = attr.asdict(self, filter=lambda attr, _: attr.init) + + if self.epoch_implicit: + d["epoch"] = IMPLICIT_ZERO + + if self.pre_implicit: + d["pre"] = IMPLICIT_ZERO + + if self.post_implicit: + d["post"] = IMPLICIT_ZERO + + if self.dev_implicit: + d["dev"] = IMPLICIT_ZERO + + if self.pre is None: + del d["pre"] + del d["pre_tag"] + del d["pre_sep1"] + del d["pre_sep2"] + + if self.post is None: + del d["post"] + del d["post_tag"] + del d["post_sep1"] + del d["post_sep2"] + elif self.post_tag is None: + del d["post_sep1"] + del d["post_sep2"] + + if self.dev is None: + del d["dev"] + del d["dev_sep"] + + return d + + def replace( + self, + release: Union[int, Iterable[int], UnsetType] = UNSET, + v: Union[bool, UnsetType] = UNSET, + epoch: Union[ImplicitZero, int, UnsetType] = UNSET, + pre_tag: Union[PreTag, None, UnsetType] = UNSET, + pre: Union[ImplicitZero, int, None, UnsetType] = UNSET, + post: Union[ImplicitZero, int, None, UnsetType] = UNSET, + dev: Union[ImplicitZero, int, None, UnsetType] = UNSET, + local: Union[str, None, UnsetType] = UNSET, + pre_sep1: Union[Separator, None, UnsetType] = UNSET, + pre_sep2: Union[Separator, None, UnsetType] = UNSET, + post_sep1: Union[Separator, None, UnsetType] = UNSET, + post_sep2: Union[Separator, None, UnsetType] = UNSET, + dev_sep: Union[Separator, None, UnsetType] = UNSET, + post_tag: Union[PostTag, None, UnsetType] = UNSET, + ) -> "Version": + """Return a new :class:`Version` instance with the same attributes, + except for those given as keyword arguments. Arguments have the same + meaning as they do when constructing a new :class:`Version` instance + manually. + """ + kwargs = dict( + release=release, + v=v, + epoch=epoch, + pre_tag=pre_tag, + pre=pre, + post=post, + dev=dev, + local=local, + pre_sep1=pre_sep1, + pre_sep2=pre_sep2, + post_sep1=post_sep1, + post_sep2=post_sep2, + dev_sep=dev_sep, + post_tag=post_tag, + ) + kwargs = {k: v for k, v in kwargs.items() if v is not UNSET} + d = self._attrs_as_init() + + if kwargs.get("post_tag", UNSET) is None: + # ensure we don't carry over separators for new implicit post + # release. By popping from d, there will still be an error if the + # user tries to set them in kwargs + d.pop("post_sep1", None) + d.pop("post_sep2", None) + + if kwargs.get("post", UNSET) is None: + kwargs["post_tag"] = UNSET + d.pop("post_sep1", None) + d.pop("post_sep2", None) + + if kwargs.get("pre", UNSET) is None: + kwargs["pre_tag"] = None + d.pop("pre_sep1", None) + d.pop("pre_sep2", None) + + if kwargs.get("dev", UNSET) is None: + d.pop("dev_sep", None) + + d.update(kwargs) + return Version(**d) + + def _set_release( + self, index: int, value: Optional[int] = None, bump: bool = True + ) -> "Version": + if not isinstance(index, int): + raise TypeError("index must be an integer") + + if index < 0: + raise ValueError("index cannot be negative") + + release = list(self.release) + new_len = index + 1 + + if len(release) < new_len: + release.extend(itertools.repeat(0, new_len - len(release))) + + def new_parts(i: int, n: int) -> int: + if i < index: + return n + if i == index: + if value is None: + return n + 1 + return value + if bump: + return 0 + return n + + new_release = itertools.starmap(new_parts, enumerate(release)) + return self.replace(release=new_release) + + def bump_epoch(self, *, by: int = 1) -> "Version": + """Return a new :class:`Version` instance with the epoch number + bumped. + + :param by: How much to bump the number by. + :type by: int + + :raises TypeError: `by` is not an integer. + + .. doctest:: + + >>> Version.parse('1.4').bump_epoch() + + >>> Version.parse('2!1.4').bump_epoch(by=-1) + + """ + check_by(by, self.epoch) + + epoch = by - 1 if self.epoch is None else self.epoch + by + return self.replace(epoch=epoch) + + def bump_release(self, *, index: int) -> "Version": + """Return a new :class:`Version` instance with the release number + bumped at the given `index`. + + :param index: Index of the release number tuple to bump. It is not + limited to the current size of the tuple. Intermediate indices will + be set to zero. + :type index: int + + :raises TypeError: `index` is not an integer. + :raises ValueError: `index` is negative. + + .. doctest:: + + >>> v = Version.parse('1.4') + >>> v.bump_release(index=0) + + >>> v.bump_release(index=1) + + >>> v.bump_release(index=2) + + >>> v.bump_release(index=3) + + + .. seealso:: + + For more control over the value that is bumped to, see + :meth:`bump_release_to`. + + For fine-grained control, :meth:`set_release` may be used to set + the value at a specific index without setting subsequenct indices + to zero. + """ + return self._set_release(index=index) + + def bump_release_to(self, *, index: int, value: int) -> "Version": + """Return a new :class:`Version` instance with the release number + bumped at the given `index` to `value`. May be used for versioning + schemes such as `CalVer`_. + + .. _`CalVer`: https://calver.org + + :param index: Index of the release number tuple to bump. It is not + limited to the current size of the tuple. Intermediate indices will + be set to zero. + :type index: int + :param value: Value to bump to. This may be any value, but subsequent + indices will be set to zero like a normal version bump. + :type value: int + + :raises TypeError: `index` is not an integer. + :raises ValueError: `index` is negative. + + .. testsetup:: + + import datetime + + .. doctest:: + + >>> v = Version.parse('18.4') + >>> v.bump_release_to(index=0, value=20) + + >>> v.bump_release_to(index=1, value=10) + + + For a project using `CalVer`_ with format ``YYYY.MM.MICRO``, this + method could be used to set the date parts: + + .. doctest:: + + >>> v = Version.parse('2018.4.1') + >>> v = v.bump_release_to(index=0, value=2018) + >>> v = v.bump_release_to(index=1, value=10) + >>> v + + + .. seealso:: + + For typical use cases, see :meth:`bump_release`. + + For fine-grained control, :meth:`set_release` may be used to set + the value at a specific index without setting subsequenct indices + to zero. + """ + return self._set_release(index=index, value=value) + + def set_release(self, *, index: int, value: int) -> "Version": + """Return a new :class:`Version` instance with the release number + at the given `index` set to `value`. + + :param index: Index of the release number tuple to set. It is not + limited to the current size of the tuple. Intermediate indices will + be set to zero. + :type index: int + :param value: Value to set. + :type value: int + + :raises TypeError: `index` is not an integer. + :raises ValueError: `index` is negative. + + .. doctest:: + + >>> v = Version.parse('1.2.3') + >>> v.set_release(index=0, value=3) + + >>> v.set_release(index=1, value=4) + + + .. seealso:: + + For typical use cases, see :meth:`bump_release`. + """ + return self._set_release(index=index, value=value, bump=False) + + def bump_pre(self, tag: Optional[PreTag] = None, *, by: int = 1) -> "Version": + """Return a new :class:`Version` instance with the pre-release number + bumped. + + :param tag: Pre-release tag. Required if not already set. + :type tag: str + :param by: How much to bump the number by. + :type by: int + + :raises ValueError: Trying to call ``bump_pre(tag=None)`` on a + :class:`Version` instance that is not already a pre-release. + :raises ValueError: Calling the method with a `tag` not equal to the + current :attr:`post_tag`. See :meth:`replace` instead. + :raises TypeError: `by` is not an integer. + + .. doctest:: + + >>> Version.parse('1.4').bump_pre('a') + + >>> Version.parse('1.4b1').bump_pre() + + >>> Version.parse('1.4b1').bump_pre(by=-1) + + """ + check_by(by, self.pre) + + pre = by - 1 if self.pre is None else self.pre + by + + if self.pre_tag is None: + if tag is None: + raise ValueError("Cannot bump without pre_tag. Use .bump_pre('')") + else: + # This is an error because different tags have different meanings + if tag is not None and self.pre_tag != tag: + raise ValueError( + "Cannot bump with pre_tag mismatch ({0} != {1}). Use " + ".replace(pre_tag={1!r})".format(self.pre_tag, tag) + ) + tag = self.pre_tag + + return self.replace(pre=pre, pre_tag=tag) + + @overload + def bump_post(self, tag: Optional[PostTag], *, by: int = 1) -> "Version": + pass + + @overload + def bump_post(self, *, by: int = 1) -> "Version": + pass + + def bump_post( + self, tag: Union[PostTag, None, UnsetType] = UNSET, *, by: int = 1 + ) -> "Version": + """Return a new :class:`Version` instance with the post release number + bumped. + + :param tag: Post release tag. Will preserve the current tag by default, + or use `post` if the instance is not already a post release. + :type tag: str + :param by: How much to bump the number by. + :type by: int + + :raises TypeError: `by` is not an integer. + + .. doctest:: + + >>> Version.parse('1.4').bump_post() + + >>> Version.parse('1.4.post0').bump_post(tag=None) + + >>> Version.parse('1.4_post-1').bump_post(tag='rev') + + >>> Version.parse('1.4.post2').bump_post(by=-1) + + """ + check_by(by, self.post) + + post = by - 1 if self.post is None else self.post + by + if tag is UNSET and self.post is not None: + tag = self.post_tag + return self.replace(post=post, post_tag=tag) + + def bump_dev(self, *, by: int = 1) -> "Version": + """Return a new :class:`Version` instance with the development release + number bumped. + + :param by: How much to bump the number by. + :type by: int + + :raises TypeError: `by` is not an integer. + + .. doctest:: + + >>> Version.parse('1.4').bump_dev() + + >>> Version.parse('1.4_dev1').bump_dev() + + >>> Version.parse('1.4.dev3').bump_dev(by=-1) + + """ + check_by(by, self.dev) + + dev = by - 1 if self.dev is None else self.dev + by + return self.replace(dev=dev) + + def truncate(self, *, min_length: int = 1) -> "Version": + """Return a new :class:`Version` instance with trailing zeros removed + from the release segment. + + :param min_length: Minimum number of parts to keep. + :type min_length: int + + .. doctest:: + + >>> Version.parse('0.1.0').truncate() + + >>> Version.parse('1.0.0').truncate(min_length=2) + + >>> Version.parse('1').truncate(min_length=2) + + """ + if not isinstance(min_length, int): + raise TypeError("min_length must be an integer") + + if min_length < 1: + raise ValueError("min_length must be positive") + + release = list(self.release) + if len(release) < min_length: + release.extend(itertools.repeat(0, min_length - len(release))) + + last_nonzero = max( + last((i for i, n in enumerate(release) if n), default=0), + min_length - 1, + ) + return self.replace(release=release[: last_nonzero + 1]) + + +def _normalize_pre_tag(pre_tag: Optional[PreTag]) -> Optional[NormalizedPreTag]: + if pre_tag is None: + return None + + if pre_tag == "alpha": + pre_tag = "a" + elif pre_tag == "beta": + pre_tag = "b" + elif pre_tag in {"c", "pre", "preview"}: + pre_tag = "rc" + + return cast(NormalizedPreTag, pre_tag) + + +def _normalize_local(local: Optional[str]) -> Optional[str]: + if local is None: + return None + + return ".".join(map(str, _parse_local_version(local))) + + +def _cmpkey( + epoch: int, + release: Tuple[int, ...], + pre_tag: Optional[NormalizedPreTag], + pre_num: Optional[int], + post: Optional[int], + dev: Optional[int], + local: Optional[str], +) -> Any: + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed( + list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + ) + ) + ) + + pre = pre_tag, pre_num + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre_num is None and post is None and dev is not None: + pre = -Infinity # type: ignore[assignment] + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre_num is None: + pre = Infinity # type: ignore[assignment] + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity # type: ignore[assignment] + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity # type: ignore[assignment] + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity # type: ignore[assignment] + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( # type: ignore[assignment] + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in _parse_local_version(local) + ) + + return epoch, release, pre, post, dev, local + + +_local_version_separators = re.compile(r"[._-]") + + +@overload +def _parse_local_version(local: str) -> Tuple[Union[str, int], ...]: + pass + + +@overload +def _parse_local_version(local: None) -> None: + pass + + +def _parse_local_version(local: Optional[str]) -> Optional[Tuple[Union[str, int], ...]]: + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_separators.split(local) + ) + + return None diff --git a/myenv/lib/python3.12/site-packages/parver/py.typed b/myenv/lib/python3.12/site-packages/parver/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt new file mode 100644 index 0000000..0e63548 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt @@ -0,0 +1,760 @@ +@Switch01 +A_Rog +Aakanksha Agrawal +Abhinav Sagar +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Alberto Sottile +Aleks Bunin +Ales Erjavec +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Hedges +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Aleš Erjavec +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andre Aguiar +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrew Shymanel +Andrey Bienkowski +Andrey Bulgakov +Andrés Delfino +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anudit Nagar +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Arun Babu Neelicattu +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avinash Karhana +Avner Cohen +Awit (Ah-Wit) Ghirmai +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Bodenmiller +Ben Darnell +Ben Hoyt +Ben Mares +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernard +Bernard Tyers +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bhavam Vidyarthi +Blazej Michalik +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brett Rosen +Brian Cristante +Brian Rosner +briantracy +BrownTruck +Bruno Oliveira +Bruno Renié +Bruno S +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +bwoodsend +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris Kuehl +Chris McDonough +Chris Pawley +Chris Pryer +Chris Wolfe +Christian Clauss +Christian Heimes +Christian Oudard +Christoph Reiter +Christopher Hunt +Christopher Snyder +cjc7373 +Clark Boylan +Claudio Jolowicz +Clay McClure +Cody +Cody Soyland +Colin Watson +Collin Anderson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Cristina +Cristina Muñoz +Curtis Doty +cytolentino +Daan De Meyer +Dale +Damian +Damian Quiroga +Damian Shaw +Dan Black +Dan Savilonis +Dan Sully +Dane Hillard +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Katz +Daniel Shaulov +Daniele Esposti +Daniele Nicolodi +Daniele Procida +Daniil Konovalenko +Danny Hermes +Danny McClanahan +Darren Kavanagh +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Caro +David D Lowe +David Evans +David Hewitt +David Linke +David Poggi +David Pursehouse +David Runge +David Tucker +David Wales +Davidovich +ddelange +Deepak Sharma +Deepyaman Datta +Denise Yu +dependabot[bot] +derwolfe +Desetude +Devesh Kumar Singh +Diego Caraballo +Diego Ramirez +DiegoCaraballo +Dimitri Merejkowsky +Dimitri Papadopoulos +Dirk Stolle +Dmitry Gladkov +Dmitry Volodin +Domen Kožar +Dominic Davis-Foster +Donald Stufft +Dongweiming +doron zarhi +Dos Moonen +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley +Edgar Ramírez +Edgar Ramírez Mondragón +Ee Durbin +Efflam Lemaillet +efflamlemaillet +Eitan Adler +ekristina +elainechan +Eli Schwartz +Elisha Hollander +Ellen Marie Dash +Emil Burzo +Emil Styrke +Emmanuel Arias +Endoh Takanao +enoch +Erdinc Mutlu +Eric Cousineau +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Erwin Janssen +Eugene Vereshchagin +everdimension +Federico +Felipe Peter +Felix Yan +fiber-space +Filip Kokosiński +Filipe Laíns +Finn Womack +finnagin +Flavio Amurrio +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gavin +gdanielson +Geoffrey Sneddon +George Song +Georgi Valkov +Georgy Pchelkin +ghost +Giftlin Rajaiah +gizmoguy1 +gkdoc +Godefroid Chapelle +Gopinath M +GOTO Hayato +gousaiyang +gpiks +Greg Roodt +Greg Ward +Guilherme Espada +Guillaume Seguin +gutsytechster +Guy Rozendorn +Guy Tuval +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +harupy +Harutaka Kawamura +hauntsaninja +Henrich Hartzer +Henry Schreiner +Herbert Pfennig +Holly Stotelmyer +Honnix +Hsiaoming Yang +Hugo Lopes Tavares +Hugo van Kemenade +Hugues Bruant +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilan Schnell +Illia Volochii +Ilya Baryshev +Inada Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Itamar Turner-Trauring +Ivan Pozdeev +J. Nick Koston +Jacob Kim +Jacob Walls +Jaime Sanz +jakirkham +Jakub Kuczys +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Curtin +James Firth +James Gerity +James Polley +Jan Pokorný +Jannis Leidel +Jarek Potiuk +jarondl +Jason Curtis +Jason R. Coombs +JasonMo +JasonMo1 +Jay Graves +Jean Abou Samra +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jeff Widman +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jesse Rittner +Jiashuo Li +Jim Fisher +Jim Garrison +Jiun Bae +Jivan Amara +Joe Bylund +Joe Michelini +John Paton +John T. Wodder II +John-Scott Atlakson +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joonatan Partanen +Joost Molenaar +Jorge Niedbalski +Joseph Bylund +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Joshua +Juan Luis Cano Rodríguez +Juanjo Bazán +Judah Rand +Julian Berman +Julian Gethmann +Julien Demoor +Jussi Kukkonen +jwg4 +Jyrki Pulliainen +Kai Chen +Kai Mueller +Kamal Bin Mustafa +kasium +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +Klaas van Schelven +KOLANICH +kpinc +Krishna Oza +Kumar McMillan +Kurt McKee +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurent LAPORTE +Laurie O +Laurie Opperman +layday +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +lorddavidiii +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Lukas Geiger +Lukas Juhrich +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +M00nL1ght +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Markus Hametner +Martey Dodoo +Martin Fischer +Martin Häcker +Martin Pavlasek +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Mathieu Kniewallner +Matt Bacchi +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Feickert +Matthew Gilliard +Matthew Iversen +Matthew Treinish +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maurits van Rees +Max W Chase +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna +mdebi +memoselyk +meowmeowcat +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Mintz +Michael Williamson +michaelpacer +Michał Górny +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Muha Ajjan‮ +Nadav Wexler +Nahuel Ambrosini +Nate Coraor +Nate Prewitt +Nathan Houghton +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nguyễn Gia Phong +Nicholas Serra +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nicole Harris +Nikhil Benesch +Nikhil Ladha +Nikita Chepanov +Nikolay Korolev +Nipunn Koorapati +Nitesh Sharma +Niyas Sait +Noah +Noah Gorny +Nowell Strite +NtaleGrey +nvdv +OBITORASU +Ofek Lev +ofrinevo +Oliver Freund +Oliver Jeeves +Oliver Mannion +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +onlinejudge95 +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Ganssle +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavel Safronov +Pavithra Eswaramoorthy +Pawel Jasinski +Paweł Szramowski +Pekka Klärck +Peter Gessler +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Elson +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +Pieter Degroote +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Prashant Sharma +Pratik Mallya +pre-commit-ci[bot] +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal +q0w +Qiangning Hong +Qiming Xu +Quentin Lee +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Reece Dunham +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Riccardo Schirone +Richard Jones +Richard Si +Ricky Ng-Adam +Rishi +RobberPhex +Robert Collins +Robert McGibbon +Robert Pollak +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Roman Bogorodskiy +Roman Donchenko +Romuald Brunet +ronaudinho +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Ruairidh MacLeod +Russell Keith-Magee +Ryan Shepherd +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +sandeepkiran-js +Sander Van Balen +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Michael Larson +Seth Woodworth +Shahar Epstein +Shantanu +shireenrao +Shivansh-007 +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +sinscary +snook92 +socketubs +Sorin Sbarnea +Srinivas Nyayapati +Stavros Korokithakis +Stefan Scherfke +Stefano Rivera +Stephan Erb +Stephen Rosen +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +Steven Silvester +stonebig +studioj +Stéphane Bidoul +Stéphane Bidoul (ACSONE) +Stéphane Klein +Sumana Harihareswara +Surbhi Sharma +Sviatoslav Sydorenko +Swat009 +Sylvain +Takayuki SHIMIZUKAWA +Taneli Hukkinen +tbeswick +Thiago +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Thomas VINCENT +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tobias Hermann +Tom Forbes +Tom Freudenheim +Tom V +Tomas Hrnciar +Tomas Orsava +Tomer Chachamu +Tommi Enenkel | AnB +Tomáš Hrnčiar +Tony Beswick +Tony Narlock +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +toxinu +Travis Swicegood +Tushar Sadhwani +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Vikram - Google +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo +Vipul Kumar +Vitaly Babiy +Vladimir Fokow +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William Edwards +William ML Leslie +William T Olson +William Woodruff +Wilson Mo +wim glenn +Winson Luk +Wolfgang Maier +Wu Zhenyu +XAMES3 +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Yusuke Hayashi +Zearin +Zhiping Deng +ziebam +Zvezdan Petkovic +Łukasz Langa +Роман Донченко +Семён Марьясин +‮rekcäH nitraM‮ diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..8e7b65e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-present The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA new file mode 100644 index 0000000..e5b45bd --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA @@ -0,0 +1,88 @@ +Metadata-Version: 2.1 +Name: pip +Version: 24.0 +Summary: The PyPA recommended tool for installing Python packages. +Author-email: The pip developers +License: MIT +Project-URL: Homepage, https://pip.pypa.io/ +Project-URL: Documentation, https://pip.pypa.io +Project-URL: Source, https://github.com/pypa/pip +Project-URL: Changelog, https://pip.pypa.io/en/stable/news/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.txt +License-File: AUTHORS.txt + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + :alt: PyPI + +.. image:: https://img.shields.io/pypi/pyversions/pip + :target: https://pypi.org/project/pip + :alt: PyPI - Python Version + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + :alt: Documentation + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ + +We release updates regularly, with a new version every 3 months. Find more details in our documentation: + +* `Release notes`_ +* `Release process`_ + +If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Development documentation`_ +* `Development IRC`_ + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. + +.. _package installer: https://packaging.python.org/guides/tool-recommendations/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installation/ +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ +.. _GitHub page: https://github.com/pypa/pip +.. _Development documentation: https://pip.pypa.io/en/latest/development +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa +.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev +.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD new file mode 100644 index 0000000..35277e2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD @@ -0,0 +1,1005 @@ +../../../bin/pip,sha256=_l-Jtiplo-cvoAZe4iBKzdNWw843POkgkc259QdR_MM,304 +../../../bin/pip3,sha256=_l-Jtiplo-cvoAZe4iBKzdNWw843POkgkc259QdR_MM,304 +../../../bin/pip3.12,sha256=_l-Jtiplo-cvoAZe4iBKzdNWw843POkgkc259QdR_MM,304 +pip-24.0.dist-info/AUTHORS.txt,sha256=SwXm4nkwRkmtnO1ZY-dLy7EPeoQNXMNLby5CN3GlNhY,10388 +pip-24.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-24.0.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 +pip-24.0.dist-info/METADATA,sha256=kNEfJ3_Vho2mee4lfJdlbd5RHIqsfQJSMUB-bOkIOeI,3581 +pip-24.0.dist-info/RECORD,, +pip-24.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip-24.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +pip-24.0.dist-info/entry_points.txt,sha256=Fa_c0b-xGFaYxagIruvpJD6qqXmNTA02vAVIkmMj-9o,125 +pip-24.0.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=oAk1nFpLmUVS5Ln7NxvNoGUn5Vkn6FGQjPaNDf8Q8pk,355 +pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854 +pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444 +pip/__pycache__/__init__.cpython-312.pyc,, +pip/__pycache__/__main__.cpython-312.pyc,, +pip/__pycache__/__pip-runner__.cpython-312.pyc,, +pip/_internal/__init__.py,sha256=iqZ5-YQsQV08tkUc7L806Reop6tguLFWf70ySF6be0Y,515 +pip/_internal/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/__pycache__/build_env.cpython-312.pyc,, +pip/_internal/__pycache__/cache.cpython-312.pyc,, +pip/_internal/__pycache__/configuration.cpython-312.pyc,, +pip/_internal/__pycache__/exceptions.cpython-312.pyc,, +pip/_internal/__pycache__/main.cpython-312.pyc,, +pip/_internal/__pycache__/pyproject.cpython-312.pyc,, +pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc,, +pip/_internal/__pycache__/wheel_builder.cpython-312.pyc,, +pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243 +pip/_internal/cache.py,sha256=uiYD-9F0Bv1C8ZyWE85lpzDmQf7hcUkgL99GmI8I41Q,10370 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-312.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc,, +pip/_internal/cli/__pycache__/command_context.cpython-312.pyc,, +pip/_internal/cli/__pycache__/main.cpython-312.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-312.pyc,, +pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc,, +pip/_internal/cli/__pycache__/req_command.cpython-312.pyc,, +pip/_internal/cli/__pycache__/spinners.cpython-312.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc,, +pip/_internal/cli/autocompletion.py,sha256=_br_5NgSxSuvPjMF0MLHzS5s6BpSkQAQHKrLK89VauM,6690 +pip/_internal/cli/base_command.py,sha256=iuVWGa2oTq7gBReo0er3Z0tXJ2oqBIC6QjDHcnDhKXY,8733 +pip/_internal/cli/cmdoptions.py,sha256=V8ggG6AtHpHKkH_6tRU0mhJaZTeqtrFpu75ghvMXXJk,30063 +pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 +pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816 +pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 +pip/_internal/cli/parser.py,sha256=KW6C3-7-4ErTNB0TfLTKwOdHcd-qefCeGnrOoE2r0RQ,10781 +pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 +pip/_internal/cli/req_command.py,sha256=c7_XHABnXmD3_qlK9-r37KqdKBAcgmVKvQ2WcTrNLfc,18369 +pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 +pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 +pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 +pip/_internal/commands/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/commands/__pycache__/cache.cpython-312.pyc,, +pip/_internal/commands/__pycache__/check.cpython-312.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-312.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-312.pyc,, +pip/_internal/commands/__pycache__/debug.cpython-312.pyc,, +pip/_internal/commands/__pycache__/download.cpython-312.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-312.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-312.pyc,, +pip/_internal/commands/__pycache__/help.cpython-312.pyc,, +pip/_internal/commands/__pycache__/index.cpython-312.pyc,, +pip/_internal/commands/__pycache__/inspect.cpython-312.pyc,, +pip/_internal/commands/__pycache__/install.cpython-312.pyc,, +pip/_internal/commands/__pycache__/list.cpython-312.pyc,, +pip/_internal/commands/__pycache__/search.cpython-312.pyc,, +pip/_internal/commands/__pycache__/show.cpython-312.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944 +pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782 +pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287 +pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766 +pip/_internal/commands/debug.py,sha256=63972uUCeMIGOdMMVeIUGrOjTOqTVWplFC82a-hcKyA,6777 +pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335 +pip/_internal/commands/freeze.py,sha256=qrIHS_-c6JPrQ92hMhAv9kkl0bHgFpRLwYJDdbcYr1o,3243 +pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 +pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 +pip/_internal/commands/index.py,sha256=CNXQer_PeZKSJooURcCFCBEKGfwyNoUWYP_MWczAcOM,4775 +pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188 +pip/_internal/commands/install.py,sha256=VxDd-BD3a27ApeE2OK34rfBXS6Zo2wtemK9-HCwPqxM,28782 +pip/_internal/commands/list.py,sha256=-QbpPuGDiGN1SdThsk2ml8beBnepliefbGhMAN8tkzU,12547 +pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 +pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419 +pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886 +pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476 +pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006 +pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 +pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/distributions/__pycache__/base.cpython-312.pyc,, +pip/_internal/distributions/__pycache__/installed.cpython-312.pyc,, +pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc,, +pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/distributions/base.py,sha256=oRSEvnv2ZjBnargamnv2fcJa1n6gUDKaW0g6CWSEpWs,1743 +pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842 +pip/_internal/distributions/sdist.py,sha256=4K3V0VNMllHbBzCJibjwd_tylUKpmIdu2AQyhplvCQo,6709 +pip/_internal/distributions/wheel.py,sha256=-ma3sOtUQj0AxXCEb6_Fhmjl3nh4k3A0HC2taAb2N-4,1277 +pip/_internal/exceptions.py,sha256=TmF1iNFEneSWaemwlg6a5bpPuq2cMHK7d1-SvjsQHb0,23634 +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/index/__pycache__/collector.cpython-312.pyc,, +pip/_internal/index/__pycache__/package_finder.cpython-312.pyc,, +pip/_internal/index/__pycache__/sources.cpython-312.pyc,, +pip/_internal/index/collector.py,sha256=sH0tL_cOoCk6pLLfCSGVjFM4rPEJtllF-VobvAvLSH4,16590 +pip/_internal/index/package_finder.py,sha256=S_nC8gzVIMY6ikWfKoSOzRtoesUqnfNhAPl_BwSOusA,37843 +pip/_internal/index/sources.py,sha256=dJegiR9f86kslaAHcv9-R5L_XBf5Rzm_FkyPteDuPxI,8688 +pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365 +pip/_internal/locations/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc,, +pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc,, +pip/_internal/locations/__pycache__/base.cpython-312.pyc,, +pip/_internal/locations/_distutils.py,sha256=H9ZHK_35rdDV1Qsmi4QeaBULjFT4Mbu6QuoVGkJ6QHI,6009 +pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680 +pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556 +pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 +pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339 +pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/metadata/__pycache__/_json.cpython-312.pyc,, +pip/_internal/metadata/__pycache__/base.cpython-312.pyc,, +pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc,, +pip/_internal/metadata/_json.py,sha256=Rz5M5ciSNvITwaTQR6NfN8TgKgM5WfTws4D6CFknovE,2627 +pip/_internal/metadata/base.py,sha256=l3Wgku4xlgr8s4p6fS-3qQ4QKOpPbWLRwi5d9omEFG4,25907 +pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135 +pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc,, +pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc,, +pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc,, +pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882 +pip/_internal/metadata/importlib/_dists.py,sha256=UPl1wUujFqiwiltRJ1tMF42WRINO1sSpNNlYQ2mX0mk,8297 +pip/_internal/metadata/importlib/_envs.py,sha256=XTaFIYERP2JF0QUZuPx2ETiugXbPEcZ8q8ZKeht6Lpc,7456 +pip/_internal/metadata/pkg_resources.py,sha256=opjw4IBSqHvie6sXJ_cbT42meygoPEUfNURJuWZY7sk,10035 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-312.pyc,, +pip/_internal/models/__pycache__/direct_url.cpython-312.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-312.pyc,, +pip/_internal/models/__pycache__/index.cpython-312.pyc,, +pip/_internal/models/__pycache__/installation_report.cpython-312.pyc,, +pip/_internal/models/__pycache__/link.cpython-312.pyc,, +pip/_internal/models/__pycache__/scheme.cpython-312.pyc,, +pip/_internal/models/__pycache__/search_scope.cpython-312.pyc,, +pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc,, +pip/_internal/models/__pycache__/target_python.cpython-312.pyc,, +pip/_internal/models/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/models/candidate.py,sha256=hEPu8VdGE5qVASv6vLz-R-Rgh5-7LMbai1jgthMCd8M,931 +pip/_internal/models/direct_url.py,sha256=FwouYBKcqckh7B-k2H3HVgRhhFTukFwqiS3kfvtFLSk,6889 +pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486 +pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 +pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818 +pip/_internal/models/link.py,sha256=XirOAGv1jgMu7vu87kuPbohGj7VHpwVrd2q3KUgVQNg,20777 +pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 +pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643 +pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 +pip/_internal/models/target_python.py,sha256=34EkorrMuRvRp-bjqHKJ-bOO71m9xdjN2b8WWFEC2HU,4272 +pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600 +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/network/__pycache__/auth.cpython-312.pyc,, +pip/_internal/network/__pycache__/cache.cpython-312.pyc,, +pip/_internal/network/__pycache__/download.cpython-312.pyc,, +pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc,, +pip/_internal/network/__pycache__/session.cpython-312.pyc,, +pip/_internal/network/__pycache__/utils.cpython-312.pyc,, +pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc,, +pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541 +pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935 +pip/_internal/network/download.py,sha256=i0Tn55CD5D7XYEFY3TxiYaCf0OaaTQ6SScNgCsSeV14,6086 +pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638 +pip/_internal/network/session.py,sha256=9tqEDD8JiVaFdplOEXJxNo9cjRfBZ6RIa0yQQ_qBNiM,18698 +pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 +pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/operations/__pycache__/check.cpython-312.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-312.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-312.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc,, +pip/_internal/operations/build/build_tracker.py,sha256=z-H5DOknZdBa3dh2Vq6VBMY5qLYIKmlj2p6CGZK5Lc8,4832 +pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422 +pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474 +pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 +pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075 +pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417 +pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 +pip/_internal/operations/check.py,sha256=fsqA88iGaqftCr2tlP3sSU202CSkoODRtW0O-JU9M4Y,6806 +pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816 +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc,, +pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282 +pip/_internal/operations/install/wheel.py,sha256=9hGb1c4bRnPIb2FG7CtUSPfPxqprmHQBtwIAlWPNTtE,27311 +pip/_internal/operations/prepare.py,sha256=57Oq87HfunX3Rbqp47FdaJr9cHbAKUm_3gv7WhBAqbE,28128 +pip/_internal/pyproject.py,sha256=4Xszp11xgr126yzG6BbJA0oaQ9WXuhb0jyUb-y_6lPQ,7152 +pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738 +pip/_internal/req/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-312.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-312.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-312.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-312.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc,, +pip/_internal/req/constructors.py,sha256=8hlY56imEthLORRwmloyKz3YOyXymIaKsNB6P9ewvNI,19018 +pip/_internal/req/req_file.py,sha256=M8ttOZL-PwAj7scPElhW3ZD2hiD9mm_6FJAGIbwAzEI,17790 +pip/_internal/req/req_install.py,sha256=wtOPxkyRSM8comTks8oL1Gp2oyGqbH7JwIDRci2QiPk,35460 +pip/_internal/req/req_set.py,sha256=iMYDUToSgkxFyrP_OrTtPSgw4dwjRyGRDpGooTqeA4Y,4704 +pip/_internal/req/req_uninstall.py,sha256=nmvTQaRCC0iu-5Tw0djlXJhSj6WmqHRvT3qkkEdC35E,24551 +pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/resolution/__pycache__/base.cpython-312.pyc,, +pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 +pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc,, +pip/_internal/resolution/legacy/resolver.py,sha256=Xk24jQ62GvLr4Mc7IjN_qiO88qp0BImzVmPIFz9QLOE,24025 +pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/base.py,sha256=jg5COmHLhmBIKOR-4spdJD3jyULYa1BdsqiBu2YJnJ4,5173 +pip/_internal/resolution/resolvelib/candidates.py,sha256=19Ki91Po-MSxBknGIfOGkaWkFdOznN0W_nKv7jL28L0,21052 +pip/_internal/resolution/resolvelib/factory.py,sha256=vqqk-hjchdhShwWVdeW2_A-5ZblLhE_nC_v3Mhz4Svc,32292 +pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 +pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824 +pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100 +pip/_internal/resolution/resolvelib/requirements.py,sha256=-kJONP0WjDfdTvBAs2vUXPgAnOyNIBEAXY4b72ogtPE,5696 +pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592 +pip/_internal/self_outdated_check.py,sha256=saxQLB8UzIFtMScquytG10TOTsYVFJQ_mkW1NY-46wE,8378 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc,, +pip/_internal/utils/__pycache__/_log.cpython-312.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-312.pyc,, +pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc,, +pip/_internal/utils/__pycache__/datetime.cpython-312.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc,, +pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc,, +pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-312.pyc,, +pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc,, +pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-312.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-312.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-312.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-312.pyc,, +pip/_internal/utils/__pycache__/models.cpython-312.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-312.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc,, +pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc,, +pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc,, +pip/_internal/utils/__pycache__/urls.cpython-312.pyc,, +pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc,, +pip/_internal/utils/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351 +pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 +pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 +pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 +pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 +pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 +pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 +pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 +pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463 +pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 +pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 +pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 +pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 +pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113 +pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118 +pip/_internal/utils/logging.py,sha256=fdtuZJ-AKkqwDTANDvGcBEpssL8el7T1jnwk1CnZl3Y,11603 +pip/_internal/utils/misc.py,sha256=fNXwaeeikvnUt4CPMFIL4-IQbZDxxjj4jDpzCi4ZsOw,23623 +pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 +pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 +pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435 +pip/_internal/utils/subprocess.py,sha256=zzdimb75jVLE1GU4WlTZ055gczhD7n1y1xTcNc7vNZQ,9207 +pip/_internal/utils/temp_dir.py,sha256=DUAw22uFruQdK43i2L2K53C-CDjRCPeAsBKJpu-rHQ4,9312 +pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 +pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 +pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456 +pip/_internal/utils/wheel.py,sha256=i4BwUNHattzN0ixy3HBAF04tZPRh2CcxaT6t86viwkE,4499 +pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 +pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc,, +pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519 +pip/_internal/vcs/git.py,sha256=CeKBGJnl6uskvvjkAUXrJVxbHJrpS_B_pyfFdjL3CRc,18121 +pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249 +pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729 +pip/_internal/vcs/versioncontrol.py,sha256=3eIjtOMYvOY5qP6BMYIYDZ375CSuec6kSEB0bOo1cSs,22787 +pip/_internal/wheel_builder.py,sha256=qTTzQV8F6b1jNsFCda1TRQC8J7gK-m7iuRNgKo7Dj68,11801 +pip/_vendor/__init__.py,sha256=U51NPwXdA-wXOiANIQncYjcMp6txgeOL5nHxksJeyas,4993 +pip/_vendor/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/__pycache__/six.cpython-312.pyc,, +pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc,, +pip/_vendor/cachecontrol/__init__.py,sha256=ctHagMhQXuvQDdm4TirZrwDOT5H8oBNAJqzdKI6sovk,676 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737 +pip/_vendor/cachecontrol/adapter.py,sha256=_CcWvUP9048qAZjsNqViaHbdcLs9mmFNixVfpO7oebE,6392 +pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=3z8AWKD-vfKeiJqIzLmJyIYtR2yd6Tsh3u1TyLRQoIQ,5352 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386 +pip/_vendor/cachecontrol/controller.py,sha256=keCFA3ZaNVaWTwHd6F1zqWhb4vyvNx_UvZuo5iIYMfo,18384 +pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292 +pip/_vendor/cachecontrol/heuristics.py,sha256=fdFbk9W8IeLrjteIz_fK4mj2HD_Y7COXF2Uc8TgjT1c,4828 +pip/_vendor/cachecontrol/serialize.py,sha256=0dHeMaDwysVAAnGVlhMOP4tDliohgNK0Jxk_zsOiWxw,7173 +pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417 +pip/_vendor/certifi/__init__.py,sha256=L_j-d0kYuA_MzA2_2hraF1ovf6KT6DTquRdV3paQwOk,94 +pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 +pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-312.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=eU0Dn_3yd8BH4m8sfVj4Glhl2KDrcCSg-sEWT-pNJ88,281617 +pip/_vendor/certifi/core.py,sha256=DNTl8b_B6C4vO3Vc9_q2uvwHpNnBQoy5onDC4McImxc,4531 +pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797 +pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-312.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274 +pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763 +pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032 +pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915 +pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420 +pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242 +pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732 +pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542 +pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860 +pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683 +pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006 +pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176 +pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934 +pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566 +pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753 +pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913 +pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753 +pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735 +pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759 +pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537 +pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796 +pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498 +pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752 +pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562 +pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484 +pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196 +pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363 +pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035 +pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774 +pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372 +pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380 +pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077 +pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131 +pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391 +pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc,, +pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560 +pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402 +pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137 +pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007 +pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848 +pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505 +pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812 +pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244 +pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 +pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 +pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 +pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 +pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 +pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc,, +pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc,, +pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc,, +pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc,, +pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc,, +pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc,, +pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 +pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 +pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 +pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 +pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 +pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 +pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 +pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 +pip/_vendor/distlib/__init__.py,sha256=hJKF7FHoqbmGckncDuEINWo_OYkDNiHODtYXSMcvjcc,625 +pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc,, +pip/_vendor/distlib/compat.py,sha256=Un-uIBvy02w-D267OG4VEhuddqWgKj9nNkxVltAb75w,41487 +pip/_vendor/distlib/database.py,sha256=0V9Qvs0Vrxa2F_-hLWitIyVyRifJ0pCxyOI-kEOBwsA,51965 +pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797 +pip/_vendor/distlib/locators.py,sha256=o1r_M86_bRLafSpetmyfX8KRtFu-_Q58abvQrnOSnbA,51767 +pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168 +pip/_vendor/distlib/markers.py,sha256=n3DfOh1yvZ_8EW7atMyoYeZFXjYla0Nz0itQlojCd0A,5268 +pip/_vendor/distlib/metadata.py,sha256=pB9WZ9mBfmQxc9OVIldLS5CjOoQRvKAvUwwQyKwKQtQ,39693 +pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 +pip/_vendor/distlib/scripts.py,sha256=nQFXN6G7nOWNDUyxirUep-3WOlJhB7McvCs9zOnkGTI,18315 +pip/_vendor/distlib/util.py,sha256=XSznxEi_i3T20UJuaVc0qXHz5ksGUCW1khYlBprN_QE,67530 +pip/_vendor/distlib/version.py,sha256=9pXkduchve_aN7JG6iL9VTYV_kqNSGoc2Dwl8JuySnQ,23747 +pip/_vendor/distlib/wheel.py,sha256=FVQCve8u-L0QYk5-YTZc7s4WmNQdvjRWTK08KXzZVX4,43958 +pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 +pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 +pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/distro/__pycache__/distro.cpython-312.pyc,, +pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330 +pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 +pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc,, +pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 +pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 +pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 +pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 +pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 +pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 +pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 +pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132 +pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc,, +pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc,, +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079 +pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544 +pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 +pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 +pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-312.pyc,, +pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 +pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378 +pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 +pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 +pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 +pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110 +pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 +pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 +pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 +pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155 +pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476 +pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc,, +pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211 +pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132 +pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678 +pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809 +pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160 +pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573 +pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983 +pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353 +pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/console.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/style.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/token.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/util.cpython-312.pyc,, +pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685 +pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697 +pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938 +pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386 +pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178 +pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424 +pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc,, +pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 +pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314 +pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094 +pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610 +pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938 +pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981 +pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351 +pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073 +pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212 +pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014 +pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335 +pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674 +pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753 +pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618 +pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130 +pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc,, +pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc,, +pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281 +pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424 +pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986 +pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591 +pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072 +pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092 +pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882 +pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257 +pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700 +pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184 +pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223 +pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230 +pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116 +pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc,, +pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc,, +pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567 +pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387 +pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445 +pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215 +pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523 +pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646 +pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692 +pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488 +pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646 +pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670 +pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491 +pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 +pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920 +pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546 +pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927 +pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169 +pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-312.pyc,, +pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435 +pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 +pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697 +pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449 +pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 +pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 +pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 +pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 +pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 +pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879 +pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 +pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373 +pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 +pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 +pip/_vendor/requests/utils.py,sha256=kOPn0qYD6xRTzaxbqTdYiSInBZHl6379AJsyIgzYGLY,33460 +pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537 +pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc,, +pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc,, +pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc,, +pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc,, +pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc,, +pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 +pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871 +pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601 +pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511 +pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963 +pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090 +pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478 +pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/abc.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/align.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/bar.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/box.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/cells.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/color.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/columns.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/console.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/containers.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/control.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/errors.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/json.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/layout.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/live.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/logging.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/markup.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/measure.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/padding.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/pager.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/palette.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/panel.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/progress.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/region.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/repr.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/rule.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/scope.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/screen.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/segment.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/status.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/style.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/styled.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/table.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/text.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/theme.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/themes.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/tree.cpython-312.pyc,, +pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 +pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 +pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 +pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100 +pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 +pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 +pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 +pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 +pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 +pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 +pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 +pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 +pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 +pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 +pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 +pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 +pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 +pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926 +pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 +pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 +pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 +pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368 +pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 +pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 +pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842 +pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509 +pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224 +pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 +pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 +pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218 +pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 +pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 +pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 +pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082 +pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 +pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 +pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 +pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 +pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 +pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584 +pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032 +pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 +pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007 +pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273 +pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 +pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903 +pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198 +pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 +pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 +pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 +pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 +pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574 +pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852 +pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706 +pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165 +pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303 +pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 +pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 +pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431 +pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602 +pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843 +pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 +pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247 +pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 +pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 +pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 +pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 +pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173 +pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684 +pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 +pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525 +pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 +pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 +pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604 +pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 +pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 +pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493 +pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc,, +pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc,, +pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551 +pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179 +pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682 +pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562 +pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372 +pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 +pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746 +pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086 +pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142 +pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024 +pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 +pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc,, +pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc,, +pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc,, +pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 +pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 +pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 +pip/_vendor/truststore/__init__.py,sha256=qzTLSH8PvAkY1fr6QQ2vV-KwE_M83wdXugtpJaP_AbM,403 +pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc,, +pip/_vendor/truststore/_api.py,sha256=xjuEu_rlH4hcdJTROImEyOEqdw-F8t5vO2H2BToY0Ro,9893 +pip/_vendor/truststore/_macos.py,sha256=BjvAKoAjXhdIPuxpY124HJIFswDb0pq8DjynzJOVwqc,17694 +pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324 +pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130 +pip/_vendor/truststore/_windows.py,sha256=1x_EhROeJ9QK1sMAjfnZC7awYI8UnBJYL-TjACUYI4A,17468 +pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130 +pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 +pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 +pip/_vendor/urllib3/_version.py,sha256=azoM7M7BUADl2kBhMVR6PPf2GhBDI90me1fcnzTwdcw,64 +pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300 +pip/_vendor/urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 +pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 +pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 +pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 +pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 +pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 +pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 +pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343 +pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 +pip/_vendor/urllib3/poolmanager.py,sha256=0i8cJgrqupza67IBPZ_u9jXvnSxr5UBlVEiUqdkPtYI,19752 +pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691 +pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641 +pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 +pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 +pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 +pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 +pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 +pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050 +pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 +pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 +pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 +pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168 +pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296 +pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 +pip/_vendor/vendor.txt,sha256=4NKk7fQhVsZw0U-0zmm9Q2LgGyaPXacFbnJAaS0Q6EY,493 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL new file mode 100644 index 0000000..98c0d20 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt new file mode 100644 index 0000000..26fa361 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt @@ -0,0 +1,4 @@ +[console_scripts] +pip = pip._internal.cli.main:main +pip3 = pip._internal.cli.main:main +pip3.12 = pip._internal.cli.main:main diff --git a/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.12/site-packages/pip/__init__.py b/myenv/lib/python3.12/site-packages/pip/__init__.py new file mode 100644 index 0000000..be0e3ed --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/__init__.py @@ -0,0 +1,13 @@ +from typing import List, Optional + +__version__ = "24.0" + + +def main(args: Optional[List[str]] = None) -> int: + """This is an internal API only meant for use by pip's own console scripts. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/myenv/lib/python3.12/site-packages/pip/__main__.py b/myenv/lib/python3.12/site-packages/pip/__main__.py new file mode 100644 index 0000000..5991326 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/__main__.py @@ -0,0 +1,24 @@ +import os +import sys + +# Remove '' and current working directory from the first entry +# of sys.path, if present to avoid using current directory +# in pip commands check, freeze, install, list and show, +# when invoked as python -m pip +if sys.path[0] in ("", os.getcwd()): + sys.path.pop(0) + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == "": + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +if __name__ == "__main__": + from pip._internal.cli.main import main as _main + + sys.exit(_main()) diff --git a/myenv/lib/python3.12/site-packages/pip/__pip-runner__.py b/myenv/lib/python3.12/site-packages/pip/__pip-runner__.py new file mode 100644 index 0000000..49a148a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/__pip-runner__.py @@ -0,0 +1,50 @@ +"""Execute exactly this copy of pip, within a different environment. + +This file is named as it is, to ensure that this module can't be imported via +an import statement. +""" + +# /!\ This version compatibility check section must be Python 2 compatible. /!\ + +import sys + +# Copied from setup.py +PYTHON_REQUIRES = (3, 7) + + +def version_str(version): # type: ignore + return ".".join(str(v) for v in version) + + +if sys.version_info[:2] < PYTHON_REQUIRES: + raise SystemExit( + "This version of pip does not support python {} (requires >={}).".format( + version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES) + ) + ) + +# From here on, we can use Python 3 features, but the syntax must remain +# Python 2 compatible. + +import runpy # noqa: E402 +from importlib.machinery import PathFinder # noqa: E402 +from os.path import dirname # noqa: E402 + +PIP_SOURCES_ROOT = dirname(dirname(__file__)) + + +class PipImportRedirectingFinder: + @classmethod + def find_spec(self, fullname, path=None, target=None): # type: ignore + if fullname != "pip": + return None + + spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target) + assert spec, (PIP_SOURCES_ROOT, fullname) + return spec + + +sys.meta_path.insert(0, PipImportRedirectingFinder()) + +assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module" +runpy.run_module("pip", run_name="__main__", alter_sys=True) diff --git a/myenv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce6a6ffa730402db4204dbad189388e9e40a86b0 GIT binary patch literal 703 zcmX|9zi-qq6tU*joMr5Pu2_tXTjtu@xOGop?T4p8THQv%Y-qvtK^V%ybdh{P@{0!wCIw#fi0! zlgVvJ_7Ou2=cvGaTzGvCBj)ve)@A|sIOf3|V4SlSZ*2xFeAViQwI6kUI+Dn1f``J` zrt?TyQOY#m2^JRP`Sm79_0Tk-=C;z(Dfn+bWX>m-AV7D_JlFjt#>hjvco%& z-7W!J18B;a_$QVyZc~w)>%?$QM%F5GkJ6#AqiPUmWkFS~QVN_@7*laW?<_9eji*G~ z1N9MZI?1+9mEszn;xZuPv_gpi|@7Shs;J~dn$ zy2dS+WK|0$=qfj3TPmt_`JCGoX~ZDsw5Yk5KwQxioWeukIMw29<(29@h5$X-Ws&9BU8^J;Il!k>A&ytdN!I*q>aEwKAMaD7W79Ugh@p)RAws5915{Ob7P@oxuNX( zZisEwTMOe&>NTEep=?`rm{Am4ZM4-URg^HHF~?L5D!QyPU6kU?bgAQsia6nwNt@Yu zg_$1ZTs_~=SzhQk;y;A3Q}qzj=gj*A$HLW#N(|E@4YI@=x#S`BsCl*OFpZHab=#h0 z6Wg&`)T@{-ThS>od}^)}ovjet_tq@)cK%j@xXhzBhE83=Es*G;dD}lp-ZL!isZQ@Z zlUz~!1ou5(`Z7Z35K@Pb?q>lfHcOq-R;6<{CV}yHy((_-K95AzT->%1mJ0Bf?N9ooiw|e literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27a90fba7add6424df31172de6e55f9f0e74a619 GIT binary patch literal 2222 zcmaJ>O>7fK6n?Y2{*PmW6B0s!MNk@7j!l3HRE5wM0tBQaB%x9*Rjb82PS&w^&F(tH zA(7H3QmIs_IaCe3iK;y`w}20AbLtzfmqeoNNc(2qzIorg zdGo#Zb2uCX9A~CJocP8A@EcRy5oj*z76DiR1=64ph0BvPQTQ~c2uqOWDarX=hrL7PW=l`SP3bu-$mAV$3~#c#iO&|4$RO@$)X~ikuz4lELxMQ zDQ5IyS=6&)Q7tCK`zrp^L|IhSY?c~SvqY**tA?%>aGeYW$C*o3%~KI)O)gMHluc2! zP)&%Ij=Rm0K@nND9QcB+lyG-O*50zjyXaOZ>V}1G)2bYlwWcnbmTXbyjBOV5P@LOl z(Qo@uWSTF>3?SggEcLS}kVz!B--`d(P`D+SgR9`?%6*|Ri1S0cB>5WRIdp0u-U5QC zbMSElV4g6xI%AHw7+;YULg4cQ0+iu<{yvG5p*XR5(=y_m%_Yy+WZGn;62;w#R6(;+ znbaMV8fNMmwWuauHB?1SU8Uxfr5960L(fs`ea%$w=4q->#%!nZ>fKbaY)$Igxn%Fz zl&M;@rzmHp`{!&Y(wz}{Ivk+h7ZGmt`bI2K3neN-qK+omW?7lN+@Mesph-MY(J9hN zw?wm4Wc(1F`->0e#cqS%E2#$B`!7A1k0&vt;D~HZUQ;!N8Z1CXH5d~!>hOkj* zrMChUu+Ko6qrAc+H;BuNv`{8-!R{JSi-Qefj#5OU8B5hBoCAh3EGO>3w&sv;5*J7l zY!*`&uq}}?>`^7xY$>i2o9Br23TJ}M@os6(3v+@Qz6pEQIg;hv@D|COfRyEiY#v`c z&Kn02$_`}l>XKQc89O>MI3kS=-x<9!FeZ%-50A$^wqVkH*7j#h`8-RDEfg_Zw%3x4 z32LDg{Y-Wbk&VWC8l9-lp8D@3BwwBQChjyZp;&wrR_DQc z;00Sb4s07cvLLIPB+d3-ku^p;tR?Zas$!i@MpkM)Y`5sdW-ykIW2O7irxCdwkn;R@qmYla& zHEckZah&Z9vbdXfImvdjw`e4C*Wc&-?>EllKUVK%1;q|e2zkK?M5srBgm%0TJG>Bi z=_RCR#}9&UlaE#T*zyOmjr!5_i_|4AlYG?Q3gO5*C zIuo^)o+l4}yj)A&s`FeRSm%Y1cLxNIw|)>v_!+$Y437L7>-ze_>c!fTL@m}+f#{!J zKWTdbD0U735k3un65fQiDzq)%u6CZSb)MgVcb@wq%kQrHj#gl_a(uLg(sy(Vq6?l) Th*lxG+`iiNgY^saHE#S5Q}QZ` literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/__init__.py new file mode 100644 index 0000000..96c6b88 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/__init__.py @@ -0,0 +1,18 @@ +from typing import List, Optional + +from pip._internal.utils import _log + +# init_logging() must be called before any call to logging.getLogger() +# which happens at import of most modules. +_log.init_logging() + + +def main(args: (Optional[List[str]]) = None) -> int: + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c456797ae454a94ccf8df5b1c8450f03a9871a3b GIT binary patch literal 805 zcmZuvy=xRf6rb7MyKKI|m^87_5p521Cw@STNI(dwBo=-Y*PMI1FME^QogHT8A}bM6 z*x95rHujRn|HH{sB<5akJ8=a zi^vcuMP!KdC3VPl=ngp;dp{x_|HZq<17R2*rNMyShLmlVnw5FVl2V#72WAp2lr_u_ zV#|uSV#bO*XMJEAHbH|-gv_QGlCaTKqpV|!I8DVVYLDsz|fOxVGw zA0=hMRi$FCgyO=O5g5LFd*x2lB+|GCf?bEb=Q>sjG|uD_dPY4VEodA`G(t2c0%>)n zN_;hX(#3eXjiS+wOTyU6kQdVOgg?PX4POTflC5cx3cdzrXiLSFF1Ntmmqzq+;6(*; zo9CjB0PUcZx1t+2xe*qwt2i0P86tI{|3TqBRE6#JB30Ev5eunju(JCKW)9gd`7=XW zE8nK)_tsvoehLhMZEE)o>zSqseuE4nYTsC0``CC> z>^;%5F2yvmlki?qrlTBI^#Yo1?PeL-kxwc8N-qB(SC2wM&+i6b$lM{B`%LD4wL^Mg YFWg_)Pu?ybp1X2H(Ei~6cA`oA7q2hXdjJ3c literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf05c21aee64534c9feb382db0e2e399af9c7275 GIT binary patch literal 14312 zcmbVzX>c1?a_|f=xCaMGkl-b1#7l%sfVwT~v~1CmR|=(Av@6E0jfF5n3KTBC8A>7+ zRB02ZLgmvJiMyL6^{u~%s%*tn?3B4ls-pZzHkHbq`~XZkgvWBNk~pd4A1umo*1yvI z1~ULjXj9o?;k|xG_q+Oa_v`og_ine7fp6!f*T&5Q4D&CT&_7xNiM8Kn8D@?VnFu4Y zqAAHnSQ?umCK{U~W*T!5j>eXVg~ry16=HMJma<3eEaGxWN6Hy-QrMDorT7S+a!1@L zPsEe*M!YFs#FuJ_G^83Mjj5(c6Rl@W`cuu3W(wPqEvY~xKw*2bHPserqp%~{p6ZBn zQrMZ?lIn_dQP`E-ni3*HYFlJmsyot6^Y~;>syEV`>WlQzv^&|K+8)_XVNY@(6^sN^ zJ0d$+M&b$f-;_DzE4D!S9)N+Kh9?FfXD`KQ1&lTWV;{|H zhrAAH-+Sf?o&8g$U}x^o3zLbYC=91BCrBoplG2JWDNCX-mLWny&Lm?>B9j)xNs>s9 z3$mDy72yJ6K+^diNNFULLx<^SYE?tPlFO5!RrJx-$UOzV+eeu-r zi>F^6IjP!TRwNR;kd##J3=mZ9XS3K!EUB8$ONwe4oy=kxBCD2H(@+FNEmtl=6WG`* z(p!@WB4J-4X?sl~vR1_&jgBRfQZx$Ld?qWUqjENpPD>4>@D(dFDPla-RvBNC(s+oe;=~Ckr(mTHJ{0ZvFbJEdA-%EZYm>4wI)VlR**uQR3QmicYpd2QzS%v&@23tZpA zwgo>#Yf#9<`{_q`N5#>s22fWQqnS&P97ClF#vBXuC%f^(8 zWD8)7teZL{MyKv~D6u@7XQBXUpNOf-W@H$}V&t3h?E7YY%S@Z{rU|QFR*eBy?<%9X z^n9qx>u@!OTu(KnLwXB9$*$*3F+pzRC6xjGux9Dlf)3ITrK&{+&d3r!!ZtZh5?Mu7 zZ5I;hC@>YBZPk{o@UczjZab_Zmdn8QoGc~BG+I`T$7P%vK@i9`Bnn$5kxnSlXwFxe z*07$_3+3_=2w)xktux$BN2$3TBIm<~j`_zZsdJII=26l3)#YByY^ zx?-%aF0vo~GYaqGExMsMXjqj>e)37-yC<2)$G z98j&+51MihPD+Xp6Hw?0N=C@WWEta_aE|U_LAol%Cl!>mgP2by(}HqQ65^ADfbdLC zg&-%5f*rPY*y#kW5JoR1WDxwC5~$$Buw1Chxj{`kq-6!gcirTO@|PSFH(| z?t=X=NvbI$tM)Njl;Rl?m4sE!OcIdExYiX`_n`pC0pomN>*P2T4#H194Z(Hh3D0<% zZ++v&H{Kasc5h#G4;9@*%kEvP?gK^lf$J|lay8sKa^uL&V^6G%uj%&w|MRVaz5O$n z`_`cwhi+dk2z!cwJBcLYzo31x%X@Q#HAVckc{poqL5UVOdCLNGg_0rK_v&eVOkAB2=f9N_~;12&3A{iCppY|W$&cy*R zK3!l{__wN`!LD!CbTh;j(9ssrDp@6)WJe1Cf1(Z2G$q;ra?m`~>2}cp^_`+qa!I_F zE4d{P{CJ7itYFNA99mkji#gE+SYDAA-J-|9^h!L~)jYKooMHpi@JS6|8}l3LHA#&| zJs#|8PTwPuCa^79R3Ej5hpT2^?)Zz8Yh)po7KKzS4YnJ?726niq(-)(j7?}#Q4@ZG zC}rh}g<@zO7!z(<+~RBBhw#_9`U0We))(3LO}d!)b*{SkXSgvqM!jtpxf6zX&^K$X z%`y&xAc{*&KbkVEoT~m&8uS{V$?9mh3FPe!pFWX#t9pEbdE*R<8=zzeoGR)B>hcX= zo}FmfkOfJd9*f$wjrfAXE3T7Qe0sa05>f7~t)fh(HTTSVZJ`Q=Sf+jcpCI)n<8vkr;mQkM3>;4Zt zt26HUv_-2vZqX*%-*@Oo&V9_ZId7f_>FrfxWk`o7cIr?y7M=Q7C-zixbtrGD&k^st z^j_%LaDbp3Gc8%@x%o zfEcgc&A3CbUu!cE{3d%EsNjL^jpr!evsHVus_g6S?Rs|R4O6|EpolAGgFdn`)A!jq zmSt`p;$Q^7XTHJ`M^t)TK#3#>*Qx&b%5ivH zN=sL>__mPutSbN~!LyOahK5Y%<-E{w;CCT;DPNM$nwl)5}f z?Gp&6Dz-^&tsdbeI6f(Zf=Du8_)>c&L=`odx?p*L*hf>fViDA0W=LW@0moz1+)=C} z96|grf?q%Q#-{#UN@uR5X+;@pO3FZRQyp~0P*Pyfd`s($W;JXh(+4-z#@=98!!c3B z7!HC1h&?FOv~{Eg-rQiN4aCxWRkxXpHmj=`7@u*wEDO<1tbEN!N_ z2@PiN>vcOxXRfySO{jIzz^bf2Jg^THG%afaloC=MuIm9SMAlq%;VkeRJrKevNvJrcBvG?naV7Mxc1pgbdkmh+QE;-9 zVBg@_byn0zw5jvhLOl-Lyo%tsItg2vp!5&6lU9ULkE@OsUVZt@iRkdiYXqf|>WFH7 z5lIHH;{HHT@3(3v637T}T&i3WU5eJrvE(Gww#KsH2NVe&^Hi&J72IGVZH}7JRnwfD z)tbS6qcFs}Ku1zUrm1bVeYr5H|9hbol#Fpp>R!be*8ZDG|2Ki9$Jo&ZdGPek+2fz27%>^o*1 zM$4|oRl$v*bM)Nt(Nn7L-0P#K&W?j?I!ET^pMwb%5h$xz0Ad?iS z5uiFX?>kk!$W;@po4RCKR-UWwcd)~QdCSkHk>}8dbMpw=>zb`@A#XvBY5@(Ck~Phg z!3=XYlMPxm#c~xg$P@-SEV5mW!Ced(@eX7lP37Tvo^nlvZNTvksti5+_0)}4^jm;a zae|h4re`~zwnI79ea1G1rZfA_u%ENrudOq~kfb(}n4%N6i&3X1VOS-F$ zQS^uF@)aDWh6JuJH+3nHc5HT!PIGyX_-{Oh)wk5#=~#4}X=~nE&*SjzuKM})T&L)m zN*L}_nZ0=+&rKL!7MT6Y2NVrIfu2|OeN5Z(Hn|bxem$>=(O=-caV4N*=WP>cR&Dqc z!!KgYVQ2lef53=beHuSt{=a$Jp6+-mp5QfP|@7s*Nvo{}s z-m5n&_Pk}x&?Yc5PdFxT&YSQ8HE7TMhUW7XcH_xQuAZer0vO+8Nx044c)M{>_X!VF z9DNel=vQJOm&G7ngTVa@US7*iZ3_xQNJu4Q`Ke?O#i&cZ4x?5rU|fMpKf(vH5gi--C5BM;^ zpN#kSBmw?)xG*QEe^fIZFjQv(dI+~U={Sg5w4<@ui^UE(E5#FI2_yw`qQsycTuxFe z_uE*(RvDh^s+ls?3@QW8F7^D; zjvwt<-922~J^W`^3g=$=v((D&(UQNj6lmAH?~5;faO(c4<-oq%+{b~AlD}i_^z7*c z+lqexYCUY)0#gu?so?K}R_3N>r&j}^Vj#3AevrJM{2Q(i2z?azg_3{k+}YW)g}(g{Y=z$E zKk^?hZ^e<6yBS}{{Kf20v=q(P`N0a z4F~pbK;mgCH*dzX94gd$Ml&&ejrnDGC6u>RujBJ3nVmufZisUrQ2DCPZe3Bp#l9(T z$#dWmuhd5)FK7nG9ZS0m?yuJYo9uu_(~u3f*6mFF;+#{fr7k8<)x zo$9YgD%ZD(L+e%h2cRnBkq`_tAJf<}*EQQ!5Ox+DcEN3WQ`_9(?;I}Jw-&rxOM#9V z>rMV+Z%2u5EZO;0dw0>^{gCfm=DRS5Z^f{ox$I&bJzp?jKxr#WuTAxPPTK!KpLr=wQuEDI&i}rOj>e(DMt0cB4#(j>y4-)J&ub_vB zeqtccfhA?&z#WOZdLxs!h^<My!8SNvgts;qXjiFFt9Q?IXsFEXz zIY%gz&V=CAAIaH6Ax-$_+Gyq#IA4UccSj-pB}UE^x(v>FM>>O^xEQ>0b7j(SHKHY; zG^Dc8uh`I6>|oA%Fr7(D2O%>-a6|nE?&DlTC`4@>=z}O-4Na0{&Pki2=^P&lp>hhr z(~?Va&JzkL1ibx{7`m8|m7IlkG3V8KDv?m76aMJAm(NAdj~*X6as15L5qNGm{K{y~ z^>X!FXkC#^ zl6;ev5(!>&#WjBcK4u{>elXK;zM?Q+&;gtx@PEP-!7D>;f}%Je>=KuVEke}<{q%iC1=zl^&{|=l3R-GSAG;~-}?blr5 zg%Teq@hzYU(KAuvx0f3n9pDOuihSd$tEcGdS$6fkANXL){VgB5_Uj%DZiU}c>N@zC zu{k_5BM)1)%#W>h?J0KcS$cE1<;2X%O1($^*7>8W9lMGhyOw&Em z^SQ-sccu%ip%p${+8SKkw%9#??J>i;pJ#8oNq_pgDHVoX}}^E&2w4_#X;nT6Ki3cmyFkXx=BuG=S8>}@)H zX2rg()Hd{o&3_Omv_3cEe&}wSKfTB;TrRYSm)%2UFikv5&pzZkU~r|a&pqgU&{Ej) ze5rM7sq2|9957#Bg7*jfwGe!c!B;X5EB@Ecrjz~VzwWo39J1XvX^$v^eu5XRWG@E$ zAb`i9Q85#bMzv>yS1=!)s>Fqb?ib*!G<-EK(dWekWhc3g0op5MKL%(G5j=sA-^Abt z5WveE*qMoVN`iN=qIQ9b>`DX-dNA0A!PoTQ900N#`15V%WA5}Cx7XrXOR`NCXL*Oy zvhz`6JDfS(#g1^Xaj0y899S2~3l$p%$~H{enTEFcEk)nabBFT5mbsJtX<_&Hw^HHc1l`Qs8@ z`058<5xLQ5f>%Or(F;F(bL13#P{RXneHvB&Nak#IqXf$BJPwy!A-MI$t6xx1aHyw} zn7)k1JF|@#b)NU&_^64E95<&s_$dF}XX)8l25zamOQf8e+fuJH#yvays{*rzXB>En zYv<|AuDij2lBYFD{sPKso5MYl>v~Fa6({mGXpj6QRMZx6z1Pt=O+Y#Qo-$N8eNi{T zdTbfz1Qmg{iLOKHse{*?lfBRx84sLrVB#5v_M-Ub9lmOdg9jx&nay?9oq|d!{4YoC z1W>Km4qe!AIy9yNs>45jR2HEHfO?M2U#>jLVAZCPjPh~{{6xrAk~mCAhUm8fw5>U8 z%Q%D@mxq-}Ln)OD*6n}26Xy_4AgX)NpFYOhz3egE0OU^~JLugYRmq=X^Sd!vFHy;l zF%MUeT*u&VF{lbt?AJyq`RAC2K?nBYCIBcU53X^n#l2>Qplr2T+#7@>Bt)`Huj-lEHRTDuCr#68-8jfCu zE9ndggR!T8qm9~SYIkjk_VN=5hilz5nxAh={fg^+cxI?WeAwziY!$8Gue3yGUR?OI<0+>S{(TzyAQEl;(x zUM2leQq7wHZBF$6KM7N-6W-O(_r>skKluMNnm5Yu zVL;V5tLhrF+ z*Yj&w=S#blJqD%|d#v2(X7|natT7Okg$DM>LeE0{-oP3I;FklZ%q&<~7(RK;+R647 NI-dE0ftU{ZzX4PBwEX}8 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1c3e9012e7b0d17145d2657ea0d90e5d2194c34 GIT binary patch literal 12683 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48260ef7ac94f8013e8a4676da84d8ea08bb183a GIT binary patch literal 17684 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5064ce4fbb31009fe28535c2d20826a812ac651 GIT binary patch literal 33302 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 R4vJze4#N3Fpa=uh{}1hChwuOZ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5a69f4f2db3a1e06a303c4b275de3c3658f1bfb GIT binary patch literal 688 zcmX|9ziSjh6rS1LJI_mkh*d0f6q^IxA&H<72?$3jiAAEtHDPb(-QAeo*_-^Ye!+2zpVI+}G%v&I9Xp zWwK(cNisLartQE_oyjThsl|kX&n{7*oLogA=X1_k#18lY`*gBx46r3(cQn3?xDvk7a4R%;iHW6y+v(Frx3Y z(y|Y@=PN6%s~&^DXHX9dkYx>KUlw{u0{x^iYw60WMD5{*&GNl$OiF|3Qz^2{v`KB< zBmuYu%9@blc?vJspGDSM|GseHP5<@Amt=WHlT_JOuidnLZK;JW+?op~ni#!nVk%}% z@{zg4uoT|eap!JXsc8WlF3^Un#A_6eV$S(DcI8*Q!!N#idYBw;zdQT&+|?sS;}7}o I@SC&z1r89p3jhEB literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d14ced534c9a3711cd46529eedf233ff01fdef0 GIT binary patch literal 4989 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ee99df289b6f9dded8c7e51bfa6ce02b705e814 GIT binary patch literal 10570 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 NV7!X^Zpcx}`# Union[Tuple[str], Tuple[str, str]]: + return (a, b) if a != b else (a,) + + +class _Prefix: + def __init__(self, path: str) -> None: + self.path = path + self.setup = False + scheme = get_scheme("", prefix=path) + self.bin_dir = scheme.scripts + self.lib_dirs = _dedup(scheme.purelib, scheme.platlib) + + +def get_runnable_pip() -> str: + """Get a file to pass to a Python executable, to run the currently-running pip. + + This is used to run a pip subprocess, for installing requirements into the build + environment. + """ + source = pathlib.Path(pip_location).resolve().parent + + if not source.is_dir(): + # This would happen if someone is using pip from inside a zip file. In that + # case, we can use that directly. + return str(source) + + return os.fsdecode(source / "__pip-runner__.py") + + +def _get_system_sitepackages() -> Set[str]: + """Get system site packages + + Usually from site.getsitepackages, + but fallback on `get_purelib()/get_platlib()` if unavailable + (e.g. in a virtualenv created by virtualenv<20) + + Returns normalized set of strings. + """ + if hasattr(site, "getsitepackages"): + system_sites = site.getsitepackages() + else: + # virtualenv < 20 overwrites site.py without getsitepackages + # fallback on get_purelib/get_platlib. + # this is known to miss things, but shouldn't in the cases + # where getsitepackages() has been removed (inside a virtualenv) + system_sites = [get_purelib(), get_platlib()] + return {os.path.normcase(path) for path in system_sites} + + +class BuildEnvironment: + """Creates and manages an isolated environment to install build deps""" + + def __init__(self) -> None: + temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True) + + self._prefixes = OrderedDict( + (name, _Prefix(os.path.join(temp_dir.path, name))) + for name in ("normal", "overlay") + ) + + self._bin_dirs: List[str] = [] + self._lib_dirs: List[str] = [] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = _get_system_sitepackages() + + self._site_dir = os.path.join(temp_dir.path, "site") + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open( + os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8" + ) as fp: + fp.write( + textwrap.dedent( + """ + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + """ + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs) + ) + + def __enter__(self) -> None: + self._save_env = { + name: os.environ.get(name, None) + for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH") + } + + path = self._bin_dirs[:] + old_path = self._save_env["PATH"] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update( + { + "PATH": os.pathsep.join(path), + "PYTHONNOUSERSITE": "1", + "PYTHONPATH": os.pathsep.join(pythonpath), + } + ) + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def check_requirements( + self, reqs: Iterable[str] + ) -> Tuple[Set[Tuple[str, str]], Set[str]]: + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + env = ( + get_environment(self._lib_dirs) + if hasattr(self, "_lib_dirs") + else get_default_environment() + ) + for req_str in reqs: + req = Requirement(req_str) + # We're explicitly evaluating with an empty extra value, since build + # environments are not provided any mechanism to select specific extras. + if req.marker is not None and not req.marker.evaluate({"extra": ""}): + continue + dist = env.get_distribution(req.name) + if not dist: + missing.add(req_str) + continue + if isinstance(dist.version, Version): + installed_req_str = f"{req.name}=={dist.version}" + else: + installed_req_str = f"{req.name}==={dist.version}" + if not req.specifier.contains(dist.version, prereleases=True): + conflicting.add((installed_req_str, req_str)) + # FIXME: Consider direct URL? + return conflicting, missing + + def install_requirements( + self, + finder: "PackageFinder", + requirements: Iterable[str], + prefix_as_string: str, + *, + kind: str, + ) -> None: + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + self._install_requirements( + get_runnable_pip(), + finder, + requirements, + prefix, + kind=kind, + ) + + @staticmethod + def _install_requirements( + pip_runnable: str, + finder: "PackageFinder", + requirements: Iterable[str], + prefix: _Prefix, + *, + kind: str, + ) -> None: + args: List[str] = [ + sys.executable, + pip_runnable, + "install", + "--ignore-installed", + "--no-user", + "--prefix", + prefix.path, + "--no-warn-script-location", + ] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append("-v") + for format_control in ("no_binary", "only_binary"): + formats = getattr(finder.format_control, format_control) + args.extend( + ( + "--" + format_control.replace("_", "-"), + ",".join(sorted(formats or {":none:"})), + ) + ) + + index_urls = finder.index_urls + if index_urls: + args.extend(["-i", index_urls[0]]) + for extra_index in index_urls[1:]: + args.extend(["--extra-index-url", extra_index]) + else: + args.append("--no-index") + for link in finder.find_links: + args.extend(["--find-links", link]) + + for host in finder.trusted_hosts: + args.extend(["--trusted-host", host]) + if finder.allow_all_prereleases: + args.append("--pre") + if finder.prefer_binary: + args.append("--prefer-binary") + args.append("--") + args.extend(requirements) + extra_environ = {"_PIP_STANDALONE_CERT": where()} + with open_spinner(f"Installing {kind}") as spinner: + call_subprocess( + args, + command_desc=f"pip subprocess to install {kind}", + spinner=spinner, + extra_environ=extra_environ, + ) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment""" + + def __init__(self) -> None: + pass + + def __enter__(self) -> None: + pass + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + pass + + def cleanup(self) -> None: + pass + + def install_requirements( + self, + finder: "PackageFinder", + requirements: Iterable[str], + prefix_as_string: str, + *, + kind: str, + ) -> None: + raise NotImplementedError() diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cache.py b/myenv/lib/python3.12/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..f45ac23 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cache.py @@ -0,0 +1,290 @@ +"""Cache Management +""" + +import hashlib +import json +import logging +import os +from pathlib import Path +from typing import Any, Dict, List, Optional + +from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import InvalidWheelFilename +from pip._internal.models.direct_url import DirectUrl +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.urls import path_to_url + +logger = logging.getLogger(__name__) + +ORIGIN_JSON_NAME = "origin.json" + + +def _hash_dict(d: Dict[str, str]) -> str: + """Return a stable sha224 of a dictionary.""" + s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) + return hashlib.sha224(s.encode("ascii")).hexdigest() + + +class Cache: + """An abstract class - provides cache directories for data from links + + :param cache_dir: The root of the cache. + """ + + def __init__(self, cache_dir: str) -> None: + super().__init__() + assert not cache_dir or os.path.isabs(cache_dir) + self.cache_dir = cache_dir or None + + def _get_cache_path_parts(self, link: Link) -> List[str]: + """Get parts of part that must be os.path.joined with cache_dir""" + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = {"url": link.url_without_fragment} + if link.hash_name is not None and link.hash is not None: + key_parts[link.hash_name] = link.hash + if link.subdirectory_fragment: + key_parts["subdirectory"] = link.subdirectory_fragment + + # Include interpreter name, major and minor version in cache key + # to cope with ill-behaved sdists that build a different wheel + # depending on the python version their setup.py is being run on, + # and don't encode the difference in compatibility tags. + # https://github.com/pypa/pip/issues/7296 + key_parts["interpreter_name"] = interpreter_name() + key_parts["interpreter_version"] = interpreter_version() + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = _hash_dict(key_parts) + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]: + can_not_cache = not self.cache_dir or not canonical_package_name or not link + if can_not_cache: + return [] + + path = self.get_path_for_link(link) + if os.path.isdir(path): + return [(candidate, path) for candidate in os.listdir(path)] + return [] + + def get_path_for_link(self, link: Link) -> str: + """Return a directory to store cached items in for link.""" + raise NotImplementedError() + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs.""" + + def __init__(self, cache_dir: str) -> None: + super().__init__(cache_dir) + + def get_path_for_link(self, link: Link) -> str: + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + assert self.cache_dir + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + candidates = [] + + if not package_name: + return link + + canonical_package_name = canonicalize_name(package_name) + for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if canonicalize_name(wheel.name) != canonical_package_name: + logger.debug( + "Ignoring cached wheel %s for %s as it " + "does not match the expected distribution name %s.", + wheel_name, + link, + package_name, + ) + continue + if not wheel.supported(supported_tags): + # Built for a different python/arch/etc + continue + candidates.append( + ( + wheel.support_index_min(supported_tags), + wheel_name, + wheel_dir, + ) + ) + + if not candidates: + return link + + _, wheel_name, wheel_dir = min(candidates) + return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory""" + + def __init__(self) -> None: + self._temp_dir = TempDirectory( + kind=tempdir_kinds.EPHEM_WHEEL_CACHE, + globally_managed=True, + ) + + super().__init__(self._temp_dir.path) + + +class CacheEntry: + def __init__( + self, + link: Link, + persistent: bool, + ): + self.link = link + self.persistent = persistent + self.origin: Optional[DirectUrl] = None + origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME + if origin_direct_url_path.exists(): + try: + self.origin = DirectUrl.from_json( + origin_direct_url_path.read_text(encoding="utf-8") + ) + except Exception as e: + logger.warning( + "Ignoring invalid cache entry origin file %s for %s (%s)", + origin_direct_url_path, + link.filename, + e, + ) + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir: str) -> None: + super().__init__(cache_dir) + self._wheel_cache = SimpleWheelCache(cache_dir) + self._ephem_cache = EphemWheelCache() + + def get_path_for_link(self, link: Link) -> str: + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link: Link) -> str: + return self._ephem_cache.get_path_for_link(link) + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + cache_entry = self.get_cache_entry(link, package_name, supported_tags) + if cache_entry is None: + return link + return cache_entry.link + + def get_cache_entry( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Optional[CacheEntry]: + """Returns a CacheEntry with a link to a cached item if it exists or + None. The cache entry indicates if the item was found in the persistent + or ephemeral cache. + """ + retval = self._wheel_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return CacheEntry(retval, persistent=True) + + retval = self._ephem_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return CacheEntry(retval, persistent=False) + + return None + + @staticmethod + def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None: + origin_path = Path(cache_dir) / ORIGIN_JSON_NAME + if origin_path.exists(): + try: + origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8")) + except Exception as e: + logger.warning( + "Could not read origin file %s in cache entry (%s). " + "Will attempt to overwrite it.", + origin_path, + e, + ) + else: + # TODO: use DirectUrl.equivalent when + # https://github.com/pypa/pip/pull/10564 is merged. + if origin.url != download_info.url: + logger.warning( + "Origin URL %s in cache entry %s does not match download URL " + "%s. This is likely a pip bug or a cache corruption issue. " + "Will overwrite it with the new value.", + origin.url, + cache_dir, + download_info.url, + ) + origin_path.write_text(download_info.to_json(), encoding="utf-8") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py @@ -0,0 +1,4 @@ +"""Subpackage containing all of pip's command line interface related code +""" + +# This file intentionally does not import submodules diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52db34e225dd3ee655d83307fb94e0ca64162643 GIT binary patch literal 296 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0189d3aebc79db0e3ac63feeb668cf6f728a80d9 GIT binary patch literal 10473 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0448209cdfb9cde60339d79c34c3a12cb1c00e5c GIT binary patch literal 30392 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b416f86cb5fffc596a0da2308750396199e29759 GIT binary patch literal 1799 zcmZ`(O>Ep$5Pr{p>rHp-q?@!QqG;2kRUC;p1w{gcP__-J0I@>pQdD!W-1SRvVtbco z=VzlFqAC(w3678=&Pav8g%jceJ#*PDsS=q=E#d;Vr4dS1I55v%Z<8ok^1PXO^XAQb zGxL7VX1fr4WAj&MB_5&QnUH)!o7sH_mcgI(9jo!%XHJ-W7Dg6?M^-bO|F4 z5y|2$;Tv(2i%;t*4qZl;w2rJ)M<>^0HT@?uP`NPu`m!Bd3C!|*c)VQk0DWR#XQk?B23y>EM(2rOVIo@mGhj2rS;D%o+4iAJmPk@WW;w_D*@0n%-M|>G38W1zWkH1513D;z;1g#i zOdCeoF@4`Ke0Fnw?a89%dVyBf-t`IfwJ8!1FF#3b%ho1|KOa=8T9sDjNKo*6`?^Ck zw?@20&9Sd*)mrdD#d~q|!V8*j2juxG6c~!?YgN0dK~w>up6O_1$JWX*eo2U<)f!dc z`juyo0CqGW`ezY8`<<%`AQ zfnrFY9fW`PHjuXvhR#?;bHE?|DEB71funMCw$jYDQ=E<(je{Qxea3I#Xg+{XdLCpB zO4c#0!Q~f_kC$MQuE8mcKJHoOuc0M8c*t@I#rkjgB@Ahlrc{o0gCE)hM8)(3EIw=$US?n~#YDFE&r{{U{wVmqak6j%f1W8w=u7bx{%aYS z?_^N@AQt%4k0}uENa=#Y-%)tbhTZLEHK4f`ZHv(IeylrVR07ZcS2aJX+R;^-gF!p| zt>Vr0sKQL+qRKzTILs2(tx08b~}QG4Qk>6e|Nq;eFtIbWR1^HMFDTww0l~ z%1}cdYA8bwnK;l?2DTNgsc4O{iC>gLLoU!hu!d_huoTr}Y`i_wB{1GyhT&GM1&8q& z!}xH)bmE<8fGB$)C~I_jiV>DJWpfjS3XecM?PcOPh5?^79{*J(@)T literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8383ae5167e7b0dc29d3018eddd123ab90018adb GIT binary patch literal 2316 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

      Tm4NC7iQ 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57ecb08c939c91e24982dd68d836c479e615d382 GIT binary patch literal 2638 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 J$iwF7{{c1kRP6u& literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92fbbd7e72e18bc453a72e51da87cc040e774346 GIT binary patch literal 7858 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 W_~OW+;?Uu*@qx{L$U}<-GXDp@!qx!* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d23384daa5d9be00a6de4a2e58d9b478913093ae GIT binary patch literal 393 zcmXw#ziPrz6vl6iQELfRYEh^|r-DPh{j-*WHIateq$DPVEFpR?_STq$+-o75Z_#Jy zvvjdr$lA%R;O5i>?HPXO``|mA!}$`$D#+?`W=&bve{%C*++J+jnfL$**Z^@hhYEH9 z@ivc&b`c4-5SKdTbsk;k1M5N#K1VS}GlSYGrDenH_hrLK1zFcMJrzy$QPo~lXJ;Fh zqL0kpP*yER)ke-hGgT>VJ?pZiXr|%Zo61mfBt_rnYpUiv^+x>%+1O=2!6w@TwiM2N z1}D&@IHGWX8TQYlh#&$bOlK?zVHgE(nDu;0#vX?A82j(gBV!oG>^1Ojx>whb5{55A zcQSLQn8J{R&>=p7TT8}c{M^9;W{$8kyZ ia9K_&2TLKT)t6$@Y^^{eIc={%D>**-2DRuYi~a!t>Td1; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py new file mode 100644 index 0000000..e5950b9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py @@ -0,0 +1,172 @@ +"""Logic that powers autocompletion installed by ``pip completion``. +""" + +import optparse +import os +import sys +from itertools import chain +from typing import Any, Iterable, List, Optional + +from pip._internal.cli.main_parser import create_main_parser +from pip._internal.commands import commands_dict, create_command +from pip._internal.metadata import get_default_environment + + +def autocomplete() -> None: + """Entry Point for completion of main and subcommand options.""" + # Don't complete if user hasn't sourced bash_completion file. + if "PIP_AUTO_COMPLETE" not in os.environ: + return + cwords = os.environ["COMP_WORDS"].split()[1:] + cword = int(os.environ["COMP_CWORD"]) + try: + current = cwords[cword - 1] + except IndexError: + current = "" + + parser = create_main_parser() + subcommands = list(commands_dict) + options = [] + + # subcommand + subcommand_name: Optional[str] = None + for word in cwords: + if word in subcommands: + subcommand_name = word + break + # subcommand options + if subcommand_name is not None: + # special case: 'help' subcommand has no options + if subcommand_name == "help": + sys.exit(1) + # special case: list locally installed dists for show and uninstall + should_list_installed = not current.startswith("-") and subcommand_name in [ + "show", + "uninstall", + ] + if should_list_installed: + env = get_default_environment() + lc = current.lower() + installed = [ + dist.canonical_name + for dist in env.iter_installed_distributions(local_only=True) + if dist.canonical_name.startswith(lc) + and dist.canonical_name not in cwords[1:] + ] + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + should_list_installables = ( + not current.startswith("-") and subcommand_name == "install" + ) + if should_list_installables: + for path in auto_complete_paths(current, "path"): + print(path) + sys.exit(1) + + subcommand = create_command(subcommand_name) + + for opt in subcommand.parser.option_list_all: + if opt.help != optparse.SUPPRESS_HELP: + options += [ + (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts + ] + + # filter out previously specified options from available options + prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + # get completion type given cwords and available subcommand options + completion_type = get_path_completion_type( + cwords, + cword, + subcommand.parser.option_list_all, + ) + # get completion files and directories if ``completion_type`` is + # ````, ``

      `` or ```` + if completion_type: + paths = auto_complete_paths(current, completion_type) + options = [(path, 0) for path in paths] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += "=" + print(opt_label) + else: + # show main parser options only when necessary + + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + flattened_opts = chain.from_iterable(opts) + if current.startswith("-"): + for opt in flattened_opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, flattened_opts) + if completion_type: + subcommands = list(auto_complete_paths(current, completion_type)) + + print(" ".join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type( + cwords: List[str], cword: int, opts: Iterable[Any] +) -> Optional[str]: + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith("-"): + return None + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split("/"): + if cwords[cword - 2].split("=")[0] == o: + if not opt.metavar or any( + x in ("path", "file", "dir") for x in opt.metavar.split("/") + ): + return opt.metavar + return None + + +def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]: + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(``file``, ``path`` or ``dir``) + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = ( + x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename) + ) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != "dir" and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, "") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..db9d5cc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,236 @@ +"""Base Command class, and related routines""" + +import functools +import logging +import logging.config +import optparse +import os +import sys +import traceback +from optparse import Values +from typing import Any, Callable, List, Optional, Tuple + +from pip._vendor.rich import traceback as rich_traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip._internal.cli.status_codes import ( + ERROR, + PREVIOUS_BUILD_DIR_ERROR, + UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.exceptions import ( + BadCommand, + CommandError, + DiagnosticPipError, + InstallationError, + NetworkConnectionError, + PreviousBuildDirError, + UninstallationError, +) +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry +from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry +from pip._internal.utils.virtualenv import running_under_virtualenv + +__all__ = ["Command"] + +logger = logging.getLogger(__name__) + + +class Command(CommandContextMixIn): + usage: str = "" + ignore_require_venv: bool = False + + def __init__(self, name: str, summary: str, isolated: bool = False) -> None: + super().__init__() + + self.name = name + self.summary = summary + self.parser = ConfigOptionParser( + usage=self.usage, + prog=f"{get_prog()} {name}", + formatter=UpdatingDefaultsHelpFormatter(), + add_help_option=False, + name=name, + description=self.__doc__, + isolated=isolated, + ) + + self.tempdir_registry: Optional[TempDirRegistry] = None + + # Commands should add options to this option group + optgroup_name = f"{self.name.capitalize()} Options" + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + self.add_options() + + def add_options(self) -> None: + pass + + def handle_pip_version_check(self, options: Values) -> None: + """ + This is a no-op so that commands by default do not do the pip version + check. + """ + # Make sure we do the pip version check if the index_group options + # are present. + assert not hasattr(options, "no_index") + + def run(self, options: Values, args: List[str]) -> int: + raise NotImplementedError + + def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]: + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args: List[str]) -> int: + try: + with self.main_context(): + return self._main(args) + finally: + logging.shutdown() + + def _main(self, args: List[str]) -> int: + # We must initialize this before the tempdir manager, otherwise the + # configuration would not be accessible by the time we clean up the + # tempdir manager. + self.tempdir_registry = self.enter_context(tempdir_registry()) + # Intentionally set as early as possible so globally-managed temporary + # directories are available to the rest of the code. + self.enter_context(global_tempdir_manager()) + + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + always_enabled_features = set(options.features_enabled) & set( + cmdoptions.ALWAYS_ENABLED_FEATURES + ) + if always_enabled_features: + logger.warning( + "The following features are always enabled: %s. ", + ", ".join(sorted(always_enabled_features)), + ) + + # Make sure that the --python argument isn't specified after the + # subcommand. We can tell, because if --python was specified, + # we should only reach this point if we're running in the created + # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment + # variable set. + if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: + logger.critical( + "The --python option must be placed before the pip subcommand name" + ) + sys.exit(ERROR) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ["PIP_NO_INPUT"] = "1" + + if options.exists_action: + os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical("Could not find an activated virtualenv (required).") + sys.exit(VIRTUALENV_NOT_FOUND) + + if options.cache_dir: + options.cache_dir = normalize_path(options.cache_dir) + if not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "or is not writable by the current user. The cache " + "has been disabled. Check the permissions and owner of " + "that directory. If executing pip with sudo, you should " + "use sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + def intercepts_unhandled_exc( + run_func: Callable[..., int] + ) -> Callable[..., int]: + @functools.wraps(run_func) + def exc_logging_wrapper(*args: Any) -> int: + try: + status = run_func(*args) + assert isinstance(status, int) + return status + except DiagnosticPipError as exc: + logger.error("%s", exc, extra={"rich": True}) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug("Exception information:", exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except ( + InstallationError, + UninstallationError, + BadCommand, + NetworkConnectionError, + ) as exc: + logger.critical(str(exc)) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical("%s", exc) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to + # stderr because stdout no longer works. + print("ERROR: Pipe to stdout was broken", file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical("Operation cancelled by user") + logger.debug("Exception information:", exc_info=True) + + return ERROR + except BaseException: + logger.critical("Exception:", exc_info=True) + + return UNKNOWN_ERROR + + return exc_logging_wrapper + + try: + if not options.debug_mode: + run = intercepts_unhandled_exc(self.run) + else: + run = self.run + rich_traceback.install(show_locals=True) + return run(options, args) + finally: + self.handle_pip_version_check(options) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..d643256 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,1074 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import importlib.util +import logging +import os +import textwrap +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values +from textwrap import dedent +from typing import Any, Callable, Dict, Optional, Tuple + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.parser import ConfigOptionParser +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, get_src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.target_python import TargetPython +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.misc import strtobool + +logger = logging.getLogger(__name__) + + +def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None: + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = f"{option} error: {msg}" + msg = textwrap.fill(" ".join(msg.split())) + parser.error(msg) + + +def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup: + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group["name"]) + for option in group["options"]: + option_group.add_option(option()) + return option_group + + +def check_dist_restriction(options: Values, check_target: bool = False) -> None: + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any( + [ + options.python_version, + options.platforms, + options.abis, + options.implementation, + ] + ) + + binary_only = FormatControl(set(), {":all:"}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # guaranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if not options.dry_run and dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target' or using '--dry-run'" + ) + + +def _path_option_check(option: Option, opt: str, value: str) -> str: + return os.path.expanduser(value) + + +def _package_name_option_check(option: Option, opt: str, value: str) -> str: + return canonicalize_name(value) + + +class PipOption(Option): + TYPES = Option.TYPES + ("path", "package_name") + TYPE_CHECKER = Option.TYPE_CHECKER.copy() + TYPE_CHECKER["package_name"] = _package_name_option_check + TYPE_CHECKER["path"] = _path_option_check + + +########### +# options # +########### + +help_: Callable[..., Option] = partial( + Option, + "-h", + "--help", + dest="help", + action="help", + help="Show help.", +) + +debug_mode: Callable[..., Option] = partial( + Option, + "--debug", + dest="debug_mode", + action="store_true", + default=False, + help=( + "Let unhandled exceptions propagate outside the main subroutine, " + "instead of logging them to stderr." + ), +) + +isolated_mode: Callable[..., Option] = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) + +require_virtualenv: Callable[..., Option] = partial( + Option, + "--require-virtualenv", + "--require-venv", + dest="require_venv", + action="store_true", + default=False, + help=( + "Allow pip to only run in a virtual environment; " + "exit with an error otherwise." + ), +) + +override_externally_managed: Callable[..., Option] = partial( + Option, + "--break-system-packages", + dest="override_externally_managed", + action="store_true", + help="Allow pip to modify an EXTERNALLY-MANAGED Python installation", +) + +python: Callable[..., Option] = partial( + Option, + "--python", + dest="python", + help="Run pip with the specified Python interpreter.", +) + +verbose: Callable[..., Option] = partial( + Option, + "-v", + "--verbose", + dest="verbose", + action="count", + default=0, + help="Give more output. Option is additive, and can be used up to 3 times.", +) + +no_color: Callable[..., Option] = partial( + Option, + "--no-color", + dest="no_color", + action="store_true", + default=False, + help="Suppress colored output.", +) + +version: Callable[..., Option] = partial( + Option, + "-V", + "--version", + dest="version", + action="store_true", + help="Show version and exit.", +) + +quiet: Callable[..., Option] = partial( + Option, + "-q", + "--quiet", + dest="quiet", + action="count", + default=0, + help=( + "Give less output. Option is additive, and can be used up to 3" + " times (corresponding to WARNING, ERROR, and CRITICAL logging" + " levels)." + ), +) + +progress_bar: Callable[..., Option] = partial( + Option, + "--progress-bar", + dest="progress_bar", + type="choice", + choices=["on", "off"], + default="on", + help="Specify whether the progress bar should be used [on, off] (default: on)", +) + +log: Callable[..., Option] = partial( + PipOption, + "--log", + "--log-file", + "--local-log", + dest="log", + metavar="path", + type="path", + help="Path to a verbose appending log.", +) + +no_input: Callable[..., Option] = partial( + Option, + # Don't ask for input + "--no-input", + dest="no_input", + action="store_true", + default=False, + help="Disable prompting for input.", +) + +keyring_provider: Callable[..., Option] = partial( + Option, + "--keyring-provider", + dest="keyring_provider", + choices=["auto", "disabled", "import", "subprocess"], + default="auto", + help=( + "Enable the credential lookup via the keyring library if user input is allowed." + " Specify which mechanism to use [disabled, import, subprocess]." + " (default: disabled)" + ), +) + +proxy: Callable[..., Option] = partial( + Option, + "--proxy", + dest="proxy", + type="str", + default="", + help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.", +) + +retries: Callable[..., Option] = partial( + Option, + "--retries", + dest="retries", + type="int", + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) + +timeout: Callable[..., Option] = partial( + Option, + "--timeout", + "--default-timeout", + metavar="sec", + dest="timeout", + type="float", + default=15, + help="Set the socket timeout (default %default seconds).", +) + + +def exists_action() -> Option: + return Option( + # Option when path already exist + "--exists-action", + dest="exists_action", + type="choice", + choices=["s", "i", "w", "b", "a"], + default=[], + action="append", + metavar="action", + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", + ) + + +cert: Callable[..., Option] = partial( + PipOption, + "--cert", + dest="cert", + type="path", + metavar="path", + help=( + "Path to PEM-encoded CA certificate bundle. " + "If provided, overrides the default. " + "See 'SSL Certificate Verification' in pip documentation " + "for more information." + ), +) + +client_cert: Callable[..., Option] = partial( + PipOption, + "--client-cert", + dest="client_cert", + type="path", + default=None, + metavar="path", + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) + +index_url: Callable[..., Option] = partial( + Option, + "-i", + "--index-url", + "--pypi-url", + dest="index_url", + metavar="URL", + default=PyPI.simple_url, + help="Base URL of the Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) + + +def extra_index_url() -> Option: + return Option( + "--extra-index-url", + dest="extra_index_urls", + metavar="URL", + action="append", + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index: Callable[..., Option] = partial( + Option, + "--no-index", + dest="no_index", + action="store_true", + default=False, + help="Ignore package index (only looking at --find-links URLs instead).", +) + + +def find_links() -> Option: + return Option( + "-f", + "--find-links", + dest="find_links", + action="append", + default=[], + metavar="url", + help="If a URL or path to an html file, then parse for links to " + "archives such as sdist (.tar.gz) or wheel (.whl) files. " + "If a local path or file:// URL that's a directory, " + "then look for archives in the directory listing. " + "Links to VCS project URLs are not supported.", + ) + + +def trusted_host() -> Option: + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host or host:port pair as trusted, even though it " + "does not have valid or any HTTPS.", + ) + + +def constraints() -> Option: + return Option( + "-c", + "--constraint", + dest="constraints", + action="append", + default=[], + metavar="file", + help="Constrain versions using the given constraints file. " + "This option can be used multiple times.", + ) + + +def requirements() -> Option: + return Option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help="Install from the given requirements file. " + "This option can be used multiple times.", + ) + + +def editable() -> Option: + return Option( + "-e", + "--editable", + dest="editables", + action="append", + default=[], + metavar="path/url", + help=( + "Install a project in editable mode (i.e. setuptools " + '"develop mode") from a local project path or a VCS url.' + ), + ) + + +def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None: + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +src: Callable[..., Option] = partial( + PipOption, + "--src", + "--source", + "--source-dir", + "--source-directory", + dest="src_dir", + type="path", + metavar="dir", + default=get_src_prefix(), + action="callback", + callback=_handle_src, + help="Directory to check out editable projects into. " + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".', +) + + +def _get_format_control(values: Values, option: Option) -> Any: + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, + existing.no_binary, + existing.only_binary, + ) + + +def _handle_only_binary( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, + existing.only_binary, + existing.no_binary, + ) + + +def no_binary() -> Option: + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", + dest="format_control", + action="callback", + callback=_handle_no_binary, + type="str", + default=format_control, + help="Do not use binary packages. Can be supplied multiple times, and " + 'each time adds to the existing value. Accepts either ":all:" to ' + 'disable all binary packages, ":none:" to empty the set (notice ' + "the colons), or one or more package names with commas between " + "them (no colons). Note that some packages are tricky to compile " + "and may fail to install when this option is used on them.", + ) + + +def only_binary() -> Option: + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", + dest="format_control", + action="callback", + callback=_handle_only_binary, + type="str", + default=format_control, + help="Do not use source packages. Can be supplied multiple times, and " + 'each time adds to the existing value. Accepts either ":all:" to ' + 'disable all source packages, ":none:" to empty the set, or one ' + "or more package names with commas between them. Packages " + "without binary distributions will fail to install when this " + "option is used on them.", + ) + + +platforms: Callable[..., Option] = partial( + Option, + "--platform", + dest="platforms", + metavar="platform", + action="append", + default=None, + help=( + "Only use wheels compatible with . Defaults to the " + "platform of the running system. Use this option multiple times to " + "specify multiple platforms supported by the target interpreter." + ), +) + + +# This was made a separate function for unit-testing purposes. +def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]: + """ + Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. + + :return: A 2-tuple (version_info, error_msg), where `error_msg` is + non-None if and only if there was a parsing error. + """ + if not value: + # The empty string is the same as not providing a value. + return (None, None) + + parts = value.split(".") + if len(parts) > 3: + return ((), "at most three version parts are allowed") + + if len(parts) == 1: + # Then we are in the case of "3" or "37". + value = parts[0] + if len(value) > 1: + parts = [value[0], value[1:]] + + try: + version_info = tuple(int(part) for part in parts) + except ValueError: + return ((), "each version part must be an integer") + + return (version_info, None) + + +def _handle_python_version( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + """ + Handle a provided --python-version value. + """ + version_info, error_msg = _convert_python_version(value) + if error_msg is not None: + msg = f"invalid --python-version value: {value!r}: {error_msg}" + raise_option_error(parser, option=option, msg=msg) + + parser.values.python_version = version_info + + +python_version: Callable[..., Option] = partial( + Option, + "--python-version", + dest="python_version", + metavar="python_version", + action="callback", + callback=_handle_python_version, + type="str", + default=None, + help=dedent( + """\ + The Python interpreter version to use for wheel and "Requires-Python" + compatibility checks. Defaults to a version derived from the running + interpreter. The version can be specified using up to three dot-separated + integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor + version can also be given as a string without dots (e.g. "37" for 3.7.0). + """ + ), +) + + +implementation: Callable[..., Option] = partial( + Option, + "--implementation", + dest="implementation", + metavar="implementation", + default=None, + help=( + "Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels." + ), +) + + +abis: Callable[..., Option] = partial( + Option, + "--abi", + dest="abis", + metavar="abi", + action="append", + default=None, + help=( + "Only use wheels compatible with Python abi , e.g. 'pypy_41'. " + "If not specified, then the current interpreter abi tag is used. " + "Use this option multiple times to specify multiple abis supported " + "by the target interpreter. Generally you will need to specify " + "--implementation, --platform, and --python-version when using this " + "option." + ), +) + + +def add_target_python_options(cmd_opts: OptionGroup) -> None: + cmd_opts.add_option(platforms()) + cmd_opts.add_option(python_version()) + cmd_opts.add_option(implementation()) + cmd_opts.add_option(abis()) + + +def make_target_python(options: Values) -> TargetPython: + target_python = TargetPython( + platforms=options.platforms, + py_version_info=options.python_version, + abis=options.abis, + implementation=options.implementation, + ) + + return target_python + + +def prefer_binary() -> Option: + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help=( + "Prefer binary packages over source packages, even if the " + "source packages are newer." + ), + ) + + +cache_dir: Callable[..., Option] = partial( + PipOption, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + type="path", + help="Store the cache data in .", +) + + +def _handle_no_cache_dir( + option: Option, opt: str, value: str, parser: OptionParser +) -> None: + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache: Callable[..., Option] = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=_handle_no_cache_dir, + help="Disable the cache.", +) + +no_deps: Callable[..., Option] = partial( + Option, + "--no-deps", + "--no-dependencies", + dest="ignore_dependencies", + action="store_true", + default=False, + help="Don't install package dependencies.", +) + +ignore_requires_python: Callable[..., Option] = partial( + Option, + "--ignore-requires-python", + dest="ignore_requires_python", + action="store_true", + help="Ignore the Requires-Python information.", +) + +no_build_isolation: Callable[..., Option] = partial( + Option, + "--no-build-isolation", + dest="build_isolation", + action="store_false", + default=True, + help="Disable isolation when building a modern source distribution. " + "Build dependencies specified by PEP 518 must be already installed " + "if this option is used.", +) + +check_build_deps: Callable[..., Option] = partial( + Option, + "--check-build-dependencies", + dest="check_build_deps", + action="store_true", + default=False, + help="Check the build dependencies when PEP517 is used.", +) + + +def _handle_no_use_pep517( + option: Option, opt: str, value: str, parser: OptionParser +) -> None: + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # If user doesn't wish to use pep517, we check if setuptools and wheel are installed + # and raise error if it is not. + packages = ("setuptools", "wheel") + if not all(importlib.util.find_spec(package) for package in packages): + msg = ( + f"It is not possible to use --no-use-pep517 " + f"without {' and '.join(packages)} installed." + ) + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517: Any = partial( + Option, + "--use-pep517", + dest="use_pep517", + action="store_true", + default=None, + help="Use PEP 517 for building source distributions " + "(use --no-use-pep517 to force legacy behaviour).", +) + +no_use_pep517: Any = partial( + Option, + "--no-use-pep517", + dest="use_pep517", + action="callback", + callback=_handle_no_use_pep517, + default=None, + help=SUPPRESS_HELP, +) + + +def _handle_config_settings( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + key, sep, val = value.partition("=") + if sep != "=": + parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") + dest = getattr(parser.values, option.dest) + if dest is None: + dest = {} + setattr(parser.values, option.dest, dest) + if key in dest: + if isinstance(dest[key], list): + dest[key].append(val) + else: + dest[key] = [dest[key], val] + else: + dest[key] = val + + +config_settings: Callable[..., Option] = partial( + Option, + "-C", + "--config-settings", + dest="config_settings", + type=str, + action="callback", + callback=_handle_config_settings, + metavar="settings", + help="Configuration settings to be passed to the PEP 517 build backend. " + "Settings take the form KEY=VALUE. Use multiple --config-settings options " + "to pass multiple keys to the backend.", +) + +build_options: Callable[..., Option] = partial( + Option, + "--build-option", + dest="build_options", + metavar="options", + action="append", + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", +) + +global_options: Callable[..., Option] = partial( + Option, + "--global-option", + dest="global_options", + action="append", + metavar="options", + help="Extra global options to be supplied to the setup.py " + "call before the install or bdist_wheel command.", +) + +no_clean: Callable[..., Option] = partial( + Option, + "--no-clean", + action="store_true", + default=False, + help="Don't clean up build directories.", +) + +pre: Callable[..., Option] = partial( + Option, + "--pre", + action="store_true", + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) + +disable_pip_version_check: Callable[..., Option] = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=True, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) + +root_user_action: Callable[..., Option] = partial( + Option, + "--root-user-action", + dest="root_user_action", + default="warn", + choices=["warn", "ignore"], + help="Action if pip is run as a root user. By default, a warning message is shown.", +) + + +def _handle_merge_hash( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(":", 1) + except ValueError: + parser.error( + f"Arguments to {opt_str} must be a hash name " + "followed by a value, like --hash=sha256:" + "abcde..." + ) + if algo not in STRONG_HASHES: + parser.error( + "Allowed hash algorithms for {} are {}.".format( + opt_str, ", ".join(STRONG_HASHES) + ) + ) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash: Callable[..., Option] = partial( + Option, + "--hash", + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest="hashes", + action="callback", + callback=_handle_merge_hash, + type="string", + help="Verify that the package's archive matches this " + "hash before installing. Example: --hash=sha256:abcdef...", +) + + +require_hashes: Callable[..., Option] = partial( + Option, + "--require-hashes", + dest="require_hashes", + action="store_true", + default=False, + help="Require a hash to check each requirement against, for " + "repeatable installs. This option is implied when any package in a " + "requirements file has a --hash option.", +) + + +list_path: Callable[..., Option] = partial( + PipOption, + "--path", + dest="path", + type="path", + action="append", + help="Restrict to the specified installation path for listing " + "packages (can be used multiple times).", +) + + +def check_list_path_option(options: Values) -> None: + if options.path and (options.user or options.local): + raise CommandError("Cannot combine '--path' with '--user' or '--local'") + + +list_exclude: Callable[..., Option] = partial( + PipOption, + "--exclude", + dest="excludes", + action="append", + metavar="package", + type="package_name", + help="Exclude specified package from the output", +) + + +no_python_version_warning: Callable[..., Option] = partial( + Option, + "--no-python-version-warning", + dest="no_python_version_warning", + action="store_true", + default=False, + help="Silence deprecation warnings for upcoming unsupported Pythons.", +) + + +# Features that are now always on. A warning is printed if they are used. +ALWAYS_ENABLED_FEATURES = [ + "no-binary-enable-wheel-cache", # always on since 23.1 +] + +use_new_feature: Callable[..., Option] = partial( + Option, + "--use-feature", + dest="features_enabled", + metavar="feature", + action="append", + default=[], + choices=[ + "fast-deps", + "truststore", + ] + + ALWAYS_ENABLED_FEATURES, + help="Enable new functionality, that may be backward incompatible.", +) + +use_deprecated_feature: Callable[..., Option] = partial( + Option, + "--use-deprecated", + dest="deprecated_features_enabled", + metavar="feature", + action="append", + default=[], + choices=[ + "legacy-resolver", + ], + help=("Enable deprecated functionality, that will be removed in the future."), +) + + +########## +# groups # +########## + +general_group: Dict[str, Any] = { + "name": "General Options", + "options": [ + help_, + debug_mode, + isolated_mode, + require_virtualenv, + python, + verbose, + version, + quiet, + log, + no_input, + keyring_provider, + proxy, + retries, + timeout, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + no_python_version_warning, + use_new_feature, + use_deprecated_feature, + ], +} + +index_group: Dict[str, Any] = { + "name": "Package Index Options", + "options": [ + index_url, + extra_index_url, + no_index, + find_links, + ], +} diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py new file mode 100644 index 0000000..139995a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py @@ -0,0 +1,27 @@ +from contextlib import ExitStack, contextmanager +from typing import ContextManager, Generator, TypeVar + +_T = TypeVar("_T", covariant=True) + + +class CommandContextMixIn: + def __init__(self) -> None: + super().__init__() + self._in_main_context = False + self._main_context = ExitStack() + + @contextmanager + def main_context(self) -> Generator[None, None, None]: + assert not self._in_main_context + + self._in_main_context = True + try: + with self._main_context: + yield + finally: + self._in_main_context = False + + def enter_context(self, context_provider: ContextManager[_T]) -> _T: + assert self._in_main_context + + return self._main_context.enter_context(context_provider) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/main.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/main.py new file mode 100644 index 0000000..7e061f5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/main.py @@ -0,0 +1,79 @@ +"""Primary application entrypoint. +""" +import locale +import logging +import os +import sys +import warnings +from typing import List, Optional + +from pip._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import create_command +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation + +logger = logging.getLogger(__name__) + + +# Do not import and use main() directly! Using it directly is actively +# discouraged by pip's maintainers. The name, location and behavior of +# this function is subject to change, so calling it directly is not +# portable across different pip versions. + +# In addition, running pip in-process is unsupported and unsafe. This is +# elaborated in detail at +# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program. +# That document also provides suggestions that should work for nearly +# all users that are considering importing and using main() directly. + +# However, we know that certain users will still want to invoke pip +# in-process. If you understand and accept the implications of using pip +# in an unsupported manner, the best approach is to use runpy to avoid +# depending on the exact location of this entry point. + +# The following example shows how to use runpy to invoke pip in that +# case: +# +# sys.argv = ["pip", your, args, here] +# runpy.run_module("pip", run_name="__main__") +# +# Note that this will exit the process after running, unlike a direct +# call to main. As it is not safe to do any processing after calling +# main, this should not be an issue in practice. + + +def main(args: Optional[List[str]] = None) -> int: + if args is None: + args = sys.argv[1:] + + # Suppress the pkg_resources deprecation warning + # Note - we use a module of .*pkg_resources to cover + # the normal case (pip._vendor.pkg_resources) and the + # devendored case (a bare pkg_resources) + warnings.filterwarnings( + action="ignore", category=DeprecationWarning, module=".*pkg_resources" + ) + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parse_command(args) + except PipError as exc: + sys.stderr.write(f"ERROR: {exc}") + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, "") + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) + + return command.main(cmd_args) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..5ade356 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py @@ -0,0 +1,134 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import subprocess +import sys +from typing import List, Optional, Tuple + +from pip._internal.build_env import get_runnable_pip +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip._internal.commands import commands_dict, get_similar_commands +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_pip_version, get_prog + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser() -> ConfigOptionParser: + """Creates and returns the main parser for pip's CLI""" + + parser = ConfigOptionParser( + usage="\n%prog [options]", + add_help_option=False, + formatter=UpdatingDefaultsHelpFormatter(), + name="global", + prog=get_prog(), + ) + parser.disable_interspersed_args() + + parser.version = get_pip_version() + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + # so the help formatter knows + parser.main = True # type: ignore + + # create command listing for description + description = [""] + [ + f"{name:27} {command_info.summary}" + for name, command_info in commands_dict.items() + ] + parser.description = "\n".join(description) + + return parser + + +def identify_python_interpreter(python: str) -> Optional[str]: + # If the named file exists, use it. + # If it's a directory, assume it's a virtual environment and + # look for the environment's Python executable. + if os.path.exists(python): + if os.path.isdir(python): + # bin/python for Unix, Scripts/python.exe for Windows + # Try both in case of odd cases like cygwin. + for exe in ("bin/python", "Scripts/python.exe"): + py = os.path.join(python, exe) + if os.path.exists(py): + return py + else: + return python + + # Could not find the interpreter specified + return None + + +def parse_command(args: List[str]) -> Tuple[str, List[str]]: + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --python + if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: + # Re-invoke pip using the specified Python interpreter + interpreter = identify_python_interpreter(general_options.python) + if interpreter is None: + raise CommandError( + f"Could not locate Python interpreter {general_options.python}" + ) + + pip_cmd = [ + interpreter, + get_runnable_pip(), + ] + pip_cmd.extend(args) + + # Set a flag so the child doesn't re-invoke itself, causing + # an infinite loop. + os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1" + returncode = 0 + try: + proc = subprocess.run(pip_cmd) + returncode = proc.returncode + except (subprocess.SubprocessError, OSError) as exc: + raise CommandError(f"Failed to run pip under {interpreter}: {exc}") + sys.exit(returncode) + + # --version + if general_options.version: + sys.stdout.write(parser.version) + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == "help" and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = [f'unknown command "{cmd_name}"'] + if guess: + msg.append(f'maybe you meant "{guess}"') + + raise CommandError(" - ".join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/parser.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..ae554b2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,294 @@ +"""Base option parser setup""" + +import logging +import optparse +import shutil +import sys +import textwrap +from contextlib import suppress +from typing import Any, Dict, Generator, List, Tuple + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.misc import redact_auth_from_url, strtobool + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + # help position must be aligned with __init__.parseopts.description + kwargs["max_help_position"] = 30 + kwargs["indent_increment"] = 1 + kwargs["width"] = shutil.get_terminal_size()[0] - 2 + super().__init__(*args, **kwargs) + + def format_option_strings(self, option: optparse.Option) -> str: + return self._format_option_strings(option) + + def _format_option_strings( + self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", " + ) -> str: + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + assert option.dest is not None + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt.format(metavar.lower())) + + return "".join(opts) + + def format_heading(self, heading: str) -> str: + if heading == "Options": + return "" + return heading + ":\n" + + def format_usage(self, usage: str) -> str: + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " ")) + return msg + + def format_description(self, description: str) -> str: + # leave full control over description to us + if description: + if hasattr(self.parser, "main"): + label = "Commands" + else: + label = "Description" + # some doc strings have initial newlines, some don't + description = description.lstrip("\n") + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = f"{label}:\n{description}\n" + return description + else: + return "" + + def format_epilog(self, epilog: str) -> str: + # leave full control over epilog to us + if epilog: + return epilog + else: + return "" + + def indent_lines(self, text: str, indent: str) -> str: + new_lines = [indent + line for line in text.split("\n")] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + + Also redact auth from url type options + """ + + def expand_default(self, option: optparse.Option) -> str: + default_values = None + if self.parser is not None: + assert isinstance(self.parser, ConfigOptionParser) + self.parser._update_defaults(self.parser.defaults) + assert option.dest is not None + default_values = self.parser.defaults.get(option.dest) + help_text = super().expand_default(option) + + if default_values and option.metavar == "URL": + if isinstance(default_values, str): + default_values = [default_values] + + # If its not a list, we should abort and just return the help text + if not isinstance(default_values, list): + default_values = [] + + for val in default_values: + help_text = help_text.replace(val, redact_auth_from_url(val)) + + return help_text + + +class CustomOptionParser(optparse.OptionParser): + def insert_option_group( + self, idx: int, *args: Any, **kwargs: Any + ) -> optparse.OptionGroup: + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self) -> List[optparse.Option]: + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__( + self, + *args: Any, + name: str, + isolated: bool = False, + **kwargs: Any, + ) -> None: + self.name = name + self.config = Configuration(isolated) + + assert self.name + super().__init__(*args, **kwargs) + + def check_default(self, option: optparse.Option, key: str, val: Any) -> Any: + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print(f"An error occurred during configuration: {exc}") + sys.exit(3) + + def _get_ordered_configuration_items( + self, + ) -> Generator[Tuple[str, Any], None, None]: + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items: Dict[str, List[Tuple[str, Any]]] = { + name: [] for name in override_order + } + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key, + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]: + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option("--" + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + assert option.dest is not None + + if option.action in ("store_true", "store_false"): + try: + val = strtobool(val) + except ValueError: + self.error( + f"{val} is not a valid value for {key} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead." + ) + elif option.action == "count": + with suppress(ValueError): + val = strtobool(val) + with suppress(ValueError): + val = int(val) + if not isinstance(val, int) or val < 0: + self.error( + f"{val} is not a valid value for {key} option, " + "please instead specify either a non-negative integer " + "or a boolean value like yes/no or false/true " + "which is equivalent to 1/0." + ) + elif option.action == "append": + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == "callback": + assert option.callback is not None + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self) -> optparse.Values: + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + assert option.dest is not None + default = defaults.get(option.dest) + if isinstance(default, str): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg: str) -> None: + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, f"{msg}\n") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py new file mode 100644 index 0000000..0ad1403 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py @@ -0,0 +1,68 @@ +import functools +from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple + +from pip._vendor.rich.progress import ( + BarColumn, + DownloadColumn, + FileSizeColumn, + Progress, + ProgressColumn, + SpinnerColumn, + TextColumn, + TimeElapsedColumn, + TimeRemainingColumn, + TransferSpeedColumn, +) + +from pip._internal.utils.logging import get_indentation + +DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]] + + +def _rich_progress_bar( + iterable: Iterable[bytes], + *, + bar_type: str, + size: int, +) -> Generator[bytes, None, None]: + assert bar_type == "on", "This should only be used in the default mode." + + if not size: + total = float("inf") + columns: Tuple[ProgressColumn, ...] = ( + TextColumn("[progress.description]{task.description}"), + SpinnerColumn("line", speed=1.5), + FileSizeColumn(), + TransferSpeedColumn(), + TimeElapsedColumn(), + ) + else: + total = size + columns = ( + TextColumn("[progress.description]{task.description}"), + BarColumn(), + DownloadColumn(), + TransferSpeedColumn(), + TextColumn("eta"), + TimeRemainingColumn(), + ) + + progress = Progress(*columns, refresh_per_second=30) + task_id = progress.add_task(" " * (get_indentation() + 2), total=total) + with progress: + for chunk in iterable: + yield chunk + progress.update(task_id, advance=len(chunk)) + + +def get_download_progress_renderer( + *, bar_type: str, size: Optional[int] = None +) -> DownloadProgressRenderer: + """Get an object that can be used to render the download progress. + + Returns a callable, that takes an iterable to "wrap". + """ + if bar_type == "on": + return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size) + else: + return iter # no-op, when passed an iterator diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py new file mode 100644 index 0000000..6f2f79c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py @@ -0,0 +1,505 @@ +"""Contains the Command base classes that depend on PipSession. + +The classes in this module are in a separate module so the commands not +needing download / PackageFinder capability don't unnecessarily import the +PackageFinder machinery and all its vendored dependencies, etc. +""" + +import logging +import os +import sys +from functools import partial +from optparse import Values +from typing import TYPE_CHECKING, Any, List, Optional, Tuple + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.network.session import PipSession +from pip._internal.operations.build.build_tracker import BuildTracker +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, + install_req_from_parsed_requirement, + install_req_from_req_string, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.req.req_install import InstallRequirement +from pip._internal.resolution.base import BaseResolver +from pip._internal.self_outdated_check import pip_self_version_check +from pip._internal.utils.temp_dir import ( + TempDirectory, + TempDirectoryTypeRegistry, + tempdir_kinds, +) +from pip._internal.utils.virtualenv import running_under_virtualenv + +if TYPE_CHECKING: + from ssl import SSLContext + +logger = logging.getLogger(__name__) + + +def _create_truststore_ssl_context() -> Optional["SSLContext"]: + if sys.version_info < (3, 10): + raise CommandError("The truststore feature is only available for Python 3.10+") + + try: + import ssl + except ImportError: + logger.warning("Disabling truststore since ssl support is missing") + return None + + try: + from pip._vendor import truststore + except ImportError as e: + raise CommandError(f"The truststore feature is unavailable: {e}") + + return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + + +class SessionCommandMixin(CommandContextMixIn): + + """ + A class mixin for command classes needing _build_session(). + """ + + def __init__(self) -> None: + super().__init__() + self._session: Optional[PipSession] = None + + @classmethod + def _get_index_urls(cls, options: Values) -> Optional[List[str]]: + """Return a list of index urls from user-provided options.""" + index_urls = [] + if not getattr(options, "no_index", False): + url = getattr(options, "index_url", None) + if url: + index_urls.append(url) + urls = getattr(options, "extra_index_urls", None) + if urls: + index_urls.extend(urls) + # Return None rather than an empty list + return index_urls or None + + def get_default_session(self, options: Values) -> PipSession: + """Get a default-managed session.""" + if self._session is None: + self._session = self.enter_context(self._build_session(options)) + # there's no type annotation on requests.Session, so it's + # automatically ContextManager[Any] and self._session becomes Any, + # then https://github.com/python/mypy/issues/7696 kicks in + assert self._session is not None + return self._session + + def _build_session( + self, + options: Values, + retries: Optional[int] = None, + timeout: Optional[int] = None, + fallback_to_certifi: bool = False, + ) -> PipSession: + cache_dir = options.cache_dir + assert not cache_dir or os.path.isabs(cache_dir) + + if "truststore" in options.features_enabled: + try: + ssl_context = _create_truststore_ssl_context() + except Exception: + if not fallback_to_certifi: + raise + ssl_context = None + else: + ssl_context = None + + session = PipSession( + cache=os.path.join(cache_dir, "http-v2") if cache_dir else None, + retries=retries if retries is not None else options.retries, + trusted_hosts=options.trusted_hosts, + index_urls=self._get_index_urls(options), + ssl_context=ssl_context, + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = timeout if timeout is not None else options.timeout + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + session.auth.keyring_provider = options.keyring_provider + + return session + + +class IndexGroupCommand(Command, SessionCommandMixin): + + """ + Abstract base class for commands with the index_group options. + + This also corresponds to the commands that permit the pip version check. + """ + + def handle_pip_version_check(self, options: Values) -> None: + """ + Do the pip version check if not disabled. + + This overrides the default behavior of not doing the check. + """ + # Make sure the index_group options are present. + assert hasattr(options, "no_index") + + if options.disable_pip_version_check or options.no_index: + return + + # Otherwise, check if we're using the latest version of pip available. + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout), + # This is set to ensure the function does not fail when truststore is + # specified in use-feature but cannot be loaded. This usually raises a + # CommandError and shows a nice user-facing error, but this function is not + # called in that try-except block. + fallback_to_certifi=True, + ) + with session: + pip_self_version_check(session, options) + + +KEEPABLE_TEMPDIR_TYPES = [ + tempdir_kinds.BUILD_ENV, + tempdir_kinds.EPHEM_WHEEL_CACHE, + tempdir_kinds.REQ_BUILD, +] + + +def warn_if_run_as_root() -> None: + """Output a warning for sudo users on Unix. + + In a virtual environment, sudo pip still writes to virtualenv. + On Windows, users may run pip as Administrator without issues. + This warning only applies to Unix root users outside of virtualenv. + """ + if running_under_virtualenv(): + return + if not hasattr(os, "getuid"): + return + # On Windows, there are no "system managed" Python packages. Installing as + # Administrator via pip is the correct way of updating system environments. + # + # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform + # checks: https://mypy.readthedocs.io/en/stable/common_issues.html + if sys.platform == "win32" or sys.platform == "cygwin": + return + + if os.getuid() != 0: + return + + logger.warning( + "Running pip as the 'root' user can result in broken permissions and " + "conflicting behaviour with the system package manager. " + "It is recommended to use a virtual environment instead: " + "https://pip.pypa.io/warnings/venv" + ) + + +def with_cleanup(func: Any) -> Any: + """Decorator for common logic related to managing temporary + directories. + """ + + def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None: + for t in KEEPABLE_TEMPDIR_TYPES: + registry.set_delete(t, False) + + def wrapper( + self: RequirementCommand, options: Values, args: List[Any] + ) -> Optional[int]: + assert self.tempdir_registry is not None + if options.no_clean: + configure_tempdir_registry(self.tempdir_registry) + + try: + return func(self, options, args) + except PreviousBuildDirError: + # This kind of conflict can occur when the user passes an explicit + # build directory with a pre-existing folder. In that case we do + # not want to accidentally remove it. + configure_tempdir_registry(self.tempdir_registry) + raise + + return wrapper + + +class RequirementCommand(IndexGroupCommand): + def __init__(self, *args: Any, **kw: Any) -> None: + super().__init__(*args, **kw) + + self.cmd_opts.add_option(cmdoptions.no_clean()) + + @staticmethod + def determine_resolver_variant(options: Values) -> str: + """Determines which resolver should be used, based on the given options.""" + if "legacy-resolver" in options.deprecated_features_enabled: + return "legacy" + + return "resolvelib" + + @classmethod + def make_requirement_preparer( + cls, + temp_build_dir: TempDirectory, + options: Values, + build_tracker: BuildTracker, + session: PipSession, + finder: PackageFinder, + use_user_site: bool, + download_dir: Optional[str] = None, + verbosity: int = 0, + ) -> RequirementPreparer: + """ + Create a RequirementPreparer instance for the given parameters. + """ + temp_build_dir_path = temp_build_dir.path + assert temp_build_dir_path is not None + legacy_resolver = False + + resolver_variant = cls.determine_resolver_variant(options) + if resolver_variant == "resolvelib": + lazy_wheel = "fast-deps" in options.features_enabled + if lazy_wheel: + logger.warning( + "pip is using lazily downloaded wheels using HTTP " + "range requests to obtain dependency information. " + "This experimental feature is enabled through " + "--use-feature=fast-deps and it is not ready for " + "production." + ) + else: + legacy_resolver = True + lazy_wheel = False + if "fast-deps" in options.features_enabled: + logger.warning( + "fast-deps has no effect when used with the legacy resolver." + ) + + return RequirementPreparer( + build_dir=temp_build_dir_path, + src_dir=options.src_dir, + download_dir=download_dir, + build_isolation=options.build_isolation, + check_build_deps=options.check_build_deps, + build_tracker=build_tracker, + session=session, + progress_bar=options.progress_bar, + finder=finder, + require_hashes=options.require_hashes, + use_user_site=use_user_site, + lazy_wheel=lazy_wheel, + verbosity=verbosity, + legacy_resolver=legacy_resolver, + ) + + @classmethod + def make_resolver( + cls, + preparer: RequirementPreparer, + finder: PackageFinder, + options: Values, + wheel_cache: Optional[WheelCache] = None, + use_user_site: bool = False, + ignore_installed: bool = True, + ignore_requires_python: bool = False, + force_reinstall: bool = False, + upgrade_strategy: str = "to-satisfy-only", + use_pep517: Optional[bool] = None, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> BaseResolver: + """ + Create a Resolver instance for the given parameters. + """ + make_install_req = partial( + install_req_from_req_string, + isolated=options.isolated_mode, + use_pep517=use_pep517, + ) + resolver_variant = cls.determine_resolver_variant(options) + # The long import name and duplicated invocation is needed to convince + # Mypy into correctly typechecking. Otherwise it would complain the + # "Resolver" class being redefined. + if resolver_variant == "resolvelib": + import pip._internal.resolution.resolvelib.resolver + + return pip._internal.resolution.resolvelib.resolver.Resolver( + preparer=preparer, + finder=finder, + wheel_cache=wheel_cache, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + ) + import pip._internal.resolution.legacy.resolver + + return pip._internal.resolution.legacy.resolver.Resolver( + preparer=preparer, + finder=finder, + wheel_cache=wheel_cache, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + ) + + def get_requirements( + self, + args: List[str], + options: Values, + finder: PackageFinder, + session: PipSession, + ) -> List[InstallRequirement]: + """ + Parse command-line arguments into the corresponding requirements. + """ + requirements: List[InstallRequirement] = [] + for filename in options.constraints: + for parsed_req in parse_requirements( + filename, + constraint=True, + finder=finder, + options=options, + session=session, + ): + req_to_add = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode, + user_supplied=False, + ) + requirements.append(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, + comes_from=None, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + user_supplied=True, + config_settings=getattr(options, "config_settings", None), + ) + requirements.append(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + user_supplied=True, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + config_settings=getattr(options, "config_settings", None), + ) + requirements.append(req_to_add) + + # NOTE: options.require_hashes may be set if --require-hashes is True + for filename in options.requirements: + for parsed_req in parse_requirements( + filename, finder=finder, options=options, session=session + ): + req_to_add = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + user_supplied=True, + config_settings=parsed_req.options.get("config_settings") + if parsed_req.options + else None, + ) + requirements.append(req_to_add) + + # If any requirement has hash options, enable hash checking. + if any(req.has_hash_options for req in requirements): + options.require_hashes = True + + if not (args or options.editables or options.requirements): + opts = {"name": self.name} + if options.find_links: + raise CommandError( + "You must give at least one requirement to {name} " + '(maybe you meant "pip {name} {links}"?)'.format( + **dict(opts, links=" ".join(options.find_links)) + ) + ) + else: + raise CommandError( + "You must give at least one requirement to {name} " + '(see "pip help {name}")'.format(**opts) + ) + + return requirements + + @staticmethod + def trace_basic_info(finder: PackageFinder) -> None: + """ + Trace basic information about the provided objects. + """ + # Display where finder is looking for packages + search_scope = finder.search_scope + locations = search_scope.get_formatted_locations() + if locations: + logger.info(locations) + + def _build_package_finder( + self, + options: Values, + session: PipSession, + target_python: Optional[TargetPython] = None, + ignore_requires_python: Optional[bool] = None, + ) -> PackageFinder: + """ + Create a package finder appropriate to this requirement command. + + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + link_collector = LinkCollector.create(session, options=options) + selection_prefs = SelectionPreferences( + allow_yanked=True, + format_control=options.format_control, + allow_all_prereleases=options.pre, + prefer_binary=options.prefer_binary, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py new file mode 100644 index 0000000..cf2b976 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py @@ -0,0 +1,159 @@ +import contextlib +import itertools +import logging +import sys +import time +from typing import IO, Generator, Optional + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import get_indentation + +logger = logging.getLogger(__name__) + + +class SpinnerInterface: + def spin(self) -> None: + raise NotImplementedError() + + def finish(self, final_status: str) -> None: + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + def __init__( + self, + message: str, + file: Optional[IO[str]] = None, + spin_chars: str = "-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds: float = 0.125, + ): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status: str) -> None: + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self) -> None: + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status: str) -> None: + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(SpinnerInterface): + def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None: + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status: str) -> None: + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self) -> None: + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status: str) -> None: + if self._finished: + return + self._update(f"finished with status '{final_status}'") + self._finished = True + + +class RateLimiter: + def __init__(self, min_update_interval_seconds: float) -> None: + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update: float = 0 + + def ready(self) -> bool: + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self) -> None: + self._last_update = time.time() + + +@contextlib.contextmanager +def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]: + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner: SpinnerInterface = InteractiveSpinner(message) + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") + + +HIDE_CURSOR = "\x1b[?25l" +SHOW_CURSOR = "\x1b[?25h" + + +@contextlib.contextmanager +def hidden_cursor(file: IO[str]) -> Generator[None, None, None]: + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py b/myenv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..5e29502 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py @@ -0,0 +1,6 @@ +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..858a410 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,132 @@ +""" +Package containing all pip commands +""" + +import importlib +from collections import namedtuple +from typing import Any, Dict, Optional + +from pip._internal.cli.base_command import Command + +CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary") + +# This dictionary does a bunch of heavy lifting for help output: +# - Enables avoiding additional (costly) imports for presenting `--help`. +# - The ordering matters for help display. +# +# Even though the module path starts with the same "pip._internal.commands" +# prefix, the full path makes testing easier (specifically when modifying +# `commands_dict` in test setup / teardown). +commands_dict: Dict[str, CommandInfo] = { + "install": CommandInfo( + "pip._internal.commands.install", + "InstallCommand", + "Install packages.", + ), + "download": CommandInfo( + "pip._internal.commands.download", + "DownloadCommand", + "Download packages.", + ), + "uninstall": CommandInfo( + "pip._internal.commands.uninstall", + "UninstallCommand", + "Uninstall packages.", + ), + "freeze": CommandInfo( + "pip._internal.commands.freeze", + "FreezeCommand", + "Output installed packages in requirements format.", + ), + "inspect": CommandInfo( + "pip._internal.commands.inspect", + "InspectCommand", + "Inspect the python environment.", + ), + "list": CommandInfo( + "pip._internal.commands.list", + "ListCommand", + "List installed packages.", + ), + "show": CommandInfo( + "pip._internal.commands.show", + "ShowCommand", + "Show information about installed packages.", + ), + "check": CommandInfo( + "pip._internal.commands.check", + "CheckCommand", + "Verify installed packages have compatible dependencies.", + ), + "config": CommandInfo( + "pip._internal.commands.configuration", + "ConfigurationCommand", + "Manage local and global configuration.", + ), + "search": CommandInfo( + "pip._internal.commands.search", + "SearchCommand", + "Search PyPI for packages.", + ), + "cache": CommandInfo( + "pip._internal.commands.cache", + "CacheCommand", + "Inspect and manage pip's wheel cache.", + ), + "index": CommandInfo( + "pip._internal.commands.index", + "IndexCommand", + "Inspect information available from package indexes.", + ), + "wheel": CommandInfo( + "pip._internal.commands.wheel", + "WheelCommand", + "Build wheels from your requirements.", + ), + "hash": CommandInfo( + "pip._internal.commands.hash", + "HashCommand", + "Compute hashes of package archives.", + ), + "completion": CommandInfo( + "pip._internal.commands.completion", + "CompletionCommand", + "A helper command used for command completion.", + ), + "debug": CommandInfo( + "pip._internal.commands.debug", + "DebugCommand", + "Show information useful for debugging.", + ), + "help": CommandInfo( + "pip._internal.commands.help", + "HelpCommand", + "Show help for commands.", + ), +} + + +def create_command(name: str, **kwargs: Any) -> Command: + """ + Create an instance of the Command class with the given name. + """ + module_path, class_name, summary = commands_dict[name] + module = importlib.import_module(module_path) + command_class = getattr(module, class_name) + command = command_class(name=name, summary=summary, **kwargs) + + return command + + +def get_similar_commands(name: str) -> Optional[str]: + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return None diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35eebfeb6ff2343e6d7d54a731442f0ac816c1c2 GIT binary patch literal 4020 zcmaJ^&2!tv6<>fP2#F%8Pg}Mu8@46clr7ToN8HMeU0I4^*|FqAwbLrea3JoIgarc3 z0<=tqn&F{`YC6-#(}Q*BL7B-R9rxg4|A$_z(IF@%o!ZmMp*K#IQ%-%mAZRExixGj{ z-|y{j-@bkOp})oB-3Xow>kkW)Nre8zD*h8~74~Hjp=am;!e|v?0gJk@D!@0Si>1(N zNMKl450@gVk&?73m7=Rrjzx62)V10rAQ6!emT>er=&)zCTSFK`NjL7o-8l9<&BuEQ7K zBRzPDMDQ}{%1ikEZ^EkyjxCcY>0y@nF#ZtGWK~RkR2%QUujba(0#S0NVXK;<83jev zb)~G80VEfH*2$~sAf+|aC1b;I*o&UWSHvaOkhs)JE<&THq! zT7^X;Z`PEOi7PtEmQ}lWUdidIWo4P#dBv(gH?-ga5Gdhv2p%Knf+FS2RjW#IP+T zZ_<)#r+Hw@BxnD>z%rf(mKFTIPC#H;U9pQqDOc^HX(+^atWncoJ*3^Ru32_%q{9Fh z>Bc^Qw=X!%DsOQel&qq;(NT$!ZfphKzS1PCfRZ;xNIgYeGv6APv>VA4Np8J%tb?1J zb$jNRkuQJsA)#8n`W9D}qWYMvmJ%egwx$yWlQJ)G##FJnh<+Va>tW#&4u25)f z8t&j+uh8@v5&7d?xzTI6Lt&cHw^uZrEC-l0hgIEC~FX+CmoeJ>-H=% zBVYNFuY6#VAFG-K0xVMk>0%X$rI`7)vuw_^$IRRA92n_@r9$mw$As}s z+&-r1nfu*L%_>ErmkISZYo%hrmcXVJwAt>>Q`Kt(;lX6BQs@{S&bmGG%*gLy;(rzz z^pLOUybs=>0A~gZ5cttKKtMu(;O*-k=DMs=&|3&fyydu+#q4AWvqQp_);CmIuw01} zyF!hez)qyrBf&QYzx^lhdWP&4j8Gl1^X^l)k!*^aq0O+}x|<;MDBLz`7wY2kmg;82 z_U}um9;t`?yUwO0qPm2|I;w}U@F%e@d@cN5*o@YrD<~DJEp#jJ%u%Akw5x`HqpKdICH#oAruybc`Fw?mA_r%D{#O%)CHygW&*}qP}tMUG; zSbt+_AJou+jEVrja%G?8(lhU#j7q|$AV5w%V(d?z=dJoC+>h%*9oZ}=`SYmDFTMHt z*6q9!>mrTRMJ%vRIOCVOA*c{yw-m7EjDPFZ#u)84l;R5E5U|K z{W-Ac98gvGS?|EBfxZu?Ud57snAw{7-Sx)&>!FDq`!An;J9Tq+>gL|m?B39=#?tHP zkdqwUR(F%iOIdl99H8u?n(B3<*(^45*(|*XbvKqXbsdHWo1sOSBd%mu%dodlwpb~P zI%Q#Xe|kOCwe*?_G4RubtzF8}*Bf=nvZv#5VUaL-=#u3U9}AskCFT(y^^fv( zZ(-b^EX&xAV0{SjZiWOw_>U+G;e8nieg8nG{)r}b(Zu)Y;_Jll_UOyAclHu@8?k2p zLm?$P;rP}Uj(paUhaGujKN{|pnjuCsdr&0#H0H=DM?T`n$AIdSnsH7YLXqC5BaS@j z$VVM{6sUfwd6-iQip00p9r=tSA9mzxKqaN-Nls0oNa9UjDX*_{oVtu6v8}s~JnqOt zj(iHJxYWGDsT&8V%N});Q?~^a>Dl_kktZDakR#6mmynu^0w+HLl6#VN}j*d+{X4>S>cz6tTqi|9V9HHTxu;I`F7@Y#9tBJ|bf53I;j?!Tu!(;)x= literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97ada7ee86c8d143c5bb94a80651951e3f71e6b1 GIT binary patch literal 9729 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 Oqr%YI_%4DYHSrHP%P@ri literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7d038b3a2de6bcaaa3a979452c62b1a952a55ac GIT binary patch literal 5210 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb6498f0f8e61b22b1eeb9945aeea67e14713d7f GIT binary patch literal 13230 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 Ko}mRg>;C`*%rsg6 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63cd5f2451f8fa1b457ebcc858ead20e0e38e7e4 GIT binary patch literal 10179 zcmbVSdvF`adEdhwfWwm{NRcA=I+3DCNE9eavSi7UZHkl}nG~H^QW_(X5eRpLK;l8~ z9YqrXD<*Mks&PkjClk?Qr=~leF;%N$dF*MFw$sG!OeZt#AD}>&^jV&&jXG2R)1ghZ zj`df+Zx086600=18SL)ue!I7i@A+H&lgHyE@a!7>W^B?=$glCmd~Ain+Fx^oTqZJ+ zxdaJuEVqO#EayW!%Y~4@a%;#6xg}vs+Cz2@`|t@d=?FPkSx7jOu8=F~4!M(_kSFO4 zd09P|s0dX8tu;}V^o4w^&X%Z7)`T{(vOQ6otP9n#vY6PMtPj<*vLoS7HiQ~j*_mie zHiep4*_CKcwuD+(*`1J*TS8k{*^_8ZwuRbQ*_+s!Y!9__#6lE)WYAo6DOWn)hIQi; z>Xa*#fLy7#!GC^zTt;_m)xM(3-yig-Xk|DEiiguSdg3HeYb@? zLFASfh%71fZ}V)@B(!Ie3$%WQFGB%Nw|z5`7*|v%IZveJ@q}_}a!d&bI^Ua`)P??d zRMUmQxT@*mQ)5~@or)xY)H-oap$ZnpB2>kKGn$msi~xtS_ob7`NJ@sHFButC!disJ z6fHb9shvxwkl^I$zP_U;PeRetmrf1GW8*Y}!$U;{QYxwQahgsgm6Qfm&Ui|OQaF*0 znFM3;vG93?s?bLlQjw&hThHT4bQ@K)ahi%+jODV_3MnpsZ8s#BiN-2187XW^u>uM* zmnB)w+%Aqxl7M9>V{2CrO6_XEqT65=F@@?vJT;sSSZFo$p*4`G_(@5+`&@T2rFBQU zPpdG$?qiCkq@;ctm*d_2iaM&L$GXR8dPLEBQ)>KdLg`LU!fLw{@w45={_F|%?Cw_M znzC~&5*>}i6tx>x+Z~RlG=;(ebVrTdRl8;7?076VHmN(+bLojN+W-pkO7N%pAekmN z1?P(c-yfJ2=eEvUKN7aBK`n`5Vm>I)Y-GOE|H z9fzU9>j|j@tQ8b2qTb=OVN zH@h#_5L^xZiTk+ZC8@wA z;!wr~!W0DEk&@Fi<23T1_Plo2a`^CFPWlWFnd06>3woYS7&mSY{MH_aWB?fNGHleD zTHFFycsV7s;{(&@%*FkLyUcOqrOg7FwEPv1%t~8fdm9SMEOT;zMEtcReT}Z@J zNx*Cm-(QVLM7i2II0bb{ZX(zs08HtJ++ZS&9N-GNo4o3XAE$iB40D0eD}yAsxY&AL>v zFYnry6ZU=eh0APZAG)hmb^-SYSD_aYL2QE zrO>RAZCCAY<5|N4y0$2Zn%k%Yz2G%VrM#qvPl7yYm1fIULK``pnaF0gNkcoso)NTy z_dK#=6l957o&in$12SQ1Yv<5iZl}(L!E%AQ9@En4gsOYSMq}Y3^JUy+f*NEJiK3EF z&MOJssnKy&Q?)d>A(qdO+de~&HQ)k*^aNOEJ5|OKk*K0O!>FNwwZmcE9!sRpf}EfY zM|pt?1?+@IbsoN@+Y4f)yN)xyXyJLU*wO{pqBo5uIsQs~e`Fk&aZ+;+Ou`4I;`pr#O z?H3>|-c=iM*Ufd^aBaJ~XL-jXi#r~<9=oyQ=*QJ{E23xB1r&ExG<8=V>1`(;v~M}$ zj7V@_5zaytc<^Oo54`@>o^P#P9kbs;Ceh7P_CwWZN||I zJ64=g84uD^K;8#GRfPoftfzCKA@6x;`q)kHrrF`SC%OZ z7jhNbbK-VLZ+e?vqpwfAGV%I_S1v4^f9JxL3;CAEa?OwDy}dL1N`-H^0!&F8 zV^_t^+WNVzuXnxDm9OoXdE%DKH$6nr4C&Q{8KTK5tW#abaHz-_!~G)^ew*s-CufET z`3|U-DQ?Olb5nddD;5t6j#jnG7GMI)l#psFsn4un(v;O%%(~J2pt5Y>+E`vCvhY(L zMn}cYo{gLwP{v$V$nqs6`_k9J*4qO1%=ZS|HR&w$V|q)GgRHwwGAE?Y z)2RqV8IqQkQ0ZyKnHbDvPN+*7SL3M|yrN%({*a`ODbe_FT#-$hKxVhp+4t1YvBBeg zrw*;p7=Nem3qoYS z!8^b&;6>61oiw>YJqYJn48WM*M^W9f%?D$OM_q1AYm8`?aboGDz6(?_qMpb@yxn76+-(`Gk@x zNeFWUa4bVgo`L~joCuENfX?AWJQ>$?&pJ>|7uc|s#<0d`5OdRQ>iF<*{CS;EsxjS- zL`Hu_)_HtGX+T@U9s}EOF!{qqnub>Vss9DZG+C+iO&`Bqvu%DNU(-E(V#T$2+10t| z>dd>gPxpi0xw(D0u4l2XCttTGC)BKXDyENpY_D6XZpt+Wb4}d~&*iFmW^A|IO|M1g zx4s&m`}RWZf|zsmO!t{E6~83Z+_HOLyzu=Cb5%F&{@2v`y{}F#9JtZ4ccrdj#=TNe zJ^SSBGr5YEi^8qC#u@i*13|G_n^vmpz95{Vb*As8+jnW;;=pVCT;HqWNA4}4b{(ys zgIm0LrAC^spLgYUoXYu57YXP1C3oYO9vI_G0?Fr?+*R@5KJ@nTeSZEQ{MNoUyKX~s z9FMJ26-E5T$yCLIBR)h=E?J`dImAx@X)+xc@Mh8Vx#uZIW@H}mkw3G%)Cl+pk4{gP zSGh?c2JrY_a8uxXz}VITG6QD{Y6TQa0hzG^uHu4zHmJ2hFPm)3^5+Sy0^hi3B1#{Z z%T$PL-v|vVsigwy!XsugVInZr2@((?!V5C#VWC^bGXyS5(WL;yz#dPj8VCtPlOd!N zWss&sIwI>fBTUO!x}<x>t(5&WL8(FbkgI#KXOBjK~-DH+^(^w8)O5d10p)E`3v z^3b#YXN~VRzSq3$dHjv@^XfwHO!QLxVtkID`$pc|GSB6`tvS!*)5jJ)kALi{TB&IM z_tqmhq2*S?7JxBYY%9LH`O~@J@f+>O|HKM_MT;#bGyr1JVnc3iTdAnKWv`gsw`i|l z5xti@7d^A*mc*77SH-0R7Z1#SGw*8535{Q^H4twv_th6p=*J?vAGh=#w0*!iju7Dk zmjLN~?gY%9tQ~~pGEvy&4P4xCaA{+K3mYCTYn-wTE)Z<89WEF|MKrD}WI=JlHHQOQ zT$5IawcY&)Ko`LN%vL9EU4IsTunI-X& z7151;>$2FfD0VDx3wz%=eC69oth- z`};Yz@&*W)3A+N;Rn%@WU*?`{a8Mie5z6{(;7D!Q$6CVQHbT|R!{4y4t*mbmZ!0nD z1N+*wYLjv!9PWXA%Uw5swC{b&=88s$J?41p_Sm6esLvh{p+>V@%17{K&cAxwbU-DWM|RNkS?^;75KDgX)WMi!6-DV<78N=YRG*aKKJ zLs7@T1_q`6Gy@XG(Tl}S6LIaF6dBjjh6ZQksCy77KmY^$OAX5aT0j>Wu+(@$?UJB9 ziX$jedR!YD*BEU<=}2kBILaoJ1X~e37fHnw_BrT*bBITkAiJqCW5|pPFZT-QNydvW z%JWKeTtjdpQ;Y8~8(A5Sj3?m2HJX-TVww6vJ>qdt1mL0A)W9HM1$&KAWf;5!1@4#& z{oL3O%$SDmbf&r^3Tn24fiZD_NZ38I@9Cr8IDPcwsgvQp-tdvrL;ZtCb#LG4rw2># znTB!%8^-`RCCKj1I|G?b<&FJEjUoC2eijGl_K65h!4lYgBt<}y0nr8)=qxQ=_uap2 zeG}B(zvKeyt>`rytyve%^->AHhMo@nAtvZ%(E&(wd*NDM=V1hjkpu0+q#qj{#Wm3H zVkL$R6z>(_w(F0vi~$Utfn@#d5KqTbnaXvh2x_h(9sJFMnIP{a??vybh4-}I;jIqm z9XD}Q&mMlWJKwrzN!*JN`QbO)-rDiTjwLY&Z@KEWH&4Fx>>JM-jk)R_S5GeQ>|5N~ zm*07GNj%0#g75RoyN)mJI-cJ(up|yb-HJN^fy1)9W6|9K_eXcEJbVgZn(Em{-`w-o zp*IdKiEvBXvLtS~jo;|J8oXZfi-w;!EFTzHJTQ>oKDZ>FU_*CY^}XZ2;(w?4N^|bv z!F=Gv62SGww4Qz|^hOA$mfPE(Z!b<}*Zb}7bu5Vo8P)cyeeVoh8CdS>UF_;z5|7*# z8<)i9+hWx$koa#`)XsRBRlQ;{e5QaKA!h`Z;fe#UI||njVci`LKL?m&p~W5!%jqbP zSjQP^RvnL};Q9nET%H?`Lk@B1dHN!r5t?Xk|OkUg&5WxjR3u1CVvhE z6#!H60{Prxv5KoA=c%7QdduGo_uFd%Z*5(5Hd*WD_N@}g7HSrvSL#{untBIoj4|18 zmtmB^UUv6x+(ib9w?Py&CY^;ux8ol$P&AMyjq4c^w2R>s;oNnr27h8vDf)xD4a!K2 zHie?YVXO?pHog2Rm~paRT`rUbiDitgH_6LG_} zYrd~Ocs2syXF)SlbTIVB`-w{btTCX34aR{uN*h;UBpFtXBBvXgr!|H;rfAUCiL@r0dtj_bF-rlsx_)r1Mj<`&04=OCMq>yzaf_@XypOJN%0d z|J=iQ$JS}vs*U41W>2mX$mXkAwotQ%Z)>8!?OOFZxczh5eBVO#{MTOj!!-i0tD7r0 z?*epz?Ao`kk1RfPd=1O1TismsHGY*qc3u2s_0K(PSX^!Paf95oQ`g(BtJgc%vGmalEMatBr`8@Q&~^Q#21`K@c1tse4nO>>7=31kZ=*D$-&x`V5m-T&VNGPYO$ E3)CSzqW}N^ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d6a3efbf8d66e2349c38e9ff6442cea6f371ad5 GIT binary patch literal 7607 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ebab0aab82d54cb9cc7f269231d7cdb5ea2ac12 GIT binary patch literal 4434 zcmbVP-ESMm5x*mkd0eu zm#W1`fFAr{0|gux1*D(_S|E9lApG$Z9`F6z=DGggl0;w~+lJ>^6$0dyGmF8Wa9 zzLZM>E#bZq*cUia;Pm^14+IpuFQ7OMZ~HyVa;X(j?RmuqbE@bBKi16}rmD}0zP~^j z(erE`Ge`QlK^aU(@?~UInPF8Zj6&C~a#^n+PR`%Ce*MP$JXf(uFs@^uqLd-iSkS6V z1?mI|W;IgDd)s=w4}Q2Ed*`9s5SYh>zQkv`8WNX)J1?ldIo0=yFM9>vhN0u9E7XZC zV?x0&&8RF|PlP?b`ZdXxD=eGO-k~s=y@?sFD6_;sMs^m{C1zE#RbrJed%r@B1ruk> zE4Z?p1)Hrc03>Yqe23$duq`)$6IqipTUHC_|XE!?5h>mR*8qqUg?*ak0NGytL0uy22w(Zt0=~)$uaI?M=>#)a~;Ew!pe&owZ$e#gDNchn43~=;%UGcn;gc3Ym}K0w^+ESXQO>|UEGVC}V(U}Y z_qrF~V>8(-TKM5FQ(F=p|ruw-T4=YDh#rA{}bH({cSeqkO(r_f09Pzr!ro zqP}z*-^-gdgwq%qOos&P0IInht<9;Qx#4k?HmALhvPi6Q`|t?AQEJ4Ip#ag~45<^* zkxRh|5gzzXm}9S2)mafr5Eq~wsbm=yH~%;>ceb^=6RhflJFB0=GhtjKFC7ZRs#SS5 zqu5;R%x2NU&1ik(Nb<;ZOz|V3mjG%Y%gM1v@rUtUS!u|M9qYAYV|H@F?jN&LgLZ1P zDfyD;nn@u%xi7@Rk>;onj(5oq*vVnLf5J|UG$k>aZ6;jd2nY{$38(DjkSA#;f830^ zazT*mIU@J<=c?tXdq>y@uQe?I=! z^TD^9aaXMjYWt3;wPT8%JjJ(9UTKD1p#TWQjtKF+uQVpFJfED|k*~f0-$Wlqcja>p z`P`Pc_4c3Md-C2l@;h$EcS5Zs=tw##(0pg&;y~=CIvacp_2NMqWG%oEgf`Hw`B%kK z3ueuWm{JR?r0YahO69nylU%ePsMhLFe`it7_=s_lWmcb z(xwi7OQ#O$Hnl1tUmXUAU-|2^lE65kxeaPm|C}0fq8<6ciMZgZS%7IynB$g526(Vj zM>eQs>QGrh+yYvWG$?v4M$~?I7+^;DVUQ{4oM5erK+XdMxrGJPLyy6H5$Bh*0}N?F z0^!$!O!7|U-4D1P$px8sdt0q+L4C$|B?&$qgnA8f4wTmf(3Qx*Qv>7@pTEMpcX;;` z=p4y3Dwy&DhS#61%Gpn9m3s0h#sKRsNYTGQ2QP+1-*2xzPfS3~oEY3qOg>9Y0>V7H z_3+m3!@rB}#7@76_Q8|lS#+$$-VE&ypKlDG--)R&<-T26ZOH1@xgGi9%haenJh3}G z)fk?#hfZ#+Jzld1$2ZK!rrkHPG4*)L9yqZ(aG^19!A=g?@{@03YO^1v_ftae(1RW~u2r8`yQ(oq*0hRV z#+v3tH152b$?2G;eFjOgH51Y_WaWV!s8M)#IZ@LpXz)zIdYO{T;0D5hfNU^NP2P@uRM%b7T;$*Q_l54_JaUNUzturqp8s>TeH zW?(b8$ZmW%(gHmB+{YaG1-G6@zvsE5-h3^;>mArN@=Flm08D=hUDGd$;@^eHx5C(W z!s&kr=f4#$9{e?fqIh;IwI{$&Qx1u}UtHa!js8=60?_-Zc~Knt;)DMR{MYsI{{WhX B61e~X literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8bf8092870bc443b2c5b5178eef51807c61a87b GIT binary patch literal 3001 zcmai0T}&L;6~6PgJF|a4!Cnmh85bjGtFoK8wOv~=5;8b$Vqpo0D{mEzhMmjqtmkKQ z@2m-HPrw^p?nx+Dh%)CQwE4Q_r2*0o)?> z!k&B1x##|!^PO|&PuXk=L3{ntgX$*X2EQ`>K zj^xT^S>R)mqqvE3BIIQ!>8fQlvec)@(y+QIb+o6f6h3XG;g`Xu=Mq--sa(!42!-6g zxWQyWV2KB&)5H`w`JPP!=##g7*EKz>ATniQYU=(JOHRLg`}V~2G-$GS#va_C`r*uk zad&L`F3V2OOx>S+D-)SO5&uYVijv=z}Av+3htr7NP0mjq*?l|No$=Gw?0hi&_IIy zux{!#7}NbZ;2ghVI(oybJTj{=LMk=;F)pS;`N8N_5!NU*$&nNU$=bFH?SF)vknedvOOA@jzf!~)EXFW5WlMb*lz^3@6q@4 zH~G|2y;v;Humr(DlX#PrP6R{8WPwWX+y5t!HMEH8q54%)=NA9fEWr{jDUf5eB?qyO zk)_nNSbx-8iF*1-in*f|Haq8v`(GtDlaZCc&y|U19QF0CBR=LV_2fHjijjqY7EnQ( zY>6XgD?Kt|I#nMqQ*)Vi#40rK32t42I7JaX9O6-cfZf!65A!%bS!#*j)e8!fEldNJ ztkitFf+X5%Hyb>QD0b#3_nrQ-QF6VYR4Kg+hO~4C2iViciEY`X zaZDctexn5VsN-PFqc%XOz-6$Eh7hvL< zPN@=QDlKuO78?sJeRKiZ${$OO;<14NI2<*AETdgD^DMiX-BI-|Ro~5Y?`F>I_MF}8 zySUpsz-iC*ou1LHp3&XzzBTP<+RsO}yI(0B{SUwZ+C^GA87(Iv{s^h{L!|Q! zqZXr9Kmm_o*rw5Stcm(1X;Bj*eqdDUX+4EOmitl?Pe#>1oYFh zG77rmIn$^hPPV#->CIGBJ#GOzObZ$r1QV8S5D1;oq)>yHL>B;jbFOm3J#jVi$M%BPd_Tq%*J*XlYReNemxBlIDV zW%QS>UWoOxcUIro$qa2}hJJbbled5I_MbDQz25$ndtdeq?(_|B^$o9RyM6s%BT37x zjPGUoce{r^p4qtZ8~1nPe=KZYoB6jSW^-)`h7VNKonOfj9ab-hBnRDOA;VO|@JtsQ z21^-+>sw8S^BKcOry_oq}sThKwK=U_ruxLb%_-a{*xz zc#;%Ae2&6>!1c>q+D44(O%c-XHQn2tl!w~8eWn2PU#=#w@($mMuK)>WulV~ z>&oYu^Iu7z`bL3CZ52V9jINGurw2ci2fxw&SND?gg#GaP*g5I<=ajLl$wEK51{#)h z{A$(qs$`f;Dip!!-QYlAiD03@$3i%thnikItm(yyV;5&lij7WjC;YPP1S9y=2$~ek z;H`@a2!{?Ecy+mEV8izacOF>rQW!pLtp6k{*QS*)Dp3{EsyMg@w}1lmo$%EBN+5(; z@j72Bbo>?0>74N5^HO~?O7&542SlC`Vby6%f*|}A<--5e7ijPcl>Z01@&es>fo{J* zqhD$REBPI5U`rcV|G~C)X*qF_7!vXyT|Pk2weJZD;q1E9M$m0U-KWw4m%^?819s2B Ap8x;= literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c26b8eb756bc3964dd4884c3b427570c73ad34bc GIT binary patch literal 1691 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c28d9709ead95f348bf3974d9db537e846761a8d GIT binary patch literal 3993 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 A*#H0l literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66fc23121e33fb4174cdf76649195e0c341ff5e4 GIT binary patch literal 28931 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74c4b7992353151b66b8f2267061f84be615b558 GIT binary patch literal 9746 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1eb5d99c6ad67640fa74fd8e2d3a280aced25b28 GIT binary patch literal 4744 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdce550b2043377728f4056280a52a55a34e17bd GIT binary patch literal 8974 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/cache.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/cache.py new file mode 100644 index 0000000..3283361 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/cache.py @@ -0,0 +1,225 @@ +import os +import textwrap +from optparse import Values +from typing import Any, List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.exceptions import CommandError, PipError +from pip._internal.utils import filesystem +from pip._internal.utils.logging import getLogger + +logger = getLogger(__name__) + + +class CacheCommand(Command): + """ + Inspect and manage pip's wheel cache. + + Subcommands: + + - dir: Show the cache directory. + - info: Show information about the cache. + - list: List filenames of packages stored in the cache. + - remove: Remove one or more package from the cache. + - purge: Remove all items from the cache. + + ```` can be a glob expression or a package name. + """ + + ignore_require_venv = True + usage = """ + %prog dir + %prog info + %prog list [] [--format=[human, abspath]] + %prog remove + %prog purge + """ + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--format", + action="store", + dest="list_format", + default="human", + choices=("human", "abspath"), + help="Select the output format among: human (default) or abspath", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "dir": self.get_cache_dir, + "info": self.get_cache_info, + "list": self.list_cache_items, + "remove": self.remove_cache_items, + "purge": self.purge_cache, + } + + if not options.cache_dir: + logger.error("pip cache commands can not function since cache is disabled.") + return ERROR + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def get_cache_dir(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + logger.info(options.cache_dir) + + def get_cache_info(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + num_http_files = len(self._find_http_files(options)) + num_packages = len(self._find_wheels(options, "*")) + + http_cache_location = self._cache_dir(options, "http-v2") + old_http_cache_location = self._cache_dir(options, "http") + wheels_cache_location = self._cache_dir(options, "wheels") + http_cache_size = filesystem.format_size( + filesystem.directory_size(http_cache_location) + + filesystem.directory_size(old_http_cache_location) + ) + wheels_cache_size = filesystem.format_directory_size(wheels_cache_location) + + message = ( + textwrap.dedent( + """ + Package index page cache location (pip v23.3+): {http_cache_location} + Package index page cache location (older pips): {old_http_cache_location} + Package index page cache size: {http_cache_size} + Number of HTTP files: {num_http_files} + Locally built wheels location: {wheels_cache_location} + Locally built wheels size: {wheels_cache_size} + Number of locally built wheels: {package_count} + """ # noqa: E501 + ) + .format( + http_cache_location=http_cache_location, + old_http_cache_location=old_http_cache_location, + http_cache_size=http_cache_size, + num_http_files=num_http_files, + wheels_cache_location=wheels_cache_location, + package_count=num_packages, + wheels_cache_size=wheels_cache_size, + ) + .strip() + ) + + logger.info(message) + + def list_cache_items(self, options: Values, args: List[Any]) -> None: + if len(args) > 1: + raise CommandError("Too many arguments") + + if args: + pattern = args[0] + else: + pattern = "*" + + files = self._find_wheels(options, pattern) + if options.list_format == "human": + self.format_for_human(files) + else: + self.format_for_abspath(files) + + def format_for_human(self, files: List[str]) -> None: + if not files: + logger.info("No locally built wheels cached.") + return + + results = [] + for filename in files: + wheel = os.path.basename(filename) + size = filesystem.format_file_size(filename) + results.append(f" - {wheel} ({size})") + logger.info("Cache contents:\n") + logger.info("\n".join(sorted(results))) + + def format_for_abspath(self, files: List[str]) -> None: + if files: + logger.info("\n".join(sorted(files))) + + def remove_cache_items(self, options: Values, args: List[Any]) -> None: + if len(args) > 1: + raise CommandError("Too many arguments") + + if not args: + raise CommandError("Please provide a pattern") + + files = self._find_wheels(options, args[0]) + + no_matching_msg = "No matching packages" + if args[0] == "*": + # Only fetch http files if no specific pattern given + files += self._find_http_files(options) + else: + # Add the pattern to the log message + no_matching_msg += f' for pattern "{args[0]}"' + + if not files: + logger.warning(no_matching_msg) + + for filename in files: + os.unlink(filename) + logger.verbose("Removed %s", filename) + logger.info("Files removed: %s", len(files)) + + def purge_cache(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + return self.remove_cache_items(options, ["*"]) + + def _cache_dir(self, options: Values, subdir: str) -> str: + return os.path.join(options.cache_dir, subdir) + + def _find_http_files(self, options: Values) -> List[str]: + old_http_dir = self._cache_dir(options, "http") + new_http_dir = self._cache_dir(options, "http-v2") + return filesystem.find_files(old_http_dir, "*") + filesystem.find_files( + new_http_dir, "*" + ) + + def _find_wheels(self, options: Values, pattern: str) -> List[str]: + wheel_dir = self._cache_dir(options, "wheels") + + # The wheel filename format, as specified in PEP 427, is: + # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl + # + # Additionally, non-alphanumeric values in the distribution are + # normalized to underscores (_), meaning hyphens can never occur + # before `-{version}`. + # + # Given that information: + # - If the pattern we're given contains a hyphen (-), the user is + # providing at least the version. Thus, we can just append `*.whl` + # to match the rest of it. + # - If the pattern we're given doesn't contain a hyphen (-), the + # user is only providing the name. Thus, we append `-*.whl` to + # match the hyphen before the version, followed by anything else. + # + # PEP 427: https://www.python.org/dev/peps/pep-0427/ + pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl") + + return filesystem.find_files(wheel_dir, pattern) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/check.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/check.py new file mode 100644 index 0000000..5efd0a3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/check.py @@ -0,0 +1,54 @@ +import logging +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.operations.check import ( + check_package_set, + create_package_set_from_installed, + warn_legacy_versions_and_specifiers, +) +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + + usage = """ + %prog [options]""" + + def run(self, options: Values, args: List[str]) -> int: + package_set, parsing_probs = create_package_set_from_installed() + warn_legacy_versions_and_specifiers(package_set) + missing, conflicting = check_package_set(package_set) + + for project_name in missing: + version = package_set[project_name].version + for dependency in missing[project_name]: + write_output( + "%s %s requires %s, which is not installed.", + project_name, + version, + dependency[0], + ) + + for project_name in conflicting: + version = package_set[project_name].version + for dep_name, dep_version, req in conflicting[project_name]: + write_output( + "%s %s has requirement %s, but you have %s %s.", + project_name, + version, + req, + dep_name, + dep_version, + ) + + if missing or conflicting or parsing_probs: + return ERROR + else: + write_output("No broken requirements found.") + return SUCCESS diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/completion.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/completion.py new file mode 100644 index 0000000..9e89e27 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/completion.py @@ -0,0 +1,130 @@ +import sys +import textwrap +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip {shell} completion start{script}# pip {shell} completion end +""" + +COMPLETION_SCRIPTS = { + "bash": """ + _pip_completion() + {{ + COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) ) + }} + complete -o default -F _pip_completion {prog} + """, + "zsh": """ + #compdef -P pip[0-9.]# + __pip() {{ + compadd $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$((CURRENT-1)) \\ + PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ) + }} + if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + __pip "$@" + else + # eval/source/. command, register function for later + compdef __pip -P 'pip[0-9.]#' + fi + """, + "fish": """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c {prog} + """, + "powershell": """ + if ((Test-Path Function:\\TabExpansion) -and -not ` + (Test-Path Function:\\_pip_completeBackup)) {{ + Rename-Item Function:\\TabExpansion _pip_completeBackup + }} + function TabExpansion($line, $lastWord) {{ + $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart() + if ($lastBlock.StartsWith("{prog} ")) {{ + $Env:COMP_WORDS=$lastBlock + $Env:COMP_CWORD=$lastBlock.Split().Length - 1 + $Env:PIP_AUTO_COMPLETE=1 + (& {prog}).Split() + Remove-Item Env:COMP_WORDS + Remove-Item Env:COMP_CWORD + Remove-Item Env:PIP_AUTO_COMPLETE + }} + elseif (Test-Path Function:\\_pip_completeBackup) {{ + # Fall back on existing tab expansion + _pip_completeBackup $line $lastWord + }} + }} + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--bash", + "-b", + action="store_const", + const="bash", + dest="shell", + help="Emit completion code for bash", + ) + self.cmd_opts.add_option( + "--zsh", + "-z", + action="store_const", + const="zsh", + dest="shell", + help="Emit completion code for zsh", + ) + self.cmd_opts.add_option( + "--fish", + "-f", + action="store_const", + const="fish", + dest="shell", + help="Emit completion code for fish", + ) + self.cmd_opts.add_option( + "--powershell", + "-p", + action="store_const", + const="powershell", + dest="shell", + help="Emit completion code for powershell", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ["--" + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog()) + ) + print(BASE_COMPLETION.format(script=script, shell=options.shell)) + return SUCCESS + else: + sys.stderr.write( + "ERROR: You must pass {}\n".format(" or ".join(shell_options)) + ) + return SUCCESS diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..1a1dc6b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py @@ -0,0 +1,280 @@ +import logging +import os +import subprocess +from optparse import Values +from typing import Any, List, Optional + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import ( + Configuration, + Kind, + get_configuration_files, + kinds, +) +from pip._internal.exceptions import PipError +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import get_prog, write_output + +logger = logging.getLogger(__name__) + + +class ConfigurationCommand(Command): + """ + Manage local and global configuration. + + Subcommands: + + - list: List the active configuration (or from the file specified) + - edit: Edit the configuration file in an editor + - get: Get the value associated with command.option + - set: Set the command.option=value + - unset: Unset the value associated with command.option + - debug: List the configuration files and values defined under them + + Configuration keys should be dot separated command and option name, + with the special prefix "global" affecting any command. For example, + "pip config set global.index-url https://example.org/" would configure + the index url for all commands, but "pip config set download.timeout 10" + would configure a 10 second timeout only for "pip download" commands. + + If none of --user, --global and --site are passed, a virtual + environment configuration file is used if one is active and the file + exists. Otherwise, all modifications happen to the user file by + default. + """ + + ignore_require_venv = True + usage = """ + %prog [] list + %prog [] [--editor ] edit + + %prog [] get command.option + %prog [] set command.option value + %prog [] unset command.option + %prog [] debug + """ + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--editor", + dest="editor", + action="store", + default=None, + help=( + "Editor to use to edit the file. Uses VISUAL or EDITOR " + "environment variables if not provided." + ), + ) + + self.cmd_opts.add_option( + "--global", + dest="global_file", + action="store_true", + default=False, + help="Use the system-wide configuration file only", + ) + + self.cmd_opts.add_option( + "--user", + dest="user_file", + action="store_true", + default=False, + help="Use the user configuration file only", + ) + + self.cmd_opts.add_option( + "--site", + dest="site_file", + action="store_true", + default=False, + help="Use the current environment configuration file only", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name, + "debug": self.list_config_values, + } + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]: + file_options = [ + key + for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) + if value + ] + + if not file_options: + if not need_value: + return None + # Default to user, unless there's a site file. + elif any( + os.path.exists(site_config_file) + for site_config_file in get_configuration_files()[kinds.SITE] + ): + return kinds.SITE + else: + return kinds.USER + elif len(file_options) == 1: + return file_options[0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --site, --global) to perform." + ) + + def list_values(self, options: Values, args: List[str]) -> None: + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + write_output("%s=%r", key, value) + + def get_name(self, options: Values, args: List[str]) -> None: + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + write_output("%s", value) + + def set_name_value(self, options: Values, args: List[str]) -> None: + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options: Values, args: List[str]) -> None: + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def list_config_values(self, options: Values, args: List[str]) -> None: + """List config key-value pairs across different config files""" + self._get_n_args(args, "debug", n=0) + + self.print_env_var_values() + # Iterate over config files and print if they exist, and the + # key-value pairs present in them if they do + for variant, files in sorted(self.configuration.iter_config_files()): + write_output("%s:", variant) + for fname in files: + with indent_log(): + file_exists = os.path.exists(fname) + write_output("%s, exists: %r", fname, file_exists) + if file_exists: + self.print_config_file_values(variant) + + def print_config_file_values(self, variant: Kind) -> None: + """Get key-value pairs from the file of a variant""" + for name, value in self.configuration.get_values_in_config(variant).items(): + with indent_log(): + write_output("%s: %s", name, value) + + def print_env_var_values(self) -> None: + """Get key-values pairs present as environment variables""" + write_output("%s:", "env_var") + with indent_log(): + for key, value in sorted(self.configuration.get_environ_vars()): + env_var = f"PIP_{key.upper()}" + write_output("%s=%r", env_var, value) + + def open_in_editor(self, options: Values, args: List[str]) -> None: + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + elif '"' in fname: + # This shouldn't happen, unless we see a username like that. + # If that happens, we'd appreciate a pull request fixing this. + raise PipError( + f'Can not open an editor for a file name containing "\n{fname}' + ) + + try: + subprocess.check_call(f'{editor} "{fname}"', shell=True) + except FileNotFoundError as e: + if not e.filename: + e.filename = editor + raise + except subprocess.CalledProcessError as e: + raise PipError(f"Editor Subprocess exited with exit code {e.returncode}") + + def _get_n_args(self, args: List[str], example: str, n: int) -> Any: + """Helper to make sure the command got the right number of arguments""" + if len(args) != n: + msg = ( + f"Got unexpected number of arguments, expected {n}. " + f'(example: "{get_prog()} config {example}")' + ) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self) -> None: + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.exception( + "Unable to save configuration. Please report this as a bug." + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options: Values) -> str: + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/debug.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/debug.py new file mode 100644 index 0000000..7e5271c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/debug.py @@ -0,0 +1,201 @@ +import importlib.resources +import locale +import logging +import os +import sys +from optparse import Values +from types import ModuleType +from typing import Any, Dict, List, Optional + +import pip._vendor +from pip._vendor.certifi import where +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.configuration import Configuration +from pip._internal.metadata import get_environment +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import get_pip_version + +logger = logging.getLogger(__name__) + + +def show_value(name: str, value: Any) -> None: + logger.info("%s: %s", name, value) + + +def show_sys_implementation() -> None: + logger.info("sys.implementation:") + implementation_name = sys.implementation.name + with indent_log(): + show_value("name", implementation_name) + + +def create_vendor_txt_map() -> Dict[str, str]: + with importlib.resources.open_text("pip._vendor", "vendor.txt") as f: + # Purge non version specifying lines. + # Also, remove any space prefix or suffixes (including comments). + lines = [ + line.strip().split(" ", 1)[0] for line in f.readlines() if "==" in line + ] + + # Transform into "module" -> version dict. + return dict(line.split("==", 1) for line in lines) + + +def get_module_from_module_name(module_name: str) -> Optional[ModuleType]: + # Module name can be uppercase in vendor.txt for some reason... + module_name = module_name.lower().replace("-", "_") + # PATCH: setuptools is actually only pkg_resources. + if module_name == "setuptools": + module_name = "pkg_resources" + + try: + __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0) + return getattr(pip._vendor, module_name) + except ImportError: + # We allow 'truststore' to fail to import due + # to being unavailable on Python 3.9 and earlier. + if module_name == "truststore" and sys.version_info < (3, 10): + return None + raise + + +def get_vendor_version_from_module(module_name: str) -> Optional[str]: + module = get_module_from_module_name(module_name) + version = getattr(module, "__version__", None) + + if module and not version: + # Try to find version in debundled module info. + assert module.__file__ is not None + env = get_environment([os.path.dirname(module.__file__)]) + dist = env.get_distribution(module_name) + if dist: + version = str(dist.version) + + return version + + +def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None: + """Log the actual version and print extra info if there is + a conflict or if the actual version could not be imported. + """ + for module_name, expected_version in vendor_txt_versions.items(): + extra_message = "" + actual_version = get_vendor_version_from_module(module_name) + if not actual_version: + extra_message = ( + " (Unable to locate actual module version, using" + " vendor.txt specified version)" + ) + actual_version = expected_version + elif parse_version(actual_version) != parse_version(expected_version): + extra_message = ( + " (CONFLICT: vendor.txt suggests version should" + f" be {expected_version})" + ) + logger.info("%s==%s%s", module_name, actual_version, extra_message) + + +def show_vendor_versions() -> None: + logger.info("vendored library versions:") + + vendor_txt_versions = create_vendor_txt_map() + with indent_log(): + show_actual_vendor_versions(vendor_txt_versions) + + +def show_tags(options: Values) -> None: + tag_limit = 10 + + target_python = make_target_python(options) + tags = target_python.get_sorted_tags() + + # Display the target options that were explicitly provided. + formatted_target = target_python.format_given() + suffix = "" + if formatted_target: + suffix = f" (target: {formatted_target})" + + msg = f"Compatible tags: {len(tags)}{suffix}" + logger.info(msg) + + if options.verbose < 1 and len(tags) > tag_limit: + tags_limited = True + tags = tags[:tag_limit] + else: + tags_limited = False + + with indent_log(): + for tag in tags: + logger.info(str(tag)) + + if tags_limited: + msg = f"...\n[First {tag_limit} tags shown. Pass --verbose to show all.]" + logger.info(msg) + + +def ca_bundle_info(config: Configuration) -> str: + levels = {key.split(".", 1)[0] for key, _ in config.items()} + if not levels: + return "Not specified" + + levels_that_override_global = ["install", "wheel", "download"] + global_overriding_level = [ + level for level in levels if level in levels_that_override_global + ] + if not global_overriding_level: + return "global" + + if "global" in levels: + levels.remove("global") + return ", ".join(levels) + + +class DebugCommand(Command): + """ + Display debug information. + """ + + usage = """ + %prog """ + ignore_require_venv = True + + def add_options(self) -> None: + cmdoptions.add_target_python_options(self.cmd_opts) + self.parser.insert_option_group(0, self.cmd_opts) + self.parser.config.load() + + def run(self, options: Values, args: List[str]) -> int: + logger.warning( + "This command is only meant for debugging. " + "Do not use this with automation for parsing and getting these " + "details, since the output and options of this command may " + "change without notice." + ) + show_value("pip version", get_pip_version()) + show_value("sys.version", sys.version) + show_value("sys.executable", sys.executable) + show_value("sys.getdefaultencoding", sys.getdefaultencoding()) + show_value("sys.getfilesystemencoding", sys.getfilesystemencoding()) + show_value( + "locale.getpreferredencoding", + locale.getpreferredencoding(), + ) + show_value("sys.platform", sys.platform) + show_sys_implementation() + + show_value("'cert' config value", ca_bundle_info(self.parser.config)) + show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE")) + show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE")) + show_value("pip._vendor.certifi.where()", where()) + show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED) + + show_vendor_versions() + + show_tags(options) + + return SUCCESS diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/download.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..54247a7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,147 @@ +import logging +import os +from optparse import Values +from typing import List + +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import RequirementCommand, with_cleanup +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.operations.build.build_tracker import get_build_tracker +from pip._internal.req.req_install import check_legacy_setup_py_options +from pip._internal.utils.misc import ensure_dir, normalize_path, write_output +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.global_options()) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.src()) + self.cmd_opts.add_option(cmdoptions.pre()) + self.cmd_opts.add_option(cmdoptions.require_hashes()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + + self.cmd_opts.add_option( + "-d", + "--dest", + "--destination-dir", + "--destination-directory", + dest="download_dir", + metavar="dir", + default=os.curdir, + help="Download packages into .", + ) + + cmdoptions.add_target_python_options(self.cmd_opts) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + cmdoptions.check_dist_restriction(options) + + options.download_dir = normalize_path(options.download_dir) + ensure_dir(options.download_dir) + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + + build_tracker = self.enter_context(get_build_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="download", + globally_managed=True, + ) + + reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options(options, reqs) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + build_tracker=build_tracker, + session=session, + finder=finder, + download_dir=options.download_dir, + use_user_site=False, + verbosity=self.verbosity, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, + py_version_info=options.python_version, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve(reqs, check_supported_wheels=True) + + downloaded: List[str] = [] + for req in requirement_set.requirements.values(): + if req.satisfied_by is None: + assert req.name is not None + preparer.save_linked_requirement(req) + downloaded.append(req.name) + + preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) + requirement_set.warn_legacy_versions_and_specifiers() + + if downloaded: + write_output("Successfully downloaded %s", " ".join(downloaded)) + + return SUCCESS diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..e64cb3d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,109 @@ +import sys +from optparse import Values +from typing import AbstractSet, List + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + + +def _should_suppress_build_backends() -> bool: + return sys.version_info < (3, 12) + + +def _dev_pkgs() -> AbstractSet[str]: + pkgs = {"pip"} + + if _should_suppress_build_backends(): + pkgs |= {"setuptools", "distribute", "wheel"} + pkgs |= {"setuptools", "distribute", "wheel", "pkg-resources"} + + return pkgs + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + + usage = """ + %prog [options]""" + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help=( + "Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times." + ), + ) + self.cmd_opts.add_option( + "-l", + "--local", + dest="local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not output " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + "--all", + dest="freeze_all", + action="store_true", + help=( + "Do not skip these packages in the output:" + " {}".format(", ".join(_dev_pkgs())) + ), + ) + self.cmd_opts.add_option( + "--exclude-editable", + dest="exclude_editable", + action="store_true", + help="Exclude editable package from output.", + ) + self.cmd_opts.add_option(cmdoptions.list_exclude()) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(_dev_pkgs()) + + if options.excludes: + skip.update(options.excludes) + + cmdoptions.check_list_path_option(options) + + for line in freeze( + requirement=options.requirements, + local_only=options.local, + user_only=options.user, + paths=options.path, + isolated=options.isolated_mode, + skip=skip, + exclude_editable=options.exclude_editable, + ): + sys.stdout.write(line + "\n") + return SUCCESS diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/hash.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 0000000..042dac8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,59 @@ +import hashlib +import logging +import sys +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks, write_output + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + """ + + usage = "%prog [options] ..." + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-a", + "--algorithm", + dest="algorithm", + choices=STRONG_HASHES, + action="store", + default=FAVORITE_HASH, + help="The hash algorithm to use: one of {}".format( + ", ".join(STRONG_HASHES) + ), + ) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + write_output( + "%s:\n--hash=%s:%s", path, algorithm, _hash_of_file(path, algorithm) + ) + return SUCCESS + + +def _hash_of_file(path: str, algorithm: str) -> str: + """Return the hash digest of a file.""" + with open(path, "rb") as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/help.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..6206631 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,41 @@ +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + + usage = """ + %prog """ + ignore_require_venv = True + + def run(self, options: Values, args: List[str]) -> int: + from pip._internal.commands import ( + commands_dict, + create_command, + get_similar_commands, + ) + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = [f'unknown command "{cmd_name}"'] + if guess: + msg.append(f'maybe you meant "{guess}"') + + raise CommandError(" - ".join(msg)) + + command = create_command(cmd_name) + command.parser.print_help() + + return SUCCESS diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/index.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/index.py new file mode 100644 index 0000000..f55e9e4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/index.py @@ -0,0 +1,139 @@ +import logging +from optparse import Values +from typing import Any, Iterable, List, Optional, Union + +from pip._vendor.packaging.version import LegacyVersion, Version + +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.commands.search import print_dist_installation_info +from pip._internal.exceptions import CommandError, DistributionNotFound, PipError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.network.session import PipSession +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class IndexCommand(IndexGroupCommand): + """ + Inspect information available from package indexes. + """ + + ignore_require_venv = True + usage = """ + %prog versions + """ + + def add_options(self) -> None: + cmdoptions.add_target_python_options(self.cmd_opts) + + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.pre()) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "versions": self.get_available_package_versions, + } + + logger.warning( + "pip index is currently an experimental command. " + "It may be removed/changed in a future release " + "without prior warning." + ) + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _build_package_finder( + self, + options: Values, + session: PipSession, + target_python: Optional[TargetPython] = None, + ignore_requires_python: Optional[bool] = None, + ) -> PackageFinder: + """ + Create a package finder appropriate to the index command. + """ + link_collector = LinkCollector.create(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + ) + + def get_available_package_versions(self, options: Values, args: List[Any]) -> None: + if len(args) != 1: + raise CommandError("You need to specify exactly one argument") + + target_python = cmdoptions.make_target_python(options) + query = args[0] + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + + versions: Iterable[Union[LegacyVersion, Version]] = ( + candidate.version for candidate in finder.find_all_candidates(query) + ) + + if not options.pre: + # Remove prereleases + versions = ( + version for version in versions if not version.is_prerelease + ) + versions = set(versions) + + if not versions: + raise DistributionNotFound( + f"No matching distribution found for {query}" + ) + + formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)] + latest = formatted_versions[0] + + write_output(f"{query} ({latest})") + write_output("Available versions: {}".format(", ".join(formatted_versions))) + print_dist_installation_info(query, latest) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py new file mode 100644 index 0000000..27c8fa3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py @@ -0,0 +1,92 @@ +import logging +from optparse import Values +from typing import Any, Dict, List + +from pip._vendor.packaging.markers import default_environment +from pip._vendor.rich import print_json + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.metadata import BaseDistribution, get_environment +from pip._internal.utils.compat import stdlib_pkgs +from pip._internal.utils.urls import path_to_url + +logger = logging.getLogger(__name__) + + +class InspectCommand(Command): + """ + Inspect the content of a Python environment and produce a report in JSON format. + """ + + ignore_require_venv = True + usage = """ + %prog [options]""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not list " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + cmdoptions.check_list_path_option(options) + dists = get_environment(options.path).iter_installed_distributions( + local_only=options.local, + user_only=options.user, + skip=set(stdlib_pkgs), + ) + output = { + "version": "1", + "pip_version": __version__, + "installed": [self._dist_to_dict(dist) for dist in dists], + "environment": default_environment(), + # TODO tags? scheme? + } + print_json(data=output) + return SUCCESS + + def _dist_to_dict(self, dist: BaseDistribution) -> Dict[str, Any]: + res: Dict[str, Any] = { + "metadata": dist.metadata_dict, + "metadata_location": dist.info_location, + } + # direct_url. Note that we don't have download_info (as in the installation + # report) since it is not recorded in installed metadata. + direct_url = dist.direct_url + if direct_url is not None: + res["direct_url"] = direct_url.to_dict() + else: + # Emulate direct_url for legacy editable installs. + editable_project_location = dist.editable_project_location + if editable_project_location is not None: + res["direct_url"] = { + "url": path_to_url(editable_project_location), + "dir_info": { + "editable": True, + }, + } + # installer + installer = dist.installer + if dist.installer: + res["installer"] = installer + # requested + if dist.installed_with_dist_info: + res["requested"] = dist.requested + return res diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/install.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/install.py new file mode 100644 index 0000000..e944bb9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,774 @@ +import errno +import json +import operator +import os +import shutil +import site +from optparse import SUPPRESS_HELP, Values +from typing import List, Optional + +from pip._vendor.rich import print_json + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import ( + RequirementCommand, + warn_if_run_as_root, + with_cleanup, +) +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import get_scheme +from pip._internal.metadata import get_environment +from pip._internal.models.installation_report import InstallationReport +from pip._internal.operations.build.build_tracker import get_build_tracker +from pip._internal.operations.check import ConflictDetails, check_install_conflicts +from pip._internal.req import install_given_reqs +from pip._internal.req.req_install import ( + InstallRequirement, + check_legacy_setup_py_options, +) +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.filesystem import test_writable_dir +from pip._internal.utils.logging import getLogger +from pip._internal.utils.misc import ( + check_externally_managed, + ensure_dir, + get_pip_version, + protect_pip_from_modification_on_windows, + write_output, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.virtualenv import ( + running_under_virtualenv, + virtualenv_no_global, +) +from pip._internal.wheel_builder import build, should_build_for_install_command + +logger = getLogger(__name__) + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.pre()) + + self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option( + "--dry-run", + action="store_true", + dest="dry_run", + default=False, + help=( + "Don't actually install anything, just print what would be. " + "Can be used in combination with --ignore-installed " + "to 'resolve' the requirements." + ), + ) + self.cmd_opts.add_option( + "-t", + "--target", + dest="target_dir", + metavar="dir", + default=None, + help=( + "Install packages into . " + "By default this will not replace existing files/folders in " + ". Use --upgrade to replace existing packages in " + "with new versions." + ), + ) + cmdoptions.add_target_python_options(self.cmd_opts) + + self.cmd_opts.add_option( + "--user", + dest="use_user_site", + action="store_true", + help=( + "Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)" + ), + ) + self.cmd_opts.add_option( + "--no-user", + dest="use_user_site", + action="store_false", + help=SUPPRESS_HELP, + ) + self.cmd_opts.add_option( + "--root", + dest="root_path", + metavar="dir", + default=None, + help="Install everything relative to this alternate root directory.", + ) + self.cmd_opts.add_option( + "--prefix", + dest="prefix_path", + metavar="dir", + default=None, + help=( + "Installation prefix where lib, bin and other top-level " + "folders are placed. Note that the resulting installation may " + "contain scripts and other resources which reference the " + "Python interpreter of pip, and not that of ``--prefix``. " + "See also the ``--python`` option if the intention is to " + "install packages into another (possibly pip-free) " + "environment." + ), + ) + + self.cmd_opts.add_option(cmdoptions.src()) + + self.cmd_opts.add_option( + "-U", + "--upgrade", + dest="upgrade", + action="store_true", + help=( + "Upgrade all specified packages to the newest available " + "version. The handling of dependencies depends on the " + "upgrade-strategy used." + ), + ) + + self.cmd_opts.add_option( + "--upgrade-strategy", + dest="upgrade_strategy", + default="only-if-needed", + choices=["only-if-needed", "eager"], + help=( + "Determines how dependency upgrading should be handled " + "[default: %default]. " + '"eager" - dependencies are upgraded regardless of ' + "whether the currently installed version satisfies the " + "requirements of the upgraded package(s). " + '"only-if-needed" - are upgraded only when they do not ' + "satisfy the requirements of the upgraded package(s)." + ), + ) + + self.cmd_opts.add_option( + "--force-reinstall", + dest="force_reinstall", + action="store_true", + help="Reinstall all packages even if they are already up-to-date.", + ) + + self.cmd_opts.add_option( + "-I", + "--ignore-installed", + dest="ignore_installed", + action="store_true", + help=( + "Ignore the installed packages, overwriting them. " + "This can break your system if the existing package " + "is of a different version or was installed " + "with a different package manager!" + ), + ) + + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) + self.cmd_opts.add_option(cmdoptions.override_externally_managed()) + + self.cmd_opts.add_option(cmdoptions.config_settings()) + self.cmd_opts.add_option(cmdoptions.global_options()) + + self.cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + self.cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + self.cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + self.cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.require_hashes()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + self.cmd_opts.add_option(cmdoptions.root_user_action()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + self.cmd_opts.add_option( + "--report", + dest="json_report_file", + metavar="file", + default=None, + help=( + "Generate a JSON file describing what pip did to install " + "the provided requirements. " + "Can be used in combination with --dry-run and --ignore-installed " + "to 'resolve' the requirements. " + "When - is used as file name it writes to stdout. " + "When writing to stdout, please combine with the --quiet option " + "to avoid mixing pip logging output with JSON output." + ), + ) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + if options.use_user_site and options.target_dir is not None: + raise CommandError("Can not combine '--user' and '--target'") + + # Check whether the environment we're installing into is externally + # managed, as specified in PEP 668. Specifying --root, --target, or + # --prefix disables the check, since there's no reliable way to locate + # the EXTERNALLY-MANAGED file for those cases. An exception is also + # made specifically for "--dry-run --report" for convenience. + installing_into_current_environment = ( + not (options.dry_run and options.json_report_file) + and options.root_path is None + and options.target_dir is None + and options.prefix_path is None + ) + if ( + installing_into_current_environment + and not options.override_externally_managed + ): + check_externally_managed() + + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + cmdoptions.check_dist_restriction(options, check_target=True) + + logger.verbose("Using %s", get_pip_version()) + options.use_user_site = decide_user_install( + options.use_user_site, + prefix_path=options.prefix_path, + target_dir=options.target_dir, + root_path=options.root_path, + isolated_mode=options.isolated_mode, + ) + + target_temp_dir: Optional[TempDirectory] = None + target_temp_dir_path: Optional[str] = None + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if ( + # fmt: off + os.path.exists(options.target_dir) and + not os.path.isdir(options.target_dir) + # fmt: on + ): + raise CommandError( + "Target path exists but is not a directory, will not continue." + ) + + # Create a target directory for using with the target option + target_temp_dir = TempDirectory(kind="target") + target_temp_dir_path = target_temp_dir.path + self.enter_context(target_temp_dir) + + global_options = options.global_options or [] + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + build_tracker = self.enter_context(get_build_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="install", + globally_managed=True, + ) + + try: + reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options(options, reqs) + + wheel_cache = WheelCache(options.cache_dir) + + # Only when installing is it permitted to use PEP 660. + # In other circumstances (pip wheel, pip download) we generate + # regular (i.e. non editable) metadata and wheels. + for req in reqs: + req.permit_editable_wheels = True + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + build_tracker=build_tracker, + session=session, + finder=finder, + use_user_site=options.use_user_site, + verbosity=self.verbosity, + ) + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + ignore_installed=options.ignore_installed, + ignore_requires_python=options.ignore_requires_python, + force_reinstall=options.force_reinstall, + upgrade_strategy=upgrade_strategy, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve( + reqs, check_supported_wheels=not options.target_dir + ) + + if options.json_report_file: + report = InstallationReport(requirement_set.requirements_to_install) + if options.json_report_file == "-": + print_json(data=report.to_dict()) + else: + with open(options.json_report_file, "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + if options.dry_run: + # In non dry-run mode, the legacy versions and specifiers check + # will be done as part of conflict detection. + requirement_set.warn_legacy_versions_and_specifiers() + would_install_items = sorted( + (r.metadata["name"], r.metadata["version"]) + for r in requirement_set.requirements_to_install + ) + if would_install_items: + write_output( + "Would install %s", + " ".join("-".join(item) for item in would_install_items), + ) + return SUCCESS + + try: + pip_req = requirement_set.get_requirement("pip") + except KeyError: + modifying_pip = False + else: + # If we're not replacing an already installed pip, + # we're not modifying it. + modifying_pip = pip_req.satisfied_by is None + protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) + + reqs_to_build = [ + r + for r in requirement_set.requirements.values() + if should_build_for_install_command(r) + ] + + _, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + verify=True, + build_options=[], + global_options=global_options, + ) + + if build_failures: + raise InstallationError( + "Could not build wheels for {}, which is required to " + "install pyproject.toml-based projects".format( + ", ".join(r.name for r in build_failures) # type: ignore + ) + ) + + to_install = resolver.get_installation_order(requirement_set) + + # Check for conflicts in the package set we're installing. + conflicts: Optional[ConflictDetails] = None + should_warn_about_conflicts = ( + not options.ignore_dependencies and options.warn_about_conflicts + ) + if should_warn_about_conflicts: + conflicts = self._determine_conflicts(to_install) + + # Don't warn about script install locations if + # --target or --prefix has been specified + warn_script_location = options.warn_script_location + if options.target_dir or options.prefix_path: + warn_script_location = False + + installed = install_given_reqs( + to_install, + global_options, + root=options.root_path, + home=target_temp_dir_path, + prefix=options.prefix_path, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + pycompile=options.compile, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir_path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + env = get_environment(lib_locations) + + installed.sort(key=operator.attrgetter("name")) + items = [] + for result in installed: + item = result.name + try: + installed_dist = env.get_distribution(item) + if installed_dist is not None: + item = f"{item}-{installed_dist.version}" + except Exception: + pass + items.append(item) + + if conflicts is not None: + self._warn_about_conflicts( + conflicts, + resolver_variant=self.determine_resolver_variant(options), + ) + + installed_desc = " ".join(items) + if installed_desc: + write_output( + "Successfully installed %s", + installed_desc, + ) + except OSError as error: + show_traceback = self.verbosity >= 1 + + message = create_os_error_message( + error, + show_traceback, + options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + + if options.target_dir: + assert target_temp_dir + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + if options.root_user_action == "warn": + warn_if_run_as_root() + return SUCCESS + + def _handle_target_dir( + self, target_dir: str, target_temp_dir: TempDirectory, upgrade: bool + ) -> None: + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = get_scheme("", home=target_temp_dir.path) + purelib_dir = scheme.purelib + platlib_dir = scheme.platlib + data_dir = scheme.data + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + "Target directory %s already exists. Specify " + "--upgrade to force replacement.", + target_item_dir, + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + "Target directory %s already exists and is " + "a link. pip will not automatically replace " + "links, please remove if replacement is " + "desired.", + target_item_dir, + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move(os.path.join(lib_dir, item), target_item_dir) + + def _determine_conflicts( + self, to_install: List[InstallRequirement] + ) -> Optional[ConflictDetails]: + try: + return check_install_conflicts(to_install) + except Exception: + logger.exception( + "Error while checking for conflicts. Please file an issue on " + "pip's issue tracker: https://github.com/pypa/pip/issues/new" + ) + return None + + def _warn_about_conflicts( + self, conflict_details: ConflictDetails, resolver_variant: str + ) -> None: + package_set, (missing, conflicting) = conflict_details + if not missing and not conflicting: + return + + parts: List[str] = [] + if resolver_variant == "legacy": + parts.append( + "pip's legacy dependency resolver does not consider dependency " + "conflicts when selecting packages. This behaviour is the " + "source of the following dependency conflicts." + ) + else: + assert resolver_variant == "resolvelib" + parts.append( + "pip's dependency resolver does not currently take into account " + "all the packages that are installed. This behaviour is the " + "source of the following dependency conflicts." + ) + + # NOTE: There is some duplication here, with commands/check.py + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + message = ( + f"{project_name} {version} requires {dependency[1]}, " + "which is not installed." + ) + parts.append(message) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + message = ( + "{name} {version} requires {requirement}, but {you} have " + "{dep_name} {dep_version} which is incompatible." + ).format( + name=project_name, + version=version, + requirement=req, + dep_name=dep_name, + dep_version=dep_version, + you=("you" if resolver_variant == "resolvelib" else "you'll"), + ) + parts.append(message) + + logger.critical("\n".join(parts)) + + +def get_lib_location_guesses( + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> List[str]: + scheme = get_scheme( + "", + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + return [scheme.purelib, scheme.platlib] + + +def site_packages_writable(root: Optional[str], isolated: bool) -> bool: + return all( + test_writable_dir(d) + for d in set(get_lib_location_guesses(root=root, isolated=isolated)) + ) + + +def decide_user_install( + use_user_site: Optional[bool], + prefix_path: Optional[str] = None, + target_dir: Optional[str] = None, + root_path: Optional[str] = None, + isolated_mode: bool = False, +) -> bool: + """Determine whether to do a user install based on the input options. + + If use_user_site is False, no additional checks are done. + If use_user_site is True, it is checked for compatibility with other + options. + If use_user_site is None, the default behaviour depends on the environment, + which is provided by the other arguments. + """ + # In some cases (config from tox), use_user_site can be set to an integer + # rather than a bool, which 'use_user_site is False' wouldn't catch. + if (use_user_site is not None) and (not use_user_site): + logger.debug("Non-user install by explicit request") + return False + + if use_user_site: + if prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + logger.debug("User install by explicit request") + return True + + # If we are here, user installs have not been explicitly requested/avoided + assert use_user_site is None + + # user install incompatible with --prefix/--target + if prefix_path or target_dir: + logger.debug("Non-user install due to --prefix or --target option") + return False + + # If user installs are not enabled, choose a non-user install + if not site.ENABLE_USER_SITE: + logger.debug("Non-user install because user site-packages disabled") + return False + + # If we have permission for a non-user install, do that, + # otherwise do a user install. + if site_packages_writable(root=root_path, isolated=isolated_mode): + logger.debug("Non-user install because site-packages writeable") + return False + + logger.info( + "Defaulting to user installation because normal site-packages " + "is not writeable" + ) + return True + + +def create_os_error_message( + error: OSError, show_traceback: bool, using_user_site: bool +) -> str: + """Format an error message for an OSError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an OSError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not running_under_virtualenv() and not using_user_site: + parts.extend( + [ + user_option_part, + " or ", + permissions_part.lower(), + ] + ) + else: + parts.append(permissions_part) + parts.append(".\n") + + # Suggest the user to enable Long Paths if path length is + # more than 260 + if ( + WINDOWS + and error.errno == errno.ENOENT + and error.filename + and len(error.filename) > 260 + ): + parts.append( + "HINT: This error might have occurred since " + "this system does not have Windows Long Path " + "support enabled. You can find information on " + "how to enable this at " + "https://pip.pypa.io/warnings/enable-long-paths\n" + ) + + return "".join(parts).strip() + "\n" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/list.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..32fb19b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,370 @@ +import json +import logging +from optparse import Values +from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution, get_environment +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.network.session import PipSession +from pip._internal.utils.compat import stdlib_pkgs +from pip._internal.utils.misc import tabulate, write_output + +if TYPE_CHECKING: + from pip._internal.metadata.base import DistributionVersion + + class _DistWithLatestInfo(BaseDistribution): + """Give the distribution object a couple of extra fields. + + These will be populated during ``get_outdated()``. This is dirty but + makes the rest of the code much cleaner. + """ + + latest_version: DistributionVersion + latest_filetype: str + + _ProcessedDists = Sequence[_DistWithLatestInfo] + + +from pip._vendor.packaging.version import parse + +logger = logging.getLogger(__name__) + + +class ListCommand(IndexGroupCommand): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + + ignore_require_venv = True + usage = """ + %prog [options]""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-o", + "--outdated", + action="store_true", + default=False, + help="List outdated packages", + ) + self.cmd_opts.add_option( + "-u", + "--uptodate", + action="store_true", + default=False, + help="List uptodate packages", + ) + self.cmd_opts.add_option( + "-e", + "--editable", + action="store_true", + default=False, + help="List editable projects.", + ) + self.cmd_opts.add_option( + "-l", + "--local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not list " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + "--pre", + action="store_true", + default=False, + help=( + "Include pre-release and development versions. By default, " + "pip only finds stable versions." + ), + ) + + self.cmd_opts.add_option( + "--format", + action="store", + dest="list_format", + default="columns", + choices=("columns", "freeze", "json"), + help=( + "Select the output format among: columns (default), freeze, or json. " + "The 'freeze' format cannot be used with the --outdated option." + ), + ) + + self.cmd_opts.add_option( + "--not-required", + action="store_true", + dest="not_required", + help="List packages that are not dependencies of installed packages.", + ) + + self.cmd_opts.add_option( + "--exclude-editable", + action="store_false", + dest="include_editable", + help="Exclude editable package from output.", + ) + self.cmd_opts.add_option( + "--include-editable", + action="store_true", + dest="include_editable", + help="Include editable package from output.", + default=True, + ) + self.cmd_opts.add_option(cmdoptions.list_exclude()) + index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + def _build_package_finder( + self, options: Values, session: PipSession + ) -> PackageFinder: + """ + Create a package finder appropriate to this list command. + """ + link_collector = LinkCollector.create(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + + def run(self, options: Values, args: List[str]) -> int: + if options.outdated and options.uptodate: + raise CommandError("Options --outdated and --uptodate cannot be combined.") + + if options.outdated and options.list_format == "freeze": + raise CommandError( + "List format 'freeze' cannot be used with the --outdated option." + ) + + cmdoptions.check_list_path_option(options) + + skip = set(stdlib_pkgs) + if options.excludes: + skip.update(canonicalize_name(n) for n in options.excludes) + + packages: "_ProcessedDists" = [ + cast("_DistWithLatestInfo", d) + for d in get_environment(options.path).iter_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + skip=skip, + ) + ] + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + self.output_package_listing(packages, options) + return SUCCESS + + def get_outdated( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + return [ + dist + for dist in self.iter_packages_latest_infos(packages, options) + if parse(str(dist.latest_version)) > parse(str(dist.version)) + ] + + def get_uptodate( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + return [ + dist + for dist in self.iter_packages_latest_infos(packages, options) + if parse(str(dist.latest_version)) == parse(str(dist.version)) + ] + + def get_not_required( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + dep_keys = { + canonicalize_name(dep.name) + for dist in packages + for dep in (dist.iter_dependencies() or ()) + } + + # Create a set to remove duplicate packages, and cast it to a list + # to keep the return type consistent with get_outdated and + # get_uptodate + return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys}) + + def iter_packages_latest_infos( + self, packages: "_ProcessedDists", options: Values + ) -> Generator["_DistWithLatestInfo", None, None]: + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + + def latest_info( + dist: "_DistWithLatestInfo", + ) -> Optional["_DistWithLatestInfo"]: + all_candidates = finder.find_all_candidates(dist.canonical_name) + if not options.pre: + # Remove prereleases + all_candidates = [ + candidate + for candidate in all_candidates + if not candidate.version.is_prerelease + ] + + evaluator = finder.make_candidate_evaluator( + project_name=dist.canonical_name, + ) + best_candidate = evaluator.sort_best_candidate(all_candidates) + if best_candidate is None: + return None + + remote_version = best_candidate.version + if best_candidate.link.is_wheel: + typ = "wheel" + else: + typ = "sdist" + dist.latest_version = remote_version + dist.latest_filetype = typ + return dist + + for dist in map(latest_info, packages): + if dist is not None: + yield dist + + def output_package_listing( + self, packages: "_ProcessedDists", options: Values + ) -> None: + packages = sorted( + packages, + key=lambda dist: dist.canonical_name, + ) + if options.list_format == "columns" and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == "freeze": + for dist in packages: + if options.verbose >= 1: + write_output( + "%s==%s (%s)", dist.raw_name, dist.version, dist.location + ) + else: + write_output("%s==%s", dist.raw_name, dist.version) + elif options.list_format == "json": + write_output(format_for_json(packages, options)) + + def output_package_listing_columns( + self, data: List[List[str]], header: List[str] + ) -> None: + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join("-" * x for x in sizes)) + + for val in pkg_strings: + write_output(val) + + +def format_for_columns( + pkgs: "_ProcessedDists", options: Values +) -> Tuple[List[List[str]], List[str]]: + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + header = ["Package", "Version"] + + running_outdated = options.outdated + if running_outdated: + header.extend(["Latest", "Type"]) + + has_editables = any(x.editable for x in pkgs) + if has_editables: + header.append("Editable project location") + + if options.verbose >= 1: + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + data = [] + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.raw_name, str(proj.version)] + + if running_outdated: + row.append(str(proj.latest_version)) + row.append(proj.latest_filetype) + + if has_editables: + row.append(proj.editable_project_location or "") + + if options.verbose >= 1: + row.append(proj.location or "") + if options.verbose >= 1: + row.append(proj.installer) + + data.append(row) + + return data, header + + +def format_for_json(packages: "_ProcessedDists", options: Values) -> str: + data = [] + for dist in packages: + info = { + "name": dist.raw_name, + "version": str(dist.version), + } + if options.verbose >= 1: + info["location"] = dist.location or "" + info["installer"] = dist.installer + if options.outdated: + info["latest_version"] = str(dist.latest_version) + info["latest_filetype"] = dist.latest_filetype + editable_project_location = dist.editable_project_location + if editable_project_location: + info["editable_project_location"] = editable_project_location + data.append(info) + return json.dumps(data) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/search.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/search.py new file mode 100644 index 0000000..03ed925 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/search.py @@ -0,0 +1,174 @@ +import logging +import shutil +import sys +import textwrap +import xmlrpc.client +from collections import OrderedDict +from optparse import Values +from typing import TYPE_CHECKING, Dict, List, Optional + +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.cli.base_command import Command +from pip._internal.cli.req_command import SessionCommandMixin +from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.metadata import get_default_environment +from pip._internal.models.index import PyPI +from pip._internal.network.xmlrpc import PipXmlrpcTransport +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import write_output + +if TYPE_CHECKING: + from typing import TypedDict + + class TransformedHit(TypedDict): + name: str + summary: str + versions: List[str] + + +logger = logging.getLogger(__name__) + + +class SearchCommand(Command, SessionCommandMixin): + """Search for PyPI packages whose name or summary contains .""" + + usage = """ + %prog [options] """ + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-i", + "--index", + dest="index", + metavar="URL", + default=PyPI.pypi_url, + help="Base URL of Python Package Index (default %default)", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + if not args: + raise CommandError("Missing required argument (search query).") + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = shutil.get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query: List[str], options: Values) -> List[Dict[str, str]]: + index_url = options.index + + session = self.get_default_session(options) + + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc.client.ServerProxy(index_url, transport) + try: + hits = pypi.search({"name": query, "summary": query}, "or") + except xmlrpc.client.Fault as fault: + message = "XMLRPC request failed [code: {code}]\n{string}".format( + code=fault.faultCode, + string=fault.faultString, + ) + raise CommandError(message) + assert isinstance(hits, list) + return hits + + +def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]: + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages: Dict[str, "TransformedHit"] = OrderedDict() + for hit in hits: + name = hit["name"] + summary = hit["summary"] + version = hit["version"] + + if name not in packages.keys(): + packages[name] = { + "name": name, + "summary": summary, + "versions": [version], + } + else: + packages[name]["versions"].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]["versions"]): + packages[name]["summary"] = summary + + return list(packages.values()) + + +def print_dist_installation_info(name: str, latest: str) -> None: + env = get_default_environment() + dist = env.get_distribution(name) + if dist is not None: + with indent_log(): + if dist.version == latest: + write_output("INSTALLED: %s (latest)", dist.version) + else: + write_output("INSTALLED: %s", dist.version) + if parse_version(latest).pre: + write_output( + "LATEST: %s (pre-release; install" + " with `pip install --pre`)", + latest, + ) + else: + write_output("LATEST: %s", latest) + + +def print_results( + hits: List["TransformedHit"], + name_column_width: Optional[int] = None, + terminal_width: Optional[int] = None, +) -> None: + if not hits: + return + if name_column_width is None: + name_column_width = ( + max( + [ + len(hit["name"]) + len(highest_version(hit.get("versions", ["-"]))) + for hit in hits + ] + ) + + 4 + ) + + for hit in hits: + name = hit["name"] + summary = hit["summary"] or "" + latest = highest_version(hit.get("versions", ["-"])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary_lines = textwrap.wrap(summary, target_width) + summary = ("\n" + " " * (name_column_width + 3)).join(summary_lines) + + name_latest = f"{name} ({latest})" + line = f"{name_latest:{name_column_width}} - {summary}" + try: + write_output(line) + print_dist_installation_info(name, latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions: List[str]) -> str: + return max(versions, key=parse_version) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/show.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..3f10701 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,189 @@ +import logging +from optparse import Values +from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.metadata import BaseDistribution, get_default_environment +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + + usage = """ + %prog [options] ...""" + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-f", + "--files", + dest="files", + action="store_true", + default=False, + help="Show the full list of installed files for each package.", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + if not args: + logger.warning("ERROR: Please provide a package name or names.") + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose + ): + return ERROR + return SUCCESS + + +class _PackageInfo(NamedTuple): + name: str + version: str + location: str + editable_project_location: Optional[str] + requires: List[str] + required_by: List[str] + installer: str + metadata_version: str + classifiers: List[str] + summary: str + homepage: str + project_urls: List[str] + author: str + author_email: str + license: str + entry_points: List[str] + files: Optional[List[str]] + + +def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]: + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + env = get_default_environment() + + installed = {dist.canonical_name: dist for dist in env.iter_all_distributions()} + query_names = [canonicalize_name(name) for name in query] + missing = sorted( + [name for name, pkg in zip(query, query_names) if pkg not in installed] + ) + if missing: + logger.warning("Package(s) not found: %s", ", ".join(missing)) + + def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]: + return ( + dist.metadata["Name"] or "UNKNOWN" + for dist in installed.values() + if current_dist.canonical_name + in {canonicalize_name(d.name) for d in dist.iter_dependencies()} + ) + + for query_name in query_names: + try: + dist = installed[query_name] + except KeyError: + continue + + requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower) + required_by = sorted(_get_requiring_packages(dist), key=str.lower) + + try: + entry_points_text = dist.read_text("entry_points.txt") + entry_points = entry_points_text.splitlines(keepends=False) + except FileNotFoundError: + entry_points = [] + + files_iter = dist.iter_declared_entries() + if files_iter is None: + files: Optional[List[str]] = None + else: + files = sorted(files_iter) + + metadata = dist.metadata + + yield _PackageInfo( + name=dist.raw_name, + version=str(dist.version), + location=dist.location or "", + editable_project_location=dist.editable_project_location, + requires=requires, + required_by=required_by, + installer=dist.installer, + metadata_version=dist.metadata_version or "", + classifiers=metadata.get_all("Classifier", []), + summary=metadata.get("Summary", ""), + homepage=metadata.get("Home-page", ""), + project_urls=metadata.get_all("Project-URL", []), + author=metadata.get("Author", ""), + author_email=metadata.get("Author-email", ""), + license=metadata.get("License", ""), + entry_points=entry_points, + files=files, + ) + + +def print_results( + distributions: Iterable[_PackageInfo], + list_files: bool, + verbose: bool, +) -> bool: + """ + Print the information from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + write_output("---") + + write_output("Name: %s", dist.name) + write_output("Version: %s", dist.version) + write_output("Summary: %s", dist.summary) + write_output("Home-page: %s", dist.homepage) + write_output("Author: %s", dist.author) + write_output("Author-email: %s", dist.author_email) + write_output("License: %s", dist.license) + write_output("Location: %s", dist.location) + if dist.editable_project_location is not None: + write_output( + "Editable project location: %s", dist.editable_project_location + ) + write_output("Requires: %s", ", ".join(dist.requires)) + write_output("Required-by: %s", ", ".join(dist.required_by)) + + if verbose: + write_output("Metadata-Version: %s", dist.metadata_version) + write_output("Installer: %s", dist.installer) + write_output("Classifiers:") + for classifier in dist.classifiers: + write_output(" %s", classifier) + write_output("Entry-points:") + for entry in dist.entry_points: + write_output(" %s", entry.strip()) + write_output("Project-URLs:") + for project_url in dist.project_urls: + write_output(" %s", project_url) + if list_files: + write_output("Files:") + if dist.files is None: + write_output("Cannot locate RECORD or installed-files.txt") + else: + for line in dist.files: + write_output(" %s", line.strip()) + return results_printed diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..f198fc3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py @@ -0,0 +1,113 @@ +import logging +from optparse import Values +from typing import List + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import ( + install_req_from_line, + install_req_from_parsed_requirement, +) +from pip._internal.utils.misc import ( + check_externally_managed, + protect_pip_from_modification_on_windows, +) + +logger = logging.getLogger(__name__) + + +class UninstallCommand(Command, SessionCommandMixin): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + + usage = """ + %prog [options] ... + %prog [options] -r ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help=( + "Uninstall all the packages listed in the given requirements " + "file. This option can be used multiple times." + ), + ) + self.cmd_opts.add_option( + "-y", + "--yes", + dest="yes", + action="store_true", + help="Don't ask for confirmation of uninstall deletions.", + ) + self.cmd_opts.add_option(cmdoptions.root_user_action()) + self.cmd_opts.add_option(cmdoptions.override_externally_managed()) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + session = self.get_default_session(options) + + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, + isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + else: + logger.warning( + "Invalid requirement: %r ignored -" + " the uninstall command expects named" + " requirements.", + name, + ) + for filename in options.requirements: + for parsed_req in parse_requirements( + filename, options=options, session=session + ): + req = install_req_from_parsed_requirement( + parsed_req, isolated=options.isolated_mode + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + f"You must give at least one requirement to {self.name} (see " + f'"pip help {self.name}")' + ) + + if not options.override_externally_managed: + check_externally_managed() + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, + verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() + if options.root_user_action == "warn": + warn_if_run_as_root() + return SUCCESS diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py b/myenv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..ed578aa --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,183 @@ +import logging +import os +import shutil +from optparse import Values +from typing import List + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import RequirementCommand, with_cleanup +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.operations.build.build_tracker import get_build_tracker +from pip._internal.req.req_install import ( + InstallRequirement, + check_legacy_setup_py_options, +) +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel_builder import build, should_build_for_wheel_command + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + 'pip wheel' uses the build system interface as described here: + https://pip.pypa.io/en/stable/reference/build-system/ + + """ + + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-w", + "--wheel-dir", + dest="wheel_dir", + metavar="dir", + default=os.curdir, + help=( + "Build wheels into , where the default is the " + "current working directory." + ), + ) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.src()) + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + + self.cmd_opts.add_option( + "--no-verify", + dest="no_verify", + action="store_true", + default=False, + help="Don't verify if built wheel is valid.", + ) + + self.cmd_opts.add_option(cmdoptions.config_settings()) + self.cmd_opts.add_option(cmdoptions.build_options()) + self.cmd_opts.add_option(cmdoptions.global_options()) + + self.cmd_opts.add_option( + "--pre", + action="store_true", + default=False, + help=( + "Include pre-release and development versions. By default, " + "pip only finds stable versions." + ), + ) + + self.cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + session = self.get_default_session(options) + + finder = self._build_package_finder(options, session) + + options.wheel_dir = normalize_path(options.wheel_dir) + ensure_dir(options.wheel_dir) + + build_tracker = self.enter_context(get_build_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="wheel", + globally_managed=True, + ) + + reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options(options, reqs) + + wheel_cache = WheelCache(options.cache_dir) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + build_tracker=build_tracker, + session=session, + finder=finder, + download_dir=options.wheel_dir, + use_user_site=False, + verbosity=self.verbosity, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve(reqs, check_supported_wheels=True) + + reqs_to_build: List[InstallRequirement] = [] + for req in requirement_set.requirements.values(): + if req.is_wheel: + preparer.save_linked_requirement(req) + elif should_build_for_wheel_command(req): + reqs_to_build.append(req) + + preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) + requirement_set.warn_legacy_versions_and_specifiers() + + # build wheels + build_successes, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + verify=(not options.no_verify), + build_options=options.build_options or [], + global_options=options.global_options or [], + ) + for req in build_successes: + assert req.link and req.link.is_wheel + assert req.local_file_path + # copy from cache to target directory + try: + shutil.copy(req.local_file_path, options.wheel_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, + e, + ) + build_failures.append(req) + if len(build_failures) != 0: + raise CommandError("Failed to build one or more wheels") + + return SUCCESS diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/configuration.py b/myenv/lib/python3.12/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..c25273d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/configuration.py @@ -0,0 +1,383 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +import configparser +import locale +import os +import sys +from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple + +from pip._internal.exceptions import ( + ConfigurationError, + ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import getLogger +from pip._internal.utils.misc import ensure_dir, enum + +RawConfigParser = configparser.RawConfigParser # Shorthand +Kind = NewType("Kind", str) + +CONFIG_BASENAME = "pip.ini" if WINDOWS else "pip.conf" +ENV_NAMES_IGNORED = "version", "help" + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + SITE="site", # [Virtual] Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) +OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR +VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE + +logger = getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name: str) -> str: + """Make a name consistent regardless of source (environment or file)""" + name = name.lower().replace("_", "-") + if name.startswith("--"): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name: str) -> List[str]: + if "." not in name: + error_message = ( + "Key does not contain dot separated section and key. " + f"Perhaps you wanted to use 'global.{name}' instead?" + ) + raise ConfigurationError(error_message) + return name.split(".", 1) + + +def get_configuration_files() -> Dict[Kind, List[str]]: + global_config_files = [ + os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip") + ] + + site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) + legacy_config_file = os.path.join( + os.path.expanduser("~"), + "pip" if WINDOWS else ".pip", + CONFIG_BASENAME, + ) + new_config_file = os.path.join(appdirs.user_config_dir("pip"), CONFIG_BASENAME) + return { + kinds.GLOBAL: global_config_files, + kinds.SITE: [site_config_file], + kinds.USER: [legacy_config_file, new_config_file], + } + + +class Configuration: + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated: bool, load_only: Optional[Kind] = None) -> None: + super().__init__() + + if load_only is not None and load_only not in VALID_LOAD_ONLY: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, VALID_LOAD_ONLY)) + ) + ) + self.isolated = isolated + self.load_only = load_only + + # Because we keep track of where we got the data from + self._parsers: Dict[Kind, List[Tuple[str, RawConfigParser]]] = { + variant: [] for variant in OVERRIDE_ORDER + } + self._config: Dict[Kind, Dict[str, Any]] = { + variant: {} for variant in OVERRIDE_ORDER + } + self._modified_parsers: List[Tuple[str, RawConfigParser]] = [] + + def load(self) -> None: + """Loads configuration from configuration files and environment""" + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self) -> Optional[str]: + """Returns the file with highest priority in configuration""" + assert self.load_only is not None, "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self) -> Iterable[Tuple[str, Any]]: + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key: str) -> Any: + """Get a value from the configuration.""" + orig_key = key + key = _normalize_name(key) + try: + return self._dictionary[key] + except KeyError: + # disassembling triggers a more useful error message than simply + # "No such key" in the case that the key isn't in the form command.option + _disassemble_key(key) + raise ConfigurationError(f"No such key - {orig_key}") + + def set_value(self, key: str, value: Any) -> None: + """Modify a value in the configuration.""" + key = _normalize_name(key) + self._ensure_have_load_only() + + assert self.load_only + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key: str) -> None: + """Unset a value in the configuration.""" + orig_key = key + key = _normalize_name(key) + self._ensure_have_load_only() + + assert self.load_only + if key not in self._config[self.load_only]: + raise ConfigurationError(f"No such key - {orig_key}") + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + if not ( + parser.has_section(section) and parser.remove_option(section, name) + ): + # The option was not removed. + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + # The section may be empty after the option was removed. + if not parser.items(section): + parser.remove_section(section) + self._mark_as_modified(fname, parser) + + del self._config[self.load_only][key] + + def save(self) -> None: + """Save the current in-memory state.""" + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + # Ensure directory's permission(need to be writeable) + try: + with open(fname, "w") as f: + parser.write(f) + except OSError as error: + raise ConfigurationError( + f"An error occurred while writing to the configuration file " + f"{fname}: {error}" + ) + + # + # Private routines + # + + def _ensure_have_load_only(self) -> None: + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self) -> Dict[str, Any]: + """A dictionary representing the loaded configuration.""" + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in OVERRIDE_ORDER: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self) -> None: + """Loads configuration from configuration files""" + config_files = dict(self.iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug("Skipping file '%s' (variant: %s)", fname, variant) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant: Kind, fname: str) -> RawConfigParser: + logger.verbose("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname: str) -> RawConfigParser: + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + locale_encoding = locale.getpreferredencoding(False) + try: + parser.read(fname, encoding=locale_encoding) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason=f"contains invalid {locale_encoding} characters", + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self) -> None: + """Loads configuration from environment variables""" + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self.get_environ_vars()) + ) + + def _normalized_keys( + self, section: str, items: Iterable[Tuple[str, Any]] + ) -> Dict[str, Any]: + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def get_environ_vars(self) -> Iterable[Tuple[str, str]]: + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + if key.startswith("PIP_"): + name = key[4:].lower() + if name not in ENV_NAMES_IGNORED: + yield name, val + + # XXX: This is patched in the tests. + def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]: + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. The order + here doesn't affect what gets overridden. That is controlled + by OVERRIDE_ORDER. However this does control the order they are + displayed to the user. It's probably most ergononmic to display + things in the same order as OVERRIDE_ORDER + """ + # SMELL: Move the conditions out of this function + + env_config_file = os.environ.get("PIP_CONFIG_FILE", None) + config_files = get_configuration_files() + + yield kinds.GLOBAL, config_files[kinds.GLOBAL] + + # per-user config is not loaded when env_config_file exists + should_load_user_config = not self.isolated and not ( + env_config_file and os.path.exists(env_config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, config_files[kinds.USER] + + # virtualenv config + yield kinds.SITE, config_files[kinds.SITE] + + if env_config_file is not None: + yield kinds.ENV, [env_config_file] + else: + yield kinds.ENV, [] + + def get_values_in_config(self, variant: Kind) -> Dict[str, Any]: + """Get values present in a config file""" + return self._config[variant] + + def _get_parser_to_modify(self) -> Tuple[str, RawConfigParser]: + # Determine which parser to modify + assert self.load_only + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname: str, parser: RawConfigParser) -> None: + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self._dictionary!r})" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py new file mode 100644 index 0000000..9a89a83 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py @@ -0,0 +1,21 @@ +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.distributions.sdist import SourceDistribution +from pip._internal.distributions.wheel import WheelDistribution +from pip._internal.req.req_install import InstallRequirement + + +def make_distribution_for_install_requirement( + install_req: InstallRequirement, +) -> AbstractDistribution: + """Returns a Distribution for the given InstallRequirement""" + # Editable requirements will always be source distributions. They use the + # legacy logic until we create a modern standard for them. + if install_req.editable: + return SourceDistribution(install_req) + + # If it's a wheel, it's a WheelDistribution + if install_req.is_wheel: + return WheelDistribution(install_req) + + # Otherwise, a SourceDistribution + return SourceDistribution(install_req) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bba3e7c26f37ea6a6038a080467a1da6a7e9c68e GIT binary patch literal 959 zcmaJ;&ubGw6rSmBcDE*JXzfLUvPBTKB|H8&c(AB}Ab9c6qCzgqCOb{0*N8Fw8q2K6 ze&sw)k1~T(+2?T^&txbE67w^a08Y^fI#k&u<3*|JayvmEX7Be^^?W4rYw%EQ&cns( z|Mzh4>-&2-FJb%kq9pqu;kN8jyTguYZ2zmy(KCw%O!}>maz!MwnDAby(eMI<4(5u8 zP<-u+0f}Ns+T^*QT#zSJLeB#<SuCK|?gjOt_bc#Iy6(eA`p!#iKrZ%#Du-wM~x3*hrU FKLNup3ex}p literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9eafeec5239f3d3405e8bd12e88b488441dd416 GIT binary patch literal 2880 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1fe1e7c182d5e4ee7af2cf629b8282830051727 GIT binary patch literal 8506 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 RYs$uj^MRpn2xiz0{0|)SvC;ql literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05d1c57295aae48ef11797a7a69458c23766b19c GIT binary patch literal 2266 zcmaJ?&uT_%7$+R#YQnGHA=x$V@e}B`H(Pkov;EoHgcK&#;&eaEB=X_nwD4>W93Dm>w~nJ*G%v&o9EL*MNX6q6Nw+SZ=jgf}Vv__8Sna&Mv?uRdJ zo#oc^8$;tp0lrwE%dh7fMP~34Gx-!`J;iipwJlZzJ?33XcBi3?$Jx8~DUSu0JXDgp zG>wmr$5$_vC_JAnd6Ke-OBzOshMY6%hFuCrV^_Ec3w337TvC9NHaWNvyruju?SwJl z#aTUdm6(F7jtE=YFoDqvYqSN#fXut(p0;ogYm}GVZ%Z_#FIMazRCde0BDs+E1+I8V z&kK)v_IWOsRTSH?h^}&VE|gx==XTKL;fn2hO*`(Yr6@dAKlz?5J;moR9;lzRV=uNH zFH~Fr4eas6rJaINkGn~=+3|elAQP6ka6HyK@(Pgkoi;NNvP4?nAWtfLwm={g8JnO; zGd3Z)+vIC<6-{f@df1|zOBm%kPNl)r8PpZPm;0-=rbNj}yYHOM* zZlBiF)VBQkJYEyc$kWE~mdm7;>wW)m_*jo94jNJCMHYoczX9Z4)r%0?*m`5 z3Cj&KD3R*St<`T=A6Ab3S~=RcuJmhHHeszC{k^gWKipdTZmn<4_Yci)TJty89#s$D z$^T&8wI0&>U+Da1_4G~SQRSUG{I|KYKdA?+_g5dR-Cx_B`((4S(6<)E9*o;;r?WGu zWPRhw$WO;eQf)2q*0PhS8IR>cYbSXo28EagccKDIEuW$!4xnNdm$zY&cpB@L;dL+@ zS$qPjZ2)`rtC;=ofg^YWwh`dAixkUga|~#Kc2cf_ZIqUOOv|{a^^d>5MNk;bm`3?Y_29sO_rN3v z4h;$@S!DL`pomh5l%}6gfs|d2_bx!Xrs~GP`z-!h7^-z=g@-H>^=#6@w>tbheVNiZ zp{d1a?A9m7ZoLV=Qh|drIWlR6gjpRr None: + super().__init__() + self.req = req + + @abc.abstractproperty + def build_tracker_id(self) -> Optional[str]: + """A string that uniquely identifies this requirement to the build tracker. + + If None, then this dist has no work to do in the build tracker, and + ``.prepare_distribution_metadata()`` will not be called.""" + raise NotImplementedError() + + @abc.abstractmethod + def get_metadata_distribution(self) -> BaseDistribution: + raise NotImplementedError() + + @abc.abstractmethod + def prepare_distribution_metadata( + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, + ) -> None: + raise NotImplementedError() diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py new file mode 100644 index 0000000..ab8d53b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py @@ -0,0 +1,29 @@ +from typing import Optional + +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution + + +class InstalledDistribution(AbstractDistribution): + """Represents an installed package. + + This does not need any preparation as the required information has already + been computed. + """ + + @property + def build_tracker_id(self) -> Optional[str]: + return None + + def get_metadata_distribution(self) -> BaseDistribution: + assert self.req.satisfied_by is not None, "not actually installed" + return self.req.satisfied_by + + def prepare_distribution_metadata( + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, + ) -> None: + pass diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py new file mode 100644 index 0000000..15ff42b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py @@ -0,0 +1,156 @@ +import logging +from typing import Iterable, Optional, Set, Tuple + +from pip._internal.build_env import BuildEnvironment +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.exceptions import InstallationError +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution +from pip._internal.utils.subprocess import runner_with_spinner_message + +logger = logging.getLogger(__name__) + + +class SourceDistribution(AbstractDistribution): + """Represents a source distribution. + + The preparation step for these needs metadata for the packages to be + generated, either using PEP 517 or using the legacy `setup.py egg_info`. + """ + + @property + def build_tracker_id(self) -> Optional[str]: + """Identify this requirement uniquely by its link.""" + assert self.req.link + return self.req.link.url_without_fragment + + def get_metadata_distribution(self) -> BaseDistribution: + return self.req.get_dist() + + def prepare_distribution_metadata( + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, + ) -> None: + # Load pyproject.toml, to determine whether PEP 517 is to be used + self.req.load_pyproject_toml() + + # Set up the build isolation, if this requirement should be isolated + should_isolate = self.req.use_pep517 and build_isolation + if should_isolate: + # Setup an isolated environment and install the build backend static + # requirements in it. + self._prepare_build_backend(finder) + # Check that if the requirement is editable, it either supports PEP 660 or + # has a setup.py or a setup.cfg. This cannot be done earlier because we need + # to setup the build backend to verify it supports build_editable, nor can + # it be done later, because we want to avoid installing build requirements + # needlessly. Doing it here also works around setuptools generating + # UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory + # without setup.py nor setup.cfg. + self.req.isolated_editable_sanity_check() + # Install the dynamic build requirements. + self._install_build_reqs(finder) + # Check if the current environment provides build dependencies + should_check_deps = self.req.use_pep517 and check_build_deps + if should_check_deps: + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + conflicting, missing = self.req.build_env.check_requirements( + pyproject_requires + ) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + if missing: + self._raise_missing_reqs(missing) + self.req.prepare_metadata() + + def _prepare_build_backend(self, finder: PackageFinder) -> None: + # Isolate in a BuildEnvironment and install the build-time + # requirements. + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, pyproject_requires, "overlay", kind="build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + self._raise_conflicts("PEP 517/518 supported requirements", conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))), + ) + + def _get_build_requires_wheel(self) -> Iterable[str]: + with self.req.build_env: + runner = runner_with_spinner_message("Getting requirements to build wheel") + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + return backend.get_requires_for_build_wheel() + + def _get_build_requires_editable(self) -> Iterable[str]: + with self.req.build_env: + runner = runner_with_spinner_message( + "Getting requirements to build editable" + ) + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + return backend.get_requires_for_build_editable() + + def _install_build_reqs(self, finder: PackageFinder) -> None: + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + if ( + self.req.editable + and self.req.permit_editable_wheels + and self.req.supports_pyproject_editable() + ): + build_reqs = self._get_build_requires_editable() + else: + build_reqs = self._get_build_requires_wheel() + conflicting, missing = self.req.build_env.check_requirements(build_reqs) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + self.req.build_env.install_requirements( + finder, missing, "normal", kind="backend dependencies" + ) + + def _raise_conflicts( + self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]] + ) -> None: + format_string = ( + "Some build dependencies for {requirement} " + "conflict with {conflicting_with}: {description}." + ) + error_message = format_string.format( + requirement=self.req, + conflicting_with=conflicting_with, + description=", ".join( + f"{installed} is incompatible with {wanted}" + for installed, wanted in sorted(conflicting_reqs) + ), + ) + raise InstallationError(error_message) + + def _raise_missing_reqs(self, missing: Set[str]) -> None: + format_string = ( + "Some build dependencies for {requirement} are missing: {missing}." + ) + error_message = format_string.format( + requirement=self.req, missing=", ".join(map(repr, sorted(missing))) + ) + raise InstallationError(error_message) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py new file mode 100644 index 0000000..eb16e25 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py @@ -0,0 +1,40 @@ +from typing import Optional + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import ( + BaseDistribution, + FilesystemWheel, + get_wheel_distribution, +) + + +class WheelDistribution(AbstractDistribution): + """Represents a wheel distribution. + + This does not need any preparation as wheels can be directly unpacked. + """ + + @property + def build_tracker_id(self) -> Optional[str]: + return None + + def get_metadata_distribution(self) -> BaseDistribution: + """Loads the metadata from the wheel file into memory and returns a + Distribution that uses it, not relying on the wheel file or + requirement. + """ + assert self.req.local_file_path, "Set as part of preparation during download" + assert self.req.name, "Wheels are never unnamed" + wheel = FilesystemWheel(self.req.local_file_path) + return get_wheel_distribution(wheel, canonicalize_name(self.req.name)) + + def prepare_distribution_metadata( + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, + ) -> None: + pass diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/exceptions.py b/myenv/lib/python3.12/site-packages/pip/_internal/exceptions.py new file mode 100644 index 0000000..5007a62 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/exceptions.py @@ -0,0 +1,728 @@ +"""Exceptions used throughout package. + +This module MUST NOT try to import from anything within `pip._internal` to +operate. This is expected to be importable from any/all files within the +subpackage and, thus, should not depend on them. +""" + +import configparser +import contextlib +import locale +import logging +import pathlib +import re +import sys +from itertools import chain, groupby, repeat +from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Union + +from pip._vendor.requests.models import Request, Response +from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult +from pip._vendor.rich.markup import escape +from pip._vendor.rich.text import Text + +if TYPE_CHECKING: + from hashlib import _Hash + from typing import Literal + + from pip._internal.metadata import BaseDistribution + from pip._internal.req.req_install import InstallRequirement + +logger = logging.getLogger(__name__) + + +# +# Scaffolding +# +def _is_kebab_case(s: str) -> bool: + return re.match(r"^[a-z]+(-[a-z]+)*$", s) is not None + + +def _prefix_with_indent( + s: Union[Text, str], + console: Console, + *, + prefix: str, + indent: str, +) -> Text: + if isinstance(s, Text): + text = s + else: + text = console.render_str(s) + + return console.render_str(prefix, overflow="ignore") + console.render_str( + f"\n{indent}", overflow="ignore" + ).join(text.split(allow_blank=True)) + + +class PipError(Exception): + """The base pip error.""" + + +class DiagnosticPipError(PipError): + """An error, that presents diagnostic information to the user. + + This contains a bunch of logic, to enable pretty presentation of our error + messages. Each error gets a unique reference. Each error can also include + additional context, a hint and/or a note -- which are presented with the + main error message in a consistent style. + + This is adapted from the error output styling in `sphinx-theme-builder`. + """ + + reference: str + + def __init__( + self, + *, + kind: 'Literal["error", "warning"]' = "error", + reference: Optional[str] = None, + message: Union[str, Text], + context: Optional[Union[str, Text]], + hint_stmt: Optional[Union[str, Text]], + note_stmt: Optional[Union[str, Text]] = None, + link: Optional[str] = None, + ) -> None: + # Ensure a proper reference is provided. + if reference is None: + assert hasattr(self, "reference"), "error reference not provided!" + reference = self.reference + assert _is_kebab_case(reference), "error reference must be kebab-case!" + + self.kind = kind + self.reference = reference + + self.message = message + self.context = context + + self.note_stmt = note_stmt + self.hint_stmt = hint_stmt + + self.link = link + + super().__init__(f"<{self.__class__.__name__}: {self.reference}>") + + def __repr__(self) -> str: + return ( + f"<{self.__class__.__name__}(" + f"reference={self.reference!r}, " + f"message={self.message!r}, " + f"context={self.context!r}, " + f"note_stmt={self.note_stmt!r}, " + f"hint_stmt={self.hint_stmt!r}" + ")>" + ) + + def __rich_console__( + self, + console: Console, + options: ConsoleOptions, + ) -> RenderResult: + colour = "red" if self.kind == "error" else "yellow" + + yield f"[{colour} bold]{self.kind}[/]: [bold]{self.reference}[/]" + yield "" + + if not options.ascii_only: + # Present the main message, with relevant context indented. + if self.context is not None: + yield _prefix_with_indent( + self.message, + console, + prefix=f"[{colour}]×[/] ", + indent=f"[{colour}]│[/] ", + ) + yield _prefix_with_indent( + self.context, + console, + prefix=f"[{colour}]╰─>[/] ", + indent=f"[{colour}] [/] ", + ) + else: + yield _prefix_with_indent( + self.message, + console, + prefix="[red]×[/] ", + indent=" ", + ) + else: + yield self.message + if self.context is not None: + yield "" + yield self.context + + if self.note_stmt is not None or self.hint_stmt is not None: + yield "" + + if self.note_stmt is not None: + yield _prefix_with_indent( + self.note_stmt, + console, + prefix="[magenta bold]note[/]: ", + indent=" ", + ) + if self.hint_stmt is not None: + yield _prefix_with_indent( + self.hint_stmt, + console, + prefix="[cyan bold]hint[/]: ", + indent=" ", + ) + + if self.link is not None: + yield "" + yield f"Link: {self.link}" + + +# +# Actual Errors +# +class ConfigurationError(PipError): + """General exception in configuration""" + + +class InstallationError(PipError): + """General exception during installation""" + + +class UninstallationError(PipError): + """General exception during uninstallation""" + + +class MissingPyProjectBuildRequires(DiagnosticPipError): + """Raised when pyproject.toml has `build-system`, but no `build-system.requires`.""" + + reference = "missing-pyproject-build-system-requires" + + def __init__(self, *, package: str) -> None: + super().__init__( + message=f"Can not process {escape(package)}", + context=Text( + "This package has an invalid pyproject.toml file.\n" + "The [build-system] table is missing the mandatory `requires` key." + ), + note_stmt="This is an issue with the package mentioned above, not pip.", + hint_stmt=Text("See PEP 518 for the detailed specification."), + ) + + +class InvalidPyProjectBuildRequires(DiagnosticPipError): + """Raised when pyproject.toml an invalid `build-system.requires`.""" + + reference = "invalid-pyproject-build-system-requires" + + def __init__(self, *, package: str, reason: str) -> None: + super().__init__( + message=f"Can not process {escape(package)}", + context=Text( + "This package has an invalid `build-system.requires` key in " + f"pyproject.toml.\n{reason}" + ), + note_stmt="This is an issue with the package mentioned above, not pip.", + hint_stmt=Text("See PEP 518 for the detailed specification."), + ) + + +class NoneMetadataError(PipError): + """Raised when accessing a Distribution's "METADATA" or "PKG-INFO". + + This signifies an inconsistency, when the Distribution claims to have + the metadata file (if not, raise ``FileNotFoundError`` instead), but is + not actually able to produce its content. This may be due to permission + errors. + """ + + def __init__( + self, + dist: "BaseDistribution", + metadata_name: str, + ) -> None: + """ + :param dist: A Distribution object. + :param metadata_name: The name of the metadata being accessed + (can be "METADATA" or "PKG-INFO"). + """ + self.dist = dist + self.metadata_name = metadata_name + + def __str__(self) -> str: + # Use `dist` in the error message because its stringification + # includes more information, like the version and location. + return f"None {self.metadata_name} metadata found for distribution: {self.dist}" + + +class UserInstallationInvalid(InstallationError): + """A --user install is requested on an environment without user site.""" + + def __str__(self) -> str: + return "User base directory is not specified" + + +class InvalidSchemeCombination(InstallationError): + def __str__(self) -> str: + before = ", ".join(str(a) for a in self.args[:-1]) + return f"Cannot set {before} and {self.args[-1]} together" + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class NetworkConnectionError(PipError): + """HTTP connection error""" + + def __init__( + self, + error_msg: str, + response: Optional[Response] = None, + request: Optional[Request] = None, + ) -> None: + """ + Initialize NetworkConnectionError with `request` and `response` + objects. + """ + self.response = response + self.request = request + self.error_msg = error_msg + if ( + self.response is not None + and not self.request + and hasattr(response, "request") + ): + self.request = self.response.request + super().__init__(error_msg, response, request) + + def __str__(self) -> str: + return str(self.error_msg) + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class InvalidWheel(InstallationError): + """Invalid (e.g. corrupt) wheel.""" + + def __init__(self, location: str, name: str): + self.location = location + self.name = name + + def __str__(self) -> str: + return f"Wheel '{self.name}' located at {self.location} is invalid." + + +class MetadataInconsistent(InstallationError): + """Built metadata contains inconsistent information. + + This is raised when the metadata contains values (e.g. name and version) + that do not match the information previously obtained from sdist filename, + user-supplied ``#egg=`` value, or an install requirement name. + """ + + def __init__( + self, ireq: "InstallRequirement", field: str, f_val: str, m_val: str + ) -> None: + self.ireq = ireq + self.field = field + self.f_val = f_val + self.m_val = m_val + + def __str__(self) -> str: + return ( + f"Requested {self.ireq} has inconsistent {self.field}: " + f"expected {self.f_val!r}, but metadata has {self.m_val!r}" + ) + + +class InstallationSubprocessError(DiagnosticPipError, InstallationError): + """A subprocess call failed.""" + + reference = "subprocess-exited-with-error" + + def __init__( + self, + *, + command_description: str, + exit_code: int, + output_lines: Optional[List[str]], + ) -> None: + if output_lines is None: + output_prompt = Text("See above for output.") + else: + output_prompt = ( + Text.from_markup(f"[red][{len(output_lines)} lines of output][/]\n") + + Text("".join(output_lines)) + + Text.from_markup(R"[red]\[end of output][/]") + ) + + super().__init__( + message=( + f"[green]{escape(command_description)}[/] did not run successfully.\n" + f"exit code: {exit_code}" + ), + context=output_prompt, + hint_stmt=None, + note_stmt=( + "This error originates from a subprocess, and is likely not a " + "problem with pip." + ), + ) + + self.command_description = command_description + self.exit_code = exit_code + + def __str__(self) -> str: + return f"{self.command_description} exited with {self.exit_code}" + + +class MetadataGenerationFailed(InstallationSubprocessError, InstallationError): + reference = "metadata-generation-failed" + + def __init__( + self, + *, + package_details: str, + ) -> None: + super(InstallationSubprocessError, self).__init__( + message="Encountered error while generating package metadata.", + context=escape(package_details), + hint_stmt="See above for details.", + note_stmt="This is an issue with the package mentioned above, not pip.", + ) + + def __str__(self) -> str: + return "metadata generation failed" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self) -> None: + self.errors: List["HashError"] = [] + + def append(self, error: "HashError") -> None: + self.errors.append(error) + + def __str__(self) -> str: + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return "\n".join(lines) + return "" + + def __bool__(self) -> bool: + return bool(self.errors) + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + + req: Optional["InstallRequirement"] = None + head = "" + order: int = -1 + + def body(self) -> str: + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + its link already populated by the resolver's _populate_link(). + + """ + return f" {self._requirement_name()}" + + def __str__(self) -> str: + return f"{self.head}\n{self.body()}" + + def _requirement_name(self) -> str: + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else "unknown package" + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ( + "Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:" + ) + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ( + "Can't verify hashes for these file:// requirements because they " + "point to directories:" + ) + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ( + "Hashes are required in --require-hashes mode, but they are " + "missing from some requirements. Here is a list of those " + "requirements along with the hashes their downloaded archives " + "actually had. Add lines like these to your requirements files to " + "prevent tampering. (If you did not enable --require-hashes " + "manually, note that it turns on automatically when any package " + "has a hash.)" + ) + + def __init__(self, gotten_hash: str) -> None: + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self) -> str: + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = ( + self.req.original_link + if self.req.is_direct + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, "req", None) + ) + return " {} --hash={}:{}".format( + package or "unknown package", FAVORITE_HASH, self.gotten_hash + ) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ( + "In --require-hashes mode, all requirements must have their " + "versions pinned with ==. These do not:" + ) + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + + order = 4 + head = ( + "THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS " + "FILE. If you have updated the package versions, please update " + "the hashes. Otherwise, examine the package contents carefully; " + "someone may have tampered with them." + ) + + def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> None: + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self) -> str: + return f" {self._requirement_name()}:\n{self._hash_comparison()}" + + def _hash_comparison(self) -> str: + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + + def hash_then_or(hash_name: str) -> "chain[str]": + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(" or")) + + lines: List[str] = [] + for hash_name, expecteds in self.allowed.items(): + prefix = hash_then_or(hash_name) + lines.extend((f" Expected {next(prefix)} {e}") for e in expecteds) + lines.append( + f" Got {self.gots[hash_name].hexdigest()}\n" + ) + return "\n".join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file""" + + def __init__( + self, + reason: str = "could not be loaded", + fname: Optional[str] = None, + error: Optional[configparser.Error] = None, + ) -> None: + super().__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self) -> str: + if self.fname is not None: + message_part = f" in {self.fname}." + else: + assert self.error is not None + message_part = f".\n{self.error}\n" + return f"Configuration file {self.reason}{message_part}" + + +_DEFAULT_EXTERNALLY_MANAGED_ERROR = f"""\ +The Python environment under {sys.prefix} is managed externally, and may not be +manipulated by the user. Please use specific tooling from the distributor of +the Python installation to interact with this environment instead. +""" + + +class ExternallyManagedEnvironment(DiagnosticPipError): + """The current environment is externally managed. + + This is raised when the current environment is externally managed, as + defined by `PEP 668`_. The ``EXTERNALLY-MANAGED`` configuration is checked + and displayed when the error is bubbled up to the user. + + :param error: The error message read from ``EXTERNALLY-MANAGED``. + """ + + reference = "externally-managed-environment" + + def __init__(self, error: Optional[str]) -> None: + if error is None: + context = Text(_DEFAULT_EXTERNALLY_MANAGED_ERROR) + else: + context = Text(error) + super().__init__( + message="This environment is externally managed", + context=context, + note_stmt=( + "If you believe this is a mistake, please contact your " + "Python installation or OS distribution provider. " + "You can override this, at the risk of breaking your Python " + "installation or OS, by passing --break-system-packages." + ), + hint_stmt=Text("See PEP 668 for the detailed specification."), + ) + + @staticmethod + def _iter_externally_managed_error_keys() -> Iterator[str]: + # LC_MESSAGES is in POSIX, but not the C standard. The most common + # platform that does not implement this category is Windows, where + # using other categories for console message localization is equally + # unreliable, so we fall back to the locale-less vendor message. This + # can always be re-evaluated when a vendor proposes a new alternative. + try: + category = locale.LC_MESSAGES + except AttributeError: + lang: Optional[str] = None + else: + lang, _ = locale.getlocale(category) + if lang is not None: + yield f"Error-{lang}" + for sep in ("-", "_"): + before, found, _ = lang.partition(sep) + if not found: + continue + yield f"Error-{before}" + yield "Error" + + @classmethod + def from_config( + cls, + config: Union[pathlib.Path, str], + ) -> "ExternallyManagedEnvironment": + parser = configparser.ConfigParser(interpolation=None) + try: + parser.read(config, encoding="utf-8") + section = parser["externally-managed"] + for key in cls._iter_externally_managed_error_keys(): + with contextlib.suppress(KeyError): + return cls(section[key]) + except KeyError: + pass + except (OSError, UnicodeDecodeError, configparser.ParsingError): + from pip._internal.utils._log import VERBOSE + + exc_info = logger.isEnabledFor(VERBOSE) + logger.warning("Failed to read %s", config, exc_info=exc_info) + return cls(None) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/index/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/index/__init__.py new file mode 100644 index 0000000..7a17b7b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/index/__init__.py @@ -0,0 +1,2 @@ +"""Index interaction code +""" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2837a71dd7b510330aaf5c9de397ecbc00e29009 GIT binary patch literal 250 zcmXv}F-`+95VS)CQKZy#=-L!y6=)F>QiMc92L+9Fu~*4*cWYxWh~p!?fw%AjT0VeC zmnt?Q)9lPjqnY`fOvWl>-rTQF^8GGi5B*OzqfFkFQxB@w)4|*E4Lf|Thy`P9g*;c* zI~?Cm_1BRx&Rb(X)TX$%PtdV|g}a0?!8HnUwTR>h7ML3G0YdbTC|8_l*&=j3@(Z-I zgwV^{^Z9Ik28jeuLv5RSg$V)$Fn{4(w?L%}nEW6yW)}MG=%VxPxy8$Pm>ZN4scif? N&|3cvv>wJ`mOJK~M~?si literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a6223bd8375b9fb02b33a238f66ba9e2e5013c5 GIT binary patch literal 21904 zcmd6Pd2k%pnP2xz&rHt&4DOpmlOO>M2n=|N6fcPacu6EgiIlt=TOJOl8{~jzNvbj=pq0)1 zvH5+kr{{o1$JXYLG>O-*-_`HE{_gL4^Ot31E)Lh0^G~1sPY-k4f29ZWa%MBj>#ZDj zm6N#uC-br;$_IFMw*;*0E(8R2w*_qMZV%Ym-4SrGyBHAJ-5GGPyPMsuQBSNaP{z}k zLbN>Q4R~4J7OjX?1}bA!fvQ+_pgL9)sEO4EYGZYQx>$XnKGqOuh&2WpV@-jkSaYD6 z^|41=Vrv3xSl$s`8*2@;vb-3TV(S9yV(SCz*|Rg+7TXZm!1Au>##noxo#oxpj#y`) zljS{8U#u(8#qwp*O|kAkH_Mktdt&~8pXI&L-q_~AW|psrZi#ITY(>6Ou8MApZ4YdZ z?Fj6MJrH<+=afp7_MjST+8Nl%b8(BZE3nhTDUKo4+~)jU+5HA@JO%bBb;@34@1Ug- z1%Z8Xjj~s+RT`AN^gJlYb(e&|ehYV)lj|>Wa)a{F8~8?a1s;|gl~%b{wxCrLS{-1m zn$fDIpw%O6#5GD6YiXC)qGeycOlcjo%dIHumnCIi(VN$y^dK8^J;rQ%!;*dPAy&2l zWgC^9x!D|++m*xUe;BjrK+hw}5xG&#tBGlJJHx2p2fYM%jc>e7TVyWo6wc z>ru*bBR}Tkm^&@7<%ksyR%I>ju||P zHEu`w02_tvh0-AV*sSdG4$Ss(_T~rh=ABA??#(Ay=`NH$n49AhqZZ%Z)Z?yG=M*Ux zio~Vi5p_7BDN1BZ37FBFZ2 z&O{Ym=#PYxx_C6HsK)cLh?dmLkB=nj@px!>I1)dry9PorMLsn$j2`0S!^ub@9*XMX zN#!deN<6ISHlxb+R2(&Uv8YmwmeeT!q@oQc;+o>K=&mP~q&j*~RTC!hKQ+so`@c!--)9kFFDu;ggD{8Lz8QLlI304kpx~mJB6F z=(XO67Nj1L3#f=hmFv7-qbhPJoD7CWlIMbhY9baKQKM*Ty%5&^mJrHk)vNkKaXBJ~ zl8SZ+Elz~aD!Pm2aFXq|?m06OiOSi%M_=)Tnn)(_Npvd))9tE~98u%pEPB#s;cWOL zq+9+rlB--2sc{WuQNnztdq4N=0~|Nbk8wlPZ`Eaj|Bz!<1s=zElPGBX*V@Loq)C{4IDn)zb@o^yabCg}N>BHll(g_UC8lT+05l0med@_$ewRza zg%61J0XP}_CechT=+G^p|3D%R_$6>wRHZ|c;t4=HTKd@lDa)qa13sJDf+_2c?0a-u zG;vW;br(LLn$#{vlIL`5REhg6>UwHt&$gotlcf7A=d$mYX=@|}%&*Kwo zy~B~=-e4pSGyr7xM&h#aTyGZ9fO5m5dS#F;A_!Os8naP1VKzJQryWEx!L7Ks>bk3& zu57x;S!_*{_9b`u~$m=463~t zT-}TWm4c>32lFMmGZ+jMde3@ zLdt@9Fu^eYKFSSwil6DpoWqN}&z8E$XhGjOC48Qdk}Qb!oC0J@=ai7FsEq%`wGmZe zEzC`k2#CQrH7O*WjKsi^*iZm-&?aNwOj1QmL6c4w!^!C^X=395D@pe&hlqjoUWm(}8^aO5 z#%Afiuw@f9y8l^?hO|U{z~|5%#x`iW^(>fXJ9bd*po9QRcVv-Qx5pGvG}&iW_faLG zlU`nk=fS8(Kmp`oz^PXS6}G9t&~PMZyh1&U21oIyeG$n7mnr9JS{AF@($#H?)g9^T zj%($&ob%O>OdPvYyKb?zBVF4uU+bF~SaQ@ZI;6Bi%2))aYsG38?dazsivj2h6)RZ4>R(}-(c;+6!_XhG#*Glr-T&QT|nQbXFA<)0!cq;93yaw()4<4mOZ z62=<0j9bTraof0k47B+Iuey>sCT+6q7YY5Gc-^XNjFT-ltR{ktJCbg*!I;B*2hSzT zN|lZZK&KBG4xCitGC=sq!2|tL7Cs1xvJAXif@C8ZAO90E%7E3+gHiNha<~NfAcsO1 zLJ=lfGFhT{HY6UfvHuY`$?(;{N$55BxWc()a#*)fs+}Ui529`2Vi2-kM1?G=5iZ#w zn}Pl7wqX*DbrFvmFg3}*1|xvrs0|p5VS-O&LWlYo75L~C_PCOaCc?Tf9D-nCgJ`Rc z>f)dpIvXRtDiCebM6?8!vCBZUnnF}F>6iKp+7S+DPa}cUP{H+V`_ZxM#}>N}q`MEi z-8SESC@uIV4ox1K?w{E>+py#)o2zY4JKArT*S#_{CpO%1S6$vawRgsP?bPJndH2?d z{@X&$^r;1*=>wr|I{B{9V&GXJu+!uiuulTx0PH5-aY-s=S00>)h}W#TOfXc-@?bp% zmVbjc!4?2YZ(-L^4uH)PC|H&P0M4OKzBf?An{RFAfEw1JO7kgyKg-F&zsyOzvQ4&s z*K)&Qjy7&dR-0`hqGVT#8P=98{q%W@rREJjS!a%wzn5Bp?37*RyiC;)!jc6dnmhCi zKGK0Ov^cP{c$S|@#LG-@kw_Mn4j(*aps%4`6rpdH+npli5rkiZ{-zn)q^c+q06wYh zHe~lLe(5L^%SoP>qLBABNgL6IBjHG5M2n6}(a3p)=8@H#x+SfEq6|h<4cs!p5ExJn z(Z3Y)#wlf;?o? zs6(;rW;1=(oE=RJ%6V8}sxY=YE`dal1}hDM{6S{XjPbVlrOy;{Vj=80lXEUA(pe^j zfN)KZpi2`u#h)pdOi zk!6qcm3^E2TT+!dNyjMJyd~v~g`VrdsQWg9VcQ9khm)zYz7T+;hXf`y0R>xqgx*vO zJq^XOISVPIVJ_-Js8b(C;`6Aao~neRAg+J~lDrwY)a}v4*|X3aY_f7@w~cvsx|f#7=S*bB$zD%US;*mbLVe#5>6VLy@OJyUy@ME9M# zrmK-Fk$V=QvTE6CuP@JZa%+8eH`P_TGB(arzsxmy>=XSf+c{e;qubyCw)*Mhg3yv3 zc}Z+#Z<`m_Es37Xo+;0w*g$&B+G~yT;7BG5s4ETGNGF65wOE#H3ZGipeJSOwM<;s9pQ7tW<^tjFVshv@sM@cVig<8QMXekEvnYivgyI0gO2v!*G<9&D986zePO= z*e1BYc9c)=pZ!9*y8E`L^78SiF%))n6 zB%@7mOWx{5Z~Hsm_BpYA&fC6J(=aK#>SSA{+ZYWj67(%l=+R!BHT;0Jm1N|?q=+kpt~a2AlSXgjw+DC$+m})FqpsC zehp)w!u`_i!JzV$U@+DE30p>$zo1S%NMHu>HqLDPh@DQB$;iTuDu-#3q;mn7L>xMDCDwF27K4 zDq1KrqGa_{*kq^;7WqkVVO0N``qd(#WmZr3Up;!|=+)y_j?a77&xz~Va(n`NlkPc6 zX1yZN_c>Q-mWGMPo;WiE-9Z=5Boa}T2&Qg@aZr5@IrULWXqyac&w0vG@^A5{k-l(= zTeetijTw=*J;Bc$%5Zd_O)j&0#?IT?X4+Qp&}NK6eTnMiF49ctT3(N&0M$WrWvgOU z1fsw|bOFe18@0iJtLDve+9{8*Q`AKT$bLjmaQ2P@1lBEzvOF^j2-^g(x*_zD3t1KjQXq{JO zjJ-DPt8d^PbiHiJt5Bs3U{g5-N4A4Rf9lAS77%LjlE)mIjC4>AoGG1&e23w|fJiP4 zj>MT~1oCJoNpd|Iw;-&WuA48?=YLirzXmHVfc0*PQDl;2*^uT?FwR2&8i^*Q&hyGB zM6)xaQYnh!>y}31QBqRKmQaXAY`D`z+fRdY!`MbyKYLpd{g?LblMaQVnsV9@P03f~ zfb6J6QVQ%<#4m_7fn7k%Yr_T?ksyLI(&v_mS2I&|j_X*sDR7}upV=fj=G`Pd7F~!! zM`Cya0(%KVsxKfhfPcbJ-5nQI2*!$<>LUFMFi(;zY}TM3!K@$~P_Hi7KUiQNVi6ZcaIK})akG-|#DATDj;RV%S#OG&kOKEv-R`u zjoIft8g&yA?9m;!chSB69rya*RyQp)_udrdn|I7tKQQNc0E8U7m;A<&SDv2}*RWj! zk#jPz1wqzyXH*?AK8i7WvZ)!0gN-JqVI^!4Q&gT?$!Y0f6Wg(PIvOS`^9e zp$L?7cJHFCA#H1zty!?O6MgDgkhT+n>iKESPvxI95rOJiwsQ6kR=HwFkC%ck1gD>z zw>6O2f9*`1?EP!ss(DL(v*|<1Qu9VumvM2P<~gD1(_n+h5+TL%DF{uEaXe^uY3L|r z|1TsfrG$GqXGKxJoVV=^FOJi*CJ`f&3<)Z024S`a-9}2iHjuK7BnNwT zk%gbgJvrfZ@k|H~eB^wUh6Au2%VGWwsQ7S*kb^iRYf$d8ic25Wlh_BcK%RVR#AIf@ zoUA)E1-2IW8coej7X}qY*6p$a#ZpnPP-llReNFeUQL?M>xeP*hh?)op1_+@q=1!a= zeqOgT=Buh#X$~Z#8DrVAV-b$fUK*D{aons6V~LvjeKhz0f7;(8`5PjI(Bxi-g3b93YK~8p#iZCz{*G=tsQW=KW!=RNy6-*nD)Co8yh=jNk ziY8z$W42cUa@b4NZ=$aOoB8j~_$N{3fiSJZyhydR;%}J*UeckVC!2M!{1$4>MC%Hi z<^rCmC%eW#se(E2lzd{L7>F1{R06Ku0IEM52Ix9ZQq)1bASv>?0 z&*)8tVJ1OdJQoR{V?CL%^divOwA?DPA;T3+;o}0|Zt3DVcqZY-C6v(&c~v&XW^qom z(V#7Ob8a#Q!jw$4bBPfU9N2peQOqx$7=@Lb31l<|4B4#3=NXGxnAjX(C8BL&f@wGN zS1Heh$fcZLAcd-Y(wB$6!_@Ons%NlmEXPn4x8t*>Y76D(oOwgQhh@qmh{0N}p>-QlY^k~qH*snG_DSJgv6Tr7MIs~t4g)(D^cg%|;(jYUl&Ro0 zblxqiw(Yo6S(mZlj)0o_ri_DfB3Io!v+YVx#z{{uuDmkirksacvo1q@;I?*^FMBE1 z#oPQd)g;sTjUC1ta+fI-Ex(AO;%FS0;22FpG!9~Lve7t1kpxg7&?QAs#H{AdVl^4f zvQq30bU)CiPivLyDS)mC0T+w$aYILRso%y#QiBZa2~iE62fT%fcwSM44UNrk-4KhF zjy!qr5O_BEiAf70M-i0#EEi|Pn4G*r3MG?jw?&Or=gi4V8gNT&01_ylaP zbvx^EXFIN8q2@HMov1md>2n}J#dkz2yWuFE6VdGM3SAC3C^@y?N zv{M)YwkCJ^bo}$`?t=YN+VQ1f!eY3Um)g4UCne(YK7l|aZTCba4gX-;G~ zF;Io6%2*C(5Zgba9L+-AL&;twg`sRjUKou*%si)Qc>3KX?k;p%G2^n?cF*)>INWCY zKcrix+-~cc-In2SyOz9p@K)Qc=YC`T$@tvvW9jY3)4c<%X71z{mZ?RiLa^1$$g?}H zRbM-IQ@b9U^X*Bu?M<)Umw^OX^LFQNw*9>4Bgz`opH1bDFarv*4UtYDQ0$Y>;xCR{ z%%L2u1)t9{QISN>xJvQCaf=15$UBA*+AQ)B_~V17Huf>OgM7_{41@p| zCweBvZbQNzn;M%Gek+J`&doPB+_Jx$jiX}5n<6^wKu<<&{y8$ApZ_CRg7%DEARdK+ zY`(M*L9(S;Par6KNn-(7S+nDUQ&|U?uMWFYEIos&L@*w6zZty!oAgMe8*N!k8xyjr zSMg3(BOv#@Qf!k`e}-m#w2KFkf%OJ>(RHnJv1@m_Yxlf&&%}}2?)oLM!tkc%GBaz_ zV&_t2BUBS26HCoKD{i~TPT*=c=mUmi7u|E)JONw=fR&`=rKoseB&KX70ibB>b4F>R z@oGcf7+or4Ocsa-6oPBgWlXVj^ku2Ylss4Y5SyoLZa{2PN8k#UpBWX?WQ$|5sV zYrZpoFPKMNzSPW>w5)v0UZNgDd`$_)4l}RAo41(H^p3(=eyk_?h}rcI?zz37Csr$$jXTGjN#b_w!h5q=%AmqoG$&`l z-t01aY5O+=u7MwAp;A7M25 z?C5X9dYX%)N^Qs6F+7=9LJ|(Gzy}tiC_ZRxh-o{^3^1A&mBLVcB7+oKuI!euwIo=i zs?acdTuM^tOx11)(dZGJ)IyL<(kB`AP@56yN=_FhrRa`}AvKP{RZ`c~Cy=m!SZ1Nr zEeTD1ii&Iz4IfwSr@RLimaP=~$^=;$RAu9cjsxW^0E+}47DB}su;ErZN@YYR*zpd- za#ll+B`Ld}YVPqrY`j-WJO*mrs>1dA_jZse`J4@GPeb0$fE68cOZ2 zkG(dw*t$L4y8Y(K`PK*1LJNX>4@@SfpP1oiwjjKBy6zoE{dXUE{qSptUqAlZ@f+Li0WmriT`XUpE?+;p z?V4x4e8;4fW`v-zx!T>g`WD28Gs0TiQ#_ew`fk=Qc%iqh?B-z4-F~Zoaqr3W-jfU7 zQ*+{}->p2zd1~%Kly_y91cz4HmOGw`57~-#A>eGKm-95;%F=A$wPc7mg%8=e2p${NnI{vK>An{JD(v%+k6QS6!%yE09zvXS%Dm8h&^m9=bY zR@=k;QsrSBt`f_?*)|>iMrT^YQ7dD#!M7gx@t!yLEQ$}M#fMt4 zs)|12w5TE*2N*ToH3*{6)`jB^ceQXVLmifo^#kHTm_+ylG`4 z%fD=c?TiB4U|oYxpn}=o9EvE5iW9Zmph#W-)BPE6DQSq8?OYjOCn$O6w^NxX|4k%J|j zohCL;15unaxh=9Y$e$FJjQXrOj|i#m(b&OSoN2_#TD1*D#p*N(6$FmU5)x9UVV*z)C!)tuT$-Vlud83;nVT51n zmBhN?#?gZDgrN|Iv%)KzW=>(lL43A^Ay!esH;-90e}QO8 z#+6kUDSai6Ls&0yV?sY?!k{U<=Ec0T#(T*ozUngE!>G3vIDmO1DJOP1-B)6WPc%p|9D9QNHxoOZ;;9iQe^A1UM1aVPWS*hTZ zcoyIC?}zV#2B)TMRE3#w?(^M6P80$hGAu7|MPkNUJd1dRaXugNl|O5pjXi$$mG319~*Gek+xT0LcKV>or#$e9k zcN&h~)D{|hu7wvHx27A8{+`(sU#zX?fo=0>r7j@RMH3fboywt~&!szaG+(d4$wf7k zHK7m_Q2&~`=WJQ(X?kQsk}9v;jTx$octA+8HH;o?Xr0=!=t0=7mq$VQAYWyF zyWr!8q|^`4ELBr#BYr@u{w}IP02;XZwTpEf>AH@&+Rke`7dQ2#@xQij(zWEST68zR z<8DrG*m2ua#q2i~?MoHaSH&wLcIVd6Lc`JdilZwwYgsuwK}{`_kAk1qtuYQVzEj(C zZR@1#gZlMGoc~h&I{IJRvRJz@UAqyYT!U-U139ayW2vTjsc|F5X>v`{NEK_%;G`k| z!mJH~NwV)JnuoGDh9nt4#O%qIXl; zyJ=3`#8|B^nw+M{a!5eWi2P<`iY$kp5L}l(_5})IN$t;}COhOo@rPv7HdH>aIXbXQ zc$YnHZ}^1sm}w}C7AAiiY$F@^{5Q1x0_4%lnH4s7Y$MgOYAeV_o2&izv>jxjf*}x} zYyE8J&Hf)Bd-K?WmxMlJKRoQ00`Q{{Otq7>Usr!s6|u45QBqY&SxWWjP+MEmKCImjjB>7=2&DA=aMurVT7cr zcTkbqTucL23B4uQ>AOT14xsDr7(czoxwgA9Ra|AwN+nm;2-dN*@xi6mHbZaUn{M3; z@7q#a=h7M<^jRfd2fDNC1>>c}ZPotlqCMnefp%F&Q->ib;b>`+1svNDc7TJ1e}qmdS>2hd&k&DDc{ReP9ftFpK`XU+ga;p86&P*-mY+9+q zk;TO|+tX{dqc{8F4J}u{dgZI=u!B0RE$+~~(!hBjiLFh$*M9fn>*KGDFSvVP{%UG_ zz4f(LxOV6E4a_$_{&zN^w){>_?NW8k^uF0Ae)#nFpPt*e6Q?4pYp0*M`t+5jr;mIc zo_jQ!JP0>%Z8=s^Q$IcOjos7T2)S-;TWaf__21+(R=#pu#%irChb&iFch_O9t(!au zE?-tn65veD>y589&hD6R^euS0KJd2Qu5X@e@z2-yvP{o>y&rO11x!;`r|b9k>hU5L zto85qZ|L7E`1nJE~$-omwSQV8kwcfE;35RZ^&vqbkv4 z!vW8rm;@5T_dZIw|3S%GN*EwH@bOj~R!H1tGWXZ%^Zo^%;DZ-z@WI33-g>99Ib*{e z8&SVLbv;Ygtp=(X^@|$IddA6jM)8Be#(b*HW| zW5XTqYu%D@P!3aTT5%$0Sbo^jNYhgPH4@*GMzq3xZXJw9+jEL$|*|L^td5*eRZ_ zLB8Hxy3I&30!5JIFMZW0tj15F({!*=V+XufFUV*Ui{MA7NDR{}i(dj0zxi8X#_!!3 z$O6faGlYnBlq2a(r$fER*gd3`}^E3mO*~qf9DRQxdVS~t@tlO>m6_H z#F0DBrpfw6XH(kQG_z~oxnaV7r%IZwo(<17q^r6nycxU5SIlh7aJbFxy4LsoeanJE8RTroE$|ECGX6LUVhC?IK$y~?NN5SwSAeM zG8^_{c+}uVHMrf{wM@6n^E}>j&CA|=>&V+De{!6?`J*}~-*%TnveIDTJ<|;<9Bvs` zCEq;TmEmx^*|bbI9JseMXDp3;^)!y&;C8Ly=7#HQ?@<=yD_i%`u14N}7iInxZb<4;(-lD`oC@DyQ3~N2mQb%$>1O2}qi|dV1H)(R6it+SQR^?Lpn_ zu4N~yuj97wf{@7Dm&)rh?B2bZ-S5~cmu)D|H0{RnPh~jVuBF)R*15NzPw#(vnTl3Y YyoK+bPSFy3KXOHQ-gS?olmXNK1rasJ8UO$Q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fffc352f4b0f2222ba68439121309e590c04d45b GIT binary patch literal 40753 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32f09258ec8e68a7ed6939948a53a5ce35d61c84 GIT binary patch literal 12622 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 Rc-1qUvyE)kqmVQ5{{h5p?>ztj literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/index/collector.py b/myenv/lib/python3.12/site-packages/pip/_internal/index/collector.py new file mode 100644 index 0000000..08c8bdd --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/index/collector.py @@ -0,0 +1,507 @@ +""" +The main purpose of this module is to expose LinkCollector.collect_sources(). +""" + +import collections +import email.message +import functools +import itertools +import json +import logging +import os +import urllib.parse +import urllib.request +from html.parser import HTMLParser +from optparse import Values +from typing import ( + TYPE_CHECKING, + Callable, + Dict, + Iterable, + List, + MutableMapping, + NamedTuple, + Optional, + Sequence, + Tuple, + Union, +) + +from pip._vendor import requests +from pip._vendor.requests import Response +from pip._vendor.requests.exceptions import RetryError, SSLError + +from pip._internal.exceptions import NetworkConnectionError +from pip._internal.models.link import Link +from pip._internal.models.search_scope import SearchScope +from pip._internal.network.session import PipSession +from pip._internal.network.utils import raise_for_status +from pip._internal.utils.filetypes import is_archive_file +from pip._internal.utils.misc import redact_auth_from_url +from pip._internal.vcs import vcs + +from .sources import CandidatesFromPage, LinkSource, build_source + +if TYPE_CHECKING: + from typing import Protocol +else: + Protocol = object + +logger = logging.getLogger(__name__) + +ResponseHeaders = MutableMapping[str, str] + + +def _match_vcs_scheme(url: str) -> Optional[str]: + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + for scheme in vcs.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in "+:": + return scheme + return None + + +class _NotAPIContent(Exception): + def __init__(self, content_type: str, request_desc: str) -> None: + super().__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_api_header(response: Response) -> None: + """ + Check the Content-Type header to ensure the response contains a Simple + API Response. + + Raises `_NotAPIContent` if the content type is not a valid content-type. + """ + content_type = response.headers.get("Content-Type", "Unknown") + + content_type_l = content_type.lower() + if content_type_l.startswith( + ( + "text/html", + "application/vnd.pypi.simple.v1+html", + "application/vnd.pypi.simple.v1+json", + ) + ): + return + + raise _NotAPIContent(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_api_response(url: str, session: PipSession) -> None: + """ + Send a HEAD request to the URL, and ensure the response contains a simple + API Response. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotAPIContent` if the content type is not a valid content type. + """ + scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) + if scheme not in {"http", "https"}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + raise_for_status(resp) + + _ensure_api_header(resp) + + +def _get_simple_response(url: str, session: PipSession) -> Response: + """Access an Simple API response with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML or Simple API, to avoid downloading a + large file. Raise `_NotHTTP` if the content type cannot be determined, or + `_NotAPIContent` if it is not HTML or a Simple API. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got a Simple API response, + and raise `_NotAPIContent` otherwise. + """ + if is_archive_file(Link(url).filename): + _ensure_api_response(url, session=session) + + logger.debug("Getting page %s", redact_auth_from_url(url)) + + resp = session.get( + url, + headers={ + "Accept": ", ".join( + [ + "application/vnd.pypi.simple.v1+json", + "application/vnd.pypi.simple.v1+html; q=0.1", + "text/html; q=0.01", + ] + ), + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + raise_for_status(resp) + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is a + # Simple API response or not. However we can check after we've + # downloaded it. + _ensure_api_header(resp) + + logger.debug( + "Fetched page %s as %s", + redact_auth_from_url(url), + resp.headers.get("Content-Type", "Unknown"), + ) + + return resp + + +def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]: + """Determine if we have any encoding information in our headers.""" + if headers and "Content-Type" in headers: + m = email.message.Message() + m["content-type"] = headers["Content-Type"] + charset = m.get_param("charset") + if charset: + return str(charset) + return None + + +class CacheablePageContent: + def __init__(self, page: "IndexContent") -> None: + assert page.cache_link_parsing + self.page = page + + def __eq__(self, other: object) -> bool: + return isinstance(other, type(self)) and self.page.url == other.page.url + + def __hash__(self) -> int: + return hash(self.page.url) + + +class ParseLinks(Protocol): + def __call__(self, page: "IndexContent") -> Iterable[Link]: + ... + + +def with_cached_index_content(fn: ParseLinks) -> ParseLinks: + """ + Given a function that parses an Iterable[Link] from an IndexContent, cache the + function's result (keyed by CacheablePageContent), unless the IndexContent + `page` has `page.cache_link_parsing == False`. + """ + + @functools.lru_cache(maxsize=None) + def wrapper(cacheable_page: CacheablePageContent) -> List[Link]: + return list(fn(cacheable_page.page)) + + @functools.wraps(fn) + def wrapper_wrapper(page: "IndexContent") -> List[Link]: + if page.cache_link_parsing: + return wrapper(CacheablePageContent(page)) + return list(fn(page)) + + return wrapper_wrapper + + +@with_cached_index_content +def parse_links(page: "IndexContent") -> Iterable[Link]: + """ + Parse a Simple API's Index Content, and yield its anchor elements as Link objects. + """ + + content_type_l = page.content_type.lower() + if content_type_l.startswith("application/vnd.pypi.simple.v1+json"): + data = json.loads(page.content) + for file in data.get("files", []): + link = Link.from_json(file, page.url) + if link is None: + continue + yield link + return + + parser = HTMLLinkParser(page.url) + encoding = page.encoding or "utf-8" + parser.feed(page.content.decode(encoding)) + + url = page.url + base_url = parser.base_url or url + for anchor in parser.anchors: + link = Link.from_element(anchor, page_url=url, base_url=base_url) + if link is None: + continue + yield link + + +class IndexContent: + """Represents one response (or page), along with its URL""" + + def __init__( + self, + content: bytes, + content_type: str, + encoding: Optional[str], + url: str, + cache_link_parsing: bool = True, + ) -> None: + """ + :param encoding: the encoding to decode the given content. + :param url: the URL from which the HTML was downloaded. + :param cache_link_parsing: whether links parsed from this page's url + should be cached. PyPI index urls should + have this set to False, for example. + """ + self.content = content + self.content_type = content_type + self.encoding = encoding + self.url = url + self.cache_link_parsing = cache_link_parsing + + def __str__(self) -> str: + return redact_auth_from_url(self.url) + + +class HTMLLinkParser(HTMLParser): + """ + HTMLParser that keeps the first base HREF and a list of all anchor + elements' attributes. + """ + + def __init__(self, url: str) -> None: + super().__init__(convert_charrefs=True) + + self.url: str = url + self.base_url: Optional[str] = None + self.anchors: List[Dict[str, Optional[str]]] = [] + + def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None: + if tag == "base" and self.base_url is None: + href = self.get_href(attrs) + if href is not None: + self.base_url = href + elif tag == "a": + self.anchors.append(dict(attrs)) + + def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]: + for name, value in attrs: + if name == "href": + return value + return None + + +def _handle_get_simple_fail( + link: Link, + reason: Union[str, Exception], + meth: Optional[Callable[..., None]] = None, +) -> None: + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _make_index_content( + response: Response, cache_link_parsing: bool = True +) -> IndexContent: + encoding = _get_encoding_from_headers(response.headers) + return IndexContent( + response.content, + response.headers["Content-Type"], + encoding=encoding, + url=response.url, + cache_link_parsing=cache_link_parsing, + ) + + +def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]: + url = link.url.split("#", 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.warning( + "Cannot look at %s URL %s because it does not support lookup as web pages.", + vcs_scheme, + link, + ) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib.parse.urlparse(url) + if scheme == "file" and os.path.isdir(urllib.request.url2pathname(path)): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith("/"): + url += "/" + # TODO: In the future, it would be nice if pip supported PEP 691 + # style responses in the file:// URLs, however there's no + # standard file extension for application/vnd.pypi.simple.v1+json + # so we'll need to come up with something on our own. + url = urllib.parse.urljoin(url, "index.html") + logger.debug(" file: URL is directory, getting %s", url) + + try: + resp = _get_simple_response(url, session=session) + except _NotHTTP: + logger.warning( + "Skipping page %s because it looks like an archive, and cannot " + "be checked by a HTTP HEAD request.", + link, + ) + except _NotAPIContent as exc: + logger.warning( + "Skipping page %s because the %s request got Content-Type: %s. " + "The only supported Content-Types are application/vnd.pypi.simple.v1+json, " + "application/vnd.pypi.simple.v1+html, and text/html", + link, + exc.request_desc, + exc.content_type, + ) + except NetworkConnectionError as exc: + _handle_get_simple_fail(link, exc) + except RetryError as exc: + _handle_get_simple_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_simple_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_simple_fail(link, f"connection error: {exc}") + except requests.Timeout: + _handle_get_simple_fail(link, "timed out") + else: + return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing) + return None + + +class CollectedSources(NamedTuple): + find_links: Sequence[Optional[LinkSource]] + index_urls: Sequence[Optional[LinkSource]] + + +class LinkCollector: + + """ + Responsible for collecting Link objects from all configured locations, + making network requests as needed. + + The class's main method is its collect_sources() method. + """ + + def __init__( + self, + session: PipSession, + search_scope: SearchScope, + ) -> None: + self.search_scope = search_scope + self.session = session + + @classmethod + def create( + cls, + session: PipSession, + options: Values, + suppress_no_index: bool = False, + ) -> "LinkCollector": + """ + :param session: The Session to use to make requests. + :param suppress_no_index: Whether to ignore the --no-index option + when constructing the SearchScope object. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index and not suppress_no_index: + logger.debug( + "Ignoring indexes: %s", + ",".join(redact_auth_from_url(url) for url in index_urls), + ) + index_urls = [] + + # Make sure find_links is a list before passing to create(). + find_links = options.find_links or [] + + search_scope = SearchScope.create( + find_links=find_links, + index_urls=index_urls, + no_index=options.no_index, + ) + link_collector = LinkCollector( + session=session, + search_scope=search_scope, + ) + return link_collector + + @property + def find_links(self) -> List[str]: + return self.search_scope.find_links + + def fetch_response(self, location: Link) -> Optional[IndexContent]: + """ + Fetch an HTML page containing package links. + """ + return _get_index_content(location, session=self.session) + + def collect_sources( + self, + project_name: str, + candidates_from_page: CandidatesFromPage, + ) -> CollectedSources: + # The OrderedDict calls deduplicate sources by URL. + index_url_sources = collections.OrderedDict( + build_source( + loc, + candidates_from_page=candidates_from_page, + page_validator=self.session.is_secure_origin, + expand_dir=False, + cache_link_parsing=False, + project_name=project_name, + ) + for loc in self.search_scope.get_index_urls_locations(project_name) + ).values() + find_links_sources = collections.OrderedDict( + build_source( + loc, + candidates_from_page=candidates_from_page, + page_validator=self.session.is_secure_origin, + expand_dir=True, + cache_link_parsing=True, + project_name=project_name, + ) + for loc in self.find_links + ).values() + + if logger.isEnabledFor(logging.DEBUG): + lines = [ + f"* {s.link}" + for s in itertools.chain(find_links_sources, index_url_sources) + if s is not None and s.link is not None + ] + lines = [ + f"{len(lines)} location(s) to search " + f"for versions of {project_name}:" + ] + lines + logger.debug("\n".join(lines)) + + return CollectedSources( + find_links=list(find_links_sources), + index_urls=list(index_url_sources), + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py b/myenv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py new file mode 100644 index 0000000..ec9ebc3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py @@ -0,0 +1,1027 @@ +"""Routines related to PyPI, indexes""" + +import enum +import functools +import itertools +import logging +import re +from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union + +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.tags import Tag +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import _BaseVersion +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, + DistributionNotFound, + InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.index.collector import LinkCollector, parse_links +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.link import Link +from pip._internal.models.search_scope import SearchScope +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.models.wheel import Wheel +from pip._internal.req import InstallRequirement +from pip._internal.utils._log import getLogger +from pip._internal.utils.filetypes import WHEEL_EXTENSION +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import build_netloc +from pip._internal.utils.packaging import check_requires_python +from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS + +if TYPE_CHECKING: + from pip._vendor.typing_extensions import TypeGuard + +__all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"] + + +logger = getLogger(__name__) + +BuildTag = Union[Tuple[()], Tuple[int, str]] +CandidateSortingKey = Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag] + + +def _check_link_requires_python( + link: Link, + version_info: Tuple[int, int, int], + ignore_requires_python: bool = False, +) -> bool: + """ + Return whether the given Python version is compatible with a link's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + """ + try: + is_compatible = check_requires_python( + link.requires_python, + version_info=version_info, + ) + except specifiers.InvalidSpecifier: + logger.debug( + "Ignoring invalid Requires-Python (%r) for link: %s", + link.requires_python, + link, + ) + else: + if not is_compatible: + version = ".".join(map(str, version_info)) + if not ignore_requires_python: + logger.verbose( + "Link requires a different Python (%s not in: %r): %s", + version, + link.requires_python, + link, + ) + return False + + logger.debug( + "Ignoring failed Requires-Python check (%s not in: %r) for link: %s", + version, + link.requires_python, + link, + ) + + return True + + +class LinkType(enum.Enum): + candidate = enum.auto() + different_project = enum.auto() + yanked = enum.auto() + format_unsupported = enum.auto() + format_invalid = enum.auto() + platform_mismatch = enum.auto() + requires_python_mismatch = enum.auto() + + +class LinkEvaluator: + + """ + Responsible for evaluating links for a particular project. + """ + + _py_version_re = re.compile(r"-py([123]\.?[0-9]?)$") + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + project_name: str, + canonical_name: str, + formats: FrozenSet[str], + target_python: TargetPython, + allow_yanked: bool, + ignore_requires_python: Optional[bool] = None, + ) -> None: + """ + :param project_name: The user supplied package name. + :param canonical_name: The canonical package name. + :param formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. + :param target_python: The target Python interpreter to use when + evaluating link compatibility. This is used, for example, to + check wheel compatibility, as well as when checking the Python + version, e.g. the Python version embedded in a link filename + (or egg fragment) and against an HTML link's optional PEP 503 + "data-requires-python" attribute. + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param ignore_requires_python: Whether to ignore incompatible + PEP 503 "data-requires-python" values in HTML links. Defaults + to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self._allow_yanked = allow_yanked + self._canonical_name = canonical_name + self._ignore_requires_python = ignore_requires_python + self._formats = formats + self._target_python = target_python + + self.project_name = project_name + + def evaluate_link(self, link: Link) -> Tuple[LinkType, str]: + """ + Determine whether a link is a candidate for installation. + + :return: A tuple (result, detail), where *result* is an enum + representing whether the evaluation found a candidate, or the reason + why one is not found. If a candidate is found, *detail* will be the + candidate's version string; if one is not found, it contains the + reason the link fails to qualify. + """ + version = None + if link.is_yanked and not self._allow_yanked: + reason = link.yanked_reason or "" + return (LinkType.yanked, f"yanked for reason: {reason}") + + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + return (LinkType.format_unsupported, "not a file") + if ext not in SUPPORTED_EXTENSIONS: + return ( + LinkType.format_unsupported, + f"unsupported archive format: {ext}", + ) + if "binary" not in self._formats and ext == WHEEL_EXTENSION: + reason = f"No binaries permitted for {self.project_name}" + return (LinkType.format_unsupported, reason) + if "macosx10" in link.path and ext == ".zip": + return (LinkType.format_unsupported, "macosx10 one") + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + return ( + LinkType.format_invalid, + "invalid wheel filename", + ) + if canonicalize_name(wheel.name) != self._canonical_name: + reason = f"wrong project name (not {self.project_name})" + return (LinkType.different_project, reason) + + supported_tags = self._target_python.get_unsorted_tags() + if not wheel.supported(supported_tags): + # Include the wheel's tags in the reason string to + # simplify troubleshooting compatibility issues. + file_tags = ", ".join(wheel.get_formatted_file_tags()) + reason = ( + f"none of the wheel's tags ({file_tags}) are compatible " + f"(run pip debug --verbose to show compatible tags)" + ) + return (LinkType.platform_mismatch, reason) + + version = wheel.version + + # This should be up by the self.ok_binary check, but see issue 2700. + if "source" not in self._formats and ext != WHEEL_EXTENSION: + reason = f"No sources permitted for {self.project_name}" + return (LinkType.format_unsupported, reason) + + if not version: + version = _extract_version_from_fragment( + egg_info, + self._canonical_name, + ) + if not version: + reason = f"Missing project version for {self.project_name}" + return (LinkType.format_invalid, reason) + + match = self._py_version_re.search(version) + if match: + version = version[: match.start()] + py_version = match.group(1) + if py_version != self._target_python.py_version: + return ( + LinkType.platform_mismatch, + "Python version is incorrect", + ) + + supports_python = _check_link_requires_python( + link, + version_info=self._target_python.py_version_info, + ignore_requires_python=self._ignore_requires_python, + ) + if not supports_python: + reason = f"{version} Requires-Python {link.requires_python}" + return (LinkType.requires_python_mismatch, reason) + + logger.debug("Found link %s, version: %s", link, version) + + return (LinkType.candidate, version) + + +def filter_unallowed_hashes( + candidates: List[InstallationCandidate], + hashes: Optional[Hashes], + project_name: str, +) -> List[InstallationCandidate]: + """ + Filter out candidates whose hashes aren't allowed, and return a new + list of candidates. + + If at least one candidate has an allowed hash, then all candidates with + either an allowed hash or no hash specified are returned. Otherwise, + the given candidates are returned. + + Including the candidates with no hash specified when there is a match + allows a warning to be logged if there is a more preferred candidate + with no hash specified. Returning all candidates in the case of no + matches lets pip report the hash of the candidate that would otherwise + have been installed (e.g. permitting the user to more easily update + their requirements file with the desired hash). + """ + if not hashes: + logger.debug( + "Given no hashes to check %s links for project %r: " + "discarding no candidates", + len(candidates), + project_name, + ) + # Make sure we're not returning back the given value. + return list(candidates) + + matches_or_no_digest = [] + # Collect the non-matches for logging purposes. + non_matches = [] + match_count = 0 + for candidate in candidates: + link = candidate.link + if not link.has_hash: + pass + elif link.is_hash_allowed(hashes=hashes): + match_count += 1 + else: + non_matches.append(candidate) + continue + + matches_or_no_digest.append(candidate) + + if match_count: + filtered = matches_or_no_digest + else: + # Make sure we're not returning back the given value. + filtered = list(candidates) + + if len(filtered) == len(candidates): + discard_message = "discarding no candidates" + else: + discard_message = "discarding {} non-matches:\n {}".format( + len(non_matches), + "\n ".join(str(candidate.link) for candidate in non_matches), + ) + + logger.debug( + "Checked %s links for project %r against %s hashes " + "(%s matches, %s no digest): %s", + len(candidates), + project_name, + hashes.digest_count, + match_count, + len(matches_or_no_digest) - match_count, + discard_message, + ) + + return filtered + + +class CandidatePreferences: + + """ + Encapsulates some of the preferences for filtering and sorting + InstallationCandidate objects. + """ + + def __init__( + self, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + ) -> None: + """ + :param allow_all_prereleases: Whether to allow all pre-releases. + """ + self.allow_all_prereleases = allow_all_prereleases + self.prefer_binary = prefer_binary + + +class BestCandidateResult: + """A collection of candidates, returned by `PackageFinder.find_best_candidate`. + + This class is only intended to be instantiated by CandidateEvaluator's + `compute_best_candidate()` method. + """ + + def __init__( + self, + candidates: List[InstallationCandidate], + applicable_candidates: List[InstallationCandidate], + best_candidate: Optional[InstallationCandidate], + ) -> None: + """ + :param candidates: A sequence of all available candidates found. + :param applicable_candidates: The applicable candidates. + :param best_candidate: The most preferred candidate found, or None + if no applicable candidates were found. + """ + assert set(applicable_candidates) <= set(candidates) + + if best_candidate is None: + assert not applicable_candidates + else: + assert best_candidate in applicable_candidates + + self._applicable_candidates = applicable_candidates + self._candidates = candidates + + self.best_candidate = best_candidate + + def iter_all(self) -> Iterable[InstallationCandidate]: + """Iterate through all candidates.""" + return iter(self._candidates) + + def iter_applicable(self) -> Iterable[InstallationCandidate]: + """Iterate through the applicable candidates.""" + return iter(self._applicable_candidates) + + +class CandidateEvaluator: + + """ + Responsible for filtering and sorting candidates for installation based + on what tags are valid. + """ + + @classmethod + def create( + cls, + project_name: str, + target_python: Optional[TargetPython] = None, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> "CandidateEvaluator": + """Create a CandidateEvaluator object. + + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + :param hashes: An optional collection of allowed hashes. + """ + if target_python is None: + target_python = TargetPython() + if specifier is None: + specifier = specifiers.SpecifierSet() + + supported_tags = target_python.get_sorted_tags() + + return cls( + project_name=project_name, + supported_tags=supported_tags, + specifier=specifier, + prefer_binary=prefer_binary, + allow_all_prereleases=allow_all_prereleases, + hashes=hashes, + ) + + def __init__( + self, + project_name: str, + supported_tags: List[Tag], + specifier: specifiers.BaseSpecifier, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + hashes: Optional[Hashes] = None, + ) -> None: + """ + :param supported_tags: The PEP 425 tags supported by the target + Python in order of preference (most preferred first). + """ + self._allow_all_prereleases = allow_all_prereleases + self._hashes = hashes + self._prefer_binary = prefer_binary + self._project_name = project_name + self._specifier = specifier + self._supported_tags = supported_tags + # Since the index of the tag in the _supported_tags list is used + # as a priority, precompute a map from tag to index/priority to be + # used in wheel.find_most_preferred_tag. + self._wheel_tag_preferences = { + tag: idx for idx, tag in enumerate(supported_tags) + } + + def get_applicable_candidates( + self, + candidates: List[InstallationCandidate], + ) -> List[InstallationCandidate]: + """ + Return the applicable candidates from a list of candidates. + """ + # Using None infers from the specifier instead. + allow_prereleases = self._allow_all_prereleases or None + specifier = self._specifier + versions = { + str(v) + for v in specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + (str(c.version) for c in candidates), + prereleases=allow_prereleases, + ) + } + + # Again, converting version to str to deal with debundling. + applicable_candidates = [c for c in candidates if str(c.version) in versions] + + filtered_applicable_candidates = filter_unallowed_hashes( + candidates=applicable_candidates, + hashes=self._hashes, + project_name=self._project_name, + ) + + return sorted(filtered_applicable_candidates, key=self._sort_key) + + def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey: + """ + Function to pass as the `key` argument to a call to sorted() to sort + InstallationCandidates by preference. + + Returns a tuple such that tuples sorting as greater using Python's + default comparison operator are more preferred. + + The preference is as follows: + + First and foremost, candidates with allowed (matching) hashes are + always preferred over candidates without matching hashes. This is + because e.g. if the only candidate with an allowed hash is yanked, + we still want to use that candidate. + + Second, excepting hash considerations, candidates that have been + yanked (in the sense of PEP 592) are always less preferred than + candidates that haven't been yanked. Then: + + If not finding wheels, they are sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self._supported_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + valid_tags = self._supported_tags + support_num = len(valid_tags) + build_tag: BuildTag = () + binary_preference = 0 + link = candidate.link + if link.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(link.filename) + try: + pri = -( + wheel.find_most_preferred_tag( + valid_tags, self._wheel_tag_preferences + ) + ) + except ValueError: + raise UnsupportedWheel( + f"{wheel.filename} is not a supported wheel for this platform. It " + "can't be sorted." + ) + if self._prefer_binary: + binary_preference = 1 + if wheel.build_tag is not None: + match = re.match(r"^(\d+)(.*)$", wheel.build_tag) + assert match is not None, "guaranteed by filename validation" + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + has_allowed_hash = int(link.is_hash_allowed(self._hashes)) + yank_value = -1 * int(link.is_yanked) # -1 for yanked. + return ( + has_allowed_hash, + yank_value, + binary_preference, + candidate.version, + pri, + build_tag, + ) + + def sort_best_candidate( + self, + candidates: List[InstallationCandidate], + ) -> Optional[InstallationCandidate]: + """ + Return the best candidate per the instance's sort order, or None if + no candidate is acceptable. + """ + if not candidates: + return None + best_candidate = max(candidates, key=self._sort_key) + return best_candidate + + def compute_best_candidate( + self, + candidates: List[InstallationCandidate], + ) -> BestCandidateResult: + """ + Compute and return a `BestCandidateResult` instance. + """ + applicable_candidates = self.get_applicable_candidates(candidates) + + best_candidate = self.sort_best_candidate(applicable_candidates) + + return BestCandidateResult( + candidates, + applicable_candidates=applicable_candidates, + best_candidate=best_candidate, + ) + + +class PackageFinder: + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__( + self, + link_collector: LinkCollector, + target_python: TargetPython, + allow_yanked: bool, + format_control: Optional[FormatControl] = None, + candidate_prefs: Optional[CandidatePreferences] = None, + ignore_requires_python: Optional[bool] = None, + ) -> None: + """ + This constructor is primarily meant to be used by the create() class + method and from tests. + + :param format_control: A FormatControl object, used to control + the selection of source packages / binary packages when consulting + the index and links. + :param candidate_prefs: Options to use when creating a + CandidateEvaluator object. + """ + if candidate_prefs is None: + candidate_prefs = CandidatePreferences() + + format_control = format_control or FormatControl(set(), set()) + + self._allow_yanked = allow_yanked + self._candidate_prefs = candidate_prefs + self._ignore_requires_python = ignore_requires_python + self._link_collector = link_collector + self._target_python = target_python + + self.format_control = format_control + + # These are boring links that have already been logged somehow. + self._logged_links: Set[Tuple[Link, LinkType, str]] = set() + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + @classmethod + def create( + cls, + link_collector: LinkCollector, + selection_prefs: SelectionPreferences, + target_python: Optional[TargetPython] = None, + ) -> "PackageFinder": + """Create a PackageFinder. + + :param selection_prefs: The candidate selection preferences, as a + SelectionPreferences object. + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + """ + if target_python is None: + target_python = TargetPython() + + candidate_prefs = CandidatePreferences( + prefer_binary=selection_prefs.prefer_binary, + allow_all_prereleases=selection_prefs.allow_all_prereleases, + ) + + return cls( + candidate_prefs=candidate_prefs, + link_collector=link_collector, + target_python=target_python, + allow_yanked=selection_prefs.allow_yanked, + format_control=selection_prefs.format_control, + ignore_requires_python=selection_prefs.ignore_requires_python, + ) + + @property + def target_python(self) -> TargetPython: + return self._target_python + + @property + def search_scope(self) -> SearchScope: + return self._link_collector.search_scope + + @search_scope.setter + def search_scope(self, search_scope: SearchScope) -> None: + self._link_collector.search_scope = search_scope + + @property + def find_links(self) -> List[str]: + return self._link_collector.find_links + + @property + def index_urls(self) -> List[str]: + return self.search_scope.index_urls + + @property + def trusted_hosts(self) -> Iterable[str]: + for host_port in self._link_collector.session.pip_trusted_origins: + yield build_netloc(*host_port) + + @property + def allow_all_prereleases(self) -> bool: + return self._candidate_prefs.allow_all_prereleases + + def set_allow_all_prereleases(self) -> None: + self._candidate_prefs.allow_all_prereleases = True + + @property + def prefer_binary(self) -> bool: + return self._candidate_prefs.prefer_binary + + def set_prefer_binary(self) -> None: + self._candidate_prefs.prefer_binary = True + + def requires_python_skipped_reasons(self) -> List[str]: + reasons = { + detail + for _, result, detail in self._logged_links + if result == LinkType.requires_python_mismatch + } + return sorted(reasons) + + def make_link_evaluator(self, project_name: str) -> LinkEvaluator: + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + + return LinkEvaluator( + project_name=project_name, + canonical_name=canonical_name, + formats=formats, + target_python=self._target_python, + allow_yanked=self._allow_yanked, + ignore_requires_python=self._ignore_requires_python, + ) + + def _sort_links(self, links: Iterable[Link]) -> List[Link]: + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen: Set[Link] = set() + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _log_skipped_link(self, link: Link, result: LinkType, detail: str) -> None: + entry = (link, result, detail) + if entry not in self._logged_links: + # Put the link at the end so the reason is more visible and because + # the link string is usually very long. + logger.debug("Skipping link: %s: %s", detail, link) + self._logged_links.add(entry) + + def get_install_candidate( + self, link_evaluator: LinkEvaluator, link: Link + ) -> Optional[InstallationCandidate]: + """ + If the link is a candidate for install, convert it to an + InstallationCandidate and return it. Otherwise, return None. + """ + result, detail = link_evaluator.evaluate_link(link) + if result != LinkType.candidate: + self._log_skipped_link(link, result, detail) + return None + + return InstallationCandidate( + name=link_evaluator.project_name, + link=link, + version=detail, + ) + + def evaluate_links( + self, link_evaluator: LinkEvaluator, links: Iterable[Link] + ) -> List[InstallationCandidate]: + """ + Convert links that are candidates to InstallationCandidate objects. + """ + candidates = [] + for link in self._sort_links(links): + candidate = self.get_install_candidate(link_evaluator, link) + if candidate is not None: + candidates.append(candidate) + + return candidates + + def process_project_url( + self, project_url: Link, link_evaluator: LinkEvaluator + ) -> List[InstallationCandidate]: + logger.debug( + "Fetching project page and analyzing links: %s", + project_url, + ) + index_response = self._link_collector.fetch_response(project_url) + if index_response is None: + return [] + + page_links = list(parse_links(index_response)) + + with indent_log(): + package_links = self.evaluate_links( + link_evaluator, + links=page_links, + ) + + return package_links + + @functools.lru_cache(maxsize=None) + def find_all_candidates(self, project_name: str) -> List[InstallationCandidate]: + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_links. + All versions found are returned as an InstallationCandidate list. + + See LinkEvaluator.evaluate_link() for details on which files + are accepted. + """ + link_evaluator = self.make_link_evaluator(project_name) + + collected_sources = self._link_collector.collect_sources( + project_name=project_name, + candidates_from_page=functools.partial( + self.process_project_url, + link_evaluator=link_evaluator, + ), + ) + + page_candidates_it = itertools.chain.from_iterable( + source.page_candidates() + for sources in collected_sources + for source in sources + if source is not None + ) + page_candidates = list(page_candidates_it) + + file_links_it = itertools.chain.from_iterable( + source.file_links() + for sources in collected_sources + for source in sources + if source is not None + ) + file_candidates = self.evaluate_links( + link_evaluator, + sorted(file_links_it, reverse=True), + ) + + if logger.isEnabledFor(logging.DEBUG) and file_candidates: + paths = [] + for candidate in file_candidates: + assert candidate.link.url # we need to have a URL + try: + paths.append(candidate.link.file_path) + except Exception: + paths.append(candidate.link.url) # it's not a local file + + logger.debug("Local files found: %s", ", ".join(paths)) + + # This is an intentional priority ordering + return file_candidates + page_candidates + + def make_candidate_evaluator( + self, + project_name: str, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> CandidateEvaluator: + """Create a CandidateEvaluator object to use.""" + candidate_prefs = self._candidate_prefs + return CandidateEvaluator.create( + project_name=project_name, + target_python=self._target_python, + prefer_binary=candidate_prefs.prefer_binary, + allow_all_prereleases=candidate_prefs.allow_all_prereleases, + specifier=specifier, + hashes=hashes, + ) + + @functools.lru_cache(maxsize=None) + def find_best_candidate( + self, + project_name: str, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> BestCandidateResult: + """Find matches for the given project and specifier. + + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + + :return: A `BestCandidateResult` instance. + """ + candidates = self.find_all_candidates(project_name) + candidate_evaluator = self.make_candidate_evaluator( + project_name=project_name, + specifier=specifier, + hashes=hashes, + ) + return candidate_evaluator.compute_best_candidate(candidates) + + def find_requirement( + self, req: InstallRequirement, upgrade: bool + ) -> Optional[InstallationCandidate]: + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a InstallationCandidate if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + hashes = req.hashes(trust_internet=False) + best_candidate_result = self.find_best_candidate( + req.name, + specifier=req.specifier, + hashes=hashes, + ) + best_candidate = best_candidate_result.best_candidate + + installed_version: Optional[_BaseVersion] = None + if req.satisfied_by is not None: + installed_version = req.satisfied_by.version + + def _format_versions(cand_iter: Iterable[InstallationCandidate]) -> str: + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ( + ", ".join( + sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + ) + ) + or "none" + ) + + if installed_version is None and best_candidate is None: + logger.critical( + "Could not find a version that satisfies the requirement %s " + "(from versions: %s)", + req, + _format_versions(best_candidate_result.iter_all()), + ) + + raise DistributionNotFound(f"No matching distribution found for {req}") + + def _should_install_candidate( + candidate: Optional[InstallationCandidate], + ) -> "TypeGuard[InstallationCandidate]": + if installed_version is None: + return True + if best_candidate is None: + return False + return best_candidate.version > installed_version + + if not upgrade and installed_version is not None: + if _should_install_candidate(best_candidate): + logger.debug( + "Existing installed version (%s) satisfies requirement " + "(most up-to-date version is %s)", + installed_version, + best_candidate.version, + ) + else: + logger.debug( + "Existing installed version (%s) is most up-to-date and " + "satisfies requirement", + installed_version, + ) + return None + + if _should_install_candidate(best_candidate): + logger.debug( + "Using version %s (newest of versions: %s)", + best_candidate.version, + _format_versions(best_candidate_result.iter_applicable()), + ) + return best_candidate + + # We have an existing version, and its the best version + logger.debug( + "Installed version (%s) is most up-to-date (past versions: %s)", + installed_version, + _format_versions(best_candidate_result.iter_applicable()), + ) + raise BestVersionAlreadyInstalled + + +def _find_name_version_sep(fragment: str, canonical_name: str) -> int: + """Find the separator's index based on the package's canonical name. + + :param fragment: A + filename "fragment" (stem) or + egg fragment. + :param canonical_name: The package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> fragment = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(fragment, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(fragment): + if c != "-": + continue + if canonicalize_name(fragment[:i]) == canonical_name: + return i + raise ValueError(f"{fragment} does not match {canonical_name}") + + +def _extract_version_from_fragment(fragment: str, canonical_name: str) -> Optional[str]: + """Parse the version string from a + filename + "fragment" (stem) or egg fragment. + + :param fragment: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(fragment, canonical_name) + 1 + except ValueError: + return None + version = fragment[version_start:] + if not version: + return None + return version diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/index/sources.py b/myenv/lib/python3.12/site-packages/pip/_internal/index/sources.py new file mode 100644 index 0000000..f4626d7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/index/sources.py @@ -0,0 +1,285 @@ +import logging +import mimetypes +import os +from collections import defaultdict +from typing import Callable, Dict, Iterable, List, Optional, Tuple + +from pip._vendor.packaging.utils import ( + InvalidSdistFilename, + InvalidVersion, + InvalidWheelFilename, + canonicalize_name, + parse_sdist_filename, + parse_wheel_filename, +) + +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.link import Link +from pip._internal.utils.urls import path_to_url, url_to_path +from pip._internal.vcs import is_url + +logger = logging.getLogger(__name__) + +FoundCandidates = Iterable[InstallationCandidate] +FoundLinks = Iterable[Link] +CandidatesFromPage = Callable[[Link], Iterable[InstallationCandidate]] +PageValidator = Callable[[Link], bool] + + +class LinkSource: + @property + def link(self) -> Optional[Link]: + """Returns the underlying link, if there's one.""" + raise NotImplementedError() + + def page_candidates(self) -> FoundCandidates: + """Candidates found by parsing an archive listing HTML file.""" + raise NotImplementedError() + + def file_links(self) -> FoundLinks: + """Links found by specifying archives directly.""" + raise NotImplementedError() + + +def _is_html_file(file_url: str) -> bool: + return mimetypes.guess_type(file_url, strict=False)[0] == "text/html" + + +class _FlatDirectoryToUrls: + """Scans directory and caches results""" + + def __init__(self, path: str) -> None: + self._path = path + self._page_candidates: List[str] = [] + self._project_name_to_urls: Dict[str, List[str]] = defaultdict(list) + self._scanned_directory = False + + def _scan_directory(self) -> None: + """Scans directory once and populates both page_candidates + and project_name_to_urls at the same time + """ + for entry in os.scandir(self._path): + url = path_to_url(entry.path) + if _is_html_file(url): + self._page_candidates.append(url) + continue + + # File must have a valid wheel or sdist name, + # otherwise not worth considering as a package + try: + project_filename = parse_wheel_filename(entry.name)[0] + except (InvalidWheelFilename, InvalidVersion): + try: + project_filename = parse_sdist_filename(entry.name)[0] + except (InvalidSdistFilename, InvalidVersion): + continue + + self._project_name_to_urls[project_filename].append(url) + self._scanned_directory = True + + @property + def page_candidates(self) -> List[str]: + if not self._scanned_directory: + self._scan_directory() + + return self._page_candidates + + @property + def project_name_to_urls(self) -> Dict[str, List[str]]: + if not self._scanned_directory: + self._scan_directory() + + return self._project_name_to_urls + + +class _FlatDirectorySource(LinkSource): + """Link source specified by ``--find-links=``. + + This looks the content of the directory, and returns: + + * ``page_candidates``: Links listed on each HTML file in the directory. + * ``file_candidates``: Archives in the directory. + """ + + _paths_to_urls: Dict[str, _FlatDirectoryToUrls] = {} + + def __init__( + self, + candidates_from_page: CandidatesFromPage, + path: str, + project_name: str, + ) -> None: + self._candidates_from_page = candidates_from_page + self._project_name = canonicalize_name(project_name) + + # Get existing instance of _FlatDirectoryToUrls if it exists + if path in self._paths_to_urls: + self._path_to_urls = self._paths_to_urls[path] + else: + self._path_to_urls = _FlatDirectoryToUrls(path=path) + self._paths_to_urls[path] = self._path_to_urls + + @property + def link(self) -> Optional[Link]: + return None + + def page_candidates(self) -> FoundCandidates: + for url in self._path_to_urls.page_candidates: + yield from self._candidates_from_page(Link(url)) + + def file_links(self) -> FoundLinks: + for url in self._path_to_urls.project_name_to_urls[self._project_name]: + yield Link(url) + + +class _LocalFileSource(LinkSource): + """``--find-links=`` or ``--[extra-]index-url=``. + + If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to + the option, it is converted to a URL first. This returns: + + * ``page_candidates``: Links listed on an HTML file. + * ``file_candidates``: The non-HTML file. + """ + + def __init__( + self, + candidates_from_page: CandidatesFromPage, + link: Link, + ) -> None: + self._candidates_from_page = candidates_from_page + self._link = link + + @property + def link(self) -> Optional[Link]: + return self._link + + def page_candidates(self) -> FoundCandidates: + if not _is_html_file(self._link.url): + return + yield from self._candidates_from_page(self._link) + + def file_links(self) -> FoundLinks: + if _is_html_file(self._link.url): + return + yield self._link + + +class _RemoteFileSource(LinkSource): + """``--find-links=`` or ``--[extra-]index-url=``. + + This returns: + + * ``page_candidates``: Links listed on an HTML file. + * ``file_candidates``: The non-HTML file. + """ + + def __init__( + self, + candidates_from_page: CandidatesFromPage, + page_validator: PageValidator, + link: Link, + ) -> None: + self._candidates_from_page = candidates_from_page + self._page_validator = page_validator + self._link = link + + @property + def link(self) -> Optional[Link]: + return self._link + + def page_candidates(self) -> FoundCandidates: + if not self._page_validator(self._link): + return + yield from self._candidates_from_page(self._link) + + def file_links(self) -> FoundLinks: + yield self._link + + +class _IndexDirectorySource(LinkSource): + """``--[extra-]index-url=``. + + This is treated like a remote URL; ``candidates_from_page`` contains logic + for this by appending ``index.html`` to the link. + """ + + def __init__( + self, + candidates_from_page: CandidatesFromPage, + link: Link, + ) -> None: + self._candidates_from_page = candidates_from_page + self._link = link + + @property + def link(self) -> Optional[Link]: + return self._link + + def page_candidates(self) -> FoundCandidates: + yield from self._candidates_from_page(self._link) + + def file_links(self) -> FoundLinks: + return () + + +def build_source( + location: str, + *, + candidates_from_page: CandidatesFromPage, + page_validator: PageValidator, + expand_dir: bool, + cache_link_parsing: bool, + project_name: str, +) -> Tuple[Optional[str], Optional[LinkSource]]: + path: Optional[str] = None + url: Optional[str] = None + if os.path.exists(location): # Is a local path. + url = path_to_url(location) + path = location + elif location.startswith("file:"): # A file: URL. + url = location + path = url_to_path(location) + elif is_url(location): + url = location + + if url is None: + msg = ( + "Location '%s' is ignored: " + "it is either a non-existing path or lacks a specific scheme." + ) + logger.warning(msg, location) + return (None, None) + + if path is None: + source: LinkSource = _RemoteFileSource( + candidates_from_page=candidates_from_page, + page_validator=page_validator, + link=Link(url, cache_link_parsing=cache_link_parsing), + ) + return (url, source) + + if os.path.isdir(path): + if expand_dir: + source = _FlatDirectorySource( + candidates_from_page=candidates_from_page, + path=path, + project_name=project_name, + ) + else: + source = _IndexDirectorySource( + candidates_from_page=candidates_from_page, + link=Link(url, cache_link_parsing=cache_link_parsing), + ) + return (url, source) + elif os.path.isfile(path): + source = _LocalFileSource( + candidates_from_page=candidates_from_page, + link=Link(url, cache_link_parsing=cache_link_parsing), + ) + return (url, source) + logger.warning( + "Location '%s' is ignored: it is neither a file nor a directory.", + location, + ) + return (url, None) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py new file mode 100644 index 0000000..d54bc63 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py @@ -0,0 +1,467 @@ +import functools +import logging +import os +import pathlib +import sys +import sysconfig +from typing import Any, Dict, Generator, Optional, Tuple + +from pip._internal.models.scheme import SCHEME_KEYS, Scheme +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.virtualenv import running_under_virtualenv + +from . import _sysconfig +from .base import ( + USER_CACHE_DIR, + get_major_minor_version, + get_src_prefix, + is_osx_framework, + site_packages, + user_site, +) + +__all__ = [ + "USER_CACHE_DIR", + "get_bin_prefix", + "get_bin_user", + "get_major_minor_version", + "get_platlib", + "get_purelib", + "get_scheme", + "get_src_prefix", + "site_packages", + "user_site", +] + + +logger = logging.getLogger(__name__) + + +_PLATLIBDIR: str = getattr(sys, "platlibdir", "lib") + +_USE_SYSCONFIG_DEFAULT = sys.version_info >= (3, 10) + + +def _should_use_sysconfig() -> bool: + """This function determines the value of _USE_SYSCONFIG. + + By default, pip uses sysconfig on Python 3.10+. + But Python distributors can override this decision by setting: + sysconfig._PIP_USE_SYSCONFIG = True / False + Rationale in https://github.com/pypa/pip/issues/10647 + + This is a function for testability, but should be constant during any one + run. + """ + return bool(getattr(sysconfig, "_PIP_USE_SYSCONFIG", _USE_SYSCONFIG_DEFAULT)) + + +_USE_SYSCONFIG = _should_use_sysconfig() + +if not _USE_SYSCONFIG: + # Import distutils lazily to avoid deprecation warnings, + # but import it soon enough that it is in memory and available during + # a pip reinstall. + from . import _distutils + +# Be noisy about incompatibilities if this platforms "should" be using +# sysconfig, but is explicitly opting out and using distutils instead. +if _USE_SYSCONFIG_DEFAULT and not _USE_SYSCONFIG: + _MISMATCH_LEVEL = logging.WARNING +else: + _MISMATCH_LEVEL = logging.DEBUG + + +def _looks_like_bpo_44860() -> bool: + """The resolution to bpo-44860 will change this incorrect platlib. + + See . + """ + from distutils.command.install import INSTALL_SCHEMES + + try: + unix_user_platlib = INSTALL_SCHEMES["unix_user"]["platlib"] + except KeyError: + return False + return unix_user_platlib == "$usersite" + + +def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool: + platlib = scheme["platlib"] + if "/$platlibdir/" in platlib: + platlib = platlib.replace("/$platlibdir/", f"/{_PLATLIBDIR}/") + if "/lib64/" not in platlib: + return False + unpatched = platlib.replace("/lib64/", "/lib/") + return unpatched.replace("$platbase/", "$base/") == scheme["purelib"] + + +@functools.lru_cache(maxsize=None) +def _looks_like_red_hat_lib() -> bool: + """Red Hat patches platlib in unix_prefix and unix_home, but not purelib. + + This is the only way I can see to tell a Red Hat-patched Python. + """ + from distutils.command.install import INSTALL_SCHEMES + + return all( + k in INSTALL_SCHEMES + and _looks_like_red_hat_patched_platlib_purelib(INSTALL_SCHEMES[k]) + for k in ("unix_prefix", "unix_home") + ) + + +@functools.lru_cache(maxsize=None) +def _looks_like_debian_scheme() -> bool: + """Debian adds two additional schemes.""" + from distutils.command.install import INSTALL_SCHEMES + + return "deb_system" in INSTALL_SCHEMES and "unix_local" in INSTALL_SCHEMES + + +@functools.lru_cache(maxsize=None) +def _looks_like_red_hat_scheme() -> bool: + """Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``. + + Red Hat's ``00251-change-user-install-location.patch`` changes the install + command's ``prefix`` and ``exec_prefix`` to append ``"/local"``. This is + (fortunately?) done quite unconditionally, so we create a default command + object without any configuration to detect this. + """ + from distutils.command.install import install + from distutils.dist import Distribution + + cmd: Any = install(Distribution()) + cmd.finalize_options() + return ( + cmd.exec_prefix == f"{os.path.normpath(sys.exec_prefix)}/local" + and cmd.prefix == f"{os.path.normpath(sys.prefix)}/local" + ) + + +@functools.lru_cache(maxsize=None) +def _looks_like_slackware_scheme() -> bool: + """Slackware patches sysconfig but fails to patch distutils and site. + + Slackware changes sysconfig's user scheme to use ``"lib64"`` for the lib + path, but does not do the same to the site module. + """ + if user_site is None: # User-site not available. + return False + try: + paths = sysconfig.get_paths(scheme="posix_user", expand=False) + except KeyError: # User-site not available. + return False + return "/lib64/" in paths["purelib"] and "/lib64/" not in user_site + + +@functools.lru_cache(maxsize=None) +def _looks_like_msys2_mingw_scheme() -> bool: + """MSYS2 patches distutils and sysconfig to use a UNIX-like scheme. + + However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is + likely going to be included in their 3.10 release, so we ignore the warning. + See msys2/MINGW-packages#9319. + + MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase, + and is missing the final ``"site-packages"``. + """ + paths = sysconfig.get_paths("nt", expand=False) + return all( + "Lib" not in p and "lib" in p and not p.endswith("site-packages") + for p in (paths[key] for key in ("platlib", "purelib")) + ) + + +def _fix_abiflags(parts: Tuple[str]) -> Generator[str, None, None]: + ldversion = sysconfig.get_config_var("LDVERSION") + abiflags = getattr(sys, "abiflags", None) + + # LDVERSION does not end with sys.abiflags. Just return the path unchanged. + if not ldversion or not abiflags or not ldversion.endswith(abiflags): + yield from parts + return + + # Strip sys.abiflags from LDVERSION-based path components. + for part in parts: + if part.endswith(ldversion): + part = part[: (0 - len(abiflags))] + yield part + + +@functools.lru_cache(maxsize=None) +def _warn_mismatched(old: pathlib.Path, new: pathlib.Path, *, key: str) -> None: + issue_url = "https://github.com/pypa/pip/issues/10151" + message = ( + "Value for %s does not match. Please report this to <%s>" + "\ndistutils: %s" + "\nsysconfig: %s" + ) + logger.log(_MISMATCH_LEVEL, message, key, issue_url, old, new) + + +def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool: + if old == new: + return False + _warn_mismatched(old, new, key=key) + return True + + +@functools.lru_cache(maxsize=None) +def _log_context( + *, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + prefix: Optional[str] = None, +) -> None: + parts = [ + "Additional context:", + "user = %r", + "home = %r", + "root = %r", + "prefix = %r", + ] + + logger.log(_MISMATCH_LEVEL, "\n".join(parts), user, home, root, prefix) + + +def get_scheme( + dist_name: str, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> Scheme: + new = _sysconfig.get_scheme( + dist_name, + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + if _USE_SYSCONFIG: + return new + + old = _distutils.get_scheme( + dist_name, + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + + warning_contexts = [] + for k in SCHEME_KEYS: + old_v = pathlib.Path(getattr(old, k)) + new_v = pathlib.Path(getattr(new, k)) + + if old_v == new_v: + continue + + # distutils incorrectly put PyPy packages under ``site-packages/python`` + # in the ``posix_home`` scheme, but PyPy devs said they expect the + # directory name to be ``pypy`` instead. So we treat this as a bug fix + # and not warn about it. See bpo-43307 and python/cpython#24628. + skip_pypy_special_case = ( + sys.implementation.name == "pypy" + and home is not None + and k in ("platlib", "purelib") + and old_v.parent == new_v.parent + and old_v.name.startswith("python") + and new_v.name.startswith("pypy") + ) + if skip_pypy_special_case: + continue + + # sysconfig's ``osx_framework_user`` does not include ``pythonX.Y`` in + # the ``include`` value, but distutils's ``headers`` does. We'll let + # CPython decide whether this is a bug or feature. See bpo-43948. + skip_osx_framework_user_special_case = ( + user + and is_osx_framework() + and k == "headers" + and old_v.parent.parent == new_v.parent + and old_v.parent.name.startswith("python") + ) + if skip_osx_framework_user_special_case: + continue + + # On Red Hat and derived Linux distributions, distutils is patched to + # use "lib64" instead of "lib" for platlib. + if k == "platlib" and _looks_like_red_hat_lib(): + continue + + # On Python 3.9+, sysconfig's posix_user scheme sets platlib against + # sys.platlibdir, but distutils's unix_user incorrectly coninutes + # using the same $usersite for both platlib and purelib. This creates a + # mismatch when sys.platlibdir is not "lib". + skip_bpo_44860 = ( + user + and k == "platlib" + and not WINDOWS + and sys.version_info >= (3, 9) + and _PLATLIBDIR != "lib" + and _looks_like_bpo_44860() + ) + if skip_bpo_44860: + continue + + # Slackware incorrectly patches posix_user to use lib64 instead of lib, + # but not usersite to match the location. + skip_slackware_user_scheme = ( + user + and k in ("platlib", "purelib") + and not WINDOWS + and _looks_like_slackware_scheme() + ) + if skip_slackware_user_scheme: + continue + + # Both Debian and Red Hat patch Python to place the system site under + # /usr/local instead of /usr. Debian also places lib in dist-packages + # instead of site-packages, but the /usr/local check should cover it. + skip_linux_system_special_case = ( + not (user or home or prefix or running_under_virtualenv()) + and old_v.parts[1:3] == ("usr", "local") + and len(new_v.parts) > 1 + and new_v.parts[1] == "usr" + and (len(new_v.parts) < 3 or new_v.parts[2] != "local") + and (_looks_like_red_hat_scheme() or _looks_like_debian_scheme()) + ) + if skip_linux_system_special_case: + continue + + # On Python 3.7 and earlier, sysconfig does not include sys.abiflags in + # the "pythonX.Y" part of the path, but distutils does. + skip_sysconfig_abiflag_bug = ( + sys.version_info < (3, 8) + and not WINDOWS + and k in ("headers", "platlib", "purelib") + and tuple(_fix_abiflags(old_v.parts)) == new_v.parts + ) + if skip_sysconfig_abiflag_bug: + continue + + # MSYS2 MINGW's sysconfig patch does not include the "site-packages" + # part of the path. This is incorrect and will be fixed in MSYS. + skip_msys2_mingw_bug = ( + WINDOWS and k in ("platlib", "purelib") and _looks_like_msys2_mingw_scheme() + ) + if skip_msys2_mingw_bug: + continue + + # CPython's POSIX install script invokes pip (via ensurepip) against the + # interpreter located in the source tree, not the install site. This + # triggers special logic in sysconfig that's not present in distutils. + # https://github.com/python/cpython/blob/8c21941ddaf/Lib/sysconfig.py#L178-L194 + skip_cpython_build = ( + sysconfig.is_python_build(check_home=True) + and not WINDOWS + and k in ("headers", "include", "platinclude") + ) + if skip_cpython_build: + continue + + warning_contexts.append((old_v, new_v, f"scheme.{k}")) + + if not warning_contexts: + return old + + # Check if this path mismatch is caused by distutils config files. Those + # files will no longer work once we switch to sysconfig, so this raises a + # deprecation message for them. + default_old = _distutils.distutils_scheme( + dist_name, + user, + home, + root, + isolated, + prefix, + ignore_config_files=True, + ) + if any(default_old[k] != getattr(old, k) for k in SCHEME_KEYS): + deprecated( + reason=( + "Configuring installation scheme with distutils config files " + "is deprecated and will no longer work in the near future. If you " + "are using a Homebrew or Linuxbrew Python, please see discussion " + "at https://github.com/Homebrew/homebrew-core/issues/76621" + ), + replacement=None, + gone_in=None, + ) + return old + + # Post warnings about this mismatch so user can report them back. + for old_v, new_v, key in warning_contexts: + _warn_mismatched(old_v, new_v, key=key) + _log_context(user=user, home=home, root=root, prefix=prefix) + + return old + + +def get_bin_prefix() -> str: + new = _sysconfig.get_bin_prefix() + if _USE_SYSCONFIG: + return new + + old = _distutils.get_bin_prefix() + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="bin_prefix"): + _log_context() + return old + + +def get_bin_user() -> str: + return _sysconfig.get_scheme("", user=True).scripts + + +def _looks_like_deb_system_dist_packages(value: str) -> bool: + """Check if the value is Debian's APT-controlled dist-packages. + + Debian's ``distutils.sysconfig.get_python_lib()`` implementation returns the + default package path controlled by APT, but does not patch ``sysconfig`` to + do the same. This is similar to the bug worked around in ``get_scheme()``, + but here the default is ``deb_system`` instead of ``unix_local``. Ultimately + we can't do anything about this Debian bug, and this detection allows us to + skip the warning when needed. + """ + if not _looks_like_debian_scheme(): + return False + if value == "/usr/lib/python3/dist-packages": + return True + return False + + +def get_purelib() -> str: + """Return the default pure-Python lib location.""" + new = _sysconfig.get_purelib() + if _USE_SYSCONFIG: + return new + + old = _distutils.get_purelib() + if _looks_like_deb_system_dist_packages(old): + return old + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="purelib"): + _log_context() + return old + + +def get_platlib() -> str: + """Return the default platform-shared lib location.""" + new = _sysconfig.get_platlib() + if _USE_SYSCONFIG: + return new + + from . import _distutils + + old = _distutils.get_platlib() + if _looks_like_deb_system_dist_packages(old): + return old + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"): + _log_context() + return old diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fb6876c71036383c692d35aaf4b1b092caaffef GIT binary patch literal 16794 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..461aecf27096b5813bcb6f134a12c1762d2fa6e0 GIT binary patch literal 6874 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 C_?hki literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7eba935228a61d4581e7677dc5c080c63bf26b55 GIT binary patch literal 8029 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c096ad69e9b953d21c1e9bf940d8ada54e7468b GIT binary patch literal 3799 zcmbVPU2Gf25#HnR|6h`2O12YUtw0oInv7+qa$QA=Ejh4S#7gxO*MtG~$XiNBk$24A zQIr%5R)e4wgP@Xu0+P`dwowCCkv{mnPc{117pXKVoaSjS#sl`-5kpM^S=y_E_;_x-}#oHw`%U?q!F4FWhU2-MD8BN2Ari;0psLQHyi4c_l(;*fL zl1wz{wvnQu$jW50s7RP3XJn!m#T-^<489;23`e0za86DcK26qfvLL3X#YwCgc7pXH zQPPc;@Gzji9eUJNIIP5F8|UkN-C{DcRcp8??+F1mL+A9{Cu+=j z+b0XLPZlD)Vb7=}FX{%b&1r_Wt{^EZ8TAinhg$dI<9J@t2HNBAV;w8P5RoN0 zK7_StT`j~5M9pITf}+W(9FFJbz=?5iUA(~T0<}GH>cmr~6XW3EIOxzZQN&z4r>5B@ zY4Mb(;aFkL2u)%=$qt@m2T#`RB28dW3;eXB@L5DvH}W1?>Rs+H_y6|H*3pxjM^A2e zq8rvI3BbJJRB$OtR8=>e1yP?;#5_*#-T^G23C!;8-zf#3oLbdX|hmP*4Jp<%VG34jm~xidHl=?Fvk!ygyr z844r1psRwa#i;aHR+W`5Q*Kl+HAZU5I09)-O0ouGWF2IJ2!b_8{AtMKMvbOAK~y9P z0E$2b(?u{~7V0H6DwL+=^b|D)pddXxCjc}Ijf};w%8I0x03%@Y2Vz;K5FY0m*j8vs!4%g0M*b1s9&wfoq;EG{U zbV4uV1$TYEc|w_1)RH0;z+V(_&I|MJxCcc=P*hz=Pl?JT7HFa}*HFJ_%e&9Ks3HmuZkli0dBY;OiUYc6dJEt|H#$W@wm(!|XPCdWL*It07-KYY{S^UK0QR zuhl^~r#nsgSynWeqZ*ZVQEUMzXI$tz$fp*wmi3ywJ!)FssOL30Xi)5HH<5`GW2gh^ zesda1kTwqKyQq| zkV=rl@F>qCx7@otP##!2U-5KqSUbOc?nA-QH^>58pLqkzm&=zoTF3wHov7L<>xD+& z`aktt^rA=JH!q&zA4NI%8m=OgAxT&T8^Jekr!8lUQu`LuVD~yRohB#Se}D zeGTHKzS5+$9=l=$KD;)5dF0CbqZdB7baiC($51m_Q>vOXTu?EkRV5=&8q9mOesV@6 zgoX`Ex*EC!Wi6>{v&jqr)GDcDnw*9OBkzEvc z@7VD8CBu~?#U!(c(0@UgTlYEtg|n~rM)i}6u!LT*_AmHUd5+_@QSd2pJw=|U$o-V| zeg8z?{|be_LW5O1YVKMIZ8e2Ao5Jh1N>gmn54^)&E7!JK!<(()byuaeXVJH$RZvgW zZsShfZP`IUs=;>7z1C4hK-OCrc?dHws-E+4;Wd5-0jUZ$?l{N`58RcuI{P;}`zxLA zEe8weiQ?iK>O;-d%g^8w6yBN0yHNP{y}a r4{{!+%;QgjhgSW!{GSff^BsSo(Z}!4(T Dict[str, str]: + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + dist_args: Dict[str, Union[str, List[str]]] = {"name": dist_name} + if isolated: + dist_args["script_args"] = ["--no-user-cfg"] + + d = Distribution(dist_args) + if not ignore_config_files: + try: + d.parse_config_files() + except UnicodeDecodeError: + paths = d.find_config_files() + logger.warning( + "Ignore distutils configs in %s due to encoding errors.", + ", ".join(os.path.basename(p) for p in paths), + ) + obj: Optional[DistutilsCommand] = None + obj = d.get_command_obj("install", create=True) + assert obj is not None + i = cast(distutils_install_command, obj) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), f"user={user} prefix={prefix}" + assert not (home and prefix), f"home={home} prefix={prefix}" + i.user = user or i.user + if user or home: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + + scheme = {} + for key in SCHEME_KEYS: + scheme[key] = getattr(i, "install_" + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if "install_lib" in d.get_option_dict("install"): + scheme.update({"purelib": i.install_lib, "platlib": i.install_lib}) + + if running_under_virtualenv(): + if home: + prefix = home + elif user: + prefix = i.install_userbase + else: + prefix = i.prefix + scheme["headers"] = os.path.join( + prefix, + "include", + "site", + f"python{get_major_minor_version()}", + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive(os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join(root, path_no_drive[1:]) + + return scheme + + +def get_scheme( + dist_name: str, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> Scheme: + """ + Get the "scheme" corresponding to the input parameters. The distutils + documentation provides the context for the available schemes: + https://docs.python.org/3/install/index.html#alternate-installation + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme and provides the base + directory for the same + :param root: root under which other directories are re-based + :param isolated: equivalent to --no-user-cfg, i.e. do not consider + ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for + scheme paths + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + scheme = distutils_scheme(dist_name, user, home, root, isolated, prefix) + return Scheme( + platlib=scheme["platlib"], + purelib=scheme["purelib"], + headers=scheme["headers"], + scripts=scheme["scripts"], + data=scheme["data"], + ) + + +def get_bin_prefix() -> str: + # XXX: In old virtualenv versions, sys.prefix can contain '..' components, + # so we need to call normpath to eliminate them. + prefix = os.path.normpath(sys.prefix) + if WINDOWS: + bin_py = os.path.join(prefix, "Scripts") + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(prefix, "bin") + return bin_py + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == "darwin" and prefix[:16] == "/System/Library/": + return "/usr/local/bin" + return os.path.join(prefix, "bin") + + +def get_purelib() -> str: + return get_python_lib(plat_specific=False) + + +def get_platlib() -> str: + return get_python_lib(plat_specific=True) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py b/myenv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py new file mode 100644 index 0000000..97aef1f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py @@ -0,0 +1,213 @@ +import logging +import os +import sys +import sysconfig +import typing + +from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid +from pip._internal.models.scheme import SCHEME_KEYS, Scheme +from pip._internal.utils.virtualenv import running_under_virtualenv + +from .base import change_root, get_major_minor_version, is_osx_framework + +logger = logging.getLogger(__name__) + + +# Notes on _infer_* functions. +# Unfortunately ``get_default_scheme()`` didn't exist before 3.10, so there's no +# way to ask things like "what is the '_prefix' scheme on this platform". These +# functions try to answer that with some heuristics while accounting for ad-hoc +# platforms not covered by CPython's default sysconfig implementation. If the +# ad-hoc implementation does not fully implement sysconfig, we'll fall back to +# a POSIX scheme. + +_AVAILABLE_SCHEMES = set(sysconfig.get_scheme_names()) + +_PREFERRED_SCHEME_API = getattr(sysconfig, "get_preferred_scheme", None) + + +def _should_use_osx_framework_prefix() -> bool: + """Check for Apple's ``osx_framework_library`` scheme. + + Python distributed by Apple's Command Line Tools has this special scheme + that's used when: + + * This is a framework build. + * We are installing into the system prefix. + + This does not account for ``pip install --prefix`` (also means we're not + installing to the system prefix), which should use ``posix_prefix``, but + logic here means ``_infer_prefix()`` outputs ``osx_framework_library``. But + since ``prefix`` is not available for ``sysconfig.get_default_scheme()``, + which is the stdlib replacement for ``_infer_prefix()``, presumably Apple + wouldn't be able to magically switch between ``osx_framework_library`` and + ``posix_prefix``. ``_infer_prefix()`` returning ``osx_framework_library`` + means its behavior is consistent whether we use the stdlib implementation + or our own, and we deal with this special case in ``get_scheme()`` instead. + """ + return ( + "osx_framework_library" in _AVAILABLE_SCHEMES + and not running_under_virtualenv() + and is_osx_framework() + ) + + +def _infer_prefix() -> str: + """Try to find a prefix scheme for the current platform. + + This tries: + + * A special ``osx_framework_library`` for Python distributed by Apple's + Command Line Tools, when not running in a virtual environment. + * Implementation + OS, used by PyPy on Windows (``pypy_nt``). + * Implementation without OS, used by PyPy on POSIX (``pypy``). + * OS + "prefix", used by CPython on POSIX (``posix_prefix``). + * Just the OS name, used by CPython on Windows (``nt``). + + If none of the above works, fall back to ``posix_prefix``. + """ + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("prefix") + if _should_use_osx_framework_prefix(): + return "osx_framework_library" + implementation_suffixed = f"{sys.implementation.name}_{os.name}" + if implementation_suffixed in _AVAILABLE_SCHEMES: + return implementation_suffixed + if sys.implementation.name in _AVAILABLE_SCHEMES: + return sys.implementation.name + suffixed = f"{os.name}_prefix" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + if os.name in _AVAILABLE_SCHEMES: # On Windows, prefx is just called "nt". + return os.name + return "posix_prefix" + + +def _infer_user() -> str: + """Try to find a user scheme for the current platform.""" + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("user") + if is_osx_framework() and not running_under_virtualenv(): + suffixed = "osx_framework_user" + else: + suffixed = f"{os.name}_user" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + if "posix_user" not in _AVAILABLE_SCHEMES: # User scheme unavailable. + raise UserInstallationInvalid() + return "posix_user" + + +def _infer_home() -> str: + """Try to find a home for the current platform.""" + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("home") + suffixed = f"{os.name}_home" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + return "posix_home" + + +# Update these keys if the user sets a custom home. +_HOME_KEYS = [ + "installed_base", + "base", + "installed_platbase", + "platbase", + "prefix", + "exec_prefix", +] +if sysconfig.get_config_var("userbase") is not None: + _HOME_KEYS.append("userbase") + + +def get_scheme( + dist_name: str, + user: bool = False, + home: typing.Optional[str] = None, + root: typing.Optional[str] = None, + isolated: bool = False, + prefix: typing.Optional[str] = None, +) -> Scheme: + """ + Get the "scheme" corresponding to the input parameters. + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme + :param root: root under which other directories are re-based + :param isolated: ignored, but kept for distutils compatibility (where + this controls whether the user-site pydistutils.cfg is honored) + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + if user and prefix: + raise InvalidSchemeCombination("--user", "--prefix") + if home and prefix: + raise InvalidSchemeCombination("--home", "--prefix") + + if home is not None: + scheme_name = _infer_home() + elif user: + scheme_name = _infer_user() + else: + scheme_name = _infer_prefix() + + # Special case: When installing into a custom prefix, use posix_prefix + # instead of osx_framework_library. See _should_use_osx_framework_prefix() + # docstring for details. + if prefix is not None and scheme_name == "osx_framework_library": + scheme_name = "posix_prefix" + + if home is not None: + variables = {k: home for k in _HOME_KEYS} + elif prefix is not None: + variables = {k: prefix for k in _HOME_KEYS} + else: + variables = {} + + paths = sysconfig.get_paths(scheme=scheme_name, vars=variables) + + # Logic here is very arbitrary, we're doing it for compatibility, don't ask. + # 1. Pip historically uses a special header path in virtual environments. + # 2. If the distribution name is not known, distutils uses 'UNKNOWN'. We + # only do the same when not running in a virtual environment because + # pip's historical header path logic (see point 1) did not do this. + if running_under_virtualenv(): + if user: + base = variables.get("userbase", sys.prefix) + else: + base = variables.get("base", sys.prefix) + python_xy = f"python{get_major_minor_version()}" + paths["include"] = os.path.join(base, "include", "site", python_xy) + elif not dist_name: + dist_name = "UNKNOWN" + + scheme = Scheme( + platlib=paths["platlib"], + purelib=paths["purelib"], + headers=os.path.join(paths["include"], dist_name), + scripts=paths["scripts"], + data=paths["data"], + ) + if root is not None: + for key in SCHEME_KEYS: + value = change_root(root, getattr(scheme, key)) + setattr(scheme, key, value) + return scheme + + +def get_bin_prefix() -> str: + # Forcing to use /usr/local/bin for standard macOS framework installs. + if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/": + return "/usr/local/bin" + return sysconfig.get_paths()["scripts"] + + +def get_purelib() -> str: + return sysconfig.get_paths()["purelib"] + + +def get_platlib() -> str: + return sysconfig.get_paths()["platlib"] diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/locations/base.py b/myenv/lib/python3.12/site-packages/pip/_internal/locations/base.py new file mode 100644 index 0000000..3f9f896 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/locations/base.py @@ -0,0 +1,81 @@ +import functools +import os +import site +import sys +import sysconfig +import typing + +from pip._internal.exceptions import InstallationError +from pip._internal.utils import appdirs +from pip._internal.utils.virtualenv import running_under_virtualenv + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + +# FIXME doesn't account for venv linked to global site-packages +site_packages: str = sysconfig.get_path("purelib") + + +def get_major_minor_version() -> str: + """ + Return the major-minor version of the current Python as a string, e.g. + "3.7" or "3.10". + """ + return "{}.{}".format(*sys.version_info) + + +def change_root(new_root: str, pathname: str) -> str: + """Return 'pathname' with 'new_root' prepended. + + If 'pathname' is relative, this is equivalent to os.path.join(new_root, pathname). + Otherwise, it requires making 'pathname' relative and then joining the + two, which is tricky on DOS/Windows and Mac OS. + + This is borrowed from Python's standard library's distutils module. + """ + if os.name == "posix": + if not os.path.isabs(pathname): + return os.path.join(new_root, pathname) + else: + return os.path.join(new_root, pathname[1:]) + + elif os.name == "nt": + (drive, path) = os.path.splitdrive(pathname) + if path[0] == "\\": + path = path[1:] + return os.path.join(new_root, path) + + else: + raise InstallationError( + f"Unknown platform: {os.name}\n" + "Can not change root path prefix on unknown platform." + ) + + +def get_src_prefix() -> str: + if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, "src") + else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), "src") + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit("The folder you are executing pip from can no longer be found.") + + # under macOS + virtualenv sys.prefix is not properly resolved + # it is something like /path/to/python/bin/.. + return os.path.abspath(src_prefix) + + +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site: typing.Optional[str] = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE + + +@functools.lru_cache(maxsize=None) +def is_osx_framework() -> bool: + return bool(sysconfig.get_config_var("PYTHONFRAMEWORK")) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/main.py b/myenv/lib/python3.12/site-packages/pip/_internal/main.py new file mode 100644 index 0000000..33c6d24 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/main.py @@ -0,0 +1,12 @@ +from typing import List, Optional + + +def main(args: Optional[List[str]] = None) -> int: + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py new file mode 100644 index 0000000..aa232b6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py @@ -0,0 +1,128 @@ +import contextlib +import functools +import os +import sys +from typing import TYPE_CHECKING, List, Optional, Type, cast + +from pip._internal.utils.misc import strtobool + +from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel + +if TYPE_CHECKING: + from typing import Literal, Protocol +else: + Protocol = object + +__all__ = [ + "BaseDistribution", + "BaseEnvironment", + "FilesystemWheel", + "MemoryWheel", + "Wheel", + "get_default_environment", + "get_environment", + "get_wheel_distribution", + "select_backend", +] + + +def _should_use_importlib_metadata() -> bool: + """Whether to use the ``importlib.metadata`` or ``pkg_resources`` backend. + + By default, pip uses ``importlib.metadata`` on Python 3.11+, and + ``pkg_resourcess`` otherwise. This can be overridden by a couple of ways: + + * If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it + dictates whether ``importlib.metadata`` is used, regardless of Python + version. + * On Python 3.11+, Python distributors can patch ``importlib.metadata`` + to add a global constant ``_PIP_USE_IMPORTLIB_METADATA = False``. This + makes pip use ``pkg_resources`` (unless the user set the aforementioned + environment variable to *True*). + """ + with contextlib.suppress(KeyError, ValueError): + return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"])) + if sys.version_info < (3, 11): + return False + import importlib.metadata + + return bool(getattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA", True)) + + +class Backend(Protocol): + NAME: 'Literal["importlib", "pkg_resources"]' + Distribution: Type[BaseDistribution] + Environment: Type[BaseEnvironment] + + +@functools.lru_cache(maxsize=None) +def select_backend() -> Backend: + if _should_use_importlib_metadata(): + from . import importlib + + return cast(Backend, importlib) + from . import pkg_resources + + return cast(Backend, pkg_resources) + + +def get_default_environment() -> BaseEnvironment: + """Get the default representation for the current environment. + + This returns an Environment instance from the chosen backend. The default + Environment instance should be built from ``sys.path`` and may use caching + to share instance state accorss calls. + """ + return select_backend().Environment.default() + + +def get_environment(paths: Optional[List[str]]) -> BaseEnvironment: + """Get a representation of the environment specified by ``paths``. + + This returns an Environment instance from the chosen backend based on the + given import paths. The backend must build a fresh instance representing + the state of installed distributions when this function is called. + """ + return select_backend().Environment.from_paths(paths) + + +def get_directory_distribution(directory: str) -> BaseDistribution: + """Get the distribution metadata representation in the specified directory. + + This returns a Distribution instance from the chosen backend based on + the given on-disk ``.dist-info`` directory. + """ + return select_backend().Distribution.from_directory(directory) + + +def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistribution: + """Get the representation of the specified wheel's distribution metadata. + + This returns a Distribution instance from the chosen backend based on + the given wheel's ``.dist-info`` directory. + + :param canonical_name: Normalized project name of the given wheel. + """ + return select_backend().Distribution.from_wheel(wheel, canonical_name) + + +def get_metadata_distribution( + metadata_contents: bytes, + filename: str, + canonical_name: str, +) -> BaseDistribution: + """Get the dist representation of the specified METADATA file contents. + + This returns a Distribution instance from the chosen backend sourced from the data + in `metadata_contents`. + + :param metadata_contents: Contents of a METADATA file within a dist, or one served + via PEP 658. + :param filename: Filename for the dist this metadata represents. + :param canonical_name: Normalized project name of the given dist. + """ + return select_backend().Distribution.from_metadata_file_contents( + metadata_contents, + filename, + canonical_name, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77a52690ce321fbec5f629e39697d96cb7e4b2b8 GIT binary patch literal 5900 zcmcgwOKcm*8J;DVTt4)cEXlTPPwYAp9hrpWq)Ajag=ERL99vdmC5>4Ws}*-7t+dN! zXP0(pIDii+&|`rHunPo8TJ(^>J>=+XZvk=<%LEeE4U(cR3g6hsK!6;I{{QSQNy&1G z!e~d(ymlV{{NMlNXYK7N0%dId&6VvgLjHz>uq1-c_IZhr+e9b2WRkq!N_k0)Bl(DE zqxmSb5mUBe`Ir^Y$1NqVSc!bXO6HRi?unWyE1ge6U)E!0o7J9gw>t72R%gD`>dJRn z-T7{buozFm+Blrklkc&5^Su%&Mp$3IcZKN6@1^`cJ;C~yBYN^(IX@5~=ZKzqm*{EM zdpGJ+n;(o2CasN!k7%~K^vAZl@DeO=${?K5{;qu2pCI`IFxLTd9dPnNy^|>{&W85G zSNs>>WW5W%9n!nm5RBWGWxWT+hxK08t@j0UaeW`m9nt$4)dyfMoKNV3F#k+N%ItrL zH_l~ZUi-q;`5E=h`I$4X&d#0lB$R~67%GO=C~QjOFAxh?Iqhb zAL1Ked)JiauxZ%CjioZ~@j7v4rg+WZcF|%**XulMn9Qj-F0+2R%9!b;FEPvJ6@L&D zO(xVV1{SYfWJvt_Mpx+-hE4L`I_^y9>J zyjay+>FjWr$qKHzq!rd#QTO7Uxn*7~!0C;mKo23^{(%raHvo>1wMb)4qvOh9*Nun0 zyTQ5_h(z3EIP2nzL~-$1qO9Swb`@Ph*h6s%+d@Paf8p5@xk8SSG2%$qBNDj^H-WfD z-;Q1-*CiL!$uDa?VXxWh(RHAYOBGNCP@B{{tuzjV>u!>@!LZ+KbxDth;vQ0Vg=7@% zH*h3i>aH?QU7MC2Mxjp^7Y(aqbJsMMvKDhSU30a?MQU^SQd(b8IdkkXFE9rt14y!| z6ooQXp#jjNv}Ba% zipF(NDF=!2pBtP7q&uL4Sus38FYo3?z?+61*xY}1NplOUPvB{AG(f58I`Ct~w3jp! z*iv*{t>}LLgXxdyS!U?+tV5D3W??b_XM{{JEkRol_<_xV0 zyps9I(!Fs2dQU9yGCPs+x#1oB9$e-!k%y?~4^c7Ca#Y%dOuLtYN4o57lvyv~luIQL zQpZcY$|^IQ+uTdNshMTw_hqz-9KDqnu^mqdgu{!1<@4GCU{s^HYbTq2IYVtLWwmxi^3(PVOvoK}e@TSdH8?bJktElq+$2jk%LW#{gl> zSrs572ju5ULMuQi#&ZtX*^?!(dfEzeasWaO$O6*~<~|o*o>O7Ya8)&1s(6Q0XVos7 zx(ZOJ4U*JwEzbaLhv46Fpt?mK4UtseW^$;S9D4t)KisG#$Nx#B*ahh?oxShPzQ6Rr z+Hco3GH0uY&(-?Q*E(mvjpD~|#gcDC{oMm4wW$nLm4Q3Me^#E^>g>BOA9|4Pd{4QP z+#Ebn9XzoyI{WGKwXXSE`n3)DH3w1q;P_-m^iLhJ$pNJR!$v_^v24Et)osEE#tiw$ z8xTjZs2({DvrJ|&G_){|2IF`zmT_E(W#XPP<@<>n#{)n0v!e}G937=ccZl%OpL_D$ zvVgK&VzJF3dj zw>16Y$7CDEgpXkLTv$C19p?yCza(3!v6?)#)ziN*FkI~!smUW--TQuRSG%A6Tz;10 zLa_~;yJBf?JH`#RgMH}JkcHbtsBV*{2fPboEW95)LBy1-$UErc&|`|?hJhQoNkUI` z1(*&Ym}JG?k)E(tYOc-5a~xeJe-?Q z1&(=2KodU&BVTfb)OX_$s~PxrhM)o))Ir(~)Y1nx)5F#D@Mbz!P3LOqu?=}lZ1iGC zqf=_8zdf-40IE56bU;mwniiy1^mlhveh`0sW0n8;abLc+k*q?v@8bfYTxa z4Py5c0NUzWn%F!+s~ZB~t03Uz3xHib2`H_Duw@aglNg|Y?zUWwA$X{VCxOpihXAIr z0>F6%F+iF3t*mzdQ?AB>9cdSzgk@K8eSle8sHh{=^vGuV#cKM+d&ydQYD1n1R8{0| zUI&EdcF_QF5k9kk);BB-Cv^d4o=$adwmKk5>j;z=6}2Jtz7-DCx2dv%&S7VV)HlHX zA3_-3`(y|O<`X52YZhiXEo_{ib2hg$6WqQ|MeJB`DMlWcTHvF7DG^uf)KMV{zK)8o z;Bu#c`}_=4J6vur&SJHMUno?dsa-o!KUGbi`ef$bE4B264f%qPdv~ZOs))jiE=1nT z@Jj+xS3pA@7WAmXa9@PZ)1rSf5+=36cz@P{KkCPS6oN3*qevM0ql=`pP**~;t*<$?j-!W0fxE=)A;C7%+ev>f-H<* zYh+z$7xpUG42{mu%+nvf@RBbv0Rl_cpt>Ap|8?vvzwlKP6A{(_wTJIVfoy!8cn>#xzSujG*pdF1QPeYehk zBd5}lTT1;vpY*!)k-SZ?eUyz#!@pX6M4+j+k;uMV`!}V&s?>L9;dAL|J)%e>ca(1k zG}}=UIVL9ReTp>x;gM~a9moE}otHkG{;2nNv(tuM=$V_4@6`QQLF?&z+^psmNrzQMYJy#$H( LKT1MR$iTk=Qq3EW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10ff1df5970dc8c1955d35ffe253c43bf99c938f GIT binary patch literal 2893 zcmZt|TTC3+_0Dq_W|!qH8nW<@RZzBm=t!dL=4j3YQS%fA43 z0H*;sO~uB9@-KFILh$4_u&QC=MKzqWH9S3EMHN$B43Grpg(k4$sB<_WdP3SNdSXV; zQBS<2JJge|TDol|UP$mO%@dfano8B=JD4~?9ZT?@IH{VL0ih$rP^M_9rk=Y3^zdav zrL#6M0a$UP^=}7kiAg0V45l^GCfKLJ2|4~Y4w7Y<45r1h;319(d3n4-oG?F zj*H7S(HuCr((s0D;$$8^gkh14y=)n_swJ0Ch@m=;KC5HGJ}de*ey^Yt>?AYbGe(IWQZ5(aR_3aemP6X; z4T_1S8cb5TOzZ`mqs&Z(Hvzt+YoH6Hi0Z39Bn9f5-kNc21JmF}PXbd6&65eH1!Cnm z7XR83VHe=pzW}eh$VCfBxiz7OwS9p}KDRVZ;~(->VivM$@_;^vVfy0-@1;zOrgEvP4rEJe42-qn8KP@?3L?5l?R+ZFzMQ5lN1rip$}D1Q zDP`z0sl4y9p@G3~ryQNKkmeR4s!l4e=Tp-VDBpQ0vzCsj=>^BO2J%I(fdSKydYGI9 z8+w^BUGQ2(J4*ANb2rc3di`%od`pR!+se6Z<;-L8%s#M@Cz#IM*PIpts_(QX@G(%m z9A$F;qBU0_M44;-RjojcKSB{T;eD~h>8QlhpckMFy8a7N57cFswyRFcM zK$9yxtc9l}xgzO>a47+=zSpHP=#HG@=TMHn4jrf@^T_2~Inc4e-;Ri=6e`Kqb)SP4 zqIE3+RM!@qD}`K16Bl1Wh@>^i4J{#(bVCcV;6#1bq~OdEOIn#FuDsAvmkXdE(ZI6y znq|%3tT~VbTS6}HO2eSyc3ETz+!ko7?}yT1H%ufq?DCq-PPlv)e8a(0l9!J_iO|Y9 z=q5{;(6}0}HNdz%!%8s@DP{xp``Nc9lR4YWtCVGET!Xd+HY zOxqXzq@lGyf)S{mG(jbit8=KtQFg{(E~-27`d}?d_>$lX8s`V1y#YREfhFd13#zkr z6O0jdg8Rml;ay?&h~(`d5z)hBpogJ#xj(cs-owlycAAi=Ctnl)&{-?)J+>hLgl&?KGp4{mXO8UFfqw^fRz3^gfC?0VAo&u937^jIw!v0sP zeog@7#U@6tq%-L&>FKdIM=xcve%tgybC^!6hT#bSc#@Mhbhc5L%AUe_d9}zUYodX~ znZ6`b1*69)7}TEto@4^3djeSEaZ8@Gq#6b6g=*&<*6mn8{8f#LawG`kb>K7mod3aV z6;}f7S8ZwsO~2SF(Zt|6|WS+bVI?)Vw;jd;IhsYLU8cM%JXY0(ARLVN2=S ziL~!Fb#6-AO()lcFO=q|{i)xLe=`25wB3LH-vZy?v~&8EjaZrcy!qt{L)S*XM6i7s zM#oN-M}B?rql*tle>u6`KD0Kv1EE;>EEccG5TwoCjp3cMul`B-gYxOf_Sx_KwLAS_ zaPtTEuid-$^LHP2r`Jcfy3!UjzU2F21^An}g12$H^g<`FD?3?y> z(~GMYzX&z$#7_gev=u(_RB2hA_-d~gjQDD=6`i=iIT3Kdqn6l6T>f)M=SZ(SnTUB2 z|HoyZ`ZrfE8^0R7Xq9PJ|LF*uJ)TU9d8h=!x(8uJOIQf1*#Nx;5$0___`dHyLF7e7 zVD)kk9yV>QVBquQ0-&tZIOFiD2pq@#M@HQ67CQHL^wK|2VjCs)#I81eHC7qsxW4sl j1;MtN-Dg`R+{d-9U#lS4%I)RcgQ4>LM<<^#)W7Wi7}3^6 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55c5b7d064aee35eb811904a4177ecbed1652736 GIT binary patch literal 35730 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f69e0c294717b69c7a43eb046c3b01e96f0226c GIT binary patch literal 15808 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py new file mode 100644 index 0000000..27362fc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py @@ -0,0 +1,84 @@ +# Extracted from https://github.com/pfmoore/pkg_metadata + +from email.header import Header, decode_header, make_header +from email.message import Message +from typing import Any, Dict, List, Union + +METADATA_FIELDS = [ + # Name, Multiple-Use + ("Metadata-Version", False), + ("Name", False), + ("Version", False), + ("Dynamic", True), + ("Platform", True), + ("Supported-Platform", True), + ("Summary", False), + ("Description", False), + ("Description-Content-Type", False), + ("Keywords", False), + ("Home-page", False), + ("Download-URL", False), + ("Author", False), + ("Author-email", False), + ("Maintainer", False), + ("Maintainer-email", False), + ("License", False), + ("Classifier", True), + ("Requires-Dist", True), + ("Requires-Python", False), + ("Requires-External", True), + ("Project-URL", True), + ("Provides-Extra", True), + ("Provides-Dist", True), + ("Obsoletes-Dist", True), +] + + +def json_name(field: str) -> str: + return field.lower().replace("-", "_") + + +def msg_to_json(msg: Message) -> Dict[str, Any]: + """Convert a Message object into a JSON-compatible dictionary.""" + + def sanitise_header(h: Union[Header, str]) -> str: + if isinstance(h, Header): + chunks = [] + for bytes, encoding in decode_header(h): + if encoding == "unknown-8bit": + try: + # See if UTF-8 works + bytes.decode("utf-8") + encoding = "utf-8" + except UnicodeDecodeError: + # If not, latin1 at least won't fail + encoding = "latin1" + chunks.append((bytes, encoding)) + return str(make_header(chunks)) + return str(h) + + result = {} + for field, multi in METADATA_FIELDS: + if field not in msg: + continue + key = json_name(field) + if multi: + value: Union[str, List[str]] = [ + sanitise_header(v) for v in msg.get_all(field) # type: ignore + ] + else: + value = sanitise_header(msg.get(field)) # type: ignore + if key == "keywords": + # Accept both comma-separated and space-separated + # forms, for better compatibility with old data. + if "," in value: + value = [v.strip() for v in value.split(",")] + else: + value = value.split() + result[key] = value + + payload = msg.get_payload() + if payload: + result["description"] = payload + + return result diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/base.py b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/base.py new file mode 100644 index 0000000..9249124 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/base.py @@ -0,0 +1,702 @@ +import csv +import email.message +import functools +import json +import logging +import pathlib +import re +import zipfile +from typing import ( + IO, + TYPE_CHECKING, + Any, + Collection, + Container, + Dict, + Iterable, + Iterator, + List, + NamedTuple, + Optional, + Tuple, + Union, +) + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import LegacyVersion, Version + +from pip._internal.exceptions import NoneMetadataError +from pip._internal.locations import site_packages, user_site +from pip._internal.models.direct_url import ( + DIRECT_URL_METADATA_NAME, + DirectUrl, + DirectUrlValidationError, +) +from pip._internal.utils.compat import stdlib_pkgs # TODO: Move definition here. +from pip._internal.utils.egg_link import egg_link_path_from_sys_path +from pip._internal.utils.misc import is_local, normalize_path +from pip._internal.utils.urls import url_to_path + +from ._json import msg_to_json + +if TYPE_CHECKING: + from typing import Protocol +else: + Protocol = object + +DistributionVersion = Union[LegacyVersion, Version] + +InfoPath = Union[str, pathlib.PurePath] + +logger = logging.getLogger(__name__) + + +class BaseEntryPoint(Protocol): + @property + def name(self) -> str: + raise NotImplementedError() + + @property + def value(self) -> str: + raise NotImplementedError() + + @property + def group(self) -> str: + raise NotImplementedError() + + +def _convert_installed_files_path( + entry: Tuple[str, ...], + info: Tuple[str, ...], +) -> str: + """Convert a legacy installed-files.txt path into modern RECORD path. + + The legacy format stores paths relative to the info directory, while the + modern format stores paths relative to the package root, e.g. the + site-packages directory. + + :param entry: Path parts of the installed-files.txt entry. + :param info: Path parts of the egg-info directory relative to package root. + :returns: The converted entry. + + For best compatibility with symlinks, this does not use ``abspath()`` or + ``Path.resolve()``, but tries to work with path parts: + + 1. While ``entry`` starts with ``..``, remove the equal amounts of parts + from ``info``; if ``info`` is empty, start appending ``..`` instead. + 2. Join the two directly. + """ + while entry and entry[0] == "..": + if not info or info[-1] == "..": + info += ("..",) + else: + info = info[:-1] + entry = entry[1:] + return str(pathlib.Path(*info, *entry)) + + +class RequiresEntry(NamedTuple): + requirement: str + extra: str + marker: str + + +class BaseDistribution(Protocol): + @classmethod + def from_directory(cls, directory: str) -> "BaseDistribution": + """Load the distribution from a metadata directory. + + :param directory: Path to a metadata directory, e.g. ``.dist-info``. + """ + raise NotImplementedError() + + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> "BaseDistribution": + """Load the distribution from the contents of a METADATA file. + + This is used to implement PEP 658 by generating a "shallow" dist object that can + be used for resolution without downloading or building the actual dist yet. + + :param metadata_contents: The contents of a METADATA file. + :param filename: File name for the dist with this metadata. + :param project_name: Name of the project this dist represents. + """ + raise NotImplementedError() + + @classmethod + def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution": + """Load the distribution from a given wheel. + + :param wheel: A concrete wheel definition. + :param name: File name of the wheel. + + :raises InvalidWheel: Whenever loading of the wheel causes a + :py:exc:`zipfile.BadZipFile` exception to be thrown. + :raises UnsupportedWheel: If the wheel is a valid zip, but malformed + internally. + """ + raise NotImplementedError() + + def __repr__(self) -> str: + return f"{self.raw_name} {self.version} ({self.location})" + + def __str__(self) -> str: + return f"{self.raw_name} {self.version}" + + @property + def location(self) -> Optional[str]: + """Where the distribution is loaded from. + + A string value is not necessarily a filesystem path, since distributions + can be loaded from other sources, e.g. arbitrary zip archives. ``None`` + means the distribution is created in-memory. + + Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If + this is a symbolic link, we want to preserve the relative path between + it and files in the distribution. + """ + raise NotImplementedError() + + @property + def editable_project_location(self) -> Optional[str]: + """The project location for editable distributions. + + This is the directory where pyproject.toml or setup.py is located. + None if the distribution is not installed in editable mode. + """ + # TODO: this property is relatively costly to compute, memoize it ? + direct_url = self.direct_url + if direct_url: + if direct_url.is_local_editable(): + return url_to_path(direct_url.url) + else: + # Search for an .egg-link file by walking sys.path, as it was + # done before by dist_is_editable(). + egg_link_path = egg_link_path_from_sys_path(self.raw_name) + if egg_link_path: + # TODO: get project location from second line of egg_link file + # (https://github.com/pypa/pip/issues/10243) + return self.location + return None + + @property + def installed_location(self) -> Optional[str]: + """The distribution's "installed" location. + + This should generally be a ``site-packages`` directory. This is + usually ``dist.location``, except for legacy develop-installed packages, + where ``dist.location`` is the source code location, and this is where + the ``.egg-link`` file is. + + The returned location is normalized (in particular, with symlinks removed). + """ + raise NotImplementedError() + + @property + def info_location(self) -> Optional[str]: + """Location of the .[egg|dist]-info directory or file. + + Similarly to ``location``, a string value is not necessarily a + filesystem path. ``None`` means the distribution is created in-memory. + + For a modern .dist-info installation on disk, this should be something + like ``{location}/{raw_name}-{version}.dist-info``. + + Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If + this is a symbolic link, we want to preserve the relative path between + it and other files in the distribution. + """ + raise NotImplementedError() + + @property + def installed_by_distutils(self) -> bool: + """Whether this distribution is installed with legacy distutils format. + + A distribution installed with "raw" distutils not patched by setuptools + uses one single file at ``info_location`` to store metadata. We need to + treat this specially on uninstallation. + """ + info_location = self.info_location + if not info_location: + return False + return pathlib.Path(info_location).is_file() + + @property + def installed_as_egg(self) -> bool: + """Whether this distribution is installed as an egg. + + This usually indicates the distribution was installed by (older versions + of) easy_install. + """ + location = self.location + if not location: + return False + return location.endswith(".egg") + + @property + def installed_with_setuptools_egg_info(self) -> bool: + """Whether this distribution is installed with the ``.egg-info`` format. + + This usually indicates the distribution was installed with setuptools + with an old pip version or with ``single-version-externally-managed``. + + Note that this ensure the metadata store is a directory. distutils can + also installs an ``.egg-info``, but as a file, not a directory. This + property is *False* for that case. Also see ``installed_by_distutils``. + """ + info_location = self.info_location + if not info_location: + return False + if not info_location.endswith(".egg-info"): + return False + return pathlib.Path(info_location).is_dir() + + @property + def installed_with_dist_info(self) -> bool: + """Whether this distribution is installed with the "modern format". + + This indicates a "modern" installation, e.g. storing metadata in the + ``.dist-info`` directory. This applies to installations made by + setuptools (but through pip, not directly), or anything using the + standardized build backend interface (PEP 517). + """ + info_location = self.info_location + if not info_location: + return False + if not info_location.endswith(".dist-info"): + return False + return pathlib.Path(info_location).is_dir() + + @property + def canonical_name(self) -> NormalizedName: + raise NotImplementedError() + + @property + def version(self) -> DistributionVersion: + raise NotImplementedError() + + @property + def setuptools_filename(self) -> str: + """Convert a project name to its setuptools-compatible filename. + + This is a copy of ``pkg_resources.to_filename()`` for compatibility. + """ + return self.raw_name.replace("-", "_") + + @property + def direct_url(self) -> Optional[DirectUrl]: + """Obtain a DirectUrl from this distribution. + + Returns None if the distribution has no `direct_url.json` metadata, + or if `direct_url.json` is invalid. + """ + try: + content = self.read_text(DIRECT_URL_METADATA_NAME) + except FileNotFoundError: + return None + try: + return DirectUrl.from_json(content) + except ( + UnicodeDecodeError, + json.JSONDecodeError, + DirectUrlValidationError, + ) as e: + logger.warning( + "Error parsing %s for %s: %s", + DIRECT_URL_METADATA_NAME, + self.canonical_name, + e, + ) + return None + + @property + def installer(self) -> str: + try: + installer_text = self.read_text("INSTALLER") + except (OSError, ValueError, NoneMetadataError): + return "" # Fail silently if the installer file cannot be read. + for line in installer_text.splitlines(): + cleaned_line = line.strip() + if cleaned_line: + return cleaned_line + return "" + + @property + def requested(self) -> bool: + return self.is_file("REQUESTED") + + @property + def editable(self) -> bool: + return bool(self.editable_project_location) + + @property + def local(self) -> bool: + """If distribution is installed in the current virtual environment. + + Always True if we're not in a virtualenv. + """ + if self.installed_location is None: + return False + return is_local(self.installed_location) + + @property + def in_usersite(self) -> bool: + if self.installed_location is None or user_site is None: + return False + return self.installed_location.startswith(normalize_path(user_site)) + + @property + def in_site_packages(self) -> bool: + if self.installed_location is None or site_packages is None: + return False + return self.installed_location.startswith(normalize_path(site_packages)) + + def is_file(self, path: InfoPath) -> bool: + """Check whether an entry in the info directory is a file.""" + raise NotImplementedError() + + def iter_distutils_script_names(self) -> Iterator[str]: + """Find distutils 'scripts' entries metadata. + + If 'scripts' is supplied in ``setup.py``, distutils records those in the + installed distribution's ``scripts`` directory, a file for each script. + """ + raise NotImplementedError() + + def read_text(self, path: InfoPath) -> str: + """Read a file in the info directory. + + :raise FileNotFoundError: If ``path`` does not exist in the directory. + :raise NoneMetadataError: If ``path`` exists in the info directory, but + cannot be read. + """ + raise NotImplementedError() + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + raise NotImplementedError() + + def _metadata_impl(self) -> email.message.Message: + raise NotImplementedError() + + @functools.lru_cache(maxsize=1) + def _metadata_cached(self) -> email.message.Message: + # When we drop python 3.7 support, move this to the metadata property and use + # functools.cached_property instead of lru_cache. + metadata = self._metadata_impl() + self._add_egg_info_requires(metadata) + return metadata + + @property + def metadata(self) -> email.message.Message: + """Metadata of distribution parsed from e.g. METADATA or PKG-INFO. + + This should return an empty message if the metadata file is unavailable. + + :raises NoneMetadataError: If the metadata file is available, but does + not contain valid metadata. + """ + return self._metadata_cached() + + @property + def metadata_dict(self) -> Dict[str, Any]: + """PEP 566 compliant JSON-serializable representation of METADATA or PKG-INFO. + + This should return an empty dict if the metadata file is unavailable. + + :raises NoneMetadataError: If the metadata file is available, but does + not contain valid metadata. + """ + return msg_to_json(self.metadata) + + @property + def metadata_version(self) -> Optional[str]: + """Value of "Metadata-Version:" in distribution metadata, if available.""" + return self.metadata.get("Metadata-Version") + + @property + def raw_name(self) -> str: + """Value of "Name:" in distribution metadata.""" + # The metadata should NEVER be missing the Name: key, but if it somehow + # does, fall back to the known canonical name. + return self.metadata.get("Name", self.canonical_name) + + @property + def requires_python(self) -> SpecifierSet: + """Value of "Requires-Python:" in distribution metadata. + + If the key does not exist or contains an invalid value, an empty + SpecifierSet should be returned. + """ + value = self.metadata.get("Requires-Python") + if value is None: + return SpecifierSet() + try: + # Convert to str to satisfy the type checker; this can be a Header object. + spec = SpecifierSet(str(value)) + except InvalidSpecifier as e: + message = "Package %r has an invalid Requires-Python: %s" + logger.warning(message, self.raw_name, e) + return SpecifierSet() + return spec + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + """Dependencies of this distribution. + + For modern .dist-info distributions, this is the collection of + "Requires-Dist:" entries in distribution metadata. + """ + raise NotImplementedError() + + def iter_provided_extras(self) -> Iterable[str]: + """Extras provided by this distribution. + + For modern .dist-info distributions, this is the collection of + "Provides-Extra:" entries in distribution metadata. + + The return value of this function is not particularly useful other than + display purposes due to backward compatibility issues and the extra + names being poorly normalized prior to PEP 685. If you want to perform + logic operations on extras, use :func:`is_extra_provided` instead. + """ + raise NotImplementedError() + + def is_extra_provided(self, extra: str) -> bool: + """Check whether an extra is provided by this distribution. + + This is needed mostly for compatibility issues with pkg_resources not + following the extra normalization rules defined in PEP 685. + """ + raise NotImplementedError() + + def _iter_declared_entries_from_record(self) -> Optional[Iterator[str]]: + try: + text = self.read_text("RECORD") + except FileNotFoundError: + return None + # This extra Path-str cast normalizes entries. + return (str(pathlib.Path(row[0])) for row in csv.reader(text.splitlines())) + + def _iter_declared_entries_from_legacy(self) -> Optional[Iterator[str]]: + try: + text = self.read_text("installed-files.txt") + except FileNotFoundError: + return None + paths = (p for p in text.splitlines(keepends=False) if p) + root = self.location + info = self.info_location + if root is None or info is None: + return paths + try: + info_rel = pathlib.Path(info).relative_to(root) + except ValueError: # info is not relative to root. + return paths + if not info_rel.parts: # info *is* root. + return paths + return ( + _convert_installed_files_path(pathlib.Path(p).parts, info_rel.parts) + for p in paths + ) + + def iter_declared_entries(self) -> Optional[Iterator[str]]: + """Iterate through file entries declared in this distribution. + + For modern .dist-info distributions, this is the files listed in the + ``RECORD`` metadata file. For legacy setuptools distributions, this + comes from ``installed-files.txt``, with entries normalized to be + compatible with the format used by ``RECORD``. + + :return: An iterator for listed entries, or None if the distribution + contains neither ``RECORD`` nor ``installed-files.txt``. + """ + return ( + self._iter_declared_entries_from_record() + or self._iter_declared_entries_from_legacy() + ) + + def _iter_requires_txt_entries(self) -> Iterator[RequiresEntry]: + """Parse a ``requires.txt`` in an egg-info directory. + + This is an INI-ish format where an egg-info stores dependencies. A + section name describes extra other environment markers, while each entry + is an arbitrary string (not a key-value pair) representing a dependency + as a requirement string (no markers). + + There is a construct in ``importlib.metadata`` called ``Sectioned`` that + does mostly the same, but the format is currently considered private. + """ + try: + content = self.read_text("requires.txt") + except FileNotFoundError: + return + extra = marker = "" # Section-less entries don't have markers. + for line in content.splitlines(): + line = line.strip() + if not line or line.startswith("#"): # Comment; ignored. + continue + if line.startswith("[") and line.endswith("]"): # A section header. + extra, _, marker = line.strip("[]").partition(":") + continue + yield RequiresEntry(requirement=line, extra=extra, marker=marker) + + def _iter_egg_info_extras(self) -> Iterable[str]: + """Get extras from the egg-info directory.""" + known_extras = {""} + for entry in self._iter_requires_txt_entries(): + extra = canonicalize_name(entry.extra) + if extra in known_extras: + continue + known_extras.add(extra) + yield extra + + def _iter_egg_info_dependencies(self) -> Iterable[str]: + """Get distribution dependencies from the egg-info directory. + + To ease parsing, this converts a legacy dependency entry into a PEP 508 + requirement string. Like ``_iter_requires_txt_entries()``, there is code + in ``importlib.metadata`` that does mostly the same, but not do exactly + what we need. + + Namely, ``importlib.metadata`` does not normalize the extra name before + putting it into the requirement string, which causes marker comparison + to fail because the dist-info format do normalize. This is consistent in + all currently available PEP 517 backends, although not standardized. + """ + for entry in self._iter_requires_txt_entries(): + extra = canonicalize_name(entry.extra) + if extra and entry.marker: + marker = f'({entry.marker}) and extra == "{extra}"' + elif extra: + marker = f'extra == "{extra}"' + elif entry.marker: + marker = entry.marker + else: + marker = "" + if marker: + yield f"{entry.requirement} ; {marker}" + else: + yield entry.requirement + + def _add_egg_info_requires(self, metadata: email.message.Message) -> None: + """Add egg-info requires.txt information to the metadata.""" + if not metadata.get_all("Requires-Dist"): + for dep in self._iter_egg_info_dependencies(): + metadata["Requires-Dist"] = dep + if not metadata.get_all("Provides-Extra"): + for extra in self._iter_egg_info_extras(): + metadata["Provides-Extra"] = extra + + +class BaseEnvironment: + """An environment containing distributions to introspect.""" + + @classmethod + def default(cls) -> "BaseEnvironment": + raise NotImplementedError() + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> "BaseEnvironment": + raise NotImplementedError() + + def get_distribution(self, name: str) -> Optional["BaseDistribution"]: + """Given a requirement name, return the installed distributions. + + The name may not be normalized. The implementation must canonicalize + it for lookup. + """ + raise NotImplementedError() + + def _iter_distributions(self) -> Iterator["BaseDistribution"]: + """Iterate through installed distributions. + + This function should be implemented by subclass, but never called + directly. Use the public ``iter_distribution()`` instead, which + implements additional logic to make sure the distributions are valid. + """ + raise NotImplementedError() + + def iter_all_distributions(self) -> Iterator[BaseDistribution]: + """Iterate through all installed distributions without any filtering.""" + for dist in self._iter_distributions(): + # Make sure the distribution actually comes from a valid Python + # packaging distribution. Pip's AdjacentTempDirectory leaves folders + # e.g. ``~atplotlib.dist-info`` if cleanup was interrupted. The + # valid project name pattern is taken from PEP 508. + project_name_valid = re.match( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", + dist.canonical_name, + flags=re.IGNORECASE, + ) + if not project_name_valid: + logger.warning( + "Ignoring invalid distribution %s (%s)", + dist.canonical_name, + dist.location, + ) + continue + yield dist + + def iter_installed_distributions( + self, + local_only: bool = True, + skip: Container[str] = stdlib_pkgs, + include_editables: bool = True, + editables_only: bool = False, + user_only: bool = False, + ) -> Iterator[BaseDistribution]: + """Return a list of installed distributions. + + This is based on ``iter_all_distributions()`` with additional filtering + options. Note that ``iter_installed_distributions()`` without arguments + is *not* equal to ``iter_all_distributions()``, since some of the + configurations exclude packages by default. + + :param local_only: If True (default), only return installations + local to the current virtualenv, if in a virtualenv. + :param skip: An iterable of canonicalized project names to ignore; + defaults to ``stdlib_pkgs``. + :param include_editables: If False, don't report editables. + :param editables_only: If True, only report editables. + :param user_only: If True, only report installations in the user + site directory. + """ + it = self.iter_all_distributions() + if local_only: + it = (d for d in it if d.local) + if not include_editables: + it = (d for d in it if not d.editable) + if editables_only: + it = (d for d in it if d.editable) + if user_only: + it = (d for d in it if d.in_usersite) + return (d for d in it if d.canonical_name not in skip) + + +class Wheel(Protocol): + location: str + + def as_zipfile(self) -> zipfile.ZipFile: + raise NotImplementedError() + + +class FilesystemWheel(Wheel): + def __init__(self, location: str) -> None: + self.location = location + + def as_zipfile(self) -> zipfile.ZipFile: + return zipfile.ZipFile(self.location, allowZip64=True) + + +class MemoryWheel(Wheel): + def __init__(self, location: str, stream: IO[bytes]) -> None: + self.location = location + self.stream = stream + + def as_zipfile(self) -> zipfile.ZipFile: + return zipfile.ZipFile(self.stream, allowZip64=True) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py new file mode 100644 index 0000000..a779138 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py @@ -0,0 +1,6 @@ +from ._dists import Distribution +from ._envs import Environment + +__all__ = ["NAME", "Distribution", "Environment"] + +NAME = "importlib" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36689a68d19da7d7ec1a11e83219d590944617eb GIT binary patch literal 376 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 Ii3!{P0uAwq?EnA( literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py new file mode 100644 index 0000000..593bff2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py @@ -0,0 +1,55 @@ +import importlib.metadata +from typing import Any, Optional, Protocol, cast + + +class BadMetadata(ValueError): + def __init__(self, dist: importlib.metadata.Distribution, *, reason: str) -> None: + self.dist = dist + self.reason = reason + + def __str__(self) -> str: + return f"Bad metadata in {self.dist} ({self.reason})" + + +class BasePath(Protocol): + """A protocol that various path objects conform. + + This exists because importlib.metadata uses both ``pathlib.Path`` and + ``zipfile.Path``, and we need a common base for type hints (Union does not + work well since ``zipfile.Path`` is too new for our linter setup). + + This does not mean to be exhaustive, but only contains things that present + in both classes *that we need*. + """ + + @property + def name(self) -> str: + raise NotImplementedError() + + @property + def parent(self) -> "BasePath": + raise NotImplementedError() + + +def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]: + """Find the path to the distribution's metadata directory. + + HACK: This relies on importlib.metadata's private ``_path`` attribute. Not + all distributions exist on disk, so importlib.metadata is correct to not + expose the attribute as public. But pip's code base is old and not as clean, + so we do this to avoid having to rewrite too many things. Hopefully we can + eliminate this some day. + """ + return getattr(d, "_path", None) + + +def get_dist_name(dist: importlib.metadata.Distribution) -> str: + """Get the distribution's project name. + + The ``name`` attribute is only available in Python 3.10 or later. We are + targeting exactly that, but Mypy does not know this. + """ + name = cast(Any, dist).name + if not isinstance(name, str): + raise BadMetadata(dist, reason="invalid metadata entry 'name'") + return name diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py new file mode 100644 index 0000000..26370fa --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py @@ -0,0 +1,227 @@ +import email.message +import importlib.metadata +import os +import pathlib +import zipfile +from typing import ( + Collection, + Dict, + Iterable, + Iterator, + Mapping, + Optional, + Sequence, + cast, +) + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import InvalidWheel, UnsupportedWheel +from pip._internal.metadata.base import ( + BaseDistribution, + BaseEntryPoint, + DistributionVersion, + InfoPath, + Wheel, +) +from pip._internal.utils.misc import normalize_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file + +from ._compat import BasePath, get_dist_name + + +class WheelDistribution(importlib.metadata.Distribution): + """An ``importlib.metadata.Distribution`` read from a wheel. + + Although ``importlib.metadata.PathDistribution`` accepts ``zipfile.Path``, + its implementation is too "lazy" for pip's needs (we can't keep the ZipFile + handle open for the entire lifetime of the distribution object). + + This implementation eagerly reads the entire metadata directory into the + memory instead, and operates from that. + """ + + def __init__( + self, + files: Mapping[pathlib.PurePosixPath, bytes], + info_location: pathlib.PurePosixPath, + ) -> None: + self._files = files + self.info_location = info_location + + @classmethod + def from_zipfile( + cls, + zf: zipfile.ZipFile, + name: str, + location: str, + ) -> "WheelDistribution": + info_dir, _ = parse_wheel(zf, name) + paths = ( + (name, pathlib.PurePosixPath(name.split("/", 1)[-1])) + for name in zf.namelist() + if name.startswith(f"{info_dir}/") + ) + files = { + relpath: read_wheel_metadata_file(zf, fullpath) + for fullpath, relpath in paths + } + info_location = pathlib.PurePosixPath(location, info_dir) + return cls(files, info_location) + + def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]: + # Only allow iterating through the metadata directory. + if pathlib.PurePosixPath(str(path)) in self._files: + return iter(self._files) + raise FileNotFoundError(path) + + def read_text(self, filename: str) -> Optional[str]: + try: + data = self._files[pathlib.PurePosixPath(filename)] + except KeyError: + return None + try: + text = data.decode("utf-8") + except UnicodeDecodeError as e: + wheel = self.info_location.parent + error = f"Error decoding metadata for {wheel}: {e} in {filename} file" + raise UnsupportedWheel(error) + return text + + +class Distribution(BaseDistribution): + def __init__( + self, + dist: importlib.metadata.Distribution, + info_location: Optional[BasePath], + installed_location: Optional[BasePath], + ) -> None: + self._dist = dist + self._info_location = info_location + self._installed_location = installed_location + + @classmethod + def from_directory(cls, directory: str) -> BaseDistribution: + info_location = pathlib.Path(directory) + dist = importlib.metadata.Distribution.at(info_location) + return cls(dist, info_location, info_location.parent) + + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> BaseDistribution: + # Generate temp dir to contain the metadata file, and write the file contents. + temp_dir = pathlib.Path( + TempDirectory(kind="metadata", globally_managed=True).path + ) + metadata_path = temp_dir / "METADATA" + metadata_path.write_bytes(metadata_contents) + # Construct dist pointing to the newly created directory. + dist = importlib.metadata.Distribution.at(metadata_path.parent) + return cls(dist, metadata_path.parent, None) + + @classmethod + def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: + try: + with wheel.as_zipfile() as zf: + dist = WheelDistribution.from_zipfile(zf, name, wheel.location) + except zipfile.BadZipFile as e: + raise InvalidWheel(wheel.location, name) from e + except UnsupportedWheel as e: + raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") + return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location)) + + @property + def location(self) -> Optional[str]: + if self._info_location is None: + return None + return str(self._info_location.parent) + + @property + def info_location(self) -> Optional[str]: + if self._info_location is None: + return None + return str(self._info_location) + + @property + def installed_location(self) -> Optional[str]: + if self._installed_location is None: + return None + return normalize_path(str(self._installed_location)) + + def _get_dist_name_from_location(self) -> Optional[str]: + """Try to get the name from the metadata directory name. + + This is much faster than reading metadata. + """ + if self._info_location is None: + return None + stem, suffix = os.path.splitext(self._info_location.name) + if suffix not in (".dist-info", ".egg-info"): + return None + return stem.split("-", 1)[0] + + @property + def canonical_name(self) -> NormalizedName: + name = self._get_dist_name_from_location() or get_dist_name(self._dist) + return canonicalize_name(name) + + @property + def version(self) -> DistributionVersion: + return parse_version(self._dist.version) + + def is_file(self, path: InfoPath) -> bool: + return self._dist.read_text(str(path)) is not None + + def iter_distutils_script_names(self) -> Iterator[str]: + # A distutils installation is always "flat" (not in e.g. egg form), so + # if this distribution's info location is NOT a pathlib.Path (but e.g. + # zipfile.Path), it can never contain any distutils scripts. + if not isinstance(self._info_location, pathlib.Path): + return + for child in self._info_location.joinpath("scripts").iterdir(): + yield child.name + + def read_text(self, path: InfoPath) -> str: + content = self._dist.read_text(str(path)) + if content is None: + raise FileNotFoundError(path) + return content + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + # importlib.metadata's EntryPoint structure sasitfies BaseEntryPoint. + return self._dist.entry_points + + def _metadata_impl(self) -> email.message.Message: + # From Python 3.10+, importlib.metadata declares PackageMetadata as the + # return type. This protocol is unfortunately a disaster now and misses + # a ton of fields that we need, including get() and get_payload(). We + # rely on the implementation that the object is actually a Message now, + # until upstream can improve the protocol. (python/cpython#94952) + return cast(email.message.Message, self._dist.metadata) + + def iter_provided_extras(self) -> Iterable[str]: + return self.metadata.get_all("Provides-Extra", []) + + def is_extra_provided(self, extra: str) -> bool: + return any( + canonicalize_name(provided_extra) == canonicalize_name(extra) + for provided_extra in self.metadata.get_all("Provides-Extra", []) + ) + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras] + for req_string in self.metadata.get_all("Requires-Dist", []): + req = Requirement(req_string) + if not req.marker: + yield req + elif not extras and req.marker.evaluate({"extra": ""}): + yield req + elif any(req.marker.evaluate(context) for context in contexts): + yield req diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py new file mode 100644 index 0000000..048dc55 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py @@ -0,0 +1,189 @@ +import functools +import importlib.metadata +import logging +import os +import pathlib +import sys +import zipfile +import zipimport +from typing import Iterator, List, Optional, Sequence, Set, Tuple + +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name + +from pip._internal.metadata.base import BaseDistribution, BaseEnvironment +from pip._internal.models.wheel import Wheel +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filetypes import WHEEL_EXTENSION + +from ._compat import BadMetadata, BasePath, get_dist_name, get_info_location +from ._dists import Distribution + +logger = logging.getLogger(__name__) + + +def _looks_like_wheel(location: str) -> bool: + if not location.endswith(WHEEL_EXTENSION): + return False + if not os.path.isfile(location): + return False + if not Wheel.wheel_file_re.match(os.path.basename(location)): + return False + return zipfile.is_zipfile(location) + + +class _DistributionFinder: + """Finder to locate distributions. + + The main purpose of this class is to memoize found distributions' names, so + only one distribution is returned for each package name. At lot of pip code + assumes this (because it is setuptools's behavior), and not doing the same + can potentially cause a distribution in lower precedence path to override a + higher precedence one if the caller is not careful. + + Eventually we probably want to make it possible to see lower precedence + installations as well. It's useful feature, after all. + """ + + FoundResult = Tuple[importlib.metadata.Distribution, Optional[BasePath]] + + def __init__(self) -> None: + self._found_names: Set[NormalizedName] = set() + + def _find_impl(self, location: str) -> Iterator[FoundResult]: + """Find distributions in a location.""" + # Skip looking inside a wheel. Since a package inside a wheel is not + # always valid (due to .data directories etc.), its .dist-info entry + # should not be considered an installed distribution. + if _looks_like_wheel(location): + return + # To know exactly where we find a distribution, we have to feed in the + # paths one by one, instead of dumping the list to importlib.metadata. + for dist in importlib.metadata.distributions(path=[location]): + info_location = get_info_location(dist) + try: + raw_name = get_dist_name(dist) + except BadMetadata as e: + logger.warning("Skipping %s due to %s", info_location, e.reason) + continue + normalized_name = canonicalize_name(raw_name) + if normalized_name in self._found_names: + continue + self._found_names.add(normalized_name) + yield dist, info_location + + def find(self, location: str) -> Iterator[BaseDistribution]: + """Find distributions in a location. + + The path can be either a directory, or a ZIP archive. + """ + for dist, info_location in self._find_impl(location): + if info_location is None: + installed_location: Optional[BasePath] = None + else: + installed_location = info_location.parent + yield Distribution(dist, info_location, installed_location) + + def find_linked(self, location: str) -> Iterator[BaseDistribution]: + """Read location in egg-link files and return distributions in there. + + The path should be a directory; otherwise this returns nothing. This + follows how setuptools does this for compatibility. The first non-empty + line in the egg-link is read as a path (resolved against the egg-link's + containing directory if relative). Distributions found at that linked + location are returned. + """ + path = pathlib.Path(location) + if not path.is_dir(): + return + for child in path.iterdir(): + if child.suffix != ".egg-link": + continue + with child.open() as f: + lines = (line.strip() for line in f) + target_rel = next((line for line in lines if line), "") + if not target_rel: + continue + target_location = str(path.joinpath(target_rel)) + for dist, info_location in self._find_impl(target_location): + yield Distribution(dist, info_location, path) + + def _find_eggs_in_dir(self, location: str) -> Iterator[BaseDistribution]: + from pip._vendor.pkg_resources import find_distributions + + from pip._internal.metadata import pkg_resources as legacy + + with os.scandir(location) as it: + for entry in it: + if not entry.name.endswith(".egg"): + continue + for dist in find_distributions(entry.path): + yield legacy.Distribution(dist) + + def _find_eggs_in_zip(self, location: str) -> Iterator[BaseDistribution]: + from pip._vendor.pkg_resources import find_eggs_in_zip + + from pip._internal.metadata import pkg_resources as legacy + + try: + importer = zipimport.zipimporter(location) + except zipimport.ZipImportError: + return + for dist in find_eggs_in_zip(importer, location): + yield legacy.Distribution(dist) + + def find_eggs(self, location: str) -> Iterator[BaseDistribution]: + """Find eggs in a location. + + This actually uses the old *pkg_resources* backend. We likely want to + deprecate this so we can eventually remove the *pkg_resources* + dependency entirely. Before that, this should first emit a deprecation + warning for some versions when using the fallback since importing + *pkg_resources* is slow for those who don't need it. + """ + if os.path.isdir(location): + yield from self._find_eggs_in_dir(location) + if zipfile.is_zipfile(location): + yield from self._find_eggs_in_zip(location) + + +@functools.lru_cache(maxsize=None) # Warn a distribution exactly once. +def _emit_egg_deprecation(location: Optional[str]) -> None: + deprecated( + reason=f"Loading egg at {location} is deprecated.", + replacement="to use pip for package installation.", + gone_in="24.3", + issue=12330, + ) + + +class Environment(BaseEnvironment): + def __init__(self, paths: Sequence[str]) -> None: + self._paths = paths + + @classmethod + def default(cls) -> BaseEnvironment: + return cls(sys.path) + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: + if paths is None: + return cls(sys.path) + return cls(paths) + + def _iter_distributions(self) -> Iterator[BaseDistribution]: + finder = _DistributionFinder() + for location in self._paths: + yield from finder.find(location) + for dist in finder.find_eggs(location): + _emit_egg_deprecation(dist.location) + yield dist + # This must go last because that's how pkg_resources tie-breaks. + yield from finder.find_linked(location) + + def get_distribution(self, name: str) -> Optional[BaseDistribution]: + matches = ( + distribution + for distribution in self.iter_all_distributions() + if distribution.canonical_name == canonicalize_name(name) + ) + return next(matches, None) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py new file mode 100644 index 0000000..bb11e5b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py @@ -0,0 +1,278 @@ +import email.message +import email.parser +import logging +import os +import zipfile +from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional + +from pip._vendor import pkg_resources +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel +from pip._internal.utils.egg_link import egg_link_path_from_location +from pip._internal.utils.misc import display_path, normalize_path +from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file + +from .base import ( + BaseDistribution, + BaseEntryPoint, + BaseEnvironment, + DistributionVersion, + InfoPath, + Wheel, +) + +__all__ = ["NAME", "Distribution", "Environment"] + +logger = logging.getLogger(__name__) + +NAME = "pkg_resources" + + +class EntryPoint(NamedTuple): + name: str + value: str + group: str + + +class InMemoryMetadata: + """IMetadataProvider that reads metadata files from a dictionary. + + This also maps metadata decoding exceptions to our internal exception type. + """ + + def __init__(self, metadata: Mapping[str, bytes], wheel_name: str) -> None: + self._metadata = metadata + self._wheel_name = wheel_name + + def has_metadata(self, name: str) -> bool: + return name in self._metadata + + def get_metadata(self, name: str) -> str: + try: + return self._metadata[name].decode() + except UnicodeDecodeError as e: + # Augment the default error with the origin of the file. + raise UnsupportedWheel( + f"Error decoding metadata for {self._wheel_name}: {e} in {name} file" + ) + + def get_metadata_lines(self, name: str) -> Iterable[str]: + return pkg_resources.yield_lines(self.get_metadata(name)) + + def metadata_isdir(self, name: str) -> bool: + return False + + def metadata_listdir(self, name: str) -> List[str]: + return [] + + def run_script(self, script_name: str, namespace: str) -> None: + pass + + +class Distribution(BaseDistribution): + def __init__(self, dist: pkg_resources.Distribution) -> None: + self._dist = dist + + @classmethod + def from_directory(cls, directory: str) -> BaseDistribution: + dist_dir = directory.rstrip(os.sep) + + # Build a PathMetadata object, from path to metadata. :wink: + base_dir, dist_dir_name = os.path.split(dist_dir) + metadata = pkg_resources.PathMetadata(base_dir, dist_dir) + + # Determine the correct Distribution object type. + if dist_dir.endswith(".egg-info"): + dist_cls = pkg_resources.Distribution + dist_name = os.path.splitext(dist_dir_name)[0] + else: + assert dist_dir.endswith(".dist-info") + dist_cls = pkg_resources.DistInfoDistribution + dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0] + + dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata) + return cls(dist) + + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> BaseDistribution: + metadata_dict = { + "METADATA": metadata_contents, + } + dist = pkg_resources.DistInfoDistribution( + location=filename, + metadata=InMemoryMetadata(metadata_dict, filename), + project_name=project_name, + ) + return cls(dist) + + @classmethod + def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: + try: + with wheel.as_zipfile() as zf: + info_dir, _ = parse_wheel(zf, name) + metadata_dict = { + path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path) + for path in zf.namelist() + if path.startswith(f"{info_dir}/") + } + except zipfile.BadZipFile as e: + raise InvalidWheel(wheel.location, name) from e + except UnsupportedWheel as e: + raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") + dist = pkg_resources.DistInfoDistribution( + location=wheel.location, + metadata=InMemoryMetadata(metadata_dict, wheel.location), + project_name=name, + ) + return cls(dist) + + @property + def location(self) -> Optional[str]: + return self._dist.location + + @property + def installed_location(self) -> Optional[str]: + egg_link = egg_link_path_from_location(self.raw_name) + if egg_link: + location = egg_link + elif self.location: + location = self.location + else: + return None + return normalize_path(location) + + @property + def info_location(self) -> Optional[str]: + return self._dist.egg_info + + @property + def installed_by_distutils(self) -> bool: + # A distutils-installed distribution is provided by FileMetadata. This + # provider has a "path" attribute not present anywhere else. Not the + # best introspection logic, but pip has been doing this for a long time. + try: + return bool(self._dist._provider.path) + except AttributeError: + return False + + @property + def canonical_name(self) -> NormalizedName: + return canonicalize_name(self._dist.project_name) + + @property + def version(self) -> DistributionVersion: + return parse_version(self._dist.version) + + def is_file(self, path: InfoPath) -> bool: + return self._dist.has_metadata(str(path)) + + def iter_distutils_script_names(self) -> Iterator[str]: + yield from self._dist.metadata_listdir("scripts") + + def read_text(self, path: InfoPath) -> str: + name = str(path) + if not self._dist.has_metadata(name): + raise FileNotFoundError(name) + content = self._dist.get_metadata(name) + if content is None: + raise NoneMetadataError(self, name) + return content + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + for group, entries in self._dist.get_entry_map().items(): + for name, entry_point in entries.items(): + name, _, value = str(entry_point).partition("=") + yield EntryPoint(name=name.strip(), value=value.strip(), group=group) + + def _metadata_impl(self) -> email.message.Message: + """ + :raises NoneMetadataError: if the distribution reports `has_metadata()` + True but `get_metadata()` returns None. + """ + if isinstance(self._dist, pkg_resources.DistInfoDistribution): + metadata_name = "METADATA" + else: + metadata_name = "PKG-INFO" + try: + metadata = self.read_text(metadata_name) + except FileNotFoundError: + if self.location: + displaying_path = display_path(self.location) + else: + displaying_path = repr(self.location) + logger.warning("No metadata found in %s", displaying_path) + metadata = "" + feed_parser = email.parser.FeedParser() + feed_parser.feed(metadata) + return feed_parser.close() + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + if extras: # pkg_resources raises on invalid extras, so we sanitize. + extras = frozenset(pkg_resources.safe_extra(e) for e in extras) + extras = extras.intersection(self._dist.extras) + return self._dist.requires(extras) + + def iter_provided_extras(self) -> Iterable[str]: + return self._dist.extras + + def is_extra_provided(self, extra: str) -> bool: + return pkg_resources.safe_extra(extra) in self._dist.extras + + +class Environment(BaseEnvironment): + def __init__(self, ws: pkg_resources.WorkingSet) -> None: + self._ws = ws + + @classmethod + def default(cls) -> BaseEnvironment: + return cls(pkg_resources.working_set) + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: + return cls(pkg_resources.WorkingSet(paths)) + + def _iter_distributions(self) -> Iterator[BaseDistribution]: + for dist in self._ws: + yield Distribution(dist) + + def _search_distribution(self, name: str) -> Optional[BaseDistribution]: + """Find a distribution matching the ``name`` in the environment. + + This searches from *all* distributions available in the environment, to + match the behavior of ``pkg_resources.get_distribution()``. + """ + canonical_name = canonicalize_name(name) + for dist in self.iter_all_distributions(): + if dist.canonical_name == canonical_name: + return dist + return None + + def get_distribution(self, name: str) -> Optional[BaseDistribution]: + # Search the distribution by looking through the working set. + dist = self._search_distribution(name) + if dist: + return dist + + # If distribution could not be found, call working_set.require to + # update the working set, and try to find the distribution again. + # This might happen for e.g. when you install a package twice, once + # using setup.py develop and again using setup.py install. Now when + # running pip uninstall twice, the package gets removed from the + # working set in the first uninstall, so we have to populate the + # working set again so that pip knows about it and the packages gets + # picked up and is successfully uninstalled the second time too. + try: + # We didn't pass in any version specifiers, so this can never + # raise pkg_resources.VersionConflict. + self._ws.require(name) + except pkg_resources.DistributionNotFound: + return None + return self._search_distribution(name) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a93865f8f15ccb9f8d2f8718263505f231da9b4 GIT binary patch literal 284 zcmXv~F-`+95VS)CQKbCAZ3=D`XebaUQbb7y1&!t0t&-(@w&h)rj*svL-og)P`2Zqa zDtt;9X|*#`tY-FeHk+z~MfA|IkOWn-ub{8ug@lJs-VYElqND>o#a)>%`PC zh@-%!iw$}{m>E+>#vrB)2_aY0`?>x)v$lz~wI6CXoZn~YfEpm6rNfCtaqCWk&>%myc3+nsT$ zZU|Bikw_#E^nemnArM>|wSsVhV>p4tB^3vP)n52Ha9e4KsB+?s*ACliIWUsnd-L8K z&ztZ4{Mgx9M6gcJzA^oUgwStdlPx6`8Y3XAB7z9^P!(G_EaaRgRb@*~WXV&is-RG_HW~E<{3+g$c591Y6QHMDjVdWFk?8$ne3j;AZ=P#44lF9P=m3GVHP?Fc-Kr zz6A0SUPTLd0oj=qMJc8TE#&UvrW)+I%wa)--JVaBA%|Av1@wL|oI*31YYPW$YYeFc zv}%h}DpsVZBh%i)chj3Osv#pcY2;#Qme%6^gjQVN^{4H!=WuT1lefp6N$%|wl@=%z zJ{M9JYqkxiBHLzpxWZ6knNzRwByI(}`B&TK0xccZ;x0F>hD^|-m0_flA62jKeoqirjvls!d&#a{*TXc2Aq9A1{+D?I2s{@I&9^_>K{ zBUSybb*|*^YlpX=>Rs)>)xS3O>BPqqcaDE$tQ%Y1Ll2%lRaa1+rE47?Pu9LFX;bLW5keS6?&xV zL{DUL9kYWF0~gWi45|}}3SiK2w*B9*HtmPR!4p6L)vgzR?i#({HM-r={lWOkxL^}2 z6X~vzm%EE~Bo~TIoOuj5QQk?jiNOM`*0wor!07{;m@6q>a zMjuQ|U!RwCC(?JZ!9+sz_bIH#elNyxMj$dJ8b*jo0{CyrTjmzvF8N~W}UUVP+n`&{IDJoRFt z-I5#EQS)|Dxx3nM6UPx|z*dwr7s%8ljPXNs?hkb0A$sXAwGU6>t!GZ{AR#2j{{a;@ B$;ki! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a35a43a40d6ec65604f97fc3354c30484f872a01 GIT binary patch literal 11217 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f0ab3a5a2b2d34d2e9d2e3eb48a49c167f7905b GIT binary patch literal 1712 zcmZ`(&u<$=6rTOz^~Q1JmL#ra0$M2u>&G)|9 zpU1{>2*#C-)ipy$=yz%K2iVCtT>`a-2qKD)s)~x1pS(?D>`v3emZ ziCIoStcZnoJVLoe9qv(PIj&1Nw?t^sfJC7Od6i78Z8ASL0xJB_jdR>_6|97M(rluNwj3KNn6WN_tc=DPz8O&#n;3h6CooPRj19or_io3T z$YGquCYU_(J;7wn@tAA?u7wOoj#y_|@G)6nf_z1fbx!@-P%lO>c72C)jJc${Wm#KK zLc0+N+qG|T%DDXw6*RCGnMXW(k@5`@Mm8{|PQ_aR_ip>tZZv6d$A+5hs43RNV1D+> zoXtH!FGnf;xE*&|j$6M&3Ikuba zn5Fw>`DDDfqkm>TEKcqDU;4+zi=E=d{p&}?mye4Jo#Fz-Mo-GmAD1t6%9r*(Ix1fS zPvN9AbzGY1lxFs?9hK(5GuF+a7hv%(rgaKOAV3~Ka|gr%mjorDmyK#BpG&O$)IUOv22Wx1lWa}Z?bLBv_;U>#mt(xr;ZCS;@pg3A=kVnyi~2hl43 z7qj8kPs)VnKmcxq$uHWw?c>69r!akQ@w=sOmiEa}VgAsZXBS{aWkhl;a2gcjIEOK` zXA|Bpj`J9Qyy^J8NEX9WcEJst;eIH9GqJ`6OWK#z1MExLoPfeCv{{XgqlE>6jDA-t42f=dWb60B4kvp7Vji%vfec_W2mE~ zLKTM`Dz!aSB!Viamx4G{>ZR$8W2IhVB4jjbRiu_fZ-$^&<NsdfLucu z6(kcCWK+TlRx`kxkWKljS_t8=2^>?!5gf&_3E7jW;J13GX`&F{AeGH9>`aJQp8H`i z@a!}$yM*y}%lAzuFPx*rW)3`~0$1Q$YXxu(%}TRK_XGk|QC=E@5IgkE?Br#xQfyBU zs2ZZeP%iguPAfS~D{3E6NRf5|GwkF>iDg>aD5lfQEo)`sPGL6UQ0u&nwNe$5tJ&6h ztz2anT<74x;2RpX7~Wqtiqpme(4n)^b@YuK)a)~$H`ARG);6qQ59|m!f1L(!g%=wZ*|s@9xY9OXk}GaX}Y z&U7z3wriMB;R!c4;gZ~me26DsV)K|qbrY%xS6QG{!HGkE$r zQ^%h$V$gh?bikQB!d$RXWMrG5RNHc<$##JzE6~+Ct(42QB}`3X28xvNWMI_W$HTro z9;VQi*c20{Xj3At7*`0URMb9~%aN4ew6DKidh_g=J)8CKx@#CHin7rq09Vk%R9ii@ z<6dgVN_1pp_p#+e%Y7@mMpl7H?P#>1o}KlqR?BMj?BQDW@M`vGBZ|6umU{4Juviq9*Jy{IK! zPh{^UvNwCb>;Ja@&%S-PKK%aN?Q^SrN9T{Pq<7X@c0EY7&d14C@Uhq|FQ5pC2KBDg z6+mFPOAP-0nnhFVhg6e0ioTGF@+2zCA440>!Kj)F1v_5+XQiNtzLG!hP(gc6V!;r8 z-qNOgLmda1Bn*5i=Ev8aZ$-!QEn+A-MhWXWkLxGH#L?Vf(2od*|CyKT~DRlJ(*CfIgS12Pyl*^A)1aljCMfIZ-Lxl(s zgO82_xQZIG6gqb6?8=)bYx_^FAt0cS!dn}1SEy~}^N zt$~t3rr}NUYQz=L@ru{f4xX0*m1nuEVKaMMhAr%E9k#N!ZMY0?Q^+263_Ex#YYvr%ox{$s zYuFWb54*z^!xdrAuqRwOTp6w!t_oKVSBGncYgk@O$Q!O5u4Qp+s4iSTT+iaRP(yg# z@H!SR3pIw<53dh54L60GhnvGK!!0b`9@-EVh6NUPgj&OG!)@V>!y9={a>_RJqdc@J z+&3#AIMMSq=7*lQ)fYG1 zRWffS@>Z?NyG5*)swB6xRoXggT8A3wPpny;Hfj;QuUUq>#ad}AzHi0vI{fY__+5|R zy=dEd`J&d9f|uBU^h*T^T2$}RaKE??H8)BFtah8Y9<^;3n~c_)@p}gwbqhwaK@#3J zt5po|WT^sDTct`Pb(h#C?L=L>(9?}5yBj^@F3YQXAoA~Q(q~m{N0|;*ZeY|VcD`mY zW_9lr@7w%WRD8(CXC0zH<`0DYisEx*-4|Xsdt&6+sT0ROGdT2A)_f!~m9-oX24Y#u z>7WwJmYwlWOavoi+43QOSQ0NxPK2ba{h5haFdFfPvQ{<0`dkFRQFpm0O~_KfACpA< z@_g>pi4&(sPCS3%#L)S{XQ*-8DZerI%OghEKH0@u~0OSwX<~TdJMIBKO;>Y^(&HiEE=Bh%hH+P^xkdpmpg@7Srn`?qH;_}-T_hs7Ni zsQ>6+T#5t=*TSy-c-#iCzlEhD6dyJ{2ecnHOBTs0n)V|LiQGM=QtPK2zM8E4 zbTD#-Ai@7HF=g~a5n@pxpe~9K_D>1p{;QH8g)d2>D2e!`j0;!&p-D;U5iX1e6@dY; zfJIj%lpT*MQcrogfahWafO=5~Pbx9tk|g*eQ$m>Pk%j1}aB<}Pb7#*!bMC^4<0Gez zoIiEq{6(!;L8SqIgi4|}S0x#cOkMLwM1eq4xOhYkj0dkugOSnb#U9~v43 z0xXfn!@7fto<9G~P`4tz!)4uL(?hw?a~Vh&i%5#Hm3=}b5g{-x1+GxRYvU3UWK`{s zu{v0_XpuU^7Q!zm$Q||z*MhNe;bKov8KD&z@rOduYm&Ixcd;jHp@y?o)@r=|^BX%} z+Wf`9cr+N0lxg3A&7c25$4gzlPxwSY+Y1=bSrBf--{X@AKEv@qmjw3`U}Tz)8Tl@2 zy8)f3eZoe=;wba~~ZhG!-6q>CsZD{2| zcgnP>&DvxsHYrDjR!l1mkhYY^TM^KdUdFrli5b&+l~YVlb6?`8IJq6Ud?vXSuWZ#S z^2dC3oi7l08lnUII@%dg^+G8q>9p|Pk8 zBnb-!9%6R@9Ed`6GBz<8Q>j+Z&|B&x%WY`eXU^8D2t`}dsO%pLV=o#Z5LQ@oS=*Q# zot#j7)~q=YQskW|l(mNavA{T6Dprd^qXNMbw1ue~4MxP()y6j%D^xneDO95zL@>kU z>|B+1snVCO^et6xOIL1NtjSdFn6)lDD`yWZ*VHf9t-lqz8T!r04d<+7R{GFWowUrK zc;M+u*}LQcR8bl#`|)M1H3X~{t~+wl6XegUuqp4xFL@h+LKrObDscPkAE0KN^cW3*HUhKmPrvzxQ;?)1L7>m9js@<`>O%qtuYEA!{EQAtEs{ zk}V$@!Co;LqPS~h}D{paZDC#r`l#2q|Yn1m9{08?EOPO_7u9|aJ{QBTBf~Oxf zbtI48dHVL#ITz>HxMcUG?Y?Di{jF0sPhn?E9lP+L>A8&exty7EbUo%wj`GKDN3$(u zS@*b(xAx?0oULlv+A#CNlC>diZJ75yuy*83HtUv!njDAMV#EEebl-`ODgM~Z**Ynx z%31I;SIJvDlip-tejqu1yX7&5pE;Y!+LzpkhOB)#yUluvpC4bin(o+1m7U`6Z-2tx z>L6)o0sI+{j_{ASBdHX7FWDqp{sbzOsqDUJ6)j+R?NeqPGF)e*n4ivFC$Vnvlf*pI z%3)On|0Qe`w53F437o2$O&BG%5=XRXAV`NPl@ap`BF|r3hk`bW3n(_B| znDrINiFfhyYa3#ehdmZ66uG)#eGSlKL9N93RJ9|l|JBDOBU$JCY(Ugb3A ztwLwsRQ`i!unRV1GcqwuU4fWekQ(nUoWY(IyhhJ{oD2OSNq(kec_ih%ZNP<#T65)@zOoQ`vE@Nbv`<{%d^y@Ycslg=S8ztaM)o*1qrjdJbWa}Usb4oAoeO7 zTB%GwwVRs<$Pi4i{w3e)3&MyMtAdEUGNl0A3sa`%;`&ZFthqwj6c zbe_sM2UC_owsP^Z&4&~1{U?2dG_mol8{8BdH-n26yrw~UwxU18YszJLte7@MYUa` zq$eexzw?FLU&u6f|FOL%SB5e%T#N^VN-qQdxzT1$X>!i?h^kqkWgn~6y7 zF(5qSzak0BBzRa*I0(S#%r-h1!U31<7NQD;Cm}tNuKUB#B5b9TUMK#G25{D+BQiVp zVY|YY7#QAAh@`NxG!gO#bPl+!y?40_=yCT!r_I7jL|{QjPWtYCxU( z4ttGMC8`rF>&1i2E>uJ6m zl$XXR+NnlueNEyf)YyTPPK>-A@y$ggI|@qrioO-9HoJ_u*<4U!3rlsNZeKy_RK&@HCUbNOf%U$P(2S6_SNUs{X z65o4{6r~CTeh_UD?+7KPN;jF7$uFE$RSW{tR(2|a5+tHY+&r|lPTEmXg6TIcEG*NG zLD+|*POMD6-W|HZ(#soV5ai znsrHIV}_i1h>5l~wP$2H{Kf^}y4W78Y zQYTE&kfzGcyr`l;vdgHN-0P{H6G`d=1m~ zgnh;oZToe8Pdhf^_ha+=x?eKVgqltBu{J&J9kY(v;7x5Pr|$@K#_!Z~<=^@U zkkhNDPMLfb{{u`N+kR<}+Y2c4hXrhEdnq7}lekd8TXa$mfE|TcQq!Mq9+#z2Jp;j( zueg>x*zV1X%TZ&Yx}H>*;4r8W#$#ObgUN_aMnsh*pgz$9CPUTMs2e{eXOI-kTQ2*`wmS@O`2>l zG5H*qrdCu1i5_sSTklr4il%};rb_uB4Oh9MQy0#hR)-w(k3pxatf)nV;uBKAdzN{*q=Ppq%=d|= zk!jq)CDMeex@!%7+Sr_^eQ3+i1?!GRG!c)i=$2n6kYLcF(9uTaDZ!Yu9$`?0Oub)) zof05TT~Spe3J7KsL*NCK@YNvHd75@!0lyg%X-%oyQg|XZrNf$VURpU-1PVL$^fL`l zn54VGLa{H{SE@n-4VcW3NZ06y2Cq7(<>|A!a(X(=4vF%ajRI9iBiu>|pe=_{A*Lb^)-R7uk}{G_HZ%{c9-3{a+aQQu33p7sftiYW>YJ5d>lMwmOhT4GiZRuiK>jl2 zBnARz28BF_{07o|PE~V9=k8L~^S z2h+O;GrK>NvNu5f4Bg`TEwjhJe)`e+J;~A3`aP-5yAjSFfBp2M#!aZo^I`vy+poSC zqxzeco4e@UxZJj#-Wxu$yKj`G?G4HE|H6y<9@uw2(!MM=2}?~q>874c)3#a5AKTZl zlOmLZB=uv=AB^(Gm;f+9Y?}TM3&+^Dk2De8r!#HS=7bsQ15=)L`xV$Vus=G>^0p>* zn6|9JE}D%T)-`e%VlxQxO0%5SAg8xCUA9IZo6!z2fK_YcG7Rvh?Rl|d!X7i&IK3UY zHfG3KVo;!{Pr|OZqQ9pdk;;T!cI9)6h9m~xOri;lrcJIXXw4Qg7(Bf-#Vp#VZ4pbt zrcenRGkCF(_!10ZS;Fy-<86%*#xbQlK3uM2#WB?m4u)jH#MDGkxJ*0)l+ZHjcGjev>tTrVQHAhk-Myx}O-rpi(ycod$KSJO zS_d-~PtTf{QR2+aGpV+LjCVVTOhYRPlIF)V4ZXAO<*LS8%{QBq*B7cYRa<9mF!)*5 z#=b{04LkAO*^qJy%T4Wf&fGqe>N=QdIy8IciH&pB&4u5*@W9#iQET^uo`d(NGd*WA ztwU*7%ZKhpq%DY<)&cwit!wK@xmtdLBJ194TsZTu2OhK@T5f8&apuQWEucTMXMXId zUUqqw>o=g4<;KqCnsv(?`kuJUD$8?RnWJ1KNfj`b8IQ^%DkBWh@g-RK(m6LkM@aoC zLxj<#kAFG3WJy?{c>Md(C76im7-it+T2v=bm)4>>dAhU~%`ubl$4PxsNwBAn>_yD(bosP%+LdsMc2;YBzScZFN|YyD zc@rqTG+Jnlkv4%nr4GuX1Jur>e&@M-&4vACbjk`krBbQ#x3$ANsFX84Vi1)ADy6~> zI6#RwS;$U|;}nxJuSu**kgBYO&aFdnZ>eKi+*xo?0fnNI+)Aod&(cRb( z1M%JLcuR~Yj5^r?4o9J&s2&Sf7gP^Qdxdsb&=(UvA~m2{ckn8rdGb7^k@g=n3w&IV z&Kiu+Wo@u69s>(z6{Sm)V?MV^@<=?*NS?evv42bfwHJXpC1>SxKcp2$?3BGu8i&u7|? zq+M;Zr{)65UCW;8xxiQB58L}5^dEii)ca$pW1r3Re=gJhe7dp?)U>Mpmg}Z#**moC zZGB=jS5-rc)zQDWDbv0yRoPZdAVD3SHlmI;jXIXrIsI2mHyLhR#=H2Dt3(K!N`3hz zg#X_*PxIg+5F(F;jfFMHoiPpPAXMT?X{B_GM{N*Mm8yfrlK}*jywq+4~9aW9&e@OxVl>sNf6OS>vl1h)leddN4VI7;Jv}@Pf(sM4_2c z7N&QQ8o{L5rLq3(SD3(Y6#1Ev&ysV)2hI)4HSP1_QpetO$KF)?zWaTtsslHUKB}sj zJxX>!hrW8~VO`h4_ILNZwI@@zBUQU|aqPbM{pk0isRKjr`%`Dny&p@}Tu8Ytd{oo< zj(OquyMu2HzFm>2*_CqbQgt_I(|BluW1Ad_`ru54MN$_HlVKi;+xAm$g-`f{s*O;w zsVvS`5Q)&R^b?Kx^BRqdCI;iGs!v+xt|p&Nc{Zf%8&-FLy2HBA$huG(k~D)|sMpvL zu&5u5e8idGM-R5~IJHg;@eKD!H4n#0Wp%?Az2S1?UkkWPS%K#z$Z#w$fVULr7D#nr zFRnDM0LgN+U-ampsN0Pv%m8SEwJ+t>Q&N_kXW*&T+NTLUxXT99o^SM&8Hxc#DYidn+%eUwL7Lu`S7@!Tp{%ji zOP&pB&xUz(#)HG`Lr;T7;x}bHos7hTM7Hi)jD7cu-}z!jIF@!b&z_tc1fw{62FA>9 zByJ>@JR8%Vjq}I#Jt1X3I2TJEzcYAyFnJ)g`9P}nV8(uMHU@L9S?6l7GEizOdi9Hq zzV#*7A>1U_p`5xQ7J<2TmZo{u*?Kx#)9=@58dQY)$kPa`^xe02V**n4O{+VItSZ9w zunv|+xKd;`-$fF}z?}fHK`eApFXbQNW8BHeoSI{fI!BUzwnpmuEO|Q8YgoFD``*<+R)&H!?8g%b3b7zBw<+c90ASSQ1Sn=arBrTtBCHQte}jaX zhU9;P(x5Umc*) zuGE5+w3Nd>Lf%dyKWZE>)kS%khGkK4Er7UcAfp<=uvz!n)O~?yh`M=DN69)=lBXad z(Y%=y0umL^RleVgZGS{F*fDg;@pTNCOMUu1nzh}i1hckn`_i_=JZ_|opq2Vw%`2dl%mZcOc0(`NcNYSHX0@-;nV`#qAGUYLdjHXKwlgq{# zKi@#YU@nyE7@fk{qp^)(Cq#>AeaH5;)+;E4iKQqTlK&&}#rt$xjAL^|z{Ekqr~0Sq zJ_wO$q?@U>w(VvLiTG|DoWT_^Jp&kX;V@GMD^u`by$)R^6kW0uj>4Unsmuy$j9dD5 z^lS_Iy9wmTvymAkIKiNj$rl~ovt?sYD?*e8t8hh`lze5`$`y(MFt_qv^qa9PSu1m! zLl)-9372wWM<~ky%0g2C$129vPy#Gu$=_4Uw!*wzzJ>3qV^z3*-hJV%7c!N*X00E3yf~%eq}kAX>x(zPIN$f1ugto@i!6CIr9GRL zJY8u|*TVh>p4|^!b<2${$-2~rv#I)LmzzGj+|U9ayPrC&?uuLmSJ{-ZuV*AH-aufi zOkNUU%>hRqc}j=p6+lV=%78S6$p3pF1^4lXXc%j`ZltiU2D-0UE%`&rt9fJ5daO8& z)t0Ov-l#Gy1ruRZ{zF>_?D4+w#T#Et z_I>S@l)ZWNra-8{=8^WHwdRre#I1SQ{Wg3W*5KPT#6#7_GvkaA-Dgk!M1qq=LFzAG zTi)7(&IoB1JoD7~Y?MLetof55yJKE^K;t>swowy7s5L z_Gh{dF4Y~nyJ^04{#iJ}^d&dmyqc*yl<^!+*$@8>V$6Q^A64urUqM%l&F@82S~x{{ zRuPj`0IzAhzBZL&n>&V978K`qf=G7U*>pD_o#b5d6z8 zl?VegT|O_GiT5qFpx`Hpa_JKS@?(XlVk2WMWJ0D-_(LEcd2W9eX|h5=(ahkUm+|N| zq9HoVul@Wn&CVW_pxH4*2lsq;efN6r_AYK*d^yv$=YDItZU0i+(RAC<_XghQGi^`5 z-_e-k&o~4KsCO-TFY=@SVO(<7LPQee@Q0;(UIu3u`mPBQwO@Zu{Z`Na zB=Vx|XB6B($@4!!A%nz;PwCHfUiLw0Vvwj`7XPsPMDmKB{F13YnN~T699dITQ3Xlh zzrcIQe}KeQOGVDs%-V-cMvyD+WxI4yDxH{=Hk1eJgb9Ec=L64yH%<4-?v~wi-*qpD z??&E=WP}4L`+-kcAuPd~E0muLb*0pinB+gAPFIxbxgC9k8IYs{nf~*?tz4|@H?Du{ z5SX@4zvh4pUPwTTTf4Y0Kh1-)E=d$&H$eDW^jsy-G7m8Y*q z2yw$m4-(~{qaXvktP>_iBdP#L(HSZFx?3oqdd&_HDJ+NF^n5y#QM`i^;Ka|DtEcUfw<$2j591KDOM~c81}7UB%YFL23M;q( z8q)y&9-l(+4c_qc#=f94IycOvOoPb(SKmg8ukX=4z)zx1>3(qdq^rowy zRei#LeM1|M+at_ieO1^X{!4xefr?WXRSPldY@Wy!_Tm2!j8GTJP|Oa0Np?@fLr-<4 z`dM5Lar%3wm-Y{(_YYo(n_1?WG*U$!1LnMPqaa#2M-m zX(nVB1^z#`CmJwvj2cH^x=G=*6N6w#+vy@7QXZc4I{AUV&OaWOs z$ww*pOA3hZk^egdw9Uv*DEMm%{wD?hn}WZk;3NXNa)=os1|-nC5m1(Yh*ajjdRSeL zFH=?u{uO;lgEsv9HSR;p@sBO#RkoSITno4VFu&~UUhdqoykpPu#?IxQ{-0DGvi3c4 zSLUpEL)Tl|oP2J6V4)(lac8=DSK7NfS4JP~Tw~k(#@o#~2mLDN8iaZC&FP$zez~~j z_W2jnP5n7H{jA`cTXP^t!He<(3?^26LYBil5d{?5K$@tT1h} zmOsLw#hg5!wBJ0Kv*I_pQd5^JqnMp5ub%5jJJx;dz)$s#3o4Qmc~-g)r5l=(=jS&s z4BYKbHTR|)w&koy)#{*_ooaJXtlX&0iJw|+^kI~@TX!dG9&>o*yu4LNZlr571k_@y z$eDQSy1DZoBViqtQ4_RJPOCS$@na4z?Gs|TMlDl&a)3&;8>QNf3Okc#`oym7U=`wu z4pz#7yF2g+FRc_}m}a%reRBaSwa=(h>|-Xr@i=cbie5 zP5VSwBFv*QdTSpkipgqdo0D(FZ^lz?+cWh$QWh^t=xNLL?TeSb8~#rCvDwss%SyaC zd!@Arwp8ZZ(~mhsbDOx?3x=-DmTM4{$0j!b{U_0lDp@R-9A8{dyLQQ z9u+pd&+xQNy!9Dyam7OM)`Rn2>cc@J+m_@e%Em5SVYP12KAEjONeemG z>P;gCXj2!hC%JvCUbU$eu2>$M^<3fQEaz}J%g=B*%Q@`^3&QaL{*1?>#U3XR$@?|x zcQ2N5k1gc^u3y?B*(C>j7aereQN0ZD#k?QCkX|NQSd8+(kBssl%}QxgHb^F2Bg_-~ z9CHcve*>gfH%emLFEjauI~Go|xFT#yy#%W8_CeirUGw=Mv-A*dAS8he)Odj_`HTCm zMakT}JMUJa*+Y=XR5j5L1+PdjKW82|y2M9;Fm%NYGE6p`zwJmEs;2K-^}DVhMkaTOD4Y+ViVnnBb(^K0 zu^yq#f1t19(t-Xq;i@9EA<}__HXrMkrqw2K^k@jhVAoHV=|TF*ymXkzSyr_9JEmTq zg%LAbdoju`g_I?dIU~EWSG^muuLl?YMJJg23l@dJfU0mLn<&ly0c#MG0^<>QJCOPQ zH8~2GAlQip$gi0>%)_zRAJKU&mV!AQ9mUMy@-EV2(woc`aRVIg;($VPE4i4Ew=*~{ zt!I96uweWbybX-n;Nllm*xiG)WMh-?sz7xZgSy^|;qT1Uq`2?2V5#7SM7`8IMiM^K z)Kh1nP^F9L^1Uq9vJzmyxEI%3PQYEOM>x+UgnCsIbTJ6chX8nFHxCithz>%62peEk zm`HkC8XI~1_%Ry+I6I&VfMMKxL3eW!bJ`EL3G!QHpP0UgRYP#ZlA13kit>u_BO1Y-aXk$@?T+YoinHbYlJAhi`99sy}0CS1H& zD9k=^@glXaw@BQhYSsr|85Pn18JZ&ry9E_y9e@lh0vn+2y8-yppiP}9y*@TyDi)x3 zSSTz*8!5or$jub@%fXNuR~D-9&0J-$l%fP*A9Y=bl;HXh$>^Y_BoQ{#q(Lkv`xT## z+yDd>MYP#hF&xE#D_C|F@(K0B;HdQ;PDoL5Wu-M@en3-f$$<^HI1%%Xwj(sTME3lo zS7J^gqoK(toLm@DWI(9bhB7LB!0bhZYq&^nJc`?38Dx>yQE)6m;%!VrSY5)b4f6o> zlv5zwSy$oGu=BAXBd$u0@pP`s6A(mc4S~xW-YY2tT?Ap7r+8@kDJikT1Rzu!34e+Kc!BdtHpqH z%Tp;KhG-$liww5{I2l-RRRx_%*i&*RcI#jBZ`4bYnxf}zOddVcX3>@~U*+VwUtm~V zhO0ER(eb#~05`m-_Y<(49XG>}@Pj=N*;@nf<;5LVm8jnecL>z4@UPn`mQZgxV5K0w zuf`2lHt5^e>!s1#W<8#NCro0wSdJT&X%+DNO0z(6mZC?W1^5Bm-f_LH@jmBqqi&3B zci0oF(_^EiO*sGI8u#*P%M0A=@oU_5^9$THp53`+nzml!d~OJ54>RHHU;Ql}`G24+ ze5dF(HQcBigB`=zSiEVFFo`!>k@13AN-j0vzdadp*Z+ zP0f3ZQY-VuJY=Fq=%mV0^GF6)Bw*>t%L=PU{-;#qy9jXHqzk-H$Z`~(W4HjE#njsm z8KQlOa#9CyJ&lXnW*wNJRO*r1i$9|nb!GJpG*0aX8p12N4i$6)kQ6f_5L~*emfX#0 zck|52Wnk`0H(pwDx2D~#^Bd=1&bWOGxWS_vmv@x8zcT%6(@EP0Wi5BFE>|_p+6-d_ z(g4qY_TI?dk&I`@%&Fxv*PK0F*6`3?@rLV$D^)wNc;SJ4Z_Z@3HiEszX|p0--@C}C z>-%S2xH_wA-=DZo&mXz(e{c8ihjD#bL$dYe`sA}WThbL9Qts0;ClNe!*5hKzH(tH* z>ip>9(f6unU(I-qKg1;?p&Oy4ijC=tjq@k(oxXcIQ_;6v+ls7D99EYt$62kmpFeSO z?)q=pQ_fc6+8dYa*L~HMGb8rDKDKieXLxqk+z-t5WBuF@Y8=NMmLD`b5&rxBs^d2E zA6R*W@^(yX)=JaYr@s1ET=+y_YsTN>Z3qf=75Uq5@?x^QGPF>n%d>TX$P@op15R#0 zutMZnNo_+UZSb*jBeEQ!WvoY=P#iex<|Z@F<~P?bJV%Zz&ViI=Ko!I6lg}fIObYaD z85zd|@a2ywi772QD4p)o!o_Gk3_{tykY%m_Oh_RqGL0^4i@{k6Wofvo7=~>UY=2;q z8V7w~avUaOAz@B-!%A^4HoB0~qu;4dM*BoDv(2S)k;VZ{qIsg9*~U_Nh}S>{lEq{j zN@WNK;YkiUsM$L%h-V=z1Ld>LrT_%xr zz-8++^GQ%QVTSj;)DM9IChcMy?M3=IPC=N0XD9%*<7Am)OdvK*vDYY|b0ga>8Q{nl z=qJHM(N6t|eZP7y>p{5_U-6GqzJm}L!1I5~RkD8-f66&n1YymOxYnPU%6ZezI0Qds zK?BF{`VqJ1M_l*MOjh3Xm_zVW7sv1aFWiA2n=5~0+55=RI9tEuXiPgAle;sHO*1we zmupY+DXt2RQzqx!rU!ie&rJRNDL%(hh$FqJA;%Ja0s*U$ql|~pf}>E&!4kZ7zB>8* zytpv1XkOTTHikdfAf3W-#5R1{(bwuJDA>k4)PwpI#*}q_a+q}KfiZgp}y|T zRhFYdN~1R=(mU70)d_RwZVlfYo_8$tzkA@V1DV=ADXuzatKr*{8*?093nF_hq6~iJ zwz~L3$zwSVulZw->Gh;#$jYDNQ_c-fI2LQ zIpp9$&$)XG{saGle?aCW`Uh4c2%fCohX`sxfBjW=S9f*Q_hEiMAZS;%o_0UGgnY5i z%)BW%x`5<>2+}59BAmBQ+i}TVBHVoQed-)tM{+=bv>mLKE1Y%-ytXe~D2oyf z4~LJVjH4o|ow}&)d+o}g+6;>F#<(84<~E%$8fS^nH0LJPbSIWkOt}Ku*H}%iZ4u}u z*Fc3-5SdI#EO;kV0Y&4=$PSOp-!0(u@whs8Z?wg`&>EjtB}`n|b}QdP*+K=OC@V01 zm99s2X=b+LHsa_3!T}jNLlVyR$k0X4nYqIfdQ*iEGW5{1kz*VB=*=`n2Bhh%D|@tA zE<6oM=f7ELn~eP@r9X4lOAU+I6OBz`YhWOyD@qE}S=~QdBa1ztf z7ZLWz=onc(_sV-+|G0GaAJgLUEALJ12#=Cx)!vx$9)w{Lgdx7yPb{y8;fp>`raP4| zL~-Nt+{T@ItB+R0hpW#vidq=zBr_V_h+Md^ShS_mml#1F>^en~qCniYv@dz+ixfE(aZ%6!MS%8=u~f7%P@uDW zJW{5WB3*#Hv%j}9JM+y9|J>Z{MNpoYd2y<*4WYl0j$QaFvGo=ZB_tw|QBd4!nK(oH zY@DSn7w2fp#~skJiZkPiyBM;TQ`{L(+(T(z@n)LhO_X*hzD#qxnbJtT_Z_x67Mf=wo_~~0IKrAOs-|bGMcJe=ZH9D7Os0%PGG|ODCUq^7$mvST z`jl0Bs-3OtK$MV#h(tgdOq`nn3B1X~dC4Jil2dYZ!3vSDQ4Yy1Iz=?;1`hZ;)nnqG z|FPB$Ydu%_xL1VJCRx!7bd%U5xu9P?f07q{FzTCkN1Dy12`Q@Zf-x-#ik3_Ik<-FOJkrFIb+`{nh1gY2cH;IKy*oJQ>nX{SA3Z`1Z$)rU~QY46tAf)l>X zr<-<6SIPP}7-qumz@+{%f086taEDxd^3naD#L@l6;OePdvb5{cdF8z zKoLj&`(C0rq>Shi=#7vRcIcI$T}n$SLr6{O_Z3 zj|_|%ng$B)NKGeY)pUZkEAl1NkxlAYGTqR%C?`%$OBu;@D%#YPq?@j}q^^P}B5spQ zDY(%r0+({KVkGJ!GI?TDU`Ns%H80ai&lRy7E16R_X{b1K^T@s6v2st}@@Uz&XT#UG z=IgsT`mrxkX@dRRZ72}FKEK(y{|*1^{#)MFfzkEO=k6nSbN4d8*|qPDJ+JTC=!&j& zMQ<7FT?5O`a%*Ts-i%YP=P6+1X)E37z|3(z^cGOuj+~rnn$;p zaZB%blgE-W*`NZL;1zjP{SXkQI{}X%8;L|dv{T0R=m@OAMART@;b@1BNRQJ7@_YT?dlm}o5ehr5p(HIC9XfUWPHVrEVP(%;^F zFM!<)fE{NLTcf2=gPsN6AorssO#=|SR~@UtY<(PHw8|fK6U4tX6np^O$1V_zJ9YqW zd&4H^icB4%8B}0*1>oA(!4YJ5(1qPriENrYQ$rECbWg(&bPKG_Ph$&rKS|5ed(^(#&vMYc<8ypP?7P|dk3CpGsBZo@U6fBFJoGmQrXKuF=hA$$NL2`PhN za28@Lv0un4QW8r7;MJ@w631czXf)q3rfD<8i2$I}BP9H^@ajUI?HBT)9dk4YAu|st zJyFsp;kR`Hs_%k-1EWPRgMVINjGA#2YS;Z0Q)1vbTX`_p-*R(|9)WEUMkl%nF(Dg$ z+~i1rL#&``st-JaQ<5rO&gw(?r*_)vlmviIVo1Y~AV#u-tLPvh6+9HJ?E|YoxC5%c zqkmsPAMKsEJ94l0#Jf*!^qySXJMkrjhM%;DnFowF;cr3M zM6;+T!dXQ&bmH+%rz#onS-qDm*heZ7QkYKbekPyRWR(I^#Hk-8GY$}^gw3E8^uqn? z!JQr>3)&u?0oO@nLtG``7!(W2!e1eXeBalQ*7I-}{tr}FP&v@H zPls2GHx^%C{QbcD!|x5Ro*4OP-$*&!Q(7!8-bby?!^_;}p;LGJ)(;J>1`cdHQD<+d zP%LbO``5z#tH+1e!>5<|N(<`TQ+oC1uihGX=b7I;Q*{#M&I{$vquUOyy`$nqtp_&( zN7n*JSC2jWabT#@2S-;PL(OeB#;%Q(14lLjv9&<#UH*N~d!E&&pI?7`d_C~JZH{ej zsko6ZK<-)gwOWfG+Xx(A3mh+pI!ot@=iqHW82E7bkHh!&POOI}wm7!64O|m!^rArM z#{9MUmG*W2zE$@=3g)JdI&(-tNYaw30Wk=Nh@3*Z4#aB=WM+&3lvPBwPEYbn%p@an zSA7)tcb-vQJ&JB{DRv5_*p~r@7dVIoAr7<+zQ|tp@i4c*O+d|1Y7RyC{O?|%aeZSV zF{$NLQJ9s%oWbQq>q_MHS}FpO@~huiU;x^8aeDR42RjOk$mHQ1vKD}r9e=>YA}-UD)v$b- zgt7WlFuMa49Ixawi0lX`nr;YdY3Li_EQ{s{Kn%hZCaNR|S1j{w$;=R$X6Lgq0h;_^ zqt(_QbvKZEc=sGR9x@(+bDM2FrD!o)4g`PkV(F#gOB?Nn*V+%?J96r7|N4=$>+RnL zg9x@PjZ^|C6fO-G2XAusf(OeTT`MC+d6_E*JC?pf4FiCg!-h_QF~U>)qI~G1@FB{Z z6 zWd(m6==;b&yy_nQ5*m7!H~j-VWaSX$5nE0qOm8A#?+8?~Oga_%!npu!$@cs~nut^|wcDh{A4PSoB-doI#*qhPq=A(R(+!}ptj z+TxJ2mF}y&z_=azYrBEov77X)-GqYOEn7{53hj3Yw}M*;n#vg_xAPEuaeMe-|%4s?<>>!-<(5403goG4A0sPdam1GE}MfrBlb-uz+rjrnC&$oRukdK74|;AS2@x z%`>U9Ha(z)V>CO|iA7kxnLf@q>5}-JKG*~Iprsl^`VV1@L@js(stU(2%qJ-D32ONS zc_LqH~{lx|hNmp6)eI_sTcdJqNEi|K-FCbDFsi{|i7vKk{Gi CIj<%F literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdf6168f9d6fa38cba5abde526a470ad78b06bb0 GIT binary patch literal 1869 zcmZ`)&u<$=6rQ!cj_ufiqP9w!ADSi<;wtfypdyGGq^hYA7ZVi$k}s?A&N$g-cV;^? zPH<(U9CGM?kSlPa;!ojHB#^9?kSZY#+}x%TQct|uwc}WXvG(nIGxOfO`M&qozf>wE z1Y_gi>peAv(4WQ_joeT<`v8`K;Vl5vlz zC$xlNJm4OQR3{*sDXjMy_6Vmw1rw{07mmhmxGf~6;)n-=P@nH5LBIw3Txk*nFooNG zz*H?+d1l9Dm=#BEm+%8d<7=q}(uJrJjv$Jucm~1(Hm;X~6IaqB-ImXZ?8evqJuW13 zC41cQB~xzH)%$`sWC3n3i$)kK<+KrH5OH2I-I3hOgE1P0p)5RS4?&!wo_(C5neXhL z)kE%R59(#WvPNbv3)YZXgnBu!OoU|gY_LXkg1S~UOO9aceaQ@Z1Yd?a7Oh7>MXi*e zV+h!ah$JDt2+|h*W}g8UGDQ-HL;`e}D4c?bSACvvr5IQ2Jd%kf+IaWDF23{0W)&03 zaKvQjYYpC7;MN6pRYK&Dw3Mq0*-Wyrh40~s+8y2kLn$-_XEpqlN>3QlH<6Mls&Oen zf=YCx2dNS7fb2olIXGo`Jae?qIEGkImwHrVCOb1sIG#2UHM2MbbE0_0 zXaWT33b6BYO=M1erLi~!9th^_Xq32_{tsf87wE*<=@v-d6JbQO z-wGzVTYfmK?)BZIx|dCA9RLW}PVb3#SepPQ(5V8~Nuby`k49a>Hw;ztaSqUK|8Hj~ z(-8(MjNf#fkZZ?tfIg|5I@19Aj`XST>@anpMdU@t4n1b)j&`|rcr z#-^iu&DKX`I*}hauFo}-@X>QZL0O=jbNWrsw^c3b#swF4`Py}#EMC?pwbAk{WUD>~ zaf}A5sJ#4qy4t^W`+0f!#lq^-+;4@s{;e(ZUhXfgnfH8u@wR#2=)ZUOY3}#J${F~g zYOda>H>yQ*EGHpz-MHkskXGh`m3e#n#q}El z8{UIF!tV~Ij8;H%H@{!}b=Daajafpo3xjE+mC?=WPgj4K85qaG3@XjMehaiT0dr)d zYR7rqji6nUG~*RuqIS+iEoGuM+1Tk_lGM!~$M`yL3U^a*K9viwU_OWH8i+yGvaCPQ S{9kDMpZvPD{R)9d-2MehQW5$9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0d07c493d3205bf13c40cf1d89167f33fc496a7 GIT binary patch literal 4972 zcmcIn-EZ606~83)Ny%1H$E`my=_XEXt8=KvZn`!}vjufJ1Rb29O}AEC!O|jaGoeWB zl1d`O#?m4WF3_S5Fw801q0Z2U4B3D@_J7!mG4JLgg#mg5fC z!)WXBejc8C&+nY`yT9w{kqJDKd|1GK$%+)C`6#c4tXMIgj~C^<%-dlrQB3BO0ujmgi5|H@^ypnN_(Hy? zB4lGOx+c zht2*<$cN%2_|tp!kP$W_MsyJ7;!h7lJ7&c7$eh^ji|(2egEn8G$8~8=*5w=FysXEK z=$xo0ZiMm)s7H(>u7{o^^z=YaZ@Z@ldQufBoAQ$vH3nP1Q1KQVd-0k~;W=v;w31u4 zG|zCUw_wl`b4mvDOlUfDRHMOcYTBN`O3Z+gI<`Sgn9Ze`_B^N03rWOFwtANUM|x<8w7}k$5nhr&r;hXxv`}mQED6wRe_<&ME$*l|$oJCzl8!Um zU*oNwKn5Y;R$=WF90Ru*LghqBV_K26jd6mWp%%Cs;>7hB00AJw=nTL^q37m!WrDhf z#tI97CNN-I6pCv?1yQGYRAUBhyCj{ha4Z(ei~$O$TX8+3sL=BOPmb^z}dlwhvw8ag0Vp%+0vqf1&_Is6W+wJIp71!h==aMxk; z%$zMFNKc^j%EM~ej@Qw_ath!SmB0;l9%;85z`@$oX@)TBVerB;1{ZWGGr$R5I21T; z{A8EbOIO3;!2D?qq-_(IbRp3}9Hf>SJk;zK0J8~tnl!Mp{Ndb~=uIT87<>rFC0I?m@44BQ2sW8X%RCTd` zX9iMQ-3L+8H=(#r8WUvf>6Or@v61_Up=#prXX!(mX{DA{?y!48H9h(E`Oni&-BUNx zXIIYO?;luu_2#P|7Cs(X|JgnEiBKIov5`Kx(SK@1zJFj~CG<|bo}NHq!}Y<#(Cn=b z9f4P>o>8#(U?W0~9mm>0ed;?ap+Ce9Zh;b{(2UerCzuy_F8C)@fXE2T5Hl~~$gbzj z!@770XYP7*=?2+*#WcCwoO`#G8z9=l+&yv%WcKiq0A&Qm(Wbi|7>UA2I|p=z=fwFC zE=Cr{fG)OPHn80V?x1raca?-&swJ?sc@Gi(4< z={ix|-4y(`CZTwd2$*5X>yV6>1+RVbOG4{Rej%(00(obDh*ZdLrK>_#n8^w(4QqkP ziOQ3H2-1@0qJL4!D7?1gr{)dYxK?7P7bm&^7lgxrdnl)PG}^>{<*X|y%v8ULF;Q5m4B=MF(GicVQ6(6Zd;&xZ}e%H*4`+1D>o0!54r zXI4`6L~1iJT1$*p6O;Ayp^p~cUwFXnHu}Wo=$YE+nXk}pTSUzCuAFbkq<8Svk&l%3 zm1;6u?-{OI$(}w%eN@d&ae10+g zkQKYe8A?D*fE{IS$4o7esV2rg8yQ{qHpfoZ#!haGJ-0D(8m&ROHAZTwk!oy&TO%8q zfhW5U*^vz=psK#Csz9O27S@xh`qQ#zHAkYVsyhYfj;pF`Ii9Pk3@ymeJUkgPj5)pp zT#OyUz9+H33nJe!L({Qmu=q9>7_oxHfdPSGf$_q<4aE)eAS8ujU&`_Qk?ZFgL*xmi ze*D?`k@5QY#Dm0G_?i2C!?&i_``$lS>lakVt*7G+jwcbOGICjZo@DMERX`mp$s@%KPgSD50N5b;0!WMy7WBjo&T|cm1xIMT< zpxT&>g^#RHt-H6M`HDa_&>nRLLOld8KjKwNa32azgP#lEFF%qY;HV0uAX|5s5)fCI zs-Pe9^YKUdgcgZa;5KKu%ER}MAU{MXc)9iVWfWUJ{ nplC>fApD8Qe<4RV$kD%%C;m=;^k;JNUy+g^9Ql%9$#?r7R^;A! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..885a9a7cc96cb3e6276b9746e59adf8130a07d37 GIT binary patch literal 5798 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 None: + self.name = name + self.version = parse_version(version) + self.link = link + + super().__init__( + key=(self.name, self.version, self.link), + defining_class=InstallationCandidate, + ) + + def __repr__(self) -> str: + return "".format( + self.name, + self.version, + self.link, + ) + + def __str__(self) -> str: + return f"{self.name!r} candidate (version {self.version} at {self.link})" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py new file mode 100644 index 0000000..0af884b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py @@ -0,0 +1,235 @@ +""" PEP 610 """ +import json +import re +import urllib.parse +from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union + +__all__ = [ + "DirectUrl", + "DirectUrlValidationError", + "DirInfo", + "ArchiveInfo", + "VcsInfo", +] + +T = TypeVar("T") + +DIRECT_URL_METADATA_NAME = "direct_url.json" +ENV_VAR_RE = re.compile(r"^\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?$") + + +class DirectUrlValidationError(Exception): + pass + + +def _get( + d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None +) -> Optional[T]: + """Get value from dictionary and verify expected type.""" + if key not in d: + return default + value = d[key] + if not isinstance(value, expected_type): + raise DirectUrlValidationError( + f"{value!r} has unexpected type for {key} (expected {expected_type})" + ) + return value + + +def _get_required( + d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None +) -> T: + value = _get(d, expected_type, key, default) + if value is None: + raise DirectUrlValidationError(f"{key} must have a value") + return value + + +def _exactly_one_of(infos: Iterable[Optional["InfoType"]]) -> "InfoType": + infos = [info for info in infos if info is not None] + if not infos: + raise DirectUrlValidationError( + "missing one of archive_info, dir_info, vcs_info" + ) + if len(infos) > 1: + raise DirectUrlValidationError( + "more than one of archive_info, dir_info, vcs_info" + ) + assert infos[0] is not None + return infos[0] + + +def _filter_none(**kwargs: Any) -> Dict[str, Any]: + """Make dict excluding None values.""" + return {k: v for k, v in kwargs.items() if v is not None} + + +class VcsInfo: + name = "vcs_info" + + def __init__( + self, + vcs: str, + commit_id: str, + requested_revision: Optional[str] = None, + ) -> None: + self.vcs = vcs + self.requested_revision = requested_revision + self.commit_id = commit_id + + @classmethod + def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]: + if d is None: + return None + return cls( + vcs=_get_required(d, str, "vcs"), + commit_id=_get_required(d, str, "commit_id"), + requested_revision=_get(d, str, "requested_revision"), + ) + + def _to_dict(self) -> Dict[str, Any]: + return _filter_none( + vcs=self.vcs, + requested_revision=self.requested_revision, + commit_id=self.commit_id, + ) + + +class ArchiveInfo: + name = "archive_info" + + def __init__( + self, + hash: Optional[str] = None, + hashes: Optional[Dict[str, str]] = None, + ) -> None: + # set hashes before hash, since the hash setter will further populate hashes + self.hashes = hashes + self.hash = hash + + @property + def hash(self) -> Optional[str]: + return self._hash + + @hash.setter + def hash(self, value: Optional[str]) -> None: + if value is not None: + # Auto-populate the hashes key to upgrade to the new format automatically. + # We don't back-populate the legacy hash key from hashes. + try: + hash_name, hash_value = value.split("=", 1) + except ValueError: + raise DirectUrlValidationError( + f"invalid archive_info.hash format: {value!r}" + ) + if self.hashes is None: + self.hashes = {hash_name: hash_value} + elif hash_name not in self.hashes: + self.hashes = self.hashes.copy() + self.hashes[hash_name] = hash_value + self._hash = value + + @classmethod + def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["ArchiveInfo"]: + if d is None: + return None + return cls(hash=_get(d, str, "hash"), hashes=_get(d, dict, "hashes")) + + def _to_dict(self) -> Dict[str, Any]: + return _filter_none(hash=self.hash, hashes=self.hashes) + + +class DirInfo: + name = "dir_info" + + def __init__( + self, + editable: bool = False, + ) -> None: + self.editable = editable + + @classmethod + def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["DirInfo"]: + if d is None: + return None + return cls(editable=_get_required(d, bool, "editable", default=False)) + + def _to_dict(self) -> Dict[str, Any]: + return _filter_none(editable=self.editable or None) + + +InfoType = Union[ArchiveInfo, DirInfo, VcsInfo] + + +class DirectUrl: + def __init__( + self, + url: str, + info: InfoType, + subdirectory: Optional[str] = None, + ) -> None: + self.url = url + self.info = info + self.subdirectory = subdirectory + + def _remove_auth_from_netloc(self, netloc: str) -> str: + if "@" not in netloc: + return netloc + user_pass, netloc_no_user_pass = netloc.split("@", 1) + if ( + isinstance(self.info, VcsInfo) + and self.info.vcs == "git" + and user_pass == "git" + ): + return netloc + if ENV_VAR_RE.match(user_pass): + return netloc + return netloc_no_user_pass + + @property + def redacted_url(self) -> str: + """url with user:password part removed unless it is formed with + environment variables as specified in PEP 610, or it is ``git`` + in the case of a git URL. + """ + purl = urllib.parse.urlsplit(self.url) + netloc = self._remove_auth_from_netloc(purl.netloc) + surl = urllib.parse.urlunsplit( + (purl.scheme, netloc, purl.path, purl.query, purl.fragment) + ) + return surl + + def validate(self) -> None: + self.from_dict(self.to_dict()) + + @classmethod + def from_dict(cls, d: Dict[str, Any]) -> "DirectUrl": + return DirectUrl( + url=_get_required(d, str, "url"), + subdirectory=_get(d, str, "subdirectory"), + info=_exactly_one_of( + [ + ArchiveInfo._from_dict(_get(d, dict, "archive_info")), + DirInfo._from_dict(_get(d, dict, "dir_info")), + VcsInfo._from_dict(_get(d, dict, "vcs_info")), + ] + ), + ) + + def to_dict(self) -> Dict[str, Any]: + res = _filter_none( + url=self.redacted_url, + subdirectory=self.subdirectory, + ) + res[self.info.name] = self.info._to_dict() + return res + + @classmethod + def from_json(cls, s: str) -> "DirectUrl": + return cls.from_dict(json.loads(s)) + + def to_json(self) -> str: + return json.dumps(self.to_dict(), sort_keys=True) + + def is_local_editable(self) -> bool: + return isinstance(self.info, DirInfo) and self.info.editable diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/format_control.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/format_control.py new file mode 100644 index 0000000..ccd1127 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/format_control.py @@ -0,0 +1,78 @@ +from typing import FrozenSet, Optional, Set + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import CommandError + + +class FormatControl: + """Helper for managing formats from which a package can be installed.""" + + __slots__ = ["no_binary", "only_binary"] + + def __init__( + self, + no_binary: Optional[Set[str]] = None, + only_binary: Optional[Set[str]] = None, + ) -> None: + if no_binary is None: + no_binary = set() + if only_binary is None: + only_binary = set() + + self.no_binary = no_binary + self.only_binary = only_binary + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + + if self.__slots__ != other.__slots__: + return False + + return all(getattr(self, k) == getattr(other, k) for k in self.__slots__) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.no_binary}, {self.only_binary})" + + @staticmethod + def handle_mutual_excludes(value: str, target: Set[str], other: Set[str]) -> None: + if value.startswith("-"): + raise CommandError( + "--no-binary / --only-binary option requires 1 argument." + ) + new = value.split(",") + while ":all:" in new: + other.clear() + target.clear() + target.add(":all:") + del new[: new.index(":all:") + 1] + # Without a none, we want to discard everything as :all: covers it + if ":none:" not in new: + return + for name in new: + if name == ":none:": + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + def get_allowed_formats(self, canonical_name: str) -> FrozenSet[str]: + result = {"binary", "source"} + if canonical_name in self.only_binary: + result.discard("source") + elif canonical_name in self.no_binary: + result.discard("binary") + elif ":all:" in self.only_binary: + result.discard("source") + elif ":all:" in self.no_binary: + result.discard("binary") + return frozenset(result) + + def disallow_binaries(self) -> None: + self.handle_mutual_excludes( + ":all:", + self.no_binary, + self.only_binary, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/index.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/index.py new file mode 100644 index 0000000..b94c325 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/index.py @@ -0,0 +1,28 @@ +import urllib.parse + + +class PackageIndex: + """Represents a Package Index and provides easier access to endpoints""" + + __slots__ = ["url", "netloc", "simple_url", "pypi_url", "file_storage_domain"] + + def __init__(self, url: str, file_storage_domain: str) -> None: + super().__init__() + self.url = url + self.netloc = urllib.parse.urlsplit(url).netloc + self.simple_url = self._url_for_path("simple") + self.pypi_url = self._url_for_path("pypi") + + # This is part of a temporary hack used to block installs of PyPI + # packages which depend on external urls only necessary until PyPI can + # block such packages themselves + self.file_storage_domain = file_storage_domain + + def _url_for_path(self, path: str) -> str: + return urllib.parse.urljoin(self.url, path) + + +PyPI = PackageIndex("https://pypi.org/", file_storage_domain="files.pythonhosted.org") +TestPyPI = PackageIndex( + "https://test.pypi.org/", file_storage_domain="test-files.pythonhosted.org" +) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py new file mode 100644 index 0000000..b9c6330 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py @@ -0,0 +1,56 @@ +from typing import Any, Dict, Sequence + +from pip._vendor.packaging.markers import default_environment + +from pip import __version__ +from pip._internal.req.req_install import InstallRequirement + + +class InstallationReport: + def __init__(self, install_requirements: Sequence[InstallRequirement]): + self._install_requirements = install_requirements + + @classmethod + def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]: + assert ireq.download_info, f"No download_info for {ireq}" + res = { + # PEP 610 json for the download URL. download_info.archive_info.hashes may + # be absent when the requirement was installed from the wheel cache + # and the cache entry was populated by an older pip version that did not + # record origin.json. + "download_info": ireq.download_info.to_dict(), + # is_direct is true if the requirement was a direct URL reference (which + # includes editable requirements), and false if the requirement was + # downloaded from a PEP 503 index or --find-links. + "is_direct": ireq.is_direct, + # is_yanked is true if the requirement was yanked from the index, but + # was still selected by pip to conform to PEP 592. + "is_yanked": ireq.link.is_yanked if ireq.link else False, + # requested is true if the requirement was specified by the user (aka + # top level requirement), and false if it was installed as a dependency of a + # requirement. https://peps.python.org/pep-0376/#requested + "requested": ireq.user_supplied, + # PEP 566 json encoding for metadata + # https://www.python.org/dev/peps/pep-0566/#json-compatible-metadata + "metadata": ireq.get_dist().metadata_dict, + } + if ireq.user_supplied and ireq.extras: + # For top level requirements, the list of requested extras, if any. + res["requested_extras"] = sorted(ireq.extras) + return res + + def to_dict(self) -> Dict[str, Any]: + return { + "version": "1", + "pip_version": __version__, + "install": [ + self._install_req_to_dict(ireq) for ireq in self._install_requirements + ], + # https://peps.python.org/pep-0508/#environment-markers + # TODO: currently, the resolver uses the default environment to evaluate + # environment markers, so that is what we report here. In the future, it + # should also take into account options such as --python-version or + # --platform, perhaps under the form of an environment_override field? + # https://github.com/pypa/pip/issues/11198 + "environment": default_environment(), + } diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/link.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/link.py new file mode 100644 index 0000000..73041b8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/link.py @@ -0,0 +1,579 @@ +import functools +import itertools +import logging +import os +import posixpath +import re +import urllib.parse +from dataclasses import dataclass +from typing import ( + TYPE_CHECKING, + Any, + Dict, + List, + Mapping, + NamedTuple, + Optional, + Tuple, + Union, +) + +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filetypes import WHEEL_EXTENSION +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.misc import ( + pairwise, + redact_auth_from_url, + split_auth_from_netloc, + splitext, +) +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.urls import path_to_url, url_to_path + +if TYPE_CHECKING: + from pip._internal.index.collector import IndexContent + +logger = logging.getLogger(__name__) + + +# Order matters, earlier hashes have a precedence over later hashes for what +# we will pick to use. +_SUPPORTED_HASHES = ("sha512", "sha384", "sha256", "sha224", "sha1", "md5") + + +@dataclass(frozen=True) +class LinkHash: + """Links to content may have embedded hash values. This class parses those. + + `name` must be any member of `_SUPPORTED_HASHES`. + + This class can be converted to and from `ArchiveInfo`. While ArchiveInfo intends to + be JSON-serializable to conform to PEP 610, this class contains the logic for + parsing a hash name and value for correctness, and then checking whether that hash + conforms to a schema with `.is_hash_allowed()`.""" + + name: str + value: str + + _hash_url_fragment_re = re.compile( + # NB: we do not validate that the second group (.*) is a valid hex + # digest. Instead, we simply keep that string in this class, and then check it + # against Hashes when hash-checking is needed. This is easier to debug than + # proactively discarding an invalid hex digest, as we handle incorrect hashes + # and malformed hashes in the same place. + r"[#&]({choices})=([^&]*)".format( + choices="|".join(re.escape(hash_name) for hash_name in _SUPPORTED_HASHES) + ), + ) + + def __post_init__(self) -> None: + assert self.name in _SUPPORTED_HASHES + + @classmethod + @functools.lru_cache(maxsize=None) + def find_hash_url_fragment(cls, url: str) -> Optional["LinkHash"]: + """Search a string for a checksum algorithm name and encoded output value.""" + match = cls._hash_url_fragment_re.search(url) + if match is None: + return None + name, value = match.groups() + return cls(name=name, value=value) + + def as_dict(self) -> Dict[str, str]: + return {self.name: self.value} + + def as_hashes(self) -> Hashes: + """Return a Hashes instance which checks only for the current hash.""" + return Hashes({self.name: [self.value]}) + + def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool: + """ + Return True if the current hash is allowed by `hashes`. + """ + if hashes is None: + return False + return hashes.is_hash_allowed(self.name, hex_digest=self.value) + + +@dataclass(frozen=True) +class MetadataFile: + """Information about a core metadata file associated with a distribution.""" + + hashes: Optional[Dict[str, str]] + + def __post_init__(self) -> None: + if self.hashes is not None: + assert all(name in _SUPPORTED_HASHES for name in self.hashes) + + +def supported_hashes(hashes: Optional[Dict[str, str]]) -> Optional[Dict[str, str]]: + # Remove any unsupported hash types from the mapping. If this leaves no + # supported hashes, return None + if hashes is None: + return None + hashes = {n: v for n, v in hashes.items() if n in _SUPPORTED_HASHES} + if not hashes: + return None + return hashes + + +def _clean_url_path_part(part: str) -> str: + """ + Clean a "part" of a URL path (i.e. after splitting on "@" characters). + """ + # We unquote prior to quoting to make sure nothing is double quoted. + return urllib.parse.quote(urllib.parse.unquote(part)) + + +def _clean_file_url_path(part: str) -> str: + """ + Clean the first part of a URL path that corresponds to a local + filesystem path (i.e. the first part after splitting on "@" characters). + """ + # We unquote prior to quoting to make sure nothing is double quoted. + # Also, on Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + return urllib.request.pathname2url(urllib.request.url2pathname(part)) + + +# percent-encoded: / +_reserved_chars_re = re.compile("(@|%2F)", re.IGNORECASE) + + +def _clean_url_path(path: str, is_local_path: bool) -> str: + """ + Clean the path portion of a URL. + """ + if is_local_path: + clean_func = _clean_file_url_path + else: + clean_func = _clean_url_path_part + + # Split on the reserved characters prior to cleaning so that + # revision strings in VCS URLs are properly preserved. + parts = _reserved_chars_re.split(path) + + cleaned_parts = [] + for to_clean, reserved in pairwise(itertools.chain(parts, [""])): + cleaned_parts.append(clean_func(to_clean)) + # Normalize %xx escapes (e.g. %2f -> %2F) + cleaned_parts.append(reserved.upper()) + + return "".join(cleaned_parts) + + +def _ensure_quoted_url(url: str) -> str: + """ + Make sure a link is fully quoted. + For example, if ' ' occurs in the URL, it will be replaced with "%20", + and without double-quoting other characters. + """ + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. + result = urllib.parse.urlparse(url) + # If the netloc is empty, then the URL refers to a local filesystem path. + is_local_path = not result.netloc + path = _clean_url_path(result.path, is_local_path=is_local_path) + return urllib.parse.urlunparse(result._replace(path=path)) + + +class Link(KeyBasedCompareMixin): + """Represents a parsed link from a Package Index's simple URL""" + + __slots__ = [ + "_parsed_url", + "_url", + "_hashes", + "comes_from", + "requires_python", + "yanked_reason", + "metadata_file_data", + "cache_link_parsing", + "egg_fragment", + ] + + def __init__( + self, + url: str, + comes_from: Optional[Union[str, "IndexContent"]] = None, + requires_python: Optional[str] = None, + yanked_reason: Optional[str] = None, + metadata_file_data: Optional[MetadataFile] = None, + cache_link_parsing: bool = True, + hashes: Optional[Mapping[str, str]] = None, + ) -> None: + """ + :param url: url of the resource pointed to (href of the link) + :param comes_from: instance of IndexContent where the link was found, + or string. + :param requires_python: String containing the `Requires-Python` + metadata field, specified in PEP 345. This may be specified by + a data-requires-python attribute in the HTML link tag, as + described in PEP 503. + :param yanked_reason: the reason the file has been yanked, if the + file has been yanked, or None if the file hasn't been yanked. + This is the value of the "data-yanked" attribute, if present, in + a simple repository HTML link. If the file has been yanked but + no reason was provided, this should be the empty string. See + PEP 592 for more information and the specification. + :param metadata_file_data: the metadata attached to the file, or None if + no such metadata is provided. This argument, if not None, indicates + that a separate metadata file exists, and also optionally supplies + hashes for that file. + :param cache_link_parsing: A flag that is used elsewhere to determine + whether resources retrieved from this link should be cached. PyPI + URLs should generally have this set to False, for example. + :param hashes: A mapping of hash names to digests to allow us to + determine the validity of a download. + """ + + # The comes_from, requires_python, and metadata_file_data arguments are + # only used by classmethods of this class, and are not used in client + # code directly. + + # url can be a UNC windows share + if url.startswith("\\\\"): + url = path_to_url(url) + + self._parsed_url = urllib.parse.urlsplit(url) + # Store the url as a private attribute to prevent accidentally + # trying to set a new value. + self._url = url + + link_hash = LinkHash.find_hash_url_fragment(url) + hashes_from_link = {} if link_hash is None else link_hash.as_dict() + if hashes is None: + self._hashes = hashes_from_link + else: + self._hashes = {**hashes, **hashes_from_link} + + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + self.yanked_reason = yanked_reason + self.metadata_file_data = metadata_file_data + + super().__init__(key=url, defining_class=Link) + + self.cache_link_parsing = cache_link_parsing + self.egg_fragment = self._egg_fragment() + + @classmethod + def from_json( + cls, + file_data: Dict[str, Any], + page_url: str, + ) -> Optional["Link"]: + """ + Convert an pypi json document from a simple repository page into a Link. + """ + file_url = file_data.get("url") + if file_url is None: + return None + + url = _ensure_quoted_url(urllib.parse.urljoin(page_url, file_url)) + pyrequire = file_data.get("requires-python") + yanked_reason = file_data.get("yanked") + hashes = file_data.get("hashes", {}) + + # PEP 714: Indexes must use the name core-metadata, but + # clients should support the old name as a fallback for compatibility. + metadata_info = file_data.get("core-metadata") + if metadata_info is None: + metadata_info = file_data.get("dist-info-metadata") + + # The metadata info value may be a boolean, or a dict of hashes. + if isinstance(metadata_info, dict): + # The file exists, and hashes have been supplied + metadata_file_data = MetadataFile(supported_hashes(metadata_info)) + elif metadata_info: + # The file exists, but there are no hashes + metadata_file_data = MetadataFile(None) + else: + # False or not present: the file does not exist + metadata_file_data = None + + # The Link.yanked_reason expects an empty string instead of a boolean. + if yanked_reason and not isinstance(yanked_reason, str): + yanked_reason = "" + # The Link.yanked_reason expects None instead of False. + elif not yanked_reason: + yanked_reason = None + + return cls( + url, + comes_from=page_url, + requires_python=pyrequire, + yanked_reason=yanked_reason, + hashes=hashes, + metadata_file_data=metadata_file_data, + ) + + @classmethod + def from_element( + cls, + anchor_attribs: Dict[str, Optional[str]], + page_url: str, + base_url: str, + ) -> Optional["Link"]: + """ + Convert an anchor element's attributes in a simple repository page to a Link. + """ + href = anchor_attribs.get("href") + if not href: + return None + + url = _ensure_quoted_url(urllib.parse.urljoin(base_url, href)) + pyrequire = anchor_attribs.get("data-requires-python") + yanked_reason = anchor_attribs.get("data-yanked") + + # PEP 714: Indexes must use the name data-core-metadata, but + # clients should support the old name as a fallback for compatibility. + metadata_info = anchor_attribs.get("data-core-metadata") + if metadata_info is None: + metadata_info = anchor_attribs.get("data-dist-info-metadata") + # The metadata info value may be the string "true", or a string of + # the form "hashname=hashval" + if metadata_info == "true": + # The file exists, but there are no hashes + metadata_file_data = MetadataFile(None) + elif metadata_info is None: + # The file does not exist + metadata_file_data = None + else: + # The file exists, and hashes have been supplied + hashname, sep, hashval = metadata_info.partition("=") + if sep == "=": + metadata_file_data = MetadataFile(supported_hashes({hashname: hashval})) + else: + # Error - data is wrong. Treat as no hashes supplied. + logger.debug( + "Index returned invalid data-dist-info-metadata value: %s", + metadata_info, + ) + metadata_file_data = MetadataFile(None) + + return cls( + url, + comes_from=page_url, + requires_python=pyrequire, + yanked_reason=yanked_reason, + metadata_file_data=metadata_file_data, + ) + + def __str__(self) -> str: + if self.requires_python: + rp = f" (requires-python:{self.requires_python})" + else: + rp = "" + if self.comes_from: + return f"{redact_auth_from_url(self._url)} (from {self.comes_from}){rp}" + else: + return redact_auth_from_url(str(self._url)) + + def __repr__(self) -> str: + return f"" + + @property + def url(self) -> str: + return self._url + + @property + def filename(self) -> str: + path = self.path.rstrip("/") + name = posixpath.basename(path) + if not name: + # Make sure we don't leak auth information if the netloc + # includes a username and password. + netloc, user_pass = split_auth_from_netloc(self.netloc) + return netloc + + name = urllib.parse.unquote(name) + assert name, f"URL {self._url!r} produced no filename" + return name + + @property + def file_path(self) -> str: + return url_to_path(self.url) + + @property + def scheme(self) -> str: + return self._parsed_url.scheme + + @property + def netloc(self) -> str: + """ + This can contain auth information. + """ + return self._parsed_url.netloc + + @property + def path(self) -> str: + return urllib.parse.unquote(self._parsed_url.path) + + def splitext(self) -> Tuple[str, str]: + return splitext(posixpath.basename(self.path.rstrip("/"))) + + @property + def ext(self) -> str: + return self.splitext()[1] + + @property + def url_without_fragment(self) -> str: + scheme, netloc, path, query, fragment = self._parsed_url + return urllib.parse.urlunsplit((scheme, netloc, path, query, "")) + + _egg_fragment_re = re.compile(r"[#&]egg=([^&]*)") + + # Per PEP 508. + _project_name_re = re.compile( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE + ) + + def _egg_fragment(self) -> Optional[str]: + match = self._egg_fragment_re.search(self._url) + if not match: + return None + + # An egg fragment looks like a PEP 508 project name, along with + # an optional extras specifier. Anything else is invalid. + project_name = match.group(1) + if not self._project_name_re.match(project_name): + deprecated( + reason=f"{self} contains an egg fragment with a non-PEP 508 name", + replacement="to use the req @ url syntax, and remove the egg fragment", + gone_in="25.0", + issue=11617, + ) + + return project_name + + _subdirectory_fragment_re = re.compile(r"[#&]subdirectory=([^&]*)") + + @property + def subdirectory_fragment(self) -> Optional[str]: + match = self._subdirectory_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + def metadata_link(self) -> Optional["Link"]: + """Return a link to the associated core metadata file (if any).""" + if self.metadata_file_data is None: + return None + metadata_url = f"{self.url_without_fragment}.metadata" + if self.metadata_file_data.hashes is None: + return Link(metadata_url) + return Link(metadata_url, hashes=self.metadata_file_data.hashes) + + def as_hashes(self) -> Hashes: + return Hashes({k: [v] for k, v in self._hashes.items()}) + + @property + def hash(self) -> Optional[str]: + return next(iter(self._hashes.values()), None) + + @property + def hash_name(self) -> Optional[str]: + return next(iter(self._hashes), None) + + @property + def show_url(self) -> str: + return posixpath.basename(self._url.split("#", 1)[0].split("?", 1)[0]) + + @property + def is_file(self) -> bool: + return self.scheme == "file" + + def is_existing_dir(self) -> bool: + return self.is_file and os.path.isdir(self.file_path) + + @property + def is_wheel(self) -> bool: + return self.ext == WHEEL_EXTENSION + + @property + def is_vcs(self) -> bool: + from pip._internal.vcs import vcs + + return self.scheme in vcs.all_schemes + + @property + def is_yanked(self) -> bool: + return self.yanked_reason is not None + + @property + def has_hash(self) -> bool: + return bool(self._hashes) + + def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool: + """ + Return True if the link has a hash and it is allowed by `hashes`. + """ + if hashes is None: + return False + return any(hashes.is_hash_allowed(k, v) for k, v in self._hashes.items()) + + +class _CleanResult(NamedTuple): + """Convert link for equivalency check. + + This is used in the resolver to check whether two URL-specified requirements + likely point to the same distribution and can be considered equivalent. This + equivalency logic avoids comparing URLs literally, which can be too strict + (e.g. "a=1&b=2" vs "b=2&a=1") and produce conflicts unexpecting to users. + + Currently this does three things: + + 1. Drop the basic auth part. This is technically wrong since a server can + serve different content based on auth, but if it does that, it is even + impossible to guarantee two URLs without auth are equivalent, since + the user can input different auth information when prompted. So the + practical solution is to assume the auth doesn't affect the response. + 2. Parse the query to avoid the ordering issue. Note that ordering under the + same key in the query are NOT cleaned; i.e. "a=1&a=2" and "a=2&a=1" are + still considered different. + 3. Explicitly drop most of the fragment part, except ``subdirectory=`` and + hash values, since it should have no impact the downloaded content. Note + that this drops the "egg=" part historically used to denote the requested + project (and extras), which is wrong in the strictest sense, but too many + people are supplying it inconsistently to cause superfluous resolution + conflicts, so we choose to also ignore them. + """ + + parsed: urllib.parse.SplitResult + query: Dict[str, List[str]] + subdirectory: str + hashes: Dict[str, str] + + +def _clean_link(link: Link) -> _CleanResult: + parsed = link._parsed_url + netloc = parsed.netloc.rsplit("@", 1)[-1] + # According to RFC 8089, an empty host in file: means localhost. + if parsed.scheme == "file" and not netloc: + netloc = "localhost" + fragment = urllib.parse.parse_qs(parsed.fragment) + if "egg" in fragment: + logger.debug("Ignoring egg= fragment in %s", link) + try: + # If there are multiple subdirectory values, use the first one. + # This matches the behavior of Link.subdirectory_fragment. + subdirectory = fragment["subdirectory"][0] + except (IndexError, KeyError): + subdirectory = "" + # If there are multiple hash values under the same algorithm, use the + # first one. This matches the behavior of Link.hash_value. + hashes = {k: fragment[k][0] for k in _SUPPORTED_HASHES if k in fragment} + return _CleanResult( + parsed=parsed._replace(netloc=netloc, query="", fragment=""), + query=urllib.parse.parse_qs(parsed.query), + subdirectory=subdirectory, + hashes=hashes, + ) + + +@functools.lru_cache(maxsize=None) +def links_equivalent(link1: Link, link2: Link) -> bool: + return _clean_link(link1) == _clean_link(link2) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/scheme.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/scheme.py new file mode 100644 index 0000000..f51190a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/scheme.py @@ -0,0 +1,31 @@ +""" +For types associated with installation schemes. + +For a general overview of available schemes and their context, see +https://docs.python.org/3/install/index.html#alternate-installation. +""" + + +SCHEME_KEYS = ["platlib", "purelib", "headers", "scripts", "data"] + + +class Scheme: + """A Scheme holds paths which are used as the base directories for + artifacts associated with a Python package. + """ + + __slots__ = SCHEME_KEYS + + def __init__( + self, + platlib: str, + purelib: str, + headers: str, + scripts: str, + data: str, + ) -> None: + self.platlib = platlib + self.purelib = purelib + self.headers = headers + self.scripts = scripts + self.data = data diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py new file mode 100644 index 0000000..fe61e81 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py @@ -0,0 +1,132 @@ +import itertools +import logging +import os +import posixpath +import urllib.parse +from typing import List + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.models.index import PyPI +from pip._internal.utils.compat import has_tls +from pip._internal.utils.misc import normalize_path, redact_auth_from_url + +logger = logging.getLogger(__name__) + + +class SearchScope: + + """ + Encapsulates the locations that pip is configured to search. + """ + + __slots__ = ["find_links", "index_urls", "no_index"] + + @classmethod + def create( + cls, + find_links: List[str], + index_urls: List[str], + no_index: bool, + ) -> "SearchScope": + """ + Create a SearchScope object after normalizing the `find_links`. + """ + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + built_find_links: List[str] = [] + for link in find_links: + if link.startswith("~"): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + built_find_links.append(link) + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not has_tls(): + for link in itertools.chain(index_urls, built_find_links): + parsed = urllib.parse.urlparse(link) + if parsed.scheme == "https": + logger.warning( + "pip is configured with locations that require " + "TLS/SSL, however the ssl module in Python is not " + "available." + ) + break + + return cls( + find_links=built_find_links, + index_urls=index_urls, + no_index=no_index, + ) + + def __init__( + self, + find_links: List[str], + index_urls: List[str], + no_index: bool, + ) -> None: + self.find_links = find_links + self.index_urls = index_urls + self.no_index = no_index + + def get_formatted_locations(self) -> str: + lines = [] + redacted_index_urls = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + for url in self.index_urls: + redacted_index_url = redact_auth_from_url(url) + + # Parse the URL + purl = urllib.parse.urlsplit(redacted_index_url) + + # URL is generally invalid if scheme and netloc is missing + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not purl.scheme and not purl.netloc: + logger.warning( + 'The index url "%s" seems invalid, please provide a scheme.', + redacted_index_url, + ) + + redacted_index_urls.append(redacted_index_url) + + lines.append( + "Looking in indexes: {}".format(", ".join(redacted_index_urls)) + ) + + if self.find_links: + lines.append( + "Looking in links: {}".format( + ", ".join(redact_auth_from_url(url) for url in self.find_links) + ) + ) + return "\n".join(lines) + + def get_index_urls_locations(self, project_name: str) -> List[str]: + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url: str) -> str: + loc = posixpath.join( + url, urllib.parse.quote(canonicalize_name(project_name)) + ) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith("/"): + loc = loc + "/" + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py new file mode 100644 index 0000000..977bc4c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py @@ -0,0 +1,51 @@ +from typing import Optional + +from pip._internal.models.format_control import FormatControl + + +class SelectionPreferences: + """ + Encapsulates the candidate selection preferences for downloading + and installing files. + """ + + __slots__ = [ + "allow_yanked", + "allow_all_prereleases", + "format_control", + "prefer_binary", + "ignore_requires_python", + ] + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + allow_yanked: bool, + allow_all_prereleases: bool = False, + format_control: Optional[FormatControl] = None, + prefer_binary: bool = False, + ignore_requires_python: Optional[bool] = None, + ) -> None: + """Create a SelectionPreferences object. + + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param prefer_binary: Whether to prefer an old, but valid, binary + dist over a new source dist. + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self.allow_yanked = allow_yanked + self.allow_all_prereleases = allow_all_prereleases + self.format_control = format_control + self.prefer_binary = prefer_binary + self.ignore_requires_python = ignore_requires_python diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/target_python.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/target_python.py new file mode 100644 index 0000000..67ea5da --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/target_python.py @@ -0,0 +1,122 @@ +import sys +from typing import List, Optional, Set, Tuple + +from pip._vendor.packaging.tags import Tag + +from pip._internal.utils.compatibility_tags import get_supported, version_info_to_nodot +from pip._internal.utils.misc import normalize_version_info + + +class TargetPython: + + """ + Encapsulates the properties of a Python interpreter one is targeting + for a package install, download, etc. + """ + + __slots__ = [ + "_given_py_version_info", + "abis", + "implementation", + "platforms", + "py_version", + "py_version_info", + "_valid_tags", + "_valid_tags_set", + ] + + def __init__( + self, + platforms: Optional[List[str]] = None, + py_version_info: Optional[Tuple[int, ...]] = None, + abis: Optional[List[str]] = None, + implementation: Optional[str] = None, + ) -> None: + """ + :param platforms: A list of strings or None. If None, searches for + packages that are supported by the current system. Otherwise, will + find packages that can be built on the platforms passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param py_version_info: An optional tuple of ints representing the + Python version information to use (e.g. `sys.version_info[:3]`). + This can have length 1, 2, or 3 when provided. + :param abis: A list of strings or None. This is passed to + compatibility_tags.py's get_supported() function as is. + :param implementation: A string or None. This is passed to + compatibility_tags.py's get_supported() function as is. + """ + # Store the given py_version_info for when we call get_supported(). + self._given_py_version_info = py_version_info + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + py_version = ".".join(map(str, py_version_info[:2])) + + self.abis = abis + self.implementation = implementation + self.platforms = platforms + self.py_version = py_version + self.py_version_info = py_version_info + + # This is used to cache the return value of get_(un)sorted_tags. + self._valid_tags: Optional[List[Tag]] = None + self._valid_tags_set: Optional[Set[Tag]] = None + + def format_given(self) -> str: + """ + Format the given, non-None attributes for display. + """ + display_version = None + if self._given_py_version_info is not None: + display_version = ".".join( + str(part) for part in self._given_py_version_info + ) + + key_values = [ + ("platforms", self.platforms), + ("version_info", display_version), + ("abis", self.abis), + ("implementation", self.implementation), + ] + return " ".join( + f"{key}={value!r}" for key, value in key_values if value is not None + ) + + def get_sorted_tags(self) -> List[Tag]: + """ + Return the supported PEP 425 tags to check wheel candidates against. + + The tags are returned in order of preference (most preferred first). + """ + if self._valid_tags is None: + # Pass versions=None if no py_version_info was given since + # versions=None uses special default logic. + py_version_info = self._given_py_version_info + if py_version_info is None: + version = None + else: + version = version_info_to_nodot(py_version_info) + + tags = get_supported( + version=version, + platforms=self.platforms, + abis=self.abis, + impl=self.implementation, + ) + self._valid_tags = tags + + return self._valid_tags + + def get_unsorted_tags(self) -> Set[Tag]: + """Exactly the same as get_sorted_tags, but returns a set. + + This is important for performance. + """ + if self._valid_tags_set is None: + self._valid_tags_set = set(self.get_sorted_tags()) + + return self._valid_tags_set diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/models/wheel.py b/myenv/lib/python3.12/site-packages/pip/_internal/models/wheel.py new file mode 100644 index 0000000..a5dc12b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/models/wheel.py @@ -0,0 +1,92 @@ +"""Represents a wheel file and provides access to the various parts of the +name that have meaning. +""" +import re +from typing import Dict, Iterable, List + +from pip._vendor.packaging.tags import Tag + +from pip._internal.exceptions import InvalidWheelFilename + + +class Wheel: + """A wheel file""" + + wheel_file_re = re.compile( + r"""^(?P(?P[^\s-]+?)-(?P[^\s-]*?)) + ((-(?P\d[^-]*?))?-(?P[^\s-]+?)-(?P[^\s-]+?)-(?P[^\s-]+?) + \.whl|\.dist-info)$""", + re.VERBOSE, + ) + + def __init__(self, filename: str) -> None: + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename(f"{filename} is not a valid wheel filename.") + self.filename = filename + self.name = wheel_info.group("name").replace("_", "-") + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group("ver").replace("_", "-") + self.build_tag = wheel_info.group("build") + self.pyversions = wheel_info.group("pyver").split(".") + self.abis = wheel_info.group("abi").split(".") + self.plats = wheel_info.group("plat").split(".") + + # All the tag combinations from this file + self.file_tags = { + Tag(x, y, z) for x in self.pyversions for y in self.abis for z in self.plats + } + + def get_formatted_file_tags(self) -> List[str]: + """Return the wheel's tags as a sorted list of strings.""" + return sorted(str(tag) for tag in self.file_tags) + + def support_index_min(self, tags: List[Tag]) -> int: + """Return the lowest index that one of the wheel's file_tag combinations + achieves in the given list of supported tags. + + For example, if there are 8 supported tags and one of the file tags + is first in the list, then return 0. + + :param tags: the PEP 425 tags to check the wheel against, in order + with most preferred first. + + :raises ValueError: If none of the wheel's file tags match one of + the supported tags. + """ + try: + return next(i for i, t in enumerate(tags) if t in self.file_tags) + except StopIteration: + raise ValueError() + + def find_most_preferred_tag( + self, tags: List[Tag], tag_to_priority: Dict[Tag, int] + ) -> int: + """Return the priority of the most preferred tag that one of the wheel's file + tag combinations achieves in the given list of supported tags using the given + tag_to_priority mapping, where lower priorities are more-preferred. + + This is used in place of support_index_min in some cases in order to avoid + an expensive linear scan of a large list of tags. + + :param tags: the PEP 425 tags to check the wheel against. + :param tag_to_priority: a mapping from tag to priority of that tag, where + lower is more preferred. + + :raises ValueError: If none of the wheel's file tags match one of + the supported tags. + """ + return min( + tag_to_priority[tag] for tag in self.file_tags if tag in tag_to_priority + ) + + def supported(self, tags: Iterable[Tag]) -> bool: + """Return whether the wheel is compatible with one of the given tags. + + :param tags: the PEP 425 tags to check the wheel against. + """ + return not self.file_tags.isdisjoint(tags) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/network/__init__.py new file mode 100644 index 0000000..b51bde9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/network/__init__.py @@ -0,0 +1,2 @@ +"""Contains purely network-related utilities. +""" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca0fcdaa8d88afb5b0d61093f1c2144b11da9909 GIT binary patch literal 272 zcmXw!F-`+95Jl|}K@=%>*fv7hQIZxRAtFjTC}=EaJqnZc+Lk>FG8f?toP`_EasfoT zRCuNEoB8h-qyIl=v#BUrwvW42x!(i)OP>Ob{r5BF7k=ws7hLszk&})gd1zSDiP# Z#p`%pIt9vtO8GmIavaA6{{XbEP?`V$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52785b4fccf393c7d17b6cc1471ea66ae9e28f99 GIT binary patch literal 22014 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%0D!<#zoPrP zM6v5#GbNL}v+pfVHgF`v0e|@EAF`vp7NhdFWlnoAmJ-=4nq$IvTs$S_-l2>I4- zWQ7(cNkcnD1kD~(ux0RhmVgaoP_Z{5`@gBeiQG=+QioC!mJFXUln}*G77(Z{x`(0x z^%uTk69{YcigcPX#`S)7$zGvnv8#M=4TJtqWS1;sh!m~Y}+Fcv2 zY7JOdgdm>1?j8#2IeS&J@Mc*H+jc2v$%g+uyxE^q&@oiu zJqd3Rbio&SrdX)PINzR>F_dF0QFzz*PI0yweut8lY&Y0y9z@bKu+1H&Pr+0a?a5%s zpoxMB%%2oX0%MWWs*#0@^l9vennck-2lF_9WpsB`n-ZgFLcy)lg0J0nvOJ-a_9#Y>=k#;%%549e)r_P?zuC0`}x`4 z4FMe>p|)Um&pxBsLztwL^mt?orF@A$hMDz(RtvORri74Hwdt;~M71|Yf0AOHF|aGn!V_dxI0yw~a)v~qq$RLZBwDnP z1Onc>+`wIMrlUn^QJv)*1aPqLLR2S9iQ)2kGR|C5BTE$G&$tqePW#H63+t7)q3agv zFzAqt)CA{*H=Kor(46pzrIsC*#xo1}>oN3*cD+RjOW=kG-s16Le}>Zq6hv)DsTq?Di13OyjiK!YcnR1*LU{>nSto1m%IcgGh@wI z#!B&&-W!m@s@rjnyiqB@+k*naPoD$TW();>PZ~S8rve^DK`g(4En~{qh5-e3UW&l= z$2ml?{bK7`!)5Xsr|6PQ#!3!Yc_k4rZ@;noVlAhi4@X{ux0(^YFHCa!waa1B1>Wu? zxNt8L4t{Sa#p@W;bXXTK20Cb~i!gO#N`oM{2uTNZQ3?-iH!}PJT}e|29D|diY>1>N zS|q6&CU0yzdWwEIUfNJ}p6_}o8Uz|af~bq3mv(bPTiN3f1^0ajZs_dV)faeOa2?a8v?t6Vy{coJ`kRxGOkcPHj754?v~x>xz+e7&!LqkKJkRUbI_nE%9U-6_ zj*2^1=dTt#$JP%1Yum5e){pn+j`x3fEho%e!8cf|DfFn~9TAYA;g{bO? zMqinTCA1a_-XEboNM1&Qyr2k>^c5g?iDvOIV5cwWWEu)`ACTAK3eIF~yYH>rG(rv= zuCCoQW645nt}QE;JU(Od^57?4YLu zd)6-D&rfg=LLWOA)rg*|%=By*(qK%1lCTv7qAka_=NXVf9z!X+|4+(<;L;;#W!lIZYmJkAH z3P~EtI1qLPuiJXenZ0M`W))uZS(;p&L@T}0zdD+)J~`L_pt5;ISsh&KUO&;7 zJJFY~yfk-d!&|v9x+3JgO<-xA;nn&=!(lN0-ta`rH|PA#D-)miJHY&V!(jfM zVK901!MD!7d3L?-Xs+()>cG8=`MPs+R|*wX%Yl`%*}$=E#j(8O*q0&L?ALfN(e{v- zomGYEz|!>Mbhf%9>*)Zx;i+13FS-lGI;`b$?sV-&XJk9+?Gi1vsMKsy}YJ zVdVB#wYV;B@PFj*8vm zPSqTRm}m%4&B-pO!o|BOdJdZDQ6!gg%QcB3$ojBTB^#JRpf4B+{CE{WI!aE8{*nOs>dAv#*Fyq?X~q8n*%_a{ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e89be0fe0ee4536bbb0cb4ba1745b361a9da32c GIT binary patch literal 11681 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 Zxx!}gSL44N-x)c%J#z9Zcqv4<{}=wG-;DqO literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/auth.py b/myenv/lib/python3.12/site-packages/pip/_internal/network/auth.py new file mode 100644 index 0000000..94a82fa --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/network/auth.py @@ -0,0 +1,561 @@ +"""Network Authentication Helpers + +Contains interface (MultiDomainBasicAuth) and associated glue code for +providing credentials in the context of network requests. +""" +import logging +import os +import shutil +import subprocess +import sysconfig +import typing +import urllib.parse +from abc import ABC, abstractmethod +from functools import lru_cache +from os.path import commonprefix +from pathlib import Path +from typing import Any, Dict, List, NamedTuple, Optional, Tuple + +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.models import Request, Response +from pip._vendor.requests.utils import get_netrc_auth + +from pip._internal.utils.logging import getLogger +from pip._internal.utils.misc import ( + ask, + ask_input, + ask_password, + remove_auth_from_url, + split_auth_netloc_from_url, +) +from pip._internal.vcs.versioncontrol import AuthInfo + +logger = getLogger(__name__) + +KEYRING_DISABLED = False + + +class Credentials(NamedTuple): + url: str + username: str + password: str + + +class KeyRingBaseProvider(ABC): + """Keyring base provider interface""" + + has_keyring: bool + + @abstractmethod + def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: + ... + + @abstractmethod + def save_auth_info(self, url: str, username: str, password: str) -> None: + ... + + +class KeyRingNullProvider(KeyRingBaseProvider): + """Keyring null provider""" + + has_keyring = False + + def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: + return None + + def save_auth_info(self, url: str, username: str, password: str) -> None: + return None + + +class KeyRingPythonProvider(KeyRingBaseProvider): + """Keyring interface which uses locally imported `keyring`""" + + has_keyring = True + + def __init__(self) -> None: + import keyring + + self.keyring = keyring + + def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: + # Support keyring's get_credential interface which supports getting + # credentials without a username. This is only available for + # keyring>=15.2.0. + if hasattr(self.keyring, "get_credential"): + logger.debug("Getting credentials from keyring for %s", url) + cred = self.keyring.get_credential(url, username) + if cred is not None: + return cred.username, cred.password + return None + + if username is not None: + logger.debug("Getting password from keyring for %s", url) + password = self.keyring.get_password(url, username) + if password: + return username, password + return None + + def save_auth_info(self, url: str, username: str, password: str) -> None: + self.keyring.set_password(url, username, password) + + +class KeyRingCliProvider(KeyRingBaseProvider): + """Provider which uses `keyring` cli + + Instead of calling the keyring package installed alongside pip + we call keyring on the command line which will enable pip to + use which ever installation of keyring is available first in + PATH. + """ + + has_keyring = True + + def __init__(self, cmd: str) -> None: + self.keyring = cmd + + def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: + # This is the default implementation of keyring.get_credential + # https://github.com/jaraco/keyring/blob/97689324abcf01bd1793d49063e7ca01e03d7d07/keyring/backend.py#L134-L139 + if username is not None: + password = self._get_password(url, username) + if password is not None: + return username, password + return None + + def save_auth_info(self, url: str, username: str, password: str) -> None: + return self._set_password(url, username, password) + + def _get_password(self, service_name: str, username: str) -> Optional[str]: + """Mirror the implementation of keyring.get_password using cli""" + if self.keyring is None: + return None + + cmd = [self.keyring, "get", service_name, username] + env = os.environ.copy() + env["PYTHONIOENCODING"] = "utf-8" + res = subprocess.run( + cmd, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + env=env, + ) + if res.returncode: + return None + return res.stdout.decode("utf-8").strip(os.linesep) + + def _set_password(self, service_name: str, username: str, password: str) -> None: + """Mirror the implementation of keyring.set_password using cli""" + if self.keyring is None: + return None + env = os.environ.copy() + env["PYTHONIOENCODING"] = "utf-8" + subprocess.run( + [self.keyring, "set", service_name, username], + input=f"{password}{os.linesep}".encode("utf-8"), + env=env, + check=True, + ) + return None + + +@lru_cache(maxsize=None) +def get_keyring_provider(provider: str) -> KeyRingBaseProvider: + logger.verbose("Keyring provider requested: %s", provider) + + # keyring has previously failed and been disabled + if KEYRING_DISABLED: + provider = "disabled" + if provider in ["import", "auto"]: + try: + impl = KeyRingPythonProvider() + logger.verbose("Keyring provider set: import") + return impl + except ImportError: + pass + except Exception as exc: + # In the event of an unexpected exception + # we should warn the user + msg = "Installed copy of keyring fails with exception %s" + if provider == "auto": + msg = msg + ", trying to find a keyring executable as a fallback" + logger.warning(msg, exc, exc_info=logger.isEnabledFor(logging.DEBUG)) + if provider in ["subprocess", "auto"]: + cli = shutil.which("keyring") + if cli and cli.startswith(sysconfig.get_path("scripts")): + # all code within this function is stolen from shutil.which implementation + @typing.no_type_check + def PATH_as_shutil_which_determines_it() -> str: + path = os.environ.get("PATH", None) + if path is None: + try: + path = os.confstr("CS_PATH") + except (AttributeError, ValueError): + # os.confstr() or CS_PATH is not available + path = os.defpath + # bpo-35755: Don't use os.defpath if the PATH environment variable is + # set to an empty string + + return path + + scripts = Path(sysconfig.get_path("scripts")) + + paths = [] + for path in PATH_as_shutil_which_determines_it().split(os.pathsep): + p = Path(path) + try: + if not p.samefile(scripts): + paths.append(path) + except FileNotFoundError: + pass + + path = os.pathsep.join(paths) + + cli = shutil.which("keyring", path=path) + + if cli: + logger.verbose("Keyring provider set: subprocess with executable %s", cli) + return KeyRingCliProvider(cli) + + logger.verbose("Keyring provider set: disabled") + return KeyRingNullProvider() + + +class MultiDomainBasicAuth(AuthBase): + def __init__( + self, + prompting: bool = True, + index_urls: Optional[List[str]] = None, + keyring_provider: str = "auto", + ) -> None: + self.prompting = prompting + self.index_urls = index_urls + self.keyring_provider = keyring_provider # type: ignore[assignment] + self.passwords: Dict[str, AuthInfo] = {} + # When the user is prompted to enter credentials and keyring is + # available, we will offer to save them. If the user accepts, + # this value is set to the credentials they entered. After the + # request authenticates, the caller should call + # ``save_credentials`` to save these. + self._credentials_to_save: Optional[Credentials] = None + + @property + def keyring_provider(self) -> KeyRingBaseProvider: + return get_keyring_provider(self._keyring_provider) + + @keyring_provider.setter + def keyring_provider(self, provider: str) -> None: + # The free function get_keyring_provider has been decorated with + # functools.cache. If an exception occurs in get_keyring_auth that + # cache will be cleared and keyring disabled, take that into account + # if you want to remove this indirection. + self._keyring_provider = provider + + @property + def use_keyring(self) -> bool: + # We won't use keyring when --no-input is passed unless + # a specific provider is requested because it might require + # user interaction + return self.prompting or self._keyring_provider not in ["auto", "disabled"] + + def _get_keyring_auth( + self, + url: Optional[str], + username: Optional[str], + ) -> Optional[AuthInfo]: + """Return the tuple auth for a given url from keyring.""" + # Do nothing if no url was provided + if not url: + return None + + try: + return self.keyring_provider.get_auth_info(url, username) + except Exception as exc: + logger.warning( + "Keyring is skipped due to an exception: %s", + str(exc), + ) + global KEYRING_DISABLED + KEYRING_DISABLED = True + get_keyring_provider.cache_clear() + return None + + def _get_index_url(self, url: str) -> Optional[str]: + """Return the original index URL matching the requested URL. + + Cached or dynamically generated credentials may work against + the original index URL rather than just the netloc. + + The provided url should have had its username and password + removed already. If the original index url had credentials then + they will be included in the return value. + + Returns None if no matching index was found, or if --no-index + was specified by the user. + """ + if not url or not self.index_urls: + return None + + url = remove_auth_from_url(url).rstrip("/") + "/" + parsed_url = urllib.parse.urlsplit(url) + + candidates = [] + + for index in self.index_urls: + index = index.rstrip("/") + "/" + parsed_index = urllib.parse.urlsplit(remove_auth_from_url(index)) + if parsed_url == parsed_index: + return index + + if parsed_url.netloc != parsed_index.netloc: + continue + + candidate = urllib.parse.urlsplit(index) + candidates.append(candidate) + + if not candidates: + return None + + candidates.sort( + reverse=True, + key=lambda candidate: commonprefix( + [ + parsed_url.path, + candidate.path, + ] + ).rfind("/"), + ) + + return urllib.parse.urlunsplit(candidates[0]) + + def _get_new_credentials( + self, + original_url: str, + *, + allow_netrc: bool = True, + allow_keyring: bool = False, + ) -> AuthInfo: + """Find and return credentials for the specified URL.""" + # Split the credentials and netloc from the url. + url, netloc, url_user_password = split_auth_netloc_from_url( + original_url, + ) + + # Start with the credentials embedded in the url + username, password = url_user_password + if username is not None and password is not None: + logger.debug("Found credentials in url for %s", netloc) + return url_user_password + + # Find a matching index url for this request + index_url = self._get_index_url(url) + if index_url: + # Split the credentials from the url. + index_info = split_auth_netloc_from_url(index_url) + if index_info: + index_url, _, index_url_user_password = index_info + logger.debug("Found index url %s", index_url) + + # If an index URL was found, try its embedded credentials + if index_url and index_url_user_password[0] is not None: + username, password = index_url_user_password + if username is not None and password is not None: + logger.debug("Found credentials in index url for %s", netloc) + return index_url_user_password + + # Get creds from netrc if we still don't have them + if allow_netrc: + netrc_auth = get_netrc_auth(original_url) + if netrc_auth: + logger.debug("Found credentials in netrc for %s", netloc) + return netrc_auth + + # If we don't have a password and keyring is available, use it. + if allow_keyring: + # The index url is more specific than the netloc, so try it first + # fmt: off + kr_auth = ( + self._get_keyring_auth(index_url, username) or + self._get_keyring_auth(netloc, username) + ) + # fmt: on + if kr_auth: + logger.debug("Found credentials in keyring for %s", netloc) + return kr_auth + + return username, password + + def _get_url_and_credentials( + self, original_url: str + ) -> Tuple[str, Optional[str], Optional[str]]: + """Return the credentials to use for the provided URL. + + If allowed, netrc and keyring may be used to obtain the + correct credentials. + + Returns (url_without_credentials, username, password). Note + that even if the original URL contains credentials, this + function may return a different username and password. + """ + url, netloc, _ = split_auth_netloc_from_url(original_url) + + # Try to get credentials from original url + username, password = self._get_new_credentials(original_url) + + # If credentials not found, use any stored credentials for this netloc. + # Do this if either the username or the password is missing. + # This accounts for the situation in which the user has specified + # the username in the index url, but the password comes from keyring. + if (username is None or password is None) and netloc in self.passwords: + un, pw = self.passwords[netloc] + # It is possible that the cached credentials are for a different username, + # in which case the cache should be ignored. + if username is None or username == un: + username, password = un, pw + + if username is not None or password is not None: + # Convert the username and password if they're None, so that + # this netloc will show up as "cached" in the conditional above. + # Further, HTTPBasicAuth doesn't accept None, so it makes sense to + # cache the value that is going to be used. + username = username or "" + password = password or "" + + # Store any acquired credentials. + self.passwords[netloc] = (username, password) + + assert ( + # Credentials were found + (username is not None and password is not None) + # Credentials were not found + or (username is None and password is None) + ), f"Could not load credentials from url: {original_url}" + + return url, username, password + + def __call__(self, req: Request) -> Request: + # Get credentials for this request + url, username, password = self._get_url_and_credentials(req.url) + + # Set the url of the request to the url without any credentials + req.url = url + + if username is not None and password is not None: + # Send the basic auth with this request + req = HTTPBasicAuth(username, password)(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + # Factored out to allow for easy patching in tests + def _prompt_for_password( + self, netloc: str + ) -> Tuple[Optional[str], Optional[str], bool]: + username = ask_input(f"User for {netloc}: ") if self.prompting else None + if not username: + return None, None, False + if self.use_keyring: + auth = self._get_keyring_auth(netloc, username) + if auth and auth[0] is not None and auth[1] is not None: + return auth[0], auth[1], False + password = ask_password("Password: ") + return username, password, True + + # Factored out to allow for easy patching in tests + def _should_save_password_to_keyring(self) -> bool: + if ( + not self.prompting + or not self.use_keyring + or not self.keyring_provider.has_keyring + ): + return False + return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y" + + def handle_401(self, resp: Response, **kwargs: Any) -> Response: + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + username, password = None, None + + # Query the keyring for credentials: + if self.use_keyring: + username, password = self._get_new_credentials( + resp.url, + allow_netrc=False, + allow_keyring=True, + ) + + # We are not able to prompt the user so simply return the response + if not self.prompting and not username and not password: + return resp + + parsed = urllib.parse.urlparse(resp.url) + + # Prompt the user for a new username and password + save = False + if not username and not password: + username, password, save = self._prompt_for_password(parsed.netloc) + + # Store the new username and password to use for future requests + self._credentials_to_save = None + if username is not None and password is not None: + self.passwords[parsed.netloc] = (username, password) + + # Prompt to save the password to keyring + if save and self._should_save_password_to_keyring(): + self._credentials_to_save = Credentials( + url=parsed.netloc, + username=username, + password=password, + ) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + # The result of the assignment isn't used, it's just needed to consume + # the content. + _ = resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + req.register_hook("response", self.warn_on_401) + + # On successful request, save the credentials that were used to + # keyring. (Note that if the user responded "no" above, this member + # is not set and nothing will be saved.) + if self._credentials_to_save: + req.register_hook("response", self.save_credentials) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def warn_on_401(self, resp: Response, **kwargs: Any) -> None: + """Response callback to warn about incorrect credentials.""" + if resp.status_code == 401: + logger.warning( + "401 Error, Credentials not correct for %s", + resp.request.url, + ) + + def save_credentials(self, resp: Response, **kwargs: Any) -> None: + """Response callback to save credentials on success.""" + assert ( + self.keyring_provider.has_keyring + ), "should never reach here without keyring" + + creds = self._credentials_to_save + self._credentials_to_save = None + if creds and resp.status_code < 400: + try: + logger.info("Saving credentials to keyring") + self.keyring_provider.save_auth_info( + creds.url, creds.username, creds.password + ) + except Exception: + logger.exception("Failed to save credentials") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/cache.py b/myenv/lib/python3.12/site-packages/pip/_internal/network/cache.py new file mode 100644 index 0000000..4d0fb54 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/network/cache.py @@ -0,0 +1,106 @@ +"""HTTP cache implementation. +""" + +import os +from contextlib import contextmanager +from datetime import datetime +from typing import BinaryIO, Generator, Optional, Union + +from pip._vendor.cachecontrol.cache import SeparateBodyBaseCache +from pip._vendor.cachecontrol.caches import SeparateBodyFileCache +from pip._vendor.requests.models import Response + +from pip._internal.utils.filesystem import adjacent_tmp_file, replace +from pip._internal.utils.misc import ensure_dir + + +def is_from_cache(response: Response) -> bool: + return getattr(response, "from_cache", False) + + +@contextmanager +def suppressed_cache_errors() -> Generator[None, None, None]: + """If we can't access the cache then we can just skip caching and process + requests as if caching wasn't enabled. + """ + try: + yield + except OSError: + pass + + +class SafeFileCache(SeparateBodyBaseCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + + There is a race condition when two processes try to write and/or read the + same entry at the same time, since each entry consists of two separate + files (https://github.com/psf/cachecontrol/issues/324). We therefore have + additional logic that makes sure that both files to be present before + returning an entry; this fixes the read side of the race condition. + + For the write side, we assume that the server will only ever return the + same data for the same URL, which ought to be the case for files pip is + downloading. PyPI does not have a mechanism to swap out a wheel for + another wheel, for example. If this assumption is not true, the + CacheControl issue will need to be fixed. + """ + + def __init__(self, directory: str) -> None: + assert directory is not None, "Cache directory must not be None." + super().__init__() + self.directory = directory + + def _get_cache_path(self, name: str) -> str: + # From cachecontrol.caches.file_cache.FileCache._fn, brought into our + # class for backwards-compatibility and to avoid using a non-public + # method. + hashed = SeparateBodyFileCache.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key: str) -> Optional[bytes]: + # The cache entry is only valid if both metadata and body exist. + metadata_path = self._get_cache_path(key) + body_path = metadata_path + ".body" + if not (os.path.exists(metadata_path) and os.path.exists(body_path)): + return None + with suppressed_cache_errors(): + with open(metadata_path, "rb") as f: + return f.read() + + def _write(self, path: str, data: bytes) -> None: + with suppressed_cache_errors(): + ensure_dir(os.path.dirname(path)) + + with adjacent_tmp_file(path) as f: + f.write(data) + + replace(f.name, path) + + def set( + self, key: str, value: bytes, expires: Union[int, datetime, None] = None + ) -> None: + path = self._get_cache_path(key) + self._write(path, value) + + def delete(self, key: str) -> None: + path = self._get_cache_path(key) + with suppressed_cache_errors(): + os.remove(path) + with suppressed_cache_errors(): + os.remove(path + ".body") + + def get_body(self, key: str) -> Optional[BinaryIO]: + # The cache entry is only valid if both metadata and body exist. + metadata_path = self._get_cache_path(key) + body_path = metadata_path + ".body" + if not (os.path.exists(metadata_path) and os.path.exists(body_path)): + return None + with suppressed_cache_errors(): + return open(body_path, "rb") + + def set_body(self, key: str, body: bytes) -> None: + path = self._get_cache_path(key) + ".body" + self._write(path, body) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/download.py b/myenv/lib/python3.12/site-packages/pip/_internal/network/download.py new file mode 100644 index 0000000..d1d4354 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/network/download.py @@ -0,0 +1,186 @@ +"""Download files with progress indicators. +""" +import email.message +import logging +import mimetypes +import os +from typing import Iterable, Optional, Tuple + +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response + +from pip._internal.cli.progress_bars import get_download_progress_renderer +from pip._internal.exceptions import NetworkConnectionError +from pip._internal.models.index import PyPI +from pip._internal.models.link import Link +from pip._internal.network.cache import is_from_cache +from pip._internal.network.session import PipSession +from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks +from pip._internal.utils.misc import format_size, redact_auth_from_url, splitext + +logger = logging.getLogger(__name__) + + +def _get_http_response_size(resp: Response) -> Optional[int]: + try: + return int(resp.headers["content-length"]) + except (ValueError, KeyError, TypeError): + return None + + +def _prepare_download( + resp: Response, + link: Link, + progress_bar: str, +) -> Iterable[bytes]: + total_length = _get_http_response_size(resp) + + if link.netloc == PyPI.file_storage_domain: + url = link.show_url + else: + url = link.url_without_fragment + + logged_url = redact_auth_from_url(url) + + if total_length: + logged_url = f"{logged_url} ({format_size(total_length)})" + + if is_from_cache(resp): + logger.info("Using cached %s", logged_url) + else: + logger.info("Downloading %s", logged_url) + + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif is_from_cache(resp): + show_progress = False + elif not total_length: + show_progress = True + elif total_length > (40 * 1000): + show_progress = True + else: + show_progress = False + + chunks = response_chunks(resp, CONTENT_CHUNK_SIZE) + + if not show_progress: + return chunks + + renderer = get_download_progress_renderer(bar_type=progress_bar, size=total_length) + return renderer(chunks) + + +def sanitize_content_filename(filename: str) -> str: + """ + Sanitize the "filename" value from a Content-Disposition header. + """ + return os.path.basename(filename) + + +def parse_content_disposition(content_disposition: str, default_filename: str) -> str: + """ + Parse the "filename" value from a Content-Disposition header, and + return the default filename if the result is empty. + """ + m = email.message.Message() + m["content-type"] = content_disposition + filename = m.get_param("filename") + if filename: + # We need to sanitize the filename to prevent directory traversal + # in case the filename contains ".." path parts. + filename = sanitize_content_filename(str(filename)) + return filename or default_filename + + +def _get_http_response_filename(resp: Response, link: Link) -> str: + """Get an ideal filename from the given HTTP response, falling back to + the link filename if not provided. + """ + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get("content-disposition") + if content_disposition: + filename = parse_content_disposition(content_disposition, filename) + ext: Optional[str] = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(resp.headers.get("content-type", "")) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + return filename + + +def _http_get_download(session: PipSession, link: Link) -> Response: + target_url = link.url.split("#", 1)[0] + resp = session.get(target_url, headers=HEADERS, stream=True) + raise_for_status(resp) + return resp + + +class Downloader: + def __init__( + self, + session: PipSession, + progress_bar: str, + ) -> None: + self._session = session + self._progress_bar = progress_bar + + def __call__(self, link: Link, location: str) -> Tuple[str, str]: + """Download the file given by link into location.""" + try: + resp = _http_get_download(self._session, link) + except NetworkConnectionError as e: + assert e.response is not None + logger.critical( + "HTTP error %s while getting %s", e.response.status_code, link + ) + raise + + filename = _get_http_response_filename(resp, link) + filepath = os.path.join(location, filename) + + chunks = _prepare_download(resp, link, self._progress_bar) + with open(filepath, "wb") as content_file: + for chunk in chunks: + content_file.write(chunk) + content_type = resp.headers.get("Content-Type", "") + return filepath, content_type + + +class BatchDownloader: + def __init__( + self, + session: PipSession, + progress_bar: str, + ) -> None: + self._session = session + self._progress_bar = progress_bar + + def __call__( + self, links: Iterable[Link], location: str + ) -> Iterable[Tuple[Link, Tuple[str, str]]]: + """Download the files given by links into location.""" + for link in links: + try: + resp = _http_get_download(self._session, link) + except NetworkConnectionError as e: + assert e.response is not None + logger.critical( + "HTTP error %s while getting %s", + e.response.status_code, + link, + ) + raise + + filename = _get_http_response_filename(resp, link) + filepath = os.path.join(location, filename) + + chunks = _prepare_download(resp, link, self._progress_bar) + with open(filepath, "wb") as content_file: + for chunk in chunks: + content_file.write(chunk) + content_type = resp.headers.get("Content-Type", "") + yield link, (filepath, content_type) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py b/myenv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py new file mode 100644 index 0000000..82ec50d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py @@ -0,0 +1,210 @@ +"""Lazy ZIP over HTTP""" + +__all__ = ["HTTPRangeRequestUnsupported", "dist_from_wheel_url"] + +from bisect import bisect_left, bisect_right +from contextlib import contextmanager +from tempfile import NamedTemporaryFile +from typing import Any, Dict, Generator, List, Optional, Tuple +from zipfile import BadZipFile, ZipFile + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response + +from pip._internal.metadata import BaseDistribution, MemoryWheel, get_wheel_distribution +from pip._internal.network.session import PipSession +from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks + + +class HTTPRangeRequestUnsupported(Exception): + pass + + +def dist_from_wheel_url(name: str, url: str, session: PipSession) -> BaseDistribution: + """Return a distribution object from the given wheel URL. + + This uses HTTP range requests to only fetch the portion of the wheel + containing metadata, just enough for the object to be constructed. + If such requests are not supported, HTTPRangeRequestUnsupported + is raised. + """ + with LazyZipOverHTTP(url, session) as zf: + # For read-only ZIP files, ZipFile only needs methods read, + # seek, seekable and tell, not the whole IO protocol. + wheel = MemoryWheel(zf.name, zf) # type: ignore + # After context manager exit, wheel.name + # is an invalid file by intention. + return get_wheel_distribution(wheel, canonicalize_name(name)) + + +class LazyZipOverHTTP: + """File-like object mapped to a ZIP file over HTTP. + + This uses HTTP range requests to lazily fetch the file's content, + which is supposed to be fed to ZipFile. If such requests are not + supported by the server, raise HTTPRangeRequestUnsupported + during initialization. + """ + + def __init__( + self, url: str, session: PipSession, chunk_size: int = CONTENT_CHUNK_SIZE + ) -> None: + head = session.head(url, headers=HEADERS) + raise_for_status(head) + assert head.status_code == 200 + self._session, self._url, self._chunk_size = session, url, chunk_size + self._length = int(head.headers["Content-Length"]) + self._file = NamedTemporaryFile() + self.truncate(self._length) + self._left: List[int] = [] + self._right: List[int] = [] + if "bytes" not in head.headers.get("Accept-Ranges", "none"): + raise HTTPRangeRequestUnsupported("range request is not supported") + self._check_zip() + + @property + def mode(self) -> str: + """Opening mode, which is always rb.""" + return "rb" + + @property + def name(self) -> str: + """Path to the underlying file.""" + return self._file.name + + def seekable(self) -> bool: + """Return whether random access is supported, which is True.""" + return True + + def close(self) -> None: + """Close the file.""" + self._file.close() + + @property + def closed(self) -> bool: + """Whether the file is closed.""" + return self._file.closed + + def read(self, size: int = -1) -> bytes: + """Read up to size bytes from the object and return them. + + As a convenience, if size is unspecified or -1, + all bytes until EOF are returned. Fewer than + size bytes may be returned if EOF is reached. + """ + download_size = max(size, self._chunk_size) + start, length = self.tell(), self._length + stop = length if size < 0 else min(start + download_size, length) + start = max(0, stop - download_size) + self._download(start, stop - 1) + return self._file.read(size) + + def readable(self) -> bool: + """Return whether the file is readable, which is True.""" + return True + + def seek(self, offset: int, whence: int = 0) -> int: + """Change stream position and return the new absolute position. + + Seek to offset relative position indicated by whence: + * 0: Start of stream (the default). pos should be >= 0; + * 1: Current position - pos may be negative; + * 2: End of stream - pos usually negative. + """ + return self._file.seek(offset, whence) + + def tell(self) -> int: + """Return the current position.""" + return self._file.tell() + + def truncate(self, size: Optional[int] = None) -> int: + """Resize the stream to the given size in bytes. + + If size is unspecified resize to the current position. + The current stream position isn't changed. + + Return the new file size. + """ + return self._file.truncate(size) + + def writable(self) -> bool: + """Return False.""" + return False + + def __enter__(self) -> "LazyZipOverHTTP": + self._file.__enter__() + return self + + def __exit__(self, *exc: Any) -> None: + self._file.__exit__(*exc) + + @contextmanager + def _stay(self) -> Generator[None, None, None]: + """Return a context manager keeping the position. + + At the end of the block, seek back to original position. + """ + pos = self.tell() + try: + yield + finally: + self.seek(pos) + + def _check_zip(self) -> None: + """Check and download until the file is a valid ZIP.""" + end = self._length - 1 + for start in reversed(range(0, end, self._chunk_size)): + self._download(start, end) + with self._stay(): + try: + # For read-only ZIP files, ZipFile only needs + # methods read, seek, seekable and tell. + ZipFile(self) # type: ignore + except BadZipFile: + pass + else: + break + + def _stream_response( + self, start: int, end: int, base_headers: Dict[str, str] = HEADERS + ) -> Response: + """Return HTTP response to a range request from start to end.""" + headers = base_headers.copy() + headers["Range"] = f"bytes={start}-{end}" + # TODO: Get range requests to be correctly cached + headers["Cache-Control"] = "no-cache" + return self._session.get(self._url, headers=headers, stream=True) + + def _merge( + self, start: int, end: int, left: int, right: int + ) -> Generator[Tuple[int, int], None, None]: + """Return a generator of intervals to be fetched. + + Args: + start (int): Start of needed interval + end (int): End of needed interval + left (int): Index of first overlapping downloaded data + right (int): Index after last overlapping downloaded data + """ + lslice, rslice = self._left[left:right], self._right[left:right] + i = start = min([start] + lslice[:1]) + end = max([end] + rslice[-1:]) + for j, k in zip(lslice, rslice): + if j > i: + yield i, j - 1 + i = k + 1 + if i <= end: + yield i, end + self._left[left:right], self._right[left:right] = [start], [end] + + def _download(self, start: int, end: int) -> None: + """Download bytes from start to end inclusively.""" + with self._stay(): + left = bisect_left(self._right, start) + right = bisect_right(self._left, end) + for start, end in self._merge(start, end, left, right): + response = self._stream_response(start, end) + response.raise_for_status() + self.seek(start) + for chunk in response_chunks(response, self._chunk_size): + self._file.write(chunk) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/session.py b/myenv/lib/python3.12/site-packages/pip/_internal/network/session.py new file mode 100644 index 0000000..f17efc5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/network/session.py @@ -0,0 +1,520 @@ +"""PipSession and supporting code, containing all pip-specific +network request configuration and behavior. +""" + +import email.utils +import io +import ipaddress +import json +import logging +import mimetypes +import os +import platform +import shutil +import subprocess +import sys +import urllib.parse +import warnings +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Generator, + List, + Mapping, + Optional, + Sequence, + Tuple, + Union, +) + +from pip._vendor import requests, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter as _BaseCacheControlAdapter +from pip._vendor.requests.adapters import DEFAULT_POOLBLOCK, BaseAdapter +from pip._vendor.requests.adapters import HTTPAdapter as _BaseHTTPAdapter +from pip._vendor.requests.models import PreparedRequest, Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.urllib3.connectionpool import ConnectionPool +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +from pip import __version__ +from pip._internal.metadata import get_default_environment +from pip._internal.models.link import Link +from pip._internal.network.auth import MultiDomainBasicAuth +from pip._internal.network.cache import SafeFileCache + +# Import ssl from compat so the initial import occurs in only one place. +from pip._internal.utils.compat import has_tls +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.misc import build_url_from_netloc, parse_netloc +from pip._internal.utils.urls import url_to_path + +if TYPE_CHECKING: + from ssl import SSLContext + + from pip._vendor.urllib3.poolmanager import PoolManager + + +logger = logging.getLogger(__name__) + +SecureOrigin = Tuple[str, str, Optional[Union[int, str]]] + + +# Ignore warning raised when using --trusted-host. +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +SECURE_ORIGINS: List[SecureOrigin] = [ + # protocol, hostname, port + # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) + ("https", "*", "*"), + ("*", "localhost", "*"), + ("*", "127.0.0.0/8", "*"), + ("*", "::1/128", "*"), + ("file", "*", None), + # ssh is always secure. + ("ssh", "*", "*"), +] + + +# These are environment variables present when running under various +# CI systems. For each variable, some CI systems that use the variable +# are indicated. The collection was chosen so that for each of a number +# of popular systems, at least one of the environment variables is used. +# This list is used to provide some indication of and lower bound for +# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. +# For more background, see: https://github.com/pypa/pip/issues/5499 +CI_ENVIRONMENT_VARIABLES = ( + # Azure Pipelines + "BUILD_BUILDID", + # Jenkins + "BUILD_ID", + # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI + "CI", + # Explicit environment variable. + "PIP_IS_CI", +) + + +def looks_like_ci() -> bool: + """ + Return whether it looks like pip is running under CI. + """ + # We don't use the method of checking for a tty (e.g. using isatty()) + # because some CI systems mimic a tty (e.g. Travis CI). Thus that + # method doesn't provide definitive information in either direction. + return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) + + +def user_agent() -> str: + """ + Return a string representing the user agent. + """ + data: Dict[str, Any] = { + "installer": {"name": "pip", "version": __version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == "CPython": + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == "PyPy": + pypy_version_info = sys.pypy_version_info # type: ignore + if pypy_version_info.releaselevel == "final": + pypy_version_info = pypy_version_info[:3] + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == "Jython": + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == "IronPython": + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + + linux_distribution = distro.name(), distro.version(), distro.codename() + distro_infos: Dict[str, Any] = dict( + filter( + lambda x: x[1], + zip(["name", "version", "id"], linux_distribution), + ) + ) + libc = dict( + filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + ) + ) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if has_tls(): + import _ssl as ssl + + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_dist = get_default_environment().get_distribution("setuptools") + if setuptools_dist is not None: + data["setuptools_version"] = str(setuptools_dist.version) + + if shutil.which("rustc") is not None: + # If for any reason `rustc --version` fails, silently ignore it + try: + rustc_output = subprocess.check_output( + ["rustc", "--version"], stderr=subprocess.STDOUT, timeout=0.5 + ) + except Exception: + pass + else: + if rustc_output.startswith(b"rustc "): + # The format of `rustc --version` is: + # `b'rustc 1.52.1 (9bc8c42bb 2021-05-09)\n'` + # We extract just the middle (1.52.1) part + data["rustc_version"] = rustc_output.split(b" ")[1].decode() + + # Use None rather than False so as not to give the impression that + # pip knows it is not being run under CI. Rather, it is a null or + # inconclusive result. Also, we include some value rather than no + # value to make it easier to know that the check has been run. + data["ci"] = True if looks_like_ci() else None + + user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") + if user_data is not None: + data["user_data"] = user_data + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class LocalFSAdapter(BaseAdapter): + def send( + self, + request: PreparedRequest, + stream: bool = False, + timeout: Optional[Union[float, Tuple[float, float]]] = None, + verify: Union[bool, str] = True, + cert: Optional[Union[str, Tuple[str, str]]] = None, + proxies: Optional[Mapping[str, str]] = None, + ) -> Response: + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + # format the exception raised as a io.BytesIO object, + # to return a better error message: + resp.status_code = 404 + resp.reason = type(exc).__name__ + resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode("utf8")) + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict( + { + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + } + ) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self) -> None: + pass + + +class _SSLContextAdapterMixin: + """Mixin to add the ``ssl_context`` constructor argument to HTTP adapters. + + The additional argument is forwarded directly to the pool manager. This allows us + to dynamically decide what SSL store to use at runtime, which is used to implement + the optional ``truststore`` backend. + """ + + def __init__( + self, + *, + ssl_context: Optional["SSLContext"] = None, + **kwargs: Any, + ) -> None: + self._ssl_context = ssl_context + super().__init__(**kwargs) + + def init_poolmanager( + self, + connections: int, + maxsize: int, + block: bool = DEFAULT_POOLBLOCK, + **pool_kwargs: Any, + ) -> "PoolManager": + if self._ssl_context is not None: + pool_kwargs.setdefault("ssl_context", self._ssl_context) + return super().init_poolmanager( # type: ignore[misc] + connections=connections, + maxsize=maxsize, + block=block, + **pool_kwargs, + ) + + +class HTTPAdapter(_SSLContextAdapterMixin, _BaseHTTPAdapter): + pass + + +class CacheControlAdapter(_SSLContextAdapterMixin, _BaseCacheControlAdapter): + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + def cert_verify( + self, + conn: ConnectionPool, + url: str, + verify: Union[bool, str], + cert: Optional[Union[str, Tuple[str, str]]], + ) -> None: + super().cert_verify(conn=conn, url=url, verify=False, cert=cert) + + +class InsecureCacheControlAdapter(CacheControlAdapter): + def cert_verify( + self, + conn: ConnectionPool, + url: str, + verify: Union[bool, str], + cert: Optional[Union[str, Tuple[str, str]]], + ) -> None: + super().cert_verify(conn=conn, url=url, verify=False, cert=cert) + + +class PipSession(requests.Session): + timeout: Optional[int] = None + + def __init__( + self, + *args: Any, + retries: int = 0, + cache: Optional[str] = None, + trusted_hosts: Sequence[str] = (), + index_urls: Optional[List[str]] = None, + ssl_context: Optional["SSLContext"] = None, + **kwargs: Any, + ) -> None: + """ + :param trusted_hosts: Domains not to emit warnings for when not using + HTTPS. + """ + super().__init__(*args, **kwargs) + + # Namespace the attribute with "pip_" just in case to prevent + # possible conflicts with the base class. + self.pip_trusted_origins: List[Tuple[str, Optional[int]]] = [] + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth(index_urls=index_urls) + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 502 may be a transient error from a CDN like CloudFlare or CloudFront + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 502, 503, 520, 527], + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) # type: ignore + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching so we'll use it for all http:// URLs. + # If caching is disabled, we will also use it for + # https:// hosts that we've marked as ignoring + # TLS errors for (trusted-hosts). + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + # We want to _only_ cache responses on securely fetched origins or when + # the host is specified as trusted. We do this because + # we can't validate the response of an insecurely/untrusted fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache), + max_retries=retries, + ssl_context=ssl_context, + ) + self._trusted_host_adapter = InsecureCacheControlAdapter( + cache=SafeFileCache(cache), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries, ssl_context=ssl_context) + self._trusted_host_adapter = insecure_adapter + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + for host in trusted_hosts: + self.add_trusted_host(host, suppress_logging=True) + + def update_index_urls(self, new_index_urls: List[str]) -> None: + """ + :param new_index_urls: New index urls to update the authentication + handler with. + """ + self.auth.index_urls = new_index_urls + + def add_trusted_host( + self, host: str, source: Optional[str] = None, suppress_logging: bool = False + ) -> None: + """ + :param host: It is okay to provide a host that has previously been + added. + :param source: An optional source string, for logging where the host + string came from. + """ + if not suppress_logging: + msg = f"adding trusted host: {host!r}" + if source is not None: + msg += f" (from {source})" + logger.info(msg) + + parsed_host, parsed_port = parse_netloc(host) + if parsed_host is None: + raise ValueError(f"Trusted host URL must include a host part: {host!r}") + if (parsed_host, parsed_port) not in self.pip_trusted_origins: + self.pip_trusted_origins.append((parsed_host, parsed_port)) + + self.mount( + build_url_from_netloc(host, scheme="http") + "/", self._trusted_host_adapter + ) + self.mount(build_url_from_netloc(host) + "/", self._trusted_host_adapter) + if not parsed_port: + self.mount( + build_url_from_netloc(host, scheme="http") + ":", + self._trusted_host_adapter, + ) + # Mount wildcard ports for the same host. + self.mount(build_url_from_netloc(host) + ":", self._trusted_host_adapter) + + def iter_secure_origins(self) -> Generator[SecureOrigin, None, None]: + yield from SECURE_ORIGINS + for host, port in self.pip_trusted_origins: + yield ("*", host, "*" if port is None else port) + + def is_secure_origin(self, location: Link) -> bool: + # Determine if this url used a secure transport mechanism + parsed = urllib.parse.urlparse(str(location)) + origin_protocol, origin_host, origin_port = ( + parsed.scheme, + parsed.hostname, + parsed.port, + ) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + origin_protocol = origin_protocol.rsplit("+", 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in self.iter_secure_origins(): + secure_protocol, secure_host, secure_port = secure_origin + if origin_protocol != secure_protocol and secure_protocol != "*": + continue + + try: + addr = ipaddress.ip_address(origin_host or "") + network = ipaddress.ip_network(secure_host) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if ( + origin_host + and origin_host.lower() != secure_host.lower() + and secure_host != "*" + ): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port matches. + if ( + origin_port != secure_port + and secure_port != "*" + and secure_port is not None + ): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + origin_host, + origin_host, + ) + + return False + + def request(self, method: str, url: str, *args: Any, **kwargs: Any) -> Response: + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + # Allow setting a default proxies on a session + kwargs.setdefault("proxies", self.proxies) + + # Dispatch the actual request + return super().request(method, url, *args, **kwargs) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/utils.py b/myenv/lib/python3.12/site-packages/pip/_internal/network/utils.py new file mode 100644 index 0000000..134848a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/network/utils.py @@ -0,0 +1,96 @@ +from typing import Dict, Generator + +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response + +from pip._internal.exceptions import NetworkConnectionError + +# The following comments and HTTP headers were originally added by +# Donald Stufft in git commit 22c562429a61bb77172039e480873fb239dd8c03. +# +# We use Accept-Encoding: identity here because requests defaults to +# accepting compressed responses. This breaks in a variety of ways +# depending on how the server is configured. +# - Some servers will notice that the file isn't a compressible file +# and will leave the file alone and with an empty Content-Encoding +# - Some servers will notice that the file is already compressed and +# will leave the file alone, adding a Content-Encoding: gzip header +# - Some servers won't notice anything at all and will take a file +# that's already been compressed and compress it again, and set +# the Content-Encoding: gzip header +# By setting this to request only the identity encoding we're hoping +# to eliminate the third case. Hopefully there does not exist a server +# which when given a file will notice it is already compressed and that +# you're not asking for a compressed file and will then decompress it +# before sending because if that's the case I don't think it'll ever be +# possible to make this work. +HEADERS: Dict[str, str] = {"Accept-Encoding": "identity"} + + +def raise_for_status(resp: Response) -> None: + http_error_msg = "" + if isinstance(resp.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. + try: + reason = resp.reason.decode("utf-8") + except UnicodeDecodeError: + reason = resp.reason.decode("iso-8859-1") + else: + reason = resp.reason + + if 400 <= resp.status_code < 500: + http_error_msg = ( + f"{resp.status_code} Client Error: {reason} for url: {resp.url}" + ) + + elif 500 <= resp.status_code < 600: + http_error_msg = ( + f"{resp.status_code} Server Error: {reason} for url: {resp.url}" + ) + + if http_error_msg: + raise NetworkConnectionError(http_error_msg, response=resp) + + +def response_chunks( + response: Response, chunk_size: int = CONTENT_CHUNK_SIZE +) -> Generator[bytes, None, None]: + """Given a requests Response, provide the data chunks.""" + try: + # Special case for urllib3. + for chunk in response.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False, + ): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = response.raw.read(chunk_size) + if not chunk: + break + yield chunk diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py b/myenv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py new file mode 100644 index 0000000..22ec8d2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py @@ -0,0 +1,62 @@ +"""xmlrpclib.Transport implementation +""" + +import logging +import urllib.parse +import xmlrpc.client +from typing import TYPE_CHECKING, Tuple + +from pip._internal.exceptions import NetworkConnectionError +from pip._internal.network.session import PipSession +from pip._internal.network.utils import raise_for_status + +if TYPE_CHECKING: + from xmlrpc.client import _HostType, _Marshallable + + from _typeshed import SizedBuffer + +logger = logging.getLogger(__name__) + + +class PipXmlrpcTransport(xmlrpc.client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__( + self, index_url: str, session: PipSession, use_datetime: bool = False + ) -> None: + super().__init__(use_datetime) + index_parts = urllib.parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request( + self, + host: "_HostType", + handler: str, + request_body: "SizedBuffer", + verbose: bool = False, + ) -> Tuple["_Marshallable", ...]: + assert isinstance(host, str) + parts = (self._scheme, host, handler, None, None, None) + url = urllib.parse.urlunparse(parts) + try: + headers = {"Content-Type": "text/xml"} + response = self._session.post( + url, + data=request_body, + headers=headers, + stream=True, + ) + raise_for_status(response) + self.verbose = verbose + return self.parse_response(response.raw) + except NetworkConnectionError as exc: + assert exc.response + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, + url, + ) + raise diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..713261d4d9bea7f72aa9947af4ca5f29dad5967d GIT binary patch literal 215 zcmZ9GJqp4=5QVcwL4@4F*1`;GD}oR#?X(T~8RD2^ci9~SdlJv!Sv-a(kaVfsv_5$A zzIjYB?e(GpDh5!Hn literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d5fc48bbbe21440c182e80f9fba9e93bf8c7146 GIT binary patch literal 7597 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..027dc1ee914f1bf439acfc006962f5cb08837905 GIT binary patch literal 10135 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 O-AeURj}VC!rT!lQtSe>! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d58580fc9ca76279ac86a7e7708d24a6997da604 GIT binary patch literal 25765 zcmb_^d2k$8dSB0pIWYqa?z2H0#1I$3L%dJ$5JeIziPYg)X~#oMg8(!KwtFZNSYS zge78OZ)?QL-nNJhZ(G8ibVM8$%41JBlVy>zq$}b|x+CtSC*oo8j)XVqi};w|neZpe zBjwCrmIx$+ks$NC5*5kHNM$k<2_>r{Rmti|b+RT>ldO%@ChH<~ERQ=;pKORUFuy0! zm~4tPC7UD7EbL9RBwHh`%!V=ZLiuR zkHIcG+U z*v|SBMoFU={cMbC@6ewCn#K-vfxRepcFI>uu zr&IiBTI9!5QYMy2#3;h^Pc#q1VT){kGL{(&+hzN)@sW(|I+YQ`*oA~3+s~l9?E1ze zWsfD0vtlHcN~gw0Vu|r-A)1OM1w@9Ev6qBsXNcu%Z!XEp=VN)w6#e_1${8cidJxlFx; zx8u1nK}evwz)>2@vGnCsA{|2uvd8cvx$*Jy=bwB!mbxfBjrkL#OzCulXtJZDVmcYU zOw~m%iS%_mPmWKX6C?>EL&$gZ(s&|%Uc@lae~VnH&J)#Vd=EFqa3+26A{%0DoP7hT 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..4d20bc9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.13.1" + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.controller import CacheController +from pip._vendor.cachecontrol.wrapper import CacheControl + +__all__ = [ + "__author__", + "__email__", + "__version__", + "CacheControlAdapter", + "CacheController", + "CacheControl", +] + +import logging + +logging.getLogger(__name__).addHandler(logging.NullHandler()) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d4d40cc2f078ba995c1853c9bde48ce592af30e GIT binary patch literal 921 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4af2418c3bf5ab28107097e1374c2e589412fa60 GIT binary patch literal 6483 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 Nbob3y1Zy_U{{qbX|33f# literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce2d5b26de0df82124fdd0485340afe1bf3e5c24 GIT binary patch literal 3828 zcmb_f-ESMm5#QzAk#`hn$+DcfiEE!NwHEzBHmQ@gMiNBvM?y4_gW4@1rp5WhTS+G! z@7Ud=Y!V6}6ncn(8jjls>Cvx(U;7XAxi2vipu(X=TNHihn*}Nm;HS>)@>5pY6zB<> z-JP4Aotd5a-SCh3e3roT+RD!tA7=>p2QIpgp(eDw0h3MQkqYssmkMYtRY_5tYk^kN zE4rNPfl*6W(zQ$_Q!^_jB`m|!AY%kp&8k?Gq{w^3OK%V_^CYD-SF)040?%UECt8O) zBDq=Mjtp>f&0Hbhn$O-|Vs_Q70*&UESv9t2J}TP_5x4zXJzzB!#(ub{Bt+3hX^$E0_D9~iY4Z|pQkuPAWe-Kqy z3R;pX-%Rqi=RUgbTz&ug)t{7S-%E~s*ofWvfPLuJ>u@*-o1Po9*srmw@=4K-gS7oN ztTzcG6$(L3c@U-zy`otV8jB46d8Vgr7!}>KJRKwqFY6gFrkkn4NMgO~3U(DEQSHQ2 zo`Q2Yh_+vnhs0EJfjsF^4n~%|>y#8#Crz=RD%usYDknSV*)L))c79wx5eq zEsRUm($56rqI84BEVQq2-}6h?m{^IUda2H%Wfsqb!iOl7YE2fdmI8miRBy&hQTT)6 ztFM)WAG1q!x4PmkGEu7g^^&v7LNDSad70HHjCmBOMX}yYv_%%T@;w)eusjClv`2uf zlRqCh^Tmap*kXAOJiEvOEuDTjygqKMEu+wc7CT zaeS+ZVT)jiAr`1+o$RH_=vieGKMtJ#^-lUG@ln*OVy{k4dn|ycx5oP6P@Gpll20I! zNA|87IQYmkKqodylgIy0%bdn8Py;XtTo!#E*YmlLLdgLlN~cBPk?C2Kxrc8 zNt&~`!NXQ=z8N!Nui3Lv$kZvO6ys-LGd}?&F{BLtHq2Yc{V)dUZiRF=o<%twb#zWq z+mX$`3#5?Z{dp!a9Vc{a%yE*e6#q>X64%kyl-b=!(N&id8HYZ z9$xtGz?-4M&v+>)a7`9EASpmVdJq6$jiql4ls?7MzXo_EOMmw8Jo}M6=f&DzBTg?# z*62Md0LOg-Tue9lbP}bYaZH><4*>NN9WKj-3&2uIEI;&P2N829N#R1|3#T>Sv#!|X zO~OWj)dHnEapHG3KGlC??M!^KY;f2u#QRQmR8069EdrtcM)Y=VW$FdlrCLE_-E z29VnQzT8qt4~7>(Or^uY;*#7}zHc%B%{h=3-vR=eKYHw8^M3Q;C-*$*mvq9@6# zM9{l%g>#@8Irp?Va+k^)gbTa`dZgz`x>3h+$*gbRSUdJW9O*WSu-qlOy8~ z=kCw#5^7!8$&EcM-!K0uck*fOs!D0GIxGogID|bUJ5-ICTx9h>azBG%Mc z)OiWmtuw=|#>W7}7i|fyzZ?WoiJ07m9UM!Ke-B6@!!fb>G?D@mH1;4!9>B*7D1rpB zw}X#+sT5$INsZ|qNb1G~36eM>NaBbf38Mr_8256TF{$to^;O}&_jF2vwryYy;3EZO zGyow18KFtiumx)Bg-mk%7OT4)GWy-fYxX`{?jjUR7C+eK5c)i5_f}o*yJ370R?MCU zS?mF!sk22Kapu`I{~l03wD0=yk`$`3*hR2|pf<2$lVqbbHVO z>Tqq*u?o7+Ah6@ezHoG}F%e5qBk=5b zW(Se$fh}D>f~LLdyWj<2;(!4l(6wyXg~`HjTgr&Of2=| z3Vs5q<{=$7@%IqNuNz13=kODgaQr@~#!I4$Jbc)o=jNNLrF)ytfG~ao#XCTrX_V64 ztVZ>(OhPCBNnZXdx%`w|{<}8z7yZnBI#2Vv1jwF!lumwT?GYIErYGpsR{1LegLLBG DfrBg8 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95e0f34862f7c22b4043ecbd92e4762a9dae03da GIT binary patch literal 16186 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c98ad35319d04210779b3202679a2346444f9cc GIT binary patch literal 6713 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 JF1*-U{2w~{e>ngE literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3bc1057337089675c0efd7cfefa1cf0664fc9be GIT binary patch literal 1693 zcmaJ>TW{k;6rPD4$8qZB($MX;WjEUv7ITSVw?J93h?17QR76N!kZ^?}Hy&DVePhO1 zNaRXELIR|HZ^bVFb)WbfyrDiAOO+O(72?fOmzO><<6N2oWulC~bIv!%XU@ex%d!OM zy0-K2)^}+DerLj9aXkQ!f1+Ry7{GuQu%QMa!zn9ea~fy!8lT9Vm9_;T|j|RPInyF*L~A^e1xewyJ9x|#6$%Vqt9E2_=FkW(+L_F@}q~XL8ssz~juGXIp`7MaGo%Ua@+w!X>85^mQalrOIHPv{c*i)u#Fpjhm?NBOf`H z6>J)&x`N1#?|Q0--TTO2c8E!1RqZx%9;lYNsd{Z1wR64t+BKD!K6=H|n>+dzBC2P4 zYU2TN3>T|OjQzW-Utrzy5UzUdXskBUTKFOjsZ9T5gKk|Am%;3n{hJT(JY4$$byvgk zm0!wBhtDl_KlpWgCKTncd^wzWHZ0AA7nN}OrKfTxFLZCk1(42ubN8#e-?sO!9`bV` zFD6oF|II^w{&6nfT|1`kfs(1;tFxt)Fnj4qVbH?Wb(&Y&`uG{D?i7aITnQ?5*Fj0D zBYx9$tt8={;%WO1D69sZ@|iv#m{?^xvwqt{8>5$}9r5XaGRY{Fe^L6QH>9z8b|z0p zb%XdrACZ8O-@*=_p(JG@k{XTAT2z4=4a`1bkwD#>&KBmWfY~HO6rx1 z(`&y==hBihNux%&5fWxoj9I%y^CRlBuQ;6x%)Y+=!yFD1!8yj9JJ;vw2#&D`Sawq2uTp?C0ADzfhi*`r&`K?wg60i6E>y!-^bdjuAL;|fRo!V`Y!h_4;- z%SZgpSOS;l!>QSD;f3(|7sJ=z3g5U9zPcC}FTg@5O~)L4KF-a=Y5I%>P@0T042hsP q7iSrgKw%-yF*F7)T#sdj#zA>8&NEa1Q`N**Tmr)6(+R3e0{ None: + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session() -> requests.Session: + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller # type: ignore[attr-defined] + return sess + + +def get_args() -> Namespace: + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main() -> None: + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + cache_controller: CacheController = ( + sess.cache_controller # type: ignore[attr-defined] + ) + cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..3e83e30 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,161 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import functools +import types +import zlib +from typing import TYPE_CHECKING, Any, Collection, Mapping + +from pip._vendor.requests.adapters import HTTPAdapter + +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import PERMANENT_REDIRECT_STATUSES, CacheController +from pip._vendor.cachecontrol.filewrapper import CallbackFileWrapper + +if TYPE_CHECKING: + from pip._vendor.requests import PreparedRequest, Response + from pip._vendor.urllib3 import HTTPResponse + + from pip._vendor.cachecontrol.cache import BaseCache + from pip._vendor.cachecontrol.heuristics import BaseHeuristic + from pip._vendor.cachecontrol.serialize import Serializer + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "PATCH", "DELETE"} + + def __init__( + self, + cache: BaseCache | None = None, + cache_etags: bool = True, + controller_class: type[CacheController] | None = None, + serializer: Serializer | None = None, + heuristic: BaseHeuristic | None = None, + cacheable_methods: Collection[str] | None = None, + *args: Any, + **kw: Any, + ) -> None: + super().__init__(*args, **kw) + self.cache = DictCache() if cache is None else cache + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send( + self, + request: PreparedRequest, + stream: bool = False, + timeout: None | float | tuple[float, float] | tuple[float, None] = None, + verify: bool | str = True, + cert: (None | bytes | str | tuple[bytes | str, bytes | str]) = None, + proxies: Mapping[str, str] | None = None, + cacheable_methods: Collection[str] | None = None, + ) -> Response: + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super().send(request, stream, timeout, verify, cert, proxies) + + return resp + + def build_response( + self, + request: PreparedRequest, + response: HTTPResponse, + from_cache: bool = False, + cacheable_methods: Collection[str] | None = None, + ) -> Response: + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif int(response.status) in PERMANENT_REDIRECT_STATUSES: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( # type: ignore[attr-defined] + response._fp, # type: ignore[attr-defined] + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length # type: ignore[attr-defined] + + def _update_chunk_length(self: HTTPResponse) -> None: + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() # type: ignore[attr-defined] + + response._update_chunk_length = types.MethodType( # type: ignore[attr-defined] + _update_chunk_length, response + ) + + resp: Response = super().build_response(request, response) # type: ignore[no-untyped-call] + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + assert request.url is not None + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache # type: ignore[attr-defined] + + return resp + + def close(self) -> None: + self.cache.close() + super().close() # type: ignore[no-untyped-call] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..3293b00 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,74 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from __future__ import annotations + +from threading import Lock +from typing import IO, TYPE_CHECKING, MutableMapping + +if TYPE_CHECKING: + from datetime import datetime + + +class BaseCache: + def get(self, key: str) -> bytes | None: + raise NotImplementedError() + + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: + raise NotImplementedError() + + def delete(self, key: str) -> None: + raise NotImplementedError() + + def close(self) -> None: + pass + + +class DictCache(BaseCache): + def __init__(self, init_dict: MutableMapping[str, bytes] | None = None) -> None: + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key: str) -> bytes | None: + return self.data.get(key, None) + + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: + with self.lock: + self.data.update({key: value}) + + def delete(self, key: str) -> None: + with self.lock: + if key in self.data: + self.data.pop(key) + + +class SeparateBodyBaseCache(BaseCache): + """ + In this variant, the body is not stored mixed in with the metadata, but is + passed in (as a bytes-like object) in a separate call to ``set_body()``. + + That is, the expected interaction pattern is:: + + cache.set(key, serialized_metadata) + cache.set_body(key) + + Similarly, the body should be loaded separately via ``get_body()``. + """ + + def set_body(self, key: str, body: bytes) -> None: + raise NotImplementedError() + + def get_body(self, key: str) -> IO[bytes] | None: + """ + Return the body as file-like object. + """ + raise NotImplementedError() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..24ff469 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +from pip._vendor.cachecontrol.caches.file_cache import FileCache, SeparateBodyFileCache +from pip._vendor.cachecontrol.caches.redis_cache import RedisCache + +__all__ = ["FileCache", "SeparateBodyFileCache", "RedisCache"] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a9a0c91ceefa480d07767b0c58caadf5c2e8ce2 GIT binary patch literal 454 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 wy2_zWfgKx!!nDFE|cXsIq_<(1UbHC2L=bYa? z=iK=hB6IE^nz{CJXSDXXc(UpPn!;TF?%y}%4? z&-GJcs9I(~1G_*&6?w&TDF`J$`s9PN*@1Is2i_Y_55Yv@9n+@+W^No;l@F<9`?=`! zh&NOT^)!s<2_+f9A{o(AEn!;DNLIoUp_LQFYDtjwpS8u3r@<{tvlNhsSxGQo&cvaO zL#vjh)YhgX|Pt#d9Dkd%06{QSrXQL+^6eL zri_9c7&+sTPnmDLO9SfagUq&UW03k2fmbw&%*)f@ZP&L)9BLHG)V*Rj_J~m|2jiam zYTxk_hHnS-Xwl3~m}As8igwY+UZJk#F(Zd?f%1TPPBichhR9|4N?)-Ys@bgV+Ces3 zX|uovk3;0dxKiU|?oz`&@apJU2NzS-ZH@ z+H*(kVdzCVCj)O%96H?QZ@>buS@QS3h}~6jp%DZEDU+a)MFh?XVoeoI3HC*R+BoIa zW^b(xcy{7Aj~HyCCPI^PRmvkEn`ml#RnDV-o5&(RJw+GyR^P9L~(bX`y0KCop}yQ=L;3g55CQ5Q3lv75j6*rpUt>Y3o|i+UAC5hv&}E zp06FOm6o;Md&#a^{8smG$;0 z_}2Kjqh>7adj0G8O2_Wn*kVWT%-QCN7iKTi25zf3dfJsrS@U&zrwoTGj?0 zG<0%_n_WNlE^Ehl@IOCaPl2`nFJJL~H)L!KfC8u)PsFIUMNsu3RNK~NYb1!%J_bR0bxr#coY-F9_ThX>6Zf!C@}hq|s` zwS)1ND13B1XO{5Y>q)1iD5_=L#t@HZzzY?wqtdnxK0b2@r2S*SrpRiHbac<3ym4~= z%#AZk?FauRLgK*8KqFS}YI_#7J++I=TF*lX7M?{Go#n_P#PgAtZ*hHk$)~=KFBi?B z$$HWA9Psyu?s~dQsig-VfZ&0L=>3{tU-~w@@;tqKyhNQx0y+b-o1B4}J`nNo0;b3V zRpS<>WR6Wmg+NuVu5J zmrN&GVQqLK7FdRLBf4t5LG}u=!^p6JNBM$}0Yiqn{2^e|q%I1|&U#Ex4y>x=obbM| zDrw5`mG;i4-TzY58iTxjkVw`QSg-F9lzsJ>tQ>fxiAplkfhVU^ThQ9k5}*mzGOXFW zmPTbX7L IO[bytes]: + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except OSError: + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class _FileCacheMixin: + """Shared implementation for both FileCache variants.""" + + def __init__( + self, + directory: str, + forever: bool = False, + filemode: int = 0o0600, + dirmode: int = 0o0700, + lock_class: type[BaseFileLock] | None = None, + ) -> None: + try: + if lock_class is None: + from filelock import FileLock + + lock_class = FileLock + except ImportError: + notice = dedent( + """ + NOTE: In order to use the FileCache you must have + filelock installed. You can install it via pip: + pip install filelock + """ + ) + raise ImportError(notice) + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x: str) -> str: + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name: str) -> str: + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key: str) -> bytes | None: + name = self._fn(key) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: + name = self._fn(key) + self._write(name, value) + + def _write(self, path: str, data: bytes) -> None: + """ + Safely write the data to the given path. + """ + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(path), self.dirmode) + except OSError: + pass + + with self.lock_class(path + ".lock"): + # Write our actual file + with _secure_open_write(path, self.filemode) as fh: + fh.write(data) + + def _delete(self, key: str, suffix: str) -> None: + name = self._fn(key) + suffix + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +class FileCache(_FileCacheMixin, BaseCache): + """ + Traditional FileCache: body is stored in memory, so not suitable for large + downloads. + """ + + def delete(self, key: str) -> None: + self._delete(key, "") + + +class SeparateBodyFileCache(_FileCacheMixin, SeparateBodyBaseCache): + """ + Memory-efficient FileCache: body is stored in a separate file, reducing + peak memory usage. + """ + + def get_body(self, key: str) -> IO[bytes] | None: + name = self._fn(key) + ".body" + try: + return open(name, "rb") + except FileNotFoundError: + return None + + def set_body(self, key: str, body: bytes) -> None: + name = self._fn(key) + ".body" + self._write(name, body) + + def delete(self, key: str) -> None: + self._delete(key, "") + self._delete(key, ".body") + + +def url_to_file_path(url: str, filecache: FileCache) -> str: + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..f4f68c4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + + +from datetime import datetime, timezone +from typing import TYPE_CHECKING + +from pip._vendor.cachecontrol.cache import BaseCache + +if TYPE_CHECKING: + from redis import Redis + + +class RedisCache(BaseCache): + def __init__(self, conn: Redis[bytes]) -> None: + self.conn = conn + + def get(self, key: str) -> bytes | None: + return self.conn.get(key) + + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: + if not expires: + self.conn.set(key, value) + elif isinstance(expires, datetime): + now_utc = datetime.now(timezone.utc) + if expires.tzinfo is None: + now_utc = now_utc.replace(tzinfo=None) + delta = expires - now_utc + self.conn.setex(key, int(delta.total_seconds()), value) + else: + self.conn.setex(key, expires, value) + + def delete(self, key: str) -> None: + self.conn.delete(key) + + def clear(self) -> None: + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self) -> None: + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..586b9f9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,494 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +""" +The httplib2 algorithms ported for use with requests. +""" +from __future__ import annotations + +import calendar +import logging +import re +import time +from email.utils import parsedate_tz +from typing import TYPE_CHECKING, Collection, Mapping + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from pip._vendor.cachecontrol.cache import DictCache, SeparateBodyBaseCache +from pip._vendor.cachecontrol.serialize import Serializer + +if TYPE_CHECKING: + from typing import Literal + + from pip._vendor.requests import PreparedRequest + from pip._vendor.urllib3 import HTTPResponse + + from pip._vendor.cachecontrol.cache import BaseCache + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + +PERMANENT_REDIRECT_STATUSES = (301, 308) + + +def parse_uri(uri: str) -> tuple[str, str, str, str, str]: + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + match = URI.match(uri) + assert match is not None + groups = match.groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController: + """An interface to see if request should cached or not.""" + + def __init__( + self, + cache: BaseCache | None = None, + cache_etags: bool = True, + serializer: Serializer | None = None, + status_codes: Collection[int] | None = None, + ): + self.cache = DictCache() if cache is None else cache + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301, 308) + + @classmethod + def _urlnorm(cls, uri: str) -> str: + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri: str) -> str: + return cls._urlnorm(uri) + + def parse_cache_control(self, headers: Mapping[str, str]) -> dict[str, int | None]: + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval: dict[str, int | None] = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def _load_from_cache(self, request: PreparedRequest) -> HTTPResponse | None: + """ + Load a cached response, or return None if it's not available. + """ + cache_url = request.url + assert cache_url is not None + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return None + + if isinstance(self.cache, SeparateBodyBaseCache): + body_file = self.cache.get_body(cache_url) + else: + body_file = None + + result = self.serializer.loads(request, cache_data, body_file) + if result is None: + logger.warning("Cache entry deserialization failed, entry ignored") + return result + + def cached_request(self, request: PreparedRequest) -> HTTPResponse | Literal[False]: + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + assert request.url is not None + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Check whether we can load the response from the cache: + resp = self._load_from_cache(request) + if not resp: + return False + + # If we have a cached permanent redirect, return it immediately. We + # don't need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if int(resp.status) in PERMANENT_REDIRECT_STATUSES: + msg = ( + "Returning cached permanent redirect response " + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + time_tuple = parsedate_tz(headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + max_age = resp_cc.get("max-age") + if max_age is not None: + freshness_lifetime = max_age + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires[:6]) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + max_age = cc.get("max-age") + if max_age is not None: + freshness_lifetime = max_age + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + min_fresh = cc.get("min-fresh") + if min_fresh is not None: + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request: PreparedRequest) -> dict[str, str]: + resp = self._load_from_cache(request) + new_headers = {} + + if resp: + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def _cache_set( + self, + cache_url: str, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + expires_time: int | None = None, + ) -> None: + """ + Store the data in the cache. + """ + if isinstance(self.cache, SeparateBodyBaseCache): + # We pass in the body separately; just put a placeholder empty + # string in the metadata. + self.cache.set( + cache_url, + self.serializer.dumps(request, response, b""), + expires=expires_time, + ) + # body is None can happen when, for example, we're only updating + # headers, as is the case in update_cached_response(). + if body is not None: + self.cache.set_body(cache_url, body) + else: + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body), + expires=expires_time, + ) + + def cache_response( + self, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + status_codes: Collection[int] | None = None, + ) -> None: + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + response.headers + ) + + if "date" in response_headers: + time_tuple = parsedate_tz(response_headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) + else: + date = 0 + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + assert request.url is not None + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # https://tools.ietf.org/html/rfc7234#section-4.1: + # A Vary header field-value of "*" always fails to match. + # Storing such a response leads to a deserialization warning + # during cache lookup and is not allowed to ever be served, + # so storing it can be avoided. + if "*" in response_headers.get("vary", ""): + logger.debug('Response header has "Vary: *"') + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + expires_time = 0 + if response_headers.get("expires"): + expires = parsedate_tz(response_headers["expires"]) + if expires is not None: + expires_time = calendar.timegm(expires[:6]) - date + + expires_time = max(expires_time, 14 * 86400) + + logger.debug(f"etag object cached for {expires_time} seconds") + logger.debug("Caching due to etag") + self._cache_set(cache_url, request, response, body, expires_time) + + # Add to the cache any permanent redirects. We do this before looking + # that the Date headers. + elif int(response.status) in PERMANENT_REDIRECT_STATUSES: + logger.debug("Caching permanent redirect") + self._cache_set(cache_url, request, response, b"") + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + time_tuple = parsedate_tz(response_headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) + # cache when there is a max-age > 0 + max_age = cc.get("max-age") + if max_age is not None and max_age > 0: + logger.debug("Caching b/c date exists and max-age > 0") + expires_time = max_age + self._cache_set( + cache_url, + request, + response, + body, + expires_time, + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + expires = parsedate_tz(response_headers["expires"]) + if expires is not None: + expires_time = calendar.timegm(expires[:6]) - date + else: + expires_time = None + + logger.debug( + "Caching b/c of expires header. expires in {} seconds".format( + expires_time + ) + ) + self._cache_set( + cache_url, + request, + response, + body, + expires_time, + ) + + def update_cached_response( + self, request: PreparedRequest, response: HTTPResponse + ) -> HTTPResponse: + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + assert request.url is not None + cache_url = self.cache_url(request.url) + cached_response = self._load_from_cache(request) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + { + k: v + for k, v in response.headers.items() # type: ignore[no-untyped-call] + if k.lower() not in excluded_headers + } + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self._cache_set(cache_url, request, cached_response) + + return cached_response diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..2514390 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,119 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import mmap +from tempfile import NamedTemporaryFile +from typing import TYPE_CHECKING, Any, Callable + +if TYPE_CHECKING: + from http.client import HTTPResponse + + +class CallbackFileWrapper: + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + + The data is stored in a temporary file until it is all available. As long + as the temporary files directory is disk-based (sometimes it's a + memory-backed-``tmpfs`` on Linux), data will be unloaded to disk if memory + pressure is high. For small files the disk usually won't be used at all, + it'll all be in the filesystem memory cache, so there should be no + performance impact. + """ + + def __init__( + self, fp: HTTPResponse, callback: Callable[[bytes], None] | None + ) -> None: + self.__buf = NamedTemporaryFile("rb+", delete=True) + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name: str) -> Any: + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__("_CallbackFileWrapper__fp") + return getattr(fp, name) + + def __is_fp_closed(self) -> bool: + try: + return self.__fp.fp is None + + except AttributeError: + pass + + try: + closed: bool = self.__fp.closed + return closed + + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self) -> None: + if self.__callback: + if self.__buf.tell() == 0: + # Empty file: + result = b"" + else: + # Return the data without actually loading it into memory, + # relying on Python's buffer API and mmap(). mmap() just gives + # a view directly into the filesystem's memory cache, so it + # doesn't result in duplicate memory use. + self.__buf.seek(0, 0) + result = memoryview( + mmap.mmap(self.__buf.fileno(), 0, access=mmap.ACCESS_READ) + ) + self.__callback(result) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + # Closing the temporary file releases memory and frees disk space. + # Important when caching big files. + self.__buf.close() + + def read(self, amt: int | None = None) -> bytes: + data: bytes = self.__fp.read(amt) + if data: + # We may be dealing with b'', a sign that things are over: + # it's passed e.g. after we've already closed self.__buf. + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt: int) -> bytes: + data: bytes = self.__fp._safe_read(amt) # type: ignore[attr-defined] + if amt == 2 and data == b"\r\n": + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..b9d72ca --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,154 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import calendar +import time +from datetime import datetime, timedelta, timezone +from email.utils import formatdate, parsedate, parsedate_tz +from typing import TYPE_CHECKING, Any, Mapping + +if TYPE_CHECKING: + from pip._vendor.urllib3 import HTTPResponse + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta: timedelta, date: datetime | None = None) -> datetime: + date = date or datetime.now(timezone.utc) + return date + delta + + +def datetime_to_header(dt: datetime) -> str: + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic: + def warning(self, response: HTTPResponse) -> str | None: + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response: HTTPResponse) -> dict[str, str]: + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response: HTTPResponse) -> HTTPResponse: + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({"Warning": warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + + def update_headers(self, response: HTTPResponse) -> dict[str, str]: + headers = {} + + if "expires" not in response.headers: + date = parsedate(response.headers["date"]) + expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[misc] + headers["expires"] = datetime_to_header(expires) + headers["cache-control"] = "public" + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw: Any) -> None: + self.delta = timedelta(**kw) + + def update_headers(self, response: HTTPResponse) -> dict[str, str]: + expires = expire_after(self.delta) + return {"expires": datetime_to_header(expires), "cache-control": "public"} + + def warning(self, response: HTTPResponse) -> str | None: + tmpl = "110 - Automatically cached for %s. Response might be stale" + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + + cacheable_by_default_statuses = { + 200, + 203, + 204, + 206, + 300, + 301, + 404, + 405, + 410, + 414, + 501, + } + + def update_headers(self, resp: HTTPResponse) -> dict[str, str]: + headers: Mapping[str, str] = resp.headers + + if "expires" in headers: + return {} + + if "cache-control" in headers and headers["cache-control"] != "public": + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if "date" not in headers or "last-modified" not in headers: + return {} + + time_tuple = parsedate_tz(headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) + last_modified = parsedate(headers["last-modified"]) + if last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp: HTTPResponse) -> str | None: + return None diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..f9e967c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,206 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import io +from typing import IO, TYPE_CHECKING, Any, Mapping, cast + +from pip._vendor import msgpack +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.urllib3 import HTTPResponse + +if TYPE_CHECKING: + from pip._vendor.requests import PreparedRequest + + +class Serializer: + serde_version = "4" + + def dumps( + self, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + ) -> bytes: + response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + response.headers + ) + + if body is None: + # When a body isn't passed in, we'll read the response. We + # also update the response with a new file handler to be + # sure it acts as though it was never read. + body = response.read(decode_content=False) + response._fp = io.BytesIO(body) # type: ignore[attr-defined] + response.length_remaining = len(body) + + data = { + "response": { + "body": body, # Empty bytestring if body is stored separately + "headers": {str(k): str(v) for k, v in response.headers.items()}, # type: ignore[no-untyped-call] + "status": response.status, + "version": response.version, + "reason": str(response.reason), + "decode_content": response.decode_content, + } + } + + # Construct our vary headers + data["vary"] = {} + if "vary" in response_headers: + varied_headers = response_headers["vary"].split(",") + for header in varied_headers: + header = str(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = str(header_value) + data["vary"][header] = header_value + + return b",".join([f"cc={self.serde_version}".encode(), self.serialize(data)]) + + def serialize(self, data: dict[str, Any]) -> bytes: + return cast(bytes, msgpack.dumps(data, use_bin_type=True)) + + def loads( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + # Short circuit if we've been given an empty set of data + if not data: + return None + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + verstr = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, f"_loads_v{verstr}")(request, data, body_file) # type: ignore[no-any-return] + + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return None + + def prepare_response( + self, + request: PreparedRequest, + cached: Mapping[str, Any], + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + # This case is also handled in the controller code when creating + # a cache entry, but is left here for backwards compatibility. + if "*" in cached.get("vary", {}): + return None + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return None + + body_raw = cached["response"].pop("body") + + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + data=cached["response"]["headers"] + ) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body: IO[bytes] + if body_file is None: + body = io.BytesIO(body_raw) + else: + body = body_file + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + # Discard any `strict` parameter serialized by older version of cachecontrol. + cached["response"].pop("strict", None) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v0( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> None: + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return None + + def _loads_v1( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + # The "v1" pickled cache format. This is no longer supported + # for security reasons, so we treat it as a miss. + return None + + def _loads_v2( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + # The "v2" compressed base64 cache format. + # This has been removed due to age and poor size/performance + # characteristics, so we treat it as a miss. + return None + + def _loads_v3( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> None: + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return None + + def _loads_v4( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + try: + cached = msgpack.loads(data, raw=False) + except ValueError: + return None + + return self.prepare_response(request, cached, body_file) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..f618bc3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +from typing import TYPE_CHECKING, Collection + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache + +if TYPE_CHECKING: + from pip._vendor import requests + + from pip._vendor.cachecontrol.cache import BaseCache + from pip._vendor.cachecontrol.controller import CacheController + from pip._vendor.cachecontrol.heuristics import BaseHeuristic + from pip._vendor.cachecontrol.serialize import Serializer + + +def CacheControl( + sess: requests.Session, + cache: BaseCache | None = None, + cache_etags: bool = True, + serializer: Serializer | None = None, + heuristic: BaseHeuristic | None = None, + controller_class: type[CacheController] | None = None, + adapter_class: type[CacheControlAdapter] | None = None, + cacheable_methods: Collection[str] | None = None, +) -> requests.Session: + cache = DictCache() if cache is None else cache + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods, + ) + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + return sess diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..8ce89ce --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,4 @@ +from .core import contents, where + +__all__ = ["contents", "where"] +__version__ = "2023.07.22" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..0037634 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from pip._vendor.certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..389e44d1a7725109e280bb55920af6747398fdfe GIT binary patch literal 337 zcmYjMJx{|h5Vez(mPTbmNGz1G1G$n8EC>myVq}9M16CWG)-Z+Q3d?)2_nI-NE_q_gwM1;)=+@rU3yS#&XZBAjqqkdkJ!46=X{ z9`JAyWFe2TsA}}qz9^3Mg1VJ!<%RODZro0V6*k1ajgaozX+Iq#{evV;PkW6z%JqM_ zZZbA13dZV~vAM8LYQ@+yS>P&JUPGxoc7yF07ZA5*U+8dd3n{EnA1B<~M~n kvN2w;de3bkeTS6Nce48tZ$93>ws-EEZyVbWv0X>)2eJKK6951J literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2564d2e95b9ef2c6b686dffd0806c9d80586905e GIT binary patch literal 664 zcmZut&ubGw6rS1NyO>rQgy1O%q7jq9dToV5@L0SklFPE)8PiF2XSXwxN=gq!5S3oM z>7Ss)|HO--mDKT4@gUxW-g?p5bho+qVBY)Y``*0yW(63SgQ=@03X3vDc00a!Y>d>N2O4zfBJ*X}C3Skpl*#6{9%nJqr-M3t+ zi+VZ7Bi_JT@D<`q+JUc^QFTt>g$BVGmYVrLt>ykM8aG>p^5Tq1!lY34^KHV(p3#o? zf_D3o4us4&2_+wq7F13YOPaA(puC9p^N0(g>N(9j;Vxk~ggksD0Vt%RU-OxP|;=oZSyayw)9JNH(RppvxnC>}(hQFh@_?^s2gTQlr#k&HA%x$-@-Ki+{pRb&%x_Np=8=Enz&QcV z4AiHf{o3;7S^k^bhj+eO*M4Yp^YGTo JO@37m{|6@mr!fEk literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cbbf81ffa3ca06353964b0f028c41a73ef6c4b4 GIT binary patch literal 3346 zcmbVOO>7&-6`uX$pD3;*Qj}ySCM(&E=~$$#sBPS|X%yR)izu>S$!9NNGy-=Y68Cw?+&;WsNOl2T|PJM65r6^l1 zkPg8&Z~ouB?|X0d@130?0%c_3=G>pV3HcW`ywcHB_OAnufbkr(#sXxlIB?sv(xRn4hx-IeQty0h3_>dEy8g!a&`!gmj?_B6C@02;X% z%m^BhW~(pg?2^rB(lw72Fmspz}y=X_XKi<~ghyBZ9dSHcy zbjoaV*349vL%(j7P-te}b0| zcgj>~DP^&gY4enBm2FzKc_#D}Z#TIzn5DL!<-C~1sXVLahnuIvHk4;{W~arc63l&y z$frfepXb`FS)`7Fk~_YJDLU@w6$KPrv;PMWcZluvleM>O?01Wev)p0`_km1U3jRjj zE)CHe_3FHAdo(0=z?)m>^t8kJep79&Y_nyWY)g{|(TZ8gXt!wDuvn&f^@Gr%=hA*B ztX&$rbmjVtHZ?YLm7&!PIqn1smRYXk?Rlren{jF87mmbj<^(kj{7jjqZIgX8;-Hi* zmF=vay}>Et*`HFtA$6IVhMB!g`GRd#vK3|(s6AHZ=7&X^EiKdXt!&Z!Fk4x+=dJQ< znF}LXZrXIXlGhjVbChSn^lZ~~7e3%jR<{@h;yB9EJY|%{;OHLs^S3~(k!M{b++XcT zK8usY;2%#{&-}PH_~!25_|D+?-@>)Q8?_TR*WY=PIQjWUyUEd=l0t9 ziE1FhaHk_cBbYAGH$efQn=lf{37*RfEx=()vm8QNXpz7hgSFBF*;@@DDU%G-5ktrw zCC_!!+!mYwE$fzHmgmxviv~mVogkxmL$m2^n?d3tuE8vdBLR>4ECJ24@aJbhtdS>b ztlE3FroOtXj_#fRnJ{QC=9Li*J(^(}cxg z%C_M8@pqv*vl!P~&W275X&1KJptPHO2%6{qRq=t~f%iS~vAilDM`Lfc zE*kJm8pK;6kZCeRE)Xs(i2`|#2=H4bx25;Ul8_cBSwEb=EjhAPp=B2tM@Ciyu%}>z zokoGTVE9xyvXQs*9Q~cb;*!1LOC%<|x`dwx0icFSq~~|1KYQig)kmGfbs_|l4`Yv` zeRnSY_Tp!6d?P{o8|?fyiUW>m_4i%prH9Hz|MB!*hZ*hkE;Q*3-K}z*Uu^WWTf89u zxGgImyUQ`5u!aQ@2ce*Y}e^P$vPm3$cqCGqOy5oZf-qh`M-0^FgVd+3Di7#`88Po~i zg6AC)k!F@>EhlQ0Di*Wh70-AXh#!7IFgG=0x^CoW7Yx^IBrr>&z$j+JARNVBuHg3; zRPgMvA?ypi>wXT-z=-3YYJ3+sf$LtfI|}we;75(G$2Zv+EJpbF%OLBLAP8TJiXiWY ziO{jv_ePb(_9Wk~6y1@cTT5R^C%=+M_Il!L??Ap-o2bii<)y9H_6bz=^MaxYTlzC_ zm?qSH#24IEdUurGyYVlSke?&;N7dM9#rZTzts+nT;RTfG-@EiNg;XgXB&P{W3OFnvmZmXKQK&=6AffG8xkhMp0q H+%WhL{%)kT literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000..0212369 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4635 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + +# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Label: "NAVER Global Root Certification Authority" +# Serial: 9013692873798656336226253319739695165984492813 +# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b +# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 +# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM +BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG +T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx +CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD +b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA +iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH +38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE +HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz +kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP +szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq +vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf +nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG +YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo +0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a +CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K +AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I +36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN +qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj +cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm ++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL +hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe +lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 +p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 +piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR +LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX +5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO +dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul +9XXeifdy +-----END CERTIFICATE----- + +# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" +# Serial: 131542671362353147877283741781055151509 +# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb +# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a +# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw +CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw +FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S +Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 +MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL +DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS +QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH +sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK +Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu +SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC +MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy +v+c= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Label: "GlobalSign Root R46" +# Serial: 1552617688466950547958867513931858518042577 +# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef +# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 +# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA +MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD +VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy +MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt +c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ +OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG +vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud +316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo +0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE +y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF +zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE ++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN +I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs +x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa +ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC +4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 +7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti +2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk +pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF +FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt +rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk +ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 +u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP +4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 +N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 +vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Label: "GlobalSign Root E46" +# Serial: 1552617690338932563915843282459653771421763 +# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f +# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 +# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx +CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD +ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw +MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex +HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq +R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd +yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 ++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 1977337328857672817 +# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 +# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe +# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 +MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc +tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd +IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC +AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw +ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m +iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF +Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ +hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P +Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE +EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV +1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t +CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR +5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw +f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 +ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK +GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus ECC Root CA" +# Serial: 630369271402956006249506845124680065938238527194 +# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 +# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 +# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw +RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY +BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz +MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u +LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 +v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd +e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw +V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA +AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG +GJTO +-----END CERTIFICATE----- + +# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus Root CA" +# Serial: 387574501246983434957692974888460947164905180485 +# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc +# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 +# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL +BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x +FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx +MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s +THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc +IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU +AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ +GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 +8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH +flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt +J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim +0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN +pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ +UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW +OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB +AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet +8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j +bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM +Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv +TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS +S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr +I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 +b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB +UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P +Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven +sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X2 O=Internet Security Research Group +# Subject: CN=ISRG Root X2 O=Internet Security Research Group +# Label: "ISRG Root X2" +# Serial: 87493402998870891108772069816698636114 +# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 +# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af +# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Label: "HiPKI Root CA - G1" +# Serial: 60966262342023497858655262305426234976 +# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 +# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 +# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa +Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 +YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw +qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv +Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 +lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz +Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ +KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK +FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj +HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr +y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ +/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM +a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 +fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG +SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc +SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza +ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc +XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg +iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho +L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF +Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr +kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ +vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU +YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 159662223612894884239637590694 +# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc +# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 +# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD +VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw +MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g +UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT +BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx +uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV +HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ ++wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 +bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 159662449406622349769042896298 +# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc +# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 +# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 159662495401136852707857743206 +# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 +# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 +# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G +jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 +4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 +VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm +ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj +# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj +# Label: "Telia Root CA v2" +# Serial: 7288924052977061235122729490515358 +# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 +# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd +# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx +CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE +AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 +NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ +MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq +AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 +vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 +lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD +n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT +7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o +6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC +TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 +WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R +DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI +pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj +YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy +rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi +0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM +A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS +SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K +TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF +6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er +3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt +Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT +VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW +ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA +rBPuUBQemMc= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 1 2020" +# Serial: 165870826978392376648679885835942448534 +# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed +# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 +# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 +NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS +zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 +QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ +VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW +wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV +dWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 1 2020" +# Serial: 126288379621884218666039612629459926992 +# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e +# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 +# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 +NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC +/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD +wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 +OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA +y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb +gfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS ECC P384 Root G5" +# Serial: 13129116028163249804115411775095713523 +# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed +# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee +# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp +Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 +MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ +bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS +7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp +0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS +B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 +BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ +LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 +DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS RSA4096 Root G5" +# Serial: 11930366277458970227240571539258396554 +# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 +# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 +# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT +HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN +NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs +IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ +ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 +2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp +wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM +pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD +nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po +sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx +Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd +Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX +KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe +XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL +tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv +TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H +PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF +O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ +REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik +AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv +/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ +p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw +MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF +qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK +ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root R1 O=Certainly +# Subject: CN=Certainly Root R1 O=Certainly +# Label: "Certainly Root R1" +# Serial: 188833316161142517227353805653483829216 +# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 +# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af +# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw +PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy +dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 +YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 +1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT +vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed +aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 +1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 +r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 +cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ +wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ +6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA +2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH +Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR +eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u +d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr +PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi +1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd +rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di +taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 +lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj +yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn +Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy +yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n +wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 +OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root E1 O=Certainly +# Subject: CN=Certainly Root E1 O=Certainly +# Label: "Certainly Root E1" +# Serial: 8168531406727139161245376702891150584 +# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 +# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b +# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw +CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu +bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ +BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s +eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK ++IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 +QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 +hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm +ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG +BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +# Issuer: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication RootCA3" +# Serial: 16247922307909811815 +# MD5 Fingerprint: 1c:9a:16:ff:9e:5c:e0:4d:8a:14:01:f4:35:5d:29:26 +# SHA1 Fingerprint: c3:03:c8:22:74:92:e5:61:a2:9c:5f:79:91:2b:1e:44:13:91:30:3a +# SHA256 Fingerprint: 24:a5:5c:2a:b0:51:44:2d:06:17:76:65:41:23:9a:4a:d0:32:d7:c5:51:75:aa:34:ff:de:2f:bc:4f:5c:52:94 +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNV +BAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScw +JQYDVQQDEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2 +MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UEAxMeU2VjdXJpdHkg +Q29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4r +CmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzA +lrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG +TfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF7 +9+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK7 +8vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4 +g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3we +GVPKp7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst ++3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M +0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQ +T9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEAAaNCMEAw +HQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PA +FNr0Y/Dq9HHuTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd +9XbXv8S2gVj/yP9kaWJ5rW4OH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQI +UYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+ +OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZXSEIx2C/pHF7uNke +gr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml+LLf +iAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUV +nuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD +2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI// +1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8Laad +TdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE----- + +# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication ECC RootCA1" +# Serial: 15446673492073852651 +# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 +# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 +# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT +AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD +VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx +NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT +HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 +IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl +dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK +ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu +9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O +be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA1" +# Serial: 113562791157148395269083148143378328608 +# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 +# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a +# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU +MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI +T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz +MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF +SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh +bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z +xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ +spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 +58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR +at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll +5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq +nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK +V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ +pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO +z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn +jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ +WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF +7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli +awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u ++2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 +X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN +SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo +P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI ++pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz +znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 +eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 +YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy +r/6zcCwupvI= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA2" +# Serial: 58605626836079930195615843123109055211 +# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c +# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 +# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw +CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ +VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy +MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ +TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS +b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B +IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ ++kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK +sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA +94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B +43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root E46" +# Serial: 88989738453351742415770396670917916916 +# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 +# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a +# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw +CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN +MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG +A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC +WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ +6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B +Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa +qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q +4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root R46" +# Serial: 156256931880233212765902055439220583700 +# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 +# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 +# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD +Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw +HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY +MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp +YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa +ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz +SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf +iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X +ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 +IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS +VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE +SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu ++Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt +8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L +HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt +zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P +AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ +YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 +gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA +Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB +JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX +DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui +TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 +dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 +LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp +0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY +QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS RSA Root CA 2022" +# Serial: 148535279242832292258835760425842727825 +# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da +# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca +# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO +MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD +DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX +DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw +b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP +L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY +t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins +S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 +PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO +L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 +R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w +dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS ++YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS +d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG +AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f +gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z +NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM +QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf +R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ +DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW +P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy +lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq +bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w +AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q +r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji +Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU +98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS ECC Root CA 2022" +# Serial: 26605119622390491762507526719404364228 +# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 +# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 +# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT +U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 +MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh +dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm +acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN +SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME +GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW +uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp +15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN +b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA ECC TLS 2021" +# Serial: 81873346711060652204712539181482831616 +# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 +# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd +# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w +LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w +CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 +MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF +Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X +tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 +AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 +KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD +aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu +CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo +9H1/IISpQuQo +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA RSA TLS 2021" +# Serial: 111436099570196163832749341232207667876 +# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 +# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 +# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM +MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx +MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 +MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD +QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z +4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv +Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ +kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs +GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln +nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh +3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD +0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy +geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 +ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB +c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI +pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs +o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ +qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw +xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM +rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 +AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR +0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY +o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 +dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE +oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py new file mode 100644 index 0000000..5c67600 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py @@ -0,0 +1,119 @@ +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem or its contents. +""" +import sys + +DEBIAN_CA_CERTS_PATH = '/etc/ssl/certs/ca-certificates.crt' + +if sys.version_info >= (3, 11): + + from importlib.resources import as_file, files + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = as_file(files("pip._vendor.certifi").joinpath("cacert.pem")) + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + + return _CACERT_PATH + + def contents() -> str: + return files("pip._vendor.certifi").joinpath("cacert.pem").read_text(encoding="ascii") + +elif sys.version_info >= (3, 7): + + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the + # file in cases where we're inside of a zipimport situation until + # someone actually calls where(), but we don't want to re-extract + # the file on every call of where(), so we'll do it once then store + # it in a global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you + # to manage the cleanup of this file, so it doesn't actually + # return a path, it returns a context manager that will give + # you the path when you enter it and will do any cleanup when + # you leave it. In the common case of not needing a temporary + # file, it will just return the file system location and the + # __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + + return _CACERT_PATH + + def contents() -> str: + return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii") + +else: + import os + import types + from typing import Union + + Package = Union[types.ModuleType, str] + Resource = Union[str, "os.PathLike"] + + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict' + ) -> str: + with open(where(), encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where() -> str: + f = os.path.dirname(__file__) + + return os.path.join(f, "cacert.pem") + + def contents() -> str: + return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii") + + +# Debian: Use system CA certs: +def where() -> str: + return DEBIAN_CA_CERTS_PATH + + +def contents() -> str: + with open(where(), "r", encoding="ascii") as data: + return data.read() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..fe58162 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py @@ -0,0 +1,115 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import List, Union + +from .charsetgroupprober import CharSetGroupProber +from .charsetprober import CharSetProber +from .enums import InputState +from .resultdict import ResultDict +from .universaldetector import UniversalDetector +from .version import VERSION, __version__ + +__all__ = ["UniversalDetector", "detect", "detect_all", "__version__", "VERSION"] + + +def detect( + byte_str: Union[bytes, bytearray], should_rename_legacy: bool = False +) -> ResultDict: + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + :param should_rename_legacy: Should we rename legacy encodings + to their more modern equivalents? + :type should_rename_legacy: ``bool`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError( + f"Expected object of type bytes or bytearray, got: {type(byte_str)}" + ) + byte_str = bytearray(byte_str) + detector = UniversalDetector(should_rename_legacy=should_rename_legacy) + detector.feed(byte_str) + return detector.close() + + +def detect_all( + byte_str: Union[bytes, bytearray], + ignore_threshold: bool = False, + should_rename_legacy: bool = False, +) -> List[ResultDict]: + """ + Detect all the possible encodings of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + :param ignore_threshold: Include encodings that are below + ``UniversalDetector.MINIMUM_THRESHOLD`` + in results. + :type ignore_threshold: ``bool`` + :param should_rename_legacy: Should we rename legacy encodings + to their more modern equivalents? + :type should_rename_legacy: ``bool`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError( + f"Expected object of type bytes or bytearray, got: {type(byte_str)}" + ) + byte_str = bytearray(byte_str) + + detector = UniversalDetector(should_rename_legacy=should_rename_legacy) + detector.feed(byte_str) + detector.close() + + if detector.input_state == InputState.HIGH_BYTE: + results: List[ResultDict] = [] + probers: List[CharSetProber] = [] + for prober in detector.charset_probers: + if isinstance(prober, CharSetGroupProber): + probers.extend(p for p in prober.probers) + else: + probers.append(prober) + for prober in probers: + if ignore_threshold or prober.get_confidence() > detector.MINIMUM_THRESHOLD: + charset_name = prober.charset_name or "" + lower_charset_name = charset_name.lower() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith("iso-8859") and detector.has_win_bytes: + charset_name = detector.ISO_WIN_MAP.get( + lower_charset_name, charset_name + ) + # Rename legacy encodings with superset encodings if asked + if should_rename_legacy: + charset_name = detector.LEGACY_MAP.get( + charset_name.lower(), charset_name + ) + results.append( + { + "encoding": charset_name, + "confidence": prober.get_confidence(), + "language": prober.language, + } + ) + if len(results) > 0: + return sorted(results, key=lambda result: -result["confidence"]) + + return [detector.result] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4888e8f9d939a2f9b6c86fc81f736d1d451a4939 GIT binary patch literal 4587 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 MdFYuJhPuN41+Ljr#sB~S literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..341410c27a0135fd8ed6fe9364b3b7a6a1b1fe53 GIT binary patch literal 27218 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5551d7fe8bb4154d22dd2451cb9445fe9c35861b GIT binary patch literal 1406 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 a`qmzSaPMe67hnkp_xg+mzQ)!V4*m}TX%i~| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d740485c5e7acad7f993dd1e9a0cbb755d846ef0 GIT binary patch literal 4141 zcmd5RYK)sZ!O4llo9LK)qcdwN=%Jd#ZaJy3;-Nn_1iW za|ZR^Isrj_PrQ z3t7W-q>CjpTP!4Vj(DX2#D^T6<($A9SCixtHs2z}MNCxQ>AR3DWLA(m^d<> z$rdt~%%q7^?gnn%Ir%T4|3f%CMhQ+w2_Acvr0t9@o#u27d+1%#LJdJrSPdjZ-Op%o zRZe(ukIrKW`vze_n%BLn!u^(*MDMP-o^5k}UBWUB;J!3ZSAvXSTF`x~LP7z04@l|- zy1$0L$0b6SkSaU@j|UqwFxeN?$$ardcap-@{@k=BurLC|Yi2u?|Rg3F0e84MLyIU>UVp(|9;5sj4+ z=wH&bY$0oEn&a1!DKmQwYlW4((^FywGn{^H5gVqKS;2;(xr5Z`2F|6KILD`Hsaz5! zHG}RRiQM??ooK#bMpMx%1|~*y9-FujnIl;}8=b?(vRN!eLC_L5UoRNh#T<_2%eZhY zn#(RmOJ(zFu@IX%{z}xyn)qlbnOX*4F`}hxDXLw=1-(e3DR3zr!v@eA*vwEZyC<6| zm5Bm}s2u#f1!me89R~(u8mdokpr=w`t;doE>fd=N4Lp{P+Xshg!eeQ`{_;#sSeNau zo~a2>q>*R9jZ!VeQyNj#GGjdeqPwx$&IN|zwi~L7mb_HN&N7F-JA=@5uF5TSjJUAQR4;+xfgF)w&??yj zH0h@UUe_;3h%$Ldn2os#CwrmOwmaDe9YQfu8R(*aCRU~V--4>G{I$S(u%q>T2R3rI zavvd&Z>%<6(s zj6^-18R-TP8-R!r(<3b8M za?6voLNbrn&`-T`3m6dNCda<+uFTNrFafqLOXV* z5qDRiJHrWAAoB5ACvLK6MMKK2qVpBNE<`I|djj_E#^+f+z~ug7+bz26{=eQrpaAZ2 zM@ZsAe4YhGH(U0yKuBP77wm&0KR$ z)8?+C3m~J5JKt~Ji$m+L0tZc{yGlFlUl+c>ZesV{V3g+PU8O4Ar%nikLl7v0WjGT6 z_xn`=0+a`U)S5+Ty~g0u<>hT~Wlxm{(0JpS_s{*K5`O>RXEN`EDY<$k<4On54jeWj zg`yd8UlWzR(1qVt8jPHVzA7_hFno~-SWD=Of#GW#2EDmr1|q*B>UeP_Luh_vS%HiJ zrHU@rD8d{cd%e<480;K@k_L^26n8D)(S%YN?E<`=dHM>l8GnWfAgF{ldT;gCMBA_2 zzR(D(R#@His{oDGz@!zP-1JYU^eG+mp6g#PZr+CoDfw&Y=3nS5_wLp^1wryit#U;J(H z1M_1KALwg(kurGa#G~K{yqs?O80eoUlg+)bX>%Vyvh_F!?X!ae@a|>MRCxj~Mif`W z^pk)-MBtO4SJU!EeI-X}S<~KLN#@)cLfya-;uqs**@K(C`Wy)!h44*bmI?J5#{=on zwGA~3p-Oi|nl}wF3p7bWl4aM@H1s)QI#*1ZZh8;2zA92Um(w)(bfM^AS^hOQSo*0* zT2a}?kD>Z>71^_IG-l6Rv*-VV1o1Vl9&fVtgUioZ`&{l3C!77q+t=hp@x-00b>nXS zBLw6#PkXT0*P@QynX1R`9;MUAI@8CReS5?McdpcD-%}rs$E@KKO#}lEhMv);Ik8t9 ztc#x@XqZyj0pn_~<2B1A_{b$R-ZAC4+6c5BaIMEQjfjqj;rq*A3U+lvFL@8S@+g8o xlTNut`5HM5U7B5uQK*_8j^jT03gT1?P5lc^{S8Gw_MYds!8^mx5p9`>{{mTcLTvy5 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef6493c0470f4889d75c5181d8fb7b6cd642b0fb GIT binary patch literal 5037 zcmb7IO>7&-6`m!R6sdoU60IN0-pGz6CYIP(ahtfVQ&o~<6$TYpbc4!usTFrfuC&}` zW|wlPP^eHC1&un0-5$)KhpIOP&cVmrTC|q}y-2YN3tIyf&;Ug)1tSG0kW2dBEPrLC zMF-&gym{}<%=`IfmVaq$YbH>}mw%Kz*F(rZa8M~?xpSaF=OIyuB4}jZX@z+K#xBj3 zcF()h;=Cvj#jS{%C+(g0rkm!Q1mYr8Sn8}OtF?;fk>HHx{Vwt*QM`AE()7qxrZwk; zkneLGL_#jxH=D6kLzgw%b3=#D=O_yF_G_}9%*si6Mb#|I?AEuKv8d|FIZL*v`64jg zlt))5M(1z6baQ?5>sv3^hCg*Ckora(*QpdwxpN@FA`b~Ac*c2`BFwv~xWw&LVRhPs zptz`r=T3-<=Z=aIDos)lpC-@=Xqtznxmc480%=po4whAH^tnt3jKB52*&n0`K?z{2|GcC1?+qIma&{fd|8Lw(#)uJRAy~_?la%&Qf z@6HQLh}wrr-i>DJuSy66C~%kelQl6fF8L3!!?3aovndaE`ZDZvDK6{MBA&#^CR3JV84_fGC9Aq5OK_X1&dF{YOfliq znwo}NN~x~Cn3J3hm}62jrJ7PAtHX_I=n_aQo2bqSG&s73G|*zDWUID_Rn?_Y*|a1B z%=!(7ACo3P32skKW{s=~`+FygnaYh{-bYoP%&5d@Mw8=I0ngxZz&IL}Ot@pIB%5(n ztr>Q#D(4)7zj7owlhM!ua17kP8E0z7GNs!oHJ*|bL(&aP%7U?{%l@tTsirUT`PWc* z;;u8ik3$~YkC7rXCg<#dnMic{dSoIxGaH$>7JGa4`qW(Pt%)cS?Iwsa1y;7b^j&yU zD0Y)-@)!zvc-q@O$GTLpJ>0mqh>h*nz?3oE4TmTmw+^uPm-D{C#4#?rI&vgJ9Km@F zPGPP$P zY9p{QRGisqJzHueeS^j8#kr!tFtZyt@icH|J8)(vaCYAt@rHuF~y z=mAZoUeeiH==d)X^b!Ec(Ga8vYc9pL=C%;3c&Wk8QJ|!_A5}n!SXCgZ$pB1UA>=23 z3v1$j|_6@aZ-z6naIp?{sf=}kzLxRJ>rqAe@{ zOe`!oISWsIzy(M)xK4lqnN**DxzVT5r@ZG#+88p(-hMPaPl^VXY-}Y zbu6_ks?W+YWI4&H9G#pM5L+~?R3$yDTdSoh-<*?MfD#jPlQT1Q%bx>~v?M^ac$P7E zxxumd*&*c-QmXnE7Onws>#sOpObZLOZC_z{^Vve2=l^Afw;%6b;!qHcKq8MLM{}B{ z4VGI`>1|t#L-yK!s%O)b!B-0VHgJTzJmcAG$n912m?bA|F~jHz@Wb}t8JJBtDUTPj zb5%Jx-@!ol3XQ#+)=#aBP=IJJ9xpeR3h_rAE>ck+RE z?^s_k`sCOPyMg1yGr#)o?^a4)(lhvQ_QCANB)l`C8xjPA)P^BZ|mV$GPxmcc#1#VX&v6{I9|pCc+TR-VkFeZx}de2W3jZMWHtPJYmLR; z$;w*!W3FrN>g@ICXVToz*| zadrqR5osQN?Q=Ie-#9Pg)G(h)XohUD5cXT~^{U3x6s}r@g^}kHR#&m&?@|1g;T~g% z3%mm0fbTcR(K}?XZ*WTt?p>ICdg1E!g{xl>(Q|$yQo`oX(F1G_S_RK2SjgL6atWU9 zVrs+uFuhNpd*H4RtJ6cpk&W>WM{#-6~c;HxE^|K!90HdWby z`+1ZbsLBnXTwue4Yyo8JD!E)hxUkvt*uNEeef#vq5&^;|*?nwK&f$PK!QLrP@1|#y zKK}96*yZh!H%bHuf0)_Frpyby(hmgAe8$t;xI-X((z8#X;mlvSpvUhBZo*It!+)#T zC{(r=-fHj);La?257W%#&UgMLXo?%@jH*$FZ+6EMjo$gncgcyW%j^cQAPSq9!zH&M y2nQF5(D66o|2rA_CkgMJ94RjTcIm^VUGcR8x9gN^iwyj`d07y8_X*Z~m;V8e7s^@y literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..066f3517459308406dcfc31b9af66e7a53708076 GIT binary patch literal 3897 zcmb_fOK%(36~4ol#v~;*cEu`Y9SvmIGHZ*3;yzNRNa0FO(WX%Y$tenDF&NEUN+SW%Xo0$`#&Ci9Cj{MQBc=%?3{oIK(M5Jjv?!2OzjKE}>OpnY z0eJ7Zk8{p5In2>Kw#1y2llHVmYAK}= zo$=C*%u+^UDfVOLWFImo_be52E@j(VW$1HS%zv(7tY}ebHgH^jWl>s^ziHX4uFvOO zTjHeHU8*BHmJp9UAa$&_7-vhG!D2g;bG=kSLf1jJ5w2sP9H~V{SHv_2A=CiNER54*aSlc z#yS^ny=_>=avKLBzun@#&5e2>u-CMNbnTXB2?M*z1y$qqKqz4xLSint$_hFrB|_jX`#XoXH&;-Zpu7?!next_J`@he8)^Oy_VmLc5+ zuNpU@?l6PBYWXWXgvRiIxMeGZ;=reEqbc~h8??eMr{xo*u518JP%G(z8y0?7`?4U~ zhyKG_l}U6lsN-02!9z(dwQ#j1gXzR2*YZlx;?3&|H)9dkV1o;pp~4VL1tSPSK9j33 zoc!Z~RDu{56fTOuER;|!j<{a*DxG&wh z%bjYB?9CeqtS&C!ac$%Y!Gqt)PlqkLMv^M8FPwX(4Em98D09ic3u3y%v&;JbPSR!e!J& z(4Z)UNEQJNs6(}dz@cLNs$z{&VI#^3E?dH%x4R8kHMBHF`tAQ6!xr1rHkqjoXmDsn ztyw*4)#H`9WPeRhsQwJTY_f7vSoLnp(PV$^YYEk#<>`ce*3}DM^%A1}O}6%p2xyd5Z6hkgcU2iixwvyi zLte15g4a@XYK6<6f#xF8P1Cm;+%%&conj}8zQkoE6=g#1)de{vBq)aQ)xBE7mo>Zg zcF09odmUl+jXB{uZf%Z-w`9<)HAS$-<#j|6byjP%xxZfX+~r!cEms5oYIWx28cKst zH!b^?g%(_Ey3Lxo&V45kHL?UXQH$Rk3VZj>Q*E{hsq4GaG&jn}-&xh<@cRV!Cm0^E z-O~7@%&!W&FHJnke5{v~`P1^$PI?qv@av%=7n^zEU_H5y5(G2V=d@r^nv zFc48e<#hKxWl$w23Yb(H9LS0y?Ewd?WK?R1bD*QVs(d9d%BxnO#DxTv-tH=OqP)-V zN>iO|oEwlq{o@@}vB2VRWZZ?i9*@+}xR% z=}gRgRG8VFJpX9!S{`2MS>T8|JAAXSUOunJEKO1{-XY4{}?85t*zZISq zp3iqK&349SKUnLGy#;~gi9fyi`&Xab@07pue63Ty9#^1V+|kP)>E*|_JG$`+3U&0% z&gevEbYfedP#Jxw_^3)$@tp;6QaUd(QO0paQ(hF`1bv{qqBH1!szKtz#-xa$eQsPF z;H&}n7DyJ=E*cC0o$QQGZtIiBfl}5epazJOfW~!)Y)Z{X8EV961}YKi4w3oy1{`oG=awB^w zEj#u2{FgYK+D~KS3)+YwkYe-*ida;#RX`8E7V+6Fm61`F`>jS8w-5#S+hFON@s<9A p*jKNK@8N)ID5Uz?OKX~jf4E3c}IZJbP*M`6X8-Um^0CA{I+z;M+r_Ap!LuuLwkJ$6p|8XN!$x{!db zwGF6E9Rhc)hUTeDtQGTjG_niy_pb9F&Mi1kXLx^5#h~18RaJd8B@ydAl7XZTg0LSk zYHC|nlVKbPfn~50Q#DmOyFn;Zt|o5Afd{S1J)Y^J-XSdC?8`( zVyq@GPEs<64W7dI*&v9^9d49VcEqHb!8l+n)mKC*6FSfqlD`8dIslwLM+uWCMB9RL zf!3*{>{5qEBtji3_GFr&jHgejyu(DK3r9&#**=P+9hBv=pR)GyjhjeBl3ve(a8K7K zP!?qf?^8xnj!Z9v>I(`{iZ+u{6kBv(qfj`32 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e211284e3959f12536c2f1d54cce3a1cfa6f1a9b GIT binary patch literal 1415 zcmah}&2QX96o2Edb<)iTDNQzTiBeHvRm8OEp%tjKWD62)(u$}Yd>MJ|N#e#I%gk(5 zM>*sWiH$_X38nu+75)=0p!R^QMndAmEn*X?>WMe@x@=F3p5Z~W`T#5mwu z-u`a0-2nJY9qMHcnZY;696|^oi6J2#A&S>xEzv!_6!Ui;uH5~$9SO;!PESTzdOP*wTtotuGb>pbrJL*0mu%G! zwxX1wbau5D%jnBovXw2LuQU08XC1~-Gr98M#Z{N8W43jUnVRRVW!{ZNF z3j>dY;Ax@RhYb>H`%O=0Mo5^sp@sUsaWu5{thZ8QMB3=X6XMzH;8?}EGH#VdVR0sV zJPlNV^-{srH|QhznH++wHE=+7;VHsgha(_s&_P=DwWFc8U7$uSljmx#wngn*i(Pm$ zRqOxT>zf2}M1Re(3sdyEj2AYgQ5s1~x$@7In_?^|;in?uD*56$+W@J!0~9 zDxyxz+$3k|V>gaEZa0@(S-QM*<*F+p$v)}&!M4B2gxig}E`7|>Fyn53QxGx?(8cDX zC!B?)ZqAz+eCPd<&Meg>UPO)f6v^v7cx6u))!@J?fuplqx{?GSR}XlsR827M0C37P`z8=Gf0c3 zN*2+gsh_Z&)@XL4n#;;ejlmxLIW^1ABlrJdt-Bd#e#&R@HlI@-MgrThpKkULyLTa} zrLMYO2b?PdIvO8C>6$a9hC}5`X)#V|l7+ok@l8s<@A+}1Dd8?`gde9#=7o+AnzvLY zA0jCxhC>msIHuGg{5=&=<#($DhTH0@B8y6K6Upm+IMXci!pSsPlP4N6=bi=s0B!@l z7Mxf^uJ!DqQngCeDc)_BC6o?T0n_D-j7)De&@4<%8MdREC$69= zER+g-4C--I371f-?vzEmu|KcCxydh~OjRcqkeuj*khAMRt{=nIV^}_h#ZzmFw0@iU K_zZ9_bNv^)kWkhD literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e6da1ccc0b4d47dbf9f5a87c82f96d6b0832e4c GIT binary patch literal 3015 zcmbVOOK;mo5MJs@(UNQ_=@V(YNSY!##6puIK#iiPEKxQcg)%HTXmp`zaxF8aNM%Vm zkWUJb9}u7g(qpeh{y_gjFUd{dsX$M@#j$|^>2rpX>^O1Vqy+eJb~yW*`F3W1$z&t~ z&(*D)?e7wV{DzIm6CVrv--Gawn50Ea!Hn2KC(?>^qOGVvB4mM>(fh=VJ&KI1Td`0V z2VH_iA4SL7c&JT+R%DSwZ6egBKr0>gPlmcF(4`M`VyMf2E_%c(#TD(Mq!yBasA-PgVVV|5n$~g6 zo{e%^)9&6LgrQu9&pa9%c zcy3~PEJ|a#lKm?D{`V-E@mA7Iv_v!6N||CyVsVz(NfOeUVpA-M5);FAx}PdYLAItl z?H&-TYS}*HJGb97ra-i?AKeH$dh{*}W2tw$cAxq#)x(k2)>bDmuZ%;!w)Rq}IV^~9 z5nwll5K1#BeFC5sGCT!ej!xrK2x)*Irq)$C$d?xtRc^>yL%FeBQ>uzw3C>J(&6QF` zX)1NKR13tV(sBtcgT(dvid<5IBn+UHm#zoVQmqyw$DM*Gs5s6(ia{QwvlBqUTLi$s zMImq!NzV)_!w)`s9D8^8;m40-?+vHV3>Jr(+@Lzl<_8NyDLW_+v-I(WYfrM*u$_Cb z_(VGQ!}b&D;=S@{5*+qepx@>=rkA<9ZaMAIfn0dg;2j=F;P^T_`4ApO1`gqgQAkzf zrd)0+>Ovq^>#J%-Q<_0Stv9tB@~d9FfL=tn2=6QO&*g#n(=+I~?7iy9D`@)vy>df0 zHZ6yZyrRCfS3>vD&S;PmGt_@OC*Ek5R+>RvURkNH1PP_tIKeBI&?^YV*S(U-4&-4v z190ROG(F~(C@ApRzXou6QeYy~x70?&Ox}+@3OhkkkosaF733T2PLDYTt65vjwl-bY z-1+u&ui1x|Sj%*Z`A#<=gU}7vw%xnH$*>4OMcB67o=05=Y8TdvFvB1DZx^=^BslYX z+%YEHAFq$#&wWe`4@qArM0V!pMuy%T)E!14xgvdG1uw0~fMU~jxdj!+a>7Mm5}xJn zz%U^#3qlYzY|q2VD91w{ckTx zs`5gqsoazUaaFA;*X7!+ATj=m%k>5%EciEN*t+L+7?c?^h+2-%ufX`Po~X;HL--P2 z595DSP@tA9PEHi$B0O8a#%G>Fxyk)_^%;TBev~9~Sbs(f4hJ$|jKgOViTzJObvm=K z-1L(LG02rCEGUm+(BJv_bQ&Gq5sn;B4@(OaduDsUC?1Zow$=bz*=)Y=Gn~m|KBhm$ z*VZUpN{%>)f%jdwDk0xW4%BO;qs_eVuI12jU2U$^YZNXnh70xGglmdPb+GV(!6TaP z{tf%y{R`nwgg+2|2T%*C6Jwi#1SnUbAXNgX1|Mx6D$VsE(YSSEzFrIB6=ea^V{$zA ztI?c;kvW0_uXi2*qZx-PlO?&ckRJh-hM5_NW_lWOLN<4AVU#JclUk6*g%PRF@ziiU zHKSWcSivq}Gt4(3al-kISGpJCSEJk2*Bq}HNC2-6@H8q2!d@gM#Ga>#aPD~`DdhJE uz`@z9@Y#dr0fEoK`J^!Y;EMy$Pd`5kfEFNSgxnqhcuvzo{uu!XSN#u9!uehR literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3113e0b52253bd3d7d4ce9200e9f043a83fe1b4 GIT binary patch literal 4585 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30ad1ea0b67ead1901da284fc60722d815cc9fff GIT binary patch literal 4402 zcmbUkTWk~A^^Wav#<7!ef?4MQi6MkySmNdZba^HlhgXRMi9;)EwaT$cP6-BkuDS$Cbs=_zv($atv2;k2wuSJWz9?~G=XYW)42Dh*$X z;t5G5auNoKMk*mpj0&S;!I5(@!)T+om645W0DKDPCZPx;qKHLw%%W*VwA^q-tYz2= zuuWn`MzT*^MB5G9{jzYRu0mz2sGMk*98$gHoVK*WOptR;+r+vXwnziOji7@An4d*g zn237<`RjEjwbU?Nw_{1oVmU?*(ro0w$$#TF(EXBGK&r_>b4&q!22Nla#URym38dQ1 zY4^+83P>=wj#OubTLyqzkx;?WjAm*EE@#pTD6z$aUySBV2IbH_CImZUm25`BIwuHm zIj#xHF=tOjC%Nkzg+;H0EVvM-3^VmuI(l*?*56Ug9nLIPJ(;!{Z} zkjhE&M}cH~Dv-&km(p^7Pj6p9iL287Of+^mIwL88Ogs}1K9XcHjRP@oHc?UoQZ|;z zfF^Lco=grm!{T|vRgLTHF?aqw;3)4w_w9AG$~DZ@X)7lHF8w}30FTs_fbv_$zWn>ZP( zuMxX};J4x?81Or!+e$hwbmf!AZ6+(=<~3RY9cRa?QPRzg66=A_M&FYkflISaa7o9P5gR07Hio=EmVJglYx zmAs^yR+O5iQiF4-4e3cD_7Uv>pW_@OHh-OOR+&(_XEmz}_$W z5kqv9;cC&h(>2fBeDD9Tje-4I^Waf*gyq}NTUz!8O<>p0Y^cD9Hja_h05-4w7(OWzida7PP!#M^J&Vq5O_+ z#Roqllld;iRUhQuH1$~nDWhWZR5 z8^D-E6P+CyA0Hdn?aB1a43q+_C{1N&u#d=gk&Yvi?4hx+Fgl{!4N2X8COkoK?&R2H zC@7o>>+D2$XgsWMnSl@=%VI3aFha;rO0r%rK<+nCnx1sqv?Pg8d=M*iM{p!OG8{e= zI;Hb7X;qNqbav*FAV$@w-bmG@<>|O6$uUW9o;W==9v+?y3*pn_BY>O>`t3B=VDij# zCa&Aac|f`;S1)u4j#wgqDGI4?e6$&Pu^;ffyE+>Y(+&ew(IACfM=Si6Ti52UE%W|m z&JR7{CEl+A${$$f4nY5n*SFYG^zPk2UdNA^xl^-4v+7!V=dX`{e!SE^ptTQt87{UT zo;|n1w|`M6b@pnVy^r|b6}M->dD~fX@6g;kRy>DRJS`GTReA|pC4TD@1GAYjNKkv9MU|y>EeFP<1cx7G*8c6^>-iN`*?|a>^Va@gjVwO zYo7iugMS$N{n*lv|KbU)5reB_t~_8K41L8eF-t>Vv&(^#4?+Awt@!B&7nYj7nq0c@ zu<7f`<$)hQ1Wgy$1LWY=`%uU3#i`Ffn6=&F=lDB}#(#uyCGVi-9V~j^pLMPB&GSbWw-x!GWv+)-R(=a^1f?N= z6Zz;MwV)tCd=OG;F`Fc?OAvmVjV28at=DN;t8)Ltd&~ppR zZhhWpVRx@{$lkbaVc3>Cv40{MHmoLL-Cl;;?sO4WTZPrOZtrH>?o2Koxa(i;>esdp ztRo;i*tS82^$^3dfkpOT2nKpabp4Rut=rXH20pPd-J+Ysu%!YHUo^-quIJMO4) zQOEHGpphC|*$3Uam0_6YKR`_DKhU8ksPAuR{}Z(53F?1>c0RKYGE88(dCzl10J_8f E0B-V}%m4rY literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26b1ea39f962e4ae0412bfebe17536833d5731e7 GIT binary patch literal 12101 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bba4e413e424d113121f2147b154dcd1e46af4d3 GIT binary patch literal 1409 zcmah}&1>976n~?ym7QHXaqDE=UW`LRMX^QVOQ69dwbMc!yCo()=rU-fv8`Ai+nL!A z86SKwbPWwX73W_F?tjutOLAz14TYY1Gu;?MPJJV-lFcatdh_PJd0)TxM!&UMY8GM7x5rhzu7!u+UqIfOV65Z2FUXP8$^vsesVk>EQ4FVc`4WW4e zp~cK&z4GPRdBd^)C3td3F>~+X^6GSKFfYt;HTZnymHj z_WCA)9MNBQ?7|eiF5`twX_Q8iQm*`S<)#=5O8BWrxJtg54oBKVebuL3G&MOBOgdU& z2o`S^W0VH5F9fARL#x^SH_}Z~=?3mY!MJe0Vv?n^D?AD#cZG=^nRVSR&mJ*(Hx*GQ zW^R(R^syU99k-jy?JQkfxN*}Jk!15-KiKiNm~gvM*QJkH8fM%La0)^uUDgYBIC{ca zSm@@wiNSY29_h?NUE)>Lhy^6C_u<5D9X9^3+b``;PG&y;b^XQ67k%TWiIZzfFRtC` z8!zp-Kkeqvu-XR`<;N5|mf_?aV@(TY5xevxItksM&KjqVSn_osU8rY8gbgPHZy^lyO zomVz(MN}+D<72q3J7a1rRH~E~@*ozh4r1XcLA6J?Z=)y+eagJnO==hZR73J$w zBt>gD4grf}N*%&4p|nixPKgP()m262lwt|V>jOB~40HOd3D(4!M$GoJ;6K1^px1&k ztLC0veW!Y*?v^E#4pjjc%jp=I+iH}js?iqe&yrMsmU8fm$)q#vL^VlVwV|+3D)1So zXHg|wqO8Cwi+E$-uE1I1*HNZAE@qLO>4cE;TR?7|!p&1yJcYSeR*STMpZe?^a4&QH EAEG`|I{*Lx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3d07fbd434c3e8652155170c86afd0ca1e90a0f GIT binary patch literal 27223 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 OF2?0(Y5K+uk^cj!Lf_p0 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..599e76213cf58a0ec64e2b455e7c6d669da7bc3f GIT binary patch literal 1409 zcmah}&2Q936o2Edb;52!Qvw^fL_t)ws>CX}Ab}!iLXi+jD3`A-2o7K+Ql*}Hi@HQYochLI!*c3Ke)HzNd0)Tx#(y>%qkwCE z>!*#k7Qo-?P%U%7^zR~b03n1VhJ<*8C|--TMECT9*JC3wJ+t7A*h*?%jerJsAT;+N zw3vCQm%cnZt2y>R1Wyjhr*7Y0Tzjw-3CW{YS4QphR_e!@hy*Gp7TaNzZmddQvSmNm zj8cZu^UK{>M&D(UEpGaJmB}A@yTv$a#tLV2b(t>zuyp%gFi5`G2GOB^50AfKEet#o zf~SRM57tSj?bSV<86jcjx)$nt#^J!)vp!0VA!)4#Pl#u)f@9@pinwJOxy706@-$Ed zR!ap}U%!XscX9x-(!f61fu{&_6^?+cKnIEKDA(b@+YV5plF2g_SJ|TWqs0z99Iy1B z_Ua~q4AEb4?A#RH4&%8^X_Q8iQm*`Sh(t4h3#8Zn3D{Vp8Yjs4n7yZPF_cr^9RA1kk>uJ?>z$BwQnyt;C; zXS}v&-q`iuM)yab*86AypS4v9inc1u4j?0rwz6$u$l0|A&*3@YXHhOx>!$ex(!8#6 zMX+e9txF{KXSU!b%|?Ph@qx7AfeW|U$9$@@Jx)eLj;qz=~DiAK!kv*2IAt*=*t z6RYB$UH+tcr|uRd6b@AZXN&0=n%i=eC(6+l>d%stf0knK^YNrL=tMb5T(u#$P%7{l zsAo|oT%fGLDvJ1E-zdRZ;9sFkbzDp%InfCrr`Ld7JBF*rFn6mTzc F{SOAzQm+62 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..502958953b4ebd0bf35b6bd8bc3f50ce626b9087 GIT binary patch literal 19145 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 G&;J3bQ<5$K literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ba6ca59cae573e3bd8a80841c551da3a99a2f71 GIT binary patch literal 1422 zcmah}&1>976n~?ymEGMqb#UTMFD51dQDPDM(n3h<*lnQ1PQkPXT?VZ*UMrTg+nL!= z86SKwbPWwX73W_F?tjutOL8cKO$$BsX1XzioccyurJG(lpf_*coA>#9qn}%?X~4Cz z`*rts2jEYAsFyuvMqeOv3^Bwcg^UD*Xx>PT%nZzuH&ZLK1H0s{)X5q_gMa}KAhr)7 zc9?x)R=xtaXn5{l1Wz7O*B{(pUb(Zpo(Rd4&Oj!;d^Hc#LL>sUvunLL$-7%Jlx!o6 zc9NW-^yO+>jl*VOGAky`-Zov#lY-FJ|PNVQJJ-u8i7wM@QObG0pM-&*X$|P#^%Co~vvz=rgWdN|QX1lydE#Yd2~tDgmG(<2rdY7f%31LygoPn%bNRCOt!0 zf~DJPiqa?zg`iXzXti+gX5eSJ^dtW(!MN~0XOiU$>pY1Qf1Qb4+3Wj#-h0gCYA%va z%KWTg`4c})I)1;9JH32m>CUn*63K4&!)Q0`GU4}=zE7X9JnnHn!a0bU^t&BBOy~;7 zVX0s6CPv?zo5W_RE^-l7VhPFX12}bCM~z?I`IqkX)AolyJ$li;JG8#Pbb9lX7dKaj z)=T%sZ*KF4>7(hV%@JC_JHTo|39RngF%-lzHkDJwd=AeEzl?IB!CT<7NL5p3i|wL$ zn6bU~JK0UDJZ+~3;Q;=axyG*`_y2(#Yxn2+gv(xQe99u;xOc1O+~c=UrmGVRNX|_{$i+uMK0brxGgvu;#aB*?w12tcT>$Q7 GuKxg5;ZivO literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8918299b67ad649b43198f1d2e948b8aed34c301 GIT binary patch literal 5841 zcmcH-ZA@F&^*&>pXY;@Y8*GCKZum${0v^H8G$m~*5JDQ956Fj}Ha&sggP0hbJ)5*p zqM`|DP_=6EV1?-on=ME$d{4;_KEJwvKP%ZEJeg#@huuUl0FQzIMjQHvp}k zcL)upFRbV%sK&*CR8hg=tZESvBNC52$83els z&|nY0K=4ll=nJ#2+J7?o`{lLgm(61n=emv`?|Y`}_%icyD8ffyj&=1M>+6$^q7Yvc zBY_|uqxRv!+{YjgxQlYg;1Qx`2p_^O|KtY;i#lWt!tckx-oDWEVFR0!QY8 z;JI8lIvWZ?Cl-u~g6u40-3Y}Na~#9O`N5$P*}yG`!VQ_>riB?8p!O^|EelE%$TeJc zY_@L@g_sbBDALD-@QiHYxL|lH7UQ@WuF31(leFZ8=^%}Vb8D~1W>%T@9jUA<8$(ar~S zW7^xfu75yxqz`+sZBN&`Hrd>`K3Q3R`!2a0J_?G|jwa-Y~z( zpwE&br$Y-UPR9cR*$dqYg_KX}(0$QCfiO=QIL|z5R<`P7nI%Bv&CWzPt6t6)xof-=ap5ZKG33uY}SBuD5hqNk|@&1zr+F0000NESksL4 zt-wZLZ!^9z4#X7WmKb-Y%2;pC5Tg}=$*kD4$e@@*6@yL#^8YmGj6QEVy=)GgyEvY; zora_FG#ssG%F3J{5&LoHc%quGF<_HOG?F!!tH{j?S--}ChXH_xH4tmpextQivu;ciab@Z)APXl?|0p{ukF#2_1}KQ<@XM`IA7slX3qJ<8(-^5 zfe$t0ccWoY147M$!@UgDELc5@I9xUc&P{UTBXa#rC=4|2T4?qfr+9lb5?)d-FAoTc zu!Zb3rd(|&v5WVcY#JV!92uG%3yf;_!E;Ei2ri1n_kn&!5cuWVqS!=|1mdwOaAkClIv))>gXSBEh$@vWa~&U9XmEh%GM>>y6#{5*!J`~y<=;7L>#8( z^`W$-?iRl}cY7{r@hDPllCAB&{(bYdIcYnVF%qYH^XBcFTa)+LyX*tUcXpial(RqS z?Emm7$@%Q3&i=HkIpyky6oQOvxgktE9TU zWHM*jOVkST^1FS~2xVVtqAZi5t`9$PUzlFYjDmeZqF3xueqR(%eS^e4mW05a)pqYS z<*ToJi77kA#{!&MQ4F0PyvPlYO-v33;6Y(Kdv0`W2=3L>BQIVYxxxhoA=K+Gk4;=E zq1DVntrm<%Wk{ydJWoeZxtqF@SLHhuvk#bP7986fc6LdE~h&{VAW$Te_Js%9G z{1+tnvt3xH(^a-x@sy)ia`YyvdefL8j!3p63FZiJ?&woazvT2M9R6gLUtxAiw$238 z3F@kAQ;bJqJSoN}F}{x(MenHOA5Hl$Oa99r`>#sO)l3C3)j}LI_FH_ap-XD$N>+81 z%!2cGOOEbDLwB;OyJQv^7<~P?5~9_fvK*2uhZ6Lmy`he$t%N#8>LyvDzy)NZnm4zJ z=ml!Q`$49|Q<2$4c$Srvi5j^Z?To1(?d;e)9Tq6cbPfM&W&uT|U%8?up3605^9q(k zPwx}eXpxfdTWGUBS!RM1@XKa1wZboAHe{E zJ^(V4t<{wWjyQ_+mk^90IE?^*9Z;UWBHk@xHvqXJ6p73F>1Z^pmK#cufk!SIuq27e zCTyleacW7m{Rr}CcwNG8F!3e10xEP7e^wALB6tD0)!CmzfPrydt7qZW+Tuy*o1kqx zkkB{mxY_}x8xJS+jxY4Ip?=q1X*iUz8x2QyoW6_!S}aX`nM%ZHVy@XWA!e;KnD4Y^ z2sB%5yVzvvsti}DJHZUWc8lLt+Dzksq2tb_t-kx-L~F0q?9UJ&eCXcACbL2jV@*cq zHXObad_A{`YO!gFO&3cjN3R^f1yphfK?i`Z=mFIgpA&=7 rg)L<)tONTb9da){o56UjsD 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 K^xJQ{?f(OqI@#0! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..949060f893b039a66e9551c0df3e662469ad85bc GIT binary patch literal 1413 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 B%U1vZ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7c7235b7109fcaf243625545ee9ee056577134a GIT binary patch literal 77007 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34554c232f84e340b7829ee6290ae9bf8bb456b3 GIT binary patch literal 83095 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff48ebb85e838c63bd66ea1d2d26f89d58ebbaf9 GIT binary patch literal 105270 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23fa972f3805f58047e8746f50e41dd53ca52b88 GIT binary patch literal 77535 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..483d77797775147680b846a4dceaff9c5aae7823 GIT binary patch literal 7021 zcmd^>Pizy}9mn5{|HO9e*s+s9LI{Bb5(kJk{Mka91)^lxwt}QIfK+R%k?~Bj2LB1; z2_kN&qKc|vRRoo`fuAwm#q?ws6^F&;^tiz?P^c`{@(n?PAEZ~ zwue5+?|tU|`OM6Fzj@DpibO&J>CmO~bKZ6#{!SNe@-aNOyh7X&y3m!pC@5*Apr%zt z=&J6?dkWsPSF$(nEBMoXurJ-Di*!I&(?Q*z4(UzlX4HlCKsura(=B=^9o3uDu{mJ` zf2sW6|3a99Z{oMvTsPzX-^6dT`v*7%qOXaC2)9v5{oT?XyP4aqcimLd7%E+-+vk5# zhVdM)`q8t|?^SK<>t5H7-e-MZm)$W`wrujF`Jvxt?QZ?+`qBN}e(Otj49eg7)2(_q z9aqJBLXTV*dW+$G=y7(PbYd}@j6I`^q-uLl<;s@rJ6Ft=iq90PQ|!pZ2N`q5u)c4W zE*K^%!bG{^+>Dj6jAz)h#50vLGCrft?3tgkCdvZHk|#`Rf8&gHO7r!Z^u4}|Y<*Qf zdO}lX4Z)`Ug7walUe&K*X;7nI<3^49HtJsAukOp@De8$PoYM23Ap1EE3`3+990aN! zToJR1u3itPJ8$4wL#^m{&w>{rSiVYw~h zhO#7XVm92TQUo1=PFfNgjgo0j;A&mV#b&pqQ8pZlh}x;7-}aRk<_*&hXj-nAvoy{2 zOrQOZ9n!_o2Hd%wR)Go zUPu*+Rw|o1S2oOY>ZD;A#okFXr{_|WM){IenorG}rHh6&UM%M>_BFRPyXQD zGup)XS#9dvX>$wJCn(!W8HFHEy4mg4R^l6`KrYrL>ez>j-rs%co*j2*elu3xo|5k_ zr{zZEX4Kq{ejDB$*G_;^gxwK~N>ZJwguXj7z5mFO!$Fv!w~Ssl=R!kQb**x{-I{Jveb{d}c-lJH3(ZpPD|aoqpH$V~KE@$}a#L z7je=jgU+Py+E%i5h{B4uEHCX?a;bYMIU(ttH4MGdx*-&)>M8`~kB}{kwZxXy#6UGM za6j-kF|ra^Ywi48GzC*D<4-#G-XE`a4zGOgNuuxG+11^n)!n1N|6z6a$xnu={b#F* zb1Rc;(Zub`A1*%W8CvZbsrHQA_I}j77Hh8sM6B&rEgW59oZ5%d+x*!&kj#wN;_QzHs5Qva8dj45SNvFcHS z*r;z#jn3=i8ylnnHs~?`Q5u zW_!vD1t)quh0N8YN5+orvr1MbkI*RG*-542%e3NKf}QC zPmv*vnxnTyZ;bxBd$n_4wR7K}oA)8G{t-*uo?LC)Q*GPxI5x22tNBH&{kHYt(q|qK zi9L;Xtj7DR@&0>fs_}vQ{i{P`)uFME&s2ww|DnG+bg~*h`N{5T>ofu=nD`=nq``FZkT&0qe!xSv|*O*AQc(Y%q%*Sd{DN{=1UpNJW3ql z{{>kipVzdcVs1mN+^tVIhZXHbCS^J`XKkRq=J-&3-OW zJomU2cwwh0ez%XB;`OF@&EM?nx_j>4;rq!)eFv-C57h)JKJI=_MXjsF*LBbLr9dI4 zNZx)b*=GB##d-W=H)-*m*NpHX<@~=eY1_7aMscA~cHVafRd~)#o|K2R?HQk$plk-& z#Cgi5>5^z>+T2IlAQxofvm z4h+fiDaQLS{wc=G660lw@v_8tSz^2_F;A4W12|gzHnBbE%NWLWb2Fb?+ z9}|2`@G-&11RoQ8l7`5)mwZFyV}g$fJ|_5>;A4W12|h{t$hV(-`^d)x9}|2`@G-&1 z1RoQ8l7`8bBHu9inBZfAj|n~|_?X~hf=|+0;A4W12|gzHB)v_(Z;|h9@-e~3 z1RoQ8Oz<(m#{{3GBjh_uz9Zygf{zJ4Cis}(V}g$fK1rkG`!@MT$;SjA6MRhYF~P?K z9}|3%#>n>$`Nqh{1RoQ8Oz<(m#{?e}e3Fil?>PC6k&g*JCis}(V}g$fJ|_4iolr ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single ' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((? y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % + (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + if ((_is_version_marker(elhs) or _is_version_marker(erhs)) + and op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')): + lhs = LV(lhs) + rhs = LV(rhs) + elif _is_version_marker(elhs) and op in ('in', 'not in'): + lhs = LV(lhs) + rhs = _get_versions(rhs) + result = self.operations[op](lhs, rhs) + return result + + +_DIGITS = re.compile(r'\d+\.\d+') + + +def default_context(): + + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version( + sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + ppv = platform.python_version() + m = _DIGITS.match(ppv) + pv = m.group(0) + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': ppv, + 'python_version': pv, + 'sys_platform': sys.platform, + } + return result + + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % + (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % + (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..7189aee --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1068 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and 2.2). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in +# the metadata. Include them in the tuple literal below to allow them +# (for now). +# Ditto for Obsoletes - see issue #140. +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', + 'Requires', 'Provides', 'Obsoletes') + +_566_MARKERS = ('Description-Content-Type',) + +_643_MARKERS = ('Dynamic', 'License-File') + +_643_FIELDS = _566_FIELDS + _643_MARKERS + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) +_ALL_FIELDS.update(_643_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + # avoid adding field names if already there + return _345_FIELDS + tuple(f for f in _566_FIELDS if f not in _345_FIELDS) + elif version == '2.0': + raise ValueError('Metadata 2.0 is withdrawn and not supported') + # return _426_FIELDS + elif version == '2.2': + return _643_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + return any(marker in keys for marker in markers) + + keys = [key for key, value in fields.items() if value not in ([], 'UNKNOWN', None)] + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.1', '2.2'] # 2.0 removed + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _643_FIELDS and '2.2' in possible_versions: + possible_versions.remove('2.2') + logger.debug('Removed 2.2 due to %s', key) + # if key not in _426_FIELDS and '2.0' in possible_versions: + # possible_versions.remove('2.0') + # logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + # is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + is_2_2 = '2.2' in possible_versions and _has_marker(keys, _643_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_2) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.1/2.2 fields') + + # we have the choice, 1.0, or 1.2, 2.1 or 2.2 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.1 adds more features + # - 2.2 is the latest + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_2: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + # if is_2_2: + # return '2.2' + + return '2.2' + +# This follows the rules about transforming keys as described in +# https://www.python.org/dev/peps/pep-0566/#id17 +_ATTR2FIELD = { + name.lower().replace("-", "_"): name for name in _ALL_FIELDS +} +_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension', 'License-File') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + + # PEP 566 specifies that the body be used for the description, if + # available + body = msg.get_payload() + self["Description"] = body if body else self["Description"] + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + This is as per https://www.python.org/dev/peps/pep-0566/#id17. + """ + self.set_metadata_version() + + fields = _version2fieldlist(self['Metadata-Version']) + + data = {} + + for field_name in fields: + if not skip_missing or field_name in self._fields: + key = _FIELD2ATTR[field_name] + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.1 + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + FIELDNAME_MATCHER = re.compile('^[A-Z]([0-9A-Z-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + 'dynamic': (FIELDNAME_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + ('extensions', 'python.details', 'license'): 'License', + 'summary': 'Summary', + 'description': 'Description', + ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page', + ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author', + ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email', + 'source_url': 'Download-URL', + ('extensions', 'python.details', 'classifiers'): 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + # import pdb; pdb.set_trace() + for nk, ok in self.LEGACY_MAPPING.items(): + if not isinstance(nk, tuple): + if nk in nmd: + result[ok] = nmd[nk] + else: + d = nmd + found = True + for k in nk: + try: + d = d[k] + except (KeyError, IndexError): + found = False + break + if found: + result[ok] = d + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: any other fields wanted + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..fef52aa --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,358 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + # See issue #146 + _finder_registry[_fi.SourcelessFileLoader] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..cfa45d2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,452 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys +import time +from zipfile import ZipInfo + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, get_platform, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' + + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +import re +import sys +from %(module)s import %(import_name)s +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +''' + + +def enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +# Keep the old name around (for now), as there is at least one project using it! +_enquote_executable = enquote_executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, + source_dir, + target_dir, + add_launchers=True, + dry_run=False, + fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' + and os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or (os.name == 'java' + and os._name == 'nt') + self.version_info = sys.version_info + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) + and (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join( + sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + if os.name == 'nt': + # for Python builds from source on Windows, no Python executables with + # a version suffix are created, so we use python.exe + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s' % (sysconfig.get_config_var('EXE'))) + else: + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + + # Normalise case for Windows - COMMENTED OUT + # executable = os.path.normcase(executable) + # N.B. The normalising operation above has been commented out: See + # issue #124. Although paths in Windows are generally case-insensitive, + # they aren't always. For example, a path containing a ẞ (which is a + # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a + # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by + # Windows as equivalent in path names. + + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError('The shebang (%r) is not decodable from utf-8' % + shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError('The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % + (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict( + module=entry.prefix, + import_name=entry.suffix.split('.')[0], + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH') + if source_date_epoch: + date_time = time.gmtime(int(source_date_epoch))[:6] + zinfo = ZipInfo(filename='__main__.py', + date_time=date_time) + zf.writestr(zinfo, script_bytes) + else: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith( + '.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + variant_separator = '-' + + def get_script_filenames(self, name): + result = set() + if '' in self.variants: + result.add(name) + if 'X' in self.variants: + result.add('%s%s' % (name, self.version_info[0])) + if 'X.Y' in self.variants: + result.add('%s%s%s.%s' % + (name, self.variant_separator, self.version_info[0], + self.version_info[1])) + return result + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + scriptnames = self.get_script_filenames(entry.name) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s is an empty file (skipping)', script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' + and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + platform_suffix = '-arm' if get_platform() == 'win-arm64' else '' + name = '%s%s%s.exe' % (kind, bits, platform_suffix) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + resource = finder(distlib_package).find(name) + if not resource: + msg = ('Unable to find resource %s in package %s' % + (name, distlib_package)) + raise ValueError(msg) + return resource.bytes + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py new file mode 100644 index 0000000..ba58858 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py @@ -0,0 +1,2025 @@ +# +# Copyright (C) 2012-2023 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % + remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % + ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + # Some packages have a trailing comma which would break things + # See issue #148 + if not ver_remaining: + break + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % + ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % + remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join( + ['%s %s' % con for con in versions])) + return Container(name=distname, + extras=extras, + constraints=versions, + marker=mark_expr, + url=uri, + requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): + # The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as + # changes to the stub launcher mean that sys.executable always points + # to the stub on OS X + # if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' + # in os.environ): + # result = os.environ['__PYVENV_LAUNCHER__'] + # else: + # result = sys.executable + # return result + # Avoid normcasing: see issue #143 + # result = os.path.normcase(sys.executable) + result = sys.executable + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + # entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + + def __init__(self, func): + self.func = func + # for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + # obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, + path, + optimize=False, + force=False, + prefix=None, + hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, + 'PycInvalidationMode'): + compile_kwargs[ + 'invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, + **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and self.prefix == other.prefix + and self.suffix == other.suffix + and self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile( + r'''(?P([^\[]\S*)) + \s*=\s*(?P(\w+)([:\.]\w+)*) + \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.rsplit('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + if username: + username = unquote(username) + if password: + password = unquote(password) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + + +PROJECT_NAME_AND_VERSION = re.compile( + '([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' + r'\(\s*(?P[^\s)]+)\)$') + + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result + + +# +# Extended metadata functionality +# + + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + # data = reader.read().decode('utf-8') + # result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', event, + args, kwargs, result) + return result + + +# +# Simple sequencing +# +class Sequencer(object): + + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs + or step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + # http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node], lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node], index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: + break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz', + '.whl') + + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + + # Limit extraction of dangerous items, if this Python + # allows it easily. If not, just trust the input. + # See: https://docs.python.org/3/library/tarfile.html#extraction-filters + def extraction_filter(member, path): + """Run tarfile.tar_filter, but raise the expected ValueError""" + # This is only called if the current Python has tarfile filters + try: + return tarfile.tar_filter(member, path) + except tarfile.FilterError as exc: + raise ValueError(str(exc)) + + archive.extraction_filter = extraction_filter + + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G', 'T', 'P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + # elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + # import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + # import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + # + # HTTPSConnection which verifies certificates/matches domains + # + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), + self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + if hasattr(ssl, 'OP_NO_SSLv2'): + context.options |= ssl.OP_NO_SSLv2 + if getattr(self, 'cert_file', None): + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError( + 'Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + + def http_open(self, req): + raise URLError( + 'Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + + +# +# XML-RPC with timeouts +# +class Transport(xmlrpclib.Transport): + + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + return self._connection[1] + + +if ssl: + + class SafeTransport(xmlrpclib.SafeTransport): + + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection( + h, None, **kwargs) + return self._connection[1] + + +class ServerProxy(xmlrpclib.ServerProxy): + + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + # scheme = splittype(uri) # deprecated as of Python 3.8 + scheme = urlparse(uri)[0] + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + + +class CSVWriter(CSVBase): + + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + + +# +# Configurator functionality +# + + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() + + +# def _get_pypirc_command(): +# """ +# Get the distutils command for interacting with PyPI configurations. +# :return: the command. +# """ +# from distutils.core import Distribution +# from distutils.config import PyPIRCCommand +# d = Distribution() +# return PyPIRCCommand(d) + + +class PyPIRCFile(object): + + DEFAULT_REPOSITORY = 'https://upload.pypi.org/legacy/' + DEFAULT_REALM = 'pypi' + + def __init__(self, fn=None, url=None): + if fn is None: + fn = os.path.join(os.path.expanduser('~'), '.pypirc') + self.filename = fn + self.url = url + + def read(self): + result = {} + + if os.path.exists(self.filename): + repository = self.url or self.DEFAULT_REPOSITORY + + config = configparser.RawConfigParser() + config.read(self.filename) + sections = config.sections() + if 'distutils' in sections: + # let's get the list of servers + index_servers = config.get('distutils', 'index-servers') + _servers = [ + server.strip() for server in index_servers.split('\n') + if server.strip() != '' + ] + if _servers == []: + # nothing set, let's try to get the default pypi + if 'pypi' in sections: + _servers = ['pypi'] + else: + for server in _servers: + result = {'server': server} + result['username'] = config.get(server, 'username') + + # optional params + for key, default in (('repository', + self.DEFAULT_REPOSITORY), + ('realm', self.DEFAULT_REALM), + ('password', None)): + if config.has_option(server, key): + result[key] = config.get(server, key) + else: + result[key] = default + + # work around people having "repository" for the "pypi" + # section of their config set to the HTTP (rather than + # HTTPS) URL + if (server == 'pypi' and repository + in (self.DEFAULT_REPOSITORY, 'pypi')): + result['repository'] = self.DEFAULT_REPOSITORY + elif (result['server'] != repository + and result['repository'] != repository): + result = {} + elif 'server-login' in sections: + # old format + server = 'server-login' + if config.has_option(server, 'repository'): + repository = config.get(server, 'repository') + else: + repository = self.DEFAULT_REPOSITORY + result = { + 'username': config.get(server, 'username'), + 'password': config.get(server, 'password'), + 'repository': repository, + 'server': server, + 'realm': self.DEFAULT_REALM + } + return result + + def update(self, username, password): + # import pdb; pdb.set_trace() + config = configparser.RawConfigParser() + fn = self.filename + config.read(fn) + if not config.has_section('pypi'): + config.add_section('pypi') + config.set('pypi', 'username', username) + config.set('pypi', 'password', password) + with open(fn, 'w') as f: + config.write(f) + + +def _load_pypirc(index): + """ + Read the PyPI access configuration as supported by distutils. + """ + return PyPIRCFile(url=index.url).read() + + +def _store_pypirc(index): + PyPIRCFile().update(index.username, index.password) + + +# +# get_platform()/get_host_platform() copied from Python 3.10.a0 source, with some minor +# tweaks +# + + +def get_host_platform(): + """Return a string that identifies the current platform. This is used mainly to + distinguish platform-specific build directories and platform-specific built + distributions. Typically includes the OS name and version and the + architecture (as supplied by 'os.uname()'), although the exact information + included depends on the OS; eg. on Linux, the kernel version isn't + particularly important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + + """ + if os.name == 'nt': + if 'amd64' in sys.version.lower(): + return 'win-amd64' + if '(arm)' in sys.version.lower(): + return 'win-arm32' + if '(arm64)' in sys.version.lower(): + return 'win-arm64' + return sys.platform + + # Set for cross builds explicitly + if "_PYTHON_HOST_PLATFORM" in os.environ: + return os.environ["_PYTHON_HOST_PLATFORM"] + + if os.name != 'posix' or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + + (osname, host, release, version, machine) = os.uname() + + # Convert the OS name to lowercase, remove '/' characters, and translate + # spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_').replace('/', '-') + + if osname[:5] == 'linux': + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + + elif osname[:5] == 'sunos': + if release[0] >= '5': # SunOS 5 == Solaris 2 + osname = 'solaris' + release = '%d.%s' % (int(release[0]) - 3, release[2:]) + # We can't use 'platform.architecture()[0]' because a + # bootstrap problem. We use a dict to get an error + # if some suspicious happens. + bitness = {2147483647: '32bit', 9223372036854775807: '64bit'} + machine += '.%s' % bitness[sys.maxsize] + # fall through to standard osname-release-machine representation + elif osname[:3] == 'aix': + from _aix_support import aix_platform + return aix_platform() + elif osname[:6] == 'cygwin': + osname = 'cygwin' + rel_re = re.compile(r'[\d.]+', re.ASCII) + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == 'darwin': + import _osx_support + try: + from distutils import sysconfig + except ImportError: + import sysconfig + osname, release, machine = _osx_support.get_platform_osx( + sysconfig.get_config_vars(), osname, release, machine) + + return '%s-%s-%s' % (osname, release, machine) + + +_TARGET_TO_PLAT = { + 'x86': 'win32', + 'x64': 'win-amd64', + 'arm': 'win-arm32', +} + + +def get_platform(): + if os.name != 'nt': + return get_host_platform() + cross_compilation_target = os.environ.get('VSCMD_ARG_TGT_ARCH') + if cross_compilation_target not in _TARGET_TO_PLAT: + return get_host_platform() + return _TARGET_TO_PLAT[cross_compilation_target] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..14171ac --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,751 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|alpha|b|beta|c|rc|pre|preview)(\d+)?)?' + r'(\.(post|r|rev)(\d+)?)?([._-]?(dev)(\d+)?)?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$', re.I) + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0][:-1]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + if pre[1] is None: + pre = pre[0], 0 + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + if post[1] is None: + post = post[0], 0 + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + if dev[1] is None: + dev = dev[0], 0 + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + # import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + # import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + # TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + # See issue #140. Be tolerant of a single trailing comma. + if s.endswith(','): + s = s[:-1] + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..4a5a30e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py @@ -0,0 +1,1099 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +from email import message_from_file +import hashlib +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir, + get_platform) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp').split('-')[0] +else: + + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if IMP_PREFIX == 'cp': + vi = sys.version_info[:2] + if vi < (3, 8): + wpm = sysconfig.get_config_var('WITH_PYMALLOC') + if wpm is None: + wpm = True + if wpm: + parts.append('m') + if vi < (3, 3): + us = sysconfig.get_config_var('Py_UNICODE_SIZE') + if us == 4 or (us is None and sys.maxunicode == 0x10FFFF): + parts.append('u') + return ''.join(parts) + + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile( + r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile( + r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + +if sys.version_info[0] < 3: + import imp +else: + imp = None + import importlib.machinery + import importlib.util + + +def _get_suffixes(): + if imp: + return [s[0] for s in imp.get_suffixes()] + else: + return importlib.machinery.EXTENSION_SUFFIXES + + +def _load_dynamic(name, path): + # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly + if imp: + return imp.load_dynamic(name, path) + else: + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +class Mounter(object): + + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = _load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, pyver, + abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + self.get_wheel_metadata(zf) + # wv = wheel_metadata['Wheel-Version'].split('.', 1) + # file_version = tuple([int(i) for i in wv]) + # if file_version < (1, 1): + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, + # LEGACY_METADATA_FILENAME] + # else: + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % + hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, archive_record_path): + records = list(records) # make a copy, as mutated + records.append((archive_record_path, '', '')) + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + # hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + ap = to_posix(os.path.join(info_dir, 'RECORD')) + self.write_record(records, p, ap) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # sort the entries by archive path. Not needed by any spec, but it + # keeps the archive listing and RECORD tidier than they would otherwise + # be. Use the number of path segments to keep directory entries together, + # and keep the dist-info stuff at the end. + def sorter(t): + ap = t[0] + n = ap.count('/') + if '.dist-info' in ap: + n += 10000 + return (n, ap) + + archive_paths = sorted(archive_paths, key=sorter) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def skip_entry(self, arcname): + """ + Determine whether an archive entry should be skipped when verifying + or installing. + """ + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + # We also skip directories, as they won't be in RECORD + # either. See: + # + # https://github.com/pypa/wheel/issues/294 + # https://github.com/pypa/wheel/issues/287 + # https://github.com/pypa/wheel/pull/289 + # + return arcname.endswith(('/', '/RECORD.jws')) + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', + False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + # Issue #147: permission bits aren't preserved. Using + # zf.extract(zinfo, libdir) should have worked, but didn't, + # see https://www.thetopsites.net/article/53834422.shtml + # So ... manually preserve permission bits as given in zinfo + if os.name == 'posix': + # just set the normal permission bits + os.chmod(outfile, + (zinfo.external_attr >> 16) & 0x1FF) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile( + outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' [%s]' % ','.join(v.flags) + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True} + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + '%s.%s' % sys.version_info[:2]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp( + file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + # data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + # metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message_from_file(wf) + # wv = message['Wheel-Version'].split('.', 1) + # file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # See issue #115: some wheels have .. in their entries, but + # in the filename ... e.g. __main__..py ! So the check is + # updated to look for .. in the directory portions + p = u_arcname.split('/') + if '..' in p: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], '.'.join( + str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug( + 'Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = path.endswith(LEGACY_METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % + dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + + +def _get_glibc_version(): + import platform + ver = platform.libc_ver() + result = [] + if ver[0] == 'glibc': + for s in ver[1].split('.'): + result.append(int(s) if s.isdigit() else 0) + result = tuple(result) + return result + + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, -1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix in _get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + # manylinux + if abi != 'none' and sys.platform.startswith('linux'): + arch = arch.replace('linux_', '') + parts = _get_glibc_version() + if len(parts) == 2: + if parts >= (2, 5): + result.append((''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux1_%s' % arch)) + if parts >= (2, 12): + result.append((''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux2010_%s' % arch)) + if parts >= (2, 17): + result.append((''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux2014_%s' % arch)) + result.append( + (''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux_%s_%s_%s' % (parts[0], parts[1], arch))) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py new file mode 100644 index 0000000..7686fe8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py @@ -0,0 +1,54 @@ +from .distro import ( + NORMALIZED_DISTRO_ID, + NORMALIZED_LSB_ID, + NORMALIZED_OS_ID, + LinuxDistribution, + __version__, + build_number, + codename, + distro_release_attr, + distro_release_info, + id, + info, + like, + linux_distribution, + lsb_release_attr, + lsb_release_info, + major_version, + minor_version, + name, + os_release_attr, + os_release_info, + uname_attr, + uname_info, + version, + version_parts, +) + +__all__ = [ + "NORMALIZED_DISTRO_ID", + "NORMALIZED_LSB_ID", + "NORMALIZED_OS_ID", + "LinuxDistribution", + "build_number", + "codename", + "distro_release_attr", + "distro_release_info", + "id", + "info", + "like", + "linux_distribution", + "lsb_release_attr", + "lsb_release_info", + "major_version", + "minor_version", + "name", + "os_release_attr", + "os_release_info", + "uname_attr", + "uname_info", + "version", + "version_parts", +] + +__version__ = __version__ diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py new file mode 100644 index 0000000..0c01d5b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py @@ -0,0 +1,4 @@ +from .distro import main + +if __name__ == "__main__": + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46a9465127a59ccc0efaecd541a8fa79b54a9b21 GIT binary patch literal 979 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py new file mode 100644 index 0000000..89e1868 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py @@ -0,0 +1,1399 @@ +#!/usr/bin/env python +# Copyright 2015,2016,2017 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is the recommended replacement for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.8 removed it altogether. Its +predecessor function :py:func:`platform.dist` was already deprecated since +Python 2.6 and removed in Python 3.8. Still, there are many cases in which +access to OS distribution information is needed. See `Python issue 1322 +`_ for more information. +""" + +import argparse +import json +import logging +import os +import re +import shlex +import subprocess +import sys +import warnings +from typing import ( + Any, + Callable, + Dict, + Iterable, + Optional, + Sequence, + TextIO, + Tuple, + Type, +) + +try: + from typing import TypedDict +except ImportError: + # Python 3.7 + TypedDict = dict + +__version__ = "1.8.0" + + +class VersionDict(TypedDict): + major: str + minor: str + build_number: str + + +class InfoDict(TypedDict): + id: str + version: str + version_parts: VersionDict + like: str + codename: str + + +_UNIXCONFDIR = os.environ.get("UNIXCONFDIR", "/etc") +_UNIXUSRLIBDIR = os.environ.get("UNIXUSRLIBDIR", "/usr/lib") +_OS_RELEASE_BASENAME = "os-release" + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + "ol": "oracle", # Oracle Linux + "opensuse-leap": "opensuse", # Newer versions of OpenSuSE report as opensuse-leap +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + "enterpriseenterpriseas": "oracle", # Oracle Enterprise Linux 4 + "enterpriseenterpriseserver": "oracle", # Oracle Linux 5 + "redhatenterpriseworkstation": "rhel", # RHEL 6, 7 Workstation + "redhatenterpriseserver": "rhel", # RHEL 6, 7 Server + "redhatenterprisecomputenode": "rhel", # RHEL 6 ComputeNode +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + "redhat": "rhel", # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r"(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)" +) + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile(r"(\w+)[-_](release|version)$") + +# Base file names to be looked up for if _UNIXCONFDIR is not readable. +_DISTRO_RELEASE_BASENAMES = [ + "SuSE-release", + "arch-release", + "base-release", + "centos-release", + "fedora-release", + "gentoo-release", + "mageia-release", + "mandrake-release", + "mandriva-release", + "mandrivalinux-release", + "manjaro-release", + "oracle-release", + "redhat-release", + "rocky-release", + "sl-release", + "slackware-version", +] + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + "debian_version", + "lsb-release", + "oem-release", + _OS_RELEASE_BASENAME, + "system-release", + "plesk-release", + "iredmail-release", +) + + +def linux_distribution(full_distribution_name: bool = True) -> Tuple[str, str, str]: + """ + .. deprecated:: 1.6.0 + + :func:`distro.linux_distribution()` is deprecated. It should only be + used as a compatibility shim with Python's + :py:func:`platform.linux_distribution()`. Please use :func:`distro.id`, + :func:`distro.version` and :func:`distro.name` instead. + + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The extra item (usually in parentheses) after the + os-release version number, or the result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + warnings.warn( + "distro.linux_distribution() is deprecated. It should only be used as a " + "compatibility shim with Python's platform.linux_distribution(). Please use " + "distro.id(), distro.version() and distro.name() instead.", + DeprecationWarning, + stacklevel=2, + ) + return _distro.linux_distribution(full_distribution_name) + + +def id() -> str: + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amzn" Amazon Linux + "arch" Arch Linux + "buildroot" Buildroot + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + "midnightbsd" MidnightBSD + "rocky" Rocky Linux + "aix" AIX + "guix" Guix System + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty: bool = False) -> str: + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty: bool = False, best: bool = False) -> str: + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + Some other distributions may not provide this kind of information. In these + cases, an empty string would be returned. This behavior can be observed + with rolling releases distributions (e.g. Arch Linux). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best: bool = False) -> Tuple[str, str, str]: + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best: bool = False) -> str: + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best: bool = False) -> str: + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best: bool = False) -> str: + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like() -> str: + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename() -> str: + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty: bool = False, best: bool = False) -> InfoDict: + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute: str) -> str: + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute: str) -> str: + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +try: + from functools import cached_property +except ImportError: + # Python < 3.8 + class cached_property: # type: ignore + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + + def __init__(self, f: Callable[[Any], Any]) -> None: + self._fname = f.__name__ + self._f = f + + def __get__(self, obj: Any, owner: Type[Any]) -> Any: + assert obj is not None, f"call {self._fname} on an instance" + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution: + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__( + self, + include_lsb: Optional[bool] = None, + os_release_file: str = "", + distro_release_file: str = "", + include_uname: Optional[bool] = None, + root_dir: Optional[str] = None, + include_oslevel: Optional[bool] = None, + ) -> None: + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_uname`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + * ``root_dir`` (string): The absolute path to the root directory to use + to find distro-related information files. Note that ``include_*`` + parameters must not be enabled in combination with ``root_dir``. + + * ``include_oslevel`` (bool): Controls whether (AIX) oslevel command + output is included as a data source. If the oslevel command is not + available in the program execution path the data source will be + empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + * ``include_oslevel`` (bool): The result of the ``include_oslevel`` + parameter. This controls whether (AIX) oslevel information will be + loaded. + + * ``root_dir`` (string): The result of the ``root_dir`` parameter. + The absolute path to the root directory to use to find distro-related + information files. + + Raises: + + * :py:exc:`ValueError`: Initialization parameters combination is not + supported. + + * :py:exc:`OSError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.root_dir = root_dir + self.etc_dir = os.path.join(root_dir, "etc") if root_dir else _UNIXCONFDIR + self.usr_lib_dir = ( + os.path.join(root_dir, "usr/lib") if root_dir else _UNIXUSRLIBDIR + ) + + if os_release_file: + self.os_release_file = os_release_file + else: + etc_dir_os_release_file = os.path.join(self.etc_dir, _OS_RELEASE_BASENAME) + usr_lib_os_release_file = os.path.join( + self.usr_lib_dir, _OS_RELEASE_BASENAME + ) + + # NOTE: The idea is to respect order **and** have it set + # at all times for API backwards compatibility. + if os.path.isfile(etc_dir_os_release_file) or not os.path.isfile( + usr_lib_os_release_file + ): + self.os_release_file = etc_dir_os_release_file + else: + self.os_release_file = usr_lib_os_release_file + + self.distro_release_file = distro_release_file or "" # updated later + + is_root_dir_defined = root_dir is not None + if is_root_dir_defined and (include_lsb or include_uname or include_oslevel): + raise ValueError( + "Including subprocess data sources from specific root_dir is disallowed" + " to prevent false information" + ) + self.include_lsb = ( + include_lsb if include_lsb is not None else not is_root_dir_defined + ) + self.include_uname = ( + include_uname if include_uname is not None else not is_root_dir_defined + ) + self.include_oslevel = ( + include_oslevel if include_oslevel is not None else not is_root_dir_defined + ) + + def __repr__(self) -> str: + """Return repr of all info""" + return ( + "LinuxDistribution(" + "os_release_file={self.os_release_file!r}, " + "distro_release_file={self.distro_release_file!r}, " + "include_lsb={self.include_lsb!r}, " + "include_uname={self.include_uname!r}, " + "include_oslevel={self.include_oslevel!r}, " + "root_dir={self.root_dir!r}, " + "_os_release_info={self._os_release_info!r}, " + "_lsb_release_info={self._lsb_release_info!r}, " + "_distro_release_info={self._distro_release_info!r}, " + "_uname_info={self._uname_info!r}, " + "_oslevel_info={self._oslevel_info!r})".format(self=self) + ) + + def linux_distribution( + self, full_distribution_name: bool = True + ) -> Tuple[str, str, str]: + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self._os_release_info.get("release_codename") or self.codename(), + ) + + def id(self) -> str: + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + + def normalize(distro_id: str, table: Dict[str, str]) -> str: + distro_id = distro_id.lower().replace(" ", "_") + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr("distributor_id") + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return "" + + def name(self, pretty: bool = False) -> str: + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = ( + self.os_release_attr("name") + or self.lsb_release_attr("distributor_id") + or self.distro_release_attr("name") + or self.uname_attr("name") + ) + if pretty: + name = self.os_release_attr("pretty_name") or self.lsb_release_attr( + "description" + ) + if not name: + name = self.distro_release_attr("name") or self.uname_attr("name") + version = self.version(pretty=True) + if version: + name = f"{name} {version}" + return name or "" + + def version(self, pretty: bool = False, best: bool = False) -> str: + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr("version_id"), + self.lsb_release_attr("release"), + self.distro_release_attr("version_id"), + self._parse_distro_release_content(self.os_release_attr("pretty_name")).get( + "version_id", "" + ), + self._parse_distro_release_content( + self.lsb_release_attr("description") + ).get("version_id", ""), + self.uname_attr("release"), + ] + if self.uname_attr("id").startswith("aix"): + # On AIX platforms, prefer oslevel command output. + versions.insert(0, self.oslevel_info()) + elif self.id() == "debian" or "debian" in self.like().split(): + # On Debian-like, add debian_version file content to candidates list. + versions.append(self._debian_version) + version = "" + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == "": + version = v + else: + for v in versions: + if v != "": + version = v + break + if pretty and version and self.codename(): + version = f"{version} ({self.codename()})" + return version + + def version_parts(self, best: bool = False) -> Tuple[str, str, str]: + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r"(\d+)\.?(\d+)?\.?(\d+)?") + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or "", build_number or "" + return "", "", "" + + def major_version(self, best: bool = False) -> str: + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best: bool = False) -> str: + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best: bool = False) -> str: + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self) -> str: + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr("id_like") or "" + + def codename(self) -> str: + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info["codename"] + except KeyError: + return ( + self.lsb_release_attr("codename") + or self.distro_release_attr("codename") + or "" + ) + + def info(self, pretty: bool = False, best: bool = False) -> InfoDict: + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best), + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def oslevel_info(self) -> str: + """ + Return AIX' oslevel command output. + """ + return self._oslevel_info + + def os_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, "") + + def lsb_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, "") + + def distro_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, "") + + def uname_attr(self, attribute: str) -> str: + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_attr`. + """ + return self._uname_info.get(attribute, "") + + @cached_property + def _os_release_info(self) -> Dict[str, str]: + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file, encoding="utf-8") as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines: TextIO) -> Dict[str, str]: + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + # Ignore any tokens that are not variable assignments + if "=" in token: + k, v = token.split("=", 1) + props[k.lower()] = v + + if "version" in props: + # extract release codename (if any) from version attribute + match = re.search(r"\((\D+)\)|,\s*(\D+)", props["version"]) + if match: + release_codename = match.group(1) or match.group(2) + props["codename"] = props["release_codename"] = release_codename + + if "version_codename" in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props["codename"] = props["version_codename"] + elif "ubuntu_codename" in props: + # Same as above but a non-standard field name used on older Ubuntus + props["codename"] = props["ubuntu_codename"] + + return props + + @cached_property + def _lsb_release_info(self) -> Dict[str, str]: + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + try: + cmd = ("lsb_release", "-a") + stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + # Command not found or lsb_release returned error + except (OSError, subprocess.CalledProcessError): + return {} + content = self._to_str(stdout).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines: Iterable[str]) -> Dict[str, str]: + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip("\n").split(":", 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(" ", "_").lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self) -> Dict[str, str]: + if not self.include_uname: + return {} + try: + cmd = ("uname", "-rs") + stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + except OSError: + return {} + content = self._to_str(stdout).splitlines() + return self._parse_uname_content(content) + + @cached_property + def _oslevel_info(self) -> str: + if not self.include_oslevel: + return "" + try: + stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL) + except (OSError, subprocess.CalledProcessError): + return "" + return self._to_str(stdout).strip() + + @cached_property + def _debian_version(self) -> str: + try: + with open( + os.path.join(self.etc_dir, "debian_version"), encoding="ascii" + ) as fp: + return fp.readline().rstrip() + except FileNotFoundError: + return "" + + @staticmethod + def _parse_uname_content(lines: Sequence[str]) -> Dict[str, str]: + if not lines: + return {} + props = {} + match = re.search(r"^([^\s]+)\s+([\d\.]+)", lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == "Linux": + return {} + props["id"] = name.lower() + props["name"] = name + props["release"] = version + return props + + @staticmethod + def _to_str(bytestring: bytes) -> str: + encoding = sys.getfilesystemencoding() + return bytestring.decode(encoding) + + @cached_property + def _distro_release_info(self) -> Dict[str, str]: + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file(self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + else: + try: + basenames = [ + basename + for basename in os.listdir(self.etc_dir) + if basename not in _DISTRO_RELEASE_IGNORE_BASENAMES + and os.path.isfile(os.path.join(self.etc_dir, basename)) + ] + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = _DISTRO_RELEASE_BASENAMES + for basename in basenames: + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match is None: + continue + filepath = os.path.join(self.etc_dir, basename) + distro_info = self._parse_distro_release_file(filepath) + # The name is always present if the pattern matches. + if "name" not in distro_info: + continue + self.distro_release_file = filepath + break + else: # the loop didn't "break": no candidate. + return {} + + if match is not None: + distro_info["id"] = match.group(1) + + # CloudLinux < 7: manually enrich info with proper id. + if "cloudlinux" in distro_info.get("name", "").lower(): + distro_info["id"] = "cloudlinux" + + return distro_info + + def _parse_distro_release_file(self, filepath: str) -> Dict[str, str]: + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath, encoding="utf-8") as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except OSError: + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/python-distro/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line: str) -> Dict[str, str]: + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match(line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info["name"] = matches.group(3)[::-1] + if matches.group(2): + distro_info["version_id"] = matches.group(2)[::-1] + if matches.group(1): + distro_info["codename"] = matches.group(1)[::-1] + elif line: + distro_info["name"] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main() -> None: + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + "--json", "-j", help="Output in machine readable format", action="store_true" + ) + + parser.add_argument( + "--root-dir", + "-r", + type=str, + dest="root_dir", + help="Path to the root filesystem directory (defaults to /)", + ) + + args = parser.parse_args() + + if args.root_dir: + dist = LinuxDistribution( + include_lsb=False, + include_uname=False, + include_oslevel=False, + root_dir=args.root_dir, + ) + else: + dist = _distro + + if args.json: + logger.info(json.dumps(dist.info(), indent=4, sort_keys=True)) + else: + logger.info("Name: %s", dist.name(pretty=True)) + distribution_version = dist.version(pretty=True) + logger.info("Version: %s", distribution_version) + distribution_codename = dist.codename() + logger.info("Codename: %s", distribution_codename) + + +if __name__ == "__main__": + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000..a40eeaf --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py @@ -0,0 +1,44 @@ +from .package_data import __version__ +from .core import ( + IDNABidiError, + IDNAError, + InvalidCodepoint, + InvalidCodepointContext, + alabel, + check_bidi, + check_hyphen_ok, + check_initial_combiner, + check_label, + check_nfc, + decode, + encode, + ulabel, + uts46_remap, + valid_contextj, + valid_contexto, + valid_label_length, + valid_string_length, +) +from .intranges import intranges_contain + +__all__ = [ + "IDNABidiError", + "IDNAError", + "InvalidCodepoint", + "InvalidCodepointContext", + "alabel", + "check_bidi", + "check_hyphen_ok", + "check_initial_combiner", + "check_label", + "check_nfc", + "decode", + "encode", + "intranges_contain", + "ulabel", + "uts46_remap", + "valid_contextj", + "valid_contexto", + "valid_label_length", + "valid_string_length", +] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b771697cd970522699b1af6348af31bd16a90f4 GIT binary patch literal 900 zcmbu7J8u**5XbF%>^=70cezj?M1#Z?i4{Pp5K_p2lqM1d6mBfvuGw?WkCoSV;z~XR zJsqEgZ(xaviVhK>NU5-I14WQ%aPixjS$qC7_I&Pk+rY2m)tl^96@ah7`MoMP#-;Vf z2atjk3LqhdFxVAQkyTukHC&T*T$d4!WCJ&36E|fGw`3c)WsGCl!5!JfUD?Au*~fi3 zzymqNLpj1DImTl-!INFSs@RiLJcS?wY3(D#``h{~`Ubu947!+*4KoGTijdjJbb^Es?r&?L|&bo*Sx?sY!lO;=5WZ~1ferYea z`I0H3S8iGcxZ;*mK@u$&TruO~GG1nAm5zFwxF}_bmv#|T<#%0fiPyGxa!d@9G*O?9(TtIlT59~@09Q-2VgDul zPgU3Y)9J28*C2!nLC7a?>E*$-LQ+|jpx1>T6!el=rtZ&;e^fMQ#med&330I$aC) q%-r+xVNQz!kMC6o;TQ1WsxpR^EATgdJ_K;~qc({v?;GZ>Kk*A}68Dw> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b9d3b534bf77cc550455a439d230754816054d0 GIT binary patch literal 4652 zcmeHKO>7(25q|s2r9_z`B{~)*OOz5zW?PAf6{m)rq)j3_v7yLqU8gRKl%=>!g%r7D z-!2_cr2-?+K}Ld_Zi9+Ia&UUG;2wHRffi7226`c@wxTx%;v&BI6s6+Hmv-hYm(-7I zI6#Z^&_hl*{r_ zJ}X3ptQZxuQdHuI%Bw;~j>@cdMO{#f871qEy0ab84vz3dbEOYDhTF9&-2~fMq8^^S zLR5K~s4h)T2W{z2dQ-4l(JrQ`fTkNX2X^Y%d`r{IG&?}E6Es7Q(DX4)4`_C2U7-8a zLv%%37WFgT1EA|=x}%TK?NPhI+R^b8j9)u-J*7QV9)ht=n>^h!_ z&uJM;F4(pE%=GMwrzp+Q`)F`B%v;j;3;B#@Dd+NLDyPRY1rK!mXyUWW?|lCIpMU;` zkKRb2rc>NaW_t#hRicq7r;;eIx>QaRR383E{jvY!<9ILD+(ssWTnJ8eWq)_EXkiIVR6=y4U?u4=7XUNx>3mIbJWz- z5Sw!7&A6^+Qu=&oq-fESlR27=n-nK#2^mda6D-ltGD!;lL+Ak@ z2KI$Qp$7|*tZqgUkqd@KjmT-u)b!9aO{uBKv}P=rxqKu~b7{?dQ8!X^87-16YWk%} zCN&qy7tJ?w`sBpZ$0A0`)W-Ai#6o;tGa~s^J`%g6>1vKfQmP)0;7v(PE1ZZtf0NDW(J3vB3m}momqDlZ}E&u|T z~;d%#$TqbuEE(n!NEeAxlb0PCMY* z9)g&iPNSqaxa8CvDY>Xra;eH900-D|nFt`Pw6*QN_a;RMjcMGpJ*6Z&_Da$s^ewq} z*=dE><`~e67`W!1Z95UgSWEkX-2W$(2iye1JIaG3tT51Her0vX3VI6RCZ^_0BStk# zGV+;}Y02??9uSEl3Ny#E#B?sDuXWHTP}0IhdIXx5%z~L=c}yBlA=IKdj1)#8V*-?> z7QwI`@H%W^41C4FO9`0TEX*;i1F^Y6GO5v+jdzQ~`>)=_Zk5Ae#rPYL$AiQ}_k6>f zzOkBb?1s4E8()#@PxP&LZg=_sEh{6xn5qwrls)y{VCC4gv$q4myU3N#-tOtEKRH^S zx$EnJFTC9=Vm;9R4wyo(|Kd4%8<4lVx58a>m&LlL`~8UsCf!GBxu0+29Ra4#ScoM z>i{)S{T84Gs*k5xwSM8&Wc54eZ=Luf;0cIrL-_fB2~Vb3VzdKK*p>P}nvky&P3RaL z_)estUjqUCIug7=6tUe7$m7UiRC%;J+mU&fJ2y|h<<7Rs3ux-`-8uM`yR+vp+_^hg znXY<=tIF`B+?hU$dx=5E_GZlU_ImRPlp%Q@{w;4lERCQyLxtW96?!vNySy3Nwm0MF zyS&-S(zh{hXlDmS4xS^P^Cs2e*&k5IS?TPWuos8+pv`k&fg<@a{I@ZDER(vZ*aM^d z%MScKEv~}A6xX|VGro;7By-5%&9TQpk&Ph0vB57EMuZcj0t{EL{l#jKe4uCTdohx-kGvzgbxt45f$M0^iG0w!XL$({o& zm9+e+c0y(cO1evCyAriL5N6@<-eQO6v_Jwo3Q4WZ9vX(_W-p90Iy{4LcI|Ok*kHGf z9Vy%DJ!fEb&TBBnJmiM7NYBFON%$LhlP{BdoxaV^{#s{$y{qSrxA)z*uD*Tc?Kaat zeg}SmVfZz?ibvieiX^iW3?H<_M2_xQvYm-A*ufp5uL7}nNLXaEn1_tRb{pJg%azDw z^QnwxV-~K+3ckdW3QgUgO|UgSRH2Dad)I#khsTBP*@*|rbN0jF1^Qj+MV~T$1!PO$ zIPOz&@~`CNC#35W;{KG3-0eABKDIh_ZK^srwb663O1c}OpBq~_eRbx_OoIU1I6B0I zDhD_FrfPjt4FZkEOWYtg(iTAjL>%WXAFqsV2FGi`@dklrL)kCeQaU)f{Q73#NG))r JL7>65`CpUg*C7A^ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63bb86c90e9ea634f5ad133f0df714f2f25598ee GIT binary patch literal 906 zcmb7Cy=xRf6rZ{MxG&=e7coJi+gPl|OiTz`sBjpC1G7yMi!`#g^AgwW&MdQ&z>0;4 zolUx=v<)Kof7qPZEddLwbO&dZ$~T)_u+)L~-tWzCcHVox*>4jQErRR*_KU49CFGY$ z#>+kfqdtOt!U?Ad`BI~&h*qe^t)!M(8&+y>*vQ!6a0lE?o4X(EjXLHwxX{?FP2(NN zILOqIY4QeG+~G~kTbQ?srr$os4v0@ndi&Uv_G_ip6-DW+i&%=%Ny0uPrK>>iC=r>n z<7FW*Hkv}WPxLwWmV7?LtK^Udc()58k{k}Hs^i(*u--|+QlVMI)^kufdj=YWx2$3w zvt`J)wai$i|bCtxBg~Xvizo%cjAhQemNt z6jh1CQz0s?P8ttW$#)WXtZpK2ev^C+-O!?x9+A!wnfys+hBl?sdy7MY;b3WG!q7Ea h>jz7p{K54*->=SA;?3|{$0gthCc-;(YpWu literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..388783e480e202a9f94e7107c3c5e9f9f2a8b1a0 GIT binary patch literal 16301 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 C*e@~w literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ac6fece0828c9ee403db9f22f483c395d2518b7 GIT binary patch literal 38401 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..282499d5b41edb68d68cb06c150b660ba7878a3f GIT binary patch literal 2657 zcmZuyO>7%Q6rTNaQajF{)g=9)nKT8mG_{+!{0OBWXp~Cy2lZDFK--OX>}<2%b!XPJ z4h{swA%RLnqEg+Pdq8s4OSp05h{PpnDq*cEIKZVhLpX6MZ)WYJsXEf`yf^P>-n{wV zn_uJcD1!0&+~wSdZ3z9znbwFjiOrip+(s6fMwVpBjx;U7tT=LBnO5@Zv??J>B?{5@ zfS#ohm1tHZD|0TZT5Vse(-Es3)^@?C5iJ|BqOjIx#RL!9u-4M<07<(Q2TAACe!y-Q z*mZ$4T9Wl{bC-lr^rZbMaj}UVoB7zwV%zmej!-s=^QJ{`vA`EcX1xN*79FRggDT6L zj)UD|euhvkbv!qRY0+g-U^1S|NT%q6+oybGynLbP6ELQvKnWwRZ~C_9a&v!{;H*dU z(UB46o75j0#l*G7^idr0onV85PdXi||5MZpO2S#gD*jH|K0) zy$M=8F@e+LxXgV)h_2^zU7v%BC55-gPhdReK%qRhdL)Q2kNU(4G?9luaflm4%t8TN z1aSkB1X~)ROcS2;2<2c3VxghIGYnW2VFpph1n6F;wod}d4&s?2rBHUE1IGIjPcz2< zd8xeXr!uKa49Y$=MSQ5QNoremYLc)y-z%gF)VoUjcU)%AI3$%X5%<%SW6z`tB}k>4 zPL7SI7;JN-U}ok_xWQDxE~E_TE0#x7w&j{BxQ8&TWT6x!wm2h8y}SsU_CY`#N$dys zEuw$BQDRSJ_xDE@Pu1gHi&OQU#NvC8;=Q-hE1zv7hBxAe{y`C~e@UvxI+o5Yr*9=z zKHBIRdJr3`ckQi=Eq`9!S36g`cJIRa(AetG`cV2oSGwLkP#+kszE`_;_w;Jd>e!Eo zwSiZc;`R2<@8ZkxTlwl4&^&Z(HUIOw>#v>sWoZ4iQyYD!AGV*V@9tZUHsY`!gw@fr z()aE0HFaPU0!4u)uoEb7*i5rV_&VaW=nlO=+(u<+`}4q;rFp16s1NzJ}ekm!!S#CH`t^OQDshU$h0 zFMCVe>61B~{nvk5581(Y)x)aF9iXSTQ4Etvdk_&l!U&Xt#{!ir zLT9mavwk2MjAx2hKMaAkpl7=%;R*Lm+od|_ybK@v5`K&5ulU}|v1-poe0Xu{QMCKF z=>GNS{>tU*<&Eg*;)zBCwa1pueRcg&-*9!RmWJAU_3oLCzVYSQlDb6dv96V44`YLs z7azn1>xuq`f;zCUxp@KV>7xg21CM$KtC1?Z8{6m|U2X#-Qy6_S0qXTww}6!%3)&3B z@-l`&4?gRGlDgT6q|QIkfrgrp_Eh}pi94kR07qdTF^B^Lj8MjB4j^MXLkdF_LnWgoQx&tZo{66(<1Oy^__EZZ z;>`TK`1q9!pFygB73t^ZmFOqyhZX~6^xaZRQu7pCiZW9&^<7envrF;|^b3mevr1U?oCF(oye{tC4=BJeAq}mm+0i6JHbuq|OAD9^#8E^0jH*y!T0J#7! C1wuLi literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63e352013ed504191965cc0cf1967272fc01aeed GIT binary patch literal 158889 zcmbT92Xs}%*2j|@#D*yLE_Oia9YjzO1r$*M5s@0orN%?Y77{{2?=7^@d+!i}l_mmq zjg6M3KA%s;XMKMAKXYd8-rH}nR&YJ?W`6&fGks4v<-T*tB^Slff3G95832~?3 zasOQqI(~ZWs<^nBafxw>@qOa@#_8)+Bmo6s&HKJLP}#7Mgmi3#1}yCrmsbUUwG z$?lQsD4KPXF9ANwtShm^$P(?&FIJ56D8>cFicykcTv)6a=TnS}iWTDmig9tVVq8cu zN);={MHJ(bV#TixuN)ig8`BVq8Npt}j-MYbnMJ#fotq z#kjFpF|MZ=Hx(ISTSy)7`GKGMp=q+d$D5N zN-^#zR*c&y#+}8AaXZDht5`Aapcr=-E5@A^qg=6K+(j|U7c0iy6r)11Vw9s8_Y^Be zd5Upwv0_x97!`{Z;~t7psaP@Yr5Kfq6{8}>s8XyLl_*BlV#TOTF{%|SMiq)ty;w1- zQj8kKicyVX)GStv>J+0^v0~Jq7`2NPqb9|uQ>+-ZC`R34#i&g&>J=+S9g0!ESTX8S zjQffeqaMX*P^=jBDaQT9ig6#sXjrTm4JbyVV#Tm$%D1TYyzg78fQ~ukP{|@E9Q~B>w{=1dGobs1f{tC)}kMiHE{1uhIlJZwp{wm5} zRr#wae|6=rq5L(Kzn1dXR{lE5Usw6-DSv(CzfbuaDF6M+-%$A*DgOh?|Df_er2LJQ z|6%2CqWq62|D(#^RQa1Je{2^mE4j+ zw}FF#eqC)m`!_=Wmq7o1!l~`dxE^#QyD0wYxbl$}{XWtjVN=DvctuVijI zq4s&Wnz^rG?rWJFhtV$2*E9DG%zYzs-^AQEGxsgbU6#3TW$xRU`*!BOgSqcy?z@=# zZssn>+~t|O0(0NP-1jnfMRMoHx1rup3A7gdA$MgKq6*_xnY$WuS7+`T%w3bYacOt` z+RR;tx$81_J-EZ3TA#V^W9|mbeLr(IWbQ`Zolx`uxpU(m&yDX~KB4GA2+a-YLf(gB z-mc_r9P=iU_u-hg8+n_=yxqzBNX*-VypP7bJ;~cN=8clKSMU)jb%G%;Gaakl}z2lh{@oD}r$ z)otJd{RTw4^yyZ)@33zD23PJA?NT{u*ub9s`&F-0wOZu?(ShA6CUx%GyK|3j11cv) zlPY%{+^t_?|DbX-v0vxPg9Z+$Q7f_Yz|NJDhUJ#*IG|gPj#YxOl={WU2CQ3h+>eoN z@uf=s5Z5jKypq9aLddTF4;DFr{{8=EyeN?*SLANY-JQ96Fn3Spjxu*I=I+hheVDs1 zbN6HJ{>+`k+%GV9z}y3vdmwWUV(!7rJ%qW3GWRg%#=gPT!;5f--RULfewn#nVeVI% zJDJ?M@olM7jsRUvf5@G}+^NhxlDX5EdlYl0GdDV)yCz!NxyLX!dWYlVn0q{PPhjqe z%sq*@Co}gH=AO#j)0lfYbI)Mznan+lxo0zXCUehW?zzl8kGbbF_X6)uD9VBxE%$qT zS*rGh@P^}g5pyqQ?j_8qKQOx_q6@f8 ztYPl8J^M)8)4Tg|)QZyAz6bz|Bg!oTBdpvq@GZ?=I&JdXkH-wHv@(E1@Xc ziG$7~SJjgvM%JJxd;UR@_Z&g1o3N3hy`bUMUUMN##^21MNUuw@kkA_vEh6-$M2iW% zCD9T>Z%ee4&_0Ql5!x@&ax)v)KV~>$9EN7PY7mK!i!-Lmj6&#L>7V}(^^Z3Ge+_d& z(E*Z7P22LWpwtgaw35&viB=JMN21k)4okF#(7O_?C3Hlhb%c&ew4Ts0i8c^=Poj;4 z-j`?-p${b5Oz1<2wh;PAqOF8JmS`JwvrmA+j`69KcTkMaB-%+RSE5~nK9^`Wp)VxL zCiJC5dkB3cQ4XQ63FXE&&W#KhK-oKv0495pq7%%0lDSVY_i5(NWA1$BE@19L<}PCH zZO!4|D&>+&?k*&&+*>xqo5q|1$Tl%>5g4|IXZhF!!I# z{TFlpkGcQ$?u4Q^8hK{y48kCLYee}-G#<$Im?#D&lT%5i=Zm~tLdt0*pU32qQcfrN zd?sHY<pF6e3_IdlU#<$mrHpn$yYG>N-0k# z`6?z~E#;XcU&G{Ur97MD>zI7Kl;@Cq1Cwu*@;s7nV)D&WUO@6KOfDD8Q`8;R0>Gg`y>Z5?c-;5AwB zT2kIla&0EpmGUl<>oK{$lxf8hy^qNaq?|+Y{Y-A?WfY~)8`~+n4|oRi@OBDCd5}eU zNXoPVi#BHR!%`kaauX&$B4t`0MjvHzQ!gVwhq7tQ9c|{A>0xifCNyVJ9&@s(-M3*A z9%ph3DZ?f_!Q_@whD~^q$xk`irVX3$G?QC7*`^Jf(3;8Uq%lkSHf+K(Ol~V>*o0@9 z+)m1{3C}UPy_8`So@a6gDZ?goWO64d!zOfQau+GXCUj+TqLg71x-q%ClwlKkFuA9c zVH2WE?j>c|gx*Z}XF@|Dnl4vZU%?{a%Y@v&6VHepdW!kPq zw=sFUlWiJP=z=>OvKQP*F?O;T*;3v^@*XC?vMiEq<(EV|#Z+(;iRP!7fX{osGs z`Av%ZC(tF20EI*2sFWv>e2mHONf`s{eI|b({#?p)N&bS#Ur8Br=GROk;LKDJ$`n6+dVJ~o?*d%5%Rw26yv`V zVdnc)p#A98zp;z_F6G@M|H0%xrHoGh7nA=d<-H{T&18B6hONsEj37B4$Zde747-xR zM#$btc#IGG?Tc8|g4PTHiBr z#2qlZSQe#$koRR$jQc&ZS6N1>G-Od8@H#o-4w_volOGcDKCCtxJ7k*c&}c#rOEiv9 z6NgNz9mMc{1Sqr}k4hQCyD5{KNg2btIg=lg@_3RTXL1WEV;DZc-6|0s1xL3DbcpVqM7KK>47FF<;lWD)v}^$g zE9z6Y+3k~2bcN3pODC4A7*<`MD~9#&7mB44`%*Df_g7$H9*)C}+cg1ptQ6sd2VHCt zPI_RrPzljf9t^i3PCH<#>kzD09#EJ>BkG;8BY?x`XAek(+2=u^Fvdet#>T9%Md{|^(#{^FS-{b3(_f>e& z1x$4uMR}8f!mEvRp#$86pzvu9oWWf?y1!}KVwAgzZ40`C6ipY%9IRysbcAjyMMq0S zHHh5c=^kdM&qspu4m==M}}szh{q zDmqOfx;+)0E)n*OGbGwZXr@FsbDSj+-KC1ob|}Cp2!TuoY$ek@s^}bvV3_7Q6yWv{ zfq4$tXmp1vI$t7ei55tN6>641M=^94N`#@i2qsu$QYHGF5OCW^fHq*aO~xyBZdXI9DL?O(q_7aqZ=BB6G~4 z04F#E-tz!QF9hEA0A~;cKJWm?LQ_eEi)e3Nm_To9tbqUb~nG}`>B_zVh>v;~D9{wKo z;3Xx(Y3un8nM!*PWBUS!Y{XfFE_BF-!g1DnV<`cTq zA)AQ>gf0{47(G`JEh7;ouFECD#C3&4n7FQ#2ou*;5@F)HS|Utb*GPnk>spC0ab4$- zsjp*LKws~WDbO)YT{lRC9(kig=#e)`gdTabM3}s8kqDDlS%Kb5CUmPrSVP_>Q3|2k zCBhtbheVje?vw~~*j*A~4!c_-%wgpu!W>rKA=|$&hgERMb^y#__eg}3)_Wzw?yRCj zSpHO!Xab?i4%rm3kE#L`PA;9K3(Cch+Q90$J4S-*K$4MD`_VG-f zAZ7HmiAP@{KFj=9J9wMsKeLTKhrJ%H-DR>^oGoz4($LP5GRE#gCNGjQ#_nP! zFOf3F?ouW%lQPEcawe~kGRE#oCa-d`ZEB3&)l6RFWZTpjyK9-e&dD}5#_oD1Z;&#^ z?nWkWa*_?p7vmlQPEcb|&wTGRE#sChw9m#_nz=XGQn< z*UORUYjB6#uh&J;4{+r7h7Xz$eN)PKaOEu~zb$1vxU!GQ`=yL~*$0?>P|9OSKE&jA zq>NqrVJ5#TWpl%g$;YG&Bk>-S-%B{$0u#%zrTXPbp(C|Hb70Ng0FrZzjjlnObbK^&uwWc%X1y7Lju5 zS!S6!!C{(ZnqxnA4zo-on!u7RA(Ks`T%E_{l2T45`Fti{Amz~{U&!Q(q>RPI#Y`?G zWh^c(VRC6HV{vgQlP{Ap>_!Jri0AJG~T z(c2%RWqH)6a!;~g09$ap8ldo!NI_(aBMF@BQqQ=TV8 z+g?a{GxblE6L);c^y5n~>Yi12hQ;j^o@w!O3eUB;y}}DEeqP~47I#p1wZ$D3UJo3J zb^;FTbR^ti8>cZop7Du{PiA~7<0~0o#rQ_XH!;4M@okLnVmzDiw;A8h_(8_sVf-lL zpD_NZ=ky2x+_Cmsw($5ewBMHsF9N0q30TapRgm>I$Z_DXVo&?vk!U{Se={C`Q7n83 zxWk4xkMWBczm)MZj9CCcoA?U+QG-9H<92DYcP@V z?u-v*JcaR*jHfX^mhlOUPiA}y<1-ka&G;O~=Q2Kz@%fBrF}|4brHrp&d^O|i7~jQs z4&!e!zK`*Pj2~kB2;;{Xe~+ahI?T3%BdAjF(~ja>gHKyb0q?8E?jTOU7Fiwkl#^H?pwD^lN{vw6&6d3wzyNQuAA_&&z> zGk$>aql_P8JlAvDQNbN6=dRVqcj57&FaL>gM*9`J%5i^{NHp$Jx{6sX&@)AFn=8^W zN!;;l9GG9i^oP7|)+BpUj_2SGM`Is^-ZzIk>?BP+r_(VNb)1dbf(3a>1(|GvJk5eU zqk_z^LE5q)?NyLDHpufVNK^$$KAwa7IK6xjdawiTuoy3Ro)8_NqHa9C2YqWG3o_`R zLCjH+#5tRe=isDoh{v>5jXO?w&qk{Z^@^$NoXr*w^Vmk%97dpbo1ug)Il_msEoH75 ziKeh1Q)Q5xDYl}f`5=+#EV#p3nC&?|^{b-JwNdA@Ad6Ixg*M1y7G${!vdjiq!Gf$& zK~~!!Ygv$;D##?;n7e!sy5kLZSd1LT-(~y=a~*oi6Yl1)ml!H1 zx8P320j9sJblhw>;&pnb6Yj9F{&ZpS&}Q6;)VUP)FR#;rzKlzko|S?-T--OkJjR>B z9r6~8w`BYo#@jOfEaUAM@4$E`#z!+ghVcoEPhxx{uG5!_f#~J^I@gErfo$G@&jIU;V1LMCi9(P?VpSQpr=Cds0_cC6E@%tEW#P|b@H)gya<4KGU zVmz7gHH>dy{1D^E82_B{uNc4a`dGPchCA%H9U1S$_{)sH%J>+@Co!JMcoyU97~jD7 zQO4tLh~?*TxWoEy$@r^`Co}#t<9{+<=f>D|>cbtDw;AJ)d!7(YhPyf0yuf@lA_Fe- z2gWfNLw|C^!`T`Ez7nt-_wmlbdL~3i_>}Mg3Nk+_9^i8j1X4Y~*B%Ir^kBOMqdds5 zAl-vEEy!@dOv2yH#@cr@n5kR($cfXAM(rzjRHhQ}zDD2C@KmMVq^DV8aQCn=UIhDRw@D28V#Rw{;v zDOM?lrzut|hQ}$^D2C@L)+&YvD%L56Co0w}hDRzkD27RWqhgrUHz|fmeY0Yi)VC;x zNqwtgc(7udVtBG*yJC2>VuxaQwqmDZc(`JhV)!J}Zm@8W?NK@&qR3GUPf_eu49~i~ z1{NBv18|2%@fhQOFdlc43r{aQz-^4#V`R7}fr=jB+l~Y(dC&rY9t~pAt9bD#8@j3o ztt_bKK_@$!s(aAZhN$5|I}2)h(B6Vt9)xd~*Y=>34N=E~E*8}FAkl()9&`twLmdE9 zYxEG17kk>!4LlfPbA7)Dy=;hv9`v)Ikq3bV4|p)pf(JbqYQaMugq7de0rPa|L0H;{ zC4!-C;*hmRTku58BaQ{8mFSrt55ksd>Ot5t%{;&-+UOe1J-~O`2t4M1&CXmxk2@5Y z){8`20EE@}gcm#60=D!ZY=tL1c-AKIlm}tWKkdQu6yj`qlbQj(oO3&E^UrN|ZRJu5 zs}b`{YsE0Xv~es5oBkOO!j^99LD0_{wW%59ZhqT|5W}SXU3i&Yb8$SfXwogqiK`LHM?A4-dkO z_4FWok2C5)n6X|Sn2ga&M*v}G8tO%S4T}csFec7%qV1VjYRq*gXlbi+o&)At>VsHP z%y%fb%GSgJ5Aa1M3X$bO8+(<74%n+;PG97ZO&rtrVu{dlOB@P%+Dk9>poay^9I)5H zl)Bs@+Xc4biMth!nP7*|msUDtGldCtl}F|%WgDJ$TkRRP>4%W_H4fP{F?FtW$X*OH z>^g^nUN)=i9k5|AlWvd*6X`~Wg5EaTCI@UZOpco!G8s4o+qK1^0AE}ru+;$*Z6DSZ z+Z+mp+A!Na=x@Oe2g1<K8E%ljxpVIMSO9Q6guXL>T8#29- z)OW(LJizn^l@7!55Yrng9fsv$rZ-VK49g=-e^lu(EKQl-OzAKz&6)m~(qUL0XL<{z z!>~NT^p;A8VR@42PbnRS)5{6+J?GmPmX^hfgSjIAaoYG-f#xs3_(qUL8GJTTLVOS4 z)OW)Syw3DDlnyiSCezbSwitVfv>^$1>nErspah%Ye_B{)N)9 z4EU1iUnw2SfUlW;TWtAx!-hUE{Y|EY8smcN+(Kc&O4{LS!O^U&2+zb}peJKlfc)(Lmh0UV)_oiE9d{x-nLZm#Pjx6d z!q5~&Qw&X2G}X|NijFiiP0=(%M=3hW&~!!9kL*0#oLM)(?<%}`j&o*0G{Yqq{D4}b z4-|WVUx6Sn#)BU%80*1L7L4-%KNLYx#(Qwaf(ahrw<0LSL=XOJ!6XO52FWs&FxgOx>D+tW<06$(qV7>?V1q%WTJizZ)5Xf@C*4rLiZwnQ*^|nY+TW^aMwe_|{ zQCn|I6}9!YOi^2J%N4ctw!+aMVhga+g9Hm!d4S*DpdzmJ0Kd9HV2ua(=?wyFJ-`od z5Lo8{etm<$dJirHpr82x2<_S?Ck`^kV9y5A!kZm6pG-Ki(ZDSZnolMiSwoOEq=4Z( zvkmU>y4!tVbKRV6<`O$RH7A2Pn8kN0hFN@9w`0}jDM%sSyhCngiyTqU^hvd0+Poxu*}G8~TR3R#;bCOqt$v)YjE@ z1K)Dc*3~*wS8oG`b+r%fu&(y|z^1PDT4Q*?Q&U&;UPD6kpkslVXz0g`9I$6Bd$5do z$FaanI0@0i9^e;MD8#z}s3=nqswnfR{v-dOSeP8ul&XRrmj?~A{{h_1aW%Sn+!6dj z(uY7{Nk3*mKlMRPnf77@{F!1{0q07#2dl2n9Sg##@(Tcy2)$$jH!IOJQ=+f_K~bWw zH8mwV4jPu|6x^{A;is`qGr7>qwiH=((IUmLZuv&CJ@|Ibw~htjx52-2z_#FCEKvRh z#!8c6O7p#=!K>Cn{@a1y<2z9ne}Ffvk00SSC9uOf+w{tx95r3_=x76fcF=UyqZ3S5 zJ>#!MU#f;1HFK7^xLTC}zmanfW%^w9uk@oyJ{NWjSbOoSr*;hBR{d{|1!h%5PtH3K zjsd)u{fA?LSpd;v^B&;meJI3V0I1{OH2op)KL@NGIE>%w`Wq~)(zvoN!eK<9PnQAY z+Q_Bg##iNYp_GQtM5E0h++n{e1Gi}v6z60zhRWqkzXop8?$FB~#>V|xuScSHz#U%q zZpO=bP8%t>O}WBsR`CJptwOj>2Ivf&GO&sMM@6sUG2UUa7z*8Xgc9bymJekkZ#|ie z9a3$NZDe35k!T$j`98Rjt>KYdZzZh()9!cL8Cz`ZUm7y~5vLE2G;ByIKFa*JlD}!p ze``aE+laY9dg}yWnwRcg!5vn7BIDgWr{5ZZ8!6?+SD{S3 z;Jkr(nkfVF$&$HOV_T=B-8EAu(@l@(zu8>yUR?%v+bd!{J3SeviM0 zye~S{RPD(O93{LI3(|nRFUP#)$oopnTb{hHx(fu|9pe7qKWrx(C--kl_J-6pKQP_5eSLMPLkoX;J(x7J;!o z#0?gV^C9rlSQKKs2RB(T!2|p{7WJ)(0H!CJ_4@IBsK`RTUc+k^=sU8fs zV44Tvk(qrPR)CQaUe|wXT)>Q%*{9Fo?kUE^C2# zI5iTzz~zg?3!NC|yF0Oq9J5cV(t)H0VS8WdLF;%^{L4HrmV`e1?}6z6k?55GVf$R= z#jx$Kb|5#>uRqn?H7xLTPIC{DUhhF4TlY73V4lIG!$cOntP^u11Nu_oZuS0zf!+EL zxXpvez`m6B?JV*gP77W^QuN(PCf?=6dGSWPn~CMT7{)Bm#0p;QWJ_?52Y*>`uLmtG zsOW*|aFJ*wfUrI*dodi-RXu2f=#gkO0MqMfg7soJ6l-`8T7a4koT086_X$?OwHz`F z=ufZ!t}PMFb{&UoL~L&AI^^bpL+wp?l|{6#6~~g6Z+5V>R#~d^WbB2Vsat z4wxQ%G6N@s4}gVfJnZz~DO;6~co5dsqaK8vx2XpmZ1pt*2(Q=DiDqL`_2h_=nDL(c z2gOYHl&2->LI_(G^X}6gV<8D#ooFjTtA(_+pa_fUw~e3(3;K+p)kE4=&>A6qR#03Q z^LRT!YlieWK@k?SdV4{U8tC(a;tHT01g#y?j-HkX>w$uHa?o~|glK06a_JEn3ed&- z=_nSUs|S(jVDcwAe=r!$mk{mdKyG9(B6Rougu&(tJv=Bu06}_s5{aT?Mx8$hC&gY4 zSJcYNVpaW>;b`6f*8mLVHu$ zhk^|`nX!)kN0F;|Y$F3hp~pCVWV)3BH&!ylJ2T#o@g&db*4pi1PR&~UR5E@Jrh;O4 zM&TZ?u)glTgWO?#HG(_j%{`|<4L52a_!gO=LG8f_3%YnF@U1K~#v4NoXnwLF1A3{(Rc%s_R3Aq><27|K9RfME>O z0vOIfZGaaUr~~j419bsj_Mk*Ls!1ZRaANZMDkmnh$()$nj^M;(H-!_E-&9UahDUN@ za-7DA$?_;pOrFyjq1vT>odII{G9CXr_4kBwol&5940HjQ&p=mz1q>ttWHHbUU?BtD z0TwaP17I-&Jpq<55CvGuKreu04D<$A&Ojf46%6zRSjj*?fK?3i2UyKO62KY;UI19j zKmf3gfdK&P85jt#fq_8)8yOf3u!(^o0Gk;Y3b2KNVE|hh7!I%vz*w7b)4Sb+a5=rh zgK&!2=|MO}?D8O7CGPg1jkQ?W9^i$(vrTB#gXbdj^$#-C=eEb&<5LRvUpXFx>w>)= zm=!DCG4P<1&F$+Rbg|$K4-zeS(}QqV_Lc`dZHTu$2)F3_JP5a9`#msQv4rRW50dOP z4tfw+aL9v!7QExZU<(d=Fw}x~JqTAHM?84RhB)eh*?!SaWO@*GiT6ARyTtn*gk9nT z55g|-p$B1?_{f8>OML7Bx&-yaPdo@)?o$uKmix?uu;p?+=wz?)xd&m(ec?f(4e_N1 zVat8xLD+I%dl0tVaSy_lJK;gtawk0qTkezxVauKNAZ)oj55ktq_aJP!0uRELEA$|2 zxgrn3mixv7bC^fZzX8;;B`;MW9O;8f5wI((aD7FeA%hqO90<3aH|y2Ik>Vf^A`Rdl z?EMK12+-5&EcO?0!=RX@-^tbU4&(PPzw{yKX^ML&gqb*K4+6JIHxiw}_)O2~i0NK; z#RO!0!v@MiykfY^7*PyI;R%XuCRRc*++;gXv8}{PDz=T-`HF2Pc7b9$h+U`{9?7^! zG2B18STVecSxPb70J%i5J;X{YhR3@vRctS@%Ou;FOstGzBZytD819^2p%|W7x>7Mb zvvieWc)spx#qfOHHHzV96|Yqc3+d|=8%^wb#qi6DHz+oi*o}(ew-s+vY&@}>6~nJ9 z-lEt8PBbX;gIJx#c;}VyJ9%zxkIsO#O_pVILN^CY|pn_uf=E*&Z;hQJ-Du$P5D=IdRSS7{q*^|nO;pyZm zV4>0Kq;x!;+?nZJoNkWW4q{K))gf~lc48~WRH9=x7#?Nq#;(%C$@Tzk;|kJyGCivF zRiyV~dT*t#A-xaN`#L@ND&9ggaR+h$(+4Si z8|j0Y{*u#!aK?SvgTd5$sKQ=xU=VeyxC5{^uL^V!<|f%AW5PF$pmaunh51ZTI^G>f zW%@{^A(KeU{Sk?!auOXDS`<4$NWtT&3gPfq6`yuXK#g z1x(LUI!5P0rY}-D-W^!X^d(Biy8}y^zD((O+;ch8S129t4y`$( ztY!K-rQ_X!^-SNO^o^u%WcnthW1Mbg`WB_*cKlYRZ&NxRVcyR49ZJWeUOSn-OX=p_ zA*N?59d>aK({q%LNBs9P{WYm?#`u4o>2E0g|NnVB`@yqnHG|G%Ys_zbj4S>WMlU6? zgx^vL!?3)~^nFT)VcF0014@TsImq-wN{3;2hv|ov4#V;;(~l?}hUF;Jk0~977ObchUGJ+=PKR2l*IHeln%r4CDXrBItLQ7SeZhyN_j?(i$#@py%Nbw6_aql_P8{1e7MW&CT#k2Bt(Qml@X;STFKlkqv8(}^V9zW(ypV=QJd z{U@Op<)APA3})Jw_NkS__-C-lIlTi5pLoYio1ET(FW*HJ!@e>>F|4CXIA*W66HD#$ z9JANkg?&~@$85M=*zcV0SQsvg*aeP-;jsU_&@mG(ZzR&aNU}6M!g#S`CT?CD*3YFJ zvvEgZzj%pa*t3*Y3~?`&EFJl~%rTorI`-gY9J6U;piVD$%!V6-t;H3N*>GdA-@a0^ zaoAH`rC8?K_DZ#aUNq6nxrmx|T=6Fw+5oG>a4>La{SvGKmvF`N1E*cV-=*h*s8 zOEv)&euHA@OgBn45gY286vGQPH%m4Lo5@=ov-z95fLK|_Z2lIb0dJLT3G#BAV%VVH zt{58O4#n_^$U7ag=`O`V&0UV!bk}0zeYa%m&>_l6wjT9dUa}3?$X9U8rm35;dmXdkHsT&)MaOKojW}?sB-wU!#L9|c@KjL@ajPnZ!<%Z7?Zg3Ab;U4fYbb_6 zTT`;#IMk};m@UU{q*2>3TMqgS0(ulhF&t9Vm23~{zMf(WiPcvO?RKAJdvR#gK(PD_ z^vU}bL*H%an8|bgXymVvVee)_m$_IhiP zzZQ9C7r(`FIt>X@mkf@!d)iH_NNnTCGQO)>PL?vl+wTlP>4hm1WXn~ge+Du%vT2hWsqaGPFG`m43=yo@-jrS%}95sWZ9^{VUq2ce71!`?cgO^C?s5bt_y|XGO-*? zoG&_N3z>rkd`YmvWGo(DcFYvKFd3`AR}@1hc~vn~MzUlh(D)-HOThq0kt`jHhg8Kd zxJN36G}08q-HcI^WgyS#ilKvLD2Bl^TC&mToMRNj#5qzKXXHni_N$#$Xs<~wHN z?nZxJ;Fyh@gZ9mG%!V`X4=!{p42NC7BEgDMaJOZ#WNGN9OC(E2y)1Riq*0WPc3Y+x zuD9GVlWx&;)bk3-W}rP*N;V6V!79lzVL(fiFjjX+wrmEmor+tJuj$~`FNZYFz7Ll(h2D|aPVz5_lNVXO?xZad(GtziVvYqI= zZ#!oD-%i-reU90_whM9hJ7&Y}+D+_$V>aAwETj)A1{-!rG4!E#9JANkjsADovG97B zQ{I&Qia@jS|K=0e@Ki62=6OJ;Kq^8@9~vLN?=kgCz
                                                # pre-release
      +            [-_\.]?
      +            (?P(a|b|c|rc|alpha|beta|pre|preview))
      +            [-_\.]?
      +            (?P[0-9]+)?
      +        )?
      +        (?P                                         # post release
      +            (?:-(?P[0-9]+))
      +            |
      +            (?:
      +                [-_\.]?
      +                (?Ppost|rev|r)
      +                [-_\.]?
      +                (?P[0-9]+)?
      +            )
      +        )?
      +        (?P                                          # dev release
      +            [-_\.]?
      +            (?Pdev)
      +            [-_\.]?
      +            (?P[0-9]+)?
      +        )?
      +    )
      +    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
      +"""
      +
      +
      +class Version(_BaseVersion):
      +
      +    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
      +
      +    def __init__(self, version: str) -> None:
      +
      +        # Validate the version and parse it into pieces
      +        match = self._regex.search(version)
      +        if not match:
      +            raise InvalidVersion(f"Invalid version: '{version}'")
      +
      +        # Store the parsed out pieces of the version
      +        self._version = _Version(
      +            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
      +            release=tuple(int(i) for i in match.group("release").split(".")),
      +            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
      +            post=_parse_letter_version(
      +                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
      +            ),
      +            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
      +            local=_parse_local_version(match.group("local")),
      +        )
      +
      +        # Generate a key which will be used for sorting
      +        self._key = _cmpkey(
      +            self._version.epoch,
      +            self._version.release,
      +            self._version.pre,
      +            self._version.post,
      +            self._version.dev,
      +            self._version.local,
      +        )
      +
      +    def __repr__(self) -> str:
      +        return f""
      +
      +    def __str__(self) -> str:
      +        parts = []
      +
      +        # Epoch
      +        if self.epoch != 0:
      +            parts.append(f"{self.epoch}!")
      +
      +        # Release segment
      +        parts.append(".".join(str(x) for x in self.release))
      +
      +        # Pre-release
      +        if self.pre is not None:
      +            parts.append("".join(str(x) for x in self.pre))
      +
      +        # Post-release
      +        if self.post is not None:
      +            parts.append(f".post{self.post}")
      +
      +        # Development release
      +        if self.dev is not None:
      +            parts.append(f".dev{self.dev}")
      +
      +        # Local version segment
      +        if self.local is not None:
      +            parts.append(f"+{self.local}")
      +
      +        return "".join(parts)
      +
      +    @property
      +    def epoch(self) -> int:
      +        _epoch: int = self._version.epoch
      +        return _epoch
      +
      +    @property
      +    def release(self) -> Tuple[int, ...]:
      +        _release: Tuple[int, ...] = self._version.release
      +        return _release
      +
      +    @property
      +    def pre(self) -> Optional[Tuple[str, int]]:
      +        _pre: Optional[Tuple[str, int]] = self._version.pre
      +        return _pre
      +
      +    @property
      +    def post(self) -> Optional[int]:
      +        return self._version.post[1] if self._version.post else None
      +
      +    @property
      +    def dev(self) -> Optional[int]:
      +        return self._version.dev[1] if self._version.dev else None
      +
      +    @property
      +    def local(self) -> Optional[str]:
      +        if self._version.local:
      +            return ".".join(str(x) for x in self._version.local)
      +        else:
      +            return None
      +
      +    @property
      +    def public(self) -> str:
      +        return str(self).split("+", 1)[0]
      +
      +    @property
      +    def base_version(self) -> str:
      +        parts = []
      +
      +        # Epoch
      +        if self.epoch != 0:
      +            parts.append(f"{self.epoch}!")
      +
      +        # Release segment
      +        parts.append(".".join(str(x) for x in self.release))
      +
      +        return "".join(parts)
      +
      +    @property
      +    def is_prerelease(self) -> bool:
      +        return self.dev is not None or self.pre is not None
      +
      +    @property
      +    def is_postrelease(self) -> bool:
      +        return self.post is not None
      +
      +    @property
      +    def is_devrelease(self) -> bool:
      +        return self.dev is not None
      +
      +    @property
      +    def major(self) -> int:
      +        return self.release[0] if len(self.release) >= 1 else 0
      +
      +    @property
      +    def minor(self) -> int:
      +        return self.release[1] if len(self.release) >= 2 else 0
      +
      +    @property
      +    def micro(self) -> int:
      +        return self.release[2] if len(self.release) >= 3 else 0
      +
      +
      +def _parse_letter_version(
      +    letter: str, number: Union[str, bytes, SupportsInt]
      +) -> Optional[Tuple[str, int]]:
      +
      +    if letter:
      +        # We consider there to be an implicit 0 in a pre-release if there is
      +        # not a numeral associated with it.
      +        if number is None:
      +            number = 0
      +
      +        # We normalize any letters to their lower case form
      +        letter = letter.lower()
      +
      +        # We consider some words to be alternate spellings of other words and
      +        # in those cases we want to normalize the spellings to our preferred
      +        # spelling.
      +        if letter == "alpha":
      +            letter = "a"
      +        elif letter == "beta":
      +            letter = "b"
      +        elif letter in ["c", "pre", "preview"]:
      +            letter = "rc"
      +        elif letter in ["rev", "r"]:
      +            letter = "post"
      +
      +        return letter, int(number)
      +    if not letter and number:
      +        # We assume if we are given a number, but we are not given a letter
      +        # then this is using the implicit post release syntax (e.g. 1.0-1)
      +        letter = "post"
      +
      +        return letter, int(number)
      +
      +    return None
      +
      +
      +_local_version_separators = re.compile(r"[\._-]")
      +
      +
      +def _parse_local_version(local: str) -> Optional[LocalType]:
      +    """
      +    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
      +    """
      +    if local is not None:
      +        return tuple(
      +            part.lower() if not part.isdigit() else int(part)
      +            for part in _local_version_separators.split(local)
      +        )
      +    return None
      +
      +
      +def _cmpkey(
      +    epoch: int,
      +    release: Tuple[int, ...],
      +    pre: Optional[Tuple[str, int]],
      +    post: Optional[Tuple[str, int]],
      +    dev: Optional[Tuple[str, int]],
      +    local: Optional[Tuple[SubLocalType]],
      +) -> CmpKey:
      +
      +    # When we compare a release version, we want to compare it with all of the
      +    # trailing zeros removed. So we'll use a reverse the list, drop all the now
      +    # leading zeros until we come to something non zero, then take the rest
      +    # re-reverse it back into the correct order and make it a tuple and use
      +    # that for our sorting key.
      +    _release = tuple(
      +        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
      +    )
      +
      +    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
      +    # We'll do this by abusing the pre segment, but we _only_ want to do this
      +    # if there is not a pre or a post segment. If we have one of those then
      +    # the normal sorting rules will handle this case correctly.
      +    if pre is None and post is None and dev is not None:
      +        _pre: PrePostDevType = NegativeInfinity
      +    # Versions without a pre-release (except as noted above) should sort after
      +    # those with one.
      +    elif pre is None:
      +        _pre = Infinity
      +    else:
      +        _pre = pre
      +
      +    # Versions without a post segment should sort before those with one.
      +    if post is None:
      +        _post: PrePostDevType = NegativeInfinity
      +
      +    else:
      +        _post = post
      +
      +    # Versions without a development segment should sort after those with one.
      +    if dev is None:
      +        _dev: PrePostDevType = Infinity
      +
      +    else:
      +        _dev = dev
      +
      +    if local is None:
      +        # Versions without a local segment should sort before those with one.
      +        _local: LocalType = NegativeInfinity
      +    else:
      +        # Versions with a local segment need that segment parsed to implement
      +        # the sorting rules in PEP440.
      +        # - Alpha numeric segments sort before numeric segments
      +        # - Alpha numeric segments sort lexicographically
      +        # - Numeric segments sort numerically
      +        # - Shorter versions sort before longer versions when the prefixes
      +        #   match exactly
      +        _local = tuple(
      +            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
      +        )
      +
      +    return epoch, _release, _pre, _post, _dev, _local
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
      new file mode 100644
      index 0000000..ad27940
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
      @@ -0,0 +1,3361 @@
      +"""
      +Package resource API
      +--------------------
      +
      +A resource is a logical file contained within a package, or a logical
      +subdirectory thereof.  The package resource API expects resource names
      +to have their path parts separated with ``/``, *not* whatever the local
      +path separator is.  Do not use os.path operations to manipulate resource
      +names being passed into the API.
      +
      +The package resource API is designed to work with normal filesystem packages,
      +.egg files, and unpacked .egg files.  It can also work in a limited way with
      +.zip files and with custom PEP 302 loaders that support the ``get_data()``
      +method.
      +
      +This module is deprecated. Users are directed to :mod:`importlib.resources`,
      +:mod:`importlib.metadata` and :pypi:`packaging` instead.
      +"""
      +
      +import sys
      +import os
      +import io
      +import time
      +import re
      +import types
      +import zipfile
      +import zipimport
      +import warnings
      +import stat
      +import functools
      +import pkgutil
      +import operator
      +import platform
      +import collections
      +import plistlib
      +import email.parser
      +import errno
      +import tempfile
      +import textwrap
      +import inspect
      +import ntpath
      +import posixpath
      +import importlib
      +from pkgutil import get_importer
      +
      +try:
      +    import _imp
      +except ImportError:
      +    # Python 3.2 compatibility
      +    import imp as _imp
      +
      +try:
      +    FileExistsError
      +except NameError:
      +    FileExistsError = OSError
      +
      +# capture these to bypass sandboxing
      +from os import utime
      +
      +try:
      +    from os import mkdir, rename, unlink
      +
      +    WRITE_SUPPORT = True
      +except ImportError:
      +    # no write support, probably under GAE
      +    WRITE_SUPPORT = False
      +
      +from os import open as os_open
      +from os.path import isdir, split
      +
      +try:
      +    import importlib.machinery as importlib_machinery
      +
      +    # access attribute to force import under delayed import mechanisms.
      +    importlib_machinery.__name__
      +except ImportError:
      +    importlib_machinery = None
      +
      +from pip._internal.utils._jaraco_text import (
      +    yield_lines,
      +    drop_comment,
      +    join_continuation,
      +)
      +
      +from pip._vendor import platformdirs
      +from pip._vendor import packaging
      +
      +__import__('pip._vendor.packaging.version')
      +__import__('pip._vendor.packaging.specifiers')
      +__import__('pip._vendor.packaging.requirements')
      +__import__('pip._vendor.packaging.markers')
      +__import__('pip._vendor.packaging.utils')
      +
      +if sys.version_info < (3, 5):
      +    raise RuntimeError("Python 3.5 or later is required")
      +
      +# declare some globals that will be defined later to
      +# satisfy the linters.
      +require = None
      +working_set = None
      +add_activation_listener = None
      +resources_stream = None
      +cleanup_resources = None
      +resource_dir = None
      +resource_stream = None
      +set_extraction_path = None
      +resource_isdir = None
      +resource_string = None
      +iter_entry_points = None
      +resource_listdir = None
      +resource_filename = None
      +resource_exists = None
      +_distribution_finders = None
      +_namespace_handlers = None
      +_namespace_packages = None
      +
      +
      +warnings.warn(
      +    "pkg_resources is deprecated as an API. "
      +    "See https://setuptools.pypa.io/en/latest/pkg_resources.html",
      +    DeprecationWarning,
      +    stacklevel=2
      +)
      +
      +
      +_PEP440_FALLBACK = re.compile(r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I)
      +
      +
      +class PEP440Warning(RuntimeWarning):
      +    """
      +    Used when there is an issue with a version or specifier not complying with
      +    PEP 440.
      +    """
      +
      +
      +parse_version = packaging.version.Version
      +
      +
      +_state_vars = {}
      +
      +
      +def _declare_state(vartype, **kw):
      +    globals().update(kw)
      +    _state_vars.update(dict.fromkeys(kw, vartype))
      +
      +
      +def __getstate__():
      +    state = {}
      +    g = globals()
      +    for k, v in _state_vars.items():
      +        state[k] = g['_sget_' + v](g[k])
      +    return state
      +
      +
      +def __setstate__(state):
      +    g = globals()
      +    for k, v in state.items():
      +        g['_sset_' + _state_vars[k]](k, g[k], v)
      +    return state
      +
      +
      +def _sget_dict(val):
      +    return val.copy()
      +
      +
      +def _sset_dict(key, ob, state):
      +    ob.clear()
      +    ob.update(state)
      +
      +
      +def _sget_object(val):
      +    return val.__getstate__()
      +
      +
      +def _sset_object(key, ob, state):
      +    ob.__setstate__(state)
      +
      +
      +_sget_none = _sset_none = lambda *args: None
      +
      +
      +def get_supported_platform():
      +    """Return this platform's maximum compatible version.
      +
      +    distutils.util.get_platform() normally reports the minimum version
      +    of macOS that would be required to *use* extensions produced by
      +    distutils.  But what we want when checking compatibility is to know the
      +    version of macOS that we are *running*.  To allow usage of packages that
      +    explicitly require a newer version of macOS, we must also know the
      +    current version of the OS.
      +
      +    If this condition occurs for any other platform with a version in its
      +    platform strings, this function should be extended accordingly.
      +    """
      +    plat = get_build_platform()
      +    m = macosVersionString.match(plat)
      +    if m is not None and sys.platform == "darwin":
      +        try:
      +            plat = 'macosx-%s-%s' % ('.'.join(_macos_vers()[:2]), m.group(3))
      +        except ValueError:
      +            # not macOS
      +            pass
      +    return plat
      +
      +
      +__all__ = [
      +    # Basic resource access and distribution/entry point discovery
      +    'require',
      +    'run_script',
      +    'get_provider',
      +    'get_distribution',
      +    'load_entry_point',
      +    'get_entry_map',
      +    'get_entry_info',
      +    'iter_entry_points',
      +    'resource_string',
      +    'resource_stream',
      +    'resource_filename',
      +    'resource_listdir',
      +    'resource_exists',
      +    'resource_isdir',
      +    # Environmental control
      +    'declare_namespace',
      +    'working_set',
      +    'add_activation_listener',
      +    'find_distributions',
      +    'set_extraction_path',
      +    'cleanup_resources',
      +    'get_default_cache',
      +    # Primary implementation classes
      +    'Environment',
      +    'WorkingSet',
      +    'ResourceManager',
      +    'Distribution',
      +    'Requirement',
      +    'EntryPoint',
      +    # Exceptions
      +    'ResolutionError',
      +    'VersionConflict',
      +    'DistributionNotFound',
      +    'UnknownExtra',
      +    'ExtractionError',
      +    # Warnings
      +    'PEP440Warning',
      +    # Parsing functions and string utilities
      +    'parse_requirements',
      +    'parse_version',
      +    'safe_name',
      +    'safe_version',
      +    'get_platform',
      +    'compatible_platforms',
      +    'yield_lines',
      +    'split_sections',
      +    'safe_extra',
      +    'to_filename',
      +    'invalid_marker',
      +    'evaluate_marker',
      +    # filesystem utilities
      +    'ensure_directory',
      +    'normalize_path',
      +    # Distribution "precedence" constants
      +    'EGG_DIST',
      +    'BINARY_DIST',
      +    'SOURCE_DIST',
      +    'CHECKOUT_DIST',
      +    'DEVELOP_DIST',
      +    # "Provider" interfaces, implementations, and registration/lookup APIs
      +    'IMetadataProvider',
      +    'IResourceProvider',
      +    'FileMetadata',
      +    'PathMetadata',
      +    'EggMetadata',
      +    'EmptyProvider',
      +    'empty_provider',
      +    'NullProvider',
      +    'EggProvider',
      +    'DefaultProvider',
      +    'ZipProvider',
      +    'register_finder',
      +    'register_namespace_handler',
      +    'register_loader_type',
      +    'fixup_namespace_packages',
      +    'get_importer',
      +    # Warnings
      +    'PkgResourcesDeprecationWarning',
      +    # Deprecated/backward compatibility only
      +    'run_main',
      +    'AvailableDistributions',
      +]
      +
      +
      +class ResolutionError(Exception):
      +    """Abstract base for dependency resolution errors"""
      +
      +    def __repr__(self):
      +        return self.__class__.__name__ + repr(self.args)
      +
      +
      +class VersionConflict(ResolutionError):
      +    """
      +    An already-installed version conflicts with the requested version.
      +
      +    Should be initialized with the installed Distribution and the requested
      +    Requirement.
      +    """
      +
      +    _template = "{self.dist} is installed but {self.req} is required"
      +
      +    @property
      +    def dist(self):
      +        return self.args[0]
      +
      +    @property
      +    def req(self):
      +        return self.args[1]
      +
      +    def report(self):
      +        return self._template.format(**locals())
      +
      +    def with_context(self, required_by):
      +        """
      +        If required_by is non-empty, return a version of self that is a
      +        ContextualVersionConflict.
      +        """
      +        if not required_by:
      +            return self
      +        args = self.args + (required_by,)
      +        return ContextualVersionConflict(*args)
      +
      +
      +class ContextualVersionConflict(VersionConflict):
      +    """
      +    A VersionConflict that accepts a third parameter, the set of the
      +    requirements that required the installed Distribution.
      +    """
      +
      +    _template = VersionConflict._template + ' by {self.required_by}'
      +
      +    @property
      +    def required_by(self):
      +        return self.args[2]
      +
      +
      +class DistributionNotFound(ResolutionError):
      +    """A requested distribution was not found"""
      +
      +    _template = (
      +        "The '{self.req}' distribution was not found "
      +        "and is required by {self.requirers_str}"
      +    )
      +
      +    @property
      +    def req(self):
      +        return self.args[0]
      +
      +    @property
      +    def requirers(self):
      +        return self.args[1]
      +
      +    @property
      +    def requirers_str(self):
      +        if not self.requirers:
      +            return 'the application'
      +        return ', '.join(self.requirers)
      +
      +    def report(self):
      +        return self._template.format(**locals())
      +
      +    def __str__(self):
      +        return self.report()
      +
      +
      +class UnknownExtra(ResolutionError):
      +    """Distribution doesn't have an "extra feature" of the given name"""
      +
      +
      +_provider_factories = {}
      +
      +PY_MAJOR = '{}.{}'.format(*sys.version_info)
      +EGG_DIST = 3
      +BINARY_DIST = 2
      +SOURCE_DIST = 1
      +CHECKOUT_DIST = 0
      +DEVELOP_DIST = -1
      +
      +
      +def register_loader_type(loader_type, provider_factory):
      +    """Register `provider_factory` to make providers for `loader_type`
      +
      +    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
      +    and `provider_factory` is a function that, passed a *module* object,
      +    returns an ``IResourceProvider`` for that module.
      +    """
      +    _provider_factories[loader_type] = provider_factory
      +
      +
      +def get_provider(moduleOrReq):
      +    """Return an IResourceProvider for the named module or requirement"""
      +    if isinstance(moduleOrReq, Requirement):
      +        return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
      +    try:
      +        module = sys.modules[moduleOrReq]
      +    except KeyError:
      +        __import__(moduleOrReq)
      +        module = sys.modules[moduleOrReq]
      +    loader = getattr(module, '__loader__', None)
      +    return _find_adapter(_provider_factories, loader)(module)
      +
      +
      +def _macos_vers(_cache=[]):
      +    if not _cache:
      +        version = platform.mac_ver()[0]
      +        # fallback for MacPorts
      +        if version == '':
      +            plist = '/System/Library/CoreServices/SystemVersion.plist'
      +            if os.path.exists(plist):
      +                if hasattr(plistlib, 'readPlist'):
      +                    plist_content = plistlib.readPlist(plist)
      +                    if 'ProductVersion' in plist_content:
      +                        version = plist_content['ProductVersion']
      +
      +        _cache.append(version.split('.'))
      +    return _cache[0]
      +
      +
      +def _macos_arch(machine):
      +    return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine)
      +
      +
      +def get_build_platform():
      +    """Return this platform's string for platform-specific distributions
      +
      +    XXX Currently this is the same as ``distutils.util.get_platform()``, but it
      +    needs some hacks for Linux and macOS.
      +    """
      +    from sysconfig import get_platform
      +
      +    plat = get_platform()
      +    if sys.platform == "darwin" and not plat.startswith('macosx-'):
      +        try:
      +            version = _macos_vers()
      +            machine = os.uname()[4].replace(" ", "_")
      +            return "macosx-%d.%d-%s" % (
      +                int(version[0]),
      +                int(version[1]),
      +                _macos_arch(machine),
      +            )
      +        except ValueError:
      +            # if someone is running a non-Mac darwin system, this will fall
      +            # through to the default implementation
      +            pass
      +    return plat
      +
      +
      +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)")
      +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
      +# XXX backward compat
      +get_platform = get_build_platform
      +
      +
      +def compatible_platforms(provided, required):
      +    """Can code for the `provided` platform run on the `required` platform?
      +
      +    Returns true if either platform is ``None``, or the platforms are equal.
      +
      +    XXX Needs compatibility checks for Linux and other unixy OSes.
      +    """
      +    if provided is None or required is None or provided == required:
      +        # easy case
      +        return True
      +
      +    # macOS special cases
      +    reqMac = macosVersionString.match(required)
      +    if reqMac:
      +        provMac = macosVersionString.match(provided)
      +
      +        # is this a Mac package?
      +        if not provMac:
      +            # this is backwards compatibility for packages built before
      +            # setuptools 0.6. All packages built after this point will
      +            # use the new macOS designation.
      +            provDarwin = darwinVersionString.match(provided)
      +            if provDarwin:
      +                dversion = int(provDarwin.group(1))
      +                macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2))
      +                if (
      +                    dversion == 7
      +                    and macosversion >= "10.3"
      +                    or dversion == 8
      +                    and macosversion >= "10.4"
      +                ):
      +                    return True
      +            # egg isn't macOS or legacy darwin
      +            return False
      +
      +        # are they the same major version and machine type?
      +        if provMac.group(1) != reqMac.group(1) or provMac.group(3) != reqMac.group(3):
      +            return False
      +
      +        # is the required OS major update >= the provided one?
      +        if int(provMac.group(2)) > int(reqMac.group(2)):
      +            return False
      +
      +        return True
      +
      +    # XXX Linux and other platforms' special cases should go here
      +    return False
      +
      +
      +def run_script(dist_spec, script_name):
      +    """Locate distribution `dist_spec` and run its `script_name` script"""
      +    ns = sys._getframe(1).f_globals
      +    name = ns['__name__']
      +    ns.clear()
      +    ns['__name__'] = name
      +    require(dist_spec)[0].run_script(script_name, ns)
      +
      +
      +# backward compatibility
      +run_main = run_script
      +
      +
      +def get_distribution(dist):
      +    """Return a current distribution object for a Requirement or string"""
      +    if isinstance(dist, str):
      +        dist = Requirement.parse(dist)
      +    if isinstance(dist, Requirement):
      +        dist = get_provider(dist)
      +    if not isinstance(dist, Distribution):
      +        raise TypeError("Expected string, Requirement, or Distribution", dist)
      +    return dist
      +
      +
      +def load_entry_point(dist, group, name):
      +    """Return `name` entry point of `group` for `dist` or raise ImportError"""
      +    return get_distribution(dist).load_entry_point(group, name)
      +
      +
      +def get_entry_map(dist, group=None):
      +    """Return the entry point map for `group`, or the full entry map"""
      +    return get_distribution(dist).get_entry_map(group)
      +
      +
      +def get_entry_info(dist, group, name):
      +    """Return the EntryPoint object for `group`+`name`, or ``None``"""
      +    return get_distribution(dist).get_entry_info(group, name)
      +
      +
      +class IMetadataProvider:
      +    def has_metadata(name):
      +        """Does the package's distribution contain the named metadata?"""
      +
      +    def get_metadata(name):
      +        """The named metadata resource as a string"""
      +
      +    def get_metadata_lines(name):
      +        """Yield named metadata resource as list of non-blank non-comment lines
      +
      +        Leading and trailing whitespace is stripped from each line, and lines
      +        with ``#`` as the first non-blank character are omitted."""
      +
      +    def metadata_isdir(name):
      +        """Is the named metadata a directory?  (like ``os.path.isdir()``)"""
      +
      +    def metadata_listdir(name):
      +        """List of metadata names in the directory (like ``os.listdir()``)"""
      +
      +    def run_script(script_name, namespace):
      +        """Execute the named script in the supplied namespace dictionary"""
      +
      +
      +class IResourceProvider(IMetadataProvider):
      +    """An object that provides access to package resources"""
      +
      +    def get_resource_filename(manager, resource_name):
      +        """Return a true filesystem path for `resource_name`
      +
      +        `manager` must be an ``IResourceManager``"""
      +
      +    def get_resource_stream(manager, resource_name):
      +        """Return a readable file-like object for `resource_name`
      +
      +        `manager` must be an ``IResourceManager``"""
      +
      +    def get_resource_string(manager, resource_name):
      +        """Return a string containing the contents of `resource_name`
      +
      +        `manager` must be an ``IResourceManager``"""
      +
      +    def has_resource(resource_name):
      +        """Does the package contain the named resource?"""
      +
      +    def resource_isdir(resource_name):
      +        """Is the named resource a directory?  (like ``os.path.isdir()``)"""
      +
      +    def resource_listdir(resource_name):
      +        """List of resource names in the directory (like ``os.listdir()``)"""
      +
      +
      +class WorkingSet:
      +    """A collection of active distributions on sys.path (or a similar list)"""
      +
      +    def __init__(self, entries=None):
      +        """Create working set from list of path entries (default=sys.path)"""
      +        self.entries = []
      +        self.entry_keys = {}
      +        self.by_key = {}
      +        self.normalized_to_canonical_keys = {}
      +        self.callbacks = []
      +
      +        if entries is None:
      +            entries = sys.path
      +
      +        for entry in entries:
      +            self.add_entry(entry)
      +
      +    @classmethod
      +    def _build_master(cls):
      +        """
      +        Prepare the master working set.
      +        """
      +        ws = cls()
      +        try:
      +            from __main__ import __requires__
      +        except ImportError:
      +            # The main program does not list any requirements
      +            return ws
      +
      +        # ensure the requirements are met
      +        try:
      +            ws.require(__requires__)
      +        except VersionConflict:
      +            return cls._build_from_requirements(__requires__)
      +
      +        return ws
      +
      +    @classmethod
      +    def _build_from_requirements(cls, req_spec):
      +        """
      +        Build a working set from a requirement spec. Rewrites sys.path.
      +        """
      +        # try it without defaults already on sys.path
      +        # by starting with an empty path
      +        ws = cls([])
      +        reqs = parse_requirements(req_spec)
      +        dists = ws.resolve(reqs, Environment())
      +        for dist in dists:
      +            ws.add(dist)
      +
      +        # add any missing entries from sys.path
      +        for entry in sys.path:
      +            if entry not in ws.entries:
      +                ws.add_entry(entry)
      +
      +        # then copy back to sys.path
      +        sys.path[:] = ws.entries
      +        return ws
      +
      +    def add_entry(self, entry):
      +        """Add a path item to ``.entries``, finding any distributions on it
      +
      +        ``find_distributions(entry, True)`` is used to find distributions
      +        corresponding to the path entry, and they are added.  `entry` is
      +        always appended to ``.entries``, even if it is already present.
      +        (This is because ``sys.path`` can contain the same value more than
      +        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
      +        equal ``sys.path``.)
      +        """
      +        self.entry_keys.setdefault(entry, [])
      +        self.entries.append(entry)
      +        for dist in find_distributions(entry, True):
      +            self.add(dist, entry, False)
      +
      +    def __contains__(self, dist):
      +        """True if `dist` is the active distribution for its project"""
      +        return self.by_key.get(dist.key) == dist
      +
      +    def find(self, req):
      +        """Find a distribution matching requirement `req`
      +
      +        If there is an active distribution for the requested project, this
      +        returns it as long as it meets the version requirement specified by
      +        `req`.  But, if there is an active distribution for the project and it
      +        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
      +        If there is no active distribution for the requested project, ``None``
      +        is returned.
      +        """
      +        dist = self.by_key.get(req.key)
      +
      +        if dist is None:
      +            canonical_key = self.normalized_to_canonical_keys.get(req.key)
      +
      +            if canonical_key is not None:
      +                req.key = canonical_key
      +                dist = self.by_key.get(canonical_key)
      +
      +        if dist is not None and dist not in req:
      +            # XXX add more info
      +            raise VersionConflict(dist, req)
      +        return dist
      +
      +    def iter_entry_points(self, group, name=None):
      +        """Yield entry point objects from `group` matching `name`
      +
      +        If `name` is None, yields all entry points in `group` from all
      +        distributions in the working set, otherwise only ones matching
      +        both `group` and `name` are yielded (in distribution order).
      +        """
      +        return (
      +            entry
      +            for dist in self
      +            for entry in dist.get_entry_map(group).values()
      +            if name is None or name == entry.name
      +        )
      +
      +    def run_script(self, requires, script_name):
      +        """Locate distribution for `requires` and run `script_name` script"""
      +        ns = sys._getframe(1).f_globals
      +        name = ns['__name__']
      +        ns.clear()
      +        ns['__name__'] = name
      +        self.require(requires)[0].run_script(script_name, ns)
      +
      +    def __iter__(self):
      +        """Yield distributions for non-duplicate projects in the working set
      +
      +        The yield order is the order in which the items' path entries were
      +        added to the working set.
      +        """
      +        seen = {}
      +        for item in self.entries:
      +            if item not in self.entry_keys:
      +                # workaround a cache issue
      +                continue
      +
      +            for key in self.entry_keys[item]:
      +                if key not in seen:
      +                    seen[key] = 1
      +                    yield self.by_key[key]
      +
      +    def add(self, dist, entry=None, insert=True, replace=False):
      +        """Add `dist` to working set, associated with `entry`
      +
      +        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
      +        On exit from this routine, `entry` is added to the end of the working
      +        set's ``.entries`` (if it wasn't already present).
      +
      +        `dist` is only added to the working set if it's for a project that
      +        doesn't already have a distribution in the set, unless `replace=True`.
      +        If it's added, any callbacks registered with the ``subscribe()`` method
      +        will be called.
      +        """
      +        if insert:
      +            dist.insert_on(self.entries, entry, replace=replace)
      +
      +        if entry is None:
      +            entry = dist.location
      +        keys = self.entry_keys.setdefault(entry, [])
      +        keys2 = self.entry_keys.setdefault(dist.location, [])
      +        if not replace and dist.key in self.by_key:
      +            # ignore hidden distros
      +            return
      +
      +        self.by_key[dist.key] = dist
      +        normalized_name = packaging.utils.canonicalize_name(dist.key)
      +        self.normalized_to_canonical_keys[normalized_name] = dist.key
      +        if dist.key not in keys:
      +            keys.append(dist.key)
      +        if dist.key not in keys2:
      +            keys2.append(dist.key)
      +        self._added_new(dist)
      +
      +    def resolve(
      +        self,
      +        requirements,
      +        env=None,
      +        installer=None,
      +        replace_conflicting=False,
      +        extras=None,
      +    ):
      +        """List all distributions needed to (recursively) meet `requirements`
      +
      +        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
      +        if supplied, should be an ``Environment`` instance.  If
      +        not supplied, it defaults to all distributions available within any
      +        entry or distribution in the working set.  `installer`, if supplied,
      +        will be invoked with each requirement that cannot be met by an
      +        already-installed distribution; it should return a ``Distribution`` or
      +        ``None``.
      +
      +        Unless `replace_conflicting=True`, raises a VersionConflict exception
      +        if
      +        any requirements are found on the path that have the correct name but
      +        the wrong version.  Otherwise, if an `installer` is supplied it will be
      +        invoked to obtain the correct version of the requirement and activate
      +        it.
      +
      +        `extras` is a list of the extras to be used with these requirements.
      +        This is important because extra requirements may look like `my_req;
      +        extra = "my_extra"`, which would otherwise be interpreted as a purely
      +        optional requirement.  Instead, we want to be able to assert that these
      +        requirements are truly required.
      +        """
      +
      +        # set up the stack
      +        requirements = list(requirements)[::-1]
      +        # set of processed requirements
      +        processed = {}
      +        # key -> dist
      +        best = {}
      +        to_activate = []
      +
      +        req_extras = _ReqExtras()
      +
      +        # Mapping of requirement to set of distributions that required it;
      +        # useful for reporting info about conflicts.
      +        required_by = collections.defaultdict(set)
      +
      +        while requirements:
      +            # process dependencies breadth-first
      +            req = requirements.pop(0)
      +            if req in processed:
      +                # Ignore cyclic or redundant dependencies
      +                continue
      +
      +            if not req_extras.markers_pass(req, extras):
      +                continue
      +
      +            dist = self._resolve_dist(
      +                req, best, replace_conflicting, env, installer, required_by, to_activate
      +            )
      +
      +            # push the new requirements onto the stack
      +            new_requirements = dist.requires(req.extras)[::-1]
      +            requirements.extend(new_requirements)
      +
      +            # Register the new requirements needed by req
      +            for new_requirement in new_requirements:
      +                required_by[new_requirement].add(req.project_name)
      +                req_extras[new_requirement] = req.extras
      +
      +            processed[req] = True
      +
      +        # return list of distros to activate
      +        return to_activate
      +
      +    def _resolve_dist(
      +        self, req, best, replace_conflicting, env, installer, required_by, to_activate
      +    ):
      +        dist = best.get(req.key)
      +        if dist is None:
      +            # Find the best distribution and add it to the map
      +            dist = self.by_key.get(req.key)
      +            if dist is None or (dist not in req and replace_conflicting):
      +                ws = self
      +                if env is None:
      +                    if dist is None:
      +                        env = Environment(self.entries)
      +                    else:
      +                        # Use an empty environment and workingset to avoid
      +                        # any further conflicts with the conflicting
      +                        # distribution
      +                        env = Environment([])
      +                        ws = WorkingSet([])
      +                dist = best[req.key] = env.best_match(
      +                    req, ws, installer, replace_conflicting=replace_conflicting
      +                )
      +                if dist is None:
      +                    requirers = required_by.get(req, None)
      +                    raise DistributionNotFound(req, requirers)
      +            to_activate.append(dist)
      +        if dist not in req:
      +            # Oops, the "best" so far conflicts with a dependency
      +            dependent_req = required_by[req]
      +            raise VersionConflict(dist, req).with_context(dependent_req)
      +        return dist
      +
      +    def find_plugins(self, plugin_env, full_env=None, installer=None, fallback=True):
      +        """Find all activatable distributions in `plugin_env`
      +
      +        Example usage::
      +
      +            distributions, errors = working_set.find_plugins(
      +                Environment(plugin_dirlist)
      +            )
      +            # add plugins+libs to sys.path
      +            map(working_set.add, distributions)
      +            # display errors
      +            print('Could not load', errors)
      +
      +        The `plugin_env` should be an ``Environment`` instance that contains
      +        only distributions that are in the project's "plugin directory" or
      +        directories. The `full_env`, if supplied, should be an ``Environment``
      +        contains all currently-available distributions.  If `full_env` is not
      +        supplied, one is created automatically from the ``WorkingSet`` this
      +        method is called on, which will typically mean that every directory on
      +        ``sys.path`` will be scanned for distributions.
      +
      +        `installer` is a standard installer callback as used by the
      +        ``resolve()`` method. The `fallback` flag indicates whether we should
      +        attempt to resolve older versions of a plugin if the newest version
      +        cannot be resolved.
      +
      +        This method returns a 2-tuple: (`distributions`, `error_info`), where
      +        `distributions` is a list of the distributions found in `plugin_env`
      +        that were loadable, along with any other distributions that are needed
      +        to resolve their dependencies.  `error_info` is a dictionary mapping
      +        unloadable plugin distributions to an exception instance describing the
      +        error that occurred. Usually this will be a ``DistributionNotFound`` or
      +        ``VersionConflict`` instance.
      +        """
      +
      +        plugin_projects = list(plugin_env)
      +        # scan project names in alphabetic order
      +        plugin_projects.sort()
      +
      +        error_info = {}
      +        distributions = {}
      +
      +        if full_env is None:
      +            env = Environment(self.entries)
      +            env += plugin_env
      +        else:
      +            env = full_env + plugin_env
      +
      +        shadow_set = self.__class__([])
      +        # put all our entries in shadow_set
      +        list(map(shadow_set.add, self))
      +
      +        for project_name in plugin_projects:
      +            for dist in plugin_env[project_name]:
      +                req = [dist.as_requirement()]
      +
      +                try:
      +                    resolvees = shadow_set.resolve(req, env, installer)
      +
      +                except ResolutionError as v:
      +                    # save error info
      +                    error_info[dist] = v
      +                    if fallback:
      +                        # try the next older version of project
      +                        continue
      +                    else:
      +                        # give up on this project, keep going
      +                        break
      +
      +                else:
      +                    list(map(shadow_set.add, resolvees))
      +                    distributions.update(dict.fromkeys(resolvees))
      +
      +                    # success, no need to try any more versions of this project
      +                    break
      +
      +        distributions = list(distributions)
      +        distributions.sort()
      +
      +        return distributions, error_info
      +
      +    def require(self, *requirements):
      +        """Ensure that distributions matching `requirements` are activated
      +
      +        `requirements` must be a string or a (possibly-nested) sequence
      +        thereof, specifying the distributions and versions required.  The
      +        return value is a sequence of the distributions that needed to be
      +        activated to fulfill the requirements; all relevant distributions are
      +        included, even if they were already activated in this working set.
      +        """
      +        needed = self.resolve(parse_requirements(requirements))
      +
      +        for dist in needed:
      +            self.add(dist)
      +
      +        return needed
      +
      +    def subscribe(self, callback, existing=True):
      +        """Invoke `callback` for all distributions
      +
      +        If `existing=True` (default),
      +        call on all existing ones, as well.
      +        """
      +        if callback in self.callbacks:
      +            return
      +        self.callbacks.append(callback)
      +        if not existing:
      +            return
      +        for dist in self:
      +            callback(dist)
      +
      +    def _added_new(self, dist):
      +        for callback in self.callbacks:
      +            callback(dist)
      +
      +    def __getstate__(self):
      +        return (
      +            self.entries[:],
      +            self.entry_keys.copy(),
      +            self.by_key.copy(),
      +            self.normalized_to_canonical_keys.copy(),
      +            self.callbacks[:],
      +        )
      +
      +    def __setstate__(self, e_k_b_n_c):
      +        entries, keys, by_key, normalized_to_canonical_keys, callbacks = e_k_b_n_c
      +        self.entries = entries[:]
      +        self.entry_keys = keys.copy()
      +        self.by_key = by_key.copy()
      +        self.normalized_to_canonical_keys = normalized_to_canonical_keys.copy()
      +        self.callbacks = callbacks[:]
      +
      +
      +class _ReqExtras(dict):
      +    """
      +    Map each requirement to the extras that demanded it.
      +    """
      +
      +    def markers_pass(self, req, extras=None):
      +        """
      +        Evaluate markers for req against each extra that
      +        demanded it.
      +
      +        Return False if the req has a marker and fails
      +        evaluation. Otherwise, return True.
      +        """
      +        extra_evals = (
      +            req.marker.evaluate({'extra': extra})
      +            for extra in self.get(req, ()) + (extras or (None,))
      +        )
      +        return not req.marker or any(extra_evals)
      +
      +
      +class Environment:
      +    """Searchable snapshot of distributions on a search path"""
      +
      +    def __init__(
      +        self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR
      +    ):
      +        """Snapshot distributions available on a search path
      +
      +        Any distributions found on `search_path` are added to the environment.
      +        `search_path` should be a sequence of ``sys.path`` items.  If not
      +        supplied, ``sys.path`` is used.
      +
      +        `platform` is an optional string specifying the name of the platform
      +        that platform-specific distributions must be compatible with.  If
      +        unspecified, it defaults to the current platform.  `python` is an
      +        optional string naming the desired version of Python (e.g. ``'3.6'``);
      +        it defaults to the current version.
      +
      +        You may explicitly set `platform` (and/or `python`) to ``None`` if you
      +        wish to map *all* distributions, not just those compatible with the
      +        running platform or Python version.
      +        """
      +        self._distmap = {}
      +        self.platform = platform
      +        self.python = python
      +        self.scan(search_path)
      +
      +    def can_add(self, dist):
      +        """Is distribution `dist` acceptable for this environment?
      +
      +        The distribution must match the platform and python version
      +        requirements specified when this environment was created, or False
      +        is returned.
      +        """
      +        py_compat = (
      +            self.python is None
      +            or dist.py_version is None
      +            or dist.py_version == self.python
      +        )
      +        return py_compat and compatible_platforms(dist.platform, self.platform)
      +
      +    def remove(self, dist):
      +        """Remove `dist` from the environment"""
      +        self._distmap[dist.key].remove(dist)
      +
      +    def scan(self, search_path=None):
      +        """Scan `search_path` for distributions usable in this environment
      +
      +        Any distributions found are added to the environment.
      +        `search_path` should be a sequence of ``sys.path`` items.  If not
      +        supplied, ``sys.path`` is used.  Only distributions conforming to
      +        the platform/python version defined at initialization are added.
      +        """
      +        if search_path is None:
      +            search_path = sys.path
      +
      +        for item in search_path:
      +            for dist in find_distributions(item):
      +                self.add(dist)
      +
      +    def __getitem__(self, project_name):
      +        """Return a newest-to-oldest list of distributions for `project_name`
      +
      +        Uses case-insensitive `project_name` comparison, assuming all the
      +        project's distributions use their project's name converted to all
      +        lowercase as their key.
      +
      +        """
      +        distribution_key = project_name.lower()
      +        return self._distmap.get(distribution_key, [])
      +
      +    def add(self, dist):
      +        """Add `dist` if we ``can_add()`` it and it has not already been added"""
      +        if self.can_add(dist) and dist.has_version():
      +            dists = self._distmap.setdefault(dist.key, [])
      +            if dist not in dists:
      +                dists.append(dist)
      +                dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
      +
      +    def best_match(self, req, working_set, installer=None, replace_conflicting=False):
      +        """Find distribution best matching `req` and usable on `working_set`
      +
      +        This calls the ``find(req)`` method of the `working_set` to see if a
      +        suitable distribution is already active.  (This may raise
      +        ``VersionConflict`` if an unsuitable version of the project is already
      +        active in the specified `working_set`.)  If a suitable distribution
      +        isn't active, this method returns the newest distribution in the
      +        environment that meets the ``Requirement`` in `req`.  If no suitable
      +        distribution is found, and `installer` is supplied, then the result of
      +        calling the environment's ``obtain(req, installer)`` method will be
      +        returned.
      +        """
      +        try:
      +            dist = working_set.find(req)
      +        except VersionConflict:
      +            if not replace_conflicting:
      +                raise
      +            dist = None
      +        if dist is not None:
      +            return dist
      +        for dist in self[req.key]:
      +            if dist in req:
      +                return dist
      +        # try to download/install
      +        return self.obtain(req, installer)
      +
      +    def obtain(self, requirement, installer=None):
      +        """Obtain a distribution matching `requirement` (e.g. via download)
      +
      +        Obtain a distro that matches requirement (e.g. via download).  In the
      +        base ``Environment`` class, this routine just returns
      +        ``installer(requirement)``, unless `installer` is None, in which case
      +        None is returned instead.  This method is a hook that allows subclasses
      +        to attempt other ways of obtaining a distribution before falling back
      +        to the `installer` argument."""
      +        if installer is not None:
      +            return installer(requirement)
      +
      +    def __iter__(self):
      +        """Yield the unique project names of the available distributions"""
      +        for key in self._distmap.keys():
      +            if self[key]:
      +                yield key
      +
      +    def __iadd__(self, other):
      +        """In-place addition of a distribution or environment"""
      +        if isinstance(other, Distribution):
      +            self.add(other)
      +        elif isinstance(other, Environment):
      +            for project in other:
      +                for dist in other[project]:
      +                    self.add(dist)
      +        else:
      +            raise TypeError("Can't add %r to environment" % (other,))
      +        return self
      +
      +    def __add__(self, other):
      +        """Add an environment or distribution to an environment"""
      +        new = self.__class__([], platform=None, python=None)
      +        for env in self, other:
      +            new += env
      +        return new
      +
      +
      +# XXX backward compatibility
      +AvailableDistributions = Environment
      +
      +
      +class ExtractionError(RuntimeError):
      +    """An error occurred extracting a resource
      +
      +    The following attributes are available from instances of this exception:
      +
      +    manager
      +        The resource manager that raised this exception
      +
      +    cache_path
      +        The base directory for resource extraction
      +
      +    original_error
      +        The exception instance that caused extraction to fail
      +    """
      +
      +
      +class ResourceManager:
      +    """Manage resource extraction and packages"""
      +
      +    extraction_path = None
      +
      +    def __init__(self):
      +        self.cached_files = {}
      +
      +    def resource_exists(self, package_or_requirement, resource_name):
      +        """Does the named resource exist?"""
      +        return get_provider(package_or_requirement).has_resource(resource_name)
      +
      +    def resource_isdir(self, package_or_requirement, resource_name):
      +        """Is the named resource an existing directory?"""
      +        return get_provider(package_or_requirement).resource_isdir(resource_name)
      +
      +    def resource_filename(self, package_or_requirement, resource_name):
      +        """Return a true filesystem path for specified resource"""
      +        return get_provider(package_or_requirement).get_resource_filename(
      +            self, resource_name
      +        )
      +
      +    def resource_stream(self, package_or_requirement, resource_name):
      +        """Return a readable file-like object for specified resource"""
      +        return get_provider(package_or_requirement).get_resource_stream(
      +            self, resource_name
      +        )
      +
      +    def resource_string(self, package_or_requirement, resource_name):
      +        """Return specified resource as a string"""
      +        return get_provider(package_or_requirement).get_resource_string(
      +            self, resource_name
      +        )
      +
      +    def resource_listdir(self, package_or_requirement, resource_name):
      +        """List the contents of the named resource directory"""
      +        return get_provider(package_or_requirement).resource_listdir(resource_name)
      +
      +    def extraction_error(self):
      +        """Give an error message for problems extracting file(s)"""
      +
      +        old_exc = sys.exc_info()[1]
      +        cache_path = self.extraction_path or get_default_cache()
      +
      +        tmpl = textwrap.dedent(
      +            """
      +            Can't extract file(s) to egg cache
      +
      +            The following error occurred while trying to extract file(s)
      +            to the Python egg cache:
      +
      +              {old_exc}
      +
      +            The Python egg cache directory is currently set to:
      +
      +              {cache_path}
      +
      +            Perhaps your account does not have write access to this directory?
      +            You can change the cache directory by setting the PYTHON_EGG_CACHE
      +            environment variable to point to an accessible directory.
      +            """
      +        ).lstrip()
      +        err = ExtractionError(tmpl.format(**locals()))
      +        err.manager = self
      +        err.cache_path = cache_path
      +        err.original_error = old_exc
      +        raise err
      +
      +    def get_cache_path(self, archive_name, names=()):
      +        """Return absolute location in cache for `archive_name` and `names`
      +
      +        The parent directory of the resulting path will be created if it does
      +        not already exist.  `archive_name` should be the base filename of the
      +        enclosing egg (which may not be the name of the enclosing zipfile!),
      +        including its ".egg" extension.  `names`, if provided, should be a
      +        sequence of path name parts "under" the egg's extraction location.
      +
      +        This method should only be called by resource providers that need to
      +        obtain an extraction location, and only for names they intend to
      +        extract, as it tracks the generated names for possible cleanup later.
      +        """
      +        extract_path = self.extraction_path or get_default_cache()
      +        target_path = os.path.join(extract_path, archive_name + '-tmp', *names)
      +        try:
      +            _bypass_ensure_directory(target_path)
      +        except Exception:
      +            self.extraction_error()
      +
      +        self._warn_unsafe_extraction_path(extract_path)
      +
      +        self.cached_files[target_path] = 1
      +        return target_path
      +
      +    @staticmethod
      +    def _warn_unsafe_extraction_path(path):
      +        """
      +        If the default extraction path is overridden and set to an insecure
      +        location, such as /tmp, it opens up an opportunity for an attacker to
      +        replace an extracted file with an unauthorized payload. Warn the user
      +        if a known insecure location is used.
      +
      +        See Distribute #375 for more details.
      +        """
      +        if os.name == 'nt' and not path.startswith(os.environ['windir']):
      +            # On Windows, permissions are generally restrictive by default
      +            #  and temp directories are not writable by other users, so
      +            #  bypass the warning.
      +            return
      +        mode = os.stat(path).st_mode
      +        if mode & stat.S_IWOTH or mode & stat.S_IWGRP:
      +            msg = (
      +                "Extraction path is writable by group/others "
      +                "and vulnerable to attack when "
      +                "used with get_resource_filename ({path}). "
      +                "Consider a more secure "
      +                "location (set with .set_extraction_path or the "
      +                "PYTHON_EGG_CACHE environment variable)."
      +            ).format(**locals())
      +            warnings.warn(msg, UserWarning)
      +
      +    def postprocess(self, tempname, filename):
      +        """Perform any platform-specific postprocessing of `tempname`
      +
      +        This is where Mac header rewrites should be done; other platforms don't
      +        have anything special they should do.
      +
      +        Resource providers should call this method ONLY after successfully
      +        extracting a compressed resource.  They must NOT call it on resources
      +        that are already in the filesystem.
      +
      +        `tempname` is the current (temporary) name of the file, and `filename`
      +        is the name it will be renamed to by the caller after this routine
      +        returns.
      +        """
      +
      +        if os.name == 'posix':
      +            # Make the resource executable
      +            mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777
      +            os.chmod(tempname, mode)
      +
      +    def set_extraction_path(self, path):
      +        """Set the base path where resources will be extracted to, if needed.
      +
      +        If you do not call this routine before any extractions take place, the
      +        path defaults to the return value of ``get_default_cache()``.  (Which
      +        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
      +        platform-specific fallbacks.  See that routine's documentation for more
      +        details.)
      +
      +        Resources are extracted to subdirectories of this path based upon
      +        information given by the ``IResourceProvider``.  You may set this to a
      +        temporary directory, but then you must call ``cleanup_resources()`` to
      +        delete the extracted files when done.  There is no guarantee that
      +        ``cleanup_resources()`` will be able to remove all extracted files.
      +
      +        (Note: you may not change the extraction path for a given resource
      +        manager once resources have been extracted, unless you first call
      +        ``cleanup_resources()``.)
      +        """
      +        if self.cached_files:
      +            raise ValueError("Can't change extraction path, files already extracted")
      +
      +        self.extraction_path = path
      +
      +    def cleanup_resources(self, force=False):
      +        """
      +        Delete all extracted resource files and directories, returning a list
      +        of the file and directory names that could not be successfully removed.
      +        This function does not have any concurrency protection, so it should
      +        generally only be called when the extraction path is a temporary
      +        directory exclusive to a single process.  This method is not
      +        automatically called; you must call it explicitly or register it as an
      +        ``atexit`` function if you wish to ensure cleanup of a temporary
      +        directory used for extractions.
      +        """
      +        # XXX
      +
      +
      +def get_default_cache():
      +    """
      +    Return the ``PYTHON_EGG_CACHE`` environment variable
      +    or a platform-relevant user cache dir for an app
      +    named "Python-Eggs".
      +    """
      +    return os.environ.get('PYTHON_EGG_CACHE') or platformdirs.user_cache_dir(
      +        appname='Python-Eggs'
      +    )
      +
      +
      +def safe_name(name):
      +    """Convert an arbitrary string to a standard distribution name
      +
      +    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
      +    """
      +    return re.sub('[^A-Za-z0-9.]+', '-', name)
      +
      +
      +def safe_version(version):
      +    """
      +    Convert an arbitrary string to a standard version string
      +    """
      +    try:
      +        # normalize the version
      +        return str(packaging.version.Version(version))
      +    except packaging.version.InvalidVersion:
      +        version = version.replace(' ', '.')
      +        return re.sub('[^A-Za-z0-9.]+', '-', version)
      +
      +
      +def _forgiving_version(version):
      +    """Fallback when ``safe_version`` is not safe enough
      +    >>> parse_version(_forgiving_version('0.23ubuntu1'))
      +    
      +    >>> parse_version(_forgiving_version('0.23-'))
      +    
      +    >>> parse_version(_forgiving_version('0.-_'))
      +    
      +    >>> parse_version(_forgiving_version('42.+?1'))
      +    
      +    >>> parse_version(_forgiving_version('hello world'))
      +    
      +    """
      +    version = version.replace(' ', '.')
      +    match = _PEP440_FALLBACK.search(version)
      +    if match:
      +        safe = match["safe"]
      +        rest = version[len(safe):]
      +    else:
      +        safe = "0"
      +        rest = version
      +    local = f"sanitized.{_safe_segment(rest)}".strip(".")
      +    return f"{safe}.dev0+{local}"
      +
      +
      +def _safe_segment(segment):
      +    """Convert an arbitrary string into a safe segment"""
      +    segment = re.sub('[^A-Za-z0-9.]+', '-', segment)
      +    segment = re.sub('-[^A-Za-z0-9]+', '-', segment)
      +    return re.sub(r'\.[^A-Za-z0-9]+', '.', segment).strip(".-")
      +
      +
      +def safe_extra(extra):
      +    """Convert an arbitrary string to a standard 'extra' name
      +
      +    Any runs of non-alphanumeric characters are replaced with a single '_',
      +    and the result is always lowercased.
      +    """
      +    return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower()
      +
      +
      +def to_filename(name):
      +    """Convert a project or version name to its filename-escaped form
      +
      +    Any '-' characters are currently replaced with '_'.
      +    """
      +    return name.replace('-', '_')
      +
      +
      +def invalid_marker(text):
      +    """
      +    Validate text as a PEP 508 environment marker; return an exception
      +    if invalid or False otherwise.
      +    """
      +    try:
      +        evaluate_marker(text)
      +    except SyntaxError as e:
      +        e.filename = None
      +        e.lineno = None
      +        return e
      +    return False
      +
      +
      +def evaluate_marker(text, extra=None):
      +    """
      +    Evaluate a PEP 508 environment marker.
      +    Return a boolean indicating the marker result in this environment.
      +    Raise SyntaxError if marker is invalid.
      +
      +    This implementation uses the 'pyparsing' module.
      +    """
      +    try:
      +        marker = packaging.markers.Marker(text)
      +        return marker.evaluate()
      +    except packaging.markers.InvalidMarker as e:
      +        raise SyntaxError(e) from e
      +
      +
      +class NullProvider:
      +    """Try to implement resources and metadata for arbitrary PEP 302 loaders"""
      +
      +    egg_name = None
      +    egg_info = None
      +    loader = None
      +
      +    def __init__(self, module):
      +        self.loader = getattr(module, '__loader__', None)
      +        self.module_path = os.path.dirname(getattr(module, '__file__', ''))
      +
      +    def get_resource_filename(self, manager, resource_name):
      +        return self._fn(self.module_path, resource_name)
      +
      +    def get_resource_stream(self, manager, resource_name):
      +        return io.BytesIO(self.get_resource_string(manager, resource_name))
      +
      +    def get_resource_string(self, manager, resource_name):
      +        return self._get(self._fn(self.module_path, resource_name))
      +
      +    def has_resource(self, resource_name):
      +        return self._has(self._fn(self.module_path, resource_name))
      +
      +    def _get_metadata_path(self, name):
      +        return self._fn(self.egg_info, name)
      +
      +    def has_metadata(self, name):
      +        if not self.egg_info:
      +            return self.egg_info
      +
      +        path = self._get_metadata_path(name)
      +        return self._has(path)
      +
      +    def get_metadata(self, name):
      +        if not self.egg_info:
      +            return ""
      +        path = self._get_metadata_path(name)
      +        value = self._get(path)
      +        try:
      +            return value.decode('utf-8')
      +        except UnicodeDecodeError as exc:
      +            # Include the path in the error message to simplify
      +            # troubleshooting, and without changing the exception type.
      +            exc.reason += ' in {} file at path: {}'.format(name, path)
      +            raise
      +
      +    def get_metadata_lines(self, name):
      +        return yield_lines(self.get_metadata(name))
      +
      +    def resource_isdir(self, resource_name):
      +        return self._isdir(self._fn(self.module_path, resource_name))
      +
      +    def metadata_isdir(self, name):
      +        return self.egg_info and self._isdir(self._fn(self.egg_info, name))
      +
      +    def resource_listdir(self, resource_name):
      +        return self._listdir(self._fn(self.module_path, resource_name))
      +
      +    def metadata_listdir(self, name):
      +        if self.egg_info:
      +            return self._listdir(self._fn(self.egg_info, name))
      +        return []
      +
      +    def run_script(self, script_name, namespace):
      +        script = 'scripts/' + script_name
      +        if not self.has_metadata(script):
      +            raise ResolutionError(
      +                "Script {script!r} not found in metadata at {self.egg_info!r}".format(
      +                    **locals()
      +                ),
      +            )
      +        script_text = self.get_metadata(script).replace('\r\n', '\n')
      +        script_text = script_text.replace('\r', '\n')
      +        script_filename = self._fn(self.egg_info, script)
      +        namespace['__file__'] = script_filename
      +        if os.path.exists(script_filename):
      +            with open(script_filename) as fid:
      +                source = fid.read()
      +            code = compile(source, script_filename, 'exec')
      +            exec(code, namespace, namespace)
      +        else:
      +            from linecache import cache
      +
      +            cache[script_filename] = (
      +                len(script_text),
      +                0,
      +                script_text.split('\n'),
      +                script_filename,
      +            )
      +            script_code = compile(script_text, script_filename, 'exec')
      +            exec(script_code, namespace, namespace)
      +
      +    def _has(self, path):
      +        raise NotImplementedError(
      +            "Can't perform this operation for unregistered loader type"
      +        )
      +
      +    def _isdir(self, path):
      +        raise NotImplementedError(
      +            "Can't perform this operation for unregistered loader type"
      +        )
      +
      +    def _listdir(self, path):
      +        raise NotImplementedError(
      +            "Can't perform this operation for unregistered loader type"
      +        )
      +
      +    def _fn(self, base, resource_name):
      +        self._validate_resource_path(resource_name)
      +        if resource_name:
      +            return os.path.join(base, *resource_name.split('/'))
      +        return base
      +
      +    @staticmethod
      +    def _validate_resource_path(path):
      +        """
      +        Validate the resource paths according to the docs.
      +        https://setuptools.pypa.io/en/latest/pkg_resources.html#basic-resource-access
      +
      +        >>> warned = getfixture('recwarn')
      +        >>> warnings.simplefilter('always')
      +        >>> vrp = NullProvider._validate_resource_path
      +        >>> vrp('foo/bar.txt')
      +        >>> bool(warned)
      +        False
      +        >>> vrp('../foo/bar.txt')
      +        >>> bool(warned)
      +        True
      +        >>> warned.clear()
      +        >>> vrp('/foo/bar.txt')
      +        >>> bool(warned)
      +        True
      +        >>> vrp('foo/../../bar.txt')
      +        >>> bool(warned)
      +        True
      +        >>> warned.clear()
      +        >>> vrp('foo/f../bar.txt')
      +        >>> bool(warned)
      +        False
      +
      +        Windows path separators are straight-up disallowed.
      +        >>> vrp(r'\\foo/bar.txt')
      +        Traceback (most recent call last):
      +        ...
      +        ValueError: Use of .. or absolute path in a resource path \
      +is not allowed.
      +
      +        >>> vrp(r'C:\\foo/bar.txt')
      +        Traceback (most recent call last):
      +        ...
      +        ValueError: Use of .. or absolute path in a resource path \
      +is not allowed.
      +
      +        Blank values are allowed
      +
      +        >>> vrp('')
      +        >>> bool(warned)
      +        False
      +
      +        Non-string values are not.
      +
      +        >>> vrp(None)
      +        Traceback (most recent call last):
      +        ...
      +        AttributeError: ...
      +        """
      +        invalid = (
      +            os.path.pardir in path.split(posixpath.sep)
      +            or posixpath.isabs(path)
      +            or ntpath.isabs(path)
      +        )
      +        if not invalid:
      +            return
      +
      +        msg = "Use of .. or absolute path in a resource path is not allowed."
      +
      +        # Aggressively disallow Windows absolute paths
      +        if ntpath.isabs(path) and not posixpath.isabs(path):
      +            raise ValueError(msg)
      +
      +        # for compatibility, warn; in future
      +        # raise ValueError(msg)
      +        issue_warning(
      +            msg[:-1] + " and will raise exceptions in a future release.",
      +            DeprecationWarning,
      +        )
      +
      +    def _get(self, path):
      +        if hasattr(self.loader, 'get_data'):
      +            return self.loader.get_data(path)
      +        raise NotImplementedError(
      +            "Can't perform this operation for loaders without 'get_data()'"
      +        )
      +
      +
      +register_loader_type(object, NullProvider)
      +
      +
      +def _parents(path):
      +    """
      +    yield all parents of path including path
      +    """
      +    last = None
      +    while path != last:
      +        yield path
      +        last = path
      +        path, _ = os.path.split(path)
      +
      +
      +class EggProvider(NullProvider):
      +    """Provider based on a virtual filesystem"""
      +
      +    def __init__(self, module):
      +        super().__init__(module)
      +        self._setup_prefix()
      +
      +    def _setup_prefix(self):
      +        # Assume that metadata may be nested inside a "basket"
      +        # of multiple eggs and use module_path instead of .archive.
      +        eggs = filter(_is_egg_path, _parents(self.module_path))
      +        egg = next(eggs, None)
      +        egg and self._set_egg(egg)
      +
      +    def _set_egg(self, path):
      +        self.egg_name = os.path.basename(path)
      +        self.egg_info = os.path.join(path, 'EGG-INFO')
      +        self.egg_root = path
      +
      +
      +class DefaultProvider(EggProvider):
      +    """Provides access to package resources in the filesystem"""
      +
      +    def _has(self, path):
      +        return os.path.exists(path)
      +
      +    def _isdir(self, path):
      +        return os.path.isdir(path)
      +
      +    def _listdir(self, path):
      +        return os.listdir(path)
      +
      +    def get_resource_stream(self, manager, resource_name):
      +        return open(self._fn(self.module_path, resource_name), 'rb')
      +
      +    def _get(self, path):
      +        with open(path, 'rb') as stream:
      +            return stream.read()
      +
      +    @classmethod
      +    def _register(cls):
      +        loader_names = (
      +            'SourceFileLoader',
      +            'SourcelessFileLoader',
      +        )
      +        for name in loader_names:
      +            loader_cls = getattr(importlib_machinery, name, type(None))
      +            register_loader_type(loader_cls, cls)
      +
      +
      +DefaultProvider._register()
      +
      +
      +class EmptyProvider(NullProvider):
      +    """Provider that returns nothing for all requests"""
      +
      +    module_path = None
      +
      +    _isdir = _has = lambda self, path: False
      +
      +    def _get(self, path):
      +        return ''
      +
      +    def _listdir(self, path):
      +        return []
      +
      +    def __init__(self):
      +        pass
      +
      +
      +empty_provider = EmptyProvider()
      +
      +
      +class ZipManifests(dict):
      +    """
      +    zip manifest builder
      +    """
      +
      +    @classmethod
      +    def build(cls, path):
      +        """
      +        Build a dictionary similar to the zipimport directory
      +        caches, except instead of tuples, store ZipInfo objects.
      +
      +        Use a platform-specific path separator (os.sep) for the path keys
      +        for compatibility with pypy on Windows.
      +        """
      +        with zipfile.ZipFile(path) as zfile:
      +            items = (
      +                (
      +                    name.replace('/', os.sep),
      +                    zfile.getinfo(name),
      +                )
      +                for name in zfile.namelist()
      +            )
      +            return dict(items)
      +
      +    load = build
      +
      +
      +class MemoizedZipManifests(ZipManifests):
      +    """
      +    Memoized zipfile manifests.
      +    """
      +
      +    manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime')
      +
      +    def load(self, path):
      +        """
      +        Load a manifest at path or return a suitable manifest already loaded.
      +        """
      +        path = os.path.normpath(path)
      +        mtime = os.stat(path).st_mtime
      +
      +        if path not in self or self[path].mtime != mtime:
      +            manifest = self.build(path)
      +            self[path] = self.manifest_mod(manifest, mtime)
      +
      +        return self[path].manifest
      +
      +
      +class ZipProvider(EggProvider):
      +    """Resource support for zips and eggs"""
      +
      +    eagers = None
      +    _zip_manifests = MemoizedZipManifests()
      +
      +    def __init__(self, module):
      +        super().__init__(module)
      +        self.zip_pre = self.loader.archive + os.sep
      +
      +    def _zipinfo_name(self, fspath):
      +        # Convert a virtual filename (full path to file) into a zipfile subpath
      +        # usable with the zipimport directory cache for our target archive
      +        fspath = fspath.rstrip(os.sep)
      +        if fspath == self.loader.archive:
      +            return ''
      +        if fspath.startswith(self.zip_pre):
      +            return fspath[len(self.zip_pre) :]
      +        raise AssertionError("%s is not a subpath of %s" % (fspath, self.zip_pre))
      +
      +    def _parts(self, zip_path):
      +        # Convert a zipfile subpath into an egg-relative path part list.
      +        # pseudo-fs path
      +        fspath = self.zip_pre + zip_path
      +        if fspath.startswith(self.egg_root + os.sep):
      +            return fspath[len(self.egg_root) + 1 :].split(os.sep)
      +        raise AssertionError("%s is not a subpath of %s" % (fspath, self.egg_root))
      +
      +    @property
      +    def zipinfo(self):
      +        return self._zip_manifests.load(self.loader.archive)
      +
      +    def get_resource_filename(self, manager, resource_name):
      +        if not self.egg_name:
      +            raise NotImplementedError(
      +                "resource_filename() only supported for .egg, not .zip"
      +            )
      +        # no need to lock for extraction, since we use temp names
      +        zip_path = self._resource_to_zip(resource_name)
      +        eagers = self._get_eager_resources()
      +        if '/'.join(self._parts(zip_path)) in eagers:
      +            for name in eagers:
      +                self._extract_resource(manager, self._eager_to_zip(name))
      +        return self._extract_resource(manager, zip_path)
      +
      +    @staticmethod
      +    def _get_date_and_size(zip_stat):
      +        size = zip_stat.file_size
      +        # ymdhms+wday, yday, dst
      +        date_time = zip_stat.date_time + (0, 0, -1)
      +        # 1980 offset already done
      +        timestamp = time.mktime(date_time)
      +        return timestamp, size
      +
      +    # FIXME: 'ZipProvider._extract_resource' is too complex (12)
      +    def _extract_resource(self, manager, zip_path):  # noqa: C901
      +        if zip_path in self._index():
      +            for name in self._index()[zip_path]:
      +                last = self._extract_resource(manager, os.path.join(zip_path, name))
      +            # return the extracted directory name
      +            return os.path.dirname(last)
      +
      +        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
      +
      +        if not WRITE_SUPPORT:
      +            raise IOError(
      +                '"os.rename" and "os.unlink" are not supported ' 'on this platform'
      +            )
      +        try:
      +            real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path))
      +
      +            if self._is_current(real_path, zip_path):
      +                return real_path
      +
      +            outf, tmpnam = _mkstemp(
      +                ".$extract",
      +                dir=os.path.dirname(real_path),
      +            )
      +            os.write(outf, self.loader.get_data(zip_path))
      +            os.close(outf)
      +            utime(tmpnam, (timestamp, timestamp))
      +            manager.postprocess(tmpnam, real_path)
      +
      +            try:
      +                rename(tmpnam, real_path)
      +
      +            except os.error:
      +                if os.path.isfile(real_path):
      +                    if self._is_current(real_path, zip_path):
      +                        # the file became current since it was checked above,
      +                        #  so proceed.
      +                        return real_path
      +                    # Windows, del old file and retry
      +                    elif os.name == 'nt':
      +                        unlink(real_path)
      +                        rename(tmpnam, real_path)
      +                        return real_path
      +                raise
      +
      +        except os.error:
      +            # report a user-friendly error
      +            manager.extraction_error()
      +
      +        return real_path
      +
      +    def _is_current(self, file_path, zip_path):
      +        """
      +        Return True if the file_path is current for this zip_path
      +        """
      +        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
      +        if not os.path.isfile(file_path):
      +            return False
      +        stat = os.stat(file_path)
      +        if stat.st_size != size or stat.st_mtime != timestamp:
      +            return False
      +        # check that the contents match
      +        zip_contents = self.loader.get_data(zip_path)
      +        with open(file_path, 'rb') as f:
      +            file_contents = f.read()
      +        return zip_contents == file_contents
      +
      +    def _get_eager_resources(self):
      +        if self.eagers is None:
      +            eagers = []
      +            for name in ('native_libs.txt', 'eager_resources.txt'):
      +                if self.has_metadata(name):
      +                    eagers.extend(self.get_metadata_lines(name))
      +            self.eagers = eagers
      +        return self.eagers
      +
      +    def _index(self):
      +        try:
      +            return self._dirindex
      +        except AttributeError:
      +            ind = {}
      +            for path in self.zipinfo:
      +                parts = path.split(os.sep)
      +                while parts:
      +                    parent = os.sep.join(parts[:-1])
      +                    if parent in ind:
      +                        ind[parent].append(parts[-1])
      +                        break
      +                    else:
      +                        ind[parent] = [parts.pop()]
      +            self._dirindex = ind
      +            return ind
      +
      +    def _has(self, fspath):
      +        zip_path = self._zipinfo_name(fspath)
      +        return zip_path in self.zipinfo or zip_path in self._index()
      +
      +    def _isdir(self, fspath):
      +        return self._zipinfo_name(fspath) in self._index()
      +
      +    def _listdir(self, fspath):
      +        return list(self._index().get(self._zipinfo_name(fspath), ()))
      +
      +    def _eager_to_zip(self, resource_name):
      +        return self._zipinfo_name(self._fn(self.egg_root, resource_name))
      +
      +    def _resource_to_zip(self, resource_name):
      +        return self._zipinfo_name(self._fn(self.module_path, resource_name))
      +
      +
      +register_loader_type(zipimport.zipimporter, ZipProvider)
      +
      +
      +class FileMetadata(EmptyProvider):
      +    """Metadata handler for standalone PKG-INFO files
      +
      +    Usage::
      +
      +        metadata = FileMetadata("/path/to/PKG-INFO")
      +
      +    This provider rejects all data and metadata requests except for PKG-INFO,
      +    which is treated as existing, and will be the contents of the file at
      +    the provided location.
      +    """
      +
      +    def __init__(self, path):
      +        self.path = path
      +
      +    def _get_metadata_path(self, name):
      +        return self.path
      +
      +    def has_metadata(self, name):
      +        return name == 'PKG-INFO' and os.path.isfile(self.path)
      +
      +    def get_metadata(self, name):
      +        if name != 'PKG-INFO':
      +            raise KeyError("No metadata except PKG-INFO is available")
      +
      +        with io.open(self.path, encoding='utf-8', errors="replace") as f:
      +            metadata = f.read()
      +        self._warn_on_replacement(metadata)
      +        return metadata
      +
      +    def _warn_on_replacement(self, metadata):
      +        replacement_char = '�'
      +        if replacement_char in metadata:
      +            tmpl = "{self.path} could not be properly decoded in UTF-8"
      +            msg = tmpl.format(**locals())
      +            warnings.warn(msg)
      +
      +    def get_metadata_lines(self, name):
      +        return yield_lines(self.get_metadata(name))
      +
      +
      +class PathMetadata(DefaultProvider):
      +    """Metadata provider for egg directories
      +
      +    Usage::
      +
      +        # Development eggs:
      +
      +        egg_info = "/path/to/PackageName.egg-info"
      +        base_dir = os.path.dirname(egg_info)
      +        metadata = PathMetadata(base_dir, egg_info)
      +        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
      +        dist = Distribution(basedir, project_name=dist_name, metadata=metadata)
      +
      +        # Unpacked egg directories:
      +
      +        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
      +        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
      +        dist = Distribution.from_filename(egg_path, metadata=metadata)
      +    """
      +
      +    def __init__(self, path, egg_info):
      +        self.module_path = path
      +        self.egg_info = egg_info
      +
      +
      +class EggMetadata(ZipProvider):
      +    """Metadata provider for .egg files"""
      +
      +    def __init__(self, importer):
      +        """Create a metadata provider from a zipimporter"""
      +
      +        self.zip_pre = importer.archive + os.sep
      +        self.loader = importer
      +        if importer.prefix:
      +            self.module_path = os.path.join(importer.archive, importer.prefix)
      +        else:
      +            self.module_path = importer.archive
      +        self._setup_prefix()
      +
      +
      +_declare_state('dict', _distribution_finders={})
      +
      +
      +def register_finder(importer_type, distribution_finder):
      +    """Register `distribution_finder` to find distributions in sys.path items
      +
      +    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
      +    handler), and `distribution_finder` is a callable that, passed a path
      +    item and the importer instance, yields ``Distribution`` instances found on
      +    that path item.  See ``pkg_resources.find_on_path`` for an example."""
      +    _distribution_finders[importer_type] = distribution_finder
      +
      +
      +def find_distributions(path_item, only=False):
      +    """Yield distributions accessible via `path_item`"""
      +    importer = get_importer(path_item)
      +    finder = _find_adapter(_distribution_finders, importer)
      +    return finder(importer, path_item, only)
      +
      +
      +def find_eggs_in_zip(importer, path_item, only=False):
      +    """
      +    Find eggs in zip files; possibly multiple nested eggs.
      +    """
      +    if importer.archive.endswith('.whl'):
      +        # wheels are not supported with this finder
      +        # they don't have PKG-INFO metadata, and won't ever contain eggs
      +        return
      +    metadata = EggMetadata(importer)
      +    if metadata.has_metadata('PKG-INFO'):
      +        yield Distribution.from_filename(path_item, metadata=metadata)
      +    if only:
      +        # don't yield nested distros
      +        return
      +    for subitem in metadata.resource_listdir(''):
      +        if _is_egg_path(subitem):
      +            subpath = os.path.join(path_item, subitem)
      +            dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath)
      +            for dist in dists:
      +                yield dist
      +        elif subitem.lower().endswith(('.dist-info', '.egg-info')):
      +            subpath = os.path.join(path_item, subitem)
      +            submeta = EggMetadata(zipimport.zipimporter(subpath))
      +            submeta.egg_info = subpath
      +            yield Distribution.from_location(path_item, subitem, submeta)
      +
      +
      +register_finder(zipimport.zipimporter, find_eggs_in_zip)
      +
      +
      +def find_nothing(importer, path_item, only=False):
      +    return ()
      +
      +
      +register_finder(object, find_nothing)
      +
      +
      +def find_on_path(importer, path_item, only=False):
      +    """Yield distributions accessible on a sys.path directory"""
      +    path_item = _normalize_cached(path_item)
      +
      +    if _is_unpacked_egg(path_item):
      +        yield Distribution.from_filename(
      +            path_item,
      +            metadata=PathMetadata(path_item, os.path.join(path_item, 'EGG-INFO')),
      +        )
      +        return
      +
      +    entries = (os.path.join(path_item, child) for child in safe_listdir(path_item))
      +
      +    # scan for .egg and .egg-info in directory
      +    for entry in sorted(entries):
      +        fullpath = os.path.join(path_item, entry)
      +        factory = dist_factory(path_item, entry, only)
      +        for dist in factory(fullpath):
      +            yield dist
      +
      +
      +def dist_factory(path_item, entry, only):
      +    """Return a dist_factory for the given entry."""
      +    lower = entry.lower()
      +    is_egg_info = lower.endswith('.egg-info')
      +    is_dist_info = lower.endswith('.dist-info') and os.path.isdir(
      +        os.path.join(path_item, entry)
      +    )
      +    is_meta = is_egg_info or is_dist_info
      +    return (
      +        distributions_from_metadata
      +        if is_meta
      +        else find_distributions
      +        if not only and _is_egg_path(entry)
      +        else resolve_egg_link
      +        if not only and lower.endswith('.egg-link')
      +        else NoDists()
      +    )
      +
      +
      +class NoDists:
      +    """
      +    >>> bool(NoDists())
      +    False
      +
      +    >>> list(NoDists()('anything'))
      +    []
      +    """
      +
      +    def __bool__(self):
      +        return False
      +
      +    def __call__(self, fullpath):
      +        return iter(())
      +
      +
      +def safe_listdir(path):
      +    """
      +    Attempt to list contents of path, but suppress some exceptions.
      +    """
      +    try:
      +        return os.listdir(path)
      +    except (PermissionError, NotADirectoryError):
      +        pass
      +    except OSError as e:
      +        # Ignore the directory if does not exist, not a directory or
      +        # permission denied
      +        if e.errno not in (errno.ENOTDIR, errno.EACCES, errno.ENOENT):
      +            raise
      +    return ()
      +
      +
      +def distributions_from_metadata(path):
      +    root = os.path.dirname(path)
      +    if os.path.isdir(path):
      +        if len(os.listdir(path)) == 0:
      +            # empty metadata dir; skip
      +            return
      +        metadata = PathMetadata(root, path)
      +    else:
      +        metadata = FileMetadata(path)
      +    entry = os.path.basename(path)
      +    yield Distribution.from_location(
      +        root,
      +        entry,
      +        metadata,
      +        precedence=DEVELOP_DIST,
      +    )
      +
      +
      +def non_empty_lines(path):
      +    """
      +    Yield non-empty lines from file at path
      +    """
      +    with open(path) as f:
      +        for line in f:
      +            line = line.strip()
      +            if line:
      +                yield line
      +
      +
      +def resolve_egg_link(path):
      +    """
      +    Given a path to an .egg-link, resolve distributions
      +    present in the referenced path.
      +    """
      +    referenced_paths = non_empty_lines(path)
      +    resolved_paths = (
      +        os.path.join(os.path.dirname(path), ref) for ref in referenced_paths
      +    )
      +    dist_groups = map(find_distributions, resolved_paths)
      +    return next(dist_groups, ())
      +
      +
      +if hasattr(pkgutil, 'ImpImporter'):
      +    register_finder(pkgutil.ImpImporter, find_on_path)
      +
      +register_finder(importlib_machinery.FileFinder, find_on_path)
      +
      +_declare_state('dict', _namespace_handlers={})
      +_declare_state('dict', _namespace_packages={})
      +
      +
      +def register_namespace_handler(importer_type, namespace_handler):
      +    """Register `namespace_handler` to declare namespace packages
      +
      +    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
      +    handler), and `namespace_handler` is a callable like this::
      +
      +        def namespace_handler(importer, path_entry, moduleName, module):
      +            # return a path_entry to use for child packages
      +
      +    Namespace handlers are only called if the importer object has already
      +    agreed that it can handle the relevant path item, and they should only
      +    return a subpath if the module __path__ does not already contain an
      +    equivalent subpath.  For an example namespace handler, see
      +    ``pkg_resources.file_ns_handler``.
      +    """
      +    _namespace_handlers[importer_type] = namespace_handler
      +
      +
      +def _handle_ns(packageName, path_item):
      +    """Ensure that named package includes a subpath of path_item (if needed)"""
      +
      +    importer = get_importer(path_item)
      +    if importer is None:
      +        return None
      +
      +    # use find_spec (PEP 451) and fall-back to find_module (PEP 302)
      +    try:
      +        spec = importer.find_spec(packageName)
      +    except AttributeError:
      +        # capture warnings due to #1111
      +        with warnings.catch_warnings():
      +            warnings.simplefilter("ignore")
      +            loader = importer.find_module(packageName)
      +    else:
      +        loader = spec.loader if spec else None
      +
      +    if loader is None:
      +        return None
      +    module = sys.modules.get(packageName)
      +    if module is None:
      +        module = sys.modules[packageName] = types.ModuleType(packageName)
      +        module.__path__ = []
      +        _set_parent_ns(packageName)
      +    elif not hasattr(module, '__path__'):
      +        raise TypeError("Not a package:", packageName)
      +    handler = _find_adapter(_namespace_handlers, importer)
      +    subpath = handler(importer, path_item, packageName, module)
      +    if subpath is not None:
      +        path = module.__path__
      +        path.append(subpath)
      +        importlib.import_module(packageName)
      +        _rebuild_mod_path(path, packageName, module)
      +    return subpath
      +
      +
      +def _rebuild_mod_path(orig_path, package_name, module):
      +    """
      +    Rebuild module.__path__ ensuring that all entries are ordered
      +    corresponding to their sys.path order
      +    """
      +    sys_path = [_normalize_cached(p) for p in sys.path]
      +
      +    def safe_sys_path_index(entry):
      +        """
      +        Workaround for #520 and #513.
      +        """
      +        try:
      +            return sys_path.index(entry)
      +        except ValueError:
      +            return float('inf')
      +
      +    def position_in_sys_path(path):
      +        """
      +        Return the ordinal of the path based on its position in sys.path
      +        """
      +        path_parts = path.split(os.sep)
      +        module_parts = package_name.count('.') + 1
      +        parts = path_parts[:-module_parts]
      +        return safe_sys_path_index(_normalize_cached(os.sep.join(parts)))
      +
      +    new_path = sorted(orig_path, key=position_in_sys_path)
      +    new_path = [_normalize_cached(p) for p in new_path]
      +
      +    if isinstance(module.__path__, list):
      +        module.__path__[:] = new_path
      +    else:
      +        module.__path__ = new_path
      +
      +
      +def declare_namespace(packageName):
      +    """Declare that package 'packageName' is a namespace package"""
      +
      +    msg = (
      +        f"Deprecated call to `pkg_resources.declare_namespace({packageName!r})`.\n"
      +        "Implementing implicit namespace packages (as specified in PEP 420) "
      +        "is preferred to `pkg_resources.declare_namespace`. "
      +        "See https://setuptools.pypa.io/en/latest/references/"
      +        "keywords.html#keyword-namespace-packages"
      +    )
      +    warnings.warn(msg, DeprecationWarning, stacklevel=2)
      +
      +    _imp.acquire_lock()
      +    try:
      +        if packageName in _namespace_packages:
      +            return
      +
      +        path = sys.path
      +        parent, _, _ = packageName.rpartition('.')
      +
      +        if parent:
      +            declare_namespace(parent)
      +            if parent not in _namespace_packages:
      +                __import__(parent)
      +            try:
      +                path = sys.modules[parent].__path__
      +            except AttributeError as e:
      +                raise TypeError("Not a package:", parent) from e
      +
      +        # Track what packages are namespaces, so when new path items are added,
      +        # they can be updated
      +        _namespace_packages.setdefault(parent or None, []).append(packageName)
      +        _namespace_packages.setdefault(packageName, [])
      +
      +        for path_item in path:
      +            # Ensure all the parent's path items are reflected in the child,
      +            # if they apply
      +            _handle_ns(packageName, path_item)
      +
      +    finally:
      +        _imp.release_lock()
      +
      +
      +def fixup_namespace_packages(path_item, parent=None):
      +    """Ensure that previously-declared namespace packages include path_item"""
      +    _imp.acquire_lock()
      +    try:
      +        for package in _namespace_packages.get(parent, ()):
      +            subpath = _handle_ns(package, path_item)
      +            if subpath:
      +                fixup_namespace_packages(subpath, package)
      +    finally:
      +        _imp.release_lock()
      +
      +
      +def file_ns_handler(importer, path_item, packageName, module):
      +    """Compute an ns-package subpath for a filesystem or zipfile importer"""
      +
      +    subpath = os.path.join(path_item, packageName.split('.')[-1])
      +    normalized = _normalize_cached(subpath)
      +    for item in module.__path__:
      +        if _normalize_cached(item) == normalized:
      +            break
      +    else:
      +        # Only return the path if it's not already there
      +        return subpath
      +
      +
      +if hasattr(pkgutil, 'ImpImporter'):
      +    register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
      +
      +register_namespace_handler(zipimport.zipimporter, file_ns_handler)
      +register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler)
      +
      +
      +def null_ns_handler(importer, path_item, packageName, module):
      +    return None
      +
      +
      +register_namespace_handler(object, null_ns_handler)
      +
      +
      +def normalize_path(filename):
      +    """Normalize a file/dir name for comparison purposes"""
      +    return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename))))
      +
      +
      +def _cygwin_patch(filename):  # pragma: nocover
      +    """
      +    Contrary to POSIX 2008, on Cygwin, getcwd (3) contains
      +    symlink components. Using
      +    os.path.abspath() works around this limitation. A fix in os.getcwd()
      +    would probably better, in Cygwin even more so, except
      +    that this seems to be by design...
      +    """
      +    return os.path.abspath(filename) if sys.platform == 'cygwin' else filename
      +
      +
      +def _normalize_cached(filename, _cache={}):
      +    try:
      +        return _cache[filename]
      +    except KeyError:
      +        _cache[filename] = result = normalize_path(filename)
      +        return result
      +
      +
      +def _is_egg_path(path):
      +    """
      +    Determine if given path appears to be an egg.
      +    """
      +    return _is_zip_egg(path) or _is_unpacked_egg(path)
      +
      +
      +def _is_zip_egg(path):
      +    return (
      +        path.lower().endswith('.egg')
      +        and os.path.isfile(path)
      +        and zipfile.is_zipfile(path)
      +    )
      +
      +
      +def _is_unpacked_egg(path):
      +    """
      +    Determine if given path appears to be an unpacked egg.
      +    """
      +    return path.lower().endswith('.egg') and os.path.isfile(
      +        os.path.join(path, 'EGG-INFO', 'PKG-INFO')
      +    )
      +
      +
      +def _set_parent_ns(packageName):
      +    parts = packageName.split('.')
      +    name = parts.pop()
      +    if parts:
      +        parent = '.'.join(parts)
      +        setattr(sys.modules[parent], name, sys.modules[packageName])
      +
      +
      +MODULE = re.compile(r"\w+(\.\w+)*$").match
      +EGG_NAME = re.compile(
      +    r"""
      +    (?P[^-]+) (
      +        -(?P[^-]+) (
      +            -py(?P[^-]+) (
      +                -(?P.+)
      +            )?
      +        )?
      +    )?
      +    """,
      +    re.VERBOSE | re.IGNORECASE,
      +).match
      +
      +
      +class EntryPoint:
      +    """Object representing an advertised importable object"""
      +
      +    def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
      +        if not MODULE(module_name):
      +            raise ValueError("Invalid module name", module_name)
      +        self.name = name
      +        self.module_name = module_name
      +        self.attrs = tuple(attrs)
      +        self.extras = tuple(extras)
      +        self.dist = dist
      +
      +    def __str__(self):
      +        s = "%s = %s" % (self.name, self.module_name)
      +        if self.attrs:
      +            s += ':' + '.'.join(self.attrs)
      +        if self.extras:
      +            s += ' [%s]' % ','.join(self.extras)
      +        return s
      +
      +    def __repr__(self):
      +        return "EntryPoint.parse(%r)" % str(self)
      +
      +    def load(self, require=True, *args, **kwargs):
      +        """
      +        Require packages for this EntryPoint, then resolve it.
      +        """
      +        if not require or args or kwargs:
      +            warnings.warn(
      +                "Parameters to load are deprecated.  Call .resolve and "
      +                ".require separately.",
      +                PkgResourcesDeprecationWarning,
      +                stacklevel=2,
      +            )
      +        if require:
      +            self.require(*args, **kwargs)
      +        return self.resolve()
      +
      +    def resolve(self):
      +        """
      +        Resolve the entry point from its module and attrs.
      +        """
      +        module = __import__(self.module_name, fromlist=['__name__'], level=0)
      +        try:
      +            return functools.reduce(getattr, self.attrs, module)
      +        except AttributeError as exc:
      +            raise ImportError(str(exc)) from exc
      +
      +    def require(self, env=None, installer=None):
      +        if self.extras and not self.dist:
      +            raise UnknownExtra("Can't require() without a distribution", self)
      +
      +        # Get the requirements for this entry point with all its extras and
      +        # then resolve them. We have to pass `extras` along when resolving so
      +        # that the working set knows what extras we want. Otherwise, for
      +        # dist-info distributions, the working set will assume that the
      +        # requirements for that extra are purely optional and skip over them.
      +        reqs = self.dist.requires(self.extras)
      +        items = working_set.resolve(reqs, env, installer, extras=self.extras)
      +        list(map(working_set.add, items))
      +
      +    pattern = re.compile(
      +        r'\s*'
      +        r'(?P.+?)\s*'
      +        r'=\s*'
      +        r'(?P[\w.]+)\s*'
      +        r'(:\s*(?P[\w.]+))?\s*'
      +        r'(?P\[.*\])?\s*$'
      +    )
      +
      +    @classmethod
      +    def parse(cls, src, dist=None):
      +        """Parse a single entry point from string `src`
      +
      +        Entry point syntax follows the form::
      +
      +            name = some.module:some.attr [extra1, extra2]
      +
      +        The entry name and module name are required, but the ``:attrs`` and
      +        ``[extras]`` parts are optional
      +        """
      +        m = cls.pattern.match(src)
      +        if not m:
      +            msg = "EntryPoint must be in 'name=module:attrs [extras]' format"
      +            raise ValueError(msg, src)
      +        res = m.groupdict()
      +        extras = cls._parse_extras(res['extras'])
      +        attrs = res['attr'].split('.') if res['attr'] else ()
      +        return cls(res['name'], res['module'], attrs, extras, dist)
      +
      +    @classmethod
      +    def _parse_extras(cls, extras_spec):
      +        if not extras_spec:
      +            return ()
      +        req = Requirement.parse('x' + extras_spec)
      +        if req.specs:
      +            raise ValueError()
      +        return req.extras
      +
      +    @classmethod
      +    def parse_group(cls, group, lines, dist=None):
      +        """Parse an entry point group"""
      +        if not MODULE(group):
      +            raise ValueError("Invalid group name", group)
      +        this = {}
      +        for line in yield_lines(lines):
      +            ep = cls.parse(line, dist)
      +            if ep.name in this:
      +                raise ValueError("Duplicate entry point", group, ep.name)
      +            this[ep.name] = ep
      +        return this
      +
      +    @classmethod
      +    def parse_map(cls, data, dist=None):
      +        """Parse a map of entry point groups"""
      +        if isinstance(data, dict):
      +            data = data.items()
      +        else:
      +            data = split_sections(data)
      +        maps = {}
      +        for group, lines in data:
      +            if group is None:
      +                if not lines:
      +                    continue
      +                raise ValueError("Entry points must be listed in groups")
      +            group = group.strip()
      +            if group in maps:
      +                raise ValueError("Duplicate group name", group)
      +            maps[group] = cls.parse_group(group, lines, dist)
      +        return maps
      +
      +
      +def _version_from_file(lines):
      +    """
      +    Given an iterable of lines from a Metadata file, return
      +    the value of the Version field, if present, or None otherwise.
      +    """
      +
      +    def is_version_line(line):
      +        return line.lower().startswith('version:')
      +
      +    version_lines = filter(is_version_line, lines)
      +    line = next(iter(version_lines), '')
      +    _, _, value = line.partition(':')
      +    return safe_version(value.strip()) or None
      +
      +
      +class Distribution:
      +    """Wrap an actual or potential sys.path entry w/metadata"""
      +
      +    PKG_INFO = 'PKG-INFO'
      +
      +    def __init__(
      +        self,
      +        location=None,
      +        metadata=None,
      +        project_name=None,
      +        version=None,
      +        py_version=PY_MAJOR,
      +        platform=None,
      +        precedence=EGG_DIST,
      +    ):
      +        self.project_name = safe_name(project_name or 'Unknown')
      +        if version is not None:
      +            self._version = safe_version(version)
      +        self.py_version = py_version
      +        self.platform = platform
      +        self.location = location
      +        self.precedence = precedence
      +        self._provider = metadata or empty_provider
      +
      +    @classmethod
      +    def from_location(cls, location, basename, metadata=None, **kw):
      +        project_name, version, py_version, platform = [None] * 4
      +        basename, ext = os.path.splitext(basename)
      +        if ext.lower() in _distributionImpl:
      +            cls = _distributionImpl[ext.lower()]
      +
      +            match = EGG_NAME(basename)
      +            if match:
      +                project_name, version, py_version, platform = match.group(
      +                    'name', 'ver', 'pyver', 'plat'
      +                )
      +        return cls(
      +            location,
      +            metadata,
      +            project_name=project_name,
      +            version=version,
      +            py_version=py_version,
      +            platform=platform,
      +            **kw,
      +        )._reload_version()
      +
      +    def _reload_version(self):
      +        return self
      +
      +    @property
      +    def hashcmp(self):
      +        return (
      +            self._forgiving_parsed_version,
      +            self.precedence,
      +            self.key,
      +            self.location,
      +            self.py_version or '',
      +            self.platform or '',
      +        )
      +
      +    def __hash__(self):
      +        return hash(self.hashcmp)
      +
      +    def __lt__(self, other):
      +        return self.hashcmp < other.hashcmp
      +
      +    def __le__(self, other):
      +        return self.hashcmp <= other.hashcmp
      +
      +    def __gt__(self, other):
      +        return self.hashcmp > other.hashcmp
      +
      +    def __ge__(self, other):
      +        return self.hashcmp >= other.hashcmp
      +
      +    def __eq__(self, other):
      +        if not isinstance(other, self.__class__):
      +            # It's not a Distribution, so they are not equal
      +            return False
      +        return self.hashcmp == other.hashcmp
      +
      +    def __ne__(self, other):
      +        return not self == other
      +
      +    # These properties have to be lazy so that we don't have to load any
      +    # metadata until/unless it's actually needed.  (i.e., some distributions
      +    # may not know their name or version without loading PKG-INFO)
      +
      +    @property
      +    def key(self):
      +        try:
      +            return self._key
      +        except AttributeError:
      +            self._key = key = self.project_name.lower()
      +            return key
      +
      +    @property
      +    def parsed_version(self):
      +        if not hasattr(self, "_parsed_version"):
      +            try:
      +                self._parsed_version = parse_version(self.version)
      +            except packaging.version.InvalidVersion as ex:
      +                info = f"(package: {self.project_name})"
      +                if hasattr(ex, "add_note"):
      +                    ex.add_note(info)  # PEP 678
      +                    raise
      +                raise packaging.version.InvalidVersion(f"{str(ex)} {info}") from None
      +
      +        return self._parsed_version
      +
      +    @property
      +    def _forgiving_parsed_version(self):
      +        try:
      +            return self.parsed_version
      +        except packaging.version.InvalidVersion as ex:
      +            self._parsed_version = parse_version(_forgiving_version(self.version))
      +
      +            notes = "\n".join(getattr(ex, "__notes__", []))  # PEP 678
      +            msg = f"""!!\n\n
      +            *************************************************************************
      +            {str(ex)}\n{notes}
      +
      +            This is a long overdue deprecation.
      +            For the time being, `pkg_resources` will use `{self._parsed_version}`
      +            as a replacement to avoid breaking existing environments,
      +            but no future compatibility is guaranteed.
      +
      +            If you maintain package {self.project_name} you should implement
      +            the relevant changes to adequate the project to PEP 440 immediately.
      +            *************************************************************************
      +            \n\n!!
      +            """
      +            warnings.warn(msg, DeprecationWarning)
      +
      +            return self._parsed_version
      +
      +    @property
      +    def version(self):
      +        try:
      +            return self._version
      +        except AttributeError as e:
      +            version = self._get_version()
      +            if version is None:
      +                path = self._get_metadata_path_for_display(self.PKG_INFO)
      +                msg = ("Missing 'Version:' header and/or {} file at path: {}").format(
      +                    self.PKG_INFO, path
      +                )
      +                raise ValueError(msg, self) from e
      +
      +            return version
      +
      +    @property
      +    def _dep_map(self):
      +        """
      +        A map of extra to its list of (direct) requirements
      +        for this distribution, including the null extra.
      +        """
      +        try:
      +            return self.__dep_map
      +        except AttributeError:
      +            self.__dep_map = self._filter_extras(self._build_dep_map())
      +        return self.__dep_map
      +
      +    @staticmethod
      +    def _filter_extras(dm):
      +        """
      +        Given a mapping of extras to dependencies, strip off
      +        environment markers and filter out any dependencies
      +        not matching the markers.
      +        """
      +        for extra in list(filter(None, dm)):
      +            new_extra = extra
      +            reqs = dm.pop(extra)
      +            new_extra, _, marker = extra.partition(':')
      +            fails_marker = marker and (
      +                invalid_marker(marker) or not evaluate_marker(marker)
      +            )
      +            if fails_marker:
      +                reqs = []
      +            new_extra = safe_extra(new_extra) or None
      +
      +            dm.setdefault(new_extra, []).extend(reqs)
      +        return dm
      +
      +    def _build_dep_map(self):
      +        dm = {}
      +        for name in 'requires.txt', 'depends.txt':
      +            for extra, reqs in split_sections(self._get_metadata(name)):
      +                dm.setdefault(extra, []).extend(parse_requirements(reqs))
      +        return dm
      +
      +    def requires(self, extras=()):
      +        """List of Requirements needed for this distro if `extras` are used"""
      +        dm = self._dep_map
      +        deps = []
      +        deps.extend(dm.get(None, ()))
      +        for ext in extras:
      +            try:
      +                deps.extend(dm[safe_extra(ext)])
      +            except KeyError as e:
      +                raise UnknownExtra(
      +                    "%s has no such extra feature %r" % (self, ext)
      +                ) from e
      +        return deps
      +
      +    def _get_metadata_path_for_display(self, name):
      +        """
      +        Return the path to the given metadata file, if available.
      +        """
      +        try:
      +            # We need to access _get_metadata_path() on the provider object
      +            # directly rather than through this class's __getattr__()
      +            # since _get_metadata_path() is marked private.
      +            path = self._provider._get_metadata_path(name)
      +
      +        # Handle exceptions e.g. in case the distribution's metadata
      +        # provider doesn't support _get_metadata_path().
      +        except Exception:
      +            return '[could not detect]'
      +
      +        return path
      +
      +    def _get_metadata(self, name):
      +        if self.has_metadata(name):
      +            for line in self.get_metadata_lines(name):
      +                yield line
      +
      +    def _get_version(self):
      +        lines = self._get_metadata(self.PKG_INFO)
      +        version = _version_from_file(lines)
      +
      +        return version
      +
      +    def activate(self, path=None, replace=False):
      +        """Ensure distribution is importable on `path` (default=sys.path)"""
      +        if path is None:
      +            path = sys.path
      +        self.insert_on(path, replace=replace)
      +        if path is sys.path:
      +            fixup_namespace_packages(self.location)
      +            for pkg in self._get_metadata('namespace_packages.txt'):
      +                if pkg in sys.modules:
      +                    declare_namespace(pkg)
      +
      +    def egg_name(self):
      +        """Return what this distribution's standard .egg filename should be"""
      +        filename = "%s-%s-py%s" % (
      +            to_filename(self.project_name),
      +            to_filename(self.version),
      +            self.py_version or PY_MAJOR,
      +        )
      +
      +        if self.platform:
      +            filename += '-' + self.platform
      +        return filename
      +
      +    def __repr__(self):
      +        if self.location:
      +            return "%s (%s)" % (self, self.location)
      +        else:
      +            return str(self)
      +
      +    def __str__(self):
      +        try:
      +            version = getattr(self, 'version', None)
      +        except ValueError:
      +            version = None
      +        version = version or "[unknown version]"
      +        return "%s %s" % (self.project_name, version)
      +
      +    def __getattr__(self, attr):
      +        """Delegate all unrecognized public attributes to .metadata provider"""
      +        if attr.startswith('_'):
      +            raise AttributeError(attr)
      +        return getattr(self._provider, attr)
      +
      +    def __dir__(self):
      +        return list(
      +            set(super(Distribution, self).__dir__())
      +            | set(attr for attr in self._provider.__dir__() if not attr.startswith('_'))
      +        )
      +
      +    @classmethod
      +    def from_filename(cls, filename, metadata=None, **kw):
      +        return cls.from_location(
      +            _normalize_cached(filename), os.path.basename(filename), metadata, **kw
      +        )
      +
      +    def as_requirement(self):
      +        """Return a ``Requirement`` that matches this distribution exactly"""
      +        if isinstance(self.parsed_version, packaging.version.Version):
      +            spec = "%s==%s" % (self.project_name, self.parsed_version)
      +        else:
      +            spec = "%s===%s" % (self.project_name, self.parsed_version)
      +
      +        return Requirement.parse(spec)
      +
      +    def load_entry_point(self, group, name):
      +        """Return the `name` entry point of `group` or raise ImportError"""
      +        ep = self.get_entry_info(group, name)
      +        if ep is None:
      +            raise ImportError("Entry point %r not found" % ((group, name),))
      +        return ep.load()
      +
      +    def get_entry_map(self, group=None):
      +        """Return the entry point map for `group`, or the full entry map"""
      +        try:
      +            ep_map = self._ep_map
      +        except AttributeError:
      +            ep_map = self._ep_map = EntryPoint.parse_map(
      +                self._get_metadata('entry_points.txt'), self
      +            )
      +        if group is not None:
      +            return ep_map.get(group, {})
      +        return ep_map
      +
      +    def get_entry_info(self, group, name):
      +        """Return the EntryPoint object for `group`+`name`, or ``None``"""
      +        return self.get_entry_map(group).get(name)
      +
      +    # FIXME: 'Distribution.insert_on' is too complex (13)
      +    def insert_on(self, path, loc=None, replace=False):  # noqa: C901
      +        """Ensure self.location is on path
      +
      +        If replace=False (default):
      +            - If location is already in path anywhere, do nothing.
      +            - Else:
      +              - If it's an egg and its parent directory is on path,
      +                insert just ahead of the parent.
      +              - Else: add to the end of path.
      +        If replace=True:
      +            - If location is already on path anywhere (not eggs)
      +              or higher priority than its parent (eggs)
      +              do nothing.
      +            - Else:
      +              - If it's an egg and its parent directory is on path,
      +                insert just ahead of the parent,
      +                removing any lower-priority entries.
      +              - Else: add it to the front of path.
      +        """
      +
      +        loc = loc or self.location
      +        if not loc:
      +            return
      +
      +        nloc = _normalize_cached(loc)
      +        bdir = os.path.dirname(nloc)
      +        npath = [(p and _normalize_cached(p) or p) for p in path]
      +
      +        for p, item in enumerate(npath):
      +            if item == nloc:
      +                if replace:
      +                    break
      +                else:
      +                    # don't modify path (even removing duplicates) if
      +                    # found and not replace
      +                    return
      +            elif item == bdir and self.precedence == EGG_DIST:
      +                # if it's an .egg, give it precedence over its directory
      +                # UNLESS it's already been added to sys.path and replace=False
      +                if (not replace) and nloc in npath[p:]:
      +                    return
      +                if path is sys.path:
      +                    self.check_version_conflict()
      +                path.insert(p, loc)
      +                npath.insert(p, nloc)
      +                break
      +        else:
      +            if path is sys.path:
      +                self.check_version_conflict()
      +            if replace:
      +                path.insert(0, loc)
      +            else:
      +                path.append(loc)
      +            return
      +
      +        # p is the spot where we found or inserted loc; now remove duplicates
      +        while True:
      +            try:
      +                np = npath.index(nloc, p + 1)
      +            except ValueError:
      +                break
      +            else:
      +                del npath[np], path[np]
      +                # ha!
      +                p = np
      +
      +        return
      +
      +    def check_version_conflict(self):
      +        if self.key == 'setuptools':
      +            # ignore the inevitable setuptools self-conflicts  :(
      +            return
      +
      +        nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
      +        loc = normalize_path(self.location)
      +        for modname in self._get_metadata('top_level.txt'):
      +            if (
      +                modname not in sys.modules
      +                or modname in nsp
      +                or modname in _namespace_packages
      +            ):
      +                continue
      +            if modname in ('pkg_resources', 'setuptools', 'site'):
      +                continue
      +            fn = getattr(sys.modules[modname], '__file__', None)
      +            if fn and (
      +                normalize_path(fn).startswith(loc) or fn.startswith(self.location)
      +            ):
      +                continue
      +            issue_warning(
      +                "Module %s was already imported from %s, but %s is being added"
      +                " to sys.path" % (modname, fn, self.location),
      +            )
      +
      +    def has_version(self):
      +        try:
      +            self.version
      +        except ValueError:
      +            issue_warning("Unbuilt egg for " + repr(self))
      +            return False
      +        except SystemError:
      +            # TODO: remove this except clause when python/cpython#103632 is fixed.
      +            return False
      +        return True
      +
      +    def clone(self, **kw):
      +        """Copy this distribution, substituting in any changed keyword args"""
      +        names = 'project_name version py_version platform location precedence'
      +        for attr in names.split():
      +            kw.setdefault(attr, getattr(self, attr, None))
      +        kw.setdefault('metadata', self._provider)
      +        return self.__class__(**kw)
      +
      +    @property
      +    def extras(self):
      +        return [dep for dep in self._dep_map if dep]
      +
      +
      +class EggInfoDistribution(Distribution):
      +    def _reload_version(self):
      +        """
      +        Packages installed by distutils (e.g. numpy or scipy),
      +        which uses an old safe_version, and so
      +        their version numbers can get mangled when
      +        converted to filenames (e.g., 1.11.0.dev0+2329eae to
      +        1.11.0.dev0_2329eae). These distributions will not be
      +        parsed properly
      +        downstream by Distribution and safe_version, so
      +        take an extra step and try to get the version number from
      +        the metadata file itself instead of the filename.
      +        """
      +        md_version = self._get_version()
      +        if md_version:
      +            self._version = md_version
      +        return self
      +
      +
      +class DistInfoDistribution(Distribution):
      +    """
      +    Wrap an actual or potential sys.path entry
      +    w/metadata, .dist-info style.
      +    """
      +
      +    PKG_INFO = 'METADATA'
      +    EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])")
      +
      +    @property
      +    def _parsed_pkg_info(self):
      +        """Parse and cache metadata"""
      +        try:
      +            return self._pkg_info
      +        except AttributeError:
      +            metadata = self.get_metadata(self.PKG_INFO)
      +            self._pkg_info = email.parser.Parser().parsestr(metadata)
      +            return self._pkg_info
      +
      +    @property
      +    def _dep_map(self):
      +        try:
      +            return self.__dep_map
      +        except AttributeError:
      +            self.__dep_map = self._compute_dependencies()
      +            return self.__dep_map
      +
      +    def _compute_dependencies(self):
      +        """Recompute this distribution's dependencies."""
      +        dm = self.__dep_map = {None: []}
      +
      +        reqs = []
      +        # Including any condition expressions
      +        for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
      +            reqs.extend(parse_requirements(req))
      +
      +        def reqs_for_extra(extra):
      +            for req in reqs:
      +                if not req.marker or req.marker.evaluate({'extra': extra}):
      +                    yield req
      +
      +        common = types.MappingProxyType(dict.fromkeys(reqs_for_extra(None)))
      +        dm[None].extend(common)
      +
      +        for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
      +            s_extra = safe_extra(extra.strip())
      +            dm[s_extra] = [r for r in reqs_for_extra(extra) if r not in common]
      +
      +        return dm
      +
      +
      +_distributionImpl = {
      +    '.egg': Distribution,
      +    '.egg-info': EggInfoDistribution,
      +    '.dist-info': DistInfoDistribution,
      +}
      +
      +
      +def issue_warning(*args, **kw):
      +    level = 1
      +    g = globals()
      +    try:
      +        # find the first stack frame that is *not* code in
      +        # the pkg_resources module, to use for the warning
      +        while sys._getframe(level).f_globals is g:
      +            level += 1
      +    except ValueError:
      +        pass
      +    warnings.warn(stacklevel=level + 1, *args, **kw)
      +
      +
      +def parse_requirements(strs):
      +    """
      +    Yield ``Requirement`` objects for each specification in `strs`.
      +
      +    `strs` must be a string, or a (possibly-nested) iterable thereof.
      +    """
      +    return map(Requirement, join_continuation(map(drop_comment, yield_lines(strs))))
      +
      +
      +class RequirementParseError(packaging.requirements.InvalidRequirement):
      +    "Compatibility wrapper for InvalidRequirement"
      +
      +
      +class Requirement(packaging.requirements.Requirement):
      +    def __init__(self, requirement_string):
      +        """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
      +        super(Requirement, self).__init__(requirement_string)
      +        self.unsafe_name = self.name
      +        project_name = safe_name(self.name)
      +        self.project_name, self.key = project_name, project_name.lower()
      +        self.specs = [(spec.operator, spec.version) for spec in self.specifier]
      +        self.extras = tuple(map(safe_extra, self.extras))
      +        self.hashCmp = (
      +            self.key,
      +            self.url,
      +            self.specifier,
      +            frozenset(self.extras),
      +            str(self.marker) if self.marker else None,
      +        )
      +        self.__hash = hash(self.hashCmp)
      +
      +    def __eq__(self, other):
      +        return isinstance(other, Requirement) and self.hashCmp == other.hashCmp
      +
      +    def __ne__(self, other):
      +        return not self == other
      +
      +    def __contains__(self, item):
      +        if isinstance(item, Distribution):
      +            if item.key != self.key:
      +                return False
      +
      +            item = item.version
      +
      +        # Allow prereleases always in order to match the previous behavior of
      +        # this method. In the future this should be smarter and follow PEP 440
      +        # more accurately.
      +        return self.specifier.contains(item, prereleases=True)
      +
      +    def __hash__(self):
      +        return self.__hash
      +
      +    def __repr__(self):
      +        return "Requirement.parse(%r)" % str(self)
      +
      +    @staticmethod
      +    def parse(s):
      +        (req,) = parse_requirements(s)
      +        return req
      +
      +
      +def _always_object(classes):
      +    """
      +    Ensure object appears in the mro even
      +    for old-style classes.
      +    """
      +    if object not in classes:
      +        return classes + (object,)
      +    return classes
      +
      +
      +def _find_adapter(registry, ob):
      +    """Return an adapter factory for `ob` from `registry`"""
      +    types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob))))
      +    for t in types:
      +        if t in registry:
      +            return registry[t]
      +
      +
      +def ensure_directory(path):
      +    """Ensure that the parent directory of `path` exists"""
      +    dirname = os.path.dirname(path)
      +    os.makedirs(dirname, exist_ok=True)
      +
      +
      +def _bypass_ensure_directory(path):
      +    """Sandbox-bypassing version of ensure_directory()"""
      +    if not WRITE_SUPPORT:
      +        raise IOError('"os.mkdir" not supported on this platform.')
      +    dirname, filename = split(path)
      +    if dirname and filename and not isdir(dirname):
      +        _bypass_ensure_directory(dirname)
      +        try:
      +            mkdir(dirname, 0o755)
      +        except FileExistsError:
      +            pass
      +
      +
      +def split_sections(s):
      +    """Split a string or iterable thereof into (section, content) pairs
      +
      +    Each ``section`` is a stripped version of the section header ("[section]")
      +    and each ``content`` is a list of stripped lines excluding blank lines and
      +    comment-only lines.  If there are any such lines before the first section
      +    header, they're returned in a first ``section`` of ``None``.
      +    """
      +    section = None
      +    content = []
      +    for line in yield_lines(s):
      +        if line.startswith("["):
      +            if line.endswith("]"):
      +                if section or content:
      +                    yield section, content
      +                section = line[1:-1].strip()
      +                content = []
      +            else:
      +                raise ValueError("Invalid section heading", line)
      +        else:
      +            content.append(line)
      +
      +    # wrap up last segment
      +    yield section, content
      +
      +
      +def _mkstemp(*args, **kw):
      +    old_open = os.open
      +    try:
      +        # temporarily bypass sandboxing
      +        os.open = os_open
      +        return tempfile.mkstemp(*args, **kw)
      +    finally:
      +        # and then put it back
      +        os.open = old_open
      +
      +
      +# Silence the PEP440Warning by default, so that end users don't get hit by it
      +# randomly just because they use pkg_resources. We want to append the rule
      +# because we want earlier uses of filterwarnings to take precedence over this
      +# one.
      +warnings.filterwarnings("ignore", category=PEP440Warning, append=True)
      +
      +
      +# from jaraco.functools 1.3
      +def _call_aside(f, *args, **kwargs):
      +    f(*args, **kwargs)
      +    return f
      +
      +
      +@_call_aside
      +def _initialize(g=globals()):
      +    "Set up global resource manager (deliberately not state-saved)"
      +    manager = ResourceManager()
      +    g['_manager'] = manager
      +    g.update(
      +        (name, getattr(manager, name))
      +        for name in dir(manager)
      +        if not name.startswith('_')
      +    )
      +
      +
      +class PkgResourcesDeprecationWarning(Warning):
      +    """
      +    Base class for warning about deprecations in ``pkg_resources``
      +
      +    This class is not derived from ``DeprecationWarning``, and as such is
      +    visible by default.
      +    """
      +
      +
      +@_call_aside
      +def _initialize_master_working_set():
      +    """
      +    Prepare the master working set and make the ``require()``
      +    API available.
      +
      +    This function has explicit effects on the global state
      +    of pkg_resources. It is intended to be invoked once at
      +    the initialization of this module.
      +
      +    Invocation by other packages is unsupported and done
      +    at their own risk.
      +    """
      +    working_set = WorkingSet._build_master()
      +    _declare_state('object', working_set=working_set)
      +
      +    require = working_set.require
      +    iter_entry_points = working_set.iter_entry_points
      +    add_activation_listener = working_set.subscribe
      +    run_script = working_set.run_script
      +    # backward compatibility
      +    run_main = run_script
      +    # Activate all distributions already on sys.path with replace=False and
      +    # ensure that all distributions added to the working set in the future
      +    # (e.g. by calling ``require()``) will get activated as well,
      +    # with higher priority (replace=True).
      +    tuple(dist.activate(replace=False) for dist in working_set)
      +    add_activation_listener(
      +        lambda dist: dist.activate(replace=True),
      +        existing=False,
      +    )
      +    working_set.entries = []
      +    # match order
      +    list(map(working_set.add_entry, sys.path))
      +    globals().update(locals())
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..beecc150da03d65c50f4e6ca8fc537b131551f47
      GIT binary patch
      literal 146493
      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	i{J>i}{F>*lw
      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
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py
      new file mode 100644
      index 0000000..5ebf595
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py
      @@ -0,0 +1,566 @@
      +"""
      +Utilities for determining application-specific dirs. See  for details and
      +usage.
      +"""
      +from __future__ import annotations
      +
      +import os
      +import sys
      +from typing import TYPE_CHECKING
      +
      +from .api import PlatformDirsABC
      +from .version import __version__
      +from .version import __version_tuple__ as __version_info__
      +
      +if TYPE_CHECKING:
      +    from pathlib import Path
      +
      +    if sys.version_info >= (3, 8):  # pragma: no cover (py38+)
      +        from typing import Literal
      +    else:  # pragma: no cover (py38+)
      +        from pip._vendor.typing_extensions import Literal
      +
      +
      +def _set_platform_dir_class() -> type[PlatformDirsABC]:
      +    if sys.platform == "win32":
      +        from pip._vendor.platformdirs.windows import Windows as Result
      +    elif sys.platform == "darwin":
      +        from pip._vendor.platformdirs.macos import MacOS as Result
      +    else:
      +        from pip._vendor.platformdirs.unix import Unix as Result
      +
      +    if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system":
      +        if os.getenv("SHELL") or os.getenv("PREFIX"):
      +            return Result
      +
      +        from pip._vendor.platformdirs.android import _android_folder
      +
      +        if _android_folder() is not None:
      +            from pip._vendor.platformdirs.android import Android
      +
      +            return Android  # return to avoid redefinition of result
      +
      +    return Result
      +
      +
      +PlatformDirs = _set_platform_dir_class()  #: Currently active platform
      +AppDirs = PlatformDirs  #: Backwards compatibility with appdirs
      +
      +
      +def user_data_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    roaming: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param roaming: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: data directory tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        roaming=roaming,
      +        ensure_exists=ensure_exists,
      +    ).user_data_dir
      +
      +
      +def site_data_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    multipath: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param multipath: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: data directory shared by users
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        multipath=multipath,
      +        ensure_exists=ensure_exists,
      +    ).site_data_dir
      +
      +
      +def user_config_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    roaming: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param roaming: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: config directory tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        roaming=roaming,
      +        ensure_exists=ensure_exists,
      +    ).user_config_dir
      +
      +
      +def site_config_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    multipath: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param multipath: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: config directory shared by the users
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        multipath=multipath,
      +        ensure_exists=ensure_exists,
      +    ).site_config_dir
      +
      +
      +def user_cache_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    opinion: bool = True,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param opinion: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: cache directory tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        opinion=opinion,
      +        ensure_exists=ensure_exists,
      +    ).user_cache_dir
      +
      +
      +def site_cache_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    opinion: bool = True,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param opinion: See `opinion `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: cache directory tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        opinion=opinion,
      +        ensure_exists=ensure_exists,
      +    ).site_cache_dir
      +
      +
      +def user_state_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    roaming: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param roaming: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: state directory tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        roaming=roaming,
      +        ensure_exists=ensure_exists,
      +    ).user_state_dir
      +
      +
      +def user_log_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    opinion: bool = True,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param opinion: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: log directory tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        opinion=opinion,
      +        ensure_exists=ensure_exists,
      +    ).user_log_dir
      +
      +
      +def user_documents_dir() -> str:
      +    """:returns: documents directory tied to the user"""
      +    return PlatformDirs().user_documents_dir
      +
      +
      +def user_downloads_dir() -> str:
      +    """:returns: downloads directory tied to the user"""
      +    return PlatformDirs().user_downloads_dir
      +
      +
      +def user_pictures_dir() -> str:
      +    """:returns: pictures directory tied to the user"""
      +    return PlatformDirs().user_pictures_dir
      +
      +
      +def user_videos_dir() -> str:
      +    """:returns: videos directory tied to the user"""
      +    return PlatformDirs().user_videos_dir
      +
      +
      +def user_music_dir() -> str:
      +    """:returns: music directory tied to the user"""
      +    return PlatformDirs().user_music_dir
      +
      +
      +def user_runtime_dir(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    opinion: bool = True,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> str:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param opinion: See `opinion `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: runtime directory tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        opinion=opinion,
      +        ensure_exists=ensure_exists,
      +    ).user_runtime_dir
      +
      +
      +def user_data_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    roaming: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param roaming: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: data path tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        roaming=roaming,
      +        ensure_exists=ensure_exists,
      +    ).user_data_path
      +
      +
      +def site_data_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    multipath: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param multipath: See `multipath `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: data path shared by users
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        multipath=multipath,
      +        ensure_exists=ensure_exists,
      +    ).site_data_path
      +
      +
      +def user_config_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    roaming: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param roaming: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: config path tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        roaming=roaming,
      +        ensure_exists=ensure_exists,
      +    ).user_config_path
      +
      +
      +def site_config_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    multipath: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param multipath: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: config path shared by the users
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        multipath=multipath,
      +        ensure_exists=ensure_exists,
      +    ).site_config_path
      +
      +
      +def site_cache_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    opinion: bool = True,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param opinion: See `opinion `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: cache directory tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        opinion=opinion,
      +        ensure_exists=ensure_exists,
      +    ).site_cache_path
      +
      +
      +def user_cache_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    opinion: bool = True,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param opinion: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: cache path tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        opinion=opinion,
      +        ensure_exists=ensure_exists,
      +    ).user_cache_path
      +
      +
      +def user_state_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    roaming: bool = False,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param roaming: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: state path tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        roaming=roaming,
      +        ensure_exists=ensure_exists,
      +    ).user_state_path
      +
      +
      +def user_log_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    opinion: bool = True,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param opinion: See `roaming `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: log path tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        opinion=opinion,
      +        ensure_exists=ensure_exists,
      +    ).user_log_path
      +
      +
      +def user_documents_path() -> Path:
      +    """:returns: documents path tied to the user"""
      +    return PlatformDirs().user_documents_path
      +
      +
      +def user_downloads_path() -> Path:
      +    """:returns: downloads path tied to the user"""
      +    return PlatformDirs().user_downloads_path
      +
      +
      +def user_pictures_path() -> Path:
      +    """:returns: pictures path tied to the user"""
      +    return PlatformDirs().user_pictures_path
      +
      +
      +def user_videos_path() -> Path:
      +    """:returns: videos path tied to the user"""
      +    return PlatformDirs().user_videos_path
      +
      +
      +def user_music_path() -> Path:
      +    """:returns: music path tied to the user"""
      +    return PlatformDirs().user_music_path
      +
      +
      +def user_runtime_path(
      +    appname: str | None = None,
      +    appauthor: str | None | Literal[False] = None,
      +    version: str | None = None,
      +    opinion: bool = True,  # noqa: FBT001, FBT002
      +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +) -> Path:
      +    """
      +    :param appname: See `appname `.
      +    :param appauthor: See `appauthor `.
      +    :param version: See `version `.
      +    :param opinion: See `opinion `.
      +    :param ensure_exists: See `ensure_exists `.
      +    :returns: runtime path tied to the user
      +    """
      +    return PlatformDirs(
      +        appname=appname,
      +        appauthor=appauthor,
      +        version=version,
      +        opinion=opinion,
      +        ensure_exists=ensure_exists,
      +    ).user_runtime_path
      +
      +
      +__all__ = [
      +    "__version__",
      +    "__version_info__",
      +    "PlatformDirs",
      +    "AppDirs",
      +    "PlatformDirsABC",
      +    "user_data_dir",
      +    "user_config_dir",
      +    "user_cache_dir",
      +    "user_state_dir",
      +    "user_log_dir",
      +    "user_documents_dir",
      +    "user_downloads_dir",
      +    "user_pictures_dir",
      +    "user_videos_dir",
      +    "user_music_dir",
      +    "user_runtime_dir",
      +    "site_data_dir",
      +    "site_config_dir",
      +    "site_cache_dir",
      +    "user_data_path",
      +    "user_config_path",
      +    "user_cache_path",
      +    "user_state_path",
      +    "user_log_path",
      +    "user_documents_path",
      +    "user_downloads_path",
      +    "user_pictures_path",
      +    "user_videos_path",
      +    "user_music_path",
      +    "user_runtime_path",
      +    "site_data_path",
      +    "site_config_path",
      +    "site_cache_path",
      +]
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py
      new file mode 100644
      index 0000000..6a0d6dd
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py
      @@ -0,0 +1,53 @@
      +"""Main entry point."""
      +from __future__ import annotations
      +
      +from pip._vendor.platformdirs import PlatformDirs, __version__
      +
      +PROPS = (
      +    "user_data_dir",
      +    "user_config_dir",
      +    "user_cache_dir",
      +    "user_state_dir",
      +    "user_log_dir",
      +    "user_documents_dir",
      +    "user_downloads_dir",
      +    "user_pictures_dir",
      +    "user_videos_dir",
      +    "user_music_dir",
      +    "user_runtime_dir",
      +    "site_data_dir",
      +    "site_config_dir",
      +    "site_cache_dir",
      +)
      +
      +
      +def main() -> None:
      +    """Run main entry point."""
      +    app_name = "MyApp"
      +    app_author = "MyCompany"
      +
      +    print(f"-- platformdirs {__version__} --")  # noqa: T201
      +
      +    print("-- app dirs (with optional 'version')")  # noqa: T201
      +    dirs = PlatformDirs(app_name, app_author, version="1.0")
      +    for prop in PROPS:
      +        print(f"{prop}: {getattr(dirs, prop)}")  # noqa: T201
      +
      +    print("\n-- app dirs (without optional 'version')")  # noqa: T201
      +    dirs = PlatformDirs(app_name, app_author)
      +    for prop in PROPS:
      +        print(f"{prop}: {getattr(dirs, prop)}")  # noqa: T201
      +
      +    print("\n-- app dirs (without optional 'appauthor')")  # noqa: T201
      +    dirs = PlatformDirs(app_name)
      +    for prop in PROPS:
      +        print(f"{prop}: {getattr(dirs, prop)}")  # noqa: T201
      +
      +    print("\n-- app dirs (with disabled 'appauthor')")  # noqa: T201
      +    dirs = PlatformDirs(app_name, appauthor=False)
      +    for prop in PROPS:
      +        print(f"{prop}: {getattr(dirs, prop)}")  # noqa: T201
      +
      +
      +if __name__ == "__main__":
      +    main()
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..ea79ed42feaae997ec9494beb936a33308d14223
      GIT binary patch
      literal 18048
      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
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..a7f19a79f4d4c4bbf71469c0cc6f5caeb6b659a8
      GIT binary patch
      literal 9691
      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
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..a4c25bf4f591f353d00baffe94c5a39533d250ef
      GIT binary patch
      literal 12460
      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
      QitYslAQGJDTLcP10IPmt!vFvP
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..788814e71651d0310091cb9f80ea8927ff3bc1c8
      GIT binary patch
      literal 13018
      zcmd5jTW}OtcHQ%A&8tTbFcKIV1409OAS7VHvOvs8phXg(2VP{^qhY!wjWjbozTJb+
      z?BEE;iN)F*?5eFG5^q^{C1nx3Wmo0LRr$$ZQkDG}F{;v}jjNp6-Ky{>ubf(kpXA)z
      zkC~B17`(~ax1`&*&wci}=Y8+|o7?T6ApL0S(zvjXqJD#4^kh{F^xChXaGT<(VTz}D
      zQy7pJAhhq#rGR-B=DT$Dp{
      zM2t&)@Lm>0$zV7Xo)F;0J$U&-XV8DP(|@kJ@61Cy2|(Ek(U3eQqF5k;q>j^m05Seh
      zG#a`R6~fx&@(l<}Ag~Pv
      z#7iLF0!TT5lovoM2&AF_QVH9#MX_t!653*-CKb7&@lZ_Q+7cQ?@IVobp+ux{9f<&pv}_-(H+qJW@`Q+;}4wKRGPaVd#}pl~fB$N65|*Wa
      zlSj#>SX^!jHw^*8q^2%G7UEn0MfgZlK#-BO~I=$y@;9$8Mz5oNOVPFMsec}3Sz+%gbhq>
      z(bY&1_*uNrHpphFRS&hd?xVI3+umg}M}9nKeZZFAn!Y)`!tPpPcm17bF`4C#WZ9#0
      zmKIdKSjMUA=1q9u
      zZvd|M!~<)Ir;{`~Si0^SExG7Tco@9(^`^M3WQ#nw;S?zX*S%XzoncE9VM
      zA6xeB%eg9U_1^5A-}`?3o%&_h{v5j_!`3Yhelqe8BYL~ovbP?OnEqK>2l4Mm??jiq
      z2Q>z|mA;vt4`kQ_3rFv>2Y`JT*9zlXVtk8xmzgH$JLg2(V3noSg$y;fDV(dR6l;_s
      zZ`n{0{6=+vx7$z``pCc%MoYZaslm;(fHV<8pa-tZ5FH??N&uv_|HQ}zB#y&&5usmF
      z+$&Y8@b#bX?LFV8i{!i3JeeR&h^PW*cysTX@)RLqxuEU5;>IGegnTOkAA=536J)d0
      z*EY&qQ7F+eO`Tb;E6biKA<{PP2o_>QfMKfKOo0R5=#<~U8z_UZ$T(+EcM1I|VPh;L
      zaic|IdGs!go`HGbf!RUAldA-;u%w|nG7;?06bbfx#S7494J#rL?eOVUs?5$XyZ@MP
      z>)QO=@>HQ)2S6Fd=N0YBsEPT;jI+mW
      zgvu*A!c)dZ6vHnRY{Zj^#>Z~Nlgr1`2C5{8Vmyu?3gkzzcti&=4%SN#l>*72B`DB<
      zU&4J$%MJ@v5g|Vhh0TOKv6eJWhh|1X%`)y!QYovjw8{nbtc^v+HS9Qjq(Zd}RwJ>(
      zQsV{+qvChcFB}LO>~|Fk8zBm@g3-|)aa;mf0|F)@D;E6bvk_&4cEOqo^z?50`W((S
      z$O0GHE?67chpHk;pg~`PjuO^UMd}F{U$xR6RBpL_?A>Fx+um(kuq=#aD;wqlIhS|E
      z)v)AhSmc*oE#GE2^~2cz*W#bpMSTYHc`=-f32_J!Y_8&oU7Q7xhi
      zo&5vn`#O5=S_*KSw}sXddxgpo`Zxs9HARRvR)_0&jBdPvB@LmIS?*Mp?Z_}4kCCu{
      z5`<32qhg5vE(q0n0zz38p@H)+_Vt|a2n--hW*el1jzFznNdy+uMIMX5Q(3Mf%bw0K
      zr@s#b_81hIh=d_<1988nCCCd}M?jxfMPKjb3*G*~q5jTI@K;U62JDp|y8OHy8VDGGfy{i#k5T71*mq<6joEB&5y?m)V(0RTz*{SxsIuk*fVd4^e
      z<|`yX+1gIXN^tDrpJlm|S@u+hIrV*DEbj%xl2Ro6)Wp_{dlllVcW9v7Um9PkQYZ5e
      zbQ#tRL6-r?#y&cWvkeXb_JoO2{}c+}Nh3f%HI?+f4NqHdMN#=+Y~K6kO}e7jgDT&y
      z@Il|0Q-5KY;s&9jWL%Db3Z;hf|HYRX4zbTY^1c1a(wzotOfK%f8Vb
      z@RH5aR!z2XTal<}Yt`jY6MBJFo+$iU{G-cgE5g$
      zMse8{48EESMYS4xFbFCZzzoE169STFR5J-jEmZfm0hbQptOaLBaE2oi=mgH%an^ye
      z0M4*ugwElt53;)|A*(?yeDH~IhF32g0aN=8>MN7O%B*gqY@Xkn7;D{{8A_|Tv|2@-
      zq0iC(MY*k2t2;@(*{Fxos)N8x*5|Z7P+Da+h1skpwRTWi^=jkkFf+h5AJ1m3GWu3&
      zeNEQWv@!8%+L+m&hx+r-Kpq;%Lp$=&j>ki7+LwQ2f)XJKg2$p*n+1?c|@;FDmfQL*c1
      zBy2}d4?fBn(9Uuc7dbA`s(ogJ!_2BbisJ*1s)piIadA4%5#xcwEOLTN?HGznFmb8L
      zPH;Y}QdfMc5{!%m!%~Egs>}xtN)WojX#!Hr&{A<+!siN|2#JVDAjPhY?6WA2d`Hal
      z5*(l^F0D5iPBF)%aS3lWj>{0nQg*DHAEQQ}QbGc>eG~pAoXt|dbszb3GVAV`?aJBR
      z8GCh(-7@Ef&|1x&9M_!N)$oG6d9Q&+1Jp~RK>iZ5sV;D+JPps(l4kgbgcoPm&=;Y29#K&NjmLKRUt-6{X
      zz__&iKv!umS|#%XU1eF(Djh%2RXX#loN@WwsdI(G67D;M3WORQeTQU@7s18C@e^`G
      z0LSk`@sd)m5#hsC#aVDFu9O+hKRSgg;a&4HksrS^x-W*h@T*OAFVK(iic
      zx4?+;MFIt*&;&y3A$Sx-)zQoFPO|rKMLFoVS?WuBd1lML`}TbWr&RBqe*es!Gb=ml
      zmv+>D-2ch&-QmyNOATGw9cTV^dzKx_FhitQ?R|Ug)A!nc-@gCJdevmv!3;A9bG;M1
      zZ{Pc5owjA!{tVOqbe*2bvKKSVMF=@<6s!1rjEGe@Sq8DH>wVseFNg6AU-lj|2{r3e
      zfd!!IXQyTXm}D4DP5EmVU;$u-L{h1cA@7<3dlA`WMsM{x&AWL=)C$Mv=1Hu1*Cl{@
      z)`8%a_vj=}j>AhG^;+QcPYXnj!1KEGx=qHGEJLjSkXea3Ugc@CSFF;JEh+Twma1Av_U}yqbhlFPXa{NOB|By+1~n3E#QFfl2TV
      z;l5AdaA3M141fUTcoNQoZO#F$1lcWa3x89cavKx`YW&@MCeBOsf0Pl)*
      zIudU=jPSOkP7T2IuxU7W9qH9Ci;ZYL)QCR`7>LW4)H_xqo!1gkxOj#}1||eRLKnHQ
      zBKaKX6&MHw@yKRrMgqS@y91_F_K9+LED;s3Jt*+R!cuH7JM5=oKMxmO&IvP0`Pp-w
      zmxKPH{{GIs!5|iCitA!hKr^aYc8&N|K0A>=O1Xq5*RIPD1B}EV5w=Pc^ArqMW_Yg(
      z9h9&ajSVwMkFm{k`a)@F{t5g`Sf)V;*-Ol@L%CgzxthJX?f%>jU#@x&{C!nkR&D!3
      zMcyi_q^w)PM`Efoc5V}^%F}%}dqI
      znU9FXyi5|Soy
      z5NTbS+`bL~uchbU%XQp=30ZO#AVn)u&lCtya?l%=XAx2nIMu(ZrW{8G<@+
      z8_`g7`70tkH5H(!zou`~H1&3sg_@y%WuB&ericFn-SM?#vxs}n(w)X>lt#g_)9_C}-i?_gvJ@63Nv-^^0?9sA}x-fo$D^{u1t
      z_}olzcn8kHCaD7S0$d1uQ89<&GYT^$ptul)2IWva0C!?#T-ygu?~96+Tz*?;pF!j)
      z1glY;s+S5k96(F*7-ELW(O=?{1xkk{?9O2!sEfhsO)-S-K+|8tzqAS&xxiPmBgZ|L
      z+qFAavpu(CXRdlX{@ea6$iT|=GSG`N{$0&vHMal%e4R4zOAEo0+y%L;pN
      zi9NU&$g<7&aIgH<$(tuvob^l2`o)1yF5kWUndLKn+3C+!Y@PF$GB4--?|0wnUifL2
      zZOJe#UphUvj^8|Jw;pVAFv1SGY41AP<$lekC?YSM}5e)
      zn*Wh*H3PHSW1(wOBqjJPgieVjF9?WkfL??ld?wN&Ri*!u;H8&-mW;#QVlgTqydR1UWFT072n#)6wnPMB!$4ufVibO=
      zKz{Sk7`hTh*dQjMJQAf*T^wu^sK~~MB3H;12-1Qf2$R2vL0EVY>*5j9rbcz!(cc3M
      z%Qs1c3@}8~|4w`_. Makes use of the
      +    `appname `,
      +    `version `,
      +    `ensure_exists `.
      +    """
      +
      +    @property
      +    def user_data_dir(self) -> str:
      +        """:return: data directory tied to the user, e.g. ``/data/user///files/``"""
      +        return self._append_app_name_and_version(cast(str, _android_folder()), "files")
      +
      +    @property
      +    def site_data_dir(self) -> str:
      +        """:return: data directory shared by users, same as `user_data_dir`"""
      +        return self.user_data_dir
      +
      +    @property
      +    def user_config_dir(self) -> str:
      +        """
      +        :return: config directory tied to the user, e.g. \
      +        ``/data/user///shared_prefs/``
      +        """
      +        return self._append_app_name_and_version(cast(str, _android_folder()), "shared_prefs")
      +
      +    @property
      +    def site_config_dir(self) -> str:
      +        """:return: config directory shared by the users, same as `user_config_dir`"""
      +        return self.user_config_dir
      +
      +    @property
      +    def user_cache_dir(self) -> str:
      +        """:return: cache directory tied to the user, e.g. e.g. ``/data/user///cache/``"""
      +        return self._append_app_name_and_version(cast(str, _android_folder()), "cache")
      +
      +    @property
      +    def site_cache_dir(self) -> str:
      +        """:return: cache directory shared by users, same as `user_cache_dir`"""
      +        return self.user_cache_dir
      +
      +    @property
      +    def user_state_dir(self) -> str:
      +        """:return: state directory tied to the user, same as `user_data_dir`"""
      +        return self.user_data_dir
      +
      +    @property
      +    def user_log_dir(self) -> str:
      +        """
      +        :return: log directory tied to the user, same as `user_cache_dir` if not opinionated else ``log`` in it,
      +          e.g. ``/data/user///cache//log``
      +        """
      +        path = self.user_cache_dir
      +        if self.opinion:
      +            path = os.path.join(path, "log")  # noqa: PTH118
      +        return path
      +
      +    @property
      +    def user_documents_dir(self) -> str:
      +        """:return: documents directory tied to the user e.g. ``/storage/emulated/0/Documents``"""
      +        return _android_documents_folder()
      +
      +    @property
      +    def user_downloads_dir(self) -> str:
      +        """:return: downloads directory tied to the user e.g. ``/storage/emulated/0/Downloads``"""
      +        return _android_downloads_folder()
      +
      +    @property
      +    def user_pictures_dir(self) -> str:
      +        """:return: pictures directory tied to the user e.g. ``/storage/emulated/0/Pictures``"""
      +        return _android_pictures_folder()
      +
      +    @property
      +    def user_videos_dir(self) -> str:
      +        """:return: videos directory tied to the user e.g. ``/storage/emulated/0/DCIM/Camera``"""
      +        return _android_videos_folder()
      +
      +    @property
      +    def user_music_dir(self) -> str:
      +        """:return: music directory tied to the user e.g. ``/storage/emulated/0/Music``"""
      +        return _android_music_folder()
      +
      +    @property
      +    def user_runtime_dir(self) -> str:
      +        """
      +        :return: runtime directory tied to the user, same as `user_cache_dir` if not opinionated else ``tmp`` in it,
      +          e.g. ``/data/user///cache//tmp``
      +        """
      +        path = self.user_cache_dir
      +        if self.opinion:
      +            path = os.path.join(path, "tmp")  # noqa: PTH118
      +        return path
      +
      +
      +@lru_cache(maxsize=1)
      +def _android_folder() -> str | None:
      +    """:return: base folder for the Android OS or None if it cannot be found"""
      +    try:
      +        # First try to get path to android app via pyjnius
      +        from jnius import autoclass
      +
      +        context = autoclass("android.content.Context")
      +        result: str | None = context.getFilesDir().getParentFile().getAbsolutePath()
      +    except Exception:  # noqa: BLE001
      +        # if fails find an android folder looking path on the sys.path
      +        pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files")
      +        for path in sys.path:
      +            if pattern.match(path):
      +                result = path.split("/files")[0]
      +                break
      +        else:
      +            result = None
      +    return result
      +
      +
      +@lru_cache(maxsize=1)
      +def _android_documents_folder() -> str:
      +    """:return: documents folder for the Android OS"""
      +    # Get directories with pyjnius
      +    try:
      +        from jnius import autoclass
      +
      +        context = autoclass("android.content.Context")
      +        environment = autoclass("android.os.Environment")
      +        documents_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DOCUMENTS).getAbsolutePath()
      +    except Exception:  # noqa: BLE001
      +        documents_dir = "/storage/emulated/0/Documents"
      +
      +    return documents_dir
      +
      +
      +@lru_cache(maxsize=1)
      +def _android_downloads_folder() -> str:
      +    """:return: downloads folder for the Android OS"""
      +    # Get directories with pyjnius
      +    try:
      +        from jnius import autoclass
      +
      +        context = autoclass("android.content.Context")
      +        environment = autoclass("android.os.Environment")
      +        downloads_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DOWNLOADS).getAbsolutePath()
      +    except Exception:  # noqa: BLE001
      +        downloads_dir = "/storage/emulated/0/Downloads"
      +
      +    return downloads_dir
      +
      +
      +@lru_cache(maxsize=1)
      +def _android_pictures_folder() -> str:
      +    """:return: pictures folder for the Android OS"""
      +    # Get directories with pyjnius
      +    try:
      +        from jnius import autoclass
      +
      +        context = autoclass("android.content.Context")
      +        environment = autoclass("android.os.Environment")
      +        pictures_dir: str = context.getExternalFilesDir(environment.DIRECTORY_PICTURES).getAbsolutePath()
      +    except Exception:  # noqa: BLE001
      +        pictures_dir = "/storage/emulated/0/Pictures"
      +
      +    return pictures_dir
      +
      +
      +@lru_cache(maxsize=1)
      +def _android_videos_folder() -> str:
      +    """:return: videos folder for the Android OS"""
      +    # Get directories with pyjnius
      +    try:
      +        from jnius import autoclass
      +
      +        context = autoclass("android.content.Context")
      +        environment = autoclass("android.os.Environment")
      +        videos_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DCIM).getAbsolutePath()
      +    except Exception:  # noqa: BLE001
      +        videos_dir = "/storage/emulated/0/DCIM/Camera"
      +
      +    return videos_dir
      +
      +
      +@lru_cache(maxsize=1)
      +def _android_music_folder() -> str:
      +    """:return: music folder for the Android OS"""
      +    # Get directories with pyjnius
      +    try:
      +        from jnius import autoclass
      +
      +        context = autoclass("android.content.Context")
      +        environment = autoclass("android.os.Environment")
      +        music_dir: str = context.getExternalFilesDir(environment.DIRECTORY_MUSIC).getAbsolutePath()
      +    except Exception:  # noqa: BLE001
      +        music_dir = "/storage/emulated/0/Music"
      +
      +    return music_dir
      +
      +
      +__all__ = [
      +    "Android",
      +]
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py
      new file mode 100644
      index 0000000..d64ebb9
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py
      @@ -0,0 +1,223 @@
      +"""Base API."""
      +from __future__ import annotations
      +
      +import os
      +from abc import ABC, abstractmethod
      +from pathlib import Path
      +from typing import TYPE_CHECKING
      +
      +if TYPE_CHECKING:
      +    import sys
      +
      +    if sys.version_info >= (3, 8):  # pragma: no cover (py38+)
      +        from typing import Literal
      +    else:  # pragma: no cover (py38+)
      +        from pip._vendor.typing_extensions import Literal
      +
      +
      +class PlatformDirsABC(ABC):
      +    """Abstract base class for platform directories."""
      +
      +    def __init__(  # noqa: PLR0913
      +        self,
      +        appname: str | None = None,
      +        appauthor: str | None | Literal[False] = None,
      +        version: str | None = None,
      +        roaming: bool = False,  # noqa: FBT001, FBT002
      +        multipath: bool = False,  # noqa: FBT001, FBT002
      +        opinion: bool = True,  # noqa: FBT001, FBT002
      +        ensure_exists: bool = False,  # noqa: FBT001, FBT002
      +    ) -> None:
      +        """
      +        Create a new platform directory.
      +
      +        :param appname: See `appname`.
      +        :param appauthor: See `appauthor`.
      +        :param version: See `version`.
      +        :param roaming: See `roaming`.
      +        :param multipath: See `multipath`.
      +        :param opinion: See `opinion`.
      +        :param ensure_exists: See `ensure_exists`.
      +        """
      +        self.appname = appname  #: The name of application.
      +        self.appauthor = appauthor
      +        """
      +        The name of the app author or distributing body for this application. Typically, it is the owning company name.
      +        Defaults to `appname`. You may pass ``False`` to disable it.
      +        """
      +        self.version = version
      +        """
      +        An optional version path element to append to the path. You might want to use this if you want multiple versions
      +        of your app to be able to run independently. If used, this would typically be ``.``.
      +        """
      +        self.roaming = roaming
      +        """
      +        Whether to use the roaming appdata directory on Windows. That means that for users on a Windows network setup
      +        for roaming profiles, this user data will be synced on login (see
      +        `here `_).
      +        """
      +        self.multipath = multipath
      +        """
      +        An optional parameter only applicable to Unix/Linux which indicates that the entire list of data dirs should be
      +        returned. By default, the first item would only be returned.
      +        """
      +        self.opinion = opinion  #: A flag to indicating to use opinionated values.
      +        self.ensure_exists = ensure_exists
      +        """
      +        Optionally create the directory (and any missing parents) upon access if it does not exist.
      +        By default, no directories are created.
      +        """
      +
      +    def _append_app_name_and_version(self, *base: str) -> str:
      +        params = list(base[1:])
      +        if self.appname:
      +            params.append(self.appname)
      +            if self.version:
      +                params.append(self.version)
      +        path = os.path.join(base[0], *params)  # noqa: PTH118
      +        self._optionally_create_directory(path)
      +        return path
      +
      +    def _optionally_create_directory(self, path: str) -> None:
      +        if self.ensure_exists:
      +            Path(path).mkdir(parents=True, exist_ok=True)
      +
      +    @property
      +    @abstractmethod
      +    def user_data_dir(self) -> str:
      +        """:return: data directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def site_data_dir(self) -> str:
      +        """:return: data directory shared by users"""
      +
      +    @property
      +    @abstractmethod
      +    def user_config_dir(self) -> str:
      +        """:return: config directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def site_config_dir(self) -> str:
      +        """:return: config directory shared by the users"""
      +
      +    @property
      +    @abstractmethod
      +    def user_cache_dir(self) -> str:
      +        """:return: cache directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def site_cache_dir(self) -> str:
      +        """:return: cache directory shared by users"""
      +
      +    @property
      +    @abstractmethod
      +    def user_state_dir(self) -> str:
      +        """:return: state directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def user_log_dir(self) -> str:
      +        """:return: log directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def user_documents_dir(self) -> str:
      +        """:return: documents directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def user_downloads_dir(self) -> str:
      +        """:return: downloads directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def user_pictures_dir(self) -> str:
      +        """:return: pictures directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def user_videos_dir(self) -> str:
      +        """:return: videos directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def user_music_dir(self) -> str:
      +        """:return: music directory tied to the user"""
      +
      +    @property
      +    @abstractmethod
      +    def user_runtime_dir(self) -> str:
      +        """:return: runtime directory tied to the user"""
      +
      +    @property
      +    def user_data_path(self) -> Path:
      +        """:return: data path tied to the user"""
      +        return Path(self.user_data_dir)
      +
      +    @property
      +    def site_data_path(self) -> Path:
      +        """:return: data path shared by users"""
      +        return Path(self.site_data_dir)
      +
      +    @property
      +    def user_config_path(self) -> Path:
      +        """:return: config path tied to the user"""
      +        return Path(self.user_config_dir)
      +
      +    @property
      +    def site_config_path(self) -> Path:
      +        """:return: config path shared by the users"""
      +        return Path(self.site_config_dir)
      +
      +    @property
      +    def user_cache_path(self) -> Path:
      +        """:return: cache path tied to the user"""
      +        return Path(self.user_cache_dir)
      +
      +    @property
      +    def site_cache_path(self) -> Path:
      +        """:return: cache path shared by users"""
      +        return Path(self.site_cache_dir)
      +
      +    @property
      +    def user_state_path(self) -> Path:
      +        """:return: state path tied to the user"""
      +        return Path(self.user_state_dir)
      +
      +    @property
      +    def user_log_path(self) -> Path:
      +        """:return: log path tied to the user"""
      +        return Path(self.user_log_dir)
      +
      +    @property
      +    def user_documents_path(self) -> Path:
      +        """:return: documents path tied to the user"""
      +        return Path(self.user_documents_dir)
      +
      +    @property
      +    def user_downloads_path(self) -> Path:
      +        """:return: downloads path tied to the user"""
      +        return Path(self.user_downloads_dir)
      +
      +    @property
      +    def user_pictures_path(self) -> Path:
      +        """:return: pictures path tied to the user"""
      +        return Path(self.user_pictures_dir)
      +
      +    @property
      +    def user_videos_path(self) -> Path:
      +        """:return: videos path tied to the user"""
      +        return Path(self.user_videos_dir)
      +
      +    @property
      +    def user_music_path(self) -> Path:
      +        """:return: music path tied to the user"""
      +        return Path(self.user_music_dir)
      +
      +    @property
      +    def user_runtime_path(self) -> Path:
      +        """:return: runtime path tied to the user"""
      +        return Path(self.user_runtime_dir)
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py
      new file mode 100644
      index 0000000..a753e2a
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py
      @@ -0,0 +1,91 @@
      +"""macOS."""
      +from __future__ import annotations
      +
      +import os.path
      +
      +from .api import PlatformDirsABC
      +
      +
      +class MacOS(PlatformDirsABC):
      +    """
      +    Platform directories for the macOS operating system. Follows the guidance from `Apple documentation
      +    `_.
      +    Makes use of the `appname `,
      +    `version `,
      +    `ensure_exists `.
      +    """
      +
      +    @property
      +    def user_data_dir(self) -> str:
      +        """:return: data directory tied to the user, e.g. ``~/Library/Application Support/$appname/$version``"""
      +        return self._append_app_name_and_version(os.path.expanduser("~/Library/Application Support"))  # noqa: PTH111
      +
      +    @property
      +    def site_data_dir(self) -> str:
      +        """:return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``"""
      +        return self._append_app_name_and_version("/Library/Application Support")
      +
      +    @property
      +    def user_config_dir(self) -> str:
      +        """:return: config directory tied to the user, same as `user_data_dir`"""
      +        return self.user_data_dir
      +
      +    @property
      +    def site_config_dir(self) -> str:
      +        """:return: config directory shared by the users, same as `site_data_dir`"""
      +        return self.site_data_dir
      +
      +    @property
      +    def user_cache_dir(self) -> str:
      +        """:return: cache directory tied to the user, e.g. ``~/Library/Caches/$appname/$version``"""
      +        return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches"))  # noqa: PTH111
      +
      +    @property
      +    def site_cache_dir(self) -> str:
      +        """:return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``"""
      +        return self._append_app_name_and_version("/Library/Caches")
      +
      +    @property
      +    def user_state_dir(self) -> str:
      +        """:return: state directory tied to the user, same as `user_data_dir`"""
      +        return self.user_data_dir
      +
      +    @property
      +    def user_log_dir(self) -> str:
      +        """:return: log directory tied to the user, e.g. ``~/Library/Logs/$appname/$version``"""
      +        return self._append_app_name_and_version(os.path.expanduser("~/Library/Logs"))  # noqa: PTH111
      +
      +    @property
      +    def user_documents_dir(self) -> str:
      +        """:return: documents directory tied to the user, e.g. ``~/Documents``"""
      +        return os.path.expanduser("~/Documents")  # noqa: PTH111
      +
      +    @property
      +    def user_downloads_dir(self) -> str:
      +        """:return: downloads directory tied to the user, e.g. ``~/Downloads``"""
      +        return os.path.expanduser("~/Downloads")  # noqa: PTH111
      +
      +    @property
      +    def user_pictures_dir(self) -> str:
      +        """:return: pictures directory tied to the user, e.g. ``~/Pictures``"""
      +        return os.path.expanduser("~/Pictures")  # noqa: PTH111
      +
      +    @property
      +    def user_videos_dir(self) -> str:
      +        """:return: videos directory tied to the user, e.g. ``~/Movies``"""
      +        return os.path.expanduser("~/Movies")  # noqa: PTH111
      +
      +    @property
      +    def user_music_dir(self) -> str:
      +        """:return: music directory tied to the user, e.g. ``~/Music``"""
      +        return os.path.expanduser("~/Music")  # noqa: PTH111
      +
      +    @property
      +    def user_runtime_dir(self) -> str:
      +        """:return: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``"""
      +        return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems"))  # noqa: PTH111
      +
      +
      +__all__ = [
      +    "MacOS",
      +]
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
      new file mode 100644
      index 0000000..468b0ab
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
      @@ -0,0 +1,223 @@
      +"""Unix."""
      +from __future__ import annotations
      +
      +import os
      +import sys
      +from configparser import ConfigParser
      +from pathlib import Path
      +
      +from .api import PlatformDirsABC
      +
      +if sys.platform == "win32":
      +
      +    def getuid() -> int:
      +        msg = "should only be used on Unix"
      +        raise RuntimeError(msg)
      +
      +else:
      +    from os import getuid
      +
      +
      +class Unix(PlatformDirsABC):
      +    """
      +    On Unix/Linux, we follow the
      +    `XDG Basedir Spec `_. The spec allows
      +    overriding directories with environment variables. The examples show are the default values, alongside the name of
      +    the environment variable that overrides them. Makes use of the
      +    `appname `,
      +    `version `,
      +    `multipath `,
      +    `opinion `,
      +    `ensure_exists `.
      +    """
      +
      +    @property
      +    def user_data_dir(self) -> str:
      +        """
      +        :return: data directory tied to the user, e.g. ``~/.local/share/$appname/$version`` or
      +         ``$XDG_DATA_HOME/$appname/$version``
      +        """
      +        path = os.environ.get("XDG_DATA_HOME", "")
      +        if not path.strip():
      +            path = os.path.expanduser("~/.local/share")  # noqa: PTH111
      +        return self._append_app_name_and_version(path)
      +
      +    @property
      +    def site_data_dir(self) -> str:
      +        """
      +        :return: data directories shared by users (if `multipath ` is
      +         enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS
      +         path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version``
      +        """
      +        # XDG default for $XDG_DATA_DIRS; only first, if multipath is False
      +        path = os.environ.get("XDG_DATA_DIRS", "")
      +        if not path.strip():
      +            path = f"/usr/local/share{os.pathsep}/usr/share"
      +        return self._with_multi_path(path)
      +
      +    def _with_multi_path(self, path: str) -> str:
      +        path_list = path.split(os.pathsep)
      +        if not self.multipath:
      +            path_list = path_list[0:1]
      +        path_list = [self._append_app_name_and_version(os.path.expanduser(p)) for p in path_list]  # noqa: PTH111
      +        return os.pathsep.join(path_list)
      +
      +    @property
      +    def user_config_dir(self) -> str:
      +        """
      +        :return: config directory tied to the user, e.g. ``~/.config/$appname/$version`` or
      +         ``$XDG_CONFIG_HOME/$appname/$version``
      +        """
      +        path = os.environ.get("XDG_CONFIG_HOME", "")
      +        if not path.strip():
      +            path = os.path.expanduser("~/.config")  # noqa: PTH111
      +        return self._append_app_name_and_version(path)
      +
      +    @property
      +    def site_config_dir(self) -> str:
      +        """
      +        :return: config directories shared by users (if `multipath `
      +         is enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS
      +         path separator), e.g. ``/etc/xdg/$appname/$version``
      +        """
      +        # XDG default for $XDG_CONFIG_DIRS only first, if multipath is False
      +        path = os.environ.get("XDG_CONFIG_DIRS", "")
      +        if not path.strip():
      +            path = "/etc/xdg"
      +        return self._with_multi_path(path)
      +
      +    @property
      +    def user_cache_dir(self) -> str:
      +        """
      +        :return: cache directory tied to the user, e.g. ``~/.cache/$appname/$version`` or
      +         ``~/$XDG_CACHE_HOME/$appname/$version``
      +        """
      +        path = os.environ.get("XDG_CACHE_HOME", "")
      +        if not path.strip():
      +            path = os.path.expanduser("~/.cache")  # noqa: PTH111
      +        return self._append_app_name_and_version(path)
      +
      +    @property
      +    def site_cache_dir(self) -> str:
      +        """:return: cache directory shared by users, e.g. ``/var/tmp/$appname/$version``"""
      +        return self._append_app_name_and_version("/var/tmp")  # noqa: S108
      +
      +    @property
      +    def user_state_dir(self) -> str:
      +        """
      +        :return: state directory tied to the user, e.g. ``~/.local/state/$appname/$version`` or
      +         ``$XDG_STATE_HOME/$appname/$version``
      +        """
      +        path = os.environ.get("XDG_STATE_HOME", "")
      +        if not path.strip():
      +            path = os.path.expanduser("~/.local/state")  # noqa: PTH111
      +        return self._append_app_name_and_version(path)
      +
      +    @property
      +    def user_log_dir(self) -> str:
      +        """:return: log directory tied to the user, same as `user_state_dir` if not opinionated else ``log`` in it"""
      +        path = self.user_state_dir
      +        if self.opinion:
      +            path = os.path.join(path, "log")  # noqa: PTH118
      +        return path
      +
      +    @property
      +    def user_documents_dir(self) -> str:
      +        """:return: documents directory tied to the user, e.g. ``~/Documents``"""
      +        return _get_user_media_dir("XDG_DOCUMENTS_DIR", "~/Documents")
      +
      +    @property
      +    def user_downloads_dir(self) -> str:
      +        """:return: downloads directory tied to the user, e.g. ``~/Downloads``"""
      +        return _get_user_media_dir("XDG_DOWNLOAD_DIR", "~/Downloads")
      +
      +    @property
      +    def user_pictures_dir(self) -> str:
      +        """:return: pictures directory tied to the user, e.g. ``~/Pictures``"""
      +        return _get_user_media_dir("XDG_PICTURES_DIR", "~/Pictures")
      +
      +    @property
      +    def user_videos_dir(self) -> str:
      +        """:return: videos directory tied to the user, e.g. ``~/Videos``"""
      +        return _get_user_media_dir("XDG_VIDEOS_DIR", "~/Videos")
      +
      +    @property
      +    def user_music_dir(self) -> str:
      +        """:return: music directory tied to the user, e.g. ``~/Music``"""
      +        return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music")
      +
      +    @property
      +    def user_runtime_dir(self) -> str:
      +        """
      +        :return: runtime directory tied to the user, e.g. ``/run/user/$(id -u)/$appname/$version`` or
      +         ``$XDG_RUNTIME_DIR/$appname/$version``.
      +
      +         For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/user/$(id -u)/$appname/$version`` if
      +         exists, otherwise ``/tmp/runtime-$(id -u)/$appname/$version``, if``$XDG_RUNTIME_DIR``
      +         is not set.
      +        """
      +        path = os.environ.get("XDG_RUNTIME_DIR", "")
      +        if not path.strip():
      +            if sys.platform.startswith(("freebsd", "openbsd", "netbsd")):
      +                path = f"/var/run/user/{getuid()}"
      +                if not Path(path).exists():
      +                    path = f"/tmp/runtime-{getuid()}"  # noqa: S108
      +            else:
      +                path = f"/run/user/{getuid()}"
      +        return self._append_app_name_and_version(path)
      +
      +    @property
      +    def site_data_path(self) -> Path:
      +        """:return: data path shared by users. Only return first item, even if ``multipath`` is set to ``True``"""
      +        return self._first_item_as_path_if_multipath(self.site_data_dir)
      +
      +    @property
      +    def site_config_path(self) -> Path:
      +        """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``"""
      +        return self._first_item_as_path_if_multipath(self.site_config_dir)
      +
      +    @property
      +    def site_cache_path(self) -> Path:
      +        """:return: cache path shared by users. Only return first item, even if ``multipath`` is set to ``True``"""
      +        return self._first_item_as_path_if_multipath(self.site_cache_dir)
      +
      +    def _first_item_as_path_if_multipath(self, directory: str) -> Path:
      +        if self.multipath:
      +            # If multipath is True, the first path is returned.
      +            directory = directory.split(os.pathsep)[0]
      +        return Path(directory)
      +
      +
      +def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str:
      +    media_dir = _get_user_dirs_folder(env_var)
      +    if media_dir is None:
      +        media_dir = os.environ.get(env_var, "").strip()
      +        if not media_dir:
      +            media_dir = os.path.expanduser(fallback_tilde_path)  # noqa: PTH111
      +
      +    return media_dir
      +
      +
      +def _get_user_dirs_folder(key: str) -> str | None:
      +    """Return directory from user-dirs.dirs config file. See https://freedesktop.org/wiki/Software/xdg-user-dirs/."""
      +    user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs"
      +    if user_dirs_config_path.exists():
      +        parser = ConfigParser()
      +
      +        with user_dirs_config_path.open() as stream:
      +            # Add fake section header, so ConfigParser doesn't complain
      +            parser.read_string(f"[top]\n{stream.read()}")
      +
      +        if key not in parser["top"]:
      +            return None
      +
      +        path = parser["top"][key].strip('"')
      +        # Handle relative home paths
      +        return path.replace("$HOME", os.path.expanduser("~"))  # noqa: PTH111
      +
      +    return None
      +
      +
      +__all__ = [
      +    "Unix",
      +]
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py
      new file mode 100644
      index 0000000..dc8c44c
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py
      @@ -0,0 +1,4 @@
      +# file generated by setuptools_scm
      +# don't change, don't track in version control
      +__version__ = version = '3.8.1'
      +__version_tuple__ = version_tuple = (3, 8, 1)
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py
      new file mode 100644
      index 0000000..b52c9c6
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py
      @@ -0,0 +1,255 @@
      +"""Windows."""
      +from __future__ import annotations
      +
      +import ctypes
      +import os
      +import sys
      +from functools import lru_cache
      +from typing import TYPE_CHECKING
      +
      +from .api import PlatformDirsABC
      +
      +if TYPE_CHECKING:
      +    from collections.abc import Callable
      +
      +
      +class Windows(PlatformDirsABC):
      +    """
      +    `MSDN on where to store app data files
      +    `_.
      +    Makes use of the
      +    `appname `,
      +    `appauthor `,
      +    `version `,
      +    `roaming `,
      +    `opinion `,
      +    `ensure_exists `.
      +    """
      +
      +    @property
      +    def user_data_dir(self) -> str:
      +        """
      +        :return: data directory tied to the user, e.g.
      +         ``%USERPROFILE%\\AppData\\Local\\$appauthor\\$appname`` (not roaming) or
      +         ``%USERPROFILE%\\AppData\\Roaming\\$appauthor\\$appname`` (roaming)
      +        """
      +        const = "CSIDL_APPDATA" if self.roaming else "CSIDL_LOCAL_APPDATA"
      +        path = os.path.normpath(get_win_folder(const))
      +        return self._append_parts(path)
      +
      +    def _append_parts(self, path: str, *, opinion_value: str | None = None) -> str:
      +        params = []
      +        if self.appname:
      +            if self.appauthor is not False:
      +                author = self.appauthor or self.appname
      +                params.append(author)
      +            params.append(self.appname)
      +            if opinion_value is not None and self.opinion:
      +                params.append(opinion_value)
      +            if self.version:
      +                params.append(self.version)
      +        path = os.path.join(path, *params)  # noqa: PTH118
      +        self._optionally_create_directory(path)
      +        return path
      +
      +    @property
      +    def site_data_dir(self) -> str:
      +        """:return: data directory shared by users, e.g. ``C:\\ProgramData\\$appauthor\\$appname``"""
      +        path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA"))
      +        return self._append_parts(path)
      +
      +    @property
      +    def user_config_dir(self) -> str:
      +        """:return: config directory tied to the user, same as `user_data_dir`"""
      +        return self.user_data_dir
      +
      +    @property
      +    def site_config_dir(self) -> str:
      +        """:return: config directory shared by the users, same as `site_data_dir`"""
      +        return self.site_data_dir
      +
      +    @property
      +    def user_cache_dir(self) -> str:
      +        """
      +        :return: cache directory tied to the user (if opinionated with ``Cache`` folder within ``$appname``) e.g.
      +         ``%USERPROFILE%\\AppData\\Local\\$appauthor\\$appname\\Cache\\$version``
      +        """
      +        path = os.path.normpath(get_win_folder("CSIDL_LOCAL_APPDATA"))
      +        return self._append_parts(path, opinion_value="Cache")
      +
      +    @property
      +    def site_cache_dir(self) -> str:
      +        """:return: cache directory shared by users, e.g. ``C:\\ProgramData\\$appauthor\\$appname\\Cache\\$version``"""
      +        path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA"))
      +        return self._append_parts(path, opinion_value="Cache")
      +
      +    @property
      +    def user_state_dir(self) -> str:
      +        """:return: state directory tied to the user, same as `user_data_dir`"""
      +        return self.user_data_dir
      +
      +    @property
      +    def user_log_dir(self) -> str:
      +        """:return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``Logs`` in it"""
      +        path = self.user_data_dir
      +        if self.opinion:
      +            path = os.path.join(path, "Logs")  # noqa: PTH118
      +            self._optionally_create_directory(path)
      +        return path
      +
      +    @property
      +    def user_documents_dir(self) -> str:
      +        """:return: documents directory tied to the user e.g. ``%USERPROFILE%\\Documents``"""
      +        return os.path.normpath(get_win_folder("CSIDL_PERSONAL"))
      +
      +    @property
      +    def user_downloads_dir(self) -> str:
      +        """:return: downloads directory tied to the user e.g. ``%USERPROFILE%\\Downloads``"""
      +        return os.path.normpath(get_win_folder("CSIDL_DOWNLOADS"))
      +
      +    @property
      +    def user_pictures_dir(self) -> str:
      +        """:return: pictures directory tied to the user e.g. ``%USERPROFILE%\\Pictures``"""
      +        return os.path.normpath(get_win_folder("CSIDL_MYPICTURES"))
      +
      +    @property
      +    def user_videos_dir(self) -> str:
      +        """:return: videos directory tied to the user e.g. ``%USERPROFILE%\\Videos``"""
      +        return os.path.normpath(get_win_folder("CSIDL_MYVIDEO"))
      +
      +    @property
      +    def user_music_dir(self) -> str:
      +        """:return: music directory tied to the user e.g. ``%USERPROFILE%\\Music``"""
      +        return os.path.normpath(get_win_folder("CSIDL_MYMUSIC"))
      +
      +    @property
      +    def user_runtime_dir(self) -> str:
      +        """
      +        :return: runtime directory tied to the user, e.g.
      +         ``%USERPROFILE%\\AppData\\Local\\Temp\\$appauthor\\$appname``
      +        """
      +        path = os.path.normpath(os.path.join(get_win_folder("CSIDL_LOCAL_APPDATA"), "Temp"))  # noqa: PTH118
      +        return self._append_parts(path)
      +
      +
      +def get_win_folder_from_env_vars(csidl_name: str) -> str:
      +    """Get folder from environment variables."""
      +    result = get_win_folder_if_csidl_name_not_env_var(csidl_name)
      +    if result is not None:
      +        return result
      +
      +    env_var_name = {
      +        "CSIDL_APPDATA": "APPDATA",
      +        "CSIDL_COMMON_APPDATA": "ALLUSERSPROFILE",
      +        "CSIDL_LOCAL_APPDATA": "LOCALAPPDATA",
      +    }.get(csidl_name)
      +    if env_var_name is None:
      +        msg = f"Unknown CSIDL name: {csidl_name}"
      +        raise ValueError(msg)
      +    result = os.environ.get(env_var_name)
      +    if result is None:
      +        msg = f"Unset environment variable: {env_var_name}"
      +        raise ValueError(msg)
      +    return result
      +
      +
      +def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None:
      +    """Get folder for a CSIDL name that does not exist as an environment variable."""
      +    if csidl_name == "CSIDL_PERSONAL":
      +        return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents")  # noqa: PTH118
      +
      +    if csidl_name == "CSIDL_DOWNLOADS":
      +        return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Downloads")  # noqa: PTH118
      +
      +    if csidl_name == "CSIDL_MYPICTURES":
      +        return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Pictures")  # noqa: PTH118
      +
      +    if csidl_name == "CSIDL_MYVIDEO":
      +        return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Videos")  # noqa: PTH118
      +
      +    if csidl_name == "CSIDL_MYMUSIC":
      +        return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Music")  # noqa: PTH118
      +    return None
      +
      +
      +def get_win_folder_from_registry(csidl_name: str) -> str:
      +    """
      +    Get folder from the registry.
      +
      +    This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer
      +    for all CSIDL_* names.
      +    """
      +    shell_folder_name = {
      +        "CSIDL_APPDATA": "AppData",
      +        "CSIDL_COMMON_APPDATA": "Common AppData",
      +        "CSIDL_LOCAL_APPDATA": "Local AppData",
      +        "CSIDL_PERSONAL": "Personal",
      +        "CSIDL_DOWNLOADS": "{374DE290-123F-4565-9164-39C4925E467B}",
      +        "CSIDL_MYPICTURES": "My Pictures",
      +        "CSIDL_MYVIDEO": "My Video",
      +        "CSIDL_MYMUSIC": "My Music",
      +    }.get(csidl_name)
      +    if shell_folder_name is None:
      +        msg = f"Unknown CSIDL name: {csidl_name}"
      +        raise ValueError(msg)
      +    if sys.platform != "win32":  # only needed for mypy type checker to know that this code runs only on Windows
      +        raise NotImplementedError
      +    import winreg
      +
      +    key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
      +    directory, _ = winreg.QueryValueEx(key, shell_folder_name)
      +    return str(directory)
      +
      +
      +def get_win_folder_via_ctypes(csidl_name: str) -> str:
      +    """Get folder with ctypes."""
      +    # There is no 'CSIDL_DOWNLOADS'.
      +    # Use 'CSIDL_PROFILE' (40) and append the default folder 'Downloads' instead.
      +    # https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid
      +
      +    csidl_const = {
      +        "CSIDL_APPDATA": 26,
      +        "CSIDL_COMMON_APPDATA": 35,
      +        "CSIDL_LOCAL_APPDATA": 28,
      +        "CSIDL_PERSONAL": 5,
      +        "CSIDL_MYPICTURES": 39,
      +        "CSIDL_MYVIDEO": 14,
      +        "CSIDL_MYMUSIC": 13,
      +        "CSIDL_DOWNLOADS": 40,
      +    }.get(csidl_name)
      +    if csidl_const is None:
      +        msg = f"Unknown CSIDL name: {csidl_name}"
      +        raise ValueError(msg)
      +
      +    buf = ctypes.create_unicode_buffer(1024)
      +    windll = getattr(ctypes, "windll")  # noqa: B009 # using getattr to avoid false positive with mypy type checker
      +    windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
      +
      +    # Downgrade to short path name if it has highbit chars.
      +    if any(ord(c) > 255 for c in buf):  # noqa: PLR2004
      +        buf2 = ctypes.create_unicode_buffer(1024)
      +        if windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
      +            buf = buf2
      +
      +    if csidl_name == "CSIDL_DOWNLOADS":
      +        return os.path.join(buf.value, "Downloads")  # noqa: PTH118
      +
      +    return buf.value
      +
      +
      +def _pick_get_win_folder() -> Callable[[str], str]:
      +    if hasattr(ctypes, "windll"):
      +        return get_win_folder_via_ctypes
      +    try:
      +        import winreg  # noqa: F401
      +    except ImportError:
      +        return get_win_folder_from_env_vars
      +    else:
      +        return get_win_folder_from_registry
      +
      +
      +get_win_folder = lru_cache(maxsize=None)(_pick_get_win_folder())
      +
      +__all__ = [
      +    "Windows",
      +]
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py
      new file mode 100644
      index 0000000..39c84aa
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py
      @@ -0,0 +1,82 @@
      +"""
      +    Pygments
      +    ~~~~~~~~
      +
      +    Pygments is a syntax highlighting package written in Python.
      +
      +    It is a generic syntax highlighter for general use in all kinds of software
      +    such as forum systems, wikis or other applications that need to prettify
      +    source code. Highlights are:
      +
      +    * a wide range of common languages and markup formats is supported
      +    * special attention is paid to details, increasing quality by a fair amount
      +    * support for new languages and formats are added easily
      +    * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image
      +      formats that PIL supports, and ANSI sequences
      +    * it is usable as a command-line tool and as a library
      +    * ... and it highlights even Brainfuck!
      +
      +    The `Pygments master branch`_ is installable with ``easy_install Pygments==dev``.
      +
      +    .. _Pygments master branch:
      +       https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev
      +
      +    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
      +    :license: BSD, see LICENSE for details.
      +"""
      +from io import StringIO, BytesIO
      +
      +__version__ = '2.15.1'
      +__docformat__ = 'restructuredtext'
      +
      +__all__ = ['lex', 'format', 'highlight']
      +
      +
      +def lex(code, lexer):
      +    """
      +    Lex `code` with the `lexer` (must be a `Lexer` instance)
      +    and return an iterable of tokens. Currently, this only calls
      +    `lexer.get_tokens()`.
      +    """
      +    try:
      +        return lexer.get_tokens(code)
      +    except TypeError:
      +        # Heuristic to catch a common mistake.
      +        from pip._vendor.pygments.lexer import RegexLexer
      +        if isinstance(lexer, type) and issubclass(lexer, RegexLexer):
      +            raise TypeError('lex() argument must be a lexer instance, '
      +                            'not a class')
      +        raise
      +
      +
      +def format(tokens, formatter, outfile=None):  # pylint: disable=redefined-builtin
      +    """
      +    Format ``tokens`` (an iterable of tokens) with the formatter ``formatter``
      +    (a `Formatter` instance).
      +
      +    If ``outfile`` is given and a valid file object (an object with a
      +    ``write`` method), the result will be written to it, otherwise it
      +    is returned as a string.
      +    """
      +    try:
      +        if not outfile:
      +            realoutfile = getattr(formatter, 'encoding', None) and BytesIO() or StringIO()
      +            formatter.format(tokens, realoutfile)
      +            return realoutfile.getvalue()
      +        else:
      +            formatter.format(tokens, outfile)
      +    except TypeError:
      +        # Heuristic to catch a common mistake.
      +        from pip._vendor.pygments.formatter import Formatter
      +        if isinstance(formatter, type) and issubclass(formatter, Formatter):
      +            raise TypeError('format() argument must be a formatter instance, '
      +                            'not a class')
      +        raise
      +
      +
      +def highlight(code, lexer, formatter, outfile=None):
      +    """
      +    This is the most high-level highlighting function. It combines `lex` and
      +    `format` in one function.
      +    """
      +    return format(lex(code, lexer), formatter, outfile)
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py
      new file mode 100644
      index 0000000..2f7f8cb
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py
      @@ -0,0 +1,17 @@
      +"""
      +    pygments.__main__
      +    ~~~~~~~~~~~~~~~~~
      +
      +    Main entry point for ``python -m pygments``.
      +
      +    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
      +    :license: BSD, see LICENSE for details.
      +"""
      +
      +import sys
      +from pip._vendor.pygments.cmdline import main
      +
      +try:
      +    sys.exit(main(sys.argv))
      +except KeyboardInterrupt:
      +    sys.exit(1)
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..36c916c38db11e9942c4fc0460776dc841df2590
      GIT binary patch
      literal 3508
      zcmaJ@O>7&-72YK&i6ZsmO16tAu06KvShOY5R@~ZAV*~PEEJU#lOL0^7K(2O2YjK9)D(o*fg_Bjmh8IDml9Meg8W+PQjHPYp@
      zX*lU}#>td>YKGJEOS9bT^nPHJ`<$GU{lF||@!OBz{#IWhZ|%t#MvkFfZ`B&yS5iOx
      zq}_7=vBX@-EGApNvesDLt<^pJE7z~Fre!Z%HO^Lrs}%Q{>%*R^2YxZOFstIdHSTla
      z+W%#P3$_#prk5>`g_4sA%k$W>>pPMKOH2k!YSj{4dn7}<&MZlr!Un8K#T#;ht-8x_
      z5rzU)he@m1^jzCgZs1F%>Xu?Y=MGZ=YYMKEyVQz}1);Dxvjc}0*_9+Lgev%S?EW!?
      zz3Mug3Cl;6@Wu`rjlgFfo
      zM1IjrP0Q6zIb2z;hcH~<7Tl7Q*!M%rb5)Biw&22&y7u(m#^ZDvG{7D=^
      zAk1OF;}A^l-8mL2MJr0R=hsx
      zxjx5t3Xmym)=QqdC@hiqUMv>%5=?Y}C>dV?_Rb5-^_N0>`C$C<7V4Z;6LjMn0V{&R
      zmT%Xq70SQsO9iNDFIHVuXVoh5)T*@SJIpwH*5NDFY8%pUpt7^o>2^w3U8$y=E|qF9
      z8ZH(QT&dY+S$ALwyY8;=QtVi9-EAJ`wc6Rl^d!!Vqt7Pe!`{5+y=gg@QYZuc<;hN_%`Q>Wz^X
      z^>@CFov0RB?ZJN<|Jxs!;w?cme8F3rWyf
      z*FEiU$GHjS2Z}i7SyC4IqFmR0)W6Vb@=HPlA{uMD&0+<_asp9I;9JzD1f@F4xlk%F
      z2=PW4g?%(5!^PNcI?7PqqMq&!Nm+;UFGQ)~tCC%MS8^dsmpN6Ai^6r>(nT(pRnROo
      zMR1F&8DF}Ph*G1){go1g0PLaS@_O;)R7oPClkNH=OK`T-cD75g3aIR=N(JtVUYxDF
      z!x+dL=
      z4}H4+`H?TiwvJwWI`Zms!~D*%ZNnTrj?v)pXW7B$gLwaiBskvPHER6)%uGIg)uwop
      z*1`T1u&uG5l5eRF`Zr9%^@H|~HB;n(?#})PZ7XZ0qJ7pI5l;#Lem1k&(UDJ|s(n|FW*LQ0tf!RZww9eigc$jdh6%K(*Q#SF76GIQScz
      z#QIAdPOdOZ*n={;|1em!YTNCvH4YlH?kNn~JL@;@ixsOP8X!@Z<1UP*Bo!afA#*qhn2ovZ%3v
      zgXgP>JoID_Ra#)Ny+~ZiG0)tk-+6e2wWQtLBJG*l_-mOkB}
      zVlQnRqHdVFUFZruQE&VqqyEl|QC~abQ64uUul=C6OF}}C)
      zGT1Zp=i$9i#}3{vd{+Kq_vYBSFURKoaQgRed^uL$y8hng_3}^OeloD<@xZ=E1N%O@
      zdH=^-11F!1?teUb^wH?i&C$Zcfx@$wmVfxCfytM2;Z4#7_tV{5`PY6k{ki+wSGJD7
      z{r_}(;RTDMQ2yJvKjp{oL5vzahvBL!x+^Hq@shfkcv}Jju$e5crPeU@hWxu&`FA~`=PQlPu)ATHiqtw@paA^82QEF51o%L
      zZH^qeKl|D0X8!cU%;{~cBC4x}T+~;oIDuWML@76jfk$SedmPZ{RHXG44M
      iP~uv?>Hj1YyEAB3E>JF-AZ6PM(3xvSZHF26*Y
      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
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..fc903cb34274dd1a6077ba7fb72338a7091c84ca
      GIT binary patch
      literal 2646
      zcmbVN&2Jk;6rcUF*IqkcO_L^}W!uJ3C#{_(=~r46rAQkWQ{q8O{N7`{uOfEk4=(v?+s7Yi=-
      zxY+Ar(ZxO&`&}%#IN;)-iyK_r=;9`d(@1IlhKX^ow!q3O2Vw$?um^LPf66*L9zh=+
      zN9Z=7m^UWE4qLHMgzOwY*z5XjRSp6lO!ml}Jqk)&F$mVeS0NrvdMCw60rK;7IC-{H
      zd*#sQDCSc-VD>AWFiVB5@GHgd{W6SPA)UpVX+%=GX6PAgGe6xo{5E$~C)tE4r}T_Y
      zumY=XAnSQEmp3Dh&QMCv6^NRiF^A-b0@)Yx1;CWCfcEHDg5lMYe0wLPg)e
      zg^Pn1F81|hErDPIn-cD@
      zL;>uiq+Jik+UEf3!{s}k0uJBx=ie~_uR(|2@$HK22*TYN)x;Y|=)K@VYIcL3_6EEF
      zL|%m{1>f$V_l<*ZyA`H~$lMhu481Gk=m|SUsKOJ*5>mQ?jVEZEDm}Xs&1z;e6`e3J
      zF`}c`#F{)pR7H)BU}MhIbI}~pXR$e~8EP_vquB!1=A#)k8O;^U8C@HQobHbru+dXF
      zs2`Nbi00H>G(L~v5C|wa7clDHr%0|~N%kSe?VCn=U=t_cGXgM`(63TcxqapGD&IjU
      zH|0JgAe{v5BqIR!Cb@`cl8X#|LiY=tER!%S
      zmS_vrA|^D-N%)K|n4Fz;)TFMeQj?B-JMrDQ#~;_EfmMFs?;GX8z~1Pp-LKN<9=iw~
      zOJO?^tenDhLShT-9AroYg|}B(V;Q6!USwzK3GW-`ZW$DTrux*?VW>Y=;X2VhNmcf#MH-
      z+FRX*IW6u;n#`Nn7#ec=C^fh586{w7wD)El
      zmhGD|du)v!O3Jj=?GroiCvJ;(d)$7dUfV~nwvxve;0Bd1by%s>oAqjW(#U)Dvj2?((;w%Tcw5aV3nCW=e_2#zneC4pS*)0#lbZ&_ZGq^3bF?<_2-CJBFUSkWhU|=u7d$okY}Y)@g1}<1ZNorCMKJ<&{w8%bp){q56K(TQaKi
      zoxrX6oQ3C|ka??BpDQ!?=FH_~r{;%DFOk>tr%FM!F1+RQ;S_r-ZnBB-@z+mGj89Cm
      zrMj~HZnQrOxwCqlNzU2nch9~3o$t-()wWZbsBTrtYjr5ou>i6)&T-+zISOQu1ZiKf{kakMUxYkekZ
      zl6jId8n@K$?@IL8lWdiT=L4680duNVzs{Tr^B`Q#5`-iuN1jU};9&
      z{6}0cSYz3{$kFUe5|6&-2$!oBA%x0GhwnHGphK*AYHJ=X%>*xTu$OGH7*zP84o)e$
      zXXUdA^(6Xy2CCoCZxIS8X_6JHMtiEOMw7-~&jFHt46%CO*ff4-SzuKsUnSS9-zV1S
      zZCcFHR#G1TS)
      zq4E3a@lVp@Ph}Rye>!}Wen5|yA105|+azZRAR&p}mLd&b0vRfjP)S4?V~dQ5JwMRoEPYAVgS5ki)Ja{v;HM~7Ib~X7p0bP$?7+im+4RcAU
      z`^s=n1?3fJY?81u23OmC{b&d!L>Q=2rXikQl_qgJ7Y=r~=B@%WjE_1J0Tf6y{;p6t
      z%S(Z9Lg1RBekrJ2iVMr!RL2Mnk?>(yukz#UqT|;%Y#dqi&cnHNkNd!`uGx9D
      z=U7fH*~-}Vs!}xD&LzZNh(;@A+ip;@?N&PWEN8V$T%nb=?TWL?VXXg56l+KrV3ULIQFF
      zSuj;@u<9oGlGJBz_|e7os5YCgEtPynf{3Bu=_Ulc7U|Gpw=0Wk1@{>=0#*XS3qcIm
      zDzO?y8Wo=qkBoo??ImqwB&ZW@5*u2&)QLdwLJ(8Y{ogiPCgMY&a}teXuEB+P6)&{y
      z#(;JzA9oaRD)JF{e(>-W^A}kiG~`fRa3%b14@1?>sXNh(%QQa9P%#M4#_5i`b3z2-
      zc0wG6iCPYjW03&rOBW~$jlSquWd##VLlPZdClC9NZucL%n?9zFRm>&De(2W-%-Z%3
      zYmTp>rVu5L;2^Fj&|KLlwGkuuiB%4M64AFoc8r9Tev+Zqk#>?=FYDPj=lPIfFtQsm
      zF<|f^v5>4Apn(TqTH~I&@zYDdP^T0|@BnPMn8a`bt>Hj7vQxBMN
      zi~f>gF3u&20@>0y{E8x@%ho)|m9>y91+|LXQQ=&&l{)W8)S}j&b0As@s;xb?t*C6<
      z8fOYN3RH(+(QZyDs5K7u>RX3aU&q;40fGmHuZK4m{yH%BaNmn}M^8N%Wxp+cP`p1n
      zd2e)bCqWN=rA_G2$;X8Do&0CI|5pQ72X318(qmhx?ey6Hk`W_+41Vnes6Ox20&0OV
      ze@@biU$&q3meGVZR4kRAh?ii$=P>uct_Wxb&*5YSm3l!u8alW+ePep-z{klyn19Ot
      zF}po9eLp?@NqSnpBQ76(mHv+A%v;G|N7fcOw-D>vxYUJNv`H28iB8<1?u&o5{?!MHQuWrPt&J#2AmOJ1`C9z#0ES@
      oDBUsA)NBuD=)NZ-eKhqSmZ2~25U4&K8Kg7U-}^U#KehFL0Rh$l?EnA(
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..c7baca5876317f679d41ca52b6f230812f8221e4
      GIT binary patch
      literal 4589
      zcmb7I&2JmW72oBDNQsgq`9qOY*O|&mWEK+X$aU+|AAl{zABCh8kzAnkVY%ELl56b;
      zGczlhf*R=HgIc6b0~8Pn6sU4a3SZPybLv0Pi)|ICv2XzcMN#DDSOp5?)c0mTNIB}E
      z3vjeE`{vD?H^29LZ}gX;p#cS+iz`2AzCWTU|G-ZCWTKb-Tkx{2m`YVKRWoI)RTciG
      z?Ua+Qrd1rv*cm5V&BA-OsaE^Uz6VM*mr`yjX6^xuJxqm~s`*Z;m|y?%0D-67X*$#u
      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
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..48e8e2bed3f2d3204baa8ee04de66086282eeab3
      GIT binary patch
      literal 38349
      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
      P<3iiMzZY=F_^kgIFMm;G
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..7277580bf9e3180c6263d9532fb6ba394c855d19
      GIT binary patch
      literal 1588
      zcmZV;TW{M`_#8VIHg_{9qa`>G1XDZlkaL@!eq0#==z750{vW{6*k8=tfwA0mH#SS(H
      z99#{b5`n9N1F0Ock;r8aJtdKM<3arkCUql>%4TW74Oh(ik|A;~)?8d;-dGUw+LUU#
      zC6%N*&_X6%rxw-8tf?xhG)vi{RW~HVtXHWutuwW#QK@EAeOc1fqGZ_CLS4U{x|Eif
      zYSD{^Tw0VXlu3qaNQGspD|HiuI-?~85v2^<9sYk`ys0x25YjMwY#dMn9SB2z2%|5B
      z(Px+Tgm)X$e@2DyMfbH&%9qkrt1Ho;Jv$Qg_Hb8hMrSYTEt{&=zt~_02xO
      zn+H3c1Fdonr$CM4Na0psEfxF&KLWg2G(UvUDsLTk$Kiu&uZElu!%qjCP>I7RheF6Y
      z?v8_DUGYv=3#^QRm9P`GqFsl`;Q~905H;8te8UIlggx(pMAy>?C!TCx46WRVd25?1
      z$-2KbouT$uASg2NPfdPY@I~BkN3sXBT^`)ISY_VN$%~H=GY+Kb)xt;TfMDMP
      zYM_>YlKq?6_3U2aTw`uOIoM1$?Phg*;Ad?+y*o7aGI{<8@!>OT_@MX0?QiyaKU#ya
      z?%f|6{^_e$6d11r)H~Gt{8@4P{k`Pa5ekLhS;PDB#8cM%bYo>>@?dcM`PzsIiI(a$1O6Xw
      z^zPiPYd3Rqrk9&v7eApF$T#Ds`C7OF#b46sr1>5Qc_YWB0kwFH@jsk^L+!T^j{OxM
      v+l`%XL|YNmH?mgTtgcsEh#w8XJtF*=|1RH-@_hr1_)&t#qpuQuxD)Ar{q2m7
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..898bda07de61ad1e810e79236b13b5f96a645c34
      GIT binary patch
      literal 3416
      zcmd5;&2JM&6rbJocgQEifwWadP#{LePJmEq3Me57jhcou4wR&#&c-`&HmrB8nGK1f
      zq#)Evpd!%|&{H||P(=GTRN>l7By&I(^wLXv%Lj*$Q{T*box~vE$VmJA_Rag6-@NzM
      ze^pn95Uj+Ni+xVtZ0&*rqxGYT;={gz?yzp3Pa*HuUjWme{JM+UnR?6wgfR=}8P0x(Sv9
      z59aMj%f!r9O--emumu~c(mZCmnJ#M_jh%>Mi(=hoc#HGYrgLFCuBNZ>xOf6|iAoKf
      zP<)k8rduY%)uI9XXA6CI97qaZ0^$goNYHY`;m8dhx#&SDPO2APFK9i&+z;RyM4eN(X|Oxg*2)@AXLwzlJkkF*^*ipTS%esQ`N+eFPqIdr)5!tm$khmtV?OTy68031o+
      zu4K2f-`{t(XCT=lIzoe1)D0F3&DB=a)!fdqpbRwIqU8WKSGTDpvS(>`Jn<>zgGYg9
      zZ7)dgp&$$@O*T+gT970pqj~8O*Mha6*tHIa&^(N=N3!!q8|Ia%dUt2@cOL!jeN>8+
      z1dFMin|m%dk21*hlSKQF4HM5-_27Ewm60u&YK{4Ej3jC_VHcm9(4BYum|PQAIgmMP#TCRPBql`_gv~3O7#p3
      z4~?V-&-V=s7d`yT_fRT^L|r?z&QrjYw|ubyCcl<)E;HqP?dWdUI0p}F1@bRizmA@T
      z4?b!Av=B}Jv|fBO^t5L89qX1=sA(w#T2>U0y%ZIAqxF!q4FF!20)QMa?*srY0l+OQ
      z7Qo`K5W%Yp%YErw6rbNv=stv9H;h|Yy4n0jvaqrajH)akM#F!
      zEg|{=WK3TR(YESwzE%{2_E+#!z~ffWTi~G|f$4i%LJhrr{T21|25fe2D<9{>O?fX|
      zd=;ETA$;;3YDa)G0N)^gDy3QJREom5K(v{Y7EbnZBIYsgVNt2#K1AGyXbpr&^!-NQ
      zGv}}CX?hT3yz1F$ATTf`X+=IDd6owy)OcVC)j!>RcnLK=-L;?djR%)d!>X@QI<(p*
      SOL#RTOYMTJagH7U7ykpuEoLzQ
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..99c07e788f98d42f59b61fe0c753c81fb918be5b
      GIT binary patch
      literal 4101
      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
      BJ^cUx
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..0b0b898d253ac93afdb0f7b08a2397b9e050820e
      GIT binary patch
      literal 11066
      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
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..c9712c3fcce5890eca9f14e0c25ba044707b3ca7
      GIT binary patch
      literal 6694
      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
      DOKlr4
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..919488ae6b48963ab7b8cade5cc34d78937aabca
      GIT binary patch
      literal 33008
      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
      QmoaN{!TvH~U9;Q&1Fthr6#xJL
      
      literal 0
      HcmV?d00001
      
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc
      new file mode 100644
      index 0000000000000000000000000000000000000000..3654de877ac4d8b271bf5ac26b6ac621bea46239
      GIT binary patch
      literal 14001
      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
      k is one of "lexer", "formatter" or "filter".')
      +    special_modes.add_argument(
      +        '-V', action='store_true',
      +        help='Print the package version.')
      +    special_modes.add_argument(
      +        '-h', '--help', action='store_true',
      +        help='Print this help.')
      +    special_modes_group.add_argument(
      +        '-a', metavar='ARG',
      +        help='Formatter-specific additional argument for the -S (print '
      +        'style sheet) mode.')
      +
      +    argns = parser.parse_args(args[1:])
      +
      +    try:
      +        return main_inner(parser, argns)
      +    except BrokenPipeError:
      +        # someone closed our stdout, e.g. by quitting a pager.
      +        return 0
      +    except Exception:
      +        if argns.v:
      +            print(file=sys.stderr)
      +            print('*' * 65, file=sys.stderr)
      +            print('An unhandled exception occurred while highlighting.',
      +                  file=sys.stderr)
      +            print('Please report the whole traceback to the issue tracker at',
      +                  file=sys.stderr)
      +            print('.',
      +                  file=sys.stderr)
      +            print('*' * 65, file=sys.stderr)
      +            print(file=sys.stderr)
      +            raise
      +        import traceback
      +        info = traceback.format_exception(*sys.exc_info())
      +        msg = info[-1].strip()
      +        if len(info) >= 3:
      +            # extract relevant file and position info
      +            msg += '\n   (f%s)' % info[-2].split('\n')[0].strip()[1:]
      +        print(file=sys.stderr)
      +        print('*** Error while highlighting:', file=sys.stderr)
      +        print(msg, file=sys.stderr)
      +        print('*** If this is a bug you want to report, please rerun with -v.',
      +              file=sys.stderr)
      +        return 1
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py
      new file mode 100644
      index 0000000..deb4937
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py
      @@ -0,0 +1,70 @@
      +"""
      +    pygments.console
      +    ~~~~~~~~~~~~~~~~
      +
      +    Format colored console output.
      +
      +    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
      +    :license: BSD, see LICENSE for details.
      +"""
      +
      +esc = "\x1b["
      +
      +codes = {}
      +codes[""] = ""
      +codes["reset"] = esc + "39;49;00m"
      +
      +codes["bold"] = esc + "01m"
      +codes["faint"] = esc + "02m"
      +codes["standout"] = esc + "03m"
      +codes["underline"] = esc + "04m"
      +codes["blink"] = esc + "05m"
      +codes["overline"] = esc + "06m"
      +
      +dark_colors = ["black", "red", "green", "yellow", "blue",
      +               "magenta", "cyan", "gray"]
      +light_colors = ["brightblack", "brightred", "brightgreen", "brightyellow", "brightblue",
      +                "brightmagenta", "brightcyan", "white"]
      +
      +x = 30
      +for d, l in zip(dark_colors, light_colors):
      +    codes[d] = esc + "%im" % x
      +    codes[l] = esc + "%im" % (60 + x)
      +    x += 1
      +
      +del d, l, x
      +
      +codes["white"] = codes["bold"]
      +
      +
      +def reset_color():
      +    return codes["reset"]
      +
      +
      +def colorize(color_key, text):
      +    return codes[color_key] + text + codes["reset"]
      +
      +
      +def ansiformat(attr, text):
      +    """
      +    Format ``text`` with a color and/or some attributes::
      +
      +        color       normal color
      +        *color*     bold color
      +        _color_     underlined color
      +        +color+     blinking color
      +    """
      +    result = []
      +    if attr[:1] == attr[-1:] == '+':
      +        result.append(codes['blink'])
      +        attr = attr[1:-1]
      +    if attr[:1] == attr[-1:] == '*':
      +        result.append(codes['bold'])
      +        attr = attr[1:-1]
      +    if attr[:1] == attr[-1:] == '_':
      +        result.append(codes['underline'])
      +        attr = attr[1:-1]
      +    result.append(codes[attr])
      +    result.append(text)
      +    result.append(codes['reset'])
      +    return ''.join(result)
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py
      new file mode 100644
      index 0000000..dafa08d
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py
      @@ -0,0 +1,71 @@
      +"""
      +    pygments.filter
      +    ~~~~~~~~~~~~~~~
      +
      +    Module that implements the default filter.
      +
      +    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
      +    :license: BSD, see LICENSE for details.
      +"""
      +
      +
      +def apply_filters(stream, filters, lexer=None):
      +    """
      +    Use this method to apply an iterable of filters to
      +    a stream. If lexer is given it's forwarded to the
      +    filter, otherwise the filter receives `None`.
      +    """
      +    def _apply(filter_, stream):
      +        yield from filter_.filter(lexer, stream)
      +    for filter_ in filters:
      +        stream = _apply(filter_, stream)
      +    return stream
      +
      +
      +def simplefilter(f):
      +    """
      +    Decorator that converts a function into a filter::
      +
      +        @simplefilter
      +        def lowercase(self, lexer, stream, options):
      +            for ttype, value in stream:
      +                yield ttype, value.lower()
      +    """
      +    return type(f.__name__, (FunctionFilter,), {
      +        '__module__': getattr(f, '__module__'),
      +        '__doc__': f.__doc__,
      +        'function': f,
      +    })
      +
      +
      +class Filter:
      +    """
      +    Default filter. Subclass this class or use the `simplefilter`
      +    decorator to create own filters.
      +    """
      +
      +    def __init__(self, **options):
      +        self.options = options
      +
      +    def filter(self, lexer, stream):
      +        raise NotImplementedError()
      +
      +
      +class FunctionFilter(Filter):
      +    """
      +    Abstract class used by `simplefilter` to create simple
      +    function filters on the fly. The `simplefilter` decorator
      +    automatically creates subclasses of this class for
      +    functions passed to it.
      +    """
      +    function = None
      +
      +    def __init__(self, **options):
      +        if not hasattr(self, 'function'):
      +            raise TypeError('%r used without bound function' %
      +                            self.__class__.__name__)
      +        Filter.__init__(self, **options)
      +
      +    def filter(self, lexer, stream):
      +        # pylint: disable=not-callable
      +        yield from self.function(lexer, stream, self.options)
      diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py
      new file mode 100644
      index 0000000..5aa9ecb
      --- /dev/null
      +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py
      @@ -0,0 +1,940 @@
      +"""
      +    pygments.filters
      +    ~~~~~~~~~~~~~~~~
      +
      +    Module containing filter lookup functions and default
      +    filters.
      +
      +    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
      +    :license: BSD, see LICENSE for details.
      +"""
      +
      +import re
      +
      +from pip._vendor.pygments.token import String, Comment, Keyword, Name, Error, Whitespace, \
      +    string_to_tokentype
      +from pip._vendor.pygments.filter import Filter
      +from pip._vendor.pygments.util import get_list_opt, get_int_opt, get_bool_opt, \
      +    get_choice_opt, ClassNotFound, OptionError
      +from pip._vendor.pygments.plugin import find_plugin_filters
      +
      +
      +def find_filter_class(filtername):
      +    """Lookup a filter by name. Return None if not found."""
      +    if filtername in FILTERS:
      +        return FILTERS[filtername]
      +    for name, cls in find_plugin_filters():
      +        if name == filtername:
      +            return cls
      +    return None
      +
      +
      +def get_filter_by_name(filtername, **options):
      +    """Return an instantiated filter.
      +
      +    Options are passed to the filter initializer if wanted.
      +    Raise a ClassNotFound if not found.
      +    """
      +    cls = find_filter_class(filtername)
      +    if cls:
      +        return cls(**options)
      +    else:
      +        raise ClassNotFound('filter %r not found' % filtername)
      +
      +
      +def get_all_filters():
      +    """Return a generator of all filter names."""
      +    yield from FILTERS
      +    for name, _ in find_plugin_filters():
      +        yield name
      +
      +
      +def _replace_special(ttype, value, regex, specialttype,
      +                     replacefunc=lambda x: x):
      +    last = 0
      +    for match in regex.finditer(value):
      +        start, end = match.start(), match.end()
      +        if start != last:
      +            yield ttype, value[last:start]
      +        yield specialttype, replacefunc(value[start:end])
      +        last = end
      +    if last != len(value):
      +        yield ttype, value[last:]
      +
      +
      +class CodeTagFilter(Filter):
      +    """Highlight special code tags in comments and docstrings.
      +
      +    Options accepted:
      +
      +    `codetags` : list of strings
      +       A list of strings that are flagged as code tags.  The default is to
      +       highlight ``XXX``, ``TODO``, ``FIXME``, ``BUG`` and ``NOTE``.
      +
      +    .. versionchanged:: 2.13
      +       Now recognizes ``FIXME`` by default.
      +    """
      +
      +    def __init__(self, **options):
      +        Filter.__init__(self, **options)
      +        tags = get_list_opt(options, 'codetags',
      +                            ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE'])
      +        self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([
      +            re.escape(tag) for tag in tags if tag
      +        ]))
      +
      +    def filter(self, lexer, stream):
      +        regex = self.tag_re
      +        for ttype, value in stream:
      +            if ttype in String.Doc or \
      +               ttype in Comment and \
      +               ttype not in Comment.Preproc:
      +                yield from _replace_special(ttype, value, regex, Comment.Special)
      +            else:
      +                yield ttype, value
      +
      +
      +class SymbolFilter(Filter):
      +    """Convert mathematical symbols such as \\ in Isabelle
      +    or \\longrightarrow in LaTeX into Unicode characters.
      +
      +    This is mostly useful for HTML or console output when you want to
      +    approximate the source rendering you'd see in an IDE.
      +
      +    Options accepted:
      +
      +    `lang` : string
      +       The symbol language. Must be one of ``'isabelle'`` or
      +       ``'latex'``.  The default is ``'isabelle'``.
      +    """
      +
      +    latex_symbols = {
      +        '\\alpha'                : '\U000003b1',
      +        '\\beta'                 : '\U000003b2',
      +        '\\gamma'                : '\U000003b3',
      +        '\\delta'                : '\U000003b4',
      +        '\\varepsilon'           : '\U000003b5',
      +        '\\zeta'                 : '\U000003b6',
      +        '\\eta'                  : '\U000003b7',
      +        '\\vartheta'             : '\U000003b8',
      +        '\\iota'                 : '\U000003b9',
      +        '\\kappa'                : '\U000003ba',
      +        '\\lambda'               : '\U000003bb',
      +        '\\mu'                   : '\U000003bc',
      +        '\\nu'                   : '\U000003bd',
      +        '\\xi'                   : '\U000003be',
      +        '\\pi'                   : '\U000003c0',
      +        '\\varrho'               : '\U000003c1',
      +        '\\sigma'                : '\U000003c3',
      +        '\\tau'                  : '\U000003c4',
      +        '\\upsilon'              : '\U000003c5',
      +        '\\varphi'               : '\U000003c6',
      +        '\\chi'                  : '\U000003c7',
      +        '\\psi'                  : '\U000003c8',
      +        '\\omega'                : '\U000003c9',
      +        '\\Gamma'                : '\U00000393',
      +        '\\Delta'                : '\U00000394',
      +        '\\Theta'                : '\U00000398',
      +        '\\Lambda'               : '\U0000039b',
      +        '\\Xi'                   : '\U0000039e',
      +        '\\Pi'                   : '\U000003a0',
      +        '\\Sigma'                : '\U000003a3',
      +        '\\Upsilon'              : '\U000003a5',
      +        '\\Phi'                  : '\U000003a6',
      +        '\\Psi'                  : '\U000003a8',
      +        '\\Omega'                : '\U000003a9',
      +        '\\leftarrow'            : '\U00002190',
      +        '\\longleftarrow'        : '\U000027f5',
      +        '\\rightarrow'           : '\U00002192',
      +        '\\longrightarrow'       : '\U000027f6',
      +        '\\Leftarrow'            : '\U000021d0',
      +        '\\Longleftarrow'        : '\U000027f8',
      +        '\\Rightarrow'           : '\U000021d2',
      +        '\\Longrightarrow'       : '\U000027f9',
      +        '\\leftrightarrow'       : '\U00002194',
      +        '\\longleftrightarrow'   : '\U000027f7',
      +        '\\Leftrightarrow'       : '\U000021d4',
      +        '\\Longleftrightarrow'   : '\U000027fa',
      +        '\\mapsto'               : '\U000021a6',
      +        '\\longmapsto'           : '\U000027fc',
      +        '\\relbar'               : '\U00002500',
      +        '\\Relbar'               : '\U00002550',
      +        '\\hookleftarrow'        : '\U000021a9',
      +        '\\hookrightarrow'       : '\U000021aa',
      +        '\\leftharpoondown'      : '\U000021bd',
      +        '\\rightharpoondown'     : '\U000021c1',
      +        '\\leftharpoonup'        : '\U000021bc',
      +        '\\rightharpoonup'       : '\U000021c0',
      +        '\\rightleftharpoons'    : '\U000021cc',
      +        '\\leadsto'              : '\U0000219d',
      +        '\\downharpoonleft'      : '\U000021c3',
      +        '\\downharpoonright'     : '\U000021c2',
      +        '\\upharpoonleft'        : '\U000021bf',
      +        '\\upharpoonright'       : '\U000021be',
      +        '\\restriction'          : '\U000021be',
      +        '\\uparrow'              : '\U00002191',
      +        '\\Uparrow'              : '\U000021d1',
      +        '\\downarrow'            : '\U00002193',
      +        '\\Downarrow'            : '\U000021d3',
      +        '\\updownarrow'          : '\U00002195',
      +        '\\Updownarrow'          : '\U000021d5',
      +        '\\langle'               : '\U000027e8',
      +        '\\rangle'               : '\U000027e9',
      +        '\\lceil'                : '\U00002308',
      +        '\\rceil'                : '\U00002309',
      +        '\\lfloor'               : '\U0000230a',
      +        '\\rfloor'               : '\U0000230b',
      +        '\\flqq'                 : '\U000000ab',
      +        '\\frqq'                 : '\U000000bb',
      +        '\\bot'                  : '\U000022a5',
      +        '\\top'                  : '\U000022a4',
      +        '\\wedge'                : '\U00002227',
      +        '\\bigwedge'             : '\U000022c0',
      +        '\\vee'                  : '\U00002228',
      +        '\\bigvee'               : '\U000022c1',
      +        '\\forall'               : '\U00002200',
      +        '\\exists'               : '\U00002203',
      +        '\\nexists'              : '\U00002204',
      +        '\\neg'                  : '\U000000ac',
      +        '\\Box'                  : '\U000025a1',
      +        '\\Diamond'              : '\U000025c7',
      +        '\\vdash'                : '\U000022a2',
      +        '\\models'               : '\U000022a8',
      +        '\\dashv'                : '\U000022a3',
      +        '\\surd'                 : '\U0000221a',
      +        '\\le'                   : '\U00002264',
      +        '\\ge'                   : '\U00002265',
      +        '\\ll'                   : '\U0000226a',
      +        '\\gg'                   : '\U0000226b',
      +        '\\lesssim'              : '\U00002272',
      +        '\\gtrsim'               : '\U00002273',
      +        '\\lessapprox'           : '\U00002a85',
      +        '\\gtrapprox'            : '\U00002a86',
      +        '\\in'                   : '\U00002208',
      +        '\\notin'                : '\U00002209',
      +        '\\subset'               : '\U00002282',
      +        '\\supset'               : '\U00002283',
      +        '\\subseteq'             : '\U00002286',
      +        '\\supseteq'             : '\U00002287',
      +        '\\sqsubset'             : '\U0000228f',
      +        '\\sqsupset'             : '\U00002290',
      +        '\\sqsubseteq'           : '\U00002291',
      +        '\\sqsupseteq'           : '\U00002292',
      +        '\\cap'                  : '\U00002229',
      +        '\\bigcap'               : '\U000022c2',
      +        '\\cup'                  : '\U0000222a',
      +        '\\bigcup'               : '\U000022c3',
      +        '\\sqcup'                : '\U00002294',
      +        '\\bigsqcup'             : '\U00002a06',
      +        '\\sqcap'                : '\U00002293',
      +        '\\Bigsqcap'             : '\U00002a05',
      +        '\\setminus'             : '\U00002216',
      +        '\\propto'               : '\U0000221d',
      +        '\\uplus'                : '\U0000228e',
      +        '\\bigplus'              : '\U00002a04',
      +        '\\sim'                  : '\U0000223c',
      +        '\\doteq'                : '\U00002250',
      +        '\\simeq'                : '\U00002243',
      +        '\\approx'               : '\U00002248',
      +        '\\asymp'                : '\U0000224d',
      +        '\\cong'                 : '\U00002245',
      +        '\\equiv'                : '\U00002261',
      +        '\\Join'                 : '\U000022c8',
      +        '\\bowtie'               : '\U00002a1d',
      +        '\\prec'                 : '\U0000227a',
      +        '\\succ'                 : '\U0000227b',
      +        '\\preceq'               : '\U0000227c',
      +        '\\succeq'               : '\U0000227d',
      +        '\\parallel'             : '\U00002225',
      +        '\\mid'                  : '\U000000a6',
      +        '\\pm'                   : '\U000000b1',
      +        '\\mp'                   : '\U00002213',
      +        '\\times'                : '\U000000d7',
      +        '\\div'                  : '\U000000f7',
      +        '\\cdot'                 : '\U000022c5',
      +        '\\star'                 : '\U000022c6',
      +        '\\circ'                 : '\U00002218',
      +        '\\dagger'               : '\U00002020',
      +        '\\ddagger'              : '\U00002021',
      +        '\\lhd'                  : '\U000022b2',
      +        '\\rhd'                  : '\U000022b3',
      +        '\\unlhd'                : '\U000022b4',
      +        '\\unrhd'                : '\U000022b5',
      +        '\\triangleleft'         : '\U000025c3',
      +        '\\triangleright'        : '\U000025b9',
      +        '\\triangle'             : '\U000025b3',
      +        '\\triangleq'            : '\U0000225c',
      +        '\\oplus'                : '\U00002295',
      +        '\\bigoplus'             : '\U00002a01',
      +        '\\otimes'               : '\U00002297',
      +        '\\bigotimes'            : '\U00002a02',
      +        '\\odot'                 : '\U00002299',
      +        '\\bigodot'              : '\U00002a00',
      +        '\\ominus'               : '\U00002296',
      +        '\\oslash'               : '\U00002298',
      +        '\\dots'                 : '\U00002026',
      +        '\\cdots'                : '\U000022ef',
      +        '\\sum'                  : '\U00002211',
      +        '\\prod'                 : '\U0000220f',
      +        '\\coprod'               : '\U00002210',
      +        '\\infty'                : '\U0000221e',
      +        '\\int'                  : '\U0000222b',
      +        '\\oint'                 : '\U0000222e',
      +        '\\clubsuit'             : '\U00002663',
      +        '\\diamondsuit'          : '\U00002662',
      +        '\\heartsuit'            : '\U00002661',
      +        '\\spadesuit'            : '\U00002660',
      +        '\\aleph'                : '\U00002135',
      +        '\\emptyset'             : '\U00002205',
      +        '\\nabla'                : '\U00002207',
      +        '\\partial'              : '\U00002202',
      +        '\\flat'                 : '\U0000266d',
      +        '\\natural'              : '\U0000266e',
      +        '\\sharp'                : '\U0000266f',
      +        '\\angle'                : '\U00002220',
      +        '\\copyright'            : '\U000000a9',
      +        '\\textregistered'       : '\U000000ae',
      +        '\\textonequarter'       : '\U000000bc',
      +        '\\textonehalf'          : '\U000000bd',
      +        '\\textthreequarters'    : '\U000000be',
      +        '\\textordfeminine'      : '\U000000aa',
      +        '\\textordmasculine'     : '\U000000ba',
      +        '\\euro'                 : '\U000020ac',
      +        '\\pounds'               : '\U000000a3',
      +        '\\yen'                  : '\U000000a5',
      +        '\\textcent'             : '\U000000a2',
      +        '\\textcurrency'         : '\U000000a4',
      +        '\\textdegree'           : '\U000000b0',
      +    }
      +
      +    isabelle_symbols = {
      +        '\\'                 : '\U0001d7ec',
      +        '\\'                  : '\U0001d7ed',
      +        '\\'                  : '\U0001d7ee',
      +        '\\'                : '\U0001d7ef',
      +        '\\'                 : '\U0001d7f0',
      +        '\\'                 : '\U0001d7f1',
      +        '\\'                  : '\U0001d7f2',
      +        '\\'                : '\U0001d7f3',
      +        '\\'                : '\U0001d7f4',
      +        '\\'                 : '\U0001d7f5',
      +        '\\'                    : '\U0001d49c',
      +        '\\'                    : '\U0000212c',
      +        '\\'                    : '\U0001d49e',
      +        '\\'                    : '\U0001d49f',
      +        '\\'                    : '\U00002130',
      +        '\\'                    : '\U00002131',
      +        '\\'                    : '\U0001d4a2',
      +        '\\'                    : '\U0000210b',
      +        '\\'                    : '\U00002110',
      +        '\\'                    : '\U0001d4a5',
      +        '\\'                    : '\U0001d4a6',
      +        '\\'                    : '\U00002112',
      +        '\\'                    : '\U00002133',
      +        '\\'                    : '\U0001d4a9',
      +        '\\'                    : '\U0001d4aa',
      +        '\\

      ' : '\U0001d5c9', + '\\' : '\U0001d5ca', + '\\' : '\U0001d5cb', + '\\' : '\U0001d5cc', + '\\' : '\U0001d5cd', + '\\' : '\U0001d5ce', + '\\' : '\U0001d5cf', + '\\' : '\U0001d5d0', + '\\' : '\U0001d5d1', + '\\' : '\U0001d5d2', + '\\' : '\U0001d5d3', + '\\' : '\U0001d504', + '\\' : '\U0001d505', + '\\' : '\U0000212d', + '\\

      ' : '\U0001d507', + '\\' : '\U0001d508', + '\\' : '\U0001d509', + '\\' : '\U0001d50a', + '\\' : '\U0000210c', + '\\' : '\U00002111', + '\\' : '\U0001d50d', + '\\' : '\U0001d50e', + '\\' : '\U0001d50f', + '\\' : '\U0001d510', + '\\' : '\U0001d511', + '\\' : '\U0001d512', + '\\' : '\U0001d513', + '\\' : '\U0001d514', + '\\' : '\U0000211c', + '\\' : '\U0001d516', + '\\' : '\U0001d517', + '\\' : '\U0001d518', + '\\' : '\U0001d519', + '\\' : '\U0001d51a', + '\\' : '\U0001d51b', + '\\' : '\U0001d51c', + '\\' : '\U00002128', + '\\' : '\U0001d51e', + '\\' : '\U0001d51f', + '\\' : '\U0001d520', + '\\
      ' : '\U0001d521', + '\\' : '\U0001d522', + '\\' : '\U0001d523', + '\\' : '\U0001d524', + '\\' : '\U0001d525', + '\\' : '\U0001d526', + '\\' : '\U0001d527', + '\\' : '\U0001d528', + '\\' : '\U0001d529', + '\\' : '\U0001d52a', + '\\' : '\U0001d52b', + '\\' : '\U0001d52c', + '\\' : '\U0001d52d', + '\\' : '\U0001d52e', + '\\' : '\U0001d52f', + '\\' : '\U0001d530', + '\\' : '\U0001d531', + '\\' : '\U0001d532', + '\\' : '\U0001d533', + '\\' : '\U0001d534', + '\\' : '\U0001d535', + '\\' : '\U0001d536', + '\\' : '\U0001d537', + '\\' : '\U000003b1', + '\\' : '\U000003b2', + '\\' : '\U000003b3', + '\\' : '\U000003b4', + '\\' : '\U000003b5', + '\\' : '\U000003b6', + '\\' : '\U000003b7', + '\\' : '\U000003b8', + '\\' : '\U000003b9', + '\\' : '\U000003ba', + '\\' : '\U000003bb', + '\\' : '\U000003bc', + '\\' : '\U000003bd', + '\\' : '\U000003be', + '\\' : '\U000003c0', + '\\' : '\U000003c1', + '\\' : '\U000003c3', + '\\' : '\U000003c4', + '\\' : '\U000003c5', + '\\' : '\U000003c6', + '\\' : '\U000003c7', + '\\' : '\U000003c8', + '\\' : '\U000003c9', + '\\' : '\U00000393', + '\\' : '\U00000394', + '\\' : '\U00000398', + '\\' : '\U0000039b', + '\\' : '\U0000039e', + '\\' : '\U000003a0', + '\\' : '\U000003a3', + '\\' : '\U000003a5', + '\\' : '\U000003a6', + '\\' : '\U000003a8', + '\\' : '\U000003a9', + '\\' : '\U0001d539', + '\\' : '\U00002102', + '\\' : '\U00002115', + '\\' : '\U0000211a', + '\\' : '\U0000211d', + '\\' : '\U00002124', + '\\' : '\U00002190', + '\\' : '\U000027f5', + '\\' : '\U00002192', + '\\' : '\U000027f6', + '\\' : '\U000021d0', + '\\' : '\U000027f8', + '\\' : '\U000021d2', + '\\' : '\U000027f9', + '\\' : '\U00002194', + '\\' : '\U000027f7', + '\\' : '\U000021d4', + '\\' : '\U000027fa', + '\\' : '\U000021a6', + '\\' : '\U000027fc', + '\\' : '\U00002500', + '\\' : '\U00002550', + '\\' : '\U000021a9', + '\\' : '\U000021aa', + '\\' : '\U000021bd', + '\\' : '\U000021c1', + '\\' : '\U000021bc', + '\\' : '\U000021c0', + '\\' : '\U000021cc', + '\\' : '\U0000219d', + '\\' : '\U000021c3', + '\\' : '\U000021c2', + '\\' : '\U000021bf', + '\\' : '\U000021be', + '\\' : '\U000021be', + '\\' : '\U00002237', + '\\' : '\U00002191', + '\\' : '\U000021d1', + '\\' : '\U00002193', + '\\' : '\U000021d3', + '\\' : '\U00002195', + '\\' : '\U000021d5', + '\\' : '\U000027e8', + '\\' : '\U000027e9', + '\\' : '\U00002308', + '\\' : '\U00002309', + '\\' : '\U0000230a', + '\\' : '\U0000230b', + '\\' : '\U00002987', + '\\' : '\U00002988', + '\\' : '\U000027e6', + '\\' : '\U000027e7', + '\\' : '\U00002983', + '\\' : '\U00002984', + '\\' : '\U000000ab', + '\\' : '\U000000bb', + '\\' : '\U000022a5', + '\\' : '\U000022a4', + '\\' : '\U00002227', + '\\' : '\U000022c0', + '\\' : '\U00002228', + '\\' : '\U000022c1', + '\\' : '\U00002200', + '\\' : '\U00002203', + '\\' : '\U00002204', + '\\' : '\U000000ac', + '\\' : '\U000025a1', + '\\' : '\U000025c7', + '\\' : '\U000022a2', + '\\' : '\U000022a8', + '\\' : '\U000022a9', + '\\' : '\U000022ab', + '\\' : '\U000022a3', + '\\' : '\U0000221a', + '\\' : '\U00002264', + '\\' : '\U00002265', + '\\' : '\U0000226a', + '\\' : '\U0000226b', + '\\' : '\U00002272', + '\\' : '\U00002273', + '\\' : '\U00002a85', + '\\' : '\U00002a86', + '\\' : '\U00002208', + '\\' : '\U00002209', + '\\' : '\U00002282', + '\\' : '\U00002283', + '\\' : '\U00002286', + '\\' : '\U00002287', + '\\' : '\U0000228f', + '\\' : '\U00002290', + '\\' : '\U00002291', + '\\' : '\U00002292', + '\\' : '\U00002229', + '\\' : '\U000022c2', + '\\' : '\U0000222a', + '\\' : '\U000022c3', + '\\' : '\U00002294', + '\\' : '\U00002a06', + '\\' : '\U00002293', + '\\' : '\U00002a05', + '\\' : '\U00002216', + '\\' : '\U0000221d', + '\\' : '\U0000228e', + '\\' : '\U00002a04', + '\\' : '\U00002260', + '\\' : '\U0000223c', + '\\' : '\U00002250', + '\\' : '\U00002243', + '\\' : '\U00002248', + '\\' : '\U0000224d', + '\\' : '\U00002245', + '\\' : '\U00002323', + '\\' : '\U00002261', + '\\' : '\U00002322', + '\\' : '\U000022c8', + '\\' : '\U00002a1d', + '\\' : '\U0000227a', + '\\' : '\U0000227b', + '\\' : '\U0000227c', + '\\' : '\U0000227d', + '\\' : '\U00002225', + '\\' : '\U000000a6', + '\\' : '\U000000b1', + '\\' : '\U00002213', + '\\' : '\U000000d7', + '\\
      ' : '\U000000f7', + '\\' : '\U000022c5', + '\\' : '\U000022c6', + '\\' : '\U00002219', + '\\' : '\U00002218', + '\\' : '\U00002020', + '\\' : '\U00002021', + '\\' : '\U000022b2', + '\\' : '\U000022b3', + '\\' : '\U000022b4', + '\\' : '\U000022b5', + '\\' : '\U000025c3', + '\\' : '\U000025b9', + '\\' : '\U000025b3', + '\\' : '\U0000225c', + '\\' : '\U00002295', + '\\' : '\U00002a01', + '\\' : '\U00002297', + '\\' : '\U00002a02', + '\\' : '\U00002299', + '\\' : '\U00002a00', + '\\' : '\U00002296', + '\\' : '\U00002298', + '\\' : '\U00002026', + '\\' : '\U000022ef', + '\\' : '\U00002211', + '\\' : '\U0000220f', + '\\' : '\U00002210', + '\\' : '\U0000221e', + '\\' : '\U0000222b', + '\\' : '\U0000222e', + '\\' : '\U00002663', + '\\' : '\U00002662', + '\\' : '\U00002661', + '\\' : '\U00002660', + '\\' : '\U00002135', + '\\' : '\U00002205', + '\\' : '\U00002207', + '\\' : '\U00002202', + '\\' : '\U0000266d', + '\\' : '\U0000266e', + '\\' : '\U0000266f', + '\\' : '\U00002220', + '\\' : '\U000000a9', + '\\' : '\U000000ae', + '\\' : '\U000000ad', + '\\' : '\U000000af', + '\\' : '\U000000bc', + '\\' : '\U000000bd', + '\\' : '\U000000be', + '\\' : '\U000000aa', + '\\' : '\U000000ba', + '\\
      ' : '\U000000a7', + '\\' : '\U000000b6', + '\\' : '\U000000a1', + '\\' : '\U000000bf', + '\\' : '\U000020ac', + '\\' : '\U000000a3', + '\\' : '\U000000a5', + '\\' : '\U000000a2', + '\\' : '\U000000a4', + '\\' : '\U000000b0', + '\\' : '\U00002a3f', + '\\' : '\U00002127', + '\\' : '\U000025ca', + '\\' : '\U00002118', + '\\' : '\U00002240', + '\\' : '\U000022c4', + '\\' : '\U000000b4', + '\\' : '\U00000131', + '\\' : '\U000000a8', + '\\' : '\U000000b8', + '\\' : '\U000002dd', + '\\' : '\U000003f5', + '\\' : '\U000023ce', + '\\' : '\U00002039', + '\\' : '\U0000203a', + '\\' : '\U00002302', + '\\<^sub>' : '\U000021e9', + '\\<^sup>' : '\U000021e7', + '\\<^bold>' : '\U00002759', + '\\<^bsub>' : '\U000021d8', + '\\<^esub>' : '\U000021d9', + '\\<^bsup>' : '\U000021d7', + '\\<^esup>' : '\U000021d6', + } + + lang_map = {'isabelle' : isabelle_symbols, 'latex' : latex_symbols} + + def __init__(self, **options): + Filter.__init__(self, **options) + lang = get_choice_opt(options, 'lang', + ['isabelle', 'latex'], 'isabelle') + self.symbols = self.lang_map[lang] + + def filter(self, lexer, stream): + for ttype, value in stream: + if value in self.symbols: + yield ttype, self.symbols[value] + else: + yield ttype, value + + +class KeywordCaseFilter(Filter): + """Convert keywords to lowercase or uppercase or capitalize them, which + means first letter uppercase, rest lowercase. + + This can be useful e.g. if you highlight Pascal code and want to adapt the + code to your styleguide. + + Options accepted: + + `case` : string + The casing to convert keywords to. Must be one of ``'lower'``, + ``'upper'`` or ``'capitalize'``. The default is ``'lower'``. + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + case = get_choice_opt(options, 'case', + ['lower', 'upper', 'capitalize'], 'lower') + self.convert = getattr(str, case) + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype in Keyword: + yield ttype, self.convert(value) + else: + yield ttype, value + + +class NameHighlightFilter(Filter): + """Highlight a normal Name (and Name.*) token with a different token type. + + Example:: + + filter = NameHighlightFilter( + names=['foo', 'bar', 'baz'], + tokentype=Name.Function, + ) + + This would highlight the names "foo", "bar" and "baz" + as functions. `Name.Function` is the default token type. + + Options accepted: + + `names` : list of strings + A list of names that should be given the different token type. + There is no default. + `tokentype` : TokenType or string + A token type or a string containing a token type name that is + used for highlighting the strings in `names`. The default is + `Name.Function`. + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + self.names = set(get_list_opt(options, 'names', [])) + tokentype = options.get('tokentype') + if tokentype: + self.tokentype = string_to_tokentype(tokentype) + else: + self.tokentype = Name.Function + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype in Name and value in self.names: + yield self.tokentype, value + else: + yield ttype, value + + +class ErrorToken(Exception): + pass + + +class RaiseOnErrorTokenFilter(Filter): + """Raise an exception when the lexer generates an error token. + + Options accepted: + + `excclass` : Exception class + The exception class to raise. + The default is `pygments.filters.ErrorToken`. + + .. versionadded:: 0.8 + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + self.exception = options.get('excclass', ErrorToken) + try: + # issubclass() will raise TypeError if first argument is not a class + if not issubclass(self.exception, Exception): + raise TypeError + except TypeError: + raise OptionError('excclass option is not an exception class') + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype is Error: + raise self.exception(value) + yield ttype, value + + +class VisibleWhitespaceFilter(Filter): + """Convert tabs, newlines and/or spaces to visible characters. + + Options accepted: + + `spaces` : string or bool + If this is a one-character string, spaces will be replaces by this string. + If it is another true value, spaces will be replaced by ``·`` (unicode + MIDDLE DOT). If it is a false value, spaces will not be replaced. The + default is ``False``. + `tabs` : string or bool + The same as for `spaces`, but the default replacement character is ``»`` + (unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK). The default value + is ``False``. Note: this will not work if the `tabsize` option for the + lexer is nonzero, as tabs will already have been expanded then. + `tabsize` : int + If tabs are to be replaced by this filter (see the `tabs` option), this + is the total number of characters that a tab should be expanded to. + The default is ``8``. + `newlines` : string or bool + The same as for `spaces`, but the default replacement character is ``¶`` + (unicode PILCROW SIGN). The default value is ``False``. + `wstokentype` : bool + If true, give whitespace the special `Whitespace` token type. This allows + styling the visible whitespace differently (e.g. greyed out), but it can + disrupt background colors. The default is ``True``. + + .. versionadded:: 0.8 + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + for name, default in [('spaces', '·'), + ('tabs', '»'), + ('newlines', '¶')]: + opt = options.get(name, False) + if isinstance(opt, str) and len(opt) == 1: + setattr(self, name, opt) + else: + setattr(self, name, (opt and default or '')) + tabsize = get_int_opt(options, 'tabsize', 8) + if self.tabs: + self.tabs += ' ' * (tabsize - 1) + if self.newlines: + self.newlines += '\n' + self.wstt = get_bool_opt(options, 'wstokentype', True) + + def filter(self, lexer, stream): + if self.wstt: + spaces = self.spaces or ' ' + tabs = self.tabs or '\t' + newlines = self.newlines or '\n' + regex = re.compile(r'\s') + + def replacefunc(wschar): + if wschar == ' ': + return spaces + elif wschar == '\t': + return tabs + elif wschar == '\n': + return newlines + return wschar + + for ttype, value in stream: + yield from _replace_special(ttype, value, regex, Whitespace, + replacefunc) + else: + spaces, tabs, newlines = self.spaces, self.tabs, self.newlines + # simpler processing + for ttype, value in stream: + if spaces: + value = value.replace(' ', spaces) + if tabs: + value = value.replace('\t', tabs) + if newlines: + value = value.replace('\n', newlines) + yield ttype, value + + +class GobbleFilter(Filter): + """Gobbles source code lines (eats initial characters). + + This filter drops the first ``n`` characters off every line of code. This + may be useful when the source code fed to the lexer is indented by a fixed + amount of space that isn't desired in the output. + + Options accepted: + + `n` : int + The number of characters to gobble. + + .. versionadded:: 1.2 + """ + def __init__(self, **options): + Filter.__init__(self, **options) + self.n = get_int_opt(options, 'n', 0) + + def gobble(self, value, left): + if left < len(value): + return value[left:], 0 + else: + return '', left - len(value) + + def filter(self, lexer, stream): + n = self.n + left = n # How many characters left to gobble. + for ttype, value in stream: + # Remove ``left`` tokens from first line, ``n`` from all others. + parts = value.split('\n') + (parts[0], left) = self.gobble(parts[0], left) + for i in range(1, len(parts)): + (parts[i], left) = self.gobble(parts[i], n) + value = '\n'.join(parts) + + if value != '': + yield ttype, value + + +class TokenMergeFilter(Filter): + """Merges consecutive tokens with the same token type in the output + stream of a lexer. + + .. versionadded:: 1.2 + """ + def __init__(self, **options): + Filter.__init__(self, **options) + + def filter(self, lexer, stream): + current_type = None + current_value = None + for ttype, value in stream: + if ttype is current_type: + current_value += value + else: + if current_type is not None: + yield current_type, current_value + current_type = ttype + current_value = value + if current_type is not None: + yield current_type, current_value + + +FILTERS = { + 'codetagify': CodeTagFilter, + 'keywordcase': KeywordCaseFilter, + 'highlight': NameHighlightFilter, + 'raiseonerror': RaiseOnErrorTokenFilter, + 'whitespace': VisibleWhitespaceFilter, + 'gobble': GobbleFilter, + 'tokenmerge': TokenMergeFilter, + 'symbols': SymbolFilter, +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61fff9924f6835adc1c5b302fe7ee7f548d3086e GIT binary patch literal 37956 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py new file mode 100644 index 0000000..3ca4892 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py @@ -0,0 +1,124 @@ +""" + pygments.formatter + ~~~~~~~~~~~~~~~~~~ + + Base formatter class. + + :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import codecs + +from pip._vendor.pygments.util import get_bool_opt +from pip._vendor.pygments.styles import get_style_by_name + +__all__ = ['Formatter'] + + +def _lookup_style(style): + if isinstance(style, str): + return get_style_by_name(style) + return style + + +class Formatter: + """ + Converts a token stream to text. + + Formatters should have attributes to help selecting them. These + are similar to the corresponding :class:`~pygments.lexer.Lexer` + attributes. + + .. autoattribute:: name + :no-value: + + .. autoattribute:: aliases + :no-value: + + .. autoattribute:: filenames + :no-value: + + You can pass options as keyword arguments to the constructor. + All formatters accept these basic options: + + ``style`` + The style to use, can be a string or a Style subclass + (default: "default"). Not used by e.g. the + TerminalFormatter. + ``full`` + Tells the formatter to output a "full" document, i.e. + a complete self-contained document. This doesn't have + any effect for some formatters (default: false). + ``title`` + If ``full`` is true, the title that should be used to + caption the document (default: ''). + ``encoding`` + If given, must be an encoding name. This will be used to + convert the Unicode token strings to byte strings in the + output. If it is "" or None, Unicode strings will be written + to the output file, which most file-like objects do not + support (default: None). + ``outencoding`` + Overrides ``encoding`` if given. + + """ + + #: Full name for the formatter, in human-readable form. + name = None + + #: A list of short, unique identifiers that can be used to lookup + #: the formatter from a list, e.g. using :func:`.get_formatter_by_name()`. + aliases = [] + + #: A list of fnmatch patterns that match filenames for which this + #: formatter can produce output. The patterns in this list should be unique + #: among all formatters. + filenames = [] + + #: If True, this formatter outputs Unicode strings when no encoding + #: option is given. + unicodeoutput = True + + def __init__(self, **options): + """ + As with lexers, this constructor takes arbitrary optional arguments, + and if you override it, you should first process your own options, then + call the base class implementation. + """ + self.style = _lookup_style(options.get('style', 'default')) + self.full = get_bool_opt(options, 'full', False) + self.title = options.get('title', '') + self.encoding = options.get('encoding', None) or None + if self.encoding in ('guess', 'chardet'): + # can happen for e.g. pygmentize -O encoding=guess + self.encoding = 'utf-8' + self.encoding = options.get('outencoding') or self.encoding + self.options = options + + def get_style_defs(self, arg=''): + """ + This method must return statements or declarations suitable to define + the current style for subsequent highlighted text (e.g. CSS classes + in the `HTMLFormatter`). + + The optional argument `arg` can be used to modify the generation and + is formatter dependent (it is standardized because it can be given on + the command line). + + This method is called by the ``-S`` :doc:`command-line option `, + the `arg` is then given by the ``-a`` option. + """ + return '' + + def format(self, tokensource, outfile): + """ + This method must format the tokens from the `tokensource` iterable and + write the formatted version to the file object `outfile`. + + Formatter options can control how exactly the tokens are converted. + """ + if self.encoding: + # wrap the outfile in a StreamWriter + outfile = codecs.lookup(self.encoding)[3](outfile) + return self.format_unencoded(tokensource, outfile) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py new file mode 100644 index 0000000..39db842 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py @@ -0,0 +1,158 @@ +""" + pygments.formatters + ~~~~~~~~~~~~~~~~~~~ + + Pygments formatters. + + :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re +import sys +import types +import fnmatch +from os.path import basename + +from pip._vendor.pygments.formatters._mapping import FORMATTERS +from pip._vendor.pygments.plugin import find_plugin_formatters +from pip._vendor.pygments.util import ClassNotFound + +__all__ = ['get_formatter_by_name', 'get_formatter_for_filename', + 'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS) + +_formatter_cache = {} # classes by name +_pattern_cache = {} + + +def _fn_matches(fn, glob): + """Return whether the supplied file name fn matches pattern filename.""" + if glob not in _pattern_cache: + pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) + return pattern.match(fn) + return _pattern_cache[glob].match(fn) + + +def _load_formatters(module_name): + """Load a formatter (and all others in the module too).""" + mod = __import__(module_name, None, None, ['__all__']) + for formatter_name in mod.__all__: + cls = getattr(mod, formatter_name) + _formatter_cache[cls.name] = cls + + +def get_all_formatters(): + """Return a generator for all formatter classes.""" + # NB: this returns formatter classes, not info like get_all_lexers(). + for info in FORMATTERS.values(): + if info[1] not in _formatter_cache: + _load_formatters(info[0]) + yield _formatter_cache[info[1]] + for _, formatter in find_plugin_formatters(): + yield formatter + + +def find_formatter_class(alias): + """Lookup a formatter by alias. + + Returns None if not found. + """ + for module_name, name, aliases, _, _ in FORMATTERS.values(): + if alias in aliases: + if name not in _formatter_cache: + _load_formatters(module_name) + return _formatter_cache[name] + for _, cls in find_plugin_formatters(): + if alias in cls.aliases: + return cls + + +def get_formatter_by_name(_alias, **options): + """ + Return an instance of a :class:`.Formatter` subclass that has `alias` in its + aliases list. The formatter is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no formatter with that + alias is found. + """ + cls = find_formatter_class(_alias) + if cls is None: + raise ClassNotFound("no formatter found for name %r" % _alias) + return cls(**options) + + +def load_formatter_from_file(filename, formattername="CustomFormatter", **options): + """ + Return a `Formatter` subclass instance loaded from the provided file, relative + to the current directory. + + The file is expected to contain a Formatter class named ``formattername`` + (by default, CustomFormatter). Users should be very careful with the input, because + this method is equivalent to running ``eval()`` on the input file. The formatter is + given the `options` at its instantiation. + + :exc:`pygments.util.ClassNotFound` is raised if there are any errors loading + the formatter. + + .. versionadded:: 2.2 + """ + try: + # This empty dict will contain the namespace for the exec'd file + custom_namespace = {} + with open(filename, 'rb') as f: + exec(f.read(), custom_namespace) + # Retrieve the class `formattername` from that namespace + if formattername not in custom_namespace: + raise ClassNotFound('no valid %s class found in %s' % + (formattername, filename)) + formatter_class = custom_namespace[formattername] + # And finally instantiate it with the options + return formatter_class(**options) + except OSError as err: + raise ClassNotFound('cannot read %s: %s' % (filename, err)) + except ClassNotFound: + raise + except Exception as err: + raise ClassNotFound('error when loading custom formatter: %s' % err) + + +def get_formatter_for_filename(fn, **options): + """ + Return a :class:`.Formatter` subclass instance that has a filename pattern + matching `fn`. The formatter is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no formatter for that filename + is found. + """ + fn = basename(fn) + for modname, name, _, filenames, _ in FORMATTERS.values(): + for filename in filenames: + if _fn_matches(fn, filename): + if name not in _formatter_cache: + _load_formatters(modname) + return _formatter_cache[name](**options) + for cls in find_plugin_formatters(): + for filename in cls.filenames: + if _fn_matches(fn, filename): + return cls(**options) + raise ClassNotFound("no formatter found for file name %r" % fn) + + +class _automodule(types.ModuleType): + """Automatically import formatters.""" + + def __getattr__(self, name): + info = FORMATTERS.get(name) + if info: + _load_formatters(info[0]) + cls = _formatter_cache[info[1]] + setattr(self, name, cls) + return cls + raise AttributeError(name) + + +oldmod = sys.modules[__name__] +newmod = _automodule(__name__) +newmod.__dict__.update(oldmod.__dict__) +sys.modules[__name__] = newmod +del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b31ea309abcaca2a26027009006fd8a3a22b735b GIT binary patch literal 6946 zcmcgwYit|Yb-u$HzA2J=KP`_WOBVH@9NUf8^4hLmUT1A<6Wi$~N(*Yl8A>BlGu)Y> zWT}*+7z;#hwp|(tA{jxkYSABF7)2lGkMu{;-4rMa6fMN13d<83*rF}a{L@MX((eB0 zId_H++1jN2(}Cvl>b~cmbH4MP^N&?kJ_67AJHIu1s-BR4!+(m8)2ywcCY=keDHnrdxuko+Gv%RmXVSaioAS}RE9qYdOa&M+ zOGNh{GY%qENuDRL3qC9GP6cH$6@oV`dfp{d)uI>58qo)3t>}lcP7FXKTr!sbx)`oim2{v0{}!ed^R#2Tz|meTJV|=8ZXt zFD+n5!omQrOAp5p+or79^nm46E|y)5o4)jdRA6q_PZkdt&bvj+QwWU@R>H=B~GAeI|q2~Ay~Gvba4 zp`rnx${hSX6dNSN7^TidMjJJ3bs}V*D|M7AhPzmu_Y`a8-wgA_R`=rXU1rr$UO&U2 zLS!8C{_>n+EklZPZjs6vsJy>!e1usUy(t-KP2rd3B#^U4g{`MksiZ84Jl-0QSIQ?8 z9uzG;C+U2ODx5+)u`e2NnZcOd8jA}s$aH9u>5i)lDOkXCClor@^ctF==t;qlOebxL zu%;uSnA~hqoiW|^5;|TaDEa5BLko&A6d(Gg4*ETGMKUCXAJ=429vYYQJBFGXN@?o6 zWQ-`fJd>1$7M3MtaVROz45gNhIaN6m{mSVfT{fh_ln}oo%u4!DN=^;M79~YgH5gUk&Rd^np!sfv4j${KU!;mGqu61--Kd~eCqc9=u*zzQHb>aS<8nlfAz-G zvlF?q6Ca8Bv)A&G>)W2|>+T;#x9V~=J-eZX_g5dRZr;p?_-zkg@HcOs$oY>y^>^p| z-CHwxe`K4B9Kfn1ZtDQni3?t;ZTF$FL5xyg2B8#ycb0i#>)9%kVdg6}73aeA^ehg7@I3P+TL-A(1$@ak?6H23F#D(M5)ei>>j$F7SAMV;Gth0BW+x3UC%!6|~EqytEUm?)8 zd3&ql(c3$L?n1DA)7Tn$w3G{;%zIAmxncMV4{09CH=WuijI-%MV4Yb%zZ-1)LFh9U z{{L?sjo|)B(?|<*v<3b%^jBKouaRaS+%SAH-ta2B%B^x4l3^E#&b$}QI1WkIUm@L+ z2RI~GD)G33A-Bkv$P*Ni%9C4l!amM+V8M&^ichadt_6)vW zNXi1ZX&>5>r3pGesVWjLCwN6QKo!9AS}uPw;-V7Qx?!)E#BI9iLXr-?!AYxHJB~Vr z1zZr(PGSM@MCkS7c17c@qyE37BQdIL8tTM39F9H?l)^^_&pjQum>am5AGo|vIA>qZ z)4T4^-rhX7HL~^2u0Nc8;}d`DZm4#rwLcf?FNFE6)}8QRp|)#lJXag}BoNv2!Yo** zHj=ODL&I-;-~!z^gLB6=u06c=iU0U+ZNu-qi6-A@nS2R`;S{LX=#UStLQ$z8WtWUb zwiYZ?1Chy)70|b$5#I;4n{kK^8KC)3m_J}{fuRT-Y*HZrUQhs8bwg0%60aseV#D-G zhNq)fiu7-q*V8k!6%bf3_&Gu6r|G>=#Sd+v@JU%WqWo>(b){?OWu2du!8K9{ zpH@?btSb664~xNU`v8V4V6&|sZ_5Dvnjq^EKP=si4^J08YBX)g$>>-mS%YJs0#)p{ zBpY+|u=G>u$?yyn3bxXIXaeoQ1uRC=t$j!$4yqR#S}-7t3p@>|uj#f=Z|N5cokiu+ zkcQFX3RHBA3P6{_#D9EqG4JaEH{kZI{ca)Hy508rPZx7-6ZznkZO@fw{@{a4*~SN# zwz+0Y4-oQ-53Wh|;5rCygLsKdR@uW2yXbU(gRF98ZOCx*s6#J3MX=7W#aR#~fsTkJ z*Ug|KXTd#GmjOg%Gt5sQ#>$YNFn`FE^(zDI=oVI;plMFg1DfWrG_8w#1wd&Dz~$TE zuFz%NWxq|9m@Zs_UL>i768bmreaSx1?;~*q22T|k7~-N#TY!lU@R|hd6SSNz zX{dBaJgsREO!1?{Pc9m zsF1@Rg?o$cKm&sTNq5ym^X^^HOxoUPtyc-Zj6rtQ}Loxs2^S!myLkwEh{e=6rc z^}Ob|*%AE<&mPNk3?C4t_5#eTy6|aB-{Xt9mhFa` zH6&1rv}&Ar9&G)~tA8EeZX3-9$F@CVUljaJ*c06KR2BSnSiQkeWS#g2HrIA7AH*=} z3)mCdKiAL0ciaz-bdYT8NIm-`0=19pog?k;k6YYW@9>Uxu^;zUk6d6szEBVKpM`^? z?d;Fmolrl-+e&bJlfrQ&5I?cq_bMra@KMov5rTo6|EA66EH38+Hs^%aGXSU+un5e{ zRRn9`d0~jGN)QS#?KjXp&dUv+V%*@GBWf37kvR1cFEaR+?C_ zgMPXk4Yny>C6wt`aq0h;pMWt^dQv(nJ>p9YrRz%=N;z@Tty%El)sTl&5N6CMyv&-t z#cRu z)Vo{TxO03cS36XwJF)flPTgRk@#JGJ*EpDKeC^NOQ0#m*mG@AE~ zZF6IxfwH_}mKr!8 z3kkk5kdy+(`;eTOq%pX50+z6&GLwbeiWPrjByPHOJJk{#frN`ZlQtykwcvUD~%P`8LjBZ!W8{$P^^(csQLYS5AJP>`B2w7_skzU z6r$I3Zk>J1{L#5wP5=5>AyAtg-#oF!?gUOiw6*?bAqdfYKG?bK>7)XO%!28OQCAs@ zVGha82*u1mEcQ-XNTO9h4F<*Lyv|CY_j^YZaR(S6y!HT*x*+6C?MDzHEy#P(u+|$y$Bh^S90`G zNGGOJ0B}~Or1i+*R^po`P0Z#aM__biQ4bCSIhsndkR*U7rNGjOHJVVtz}X6WC~-hE zFnu?uE!>6=p_gJJxIoTM*HC<>OHGQ2^Q&yl&0E zqoagW12r z)H37Divb_gmF<37)0wO3d_mx!y%yrDdcXBSYxY|?Z~L0-nYS+ctvuFtiR=5J?}eU{ zh8$_gE^d7H;dgh)$=#;*HTL`d@A=oS=1Bc6=Ucmx{c85&R?k-7mDFhJi!YX=|WB5Y&<_S%#zt673YZn8V%Sa;)X< zc4jDv3$#E#Lk~R_=%t5#jvmuPkHww>lkl%s~Fe3n;6%FT)U?w^ip=PJj^w`D*iRcDv^@J9zP$om4_Fw+xCG}7gbe!SD? z{-mqtt0TEdS7qN%FJXAy>Bn%?!3W+-)8}!$oYX#PU?Dl(RDv79II}xUl5W;jQNJ)Q z_mZ5Kn%vZ62s;>>UKBDigv{HO9mUlUurXhRLRpQmJi}R57YSKst-f@5TXui!hnhtQ zS(|;?t(Q|L|B$ViBxY>u_RiKjGjwTNMcuBA3maHBr=jf=S6a(Ibw?pfN@>mHi&Yxc z3|5k@De;wyFri%@6S@&|dpyJ)05Yk7RuC!1Ll1!$8m7%KKol%KH~nDJrnPA{^}v)? zpSSjQfn}AbdL^0pq(L(R72o9BixzRsh@btMwcDTTn1^4q+stqu;lD9tp6K#HU>@c% z;KClH7eic#&&8*r`jjOrk;grVf47;C#)=X)dhM!K+bxH$>c^kh+P>VT0F zMJiXV;YNql?#RNY?*6!dFT#LRHvP1U^`F7Hj)teh|26o*3kWqUTvd;9rDu__16hA)kjnv=de?>UWz}(PtzIO zi7hl(NPcIf3N{8SIKw(lLe0^rN1Un#L4#|G6m_Ru1t@g7KCWuv&|E0zQ|o~;-PAd3 zZBY}#yg1)q58KhELZDCl)WMAr1ejY0FiF093j%w!%tzhsNf#bUG%5CDGyn}= zGw@xU#X?E)oCgi|jJrJ+$WXATn@16Kl)Q^j=u?jnfgom!5`+Wk;z87IpJ9(6YPW}& zxe*+dA!+~`19}seA>BSYhZ!}pLQ(OsqwJC)+KTiBJQ#-w8Z4q@r6p7!+Jeu1^LPTP z^Qrj+6i2-2{DffLN#`f`=3tkO0s)<=gTW@&Hy82DJIs^)qaAoby?@+d9_IILqsVqz zsQA<}jZR?@C=S5|?8;+uk+nxQjXfc_E-25Rv4s|cgyn{X;*_q%K447`E3tj<5pabW zr;$1)xRpXY218``TSwt3etTLG8kwBVjzp03v*XoEg&P*5zx`y4^7=W3Wb^;y_4>$# zmKuosj4{&nntDvle+up%eeXa1dT3IV6s0so83_l(9PHQ5foF8j)&*7pZ6ng5Qs0-3s_UezkYx* zbIRp%HhXQU^55$9tW;V{oXi3BZFLpY`qxfY1C`B`YHLLAJJ}_oXG=BWUiB;4WuoUw zwH44e{#4E8iC!qxuKj1lWQ#;B70fLsyF&EULfI=PTPFIwV&7DL&RHc}C3>xp?^Uv!M6cs8>|bwHvs*;pE@)HD?hyTcA^*IV-6fh8@=vSTJ)%D- d)$T$5{>xf+pXd*Z{TG$*AAtVzoO%wp{s&#alBrTp zPrrU&zxVp})8BUO3UKh8nf-0{b&%tJWFL)3bSE2UVe*huxCE#0ibvz~o`i>IbFb#j z3kd<{LY7a69_})yh+o4O_B`=A+zDUF7x9<>8bI(AO4&TtDTz)SW?rTgnZLLr3`%&yTQ7dQ%Ng=C?^x78;BGO1;eB^&}lg{n>CH1u7I_gVS>3Z zO&g{H=`w_X!Io#+%p3vsjFHb9y6ZNga@JM>`()~>yZ3`J-0wCG87Dmi#YCuAO+fF=~A&lEew43-# zia@r!NiIk!%9>U}fDXwSw{(Y5M&Or03UY=;QK#tWt(=<4fj*VkmH^z&L9)Z77!7?G zrBaNQF{M%nl2SGFh>awJn+XI29AOYrTb7O?BS0Y7robtcT^4}Y#Cc;5D=wDj6-8w< zS##w=gfbaipje4JCo)B7Ny8~yDm(W#0Umn^aA9~2+192pKtQO;@B*zey1}?02Q>ln+PKpHwz-_6!It`~A05=ddi=eDfv~v&{MarhC4wO{N z2`YeN=gW4=re%#_P~>1JWH6QgxbwuZAQsHq+7YG`$m#qv3| z#PT_X((=HYcS{I+v0~5;zl}e`@Q|ZT+DxO+zG* zRaa>;X)+C#m}Fbw#r9b~JCBGJOy=cToOHe-9!nrto3{K;q7%Y=N9fJ%SYD^GOzblP zwIg;3Q>>$LQ&rU1I3}~yD8ve;F@x!Oov3LI$MPkt&&4z~9V?V*&d^7qKO2q_mEsd{ zVrJzmCb5EAh$ZK+t{5h4a_+NO^B9tt6Q(HKNDPJY{w-HQwBg(cP{|b-=D8oFJ>N^A zH7Qj4a7{YCeEOMm{DI;th0syP>Rk($|1T2D-gdw08zzr_ZJOH&LY~waujlHc{J~)Sye<)uehW!n6mh-Y$`O z)|A};oxsv*_k;y$Vi)alI~;4cG|s*EKA9>@lQH{i$`aCsrj)&t>8Y|X8B0%DK9$OF z;lq+@FR4>j8(cZq)KneAYSCUTPC;skc9NN$pfDnuUGTC*N=pT73BWMT=(0&IFXRMa zrvM5bLS_%l%snua2i{46O{x2H*g+n{FwfQd4=%+Y#b0xsZ9{jj-MP5%VLddk8XSPx zg?dN#!sUC_dS`EKaHVG@`|aRb->J3EQww5!FIpa1+xx+Sm+iT9ufq29F79TOff`xV z9Kw}*Uu{pg_N)WFOL^(z4u@B~%b`2t53b$4Rui8E54<`AhMB!!Yo=Kq;6s9+on`}1FSMgTdY`-6`c+Ju6HB|(b-}dS9SEU^=@XoLT zzU8U-L4!2yZFt#u15UoGw<1=B`*Q;Kf7blJMM&6W^R~5T$JmPhjgtg-$d;}hF!r@1 zmRQa3Pn3O52T<;uWL?rZcD>k*(UiFlVo~-_LRr`86q~RcXzC3gi1^IiK(oYKCR_?; z2h8odVEGErit5x7W(-w_7TvBA?M_c_H_LD}73s99VapHA4V{xUOJWmNN6bN6Cae{) zd63COFpxGF>{`;SCswC((IksH)|pL88JgY;FuBy|1Kqz?tsN6g)Co9bP+;0S9>nj( z>%r~^*Y94h9eoje@9m}4(9nzEiS@3YJN|n2zB|(TK=?HmXghTGQ>a0s^{#z2x^(-| z?X|9B_5FiO!AHRb@uipR-tR0w>pHgH(NmM`g0inRy4Hyn{r~6=)epV@xc{5}mCx4> zom%{4;bLv1-qZi^`r`HF!;iz?gjYtNhW|3MdhFxphkyB^=X^bMaKT^iM~l+SUQqpN zKNsw-_YE%fKk8rpe625f_Y<&Xq~XKirSPNh^5{zV>B#Eg)6YX6y$GIJf7{K-i{O#B z-K=d|s`V^|{upYAJMvxdAb1oyVwbszNPsmXx}3+!q!ma)2ci@;HV-C~zlVO^rTCLc z#mK<2z!oe&Tr4ud#A;*lW=q8G1?=0vJPz^rmb2wMcLcjK?7ws@XUGr?UvsZK{i5{p zBQDr8KVI+HSL<2bePI4_y|Zin>TAI#4!rK%BMxnRa6m+^p?)(4jMf3@PNHsi0xiha zf7?!f)wk`YB2_h~;R1KyuL!hXwq>kOX<7S5I_rS&3-dG(SnVcI4!M_Jp66eABwqMw hFUODmof}?nA6N|x&inu6OYl5eP=A8|xx8cUzXAG%K;!@b literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..925ee3f4bf62d891e8d09f9ad25d1636e0772f3b GIT binary patch literal 7284 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c8ca782bc4932bac19985315088941e4c66ee13 GIT binary patch literal 40592 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 G5dQySR9@=< literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e35d5466b798b6649f7b05d1fc20ed45140c3113 GIT binary patch literal 27063 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a5a572722fc2add5b9d2403a421282115d889c1 GIT binary patch literal 6085 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ead4ef346e62da119ac03e85df0fd502a28dda7 GIT binary patch literal 19974 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4952ca38b0e9df06762ca967768bbb4fef52fa3d GIT binary patch literal 6904 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 j_>$o7_BhKO;1LR^9?q2 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f224983d2e0457eb76dc1e7c8db4ad59550d821 GIT binary patch literal 2950 zcmcIm&2tpT74P}lon5VvkQN~%0gVX4EAR{v0fHoNfsu@nEkZ>$PHh}-jdohgpxK$t z%&cJ7BS%%?AW^CyowS@#s;CMs4k0(+@(1L?3R2ljd{8RogKrXwFP!qa_X8EB?QnDp|&R#E=ChArSGB`M!uNM z5zBLx8QaNeo<|&4$!k{D&S}nUAD;O9;OF=_eol?B`PoQ#WiH z8DhC)7{5O?R^xws?aKJ|sd1)XC!S`Qt`hy8`kdf`NYlO`&WxL6{xzwuxq*^2pyl!- zues5ZIAD4s8NL=THq+SAXXi&Stsx)Xu4jO8>yyttty8B!X9L9{wPXBxLCsm7no&P>AvNj;#3L3Sa}3>3$A~-Y z*?BeZ*tdyy*>Vlorsj&ono~_$@RT@2hfRi%8J2D=?Ye>8FL;0?$qysB6e;@@_Z024-XUXofS8 z&pqaT$8iW&DBY9-ScMvLZ{B0*SDz#FIY`a(^McOJi||N3#O)9WIqg0~uklra{iRlr zgeKujCEznjiAhF5GF0b=cX8z=H&W+DcX3;q+*qC4+T?r8G38@{3uYCzYtLo zCH7qpP#|S&({@VnQ5OP0qC+b*kke_yGQ4y;2)SMnDk+fII}r**mzXm_*v@;9 zbf7aBIn+NYqd8t609ag_1L%z~9GX^#;=FYD2JLBYwGE}A>m-P{e}-uReJk((o7_{8 zd&)nl$fwpXY{;iJySf*}<(ADp{Al9g#4FSmQIf zRc$};{E+(W#5dtTDV0N)D(#n6q-xjE_2aAdia=#<-k%4V@`2TTl+jmqSIrvZ7x#a& zH{+KZZO8WD^q+jvx!$)p_TZzXkIK?U?8x>}Fv|h#pbU*;V^DCj&i9ys8=xoX056~4 zs{`tMqXTjPaR4qLkO5bk5BU-Rr3v-M@d(XvPOmTR1tEa$f8WC`!!BQ(eFqZM<_li9 zaiZV+8#1^G%U68CN$joL7isdDh2eR5Z=d|IFVI5rWjep{Z!eAWf-lXB%f5*IKRWle zP#4}<1;r*_cRIjQC?C&DmZVV?UI{Uf?l|xpaJqpNgz_4+MUQpyM8xT#w3b>^wF^#$ zK#df<8N-Byskz>qW(G1{c*Q({vZ=j*S|CA`71uP$8de~)H7%hCoX9GuSw%s6?H7|S zSj3`@S}&d0v!vb@dk>Cs{{hniqLmV^b{<@mH|4emtxK&dGcV=Cn|&u=p=jh-y`(x0 zmc2(`KK!!MF<9+B{3!M?wjyl_sI$99-sl+IY>SuWjW%3uKlrj&eI~u=Jzr@*zZ(8$ zXHWH%`p1#4N1olSoVrwrzq2y2E?48dYm=*!>w{13RQk_<(_QJm{4)Ojw>`>}!i%1B zE8%J{UX`~FfC1axDArj$e)10^zaM#Ww{rZal^9-}D9hDY=Yz?m$@1X(ol1}Lth>^4 z@nvkd;X?MW@)1^c*Ao%iyeut8pm{~p>71<>OuCMx)4wigW}OpGr*%66WRVhrFmy-F zg*F$V38N&Jbu4EPV)iv+N7woo?b7UL+DAi5Th=|a&5M$}6+^L}g|TW|SGo21zJZ0S z)%K2sYp=w(r0ksTl8)BRlN|;21V`Wkq0}!Ba6x$c0$JdeEA#Un1Du zhQW>*;tWxfXwP95zLrO8J|~?EK%@UrcLJs@f#bMsUgpFf;)px96+*H8=h6O!@V1O3 sc~SW7hl|<2i($5y*^-3){6Z`EG;nqY@!YY0M=x+k%NKt@@M60D0~$~DUH||9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1f54633495e8ee83c2e6af1e832b8edaef618c0 GIT binary patch literal 6146 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 B)~)~m literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2349064c0cb431d4bf0fc252f1f1d74313e81a2e GIT binary patch literal 9086 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9865ace4658bf2455df2e0a9d4b55a0990a94040 GIT binary patch literal 15177 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py new file mode 100644 index 0000000..72ca840 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py @@ -0,0 +1,23 @@ +# Automatically generated by scripts/gen_mapfiles.py. +# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead. + +FORMATTERS = { + 'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'), + 'BmpImageFormatter': ('pygments.formatters.img', 'img_bmp', ('bmp', 'bitmap'), ('*.bmp',), 'Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'GifImageFormatter': ('pygments.formatters.img', 'img_gif', ('gif',), ('*.gif',), 'Create a GIF image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'GroffFormatter': ('pygments.formatters.groff', 'groff', ('groff', 'troff', 'roff'), (), 'Format tokens with groff escapes to change their color and font style.'), + 'HtmlFormatter': ('pygments.formatters.html', 'HTML', ('html',), ('*.html', '*.htm'), "Format tokens as HTML 4 ```` tags. By default, the content is enclosed in a ``
      `` tag, itself wrapped in a ``
      `` tag (but see the `nowrap` option). The ``
      ``'s CSS class can be set by the `cssclass` option."), + 'IRCFormatter': ('pygments.formatters.irc', 'IRC', ('irc', 'IRC'), (), 'Format tokens with IRC color sequences'), + 'ImageFormatter': ('pygments.formatters.img', 'img', ('img', 'IMG', 'png'), ('*.png',), 'Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'JpgImageFormatter': ('pygments.formatters.img', 'img_jpg', ('jpg', 'jpeg'), ('*.jpg',), 'Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'LatexFormatter': ('pygments.formatters.latex', 'LaTeX', ('latex', 'tex'), ('*.tex',), 'Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages.'), + 'NullFormatter': ('pygments.formatters.other', 'Text only', ('text', 'null'), ('*.txt',), 'Output the text unchanged without any formatting.'), + 'PangoMarkupFormatter': ('pygments.formatters.pangomarkup', 'Pango Markup', ('pango', 'pangomarkup'), (), 'Format tokens as Pango Markup code. It can then be rendered to an SVG.'), + 'RawTokenFormatter': ('pygments.formatters.other', 'Raw tokens', ('raw', 'tokens'), ('*.raw',), 'Format tokens as a raw representation for storing token streams.'), + 'RtfFormatter': ('pygments.formatters.rtf', 'RTF', ('rtf',), ('*.rtf',), 'Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents.'), + 'SvgFormatter': ('pygments.formatters.svg', 'SVG', ('svg',), ('*.svg',), 'Format tokens as an SVG graphics file. This formatter is still experimental. Each line of code is a ```` element with explicit ``x`` and ``y`` coordinates containing ```` elements with the individual token styles.'), + 'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.'), +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py new file mode 100644 index 0000000..c4db8f4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py @@ -0,0 +1,108 @@ +""" + pygments.formatters.bbcode + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + BBcode formatter. + + :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +from pip._vendor.pygments.formatter import Formatter +from pip._vendor.pygments.util import get_bool_opt + +__all__ = ['BBCodeFormatter'] + + +class BBCodeFormatter(Formatter): + """ + Format tokens with BBcodes. These formatting codes are used by many + bulletin boards, so you can highlight your sourcecode with pygments before + posting it there. + + This formatter has no support for background colors and borders, as there + are no common BBcode tags for that. + + Some board systems (e.g. phpBB) don't support colors in their [code] tag, + so you can't use the highlighting together with that tag. + Text in a [code] tag usually is shown with a monospace font (which this + formatter can do with the ``monofont`` option) and no spaces (which you + need for indentation) are removed. + + Additional options accepted: + + `style` + The style to use, can be a string or a Style subclass (default: + ``'default'``). + + `codetag` + If set to true, put the output into ``[code]`` tags (default: + ``false``) + + `monofont` + If set to true, add a tag to show the code with a monospace font + (default: ``false``). + """ + name = 'BBCode' + aliases = ['bbcode', 'bb'] + filenames = [] + + def __init__(self, **options): + Formatter.__init__(self, **options) + self._code = get_bool_opt(options, 'codetag', False) + self._mono = get_bool_opt(options, 'monofont', False) + + self.styles = {} + self._make_styles() + + def _make_styles(self): + for ttype, ndef in self.style: + start = end = '' + if ndef['color']: + start += '[color=#%s]' % ndef['color'] + end = '[/color]' + end + if ndef['bold']: + start += '[b]' + end = '[/b]' + end + if ndef['italic']: + start += '[i]' + end = '[/i]' + end + if ndef['underline']: + start += '[u]' + end = '[/u]' + end + # there are no common BBcodes for background-color and border + + self.styles[ttype] = start, end + + def format_unencoded(self, tokensource, outfile): + if self._code: + outfile.write('[code]') + if self._mono: + outfile.write('[font=monospace]') + + lastval = '' + lasttype = None + + for ttype, value in tokensource: + while ttype not in self.styles: + ttype = ttype.parent + if ttype == lasttype: + lastval += value + else: + if lastval: + start, end = self.styles[lasttype] + outfile.write(''.join((start, lastval, end))) + lastval = value + lasttype = ttype + + if lastval: + start, end = self.styles[lasttype] + outfile.write(''.join((start, lastval, end))) + + if self._mono: + outfile.write('[/font]') + if self._code: + outfile.write('[/code]') + if self._code or self._mono: + outfile.write('\n') diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py new file mode 100644 index 0000000..30a528e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py @@ -0,0 +1,170 @@ +""" + pygments.formatters.groff + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + Formatter for groff output. + + :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import math +from pip._vendor.pygments.formatter import Formatter +from pip._vendor.pygments.util import get_bool_opt, get_int_opt + +__all__ = ['GroffFormatter'] + + +class GroffFormatter(Formatter): + """ + Format tokens with groff escapes to change their color and font style. + + .. versionadded:: 2.11 + + Additional options accepted: + + `style` + The style to use, can be a string or a Style subclass (default: + ``'default'``). + + `monospaced` + If set to true, monospace font will be used (default: ``true``). + + `linenos` + If set to true, print the line numbers (default: ``false``). + + `wrap` + Wrap lines to the specified number of characters. Disabled if set to 0 + (default: ``0``). + """ + + name = 'groff' + aliases = ['groff','troff','roff'] + filenames = [] + + def __init__(self, **options): + Formatter.__init__(self, **options) + + self.monospaced = get_bool_opt(options, 'monospaced', True) + self.linenos = get_bool_opt(options, 'linenos', False) + self._lineno = 0 + self.wrap = get_int_opt(options, 'wrap', 0) + self._linelen = 0 + + self.styles = {} + self._make_styles() + + + def _make_styles(self): + regular = '\\f[CR]' if self.monospaced else '\\f[R]' + bold = '\\f[CB]' if self.monospaced else '\\f[B]' + italic = '\\f[CI]' if self.monospaced else '\\f[I]' + + for ttype, ndef in self.style: + start = end = '' + if ndef['color']: + start += '\\m[%s]' % ndef['color'] + end = '\\m[]' + end + if ndef['bold']: + start += bold + end = regular + end + if ndef['italic']: + start += italic + end = regular + end + if ndef['bgcolor']: + start += '\\M[%s]' % ndef['bgcolor'] + end = '\\M[]' + end + + self.styles[ttype] = start, end + + + def _define_colors(self, outfile): + colors = set() + for _, ndef in self.style: + if ndef['color'] is not None: + colors.add(ndef['color']) + + for color in sorted(colors): + outfile.write('.defcolor ' + color + ' rgb #' + color + '\n') + + + def _write_lineno(self, outfile): + self._lineno += 1 + outfile.write("%s% 4d " % (self._lineno != 1 and '\n' or '', self._lineno)) + + + def _wrap_line(self, line): + length = len(line.rstrip('\n')) + space = ' ' if self.linenos else '' + newline = '' + + if length > self.wrap: + for i in range(0, math.floor(length / self.wrap)): + chunk = line[i*self.wrap:i*self.wrap+self.wrap] + newline += (chunk + '\n' + space) + remainder = length % self.wrap + if remainder > 0: + newline += line[-remainder-1:] + self._linelen = remainder + elif self._linelen + length > self.wrap: + newline = ('\n' + space) + line + self._linelen = length + else: + newline = line + self._linelen += length + + return newline + + + def _escape_chars(self, text): + text = text.replace('\\', '\\[u005C]'). \ + replace('.', '\\[char46]'). \ + replace('\'', '\\[u0027]'). \ + replace('`', '\\[u0060]'). \ + replace('~', '\\[u007E]') + copy = text + + for char in copy: + if len(char) != len(char.encode()): + uni = char.encode('unicode_escape') \ + .decode()[1:] \ + .replace('x', 'u00') \ + .upper() + text = text.replace(char, '\\[u' + uni[1:] + ']') + + return text + + + def format_unencoded(self, tokensource, outfile): + self._define_colors(outfile) + + outfile.write('.nf\n\\f[CR]\n') + + if self.linenos: + self._write_lineno(outfile) + + for ttype, value in tokensource: + while ttype not in self.styles: + ttype = ttype.parent + start, end = self.styles[ttype] + + for line in value.splitlines(True): + if self.wrap > 0: + line = self._wrap_line(line) + + if start and end: + text = self._escape_chars(line.rstrip('\n')) + if text != '': + outfile.write(''.join((start, text, end))) + else: + outfile.write(self._escape_chars(line.rstrip('\n'))) + + if line.endswith('\n'): + if self.linenos: + self._write_lineno(outfile) + self._linelen = 0 + else: + outfile.write('\n') + self._linelen = 0 + + outfile.write('\n.fi') diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py new file mode 100644 index 0000000..931d7c3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py @@ -0,0 +1,989 @@ +""" + pygments.formatters.html + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Formatter for HTML output. + + :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import functools +import os +import sys +import os.path +from io import StringIO + +from pip._vendor.pygments.formatter import Formatter +from pip._vendor.pygments.token import Token, Text, STANDARD_TYPES +from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt + +try: + import ctags +except ImportError: + ctags = None + +__all__ = ['HtmlFormatter'] + + +_escape_html_table = { + ord('&'): '&', + ord('<'): '<', + ord('>'): '>', + ord('"'): '"', + ord("'"): ''', +} + + +def escape_html(text, table=_escape_html_table): + """Escape &, <, > as well as single and double quotes for HTML.""" + return text.translate(table) + + +def webify(color): + if color.startswith('calc') or color.startswith('var'): + return color + else: + return '#' + color + + +def _get_ttype_class(ttype): + fname = STANDARD_TYPES.get(ttype) + if fname: + return fname + aname = '' + while fname is None: + aname = '-' + ttype[-1] + aname + ttype = ttype.parent + fname = STANDARD_TYPES.get(ttype) + return fname + aname + + +CSSFILE_TEMPLATE = '''\ +/* +generated by Pygments +Copyright 2006-2023 by the Pygments team. +Licensed under the BSD license, see LICENSE for details. +*/ +%(styledefs)s +''' + +DOC_HEADER = '''\ + + + + + %(title)s + + + + +

      %(title)s

      + +''' + +DOC_HEADER_EXTERNALCSS = '''\ + + + + + %(title)s + + + + +

      %(title)s

      + +''' + +DOC_FOOTER = '''\ + + +''' + + +class HtmlFormatter(Formatter): + r""" + Format tokens as HTML 4 ```` tags. By default, the content is enclosed + in a ``
      `` tag, itself wrapped in a ``
      `` tag (but see the `nowrap` option). + The ``
      ``'s CSS class can be set by the `cssclass` option. + + If the `linenos` option is set to ``"table"``, the ``
      `` is
      +    additionally wrapped inside a ```` which has one row and two
      +    cells: one containing the line numbers and one containing the code.
      +    Example:
      +
      +    .. sourcecode:: html
      +
      +        
      +
      + + +
      +
      1
      +            2
      +
      +
      def foo(bar):
      +              pass
      +            
      +
      + + (whitespace added to improve clarity). + + A list of lines can be specified using the `hl_lines` option to make these + lines highlighted (as of Pygments 0.11). + + With the `full` option, a complete HTML 4 document is output, including + the style definitions inside a `` + {% else %} + {{ head | safe }} + {% endif %} +{% if not embed %} + + +{% endif %} +{{ body | safe }} +{% for diagram in diagrams %} +
      +

      {{ diagram.title }}

      +
      {{ diagram.text }}
      +
      + {{ diagram.svg }} +
      +
      +{% endfor %} +{% if not embed %} + + +{% endif %} +""" + +template = Template(jinja2_template_source) + +# Note: ideally this would be a dataclass, but we're supporting Python 3.5+ so we can't do this yet +NamedDiagram = NamedTuple( + "NamedDiagram", + [("name", str), ("diagram", typing.Optional[railroad.DiagramItem]), ("index", int)], +) +""" +A simple structure for associating a name with a railroad diagram +""" + +T = TypeVar("T") + + +class EachItem(railroad.Group): + """ + Custom railroad item to compose a: + - Group containing a + - OneOrMore containing a + - Choice of the elements in the Each + with the group label indicating that all must be matched + """ + + all_label = "[ALL]" + + def __init__(self, *items): + choice_item = railroad.Choice(len(items) - 1, *items) + one_or_more_item = railroad.OneOrMore(item=choice_item) + super().__init__(one_or_more_item, label=self.all_label) + + +class AnnotatedItem(railroad.Group): + """ + Simple subclass of Group that creates an annotation label + """ + + def __init__(self, label: str, item): + super().__init__(item=item, label="[{}]".format(label) if label else label) + + +class EditablePartial(Generic[T]): + """ + Acts like a functools.partial, but can be edited. In other words, it represents a type that hasn't yet been + constructed. + """ + + # We need this here because the railroad constructors actually transform the data, so can't be called until the + # entire tree is assembled + + def __init__(self, func: Callable[..., T], args: list, kwargs: dict): + self.func = func + self.args = args + self.kwargs = kwargs + + @classmethod + def from_call(cls, func: Callable[..., T], *args, **kwargs) -> "EditablePartial[T]": + """ + If you call this function in the same way that you would call the constructor, it will store the arguments + as you expect. For example EditablePartial.from_call(Fraction, 1, 3)() == Fraction(1, 3) + """ + return EditablePartial(func=func, args=list(args), kwargs=kwargs) + + @property + def name(self): + return self.kwargs["name"] + + def __call__(self) -> T: + """ + Evaluate the partial and return the result + """ + args = self.args.copy() + kwargs = self.kwargs.copy() + + # This is a helpful hack to allow you to specify varargs parameters (e.g. *args) as keyword args (e.g. + # args=['list', 'of', 'things']) + arg_spec = inspect.getfullargspec(self.func) + if arg_spec.varargs in self.kwargs: + args += kwargs.pop(arg_spec.varargs) + + return self.func(*args, **kwargs) + + +def railroad_to_html(diagrams: List[NamedDiagram], embed=False, **kwargs) -> str: + """ + Given a list of NamedDiagram, produce a single HTML string that visualises those diagrams + :params kwargs: kwargs to be passed in to the template + """ + data = [] + for diagram in diagrams: + if diagram.diagram is None: + continue + io = StringIO() + try: + css = kwargs.get('css') + diagram.diagram.writeStandalone(io.write, css=css) + except AttributeError: + diagram.diagram.writeSvg(io.write) + title = diagram.name + if diagram.index == 0: + title += " (root)" + data.append({"title": title, "text": "", "svg": io.getvalue()}) + + return template.render(diagrams=data, embed=embed, **kwargs) + + +def resolve_partial(partial: "EditablePartial[T]") -> T: + """ + Recursively resolves a collection of Partials into whatever type they are + """ + if isinstance(partial, EditablePartial): + partial.args = resolve_partial(partial.args) + partial.kwargs = resolve_partial(partial.kwargs) + return partial() + elif isinstance(partial, list): + return [resolve_partial(x) for x in partial] + elif isinstance(partial, dict): + return {key: resolve_partial(x) for key, x in partial.items()} + else: + return partial + + +def to_railroad( + element: pyparsing.ParserElement, + diagram_kwargs: typing.Optional[dict] = None, + vertical: int = 3, + show_results_names: bool = False, + show_groups: bool = False, +) -> List[NamedDiagram]: + """ + Convert a pyparsing element tree into a list of diagrams. This is the recommended entrypoint to diagram + creation if you want to access the Railroad tree before it is converted to HTML + :param element: base element of the parser being diagrammed + :param diagram_kwargs: kwargs to pass to the Diagram() constructor + :param vertical: (optional) - int - limit at which number of alternatives should be + shown vertically instead of horizontally + :param show_results_names - bool to indicate whether results name annotations should be + included in the diagram + :param show_groups - bool to indicate whether groups should be highlighted with an unlabeled + surrounding box + """ + # Convert the whole tree underneath the root + lookup = ConverterState(diagram_kwargs=diagram_kwargs or {}) + _to_diagram_element( + element, + lookup=lookup, + parent=None, + vertical=vertical, + show_results_names=show_results_names, + show_groups=show_groups, + ) + + root_id = id(element) + # Convert the root if it hasn't been already + if root_id in lookup: + if not element.customName: + lookup[root_id].name = "" + lookup[root_id].mark_for_extraction(root_id, lookup, force=True) + + # Now that we're finished, we can convert from intermediate structures into Railroad elements + diags = list(lookup.diagrams.values()) + if len(diags) > 1: + # collapse out duplicate diags with the same name + seen = set() + deduped_diags = [] + for d in diags: + # don't extract SkipTo elements, they are uninformative as subdiagrams + if d.name == "...": + continue + if d.name is not None and d.name not in seen: + seen.add(d.name) + deduped_diags.append(d) + resolved = [resolve_partial(partial) for partial in deduped_diags] + else: + # special case - if just one diagram, always display it, even if + # it has no name + resolved = [resolve_partial(partial) for partial in diags] + return sorted(resolved, key=lambda diag: diag.index) + + +def _should_vertical( + specification: int, exprs: Iterable[pyparsing.ParserElement] +) -> bool: + """ + Returns true if we should return a vertical list of elements + """ + if specification is None: + return False + else: + return len(_visible_exprs(exprs)) >= specification + + +class ElementState: + """ + State recorded for an individual pyparsing Element + """ + + # Note: this should be a dataclass, but we have to support Python 3.5 + def __init__( + self, + element: pyparsing.ParserElement, + converted: EditablePartial, + parent: EditablePartial, + number: int, + name: str = None, + parent_index: typing.Optional[int] = None, + ): + #: The pyparsing element that this represents + self.element: pyparsing.ParserElement = element + #: The name of the element + self.name: typing.Optional[str] = name + #: The output Railroad element in an unconverted state + self.converted: EditablePartial = converted + #: The parent Railroad element, which we store so that we can extract this if it's duplicated + self.parent: EditablePartial = parent + #: The order in which we found this element, used for sorting diagrams if this is extracted into a diagram + self.number: int = number + #: The index of this inside its parent + self.parent_index: typing.Optional[int] = parent_index + #: If true, we should extract this out into a subdiagram + self.extract: bool = False + #: If true, all of this element's children have been filled out + self.complete: bool = False + + def mark_for_extraction( + self, el_id: int, state: "ConverterState", name: str = None, force: bool = False + ): + """ + Called when this instance has been seen twice, and thus should eventually be extracted into a sub-diagram + :param el_id: id of the element + :param state: element/diagram state tracker + :param name: name to use for this element's text + :param force: If true, force extraction now, regardless of the state of this. Only useful for extracting the + root element when we know we're finished + """ + self.extract = True + + # Set the name + if not self.name: + if name: + # Allow forcing a custom name + self.name = name + elif self.element.customName: + self.name = self.element.customName + else: + self.name = "" + + # Just because this is marked for extraction doesn't mean we can do it yet. We may have to wait for children + # to be added + # Also, if this is just a string literal etc, don't bother extracting it + if force or (self.complete and _worth_extracting(self.element)): + state.extract_into_diagram(el_id) + + +class ConverterState: + """ + Stores some state that persists between recursions into the element tree + """ + + def __init__(self, diagram_kwargs: typing.Optional[dict] = None): + #: A dictionary mapping ParserElements to state relating to them + self._element_diagram_states: Dict[int, ElementState] = {} + #: A dictionary mapping ParserElement IDs to subdiagrams generated from them + self.diagrams: Dict[int, EditablePartial[NamedDiagram]] = {} + #: The index of the next unnamed element + self.unnamed_index: int = 1 + #: The index of the next element. This is used for sorting + self.index: int = 0 + #: Shared kwargs that are used to customize the construction of diagrams + self.diagram_kwargs: dict = diagram_kwargs or {} + self.extracted_diagram_names: Set[str] = set() + + def __setitem__(self, key: int, value: ElementState): + self._element_diagram_states[key] = value + + def __getitem__(self, key: int) -> ElementState: + return self._element_diagram_states[key] + + def __delitem__(self, key: int): + del self._element_diagram_states[key] + + def __contains__(self, key: int): + return key in self._element_diagram_states + + def generate_unnamed(self) -> int: + """ + Generate a number used in the name of an otherwise unnamed diagram + """ + self.unnamed_index += 1 + return self.unnamed_index + + def generate_index(self) -> int: + """ + Generate a number used to index a diagram + """ + self.index += 1 + return self.index + + def extract_into_diagram(self, el_id: int): + """ + Used when we encounter the same token twice in the same tree. When this + happens, we replace all instances of that token with a terminal, and + create a new subdiagram for the token + """ + position = self[el_id] + + # Replace the original definition of this element with a regular block + if position.parent: + ret = EditablePartial.from_call(railroad.NonTerminal, text=position.name) + if "item" in position.parent.kwargs: + position.parent.kwargs["item"] = ret + elif "items" in position.parent.kwargs: + position.parent.kwargs["items"][position.parent_index] = ret + + # If the element we're extracting is a group, skip to its content but keep the title + if position.converted.func == railroad.Group: + content = position.converted.kwargs["item"] + else: + content = position.converted + + self.diagrams[el_id] = EditablePartial.from_call( + NamedDiagram, + name=position.name, + diagram=EditablePartial.from_call( + railroad.Diagram, content, **self.diagram_kwargs + ), + index=position.number, + ) + + del self[el_id] + + +def _worth_extracting(element: pyparsing.ParserElement) -> bool: + """ + Returns true if this element is worth having its own sub-diagram. Simply, if any of its children + themselves have children, then its complex enough to extract + """ + children = element.recurse() + return any(child.recurse() for child in children) + + +def _apply_diagram_item_enhancements(fn): + """ + decorator to ensure enhancements to a diagram item (such as results name annotations) + get applied on return from _to_diagram_element (we do this since there are several + returns in _to_diagram_element) + """ + + def _inner( + element: pyparsing.ParserElement, + parent: typing.Optional[EditablePartial], + lookup: ConverterState = None, + vertical: int = None, + index: int = 0, + name_hint: str = None, + show_results_names: bool = False, + show_groups: bool = False, + ) -> typing.Optional[EditablePartial]: + ret = fn( + element, + parent, + lookup, + vertical, + index, + name_hint, + show_results_names, + show_groups, + ) + + # apply annotation for results name, if present + if show_results_names and ret is not None: + element_results_name = element.resultsName + if element_results_name: + # add "*" to indicate if this is a "list all results" name + element_results_name += "" if element.modalResults else "*" + ret = EditablePartial.from_call( + railroad.Group, item=ret, label=element_results_name + ) + + return ret + + return _inner + + +def _visible_exprs(exprs: Iterable[pyparsing.ParserElement]): + non_diagramming_exprs = ( + pyparsing.ParseElementEnhance, + pyparsing.PositionToken, + pyparsing.And._ErrorStop, + ) + return [ + e + for e in exprs + if not (e.customName or e.resultsName or isinstance(e, non_diagramming_exprs)) + ] + + +@_apply_diagram_item_enhancements +def _to_diagram_element( + element: pyparsing.ParserElement, + parent: typing.Optional[EditablePartial], + lookup: ConverterState = None, + vertical: int = None, + index: int = 0, + name_hint: str = None, + show_results_names: bool = False, + show_groups: bool = False, +) -> typing.Optional[EditablePartial]: + """ + Recursively converts a PyParsing Element to a railroad Element + :param lookup: The shared converter state that keeps track of useful things + :param index: The index of this element within the parent + :param parent: The parent of this element in the output tree + :param vertical: Controls at what point we make a list of elements vertical. If this is an integer (the default), + it sets the threshold of the number of items before we go vertical. If True, always go vertical, if False, never + do so + :param name_hint: If provided, this will override the generated name + :param show_results_names: bool flag indicating whether to add annotations for results names + :returns: The converted version of the input element, but as a Partial that hasn't yet been constructed + :param show_groups: bool flag indicating whether to show groups using bounding box + """ + exprs = element.recurse() + name = name_hint or element.customName or element.__class__.__name__ + + # Python's id() is used to provide a unique identifier for elements + el_id = id(element) + + element_results_name = element.resultsName + + # Here we basically bypass processing certain wrapper elements if they contribute nothing to the diagram + if not element.customName: + if isinstance( + element, + ( + # pyparsing.TokenConverter, + # pyparsing.Forward, + pyparsing.Located, + ), + ): + # However, if this element has a useful custom name, and its child does not, we can pass it on to the child + if exprs: + if not exprs[0].customName: + propagated_name = name + else: + propagated_name = None + + return _to_diagram_element( + element.expr, + parent=parent, + lookup=lookup, + vertical=vertical, + index=index, + name_hint=propagated_name, + show_results_names=show_results_names, + show_groups=show_groups, + ) + + # If the element isn't worth extracting, we always treat it as the first time we say it + if _worth_extracting(element): + if el_id in lookup: + # If we've seen this element exactly once before, we are only just now finding out that it's a duplicate, + # so we have to extract it into a new diagram. + looked_up = lookup[el_id] + looked_up.mark_for_extraction(el_id, lookup, name=name_hint) + ret = EditablePartial.from_call(railroad.NonTerminal, text=looked_up.name) + return ret + + elif el_id in lookup.diagrams: + # If we have seen the element at least twice before, and have already extracted it into a subdiagram, we + # just put in a marker element that refers to the sub-diagram + ret = EditablePartial.from_call( + railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] + ) + return ret + + # Recursively convert child elements + # Here we find the most relevant Railroad element for matching pyparsing Element + # We use ``items=[]`` here to hold the place for where the child elements will go once created + if isinstance(element, pyparsing.And): + # detect And's created with ``expr*N`` notation - for these use a OneOrMore with a repeat + # (all will have the same name, and resultsName) + if not exprs: + return None + if len(set((e.name, e.resultsName) for e in exprs)) == 1: + ret = EditablePartial.from_call( + railroad.OneOrMore, item="", repeat=str(len(exprs)) + ) + elif _should_vertical(vertical, exprs): + ret = EditablePartial.from_call(railroad.Stack, items=[]) + else: + ret = EditablePartial.from_call(railroad.Sequence, items=[]) + elif isinstance(element, (pyparsing.Or, pyparsing.MatchFirst)): + if not exprs: + return None + if _should_vertical(vertical, exprs): + ret = EditablePartial.from_call(railroad.Choice, 0, items=[]) + else: + ret = EditablePartial.from_call(railroad.HorizontalChoice, items=[]) + elif isinstance(element, pyparsing.Each): + if not exprs: + return None + ret = EditablePartial.from_call(EachItem, items=[]) + elif isinstance(element, pyparsing.NotAny): + ret = EditablePartial.from_call(AnnotatedItem, label="NOT", item="") + elif isinstance(element, pyparsing.FollowedBy): + ret = EditablePartial.from_call(AnnotatedItem, label="LOOKAHEAD", item="") + elif isinstance(element, pyparsing.PrecededBy): + ret = EditablePartial.from_call(AnnotatedItem, label="LOOKBEHIND", item="") + elif isinstance(element, pyparsing.Group): + if show_groups: + ret = EditablePartial.from_call(AnnotatedItem, label="", item="") + else: + ret = EditablePartial.from_call(railroad.Group, label="", item="") + elif isinstance(element, pyparsing.TokenConverter): + label = type(element).__name__.lower() + if label == "tokenconverter": + ret = EditablePartial.from_call(railroad.Sequence, items=[]) + else: + ret = EditablePartial.from_call(AnnotatedItem, label=label, item="") + elif isinstance(element, pyparsing.Opt): + ret = EditablePartial.from_call(railroad.Optional, item="") + elif isinstance(element, pyparsing.OneOrMore): + ret = EditablePartial.from_call(railroad.OneOrMore, item="") + elif isinstance(element, pyparsing.ZeroOrMore): + ret = EditablePartial.from_call(railroad.ZeroOrMore, item="") + elif isinstance(element, pyparsing.Group): + ret = EditablePartial.from_call( + railroad.Group, item=None, label=element_results_name + ) + elif isinstance(element, pyparsing.Empty) and not element.customName: + # Skip unnamed "Empty" elements + ret = None + elif isinstance(element, pyparsing.ParseElementEnhance): + ret = EditablePartial.from_call(railroad.Sequence, items=[]) + elif len(exprs) > 0 and not element_results_name: + ret = EditablePartial.from_call(railroad.Group, item="", label=name) + elif len(exprs) > 0: + ret = EditablePartial.from_call(railroad.Sequence, items=[]) + else: + terminal = EditablePartial.from_call(railroad.Terminal, element.defaultName) + ret = terminal + + if ret is None: + return + + # Indicate this element's position in the tree so we can extract it if necessary + lookup[el_id] = ElementState( + element=element, + converted=ret, + parent=parent, + parent_index=index, + number=lookup.generate_index(), + ) + if element.customName: + lookup[el_id].mark_for_extraction(el_id, lookup, element.customName) + + i = 0 + for expr in exprs: + # Add a placeholder index in case we have to extract the child before we even add it to the parent + if "items" in ret.kwargs: + ret.kwargs["items"].insert(i, None) + + item = _to_diagram_element( + expr, + parent=ret, + lookup=lookup, + vertical=vertical, + index=i, + show_results_names=show_results_names, + show_groups=show_groups, + ) + + # Some elements don't need to be shown in the diagram + if item is not None: + if "item" in ret.kwargs: + ret.kwargs["item"] = item + elif "items" in ret.kwargs: + # If we've already extracted the child, don't touch this index, since it's occupied by a nonterminal + ret.kwargs["items"][i] = item + i += 1 + elif "items" in ret.kwargs: + # If we're supposed to skip this element, remove it from the parent + del ret.kwargs["items"][i] + + # If all this items children are none, skip this item + if ret and ( + ("items" in ret.kwargs and len(ret.kwargs["items"]) == 0) + or ("item" in ret.kwargs and ret.kwargs["item"] is None) + ): + ret = EditablePartial.from_call(railroad.Terminal, name) + + # Mark this element as "complete", ie it has all of its children + if el_id in lookup: + lookup[el_id].complete = True + + if el_id in lookup and lookup[el_id].extract and lookup[el_id].complete: + lookup.extract_into_diagram(el_id) + if ret is not None: + ret = EditablePartial.from_call( + railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] + ) + + return ret diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14a1bf2b3d1cc362c875df7c7de4f8c3b37eeb2a GIT binary patch literal 26833 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 YXQn4*UH7<*lJRj-Q^O+@1sMSTUv6Oe761SM literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py new file mode 100644 index 0000000..12219f1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py @@ -0,0 +1,299 @@ +# exceptions.py + +import re +import sys +import typing + +from .util import ( + col, + line, + lineno, + _collapse_string_to_ranges, + replaced_by_pep8, +) +from .unicode import pyparsing_unicode as ppu + + +class ExceptionWordUnicode(ppu.Latin1, ppu.LatinA, ppu.LatinB, ppu.Greek, ppu.Cyrillic): + pass + + +_extract_alphanums = _collapse_string_to_ranges(ExceptionWordUnicode.alphanums) +_exception_word_extractor = re.compile("([" + _extract_alphanums + "]{1,16})|.") + + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + + loc: int + msg: str + pstr: str + parser_element: typing.Any # "ParserElement" + args: typing.Tuple[str, int, typing.Optional[str]] + + __slots__ = ( + "loc", + "msg", + "pstr", + "parser_element", + "args", + ) + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( + self, + pstr: str, + loc: int = 0, + msg: typing.Optional[str] = None, + elem=None, + ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parser_element = elem + self.args = (pstr, loc, msg) + + @staticmethod + def explain_exception(exc, depth=16): + """ + Method to take an exception and translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - exc - exception raised during parsing (need not be a ParseException, in support + of Python exceptions that might be raised in a parse action) + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + """ + import inspect + from .core import ParserElement + + if depth is None: + depth = sys.getrecursionlimit() + ret = [] + if isinstance(exc, ParseBaseException): + ret.append(exc.line) + ret.append(" " * (exc.column - 1) + "^") + ret.append(f"{type(exc).__name__}: {exc}") + + if depth > 0: + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for i, ff in enumerate(callers[-depth:]): + frm = ff[0] + + f_self = frm.f_locals.get("self", None) + if isinstance(f_self, ParserElement): + if not frm.f_code.co_name.startswith( + ("parseImpl", "_parseNoCache") + ): + continue + if id(f_self) in seen: + continue + seen.add(id(f_self)) + + self_type = type(f_self) + ret.append( + f"{self_type.__module__}.{self_type.__name__} - {f_self}" + ) + + elif f_self is not None: + self_type = type(f_self) + ret.append(f"{self_type.__module__}.{self_type.__name__}") + + else: + code = frm.f_code + if code.co_name in ("wrapper", ""): + continue + + ret.append(code.co_name) + + depth -= 1 + if not depth: + break + + return "\n".join(ret) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parser_element) + + @property + def line(self) -> str: + """ + Return the line of text where the exception occurred. + """ + return line(self.loc, self.pstr) + + @property + def lineno(self) -> int: + """ + Return the 1-based line number of text where the exception occurred. + """ + return lineno(self.loc, self.pstr) + + @property + def col(self) -> int: + """ + Return the 1-based column on the line of text where the exception occurred. + """ + return col(self.loc, self.pstr) + + @property + def column(self) -> int: + """ + Return the 1-based column on the line of text where the exception occurred. + """ + return col(self.loc, self.pstr) + + # pre-PEP8 compatibility + @property + def parserElement(self): + return self.parser_element + + @parserElement.setter + def parserElement(self, elem): + self.parser_element = elem + + def __str__(self) -> str: + if self.pstr: + if self.loc >= len(self.pstr): + foundstr = ", found end of text" + else: + # pull out next word at error location + found_match = _exception_word_extractor.match(self.pstr, self.loc) + if found_match is not None: + found = found_match.group(0) + else: + found = self.pstr[self.loc : self.loc + 1] + foundstr = (", found %r" % found).replace(r"\\", "\\") + else: + foundstr = "" + return f"{self.msg}{foundstr} (at char {self.loc}), (line:{self.lineno}, col:{self.column})" + + def __repr__(self): + return str(self) + + def mark_input_line( + self, marker_string: typing.Optional[str] = None, *, markerString: str = ">!<" + ) -> str: + """ + Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + markerString = marker_string if marker_string is not None else markerString + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join( + (line_str[:line_column], markerString, line_str[line_column:]) + ) + return line_str.strip() + + def explain(self, depth=16) -> str: + """ + Method to translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + + Example:: + + expr = pp.Word(pp.nums) * 3 + try: + expr.parse_string("123 456 A789") + except pp.ParseException as pe: + print(pe.explain(depth=0)) + + prints:: + + 123 456 A789 + ^ + ParseException: Expected W:(0-9), found 'A' (at char 8), (line:1, col:9) + + Note: the diagnostic output will include string representations of the expressions + that failed to parse. These representations will be more helpful if you use `set_name` to + give identifiable names to your expressions. Otherwise they will use the default string + forms, which may be cryptic to read. + + Note: pyparsing's default truncation of exception tracebacks may also truncate the + stack of expressions that are displayed in the ``explain`` output. To get the full listing + of parser expressions, you may have to set ``ParserElement.verbose_stacktrace = True`` + """ + return self.explain_exception(self, depth) + + # fmt: off + @replaced_by_pep8(mark_input_line) + def markInputline(self): ... + # fmt: on + + +class ParseException(ParseBaseException): + """ + Exception thrown when a parse expression doesn't match the input string + + Example:: + + try: + Word(nums).set_name("integer").parse_string("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.column)) + + prints:: + + Expected integer (at char 0), (line:1, col:1) + column: 1 + + """ + + +class ParseFatalException(ParseBaseException): + """ + User-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately + """ + + +class ParseSyntaxException(ParseFatalException): + """ + Just like :class:`ParseFatalException`, but thrown internally + when an :class:`ErrorStop` ('-' operator) indicates + that parsing is to stop immediately because an unbacktrackable + syntax error has been found. + """ + + +class RecursiveGrammarException(Exception): + """ + Exception thrown by :class:`ParserElement.validate` if the + grammar could be left-recursive; parser may need to enable + left recursion using :class:`ParserElement.enable_left_recursion` + """ + + def __init__(self, parseElementList): + self.parseElementTrace = parseElementList + + def __str__(self) -> str: + return f"RecursiveGrammarException: {self.parseElementTrace}" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py new file mode 100644 index 0000000..018f0d6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py @@ -0,0 +1,1100 @@ +# helpers.py +import html.entities +import re +import sys +import typing + +from . import __diag__ +from .core import * +from .util import ( + _bslash, + _flatten, + _escape_regex_range_chars, + replaced_by_pep8, +) + + +# +# global helpers +# +def counted_array( + expr: ParserElement, + int_expr: typing.Optional[ParserElement] = None, + *, + intExpr: typing.Optional[ParserElement] = None, +) -> ParserElement: + """Helper to define a counted list of expressions. + + This helper defines a pattern of the form:: + + integer expr expr expr... + + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the + leading count token is suppressed. + + If ``int_expr`` is specified, it should be a pyparsing expression + that produces an integer value. + + Example:: + + counted_array(Word(alphas)).parse_string('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binary_constant = Word('01').set_parse_action(lambda t: int(t[0], 2)) + counted_array(Word(alphas), int_expr=binary_constant).parse_string('10 ab cd ef') # -> ['ab', 'cd'] + + # if other fields must be parsed after the count but before the + # list items, give the fields results names and they will + # be preserved in the returned ParseResults: + count_with_metadata = integer + Word(alphas)("type") + typed_array = counted_array(Word(alphanums), int_expr=count_with_metadata)("items") + result = typed_array.parse_string("3 bool True True False") + print(result.dump()) + + # prints + # ['True', 'True', 'False'] + # - items: ['True', 'True', 'False'] + # - type: 'bool' + """ + intExpr = intExpr or int_expr + array_expr = Forward() + + def count_field_parse_action(s, l, t): + nonlocal array_expr + n = t[0] + array_expr <<= (expr * n) if n else Empty() + # clear list contents, but keep any named results + del t[:] + + if intExpr is None: + intExpr = Word(nums).set_parse_action(lambda t: int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.set_name("arrayLen") + intExpr.add_parse_action(count_field_parse_action, call_during_try=True) + return (intExpr + array_expr).set_name("(len) " + str(expr) + "...") + + +def match_previous_literal(expr: ParserElement) -> ParserElement: + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = match_previous_literal(first) + match_expr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches a previous literal, will also match the leading + ``"1:1"`` in ``"1:10"``. If this is not desired, use + :class:`match_previous_expr`. Do *not* use with packrat parsing + enabled. + """ + rep = Forward() + + def copy_token_to_repeater(s, l, t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.as_list()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + + expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) + rep.set_name("(prev) " + str(expr)) + return rep + + +def match_previous_expr(expr: ParserElement) -> ParserElement: + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = match_previous_expr(first) + match_expr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches by expressions, will *not* match the leading ``"1:1"`` + in ``"1:10"``; the expressions are evaluated first, and then + compared, so ``"1"`` is compared with ``"10"``. Do *not* use + with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + + def copy_token_to_repeater(s, l, t): + matchTokens = _flatten(t.as_list()) + + def must_match_these_tokens(s, l, t): + theseTokens = _flatten(t.as_list()) + if theseTokens != matchTokens: + raise ParseException( + s, l, f"Expected {matchTokens}, found{theseTokens}" + ) + + rep.set_parse_action(must_match_these_tokens, callDuringTry=True) + + expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) + rep.set_name("(prev) " + str(expr)) + return rep + + +def one_of( + strs: Union[typing.Iterable[str], str], + caseless: bool = False, + use_regex: bool = True, + as_keyword: bool = False, + *, + useRegex: bool = True, + asKeyword: bool = False, +) -> ParserElement: + """Helper to quickly define a set of alternative :class:`Literal` s, + and makes sure to do longest-first testing when there is a conflict, + regardless of the input order, but returns + a :class:`MatchFirst` for best performance. + + Parameters: + + - ``strs`` - a string of space-delimited literals, or a collection of + string literals + - ``caseless`` - treat all literals as caseless - (default= ``False``) + - ``use_regex`` - as an optimization, will + generate a :class:`Regex` object; otherwise, will generate + a :class:`MatchFirst` object (if ``caseless=True`` or ``as_keyword=True``, or if + creating a :class:`Regex` raises an exception) - (default= ``True``) + - ``as_keyword`` - enforce :class:`Keyword`-style matching on the + generated expressions - (default= ``False``) + - ``asKeyword`` and ``useRegex`` are retained for pre-PEP8 compatibility, + but will be removed in a future release + + Example:: + + comp_oper = one_of("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.search_string("B = 12 AA=23 B<=AA AA>12")) + + prints:: + + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + asKeyword = asKeyword or as_keyword + useRegex = useRegex and use_regex + + if ( + isinstance(caseless, str_type) + and __diag__.warn_on_multiple_string_args_to_oneof + ): + warnings.warn( + "More than one string argument passed to one_of, pass" + " choices as a list or space-delimited string", + stacklevel=2, + ) + + if caseless: + isequal = lambda a, b: a.upper() == b.upper() + masks = lambda a, b: b.upper().startswith(a.upper()) + parseElementClass = CaselessKeyword if asKeyword else CaselessLiteral + else: + isequal = lambda a, b: a == b + masks = lambda a, b: b.startswith(a) + parseElementClass = Keyword if asKeyword else Literal + + symbols: List[str] = [] + if isinstance(strs, str_type): + strs = typing.cast(str, strs) + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + raise TypeError("Invalid argument to one_of, expected string or iterable") + if not symbols: + return NoMatch() + + # reorder given symbols to take care to avoid masking longer choices with shorter ones + # (but only if the given symbols are not just single characters) + if any(len(sym) > 1 for sym in symbols): + i = 0 + while i < len(symbols) - 1: + cur = symbols[i] + for j, other in enumerate(symbols[i + 1 :]): + if isequal(other, cur): + del symbols[i + j + 1] + break + elif masks(cur, other): + del symbols[i + j + 1] + symbols.insert(i, other) + break + else: + i += 1 + + if useRegex: + re_flags: int = re.IGNORECASE if caseless else 0 + + try: + if all(len(sym) == 1 for sym in symbols): + # symbols are just single characters, create range regex pattern + patt = f"[{''.join(_escape_regex_range_chars(sym) for sym in symbols)}]" + else: + patt = "|".join(re.escape(sym) for sym in symbols) + + # wrap with \b word break markers if defining as keywords + if asKeyword: + patt = rf"\b(?:{patt})\b" + + ret = Regex(patt, flags=re_flags).set_name(" | ".join(symbols)) + + if caseless: + # add parse action to return symbols as specified, not in random + # casing as found in input string + symbol_map = {sym.lower(): sym for sym in symbols} + ret.add_parse_action(lambda s, l, t: symbol_map[t[0].lower()]) + + return ret + + except re.error: + warnings.warn( + "Exception creating Regex for one_of, building MatchFirst", stacklevel=2 + ) + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).set_name( + " | ".join(symbols) + ) + + +def dict_of(key: ParserElement, value: ParserElement) -> ParserElement: + """Helper to easily and clearly define a dictionary by specifying + the respective patterns for the key and value. Takes care of + defining the :class:`Dict`, :class:`ZeroOrMore`, and + :class:`Group` tokens in the proper order. The key pattern + can include delimiting markers or punctuation, as long as they are + suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the :class:`Dict` results + can include named token fields. + + Example:: + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) + print(attr_expr[1, ...].parse_string(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join) + + # similar to Dict, but simpler call format + result = dict_of(attr_label, attr_value).parse_string(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.as_dict()) + + prints:: + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: 'light blue' + - posn: 'upper left' + - shape: 'SQUARE' + - texture: 'burlap' + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict(OneOrMore(Group(key + value))) + + +def original_text_for( + expr: ParserElement, as_string: bool = True, *, asString: bool = True +) -> ParserElement: + """Helper to return the original, untokenized text for a given + expression. Useful to restore the parsed fields of an HTML start + tag into the raw tag text itself, or to revert separate tokens with + intervening whitespace back to the original matching input text. By + default, returns a string containing the original parsed text. + + If the optional ``as_string`` argument is passed as + ``False``, then the return value is + a :class:`ParseResults` containing any results names that + were originally matched, and a single token containing the original + matched text from the input string. So if the expression passed to + :class:`original_text_for` contains expressions with defined + results names, you must set ``as_string`` to ``False`` if you + want to preserve those results name values. + + The ``asString`` pre-PEP8 argument is retained for compatibility, + but will be removed in a future release. + + Example:: + + src = "this is test bold text normal text " + for tag in ("b", "i"): + opener, closer = make_html_tags(tag) + patt = original_text_for(opener + ... + closer) + print(patt.search_string(src)[0]) + + prints:: + + [' bold text '] + ['text'] + """ + asString = asString and as_string + + locMarker = Empty().set_parse_action(lambda s, loc, t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s, l, t: s[t._original_start : t._original_end] + else: + + def extractText(s, l, t): + t[:] = [s[t.pop("_original_start") : t.pop("_original_end")]] + + matchExpr.set_parse_action(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + matchExpr.suppress_warning(Diagnostics.warn_ungrouped_named_tokens_in_collection) + return matchExpr + + +def ungroup(expr: ParserElement) -> ParserElement: + """Helper to undo pyparsing's default grouping of And expressions, + even if all but one are non-empty. + """ + return TokenConverter(expr).add_parse_action(lambda t: t[0]) + + +def locatedExpr(expr: ParserElement) -> ParserElement: + """ + (DEPRECATED - future code should use the :class:`Located` class) + Helper to decorate a returned token with its starting and ending + locations in the input string. + + This helper adds the following results names: + + - ``locn_start`` - location where matched expression begins + - ``locn_end`` - location where matched expression ends + - ``value`` - the actual parsed results + + Be careful if the input text contains ```` characters, you + may want to call :class:`ParserElement.parse_with_tabs` + + Example:: + + wd = Word(alphas) + for match in locatedExpr(wd).search_string("ljsdf123lksdjjf123lkkjj1222"): + print(match) + + prints:: + + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().set_parse_action(lambda ss, ll, tt: ll) + return Group( + locator("locn_start") + + expr("value") + + locator.copy().leaveWhitespace()("locn_end") + ) + + +def nested_expr( + opener: Union[str, ParserElement] = "(", + closer: Union[str, ParserElement] = ")", + content: typing.Optional[ParserElement] = None, + ignore_expr: ParserElement = quoted_string(), + *, + ignoreExpr: ParserElement = quoted_string(), +) -> ParserElement: + """Helper method for defining nested lists enclosed in opening and + closing delimiters (``"("`` and ``")"`` are the default). + + Parameters: + + - ``opener`` - opening character for a nested list + (default= ``"("``); can also be a pyparsing expression + - ``closer`` - closing character for a nested list + (default= ``")"``); can also be a pyparsing expression + - ``content`` - expression for items within the nested lists + (default= ``None``) + - ``ignore_expr`` - expression for ignoring opening and closing delimiters + (default= :class:`quoted_string`) + - ``ignoreExpr`` - this pre-PEP8 argument is retained for compatibility + but will be removed in a future release + + If an expression is not provided for the content argument, the + nested expression will capture all whitespace-delimited content + between delimiters as a list of separate values. + + Use the ``ignore_expr`` argument to define expressions that may + contain opening or closing characters that should not be treated as + opening or closing characters for nesting, such as quoted_string or + a comment expression. Specify multiple expressions using an + :class:`Or` or :class:`MatchFirst`. The default is + :class:`quoted_string`, but if no expressions are to be ignored, then + pass ``None`` for this argument. + + Example:: + + data_type = one_of("void int short long char float double") + decl_data_type = Combine(data_type + Opt(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR, RPAR = map(Suppress, "()") + + code_body = nested_expr('{', '}', ignore_expr=(quoted_string | c_style_comment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Opt(DelimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(c_style_comment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.search_string(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + + prints:: + + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if ignoreExpr != ignore_expr: + ignoreExpr = ignore_expr if ignoreExpr == quoted_string() else ignoreExpr + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener, str_type) and isinstance(closer, str_type): + opener = typing.cast(str, opener) + closer = typing.cast(str, closer) + if len(opener) == 1 and len(closer) == 1: + if ignoreExpr is not None: + content = Combine( + OneOrMore( + ~ignoreExpr + + CharsNotIn( + opener + closer + ParserElement.DEFAULT_WHITE_CHARS, + exact=1, + ) + ) + ).set_parse_action(lambda t: t[0].strip()) + else: + content = empty.copy() + CharsNotIn( + opener + closer + ParserElement.DEFAULT_WHITE_CHARS + ).set_parse_action(lambda t: t[0].strip()) + else: + if ignoreExpr is not None: + content = Combine( + OneOrMore( + ~ignoreExpr + + ~Literal(opener) + + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) + ) + ).set_parse_action(lambda t: t[0].strip()) + else: + content = Combine( + OneOrMore( + ~Literal(opener) + + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) + ) + ).set_parse_action(lambda t: t[0].strip()) + else: + raise ValueError( + "opening and closing arguments must be strings if no content expression is given" + ) + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( + Suppress(opener) + ZeroOrMore(ignoreExpr | ret | content) + Suppress(closer) + ) + else: + ret <<= Group(Suppress(opener) + ZeroOrMore(ret | content) + Suppress(closer)) + ret.set_name("nested %s%s expression" % (opener, closer)) + return ret + + +def _makeTags(tagStr, xml, suppress_LT=Suppress("<"), suppress_GT=Suppress(">")): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr, str_type): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas, alphanums + "_-:") + if xml: + tagAttrValue = dbl_quoted_string.copy().set_parse_action(remove_quotes) + openTag = ( + suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue))) + + Opt("/", default=[False])("empty").set_parse_action( + lambda s, l, t: t[0] == "/" + ) + + suppress_GT + ) + else: + tagAttrValue = quoted_string.copy().set_parse_action(remove_quotes) | Word( + printables, exclude_chars=">" + ) + openTag = ( + suppress_LT + + tagStr("tag") + + Dict( + ZeroOrMore( + Group( + tagAttrName.set_parse_action(lambda t: t[0].lower()) + + Opt(Suppress("=") + tagAttrValue) + ) + ) + ) + + Opt("/", default=[False])("empty").set_parse_action( + lambda s, l, t: t[0] == "/" + ) + + suppress_GT + ) + closeTag = Combine(Literal("", adjacent=False) + + openTag.set_name("<%s>" % resname) + # add start results name in parse action now that ungrouped names are not reported at two levels + openTag.add_parse_action( + lambda t: t.__setitem__( + "start" + "".join(resname.replace(":", " ").title().split()), t.copy() + ) + ) + closeTag = closeTag( + "end" + "".join(resname.replace(":", " ").title().split()) + ).set_name("" % resname) + openTag.tag = resname + closeTag.tag = resname + openTag.tag_body = SkipTo(closeTag()) + return openTag, closeTag + + +def make_html_tags( + tag_str: Union[str, ParserElement] +) -> Tuple[ParserElement, ParserElement]: + """Helper to construct opening and closing tag expressions for HTML, + given a tag name. Matches tags in either upper or lower case, + attributes with namespaces and with quoted or unquoted values. + + Example:: + + text = 'More info at the
      pyparsing wiki page' + # make_html_tags returns pyparsing expressions for the opening and + # closing tags as a 2-tuple + a, a_end = make_html_tags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.search_string(text): + # attributes in the tag (like "href" shown here) are + # also accessible as named results + print(link.link_text, '->', link.href) + + prints:: + + pyparsing -> https://github.com/pyparsing/pyparsing/wiki + """ + return _makeTags(tag_str, False) + + +def make_xml_tags( + tag_str: Union[str, ParserElement] +) -> Tuple[ParserElement, ParserElement]: + """Helper to construct opening and closing tag expressions for XML, + given a tag name. Matches tags only in the given upper/lower case. + + Example: similar to :class:`make_html_tags` + """ + return _makeTags(tag_str, True) + + +any_open_tag: ParserElement +any_close_tag: ParserElement +any_open_tag, any_close_tag = make_html_tags( + Word(alphas, alphanums + "_:").set_name("any tag") +) + +_htmlEntityMap = {k.rstrip(";"): v for k, v in html.entities.html5.items()} +common_html_entity = Regex("&(?P" + "|".join(_htmlEntityMap) + ");").set_name( + "common HTML entity" +) + + +def replace_html_entity(s, l, t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + + +class OpAssoc(Enum): + """Enumeration of operator associativity + - used in constructing InfixNotationOperatorSpec for :class:`infix_notation`""" + + LEFT = 1 + RIGHT = 2 + + +InfixNotationOperatorArgType = Union[ + ParserElement, str, Tuple[Union[ParserElement, str], Union[ParserElement, str]] +] +InfixNotationOperatorSpec = Union[ + Tuple[ + InfixNotationOperatorArgType, + int, + OpAssoc, + typing.Optional[ParseAction], + ], + Tuple[ + InfixNotationOperatorArgType, + int, + OpAssoc, + ], +] + + +def infix_notation( + base_expr: ParserElement, + op_list: List[InfixNotationOperatorSpec], + lpar: Union[str, ParserElement] = Suppress("("), + rpar: Union[str, ParserElement] = Suppress(")"), +) -> ParserElement: + """Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary + or binary, left- or right-associative. Parse actions can also be + attached to operator expressions. The generated parser will also + recognize the use of parentheses to override operator precedences + (see example below). + + Note: if you define a deep operator list, you may see performance + issues when using infix_notation. See + :class:`ParserElement.enable_packrat` for a mechanism to potentially + improve your parser performance. + + Parameters: + + - ``base_expr`` - expression representing the most basic operand to + be used in the expression + - ``op_list`` - list of tuples, one for each operator precedence level + in the expression grammar; each tuple is of the form ``(op_expr, + num_operands, right_left_assoc, (optional)parse_action)``, where: + + - ``op_expr`` is the pyparsing expression for the operator; may also + be a string, which will be converted to a Literal; if ``num_operands`` + is 3, ``op_expr`` is a tuple of two expressions, for the two + operators separating the 3 terms + - ``num_operands`` is the number of terms for this operator (must be 1, + 2, or 3) + - ``right_left_assoc`` is the indicator whether the operator is right + or left associative, using the pyparsing-defined constants + ``OpAssoc.RIGHT`` and ``OpAssoc.LEFT``. + - ``parse_action`` is the parse action to be associated with + expressions matching this operator expression (the parse action + tuple member may be omitted); if the parse action is passed + a tuple or list of functions, this is equivalent to calling + ``set_parse_action(*fn)`` + (:class:`ParserElement.set_parse_action`) + - ``lpar`` - expression for matching left-parentheses; if passed as a + str, then will be parsed as ``Suppress(lpar)``. If lpar is passed as + an expression (such as ``Literal('(')``), then it will be kept in + the parsed results, and grouped with them. (default= ``Suppress('(')``) + - ``rpar`` - expression for matching right-parentheses; if passed as a + str, then will be parsed as ``Suppress(rpar)``. If rpar is passed as + an expression (such as ``Literal(')')``), then it will be kept in + the parsed results, and grouped with them. (default= ``Suppress(')')``) + + Example:: + + # simple example of four-function arithmetic with ints and + # variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infix_notation(integer | varname, + [ + ('-', 1, OpAssoc.RIGHT), + (one_of('* /'), 2, OpAssoc.LEFT), + (one_of('+ -'), 2, OpAssoc.LEFT), + ]) + + arith_expr.run_tests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', full_dump=False) + + prints:: + + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + (5+x)*y + [[[5, '+', 'x'], '*', 'y']] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + + # captive version of FollowedBy that does not do parse actions or capture results names + class _FB(FollowedBy): + def parseImpl(self, instring, loc, doActions=True): + self.expr.try_parse(instring, loc) + return loc, [] + + _FB.__name__ = "FollowedBy>" + + ret = Forward() + if isinstance(lpar, str): + lpar = Suppress(lpar) + if isinstance(rpar, str): + rpar = Suppress(rpar) + + # if lpar and rpar are not suppressed, wrap in group + if not (isinstance(rpar, Suppress) and isinstance(rpar, Suppress)): + lastExpr = base_expr | Group(lpar + ret + rpar) + else: + lastExpr = base_expr | (lpar + ret + rpar) + + arity: int + rightLeftAssoc: opAssoc + pa: typing.Optional[ParseAction] + opExpr1: ParserElement + opExpr2: ParserElement + for i, operDef in enumerate(op_list): + opExpr, arity, rightLeftAssoc, pa = (operDef + (None,))[:4] # type: ignore[assignment] + if isinstance(opExpr, str_type): + opExpr = ParserElement._literalStringClass(opExpr) + opExpr = typing.cast(ParserElement, opExpr) + if arity == 3: + if not isinstance(opExpr, (tuple, list)) or len(opExpr) != 2: + raise ValueError( + "if numterms=3, opExpr must be a tuple or list of two expressions" + ) + opExpr1, opExpr2 = opExpr + term_name = f"{opExpr1}{opExpr2} term" + else: + term_name = f"{opExpr} term" + + if not 1 <= arity <= 3: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + + if rightLeftAssoc not in (OpAssoc.LEFT, OpAssoc.RIGHT): + raise ValueError("operator must indicate right or left associativity") + + thisExpr: ParserElement = Forward().set_name(term_name) + thisExpr = typing.cast(Forward, thisExpr) + if rightLeftAssoc is OpAssoc.LEFT: + if arity == 1: + matchExpr = _FB(lastExpr + opExpr) + Group(lastExpr + opExpr[1, ...]) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( + lastExpr + (opExpr + lastExpr)[1, ...] + ) + else: + matchExpr = _FB(lastExpr + lastExpr) + Group(lastExpr[2, ...]) + elif arity == 3: + matchExpr = _FB( + lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr + ) + Group(lastExpr + OneOrMore(opExpr1 + lastExpr + opExpr2 + lastExpr)) + elif rightLeftAssoc is OpAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Opt): + opExpr = Opt(opExpr) + matchExpr = _FB(opExpr.expr + thisExpr) + Group(opExpr + thisExpr) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( + lastExpr + (opExpr + thisExpr)[1, ...] + ) + else: + matchExpr = _FB(lastExpr + thisExpr) + Group( + lastExpr + thisExpr[1, ...] + ) + elif arity == 3: + matchExpr = _FB( + lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr + ) + Group(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.set_parse_action(*pa) + else: + matchExpr.set_parse_action(pa) + thisExpr <<= (matchExpr | lastExpr).setName(term_name) + lastExpr = thisExpr + ret <<= lastExpr + return ret + + +def indentedBlock(blockStatementExpr, indentStack, indent=True, backup_stacks=[]): + """ + (DEPRECATED - use :class:`IndentedBlock` class instead) + Helper method for defining space-delimited indentation blocks, + such as those used to define block statements in Python source code. + + Parameters: + + - ``blockStatementExpr`` - expression defining syntax of statement that + is repeated within the indented block + - ``indentStack`` - list created by caller to manage indentation stack + (multiple ``statementWithIndentedBlock`` expressions within a single + grammar should share a common ``indentStack``) + - ``indent`` - boolean indicating whether block must be indented beyond + the current level; set to ``False`` for block of left-most statements + (default= ``True``) + + A valid block must contain at least one ``blockStatement``. + + (Note that indentedBlock uses internal parse actions which make it + incompatible with packrat parsing.) + + Example:: + + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group("(" + Opt(delimitedList(identifier)) + ")") + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group(funcDecl + func_body) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Opt(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << (funcDef | assignment | identifier) + + module_body = stmt[1, ...] + + parseTree = module_body.parseString(data) + parseTree.pprint() + + prints:: + + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + backup_stacks.append(indentStack[:]) + + def reset_stack(): + indentStack[:] = backup_stacks[-1] + + def checkPeerIndent(s, l, t): + if l >= len(s): + return + curCol = col(l, s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseException(s, l, "illegal nesting") + raise ParseException(s, l, "not a peer entry") + + def checkSubIndent(s, l, t): + curCol = col(l, s) + if curCol > indentStack[-1]: + indentStack.append(curCol) + else: + raise ParseException(s, l, "not a subentry") + + def checkUnindent(s, l, t): + if l >= len(s): + return + curCol = col(l, s) + if not (indentStack and curCol in indentStack): + raise ParseException(s, l, "not an unindent") + if curCol < indentStack[-1]: + indentStack.pop() + + NL = OneOrMore(LineEnd().set_whitespace_chars("\t ").suppress()) + INDENT = (Empty() + Empty().set_parse_action(checkSubIndent)).set_name("INDENT") + PEER = Empty().set_parse_action(checkPeerIndent).set_name("") + UNDENT = Empty().set_parse_action(checkUnindent).set_name("UNINDENT") + if indent: + smExpr = Group( + Opt(NL) + + INDENT + + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) + + UNDENT + ) + else: + smExpr = Group( + Opt(NL) + + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) + + Opt(UNDENT) + ) + + # add a parse action to remove backup_stack from list of backups + smExpr.add_parse_action( + lambda: backup_stacks.pop(-1) and None if backup_stacks else None + ) + smExpr.set_fail_action(lambda a, b, c, d: reset_stack()) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.set_name("indented block") + + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +c_style_comment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/").set_name( + "C style comment" +) +"Comment of the form ``/* ... */``" + +html_comment = Regex(r"").set_name("HTML comment") +"Comment of the form ````" + +rest_of_line = Regex(r".*").leave_whitespace().set_name("rest of line") +dbl_slash_comment = Regex(r"//(?:\\\n|[^\n])*").set_name("// comment") +"Comment of the form ``// ... (to end of line)``" + +cpp_style_comment = Combine( + Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/" | dbl_slash_comment +).set_name("C++ style comment") +"Comment of either form :class:`c_style_comment` or :class:`dbl_slash_comment`" + +java_style_comment = cpp_style_comment +"Same as :class:`cpp_style_comment`" + +python_style_comment = Regex(r"#.*").set_name("Python style comment") +"Comment of the form ``# ... (to end of line)``" + + +# build list of built-in expressions, for future reference if a global default value +# gets updated +_builtin_exprs: List[ParserElement] = [ + v for v in vars().values() if isinstance(v, ParserElement) +] + + +# compatibility function, superseded by DelimitedList class +def delimited_list( + expr: Union[str, ParserElement], + delim: Union[str, ParserElement] = ",", + combine: bool = False, + min: typing.Optional[int] = None, + max: typing.Optional[int] = None, + *, + allow_trailing_delim: bool = False, +) -> ParserElement: + """(DEPRECATED - use :class:`DelimitedList` class)""" + return DelimitedList( + expr, delim, combine, min, max, allow_trailing_delim=allow_trailing_delim + ) + + +# pre-PEP8 compatible names +# fmt: off +opAssoc = OpAssoc +anyOpenTag = any_open_tag +anyCloseTag = any_close_tag +commonHTMLEntity = common_html_entity +cStyleComment = c_style_comment +htmlComment = html_comment +restOfLine = rest_of_line +dblSlashComment = dbl_slash_comment +cppStyleComment = cpp_style_comment +javaStyleComment = java_style_comment +pythonStyleComment = python_style_comment + +@replaced_by_pep8(DelimitedList) +def delimitedList(): ... + +@replaced_by_pep8(DelimitedList) +def delimited_list(): ... + +@replaced_by_pep8(counted_array) +def countedArray(): ... + +@replaced_by_pep8(match_previous_literal) +def matchPreviousLiteral(): ... + +@replaced_by_pep8(match_previous_expr) +def matchPreviousExpr(): ... + +@replaced_by_pep8(one_of) +def oneOf(): ... + +@replaced_by_pep8(dict_of) +def dictOf(): ... + +@replaced_by_pep8(original_text_for) +def originalTextFor(): ... + +@replaced_by_pep8(nested_expr) +def nestedExpr(): ... + +@replaced_by_pep8(make_html_tags) +def makeHTMLTags(): ... + +@replaced_by_pep8(make_xml_tags) +def makeXMLTags(): ... + +@replaced_by_pep8(replace_html_entity) +def replaceHTMLEntity(): ... + +@replaced_by_pep8(infix_notation) +def infixNotation(): ... +# fmt: on diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py new file mode 100644 index 0000000..0313049 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py @@ -0,0 +1,796 @@ +# results.py +from collections.abc import ( + MutableMapping, + Mapping, + MutableSequence, + Iterator, + Sequence, + Container, +) +import pprint +from typing import Tuple, Any, Dict, Set, List + +str_type: Tuple[type, ...] = (str, bytes) +_generator_type = type((_ for _ in ())) + + +class _ParseResultsWithOffset: + tup: Tuple["ParseResults", int] + __slots__ = ["tup"] + + def __init__(self, p1: "ParseResults", p2: int): + self.tup: Tuple[ParseResults, int] = (p1, p2) + + def __getitem__(self, i): + return self.tup[i] + + def __getstate__(self): + return self.tup + + def __setstate__(self, *args): + self.tup = args[0] + + +class ParseResults: + """Structured parse results, to provide multiple means of access to + the parsed data: + + - as a list (``len(results)``) + - by list index (``results[0], results[1]``, etc.) + - by attribute (``results.`` - see :class:`ParserElement.set_results_name`) + + Example:: + + integer = Word(nums) + date_str = (integer.set_results_name("year") + '/' + + integer.set_results_name("month") + '/' + + integer.set_results_name("day")) + # equivalent form: + # date_str = (integer("year") + '/' + # + integer("month") + '/' + # + integer("day")) + + # parse_string returns a ParseResults object + result = date_str.parse_string("1999/12/31") + + def test(s, fn=repr): + print(f"{s} -> {fn(eval(s))}") + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + + prints:: + + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: '31' + - month: '12' + - year: '1999' + """ + + _null_values: Tuple[Any, ...] = (None, [], ()) + + _name: str + _parent: "ParseResults" + _all_names: Set[str] + _modal: bool + _toklist: List[Any] + _tokdict: Dict[str, Any] + + __slots__ = ( + "_name", + "_parent", + "_all_names", + "_modal", + "_toklist", + "_tokdict", + ) + + class List(list): + """ + Simple wrapper class to distinguish parsed list results that should be preserved + as actual Python lists, instead of being converted to :class:`ParseResults`:: + + LBRACK, RBRACK = map(pp.Suppress, "[]") + element = pp.Forward() + item = ppc.integer + element_list = LBRACK + pp.DelimitedList(element) + RBRACK + + # add parse actions to convert from ParseResults to actual Python collection types + def as_python_list(t): + return pp.ParseResults.List(t.as_list()) + element_list.add_parse_action(as_python_list) + + element <<= item | element_list + + element.run_tests(''' + 100 + [2,3,4] + [[2, 1],3,4] + [(2, 1),3,4] + (2,3,4) + ''', post_parse=lambda s, r: (r[0], type(r[0]))) + + prints:: + + 100 + (100, ) + + [2,3,4] + ([2, 3, 4], ) + + [[2, 1],3,4] + ([[2, 1], 3, 4], ) + + (Used internally by :class:`Group` when `aslist=True`.) + """ + + def __new__(cls, contained=None): + if contained is None: + contained = [] + + if not isinstance(contained, list): + raise TypeError( + f"{cls.__name__} may only be constructed with a list, not {type(contained).__name__}" + ) + + return list.__new__(cls) + + def __new__(cls, toklist=None, name=None, **kwargs): + if isinstance(toklist, ParseResults): + return toklist + self = object.__new__(cls) + self._name = None + self._parent = None + self._all_names = set() + + if toklist is None: + self._toklist = [] + elif isinstance(toklist, (list, _generator_type)): + self._toklist = ( + [toklist[:]] + if isinstance(toklist, ParseResults.List) + else list(toklist) + ) + else: + self._toklist = [toklist] + self._tokdict = dict() + return self + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( + self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance + ): + self._tokdict: Dict[str, _ParseResultsWithOffset] + self._modal = modal + if name is not None and name != "": + if isinstance(name, int): + name = str(name) + if not modal: + self._all_names = {name} + self._name = name + if toklist not in self._null_values: + if isinstance(toklist, (str_type, type)): + toklist = [toklist] + if asList: + if isinstance(toklist, ParseResults): + self[name] = _ParseResultsWithOffset( + ParseResults(toklist._toklist), 0 + ) + else: + self[name] = _ParseResultsWithOffset( + ParseResults(toklist[0]), 0 + ) + self[name]._name = name + else: + try: + self[name] = toklist[0] + except (KeyError, TypeError, IndexError): + if toklist is not self: + self[name] = toklist + else: + self._name = name + + def __getitem__(self, i): + if isinstance(i, (int, slice)): + return self._toklist[i] + else: + if i not in self._all_names: + return self._tokdict[i][-1][0] + else: + return ParseResults([v[0] for v in self._tokdict[i]]) + + def __setitem__(self, k, v, isinstance=isinstance): + if isinstance(v, _ParseResultsWithOffset): + self._tokdict[k] = self._tokdict.get(k, list()) + [v] + sub = v[0] + elif isinstance(k, (int, slice)): + self._toklist[k] = v + sub = v + else: + self._tokdict[k] = self._tokdict.get(k, list()) + [ + _ParseResultsWithOffset(v, 0) + ] + sub = v + if isinstance(sub, ParseResults): + sub._parent = self + + def __delitem__(self, i): + if isinstance(i, (int, slice)): + mylen = len(self._toklist) + del self._toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i + 1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name, occurrences in self._tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset( + value, position - (position > j) + ) + else: + del self._tokdict[i] + + def __contains__(self, k) -> bool: + return k in self._tokdict + + def __len__(self) -> int: + return len(self._toklist) + + def __bool__(self) -> bool: + return not not (self._toklist or self._tokdict) + + def __iter__(self) -> Iterator: + return iter(self._toklist) + + def __reversed__(self) -> Iterator: + return iter(self._toklist[::-1]) + + def keys(self): + return iter(self._tokdict) + + def values(self): + return (self[k] for k in self.keys()) + + def items(self): + return ((k, self[k]) for k in self.keys()) + + def haskeys(self) -> bool: + """ + Since ``keys()`` returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return not not self._tokdict + + def pop(self, *args, **kwargs): + """ + Removes and returns item at specified index (default= ``last``). + Supports both ``list`` and ``dict`` semantics for ``pop()``. If + passed no argument or an integer argument, it will use ``list`` + semantics and pop tokens from the list of parsed tokens. If passed + a non-integer argument (most likely a string), it will use ``dict`` + semantics and pop the corresponding value from any defined results + names. A second default return value argument is supported, just as in + ``dict.pop()``. + + Example:: + + numlist = Word(nums)[...] + print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] + + def remove_first(tokens): + tokens.pop(0) + numlist.add_parse_action(remove_first) + print(numlist.parse_string("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + Word(nums)[1, ...] + print(patt.parse_string("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.add_parse_action(remove_LABEL) + print(patt.parse_string("AAB 123 321").dump()) + + prints:: + + ['AAB', '123', '321'] + - LABEL: 'AAB' + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k, v in kwargs.items(): + if k == "default": + args = (args[0], v) + else: + raise TypeError(f"pop() got an unexpected keyword argument {k!r}") + if isinstance(args[0], int) or len(args) == 1 or args[0] in self: + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, default_value=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given ``default_value`` or ``None`` if no + ``default_value`` is specified. + + Similar to ``dict.get()``. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parse_string("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return default_value + + def insert(self, index, ins_string): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to ``list.insert()``. + + Example:: + + numlist = Word(nums)[...] + print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + numlist.add_parse_action(insert_locn) + print(numlist.parse_string("0 123 321")) # -> [0, '0', '123', '321'] + """ + self._toklist.insert(index, ins_string) + # fixup indices in token dictionary + for name, occurrences in self._tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset( + value, position + (position > index) + ) + + def append(self, item): + """ + Add single element to end of ``ParseResults`` list of elements. + + Example:: + + numlist = Word(nums)[...] + print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + numlist.add_parse_action(append_sum) + print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321', 444] + """ + self._toklist.append(item) + + def extend(self, itemseq): + """ + Add sequence of elements to end of ``ParseResults`` list of elements. + + Example:: + + patt = Word(alphas)[1, ...] + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + patt.add_parse_action(make_palindrome) + print(patt.parse_string("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self.__iadd__(itemseq) + else: + self._toklist.extend(itemseq) + + def clear(self): + """ + Clear all elements and results names. + """ + del self._toklist[:] + self._tokdict.clear() + + def __getattr__(self, name): + try: + return self[name] + except KeyError: + if name.startswith("__"): + raise AttributeError(name) + return "" + + def __add__(self, other: "ParseResults") -> "ParseResults": + ret = self.copy() + ret += other + return ret + + def __iadd__(self, other: "ParseResults") -> "ParseResults": + if not other: + return self + + if other._tokdict: + offset = len(self._toklist) + addoffset = lambda a: offset if a < 0 else a + offset + otheritems = other._tokdict.items() + otherdictitems = [ + (k, _ParseResultsWithOffset(v[0], addoffset(v[1]))) + for k, vlist in otheritems + for v in vlist + ] + for k, v in otherdictitems: + self[k] = v + if isinstance(v[0], ParseResults): + v[0]._parent = self + + self._toklist += other._toklist + self._all_names |= other._all_names + return self + + def __radd__(self, other) -> "ParseResults": + if isinstance(other, int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__(self) -> str: + return f"{type(self).__name__}({self._toklist!r}, {self.as_dict()})" + + def __str__(self) -> str: + return ( + "[" + + ", ".join( + [ + str(i) if isinstance(i, ParseResults) else repr(i) + for i in self._toklist + ] + ) + + "]" + ) + + def _asStringList(self, sep=""): + out = [] + for item in self._toklist: + if out and sep: + out.append(sep) + if isinstance(item, ParseResults): + out += item._asStringList() + else: + out.append(str(item)) + return out + + def as_list(self) -> list: + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + + patt = Word(alphas)[1, ...] + result = patt.parse_string("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] + + # Use as_list() to create an actual list + result_list = result.as_list() + print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [ + res.as_list() if isinstance(res, ParseResults) else res + for res in self._toklist + ] + + def as_dict(self) -> dict: + """ + Returns the named parse results as a nested dictionary. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parse_string('12/31/1999') + print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.as_dict() + print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.as_dict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + + def to_item(obj): + if isinstance(obj, ParseResults): + return obj.as_dict() if obj.haskeys() else [to_item(v) for v in obj] + else: + return obj + + return dict((k, to_item(v)) for k, v in self.items()) + + def copy(self) -> "ParseResults": + """ + Returns a new shallow copy of a :class:`ParseResults` object. `ParseResults` + items contained within the source are shared with the copy. Use + :class:`ParseResults.deepcopy()` to create a copy with its own separate + content values. + """ + ret = ParseResults(self._toklist) + ret._tokdict = self._tokdict.copy() + ret._parent = self._parent + ret._all_names |= self._all_names + ret._name = self._name + return ret + + def deepcopy(self) -> "ParseResults": + """ + Returns a new deep copy of a :class:`ParseResults` object. + """ + ret = self.copy() + # replace values with copies if they are of known mutable types + for i, obj in enumerate(self._toklist): + if isinstance(obj, ParseResults): + self._toklist[i] = obj.deepcopy() + elif isinstance(obj, (str, bytes)): + pass + elif isinstance(obj, MutableMapping): + self._toklist[i] = dest = type(obj)() + for k, v in obj.items(): + dest[k] = v.deepcopy() if isinstance(v, ParseResults) else v + elif isinstance(obj, Container): + self._toklist[i] = type(obj)( + v.deepcopy() if isinstance(v, ParseResults) else v for v in obj + ) + return ret + + def get_name(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = user_data[1, ...] + + result = user_info.parse_string("22 111-22-3333 #221B") + for item in result: + print(item.get_name(), ':', item[0]) + + prints:: + + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self._name: + return self._name + elif self._parent: + par: "ParseResults" = self._parent + parent_tokdict_items = par._tokdict.items() + return next( + ( + k + for k, vlist in parent_tokdict_items + for v, loc in vlist + if v is self + ), + None, + ) + elif ( + len(self) == 1 + and len(self._tokdict) == 1 + and next(iter(self._tokdict.values()))[0][1] in (0, -1) + ): + return next(iter(self._tokdict.keys())) + else: + return None + + def dump(self, indent="", full=True, include_list=True, _depth=0) -> str: + """ + Diagnostic method for listing out the contents of + a :class:`ParseResults`. Accepts an optional ``indent`` argument so + that this string can be embedded in a nested display of other data. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parse_string('1999/12/31') + print(result.dump()) + + prints:: + + ['1999', '/', '12', '/', '31'] + - day: '31' + - month: '12' + - year: '1999' + """ + out = [] + NL = "\n" + out.append(indent + str(self.as_list()) if include_list else "") + + if full: + if self.haskeys(): + items = sorted((str(k), v) for k, v in self.items()) + for k, v in items: + if out: + out.append(NL) + out.append(f"{indent}{(' ' * _depth)}- {k}: ") + if isinstance(v, ParseResults): + if v: + out.append( + v.dump( + indent=indent, + full=full, + include_list=include_list, + _depth=_depth + 1, + ) + ) + else: + out.append(str(v)) + else: + out.append(repr(v)) + if any(isinstance(vv, ParseResults) for vv in self): + v = self + for i, vv in enumerate(v): + if isinstance(vv, ParseResults): + out.append( + "\n{}{}[{}]:\n{}{}{}".format( + indent, + (" " * (_depth)), + i, + indent, + (" " * (_depth + 1)), + vv.dump( + indent=indent, + full=full, + include_list=include_list, + _depth=_depth + 1, + ), + ) + ) + else: + out.append( + "\n%s%s[%d]:\n%s%s%s" + % ( + indent, + (" " * (_depth)), + i, + indent, + (" " * (_depth + 1)), + str(vv), + ) + ) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the + `pprint `_ module. + Accepts additional positional or keyword args as defined for + `pprint.pprint `_ . + + Example:: + + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(DelimitedList(term))) + result = func.parse_string("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + + prints:: + + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.as_list(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( + self._toklist, + ( + self._tokdict.copy(), + None, + self._all_names, + self._name, + ), + ) + + def __setstate__(self, state): + self._toklist, (self._tokdict, par, inAccumNames, self._name) = state + self._all_names = set(inAccumNames) + self._parent = None + + def __getnewargs__(self): + return self._toklist, self._name + + def __dir__(self): + return dir(type(self)) + list(self.keys()) + + @classmethod + def from_dict(cls, other, name=None) -> "ParseResults": + """ + Helper classmethod to construct a ``ParseResults`` from a ``dict``, preserving the + name-value relations as results names. If an optional ``name`` argument is + given, a nested ``ParseResults`` will be returned. + """ + + def is_iterable(obj): + try: + iter(obj) + except Exception: + return False + # str's are iterable, but in pyparsing, we don't want to iterate over them + else: + return not isinstance(obj, str_type) + + ret = cls([]) + for k, v in other.items(): + if isinstance(v, Mapping): + ret += cls.from_dict(v, name=k) + else: + ret += cls([v], name=k, asList=is_iterable(v)) + if name is not None: + ret = cls([ret], name=name) + return ret + + asList = as_list + """Deprecated - use :class:`as_list`""" + asDict = as_dict + """Deprecated - use :class:`as_dict`""" + getName = get_name + """Deprecated - use :class:`get_name`""" + + +MutableMapping.register(ParseResults) +MutableSequence.register(ParseResults) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py new file mode 100644 index 0000000..6a254c1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py @@ -0,0 +1,331 @@ +# testing.py + +from contextlib import contextmanager +import typing + +from .core import ( + ParserElement, + ParseException, + Keyword, + __diag__, + __compat__, +) + + +class pyparsing_test: + """ + namespace class for classes useful in writing unit tests + """ + + class reset_pyparsing_context: + """ + Context manager to be used when writing unit tests that modify pyparsing config values: + - packrat parsing + - bounded recursion parsing + - default whitespace characters. + - default keyword characters + - literal string auto-conversion class + - __diag__ settings + + Example:: + + with reset_pyparsing_context(): + # test that literals used to construct a grammar are automatically suppressed + ParserElement.inlineLiteralsUsing(Suppress) + + term = Word(alphas) | Word(nums) + group = Group('(' + term[...] + ')') + + # assert that the '()' characters are not included in the parsed tokens + self.assertParseAndCheckList(group, "(abc 123 def)", ['abc', '123', 'def']) + + # after exiting context manager, literals are converted to Literal expressions again + """ + + def __init__(self): + self._save_context = {} + + def save(self): + self._save_context["default_whitespace"] = ParserElement.DEFAULT_WHITE_CHARS + self._save_context["default_keyword_chars"] = Keyword.DEFAULT_KEYWORD_CHARS + + self._save_context[ + "literal_string_class" + ] = ParserElement._literalStringClass + + self._save_context["verbose_stacktrace"] = ParserElement.verbose_stacktrace + + self._save_context["packrat_enabled"] = ParserElement._packratEnabled + if ParserElement._packratEnabled: + self._save_context[ + "packrat_cache_size" + ] = ParserElement.packrat_cache.size + else: + self._save_context["packrat_cache_size"] = None + self._save_context["packrat_parse"] = ParserElement._parse + self._save_context[ + "recursion_enabled" + ] = ParserElement._left_recursion_enabled + + self._save_context["__diag__"] = { + name: getattr(__diag__, name) for name in __diag__._all_names + } + + self._save_context["__compat__"] = { + "collect_all_And_tokens": __compat__.collect_all_And_tokens + } + + return self + + def restore(self): + # reset pyparsing global state + if ( + ParserElement.DEFAULT_WHITE_CHARS + != self._save_context["default_whitespace"] + ): + ParserElement.set_default_whitespace_chars( + self._save_context["default_whitespace"] + ) + + ParserElement.verbose_stacktrace = self._save_context["verbose_stacktrace"] + + Keyword.DEFAULT_KEYWORD_CHARS = self._save_context["default_keyword_chars"] + ParserElement.inlineLiteralsUsing( + self._save_context["literal_string_class"] + ) + + for name, value in self._save_context["__diag__"].items(): + (__diag__.enable if value else __diag__.disable)(name) + + ParserElement._packratEnabled = False + if self._save_context["packrat_enabled"]: + ParserElement.enable_packrat(self._save_context["packrat_cache_size"]) + else: + ParserElement._parse = self._save_context["packrat_parse"] + ParserElement._left_recursion_enabled = self._save_context[ + "recursion_enabled" + ] + + __compat__.collect_all_And_tokens = self._save_context["__compat__"] + + return self + + def copy(self): + ret = type(self)() + ret._save_context.update(self._save_context) + return ret + + def __enter__(self): + return self.save() + + def __exit__(self, *args): + self.restore() + + class TestParseResultsAsserts: + """ + A mixin class to add parse results assertion methods to normal unittest.TestCase classes. + """ + + def assertParseResultsEquals( + self, result, expected_list=None, expected_dict=None, msg=None + ): + """ + Unit test assertion to compare a :class:`ParseResults` object with an optional ``expected_list``, + and compare any defined results names with an optional ``expected_dict``. + """ + if expected_list is not None: + self.assertEqual(expected_list, result.as_list(), msg=msg) + if expected_dict is not None: + self.assertEqual(expected_dict, result.as_dict(), msg=msg) + + def assertParseAndCheckList( + self, expr, test_string, expected_list, msg=None, verbose=True + ): + """ + Convenience wrapper assert to test a parser element and input string, and assert that + the resulting ``ParseResults.asList()`` is equal to the ``expected_list``. + """ + result = expr.parse_string(test_string, parse_all=True) + if verbose: + print(result.dump()) + else: + print(result.as_list()) + self.assertParseResultsEquals(result, expected_list=expected_list, msg=msg) + + def assertParseAndCheckDict( + self, expr, test_string, expected_dict, msg=None, verbose=True + ): + """ + Convenience wrapper assert to test a parser element and input string, and assert that + the resulting ``ParseResults.asDict()`` is equal to the ``expected_dict``. + """ + result = expr.parse_string(test_string, parseAll=True) + if verbose: + print(result.dump()) + else: + print(result.as_list()) + self.assertParseResultsEquals(result, expected_dict=expected_dict, msg=msg) + + def assertRunTestResults( + self, run_tests_report, expected_parse_results=None, msg=None + ): + """ + Unit test assertion to evaluate output of ``ParserElement.runTests()``. If a list of + list-dict tuples is given as the ``expected_parse_results`` argument, then these are zipped + with the report tuples returned by ``runTests`` and evaluated using ``assertParseResultsEquals``. + Finally, asserts that the overall ``runTests()`` success value is ``True``. + + :param run_tests_report: tuple(bool, [tuple(str, ParseResults or Exception)]) returned from runTests + :param expected_parse_results (optional): [tuple(str, list, dict, Exception)] + """ + run_test_success, run_test_results = run_tests_report + + if expected_parse_results is not None: + merged = [ + (*rpt, expected) + for rpt, expected in zip(run_test_results, expected_parse_results) + ] + for test_string, result, expected in merged: + # expected should be a tuple containing a list and/or a dict or an exception, + # and optional failure message string + # an empty tuple will skip any result validation + fail_msg = next( + (exp for exp in expected if isinstance(exp, str)), None + ) + expected_exception = next( + ( + exp + for exp in expected + if isinstance(exp, type) and issubclass(exp, Exception) + ), + None, + ) + if expected_exception is not None: + with self.assertRaises( + expected_exception=expected_exception, msg=fail_msg or msg + ): + if isinstance(result, Exception): + raise result + else: + expected_list = next( + (exp for exp in expected if isinstance(exp, list)), None + ) + expected_dict = next( + (exp for exp in expected if isinstance(exp, dict)), None + ) + if (expected_list, expected_dict) != (None, None): + self.assertParseResultsEquals( + result, + expected_list=expected_list, + expected_dict=expected_dict, + msg=fail_msg or msg, + ) + else: + # warning here maybe? + print(f"no validation for {test_string!r}") + + # do this last, in case some specific test results can be reported instead + self.assertTrue( + run_test_success, msg=msg if msg is not None else "failed runTests" + ) + + @contextmanager + def assertRaisesParseException(self, exc_type=ParseException, msg=None): + with self.assertRaises(exc_type, msg=msg): + yield + + @staticmethod + def with_line_numbers( + s: str, + start_line: typing.Optional[int] = None, + end_line: typing.Optional[int] = None, + expand_tabs: bool = True, + eol_mark: str = "|", + mark_spaces: typing.Optional[str] = None, + mark_control: typing.Optional[str] = None, + ) -> str: + """ + Helpful method for debugging a parser - prints a string with line and column numbers. + (Line and column numbers are 1-based.) + + :param s: tuple(bool, str - string to be printed with line and column numbers + :param start_line: int - (optional) starting line number in s to print (default=1) + :param end_line: int - (optional) ending line number in s to print (default=len(s)) + :param expand_tabs: bool - (optional) expand tabs to spaces, to match the pyparsing default + :param eol_mark: str - (optional) string to mark the end of lines, helps visualize trailing spaces (default="|") + :param mark_spaces: str - (optional) special character to display in place of spaces + :param mark_control: str - (optional) convert non-printing control characters to a placeholding + character; valid values: + - "unicode" - replaces control chars with Unicode symbols, such as "␍" and "␊" + - any single character string - replace control characters with given string + - None (default) - string is displayed as-is + + :return: str - input string with leading line numbers and column number headers + """ + if expand_tabs: + s = s.expandtabs() + if mark_control is not None: + mark_control = typing.cast(str, mark_control) + if mark_control == "unicode": + transtable_map = { + c: u for c, u in zip(range(0, 33), range(0x2400, 0x2433)) + } + transtable_map[127] = 0x2421 + tbl = str.maketrans(transtable_map) + eol_mark = "" + else: + ord_mark_control = ord(mark_control) + tbl = str.maketrans( + {c: ord_mark_control for c in list(range(0, 32)) + [127]} + ) + s = s.translate(tbl) + if mark_spaces is not None and mark_spaces != " ": + if mark_spaces == "unicode": + tbl = str.maketrans({9: 0x2409, 32: 0x2423}) + s = s.translate(tbl) + else: + s = s.replace(" ", mark_spaces) + if start_line is None: + start_line = 1 + if end_line is None: + end_line = len(s) + end_line = min(end_line, len(s)) + start_line = min(max(1, start_line), end_line) + + if mark_control != "unicode": + s_lines = s.splitlines()[start_line - 1 : end_line] + else: + s_lines = [line + "␊" for line in s.split("␊")[start_line - 1 : end_line]] + if not s_lines: + return "" + + lineno_width = len(str(end_line)) + max_line_len = max(len(line) for line in s_lines) + lead = " " * (lineno_width + 1) + if max_line_len >= 99: + header0 = ( + lead + + "".join( + f"{' ' * 99}{(i + 1) % 100}" + for i in range(max(max_line_len // 100, 1)) + ) + + "\n" + ) + else: + header0 = "" + header1 = ( + header0 + + lead + + "".join(f" {(i + 1) % 10}" for i in range(-(-max_line_len // 10))) + + "\n" + ) + header2 = lead + "1234567890" * (-(-max_line_len // 10)) + "\n" + return ( + header1 + + header2 + + "\n".join( + f"{i:{lineno_width}d}:{line}{eol_mark}" + for i, line in enumerate(s_lines, start=start_line) + ) + + "\n" + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py new file mode 100644 index 0000000..ec0b3a4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py @@ -0,0 +1,361 @@ +# unicode.py + +import sys +from itertools import filterfalse +from typing import List, Tuple, Union + + +class _lazyclassproperty: + def __init__(self, fn): + self.fn = fn + self.__doc__ = fn.__doc__ + self.__name__ = fn.__name__ + + def __get__(self, obj, cls): + if cls is None: + cls = type(obj) + if not hasattr(cls, "_intern") or any( + cls._intern is getattr(superclass, "_intern", []) + for superclass in cls.__mro__[1:] + ): + cls._intern = {} + attrname = self.fn.__name__ + if attrname not in cls._intern: + cls._intern[attrname] = self.fn(cls) + return cls._intern[attrname] + + +UnicodeRangeList = List[Union[Tuple[int, int], Tuple[int]]] + + +class unicode_set: + """ + A set of Unicode characters, for language-specific strings for + ``alphas``, ``nums``, ``alphanums``, and ``printables``. + A unicode_set is defined by a list of ranges in the Unicode character + set, in a class attribute ``_ranges``. Ranges can be specified using + 2-tuples or a 1-tuple, such as:: + + _ranges = [ + (0x0020, 0x007e), + (0x00a0, 0x00ff), + (0x0100,), + ] + + Ranges are left- and right-inclusive. A 1-tuple of (x,) is treated as (x, x). + + A unicode set can also be defined using multiple inheritance of other unicode sets:: + + class CJK(Chinese, Japanese, Korean): + pass + """ + + _ranges: UnicodeRangeList = [] + + @_lazyclassproperty + def _chars_for_ranges(cls): + ret = [] + for cc in cls.__mro__: + if cc is unicode_set: + break + for rr in getattr(cc, "_ranges", ()): + ret.extend(range(rr[0], rr[-1] + 1)) + return [chr(c) for c in sorted(set(ret))] + + @_lazyclassproperty + def printables(cls): + """all non-whitespace characters in this range""" + return "".join(filterfalse(str.isspace, cls._chars_for_ranges)) + + @_lazyclassproperty + def alphas(cls): + """all alphabetic characters in this range""" + return "".join(filter(str.isalpha, cls._chars_for_ranges)) + + @_lazyclassproperty + def nums(cls): + """all numeric digit characters in this range""" + return "".join(filter(str.isdigit, cls._chars_for_ranges)) + + @_lazyclassproperty + def alphanums(cls): + """all alphanumeric characters in this range""" + return cls.alphas + cls.nums + + @_lazyclassproperty + def identchars(cls): + """all characters in this range that are valid identifier characters, plus underscore '_'""" + return "".join( + sorted( + set( + "".join(filter(str.isidentifier, cls._chars_for_ranges)) + + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµº" + + "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" + + "_" + ) + ) + ) + + @_lazyclassproperty + def identbodychars(cls): + """ + all characters in this range that are valid identifier body characters, + plus the digits 0-9, and · (Unicode MIDDLE DOT) + """ + return "".join( + sorted( + set( + cls.identchars + + "0123456789·" + + "".join( + [c for c in cls._chars_for_ranges if ("_" + c).isidentifier()] + ) + ) + ) + ) + + @_lazyclassproperty + def identifier(cls): + """ + a pyparsing Word expression for an identifier using this range's definitions for + identchars and identbodychars + """ + from pip._vendor.pyparsing import Word + + return Word(cls.identchars, cls.identbodychars) + + +class pyparsing_unicode(unicode_set): + """ + A namespace class for defining common language unicode_sets. + """ + + # fmt: off + + # define ranges in language character sets + _ranges: UnicodeRangeList = [ + (0x0020, sys.maxunicode), + ] + + class BasicMultilingualPlane(unicode_set): + """Unicode set for the Basic Multilingual Plane""" + _ranges: UnicodeRangeList = [ + (0x0020, 0xFFFF), + ] + + class Latin1(unicode_set): + """Unicode set for Latin-1 Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0020, 0x007E), + (0x00A0, 0x00FF), + ] + + class LatinA(unicode_set): + """Unicode set for Latin-A Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0100, 0x017F), + ] + + class LatinB(unicode_set): + """Unicode set for Latin-B Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0180, 0x024F), + ] + + class Greek(unicode_set): + """Unicode set for Greek Unicode Character Ranges""" + _ranges: UnicodeRangeList = [ + (0x0342, 0x0345), + (0x0370, 0x0377), + (0x037A, 0x037F), + (0x0384, 0x038A), + (0x038C,), + (0x038E, 0x03A1), + (0x03A3, 0x03E1), + (0x03F0, 0x03FF), + (0x1D26, 0x1D2A), + (0x1D5E,), + (0x1D60,), + (0x1D66, 0x1D6A), + (0x1F00, 0x1F15), + (0x1F18, 0x1F1D), + (0x1F20, 0x1F45), + (0x1F48, 0x1F4D), + (0x1F50, 0x1F57), + (0x1F59,), + (0x1F5B,), + (0x1F5D,), + (0x1F5F, 0x1F7D), + (0x1F80, 0x1FB4), + (0x1FB6, 0x1FC4), + (0x1FC6, 0x1FD3), + (0x1FD6, 0x1FDB), + (0x1FDD, 0x1FEF), + (0x1FF2, 0x1FF4), + (0x1FF6, 0x1FFE), + (0x2129,), + (0x2719, 0x271A), + (0xAB65,), + (0x10140, 0x1018D), + (0x101A0,), + (0x1D200, 0x1D245), + (0x1F7A1, 0x1F7A7), + ] + + class Cyrillic(unicode_set): + """Unicode set for Cyrillic Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0400, 0x052F), + (0x1C80, 0x1C88), + (0x1D2B,), + (0x1D78,), + (0x2DE0, 0x2DFF), + (0xA640, 0xA672), + (0xA674, 0xA69F), + (0xFE2E, 0xFE2F), + ] + + class Chinese(unicode_set): + """Unicode set for Chinese Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x2E80, 0x2E99), + (0x2E9B, 0x2EF3), + (0x31C0, 0x31E3), + (0x3400, 0x4DB5), + (0x4E00, 0x9FEF), + (0xA700, 0xA707), + (0xF900, 0xFA6D), + (0xFA70, 0xFAD9), + (0x16FE2, 0x16FE3), + (0x1F210, 0x1F212), + (0x1F214, 0x1F23B), + (0x1F240, 0x1F248), + (0x20000, 0x2A6D6), + (0x2A700, 0x2B734), + (0x2B740, 0x2B81D), + (0x2B820, 0x2CEA1), + (0x2CEB0, 0x2EBE0), + (0x2F800, 0x2FA1D), + ] + + class Japanese(unicode_set): + """Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges""" + + class Kanji(unicode_set): + "Unicode set for Kanji Unicode Character Range" + _ranges: UnicodeRangeList = [ + (0x4E00, 0x9FBF), + (0x3000, 0x303F), + ] + + class Hiragana(unicode_set): + """Unicode set for Hiragana Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x3041, 0x3096), + (0x3099, 0x30A0), + (0x30FC,), + (0xFF70,), + (0x1B001,), + (0x1B150, 0x1B152), + (0x1F200,), + ] + + class Katakana(unicode_set): + """Unicode set for Katakana Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x3099, 0x309C), + (0x30A0, 0x30FF), + (0x31F0, 0x31FF), + (0x32D0, 0x32FE), + (0xFF65, 0xFF9F), + (0x1B000,), + (0x1B164, 0x1B167), + (0x1F201, 0x1F202), + (0x1F213,), + ] + + 漢字 = Kanji + カタカナ = Katakana + ひらがな = Hiragana + + _ranges = ( + Kanji._ranges + + Hiragana._ranges + + Katakana._ranges + ) + + class Hangul(unicode_set): + """Unicode set for Hangul (Korean) Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x1100, 0x11FF), + (0x302E, 0x302F), + (0x3131, 0x318E), + (0x3200, 0x321C), + (0x3260, 0x327B), + (0x327E,), + (0xA960, 0xA97C), + (0xAC00, 0xD7A3), + (0xD7B0, 0xD7C6), + (0xD7CB, 0xD7FB), + (0xFFA0, 0xFFBE), + (0xFFC2, 0xFFC7), + (0xFFCA, 0xFFCF), + (0xFFD2, 0xFFD7), + (0xFFDA, 0xFFDC), + ] + + Korean = Hangul + + class CJK(Chinese, Japanese, Hangul): + """Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range""" + + class Thai(unicode_set): + """Unicode set for Thai Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0E01, 0x0E3A), + (0x0E3F, 0x0E5B) + ] + + class Arabic(unicode_set): + """Unicode set for Arabic Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0600, 0x061B), + (0x061E, 0x06FF), + (0x0700, 0x077F), + ] + + class Hebrew(unicode_set): + """Unicode set for Hebrew Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0591, 0x05C7), + (0x05D0, 0x05EA), + (0x05EF, 0x05F4), + (0xFB1D, 0xFB36), + (0xFB38, 0xFB3C), + (0xFB3E,), + (0xFB40, 0xFB41), + (0xFB43, 0xFB44), + (0xFB46, 0xFB4F), + ] + + class Devanagari(unicode_set): + """Unicode set for Devanagari Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0900, 0x097F), + (0xA8E0, 0xA8FF) + ] + + BMP = BasicMultilingualPlane + + # add language identifiers using language Unicode + العربية = Arabic + 中文 = Chinese + кириллица = Cyrillic + Ελληνικά = Greek + עִברִית = Hebrew + 日本語 = Japanese + 한국어 = Korean + ไทย = Thai + देवनागरी = Devanagari + + # fmt: on diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py new file mode 100644 index 0000000..d8d3f41 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py @@ -0,0 +1,284 @@ +# util.py +import inspect +import warnings +import types +import collections +import itertools +from functools import lru_cache, wraps +from typing import Callable, List, Union, Iterable, TypeVar, cast + +_bslash = chr(92) +C = TypeVar("C", bound=Callable) + + +class __config_flags: + """Internal class for defining compatibility and debugging flags""" + + _all_names: List[str] = [] + _fixed_names: List[str] = [] + _type_desc = "configuration" + + @classmethod + def _set(cls, dname, value): + if dname in cls._fixed_names: + warnings.warn( + f"{cls.__name__}.{dname} {cls._type_desc} is {str(getattr(cls, dname)).upper()}" + f" and cannot be overridden", + stacklevel=3, + ) + return + if dname in cls._all_names: + setattr(cls, dname, value) + else: + raise ValueError(f"no such {cls._type_desc} {dname!r}") + + enable = classmethod(lambda cls, name: cls._set(name, True)) + disable = classmethod(lambda cls, name: cls._set(name, False)) + + +@lru_cache(maxsize=128) +def col(loc: int, strg: str) -> int: + """ + Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See + :class:`ParserElement.parse_string` for more + information on parsing strings containing ```` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + """ + s = strg + return 1 if 0 < loc < len(s) and s[loc - 1] == "\n" else loc - s.rfind("\n", 0, loc) + + +@lru_cache(maxsize=128) +def lineno(loc: int, strg: str) -> int: + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note - the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`ParserElement.parse_string` + for more information on parsing strings containing ```` s, and + suggested methods to maintain a consistent view of the parsed string, the + parse location, and line and column positions within the parsed string. + """ + return strg.count("\n", 0, loc) + 1 + + +@lru_cache(maxsize=128) +def line(loc: int, strg: str) -> str: + """ + Returns the line of text containing loc within a string, counting newlines as line separators. + """ + last_cr = strg.rfind("\n", 0, loc) + next_cr = strg.find("\n", loc) + return strg[last_cr + 1 : next_cr] if next_cr >= 0 else strg[last_cr + 1 :] + + +class _UnboundedCache: + def __init__(self): + cache = {} + cache_get = cache.get + self.not_in_cache = not_in_cache = object() + + def get(_, key): + return cache_get(key, not_in_cache) + + def set_(_, key, value): + cache[key] = value + + def clear(_): + cache.clear() + + self.size = None + self.get = types.MethodType(get, self) + self.set = types.MethodType(set_, self) + self.clear = types.MethodType(clear, self) + + +class _FifoCache: + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + cache = {} + keyring = [object()] * size + cache_get = cache.get + cache_pop = cache.pop + keyiter = itertools.cycle(range(size)) + + def get(_, key): + return cache_get(key, not_in_cache) + + def set_(_, key, value): + cache[key] = value + i = next(keyiter) + cache_pop(keyring[i], None) + keyring[i] = key + + def clear(_): + cache.clear() + keyring[:] = [object()] * size + + self.size = size + self.get = types.MethodType(get, self) + self.set = types.MethodType(set_, self) + self.clear = types.MethodType(clear, self) + + +class LRUMemo: + """ + A memoizing mapping that retains `capacity` deleted items + + The memo tracks retained items by their access order; once `capacity` items + are retained, the least recently used item is discarded. + """ + + def __init__(self, capacity): + self._capacity = capacity + self._active = {} + self._memory = collections.OrderedDict() + + def __getitem__(self, key): + try: + return self._active[key] + except KeyError: + self._memory.move_to_end(key) + return self._memory[key] + + def __setitem__(self, key, value): + self._memory.pop(key, None) + self._active[key] = value + + def __delitem__(self, key): + try: + value = self._active.pop(key) + except KeyError: + pass + else: + while len(self._memory) >= self._capacity: + self._memory.popitem(last=False) + self._memory[key] = value + + def clear(self): + self._active.clear() + self._memory.clear() + + +class UnboundedMemo(dict): + """ + A memoizing mapping that retains all deleted items + """ + + def __delitem__(self, key): + pass + + +def _escape_regex_range_chars(s: str) -> str: + # escape these chars: ^-[] + for c in r"\^-[]": + s = s.replace(c, _bslash + c) + s = s.replace("\n", r"\n") + s = s.replace("\t", r"\t") + return str(s) + + +def _collapse_string_to_ranges( + s: Union[str, Iterable[str]], re_escape: bool = True +) -> str: + def is_consecutive(c): + c_int = ord(c) + is_consecutive.prev, prev = c_int, is_consecutive.prev + if c_int - prev > 1: + is_consecutive.value = next(is_consecutive.counter) + return is_consecutive.value + + is_consecutive.prev = 0 # type: ignore [attr-defined] + is_consecutive.counter = itertools.count() # type: ignore [attr-defined] + is_consecutive.value = -1 # type: ignore [attr-defined] + + def escape_re_range_char(c): + return "\\" + c if c in r"\^-][" else c + + def no_escape_re_range_char(c): + return c + + if not re_escape: + escape_re_range_char = no_escape_re_range_char + + ret = [] + s = "".join(sorted(set(s))) + if len(s) > 3: + for _, chars in itertools.groupby(s, key=is_consecutive): + first = last = next(chars) + last = collections.deque( + itertools.chain(iter([last]), chars), maxlen=1 + ).pop() + if first == last: + ret.append(escape_re_range_char(first)) + else: + sep = "" if ord(last) == ord(first) + 1 else "-" + ret.append( + f"{escape_re_range_char(first)}{sep}{escape_re_range_char(last)}" + ) + else: + ret = [escape_re_range_char(c) for c in s] + + return "".join(ret) + + +def _flatten(ll: list) -> list: + ret = [] + for i in ll: + if isinstance(i, list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + + +def _make_synonym_function(compat_name: str, fn: C) -> C: + # In a future version, uncomment the code in the internal _inner() functions + # to begin emitting DeprecationWarnings. + + # Unwrap staticmethod/classmethod + fn = getattr(fn, "__func__", fn) + + # (Presence of 'self' arg in signature is used by explain_exception() methods, so we take + # some extra steps to add it if present in decorated function.) + if "self" == list(inspect.signature(fn).parameters)[0]: + + @wraps(fn) + def _inner(self, *args, **kwargs): + # warnings.warn( + # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 + # ) + return fn(self, *args, **kwargs) + + else: + + @wraps(fn) + def _inner(*args, **kwargs): + # warnings.warn( + # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 + # ) + return fn(*args, **kwargs) + + _inner.__doc__ = f"""Deprecated - use :class:`{fn.__name__}`""" + _inner.__name__ = compat_name + _inner.__annotations__ = fn.__annotations__ + if isinstance(fn, types.FunctionType): + _inner.__kwdefaults__ = fn.__kwdefaults__ + elif isinstance(fn, type) and hasattr(fn, "__init__"): + _inner.__kwdefaults__ = fn.__init__.__kwdefaults__ + else: + _inner.__kwdefaults__ = None + _inner.__qualname__ = fn.__qualname__ + return cast(C, _inner) + + +def replaced_by_pep8(fn: C) -> Callable[[Callable], C]: + """ + Decorator for pre-PEP8 compatibility synonyms, to link them to the new function. + """ + return lambda other: _make_synonym_function(other.__name__, fn) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py new file mode 100644 index 0000000..ddfcf7f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py @@ -0,0 +1,23 @@ +"""Wrappers to call pyproject.toml-based build backend hooks. +""" + +from ._impl import ( + BackendInvalid, + BackendUnavailable, + BuildBackendHookCaller, + HookMissing, + UnsupportedOperation, + default_subprocess_runner, + quiet_subprocess_runner, +) + +__version__ = '1.0.0' +__all__ = [ + 'BackendUnavailable', + 'BackendInvalid', + 'HookMissing', + 'UnsupportedOperation', + 'default_subprocess_runner', + 'quiet_subprocess_runner', + 'BuildBackendHookCaller', +] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e77da308e12ec16145e2c7f475c0cb9689c36578 GIT binary patch literal 633 zcmZvZKX2497{=|~<&xg1RG_MeEgQO_aSIDl5fY_BFaXnml*P)$=4#IWu$`0A2|fio z8=r-5kd+Csv~;M{iPzU-tB0Rn$IoLwdEcMg+hYXlX!(Be2P5<=ZvL-iQ(QiQ;u~V9 zLJYG+VwF^h8dL){tcEJBQZ=eZDyuS;S2;#(P;D&`8-B;txJ##_v!f5Lww60z1XDD% zl!fiAGoN@9%3ze-pVywVV%`b~teYj*tT;7h>C5qN2!*Cuf9Lq-`)j?brC|NN&3>lq zRV`#am%QIQjyG%$UV;Awyv1EViS--dz0iw(ccy)7t#N^~cMz%$!sz}1;~(o*2I|{6 zL~FSB)U{fJ`~K%v@LLYf(!=tgJeX!~2oc>NVib`@ppMeZ;REordaTO(8|FP2o=}1!l;FgZIKmu{ z{gv#W6OvvbWP+uNM5ORw@}-{z5y7bN!XU(D-RVq9(Vtbm^U#|S;8_y@mO-@?VXdq) z7E8%kNo--u)`S}?v|>VCYg6Sao4LrlY{FHdjj6%UGnxaU#U0I*qXT+j!9&lu<7&HS zL?UR9+tlft=0=aXJ5^TnC8t@z)r3MInip=Q)nRx4fLh`BULFt9c*reHbzYg(ZC1=k;IfdBvi literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b73419497cbf1002e26fd05779742f60cc270739 GIT binary patch literal 14745 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 n6bbp2RObM%vlQ}+o0l5>;=a3$^= (3, 11): + import tomllib +else: + from pip._vendor import tomli as tomllib diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py new file mode 100644 index 0000000..37b0e65 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py @@ -0,0 +1,330 @@ +import json +import os +import sys +import tempfile +from contextlib import contextmanager +from os.path import abspath +from os.path import join as pjoin +from subprocess import STDOUT, check_call, check_output + +from ._in_process import _in_proc_script_path + + +def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + +def read_json(path): + with open(path, encoding='utf-8') as f: + return json.load(f) + + +class BackendUnavailable(Exception): + """Will be raised if the backend cannot be imported in the hook process.""" + def __init__(self, traceback): + self.traceback = traceback + + +class BackendInvalid(Exception): + """Will be raised if the backend is invalid.""" + def __init__(self, backend_name, backend_path, message): + super().__init__(message) + self.backend_name = backend_name + self.backend_path = backend_path + + +class HookMissing(Exception): + """Will be raised on missing hooks (if a fallback can't be used).""" + def __init__(self, hook_name): + super().__init__(hook_name) + self.hook_name = hook_name + + +class UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + def __init__(self, traceback): + self.traceback = traceback + + +def default_subprocess_runner(cmd, cwd=None, extra_environ=None): + """The default method of calling the wrapper subprocess. + + This uses :func:`subprocess.check_call` under the hood. + """ + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_call(cmd, cwd=cwd, env=env) + + +def quiet_subprocess_runner(cmd, cwd=None, extra_environ=None): + """Call the subprocess while suppressing output. + + This uses :func:`subprocess.check_output` under the hood. + """ + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_output(cmd, cwd=cwd, env=env, stderr=STDOUT) + + +def norm_and_check(source_tree, requested): + """Normalise and check a backend path. + + Ensure that the requested backend path is specified as a relative path, + and resolves to a location under the given source tree. + + Return an absolute version of the requested path. + """ + if os.path.isabs(requested): + raise ValueError("paths must be relative") + + abs_source = os.path.abspath(source_tree) + abs_requested = os.path.normpath(os.path.join(abs_source, requested)) + # We have to use commonprefix for Python 2.7 compatibility. So we + # normalise case to avoid problems because commonprefix is a character + # based comparison :-( + norm_source = os.path.normcase(abs_source) + norm_requested = os.path.normcase(abs_requested) + if os.path.commonprefix([norm_source, norm_requested]) != norm_source: + raise ValueError("paths must be inside source tree") + + return abs_requested + + +class BuildBackendHookCaller: + """A wrapper to call the build backend hooks for a source directory. + """ + + def __init__( + self, + source_dir, + build_backend, + backend_path=None, + runner=None, + python_executable=None, + ): + """ + :param source_dir: The source directory to invoke the build backend for + :param build_backend: The build backend spec + :param backend_path: Additional path entries for the build backend spec + :param runner: The :ref:`subprocess runner ` to use + :param python_executable: + The Python executable used to invoke the build backend + """ + if runner is None: + runner = default_subprocess_runner + + self.source_dir = abspath(source_dir) + self.build_backend = build_backend + if backend_path: + backend_path = [ + norm_and_check(self.source_dir, p) for p in backend_path + ] + self.backend_path = backend_path + self._subprocess_runner = runner + if not python_executable: + python_executable = sys.executable + self.python_executable = python_executable + + @contextmanager + def subprocess_runner(self, runner): + """A context manager for temporarily overriding the default + :ref:`subprocess runner `. + + .. code-block:: python + + hook_caller = BuildBackendHookCaller(...) + with hook_caller.subprocess_runner(quiet_subprocess_runner): + ... + """ + prev = self._subprocess_runner + self._subprocess_runner = runner + try: + yield + finally: + self._subprocess_runner = prev + + def _supported_features(self): + """Return the list of optional features supported by the backend.""" + return self._call_hook('_supported_features', {}) + + def get_requires_for_build_wheel(self, config_settings=None): + """Get additional dependencies required for building a wheel. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + + .. admonition:: Fallback + + If the build backend does not defined a hook with this name, an + empty list will be returned. + """ + return self._call_hook('get_requires_for_build_wheel', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_wheel( + self, metadata_directory, config_settings=None, + _allow_fallback=True): + """Prepare a ``*.dist-info`` folder with metadata for this project. + + :returns: Name of the newly created subfolder within + ``metadata_directory``, containing the metadata. + :rtype: str + + .. admonition:: Fallback + + If the build backend does not define a hook with this name and + ``_allow_fallback`` is truthy, the backend will be asked to build a + wheel via the ``build_wheel`` hook and the dist-info extracted from + that will be returned. + """ + return self._call_hook('prepare_metadata_for_build_wheel', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + '_allow_fallback': _allow_fallback, + }) + + def build_wheel( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build a wheel from this project. + + :returns: + The name of the newly created wheel within ``wheel_directory``. + + .. admonition:: Interaction with fallback + + If the ``build_wheel`` hook was called in the fallback for + :meth:`prepare_metadata_for_build_wheel`, the build backend would + not be invoked. Instead, the previously built wheel will be copied + to ``wheel_directory`` and the name of that file will be returned. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_wheel', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_editable(self, config_settings=None): + """Get additional dependencies required for building an editable wheel. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + + .. admonition:: Fallback + + If the build backend does not defined a hook with this name, an + empty list will be returned. + """ + return self._call_hook('get_requires_for_build_editable', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_editable( + self, metadata_directory, config_settings=None, + _allow_fallback=True): + """Prepare a ``*.dist-info`` folder with metadata for this project. + + :returns: Name of the newly created subfolder within + ``metadata_directory``, containing the metadata. + :rtype: str + + .. admonition:: Fallback + + If the build backend does not define a hook with this name and + ``_allow_fallback`` is truthy, the backend will be asked to build a + wheel via the ``build_editable`` hook and the dist-info + extracted from that will be returned. + """ + return self._call_hook('prepare_metadata_for_build_editable', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + '_allow_fallback': _allow_fallback, + }) + + def build_editable( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build an editable wheel from this project. + + :returns: + The name of the newly created wheel within ``wheel_directory``. + + .. admonition:: Interaction with fallback + + If the ``build_editable`` hook was called in the fallback for + :meth:`prepare_metadata_for_build_editable`, the build backend + would not be invoked. Instead, the previously built wheel will be + copied to ``wheel_directory`` and the name of that file will be + returned. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_editable', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_sdist(self, config_settings=None): + """Get additional dependencies required for building an sdist. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + """ + return self._call_hook('get_requires_for_build_sdist', { + 'config_settings': config_settings + }) + + def build_sdist(self, sdist_directory, config_settings=None): + """Build an sdist from this project. + + :returns: + The name of the newly created sdist within ``wheel_directory``. + """ + return self._call_hook('build_sdist', { + 'sdist_directory': abspath(sdist_directory), + 'config_settings': config_settings, + }) + + def _call_hook(self, hook_name, kwargs): + extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend} + + if self.backend_path: + backend_path = os.pathsep.join(self.backend_path) + extra_environ['PEP517_BACKEND_PATH'] = backend_path + + with tempfile.TemporaryDirectory() as td: + hook_input = {'kwargs': kwargs} + write_json(hook_input, pjoin(td, 'input.json'), indent=2) + + # Run the hook in a subprocess + with _in_proc_script_path() as script: + python = self.python_executable + self._subprocess_runner( + [python, abspath(str(script)), hook_name, td], + cwd=self.source_dir, + extra_environ=extra_environ + ) + + data = read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation(data.get('traceback', '')) + if data.get('no_backend'): + raise BackendUnavailable(data.get('traceback', '')) + if data.get('backend_invalid'): + raise BackendInvalid( + backend_name=self.build_backend, + backend_path=self.backend_path, + message=data.get('backend_error', '') + ) + if data.get('hook_missing'): + raise HookMissing(data.get('missing_hook_name') or hook_name) + return data['return_val'] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py new file mode 100644 index 0000000..917fa06 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py @@ -0,0 +1,18 @@ +"""This is a subpackage because the directory is on sys.path for _in_process.py + +The subpackage should stay as empty as possible to avoid shadowing modules that +the backend might import. +""" + +import importlib.resources as resources + +try: + resources.files +except AttributeError: + # Python 3.8 compatibility + def _in_proc_script_path(): + return resources.path(__package__, '_in_process.py') +else: + def _in_proc_script_path(): + return resources.as_file( + resources.files(__package__).joinpath('_in_process.py')) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbe2e54229d00e41f443d6bb4df21c1d0d78a529 GIT binary patch literal 1100 zcmah|&rj4q6rO3ju)7qO1T@CeL?wY3X~4vo046Bw#RN=16Sy?pcA&FAI?c>1upEdn z8iN;(B!;6G;y>X3;03|~({S_TZFMyXH%_QW7vheZ@sXNAZZrh8&AM z6_OP$h|3~37Tl*27908eA|!O}BST)V21F{aK|D!lEmkRrxs4|1@M&gdeU8CRhne9 zl}VrLwrO|WBwOYz((LY|mM(Jo&Z$Mp@tv2F3h6wfibiBsuz)$UR8|y^9iYEV)l8HU z>eL!ET63zbwqW9ZHq!Y8)ao2!RE+8mP_mvxRUXe~$_~=6n(YiBQQ-9WBk*wu=U4Ac%*6Na1npA`rpsLnQz%f mrilMG`%w1AFJ$8B-xkhHH#2}vr9RFF`xg3`9X3DVVe=o$oC;$A literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a53bae338da1c51ed137a74fa50601ca119a24a GIT binary patch literal 14417 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py new file mode 100644 index 0000000..ee511ff --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py @@ -0,0 +1,353 @@ +"""This is invoked in a subprocess to call the build backend hooks. + +It expects: +- Command line args: hook_name, control_dir +- Environment variables: + PEP517_BUILD_BACKEND=entry.point:spec + PEP517_BACKEND_PATH=paths (separated with os.pathsep) +- control_dir/input.json: + - {"kwargs": {...}} + +Results: +- control_dir/output.json + - {"return_val": ...} +""" +import json +import os +import os.path +import re +import shutil +import sys +import traceback +from glob import glob +from importlib import import_module +from os.path import join as pjoin + +# This file is run as a script, and `import wrappers` is not zip-safe, so we +# include write_json() and read_json() from wrappers.py. + + +def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + +def read_json(path): + with open(path, encoding='utf-8') as f: + return json.load(f) + + +class BackendUnavailable(Exception): + """Raised if we cannot import the backend""" + def __init__(self, traceback): + self.traceback = traceback + + +class BackendInvalid(Exception): + """Raised if the backend is invalid""" + def __init__(self, message): + self.message = message + + +class HookMissing(Exception): + """Raised if a hook is missing and we are not executing the fallback""" + def __init__(self, hook_name=None): + super().__init__(hook_name) + self.hook_name = hook_name + + +def contained_in(filename, directory): + """Test if a file is located within the given directory.""" + filename = os.path.normcase(os.path.abspath(filename)) + directory = os.path.normcase(os.path.abspath(directory)) + return os.path.commonprefix([filename, directory]) == directory + + +def _build_backend(): + """Find and load the build backend""" + # Add in-tree backend directories to the front of sys.path. + backend_path = os.environ.get('PEP517_BACKEND_PATH') + if backend_path: + extra_pathitems = backend_path.split(os.pathsep) + sys.path[:0] = extra_pathitems + + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + try: + obj = import_module(mod_path) + except ImportError: + raise BackendUnavailable(traceback.format_exc()) + + if backend_path: + if not any( + contained_in(obj.__file__, path) + for path in extra_pathitems + ): + raise BackendInvalid("Backend was not loaded from backend-path") + + if obj_path: + for path_part in obj_path.split('.'): + obj = getattr(obj, path_part) + return obj + + +def _supported_features(): + """Return the list of options features supported by the backend. + + Returns a list of strings. + The only possible value is 'build_editable'. + """ + backend = _build_backend() + features = [] + if hasattr(backend, "build_editable"): + features.append("build_editable") + return features + + +def get_requires_for_build_wheel(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_wheel + except AttributeError: + return [] + else: + return hook(config_settings) + + +def get_requires_for_build_editable(config_settings): + """Invoke the optional get_requires_for_build_editable hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_editable + except AttributeError: + return [] + else: + return hook(config_settings) + + +def prepare_metadata_for_build_wheel( + metadata_directory, config_settings, _allow_fallback): + """Invoke optional prepare_metadata_for_build_wheel + + Implements a fallback by building a wheel if the hook isn't defined, + unless _allow_fallback is False in which case HookMissing is raised. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_wheel + except AttributeError: + if not _allow_fallback: + raise HookMissing() + else: + return hook(metadata_directory, config_settings) + # fallback to build_wheel outside the try block to avoid exception chaining + # which can be confusing to users and is not relevant + whl_basename = backend.build_wheel(metadata_directory, config_settings) + return _get_wheel_metadata_from_wheel(whl_basename, metadata_directory, + config_settings) + + +def prepare_metadata_for_build_editable( + metadata_directory, config_settings, _allow_fallback): + """Invoke optional prepare_metadata_for_build_editable + + Implements a fallback by building an editable wheel if the hook isn't + defined, unless _allow_fallback is False in which case HookMissing is + raised. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_editable + except AttributeError: + if not _allow_fallback: + raise HookMissing() + try: + build_hook = backend.build_editable + except AttributeError: + raise HookMissing(hook_name='build_editable') + else: + whl_basename = build_hook(metadata_directory, config_settings) + return _get_wheel_metadata_from_wheel(whl_basename, + metadata_directory, + config_settings) + else: + return hook(metadata_directory, config_settings) + + +WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + + +def _dist_info_files(whl_zip): + """Identify the .dist-info folder inside a wheel ZipFile.""" + res = [] + for path in whl_zip.namelist(): + m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) + if m: + res.append(path) + if res: + return res + raise Exception("No .dist-info folder found in wheel") + + +def _get_wheel_metadata_from_wheel( + whl_basename, metadata_directory, config_settings): + """Extract the metadata from a wheel. + + Fallback for when the build backend does not + define the 'get_wheel_metadata' hook. + """ + from zipfile import ZipFile + with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): + pass # Touch marker file + + whl_file = os.path.join(metadata_directory, whl_basename) + with ZipFile(whl_file) as zipf: + dist_info = _dist_info_files(zipf) + zipf.extractall(path=metadata_directory, members=dist_info) + return dist_info[0].split('/')[0] + + +def _find_already_built_wheel(metadata_directory): + """Check for a wheel already built during the get_wheel_metadata hook. + """ + if not metadata_directory: + return None + metadata_parent = os.path.dirname(metadata_directory) + if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): + return None + + whl_files = glob(os.path.join(metadata_parent, '*.whl')) + if not whl_files: + print('Found wheel built marker, but no .whl files') + return None + if len(whl_files) > 1: + print('Found multiple .whl files; unspecified behaviour. ' + 'Will call build_wheel.') + return None + + # Exactly one .whl file + return whl_files[0] + + +def build_wheel(wheel_directory, config_settings, metadata_directory=None): + """Invoke the mandatory build_wheel hook. + + If a wheel was already built in the + prepare_metadata_for_build_wheel fallback, this + will copy it rather than rebuilding the wheel. + """ + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return _build_backend().build_wheel(wheel_directory, config_settings, + metadata_directory) + + +def build_editable(wheel_directory, config_settings, metadata_directory=None): + """Invoke the optional build_editable hook. + + If a wheel was already built in the + prepare_metadata_for_build_editable fallback, this + will copy it rather than rebuilding the wheel. + """ + backend = _build_backend() + try: + hook = backend.build_editable + except AttributeError: + raise HookMissing() + else: + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return hook(wheel_directory, config_settings, metadata_directory) + + +def get_requires_for_build_sdist(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_sdist + except AttributeError: + return [] + else: + return hook(config_settings) + + +class _DummyException(Exception): + """Nothing should ever raise this exception""" + + +class GotUnsupportedOperation(Exception): + """For internal use when backend raises UnsupportedOperation""" + def __init__(self, traceback): + self.traceback = traceback + + +def build_sdist(sdist_directory, config_settings): + """Invoke the mandatory build_sdist hook.""" + backend = _build_backend() + try: + return backend.build_sdist(sdist_directory, config_settings) + except getattr(backend, 'UnsupportedOperation', _DummyException): + raise GotUnsupportedOperation(traceback.format_exc()) + + +HOOK_NAMES = { + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'get_requires_for_build_editable', + 'prepare_metadata_for_build_editable', + 'build_editable', + 'get_requires_for_build_sdist', + 'build_sdist', + '_supported_features', +} + + +def main(): + if len(sys.argv) < 3: + sys.exit("Needs args: hook_name, control_dir") + hook_name = sys.argv[1] + control_dir = sys.argv[2] + if hook_name not in HOOK_NAMES: + sys.exit("Unknown hook: %s" % hook_name) + hook = globals()[hook_name] + + hook_input = read_json(pjoin(control_dir, 'input.json')) + + json_out = {'unsupported': False, 'return_val': None} + try: + json_out['return_val'] = hook(**hook_input['kwargs']) + except BackendUnavailable as e: + json_out['no_backend'] = True + json_out['traceback'] = e.traceback + except BackendInvalid as e: + json_out['backend_invalid'] = True + json_out['backend_error'] = e.message + except GotUnsupportedOperation as e: + json_out['unsupported'] = True + json_out['traceback'] = e.traceback + except HookMissing as e: + json_out['hook_missing'] = True + json_out['missing_hook_name'] = e.hook_name or hook_name + + write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000..10ff67f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py @@ -0,0 +1,182 @@ +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. +Basic GET usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> b'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key1": "value1", + "key2": "value2" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import warnings + +from pip._vendor import urllib3 + +from .exceptions import RequestsDependencyWarning + +charset_normalizer_version = None + +try: + from pip._vendor.chardet import __version__ as chardet_version +except ImportError: + chardet_version = None + + +def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version): + urllib3_version = urllib3_version.split(".") + assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append("0") + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1 + assert major >= 1 + if major == 1: + assert minor >= 21 + + # Check charset_normalizer for compatibility. + if chardet_version: + major, minor, patch = chardet_version.split(".")[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet_version >= 3.0.2, < 6.0.0 + assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0) + elif charset_normalizer_version: + major, minor, patch = charset_normalizer_version.split(".")[:3] + major, minor, patch = int(major), int(minor), int(patch) + # charset_normalizer >= 2.0.0 < 4.0.0 + assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) + else: + raise Exception("You need either charset_normalizer or chardet installed") + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split("."))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = "Old version of cryptography ({}) may cause slowdown.".format( + cryptography_version + ) + warnings.warn(warning, RequestsDependencyWarning) + + +# Check imported dependencies for compatibility. +try: + check_compatibility( + urllib3.__version__, chardet_version, charset_normalizer_version + ) +except (AssertionError, ValueError): + warnings.warn( + "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported " + "version!".format( + urllib3.__version__, chardet_version, charset_normalizer_version + ), + RequestsDependencyWarning, + ) + +# Attempt to enable urllib3's fallback for SNI support +# if the standard library doesn't support SNI or the +# 'ssl' library isn't available. +try: + # Note: This logic prevents upgrading cryptography on Windows, if imported + # as part of pip. + from pip._internal.utils.compat import WINDOWS + if not WINDOWS: + raise ImportError("pip internals: don't import cryptography on Windows") + try: + import ssl + except ImportError: + ssl = None + + if not getattr(ssl, "HAS_SNI", False): + from pip._vendor.urllib3.contrib import pyopenssl + + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + + _check_cryptography(cryptography_version) +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from pip._vendor.urllib3.exceptions import DependencyWarning + +warnings.simplefilter("ignore", DependencyWarning) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +from . import packages, utils +from .__version__ import ( + __author__, + __author_email__, + __build__, + __cake__, + __copyright__, + __description__, + __license__, + __title__, + __url__, + __version__, +) +from .api import delete, get, head, options, patch, post, put, request +from .exceptions import ( + ConnectionError, + ConnectTimeout, + FileModeWarning, + HTTPError, + JSONDecodeError, + ReadTimeout, + RequestException, + Timeout, + TooManyRedirects, + URLRequired, +) +from .models import PreparedRequest, Request, Response +from .sessions import Session, session +from .status_codes import codes + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter("default", FileModeWarning, append=True) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f76b792a5b0d78303b25990e19c80588e7a206fb GIT binary patch literal 5473 zcmcH-TTC3+_0G;dW_N)FmWK^y8Ne78!!8fw2QfI9ryUy{Lt=RpX*1rrhFNBIws&TY zv7w@FrP8!&sVX(7`Ei?kxUxSYB_IBbrPiv{pT)QZPaVZo8&&=zcA`YiPtTp*Syr}{ zezYCLnS0MU_ndRjz2`Ce=i*`?g6EaFH)pyk5c&t5*bkQ*JRM~bdKXDZKoTQ46h>g+ z%_RhQs`u|sfsDVJOEsGQ&hjORy4@Jk%PA}?|v?8j`P)K;JP+=&|@J;Vcda2h?7n zS3M{kR1XP<)WgDI^@wmp?GyUcSAtytQ$H%K0SSgKP6uvB3bZ#|7DMFhgsHn zF_~SWWS6w_^F%fboaE&se`dj$)spS}MUC*YX%$#6U^zLXM|{UcU5@i(Bh!3Z7iVyv z&&Tupz`y`6t0|2bJjt13qY2-i$3s_Op)E4oi^=4OV%=;+RvwmHbX>J1Py8zPp(>{o*chMqBjwInZqsthvb-H<_;mGJ5Hi&jFFeNh-@y2 zoohvilz}uV|G7tU+I$R1dkfYtu}jV+m*KG)7g?L50GD4?fOFY=OD>SWF0ztq?k(Fg zYewzxEIK830iGcf4z$Q5Y;^_iot;Whcx(Qr)=AtVyXahWU1Z~q%Z|Aku*@xa=fLl} zi+Ykl6fU4e2RXgy`0jJ~KUn8`iFN)Ltuwr~yQCu9``4Io@x(JGVzLsx^qAIhlj$T* zct5VBfL@U>ON!w|D3#EbDa<~0=MfYO92B4B$RZw789Rt8ht6whK8Yb{A%JLD$7e;N zV zl3v9RLk-uP-%H$Tx`A)DeH_2t{83^RucTL8j{>{a-nc$;qc^js>wcjB!xQ%c{TZ%* z-G&dmO>c^*~la33^|idv>yt-AdV!NAvLvWaQs5G*U^s#3uaDEr#h% zW?o_p8im%AD6vO7??uMQe_GhOpnZhDCS=&3GYA?*_-r{3*nC^&oFJ48F>Hmb73u*% zTsbhQNPMpL@Y+Q_P8L!IZD3Nf3w-Orj&wZC=vmlaa93bSknA;i`%$ z5(GJfnq~Ulq+QAgArM|}+AWBN$<1f0oNhYlh|r1?c9<1~it-Wav6*Rp;dxR^r3PcU z7%4D~v;gHz_}4W6%V^ulx&jaDn?4x2#b!FjG981P9b@YqV}D{dI!U1i zbBNpX8~L86WvhIAvwU*Bd~&OZf66+7z7-Edk+_S>rBp7ng)rfN#M#V6)doP#Cr49I)TcKOebx1 zO*WM_OiwQHg2jO$4LZCyttQ!9T9QLd%PQ7@H!vzI_%yWmx!%n5(hry{Z{XzA3@N7`I!QeS9WQvSiMqoN z_a>4nM1-b1(}(T4s#`Hhswp;Dz!%BYR?Fw4$`W(J`ku13Z&fKP4$YE59ZF{2tE2&V z$zBQ?>8ct_sC{cA*7bpJAzJYWG=Rut;X0ZgI7-nlh*?``LoTMQPbUK3gl&{RC?^x( zM<}C)M(+jfv(2Ky>ra{~U+86$3iiF9G8O3%J_^1lD-cztN6}_xpeZLEl!gfXU4=v` z=%k>Ff^G_WC^$etF9ioFpf#J&-%m^yzEa2$I_;z26$*}0Krbihr(l4BV-&nf!5{_4 zDHx()n1T@sMkyGhV4Q*z08F^C|pn z!jyiF>OV(akLnsSs0NZTQ~Rm&_!HkAW{P<-;Ai@_Lw?5nz*)V;1va@_sOxL7Ol15^ z*5Pt*hbkHGS8n9$dEhU9P_jEyGr3W6Cc~ZCcCfDC-?;KGI8+o|?OF3)@4fF2f65(s z#5J#YH@W6@uK7OK0!zIk%-^}%%%0BsT-R4V#PmNxmCM{Fs$55vtFsxt>ptp!>PAf9 zQ&j&iRQI*R&p5tDd9VvHW6UNR-9V!+Ast#r2R}pmVCf@Nw(QwNW$UPHwRHp4ZlZnb zXy0$IzQ1%I^+KP;ROOY**XwUr{1pv+vpwcSToCF9Q@d4F^TSE%x7u&F75E9Tdd-*d zG(ABc#=Ye%TOR-M=^vclb}-)HXTjaSJh)X9+$^eJFRH&@pXojYHLAh~D!h$f``zF( z78ZTG-HM8;X=w^>m6ZRKrNt@u?e?ymKB&c>dIsRX E0m;dqy8r+H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bd1bb1feee45a2003273bf5b9155946022b4617 GIT binary patch literal 604 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 b=>FF-Es5{!DjD{0-}QKg1CH-j+mQZm%zTX{ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98841898a029a43150ba32f5ad4f355016ac8788 GIT binary patch literal 7224 zcmeHM&u<&Y72YMOU!)zkPVB@@>P~AQ6m5!YOLm+Rj%-DeYo~@RL~@Y0DYUEIp*YfV zm)%*4p{q1Gq(FOVa%f>4ib97TY~|P_CwY-gR4u#ANApZ_&MsY?oSvDRW+gws zasg)!4=v%!Li#fuTh8gNLCK{Qz9;RrGDs%__+{|hdLPAgEu_KfTJ9bdw|yMnPigNa z6WUsGITbf_-JIl_wx&D!Zxd^Y-|N59?S!NLK91+pwK?sGc0!YS9g2TT)A83xypw!O ztLwRx_3t4~n}m>IP_v;Y%X6?j&q0k9ZP${rXvTVDXX47Z3GFdl#i|up6;^?^e5V-S zl}1S29WO4zCzH1f<9GGu;< zg*8A*k^qa15S7qZ>QW+*7{XIf13ZHUgHnaJ)DdNeK6?dstk8PM)$`HXN)099@)1|8 z@QwtLhTDR*1zPl-hLRtKd7vE2()W7gm|(BXU7o=%17W%1nzabWnr*=1UTn-qUaHJ3 zhX?;n=Opcg`T1FPAsW_MrY_)|1h5D0!}k3Z!FNwirkhlKuUWy)9X#CBr1RYq6KG&_ zNNt)~&#Lfjk#(#y5?Mu>CICj@{b|n-g{pT=GZ%%Eni~q>F=X7ceTN_f)cKYZ0hVB9 znrdqG9_F+yk1cYz?C6MULjQ1701uxU=T@lk-%z-B>FKHW`CbFV=Eyod&$Fo?-&f0Kp^mhE06xtIrtXf#^^%XQk zA%f5f?US>-YDr-mQ(_4j%a~N^h=4tT(LM8pqQd+x zkV=0@6h@pQ3`z0*73Krqm1stu#o#(;(M%olP(+|5BPe7go4+*2Y#xN7By20>v8khU zbe|O zDgul#L2VC<2-6j5E%9P8dSGmPe4IF{k4WEsAyz*1pozWG=_te_hO_VolC>O$RarC) zx-SZ^;0H^_5)ZSv-YMdzj=bzgqsNc`cw9B-60QD-ytR@bPBS;PTrx<4Teb$~BJSE6 zh?mW!fe!kFT6CG@KX z++vxB6P^@^jYg%xy;Z{%i$+yZim}3pQA3K5kAQ2hKv~kLimI`I5byYb(bkdy-d_ND z2Y1y}@f0d@3dQ@{Ki|}~^#0pJhc<@}{b}g=JDT1%p|96J-FNsG^$*|s<$KM2=Qc{W zj%@Bb_sKyNpC_sRb2aL&D(}fbO!S)rCzF5Zdu3pzhrN>y6nkf=bhCFyU(-t9-D|qg zBOX2nWm*pC{aj3^VYjw5d-?PKEN6ZD=-WplC=}V{m^L#Yqt-riSs`3LHX0IfXsvJ@ zkO(PAJCDn=Xu4Js&~NoeB>twZFaazRT7!L5&`DJiv@tl?LoEauRg6>D^C*CwgW8^_ zKRUI3WHWPmqtwitzSWOfGj)0k-J0DwtKp%8gctCz8wmnuGCGX`1&M2)#SrjVoW~wB z4xS)83`ERD2H${MZYClNDCN^}w5|K6Q4gq~uLJTR3g~`6>Hhoc_GTu(@dk=!Dj$3k zUH4b}IrLnIl9#)Uf;PJ7OT+f@Hzc#Gi;l{rM3-q&)=HOy#xz1j?#JYzk7gOF=N_iY0q~Nc>_|AS)uDhpe4AB?pD`S)69suq8Va`PHf~xzlDU;MK&CSdkJyvE!u3 zzGZ7w_(ATg@zZ@fwsXFfBG!#el!olFP*Gfe1~!x3sCgC*0TpjjPZq`d+MR=1U*>k| zz-H<|^I-PIfj_5=zh?G-^wRp+W+u1sB8p}z7s03l1H4FqLB;X!p|ab1*AT;<1iq*w zV;@dhpLPL-SmWn7@_U%$)rMspM=kbv6QH{BaJ0yHW|m!)`F{ zA{Dp0p?KwMB!1}+QBM#Olhs-nD7dKv8dDh6u$#gh23`UxR`F|77==7VVa7J5nwha1 z=QlHB&D7YJ$K7ALaYyIxuVY~QdlGUkeKr5WUt6Cb6CS_2CUj&Cn4v@~^`kNA{2@F?c3 zh?GiODuO7ps+H)UQ)()8M7lS4Ci+L(c<>@R;Qg8`qPUaPb^RZSK|S@aXEgoUyZs~j nguZ3!8U5wEFAV7;cc0s%AKf~;mAq*Yrkh1%BtYG-IA2XsVB4Y}6-~8drtYqaWD;g7|h zbB9BU6qTgyVu9|JdFIZ!?{n@w=ghgsKeyS;45ULBU%2q|PKNm%zNkrG$gHnHW|85U zafWAkO_UvH=~FYVp-=6&mOgdkI{MU)>*>=lZh)sYYMeBUn^=a|@%m`Zqluq5fTM0qdn$CtzKIw}@?^*jm84H`HyM(fB-xm(4`DG%bjd*cY6ZCd{vF zOlI@gL|Eh|y~sUQ&r zXizU)l}Ioo1w!%o#jqd-po2(|K#7Z13GiVkoDhP%KoYINsi|mTa{jBmSFT*?g_%wE zLVwCM_=J0MIx2;sspO|cd{7F83go5atO1CGU2g{LA|v6%X-YCuv7X8halfQ)9VTK> zYnGlo8^Qi6Qj&SM(5pnZBo@D?QTt>W$)+|a)tucp6Sm4s4u8%}wAE%JIf^5(>YUW) z=gzIzVwNqVl2z?fT@i65nTSipmY%#$9jjt>)p}q*rw5kTOK!DqsZP!DhKN_qm!3%` z$)4A!qpQzIW2uIkd$*8L>m=ZPR+H46W_-p(^C>}^CU7=_+*3g@9O8!Id~nKE?n}Hs z8jtlVFWj^!kXUe15V|1K=@^ z2|>c0pN6>$wEE?EnCGTQ{9II+6#L+8nc#p67vf~5Y!Nurl{n%58WtfNq9A5s{RxA@ znRPsI2Yoi#92P;ENx@i1Ab4VB)0H5Jf$R}w9p+>M%7vgL*NzBNL{KE%SClHmhz)eo z%#@lVbOvCIBw_?&-gMw*Dn_V)D;_{Fd! z^iBms7lRiB(LWWQ@&_&pF+NWGs+9NRxP4PIvLgV(HXI7zJ4#^E3=_d^FWv)ijd|!{ zto8E~Z<|*wyYHEtH*9mZ`x>pS;SUC;amP)=($#E3*S)&V-&+hd=7)C1$D(h+w{$jrb)|VvwzfZO8pxRrWK0LLri1HRO_SkMM&mGCJ9gj1Sl!n~*I|83 z2!WbZ$-Z6>m_=t0SAKmqG!v_73|!ZQtfNJ#8M$c3VC3g8q4B`ydj841aS zC#T@#fMTR-QRF}ufrjJGllWwrZb7c&Z@qzzSdyB2QI>v_^=U>E%{VAG0V)sl@U$qQ zm4Z9{z#kAdAmLJ%(x;-1 zLj}t-$v?0I_Bagm89h9%JJ6Cn8zzd<^0uwFn=qADr+34f%ZIpgxyQ^rqB%yk_KiRC3_)>MlPcoju(OQps%Y~ zGi5C_Blu|<7oUewwuh-h_>sr0je4o+Rm^Tx! z$Y(qez-Qnz62r=zW{4k9WH*Ax0F)gtm~0G=$mYo+_N!2P9jz?jpWC~%e_?3F!L69M z&7?|Kgojeq8XKKcv9jdoS;(cmX7Lz660i} zVpWTz4H|7+F+J&@IM{uV2D008dn+;@BI{g;36@`ocodG<%oW_O-Su{UbwYUceJ zQ(NBQOqnPZMtvp%A7l){BTsw?x)JmvcpL%FnhvUP0Hu>6VR|u#;2HRdxT#RWoOqzq z=vyC{40`heC#!E=H)!-OIuxxNf@;O2p4`t?0#v#@PvTc+sB{@BmoBt`+J5EICAfub z*?1WLueqLZ)7kcx@t!;h^!O|`7nfet9Ot2hh!P*zy!+steLo!fVCbhEzv%s0Z+7=t zh0QCqof%Wt20oKrI1D{RB^Dk*90FvEh~GoV!ei^e!UE6KLMT#Fk!MfB`xny@ya6kN!eBf}l)X=uvsWpp!rwnpdz_-P{VeTK60p@yulgwh z`UZCmO*4vQ^6596+Zt(t!1pkIPV1v_IF+(3pr8WumF$70Won2XwS>2v3`G?b!|JH0 z%T>^8wvStOy&1R}$hP#QbiXt;DI!f}4o|bO zyG0Ex4vmS|ZBe60zA$RKVvkBIgaNebY2vr4QPhuH*1(Sinr6T(@aaco9jf#(nISl$ z&jbQCC{k^B65a`lFxd>&r4)$8;p;@U&<8j^rel(<3rzqcwNr6Xw#B9=1N-*$Q?pL= zu~dtSNcV!pS4T~UDS@bLhtC~JNOV;2w`wg3x)Cn|xW;_!sGpZ|USG!RTOM3>4CHrp zr$%zt?HTL#Rcm{`r?2$p%lB@0>(1}$DwVb8clt_iZF&D*_3f9|p8Gb&xmVdZMYh4< z7Wm=&`cpvWZ*42!i)vsNH%Dc4c(2+*LtEfx`GPGX#qCjQz-v_(!L0r- z?5X4yG5m!+>5FqR@`mf%l7?$q-Z*QDIg^G+aeJ25ph}ooQxaq)+CHKlawg0X14_)< znq?Pz?uPTr&vAj0IW4>y}m8A?L5mnUp39z z=C)m9XAHby)-DxYWyzv3IqOI|BIeQz)!bE9)PTR#HS2`(qPs{fh1u37oqTQevNxFT zY7*dLgSJcrO}&cr26#-9S_+v6n%)%&+UsXsNtV`d!kc!sR>RC~OS+2GcGLIT;=3og z)$XdT=p0@tt+?u(zsg2Dn_KW6Tu(?7C{ils;yu-SDAlQ6UbX+aH*~XgQqht2#apTr zsODPZ>($cP`ec1l_t|wQ$Dp2sAGI_^n$=wCsqWw}*cWOwnj%~wv*E#e)%hu7OYLf5 zq(jY>p2^~BB52H3Bz0cAfp2JHX1&Ez<)k~sP4|+HLND$wb>vxhQZG6*OwyKgCzWy! z?l@IZ&NjsMB=vkF?ita|HzxHFG@vUI-=y|;nIYanKXvM8{I(?aX`F2=jMKQGcQ~6{ z?cG4}yz;k58vvH@W0cP+C`Nh7IAHt}sqBgJSbotu&difvCC z%CL5d?MT|ouzF&J9(E>iHM^2PJLp-j^uu>1n_yk&s_ja&n8Dpf(?Np%yMyQ=E#hQ7 zSWMALS+8hb?WOpXToa6f2Q(~AOv;A%R1mI9MrG}@Bl{C30KKP=o<1F_v~|$`ynY=( zxvjI=TTeaW)s#rl4+I|ZqJWN=D)Wpk;z-QZhXGx|tBEuHT@;4={X4y8U! zg8p%8e@uWcQPxiK`{kMm;VMs!;9IQBUfpO=n4mlWog7H)tFR%?O^2gA+`*vjT)2hl zJ4CHa@o=BoY5@il@oNsg72GXL!MEM3?w$FD#y3qjO=)ko!8bpA&%1r`>kD5`_rLy1 z&g;*3{aJ7SinE_u2D0|_@!`J)T9cPyjho0!&{qVmxrtyu2||{f15id?DEc#~tG2p{ z-F-fFlMBi8@ax~mdG}qd z3#d$@2+&hd=H^7PNd@h8$owO_$bbfgk42FDEZStC8w+BYdbu942dT#aE@W6yW_b{E zL2-gkuJ8$bjk=N^nGQvRljr#0;Xh5rsjY6qWJJ73_~SL^rZ0Ud9a?rR_b<1nPiC9^ z*OX;EV*QWUC&(qJMRWjU?VbZy2|CO^K?(l}+M2R12wu5IY)`^)5OW6;X7wIvs4Zb` z>*1)TD&(oUg1iav(S9ig+5}TAuJB5BNz)_5MLcR3DYEB#<^<2oh$3%`cfbSS0L-Ag3^Sn2VF^KN*)P< zPHgf#0@P`W^3h4*NkP_!=tBdawZ>@z;RNwXDlf?etccybZ1;JSaFCrKR0JjyzWfC5-69_IMh-10tZ$|I}PlDCM?OcFH67b|2EgJ5Z zHNyk4_Bdn!49Lb<=yEU$OCnfqP)H&hi6BnV_LM~D!tjj_cWZD-3$;WvO$+u$wa1f+ z_upMbeJ0vIUpl>lLtKLoWY}!?&5Wxq=WNS3+j7p%jI(pum~rk&>A?kF4QsE>*}06J z%h`8k>^pOIU&iiR-kG)UNon(*hMZ?t#tM>p7IF$-@|~_Kd4N z=jzJ1x^k|bjH_q)Y}PfHGC;dj&6>rtVrkAdZl623*4Xyuj+;BOjoqn}YnHmDy1SO` z>F(R+yKM&_=(M&0m~mt4+=;vm+~Id^9OCwFz&(D~)`7VFi0e@5mE%$;erNNiG=(AE z-uniowmxOJ=iat-1aBkP9NrtVbF+6H?P+aFm$$fY9KL=yZ*|TGmrQTkZ`xP9ohzQM zj1`;|h1-MFHbn*O{s7%+>A9 z)a|`}WW{qJWxQu~%pOC;?u@HD z3v4{Sd~U_n4~zt6HQlwee^k3|Nn8@r{pmC5V<5y{SU$eeygyqzm^$)XN9{-T4NLBH zUD}wwwCrBiuWawj*8As<pk-MHMk z{PgmH+kpSO;0Si41YhAr5UCz`5GhH?9gnL^@YDK5bfN zS3KPrEBLKGvUm_XnLd&J(sFRcvnONSgIHJ9x^}>>)WcCq&%mY9;GM1yTUR_I8S4n_ z7*_+`4~`uxrX8EL6T0@$AYXqH0Nxcw;8~eSE$FJMzNnIWb4CM^TH1u~lpqQcSLX7A zXb^A-LhuNLU=e{2LzDspa#58s3VO~G76U4pP+^TXX1>BjWC!GB!$k;nxFD7}fn|ph z&Q)xi*j^!tD$4&0dZL2v8nb4x-Wa+*l=lNomA#L?JuPEx+)N=<0hB^f(18$Z2U@!t zjY68Mnu|>!u=Tv=B2ZPVi?QJG*~;mQbf*b#x2n^&nos@j9*5DZd|p-aIYq$7QklN^ zNUBxB;-0ATtz134iPsmu#kIU4sg0oJQ<2^+ykBPKS(4adMrdzTB=GP7)u7GSs<#1O zQ?*v~D;<1IMT(b#ts-auRV3ad6+KoFyalgF@6{Ans4Mw)z#D{yUq#~eNiDB^&#Ycm zt2C`X{{VjO(gYOe3fT=0%88;+r&OTQla^Q88#_yN)tuU9Rxfp`IPk@Esrk~g`hEj! zcd3q=Q`ZSI(MRx_vm#X=L8S_`Vj}*ECh!Wa_Eg2`^#>{;G&2h&4 zXb7*7!Ogg&{yYnpE}FO5e_&?~;DtW0xlZIun{mmaV+3iDG?Z?@l7`b?P%8MWiMUy{ z#>RpdAvmOTgNN1}+RPl-pd3VSL7`$A_o6}E!-da7)SSQze4n}4hw4dEqpbQsR?|+3 zHNx}oEfRhRfJ*0t6GKw5!@@pqa(ubmPQGi>h_|yzRzaNAK6(VwF zEeT$c9S|!AX0)JU$v@$k-$IbW>SpLE26_s@hH+9c9=uOsQGyUd*#J?yfbbcqg-=jH z5p-(E29d_8!L1jBxwB#(U8B6Pmr5CIeoBhU#xf3@==SFkZ z9U1G6v@XXDWVnGGH<;lDSFMlbUA2pi3yq5{3oR=<`fm?V6M4z@(l<7W{>pq$3KKauxXS+w&N;YH9U2D&6He>Av6?(7Mv)H}Ry)^zF`Tp#!+11*i z)RB9;9=oIcq45Lbhnf$cUO9F8jxl>+EW7KBs(ImV4ooMU=k*hLtL?_Ixnr-LfCVi+ zzVP_s;f2FlcYA8&p0zE#@13EyhHkgM@B4x8&X<39=7Te<)+1o|j)pbw>7rki;ETk+u}mctR>tQAo1YuA-Eno0>mC?W^n9 zLai0u?l8yVl}u?$^ya*ZqE%-J)Y-Zn7+jU9)NV`TtEd{#_-bcL3crIP9x&RrFvv<5 z2rn|PUAV$r)xOAFVSTz$D(GaBDwC<~^f|~FOiht@)S*x=VH6?vJ*WZ!x&j28QE_O8 zP!1A4H!TS?MpCvB;R1*qxEjacO7cGT_|FK?MBX9-W^-JG66v%ZwxIX{v;+IsWX+lI zb8OYru|aHf-L-V(eZ4u~aK<Tzr0*J%We1VOpW=5W6rT;PLI6v+*{ABn)bn0po+xOUX((V1PtZnx#fP5s@!t8&v&3DAX{MgZSq(}SX-7LVe zlZU&Fp1dSv%I`I*U8a{pSpK)83dvrW06{xrQwSc75=+!oh<+u8Z~(YO4q~fKoPQC81AcuA|(_dhW2*1H~zv$X)bAP{aH1K}tMXcxXF zCB_c#CdjJ@{uRM-1m8qJeUS!qXbtXD!rL7XkqQSV7L0=TG#nLa-z={Y;G?ZTP z?xDqu#s&TFI*P3T7f{%M8W+t+o*NxIIyx2@d-3_Bfv2B4^=#nGsb`Lk9(iu$=!ons zD}DCNGh-(L&kvs(Q(_bGx|W9U(SR|9Amu~?H?9(?*oI6b^qZk st7D&HKV=X;w0l_B{PBkjJRbJxA^+?{1|AQc&uiJ%`Ln-g@JXrtKdl06&;S4c literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e31dd4a51f033f131a5efc9690b3d3cf190bf805 GIT binary patch literal 942 zcmZ8gy>HYo6n8%EqY>q!bf7nRLG(mPXc?(Mr+!G4s-tQThFhXs{O-=Z#0j=jxDKcT zNK_0gNUSg+)IWu#W#fbpf{CqgTPN&XI>3|s{QT_S@A<{Qe43tikh0~$quzZJp`Utj zZgvrjyDE5#2x=o@5Hm8`2C=}{J>Ne+ujW02SJW9hvSPb!8;Dt?^c=NqD3S7D9wC0w zL{L`4J}OX0#w0M%&>WieO17>N4u{7X2r1kUxD?K_f6Q@OeJXIAkSqesL1vr@Ec<{{ z4qf0J2qw@CvPj~U2G$g`OT$0{?qrNa;Nn&vIAAKAghfM~Fu*?!-sBWI?(!tg7X=ij zK{yC{;5yDm7Y~yR2MRq&Qr5%U#cdZbxIK3PcN2~Syh&O16cZ{Wr=3jFgyB3N2TXAh z2iP9v35$Wrg`6}D7!LaZ>p@;zwLlr2;JWyUzVUn=%cSU7RS=K{T(uPqo#KW>H(WI7 z{L){xIhysiHn#koR-?Jv*nH4j^He%a!7$L#}0+yIB>8 z8RZVp*GpGk?;q|T*KVI&T0E{U@+p-bRee7WDD(Y#WmNHfl7zm`%NkzM+gDW`x2Tf~ zQK={=)<71-;QOOe$|;k)szI8Q>)+|Dx;zo*J$_j&wZg?+9maO3orLSTXSFRsl)59ZoFuoTF9>DpRw~!JuM&*?9fwg8G@idPa|cgO-DdK{@#!8QPg{U`m52ffg1Ps ze;k-)0A6e3Vicz2Y}o+dHxL2{LL)2?gBD=H(7Z^Bu!xEy>mua+49ln-8cRwDOZ%Gu zK=Ykl&h1JbZ$V4VCb4K0R`We8#HKY^%eh7Bv;iBm37fP9Te(&xGjtZt<=iG$=scXy zd5v793veOlb<(DbaFH&-CAtik=?Yw-t8kTGgV*SFc%81nHR?cz-hel9{|5Pp-h?;l zI$Wo>;4OL^-liLH!vJU#cGRBr3J`N94(pM~81aI-WLm^fmHoCrM^4)sUM z`2aDF4~6vQF=nz5KE$J(B9V<_Cgf#?*a z^_5SE-y=v?cKsy5(LgqLQ=yfqtzxP{9PeW^^7RJhZp=6$idjztQvr|mI<_o7O=E$i zoljmuQZ6fLG!g4lGLfq(BO&TDe;_qQkv^SrW@HrONLq>{zIsE>c%l+2ZKb7Au6D}O z9w3ph_&G*gF1+U+iViS~BZ?v+Te-706e95m=0etWMCSFf#OGWtUbZd=c0Q36&kN(g z^JFc-N!L3-Q5Z9(6Do^5zW;IQxi6^)x>snQ}R2PD?x?U~dm^C!1tNbXRZvN4% zsU+6YFr#5s!<>dI8s;@z)v%zUtw1)X@zZ8ti+V->0@$*K6%DHjR00H(wO)#ez>%ko zaxW9A4tCGys*Ut@kVUKtQ0|l17qSth6fqolB1@E8LoJ~JViWTZaHci|ZxfeB!VTOX zxVqKuH%O?S*yVJP;fc}T65#tky#xVkF3VHeAJvh{OrX~WBX`!{tzA3#|=%)UmNUmb-@1s DYG~OM literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..688cc05a5e194f20434df07f72aa3c57526e0e57 GIT binary patch literal 25266 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca03f9a1d9cf89be4db12d38c15e3911ec136e8c GIT binary patch literal 7067 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 S({^v)j2!oqQ54pxBK`*lBG+C3 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a71783b586432366f12e62942f1d91a8079c6fc GIT binary patch literal 27777 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 J0si=K{{e(C7uEm( literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef844fbb514bd73b65942219fda720c35f351d64 GIT binary patch literal 36289 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 lJ<3<|J^Y` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + + __attrs__ = [ + "max_retries", + "config", + "_pool_connections", + "_pool_maxsize", + "_pool_block", + ] + + def __init__( + self, + pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, + max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK, + ): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super().__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager( + self._pool_connections, self._pool_maxsize, block=self._pool_block + ) + + def init_poolmanager( + self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs + ): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + **pool_kwargs, + ) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith("socks"): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs, + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs, + ) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith("https") and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + + if not cert_loc or not os.path.exists(cert_loc): + raise OSError( + f"Could not find a suitable TLS CA certificate bundle, " + f"invalid path: {cert_loc}" + ) + + conn.cert_reqs = "CERT_REQUIRED" + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = "CERT_NONE" + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise OSError( + f"Could not find the TLS certificate file, " + f"invalid path: {conn.cert_file}" + ) + if conn.key_file and not os.path.exists(conn.key_file): + raise OSError( + f"Could not find the TLS key file, invalid path: {conn.key_file}" + ) + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`PreparedRequest ` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, "status", None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, "headers", {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode("utf-8") + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, "http") + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL( + "Please check proxy URL. It is malformed " + "and could be missing the host." + ) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = proxy and scheme != "https" + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith("socks") + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers["Proxy-Authorization"] = _basic_auth_str(username, password) + + return headers + + def send( + self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None + ): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers( + request, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + ) + + chunked = not (request.body is None or "Content-Length" in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError: + raise ValueError( + f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " + f"or a single float to set both timeouts to the same value." + ) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout, + chunked=chunked, + ) + + except (ProtocolError, OSError) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + elif isinstance(e, _InvalidHeader): + raise InvalidHeader(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/api.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/api.py new file mode 100644 index 0000000..cd0b3ee --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/api.py @@ -0,0 +1,157 @@ +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request `. + + :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + >>> req + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("get", url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("options", url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. If + `allow_redirects` is not provided, it will be set to `False` (as + opposed to the default :meth:`request` behavior). + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", False) + return request("head", url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("post", url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("put", url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("patch", url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("delete", url, **kwargs) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py new file mode 100644 index 0000000..9733686 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py @@ -0,0 +1,315 @@ +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import hashlib +import os +import re +import threading +import time +import warnings +from base64 import b64encode + +from ._internal_utils import to_native_string +from .compat import basestring, str, urlparse +from .cookies import extract_cookies_to_jar +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded" +CONTENT_TYPE_MULTI_PART = "multipart/form-data" + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(type(password)), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode("latin1") + + if isinstance(password, str): + password = password.encode("latin1") + + authstr = "Basic " + to_native_string( + b64encode(b":".join((username, password))).strip() + ) + + return authstr + + +class AuthBase: + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError("Auth hooks must be callable.") + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all( + [ + self.username == getattr(other, "username", None), + self.password == getattr(other, "password", None), + ] + ) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers["Authorization"] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, "init"): + self._thread_local.init = True + self._thread_local.last_nonce = "" + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal["realm"] + nonce = self._thread_local.chal["nonce"] + qop = self._thread_local.chal.get("qop") + algorithm = self._thread_local.chal.get("algorithm") + opaque = self._thread_local.chal.get("opaque") + hash_utf8 = None + + if algorithm is None: + _algorithm = "MD5" + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == "MD5" or _algorithm == "MD5-SESS": + + def md5_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.md5(x).hexdigest() + + hash_utf8 = md5_utf8 + elif _algorithm == "SHA": + + def sha_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha1(x).hexdigest() + + hash_utf8 = sha_utf8 + elif _algorithm == "SHA-256": + + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha256(x).hexdigest() + + hash_utf8 = sha256_utf8 + elif _algorithm == "SHA-512": + + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha512(x).hexdigest() + + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731 + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += f"?{p_parsed.query}" + + A1 = f"{self.username}:{realm}:{self.password}" + A2 = f"{method}:{path}" + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = f"{self._thread_local.nonce_count:08x}" + s = str(self._thread_local.nonce_count).encode("utf-8") + s += nonce.encode("utf-8") + s += time.ctime().encode("utf-8") + s += os.urandom(8) + + cnonce = hashlib.sha1(s).hexdigest()[:16] + if _algorithm == "MD5-SESS": + HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") + + if not qop: + respdig = KD(HA1, f"{nonce}:{HA2}") + elif qop == "auth" or "auth" in qop.split(","): + noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = ( + f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' + f'uri="{path}", response="{respdig}"' + ) + if opaque: + base += f', opaque="{opaque}"' + if algorithm: + base += f', algorithm="{algorithm}"' + if entdig: + base += f', digest="{entdig}"' + if qop: + base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' + + return f"Digest {base}" + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/psf/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get("www-authenticate", "") + + if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r"digest ", flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers["Authorization"] = self.build_digest_header( + prep.method, prep.url + ) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers["Authorization"] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook("response", self.handle_401) + r.register_hook("response", self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all( + [ + self.username == getattr(other, "username", None), + self.password == getattr(other, "password", None), + ] + ) + + def __ne__(self, other): + return not self == other diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py new file mode 100644 index 0000000..38696a1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" + +import os + +if "_PIP_STANDALONE_CERT" not in os.environ: + from pip._vendor.certifi import where +else: + def where(): + return os.environ["_PIP_STANDALONE_CERT"] + +if __name__ == "__main__": + print(where()) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py new file mode 100644 index 0000000..9ab2bb4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py @@ -0,0 +1,67 @@ +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module previously handled import compatibility issues +between Python 2 and Python 3. It remains for backwards +compatibility until the next major version. +""" + +from pip._vendor import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = _ver[0] == 2 + +#: Python 3.x? +is_py3 = _ver[0] == 3 + +# Note: We've patched out simplejson support in pip because it prevents +# upgrading simplejson on Windows. +import json +from json import JSONDecodeError + +# Keep OrderedDict for backwards compatibility. +from collections import OrderedDict +from collections.abc import Callable, Mapping, MutableMapping +from http import cookiejar as cookielib +from http.cookies import Morsel +from io import StringIO + +# -------------- +# Legacy Imports +# -------------- +from urllib.parse import ( + quote, + quote_plus, + unquote, + unquote_plus, + urldefrag, + urlencode, + urljoin, + urlparse, + urlsplit, + urlunparse, +) +from urllib.request import ( + getproxies, + getproxies_environment, + parse_http_list, + proxy_bypass, + proxy_bypass_environment, +) + +builtin_str = str +str = str +bytes = bytes +basestring = (str, bytes) +numeric_types = (int, float) +integer_types = (int,) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000..bf54ab2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py @@ -0,0 +1,561 @@ +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import calendar +import copy +import time + +from ._internal_utils import to_native_string +from .compat import Morsel, MutableMapping, cookielib, urlparse, urlunparse + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest: + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get("Host"): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers["Host"], encoding="utf-8") + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse( + [ + parsed.scheme, + host, + parsed.path, + parsed.params, + parsed.query, + parsed.fragment, + ] + ) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError( + "Cookie headers should be added with add_unredirected_header()" + ) + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse: + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, "_original_response") and response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get("Cookie") + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name( + self, name, domain=kwargs.get("domain"), path=kwargs.get("path") + ) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if (domain is None or cookie.domain == domain) and ( + path is None or cookie.path == path + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super().__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if ( + hasattr(cookie.value, "startswith") + and cookie.value.startswith('"') + and cookie.value.endswith('"') + ): + cookie.value = cookie.value.replace('\\"', "") + return super().set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super().update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: + # if there are multiple cookies that meet passed in criteria + raise CookieConflictError( + f"There are multiple cookies with name, {name!r}" + ) + # we will eventually return this as long as no cookie conflict + toReturn = cookie.value + + if toReturn: + return toReturn + raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop("_cookies_lock") + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if "_cookies_lock" not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, "copy"): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + "version": 0, + "name": name, + "value": value, + "port": None, + "domain": "", + "path": "/", + "secure": False, + "expires": None, + "discard": True, + "comment": None, + "comment_url": None, + "rest": {"HttpOnly": None}, + "rfc2109": False, + } + + badargs = set(kwargs) - set(result) + if badargs: + raise TypeError( + f"create_cookie() got unexpected keyword arguments: {list(badargs)}" + ) + + result.update(kwargs) + result["port_specified"] = bool(result["port"]) + result["domain_specified"] = bool(result["domain"]) + result["domain_initial_dot"] = result["domain"].startswith(".") + result["path_specified"] = bool(result["path"]) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel["max-age"]: + try: + expires = int(time.time() + int(morsel["max-age"])) + except ValueError: + raise TypeError(f"max-age: {morsel['max-age']} must be integer") + elif morsel["expires"]: + time_template = "%a, %d-%b-%Y %H:%M:%S GMT" + expires = calendar.timegm(time.strptime(morsel["expires"], time_template)) + return create_cookie( + comment=morsel["comment"], + comment_url=bool(morsel["comment"]), + discard=False, + domain=morsel["domain"], + expires=expires, + name=morsel.key, + path=morsel["path"], + port=None, + rest={"HttpOnly": morsel["httponly"]}, + rfc2109=False, + secure=bool(morsel["secure"]), + value=morsel.value, + version=morsel["version"] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError("You can only merge into CookieJar") + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict(cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000..168d073 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py @@ -0,0 +1,141 @@ +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError + +from .compat import JSONDecodeError as CompatJSONDecodeError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop("response", None) + self.response = response + self.request = kwargs.pop("request", None) + if response is not None and not self.request and hasattr(response, "request"): + self.request = self.response.request + super().__init__(*args, **kwargs) + + +class InvalidJSONError(RequestException): + """A JSON error occurred.""" + + +class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError): + """Couldn't decode the text into json""" + + def __init__(self, *args, **kwargs): + """ + Construct the JSONDecodeError instance first with all + args. Then use it's args to construct the IOError so that + the json specific args aren't used as IOError specific args + and the error message from JSONDecodeError is preserved. + """ + CompatJSONDecodeError.__init__(self, *args) + InvalidJSONError.__init__(self, *self.args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL scheme (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """The URL scheme provided is either invalid or unsupported.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content.""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed.""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body.""" + + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/help.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/help.py new file mode 100644 index 0000000..2d292c2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/help.py @@ -0,0 +1,131 @@ +"""Module containing bug report helper(s).""" + +import json +import platform +import ssl +import sys + +from pip._vendor import idna +from pip._vendor import urllib3 + +from . import __version__ as requests_version + +charset_normalizer = None + +try: + from pip._vendor import chardet +except ImportError: + chardet = None + +try: + from pip._vendor.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import cryptography + import OpenSSL + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 3.10.3 it will return + {'name': 'CPython', 'version': '3.10.3'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == "CPython": + implementation_version = platform.python_version() + elif implementation == "PyPy": + implementation_version = "{}.{}.{}".format( + sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro, + ) + if sys.pypy_version_info.releaselevel != "final": + implementation_version = "".join( + [implementation_version, sys.pypy_version_info.releaselevel] + ) + elif implementation == "Jython": + implementation_version = platform.python_version() # Complete Guess + elif implementation == "IronPython": + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = "Unknown" + + return {"name": implementation, "version": implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + "system": platform.system(), + "release": platform.release(), + } + except OSError: + platform_info = { + "system": "Unknown", + "release": "Unknown", + } + + implementation_info = _implementation() + urllib3_info = {"version": urllib3.__version__} + charset_normalizer_info = {"version": None} + chardet_info = {"version": None} + if charset_normalizer: + charset_normalizer_info = {"version": charset_normalizer.__version__} + if chardet: + chardet_info = {"version": chardet.__version__} + + pyopenssl_info = { + "version": None, + "openssl_version": "", + } + if OpenSSL: + pyopenssl_info = { + "version": OpenSSL.__version__, + "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}", + } + cryptography_info = { + "version": getattr(cryptography, "__version__", ""), + } + idna_info = { + "version": getattr(idna, "__version__", ""), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""} + + return { + "platform": platform_info, + "implementation": implementation_info, + "system_ssl": system_ssl_info, + "using_pyopenssl": pyopenssl is not None, + "using_charset_normalizer": chardet is None, + "pyOpenSSL": pyopenssl_info, + "urllib3": urllib3_info, + "chardet": chardet_info, + "charset_normalizer": charset_normalizer_info, + "cryptography": cryptography_info, + "idna": idna_info, + "requests": { + "version": requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000..d181ba2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py @@ -0,0 +1,33 @@ +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ["response"] + + +def default_hooks(): + return {event: [] for event in HOOKS} + + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, "__call__"): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/models.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/models.py new file mode 100644 index 0000000..76e6f19 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/models.py @@ -0,0 +1,1034 @@ +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. +import encodings.idna # noqa: F401 +from io import UnsupportedOperation + +from pip._vendor.urllib3.exceptions import ( + DecodeError, + LocationParseError, + ProtocolError, + ReadTimeoutError, + SSLError, +) +from pip._vendor.urllib3.fields import RequestField +from pip._vendor.urllib3.filepost import encode_multipart_formdata +from pip._vendor.urllib3.util import parse_url + +from ._internal_utils import to_native_string, unicode_is_ascii +from .auth import HTTPBasicAuth +from .compat import ( + Callable, + JSONDecodeError, + Mapping, + basestring, + builtin_str, + chardet, + cookielib, +) +from .compat import json as complexjson +from .compat import urlencode, urlsplit, urlunparse +from .cookies import _copy_cookie_jar, cookiejar_from_dict, get_cookie_header +from .exceptions import ( + ChunkedEncodingError, + ConnectionError, + ContentDecodingError, + HTTPError, + InvalidJSONError, + InvalidURL, +) +from .exceptions import JSONDecodeError as RequestsJSONDecodeError +from .exceptions import MissingSchema +from .exceptions import SSLError as RequestsSSLError +from .exceptions import StreamConsumedError +from .hooks import default_hooks +from .status_codes import codes +from .structures import CaseInsensitiveDict +from .utils import ( + check_header_validity, + get_auth_from_url, + guess_filename, + guess_json_utf, + iter_slices, + parse_header_links, + requote_uri, + stream_decode_response_unicode, + super_len, + to_key_val_list, +) + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin: + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = "/" + + url.append(path) + + query = p.query + if query: + url.append("?") + url.append(query) + + return "".join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, "read"): + return data + elif hasattr(data, "__iter__"): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): + vs = [vs] + for v in vs: + if v is not None: + result.append( + ( + k.encode("utf-8") if isinstance(k, str) else k, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if not files: + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, "__iter__"): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + ( + field.decode("utf-8") + if isinstance(field, bytes) + else field, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, "read"): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin: + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError(f'Unsupported event specified, with event name "{event}"') + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, "__iter__"): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + + """ + + def __init__( + self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None, + ): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return f"" + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Instances are generated from a :class:`Request ` object, and + should not be instantiated manually; doing so may produce undesirable + effects. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + >>> r + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare( + self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None, + ): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return f"" + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + from pip._vendor import idna + + try: + host = idna.encode(host, uts46=True).decode("utf-8") + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/psf/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode("utf8") + else: + url = str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ":" in url and not url.lower().startswith("http"): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + raise MissingSchema( + f"Invalid URL {url!r}: No scheme supplied. " + f"Perhaps you meant https://{url}?" + ) + + if not host: + raise InvalidURL(f"Invalid URL {url!r}: No host supplied") + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL("URL has an invalid label.") + elif host.startswith(("*", ".")): + raise InvalidURL("URL has an invalid label.") + + # Carefully reconstruct the network location + netloc = auth or "" + if netloc: + netloc += "@" + netloc += host + if port: + netloc += f":{port}" + + # Bare domains aren't valid URLs. + if not path: + path = "/" + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = f"{query}&{enc_params}" + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = "application/json" + + try: + body = complexjson.dumps(json, allow_nan=False) + except ValueError as ve: + raise InvalidJSONError(ve, request=self) + + if not isinstance(body, bytes): + body = body.encode("utf-8") + + is_stream = all( + [ + hasattr(data, "__iter__"), + not isinstance(data, (basestring, list, tuple, Mapping)), + ] + ) + + if is_stream: + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + body = data + + if getattr(body, "tell", None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except OSError: + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError( + "Streamed bodies and files are mutually exclusive." + ) + + if length: + self.headers["Content-Length"] = builtin_str(length) + else: + self.headers["Transfer-Encoding"] = "chunked" + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, "read"): + content_type = None + else: + content_type = "application/x-www-form-urlencoded" + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ("content-type" not in self.headers): + self.headers["Content-Type"] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers["Content-Length"] = builtin_str(length) + elif ( + self.method not in ("GET", "HEAD") + and self.headers.get("Content-Length") is None + ): + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers["Content-Length"] = "0" + + def prepare_auth(self, auth, url=""): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers["Cookie"] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response: + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + "_content", + "status_code", + "headers", + "url", + "history", + "encoding", + "reason", + "cookies", + "elapsed", + "request", + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + #: This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, "_content_consumed", True) + setattr(self, "raw", None) + + def __repr__(self): + return f"" + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return "location" in self.headers and self.status_code in REDIRECT_STATI + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return "location" in self.headers and self.status_code in ( + codes.moved_permanently, + codes.permanent_redirect, + ) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" + return chardet.detect(self.content)["encoding"] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, "stream"): + try: + yield from self.raw.stream(chunk_size, decode_content=True) + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + except SSLError as e: + raise RequestsSSLError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError( + f"chunk_size must be an int, it is instead a {type(chunk_size)}." + ) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines( + self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None + ): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content( + chunk_size=chunk_size, decode_unicode=decode_unicode + ): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + yield from lines + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError("The content for this response was already consumed") + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``charset_normalizer`` or ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return "" + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors="replace") + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors="replace") + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises requests.exceptions.JSONDecodeError: If the response body does not + contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using charset_normalizer to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads(self.content.decode(encoding), **kwargs) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + except JSONDecodeError as e: + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + try: + return complexjson.loads(self.text, **kwargs) + except JSONDecodeError as e: + # Catch JSON-related errors and raise as requests.JSONDecodeError + # This aliases json.JSONDecodeError and simplejson.JSONDecodeError + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get("link") + + resolved_links = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get("rel") or link.get("url") + resolved_links[key] = link + + return resolved_links + + def raise_for_status(self): + """Raises :class:`HTTPError`, if one occurred.""" + + http_error_msg = "" + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode("utf-8") + except UnicodeDecodeError: + reason = self.reason.decode("iso-8859-1") + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = ( + f"{self.status_code} Client Error: {reason} for url: {self.url}" + ) + + elif 500 <= self.status_code < 600: + http_error_msg = ( + f"{self.status_code} Server Error: {reason} for url: {self.url}" + ) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, "release_conn", None) + if release_conn is not None: + release_conn() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py new file mode 100644 index 0000000..9582fa7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + vendored_package = "pip._vendor." + package + locals()[package] = __import__(vendored_package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == vendored_package or mod.startswith(vendored_package + '.'): + unprefixed_mod = mod[len("pip._vendor."):] + sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000..dbcf2a7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py @@ -0,0 +1,833 @@ +""" +requests.sessions +~~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from collections import OrderedDict +from datetime import timedelta + +from ._internal_utils import to_native_string +from .adapters import HTTPAdapter +from .auth import _basic_auth_str +from .compat import Mapping, cookielib, urljoin, urlparse +from .cookies import ( + RequestsCookieJar, + cookiejar_from_dict, + extract_cookies_to_jar, + merge_cookies, +) +from .exceptions import ( + ChunkedEncodingError, + ContentDecodingError, + InvalidSchema, + TooManyRedirects, +) +from .hooks import default_hooks, dispatch_hook + +# formerly defined here, reexposed here for backward compatibility +from .models import ( # noqa: F401 + DEFAULT_REDIRECT_LIMIT, + REDIRECT_STATI, + PreparedRequest, + Request, +) +from .status_codes import codes +from .structures import CaseInsensitiveDict +from .utils import ( # noqa: F401 + DEFAULT_PORTS, + default_headers, + get_auth_from_url, + get_environ_proxies, + get_netrc_auth, + requote_uri, + resolve_proxies, + rewind_body, + should_bypass_proxies, + to_key_val_list, +) + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == "win32": + preferred_clock = time.perf_counter +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get("response") == []: + return request_hooks + + if request_hooks is None or request_hooks.get("response") == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin: + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers["location"] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + location = location.encode("latin1") + return to_native_string(location, "utf8") + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if ( + old_parsed.scheme == "http" + and old_parsed.port in (80, None) + and new_parsed.scheme == "https" + and new_parsed.port in (443, None) + ): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if ( + not changed_scheme + and old_parsed.port in default_port + and new_parsed.port in default_port + ): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects( + self, + resp, + req, + stream=False, + timeout=None, + verify=True, + cert=None, + proxies=None, + yield_requests=False, + **adapter_kwargs, + ): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects( + f"Exceeded {self.max_redirects} redirects.", response=resp + ) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith("//"): + parsed_rurl = urlparse(resp.url) + url = ":".join([to_native_string(parsed_rurl.scheme), url]) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == "" and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/psf/requests/issues/1084 + if resp.status_code not in ( + codes.temporary_redirect, + codes.permanent_redirect, + ): + # https://github.com/psf/requests/issues/3490 + purged_headers = ("Content-Length", "Content-Type", "Transfer-Encoding") + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + headers.pop("Cookie", None) + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = prepared_request._body_position is not None and ( + "Content-Length" in headers or "Transfer-Encoding" in headers + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs, + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if "Authorization" in headers and self.should_strip_auth( + response.request.url, url + ): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers["Authorization"] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + headers = prepared_request.headers + scheme = urlparse(prepared_request.url).scheme + new_proxies = resolve_proxies(prepared_request, proxies, self.trust_env) + + if "Proxy-Authorization" in headers: + del headers["Proxy-Authorization"] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + # urllib3 handles proxy authorization for us in the standard adapter. + # Avoid appending this to TLS tunneled requests where it may be leaked. + if not scheme.startswith('https') and username and password: + headers["Proxy-Authorization"] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != "HEAD": + method = "GET" + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != "HEAD": + method = "GET" + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == "POST": + method = "GET" + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + ... s.get('https://httpbin.org/get') + + """ + + __attrs__ = [ + "headers", + "cookies", + "auth", + "proxies", + "hooks", + "params", + "verify", + "cert", + "adapters", + "stream", + "trust_env", + "max_redirects", + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + #: Defaults to `True`, requiring requests to verify the TLS certificate at the + #: remote end. + #: If verify is set to `False`, requests will accept any TLS certificate + #: presented by the server, and will ignore hostname mismatches and/or + #: expired certificates, which will make your application vulnerable to + #: man-in-the-middle (MitM) attacks. + #: Only set this to `False` for testing. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount("https://", HTTPAdapter()) + self.mount("http://", HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies + ) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting( + request.headers, self.headers, dict_class=CaseInsensitiveDict + ), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request( + self, + method, + url, + params=None, + data=None, + headers=None, + cookies=None, + files=None, + auth=None, + timeout=None, + allow_redirects=True, + proxies=None, + hooks=None, + stream=None, + verify=None, + cert=None, + json=None, + ): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. When set to + ``False``, requests will accept any TLS certificate presented by + the server, and will ignore hostname mismatches and/or expired + certificates, which will make your application vulnerable to + man-in-the-middle (MitM) attacks. Setting verify to ``False`` + may be useful during local development or testing. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + "timeout": timeout, + "allow_redirects": allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", True) + return self.request("GET", url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", True) + return self.request("OPTIONS", url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", False) + return self.request("HEAD", url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("POST", url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("PUT", url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("PATCH", url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("DELETE", url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault("stream", self.stream) + kwargs.setdefault("verify", self.verify) + kwargs.setdefault("cert", self.cert) + if "proxies" not in kwargs: + kwargs["proxies"] = resolve_proxies(request, self.proxies, self.trust_env) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError("You can only send PreparedRequests.") + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop("allow_redirects", True) + stream = kwargs.get("stream") + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook("response", hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Resolve redirects if allowed. + if allow_redirects: + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + history = [resp for resp in gen] + else: + history = [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next( + self.resolve_redirects(r, request, yield_requests=True, **kwargs) + ) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get("no_proxy") if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration + # and be compatible with cURL. + if verify is True or verify is None: + verify = ( + os.environ.get("REQUESTS_CA_BUNDLE") + or os.environ.get("CURL_CA_BUNDLE") + or verify + ) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {"proxies": proxies, "stream": stream, "verify": verify, "cert": cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema(f"No connection adapters were found for {url!r}") + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000..4bd072b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py @@ -0,0 +1,128 @@ +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +Example:: + + >>> import requests + >>> requests.codes['temporary_redirect'] + 307 + >>> requests.codes.teapot + 418 + >>> requests.codes['\o/'] + 200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + # Informational. + 100: ("continue",), + 101: ("switching_protocols",), + 102: ("processing",), + 103: ("checkpoint",), + 122: ("uri_too_long", "request_uri_too_long"), + 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), + 201: ("created",), + 202: ("accepted",), + 203: ("non_authoritative_info", "non_authoritative_information"), + 204: ("no_content",), + 205: ("reset_content", "reset"), + 206: ("partial_content", "partial"), + 207: ("multi_status", "multiple_status", "multi_stati", "multiple_stati"), + 208: ("already_reported",), + 226: ("im_used",), + # Redirection. + 300: ("multiple_choices",), + 301: ("moved_permanently", "moved", "\\o-"), + 302: ("found",), + 303: ("see_other", "other"), + 304: ("not_modified",), + 305: ("use_proxy",), + 306: ("switch_proxy",), + 307: ("temporary_redirect", "temporary_moved", "temporary"), + 308: ( + "permanent_redirect", + "resume_incomplete", + "resume", + ), # "resume" and "resume_incomplete" to be removed in 3.0 + # Client Error. + 400: ("bad_request", "bad"), + 401: ("unauthorized",), + 402: ("payment_required", "payment"), + 403: ("forbidden",), + 404: ("not_found", "-o-"), + 405: ("method_not_allowed", "not_allowed"), + 406: ("not_acceptable",), + 407: ("proxy_authentication_required", "proxy_auth", "proxy_authentication"), + 408: ("request_timeout", "timeout"), + 409: ("conflict",), + 410: ("gone",), + 411: ("length_required",), + 412: ("precondition_failed", "precondition"), + 413: ("request_entity_too_large",), + 414: ("request_uri_too_large",), + 415: ("unsupported_media_type", "unsupported_media", "media_type"), + 416: ( + "requested_range_not_satisfiable", + "requested_range", + "range_not_satisfiable", + ), + 417: ("expectation_failed",), + 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), + 421: ("misdirected_request",), + 422: ("unprocessable_entity", "unprocessable"), + 423: ("locked",), + 424: ("failed_dependency", "dependency"), + 425: ("unordered_collection", "unordered"), + 426: ("upgrade_required", "upgrade"), + 428: ("precondition_required", "precondition"), + 429: ("too_many_requests", "too_many"), + 431: ("header_fields_too_large", "fields_too_large"), + 444: ("no_response", "none"), + 449: ("retry_with", "retry"), + 450: ("blocked_by_windows_parental_controls", "parental_controls"), + 451: ("unavailable_for_legal_reasons", "legal_reasons"), + 499: ("client_closed_request",), + # Server Error. + 500: ("internal_server_error", "server_error", "/o\\", "✗"), + 501: ("not_implemented",), + 502: ("bad_gateway",), + 503: ("service_unavailable", "unavailable"), + 504: ("gateway_timeout",), + 505: ("http_version_not_supported", "http_version"), + 506: ("variant_also_negotiates",), + 507: ("insufficient_storage",), + 509: ("bandwidth_limit_exceeded", "bandwidth"), + 510: ("not_extended",), + 511: ("network_authentication_required", "network_auth", "network_authentication"), +} + +codes = LookupDict(name="status_codes") + + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(("\\", "/")): + setattr(codes, title.upper(), code) + + def doc(code): + names = ", ".join(f"``{n}``" for n in _codes[code]) + return "* %d: %s" % (code, names) + + global __doc__ + __doc__ = ( + __doc__ + "\n" + "\n".join(doc(code) for code in sorted(_codes)) + if __doc__ is not None + else None + ) + + +_init() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py new file mode 100644 index 0000000..188e13e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py @@ -0,0 +1,99 @@ +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from collections import OrderedDict + +from .compat import Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ((lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items()) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super().__init__() + + def __repr__(self): + return f"" + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py new file mode 100644 index 0000000..36607ed --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py @@ -0,0 +1,1094 @@ +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile +from collections import OrderedDict + +from pip._vendor.urllib3.util import make_headers, parse_url + +from . import certs +from .__version__ import __version__ + +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import ( # noqa: F401 + _HEADER_VALIDATORS_BYTE, + _HEADER_VALIDATORS_STR, + HEADER_VALIDATORS, + to_native_string, +) +from .compat import ( + Mapping, + basestring, + bytes, + getproxies, + getproxies_environment, + integer_types, +) +from .compat import parse_http_list as _parse_list_header +from .compat import ( + proxy_bypass, + proxy_bypass_environment, + quote, + str, + unquote, + urlparse, + urlunparse, +) +from .cookies import cookiejar_from_dict +from .exceptions import ( + FileModeWarning, + InvalidHeader, + InvalidURL, + UnrewindableBodyError, +) +from .structures import CaseInsensitiveDict + +NETRC_FILES = (".netrc", "_netrc") + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {"http": 80, "https": 443} + +# Ensure that ', ' is used to preserve previous delimiter behavior. +DEFAULT_ACCEPT_ENCODING = ", ".join( + re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) +) + + +if sys.platform == "win32": + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + import winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey( + winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", + ) + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, "ProxyEnable")[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, "ProxyOverride")[0] + except (OSError, ValueError): + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(";") + # now check if we match one of the registry values. + for test in proxyOverride: + if test == "": + if "." not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, "items"): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, "__len__"): + total_length = len(o) + + elif hasattr(o, "len"): + total_length = o.len + + elif hasattr(o, "fileno"): + try: + fileno = o.fileno() + except (io.UnsupportedOperation, AttributeError): + # AttributeError is a surprising exception, seeing as how we've just checked + # that `hasattr(o, 'fileno')`. It happens for objects obtained via + # `Tarfile.extractfile()`, per issue 5229. + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if "b" not in o.mode: + warnings.warn( + ( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode." + ), + FileModeWarning, + ) + + if hasattr(o, "tell"): + try: + current_position = o.tell() + except OSError: + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, "seek") and total_length is None: + # StringIO and BytesIO have seek but no usable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except OSError: + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + netrc_file = os.environ.get("NETRC") + if netrc_file is not None: + netrc_locations = (netrc_file,) + else: + netrc_locations = (f"~/{f}" for f in NETRC_FILES) + + try: + from netrc import NetrcParseError, netrc + + netrc_path = None + + for f in netrc_locations: + try: + loc = os.path.expanduser(f) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/psf/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b":" + if isinstance(url, str): + splitstr = splitstr.decode("ascii") + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = 0 if _netrc[0] else 1 + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, OSError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # App Engine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, "name", None) + if name and isinstance(name, basestring) and name[0] != "<" and name[-1] != ">": + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + if not prefix: + # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), + # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users + break + member = "/".join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, member.split("/")[-1]) + if not os.path.exists(extracted_path): + # use read + write to avoid the creating nested folders, we only want the file, avoids mkdir racing condition + with atomic_open(extracted_path) as file_handler: + file_handler.write(zip_file.read(member)) + return extracted_path + + +@contextlib.contextmanager +def atomic_open(filename): + """Write a file to the disk in an atomic fashion""" + tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) + try: + with os.fdopen(tmp_descriptor, "wb") as tmp_handler: + yield tmp_handler + os.replace(tmp_name, filename) + except BaseException: + os.remove(tmp_name) + raise + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError("cannot encode objects that are not 2-tuples") + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError("cannot encode objects that are not 2-tuples") + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if "=" not in item: + result[item] = None + continue + name, value = item.split("=", 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != "\\\\": + return value.replace("\\\\", "\\").replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn( + ( + "In requests 3.0, get_encodings_from_content will be removed. For " + "more information, please see the discussion on issue #2266. (This" + " warning should only appear once.)" + ), + DeprecationWarning, + ) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return ( + charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content) + ) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(";") + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1 :].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get("content-type") + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if "charset" in params: + return params["charset"].strip("'\"") + + if "text" in content_type: + return "ISO-8859-1" + + if "application/json" in content_type: + # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset + return "utf-8" + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes an iterator.""" + + if r.encoding is None: + yield from iterator + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b"", final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos : pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn( + ( + "In requests 3.0, get_unicode_from_response will be removed. For " + "more information, please see the discussion on issue #2266. (This" + " warning should only appear once.)" + ), + DeprecationWarning, + ) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors="replace") + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~" +) + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split("%") + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL(f"Invalid percent-escape sequence: '{h}'") + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = f"%{parts[i]}" + else: + parts[i] = f"%{parts[i]}" + return "".join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack("=L", socket.inet_aton(ip))[0] + netaddr, bits = net.split("/") + netmask = struct.unpack("=L", socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack("=L", socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xFFFFFFFF ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack(">I", bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except OSError: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count("/") == 1: + try: + mask = int(string_network.split("/")[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split("/")[0]) + except OSError: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + def get_proxy(key): + return os.environ.get(key) or os.environ.get(key.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy("no_proxy") + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = (host for host in no_proxy.replace(" ", "").split(",") if host) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += f":{parsed.port}" + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ("no_proxy", no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get("all")) + + proxy_keys = [ + urlparts.scheme + "://" + urlparts.hostname, + urlparts.scheme, + "all://" + urlparts.hostname, + "all", + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def resolve_proxies(request, proxies, trust_env=True): + """This method takes proxy information from a request and configuration + input to resolve a mapping of target proxies. This will consider settings + such a NO_PROXY to strip proxy configurations. + + :param request: Request or PreparedRequest + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + :param trust_env: Boolean declaring whether to trust environment configs + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + url = request.url + scheme = urlparse(url).scheme + no_proxy = proxies.get("no_proxy") + new_proxies = proxies.copy() + + if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get("all")) + + if proxy: + new_proxies.setdefault(scheme, proxy) + return new_proxies + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return f"{name}/{__version__}" + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict( + { + "User-Agent": default_user_agent(), + "Accept-Encoding": DEFAULT_ACCEPT_ENCODING, + "Accept": "*/*", + "Connection": "keep-alive", + } + ) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = " '\"" + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(", *<", value): + try: + url, params = val.split(";", 1) + except ValueError: + url, params = val, "" + + link = {"url": url.strip("<> '\"")} + + for param in params.split(";"): + try: + key, value = param.split("=") + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return "utf-32" # BOM included + if sample[:3] == codecs.BOM_UTF8: + return "utf-8-sig" # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return "utf-16" # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return "utf-8" + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return "utf-16-be" + if sample[1::2] == _null2: # 2nd and 4th are null + return "utf-16-le" + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return "utf-32-be" + if sample[1:] == _null3: + return "utf-32-le" + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + parsed = parse_url(url) + scheme, auth, host, port, path, query, fragment = parsed + + # A defect in urlparse determines that there isn't a netloc present in some + # urls. We previously assumed parsing was overly cautious, and swapped the + # netloc and path. Due to a lack of tests on the original defect, this is + # maintained with parse_url for backwards compatibility. + netloc = parsed.netloc + if not netloc: + netloc, path = path, netloc + + if auth: + # parse_url doesn't provide the netloc with auth + # so we'll add it ourselves. + netloc = "@".join([auth, netloc]) + if scheme is None: + scheme = new_scheme + if path is None: + path = "" + + return urlunparse((scheme, netloc, path, "", query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ("", "") + + return auth + + +def check_header_validity(header): + """Verifies that header parts don't contain leading whitespace + reserved characters, or return characters. + + :param header: tuple, in the format (name, value). + """ + name, value = header + _validate_header_part(header, name, 0) + _validate_header_part(header, value, 1) + + +def _validate_header_part(header, header_part, header_validator_index): + if isinstance(header_part, str): + validator = _HEADER_VALIDATORS_STR[header_validator_index] + elif isinstance(header_part, bytes): + validator = _HEADER_VALIDATORS_BYTE[header_validator_index] + else: + raise InvalidHeader( + f"Header part ({header_part!r}) from {header} " + f"must be of type str or bytes, not {type(header_part)}" + ) + + if not validator.match(header_part): + header_kind = "name" if header_validator_index == 0 else "value" + raise InvalidHeader( + f"Invalid leading whitespace, reserved character(s), or return" + f"character(s) in header {header_kind}: {header_part!r}" + ) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit("@", 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, "")) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, "seek", None) + if body_seek is not None and isinstance( + prepared_request._body_position, integer_types + ): + try: + body_seek(prepared_request._body_position) + except OSError: + raise UnrewindableBodyError( + "An error occurred when rewinding request body for redirect." + ) + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py new file mode 100644 index 0000000..d92acc7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py @@ -0,0 +1,26 @@ +__all__ = [ + "__version__", + "AbstractProvider", + "AbstractResolver", + "BaseReporter", + "InconsistentCandidate", + "Resolver", + "RequirementsConflicted", + "ResolutionError", + "ResolutionImpossible", + "ResolutionTooDeep", +] + +__version__ = "1.0.1" + + +from .providers import AbstractProvider, AbstractResolver +from .reporters import BaseReporter +from .resolvers import ( + InconsistentCandidate, + RequirementsConflicted, + ResolutionError, + ResolutionImpossible, + ResolutionTooDeep, + Resolver, +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..731a970740779b090aa031b084e3ff0671222678 GIT binary patch literal 654 zcmaJ;J&zMH5Vd!c{m3R9pyMQ{kf?%0OrS$2q~ik8NeH0`DBM_^*aTnJ_F_AcLUsRw zo{rzbKUj&1iZ0@cNLMiqfpkpqX5RQ|?0Npy>va&s@%-KFc7)K6K>h~sZCt*D^cl?% zM_({S98=6A9#@fyX{=hbg%R*p)m8~jwspHoRYo(F(_D3EM-{YCUD{PW+QVp-^wWN) zDHvM{>!i_)HP=rj&f9Y8Ut6=3T-beQES#x8*>s1PkuBO9~aUJ1?TS6==YVJdcm86tzzNf;^)>H+Z^s2XR0>N$w?)e8~g4XV@5*M zpW4I0!@=+;1~>YVjUm}qsIhH_l-MM+vH*F2;H)hIqyVq_*P4{EvZ@%f!P+LTcgwo{ zuqL;=4c&HX;D7da{~!MqUBXOs<%!asOvzgZ=8_iz?72I#l1nlYZthJ@;MQ~DPry6a zlc<%@OH#=RsaO7k(T@kiN5n}l9@OP@Ue1IgwX6yJmFC8h-D`rLF{!0zY*4SRvSVfV yq7qN-Av_{Dl)z!0J%bXZFH9K8hZ@r(- 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32ba71b478b6648e25eb2f87f4a2942db3798dd2 GIT binary patch literal 25917 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 XdT8a1-#fDW?BXCW zfzz|}lw44obe3Iz;pz)3&1(?RODgUc)UAx)GTj=#YyY(1P|nBoGE}!-&N+)d+bU8$ z6wB^8fdYAZnWDM*=dOV+!w73-Phqy zKt{F`P?^4*ATK9qVgT521H2lHLGo(AeqoHG0p1BP)+!;bS&bULYq(azycdwe&p|(` z=Yl^M=9>a(gwp=NS~~=l`Me<0<#4erH_o#Yco08wLq5-4t!{`4P)M3Zt&d+_2hVcfZn6U?o^7k-(ehrMQZ6c2-ozahd*nf8H&WxE!do8ft>4-YMur*y^ zLTly;vLECGl-C7P2;=)98eImvOPm`E(0YH_^#;<_)*JiYa*@N1FCYwnb#^na1ta`k zh~>^RkMLeq+j&*9^dmR(9U$z@0$6MX4}4q011f{ea^mtC9ED}-M>B(Sw&^px9+&I0h zA(9FZY3v)G3I|s>s@&uYrVYDNyoWshozTh=L_jO9lIv4fr!F5$wsyaN=Djn2Fq&}h zzIkfpqBu(~j z4SjQH(SPN|2SsH|mdiuQ>IPyj64kwObuU;99CR_aUUk8({`7r!<7(^sz3=tjX})s_ zJb@ctvZcua*HS<(s7X4D=uXTf-?iZ+4zCoo$wh7PBH%Quy;b1`!H_llp<%WE56sKo zSTX^pc}iDy%Wfg*DZ61`wy(6jfms-|hHUUt20#8dxrkdj>Hb$)fTb^~?3(OP!W=&SbVc+U(*ydp_H$ z=Spj#pewAp=OGvE!m7X9ba6#Tcy4< zk%vc2i>e1z=fG{&A}RZdh=7UiH(AXIj3^Zc$;FxWNc(A?L~S0aGtOO4l&A5Q6IYn8(uNW9fcyD3e*nzo<;ZQ>~2SQ zR(+b|13OwsP1BS--oLaT0EWb{8ynEstgFLu(IFPgixWwxL7i#^K*^Ot^+16i1bkQ0 z_0iyHxo|aLBnTS^^FJY0h#gYYW>4{>U}qi!{;`buC82Y6e6BNlOt|-vDw~<~ig;xg zP}0y~mZ6&z{k>QUX*%EwV%@3Pz$M}AFpfpiMU7b%X$2IgCUrzqIb6C}|8O^h*n?}O zr{Q5mmow#UT}PmIR`I35Iauw&6q+SemQ{^DG`2zEyay*JWZRKZU$+Vy9n4Ql1^ui_ zGBVRvgJT;mLBjD|buM&;PI`Z2O^15>5$1yWowKLd?hS{L93Xe25ZuWCl-S@|J)k*K z_qPb=H~8|+Ow%;b{*Z9l2nYuXr+w3akb@%IN?FyU+gAMV=E5_C&9J$#!I=vn(J2fO zl>#eaCqY9f<(m>Vdn*VN8sBjxCz+yK7gz5_dPpY|Tts#;uRP@S_skpOQ}t;H3V! z=&F=a9iWt<a-{K+Orsxu) zlwG3$l1Nk=_Tz|%D_$jq`6MAzBw0G;pyQx^M%dWB4JrE(?SEEK{tp1+!XWPblBU{~gWjSl+yO+whIC^dzE%5L~>usDvSgc9d k8)SRKsx8)eC~iM|*|K4&;VoMSn)#NPyWy`nJlS&nZ&4RsZvX%Q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b2982d87dbd1c876704aa9f8adc23a6eb7a92d8 GIT binary patch literal 10526 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e47696abdc5db39aee32e3c6d4d499144ed664e GIT binary patch literal 220 zcmZ9GO$x#=5QP(~AVTlp)`cC^Z4rdx(w%NYe})>{{E);#@gSbTvv>?oAl-Fkvh~56 z_s#GY^N!;M@k*OZ9r6>#zlN#5JV{Sh^z)LpoFtUW8sJn%h2S0#7JW($@(T_fUxgGjE3XX6C(=N(E%1-aGF+8hp=&zp#IsS;I6BC`2LdSS_@S zLMtQ;$5zXVNsC}KvbPY}+ej7h50_hTO~Ve+6=|X&uH;hZ*q1Wmoiu+6mwn&?d}LoL zma+^eV#-NnDRn&0XUy}`)j%)?K@thBUB4YHWNGmzmO>>5N(q$~|LLC5EW0_sp)pTr zK+iNNO%EXfzR^%o7|{mkULquwN^~LF=Q?ULpz#R!fU>AfbWA)XpW= 3: + # Remove the state that triggered backtracking. + del self._states[-1] + + # Ensure to backtrack to a state that caused the incompatibility + incompatible_state = False + while not incompatible_state: + # Retrieve the last candidate pin and known incompatibilities. + try: + broken_state = self._states.pop() + name, candidate = broken_state.mapping.popitem() + except (IndexError, KeyError): + raise ResolutionImpossible(causes) + current_dependencies = { + self._p.identify(d) + for d in self._p.get_dependencies(candidate) + } + incompatible_state = not current_dependencies.isdisjoint( + incompatible_deps + ) + + incompatibilities_from_broken = [ + (k, list(v.incompatibilities)) + for k, v in broken_state.criteria.items() + ] + + # Also mark the newly known incompatibility. + incompatibilities_from_broken.append((name, [candidate])) + + # Create a new state from the last known-to-work one, and apply + # the previously gathered incompatibility information. + def _patch_criteria(): + for k, incompatibilities in incompatibilities_from_broken: + if not incompatibilities: + continue + try: + criterion = self.state.criteria[k] + except KeyError: + continue + matches = self._p.find_matches( + identifier=k, + requirements=IteratorMapping( + self.state.criteria, + operator.methodcaller("iter_requirement"), + ), + incompatibilities=IteratorMapping( + self.state.criteria, + operator.attrgetter("incompatibilities"), + {k: incompatibilities}, + ), + ) + candidates = build_iter_view(matches) + if not candidates: + return False + incompatibilities.extend(criterion.incompatibilities) + self.state.criteria[k] = Criterion( + candidates=candidates, + information=list(criterion.information), + incompatibilities=incompatibilities, + ) + return True + + self._push_new_state() + success = _patch_criteria() + + # It works! Let's work on this new state. + if success: + return True + + # State does not work after applying known incompatibilities. + # Try the still previous state. + + # No way to backtrack anymore. + return False + + def resolve(self, requirements, max_rounds): + if self._states: + raise RuntimeError("already resolved") + + self._r.starting() + + # Initialize the root state. + self._states = [ + State( + mapping=collections.OrderedDict(), + criteria={}, + backtrack_causes=[], + ) + ] + for r in requirements: + try: + self._add_to_criteria(self.state.criteria, r, parent=None) + except RequirementsConflicted as e: + raise ResolutionImpossible(e.criterion.information) + + # The root state is saved as a sentinel so the first ever pin can have + # something to backtrack to if it fails. The root state is basically + # pinning the virtual "root" package in the graph. + self._push_new_state() + + for round_index in range(max_rounds): + self._r.starting_round(index=round_index) + + unsatisfied_names = [ + key + for key, criterion in self.state.criteria.items() + if not self._is_current_pin_satisfying(key, criterion) + ] + + # All criteria are accounted for. Nothing more to pin, we are done! + if not unsatisfied_names: + self._r.ending(state=self.state) + return self.state + + # keep track of satisfied names to calculate diff after pinning + satisfied_names = set(self.state.criteria.keys()) - set( + unsatisfied_names + ) + + # Choose the most preferred unpinned criterion to try. + name = min(unsatisfied_names, key=self._get_preference) + failure_causes = self._attempt_to_pin_criterion(name) + + if failure_causes: + causes = [i for c in failure_causes for i in c.information] + # Backjump if pinning fails. The backjump process puts us in + # an unpinned state, so we can work on it in the next round. + self._r.resolving_conflicts(causes=causes) + success = self._backjump(causes) + self.state.backtrack_causes[:] = causes + + # Dead ends everywhere. Give up. + if not success: + raise ResolutionImpossible(self.state.backtrack_causes) + else: + # discard as information sources any invalidated names + # (unsatisfied names that were previously satisfied) + newly_unsatisfied_names = { + key + for key, criterion in self.state.criteria.items() + if key in satisfied_names + and not self._is_current_pin_satisfying(key, criterion) + } + self._remove_information_from_criteria( + self.state.criteria, newly_unsatisfied_names + ) + # Pinning was successful. Push a new state to do another pin. + self._push_new_state() + + self._r.ending_round(index=round_index, state=self.state) + + raise ResolutionTooDeep(max_rounds) + + +def _has_route_to_root(criteria, key, all_keys, connected): + if key in connected: + return True + if key not in criteria: + return False + for p in criteria[key].iter_parent(): + try: + pkey = all_keys[id(p)] + except KeyError: + continue + if pkey in connected: + connected.add(key) + return True + if _has_route_to_root(criteria, pkey, all_keys, connected): + connected.add(key) + return True + return False + + +Result = collections.namedtuple("Result", "mapping graph criteria") + + +def _build_result(state): + mapping = state.mapping + all_keys = {id(v): k for k, v in mapping.items()} + all_keys[id(None)] = None + + graph = DirectedGraph() + graph.add(None) # Sentinel as root dependencies' parent. + + connected = {None} + for key, criterion in state.criteria.items(): + if not _has_route_to_root(state.criteria, key, all_keys, connected): + continue + if key not in graph: + graph.add(key) + for p in criterion.iter_parent(): + try: + pkey = all_keys[id(p)] + except KeyError: + continue + if pkey not in graph: + graph.add(pkey) + graph.connect(pkey, key) + + return Result( + mapping={k: v for k, v in mapping.items() if k in connected}, + graph=graph, + criteria=state.criteria, + ) + + +class Resolver(AbstractResolver): + """The thing that performs the actual resolution work.""" + + base_exception = ResolverException + + def resolve(self, requirements, max_rounds=100): + """Take a collection of constraints, spit out the resolution result. + + The return value is a representation to the final resolution result. It + is a tuple subclass with three public members: + + * `mapping`: A dict of resolved candidates. Each key is an identifier + of a requirement (as returned by the provider's `identify` method), + and the value is the resolved candidate. + * `graph`: A `DirectedGraph` instance representing the dependency tree. + The vertices are keys of `mapping`, and each edge represents *why* + a particular package is included. A special vertex `None` is + included to represent parents of user-supplied requirements. + * `criteria`: A dict of "criteria" that hold detailed information on + how edges in the graph are derived. Each key is an identifier of a + requirement, and the value is a `Criterion` instance. + + The following exceptions may be raised if a resolution cannot be found: + + * `ResolutionImpossible`: A resolution cannot be found for the given + combination of requirements. The `causes` attribute of the + exception is a list of (requirement, parent), giving the + requirements that could not be satisfied. + * `ResolutionTooDeep`: The dependency tree is too deeply nested and + the resolver gave up. This is usually caused by a circular + dependency, but you can try to resolve this by increasing the + `max_rounds` argument. + """ + resolution = Resolution(self.provider, self.reporter) + state = resolution.resolve(requirements, max_rounds=max_rounds) + return _build_result(state) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py new file mode 100644 index 0000000..359a34f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py @@ -0,0 +1,170 @@ +import itertools + +from .compat import collections_abc + + +class DirectedGraph(object): + """A graph structure with directed edges.""" + + def __init__(self): + self._vertices = set() + self._forwards = {} # -> Set[] + self._backwards = {} # -> Set[] + + def __iter__(self): + return iter(self._vertices) + + def __len__(self): + return len(self._vertices) + + def __contains__(self, key): + return key in self._vertices + + def copy(self): + """Return a shallow copy of this graph.""" + other = DirectedGraph() + other._vertices = set(self._vertices) + other._forwards = {k: set(v) for k, v in self._forwards.items()} + other._backwards = {k: set(v) for k, v in self._backwards.items()} + return other + + def add(self, key): + """Add a new vertex to the graph.""" + if key in self._vertices: + raise ValueError("vertex exists") + self._vertices.add(key) + self._forwards[key] = set() + self._backwards[key] = set() + + def remove(self, key): + """Remove a vertex from the graph, disconnecting all edges from/to it.""" + self._vertices.remove(key) + for f in self._forwards.pop(key): + self._backwards[f].remove(key) + for t in self._backwards.pop(key): + self._forwards[t].remove(key) + + def connected(self, f, t): + return f in self._backwards[t] and t in self._forwards[f] + + def connect(self, f, t): + """Connect two existing vertices. + + Nothing happens if the vertices are already connected. + """ + if t not in self._vertices: + raise KeyError(t) + self._forwards[f].add(t) + self._backwards[t].add(f) + + def iter_edges(self): + for f, children in self._forwards.items(): + for t in children: + yield f, t + + def iter_children(self, key): + return iter(self._forwards[key]) + + def iter_parents(self, key): + return iter(self._backwards[key]) + + +class IteratorMapping(collections_abc.Mapping): + def __init__(self, mapping, accessor, appends=None): + self._mapping = mapping + self._accessor = accessor + self._appends = appends or {} + + def __repr__(self): + return "IteratorMapping({!r}, {!r}, {!r})".format( + self._mapping, + self._accessor, + self._appends, + ) + + def __bool__(self): + return bool(self._mapping or self._appends) + + __nonzero__ = __bool__ # XXX: Python 2. + + def __contains__(self, key): + return key in self._mapping or key in self._appends + + def __getitem__(self, k): + try: + v = self._mapping[k] + except KeyError: + return iter(self._appends[k]) + return itertools.chain(self._accessor(v), self._appends.get(k, ())) + + def __iter__(self): + more = (k for k in self._appends if k not in self._mapping) + return itertools.chain(self._mapping, more) + + def __len__(self): + more = sum(1 for k in self._appends if k not in self._mapping) + return len(self._mapping) + more + + +class _FactoryIterableView(object): + """Wrap an iterator factory returned by `find_matches()`. + + Calling `iter()` on this class would invoke the underlying iterator + factory, making it a "collection with ordering" that can be iterated + through multiple times, but lacks random access methods presented in + built-in Python sequence types. + """ + + def __init__(self, factory): + self._factory = factory + self._iterable = None + + def __repr__(self): + return "{}({})".format(type(self).__name__, list(self)) + + def __bool__(self): + try: + next(iter(self)) + except StopIteration: + return False + return True + + __nonzero__ = __bool__ # XXX: Python 2. + + def __iter__(self): + iterable = ( + self._factory() if self._iterable is None else self._iterable + ) + self._iterable, current = itertools.tee(iterable) + return current + + +class _SequenceIterableView(object): + """Wrap an iterable returned by find_matches(). + + This is essentially just a proxy to the underlying sequence that provides + the same interface as `_FactoryIterableView`. + """ + + def __init__(self, sequence): + self._sequence = sequence + + def __repr__(self): + return "{}({})".format(type(self).__name__, self._sequence) + + def __bool__(self): + return bool(self._sequence) + + __nonzero__ = __bool__ # XXX: Python 2. + + def __iter__(self): + return iter(self._sequence) + + +def build_iter_view(matches): + """Build an iterable view from the value returned by `find_matches()`.""" + if callable(matches): + return _FactoryIterableView(matches) + if not isinstance(matches, collections_abc.Sequence): + matches = list(matches) + return _SequenceIterableView(matches) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py new file mode 100644 index 0000000..73f58d7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py @@ -0,0 +1,177 @@ +"""Rich text and beautiful formatting in the terminal.""" + +import os +from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union + +from ._extension import load_ipython_extension # noqa: F401 + +__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"] + +if TYPE_CHECKING: + from .console import Console + +# Global console used by alternative print +_console: Optional["Console"] = None + +try: + _IMPORT_CWD = os.path.abspath(os.getcwd()) +except FileNotFoundError: + # Can happen if the cwd has been deleted + _IMPORT_CWD = "" + + +def get_console() -> "Console": + """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console, + and hasn't been explicitly given one. + + Returns: + Console: A console instance. + """ + global _console + if _console is None: + from .console import Console + + _console = Console() + + return _console + + +def reconfigure(*args: Any, **kwargs: Any) -> None: + """Reconfigures the global console by replacing it with another. + + Args: + *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`. + **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`. + """ + from pip._vendor.rich.console import Console + + new_console = Console(*args, **kwargs) + _console = get_console() + _console.__dict__ = new_console.__dict__ + + +def print( + *objects: Any, + sep: str = " ", + end: str = "\n", + file: Optional[IO[str]] = None, + flush: bool = False, +) -> None: + r"""Print object(s) supplied via positional arguments. + This function has an identical signature to the built-in print. + For more advanced features, see the :class:`~rich.console.Console` class. + + Args: + sep (str, optional): Separator between printed objects. Defaults to " ". + end (str, optional): Character to write at end of output. Defaults to "\\n". + file (IO[str], optional): File to write to, or None for stdout. Defaults to None. + flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False. + + """ + from .console import Console + + write_console = get_console() if file is None else Console(file=file) + return write_console.print(*objects, sep=sep, end=end) + + +def print_json( + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = False, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, +) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (str): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (int, optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + + get_console().print_json( + json, + data=data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + + +def inspect( + obj: Any, + *, + console: Optional["Console"] = None, + title: Optional[str] = None, + help: bool = False, + methods: bool = False, + docs: bool = True, + private: bool = False, + dunder: bool = False, + sort: bool = True, + all: bool = False, + value: bool = True, +) -> None: + """Inspect any Python object. + + * inspect() to see summarized info. + * inspect(, methods=True) to see methods. + * inspect(, help=True) to see full (non-abbreviated) help. + * inspect(, private=True) to see private attributes (single underscore). + * inspect(, dunder=True) to see attributes beginning with double underscore. + * inspect(, all=True) to see all attributes. + + Args: + obj (Any): An object to inspect. + title (str, optional): Title to display over inspect result, or None use type. Defaults to None. + help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. + methods (bool, optional): Enable inspection of callables. Defaults to False. + docs (bool, optional): Also render doc strings. Defaults to True. + private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. + dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. + sort (bool, optional): Sort attributes alphabetically. Defaults to True. + all (bool, optional): Show all attributes. Defaults to False. + value (bool, optional): Pretty print value. Defaults to True. + """ + _console = console or get_console() + from pip._vendor.rich._inspect import Inspect + + # Special case for inspect(inspect) + is_inspect = obj is inspect + + _inspect = Inspect( + obj, + title=title, + help=is_inspect or help, + methods=is_inspect or methods, + docs=is_inspect or docs, + private=private, + dunder=dunder, + sort=sort, + all=all, + value=value, + ) + _console.print(_inspect) + + +if __name__ == "__main__": # pragma: no cover + print("Hello, **World**") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py new file mode 100644 index 0000000..270629f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py @@ -0,0 +1,274 @@ +import colorsys +import io +from time import process_time + +from pip._vendor.rich import box +from pip._vendor.rich.color import Color +from pip._vendor.rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult +from pip._vendor.rich.markdown import Markdown +from pip._vendor.rich.measure import Measurement +from pip._vendor.rich.pretty import Pretty +from pip._vendor.rich.segment import Segment +from pip._vendor.rich.style import Style +from pip._vendor.rich.syntax import Syntax +from pip._vendor.rich.table import Table +from pip._vendor.rich.text import Text + + +class ColorBox: + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + for y in range(0, 5): + for x in range(options.max_width): + h = x / options.max_width + l = 0.1 + ((y / 5) * 0.7) + r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) + r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0) + bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) + color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) + yield Segment("▄", Style(color=color, bgcolor=bgcolor)) + yield Segment.line() + + def __rich_measure__( + self, console: "Console", options: ConsoleOptions + ) -> Measurement: + return Measurement(1, options.max_width) + + +def make_test_card() -> Table: + """Get a renderable that demonstrates a number of features.""" + table = Table.grid(padding=1, pad_edge=True) + table.title = "Rich features" + table.add_column("Feature", no_wrap=True, justify="center", style="bold red") + table.add_column("Demonstration") + + color_table = Table( + box=None, + expand=False, + show_header=False, + show_edge=False, + pad_edge=False, + ) + color_table.add_row( + ( + "✓ [bold green]4-bit color[/]\n" + "✓ [bold blue]8-bit color[/]\n" + "✓ [bold magenta]Truecolor (16.7 million)[/]\n" + "✓ [bold yellow]Dumb terminals[/]\n" + "✓ [bold cyan]Automatic color conversion" + ), + ColorBox(), + ) + + table.add_row("Colors", color_table) + + table.add_row( + "Styles", + "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].", + ) + + lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus." + lorem_table = Table.grid(padding=1, collapse_padding=True) + lorem_table.pad_edge = False + lorem_table.add_row( + Text(lorem, justify="left", style="green"), + Text(lorem, justify="center", style="yellow"), + Text(lorem, justify="right", style="blue"), + Text(lorem, justify="full", style="red"), + ) + table.add_row( + "Text", + Group( + Text.from_markup( + """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n""" + ), + lorem_table, + ), + ) + + def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table: + table = Table(show_header=False, pad_edge=False, box=None, expand=True) + table.add_column("1", ratio=1) + table.add_column("2", ratio=1) + table.add_row(renderable1, renderable2) + return table + + table.add_row( + "Asian\nlanguage\nsupport", + ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다", + ) + + markup_example = ( + "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " + ":+1: :apple: :ant: :bear: :baguette_bread: :bus: " + ) + table.add_row("Markup", markup_example) + + example_table = Table( + show_edge=False, + show_header=True, + expand=False, + row_styles=["none", "dim"], + box=box.SIMPLE, + ) + example_table.add_column("[green]Date", style="green", no_wrap=True) + example_table.add_column("[blue]Title", style="blue") + example_table.add_column( + "[cyan]Production Budget", + style="cyan", + justify="right", + no_wrap=True, + ) + example_table.add_column( + "[magenta]Box Office", + style="magenta", + justify="right", + no_wrap=True, + ) + example_table.add_row( + "Dec 20, 2019", + "Star Wars: The Rise of Skywalker", + "$275,000,000", + "$375,126,118", + ) + example_table.add_row( + "May 25, 2018", + "[b]Solo[/]: A Star Wars Story", + "$275,000,000", + "$393,151,347", + ) + example_table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", + ) + example_table.add_row( + "May 19, 1999", + "Star Wars Ep. [b]I[/b]: [i]The phantom Menace", + "$115,000,000", + "$1,027,044,677", + ) + + table.add_row("Tables", example_table) + + code = '''\ +def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + for value in iter_values: + yield False, previous_value + previous_value = value + yield True, previous_value''' + + pretty_data = { + "foo": [ + 3.1427, + ( + "Paul Atreides", + "Vladimir Harkonnen", + "Thufir Hawat", + ), + ], + "atomic": (False, True, None), + } + table.add_row( + "Syntax\nhighlighting\n&\npretty\nprinting", + comparison( + Syntax(code, "python3", line_numbers=True, indent_guides=True), + Pretty(pretty_data, indent_guides=True), + ), + ) + + markdown_example = """\ +# Markdown + +Supports much of the *markdown* __syntax__! + +- Headers +- Basic formatting: **bold**, *italic*, `code` +- Block quotes +- Lists, and more... + """ + table.add_row( + "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example)) + ) + + table.add_row( + "+more!", + """Progress bars, columns, styled logging handler, tracebacks, etc...""", + ) + return table + + +if __name__ == "__main__": # pragma: no cover + + console = Console( + file=io.StringIO(), + force_terminal=True, + ) + test_card = make_test_card() + + # Print once to warm cache + start = process_time() + console.print(test_card) + pre_cache_taken = round((process_time() - start) * 1000.0, 1) + + console.file = io.StringIO() + + start = process_time() + console.print(test_card) + taken = round((process_time() - start) * 1000.0, 1) + + c = Console(record=True) + c.print(test_card) + + print(f"rendered in {pre_cache_taken}ms (cold cache)") + print(f"rendered in {taken}ms (warm cache)") + + from pip._vendor.rich.panel import Panel + + console = Console() + + sponsor_message = Table.grid(padding=1) + sponsor_message.add_column(style="green", justify="right") + sponsor_message.add_column(no_wrap=True) + + sponsor_message.add_row( + "Textualize", + "[u blue link=https://github.com/textualize]https://github.com/textualize", + ) + sponsor_message.add_row( + "Twitter", + "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", + ) + + intro_message = Text.from_markup( + """\ +We hope you enjoy using Rich! + +Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/] + +- Will McGugan""" + ) + + message = Table.grid(padding=2) + message.add_column() + message.add_column(no_wrap=True) + message.add_row(intro_message, sponsor_message) + + console.print( + Panel.fit( + message, + box=box.ROUNDED, + padding=(1, 2), + title="[b red]Thanks for trying out Rich!", + border_style="bright_blue", + ), + justify="center", + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f48c75b5c3d8de7a7fdbee8e2f434fdd3bcfa847 GIT binary patch literal 7035 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..213ca6b8b12b29705251e2efa8131e78fbbf9bdd GIT binary patch literal 10324 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b70f57b84e42d02e1728bd106050d3f3432bbf71 GIT binary patch literal 7841 zcmYk>3v^9q76D=@hjlrD(gNp@Y5{#&a#xuBOr&pT`oS50uRQb3S`#EqiUh_21w3opW!_v6gR} zHEZhdPg3E;0)K?#)Z#DpC&X>)@8f2zQ{dz~?|Pne=6NDRdQ^KHCo!%&8P0}_q6M23Nr%w#T}vN?_qe6i-lJ?NxQh%MXS*_!5Y|#*Vu!^7m}d8 zfPDhyOZ0zIBP|@fh)@s-h*B^a@RWk1fFBjq z0z&v6y1STo^v&cPCK1qFfYKN!Q;m#5-$EtEA~8u4lnclcFcs)q%801~+%G_TFtS&T z97NwrB~Bwzs}i@+KcEsG{-7y@i@mr+^sQAQ4T-^$pbS8!f)RjG0%k1w2h|#WBxb3^ zZ1fMQLMX%t7>R)yQciY9&F}0SyAi!(YijI~g&Ffc6Sf z038G=H2h(f3ye`x=R(D)Bw~0V)y34>fAW#U5-4 zV5xxFh(1=0g!4mShh7+0Ye1ncZ^(<5!%gfFuKOYp5q3f zK|xqJLkli8(F4#&K@K2K!C^q1g7*Bfp$=RE{hZtX=#2#QRA2xX1WXK=U;;By6g0s92Z zztKM?YnWqz;R?VexxMKb-*YEHvyv+G~)MUV2l7YWuP#qyJ!#e zS&}d#0b>=628aH;f{dkpFjl^1&s6_v`Buq76f&g{kS1WboVi(OqKT#59 z0$`E=UE((>UFKq+4rTl%4LpH_`^c$bpa!T5<@{=;bzIzCXg#1_fy1vwI?lx=>Hs$s zIMED|Tx_BzAPV5_(g%>N5@~=n3f2MM1h^yX0SzkAD2Bny#qJUVSgBwYpjJU0pfkT4 z?MOKHl%XICP|e>Mn{Y-mEPqd675B7XLCO0J0WS8WrGV!Yybai(pbl_Zz=V9jeXrtwy?Uw64kSL61XTfc37DVJXRDFOO`Pb%#hxPu&{x3#K&*fnf<8yq zFe3p|6)XVcDyRhH3D8ys`WWhd>2?A>QSdpSTEOfV9F$02K=YEC|E_RIwKraPRfc^p|h`v~zqa29}Nze|!=L)_C91t*v z(3hw+ysbD9!^K{0fAoHph(#h!C6dw4l7#sI5D=hRjGU7ZavostaIsgL07w)tspx}h zjcG^}NrL=;KrLZq^iVb^m8R)wgBb{P$fpT ztC5}P=c`1gHk^2vi#>W5KsN;ufL;o`Z5iUY*pWeicm)aV7!tYIYe`1`tZZwB02T<) zF^rs)5jq92flmtx%Jf+|zz#0XA z0jyIH-H{=di#^9cK$3t-L0_h}eGQ3!NP;#2Div%6Y*VluutPyiCx%!q_9n-pFIT%H zB9SBsN&yTNFd678)W|9%UR8=)SJA($uJ(5%lCR!9he<`hTqOoG&>xbZ20+p;cSmRh_cU5T7N9`D z%tyaMExH?)n0R1a!Mdt$MD<}snRj>;1fr3iF z4h6dbUnn>XIHACCLL9o;5OQ~0hyQDpAymNAoPWi*-2Md`9qBn0He~3?k=c_TOMg6b z{6?pqZ?|(j;GJ1q>do^`2>Jp+?=WAfuQ)tCK>6fN_XP_}OZ;Acpk#)xG_5#DxkWzj z%z3`zIo=}5_4?99@BW@dAiZA^@1TT{R?ZrZVIZwgsDrif*+DPdV^T$Y~k zStd-tGHFsQ)20KSQWd?`$erb}?O9R+(y+HKvwjo$1E1-ZZdm zG)*kKn;tB$Gd)>0o9kKLU~Xi2lewAYEv6UCTg`1OZ#TVJ-eLOW@2Rip$NHV-E|&ex z0G0#IAeMv85SByDFqU_ldsyCUhO-=DMzXxmjAA+3+|Tj>Glu1Z<{_33o3Sh(G2>W{ zHxpP+G?Vi8G}%mHeX5zpa=Mwpa;BNZa<-Yna;}-ja=ux>a-mtoae8arS@-6c= z%XiGXEOX{PmhYQYEI%+Gvi!(=%<>bnn&qeFGnSv5FIawQzGC^c`G)1U=DYkoeQ$nX z{YUc?%b(2}mcN)^S^j3$vi#lr!SYY@7t6oRKP>+>>xOMQcvG_pZBuD8w7Jv<#iX{V zK#HSwQhQV=IjBe~MkV1$P$|t-zlVG&fdVOsQc@aqkhVZuN?W0=rESo*(spQjX$Q2U zv=iD{+6C<@?S^)j_CR||d!fChebBzrerW$_vMB*CYN-a*N_D84RF4{@ zM${CIwmWM*)PEi7DK(?(r5n(V(oN`Q=@!&Wx)t3f-Hv)occ4B}U(`>!6Wt~CM+2mR zXpl4*4UvYTVba~`9_d~*JR0o?)<&xTJ~T=ijqaBoKx3o_(L>V1Xsq-I8YhiM6Qqe~ zk~A4jk*1<)(sVRKnu%sfv(X%BE}AFJM+>BdXi+rU#jGt+|5CI}T8>sokD|w<$I(jZ z3G}4&6na{E20bf1hn|;SKrc!!p_ips(5upG=ymB0^rrL{dRux2y({I=d(mj$XKj`G zKR_Q!AEA$>Pta=VQ}mhiIr>8S5`86ojlPk-Mc+x^qaUOn(NEIPXpQs>`c?W3t(AU9 ze@K6#zofs>KhbFaWo;e(n~{&3DIYg8o1x9s*9OI;wx~dgqjpkzR46&9NGe7pQYmsJ z5BX981yT~Fq%`UvZGpCwwnAG=+n{apqutDG$J+Ml-vR9??Syugc0s#JyP@5sJ$n=xFH}bgXn7IzAfh39Ox{{*%zj z(kbXv=`?h@bOt(8It!gGorBJm&O_%*7oZEJi_pc=CFoM=GIY6g1-eqY3SBK-gUY09 zQAX;B%A?U5*0SpFges)Ys8Z^Jx=K~3TB<>{QXT3h)uRTf5j9EOQ4i@l)Kh9k*Go5` z8>O4j&C)HXmvk$-O}ZWRjz)V2Ykkz;7xk0wM0ZL3(Ew>68YB%yL!_Z-m~=O~N4ggc zmqwtG(tT)@G#cG6J%GkY52A;phtXK+5j0L3k0wN;oygiG^-o4qq^W3{G#$;5W};cr zY&1uji{?r5(E@29S|lw-OQfY}nY0|OkRC;kNsptI(i7-O=_&NI^bC478trqeJ+J;3 z(2LSb=w;~@^s4k4dR=-0y(ztg-j?1$?@BrJp7cIiC4GQCls-ZqOP`?C(x>P%>2vgj z^ds(sAf`=>&A5bP_sQIt867orX@A&Om2MXQ8vD zbI`fcdFcFTv=^{;q53aE7fY9*OQp-u<sUs?v49ZHKP=(YP zRZ3k@SE&kBOEsugszcqRdejh&wvn|a^>;@-r0Y;msTo}_-GFYCZbCOpx1e6qt>`xC zcGO$C1ND*mqJGky=q{;08XyfsgQUS|h%^)plkP_MM5Dczwc+X?fksOAp;6Lkbiecf z8Y4Z39+DnLW2HyXIB7hZAWcM*q{(QCG!;#grlT3sOf*ZHjpj&m(L8BBS`dwPA#01& zzZfl%mZD|SaJ1G+tNGe-DtEq*4|V9`)HN)0s2t-2z@Mlf>ukPqR*ty(HGK}=qu@K^o{f_`cC>D z{UH5_ev*DhYouS$uhMU5t@JzkL;4f_6^-_9*8Wldzi1t5Lq4`qKDHqr+bAE~kdK;y zV%e5fpzFm^JE=V?lpItf6{8ZV6uFXzd?|qfDTz{28g-DiKwC;%p{?_yZDY1!ZCmwk zhqjk?Ks!o1p`E2&(5}*MXm@E3w5PNe+FRNO?JMnv_LmMo2TBK_gQY{zq0(XKaOnti zq;wQIS~>ULhT`paLu9U7qS4-ERGU-~BiALLzwQ}_vl$AQ63aK-yl)9j~O_ye%nbIsYTbhIBO7qZsX#rX&EkcW>C1|O%3@w*dphu<0 z(Bsld^n~;zdMX<2)2uzC{%6s1((~vA=|%LC^fG!ydKJAUy^h|H-b8OnZ=-jlcTrAy z54|s~LLW#UqK~AH(I?Vs^r`e2`ds<~eHo4RE7rbN|2ODc={xkj^aJ`)`U(9ktwFy? zzoOrywdi;05A>(>7y4WJ2mLFp8yqv6pqR03Gih_wMv9@fQUQuf?NIytXk(_3HAnqL zs8}jNrIL$0$wvt(KuIZu(ozSsg|sEwO4=H2BW;VeleR}YNIRmPq@B?&(ynMXX?L`T zv?tmt8tvZU8q0lXHYsCfKblR-m^pxElQL!wqS>U3nL}tcDP!g^noY`>If7=BGG>mV z*`$n_V`wBL%j0M^C1d6UnoY@=If-UdGGIge(OGG;EI*`$n_i)c0}W9AZ?P0EP!XXf`Qh<{Fw!%9y#9 zMpCluNV6#!GlphUGG;o_Y)ZyVXPQmPnCU{ZDH$_WG@Ft!Q$r&q^P{a}%_e2c)YEKI z#!Ms4CS}ZYr`e>8nd@jaDPyLYcD-~1x>33b-7MXLdP%pU+oao3Z|M%yN9v3ENq3^V zr2c4tG!PAv2BRU-Xos>kO#OGGd!&2OaA^b@Dcy%gNu$yI(gSFW^dNdjdKitB9zo-z z@o0iH5lxaNqbbr2TnE8xmlQL$$ppld;zoOZcjG1p}HYH=`JDN?&nE8QbQ!-|LqS=&; znKd+lujf}~U_BYnns{eQNhx8})1EIshFg9fS^+4nc=XhoQrx z(H_Ctk?KDR9W5P$j+Kr>$4e)m6Qz^T$Zs%19kixnxjQ>Vzt!&ZtuAg1Smos9LH) zwNf4GCe@<`sS!0v-BAzeI@D8YM%PO>pc|vn-o)C?>c0i`l5Rz}Nw=fk(jBOe)ED)W z?nHM<{m}qvAQ~hMMnj~bXqa?2x<|Sf4VOlskwTIOIFd8d8 zg2qYX(FAECnj}p|Q>3YAnlv5FkY=J;(rh$Gnv3R1^U(rnAzCCYMoXlnXqmJet&ko? zk42+>oVAtee*!%zJ%yf@oS1U!!lNZ_#(s_vi=dNA#2QGg>44 zf_{~LLu;kq(I3*E=r8GS^pEr}T89eA#sXzy0ohofY%Cxf3v4zjZwtuB0&Q;>kdFn* z#{$zH73$wRs7NYCB~mGJB@g*h0tHeMrKB|KAZ>xRl(s@!OWUArrR~u6(hg`xX(zO^ zvXm4pBw6C-u+Fv>V9Vi`y4weoUgU*%CL+48upbMpo(8bav=u+u2 zbh&f|x>C9dT`gUM%A{*iM(T*lC4;h3CsZMIMwL<*)HNDy6>HV%uR*m^9qK04qXwxF zHA&r359vD8Q)))nOE;h!rJK;r(k-Z$bSt_|x*heF?m&H{zNnvcC%Q}Oj|N1e9mv`s z^$$ivq@ie-bT_(3x)%+XMxc?>eQ1<48r?5FfW}A0%;*yBrQfuq@`$?v>dIF9z~BykE4~+6X;3l zDfG1T40=|24m~fufL@edLN80NpjV^OzQ)??>VE^hDZPc>mfk_{N;&kN^gdc8eSkic zK0+T$pF~=XY!z8R6El zDl(s7Ygn_DWC4|Afws2`%vxl(w+qZ4G`qcBVE&^0E&YS+_I80;H#n~C?Ks=pacytM z&E}{Lm&Q$uX1BNFrhsO*xA|@yjqPogg*3aZ9XCZZyR98JB{aLO9XBq`ZfnPlPfO%S z8#e)Kc6&Q+QZ&209XB0lc6&Q+wxm%Dv)r0yx3}YFTbkY8j+^aic6&Q+cBJhj?Tqa9 zcHHbrv)kKovpdahZ^zA^G`6={?oHcA+86C7?T-$S4nzk@2ctux(H_d$Vd_5|9U&cw zj*^Z>$4JMb0)$= zbSb(l8tvt*U7`Lf(N)sb=o+aET`Of!N2wecDT_Ku6;WSjWRo(^_I6xVWSs5oxKc9C z_I6w;88>yvrevIL?YL4h&bD@3DH&&5JFb+Bv#lMsDXG_OobBznk}_^?KsG7k<|dj= z%DB0OW|J~*Zl&3zjGNnOHYwxg4w_BMxamu?Nf|eH(ri-3O@A6m$#NjgrexdRAMI$?Y*NO}12mhIaq}R}CS}|_OtVQD zH;>S4QpU}AnoY{MnMkuq88?$@HYwv~D$OQk+)SsDlq_e`Y)Zz>Y?@8UxS30{DH%8O zX*MO}W+Ba{WZW#K*_4c%r8H79KicK2*`$n{M`<=GP(q zXf`S1<~f>8%D8!fW|J~*UZUBgjGI?zBqht&Xf`F|<_(%n$+&roW>Ye5-l5r)jGG+I zrexf_PqQf*Hy_YQ$^2+PV$CLH+3j5p^dtI7 z`WdZ}enG!VzoE6#@8}QdPxP1cH~L5V7p+6>s3P0hDpI3uMpV#BHK|#wo?_^&N!$@w^WQuq*CNc9`dCG3Zx`TNomwU+5&AUZH2a$wn5uU z+oA2H9ng-^Xm?_5XZ7!bc9nKRyGwhZJ*B{K4N@a&lDeZF(sih()Qql|Za_CmH=&!QTTn0QR&<+mJL)anf%-^&QNL)k zcd~Yu`un2+(m*sw8jOZWL(wqlZgh`yFB&e5KqIC5&?sp%x?g$#jgcNi4@nQBvC<=G zoHQOykS3x@(quFx8tqiprm25Anjy_Zv!vN*jx-m|ljfrZ(n7RIT8x%ROVKiEIa(n- ziXM|5M=PZ#(38?r=xOO0^sMw8dR}?~y%>%5CDvY6|10QK={5Aa^agrUdJDZRy@TGB za_BwjeY8sY0DUNZgg%x&L93-t(Pz@<=nLsf^p*5A`bPQ|eJ6d7euzf`zoS2-Kha;(-{>FdU$hRjCm-8uE4w|}*k0M#o@{KdY-~?9wpTW`CmY)< z8{3nO`h5jUhgPIpDMlqyDRT3pZErl*eDx<#ASF>sN}~?a7HCUpE3~z=4cb=P4s9>( zfOeF2LOV;lpk1Zi(C*S6XisS`w70Ym+E>~S?JpgG4va>75Nijk{}6PjbQn5ZIszRj z9fgjTjzPyt$D!k;6VQp$N$6zh6m+U|8aiD%1Dz?Ih0d1FLFY>6q4T8+(1p@P=;CO! zm#}uJ`Y%J5OIM&PrK`}@(lw||x)x=mj;LHRC@XbB6;fwZDRn_zr7Bb{)u39b4t102 zQG?WonxyWiM>N{&SnH|&W^}!D1G-VV3EeE+f_h1}qT8g~QE%xE)JN)z`bl@9yQKbT zfHV*dk_Mw8(oi%^x*Odi-HV1xBhbibwD++#O8ukJ{n7(yjPxLSNO~BJl^#Lkr15Bi zG!adbCZj3RR5VSRj%G+R(JW~;nj_6c^Q8G`fwT}Uk`|*S(P)>lwoLuY(F*BN^qBNG zS}8q&o|K+KPfO3BXQk)R^U@3GMd>B-?l-@#bOYfj}r5t)sdLONd zM*9J4AFBT&^s)2_S}lEwK9fF2Ur1k~ucWWhH`2H0JL!A$gY+Z%N%|SBk$yqHO247C z((mXG=}+{R^f&rP`WLOskG7C}EL1)gl8=ST$3pV4Q2AI$J{Bq;3(3bqQRH#h?=DCsE2eN>M1p&>!lmejnYl%X6Y8xOS%=^Cf$yDOLw3?(P;a!)=&L+ zqPwL2Xn-^j4Uz_NMf0TjXo0j4Es_?aCDKx~Oj?dsNROh& zq{q=p=?V0t^b~qpdImi!J%^r;M*9M5FRK3~^s;1sP2)1YO$U+E%dAT?TtSx85-kPfquj%FbpW+5GYI?O;int^nffpjzj=`aK7Xa>?TJ0m*-=`aK7 zXa>?@2GY?Cq{9rPqZvqt8AwMnkdE0GF$0+&?f$IUSxCnmNVBt$jyagdEF{ZAX?6zE zF^ALa45VX@q}drr#~e+wGmwrsmS$%l9dkU*&OkcmM4Fv}bj-;#I|J#MQ)zYv(lMvg z>7!?LyXUQaa2+I!a21Sx84o>6qonCZ)p+q@$#Cn1OVZlnyhHj*`-02GUVd zI?O;iN=k&x`bqj3 zt&x5~ze>NMwbJkC59v?zS2WtcS^G!*|DtuMh$^y3Rb&xWWRa@KBC5zDRgpzhkwvN^ zi>M-tR7Dn1MHZ=wETW1mQWaT56$n=xFH}bZj)*<5)Xh{U@LkrIXOf z(kbXv=`?h@bOt(8It!gGorBJm&O_%*7oZEJi_pc=CFoM=GIY6g1-eqY3SBK-gUY09 zQ6?H~N7l;KZ%|h1ges)Ys8X_3AHWx-+eI$L1K9N?V@YVJi z`docqpf97*e#P3?>i-6PD}9H)mwrG$N zP${=wOchzIDzca=vRGAQF;!%-s>ouh$YNEI#Z-~Ssv?W2B8yc;7E?tQtBNe9iY!(Y zSxgmKtSYjYDzaErWHD7_v8u>os>othk;PPz#i}BUsUnM`?~NBzNfxV;ET)ny*1qgw zvp+gOqdgEEBpr+nkq$+NNr$5&q$AN$($VM`=~#4}bUZpiIuV^Dos3SAPDQ6lr=v5Z zGtpVn+31}7E1{T5vRIX5F_mPo_GK5F3(-Zo?#1X5=~8r=bUC_0x)NO_U5&1h%Fwk^ z26dFmk&&{flT?8^OO>dL)D=}p)u=|QMRn0=yRlZU{sz=2HKFcO4|JW>6E#cMqZ_0f z(M{6L=oYCLx>dRj-7fV;cSwCuU#TCuQ@RWFmjmf*($Qc>_)RyWQo~>W~;~&vlq=)ktO`5COooF2`O2klq?}7OO%o& zY-^V&B}>@WE>TLBu&rI9lq_LeyTqnsezZrjc9d@OXmpHpEILj)9-Sbah)$ADMyE)p zqSK_)(HYX2=q%}MbdGc`I!`(uT_9bEE|M-rmq?eQ%cRTE71EXHs%W%Vvv!U8%h0t_ z26dFmk&&{flT?8^OO>dL)D=}p)u=|QMRig)R4+B4MyUyPmwKS{d(Rb4K=m+UX^po^6S|j~}ewBVhYo*`OAJU)bFX?aekMu8Ehe}Dw zQl(@mDOswNEF~pNZA$8OTS`)vDk)1z%2Fj|DM?wXq%0*VOO=$RBxR|RvXrFM5d>L! zG++0VK!KD*DJhLQNL!#SrLEA`(l%&YX*;yNv;*2v+6nC}?SgiVM!OqpyQ_Z>w5PNe z+FRNO?JMnv_LmMo2TBK_gQY{zq0(XKaOntiq;wQIS~>o}mMSSrnVBqAQkGIrmMSSrsV7U7l%>>@rAo?DW+h9Nl%>o{ zmMSSrnUyS6QkF6+S*m)n)Le~hN|u^3noY@4lcCv^EH&jco06p_OS36iYAR?pB}+{u zjg-ufwkvBkDN9W?%_e23sioPZEH&L|HYrO@1I;F7scE9wq%1W(Xf`QJO;4Il%2IPZ z%_e23xsi60bThg|>Vlop}I(h{^(T85TOE6}6TW9V^dC3-@75O7MbAmk zqZgzX(M!_H=#^-+ud?=<`d>$HNN=LIq_@#K(z_@py@%eHR-q51579@`$LJGjHTqQg z41F$rfxeW!LSIYYpl_w`(D%|0=tt=%^m8=YHLU%j{$J5=(pvPp^auJ=`V0Ln{e%9M z)(v*Gz3sBS?P`15WqaGz_O{FRwyW)Jm+fs=+uJVN+phN7xNK{?+SYd2)^@e6?Xs=y zYFpc7TieyPw#&A*8+~uwWqaGz_O{FRwyW)Jm+fs=+uJVN+pe~^UADJfZEw45Z@b#w zcG=!`wY}}Kz3pmy+hu#()%Lc__O`3-ZI|tBSKHez+uN@8+PG|MyV}-vsUlrfkuFuF zt18l^igZ;)x>S*F^u2MHO43y&=~79$+TM2AYvZblblGd;s)}^kYvZblblGd;s)}^k zYvZblblGd;Dj!|)(Nz`cve(8{Ho9b^t88@1MpxPBl8vsi(N#9u*Qm>Hv|Y_gy8K4l z)vTn;Z?s)IE2#u?`JJ|_nMs%5X}g-4borgOtC>lcy*939CSCU0xY}#uve(Adtfb3c z8&|WEE_-cU%}ToLwQ)5o>9W_x)m|Hyy*94)+PLhsakbaRWv`8^y*4g;ZCvf!c1EY6mC(05%l+McX6tN(g*gLEUhNxB)?q;yR$noUaA+(xrW>6+d&o0P8UL$gWg zntn8!l&-mpMpCjIKpQ9xLN+B`GlXVS(lx_qHYHti56z~eYlhQCNF&jG(P&4pHd_7n zqX(oh$R?$09-`T#bj?_rO-k2{quHc%%>w7Dx-xB55&N5{-5#Ys=KX9IcQZMbwlmAE()R(q;dRt9sI9|Bb79 z(q;dRt9sI9|Bb79(q;dRt9sI9|Bb79(q;e6`o33@%}bYGY`e-!*Sv{rUb^h%c9oYd zd%0cZrORG!*XCvZb-Ri+o0%?qx?N?a%bspmnd!2p+f`<|?CExunJ#;}U1g@ro^Dr} z>9VIgJc^5JzNODrmah4pW-CkA{7AEvrE7ks*~-#2ztDb_enV@e-;u2>UGpc+R+g^$ zn?_}sAML-a+3M1xy7W|CdQ_L5s!NaR($hA$M`h`$vh=7dJyn(-m8GZ3(xbBUR9Sjd zmYyn0kIK^1Hn>M+spC_#Owa<|TN0(DG_sYY$M(0U%F<)|+f!xfvHk7Y%2K2C*puU_ zy7btSzm8HjVEj(409>=xtR9Si)*TPd}>2X{O&sLWC(VoDXtu8%| zZQ*H8j>oYrJnhNxIJSkSJvko7w(ztk$K%)*p3=qRxE7xFIf`cU(lhtdY+ib149(`HM_zi$OOL$tl$RcP>Dj!@k9GoU zHZwgk(^F=8WTvOg^vFz4ndzAs$Y!QTW_rp@kIeK`S$Z7T!c%4Gaa;>em8HjVEj(40 z9>=xtR9Si)*TPd}>2X{OPnD&|aVQhFq%r=;{qN>54Yk(8d2(jzH7RhAy# z2lAAX9x3T5B|TEoQ%ZWIq^FehNJ&pA>5-D2Qqm(OJ)4sG(SF04tu8&j59F!3^!PrI zr|Qz<`#_#%D?Pps|m8DN*>8rBzsVsd}mOhoGZ!1fU)~CAkRbBd2m%ge?pX$8_Dofv1mif`{%i4ZCwm#LRuj8_DobCL zrB7w)tFrW|EPYj$K9!}f%F?H@^lfFCAMN?9U7*okh%S;YMwdvJqRXVq(G}8_=ql-I zbd6Mou9Y&Vqg0NJltrDS3e;JuL|vq=s7k6vHBv3Ale!_YF+bV{)@(ldY(cZ(Fttox-(N{kD>IAw7wnlAcE7BgMxSi-Z8qi~+jm*Z={Da(RFW)L(QFmz zlaIdg(I+2$<)cqN`pQS2eDsx%KKbY?AAR!CR~6|~Mf%D{pKSD%jXv4vD;s^X(N{M5 zWTS6>(Y^hOev{Us-=#m$pV4UlV(oAB|AYRO)(uW59~0zbLiv~=9}~*Q1o@ayJ|@V= zgz_;#J|>ip3Gy+aE$;-`m{2w*$i{@SF+nyal#L0pF`;baEGH<*{U*r9gt9R~HYSvf z39>O^vr&(2f_zLU9~0zbLiv~=9}~*Q1o@ayJ|@V=gz_;#J|>ip3Gy+ad`ys!3FTvg zd`xJ|JHeKBLfM!g8xzXL1lgD{2WeynqeG-a(P7fz=m_aZbd+>7Iwl(Jv8)}Z{^QXJ z(uwFK>11?@bSgScIvt%Mor%tp&PL}*=OXfv<@q$5jR|HY6UxQ}vyusAV}e=9gt9Tg ztYkvjm|#{ip=?YrE16I>CYY5>*lf%{wi(uJJ|>u%Oeh}{%uFVfj|pZb6UxT~Gm{DB zW5RSrHXjqrN+y(#31%e|%Ett=k_pw031%e|rcu{xLfxev=sKw1?H%K?4o1~l3 zEmALZYc$&1SfhSq*_(EU)CcvI`k_0eyHI~=02(L_LW89tXs9#{-7VdN?v;k45z zpEL@MmhMLnNMq20(nIKBX)Jmq8tpjN#;bn|lcgzWsx%Evmu8@u(kwJvnuF#_ z^U!>00a_?6LW`v(XsNUeEtgiHN2SNm?e$svQ&5jtOOBg4!{mY)p`i31wq~ zY)mK{6J%pT*_a?36UxQ}*_co^CdkHw&Bpv_zhdocjrJS#t@IuGUitz3DE)+fme!zO zq+ii*(pvPp^auJ=`V0Ln{e%9M)(sAnjRDyhC>sN^F;F%JWMiOg49Lbn*%*+GLG&%4 zfP4&;j{*4@C?5mzF;G4RsN^F^Ike6p)XB@-ZME1Lb2tJ_gFi zfP4&;j{&t~pnMFd9RuZKKsN6$3WQ_P&)?7#(>%}P&NkCj)Bd_ z{Ah=%}P&NkCj)Afp=M!kdJ|C$AE3?K-n0Oje)W; zAR7Z^V?Z_r%Eo|f43v!l*%&Ar1F|ttHU?y4V6!nl+P7JIN27fg<)rt}`_d}(f%GBz zNcxyFA=sJIfTLOHOc7``dQpA$Yz?nVpP@G;d)|h3r7zGb=}V69xPxT(?vzMhBfH-? zpxO-2{tz%{sk1-iM{D=`*!{PG`Cc=J0X3-3|3HsD&x75A9#D;LrkTuubApA}Uc=GJ z?fhB5+-7)e&wy?B@Q99qvHQ=D(xq#;Mzds(c+QL#>-L*R_LC}L<}*A>f54V~c%=P+ zIneO<`T^VcI;wttr1p5|gY>V~p}(tD7fJF7lGG&aZ z-m@e#yWugilY9b&$HPuC#~U66JIUuzcogg;v%TR_tdo2qg~usP>UhR>);q~(Q+OoO zBs0J|5@~+42eM|rk&Bt=kHwedh{xd(_>z2jg}Ws{RTGLJ%zqC(y2TGuSuuz4BK~GlF!EQ`zlFhpTpznB>9vK zkKUbR9y&aFcT#)tp47jv$E3FvQj$;2@Ce#T=BC5rk0<&343CVR)X|sQ=z15@mzFN# zUtOF}ucVH}Y`>k6_meVcjAW1AJXR{_Q9e+z$8jDfWqGc`_hlz;+0J?=bwp=A3-YgoO0H{b+WIod z{>AXS7fC+P!{Zkw`E6Ku{K6!k>^goS*R#ik{zLzwC$jrfcT`^=#J734#2y*YCUufpA^g64lHZ+$N5f50HMGq??)FHk`$muK0RD#O^sffe zf4DRVoh;cStcI@=`^$@0)Hf8_&$uMBQ{fSEll)pOJP%QlIwL&ZZIbWNh5ONyn$3Se z|H2-L^>k?@I#;sihuT~kMPK-Ou}5cpNPYLCNzrKSv0CjXXp-tAJo0IhU%G`yK21`m zguk~+>NjuUJ8-P_i6uF+XNmsZIPDKha*oe1t0!n*Sdz1S+C5=OGfDfwl4f!~XQyZ% zSdz1UZm-LyX+Kwz^MLZG=b!Hx+Rv5bte|`9IM`J#NNZzuUsaN`k6x`t0zwI3?UxkZcZS^MUboVAqKYJM!Q=9A+!{gyImUe9O68~R>n(!8nfawa*i zY51ysTi@eMa)#3|Ki<`MIFp>~bb!YAUjFm>eSLc~X;$T{gAer0&7}EI-`h-bCe$!Z zKDM9i`LTSGuK`x)Utyo-Utgc)bLsPZ7JZ@bX(l;q>J;7QSNdjVlJlp|(E2y}E@qN5 zsm{~-clmev_u6ZoG(YG&m`Tp88oo|{(jM|8_0-B}ENirfJjoeXpVn>sn*VJ3P5Z`^ zW^KL#_+9(OljaY7%QDINSZ!69G=J%Pl}XOb`mWah(RV77oTGJ>*4OF#lqt?*{4wh( z6P_zE#Tku1)4I-eqsJx1`HjC)AIB%x|HC8irVK}w)OvWlw3G>t29)CL$G@td-*M~z z;ja`^rbyqEOmRl!b?PsnM%Yv;MfUxjqAm*06Puzg3eOXpVv9LEPi%_1Nau;ok1JrU zNdGE{?0YxGmUK#=Whu6#!!xR;sEEQds;1bc4$r8XqBaW8sG6cS3eTvTVjp&RM%5Hm zQg}wy6jf4qM%5HmQg}wy6#KNpGpeSjkis*nrl^p@bEu}Mkiv7Qrc@#E&dHC~R!Q~~ zF{LW0OtMu{M%n|FOM9ZMv=_4PtQ1vJc=ptkzL(xref!c^E$xSDrTtMi=>XIq9f+Ew zgAngLZtq~!Q#u4)FCB{boX(H-FxGBX|KX^YbOgFhIuhCUV~Q#%JbP-2Dk(gBYKkf; zJbP-2Dk(gBYKkf;Jo{;iS%L6OrzxtW@Jy#Es-*Btrzt9=@Jy#EDx~mCrz!Tuhi5uX zF=r5-=`_V&d7bGrKibn-o2Bubf#yhOBK!VJQ6+_EJ55m~>1?O;or9L>(sR+v(s{_f zds0+M;kidsR7v5vM^nr<=-i`RdJ(ekq7*X^;dw_>)JoxbM^n^F>)%V4p)Yj3%MtIP z{AjOWEqo_kiN4b{u0r9v>1y;feyDEdi_fbba9mDrgISStg1_k=J zS(K7Gp$<|7+EVI_ww5ZY16!lbihR+ng*$>a~nPSEz zJi}*-U+;(K^-MAMqVsz4FZ!bJUE2?Z@7g<2_+GsWh40n=s5Tny0M@$c9tUz8gQUUq zHAzEI_@s?HJZZs^6ZGbBy#5dPsU0jg`itand7bf@J4{?v(8D@t>C_pw}gP zr2IFfN$4}l9v9k`rXXLkM~Dtz%hOQ!TDHfE4qw4D5U=3;yUZRnI(*&ELgDMt9zQyK z*6nZ0HqmX`BS~K=%|qeyWsfP%v&3V&0EN$xJ=0x-`WDd_J_q(V)8TVqf1hjT5>gz+ zAUt|@iaDt8SAHpuXAmCkI>l^Mc(m&jM>fz=t@EROjI}xX_x5)e?@23pEO;MsoA${4 zp`PS=OVnqNQ@u=jnrqmtmlQKs;cpsJe2XqTPIZbotnfJ1DZWn^o)s;{Y*u*YwG`j1 z)3K}hw=c6r629*2QCdU2%B8Dx%l4?&A4ZSu>sb?1b=G(JA%{ghz-@ z={T<8qx>$n*;d!HM|5p3y@wph9^2KER`H5?Tl#=U&u&em*n1Ejn>l6dv0nF4-^XYV z$sYA}FKIQ}PqN2?P6~beUw2DSL(VE4nHgtv$l* zHR@l>?bqS$GWJH2XhvlwQ4V z(|pS?JZn&zy&>Vz1k!xpFs6i0GfNhpA0f>wS$K?vG_zzn9xmf4MgN}#XxF9P(fl;lw7wS^)4#XJ0_QJ&OB3TK)D| z8T=KjAB(P&>=84DO7^#o^CWxh3_Hh|rt%BV6`H2<3(w<`rt%AaU7e=#3y;~Irt(W` zZ&8{Vv2gn#&5YQ3of+vY?jw9`?5`t>bRXw%D@R15wZE0zQvK(lttI=b$?$by&)yim zuI%q8kI|(Uq2nZb?DUn=C5-1%=`tQ=n+9oS#KK=0rkN27e*u_g?^F0&zBJ$Q49}&I zW<6axzIFKUU(j_wC2nnQC}1H?MU6Z-gK!4nkm^ivmsJX`W}^< zdCaP%>*;$!x&hfwyEOA<;je4b%$F7DvpLOtS$I~BH1lQQnKshwKMT*Vk!HqB%D--J zsi<>l6UifR6G*w>stCuwMXPatnz^%0^RJGF^v&e7d05-5X){)zk!j}5{)$F9j%(YhE6wqvHq~5Kn!SIU zYGx(Pk)$?N-I!)S;HLS1JsI)u`4>}orQIw|Md52<8n5+N)i<5Ln$L8uXMeG9iZm02 z??QXjfT`-6jTTDwR}7Vs{S`x~dAz&YMWeO9X|R<}nmRB1*yOtW7x{8dGo zV^poz5;Q{p!v5MJ)Urs+`L`eG(iPlh_!@qUOT)}~oWCj@?MnKd*Y%#@dQVFBw-B#M zPouY_XL!B!k4F0}{r{-n{^oYIWWV_vrrZl?bM@Kp02fLxA^uwK!+smsRyk>YK@ond zKCSNspRc~x=(|vQodmG;eA>K0UpQL(UE%B0_ZF&rbG@+d6Z-nuQ#4TejO*!H;amgtzn)3KQ~YWNW`P-_HxbosecvX!uQpGT&AkFug!~OVa z^E(QY@DCIw;h$)>ZtpKNSNa>xk4F0sYYWx?FIp_ELrYNy>b!8@cL#lw#l8wVQ0ImF zzB}kUEjCFzQ0ImFzB}mKEjCj-Q0ImFzB}l9E-$DrPTxyXJ7jaR12tZ_@4JJ(_wt7N z9Qy3*wu8O_^Nt-YJvrL@v=3+>aar-`HsdzEVw1rgdY0@~+F_GTawYpWG?vv>Wy-T< z)mf9NYHG8|CY$^?W?Y|K$pJOyzb@&UD><)6!TSX)!JTgR%}T2t28 zvo5=P{zmT@n2To`tIHZHD{AsxgC;Zwng8RT^q!e3%yg>goT;g7Xw1|!#WlJ<<9{5} zXG*RhQ`M0RGA(;&+1`q5{f6F2Tz5sTI8#k$d8VeUAyZx3>Yps+pVXMz`ubMAlX7h{ zH5Ij0tvcuO2h>zFRaUj`o}O!;scFpAmp5_`Ek`rI+2w-Dil$82E@d4v^&Oi`tIMZy zd)=Bc^_5KxO`G$leKK-ru3e_SBFjIjX?4v7xfoZ=uD@De##~>W-RO^>ZLieSvDH6Z znk&sTlxJ%iDtS^W8>;wITaIud_t(_WSf8od@QB$*cQJQh`&;)e;ty@k)_2TQc4_@& ztjM+Rm?`gCmZ`6=?U8?O?;hD4{9iAJ-aJ> zM;_l+gP39ed3|+@C(#aVHvhbHQ;S!p?OeoFYpW`|Z+QG{@7(4@$Jz#-HC_&#v-Qo{ zirVfio@jfO@%%ltjSW3A8=imLy);+Uv9_suwsE89&|bEL0n}%jE2~9kSJ=b4(x*b<8x&F%CE9)yN*S}Jt2X6^inriQ+sU};w z{$JYrp2KjPsw#MGMz1>CJvHZaY^v|d-&WQs(@@*;U+})=q9(@FvUhr}U3pbL2-e5N zkX&JTZSBUrLv!)+Om)Xv{-*UeFq33d(D%YwI_>!|g*gyV)dj{RL)s;0Z{#@HVJLj$Mt|{C2g=nuZH`gvpnb0cs@5>cr%bN(~`t@V7FUpCz zShk{PU1Q6>sky>z6(7h|-CJIJA=h5QZP>Ku!)hyip#tn$Il}c=a24?Pz!&vkkmdH#|7DcXBSyd$zK+u66gKTyeIk zzP8T3sheu}9BuhGEY1~n;*GFTbPdaucFI(BwSU0IudgZG(ac;?r%Ziq_P;Khn`_gl zvP<;r*sJro)2XtiO+qr;SuFuw#ceW2ji_Z}IP)uP^;bnET zRXuC64IBQlT3vHmu3beX@AfK+t@Q)4_rpU` z!IQAzp|G6`xH6rs9yi-h*+GBH&ji~$Dc7Dd&19=;o9d!R)Lt+z*MOkASC>O72;&E%pMt_Oz=7aNpUzc;5i^9&mJ61LjOfCN$BBG+H=SF|~@?5NQ zh7a`hSG2*is5#v^o1q%#bD-SR)?}*w=jCRvHai#ZT+3UjenX{YyXWM5x+}`M+C@XA zzKs0Y@Oay6%*+*ZZmJy75!1RkAkfWrD%%)oIx)Yb(c&XHyLgg4PTzyLhIRvY+0tfJX_b8>B#+t z+dTOz^&67ga>JGC>iF#D1A~vnR@dsgFqew1MFm?y!Q1*8{RZbsqHC0A8XEa@3x_di zMsC{;m+XBwNTbSDk#Z^Ld*tiE%2E*)LbR5p~?Hq|t)zeadleMz?sSE;S4YFPi7 zJ}|dUbb%s{N0+*St&@#z;l5lVx+1Z$@x{Gb+)j0EO=IV(o@H!<{qIN?w0Ll9YRkH3 zDALM%Zggk!ayvwKR#V$p_J59Ses25d%H(%VS*O~1Zm)q4iH7Kr%0CW^b6ZE(t;;lU zor*FZShMk;Gq=TGTSt+=i>?zd{q;}H*cN|8U43om%8r$d*^S;UeP_3LTIzW%)p!4& ztIWtHqv14U%j>E9^RJ)qnH|~UQMEU~5dQnwxiz=dh8yZh;an9y3R%kh8mipz&%b+S ziOZM$UaTV$JkgRt$?rMBK|c+=U=xw-aTGtHT8XT zK0b82R#G$b@?HPNwcSK|*V=~K?osWujLw;KHuWF{TV8W1_tvw%qG$8Q_ck@xrYf_c zXq?3j@F~Unq{UX5?WEYK%CdF2;RDU~PRMOum95QxaP_xWX{c@N91X`_g-z9}O120$ ze4N={Hr456HX+=iAE?z0f3v;H@?23>CFNct+vSbf4I7#EGPZ=ODjPdDwVc_o{cL+z zHC>nG32dsbSpWCi3l`@}s(Gt4{cnWN=29v&F3l3S8%AmSDRHaWEUI8~V8dsry?{?E z`?=O5dNyq5(p=nj_H0oy*zV=(HkI8s)CabENv;joZgm4hE?te$GjFf9C|645N?l%6 zwQ(V2FJ_aUi0BHIh*+Y6c~>RLWT_5wcf!wc+uO1@sP{Y++5XL{B)HbytI zoZdzJq1o%$d~12tW!!cpC4Q@qCtFy}<~C}pOl|j8e*&{aL|UfxZLk?bCv!)wAMrWd zH1U_M$yU_2y3fhs1-y%Gj<*;$uP?jVQ{MXK$J?tn+gfX*$7Mxx`|A3JeagzIO4g_N zBlDX(Z0IaAY$=pAur*Xh@w@)fcx3*MV+O5g-lE0zswyiwH~#k(mo#tJ;)+ZfGMlpZ z|NnNEH*f#HSN}h5erfZT|8xES9>}uhl4^=1UL#C4Hc>zB-tw`Vooio{?Xf;H!;rh< zo?JUpz18RN9rxx6YBJTtbo9i|;prZqi%|;IM`fAq*v_|? z%*qwn0hDK|TEF@1WfSec>QUC5v!)ZrMlOtiIMG zC-tbe*FU#??2RtY71z|(cdD&gzp>l$R;DnP+WN-Mlz}Zal57Oe%cXUR-4ftYwwn|G z^*)`KYs=MoWTJA)-X*cargiH_dU&pYK5BZC|IiuIKbOq+{P!z!NPqjv%%#>}>Azn$ zy4I5Bt=C`c|9Va8y33ol+333e#|K*MbuN$FY#z6|&XrB&o!3tZk7CxmuJt3?dj(yYuC1oT?H1h3T#T3JhHVMk zw=|cckBwb&w8ivai!C~Pt%bR^RJqi@>t7kRb9}C}E>p+cwSBF&-h#0gGnG&mzEGoQ z-gfgxF%1;GacmdmIe(L#AF_p4%e$Dy{Zf`j^V)1T*Ht!_XDWHgZ8SY*Z-^3vP1hE0 z8QVFFaqt3es@U+(wB3uiQ#QsLYwaXXl(+U0-pAcCEw&(uKmOK&diz{#crPuWcW$mN z6E!V9^lay1I+>o`Fr{cam+G&oUpcAO1cAMTbZ=l%vh^!twC&ue0=;8IuCO6fQQ64Q zHtY}>oQt*EW3iN*T*$xXxwP-en&>aH(o0HK;Xkhbf84>++*bel5B}$!r`ukZbJ%|Vf0Vshb6iJ` zFCKTi+gfaScYAI3bWit;dfa=@r(qPyB3Tw$#i>OU&yy_6mKSbSq$DnqWm_c6lI2z2 zWKwj*oo|tkz8~QF<-Y%a0CK^}ljlf(M>xdF1LT54B9TZWFx~)#Yf6d}Jus^{^R#Ch zPLEqQ52B#UER--T-Gou;D*h*9(@(&qy*h9e)d&v6KCPOeDW>_T&yP*jVSx1PP0*j9 zYYp1gN1#gj{q`Jv`pP^+M~oU+*UM@uhvgjQT}&=?pSnNG(x=<#{4^Ah6M;#o_)96) zmqAqgxjEV)W2(2u=6Z(vkq-D>sVIc=4H_rgk2OBKmHHDt?PkA~Pu73~lY{)mG>y+S zU~r1oD_K5%06%hlg}vo__oai|l-wv`Gw95!+aEH_{QzRM8zY#u6JA1*>icEyD2}!N(1UM*3Oy7=1W_)z-mKn)Qtv51?QA+6DM;{qojpS^xbh(*KY+vzrG+A0 zw0vUFH)w)v&)@?_ci!%p7jJ_)F~x8N)`2<<@txzO@3SX5C+Uim?L)Y*15eH8IqD10 zb&hV1lt?A&`~)tatHZMFMo5K_;+?rh7x#Y}oUGTMp;Pnf6hzPmy{Bku{^x27s^-l9 zT*GK*+yC=fbF2}}YXo;IyRUn^T|Z?9xO>4o)NRe?rR8OFf4A0v%yr!%BP5P}-P-Go z{4PizV9UnIAk(s(iZLb}KgjMb=dyPJ27{U&3xR!>J<@GJ>po6mtdxH&9wBFq}%^@nF>tcOGCfKjDr|1(c z0c^T-K@+WF0>X`0w+Bwj4RSAgviC=gC$QA^ymH?{IC+Jq#&k2?8nkPU2GO&>FAAzkIN2nl!=_dQSIbuO@?3u)MhGQZU zP(%N*Ddscxkt)Aw4qHrGj-giihNBsH2}-&bH&l9H9`0qM^*m3~2dMQY@%TKqqnLnqM{@>CdWVBOoZ27TH^CD@TN$Q929RE~4N$ws}4^{=6Cn)`_EZs%Jx z_sx+Wn7U8-9^2gw{7>88PuWqxO*e=oCVF5m-xO&cpPD0cv@W2Yb#QebTqa0LLk!H< z!DX%&bjXH%h>xni7TQZ-kIou1qqWgFKbcevvv&<%1pe$g{2aau<5Re&I0+*hF~p=Z zvt7Go9;=Pdz;aH8RgmjMz3Yy=OIP3qG2WZ*TK*sQ%@h1Pt@#Z5tob}CAZe9^VfM0L z2~3r?!;lBr^Et?hO83oE8nmF{aDBLTt&x>!dIUGaGj!6DmA&~9{6`vXxbI+9uvEMB z4oGH8NQO3O*$VL14Rg$Y8pk;nDl=3M`w^!=oE+LS&>UN1C#14vnE$~tFf@!w!RAF! z7KSTl4)5PKhxzviv<%`3TU-ACUL`Z|3*g%++t)s3%=zFX5|t!2^9>dUhJU`d-Xf>bgg*`8fAxZrGD&|SjW=$^)E3} z*saFMB##!R;acQpYzuAU8#!Hpv}BPIq@_>HQJDB)r7QFbN3iaqzC4Y>nZP)t2n^G161+`}I|GFBYTgV;}Z4`Z+=b zcT?2gH_wK`^h)YOLg2LioPtYpJ_EvzqyVed6obQ#R0OZ6e&7760AE;LT=Q-72t&f{ zCS0*BLcQQp+=*d52q9Ot&Es5{Gc z70BW+sWvyv+ydIfIg1>($S6a8LiJN4vn?DyXhR=w&H06X&is27SP4IzV}AILO3ac` z5$ay{=StK{0#XGB*_-X&JSWv{XR_X>|n^U8o?fs-Z|)YW=o(p=?^(WVyEMwg0XuWj=;0A?~|O+|rpB z)RLhQ?p`_H32r5MsfL5>uayHNXI-+pS9D_E{PAw8C=!_3zfDp+Ef#vSj=FD~-hAcSf&he!qOB_Gayj6v;^~tw zl(lg(=S#uvN9G|Ez*7bqfGt~wAq3|^zXR`l0TNX6uYDJ4tqz_pZ0aDCl6CCZZgwg4Az(%zK^fF;f8 zpzD1iRg-*Sq{77oB1`jir^;MEPs3@tEqWP;Bxq}V74F2q>U*@qw{cO6&CP2?gLi1) z9bEiE4;9KBP+J`wC2U(mXj4+aK+=Kb)8-yrR$GwWb2Q>EM9!!!*?NOZpba~PYVCcf z4fPsKWUPz!W-v?SvT5tP08iaIZlJK`k}_%)${E=CY+N-VZg$5oix(l z0KbtJ>o}}2PRtHJMiY(J6dWqr z30M-^)U0s%r)Y#rC#E4bq>ANlutc~}lkdW|IVPnz8e%XVdaGcoxv`Z!E8pz&cVJD1 zGp7Q9x76brB>!`S~-P-{XQ>F-+6Ds|$vR@~@##9uORUhVZcon>wLWqZ;F!r+Fr!dl#Q+Nm2 zA1d%F8r+9GD~`ByJEu|I⁡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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6801789f1e84fa5f056f42bd99cff8f3f5d675ee GIT binary patch literal 1749 zcmZ8hO>7fK6rTNGJBgDx6hhJjC(x30oow3D7SR-ffU1BJR3fNirCK?jiCJg8Yt62K zM2_SG5`jY-4poALR4P>}D3wZ2Bn6JycuP!*Siqts z<>aKyA;J@7FMN?y2}jfnN0d3fu7^Mm5hVlurX`Gd9uYCSJ4m@Lv9!)Lv~2gbH9&Jb zmWhHDA~bSgm4q>@J*VREH7VJ)z-ui}SgWP$PrDiSSOA{$CeaTnPD0uzGp82^hK>x)OvR6BL&uK5Gc&9Wk(`q?iypb^Y1*+PnlCcww_`GwDp;Oz zIYrHs?fGG&9%#6QSzo5aD^NQv1e*m3)FP&D{s_}`>AHMfSw$Y;#>nyk+LkwE%wZl2 zclaftC}i0RJH}0=$k8bHq#X`WiyRi$o2%M@Z%SD5){%iH>#xGXKp%gUU9 zm20g_B9DrEQ7ochttq6bi@oPb-b$rOtbXWN+QB4d+A&7WNP!*m?}wi?<>wktSu$U$ z$NB(r>=I}T7}L!g28a+lL>Ii9D=>W_tfC^yzU&7p8|w{$W+2ZJw*=&b5RYz1MLzp7 z;mxQZI;bUxl#9ZR7t}05+!Wf6ychHyKvd#@zBE4#o-638FpaKo8aD}*Bxk5o$h*E| zIadhv)w5*b6r~Q;6xt38`Qb(pFg^lor*gzsf->2)qi&3PXedLxM*a9L3^t=(1=ftg zD3wZEo}RNkJ*{7G33c@kiAU_%NorzKKS|tq&&lg~>ST#`+;&YUbv?I0?8~}k&g%IE z?~-G`J@V#Tx@&r5IG;+-r!vIV^JZQ*E)yF&RHtV8lHROg+PK`2{DL3Gj?q*X2Y0x~ zEGM0^+@mAgF?(Rc?ler#OQ;&xzf0UttdCUGgUjKSGk295FNOLacfGoneAG8w=^NhY z(>JW_DFl!QJO!+N_0qnsMbB5sy04cjvUvNFDsr4eHtfNuZ@O(8Onf5Xp+c{-@ zhO!^RWfjYqkByIy(;iU#$p24IV_Ysp2R9)F(jva>E#yr*Ls^~I&qmol#OU9*%uwL-8jV>+*Dz9f3*{f-h9l=uyW{zCg|GK%h5ac}jMBGt~lYe&mH@p~uAJ$j{c6fDu6 zwMkHWM<47j_r6n!zFTUqh0*Kr>R{sT;5YHF;^pCwHwMo?8oXE;y!cev#SK-%Z8ZVp eAFuSSrEh&&lK?}G&RC6kYbugM&q9FeTm28Ll(c#P literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5691c9c665a896a5e93cc5150e5c0cc1b9ac8843 GIT binary patch literal 2341 zcmc&$&2Aev5SDDWbp@nI;~>2<+n}~kt*AI@8>o^|$F|Y{{)43$jV}VdOKE9yms^th zv!G+2q0i7~=_S1tzV-zS-FId3UtUf3blX| zAG(lgg1mr8MRnbI)oQrU99UL*#OX$1YDb*CdD?RH4W_^7%^BQ8p- z+w_ba_fV5W3hjwVtd=|xDZz;tX z1Ht0NFt}r(A-{bJc&UCDd2phtJCb>UtEmiGM7V?cj1HcQVcn^q3K|cXuY(C12b6UK zJ#o-5(74CpN12O)-yk4&0 zf#`JBv2kMFNZBqsMetRIM6WsN{DYgm+442RPH_f}1bQ z2@n&`sVMlhquL>nkhQcokplnxr%uMHNqW^CF{=+i+7i1U&uq2kmy&a5YM3%ANV zPMl0)@d7DAno7DzOL!*?$J8A=57ERBXWcQZ_w}uj7E>-C z&)&Gqqv`80zd0$$Y*RAJBIsse!T>VRhwkDF`yfo~^kUgQMIhTRE?ur{9qcy`c6Zu8 zxAu11jf11T&DQ0;Y_WO#B3rxLPA2=Uc4KqzTW z{w3aN97Y;@_?4nk;Re+-Lfex03~y6)u0;&5rZ}T|Gg9o7Qyh+H)Hk$`$>YF>d#1l*Fn>87y<4t@!tcR9hx{CzFn=}b5qz!| p^ZESM!k1qyy~(Xyee>M|=g&r<*Z literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3e3ba9af3007ceacc1f0225af9aa992f3e240f3 GIT binary patch literal 557 zcmZWmJxc^J5KXdi{X9_%1#Pz7!VPL;p`svyAa+{V9DAF1#@ow=B#H|P7Wx~sv=x7f zzrY0x5evJ6v$Aq>o?1ANnK#MIo0sIVRvSTJtF8U!Fh=OrCqG8}pc?_WK^$?Mqc%Rk z7;z#n4>&!feBg>6kdnsXyDyJ%6>O-oB2rhO5$?pO-3*9-jQ|Q@b(g^bDdxnJUU*WE z31ET|LFf3P-_*;U~b@g+@{Isaab&ma#o6jAdKG2^DP`$tBwqw&e=Vv?-2- z+fY_Ea>3fAP^T=H4W>(XRH&t7VUbzs#Jq-aX;WARYFJ+@^IBP5oB^$sg-Uc;P3J|* z>+-w(@5qdSBCpj>fxAR+ls(h+7dm>i{Y1yFce=0(uTzDt)KWE#zd*0&9+{fQqu@S= nR@wzW$;FzPfYkqvodeeiFviblx)X+Y^44|`ggf`)L$CP@)v}Jz literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77e4b3373c27bd0dafa3da7a927b308fc9dee290 GIT binary patch literal 875 zcmZWnziSjh6rS0=+q=Caa7K$OLUM!JNbm>27`Y}V{(_vyve})xOm25(nVn0r z;e-elwqg(-g`GOQ31-X^zL`3 zO#r@V^2dx3fctd?c0m9F7=j44A=KCijmT`9QK4N>ycn2I3hiQAaI9}S&4JmN#~7EM zq?{#=kr~ZaR=)0qp|=_mAC7A0zNox<8}8pyU>C^avw?asF!t1$wnuOPAD3-lfC1ba zg}@z<8fSn!QVPIXAWR5WRCE(;nJZuuI_CEGn?#}x4GH6Q2XzFGkeBmW+Q_vS*{BZ#lA6JI8cN(Cuf5Zz=xN1EyCZhouYY&r92;lI42 zwA)1X1^XwHGKmIgnKLqv?yeCeNYW1_;+?z#Ux8c#eZL>&;)OU51$3*1aMICia zf<~?;vqnE%RxK}eiR!-;nSEo+C$XM{irU9wMMckqa!LYJxaQ3ERLSUBz)K*EqY_IDY{rRFb*a^Lt*GBsiuqb~gwM zxWIz?YuFuWYs6_*QQD5E7*`4`E#;bWJK$gv)bXqIP5tfShjY!HrH`eF_odp>2YVoH3W3g3vp@U23)- zBvL%gERhdkyYjd9j+Iqhx6@a{A+9U*#$}dFW3?Efpoq{rn(KTG_7wzTOu57I<%kFU fkX#j$it4>hs>%&b2;paN`YV_|uqI(uoKV5vrZMaU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1103703b74e3f057f9266dc53efa294d3e58f98d GIT binary patch literal 12097 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..408db9a03201a89812b33274dc68db9e4d2dd471 GIT binary patch literal 1905 zcmbW1UrZcD7{F(CcJD9T0i{(6g>7hS4k~N?7j5_x6iHhQiSfV`qnCr7JJ!3~-Ola- zrw1X_hcjvP8WW4e2Odj|=6q4ACbrMM@W%(-m>8oE`gRr`NaKUw>_H)srr1el_M7kf zc4of$ec$|8T^&Hsx>Li+pG1Uy=ab#$+YvTD1K|czk&4qOgGX>i7!fjLgkU5fN>t%< zT=5(cRYEZp8(^x6APH2WVnX0^-V>rKy)TY<9_r-*FYf_fd^NIfH81%2a=wWFFMfas zaeNnT%HpGG>PXS72_J7XXVT#~b8yu0OvKY!YB?T8?JU#Bc23QIMG!k`g}ylh!vMk% zuYKR1N4pVDV?VM9xVSBk@9PCs$O{SK6MO?>l*fJOEx5gDK_z?IYXK4Ea4WL;UT!;u z7~J7y&`zQ$av4qHFUTa0i0{7WhGA1VuB&pA>JSs3$Tp8jp49Adm?YBiq?|CAoY0tM z%WiNTgVFva;)ohtgCpv6%66(>w+*who@VF~!o0Az6XYJToePmFUmlk%%lA@BMz@tQ zWyqq;Qu?V)b-9mes;2Z&D+Q}5CNtilcCT(}aMemCNA(FMt&J*X&K@`PXFAS3tyr+Z zlV*G@6;D!2F*Q?(O;BAmn8LKNaV3^E470<`IRP%j+z?nT9KZwJ8iwIdv^|Uds5@4i z`1tJXKv^JC_?Mdc;+yL=Cks;9gM#6rRA^rlk8ad9-9=bxEJz!nBgLUYdfj*YZvu+# zEibBS;I{D3zEBxd;eV_qSbDCi3x5>sKnwL<_)GtJ@{Q1iZ{hRgThfIO&Wbts>rt}8 z%><~hX{eIDOvsaI;aZi5_GiZ-GvkE{$wOvFI=+_}{ZYnCJtDdZz(OE9A(PPw&B$7n zOkiP9T0A`=4P;isUHmQ|z7VU2c^&tN!Eg|sh727LN7clE0JO5_<4=xRZQOdLF>(Lpa%^ za8iY7;zW!brfw(wTl1l1wZz=gzX!VJnO|C0H z9>6Wd@%by)Q)L9=;`q&MDY|^F^v2T6>Y46Mt}7p}!e{0$EWY;XKpBB}^FnE8`Ptj` Wx34UBtv+{g_3WiBu4avJj(-8$-O(HX literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1eb5b359943247b1f209295331d196bd8190f892 GIT binary patch literal 3640 zcmbtX%}*Og6rWwM*K6a&*nA|A4N|eOVdr7`Cj}?(C9a zq)MrjL#kZ3;oRsAluM5NA9^XLR;yO6)KhMboKr6Cd$ZnUZ4gxI9-iO)=FR)foA>6! zKdWkjz;|u+%jMN5A%A1T|KzsPDuA*@bfOC;sR#u@KwUJ&N~92}NCl}9EkrAFL9WCK zv5Hbq1R|18i5_`Ebcsf2d>F>Rh^Y>h3-l43xWYV_gRGBL+7`Edo_iBz&wTh-Ip?#_Clm95~Mr%>Pxl>XQbW#xY zahR1NP;6hG=`DEs2;$R zfF}W0d7oUC^IGc});`cvV4bFYR7MXRm-GzSr`z`ZV3W}YXurpy3%UqA zgMbczMGU+Qfj$WOP8C(D?acuEEBa}$ zKckQr-Dt_I+H|AWpZqj$W39Jf1CYn$HznBug&Y}-uq)>0SPINo9|$iRmI2k34ZG+# z^^H`(-~n;y^eIvUY!Gdens20OR!IaX{DoH!30=Y&vm#4_85;p%&?i>Ie z!Etiau)4_+!gXh(0eLD!zG7IN+*o&fVKL=fWSQJ2tQUu31U~yapm(sxF?6J|H!>Zu za}0B7$3Q^!q|#60-WsGs)2NoqHg()E^k{`zC0fF{gum{jGt96zxrmqdNd&SWY_uH< zvTswm8p=L4Pl7>^{l5R1eRSBBeIGi7Qwp+wOo6?J#)lS|ip%iAA=+5U#^s0QfiAPEI}AP3R1xn{3~ob&cIbp9W!IVSG`rV>7DfwX-F$=(&A#m4o#&$vPB-qO zqx8;g{_|4=d(vTlsHZne9QQ`7??j$|$IV~fKh#{^p4^%FaSBb;m$PWX1IRQcQ0KE9 zX-saU)q`3ehBd(_xXl^UEo49%ShqJg1-|?EO6RjlH|oIO8k=Xyl|eVG zWyTZA)6J923xpQ~=9ew{iE`ul2MY_@-2B3wu4KMdKJlvZ8v7cov1)C6Q8XihApAi_ k|0LIcCD-4`SB1<|wmI>`qc;T9*Ed9>4nDj4z4x~H7wL)x4*&oF literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d516efe4c14cd4e21b6dddcdc5abe4653482c877 GIT binary patch literal 5180 zcmZ9QPiz%c6vpSh*8(wOTMJ^OMiZm*6gmR_7tulsR7piCVAwRJos=j2^D^&A?2etr zwGkJ_L=zLM3lrngg)VfX3*2bZgq0@dZH%QW+35Mcxo76PZNm2szd85(?ww8vou7B^ zyd$x%qgT!^T;H1{f8a0v)fbA*(^gzh=9Br_VzN}bSgR%VB&#hX^YzbaU)74Pi}k=7 z!Wx0~3F}+!Z*J>hRkOCf{mkrQ*6n7^!Dgd(r?DJThJhcg?hPOwurM%;`cuSR1^5B= z#|Zml9r;ew&mh(bdhem$gZQWb&!hejakBuw*hhYk$6BLz74^Lyrv1z6-YLX+3j^rx z{bb=g{TE;Z@wtU{yny;0#D4|&);@~eeNuo~T>K66(E{8;z0adLxK^Boix@WcOI*eo z11Rdp1fcGn6Hs>NxMa7e>~_EoQteRiIOdgMGalLsc(J73p`cvO#oke_Gf>v-SPK@; zKmzo5R^0mpb=0Dm#Bq6 zEd*-8^5`rCY9UYyfm#UELZB9OM-~FL5U7O!;in}~3xQg2F|rV-g+MI?Y9TpAWX}C*r78kyVTW1>)Iy*ZbVp|)z-HV+pcVo|)S(u3s09}z3xQe))Iy*Z0)%S`)Pg#) z5U7PfEd**IPzwRVv^rRq=%=J{FJL7)}_wGgOkN z0<{pRg+MI?2-DK2&sYV5r2@fHfnccss%WTMFwf7zB?M|APz!-t2-HHL7A%h}1ZeY( z5vYYgEd**IPz$;v3xQe))IxypeGsUHKrOsW;eV>E8EPR=3xQh7b*?2)3+m`B1Zp8r z3xQe)Fxf2xj3)}pnh#o-T!ApT0%39mxaTKj5N7zE*+!s~33M`nP9_L@u4bUJLl9tj zWFb%sfm#UELZB7`wV*q)5U7PfEd&VPDS=uD)WTaBo+TcRKrIAnAy5ke!nFjPc1S3J zPA1UF1Ui|3)9`zr{SvyvK61RZU>LX?HC`|<42+;Y;$h$s)GvA%z>}9B^{_qTO-dEk zF%IyOhk+^7FMAkx6ZM#fflH{5c^FtkeY}i4s8S2N^ge1j5C%Q~nDDS2J&d{x>-YlT zgolA|P@nWL@EvNrmtok9`%#x+9X9|bJ*)$7ld7bx?{_o)}_TPU0ThSucnKwOKE$x zdwFH~@aVxqX{XiA4zy?IuFNiEowVI*r!!Zx<@uF7&0BMq)0wc{&S-n}_KqVCpNeAELe;Tz~?PfBvu_GD2?^b=Nf7@nbc({ITU}Jx>Yp;V{^&83H#%Qv8 Vj%p zA|8r*sHa}Nsq_!{AG}1ogauEYyhYPfPtI&o5c*)=esAWz?|nP-zLiP^khb1^-2Q|B zeyQNZ^ck33k>CJaaFGW-+C~UmjUuX*<-VJvT1$8JH~MxiF)HS7Ra8M~{(cyb`$)Lx;(8Qy}5w)6D?bGkV0P~2i7iZKuPs$3K|gTTXqz*8MrhG)x!OrKRKU}-hc zj;a|_(Y2{`d{vcJs<_4z%zJ*53LLaDK5BDCxvBW4$upvd+0XvRr6{U+?t55x(Vl=`g41a;+w>X`;js8>miX)jG;jE}p-=P_}}qlk)#Y|xl;To=q`q)wx5 z9E2nk!BZO7c*L3>C4NGApLncE!X)kl{D!r5okT3AtD)_5?KX`_$U@TSQ|< mMuzIqqf63_a|ofIaA9ng(8~VvkNSs~W03Ikt=+vcy^d literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..716a6646f9ac81f9373ac1f862364672cf1b7b6e GIT binary patch literal 6599 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 E11UI!?*IS* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dd57ebbfa227a5dd7faa547465660c2a1fbb111 GIT binary patch literal 13199 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 NJ zv=iCde*yJRVP?P!MNHiyQkE|8&Q2wG!{>L;&)@srXZuU5)j$v{``f!NM(C$H+=e+# zCNCg4Lkuw-q6j-UA`ZcbAWj&$fTvVA8bND_X~&4^9CK|EY8P603psjjSmu>FSftR` z1DO@Itvu!1o+$8^Uv*WePY;vlkenfo9L$hI7PMs%+JKzv3PE_BJmo>WZqCbXkCvwi!Wd2V5cJ4&CR}5Z}INjB*T4EWa7ZKJ{X%2x$_7D>Uo#$`$(9OH+_a!RS&YjgyGS ze&~VQ-0EzAU1rr{5utn*^8ixGqEsmDg`UEIVWZkg<#$wvf+KWUpZ(N4ZH~HM>x*Iz zN>;t7yKd}7+;xkF>qZG1gesqP-S-18oZhLqE=znU*TMdji!2ugJS`NfxT~P4Krxmg zL``K1)W0B?0FKc&-MTbdV?vDkqqn~hTqYVa@05jcofz%&g)vmy=h?NoRBVc4!!imp z%hMp<70Pg-zV%8#Ip_b`H}&Oeixts^KJ`xILx8b{G5(I|550Nv>f`zmzBU`UebOB* MoUZ*wkd_1g0s@QdVgLXD literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d2e8468a320bc1f00b8c6e4d96aa4f077a4090e GIT binary patch literal 885 zcmZWn&ubGw6rS0gY?`GhRIq53vQQ5$Xx9F~lSIVYQiYuSfjJnG%rxD0cXpYXR1;DN z;-S(@z1Tt#^j0bUC0^QtC~H0SQg5wM(4KsoZhGm1dGoz_Z@zio%zVyfO$3%-d|dm0 z5!#P~o~0Aec?Mt|QB*_}Q_aIZE@B*G-P4L1%*4}uQY08LZK2E8qd1wVMpMk71|u|m z5til%?R%BlPKt`@hHht?*Ug8n&xBPCxMDAq<(GN6#>6!%;9kS3OGYi1Ta;DmwVY}G zj5pgjA__JY0AywuXQHeE5v66lvcRe;G6Yj~!EL=zC{#h+sTqJqVRS-p4-f`*>NMZ$ zYZ+7g7O#WSv$+;-g3e{FrBSV!0;DUw$KFDli0Un!l1)NW@5pw-j8OxB(w}47Xx<2g z%ax_(nZ>+v7;B4l|HWz8Wv^5c*9HqLHHWAPbL{gQ7 ziqZ*tWG0~GOG%)>0z38`pDU;8Jd#XEXPPO-ttsJB*O_8+Q3atBieQ1MJ6yUIk2!vW z@g>J|D^A!@^8ug8jg33fRqT3Lt}eo3Nhfqer?kX44TK}y>bz5mb%|Wqh*Di72H^C5 z7%~s;0R3&F-v-JKu1>e_eJ7c{fpe>KYxUQ>J@akw!p7vAk@o#Pl397OGQ0M4qq#M@ zGm_h??3iO;$oRjml9!V=vE3J?OC=gqOQn;`Fq2ONy+(#=gm8r-mK_ZwiR5!dx>Tau z(nr*RJQ7)O$9=c_fYv>h7ef%n&nNGKJJd18N1Bew9~0rBeKhz3T|P9B*8dd`@8aPj g&A=0D6Nd<<_p>{>{O*<8zv7^yBkfW*E6xMYe+x9|Z2$lO literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea8db6705a5fe48018a5d5168a3db1a2cef6b8d3 GIT binary patch literal 28996 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 F_CHkvTO|Mh literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3152f2a423b60ad62e47e94111df6d8de9b5973d GIT binary patch literal 2380 zcmah~U2Gf25#Ht9@%VS5B$A3`%MvXMj;Tas?O1(i3!}DWCr&~;t>iRjJt zyX>80Q#b-lU?5T;AQDhiG@J*vZebO20Y9d1>08mhSeA>D7X@)p1c=}0=%vk5XOE&{ zI|;gno86t6otfSJX7(SF6hP2U%)UAGBN3s0vq`JD5}53?V}#a_f)uQw4C_4_&U-SR zJeT3}e1^wJ;S^pI^4^Ts9SfS6_ho!}f5wlI2N5(AZ5jQxSG*fwm$gh#5lKk#5f9;s z1Yc;9>j6IdCwawxozJu>F;^!*Bqd0~pvw`-mHU*?bs^JEIuvR42txE2#L}j9<|CPi z>pP-^@3ilE>Li^r3FhB2IKYV(jw?&heeI z2+dy6h{M0GnwBGs&lwtd#5R|}j$hMtL)NmUmGC&e9MLpcBLydrn+7(UnhX93b7*4h z1)vUZk!zOYrNo+}h1~A>xc+&dhv47&JCN59W;cRM*m8x8%JB+KNSUD9xb9G z`ZISGCp_mV3oyYuA|>)wohpuy&sw=@hc}IE!4amYK4&Dnl)=&Q8M>)jstyOpROP0o zU|LyfIUFe{4$t_e7nI{}`(`$kFIcHu>Y_=gnL0}>QizXIRZ&x;#GJKsBV|y1hFB*H zrV5vs$`?stKBcKwQby65)(bBsj~+{bQ!;F1bFQO{hQ(bD&7hYEb_Is$jVq{@LpTreP7>ptat75>gDS3^~hFicrnoM zqhM?+5dW_k0$1;y>^pe~|Mj2;D8!;F798WGt|_@E!NCrP&37tpVo$-9+uRH=o^2%_ zASPJ500L-utv&GAs0D^mboq}6O@PIcSn`$p9%OrM|Mvl?1+&)5Qot7Mzyi3n@$4uh z@4Ow@9c63}J!AP>5!rqlEBKD5m5imJ72J~rTlOFlC;={rLnX-;sSje|ZLuZC$PUqF zd{T>75|;Pdq9yHF+mkE+uOu!H@o4#-@3Yn1=M#3W+k%Og-?v4eA3W>%JK8sG;c1@h zPguUqBbysT32rwrplal^*JM*&AhZLbOo)y*YZ!n&>Vv6^HK-V-MOA~c1EVZ;9S*8Y zqRq`3+ReDES~{Yl&Z`PBX)l{enpz<8UP}4hdc?{TjW97UGbb@N47%9{k|{ux#A=s8 z6gOK(8e6<(DdhI(#Xs#-VY&CrWW>Bca`-AJNPq+sN8;HlIfYD4O{+7rTE3tg@4)5G&0j5E zTR3^@^yrzhFTZl`)z@B6pTF?NFMc^Te(}v;y>%%Qcb7W*eqimj;=&`h%;F}7@OUET zcqnnaR?$!kQ5yyOprHOIL?Ky`i;r)7Kg;XNoJLO2p8$`&d**E*4Gv@c zDe`}gj%=bMU!va6(en=j(Zzuehn9v`Cbj|tWwGHEadL%gAm}Q-YOHFmpS~NZmNpNL zYh=gT-srR#tFoS78mYwJ)iOMFWO?2QxDqu r0hoO7{q(!(d!6GC_=|Pkzch3&cJ%JCPw<1lsekgP8$rbHb2suoBAH8C literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed24e1234018a042c6edd30d7359ea870471c592 GIT binary patch literal 1628 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4101a653765a1e3a1d5a1b2f8e759def207cb624 GIT binary patch literal 9126 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 Tp)a_m%udF+<8xyzHL3ptO9qjp literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd8f0cf7ab07787d1246ab84bd83b19ec05f6bb6 GIT binary patch literal 4292 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9c376f6c6723041b8ed79a43e69a6e2e1fe3237 GIT binary patch literal 11878 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 CTYl;Q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b7ec12eba0c745c89370ae13dace4ee0fa91442 GIT binary patch literal 5638 zcmc&&du&tZ760zTZ#xgiPGX0^C4_=mhzp@A1mFanL%LLa1KuJOG|O#I^Bn}($J zngLQBNQGI~)l{pRuKgnwtAKUW=pO3Szou1_;)D%z$26+8Df~5)R8z}8+c}?~rF2rK zO1qN3=lRa}`u)y1pWnCH%mluzLyrx-QcK8(SSfzA2P%v63?VNOk%&x)^kL41m@wPN zGFaw9T$u0U!@52l)Ok@C(uWOw28OUiB8O{=%F4N@KL`5oJ8aMAm1&7?5CH&`V|YqVF1kebIX1t+ZgLP#zt4$dBxhM}(#qqx){9MW(o4>9CFx}#-B6gJ zR&+@XMNMM!7zmX$pp3XwY8ca1woWeR$tW|*c!Zm%ve(0CrjR`B3-|+rl84odUH(wW ze<&nr{NA9V-oy(88B5oWy?cF+@9y6JoqfXqAM*Vtg|*T5rrv+|&llFt9y_?EHAnyf z8m~%6RZTBT>aZLM6mB0UB0T(X7mHgUd5(RFsF3HsldM|UA0bH=Zkst_jFWCs#6WRR z2`0|$BOcc81;x80RZs^dAu=33B*{XwUkFH{kRr&^k>Q{$iGmsx#Gn!j`9}p@RJ++M zz_))es0d+69gK>CKQ!VWRRp?qrA-(a3@C$!fsW7 z(XteXhQm@s%ufQsRP$3fzb_<3o)V%@!-~}MOoh3($pgwJDvK+@MG31FRrYKW_G7uc z;DY=k^b{+G1S9Gu;p=Z4XZzA!bimm!wnOqFvxhLi`ZzggB_zSHWP*(|#WVj2^Af|5 z$tpk%d5ari-eh{;ByVyW+kUTR3Jm&Xe?XOF&Ey-9RG$(YlN7v4K^VV1TZa$Qv7l>xp!@TiZ)ANZZAFNIttkJ{u>qj?U@enFHz3D^5?w(fRozV)eM)$p9Z3a9^c;=9S_$ zHBK20dpOw$qMBKas{Rn&zKrB3oI$6IW>2fWV?i=bZ$U8u5}5x}H>q7czWZ9OW6sfe zX~Shl=Ui>)cu&^ioZ+2|AVc7Mi`xkl3!?$Uqe$+c2quqzHO? z;c^|cj5QT6>@N88;5Y{+PDnhQ#(~+85s-2NHt-ZyauYT*VnRWMs01b#P-QIYm%$^D zX80-hL4t6y6Qd=$;rM8(nPqQXO#ZL`RZLF|y=;%uBl-!F1w0PzHGLZb6%WxfX*6S{;xVThBsj+y~|oG*@x zIG|NO)C~a3x59`78!^QVB2Ob3Rs??=H^2|(prct683iNo#rY;TdURvI{@?DocoxEH zIA`#LU8RP*qU4*uZ5gegtcT<#mTvwVJ`XD!uyrXU9;4g}nWp!tG%T`&q9c;*I}{y` zh?-?M7AsYBK?n(sYC1*r%c{nKo6>Y6K~Wu4&`BV&@XO<+1=VA+34Y28kN{rlNtJ7S zXVzXfzUP|Vnd*PxTT{##@A#gqtuehhW4mX1UB=orz9Va{$}VY{y6@~m8KWzyODd@y zS&JhzJZo8!buXJ*e%3PqL+aCYCw-;*^~UBY`^%Qpx*2Qxv=fr7r9Ry>YiZ3|Yp+|Z zIgZ$y)6ZmT*GwPD)ZClY<($M)oyV(=I=8#Kou_~TmDZqa10eoEG}Eu#nn3L2-H{~@ zuMEH`#W2RGh+se(ygA~G8%vDH4S`{jnNhy%o+@;4fJ!Eh(>Tgw4X#iwYUYp~Wz8a& z;P1L79q@&Z>nMYCltFsB3caYuHaAHaD&{Y}R}#j!5!Og$=qg;5QlbI*SG0tpj!GDT zS@7a@ZOBUnU?8vBE) zFcO4#Ga?KGAw0S>CT_pY2)z{N8jKV?3;wpqFC5gn!MZU|59#Gga~c zNIVWdg$FthiQfPi;6gn&h*V>eR}UTe5Wx=@nDXX~%0zGVbQNddo$JE8Kd{Q)i%E4n%R~VPkF|>a(bXZw%Uusqn02DRd+s!isLz(wwzBC%UdX8j?G54JGOs!5`BD(u{DnK{XhS1WK%e<3b}v zeMWDdhfvLb;1l5ebea#a10=xGxSo&m5CC#=wLl!Ys0f@pSI^;^yM2Ved{J&L&~r2PuOk zexz73k6@7dINGKU%sK9#HEzsd<9JVwKnB#YyWs(|R7md!e`T|$)=wO`Vr$OW zn#Xs3)U;x%XRgV+Kn%L26V*vmY6Fsh&sdhEkIq_Ffk!&McVchalWw|fU72;d)9cS1 zxZ+%y0ix~9x|%0?u3PKVtr_dmWY1NrJ@vp}tj)P<(3P{3Rc(K@w57%5_S3s2cBQ(X ze`wayHp91lzOWot_4$H8tZNnA_^I0M&HQ_8&Eo>{EyGiPyXeP+%FMc?F?B**!1DW~h z*XCcp_|c^|K0bXOdyl_8|MrXj{N3dIsULmv+gCoB{3*yo`;GG#=Z~MkQ5X^2{4OLE z2)CKI#vFyP5=rN2)L1Z}rvBkbK#fL2ii`x(^y+8~z$N1%WemqP>le&5qFpnjTTgerkCC|9z?_+mV7=<7X#O#%3U~GC;KA< zlEy^xuN^mveyT#`VMuslTNsEIw40<=85wKD{DGAe&mTfY~BP*jn12YayF^m|Mig z)TcUfm`!b*-Z#DDLdSGZX2t!q<&S|y?6@U>!qkS#Ok<8UF&n0o9D!_FS-=c6x@h~Y z#bY`SX^YqxqB2eUS{FGnE5F32vx+9126 z{-Nug(M2rg+6iw>j?Hqe4|r3?ynO1OIkV?7zvgOi)sR?Z4(2}SKZRV$ee}nZW_$}2Q~tsa{vGU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82dfb53110c343325243722e4a7b8febb4539980 GIT binary patch literal 26590 zcmc(H3w#vUb@%K`TJ5f$s|SeJf&gg|NUT;o#LEatfOsPb0|LBWG$XWVr4_R)Kti&y z<1`|1V`00oi0xW-odn0EAx+xiCTVb!Hcpc!y9ihE1}C_6(@fLH0#2H^&;Pl1W_Bfn z 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 I{C@`jH$zRcW&i*H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..054e91a1ec2e15a37af709e1083522d01703336f GIT binary patch literal 1721 zcmah}&2Jk;6rcU@N1P9nKvj^cYMQhNH^!R}(u5EJB?*N}3}|C}$IdqE*=2Sd zVv|Tn2~xTFmY}MVxh3kQ{|6WMX7)m)p11`9mz;PryG2WJY5@pqj@99sY!}3Y;(wgY9_DE}r^op;ny#dj%FWD8*SMSNBg1&jzaoGy9A!pt& zR@Mn-#LD6dBZOvgfm*oe)CexQRnMh_av!^8T!1xf%LN()2Qe8O=przPGs0_(mXs(z zF$rJ=V5e__*hkywOIYnFJL-;RDcg#rKGwHYDK#OV=*uXhHAX6gV-5+)e_ki4CDIcNeJ z#e?bAjn+cz&f#D?J=#u=vR7f#C6q+{B}!pacXJPzr!;yI0`7$~uu-hb8X%=Mewugb zCSe?|d(M5Eau=5!w*Y-mB>Wp_5dCl<&b8a&I;~BAUJeTrn4qhG;Fm4xNXo zsEK1Yh$X?Uv92U8z^%aD5IS~0{8waC7Y8-2UZUZJ<2sz-XFvcOFXNmZYOen9EpT!1 z$IlMmd3Nh)uAQE4C#NOKOPT&4X_^$CJktzPrdf5Znj`c+)BL(ta3W8_G%dFTW(~j# z(xzFU)a3%Hz7_umcHQoiKZyZujuBV@nL1AIr|raNgn?<$>hE1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a60eaf9c059ab2bbc14a45e1c1f9af9c2c28e0e0 GIT binary patch literal 8607 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

      (Kod|vS$E=sNP!`8s-#X> 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�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 Z&>%^hsz$o3g>8~FT{Y5gE%Zsy{{f9mQ49b8 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6be56aeaa4fc93aa7659b1b87d51309d70e9ba69 GIT binary patch literal 2278 zcmaJ?TWl0n7(R2|YcDCX)wbv~^?|Lh!!2s6!EB&_l2+0djq~7SyK~ykvNN-unFSUL zLDQI;V3Zg36`zCO07#~U&6T_4LKQrBKYw>LMKmX-i{_}s| zIrC#jN0LB$ROQc#asnA(RD6)Wkp+%aSE) zGDj%S(h!r%F)Oact%R1al3LPAX(^8IQ>8MG0Y^CvB+pnfl?=wXq-Vb-rzLBNaCRl zk&0A$4x)x+$TPALTaYw4LDqjp%7`zBT5R2uAV%6qfG=K?vmJf{v-4QNw9oz7QWbBG zDrZc?n^T+_rJ%4@#){{FJ!_t(wqjSUY07X!ajw7$MW}_FOC}X)c{b~g1R7dx(|2w> ze0D_1w}+kS5-obU*32-6ou=*WQk)15m@@_GS%tHvRkfltVMtpRSxhtBHK!b=GX;&Xj zJj=6Auviy}tl*0-EzhibTwDsO^2AXs+f$3`Nf!#I9-$u8^e{6GQ$0-GQ=U^%E6gcT zFK@dhkVUm>)IP12&1n^QH|N;$>H4{z7Sy>lUk_yEc7wP`R{CCC6fbqHZ0}nXKT9^jM>f<$2FDQmn}2~g zPB^RyDS^JZUF-rsR&P_g!qqvB)W|$vTD#h9BfK@l3JsW+m1ZbVp|7v{NA z>c8W*&S+j(n?DNA%ZC8b6~4}YB1v$%8hM3WlD-zsa14u-l>=Y{K>c*JViY{8hwKq7 z)Akd<%*X~d;Z@IyY#U7UV~7Sm39*pNuHR9dGs}h^nXU+up6|BZocdn- zR=d-?oS(RtpJ?ozYz#~-j;-`QU%znq!d2rd=S%12`9|;Pa(eWq^ym{85B_m}IDde< zyNk>36YuVpLEpd%L^8M~S3r3hBR=W}^l;Rswl#lRSn^(rCnaRxrUo|>ZsC@!i1q?D z2$LklPYUsS78YShHD8#eUI1qV6dSFQgG_c4Sy%RM}S zogC(gcOgiYB~ZgF%#ip07sq2~6Zjz51&ivspVW2BF{)+M)4KjawNQ>CFn;c=?J&dtE>uv^3rRe@*vUMl+d%1zAB$iK&~GbZP(MsOs9$)NVKlMo!TFxVUk}T4kmbOKPmPN; mSQR*qyHAFHCxgEbls8zX^1~BL4zG&=7I} literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cd28ba9d913c7558d5e2389980b4ddee07058ed GIT binary patch literal 9246 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..680821e64dc23f6a2b01551869fe3673c91faeb9 GIT binary patch literal 10949 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 F{|6!0OG*F$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d4da6f563e68bbde8567b801ceb7d9f24d561de GIT binary patch literal 10393 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 Mi>*-}fp?Yv2N~fM)c^nh literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfc48c14057ed0c6e8acce5a4a459c342008df97 GIT binary patch literal 1507 zcmZuxTW=dh6rR0!y|Hs4p-qzr=n{dbDfKoqC?IiB>KG@%H#rwkSJi6cojBv{O|z2( zM~NCF5RpKFs+CgIBKnHL1N;tn2s9v=wgL%w;4LCgc7O#e!3NdVDO3d}i?--URY~AF$(Eg1HRdQ)C6r}5 z?xr8b@y6!x~A6 zG@kL?z_THJq7I3%hFr^A3yfMzX)HpMtY8?hJF&9qLYo1lj3FV-T03}n#2II0g2T53 zUJ_xvMNtZyfN*7XXPx+J~OPzdVIwPfOSoH^d3>u~ZWgsEJnw0N9i^B*Nbg zsi8*b_}q}92-n4rhGeiQvpb-XJobnX>55RJJ3_}N>5cG)97VLmFQwgfGb5b<{y(}U zlgFb7jS~?%KBMYy0W0>|!<<>;l$t28YB!}dkczLrQpU(7nyF#vdzfg%)5sFk2*eI@ zOq)++vg~ zrCepaz^0>=pDPq+Xe>Wf%+AoB>ACVH=E0pqeOIJt*}JF9myGgwC0m>|%2N}xe|{!Y zn#daS*~-PzOxDPka=EEuZhheL!j-JMim>N8kQFpQ;LEVIvr`4nM3G*t8gs<5Gj?kbJ>{JUU<>!n3RFdqu4Mj@yYGy?*iRE);kqfOOl zwrK~8V7R6O11j@_N=y;(H#AO1uI{)*ujz9E#DV@Me^Hyj$U^!A43>%K>pu1xkc_(l zVm0Valik;Cw4nP%j1Up{#tclIhjrndW7N-J=8lRj1oMX>~YkZvP`bK3_kr4xf6| z7_OwS>)~hPx$#yS#uwm_r2_ENj2)@3I-a#+!`JZ(Oyo-_IM3LDBnZMi&~Xp+`~jZ% o1x!BxXC8p(50z8GO9!Js?%ZDgUK;#aPP{*PAOU#@pJkW+0SMoK+yDRo literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2558de80169af2387a46b92f1abd65ebf8d3d172 GIT binary patch literal 4229 zcmZ`+U2Gf25#IYDd88;(Kh_WBzq902qV14&6sL}AI1wWGM~;W89CB(#a2Iu`xoRJU8{q{2d#93Dud^{|JO!B?d7BlW16rrce+y zu^?$uLDpn}7?L5IfkIFVaz0>&3W}z1K4^vu5iP>`kl9d(YEjNBW@DjIYZM42`5pd} z8?_Oh`Ys_X1gk}0wYU}+h!y0mCa*3HIS_|8>ZJ;l1L=&J$YZJ){ zVl-YNMvS)Kl04m72bab{+C+ov(oUK%ny30;#UH>L{yAIBuEKV0JM5Pjt>z9~M<61h zEylKAw%r1&V9}aEvfXIEggraqAI%^2dN$Kr^@cxdi1-rF)p1Moy0zW3IX}30p2ySO z{ye_^9jBhBO7e40WA&eAL&^H6*l|uR$PX0e{KP2dH2)DY=c~uf9C2zi@K+ zh0~`-Pq@lUB_~(3GNv0iX94p7t&tSm=*V=b>`-?&nk8s{n zsw5xVB7$bV`EglQG9*7bR2m7%iW@7G#j@B#93H`O=3c@eN;)vgD~3=N-V@&!eXo97 zxIivSuaXNwQm*`KP_=W`q)F>&N1JA{;Bcu(M6H)WHfay6w@`@pp!V4gOAe@`$QLKP z`Kd>S@rzRXcx3nvj6R@p-+%3ZTC9f+nD0jrm5)xTLv$hoUTmvQQ5`K>bkj!0GC7-W z*-G7E2h>v&;HUmEj3TwIUPq-DbGEawsY=tjTW2$-Ney+>CCTs>crY|2>jvT~r)hbZ zu_EJs<0`KVj-47D9Y5(+SHubGTp|zM=PfI0c0F ztte+`L3nVatZ8%W*=Rlg>O*xEl}7L8>&<6jh#dzqOV+lLrdEQu7yKZ6_ zux@??BjjEXlk&iAE$@kj_`U=eA&pi-N4aIxhr+R>z>#@VVEbT(jfyug3439iG3m93 zabO#eS+dgHxv=en#I?ji-hx(Zx8%eEg+|f@F+$}9&ckysS0^~ z61NoC`FarF=<+e{hu)tFR|QCl$cNGefjtf5k}|`%?gfi5!~{4DJWl+nNlM)AZYW#N zT0&mbvu!-VdVFZob$q_{`Y5nOyB{YWm7j)Lb{~*`k}m-{K@xADH?HP?lE2=2x4VC- zyZ@u1-;DfvWV!pf<=FGf%JX0GK=gM1VF3UtTM$Y|lRlen}i!DTVDAH%$X$ta8R{l4P8!)!l_8nR}_whI(;7lWm6 z3LiX-k*_Zk}+!1*8 zeyq6`fEprVQ``L6g(v2DDXZC-~WA2AL)&eN;PJ)NP z?68o@S-K7xF667`biuL#`)KiT5JBbv0nvEG%h8-1#LocZfw)RugPVC1lGCa%BiO=a zg}>tP%>{2cd0+N`c)3+3WeLHUlzHCsx7i;*6b33Hyvp3daPea5Addo@1JlFs(Mf92 zizRl99fvhF_}fna;mEqJoVzanPFZ|;{Py$XbBE@}=Z?>J&yUX^zZ2fRq@4T8M#R4z zP6(G969OD5n&qd|Cvwbol6wInW!nupQ{|p5MJ2 zD8ZxUxROaNSI)4>88>WaW~hGNDVST_;GuHV`<^()UWK(VxZ3xDz-uiCpODC>DG)h2SGg@EK9OUe$p`Pr2mcytTNu9+>z+LU z+{enfo535E8`Hn4+^pQHF83Y1qnul5O91}k!PyhwWr64q&%AYJzW0vY^>HXN*MH^6 wJ4e3%=KLGCL!B#1{H~H%QW6V2AM{=8yME}}{y!<-fHXx()OHfNi@VSN0D`;X&Hw-a literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f209a1d42fca83641955fb6e16c83835c5e9c95e GIT binary patch literal 1865 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 L#u%=hX7m3Cx7?>L literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86c0cde23b2dbdc4e4f267c3b8d82e5899dbae0e GIT binary patch literal 6055 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89bb669c049d02a7baeef32d5de6b3c23294f2fb GIT binary patch literal 5229 zcmcgwT}&L;6}~e&GdueO3oPa*vGE4mkWK7eJ9gt1V`}0B;~$7?h*Pf`jn+G}Ft9tj zzB3rJot1d-18$r`luE{Gq7b!Guu>`XM`|AWVCSh)U!W)gk8IUZ+K0StLZl>q>NzvJ z3&yAqt<)>+x#ynyJLjJB-E;PDRaIUB<;P z)!WQ*#{(=mMP%_hkv$)=&I#f*w#*AMUqx0c`xQ>{H^UIQN~ue6a`kmC9^51iD0Om` zT$2*yTIi{l>l9WF!q1V_gKWoSO?bzbxJg*Bs)jC|?~zXS^_)C=df=4h>eePLE~X|8 zOFV5TG;uktSll^PhxVXyWn9scN|>=~Pi8een^rC;n(PevlEL*D%QvhTQqt*#rh8Bs z&M2AzY(uQ4xBInoL()*sh5pk6-RGpCzMlS`{5zdFs)Tf7GOZkMofuIK<$#_`B$W;j zAIn}Yj!rBzKiFrui#BSwdorI|$fSSqU-2U3ZQnx5?FSG06?e|t{d}dDcNjEVrs9)8n#Yxs_`UBaBTX=&=5T zz7PU@@LT^52|iC#zPXN{&hyHKSY}*W|P!<@aoJwOa?_>iQ&*DN+>3?mh3Tx79`Y&+6~h<-mz) z?!K>Xt^LIh^B?4YW3C2cw=d2m=4%(Pd~)g!=4|)umA7L{!PsDH}p9mcL;4n9<@aSWl{%> zJ_O`Cxz8OgaxC9GH&`T4Ex7Dzkz2=BQ55<5wZ`4^uD1(C7xK}gpSbRn_`b8Y?2)Hx zIyrlIdgMmSH$04SHpIQ2z(9BlyJ{0 zdu-hE0`B=sx81K^1N%DBEz5{-2`zL1d_P1hj|)mOi7_Rl8YO8+)t*K|+76pLX6Qlg zNn50-x9$Br1^9Q17!?#Oduf3)Dmc2mKbr*P<&Xi^FPHLz{ZVPn0&n1v>|*j2sQ|MP zX||M2BiyFj6l_!xZB!9Q0WG$c@_7MOJTu-csNyMjO-}_?Jf^pVDq;b95LN!$HOr{7 zbxpB?D&B&pf+{vocf#2LEAXQ&E{$;oJXsh-Snh1jP$6)zY5*2cBI!=-pj*{t$>s4> zN}+TYF5=r3aNMQX!xGE0H(oB<0`ur@Bq1O=9>Rtrhd6GAewT0AY?zU!U@DBWQR!3U z8$SuQymMgM{UF#l=YGHXcJ;im@cPHn9ciWM_)4&AT6_@LJuj{V!qePZpkXzzZ#l4U zeq<#Og?3BpV*PU9<^K<6p*P%X^S{zA+&jzz{j|pa$^qfiT|Cf%u$Q(%Kiz|5FOq#g zERQ7V>8znkk^@g|*z+VtIZn3$Q>Yt?1Xt1ffgntsc~nz3b-Ks}0EMcbE4rY5RNFka z=j~lZ9(cgIQV35atL>_ox0+18qK+HiY#+Uapq*w*#A@=68K6sbq%O!3!5=1m@`@E)(hIt7?NT1MneC!s+Z zz+$@|m@C>Vc;18Aa2nUfX&7=d&Jo!=ilD!xm~7=V9s|QFyNm|Q+(vDBe&?%<^_t#6 z67~-`QNmMKglfel)>A<2_-gY7me!ORnJuH}=yv_^VNHB z2@EcYgSLI=t2!Yo(aK3to^9>QyE~&O>&kmN6QL2Rq>i`d>smtwM6Zf*yj8lKPH1B= zj_Zsjx-3k^ILv6kvC(NQA(6`gs#1JCDB2DHq?*a4)zqX_jX4{}b&{QhAuelU7B`wz zH7j`Lwey!CW0U%Z`p-$duU_cy9uH++&RrnE3>a-9O$pV zAJ{P~ziA>C*Q^DbR)g)!!S)4yB^a5G-S0dx`^Nl{`L+di;mAVUqI)^`!@KfyY%Nef zlmA72t+{pn2OoBP&@sP%DRSa&{axX%ywrGhmb))D&T*fKyNW^Buh>BR)iXzL9G(5q zif`9c?18Uk)wgfiw{PLdl5gLN@8DGIkuNZH)Av8JDRd!c~OuF_EqXKJt33V~#5=bY=HPPDUXujFg?zYzh|Ngt)sdOC*7_6zPj;JCcK2ZqRc7mz9PPv5h1 zeJj3wp!Mb#7LF{|uQb2B#5ELIH(&Ko?D|}6TxxpZGx5dm;8MOOF23q3fq1HlZr~p4 z=q=V|uZWC*-0bkg}NC6uG8W<($}w<9OsZbBONDr{w+gdPO0oSHj|_zCtQxr|*H z_JAU)o8Qb#om%rXO&^^(e&hJu-X&jnzHQkTUgE;G<%Jt8!I;dc+Au|H+w|Jw%S!PX zv||CQ36k|lDOrzTvK}dgUetqQPzlaq-6flGV5b`X=g6p9A}u+fU;|P&4o2PCk%Ns` zjs@A5X@7_v+gHMj$6}|GS#{BiFb(lpe+x*_#W2i2NY5(i`P^0Wkn8vtX?{p{J|r(W zO~{rSxg`?()*E2zzal`s-CK_wkYc2PshPXB;9lN+utzyQnjM*&SZ-)9 j65tnfyIM5Xu~ppZVqTaH770}Ikbpt8z5xDXOp+8h((mXL*|g_t#N3)xs&jM?LkkR$F4IpeO7 zD_#+*h`U4Xcx9+EUKOf}SBI+OHK7{RwMf=jZQK*`u(T~!7q1W1v$Q?d5ch_>@y1YN zyeZTaZw@sxxFgmQZw6m?HH!5Ma%|1hG#3obFZ;(E4E@-wy(+W zDCSp25`xbzXScRf&oyL9AR81AVu7#=j{4kK$g`P$tzIJ(3uD zIbhFKJom+?4}|w0KCu6Z#|97Ogn{T#GG}`XwIau3a!xoBRg*c#U?eU}&y9}(VtZ;V z8BL5vVmaHh@>j;?(IGh}YDMDnqbT`=zCT`3p+rzItjKC2c8Yo+_Q#?lqX8jj-Jci* zP|msagoaYhxsS@DlJ@53CdTBPOUoaX)$v#o7%Gp-W6I&^$O#}ip%3Kg$fz7cndNB( zgPWk#QF#RYz@#8WEpv7yI&=a(8Ka?FpOr`A@+jf6KbxG0$@Ho#d`@^yk>#P%IoE{; zx3U$`OPtJwc!>*{o`+x!nPov1CDR_1$QJyw(nqBqpk{(j2mvwYIue;kj3>2WOt$oo z`l6#!^i)(DkHma2R_0UKn1eZs!n#c{O~PQnma~P!qnP<{IOhn5;|XazMrl_#{1vp< zORV9rlo$$!m1ev&R~ZgRMn@A#n)*={P$!^D8-gp`3PSF)SYLcJ**Dbpyecbd-$6Mk zkNO6bs1)rRkkyxyiLt&hC2>+t_K&JjP(WXNLLNQU7mFV68=C-8jcyBW+1jUqm^O_? zhF*@0$ZFqMbgVCY3cXG!eKga3+Q@=q6G|7oo&q0!D$UO~xDSQi8?KtK4`y9e)1K*( zi>(<~`;ySEY(y!mo3m)sw(4W(QiWToLbc+@piePj3Yc?Ft<3>NNhp(bS_X3)izH>p zT7m`#uLw#ny<{B)5U89IpkM<9?CqNsPGT!mt!#T>{u*Hd^g#7 zlsHDE9;rIaCnaRnhcD)n&w$l}gUS|q{hBUqBNzpJ_!YXeQR_6pS9Qq>06i;*5v-mn z2qxhjRtPmHN>0fnnI%ECNTOsJhC+W`3|S?cY?JJ=T@qynV2;;?kaNNkaDniijzxy# z6Nwn;b8PJ_MJz6rbY4NNG>Xgq%SU+yr-p9}Jij7(|@%00NMMpvtk~B19!rKA%sa zFHC$D9gQZ#;mNwvAq5TagQ%nuot@>f^(|@Pyfa(Zlor0@U=yCR4(amCnqaa}UDa`# z{Vx1gPNIWPa6EP1bP|BI&y*Q(T``oFo#9oOQ798ip<23J{V5^EowVFtcS=l&Ck>;p zq*$pd4}a4n@hS70FcVV(Lh}zTqc%xc1ret#NvDA-Sz)A3x{XvZPF5S~lxQd|NxW(? zR3!RbW7H_dfYudrMk-|~V6diytG0KDDe?S(zr^$S{C{RX%?Ip*lO~^k((F6q`-~5K z#`|-YcvO;Nq$HwJ=z{n&gCZkEvpX+!+0Y!&(YCIv6b_qCh_ITt> z_;gfCo=^_qZJ?>>q|9h4Cy?}2NS-ORRAd=~MuC)RA_$RS&UvClPg#}SRPZnbd#O|` zqSc7>0H7+74v3TYcL>yuIi0p5?BcnXa8_OSZc1QuD>;v<0=R>My+Vtyl79mN@rHIx%x} zR-8FKJ2clj=bf+4xVGJ>^-MoMeQ0Le%&D0Zvyp{rf8NU3-M1ZFrRO78^@Stnj=WVr zYk9M6-oND9ovo?AwEp6HM9VdunVQbo9g8)AY-4-2w(+*pQt4RXEOy7ID$(xO_HEg> zjmM|r0y2IpSHYjB_mUv|s-}i>wxJWzm;^hBsR^YUMXN+C@^^LiZwAP&k}+P*j`Bs~iO~@? z=~HDeKU5UMsrOn9Ivg6G`F#D#h`OtgBdGCqpWm=>{hBHZ1a|rQeWT;?nXyt()>Bpb;>vRrkQirnq~f4dB?T`~u!gCgAs7WuIJ&zmW;eHV*w z*sG^|W^A*)3toSwCXlhOza^rWwZBQNG`^!Zui`s90Q9WT$clVNwjptyWM-Tuz>tBV zLp(-&1g^57#11aA$hKAdWn(6fJ>bYWk0wqVb3EC>QlK!+hA}=Ocmdy0Nt{-LIWwZq z#ax5qB)q<)VPZ@aMAMi4%hmJRWIv125>8^@XR@)RH>+9bBvmJ^2#ck%N1G-_J7j0w z%|K)obm6x$gTSy+UIZabnWuy)(((n_kP=h8p|hu~5Nn1Xu@usaGb@t4jn6Fsu+duHBw?bu@D zz(UQyb=N@FRWto^#?^7|;7t+rKV4ypvftM4;0Ldi*OJ5l3X=kV5JP{7no%I*r_vOX zmfUc|S#@?GFYsdTjJg6&?#)~5VrP+cDMPG__-@v{Eds1jB4Pf2#ISHF#Kz;J1)lA` zAI}c4x?o$2minBWOUA}3&ed9jdB1ZX=51Nsv(^0jD$TpWzy5zz{q7Mg~kX*!32H*)!PVCEwI;VP>CBBBoFfSXuCnGD{0pt)k_U;@o?gMCC*UuQlspZ8)dtu^jXg> zQq${}P}7=vG$ui62Il6nB`qjvDO=Ktl2&P>)P}f?nHn0dcI4Y7pVT3B(s+R1B6R`g zle#gFJ@{3~9f0)$)(OW|m$Xjq2CNn^KVUs2uwK9dfUTP_2R1QNIkFE5vmb_u;YKCP zM5BLS#5Wv01J{hkKyXAFR*Mg-1Wke&X7Os1xC9%_Spze9O*i^92S_9a!?;)kY*-AB zCQ+>T1{0$)TZojpfqVnl?~PG=uX{Ly4|I0^%tRyUem z9=s1eTC@B7QPvyXbB)dx@M&|xD#4)F&9VESi^FjgACHI2qkU2<_1zEOmf~2Mhx|UB z)5>X_!!fuA$-7prhb0(KMVZ&u=RclE#8%DVF)E3|5jjCCmvU&HQ^xi00AJdRkQE9U zIfF_y!sh~_ws3q5nVhS17IGr%X3na=JLf18OtFok62c?};}oz3C|P&(km57zzm@-t z1o`{m26OUUi6P3pqZ_5AzCW0iT-d-v#w8afOzeT_%7t}96NV@G4Czf;nFYCm(+mbG zSI&tg@g(NnG1_q9f;(*lEyBjSgNstmp;zOQWFWAoq$MdV_Do>AW{^#7pn`cOa!zbb z7;L4`1eZ(}Gw5i>a&}dB8LK&)k<8h{#$vUAB^-~8DOPGBhGVqJqdT8Y5n_gJ%_|7| zU9KnQV41Ac`O9#OzC~3@8^gKe;aYmHH}AgMGA}I#cBh3Un>Xw6!dYt1w)iRA$egC< z9R{?a4TY|3=dRiAw}Y31^WIG7uEowh09Itz1rWKjy{w`4qq?T=eWBoQUFD~skK2Xc z%J&gyD;IbzIa0A}A7}-$wz_~vlPl*rEvW%AD(7#NgaQr_Q#mhdv4-x4v<$ADWnv&k z`tUoJ`v7a!dbtYS>qi?_aQS%(AEB^~6%M}(oazw-Z2ggSd#0sJ(TmYp&w{(>x~-=S zpk+o{ZtKgm_03l=xVK)nZOyvtrjwT@FHX*GS#WnR+PZa5T)(B?#;=-m;yar7m7NH{ zn`Nh4!6ZLRWd&|TW&L>;8-kNH+BizIQxJmY6;x5qP_Ski6e8HkYJKoU4*4m-YBK`n z;Pkd!diA@nrjrY{-E-TQH|)-A*o`DJf>sTI!~h#Y2#I?QVSu~951B@|A=69vW>b8M zFE<#KKVOyNFPhHR3aB~7KZ}rOsnayfc6iNHpI?`T0mE5f@M&Sp#C90}ZbZz$RcYRI z$FD+5+XD9)O@9uc+KGUTyxafw-phOcwsQYW&;0X0ed#AJeOJ6*xqrd7|5HRN391X# ze&Mp<7gkL~;aifc`d$;kzE>-`{~|t!6Ve#u2ZU2Gseis;fLBt$u=cCv%&0%<(7zhe z@1v5wmqH$9&vIpZrm}s(rtS9)l@d$g8_}1)SJzTJ9fi0bvBCQQsXb-F4oX4X1EKz4 zHKeN%?7x`L^5+{;X8L~5a_~El*K2Omx^6O|m_^(RId_-ThpN1#1R2 z#~@iYMcrF$c9d;@t#Lvc7Rr~jseEadv7HtjRpCY)0xI3OLZ3zx2AQ44&f9Qed{io0 z8G~>pGO6&r3i#y00v`Viy_VVe-jH;^lQQMCSRAZG&DW+~+1mC@?S^dg zy6c{Gc`M5EHV}lyt7YlnFkZswK>uRM7M_yth%bHCoh0sN5A*^5rs;Ib-;r(!kq01d4la88@^XIJ0$T|`(B;lFeZUcQ$RNBG7US21z46^ zY(xN89QIbc7risx-)qB0i?cet_oJGoh1Mnkso8mVu-?ZXX7mrh1IMwwnI>p6H=9npN{+7tnLQIH@Q#{gGx=Ge^;;@hw(zM55 zd)@UdYYHp@JBK%M=d7v1NHNuOqr#Mv?XoD8(esU z1(+>lj~Q-2Y+{-*@$SjKLrjv;MnH-5C)-~=kvMITE^PksA#4Q8LFV?uUXX>I&!BTG z;&ZgOtoYD7ZNH59HJK4vN*gq3wfL>%5d1UKy=2JA0PCvz1=`)um z$~4dVb2tm+92v*jQQzaW7dB^CDIijsjC_881S22*BvNZ1D42&x!Qiu!*;s~{P$HD@ z7z9u`fE1l3F-E3tuE^j-S*>-SY>!F42!+DXbYhB^Yb@hVqnt_0QFA(Zmz^-&qK-8%1{1JoGL8t~CF$(HOjDlnZ2iab|#KZE@Bh|wFZVA(3^f1Txi zYvJtMKDKTC*cQwSPJ7GD;XH?EuI_gf<(s&g`n2W4%GwWIwbKW`{ZzIIe#p09yZqYn zy4{&|yBB)*EO;Nz);Ha@3RRA@@H>~yUUSpK*{i07X=%yUoUN=)JJ}3sD@vXbLC&fx za+WKYe48~d1WBUBjqyRC!M+!^y1Ih-IdPySDBw?MOX>Exd7CX2&Y6~*aCpE`bglRmfi z-9lckSMnJ<$Gdz_Cva+xot*SVl#y{df~b=I8;?o8`tR~5$9wr3?c*UgSd{ta1fnSNe;oN zY~q?be$<8O^u`@@5pLZFvq+-e$G;^S3RW zr)}oMRohbSmYZg-y75Ncrs?M{efi>-XAfuUHZ9im<*m>g=by~Gxz?VvaKU}feeo+9 zTjQs<8iC~Zw>?~y7u(f9^-)dBLi^VF2j@2~v_7&}^XP)>(Y%=oK4S}+Z*=#s6RvLP z-^jhc(YsGD7x)XkXC@otFItMfA(s!1X< zji_hk7y^C!nR}^&mfR)chc7FB_*LSku$a>vJ?FcO&0}R3P{XwU6GV)JVFH+fn;B)6 zuCzb1?-`LtQUg*bU)!Lrn-UO%ipvhV8rkncE)Nz|Q1}tIY z>=i`Z%eK~xt##(auWakeuPzvw`hnvT4qHOBBDMBO@wDEE^8b_v37P}KO~A?5GRuUCE_c(mxboJ z^xNw$RkDE#Gt9m_L2#3VQ^}DFf#l-swU8K&bB^gl3$~53@}f;UdwUmE|3l{VFYY;~ z+OAB=v?g)n8X_8}v2akEdWnPzQ=;Lk8k%D-MayDn`mwLwhQ>LgqW z+XW^eZ8y=$-zd(5K|vo-GSl01T)@IVJcU;f!p+3_=DJ)~)`xrbo_|LawT&-GHbz>c+97nbd>nfeZ zxK~$qa9GvR(Pm)P9_qYQIB^5EH`7sHjC|OkBm)VL! z+qY&XkK9vGDIOGG(2zP1)fNCe5|xfyaX{ zw~{+qa0L__;Fy!$FoTVF%27O04HMU4!0*++JwS&y77W@F?2eQLhp=cK@Gzgy=O?AB zN9AGM)j8pdlo+}9r6za_=oXL9zh6s$hV)d?{5%cGBp0k&#(%JNH8PV+e3T@-OTI1J z04ADT<1#g5{2+W5j2KfGXwIeK3&*0PvZ|f0uGZ)<3?GP$i!A7%(nVEkb+|f&Mc}B` zBH+}B`C(L0{w)P$zOqAeIg5_;I6;Oec#?uc2y!BOpGsaEqhE+Mp9s#fu-Oc2FETEq z1XqI}Bfij$UN>j(h0VSrTh}{vY27q8oN3*0ZZLgt`e3$uJx+zC zpPA;Tcg*x=J?{7(M^ z`zp-8s1WznTZ?nBiU&#e5$&yz4M#j!wB<;oLCl$o$A(6Da=(|`UV)3tT+UlEC5~`Y zmXxJz8*9p}JOwMpil6unIzf-IG=+$@NQ~;%WM~uM=pKq$vkDBvSIT{oZPrykx3y$aOz`-?6gRdHgHtK$I2`R zSo?HAPII$<@^^Tc8xhV!^ULx?z^0wFv_!_nV5H{EV~H`gAEg;qFQBVAi<(eyi%B6J zhh1!@3rZLRs&(k)oG>=7o=|>4_1!veYp0^soJYg0FA%Z)P5mjd9eZ7_itT&hJ{!E0 z+SNFmETD?C!>yA1D`7i>@v2bxvaC0tijxhxDq33*BIdgeEKuZq+y4C6wf<{gd9UY# z`o$ejF9e@i*mM+kCMrD_Qs+`>A?vQa5Iq-7o3lIVfLQyc<@W8F_U#L{mJi)<-S{ro z{z=`EYhAW=!`!}1YoE@h4Xu}6yZBoA@Q0NRS%2`yl~*d4{d+V1z1Pm*E&ivm*sR{L z;OYL*<6USB{K|u~&;Z@UUu^Sb?=&abc-NMA-DmE>s%0JcE^bft8}-aU}+y(Ar(6NlaVpH^{_?`Y0RjtU?8QEbf=gWGDjI_Z}c&pTJRbK9LizL3e&gB ze?TfH(#D&r$)jsj^p_Nn9ja-iE~E^J#1uNaZe>^q?A8@-CbQWLYbW89e@~4IDqs0) zWQ{XSBtVqnYkrQRdk7wd7UKo8S9?K%B+PFBhuQ1lyzR>k{!D{Ejk^!+KXSj}zV3Z+ zZrzWASAsYrUe~x>w?0$1es0gT*2TI*X$Nh9Y+CNzn(5rS*tz|VC^Q-TkIPe+9{KJg z@TcR@$Fb|Kmb@8-Y4=SIQQpBpLeagY<%SKJh7EXGOV@JCj!erANQWD38*g!f{b5Z$ zedzJQWYF%1WxBS{AN%Qx@4oon&cAv1{f8I3o+;W5ox!=`d3mv8Px|rcQ`cQ>c{@wToijJO>0IYr3I_O@vAvK93tZl=LcvCq=j-z8* zn=<}oc3ZNXX-=Co<&?ZRRghi=w~`bqJw8@c=ctR1P7g^k-LHmK0FH{P}0)&28y z%Tsgfxi#aTiH3sN!8lM82W(Y!L6cP$KQ}_&99^mYjUR4)0dQKNLFB1AiYG8vG zm#r;w4!sI|PAX9XiQ+X6TT`&>jYVr_&Bf63Bx~@OQ404_jMYT7y`8NPdNQ7#>znLAH zKW;44KYDoIdpm#j(%)`=;u`;NY8Ey>kv@XpBV3X`l!d(N+73ao*tPQ(Csy=atemc& zsmt!%ld0M^ZJO?%o|=t+)B$s+dFIGm2kyGGW;X3z^gQxj9b`>s4ScE9Jr^IF-aq4k z@T>FEe(+54SDx;hRutq#V7%>y6up$XnEKwU*z9dvk5l;-?bD8IbI)>B&q7sCw!ZCq zZrqirXus2rapyS%pWbqCTaNJgdakO;5+!KyCLOY=WYsi(T4eM?4ElyQ?>W(V=zuPZ_kUhVk=VZUD>wIY)fmlu0HE+ zxm6A54NuF=mouJ?MwQBjY4uz@Z>I(hPR}_h=i(Zg@)eYFb5*tZN=j8>3pGz@a2Uzq zUa6(jdO_@&IkmzeLK}-aZ!(E{W(Gko;vTw9r~%L$Ej7T;bkCf5BS_@~e4)YsU#Q`m z{vs9n3T3{$txELFnDZQ>S=*d93p{!*3SZtXwF7msApZcW$F<KtTVsUckC$Dl#>_d8&k-U~qOyZFP$N*`7Jud~m`4 zXr{9t8_J^pJ!yrae3M1ow7L)gDnyj8vWS~!pPzeh{>uv+_Gfwq@_=ssz(a+bSE@{6 z8@AHK^|Nhx4$=I;3Pt&vN^!?*G|wTrHpC)Ahg`n1R&1ID2+{mD7F~O2g>w1z&0^Ec zNS;G9?`F|^C_yg2%Oke4Th$cPt!l*VRyAVgL#02?5RXJh!(n)4nbXg5LXO~i{wGi= zw4?Jl5#(bCast%@BuNkgf8rppWjK+*rYH)i7Av5u``C%#^~~{vH1P>&wSbN=us`cS z*A{Xnb!*NH2fMP5p*x;PCKGYEd*tEd7A-7);MWLp_5){zWVV)2HWP3g1v@BU zyU0a3$b?5PHSykcNJDonYIZr3SWI>?$wp!eBT*nS*IcXm%(h4SGdX*eze6RcLrz^p zh?Ou*~G-Z#DLHirl@sG@q>JF|14x&xQK&f4h@+IVO7EL6jt=09t{ZQ)TjaGOJP z+s5;orkg3f>5i?5$EqE{?OipzE3Mw<5Zzv1&38`wZ*z!l`>Xk`=@%&7mG^Td=N;2g zfrmb$5HiH%%xeHFiUn7Ca?#xQv9S3!?z(SB&mQ`)qW0S_oIQ9$a4ZWA8KL1rn|u23 z?3N{452c=&Iksf$rqsTf7nW?jI9MWDAfQBNdgoUMmxY#$(DKHyx%#En&F}VJ8~&hw zY3tyU@D#AEDsQ~jvDCWfFNZ(qUfTQAlJGQ@Z~y9%WuY}Av=a6MOSYyr4$j$@TDH8q z^V*rEZHI50O?Z>7@TT^R(0P)4ZJx-;|q blF)TSaDMa2uRb~5`zxU_zXeMjCM^CB0d6Dn literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..897aeea36f01173b0a0a28385c89c4f373ac0daf GIT binary patch literal 19163 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%0DsUoN3G8T;6oZs;cC5MK|rsimt#W88}?4 zI2+v7A~0)Un-n9V6e}?)&WW6$35k_$5(hf6$pW#!oI|o-=2LdsPGpJK)be-uOP&Irt7q_EL)$tQag_2v?1%UbPTtY5i=Ij zMl72y#4gCOrMv_Kq=d^AgEE2V^&^xcQrnch)`Cr4#*f4%v_kuU+=WFsVLq(>DMBuDaWI-Y@qov4!)PO94 z3kMRJNlO8cIUTp*Fi4o-97lnef~YT~^D+R_rpxMFN4HK6LUjB1QZlO<$xQN`E@M6U zhHS`MY!WMylAM(Fi$*S=%;VgmY)ohrT*+)f)|Qj1av_;77z;V=VB)0%NgeLR3;A^B zVtQWIlX)ed6qmuyIh@2wW&uVo%c7;IM804;L{ZTcLljqn+ZahS8~fp8`Vf$xp}Gh4 zjh1XzeYKt_RIb|4fs*YT$6)QH!zJ5C?kyOEGA*@$&{F9x5IR)~H=SK6&dLU$P?O(p zx2=UbqK}=(BQ4tojy)s#_Qw=0qb^B`HV?4E+hClIGt>@o77xM!DX)_=!!Em_GQGNN zG!#W3z7lEE&(5wf7_Pg4w6ye*4->6rTA%?zfFFg}LtsE3hY5=CAMw{hs+k_!XK( z+o!zUSacS}xs_j^0DEUF2Me_XJ_xRF7H(!NvxM~=CgKHoUePpSuH0OVfVE-thBqQ8 zn4uTA%_)(_hPMVM)Y?MPbR(^0i}j}?tNH!_Ko`^4y&Mil`M5FTPJ!ag9T@A$;b z%*lxpQ{v3j*>f|~X4llr#O#!Ka#}ona(c>i9zQoTduB#F_s(Y=g^|gKrm!F@^9zPf zOa<#(X!7NAa4{jCiPopCMBCuh(U*jY`cHvSJbC;dzk21>vU|7|?*EheAcA%E{L3uQ<6e_;4)INeh*JpKQ{ z@I2Fo(5K+9ZNyVBOc44E*!;s2v6)fjG@!B-d}3)$0zB$Q4ii+h<5q!Sl*jV2l3N0% zVeIDsZ3DmHuAT+76t8#`tPt-6E&c(t;=P0r$AsfRc4E=n_<|-B+dbRPu1PXi0`iPV ztaDtq_xs>rHMqAD+Qx)e zB71Zci1}>MCNZD0w;Qupd83)mp~WXaugJI76p8|M-}Y5U(NSa9%41@sEK z>ivRypNYGt-+;t~e5c9f(-I~+!`*}sN4UZz5(!htz=K4_CR*ttaWc_-d_bD%Xl1+h z#U70lBhGxmuJ{~K%5>-W$bxc6l7(!B4NL-Z_8Sf(}ASo>- zNu4P`eh$l;HdWCLl30_s6^)^!Ns}?TBJnOO!6H!&zeq?cJ2rW`86@ju4?Ipf$rff; z^ZcR#?<>;*DIz@=EDH}j{2GkWiJ2h0ZWk-i`bClCxnjeOKw{h17HK;>XUIw?;r9O% z{Re!U1BIe%;&rj)s`-1X{-KJ0Xno}7_>J)m{|hCawvAN$BkQRqU?OZ>g=$Q5UaDZN~C2d?iepn74ftj(9T6d&2u&35PQVU0G(fA{`FtqDhSKW&Op*7ES z&u`DJkKIh%NZc9N7=CSI;Pr3(6FaxN#@9l9km0+(4@TFHUO)QDv65pmx@UcABRc*N zan9XWPL(FFjnsPkK0Z@AV+MO`p}|kQ5A4uW^YlH|iFH4m3Qz50zKk+capB88f$+l) zpn&N^&`psX_mjtmmd?teXu3o(o0FDQ!h1yV(o$M&^w>pF%4NWA#BJgL5HobX@u)k~ zc+jU8@ z?ho>j_1-N6Rejt8ynPEnRqx-;@2>R@);UtgU!nCqXU`)ZWb1h3Wbuf}=>^>sj6xpr zVoahMCSl0*!1wDUr&P4L942wg9DoO3qVeEMSQA9JLNdG*2|Wf!ba{Vbq4qpITqFATZAL;AFAEQj-!@okKwb> zMk1{~4W!O74D(my`VI}>~tZ>0=%Xhhfzu5-=VLSXU0WkyLp;H^^)VHYrI}``{ dEehR>#L7d*Dv{U9DD-dPJ%-u+5D`lE`!C{@ZDjxe literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df90c3dee4d929cf57d11b9666f4d505f5a5cf45 GIT binary patch literal 13574 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 xSrcP+zCNoWgY73@JDIJon5b`?-KFb%7 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a35c84ce47ee57cd1a521606d31d0d29782df6d7 GIT binary patch literal 9318 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7aa0887376049273352492dfa2ddab7d61385692 GIT binary patch literal 6396 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 C0zm`- literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2334e2fb0825a98a134dc485642501094f536b88 GIT binary patch literal 7154 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7be11d02cfd78d5e3f2283ee296b7dd2bc22d69 GIT binary patch literal 5334 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 MvDiVlI=ajM0q?2kga7~l literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d604e8f0d04ff4e9ee9794c1a0fc2663d811424 GIT binary patch literal 12117 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 X;_54+(S(`8z~2s)JBTqTuk(Kav!r}= literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be7cc08ddd867886536ee2725da769df6a5f8e35 GIT binary patch literal 40076 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 z zK7*9G6acGo43Ek^zeux*c67i!(@~wqnZm~R3Rg`f-x_&ygm(W5#eTefx^exDk`2@T z4Yx{{+$?RLDQ*5%@0I3no}MjTrS7|5?4N3YVVUXWJ8lGaPJ4FVgSRHpyh6?wsd$aI zUP;=1yO_78U*fIlSIkjLoiRu8B|r1PbeJ2mC2W-}VVkgFhLb6jTvP;6A7t?jUYnqRBTjZ0@bAYlZzsbB2IBrsw^?ns}x4g zSE#M!NJds+I&TMpvyNcOQH!g|*wZB1Nhvehsm-$aGR*ILw$p_+b34&y$POw|6z#;R zz2Ko8In@sn6p~B$C3l$al+jXq)KD*}IU-e_c(+;Pe7WFlpEmo$0l5&ndqsUVwG_XR z4%BqMl>c^tMwWz&P5B4zk*>s)u28LqI~+8H7MZ>-e!;@!l<4J@%4Kr7TAv`Lq*_B& zv*PVijlc+3$`xo;nVNe!Td$+r)T`ubsT>DXZBnJlQe6#)s=b4_DpTB&thj1ZT&1gzI8;A;qAFCQSI#ZWb*Kw2Us^V!Jzf)`L?z9`{zM?P?2R-P3B=<#z`f z>I*`(8OP|qjv|#Qa^8fK_V#En24~eNgcGElJ#=lVkozN0e+Z*-{Ttxny-ahgnoOHt zXoq#AwGRgMp>~D?B|<(Y%#-nscLyYT5R74nr9>xgczcb?e;m26T7$ZAbsq0(`?L}J zV`^Uj;lL3v@AKTmbF+)wj;z%ekp5Mq-&rJv%@$)#SX{V{0q*=raBuo#$4$+h}9cZ8Sv@>k&HFus~)vkL~^@4R6 zMj~@b#}P_7WIZE!ylG+^IijCX;x2lv6K=?c`#upHDGl5LJ`PFK5ln0e6Z1{yud|6ROFbf?HyRz7RBp$WqhD#K`2X zH@aT!n)$e1nnD(f4XD~nIr`)I%G~{wyH7>$Ax=Yirry;i`MtixlzM7Gzta}1rmq3f z4er7ef@khnancF;;7aKDaq9Ks$1^74sYoKeG-;ZQb}<>hNi&jGO7=+bQ4DojstO;s zXasg5tu_J=O*}O1YoHOpM(fszt<%0{yj#XWmb@}HG4`d; zO$FbodlR=iuAKI)yvH=YuN7CfaIK+jLoVdWBeNe>TWn+&U*zks zSC7$gaKkek>gNPZpMmSbKdtwnT7+Eek6_+cHKm_r0lAQ%yIrBEeW`#Hn0bB;QDu|J;K7P7Fq3K;YpIE2U1 z6Vy7@wyJYv%K~tu;blX$jhQ~i%#05(-YSlU9n5J|n8i*RD~VPI$%T}x9rD6vR7XFs~oRw_=DL+IOZML+nb0w6znHMro#k=0kC*`<&eo)yu zvP7U+)>PjNN+r^t*xIQ_TQTwp(ggl%lHI;nfB4$jsg|1!tKV-}JyU=9@8@Y^e7>y0 zic@Zk$*&NAd5aukszBEzarwj7kw|%$YUC12V;lVGJRz+jEuM5frPIl$bU;Mu@-AkR z6Eu}W{0LbUvBe{KM)l`u4gDq(Ed<8-MX!V>!XH|E-bxs2xcuCu=f)rYQAsuYAGr}W zM-fmQscM*Nc(vwc<%*fg71vs?ulk*3H&^eS!T-v= zRq4Q zuKkU|9hLU)G{bqfz7y^bDxEtT+!?cix|vro;ibh^v9c(9<+W-ZCc7wi(Q_-k9$+n6yKyjvU083-E7zfMq6~$~6pM7eFX$bg_uzZGu;Oyp zr7nO^*04edpNE{_Ok6iX`G*ZV3xQQc5Ixgfl z%8{R8GNv0iDuX!G8 zSK<*Ao-uSnR?MRBkdG$~%?srR1|)h#oZGR%{r=5j;)$Zr~P)Ib{3Ky$FkeaZ5Iw*TtB({5|Xr~9Idy5 z6&Lo7ch5R1QjYz9vZUeK+8ayOU)VFg>te~p-is9zU9*n$DaS*9(g6F;*Vnx>bfe+W zh5Z*jlckpevyMY4N7tX!w_HhHZ-!1^{lN?S#?MbWCq6gpIEa|rE$tV&EEJ&{l6WD{lFsb>t!$Lg1rle_7wN;L{T^{arh^5Xd^=cUj6*aEK_ z4c}Y?f9Z2pOnI)9z8L`UbXKU*@ZG6$I2*+n)5!MXPk(3<(KG*3EC55oW}JX$Z5-$i zz*I6!o=NW4an}J!6=j!@e~DX~DI1t?_2TGnp5(`0KKupv3*fI1QY;^*D8gGY{z`DD zxIzlP;NqJSO5_3@LM|2gK|)k!lJr2#G%D<3FV3}AjQ%k2V`dSMX_9} z#+hYWWgO?tl4g}lhb2g`!WH<1%qm@--8}ARqz3d+ogAVRa=rLf`>PRO3PW*C@Nq4rX2|7Q&}${yH+_C-Da_(FfPOrR zo^O@fUbji@a-&3FH*vX{Uzf;@eR^r*+(qZPEkutM=ok zso}D|p!A@*hFb5Szq{|*KU5p;A^dV}wA!gX_-Sh8kQ?P?>M96I>oJz?Qj=WDtHmL0 zzzpj!y>G<(a;__lC#}v+ue&(jm|>eST4Jtk(S6PO2yTT>+^7B!*5o$1lS?X=wqsqc z;1$1vbKd#7lk?q$ROY;!BqIkSS1q4HX*cp&DLum9ZlT$YmEw~2U|z4nO52P2uf~jD zgVp#j{A+pkuMs0G?L){qX+PEjuW`gZ01cG`2z^lf<{ccMNu@SasA5*qtVntpC4AeI6=rqhwa$q^%XhK&h=sYqEHMJ&ie?lJ7+L_ud zBtag4noR3X;mJ5{uhE7fH4=Oeq<0X?=xQxcJ%phylnm`dS&2g>HaltPoC1YJ)P~gj zk`jc|#_`#Yxky+&qfe>8wD*Aof;BL(_38yqxK??1U`W&;P8Mp3Oa+}1I<6*eZ8P1h zr-qRYgdQPPH65}SV!w>Gcj=NpB103V1ISd4ni~s2^=>xbh@lxXLt46DP!)@ZT34-X z(>sr}h*?5m^a!(;JsN3Dm5mNaxZRE`m{GqY97XruX+q*Q{rVS89RZX(HUI?6s^ytk z`WllxHQw`#!kh)lBUx`oaX;fVZrGWKLjM8AdwJ+{<*bgfmJ%F>5Vz7)fi>g-$od9x zLqPKQ@lY%>On3ItEjO9X$TZoYWkrR8S^Y$XBK^Ix)`aZHQzMBpx@kMlKsL|7inU0u zYTjl@_OoV(x@J1H+%s!HGAv_;eEjWY`g}yv!T!i_W^Sy5#(;o;0VD>b5Vvr=cZ-N5 zL~Eq`3(}t^Yag_Fa#-av>$P?BeZnUNF5kLs53DGh#f!KDco@EPY0gQ`H{GXk`A5ct z$qc~Y2s!R^l#fePUR)BES%&fl#3-Dja)}{Oen<{;8uX>|NA$|3>EPi9f-3AiTP!5@ zoTt=a0qv5NF8xWk_d{r@kp`c)8rxD@nAtMLs1FJbg)Cybr(C>8XARk`9l*GFpr2*w z(Z3wc!y8FS_~A>hsD}I)$HyS7Q`>>m)Cv(#(q4W>t*8^Oy-3n_Ha~jJZ8*~H9CeMt z9B$5o;P!8; z_WpsBFnz|-=&b7A$Bh3Ha^j0WXyt2edRHzuIHu7Yu_v1Jk@lwVdG50#@U9==2M}!%WL^nHALJF zbB8baZZ)=DssH8%5>!;&3Rb|b$$P<$*PnfD42Dfob*oZkb*Y+V^j|X=cPHQ}&BK>o zoT09)f3IQ#Hee3EdGKb_hM6X0^HM&^)}Ore(uj7njnX7i=Z!elLMz;%-X2KX^htL5N>;;^Ah4~)_NiIo^i=6*)I_aU2U1)Qc944Fej3b`};zz zy7|AXbeUy9)8HJ@Zie*Fw8et!!4@kG1ffQ6NXvg(BQ(3tpz^53 z3wnf3VE01RfliszsTa@)bP5GKg>==u)~^xeF-GY7KD>dI3)cVtN55WQ?t>*8zxj1rUFv50o;u zPMr==8OP=o=r~+}mHRW4pfgpb!CRO=!LiH8B+p!GA#VJwi&G#(Vq)UKJ+ z8yNu|%lAJJ9YVuNmcBa7{iyXjx)UT#Bm{w_O!wreJG**LG#}Np23e&%kL3?}>=*FE zmLSbb)o#Jq+r#Lbo6Uq>fsS}<>Mbf&!8HvEet!Uv1hkG2~P_?dgV;3wS=!R-SES34vTpfhZ2BL3xA3<~meOu;879&xB^7Tm2u%>k`MzviH){ zPR7_Hx*lRDzdu7AwGQ>-ovDIiu^DCccG7Nx;|<@dzMB>8GZpQ#6&)Cr+|yNs?>-lwU?J?S_j4<{D%qlZ4} ziAo6*nV|)pTckHTOub14VrS8zCCjKcJE%81s5d+ADk&75duILt`uScn6Z0|0`pLNo zZZmMcWXI-n&M)sZlNWAQf1)|<7+I>TgOHGer(x(+p>ObcWI#MNVs|bS-FnTktQ9UXlf_Wy35{x{uLVRAiftH&}DnB1TQ8pkNx`C zOxd2lSH4GuIKtNbS_GaH1lmWx5NYDJDw{*NL5jHPM!?zIv*xarHAXusD< z?{s=@uN8I{g5@Y17aCOmPW8=IJ7-qyoL#m1M%kX(l06@}Dal8i@W<@lO%PA=a>4d; z`?uQQyj$+v9?D$9b|j#``A6X_HvJMy7MVgi^M{Ys$E^PdjRpI#z0EOFeT?*>7y%Ay z)PctFcVoB?X;dx3W9-h&ed#jQ*4`*AA7Qn+j(#-*jqo!bHrPb}0T`_V8b z@#iWfpwMzyF!Espjuh*)?dbu<4B=?cMO0aNg1+EQ)+fpL6gf}B={0w^UY{n!e0+Vh zi@B`|_v;CKl(qTaiy#wzK$XtJ%wf-0QD}n14_MOJ)Xjed-T1OkR8K*$P}`FhwIhAnbtZ3z<_GwOQ*<`S#V^~y36tuPG*eZ$l%v(q(4MA z8|AvSMzW8fCwpx@dhK3X;-Kp;voxhxl~xzO7!|}J#GID%akP-?P^Q*_b(m}xm~F*Q ztf5PW5U(*oU#ftPlXWqTEYf{yb40#~S%woaP&(GZ9B#fQ^&+qkVEYEJ8bc8X!JiqD zX=}pZJTiAWhzZgX;U)|<`4igw=Nt3ru4^L^2uDE_ihTx{Rv_L(lnnKHE|;tnWK_;z zDX2hJdxEfdq5Qs^4Txmv7we*0VdN~{s#Vx@`88)NXenge4d1?9s5g0-HKN*N$LkEGeg;3gwyKtIuS zml`%Wi{lfLJ`aor(w$ALAKH%f0Ks+?KMEbZOnV}d#Ns^VD1|Zd7$V<8`VuJ}*E_79zi{K$^9{J~tF1&VvPBw~E8dRqiMmGz*q@~bX7Q)Sg(_Wh`^ z9HkfCC~So9*S#OQ5%p0(%itdpwP@Vuw=dlpw7%O`ztdy?fo}`^zwdGGEOP&Tz8ik! zKO+f69O=V8v8aSd^bSr2fH(>S@P;u>F8BD@lgFw&W| zXJMb2wl^GaJHM^ga-m-AOI@m7tSdr1QWgYe(+V^_2?F!diD*_3D9W@z7Xo4awsl7| zjvL1J9cGYALCgE2XRs_!oW^z`?uddmt3*OE)wTi*znM0{XzDX)rTtGxfd&{-MfwR2 zX2I1H!>|NLfRSq38DeRaCie$I5lek24zpgQKu&;;1&ie8oFI~8;U6C_G(Z8@0ExlT z{(OM&r-Z?}bSo!7)H<8c8}$S4=Pl^;?A|u=j6@T1B10M-dNk5MB=1&~0qn0nMpinZ z1}b`t;T20wAy0*bm`G-fr4C><=`7B(2{~vca_Sm+Xh<06$Dl#7#z0x*Y+y?s)s7HO zgyOV4?Qr)-`-VeHIoVR>FR+UC09IebD!|4L>lqR=$-q0EXH;GJOA2L>{W7IhwV7|j zpG8w@#$dSM1&Ygmh7U}nG+htbL*4uD2m})+1j4n`(%LcZ!x3E={sVxVIFQN@PUnYG zMWvUkE>(SKvF2}pzUCWeUOjVV=}hhFo3-m_YS&-%LE4eO;kK`A+E;t4xF%KnnR&ad zqyW}e@(Tb#{Uv6|{VYN5oo2}WEJ5xye;z2in4IjMdhmLwFr@WSH8P!}BJc81xUW@h z-(r7vi*tv|4UUmf+z#pkrl$X#d{@c&J97StoWCaL19JWbPOnBw5*($6ep!?JGIZF5 z{`w?>uBw>tHvA&T9GPVmpA+5vEiy1MS_Ccr4qZJ@^*~qGfJYGA!Cz8Ie*x!ytEl`} z%!vCf^B+;B@^>_ah*Qcaf@;FOK)2@+Rv}Yq*^i0qfIgG~t2HbzMn*auXRS(=N%-W< z$yex@L;IF6h~%Pk7clApQy+W+qd^P%I726rC+XK}Yf$en5Mqy4Be%S>7Ns0{`8Zdf zsdoN_<-@QEz8iI4C^gwK)w!%(*37}hco_SYXmv1tu|e)OnIQ2nr=@Roo6>pA>45$8 z&F@?r-8jWk0IR0~?Q}AXo`9PY&nWD;k9wrSw~I7v3BxBgsTh4wWy&?jruJw);c9HJ z``#}3w#qfaT09v|2}T+*d9twTxl?4Z=x0Q$gAo{RYkee+ZIvgOoIiqqgTSfu_S92^ z8nJ7_sQ_4M2Za%_h8cBWPneCcEh8lLD}F~xQf0yqtv5Y~&d^~xb(|O)92`)f?b4t$ zbig^$K;XSWG2g~QS)agt1yEfA*+8gU&EE(_U9q`$lJ87GY2rHcjeSG$-i^nj1D#Z| zNvVr61k*RbWXJ+0hT5ygs(pnGGo*V6`QuFSoB*J#E0hP@xaXAzRaco@br?%tae0GcC@wxm3B2C+tvJjy8WR){RTCA^ zt^5t@i+psHjctHTG9z6;jp@-_fZHD;_!8&g0C-@E<^M(o3f=IK_MD3-aje5c+Cjc_ z!BN=O#J2BaB3L207G0gl^VA>$)3)eTTMC0ngGy7q7|Qmtl43;6qQ_dUvj_hnoM4KhN9uBIHC!moE$G#RoTE1Lk+96e zsEdm}aaimFvArW$QWHPT!8)tjN&r?|QlKgQ68ce99$3f*@fm5cknU`TmNaXdz|<3N zbM7BDR6L@6EbT;Yq&so^xF*;-eq8Xy$B*+C(H7SEJPur}L-&Q8{z6#4ZX z7@WbP@wu_{=y5P2`|u+~H@x3S^fVAYOT2WWB0wi2C7KYIu#l2uLEMwHaCYMhESzGC zwnK0CuI639OPeOo&6F&~{p8q&f#r$mKufBj<*ns!F8}6=i;k}bXy0!&ZTqeMkQ~7! zy}W9>+y1WGxxLVxdxBj@ai3y><=k1&CK4!UTdp(K7htU)lT72hNa|zj0ck0oYSNEt9Bla5mYCCUbU#7oDHz>2E`ms1H{m2#MWv7O_Gt5R5kDy&wa1;%l? z@^46N!dP~t@_pSqvj>(GFMd|^S#&aC>(EDX*|9e`va7Uf#J6XhUV-k z8yKeF+UX~Y$4DPXM+WvT2QCcWsl`)wAiUFai$Q*nZ0Yyge(2Zw8*0E#5Tx`jeu7~C z3VK>-Px5qDFWe}kQH|0XU0k|INs_y_{3!bPHy&Lu{8(xE0)<(1t`pk9&PrqJ#RpNz zdfqJ>U(S1Yo3>^rVMhS6C9kU*-697NuxN(U5{}lE0~Hq*Nn? zts#D>ExGPxzZWdA-@=V4$M?{l{NY5bVhc>Ugp~sNkhDzK7oXz{cMW#iv<7;13iZGGM`xoe1TUF-p5nwh1e9Fpi+1p zo>RP)ylIWMnD4}Q)tVH3Nn2U1ZRS*zbDQtdhLuMTPLB0Bo=6l*Frl+`NN+P^g)4fQ zxS9BsuU%6$dL8;8Y2Ghf3oXR6{qpm~3-LTB+cuO!qds#A*87ftwJaTiPzn(Oq@%;f zEuqrHiY4%Vwzhp(ZxZANOZy_&JaJ5E?w;l6cY?KC;Z#sojv5y@ual%1He_02FVzCU zHdv7OsdUU%QjjGZL~}Wn3mZCohKgO4it0a1X-dh}1r;r-b{{1c9WbsWnRiIL@+_-F zfcdWV%bOpopsDgSSj6Vtqa#Dd?*5IY(w5M60q0@YDBSMi)68@n30gJmRQw)astJoy`b?nN@X}N8p%J$T3S(Z$kUO3X@L=PswI0gz^ZJ zpEK#RFgaQB1UKsmd>JBKEJ zrF3v0Dy4K%XRfO^}4W$nYSz*+i&SS>eRB`0pi3!_GxNfkf&ezDr4MM5 z-+B)%DSu@n6t*rfm4Az^3p#0HBPwiNV#5-&d|`7DYlGNL!~!8UB(WFej|I15@4PX67M7dSh733;|ph+JFrjGmTe)e$?1XX?&dp9 zc#k-m{IdJJ`wj1%IO7U}_k~j4xBKJUgSH<9we7JQOF)Hd0aqN5e#-I>Fy%jR-K1xO z-(=l{;j~I5AcSG;Am%C%12D5Di82pc*;KsgSJHNO%uI8|d2P(=cVcq(`wPl13cXxA1<$UI2}%g)6@jQ7Z? zUWlOn70AkQ>%bDNQeA=kvR5J}&+WcT3s=njBFV2lJP|Fln+ct5LwY5$(|*WmZRDtQ zq-if`^1|RoiE!tHt$e?lu;uqF`{eif^Av{I7DyT;3gR4Mo&6ncOr?|z7Pa!_95hTm zkF}n2bA(i(wVH4O2^+(Mz>~{XHi48|7`INWR@xi?b3SBalvcqdPEOW?gZ;Jp!`M5NRLWToW$n|c) zgRMxwlEeNA-Xi2uvo5GI2<#0nQPf5WTj7IB6j9ctx8vqpRTchEuoy5v*VZ&b%<}x8T zp-%Ql-M)e@zNHFneY~j$gX2UhPiB48&@4PKhIGM3wxMPvYD_;t!eqTggqA)=3TBLA zA@G+HZcGg<#@3}{>lR`g=EEDOU9cuO?`T;0!ThLp{0nbarv1-K(m<6*j>(gw#Ybrw zbV3!9@l}%#$c88^qeWkM_cnoT>a70+WS*rh0)!BU))(>N`BtIIBa%wm#e;D=8NExp zjA?8baukK6vG7chO#73P0$uR0#~GzJ_{dCh*_UI{rFQ!n_j-PO+*(kkLXdzXaa%g^hNUg5j%8F3MiBY^umk6O-3$Us^a4mRmmPa1FvJ zmaO|ekVKU7>4!0S zYtt-I10xl^5&z3G2+To$U@I`aBKs**YQY1ei392GB4IM6;Nkpa9L91j+8c%DeezS2t_N3R`>U%@jlb>h zSPI7$!@cQn??QO(Vt7+JylEl4c^UHa58l%7KFR${nfB5DmXDhUm2JG2iIxsNo~mE4^2= zxvi+pDXf8WUeVCivYjP$$7!7~U1@&!)=sdsG1`>>Hk&&VL3793(cFoixz4|7zuvML zTU5OL&ApfQ&W)$`UXN|M+1fQ{|BD!!Io^k6jzr{o^~akYRB@8`I!eJ$Vq<4S>;wh z4w_iv%||ain)4tw?aBF-x(FG6sl8V=|9!_lum0icYyQD$Z7C!S5(nf7_tfiC8Gn36 z`-bPDXSoWWhQ{bx{np6k5fl@N+_pLE0)|%W3>Z=Ltyr1KIial(#CVaF3b7X<%-dw99BW7cu#kbZpl z`9p_F)C*I0(SI%^0jXVTQ$wWPV z;sng1;d~NuwyRJ>Q`Dza3K>s@uP_sPr@T>f#8;vg9RH|c`_>b5qZ=IejQGa2m?Dq&>a+p zV@hiX7uls{SsdGy`a$K~fI?O<(2ow4S^q05_xHi${VjR0F0<|Kg0)dSR3L>Ay<+dv zni0jgg&;JgyeKdBX?faKBv}oLvB0hsu7||h%2jd@zBonX*NEuiq>%My_~u0xQ1Uv z_L74_pR-?u4G|po$rH1TzbWGn;{c7qgAgHXY<{!%QZLmHU%2=}uFe_qP7fF%rFZ@G zfKYw3FGgv1B<=2|b$Ohy`7Ziq?Td+Z>BPG0{`Ii4z8LRK$9ty-|Fwl4_Bs}OwxoNu zEOb6{btv7rZK36HvVLQCT38VyLDhBeelOsVF+T5z-)R@g3PZ^Qeq(#%4%PN!RomgZ zi-_5$@rn1^Rj?*n>m{=0e^csX6%@QzaO+H081T$90Mkj3lE|MeVaCGpBb4#S#!b)i z?3Vixiy*;(L;fcQiUHjg^D9QOvv9_F0!r4RdnZHY{tr)xR_cCsx@1X! z*JaB1sm^5nxHq+X-rvEkJISp(2^}kEGQV|uJ8a+4dTXRn{3>A#Qdrc5y}-fuU7sA) zU*zF@U*9jjd5OQj+a|P_zH1lK&Vz%4-_@j`@;q7?Q3x?}YINK8>EGuJU?1%3ex#zY z{Z8DIB*!wL1cP1%X$Hp`{Fr6zA@mHPc0#l{r7sYo?IxYhmxbATK}*Xi_b#&t?+ap@ z{ghcg#h`-$sZ>40V3+}!yE-?0y_Lah3@F1SC+^PxWvj<0U~}tO)HdjhW~|Ff`d`P+!P$9bfkx}Zd@0}rp>f_w5K1xMlMFt} zpx+D{fgg?iEqeQl%B?C7O#62zojsU+nU2m(*J^0fWfC3y>)Vit#xwP?+YN16$5Nm^ zWlJ5LkFHJ!))*R6AWj@;Om(H}+Kd`T9ne5FoP=CTyv?X3?%!$ZicgrbIzkRPsU zjXFXBLP0_yCD@eOmJX~o!i+|gK*Xpg6jkcN2H$TqDlYGG6QMn-Qe9_M#o!rz=Um^_ z_W7R2(j8lGD@dTxdwI)vRM^BC`zt;s(PD1TeicB?eu&ujjs0KGP?XW3=P``lGp$Z%9^p(QlarddzA zsV^N^YiLN3P1l>QTV>QR>QL$$Qt`CE%WyL4;-}UUiYRTJnT}PNrmjp&+bvI**2sQv z%*N8uzAKKavGlrK^U+=Dz-~jsJrwJY(kX&b!Z&H{PyCe90S}*^z3QOU{SZroHP7 zjd`jSC|w>tf5NC?4DK814JRQN$IZrzy+$o#U;#9wf)_o8hcPcdzx`s|d<&X}^$zl0 z$ZDD}qY>7cFUNRu1#UM0VxNW$Ob?II{M%PPG_yOkGES&x~{f=f6aVoYudZbs1aFY z-w3eKIU-u<9T6>bkBA01bVdJ&Xi*1=xa=VTqKka+{Q=3Nmb5dm+#nJ^Rpr(;%;E$X zm$`k*ycjW$)-xNyp|I97H?Yi$(aHIQaoyg<5O6epJNSs!v{YAbXt-i%N@G$08BF(Aciw6uJV}9Q2xQK;~u>jXEmdk}LVuT4rIH~IiZLh*g ziQ%7VXk-K=D8v_r z0o@u@V{k`u#=r`>{)#3pR}U{U1~F(jJ8{{x##!$&);X*aHZ3$8o$E`tKFkCxMlD)+ z_W8N-%O?#5;MMRlFHoPcY2B$l=IKTi_(7fgplIxtr(0`Y3P%kMS1w5*qlQqSX&FP) z)*H2i(5w-I&)~aIcON0Y;_@%o5&DGc(2}#84F#7uctyrV7ke7FGcqFR{PEBssB~!` z8#;Mp1c3eHr-f_P>Zd1Q`0}&BCLTiGp;xdm!cu2qWE4JAM~246R|zT1u`P)L*Y`ko zqIYXi{50hM_Dl2a`wkqCI{R&HZQ=nUbTC*$Phr%uBzDK_rojUtJxS?AzDf#w_Tf=M zVUVSKNWL95NEyr5McR)Y*Cz_*0pRie%<<9FV=_Oo!!gSU1kBLDSi+jb{^JLRPEPD!d;CEDzA)GzbTD25YC0Kz`tLnr#1MLOeCU8+H;(OJdjL2qEt4J@AD_V6AliiYL%8SkFq|G98N=OdP2R*TM zL(28Q00?}djQBEfk}eefChPVegAU2b1Hk5oVQ~XDk$vLG$jInR2cTzil32I?NxWbG z7K%EyQT!IR9s6A9uXf*@{NlF%IE-Xy;9Nag!YfxC5*U2H(M;V-A@J9^VkY(3C zy`6Yv2ZHWb_4iS5);0#~lu4%kmxvC1W>~lJ0pOT0$_*~`2rQ6bERN|wIFUjjUg1Oe z$e7L(2%Rjotbe5nB)##Y+V`e{Z zI;D{xel=NH(x!NjcQkgzn8ep9Eh2Gq$_wgI20XZy?zVU$DY1D$6Eri*!#GJ;s;^}ru>CIPTaReA=7rOkM9_WaiLW$`w2|pI@oPr=85}`?S%PJE^aQ3C z#tUq@bJf>Z;l*%}jfG$DCRjZt)_%Q*6>4Bg$ZDVhn|mzlfPvisY8-zS#50O$dOY}D@NV0Oz3IW{@Z-IlnR3*ZRoI~np^d! z@jm2I#{Ljv-ms~v`mW-9S8=_oc-~cf?@|zFVA>X(Idjbx|EazC=k^DFp|roJY+q2e-%vVkD6Kb?$PFcV zLy6($>x-dkL7$hScfQ!|6cstPdM{b?EFTUOjm3 z;LJd(b9U8&w)$*Ut~#lPW;W*(Tnu3Q(GJp+4RK;QktR}-iMC9AYbMdhzc>h*=1hpb zCU3RuP*oQWwBfw%xirjM?YZ(?dd>Fv(Dt-H40uceUXYH~dNi&@}-D6nEGN3NWOE zn~kslBLwRO7*zsIMuPww;XBS~5?~Bm5+g3aX40wRTZ{zA$LW!@*0kKpTe&BzhE#RU z^zl?Qrx42Ru?5tJX130@rGv@Ym*(`#pUWvoF*dN-?$KsAgo1KVVh{18T?l$Ba7O1J;gFKnPfSy%8o9vD&eoQ5@)nj0QrDE8DS&=`prr zoKQ2{v4v2At=CGZjZizG4z^>GP$x$bKNv>k(2lz>a&C7c3JSCeybRu0_j_#6x|xpi zy~h8mCge~oZ^BK=w(V*rTwgRCpH?wg?{hpd?}`D*#NrV-e(B}8V^@a1J2LOzl6E~} zXyOfWU<$A>GDWm7G)1&9HbvCW)lLjf5tXA;fO2>WuxNaWxE!DYtTaN!4LL*wD95M( zY7wvPQfMjX|-D2GIKDe;F1eetBw2 z!HmQEj>A3gi7z;?RJ&r;^Y-X}Minh_6VmkI?gd}Z**!PC;ncqC-nO&5Z#wJVafDy@ z8MbOy^^&u0(V0v;lMBu+a3EdPxA4Bk1xM4Z8bq*S)&8OI3^4s@o^eEF5vUP%qj1{ZwEIrW;a8}I#w`z!8C`({`D*}?1n vHAXFXe<=NWp#4q*t1Rjb$F}yyI|o%W;eBE0IK6HA)@K~Hw;kFubv6GBM0nVg literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85675c44d64c0ff44065d07ad09edad9cd00b7bf GIT binary patch literal 10409 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 F{|`n!o{|6n literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3f556146ee529717b201a996ed1f6b99758a5e1 GIT binary patch literal 14801 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 b>tef(@q+EX9vViRDK^v?Z>2uO!NR<=!jX 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c0ed92080f99fd2c2e49a21ef8cb77a7154778b GIT binary patch literal 6588 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8ace9a189d813aa8b62d77cc89fcdfc87c09c0c GIT binary patch literal 3850 zcma)9U2GHC6~5#7u|58Yoj3_eAPftkF+Z_FL-^Y)iy(pBh%9BpqI!$miRapxWPaQ` zW5AIk<$`N1)wRwGX@*LREF2dhU!T z4ymYmmAP~7y=RWk-*?W$o@T{@(-=!tAX zPiB)0!YmO$Mp$dr+p=wNE-Dcv3bUxh?(s@oX;BiG$H^{GO-bUE(h5%-?6kW(sST=K z=_tgN&Kp9u19vLhX8RE${h)Q1woUKKb}=Y`aMyCfK=_?*+^zJ$)2@gGLD_zT%k}_A zkFrDQT@H9`TfeD@6*0Z@IXz4>PVl^3Dyc>>%{j5jA6^*Eojx~udi=eKvkrU8s5qey zO15emvgYuU<&uV@X^*yS0{T0=l{ZUxF4?f>W7s|*feBYg0#qhRI)fY6U1%jU)Th~4gso$2tY=DR9Z#TlypmZ6Bg{Uo473`U6- z0!qx+Vm=Cf>)G-NEUQs_hre5mRD~*A<*NKje3`}$hW|Z-Ze8S%z0=!8Xh!m>=DQlK zGJsBIC9&LyxErnA`qWBRz{ z<5F_Z2c$E&AeS}Ul5A6&Fb&)kuz@70f66qq1JWibqXsoeqAXM$vmmK9)~(mYO_K5^ zaj&8A%_2QEnHCSpL+ zPfZbgRfXR(itsUUeIUV+WSE-{O{3`-8l^XTjVk0-mj6eg24_PVo0N_G7F8fDifU1B zzwQSwR&KN}y47e?4*ge&q*+8Z3Z`UE&EUN4S(FYCNLfT^2^oWm8!X9+LhGV{ua_XN z9G=ih4V5=IQ?_iiP;odKYeLbwQT!+_XknveVja*8?X&7ZoS6?)nVF432uF>fFw2eI zC<2a+vgn@!92;aI0MH7|9r_TmO|nWjugcm60xYSZ5(@%vPXn%Gtu!r9VO!11npPQb z0=XR6BwDsiZ0ni|rJvW#YtVLBvK^#5EOZKo$yxN*A*|ocW^}{O?ja|YX|3`>QOWb_I)u4XiKD&wL3`vZfAG8XvfU`fu;%0+BtN@^*S z1I#NX$q+R^o$;_=s(@OwSGmBMYlJ7~9louZV1V_`K$9a48d}iR(E|E9*?v=4WEX!> zOLZ3hm=dcCUPR9uCC~s`uWH056xN>tg#TD5@`47^G`pV(mO6r8bPdOVd9v1y|NRH+p zyD4APLzEXXG6Y++ty(W(T0pM`P}^INTX!#vKW*(?+IMH){f|ByebRb-VZ6q*e8F|E zaozWita9B?xczmG<&WHJzi0jW^xf;f+*wDkT)Fhyp+B^Jc5Ln7$U0rW5Yh0-TVuBm zFP*q^;ujV9-UZ?eo%|Pwa&9CaWPa6p>XPpP|sSZrxr~;jkeYj?X~UStM%@$_4L8t ztB4Sb|C0}g#d-u}zv@NNBvMn20Pg zU}+e%b92fOJccw!j?lfMFgbBewd|Z($l23Ssx2q3sQFE6i`quh)k{>)#sIJPVQ(BB zi)QKqa=Okg#=q{|Uh6pEbe??FzS?oN*1F?GnC})B+1)!`!M*%af0eLDnx>bNsj5$FF5&b8?y@8Ycbc=;# z^Be|ANN+{CoRfgsJJ6`T1GM(KZgu#AX3CyJ9wOH&*H7Pt-quZ}tl@XaWspdlleGp@ zon;v28QT378h(t1zeWAe(6(o&8|JT&^bMPM#_g*|(XPH)M|Z7zXHD7ze=l1OGeRxW zTW8^27f>{H``lV&M?FZFA(Tkf!;}(HYFj-*sVGWz-EF%QtHq$zL z7{o;v=l;%iJ>&L%!-a30t#cv%edcyw9ntq)?7bgw>+bqR3i08^&f9yRa9v+=;h&zZ L??PO+Yw~{pHI?OU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..906d96027a1f9e1dd4b9b1f279d9ac3e73a71fea GIT binary patch literal 2504 zcmZt|TWB0r^v>+O_mPdUO}dH6MAO)fcGp_8(281;wmu*cTLl+o*zVjWlg`eJcP4GO zPC%r}7K#drtsq#xR9Zp&u^)aYRs8VBTD8ldsED9{+s0Dqm*>pvW@GRqbLO0T&OP_s z^P2r8o7D)w?!!;d?~n-j9hoi&9b&}>;xsXd$=RgNRk%7|;W=XRX39?0g^CcpQTD(yPwX+KAK5eg_@lG?{^C&1Me=?+U#Ct0q`E(7*z`cdqsZ8< z>lt>{4~k+WPrHuq+BC{_h{UKLWuBytN!gRsU$TQJmvGgCiIqs)$J`~ambjH*wZp7D z4a8|eNrf{>g?|bnQ%RXT70lEFATb3~G^KZVQ--@MRHV`-Tve%TYNl{VG1DicilUO< zpP4l?CxnXH5Q@1-+FxUoI>&$9t+UucbV&~us)2sUvTYwoU@5Cx5E$K$mG!D)>NVzi zzD|$TsPC6FO$XS`=KY;9h1?o*TmF07;!b^f!LrRYDy7wJK1NpGvKrvKb+?li*w)RE zez00QJP#oQN8$}7eTE*YLS(^VSD$qqnpk8R2u7s!e3{(~nHJ+cQNHSVwpFWQ){VMr z(kR_i^jSY_Ww+pdiP2z*IW;T<1T3EvJTg2h4+DaN;5yq&+wLvO8x#MLSy(}jcQt}#+Vi=ZV1%`3F zFR8IocVPtGx*gDqT7K%z)NfC_cVncl-pK7i_})*1`G@i zatAyspFuVrCmh5+ISq?CVF)Ze~RPPFRPLkHQLZS@Vk;iC%wQps7N|A9 z5Jcoak&ml5N_kZi+5wyJIIm@kX((~)I8B7=JPnMbiKQjatOhj7B&}=MmP7rdKd@9H z)koEZsz;Mv7EpmHAS$NWAZo~+&Whw@()bJul--61kB@R4(;aan#%Dx|LyyMCMFI|g zwi$H&G$3rY4zM9KkT(o$4x@7rw8Y?QOZ-=`1#Nr<=uh&`i=-`)P5Qf;w=*ZRO|f~T zwe7x73!fBTm#^fB0;FbKu zrTj!IlYedQ>|d@7J2*-xBE`>KNSo!G@2e3-tT^3>ci8 zx-z-zyUAT|?l^P*n-6_C`1QyaBNs=T%1?zm&hEKfn7T$%>e$K0nlrCYv<8P?n`_QR z1B0!Nqi^J{${=ZFhHv_K`|0Oh%^HS^pcHq#xR~=s@ffiY#63ngXKQMs5*`t#N*tDh~v~?*r<_k&~;O#MMdevbdIN<`?t!AqiaodCLV%LF%ejR1;m{R<#TQuqJ> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f39b3f5f24466403c37a056dad8c3f2f83d157a GIT binary patch literal 28181 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 Ozhuxn#u@7w6aPOI(!2x! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f3f2f7a07ec163fbd32d57b4b11d320214730ef GIT binary patch literal 6084 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 Pp3q>B|4mRFZ1MdIrr3z1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe97dc724ab4b9b0c293dd73a2514ec83771a2fe GIT binary patch literal 6088 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 G`2Pdn*5S4Q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59fcc3032e012fefd45f574f7125f002ade39f80 GIT binary patch literal 2159 zcmZuy-H#Jh6u;B?>UX=_g~CF@AfH8PBVwXxfWof$SqY$t^D-&Dm)-8pOzWLlOgAO$ z112@m7~{j@llTOL81+T@AAAA#fpy|Wi17iRN|wZgC(pSv?e2oN?V0m&&$;LR&NK}!Wzfc$~HDXqO24;~^LM59xk|{}q#;9z^9NClwuh@#CnyTPcTXS?% zmk5)18un>++)0=TCut^~l$mnUW?CXKa*9y>3Zd~^vG5c#!?H9nyPpug8%|2vIVW%C zAtIqEd&C(vN70LA;5SOsx1`XEW`_O+u;f``V39~C+sT%44{>8j3Nq(DIz4Hfd~@>T zJ8#uaJw$)drru+9Z;msExju;cSvD21iL-vkX6HI>R#F1}WXtthHVd*5^M2cJf+|R# zVJ>C-4D;q}Kgfns{e0-y2y+an7744zfmtMsm=Yysj7p|VQ&hR4m`Z}IeQ25{K&Mib zYE-9j8e`f8jV3{-cjQtg&_sT8{`+dXZFh{i;bFdp-vXA4q%e(gGHJl7@+t3#;80pK z8~ZnATsmS@-OjoV<)Kp;e*YROuyx&;VG<4A@;t+zW(MHd5!XJtrQEAYnKRAky}X)6pz^#_z3v%Q6L`1g!?|R zD~{_|8kG+`#=XiL%xA7K!JD*MnPA?m-)dLdyfwr8s_QiYw2ISV?!}7TJYQ*d{OOka zQu)P06|d>DgY9}_wm!wYO1s&vSQi237O(JTW4a=8pyhTah+9_EZTglqpA%@&@<36* zr1C%($nyB^p7MEadDD1L`69UrIuhuOu*-N{NUgBPcmkviaKW60a9sli;hGu31Bz&M z$xJj^0}Vb0({V`#ufcq;+W=mJMqRIs4W{gp;$u2u&4@S0KnkB-r7I8js$KOg;dtMY z79^&aZwZh@ZLkq=a>8oinL(90U_pbC(1}sY3kTH;;segZAW&^s zd<-||Eek7SMW{kOio<$rG~g-TB#;Ht*T~40d-Y%w@)o?pSTm>`bS~>USaRu!rnXkUb($zsc^g(U(OYKIldVpZ73K5E&6)` zm__0b%k_UHg6@ZopTQzOwQfZ-GXPcQ7&wptSpj27ehRd~0Bpp=314~7;xRPrfUw>+ zAPeNNM)KRfy!_eatDoG^e;oT|$4@(!a@9NWs<imNKf{k*K6kc3q*Xh!CK zV(hVsOn3|i$DEyd)3q%4yHMM_DgHOq({-2GfjZ4>yEU)3T;sew$7-dqK=V88raQ&4 zbb%fr9M(;bI+tVPu0wAPH31l6#Rb6PhPyCO9$r7?==D>^UgjlKZ+==`Zew2j02@mXzART2VS7Jt9c^ yhl!Hz&HpBET~YR~C@(xnkAC&?)#BGjuf4jIKDaRXyOQYb`Sjg>iYVja%>MuvGyRVM literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5990eef115c27325ebca32df98f66e5f68719195 GIT binary patch literal 39632 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 b=u8VNZTi2}fBEP;#tqpE2F@tm=lcHwlJZ2n literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..706f19e62d8f44e11dd05c0ee397e62d69ce26e4 GIT binary patch literal 43604 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a6c08fba7605deb0122d69e12d1a1ce474e0e7e GIT binary patch literal 3368 zcma)8TWlOx89pndw0tuvmslXhx` z*&SCk!t_<`dMvVLq%~uAlAe{;t~P6@v~IFTNEPvhh> zWg>9$rfI%wUt!DDueesLb>G4#q#@I;f#anjbO({}1& zyp(L{`E-yS=b~1ja>i$QjhA1eYWmD6lw$f&%z2O7=0|3^WAgKLSNIiYhU|{#RynRd zcl<&+ZPKSt%y>s7!)UTRH8&&NdB-*n%7vb(IDW6$gctHhO`5XZP0m`_NHFaR{(mHB zck}sqKd-89<#Ak5D_6~f=>C~|Rf1Cb%qp2pciMc^i~^`q?syfyp%QwnjFX}=Gwc7a zjJ>8C?ec%*jzZ;9J@OLfsO#{JHKTF9YYJZHW&ghlDVY6yx;$U?Jvbpy)ifHUTip)Q zt&Ri{9GEsXf0pd)o%P z_rLnyYZJdd{P?%dt=xa?_1#ZgioKEAu}**u};*qsX zNBp>Ut9$Qi9Aq`YwwbF*NmFd|w##Q$a{E?07 zA0glUO~|L3LGX`!RJAe^Kpv8t@Q4J-+l38p8B8G?#-`B9Ax(RkT(rE!-$`5msJ`EU zzpDxP4w80Z^gt7qjqnaQ@`V-w2}|I&08y5If?ok(9`g7yI44kr9Z>4?P*(tdC7`K( z0{&CLca$&*{z1Sngrq>EI0SBpUg&QC%1|E$Nc+2qQMSKBI8G4$O$m5Wi6@&tWqlXM z9{|2bAXj@7qsIX!AQ|Bg!JhyOD&bS$UjV#M3gR*FuLE%SC}a%$9N?=;_yqU|0H0OD zbKsu?e2qXvQ(c1aB7_lwe3DZA10%V24?!}*O>_wbpeP0LD0m%kL<%7eTv!9VDFyKY zUDSTfNFgjhkUg`NhZIbx{RGQKcpUs`g76dp8Y2=I;T(tPF;((9IJy}gQv$XnyhtXg;4A^negXVr1OiN)Cy>o}3%Ubo0g@38LAU_{ zdq5M&#{3xSoDwF$zXAA@6v7H!)Y?^%sxiNS$7Sguix0m7;Wa6QdAbPfjf7=GZTQdO z@iTbfkjP$*LOKn}2!BNv@e+iR6ja)4P(P!DkHYwE0GduA9|He0fxsaNV)Ouks6tYYknrOW29+RZzX$;hB@gVR_!2=F zD!~NrB@hiMgy^xrJk1AH0bBx1qxoEr@EdjdBiHs8h?6DA$~Um(t3RRY1)Z#`|DozF zY|y_Vu?P9m2JGjCQ{+S*41AE7sfn*Wp><*<;Z?pPm{4HMaDhbGx}n3?IE^h?>%f=^u;c+<@U&= Yxx3cc24cS#1EC2ui literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a30fa15bffe30727337acff54fa2782a128173f1 GIT binary patch literal 58983 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 k+|Zgcv6I@p(tXNJy)XCuTrqF+H;XALN22-T(jq literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01208785405100881d1ecc615b1793e445b15b4f GIT binary patch literal 6360 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..183625647e3cd8de421cb5b82d54894ebde9ff0d GIT binary patch literal 334 zcmXv}Jx>Bb5Z%4wL?K-4w9^)&Ow`txTmn?Y1~BoO3vdIs-rn72cOkiwe_-ctF#Z%v zI}$1@I}II`yNa)vd2ha6=B?4F5rZJTpG{5vu;L%?j%>~ic_uN5DJK~XDYe|;PUeO# zB@RIs=_~!44lAYGtbAJ4q$|JO=?25zAnFeudY!(hc!LBpylZ+ZKgQ{3&UK`8$x%sb zxAL@Y%ZlaI-SP|B*xOqUS*~FMLxoa77d7UmZOLK=ZB(f)1PEC?q7HJ!#vCClF<$^@ zV-TfIiu}5Dc?F7Tybz;FI+~#Z!30DL%;Q3WWRnDb?Nv*Z+x?rYi02${W!;$Df7Fo) bUoNF|P0rTj_eb zR%+03YAH=Bs#TBZj883()nliVnYwe%blgnm)ZM0pp$;L0o+wjyW;|#9fJ~)MG@a@E zzWeY1kb<40X*#DpeI)L?`+mRsZTG%EF`Eq>o`JJZoPIUNaeqk;`Dx5sR-ROG+!c=J zctx0tC;|!v*_B~sK*`>!fQr4<0X2JT0vfzkVQr)$P!Z7ubS%C)tdAH124>fUjS*A8 z6fpVQXi;~Gz1zVzJM>%7-(eSdW1Ixnwi}IdrP2&*^S}WNL!!{b`x(7 zw?{ex9n5YC`y-u!PG+};*G0MlUCeF^cSm{xJ(1o(Z)AO7ePlymL!>Xz$HMI4jgd`( zP0U^y?vHE^Y>sRRY+-Ikcxz-^U>mbL!`mY}0y~)972X+nDDV)oyTiL8y92wKT_4_q z`Zh6pRd^t>H?UX1DLFws{!8+}6yI;;t$g*_4vq`#=W7B7cu!!ESMpxI7G@n^Cmaw4 z`Fhyv`3Cs2pz$&#H$IlGP4PMNSDKm4Z^^ zQ8BAM9v835m(fD9=YJ&ezA@z!OQWWCxX@u*;(dc9l zaVQl^3{OQSVtx%-C(v<1){?hKO^RjhdH3VO1fOrTNwPmK#HPaWtmd>BotmVqDP~*@ zjZL6aZI275h4Y8TPM-4|vgJb4YD5zrYGC&niD=(*U31aUunlnkB>nuLSHuXBELwqhjT6wSFYK7J-^L>Gyn zV0dgozyyf1Z1mK>!E<70GHZ;TiJl9Fqa&d(S}VPSkXMa*FRl2cFWXleSR>Z@6fhHS4*!RSuJ(!>mQgCCmwn+#&@R zx5;tFD`i{peVl9N;!fG!!im10lw#I8XDj9z)XQlT))D1X+;Q$4cV6`rcTV9qhMLeZ zhp|EcOMD@pI5u*|hj}SM8{e7G1RoZ}9)rP$=Mg{<-XjKI<}qJsKES^@pZ_M?CJcn zKiTDr=7F1kyD#tQi${Iu#Id;G6V8taEErxrzWu^z2q3{X6%%5pK2|+oVj&T04;t1} zD3z_xk}{EGb$KUf0sA_}CVV4jLg*{x81wt0qs7iB6dI#SZCJm)n0v{xr!3;DT5^D3 zf{(!j%5Nmf3#+r*Sj>oljFM^s3aqZ?qtmAeaH9$YT&N=G0d&A8Rr8r=hN2U~GtcyBv(eUcFPS9TE zqbL|Q4SiTC8JaVA3r&Bek_JcO-tDVl=_|xp~@&W_NjS40B#=~ zsbit@W09$dPXfo%U|~-HG#6u71n36A7dmxH6rM#Fp=D^g=%fB+y)_Xn35-q@JB+$G zKVS1xrx;dJD+%KNG_}gd%-1L`PECxgsSoA_x`{evb)Rf4nY0h?EM@xq5VjMH9_?6w z0mA6mc^L@s(J2~gw*6o;71xwBEKZdSY-w52j`cH@6+>r#N?B`W(Ww%!szDr1VzcY)fznMM61enN!V~=B#suxr#a6oF-l&htFx>$mcny zo-@wrZz|r%Z@IER&~eVM9D3dK^I$Z7bymZ+wyb_w-XOCU>i=M2zsafz%=vBNepF68 zK*k^$42NO}QW0M&;!t}i3d5@y`b4-^)?VnP|RVjIad&iVLOB{b+AwBHlaF z`s&{faekMAx zv1dbHZw%XK_aq37&}kvoJ2^Jl8+;Z>a8&Fi%%HbWsh-K{tU+q_nP~Lvj5m)K^z4)t z#IBxVV2G;x6pSBT;Bp2|?^)6{q;w6-CfAawC1q;K*j((tCgb*IYTL>5G?S%iBmFn` zFE_U@c5F{K@5t1z%hWVxysfzg&fL1f+02$7sw(w{6=cq3m1C15rIU-W9ya;D3(GeZ zFK`mRd4(I}UR2L<Uc+mzDOSa=DB_zB zq}2g)j+~Qjj~+}QG%=D42c_2kY6nx$4eZBk#*(sTOBc55kD0qdN)Q5qM0iWQS8dG z$!QidSSWX9-vd*LA{D1oa3ma!O<@lyOtl9yA#f9`fBnM02}KoYhK}IJ9-2pm-uz#1d{YJBr7s7(3Rt}=!HJkZ6Y7MDXMB@c z^_*e6Fve2GWb!IrE%PE~HJ=bilh7bH?Sz7_D8$vq3*a$P0DAkmlb{)9D-!ApN(DDz zNvOvQv`(?iS@la!HF!;PI@GR$s2jYs?5&o0B??*@2FwrLOyA)=o*bU`VM7mNCohbU zwC6lH89pQ^o^=7mn7|$kuoamE8-a&~7Y4CSoC-!qM`J=F3_%gS5@{O=k#bJeBk1^ea1!c#Xs|H^0I>bqsy zoN-sr9b|L9Fu_r?;smdT_?rt{rqY?L$oQI;eCt!b^^3Z?oLa5l`07ZG!|OZ8+3W4$zb04C z!mV5Xk;lDu#~Os^)^l}zN#!kF%^hzyy{lK0%6dam`4>8m z)Lllg5#?tMfP3Rp*!a;AcJeUq4aI~5GTkf^r$!{U2kbK z3H+5mH^)c}Q*pFtvzBO>FM;^daz2KT7;#5@&y+k^(|h(v3%Vjd3StbA)>G_1hVi%m z2V2173U0&Jx2)GH7UF+V-Sy6iMYSuZP6fvY*4mr~?|WL#S$pkR%F&stfD_pmEFbG(`E{_4r3^0uyiUc9AiTDDfc{DrwMVC;XiY;=CasS%^5_Imx* z`lKaO)BKX^B}>Ly_a3H(9zpk6<9~ls<6bxSU3c5w-Ky{IQovlbq-A_zg*x*JCvX7; z&jpm9;RKbS<`p~PD`;R-G8_4+$i}M!S{6gYT-rc|pcC})F^szryyhuN1(3diQcP?8 zx~yi9Sch4i%skF&iHe_yX4S+>&T?5bxrgA*Xhgp$s|yAxC>YEdf7a!KN!gd9fY_IMmp37`$SWo=p#Nih{{_ z6TcWC*D_o?FnQ?G@O<<9v)7-y`rM+Y zGv!*BGIiZjZnALR-hXsF7p8bRatF* z?|c@SOAS8J)(NaT zSWhsg-gNPhl#XJTZ!Lk$PiQSoFE-J5RX`(X1%`IOkF}Q91Zaw>c`daa!V`mFyjdYr zYyp#C7A%CGAcl@jF_m9W9C*+sSsmN|NixDP0Y--oWla)j4>H(3nAHKqjfBAR0-9%) zvC>g+>!RXxRx7c&{noWT$NK96$`!v#2Af!{zg{9IZ7U+-U^JI8F@Krd#Mzc+*P4D# zQUDphk6&yn40*;`D>28`^u-AerXUWtMY?DvwrO$u+Gy+YaX&F6=W4ewh|SOK8%%_HLM}5(if25+F5g%{Kz1v z8Z*J5S!0uGSS8hvf>+g$@MwBg2yho`$SY1O0xDK3>!V<4ln7vEsylW+x|1J^?CR<4 z^^^S+c7t6#>-<9?G*-{^tf9bHj;*ckH&CER#-HOCBfkDc?77{G_MR_2ELD~QS5>wN z9`vmIUsSuavJiqR32Db45q+9~TF>#_ypGp{-EZIx0I6Eu2%8b&L>+IwX5uXZKqw6X zZ-q_IY&Jp9+u<@WSEXR&9r!un>%z|sdli1w_|*tB{|$nr2x@tcpda<{-is9ht6=-o zvTFsqP|3=u6C8X!N_75x*978bZqE^1}+C*VS@iapVIO~X??9A)ZJuGI~KZnTnb zD#_2yHw#q|TUYZ9Ld~d_Z-tQ6132N8ON0=+mW8SL_KRxSH&BOqbO;8BwG9Y0AZ2Gs zX#J`j)(H*y9J)&4_@*oTJ>tU{ywJbGVjn2T3M6?TV_P#undFZ7z!aA`LV14KYB>fA z^>wiIw~7Zo;CqI7KI4m?8W%?5V9kNo2ez9;V?D!!1taliR`VB$jog*z(vwhQ6@#7_ z@gztsGWUuckkkOwU$mr+Ygp7JjN(s~ZVd4Jm?V*2E#jcerLJ7v z&Ig4ZjAdFP`FZ470DEFPPp+1Auqv;TbQJpNAE`*IRwqeI32g21t(T=|$cw~ptKkKc zv$BPrRmTB|vf4bwsvVIiSIy+KD4h3e#A(3x85Nk=GwPnn^E{c;=b3$MNZf!xu@Am+FEMH_>?*1|lv8bx_qWd?)vRUKI%`W< zzNAiAzobmqE*Oi9L0%!_&|ik4#CSnUg0k{Y!jiBiYzgg6c6KCg&@4apbOHITNbexQMiP%-u-v~U>)g_@j(;z-b5h-m_I6dgBfkGB^5?D00)E;CkRdlL5X z4%xT(zF>HmOW1!M4FBIy%KiUkMZ8mvG2SKHitq8>qFuI?&s`p;*~$rJ!aiI16Y`~L zx#sx^DTo|d^CT+eQswt-C1#0?`If{UC*_|tPcgNEd+E2-P-5XVXZK^ZRK|&(W)H7T znB{)OSk%h?(;QEuU*h&x49#qNf@FwnRkyPR)(%YI^HXCYP>!)tA4q_~cdvi*v#)>ljnAb_onX0)E!1SJ zRg2b!g>8$?o8HzhZauv0_GO%ptf-V#l{rpnuLQ%~RdeO&<)ax}^}K)Kske{hRGh1E zg;TmL$pZ*=dz0#y44|ml%iESzgA=;!@-DerQ?Awp;k~x)H=awocCg@@CcG?}e5_1e zC&l(;8vE#7UwAidB6mY3|Gv}iM>2D!q5UIHuWwI2vh1jvkKT;ka%{ZgY+iD9rJP-h z&aGfs+dreY<8EDabu4xqUvvzwXviny-1Sc%P%9hJpmK@C~NAs(DUpx59!Pg#n<&n4cr(3qA9ov)pGbY>1$L5YLnS3de zZ^8K&rnZ~|^~gE74Lja`?6)n~n&(3cp0uYcss5VvodGf>s(1DHN;1U!Ho!I}0<3If z`W!5zhgVMKMFRPRDxpj00e+1M6GZMhM8`90gKis#?M0o?0Kiuuj#-XH8xJ;}JXj~u zLP)^AvQHF9i>PFym#80Uxr5=yB#@G315LKov=#Zt>>!X>U1 zAU6MV&|{Q01AM-YzXzI(a{C3+Wt2UMe)8(HpRDHdcT^Xn{Qm*yGb-l)FO5bu_$2ML zHMPU6Abq|EG#q7=zo<8tkNI}XnO(y%p4VbC4_1IvqcoHG*<1QQGHA)bw%uMte~`Yl1?3fu01aVM-{*3lt?v$Uic5 z!(u39SHf^pCo8+mn&U@Fo(4xHDv~;=)S01DXN~*ik`e{}!G7+N;v^{9&ngMIoV6!x z;|2O#j?Ho9C~;7>mExm`%5oGrUpRab+Z|so=QB=RpEb{?)4|Zi{q)oYy11Av5avpG zmZ6Teagq$KdB*8*&6%oH7qYo>Tj|mmM!VM^t0ni1H-n5gQ}NtTW+=?~_xH@0V@Gcfv`;!A+aI7Jo(g zl1~lI;aTUb0}5~Uo0SF5lnXVqBwTWdn8oF5Tduzx#r}#ZFDYJXEx!VIJ8%Dr@*&K# zmo}@p_(8dz2_^63?Q$Jw-3hl?pKy;8H*n1Z{+WALiLi&)1i(29b-P)^CFM&ev6_#T z38#G5tt!=pdK09?6Z^ZB2$+fze-*Iu5h)))0{u<5+>5hSiK^omGey47&vE{$&`lJ1 zfX<&l3`Hh8Z^%e5I-~wt&1A5m)KF)pT?Uyv_-BNDBf{()!179W2IBUPw$FhG&Wx?VzMWtH>IIhmSq_ z$m7GoeJA#3D}s_FSz_$u_kIQg2p1#1-3o0tS2)0iLTG}MAp<*VnBQYKu7wj-3hpVW zj28|JDrYwAk506sR^c!NGzA__Oyb!DgQ#>cNCF%>9~L?d&Q8xv_0B>(=#+~ce&1+_ zRD*Z z%T=EFEx(djv^D=|*-`rur!e>3uG)}O;eDU!uYB2H=Dwz{QOzrARKtE%3GV(9a=EYA z&E!N77kvdzk!fC?BOB8@`z6@2MjV$A^K6AxXAh{eiT%E^0OOm=Bb)+VKBtPA=hQI> zIu1a|_Bp`YUsYaF{*p$6&}j%@AgquP9mTA2P9;_Xxh)J5GRi-E0igvN;F(i@V!Q$p zg?K&0vl~_Zs^W?Q%=>;dO5DP|wClH2I0dSn>6RhCv@E5;#AKxQ(cx~A&7BpdasFsb zjP(pB%&8f5d6*t(PCZv~S*ZyUKrK zYl;Dr z`j>aZc3-hG>kO`@$AZzwSey>(6K$M7mCfv!uV8(Uwo-A*oJXEaRWa*Yo6YH|5DwMr zgOaiuL;y}KqWqC;I{QPC%wQ0!} zB!dJ5Sq+^igd}4;IyM1~(ELb?G<-}|j*i1K-A}}f3z3+lx2Xf(0ga9rbpJ8#B&%Wl zLU#wCU(CTGF$|{>Jtp@K(@XPLi@#0zuiSsjvnikYPjn?_1wi=60AxG4hQ_2e!il=5|fv zLdR0m##GbBbj_yQo~DIuX-_wfOWmtblUU@QiL-g;{jWZK%erB?bwkG6vgBQt@~(T& zyZ*-KGj(lCb-k&&-uLP@zqN5qSWOeDB)?bFeWNc^-FV%6)qKyWZL7Sbxn*n0**LR< z1QGMCw@f}rT&{ff@@JP^9Vu5waxkYhnOm3ZT3;1z?)#4W#*tLp)>PfLoC>}l*lVt} zzN&ili3MZI)0MJ!|Fs6b_iDLyeQ){GojX^!8goa=)^^D}e=g(gSn~F!yuC}_9VzdQ zOS;<*@4}&_mMy84EpMxCwd`E>)?MFnb<6dKu0C|5`j)qExw-YVEw5~OZRaaH-!i`a zWV(59UYBwBmK^?+!@uO{PC2?4d-lI0+;SYvIBP$suFKT5{#x*cBjat#)U++tbf;>% zmumV`HT`!hx$5S-8g5VGWVe>~ke{IR*B)_vE+)wR#>TX5x! zTutq@C$0yt1~avdnf9&tN8i_b?sDoH&pj35<|;W)Js2f5=)Al2oW1JO)Hloz)a<}J zQ~%je)y^MYcn&fk=eFd5+g4}B>$|@D>h4QAly^xF zxmR7&Qf+Ulw)c`g<844c*{bh2>z17Ul+(`=TsyJw)Z+TVcQv=_hE^v=4#lKCDXGc+ zfz37l#4TG(Qj@Vdlcpc999Eze>{!Gfwl^P9N=pCP3P~d?Hi8|k@DT8z&3NT+05qii z53-~}aM3cWN~p@6l9GwdS)8XDr~P!zGh1>5bPW3`2t`ftCI=az`4t>yVIc)3QAr5S z#vu*WlszROY8Fyp3YAlJD2c6Mu`A2uqh%ol_K=(=UM0unE5MS<@9~6JpuYM~td)U< zdm!dJ$2M%r9{`-Yw^gHC9dmMK9;byAx`@3Tn&MH*4OY z?HtdnA-+MfN$ND^*kFZL8-SCRQw=GcN9+eSn=k;gRe+hx{^Ydq*N<B1+?Mj~ix=2XYQc>?h73hrJKR7PtPr)U8a;pHPpMzhimm2RTQH zR!QhYV%~iP?b=_aT{R`;3_cjn*RReEIsMC@kfPy%6#oI#5;n69AWqMLY4#LmxPsV) zXQW$n%7kd75Jp}3h8T8x-z+OB_Yg{d-&$}=1jBuM!DAG+bP&g_B#xvaIb+1V3}TNY zY^Ez2R5&Oxqhp>#CL5UT6mjnmh|37Vd_GA&y+w+EOA3HXPYE;DqI;C?SDDc>j|pg) z&zRV~S3Re2L5m>DE+}Uq-i%%f1D!WxFIanGlfuYYC`<>daTxE6fXjGhwmc1_UScNp zK!GSMoGc)`zNb<9lO2&Ll(s}+1PVq>*^8;K`)6#$bW#<-EC5o>vE#!y_NigH5yp;7 zxw0lH4wwbx(hBD%am!G)Vlo7s^NG_lb!#*0DLpI%y7j+N&i|c^|3SuwWDuB}QEvCm zR2EaqswOjs4Ns4qq}wz?r=ri6UO7a!XOI#;)VD~ZpHT!vK9k>Ql(;4&7%wnHwi{*+ zQC9n>n82J}#6c1ADc0mpmo7z-lUU5a7abXy5}`1+-QaIwdT3cEQO(3IqD#;w_i5L`sSTm*vaD2P#is7;W7`fNC&nC_#NRL^>?DFh66b> zg;+Sd_v(?G+H`Gi&PpCO&R%!*>`i~Ve$#iR-f6kDTorj&bN1S+Pv5Ls@^4G|x25a0 z=W58?!`T~NG2R?p>e`v=+L`t}l=G5zt>k?u?d#9gkq1aGO72Y8_2e4J!?(KWf6)5w z{y*qVwLX?>q|g@5<+<1H^cs@ZdtF>rTiV^8G%kBvUVZWg|K|AX<4ZleQ$4%Wt$Whm zffcSt@18q?lY6b8nO;u3m{{JtBjc=Ia<-+MZ3|OrXLrVPJmcxiG=k1<$kaC7GgoY> zT(tS_*|?VO#qNjRj{p0a-sc zm#mE`YvZD|du>dk-M#E-UIuMj>szYrPu2FnB`j?|l-hhKU3)mw)R*xe$~3oUS~@dL zZLf8{(urEscrao$b=M774J!_V*ZmP^aJfHLA*XxQT$T4qC{*ne!N;t#iI zjx}liaAzy*?=}t?kM(N)sB7;gxc;?ciPs>u7UzBQt(zr+Ta{4D z;S%ZxKPs_6J{M~;PTSF%NA5K_k68_`OK6H`3gWc4u?KmUAu)OV444FQ+O?!u8aXE! z#h%qBG~)%LPmYH(o(8D8YGs)%$Q(^cKQhDMr)W-4~#2ClJ*UH26}@%xDPy7InayZB#V6MsMk*`OCsxXds^lV&W0 z0!kOJ5$E#0!Z1bqa|uo+ohv{2Uw`$tpYA=0YaH0l{SC^Eu{eK|Y>cG~oC-&tV{FeA z?~(Tx$v8&_H2^n$5+Xa9t(b^PcbKXoV-t+ooK=B8o~Inx4h#-bL5?#lC%u&ixr@=dz21bfs##(ys2sUILLBkN=)tQ(bvU4R#@bXFToh zde7E%ySDv?X{lpds$<(y$DUNjo^;3FbnU)HT}`H?1LiGVuQ#CjVWE@VpHE+gKrPs((QxSwc(|@?o?ejRKzcBoOfT|nKCsjHo@GP zscgKbQPty?3YFe~`~jP-zO=64$Bd=-<^9$BJqkALSv6hSvx=Wb3zY!W3hvT?EGrJH z^prcSRQ4LT!oeh7K?o-C{bB=9ilC8P^Asgq;Qry>3I^^pP{_amBM*lgV3o8y#!2R} z<|!UL5*<8r(8~cq8Bjb6HJWK0rI%hkuJl1bqpjqq$L>N7-x%0BbF-LLDx&1e%S*Z5pBi&ojYGRs*U6 zxTyB%fhP|kgQicPX@s{+!68HWM_-oh%&M&%EU4uKrNbN8Z5W0VHEN`2Qk2b`SWQ@$BoLAr7Nkr zZ6&OrzUg}4YT$-CUDur)%Jl7dXYYG`gY(Y$==>M3sNUV5d^lsRS+cgItSt+}x2&Bv z&cD5VX~&V&jw9(E$5Oq=GF3oxReDdx;l8r{^7bpcF7H}sPCMG(bDX%A^L8%cJ3lz6<+#FZf%vaw>3}rbE zH^XV5Du-M6XSFD;%)I5bY_;qx9@P7Ucoj3KYv~LwH*e)F@YC|3ZBw56vszv^TM;Mn zkUiLH3w&|eugJRse^Yr996_cyM*K~!NGC?LSeYtbKU?vVEm0vhC$txo4|6zpSJ?D< zLrJ|0oJVldjK86xJO6K51V4Gl}p+LtlaV~ zA73YhmzsRF+_IQ9VTh^unmm8elz*3<6`!7y$RrMl0(TvH9o%ZY4sZ#@gpqMDpViZ- zsms?`uG_3RVP?vTU&GuZ=FFO>eCpzn%UMgj!2hQ^#&OFZNe#-3Gx9H}t`-ZSwfr;1 zN77Mc`4next7SPJJMV%2rec}0jn{$uj`Hc5wPJjj3;}rqLacp6cf7#)PgqYg>0fai zzNO%6Z`R3kANYb*8e=F$ZX;eUG++K4cdBofbA_T)`>gFJ%;5TjjS)KL5)QSBq#RFS z)Mss9up##|lI>hUVTz&d4MWntJAm?5sR_|ErhR(lVHo%fOIdZFB3)RH7A)#+$x{di z>y$IU^SBVgEh5meiV@F{2Oo0ei~u$(eH{T;2~V&vI$v6%)=9hlgQ}h6E8pqGj(g!~ z+#oWh#M0FrA-;Gzk7AeAexm>o2<*Cc+)YcBz5BE1dhiFho`YXJo&oul8vi$-1YNQL)ItxLx zCfKJPz;35jGcqkkSdA}#3!*vSv3c#So}Z%2>01(HMGq zdce4sFO-0qDZY8(gJ)Jtf(8gQifr8;aIJA0q%vDEj`QPVqtlFnUNzi=v9aOa150tZ zPXf=GRm>^NY3U^j^o}$jFI5rbp&@x)F(m#wKYeG(@l8tI$M3MrheyX z0XLyeio1S_30{c%GW9g!{!&lBS9{_e=ltiE>NcmK)sG!=DZ~^zip(dodC`kMY0vTBqK3E}rq2xCyHgPpbzm=1?8H|y^=%wGI02c*x zk&SjA=?wiYve9A^ePnzd1~?{6q_9LDdP=i}Z1{c^=q?yp3nV>sQ+xjS9J^+K+&oDp zXvifpj+PpI2ME*`G%EAze*(`4K+#AU8Klqiuqy$y5>q6rVKY~3LO8n}@);S7%5Ujv zOz|#qpQ-wUg-XbG%m~{4#}Ze>D|16^PD#{|Q|tBHURC9A(0$uY70!m~x8>YAedVjJ z9EaDSgvczAS>%->%xYVt!3HfxO9L{ z@272z3;Wrr_RptUwx(=b!TGJXB!?h#aMmPs%T4QU9C-8S>qpZ~+g7;86nb~cRG&OD z@A`qYZeiV9^{J-aOv?#kjvrX7GF7dMRT~y<8(@OdoN?D)JHAk#u3NuYyJ2wyW6jjI zWIXGjkyTZRt2O~Z3>?&^ba%kL-jH&(BoAcjny!ED>gSR}%Qdy>+7s_O|Ge&x>TcDZ zNY|W5KKwxmGf22TadqOBwL8xWy6tRvb@)c>n?0}hEbe*iR_o(w=kYur$aTH;YHixp zw%D<4(Yc*8RG}e<+jK9OWY*L zTmUse`7SxSQjV@0$8R|{{BA3*`~A8uQ|W#Y6tt7rS4-B8l(plA19iUb?YQAeLzm9h zyJ+i$hS>KUbvb35-F@5JvhbPLKKIJ!(%wy%_TTn4;Fe$Nv5BzEX|r6<$enrZ7?f?{CX)=WbSbmQvXmj)rA@z#C)5Ck{KXXmf&yl3TV ze0O|pIhCre{s)acH>T2!{m8Md9yzwQ{m`govWxnbdk%;!?mnWV*^+xy!P(dU_}(V2 zx)FCKlRTvUdiT}tjJIxHm_IRJyV$;Uv3eU5417!i1Kcg)a{q6XL4tt8STPq5S&vpL z-gPLBG;7~=>d4;UJkqLsccYT*{d?7L{PDJRaQsQD{-{gyCq1=CZJIwdXyNmxHVu6K z)TM%*KG?(g8`s`mSP=~J(Gf`e?6kh^M<3ZYaP)Za*uay)qX&i#4j)?Ob$s~o!$Sw9 z3n?!Xi1`v33?3dO8-s^LYKw%Lh;PDxhAyejMg&~j%d=~KB`x6zia;oYc!Z2^kksCTC<;sJlubX6D2~sm@uM)yBC!IXkmfaS9(mhr6b$n6;X$HO%V463uy;wU%>u=ld5N3*!q7Des0J?Va+^7Or z3fAXO)3D}!3XS1TrTbFsvOlLG2c)yk##{xn>Tu!kJiBmM&)mh9F{g#vY-LuP+-5s- z0;{dgIhfT+ZFVuMn;Kfhtkq<#VO9?{)XS{3WUXV?dTMh6v-%!vb0Z6ALYs4}1rU@P zTpzWP?~00AuVfK$$dL5}wt?UX+iS`D12NBh4Dm!oD1b*Nqr^y%qb2T=@cFgRZZXnTV_x z`g7nrYuq&(fK zO9OMKzh+_eTvZ*a3abubOj32u;QNXHLP6K2UQ^C0ODb2;Tw~SJ3=Qv6Bhh`+e)=}i zgzqpPIupHb8a^`xY{+*gbS@OXZ+;YC@bV4BMS(t9cfaz9a0seHELc1noxm;AxTbz^ zm`-C9KgpFf;p9qW3||Vsr7tnijnpa}^PzT&{}DxIRWkw~qiO?Pl6c&z(P&gWfC%qX z>j@sB^}ZHd(fyHH<0b8fy7hOhI;$b6!k(=+B?rEym3jkF3lFu2^@a!w9knVwY*oCV zjoRPLL5hH~q=y~0%72@Ug-}lHDK8}{eig4YrC&Y7h@oNeH;@*DA2kSH6bz4^9gl_i zv!mlo114)_wbke&Hvfde?R6#!sm@v?qyvK*d?{xRaGr_t$MQxQ*Z!5L;fe| z`tQ*xd@c~mFd}uFh;PA4$4Rm}`Kw~mEnUXKS2OXELh2oM9kVz{HlmfKj}yhDO_27u ztQNx$g(_+5Gf+INjQoB{tbJ)qC1DRc>mu!wH1D(C(vvm?}Wfi0v$CS9!?xzsMk|bhf5!MpN;zFq7Uea!WcRqX8X_53e;)DjcF=U&@ro z5gMS9eY}~REo9I>p4F4OQJlVmDQQ`e%vEeBql1Dq(3ca!l2Vq2Y4nMm6!_oBAa1JI zM?*r(TcSxAnL`XpTqr#q!xg zLukH1P6B=soT*v!d-S@e5A1jRt<;R?C{LsTG1{B}tPAqXJ-siTy&vm`eZTu_F`94>R|L=3d zf58pE&-uR3ZGWGuexGY#rssXm4a*%vO|s+V-nrhi!8<>lGIU(1xZ`v$a`p@}L0dGn zWxVx}5|fe-zGy^;OnT@aD2^X0K=qjo8#C^jkLnT%Mg1MK>(c3zxjv^M7j{9D^U}V# zhjJCn2?ZKgPS30cImF1EzyzE*GqYN_N_Wo6tTwLNo3k@3$O>=H!K_ZG_T*g5>IP!J z;Jj+dRWWBZp$Rq2>fx+7lQMsNp>sZ%s_ITzdU9SC02L}{j@1>oxz>`5U!o5qEF61l z>)Xdt8y{Y@9C`QnqUF()=CPFqmf#C2PHFsDsZnggVI{>TY;sCtjyY}l05b)c3jyYw z9I%-JHWvam=K~aq>Kq3n9{}4uokG#O=x)0Q@7|Afi3$bOc*x9s!OE#k$(i?5HGie{ z{lMb->ez*Y-&0$1YNe(siA@@>OL5#6hYvmIj2bI>;YD6}t$1{r&3B!g#_*McIe<>J I^y!TM2jz_?r2qf` literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a300bbc4e325541930e91383745640382e83664c GIT binary patch literal 11459 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py new file mode 100644 index 0000000..36286df --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py @@ -0,0 +1,451 @@ +# Auto generated by make_terminal_widths.py + +CELL_WIDTHS = [ + (0, 0, 0), + (1, 31, -1), + (127, 159, -1), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1552, 1562, 0), + (1611, 1631, 0), + (1648, 1648, 0), + (1750, 1756, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2259, 2273, 0), + (2275, 2306, 0), + (2362, 2362, 0), + (2364, 2364, 0), + (2369, 2376, 0), + (2381, 2381, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2433, 0), + (2492, 2492, 0), + (2497, 2500, 0), + (2509, 2509, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2562, 0), + (2620, 2620, 0), + (2625, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2690, 0), + (2748, 2748, 0), + (2753, 2757, 0), + (2759, 2760, 0), + (2765, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2817, 0), + (2876, 2876, 0), + (2879, 2879, 0), + (2881, 2884, 0), + (2893, 2893, 0), + (2901, 2902, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3008, 3008, 0), + (3021, 3021, 0), + (3072, 3072, 0), + (3076, 3076, 0), + (3134, 3136, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3201, 0), + (3260, 3260, 0), + (3263, 3263, 0), + (3270, 3270, 0), + (3276, 3277, 0), + (3298, 3299, 0), + (3328, 3329, 0), + (3387, 3388, 0), + (3393, 3396, 0), + (3405, 3405, 0), + (3426, 3427, 0), + (3457, 3457, 0), + (3530, 3530, 0), + (3538, 3540, 0), + (3542, 3542, 0), + (3633, 3633, 0), + (3636, 3642, 0), + (3655, 3662, 0), + (3761, 3761, 0), + (3764, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3953, 3966, 0), + (3968, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4141, 4144, 0), + (4146, 4151, 0), + (4153, 4154, 0), + (4157, 4158, 0), + (4184, 4185, 0), + (4190, 4192, 0), + (4209, 4212, 0), + (4226, 4226, 0), + (4229, 4230, 0), + (4237, 4237, 0), + (4253, 4253, 0), + (4352, 4447, 2), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6069, 0), + (6071, 6077, 0), + (6086, 6086, 0), + (6089, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6434, 0), + (6439, 6440, 0), + (6450, 6450, 0), + (6457, 6459, 0), + (6679, 6680, 0), + (6683, 6683, 0), + (6742, 6742, 0), + (6744, 6750, 0), + (6752, 6752, 0), + (6754, 6754, 0), + (6757, 6764, 0), + (6771, 6780, 0), + (6783, 6783, 0), + (6832, 6848, 0), + (6912, 6915, 0), + (6964, 6964, 0), + (6966, 6970, 0), + (6972, 6972, 0), + (6978, 6978, 0), + (7019, 7027, 0), + (7040, 7041, 0), + (7074, 7077, 0), + (7080, 7081, 0), + (7083, 7085, 0), + (7142, 7142, 0), + (7144, 7145, 0), + (7149, 7149, 0), + (7151, 7153, 0), + (7212, 7219, 0), + (7222, 7223, 0), + (7376, 7378, 0), + (7380, 7392, 0), + (7394, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7416, 7417, 0), + (7616, 7673, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8291, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12333, 0), + (12334, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12591, 2), + (12593, 12686, 2), + (12688, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43045, 43046, 0), + (43052, 43052, 0), + (43204, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43345, 0), + (43360, 43388, 2), + (43392, 43394, 0), + (43443, 43443, 0), + (43446, 43449, 0), + (43452, 43453, 0), + (43493, 43493, 0), + (43561, 43566, 0), + (43569, 43570, 0), + (43573, 43574, 0), + (43587, 43587, 0), + (43596, 43596, 0), + (43644, 43644, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 0), + (43756, 43757, 0), + (43766, 43766, 0), + (44005, 44005, 0), + (44008, 44008, 0), + (44013, 44013, 0), + (44032, 55203, 2), + (63744, 64255, 2), + (64286, 64286, 0), + (65024, 65039, 0), + (65040, 65049, 2), + (65056, 65071, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65281, 65376, 2), + (65504, 65510, 2), + (66045, 66045, 0), + (66272, 66272, 0), + (66422, 66426, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69291, 69292, 0), + (69446, 69456, 0), + (69633, 69633, 0), + (69688, 69702, 0), + (69759, 69761, 0), + (69811, 69814, 0), + (69817, 69818, 0), + (69888, 69890, 0), + (69927, 69931, 0), + (69933, 69940, 0), + (70003, 70003, 0), + (70016, 70017, 0), + (70070, 70078, 0), + (70089, 70092, 0), + (70095, 70095, 0), + (70191, 70193, 0), + (70196, 70196, 0), + (70198, 70199, 0), + (70206, 70206, 0), + (70367, 70367, 0), + (70371, 70378, 0), + (70400, 70401, 0), + (70459, 70460, 0), + (70464, 70464, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70712, 70719, 0), + (70722, 70724, 0), + (70726, 70726, 0), + (70750, 70750, 0), + (70835, 70840, 0), + (70842, 70842, 0), + (70847, 70848, 0), + (70850, 70851, 0), + (71090, 71093, 0), + (71100, 71101, 0), + (71103, 71104, 0), + (71132, 71133, 0), + (71219, 71226, 0), + (71229, 71229, 0), + (71231, 71232, 0), + (71339, 71339, 0), + (71341, 71341, 0), + (71344, 71349, 0), + (71351, 71351, 0), + (71453, 71455, 0), + (71458, 71461, 0), + (71463, 71467, 0), + (71727, 71735, 0), + (71737, 71738, 0), + (71995, 71996, 0), + (71998, 71998, 0), + (72003, 72003, 0), + (72148, 72151, 0), + (72154, 72155, 0), + (72160, 72160, 0), + (72193, 72202, 0), + (72243, 72248, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72278, 0), + (72281, 72283, 0), + (72330, 72342, 0), + (72344, 72345, 0), + (72752, 72758, 0), + (72760, 72765, 0), + (72767, 72767, 0), + (72850, 72871, 0), + (72874, 72880, 0), + (72882, 72883, 0), + (72885, 72886, 0), + (73009, 73014, 0), + (73018, 73018, 0), + (73020, 73021, 0), + (73023, 73029, 0), + (73031, 73031, 0), + (73104, 73105, 0), + (73109, 73109, 0), + (73111, 73111, 0), + (73459, 73460, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94180, 94180, 0), + (94192, 94193, 2), + (94208, 100343, 2), + (100352, 101589, 2), + (101632, 101640, 2), + (110592, 110878, 2), + (110928, 110930, 2), + (110948, 110951, 2), + (110960, 111355, 2), + (113821, 113822, 0), + (119143, 119145, 0), + (119163, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123184, 123190, 0), + (123628, 123631, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128725, 128727, 2), + (128747, 128748, 2), + (128756, 128764, 2), + (128992, 129003, 2), + (129292, 129338, 2), + (129340, 129349, 2), + (129351, 129400, 2), + (129402, 129483, 2), + (129485, 129535, 2), + (129648, 129652, 2), + (129656, 129658, 2), + (129664, 129670, 2), + (129680, 129704, 2), + (129712, 129718, 2), + (129728, 129730, 2), + (129744, 129750, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917760, 917999, 0), +] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py new file mode 100644 index 0000000..1f2877b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py @@ -0,0 +1,3610 @@ +EMOJI = { + "1st_place_medal": "🥇", + "2nd_place_medal": "🥈", + "3rd_place_medal": "🥉", + "ab_button_(blood_type)": "🆎", + "atm_sign": "🏧", + "a_button_(blood_type)": "🅰", + "afghanistan": "🇦🇫", + "albania": "🇦🇱", + "algeria": "🇩🇿", + "american_samoa": "🇦🇸", + "andorra": "🇦🇩", + "angola": "🇦🇴", + "anguilla": "🇦🇮", + "antarctica": "🇦🇶", + "antigua_&_barbuda": "🇦🇬", + "aquarius": "♒", + "argentina": "🇦🇷", + "aries": "♈", + "armenia": "🇦🇲", + "aruba": "🇦🇼", + "ascension_island": "🇦🇨", + "australia": "🇦🇺", + "austria": "🇦🇹", + "azerbaijan": "🇦🇿", + "back_arrow": "🔙", + "b_button_(blood_type)": "🅱", + "bahamas": "🇧🇸", + "bahrain": "🇧🇭", + "bangladesh": "🇧🇩", + "barbados": "🇧🇧", + "belarus": "🇧🇾", + "belgium": "🇧🇪", + "belize": "🇧🇿", + "benin": "🇧🇯", + "bermuda": "🇧🇲", + "bhutan": "🇧🇹", + "bolivia": "🇧🇴", + "bosnia_&_herzegovina": "🇧🇦", + "botswana": "🇧🇼", + "bouvet_island": "🇧🇻", + "brazil": "🇧🇷", + "british_indian_ocean_territory": "🇮🇴", + "british_virgin_islands": "🇻🇬", + "brunei": "🇧🇳", + "bulgaria": "🇧🇬", + "burkina_faso": "🇧🇫", + "burundi": "🇧🇮", + "cl_button": "🆑", + "cool_button": "🆒", + "cambodia": "🇰🇭", + "cameroon": "🇨🇲", + "canada": "🇨🇦", + "canary_islands": "🇮🇨", + "cancer": "♋", + "cape_verde": "🇨🇻", + "capricorn": "♑", + "caribbean_netherlands": "🇧🇶", + "cayman_islands": "🇰🇾", + "central_african_republic": "🇨🇫", + "ceuta_&_melilla": "🇪🇦", + "chad": "🇹🇩", + "chile": "🇨🇱", + "china": "🇨🇳", + "christmas_island": "🇨🇽", + "christmas_tree": "🎄", + "clipperton_island": "🇨🇵", + "cocos_(keeling)_islands": "🇨🇨", + "colombia": "🇨🇴", + "comoros": "🇰🇲", + "congo_-_brazzaville": "🇨🇬", + "congo_-_kinshasa": "🇨🇩", + "cook_islands": "🇨🇰", + "costa_rica": "🇨🇷", + "croatia": "🇭🇷", + "cuba": "🇨🇺", + "curaçao": "🇨🇼", + "cyprus": "🇨🇾", + "czechia": "🇨🇿", + "côte_d’ivoire": "🇨🇮", + "denmark": "🇩🇰", + "diego_garcia": "🇩🇬", + "djibouti": "🇩🇯", + "dominica": "🇩🇲", + "dominican_republic": "🇩🇴", + "end_arrow": "🔚", + "ecuador": "🇪🇨", + "egypt": "🇪🇬", + "el_salvador": "🇸🇻", + "england": "🏴\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", + "equatorial_guinea": "🇬🇶", + "eritrea": "🇪🇷", + "estonia": "🇪🇪", + "ethiopia": "🇪🇹", + "european_union": "🇪🇺", + "free_button": "🆓", + "falkland_islands": "🇫🇰", + "faroe_islands": "🇫🇴", + "fiji": "🇫🇯", + "finland": "🇫🇮", + "france": "🇫🇷", + "french_guiana": "🇬🇫", + "french_polynesia": "🇵🇫", + "french_southern_territories": "🇹🇫", + "gabon": "🇬🇦", + "gambia": "🇬🇲", + "gemini": "♊", + "georgia": "🇬🇪", + "germany": "🇩🇪", + "ghana": "🇬🇭", + "gibraltar": "🇬🇮", + "greece": "🇬🇷", + "greenland": "🇬🇱", + "grenada": "🇬🇩", + "guadeloupe": "🇬🇵", + "guam": "🇬🇺", + "guatemala": "🇬🇹", + "guernsey": "🇬🇬", + "guinea": "🇬🇳", + "guinea-bissau": "🇬🇼", + "guyana": "🇬🇾", + "haiti": "🇭🇹", + "heard_&_mcdonald_islands": "🇭🇲", + "honduras": "🇭🇳", + "hong_kong_sar_china": "🇭🇰", + "hungary": "🇭🇺", + "id_button": "🆔", + "iceland": "🇮🇸", + "india": "🇮🇳", + "indonesia": "🇮🇩", + "iran": "🇮🇷", + "iraq": "🇮🇶", + "ireland": "🇮🇪", + "isle_of_man": "🇮🇲", + "israel": "🇮🇱", + "italy": "🇮🇹", + "jamaica": "🇯🇲", + "japan": "🗾", + "japanese_acceptable_button": "🉑", + "japanese_application_button": "🈸", + "japanese_bargain_button": "🉐", + "japanese_castle": "🏯", + "japanese_congratulations_button": "㊗", + "japanese_discount_button": "🈹", + "japanese_dolls": "🎎", + "japanese_free_of_charge_button": "🈚", + "japanese_here_button": "🈁", + "japanese_monthly_amount_button": "🈷", + "japanese_no_vacancy_button": "🈵", + "japanese_not_free_of_charge_button": "🈶", + "japanese_open_for_business_button": "🈺", + "japanese_passing_grade_button": "🈴", + "japanese_post_office": "🏣", + "japanese_prohibited_button": "🈲", + "japanese_reserved_button": "🈯", + "japanese_secret_button": "㊙", + "japanese_service_charge_button": "🈂", + "japanese_symbol_for_beginner": "🔰", + "japanese_vacancy_button": "🈳", + "jersey": "🇯🇪", + "jordan": "🇯🇴", + "kazakhstan": "🇰🇿", + "kenya": "🇰🇪", + "kiribati": "🇰🇮", + "kosovo": "🇽🇰", + "kuwait": "🇰🇼", + "kyrgyzstan": "🇰🇬", + "laos": "🇱🇦", + "latvia": "🇱🇻", + "lebanon": "🇱🇧", + "leo": "♌", + "lesotho": "🇱🇸", + "liberia": "🇱🇷", + "libra": "♎", + "libya": "🇱🇾", + "liechtenstein": "🇱🇮", + "lithuania": "🇱🇹", + "luxembourg": "🇱🇺", + "macau_sar_china": "🇲🇴", + "macedonia": "🇲🇰", + "madagascar": "🇲🇬", + "malawi": "🇲🇼", + "malaysia": "🇲🇾", + "maldives": "🇲🇻", + "mali": "🇲🇱", + "malta": "🇲🇹", + "marshall_islands": "🇲🇭", + "martinique": "🇲🇶", + "mauritania": "🇲🇷", + "mauritius": "🇲🇺", + "mayotte": "🇾🇹", + "mexico": "🇲🇽", + "micronesia": "🇫🇲", + "moldova": "🇲🇩", + "monaco": "🇲🇨", + "mongolia": "🇲🇳", + "montenegro": "🇲🇪", + "montserrat": "🇲🇸", + "morocco": "🇲🇦", + "mozambique": "🇲🇿", + "mrs._claus": "🤶", + "mrs._claus_dark_skin_tone": "🤶🏿", + "mrs._claus_light_skin_tone": "🤶🏻", + "mrs._claus_medium-dark_skin_tone": "🤶🏾", + "mrs._claus_medium-light_skin_tone": "🤶🏼", + "mrs._claus_medium_skin_tone": "🤶🏽", + "myanmar_(burma)": "🇲🇲", + "new_button": "🆕", + "ng_button": "🆖", + "namibia": "🇳🇦", + "nauru": "🇳🇷", + "nepal": "🇳🇵", + "netherlands": "🇳🇱", + "new_caledonia": "🇳🇨", + "new_zealand": "🇳🇿", + "nicaragua": "🇳🇮", + "niger": "🇳🇪", + "nigeria": "🇳🇬", + "niue": "🇳🇺", + "norfolk_island": "🇳🇫", + "north_korea": "🇰🇵", + "northern_mariana_islands": "🇲🇵", + "norway": "🇳🇴", + "ok_button": "🆗", + "ok_hand": "👌", + "ok_hand_dark_skin_tone": "👌🏿", + "ok_hand_light_skin_tone": "👌🏻", + "ok_hand_medium-dark_skin_tone": "👌🏾", + "ok_hand_medium-light_skin_tone": "👌🏼", + "ok_hand_medium_skin_tone": "👌🏽", + "on!_arrow": "🔛", + "o_button_(blood_type)": "🅾", + "oman": "🇴🇲", + "ophiuchus": "⛎", + "p_button": "🅿", + "pakistan": "🇵🇰", + "palau": "🇵🇼", + "palestinian_territories": "🇵🇸", + "panama": "🇵🇦", + "papua_new_guinea": "🇵🇬", + "paraguay": "🇵🇾", + "peru": "🇵🇪", + "philippines": "🇵🇭", + "pisces": "♓", + "pitcairn_islands": "🇵🇳", + "poland": "🇵🇱", + "portugal": "🇵🇹", + "puerto_rico": "🇵🇷", + "qatar": "🇶🇦", + "romania": "🇷🇴", + "russia": "🇷🇺", + "rwanda": "🇷🇼", + "réunion": "🇷🇪", + "soon_arrow": "🔜", + "sos_button": "🆘", + "sagittarius": "♐", + "samoa": "🇼🇸", + "san_marino": "🇸🇲", + "santa_claus": "🎅", + "santa_claus_dark_skin_tone": "🎅🏿", + "santa_claus_light_skin_tone": "🎅🏻", + "santa_claus_medium-dark_skin_tone": "🎅🏾", + "santa_claus_medium-light_skin_tone": "🎅🏼", + "santa_claus_medium_skin_tone": "🎅🏽", + "saudi_arabia": "🇸🇦", + "scorpio": "♏", + "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", + "senegal": "🇸🇳", + "serbia": "🇷🇸", + "seychelles": "🇸🇨", + "sierra_leone": "🇸🇱", + "singapore": "🇸🇬", + "sint_maarten": "🇸🇽", + "slovakia": "🇸🇰", + "slovenia": "🇸🇮", + "solomon_islands": "🇸🇧", + "somalia": "🇸🇴", + "south_africa": "🇿🇦", + "south_georgia_&_south_sandwich_islands": "🇬🇸", + "south_korea": "🇰🇷", + "south_sudan": "🇸🇸", + "spain": "🇪🇸", + "sri_lanka": "🇱🇰", + "st._barthélemy": "🇧🇱", + "st._helena": "🇸🇭", + "st._kitts_&_nevis": "🇰🇳", + "st._lucia": "🇱🇨", + "st._martin": "🇲🇫", + "st._pierre_&_miquelon": "🇵🇲", + "st._vincent_&_grenadines": "🇻🇨", + "statue_of_liberty": "🗽", + "sudan": "🇸🇩", + "suriname": "🇸🇷", + "svalbard_&_jan_mayen": "🇸🇯", + "swaziland": "🇸🇿", + "sweden": "🇸🇪", + "switzerland": "🇨🇭", + "syria": "🇸🇾", + "são_tomé_&_príncipe": "🇸🇹", + "t-rex": "🦖", + "top_arrow": "🔝", + "taiwan": "🇹🇼", + "tajikistan": "🇹🇯", + "tanzania": "🇹🇿", + "taurus": "♉", + "thailand": "🇹🇭", + "timor-leste": "🇹🇱", + "togo": "🇹🇬", + "tokelau": "🇹🇰", + "tokyo_tower": "🗼", + "tonga": "🇹🇴", + "trinidad_&_tobago": "🇹🇹", + "tristan_da_cunha": "🇹🇦", + "tunisia": "🇹🇳", + "turkey": "🦃", + "turkmenistan": "🇹🇲", + "turks_&_caicos_islands": "🇹🇨", + "tuvalu": "🇹🇻", + "u.s._outlying_islands": "🇺🇲", + "u.s._virgin_islands": "🇻🇮", + "up!_button": "🆙", + "uganda": "🇺🇬", + "ukraine": "🇺🇦", + "united_arab_emirates": "🇦🇪", + "united_kingdom": "🇬🇧", + "united_nations": "🇺🇳", + "united_states": "🇺🇸", + "uruguay": "🇺🇾", + "uzbekistan": "🇺🇿", + "vs_button": "🆚", + "vanuatu": "🇻🇺", + "vatican_city": "🇻🇦", + "venezuela": "🇻🇪", + "vietnam": "🇻🇳", + "virgo": "♍", + "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", + "wallis_&_futuna": "🇼🇫", + "western_sahara": "🇪🇭", + "yemen": "🇾🇪", + "zambia": "🇿🇲", + "zimbabwe": "🇿🇼", + "abacus": "🧮", + "adhesive_bandage": "🩹", + "admission_tickets": "🎟", + "adult": "🧑", + "adult_dark_skin_tone": "🧑🏿", + "adult_light_skin_tone": "🧑🏻", + "adult_medium-dark_skin_tone": "🧑🏾", + "adult_medium-light_skin_tone": "🧑🏼", + "adult_medium_skin_tone": "🧑🏽", + "aerial_tramway": "🚡", + "airplane": "✈", + "airplane_arrival": "🛬", + "airplane_departure": "🛫", + "alarm_clock": "⏰", + "alembic": "⚗", + "alien": "👽", + "alien_monster": "👾", + "ambulance": "🚑", + "american_football": "🏈", + "amphora": "🏺", + "anchor": "⚓", + "anger_symbol": "💢", + "angry_face": "😠", + "angry_face_with_horns": "👿", + "anguished_face": "😧", + "ant": "🐜", + "antenna_bars": "📶", + "anxious_face_with_sweat": "😰", + "articulated_lorry": "🚛", + "artist_palette": "🎨", + "astonished_face": "😲", + "atom_symbol": "⚛", + "auto_rickshaw": "🛺", + "automobile": "🚗", + "avocado": "🥑", + "axe": "🪓", + "baby": "👶", + "baby_angel": "👼", + "baby_angel_dark_skin_tone": "👼🏿", + "baby_angel_light_skin_tone": "👼🏻", + "baby_angel_medium-dark_skin_tone": "👼🏾", + "baby_angel_medium-light_skin_tone": "👼🏼", + "baby_angel_medium_skin_tone": "👼🏽", + "baby_bottle": "🍼", + "baby_chick": "🐤", + "baby_dark_skin_tone": "👶🏿", + "baby_light_skin_tone": "👶🏻", + "baby_medium-dark_skin_tone": "👶🏾", + "baby_medium-light_skin_tone": "👶🏼", + "baby_medium_skin_tone": "👶🏽", + "baby_symbol": "🚼", + "backhand_index_pointing_down": "👇", + "backhand_index_pointing_down_dark_skin_tone": "👇🏿", + "backhand_index_pointing_down_light_skin_tone": "👇🏻", + "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾", + "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼", + "backhand_index_pointing_down_medium_skin_tone": "👇🏽", + "backhand_index_pointing_left": "👈", + "backhand_index_pointing_left_dark_skin_tone": "👈🏿", + "backhand_index_pointing_left_light_skin_tone": "👈🏻", + "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾", + "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼", + "backhand_index_pointing_left_medium_skin_tone": "👈🏽", + "backhand_index_pointing_right": "👉", + "backhand_index_pointing_right_dark_skin_tone": "👉🏿", + "backhand_index_pointing_right_light_skin_tone": "👉🏻", + "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾", + "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼", + "backhand_index_pointing_right_medium_skin_tone": "👉🏽", + "backhand_index_pointing_up": "👆", + "backhand_index_pointing_up_dark_skin_tone": "👆🏿", + "backhand_index_pointing_up_light_skin_tone": "👆🏻", + "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾", + "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼", + "backhand_index_pointing_up_medium_skin_tone": "👆🏽", + "bacon": "🥓", + "badger": "🦡", + "badminton": "🏸", + "bagel": "🥯", + "baggage_claim": "🛄", + "baguette_bread": "🥖", + "balance_scale": "⚖", + "bald": "🦲", + "bald_man": "👨\u200d🦲", + "bald_woman": "👩\u200d🦲", + "ballet_shoes": "🩰", + "balloon": "🎈", + "ballot_box_with_ballot": "🗳", + "ballot_box_with_check": "☑", + "banana": "🍌", + "banjo": "🪕", + "bank": "🏦", + "bar_chart": "📊", + "barber_pole": "💈", + "baseball": "⚾", + "basket": "🧺", + "basketball": "🏀", + "bat": "🦇", + "bathtub": "🛁", + "battery": "🔋", + "beach_with_umbrella": "🏖", + "beaming_face_with_smiling_eyes": "😁", + "bear_face": "🐻", + "bearded_person": "🧔", + "bearded_person_dark_skin_tone": "🧔🏿", + "bearded_person_light_skin_tone": "🧔🏻", + "bearded_person_medium-dark_skin_tone": "🧔🏾", + "bearded_person_medium-light_skin_tone": "🧔🏼", + "bearded_person_medium_skin_tone": "🧔🏽", + "beating_heart": "💓", + "bed": "🛏", + "beer_mug": "🍺", + "bell": "🔔", + "bell_with_slash": "🔕", + "bellhop_bell": "🛎", + "bento_box": "🍱", + "beverage_box": "🧃", + "bicycle": "🚲", + "bikini": "👙", + "billed_cap": "🧢", + "biohazard": "☣", + "bird": "🐦", + "birthday_cake": "🎂", + "black_circle": "⚫", + "black_flag": "🏴", + "black_heart": "🖤", + "black_large_square": "⬛", + "black_medium-small_square": "◾", + "black_medium_square": "◼", + "black_nib": "✒", + "black_small_square": "▪", + "black_square_button": "🔲", + "blond-haired_man": "👱\u200d♂️", + "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️", + "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️", + "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️", + "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️", + "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️", + "blond-haired_person": "👱", + "blond-haired_person_dark_skin_tone": "👱🏿", + "blond-haired_person_light_skin_tone": "👱🏻", + "blond-haired_person_medium-dark_skin_tone": "👱🏾", + "blond-haired_person_medium-light_skin_tone": "👱🏼", + "blond-haired_person_medium_skin_tone": "👱🏽", + "blond-haired_woman": "👱\u200d♀️", + "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️", + "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️", + "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️", + "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️", + "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️", + "blossom": "🌼", + "blowfish": "🐡", + "blue_book": "📘", + "blue_circle": "🔵", + "blue_heart": "💙", + "blue_square": "🟦", + "boar": "🐗", + "bomb": "💣", + "bone": "🦴", + "bookmark": "🔖", + "bookmark_tabs": "📑", + "books": "📚", + "bottle_with_popping_cork": "🍾", + "bouquet": "💐", + "bow_and_arrow": "🏹", + "bowl_with_spoon": "🥣", + "bowling": "🎳", + "boxing_glove": "🥊", + "boy": "👦", + "boy_dark_skin_tone": "👦🏿", + "boy_light_skin_tone": "👦🏻", + "boy_medium-dark_skin_tone": "👦🏾", + "boy_medium-light_skin_tone": "👦🏼", + "boy_medium_skin_tone": "👦🏽", + "brain": "🧠", + "bread": "🍞", + "breast-feeding": "🤱", + "breast-feeding_dark_skin_tone": "🤱🏿", + "breast-feeding_light_skin_tone": "🤱🏻", + "breast-feeding_medium-dark_skin_tone": "🤱🏾", + "breast-feeding_medium-light_skin_tone": "🤱🏼", + "breast-feeding_medium_skin_tone": "🤱🏽", + "brick": "🧱", + "bride_with_veil": "👰", + "bride_with_veil_dark_skin_tone": "👰🏿", + "bride_with_veil_light_skin_tone": "👰🏻", + "bride_with_veil_medium-dark_skin_tone": "👰🏾", + "bride_with_veil_medium-light_skin_tone": "👰🏼", + "bride_with_veil_medium_skin_tone": "👰🏽", + "bridge_at_night": "🌉", + "briefcase": "💼", + "briefs": "🩲", + "bright_button": "🔆", + "broccoli": "🥦", + "broken_heart": "💔", + "broom": "🧹", + "brown_circle": "🟤", + "brown_heart": "🤎", + "brown_square": "🟫", + "bug": "🐛", + "building_construction": "🏗", + "bullet_train": "🚅", + "burrito": "🌯", + "bus": "🚌", + "bus_stop": "🚏", + "bust_in_silhouette": "👤", + "busts_in_silhouette": "👥", + "butter": "🧈", + "butterfly": "🦋", + "cactus": "🌵", + "calendar": "📆", + "call_me_hand": "🤙", + "call_me_hand_dark_skin_tone": "🤙🏿", + "call_me_hand_light_skin_tone": "🤙🏻", + "call_me_hand_medium-dark_skin_tone": "🤙🏾", + "call_me_hand_medium-light_skin_tone": "🤙🏼", + "call_me_hand_medium_skin_tone": "🤙🏽", + "camel": "🐫", + "camera": "📷", + "camera_with_flash": "📸", + "camping": "🏕", + "candle": "🕯", + "candy": "🍬", + "canned_food": "🥫", + "canoe": "🛶", + "card_file_box": "🗃", + "card_index": "📇", + "card_index_dividers": "🗂", + "carousel_horse": "🎠", + "carp_streamer": "🎏", + "carrot": "🥕", + "castle": "🏰", + "cat": "🐱", + "cat_face": "🐱", + "cat_face_with_tears_of_joy": "😹", + "cat_face_with_wry_smile": "😼", + "chains": "⛓", + "chair": "🪑", + "chart_decreasing": "📉", + "chart_increasing": "📈", + "chart_increasing_with_yen": "💹", + "cheese_wedge": "🧀", + "chequered_flag": "🏁", + "cherries": "🍒", + "cherry_blossom": "🌸", + "chess_pawn": "♟", + "chestnut": "🌰", + "chicken": "🐔", + "child": "🧒", + "child_dark_skin_tone": "🧒🏿", + "child_light_skin_tone": "🧒🏻", + "child_medium-dark_skin_tone": "🧒🏾", + "child_medium-light_skin_tone": "🧒🏼", + "child_medium_skin_tone": "🧒🏽", + "children_crossing": "🚸", + "chipmunk": "🐿", + "chocolate_bar": "🍫", + "chopsticks": "🥢", + "church": "⛪", + "cigarette": "🚬", + "cinema": "🎦", + "circled_m": "Ⓜ", + "circus_tent": "🎪", + "cityscape": "🏙", + "cityscape_at_dusk": "🌆", + "clamp": "🗜", + "clapper_board": "🎬", + "clapping_hands": "👏", + "clapping_hands_dark_skin_tone": "👏🏿", + "clapping_hands_light_skin_tone": "👏🏻", + "clapping_hands_medium-dark_skin_tone": "👏🏾", + "clapping_hands_medium-light_skin_tone": "👏🏼", + "clapping_hands_medium_skin_tone": "👏🏽", + "classical_building": "🏛", + "clinking_beer_mugs": "🍻", + "clinking_glasses": "🥂", + "clipboard": "📋", + "clockwise_vertical_arrows": "🔃", + "closed_book": "📕", + "closed_mailbox_with_lowered_flag": "📪", + "closed_mailbox_with_raised_flag": "📫", + "closed_umbrella": "🌂", + "cloud": "☁", + "cloud_with_lightning": "🌩", + "cloud_with_lightning_and_rain": "⛈", + "cloud_with_rain": "🌧", + "cloud_with_snow": "🌨", + "clown_face": "🤡", + "club_suit": "♣", + "clutch_bag": "👝", + "coat": "🧥", + "cocktail_glass": "🍸", + "coconut": "🥥", + "coffin": "⚰", + "cold_face": "🥶", + "collision": "💥", + "comet": "☄", + "compass": "🧭", + "computer_disk": "💽", + "computer_mouse": "🖱", + "confetti_ball": "🎊", + "confounded_face": "😖", + "confused_face": "😕", + "construction": "🚧", + "construction_worker": "👷", + "construction_worker_dark_skin_tone": "👷🏿", + "construction_worker_light_skin_tone": "👷🏻", + "construction_worker_medium-dark_skin_tone": "👷🏾", + "construction_worker_medium-light_skin_tone": "👷🏼", + "construction_worker_medium_skin_tone": "👷🏽", + "control_knobs": "🎛", + "convenience_store": "🏪", + "cooked_rice": "🍚", + "cookie": "🍪", + "cooking": "🍳", + "copyright": "©", + "couch_and_lamp": "🛋", + "counterclockwise_arrows_button": "🔄", + "couple_with_heart": "💑", + "couple_with_heart_man_man": "👨\u200d❤️\u200d👨", + "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨", + "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩", + "cow": "🐮", + "cow_face": "🐮", + "cowboy_hat_face": "🤠", + "crab": "🦀", + "crayon": "🖍", + "credit_card": "💳", + "crescent_moon": "🌙", + "cricket": "🦗", + "cricket_game": "🏏", + "crocodile": "🐊", + "croissant": "🥐", + "cross_mark": "❌", + "cross_mark_button": "❎", + "crossed_fingers": "🤞", + "crossed_fingers_dark_skin_tone": "🤞🏿", + "crossed_fingers_light_skin_tone": "🤞🏻", + "crossed_fingers_medium-dark_skin_tone": "🤞🏾", + "crossed_fingers_medium-light_skin_tone": "🤞🏼", + "crossed_fingers_medium_skin_tone": "🤞🏽", + "crossed_flags": "🎌", + "crossed_swords": "⚔", + "crown": "👑", + "crying_cat_face": "😿", + "crying_face": "😢", + "crystal_ball": "🔮", + "cucumber": "🥒", + "cupcake": "🧁", + "cup_with_straw": "🥤", + "curling_stone": "🥌", + "curly_hair": "🦱", + "curly-haired_man": "👨\u200d🦱", + "curly-haired_woman": "👩\u200d🦱", + "curly_loop": "➰", + "currency_exchange": "💱", + "curry_rice": "🍛", + "custard": "🍮", + "customs": "🛃", + "cut_of_meat": "🥩", + "cyclone": "🌀", + "dagger": "🗡", + "dango": "🍡", + "dashing_away": "💨", + "deaf_person": "🧏", + "deciduous_tree": "🌳", + "deer": "🦌", + "delivery_truck": "🚚", + "department_store": "🏬", + "derelict_house": "🏚", + "desert": "🏜", + "desert_island": "🏝", + "desktop_computer": "🖥", + "detective": "🕵", + "detective_dark_skin_tone": "🕵🏿", + "detective_light_skin_tone": "🕵🏻", + "detective_medium-dark_skin_tone": "🕵🏾", + "detective_medium-light_skin_tone": "🕵🏼", + "detective_medium_skin_tone": "🕵🏽", + "diamond_suit": "♦", + "diamond_with_a_dot": "💠", + "dim_button": "🔅", + "direct_hit": "🎯", + "disappointed_face": "😞", + "diving_mask": "🤿", + "diya_lamp": "🪔", + "dizzy": "💫", + "dizzy_face": "😵", + "dna": "🧬", + "dog": "🐶", + "dog_face": "🐶", + "dollar_banknote": "💵", + "dolphin": "🐬", + "door": "🚪", + "dotted_six-pointed_star": "🔯", + "double_curly_loop": "➿", + "double_exclamation_mark": "‼", + "doughnut": "🍩", + "dove": "🕊", + "down-left_arrow": "↙", + "down-right_arrow": "↘", + "down_arrow": "⬇", + "downcast_face_with_sweat": "😓", + "downwards_button": "🔽", + "dragon": "🐉", + "dragon_face": "🐲", + "dress": "👗", + "drooling_face": "🤤", + "drop_of_blood": "🩸", + "droplet": "💧", + "drum": "🥁", + "duck": "🦆", + "dumpling": "🥟", + "dvd": "📀", + "e-mail": "📧", + "eagle": "🦅", + "ear": "👂", + "ear_dark_skin_tone": "👂🏿", + "ear_light_skin_tone": "👂🏻", + "ear_medium-dark_skin_tone": "👂🏾", + "ear_medium-light_skin_tone": "👂🏼", + "ear_medium_skin_tone": "👂🏽", + "ear_of_corn": "🌽", + "ear_with_hearing_aid": "🦻", + "egg": "🍳", + "eggplant": "🍆", + "eight-pointed_star": "✴", + "eight-spoked_asterisk": "✳", + "eight-thirty": "🕣", + "eight_o’clock": "🕗", + "eject_button": "⏏", + "electric_plug": "🔌", + "elephant": "🐘", + "eleven-thirty": "🕦", + "eleven_o’clock": "🕚", + "elf": "🧝", + "elf_dark_skin_tone": "🧝🏿", + "elf_light_skin_tone": "🧝🏻", + "elf_medium-dark_skin_tone": "🧝🏾", + "elf_medium-light_skin_tone": "🧝🏼", + "elf_medium_skin_tone": "🧝🏽", + "envelope": "✉", + "envelope_with_arrow": "📩", + "euro_banknote": "💶", + "evergreen_tree": "🌲", + "ewe": "🐑", + "exclamation_mark": "❗", + "exclamation_question_mark": "⁉", + "exploding_head": "🤯", + "expressionless_face": "😑", + "eye": "👁", + "eye_in_speech_bubble": "👁️\u200d🗨️", + "eyes": "👀", + "face_blowing_a_kiss": "😘", + "face_savoring_food": "😋", + "face_screaming_in_fear": "😱", + "face_vomiting": "🤮", + "face_with_hand_over_mouth": "🤭", + "face_with_head-bandage": "🤕", + "face_with_medical_mask": "😷", + "face_with_monocle": "🧐", + "face_with_open_mouth": "😮", + "face_with_raised_eyebrow": "🤨", + "face_with_rolling_eyes": "🙄", + "face_with_steam_from_nose": "😤", + "face_with_symbols_on_mouth": "🤬", + "face_with_tears_of_joy": "😂", + "face_with_thermometer": "🤒", + "face_with_tongue": "😛", + "face_without_mouth": "😶", + "factory": "🏭", + "fairy": "🧚", + "fairy_dark_skin_tone": "🧚🏿", + "fairy_light_skin_tone": "🧚🏻", + "fairy_medium-dark_skin_tone": "🧚🏾", + "fairy_medium-light_skin_tone": "🧚🏼", + "fairy_medium_skin_tone": "🧚🏽", + "falafel": "🧆", + "fallen_leaf": "🍂", + "family": "👪", + "family_man_boy": "👨\u200d👦", + "family_man_boy_boy": "👨\u200d👦\u200d👦", + "family_man_girl": "👨\u200d👧", + "family_man_girl_boy": "👨\u200d👧\u200d👦", + "family_man_girl_girl": "👨\u200d👧\u200d👧", + "family_man_man_boy": "👨\u200d👨\u200d👦", + "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦", + "family_man_man_girl": "👨\u200d👨\u200d👧", + "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦", + "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧", + "family_man_woman_boy": "👨\u200d👩\u200d👦", + "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦", + "family_man_woman_girl": "👨\u200d👩\u200d👧", + "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦", + "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧", + "family_woman_boy": "👩\u200d👦", + "family_woman_boy_boy": "👩\u200d👦\u200d👦", + "family_woman_girl": "👩\u200d👧", + "family_woman_girl_boy": "👩\u200d👧\u200d👦", + "family_woman_girl_girl": "👩\u200d👧\u200d👧", + "family_woman_woman_boy": "👩\u200d👩\u200d👦", + "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦", + "family_woman_woman_girl": "👩\u200d👩\u200d👧", + "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦", + "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧", + "fast-forward_button": "⏩", + "fast_down_button": "⏬", + "fast_reverse_button": "⏪", + "fast_up_button": "⏫", + "fax_machine": "📠", + "fearful_face": "😨", + "female_sign": "♀", + "ferris_wheel": "🎡", + "ferry": "⛴", + "field_hockey": "🏑", + "file_cabinet": "🗄", + "file_folder": "📁", + "film_frames": "🎞", + "film_projector": "📽", + "fire": "🔥", + "fire_extinguisher": "🧯", + "firecracker": "🧨", + "fire_engine": "🚒", + "fireworks": "🎆", + "first_quarter_moon": "🌓", + "first_quarter_moon_face": "🌛", + "fish": "🐟", + "fish_cake_with_swirl": "🍥", + "fishing_pole": "🎣", + "five-thirty": "🕠", + "five_o’clock": "🕔", + "flag_in_hole": "⛳", + "flamingo": "🦩", + "flashlight": "🔦", + "flat_shoe": "🥿", + "fleur-de-lis": "⚜", + "flexed_biceps": "💪", + "flexed_biceps_dark_skin_tone": "💪🏿", + "flexed_biceps_light_skin_tone": "💪🏻", + "flexed_biceps_medium-dark_skin_tone": "💪🏾", + "flexed_biceps_medium-light_skin_tone": "💪🏼", + "flexed_biceps_medium_skin_tone": "💪🏽", + "floppy_disk": "💾", + "flower_playing_cards": "🎴", + "flushed_face": "😳", + "flying_disc": "🥏", + "flying_saucer": "🛸", + "fog": "🌫", + "foggy": "🌁", + "folded_hands": "🙏", + "folded_hands_dark_skin_tone": "🙏🏿", + "folded_hands_light_skin_tone": "🙏🏻", + "folded_hands_medium-dark_skin_tone": "🙏🏾", + "folded_hands_medium-light_skin_tone": "🙏🏼", + "folded_hands_medium_skin_tone": "🙏🏽", + "foot": "🦶", + "footprints": "👣", + "fork_and_knife": "🍴", + "fork_and_knife_with_plate": "🍽", + "fortune_cookie": "🥠", + "fountain": "⛲", + "fountain_pen": "🖋", + "four-thirty": "🕟", + "four_leaf_clover": "🍀", + "four_o’clock": "🕓", + "fox_face": "🦊", + "framed_picture": "🖼", + "french_fries": "🍟", + "fried_shrimp": "🍤", + "frog_face": "🐸", + "front-facing_baby_chick": "🐥", + "frowning_face": "☹", + "frowning_face_with_open_mouth": "😦", + "fuel_pump": "⛽", + "full_moon": "🌕", + "full_moon_face": "🌝", + "funeral_urn": "⚱", + "game_die": "🎲", + "garlic": "🧄", + "gear": "⚙", + "gem_stone": "💎", + "genie": "🧞", + "ghost": "👻", + "giraffe": "🦒", + "girl": "👧", + "girl_dark_skin_tone": "👧🏿", + "girl_light_skin_tone": "👧🏻", + "girl_medium-dark_skin_tone": "👧🏾", + "girl_medium-light_skin_tone": "👧🏼", + "girl_medium_skin_tone": "👧🏽", + "glass_of_milk": "🥛", + "glasses": "👓", + "globe_showing_americas": "🌎", + "globe_showing_asia-australia": "🌏", + "globe_showing_europe-africa": "🌍", + "globe_with_meridians": "🌐", + "gloves": "🧤", + "glowing_star": "🌟", + "goal_net": "🥅", + "goat": "🐐", + "goblin": "👺", + "goggles": "🥽", + "gorilla": "🦍", + "graduation_cap": "🎓", + "grapes": "🍇", + "green_apple": "🍏", + "green_book": "📗", + "green_circle": "🟢", + "green_heart": "💚", + "green_salad": "🥗", + "green_square": "🟩", + "grimacing_face": "😬", + "grinning_cat_face": "😺", + "grinning_cat_face_with_smiling_eyes": "😸", + "grinning_face": "😀", + "grinning_face_with_big_eyes": "😃", + "grinning_face_with_smiling_eyes": "😄", + "grinning_face_with_sweat": "😅", + "grinning_squinting_face": "😆", + "growing_heart": "💗", + "guard": "💂", + "guard_dark_skin_tone": "💂🏿", + "guard_light_skin_tone": "💂🏻", + "guard_medium-dark_skin_tone": "💂🏾", + "guard_medium-light_skin_tone": "💂🏼", + "guard_medium_skin_tone": "💂🏽", + "guide_dog": "🦮", + "guitar": "🎸", + "hamburger": "🍔", + "hammer": "🔨", + "hammer_and_pick": "⚒", + "hammer_and_wrench": "🛠", + "hamster_face": "🐹", + "hand_with_fingers_splayed": "🖐", + "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿", + "hand_with_fingers_splayed_light_skin_tone": "🖐🏻", + "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾", + "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼", + "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽", + "handbag": "👜", + "handshake": "🤝", + "hatching_chick": "🐣", + "headphone": "🎧", + "hear-no-evil_monkey": "🙉", + "heart_decoration": "💟", + "heart_suit": "♥", + "heart_with_arrow": "💘", + "heart_with_ribbon": "💝", + "heavy_check_mark": "✔", + "heavy_division_sign": "➗", + "heavy_dollar_sign": "💲", + "heavy_heart_exclamation": "❣", + "heavy_large_circle": "⭕", + "heavy_minus_sign": "➖", + "heavy_multiplication_x": "✖", + "heavy_plus_sign": "➕", + "hedgehog": "🦔", + "helicopter": "🚁", + "herb": "🌿", + "hibiscus": "🌺", + "high-heeled_shoe": "👠", + "high-speed_train": "🚄", + "high_voltage": "⚡", + "hiking_boot": "🥾", + "hindu_temple": "🛕", + "hippopotamus": "🦛", + "hole": "🕳", + "honey_pot": "🍯", + "honeybee": "🐝", + "horizontal_traffic_light": "🚥", + "horse": "🐴", + "horse_face": "🐴", + "horse_racing": "🏇", + "horse_racing_dark_skin_tone": "🏇🏿", + "horse_racing_light_skin_tone": "🏇🏻", + "horse_racing_medium-dark_skin_tone": "🏇🏾", + "horse_racing_medium-light_skin_tone": "🏇🏼", + "horse_racing_medium_skin_tone": "🏇🏽", + "hospital": "🏥", + "hot_beverage": "☕", + "hot_dog": "🌭", + "hot_face": "🥵", + "hot_pepper": "🌶", + "hot_springs": "♨", + "hotel": "🏨", + "hourglass_done": "⌛", + "hourglass_not_done": "⏳", + "house": "🏠", + "house_with_garden": "🏡", + "houses": "🏘", + "hugging_face": "🤗", + "hundred_points": "💯", + "hushed_face": "😯", + "ice": "🧊", + "ice_cream": "🍨", + "ice_hockey": "🏒", + "ice_skate": "⛸", + "inbox_tray": "📥", + "incoming_envelope": "📨", + "index_pointing_up": "☝", + "index_pointing_up_dark_skin_tone": "☝🏿", + "index_pointing_up_light_skin_tone": "☝🏻", + "index_pointing_up_medium-dark_skin_tone": "☝🏾", + "index_pointing_up_medium-light_skin_tone": "☝🏼", + "index_pointing_up_medium_skin_tone": "☝🏽", + "infinity": "♾", + "information": "ℹ", + "input_latin_letters": "🔤", + "input_latin_lowercase": "🔡", + "input_latin_uppercase": "🔠", + "input_numbers": "🔢", + "input_symbols": "🔣", + "jack-o-lantern": "🎃", + "jeans": "👖", + "jigsaw": "🧩", + "joker": "🃏", + "joystick": "🕹", + "kaaba": "🕋", + "kangaroo": "🦘", + "key": "🔑", + "keyboard": "⌨", + "keycap_#": "#️⃣", + "keycap_*": "*️⃣", + "keycap_0": "0️⃣", + "keycap_1": "1️⃣", + "keycap_10": "🔟", + "keycap_2": "2️⃣", + "keycap_3": "3️⃣", + "keycap_4": "4️⃣", + "keycap_5": "5️⃣", + "keycap_6": "6️⃣", + "keycap_7": "7️⃣", + "keycap_8": "8️⃣", + "keycap_9": "9️⃣", + "kick_scooter": "🛴", + "kimono": "👘", + "kiss": "💋", + "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨", + "kiss_mark": "💋", + "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨", + "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩", + "kissing_cat_face": "😽", + "kissing_face": "😗", + "kissing_face_with_closed_eyes": "😚", + "kissing_face_with_smiling_eyes": "😙", + "kitchen_knife": "🔪", + "kite": "🪁", + "kiwi_fruit": "🥝", + "koala": "🐨", + "lab_coat": "🥼", + "label": "🏷", + "lacrosse": "🥍", + "lady_beetle": "🐞", + "laptop_computer": "💻", + "large_blue_diamond": "🔷", + "large_orange_diamond": "🔶", + "last_quarter_moon": "🌗", + "last_quarter_moon_face": "🌜", + "last_track_button": "⏮", + "latin_cross": "✝", + "leaf_fluttering_in_wind": "🍃", + "leafy_green": "🥬", + "ledger": "📒", + "left-facing_fist": "🤛", + "left-facing_fist_dark_skin_tone": "🤛🏿", + "left-facing_fist_light_skin_tone": "🤛🏻", + "left-facing_fist_medium-dark_skin_tone": "🤛🏾", + "left-facing_fist_medium-light_skin_tone": "🤛🏼", + "left-facing_fist_medium_skin_tone": "🤛🏽", + "left-right_arrow": "↔", + "left_arrow": "⬅", + "left_arrow_curving_right": "↪", + "left_luggage": "🛅", + "left_speech_bubble": "🗨", + "leg": "🦵", + "lemon": "🍋", + "leopard": "🐆", + "level_slider": "🎚", + "light_bulb": "💡", + "light_rail": "🚈", + "link": "🔗", + "linked_paperclips": "🖇", + "lion_face": "🦁", + "lipstick": "💄", + "litter_in_bin_sign": "🚮", + "lizard": "🦎", + "llama": "🦙", + "lobster": "🦞", + "locked": "🔒", + "locked_with_key": "🔐", + "locked_with_pen": "🔏", + "locomotive": "🚂", + "lollipop": "🍭", + "lotion_bottle": "🧴", + "loudly_crying_face": "😭", + "loudspeaker": "📢", + "love-you_gesture": "🤟", + "love-you_gesture_dark_skin_tone": "🤟🏿", + "love-you_gesture_light_skin_tone": "🤟🏻", + "love-you_gesture_medium-dark_skin_tone": "🤟🏾", + "love-you_gesture_medium-light_skin_tone": "🤟🏼", + "love-you_gesture_medium_skin_tone": "🤟🏽", + "love_hotel": "🏩", + "love_letter": "💌", + "luggage": "🧳", + "lying_face": "🤥", + "mage": "🧙", + "mage_dark_skin_tone": "🧙🏿", + "mage_light_skin_tone": "🧙🏻", + "mage_medium-dark_skin_tone": "🧙🏾", + "mage_medium-light_skin_tone": "🧙🏼", + "mage_medium_skin_tone": "🧙🏽", + "magnet": "🧲", + "magnifying_glass_tilted_left": "🔍", + "magnifying_glass_tilted_right": "🔎", + "mahjong_red_dragon": "🀄", + "male_sign": "♂", + "man": "👨", + "man_and_woman_holding_hands": "👫", + "man_artist": "👨\u200d🎨", + "man_artist_dark_skin_tone": "👨🏿\u200d🎨", + "man_artist_light_skin_tone": "👨🏻\u200d🎨", + "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨", + "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨", + "man_artist_medium_skin_tone": "👨🏽\u200d🎨", + "man_astronaut": "👨\u200d🚀", + "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀", + "man_astronaut_light_skin_tone": "👨🏻\u200d🚀", + "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀", + "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀", + "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀", + "man_biking": "🚴\u200d♂️", + "man_biking_dark_skin_tone": "🚴🏿\u200d♂️", + "man_biking_light_skin_tone": "🚴🏻\u200d♂️", + "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️", + "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️", + "man_biking_medium_skin_tone": "🚴🏽\u200d♂️", + "man_bouncing_ball": "⛹️\u200d♂️", + "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️", + "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️", + "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️", + "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️", + "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️", + "man_bowing": "🙇\u200d♂️", + "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️", + "man_bowing_light_skin_tone": "🙇🏻\u200d♂️", + "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️", + "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️", + "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️", + "man_cartwheeling": "🤸\u200d♂️", + "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️", + "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️", + "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️", + "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️", + "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️", + "man_climbing": "🧗\u200d♂️", + "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️", + "man_climbing_light_skin_tone": "🧗🏻\u200d♂️", + "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️", + "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️", + "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️", + "man_construction_worker": "👷\u200d♂️", + "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️", + "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️", + "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️", + "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️", + "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️", + "man_cook": "👨\u200d🍳", + "man_cook_dark_skin_tone": "👨🏿\u200d🍳", + "man_cook_light_skin_tone": "👨🏻\u200d🍳", + "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳", + "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳", + "man_cook_medium_skin_tone": "👨🏽\u200d🍳", + "man_dancing": "🕺", + "man_dancing_dark_skin_tone": "🕺🏿", + "man_dancing_light_skin_tone": "🕺🏻", + "man_dancing_medium-dark_skin_tone": "🕺🏾", + "man_dancing_medium-light_skin_tone": "🕺🏼", + "man_dancing_medium_skin_tone": "🕺🏽", + "man_dark_skin_tone": "👨🏿", + "man_detective": "🕵️\u200d♂️", + "man_detective_dark_skin_tone": "🕵🏿\u200d♂️", + "man_detective_light_skin_tone": "🕵🏻\u200d♂️", + "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️", + "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️", + "man_detective_medium_skin_tone": "🕵🏽\u200d♂️", + "man_elf": "🧝\u200d♂️", + "man_elf_dark_skin_tone": "🧝🏿\u200d♂️", + "man_elf_light_skin_tone": "🧝🏻\u200d♂️", + "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️", + "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️", + "man_elf_medium_skin_tone": "🧝🏽\u200d♂️", + "man_facepalming": "🤦\u200d♂️", + "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️", + "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️", + "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️", + "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️", + "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️", + "man_factory_worker": "👨\u200d🏭", + "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭", + "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭", + "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭", + "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭", + "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭", + "man_fairy": "🧚\u200d♂️", + "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️", + "man_fairy_light_skin_tone": "🧚🏻\u200d♂️", + "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️", + "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️", + "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️", + "man_farmer": "👨\u200d🌾", + "man_farmer_dark_skin_tone": "👨🏿\u200d🌾", + "man_farmer_light_skin_tone": "👨🏻\u200d🌾", + "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾", + "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾", + "man_farmer_medium_skin_tone": "👨🏽\u200d🌾", + "man_firefighter": "👨\u200d🚒", + "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒", + "man_firefighter_light_skin_tone": "👨🏻\u200d🚒", + "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒", + "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒", + "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒", + "man_frowning": "🙍\u200d♂️", + "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️", + "man_frowning_light_skin_tone": "🙍🏻\u200d♂️", + "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️", + "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️", + "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️", + "man_genie": "🧞\u200d♂️", + "man_gesturing_no": "🙅\u200d♂️", + "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️", + "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️", + "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️", + "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️", + "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️", + "man_gesturing_ok": "🙆\u200d♂️", + "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️", + "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️", + "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️", + "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️", + "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️", + "man_getting_haircut": "💇\u200d♂️", + "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️", + "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️", + "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️", + "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️", + "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️", + "man_getting_massage": "💆\u200d♂️", + "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️", + "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️", + "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️", + "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️", + "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️", + "man_golfing": "🏌️\u200d♂️", + "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️", + "man_golfing_light_skin_tone": "🏌🏻\u200d♂️", + "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️", + "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️", + "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️", + "man_guard": "💂\u200d♂️", + "man_guard_dark_skin_tone": "💂🏿\u200d♂️", + "man_guard_light_skin_tone": "💂🏻\u200d♂️", + "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️", + "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️", + "man_guard_medium_skin_tone": "💂🏽\u200d♂️", + "man_health_worker": "👨\u200d⚕️", + "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️", + "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️", + "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️", + "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️", + "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️", + "man_in_lotus_position": "🧘\u200d♂️", + "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️", + "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️", + "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️", + "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️", + "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️", + "man_in_manual_wheelchair": "👨\u200d🦽", + "man_in_motorized_wheelchair": "👨\u200d🦼", + "man_in_steamy_room": "🧖\u200d♂️", + "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️", + "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️", + "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️", + "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️", + "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️", + "man_in_suit_levitating": "🕴", + "man_in_suit_levitating_dark_skin_tone": "🕴🏿", + "man_in_suit_levitating_light_skin_tone": "🕴🏻", + "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾", + "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼", + "man_in_suit_levitating_medium_skin_tone": "🕴🏽", + "man_in_tuxedo": "🤵", + "man_in_tuxedo_dark_skin_tone": "🤵🏿", + "man_in_tuxedo_light_skin_tone": "🤵🏻", + "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾", + "man_in_tuxedo_medium-light_skin_tone": "🤵🏼", + "man_in_tuxedo_medium_skin_tone": "🤵🏽", + "man_judge": "👨\u200d⚖️", + "man_judge_dark_skin_tone": "👨🏿\u200d⚖️", + "man_judge_light_skin_tone": "👨🏻\u200d⚖️", + "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️", + "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️", + "man_judge_medium_skin_tone": "👨🏽\u200d⚖️", + "man_juggling": "🤹\u200d♂️", + "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️", + "man_juggling_light_skin_tone": "🤹🏻\u200d♂️", + "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️", + "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️", + "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️", + "man_lifting_weights": "🏋️\u200d♂️", + "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️", + "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️", + "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️", + "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️", + "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️", + "man_light_skin_tone": "👨🏻", + "man_mage": "🧙\u200d♂️", + "man_mage_dark_skin_tone": "🧙🏿\u200d♂️", + "man_mage_light_skin_tone": "🧙🏻\u200d♂️", + "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️", + "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️", + "man_mage_medium_skin_tone": "🧙🏽\u200d♂️", + "man_mechanic": "👨\u200d🔧", + "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧", + "man_mechanic_light_skin_tone": "👨🏻\u200d🔧", + "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧", + "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧", + "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧", + "man_medium-dark_skin_tone": "👨🏾", + "man_medium-light_skin_tone": "👨🏼", + "man_medium_skin_tone": "👨🏽", + "man_mountain_biking": "🚵\u200d♂️", + "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️", + "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️", + "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️", + "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️", + "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️", + "man_office_worker": "👨\u200d💼", + "man_office_worker_dark_skin_tone": "👨🏿\u200d💼", + "man_office_worker_light_skin_tone": "👨🏻\u200d💼", + "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼", + "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼", + "man_office_worker_medium_skin_tone": "👨🏽\u200d💼", + "man_pilot": "👨\u200d✈️", + "man_pilot_dark_skin_tone": "👨🏿\u200d✈️", + "man_pilot_light_skin_tone": "👨🏻\u200d✈️", + "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️", + "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️", + "man_pilot_medium_skin_tone": "👨🏽\u200d✈️", + "man_playing_handball": "🤾\u200d♂️", + "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️", + "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️", + "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️", + "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️", + "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️", + "man_playing_water_polo": "🤽\u200d♂️", + "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️", + "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️", + "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️", + "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️", + "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️", + "man_police_officer": "👮\u200d♂️", + "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️", + "man_police_officer_light_skin_tone": "👮🏻\u200d♂️", + "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️", + "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️", + "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️", + "man_pouting": "🙎\u200d♂️", + "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️", + "man_pouting_light_skin_tone": "🙎🏻\u200d♂️", + "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️", + "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️", + "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️", + "man_raising_hand": "🙋\u200d♂️", + "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️", + "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️", + "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️", + "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️", + "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️", + "man_rowing_boat": "🚣\u200d♂️", + "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️", + "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️", + "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️", + "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️", + "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️", + "man_running": "🏃\u200d♂️", + "man_running_dark_skin_tone": "🏃🏿\u200d♂️", + "man_running_light_skin_tone": "🏃🏻\u200d♂️", + "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️", + "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️", + "man_running_medium_skin_tone": "🏃🏽\u200d♂️", + "man_scientist": "👨\u200d🔬", + "man_scientist_dark_skin_tone": "👨🏿\u200d🔬", + "man_scientist_light_skin_tone": "👨🏻\u200d🔬", + "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬", + "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬", + "man_scientist_medium_skin_tone": "👨🏽\u200d🔬", + "man_shrugging": "🤷\u200d♂️", + "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️", + "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️", + "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️", + "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️", + "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️", + "man_singer": "👨\u200d🎤", + "man_singer_dark_skin_tone": "👨🏿\u200d🎤", + "man_singer_light_skin_tone": "👨🏻\u200d🎤", + "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤", + "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤", + "man_singer_medium_skin_tone": "👨🏽\u200d🎤", + "man_student": "👨\u200d🎓", + "man_student_dark_skin_tone": "👨🏿\u200d🎓", + "man_student_light_skin_tone": "👨🏻\u200d🎓", + "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓", + "man_student_medium-light_skin_tone": "👨🏼\u200d🎓", + "man_student_medium_skin_tone": "👨🏽\u200d🎓", + "man_surfing": "🏄\u200d♂️", + "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️", + "man_surfing_light_skin_tone": "🏄🏻\u200d♂️", + "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️", + "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️", + "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️", + "man_swimming": "🏊\u200d♂️", + "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️", + "man_swimming_light_skin_tone": "🏊🏻\u200d♂️", + "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️", + "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️", + "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️", + "man_teacher": "👨\u200d🏫", + "man_teacher_dark_skin_tone": "👨🏿\u200d🏫", + "man_teacher_light_skin_tone": "👨🏻\u200d🏫", + "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫", + "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫", + "man_teacher_medium_skin_tone": "👨🏽\u200d🏫", + "man_technologist": "👨\u200d💻", + "man_technologist_dark_skin_tone": "👨🏿\u200d💻", + "man_technologist_light_skin_tone": "👨🏻\u200d💻", + "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻", + "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻", + "man_technologist_medium_skin_tone": "👨🏽\u200d💻", + "man_tipping_hand": "💁\u200d♂️", + "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️", + "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️", + "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️", + "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️", + "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️", + "man_vampire": "🧛\u200d♂️", + "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️", + "man_vampire_light_skin_tone": "🧛🏻\u200d♂️", + "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️", + "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️", + "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️", + "man_walking": "🚶\u200d♂️", + "man_walking_dark_skin_tone": "🚶🏿\u200d♂️", + "man_walking_light_skin_tone": "🚶🏻\u200d♂️", + "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️", + "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️", + "man_walking_medium_skin_tone": "🚶🏽\u200d♂️", + "man_wearing_turban": "👳\u200d♂️", + "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️", + "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️", + "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️", + "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️", + "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️", + "man_with_probing_cane": "👨\u200d🦯", + "man_with_chinese_cap": "👲", + "man_with_chinese_cap_dark_skin_tone": "👲🏿", + "man_with_chinese_cap_light_skin_tone": "👲🏻", + "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾", + "man_with_chinese_cap_medium-light_skin_tone": "👲🏼", + "man_with_chinese_cap_medium_skin_tone": "👲🏽", + "man_zombie": "🧟\u200d♂️", + "mango": "🥭", + "mantelpiece_clock": "🕰", + "manual_wheelchair": "🦽", + "man’s_shoe": "👞", + "map_of_japan": "🗾", + "maple_leaf": "🍁", + "martial_arts_uniform": "🥋", + "mate": "🧉", + "meat_on_bone": "🍖", + "mechanical_arm": "🦾", + "mechanical_leg": "🦿", + "medical_symbol": "⚕", + "megaphone": "📣", + "melon": "🍈", + "memo": "📝", + "men_with_bunny_ears": "👯\u200d♂️", + "men_wrestling": "🤼\u200d♂️", + "menorah": "🕎", + "men’s_room": "🚹", + "mermaid": "🧜\u200d♀️", + "mermaid_dark_skin_tone": "🧜🏿\u200d♀️", + "mermaid_light_skin_tone": "🧜🏻\u200d♀️", + "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️", + "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️", + "mermaid_medium_skin_tone": "🧜🏽\u200d♀️", + "merman": "🧜\u200d♂️", + "merman_dark_skin_tone": "🧜🏿\u200d♂️", + "merman_light_skin_tone": "🧜🏻\u200d♂️", + "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️", + "merman_medium-light_skin_tone": "🧜🏼\u200d♂️", + "merman_medium_skin_tone": "🧜🏽\u200d♂️", + "merperson": "🧜", + "merperson_dark_skin_tone": "🧜🏿", + "merperson_light_skin_tone": "🧜🏻", + "merperson_medium-dark_skin_tone": "🧜🏾", + "merperson_medium-light_skin_tone": "🧜🏼", + "merperson_medium_skin_tone": "🧜🏽", + "metro": "🚇", + "microbe": "🦠", + "microphone": "🎤", + "microscope": "🔬", + "middle_finger": "🖕", + "middle_finger_dark_skin_tone": "🖕🏿", + "middle_finger_light_skin_tone": "🖕🏻", + "middle_finger_medium-dark_skin_tone": "🖕🏾", + "middle_finger_medium-light_skin_tone": "🖕🏼", + "middle_finger_medium_skin_tone": "🖕🏽", + "military_medal": "🎖", + "milky_way": "🌌", + "minibus": "🚐", + "moai": "🗿", + "mobile_phone": "📱", + "mobile_phone_off": "📴", + "mobile_phone_with_arrow": "📲", + "money-mouth_face": "🤑", + "money_bag": "💰", + "money_with_wings": "💸", + "monkey": "🐒", + "monkey_face": "🐵", + "monorail": "🚝", + "moon_cake": "🥮", + "moon_viewing_ceremony": "🎑", + "mosque": "🕌", + "mosquito": "🦟", + "motor_boat": "🛥", + "motor_scooter": "🛵", + "motorcycle": "🏍", + "motorized_wheelchair": "🦼", + "motorway": "🛣", + "mount_fuji": "🗻", + "mountain": "⛰", + "mountain_cableway": "🚠", + "mountain_railway": "🚞", + "mouse": "🐭", + "mouse_face": "🐭", + "mouth": "👄", + "movie_camera": "🎥", + "mushroom": "🍄", + "musical_keyboard": "🎹", + "musical_note": "🎵", + "musical_notes": "🎶", + "musical_score": "🎼", + "muted_speaker": "🔇", + "nail_polish": "💅", + "nail_polish_dark_skin_tone": "💅🏿", + "nail_polish_light_skin_tone": "💅🏻", + "nail_polish_medium-dark_skin_tone": "💅🏾", + "nail_polish_medium-light_skin_tone": "💅🏼", + "nail_polish_medium_skin_tone": "💅🏽", + "name_badge": "📛", + "national_park": "🏞", + "nauseated_face": "🤢", + "nazar_amulet": "🧿", + "necktie": "👔", + "nerd_face": "🤓", + "neutral_face": "😐", + "new_moon": "🌑", + "new_moon_face": "🌚", + "newspaper": "📰", + "next_track_button": "⏭", + "night_with_stars": "🌃", + "nine-thirty": "🕤", + "nine_o’clock": "🕘", + "no_bicycles": "🚳", + "no_entry": "⛔", + "no_littering": "🚯", + "no_mobile_phones": "📵", + "no_one_under_eighteen": "🔞", + "no_pedestrians": "🚷", + "no_smoking": "🚭", + "non-potable_water": "🚱", + "nose": "👃", + "nose_dark_skin_tone": "👃🏿", + "nose_light_skin_tone": "👃🏻", + "nose_medium-dark_skin_tone": "👃🏾", + "nose_medium-light_skin_tone": "👃🏼", + "nose_medium_skin_tone": "👃🏽", + "notebook": "📓", + "notebook_with_decorative_cover": "📔", + "nut_and_bolt": "🔩", + "octopus": "🐙", + "oden": "🍢", + "office_building": "🏢", + "ogre": "👹", + "oil_drum": "🛢", + "old_key": "🗝", + "old_man": "👴", + "old_man_dark_skin_tone": "👴🏿", + "old_man_light_skin_tone": "👴🏻", + "old_man_medium-dark_skin_tone": "👴🏾", + "old_man_medium-light_skin_tone": "👴🏼", + "old_man_medium_skin_tone": "👴🏽", + "old_woman": "👵", + "old_woman_dark_skin_tone": "👵🏿", + "old_woman_light_skin_tone": "👵🏻", + "old_woman_medium-dark_skin_tone": "👵🏾", + "old_woman_medium-light_skin_tone": "👵🏼", + "old_woman_medium_skin_tone": "👵🏽", + "older_adult": "🧓", + "older_adult_dark_skin_tone": "🧓🏿", + "older_adult_light_skin_tone": "🧓🏻", + "older_adult_medium-dark_skin_tone": "🧓🏾", + "older_adult_medium-light_skin_tone": "🧓🏼", + "older_adult_medium_skin_tone": "🧓🏽", + "om": "🕉", + "oncoming_automobile": "🚘", + "oncoming_bus": "🚍", + "oncoming_fist": "👊", + "oncoming_fist_dark_skin_tone": "👊🏿", + "oncoming_fist_light_skin_tone": "👊🏻", + "oncoming_fist_medium-dark_skin_tone": "👊🏾", + "oncoming_fist_medium-light_skin_tone": "👊🏼", + "oncoming_fist_medium_skin_tone": "👊🏽", + "oncoming_police_car": "🚔", + "oncoming_taxi": "🚖", + "one-piece_swimsuit": "🩱", + "one-thirty": "🕜", + "one_o’clock": "🕐", + "onion": "🧅", + "open_book": "📖", + "open_file_folder": "📂", + "open_hands": "👐", + "open_hands_dark_skin_tone": "👐🏿", + "open_hands_light_skin_tone": "👐🏻", + "open_hands_medium-dark_skin_tone": "👐🏾", + "open_hands_medium-light_skin_tone": "👐🏼", + "open_hands_medium_skin_tone": "👐🏽", + "open_mailbox_with_lowered_flag": "📭", + "open_mailbox_with_raised_flag": "📬", + "optical_disk": "💿", + "orange_book": "📙", + "orange_circle": "🟠", + "orange_heart": "🧡", + "orange_square": "🟧", + "orangutan": "🦧", + "orthodox_cross": "☦", + "otter": "🦦", + "outbox_tray": "📤", + "owl": "🦉", + "ox": "🐂", + "oyster": "🦪", + "package": "📦", + "page_facing_up": "📄", + "page_with_curl": "📃", + "pager": "📟", + "paintbrush": "🖌", + "palm_tree": "🌴", + "palms_up_together": "🤲", + "palms_up_together_dark_skin_tone": "🤲🏿", + "palms_up_together_light_skin_tone": "🤲🏻", + "palms_up_together_medium-dark_skin_tone": "🤲🏾", + "palms_up_together_medium-light_skin_tone": "🤲🏼", + "palms_up_together_medium_skin_tone": "🤲🏽", + "pancakes": "🥞", + "panda_face": "🐼", + "paperclip": "📎", + "parrot": "🦜", + "part_alternation_mark": "〽", + "party_popper": "🎉", + "partying_face": "🥳", + "passenger_ship": "🛳", + "passport_control": "🛂", + "pause_button": "⏸", + "paw_prints": "🐾", + "peace_symbol": "☮", + "peach": "🍑", + "peacock": "🦚", + "peanuts": "🥜", + "pear": "🍐", + "pen": "🖊", + "pencil": "📝", + "penguin": "🐧", + "pensive_face": "😔", + "people_holding_hands": "🧑\u200d🤝\u200d🧑", + "people_with_bunny_ears": "👯", + "people_wrestling": "🤼", + "performing_arts": "🎭", + "persevering_face": "😣", + "person_biking": "🚴", + "person_biking_dark_skin_tone": "🚴🏿", + "person_biking_light_skin_tone": "🚴🏻", + "person_biking_medium-dark_skin_tone": "🚴🏾", + "person_biking_medium-light_skin_tone": "🚴🏼", + "person_biking_medium_skin_tone": "🚴🏽", + "person_bouncing_ball": "⛹", + "person_bouncing_ball_dark_skin_tone": "⛹🏿", + "person_bouncing_ball_light_skin_tone": "⛹🏻", + "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾", + "person_bouncing_ball_medium-light_skin_tone": "⛹🏼", + "person_bouncing_ball_medium_skin_tone": "⛹🏽", + "person_bowing": "🙇", + "person_bowing_dark_skin_tone": "🙇🏿", + "person_bowing_light_skin_tone": "🙇🏻", + "person_bowing_medium-dark_skin_tone": "🙇🏾", + "person_bowing_medium-light_skin_tone": "🙇🏼", + "person_bowing_medium_skin_tone": "🙇🏽", + "person_cartwheeling": "🤸", + "person_cartwheeling_dark_skin_tone": "🤸🏿", + "person_cartwheeling_light_skin_tone": "🤸🏻", + "person_cartwheeling_medium-dark_skin_tone": "🤸🏾", + "person_cartwheeling_medium-light_skin_tone": "🤸🏼", + "person_cartwheeling_medium_skin_tone": "🤸🏽", + "person_climbing": "🧗", + "person_climbing_dark_skin_tone": "🧗🏿", + "person_climbing_light_skin_tone": "🧗🏻", + "person_climbing_medium-dark_skin_tone": "🧗🏾", + "person_climbing_medium-light_skin_tone": "🧗🏼", + "person_climbing_medium_skin_tone": "🧗🏽", + "person_facepalming": "🤦", + "person_facepalming_dark_skin_tone": "🤦🏿", + "person_facepalming_light_skin_tone": "🤦🏻", + "person_facepalming_medium-dark_skin_tone": "🤦🏾", + "person_facepalming_medium-light_skin_tone": "🤦🏼", + "person_facepalming_medium_skin_tone": "🤦🏽", + "person_fencing": "🤺", + "person_frowning": "🙍", + "person_frowning_dark_skin_tone": "🙍🏿", + "person_frowning_light_skin_tone": "🙍🏻", + "person_frowning_medium-dark_skin_tone": "🙍🏾", + "person_frowning_medium-light_skin_tone": "🙍🏼", + "person_frowning_medium_skin_tone": "🙍🏽", + "person_gesturing_no": "🙅", + "person_gesturing_no_dark_skin_tone": "🙅🏿", + "person_gesturing_no_light_skin_tone": "🙅🏻", + "person_gesturing_no_medium-dark_skin_tone": "🙅🏾", + "person_gesturing_no_medium-light_skin_tone": "🙅🏼", + "person_gesturing_no_medium_skin_tone": "🙅🏽", + "person_gesturing_ok": "🙆", + "person_gesturing_ok_dark_skin_tone": "🙆🏿", + "person_gesturing_ok_light_skin_tone": "🙆🏻", + "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾", + "person_gesturing_ok_medium-light_skin_tone": "🙆🏼", + "person_gesturing_ok_medium_skin_tone": "🙆🏽", + "person_getting_haircut": "💇", + "person_getting_haircut_dark_skin_tone": "💇🏿", + "person_getting_haircut_light_skin_tone": "💇🏻", + "person_getting_haircut_medium-dark_skin_tone": "💇🏾", + "person_getting_haircut_medium-light_skin_tone": "💇🏼", + "person_getting_haircut_medium_skin_tone": "💇🏽", + "person_getting_massage": "💆", + "person_getting_massage_dark_skin_tone": "💆🏿", + "person_getting_massage_light_skin_tone": "💆🏻", + "person_getting_massage_medium-dark_skin_tone": "💆🏾", + "person_getting_massage_medium-light_skin_tone": "💆🏼", + "person_getting_massage_medium_skin_tone": "💆🏽", + "person_golfing": "🏌", + "person_golfing_dark_skin_tone": "🏌🏿", + "person_golfing_light_skin_tone": "🏌🏻", + "person_golfing_medium-dark_skin_tone": "🏌🏾", + "person_golfing_medium-light_skin_tone": "🏌🏼", + "person_golfing_medium_skin_tone": "🏌🏽", + "person_in_bed": "🛌", + "person_in_bed_dark_skin_tone": "🛌🏿", + "person_in_bed_light_skin_tone": "🛌🏻", + "person_in_bed_medium-dark_skin_tone": "🛌🏾", + "person_in_bed_medium-light_skin_tone": "🛌🏼", + "person_in_bed_medium_skin_tone": "🛌🏽", + "person_in_lotus_position": "🧘", + "person_in_lotus_position_dark_skin_tone": "🧘🏿", + "person_in_lotus_position_light_skin_tone": "🧘🏻", + "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾", + "person_in_lotus_position_medium-light_skin_tone": "🧘🏼", + "person_in_lotus_position_medium_skin_tone": "🧘🏽", + "person_in_steamy_room": "🧖", + "person_in_steamy_room_dark_skin_tone": "🧖🏿", + "person_in_steamy_room_light_skin_tone": "🧖🏻", + "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾", + "person_in_steamy_room_medium-light_skin_tone": "🧖🏼", + "person_in_steamy_room_medium_skin_tone": "🧖🏽", + "person_juggling": "🤹", + "person_juggling_dark_skin_tone": "🤹🏿", + "person_juggling_light_skin_tone": "🤹🏻", + "person_juggling_medium-dark_skin_tone": "🤹🏾", + "person_juggling_medium-light_skin_tone": "🤹🏼", + "person_juggling_medium_skin_tone": "🤹🏽", + "person_kneeling": "🧎", + "person_lifting_weights": "🏋", + "person_lifting_weights_dark_skin_tone": "🏋🏿", + "person_lifting_weights_light_skin_tone": "🏋🏻", + "person_lifting_weights_medium-dark_skin_tone": "🏋🏾", + "person_lifting_weights_medium-light_skin_tone": "🏋🏼", + "person_lifting_weights_medium_skin_tone": "🏋🏽", + "person_mountain_biking": "🚵", + "person_mountain_biking_dark_skin_tone": "🚵🏿", + "person_mountain_biking_light_skin_tone": "🚵🏻", + "person_mountain_biking_medium-dark_skin_tone": "🚵🏾", + "person_mountain_biking_medium-light_skin_tone": "🚵🏼", + "person_mountain_biking_medium_skin_tone": "🚵🏽", + "person_playing_handball": "🤾", + "person_playing_handball_dark_skin_tone": "🤾🏿", + "person_playing_handball_light_skin_tone": "🤾🏻", + "person_playing_handball_medium-dark_skin_tone": "🤾🏾", + "person_playing_handball_medium-light_skin_tone": "🤾🏼", + "person_playing_handball_medium_skin_tone": "🤾🏽", + "person_playing_water_polo": "🤽", + "person_playing_water_polo_dark_skin_tone": "🤽🏿", + "person_playing_water_polo_light_skin_tone": "🤽🏻", + "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾", + "person_playing_water_polo_medium-light_skin_tone": "🤽🏼", + "person_playing_water_polo_medium_skin_tone": "🤽🏽", + "person_pouting": "🙎", + "person_pouting_dark_skin_tone": "🙎🏿", + "person_pouting_light_skin_tone": "🙎🏻", + "person_pouting_medium-dark_skin_tone": "🙎🏾", + "person_pouting_medium-light_skin_tone": "🙎🏼", + "person_pouting_medium_skin_tone": "🙎🏽", + "person_raising_hand": "🙋", + "person_raising_hand_dark_skin_tone": "🙋🏿", + "person_raising_hand_light_skin_tone": "🙋🏻", + "person_raising_hand_medium-dark_skin_tone": "🙋🏾", + "person_raising_hand_medium-light_skin_tone": "🙋🏼", + "person_raising_hand_medium_skin_tone": "🙋🏽", + "person_rowing_boat": "🚣", + "person_rowing_boat_dark_skin_tone": "🚣🏿", + "person_rowing_boat_light_skin_tone": "🚣🏻", + "person_rowing_boat_medium-dark_skin_tone": "🚣🏾", + "person_rowing_boat_medium-light_skin_tone": "🚣🏼", + "person_rowing_boat_medium_skin_tone": "🚣🏽", + "person_running": "🏃", + "person_running_dark_skin_tone": "🏃🏿", + "person_running_light_skin_tone": "🏃🏻", + "person_running_medium-dark_skin_tone": "🏃🏾", + "person_running_medium-light_skin_tone": "🏃🏼", + "person_running_medium_skin_tone": "🏃🏽", + "person_shrugging": "🤷", + "person_shrugging_dark_skin_tone": "🤷🏿", + "person_shrugging_light_skin_tone": "🤷🏻", + "person_shrugging_medium-dark_skin_tone": "🤷🏾", + "person_shrugging_medium-light_skin_tone": "🤷🏼", + "person_shrugging_medium_skin_tone": "🤷🏽", + "person_standing": "🧍", + "person_surfing": "🏄", + "person_surfing_dark_skin_tone": "🏄🏿", + "person_surfing_light_skin_tone": "🏄🏻", + "person_surfing_medium-dark_skin_tone": "🏄🏾", + "person_surfing_medium-light_skin_tone": "🏄🏼", + "person_surfing_medium_skin_tone": "🏄🏽", + "person_swimming": "🏊", + "person_swimming_dark_skin_tone": "🏊🏿", + "person_swimming_light_skin_tone": "🏊🏻", + "person_swimming_medium-dark_skin_tone": "🏊🏾", + "person_swimming_medium-light_skin_tone": "🏊🏼", + "person_swimming_medium_skin_tone": "🏊🏽", + "person_taking_bath": "🛀", + "person_taking_bath_dark_skin_tone": "🛀🏿", + "person_taking_bath_light_skin_tone": "🛀🏻", + "person_taking_bath_medium-dark_skin_tone": "🛀🏾", + "person_taking_bath_medium-light_skin_tone": "🛀🏼", + "person_taking_bath_medium_skin_tone": "🛀🏽", + "person_tipping_hand": "💁", + "person_tipping_hand_dark_skin_tone": "💁🏿", + "person_tipping_hand_light_skin_tone": "💁🏻", + "person_tipping_hand_medium-dark_skin_tone": "💁🏾", + "person_tipping_hand_medium-light_skin_tone": "💁🏼", + "person_tipping_hand_medium_skin_tone": "💁🏽", + "person_walking": "🚶", + "person_walking_dark_skin_tone": "🚶🏿", + "person_walking_light_skin_tone": "🚶🏻", + "person_walking_medium-dark_skin_tone": "🚶🏾", + "person_walking_medium-light_skin_tone": "🚶🏼", + "person_walking_medium_skin_tone": "🚶🏽", + "person_wearing_turban": "👳", + "person_wearing_turban_dark_skin_tone": "👳🏿", + "person_wearing_turban_light_skin_tone": "👳🏻", + "person_wearing_turban_medium-dark_skin_tone": "👳🏾", + "person_wearing_turban_medium-light_skin_tone": "👳🏼", + "person_wearing_turban_medium_skin_tone": "👳🏽", + "petri_dish": "🧫", + "pick": "⛏", + "pie": "🥧", + "pig": "🐷", + "pig_face": "🐷", + "pig_nose": "🐽", + "pile_of_poo": "💩", + "pill": "💊", + "pinching_hand": "🤏", + "pine_decoration": "🎍", + "pineapple": "🍍", + "ping_pong": "🏓", + "pirate_flag": "🏴\u200d☠️", + "pistol": "🔫", + "pizza": "🍕", + "place_of_worship": "🛐", + "play_button": "▶", + "play_or_pause_button": "⏯", + "pleading_face": "🥺", + "police_car": "🚓", + "police_car_light": "🚨", + "police_officer": "👮", + "police_officer_dark_skin_tone": "👮🏿", + "police_officer_light_skin_tone": "👮🏻", + "police_officer_medium-dark_skin_tone": "👮🏾", + "police_officer_medium-light_skin_tone": "👮🏼", + "police_officer_medium_skin_tone": "👮🏽", + "poodle": "🐩", + "pool_8_ball": "🎱", + "popcorn": "🍿", + "post_office": "🏣", + "postal_horn": "📯", + "postbox": "📮", + "pot_of_food": "🍲", + "potable_water": "🚰", + "potato": "🥔", + "poultry_leg": "🍗", + "pound_banknote": "💷", + "pouting_cat_face": "😾", + "pouting_face": "😡", + "prayer_beads": "📿", + "pregnant_woman": "🤰", + "pregnant_woman_dark_skin_tone": "🤰🏿", + "pregnant_woman_light_skin_tone": "🤰🏻", + "pregnant_woman_medium-dark_skin_tone": "🤰🏾", + "pregnant_woman_medium-light_skin_tone": "🤰🏼", + "pregnant_woman_medium_skin_tone": "🤰🏽", + "pretzel": "🥨", + "probing_cane": "🦯", + "prince": "🤴", + "prince_dark_skin_tone": "🤴🏿", + "prince_light_skin_tone": "🤴🏻", + "prince_medium-dark_skin_tone": "🤴🏾", + "prince_medium-light_skin_tone": "🤴🏼", + "prince_medium_skin_tone": "🤴🏽", + "princess": "👸", + "princess_dark_skin_tone": "👸🏿", + "princess_light_skin_tone": "👸🏻", + "princess_medium-dark_skin_tone": "👸🏾", + "princess_medium-light_skin_tone": "👸🏼", + "princess_medium_skin_tone": "👸🏽", + "printer": "🖨", + "prohibited": "🚫", + "purple_circle": "🟣", + "purple_heart": "💜", + "purple_square": "🟪", + "purse": "👛", + "pushpin": "📌", + "question_mark": "❓", + "rabbit": "🐰", + "rabbit_face": "🐰", + "raccoon": "🦝", + "racing_car": "🏎", + "radio": "📻", + "radio_button": "🔘", + "radioactive": "☢", + "railway_car": "🚃", + "railway_track": "🛤", + "rainbow": "🌈", + "rainbow_flag": "🏳️\u200d🌈", + "raised_back_of_hand": "🤚", + "raised_back_of_hand_dark_skin_tone": "🤚🏿", + "raised_back_of_hand_light_skin_tone": "🤚🏻", + "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾", + "raised_back_of_hand_medium-light_skin_tone": "🤚🏼", + "raised_back_of_hand_medium_skin_tone": "🤚🏽", + "raised_fist": "✊", + "raised_fist_dark_skin_tone": "✊🏿", + "raised_fist_light_skin_tone": "✊🏻", + "raised_fist_medium-dark_skin_tone": "✊🏾", + "raised_fist_medium-light_skin_tone": "✊🏼", + "raised_fist_medium_skin_tone": "✊🏽", + "raised_hand": "✋", + "raised_hand_dark_skin_tone": "✋🏿", + "raised_hand_light_skin_tone": "✋🏻", + "raised_hand_medium-dark_skin_tone": "✋🏾", + "raised_hand_medium-light_skin_tone": "✋🏼", + "raised_hand_medium_skin_tone": "✋🏽", + "raising_hands": "🙌", + "raising_hands_dark_skin_tone": "🙌🏿", + "raising_hands_light_skin_tone": "🙌🏻", + "raising_hands_medium-dark_skin_tone": "🙌🏾", + "raising_hands_medium-light_skin_tone": "🙌🏼", + "raising_hands_medium_skin_tone": "🙌🏽", + "ram": "🐏", + "rat": "🐀", + "razor": "🪒", + "ringed_planet": "🪐", + "receipt": "🧾", + "record_button": "⏺", + "recycling_symbol": "♻", + "red_apple": "🍎", + "red_circle": "🔴", + "red_envelope": "🧧", + "red_hair": "🦰", + "red-haired_man": "👨\u200d🦰", + "red-haired_woman": "👩\u200d🦰", + "red_heart": "❤", + "red_paper_lantern": "🏮", + "red_square": "🟥", + "red_triangle_pointed_down": "🔻", + "red_triangle_pointed_up": "🔺", + "registered": "®", + "relieved_face": "😌", + "reminder_ribbon": "🎗", + "repeat_button": "🔁", + "repeat_single_button": "🔂", + "rescue_worker’s_helmet": "⛑", + "restroom": "🚻", + "reverse_button": "◀", + "revolving_hearts": "💞", + "rhinoceros": "🦏", + "ribbon": "🎀", + "rice_ball": "🍙", + "rice_cracker": "🍘", + "right-facing_fist": "🤜", + "right-facing_fist_dark_skin_tone": "🤜🏿", + "right-facing_fist_light_skin_tone": "🤜🏻", + "right-facing_fist_medium-dark_skin_tone": "🤜🏾", + "right-facing_fist_medium-light_skin_tone": "🤜🏼", + "right-facing_fist_medium_skin_tone": "🤜🏽", + "right_anger_bubble": "🗯", + "right_arrow": "➡", + "right_arrow_curving_down": "⤵", + "right_arrow_curving_left": "↩", + "right_arrow_curving_up": "⤴", + "ring": "💍", + "roasted_sweet_potato": "🍠", + "robot_face": "🤖", + "rocket": "🚀", + "roll_of_paper": "🧻", + "rolled-up_newspaper": "🗞", + "roller_coaster": "🎢", + "rolling_on_the_floor_laughing": "🤣", + "rooster": "🐓", + "rose": "🌹", + "rosette": "🏵", + "round_pushpin": "📍", + "rugby_football": "🏉", + "running_shirt": "🎽", + "running_shoe": "👟", + "sad_but_relieved_face": "😥", + "safety_pin": "🧷", + "safety_vest": "🦺", + "salt": "🧂", + "sailboat": "⛵", + "sake": "🍶", + "sandwich": "🥪", + "sari": "🥻", + "satellite": "📡", + "satellite_antenna": "📡", + "sauropod": "🦕", + "saxophone": "🎷", + "scarf": "🧣", + "school": "🏫", + "school_backpack": "🎒", + "scissors": "✂", + "scorpion": "🦂", + "scroll": "📜", + "seat": "💺", + "see-no-evil_monkey": "🙈", + "seedling": "🌱", + "selfie": "🤳", + "selfie_dark_skin_tone": "🤳🏿", + "selfie_light_skin_tone": "🤳🏻", + "selfie_medium-dark_skin_tone": "🤳🏾", + "selfie_medium-light_skin_tone": "🤳🏼", + "selfie_medium_skin_tone": "🤳🏽", + "service_dog": "🐕\u200d🦺", + "seven-thirty": "🕢", + "seven_o’clock": "🕖", + "shallow_pan_of_food": "🥘", + "shamrock": "☘", + "shark": "🦈", + "shaved_ice": "🍧", + "sheaf_of_rice": "🌾", + "shield": "🛡", + "shinto_shrine": "⛩", + "ship": "🚢", + "shooting_star": "🌠", + "shopping_bags": "🛍", + "shopping_cart": "🛒", + "shortcake": "🍰", + "shorts": "🩳", + "shower": "🚿", + "shrimp": "🦐", + "shuffle_tracks_button": "🔀", + "shushing_face": "🤫", + "sign_of_the_horns": "🤘", + "sign_of_the_horns_dark_skin_tone": "🤘🏿", + "sign_of_the_horns_light_skin_tone": "🤘🏻", + "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾", + "sign_of_the_horns_medium-light_skin_tone": "🤘🏼", + "sign_of_the_horns_medium_skin_tone": "🤘🏽", + "six-thirty": "🕡", + "six_o’clock": "🕕", + "skateboard": "🛹", + "skier": "⛷", + "skis": "🎿", + "skull": "💀", + "skull_and_crossbones": "☠", + "skunk": "🦨", + "sled": "🛷", + "sleeping_face": "😴", + "sleepy_face": "😪", + "slightly_frowning_face": "🙁", + "slightly_smiling_face": "🙂", + "slot_machine": "🎰", + "sloth": "🦥", + "small_airplane": "🛩", + "small_blue_diamond": "🔹", + "small_orange_diamond": "🔸", + "smiling_cat_face_with_heart-eyes": "😻", + "smiling_face": "☺", + "smiling_face_with_halo": "😇", + "smiling_face_with_3_hearts": "🥰", + "smiling_face_with_heart-eyes": "😍", + "smiling_face_with_horns": "😈", + "smiling_face_with_smiling_eyes": "😊", + "smiling_face_with_sunglasses": "😎", + "smirking_face": "😏", + "snail": "🐌", + "snake": "🐍", + "sneezing_face": "🤧", + "snow-capped_mountain": "🏔", + "snowboarder": "🏂", + "snowboarder_dark_skin_tone": "🏂🏿", + "snowboarder_light_skin_tone": "🏂🏻", + "snowboarder_medium-dark_skin_tone": "🏂🏾", + "snowboarder_medium-light_skin_tone": "🏂🏼", + "snowboarder_medium_skin_tone": "🏂🏽", + "snowflake": "❄", + "snowman": "☃", + "snowman_without_snow": "⛄", + "soap": "🧼", + "soccer_ball": "⚽", + "socks": "🧦", + "softball": "🥎", + "soft_ice_cream": "🍦", + "spade_suit": "♠", + "spaghetti": "🍝", + "sparkle": "❇", + "sparkler": "🎇", + "sparkles": "✨", + "sparkling_heart": "💖", + "speak-no-evil_monkey": "🙊", + "speaker_high_volume": "🔊", + "speaker_low_volume": "🔈", + "speaker_medium_volume": "🔉", + "speaking_head": "🗣", + "speech_balloon": "💬", + "speedboat": "🚤", + "spider": "🕷", + "spider_web": "🕸", + "spiral_calendar": "🗓", + "spiral_notepad": "🗒", + "spiral_shell": "🐚", + "spoon": "🥄", + "sponge": "🧽", + "sport_utility_vehicle": "🚙", + "sports_medal": "🏅", + "spouting_whale": "🐳", + "squid": "🦑", + "squinting_face_with_tongue": "😝", + "stadium": "🏟", + "star-struck": "🤩", + "star_and_crescent": "☪", + "star_of_david": "✡", + "station": "🚉", + "steaming_bowl": "🍜", + "stethoscope": "🩺", + "stop_button": "⏹", + "stop_sign": "🛑", + "stopwatch": "⏱", + "straight_ruler": "📏", + "strawberry": "🍓", + "studio_microphone": "🎙", + "stuffed_flatbread": "🥙", + "sun": "☀", + "sun_behind_cloud": "⛅", + "sun_behind_large_cloud": "🌥", + "sun_behind_rain_cloud": "🌦", + "sun_behind_small_cloud": "🌤", + "sun_with_face": "🌞", + "sunflower": "🌻", + "sunglasses": "😎", + "sunrise": "🌅", + "sunrise_over_mountains": "🌄", + "sunset": "🌇", + "superhero": "🦸", + "supervillain": "🦹", + "sushi": "🍣", + "suspension_railway": "🚟", + "swan": "🦢", + "sweat_droplets": "💦", + "synagogue": "🕍", + "syringe": "💉", + "t-shirt": "👕", + "taco": "🌮", + "takeout_box": "🥡", + "tanabata_tree": "🎋", + "tangerine": "🍊", + "taxi": "🚕", + "teacup_without_handle": "🍵", + "tear-off_calendar": "📆", + "teddy_bear": "🧸", + "telephone": "☎", + "telephone_receiver": "📞", + "telescope": "🔭", + "television": "📺", + "ten-thirty": "🕥", + "ten_o’clock": "🕙", + "tennis": "🎾", + "tent": "⛺", + "test_tube": "🧪", + "thermometer": "🌡", + "thinking_face": "🤔", + "thought_balloon": "💭", + "thread": "🧵", + "three-thirty": "🕞", + "three_o’clock": "🕒", + "thumbs_down": "👎", + "thumbs_down_dark_skin_tone": "👎🏿", + "thumbs_down_light_skin_tone": "👎🏻", + "thumbs_down_medium-dark_skin_tone": "👎🏾", + "thumbs_down_medium-light_skin_tone": "👎🏼", + "thumbs_down_medium_skin_tone": "👎🏽", + "thumbs_up": "👍", + "thumbs_up_dark_skin_tone": "👍🏿", + "thumbs_up_light_skin_tone": "👍🏻", + "thumbs_up_medium-dark_skin_tone": "👍🏾", + "thumbs_up_medium-light_skin_tone": "👍🏼", + "thumbs_up_medium_skin_tone": "👍🏽", + "ticket": "🎫", + "tiger": "🐯", + "tiger_face": "🐯", + "timer_clock": "⏲", + "tired_face": "😫", + "toolbox": "🧰", + "toilet": "🚽", + "tomato": "🍅", + "tongue": "👅", + "tooth": "🦷", + "top_hat": "🎩", + "tornado": "🌪", + "trackball": "🖲", + "tractor": "🚜", + "trade_mark": "™", + "train": "🚋", + "tram": "🚊", + "tram_car": "🚋", + "triangular_flag": "🚩", + "triangular_ruler": "📐", + "trident_emblem": "🔱", + "trolleybus": "🚎", + "trophy": "🏆", + "tropical_drink": "🍹", + "tropical_fish": "🐠", + "trumpet": "🎺", + "tulip": "🌷", + "tumbler_glass": "🥃", + "turtle": "🐢", + "twelve-thirty": "🕧", + "twelve_o’clock": "🕛", + "two-hump_camel": "🐫", + "two-thirty": "🕝", + "two_hearts": "💕", + "two_men_holding_hands": "👬", + "two_o’clock": "🕑", + "two_women_holding_hands": "👭", + "umbrella": "☂", + "umbrella_on_ground": "⛱", + "umbrella_with_rain_drops": "☔", + "unamused_face": "😒", + "unicorn_face": "🦄", + "unlocked": "🔓", + "up-down_arrow": "↕", + "up-left_arrow": "↖", + "up-right_arrow": "↗", + "up_arrow": "⬆", + "upside-down_face": "🙃", + "upwards_button": "🔼", + "vampire": "🧛", + "vampire_dark_skin_tone": "🧛🏿", + "vampire_light_skin_tone": "🧛🏻", + "vampire_medium-dark_skin_tone": "🧛🏾", + "vampire_medium-light_skin_tone": "🧛🏼", + "vampire_medium_skin_tone": "🧛🏽", + "vertical_traffic_light": "🚦", + "vibration_mode": "📳", + "victory_hand": "✌", + "victory_hand_dark_skin_tone": "✌🏿", + "victory_hand_light_skin_tone": "✌🏻", + "victory_hand_medium-dark_skin_tone": "✌🏾", + "victory_hand_medium-light_skin_tone": "✌🏼", + "victory_hand_medium_skin_tone": "✌🏽", + "video_camera": "📹", + "video_game": "🎮", + "videocassette": "📼", + "violin": "🎻", + "volcano": "🌋", + "volleyball": "🏐", + "vulcan_salute": "🖖", + "vulcan_salute_dark_skin_tone": "🖖🏿", + "vulcan_salute_light_skin_tone": "🖖🏻", + "vulcan_salute_medium-dark_skin_tone": "🖖🏾", + "vulcan_salute_medium-light_skin_tone": "🖖🏼", + "vulcan_salute_medium_skin_tone": "🖖🏽", + "waffle": "🧇", + "waning_crescent_moon": "🌘", + "waning_gibbous_moon": "🌖", + "warning": "⚠", + "wastebasket": "🗑", + "watch": "⌚", + "water_buffalo": "🐃", + "water_closet": "🚾", + "water_wave": "🌊", + "watermelon": "🍉", + "waving_hand": "👋", + "waving_hand_dark_skin_tone": "👋🏿", + "waving_hand_light_skin_tone": "👋🏻", + "waving_hand_medium-dark_skin_tone": "👋🏾", + "waving_hand_medium-light_skin_tone": "👋🏼", + "waving_hand_medium_skin_tone": "👋🏽", + "wavy_dash": "〰", + "waxing_crescent_moon": "🌒", + "waxing_gibbous_moon": "🌔", + "weary_cat_face": "🙀", + "weary_face": "😩", + "wedding": "💒", + "whale": "🐳", + "wheel_of_dharma": "☸", + "wheelchair_symbol": "♿", + "white_circle": "⚪", + "white_exclamation_mark": "❕", + "white_flag": "🏳", + "white_flower": "💮", + "white_hair": "🦳", + "white-haired_man": "👨\u200d🦳", + "white-haired_woman": "👩\u200d🦳", + "white_heart": "🤍", + "white_heavy_check_mark": "✅", + "white_large_square": "⬜", + "white_medium-small_square": "◽", + "white_medium_square": "◻", + "white_medium_star": "⭐", + "white_question_mark": "❔", + "white_small_square": "▫", + "white_square_button": "🔳", + "wilted_flower": "🥀", + "wind_chime": "🎐", + "wind_face": "🌬", + "wine_glass": "🍷", + "winking_face": "😉", + "winking_face_with_tongue": "😜", + "wolf_face": "🐺", + "woman": "👩", + "woman_artist": "👩\u200d🎨", + "woman_artist_dark_skin_tone": "👩🏿\u200d🎨", + "woman_artist_light_skin_tone": "👩🏻\u200d🎨", + "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨", + "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨", + "woman_artist_medium_skin_tone": "👩🏽\u200d🎨", + "woman_astronaut": "👩\u200d🚀", + "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀", + "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀", + "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀", + "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀", + "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀", + "woman_biking": "🚴\u200d♀️", + "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️", + "woman_biking_light_skin_tone": "🚴🏻\u200d♀️", + "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️", + "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️", + "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️", + "woman_bouncing_ball": "⛹️\u200d♀️", + "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️", + "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️", + "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️", + "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️", + "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️", + "woman_bowing": "🙇\u200d♀️", + "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️", + "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️", + "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️", + "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️", + "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️", + "woman_cartwheeling": "🤸\u200d♀️", + "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️", + "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️", + "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️", + "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️", + "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️", + "woman_climbing": "🧗\u200d♀️", + "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️", + "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️", + "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️", + "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️", + "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️", + "woman_construction_worker": "👷\u200d♀️", + "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️", + "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️", + "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️", + "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️", + "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️", + "woman_cook": "👩\u200d🍳", + "woman_cook_dark_skin_tone": "👩🏿\u200d🍳", + "woman_cook_light_skin_tone": "👩🏻\u200d🍳", + "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳", + "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳", + "woman_cook_medium_skin_tone": "👩🏽\u200d🍳", + "woman_dancing": "💃", + "woman_dancing_dark_skin_tone": "💃🏿", + "woman_dancing_light_skin_tone": "💃🏻", + "woman_dancing_medium-dark_skin_tone": "💃🏾", + "woman_dancing_medium-light_skin_tone": "💃🏼", + "woman_dancing_medium_skin_tone": "💃🏽", + "woman_dark_skin_tone": "👩🏿", + "woman_detective": "🕵️\u200d♀️", + "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️", + "woman_detective_light_skin_tone": "🕵🏻\u200d♀️", + "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️", + "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️", + "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️", + "woman_elf": "🧝\u200d♀️", + "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️", + "woman_elf_light_skin_tone": "🧝🏻\u200d♀️", + "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️", + "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️", + "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️", + "woman_facepalming": "🤦\u200d♀️", + "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️", + "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️", + "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️", + "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️", + "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️", + "woman_factory_worker": "👩\u200d🏭", + "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭", + "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭", + "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭", + "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭", + "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭", + "woman_fairy": "🧚\u200d♀️", + "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️", + "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️", + "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️", + "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️", + "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️", + "woman_farmer": "👩\u200d🌾", + "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾", + "woman_farmer_light_skin_tone": "👩🏻\u200d🌾", + "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾", + "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾", + "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾", + "woman_firefighter": "👩\u200d🚒", + "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒", + "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒", + "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒", + "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒", + "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒", + "woman_frowning": "🙍\u200d♀️", + "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️", + "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️", + "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️", + "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️", + "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️", + "woman_genie": "🧞\u200d♀️", + "woman_gesturing_no": "🙅\u200d♀️", + "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️", + "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️", + "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️", + "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️", + "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️", + "woman_gesturing_ok": "🙆\u200d♀️", + "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️", + "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️", + "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️", + "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️", + "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️", + "woman_getting_haircut": "💇\u200d♀️", + "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️", + "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️", + "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️", + "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️", + "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️", + "woman_getting_massage": "💆\u200d♀️", + "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️", + "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️", + "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️", + "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️", + "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️", + "woman_golfing": "🏌️\u200d♀️", + "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️", + "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️", + "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️", + "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️", + "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️", + "woman_guard": "💂\u200d♀️", + "woman_guard_dark_skin_tone": "💂🏿\u200d♀️", + "woman_guard_light_skin_tone": "💂🏻\u200d♀️", + "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️", + "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️", + "woman_guard_medium_skin_tone": "💂🏽\u200d♀️", + "woman_health_worker": "👩\u200d⚕️", + "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️", + "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️", + "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️", + "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️", + "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️", + "woman_in_lotus_position": "🧘\u200d♀️", + "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️", + "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️", + "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️", + "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️", + "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️", + "woman_in_manual_wheelchair": "👩\u200d🦽", + "woman_in_motorized_wheelchair": "👩\u200d🦼", + "woman_in_steamy_room": "🧖\u200d♀️", + "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️", + "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️", + "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️", + "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️", + "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️", + "woman_judge": "👩\u200d⚖️", + "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️", + "woman_judge_light_skin_tone": "👩🏻\u200d⚖️", + "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️", + "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️", + "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️", + "woman_juggling": "🤹\u200d♀️", + "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️", + "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️", + "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️", + "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️", + "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️", + "woman_lifting_weights": "🏋️\u200d♀️", + "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️", + "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️", + "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️", + "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️", + "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️", + "woman_light_skin_tone": "👩🏻", + "woman_mage": "🧙\u200d♀️", + "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️", + "woman_mage_light_skin_tone": "🧙🏻\u200d♀️", + "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️", + "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️", + "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️", + "woman_mechanic": "👩\u200d🔧", + "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧", + "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧", + "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧", + "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧", + "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧", + "woman_medium-dark_skin_tone": "👩🏾", + "woman_medium-light_skin_tone": "👩🏼", + "woman_medium_skin_tone": "👩🏽", + "woman_mountain_biking": "🚵\u200d♀️", + "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️", + "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️", + "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️", + "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️", + "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️", + "woman_office_worker": "👩\u200d💼", + "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼", + "woman_office_worker_light_skin_tone": "👩🏻\u200d💼", + "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼", + "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼", + "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼", + "woman_pilot": "👩\u200d✈️", + "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️", + "woman_pilot_light_skin_tone": "👩🏻\u200d✈️", + "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️", + "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️", + "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️", + "woman_playing_handball": "🤾\u200d♀️", + "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️", + "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️", + "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️", + "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️", + "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️", + "woman_playing_water_polo": "🤽\u200d♀️", + "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️", + "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️", + "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️", + "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️", + "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️", + "woman_police_officer": "👮\u200d♀️", + "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️", + "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️", + "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️", + "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️", + "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️", + "woman_pouting": "🙎\u200d♀️", + "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️", + "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️", + "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️", + "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️", + "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️", + "woman_raising_hand": "🙋\u200d♀️", + "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️", + "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️", + "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️", + "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️", + "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️", + "woman_rowing_boat": "🚣\u200d♀️", + "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️", + "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️", + "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️", + "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️", + "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️", + "woman_running": "🏃\u200d♀️", + "woman_running_dark_skin_tone": "🏃🏿\u200d♀️", + "woman_running_light_skin_tone": "🏃🏻\u200d♀️", + "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️", + "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️", + "woman_running_medium_skin_tone": "🏃🏽\u200d♀️", + "woman_scientist": "👩\u200d🔬", + "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬", + "woman_scientist_light_skin_tone": "👩🏻\u200d🔬", + "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬", + "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬", + "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬", + "woman_shrugging": "🤷\u200d♀️", + "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️", + "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️", + "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️", + "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️", + "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️", + "woman_singer": "👩\u200d🎤", + "woman_singer_dark_skin_tone": "👩🏿\u200d🎤", + "woman_singer_light_skin_tone": "👩🏻\u200d🎤", + "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤", + "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤", + "woman_singer_medium_skin_tone": "👩🏽\u200d🎤", + "woman_student": "👩\u200d🎓", + "woman_student_dark_skin_tone": "👩🏿\u200d🎓", + "woman_student_light_skin_tone": "👩🏻\u200d🎓", + "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓", + "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓", + "woman_student_medium_skin_tone": "👩🏽\u200d🎓", + "woman_surfing": "🏄\u200d♀️", + "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️", + "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️", + "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️", + "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️", + "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️", + "woman_swimming": "🏊\u200d♀️", + "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️", + "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️", + "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️", + "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️", + "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️", + "woman_teacher": "👩\u200d🏫", + "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫", + "woman_teacher_light_skin_tone": "👩🏻\u200d🏫", + "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫", + "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫", + "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫", + "woman_technologist": "👩\u200d💻", + "woman_technologist_dark_skin_tone": "👩🏿\u200d💻", + "woman_technologist_light_skin_tone": "👩🏻\u200d💻", + "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻", + "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻", + "woman_technologist_medium_skin_tone": "👩🏽\u200d💻", + "woman_tipping_hand": "💁\u200d♀️", + "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️", + "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️", + "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️", + "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️", + "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️", + "woman_vampire": "🧛\u200d♀️", + "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️", + "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️", + "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️", + "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️", + "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️", + "woman_walking": "🚶\u200d♀️", + "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️", + "woman_walking_light_skin_tone": "🚶🏻\u200d♀️", + "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️", + "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️", + "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️", + "woman_wearing_turban": "👳\u200d♀️", + "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️", + "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️", + "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️", + "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️", + "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️", + "woman_with_headscarf": "🧕", + "woman_with_headscarf_dark_skin_tone": "🧕🏿", + "woman_with_headscarf_light_skin_tone": "🧕🏻", + "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾", + "woman_with_headscarf_medium-light_skin_tone": "🧕🏼", + "woman_with_headscarf_medium_skin_tone": "🧕🏽", + "woman_with_probing_cane": "👩\u200d🦯", + "woman_zombie": "🧟\u200d♀️", + "woman’s_boot": "👢", + "woman’s_clothes": "👚", + "woman’s_hat": "👒", + "woman’s_sandal": "👡", + "women_with_bunny_ears": "👯\u200d♀️", + "women_wrestling": "🤼\u200d♀️", + "women’s_room": "🚺", + "woozy_face": "🥴", + "world_map": "🗺", + "worried_face": "😟", + "wrapped_gift": "🎁", + "wrench": "🔧", + "writing_hand": "✍", + "writing_hand_dark_skin_tone": "✍🏿", + "writing_hand_light_skin_tone": "✍🏻", + "writing_hand_medium-dark_skin_tone": "✍🏾", + "writing_hand_medium-light_skin_tone": "✍🏼", + "writing_hand_medium_skin_tone": "✍🏽", + "yarn": "🧶", + "yawning_face": "🥱", + "yellow_circle": "🟡", + "yellow_heart": "💛", + "yellow_square": "🟨", + "yen_banknote": "💴", + "yo-yo": "🪀", + "yin_yang": "☯", + "zany_face": "🤪", + "zebra": "🦓", + "zipper-mouth_face": "🤐", + "zombie": "🧟", + "zzz": "💤", + "åland_islands": "🇦🇽", + "keycap_asterisk": "*⃣", + "keycap_digit_eight": "8⃣", + "keycap_digit_five": "5⃣", + "keycap_digit_four": "4⃣", + "keycap_digit_nine": "9⃣", + "keycap_digit_one": "1⃣", + "keycap_digit_seven": "7⃣", + "keycap_digit_six": "6⃣", + "keycap_digit_three": "3⃣", + "keycap_digit_two": "2⃣", + "keycap_digit_zero": "0⃣", + "keycap_number_sign": "#⃣", + "light_skin_tone": "🏻", + "medium_light_skin_tone": "🏼", + "medium_skin_tone": "🏽", + "medium_dark_skin_tone": "🏾", + "dark_skin_tone": "🏿", + "regional_indicator_symbol_letter_a": "🇦", + "regional_indicator_symbol_letter_b": "🇧", + "regional_indicator_symbol_letter_c": "🇨", + "regional_indicator_symbol_letter_d": "🇩", + "regional_indicator_symbol_letter_e": "🇪", + "regional_indicator_symbol_letter_f": "🇫", + "regional_indicator_symbol_letter_g": "🇬", + "regional_indicator_symbol_letter_h": "🇭", + "regional_indicator_symbol_letter_i": "🇮", + "regional_indicator_symbol_letter_j": "🇯", + "regional_indicator_symbol_letter_k": "🇰", + "regional_indicator_symbol_letter_l": "🇱", + "regional_indicator_symbol_letter_m": "🇲", + "regional_indicator_symbol_letter_n": "🇳", + "regional_indicator_symbol_letter_o": "🇴", + "regional_indicator_symbol_letter_p": "🇵", + "regional_indicator_symbol_letter_q": "🇶", + "regional_indicator_symbol_letter_r": "🇷", + "regional_indicator_symbol_letter_s": "🇸", + "regional_indicator_symbol_letter_t": "🇹", + "regional_indicator_symbol_letter_u": "🇺", + "regional_indicator_symbol_letter_v": "🇻", + "regional_indicator_symbol_letter_w": "🇼", + "regional_indicator_symbol_letter_x": "🇽", + "regional_indicator_symbol_letter_y": "🇾", + "regional_indicator_symbol_letter_z": "🇿", + "airplane_arriving": "🛬", + "space_invader": "👾", + "football": "🏈", + "anger": "💢", + "angry": "😠", + "anguished": "😧", + "signal_strength": "📶", + "arrows_counterclockwise": "🔄", + "arrow_heading_down": "⤵", + "arrow_heading_up": "⤴", + "art": "🎨", + "astonished": "😲", + "athletic_shoe": "👟", + "atm": "🏧", + "car": "🚗", + "red_car": "🚗", + "angel": "👼", + "back": "🔙", + "badminton_racquet_and_shuttlecock": "🏸", + "dollar": "💵", + "euro": "💶", + "pound": "💷", + "yen": "💴", + "barber": "💈", + "bath": "🛀", + "bear": "🐻", + "heartbeat": "💓", + "beer": "🍺", + "no_bell": "🔕", + "bento": "🍱", + "bike": "🚲", + "bicyclist": "🚴", + "8ball": "🎱", + "biohazard_sign": "☣", + "birthday": "🎂", + "black_circle_for_record": "⏺", + "clubs": "♣", + "diamonds": "♦", + "arrow_double_down": "⏬", + "hearts": "♥", + "rewind": "⏪", + "black_left__pointing_double_triangle_with_vertical_bar": "⏮", + "arrow_backward": "◀", + "black_medium_small_square": "◾", + "question": "❓", + "fast_forward": "⏩", + "black_right__pointing_double_triangle_with_vertical_bar": "⏭", + "arrow_forward": "▶", + "black_right__pointing_triangle_with_double_vertical_bar": "⏯", + "arrow_right": "➡", + "spades": "♠", + "black_square_for_stop": "⏹", + "sunny": "☀", + "phone": "☎", + "recycle": "♻", + "arrow_double_up": "⏫", + "busstop": "🚏", + "date": "📅", + "flags": "🎏", + "cat2": "🐈", + "joy_cat": "😹", + "smirk_cat": "😼", + "chart_with_downwards_trend": "📉", + "chart_with_upwards_trend": "📈", + "chart": "💹", + "mega": "📣", + "checkered_flag": "🏁", + "accept": "🉑", + "ideograph_advantage": "🉐", + "congratulations": "㊗", + "secret": "㊙", + "m": "Ⓜ", + "city_sunset": "🌆", + "clapper": "🎬", + "clap": "👏", + "beers": "🍻", + "clock830": "🕣", + "clock8": "🕗", + "clock1130": "🕦", + "clock11": "🕚", + "clock530": "🕠", + "clock5": "🕔", + "clock430": "🕟", + "clock4": "🕓", + "clock930": "🕤", + "clock9": "🕘", + "clock130": "🕜", + "clock1": "🕐", + "clock730": "🕢", + "clock7": "🕖", + "clock630": "🕡", + "clock6": "🕕", + "clock1030": "🕥", + "clock10": "🕙", + "clock330": "🕞", + "clock3": "🕒", + "clock1230": "🕧", + "clock12": "🕛", + "clock230": "🕝", + "clock2": "🕑", + "arrows_clockwise": "🔃", + "repeat": "🔁", + "repeat_one": "🔂", + "closed_lock_with_key": "🔐", + "mailbox_closed": "📪", + "mailbox": "📫", + "cloud_with_tornado": "🌪", + "cocktail": "🍸", + "boom": "💥", + "compression": "🗜", + "confounded": "😖", + "confused": "😕", + "rice": "🍚", + "cow2": "🐄", + "cricket_bat_and_ball": "🏏", + "x": "❌", + "cry": "😢", + "curry": "🍛", + "dagger_knife": "🗡", + "dancer": "💃", + "dark_sunglasses": "🕶", + "dash": "💨", + "truck": "🚚", + "derelict_house_building": "🏚", + "diamond_shape_with_a_dot_inside": "💠", + "dart": "🎯", + "disappointed_relieved": "😥", + "disappointed": "😞", + "do_not_litter": "🚯", + "dog2": "🐕", + "flipper": "🐬", + "loop": "➿", + "bangbang": "‼", + "double_vertical_bar": "⏸", + "dove_of_peace": "🕊", + "small_red_triangle_down": "🔻", + "arrow_down_small": "🔽", + "arrow_down": "⬇", + "dromedary_camel": "🐪", + "e__mail": "📧", + "corn": "🌽", + "ear_of_rice": "🌾", + "earth_americas": "🌎", + "earth_asia": "🌏", + "earth_africa": "🌍", + "eight_pointed_black_star": "✴", + "eight_spoked_asterisk": "✳", + "eject_symbol": "⏏", + "bulb": "💡", + "emoji_modifier_fitzpatrick_type__1__2": "🏻", + "emoji_modifier_fitzpatrick_type__3": "🏼", + "emoji_modifier_fitzpatrick_type__4": "🏽", + "emoji_modifier_fitzpatrick_type__5": "🏾", + "emoji_modifier_fitzpatrick_type__6": "🏿", + "end": "🔚", + "email": "✉", + "european_castle": "🏰", + "european_post_office": "🏤", + "interrobang": "⁉", + "expressionless": "😑", + "eyeglasses": "👓", + "massage": "💆", + "yum": "😋", + "scream": "😱", + "kissing_heart": "😘", + "sweat": "😓", + "face_with_head__bandage": "🤕", + "triumph": "😤", + "mask": "😷", + "no_good": "🙅", + "ok_woman": "🙆", + "open_mouth": "😮", + "cold_sweat": "😰", + "stuck_out_tongue": "😛", + "stuck_out_tongue_closed_eyes": "😝", + "stuck_out_tongue_winking_eye": "😜", + "joy": "😂", + "no_mouth": "😶", + "santa": "🎅", + "fax": "📠", + "fearful": "😨", + "field_hockey_stick_and_ball": "🏑", + "first_quarter_moon_with_face": "🌛", + "fish_cake": "🍥", + "fishing_pole_and_fish": "🎣", + "facepunch": "👊", + "punch": "👊", + "flag_for_afghanistan": "🇦🇫", + "flag_for_albania": "🇦🇱", + "flag_for_algeria": "🇩🇿", + "flag_for_american_samoa": "🇦🇸", + "flag_for_andorra": "🇦🇩", + "flag_for_angola": "🇦🇴", + "flag_for_anguilla": "🇦🇮", + "flag_for_antarctica": "🇦🇶", + "flag_for_antigua_&_barbuda": "🇦🇬", + "flag_for_argentina": "🇦🇷", + "flag_for_armenia": "🇦🇲", + "flag_for_aruba": "🇦🇼", + "flag_for_ascension_island": "🇦🇨", + "flag_for_australia": "🇦🇺", + "flag_for_austria": "🇦🇹", + "flag_for_azerbaijan": "🇦🇿", + "flag_for_bahamas": "🇧🇸", + "flag_for_bahrain": "🇧🇭", + "flag_for_bangladesh": "🇧🇩", + "flag_for_barbados": "🇧🇧", + "flag_for_belarus": "🇧🇾", + "flag_for_belgium": "🇧🇪", + "flag_for_belize": "🇧🇿", + "flag_for_benin": "🇧🇯", + "flag_for_bermuda": "🇧🇲", + "flag_for_bhutan": "🇧🇹", + "flag_for_bolivia": "🇧🇴", + "flag_for_bosnia_&_herzegovina": "🇧🇦", + "flag_for_botswana": "🇧🇼", + "flag_for_bouvet_island": "🇧🇻", + "flag_for_brazil": "🇧🇷", + "flag_for_british_indian_ocean_territory": "🇮🇴", + "flag_for_british_virgin_islands": "🇻🇬", + "flag_for_brunei": "🇧🇳", + "flag_for_bulgaria": "🇧🇬", + "flag_for_burkina_faso": "🇧🇫", + "flag_for_burundi": "🇧🇮", + "flag_for_cambodia": "🇰🇭", + "flag_for_cameroon": "🇨🇲", + "flag_for_canada": "🇨🇦", + "flag_for_canary_islands": "🇮🇨", + "flag_for_cape_verde": "🇨🇻", + "flag_for_caribbean_netherlands": "🇧🇶", + "flag_for_cayman_islands": "🇰🇾", + "flag_for_central_african_republic": "🇨🇫", + "flag_for_ceuta_&_melilla": "🇪🇦", + "flag_for_chad": "🇹🇩", + "flag_for_chile": "🇨🇱", + "flag_for_china": "🇨🇳", + "flag_for_christmas_island": "🇨🇽", + "flag_for_clipperton_island": "🇨🇵", + "flag_for_cocos__islands": "🇨🇨", + "flag_for_colombia": "🇨🇴", + "flag_for_comoros": "🇰🇲", + "flag_for_congo____brazzaville": "🇨🇬", + "flag_for_congo____kinshasa": "🇨🇩", + "flag_for_cook_islands": "🇨🇰", + "flag_for_costa_rica": "🇨🇷", + "flag_for_croatia": "🇭🇷", + "flag_for_cuba": "🇨🇺", + "flag_for_curaçao": "🇨🇼", + "flag_for_cyprus": "🇨🇾", + "flag_for_czech_republic": "🇨🇿", + "flag_for_côte_d’ivoire": "🇨🇮", + "flag_for_denmark": "🇩🇰", + "flag_for_diego_garcia": "🇩🇬", + "flag_for_djibouti": "🇩🇯", + "flag_for_dominica": "🇩🇲", + "flag_for_dominican_republic": "🇩🇴", + "flag_for_ecuador": "🇪🇨", + "flag_for_egypt": "🇪🇬", + "flag_for_el_salvador": "🇸🇻", + "flag_for_equatorial_guinea": "🇬🇶", + "flag_for_eritrea": "🇪🇷", + "flag_for_estonia": "🇪🇪", + "flag_for_ethiopia": "🇪🇹", + "flag_for_european_union": "🇪🇺", + "flag_for_falkland_islands": "🇫🇰", + "flag_for_faroe_islands": "🇫🇴", + "flag_for_fiji": "🇫🇯", + "flag_for_finland": "🇫🇮", + "flag_for_france": "🇫🇷", + "flag_for_french_guiana": "🇬🇫", + "flag_for_french_polynesia": "🇵🇫", + "flag_for_french_southern_territories": "🇹🇫", + "flag_for_gabon": "🇬🇦", + "flag_for_gambia": "🇬🇲", + "flag_for_georgia": "🇬🇪", + "flag_for_germany": "🇩🇪", + "flag_for_ghana": "🇬🇭", + "flag_for_gibraltar": "🇬🇮", + "flag_for_greece": "🇬🇷", + "flag_for_greenland": "🇬🇱", + "flag_for_grenada": "🇬🇩", + "flag_for_guadeloupe": "🇬🇵", + "flag_for_guam": "🇬🇺", + "flag_for_guatemala": "🇬🇹", + "flag_for_guernsey": "🇬🇬", + "flag_for_guinea": "🇬🇳", + "flag_for_guinea__bissau": "🇬🇼", + "flag_for_guyana": "🇬🇾", + "flag_for_haiti": "🇭🇹", + "flag_for_heard_&_mcdonald_islands": "🇭🇲", + "flag_for_honduras": "🇭🇳", + "flag_for_hong_kong": "🇭🇰", + "flag_for_hungary": "🇭🇺", + "flag_for_iceland": "🇮🇸", + "flag_for_india": "🇮🇳", + "flag_for_indonesia": "🇮🇩", + "flag_for_iran": "🇮🇷", + "flag_for_iraq": "🇮🇶", + "flag_for_ireland": "🇮🇪", + "flag_for_isle_of_man": "🇮🇲", + "flag_for_israel": "🇮🇱", + "flag_for_italy": "🇮🇹", + "flag_for_jamaica": "🇯🇲", + "flag_for_japan": "🇯🇵", + "flag_for_jersey": "🇯🇪", + "flag_for_jordan": "🇯🇴", + "flag_for_kazakhstan": "🇰🇿", + "flag_for_kenya": "🇰🇪", + "flag_for_kiribati": "🇰🇮", + "flag_for_kosovo": "🇽🇰", + "flag_for_kuwait": "🇰🇼", + "flag_for_kyrgyzstan": "🇰🇬", + "flag_for_laos": "🇱🇦", + "flag_for_latvia": "🇱🇻", + "flag_for_lebanon": "🇱🇧", + "flag_for_lesotho": "🇱🇸", + "flag_for_liberia": "🇱🇷", + "flag_for_libya": "🇱🇾", + "flag_for_liechtenstein": "🇱🇮", + "flag_for_lithuania": "🇱🇹", + "flag_for_luxembourg": "🇱🇺", + "flag_for_macau": "🇲🇴", + "flag_for_macedonia": "🇲🇰", + "flag_for_madagascar": "🇲🇬", + "flag_for_malawi": "🇲🇼", + "flag_for_malaysia": "🇲🇾", + "flag_for_maldives": "🇲🇻", + "flag_for_mali": "🇲🇱", + "flag_for_malta": "🇲🇹", + "flag_for_marshall_islands": "🇲🇭", + "flag_for_martinique": "🇲🇶", + "flag_for_mauritania": "🇲🇷", + "flag_for_mauritius": "🇲🇺", + "flag_for_mayotte": "🇾🇹", + "flag_for_mexico": "🇲🇽", + "flag_for_micronesia": "🇫🇲", + "flag_for_moldova": "🇲🇩", + "flag_for_monaco": "🇲🇨", + "flag_for_mongolia": "🇲🇳", + "flag_for_montenegro": "🇲🇪", + "flag_for_montserrat": "🇲🇸", + "flag_for_morocco": "🇲🇦", + "flag_for_mozambique": "🇲🇿", + "flag_for_myanmar": "🇲🇲", + "flag_for_namibia": "🇳🇦", + "flag_for_nauru": "🇳🇷", + "flag_for_nepal": "🇳🇵", + "flag_for_netherlands": "🇳🇱", + "flag_for_new_caledonia": "🇳🇨", + "flag_for_new_zealand": "🇳🇿", + "flag_for_nicaragua": "🇳🇮", + "flag_for_niger": "🇳🇪", + "flag_for_nigeria": "🇳🇬", + "flag_for_niue": "🇳🇺", + "flag_for_norfolk_island": "🇳🇫", + "flag_for_north_korea": "🇰🇵", + "flag_for_northern_mariana_islands": "🇲🇵", + "flag_for_norway": "🇳🇴", + "flag_for_oman": "🇴🇲", + "flag_for_pakistan": "🇵🇰", + "flag_for_palau": "🇵🇼", + "flag_for_palestinian_territories": "🇵🇸", + "flag_for_panama": "🇵🇦", + "flag_for_papua_new_guinea": "🇵🇬", + "flag_for_paraguay": "🇵🇾", + "flag_for_peru": "🇵🇪", + "flag_for_philippines": "🇵🇭", + "flag_for_pitcairn_islands": "🇵🇳", + "flag_for_poland": "🇵🇱", + "flag_for_portugal": "🇵🇹", + "flag_for_puerto_rico": "🇵🇷", + "flag_for_qatar": "🇶🇦", + "flag_for_romania": "🇷🇴", + "flag_for_russia": "🇷🇺", + "flag_for_rwanda": "🇷🇼", + "flag_for_réunion": "🇷🇪", + "flag_for_samoa": "🇼🇸", + "flag_for_san_marino": "🇸🇲", + "flag_for_saudi_arabia": "🇸🇦", + "flag_for_senegal": "🇸🇳", + "flag_for_serbia": "🇷🇸", + "flag_for_seychelles": "🇸🇨", + "flag_for_sierra_leone": "🇸🇱", + "flag_for_singapore": "🇸🇬", + "flag_for_sint_maarten": "🇸🇽", + "flag_for_slovakia": "🇸🇰", + "flag_for_slovenia": "🇸🇮", + "flag_for_solomon_islands": "🇸🇧", + "flag_for_somalia": "🇸🇴", + "flag_for_south_africa": "🇿🇦", + "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸", + "flag_for_south_korea": "🇰🇷", + "flag_for_south_sudan": "🇸🇸", + "flag_for_spain": "🇪🇸", + "flag_for_sri_lanka": "🇱🇰", + "flag_for_st._barthélemy": "🇧🇱", + "flag_for_st._helena": "🇸🇭", + "flag_for_st._kitts_&_nevis": "🇰🇳", + "flag_for_st._lucia": "🇱🇨", + "flag_for_st._martin": "🇲🇫", + "flag_for_st._pierre_&_miquelon": "🇵🇲", + "flag_for_st._vincent_&_grenadines": "🇻🇨", + "flag_for_sudan": "🇸🇩", + "flag_for_suriname": "🇸🇷", + "flag_for_svalbard_&_jan_mayen": "🇸🇯", + "flag_for_swaziland": "🇸🇿", + "flag_for_sweden": "🇸🇪", + "flag_for_switzerland": "🇨🇭", + "flag_for_syria": "🇸🇾", + "flag_for_são_tomé_&_príncipe": "🇸🇹", + "flag_for_taiwan": "🇹🇼", + "flag_for_tajikistan": "🇹🇯", + "flag_for_tanzania": "🇹🇿", + "flag_for_thailand": "🇹🇭", + "flag_for_timor__leste": "🇹🇱", + "flag_for_togo": "🇹🇬", + "flag_for_tokelau": "🇹🇰", + "flag_for_tonga": "🇹🇴", + "flag_for_trinidad_&_tobago": "🇹🇹", + "flag_for_tristan_da_cunha": "🇹🇦", + "flag_for_tunisia": "🇹🇳", + "flag_for_turkey": "🇹🇷", + "flag_for_turkmenistan": "🇹🇲", + "flag_for_turks_&_caicos_islands": "🇹🇨", + "flag_for_tuvalu": "🇹🇻", + "flag_for_u.s._outlying_islands": "🇺🇲", + "flag_for_u.s._virgin_islands": "🇻🇮", + "flag_for_uganda": "🇺🇬", + "flag_for_ukraine": "🇺🇦", + "flag_for_united_arab_emirates": "🇦🇪", + "flag_for_united_kingdom": "🇬🇧", + "flag_for_united_states": "🇺🇸", + "flag_for_uruguay": "🇺🇾", + "flag_for_uzbekistan": "🇺🇿", + "flag_for_vanuatu": "🇻🇺", + "flag_for_vatican_city": "🇻🇦", + "flag_for_venezuela": "🇻🇪", + "flag_for_vietnam": "🇻🇳", + "flag_for_wallis_&_futuna": "🇼🇫", + "flag_for_western_sahara": "🇪🇭", + "flag_for_yemen": "🇾🇪", + "flag_for_zambia": "🇿🇲", + "flag_for_zimbabwe": "🇿🇼", + "flag_for_åland_islands": "🇦🇽", + "golf": "⛳", + "fleur__de__lis": "⚜", + "muscle": "💪", + "flushed": "😳", + "frame_with_picture": "🖼", + "fries": "🍟", + "frog": "🐸", + "hatched_chick": "🐥", + "frowning": "😦", + "fuelpump": "⛽", + "full_moon_with_face": "🌝", + "gem": "💎", + "star2": "🌟", + "golfer": "🏌", + "mortar_board": "🎓", + "grimacing": "😬", + "smile_cat": "😸", + "grinning": "😀", + "grin": "😁", + "heartpulse": "💗", + "guardsman": "💂", + "haircut": "💇", + "hamster": "🐹", + "raising_hand": "🙋", + "headphones": "🎧", + "hear_no_evil": "🙉", + "cupid": "💘", + "gift_heart": "💝", + "heart": "❤", + "exclamation": "❗", + "heavy_exclamation_mark": "❗", + "heavy_heart_exclamation_mark_ornament": "❣", + "o": "⭕", + "helm_symbol": "⎈", + "helmet_with_white_cross": "⛑", + "high_heel": "👠", + "bullettrain_side": "🚄", + "bullettrain_front": "🚅", + "high_brightness": "🔆", + "zap": "⚡", + "hocho": "🔪", + "knife": "🔪", + "bee": "🐝", + "traffic_light": "🚥", + "racehorse": "🐎", + "coffee": "☕", + "hotsprings": "♨", + "hourglass": "⌛", + "hourglass_flowing_sand": "⏳", + "house_buildings": "🏘", + "100": "💯", + "hushed": "😯", + "ice_hockey_stick_and_puck": "🏒", + "imp": "👿", + "information_desk_person": "💁", + "information_source": "ℹ", + "capital_abcd": "🔠", + "abc": "🔤", + "abcd": "🔡", + "1234": "🔢", + "symbols": "🔣", + "izakaya_lantern": "🏮", + "lantern": "🏮", + "jack_o_lantern": "🎃", + "dolls": "🎎", + "japanese_goblin": "👺", + "japanese_ogre": "👹", + "beginner": "🔰", + "zero": "0️⃣", + "one": "1️⃣", + "ten": "🔟", + "two": "2️⃣", + "three": "3️⃣", + "four": "4️⃣", + "five": "5️⃣", + "six": "6️⃣", + "seven": "7️⃣", + "eight": "8️⃣", + "nine": "9️⃣", + "couplekiss": "💏", + "kissing_cat": "😽", + "kissing": "😗", + "kissing_closed_eyes": "😚", + "kissing_smiling_eyes": "😙", + "beetle": "🐞", + "large_blue_circle": "🔵", + "last_quarter_moon_with_face": "🌜", + "leaves": "🍃", + "mag": "🔍", + "left_right_arrow": "↔", + "leftwards_arrow_with_hook": "↩", + "arrow_left": "⬅", + "lock": "🔒", + "lock_with_ink_pen": "🔏", + "sob": "😭", + "low_brightness": "🔅", + "lower_left_ballpoint_pen": "🖊", + "lower_left_crayon": "🖍", + "lower_left_fountain_pen": "🖋", + "lower_left_paintbrush": "🖌", + "mahjong": "🀄", + "couple": "👫", + "man_in_business_suit_levitating": "🕴", + "man_with_gua_pi_mao": "👲", + "man_with_turban": "👳", + "mans_shoe": "👞", + "shoe": "👞", + "menorah_with_nine_branches": "🕎", + "mens": "🚹", + "minidisc": "💽", + "iphone": "📱", + "calling": "📲", + "money__mouth_face": "🤑", + "moneybag": "💰", + "rice_scene": "🎑", + "mountain_bicyclist": "🚵", + "mouse2": "🐁", + "lips": "👄", + "moyai": "🗿", + "notes": "🎶", + "nail_care": "💅", + "ab": "🆎", + "negative_squared_cross_mark": "❎", + "a": "🅰", + "b": "🅱", + "o2": "🅾", + "parking": "🅿", + "new_moon_with_face": "🌚", + "no_entry_sign": "🚫", + "underage": "🔞", + "non__potable_water": "🚱", + "arrow_upper_right": "↗", + "arrow_upper_left": "↖", + "office": "🏢", + "older_man": "👴", + "older_woman": "👵", + "om_symbol": "🕉", + "on": "🔛", + "book": "📖", + "unlock": "🔓", + "mailbox_with_no_mail": "📭", + "mailbox_with_mail": "📬", + "cd": "💿", + "tada": "🎉", + "feet": "🐾", + "walking": "🚶", + "pencil2": "✏", + "pensive": "😔", + "persevere": "😣", + "bow": "🙇", + "raised_hands": "🙌", + "person_with_ball": "⛹", + "person_with_blond_hair": "👱", + "pray": "🙏", + "person_with_pouting_face": "🙎", + "computer": "💻", + "pig2": "🐖", + "hankey": "💩", + "poop": "💩", + "shit": "💩", + "bamboo": "🎍", + "gun": "🔫", + "black_joker": "🃏", + "rotating_light": "🚨", + "cop": "👮", + "stew": "🍲", + "pouch": "👝", + "pouting_cat": "😾", + "rage": "😡", + "put_litter_in_its_place": "🚮", + "rabbit2": "🐇", + "racing_motorcycle": "🏍", + "radioactive_sign": "☢", + "fist": "✊", + "hand": "✋", + "raised_hand_with_fingers_splayed": "🖐", + "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", + "blue_car": "🚙", + "apple": "🍎", + "relieved": "😌", + "reversed_hand_with_middle_finger_extended": "🖕", + "mag_right": "🔎", + "arrow_right_hook": "↪", + "sweet_potato": "🍠", + "robot": "🤖", + "rolled__up_newspaper": "🗞", + "rowboat": "🚣", + "runner": "🏃", + "running": "🏃", + "running_shirt_with_sash": "🎽", + "boat": "⛵", + "scales": "⚖", + "school_satchel": "🎒", + "scorpius": "♏", + "see_no_evil": "🙈", + "sheep": "🐑", + "stars": "🌠", + "cake": "🍰", + "six_pointed_star": "🔯", + "ski": "🎿", + "sleeping_accommodation": "🛌", + "sleeping": "😴", + "sleepy": "😪", + "sleuth_or_spy": "🕵", + "heart_eyes_cat": "😻", + "smiley_cat": "😺", + "innocent": "😇", + "heart_eyes": "😍", + "smiling_imp": "😈", + "smiley": "😃", + "sweat_smile": "😅", + "smile": "😄", + "laughing": "😆", + "satisfied": "😆", + "blush": "😊", + "smirk": "😏", + "smoking": "🚬", + "snow_capped_mountain": "🏔", + "soccer": "⚽", + "icecream": "🍦", + "soon": "🔜", + "arrow_lower_right": "↘", + "arrow_lower_left": "↙", + "speak_no_evil": "🙊", + "speaker": "🔈", + "mute": "🔇", + "sound": "🔉", + "loud_sound": "🔊", + "speaking_head_in_silhouette": "🗣", + "spiral_calendar_pad": "🗓", + "spiral_note_pad": "🗒", + "shell": "🐚", + "sweat_drops": "💦", + "u5272": "🈹", + "u5408": "🈴", + "u55b6": "🈺", + "u6307": "🈯", + "u6708": "🈷", + "u6709": "🈶", + "u6e80": "🈵", + "u7121": "🈚", + "u7533": "🈸", + "u7981": "🈲", + "u7a7a": "🈳", + "cl": "🆑", + "cool": "🆒", + "free": "🆓", + "id": "🆔", + "koko": "🈁", + "sa": "🈂", + "new": "🆕", + "ng": "🆖", + "ok": "🆗", + "sos": "🆘", + "up": "🆙", + "vs": "🆚", + "steam_locomotive": "🚂", + "ramen": "🍜", + "partly_sunny": "⛅", + "city_sunrise": "🌇", + "surfer": "🏄", + "swimmer": "🏊", + "shirt": "👕", + "tshirt": "👕", + "table_tennis_paddle_and_ball": "🏓", + "tea": "🍵", + "tv": "📺", + "three_button_mouse": "🖱", + "+1": "👍", + "thumbsup": "👍", + "__1": "👎", + "-1": "👎", + "thumbsdown": "👎", + "thunder_cloud_and_rain": "⛈", + "tiger2": "🐅", + "tophat": "🎩", + "top": "🔝", + "tm": "™", + "train2": "🚆", + "triangular_flag_on_post": "🚩", + "trident": "🔱", + "twisted_rightwards_arrows": "🔀", + "unamused": "😒", + "small_red_triangle": "🔺", + "arrow_up_small": "🔼", + "arrow_up_down": "↕", + "upside__down_face": "🙃", + "arrow_up": "⬆", + "v": "✌", + "vhs": "📼", + "wc": "🚾", + "ocean": "🌊", + "waving_black_flag": "🏴", + "wave": "👋", + "waving_white_flag": "🏳", + "moon": "🌔", + "scream_cat": "🙀", + "weary": "😩", + "weight_lifter": "🏋", + "whale2": "🐋", + "wheelchair": "♿", + "point_down": "👇", + "grey_exclamation": "❕", + "white_frowning_face": "☹", + "white_check_mark": "✅", + "point_left": "👈", + "white_medium_small_square": "◽", + "star": "⭐", + "grey_question": "❔", + "point_right": "👉", + "relaxed": "☺", + "white_sun_behind_cloud": "🌥", + "white_sun_behind_cloud_with_rain": "🌦", + "white_sun_with_small_cloud": "🌤", + "point_up_2": "👆", + "point_up": "☝", + "wind_blowing_face": "🌬", + "wink": "😉", + "wolf": "🐺", + "dancers": "👯", + "boot": "👢", + "womans_clothes": "👚", + "womans_hat": "👒", + "sandal": "👡", + "womens": "🚺", + "worried": "😟", + "gift": "🎁", + "zipper__mouth_face": "🤐", + "regional_indicator_a": "🇦", + "regional_indicator_b": "🇧", + "regional_indicator_c": "🇨", + "regional_indicator_d": "🇩", + "regional_indicator_e": "🇪", + "regional_indicator_f": "🇫", + "regional_indicator_g": "🇬", + "regional_indicator_h": "🇭", + "regional_indicator_i": "🇮", + "regional_indicator_j": "🇯", + "regional_indicator_k": "🇰", + "regional_indicator_l": "🇱", + "regional_indicator_m": "🇲", + "regional_indicator_n": "🇳", + "regional_indicator_o": "🇴", + "regional_indicator_p": "🇵", + "regional_indicator_q": "🇶", + "regional_indicator_r": "🇷", + "regional_indicator_s": "🇸", + "regional_indicator_t": "🇹", + "regional_indicator_u": "🇺", + "regional_indicator_v": "🇻", + "regional_indicator_w": "🇼", + "regional_indicator_x": "🇽", + "regional_indicator_y": "🇾", + "regional_indicator_z": "🇿", +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py new file mode 100644 index 0000000..bb2cafa --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py @@ -0,0 +1,32 @@ +from typing import Callable, Match, Optional +import re + +from ._emoji_codes import EMOJI + + +_ReStringMatch = Match[str] # regex match object +_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub +_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re + + +def _emoji_replace( + text: str, + default_variant: Optional[str] = None, + _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub, +) -> str: + """Replace emoji code in text.""" + get_emoji = EMOJI.__getitem__ + variants = {"text": "\uFE0E", "emoji": "\uFE0F"} + get_variant = variants.get + default_variant_code = variants.get(default_variant, "") if default_variant else "" + + def do_replace(match: Match[str]) -> str: + emoji_code, emoji_name, variant = match.groups() + try: + return get_emoji(emoji_name.lower()) + get_variant( + variant, default_variant_code + ) + except KeyError: + return emoji_code + + return _emoji_sub(do_replace, text) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py new file mode 100644 index 0000000..094d2dc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py @@ -0,0 +1,76 @@ +CONSOLE_HTML_FORMAT = """\ + + + + + + + +
      {code}
      + + +""" + +CONSOLE_SVG_FORMAT = """\ + + + + + + + + + {lines} + + + {chrome} + + {backgrounds} + + {matrix} + + + +""" + +_SVG_FONT_FAMILY = "Rich Fira Code" +_SVG_CLASSES_PREFIX = "rich-svg" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py new file mode 100644 index 0000000..cbd6da9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py @@ -0,0 +1,10 @@ +from typing import Any + + +def load_ipython_extension(ip: Any) -> None: # pragma: no cover + # prevent circular import + from pip._vendor.rich.pretty import install + from pip._vendor.rich.traceback import install as tr_install + + install() + tr_install() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py new file mode 100644 index 0000000..b17ee65 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import IO, Callable + + +def get_fileno(file_like: IO[str]) -> int | None: + """Get fileno() from a file, accounting for poorly implemented file-like objects. + + Args: + file_like (IO): A file-like object. + + Returns: + int | None: The result of fileno if available, or None if operation failed. + """ + fileno: Callable[[], int] | None = getattr(file_like, "fileno", None) + if fileno is not None: + try: + return fileno() + except Exception: + # `fileno` is documented as potentially raising a OSError + # Alas, from the issues, there are so many poorly implemented file-like objects, + # that `fileno()` can raise just about anything. + return None + return None diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py new file mode 100644 index 0000000..30446ce --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py @@ -0,0 +1,270 @@ +from __future__ import absolute_import + +import inspect +from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature +from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union + +from .console import Group, RenderableType +from .control import escape_control_codes +from .highlighter import ReprHighlighter +from .jupyter import JupyterMixin +from .panel import Panel +from .pretty import Pretty +from .table import Table +from .text import Text, TextType + + +def _first_paragraph(doc: str) -> str: + """Get the first paragraph from a docstring.""" + paragraph, _, _ = doc.partition("\n\n") + return paragraph + + +class Inspect(JupyterMixin): + """A renderable to inspect any Python Object. + + Args: + obj (Any): An object to inspect. + title (str, optional): Title to display over inspect result, or None use type. Defaults to None. + help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. + methods (bool, optional): Enable inspection of callables. Defaults to False. + docs (bool, optional): Also render doc strings. Defaults to True. + private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. + dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. + sort (bool, optional): Sort attributes alphabetically. Defaults to True. + all (bool, optional): Show all attributes. Defaults to False. + value (bool, optional): Pretty print value of object. Defaults to True. + """ + + def __init__( + self, + obj: Any, + *, + title: Optional[TextType] = None, + help: bool = False, + methods: bool = False, + docs: bool = True, + private: bool = False, + dunder: bool = False, + sort: bool = True, + all: bool = True, + value: bool = True, + ) -> None: + self.highlighter = ReprHighlighter() + self.obj = obj + self.title = title or self._make_title(obj) + if all: + methods = private = dunder = True + self.help = help + self.methods = methods + self.docs = docs or help + self.private = private or dunder + self.dunder = dunder + self.sort = sort + self.value = value + + def _make_title(self, obj: Any) -> Text: + """Make a default title.""" + title_str = ( + str(obj) + if (isclass(obj) or callable(obj) or ismodule(obj)) + else str(type(obj)) + ) + title_text = self.highlighter(title_str) + return title_text + + def __rich__(self) -> Panel: + return Panel.fit( + Group(*self._render()), + title=self.title, + border_style="scope.border", + padding=(0, 1), + ) + + def _get_signature(self, name: str, obj: Any) -> Optional[Text]: + """Get a signature for a callable.""" + try: + _signature = str(signature(obj)) + ":" + except ValueError: + _signature = "(...)" + except TypeError: + return None + + source_filename: Optional[str] = None + try: + source_filename = getfile(obj) + except (OSError, TypeError): + # OSError is raised if obj has no source file, e.g. when defined in REPL. + pass + + callable_name = Text(name, style="inspect.callable") + if source_filename: + callable_name.stylize(f"link file://{source_filename}") + signature_text = self.highlighter(_signature) + + qualname = name or getattr(obj, "__qualname__", name) + + # If obj is a module, there may be classes (which are callable) to display + if inspect.isclass(obj): + prefix = "class" + elif inspect.iscoroutinefunction(obj): + prefix = "async def" + else: + prefix = "def" + + qual_signature = Text.assemble( + (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"), + (qualname, "inspect.callable"), + signature_text, + ) + + return qual_signature + + def _render(self) -> Iterable[RenderableType]: + """Render object.""" + + def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: + key, (_error, value) = item + return (callable(value), key.strip("_").lower()) + + def safe_getattr(attr_name: str) -> Tuple[Any, Any]: + """Get attribute or any exception.""" + try: + return (None, getattr(obj, attr_name)) + except Exception as error: + return (error, None) + + obj = self.obj + keys = dir(obj) + total_items = len(keys) + if not self.dunder: + keys = [key for key in keys if not key.startswith("__")] + if not self.private: + keys = [key for key in keys if not key.startswith("_")] + not_shown_count = total_items - len(keys) + items = [(key, safe_getattr(key)) for key in keys] + if self.sort: + items.sort(key=sort_items) + + items_table = Table.grid(padding=(0, 1), expand=False) + items_table.add_column(justify="right") + add_row = items_table.add_row + highlighter = self.highlighter + + if callable(obj): + signature = self._get_signature("", obj) + if signature is not None: + yield signature + yield "" + + if self.docs: + _doc = self._get_formatted_doc(obj) + if _doc is not None: + doc_text = Text(_doc, style="inspect.help") + doc_text = highlighter(doc_text) + yield doc_text + yield "" + + if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)): + yield Panel( + Pretty(obj, indent_guides=True, max_length=10, max_string=60), + border_style="inspect.value.border", + ) + yield "" + + for key, (error, value) in items: + key_text = Text.assemble( + ( + key, + "inspect.attr.dunder" if key.startswith("__") else "inspect.attr", + ), + (" =", "inspect.equals"), + ) + if error is not None: + warning = key_text.copy() + warning.stylize("inspect.error") + add_row(warning, highlighter(repr(error))) + continue + + if callable(value): + if not self.methods: + continue + + _signature_text = self._get_signature(key, value) + if _signature_text is None: + add_row(key_text, Pretty(value, highlighter=highlighter)) + else: + if self.docs: + docs = self._get_formatted_doc(value) + if docs is not None: + _signature_text.append("\n" if "\n" in docs else " ") + doc = highlighter(docs) + doc.stylize("inspect.doc") + _signature_text.append(doc) + + add_row(key_text, _signature_text) + else: + add_row(key_text, Pretty(value, highlighter=highlighter)) + if items_table.row_count: + yield items_table + elif not_shown_count: + yield Text.from_markup( + f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] " + f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options." + ) + + def _get_formatted_doc(self, object_: Any) -> Optional[str]: + """ + Extract the docstring of an object, process it and returns it. + The processing consists in cleaning up the doctring's indentation, + taking only its 1st paragraph if `self.help` is not True, + and escape its control codes. + + Args: + object_ (Any): the object to get the docstring from. + + Returns: + Optional[str]: the processed docstring, or None if no docstring was found. + """ + docs = getdoc(object_) + if docs is None: + return None + docs = cleandoc(docs).strip() + if not self.help: + docs = _first_paragraph(docs) + return escape_control_codes(docs) + + +def get_object_types_mro(obj: Union[object, Type[Any]]) -> Tuple[type, ...]: + """Returns the MRO of an object's class, or of the object itself if it's a class.""" + if not hasattr(obj, "__mro__"): + # N.B. we cannot use `if type(obj) is type` here because it doesn't work with + # some types of classes, such as the ones that use abc.ABCMeta. + obj = type(obj) + return getattr(obj, "__mro__", ()) + + +def get_object_types_mro_as_strings(obj: object) -> Collection[str]: + """ + Returns the MRO of an object's class as full qualified names, or of the object itself if it's a class. + + Examples: + `object_types_mro_as_strings(JSONDecoder)` will return `['json.decoder.JSONDecoder', 'builtins.object']` + """ + return [ + f'{getattr(type_, "__module__", "")}.{getattr(type_, "__qualname__", "")}' + for type_ in get_object_types_mro(obj) + ] + + +def is_object_one_of_types( + obj: object, fully_qualified_types_names: Collection[str] +) -> bool: + """ + Returns `True` if the given object's class (or the object itself, if it's a class) has one of the + fully qualified names in its MRO. + """ + for type_name in get_object_types_mro_as_strings(obj): + if type_name in fully_qualified_types_names: + return True + return False diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py new file mode 100644 index 0000000..fc16c84 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py @@ -0,0 +1,94 @@ +from datetime import datetime +from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable + + +from .text import Text, TextType + +if TYPE_CHECKING: + from .console import Console, ConsoleRenderable, RenderableType + from .table import Table + +FormatTimeCallable = Callable[[datetime], Text] + + +class LogRender: + def __init__( + self, + show_time: bool = True, + show_level: bool = False, + show_path: bool = True, + time_format: Union[str, FormatTimeCallable] = "[%x %X]", + omit_repeated_times: bool = True, + level_width: Optional[int] = 8, + ) -> None: + self.show_time = show_time + self.show_level = show_level + self.show_path = show_path + self.time_format = time_format + self.omit_repeated_times = omit_repeated_times + self.level_width = level_width + self._last_time: Optional[Text] = None + + def __call__( + self, + console: "Console", + renderables: Iterable["ConsoleRenderable"], + log_time: Optional[datetime] = None, + time_format: Optional[Union[str, FormatTimeCallable]] = None, + level: TextType = "", + path: Optional[str] = None, + line_no: Optional[int] = None, + link_path: Optional[str] = None, + ) -> "Table": + from .containers import Renderables + from .table import Table + + output = Table.grid(padding=(0, 1)) + output.expand = True + if self.show_time: + output.add_column(style="log.time") + if self.show_level: + output.add_column(style="log.level", width=self.level_width) + output.add_column(ratio=1, style="log.message", overflow="fold") + if self.show_path and path: + output.add_column(style="log.path") + row: List["RenderableType"] = [] + if self.show_time: + log_time = log_time or console.get_datetime() + time_format = time_format or self.time_format + if callable(time_format): + log_time_display = time_format(log_time) + else: + log_time_display = Text(log_time.strftime(time_format)) + if log_time_display == self._last_time and self.omit_repeated_times: + row.append(Text(" " * len(log_time_display))) + else: + row.append(log_time_display) + self._last_time = log_time_display + if self.show_level: + row.append(level) + + row.append(Renderables(renderables)) + if self.show_path and path: + path_text = Text() + path_text.append( + path, style=f"link file://{link_path}" if link_path else "" + ) + if line_no: + path_text.append(":") + path_text.append( + f"{line_no}", + style=f"link file://{link_path}#{line_no}" if link_path else "", + ) + row.append(path_text) + + output.add_row(*row) + return output + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + + c = Console() + c.print("[on blue]Hello", justify="right") + c.log("[on blue]hello", justify="right") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py new file mode 100644 index 0000000..01c6caf --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py @@ -0,0 +1,43 @@ +from typing import Iterable, Tuple, TypeVar + +T = TypeVar("T") + + +def loop_first(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for first value.""" + iter_values = iter(values) + try: + value = next(iter_values) + except StopIteration: + return + yield True, value + for value in iter_values: + yield False, value + + +def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + for value in iter_values: + yield False, previous_value + previous_value = value + yield True, previous_value + + +def loop_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py new file mode 100644 index 0000000..b659673 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py @@ -0,0 +1,69 @@ +from types import TracebackType +from typing import IO, Iterable, Iterator, List, Optional, Type + + +class NullFile(IO[str]): + def close(self) -> None: + pass + + def isatty(self) -> bool: + return False + + def read(self, __n: int = 1) -> str: + return "" + + def readable(self) -> bool: + return False + + def readline(self, __limit: int = 1) -> str: + return "" + + def readlines(self, __hint: int = 1) -> List[str]: + return [] + + def seek(self, __offset: int, __whence: int = 1) -> int: + return 0 + + def seekable(self) -> bool: + return False + + def tell(self) -> int: + return 0 + + def truncate(self, __size: Optional[int] = 1) -> int: + return 0 + + def writable(self) -> bool: + return False + + def writelines(self, __lines: Iterable[str]) -> None: + pass + + def __next__(self) -> str: + return "" + + def __iter__(self) -> Iterator[str]: + return iter([""]) + + def __enter__(self) -> IO[str]: + pass + + def __exit__( + self, + __t: Optional[Type[BaseException]], + __value: Optional[BaseException], + __traceback: Optional[TracebackType], + ) -> None: + pass + + def write(self, text: str) -> int: + return 0 + + def flush(self) -> None: + pass + + def fileno(self) -> int: + return -1 + + +NULL_FILE = NullFile() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py new file mode 100644 index 0000000..3c748d3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py @@ -0,0 +1,309 @@ +from .palette import Palette + + +# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) +WINDOWS_PALETTE = Palette( + [ + (12, 12, 12), + (197, 15, 31), + (19, 161, 14), + (193, 156, 0), + (0, 55, 218), + (136, 23, 152), + (58, 150, 221), + (204, 204, 204), + (118, 118, 118), + (231, 72, 86), + (22, 198, 12), + (249, 241, 165), + (59, 120, 255), + (180, 0, 158), + (97, 214, 214), + (242, 242, 242), + ] +) + +# # The standard ansi colors (including bright variants) +STANDARD_PALETTE = Palette( + [ + (0, 0, 0), + (170, 0, 0), + (0, 170, 0), + (170, 85, 0), + (0, 0, 170), + (170, 0, 170), + (0, 170, 170), + (170, 170, 170), + (85, 85, 85), + (255, 85, 85), + (85, 255, 85), + (255, 255, 85), + (85, 85, 255), + (255, 85, 255), + (85, 255, 255), + (255, 255, 255), + ] +) + + +# The 256 color palette +EIGHT_BIT_PALETTE = Palette( + [ + (0, 0, 0), + (128, 0, 0), + (0, 128, 0), + (128, 128, 0), + (0, 0, 128), + (128, 0, 128), + (0, 128, 128), + (192, 192, 192), + (128, 128, 128), + (255, 0, 0), + (0, 255, 0), + (255, 255, 0), + (0, 0, 255), + (255, 0, 255), + (0, 255, 255), + (255, 255, 255), + (0, 0, 0), + (0, 0, 95), + (0, 0, 135), + (0, 0, 175), + (0, 0, 215), + (0, 0, 255), + (0, 95, 0), + (0, 95, 95), + (0, 95, 135), + (0, 95, 175), + (0, 95, 215), + (0, 95, 255), + (0, 135, 0), + (0, 135, 95), + (0, 135, 135), + (0, 135, 175), + (0, 135, 215), + (0, 135, 255), + (0, 175, 0), + (0, 175, 95), + (0, 175, 135), + (0, 175, 175), + (0, 175, 215), + (0, 175, 255), + (0, 215, 0), + (0, 215, 95), + (0, 215, 135), + (0, 215, 175), + (0, 215, 215), + (0, 215, 255), + (0, 255, 0), + (0, 255, 95), + (0, 255, 135), + (0, 255, 175), + (0, 255, 215), + (0, 255, 255), + (95, 0, 0), + (95, 0, 95), + (95, 0, 135), + (95, 0, 175), + (95, 0, 215), + (95, 0, 255), + (95, 95, 0), + (95, 95, 95), + (95, 95, 135), + (95, 95, 175), + (95, 95, 215), + (95, 95, 255), + (95, 135, 0), + (95, 135, 95), + (95, 135, 135), + (95, 135, 175), + (95, 135, 215), + (95, 135, 255), + (95, 175, 0), + (95, 175, 95), + (95, 175, 135), + (95, 175, 175), + (95, 175, 215), + (95, 175, 255), + (95, 215, 0), + (95, 215, 95), + (95, 215, 135), + (95, 215, 175), + (95, 215, 215), + (95, 215, 255), + (95, 255, 0), + (95, 255, 95), + (95, 255, 135), + (95, 255, 175), + (95, 255, 215), + (95, 255, 255), + (135, 0, 0), + (135, 0, 95), + (135, 0, 135), + (135, 0, 175), + (135, 0, 215), + (135, 0, 255), + (135, 95, 0), + (135, 95, 95), + (135, 95, 135), + (135, 95, 175), + (135, 95, 215), + (135, 95, 255), + (135, 135, 0), + (135, 135, 95), + (135, 135, 135), + (135, 135, 175), + (135, 135, 215), + (135, 135, 255), + (135, 175, 0), + (135, 175, 95), + (135, 175, 135), + (135, 175, 175), + (135, 175, 215), + (135, 175, 255), + (135, 215, 0), + (135, 215, 95), + (135, 215, 135), + (135, 215, 175), + (135, 215, 215), + (135, 215, 255), + (135, 255, 0), + (135, 255, 95), + (135, 255, 135), + (135, 255, 175), + (135, 255, 215), + (135, 255, 255), + (175, 0, 0), + (175, 0, 95), + (175, 0, 135), + (175, 0, 175), + (175, 0, 215), + (175, 0, 255), + (175, 95, 0), + (175, 95, 95), + (175, 95, 135), + (175, 95, 175), + (175, 95, 215), + (175, 95, 255), + (175, 135, 0), + (175, 135, 95), + (175, 135, 135), + (175, 135, 175), + (175, 135, 215), + (175, 135, 255), + (175, 175, 0), + (175, 175, 95), + (175, 175, 135), + (175, 175, 175), + (175, 175, 215), + (175, 175, 255), + (175, 215, 0), + (175, 215, 95), + (175, 215, 135), + (175, 215, 175), + (175, 215, 215), + (175, 215, 255), + (175, 255, 0), + (175, 255, 95), + (175, 255, 135), + (175, 255, 175), + (175, 255, 215), + (175, 255, 255), + (215, 0, 0), + (215, 0, 95), + (215, 0, 135), + (215, 0, 175), + (215, 0, 215), + (215, 0, 255), + (215, 95, 0), + (215, 95, 95), + (215, 95, 135), + (215, 95, 175), + (215, 95, 215), + (215, 95, 255), + (215, 135, 0), + (215, 135, 95), + (215, 135, 135), + (215, 135, 175), + (215, 135, 215), + (215, 135, 255), + (215, 175, 0), + (215, 175, 95), + (215, 175, 135), + (215, 175, 175), + (215, 175, 215), + (215, 175, 255), + (215, 215, 0), + (215, 215, 95), + (215, 215, 135), + (215, 215, 175), + (215, 215, 215), + (215, 215, 255), + (215, 255, 0), + (215, 255, 95), + (215, 255, 135), + (215, 255, 175), + (215, 255, 215), + (215, 255, 255), + (255, 0, 0), + (255, 0, 95), + (255, 0, 135), + (255, 0, 175), + (255, 0, 215), + (255, 0, 255), + (255, 95, 0), + (255, 95, 95), + (255, 95, 135), + (255, 95, 175), + (255, 95, 215), + (255, 95, 255), + (255, 135, 0), + (255, 135, 95), + (255, 135, 135), + (255, 135, 175), + (255, 135, 215), + (255, 135, 255), + (255, 175, 0), + (255, 175, 95), + (255, 175, 135), + (255, 175, 175), + (255, 175, 215), + (255, 175, 255), + (255, 215, 0), + (255, 215, 95), + (255, 215, 135), + (255, 215, 175), + (255, 215, 215), + (255, 215, 255), + (255, 255, 0), + (255, 255, 95), + (255, 255, 135), + (255, 255, 175), + (255, 255, 215), + (255, 255, 255), + (8, 8, 8), + (18, 18, 18), + (28, 28, 28), + (38, 38, 38), + (48, 48, 48), + (58, 58, 58), + (68, 68, 68), + (78, 78, 78), + (88, 88, 88), + (98, 98, 98), + (108, 108, 108), + (118, 118, 118), + (128, 128, 128), + (138, 138, 138), + (148, 148, 148), + (158, 158, 158), + (168, 168, 168), + (178, 178, 178), + (188, 188, 188), + (198, 198, 198), + (208, 208, 208), + (218, 218, 218), + (228, 228, 228), + (238, 238, 238), + ] +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py new file mode 100644 index 0000000..4f6d8b2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py @@ -0,0 +1,17 @@ +from typing import Optional + + +def pick_bool(*values: Optional[bool]) -> bool: + """Pick the first non-none bool or return the last value. + + Args: + *values (bool): Any number of boolean or None values. + + Returns: + bool: First non-none boolean. + """ + assert values, "1 or more values required" + for value in values: + if value is not None: + return value + return bool(value) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py new file mode 100644 index 0000000..e8a3a67 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py @@ -0,0 +1,160 @@ +import sys +from fractions import Fraction +from math import ceil +from typing import cast, List, Optional, Sequence + +if sys.version_info >= (3, 8): + from typing import Protocol +else: + from pip._vendor.typing_extensions import Protocol # pragma: no cover + + +class Edge(Protocol): + """Any object that defines an edge (such as Layout).""" + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + +def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: + """Divide total space to satisfy size, ratio, and minimum_size, constraints. + + The returned list of integers should add up to total in most cases, unless it is + impossible to satisfy all the constraints. For instance, if there are two edges + with a minimum size of 20 each and `total` is 30 then the returned list will be + greater than total. In practice, this would mean that a Layout object would + clip the rows that would overflow the screen height. + + Args: + total (int): Total number of characters. + edges (List[Edge]): Edges within total space. + + Returns: + List[int]: Number of characters for each edge. + """ + # Size of edge or None for yet to be determined + sizes = [(edge.size or None) for edge in edges] + + _Fraction = Fraction + + # While any edges haven't been calculated + while None in sizes: + # Get flexible edges and index to map these back on to sizes list + flexible_edges = [ + (index, edge) + for index, (size, edge) in enumerate(zip(sizes, edges)) + if size is None + ] + # Remaining space in total + remaining = total - sum(size or 0 for size in sizes) + if remaining <= 0: + # No room for flexible edges + return [ + ((edge.minimum_size or 1) if size is None else size) + for size, edge in zip(sizes, edges) + ] + # Calculate number of characters in a ratio portion + portion = _Fraction( + remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) + ) + + # If any edges will be less than their minimum, replace size with the minimum + for index, edge in flexible_edges: + if portion * edge.ratio <= edge.minimum_size: + sizes[index] = edge.minimum_size + # New fixed size will invalidate calculations, so we need to repeat the process + break + else: + # Distribute flexible space and compensate for rounding error + # Since edge sizes can only be integers we need to add the remainder + # to the following line + remainder = _Fraction(0) + for index, edge in flexible_edges: + size, remainder = divmod(portion * edge.ratio + remainder, 1) + sizes[index] = size + break + # Sizes now contains integers only + return cast(List[int], sizes) + + +def ratio_reduce( + total: int, ratios: List[int], maximums: List[int], values: List[int] +) -> List[int]: + """Divide an integer total in to parts based on ratios. + + Args: + total (int): The total to divide. + ratios (List[int]): A list of integer ratios. + maximums (List[int]): List of maximums values for each slot. + values (List[int]): List of values + + Returns: + List[int]: A list of integers guaranteed to sum to total. + """ + ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] + total_ratio = sum(ratios) + if not total_ratio: + return values[:] + total_remaining = total + result: List[int] = [] + append = result.append + for ratio, maximum, value in zip(ratios, maximums, values): + if ratio and total_ratio > 0: + distributed = min(maximum, round(ratio * total_remaining / total_ratio)) + append(value - distributed) + total_remaining -= distributed + total_ratio -= ratio + else: + append(value) + return result + + +def ratio_distribute( + total: int, ratios: List[int], minimums: Optional[List[int]] = None +) -> List[int]: + """Distribute an integer total in to parts based on ratios. + + Args: + total (int): The total to divide. + ratios (List[int]): A list of integer ratios. + minimums (List[int]): List of minimum values for each slot. + + Returns: + List[int]: A list of integers guaranteed to sum to total. + """ + if minimums: + ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] + total_ratio = sum(ratios) + assert total_ratio > 0, "Sum of ratios must be > 0" + + total_remaining = total + distributed_total: List[int] = [] + append = distributed_total.append + if minimums is None: + _minimums = [0] * len(ratios) + else: + _minimums = minimums + for ratio, minimum in zip(ratios, _minimums): + if total_ratio > 0: + distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) + else: + distributed = total_remaining + append(distributed) + total_ratio -= ratio + total_remaining -= distributed + return distributed_total + + +if __name__ == "__main__": + from dataclasses import dataclass + + @dataclass + class E: + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) + print(sum(resolved)) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py new file mode 100644 index 0000000..d0bb1fe --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py @@ -0,0 +1,482 @@ +""" +Spinners are from: +* cli-spinners: + MIT License + Copyright (c) Sindre Sorhus (sindresorhus.com) + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +""" + +SPINNERS = { + "dots": { + "interval": 80, + "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏", + }, + "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"}, + "dots3": { + "interval": 80, + "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓", + }, + "dots4": { + "interval": 80, + "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆", + }, + "dots5": { + "interval": 80, + "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋", + }, + "dots6": { + "interval": 80, + "frames": "⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁", + }, + "dots7": { + "interval": 80, + "frames": "⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈", + }, + "dots8": { + "interval": 80, + "frames": "⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈", + }, + "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗⡏"}, + "dots10": {"interval": 80, "frames": "⢄⢂⢁⡁⡈⡐⡠"}, + "dots11": {"interval": 100, "frames": "⠁⠂⠄⡀⢀⠠⠐⠈"}, + "dots12": { + "interval": 80, + "frames": [ + "⢀⠀", + "⡀⠀", + "⠄⠀", + "⢂⠀", + "⡂⠀", + "⠅⠀", + "⢃⠀", + "⡃⠀", + "⠍⠀", + "⢋⠀", + "⡋⠀", + "⠍⠁", + "⢋⠁", + "⡋⠁", + "⠍⠉", + "⠋⠉", + "⠋⠉", + "⠉⠙", + "⠉⠙", + "⠉⠩", + "⠈⢙", + "⠈⡙", + "⢈⠩", + "⡀⢙", + "⠄⡙", + "⢂⠩", + "⡂⢘", + "⠅⡘", + "⢃⠨", + "⡃⢐", + "⠍⡐", + "⢋⠠", + "⡋⢀", + "⠍⡁", + "⢋⠁", + "⡋⠁", + "⠍⠉", + "⠋⠉", + "⠋⠉", + "⠉⠙", + "⠉⠙", + "⠉⠩", + "⠈⢙", + "⠈⡙", + "⠈⠩", + "⠀⢙", + "⠀⡙", + "⠀⠩", + "⠀⢘", + "⠀⡘", + "⠀⠨", + "⠀⢐", + "⠀⡐", + "⠀⠠", + "⠀⢀", + "⠀⡀", + ], + }, + "dots8Bit": { + "interval": 80, + "frames": "⠀⠁⠂⠃⠄⠅⠆⠇⡀⡁⡂⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌⠍⠎⠏⡈⡉⡊⡋⡌⡍⡎⡏⠐⠑⠒⠓⠔⠕⠖⠗⡐⡑⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜⠝⠞⠟⡘⡙" + "⡚⡛⡜⡝⡞⡟⠠⠡⠢⠣⠤⠥⠦⠧⡠⡡⡢⡣⡤⡥⡦⡧⠨⠩⠪⠫⠬⠭⠮⠯⡨⡩⡪⡫⡬⡭⡮⡯⠰⠱⠲⠳⠴⠵⠶⠷⡰⡱⡲⡳⡴⡵⡶⡷⠸⠹⠺⠻" + "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⣀⣁⣂⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌⢍⢎⢏⣈⣉⣊⣋⣌⣍⣎⣏⢐⢑⢒⢓⢔⢕⢖⢗⣐⣑⣒⣓⣔⣕" + "⣖⣗⢘⢙⢚⢛⢜⢝⢞⢟⣘⣙⣚⣛⣜⣝⣞⣟⢠⢡⢢⢣⢤⢥⢦⢧⣠⣡⣢⣣⣤⣥⣦⣧⢨⢩⢪⢫⢬⢭⢮⢯⣨⣩⣪⣫⣬⣭⣮⣯⢰⢱⢲⢳⢴⢵⢶⢷" + "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", + }, + "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, + "line2": {"interval": 100, "frames": "⠂-–—–-"}, + "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬┐"}, + "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, + "simpleDotsScrolling": { + "interval": 200, + "frames": [". ", ".. ", "...", " ..", " .", " "], + }, + "star": {"interval": 70, "frames": "✶✸✹✺✹✷"}, + "star2": {"interval": 80, "frames": "+x*"}, + "flip": { + "interval": 70, + "frames": "___-``'´-___", + }, + "hamburger": {"interval": 100, "frames": "☱☲☴"}, + "growVertical": { + "interval": 120, + "frames": "▁▃▄▅▆▇▆▅▄▃", + }, + "growHorizontal": { + "interval": 120, + "frames": "▏▎▍▌▋▊▉▊▋▌▍▎", + }, + "balloon": {"interval": 140, "frames": " .oO@* "}, + "balloon2": {"interval": 120, "frames": ".oO°Oo."}, + "noise": {"interval": 100, "frames": "▓▒░"}, + "bounce": {"interval": 120, "frames": "⠁⠂⠄⠂"}, + "boxBounce": {"interval": 120, "frames": "▖▘▝▗"}, + "boxBounce2": {"interval": 100, "frames": "▌▀▐▄"}, + "triangle": {"interval": 50, "frames": "◢◣◤◥"}, + "arc": {"interval": 100, "frames": "◜◠◝◞◡◟"}, + "circle": {"interval": 120, "frames": "◡⊙◠"}, + "squareCorners": {"interval": 180, "frames": "◰◳◲◱"}, + "circleQuarters": {"interval": 120, "frames": "◴◷◶◵"}, + "circleHalves": {"interval": 50, "frames": "◐◓◑◒"}, + "squish": {"interval": 100, "frames": "╫╪"}, + "toggle": {"interval": 250, "frames": "⊶⊷"}, + "toggle2": {"interval": 80, "frames": "▫▪"}, + "toggle3": {"interval": 120, "frames": "□■"}, + "toggle4": {"interval": 100, "frames": "■□▪▫"}, + "toggle5": {"interval": 100, "frames": "▮▯"}, + "toggle6": {"interval": 300, "frames": "ဝ၀"}, + "toggle7": {"interval": 80, "frames": "⦾⦿"}, + "toggle8": {"interval": 100, "frames": "◍◌"}, + "toggle9": {"interval": 100, "frames": "◉◎"}, + "toggle10": {"interval": 100, "frames": "㊂㊀㊁"}, + "toggle11": {"interval": 50, "frames": "⧇⧆"}, + "toggle12": {"interval": 120, "frames": "☗☖"}, + "toggle13": {"interval": 80, "frames": "=*-"}, + "arrow": {"interval": 100, "frames": "←↖↑↗→↘↓↙"}, + "arrow2": { + "interval": 80, + "frames": ["⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ "], + }, + "arrow3": { + "interval": 120, + "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], + }, + "bouncingBar": { + "interval": 80, + "frames": [ + "[ ]", + "[= ]", + "[== ]", + "[=== ]", + "[ ===]", + "[ ==]", + "[ =]", + "[ ]", + "[ =]", + "[ ==]", + "[ ===]", + "[====]", + "[=== ]", + "[== ]", + "[= ]", + ], + }, + "bouncingBall": { + "interval": 80, + "frames": [ + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "( ●)", + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "(● )", + ], + }, + "smiley": {"interval": 200, "frames": ["😄 ", "😝 "]}, + "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]}, + "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]}, + "clock": { + "interval": 100, + "frames": [ + "🕛 ", + "🕐 ", + "🕑 ", + "🕒 ", + "🕓 ", + "🕔 ", + "🕕 ", + "🕖 ", + "🕗 ", + "🕘 ", + "🕙 ", + "🕚 ", + ], + }, + "earth": {"interval": 180, "frames": ["🌍 ", "🌎 ", "🌏 "]}, + "material": { + "interval": 17, + "frames": [ + "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", + "████████▁▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "██████████▁▁▁▁▁▁▁▁▁▁", + "███████████▁▁▁▁▁▁▁▁▁", + "█████████████▁▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁▁██████████████▁▁▁▁", + "▁▁▁██████████████▁▁▁", + "▁▁▁▁█████████████▁▁▁", + "▁▁▁▁██████████████▁▁", + "▁▁▁▁██████████████▁▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁▁██████████████", + "▁▁▁▁▁▁██████████████", + "▁▁▁▁▁▁▁█████████████", + "▁▁▁▁▁▁▁█████████████", + "▁▁▁▁▁▁▁▁████████████", + "▁▁▁▁▁▁▁▁████████████", + "▁▁▁▁▁▁▁▁▁███████████", + "▁▁▁▁▁▁▁▁▁███████████", + "▁▁▁▁▁▁▁▁▁▁██████████", + "▁▁▁▁▁▁▁▁▁▁██████████", + "▁▁▁▁▁▁▁▁▁▁▁▁████████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "████████▁▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "███████████▁▁▁▁▁▁▁▁▁", + "████████████▁▁▁▁▁▁▁▁", + "████████████▁▁▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁▁▁█████████████▁▁▁▁", + "▁▁▁▁▁████████████▁▁▁", + "▁▁▁▁▁████████████▁▁▁", + "▁▁▁▁▁▁███████████▁▁▁", + "▁▁▁▁▁▁▁▁█████████▁▁▁", + "▁▁▁▁▁▁▁▁█████████▁▁▁", + "▁▁▁▁▁▁▁▁▁█████████▁▁", + "▁▁▁▁▁▁▁▁▁█████████▁▁", + "▁▁▁▁▁▁▁▁▁▁█████████▁", + "▁▁▁▁▁▁▁▁▁▁▁████████▁", + "▁▁▁▁▁▁▁▁▁▁▁████████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + ], + }, + "moon": { + "interval": 80, + "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "], + }, + "runner": {"interval": 140, "frames": ["🚶 ", "🏃 "]}, + "pong": { + "interval": 80, + "frames": [ + "▐⠂ ▌", + "▐⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂▌", + "▐ ⠠▌", + "▐ ⡀▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐⠠ ▌", + ], + }, + "shark": { + "interval": 120, + "frames": [ + "▐|\\____________▌", + "▐_|\\___________▌", + "▐__|\\__________▌", + "▐___|\\_________▌", + "▐____|\\________▌", + "▐_____|\\_______▌", + "▐______|\\______▌", + "▐_______|\\_____▌", + "▐________|\\____▌", + "▐_________|\\___▌", + "▐__________|\\__▌", + "▐___________|\\_▌", + "▐____________|\\▌", + "▐____________/|▌", + "▐___________/|_▌", + "▐__________/|__▌", + "▐_________/|___▌", + "▐________/|____▌", + "▐_______/|_____▌", + "▐______/|______▌", + "▐_____/|_______▌", + "▐____/|________▌", + "▐___/|_________▌", + "▐__/|__________▌", + "▐_/|___________▌", + "▐/|____________▌", + ], + }, + "dqpb": {"interval": 100, "frames": "dqpb"}, + "weather": { + "interval": 100, + "frames": [ + "☀️ ", + "☀️ ", + "☀️ ", + "🌤 ", + "⛅️ ", + "🌥 ", + "☁️ ", + "🌧 ", + "🌨 ", + "🌧 ", + "🌨 ", + "🌧 ", + "🌨 ", + "⛈ ", + "🌨 ", + "🌧 ", + "🌨 ", + "☁️ ", + "🌥 ", + "⛅️ ", + "🌤 ", + "☀️ ", + "☀️ ", + ], + }, + "christmas": {"interval": 400, "frames": "🌲🎄"}, + "grenade": { + "interval": 80, + "frames": [ + "، ", + "′ ", + " ´ ", + " ‾ ", + " ⸌", + " ⸊", + " |", + " ⁎", + " ⁕", + " ෴ ", + " ⁓", + " ", + " ", + " ", + ], + }, + "point": {"interval": 125, "frames": ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"]}, + "layer": {"interval": 150, "frames": "-=≡"}, + "betaWave": { + "interval": 80, + "frames": [ + "ρββββββ", + "βρβββββ", + "ββρββββ", + "βββρβββ", + "ββββρββ", + "βββββρβ", + "ββββββρ", + ], + }, + "aesthetic": { + "interval": 80, + "frames": [ + "▰▱▱▱▱▱▱", + "▰▰▱▱▱▱▱", + "▰▰▰▱▱▱▱", + "▰▰▰▰▱▱▱", + "▰▰▰▰▰▱▱", + "▰▰▰▰▰▰▱", + "▰▰▰▰▰▰▰", + "▰▱▱▱▱▱▱", + ], + }, +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py new file mode 100644 index 0000000..194564e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py @@ -0,0 +1,16 @@ +from typing import List, TypeVar + +T = TypeVar("T") + + +class Stack(List[T]): + """A small shim over builtin list.""" + + @property + def top(self) -> T: + """Get top of stack.""" + return self[-1] + + def push(self, item: T) -> None: + """Push an item on to the stack (append in stack nomenclature).""" + self.append(item) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py new file mode 100644 index 0000000..a2ca6be --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py @@ -0,0 +1,19 @@ +""" +Timer context manager, only used in debug. + +""" + +from time import time + +import contextlib +from typing import Generator + + +@contextlib.contextmanager +def timer(subject: str = "time") -> Generator[None, None, None]: + """print the elapsed time. (only used in debugging)""" + start = time() + yield + elapsed = time() - start + elapsed_ms = elapsed * 1000 + print(f"{subject} elapsed {elapsed_ms:.1f}ms") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py new file mode 100644 index 0000000..81b1082 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py @@ -0,0 +1,662 @@ +"""Light wrapper around the Win32 Console API - this module should only be imported on Windows + +The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions +""" +import ctypes +import sys +from typing import Any + +windll: Any = None +if sys.platform == "win32": + windll = ctypes.LibraryLoader(ctypes.WinDLL) +else: + raise ImportError(f"{__name__} can only be imported on Windows") + +import time +from ctypes import Structure, byref, wintypes +from typing import IO, NamedTuple, Type, cast + +from pip._vendor.rich.color import ColorSystem +from pip._vendor.rich.style import Style + +STDOUT = -11 +ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 + +COORD = wintypes._COORD + + +class LegacyWindowsError(Exception): + pass + + +class WindowsCoordinates(NamedTuple): + """Coordinates in the Windows Console API are (y, x), not (x, y). + This class is intended to prevent that confusion. + Rows and columns are indexed from 0. + This class can be used in place of wintypes._COORD in arguments and argtypes. + """ + + row: int + col: int + + @classmethod + def from_param(cls, value: "WindowsCoordinates") -> COORD: + """Converts a WindowsCoordinates into a wintypes _COORD structure. + This classmethod is internally called by ctypes to perform the conversion. + + Args: + value (WindowsCoordinates): The input coordinates to convert. + + Returns: + wintypes._COORD: The converted coordinates struct. + """ + return COORD(value.col, value.row) + + +class CONSOLE_SCREEN_BUFFER_INFO(Structure): + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + + +class CONSOLE_CURSOR_INFO(ctypes.Structure): + _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)] + + +_GetStdHandle = windll.kernel32.GetStdHandle +_GetStdHandle.argtypes = [ + wintypes.DWORD, +] +_GetStdHandle.restype = wintypes.HANDLE + + +def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE: + """Retrieves a handle to the specified standard device (standard input, standard output, or standard error). + + Args: + handle (int): Integer identifier for the handle. Defaults to -11 (stdout). + + Returns: + wintypes.HANDLE: The handle + """ + return cast(wintypes.HANDLE, _GetStdHandle(handle)) + + +_GetConsoleMode = windll.kernel32.GetConsoleMode +_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] +_GetConsoleMode.restype = wintypes.BOOL + + +def GetConsoleMode(std_handle: wintypes.HANDLE) -> int: + """Retrieves the current input mode of a console's input buffer + or the current output mode of a console screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + + Raises: + LegacyWindowsError: If any error occurs while calling the Windows console API. + + Returns: + int: Value representing the current console mode as documented at + https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters + """ + + console_mode = wintypes.DWORD() + success = bool(_GetConsoleMode(std_handle, console_mode)) + if not success: + raise LegacyWindowsError("Unable to get legacy Windows Console Mode") + return console_mode.value + + +_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW +_FillConsoleOutputCharacterW.argtypes = [ + wintypes.HANDLE, + ctypes.c_char, + wintypes.DWORD, + cast(Type[COORD], WindowsCoordinates), + ctypes.POINTER(wintypes.DWORD), +] +_FillConsoleOutputCharacterW.restype = wintypes.BOOL + + +def FillConsoleOutputCharacter( + std_handle: wintypes.HANDLE, + char: str, + length: int, + start: WindowsCoordinates, +) -> int: + """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + char (str): The character to write. Must be a string of length 1. + length (int): The number of times to write the character. + start (WindowsCoordinates): The coordinates to start writing at. + + Returns: + int: The number of characters written. + """ + character = ctypes.c_char(char.encode()) + num_characters = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + _FillConsoleOutputCharacterW( + std_handle, + character, + num_characters, + start, + byref(num_written), + ) + return num_written.value + + +_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute +_FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + cast(Type[COORD], WindowsCoordinates), + ctypes.POINTER(wintypes.DWORD), +] +_FillConsoleOutputAttribute.restype = wintypes.BOOL + + +def FillConsoleOutputAttribute( + std_handle: wintypes.HANDLE, + attributes: int, + length: int, + start: WindowsCoordinates, +) -> int: + """Sets the character attributes for a specified number of character cells, + beginning at the specified coordinates in a screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + attributes (int): Integer value representing the foreground and background colours of the cells. + length (int): The number of cells to set the output attribute of. + start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set. + + Returns: + int: The number of cells whose attributes were actually set. + """ + num_cells = wintypes.DWORD(length) + style_attrs = wintypes.WORD(attributes) + num_written = wintypes.DWORD(0) + _FillConsoleOutputAttribute( + std_handle, style_attrs, num_cells, start, byref(num_written) + ) + return num_written.value + + +_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute +_SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, +] +_SetConsoleTextAttribute.restype = wintypes.BOOL + + +def SetConsoleTextAttribute( + std_handle: wintypes.HANDLE, attributes: wintypes.WORD +) -> bool: + """Set the colour attributes for all text written after this function is called. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + attributes (int): Integer value representing the foreground and background colours. + + + Returns: + bool: True if the attribute was set successfully, otherwise False. + """ + return bool(_SetConsoleTextAttribute(std_handle, attributes)) + + +_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo +_GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), +] +_GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + +def GetConsoleScreenBufferInfo( + std_handle: wintypes.HANDLE, +) -> CONSOLE_SCREEN_BUFFER_INFO: + """Retrieves information about the specified console screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + + Returns: + CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about + screen size, cursor position, colour attributes, and more.""" + console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO() + _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info)) + return console_screen_buffer_info + + +_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition +_SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + cast(Type[COORD], WindowsCoordinates), +] +_SetConsoleCursorPosition.restype = wintypes.BOOL + + +def SetConsoleCursorPosition( + std_handle: wintypes.HANDLE, coords: WindowsCoordinates +) -> bool: + """Set the position of the cursor in the console screen + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + coords (WindowsCoordinates): The coordinates to move the cursor to. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleCursorPosition(std_handle, coords)) + + +_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo +_GetConsoleCursorInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_CURSOR_INFO), +] +_GetConsoleCursorInfo.restype = wintypes.BOOL + + +def GetConsoleCursorInfo( + std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO +) -> bool: + """Get the cursor info - used to get cursor visibility and width + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information + about the console's cursor. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_GetConsoleCursorInfo(std_handle, byref(cursor_info))) + + +_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo +_SetConsoleCursorInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_CURSOR_INFO), +] +_SetConsoleCursorInfo.restype = wintypes.BOOL + + +def SetConsoleCursorInfo( + std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO +) -> bool: + """Set the cursor info - used for adjusting cursor visibility and width + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info))) + + +_SetConsoleTitle = windll.kernel32.SetConsoleTitleW +_SetConsoleTitle.argtypes = [wintypes.LPCWSTR] +_SetConsoleTitle.restype = wintypes.BOOL + + +def SetConsoleTitle(title: str) -> bool: + """Sets the title of the current console window + + Args: + title (str): The new title of the console window. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleTitle(title)) + + +class LegacyWindowsTerm: + """This class allows interaction with the legacy Windows Console API. It should only be used in the context + of environments where virtual terminal processing is not available. However, if it is used in a Windows environment, + the entire API should work. + + Args: + file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout. + """ + + BRIGHT_BIT = 8 + + # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers + ANSI_TO_WINDOWS = [ + 0, # black The Windows colours are defined in wincon.h as follows: + 4, # red define FOREGROUND_BLUE 0x0001 -- 0000 0001 + 2, # green define FOREGROUND_GREEN 0x0002 -- 0000 0010 + 6, # yellow define FOREGROUND_RED 0x0004 -- 0000 0100 + 1, # blue define FOREGROUND_INTENSITY 0x0008 -- 0000 1000 + 5, # magenta define BACKGROUND_BLUE 0x0010 -- 0001 0000 + 3, # cyan define BACKGROUND_GREEN 0x0020 -- 0010 0000 + 7, # white define BACKGROUND_RED 0x0040 -- 0100 0000 + 8, # bright black (grey) define BACKGROUND_INTENSITY 0x0080 -- 1000 0000 + 12, # bright red + 10, # bright green + 14, # bright yellow + 9, # bright blue + 13, # bright magenta + 11, # bright cyan + 15, # bright white + ] + + def __init__(self, file: "IO[str]") -> None: + handle = GetStdHandle(STDOUT) + self._handle = handle + default_text = GetConsoleScreenBufferInfo(handle).wAttributes + self._default_text = default_text + + self._default_fore = default_text & 7 + self._default_back = (default_text >> 4) & 7 + self._default_attrs = self._default_fore | (self._default_back << 4) + + self._file = file + self.write = file.write + self.flush = file.flush + + @property + def cursor_position(self) -> WindowsCoordinates: + """Returns the current position of the cursor (0-based) + + Returns: + WindowsCoordinates: The current cursor position. + """ + coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition + return WindowsCoordinates(row=cast(int, coord.Y), col=cast(int, coord.X)) + + @property + def screen_size(self) -> WindowsCoordinates: + """Returns the current size of the console screen buffer, in character columns and rows + + Returns: + WindowsCoordinates: The width and height of the screen as WindowsCoordinates. + """ + screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize + return WindowsCoordinates( + row=cast(int, screen_size.Y), col=cast(int, screen_size.X) + ) + + def write_text(self, text: str) -> None: + """Write text directly to the terminal without any modification of styles + + Args: + text (str): The text to write to the console + """ + self.write(text) + self.flush() + + def write_styled(self, text: str, style: Style) -> None: + """Write styled text to the terminal. + + Args: + text (str): The text to write + style (Style): The style of the text + """ + color = style.color + bgcolor = style.bgcolor + if style.reverse: + color, bgcolor = bgcolor, color + + if color: + fore = color.downgrade(ColorSystem.WINDOWS).number + fore = fore if fore is not None else 7 # Default to ANSI 7: White + if style.bold: + fore = fore | self.BRIGHT_BIT + if style.dim: + fore = fore & ~self.BRIGHT_BIT + fore = self.ANSI_TO_WINDOWS[fore] + else: + fore = self._default_fore + + if bgcolor: + back = bgcolor.downgrade(ColorSystem.WINDOWS).number + back = back if back is not None else 0 # Default to ANSI 0: Black + back = self.ANSI_TO_WINDOWS[back] + else: + back = self._default_back + + assert fore is not None + assert back is not None + + SetConsoleTextAttribute( + self._handle, attributes=ctypes.c_ushort(fore | (back << 4)) + ) + self.write_text(text) + SetConsoleTextAttribute(self._handle, attributes=self._default_text) + + def move_cursor_to(self, new_position: WindowsCoordinates) -> None: + """Set the position of the cursor + + Args: + new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor. + """ + if new_position.col < 0 or new_position.row < 0: + return + SetConsoleCursorPosition(self._handle, coords=new_position) + + def erase_line(self) -> None: + """Erase all content on the line the cursor is currently located at""" + screen_size = self.screen_size + cursor_position = self.cursor_position + cells_to_erase = screen_size.col + start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0) + FillConsoleOutputCharacter( + self._handle, " ", length=cells_to_erase, start=start_coordinates + ) + FillConsoleOutputAttribute( + self._handle, + self._default_attrs, + length=cells_to_erase, + start=start_coordinates, + ) + + def erase_end_of_line(self) -> None: + """Erase all content from the cursor position to the end of that line""" + cursor_position = self.cursor_position + cells_to_erase = self.screen_size.col - cursor_position.col + FillConsoleOutputCharacter( + self._handle, " ", length=cells_to_erase, start=cursor_position + ) + FillConsoleOutputAttribute( + self._handle, + self._default_attrs, + length=cells_to_erase, + start=cursor_position, + ) + + def erase_start_of_line(self) -> None: + """Erase all content from the cursor position to the start of that line""" + row, col = self.cursor_position + start = WindowsCoordinates(row, 0) + FillConsoleOutputCharacter(self._handle, " ", length=col, start=start) + FillConsoleOutputAttribute( + self._handle, self._default_attrs, length=col, start=start + ) + + def move_cursor_up(self) -> None: + """Move the cursor up a single cell""" + cursor_position = self.cursor_position + SetConsoleCursorPosition( + self._handle, + coords=WindowsCoordinates( + row=cursor_position.row - 1, col=cursor_position.col + ), + ) + + def move_cursor_down(self) -> None: + """Move the cursor down a single cell""" + cursor_position = self.cursor_position + SetConsoleCursorPosition( + self._handle, + coords=WindowsCoordinates( + row=cursor_position.row + 1, + col=cursor_position.col, + ), + ) + + def move_cursor_forward(self) -> None: + """Move the cursor forward a single cell. Wrap to the next line if required.""" + row, col = self.cursor_position + if col == self.screen_size.col - 1: + row += 1 + col = 0 + else: + col += 1 + SetConsoleCursorPosition( + self._handle, coords=WindowsCoordinates(row=row, col=col) + ) + + def move_cursor_to_column(self, column: int) -> None: + """Move cursor to the column specified by the zero-based column index, staying on the same row + + Args: + column (int): The zero-based column index to move the cursor to. + """ + row, _ = self.cursor_position + SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column)) + + def move_cursor_backward(self) -> None: + """Move the cursor backward a single cell. Wrap to the previous line if required.""" + row, col = self.cursor_position + if col == 0: + row -= 1 + col = self.screen_size.col - 1 + else: + col -= 1 + SetConsoleCursorPosition( + self._handle, coords=WindowsCoordinates(row=row, col=col) + ) + + def hide_cursor(self) -> None: + """Hide the cursor""" + current_cursor_size = self._get_cursor_size() + invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=0) + SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor) + + def show_cursor(self) -> None: + """Show the cursor""" + current_cursor_size = self._get_cursor_size() + visible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=1) + SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor) + + def set_title(self, title: str) -> None: + """Set the title of the terminal window + + Args: + title (str): The new title of the console window + """ + assert len(title) < 255, "Console title must be less than 255 characters" + SetConsoleTitle(title) + + def _get_cursor_size(self) -> int: + """Get the percentage of the character cell that is filled by the cursor""" + cursor_info = CONSOLE_CURSOR_INFO() + GetConsoleCursorInfo(self._handle, cursor_info=cursor_info) + return int(cursor_info.dwSize) + + +if __name__ == "__main__": + handle = GetStdHandle() + + from pip._vendor.rich.console import Console + + console = Console() + + term = LegacyWindowsTerm(sys.stdout) + term.set_title("Win32 Console Examples") + + style = Style(color="black", bgcolor="red") + + heading = Style.parse("black on green") + + # Check colour output + console.rule("Checking colour output") + console.print("[on red]on red!") + console.print("[blue]blue!") + console.print("[yellow]yellow!") + console.print("[bold yellow]bold yellow!") + console.print("[bright_yellow]bright_yellow!") + console.print("[dim bright_yellow]dim bright_yellow!") + console.print("[italic cyan]italic cyan!") + console.print("[bold white on blue]bold white on blue!") + console.print("[reverse bold white on blue]reverse bold white on blue!") + console.print("[bold black on cyan]bold black on cyan!") + console.print("[black on green]black on green!") + console.print("[blue on green]blue on green!") + console.print("[white on black]white on black!") + console.print("[black on white]black on white!") + console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!") + + # Check cursor movement + console.rule("Checking cursor movement") + console.print() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("went back and wrapped to prev line") + time.sleep(1) + term.move_cursor_up() + term.write_text("we go up") + time.sleep(1) + term.move_cursor_down() + term.write_text("and down") + time.sleep(1) + term.move_cursor_up() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("we went up and back 2") + time.sleep(1) + term.move_cursor_down() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("we went down and back 2") + time.sleep(1) + + # Check erasing of lines + term.hide_cursor() + console.print() + console.rule("Checking line erasing") + console.print("\n...Deleting to the start of the line...") + term.write_text("The red arrow shows the cursor location, and direction of erase") + time.sleep(1) + term.move_cursor_to_column(16) + term.write_styled("<", Style.parse("black on red")) + term.move_cursor_backward() + time.sleep(1) + term.erase_start_of_line() + time.sleep(1) + + console.print("\n\n...And to the end of the line...") + term.write_text("The red arrow shows the cursor location, and direction of erase") + time.sleep(1) + + term.move_cursor_to_column(16) + term.write_styled(">", Style.parse("black on red")) + time.sleep(1) + term.erase_end_of_line() + time.sleep(1) + + console.print("\n\n...Now the whole line will be erased...") + term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan")) + time.sleep(1) + term.erase_line() + + term.show_cursor() + print("\n") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py new file mode 100644 index 0000000..10fc0d7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py @@ -0,0 +1,72 @@ +import sys +from dataclasses import dataclass + + +@dataclass +class WindowsConsoleFeatures: + """Windows features available.""" + + vt: bool = False + """The console supports VT codes.""" + truecolor: bool = False + """The console supports truecolor.""" + + +try: + import ctypes + from ctypes import LibraryLoader + + if sys.platform == "win32": + windll = LibraryLoader(ctypes.WinDLL) + else: + windll = None + raise ImportError("Not windows") + + from pip._vendor.rich._win32_console import ( + ENABLE_VIRTUAL_TERMINAL_PROCESSING, + GetConsoleMode, + GetStdHandle, + LegacyWindowsError, + ) + +except (AttributeError, ImportError, ValueError): + + # Fallback if we can't load the Windows DLL + def get_windows_console_features() -> WindowsConsoleFeatures: + features = WindowsConsoleFeatures() + return features + +else: + + def get_windows_console_features() -> WindowsConsoleFeatures: + """Get windows console features. + + Returns: + WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. + """ + handle = GetStdHandle() + try: + console_mode = GetConsoleMode(handle) + success = True + except LegacyWindowsError: + console_mode = 0 + success = False + vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) + truecolor = False + if vt: + win_version = sys.getwindowsversion() + truecolor = win_version.major > 10 or ( + win_version.major == 10 and win_version.build >= 15063 + ) + features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor) + return features + + +if __name__ == "__main__": + import platform + + features = get_windows_console_features() + from pip._vendor.rich import print + + print(f'platform="{platform.system()}"') + print(repr(features)) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py new file mode 100644 index 0000000..5ece056 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py @@ -0,0 +1,56 @@ +from typing import Iterable, Sequence, Tuple, cast + +from pip._vendor.rich._win32_console import LegacyWindowsTerm, WindowsCoordinates +from pip._vendor.rich.segment import ControlCode, ControlType, Segment + + +def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: + """Makes appropriate Windows Console API calls based on the segments in the buffer. + + Args: + buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. + term (LegacyWindowsTerm): Used to call the Windows Console API. + """ + for text, style, control in buffer: + if not control: + if style: + term.write_styled(text, style) + else: + term.write_text(text) + else: + control_codes: Sequence[ControlCode] = control + for control_code in control_codes: + control_type = control_code[0] + if control_type == ControlType.CURSOR_MOVE_TO: + _, x, y = cast(Tuple[ControlType, int, int], control_code) + term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) + elif control_type == ControlType.CARRIAGE_RETURN: + term.write_text("\r") + elif control_type == ControlType.HOME: + term.move_cursor_to(WindowsCoordinates(0, 0)) + elif control_type == ControlType.CURSOR_UP: + term.move_cursor_up() + elif control_type == ControlType.CURSOR_DOWN: + term.move_cursor_down() + elif control_type == ControlType.CURSOR_FORWARD: + term.move_cursor_forward() + elif control_type == ControlType.CURSOR_BACKWARD: + term.move_cursor_backward() + elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: + _, column = cast(Tuple[ControlType, int], control_code) + term.move_cursor_to_column(column - 1) + elif control_type == ControlType.HIDE_CURSOR: + term.hide_cursor() + elif control_type == ControlType.SHOW_CURSOR: + term.show_cursor() + elif control_type == ControlType.ERASE_IN_LINE: + _, mode = cast(Tuple[ControlType, int], control_code) + if mode == 0: + term.erase_end_of_line() + elif mode == 1: + term.erase_start_of_line() + elif mode == 2: + term.erase_line() + elif control_type == ControlType.SET_WINDOW_TITLE: + _, title = cast(Tuple[ControlType, str], control_code) + term.set_title(title) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py new file mode 100644 index 0000000..c45f193 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py @@ -0,0 +1,56 @@ +import re +from typing import Iterable, List, Tuple + +from ._loop import loop_last +from .cells import cell_len, chop_cells + +re_word = re.compile(r"\s*\S+\s*") + + +def words(text: str) -> Iterable[Tuple[int, int, str]]: + position = 0 + word_match = re_word.match(text, position) + while word_match is not None: + start, end = word_match.span() + word = word_match.group(0) + yield start, end, word + word_match = re_word.match(text, end) + + +def divide_line(text: str, width: int, fold: bool = True) -> List[int]: + divides: List[int] = [] + append = divides.append + line_position = 0 + _cell_len = cell_len + for start, _end, word in words(text): + word_length = _cell_len(word.rstrip()) + if line_position + word_length > width: + if word_length > width: + if fold: + chopped_words = chop_cells(word, max_size=width, position=0) + for last, line in loop_last(chopped_words): + if start: + append(start) + + if last: + line_position = _cell_len(line) + else: + start += len(line) + else: + if start: + append(start) + line_position = _cell_len(word) + elif line_position and start: + append(start) + line_position = _cell_len(word) + else: + line_position += _cell_len(word) + return divides + + +if __name__ == "__main__": # pragma: no cover + from .console import Console + + console = Console(width=10) + console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") + print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2)) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py new file mode 100644 index 0000000..e6e498e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py @@ -0,0 +1,33 @@ +from abc import ABC + + +class RichRenderable(ABC): + """An abstract base class for Rich renderables. + + Note that there is no need to extend this class, the intended use is to check if an + object supports the Rich renderable protocol. For example:: + + if isinstance(my_object, RichRenderable): + console.print(my_object) + + """ + + @classmethod + def __subclasshook__(cls, other: type) -> bool: + """Check if this class supports the rich render protocol.""" + return hasattr(other, "__rich_console__") or hasattr(other, "__rich__") + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.text import Text + + t = Text() + print(isinstance(Text, RichRenderable)) + print(isinstance(t, RichRenderable)) + + class Foo: + pass + + f = Foo() + print(isinstance(f, RichRenderable)) + print(isinstance("", RichRenderable)) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/align.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/align.py new file mode 100644 index 0000000..c310b66 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/align.py @@ -0,0 +1,311 @@ +import sys +from itertools import chain +from typing import TYPE_CHECKING, Iterable, Optional + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + +from .constrain import Constrain +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import StyleType + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType, RenderResult + +AlignMethod = Literal["left", "center", "right"] +VerticalAlignMethod = Literal["top", "middle", "bottom"] + + +class Align(JupyterMixin): + """Align a renderable by adding spaces if necessary. + + Args: + renderable (RenderableType): A console renderable. + align (AlignMethod): One of "left", "center", or "right"" + style (StyleType, optional): An optional style to apply to the background. + vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. + pad (bool, optional): Pad the right with spaces. Defaults to True. + width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. + height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. + + Raises: + ValueError: if ``align`` is not one of the expected values. + """ + + def __init__( + self, + renderable: "RenderableType", + align: AlignMethod = "left", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> None: + if align not in ("left", "center", "right"): + raise ValueError( + f'invalid value for align, expected "left", "center", or "right" (not {align!r})' + ) + if vertical is not None and vertical not in ("top", "middle", "bottom"): + raise ValueError( + f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})' + ) + self.renderable = renderable + self.align = align + self.style = style + self.vertical = vertical + self.pad = pad + self.width = width + self.height = height + + def __repr__(self) -> str: + return f"Align({self.renderable!r}, {self.align!r})" + + @classmethod + def left( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the left.""" + return cls( + renderable, + "left", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + @classmethod + def center( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the center.""" + return cls( + renderable, + "center", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + @classmethod + def right( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the right.""" + return cls( + renderable, + "right", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + align = self.align + width = console.measure(self.renderable, options=options).maximum + rendered = console.render( + Constrain( + self.renderable, width if self.width is None else min(width, self.width) + ), + options.update(height=None), + ) + lines = list(Segment.split_lines(rendered)) + width, height = Segment.get_shape(lines) + lines = Segment.set_shape(lines, width, height) + new_line = Segment.line() + excess_space = options.max_width - width + style = console.get_style(self.style) if self.style is not None else None + + def generate_segments() -> Iterable[Segment]: + if excess_space <= 0: + # Exact fit + for line in lines: + yield from line + yield new_line + + elif align == "left": + # Pad on the right + pad = Segment(" " * excess_space, style) if self.pad else None + for line in lines: + yield from line + if pad: + yield pad + yield new_line + + elif align == "center": + # Pad left and right + left = excess_space // 2 + pad = Segment(" " * left, style) + pad_right = ( + Segment(" " * (excess_space - left), style) if self.pad else None + ) + for line in lines: + if left: + yield pad + yield from line + if pad_right: + yield pad_right + yield new_line + + elif align == "right": + # Padding on left + pad = Segment(" " * excess_space, style) + for line in lines: + yield pad + yield from line + yield new_line + + blank_line = ( + Segment(f"{' ' * (self.width or options.max_width)}\n", style) + if self.pad + else Segment("\n") + ) + + def blank_lines(count: int) -> Iterable[Segment]: + if count > 0: + for _ in range(count): + yield blank_line + + vertical_height = self.height or options.height + iter_segments: Iterable[Segment] + if self.vertical and vertical_height is not None: + if self.vertical == "top": + bottom_space = vertical_height - height + iter_segments = chain(generate_segments(), blank_lines(bottom_space)) + elif self.vertical == "middle": + top_space = (vertical_height - height) // 2 + bottom_space = vertical_height - top_space - height + iter_segments = chain( + blank_lines(top_space), + generate_segments(), + blank_lines(bottom_space), + ) + else: # self.vertical == "bottom": + top_space = vertical_height - height + iter_segments = chain(blank_lines(top_space), generate_segments()) + else: + iter_segments = generate_segments() + if self.style: + style = console.get_style(self.style) + iter_segments = Segment.apply_style(iter_segments, style) + yield from iter_segments + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + measurement = Measurement.get(console, options, self.renderable) + return measurement + + +class VerticalCenter(JupyterMixin): + """Vertically aligns a renderable. + + Warn: + This class is deprecated and may be removed in a future version. Use Align class with + `vertical="middle"`. + + Args: + renderable (RenderableType): A renderable object. + """ + + def __init__( + self, + renderable: "RenderableType", + style: Optional[StyleType] = None, + ) -> None: + self.renderable = renderable + self.style = style + + def __repr__(self) -> str: + return f"VerticalCenter({self.renderable!r})" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + style = console.get_style(self.style) if self.style is not None else None + lines = console.render_lines( + self.renderable, options.update(height=None), pad=False + ) + width, _height = Segment.get_shape(lines) + new_line = Segment.line() + height = options.height or options.size.height + top_space = (height - len(lines)) // 2 + bottom_space = height - top_space - len(lines) + blank_line = Segment(f"{' ' * width}", style) + + def blank_lines(count: int) -> Iterable[Segment]: + for _ in range(count): + yield blank_line + yield new_line + + if top_space > 0: + yield from blank_lines(top_space) + for line in lines: + yield from line + yield new_line + if bottom_space > 0: + yield from blank_lines(bottom_space) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + measurement = Measurement.get(console, options, self.renderable) + return measurement + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console, Group + from pip._vendor.rich.highlighter import ReprHighlighter + from pip._vendor.rich.panel import Panel + + highlighter = ReprHighlighter() + console = Console() + + panel = Panel( + Group( + Align.left(highlighter("align='left'")), + Align.center(highlighter("align='center'")), + Align.right(highlighter("align='right'")), + ), + width=60, + style="on dark_blue", + title="Align", + ) + + console.print( + Align.center(panel, vertical="middle", style="on red", height=console.height) + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py new file mode 100644 index 0000000..66365e6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py @@ -0,0 +1,240 @@ +import re +import sys +from contextlib import suppress +from typing import Iterable, NamedTuple, Optional + +from .color import Color +from .style import Style +from .text import Text + +re_ansi = re.compile( + r""" +(?:\x1b\](.*?)\x1b\\)| +(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) +""", + re.VERBOSE, +) + + +class _AnsiToken(NamedTuple): + """Result of ansi tokenized string.""" + + plain: str = "" + sgr: Optional[str] = "" + osc: Optional[str] = "" + + +def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: + """Tokenize a string in to plain text and ANSI codes. + + Args: + ansi_text (str): A String containing ANSI codes. + + Yields: + AnsiToken: A named tuple of (plain, sgr, osc) + """ + + position = 0 + sgr: Optional[str] + osc: Optional[str] + for match in re_ansi.finditer(ansi_text): + start, end = match.span(0) + osc, sgr = match.groups() + if start > position: + yield _AnsiToken(ansi_text[position:start]) + if sgr: + if sgr == "(": + position = end + 1 + continue + if sgr.endswith("m"): + yield _AnsiToken("", sgr[1:-1], osc) + else: + yield _AnsiToken("", sgr, osc) + position = end + if position < len(ansi_text): + yield _AnsiToken(ansi_text[position:]) + + +SGR_STYLE_MAP = { + 1: "bold", + 2: "dim", + 3: "italic", + 4: "underline", + 5: "blink", + 6: "blink2", + 7: "reverse", + 8: "conceal", + 9: "strike", + 21: "underline2", + 22: "not dim not bold", + 23: "not italic", + 24: "not underline", + 25: "not blink", + 26: "not blink2", + 27: "not reverse", + 28: "not conceal", + 29: "not strike", + 30: "color(0)", + 31: "color(1)", + 32: "color(2)", + 33: "color(3)", + 34: "color(4)", + 35: "color(5)", + 36: "color(6)", + 37: "color(7)", + 39: "default", + 40: "on color(0)", + 41: "on color(1)", + 42: "on color(2)", + 43: "on color(3)", + 44: "on color(4)", + 45: "on color(5)", + 46: "on color(6)", + 47: "on color(7)", + 49: "on default", + 51: "frame", + 52: "encircle", + 53: "overline", + 54: "not frame not encircle", + 55: "not overline", + 90: "color(8)", + 91: "color(9)", + 92: "color(10)", + 93: "color(11)", + 94: "color(12)", + 95: "color(13)", + 96: "color(14)", + 97: "color(15)", + 100: "on color(8)", + 101: "on color(9)", + 102: "on color(10)", + 103: "on color(11)", + 104: "on color(12)", + 105: "on color(13)", + 106: "on color(14)", + 107: "on color(15)", +} + + +class AnsiDecoder: + """Translate ANSI code in to styled Text.""" + + def __init__(self) -> None: + self.style = Style.null() + + def decode(self, terminal_text: str) -> Iterable[Text]: + """Decode ANSI codes in an iterable of lines. + + Args: + lines (Iterable[str]): An iterable of lines of terminal output. + + Yields: + Text: Marked up Text. + """ + for line in terminal_text.splitlines(): + yield self.decode_line(line) + + def decode_line(self, line: str) -> Text: + """Decode a line containing ansi codes. + + Args: + line (str): A line of terminal output. + + Returns: + Text: A Text instance marked up according to ansi codes. + """ + from_ansi = Color.from_ansi + from_rgb = Color.from_rgb + _Style = Style + text = Text() + append = text.append + line = line.rsplit("\r", 1)[-1] + for plain_text, sgr, osc in _ansi_tokenize(line): + if plain_text: + append(plain_text, self.style or None) + elif osc is not None: + if osc.startswith("8;"): + _params, semicolon, link = osc[2:].partition(";") + if semicolon: + self.style = self.style.update_link(link or None) + elif sgr is not None: + # Translate in to semi-colon separated codes + # Ignore invalid codes, because we want to be lenient + codes = [ + min(255, int(_code) if _code else 0) + for _code in sgr.split(";") + if _code.isdigit() or _code == "" + ] + iter_codes = iter(codes) + for code in iter_codes: + if code == 0: + # reset + self.style = _Style.null() + elif code in SGR_STYLE_MAP: + # styles + self.style += _Style.parse(SGR_STYLE_MAP[code]) + elif code == 38: + #  Foreground + with suppress(StopIteration): + color_type = next(iter_codes) + if color_type == 5: + self.style += _Style.from_color( + from_ansi(next(iter_codes)) + ) + elif color_type == 2: + self.style += _Style.from_color( + from_rgb( + next(iter_codes), + next(iter_codes), + next(iter_codes), + ) + ) + elif code == 48: + # Background + with suppress(StopIteration): + color_type = next(iter_codes) + if color_type == 5: + self.style += _Style.from_color( + None, from_ansi(next(iter_codes)) + ) + elif color_type == 2: + self.style += _Style.from_color( + None, + from_rgb( + next(iter_codes), + next(iter_codes), + next(iter_codes), + ), + ) + + return text + + +if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover + import io + import os + import pty + import sys + + decoder = AnsiDecoder() + + stdout = io.BytesIO() + + def read(fd: int) -> bytes: + data = os.read(fd, 1024) + stdout.write(data) + return data + + pty.spawn(sys.argv[1:], read) + + from .console import Console + + console = Console(record=True) + + stdout_result = stdout.getvalue().decode("utf-8") + print(stdout_result) + + for line in decoder.decode(stdout_result): + console.print(line) + + console.save_html("stdout.html") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py new file mode 100644 index 0000000..ed86a55 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py @@ -0,0 +1,94 @@ +from typing import Optional, Union + +from .color import Color +from .console import Console, ConsoleOptions, RenderResult +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import Style + +# There are left-aligned characters for 1/8 to 7/8, but +# the right-aligned characters exist only for 1/8 and 4/8. +BEGIN_BLOCK_ELEMENTS = ["█", "█", "█", "▐", "▐", "▐", "▕", "▕"] +END_BLOCK_ELEMENTS = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉"] +FULL_BLOCK = "█" + + +class Bar(JupyterMixin): + """Renders a solid block bar. + + Args: + size (float): Value for the end of the bar. + begin (float): Begin point (between 0 and size, inclusive). + end (float): End point (between 0 and size, inclusive). + width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. + color (Union[Color, str], optional): Color of the bar. Defaults to "default". + bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default". + """ + + def __init__( + self, + size: float, + begin: float, + end: float, + *, + width: Optional[int] = None, + color: Union[Color, str] = "default", + bgcolor: Union[Color, str] = "default", + ): + self.size = size + self.begin = max(begin, 0) + self.end = min(end, size) + self.width = width + self.style = Style(color=color, bgcolor=bgcolor) + + def __repr__(self) -> str: + return f"Bar({self.size}, {self.begin}, {self.end})" + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + + width = min( + self.width if self.width is not None else options.max_width, + options.max_width, + ) + + if self.begin >= self.end: + yield Segment(" " * width, self.style) + yield Segment.line() + return + + prefix_complete_eights = int(width * 8 * self.begin / self.size) + prefix_bar_count = prefix_complete_eights // 8 + prefix_eights_count = prefix_complete_eights % 8 + + body_complete_eights = int(width * 8 * self.end / self.size) + body_bar_count = body_complete_eights // 8 + body_eights_count = body_complete_eights % 8 + + # When start and end fall into the same cell, we ideally should render + # a symbol that's "center-aligned", but there is no good symbol in Unicode. + # In this case, we fall back to right-aligned block symbol for simplicity. + + prefix = " " * prefix_bar_count + if prefix_eights_count: + prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count] + + body = FULL_BLOCK * body_bar_count + if body_eights_count: + body += END_BLOCK_ELEMENTS[body_eights_count] + + suffix = " " * (width - len(body)) + + yield Segment(prefix + body[len(prefix) :] + suffix, self.style) + yield Segment.line() + + def __rich_measure__( + self, console: Console, options: ConsoleOptions + ) -> Measurement: + return ( + Measurement(self.width, self.width) + if self.width is not None + else Measurement(4, options.max_width) + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/box.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/box.py new file mode 100644 index 0000000..97d2a94 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/box.py @@ -0,0 +1,517 @@ +import sys +from typing import TYPE_CHECKING, Iterable, List + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + + +from ._loop import loop_last + +if TYPE_CHECKING: + from pip._vendor.rich.console import ConsoleOptions + + +class Box: + """Defines characters to render boxes. + + ┌─┬┐ top + │ ││ head + ├─┼┤ head_row + │ ││ mid + ├─┼┤ row + ├─┼┤ foot_row + │ ││ foot + └─┴┘ bottom + + Args: + box (str): Characters making up box. + ascii (bool, optional): True if this box uses ascii characters only. Default is False. + """ + + def __init__(self, box: str, *, ascii: bool = False) -> None: + self._box = box + self.ascii = ascii + line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines() + # top + self.top_left, self.top, self.top_divider, self.top_right = iter(line1) + # head + self.head_left, _, self.head_vertical, self.head_right = iter(line2) + # head_row + ( + self.head_row_left, + self.head_row_horizontal, + self.head_row_cross, + self.head_row_right, + ) = iter(line3) + + # mid + self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4) + # row + self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5) + # foot_row + ( + self.foot_row_left, + self.foot_row_horizontal, + self.foot_row_cross, + self.foot_row_right, + ) = iter(line6) + # foot + self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7) + # bottom + self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter( + line8 + ) + + def __repr__(self) -> str: + return "Box(...)" + + def __str__(self) -> str: + return self._box + + def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box": + """Substitute this box for another if it won't render due to platform issues. + + Args: + options (ConsoleOptions): Console options used in rendering. + safe (bool, optional): Substitute this for another Box if there are known problems + displaying on the platform (currently only relevant on Windows). Default is True. + + Returns: + Box: A different Box or the same Box. + """ + box = self + if options.legacy_windows and safe: + box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box) + if options.ascii_only and not box.ascii: + box = ASCII + return box + + def get_plain_headed_box(self) -> "Box": + """If this box uses special characters for the borders of the header, then + return the equivalent box that does not. + + Returns: + Box: The most similar Box that doesn't use header-specific box characters. + If the current Box already satisfies this criterion, then it's returned. + """ + return PLAIN_HEADED_SUBSTITUTIONS.get(self, self) + + def get_top(self, widths: Iterable[int]) -> str: + """Get the top of a simple box. + + Args: + widths (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + + parts: List[str] = [] + append = parts.append + append(self.top_left) + for last, width in loop_last(widths): + append(self.top * width) + if not last: + append(self.top_divider) + append(self.top_right) + return "".join(parts) + + def get_row( + self, + widths: Iterable[int], + level: Literal["head", "row", "foot", "mid"] = "row", + edge: bool = True, + ) -> str: + """Get the top of a simple box. + + Args: + width (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + if level == "head": + left = self.head_row_left + horizontal = self.head_row_horizontal + cross = self.head_row_cross + right = self.head_row_right + elif level == "row": + left = self.row_left + horizontal = self.row_horizontal + cross = self.row_cross + right = self.row_right + elif level == "mid": + left = self.mid_left + horizontal = " " + cross = self.mid_vertical + right = self.mid_right + elif level == "foot": + left = self.foot_row_left + horizontal = self.foot_row_horizontal + cross = self.foot_row_cross + right = self.foot_row_right + else: + raise ValueError("level must be 'head', 'row' or 'foot'") + + parts: List[str] = [] + append = parts.append + if edge: + append(left) + for last, width in loop_last(widths): + append(horizontal * width) + if not last: + append(cross) + if edge: + append(right) + return "".join(parts) + + def get_bottom(self, widths: Iterable[int]) -> str: + """Get the bottom of a simple box. + + Args: + widths (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + + parts: List[str] = [] + append = parts.append + append(self.bottom_left) + for last, width in loop_last(widths): + append(self.bottom * width) + if not last: + append(self.bottom_divider) + append(self.bottom_right) + return "".join(parts) + + +ASCII: Box = Box( + """\ ++--+ +| || +|-+| +| || +|-+| +|-+| +| || ++--+ +""", + ascii=True, +) + +ASCII2: Box = Box( + """\ ++-++ +| || ++-++ +| || ++-++ ++-++ +| || ++-++ +""", + ascii=True, +) + +ASCII_DOUBLE_HEAD: Box = Box( + """\ ++-++ +| || ++=++ +| || ++-++ ++-++ +| || ++-++ +""", + ascii=True, +) + +SQUARE: Box = Box( + """\ +┌─┬┐ +│ ││ +├─┼┤ +│ ││ +├─┼┤ +├─┼┤ +│ ││ +└─┴┘ +""" +) + +SQUARE_DOUBLE_HEAD: Box = Box( + """\ +┌─┬┐ +│ ││ +╞═╪╡ +│ ││ +├─┼┤ +├─┼┤ +│ ││ +└─┴┘ +""" +) + +MINIMAL: Box = Box( + """\ + ╷ + │ +╶─┼╴ + │ +╶─┼╴ +╶─┼╴ + │ + ╵ +""" +) + + +MINIMAL_HEAVY_HEAD: Box = Box( + """\ + ╷ + │ +╺━┿╸ + │ +╶─┼╴ +╶─┼╴ + │ + ╵ +""" +) + +MINIMAL_DOUBLE_HEAD: Box = Box( + """\ + ╷ + │ + ═╪ + │ + ─┼ + ─┼ + │ + ╵ +""" +) + + +SIMPLE: Box = Box( + """\ + + + ── + + + ── + + +""" +) + +SIMPLE_HEAD: Box = Box( + """\ + + + ── + + + + + +""" +) + + +SIMPLE_HEAVY: Box = Box( + """\ + + + ━━ + + + ━━ + + +""" +) + + +HORIZONTALS: Box = Box( + """\ + ── + + ── + + ── + ── + + ── +""" +) + +ROUNDED: Box = Box( + """\ +╭─┬╮ +│ ││ +├─┼┤ +│ ││ +├─┼┤ +├─┼┤ +│ ││ +╰─┴╯ +""" +) + +HEAVY: Box = Box( + """\ +┏━┳┓ +┃ ┃┃ +┣━╋┫ +┃ ┃┃ +┣━╋┫ +┣━╋┫ +┃ ┃┃ +┗━┻┛ +""" +) + +HEAVY_EDGE: Box = Box( + """\ +┏━┯┓ +┃ │┃ +┠─┼┨ +┃ │┃ +┠─┼┨ +┠─┼┨ +┃ │┃ +┗━┷┛ +""" +) + +HEAVY_HEAD: Box = Box( + """\ +┏━┳┓ +┃ ┃┃ +┡━╇┩ +│ ││ +├─┼┤ +├─┼┤ +│ ││ +└─┴┘ +""" +) + +DOUBLE: Box = Box( + """\ +╔═╦╗ +║ ║║ +╠═╬╣ +║ ║║ +╠═╬╣ +╠═╬╣ +║ ║║ +╚═╩╝ +""" +) + +DOUBLE_EDGE: Box = Box( + """\ +╔═╤╗ +║ │║ +╟─┼╢ +║ │║ +╟─┼╢ +╟─┼╢ +║ │║ +╚═╧╝ +""" +) + +MARKDOWN: Box = Box( + """\ + +| || +|-|| +| || +|-|| +|-|| +| || + +""", + ascii=True, +) + +# Map Boxes that don't render with raster fonts on to equivalent that do +LEGACY_WINDOWS_SUBSTITUTIONS = { + ROUNDED: SQUARE, + MINIMAL_HEAVY_HEAD: MINIMAL, + SIMPLE_HEAVY: SIMPLE, + HEAVY: SQUARE, + HEAVY_EDGE: SQUARE, + HEAVY_HEAD: SQUARE, +} + +# Map headed boxes to their headerless equivalents +PLAIN_HEADED_SUBSTITUTIONS = { + HEAVY_HEAD: SQUARE, + SQUARE_DOUBLE_HEAD: SQUARE, + MINIMAL_DOUBLE_HEAD: MINIMAL, + MINIMAL_HEAVY_HEAD: MINIMAL, + ASCII_DOUBLE_HEAD: ASCII2, +} + + +if __name__ == "__main__": # pragma: no cover + + from pip._vendor.rich.columns import Columns + from pip._vendor.rich.panel import Panel + + from . import box as box + from .console import Console + from .table import Table + from .text import Text + + console = Console(record=True) + + BOXES = [ + "ASCII", + "ASCII2", + "ASCII_DOUBLE_HEAD", + "SQUARE", + "SQUARE_DOUBLE_HEAD", + "MINIMAL", + "MINIMAL_HEAVY_HEAD", + "MINIMAL_DOUBLE_HEAD", + "SIMPLE", + "SIMPLE_HEAD", + "SIMPLE_HEAVY", + "HORIZONTALS", + "ROUNDED", + "HEAVY", + "HEAVY_EDGE", + "HEAVY_HEAD", + "DOUBLE", + "DOUBLE_EDGE", + "MARKDOWN", + ] + + console.print(Panel("[bold green]Box Constants", style="green"), justify="center") + console.print() + + columns = Columns(expand=True, padding=2) + for box_name in sorted(BOXES): + table = Table( + show_footer=True, style="dim", border_style="not dim", expand=True + ) + table.add_column("Header 1", "Footer 1") + table.add_column("Header 2", "Footer 2") + table.add_row("Cell", "Cell") + table.add_row("Cell", "Cell") + table.box = getattr(box, box_name) + table.title = Text(f"box.{box_name}", style="magenta") + columns.add_renderable(table) + console.print(columns) + + # console.save_svg("box.svg") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py new file mode 100644 index 0000000..9354f9e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py @@ -0,0 +1,154 @@ +import re +from functools import lru_cache +from typing import Callable, List + +from ._cell_widths import CELL_WIDTHS + +# Regex to match sequence of the most common character ranges +_is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match + + +@lru_cache(4096) +def cached_cell_len(text: str) -> int: + """Get the number of cells required to display text. + + This method always caches, which may use up a lot of memory. It is recommended to use + `cell_len` over this method. + + Args: + text (str): Text to display. + + Returns: + int: Get the number of cells required to display text. + """ + _get_size = get_character_cell_size + total_size = sum(_get_size(character) for character in text) + return total_size + + +def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: + """Get the number of cells required to display text. + + Args: + text (str): Text to display. + + Returns: + int: Get the number of cells required to display text. + """ + if len(text) < 512: + return _cell_len(text) + _get_size = get_character_cell_size + total_size = sum(_get_size(character) for character in text) + return total_size + + +@lru_cache(maxsize=4096) +def get_character_cell_size(character: str) -> int: + """Get the cell size of a character. + + Args: + character (str): A single character. + + Returns: + int: Number of cells (0, 1 or 2) occupied by that character. + """ + return _get_codepoint_cell_size(ord(character)) + + +@lru_cache(maxsize=4096) +def _get_codepoint_cell_size(codepoint: int) -> int: + """Get the cell size of a character. + + Args: + codepoint (int): Codepoint of a character. + + Returns: + int: Number of cells (0, 1 or 2) occupied by that character. + """ + + _table = CELL_WIDTHS + lower_bound = 0 + upper_bound = len(_table) - 1 + index = (lower_bound + upper_bound) // 2 + while True: + start, end, width = _table[index] + if codepoint < start: + upper_bound = index - 1 + elif codepoint > end: + lower_bound = index + 1 + else: + return 0 if width == -1 else width + if upper_bound < lower_bound: + break + index = (lower_bound + upper_bound) // 2 + return 1 + + +def set_cell_size(text: str, total: int) -> str: + """Set the length of a string to fit within given number of cells.""" + + if _is_single_cell_widths(text): + size = len(text) + if size < total: + return text + " " * (total - size) + return text[:total] + + if total <= 0: + return "" + cell_size = cell_len(text) + if cell_size == total: + return text + if cell_size < total: + return text + " " * (total - cell_size) + + start = 0 + end = len(text) + + # Binary search until we find the right size + while True: + pos = (start + end) // 2 + before = text[: pos + 1] + before_len = cell_len(before) + if before_len == total + 1 and cell_len(before[-1]) == 2: + return before[:-1] + " " + if before_len == total: + return before + if before_len > total: + end = pos + else: + start = pos + + +# TODO: This is inefficient +# TODO: This might not work with CWJ type characters +def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]: + """Break text in to equal (cell) length strings, returning the characters in reverse + order""" + _get_character_cell_size = get_character_cell_size + characters = [ + (character, _get_character_cell_size(character)) for character in text + ] + total_size = position + lines: List[List[str]] = [[]] + append = lines[-1].append + + for character, size in reversed(characters): + if total_size + size > max_size: + lines.append([character]) + append = lines[-1].append + total_size = size + else: + total_size += size + append(character) + + return ["".join(line) for line in lines] + + +if __name__ == "__main__": # pragma: no cover + + print(get_character_cell_size("😽")) + for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8): + print(line) + for n in range(80, 1, -1): + print(set_cell_size("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", n) + "|") + print("x" * n) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/color.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/color.py new file mode 100644 index 0000000..dfe4559 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/color.py @@ -0,0 +1,622 @@ +import platform +import re +from colorsys import rgb_to_hls +from enum import IntEnum +from functools import lru_cache +from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple + +from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE +from .color_triplet import ColorTriplet +from .repr import Result, rich_repr +from .terminal_theme import DEFAULT_TERMINAL_THEME + +if TYPE_CHECKING: # pragma: no cover + from .terminal_theme import TerminalTheme + from .text import Text + + +WINDOWS = platform.system() == "Windows" + + +class ColorSystem(IntEnum): + """One of the 3 color system supported by terminals.""" + + STANDARD = 1 + EIGHT_BIT = 2 + TRUECOLOR = 3 + WINDOWS = 4 + + def __repr__(self) -> str: + return f"ColorSystem.{self.name}" + + def __str__(self) -> str: + return repr(self) + + +class ColorType(IntEnum): + """Type of color stored in Color class.""" + + DEFAULT = 0 + STANDARD = 1 + EIGHT_BIT = 2 + TRUECOLOR = 3 + WINDOWS = 4 + + def __repr__(self) -> str: + return f"ColorType.{self.name}" + + +ANSI_COLOR_NAMES = { + "black": 0, + "red": 1, + "green": 2, + "yellow": 3, + "blue": 4, + "magenta": 5, + "cyan": 6, + "white": 7, + "bright_black": 8, + "bright_red": 9, + "bright_green": 10, + "bright_yellow": 11, + "bright_blue": 12, + "bright_magenta": 13, + "bright_cyan": 14, + "bright_white": 15, + "grey0": 16, + "gray0": 16, + "navy_blue": 17, + "dark_blue": 18, + "blue3": 20, + "blue1": 21, + "dark_green": 22, + "deep_sky_blue4": 25, + "dodger_blue3": 26, + "dodger_blue2": 27, + "green4": 28, + "spring_green4": 29, + "turquoise4": 30, + "deep_sky_blue3": 32, + "dodger_blue1": 33, + "green3": 40, + "spring_green3": 41, + "dark_cyan": 36, + "light_sea_green": 37, + "deep_sky_blue2": 38, + "deep_sky_blue1": 39, + "spring_green2": 47, + "cyan3": 43, + "dark_turquoise": 44, + "turquoise2": 45, + "green1": 46, + "spring_green1": 48, + "medium_spring_green": 49, + "cyan2": 50, + "cyan1": 51, + "dark_red": 88, + "deep_pink4": 125, + "purple4": 55, + "purple3": 56, + "blue_violet": 57, + "orange4": 94, + "grey37": 59, + "gray37": 59, + "medium_purple4": 60, + "slate_blue3": 62, + "royal_blue1": 63, + "chartreuse4": 64, + "dark_sea_green4": 71, + "pale_turquoise4": 66, + "steel_blue": 67, + "steel_blue3": 68, + "cornflower_blue": 69, + "chartreuse3": 76, + "cadet_blue": 73, + "sky_blue3": 74, + "steel_blue1": 81, + "pale_green3": 114, + "sea_green3": 78, + "aquamarine3": 79, + "medium_turquoise": 80, + "chartreuse2": 112, + "sea_green2": 83, + "sea_green1": 85, + "aquamarine1": 122, + "dark_slate_gray2": 87, + "dark_magenta": 91, + "dark_violet": 128, + "purple": 129, + "light_pink4": 95, + "plum4": 96, + "medium_purple3": 98, + "slate_blue1": 99, + "yellow4": 106, + "wheat4": 101, + "grey53": 102, + "gray53": 102, + "light_slate_grey": 103, + "light_slate_gray": 103, + "medium_purple": 104, + "light_slate_blue": 105, + "dark_olive_green3": 149, + "dark_sea_green": 108, + "light_sky_blue3": 110, + "sky_blue2": 111, + "dark_sea_green3": 150, + "dark_slate_gray3": 116, + "sky_blue1": 117, + "chartreuse1": 118, + "light_green": 120, + "pale_green1": 156, + "dark_slate_gray1": 123, + "red3": 160, + "medium_violet_red": 126, + "magenta3": 164, + "dark_orange3": 166, + "indian_red": 167, + "hot_pink3": 168, + "medium_orchid3": 133, + "medium_orchid": 134, + "medium_purple2": 140, + "dark_goldenrod": 136, + "light_salmon3": 173, + "rosy_brown": 138, + "grey63": 139, + "gray63": 139, + "medium_purple1": 141, + "gold3": 178, + "dark_khaki": 143, + "navajo_white3": 144, + "grey69": 145, + "gray69": 145, + "light_steel_blue3": 146, + "light_steel_blue": 147, + "yellow3": 184, + "dark_sea_green2": 157, + "light_cyan3": 152, + "light_sky_blue1": 153, + "green_yellow": 154, + "dark_olive_green2": 155, + "dark_sea_green1": 193, + "pale_turquoise1": 159, + "deep_pink3": 162, + "magenta2": 200, + "hot_pink2": 169, + "orchid": 170, + "medium_orchid1": 207, + "orange3": 172, + "light_pink3": 174, + "pink3": 175, + "plum3": 176, + "violet": 177, + "light_goldenrod3": 179, + "tan": 180, + "misty_rose3": 181, + "thistle3": 182, + "plum2": 183, + "khaki3": 185, + "light_goldenrod2": 222, + "light_yellow3": 187, + "grey84": 188, + "gray84": 188, + "light_steel_blue1": 189, + "yellow2": 190, + "dark_olive_green1": 192, + "honeydew2": 194, + "light_cyan1": 195, + "red1": 196, + "deep_pink2": 197, + "deep_pink1": 199, + "magenta1": 201, + "orange_red1": 202, + "indian_red1": 204, + "hot_pink": 206, + "dark_orange": 208, + "salmon1": 209, + "light_coral": 210, + "pale_violet_red1": 211, + "orchid2": 212, + "orchid1": 213, + "orange1": 214, + "sandy_brown": 215, + "light_salmon1": 216, + "light_pink1": 217, + "pink1": 218, + "plum1": 219, + "gold1": 220, + "navajo_white1": 223, + "misty_rose1": 224, + "thistle1": 225, + "yellow1": 226, + "light_goldenrod1": 227, + "khaki1": 228, + "wheat1": 229, + "cornsilk1": 230, + "grey100": 231, + "gray100": 231, + "grey3": 232, + "gray3": 232, + "grey7": 233, + "gray7": 233, + "grey11": 234, + "gray11": 234, + "grey15": 235, + "gray15": 235, + "grey19": 236, + "gray19": 236, + "grey23": 237, + "gray23": 237, + "grey27": 238, + "gray27": 238, + "grey30": 239, + "gray30": 239, + "grey35": 240, + "gray35": 240, + "grey39": 241, + "gray39": 241, + "grey42": 242, + "gray42": 242, + "grey46": 243, + "gray46": 243, + "grey50": 244, + "gray50": 244, + "grey54": 245, + "gray54": 245, + "grey58": 246, + "gray58": 246, + "grey62": 247, + "gray62": 247, + "grey66": 248, + "gray66": 248, + "grey70": 249, + "gray70": 249, + "grey74": 250, + "gray74": 250, + "grey78": 251, + "gray78": 251, + "grey82": 252, + "gray82": 252, + "grey85": 253, + "gray85": 253, + "grey89": 254, + "gray89": 254, + "grey93": 255, + "gray93": 255, +} + + +class ColorParseError(Exception): + """The color could not be parsed.""" + + +RE_COLOR = re.compile( + r"""^ +\#([0-9a-f]{6})$| +color\(([0-9]{1,3})\)$| +rgb\(([\d\s,]+)\)$ +""", + re.VERBOSE, +) + + +@rich_repr +class Color(NamedTuple): + """Terminal color definition.""" + + name: str + """The name of the color (typically the input to Color.parse).""" + type: ColorType + """The type of the color.""" + number: Optional[int] = None + """The color number, if a standard color, or None.""" + triplet: Optional[ColorTriplet] = None + """A triplet of color components, if an RGB color.""" + + def __rich__(self) -> "Text": + """Displays the actual color if Rich printed.""" + from .style import Style + from .text import Text + + return Text.assemble( + f"", + ) + + def __rich_repr__(self) -> Result: + yield self.name + yield self.type + yield "number", self.number, None + yield "triplet", self.triplet, None + + @property + def system(self) -> ColorSystem: + """Get the native color system for this color.""" + if self.type == ColorType.DEFAULT: + return ColorSystem.STANDARD + return ColorSystem(int(self.type)) + + @property + def is_system_defined(self) -> bool: + """Check if the color is ultimately defined by the system.""" + return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR) + + @property + def is_default(self) -> bool: + """Check if the color is a default color.""" + return self.type == ColorType.DEFAULT + + def get_truecolor( + self, theme: Optional["TerminalTheme"] = None, foreground: bool = True + ) -> ColorTriplet: + """Get an equivalent color triplet for this color. + + Args: + theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None. + foreground (bool, optional): True for a foreground color, or False for background. Defaults to True. + + Returns: + ColorTriplet: A color triplet containing RGB components. + """ + + if theme is None: + theme = DEFAULT_TERMINAL_THEME + if self.type == ColorType.TRUECOLOR: + assert self.triplet is not None + return self.triplet + elif self.type == ColorType.EIGHT_BIT: + assert self.number is not None + return EIGHT_BIT_PALETTE[self.number] + elif self.type == ColorType.STANDARD: + assert self.number is not None + return theme.ansi_colors[self.number] + elif self.type == ColorType.WINDOWS: + assert self.number is not None + return WINDOWS_PALETTE[self.number] + else: # self.type == ColorType.DEFAULT: + assert self.number is None + return theme.foreground_color if foreground else theme.background_color + + @classmethod + def from_ansi(cls, number: int) -> "Color": + """Create a Color number from it's 8-bit ansi number. + + Args: + number (int): A number between 0-255 inclusive. + + Returns: + Color: A new Color instance. + """ + return cls( + name=f"color({number})", + type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), + number=number, + ) + + @classmethod + def from_triplet(cls, triplet: "ColorTriplet") -> "Color": + """Create a truecolor RGB color from a triplet of values. + + Args: + triplet (ColorTriplet): A color triplet containing red, green and blue components. + + Returns: + Color: A new color object. + """ + return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet) + + @classmethod + def from_rgb(cls, red: float, green: float, blue: float) -> "Color": + """Create a truecolor from three color components in the range(0->255). + + Args: + red (float): Red component in range 0-255. + green (float): Green component in range 0-255. + blue (float): Blue component in range 0-255. + + Returns: + Color: A new color object. + """ + return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue))) + + @classmethod + def default(cls) -> "Color": + """Get a Color instance representing the default color. + + Returns: + Color: Default color. + """ + return cls(name="default", type=ColorType.DEFAULT) + + @classmethod + @lru_cache(maxsize=1024) + def parse(cls, color: str) -> "Color": + """Parse a color definition.""" + original_color = color + color = color.lower().strip() + + if color == "default": + return cls(color, type=ColorType.DEFAULT) + + color_number = ANSI_COLOR_NAMES.get(color) + if color_number is not None: + return cls( + color, + type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT), + number=color_number, + ) + + color_match = RE_COLOR.match(color) + if color_match is None: + raise ColorParseError(f"{original_color!r} is not a valid color") + + color_24, color_8, color_rgb = color_match.groups() + if color_24: + triplet = ColorTriplet( + int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16) + ) + return cls(color, ColorType.TRUECOLOR, triplet=triplet) + + elif color_8: + number = int(color_8) + if number > 255: + raise ColorParseError(f"color number must be <= 255 in {color!r}") + return cls( + color, + type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), + number=number, + ) + + else: # color_rgb: + components = color_rgb.split(",") + if len(components) != 3: + raise ColorParseError( + f"expected three components in {original_color!r}" + ) + red, green, blue = components + triplet = ColorTriplet(int(red), int(green), int(blue)) + if not all(component <= 255 for component in triplet): + raise ColorParseError( + f"color components must be <= 255 in {original_color!r}" + ) + return cls(color, ColorType.TRUECOLOR, triplet=triplet) + + @lru_cache(maxsize=1024) + def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: + """Get the ANSI escape codes for this color.""" + _type = self.type + if _type == ColorType.DEFAULT: + return ("39" if foreground else "49",) + + elif _type == ColorType.WINDOWS: + number = self.number + assert number is not None + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) + + elif _type == ColorType.STANDARD: + number = self.number + assert number is not None + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) + + elif _type == ColorType.EIGHT_BIT: + assert self.number is not None + return ("38" if foreground else "48", "5", str(self.number)) + + else: # self.standard == ColorStandard.TRUECOLOR: + assert self.triplet is not None + red, green, blue = self.triplet + return ("38" if foreground else "48", "2", str(red), str(green), str(blue)) + + @lru_cache(maxsize=1024) + def downgrade(self, system: ColorSystem) -> "Color": + """Downgrade a color system to a system with fewer colors.""" + + if self.type in (ColorType.DEFAULT, system): + return self + # Convert to 8-bit color from truecolor color + if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + _h, l, s = rgb_to_hls(*self.triplet.normalized) + # If saturation is under 15% assume it is grayscale + if s < 0.15: + gray = round(l * 25.0) + if gray == 0: + color_number = 16 + elif gray == 25: + color_number = 231 + else: + color_number = 231 + gray + return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + + red, green, blue = self.triplet + six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 + six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 + six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 + + color_number = ( + 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) + ) + return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + + # Convert to standard from truecolor or 8-bit + elif system == ColorSystem.STANDARD: + if self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + triplet = self.triplet + else: # self.system == ColorSystem.EIGHT_BIT + assert self.number is not None + triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) + + color_number = STANDARD_PALETTE.match(triplet) + return Color(self.name, ColorType.STANDARD, number=color_number) + + elif system == ColorSystem.WINDOWS: + if self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + triplet = self.triplet + else: # self.system == ColorSystem.EIGHT_BIT + assert self.number is not None + if self.number < 16: + return Color(self.name, ColorType.WINDOWS, number=self.number) + triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) + + color_number = WINDOWS_PALETTE.match(triplet) + return Color(self.name, ColorType.WINDOWS, number=color_number) + + return self + + +def parse_rgb_hex(hex_color: str) -> ColorTriplet: + """Parse six hex characters in to RGB triplet.""" + assert len(hex_color) == 6, "must be 6 characters" + color = ColorTriplet( + int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) + ) + return color + + +def blend_rgb( + color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5 +) -> ColorTriplet: + """Blend one RGB color in to another.""" + r1, g1, b1 = color1 + r2, g2, b2 = color2 + new_color = ColorTriplet( + int(r1 + (r2 - r1) * cross_fade), + int(g1 + (g2 - g1) * cross_fade), + int(b1 + (b2 - b1) * cross_fade), + ) + return new_color + + +if __name__ == "__main__": # pragma: no cover + + from .console import Console + from .table import Table + from .text import Text + + console = Console() + + table = Table(show_footer=False, show_edge=True) + table.add_column("Color", width=10, overflow="ellipsis") + table.add_column("Number", justify="right", style="yellow") + table.add_column("Name", style="green") + table.add_column("Hex", style="blue") + table.add_column("RGB", style="magenta") + + colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) + for color_number, name in colors: + if "grey" in name: + continue + color_cell = Text(" " * 10, style=f"on {name}") + if color_number < 16: + table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) + else: + color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] + table.add_row( + color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb + ) + + console.print(table) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py new file mode 100644 index 0000000..02cab32 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py @@ -0,0 +1,38 @@ +from typing import NamedTuple, Tuple + + +class ColorTriplet(NamedTuple): + """The red, green, and blue components of a color.""" + + red: int + """Red component in 0 to 255 range.""" + green: int + """Green component in 0 to 255 range.""" + blue: int + """Blue component in 0 to 255 range.""" + + @property + def hex(self) -> str: + """get the color triplet in CSS style.""" + red, green, blue = self + return f"#{red:02x}{green:02x}{blue:02x}" + + @property + def rgb(self) -> str: + """The color in RGB format. + + Returns: + str: An rgb color, e.g. ``"rgb(100,23,255)"``. + """ + red, green, blue = self + return f"rgb({red},{green},{blue})" + + @property + def normalized(self) -> Tuple[float, float, float]: + """Convert components into floats between 0 and 1. + + Returns: + Tuple[float, float, float]: A tuple of three normalized colour components. + """ + red, green, blue = self + return red / 255.0, green / 255.0, blue / 255.0 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py new file mode 100644 index 0000000..669a3a7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py @@ -0,0 +1,187 @@ +from collections import defaultdict +from itertools import chain +from operator import itemgetter +from typing import Dict, Iterable, List, Optional, Tuple + +from .align import Align, AlignMethod +from .console import Console, ConsoleOptions, RenderableType, RenderResult +from .constrain import Constrain +from .measure import Measurement +from .padding import Padding, PaddingDimensions +from .table import Table +from .text import TextType +from .jupyter import JupyterMixin + + +class Columns(JupyterMixin): + """Display renderables in neat columns. + + Args: + renderables (Iterable[RenderableType]): Any number of Rich renderables (including str). + width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None. + padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1). + expand (bool, optional): Expand columns to full width. Defaults to False. + equal (bool, optional): Arrange in to equal sized columns. Defaults to False. + column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False. + right_to_left (bool, optional): Start column from right hand side. Defaults to False. + align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None. + title (TextType, optional): Optional title for Columns. + """ + + def __init__( + self, + renderables: Optional[Iterable[RenderableType]] = None, + padding: PaddingDimensions = (0, 1), + *, + width: Optional[int] = None, + expand: bool = False, + equal: bool = False, + column_first: bool = False, + right_to_left: bool = False, + align: Optional[AlignMethod] = None, + title: Optional[TextType] = None, + ) -> None: + self.renderables = list(renderables or []) + self.width = width + self.padding = padding + self.expand = expand + self.equal = equal + self.column_first = column_first + self.right_to_left = right_to_left + self.align: Optional[AlignMethod] = align + self.title = title + + def add_renderable(self, renderable: RenderableType) -> None: + """Add a renderable to the columns. + + Args: + renderable (RenderableType): Any renderable object. + """ + self.renderables.append(renderable) + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + render_str = console.render_str + renderables = [ + render_str(renderable) if isinstance(renderable, str) else renderable + for renderable in self.renderables + ] + if not renderables: + return + _top, right, _bottom, left = Padding.unpack(self.padding) + width_padding = max(left, right) + max_width = options.max_width + widths: Dict[int, int] = defaultdict(int) + column_count = len(renderables) + + get_measurement = Measurement.get + renderable_widths = [ + get_measurement(console, options, renderable).maximum + for renderable in renderables + ] + if self.equal: + renderable_widths = [max(renderable_widths)] * len(renderable_widths) + + def iter_renderables( + column_count: int, + ) -> Iterable[Tuple[int, Optional[RenderableType]]]: + item_count = len(renderables) + if self.column_first: + width_renderables = list(zip(renderable_widths, renderables)) + + column_lengths: List[int] = [item_count // column_count] * column_count + for col_no in range(item_count % column_count): + column_lengths[col_no] += 1 + + row_count = (item_count + column_count - 1) // column_count + cells = [[-1] * column_count for _ in range(row_count)] + row = col = 0 + for index in range(item_count): + cells[row][col] = index + column_lengths[col] -= 1 + if column_lengths[col]: + row += 1 + else: + col += 1 + row = 0 + for index in chain.from_iterable(cells): + if index == -1: + break + yield width_renderables[index] + else: + yield from zip(renderable_widths, renderables) + # Pad odd elements with spaces + if item_count % column_count: + for _ in range(column_count - (item_count % column_count)): + yield 0, None + + table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False) + table.expand = self.expand + table.title = self.title + + if self.width is not None: + column_count = (max_width) // (self.width + width_padding) + for _ in range(column_count): + table.add_column(width=self.width) + else: + while column_count > 1: + widths.clear() + column_no = 0 + for renderable_width, _ in iter_renderables(column_count): + widths[column_no] = max(widths[column_no], renderable_width) + total_width = sum(widths.values()) + width_padding * ( + len(widths) - 1 + ) + if total_width > max_width: + column_count = len(widths) - 1 + break + else: + column_no = (column_no + 1) % column_count + else: + break + + get_renderable = itemgetter(1) + _renderables = [ + get_renderable(_renderable) + for _renderable in iter_renderables(column_count) + ] + if self.equal: + _renderables = [ + None + if renderable is None + else Constrain(renderable, renderable_widths[0]) + for renderable in _renderables + ] + if self.align: + align = self.align + _Align = Align + _renderables = [ + None if renderable is None else _Align(renderable, align) + for renderable in _renderables + ] + + right_to_left = self.right_to_left + add_row = table.add_row + for start in range(0, len(_renderables), column_count): + row = _renderables[start : start + column_count] + if right_to_left: + row = row[::-1] + add_row(*row) + yield table + + +if __name__ == "__main__": # pragma: no cover + import os + + console = Console() + + files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] + columns = Columns(files, padding=(0, 1), expand=False, equal=False) + console.print(columns) + console.rule() + columns.column_first = True + console.print(columns) + columns.right_to_left = True + console.rule() + console.print(columns) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/console.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/console.py new file mode 100644 index 0000000..e559cbb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/console.py @@ -0,0 +1,2633 @@ +import inspect +import os +import platform +import sys +import threading +import zlib +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from datetime import datetime +from functools import wraps +from getpass import getpass +from html import escape +from inspect import isclass +from itertools import islice +from math import ceil +from time import monotonic +from types import FrameType, ModuleType, TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + List, + Mapping, + NamedTuple, + Optional, + TextIO, + Tuple, + Type, + Union, + cast, +) + +from pip._vendor.rich._null_file import NULL_FILE + +if sys.version_info >= (3, 8): + from typing import Literal, Protocol, runtime_checkable +else: + from pip._vendor.typing_extensions import ( + Literal, + Protocol, + runtime_checkable, + ) # pragma: no cover + +from . import errors, themes +from ._emoji_replace import _emoji_replace +from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT +from ._fileno import get_fileno +from ._log_render import FormatTimeCallable, LogRender +from .align import Align, AlignMethod +from .color import ColorSystem, blend_rgb +from .control import Control +from .emoji import EmojiVariant +from .highlighter import NullHighlighter, ReprHighlighter +from .markup import render as render_markup +from .measure import Measurement, measure_renderables +from .pager import Pager, SystemPager +from .pretty import Pretty, is_expandable +from .protocol import rich_cast +from .region import Region +from .scope import render_scope +from .screen import Screen +from .segment import Segment +from .style import Style, StyleType +from .styled import Styled +from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme +from .text import Text, TextType +from .theme import Theme, ThemeStack + +if TYPE_CHECKING: + from ._windows import WindowsConsoleFeatures + from .live import Live + from .status import Status + +JUPYTER_DEFAULT_COLUMNS = 115 +JUPYTER_DEFAULT_LINES = 100 +WINDOWS = platform.system() == "Windows" + +HighlighterType = Callable[[Union[str, "Text"]], "Text"] +JustifyMethod = Literal["default", "left", "center", "right", "full"] +OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] + + +class NoChange: + pass + + +NO_CHANGE = NoChange() + +try: + _STDIN_FILENO = sys.__stdin__.fileno() +except Exception: + _STDIN_FILENO = 0 +try: + _STDOUT_FILENO = sys.__stdout__.fileno() +except Exception: + _STDOUT_FILENO = 1 +try: + _STDERR_FILENO = sys.__stderr__.fileno() +except Exception: + _STDERR_FILENO = 2 + +_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) +_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) + + +_TERM_COLORS = { + "kitty": ColorSystem.EIGHT_BIT, + "256color": ColorSystem.EIGHT_BIT, + "16color": ColorSystem.STANDARD, +} + + +class ConsoleDimensions(NamedTuple): + """Size of the terminal.""" + + width: int + """The width of the console in 'cells'.""" + height: int + """The height of the console in lines.""" + + +@dataclass +class ConsoleOptions: + """Options for __rich_console__ method.""" + + size: ConsoleDimensions + """Size of console.""" + legacy_windows: bool + """legacy_windows: flag for legacy windows.""" + min_width: int + """Minimum width of renderable.""" + max_width: int + """Maximum width of renderable.""" + is_terminal: bool + """True if the target is a terminal, otherwise False.""" + encoding: str + """Encoding of terminal.""" + max_height: int + """Height of container (starts as terminal)""" + justify: Optional[JustifyMethod] = None + """Justify value override for renderable.""" + overflow: Optional[OverflowMethod] = None + """Overflow value override for renderable.""" + no_wrap: Optional[bool] = False + """Disable wrapping for text.""" + highlight: Optional[bool] = None + """Highlight override for render_str.""" + markup: Optional[bool] = None + """Enable markup when rendering strings.""" + height: Optional[int] = None + + @property + def ascii_only(self) -> bool: + """Check if renderables should use ascii only.""" + return not self.encoding.startswith("utf") + + def copy(self) -> "ConsoleOptions": + """Return a copy of the options. + + Returns: + ConsoleOptions: a copy of self. + """ + options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) + options.__dict__ = self.__dict__.copy() + return options + + def update( + self, + *, + width: Union[int, NoChange] = NO_CHANGE, + min_width: Union[int, NoChange] = NO_CHANGE, + max_width: Union[int, NoChange] = NO_CHANGE, + justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, + overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, + no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, + highlight: Union[Optional[bool], NoChange] = NO_CHANGE, + markup: Union[Optional[bool], NoChange] = NO_CHANGE, + height: Union[Optional[int], NoChange] = NO_CHANGE, + ) -> "ConsoleOptions": + """Update values, return a copy.""" + options = self.copy() + if not isinstance(width, NoChange): + options.min_width = options.max_width = max(0, width) + if not isinstance(min_width, NoChange): + options.min_width = min_width + if not isinstance(max_width, NoChange): + options.max_width = max_width + if not isinstance(justify, NoChange): + options.justify = justify + if not isinstance(overflow, NoChange): + options.overflow = overflow + if not isinstance(no_wrap, NoChange): + options.no_wrap = no_wrap + if not isinstance(highlight, NoChange): + options.highlight = highlight + if not isinstance(markup, NoChange): + options.markup = markup + if not isinstance(height, NoChange): + if height is not None: + options.max_height = height + options.height = None if height is None else max(0, height) + return options + + def update_width(self, width: int) -> "ConsoleOptions": + """Update just the width, return a copy. + + Args: + width (int): New width (sets both min_width and max_width) + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + return options + + def update_height(self, height: int) -> "ConsoleOptions": + """Update the height, and return a copy. + + Args: + height (int): New height + + Returns: + ~ConsoleOptions: New Console options instance. + """ + options = self.copy() + options.max_height = options.height = height + return options + + def reset_height(self) -> "ConsoleOptions": + """Return a copy of the options with height set to ``None``. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.height = None + return options + + def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": + """Update the width and height, and return a copy. + + Args: + width (int): New width (sets both min_width and max_width). + height (int): New height. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + options.height = options.max_height = height + return options + + +@runtime_checkable +class RichCast(Protocol): + """An object that may be 'cast' to a console renderable.""" + + def __rich__( + self, + ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover + ... + + +@runtime_checkable +class ConsoleRenderable(Protocol): + """An object that supports the console protocol.""" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": # pragma: no cover + ... + + +# A type that may be rendered by Console. +RenderableType = Union[ConsoleRenderable, RichCast, str] + +# The result of calling a __rich_console__ method. +RenderResult = Iterable[Union[RenderableType, Segment]] + +_null_highlighter = NullHighlighter() + + +class CaptureError(Exception): + """An error in the Capture context manager.""" + + +class NewLine: + """A renderable to generate new line(s)""" + + def __init__(self, count: int = 1) -> None: + self.count = count + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> Iterable[Segment]: + yield Segment("\n" * self.count) + + +class ScreenUpdate: + """Render a list of lines at a given offset.""" + + def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: + self._lines = lines + self.x = x + self.y = y + + def __rich_console__( + self, console: "Console", options: ConsoleOptions + ) -> RenderResult: + x = self.x + move_to = Control.move_to + for offset, line in enumerate(self._lines, self.y): + yield move_to(x, offset) + yield from line + + +class Capture: + """Context manager to capture the result of printing to the console. + See :meth:`~rich.console.Console.capture` for how to use. + + Args: + console (Console): A console instance to capture output. + """ + + def __init__(self, console: "Console") -> None: + self._console = console + self._result: Optional[str] = None + + def __enter__(self) -> "Capture": + self._console.begin_capture() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self._result = self._console.end_capture() + + def get(self) -> str: + """Get the result of the capture.""" + if self._result is None: + raise CaptureError( + "Capture result is not available until context manager exits." + ) + return self._result + + +class ThemeContext: + """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" + + def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: + self.console = console + self.theme = theme + self.inherit = inherit + + def __enter__(self) -> "ThemeContext": + self.console.push_theme(self.theme) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.console.pop_theme() + + +class PagerContext: + """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage.""" + + def __init__( + self, + console: "Console", + pager: Optional[Pager] = None, + styles: bool = False, + links: bool = False, + ) -> None: + self._console = console + self.pager = SystemPager() if pager is None else pager + self.styles = styles + self.links = links + + def __enter__(self) -> "PagerContext": + self._console._enter_buffer() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if exc_type is None: + with self._console._lock: + buffer: List[Segment] = self._console._buffer[:] + del self._console._buffer[:] + segments: Iterable[Segment] = buffer + if not self.styles: + segments = Segment.strip_styles(segments) + elif not self.links: + segments = Segment.strip_links(segments) + content = self._console._render_buffer(segments) + self.pager.show(content) + self._console._exit_buffer() + + +class ScreenContext: + """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" + + def __init__( + self, console: "Console", hide_cursor: bool, style: StyleType = "" + ) -> None: + self.console = console + self.hide_cursor = hide_cursor + self.screen = Screen(style=style) + self._changed = False + + def update( + self, *renderables: RenderableType, style: Optional[StyleType] = None + ) -> None: + """Update the screen. + + Args: + renderable (RenderableType, optional): Optional renderable to replace current renderable, + or None for no change. Defaults to None. + style: (Style, optional): Replacement style, or None for no change. Defaults to None. + """ + if renderables: + self.screen.renderable = ( + Group(*renderables) if len(renderables) > 1 else renderables[0] + ) + if style is not None: + self.screen.style = style + self.console.print(self.screen, end="") + + def __enter__(self) -> "ScreenContext": + self._changed = self.console.set_alt_screen(True) + if self._changed and self.hide_cursor: + self.console.show_cursor(False) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if self._changed: + self.console.set_alt_screen(False) + if self.hide_cursor: + self.console.show_cursor(True) + + +class Group: + """Takes a group of renderables and returns a renderable object that renders the group. + + Args: + renderables (Iterable[RenderableType]): An iterable of renderable objects. + fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. + """ + + def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None: + self._renderables = renderables + self.fit = fit + self._render: Optional[List[RenderableType]] = None + + @property + def renderables(self) -> List["RenderableType"]: + if self._render is None: + self._render = list(self._renderables) + return self._render + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + if self.fit: + return measure_renderables(console, options, self.renderables) + else: + return Measurement(options.max_width, options.max_width) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> RenderResult: + yield from self.renderables + + +def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: + """A decorator that turns an iterable of renderables in to a group. + + Args: + fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. + """ + + def decorator( + method: Callable[..., Iterable[RenderableType]] + ) -> Callable[..., Group]: + """Convert a method that returns an iterable of renderables in to a Group.""" + + @wraps(method) + def _replace(*args: Any, **kwargs: Any) -> Group: + renderables = method(*args, **kwargs) + return Group(*renderables, fit=fit) + + return _replace + + return decorator + + +def _is_jupyter() -> bool: # pragma: no cover + """Check if we're running in a Jupyter notebook.""" + try: + get_ipython # type: ignore[name-defined] + except NameError: + return False + ipython = get_ipython() # type: ignore[name-defined] + shell = ipython.__class__.__name__ + if ( + "google.colab" in str(ipython.__class__) + or os.getenv("DATABRICKS_RUNTIME_VERSION") + or shell == "ZMQInteractiveShell" + ): + return True # Jupyter notebook or qtconsole + elif shell == "TerminalInteractiveShell": + return False # Terminal running IPython + else: + return False # Other type (?) + + +COLOR_SYSTEMS = { + "standard": ColorSystem.STANDARD, + "256": ColorSystem.EIGHT_BIT, + "truecolor": ColorSystem.TRUECOLOR, + "windows": ColorSystem.WINDOWS, +} + +_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} + + +@dataclass +class ConsoleThreadLocals(threading.local): + """Thread local values for Console context.""" + + theme_stack: ThemeStack + buffer: List[Segment] = field(default_factory=list) + buffer_index: int = 0 + + +class RenderHook(ABC): + """Provides hooks in to the render process.""" + + @abstractmethod + def process_renderables( + self, renderables: List[ConsoleRenderable] + ) -> List[ConsoleRenderable]: + """Called with a list of objects to render. + + This method can return a new list of renderables, or modify and return the same list. + + Args: + renderables (List[ConsoleRenderable]): A number of renderable objects. + + Returns: + List[ConsoleRenderable]: A replacement list of renderables. + """ + + +_windows_console_features: Optional["WindowsConsoleFeatures"] = None + + +def get_windows_console_features() -> "WindowsConsoleFeatures": # pragma: no cover + global _windows_console_features + if _windows_console_features is not None: + return _windows_console_features + from ._windows import get_windows_console_features + + _windows_console_features = get_windows_console_features() + return _windows_console_features + + +def detect_legacy_windows() -> bool: + """Detect legacy Windows.""" + return WINDOWS and not get_windows_console_features().vt + + +class Console: + """A high level console interface. + + Args: + color_system (str, optional): The color system supported by your terminal, + either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. + force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. + force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. + force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. + soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. + theme (Theme, optional): An optional style theme object, or ``None`` for default theme. + stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. + file (IO, optional): A file object where the console should write to. Defaults to stdout. + quiet (bool, Optional): Boolean to suppress all output. Defaults to False. + width (int, optional): The width of the terminal. Leave as default to auto-detect width. + height (int, optional): The height of the terminal. Leave as default to auto-detect height. + style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. + no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. + tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. + record (bool, optional): Boolean to enable recording of terminal output, + required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. + markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. + emoji (bool, optional): Enable emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. + highlight (bool, optional): Enable automatic highlighting. Defaults to True. + log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. + log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. + log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". + highlighter (HighlighterType, optional): Default highlighter. + legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. + safe_box (bool, optional): Restrict box options that don't render on legacy Windows. + get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log), + or None for datetime.now. + get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. + """ + + _environ: Mapping[str, str] = os.environ + + def __init__( + self, + *, + color_system: Optional[ + Literal["auto", "standard", "256", "truecolor", "windows"] + ] = "auto", + force_terminal: Optional[bool] = None, + force_jupyter: Optional[bool] = None, + force_interactive: Optional[bool] = None, + soft_wrap: bool = False, + theme: Optional[Theme] = None, + stderr: bool = False, + file: Optional[IO[str]] = None, + quiet: bool = False, + width: Optional[int] = None, + height: Optional[int] = None, + style: Optional[StyleType] = None, + no_color: Optional[bool] = None, + tab_size: int = 8, + record: bool = False, + markup: bool = True, + emoji: bool = True, + emoji_variant: Optional[EmojiVariant] = None, + highlight: bool = True, + log_time: bool = True, + log_path: bool = True, + log_time_format: Union[str, FormatTimeCallable] = "[%X]", + highlighter: Optional["HighlighterType"] = ReprHighlighter(), + legacy_windows: Optional[bool] = None, + safe_box: bool = True, + get_datetime: Optional[Callable[[], datetime]] = None, + get_time: Optional[Callable[[], float]] = None, + _environ: Optional[Mapping[str, str]] = None, + ): + # Copy of os.environ allows us to replace it for testing + if _environ is not None: + self._environ = _environ + + self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter + if self.is_jupyter: + if width is None: + jupyter_columns = self._environ.get("JUPYTER_COLUMNS") + if jupyter_columns is not None and jupyter_columns.isdigit(): + width = int(jupyter_columns) + else: + width = JUPYTER_DEFAULT_COLUMNS + if height is None: + jupyter_lines = self._environ.get("JUPYTER_LINES") + if jupyter_lines is not None and jupyter_lines.isdigit(): + height = int(jupyter_lines) + else: + height = JUPYTER_DEFAULT_LINES + + self.tab_size = tab_size + self.record = record + self._markup = markup + self._emoji = emoji + self._emoji_variant: Optional[EmojiVariant] = emoji_variant + self._highlight = highlight + self.legacy_windows: bool = ( + (detect_legacy_windows() and not self.is_jupyter) + if legacy_windows is None + else legacy_windows + ) + + if width is None: + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) - self.legacy_windows + if height is None: + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + self.soft_wrap = soft_wrap + self._width = width + self._height = height + + self._color_system: Optional[ColorSystem] + + self._force_terminal = None + if force_terminal is not None: + self._force_terminal = force_terminal + + self._file = file + self.quiet = quiet + self.stderr = stderr + + if color_system is None: + self._color_system = None + elif color_system == "auto": + self._color_system = self._detect_color_system() + else: + self._color_system = COLOR_SYSTEMS[color_system] + + self._lock = threading.RLock() + self._log_render = LogRender( + show_time=log_time, + show_path=log_path, + time_format=log_time_format, + ) + self.highlighter: HighlighterType = highlighter or _null_highlighter + self.safe_box = safe_box + self.get_datetime = get_datetime or datetime.now + self.get_time = get_time or monotonic + self.style = style + self.no_color = ( + no_color if no_color is not None else "NO_COLOR" in self._environ + ) + self.is_interactive = ( + (self.is_terminal and not self.is_dumb_terminal) + if force_interactive is None + else force_interactive + ) + + self._record_buffer_lock = threading.RLock() + self._thread_locals = ConsoleThreadLocals( + theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme) + ) + self._record_buffer: List[Segment] = [] + self._render_hooks: List[RenderHook] = [] + self._live: Optional["Live"] = None + self._is_alt_screen = False + + def __repr__(self) -> str: + return f"" + + @property + def file(self) -> IO[str]: + """Get the file object to write to.""" + file = self._file or (sys.stderr if self.stderr else sys.stdout) + file = getattr(file, "rich_proxied_file", file) + if file is None: + file = NULL_FILE + return file + + @file.setter + def file(self, new_file: IO[str]) -> None: + """Set a new file object.""" + self._file = new_file + + @property + def _buffer(self) -> List[Segment]: + """Get a thread local buffer.""" + return self._thread_locals.buffer + + @property + def _buffer_index(self) -> int: + """Get a thread local buffer.""" + return self._thread_locals.buffer_index + + @_buffer_index.setter + def _buffer_index(self, value: int) -> None: + self._thread_locals.buffer_index = value + + @property + def _theme_stack(self) -> ThemeStack: + """Get the thread local theme stack.""" + return self._thread_locals.theme_stack + + def _detect_color_system(self) -> Optional[ColorSystem]: + """Detect color system from env vars.""" + if self.is_jupyter: + return ColorSystem.TRUECOLOR + if not self.is_terminal or self.is_dumb_terminal: + return None + if WINDOWS: # pragma: no cover + if self.legacy_windows: # pragma: no cover + return ColorSystem.WINDOWS + windows_console_features = get_windows_console_features() + return ( + ColorSystem.TRUECOLOR + if windows_console_features.truecolor + else ColorSystem.EIGHT_BIT + ) + else: + color_term = self._environ.get("COLORTERM", "").strip().lower() + if color_term in ("truecolor", "24bit"): + return ColorSystem.TRUECOLOR + term = self._environ.get("TERM", "").strip().lower() + _term_name, _hyphen, colors = term.rpartition("-") + color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) + return color_system + + def _enter_buffer(self) -> None: + """Enter in to a buffer context, and buffer all output.""" + self._buffer_index += 1 + + def _exit_buffer(self) -> None: + """Leave buffer context, and render content if required.""" + self._buffer_index -= 1 + self._check_buffer() + + def set_live(self, live: "Live") -> None: + """Set Live instance. Used by Live context manager. + + Args: + live (Live): Live instance using this Console. + + Raises: + errors.LiveError: If this Console has a Live context currently active. + """ + with self._lock: + if self._live is not None: + raise errors.LiveError("Only one live display may be active at once") + self._live = live + + def clear_live(self) -> None: + """Clear the Live instance.""" + with self._lock: + self._live = None + + def push_render_hook(self, hook: RenderHook) -> None: + """Add a new render hook to the stack. + + Args: + hook (RenderHook): Render hook instance. + """ + with self._lock: + self._render_hooks.append(hook) + + def pop_render_hook(self) -> None: + """Pop the last renderhook from the stack.""" + with self._lock: + self._render_hooks.pop() + + def __enter__(self) -> "Console": + """Own context manager to enter buffer context.""" + self._enter_buffer() + return self + + def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: + """Exit buffer context.""" + self._exit_buffer() + + def begin_capture(self) -> None: + """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output.""" + self._enter_buffer() + + def end_capture(self) -> str: + """End capture mode and return captured string. + + Returns: + str: Console output. + """ + render_result = self._render_buffer(self._buffer) + del self._buffer[:] + self._exit_buffer() + return render_result + + def push_theme(self, theme: Theme, *, inherit: bool = True) -> None: + """Push a new theme on to the top of the stack, replacing the styles from the previous theme. + Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather + than calling this method directly. + + Args: + theme (Theme): A theme instance. + inherit (bool, optional): Inherit existing styles. Defaults to True. + """ + self._theme_stack.push_theme(theme, inherit=inherit) + + def pop_theme(self) -> None: + """Remove theme from top of stack, restoring previous theme.""" + self._theme_stack.pop_theme() + + def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext: + """Use a different theme for the duration of the context manager. + + Args: + theme (Theme): Theme instance to user. + inherit (bool, optional): Inherit existing console styles. Defaults to True. + + Returns: + ThemeContext: [description] + """ + return ThemeContext(self, theme, inherit) + + @property + def color_system(self) -> Optional[str]: + """Get color system string. + + Returns: + Optional[str]: "standard", "256" or "truecolor". + """ + + if self._color_system is not None: + return _COLOR_SYSTEMS_NAMES[self._color_system] + else: + return None + + @property + def encoding(self) -> str: + """Get the encoding of the console file, e.g. ``"utf-8"``. + + Returns: + str: A standard encoding string. + """ + return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower() + + @property + def is_terminal(self) -> bool: + """Check if the console is writing to a terminal. + + Returns: + bool: True if the console writing to a device capable of + understanding terminal codes, otherwise False. + """ + if self._force_terminal is not None: + return self._force_terminal + + if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( + "idlelib" + ): + # Return False for Idle which claims to be a tty but can't handle ansi codes + return False + + if self.is_jupyter: + # return False for Jupyter, which may have FORCE_COLOR set + return False + + # If FORCE_COLOR env var has any value at all, we assume a terminal. + force_color = self._environ.get("FORCE_COLOR") + if force_color is not None: + self._force_terminal = True + return True + + isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) + try: + return False if isatty is None else isatty() + except ValueError: + # in some situation (at the end of a pytest run for example) isatty() can raise + # ValueError: I/O operation on closed file + # return False because we aren't in a terminal anymore + return False + + @property + def is_dumb_terminal(self) -> bool: + """Detect dumb terminal. + + Returns: + bool: True if writing to a dumb terminal, otherwise False. + + """ + _term = self._environ.get("TERM", "") + is_dumb = _term.lower() in ("dumb", "unknown") + return self.is_terminal and is_dumb + + @property + def options(self) -> ConsoleOptions: + """Get default console options.""" + return ConsoleOptions( + max_height=self.size.height, + size=self.size, + legacy_windows=self.legacy_windows, + min_width=1, + max_width=self.width, + encoding=self.encoding, + is_terminal=self.is_terminal, + ) + + @property + def size(self) -> ConsoleDimensions: + """Get the size of the console. + + Returns: + ConsoleDimensions: A named tuple containing the dimensions. + """ + + if self._width is not None and self._height is not None: + return ConsoleDimensions(self._width - self.legacy_windows, self._height) + + if self.is_dumb_terminal: + return ConsoleDimensions(80, 25) + + width: Optional[int] = None + height: Optional[int] = None + + if WINDOWS: # pragma: no cover + try: + width, height = os.get_terminal_size() + except (AttributeError, ValueError, OSError): # Probably not a terminal + pass + else: + for file_descriptor in _STD_STREAMS: + try: + width, height = os.get_terminal_size(file_descriptor) + except (AttributeError, ValueError, OSError): + pass + else: + break + + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + # get_terminal_size can report 0, 0 if run from pseudo-terminal + width = width or 80 + height = height or 25 + return ConsoleDimensions( + width - self.legacy_windows if self._width is None else self._width, + height if self._height is None else self._height, + ) + + @size.setter + def size(self, new_size: Tuple[int, int]) -> None: + """Set a new size for the terminal. + + Args: + new_size (Tuple[int, int]): New width and height. + """ + width, height = new_size + self._width = width + self._height = height + + @property + def width(self) -> int: + """Get the width of the console. + + Returns: + int: The width (in characters) of the console. + """ + return self.size.width + + @width.setter + def width(self, width: int) -> None: + """Set width. + + Args: + width (int): New width. + """ + self._width = width + + @property + def height(self) -> int: + """Get the height of the console. + + Returns: + int: The height (in lines) of the console. + """ + return self.size.height + + @height.setter + def height(self, height: int) -> None: + """Set height. + + Args: + height (int): new height. + """ + self._height = height + + def bell(self) -> None: + """Play a 'bell' sound (if supported by the terminal).""" + self.control(Control.bell()) + + def capture(self) -> Capture: + """A context manager to *capture* the result of print() or log() in a string, + rather than writing it to the console. + + Example: + >>> from rich.console import Console + >>> console = Console() + >>> with console.capture() as capture: + ... console.print("[bold magenta]Hello World[/]") + >>> print(capture.get()) + + Returns: + Capture: Context manager with disables writing to the terminal. + """ + capture = Capture(self) + return capture + + def pager( + self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False + ) -> PagerContext: + """A context manager to display anything printed within a "pager". The pager application + is defined by the system and will typically support at least pressing a key to scroll. + + Args: + pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. + styles (bool, optional): Show styles in pager. Defaults to False. + links (bool, optional): Show links in pager. Defaults to False. + + Example: + >>> from rich.console import Console + >>> from rich.__main__ import make_test_card + >>> console = Console() + >>> with console.pager(): + console.print(make_test_card()) + + Returns: + PagerContext: A context manager. + """ + return PagerContext(self, pager=pager, styles=styles, links=links) + + def line(self, count: int = 1) -> None: + """Write new line(s). + + Args: + count (int, optional): Number of new lines. Defaults to 1. + """ + + assert count >= 0, "count must be >= 0" + self.print(NewLine(count)) + + def clear(self, home: bool = True) -> None: + """Clear the screen. + + Args: + home (bool, optional): Also move the cursor to 'home' position. Defaults to True. + """ + if home: + self.control(Control.clear(), Control.home()) + else: + self.control(Control.clear()) + + def status( + self, + status: RenderableType, + *, + spinner: str = "dots", + spinner_style: StyleType = "status.spinner", + speed: float = 1.0, + refresh_per_second: float = 12.5, + ) -> "Status": + """Display a status and spinner. + + Args: + status (RenderableType): A status renderable (str or Text typically). + spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". + spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". + speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. + refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. + + Returns: + Status: A Status object that may be used as a context manager. + """ + from .status import Status + + status_renderable = Status( + status, + console=self, + spinner=spinner, + spinner_style=spinner_style, + speed=speed, + refresh_per_second=refresh_per_second, + ) + return status_renderable + + def show_cursor(self, show: bool = True) -> bool: + """Show or hide the cursor. + + Args: + show (bool, optional): Set visibility of the cursor. + """ + if self.is_terminal: + self.control(Control.show_cursor(show)) + return True + return False + + def set_alt_screen(self, enable: bool = True) -> bool: + """Enables alternative screen mode. + + Note, if you enable this mode, you should ensure that is disabled before + the application exits. See :meth:`~rich.Console.screen` for a context manager + that handles this for you. + + Args: + enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. + + Returns: + bool: True if the control codes were written. + + """ + changed = False + if self.is_terminal and not self.legacy_windows: + self.control(Control.alt_screen(enable)) + changed = True + self._is_alt_screen = enable + return changed + + @property + def is_alt_screen(self) -> bool: + """Check if the alt screen was enabled. + + Returns: + bool: True if the alt screen was enabled, otherwise False. + """ + return self._is_alt_screen + + def set_window_title(self, title: str) -> bool: + """Set the title of the console terminal window. + + Warning: There is no means within Rich of "resetting" the window title to its + previous value, meaning the title you set will persist even after your application + exits. + + ``fish`` shell resets the window title before and after each command by default, + negating this issue. Windows Terminal and command prompt will also reset the title for you. + Most other shells and terminals, however, do not do this. + + Some terminals may require configuration changes before you can set the title. + Some terminals may not support setting the title at all. + + Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) + may also set the terminal window title. This could result in whatever value you write + using this method being overwritten. + + Args: + title (str): The new title of the terminal window. + + Returns: + bool: True if the control code to change the terminal title was + written, otherwise False. Note that a return value of True + does not guarantee that the window title has actually changed, + since the feature may be unsupported/disabled in some terminals. + """ + if self.is_terminal: + self.control(Control.title(title)) + return True + return False + + def screen( + self, hide_cursor: bool = True, style: Optional[StyleType] = None + ) -> "ScreenContext": + """Context manager to enable and disable 'alternative screen' mode. + + Args: + hide_cursor (bool, optional): Also hide the cursor. Defaults to False. + style (Style, optional): Optional style for screen. Defaults to None. + + Returns: + ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. + """ + return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") + + def measure( + self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None + ) -> Measurement: + """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains + information regarding the number of characters required to print the renderable. + + Args: + renderable (RenderableType): Any renderable or string. + options (Optional[ConsoleOptions], optional): Options to use when measuring, or None + to use default options. Defaults to None. + + Returns: + Measurement: A measurement of the renderable. + """ + measurement = Measurement.get(self, options or self.options, renderable) + return measurement + + def render( + self, renderable: RenderableType, options: Optional[ConsoleOptions] = None + ) -> Iterable[Segment]: + """Render an object in to an iterable of `Segment` instances. + + This method contains the logic for rendering objects with the console protocol. + You are unlikely to need to use it directly, unless you are extending the library. + + Args: + renderable (RenderableType): An object supporting the console protocol, or + an object that may be converted to a string. + options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None. + + Returns: + Iterable[Segment]: An iterable of segments that may be rendered. + """ + + _options = options or self.options + if _options.max_width < 1: + # No space to render anything. This prevents potential recursion errors. + return + render_iterable: RenderResult + + renderable = rich_cast(renderable) + if hasattr(renderable, "__rich_console__") and not isclass(renderable): + render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] + elif isinstance(renderable, str): + text_renderable = self.render_str( + renderable, highlight=_options.highlight, markup=_options.markup + ) + render_iterable = text_renderable.__rich_console__(self, _options) + else: + raise errors.NotRenderableError( + f"Unable to render {renderable!r}; " + "A str, Segment or object with __rich_console__ method is required" + ) + + try: + iter_render = iter(render_iterable) + except TypeError: + raise errors.NotRenderableError( + f"object {render_iterable!r} is not renderable" + ) + _Segment = Segment + _options = _options.reset_height() + for render_output in iter_render: + if isinstance(render_output, _Segment): + yield render_output + else: + yield from self.render(render_output, _options) + + def render_lines( + self, + renderable: RenderableType, + options: Optional[ConsoleOptions] = None, + *, + style: Optional[Style] = None, + pad: bool = True, + new_lines: bool = False, + ) -> List[List[Segment]]: + """Render objects in to a list of lines. + + The output of render_lines is useful when further formatting of rendered console text + is required, such as the Panel class which draws a border around any renderable object. + + Args: + renderable (RenderableType): Any object renderable in the console. + options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. + style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. + pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. + new_lines (bool, optional): Include "\n" characters at end of lines. + + Returns: + List[List[Segment]]: A list of lines, where a line is a list of Segment objects. + """ + with self._lock: + render_options = options or self.options + _rendered = self.render(renderable, render_options) + if style: + _rendered = Segment.apply_style(_rendered, style) + + render_height = render_options.height + if render_height is not None: + render_height = max(0, render_height) + + lines = list( + islice( + Segment.split_and_crop_lines( + _rendered, + render_options.max_width, + include_new_lines=new_lines, + pad=pad, + style=style, + ), + None, + render_height, + ) + ) + if render_options.height is not None: + extra_lines = render_options.height - len(lines) + if extra_lines > 0: + pad_line = [ + [Segment(" " * render_options.max_width, style), Segment("\n")] + if new_lines + else [Segment(" " * render_options.max_width, style)] + ] + lines.extend(pad_line * extra_lines) + + return lines + + def render_str( + self, + text: str, + *, + style: Union[str, Style] = "", + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + highlighter: Optional[HighlighterType] = None, + ) -> "Text": + """Convert a string to a Text instance. This is called automatically if + you print or log a string. + + Args: + text (str): Text to render. + style (Union[str, Style], optional): Style to apply to rendered text. + justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``. + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. + markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. + highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. + highlighter (HighlighterType, optional): Optional highlighter to apply. + Returns: + ConsoleRenderable: Renderable object. + + """ + emoji_enabled = emoji or (emoji is None and self._emoji) + markup_enabled = markup or (markup is None and self._markup) + highlight_enabled = highlight or (highlight is None and self._highlight) + + if markup_enabled: + rich_text = render_markup( + text, + style=style, + emoji=emoji_enabled, + emoji_variant=self._emoji_variant, + ) + rich_text.justify = justify + rich_text.overflow = overflow + else: + rich_text = Text( + _emoji_replace(text, default_variant=self._emoji_variant) + if emoji_enabled + else text, + justify=justify, + overflow=overflow, + style=style, + ) + + _highlighter = (highlighter or self.highlighter) if highlight_enabled else None + if _highlighter is not None: + highlight_text = _highlighter(str(rich_text)) + highlight_text.copy_styles(rich_text) + return highlight_text + + return rich_text + + def get_style( + self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None + ) -> Style: + """Get a Style instance by its theme name or parse a definition. + + Args: + name (str): The name of a style or a style definition. + + Returns: + Style: A Style object. + + Raises: + MissingStyle: If no style could be parsed from name. + + """ + if isinstance(name, Style): + return name + + try: + style = self._theme_stack.get(name) + if style is None: + style = Style.parse(name) + return style.copy() if style.link else style + except errors.StyleSyntaxError as error: + if default is not None: + return self.get_style(default) + raise errors.MissingStyle( + f"Failed to get style {name!r}; {error}" + ) from None + + def _collect_renderables( + self, + objects: Iterable[Any], + sep: str, + end: str, + *, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + ) -> List[ConsoleRenderable]: + """Combine a number of renderables and text into one renderable. + + Args: + objects (Iterable[Any]): Anything that Rich can render. + sep (str): String to write between print data. + end (str): String to write at end of print data. + justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. + + Returns: + List[ConsoleRenderable]: A list of things to render. + """ + renderables: List[ConsoleRenderable] = [] + _append = renderables.append + text: List[Text] = [] + append_text = text.append + + append = _append + if justify in ("left", "center", "right"): + + def align_append(renderable: RenderableType) -> None: + _append(Align(renderable, cast(AlignMethod, justify))) + + append = align_append + + _highlighter: HighlighterType = _null_highlighter + if highlight or (highlight is None and self._highlight): + _highlighter = self.highlighter + + def check_text() -> None: + if text: + sep_text = Text(sep, justify=justify, end=end) + append(sep_text.join(text)) + text.clear() + + for renderable in objects: + renderable = rich_cast(renderable) + if isinstance(renderable, str): + append_text( + self.render_str( + renderable, emoji=emoji, markup=markup, highlighter=_highlighter + ) + ) + elif isinstance(renderable, Text): + append_text(renderable) + elif isinstance(renderable, ConsoleRenderable): + check_text() + append(renderable) + elif is_expandable(renderable): + check_text() + append(Pretty(renderable, highlighter=_highlighter)) + else: + append_text(_highlighter(str(renderable))) + + check_text() + + if self.style is not None: + style = self.get_style(self.style) + renderables = [Styled(renderable, style) for renderable in renderables] + + return renderables + + def rule( + self, + title: TextType = "", + *, + characters: str = "─", + style: Union[str, Style] = "rule.line", + align: AlignMethod = "center", + ) -> None: + """Draw a line with optional centered title. + + Args: + title (str, optional): Text to render over the rule. Defaults to "". + characters (str, optional): Character(s) to form the line. Defaults to "─". + style (str, optional): Style of line. Defaults to "rule.line". + align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". + """ + from .rule import Rule + + rule = Rule(title=title, characters=characters, style=style, align=align) + self.print(rule) + + def control(self, *control: Control) -> None: + """Insert non-printing control codes. + + Args: + control_codes (str): Control codes, such as those that may move the cursor. + """ + if not self.is_dumb_terminal: + with self: + self._buffer.extend(_control.segment for _control in control) + + def out( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + highlight: Optional[bool] = None, + ) -> None: + """Output to the terminal. This is a low-level way of writing to the terminal which unlike + :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will + optionally apply highlighting and a basic style. + + Args: + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use + console default. Defaults to ``None``. + """ + raw_output: str = sep.join(str(_object) for _object in objects) + self.print( + raw_output, + style=style, + highlight=highlight, + emoji=False, + markup=False, + no_wrap=True, + overflow="ignore", + crop=False, + end=end, + ) + + def print( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + no_wrap: Optional[bool] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + width: Optional[int] = None, + height: Optional[int] = None, + crop: bool = True, + soft_wrap: Optional[bool] = None, + new_line_start: bool = False, + ) -> None: + """Print to the console. + + Args: + objects (positional args): Objects to log to the terminal. + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. + overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. + no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. + width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. + crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. + soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for + Console default. Defaults to ``None``. + new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. + """ + if not objects: + objects = (NewLine(),) + + if soft_wrap is None: + soft_wrap = self.soft_wrap + if soft_wrap: + if no_wrap is None: + no_wrap = True + if overflow is None: + overflow = "ignore" + crop = False + render_hooks = self._render_hooks[:] + with self: + renderables = self._collect_renderables( + objects, + sep, + end, + justify=justify, + emoji=emoji, + markup=markup, + highlight=highlight, + ) + for hook in render_hooks: + renderables = hook.process_renderables(renderables) + render_options = self.options.update( + justify=justify, + overflow=overflow, + width=min(width, self.width) if width is not None else NO_CHANGE, + height=height, + no_wrap=no_wrap, + markup=markup, + highlight=highlight, + ) + + new_segments: List[Segment] = [] + extend = new_segments.extend + render = self.render + if style is None: + for renderable in renderables: + extend(render(renderable, render_options)) + else: + for renderable in renderables: + extend( + Segment.apply_style( + render(renderable, render_options), self.get_style(style) + ) + ) + if new_line_start: + if ( + len("".join(segment.text for segment in new_segments).splitlines()) + > 1 + ): + new_segments.insert(0, Segment.line()) + if crop: + buffer_extend = self._buffer.extend + for line in Segment.split_and_crop_lines( + new_segments, self.width, pad=False + ): + buffer_extend(line) + else: + self._buffer.extend(new_segments) + + def print_json( + self, + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = False, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, + ) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (Optional[str]): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + from pip._vendor.rich.json import JSON + + if json is None: + json_renderable = JSON.from_data( + data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + else: + if not isinstance(json, str): + raise TypeError( + f"json must be str. Did you mean print_json(data={json!r}) ?" + ) + json_renderable = JSON( + json, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + self.print(json_renderable, soft_wrap=True) + + def update_screen( + self, + renderable: RenderableType, + *, + region: Optional[Region] = None, + options: Optional[ConsoleOptions] = None, + ) -> None: + """Update the screen at a given offset. + + Args: + renderable (RenderableType): A Rich renderable. + region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. + x (int, optional): x offset. Defaults to 0. + y (int, optional): y offset. Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + render_options = options or self.options + if region is None: + x = y = 0 + render_options = render_options.update_dimensions( + render_options.max_width, render_options.height or self.height + ) + else: + x, y, width, height = region + render_options = render_options.update_dimensions(width, height) + + lines = self.render_lines(renderable, options=render_options) + self.update_screen_lines(lines, x, y) + + def update_screen_lines( + self, lines: List[List[Segment]], x: int = 0, y: int = 0 + ) -> None: + """Update lines of the screen at a given offset. + + Args: + lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). + x (int, optional): x offset (column no). Defaults to 0. + y (int, optional): y offset (column no). Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + screen_update = ScreenUpdate(lines, x, y) + segments = self.render(screen_update) + self._buffer.extend(segments) + self._check_buffer() + + def print_exception( + self, + *, + width: Optional[int] = 100, + extra_lines: int = 3, + theme: Optional[str] = None, + word_wrap: bool = False, + show_locals: bool = False, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, + ) -> None: + """Prints a rich render of the last exception and traceback. + + Args: + width (Optional[int], optional): Number of characters used to render code. Defaults to 100. + extra_lines (int, optional): Additional lines of code to render. Defaults to 3. + theme (str, optional): Override pygments theme used in traceback + word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. + show_locals (bool, optional): Enable display of local variables. Defaults to False. + suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. + """ + from .traceback import Traceback + + traceback = Traceback( + width=width, + extra_lines=extra_lines, + theme=theme, + word_wrap=word_wrap, + show_locals=show_locals, + suppress=suppress, + max_frames=max_frames, + ) + self.print(traceback) + + @staticmethod + def _caller_frame_info( + offset: int, + currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, + ) -> Tuple[str, int, Dict[str, Any]]: + """Get caller frame information. + + Args: + offset (int): the caller offset within the current frame stack. + currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to + retrieve the current frame. Defaults to ``inspect.currentframe``. + + Returns: + Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and + the dictionary of local variables associated with the caller frame. + + Raises: + RuntimeError: If the stack offset is invalid. + """ + # Ignore the frame of this local helper + offset += 1 + + frame = currentframe() + if frame is not None: + # Use the faster currentframe where implemented + while offset and frame is not None: + frame = frame.f_back + offset -= 1 + assert frame is not None + return frame.f_code.co_filename, frame.f_lineno, frame.f_locals + else: + # Fallback to the slower stack + frame_info = inspect.stack()[offset] + return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals + + def log( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + log_locals: bool = False, + _stack_offset: int = 1, + ) -> None: + """Log rich content to the terminal. + + Args: + objects (positional args): Objects to log to the terminal. + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. + log_locals (bool, optional): Boolean to enable logging of locals where ``log()`` + was called. Defaults to False. + _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. + """ + if not objects: + objects = (NewLine(),) + + render_hooks = self._render_hooks[:] + + with self: + renderables = self._collect_renderables( + objects, + sep, + end, + justify=justify, + emoji=emoji, + markup=markup, + highlight=highlight, + ) + if style is not None: + renderables = [Styled(renderable, style) for renderable in renderables] + + filename, line_no, locals = self._caller_frame_info(_stack_offset) + link_path = None if filename.startswith("<") else os.path.abspath(filename) + path = filename.rpartition(os.sep)[-1] + if log_locals: + locals_map = { + key: value + for key, value in locals.items() + if not key.startswith("__") + } + renderables.append(render_scope(locals_map, title="[i]locals")) + + renderables = [ + self._log_render( + self, + renderables, + log_time=self.get_datetime(), + path=path, + line_no=line_no, + link_path=link_path, + ) + ] + for hook in render_hooks: + renderables = hook.process_renderables(renderables) + new_segments: List[Segment] = [] + extend = new_segments.extend + render = self.render + render_options = self.options + for renderable in renderables: + extend(render(renderable, render_options)) + buffer_extend = self._buffer.extend + for line in Segment.split_and_crop_lines( + new_segments, self.width, pad=False + ): + buffer_extend(line) + + def _check_buffer(self) -> None: + """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) + Rendering is supported on Windows, Unix and Jupyter environments. For + legacy Windows consoles, the win32 API is called directly. + This method will also record what it renders if recording is enabled via Console.record. + """ + if self.quiet: + del self._buffer[:] + return + with self._lock: + if self.record: + with self._record_buffer_lock: + self._record_buffer.extend(self._buffer[:]) + + if self._buffer_index == 0: + if self.is_jupyter: # pragma: no cover + from .jupyter import display + + display(self._buffer, self._render_buffer(self._buffer[:])) + del self._buffer[:] + else: + if WINDOWS: + use_legacy_windows_render = False + if self.legacy_windows: + fileno = get_fileno(self.file) + if fileno is not None: + use_legacy_windows_render = ( + fileno in _STD_STREAMS_OUTPUT + ) + + if use_legacy_windows_render: + from pip._vendor.rich._win32_console import LegacyWindowsTerm + from pip._vendor.rich._windows_renderer import legacy_windows_render + + buffer = self._buffer[:] + if self.no_color and self._color_system: + buffer = list(Segment.remove_color(buffer)) + + legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) + else: + # Either a non-std stream on legacy Windows, or modern Windows. + text = self._render_buffer(self._buffer[:]) + # https://bugs.python.org/issue37871 + # https://github.com/python/cpython/issues/82052 + # We need to avoid writing more than 32Kb in a single write, due to the above bug + write = self.file.write + # Worse case scenario, every character is 4 bytes of utf-8 + MAX_WRITE = 32 * 1024 // 4 + try: + if len(text) <= MAX_WRITE: + write(text) + else: + batch: List[str] = [] + batch_append = batch.append + size = 0 + for line in text.splitlines(True): + if size + len(line) > MAX_WRITE and batch: + write("".join(batch)) + batch.clear() + size = 0 + batch_append(line) + size += len(line) + if batch: + write("".join(batch)) + batch.clear() + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + else: + text = self._render_buffer(self._buffer[:]) + try: + self.file.write(text) + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + + self.file.flush() + del self._buffer[:] + + def _render_buffer(self, buffer: Iterable[Segment]) -> str: + """Render buffered output, and clear buffer.""" + output: List[str] = [] + append = output.append + color_system = self._color_system + legacy_windows = self.legacy_windows + not_terminal = not self.is_terminal + if self.no_color and color_system: + buffer = Segment.remove_color(buffer) + for text, style, control in buffer: + if style: + append( + style.render( + text, + color_system=color_system, + legacy_windows=legacy_windows, + ) + ) + elif not (not_terminal and control): + append(text) + + rendered = "".join(output) + return rendered + + def input( + self, + prompt: TextType = "", + *, + markup: bool = True, + emoji: bool = True, + password: bool = False, + stream: Optional[TextIO] = None, + ) -> str: + """Displays a prompt and waits for input from the user. The prompt may contain color / style. + + It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. + + Args: + prompt (Union[str, Text]): Text to render in the prompt. + markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. + emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True. + password: (bool, optional): Hide typed text. Defaults to False. + stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None. + + Returns: + str: Text read from stdin. + """ + if prompt: + self.print(prompt, markup=markup, emoji=emoji, end="") + if password: + result = getpass("", stream=stream) + else: + if stream: + result = stream.readline() + else: + result = input() + return result + + def export_text(self, *, clear: bool = True, styles: bool = False) -> str: + """Generate text from console contents (requires record=True argument in constructor). + + Args: + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text. + Defaults to ``False``. + + Returns: + str: String containing console contents. + + """ + assert ( + self.record + ), "To export console contents set record=True in the constructor or instance" + + with self._record_buffer_lock: + if styles: + text = "".join( + (style.render(text) if style else text) + for text, style, _ in self._record_buffer + ) + else: + text = "".join( + segment.text + for segment in self._record_buffer + if not segment.control + ) + if clear: + del self._record_buffer[:] + return text + + def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None: + """Generate text from console and save to a given location (requires record=True argument in constructor). + + Args: + path (str): Path to write text files. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text. + Defaults to ``False``. + + """ + text = self.export_text(clear=clear, styles=styles) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(text) + + def export_html( + self, + *, + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: Optional[str] = None, + inline_styles: bool = False, + ) -> str: + """Generate HTML from console contents (requires record=True argument in constructor). + + Args: + theme (TerminalTheme, optional): TerminalTheme object containing console colors. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. + inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files + larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. + Defaults to False. + + Returns: + str: String containing console contents as HTML. + """ + assert ( + self.record + ), "To export console contents set record=True in the constructor or instance" + fragments: List[str] = [] + append = fragments.append + _theme = theme or DEFAULT_TERMINAL_THEME + stylesheet = "" + + render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format + + with self._record_buffer_lock: + if inline_styles: + for text, style, _ in Segment.filter_control( + Segment.simplify(self._record_buffer) + ): + text = escape(text) + if style: + rule = style.get_html_style(_theme) + if style.link: + text = f'
      {text}' + text = f'{text}' if rule else text + append(text) + else: + styles: Dict[str, int] = {} + for text, style, _ in Segment.filter_control( + Segment.simplify(self._record_buffer) + ): + text = escape(text) + if style: + rule = style.get_html_style(_theme) + style_number = styles.setdefault(rule, len(styles) + 1) + if style.link: + text = f'{text}' + else: + text = f'{text}' + append(text) + stylesheet_rules: List[str] = [] + stylesheet_append = stylesheet_rules.append + for style_rule, style_number in styles.items(): + if style_rule: + stylesheet_append(f".r{style_number} {{{style_rule}}}") + stylesheet = "\n".join(stylesheet_rules) + + rendered_code = render_code_format.format( + code="".join(fragments), + stylesheet=stylesheet, + foreground=_theme.foreground_color.hex, + background=_theme.background_color.hex, + ) + if clear: + del self._record_buffer[:] + return rendered_code + + def save_html( + self, + path: str, + *, + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_HTML_FORMAT, + inline_styles: bool = False, + ) -> None: + """Generate HTML from console contents and write to a file (requires record=True argument in constructor). + + Args: + path (str): Path to write html file. + theme (TerminalTheme, optional): TerminalTheme object containing console colors. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. + inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files + larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. + Defaults to False. + + """ + html = self.export_html( + theme=theme, + clear=clear, + code_format=code_format, + inline_styles=inline_styles, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(html) + + def export_svg( + self, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, + ) -> str: + """ + Generate an SVG from the console contents (requires record=True in Console constructor). + + Args: + title (str, optional): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. + """ + + from pip._vendor.rich.cells import cell_len + + style_cache: Dict[Style, str] = {} + + def get_svg_style(style: Style) -> str: + """Convert a Style to CSS rules for SVG.""" + if style in style_cache: + return style_cache[style] + css_rules = [] + color = ( + _theme.foreground_color + if (style.color is None or style.color.is_default) + else style.color.get_truecolor(_theme) + ) + bgcolor = ( + _theme.background_color + if (style.bgcolor is None or style.bgcolor.is_default) + else style.bgcolor.get_truecolor(_theme) + ) + if style.reverse: + color, bgcolor = bgcolor, color + if style.dim: + color = blend_rgb(color, bgcolor, 0.4) + css_rules.append(f"fill: {color.hex}") + if style.bold: + css_rules.append("font-weight: bold") + if style.italic: + css_rules.append("font-style: italic;") + if style.underline: + css_rules.append("text-decoration: underline;") + if style.strike: + css_rules.append("text-decoration: line-through;") + + css = ";".join(css_rules) + style_cache[style] = css + return css + + _theme = theme or SVG_EXPORT_THEME + + width = self.width + char_height = 20 + char_width = char_height * font_aspect_ratio + line_height = char_height * 1.22 + + margin_top = 1 + margin_right = 1 + margin_bottom = 1 + margin_left = 1 + + padding_top = 40 + padding_right = 8 + padding_bottom = 8 + padding_left = 8 + + padding_width = padding_left + padding_right + padding_height = padding_top + padding_bottom + margin_width = margin_left + margin_right + margin_height = margin_top + margin_bottom + + text_backgrounds: List[str] = [] + text_group: List[str] = [] + classes: Dict[str, int] = {} + style_no = 1 + + def escape_text(text: str) -> str: + """HTML escape text and replace spaces with nbsp.""" + return escape(text).replace(" ", " ") + + def make_tag( + name: str, content: Optional[str] = None, **attribs: object + ) -> str: + """Make a tag from name, content, and attributes.""" + + def stringify(value: object) -> str: + if isinstance(value, (float)): + return format(value, "g") + return str(value) + + tag_attribs = " ".join( + f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' + for k, v in attribs.items() + ) + return ( + f"<{name} {tag_attribs}>{content}" + if content + else f"<{name} {tag_attribs}/>" + ) + + with self._record_buffer_lock: + segments = list(Segment.filter_control(self._record_buffer)) + if clear: + self._record_buffer.clear() + + if unique_id is None: + unique_id = "terminal-" + str( + zlib.adler32( + ("".join(repr(segment) for segment in segments)).encode( + "utf-8", + "ignore", + ) + + title.encode("utf-8", "ignore") + ) + ) + y = 0 + for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): + x = 0 + for text, style, _control in line: + style = style or Style() + rules = get_svg_style(style) + if rules not in classes: + classes[rules] = style_no + style_no += 1 + class_name = f"r{classes[rules]}" + + if style.reverse: + has_background = True + background = ( + _theme.foreground_color.hex + if style.color is None + else style.color.get_truecolor(_theme).hex + ) + else: + bgcolor = style.bgcolor + has_background = bgcolor is not None and not bgcolor.is_default + background = ( + _theme.background_color.hex + if style.bgcolor is None + else style.bgcolor.get_truecolor(_theme).hex + ) + + text_length = cell_len(text) + if has_background: + text_backgrounds.append( + make_tag( + "rect", + fill=background, + x=x * char_width, + y=y * line_height + 1.5, + width=char_width * text_length, + height=line_height + 0.25, + shape_rendering="crispEdges", + ) + ) + + if text != " " * len(text): + text_group.append( + make_tag( + "text", + escape_text(text), + _class=f"{unique_id}-{class_name}", + x=x * char_width, + y=y * line_height + char_height, + textLength=char_width * len(text), + clip_path=f"url(#{unique_id}-line-{y})", + ) + ) + x += cell_len(text) + + line_offsets = [line_no * line_height + 1.5 for line_no in range(y)] + lines = "\n".join( + f""" + {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)} + """ + for line_no, offset in enumerate(line_offsets) + ) + + styles = "\n".join( + f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() + ) + backgrounds = "".join(text_backgrounds) + matrix = "".join(text_group) + + terminal_width = ceil(width * char_width + padding_width) + terminal_height = (y + 1) * line_height + padding_height + chrome = make_tag( + "rect", + fill=_theme.background_color.hex, + stroke="rgba(255,255,255,0.35)", + stroke_width="1", + x=margin_left, + y=margin_top, + width=terminal_width, + height=terminal_height, + rx=8, + ) + + title_color = _theme.foreground_color.hex + if title: + chrome += make_tag( + "text", + escape_text(title), + _class=f"{unique_id}-title", + fill=title_color, + text_anchor="middle", + x=terminal_width // 2, + y=margin_top + char_height + 6, + ) + chrome += f""" + + + + + + """ + + svg = code_format.format( + unique_id=unique_id, + char_width=char_width, + char_height=char_height, + line_height=line_height, + terminal_width=char_width * width - 1, + terminal_height=(y + 1) * line_height - 1, + width=terminal_width + margin_width, + height=terminal_height + margin_height, + terminal_x=margin_left + padding_left, + terminal_y=margin_top + padding_top, + styles=styles, + chrome=chrome, + backgrounds=backgrounds, + matrix=matrix, + lines=lines, + ) + return svg + + def save_svg( + self, + path: str, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, + ) -> None: + """Generate an SVG file from the console contents (requires record=True in Console constructor). + + Args: + path (str): The path to write the SVG to. + title (str, optional): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. + """ + svg = self.export_svg( + title=title, + theme=theme, + clear=clear, + code_format=code_format, + font_aspect_ratio=font_aspect_ratio, + unique_id=unique_id, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(svg) + + +def _svg_hash(svg_main_code: str) -> str: + """Returns a unique hash for the given SVG main code. + + Args: + svg_main_code (str): The content we're going to inject in the SVG envelope. + + Returns: + str: a hash of the given content + """ + return str(zlib.adler32(svg_main_code.encode())) + + +if __name__ == "__main__": # pragma: no cover + console = Console(record=True) + + console.log( + "JSONRPC [i]request[/i]", + 5, + 1.3, + True, + False, + None, + { + "jsonrpc": "2.0", + "method": "subtract", + "params": {"minuend": 42, "subtrahend": 23}, + "id": 3, + }, + ) + + console.log("Hello, World!", "{'a': 1}", repr(console)) + + console.print( + { + "name": None, + "empty": [], + "quiz": { + "sport": { + "answered": True, + "q1": { + "question": "Which one is correct team name in NBA?", + "options": [ + "New York Bulls", + "Los Angeles Kings", + "Golden State Warriors", + "Huston Rocket", + ], + "answer": "Huston Rocket", + }, + }, + "maths": { + "answered": False, + "q1": { + "question": "5 + 7 = ?", + "options": [10, 11, 12, 13], + "answer": 12, + }, + "q2": { + "question": "12 - 8 = ?", + "options": [1, 2, 3, 4], + "answer": 4, + }, + }, + }, + } + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py new file mode 100644 index 0000000..65fdf56 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py @@ -0,0 +1,37 @@ +from typing import Optional, TYPE_CHECKING + +from .jupyter import JupyterMixin +from .measure import Measurement + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType, RenderResult + + +class Constrain(JupyterMixin): + """Constrain the width of a renderable to a given number of characters. + + Args: + renderable (RenderableType): A renderable object. + width (int, optional): The maximum width (in characters) to render. Defaults to 80. + """ + + def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None: + self.renderable = renderable + self.width = width + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.width is None: + yield self.renderable + else: + child_options = options.update_width(min(self.width, options.max_width)) + yield from console.render(self.renderable, child_options) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + if self.width is not None: + options = options.update_width(self.width) + measurement = Measurement.get(console, options, self.renderable) + return measurement diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py new file mode 100644 index 0000000..e29cf36 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py @@ -0,0 +1,167 @@ +from itertools import zip_longest +from typing import ( + Iterator, + Iterable, + List, + Optional, + Union, + overload, + TypeVar, + TYPE_CHECKING, +) + +if TYPE_CHECKING: + from .console import ( + Console, + ConsoleOptions, + JustifyMethod, + OverflowMethod, + RenderResult, + RenderableType, + ) + from .text import Text + +from .cells import cell_len +from .measure import Measurement + +T = TypeVar("T") + + +class Renderables: + """A list subclass which renders its contents to the console.""" + + def __init__( + self, renderables: Optional[Iterable["RenderableType"]] = None + ) -> None: + self._renderables: List["RenderableType"] = ( + list(renderables) if renderables is not None else [] + ) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + """Console render method to insert line-breaks.""" + yield from self._renderables + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + dimensions = [ + Measurement.get(console, options, renderable) + for renderable in self._renderables + ] + if not dimensions: + return Measurement(1, 1) + _min = max(dimension.minimum for dimension in dimensions) + _max = max(dimension.maximum for dimension in dimensions) + return Measurement(_min, _max) + + def append(self, renderable: "RenderableType") -> None: + self._renderables.append(renderable) + + def __iter__(self) -> Iterable["RenderableType"]: + return iter(self._renderables) + + +class Lines: + """A list subclass which can render to the console.""" + + def __init__(self, lines: Iterable["Text"] = ()) -> None: + self._lines: List["Text"] = list(lines) + + def __repr__(self) -> str: + return f"Lines({self._lines!r})" + + def __iter__(self) -> Iterator["Text"]: + return iter(self._lines) + + @overload + def __getitem__(self, index: int) -> "Text": + ... + + @overload + def __getitem__(self, index: slice) -> List["Text"]: + ... + + def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]: + return self._lines[index] + + def __setitem__(self, index: int, value: "Text") -> "Lines": + self._lines[index] = value + return self + + def __len__(self) -> int: + return self._lines.__len__() + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + """Console render method to insert line-breaks.""" + yield from self._lines + + def append(self, line: "Text") -> None: + self._lines.append(line) + + def extend(self, lines: Iterable["Text"]) -> None: + self._lines.extend(lines) + + def pop(self, index: int = -1) -> "Text": + return self._lines.pop(index) + + def justify( + self, + console: "Console", + width: int, + justify: "JustifyMethod" = "left", + overflow: "OverflowMethod" = "fold", + ) -> None: + """Justify and overflow text to a given width. + + Args: + console (Console): Console instance. + width (int): Number of characters per line. + justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left". + overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold". + + """ + from .text import Text + + if justify == "left": + for line in self._lines: + line.truncate(width, overflow=overflow, pad=True) + elif justify == "center": + for line in self._lines: + line.rstrip() + line.truncate(width, overflow=overflow) + line.pad_left((width - cell_len(line.plain)) // 2) + line.pad_right(width - cell_len(line.plain)) + elif justify == "right": + for line in self._lines: + line.rstrip() + line.truncate(width, overflow=overflow) + line.pad_left(width - cell_len(line.plain)) + elif justify == "full": + for line_index, line in enumerate(self._lines): + if line_index == len(self._lines) - 1: + break + words = line.split(" ") + words_size = sum(cell_len(word.plain) for word in words) + num_spaces = len(words) - 1 + spaces = [1 for _ in range(num_spaces)] + index = 0 + if spaces: + while words_size + num_spaces < width: + spaces[len(spaces) - index - 1] += 1 + num_spaces += 1 + index = (index + 1) % len(spaces) + tokens: List[Text] = [] + for index, (word, next_word) in enumerate( + zip_longest(words, words[1:]) + ): + tokens.append(word) + if index < len(spaces): + style = word.get_style_at_offset(console, -1) + next_style = next_word.get_style_at_offset(console, 0) + space_style = style if style == next_style else line.style + tokens.append(Text(" " * spaces[index], style=space_style)) + self[line_index] = Text("").join(tokens) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/control.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/control.py new file mode 100644 index 0000000..88fcb92 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/control.py @@ -0,0 +1,225 @@ +import sys +import time +from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union + +if sys.version_info >= (3, 8): + from typing import Final +else: + from pip._vendor.typing_extensions import Final # pragma: no cover + +from .segment import ControlCode, ControlType, Segment + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + +STRIP_CONTROL_CODES: Final = [ + 7, # Bell + 8, # Backspace + 11, # Vertical tab + 12, # Form feed + 13, # Carriage return +] +_CONTROL_STRIP_TRANSLATE: Final = { + _codepoint: None for _codepoint in STRIP_CONTROL_CODES +} + +CONTROL_ESCAPE: Final = { + 7: "\\a", + 8: "\\b", + 11: "\\v", + 12: "\\f", + 13: "\\r", +} + +CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { + ControlType.BELL: lambda: "\x07", + ControlType.CARRIAGE_RETURN: lambda: "\r", + ControlType.HOME: lambda: "\x1b[H", + ControlType.CLEAR: lambda: "\x1b[2J", + ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", + ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", + ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", + ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", + ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", + ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", + ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", + ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", + ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", + ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", + ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", + ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", +} + + +class Control: + """A renderable that inserts a control code (non printable but may move cursor). + + Args: + *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a + tuple of ControlType and an integer parameter + """ + + __slots__ = ["segment"] + + def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: + control_codes: List[ControlCode] = [ + (code,) if isinstance(code, ControlType) else code for code in codes + ] + _format_map = CONTROL_CODES_FORMAT + rendered_codes = "".join( + _format_map[code](*parameters) for code, *parameters in control_codes + ) + self.segment = Segment(rendered_codes, None, control_codes) + + @classmethod + def bell(cls) -> "Control": + """Ring the 'bell'.""" + return cls(ControlType.BELL) + + @classmethod + def home(cls) -> "Control": + """Move cursor to 'home' position.""" + return cls(ControlType.HOME) + + @classmethod + def move(cls, x: int = 0, y: int = 0) -> "Control": + """Move cursor relative to current position. + + Args: + x (int): X offset. + y (int): Y offset. + + Returns: + ~Control: Control object. + + """ + + def get_codes() -> Iterable[ControlCode]: + control = ControlType + if x: + yield ( + control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, + abs(x), + ) + if y: + yield ( + control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, + abs(y), + ) + + control = cls(*get_codes()) + return control + + @classmethod + def move_to_column(cls, x: int, y: int = 0) -> "Control": + """Move to the given column, optionally add offset to row. + + Returns: + x (int): absolute x (column) + y (int): optional y offset (row) + + Returns: + ~Control: Control object. + """ + + return ( + cls( + (ControlType.CURSOR_MOVE_TO_COLUMN, x), + ( + ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, + abs(y), + ), + ) + if y + else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) + ) + + @classmethod + def move_to(cls, x: int, y: int) -> "Control": + """Move cursor to absolute position. + + Args: + x (int): x offset (column) + y (int): y offset (row) + + Returns: + ~Control: Control object. + """ + return cls((ControlType.CURSOR_MOVE_TO, x, y)) + + @classmethod + def clear(cls) -> "Control": + """Clear the screen.""" + return cls(ControlType.CLEAR) + + @classmethod + def show_cursor(cls, show: bool) -> "Control": + """Show or hide the cursor.""" + return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) + + @classmethod + def alt_screen(cls, enable: bool) -> "Control": + """Enable or disable alt screen.""" + if enable: + return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) + else: + return cls(ControlType.DISABLE_ALT_SCREEN) + + @classmethod + def title(cls, title: str) -> "Control": + """Set the terminal window title + + Args: + title (str): The new terminal window title + """ + return cls((ControlType.SET_WINDOW_TITLE, title)) + + def __str__(self) -> str: + return self.segment.text + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.segment.text: + yield self.segment + + +def strip_control_codes( + text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE +) -> str: + """Remove control codes from text. + + Args: + text (str): A string possibly contain control codes. + + Returns: + str: String with control codes removed. + """ + return text.translate(_translate_table) + + +def escape_control_codes( + text: str, + _translate_table: Dict[int, str] = CONTROL_ESCAPE, +) -> str: + """Replace control codes with their "escaped" equivalent in the given text. + (e.g. "\b" becomes "\\b") + + Args: + text (str): A string possibly containing control codes. + + Returns: + str: String with control codes replaced with their escaped version. + """ + return text.translate(_translate_table) + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + + console = Console() + console.print("Look at the title of your terminal window ^") + # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) + for i in range(10): + console.set_window_title("🚀 Loading" + "." * i) + time.sleep(0.5) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py new file mode 100644 index 0000000..dca3719 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py @@ -0,0 +1,190 @@ +from typing import Dict + +from .style import Style + +DEFAULT_STYLES: Dict[str, Style] = { + "none": Style.null(), + "reset": Style( + color="default", + bgcolor="default", + dim=False, + bold=False, + italic=False, + underline=False, + blink=False, + blink2=False, + reverse=False, + conceal=False, + strike=False, + ), + "dim": Style(dim=True), + "bright": Style(dim=False), + "bold": Style(bold=True), + "strong": Style(bold=True), + "code": Style(reverse=True, bold=True), + "italic": Style(italic=True), + "emphasize": Style(italic=True), + "underline": Style(underline=True), + "blink": Style(blink=True), + "blink2": Style(blink2=True), + "reverse": Style(reverse=True), + "strike": Style(strike=True), + "black": Style(color="black"), + "red": Style(color="red"), + "green": Style(color="green"), + "yellow": Style(color="yellow"), + "magenta": Style(color="magenta"), + "cyan": Style(color="cyan"), + "white": Style(color="white"), + "inspect.attr": Style(color="yellow", italic=True), + "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True), + "inspect.callable": Style(bold=True, color="red"), + "inspect.async_def": Style(italic=True, color="bright_cyan"), + "inspect.def": Style(italic=True, color="bright_cyan"), + "inspect.class": Style(italic=True, color="bright_cyan"), + "inspect.error": Style(bold=True, color="red"), + "inspect.equals": Style(), + "inspect.help": Style(color="cyan"), + "inspect.doc": Style(dim=True), + "inspect.value.border": Style(color="green"), + "live.ellipsis": Style(bold=True, color="red"), + "layout.tree.row": Style(dim=False, color="red"), + "layout.tree.column": Style(dim=False, color="blue"), + "logging.keyword": Style(bold=True, color="yellow"), + "logging.level.notset": Style(dim=True), + "logging.level.debug": Style(color="green"), + "logging.level.info": Style(color="blue"), + "logging.level.warning": Style(color="red"), + "logging.level.error": Style(color="red", bold=True), + "logging.level.critical": Style(color="red", bold=True, reverse=True), + "log.level": Style.null(), + "log.time": Style(color="cyan", dim=True), + "log.message": Style.null(), + "log.path": Style(dim=True), + "repr.ellipsis": Style(color="yellow"), + "repr.indent": Style(color="green", dim=True), + "repr.error": Style(color="red", bold=True), + "repr.str": Style(color="green", italic=False, bold=False), + "repr.brace": Style(bold=True), + "repr.comma": Style(bold=True), + "repr.ipv4": Style(bold=True, color="bright_green"), + "repr.ipv6": Style(bold=True, color="bright_green"), + "repr.eui48": Style(bold=True, color="bright_green"), + "repr.eui64": Style(bold=True, color="bright_green"), + "repr.tag_start": Style(bold=True), + "repr.tag_name": Style(color="bright_magenta", bold=True), + "repr.tag_contents": Style(color="default"), + "repr.tag_end": Style(bold=True), + "repr.attrib_name": Style(color="yellow", italic=False), + "repr.attrib_equal": Style(bold=True), + "repr.attrib_value": Style(color="magenta", italic=False), + "repr.number": Style(color="cyan", bold=True, italic=False), + "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same + "repr.bool_true": Style(color="bright_green", italic=True), + "repr.bool_false": Style(color="bright_red", italic=True), + "repr.none": Style(color="magenta", italic=True), + "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False), + "repr.uuid": Style(color="bright_yellow", bold=False), + "repr.call": Style(color="magenta", bold=True), + "repr.path": Style(color="magenta"), + "repr.filename": Style(color="bright_magenta"), + "rule.line": Style(color="bright_green"), + "rule.text": Style.null(), + "json.brace": Style(bold=True), + "json.bool_true": Style(color="bright_green", italic=True), + "json.bool_false": Style(color="bright_red", italic=True), + "json.null": Style(color="magenta", italic=True), + "json.number": Style(color="cyan", bold=True, italic=False), + "json.str": Style(color="green", italic=False, bold=False), + "json.key": Style(color="blue", bold=True), + "prompt": Style.null(), + "prompt.choices": Style(color="magenta", bold=True), + "prompt.default": Style(color="cyan", bold=True), + "prompt.invalid": Style(color="red"), + "prompt.invalid.choice": Style(color="red"), + "pretty": Style.null(), + "scope.border": Style(color="blue"), + "scope.key": Style(color="yellow", italic=True), + "scope.key.special": Style(color="yellow", italic=True, dim=True), + "scope.equals": Style(color="red"), + "table.header": Style(bold=True), + "table.footer": Style(bold=True), + "table.cell": Style.null(), + "table.title": Style(italic=True), + "table.caption": Style(italic=True, dim=True), + "traceback.error": Style(color="red", italic=True), + "traceback.border.syntax_error": Style(color="bright_red"), + "traceback.border": Style(color="red"), + "traceback.text": Style.null(), + "traceback.title": Style(color="red", bold=True), + "traceback.exc_type": Style(color="bright_red", bold=True), + "traceback.exc_value": Style.null(), + "traceback.offset": Style(color="bright_red", bold=True), + "bar.back": Style(color="grey23"), + "bar.complete": Style(color="rgb(249,38,114)"), + "bar.finished": Style(color="rgb(114,156,31)"), + "bar.pulse": Style(color="rgb(249,38,114)"), + "progress.description": Style.null(), + "progress.filesize": Style(color="green"), + "progress.filesize.total": Style(color="green"), + "progress.download": Style(color="green"), + "progress.elapsed": Style(color="yellow"), + "progress.percentage": Style(color="magenta"), + "progress.remaining": Style(color="cyan"), + "progress.data.speed": Style(color="red"), + "progress.spinner": Style(color="green"), + "status.spinner": Style(color="green"), + "tree": Style(), + "tree.line": Style(), + "markdown.paragraph": Style(), + "markdown.text": Style(), + "markdown.em": Style(italic=True), + "markdown.emph": Style(italic=True), # For commonmark backwards compatibility + "markdown.strong": Style(bold=True), + "markdown.code": Style(bold=True, color="cyan", bgcolor="black"), + "markdown.code_block": Style(color="cyan", bgcolor="black"), + "markdown.block_quote": Style(color="magenta"), + "markdown.list": Style(color="cyan"), + "markdown.item": Style(), + "markdown.item.bullet": Style(color="yellow", bold=True), + "markdown.item.number": Style(color="yellow", bold=True), + "markdown.hr": Style(color="yellow"), + "markdown.h1.border": Style(), + "markdown.h1": Style(bold=True), + "markdown.h2": Style(bold=True, underline=True), + "markdown.h3": Style(bold=True), + "markdown.h4": Style(bold=True, dim=True), + "markdown.h5": Style(underline=True), + "markdown.h6": Style(italic=True), + "markdown.h7": Style(italic=True, dim=True), + "markdown.link": Style(color="bright_blue"), + "markdown.link_url": Style(color="blue", underline=True), + "markdown.s": Style(strike=True), + "iso8601.date": Style(color="blue"), + "iso8601.time": Style(color="magenta"), + "iso8601.timezone": Style(color="yellow"), +} + + +if __name__ == "__main__": # pragma: no cover + import argparse + import io + + from pip._vendor.rich.console import Console + from pip._vendor.rich.table import Table + from pip._vendor.rich.text import Text + + parser = argparse.ArgumentParser() + parser.add_argument("--html", action="store_true", help="Export as HTML table") + args = parser.parse_args() + html: bool = args.html + console = Console(record=True, width=70, file=io.StringIO()) if html else Console() + + table = Table("Name", "Styling") + + for style_name, style in DEFAULT_STYLES.items(): + table.add_row(Text(style_name, style=style), str(style)) + + console.print(table) + if html: + print(console.export_html(inline_styles=True)) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py new file mode 100644 index 0000000..ad36183 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py @@ -0,0 +1,37 @@ +import os +import platform + +from pip._vendor.rich import inspect +from pip._vendor.rich.console import Console, get_windows_console_features +from pip._vendor.rich.panel import Panel +from pip._vendor.rich.pretty import Pretty + + +def report() -> None: # pragma: no cover + """Print a report to the terminal with debugging information""" + console = Console() + inspect(console) + features = get_windows_console_features() + inspect(features) + + env_names = ( + "TERM", + "COLORTERM", + "CLICOLOR", + "NO_COLOR", + "TERM_PROGRAM", + "COLUMNS", + "LINES", + "JUPYTER_COLUMNS", + "JUPYTER_LINES", + "JPY_PARENT_PID", + "VSCODE_VERBOSE_LOGGING", + ) + env = {name: os.getenv(name) for name in env_names} + console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables")) + + console.print(f'platform="{platform.system()}"') + + +if __name__ == "__main__": # pragma: no cover + report() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py new file mode 100644 index 0000000..791f046 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py @@ -0,0 +1,96 @@ +import sys +from typing import TYPE_CHECKING, Optional, Union + +from .jupyter import JupyterMixin +from .segment import Segment +from .style import Style +from ._emoji_codes import EMOJI +from ._emoji_replace import _emoji_replace + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + + +EmojiVariant = Literal["emoji", "text"] + + +class NoEmoji(Exception): + """No emoji by that name.""" + + +class Emoji(JupyterMixin): + __slots__ = ["name", "style", "_char", "variant"] + + VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} + + def __init__( + self, + name: str, + style: Union[str, Style] = "none", + variant: Optional[EmojiVariant] = None, + ) -> None: + """A single emoji character. + + Args: + name (str): Name of emoji. + style (Union[str, Style], optional): Optional style. Defaults to None. + + Raises: + NoEmoji: If the emoji doesn't exist. + """ + self.name = name + self.style = style + self.variant = variant + try: + self._char = EMOJI[name] + except KeyError: + raise NoEmoji(f"No emoji called {name!r}") + if variant is not None: + self._char += self.VARIANTS.get(variant, "") + + @classmethod + def replace(cls, text: str) -> str: + """Replace emoji markup with corresponding unicode characters. + + Args: + text (str): A string with emojis codes, e.g. "Hello :smiley:!" + + Returns: + str: A string with emoji codes replaces with actual emoji. + """ + return _emoji_replace(text) + + def __repr__(self) -> str: + return f"" + + def __str__(self) -> str: + return self._char + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + yield Segment(self._char, console.get_style(self.style)) + + +if __name__ == "__main__": # pragma: no cover + import sys + + from pip._vendor.rich.columns import Columns + from pip._vendor.rich.console import Console + + console = Console(record=True) + + columns = Columns( + (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name), + column_first=True, + ) + + console.print(columns) + if len(sys.argv) > 1: + console.save_html(sys.argv[1]) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py new file mode 100644 index 0000000..0bcbe53 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py @@ -0,0 +1,34 @@ +class ConsoleError(Exception): + """An error in console operation.""" + + +class StyleError(Exception): + """An error in styles.""" + + +class StyleSyntaxError(ConsoleError): + """Style was badly formatted.""" + + +class MissingStyle(StyleError): + """No such style.""" + + +class StyleStackError(ConsoleError): + """Style stack is invalid.""" + + +class NotRenderableError(ConsoleError): + """Object is not renderable.""" + + +class MarkupError(ConsoleError): + """Markup was badly formatted.""" + + +class LiveError(ConsoleError): + """Error related to Live display.""" + + +class NoAltScreen(ConsoleError): + """Alt screen mode was required.""" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py new file mode 100644 index 0000000..4b0b0da --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py @@ -0,0 +1,57 @@ +import io +from typing import IO, TYPE_CHECKING, Any, List + +from .ansi import AnsiDecoder +from .text import Text + +if TYPE_CHECKING: + from .console import Console + + +class FileProxy(io.TextIOBase): + """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" + + def __init__(self, console: "Console", file: IO[str]) -> None: + self.__console = console + self.__file = file + self.__buffer: List[str] = [] + self.__ansi_decoder = AnsiDecoder() + + @property + def rich_proxied_file(self) -> IO[str]: + """Get proxied file.""" + return self.__file + + def __getattr__(self, name: str) -> Any: + return getattr(self.__file, name) + + def write(self, text: str) -> int: + if not isinstance(text, str): + raise TypeError(f"write() argument must be str, not {type(text).__name__}") + buffer = self.__buffer + lines: List[str] = [] + while text: + line, new_line, text = text.partition("\n") + if new_line: + lines.append("".join(buffer) + line) + buffer.clear() + else: + buffer.append(line) + break + if lines: + console = self.__console + with console: + output = Text("\n").join( + self.__ansi_decoder.decode_line(line) for line in lines + ) + console.print(output) + return len(text) + + def flush(self) -> None: + output = "".join(self.__buffer) + if output: + self.__console.print(output) + del self.__buffer[:] + + def fileno(self) -> int: + return self.__file.fileno() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py new file mode 100644 index 0000000..99f118e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py @@ -0,0 +1,89 @@ +# coding: utf-8 +"""Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 + +The functions declared in this module should cover the different +use cases needed to generate a string representation of a file size +using several different units. Since there are many standards regarding +file size units, three different functions have been implemented. + +See Also: + * `Wikipedia: Binary prefix `_ + +""" + +__all__ = ["decimal"] + +from typing import Iterable, List, Optional, Tuple + + +def _to_str( + size: int, + suffixes: Iterable[str], + base: int, + *, + precision: Optional[int] = 1, + separator: Optional[str] = " ", +) -> str: + if size == 1: + return "1 byte" + elif size < base: + return "{:,} bytes".format(size) + + for i, suffix in enumerate(suffixes, 2): # noqa: B007 + unit = base**i + if size < unit: + break + return "{:,.{precision}f}{separator}{}".format( + (base * size / unit), + suffix, + precision=precision, + separator=separator, + ) + + +def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]: + """Pick a suffix and base for the given size.""" + for i, suffix in enumerate(suffixes): + unit = base**i + if size < unit * base: + break + return unit, suffix + + +def decimal( + size: int, + *, + precision: Optional[int] = 1, + separator: Optional[str] = " ", +) -> str: + """Convert a filesize in to a string (powers of 1000, SI prefixes). + + In this convention, ``1000 B = 1 kB``. + + This is typically the format used to advertise the storage + capacity of USB flash drives and the like (*256 MB* meaning + actually a storage capacity of more than *256 000 000 B*), + or used by **Mac OS X** since v10.6 to report file sizes. + + Arguments: + int (size): A file size. + int (precision): The number of decimal places to include (default = 1). + str (separator): The string to separate the value from the units (default = " "). + + Returns: + `str`: A string containing a abbreviated file size and units. + + Example: + >>> filesize.decimal(30000) + '30.0 kB' + >>> filesize.decimal(30000, precision=2, separator="") + '30.00kB' + + """ + return _to_str( + size, + ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), + 1000, + precision=precision, + separator=separator, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py new file mode 100644 index 0000000..c264679 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py @@ -0,0 +1,232 @@ +import re +from abc import ABC, abstractmethod +from typing import List, Union + +from .text import Span, Text + + +def _combine_regex(*regexes: str) -> str: + """Combine a number of regexes in to a single regex. + + Returns: + str: New regex with all regexes ORed together. + """ + return "|".join(regexes) + + +class Highlighter(ABC): + """Abstract base class for highlighters.""" + + def __call__(self, text: Union[str, Text]) -> Text: + """Highlight a str or Text instance. + + Args: + text (Union[str, ~Text]): Text to highlight. + + Raises: + TypeError: If not called with text or str. + + Returns: + Text: A test instance with highlighting applied. + """ + if isinstance(text, str): + highlight_text = Text(text) + elif isinstance(text, Text): + highlight_text = text.copy() + else: + raise TypeError(f"str or Text instance required, not {text!r}") + self.highlight(highlight_text) + return highlight_text + + @abstractmethod + def highlight(self, text: Text) -> None: + """Apply highlighting in place to text. + + Args: + text (~Text): A text object highlight. + """ + + +class NullHighlighter(Highlighter): + """A highlighter object that doesn't highlight. + + May be used to disable highlighting entirely. + + """ + + def highlight(self, text: Text) -> None: + """Nothing to do""" + + +class RegexHighlighter(Highlighter): + """Applies highlighting from a list of regular expressions.""" + + highlights: List[str] = [] + base_style: str = "" + + def highlight(self, text: Text) -> None: + """Highlight :class:`rich.text.Text` using regular expressions. + + Args: + text (~Text): Text to highlighted. + + """ + + highlight_regex = text.highlight_regex + for re_highlight in self.highlights: + highlight_regex(re_highlight, style_prefix=self.base_style) + + +class ReprHighlighter(RegexHighlighter): + """Highlights the text typically produced from ``__repr__`` methods.""" + + base_style = "repr." + highlights = [ + r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*)(?P>)", + r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', + r"(?P[][{}()])", + _combine_regex( + r"(?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", + r"(?P([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", + r"(?P(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", + r"(?P(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", + r"(?P[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", + r"(?P[\w.]*?)\(", + r"\b(?PTrue)\b|\b(?PFalse)\b|\b(?PNone)\b", + r"(?P\.\.\.)", + r"(?P(?(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?", + r"(?b?'''.*?(?(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)", + ), + ] + + +class JSONHighlighter(RegexHighlighter): + """Highlights JSON""" + + # Captures the start and end of JSON strings, handling escaped quotes + JSON_STR = r"(?b?\".*?(?[\{\[\(\)\]\}])", + r"\b(?Ptrue)\b|\b(?Pfalse)\b|\b(?Pnull)\b", + r"(?P(? None: + super().highlight(text) + + # Additional work to handle highlighting JSON keys + plain = text.plain + append = text.spans.append + whitespace = self.JSON_WHITESPACE + for match in re.finditer(self.JSON_STR, plain): + start, end = match.span() + cursor = end + while cursor < len(plain): + char = plain[cursor] + cursor += 1 + if char == ":": + append(Span(start, end, "json.key")) + elif char in whitespace: + continue + break + + +class ISO8601Highlighter(RegexHighlighter): + """Highlights the ISO8601 date time strings. + Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html + """ + + base_style = "iso8601." + highlights = [ + # + # Dates + # + # Calendar month (e.g. 2008-08). The hyphen is required + r"^(?P[0-9]{4})-(?P1[0-2]|0[1-9])$", + # Calendar date w/o hyphens (e.g. 20080830) + r"^(?P(?P[0-9]{4})(?P1[0-2]|0[1-9])(?P3[01]|0[1-9]|[12][0-9]))$", + # Ordinal date (e.g. 2008-243). The hyphen is optional + r"^(?P(?P[0-9]{4})-?(?P36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$", + # + # Weeks + # + # Week of the year (e.g., 2008-W35). The hyphen is optional + r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9]))$", + # Week date (e.g., 2008-W35-6). The hyphens are optional + r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9])-?(?P[1-7]))$", + # + # Times + # + # Hours and minutes (e.g., 17:21). The colon is optional + r"^(?P

      ' : '\U0001d4ab', + '\\' : '\U0001d4ac', + '\\' : '\U0000211b', + '\\' : '\U0001d4ae', + '\\' : '\U0001d4af', + '\\' : '\U0001d4b0', + '\\' : '\U0001d4b1', + '\\' : '\U0001d4b2', + '\\' : '\U0001d4b3', + '\\' : '\U0001d4b4', + '\\' : '\U0001d4b5', + '\\' : '\U0001d5ba', + '\\' : '\U0001d5bb', + '\\' : '\U0001d5bc', + '\\' : '\U0001d5bd', + '\\' : '\U0001d5be', + '\\' : '\U0001d5bf', + '\\' : '\U0001d5c0', + '\\' : '\U0001d5c1', + '\\' : '\U0001d5c2', + '\\' : '\U0001d5c3', + '\\' : '\U0001d5c4', + '\\' : '\U0001d5c5', + '\\' : '\U0001d5c6', + '\\' : '\U0001d5c7', + '\\' : '\U0001d5c8', + '\\

      N}fV`ZKl_8deDdF z_Os3Yb%IG0qW3w^{&ihSCMS90u?(%J7|x~Z``pp@N#Hg$Ku_>9K9lj;o|83)8?`j3 z1pO&{Dh0!Cu7;VE$~+cp0oaE3!n#&d3>K)mWTUXss3F_n=~C3#?cMg=?%B zw(<`vh8eYqVi?VjD25s4QN=LJHdPEGyqRLKHq8~oQO#qDO(OQVVz6>86oX}XLb5cJ zt)*g^J)cwztGA~V!%FCB#bB*lDTeJ|YsGM^)kZPQV$UdsS-Y)b=;O~ShLu%2#n8u} zQw)8)y<%7;Kd%^Ozz&L`KX+6N{kfB3=+B)MLx1j~82WQp#c=a75zN>x+WI=(*uN7a zr%{~lieWX|L$Y-A?VgIEZ$}kFU+kqA`dx3uFw6B(497)%6@%&QC)r5MRQ)AO$I3cM zF|1BrkZdHv1&U$CH$XAWxC0eKKOUqQ`te}J&=-d&hJH6xG4!!vilL7UR}6jZMa9s^ zUQ!Hw>}AE!cV1BpE9O@vOT&DStQgvSgkosl6v@)jXHykJx+5h^n|Zd0y>9R}P3#|B zOkMSy&i~U?Vpy(@QVg9bU9wS_d@>Znc!ceuKm;=%@9sh%kER1dmYFwFro#h>1RDP_7~d2_INm?7Bd9hhcjDuymM zOEFA6vmG<$qhK1EIn%Kq(Pm_h118Yv9cKBX7}gr|95WftTY@n%-!T(6Z!T=)0>^^x zNPyNv0O2C%G~8i*{opy>Ago5*EW+?EV>zsN=u+{TrhrB?O$ANRG!3+brlUa5(=;8l zq^6@m&)0M;=mnaN1HDkw37{8gIuZ0@O(%ht(sVNDC7MnFEiLIc8%&*DD(SZ=vk>+& zMaM1yEu-kXY|zUUU7i7Yg`yj#fnF);cPVQ?uTpgSNYJYloo`BfjiMV?Andh@?%V=; zouvOtH6^}Y(Q&3NZcuc(sfQaS{cf=-@lBqh3zqwC){^hCOqOr{hw!gCBt)XOKnN%4 zvObXMySTeedA(Ipy7x@9r5krcNyh~6t{KHdBvT2axtrhO|(T9j`3d1XoS z=oTwop^BvWbYqEVRYkK_fmTy=uBqSZk`^q}Q4dIZI@`3+gOV1en_7QJ)6K|lW6HSZ zWl)FAvsO(A$Hx7WDC8odtb8SZ_f;2TXUs{7E|%!7zK$PDL`B zJ87pP8O@xuQ<043P1>nQMzbdER0PAENjnwEXvUWn6Bz5kFbl?cFw}za9t^f%f(IEEO!T0y1(Q4&Xu)I$Oy2To zQlndBj+uhy)09Tr3BfR-(JeB^Ok7N7w4)FVlNs$O1jAHDI||248kopvN8y;g9!+Dk zqY$iMIXXb5WYchaXpUn+KU=W54w#D-jaW&6<_VTJ5`~>F*?6;~5G;Q)`h1pPMOoMc zE))zi7Tq5cEN>KcH;VCQoAj@ZM7llkfYAVWfPZ7>vY+iow8q zq!^C%K2{7<$tQ~8xb9QMHWK?xF^u?J#kLarTrpV5FBF4y{!%emi?0;hL+oqCaP#!I zWT~(WCltfN;-q4uh@DalefP9tID5)d4ChSwieX_ zO(*u9VwjEor5Mi8zE=#VdH+@n$Im|~hE>mh6vJ%!qhjc%KPiTO`ml^Xe{NOw##trbY{ zBEC~(E=$)$`Ac}kCb;BO>ey4Mn@^>nFz0#EMkA4~iD6MvDa%f!tR#_?^SyGZNovKZ zl%1zi)|*0L>2-nEZGtPHq)<7q1-Q_QHo;XUD;U=o{ZpY5pod+ol+~wFD4%HWQeLr1 zQ6iMdR9l&s{8L;@(QH0Sd(q}&&8bupQM^n4sZf<*L|o<-Ec;KTtUG0PCS^Rfms)2k z7=^vuD>i$S!cw1uE0jplDErAadslkVCPgvPN3ZhORy{B^q$zdQ*;Xdig1c!GaPcMQ zdN6RcPxx|EbdzxELbPmZhV5t9_#iBAsnjjP=D61Dwwl6RQ>m`=ij5g6=E`W1>y=K| zq%J^xih2QR&H@z0r#{*^N+A(BW=U3bisd08IGJ|5WH|Sn}WE6`Ryn zWCDF3Bdx3#Z8^5u!DO<6etfIfZRG8yFN7oUHZR(I?zWLB+U@_Z0&{VPR7~fwWxLZW zrvId-pGv`edY8hZZN~3bm|7I|UQXdLr&2K?mG{`>GOEdDRbx$F ziY+5bao$|q&6Sax zT3)d+XCeD3d(D+m{Muf(g`l|rE1x9gU8T&T9Gpr;HP=%L#i5RgVN(B} z3Jstgq}->J*~nN5)>#d_V(Vj`=?FByP#^bu(PnS1$pn;!Ua{qwWBXwvk8Ol`W@w<^ zA5aQKpn;02dGP;LP^k}j#pZ3k8^SOpjlF1-GNQTQ!~alV*svID@=t}#6P6E;c*VBg zd{e13?5X9El}Ej9v$DW+PqJMQn|je!#sWL#HS^eB6Zlj(Dp2s|UboQ}+DYm$k8M)G z-oQTo4-wTE+VvJ*v{gbzmqgV56aTM*Ote%AEgoo{gHk=|6`K#rJLU)5Xis_3=AFcq z6z6G=Z4Ri*PNPha(#k9LYNSx!Xn-LTt-WZkM&*SSZsW17K*H#lr&2cA96sZ9n;IF6 za0YAZ6+8%6rN9i2X9cWkVLJh>o zu&#w&JhXdSOS?)MmMKxvuu$D34NKKs(y&-PBn`{eQ_`?tQAxv+^^!C!T5n0ivh@+P zTG(8DB@N5gPtve#{Ur^{mLzFdwig`DP3W1_nYvlvK_n6W0Wp8)LF6Ck{Rv$<2LuLr z5b2N2|KONEsVn)1#QceU$v@Ql6B7GYBQT7E>StRGRu8JtYH+|guLg(vl<3!}DdiWP z-)wdAc5cqkm_+y`f%9jrwL74f1)lkQY8?2t#QaIHU0Y-Re(-N|{_q-L+a058z`rBr?+yP>=MOsB+S%m*WpoGy*d6ot zgFoB(!$iRLI7W%UpA+-3tOIoYw{GODqz711x;L&pWmjq-8ol&w7~t@d2V9WcNFt2P!I;0tF!CRY`Fp}>y~F%T z(B>-}@8#^oQ;Fz=KGi zq2&M2`Ga~kg^wJ_P3RkiRrr{J{s5nN5J~Du74j+kVTF9=wS=T3WGL5zND`*c&tv`p z@PEPl=uTh8{6o5&ZE~y;yhIuP{G2DpuUtaL1PrFuMRvayv~x(0dx{lhRXn*v2hsvo zv+$&V)h#?FU=0gT3s}>_JOOK2m@i;$3kw9SV_~6ybuBFNFuWmRa{rB_VVS;_G%VD2 zl7^-Fm!x5_zLzvC*S{qV3-*JgVafg@X;`!$B@N5=lc3eA*b@INX;`*1l7?mbMbfZr z|CKZ>+pm&_W&2Iiux!6e8kX%3NyD=JDQQ@?zXYuwmhFF%hGqNP(cFX{w78*{b866- z44+jUzr>ACdbSttknd;w7~}UYbK&Ww6u8YXI1RSAZ)T66Yd-)MJ{0kw((zTlhnU`2 z>3GTMVWu}xIzGPj2-6=`I&6AVrZ;nX@P+*}Vsj=w=0r0|d_(U7N1~52y@k^87}XO@ zZ|U?iw($7!){{(s%IV?t@#U?jnchn2`0`e3rngZ#zP$Ae)7vT?U*39_>Ftz`FK<1^ z^!7@}m$#m0dIzQBYeyZK-bv|rP`oqKyC@xB-s;NqM5W`Ce%+YfUFrCwUk|4DRQgKN zqfGCmbbQjUH`Dtl9iQ~;%k*TaXQFeDV0wzu(YaHZK2quE+-Xc7rF3-ebf#xG-S)3c zbnekiALDe}zcS4yE15n{>FD3%oqo2tvt}@Ydh|o3X&jHk>T@*x=}Q0nfAn}n9QyoE z^kJm9nQ=Yh65|)eKTQw8w+~SUet~tK2d`N(Gv9}fM1O_btbfSvE|1y9+u)Ab z&bb&Kw=?|?rDJ&9$@IINZo9`^43E2+Ue4*Zd(6e~D9`i?O2_cHhw1k!9mAs{(<>=` zJ?WL1UQOxvFkW@0*HAiM3aiQVT1v+kEo(Eqj?(c(%eqXjr*wSLvOd%AQ#!tA*?{Ty zD;;07Y{>LRQlDq$KBhmYbTjucy|L2G+{g4LN;h*K(;rp3nfsXDOzAKW&6)m~(#`b8 z^cG4t(;w4YD&0(fOn*x0X8L1#E2W$1kLhicZl*t`w^h2C{+QlQ>1O(4dV8gt>5u6h zly0U!rgu`hnf{pGMd@bxV|t>}&Gg6g?n*b)AJcm(-AsQ>@1=Az{V~0d(#`b8^nOma z_GKQ%cYmfQIXxIja{-AjFmad@t?`++i}c}4e^Ke#XPb{|1!T{frBGH#v!Y_-2 zPi)1#u~!89W*$cRt1M2k)aRRp0Mk>HZWaPeAE|V+5McT!rJIES)5j`(9OZ8u)5kkK zIBln&2~3>iMB5Vc&1B2;DM~k!Ez@Tx-AtxTpQUs&nKC_7>1Hxz`dp=B7|vt*e5GR; zE?|0=(lHDdGJTQKF$@hPvoFhk`uY#OndVUDgICnlG>)!b2__B}yl>$)Og!B@ zL+Kc*Z!-NYsn5s5#BVzm6xxd0=YXlW6Wj1O#eTuQS%6Pq8~_U|?x51~6^%n)r%yt| z9iEaMQ(-Y=-(z9l_hIQ%&WwM^_(z`85gpvImF5Br;ZK83$}XTY#S!_ysJinqQqBw6^v8n+NS|XaC)YrX}bKml^u` z2e{2uBGGz`H)4D!W43e*wq zus|;}p3L|W#*Z?d%lKD}|IK*Zs@U~w!);oXJ|@F>3&vYA-j4D1jK9hF=ZycC@pwwd zmFs-C!*nlX{8GltFn$f=Wf{Ml@p6n;X1t2$^wJpI&8bTUsaUVjTVoE`ez|5lu?~&} z9qro>9UTabBt8<<2`ucqQLkfDdE6q@B6tS6#VSzGBF+58)TQS_o%Tx@{dd^X7EU~$YjUzTs zvGK&_D~9QOfns<lVdeShp$$!@5l|7}o8I!LaU742E^5Vlb?`6oX;itr!ez zwqh`>dlZ9V%~1@7b+2OB)xQQ7t~$PloBm-#{{!Q{Gak1l7JkVmvG5z<4zIJH@pl;i z({p->;x`K4oYFFLYvD!=_;|tc=fEgO91GIyq@3V@jkp;RO9+;~8zb>N!A|eMOi)s= zyoqSY^BoH&*aR+gz$B2j6c@Y5u^@cS^DQj#r2&MtB64Cej(bj%;69W!wY zW~2Epl`IFg^D@B-XTgq_k!(KZkIN-njJf9u!HQB~!>)A9=4AzJ`&EvayyS1e5WQNk zf>hXzYb2Y9;drfJg_AHJT_;#k8oKfIk}bzPeS=`9cOfq~3YIq>^Y2Z9<*&g!bF*Lt z8OZZ3f)&of5GX5H(GKMKR>AVN!j9i2SpHrNv)ctLoQb*O4#}3nG~6jz{#eXWcL`RQ z4qJS;WLYp>TVAmIxv=dO9J6h-6?J-#U7g0`>K+y##~lSumbboV0Fpnz!cVSEO^z9w3-f>f)&m}=4v@+ zDy48X=7-vj*>KyjAgm);(OeAgx{|F$xO$Rp$AGEtm`S5x5f%scIcCx*Sc<{cK(cL^ zTkaREa3UJKp3r5?*KHz{Y#A?js4+@sI7`@^l$+B^=#)1`WL`EJKtZ+om z+4iz^gDGTxPMz~i-b5r;FdDPxBa$t~QtVN|3O8d|Hx;aC4!T=2!SWVkh%}dMBhq+G zu>2M1ZjVd0J(E}q$+BVYo)D~H3wlFK$#x(wPYPBv8_UP11j`$XW!%$(6{a9uE5Y*8 z(OX+9hThdiu!0o`_l#uQa)`ARtZ*Vs<+Fkn&4yWQCs?8R9hBz;%O8t6Xzy4sp4y+l z^A4D6i&uFac}%E|N{hUahNO zdE;Q$5*;(wD_D$uPdC9%=U^Ci7c4Ia^JNdgPVazy?kQOQW>kDsvgw!`dkI#s1s$!o zV0ja<$LS;4LfFKtKpra4Z;Q%|zgUt>jHu zL=2E@EE;W~V>W@YSjr4?%*Hi`41)zLn2vBm1UtP8Yr~;}<)xvLhe?)>f(;iee-SF+ zMZpR-qqDpuSm9`lzLzCijSlpRU`6TZwXX`6Hx@lUS+dEnEF&CqU*Je_z*IoqZY+*d z13DC$2b;5ZEKHpz_!>N z%z)!0TMHXCUa-PF=&}<8%QK(EnJ8HPC@gO#NoIaTYqDfhU_+-!mW|!eRKW_;&;zDP zHU(_DWXmxZ%y7)~(1Pt)&Chhql(%pMdc`csvayqzE!kA`&`iOKl99hTl8r~Ya|O%G zKx534Yz*Sgmuw1_uL}e#FfY4h30AlmJ#V37!E9?+7da62JXFeJ$@ZcfFA*$%JZ#=l z$=0E;%LFUffF8PBGP6EjAsD@)PT^JxmN#eTSyl!$ss!_>1kEp_-Pk!j@3YD!7EHG_ zvDyJ!6Wd_r)(DoLjOlN!U~s#M`)z_1EJI6e7p!O$(%m6hCT5+Tg5{^;P-2&0r+1+oy9LWj zMR~I&TaR@2NVWkpWsYNKs4e31XJF^H*D<#Qc+CORKn3X&DA4PY%|;)8L$JcB*~H!y ztY`$-TaE?etxk)f*E!k zf8l^BL{TRC=9hxyWng@MCD|lQ;9pC&5sQxFg5}S`QvQTw^UxJfO15YPu~U+nU)wk> zSivOZFHf?Wm?rZj+k@3@fnbG;k>^6iFg}YM3({@Ne&c|xlsQP?Tfy?iVIY1dSpF^; z!G8&sHwmYl-wRfdjxP3Z$)>;<{UBK3OkD3jf)!x@Tl<&tYTgU_9*d=nLOw1T1G4)SpHb_&;-E>He=Ub zLa@AbSW%uQSpF956-r8$iJ9Si!3xc9rd;4ykZddTLI-RwGe1;ykz+xM4Ro;swgkJ8 z+ftI5Z>V1)+05j#tp=(Fi>Qt^pW|vE5-p9y!n>oFxrA-CFT~G_lwtbiLeHPQh4d?! zewEX00n<^XS372|SuhS(?;6SGU=4V!VrvmFOeN0AYocb)tz-I19IvZ)N&zPB#e`uHHfV?M%N@=taqx zLhf?RT(c+@&&=G-;#83OVl24tQ4E!HuVhOw&?`!|4gI&0Wagtfl_ksEPT{IJX3BCp z2UB2G!SYhEO{^wa8uszkB{OHLH59`-x29y{aZq1NvKcV4wIwshjCC9{^_Djq<*h53 z`Q5jAl9}14zGNGbm-`$GlI-wo;DD)s{FG@F=zhmcqWNh^w4q}*+$c!7qkdl! zX5toPU@g;3vPp>BT(U*T-(!viCv4?C?ts16QmooqD3(F&3B@pdwsg#7xL_%U>XVKI zCv5^xIbai5hHm$?VrYq0j@gT?#I)1eF&lRkmY!`Kv*Few+%t{^bM1<%tphe9eHWb$ z_axhii?x$%51Riu$4ml+$!Nm%j+yHfrsH(tdCAPjP&+zi<4(q8-^no>cL{2)vtu@# z`MtI-lC44hx+;bhRib0|dYdsDb#u&KZwp$iyJI$74(9A0js>f2MfG&RL@Y921dU3z z0IRHCl4W7D(AzPSK>i49y8C!mf))TjEE$Uq+t)*^3JNo3k>%_MW^RDeX`Rqd@4yP- z1;|$d1+|DL6VI^xWSIuG{$1JGDI<~YKA%%Y@!03 zZBnlm9HtOAl%Y`Pw8bChQnDqSKAln@?wHM`*=fG$m% z0r_dL78#D2vgMCNhac@&u+>(;7zb>iv@8lV*0Erl4K&UH8^|1HjF)U8YH5OGld$ET zDA{C`ev)LUT1iaX|FWX zgDeYXIbbid8<(E#m`!dsHXxaf1-os;IS!aW1<6>&&2=ouwt?n3V6I*;A1jUdj@gJA z7`qD`v*E^Ib(G~;u*_a;p#wJJWZaWk&JQ*-`=(SFlTjNUEN*Xdv{fJpD?Qtyk*W@Z@1im zthfoo;}y=5t+Mr%4s4vW(e1_m#MW`F$q<MVIhcKRA&zQF4a zWRLd$e!t-?c~uI%>A+U?Kpw8!x11%fNujqLNTEfD^gGVnM{nMBV1Hfu;Ed@wHQQoD z!}nf@Gl!#7df%blNB$CAZ67$ZN3c5wZTE-HY`NVz$fl2+$*yM)#OUnf2v=g5^ht5!5yJ(8D>TpJ7GG)Nc~}^@e!z<>8@Q(`7Ccf`$!#n!{jTom)=L+ zp{Kna-Dh@Ofb#{qcFi_W&1G?gHxMm`l-|>7(X26C^=F3 zuHy+O3Dj|5zhUzU1|lbfg!Zp)Na%=93<=qIQb-uAoE*{uL#Kd>ni?imr3$CA3M*!-DxrQGI%<%ur2xVCR_H5!x^Q|B-`!g+LLrvjA(l5#fbK!euyJJ1~v$Bq{W6I zj2)jBLN)2?-4h_mck7kO)492S^k*J=~uT#J{4 zIM3pxAV$wZ%!Fm~$~lD+!~2{#{uLPFm+BqTh385R=mf<}gfA=ucEaNjmDBt&Sc zBm4EmojB2Xj%@q66G595(5HydoRHAKEeL2QLc1iOPcevC781U~x&ox1MSc;}dcl4W z6y1rz*(U*giU8~g31Rv)B%IpM9VOf3i)&vvu!s5S;3IY5jgkYV1ONJ{JMdlMzVImF ztB^2y*&PzbF8dwX@a#aT|2neW_x3s4akKPIgr8z~^<9KJa2^guXiwn}G2$ft6eCvu zB}UZpcZWZtTiQOy*7Hw?a(;0Ur2aIqZEK2Xx$TP#X2pmwrz6~fQ&zxX@{Np93p#N7 z#qhIGi1X}D3de|@6p0a!nTkee_gpMS1fqD1*n5c(7uda*j1hY;6(jb3OoVptrDMe2 zkBt#~FXK>hW1-!9S%-3#7TRr=ixJx_A0xI|A;d-7QTd7y+HF<}ak1Td+9T-crj1jHZIWeN1=f;S7o)=;td*)lkh$@{QBdT;kg!U}8juCsmFh=bC zq7eJqyIm&NuW=|x)ZZS_wJ~Cw*Ey6U8f3TGA;!f=8h$iR&M_V9 zHRk_-9NilN*T;Lqsk$LTdssKdh*Q-uMjX~n4($opzHG-bgExn`+~O?`ty6O%LnC^Dy#wXc?gRI(EC zoG8$naFReD!pQ=C38xG6Bb*`7pKzwY00;II?C5LzsDTcX22yH}11Z(dp5wtW;v5fg zm^6`9hdR(z?KvLiFlj2Kh7+0z2uvmX zC@_tnmuQ{?+3-BO;pq;OUuCr!gx>^a5`Gt$MbIm8wgcJl0=wZk4&Bu=mynVZHjj`c zFrSbXSU@Nsu#iwtU=g8^z+ysSfhB|@0!s-+1(p$t2`ncR7g*sy0=L=*Zl%Mdgp^uE zC@HX-P)cA8;TVCngwg`*2*(PnCzKV~KqzP6NZoRiq>U-D@u<7yjoedt+4Uwu1%b_k ziUL~*l?0w6R2JAus3Pz@p{l?Ogc<@b5^4&(L^xjHWkMZ+R|qEvyh_mK@->1sm#-5} zkyYLxoGS1p;WUA_2-<$W?ZD>Ajz0E6c*kLKmaO(Jp`O4tLVbbv2-={&PiQD5J|Hv_ z_>j<8;3I;ztRFl0*%V0a=w~bUiNmD1thSwSw!jVta!md0&}65>q=l6Fl+aS(Gs1ZS zpA)p1{lbCNXOOMWe;m5ja2Mf1+0K^)ZPvabTqGs(3EDpGCR{8f_7JpZ-|N60aCZ8KM5{SPp%yy`T6cMhv`v4RO6K`CE)A`Fn^P zY{^40qU0YTuCyipj1eXO3UQS!`FD&c`A>+8ZOPPMI^>qaT)YD%vqD^COQvH)$pRrR zu_X(}h?0duTy0Ahju9n`gt*3*EE*$977KBey^|{*BkoO0#E5}NNr%bhk~pOt$jMk` zhfv3axYA!qoy53D*czB3vs_nQ)yz z6+#Drs)XwWsu6Aws7|<1pa!9%Kuy9;29DGsiXP`T`lhEX4!RZ!Yu;F z5pESYp3q644xzKa3544O>Jn}jIFWFNz)6HI0w)tRiB2KhDJ4!NbQL&_aF@X8gu4aK zAZR_#BxpU(B4|D85wsrl32kMg4G32VG$fP}XhbM1(3qe@$tDCHN;V~EO`8$4rp*aj z)3XV>+ZF^J@wIf&!&D=+eeMqY`trFz{cJ*e7QmbI+s#9L+X-D2vpn&><}kLUuZ>xr zWnUMux#hzX$PR}y8kXx1XZtKCWK%u+ytHG;i_L>Kv|~3N&UnmobI2>V%i-J-v%CXv z>tSpg&Q1|)O>R4!ag?_o#`aWo3E4c0w};c!@y|94tIgry!RlR(ZU4J{)pm27hO=W{ zWDowHh)o4?2JbtJ?M5C5d5zgNPSt}kODrD>d95CN_rut3`{BbG(dpq>j?z5Kx1}F( zEJwLs5B{;k85Mjy>sgKaA3&h60sW@bQs%u4?dhx!67lr)iCrh zwi_81v%J$a{4h49%|CPj>s#L=<06Y}nvM#&zd1BqN23p8yZbRA_tSGf_Hf2Y9v8DD z-h{&$r6)#g!j1DY>2OBr$srHYmcd6o9GM&K&r}1on-}s*bNayZLpIH)t@MJB z(N5y5E({q>9C%T{JItF^;*j=s&84U|6xH4oU zH+YrfhvX~-;Z4H#{M<>y20sYmugz~}Udz8Wyz%QI|#X&Y>txpelsnAT7JY@?e`sRXNTU%jJ` z{p`^90h>NX_y;oHQ8EL#KKf|r$9O?+bC`IS=cix+ItcTJPfh(CEWnPDAZEcY;ezGn z>BIp0X78`zg7s$C@~GvvV8M<7W{o~}Q@?Y8j$``R%k~i1z9n`Xj>7DE$H3a|U}~Fc z*bUeAHuMMA!2eY?r?*dSyx4W{K;%#E$ex$wpANwy6N106Ku>$>Z!^8qtZ!C07Skwu zDC=}HTL!cC^E&3ibSggwKhRzlrkzx|O!2c#@$zmqc}6~BRl&ibtmDk`ikaE-%xoph zV(a#k-uXHBj!Wgp@ayMQV45$rF|8G^M>n5rb?ezrh<}xX5B)Z9X1D)U4!+{n5QYQX znbpb6Hg>Z~4f)`16GBaarVb8eJ!w{GmYIFp%r?iYcY?6nvm?VNv06COL&b-tT1JNV zKhKE_SJAnV;nVu(IZGNzHCquH3!Lx3o{;>UA!e-$A{%O~wKJ{RFk=@+hJPk=5lnA~ z+F)9;?hXt+z;4~(<12cQO8el_izS7CknpM{k z9+A~M5FQh_p75x^4FJ1?#|3U=2@QNlf(HI3!jrPf&4i}}ZUNYhK5gJg-GB3>w<+=C zQFs5ha!=35t~3d?1^UfHaEL7>r^v)yPI{NPQL?yiXX~4!z}OOmLJM$ zX=d-t%${pzySmw=I>KrGs~bRLbGKV~DC=fZHajzWf|d1Z^bvr(JIy|I#hDJHEpZwfD-_RIGvf=_m6GFmQOQwW` zJDcet;Tg#6kZ|`tKO}VI3q!)EQx=DWalq1$@OJg`knp+b)gi4iv_2$!IdOAH_*TvH zA>k`6FNcKhYP=p2KF0obNcdRxdjaj}Y3QSn@C}h2A>m`}pNE7GsC^j{#y5LH!sl5I zgoF{rw;|yZ!T)oVd@XNZfA7G?+KvQ&b|lwwpY2G@Ut>gS{vIPT@sAkse|`P}+RHkf z{ST(?7{>hDzJHvXcNQ>>o+{CfAno8#*70V;1>9`XR~puWgdqZj2tx%56Z#1had0T> zB(uq)Zq^MciV?JDDNg7wTPQ)$uMd?ZXa`vefF>##Agdfh7%rV`X}8Lutg}olj^*-l zvb+r8YqJ?sqAcM{fpP?#FjJyDp}cIP0-=IHMM6b^N`y)Rl?jyvst~FOR0Y@&p*KH5 zFWR_Xvc#0Qsk|w5RL}IQaZfsss7@FtXSD{w_I2jt!-PRnq834i8np?-q{MLm8>-9Y zG#*cACs2o=|CQ$i!qrluF5y~%6A2vzP9oeOa5ABzz$t{A1x_X0DsUR1v%u+u+Xc=b zbP+g{&{g0p!rcP(2=@roC)_8{fbf7oLqa!!MubG5G2vl>CWJ=>ni3upXhwKKpgG|w zfwKwE2($p$OzbJ4Y)Kd_a1NoDz_|_%W!-A7nDg9hq9ff_gi@02=L7ugxPYM9(VC#y zaUnso<067)$HfHAjy43%j!Oud9hVX`J1!$=cC;mQmeX@NL9^ouf@ViMf@a5+1kH~2 z1kH}C2$~&N6Er)nA!v47OVI4Nj-c7mfuPxOJwdbM27+eCjReh(js(q)n*cUD-2H%q zLs?Im*x%x26TLmS)xn{xXUy_Wm__965cjJ&=yN+qhEDf3XNk7#w-cU~q`QNVBhZCl zZ=cK%-htfI^~P7Yx;jfvly3Si2U4gPhL3kgh8{UPGIYrIM23Ojy^&$qcVB3|vAz2v z!}cDC4BLA!G7M$9MYhS^g@~ zOrR&BxIiyL34z{(k^+4Qr3CsCjuGfbC@s*RaIC-pLK%U9gt7vI2;~F@6Uqw=Ayg0; zN~kC>j8I8nIH9sYE}@FR2trkXk%VdjqX^XnMiXiXj3Lw%7)z)nFpf}LU_9YCfeD1; z1tt>e2uvcJATXIwS73?*Z831yGc`2(Q;*Xk!*2xU!4^s zgtY>15!MO3O;|7R4q=19yM&E^boMrY?(uyt+$5zxAZ!-+kg!GIBf@h69}~6;d_s60 zkj~x?&^_+t!WX3Ur-T;;J|ny&tAFmTzRNANx8^V4F8s@o&_jO}5+1|kgY4+%bGguW zhh^|^XirG!*Y`TI&B|B3@c(xA!SrzUhs#If3C4lY`sE&}*K3e$FumSs70f1&s@MB( zv@<+^`#Lf_YWpTKyqEB8Xk+t?eHYp|e3IyYFnhq};Y2En?_ZR}w0bGePxAa^&s%uj z((`jYKhN`ap11e>R?l-h|HJcCR;Hc>Fs=10;&~&_n|eOn^IXrTc%J9^bkDbW{w=lOe{@ACXl&r=05+c^Q#x}7sTZ|iw`&!6->$MdP4PxJgG&tLQWW4if9 zd_hx(wzw-WX`DKkn~UeCSutWLosJRDPz%I}r>F&E#06X^Mm$L^93!5k7Kss0Q;Wuk z=c&bF#1qxxG2)qOi5M}yC>bN3tCorpPgakK5zkgj$B3t^$Hs`~t7T%u6V|dZ;u&kX z7;)!RK1SSiRETl2!HO~BCon3-h+i(L9N~x@gH>Y0Gv2B(qK&K;BW{kW$A~ArHDbhl zXU!OK<5??4JnyX?BcAvk7b8A&a(s+<@3Kyecn{}<81dd@-5Bxa=mjFSwmigB{R)iF*vQg_xc z*<{**QAgdKt%>(G)l^|^jMEIRixIuo`WW#{U_*=;HEfI#B}R-N zo{JGr0k+172J-nB(LlZsBO1sTV?+b_QjBOIUyczCE<*(3ACrhyjdITH@M$b2Uo+_N#e$yhZw(0CvnAZJv@Vv9oo8>?pZaJ|{PX&`DsZ1AE{6jXs7ZgoLJKVn}F6COJy_>vKy7a=SFe{u9$7$i=m*^`B4Wg5xe zYE9XMk#HW-1`MlCCuunhj%PSbPLLy?>A)WO>u4Beg@k5dwxdMf-kRe;RzsIMm!$i{ z5PP1(q_e4*f%y((Mch~{aFpC9bz0~^qJfrtQAp?p7L(+HK!ldi>}dckb(B0HTVLit zp5-h@Te}>l*WL;)x7!$Qwy`oKj3!rwgv?tV5)yk&K(FQ)S{o8>jn;*P8>96kJ(;)* z*%0GYQ}vBNTXpkPrl^_LmaQG?UHpXYf8&#(7gp5N$sXV3FI-|GBGeM{qHtI5ebDjwaV zO7q;*+u_%4hbEDK^*mJ~b0V8yS`)ds=N&x1!Sn8(Kj!&J&nI|3#q;@|FY`QAGE<*R zF|BPy4yN0hZcHD0t;7}HGe%tFy<)^w-aAG-{^%1U`kB5lqS5acBUP&sTW<$$5qJlQl6Lgyo~4N zJU_+rQ$4Tmc>~WIdEVIbvpsL&`9+?$@%&QH+j`#4^Y)%!<@xoV-{AQzo_F!QtLOK7 z-p%tKo~O!Z&hyQf*7JOe=eK*FXW6YT`VvIQ}MvO6M$A~fJoEZBZsU2;ayky$ZhLw))-oOkF;=N(; zIxj{HUgyV%!Rvw;F?d}VBL=UFV#MHeaf}$eE{PF?*QGIH@VYEU3|^PVh{5ZM7%_NV z86yU-t7639b#;swysn86gV(h&V(_{yMhsrp$B4n}h8Qt;-54VVubX1T;B|A17`$$Y z5rfy~Vw`3=&#gc=Lc+9OSpRrlq)Nt%VOq-<_q?R%bU-_YzF&`DyR@OwX5j{=4U?YMJd6$Fy!IRXyXy zFs)wP^QN9R^Za7Z+k1Y$=iNNd^?an~^E{vL`C89YH8S-qf@!U1QO}EeUc&RHo}cY` z3(s46ey-=|d47rK?LF`4d1ueNdVZJZ*`D9y`Ebv3Js;`$D9(T=XqGKiBh)o-gx!x#wFw|H1QrJfB!6 zv)`0?2JRY+2QjVn>E?M4&vQJ#ux_S&?pc}b{D^6HBI{+mUZae+!n8J29XwB6nDI6j zXUeDU&Uo{CGTsW)x}8p*clP`q&mZvoInTFx{)XqE_>7KVbINmLsIG>+zK1{21|+*w2Ki>Ij)Qm zPdVDhh^HJ^#fYaISI3CYfLs$J-mJbhM!Z>lU5t3Mxo7t?xN-8_HV^Bm6ydYn3rcpHKYL-_f^=_sPXJT6G zP|x!=p11e>CC^jaGTZqD)4HA1dl^3o)9R(OkA7i`c4o4G&^Q`XSK+!8OeYw5!0;)Ql!W+BeO)_9>?bE!F!=dnxi!rUf)$vlSO{y5!yl>9?ermcx`a=Cdiwa+5xSBujG z{c3Rmf_}BQAVI%cT!_#?Hd>gVUo9>|(61I3CFoa+ixKpz#l;DoWuqksw+oacbP*^; z(61IBL%3T?lqTp`i;pGfXD`YS^sB{X3HsIIas>Tqae0D%wYUP|5!r1;f_}BQ5<$OO zT$!L>Ev`b)uNGG&XymF9G;-Am8o3$-ja*HFMy?h?BUhV%$Q_~UX;LqF!*o6O9%a{K zJ|E6KX-XVV(3Ge{(3CiV&{@uFU4o{>i3ClFlL(p;ClfR!P9bPYoJ!D?IE|nwaXLX$ z;tYbO#F+$5iL(fr67>k067>n15)BBN5)BEO5{(F&5{(I(5={u25={x363qyj63q#k z5@!>T5~j&$LD0yxBxvN$A!y{zC1~W%BWUDW5j1k=6Et!c5HxbF2^zTz2^zVJ2pYMI z2^zUJ1dZG!1dZIK1dZHf1dUu^8o9>_ z8o4J38o4J48o8$k8o8$l8o6f(8o6f)8o3;TMy@A8BiDL+g% zOr<`kd~~;5=EFwZlcq#Jf~G`&f~Ld(f~Lekf~LeEf~Le^f~Ld}f~Le!f~LeUf~Lf9 zf~G_+K~rJ`K~rKRK~rKBK~rKhK~rK3K~rKZK~rKJK~rKpK~rJ^K~rKPK~rK9K~rKf z!KOqydkR3?#;IJW*YPxh4Vw8m1F!T9F0|oEXV3H&&gMc5#2kVRL^^w}S9(4d>M379 z&{MvUpr?Eh!JhJT_F{k@$PzBpv%Qp{XL}hz&-QYHp6wL`J=-e@dbU>)^lYyt=-FOF z&J33|#m0Q9&va-qFM(%GB5g`2rhuZ}GQy*i#FXi&Bi^y+w?pjXEW z1id<5B-l`;vtI&e{a)rmjnXRwy)a%S=!NkbK|}RAK|}QhK|}Q>K|}QxK|}R6K|}Qp zK|}Q}K|{5TprLw?prLx7prQJJU_(_P`$K{@X&(`6yb5H0Ot9CC`Iqek4cc~s25kpH zgSL~PLHm@TLHmrLLHnGb*Vh*Wy}tfK(8%o~Xym>mXym>kXyoz<8oAvBjocoBMs6=b zBe##Bk=swu$Q>YPQ0{@jrs5 z#6g0l#P5Ff#sty4uV)W}pKXk;oAG%{5P8kwpDjZ8IyMy5K!MkbwI1E5u?$%Pt}S_B&u^M!hX zUQWjmG&08%G%|Gv8krLadO6i4=;d@GK`*D12pX@G2^z0c2pX?b2^z1{2pX@`2^z06 z2pX?533@r5MbOKs9zlavpP)f&K+vEyBxukY5j1Fx2^zE}1ihS^67+IvM$pJLC+OvL zHbCRtf(tchEeRU5a|jx=a|wDmod?kEwcq3H!m-)$dfbQU8 zF0`RaXSeYdUdDwQgSG^X!Q}*v!4(9JK|6xR;7WqVpgln^oT~s@zpJ?rr~gR(S;J&o z!BlGIQTJ!pa8G(gUQ5s`@;ZVBw*x_gdp$vedjmnQ$QucIMRp`;gl{5fgl{Hjgl{2e zgl{G271@cPS7c{`UXiyE^oqQlpjYG_1id1=5HuU^Bxp8tC1^I>MbK=xo1oc{P0(z( zhoD#Fy#&1??<43Hc|SoT_W(g7_aH$d*Nvc&dx)TsO9&dd?gWk8!vu|74}wPS5rRhU zQG!P9F@i?!ae_wf34%uMNrFc1DS}4sX@W-X8G=UcS%O9`hoF(`NzlmkB534#6Et#t z2pYM*1dUujf<~@CK_fSSpphF$(8vuUXygVHG;%`-8o8kajodJTMs7GkBbQ6i$c-Rq zDnTPR zji8asBWUEN6Et!&2pYMW1dZG*f<|sOK_fSZpplzP(8$drXyoP-G;#|F8o7l8joc!F zMs6`dBe#U0ky}d8$Sosij;_>>j|0?8wi>b8wr{cn+Tc`n+ci{TL_vG&k-~wwh}ZYo+oHZyg<;D zc#)tf@e)B(;$?!S#47|%iB}1l60Z?7C0-|JO1wePlz5Y%De)FTQ{rucro=l0O^J62 zniAUxdNIF8(8#?{(8zs2(8zsA(8zs6(8zsE(8zs4(8z5kXykSfG;%u$8o5si8oAF1 z8oAF28o4hB8oB=vG;+HL8o4hC8o93s8o7LeMs7DjBe#d3k=skq$n7I&az7F@az7C?az7I^a=#EX za=#KZa=#HYa=#Naa)$^SxjzURxjzXSxxWY+xxWb-xqk>6xzxwzUZO2pPmNp_K_izY zXyghIG;#$A8o5FQja*@ZMy?1!BUhB5kt;^f$Q37OR$C|JHKk&lcq#0g3PDriRD!0&X#`D)(+QdqXAm?c&Ln6`oJG)-s7KJ0s87(8Xh6`E zXh_hMXhhJ9xiLW_*My*vYf8|_H6v)`niDi~XA?AXEeIO9mIRI5IRuT|xde^ec?6AI zD}qMue1b;q0)j@aH9;eHAweT|5kVt&F+n5OhM5Jc34UIzb~hgP@U{Nzlm6a$tXu z?j?LVV0J*Stu-H{p99kO0p_{IiTO?qK9M?~Fi>CtVUYgn9bvG*B7*rY4z{tFV7`O{ zSV9;ku#_-dU>V^_f#rl;ffa-i0xJo7&9!XyvWhTLN~|V~5?DhREwGj_MqnLbtiXDL z)^r15oRru|7%#AiFhO85VWPkm!X$y`2$Kc25~c_|@8DH(W3J53MRy4un9fP1(nO|`uQ zJq7y+nrizAnra6KdXoN2&{X@Hpl9tHf~MNH1WmQ?2%2jDBWS7}BxtIAPtX(n17WO$ z;zxqk^e2Mm-p>Thy7ja)*|$aN=Zt;aBe9^7z(9)2!C(_sWb(_th*(_s`r(_u70YdVIY=`fa{=`fC< z$15V<3De$A6F zOy^gw`qAF`E#savC6*KPM6V!dN~|PkN~|JiN~|VmN~|GhN~|SlN~|MjN~|YnN^Br# zN^B&IlML8Q&@Ag`j8bRf5*z zHG&@8>jXXgHwe>kwCU`(0QzX~9WE@Fws(^6626uPZrcc73cN=sD)2s`ylmqGLIr^j z2^9rCB2*Iim{3{Z6G9b%?F6mq4uaNnCqZlaDM4%c89{6MIYDds1wm{2AA;6&7eQS}^3Bb_~Dr@PY9*^@A>p6B^=&zE_g`cI~O zEle+zZPxYtG|yAJGUbb4TFV#pyo%@5JU`y^I-b|{{6x=BqZi1ohv~MaZpoZ1+k(_5 z%oS)rm}lS!eNxkU$u83;J$cl9QbX=(zU;aYVSzwn!a{*2ghc{P35x}q5taxvCoB~> zo3Kov1!1{BOTtQla|o*h&LylCIFGPKpcP@Q!1;uA0v8b03$!L|5V(-AQQ#uNCV`6y zn+4hso)fr)@VvmKgck%ZBjm_`m}*OSLrPpum?>}tVU|EU!kYqD5?&K%@1Te2AW|RT zM~|;^Mb21Pf+oaWgqNhm-2{zp zHerU8xQ8%X;9kP30{0P~l^nXC@H$GQvmXFxBR3q=+PLO=p87K5XJA^(*Yo^b&s%wZ zndj|1Z|`~TSDEcE#k6jJtLKM2|Ht!Gey04k-I?ti!nAH@*S?JJ!?gN-&%g2fThIUJ z`9aVB@jSIZv;CJbt=oUq^H1pJ=gMZ-_rmdSx z^E)$*OEVd6^48QYi;ydjCX5m&Ko|>1XBPzM_6l*~d?{U+FhQUQVYEO|!c>7`garb{ z39|%B5M~RMB+L;gMVKpa3}K=`X+oaBv4j}{WeAf6$`WP@lp~B6C{LIqP=PQ)pdw+U zKqbN$fy#t&0#yi81ga9I2~;CY7pU&wXN+=oplPV#DA_MvV@(IP%uf8abgh7P;HNcf zgEY9uxy6a*#_FkC8Jv)uKP-EYips{a4(AYO6*x0AD zn*nrt&AHHqJ)M2Fx3C2l+K8vKTY3vG;6e>cYj0s2F4QxBiMQ}lF0^Mpoqd^Gc%)9R zL9)+8xNVK2eJI$Ld$rL_XJ792YI5=lF4RD_BWNJ6B-lWvv)g;CU&VzQ!>b7z!)v_K z*K(naq4_O8Z{hV^sL{H?TX-WEYP33f3vc2=jn>WH!dtk|UYP0ZTfK#yxNxsrM4i2b zw{f9fkGB&v@OOBnyKtdik9T?t@8UvjmG35KtDH^Hi}D_Vy(rV!_X0F|@8d$f9`7e; z7#|>L7#}3)_1KM|*W*J3jb%d6Sat_!6&~h7y&iiI^m=@Rpx5K01dZ@x0Nvi>T&T_P z69jFBpCo8A{1jogMDJ;UZtoc`+#?I0^%mxEq4vu?2^#BO1nrl56Kub1{tG9;2HgB8 z9zi?jegy5D`x7(`1`sq21`@P|7zEHm8q9^-EDs@Q8Vn_98Vn<78Vo0B8sri*4Mq?& z4Mq~QUmiu!et9%Ob72fYb73q&b734o`{nTj?UyGIG$AGuG$AGt^tzu6(33Tt3pJuM z2pZ9u1RZJ3@>ZYCg&NE`1P$g~f(COQL4!G;put=K(E2UpLJj63f(COjL4&!3put>9 z&|oejXfT%(G?*(08qAdh4dyBWf_bElsbO-!lvsJx9n)&=NwZ`PL9=8nL9=8XL9=8% zL9=87L9=8dL9=8Nz(ygReGt=nWAKCLse>6m9n)IAp68=I&+~k#=gU3c>iP4YZ}a>; z&wrtt`-bmL9q`EfiFCcwO}CxS%-6?!fy{gZ%ooheH^h9Q%zPuv7tYK##(a^?d=tzU z&CEB&e6h@YGt3vy%r`&X3_eR>-kwKuo9mV(=gYf9We67tlqIwlC`Y(ZpgiFsfeM6+ z1u7ES2vj0mB2bxdsX!INWdcJY9KIDv4TKwUxyffEVW3!Fr_LEvPIrz_U zr#VmbTPLRz^m`a*5bl=SpEDioOh5XBNszNJuL)AmEpxx$U!R~~b7?@(9X2HB*IXJA z^lL7S2^~z`O{JR<^lL6n3HmjcW`vt%mF5Kfn#QH=5jtkPwxc;{hCW_f_}~ALV|wH`dSNh&jh?-F(tn!hX4fo$2mfOo1!he9}-JA-8j|vp~0Q*u<5D^rLr}L}`zC zO_X~w%kIC!l)cxR?{cJ`sZsKS>6xn4Jlb2P`@9_`rc(ENmCDU5>vE4-HiFC2*-J33 zUBzCyc@Ff0yRZtIGn?OYV}4KkkIAf%d#%jxg{OaM$4Nn))pT|NfZeQVUAZuki?)n| z9;R?=&tm)o$FiXfA7ZRrVEMiAJ(lv$k~?K%6&%N}7^1MzQ18w9p*4xYz03~fFh8#fAUPcHs5YvaK7Zpbm##96XS zcG{GHw-QZ>W)5sE_Kn7s(%jk4HuneOf%@6bY`HyS@j$#qU`SpkkGefe*|WC=Eyq=%4aY;utGSN(Pi2_4&2u`t ztLLd7Grs*7w~uu8XPDOV-+F$~^S?Y#{hBHND5kYFebV!tp6~Mf8_y4V{=Mg^-!j`T ziD}*bv7TSzd3(=0dfwUd0iNf2zQprop0Dsc^?Rm1*B;8$r!%JYyglIjNL^mzGYZoh zz|o$+NiUFn5YuhVRh{UEl)fi?ZPcXv4}>oTekACJlzt-Uhm?LMRFKB$7lM9B=~se& zNa;6%en{zef__Np5I~P6l}a=GyXKf_=W{cD_S%fM!nCGK&2<^CjcN56?__)#rq#dv z+PN91{AQ+cwru0MdmY}o%Zd!|8>T~BkLJGs%_L&#U|t`*4_%OmHfHx`i~$NcOBP9g zU)X`{bqn5FEE3qB9Q4mcL+gnSrdVjb@L#EmJ4+VJ4oWzXKA|^0mr^pY{E_%C)1_!~ z2;;GbV;m++WNW1z$kzIzXFoPFjDN~RhIe7h(qs>#@o%up5pk08M`HL;KCnG~@m_lc zXUVT-Z37h@^pLHM!Kktl5nJ2S56ybz$n5Yeu-zLmqN*C$o_>prRdbfSF2`Tpf$VjD z|7oUF4Ts6ya!J&5AZKYnZ&RpNVELo4V(q~83_$RY3vFOOW5+v7ev^Z*<3M&W5U2Nq z!1709Fjd!C@`lv^M8Z;mlL*TMPA0r5aEb%j*AV>U`%@!BB~NpfjF%NpcOWYc#Xq4x z!&$Oi3Z3ad3t`lKR%96N)Qb#PXZ^_V7J4I^q{Tdhu`$u?G_|iM#;r{P+cO-a$fl7Y zM$Krl!Ns@-Ximfi_YB8Bn>{-+eC(k`Xt_8~Ekm;x-#MY>qMbQ6v=IZ2)CD$4{xH@1 z`Y5}=0@>$9JHsbgT7@t`Qj0`98qR__nG1kUe@{Z)l zB@QG<#^P*W8X0orve3q%-E14$ImZh7*cbX<=(uzSm&im}b3f$dq2Va#LBl5Vo%;|`>nD|1YtCqi3+ zWPXw+RbPwbdx~hQz8WXzX_^*9h@K%zL0nqTMux^ACo+6At7m9yryJ`P8IrPhVEK9Y zoLis3_N+zc(>Jtr$lZRCpvpDGlrmT8RhV2)NTI&j4e)#3?ZKsSpH0OE|UY>vjy9m z654Y}%Bhi|`JWaU#-(|I?d^plo*r2KER33GM22zhOlQd|IrFm|=sBH)q4aDbj&`qo zP&p^GzDFDfG)?|CXY`s{NBi`5uG^Un>fXLXOr_>IOWu{L&nKh`*(_S%z=nNqUz~)6 z&XU!#)*=T|s2{qR#gU;kSP~g7z@?$}#|_IeXUQ7b!E(Y7ffWv9j{`6;Ss596ja8uy zoMLQsXoHaPYeE~0h^-B6DE6_ACYSOeoW=D-Q@PaMA!r*mgf#z1eQM!4epD9?Hz$~FGYra@a51( z;;gw;NH)zs`DQqxz!m!qP0rIqto$v})_5V> zp6>$7UxuOF{{q{)2mv}slMT+m(Dr+x-QZ#z+7E%{FUM*5F|fUh(e(Zl+7g_qpPeNW z<+S|bKu*gNJfQfMCN)`rF7&q$r?0|Y%I_i0T!&( zzd~DyUH={0a-5idLR*EqzSQsj^S!;R&_-oBOE$;>rwMri1sup3SdG@MU}R`d3Wc@? zxm}nhhqVe<*@CkMqM@isv<3T3Hur6{V0zzHJ6t{hEzWVyk`Lt2k9Q!4J`f|5 zIyBka_yGn_AlkhRLJw3oGW1j@(q!eys|}tMVIJC`lZkeVLvh`o6522{5T^!~zX84a zX@TtPqd?Xb--+@$cc5mElUJxU?nAQ>Y z!T99D7_s_AM0IBr*sxu3iy`^>!z}V_Gnrvwa>Uuj71@|pQobHGWW6Lgq?H+(0|4y20 za0Obiu0*@RmAK&U3T*eFJY#nUwr?fc)9lC)!Fxhmg?-#hlO1nCt?wh+9k0g9_XoCn z2%a815ZJ!8Xv7{2Z5>Wmx6sxj{0{}Td&sII4F;Mg1@qi`ub72#;a=4m2!vA-vh;u)IMWh}DdS)vqNW-Nzh3(g#hmZ~Qa1$PferF#Xo zzZcrb-l6sBZLCjVyK~W1_6=-*ADozef$dp<{kq8 z2RlsuG8;88#DQ%u_76aRGBmU;Xu^jDwtECF^5KE)AA|v8Ze%#%5s{%S9vRr4LFhV0 z1-9Qls2Lp@%8iK(qq(u64Mu}JjwUB?5!$%%4wFfeS`!?|85n}vO$==)5^GXu!*Js| zIkX`tHzl-TsNK}ih9i>GoF&goMe-a-MTR1X(?hdwZO(`ckECWshFH&{$>H14%t<4xjX=!8_H7%pb%3DyyN-%IFHYVmWM9xg}`=?!)@A&f$g7;=Jq9LNl$sx;bjNXde60|>=h!;|NfbH zRR3yZXn9@>Z1;FHc&`Vxee!)F)t5Y$xfm@q_u;MeHz*tw921_ zwicc7=QO*QyqU;`FNk)78*z{NA7{y@a=Ldpkh42)9Ip2-V?+b~6%m^|&uGv3mvX@-k zDE&#a8(e@Y{za35Bhi=r?J)Vwlr)e!vYXJ8}FXO+-4p&nHu!+mzO$gqRz&XOUr zgBlK`y;?9n$Mn!OfwqS>zx`N`!OV6JVjAU- z)N|BNikP0`$J*xqH6CM%=A?c|Uzt_1@WIrTS%nHG0}Zu1<))p5AAY=B_5*h%h)03| zBxa@5&JvwEJ#uH#J^R52I(6Dw^E7u1)Ef2ey%2kZ}g`U^YQakQreurq&8j};N>Q~ z+=7?e@Ny4cp2ABmUS7t_+j!ZFmy^t4Bn|NL6kdAbr7vCv;AIeAM&e}(US{CsExde% zmjie?$DD$s4PLVG@*rM%<7Ek6R^nv?UN+%n3tqP3SGB1aUw!HtrEA7YtdBJiSMQA9xR;7!b|B&IVBFJyJlq-&MlaG-T20NlswqJz`rZ}|M@JH&%JZ}MR|4dy62rd;mUc}Eo->0 zz`AReo%7xq=WnZi{(BWKc&|+BFw+07@b6jrH#IUX-@n(xzt_XR*TcWp!@s@gze9(A z$4h!U@NcL1Z>RWgr+9RoVtd?x|9`rGQ1bgO=~St*I|>%>eaVi(C41lfeSxe(rN6XO zh0=vee_uFNq?FMj10@QOOi?pkR;J4p zGt=c$MULs6{e6Yvg^vBcqD)sRVWum~bd{23x~fc9D`lpu%XE!n%ydneu2tGh*Ouwy zjy2QA%XFPGX8Ht~u3OejpD5EOl{3>P%k(Mb&Ge}IJ zOJ>f`s%_>j(7D!G$C*JPby=C0Mb>#|NYbLKgn4bk;krl`y@9#PtQKAm;0nR`a(p3OSX%(Y5u{L-zm z%&hq}I9s%J`h3iqpMJBm7o{)2tofZcJKHAR8nfm{-R$h8=?gJye!Ot-GqhtU1#q|Uu9;0EO1R$ MsdUd`_8Ia218|vI{{R30 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py new file mode 100644 index 0000000..1ca9ba6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py @@ -0,0 +1,112 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re +from typing import Tuple, Optional + +_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data: str, errors: str = 'strict') -> Tuple[bytes, int]: + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + + if not data: + return b"", 0 + + return encode(data), len(data) + + def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]: + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + + if not data: + return '', 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + + if not data: + return "", 0 + + labels = _unicode_dots_re.split(data) + trailing_dot = '' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result_str = '.'.join(result) + trailing_dot # type: ignore + size += len(trailing_dot) + return result_str, size + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + + if not data: + return ('', 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = '' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result_str = '.'.join(result) + trailing_dot + size += len(trailing_dot) + return (result_str, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +def getregentry() -> codecs.CodecInfo: + # Compatibility as a search_function for codecs.register() + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, # type: ignore + decode=Codec().decode, # type: ignore + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py new file mode 100644 index 0000000..786e6bd --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py @@ -0,0 +1,13 @@ +from .core import * +from .codec import * +from typing import Any, Union + +def ToASCII(label: str) -> bytes: + return encode(label) + +def ToUnicode(label: Union[bytes, bytearray]) -> str: + return decode(label) + +def nameprep(s: Any) -> None: + raise NotImplementedError('IDNA 2008 does not utilise nameprep protocol') + diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/core.py b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/core.py new file mode 100644 index 0000000..4f30037 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/core.py @@ -0,0 +1,400 @@ +from . import idnadata +import bisect +import unicodedata +import re +from typing import Union, Optional +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]') + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp: int) -> int: + v = unicodedata.combining(chr(cp)) + if v == 0: + if not unicodedata.name(chr(cp)): + raise ValueError('Unknown character in unicodedata') + return v + +def _is_script(cp: str, script: str) -> bool: + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s: str) -> bytes: + return s.encode('punycode') + +def _unot(s: int) -> str: + return 'U+{:04X}'.format(s) + + +def valid_label_length(label: Union[bytes, str]) -> bool: + if len(label) > 63: + return False + return True + + +def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label: str, check_ltr: bool = False) -> bool: + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {} at position {}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = None # type: Optional[str] + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label: str) -> bool: + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label: str) -> bool: + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label: str) -> None: + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label: str, pos: int) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == '\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + return False + + +def check_label(label: Union[str, bytes, bytearray]) -> None: + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {} not allowed at position {} in {}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {} at position {} of {} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label: str) -> bytes: + try: + label_bytes = label.encode('ascii') + ulabel(label_bytes) + if not valid_label_length(label_bytes): + raise IDNAError('Label too long') + return label_bytes + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = str(label) + check_label(label) + label_bytes = _punycode(label) + label_bytes = _alabel_prefix + label_bytes + + if not valid_label_length(label_bytes): + raise IDNAError('Label too long') + + return label_bytes + + +def ulabel(label: Union[str, bytes, bytearray]) -> str: + if not isinstance(label, (bytes, bytearray)): + try: + label_bytes = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + else: + label_bytes = label + + label_bytes = label_bytes.lower() + if label_bytes.startswith(_alabel_prefix): + label_bytes = label_bytes[len(_alabel_prefix):] + if not label_bytes: + raise IDNAError('Malformed A-label, no Punycode eligible content found') + if label_bytes.decode('ascii')[-1] == '-': + raise IDNAError('A-label must not end with a hyphen') + else: + check_label(label_bytes) + return label_bytes.decode('ascii') + + try: + label = label_bytes.decode('punycode') + except UnicodeError: + raise IDNAError('Invalid A-label') + check_label(label) + return label + + +def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = '' + + for pos, char in enumerate(domain): + code_point = ord(char) + try: + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, 'Z')) - 1] + status = uts46row[1] + replacement = None # type: Optional[str] + if len(uts46row) == 3: + replacement = uts46row[2] # type: ignore + if (status == 'V' or + (status == 'D' and not transitional) or + (status == '3' and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == 'M' or + (status == '3' and not std3_rules) or + (status == 'D' and transitional)): + output += replacement + elif status != 'I': + raise IndexError() + except IndexError: + raise InvalidCodepoint( + 'Codepoint {} not allowed at position {} in {}'.format( + _unot(code_point), pos + 1, repr(domain))) + + return unicodedata.normalize('NFC', output) + + +def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes: + if isinstance(s, (bytes, bytearray)): + try: + s = s.decode('ascii') + except UnicodeDecodeError: + raise IDNAError('should pass a unicode string to the function rather than a byte string.') + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str: + try: + if isinstance(s, (bytes, bytearray)): + s = s.decode('ascii') + except UnicodeDecodeError: + raise IDNAError('Invalid ASCII in A-label') + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split('.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append('') + return '.'.join(result) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000..67db462 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py @@ -0,0 +1,2151 @@ +# This file is automatically generated by tools/idna-data + +__version__ = '15.0.0' +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004dc0, + 0x4e000000a000, + 0xf9000000fa6e, + 0xfa700000fada, + 0x16fe200016fe4, + 0x16ff000016ff2, + 0x200000002a6e0, + 0x2a7000002b73a, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + 0x300000003134b, + 0x31350000323b0, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b120, + 0x1b1320001b133, + 0x1b1500001b153, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1aff00001aff4, + 0x1aff50001affc, + 0x1affd0001afff, + 0x1b0000001b001, + 0x1b1200001b123, + 0x1b1550001b156, + 0x1b1640001b168, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 82, + 0x857: 82, + 0x858: 82, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x870: 82, + 0x871: 82, + 0x872: 82, + 0x873: 82, + 0x874: 82, + 0x875: 82, + 0x876: 82, + 0x877: 82, + 0x878: 82, + 0x879: 82, + 0x87a: 82, + 0x87b: 82, + 0x87c: 82, + 0x87d: 82, + 0x87e: 82, + 0x87f: 82, + 0x880: 82, + 0x881: 82, + 0x882: 82, + 0x883: 67, + 0x884: 67, + 0x885: 67, + 0x886: 68, + 0x887: 85, + 0x888: 85, + 0x889: 68, + 0x88a: 68, + 0x88b: 68, + 0x88c: 68, + 0x88d: 68, + 0x88e: 82, + 0x890: 85, + 0x891: 85, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b5: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8be: 68, + 0x8bf: 68, + 0x8c0: 68, + 0x8c1: 68, + 0x8c2: 68, + 0x8c3: 68, + 0x8c4: 68, + 0x8c5: 68, + 0x8c6: 68, + 0x8c7: 68, + 0x8c8: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x10f70: 68, + 0x10f71: 68, + 0x10f72: 68, + 0x10f73: 68, + 0x10f74: 82, + 0x10f75: 82, + 0x10f76: 68, + 0x10f77: 68, + 0x10f78: 68, + 0x10f79: 68, + 0x10f7a: 68, + 0x10f7b: 68, + 0x10f7c: 68, + 0x10f7d: 68, + 0x10f7e: 68, + 0x10f7f: 68, + 0x10f80: 68, + 0x10f81: 68, + 0x10fb0: 68, + 0x10fb1: 85, + 0x10fb2: 68, + 0x10fb3: 68, + 0x10fb4: 82, + 0x10fb5: 82, + 0x10fb6: 82, + 0x10fb7: 85, + 0x10fb8: 68, + 0x10fb9: 82, + 0x10fba: 82, + 0x10fbb: 68, + 0x10fbc: 68, + 0x10fbd: 82, + 0x10fbe: 68, + 0x10fbf: 68, + 0x10fc0: 85, + 0x10fc1: 68, + 0x10fc2: 82, + 0x10fc3: 82, + 0x10fc4: 68, + 0x10fc5: 85, + 0x10fc6: 85, + 0x10fc7: 85, + 0x10fc8: 85, + 0x10fc9: 82, + 0x10fca: 68, + 0x10fcb: 76, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, + 0x1e94b: 84, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x87000000888, + 0x8890000088f, + 0x898000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5500000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3c00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc5d00000c5e, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcdd00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf4, + 0xd0000000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8100000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8600000e8b, + 0xe8c00000ea4, + 0xea500000ea6, + 0xea700000eb3, + 0xeb400000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ecf, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x170000001716, + 0x171f00001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1abf00001acf, + 0x1b0000001b4d, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfb, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c60, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x310500003130, + 0x31a0000031c0, + 0x31f000003200, + 0x340000004dc0, + 0x4e000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7bb0000a7bc, + 0xa7bd0000a7be, + 0xa7bf0000a7c0, + 0xa7c10000a7c2, + 0xa7c30000a7c4, + 0xa7c80000a7c9, + 0xa7ca0000a7cb, + 0xa7d10000a7d2, + 0xa7d30000a7d4, + 0xa7d50000a7d6, + 0xa7d70000a7d8, + 0xa7d90000a7da, + 0xa7f20000a7f5, + 0xa7f60000a7f8, + 0xa7fa0000a828, + 0xa82c0000a82d, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab69, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x10597000105a2, + 0x105a3000105b2, + 0x105b3000105ba, + 0x105bb000105bd, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1078000010786, + 0x10787000107b1, + 0x107b2000107bb, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10e8000010eaa, + 0x10eab00010ead, + 0x10eb000010eb2, + 0x10efd00010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x10f7000010f86, + 0x10fb000010fc5, + 0x10fe000010ff7, + 0x1100000011047, + 0x1106600011076, + 0x1107f000110bb, + 0x110c2000110c3, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011148, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111ce000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e00011242, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e00011462, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b9, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x1174000011747, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011907, + 0x119090001190a, + 0x1190c00011914, + 0x1191500011917, + 0x1191800011936, + 0x1193700011939, + 0x1193b00011944, + 0x119500001195a, + 0x119a0000119a8, + 0x119aa000119d8, + 0x119da000119e2, + 0x119e3000119e5, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a9a, + 0x11a9d00011a9e, + 0x11ab000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x11f0000011f11, + 0x11f1200011f3b, + 0x11f3e00011f43, + 0x11f5000011f5a, + 0x11fb000011fb1, + 0x120000001239a, + 0x1248000012544, + 0x12f9000012ff1, + 0x1300000013430, + 0x1344000013456, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16a7000016abf, + 0x16ac000016aca, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f4b, + 0x16f4f00016f88, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x16fe300016fe5, + 0x16ff000016ff2, + 0x17000000187f8, + 0x1880000018cd6, + 0x18d0000018d09, + 0x1aff00001aff4, + 0x1aff50001affc, + 0x1affd0001afff, + 0x1b0000001b123, + 0x1b1320001b133, + 0x1b1500001b153, + 0x1b1550001b156, + 0x1b1640001b168, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1cf000001cf2e, + 0x1cf300001cf47, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1df000001df1f, + 0x1df250001df2b, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e0300001e06e, + 0x1e08f0001e090, + 0x1e1000001e12d, + 0x1e1300001e13e, + 0x1e1400001e14a, + 0x1e14e0001e14f, + 0x1e2900001e2af, + 0x1e2c00001e2fa, + 0x1e4d00001e4fa, + 0x1e7e00001e7e7, + 0x1e7e80001e7ec, + 0x1e7ed0001e7ef, + 0x1e7f00001e7ff, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94c, + 0x1e9500001e95a, + 0x200000002a6e0, + 0x2a7000002b73a, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x300000003134b, + 0x31350000323b0, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000..6a43b04 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py @@ -0,0 +1,54 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect +from typing import List, Tuple + +def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start: int, end: int) -> int: + return (start << 32) | end + +def _decode_range(r: int) -> Tuple[int, int]: + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000..8501893 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '3.4' + diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000..186796c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py @@ -0,0 +1,8600 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +from typing import List, Tuple, Union + + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = '15.0.0' +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', 'a'), + (0x42, 'M', 'b'), + (0x43, 'M', 'c'), + (0x44, 'M', 'd'), + (0x45, 'M', 'e'), + (0x46, 'M', 'f'), + (0x47, 'M', 'g'), + (0x48, 'M', 'h'), + (0x49, 'M', 'i'), + (0x4A, 'M', 'j'), + (0x4B, 'M', 'k'), + (0x4C, 'M', 'l'), + (0x4D, 'M', 'm'), + (0x4E, 'M', 'n'), + (0x4F, 'M', 'o'), + (0x50, 'M', 'p'), + (0x51, 'M', 'q'), + (0x52, 'M', 'r'), + (0x53, 'M', 's'), + (0x54, 'M', 't'), + (0x55, 'M', 'u'), + (0x56, 'M', 'v'), + (0x57, 'M', 'w'), + (0x58, 'M', 'x'), + (0x59, 'M', 'y'), + (0x5A, 'M', 'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', ' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', ' ̈'), + (0xA9, 'V'), + (0xAA, 'M', 'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', ' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', '2'), + (0xB3, 'M', '3'), + (0xB4, '3', ' ́'), + (0xB5, 'M', 'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', ' ̧'), + (0xB9, 'M', '1'), + (0xBA, 'M', 'o'), + (0xBB, 'V'), + (0xBC, 'M', '1⁄4'), + (0xBD, 'M', '1⁄2'), + (0xBE, 'M', '3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', 'à'), + (0xC1, 'M', 'á'), + (0xC2, 'M', 'â'), + (0xC3, 'M', 'ã'), + (0xC4, 'M', 'ä'), + (0xC5, 'M', 'å'), + (0xC6, 'M', 'æ'), + (0xC7, 'M', 'ç'), + ] + +def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC8, 'M', 'è'), + (0xC9, 'M', 'é'), + (0xCA, 'M', 'ê'), + (0xCB, 'M', 'ë'), + (0xCC, 'M', 'ì'), + (0xCD, 'M', 'í'), + (0xCE, 'M', 'î'), + (0xCF, 'M', 'ï'), + (0xD0, 'M', 'ð'), + (0xD1, 'M', 'ñ'), + (0xD2, 'M', 'ò'), + (0xD3, 'M', 'ó'), + (0xD4, 'M', 'ô'), + (0xD5, 'M', 'õ'), + (0xD6, 'M', 'ö'), + (0xD7, 'V'), + (0xD8, 'M', 'ø'), + (0xD9, 'M', 'ù'), + (0xDA, 'M', 'ú'), + (0xDB, 'M', 'û'), + (0xDC, 'M', 'ü'), + (0xDD, 'M', 'ý'), + (0xDE, 'M', 'þ'), + (0xDF, 'D', 'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', 'ā'), + (0x101, 'V'), + (0x102, 'M', 'ă'), + (0x103, 'V'), + (0x104, 'M', 'ą'), + (0x105, 'V'), + (0x106, 'M', 'ć'), + (0x107, 'V'), + (0x108, 'M', 'ĉ'), + (0x109, 'V'), + (0x10A, 'M', 'ċ'), + (0x10B, 'V'), + (0x10C, 'M', 'č'), + (0x10D, 'V'), + (0x10E, 'M', 'ď'), + (0x10F, 'V'), + (0x110, 'M', 'đ'), + (0x111, 'V'), + (0x112, 'M', 'ē'), + (0x113, 'V'), + (0x114, 'M', 'ĕ'), + (0x115, 'V'), + (0x116, 'M', 'ė'), + (0x117, 'V'), + (0x118, 'M', 'ę'), + (0x119, 'V'), + (0x11A, 'M', 'ě'), + (0x11B, 'V'), + (0x11C, 'M', 'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', 'ğ'), + (0x11F, 'V'), + (0x120, 'M', 'ġ'), + (0x121, 'V'), + (0x122, 'M', 'ģ'), + (0x123, 'V'), + (0x124, 'M', 'ĥ'), + (0x125, 'V'), + (0x126, 'M', 'ħ'), + (0x127, 'V'), + (0x128, 'M', 'ĩ'), + (0x129, 'V'), + (0x12A, 'M', 'ī'), + (0x12B, 'V'), + ] + +def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x12C, 'M', 'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', 'į'), + (0x12F, 'V'), + (0x130, 'M', 'i̇'), + (0x131, 'V'), + (0x132, 'M', 'ij'), + (0x134, 'M', 'ĵ'), + (0x135, 'V'), + (0x136, 'M', 'ķ'), + (0x137, 'V'), + (0x139, 'M', 'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', 'ļ'), + (0x13C, 'V'), + (0x13D, 'M', 'ľ'), + (0x13E, 'V'), + (0x13F, 'M', 'l·'), + (0x141, 'M', 'ł'), + (0x142, 'V'), + (0x143, 'M', 'ń'), + (0x144, 'V'), + (0x145, 'M', 'ņ'), + (0x146, 'V'), + (0x147, 'M', 'ň'), + (0x148, 'V'), + (0x149, 'M', 'ʼn'), + (0x14A, 'M', 'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', 'ō'), + (0x14D, 'V'), + (0x14E, 'M', 'ŏ'), + (0x14F, 'V'), + (0x150, 'M', 'ő'), + (0x151, 'V'), + (0x152, 'M', 'œ'), + (0x153, 'V'), + (0x154, 'M', 'ŕ'), + (0x155, 'V'), + (0x156, 'M', 'ŗ'), + (0x157, 'V'), + (0x158, 'M', 'ř'), + (0x159, 'V'), + (0x15A, 'M', 'ś'), + (0x15B, 'V'), + (0x15C, 'M', 'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', 'ş'), + (0x15F, 'V'), + (0x160, 'M', 'š'), + (0x161, 'V'), + (0x162, 'M', 'ţ'), + (0x163, 'V'), + (0x164, 'M', 'ť'), + (0x165, 'V'), + (0x166, 'M', 'ŧ'), + (0x167, 'V'), + (0x168, 'M', 'ũ'), + (0x169, 'V'), + (0x16A, 'M', 'ū'), + (0x16B, 'V'), + (0x16C, 'M', 'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', 'ů'), + (0x16F, 'V'), + (0x170, 'M', 'ű'), + (0x171, 'V'), + (0x172, 'M', 'ų'), + (0x173, 'V'), + (0x174, 'M', 'ŵ'), + (0x175, 'V'), + (0x176, 'M', 'ŷ'), + (0x177, 'V'), + (0x178, 'M', 'ÿ'), + (0x179, 'M', 'ź'), + (0x17A, 'V'), + (0x17B, 'M', 'ż'), + (0x17C, 'V'), + (0x17D, 'M', 'ž'), + (0x17E, 'V'), + (0x17F, 'M', 's'), + (0x180, 'V'), + (0x181, 'M', 'ɓ'), + (0x182, 'M', 'ƃ'), + (0x183, 'V'), + (0x184, 'M', 'ƅ'), + (0x185, 'V'), + (0x186, 'M', 'ɔ'), + (0x187, 'M', 'ƈ'), + (0x188, 'V'), + (0x189, 'M', 'ɖ'), + (0x18A, 'M', 'ɗ'), + (0x18B, 'M', 'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', 'ǝ'), + (0x18F, 'M', 'ə'), + (0x190, 'M', 'ɛ'), + (0x191, 'M', 'ƒ'), + (0x192, 'V'), + (0x193, 'M', 'ɠ'), + ] + +def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x194, 'M', 'ɣ'), + (0x195, 'V'), + (0x196, 'M', 'ɩ'), + (0x197, 'M', 'ɨ'), + (0x198, 'M', 'ƙ'), + (0x199, 'V'), + (0x19C, 'M', 'ɯ'), + (0x19D, 'M', 'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', 'ɵ'), + (0x1A0, 'M', 'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', 'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', 'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', 'ʀ'), + (0x1A7, 'M', 'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', 'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', 'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', 'ʈ'), + (0x1AF, 'M', 'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', 'ʊ'), + (0x1B2, 'M', 'ʋ'), + (0x1B3, 'M', 'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', 'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', 'ʒ'), + (0x1B8, 'M', 'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', 'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', 'dž'), + (0x1C7, 'M', 'lj'), + (0x1CA, 'M', 'nj'), + (0x1CD, 'M', 'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', 'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', 'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', 'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', 'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', 'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', 'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', 'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', 'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', 'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', 'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', 'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', 'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', 'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', 'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', 'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', 'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', 'dz'), + (0x1F4, 'M', 'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', 'ƕ'), + (0x1F7, 'M', 'ƿ'), + (0x1F8, 'M', 'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', 'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', 'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', 'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', 'ȁ'), + (0x201, 'V'), + (0x202, 'M', 'ȃ'), + (0x203, 'V'), + (0x204, 'M', 'ȅ'), + (0x205, 'V'), + (0x206, 'M', 'ȇ'), + (0x207, 'V'), + (0x208, 'M', 'ȉ'), + (0x209, 'V'), + (0x20A, 'M', 'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', 'ȍ'), + ] + +def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x20D, 'V'), + (0x20E, 'M', 'ȏ'), + (0x20F, 'V'), + (0x210, 'M', 'ȑ'), + (0x211, 'V'), + (0x212, 'M', 'ȓ'), + (0x213, 'V'), + (0x214, 'M', 'ȕ'), + (0x215, 'V'), + (0x216, 'M', 'ȗ'), + (0x217, 'V'), + (0x218, 'M', 'ș'), + (0x219, 'V'), + (0x21A, 'M', 'ț'), + (0x21B, 'V'), + (0x21C, 'M', 'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', 'ȟ'), + (0x21F, 'V'), + (0x220, 'M', 'ƞ'), + (0x221, 'V'), + (0x222, 'M', 'ȣ'), + (0x223, 'V'), + (0x224, 'M', 'ȥ'), + (0x225, 'V'), + (0x226, 'M', 'ȧ'), + (0x227, 'V'), + (0x228, 'M', 'ȩ'), + (0x229, 'V'), + (0x22A, 'M', 'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', 'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', 'ȯ'), + (0x22F, 'V'), + (0x230, 'M', 'ȱ'), + (0x231, 'V'), + (0x232, 'M', 'ȳ'), + (0x233, 'V'), + (0x23A, 'M', 'ⱥ'), + (0x23B, 'M', 'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', 'ƚ'), + (0x23E, 'M', 'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', 'ɂ'), + (0x242, 'V'), + (0x243, 'M', 'ƀ'), + (0x244, 'M', 'ʉ'), + (0x245, 'M', 'ʌ'), + (0x246, 'M', 'ɇ'), + (0x247, 'V'), + (0x248, 'M', 'ɉ'), + (0x249, 'V'), + (0x24A, 'M', 'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', 'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', 'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', 'h'), + (0x2B1, 'M', 'ɦ'), + (0x2B2, 'M', 'j'), + (0x2B3, 'M', 'r'), + (0x2B4, 'M', 'ɹ'), + (0x2B5, 'M', 'ɻ'), + (0x2B6, 'M', 'ʁ'), + (0x2B7, 'M', 'w'), + (0x2B8, 'M', 'y'), + (0x2B9, 'V'), + (0x2D8, '3', ' ̆'), + (0x2D9, '3', ' ̇'), + (0x2DA, '3', ' ̊'), + (0x2DB, '3', ' ̨'), + (0x2DC, '3', ' ̃'), + (0x2DD, '3', ' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', 'ɣ'), + (0x2E1, 'M', 'l'), + (0x2E2, 'M', 's'), + (0x2E3, 'M', 'x'), + (0x2E4, 'M', 'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', '̀'), + (0x341, 'M', '́'), + (0x342, 'V'), + (0x343, 'M', '̓'), + (0x344, 'M', '̈́'), + (0x345, 'M', 'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', 'ͱ'), + (0x371, 'V'), + (0x372, 'M', 'ͳ'), + (0x373, 'V'), + (0x374, 'M', 'ʹ'), + (0x375, 'V'), + (0x376, 'M', 'ͷ'), + (0x377, 'V'), + ] + +def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x378, 'X'), + (0x37A, '3', ' ι'), + (0x37B, 'V'), + (0x37E, '3', ';'), + (0x37F, 'M', 'ϳ'), + (0x380, 'X'), + (0x384, '3', ' ́'), + (0x385, '3', ' ̈́'), + (0x386, 'M', 'ά'), + (0x387, 'M', '·'), + (0x388, 'M', 'έ'), + (0x389, 'M', 'ή'), + (0x38A, 'M', 'ί'), + (0x38B, 'X'), + (0x38C, 'M', 'ό'), + (0x38D, 'X'), + (0x38E, 'M', 'ύ'), + (0x38F, 'M', 'ώ'), + (0x390, 'V'), + (0x391, 'M', 'α'), + (0x392, 'M', 'β'), + (0x393, 'M', 'γ'), + (0x394, 'M', 'δ'), + (0x395, 'M', 'ε'), + (0x396, 'M', 'ζ'), + (0x397, 'M', 'η'), + (0x398, 'M', 'θ'), + (0x399, 'M', 'ι'), + (0x39A, 'M', 'κ'), + (0x39B, 'M', 'λ'), + (0x39C, 'M', 'μ'), + (0x39D, 'M', 'ν'), + (0x39E, 'M', 'ξ'), + (0x39F, 'M', 'ο'), + (0x3A0, 'M', 'π'), + (0x3A1, 'M', 'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', 'σ'), + (0x3A4, 'M', 'τ'), + (0x3A5, 'M', 'υ'), + (0x3A6, 'M', 'φ'), + (0x3A7, 'M', 'χ'), + (0x3A8, 'M', 'ψ'), + (0x3A9, 'M', 'ω'), + (0x3AA, 'M', 'ϊ'), + (0x3AB, 'M', 'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', 'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', 'ϗ'), + (0x3D0, 'M', 'β'), + (0x3D1, 'M', 'θ'), + (0x3D2, 'M', 'υ'), + (0x3D3, 'M', 'ύ'), + (0x3D4, 'M', 'ϋ'), + (0x3D5, 'M', 'φ'), + (0x3D6, 'M', 'π'), + (0x3D7, 'V'), + (0x3D8, 'M', 'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', 'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', 'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', 'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', 'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', 'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', 'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', 'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', 'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', 'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', 'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', 'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', 'κ'), + (0x3F1, 'M', 'ρ'), + (0x3F2, 'M', 'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', 'θ'), + (0x3F5, 'M', 'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', 'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', 'σ'), + (0x3FA, 'M', 'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', 'ͻ'), + (0x3FE, 'M', 'ͼ'), + (0x3FF, 'M', 'ͽ'), + (0x400, 'M', 'ѐ'), + (0x401, 'M', 'ё'), + (0x402, 'M', 'ђ'), + ] + +def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x403, 'M', 'ѓ'), + (0x404, 'M', 'є'), + (0x405, 'M', 'ѕ'), + (0x406, 'M', 'і'), + (0x407, 'M', 'ї'), + (0x408, 'M', 'ј'), + (0x409, 'M', 'љ'), + (0x40A, 'M', 'њ'), + (0x40B, 'M', 'ћ'), + (0x40C, 'M', 'ќ'), + (0x40D, 'M', 'ѝ'), + (0x40E, 'M', 'ў'), + (0x40F, 'M', 'џ'), + (0x410, 'M', 'а'), + (0x411, 'M', 'б'), + (0x412, 'M', 'в'), + (0x413, 'M', 'г'), + (0x414, 'M', 'д'), + (0x415, 'M', 'е'), + (0x416, 'M', 'ж'), + (0x417, 'M', 'з'), + (0x418, 'M', 'и'), + (0x419, 'M', 'й'), + (0x41A, 'M', 'к'), + (0x41B, 'M', 'л'), + (0x41C, 'M', 'м'), + (0x41D, 'M', 'н'), + (0x41E, 'M', 'о'), + (0x41F, 'M', 'п'), + (0x420, 'M', 'р'), + (0x421, 'M', 'с'), + (0x422, 'M', 'т'), + (0x423, 'M', 'у'), + (0x424, 'M', 'ф'), + (0x425, 'M', 'х'), + (0x426, 'M', 'ц'), + (0x427, 'M', 'ч'), + (0x428, 'M', 'ш'), + (0x429, 'M', 'щ'), + (0x42A, 'M', 'ъ'), + (0x42B, 'M', 'ы'), + (0x42C, 'M', 'ь'), + (0x42D, 'M', 'э'), + (0x42E, 'M', 'ю'), + (0x42F, 'M', 'я'), + (0x430, 'V'), + (0x460, 'M', 'ѡ'), + (0x461, 'V'), + (0x462, 'M', 'ѣ'), + (0x463, 'V'), + (0x464, 'M', 'ѥ'), + (0x465, 'V'), + (0x466, 'M', 'ѧ'), + (0x467, 'V'), + (0x468, 'M', 'ѩ'), + (0x469, 'V'), + (0x46A, 'M', 'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', 'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', 'ѯ'), + (0x46F, 'V'), + (0x470, 'M', 'ѱ'), + (0x471, 'V'), + (0x472, 'M', 'ѳ'), + (0x473, 'V'), + (0x474, 'M', 'ѵ'), + (0x475, 'V'), + (0x476, 'M', 'ѷ'), + (0x477, 'V'), + (0x478, 'M', 'ѹ'), + (0x479, 'V'), + (0x47A, 'M', 'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', 'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', 'ѿ'), + (0x47F, 'V'), + (0x480, 'M', 'ҁ'), + (0x481, 'V'), + (0x48A, 'M', 'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', 'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', 'ҏ'), + (0x48F, 'V'), + (0x490, 'M', 'ґ'), + (0x491, 'V'), + (0x492, 'M', 'ғ'), + (0x493, 'V'), + (0x494, 'M', 'ҕ'), + (0x495, 'V'), + (0x496, 'M', 'җ'), + (0x497, 'V'), + (0x498, 'M', 'ҙ'), + (0x499, 'V'), + (0x49A, 'M', 'қ'), + (0x49B, 'V'), + (0x49C, 'M', 'ҝ'), + (0x49D, 'V'), + ] + +def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x49E, 'M', 'ҟ'), + (0x49F, 'V'), + (0x4A0, 'M', 'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', 'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', 'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', 'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', 'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', 'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', 'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', 'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', 'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', 'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', 'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', 'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', 'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', 'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', 'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', 'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', 'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', 'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', 'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', 'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', 'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', 'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', 'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', 'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', 'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', 'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', 'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', 'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', 'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', 'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', 'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', 'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', 'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', 'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', 'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', 'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', 'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', 'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', 'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', 'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', 'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', 'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', 'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', 'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', 'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', 'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', 'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', 'ԁ'), + (0x501, 'V'), + (0x502, 'M', 'ԃ'), + ] + +def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x503, 'V'), + (0x504, 'M', 'ԅ'), + (0x505, 'V'), + (0x506, 'M', 'ԇ'), + (0x507, 'V'), + (0x508, 'M', 'ԉ'), + (0x509, 'V'), + (0x50A, 'M', 'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', 'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', 'ԏ'), + (0x50F, 'V'), + (0x510, 'M', 'ԑ'), + (0x511, 'V'), + (0x512, 'M', 'ԓ'), + (0x513, 'V'), + (0x514, 'M', 'ԕ'), + (0x515, 'V'), + (0x516, 'M', 'ԗ'), + (0x517, 'V'), + (0x518, 'M', 'ԙ'), + (0x519, 'V'), + (0x51A, 'M', 'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', 'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', 'ԟ'), + (0x51F, 'V'), + (0x520, 'M', 'ԡ'), + (0x521, 'V'), + (0x522, 'M', 'ԣ'), + (0x523, 'V'), + (0x524, 'M', 'ԥ'), + (0x525, 'V'), + (0x526, 'M', 'ԧ'), + (0x527, 'V'), + (0x528, 'M', 'ԩ'), + (0x529, 'V'), + (0x52A, 'M', 'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', 'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', 'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', 'ա'), + (0x532, 'M', 'բ'), + (0x533, 'M', 'գ'), + (0x534, 'M', 'դ'), + (0x535, 'M', 'ե'), + (0x536, 'M', 'զ'), + (0x537, 'M', 'է'), + (0x538, 'M', 'ը'), + (0x539, 'M', 'թ'), + (0x53A, 'M', 'ժ'), + (0x53B, 'M', 'ի'), + (0x53C, 'M', 'լ'), + (0x53D, 'M', 'խ'), + (0x53E, 'M', 'ծ'), + (0x53F, 'M', 'կ'), + (0x540, 'M', 'հ'), + (0x541, 'M', 'ձ'), + (0x542, 'M', 'ղ'), + (0x543, 'M', 'ճ'), + (0x544, 'M', 'մ'), + (0x545, 'M', 'յ'), + (0x546, 'M', 'ն'), + (0x547, 'M', 'շ'), + (0x548, 'M', 'ո'), + (0x549, 'M', 'չ'), + (0x54A, 'M', 'պ'), + (0x54B, 'M', 'ջ'), + (0x54C, 'M', 'ռ'), + (0x54D, 'M', 'ս'), + (0x54E, 'M', 'վ'), + (0x54F, 'M', 'տ'), + (0x550, 'M', 'ր'), + (0x551, 'M', 'ց'), + (0x552, 'M', 'ւ'), + (0x553, 'M', 'փ'), + (0x554, 'M', 'ք'), + (0x555, 'M', 'օ'), + (0x556, 'M', 'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x587, 'M', 'եւ'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61D, 'V'), + ] + +def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x675, 'M', 'اٴ'), + (0x676, 'M', 'وٴ'), + (0x677, 'M', 'ۇٴ'), + (0x678, 'M', 'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x870, 'V'), + (0x88F, 'X'), + (0x898, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', 'क़'), + (0x959, 'M', 'ख़'), + (0x95A, 'M', 'ग़'), + (0x95B, 'M', 'ज़'), + (0x95C, 'M', 'ड़'), + (0x95D, 'M', 'ढ़'), + (0x95E, 'M', 'फ़'), + (0x95F, 'M', 'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', 'ড়'), + (0x9DD, 'M', 'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', 'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FF, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', 'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', 'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', 'ਖ਼'), + (0xA5A, 'M', 'ਗ਼'), + (0xA5B, 'M', 'ਜ਼'), + (0xA5C, 'V'), + (0xA5D, 'X'), + ] + +def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA5E, 'M', 'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB55, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', 'ଡ଼'), + (0xB5D, 'M', 'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + (0xC29, 'X'), + (0xC2A, 'V'), + ] + +def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC3A, 'X'), + (0xC3C, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC5D, 'V'), + (0xC5E, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC77, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDD, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF4, 'X'), + (0xD00, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD81, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', 'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE86, 'V'), + (0xE8B, 'X'), + (0xE8C, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEB3, 'M', 'ໍາ'), + (0xEB4, 'V'), + ] + +def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECF, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', 'ຫນ'), + (0xEDD, 'M', 'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', '་'), + (0xF0D, 'V'), + (0xF43, 'M', 'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', 'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', 'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', 'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', 'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', 'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', 'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', 'ཱུ'), + (0xF76, 'M', 'ྲྀ'), + (0xF77, 'M', 'ྲཱྀ'), + (0xF78, 'M', 'ླྀ'), + (0xF79, 'M', 'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', 'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', 'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', 'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', 'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', 'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', 'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', 'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', 'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', 'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', 'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + ] + +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', 'Ᏸ'), + (0x13F9, 'M', 'Ᏹ'), + (0x13FA, 'M', 'Ᏺ'), + (0x13FB, 'M', 'Ᏻ'), + (0x13FC, 'M', 'Ᏼ'), + (0x13FD, 'M', 'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x1716, 'X'), + (0x171F, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x180F, 'I'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ACF, 'X'), + (0x1B00, 'V'), + (0x1B4D, 'X'), + (0x1B50, 'V'), + (0x1B7F, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', 'в'), + ] + +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1C81, 'M', 'д'), + (0x1C82, 'M', 'о'), + (0x1C83, 'M', 'с'), + (0x1C84, 'M', 'т'), + (0x1C86, 'M', 'ъ'), + (0x1C87, 'M', 'ѣ'), + (0x1C88, 'M', 'ꙋ'), + (0x1C89, 'X'), + (0x1C90, 'M', 'ა'), + (0x1C91, 'M', 'ბ'), + (0x1C92, 'M', 'გ'), + (0x1C93, 'M', 'დ'), + (0x1C94, 'M', 'ე'), + (0x1C95, 'M', 'ვ'), + (0x1C96, 'M', 'ზ'), + (0x1C97, 'M', 'თ'), + (0x1C98, 'M', 'ი'), + (0x1C99, 'M', 'კ'), + (0x1C9A, 'M', 'ლ'), + (0x1C9B, 'M', 'მ'), + (0x1C9C, 'M', 'ნ'), + (0x1C9D, 'M', 'ო'), + (0x1C9E, 'M', 'პ'), + (0x1C9F, 'M', 'ჟ'), + (0x1CA0, 'M', 'რ'), + (0x1CA1, 'M', 'ს'), + (0x1CA2, 'M', 'ტ'), + (0x1CA3, 'M', 'უ'), + (0x1CA4, 'M', 'ფ'), + (0x1CA5, 'M', 'ქ'), + (0x1CA6, 'M', 'ღ'), + (0x1CA7, 'M', 'ყ'), + (0x1CA8, 'M', 'შ'), + (0x1CA9, 'M', 'ჩ'), + (0x1CAA, 'M', 'ც'), + (0x1CAB, 'M', 'ძ'), + (0x1CAC, 'M', 'წ'), + (0x1CAD, 'M', 'ჭ'), + (0x1CAE, 'M', 'ხ'), + (0x1CAF, 'M', 'ჯ'), + (0x1CB0, 'M', 'ჰ'), + (0x1CB1, 'M', 'ჱ'), + (0x1CB2, 'M', 'ჲ'), + (0x1CB3, 'M', 'ჳ'), + (0x1CB4, 'M', 'ჴ'), + (0x1CB5, 'M', 'ჵ'), + (0x1CB6, 'M', 'ჶ'), + (0x1CB7, 'M', 'ჷ'), + (0x1CB8, 'M', 'ჸ'), + (0x1CB9, 'M', 'ჹ'), + (0x1CBA, 'M', 'ჺ'), + (0x1CBB, 'X'), + (0x1CBD, 'M', 'ჽ'), + (0x1CBE, 'M', 'ჾ'), + (0x1CBF, 'M', 'ჿ'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFB, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', 'a'), + (0x1D2D, 'M', 'æ'), + (0x1D2E, 'M', 'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', 'd'), + (0x1D31, 'M', 'e'), + (0x1D32, 'M', 'ǝ'), + (0x1D33, 'M', 'g'), + (0x1D34, 'M', 'h'), + (0x1D35, 'M', 'i'), + (0x1D36, 'M', 'j'), + (0x1D37, 'M', 'k'), + (0x1D38, 'M', 'l'), + (0x1D39, 'M', 'm'), + (0x1D3A, 'M', 'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', 'o'), + (0x1D3D, 'M', 'ȣ'), + (0x1D3E, 'M', 'p'), + (0x1D3F, 'M', 'r'), + (0x1D40, 'M', 't'), + (0x1D41, 'M', 'u'), + (0x1D42, 'M', 'w'), + (0x1D43, 'M', 'a'), + (0x1D44, 'M', 'ɐ'), + (0x1D45, 'M', 'ɑ'), + (0x1D46, 'M', 'ᴂ'), + (0x1D47, 'M', 'b'), + (0x1D48, 'M', 'd'), + (0x1D49, 'M', 'e'), + (0x1D4A, 'M', 'ə'), + (0x1D4B, 'M', 'ɛ'), + (0x1D4C, 'M', 'ɜ'), + (0x1D4D, 'M', 'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', 'k'), + (0x1D50, 'M', 'm'), + (0x1D51, 'M', 'ŋ'), + (0x1D52, 'M', 'o'), + (0x1D53, 'M', 'ɔ'), + ] + +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D54, 'M', 'ᴖ'), + (0x1D55, 'M', 'ᴗ'), + (0x1D56, 'M', 'p'), + (0x1D57, 'M', 't'), + (0x1D58, 'M', 'u'), + (0x1D59, 'M', 'ᴝ'), + (0x1D5A, 'M', 'ɯ'), + (0x1D5B, 'M', 'v'), + (0x1D5C, 'M', 'ᴥ'), + (0x1D5D, 'M', 'β'), + (0x1D5E, 'M', 'γ'), + (0x1D5F, 'M', 'δ'), + (0x1D60, 'M', 'φ'), + (0x1D61, 'M', 'χ'), + (0x1D62, 'M', 'i'), + (0x1D63, 'M', 'r'), + (0x1D64, 'M', 'u'), + (0x1D65, 'M', 'v'), + (0x1D66, 'M', 'β'), + (0x1D67, 'M', 'γ'), + (0x1D68, 'M', 'ρ'), + (0x1D69, 'M', 'φ'), + (0x1D6A, 'M', 'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', 'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', 'ɒ'), + (0x1D9C, 'M', 'c'), + (0x1D9D, 'M', 'ɕ'), + (0x1D9E, 'M', 'ð'), + (0x1D9F, 'M', 'ɜ'), + (0x1DA0, 'M', 'f'), + (0x1DA1, 'M', 'ɟ'), + (0x1DA2, 'M', 'ɡ'), + (0x1DA3, 'M', 'ɥ'), + (0x1DA4, 'M', 'ɨ'), + (0x1DA5, 'M', 'ɩ'), + (0x1DA6, 'M', 'ɪ'), + (0x1DA7, 'M', 'ᵻ'), + (0x1DA8, 'M', 'ʝ'), + (0x1DA9, 'M', 'ɭ'), + (0x1DAA, 'M', 'ᶅ'), + (0x1DAB, 'M', 'ʟ'), + (0x1DAC, 'M', 'ɱ'), + (0x1DAD, 'M', 'ɰ'), + (0x1DAE, 'M', 'ɲ'), + (0x1DAF, 'M', 'ɳ'), + (0x1DB0, 'M', 'ɴ'), + (0x1DB1, 'M', 'ɵ'), + (0x1DB2, 'M', 'ɸ'), + (0x1DB3, 'M', 'ʂ'), + (0x1DB4, 'M', 'ʃ'), + (0x1DB5, 'M', 'ƫ'), + (0x1DB6, 'M', 'ʉ'), + (0x1DB7, 'M', 'ʊ'), + (0x1DB8, 'M', 'ᴜ'), + (0x1DB9, 'M', 'ʋ'), + (0x1DBA, 'M', 'ʌ'), + (0x1DBB, 'M', 'z'), + (0x1DBC, 'M', 'ʐ'), + (0x1DBD, 'M', 'ʑ'), + (0x1DBE, 'M', 'ʒ'), + (0x1DBF, 'M', 'θ'), + (0x1DC0, 'V'), + (0x1E00, 'M', 'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', 'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', 'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', 'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', 'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', 'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', 'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', 'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', 'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', 'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', 'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', 'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', 'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', 'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', 'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', 'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', 'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', 'ḣ'), + (0x1E23, 'V'), + ] + +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E24, 'M', 'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', 'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', 'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', 'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', 'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', 'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', 'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', 'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', 'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', 'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', 'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', 'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', 'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', 'ḿ'), + (0x1E3F, 'V'), + (0x1E40, 'M', 'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', 'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', 'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', 'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', 'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', 'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', 'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', 'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', 'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', 'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', 'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', 'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', 'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', 'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', 'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', 'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', 'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', 'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', 'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', 'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', 'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', 'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', 'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', 'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', 'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', 'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', 'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', 'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', 'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', 'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', 'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', 'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', 'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', 'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', 'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', 'ẇ'), + (0x1E87, 'V'), + ] + +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E88, 'M', 'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', 'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', 'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', 'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', 'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', 'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', 'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', 'aʾ'), + (0x1E9B, 'M', 'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', 'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', 'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', 'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', 'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', 'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', 'ẩ'), + (0x1EA9, 'V'), + (0x1EAA, 'M', 'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', 'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', 'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', 'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', 'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', 'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', 'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', 'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', 'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', 'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', 'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', 'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', 'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', 'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', 'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', 'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', 'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', 'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', 'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', 'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', 'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', 'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', 'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', 'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', 'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', 'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', 'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', 'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', 'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', 'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', 'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', 'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', 'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', 'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', 'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', 'ự'), + ] + +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EF1, 'V'), + (0x1EF2, 'M', 'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', 'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', 'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', 'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', 'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', 'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', 'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', 'ἀ'), + (0x1F09, 'M', 'ἁ'), + (0x1F0A, 'M', 'ἂ'), + (0x1F0B, 'M', 'ἃ'), + (0x1F0C, 'M', 'ἄ'), + (0x1F0D, 'M', 'ἅ'), + (0x1F0E, 'M', 'ἆ'), + (0x1F0F, 'M', 'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', 'ἐ'), + (0x1F19, 'M', 'ἑ'), + (0x1F1A, 'M', 'ἒ'), + (0x1F1B, 'M', 'ἓ'), + (0x1F1C, 'M', 'ἔ'), + (0x1F1D, 'M', 'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', 'ἠ'), + (0x1F29, 'M', 'ἡ'), + (0x1F2A, 'M', 'ἢ'), + (0x1F2B, 'M', 'ἣ'), + (0x1F2C, 'M', 'ἤ'), + (0x1F2D, 'M', 'ἥ'), + (0x1F2E, 'M', 'ἦ'), + (0x1F2F, 'M', 'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', 'ἰ'), + (0x1F39, 'M', 'ἱ'), + (0x1F3A, 'M', 'ἲ'), + (0x1F3B, 'M', 'ἳ'), + (0x1F3C, 'M', 'ἴ'), + (0x1F3D, 'M', 'ἵ'), + (0x1F3E, 'M', 'ἶ'), + (0x1F3F, 'M', 'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', 'ὀ'), + (0x1F49, 'M', 'ὁ'), + (0x1F4A, 'M', 'ὂ'), + (0x1F4B, 'M', 'ὃ'), + (0x1F4C, 'M', 'ὄ'), + (0x1F4D, 'M', 'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', 'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', 'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', 'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', 'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', 'ὠ'), + (0x1F69, 'M', 'ὡ'), + (0x1F6A, 'M', 'ὢ'), + (0x1F6B, 'M', 'ὣ'), + (0x1F6C, 'M', 'ὤ'), + (0x1F6D, 'M', 'ὥ'), + (0x1F6E, 'M', 'ὦ'), + (0x1F6F, 'M', 'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', 'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', 'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', 'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', 'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', 'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', 'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', 'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', 'ἀι'), + (0x1F81, 'M', 'ἁι'), + (0x1F82, 'M', 'ἂι'), + (0x1F83, 'M', 'ἃι'), + (0x1F84, 'M', 'ἄι'), + (0x1F85, 'M', 'ἅι'), + (0x1F86, 'M', 'ἆι'), + (0x1F87, 'M', 'ἇι'), + ] + +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F88, 'M', 'ἀι'), + (0x1F89, 'M', 'ἁι'), + (0x1F8A, 'M', 'ἂι'), + (0x1F8B, 'M', 'ἃι'), + (0x1F8C, 'M', 'ἄι'), + (0x1F8D, 'M', 'ἅι'), + (0x1F8E, 'M', 'ἆι'), + (0x1F8F, 'M', 'ἇι'), + (0x1F90, 'M', 'ἠι'), + (0x1F91, 'M', 'ἡι'), + (0x1F92, 'M', 'ἢι'), + (0x1F93, 'M', 'ἣι'), + (0x1F94, 'M', 'ἤι'), + (0x1F95, 'M', 'ἥι'), + (0x1F96, 'M', 'ἦι'), + (0x1F97, 'M', 'ἧι'), + (0x1F98, 'M', 'ἠι'), + (0x1F99, 'M', 'ἡι'), + (0x1F9A, 'M', 'ἢι'), + (0x1F9B, 'M', 'ἣι'), + (0x1F9C, 'M', 'ἤι'), + (0x1F9D, 'M', 'ἥι'), + (0x1F9E, 'M', 'ἦι'), + (0x1F9F, 'M', 'ἧι'), + (0x1FA0, 'M', 'ὠι'), + (0x1FA1, 'M', 'ὡι'), + (0x1FA2, 'M', 'ὢι'), + (0x1FA3, 'M', 'ὣι'), + (0x1FA4, 'M', 'ὤι'), + (0x1FA5, 'M', 'ὥι'), + (0x1FA6, 'M', 'ὦι'), + (0x1FA7, 'M', 'ὧι'), + (0x1FA8, 'M', 'ὠι'), + (0x1FA9, 'M', 'ὡι'), + (0x1FAA, 'M', 'ὢι'), + (0x1FAB, 'M', 'ὣι'), + (0x1FAC, 'M', 'ὤι'), + (0x1FAD, 'M', 'ὥι'), + (0x1FAE, 'M', 'ὦι'), + (0x1FAF, 'M', 'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', 'ὰι'), + (0x1FB3, 'M', 'αι'), + (0x1FB4, 'M', 'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', 'ᾶι'), + (0x1FB8, 'M', 'ᾰ'), + (0x1FB9, 'M', 'ᾱ'), + (0x1FBA, 'M', 'ὰ'), + (0x1FBB, 'M', 'ά'), + (0x1FBC, 'M', 'αι'), + (0x1FBD, '3', ' ̓'), + (0x1FBE, 'M', 'ι'), + (0x1FBF, '3', ' ̓'), + (0x1FC0, '3', ' ͂'), + (0x1FC1, '3', ' ̈͂'), + (0x1FC2, 'M', 'ὴι'), + (0x1FC3, 'M', 'ηι'), + (0x1FC4, 'M', 'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', 'ῆι'), + (0x1FC8, 'M', 'ὲ'), + (0x1FC9, 'M', 'έ'), + (0x1FCA, 'M', 'ὴ'), + (0x1FCB, 'M', 'ή'), + (0x1FCC, 'M', 'ηι'), + (0x1FCD, '3', ' ̓̀'), + (0x1FCE, '3', ' ̓́'), + (0x1FCF, '3', ' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', 'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', 'ῐ'), + (0x1FD9, 'M', 'ῑ'), + (0x1FDA, 'M', 'ὶ'), + (0x1FDB, 'M', 'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', ' ̔̀'), + (0x1FDE, '3', ' ̔́'), + (0x1FDF, '3', ' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', 'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', 'ῠ'), + (0x1FE9, 'M', 'ῡ'), + (0x1FEA, 'M', 'ὺ'), + (0x1FEB, 'M', 'ύ'), + (0x1FEC, 'M', 'ῥ'), + (0x1FED, '3', ' ̈̀'), + (0x1FEE, '3', ' ̈́'), + (0x1FEF, '3', '`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', 'ὼι'), + (0x1FF3, 'M', 'ωι'), + (0x1FF4, 'M', 'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + ] + +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FF7, 'M', 'ῶι'), + (0x1FF8, 'M', 'ὸ'), + (0x1FF9, 'M', 'ό'), + (0x1FFA, 'M', 'ὼ'), + (0x1FFB, 'M', 'ώ'), + (0x1FFC, 'M', 'ωι'), + (0x1FFD, '3', ' ́'), + (0x1FFE, '3', ' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', ' '), + (0x200B, 'I'), + (0x200C, 'D', ''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', '‐'), + (0x2012, 'V'), + (0x2017, '3', ' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', ' '), + (0x2030, 'V'), + (0x2033, 'M', '′′'), + (0x2034, 'M', '′′′'), + (0x2035, 'V'), + (0x2036, 'M', '‵‵'), + (0x2037, 'M', '‵‵‵'), + (0x2038, 'V'), + (0x203C, '3', '!!'), + (0x203D, 'V'), + (0x203E, '3', ' ̅'), + (0x203F, 'V'), + (0x2047, '3', '??'), + (0x2048, '3', '?!'), + (0x2049, '3', '!?'), + (0x204A, 'V'), + (0x2057, 'M', '′′′′'), + (0x2058, 'V'), + (0x205F, '3', ' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', '0'), + (0x2071, 'M', 'i'), + (0x2072, 'X'), + (0x2074, 'M', '4'), + (0x2075, 'M', '5'), + (0x2076, 'M', '6'), + (0x2077, 'M', '7'), + (0x2078, 'M', '8'), + (0x2079, 'M', '9'), + (0x207A, '3', '+'), + (0x207B, 'M', '−'), + (0x207C, '3', '='), + (0x207D, '3', '('), + (0x207E, '3', ')'), + (0x207F, 'M', 'n'), + (0x2080, 'M', '0'), + (0x2081, 'M', '1'), + (0x2082, 'M', '2'), + (0x2083, 'M', '3'), + (0x2084, 'M', '4'), + (0x2085, 'M', '5'), + (0x2086, 'M', '6'), + (0x2087, 'M', '7'), + (0x2088, 'M', '8'), + (0x2089, 'M', '9'), + (0x208A, '3', '+'), + (0x208B, 'M', '−'), + (0x208C, '3', '='), + (0x208D, '3', '('), + (0x208E, '3', ')'), + (0x208F, 'X'), + (0x2090, 'M', 'a'), + (0x2091, 'M', 'e'), + (0x2092, 'M', 'o'), + (0x2093, 'M', 'x'), + (0x2094, 'M', 'ə'), + (0x2095, 'M', 'h'), + (0x2096, 'M', 'k'), + (0x2097, 'M', 'l'), + (0x2098, 'M', 'm'), + (0x2099, 'M', 'n'), + (0x209A, 'M', 'p'), + (0x209B, 'M', 's'), + (0x209C, 'M', 't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', 'rs'), + (0x20A9, 'V'), + (0x20C1, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', 'a/c'), + (0x2101, '3', 'a/s'), + (0x2102, 'M', 'c'), + (0x2103, 'M', '°c'), + (0x2104, 'V'), + ] + +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2105, '3', 'c/o'), + (0x2106, '3', 'c/u'), + (0x2107, 'M', 'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', '°f'), + (0x210A, 'M', 'g'), + (0x210B, 'M', 'h'), + (0x210F, 'M', 'ħ'), + (0x2110, 'M', 'i'), + (0x2112, 'M', 'l'), + (0x2114, 'V'), + (0x2115, 'M', 'n'), + (0x2116, 'M', 'no'), + (0x2117, 'V'), + (0x2119, 'M', 'p'), + (0x211A, 'M', 'q'), + (0x211B, 'M', 'r'), + (0x211E, 'V'), + (0x2120, 'M', 'sm'), + (0x2121, 'M', 'tel'), + (0x2122, 'M', 'tm'), + (0x2123, 'V'), + (0x2124, 'M', 'z'), + (0x2125, 'V'), + (0x2126, 'M', 'ω'), + (0x2127, 'V'), + (0x2128, 'M', 'z'), + (0x2129, 'V'), + (0x212A, 'M', 'k'), + (0x212B, 'M', 'å'), + (0x212C, 'M', 'b'), + (0x212D, 'M', 'c'), + (0x212E, 'V'), + (0x212F, 'M', 'e'), + (0x2131, 'M', 'f'), + (0x2132, 'X'), + (0x2133, 'M', 'm'), + (0x2134, 'M', 'o'), + (0x2135, 'M', 'א'), + (0x2136, 'M', 'ב'), + (0x2137, 'M', 'ג'), + (0x2138, 'M', 'ד'), + (0x2139, 'M', 'i'), + (0x213A, 'V'), + (0x213B, 'M', 'fax'), + (0x213C, 'M', 'π'), + (0x213D, 'M', 'γ'), + (0x213F, 'M', 'π'), + (0x2140, 'M', '∑'), + (0x2141, 'V'), + (0x2145, 'M', 'd'), + (0x2147, 'M', 'e'), + (0x2148, 'M', 'i'), + (0x2149, 'M', 'j'), + (0x214A, 'V'), + (0x2150, 'M', '1⁄7'), + (0x2151, 'M', '1⁄9'), + (0x2152, 'M', '1⁄10'), + (0x2153, 'M', '1⁄3'), + (0x2154, 'M', '2⁄3'), + (0x2155, 'M', '1⁄5'), + (0x2156, 'M', '2⁄5'), + (0x2157, 'M', '3⁄5'), + (0x2158, 'M', '4⁄5'), + (0x2159, 'M', '1⁄6'), + (0x215A, 'M', '5⁄6'), + (0x215B, 'M', '1⁄8'), + (0x215C, 'M', '3⁄8'), + (0x215D, 'M', '5⁄8'), + (0x215E, 'M', '7⁄8'), + (0x215F, 'M', '1⁄'), + (0x2160, 'M', 'i'), + (0x2161, 'M', 'ii'), + (0x2162, 'M', 'iii'), + (0x2163, 'M', 'iv'), + (0x2164, 'M', 'v'), + (0x2165, 'M', 'vi'), + (0x2166, 'M', 'vii'), + (0x2167, 'M', 'viii'), + (0x2168, 'M', 'ix'), + (0x2169, 'M', 'x'), + (0x216A, 'M', 'xi'), + (0x216B, 'M', 'xii'), + (0x216C, 'M', 'l'), + (0x216D, 'M', 'c'), + (0x216E, 'M', 'd'), + (0x216F, 'M', 'm'), + (0x2170, 'M', 'i'), + (0x2171, 'M', 'ii'), + (0x2172, 'M', 'iii'), + (0x2173, 'M', 'iv'), + (0x2174, 'M', 'v'), + (0x2175, 'M', 'vi'), + (0x2176, 'M', 'vii'), + (0x2177, 'M', 'viii'), + (0x2178, 'M', 'ix'), + (0x2179, 'M', 'x'), + (0x217A, 'M', 'xi'), + (0x217B, 'M', 'xii'), + (0x217C, 'M', 'l'), + ] + +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x217D, 'M', 'c'), + (0x217E, 'M', 'd'), + (0x217F, 'M', 'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', '0⁄3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', '∫∫'), + (0x222D, 'M', '∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', '∮∮'), + (0x2230, 'M', '∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', '〈'), + (0x232A, 'M', '〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', '1'), + (0x2461, 'M', '2'), + (0x2462, 'M', '3'), + (0x2463, 'M', '4'), + (0x2464, 'M', '5'), + (0x2465, 'M', '6'), + (0x2466, 'M', '7'), + (0x2467, 'M', '8'), + (0x2468, 'M', '9'), + (0x2469, 'M', '10'), + (0x246A, 'M', '11'), + (0x246B, 'M', '12'), + (0x246C, 'M', '13'), + (0x246D, 'M', '14'), + (0x246E, 'M', '15'), + (0x246F, 'M', '16'), + (0x2470, 'M', '17'), + (0x2471, 'M', '18'), + (0x2472, 'M', '19'), + (0x2473, 'M', '20'), + (0x2474, '3', '(1)'), + (0x2475, '3', '(2)'), + (0x2476, '3', '(3)'), + (0x2477, '3', '(4)'), + (0x2478, '3', '(5)'), + (0x2479, '3', '(6)'), + (0x247A, '3', '(7)'), + (0x247B, '3', '(8)'), + (0x247C, '3', '(9)'), + (0x247D, '3', '(10)'), + (0x247E, '3', '(11)'), + (0x247F, '3', '(12)'), + (0x2480, '3', '(13)'), + (0x2481, '3', '(14)'), + (0x2482, '3', '(15)'), + (0x2483, '3', '(16)'), + (0x2484, '3', '(17)'), + (0x2485, '3', '(18)'), + (0x2486, '3', '(19)'), + (0x2487, '3', '(20)'), + (0x2488, 'X'), + (0x249C, '3', '(a)'), + (0x249D, '3', '(b)'), + (0x249E, '3', '(c)'), + (0x249F, '3', '(d)'), + (0x24A0, '3', '(e)'), + (0x24A1, '3', '(f)'), + (0x24A2, '3', '(g)'), + (0x24A3, '3', '(h)'), + (0x24A4, '3', '(i)'), + (0x24A5, '3', '(j)'), + (0x24A6, '3', '(k)'), + (0x24A7, '3', '(l)'), + (0x24A8, '3', '(m)'), + (0x24A9, '3', '(n)'), + (0x24AA, '3', '(o)'), + (0x24AB, '3', '(p)'), + (0x24AC, '3', '(q)'), + (0x24AD, '3', '(r)'), + (0x24AE, '3', '(s)'), + (0x24AF, '3', '(t)'), + (0x24B0, '3', '(u)'), + (0x24B1, '3', '(v)'), + (0x24B2, '3', '(w)'), + (0x24B3, '3', '(x)'), + (0x24B4, '3', '(y)'), + (0x24B5, '3', '(z)'), + (0x24B6, 'M', 'a'), + (0x24B7, 'M', 'b'), + (0x24B8, 'M', 'c'), + (0x24B9, 'M', 'd'), + (0x24BA, 'M', 'e'), + (0x24BB, 'M', 'f'), + (0x24BC, 'M', 'g'), + ] + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x24BD, 'M', 'h'), + (0x24BE, 'M', 'i'), + (0x24BF, 'M', 'j'), + (0x24C0, 'M', 'k'), + (0x24C1, 'M', 'l'), + (0x24C2, 'M', 'm'), + (0x24C3, 'M', 'n'), + (0x24C4, 'M', 'o'), + (0x24C5, 'M', 'p'), + (0x24C6, 'M', 'q'), + (0x24C7, 'M', 'r'), + (0x24C8, 'M', 's'), + (0x24C9, 'M', 't'), + (0x24CA, 'M', 'u'), + (0x24CB, 'M', 'v'), + (0x24CC, 'M', 'w'), + (0x24CD, 'M', 'x'), + (0x24CE, 'M', 'y'), + (0x24CF, 'M', 'z'), + (0x24D0, 'M', 'a'), + (0x24D1, 'M', 'b'), + (0x24D2, 'M', 'c'), + (0x24D3, 'M', 'd'), + (0x24D4, 'M', 'e'), + (0x24D5, 'M', 'f'), + (0x24D6, 'M', 'g'), + (0x24D7, 'M', 'h'), + (0x24D8, 'M', 'i'), + (0x24D9, 'M', 'j'), + (0x24DA, 'M', 'k'), + (0x24DB, 'M', 'l'), + (0x24DC, 'M', 'm'), + (0x24DD, 'M', 'n'), + (0x24DE, 'M', 'o'), + (0x24DF, 'M', 'p'), + (0x24E0, 'M', 'q'), + (0x24E1, 'M', 'r'), + (0x24E2, 'M', 's'), + (0x24E3, 'M', 't'), + (0x24E4, 'M', 'u'), + (0x24E5, 'M', 'v'), + (0x24E6, 'M', 'w'), + (0x24E7, 'M', 'x'), + (0x24E8, 'M', 'y'), + (0x24E9, 'M', 'z'), + (0x24EA, 'M', '0'), + (0x24EB, 'V'), + (0x2A0C, 'M', '∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', '::='), + (0x2A75, '3', '=='), + (0x2A76, '3', '==='), + (0x2A77, 'V'), + (0x2ADC, 'M', '⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B97, 'V'), + (0x2C00, 'M', 'ⰰ'), + (0x2C01, 'M', 'ⰱ'), + (0x2C02, 'M', 'ⰲ'), + (0x2C03, 'M', 'ⰳ'), + (0x2C04, 'M', 'ⰴ'), + (0x2C05, 'M', 'ⰵ'), + (0x2C06, 'M', 'ⰶ'), + (0x2C07, 'M', 'ⰷ'), + (0x2C08, 'M', 'ⰸ'), + (0x2C09, 'M', 'ⰹ'), + (0x2C0A, 'M', 'ⰺ'), + (0x2C0B, 'M', 'ⰻ'), + (0x2C0C, 'M', 'ⰼ'), + (0x2C0D, 'M', 'ⰽ'), + (0x2C0E, 'M', 'ⰾ'), + (0x2C0F, 'M', 'ⰿ'), + (0x2C10, 'M', 'ⱀ'), + (0x2C11, 'M', 'ⱁ'), + (0x2C12, 'M', 'ⱂ'), + (0x2C13, 'M', 'ⱃ'), + (0x2C14, 'M', 'ⱄ'), + (0x2C15, 'M', 'ⱅ'), + (0x2C16, 'M', 'ⱆ'), + (0x2C17, 'M', 'ⱇ'), + (0x2C18, 'M', 'ⱈ'), + (0x2C19, 'M', 'ⱉ'), + (0x2C1A, 'M', 'ⱊ'), + (0x2C1B, 'M', 'ⱋ'), + (0x2C1C, 'M', 'ⱌ'), + (0x2C1D, 'M', 'ⱍ'), + (0x2C1E, 'M', 'ⱎ'), + (0x2C1F, 'M', 'ⱏ'), + (0x2C20, 'M', 'ⱐ'), + (0x2C21, 'M', 'ⱑ'), + (0x2C22, 'M', 'ⱒ'), + (0x2C23, 'M', 'ⱓ'), + (0x2C24, 'M', 'ⱔ'), + (0x2C25, 'M', 'ⱕ'), + (0x2C26, 'M', 'ⱖ'), + (0x2C27, 'M', 'ⱗ'), + (0x2C28, 'M', 'ⱘ'), + ] + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2C29, 'M', 'ⱙ'), + (0x2C2A, 'M', 'ⱚ'), + (0x2C2B, 'M', 'ⱛ'), + (0x2C2C, 'M', 'ⱜ'), + (0x2C2D, 'M', 'ⱝ'), + (0x2C2E, 'M', 'ⱞ'), + (0x2C2F, 'M', 'ⱟ'), + (0x2C30, 'V'), + (0x2C60, 'M', 'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', 'ɫ'), + (0x2C63, 'M', 'ᵽ'), + (0x2C64, 'M', 'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', 'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', 'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', 'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', 'ɑ'), + (0x2C6E, 'M', 'ɱ'), + (0x2C6F, 'M', 'ɐ'), + (0x2C70, 'M', 'ɒ'), + (0x2C71, 'V'), + (0x2C72, 'M', 'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', 'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', 'j'), + (0x2C7D, 'M', 'v'), + (0x2C7E, 'M', 'ȿ'), + (0x2C7F, 'M', 'ɀ'), + (0x2C80, 'M', 'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', 'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', 'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', 'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', 'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', 'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', 'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', 'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', 'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', 'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', 'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', 'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', 'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', 'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', 'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', 'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', 'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', 'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', 'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', 'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', 'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', 'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', 'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', 'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', 'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', 'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', 'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', 'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', 'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', 'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', 'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', 'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', 'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', 'ⳃ'), + ] + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2CC3, 'V'), + (0x2CC4, 'M', 'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', 'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', 'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', 'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', 'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', 'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', 'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', 'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', 'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', 'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', 'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', 'ⳛ'), + (0x2CDB, 'V'), + (0x2CDC, 'M', 'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', 'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', 'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', 'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', 'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', 'ⳮ'), + (0x2CEE, 'V'), + (0x2CF2, 'M', 'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', 'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E5E, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', '母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', '龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', '一'), + (0x2F01, 'M', '丨'), + (0x2F02, 'M', '丶'), + (0x2F03, 'M', '丿'), + (0x2F04, 'M', '乙'), + (0x2F05, 'M', '亅'), + (0x2F06, 'M', '二'), + (0x2F07, 'M', '亠'), + (0x2F08, 'M', '人'), + (0x2F09, 'M', '儿'), + (0x2F0A, 'M', '入'), + (0x2F0B, 'M', '八'), + (0x2F0C, 'M', '冂'), + (0x2F0D, 'M', '冖'), + (0x2F0E, 'M', '冫'), + (0x2F0F, 'M', '几'), + (0x2F10, 'M', '凵'), + (0x2F11, 'M', '刀'), + (0x2F12, 'M', '力'), + (0x2F13, 'M', '勹'), + (0x2F14, 'M', '匕'), + (0x2F15, 'M', '匚'), + ] + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F16, 'M', '匸'), + (0x2F17, 'M', '十'), + (0x2F18, 'M', '卜'), + (0x2F19, 'M', '卩'), + (0x2F1A, 'M', '厂'), + (0x2F1B, 'M', '厶'), + (0x2F1C, 'M', '又'), + (0x2F1D, 'M', '口'), + (0x2F1E, 'M', '囗'), + (0x2F1F, 'M', '土'), + (0x2F20, 'M', '士'), + (0x2F21, 'M', '夂'), + (0x2F22, 'M', '夊'), + (0x2F23, 'M', '夕'), + (0x2F24, 'M', '大'), + (0x2F25, 'M', '女'), + (0x2F26, 'M', '子'), + (0x2F27, 'M', '宀'), + (0x2F28, 'M', '寸'), + (0x2F29, 'M', '小'), + (0x2F2A, 'M', '尢'), + (0x2F2B, 'M', '尸'), + (0x2F2C, 'M', '屮'), + (0x2F2D, 'M', '山'), + (0x2F2E, 'M', '巛'), + (0x2F2F, 'M', '工'), + (0x2F30, 'M', '己'), + (0x2F31, 'M', '巾'), + (0x2F32, 'M', '干'), + (0x2F33, 'M', '幺'), + (0x2F34, 'M', '广'), + (0x2F35, 'M', '廴'), + (0x2F36, 'M', '廾'), + (0x2F37, 'M', '弋'), + (0x2F38, 'M', '弓'), + (0x2F39, 'M', '彐'), + (0x2F3A, 'M', '彡'), + (0x2F3B, 'M', '彳'), + (0x2F3C, 'M', '心'), + (0x2F3D, 'M', '戈'), + (0x2F3E, 'M', '戶'), + (0x2F3F, 'M', '手'), + (0x2F40, 'M', '支'), + (0x2F41, 'M', '攴'), + (0x2F42, 'M', '文'), + (0x2F43, 'M', '斗'), + (0x2F44, 'M', '斤'), + (0x2F45, 'M', '方'), + (0x2F46, 'M', '无'), + (0x2F47, 'M', '日'), + (0x2F48, 'M', '曰'), + (0x2F49, 'M', '月'), + (0x2F4A, 'M', '木'), + (0x2F4B, 'M', '欠'), + (0x2F4C, 'M', '止'), + (0x2F4D, 'M', '歹'), + (0x2F4E, 'M', '殳'), + (0x2F4F, 'M', '毋'), + (0x2F50, 'M', '比'), + (0x2F51, 'M', '毛'), + (0x2F52, 'M', '氏'), + (0x2F53, 'M', '气'), + (0x2F54, 'M', '水'), + (0x2F55, 'M', '火'), + (0x2F56, 'M', '爪'), + (0x2F57, 'M', '父'), + (0x2F58, 'M', '爻'), + (0x2F59, 'M', '爿'), + (0x2F5A, 'M', '片'), + (0x2F5B, 'M', '牙'), + (0x2F5C, 'M', '牛'), + (0x2F5D, 'M', '犬'), + (0x2F5E, 'M', '玄'), + (0x2F5F, 'M', '玉'), + (0x2F60, 'M', '瓜'), + (0x2F61, 'M', '瓦'), + (0x2F62, 'M', '甘'), + (0x2F63, 'M', '生'), + (0x2F64, 'M', '用'), + (0x2F65, 'M', '田'), + (0x2F66, 'M', '疋'), + (0x2F67, 'M', '疒'), + (0x2F68, 'M', '癶'), + (0x2F69, 'M', '白'), + (0x2F6A, 'M', '皮'), + (0x2F6B, 'M', '皿'), + (0x2F6C, 'M', '目'), + (0x2F6D, 'M', '矛'), + (0x2F6E, 'M', '矢'), + (0x2F6F, 'M', '石'), + (0x2F70, 'M', '示'), + (0x2F71, 'M', '禸'), + (0x2F72, 'M', '禾'), + (0x2F73, 'M', '穴'), + (0x2F74, 'M', '立'), + (0x2F75, 'M', '竹'), + (0x2F76, 'M', '米'), + (0x2F77, 'M', '糸'), + (0x2F78, 'M', '缶'), + (0x2F79, 'M', '网'), + ] + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F7A, 'M', '羊'), + (0x2F7B, 'M', '羽'), + (0x2F7C, 'M', '老'), + (0x2F7D, 'M', '而'), + (0x2F7E, 'M', '耒'), + (0x2F7F, 'M', '耳'), + (0x2F80, 'M', '聿'), + (0x2F81, 'M', '肉'), + (0x2F82, 'M', '臣'), + (0x2F83, 'M', '自'), + (0x2F84, 'M', '至'), + (0x2F85, 'M', '臼'), + (0x2F86, 'M', '舌'), + (0x2F87, 'M', '舛'), + (0x2F88, 'M', '舟'), + (0x2F89, 'M', '艮'), + (0x2F8A, 'M', '色'), + (0x2F8B, 'M', '艸'), + (0x2F8C, 'M', '虍'), + (0x2F8D, 'M', '虫'), + (0x2F8E, 'M', '血'), + (0x2F8F, 'M', '行'), + (0x2F90, 'M', '衣'), + (0x2F91, 'M', '襾'), + (0x2F92, 'M', '見'), + (0x2F93, 'M', '角'), + (0x2F94, 'M', '言'), + (0x2F95, 'M', '谷'), + (0x2F96, 'M', '豆'), + (0x2F97, 'M', '豕'), + (0x2F98, 'M', '豸'), + (0x2F99, 'M', '貝'), + (0x2F9A, 'M', '赤'), + (0x2F9B, 'M', '走'), + (0x2F9C, 'M', '足'), + (0x2F9D, 'M', '身'), + (0x2F9E, 'M', '車'), + (0x2F9F, 'M', '辛'), + (0x2FA0, 'M', '辰'), + (0x2FA1, 'M', '辵'), + (0x2FA2, 'M', '邑'), + (0x2FA3, 'M', '酉'), + (0x2FA4, 'M', '釆'), + (0x2FA5, 'M', '里'), + (0x2FA6, 'M', '金'), + (0x2FA7, 'M', '長'), + (0x2FA8, 'M', '門'), + (0x2FA9, 'M', '阜'), + (0x2FAA, 'M', '隶'), + (0x2FAB, 'M', '隹'), + (0x2FAC, 'M', '雨'), + (0x2FAD, 'M', '靑'), + (0x2FAE, 'M', '非'), + (0x2FAF, 'M', '面'), + (0x2FB0, 'M', '革'), + (0x2FB1, 'M', '韋'), + (0x2FB2, 'M', '韭'), + (0x2FB3, 'M', '音'), + (0x2FB4, 'M', '頁'), + (0x2FB5, 'M', '風'), + (0x2FB6, 'M', '飛'), + (0x2FB7, 'M', '食'), + (0x2FB8, 'M', '首'), + (0x2FB9, 'M', '香'), + (0x2FBA, 'M', '馬'), + (0x2FBB, 'M', '骨'), + (0x2FBC, 'M', '高'), + (0x2FBD, 'M', '髟'), + (0x2FBE, 'M', '鬥'), + (0x2FBF, 'M', '鬯'), + (0x2FC0, 'M', '鬲'), + (0x2FC1, 'M', '鬼'), + (0x2FC2, 'M', '魚'), + (0x2FC3, 'M', '鳥'), + (0x2FC4, 'M', '鹵'), + (0x2FC5, 'M', '鹿'), + (0x2FC6, 'M', '麥'), + (0x2FC7, 'M', '麻'), + (0x2FC8, 'M', '黃'), + (0x2FC9, 'M', '黍'), + (0x2FCA, 'M', '黑'), + (0x2FCB, 'M', '黹'), + (0x2FCC, 'M', '黽'), + (0x2FCD, 'M', '鼎'), + (0x2FCE, 'M', '鼓'), + (0x2FCF, 'M', '鼠'), + (0x2FD0, 'M', '鼻'), + (0x2FD1, 'M', '齊'), + (0x2FD2, 'M', '齒'), + (0x2FD3, 'M', '龍'), + (0x2FD4, 'M', '龜'), + (0x2FD5, 'M', '龠'), + (0x2FD6, 'X'), + (0x3000, '3', ' '), + (0x3001, 'V'), + (0x3002, 'M', '.'), + (0x3003, 'V'), + (0x3036, 'M', '〒'), + (0x3037, 'V'), + (0x3038, 'M', '十'), + ] + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3039, 'M', '卄'), + (0x303A, 'M', '卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', ' ゙'), + (0x309C, '3', ' ゚'), + (0x309D, 'V'), + (0x309F, 'M', 'より'), + (0x30A0, 'V'), + (0x30FF, 'M', 'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x3130, 'X'), + (0x3131, 'M', 'ᄀ'), + (0x3132, 'M', 'ᄁ'), + (0x3133, 'M', 'ᆪ'), + (0x3134, 'M', 'ᄂ'), + (0x3135, 'M', 'ᆬ'), + (0x3136, 'M', 'ᆭ'), + (0x3137, 'M', 'ᄃ'), + (0x3138, 'M', 'ᄄ'), + (0x3139, 'M', 'ᄅ'), + (0x313A, 'M', 'ᆰ'), + (0x313B, 'M', 'ᆱ'), + (0x313C, 'M', 'ᆲ'), + (0x313D, 'M', 'ᆳ'), + (0x313E, 'M', 'ᆴ'), + (0x313F, 'M', 'ᆵ'), + (0x3140, 'M', 'ᄚ'), + (0x3141, 'M', 'ᄆ'), + (0x3142, 'M', 'ᄇ'), + (0x3143, 'M', 'ᄈ'), + (0x3144, 'M', 'ᄡ'), + (0x3145, 'M', 'ᄉ'), + (0x3146, 'M', 'ᄊ'), + (0x3147, 'M', 'ᄋ'), + (0x3148, 'M', 'ᄌ'), + (0x3149, 'M', 'ᄍ'), + (0x314A, 'M', 'ᄎ'), + (0x314B, 'M', 'ᄏ'), + (0x314C, 'M', 'ᄐ'), + (0x314D, 'M', 'ᄑ'), + (0x314E, 'M', 'ᄒ'), + (0x314F, 'M', 'ᅡ'), + (0x3150, 'M', 'ᅢ'), + (0x3151, 'M', 'ᅣ'), + (0x3152, 'M', 'ᅤ'), + (0x3153, 'M', 'ᅥ'), + (0x3154, 'M', 'ᅦ'), + (0x3155, 'M', 'ᅧ'), + (0x3156, 'M', 'ᅨ'), + (0x3157, 'M', 'ᅩ'), + (0x3158, 'M', 'ᅪ'), + (0x3159, 'M', 'ᅫ'), + (0x315A, 'M', 'ᅬ'), + (0x315B, 'M', 'ᅭ'), + (0x315C, 'M', 'ᅮ'), + (0x315D, 'M', 'ᅯ'), + (0x315E, 'M', 'ᅰ'), + (0x315F, 'M', 'ᅱ'), + (0x3160, 'M', 'ᅲ'), + (0x3161, 'M', 'ᅳ'), + (0x3162, 'M', 'ᅴ'), + (0x3163, 'M', 'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', 'ᄔ'), + (0x3166, 'M', 'ᄕ'), + (0x3167, 'M', 'ᇇ'), + (0x3168, 'M', 'ᇈ'), + (0x3169, 'M', 'ᇌ'), + (0x316A, 'M', 'ᇎ'), + (0x316B, 'M', 'ᇓ'), + (0x316C, 'M', 'ᇗ'), + (0x316D, 'M', 'ᇙ'), + (0x316E, 'M', 'ᄜ'), + (0x316F, 'M', 'ᇝ'), + (0x3170, 'M', 'ᇟ'), + (0x3171, 'M', 'ᄝ'), + (0x3172, 'M', 'ᄞ'), + (0x3173, 'M', 'ᄠ'), + (0x3174, 'M', 'ᄢ'), + (0x3175, 'M', 'ᄣ'), + (0x3176, 'M', 'ᄧ'), + (0x3177, 'M', 'ᄩ'), + (0x3178, 'M', 'ᄫ'), + (0x3179, 'M', 'ᄬ'), + (0x317A, 'M', 'ᄭ'), + (0x317B, 'M', 'ᄮ'), + (0x317C, 'M', 'ᄯ'), + (0x317D, 'M', 'ᄲ'), + (0x317E, 'M', 'ᄶ'), + (0x317F, 'M', 'ᅀ'), + (0x3180, 'M', 'ᅇ'), + (0x3181, 'M', 'ᅌ'), + (0x3182, 'M', 'ᇱ'), + (0x3183, 'M', 'ᇲ'), + (0x3184, 'M', 'ᅗ'), + ] + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3185, 'M', 'ᅘ'), + (0x3186, 'M', 'ᅙ'), + (0x3187, 'M', 'ᆄ'), + (0x3188, 'M', 'ᆅ'), + (0x3189, 'M', 'ᆈ'), + (0x318A, 'M', 'ᆑ'), + (0x318B, 'M', 'ᆒ'), + (0x318C, 'M', 'ᆔ'), + (0x318D, 'M', 'ᆞ'), + (0x318E, 'M', 'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', '一'), + (0x3193, 'M', '二'), + (0x3194, 'M', '三'), + (0x3195, 'M', '四'), + (0x3196, 'M', '上'), + (0x3197, 'M', '中'), + (0x3198, 'M', '下'), + (0x3199, 'M', '甲'), + (0x319A, 'M', '乙'), + (0x319B, 'M', '丙'), + (0x319C, 'M', '丁'), + (0x319D, 'M', '天'), + (0x319E, 'M', '地'), + (0x319F, 'M', '人'), + (0x31A0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', '(ᄀ)'), + (0x3201, '3', '(ᄂ)'), + (0x3202, '3', '(ᄃ)'), + (0x3203, '3', '(ᄅ)'), + (0x3204, '3', '(ᄆ)'), + (0x3205, '3', '(ᄇ)'), + (0x3206, '3', '(ᄉ)'), + (0x3207, '3', '(ᄋ)'), + (0x3208, '3', '(ᄌ)'), + (0x3209, '3', '(ᄎ)'), + (0x320A, '3', '(ᄏ)'), + (0x320B, '3', '(ᄐ)'), + (0x320C, '3', '(ᄑ)'), + (0x320D, '3', '(ᄒ)'), + (0x320E, '3', '(가)'), + (0x320F, '3', '(나)'), + (0x3210, '3', '(다)'), + (0x3211, '3', '(라)'), + (0x3212, '3', '(마)'), + (0x3213, '3', '(바)'), + (0x3214, '3', '(사)'), + (0x3215, '3', '(아)'), + (0x3216, '3', '(자)'), + (0x3217, '3', '(차)'), + (0x3218, '3', '(카)'), + (0x3219, '3', '(타)'), + (0x321A, '3', '(파)'), + (0x321B, '3', '(하)'), + (0x321C, '3', '(주)'), + (0x321D, '3', '(오전)'), + (0x321E, '3', '(오후)'), + (0x321F, 'X'), + (0x3220, '3', '(一)'), + (0x3221, '3', '(二)'), + (0x3222, '3', '(三)'), + (0x3223, '3', '(四)'), + (0x3224, '3', '(五)'), + (0x3225, '3', '(六)'), + (0x3226, '3', '(七)'), + (0x3227, '3', '(八)'), + (0x3228, '3', '(九)'), + (0x3229, '3', '(十)'), + (0x322A, '3', '(月)'), + (0x322B, '3', '(火)'), + (0x322C, '3', '(水)'), + (0x322D, '3', '(木)'), + (0x322E, '3', '(金)'), + (0x322F, '3', '(土)'), + (0x3230, '3', '(日)'), + (0x3231, '3', '(株)'), + (0x3232, '3', '(有)'), + (0x3233, '3', '(社)'), + (0x3234, '3', '(名)'), + (0x3235, '3', '(特)'), + (0x3236, '3', '(財)'), + (0x3237, '3', '(祝)'), + (0x3238, '3', '(労)'), + (0x3239, '3', '(代)'), + (0x323A, '3', '(呼)'), + (0x323B, '3', '(学)'), + (0x323C, '3', '(監)'), + (0x323D, '3', '(企)'), + (0x323E, '3', '(資)'), + (0x323F, '3', '(協)'), + (0x3240, '3', '(祭)'), + (0x3241, '3', '(休)'), + (0x3242, '3', '(自)'), + (0x3243, '3', '(至)'), + (0x3244, 'M', '問'), + (0x3245, 'M', '幼'), + (0x3246, 'M', '文'), + ] + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3247, 'M', '箏'), + (0x3248, 'V'), + (0x3250, 'M', 'pte'), + (0x3251, 'M', '21'), + (0x3252, 'M', '22'), + (0x3253, 'M', '23'), + (0x3254, 'M', '24'), + (0x3255, 'M', '25'), + (0x3256, 'M', '26'), + (0x3257, 'M', '27'), + (0x3258, 'M', '28'), + (0x3259, 'M', '29'), + (0x325A, 'M', '30'), + (0x325B, 'M', '31'), + (0x325C, 'M', '32'), + (0x325D, 'M', '33'), + (0x325E, 'M', '34'), + (0x325F, 'M', '35'), + (0x3260, 'M', 'ᄀ'), + (0x3261, 'M', 'ᄂ'), + (0x3262, 'M', 'ᄃ'), + (0x3263, 'M', 'ᄅ'), + (0x3264, 'M', 'ᄆ'), + (0x3265, 'M', 'ᄇ'), + (0x3266, 'M', 'ᄉ'), + (0x3267, 'M', 'ᄋ'), + (0x3268, 'M', 'ᄌ'), + (0x3269, 'M', 'ᄎ'), + (0x326A, 'M', 'ᄏ'), + (0x326B, 'M', 'ᄐ'), + (0x326C, 'M', 'ᄑ'), + (0x326D, 'M', 'ᄒ'), + (0x326E, 'M', '가'), + (0x326F, 'M', '나'), + (0x3270, 'M', '다'), + (0x3271, 'M', '라'), + (0x3272, 'M', '마'), + (0x3273, 'M', '바'), + (0x3274, 'M', '사'), + (0x3275, 'M', '아'), + (0x3276, 'M', '자'), + (0x3277, 'M', '차'), + (0x3278, 'M', '카'), + (0x3279, 'M', '타'), + (0x327A, 'M', '파'), + (0x327B, 'M', '하'), + (0x327C, 'M', '참고'), + (0x327D, 'M', '주의'), + (0x327E, 'M', '우'), + (0x327F, 'V'), + (0x3280, 'M', '一'), + (0x3281, 'M', '二'), + (0x3282, 'M', '三'), + (0x3283, 'M', '四'), + (0x3284, 'M', '五'), + (0x3285, 'M', '六'), + (0x3286, 'M', '七'), + (0x3287, 'M', '八'), + (0x3288, 'M', '九'), + (0x3289, 'M', '十'), + (0x328A, 'M', '月'), + (0x328B, 'M', '火'), + (0x328C, 'M', '水'), + (0x328D, 'M', '木'), + (0x328E, 'M', '金'), + (0x328F, 'M', '土'), + (0x3290, 'M', '日'), + (0x3291, 'M', '株'), + (0x3292, 'M', '有'), + (0x3293, 'M', '社'), + (0x3294, 'M', '名'), + (0x3295, 'M', '特'), + (0x3296, 'M', '財'), + (0x3297, 'M', '祝'), + (0x3298, 'M', '労'), + (0x3299, 'M', '秘'), + (0x329A, 'M', '男'), + (0x329B, 'M', '女'), + (0x329C, 'M', '適'), + (0x329D, 'M', '優'), + (0x329E, 'M', '印'), + (0x329F, 'M', '注'), + (0x32A0, 'M', '項'), + (0x32A1, 'M', '休'), + (0x32A2, 'M', '写'), + (0x32A3, 'M', '正'), + (0x32A4, 'M', '上'), + (0x32A5, 'M', '中'), + (0x32A6, 'M', '下'), + (0x32A7, 'M', '左'), + (0x32A8, 'M', '右'), + (0x32A9, 'M', '医'), + (0x32AA, 'M', '宗'), + (0x32AB, 'M', '学'), + (0x32AC, 'M', '監'), + (0x32AD, 'M', '企'), + (0x32AE, 'M', '資'), + (0x32AF, 'M', '協'), + (0x32B0, 'M', '夜'), + (0x32B1, 'M', '36'), + ] + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x32B2, 'M', '37'), + (0x32B3, 'M', '38'), + (0x32B4, 'M', '39'), + (0x32B5, 'M', '40'), + (0x32B6, 'M', '41'), + (0x32B7, 'M', '42'), + (0x32B8, 'M', '43'), + (0x32B9, 'M', '44'), + (0x32BA, 'M', '45'), + (0x32BB, 'M', '46'), + (0x32BC, 'M', '47'), + (0x32BD, 'M', '48'), + (0x32BE, 'M', '49'), + (0x32BF, 'M', '50'), + (0x32C0, 'M', '1月'), + (0x32C1, 'M', '2月'), + (0x32C2, 'M', '3月'), + (0x32C3, 'M', '4月'), + (0x32C4, 'M', '5月'), + (0x32C5, 'M', '6月'), + (0x32C6, 'M', '7月'), + (0x32C7, 'M', '8月'), + (0x32C8, 'M', '9月'), + (0x32C9, 'M', '10月'), + (0x32CA, 'M', '11月'), + (0x32CB, 'M', '12月'), + (0x32CC, 'M', 'hg'), + (0x32CD, 'M', 'erg'), + (0x32CE, 'M', 'ev'), + (0x32CF, 'M', 'ltd'), + (0x32D0, 'M', 'ア'), + (0x32D1, 'M', 'イ'), + (0x32D2, 'M', 'ウ'), + (0x32D3, 'M', 'エ'), + (0x32D4, 'M', 'オ'), + (0x32D5, 'M', 'カ'), + (0x32D6, 'M', 'キ'), + (0x32D7, 'M', 'ク'), + (0x32D8, 'M', 'ケ'), + (0x32D9, 'M', 'コ'), + (0x32DA, 'M', 'サ'), + (0x32DB, 'M', 'シ'), + (0x32DC, 'M', 'ス'), + (0x32DD, 'M', 'セ'), + (0x32DE, 'M', 'ソ'), + (0x32DF, 'M', 'タ'), + (0x32E0, 'M', 'チ'), + (0x32E1, 'M', 'ツ'), + (0x32E2, 'M', 'テ'), + (0x32E3, 'M', 'ト'), + (0x32E4, 'M', 'ナ'), + (0x32E5, 'M', 'ニ'), + (0x32E6, 'M', 'ヌ'), + (0x32E7, 'M', 'ネ'), + (0x32E8, 'M', 'ノ'), + (0x32E9, 'M', 'ハ'), + (0x32EA, 'M', 'ヒ'), + (0x32EB, 'M', 'フ'), + (0x32EC, 'M', 'ヘ'), + (0x32ED, 'M', 'ホ'), + (0x32EE, 'M', 'マ'), + (0x32EF, 'M', 'ミ'), + (0x32F0, 'M', 'ム'), + (0x32F1, 'M', 'メ'), + (0x32F2, 'M', 'モ'), + (0x32F3, 'M', 'ヤ'), + (0x32F4, 'M', 'ユ'), + (0x32F5, 'M', 'ヨ'), + (0x32F6, 'M', 'ラ'), + (0x32F7, 'M', 'リ'), + (0x32F8, 'M', 'ル'), + (0x32F9, 'M', 'レ'), + (0x32FA, 'M', 'ロ'), + (0x32FB, 'M', 'ワ'), + (0x32FC, 'M', 'ヰ'), + (0x32FD, 'M', 'ヱ'), + (0x32FE, 'M', 'ヲ'), + (0x32FF, 'M', '令和'), + (0x3300, 'M', 'アパート'), + (0x3301, 'M', 'アルファ'), + (0x3302, 'M', 'アンペア'), + (0x3303, 'M', 'アール'), + (0x3304, 'M', 'イニング'), + (0x3305, 'M', 'インチ'), + (0x3306, 'M', 'ウォン'), + (0x3307, 'M', 'エスクード'), + (0x3308, 'M', 'エーカー'), + (0x3309, 'M', 'オンス'), + (0x330A, 'M', 'オーム'), + (0x330B, 'M', 'カイリ'), + (0x330C, 'M', 'カラット'), + (0x330D, 'M', 'カロリー'), + (0x330E, 'M', 'ガロン'), + (0x330F, 'M', 'ガンマ'), + (0x3310, 'M', 'ギガ'), + (0x3311, 'M', 'ギニー'), + (0x3312, 'M', 'キュリー'), + (0x3313, 'M', 'ギルダー'), + (0x3314, 'M', 'キロ'), + (0x3315, 'M', 'キログラム'), + ] + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3316, 'M', 'キロメートル'), + (0x3317, 'M', 'キロワット'), + (0x3318, 'M', 'グラム'), + (0x3319, 'M', 'グラムトン'), + (0x331A, 'M', 'クルゼイロ'), + (0x331B, 'M', 'クローネ'), + (0x331C, 'M', 'ケース'), + (0x331D, 'M', 'コルナ'), + (0x331E, 'M', 'コーポ'), + (0x331F, 'M', 'サイクル'), + (0x3320, 'M', 'サンチーム'), + (0x3321, 'M', 'シリング'), + (0x3322, 'M', 'センチ'), + (0x3323, 'M', 'セント'), + (0x3324, 'M', 'ダース'), + (0x3325, 'M', 'デシ'), + (0x3326, 'M', 'ドル'), + (0x3327, 'M', 'トン'), + (0x3328, 'M', 'ナノ'), + (0x3329, 'M', 'ノット'), + (0x332A, 'M', 'ハイツ'), + (0x332B, 'M', 'パーセント'), + (0x332C, 'M', 'パーツ'), + (0x332D, 'M', 'バーレル'), + (0x332E, 'M', 'ピアストル'), + (0x332F, 'M', 'ピクル'), + (0x3330, 'M', 'ピコ'), + (0x3331, 'M', 'ビル'), + (0x3332, 'M', 'ファラッド'), + (0x3333, 'M', 'フィート'), + (0x3334, 'M', 'ブッシェル'), + (0x3335, 'M', 'フラン'), + (0x3336, 'M', 'ヘクタール'), + (0x3337, 'M', 'ペソ'), + (0x3338, 'M', 'ペニヒ'), + (0x3339, 'M', 'ヘルツ'), + (0x333A, 'M', 'ペンス'), + (0x333B, 'M', 'ページ'), + (0x333C, 'M', 'ベータ'), + (0x333D, 'M', 'ポイント'), + (0x333E, 'M', 'ボルト'), + (0x333F, 'M', 'ホン'), + (0x3340, 'M', 'ポンド'), + (0x3341, 'M', 'ホール'), + (0x3342, 'M', 'ホーン'), + (0x3343, 'M', 'マイクロ'), + (0x3344, 'M', 'マイル'), + (0x3345, 'M', 'マッハ'), + (0x3346, 'M', 'マルク'), + (0x3347, 'M', 'マンション'), + (0x3348, 'M', 'ミクロン'), + (0x3349, 'M', 'ミリ'), + (0x334A, 'M', 'ミリバール'), + (0x334B, 'M', 'メガ'), + (0x334C, 'M', 'メガトン'), + (0x334D, 'M', 'メートル'), + (0x334E, 'M', 'ヤード'), + (0x334F, 'M', 'ヤール'), + (0x3350, 'M', 'ユアン'), + (0x3351, 'M', 'リットル'), + (0x3352, 'M', 'リラ'), + (0x3353, 'M', 'ルピー'), + (0x3354, 'M', 'ルーブル'), + (0x3355, 'M', 'レム'), + (0x3356, 'M', 'レントゲン'), + (0x3357, 'M', 'ワット'), + (0x3358, 'M', '0点'), + (0x3359, 'M', '1点'), + (0x335A, 'M', '2点'), + (0x335B, 'M', '3点'), + (0x335C, 'M', '4点'), + (0x335D, 'M', '5点'), + (0x335E, 'M', '6点'), + (0x335F, 'M', '7点'), + (0x3360, 'M', '8点'), + (0x3361, 'M', '9点'), + (0x3362, 'M', '10点'), + (0x3363, 'M', '11点'), + (0x3364, 'M', '12点'), + (0x3365, 'M', '13点'), + (0x3366, 'M', '14点'), + (0x3367, 'M', '15点'), + (0x3368, 'M', '16点'), + (0x3369, 'M', '17点'), + (0x336A, 'M', '18点'), + (0x336B, 'M', '19点'), + (0x336C, 'M', '20点'), + (0x336D, 'M', '21点'), + (0x336E, 'M', '22点'), + (0x336F, 'M', '23点'), + (0x3370, 'M', '24点'), + (0x3371, 'M', 'hpa'), + (0x3372, 'M', 'da'), + (0x3373, 'M', 'au'), + (0x3374, 'M', 'bar'), + (0x3375, 'M', 'ov'), + (0x3376, 'M', 'pc'), + (0x3377, 'M', 'dm'), + (0x3378, 'M', 'dm2'), + (0x3379, 'M', 'dm3'), + ] + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x337A, 'M', 'iu'), + (0x337B, 'M', '平成'), + (0x337C, 'M', '昭和'), + (0x337D, 'M', '大正'), + (0x337E, 'M', '明治'), + (0x337F, 'M', '株式会社'), + (0x3380, 'M', 'pa'), + (0x3381, 'M', 'na'), + (0x3382, 'M', 'μa'), + (0x3383, 'M', 'ma'), + (0x3384, 'M', 'ka'), + (0x3385, 'M', 'kb'), + (0x3386, 'M', 'mb'), + (0x3387, 'M', 'gb'), + (0x3388, 'M', 'cal'), + (0x3389, 'M', 'kcal'), + (0x338A, 'M', 'pf'), + (0x338B, 'M', 'nf'), + (0x338C, 'M', 'μf'), + (0x338D, 'M', 'μg'), + (0x338E, 'M', 'mg'), + (0x338F, 'M', 'kg'), + (0x3390, 'M', 'hz'), + (0x3391, 'M', 'khz'), + (0x3392, 'M', 'mhz'), + (0x3393, 'M', 'ghz'), + (0x3394, 'M', 'thz'), + (0x3395, 'M', 'μl'), + (0x3396, 'M', 'ml'), + (0x3397, 'M', 'dl'), + (0x3398, 'M', 'kl'), + (0x3399, 'M', 'fm'), + (0x339A, 'M', 'nm'), + (0x339B, 'M', 'μm'), + (0x339C, 'M', 'mm'), + (0x339D, 'M', 'cm'), + (0x339E, 'M', 'km'), + (0x339F, 'M', 'mm2'), + (0x33A0, 'M', 'cm2'), + (0x33A1, 'M', 'm2'), + (0x33A2, 'M', 'km2'), + (0x33A3, 'M', 'mm3'), + (0x33A4, 'M', 'cm3'), + (0x33A5, 'M', 'm3'), + (0x33A6, 'M', 'km3'), + (0x33A7, 'M', 'm∕s'), + (0x33A8, 'M', 'm∕s2'), + (0x33A9, 'M', 'pa'), + (0x33AA, 'M', 'kpa'), + (0x33AB, 'M', 'mpa'), + (0x33AC, 'M', 'gpa'), + (0x33AD, 'M', 'rad'), + (0x33AE, 'M', 'rad∕s'), + (0x33AF, 'M', 'rad∕s2'), + (0x33B0, 'M', 'ps'), + (0x33B1, 'M', 'ns'), + (0x33B2, 'M', 'μs'), + (0x33B3, 'M', 'ms'), + (0x33B4, 'M', 'pv'), + (0x33B5, 'M', 'nv'), + (0x33B6, 'M', 'μv'), + (0x33B7, 'M', 'mv'), + (0x33B8, 'M', 'kv'), + (0x33B9, 'M', 'mv'), + (0x33BA, 'M', 'pw'), + (0x33BB, 'M', 'nw'), + (0x33BC, 'M', 'μw'), + (0x33BD, 'M', 'mw'), + (0x33BE, 'M', 'kw'), + (0x33BF, 'M', 'mw'), + (0x33C0, 'M', 'kω'), + (0x33C1, 'M', 'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', 'bq'), + (0x33C4, 'M', 'cc'), + (0x33C5, 'M', 'cd'), + (0x33C6, 'M', 'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', 'db'), + (0x33C9, 'M', 'gy'), + (0x33CA, 'M', 'ha'), + (0x33CB, 'M', 'hp'), + (0x33CC, 'M', 'in'), + (0x33CD, 'M', 'kk'), + (0x33CE, 'M', 'km'), + (0x33CF, 'M', 'kt'), + (0x33D0, 'M', 'lm'), + (0x33D1, 'M', 'ln'), + (0x33D2, 'M', 'log'), + (0x33D3, 'M', 'lx'), + (0x33D4, 'M', 'mb'), + (0x33D5, 'M', 'mil'), + (0x33D6, 'M', 'mol'), + (0x33D7, 'M', 'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', 'ppm'), + (0x33DA, 'M', 'pr'), + (0x33DB, 'M', 'sr'), + (0x33DC, 'M', 'sv'), + (0x33DD, 'M', 'wb'), + ] + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x33DE, 'M', 'v∕m'), + (0x33DF, 'M', 'a∕m'), + (0x33E0, 'M', '1日'), + (0x33E1, 'M', '2日'), + (0x33E2, 'M', '3日'), + (0x33E3, 'M', '4日'), + (0x33E4, 'M', '5日'), + (0x33E5, 'M', '6日'), + (0x33E6, 'M', '7日'), + (0x33E7, 'M', '8日'), + (0x33E8, 'M', '9日'), + (0x33E9, 'M', '10日'), + (0x33EA, 'M', '11日'), + (0x33EB, 'M', '12日'), + (0x33EC, 'M', '13日'), + (0x33ED, 'M', '14日'), + (0x33EE, 'M', '15日'), + (0x33EF, 'M', '16日'), + (0x33F0, 'M', '17日'), + (0x33F1, 'M', '18日'), + (0x33F2, 'M', '19日'), + (0x33F3, 'M', '20日'), + (0x33F4, 'M', '21日'), + (0x33F5, 'M', '22日'), + (0x33F6, 'M', '23日'), + (0x33F7, 'M', '24日'), + (0x33F8, 'M', '25日'), + (0x33F9, 'M', '26日'), + (0x33FA, 'M', '27日'), + (0x33FB, 'M', '28日'), + (0x33FC, 'M', '29日'), + (0x33FD, 'M', '30日'), + (0x33FE, 'M', '31日'), + (0x33FF, 'M', 'gal'), + (0x3400, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', 'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', 'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', 'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', 'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', 'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', 'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', 'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', 'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', 'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', 'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', 'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', 'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', 'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', 'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', 'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', 'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', 'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', 'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', 'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', 'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', 'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', 'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', 'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', 'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', 'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', 'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', 'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', 'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', 'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', 'ꚍ'), + (0xA68D, 'V'), + ] + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA68E, 'M', 'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', 'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', 'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', 'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', 'ꚗ'), + (0xA697, 'V'), + (0xA698, 'M', 'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', 'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', 'ъ'), + (0xA69D, 'M', 'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + (0xA700, 'V'), + (0xA722, 'M', 'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', 'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', 'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', 'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', 'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', 'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', 'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', 'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', 'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', 'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', 'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', 'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', 'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', 'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', 'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', 'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', 'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', 'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', 'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', 'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', 'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', 'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', 'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', 'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', 'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', 'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', 'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', 'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', 'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', 'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', 'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', 'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', 'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', 'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', 'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', 'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', 'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', 'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', 'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', 'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', 'ꝼ'), + ] + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA77C, 'V'), + (0xA77D, 'M', 'ᵹ'), + (0xA77E, 'M', 'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', 'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', 'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', 'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', 'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', 'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', 'ɥ'), + (0xA78E, 'V'), + (0xA790, 'M', 'ꞑ'), + (0xA791, 'V'), + (0xA792, 'M', 'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', 'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', 'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', 'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', 'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', 'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', 'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', 'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', 'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', 'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', 'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', 'ɦ'), + (0xA7AB, 'M', 'ɜ'), + (0xA7AC, 'M', 'ɡ'), + (0xA7AD, 'M', 'ɬ'), + (0xA7AE, 'M', 'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', 'ʞ'), + (0xA7B1, 'M', 'ʇ'), + (0xA7B2, 'M', 'ʝ'), + (0xA7B3, 'M', 'ꭓ'), + (0xA7B4, 'M', 'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', 'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'M', 'ꞹ'), + (0xA7B9, 'V'), + (0xA7BA, 'M', 'ꞻ'), + (0xA7BB, 'V'), + (0xA7BC, 'M', 'ꞽ'), + (0xA7BD, 'V'), + (0xA7BE, 'M', 'ꞿ'), + (0xA7BF, 'V'), + (0xA7C0, 'M', 'ꟁ'), + (0xA7C1, 'V'), + (0xA7C2, 'M', 'ꟃ'), + (0xA7C3, 'V'), + (0xA7C4, 'M', 'ꞔ'), + (0xA7C5, 'M', 'ʂ'), + (0xA7C6, 'M', 'ᶎ'), + (0xA7C7, 'M', 'ꟈ'), + (0xA7C8, 'V'), + (0xA7C9, 'M', 'ꟊ'), + (0xA7CA, 'V'), + (0xA7CB, 'X'), + (0xA7D0, 'M', 'ꟑ'), + (0xA7D1, 'V'), + (0xA7D2, 'X'), + (0xA7D3, 'V'), + (0xA7D4, 'X'), + (0xA7D5, 'V'), + (0xA7D6, 'M', 'ꟗ'), + (0xA7D7, 'V'), + (0xA7D8, 'M', 'ꟙ'), + (0xA7D9, 'V'), + (0xA7DA, 'X'), + (0xA7F2, 'M', 'c'), + (0xA7F3, 'M', 'f'), + (0xA7F4, 'M', 'q'), + (0xA7F5, 'M', 'ꟶ'), + (0xA7F6, 'V'), + (0xA7F8, 'M', 'ħ'), + (0xA7F9, 'M', 'œ'), + (0xA7FA, 'V'), + (0xA82D, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + ] + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', 'ꜧ'), + (0xAB5D, 'M', 'ꬷ'), + (0xAB5E, 'M', 'ɫ'), + (0xAB5F, 'M', 'ꭒ'), + (0xAB60, 'V'), + (0xAB69, 'M', 'ʍ'), + (0xAB6A, 'V'), + (0xAB6C, 'X'), + (0xAB70, 'M', 'Ꭰ'), + (0xAB71, 'M', 'Ꭱ'), + (0xAB72, 'M', 'Ꭲ'), + (0xAB73, 'M', 'Ꭳ'), + (0xAB74, 'M', 'Ꭴ'), + (0xAB75, 'M', 'Ꭵ'), + (0xAB76, 'M', 'Ꭶ'), + (0xAB77, 'M', 'Ꭷ'), + (0xAB78, 'M', 'Ꭸ'), + (0xAB79, 'M', 'Ꭹ'), + (0xAB7A, 'M', 'Ꭺ'), + (0xAB7B, 'M', 'Ꭻ'), + (0xAB7C, 'M', 'Ꭼ'), + (0xAB7D, 'M', 'Ꭽ'), + (0xAB7E, 'M', 'Ꭾ'), + (0xAB7F, 'M', 'Ꭿ'), + (0xAB80, 'M', 'Ꮀ'), + (0xAB81, 'M', 'Ꮁ'), + (0xAB82, 'M', 'Ꮂ'), + (0xAB83, 'M', 'Ꮃ'), + (0xAB84, 'M', 'Ꮄ'), + (0xAB85, 'M', 'Ꮅ'), + (0xAB86, 'M', 'Ꮆ'), + (0xAB87, 'M', 'Ꮇ'), + (0xAB88, 'M', 'Ꮈ'), + (0xAB89, 'M', 'Ꮉ'), + (0xAB8A, 'M', 'Ꮊ'), + (0xAB8B, 'M', 'Ꮋ'), + (0xAB8C, 'M', 'Ꮌ'), + (0xAB8D, 'M', 'Ꮍ'), + (0xAB8E, 'M', 'Ꮎ'), + (0xAB8F, 'M', 'Ꮏ'), + (0xAB90, 'M', 'Ꮐ'), + (0xAB91, 'M', 'Ꮑ'), + (0xAB92, 'M', 'Ꮒ'), + (0xAB93, 'M', 'Ꮓ'), + (0xAB94, 'M', 'Ꮔ'), + (0xAB95, 'M', 'Ꮕ'), + (0xAB96, 'M', 'Ꮖ'), + (0xAB97, 'M', 'Ꮗ'), + (0xAB98, 'M', 'Ꮘ'), + (0xAB99, 'M', 'Ꮙ'), + (0xAB9A, 'M', 'Ꮚ'), + (0xAB9B, 'M', 'Ꮛ'), + (0xAB9C, 'M', 'Ꮜ'), + (0xAB9D, 'M', 'Ꮝ'), + (0xAB9E, 'M', 'Ꮞ'), + (0xAB9F, 'M', 'Ꮟ'), + (0xABA0, 'M', 'Ꮠ'), + (0xABA1, 'M', 'Ꮡ'), + (0xABA2, 'M', 'Ꮢ'), + (0xABA3, 'M', 'Ꮣ'), + (0xABA4, 'M', 'Ꮤ'), + (0xABA5, 'M', 'Ꮥ'), + (0xABA6, 'M', 'Ꮦ'), + (0xABA7, 'M', 'Ꮧ'), + (0xABA8, 'M', 'Ꮨ'), + (0xABA9, 'M', 'Ꮩ'), + (0xABAA, 'M', 'Ꮪ'), + ] + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xABAB, 'M', 'Ꮫ'), + (0xABAC, 'M', 'Ꮬ'), + (0xABAD, 'M', 'Ꮭ'), + (0xABAE, 'M', 'Ꮮ'), + (0xABAF, 'M', 'Ꮯ'), + (0xABB0, 'M', 'Ꮰ'), + (0xABB1, 'M', 'Ꮱ'), + (0xABB2, 'M', 'Ꮲ'), + (0xABB3, 'M', 'Ꮳ'), + (0xABB4, 'M', 'Ꮴ'), + (0xABB5, 'M', 'Ꮵ'), + (0xABB6, 'M', 'Ꮶ'), + (0xABB7, 'M', 'Ꮷ'), + (0xABB8, 'M', 'Ꮸ'), + (0xABB9, 'M', 'Ꮹ'), + (0xABBA, 'M', 'Ꮺ'), + (0xABBB, 'M', 'Ꮻ'), + (0xABBC, 'M', 'Ꮼ'), + (0xABBD, 'M', 'Ꮽ'), + (0xABBE, 'M', 'Ꮾ'), + (0xABBF, 'M', 'Ꮿ'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', '豈'), + (0xF901, 'M', '更'), + (0xF902, 'M', '車'), + (0xF903, 'M', '賈'), + (0xF904, 'M', '滑'), + (0xF905, 'M', '串'), + (0xF906, 'M', '句'), + (0xF907, 'M', '龜'), + (0xF909, 'M', '契'), + (0xF90A, 'M', '金'), + (0xF90B, 'M', '喇'), + (0xF90C, 'M', '奈'), + (0xF90D, 'M', '懶'), + (0xF90E, 'M', '癩'), + (0xF90F, 'M', '羅'), + (0xF910, 'M', '蘿'), + (0xF911, 'M', '螺'), + (0xF912, 'M', '裸'), + (0xF913, 'M', '邏'), + (0xF914, 'M', '樂'), + (0xF915, 'M', '洛'), + (0xF916, 'M', '烙'), + (0xF917, 'M', '珞'), + (0xF918, 'M', '落'), + (0xF919, 'M', '酪'), + (0xF91A, 'M', '駱'), + (0xF91B, 'M', '亂'), + (0xF91C, 'M', '卵'), + (0xF91D, 'M', '欄'), + (0xF91E, 'M', '爛'), + (0xF91F, 'M', '蘭'), + (0xF920, 'M', '鸞'), + (0xF921, 'M', '嵐'), + (0xF922, 'M', '濫'), + (0xF923, 'M', '藍'), + (0xF924, 'M', '襤'), + (0xF925, 'M', '拉'), + (0xF926, 'M', '臘'), + (0xF927, 'M', '蠟'), + (0xF928, 'M', '廊'), + (0xF929, 'M', '朗'), + (0xF92A, 'M', '浪'), + (0xF92B, 'M', '狼'), + (0xF92C, 'M', '郎'), + (0xF92D, 'M', '來'), + (0xF92E, 'M', '冷'), + (0xF92F, 'M', '勞'), + (0xF930, 'M', '擄'), + (0xF931, 'M', '櫓'), + (0xF932, 'M', '爐'), + (0xF933, 'M', '盧'), + (0xF934, 'M', '老'), + (0xF935, 'M', '蘆'), + (0xF936, 'M', '虜'), + (0xF937, 'M', '路'), + (0xF938, 'M', '露'), + (0xF939, 'M', '魯'), + (0xF93A, 'M', '鷺'), + (0xF93B, 'M', '碌'), + (0xF93C, 'M', '祿'), + (0xF93D, 'M', '綠'), + (0xF93E, 'M', '菉'), + (0xF93F, 'M', '錄'), + (0xF940, 'M', '鹿'), + (0xF941, 'M', '論'), + (0xF942, 'M', '壟'), + (0xF943, 'M', '弄'), + (0xF944, 'M', '籠'), + (0xF945, 'M', '聾'), + ] + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF946, 'M', '牢'), + (0xF947, 'M', '磊'), + (0xF948, 'M', '賂'), + (0xF949, 'M', '雷'), + (0xF94A, 'M', '壘'), + (0xF94B, 'M', '屢'), + (0xF94C, 'M', '樓'), + (0xF94D, 'M', '淚'), + (0xF94E, 'M', '漏'), + (0xF94F, 'M', '累'), + (0xF950, 'M', '縷'), + (0xF951, 'M', '陋'), + (0xF952, 'M', '勒'), + (0xF953, 'M', '肋'), + (0xF954, 'M', '凜'), + (0xF955, 'M', '凌'), + (0xF956, 'M', '稜'), + (0xF957, 'M', '綾'), + (0xF958, 'M', '菱'), + (0xF959, 'M', '陵'), + (0xF95A, 'M', '讀'), + (0xF95B, 'M', '拏'), + (0xF95C, 'M', '樂'), + (0xF95D, 'M', '諾'), + (0xF95E, 'M', '丹'), + (0xF95F, 'M', '寧'), + (0xF960, 'M', '怒'), + (0xF961, 'M', '率'), + (0xF962, 'M', '異'), + (0xF963, 'M', '北'), + (0xF964, 'M', '磻'), + (0xF965, 'M', '便'), + (0xF966, 'M', '復'), + (0xF967, 'M', '不'), + (0xF968, 'M', '泌'), + (0xF969, 'M', '數'), + (0xF96A, 'M', '索'), + (0xF96B, 'M', '參'), + (0xF96C, 'M', '塞'), + (0xF96D, 'M', '省'), + (0xF96E, 'M', '葉'), + (0xF96F, 'M', '說'), + (0xF970, 'M', '殺'), + (0xF971, 'M', '辰'), + (0xF972, 'M', '沈'), + (0xF973, 'M', '拾'), + (0xF974, 'M', '若'), + (0xF975, 'M', '掠'), + (0xF976, 'M', '略'), + (0xF977, 'M', '亮'), + (0xF978, 'M', '兩'), + (0xF979, 'M', '凉'), + (0xF97A, 'M', '梁'), + (0xF97B, 'M', '糧'), + (0xF97C, 'M', '良'), + (0xF97D, 'M', '諒'), + (0xF97E, 'M', '量'), + (0xF97F, 'M', '勵'), + (0xF980, 'M', '呂'), + (0xF981, 'M', '女'), + (0xF982, 'M', '廬'), + (0xF983, 'M', '旅'), + (0xF984, 'M', '濾'), + (0xF985, 'M', '礪'), + (0xF986, 'M', '閭'), + (0xF987, 'M', '驪'), + (0xF988, 'M', '麗'), + (0xF989, 'M', '黎'), + (0xF98A, 'M', '力'), + (0xF98B, 'M', '曆'), + (0xF98C, 'M', '歷'), + (0xF98D, 'M', '轢'), + (0xF98E, 'M', '年'), + (0xF98F, 'M', '憐'), + (0xF990, 'M', '戀'), + (0xF991, 'M', '撚'), + (0xF992, 'M', '漣'), + (0xF993, 'M', '煉'), + (0xF994, 'M', '璉'), + (0xF995, 'M', '秊'), + (0xF996, 'M', '練'), + (0xF997, 'M', '聯'), + (0xF998, 'M', '輦'), + (0xF999, 'M', '蓮'), + (0xF99A, 'M', '連'), + (0xF99B, 'M', '鍊'), + (0xF99C, 'M', '列'), + (0xF99D, 'M', '劣'), + (0xF99E, 'M', '咽'), + (0xF99F, 'M', '烈'), + (0xF9A0, 'M', '裂'), + (0xF9A1, 'M', '說'), + (0xF9A2, 'M', '廉'), + (0xF9A3, 'M', '念'), + (0xF9A4, 'M', '捻'), + (0xF9A5, 'M', '殮'), + (0xF9A6, 'M', '簾'), + (0xF9A7, 'M', '獵'), + (0xF9A8, 'M', '令'), + (0xF9A9, 'M', '囹'), + ] + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF9AA, 'M', '寧'), + (0xF9AB, 'M', '嶺'), + (0xF9AC, 'M', '怜'), + (0xF9AD, 'M', '玲'), + (0xF9AE, 'M', '瑩'), + (0xF9AF, 'M', '羚'), + (0xF9B0, 'M', '聆'), + (0xF9B1, 'M', '鈴'), + (0xF9B2, 'M', '零'), + (0xF9B3, 'M', '靈'), + (0xF9B4, 'M', '領'), + (0xF9B5, 'M', '例'), + (0xF9B6, 'M', '禮'), + (0xF9B7, 'M', '醴'), + (0xF9B8, 'M', '隸'), + (0xF9B9, 'M', '惡'), + (0xF9BA, 'M', '了'), + (0xF9BB, 'M', '僚'), + (0xF9BC, 'M', '寮'), + (0xF9BD, 'M', '尿'), + (0xF9BE, 'M', '料'), + (0xF9BF, 'M', '樂'), + (0xF9C0, 'M', '燎'), + (0xF9C1, 'M', '療'), + (0xF9C2, 'M', '蓼'), + (0xF9C3, 'M', '遼'), + (0xF9C4, 'M', '龍'), + (0xF9C5, 'M', '暈'), + (0xF9C6, 'M', '阮'), + (0xF9C7, 'M', '劉'), + (0xF9C8, 'M', '杻'), + (0xF9C9, 'M', '柳'), + (0xF9CA, 'M', '流'), + (0xF9CB, 'M', '溜'), + (0xF9CC, 'M', '琉'), + (0xF9CD, 'M', '留'), + (0xF9CE, 'M', '硫'), + (0xF9CF, 'M', '紐'), + (0xF9D0, 'M', '類'), + (0xF9D1, 'M', '六'), + (0xF9D2, 'M', '戮'), + (0xF9D3, 'M', '陸'), + (0xF9D4, 'M', '倫'), + (0xF9D5, 'M', '崙'), + (0xF9D6, 'M', '淪'), + (0xF9D7, 'M', '輪'), + (0xF9D8, 'M', '律'), + (0xF9D9, 'M', '慄'), + (0xF9DA, 'M', '栗'), + (0xF9DB, 'M', '率'), + (0xF9DC, 'M', '隆'), + (0xF9DD, 'M', '利'), + (0xF9DE, 'M', '吏'), + (0xF9DF, 'M', '履'), + (0xF9E0, 'M', '易'), + (0xF9E1, 'M', '李'), + (0xF9E2, 'M', '梨'), + (0xF9E3, 'M', '泥'), + (0xF9E4, 'M', '理'), + (0xF9E5, 'M', '痢'), + (0xF9E6, 'M', '罹'), + (0xF9E7, 'M', '裏'), + (0xF9E8, 'M', '裡'), + (0xF9E9, 'M', '里'), + (0xF9EA, 'M', '離'), + (0xF9EB, 'M', '匿'), + (0xF9EC, 'M', '溺'), + (0xF9ED, 'M', '吝'), + (0xF9EE, 'M', '燐'), + (0xF9EF, 'M', '璘'), + (0xF9F0, 'M', '藺'), + (0xF9F1, 'M', '隣'), + (0xF9F2, 'M', '鱗'), + (0xF9F3, 'M', '麟'), + (0xF9F4, 'M', '林'), + (0xF9F5, 'M', '淋'), + (0xF9F6, 'M', '臨'), + (0xF9F7, 'M', '立'), + (0xF9F8, 'M', '笠'), + (0xF9F9, 'M', '粒'), + (0xF9FA, 'M', '狀'), + (0xF9FB, 'M', '炙'), + (0xF9FC, 'M', '識'), + (0xF9FD, 'M', '什'), + (0xF9FE, 'M', '茶'), + (0xF9FF, 'M', '刺'), + (0xFA00, 'M', '切'), + (0xFA01, 'M', '度'), + (0xFA02, 'M', '拓'), + (0xFA03, 'M', '糖'), + (0xFA04, 'M', '宅'), + (0xFA05, 'M', '洞'), + (0xFA06, 'M', '暴'), + (0xFA07, 'M', '輻'), + (0xFA08, 'M', '行'), + (0xFA09, 'M', '降'), + (0xFA0A, 'M', '見'), + (0xFA0B, 'M', '廓'), + (0xFA0C, 'M', '兀'), + (0xFA0D, 'M', '嗀'), + ] + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA0E, 'V'), + (0xFA10, 'M', '塚'), + (0xFA11, 'V'), + (0xFA12, 'M', '晴'), + (0xFA13, 'V'), + (0xFA15, 'M', '凞'), + (0xFA16, 'M', '猪'), + (0xFA17, 'M', '益'), + (0xFA18, 'M', '礼'), + (0xFA19, 'M', '神'), + (0xFA1A, 'M', '祥'), + (0xFA1B, 'M', '福'), + (0xFA1C, 'M', '靖'), + (0xFA1D, 'M', '精'), + (0xFA1E, 'M', '羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', '蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', '諸'), + (0xFA23, 'V'), + (0xFA25, 'M', '逸'), + (0xFA26, 'M', '都'), + (0xFA27, 'V'), + (0xFA2A, 'M', '飯'), + (0xFA2B, 'M', '飼'), + (0xFA2C, 'M', '館'), + (0xFA2D, 'M', '鶴'), + (0xFA2E, 'M', '郞'), + (0xFA2F, 'M', '隷'), + (0xFA30, 'M', '侮'), + (0xFA31, 'M', '僧'), + (0xFA32, 'M', '免'), + (0xFA33, 'M', '勉'), + (0xFA34, 'M', '勤'), + (0xFA35, 'M', '卑'), + (0xFA36, 'M', '喝'), + (0xFA37, 'M', '嘆'), + (0xFA38, 'M', '器'), + (0xFA39, 'M', '塀'), + (0xFA3A, 'M', '墨'), + (0xFA3B, 'M', '層'), + (0xFA3C, 'M', '屮'), + (0xFA3D, 'M', '悔'), + (0xFA3E, 'M', '慨'), + (0xFA3F, 'M', '憎'), + (0xFA40, 'M', '懲'), + (0xFA41, 'M', '敏'), + (0xFA42, 'M', '既'), + (0xFA43, 'M', '暑'), + (0xFA44, 'M', '梅'), + (0xFA45, 'M', '海'), + (0xFA46, 'M', '渚'), + (0xFA47, 'M', '漢'), + (0xFA48, 'M', '煮'), + (0xFA49, 'M', '爫'), + (0xFA4A, 'M', '琢'), + (0xFA4B, 'M', '碑'), + (0xFA4C, 'M', '社'), + (0xFA4D, 'M', '祉'), + (0xFA4E, 'M', '祈'), + (0xFA4F, 'M', '祐'), + (0xFA50, 'M', '祖'), + (0xFA51, 'M', '祝'), + (0xFA52, 'M', '禍'), + (0xFA53, 'M', '禎'), + (0xFA54, 'M', '穀'), + (0xFA55, 'M', '突'), + (0xFA56, 'M', '節'), + (0xFA57, 'M', '練'), + (0xFA58, 'M', '縉'), + (0xFA59, 'M', '繁'), + (0xFA5A, 'M', '署'), + (0xFA5B, 'M', '者'), + (0xFA5C, 'M', '臭'), + (0xFA5D, 'M', '艹'), + (0xFA5F, 'M', '著'), + (0xFA60, 'M', '褐'), + (0xFA61, 'M', '視'), + (0xFA62, 'M', '謁'), + (0xFA63, 'M', '謹'), + (0xFA64, 'M', '賓'), + (0xFA65, 'M', '贈'), + (0xFA66, 'M', '辶'), + (0xFA67, 'M', '逸'), + (0xFA68, 'M', '難'), + (0xFA69, 'M', '響'), + (0xFA6A, 'M', '頻'), + (0xFA6B, 'M', '恵'), + (0xFA6C, 'M', '𤋮'), + (0xFA6D, 'M', '舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', '並'), + (0xFA71, 'M', '况'), + (0xFA72, 'M', '全'), + (0xFA73, 'M', '侀'), + (0xFA74, 'M', '充'), + (0xFA75, 'M', '冀'), + (0xFA76, 'M', '勇'), + (0xFA77, 'M', '勺'), + (0xFA78, 'M', '喝'), + ] + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA79, 'M', '啕'), + (0xFA7A, 'M', '喙'), + (0xFA7B, 'M', '嗢'), + (0xFA7C, 'M', '塚'), + (0xFA7D, 'M', '墳'), + (0xFA7E, 'M', '奄'), + (0xFA7F, 'M', '奔'), + (0xFA80, 'M', '婢'), + (0xFA81, 'M', '嬨'), + (0xFA82, 'M', '廒'), + (0xFA83, 'M', '廙'), + (0xFA84, 'M', '彩'), + (0xFA85, 'M', '徭'), + (0xFA86, 'M', '惘'), + (0xFA87, 'M', '慎'), + (0xFA88, 'M', '愈'), + (0xFA89, 'M', '憎'), + (0xFA8A, 'M', '慠'), + (0xFA8B, 'M', '懲'), + (0xFA8C, 'M', '戴'), + (0xFA8D, 'M', '揄'), + (0xFA8E, 'M', '搜'), + (0xFA8F, 'M', '摒'), + (0xFA90, 'M', '敖'), + (0xFA91, 'M', '晴'), + (0xFA92, 'M', '朗'), + (0xFA93, 'M', '望'), + (0xFA94, 'M', '杖'), + (0xFA95, 'M', '歹'), + (0xFA96, 'M', '殺'), + (0xFA97, 'M', '流'), + (0xFA98, 'M', '滛'), + (0xFA99, 'M', '滋'), + (0xFA9A, 'M', '漢'), + (0xFA9B, 'M', '瀞'), + (0xFA9C, 'M', '煮'), + (0xFA9D, 'M', '瞧'), + (0xFA9E, 'M', '爵'), + (0xFA9F, 'M', '犯'), + (0xFAA0, 'M', '猪'), + (0xFAA1, 'M', '瑱'), + (0xFAA2, 'M', '甆'), + (0xFAA3, 'M', '画'), + (0xFAA4, 'M', '瘝'), + (0xFAA5, 'M', '瘟'), + (0xFAA6, 'M', '益'), + (0xFAA7, 'M', '盛'), + (0xFAA8, 'M', '直'), + (0xFAA9, 'M', '睊'), + (0xFAAA, 'M', '着'), + (0xFAAB, 'M', '磌'), + (0xFAAC, 'M', '窱'), + (0xFAAD, 'M', '節'), + (0xFAAE, 'M', '类'), + (0xFAAF, 'M', '絛'), + (0xFAB0, 'M', '練'), + (0xFAB1, 'M', '缾'), + (0xFAB2, 'M', '者'), + (0xFAB3, 'M', '荒'), + (0xFAB4, 'M', '華'), + (0xFAB5, 'M', '蝹'), + (0xFAB6, 'M', '襁'), + (0xFAB7, 'M', '覆'), + (0xFAB8, 'M', '視'), + (0xFAB9, 'M', '調'), + (0xFABA, 'M', '諸'), + (0xFABB, 'M', '請'), + (0xFABC, 'M', '謁'), + (0xFABD, 'M', '諾'), + (0xFABE, 'M', '諭'), + (0xFABF, 'M', '謹'), + (0xFAC0, 'M', '變'), + (0xFAC1, 'M', '贈'), + (0xFAC2, 'M', '輸'), + (0xFAC3, 'M', '遲'), + (0xFAC4, 'M', '醙'), + (0xFAC5, 'M', '鉶'), + (0xFAC6, 'M', '陼'), + (0xFAC7, 'M', '難'), + (0xFAC8, 'M', '靖'), + (0xFAC9, 'M', '韛'), + (0xFACA, 'M', '響'), + (0xFACB, 'M', '頋'), + (0xFACC, 'M', '頻'), + (0xFACD, 'M', '鬒'), + (0xFACE, 'M', '龜'), + (0xFACF, 'M', '𢡊'), + (0xFAD0, 'M', '𢡄'), + (0xFAD1, 'M', '𣏕'), + (0xFAD2, 'M', '㮝'), + (0xFAD3, 'M', '䀘'), + (0xFAD4, 'M', '䀹'), + (0xFAD5, 'M', '𥉉'), + (0xFAD6, 'M', '𥳐'), + (0xFAD7, 'M', '𧻓'), + (0xFAD8, 'M', '齃'), + (0xFAD9, 'M', '龎'), + (0xFADA, 'X'), + (0xFB00, 'M', 'ff'), + (0xFB01, 'M', 'fi'), + ] + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFB02, 'M', 'fl'), + (0xFB03, 'M', 'ffi'), + (0xFB04, 'M', 'ffl'), + (0xFB05, 'M', 'st'), + (0xFB07, 'X'), + (0xFB13, 'M', 'մն'), + (0xFB14, 'M', 'մե'), + (0xFB15, 'M', 'մի'), + (0xFB16, 'M', 'վն'), + (0xFB17, 'M', 'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', 'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', 'ײַ'), + (0xFB20, 'M', 'ע'), + (0xFB21, 'M', 'א'), + (0xFB22, 'M', 'ד'), + (0xFB23, 'M', 'ה'), + (0xFB24, 'M', 'כ'), + (0xFB25, 'M', 'ל'), + (0xFB26, 'M', 'ם'), + (0xFB27, 'M', 'ר'), + (0xFB28, 'M', 'ת'), + (0xFB29, '3', '+'), + (0xFB2A, 'M', 'שׁ'), + (0xFB2B, 'M', 'שׂ'), + (0xFB2C, 'M', 'שּׁ'), + (0xFB2D, 'M', 'שּׂ'), + (0xFB2E, 'M', 'אַ'), + (0xFB2F, 'M', 'אָ'), + (0xFB30, 'M', 'אּ'), + (0xFB31, 'M', 'בּ'), + (0xFB32, 'M', 'גּ'), + (0xFB33, 'M', 'דּ'), + (0xFB34, 'M', 'הּ'), + (0xFB35, 'M', 'וּ'), + (0xFB36, 'M', 'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', 'טּ'), + (0xFB39, 'M', 'יּ'), + (0xFB3A, 'M', 'ךּ'), + (0xFB3B, 'M', 'כּ'), + (0xFB3C, 'M', 'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', 'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', 'נּ'), + (0xFB41, 'M', 'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', 'ףּ'), + (0xFB44, 'M', 'פּ'), + (0xFB45, 'X'), + (0xFB46, 'M', 'צּ'), + (0xFB47, 'M', 'קּ'), + (0xFB48, 'M', 'רּ'), + (0xFB49, 'M', 'שּ'), + (0xFB4A, 'M', 'תּ'), + (0xFB4B, 'M', 'וֹ'), + (0xFB4C, 'M', 'בֿ'), + (0xFB4D, 'M', 'כֿ'), + (0xFB4E, 'M', 'פֿ'), + (0xFB4F, 'M', 'אל'), + (0xFB50, 'M', 'ٱ'), + (0xFB52, 'M', 'ٻ'), + (0xFB56, 'M', 'پ'), + (0xFB5A, 'M', 'ڀ'), + (0xFB5E, 'M', 'ٺ'), + (0xFB62, 'M', 'ٿ'), + (0xFB66, 'M', 'ٹ'), + (0xFB6A, 'M', 'ڤ'), + (0xFB6E, 'M', 'ڦ'), + (0xFB72, 'M', 'ڄ'), + (0xFB76, 'M', 'ڃ'), + (0xFB7A, 'M', 'چ'), + (0xFB7E, 'M', 'ڇ'), + (0xFB82, 'M', 'ڍ'), + (0xFB84, 'M', 'ڌ'), + (0xFB86, 'M', 'ڎ'), + (0xFB88, 'M', 'ڈ'), + (0xFB8A, 'M', 'ژ'), + (0xFB8C, 'M', 'ڑ'), + (0xFB8E, 'M', 'ک'), + (0xFB92, 'M', 'گ'), + (0xFB96, 'M', 'ڳ'), + (0xFB9A, 'M', 'ڱ'), + (0xFB9E, 'M', 'ں'), + (0xFBA0, 'M', 'ڻ'), + (0xFBA4, 'M', 'ۀ'), + (0xFBA6, 'M', 'ہ'), + (0xFBAA, 'M', 'ھ'), + (0xFBAE, 'M', 'ے'), + (0xFBB0, 'M', 'ۓ'), + (0xFBB2, 'V'), + (0xFBC3, 'X'), + (0xFBD3, 'M', 'ڭ'), + (0xFBD7, 'M', 'ۇ'), + (0xFBD9, 'M', 'ۆ'), + (0xFBDB, 'M', 'ۈ'), + (0xFBDD, 'M', 'ۇٴ'), + (0xFBDE, 'M', 'ۋ'), + ] + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFBE0, 'M', 'ۅ'), + (0xFBE2, 'M', 'ۉ'), + (0xFBE4, 'M', 'ې'), + (0xFBE8, 'M', 'ى'), + (0xFBEA, 'M', 'ئا'), + (0xFBEC, 'M', 'ئە'), + (0xFBEE, 'M', 'ئو'), + (0xFBF0, 'M', 'ئۇ'), + (0xFBF2, 'M', 'ئۆ'), + (0xFBF4, 'M', 'ئۈ'), + (0xFBF6, 'M', 'ئې'), + (0xFBF9, 'M', 'ئى'), + (0xFBFC, 'M', 'ی'), + (0xFC00, 'M', 'ئج'), + (0xFC01, 'M', 'ئح'), + (0xFC02, 'M', 'ئم'), + (0xFC03, 'M', 'ئى'), + (0xFC04, 'M', 'ئي'), + (0xFC05, 'M', 'بج'), + (0xFC06, 'M', 'بح'), + (0xFC07, 'M', 'بخ'), + (0xFC08, 'M', 'بم'), + (0xFC09, 'M', 'بى'), + (0xFC0A, 'M', 'بي'), + (0xFC0B, 'M', 'تج'), + (0xFC0C, 'M', 'تح'), + (0xFC0D, 'M', 'تخ'), + (0xFC0E, 'M', 'تم'), + (0xFC0F, 'M', 'تى'), + (0xFC10, 'M', 'تي'), + (0xFC11, 'M', 'ثج'), + (0xFC12, 'M', 'ثم'), + (0xFC13, 'M', 'ثى'), + (0xFC14, 'M', 'ثي'), + (0xFC15, 'M', 'جح'), + (0xFC16, 'M', 'جم'), + (0xFC17, 'M', 'حج'), + (0xFC18, 'M', 'حم'), + (0xFC19, 'M', 'خج'), + (0xFC1A, 'M', 'خح'), + (0xFC1B, 'M', 'خم'), + (0xFC1C, 'M', 'سج'), + (0xFC1D, 'M', 'سح'), + (0xFC1E, 'M', 'سخ'), + (0xFC1F, 'M', 'سم'), + (0xFC20, 'M', 'صح'), + (0xFC21, 'M', 'صم'), + (0xFC22, 'M', 'ضج'), + (0xFC23, 'M', 'ضح'), + (0xFC24, 'M', 'ضخ'), + (0xFC25, 'M', 'ضم'), + (0xFC26, 'M', 'طح'), + (0xFC27, 'M', 'طم'), + (0xFC28, 'M', 'ظم'), + (0xFC29, 'M', 'عج'), + (0xFC2A, 'M', 'عم'), + (0xFC2B, 'M', 'غج'), + (0xFC2C, 'M', 'غم'), + (0xFC2D, 'M', 'فج'), + (0xFC2E, 'M', 'فح'), + (0xFC2F, 'M', 'فخ'), + (0xFC30, 'M', 'فم'), + (0xFC31, 'M', 'فى'), + (0xFC32, 'M', 'في'), + (0xFC33, 'M', 'قح'), + (0xFC34, 'M', 'قم'), + (0xFC35, 'M', 'قى'), + (0xFC36, 'M', 'قي'), + (0xFC37, 'M', 'كا'), + (0xFC38, 'M', 'كج'), + (0xFC39, 'M', 'كح'), + (0xFC3A, 'M', 'كخ'), + (0xFC3B, 'M', 'كل'), + (0xFC3C, 'M', 'كم'), + (0xFC3D, 'M', 'كى'), + (0xFC3E, 'M', 'كي'), + (0xFC3F, 'M', 'لج'), + (0xFC40, 'M', 'لح'), + (0xFC41, 'M', 'لخ'), + (0xFC42, 'M', 'لم'), + (0xFC43, 'M', 'لى'), + (0xFC44, 'M', 'لي'), + (0xFC45, 'M', 'مج'), + (0xFC46, 'M', 'مح'), + (0xFC47, 'M', 'مخ'), + (0xFC48, 'M', 'مم'), + (0xFC49, 'M', 'مى'), + (0xFC4A, 'M', 'مي'), + (0xFC4B, 'M', 'نج'), + (0xFC4C, 'M', 'نح'), + (0xFC4D, 'M', 'نخ'), + (0xFC4E, 'M', 'نم'), + (0xFC4F, 'M', 'نى'), + (0xFC50, 'M', 'ني'), + (0xFC51, 'M', 'هج'), + (0xFC52, 'M', 'هم'), + (0xFC53, 'M', 'هى'), + (0xFC54, 'M', 'هي'), + (0xFC55, 'M', 'يج'), + (0xFC56, 'M', 'يح'), + ] + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC57, 'M', 'يخ'), + (0xFC58, 'M', 'يم'), + (0xFC59, 'M', 'يى'), + (0xFC5A, 'M', 'يي'), + (0xFC5B, 'M', 'ذٰ'), + (0xFC5C, 'M', 'رٰ'), + (0xFC5D, 'M', 'ىٰ'), + (0xFC5E, '3', ' ٌّ'), + (0xFC5F, '3', ' ٍّ'), + (0xFC60, '3', ' َّ'), + (0xFC61, '3', ' ُّ'), + (0xFC62, '3', ' ِّ'), + (0xFC63, '3', ' ّٰ'), + (0xFC64, 'M', 'ئر'), + (0xFC65, 'M', 'ئز'), + (0xFC66, 'M', 'ئم'), + (0xFC67, 'M', 'ئن'), + (0xFC68, 'M', 'ئى'), + (0xFC69, 'M', 'ئي'), + (0xFC6A, 'M', 'بر'), + (0xFC6B, 'M', 'بز'), + (0xFC6C, 'M', 'بم'), + (0xFC6D, 'M', 'بن'), + (0xFC6E, 'M', 'بى'), + (0xFC6F, 'M', 'بي'), + (0xFC70, 'M', 'تر'), + (0xFC71, 'M', 'تز'), + (0xFC72, 'M', 'تم'), + (0xFC73, 'M', 'تن'), + (0xFC74, 'M', 'تى'), + (0xFC75, 'M', 'تي'), + (0xFC76, 'M', 'ثر'), + (0xFC77, 'M', 'ثز'), + (0xFC78, 'M', 'ثم'), + (0xFC79, 'M', 'ثن'), + (0xFC7A, 'M', 'ثى'), + (0xFC7B, 'M', 'ثي'), + (0xFC7C, 'M', 'فى'), + (0xFC7D, 'M', 'في'), + (0xFC7E, 'M', 'قى'), + (0xFC7F, 'M', 'قي'), + (0xFC80, 'M', 'كا'), + (0xFC81, 'M', 'كل'), + (0xFC82, 'M', 'كم'), + (0xFC83, 'M', 'كى'), + (0xFC84, 'M', 'كي'), + (0xFC85, 'M', 'لم'), + (0xFC86, 'M', 'لى'), + (0xFC87, 'M', 'لي'), + (0xFC88, 'M', 'ما'), + (0xFC89, 'M', 'مم'), + (0xFC8A, 'M', 'نر'), + (0xFC8B, 'M', 'نز'), + (0xFC8C, 'M', 'نم'), + (0xFC8D, 'M', 'نن'), + (0xFC8E, 'M', 'نى'), + (0xFC8F, 'M', 'ني'), + (0xFC90, 'M', 'ىٰ'), + (0xFC91, 'M', 'ير'), + (0xFC92, 'M', 'يز'), + (0xFC93, 'M', 'يم'), + (0xFC94, 'M', 'ين'), + (0xFC95, 'M', 'يى'), + (0xFC96, 'M', 'يي'), + (0xFC97, 'M', 'ئج'), + (0xFC98, 'M', 'ئح'), + (0xFC99, 'M', 'ئخ'), + (0xFC9A, 'M', 'ئم'), + (0xFC9B, 'M', 'ئه'), + (0xFC9C, 'M', 'بج'), + (0xFC9D, 'M', 'بح'), + (0xFC9E, 'M', 'بخ'), + (0xFC9F, 'M', 'بم'), + (0xFCA0, 'M', 'به'), + (0xFCA1, 'M', 'تج'), + (0xFCA2, 'M', 'تح'), + (0xFCA3, 'M', 'تخ'), + (0xFCA4, 'M', 'تم'), + (0xFCA5, 'M', 'ته'), + (0xFCA6, 'M', 'ثم'), + (0xFCA7, 'M', 'جح'), + (0xFCA8, 'M', 'جم'), + (0xFCA9, 'M', 'حج'), + (0xFCAA, 'M', 'حم'), + (0xFCAB, 'M', 'خج'), + (0xFCAC, 'M', 'خم'), + (0xFCAD, 'M', 'سج'), + (0xFCAE, 'M', 'سح'), + (0xFCAF, 'M', 'سخ'), + (0xFCB0, 'M', 'سم'), + (0xFCB1, 'M', 'صح'), + (0xFCB2, 'M', 'صخ'), + (0xFCB3, 'M', 'صم'), + (0xFCB4, 'M', 'ضج'), + (0xFCB5, 'M', 'ضح'), + (0xFCB6, 'M', 'ضخ'), + (0xFCB7, 'M', 'ضم'), + (0xFCB8, 'M', 'طح'), + (0xFCB9, 'M', 'ظم'), + (0xFCBA, 'M', 'عج'), + ] + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFCBB, 'M', 'عم'), + (0xFCBC, 'M', 'غج'), + (0xFCBD, 'M', 'غم'), + (0xFCBE, 'M', 'فج'), + (0xFCBF, 'M', 'فح'), + (0xFCC0, 'M', 'فخ'), + (0xFCC1, 'M', 'فم'), + (0xFCC2, 'M', 'قح'), + (0xFCC3, 'M', 'قم'), + (0xFCC4, 'M', 'كج'), + (0xFCC5, 'M', 'كح'), + (0xFCC6, 'M', 'كخ'), + (0xFCC7, 'M', 'كل'), + (0xFCC8, 'M', 'كم'), + (0xFCC9, 'M', 'لج'), + (0xFCCA, 'M', 'لح'), + (0xFCCB, 'M', 'لخ'), + (0xFCCC, 'M', 'لم'), + (0xFCCD, 'M', 'له'), + (0xFCCE, 'M', 'مج'), + (0xFCCF, 'M', 'مح'), + (0xFCD0, 'M', 'مخ'), + (0xFCD1, 'M', 'مم'), + (0xFCD2, 'M', 'نج'), + (0xFCD3, 'M', 'نح'), + (0xFCD4, 'M', 'نخ'), + (0xFCD5, 'M', 'نم'), + (0xFCD6, 'M', 'نه'), + (0xFCD7, 'M', 'هج'), + (0xFCD8, 'M', 'هم'), + (0xFCD9, 'M', 'هٰ'), + (0xFCDA, 'M', 'يج'), + (0xFCDB, 'M', 'يح'), + (0xFCDC, 'M', 'يخ'), + (0xFCDD, 'M', 'يم'), + (0xFCDE, 'M', 'يه'), + (0xFCDF, 'M', 'ئم'), + (0xFCE0, 'M', 'ئه'), + (0xFCE1, 'M', 'بم'), + (0xFCE2, 'M', 'به'), + (0xFCE3, 'M', 'تم'), + (0xFCE4, 'M', 'ته'), + (0xFCE5, 'M', 'ثم'), + (0xFCE6, 'M', 'ثه'), + (0xFCE7, 'M', 'سم'), + (0xFCE8, 'M', 'سه'), + (0xFCE9, 'M', 'شم'), + (0xFCEA, 'M', 'شه'), + (0xFCEB, 'M', 'كل'), + (0xFCEC, 'M', 'كم'), + (0xFCED, 'M', 'لم'), + (0xFCEE, 'M', 'نم'), + (0xFCEF, 'M', 'نه'), + (0xFCF0, 'M', 'يم'), + (0xFCF1, 'M', 'يه'), + (0xFCF2, 'M', 'ـَّ'), + (0xFCF3, 'M', 'ـُّ'), + (0xFCF4, 'M', 'ـِّ'), + (0xFCF5, 'M', 'طى'), + (0xFCF6, 'M', 'طي'), + (0xFCF7, 'M', 'عى'), + (0xFCF8, 'M', 'عي'), + (0xFCF9, 'M', 'غى'), + (0xFCFA, 'M', 'غي'), + (0xFCFB, 'M', 'سى'), + (0xFCFC, 'M', 'سي'), + (0xFCFD, 'M', 'شى'), + (0xFCFE, 'M', 'شي'), + (0xFCFF, 'M', 'حى'), + (0xFD00, 'M', 'حي'), + (0xFD01, 'M', 'جى'), + (0xFD02, 'M', 'جي'), + (0xFD03, 'M', 'خى'), + (0xFD04, 'M', 'خي'), + (0xFD05, 'M', 'صى'), + (0xFD06, 'M', 'صي'), + (0xFD07, 'M', 'ضى'), + (0xFD08, 'M', 'ضي'), + (0xFD09, 'M', 'شج'), + (0xFD0A, 'M', 'شح'), + (0xFD0B, 'M', 'شخ'), + (0xFD0C, 'M', 'شم'), + (0xFD0D, 'M', 'شر'), + (0xFD0E, 'M', 'سر'), + (0xFD0F, 'M', 'صر'), + (0xFD10, 'M', 'ضر'), + (0xFD11, 'M', 'طى'), + (0xFD12, 'M', 'طي'), + (0xFD13, 'M', 'عى'), + (0xFD14, 'M', 'عي'), + (0xFD15, 'M', 'غى'), + (0xFD16, 'M', 'غي'), + (0xFD17, 'M', 'سى'), + (0xFD18, 'M', 'سي'), + (0xFD19, 'M', 'شى'), + (0xFD1A, 'M', 'شي'), + (0xFD1B, 'M', 'حى'), + (0xFD1C, 'M', 'حي'), + (0xFD1D, 'M', 'جى'), + (0xFD1E, 'M', 'جي'), + ] + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFD1F, 'M', 'خى'), + (0xFD20, 'M', 'خي'), + (0xFD21, 'M', 'صى'), + (0xFD22, 'M', 'صي'), + (0xFD23, 'M', 'ضى'), + (0xFD24, 'M', 'ضي'), + (0xFD25, 'M', 'شج'), + (0xFD26, 'M', 'شح'), + (0xFD27, 'M', 'شخ'), + (0xFD28, 'M', 'شم'), + (0xFD29, 'M', 'شر'), + (0xFD2A, 'M', 'سر'), + (0xFD2B, 'M', 'صر'), + (0xFD2C, 'M', 'ضر'), + (0xFD2D, 'M', 'شج'), + (0xFD2E, 'M', 'شح'), + (0xFD2F, 'M', 'شخ'), + (0xFD30, 'M', 'شم'), + (0xFD31, 'M', 'سه'), + (0xFD32, 'M', 'شه'), + (0xFD33, 'M', 'طم'), + (0xFD34, 'M', 'سج'), + (0xFD35, 'M', 'سح'), + (0xFD36, 'M', 'سخ'), + (0xFD37, 'M', 'شج'), + (0xFD38, 'M', 'شح'), + (0xFD39, 'M', 'شخ'), + (0xFD3A, 'M', 'طم'), + (0xFD3B, 'M', 'ظم'), + (0xFD3C, 'M', 'اً'), + (0xFD3E, 'V'), + (0xFD50, 'M', 'تجم'), + (0xFD51, 'M', 'تحج'), + (0xFD53, 'M', 'تحم'), + (0xFD54, 'M', 'تخم'), + (0xFD55, 'M', 'تمج'), + (0xFD56, 'M', 'تمح'), + (0xFD57, 'M', 'تمخ'), + (0xFD58, 'M', 'جمح'), + (0xFD5A, 'M', 'حمي'), + (0xFD5B, 'M', 'حمى'), + (0xFD5C, 'M', 'سحج'), + (0xFD5D, 'M', 'سجح'), + (0xFD5E, 'M', 'سجى'), + (0xFD5F, 'M', 'سمح'), + (0xFD61, 'M', 'سمج'), + (0xFD62, 'M', 'سمم'), + (0xFD64, 'M', 'صحح'), + (0xFD66, 'M', 'صمم'), + (0xFD67, 'M', 'شحم'), + (0xFD69, 'M', 'شجي'), + (0xFD6A, 'M', 'شمخ'), + (0xFD6C, 'M', 'شمم'), + (0xFD6E, 'M', 'ضحى'), + (0xFD6F, 'M', 'ضخم'), + (0xFD71, 'M', 'طمح'), + (0xFD73, 'M', 'طمم'), + (0xFD74, 'M', 'طمي'), + (0xFD75, 'M', 'عجم'), + (0xFD76, 'M', 'عمم'), + (0xFD78, 'M', 'عمى'), + (0xFD79, 'M', 'غمم'), + (0xFD7A, 'M', 'غمي'), + (0xFD7B, 'M', 'غمى'), + (0xFD7C, 'M', 'فخم'), + (0xFD7E, 'M', 'قمح'), + (0xFD7F, 'M', 'قمم'), + (0xFD80, 'M', 'لحم'), + (0xFD81, 'M', 'لحي'), + (0xFD82, 'M', 'لحى'), + (0xFD83, 'M', 'لجج'), + (0xFD85, 'M', 'لخم'), + (0xFD87, 'M', 'لمح'), + (0xFD89, 'M', 'محج'), + (0xFD8A, 'M', 'محم'), + (0xFD8B, 'M', 'محي'), + (0xFD8C, 'M', 'مجح'), + (0xFD8D, 'M', 'مجم'), + (0xFD8E, 'M', 'مخج'), + (0xFD8F, 'M', 'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', 'مجخ'), + (0xFD93, 'M', 'همج'), + (0xFD94, 'M', 'همم'), + (0xFD95, 'M', 'نحم'), + (0xFD96, 'M', 'نحى'), + (0xFD97, 'M', 'نجم'), + (0xFD99, 'M', 'نجى'), + (0xFD9A, 'M', 'نمي'), + (0xFD9B, 'M', 'نمى'), + (0xFD9C, 'M', 'يمم'), + (0xFD9E, 'M', 'بخي'), + (0xFD9F, 'M', 'تجي'), + (0xFDA0, 'M', 'تجى'), + (0xFDA1, 'M', 'تخي'), + (0xFDA2, 'M', 'تخى'), + (0xFDA3, 'M', 'تمي'), + (0xFDA4, 'M', 'تمى'), + (0xFDA5, 'M', 'جمي'), + (0xFDA6, 'M', 'جحى'), + ] + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFDA7, 'M', 'جمى'), + (0xFDA8, 'M', 'سخى'), + (0xFDA9, 'M', 'صحي'), + (0xFDAA, 'M', 'شحي'), + (0xFDAB, 'M', 'ضحي'), + (0xFDAC, 'M', 'لجي'), + (0xFDAD, 'M', 'لمي'), + (0xFDAE, 'M', 'يحي'), + (0xFDAF, 'M', 'يجي'), + (0xFDB0, 'M', 'يمي'), + (0xFDB1, 'M', 'ممي'), + (0xFDB2, 'M', 'قمي'), + (0xFDB3, 'M', 'نحي'), + (0xFDB4, 'M', 'قمح'), + (0xFDB5, 'M', 'لحم'), + (0xFDB6, 'M', 'عمي'), + (0xFDB7, 'M', 'كمي'), + (0xFDB8, 'M', 'نجح'), + (0xFDB9, 'M', 'مخي'), + (0xFDBA, 'M', 'لجم'), + (0xFDBB, 'M', 'كمم'), + (0xFDBC, 'M', 'لجم'), + (0xFDBD, 'M', 'نجح'), + (0xFDBE, 'M', 'جحي'), + (0xFDBF, 'M', 'حجي'), + (0xFDC0, 'M', 'مجي'), + (0xFDC1, 'M', 'فمي'), + (0xFDC2, 'M', 'بحي'), + (0xFDC3, 'M', 'كمم'), + (0xFDC4, 'M', 'عجم'), + (0xFDC5, 'M', 'صمم'), + (0xFDC6, 'M', 'سخي'), + (0xFDC7, 'M', 'نجي'), + (0xFDC8, 'X'), + (0xFDCF, 'V'), + (0xFDD0, 'X'), + (0xFDF0, 'M', 'صلے'), + (0xFDF1, 'M', 'قلے'), + (0xFDF2, 'M', 'الله'), + (0xFDF3, 'M', 'اكبر'), + (0xFDF4, 'M', 'محمد'), + (0xFDF5, 'M', 'صلعم'), + (0xFDF6, 'M', 'رسول'), + (0xFDF7, 'M', 'عليه'), + (0xFDF8, 'M', 'وسلم'), + (0xFDF9, 'M', 'صلى'), + (0xFDFA, '3', 'صلى الله عليه وسلم'), + (0xFDFB, '3', 'جل جلاله'), + (0xFDFC, 'M', 'ریال'), + (0xFDFD, 'V'), + (0xFE00, 'I'), + (0xFE10, '3', ','), + (0xFE11, 'M', '、'), + (0xFE12, 'X'), + (0xFE13, '3', ':'), + (0xFE14, '3', ';'), + (0xFE15, '3', '!'), + (0xFE16, '3', '?'), + (0xFE17, 'M', '〖'), + (0xFE18, 'M', '〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', '—'), + (0xFE32, 'M', '–'), + (0xFE33, '3', '_'), + (0xFE35, '3', '('), + (0xFE36, '3', ')'), + (0xFE37, '3', '{'), + (0xFE38, '3', '}'), + (0xFE39, 'M', '〔'), + (0xFE3A, 'M', '〕'), + (0xFE3B, 'M', '【'), + (0xFE3C, 'M', '】'), + (0xFE3D, 'M', '《'), + (0xFE3E, 'M', '》'), + (0xFE3F, 'M', '〈'), + (0xFE40, 'M', '〉'), + (0xFE41, 'M', '「'), + (0xFE42, 'M', '」'), + (0xFE43, 'M', '『'), + (0xFE44, 'M', '』'), + (0xFE45, 'V'), + (0xFE47, '3', '['), + (0xFE48, '3', ']'), + (0xFE49, '3', ' ̅'), + (0xFE4D, '3', '_'), + (0xFE50, '3', ','), + (0xFE51, 'M', '、'), + (0xFE52, 'X'), + (0xFE54, '3', ';'), + (0xFE55, '3', ':'), + (0xFE56, '3', '?'), + (0xFE57, '3', '!'), + (0xFE58, 'M', '—'), + (0xFE59, '3', '('), + (0xFE5A, '3', ')'), + (0xFE5B, '3', '{'), + (0xFE5C, '3', '}'), + (0xFE5D, 'M', '〔'), + ] + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE5E, 'M', '〕'), + (0xFE5F, '3', '#'), + (0xFE60, '3', '&'), + (0xFE61, '3', '*'), + (0xFE62, '3', '+'), + (0xFE63, 'M', '-'), + (0xFE64, '3', '<'), + (0xFE65, '3', '>'), + (0xFE66, '3', '='), + (0xFE67, 'X'), + (0xFE68, '3', '\\'), + (0xFE69, '3', '$'), + (0xFE6A, '3', '%'), + (0xFE6B, '3', '@'), + (0xFE6C, 'X'), + (0xFE70, '3', ' ً'), + (0xFE71, 'M', 'ـً'), + (0xFE72, '3', ' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', ' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', ' َ'), + (0xFE77, 'M', 'ـَ'), + (0xFE78, '3', ' ُ'), + (0xFE79, 'M', 'ـُ'), + (0xFE7A, '3', ' ِ'), + (0xFE7B, 'M', 'ـِ'), + (0xFE7C, '3', ' ّ'), + (0xFE7D, 'M', 'ـّ'), + (0xFE7E, '3', ' ْ'), + (0xFE7F, 'M', 'ـْ'), + (0xFE80, 'M', 'ء'), + (0xFE81, 'M', 'آ'), + (0xFE83, 'M', 'أ'), + (0xFE85, 'M', 'ؤ'), + (0xFE87, 'M', 'إ'), + (0xFE89, 'M', 'ئ'), + (0xFE8D, 'M', 'ا'), + (0xFE8F, 'M', 'ب'), + (0xFE93, 'M', 'ة'), + (0xFE95, 'M', 'ت'), + (0xFE99, 'M', 'ث'), + (0xFE9D, 'M', 'ج'), + (0xFEA1, 'M', 'ح'), + (0xFEA5, 'M', 'خ'), + (0xFEA9, 'M', 'د'), + (0xFEAB, 'M', 'ذ'), + (0xFEAD, 'M', 'ر'), + (0xFEAF, 'M', 'ز'), + (0xFEB1, 'M', 'س'), + (0xFEB5, 'M', 'ش'), + (0xFEB9, 'M', 'ص'), + (0xFEBD, 'M', 'ض'), + (0xFEC1, 'M', 'ط'), + (0xFEC5, 'M', 'ظ'), + (0xFEC9, 'M', 'ع'), + (0xFECD, 'M', 'غ'), + (0xFED1, 'M', 'ف'), + (0xFED5, 'M', 'ق'), + (0xFED9, 'M', 'ك'), + (0xFEDD, 'M', 'ل'), + (0xFEE1, 'M', 'م'), + (0xFEE5, 'M', 'ن'), + (0xFEE9, 'M', 'ه'), + (0xFEED, 'M', 'و'), + (0xFEEF, 'M', 'ى'), + (0xFEF1, 'M', 'ي'), + (0xFEF5, 'M', 'لآ'), + (0xFEF7, 'M', 'لأ'), + (0xFEF9, 'M', 'لإ'), + (0xFEFB, 'M', 'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', '!'), + (0xFF02, '3', '"'), + (0xFF03, '3', '#'), + (0xFF04, '3', '$'), + (0xFF05, '3', '%'), + (0xFF06, '3', '&'), + (0xFF07, '3', '\''), + (0xFF08, '3', '('), + (0xFF09, '3', ')'), + (0xFF0A, '3', '*'), + (0xFF0B, '3', '+'), + (0xFF0C, '3', ','), + (0xFF0D, 'M', '-'), + (0xFF0E, 'M', '.'), + (0xFF0F, '3', '/'), + (0xFF10, 'M', '0'), + (0xFF11, 'M', '1'), + (0xFF12, 'M', '2'), + (0xFF13, 'M', '3'), + (0xFF14, 'M', '4'), + (0xFF15, 'M', '5'), + (0xFF16, 'M', '6'), + (0xFF17, 'M', '7'), + (0xFF18, 'M', '8'), + (0xFF19, 'M', '9'), + (0xFF1A, '3', ':'), + ] + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF1B, '3', ';'), + (0xFF1C, '3', '<'), + (0xFF1D, '3', '='), + (0xFF1E, '3', '>'), + (0xFF1F, '3', '?'), + (0xFF20, '3', '@'), + (0xFF21, 'M', 'a'), + (0xFF22, 'M', 'b'), + (0xFF23, 'M', 'c'), + (0xFF24, 'M', 'd'), + (0xFF25, 'M', 'e'), + (0xFF26, 'M', 'f'), + (0xFF27, 'M', 'g'), + (0xFF28, 'M', 'h'), + (0xFF29, 'M', 'i'), + (0xFF2A, 'M', 'j'), + (0xFF2B, 'M', 'k'), + (0xFF2C, 'M', 'l'), + (0xFF2D, 'M', 'm'), + (0xFF2E, 'M', 'n'), + (0xFF2F, 'M', 'o'), + (0xFF30, 'M', 'p'), + (0xFF31, 'M', 'q'), + (0xFF32, 'M', 'r'), + (0xFF33, 'M', 's'), + (0xFF34, 'M', 't'), + (0xFF35, 'M', 'u'), + (0xFF36, 'M', 'v'), + (0xFF37, 'M', 'w'), + (0xFF38, 'M', 'x'), + (0xFF39, 'M', 'y'), + (0xFF3A, 'M', 'z'), + (0xFF3B, '3', '['), + (0xFF3C, '3', '\\'), + (0xFF3D, '3', ']'), + (0xFF3E, '3', '^'), + (0xFF3F, '3', '_'), + (0xFF40, '3', '`'), + (0xFF41, 'M', 'a'), + (0xFF42, 'M', 'b'), + (0xFF43, 'M', 'c'), + (0xFF44, 'M', 'd'), + (0xFF45, 'M', 'e'), + (0xFF46, 'M', 'f'), + (0xFF47, 'M', 'g'), + (0xFF48, 'M', 'h'), + (0xFF49, 'M', 'i'), + (0xFF4A, 'M', 'j'), + (0xFF4B, 'M', 'k'), + (0xFF4C, 'M', 'l'), + (0xFF4D, 'M', 'm'), + (0xFF4E, 'M', 'n'), + (0xFF4F, 'M', 'o'), + (0xFF50, 'M', 'p'), + (0xFF51, 'M', 'q'), + (0xFF52, 'M', 'r'), + (0xFF53, 'M', 's'), + (0xFF54, 'M', 't'), + (0xFF55, 'M', 'u'), + (0xFF56, 'M', 'v'), + (0xFF57, 'M', 'w'), + (0xFF58, 'M', 'x'), + (0xFF59, 'M', 'y'), + (0xFF5A, 'M', 'z'), + (0xFF5B, '3', '{'), + (0xFF5C, '3', '|'), + (0xFF5D, '3', '}'), + (0xFF5E, '3', '~'), + (0xFF5F, 'M', '⦅'), + (0xFF60, 'M', '⦆'), + (0xFF61, 'M', '.'), + (0xFF62, 'M', '「'), + (0xFF63, 'M', '」'), + (0xFF64, 'M', '、'), + (0xFF65, 'M', '・'), + (0xFF66, 'M', 'ヲ'), + (0xFF67, 'M', 'ァ'), + (0xFF68, 'M', 'ィ'), + (0xFF69, 'M', 'ゥ'), + (0xFF6A, 'M', 'ェ'), + (0xFF6B, 'M', 'ォ'), + (0xFF6C, 'M', 'ャ'), + (0xFF6D, 'M', 'ュ'), + (0xFF6E, 'M', 'ョ'), + (0xFF6F, 'M', 'ッ'), + (0xFF70, 'M', 'ー'), + (0xFF71, 'M', 'ア'), + (0xFF72, 'M', 'イ'), + (0xFF73, 'M', 'ウ'), + (0xFF74, 'M', 'エ'), + (0xFF75, 'M', 'オ'), + (0xFF76, 'M', 'カ'), + (0xFF77, 'M', 'キ'), + (0xFF78, 'M', 'ク'), + (0xFF79, 'M', 'ケ'), + (0xFF7A, 'M', 'コ'), + (0xFF7B, 'M', 'サ'), + (0xFF7C, 'M', 'シ'), + (0xFF7D, 'M', 'ス'), + (0xFF7E, 'M', 'セ'), + ] + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF7F, 'M', 'ソ'), + (0xFF80, 'M', 'タ'), + (0xFF81, 'M', 'チ'), + (0xFF82, 'M', 'ツ'), + (0xFF83, 'M', 'テ'), + (0xFF84, 'M', 'ト'), + (0xFF85, 'M', 'ナ'), + (0xFF86, 'M', 'ニ'), + (0xFF87, 'M', 'ヌ'), + (0xFF88, 'M', 'ネ'), + (0xFF89, 'M', 'ノ'), + (0xFF8A, 'M', 'ハ'), + (0xFF8B, 'M', 'ヒ'), + (0xFF8C, 'M', 'フ'), + (0xFF8D, 'M', 'ヘ'), + (0xFF8E, 'M', 'ホ'), + (0xFF8F, 'M', 'マ'), + (0xFF90, 'M', 'ミ'), + (0xFF91, 'M', 'ム'), + (0xFF92, 'M', 'メ'), + (0xFF93, 'M', 'モ'), + (0xFF94, 'M', 'ヤ'), + (0xFF95, 'M', 'ユ'), + (0xFF96, 'M', 'ヨ'), + (0xFF97, 'M', 'ラ'), + (0xFF98, 'M', 'リ'), + (0xFF99, 'M', 'ル'), + (0xFF9A, 'M', 'レ'), + (0xFF9B, 'M', 'ロ'), + (0xFF9C, 'M', 'ワ'), + (0xFF9D, 'M', 'ン'), + (0xFF9E, 'M', '゙'), + (0xFF9F, 'M', '゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', 'ᄀ'), + (0xFFA2, 'M', 'ᄁ'), + (0xFFA3, 'M', 'ᆪ'), + (0xFFA4, 'M', 'ᄂ'), + (0xFFA5, 'M', 'ᆬ'), + (0xFFA6, 'M', 'ᆭ'), + (0xFFA7, 'M', 'ᄃ'), + (0xFFA8, 'M', 'ᄄ'), + (0xFFA9, 'M', 'ᄅ'), + (0xFFAA, 'M', 'ᆰ'), + (0xFFAB, 'M', 'ᆱ'), + (0xFFAC, 'M', 'ᆲ'), + (0xFFAD, 'M', 'ᆳ'), + (0xFFAE, 'M', 'ᆴ'), + (0xFFAF, 'M', 'ᆵ'), + (0xFFB0, 'M', 'ᄚ'), + (0xFFB1, 'M', 'ᄆ'), + (0xFFB2, 'M', 'ᄇ'), + (0xFFB3, 'M', 'ᄈ'), + (0xFFB4, 'M', 'ᄡ'), + (0xFFB5, 'M', 'ᄉ'), + (0xFFB6, 'M', 'ᄊ'), + (0xFFB7, 'M', 'ᄋ'), + (0xFFB8, 'M', 'ᄌ'), + (0xFFB9, 'M', 'ᄍ'), + (0xFFBA, 'M', 'ᄎ'), + (0xFFBB, 'M', 'ᄏ'), + (0xFFBC, 'M', 'ᄐ'), + (0xFFBD, 'M', 'ᄑ'), + (0xFFBE, 'M', 'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', 'ᅡ'), + (0xFFC3, 'M', 'ᅢ'), + (0xFFC4, 'M', 'ᅣ'), + (0xFFC5, 'M', 'ᅤ'), + (0xFFC6, 'M', 'ᅥ'), + (0xFFC7, 'M', 'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', 'ᅧ'), + (0xFFCB, 'M', 'ᅨ'), + (0xFFCC, 'M', 'ᅩ'), + (0xFFCD, 'M', 'ᅪ'), + (0xFFCE, 'M', 'ᅫ'), + (0xFFCF, 'M', 'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', 'ᅭ'), + (0xFFD3, 'M', 'ᅮ'), + (0xFFD4, 'M', 'ᅯ'), + (0xFFD5, 'M', 'ᅰ'), + (0xFFD6, 'M', 'ᅱ'), + (0xFFD7, 'M', 'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', 'ᅳ'), + (0xFFDB, 'M', 'ᅴ'), + (0xFFDC, 'M', 'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', '¢'), + (0xFFE1, 'M', '£'), + (0xFFE2, 'M', '¬'), + (0xFFE3, '3', ' ̄'), + (0xFFE4, 'M', '¦'), + (0xFFE5, 'M', '¥'), + (0xFFE6, 'M', '₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', '│'), + (0xFFE9, 'M', '←'), + ] + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFEA, 'M', '↑'), + (0xFFEB, 'M', '→'), + (0xFFEC, 'M', '↓'), + (0xFFED, 'M', '■'), + (0xFFEE, 'M', '○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019D, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', '𐐨'), + (0x10401, 'M', '𐐩'), + (0x10402, 'M', '𐐪'), + (0x10403, 'M', '𐐫'), + (0x10404, 'M', '𐐬'), + (0x10405, 'M', '𐐭'), + (0x10406, 'M', '𐐮'), + (0x10407, 'M', '𐐯'), + (0x10408, 'M', '𐐰'), + (0x10409, 'M', '𐐱'), + (0x1040A, 'M', '𐐲'), + (0x1040B, 'M', '𐐳'), + (0x1040C, 'M', '𐐴'), + (0x1040D, 'M', '𐐵'), + (0x1040E, 'M', '𐐶'), + (0x1040F, 'M', '𐐷'), + (0x10410, 'M', '𐐸'), + (0x10411, 'M', '𐐹'), + (0x10412, 'M', '𐐺'), + (0x10413, 'M', '𐐻'), + (0x10414, 'M', '𐐼'), + (0x10415, 'M', '𐐽'), + (0x10416, 'M', '𐐾'), + (0x10417, 'M', '𐐿'), + (0x10418, 'M', '𐑀'), + (0x10419, 'M', '𐑁'), + (0x1041A, 'M', '𐑂'), + (0x1041B, 'M', '𐑃'), + (0x1041C, 'M', '𐑄'), + (0x1041D, 'M', '𐑅'), + (0x1041E, 'M', '𐑆'), + (0x1041F, 'M', '𐑇'), + (0x10420, 'M', '𐑈'), + (0x10421, 'M', '𐑉'), + (0x10422, 'M', '𐑊'), + (0x10423, 'M', '𐑋'), + (0x10424, 'M', '𐑌'), + (0x10425, 'M', '𐑍'), + (0x10426, 'M', '𐑎'), + (0x10427, 'M', '𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', '𐓘'), + (0x104B1, 'M', '𐓙'), + (0x104B2, 'M', '𐓚'), + (0x104B3, 'M', '𐓛'), + (0x104B4, 'M', '𐓜'), + (0x104B5, 'M', '𐓝'), + ] + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x104B6, 'M', '𐓞'), + (0x104B7, 'M', '𐓟'), + (0x104B8, 'M', '𐓠'), + (0x104B9, 'M', '𐓡'), + (0x104BA, 'M', '𐓢'), + (0x104BB, 'M', '𐓣'), + (0x104BC, 'M', '𐓤'), + (0x104BD, 'M', '𐓥'), + (0x104BE, 'M', '𐓦'), + (0x104BF, 'M', '𐓧'), + (0x104C0, 'M', '𐓨'), + (0x104C1, 'M', '𐓩'), + (0x104C2, 'M', '𐓪'), + (0x104C3, 'M', '𐓫'), + (0x104C4, 'M', '𐓬'), + (0x104C5, 'M', '𐓭'), + (0x104C6, 'M', '𐓮'), + (0x104C7, 'M', '𐓯'), + (0x104C8, 'M', '𐓰'), + (0x104C9, 'M', '𐓱'), + (0x104CA, 'M', '𐓲'), + (0x104CB, 'M', '𐓳'), + (0x104CC, 'M', '𐓴'), + (0x104CD, 'M', '𐓵'), + (0x104CE, 'M', '𐓶'), + (0x104CF, 'M', '𐓷'), + (0x104D0, 'M', '𐓸'), + (0x104D1, 'M', '𐓹'), + (0x104D2, 'M', '𐓺'), + (0x104D3, 'M', '𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'M', '𐖗'), + (0x10571, 'M', '𐖘'), + (0x10572, 'M', '𐖙'), + (0x10573, 'M', '𐖚'), + (0x10574, 'M', '𐖛'), + (0x10575, 'M', '𐖜'), + (0x10576, 'M', '𐖝'), + (0x10577, 'M', '𐖞'), + (0x10578, 'M', '𐖟'), + (0x10579, 'M', '𐖠'), + (0x1057A, 'M', '𐖡'), + (0x1057B, 'X'), + (0x1057C, 'M', '𐖣'), + (0x1057D, 'M', '𐖤'), + (0x1057E, 'M', '𐖥'), + (0x1057F, 'M', '𐖦'), + (0x10580, 'M', '𐖧'), + (0x10581, 'M', '𐖨'), + (0x10582, 'M', '𐖩'), + (0x10583, 'M', '𐖪'), + (0x10584, 'M', '𐖫'), + (0x10585, 'M', '𐖬'), + (0x10586, 'M', '𐖭'), + (0x10587, 'M', '𐖮'), + (0x10588, 'M', '𐖯'), + (0x10589, 'M', '𐖰'), + (0x1058A, 'M', '𐖱'), + (0x1058B, 'X'), + (0x1058C, 'M', '𐖳'), + (0x1058D, 'M', '𐖴'), + (0x1058E, 'M', '𐖵'), + (0x1058F, 'M', '𐖶'), + (0x10590, 'M', '𐖷'), + (0x10591, 'M', '𐖸'), + (0x10592, 'M', '𐖹'), + (0x10593, 'X'), + (0x10594, 'M', '𐖻'), + (0x10595, 'M', '𐖼'), + (0x10596, 'X'), + (0x10597, 'V'), + (0x105A2, 'X'), + (0x105A3, 'V'), + (0x105B2, 'X'), + (0x105B3, 'V'), + (0x105BA, 'X'), + (0x105BB, 'V'), + (0x105BD, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10780, 'V'), + (0x10781, 'M', 'ː'), + (0x10782, 'M', 'ˑ'), + (0x10783, 'M', 'æ'), + (0x10784, 'M', 'ʙ'), + (0x10785, 'M', 'ɓ'), + (0x10786, 'X'), + (0x10787, 'M', 'ʣ'), + (0x10788, 'M', 'ꭦ'), + ] + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10789, 'M', 'ʥ'), + (0x1078A, 'M', 'ʤ'), + (0x1078B, 'M', 'ɖ'), + (0x1078C, 'M', 'ɗ'), + (0x1078D, 'M', 'ᶑ'), + (0x1078E, 'M', 'ɘ'), + (0x1078F, 'M', 'ɞ'), + (0x10790, 'M', 'ʩ'), + (0x10791, 'M', 'ɤ'), + (0x10792, 'M', 'ɢ'), + (0x10793, 'M', 'ɠ'), + (0x10794, 'M', 'ʛ'), + (0x10795, 'M', 'ħ'), + (0x10796, 'M', 'ʜ'), + (0x10797, 'M', 'ɧ'), + (0x10798, 'M', 'ʄ'), + (0x10799, 'M', 'ʪ'), + (0x1079A, 'M', 'ʫ'), + (0x1079B, 'M', 'ɬ'), + (0x1079C, 'M', '𝼄'), + (0x1079D, 'M', 'ꞎ'), + (0x1079E, 'M', 'ɮ'), + (0x1079F, 'M', '𝼅'), + (0x107A0, 'M', 'ʎ'), + (0x107A1, 'M', '𝼆'), + (0x107A2, 'M', 'ø'), + (0x107A3, 'M', 'ɶ'), + (0x107A4, 'M', 'ɷ'), + (0x107A5, 'M', 'q'), + (0x107A6, 'M', 'ɺ'), + (0x107A7, 'M', '𝼈'), + (0x107A8, 'M', 'ɽ'), + (0x107A9, 'M', 'ɾ'), + (0x107AA, 'M', 'ʀ'), + (0x107AB, 'M', 'ʨ'), + (0x107AC, 'M', 'ʦ'), + (0x107AD, 'M', 'ꭧ'), + (0x107AE, 'M', 'ʧ'), + (0x107AF, 'M', 'ʈ'), + (0x107B0, 'M', 'ⱱ'), + (0x107B1, 'X'), + (0x107B2, 'M', 'ʏ'), + (0x107B3, 'M', 'ʡ'), + (0x107B4, 'M', 'ʢ'), + (0x107B5, 'M', 'ʘ'), + (0x107B6, 'M', 'ǀ'), + (0x107B7, 'M', 'ǁ'), + (0x107B8, 'M', 'ǂ'), + (0x107B9, 'M', '𝼊'), + (0x107BA, 'M', '𝼞'), + (0x107BB, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + ] + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', '𐳀'), + (0x10C81, 'M', '𐳁'), + (0x10C82, 'M', '𐳂'), + (0x10C83, 'M', '𐳃'), + (0x10C84, 'M', '𐳄'), + (0x10C85, 'M', '𐳅'), + (0x10C86, 'M', '𐳆'), + (0x10C87, 'M', '𐳇'), + (0x10C88, 'M', '𐳈'), + (0x10C89, 'M', '𐳉'), + (0x10C8A, 'M', '𐳊'), + (0x10C8B, 'M', '𐳋'), + (0x10C8C, 'M', '𐳌'), + (0x10C8D, 'M', '𐳍'), + (0x10C8E, 'M', '𐳎'), + (0x10C8F, 'M', '𐳏'), + (0x10C90, 'M', '𐳐'), + (0x10C91, 'M', '𐳑'), + (0x10C92, 'M', '𐳒'), + (0x10C93, 'M', '𐳓'), + (0x10C94, 'M', '𐳔'), + (0x10C95, 'M', '𐳕'), + (0x10C96, 'M', '𐳖'), + (0x10C97, 'M', '𐳗'), + (0x10C98, 'M', '𐳘'), + (0x10C99, 'M', '𐳙'), + (0x10C9A, 'M', '𐳚'), + (0x10C9B, 'M', '𐳛'), + (0x10C9C, 'M', '𐳜'), + (0x10C9D, 'M', '𐳝'), + (0x10C9E, 'M', '𐳞'), + (0x10C9F, 'M', '𐳟'), + (0x10CA0, 'M', '𐳠'), + (0x10CA1, 'M', '𐳡'), + (0x10CA2, 'M', '𐳢'), + (0x10CA3, 'M', '𐳣'), + (0x10CA4, 'M', '𐳤'), + (0x10CA5, 'M', '𐳥'), + (0x10CA6, 'M', '𐳦'), + (0x10CA7, 'M', '𐳧'), + (0x10CA8, 'M', '𐳨'), + (0x10CA9, 'M', '𐳩'), + (0x10CAA, 'M', '𐳪'), + (0x10CAB, 'M', '𐳫'), + (0x10CAC, 'M', '𐳬'), + (0x10CAD, 'M', '𐳭'), + (0x10CAE, 'M', '𐳮'), + (0x10CAF, 'M', '𐳯'), + (0x10CB0, 'M', '𐳰'), + (0x10CB1, 'M', '𐳱'), + (0x10CB2, 'M', '𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10E80, 'V'), + (0x10EAA, 'X'), + (0x10EAB, 'V'), + (0x10EAE, 'X'), + (0x10EB0, 'V'), + (0x10EB2, 'X'), + (0x10EFD, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x10F70, 'V'), + (0x10F8A, 'X'), + (0x10FB0, 'V'), + (0x10FCC, 'X'), + (0x10FE0, 'V'), + (0x10FF7, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11076, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + ] + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x110C3, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11148, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x11242, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + (0x11462, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116BA, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11747, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', '𑣀'), + (0x118A1, 'M', '𑣁'), + (0x118A2, 'M', '𑣂'), + (0x118A3, 'M', '𑣃'), + (0x118A4, 'M', '𑣄'), + (0x118A5, 'M', '𑣅'), + (0x118A6, 'M', '𑣆'), + ] + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118A7, 'M', '𑣇'), + (0x118A8, 'M', '𑣈'), + (0x118A9, 'M', '𑣉'), + (0x118AA, 'M', '𑣊'), + (0x118AB, 'M', '𑣋'), + (0x118AC, 'M', '𑣌'), + (0x118AD, 'M', '𑣍'), + (0x118AE, 'M', '𑣎'), + (0x118AF, 'M', '𑣏'), + (0x118B0, 'M', '𑣐'), + (0x118B1, 'M', '𑣑'), + (0x118B2, 'M', '𑣒'), + (0x118B3, 'M', '𑣓'), + (0x118B4, 'M', '𑣔'), + (0x118B5, 'M', '𑣕'), + (0x118B6, 'M', '𑣖'), + (0x118B7, 'M', '𑣗'), + (0x118B8, 'M', '𑣘'), + (0x118B9, 'M', '𑣙'), + (0x118BA, 'M', '𑣚'), + (0x118BB, 'M', '𑣛'), + (0x118BC, 'M', '𑣜'), + (0x118BD, 'M', '𑣝'), + (0x118BE, 'M', '𑣞'), + (0x118BF, 'M', '𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11907, 'X'), + (0x11909, 'V'), + (0x1190A, 'X'), + (0x1190C, 'V'), + (0x11914, 'X'), + (0x11915, 'V'), + (0x11917, 'X'), + (0x11918, 'V'), + (0x11936, 'X'), + (0x11937, 'V'), + (0x11939, 'X'), + (0x1193B, 'V'), + (0x11947, 'X'), + (0x11950, 'V'), + (0x1195A, 'X'), + (0x119A0, 'V'), + (0x119A8, 'X'), + (0x119AA, 'V'), + (0x119D8, 'X'), + (0x119DA, 'V'), + (0x119E5, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11AA3, 'X'), + (0x11AB0, 'V'), + (0x11AF9, 'X'), + (0x11B00, 'V'), + (0x11B0A, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x11F00, 'V'), + ] + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11F11, 'X'), + (0x11F12, 'V'), + (0x11F3B, 'X'), + (0x11F3E, 'V'), + (0x11F5A, 'X'), + (0x11FB0, 'V'), + (0x11FB1, 'X'), + (0x11FC0, 'V'), + (0x11FF2, 'X'), + (0x11FFF, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x12F90, 'V'), + (0x12FF3, 'X'), + (0x13000, 'V'), + (0x13430, 'X'), + (0x13440, 'V'), + (0x13456, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16ABF, 'X'), + (0x16AC0, 'V'), + (0x16ACA, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E40, 'M', '𖹠'), + (0x16E41, 'M', '𖹡'), + (0x16E42, 'M', '𖹢'), + (0x16E43, 'M', '𖹣'), + (0x16E44, 'M', '𖹤'), + (0x16E45, 'M', '𖹥'), + (0x16E46, 'M', '𖹦'), + (0x16E47, 'M', '𖹧'), + (0x16E48, 'M', '𖹨'), + (0x16E49, 'M', '𖹩'), + (0x16E4A, 'M', '𖹪'), + (0x16E4B, 'M', '𖹫'), + (0x16E4C, 'M', '𖹬'), + (0x16E4D, 'M', '𖹭'), + (0x16E4E, 'M', '𖹮'), + (0x16E4F, 'M', '𖹯'), + (0x16E50, 'M', '𖹰'), + (0x16E51, 'M', '𖹱'), + (0x16E52, 'M', '𖹲'), + (0x16E53, 'M', '𖹳'), + (0x16E54, 'M', '𖹴'), + (0x16E55, 'M', '𖹵'), + (0x16E56, 'M', '𖹶'), + (0x16E57, 'M', '𖹷'), + (0x16E58, 'M', '𖹸'), + (0x16E59, 'M', '𖹹'), + (0x16E5A, 'M', '𖹺'), + (0x16E5B, 'M', '𖹻'), + (0x16E5C, 'M', '𖹼'), + (0x16E5D, 'M', '𖹽'), + (0x16E5E, 'M', '𖹾'), + (0x16E5F, 'M', '𖹿'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F4B, 'X'), + (0x16F4F, 'V'), + (0x16F88, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE5, 'X'), + (0x16FF0, 'V'), + (0x16FF2, 'X'), + (0x17000, 'V'), + (0x187F8, 'X'), + (0x18800, 'V'), + (0x18CD6, 'X'), + (0x18D00, 'V'), + (0x18D09, 'X'), + (0x1AFF0, 'V'), + ] + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1AFF4, 'X'), + (0x1AFF5, 'V'), + (0x1AFFC, 'X'), + (0x1AFFD, 'V'), + (0x1AFFF, 'X'), + (0x1B000, 'V'), + (0x1B123, 'X'), + (0x1B132, 'V'), + (0x1B133, 'X'), + (0x1B150, 'V'), + (0x1B153, 'X'), + (0x1B155, 'V'), + (0x1B156, 'X'), + (0x1B164, 'V'), + (0x1B168, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1CF00, 'V'), + (0x1CF2E, 'X'), + (0x1CF30, 'V'), + (0x1CF47, 'X'), + (0x1CF50, 'V'), + (0x1CFC4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', '𝅗𝅥'), + (0x1D15F, 'M', '𝅘𝅥'), + (0x1D160, 'M', '𝅘𝅥𝅮'), + (0x1D161, 'M', '𝅘𝅥𝅯'), + (0x1D162, 'M', '𝅘𝅥𝅰'), + (0x1D163, 'M', '𝅘𝅥𝅱'), + (0x1D164, 'M', '𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', '𝆹𝅥'), + (0x1D1BC, 'M', '𝆺𝅥'), + (0x1D1BD, 'M', '𝆹𝅥𝅮'), + (0x1D1BE, 'M', '𝆺𝅥𝅮'), + (0x1D1BF, 'M', '𝆹𝅥𝅯'), + (0x1D1C0, 'M', '𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1EB, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D2C0, 'V'), + (0x1D2D4, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, 'X'), + (0x1D400, 'M', 'a'), + (0x1D401, 'M', 'b'), + (0x1D402, 'M', 'c'), + (0x1D403, 'M', 'd'), + (0x1D404, 'M', 'e'), + (0x1D405, 'M', 'f'), + (0x1D406, 'M', 'g'), + (0x1D407, 'M', 'h'), + (0x1D408, 'M', 'i'), + (0x1D409, 'M', 'j'), + (0x1D40A, 'M', 'k'), + (0x1D40B, 'M', 'l'), + (0x1D40C, 'M', 'm'), + (0x1D40D, 'M', 'n'), + (0x1D40E, 'M', 'o'), + (0x1D40F, 'M', 'p'), + (0x1D410, 'M', 'q'), + (0x1D411, 'M', 'r'), + (0x1D412, 'M', 's'), + (0x1D413, 'M', 't'), + (0x1D414, 'M', 'u'), + (0x1D415, 'M', 'v'), + (0x1D416, 'M', 'w'), + (0x1D417, 'M', 'x'), + (0x1D418, 'M', 'y'), + (0x1D419, 'M', 'z'), + (0x1D41A, 'M', 'a'), + (0x1D41B, 'M', 'b'), + (0x1D41C, 'M', 'c'), + (0x1D41D, 'M', 'd'), + (0x1D41E, 'M', 'e'), + (0x1D41F, 'M', 'f'), + (0x1D420, 'M', 'g'), + ] + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D421, 'M', 'h'), + (0x1D422, 'M', 'i'), + (0x1D423, 'M', 'j'), + (0x1D424, 'M', 'k'), + (0x1D425, 'M', 'l'), + (0x1D426, 'M', 'm'), + (0x1D427, 'M', 'n'), + (0x1D428, 'M', 'o'), + (0x1D429, 'M', 'p'), + (0x1D42A, 'M', 'q'), + (0x1D42B, 'M', 'r'), + (0x1D42C, 'M', 's'), + (0x1D42D, 'M', 't'), + (0x1D42E, 'M', 'u'), + (0x1D42F, 'M', 'v'), + (0x1D430, 'M', 'w'), + (0x1D431, 'M', 'x'), + (0x1D432, 'M', 'y'), + (0x1D433, 'M', 'z'), + (0x1D434, 'M', 'a'), + (0x1D435, 'M', 'b'), + (0x1D436, 'M', 'c'), + (0x1D437, 'M', 'd'), + (0x1D438, 'M', 'e'), + (0x1D439, 'M', 'f'), + (0x1D43A, 'M', 'g'), + (0x1D43B, 'M', 'h'), + (0x1D43C, 'M', 'i'), + (0x1D43D, 'M', 'j'), + (0x1D43E, 'M', 'k'), + (0x1D43F, 'M', 'l'), + (0x1D440, 'M', 'm'), + (0x1D441, 'M', 'n'), + (0x1D442, 'M', 'o'), + (0x1D443, 'M', 'p'), + (0x1D444, 'M', 'q'), + (0x1D445, 'M', 'r'), + (0x1D446, 'M', 's'), + (0x1D447, 'M', 't'), + (0x1D448, 'M', 'u'), + (0x1D449, 'M', 'v'), + (0x1D44A, 'M', 'w'), + (0x1D44B, 'M', 'x'), + (0x1D44C, 'M', 'y'), + (0x1D44D, 'M', 'z'), + (0x1D44E, 'M', 'a'), + (0x1D44F, 'M', 'b'), + (0x1D450, 'M', 'c'), + (0x1D451, 'M', 'd'), + (0x1D452, 'M', 'e'), + (0x1D453, 'M', 'f'), + (0x1D454, 'M', 'g'), + (0x1D455, 'X'), + (0x1D456, 'M', 'i'), + (0x1D457, 'M', 'j'), + (0x1D458, 'M', 'k'), + (0x1D459, 'M', 'l'), + (0x1D45A, 'M', 'm'), + (0x1D45B, 'M', 'n'), + (0x1D45C, 'M', 'o'), + (0x1D45D, 'M', 'p'), + (0x1D45E, 'M', 'q'), + (0x1D45F, 'M', 'r'), + (0x1D460, 'M', 's'), + (0x1D461, 'M', 't'), + (0x1D462, 'M', 'u'), + (0x1D463, 'M', 'v'), + (0x1D464, 'M', 'w'), + (0x1D465, 'M', 'x'), + (0x1D466, 'M', 'y'), + (0x1D467, 'M', 'z'), + (0x1D468, 'M', 'a'), + (0x1D469, 'M', 'b'), + (0x1D46A, 'M', 'c'), + (0x1D46B, 'M', 'd'), + (0x1D46C, 'M', 'e'), + (0x1D46D, 'M', 'f'), + (0x1D46E, 'M', 'g'), + (0x1D46F, 'M', 'h'), + (0x1D470, 'M', 'i'), + (0x1D471, 'M', 'j'), + (0x1D472, 'M', 'k'), + (0x1D473, 'M', 'l'), + (0x1D474, 'M', 'm'), + (0x1D475, 'M', 'n'), + (0x1D476, 'M', 'o'), + (0x1D477, 'M', 'p'), + (0x1D478, 'M', 'q'), + (0x1D479, 'M', 'r'), + (0x1D47A, 'M', 's'), + (0x1D47B, 'M', 't'), + (0x1D47C, 'M', 'u'), + (0x1D47D, 'M', 'v'), + (0x1D47E, 'M', 'w'), + (0x1D47F, 'M', 'x'), + (0x1D480, 'M', 'y'), + (0x1D481, 'M', 'z'), + (0x1D482, 'M', 'a'), + (0x1D483, 'M', 'b'), + (0x1D484, 'M', 'c'), + ] + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D485, 'M', 'd'), + (0x1D486, 'M', 'e'), + (0x1D487, 'M', 'f'), + (0x1D488, 'M', 'g'), + (0x1D489, 'M', 'h'), + (0x1D48A, 'M', 'i'), + (0x1D48B, 'M', 'j'), + (0x1D48C, 'M', 'k'), + (0x1D48D, 'M', 'l'), + (0x1D48E, 'M', 'm'), + (0x1D48F, 'M', 'n'), + (0x1D490, 'M', 'o'), + (0x1D491, 'M', 'p'), + (0x1D492, 'M', 'q'), + (0x1D493, 'M', 'r'), + (0x1D494, 'M', 's'), + (0x1D495, 'M', 't'), + (0x1D496, 'M', 'u'), + (0x1D497, 'M', 'v'), + (0x1D498, 'M', 'w'), + (0x1D499, 'M', 'x'), + (0x1D49A, 'M', 'y'), + (0x1D49B, 'M', 'z'), + (0x1D49C, 'M', 'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', 'c'), + (0x1D49F, 'M', 'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', 'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', 'j'), + (0x1D4A6, 'M', 'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', 'n'), + (0x1D4AA, 'M', 'o'), + (0x1D4AB, 'M', 'p'), + (0x1D4AC, 'M', 'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', 's'), + (0x1D4AF, 'M', 't'), + (0x1D4B0, 'M', 'u'), + (0x1D4B1, 'M', 'v'), + (0x1D4B2, 'M', 'w'), + (0x1D4B3, 'M', 'x'), + (0x1D4B4, 'M', 'y'), + (0x1D4B5, 'M', 'z'), + (0x1D4B6, 'M', 'a'), + (0x1D4B7, 'M', 'b'), + (0x1D4B8, 'M', 'c'), + (0x1D4B9, 'M', 'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', 'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', 'h'), + (0x1D4BE, 'M', 'i'), + (0x1D4BF, 'M', 'j'), + (0x1D4C0, 'M', 'k'), + (0x1D4C1, 'M', 'l'), + (0x1D4C2, 'M', 'm'), + (0x1D4C3, 'M', 'n'), + (0x1D4C4, 'X'), + (0x1D4C5, 'M', 'p'), + (0x1D4C6, 'M', 'q'), + (0x1D4C7, 'M', 'r'), + (0x1D4C8, 'M', 's'), + (0x1D4C9, 'M', 't'), + (0x1D4CA, 'M', 'u'), + (0x1D4CB, 'M', 'v'), + (0x1D4CC, 'M', 'w'), + (0x1D4CD, 'M', 'x'), + (0x1D4CE, 'M', 'y'), + (0x1D4CF, 'M', 'z'), + (0x1D4D0, 'M', 'a'), + (0x1D4D1, 'M', 'b'), + (0x1D4D2, 'M', 'c'), + (0x1D4D3, 'M', 'd'), + (0x1D4D4, 'M', 'e'), + (0x1D4D5, 'M', 'f'), + (0x1D4D6, 'M', 'g'), + (0x1D4D7, 'M', 'h'), + (0x1D4D8, 'M', 'i'), + (0x1D4D9, 'M', 'j'), + (0x1D4DA, 'M', 'k'), + (0x1D4DB, 'M', 'l'), + (0x1D4DC, 'M', 'm'), + (0x1D4DD, 'M', 'n'), + (0x1D4DE, 'M', 'o'), + (0x1D4DF, 'M', 'p'), + (0x1D4E0, 'M', 'q'), + (0x1D4E1, 'M', 'r'), + (0x1D4E2, 'M', 's'), + (0x1D4E3, 'M', 't'), + (0x1D4E4, 'M', 'u'), + (0x1D4E5, 'M', 'v'), + (0x1D4E6, 'M', 'w'), + (0x1D4E7, 'M', 'x'), + (0x1D4E8, 'M', 'y'), + (0x1D4E9, 'M', 'z'), + (0x1D4EA, 'M', 'a'), + (0x1D4EB, 'M', 'b'), + ] + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D4EC, 'M', 'c'), + (0x1D4ED, 'M', 'd'), + (0x1D4EE, 'M', 'e'), + (0x1D4EF, 'M', 'f'), + (0x1D4F0, 'M', 'g'), + (0x1D4F1, 'M', 'h'), + (0x1D4F2, 'M', 'i'), + (0x1D4F3, 'M', 'j'), + (0x1D4F4, 'M', 'k'), + (0x1D4F5, 'M', 'l'), + (0x1D4F6, 'M', 'm'), + (0x1D4F7, 'M', 'n'), + (0x1D4F8, 'M', 'o'), + (0x1D4F9, 'M', 'p'), + (0x1D4FA, 'M', 'q'), + (0x1D4FB, 'M', 'r'), + (0x1D4FC, 'M', 's'), + (0x1D4FD, 'M', 't'), + (0x1D4FE, 'M', 'u'), + (0x1D4FF, 'M', 'v'), + (0x1D500, 'M', 'w'), + (0x1D501, 'M', 'x'), + (0x1D502, 'M', 'y'), + (0x1D503, 'M', 'z'), + (0x1D504, 'M', 'a'), + (0x1D505, 'M', 'b'), + (0x1D506, 'X'), + (0x1D507, 'M', 'd'), + (0x1D508, 'M', 'e'), + (0x1D509, 'M', 'f'), + (0x1D50A, 'M', 'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', 'j'), + (0x1D50E, 'M', 'k'), + (0x1D50F, 'M', 'l'), + (0x1D510, 'M', 'm'), + (0x1D511, 'M', 'n'), + (0x1D512, 'M', 'o'), + (0x1D513, 'M', 'p'), + (0x1D514, 'M', 'q'), + (0x1D515, 'X'), + (0x1D516, 'M', 's'), + (0x1D517, 'M', 't'), + (0x1D518, 'M', 'u'), + (0x1D519, 'M', 'v'), + (0x1D51A, 'M', 'w'), + (0x1D51B, 'M', 'x'), + (0x1D51C, 'M', 'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', 'a'), + (0x1D51F, 'M', 'b'), + (0x1D520, 'M', 'c'), + (0x1D521, 'M', 'd'), + (0x1D522, 'M', 'e'), + (0x1D523, 'M', 'f'), + (0x1D524, 'M', 'g'), + (0x1D525, 'M', 'h'), + (0x1D526, 'M', 'i'), + (0x1D527, 'M', 'j'), + (0x1D528, 'M', 'k'), + (0x1D529, 'M', 'l'), + (0x1D52A, 'M', 'm'), + (0x1D52B, 'M', 'n'), + (0x1D52C, 'M', 'o'), + (0x1D52D, 'M', 'p'), + (0x1D52E, 'M', 'q'), + (0x1D52F, 'M', 'r'), + (0x1D530, 'M', 's'), + (0x1D531, 'M', 't'), + (0x1D532, 'M', 'u'), + (0x1D533, 'M', 'v'), + (0x1D534, 'M', 'w'), + (0x1D535, 'M', 'x'), + (0x1D536, 'M', 'y'), + (0x1D537, 'M', 'z'), + (0x1D538, 'M', 'a'), + (0x1D539, 'M', 'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', 'd'), + (0x1D53C, 'M', 'e'), + (0x1D53D, 'M', 'f'), + (0x1D53E, 'M', 'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', 'i'), + (0x1D541, 'M', 'j'), + (0x1D542, 'M', 'k'), + (0x1D543, 'M', 'l'), + (0x1D544, 'M', 'm'), + (0x1D545, 'X'), + (0x1D546, 'M', 'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', 's'), + (0x1D54B, 'M', 't'), + (0x1D54C, 'M', 'u'), + (0x1D54D, 'M', 'v'), + (0x1D54E, 'M', 'w'), + (0x1D54F, 'M', 'x'), + (0x1D550, 'M', 'y'), + (0x1D551, 'X'), + (0x1D552, 'M', 'a'), + ] + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D553, 'M', 'b'), + (0x1D554, 'M', 'c'), + (0x1D555, 'M', 'd'), + (0x1D556, 'M', 'e'), + (0x1D557, 'M', 'f'), + (0x1D558, 'M', 'g'), + (0x1D559, 'M', 'h'), + (0x1D55A, 'M', 'i'), + (0x1D55B, 'M', 'j'), + (0x1D55C, 'M', 'k'), + (0x1D55D, 'M', 'l'), + (0x1D55E, 'M', 'm'), + (0x1D55F, 'M', 'n'), + (0x1D560, 'M', 'o'), + (0x1D561, 'M', 'p'), + (0x1D562, 'M', 'q'), + (0x1D563, 'M', 'r'), + (0x1D564, 'M', 's'), + (0x1D565, 'M', 't'), + (0x1D566, 'M', 'u'), + (0x1D567, 'M', 'v'), + (0x1D568, 'M', 'w'), + (0x1D569, 'M', 'x'), + (0x1D56A, 'M', 'y'), + (0x1D56B, 'M', 'z'), + (0x1D56C, 'M', 'a'), + (0x1D56D, 'M', 'b'), + (0x1D56E, 'M', 'c'), + (0x1D56F, 'M', 'd'), + (0x1D570, 'M', 'e'), + (0x1D571, 'M', 'f'), + (0x1D572, 'M', 'g'), + (0x1D573, 'M', 'h'), + (0x1D574, 'M', 'i'), + (0x1D575, 'M', 'j'), + (0x1D576, 'M', 'k'), + (0x1D577, 'M', 'l'), + (0x1D578, 'M', 'm'), + (0x1D579, 'M', 'n'), + (0x1D57A, 'M', 'o'), + (0x1D57B, 'M', 'p'), + (0x1D57C, 'M', 'q'), + (0x1D57D, 'M', 'r'), + (0x1D57E, 'M', 's'), + (0x1D57F, 'M', 't'), + (0x1D580, 'M', 'u'), + (0x1D581, 'M', 'v'), + (0x1D582, 'M', 'w'), + (0x1D583, 'M', 'x'), + (0x1D584, 'M', 'y'), + (0x1D585, 'M', 'z'), + (0x1D586, 'M', 'a'), + (0x1D587, 'M', 'b'), + (0x1D588, 'M', 'c'), + (0x1D589, 'M', 'd'), + (0x1D58A, 'M', 'e'), + (0x1D58B, 'M', 'f'), + (0x1D58C, 'M', 'g'), + (0x1D58D, 'M', 'h'), + (0x1D58E, 'M', 'i'), + (0x1D58F, 'M', 'j'), + (0x1D590, 'M', 'k'), + (0x1D591, 'M', 'l'), + (0x1D592, 'M', 'm'), + (0x1D593, 'M', 'n'), + (0x1D594, 'M', 'o'), + (0x1D595, 'M', 'p'), + (0x1D596, 'M', 'q'), + (0x1D597, 'M', 'r'), + (0x1D598, 'M', 's'), + (0x1D599, 'M', 't'), + (0x1D59A, 'M', 'u'), + (0x1D59B, 'M', 'v'), + (0x1D59C, 'M', 'w'), + (0x1D59D, 'M', 'x'), + (0x1D59E, 'M', 'y'), + (0x1D59F, 'M', 'z'), + (0x1D5A0, 'M', 'a'), + (0x1D5A1, 'M', 'b'), + (0x1D5A2, 'M', 'c'), + (0x1D5A3, 'M', 'd'), + (0x1D5A4, 'M', 'e'), + (0x1D5A5, 'M', 'f'), + (0x1D5A6, 'M', 'g'), + (0x1D5A7, 'M', 'h'), + (0x1D5A8, 'M', 'i'), + (0x1D5A9, 'M', 'j'), + (0x1D5AA, 'M', 'k'), + (0x1D5AB, 'M', 'l'), + (0x1D5AC, 'M', 'm'), + (0x1D5AD, 'M', 'n'), + (0x1D5AE, 'M', 'o'), + (0x1D5AF, 'M', 'p'), + (0x1D5B0, 'M', 'q'), + (0x1D5B1, 'M', 'r'), + (0x1D5B2, 'M', 's'), + (0x1D5B3, 'M', 't'), + (0x1D5B4, 'M', 'u'), + (0x1D5B5, 'M', 'v'), + (0x1D5B6, 'M', 'w'), + ] + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D5B7, 'M', 'x'), + (0x1D5B8, 'M', 'y'), + (0x1D5B9, 'M', 'z'), + (0x1D5BA, 'M', 'a'), + (0x1D5BB, 'M', 'b'), + (0x1D5BC, 'M', 'c'), + (0x1D5BD, 'M', 'd'), + (0x1D5BE, 'M', 'e'), + (0x1D5BF, 'M', 'f'), + (0x1D5C0, 'M', 'g'), + (0x1D5C1, 'M', 'h'), + (0x1D5C2, 'M', 'i'), + (0x1D5C3, 'M', 'j'), + (0x1D5C4, 'M', 'k'), + (0x1D5C5, 'M', 'l'), + (0x1D5C6, 'M', 'm'), + (0x1D5C7, 'M', 'n'), + (0x1D5C8, 'M', 'o'), + (0x1D5C9, 'M', 'p'), + (0x1D5CA, 'M', 'q'), + (0x1D5CB, 'M', 'r'), + (0x1D5CC, 'M', 's'), + (0x1D5CD, 'M', 't'), + (0x1D5CE, 'M', 'u'), + (0x1D5CF, 'M', 'v'), + (0x1D5D0, 'M', 'w'), + (0x1D5D1, 'M', 'x'), + (0x1D5D2, 'M', 'y'), + (0x1D5D3, 'M', 'z'), + (0x1D5D4, 'M', 'a'), + (0x1D5D5, 'M', 'b'), + (0x1D5D6, 'M', 'c'), + (0x1D5D7, 'M', 'd'), + (0x1D5D8, 'M', 'e'), + (0x1D5D9, 'M', 'f'), + (0x1D5DA, 'M', 'g'), + (0x1D5DB, 'M', 'h'), + (0x1D5DC, 'M', 'i'), + (0x1D5DD, 'M', 'j'), + (0x1D5DE, 'M', 'k'), + (0x1D5DF, 'M', 'l'), + (0x1D5E0, 'M', 'm'), + (0x1D5E1, 'M', 'n'), + (0x1D5E2, 'M', 'o'), + (0x1D5E3, 'M', 'p'), + (0x1D5E4, 'M', 'q'), + (0x1D5E5, 'M', 'r'), + (0x1D5E6, 'M', 's'), + (0x1D5E7, 'M', 't'), + (0x1D5E8, 'M', 'u'), + (0x1D5E9, 'M', 'v'), + (0x1D5EA, 'M', 'w'), + (0x1D5EB, 'M', 'x'), + (0x1D5EC, 'M', 'y'), + (0x1D5ED, 'M', 'z'), + (0x1D5EE, 'M', 'a'), + (0x1D5EF, 'M', 'b'), + (0x1D5F0, 'M', 'c'), + (0x1D5F1, 'M', 'd'), + (0x1D5F2, 'M', 'e'), + (0x1D5F3, 'M', 'f'), + (0x1D5F4, 'M', 'g'), + (0x1D5F5, 'M', 'h'), + (0x1D5F6, 'M', 'i'), + (0x1D5F7, 'M', 'j'), + (0x1D5F8, 'M', 'k'), + (0x1D5F9, 'M', 'l'), + (0x1D5FA, 'M', 'm'), + (0x1D5FB, 'M', 'n'), + (0x1D5FC, 'M', 'o'), + (0x1D5FD, 'M', 'p'), + (0x1D5FE, 'M', 'q'), + (0x1D5FF, 'M', 'r'), + (0x1D600, 'M', 's'), + (0x1D601, 'M', 't'), + (0x1D602, 'M', 'u'), + (0x1D603, 'M', 'v'), + (0x1D604, 'M', 'w'), + (0x1D605, 'M', 'x'), + (0x1D606, 'M', 'y'), + (0x1D607, 'M', 'z'), + (0x1D608, 'M', 'a'), + (0x1D609, 'M', 'b'), + (0x1D60A, 'M', 'c'), + (0x1D60B, 'M', 'd'), + (0x1D60C, 'M', 'e'), + (0x1D60D, 'M', 'f'), + (0x1D60E, 'M', 'g'), + (0x1D60F, 'M', 'h'), + (0x1D610, 'M', 'i'), + (0x1D611, 'M', 'j'), + (0x1D612, 'M', 'k'), + (0x1D613, 'M', 'l'), + (0x1D614, 'M', 'm'), + (0x1D615, 'M', 'n'), + (0x1D616, 'M', 'o'), + (0x1D617, 'M', 'p'), + (0x1D618, 'M', 'q'), + (0x1D619, 'M', 'r'), + (0x1D61A, 'M', 's'), + ] + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D61B, 'M', 't'), + (0x1D61C, 'M', 'u'), + (0x1D61D, 'M', 'v'), + (0x1D61E, 'M', 'w'), + (0x1D61F, 'M', 'x'), + (0x1D620, 'M', 'y'), + (0x1D621, 'M', 'z'), + (0x1D622, 'M', 'a'), + (0x1D623, 'M', 'b'), + (0x1D624, 'M', 'c'), + (0x1D625, 'M', 'd'), + (0x1D626, 'M', 'e'), + (0x1D627, 'M', 'f'), + (0x1D628, 'M', 'g'), + (0x1D629, 'M', 'h'), + (0x1D62A, 'M', 'i'), + (0x1D62B, 'M', 'j'), + (0x1D62C, 'M', 'k'), + (0x1D62D, 'M', 'l'), + (0x1D62E, 'M', 'm'), + (0x1D62F, 'M', 'n'), + (0x1D630, 'M', 'o'), + (0x1D631, 'M', 'p'), + (0x1D632, 'M', 'q'), + (0x1D633, 'M', 'r'), + (0x1D634, 'M', 's'), + (0x1D635, 'M', 't'), + (0x1D636, 'M', 'u'), + (0x1D637, 'M', 'v'), + (0x1D638, 'M', 'w'), + (0x1D639, 'M', 'x'), + (0x1D63A, 'M', 'y'), + (0x1D63B, 'M', 'z'), + (0x1D63C, 'M', 'a'), + (0x1D63D, 'M', 'b'), + (0x1D63E, 'M', 'c'), + (0x1D63F, 'M', 'd'), + (0x1D640, 'M', 'e'), + (0x1D641, 'M', 'f'), + (0x1D642, 'M', 'g'), + (0x1D643, 'M', 'h'), + (0x1D644, 'M', 'i'), + (0x1D645, 'M', 'j'), + (0x1D646, 'M', 'k'), + (0x1D647, 'M', 'l'), + (0x1D648, 'M', 'm'), + (0x1D649, 'M', 'n'), + (0x1D64A, 'M', 'o'), + (0x1D64B, 'M', 'p'), + (0x1D64C, 'M', 'q'), + (0x1D64D, 'M', 'r'), + (0x1D64E, 'M', 's'), + (0x1D64F, 'M', 't'), + (0x1D650, 'M', 'u'), + (0x1D651, 'M', 'v'), + (0x1D652, 'M', 'w'), + (0x1D653, 'M', 'x'), + (0x1D654, 'M', 'y'), + (0x1D655, 'M', 'z'), + (0x1D656, 'M', 'a'), + (0x1D657, 'M', 'b'), + (0x1D658, 'M', 'c'), + (0x1D659, 'M', 'd'), + (0x1D65A, 'M', 'e'), + (0x1D65B, 'M', 'f'), + (0x1D65C, 'M', 'g'), + (0x1D65D, 'M', 'h'), + (0x1D65E, 'M', 'i'), + (0x1D65F, 'M', 'j'), + (0x1D660, 'M', 'k'), + (0x1D661, 'M', 'l'), + (0x1D662, 'M', 'm'), + (0x1D663, 'M', 'n'), + (0x1D664, 'M', 'o'), + (0x1D665, 'M', 'p'), + (0x1D666, 'M', 'q'), + (0x1D667, 'M', 'r'), + (0x1D668, 'M', 's'), + (0x1D669, 'M', 't'), + (0x1D66A, 'M', 'u'), + (0x1D66B, 'M', 'v'), + (0x1D66C, 'M', 'w'), + (0x1D66D, 'M', 'x'), + (0x1D66E, 'M', 'y'), + (0x1D66F, 'M', 'z'), + (0x1D670, 'M', 'a'), + (0x1D671, 'M', 'b'), + (0x1D672, 'M', 'c'), + (0x1D673, 'M', 'd'), + (0x1D674, 'M', 'e'), + (0x1D675, 'M', 'f'), + (0x1D676, 'M', 'g'), + (0x1D677, 'M', 'h'), + (0x1D678, 'M', 'i'), + (0x1D679, 'M', 'j'), + (0x1D67A, 'M', 'k'), + (0x1D67B, 'M', 'l'), + (0x1D67C, 'M', 'm'), + (0x1D67D, 'M', 'n'), + (0x1D67E, 'M', 'o'), + ] + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D67F, 'M', 'p'), + (0x1D680, 'M', 'q'), + (0x1D681, 'M', 'r'), + (0x1D682, 'M', 's'), + (0x1D683, 'M', 't'), + (0x1D684, 'M', 'u'), + (0x1D685, 'M', 'v'), + (0x1D686, 'M', 'w'), + (0x1D687, 'M', 'x'), + (0x1D688, 'M', 'y'), + (0x1D689, 'M', 'z'), + (0x1D68A, 'M', 'a'), + (0x1D68B, 'M', 'b'), + (0x1D68C, 'M', 'c'), + (0x1D68D, 'M', 'd'), + (0x1D68E, 'M', 'e'), + (0x1D68F, 'M', 'f'), + (0x1D690, 'M', 'g'), + (0x1D691, 'M', 'h'), + (0x1D692, 'M', 'i'), + (0x1D693, 'M', 'j'), + (0x1D694, 'M', 'k'), + (0x1D695, 'M', 'l'), + (0x1D696, 'M', 'm'), + (0x1D697, 'M', 'n'), + (0x1D698, 'M', 'o'), + (0x1D699, 'M', 'p'), + (0x1D69A, 'M', 'q'), + (0x1D69B, 'M', 'r'), + (0x1D69C, 'M', 's'), + (0x1D69D, 'M', 't'), + (0x1D69E, 'M', 'u'), + (0x1D69F, 'M', 'v'), + (0x1D6A0, 'M', 'w'), + (0x1D6A1, 'M', 'x'), + (0x1D6A2, 'M', 'y'), + (0x1D6A3, 'M', 'z'), + (0x1D6A4, 'M', 'ı'), + (0x1D6A5, 'M', 'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', 'α'), + (0x1D6A9, 'M', 'β'), + (0x1D6AA, 'M', 'γ'), + (0x1D6AB, 'M', 'δ'), + (0x1D6AC, 'M', 'ε'), + (0x1D6AD, 'M', 'ζ'), + (0x1D6AE, 'M', 'η'), + (0x1D6AF, 'M', 'θ'), + (0x1D6B0, 'M', 'ι'), + (0x1D6B1, 'M', 'κ'), + (0x1D6B2, 'M', 'λ'), + (0x1D6B3, 'M', 'μ'), + (0x1D6B4, 'M', 'ν'), + (0x1D6B5, 'M', 'ξ'), + (0x1D6B6, 'M', 'ο'), + (0x1D6B7, 'M', 'π'), + (0x1D6B8, 'M', 'ρ'), + (0x1D6B9, 'M', 'θ'), + (0x1D6BA, 'M', 'σ'), + (0x1D6BB, 'M', 'τ'), + (0x1D6BC, 'M', 'υ'), + (0x1D6BD, 'M', 'φ'), + (0x1D6BE, 'M', 'χ'), + (0x1D6BF, 'M', 'ψ'), + (0x1D6C0, 'M', 'ω'), + (0x1D6C1, 'M', '∇'), + (0x1D6C2, 'M', 'α'), + (0x1D6C3, 'M', 'β'), + (0x1D6C4, 'M', 'γ'), + (0x1D6C5, 'M', 'δ'), + (0x1D6C6, 'M', 'ε'), + (0x1D6C7, 'M', 'ζ'), + (0x1D6C8, 'M', 'η'), + (0x1D6C9, 'M', 'θ'), + (0x1D6CA, 'M', 'ι'), + (0x1D6CB, 'M', 'κ'), + (0x1D6CC, 'M', 'λ'), + (0x1D6CD, 'M', 'μ'), + (0x1D6CE, 'M', 'ν'), + (0x1D6CF, 'M', 'ξ'), + (0x1D6D0, 'M', 'ο'), + (0x1D6D1, 'M', 'π'), + (0x1D6D2, 'M', 'ρ'), + (0x1D6D3, 'M', 'σ'), + (0x1D6D5, 'M', 'τ'), + (0x1D6D6, 'M', 'υ'), + (0x1D6D7, 'M', 'φ'), + (0x1D6D8, 'M', 'χ'), + (0x1D6D9, 'M', 'ψ'), + (0x1D6DA, 'M', 'ω'), + (0x1D6DB, 'M', '∂'), + (0x1D6DC, 'M', 'ε'), + (0x1D6DD, 'M', 'θ'), + (0x1D6DE, 'M', 'κ'), + (0x1D6DF, 'M', 'φ'), + (0x1D6E0, 'M', 'ρ'), + (0x1D6E1, 'M', 'π'), + (0x1D6E2, 'M', 'α'), + (0x1D6E3, 'M', 'β'), + (0x1D6E4, 'M', 'γ'), + ] + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D6E5, 'M', 'δ'), + (0x1D6E6, 'M', 'ε'), + (0x1D6E7, 'M', 'ζ'), + (0x1D6E8, 'M', 'η'), + (0x1D6E9, 'M', 'θ'), + (0x1D6EA, 'M', 'ι'), + (0x1D6EB, 'M', 'κ'), + (0x1D6EC, 'M', 'λ'), + (0x1D6ED, 'M', 'μ'), + (0x1D6EE, 'M', 'ν'), + (0x1D6EF, 'M', 'ξ'), + (0x1D6F0, 'M', 'ο'), + (0x1D6F1, 'M', 'π'), + (0x1D6F2, 'M', 'ρ'), + (0x1D6F3, 'M', 'θ'), + (0x1D6F4, 'M', 'σ'), + (0x1D6F5, 'M', 'τ'), + (0x1D6F6, 'M', 'υ'), + (0x1D6F7, 'M', 'φ'), + (0x1D6F8, 'M', 'χ'), + (0x1D6F9, 'M', 'ψ'), + (0x1D6FA, 'M', 'ω'), + (0x1D6FB, 'M', '∇'), + (0x1D6FC, 'M', 'α'), + (0x1D6FD, 'M', 'β'), + (0x1D6FE, 'M', 'γ'), + (0x1D6FF, 'M', 'δ'), + (0x1D700, 'M', 'ε'), + (0x1D701, 'M', 'ζ'), + (0x1D702, 'M', 'η'), + (0x1D703, 'M', 'θ'), + (0x1D704, 'M', 'ι'), + (0x1D705, 'M', 'κ'), + (0x1D706, 'M', 'λ'), + (0x1D707, 'M', 'μ'), + (0x1D708, 'M', 'ν'), + (0x1D709, 'M', 'ξ'), + (0x1D70A, 'M', 'ο'), + (0x1D70B, 'M', 'π'), + (0x1D70C, 'M', 'ρ'), + (0x1D70D, 'M', 'σ'), + (0x1D70F, 'M', 'τ'), + (0x1D710, 'M', 'υ'), + (0x1D711, 'M', 'φ'), + (0x1D712, 'M', 'χ'), + (0x1D713, 'M', 'ψ'), + (0x1D714, 'M', 'ω'), + (0x1D715, 'M', '∂'), + (0x1D716, 'M', 'ε'), + (0x1D717, 'M', 'θ'), + (0x1D718, 'M', 'κ'), + (0x1D719, 'M', 'φ'), + (0x1D71A, 'M', 'ρ'), + (0x1D71B, 'M', 'π'), + (0x1D71C, 'M', 'α'), + (0x1D71D, 'M', 'β'), + (0x1D71E, 'M', 'γ'), + (0x1D71F, 'M', 'δ'), + (0x1D720, 'M', 'ε'), + (0x1D721, 'M', 'ζ'), + (0x1D722, 'M', 'η'), + (0x1D723, 'M', 'θ'), + (0x1D724, 'M', 'ι'), + (0x1D725, 'M', 'κ'), + (0x1D726, 'M', 'λ'), + (0x1D727, 'M', 'μ'), + (0x1D728, 'M', 'ν'), + (0x1D729, 'M', 'ξ'), + (0x1D72A, 'M', 'ο'), + (0x1D72B, 'M', 'π'), + (0x1D72C, 'M', 'ρ'), + (0x1D72D, 'M', 'θ'), + (0x1D72E, 'M', 'σ'), + (0x1D72F, 'M', 'τ'), + (0x1D730, 'M', 'υ'), + (0x1D731, 'M', 'φ'), + (0x1D732, 'M', 'χ'), + (0x1D733, 'M', 'ψ'), + (0x1D734, 'M', 'ω'), + (0x1D735, 'M', '∇'), + (0x1D736, 'M', 'α'), + (0x1D737, 'M', 'β'), + (0x1D738, 'M', 'γ'), + (0x1D739, 'M', 'δ'), + (0x1D73A, 'M', 'ε'), + (0x1D73B, 'M', 'ζ'), + (0x1D73C, 'M', 'η'), + (0x1D73D, 'M', 'θ'), + (0x1D73E, 'M', 'ι'), + (0x1D73F, 'M', 'κ'), + (0x1D740, 'M', 'λ'), + (0x1D741, 'M', 'μ'), + (0x1D742, 'M', 'ν'), + (0x1D743, 'M', 'ξ'), + (0x1D744, 'M', 'ο'), + (0x1D745, 'M', 'π'), + (0x1D746, 'M', 'ρ'), + (0x1D747, 'M', 'σ'), + (0x1D749, 'M', 'τ'), + (0x1D74A, 'M', 'υ'), + ] + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D74B, 'M', 'φ'), + (0x1D74C, 'M', 'χ'), + (0x1D74D, 'M', 'ψ'), + (0x1D74E, 'M', 'ω'), + (0x1D74F, 'M', '∂'), + (0x1D750, 'M', 'ε'), + (0x1D751, 'M', 'θ'), + (0x1D752, 'M', 'κ'), + (0x1D753, 'M', 'φ'), + (0x1D754, 'M', 'ρ'), + (0x1D755, 'M', 'π'), + (0x1D756, 'M', 'α'), + (0x1D757, 'M', 'β'), + (0x1D758, 'M', 'γ'), + (0x1D759, 'M', 'δ'), + (0x1D75A, 'M', 'ε'), + (0x1D75B, 'M', 'ζ'), + (0x1D75C, 'M', 'η'), + (0x1D75D, 'M', 'θ'), + (0x1D75E, 'M', 'ι'), + (0x1D75F, 'M', 'κ'), + (0x1D760, 'M', 'λ'), + (0x1D761, 'M', 'μ'), + (0x1D762, 'M', 'ν'), + (0x1D763, 'M', 'ξ'), + (0x1D764, 'M', 'ο'), + (0x1D765, 'M', 'π'), + (0x1D766, 'M', 'ρ'), + (0x1D767, 'M', 'θ'), + (0x1D768, 'M', 'σ'), + (0x1D769, 'M', 'τ'), + (0x1D76A, 'M', 'υ'), + (0x1D76B, 'M', 'φ'), + (0x1D76C, 'M', 'χ'), + (0x1D76D, 'M', 'ψ'), + (0x1D76E, 'M', 'ω'), + (0x1D76F, 'M', '∇'), + (0x1D770, 'M', 'α'), + (0x1D771, 'M', 'β'), + (0x1D772, 'M', 'γ'), + (0x1D773, 'M', 'δ'), + (0x1D774, 'M', 'ε'), + (0x1D775, 'M', 'ζ'), + (0x1D776, 'M', 'η'), + (0x1D777, 'M', 'θ'), + (0x1D778, 'M', 'ι'), + (0x1D779, 'M', 'κ'), + (0x1D77A, 'M', 'λ'), + (0x1D77B, 'M', 'μ'), + (0x1D77C, 'M', 'ν'), + (0x1D77D, 'M', 'ξ'), + (0x1D77E, 'M', 'ο'), + (0x1D77F, 'M', 'π'), + (0x1D780, 'M', 'ρ'), + (0x1D781, 'M', 'σ'), + (0x1D783, 'M', 'τ'), + (0x1D784, 'M', 'υ'), + (0x1D785, 'M', 'φ'), + (0x1D786, 'M', 'χ'), + (0x1D787, 'M', 'ψ'), + (0x1D788, 'M', 'ω'), + (0x1D789, 'M', '∂'), + (0x1D78A, 'M', 'ε'), + (0x1D78B, 'M', 'θ'), + (0x1D78C, 'M', 'κ'), + (0x1D78D, 'M', 'φ'), + (0x1D78E, 'M', 'ρ'), + (0x1D78F, 'M', 'π'), + (0x1D790, 'M', 'α'), + (0x1D791, 'M', 'β'), + (0x1D792, 'M', 'γ'), + (0x1D793, 'M', 'δ'), + (0x1D794, 'M', 'ε'), + (0x1D795, 'M', 'ζ'), + (0x1D796, 'M', 'η'), + (0x1D797, 'M', 'θ'), + (0x1D798, 'M', 'ι'), + (0x1D799, 'M', 'κ'), + (0x1D79A, 'M', 'λ'), + (0x1D79B, 'M', 'μ'), + (0x1D79C, 'M', 'ν'), + (0x1D79D, 'M', 'ξ'), + (0x1D79E, 'M', 'ο'), + (0x1D79F, 'M', 'π'), + (0x1D7A0, 'M', 'ρ'), + (0x1D7A1, 'M', 'θ'), + (0x1D7A2, 'M', 'σ'), + (0x1D7A3, 'M', 'τ'), + (0x1D7A4, 'M', 'υ'), + (0x1D7A5, 'M', 'φ'), + (0x1D7A6, 'M', 'χ'), + (0x1D7A7, 'M', 'ψ'), + (0x1D7A8, 'M', 'ω'), + (0x1D7A9, 'M', '∇'), + (0x1D7AA, 'M', 'α'), + (0x1D7AB, 'M', 'β'), + (0x1D7AC, 'M', 'γ'), + (0x1D7AD, 'M', 'δ'), + (0x1D7AE, 'M', 'ε'), + (0x1D7AF, 'M', 'ζ'), + ] + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D7B0, 'M', 'η'), + (0x1D7B1, 'M', 'θ'), + (0x1D7B2, 'M', 'ι'), + (0x1D7B3, 'M', 'κ'), + (0x1D7B4, 'M', 'λ'), + (0x1D7B5, 'M', 'μ'), + (0x1D7B6, 'M', 'ν'), + (0x1D7B7, 'M', 'ξ'), + (0x1D7B8, 'M', 'ο'), + (0x1D7B9, 'M', 'π'), + (0x1D7BA, 'M', 'ρ'), + (0x1D7BB, 'M', 'σ'), + (0x1D7BD, 'M', 'τ'), + (0x1D7BE, 'M', 'υ'), + (0x1D7BF, 'M', 'φ'), + (0x1D7C0, 'M', 'χ'), + (0x1D7C1, 'M', 'ψ'), + (0x1D7C2, 'M', 'ω'), + (0x1D7C3, 'M', '∂'), + (0x1D7C4, 'M', 'ε'), + (0x1D7C5, 'M', 'θ'), + (0x1D7C6, 'M', 'κ'), + (0x1D7C7, 'M', 'φ'), + (0x1D7C8, 'M', 'ρ'), + (0x1D7C9, 'M', 'π'), + (0x1D7CA, 'M', 'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', '0'), + (0x1D7CF, 'M', '1'), + (0x1D7D0, 'M', '2'), + (0x1D7D1, 'M', '3'), + (0x1D7D2, 'M', '4'), + (0x1D7D3, 'M', '5'), + (0x1D7D4, 'M', '6'), + (0x1D7D5, 'M', '7'), + (0x1D7D6, 'M', '8'), + (0x1D7D7, 'M', '9'), + (0x1D7D8, 'M', '0'), + (0x1D7D9, 'M', '1'), + (0x1D7DA, 'M', '2'), + (0x1D7DB, 'M', '3'), + (0x1D7DC, 'M', '4'), + (0x1D7DD, 'M', '5'), + (0x1D7DE, 'M', '6'), + (0x1D7DF, 'M', '7'), + (0x1D7E0, 'M', '8'), + (0x1D7E1, 'M', '9'), + (0x1D7E2, 'M', '0'), + (0x1D7E3, 'M', '1'), + (0x1D7E4, 'M', '2'), + (0x1D7E5, 'M', '3'), + (0x1D7E6, 'M', '4'), + (0x1D7E7, 'M', '5'), + (0x1D7E8, 'M', '6'), + (0x1D7E9, 'M', '7'), + (0x1D7EA, 'M', '8'), + (0x1D7EB, 'M', '9'), + (0x1D7EC, 'M', '0'), + (0x1D7ED, 'M', '1'), + (0x1D7EE, 'M', '2'), + (0x1D7EF, 'M', '3'), + (0x1D7F0, 'M', '4'), + (0x1D7F1, 'M', '5'), + (0x1D7F2, 'M', '6'), + (0x1D7F3, 'M', '7'), + (0x1D7F4, 'M', '8'), + (0x1D7F5, 'M', '9'), + (0x1D7F6, 'M', '0'), + (0x1D7F7, 'M', '1'), + (0x1D7F8, 'M', '2'), + (0x1D7F9, 'M', '3'), + (0x1D7FA, 'M', '4'), + (0x1D7FB, 'M', '5'), + (0x1D7FC, 'M', '6'), + (0x1D7FD, 'M', '7'), + (0x1D7FE, 'M', '8'), + (0x1D7FF, 'M', '9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1DF00, 'V'), + (0x1DF1F, 'X'), + (0x1DF25, 'V'), + (0x1DF2B, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E030, 'M', 'а'), + (0x1E031, 'M', 'б'), + (0x1E032, 'M', 'в'), + ] + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E033, 'M', 'г'), + (0x1E034, 'M', 'д'), + (0x1E035, 'M', 'е'), + (0x1E036, 'M', 'ж'), + (0x1E037, 'M', 'з'), + (0x1E038, 'M', 'и'), + (0x1E039, 'M', 'к'), + (0x1E03A, 'M', 'л'), + (0x1E03B, 'M', 'м'), + (0x1E03C, 'M', 'о'), + (0x1E03D, 'M', 'п'), + (0x1E03E, 'M', 'р'), + (0x1E03F, 'M', 'с'), + (0x1E040, 'M', 'т'), + (0x1E041, 'M', 'у'), + (0x1E042, 'M', 'ф'), + (0x1E043, 'M', 'х'), + (0x1E044, 'M', 'ц'), + (0x1E045, 'M', 'ч'), + (0x1E046, 'M', 'ш'), + (0x1E047, 'M', 'ы'), + (0x1E048, 'M', 'э'), + (0x1E049, 'M', 'ю'), + (0x1E04A, 'M', 'ꚉ'), + (0x1E04B, 'M', 'ә'), + (0x1E04C, 'M', 'і'), + (0x1E04D, 'M', 'ј'), + (0x1E04E, 'M', 'ө'), + (0x1E04F, 'M', 'ү'), + (0x1E050, 'M', 'ӏ'), + (0x1E051, 'M', 'а'), + (0x1E052, 'M', 'б'), + (0x1E053, 'M', 'в'), + (0x1E054, 'M', 'г'), + (0x1E055, 'M', 'д'), + (0x1E056, 'M', 'е'), + (0x1E057, 'M', 'ж'), + (0x1E058, 'M', 'з'), + (0x1E059, 'M', 'и'), + (0x1E05A, 'M', 'к'), + (0x1E05B, 'M', 'л'), + (0x1E05C, 'M', 'о'), + (0x1E05D, 'M', 'п'), + (0x1E05E, 'M', 'с'), + (0x1E05F, 'M', 'у'), + (0x1E060, 'M', 'ф'), + (0x1E061, 'M', 'х'), + (0x1E062, 'M', 'ц'), + (0x1E063, 'M', 'ч'), + (0x1E064, 'M', 'ш'), + (0x1E065, 'M', 'ъ'), + (0x1E066, 'M', 'ы'), + (0x1E067, 'M', 'ґ'), + (0x1E068, 'M', 'і'), + (0x1E069, 'M', 'ѕ'), + (0x1E06A, 'M', 'џ'), + (0x1E06B, 'M', 'ҫ'), + (0x1E06C, 'M', 'ꙑ'), + (0x1E06D, 'M', 'ұ'), + (0x1E06E, 'X'), + (0x1E08F, 'V'), + (0x1E090, 'X'), + (0x1E100, 'V'), + (0x1E12D, 'X'), + (0x1E130, 'V'), + (0x1E13E, 'X'), + (0x1E140, 'V'), + (0x1E14A, 'X'), + (0x1E14E, 'V'), + (0x1E150, 'X'), + (0x1E290, 'V'), + (0x1E2AF, 'X'), + (0x1E2C0, 'V'), + (0x1E2FA, 'X'), + (0x1E2FF, 'V'), + (0x1E300, 'X'), + (0x1E4D0, 'V'), + (0x1E4FA, 'X'), + (0x1E7E0, 'V'), + (0x1E7E7, 'X'), + (0x1E7E8, 'V'), + (0x1E7EC, 'X'), + (0x1E7ED, 'V'), + (0x1E7EF, 'X'), + (0x1E7F0, 'V'), + (0x1E7FF, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', '𞤢'), + (0x1E901, 'M', '𞤣'), + (0x1E902, 'M', '𞤤'), + (0x1E903, 'M', '𞤥'), + (0x1E904, 'M', '𞤦'), + (0x1E905, 'M', '𞤧'), + (0x1E906, 'M', '𞤨'), + (0x1E907, 'M', '𞤩'), + (0x1E908, 'M', '𞤪'), + (0x1E909, 'M', '𞤫'), + ] + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E90A, 'M', '𞤬'), + (0x1E90B, 'M', '𞤭'), + (0x1E90C, 'M', '𞤮'), + (0x1E90D, 'M', '𞤯'), + (0x1E90E, 'M', '𞤰'), + (0x1E90F, 'M', '𞤱'), + (0x1E910, 'M', '𞤲'), + (0x1E911, 'M', '𞤳'), + (0x1E912, 'M', '𞤴'), + (0x1E913, 'M', '𞤵'), + (0x1E914, 'M', '𞤶'), + (0x1E915, 'M', '𞤷'), + (0x1E916, 'M', '𞤸'), + (0x1E917, 'M', '𞤹'), + (0x1E918, 'M', '𞤺'), + (0x1E919, 'M', '𞤻'), + (0x1E91A, 'M', '𞤼'), + (0x1E91B, 'M', '𞤽'), + (0x1E91C, 'M', '𞤾'), + (0x1E91D, 'M', '𞤿'), + (0x1E91E, 'M', '𞥀'), + (0x1E91F, 'M', '𞥁'), + (0x1E920, 'M', '𞥂'), + (0x1E921, 'M', '𞥃'), + (0x1E922, 'V'), + (0x1E94C, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1ED01, 'V'), + (0x1ED3E, 'X'), + (0x1EE00, 'M', 'ا'), + (0x1EE01, 'M', 'ب'), + (0x1EE02, 'M', 'ج'), + (0x1EE03, 'M', 'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', 'و'), + (0x1EE06, 'M', 'ز'), + (0x1EE07, 'M', 'ح'), + (0x1EE08, 'M', 'ط'), + (0x1EE09, 'M', 'ي'), + (0x1EE0A, 'M', 'ك'), + (0x1EE0B, 'M', 'ل'), + (0x1EE0C, 'M', 'م'), + (0x1EE0D, 'M', 'ن'), + (0x1EE0E, 'M', 'س'), + (0x1EE0F, 'M', 'ع'), + (0x1EE10, 'M', 'ف'), + (0x1EE11, 'M', 'ص'), + (0x1EE12, 'M', 'ق'), + (0x1EE13, 'M', 'ر'), + (0x1EE14, 'M', 'ش'), + (0x1EE15, 'M', 'ت'), + (0x1EE16, 'M', 'ث'), + (0x1EE17, 'M', 'خ'), + (0x1EE18, 'M', 'ذ'), + (0x1EE19, 'M', 'ض'), + (0x1EE1A, 'M', 'ظ'), + (0x1EE1B, 'M', 'غ'), + (0x1EE1C, 'M', 'ٮ'), + (0x1EE1D, 'M', 'ں'), + (0x1EE1E, 'M', 'ڡ'), + (0x1EE1F, 'M', 'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', 'ب'), + (0x1EE22, 'M', 'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', 'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', 'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', 'ي'), + (0x1EE2A, 'M', 'ك'), + (0x1EE2B, 'M', 'ل'), + (0x1EE2C, 'M', 'م'), + (0x1EE2D, 'M', 'ن'), + (0x1EE2E, 'M', 'س'), + (0x1EE2F, 'M', 'ع'), + (0x1EE30, 'M', 'ف'), + (0x1EE31, 'M', 'ص'), + (0x1EE32, 'M', 'ق'), + (0x1EE33, 'X'), + (0x1EE34, 'M', 'ش'), + (0x1EE35, 'M', 'ت'), + (0x1EE36, 'M', 'ث'), + (0x1EE37, 'M', 'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', 'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', 'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', 'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', 'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', 'ي'), + (0x1EE4A, 'X'), + ] + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE4B, 'M', 'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', 'ن'), + (0x1EE4E, 'M', 'س'), + (0x1EE4F, 'M', 'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', 'ص'), + (0x1EE52, 'M', 'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', 'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', 'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', 'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', 'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', 'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', 'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', 'ب'), + (0x1EE62, 'M', 'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', 'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', 'ح'), + (0x1EE68, 'M', 'ط'), + (0x1EE69, 'M', 'ي'), + (0x1EE6A, 'M', 'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', 'م'), + (0x1EE6D, 'M', 'ن'), + (0x1EE6E, 'M', 'س'), + (0x1EE6F, 'M', 'ع'), + (0x1EE70, 'M', 'ف'), + (0x1EE71, 'M', 'ص'), + (0x1EE72, 'M', 'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', 'ش'), + (0x1EE75, 'M', 'ت'), + (0x1EE76, 'M', 'ث'), + (0x1EE77, 'M', 'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', 'ض'), + (0x1EE7A, 'M', 'ظ'), + (0x1EE7B, 'M', 'غ'), + (0x1EE7C, 'M', 'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', 'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', 'ا'), + (0x1EE81, 'M', 'ب'), + (0x1EE82, 'M', 'ج'), + (0x1EE83, 'M', 'د'), + (0x1EE84, 'M', 'ه'), + (0x1EE85, 'M', 'و'), + (0x1EE86, 'M', 'ز'), + (0x1EE87, 'M', 'ح'), + (0x1EE88, 'M', 'ط'), + (0x1EE89, 'M', 'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', 'ل'), + (0x1EE8C, 'M', 'م'), + (0x1EE8D, 'M', 'ن'), + (0x1EE8E, 'M', 'س'), + (0x1EE8F, 'M', 'ع'), + (0x1EE90, 'M', 'ف'), + (0x1EE91, 'M', 'ص'), + (0x1EE92, 'M', 'ق'), + (0x1EE93, 'M', 'ر'), + (0x1EE94, 'M', 'ش'), + (0x1EE95, 'M', 'ت'), + (0x1EE96, 'M', 'ث'), + (0x1EE97, 'M', 'خ'), + (0x1EE98, 'M', 'ذ'), + (0x1EE99, 'M', 'ض'), + (0x1EE9A, 'M', 'ظ'), + (0x1EE9B, 'M', 'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', 'ب'), + (0x1EEA2, 'M', 'ج'), + (0x1EEA3, 'M', 'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', 'و'), + (0x1EEA6, 'M', 'ز'), + (0x1EEA7, 'M', 'ح'), + (0x1EEA8, 'M', 'ط'), + (0x1EEA9, 'M', 'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', 'ل'), + (0x1EEAC, 'M', 'م'), + (0x1EEAD, 'M', 'ن'), + (0x1EEAE, 'M', 'س'), + (0x1EEAF, 'M', 'ع'), + (0x1EEB0, 'M', 'ف'), + (0x1EEB1, 'M', 'ص'), + (0x1EEB2, 'M', 'ق'), + (0x1EEB3, 'M', 'ر'), + (0x1EEB4, 'M', 'ش'), + ] + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EEB5, 'M', 'ت'), + (0x1EEB6, 'M', 'ث'), + (0x1EEB7, 'M', 'خ'), + (0x1EEB8, 'M', 'ذ'), + (0x1EEB9, 'M', 'ض'), + (0x1EEBA, 'M', 'ظ'), + (0x1EEBB, 'M', 'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', '0,'), + (0x1F102, '3', '1,'), + (0x1F103, '3', '2,'), + (0x1F104, '3', '3,'), + (0x1F105, '3', '4,'), + (0x1F106, '3', '5,'), + (0x1F107, '3', '6,'), + (0x1F108, '3', '7,'), + (0x1F109, '3', '8,'), + (0x1F10A, '3', '9,'), + (0x1F10B, 'V'), + (0x1F110, '3', '(a)'), + (0x1F111, '3', '(b)'), + (0x1F112, '3', '(c)'), + (0x1F113, '3', '(d)'), + (0x1F114, '3', '(e)'), + (0x1F115, '3', '(f)'), + (0x1F116, '3', '(g)'), + (0x1F117, '3', '(h)'), + (0x1F118, '3', '(i)'), + (0x1F119, '3', '(j)'), + (0x1F11A, '3', '(k)'), + (0x1F11B, '3', '(l)'), + (0x1F11C, '3', '(m)'), + (0x1F11D, '3', '(n)'), + (0x1F11E, '3', '(o)'), + (0x1F11F, '3', '(p)'), + (0x1F120, '3', '(q)'), + (0x1F121, '3', '(r)'), + (0x1F122, '3', '(s)'), + (0x1F123, '3', '(t)'), + (0x1F124, '3', '(u)'), + (0x1F125, '3', '(v)'), + (0x1F126, '3', '(w)'), + (0x1F127, '3', '(x)'), + (0x1F128, '3', '(y)'), + (0x1F129, '3', '(z)'), + (0x1F12A, 'M', '〔s〕'), + (0x1F12B, 'M', 'c'), + (0x1F12C, 'M', 'r'), + (0x1F12D, 'M', 'cd'), + (0x1F12E, 'M', 'wz'), + (0x1F12F, 'V'), + (0x1F130, 'M', 'a'), + (0x1F131, 'M', 'b'), + (0x1F132, 'M', 'c'), + (0x1F133, 'M', 'd'), + (0x1F134, 'M', 'e'), + (0x1F135, 'M', 'f'), + (0x1F136, 'M', 'g'), + (0x1F137, 'M', 'h'), + (0x1F138, 'M', 'i'), + (0x1F139, 'M', 'j'), + (0x1F13A, 'M', 'k'), + (0x1F13B, 'M', 'l'), + (0x1F13C, 'M', 'm'), + (0x1F13D, 'M', 'n'), + (0x1F13E, 'M', 'o'), + (0x1F13F, 'M', 'p'), + (0x1F140, 'M', 'q'), + (0x1F141, 'M', 'r'), + (0x1F142, 'M', 's'), + (0x1F143, 'M', 't'), + (0x1F144, 'M', 'u'), + (0x1F145, 'M', 'v'), + (0x1F146, 'M', 'w'), + (0x1F147, 'M', 'x'), + (0x1F148, 'M', 'y'), + (0x1F149, 'M', 'z'), + (0x1F14A, 'M', 'hv'), + (0x1F14B, 'M', 'mv'), + (0x1F14C, 'M', 'sd'), + (0x1F14D, 'M', 'ss'), + (0x1F14E, 'M', 'ppv'), + (0x1F14F, 'M', 'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', 'mc'), + (0x1F16B, 'M', 'md'), + ] + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F16C, 'M', 'mr'), + (0x1F16D, 'V'), + (0x1F190, 'M', 'dj'), + (0x1F191, 'V'), + (0x1F1AE, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', 'ほか'), + (0x1F201, 'M', 'ココ'), + (0x1F202, 'M', 'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', '手'), + (0x1F211, 'M', '字'), + (0x1F212, 'M', '双'), + (0x1F213, 'M', 'デ'), + (0x1F214, 'M', '二'), + (0x1F215, 'M', '多'), + (0x1F216, 'M', '解'), + (0x1F217, 'M', '天'), + (0x1F218, 'M', '交'), + (0x1F219, 'M', '映'), + (0x1F21A, 'M', '無'), + (0x1F21B, 'M', '料'), + (0x1F21C, 'M', '前'), + (0x1F21D, 'M', '後'), + (0x1F21E, 'M', '再'), + (0x1F21F, 'M', '新'), + (0x1F220, 'M', '初'), + (0x1F221, 'M', '終'), + (0x1F222, 'M', '生'), + (0x1F223, 'M', '販'), + (0x1F224, 'M', '声'), + (0x1F225, 'M', '吹'), + (0x1F226, 'M', '演'), + (0x1F227, 'M', '投'), + (0x1F228, 'M', '捕'), + (0x1F229, 'M', '一'), + (0x1F22A, 'M', '三'), + (0x1F22B, 'M', '遊'), + (0x1F22C, 'M', '左'), + (0x1F22D, 'M', '中'), + (0x1F22E, 'M', '右'), + (0x1F22F, 'M', '指'), + (0x1F230, 'M', '走'), + (0x1F231, 'M', '打'), + (0x1F232, 'M', '禁'), + (0x1F233, 'M', '空'), + (0x1F234, 'M', '合'), + (0x1F235, 'M', '満'), + (0x1F236, 'M', '有'), + (0x1F237, 'M', '月'), + (0x1F238, 'M', '申'), + (0x1F239, 'M', '割'), + (0x1F23A, 'M', '営'), + (0x1F23B, 'M', '配'), + (0x1F23C, 'X'), + (0x1F240, 'M', '〔本〕'), + (0x1F241, 'M', '〔三〕'), + (0x1F242, 'M', '〔二〕'), + (0x1F243, 'M', '〔安〕'), + (0x1F244, 'M', '〔点〕'), + (0x1F245, 'M', '〔打〕'), + (0x1F246, 'M', '〔盗〕'), + (0x1F247, 'M', '〔勝〕'), + (0x1F248, 'M', '〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', '得'), + (0x1F251, 'M', '可'), + (0x1F252, 'X'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D8, 'X'), + (0x1F6DC, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FD, 'X'), + (0x1F700, 'V'), + (0x1F777, 'X'), + (0x1F77B, 'V'), + (0x1F7DA, 'X'), + (0x1F7E0, 'V'), + (0x1F7EC, 'X'), + (0x1F7F0, 'V'), + (0x1F7F1, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F8B0, 'V'), + (0x1F8B2, 'X'), + (0x1F900, 'V'), + (0x1FA54, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + ] + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FA70, 'V'), + (0x1FA7D, 'X'), + (0x1FA80, 'V'), + (0x1FA89, 'X'), + (0x1FA90, 'V'), + (0x1FABE, 'X'), + (0x1FABF, 'V'), + (0x1FAC6, 'X'), + (0x1FACE, 'V'), + (0x1FADC, 'X'), + (0x1FAE0, 'V'), + (0x1FAE9, 'X'), + (0x1FAF0, 'V'), + (0x1FAF9, 'X'), + (0x1FB00, 'V'), + (0x1FB93, 'X'), + (0x1FB94, 'V'), + (0x1FBCB, 'X'), + (0x1FBF0, 'M', '0'), + (0x1FBF1, 'M', '1'), + (0x1FBF2, 'M', '2'), + (0x1FBF3, 'M', '3'), + (0x1FBF4, 'M', '4'), + (0x1FBF5, 'M', '5'), + (0x1FBF6, 'M', '6'), + (0x1FBF7, 'M', '7'), + (0x1FBF8, 'M', '8'), + (0x1FBF9, 'M', '9'), + (0x1FBFA, 'X'), + (0x20000, 'V'), + (0x2A6E0, 'X'), + (0x2A700, 'V'), + (0x2B73A, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', '丽'), + (0x2F801, 'M', '丸'), + (0x2F802, 'M', '乁'), + (0x2F803, 'M', '𠄢'), + (0x2F804, 'M', '你'), + (0x2F805, 'M', '侮'), + (0x2F806, 'M', '侻'), + (0x2F807, 'M', '倂'), + (0x2F808, 'M', '偺'), + (0x2F809, 'M', '備'), + (0x2F80A, 'M', '僧'), + (0x2F80B, 'M', '像'), + (0x2F80C, 'M', '㒞'), + (0x2F80D, 'M', '𠘺'), + (0x2F80E, 'M', '免'), + (0x2F80F, 'M', '兔'), + (0x2F810, 'M', '兤'), + (0x2F811, 'M', '具'), + (0x2F812, 'M', '𠔜'), + (0x2F813, 'M', '㒹'), + (0x2F814, 'M', '內'), + (0x2F815, 'M', '再'), + (0x2F816, 'M', '𠕋'), + (0x2F817, 'M', '冗'), + (0x2F818, 'M', '冤'), + (0x2F819, 'M', '仌'), + (0x2F81A, 'M', '冬'), + (0x2F81B, 'M', '况'), + (0x2F81C, 'M', '𩇟'), + (0x2F81D, 'M', '凵'), + (0x2F81E, 'M', '刃'), + (0x2F81F, 'M', '㓟'), + (0x2F820, 'M', '刻'), + (0x2F821, 'M', '剆'), + (0x2F822, 'M', '割'), + (0x2F823, 'M', '剷'), + (0x2F824, 'M', '㔕'), + (0x2F825, 'M', '勇'), + (0x2F826, 'M', '勉'), + (0x2F827, 'M', '勤'), + (0x2F828, 'M', '勺'), + (0x2F829, 'M', '包'), + (0x2F82A, 'M', '匆'), + (0x2F82B, 'M', '北'), + (0x2F82C, 'M', '卉'), + (0x2F82D, 'M', '卑'), + (0x2F82E, 'M', '博'), + (0x2F82F, 'M', '即'), + (0x2F830, 'M', '卽'), + (0x2F831, 'M', '卿'), + (0x2F834, 'M', '𠨬'), + (0x2F835, 'M', '灰'), + (0x2F836, 'M', '及'), + (0x2F837, 'M', '叟'), + (0x2F838, 'M', '𠭣'), + (0x2F839, 'M', '叫'), + (0x2F83A, 'M', '叱'), + (0x2F83B, 'M', '吆'), + (0x2F83C, 'M', '咞'), + (0x2F83D, 'M', '吸'), + (0x2F83E, 'M', '呈'), + ] + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F83F, 'M', '周'), + (0x2F840, 'M', '咢'), + (0x2F841, 'M', '哶'), + (0x2F842, 'M', '唐'), + (0x2F843, 'M', '啓'), + (0x2F844, 'M', '啣'), + (0x2F845, 'M', '善'), + (0x2F847, 'M', '喙'), + (0x2F848, 'M', '喫'), + (0x2F849, 'M', '喳'), + (0x2F84A, 'M', '嗂'), + (0x2F84B, 'M', '圖'), + (0x2F84C, 'M', '嘆'), + (0x2F84D, 'M', '圗'), + (0x2F84E, 'M', '噑'), + (0x2F84F, 'M', '噴'), + (0x2F850, 'M', '切'), + (0x2F851, 'M', '壮'), + (0x2F852, 'M', '城'), + (0x2F853, 'M', '埴'), + (0x2F854, 'M', '堍'), + (0x2F855, 'M', '型'), + (0x2F856, 'M', '堲'), + (0x2F857, 'M', '報'), + (0x2F858, 'M', '墬'), + (0x2F859, 'M', '𡓤'), + (0x2F85A, 'M', '売'), + (0x2F85B, 'M', '壷'), + (0x2F85C, 'M', '夆'), + (0x2F85D, 'M', '多'), + (0x2F85E, 'M', '夢'), + (0x2F85F, 'M', '奢'), + (0x2F860, 'M', '𡚨'), + (0x2F861, 'M', '𡛪'), + (0x2F862, 'M', '姬'), + (0x2F863, 'M', '娛'), + (0x2F864, 'M', '娧'), + (0x2F865, 'M', '姘'), + (0x2F866, 'M', '婦'), + (0x2F867, 'M', '㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', '嬈'), + (0x2F86A, 'M', '嬾'), + (0x2F86C, 'M', '𡧈'), + (0x2F86D, 'M', '寃'), + (0x2F86E, 'M', '寘'), + (0x2F86F, 'M', '寧'), + (0x2F870, 'M', '寳'), + (0x2F871, 'M', '𡬘'), + (0x2F872, 'M', '寿'), + (0x2F873, 'M', '将'), + (0x2F874, 'X'), + (0x2F875, 'M', '尢'), + (0x2F876, 'M', '㞁'), + (0x2F877, 'M', '屠'), + (0x2F878, 'M', '屮'), + (0x2F879, 'M', '峀'), + (0x2F87A, 'M', '岍'), + (0x2F87B, 'M', '𡷤'), + (0x2F87C, 'M', '嵃'), + (0x2F87D, 'M', '𡷦'), + (0x2F87E, 'M', '嵮'), + (0x2F87F, 'M', '嵫'), + (0x2F880, 'M', '嵼'), + (0x2F881, 'M', '巡'), + (0x2F882, 'M', '巢'), + (0x2F883, 'M', '㠯'), + (0x2F884, 'M', '巽'), + (0x2F885, 'M', '帨'), + (0x2F886, 'M', '帽'), + (0x2F887, 'M', '幩'), + (0x2F888, 'M', '㡢'), + (0x2F889, 'M', '𢆃'), + (0x2F88A, 'M', '㡼'), + (0x2F88B, 'M', '庰'), + (0x2F88C, 'M', '庳'), + (0x2F88D, 'M', '庶'), + (0x2F88E, 'M', '廊'), + (0x2F88F, 'M', '𪎒'), + (0x2F890, 'M', '廾'), + (0x2F891, 'M', '𢌱'), + (0x2F893, 'M', '舁'), + (0x2F894, 'M', '弢'), + (0x2F896, 'M', '㣇'), + (0x2F897, 'M', '𣊸'), + (0x2F898, 'M', '𦇚'), + (0x2F899, 'M', '形'), + (0x2F89A, 'M', '彫'), + (0x2F89B, 'M', '㣣'), + (0x2F89C, 'M', '徚'), + (0x2F89D, 'M', '忍'), + (0x2F89E, 'M', '志'), + (0x2F89F, 'M', '忹'), + (0x2F8A0, 'M', '悁'), + (0x2F8A1, 'M', '㤺'), + (0x2F8A2, 'M', '㤜'), + (0x2F8A3, 'M', '悔'), + (0x2F8A4, 'M', '𢛔'), + (0x2F8A5, 'M', '惇'), + (0x2F8A6, 'M', '慈'), + ] + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F8A7, 'M', '慌'), + (0x2F8A8, 'M', '慎'), + (0x2F8A9, 'M', '慌'), + (0x2F8AA, 'M', '慺'), + (0x2F8AB, 'M', '憎'), + (0x2F8AC, 'M', '憲'), + (0x2F8AD, 'M', '憤'), + (0x2F8AE, 'M', '憯'), + (0x2F8AF, 'M', '懞'), + (0x2F8B0, 'M', '懲'), + (0x2F8B1, 'M', '懶'), + (0x2F8B2, 'M', '成'), + (0x2F8B3, 'M', '戛'), + (0x2F8B4, 'M', '扝'), + (0x2F8B5, 'M', '抱'), + (0x2F8B6, 'M', '拔'), + (0x2F8B7, 'M', '捐'), + (0x2F8B8, 'M', '𢬌'), + (0x2F8B9, 'M', '挽'), + (0x2F8BA, 'M', '拼'), + (0x2F8BB, 'M', '捨'), + (0x2F8BC, 'M', '掃'), + (0x2F8BD, 'M', '揤'), + (0x2F8BE, 'M', '𢯱'), + (0x2F8BF, 'M', '搢'), + (0x2F8C0, 'M', '揅'), + (0x2F8C1, 'M', '掩'), + (0x2F8C2, 'M', '㨮'), + (0x2F8C3, 'M', '摩'), + (0x2F8C4, 'M', '摾'), + (0x2F8C5, 'M', '撝'), + (0x2F8C6, 'M', '摷'), + (0x2F8C7, 'M', '㩬'), + (0x2F8C8, 'M', '敏'), + (0x2F8C9, 'M', '敬'), + (0x2F8CA, 'M', '𣀊'), + (0x2F8CB, 'M', '旣'), + (0x2F8CC, 'M', '書'), + (0x2F8CD, 'M', '晉'), + (0x2F8CE, 'M', '㬙'), + (0x2F8CF, 'M', '暑'), + (0x2F8D0, 'M', '㬈'), + (0x2F8D1, 'M', '㫤'), + (0x2F8D2, 'M', '冒'), + (0x2F8D3, 'M', '冕'), + (0x2F8D4, 'M', '最'), + (0x2F8D5, 'M', '暜'), + (0x2F8D6, 'M', '肭'), + (0x2F8D7, 'M', '䏙'), + (0x2F8D8, 'M', '朗'), + (0x2F8D9, 'M', '望'), + (0x2F8DA, 'M', '朡'), + (0x2F8DB, 'M', '杞'), + (0x2F8DC, 'M', '杓'), + (0x2F8DD, 'M', '𣏃'), + (0x2F8DE, 'M', '㭉'), + (0x2F8DF, 'M', '柺'), + (0x2F8E0, 'M', '枅'), + (0x2F8E1, 'M', '桒'), + (0x2F8E2, 'M', '梅'), + (0x2F8E3, 'M', '𣑭'), + (0x2F8E4, 'M', '梎'), + (0x2F8E5, 'M', '栟'), + (0x2F8E6, 'M', '椔'), + (0x2F8E7, 'M', '㮝'), + (0x2F8E8, 'M', '楂'), + (0x2F8E9, 'M', '榣'), + (0x2F8EA, 'M', '槪'), + (0x2F8EB, 'M', '檨'), + (0x2F8EC, 'M', '𣚣'), + (0x2F8ED, 'M', '櫛'), + (0x2F8EE, 'M', '㰘'), + (0x2F8EF, 'M', '次'), + (0x2F8F0, 'M', '𣢧'), + (0x2F8F1, 'M', '歔'), + (0x2F8F2, 'M', '㱎'), + (0x2F8F3, 'M', '歲'), + (0x2F8F4, 'M', '殟'), + (0x2F8F5, 'M', '殺'), + (0x2F8F6, 'M', '殻'), + (0x2F8F7, 'M', '𣪍'), + (0x2F8F8, 'M', '𡴋'), + (0x2F8F9, 'M', '𣫺'), + (0x2F8FA, 'M', '汎'), + (0x2F8FB, 'M', '𣲼'), + (0x2F8FC, 'M', '沿'), + (0x2F8FD, 'M', '泍'), + (0x2F8FE, 'M', '汧'), + (0x2F8FF, 'M', '洖'), + (0x2F900, 'M', '派'), + (0x2F901, 'M', '海'), + (0x2F902, 'M', '流'), + (0x2F903, 'M', '浩'), + (0x2F904, 'M', '浸'), + (0x2F905, 'M', '涅'), + (0x2F906, 'M', '𣴞'), + (0x2F907, 'M', '洴'), + (0x2F908, 'M', '港'), + (0x2F909, 'M', '湮'), + (0x2F90A, 'M', '㴳'), + ] + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F90B, 'M', '滋'), + (0x2F90C, 'M', '滇'), + (0x2F90D, 'M', '𣻑'), + (0x2F90E, 'M', '淹'), + (0x2F90F, 'M', '潮'), + (0x2F910, 'M', '𣽞'), + (0x2F911, 'M', '𣾎'), + (0x2F912, 'M', '濆'), + (0x2F913, 'M', '瀹'), + (0x2F914, 'M', '瀞'), + (0x2F915, 'M', '瀛'), + (0x2F916, 'M', '㶖'), + (0x2F917, 'M', '灊'), + (0x2F918, 'M', '災'), + (0x2F919, 'M', '灷'), + (0x2F91A, 'M', '炭'), + (0x2F91B, 'M', '𠔥'), + (0x2F91C, 'M', '煅'), + (0x2F91D, 'M', '𤉣'), + (0x2F91E, 'M', '熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', '爨'), + (0x2F921, 'M', '爵'), + (0x2F922, 'M', '牐'), + (0x2F923, 'M', '𤘈'), + (0x2F924, 'M', '犀'), + (0x2F925, 'M', '犕'), + (0x2F926, 'M', '𤜵'), + (0x2F927, 'M', '𤠔'), + (0x2F928, 'M', '獺'), + (0x2F929, 'M', '王'), + (0x2F92A, 'M', '㺬'), + (0x2F92B, 'M', '玥'), + (0x2F92C, 'M', '㺸'), + (0x2F92E, 'M', '瑇'), + (0x2F92F, 'M', '瑜'), + (0x2F930, 'M', '瑱'), + (0x2F931, 'M', '璅'), + (0x2F932, 'M', '瓊'), + (0x2F933, 'M', '㼛'), + (0x2F934, 'M', '甤'), + (0x2F935, 'M', '𤰶'), + (0x2F936, 'M', '甾'), + (0x2F937, 'M', '𤲒'), + (0x2F938, 'M', '異'), + (0x2F939, 'M', '𢆟'), + (0x2F93A, 'M', '瘐'), + (0x2F93B, 'M', '𤾡'), + (0x2F93C, 'M', '𤾸'), + (0x2F93D, 'M', '𥁄'), + (0x2F93E, 'M', '㿼'), + (0x2F93F, 'M', '䀈'), + (0x2F940, 'M', '直'), + (0x2F941, 'M', '𥃳'), + (0x2F942, 'M', '𥃲'), + (0x2F943, 'M', '𥄙'), + (0x2F944, 'M', '𥄳'), + (0x2F945, 'M', '眞'), + (0x2F946, 'M', '真'), + (0x2F948, 'M', '睊'), + (0x2F949, 'M', '䀹'), + (0x2F94A, 'M', '瞋'), + (0x2F94B, 'M', '䁆'), + (0x2F94C, 'M', '䂖'), + (0x2F94D, 'M', '𥐝'), + (0x2F94E, 'M', '硎'), + (0x2F94F, 'M', '碌'), + (0x2F950, 'M', '磌'), + (0x2F951, 'M', '䃣'), + (0x2F952, 'M', '𥘦'), + (0x2F953, 'M', '祖'), + (0x2F954, 'M', '𥚚'), + (0x2F955, 'M', '𥛅'), + (0x2F956, 'M', '福'), + (0x2F957, 'M', '秫'), + (0x2F958, 'M', '䄯'), + (0x2F959, 'M', '穀'), + (0x2F95A, 'M', '穊'), + (0x2F95B, 'M', '穏'), + (0x2F95C, 'M', '𥥼'), + (0x2F95D, 'M', '𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', '䈂'), + (0x2F961, 'M', '𥮫'), + (0x2F962, 'M', '篆'), + (0x2F963, 'M', '築'), + (0x2F964, 'M', '䈧'), + (0x2F965, 'M', '𥲀'), + (0x2F966, 'M', '糒'), + (0x2F967, 'M', '䊠'), + (0x2F968, 'M', '糨'), + (0x2F969, 'M', '糣'), + (0x2F96A, 'M', '紀'), + (0x2F96B, 'M', '𥾆'), + (0x2F96C, 'M', '絣'), + (0x2F96D, 'M', '䌁'), + (0x2F96E, 'M', '緇'), + (0x2F96F, 'M', '縂'), + (0x2F970, 'M', '繅'), + (0x2F971, 'M', '䌴'), + ] + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F972, 'M', '𦈨'), + (0x2F973, 'M', '𦉇'), + (0x2F974, 'M', '䍙'), + (0x2F975, 'M', '𦋙'), + (0x2F976, 'M', '罺'), + (0x2F977, 'M', '𦌾'), + (0x2F978, 'M', '羕'), + (0x2F979, 'M', '翺'), + (0x2F97A, 'M', '者'), + (0x2F97B, 'M', '𦓚'), + (0x2F97C, 'M', '𦔣'), + (0x2F97D, 'M', '聠'), + (0x2F97E, 'M', '𦖨'), + (0x2F97F, 'M', '聰'), + (0x2F980, 'M', '𣍟'), + (0x2F981, 'M', '䏕'), + (0x2F982, 'M', '育'), + (0x2F983, 'M', '脃'), + (0x2F984, 'M', '䐋'), + (0x2F985, 'M', '脾'), + (0x2F986, 'M', '媵'), + (0x2F987, 'M', '𦞧'), + (0x2F988, 'M', '𦞵'), + (0x2F989, 'M', '𣎓'), + (0x2F98A, 'M', '𣎜'), + (0x2F98B, 'M', '舁'), + (0x2F98C, 'M', '舄'), + (0x2F98D, 'M', '辞'), + (0x2F98E, 'M', '䑫'), + (0x2F98F, 'M', '芑'), + (0x2F990, 'M', '芋'), + (0x2F991, 'M', '芝'), + (0x2F992, 'M', '劳'), + (0x2F993, 'M', '花'), + (0x2F994, 'M', '芳'), + (0x2F995, 'M', '芽'), + (0x2F996, 'M', '苦'), + (0x2F997, 'M', '𦬼'), + (0x2F998, 'M', '若'), + (0x2F999, 'M', '茝'), + (0x2F99A, 'M', '荣'), + (0x2F99B, 'M', '莭'), + (0x2F99C, 'M', '茣'), + (0x2F99D, 'M', '莽'), + (0x2F99E, 'M', '菧'), + (0x2F99F, 'M', '著'), + (0x2F9A0, 'M', '荓'), + (0x2F9A1, 'M', '菊'), + (0x2F9A2, 'M', '菌'), + (0x2F9A3, 'M', '菜'), + (0x2F9A4, 'M', '𦰶'), + (0x2F9A5, 'M', '𦵫'), + (0x2F9A6, 'M', '𦳕'), + (0x2F9A7, 'M', '䔫'), + (0x2F9A8, 'M', '蓱'), + (0x2F9A9, 'M', '蓳'), + (0x2F9AA, 'M', '蔖'), + (0x2F9AB, 'M', '𧏊'), + (0x2F9AC, 'M', '蕤'), + (0x2F9AD, 'M', '𦼬'), + (0x2F9AE, 'M', '䕝'), + (0x2F9AF, 'M', '䕡'), + (0x2F9B0, 'M', '𦾱'), + (0x2F9B1, 'M', '𧃒'), + (0x2F9B2, 'M', '䕫'), + (0x2F9B3, 'M', '虐'), + (0x2F9B4, 'M', '虜'), + (0x2F9B5, 'M', '虧'), + (0x2F9B6, 'M', '虩'), + (0x2F9B7, 'M', '蚩'), + (0x2F9B8, 'M', '蚈'), + (0x2F9B9, 'M', '蜎'), + (0x2F9BA, 'M', '蛢'), + (0x2F9BB, 'M', '蝹'), + (0x2F9BC, 'M', '蜨'), + (0x2F9BD, 'M', '蝫'), + (0x2F9BE, 'M', '螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', '蟡'), + (0x2F9C1, 'M', '蠁'), + (0x2F9C2, 'M', '䗹'), + (0x2F9C3, 'M', '衠'), + (0x2F9C4, 'M', '衣'), + (0x2F9C5, 'M', '𧙧'), + (0x2F9C6, 'M', '裗'), + (0x2F9C7, 'M', '裞'), + (0x2F9C8, 'M', '䘵'), + (0x2F9C9, 'M', '裺'), + (0x2F9CA, 'M', '㒻'), + (0x2F9CB, 'M', '𧢮'), + (0x2F9CC, 'M', '𧥦'), + (0x2F9CD, 'M', '䚾'), + (0x2F9CE, 'M', '䛇'), + (0x2F9CF, 'M', '誠'), + (0x2F9D0, 'M', '諭'), + (0x2F9D1, 'M', '變'), + (0x2F9D2, 'M', '豕'), + (0x2F9D3, 'M', '𧲨'), + (0x2F9D4, 'M', '貫'), + (0x2F9D5, 'M', '賁'), + ] + +def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F9D6, 'M', '贛'), + (0x2F9D7, 'M', '起'), + (0x2F9D8, 'M', '𧼯'), + (0x2F9D9, 'M', '𠠄'), + (0x2F9DA, 'M', '跋'), + (0x2F9DB, 'M', '趼'), + (0x2F9DC, 'M', '跰'), + (0x2F9DD, 'M', '𠣞'), + (0x2F9DE, 'M', '軔'), + (0x2F9DF, 'M', '輸'), + (0x2F9E0, 'M', '𨗒'), + (0x2F9E1, 'M', '𨗭'), + (0x2F9E2, 'M', '邔'), + (0x2F9E3, 'M', '郱'), + (0x2F9E4, 'M', '鄑'), + (0x2F9E5, 'M', '𨜮'), + (0x2F9E6, 'M', '鄛'), + (0x2F9E7, 'M', '鈸'), + (0x2F9E8, 'M', '鋗'), + (0x2F9E9, 'M', '鋘'), + (0x2F9EA, 'M', '鉼'), + (0x2F9EB, 'M', '鏹'), + (0x2F9EC, 'M', '鐕'), + (0x2F9ED, 'M', '𨯺'), + (0x2F9EE, 'M', '開'), + (0x2F9EF, 'M', '䦕'), + (0x2F9F0, 'M', '閷'), + (0x2F9F1, 'M', '𨵷'), + (0x2F9F2, 'M', '䧦'), + (0x2F9F3, 'M', '雃'), + (0x2F9F4, 'M', '嶲'), + (0x2F9F5, 'M', '霣'), + (0x2F9F6, 'M', '𩅅'), + (0x2F9F7, 'M', '𩈚'), + (0x2F9F8, 'M', '䩮'), + (0x2F9F9, 'M', '䩶'), + (0x2F9FA, 'M', '韠'), + (0x2F9FB, 'M', '𩐊'), + (0x2F9FC, 'M', '䪲'), + (0x2F9FD, 'M', '𩒖'), + (0x2F9FE, 'M', '頋'), + (0x2FA00, 'M', '頩'), + (0x2FA01, 'M', '𩖶'), + (0x2FA02, 'M', '飢'), + (0x2FA03, 'M', '䬳'), + (0x2FA04, 'M', '餩'), + (0x2FA05, 'M', '馧'), + (0x2FA06, 'M', '駂'), + (0x2FA07, 'M', '駾'), + (0x2FA08, 'M', '䯎'), + (0x2FA09, 'M', '𩬰'), + (0x2FA0A, 'M', '鬒'), + (0x2FA0B, 'M', '鱀'), + (0x2FA0C, 'M', '鳽'), + (0x2FA0D, 'M', '䳎'), + (0x2FA0E, 'M', '䳭'), + (0x2FA0F, 'M', '鵧'), + (0x2FA10, 'M', '𪃎'), + (0x2FA11, 'M', '䳸'), + (0x2FA12, 'M', '𪄅'), + (0x2FA13, 'M', '𪈎'), + (0x2FA14, 'M', '𪊑'), + (0x2FA15, 'M', '麻'), + (0x2FA16, 'M', '䵖'), + (0x2FA17, 'M', '黹'), + (0x2FA18, 'M', '黾'), + (0x2FA19, 'M', '鼅'), + (0x2FA1A, 'M', '鼏'), + (0x2FA1B, 'M', '鼖'), + (0x2FA1C, 'M', '鼻'), + (0x2FA1D, 'M', '𪘀'), + (0x2FA1E, 'X'), + (0x30000, 'V'), + (0x3134B, 'X'), + (0x31350, 'V'), + (0x323B0, 'X'), + (0xE0100, 'I'), + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() + + _seg_79() + + _seg_80() + + _seg_81() +) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py new file mode 100644 index 0000000..1300b86 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py @@ -0,0 +1,57 @@ +# coding: utf-8 +from .exceptions import * +from .ext import ExtType, Timestamp + +import os +import sys + + +version = (1, 0, 5) +__version__ = "1.0.5" + + +if os.environ.get("MSGPACK_PUREPYTHON") or sys.version_info[0] == 2: + from .fallback import Packer, unpackb, Unpacker +else: + try: + from ._cmsgpack import Packer, unpackb, Unpacker + except ImportError: + from .fallback import Packer, unpackb, Unpacker + + +def pack(o, stream, **kwargs): + """ + Pack object `o` and write it to `stream` + + See :class:`Packer` for options. + """ + packer = Packer(**kwargs) + stream.write(packer.pack(o)) + + +def packb(o, **kwargs): + """ + Pack object `o` and return packed bytes + + See :class:`Packer` for options. + """ + return Packer(**kwargs).pack(o) + + +def unpack(stream, **kwargs): + """ + Unpack an object from `stream`. + + Raises `ExtraData` when `stream` contains extra bytes. + See :class:`Unpacker` for options. + """ + data = stream.read() + return unpackb(data, **kwargs) + + +# alias for compatibility to simplejson/marshal/pickle. +load = unpack +loads = unpackb + +dump = pack +dumps = packb diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58503c64d1365fe1dd730222801a180d71907850 GIT binary patch literal 1850 zcmb7EO>7%Q6rR~1+ws~?QrI@-$3)Fi0!@@aq|hXQC~as`AbYXb-buR7{+OA~ zkE2v_B%}&aK@f-Z$bkc>;?9wB$aYg0p$%js8@uQ`2@6khu_u|5Cz~?NWm|C-Q;9~^ zRBhEv*a9q&dg!tYi%O3Hn;upbvykrGCOPyFmGo7J4vV6MY85W(qSGVdGl~x=|SYcNkp?z zZvVP@23_k}Ld)_DTEd0wmWZ@~IexJq@#Oe&I9;z1-Zt%cgoTz@+Y(`)FUVAaktP7P zRDc!rbl*#Tuk!r6Q*Ta=o_(h{dFkT#eggRq1Q|8NMQ~;;P&_us^QKRdMTWxFD~5 znAX8WRC-XZl1iwTf|73ew!TE2kmydRhk;&VAtjbqN=Lh=2+@ZsuEp3;DbA;)&jwTv zYM~SOtS{Ph{#(eG3h8k*x{50z2&Y}D%E<-qUnJN>f3Ac0fj zW^0Zxqvq6%;v(_wfEpf~6YEB?==e@pEcVsvROmQ@L*TGy0UGGf49ayiv&YtF0U8tc zl=RheYv=o|}Odcy9hT>sSyeAfJuS8R*Agz4x zpM{|$T%f)lQD*DqdPvy+s0+}dcsU2OP0Jy8^O-=u*_lF%1_jhY_Zipl_))W`$NsU%CwXX^B{`1b%2aKGTWV z5i=Nz_EBZG8uJO-hQERW{a{nkqoDFU3=w}^vEh46qyZ|9X-veePM;Ec;bG4JG|+Yq zW%8d7e=_{(>y5GBwEX%jP3^?>GXS@g6A_bzZk{H~6%uz9mqoOqL8uTImjcFRR%bl9 z2rUAA$F(BJJ93Lfo`imID6GnJB;=Xa3&)=gcxu*i-7*w67J*2DX2hLs#md9Z;M&_> zEui5zr2&mwL+Bt%f-7!d*<2OKAmatE##MnV(pD6El=_3zYhGY4xMYN$g2STpY#m@* z#u)#Bj%=cy`>5?#l-^Dtt*eo|mpj>pWMl(aL;x(O63~Ly;OTc{XMA( sFT1AxwS57j%;6n`#j$}qsR4*Y9elt<{cd)qM-6n-XnzCCKOzkHH-z}UCjbBd literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c6984ea08d28a52c5b243a0a193249dd430bb27 GIT binary patch literal 2044 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49076ca894e4145c2515cd1f176eeb3c3ecd01e4 GIT binary patch literal 43595 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 b{wzpG`9Cht*ze{3#B15V&G08%b+G?GsPxy@ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 0000000..d6d2615 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py @@ -0,0 +1,48 @@ +class UnpackException(Exception): + """Base class for some exceptions raised while unpacking. + + NOTE: unpack may raise exception other than subclass of + UnpackException. If you want to catch all error, catch + Exception instead. + """ + + +class BufferFull(UnpackException): + pass + + +class OutOfData(UnpackException): + pass + + +class FormatError(ValueError, UnpackException): + """Invalid msgpack format""" + + +class StackError(ValueError, UnpackException): + """Too nested""" + + +# Deprecated. Use ValueError instead +UnpackValueError = ValueError + + +class ExtraData(UnpackValueError): + """ExtraData is raised when there is trailing data. + + This exception is raised while only one-shot (not streaming) + unpack. + """ + + def __init__(self, unpacked, extra): + self.unpacked = unpacked + self.extra = extra + + def __str__(self): + return "unpack(b) received extra data." + + +# Deprecated. Use Exception instead to catch all exception during packing. +PackException = Exception +PackValueError = ValueError +PackOverflowError = OverflowError diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py new file mode 100644 index 0000000..23e0d6b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py @@ -0,0 +1,193 @@ +# coding: utf-8 +from collections import namedtuple +import datetime +import sys +import struct + + +PY2 = sys.version_info[0] == 2 + +if PY2: + int_types = (int, long) + _utc = None +else: + int_types = int + try: + _utc = datetime.timezone.utc + except AttributeError: + _utc = datetime.timezone(datetime.timedelta(0)) + + +class ExtType(namedtuple("ExtType", "code data")): + """ExtType represents ext type in msgpack.""" + + def __new__(cls, code, data): + if not isinstance(code, int): + raise TypeError("code must be int") + if not isinstance(data, bytes): + raise TypeError("data must be bytes") + if not 0 <= code <= 127: + raise ValueError("code must be 0~127") + return super(ExtType, cls).__new__(cls, code, data) + + +class Timestamp(object): + """Timestamp represents the Timestamp extension type in msgpack. + + When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`. When using pure-Python + msgpack, :func:`to_bytes` and :func:`from_bytes` are used to pack and unpack `Timestamp`. + + This class is immutable: Do not override seconds and nanoseconds. + """ + + __slots__ = ["seconds", "nanoseconds"] + + def __init__(self, seconds, nanoseconds=0): + """Initialize a Timestamp object. + + :param int seconds: + Number of seconds since the UNIX epoch (00:00:00 UTC Jan 1 1970, minus leap seconds). + May be negative. + + :param int nanoseconds: + Number of nanoseconds to add to `seconds` to get fractional time. + Maximum is 999_999_999. Default is 0. + + Note: Negative times (before the UNIX epoch) are represented as negative seconds + positive ns. + """ + if not isinstance(seconds, int_types): + raise TypeError("seconds must be an integer") + if not isinstance(nanoseconds, int_types): + raise TypeError("nanoseconds must be an integer") + if not (0 <= nanoseconds < 10**9): + raise ValueError( + "nanoseconds must be a non-negative integer less than 999999999." + ) + self.seconds = seconds + self.nanoseconds = nanoseconds + + def __repr__(self): + """String representation of Timestamp.""" + return "Timestamp(seconds={0}, nanoseconds={1})".format( + self.seconds, self.nanoseconds + ) + + def __eq__(self, other): + """Check for equality with another Timestamp object""" + if type(other) is self.__class__: + return ( + self.seconds == other.seconds and self.nanoseconds == other.nanoseconds + ) + return False + + def __ne__(self, other): + """not-equals method (see :func:`__eq__()`)""" + return not self.__eq__(other) + + def __hash__(self): + return hash((self.seconds, self.nanoseconds)) + + @staticmethod + def from_bytes(b): + """Unpack bytes into a `Timestamp` object. + + Used for pure-Python msgpack unpacking. + + :param b: Payload from msgpack ext message with code -1 + :type b: bytes + + :returns: Timestamp object unpacked from msgpack ext payload + :rtype: Timestamp + """ + if len(b) == 4: + seconds = struct.unpack("!L", b)[0] + nanoseconds = 0 + elif len(b) == 8: + data64 = struct.unpack("!Q", b)[0] + seconds = data64 & 0x00000003FFFFFFFF + nanoseconds = data64 >> 34 + elif len(b) == 12: + nanoseconds, seconds = struct.unpack("!Iq", b) + else: + raise ValueError( + "Timestamp type can only be created from 32, 64, or 96-bit byte objects" + ) + return Timestamp(seconds, nanoseconds) + + def to_bytes(self): + """Pack this Timestamp object into bytes. + + Used for pure-Python msgpack packing. + + :returns data: Payload for EXT message with code -1 (timestamp type) + :rtype: bytes + """ + if (self.seconds >> 34) == 0: # seconds is non-negative and fits in 34 bits + data64 = self.nanoseconds << 34 | self.seconds + if data64 & 0xFFFFFFFF00000000 == 0: + # nanoseconds is zero and seconds < 2**32, so timestamp 32 + data = struct.pack("!L", data64) + else: + # timestamp 64 + data = struct.pack("!Q", data64) + else: + # timestamp 96 + data = struct.pack("!Iq", self.nanoseconds, self.seconds) + return data + + @staticmethod + def from_unix(unix_sec): + """Create a Timestamp from posix timestamp in seconds. + + :param unix_float: Posix timestamp in seconds. + :type unix_float: int or float. + """ + seconds = int(unix_sec // 1) + nanoseconds = int((unix_sec % 1) * 10**9) + return Timestamp(seconds, nanoseconds) + + def to_unix(self): + """Get the timestamp as a floating-point value. + + :returns: posix timestamp + :rtype: float + """ + return self.seconds + self.nanoseconds / 1e9 + + @staticmethod + def from_unix_nano(unix_ns): + """Create a Timestamp from posix timestamp in nanoseconds. + + :param int unix_ns: Posix timestamp in nanoseconds. + :rtype: Timestamp + """ + return Timestamp(*divmod(unix_ns, 10**9)) + + def to_unix_nano(self): + """Get the timestamp as a unixtime in nanoseconds. + + :returns: posix timestamp in nanoseconds + :rtype: int + """ + return self.seconds * 10**9 + self.nanoseconds + + def to_datetime(self): + """Get the timestamp as a UTC datetime. + + Python 2 is not supported. + + :rtype: datetime. + """ + return datetime.datetime.fromtimestamp(0, _utc) + datetime.timedelta( + seconds=self.to_unix() + ) + + @staticmethod + def from_datetime(dt): + """Create a Timestamp from datetime with tzinfo. + + Python 2 is not supported. + + :rtype: Timestamp + """ + return Timestamp.from_unix(dt.timestamp()) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py new file mode 100644 index 0000000..e8cebc1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py @@ -0,0 +1,1010 @@ +"""Fallback pure Python implementation of msgpack""" +from datetime import datetime as _DateTime +import sys +import struct + + +PY2 = sys.version_info[0] == 2 +if PY2: + int_types = (int, long) + + def dict_iteritems(d): + return d.iteritems() + +else: + int_types = int + unicode = str + xrange = range + + def dict_iteritems(d): + return d.items() + + +if sys.version_info < (3, 5): + # Ugly hack... + RecursionError = RuntimeError + + def _is_recursionerror(e): + return ( + len(e.args) == 1 + and isinstance(e.args[0], str) + and e.args[0].startswith("maximum recursion depth exceeded") + ) + +else: + + def _is_recursionerror(e): + return True + + +if hasattr(sys, "pypy_version_info"): + # StringIO is slow on PyPy, StringIO is faster. However: PyPy's own + # StringBuilder is fastest. + from __pypy__ import newlist_hint + + try: + from __pypy__.builders import BytesBuilder as StringBuilder + except ImportError: + from __pypy__.builders import StringBuilder + USING_STRINGBUILDER = True + + class StringIO(object): + def __init__(self, s=b""): + if s: + self.builder = StringBuilder(len(s)) + self.builder.append(s) + else: + self.builder = StringBuilder() + + def write(self, s): + if isinstance(s, memoryview): + s = s.tobytes() + elif isinstance(s, bytearray): + s = bytes(s) + self.builder.append(s) + + def getvalue(self): + return self.builder.build() + +else: + USING_STRINGBUILDER = False + from io import BytesIO as StringIO + + newlist_hint = lambda size: [] + + +from .exceptions import BufferFull, OutOfData, ExtraData, FormatError, StackError + +from .ext import ExtType, Timestamp + + +EX_SKIP = 0 +EX_CONSTRUCT = 1 +EX_READ_ARRAY_HEADER = 2 +EX_READ_MAP_HEADER = 3 + +TYPE_IMMEDIATE = 0 +TYPE_ARRAY = 1 +TYPE_MAP = 2 +TYPE_RAW = 3 +TYPE_BIN = 4 +TYPE_EXT = 5 + +DEFAULT_RECURSE_LIMIT = 511 + + +def _check_type_strict(obj, t, type=type, tuple=tuple): + if type(t) is tuple: + return type(obj) in t + else: + return type(obj) is t + + +def _get_data_from_buffer(obj): + view = memoryview(obj) + if view.itemsize != 1: + raise ValueError("cannot unpack from multi-byte object") + return view + + +def unpackb(packed, **kwargs): + """ + Unpack an object from `packed`. + + Raises ``ExtraData`` when *packed* contains extra bytes. + Raises ``ValueError`` when *packed* is incomplete. + Raises ``FormatError`` when *packed* is not valid msgpack. + Raises ``StackError`` when *packed* contains too nested. + Other exceptions can be raised during unpacking. + + See :class:`Unpacker` for options. + """ + unpacker = Unpacker(None, max_buffer_size=len(packed), **kwargs) + unpacker.feed(packed) + try: + ret = unpacker._unpack() + except OutOfData: + raise ValueError("Unpack failed: incomplete input") + except RecursionError as e: + if _is_recursionerror(e): + raise StackError + raise + if unpacker._got_extradata(): + raise ExtraData(ret, unpacker._get_extradata()) + return ret + + +if sys.version_info < (2, 7, 6): + + def _unpack_from(f, b, o=0): + """Explicit type cast for legacy struct.unpack_from""" + return struct.unpack_from(f, bytes(b), o) + +else: + _unpack_from = struct.unpack_from + +_NO_FORMAT_USED = "" +_MSGPACK_HEADERS = { + 0xC4: (1, _NO_FORMAT_USED, TYPE_BIN), + 0xC5: (2, ">H", TYPE_BIN), + 0xC6: (4, ">I", TYPE_BIN), + 0xC7: (2, "Bb", TYPE_EXT), + 0xC8: (3, ">Hb", TYPE_EXT), + 0xC9: (5, ">Ib", TYPE_EXT), + 0xCA: (4, ">f"), + 0xCB: (8, ">d"), + 0xCC: (1, _NO_FORMAT_USED), + 0xCD: (2, ">H"), + 0xCE: (4, ">I"), + 0xCF: (8, ">Q"), + 0xD0: (1, "b"), + 0xD1: (2, ">h"), + 0xD2: (4, ">i"), + 0xD3: (8, ">q"), + 0xD4: (1, "b1s", TYPE_EXT), + 0xD5: (2, "b2s", TYPE_EXT), + 0xD6: (4, "b4s", TYPE_EXT), + 0xD7: (8, "b8s", TYPE_EXT), + 0xD8: (16, "b16s", TYPE_EXT), + 0xD9: (1, _NO_FORMAT_USED, TYPE_RAW), + 0xDA: (2, ">H", TYPE_RAW), + 0xDB: (4, ">I", TYPE_RAW), + 0xDC: (2, ">H", TYPE_ARRAY), + 0xDD: (4, ">I", TYPE_ARRAY), + 0xDE: (2, ">H", TYPE_MAP), + 0xDF: (4, ">I", TYPE_MAP), +} + + +class Unpacker(object): + """Streaming unpacker. + + Arguments: + + :param file_like: + File-like object having `.read(n)` method. + If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. + + :param int read_size: + Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) + + :param bool use_list: + If true, unpack msgpack array to Python list. + Otherwise, unpack to Python tuple. (default: True) + + :param bool raw: + If true, unpack msgpack raw to Python bytes. + Otherwise, unpack to Python str by decoding with UTF-8 encoding (default). + + :param int timestamp: + Control how timestamp type is unpacked: + + 0 - Timestamp + 1 - float (Seconds from the EPOCH) + 2 - int (Nanoseconds from the EPOCH) + 3 - datetime.datetime (UTC). Python 2 is not supported. + + :param bool strict_map_key: + If true (default), only str or bytes are accepted for map (dict) keys. + + :param callable object_hook: + When specified, it should be callable. + Unpacker calls it with a dict argument after unpacking msgpack map. + (See also simplejson) + + :param callable object_pairs_hook: + When specified, it should be callable. + Unpacker calls it with a list of key-value pairs after unpacking msgpack map. + (See also simplejson) + + :param str unicode_errors: + The error handler for decoding unicode. (default: 'strict') + This option should be used only when you have msgpack data which + contains invalid UTF-8 string. + + :param int max_buffer_size: + Limits size of data waiting unpacked. 0 means 2**32-1. + The default value is 100*1024*1024 (100MiB). + Raises `BufferFull` exception when it is insufficient. + You should set this parameter when unpacking data from untrusted source. + + :param int max_str_len: + Deprecated, use *max_buffer_size* instead. + Limits max length of str. (default: max_buffer_size) + + :param int max_bin_len: + Deprecated, use *max_buffer_size* instead. + Limits max length of bin. (default: max_buffer_size) + + :param int max_array_len: + Limits max length of array. + (default: max_buffer_size) + + :param int max_map_len: + Limits max length of map. + (default: max_buffer_size//2) + + :param int max_ext_len: + Deprecated, use *max_buffer_size* instead. + Limits max size of ext type. (default: max_buffer_size) + + Example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like) + for o in unpacker: + process(o) + + Example of streaming deserialize from socket:: + + unpacker = Unpacker() + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + + Raises ``ExtraData`` when *packed* contains extra bytes. + Raises ``OutOfData`` when *packed* is incomplete. + Raises ``FormatError`` when *packed* is not valid msgpack. + Raises ``StackError`` when *packed* contains too nested. + Other exceptions can be raised during unpacking. + """ + + def __init__( + self, + file_like=None, + read_size=0, + use_list=True, + raw=False, + timestamp=0, + strict_map_key=True, + object_hook=None, + object_pairs_hook=None, + list_hook=None, + unicode_errors=None, + max_buffer_size=100 * 1024 * 1024, + ext_hook=ExtType, + max_str_len=-1, + max_bin_len=-1, + max_array_len=-1, + max_map_len=-1, + max_ext_len=-1, + ): + if unicode_errors is None: + unicode_errors = "strict" + + if file_like is None: + self._feeding = True + else: + if not callable(file_like.read): + raise TypeError("`file_like.read` must be callable") + self.file_like = file_like + self._feeding = False + + #: array of bytes fed. + self._buffer = bytearray() + #: Which position we currently reads + self._buff_i = 0 + + # When Unpacker is used as an iterable, between the calls to next(), + # the buffer is not "consumed" completely, for efficiency sake. + # Instead, it is done sloppily. To make sure we raise BufferFull at + # the correct moments, we have to keep track of how sloppy we were. + # Furthermore, when the buffer is incomplete (that is: in the case + # we raise an OutOfData) we need to rollback the buffer to the correct + # state, which _buf_checkpoint records. + self._buf_checkpoint = 0 + + if not max_buffer_size: + max_buffer_size = 2**31 - 1 + if max_str_len == -1: + max_str_len = max_buffer_size + if max_bin_len == -1: + max_bin_len = max_buffer_size + if max_array_len == -1: + max_array_len = max_buffer_size + if max_map_len == -1: + max_map_len = max_buffer_size // 2 + if max_ext_len == -1: + max_ext_len = max_buffer_size + + self._max_buffer_size = max_buffer_size + if read_size > self._max_buffer_size: + raise ValueError("read_size must be smaller than max_buffer_size") + self._read_size = read_size or min(self._max_buffer_size, 16 * 1024) + self._raw = bool(raw) + self._strict_map_key = bool(strict_map_key) + self._unicode_errors = unicode_errors + self._use_list = use_list + if not (0 <= timestamp <= 3): + raise ValueError("timestamp must be 0..3") + self._timestamp = timestamp + self._list_hook = list_hook + self._object_hook = object_hook + self._object_pairs_hook = object_pairs_hook + self._ext_hook = ext_hook + self._max_str_len = max_str_len + self._max_bin_len = max_bin_len + self._max_array_len = max_array_len + self._max_map_len = max_map_len + self._max_ext_len = max_ext_len + self._stream_offset = 0 + + if list_hook is not None and not callable(list_hook): + raise TypeError("`list_hook` is not callable") + if object_hook is not None and not callable(object_hook): + raise TypeError("`object_hook` is not callable") + if object_pairs_hook is not None and not callable(object_pairs_hook): + raise TypeError("`object_pairs_hook` is not callable") + if object_hook is not None and object_pairs_hook is not None: + raise TypeError( + "object_pairs_hook and object_hook are mutually " "exclusive" + ) + if not callable(ext_hook): + raise TypeError("`ext_hook` is not callable") + + def feed(self, next_bytes): + assert self._feeding + view = _get_data_from_buffer(next_bytes) + if len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size: + raise BufferFull + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[: self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython + self._buffer.extend(view) + + def _consume(self): + """Gets rid of the used parts of the buffer.""" + self._stream_offset += self._buff_i - self._buf_checkpoint + self._buf_checkpoint = self._buff_i + + def _got_extradata(self): + return self._buff_i < len(self._buffer) + + def _get_extradata(self): + return self._buffer[self._buff_i :] + + def read_bytes(self, n): + ret = self._read(n, raise_outofdata=False) + self._consume() + return ret + + def _read(self, n, raise_outofdata=True): + # (int) -> bytearray + self._reserve(n, raise_outofdata=raise_outofdata) + i = self._buff_i + ret = self._buffer[i : i + n] + self._buff_i = i + len(ret) + return ret + + def _reserve(self, n, raise_outofdata=True): + remain_bytes = len(self._buffer) - self._buff_i - n + + # Fast path: buffer has n bytes already + if remain_bytes >= 0: + return + + if self._feeding: + self._buff_i = self._buf_checkpoint + raise OutOfData + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[: self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Read from file + remain_bytes = -remain_bytes + if remain_bytes + len(self._buffer) > self._max_buffer_size: + raise BufferFull + while remain_bytes > 0: + to_read_bytes = max(self._read_size, remain_bytes) + read_data = self.file_like.read(to_read_bytes) + if not read_data: + break + assert isinstance(read_data, bytes) + self._buffer += read_data + remain_bytes -= len(read_data) + + if len(self._buffer) < n + self._buff_i and raise_outofdata: + self._buff_i = 0 # rollback + raise OutOfData + + def _read_header(self): + typ = TYPE_IMMEDIATE + n = 0 + obj = None + self._reserve(1) + b = self._buffer[self._buff_i] + self._buff_i += 1 + if b & 0b10000000 == 0: + obj = b + elif b & 0b11100000 == 0b11100000: + obj = -1 - (b ^ 0xFF) + elif b & 0b11100000 == 0b10100000: + n = b & 0b00011111 + typ = TYPE_RAW + if n > self._max_str_len: + raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len)) + obj = self._read(n) + elif b & 0b11110000 == 0b10010000: + n = b & 0b00001111 + typ = TYPE_ARRAY + if n > self._max_array_len: + raise ValueError( + "%s exceeds max_array_len(%s)" % (n, self._max_array_len) + ) + elif b & 0b11110000 == 0b10000000: + n = b & 0b00001111 + typ = TYPE_MAP + if n > self._max_map_len: + raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len)) + elif b == 0xC0: + obj = None + elif b == 0xC2: + obj = False + elif b == 0xC3: + obj = True + elif 0xC4 <= b <= 0xC6: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + if len(fmt) > 0: + n = _unpack_from(fmt, self._buffer, self._buff_i)[0] + else: + n = self._buffer[self._buff_i] + self._buff_i += size + if n > self._max_bin_len: + raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif 0xC7 <= b <= 0xC9: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + L, n = _unpack_from(fmt, self._buffer, self._buff_i) + self._buff_i += size + if L > self._max_ext_len: + raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif 0xCA <= b <= 0xD3: + size, fmt = _MSGPACK_HEADERS[b] + self._reserve(size) + if len(fmt) > 0: + obj = _unpack_from(fmt, self._buffer, self._buff_i)[0] + else: + obj = self._buffer[self._buff_i] + self._buff_i += size + elif 0xD4 <= b <= 0xD8: + size, fmt, typ = _MSGPACK_HEADERS[b] + if self._max_ext_len < size: + raise ValueError( + "%s exceeds max_ext_len(%s)" % (size, self._max_ext_len) + ) + self._reserve(size + 1) + n, obj = _unpack_from(fmt, self._buffer, self._buff_i) + self._buff_i += size + 1 + elif 0xD9 <= b <= 0xDB: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + if len(fmt) > 0: + (n,) = _unpack_from(fmt, self._buffer, self._buff_i) + else: + n = self._buffer[self._buff_i] + self._buff_i += size + if n > self._max_str_len: + raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len)) + obj = self._read(n) + elif 0xDC <= b <= 0xDD: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + (n,) = _unpack_from(fmt, self._buffer, self._buff_i) + self._buff_i += size + if n > self._max_array_len: + raise ValueError( + "%s exceeds max_array_len(%s)" % (n, self._max_array_len) + ) + elif 0xDE <= b <= 0xDF: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + (n,) = _unpack_from(fmt, self._buffer, self._buff_i) + self._buff_i += size + if n > self._max_map_len: + raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len)) + else: + raise FormatError("Unknown header: 0x%x" % b) + return typ, n, obj + + def _unpack(self, execute=EX_CONSTRUCT): + typ, n, obj = self._read_header() + + if execute == EX_READ_ARRAY_HEADER: + if typ != TYPE_ARRAY: + raise ValueError("Expected array") + return n + if execute == EX_READ_MAP_HEADER: + if typ != TYPE_MAP: + raise ValueError("Expected map") + return n + # TODO should we eliminate the recursion? + if typ == TYPE_ARRAY: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call `list_hook` + self._unpack(EX_SKIP) + return + ret = newlist_hint(n) + for i in xrange(n): + ret.append(self._unpack(EX_CONSTRUCT)) + if self._list_hook is not None: + ret = self._list_hook(ret) + # TODO is the interaction between `list_hook` and `use_list` ok? + return ret if self._use_list else tuple(ret) + if typ == TYPE_MAP: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call hooks + self._unpack(EX_SKIP) + self._unpack(EX_SKIP) + return + if self._object_pairs_hook is not None: + ret = self._object_pairs_hook( + (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT)) + for _ in xrange(n) + ) + else: + ret = {} + for _ in xrange(n): + key = self._unpack(EX_CONSTRUCT) + if self._strict_map_key and type(key) not in (unicode, bytes): + raise ValueError( + "%s is not allowed for map key" % str(type(key)) + ) + if not PY2 and type(key) is str: + key = sys.intern(key) + ret[key] = self._unpack(EX_CONSTRUCT) + if self._object_hook is not None: + ret = self._object_hook(ret) + return ret + if execute == EX_SKIP: + return + if typ == TYPE_RAW: + if self._raw: + obj = bytes(obj) + else: + obj = obj.decode("utf_8", self._unicode_errors) + return obj + if typ == TYPE_BIN: + return bytes(obj) + if typ == TYPE_EXT: + if n == -1: # timestamp + ts = Timestamp.from_bytes(bytes(obj)) + if self._timestamp == 1: + return ts.to_unix() + elif self._timestamp == 2: + return ts.to_unix_nano() + elif self._timestamp == 3: + return ts.to_datetime() + else: + return ts + else: + return self._ext_hook(n, bytes(obj)) + assert typ == TYPE_IMMEDIATE + return obj + + def __iter__(self): + return self + + def __next__(self): + try: + ret = self._unpack(EX_CONSTRUCT) + self._consume() + return ret + except OutOfData: + self._consume() + raise StopIteration + except RecursionError: + raise StackError + + next = __next__ + + def skip(self): + self._unpack(EX_SKIP) + self._consume() + + def unpack(self): + try: + ret = self._unpack(EX_CONSTRUCT) + except RecursionError: + raise StackError + self._consume() + return ret + + def read_array_header(self): + ret = self._unpack(EX_READ_ARRAY_HEADER) + self._consume() + return ret + + def read_map_header(self): + ret = self._unpack(EX_READ_MAP_HEADER) + self._consume() + return ret + + def tell(self): + return self._stream_offset + + +class Packer(object): + """ + MessagePack Packer + + Usage:: + + packer = Packer() + astream.write(packer.pack(a)) + astream.write(packer.pack(b)) + + Packer's constructor has some keyword arguments: + + :param callable default: + Convert user type to builtin type that Packer supports. + See also simplejson's document. + + :param bool use_single_float: + Use single precision float type for float. (default: False) + + :param bool autoreset: + Reset buffer after each pack and return its content as `bytes`. (default: True). + If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. + + :param bool use_bin_type: + Use bin type introduced in msgpack spec 2.0 for bytes. + It also enables str8 type for unicode. (default: True) + + :param bool strict_types: + If set to true, types will be checked to be exact. Derived classes + from serializable types will not be serialized and will be + treated as unsupported type and forwarded to default. + Additionally tuples will not be serialized as lists. + This is useful when trying to implement accurate serialization + for python types. + + :param bool datetime: + If set to true, datetime with tzinfo is packed into Timestamp type. + Note that the tzinfo is stripped in the timestamp. + You can get UTC datetime with `timestamp=3` option of the Unpacker. + (Python 2 is not supported). + + :param str unicode_errors: + The error handler for encoding unicode. (default: 'strict') + DO NOT USE THIS!! This option is kept for very specific usage. + + Example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like) + for o in unpacker: + process(o) + + Example of streaming deserialize from socket:: + + unpacker = Unpacker() + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + + Raises ``ExtraData`` when *packed* contains extra bytes. + Raises ``OutOfData`` when *packed* is incomplete. + Raises ``FormatError`` when *packed* is not valid msgpack. + Raises ``StackError`` when *packed* contains too nested. + Other exceptions can be raised during unpacking. + """ + + def __init__( + self, + default=None, + use_single_float=False, + autoreset=True, + use_bin_type=True, + strict_types=False, + datetime=False, + unicode_errors=None, + ): + self._strict_types = strict_types + self._use_float = use_single_float + self._autoreset = autoreset + self._use_bin_type = use_bin_type + self._buffer = StringIO() + if PY2 and datetime: + raise ValueError("datetime is not supported in Python 2") + self._datetime = bool(datetime) + self._unicode_errors = unicode_errors or "strict" + if default is not None: + if not callable(default): + raise TypeError("default must be callable") + self._default = default + + def _pack( + self, + obj, + nest_limit=DEFAULT_RECURSE_LIMIT, + check=isinstance, + check_type_strict=_check_type_strict, + ): + default_used = False + if self._strict_types: + check = check_type_strict + list_types = list + else: + list_types = (list, tuple) + while True: + if nest_limit < 0: + raise ValueError("recursion limit exceeded") + if obj is None: + return self._buffer.write(b"\xc0") + if check(obj, bool): + if obj: + return self._buffer.write(b"\xc3") + return self._buffer.write(b"\xc2") + if check(obj, int_types): + if 0 <= obj < 0x80: + return self._buffer.write(struct.pack("B", obj)) + if -0x20 <= obj < 0: + return self._buffer.write(struct.pack("b", obj)) + if 0x80 <= obj <= 0xFF: + return self._buffer.write(struct.pack("BB", 0xCC, obj)) + if -0x80 <= obj < 0: + return self._buffer.write(struct.pack(">Bb", 0xD0, obj)) + if 0xFF < obj <= 0xFFFF: + return self._buffer.write(struct.pack(">BH", 0xCD, obj)) + if -0x8000 <= obj < -0x80: + return self._buffer.write(struct.pack(">Bh", 0xD1, obj)) + if 0xFFFF < obj <= 0xFFFFFFFF: + return self._buffer.write(struct.pack(">BI", 0xCE, obj)) + if -0x80000000 <= obj < -0x8000: + return self._buffer.write(struct.pack(">Bi", 0xD2, obj)) + if 0xFFFFFFFF < obj <= 0xFFFFFFFFFFFFFFFF: + return self._buffer.write(struct.pack(">BQ", 0xCF, obj)) + if -0x8000000000000000 <= obj < -0x80000000: + return self._buffer.write(struct.pack(">Bq", 0xD3, obj)) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = True + continue + raise OverflowError("Integer value out of range") + if check(obj, (bytes, bytearray)): + n = len(obj) + if n >= 2**32: + raise ValueError("%s is too large" % type(obj).__name__) + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, unicode): + obj = obj.encode("utf-8", self._unicode_errors) + n = len(obj) + if n >= 2**32: + raise ValueError("String is too large") + self._pack_raw_header(n) + return self._buffer.write(obj) + if check(obj, memoryview): + n = obj.nbytes + if n >= 2**32: + raise ValueError("Memoryview is too large") + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, float): + if self._use_float: + return self._buffer.write(struct.pack(">Bf", 0xCA, obj)) + return self._buffer.write(struct.pack(">Bd", 0xCB, obj)) + if check(obj, (ExtType, Timestamp)): + if check(obj, Timestamp): + code = -1 + data = obj.to_bytes() + else: + code = obj.code + data = obj.data + assert isinstance(code, int) + assert isinstance(data, bytes) + L = len(data) + if L == 1: + self._buffer.write(b"\xd4") + elif L == 2: + self._buffer.write(b"\xd5") + elif L == 4: + self._buffer.write(b"\xd6") + elif L == 8: + self._buffer.write(b"\xd7") + elif L == 16: + self._buffer.write(b"\xd8") + elif L <= 0xFF: + self._buffer.write(struct.pack(">BB", 0xC7, L)) + elif L <= 0xFFFF: + self._buffer.write(struct.pack(">BH", 0xC8, L)) + else: + self._buffer.write(struct.pack(">BI", 0xC9, L)) + self._buffer.write(struct.pack("b", code)) + self._buffer.write(data) + return + if check(obj, list_types): + n = len(obj) + self._pack_array_header(n) + for i in xrange(n): + self._pack(obj[i], nest_limit - 1) + return + if check(obj, dict): + return self._pack_map_pairs( + len(obj), dict_iteritems(obj), nest_limit - 1 + ) + + if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None: + obj = Timestamp.from_datetime(obj) + default_used = 1 + continue + + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = 1 + continue + + if self._datetime and check(obj, _DateTime): + raise ValueError("Cannot serialize %r where tzinfo=None" % (obj,)) + + raise TypeError("Cannot serialize %r" % (obj,)) + + def pack(self, obj): + try: + self._pack(obj) + except: + self._buffer = StringIO() # force reset + raise + if self._autoreset: + ret = self._buffer.getvalue() + self._buffer = StringIO() + return ret + + def pack_map_pairs(self, pairs): + self._pack_map_pairs(len(pairs), pairs) + if self._autoreset: + ret = self._buffer.getvalue() + self._buffer = StringIO() + return ret + + def pack_array_header(self, n): + if n >= 2**32: + raise ValueError + self._pack_array_header(n) + if self._autoreset: + ret = self._buffer.getvalue() + self._buffer = StringIO() + return ret + + def pack_map_header(self, n): + if n >= 2**32: + raise ValueError + self._pack_map_header(n) + if self._autoreset: + ret = self._buffer.getvalue() + self._buffer = StringIO() + return ret + + def pack_ext_type(self, typecode, data): + if not isinstance(typecode, int): + raise TypeError("typecode must have int type.") + if not 0 <= typecode <= 127: + raise ValueError("typecode should be 0-127") + if not isinstance(data, bytes): + raise TypeError("data must have bytes type") + L = len(data) + if L > 0xFFFFFFFF: + raise ValueError("Too large data") + if L == 1: + self._buffer.write(b"\xd4") + elif L == 2: + self._buffer.write(b"\xd5") + elif L == 4: + self._buffer.write(b"\xd6") + elif L == 8: + self._buffer.write(b"\xd7") + elif L == 16: + self._buffer.write(b"\xd8") + elif L <= 0xFF: + self._buffer.write(b"\xc7" + struct.pack("B", L)) + elif L <= 0xFFFF: + self._buffer.write(b"\xc8" + struct.pack(">H", L)) + else: + self._buffer.write(b"\xc9" + struct.pack(">I", L)) + self._buffer.write(struct.pack("B", typecode)) + self._buffer.write(data) + + def _pack_array_header(self, n): + if n <= 0x0F: + return self._buffer.write(struct.pack("B", 0x90 + n)) + if n <= 0xFFFF: + return self._buffer.write(struct.pack(">BH", 0xDC, n)) + if n <= 0xFFFFFFFF: + return self._buffer.write(struct.pack(">BI", 0xDD, n)) + raise ValueError("Array is too large") + + def _pack_map_header(self, n): + if n <= 0x0F: + return self._buffer.write(struct.pack("B", 0x80 + n)) + if n <= 0xFFFF: + return self._buffer.write(struct.pack(">BH", 0xDE, n)) + if n <= 0xFFFFFFFF: + return self._buffer.write(struct.pack(">BI", 0xDF, n)) + raise ValueError("Dict is too large") + + def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): + self._pack_map_header(n) + for (k, v) in pairs: + self._pack(k, nest_limit - 1) + self._pack(v, nest_limit - 1) + + def _pack_raw_header(self, n): + if n <= 0x1F: + self._buffer.write(struct.pack("B", 0xA0 + n)) + elif self._use_bin_type and n <= 0xFF: + self._buffer.write(struct.pack(">BB", 0xD9, n)) + elif n <= 0xFFFF: + self._buffer.write(struct.pack(">BH", 0xDA, n)) + elif n <= 0xFFFFFFFF: + self._buffer.write(struct.pack(">BI", 0xDB, n)) + else: + raise ValueError("Raw is too large") + + def _pack_bin_header(self, n): + if not self._use_bin_type: + return self._pack_raw_header(n) + elif n <= 0xFF: + return self._buffer.write(struct.pack(">BB", 0xC4, n)) + elif n <= 0xFFFF: + return self._buffer.write(struct.pack(">BH", 0xC5, n)) + elif n <= 0xFFFFFFFF: + return self._buffer.write(struct.pack(">BI", 0xC6, n)) + else: + raise ValueError("Bin is too large") + + def bytes(self): + """Return internal buffer contents as bytes object""" + return self._buffer.getvalue() + + def reset(self): + """Reset internal buffer. + + This method is useful only when autoreset=False. + """ + self._buffer = StringIO() + + def getbuffer(self): + """Return view of internal buffer.""" + if USING_STRINGBUILDER or PY2: + return memoryview(self.bytes()) + else: + return self._buffer.getbuffer() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py new file mode 100644 index 0000000..3551bc2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py @@ -0,0 +1,26 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "21.3" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD-2-Clause or Apache-2.0" +__copyright__ = "2014-2019 %s" % __author__ diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000..3c50c5d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py @@ -0,0 +1,25 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from .__about__ import ( + __author__, + __copyright__, + __email__, + __license__, + __summary__, + __title__, + __uri__, + __version__, +) + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34ff3424d72a7c333a2964950c5779d78cb582a0 GIT binary patch literal 649 zcmYL_O^e$w5QgP^+gYbMlv4JvxP>0l;%MV7^pn!ee_-j}_SA90vIBagk=_|b?{C+25X7_9=lEL#p}%!<6OixXDuC@f ziV;OWtq@Twv}hx2&}P`At*}MgVVics4(*0r+GFjqgHYHj?2$9-UD$*eZW2bwMV}Cz zr)i`LNV0~`LqxdX0Qt5I?cha|dCmnNH9=m&^~w$K^qAJbCH^UU-l6hml=d5hd_VRr{@)HCi>=HNZ=xx;1(=Y``yc1w_{d zr^4Vl{-nV_{GJ&mys6@p<0;cCBQu;S`GuKNq4_LfI4zi1edhp^UY)qW{h7Ih%u{%H9qh!^80C$KjvhldrCFq5eM~oyRKx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7062b301563cfdcd57a8154248285b77f51ae58a GIT binary patch literal 485 zcmYk2zfQw25XSAKZIV_+Oe`#{9jL`0i3K4cRg7#fcsZqwm72y*WIL5I@)YcBJPU8o zm5B}LP^lB=1`s#=ba(#r-T7XJ!#=^dSls8Il#n-H{6_GTtj{rdA{ohOK@{aw1w2q8 z4^@YERF`*EkM~r>BNg+QlAL70Gv!GWjymt?Nk;Li50KVwUK)Va5MWkTjgk4>VVM93 zmC6Fs0YD*VLR--mwpJ=NO)GNJ6}}$<)JC>~r7%{O8ekNg7$=#?Bk}OxGNDJ;qvz2< z+>ZKwWI8QtoZc#Y|DSAUva|bh@>A0ScYGmh6qBuGN;@`VcNSM*H^K>hG%+%hY$EK! zl@+T@`5@f2wsKksrW&D_tdLVyHFyVoHaxVsdEM( vwZu)wRkMvRRhiX=xH9{=gFmf3M0|vl(oH|1!G<8#9$yE^Ab5<-9=?AA*U*A5 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71c1729950eab93e107907d691b39cbf8f88b73f GIT binary patch literal 12095 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 D1IKRi literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17400b6234c7597b188c931bc4010191463587ee GIT binary patch literal 6929 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..251b289815a056da47832dc503af584168f19842 GIT binary patch literal 3260 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..412c1b537877c981385af272265650d59077c936 GIT binary patch literal 31266 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcc4c5671b326a40c95c628e8cf1b71a8a9eb2cd GIT binary patch literal 18975 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 F{{LR7FNgpD literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d94f01f024931d8b0be4790ba668ec9b3ee82e90 GIT binary patch literal 5887 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89e7328299a72f6bc268282c199e8d73745f254c GIT binary patch literal 19958 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 None: + def unpack(fmt: str) -> int: + try: + data = file.read(struct.calcsize(fmt)) + result: Tuple[int, ...] = struct.unpack(fmt, data) + except struct.error: + raise _ELFFileHeader._InvalidELFFileHeader() + return result[0] + + self.e_ident_magic = unpack(">I") + if self.e_ident_magic != self.ELF_MAGIC_NUMBER: + raise _ELFFileHeader._InvalidELFFileHeader() + self.e_ident_class = unpack("B") + if self.e_ident_class not in {self.ELFCLASS32, self.ELFCLASS64}: + raise _ELFFileHeader._InvalidELFFileHeader() + self.e_ident_data = unpack("B") + if self.e_ident_data not in {self.ELFDATA2LSB, self.ELFDATA2MSB}: + raise _ELFFileHeader._InvalidELFFileHeader() + self.e_ident_version = unpack("B") + self.e_ident_osabi = unpack("B") + self.e_ident_abiversion = unpack("B") + self.e_ident_pad = file.read(7) + format_h = "H" + format_i = "I" + format_q = "Q" + format_p = format_i if self.e_ident_class == self.ELFCLASS32 else format_q + self.e_type = unpack(format_h) + self.e_machine = unpack(format_h) + self.e_version = unpack(format_i) + self.e_entry = unpack(format_p) + self.e_phoff = unpack(format_p) + self.e_shoff = unpack(format_p) + self.e_flags = unpack(format_i) + self.e_ehsize = unpack(format_h) + self.e_phentsize = unpack(format_h) + self.e_phnum = unpack(format_h) + self.e_shentsize = unpack(format_h) + self.e_shnum = unpack(format_h) + self.e_shstrndx = unpack(format_h) + + +def _get_elf_header() -> Optional[_ELFFileHeader]: + try: + with open(sys.executable, "rb") as f: + elf_header = _ELFFileHeader(f) + except (OSError, TypeError, _ELFFileHeader._InvalidELFFileHeader): + return None + return elf_header + + +def _is_linux_armhf() -> bool: + # hard-float ABI can be detected from the ELF header of the running + # process + # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf + elf_header = _get_elf_header() + if elf_header is None: + return False + result = elf_header.e_ident_class == elf_header.ELFCLASS32 + result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB + result &= elf_header.e_machine == elf_header.EM_ARM + result &= ( + elf_header.e_flags & elf_header.EF_ARM_ABIMASK + ) == elf_header.EF_ARM_ABI_VER5 + result &= ( + elf_header.e_flags & elf_header.EF_ARM_ABI_FLOAT_HARD + ) == elf_header.EF_ARM_ABI_FLOAT_HARD + return result + + +def _is_linux_i686() -> bool: + elf_header = _get_elf_header() + if elf_header is None: + return False + result = elf_header.e_ident_class == elf_header.ELFCLASS32 + result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB + result &= elf_header.e_machine == elf_header.EM_386 + return result + + +def _have_compatible_abi(arch: str) -> bool: + if arch == "armv7l": + return _is_linux_armhf() + if arch == "i686": + return _is_linux_i686() + return arch in {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x"} + + +# If glibc ever changes its major version, we need to know what the last +# minor version was, so we can build the complete list of all versions. +# For now, guess what the highest minor version might be, assume it will +# be 50 for testing. Once this actually happens, update the dictionary +# with the actual value. +_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50) + + +class _GLibCVersion(NamedTuple): + major: int + minor: int + + +def _glibc_version_string_confstr() -> Optional[str]: + """ + Primary implementation of glibc_version_string using os.confstr. + """ + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module. + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 + try: + # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17". + version_string = os.confstr("CS_GNU_LIBC_VERSION") + assert version_string is not None + _, version = version_string.split() + except (AssertionError, AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def _glibc_version_string_ctypes() -> Optional[str]: + """ + Fallback implementation of glibc_version_string using ctypes. + """ + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + # + # We must also handle the special case where the executable is not a + # dynamically linked executable. This can occur when using musl libc, + # for example. In this situation, dlopen() will error, leading to an + # OSError. Interestingly, at least in the case of musl, there is no + # errno set on the OSError. The single string argument used to construct + # OSError comes from libc itself and is therefore not portable to + # hard code here. In any case, failure to call dlopen() means we + # can proceed, so we bail on our attempt. + try: + process_namespace = ctypes.CDLL(None) + except OSError: + return None + + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str: str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +def _glibc_version_string() -> Optional[str]: + """Returns glibc version string, or None if not using glibc.""" + return _glibc_version_string_confstr() or _glibc_version_string_ctypes() + + +def _parse_glibc_version(version_str: str) -> Tuple[int, int]: + """Parse glibc version. + + We use a regexp instead of str.split because we want to discard any + random junk that might come after the minor version -- this might happen + in patched/forked versions of glibc (e.g. Linaro's version of glibc + uses version strings like "2.20-2014.11"). See gh-3588. + """ + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn( + "Expected glibc version with 2 components major.minor," + " got: %s" % version_str, + RuntimeWarning, + ) + return -1, -1 + return int(m.group("major")), int(m.group("minor")) + + +@functools.lru_cache() +def _get_glibc_version() -> Tuple[int, int]: + version_str = _glibc_version_string() + if version_str is None: + return (-1, -1) + return _parse_glibc_version(version_str) + + +# From PEP 513, PEP 600 +def _is_compatible(name: str, arch: str, version: _GLibCVersion) -> bool: + sys_glibc = _get_glibc_version() + if sys_glibc < version: + return False + # Check for presence of _manylinux module. + try: + import _manylinux # noqa + except ImportError: + return True + if hasattr(_manylinux, "manylinux_compatible"): + result = _manylinux.manylinux_compatible(version[0], version[1], arch) + if result is not None: + return bool(result) + return True + if version == _GLibCVersion(2, 5): + if hasattr(_manylinux, "manylinux1_compatible"): + return bool(_manylinux.manylinux1_compatible) + if version == _GLibCVersion(2, 12): + if hasattr(_manylinux, "manylinux2010_compatible"): + return bool(_manylinux.manylinux2010_compatible) + if version == _GLibCVersion(2, 17): + if hasattr(_manylinux, "manylinux2014_compatible"): + return bool(_manylinux.manylinux2014_compatible) + return True + + +_LEGACY_MANYLINUX_MAP = { + # CentOS 7 w/ glibc 2.17 (PEP 599) + (2, 17): "manylinux2014", + # CentOS 6 w/ glibc 2.12 (PEP 571) + (2, 12): "manylinux2010", + # CentOS 5 w/ glibc 2.5 (PEP 513) + (2, 5): "manylinux1", +} + + +def platform_tags(linux: str, arch: str) -> Iterator[str]: + if not _have_compatible_abi(arch): + return + # Oldest glibc to be supported regardless of architecture is (2, 17). + too_old_glibc2 = _GLibCVersion(2, 16) + if arch in {"x86_64", "i686"}: + # On x86/i686 also oldest glibc to be supported is (2, 5). + too_old_glibc2 = _GLibCVersion(2, 4) + current_glibc = _GLibCVersion(*_get_glibc_version()) + glibc_max_list = [current_glibc] + # We can assume compatibility across glibc major versions. + # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 + # + # Build a list of maximum glibc versions so that we can + # output the canonical list of all glibc from current_glibc + # down to too_old_glibc2, including all intermediary versions. + for glibc_major in range(current_glibc.major - 1, 1, -1): + glibc_minor = _LAST_GLIBC_MINOR[glibc_major] + glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) + for glibc_max in glibc_max_list: + if glibc_max.major == too_old_glibc2.major: + min_minor = too_old_glibc2.minor + else: + # For other glibc major versions oldest supported is (x, 0). + min_minor = -1 + for glibc_minor in range(glibc_max.minor, min_minor, -1): + glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) + tag = "manylinux_{}_{}".format(*glibc_version) + if _is_compatible(tag, arch, glibc_version): + yield linux.replace("linux", tag) + # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. + if glibc_version in _LEGACY_MANYLINUX_MAP: + legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] + if _is_compatible(legacy_tag, arch, glibc_version): + yield linux.replace("linux", legacy_tag) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py new file mode 100644 index 0000000..8ac3059 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py @@ -0,0 +1,136 @@ +"""PEP 656 support. + +This module implements logic to detect if the currently running Python is +linked against musl, and what musl version is used. +""" + +import contextlib +import functools +import operator +import os +import re +import struct +import subprocess +import sys +from typing import IO, Iterator, NamedTuple, Optional, Tuple + + +def _read_unpacked(f: IO[bytes], fmt: str) -> Tuple[int, ...]: + return struct.unpack(fmt, f.read(struct.calcsize(fmt))) + + +def _parse_ld_musl_from_elf(f: IO[bytes]) -> Optional[str]: + """Detect musl libc location by parsing the Python executable. + + Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca + ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html + """ + f.seek(0) + try: + ident = _read_unpacked(f, "16B") + except struct.error: + return None + if ident[:4] != tuple(b"\x7fELF"): # Invalid magic, not ELF. + return None + f.seek(struct.calcsize("HHI"), 1) # Skip file type, machine, and version. + + try: + # e_fmt: Format for program header. + # p_fmt: Format for section header. + # p_idx: Indexes to find p_type, p_offset, and p_filesz. + e_fmt, p_fmt, p_idx = { + 1: ("IIIIHHH", "IIIIIIII", (0, 1, 4)), # 32-bit. + 2: ("QQQIHHH", "IIQQQQQQ", (0, 2, 5)), # 64-bit. + }[ident[4]] + except KeyError: + return None + else: + p_get = operator.itemgetter(*p_idx) + + # Find the interpreter section and return its content. + try: + _, e_phoff, _, _, _, e_phentsize, e_phnum = _read_unpacked(f, e_fmt) + except struct.error: + return None + for i in range(e_phnum + 1): + f.seek(e_phoff + e_phentsize * i) + try: + p_type, p_offset, p_filesz = p_get(_read_unpacked(f, p_fmt)) + except struct.error: + return None + if p_type != 3: # Not PT_INTERP. + continue + f.seek(p_offset) + interpreter = os.fsdecode(f.read(p_filesz)).strip("\0") + if "musl" not in interpreter: + return None + return interpreter + return None + + +class _MuslVersion(NamedTuple): + major: int + minor: int + + +def _parse_musl_version(output: str) -> Optional[_MuslVersion]: + lines = [n for n in (n.strip() for n in output.splitlines()) if n] + if len(lines) < 2 or lines[0][:4] != "musl": + return None + m = re.match(r"Version (\d+)\.(\d+)", lines[1]) + if not m: + return None + return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) + + +@functools.lru_cache() +def _get_musl_version(executable: str) -> Optional[_MuslVersion]: + """Detect currently-running musl runtime version. + + This is done by checking the specified executable's dynamic linking + information, and invoking the loader to parse its output for a version + string. If the loader is musl, the output would be something like:: + + musl libc (x86_64) + Version 1.2.2 + Dynamic Program Loader + """ + with contextlib.ExitStack() as stack: + try: + f = stack.enter_context(open(executable, "rb")) + except OSError: + return None + ld = _parse_ld_musl_from_elf(f) + if not ld: + return None + proc = subprocess.run([ld], stderr=subprocess.PIPE, universal_newlines=True) + return _parse_musl_version(proc.stderr) + + +def platform_tags(arch: str) -> Iterator[str]: + """Generate musllinux tags compatible to the current platform. + + :param arch: Should be the part of platform tag after the ``linux_`` + prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a + prerequisite for the current platform to be musllinux-compatible. + + :returns: An iterator of compatible musllinux tags. + """ + sys_musl = _get_musl_version(sys.executable) + if sys_musl is None: # Python not dynamically linked against musl. + return + for minor in range(sys_musl.minor, -1, -1): + yield f"musllinux_{sys_musl.major}_{minor}_{arch}" + + +if __name__ == "__main__": # pragma: no cover + import sysconfig + + plat = sysconfig.get_platform() + assert plat.startswith("linux-"), "not linux" + + print("plat:", plat) + print("musl:", _get_musl_version(sys.executable)) + print("tags:", end=" ") + for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): + print(t, end="\n ") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000..90a6465 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py @@ -0,0 +1,61 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + + +class InfinityType: + def __repr__(self) -> str: + return "Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return False + + def __le__(self, other: object) -> bool: + return False + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return True + + def __ge__(self, other: object) -> bool: + return True + + def __neg__(self: object) -> "NegativeInfinityType": + return NegativeInfinity + + +Infinity = InfinityType() + + +class NegativeInfinityType: + def __repr__(self) -> str: + return "-Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return True + + def __le__(self, other: object) -> bool: + return True + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return False + + def __ge__(self, other: object) -> bool: + return False + + def __neg__(self: object) -> InfinityType: + return Infinity + + +NegativeInfinity = NegativeInfinityType() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000..540e7a4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py @@ -0,0 +1,304 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import operator +import os +import platform +import sys +from typing import Any, Callable, Dict, List, Optional, Tuple, Union + +from pip._vendor.pyparsing import ( # noqa: N817 + Forward, + Group, + Literal as L, + ParseException, + ParseResults, + QuotedString, + ZeroOrMore, + stringEnd, + stringStart, +) + +from .specifiers import InvalidSpecifier, Specifier + +__all__ = [ + "InvalidMarker", + "UndefinedComparison", + "UndefinedEnvironmentName", + "Marker", + "default_environment", +] + +Operator = Callable[[str, str], bool] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node: + def __init__(self, value: Any) -> None: + self.value = value + + def __str__(self) -> str: + return str(self.value) + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}('{self}')>" + + def serialize(self) -> str: + raise NotImplementedError + + +class Variable(Node): + def serialize(self) -> str: + return str(self) + + +class Value(Node): + def serialize(self) -> str: + return f'"{self}"' + + +class Op(Node): + def serialize(self) -> str: + return str(self) + + +VARIABLE = ( + L("implementation_version") + | L("platform_python_implementation") + | L("implementation_name") + | L("python_full_version") + | L("platform_release") + | L("platform_version") + | L("platform_machine") + | L("platform_system") + | L("python_version") + | L("sys_platform") + | L("os_name") + | L("os.name") # PEP-345 + | L("sys.platform") # PEP-345 + | L("platform.version") # PEP-345 + | L("platform.machine") # PEP-345 + | L("platform.python_implementation") # PEP-345 + | L("python_implementation") # undocumented setuptools legacy + | L("extra") # PEP-508 +) +ALIASES = { + "os.name": "os_name", + "sys.platform": "sys_platform", + "platform.version": "platform_version", + "platform.machine": "platform_machine", + "platform.python_implementation": "platform_python_implementation", + "python_implementation": "platform_python_implementation", +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results: Union[ParseResults, List[Any]]) -> List[Any]: + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker( + marker: Union[List[str], Tuple[Node, ...], str], first: Optional[bool] = True +) -> str: + + assert isinstance(marker, (list, tuple, str)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators: Dict[str, Operator] = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs: str, op: Op, rhs: str) -> bool: + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper: Optional[Operator] = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") + + return oper(lhs, rhs) + + +class Undefined: + pass + + +_undefined = Undefined() + + +def _get_env(environment: Dict[str, str], name: str) -> str: + value: Union[str, Undefined] = environment.get(name, _undefined) + + if isinstance(value, Undefined): + raise UndefinedEnvironmentName( + f"{name!r} does not exist in evaluation environment." + ) + + return value + + +def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool: + groups: List[List[bool]] = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, str)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info: "sys._version_info") -> str: + version = "{0.major}.{0.minor}.{0.micro}".format(info) + kind = info.releaselevel + if kind != "final": + version += kind[0] + str(info.serial) + return version + + +def default_environment() -> Dict[str, str]: + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": ".".join(platform.python_version_tuple()[:2]), + "sys_platform": sys.platform, + } + + +class Marker: + def __init__(self, marker: str) -> None: + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + raise InvalidMarker( + f"Invalid marker: {marker!r}, parse error at " + f"{marker[e.loc : e.loc + 8]!r}" + ) + + def __str__(self) -> str: + return _format_marker(self._markers) + + def __repr__(self) -> str: + return f"" + + def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool: + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000..1eab7dd --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py @@ -0,0 +1,146 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import re +import string +import urllib.parse +from typing import List, Optional as TOptional, Set + +from pip._vendor.pyparsing import ( # noqa + Combine, + Literal as L, + Optional, + ParseException, + Regex, + Word, + ZeroOrMore, + originalTextFor, + stringEnd, + stringStart, +) + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r"[^ ]+")("url") +URL = AT + URI + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine( + VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False +)("_raw_spec") +_VERSION_SPEC = Optional((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start : t._original_end]) +) +MARKER_SEPARATOR = SEMICOLON +MARKER = MARKER_SEPARATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd +# pyparsing isn't thread safe during initialization, so we do it eagerly, see +# issue #104 +REQUIREMENT.parseString("x[]") + + +class Requirement: + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string: str) -> None: + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + f'Parse error at "{ requirement_string[e.loc : e.loc + 8]!r}": {e.msg}' + ) + + self.name: str = req.name + if req.url: + parsed_url = urllib.parse.urlparse(req.url) + if parsed_url.scheme == "file": + if urllib.parse.urlunparse(parsed_url) != req.url: + raise InvalidRequirement("Invalid URL given") + elif not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc + ): + raise InvalidRequirement(f"Invalid URL: {req.url}") + self.url: TOptional[str] = req.url + else: + self.url = None + self.extras: Set[str] = set(req.extras.asList() if req.extras else []) + self.specifier: SpecifierSet = SpecifierSet(req.specifier) + self.marker: TOptional[Marker] = req.marker if req.marker else None + + def __str__(self) -> str: + parts: List[str] = [self.name] + + if self.extras: + formatted_extras = ",".join(sorted(self.extras)) + parts.append(f"[{formatted_extras}]") + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append(f"@ {self.url}") + if self.marker: + parts.append(" ") + + if self.marker: + parts.append(f"; {self.marker}") + + return "".join(parts) + + def __repr__(self) -> str: + return f"" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..0e218a6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,802 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import abc +import functools +import itertools +import re +import warnings +from typing import ( + Callable, + Dict, + Iterable, + Iterator, + List, + Optional, + Pattern, + Set, + Tuple, + TypeVar, + Union, +) + +from .utils import canonicalize_version +from .version import LegacyVersion, Version, parse + +ParsedVersion = Union[Version, LegacyVersion] +UnparsedVersion = Union[Version, LegacyVersion, str] +VersionTypeVar = TypeVar("VersionTypeVar", bound=UnparsedVersion) +CallableOperator = Callable[[ParsedVersion, str], bool] + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __str__(self) -> str: + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self) -> int: + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other: object) -> bool: + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractproperty + def prereleases(self) -> Optional[bool]: + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value: bool) -> None: + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item: str, prereleases: Optional[bool] = None) -> bool: + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter( + self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None + ) -> Iterable[VersionTypeVar]: + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators: Dict[str, str] = {} + _regex: Pattern[str] + + def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier(f"Invalid specifier: '{spec}'") + + self._spec: Tuple[str, str] = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self) -> str: + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"<{self.__class__.__name__}({str(self)!r}{pre})>" + + def __str__(self) -> str: + return "{}{}".format(*self._spec) + + @property + def _canonical_spec(self) -> Tuple[str, str]: + return self._spec[0], canonicalize_version(self._spec[1]) + + def __hash__(self) -> int: + return hash(self._canonical_spec) + + def __eq__(self, other: object) -> bool: + if isinstance(other, str): + try: + other = self.__class__(str(other)) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._canonical_spec == other._canonical_spec + + def _get_operator(self, op: str) -> CallableOperator: + operator_callable: CallableOperator = getattr( + self, f"_compare_{self._operators[op]}" + ) + return operator_callable + + def _coerce_version(self, version: UnparsedVersion) -> ParsedVersion: + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self) -> str: + return self._spec[0] + + @property + def version(self) -> str: + return self._spec[1] + + @property + def prereleases(self) -> Optional[bool]: + return self._prereleases + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + def __contains__(self, item: str) -> bool: + return self.contains(item) + + def contains( + self, item: UnparsedVersion, prereleases: Optional[bool] = None + ) -> bool: + + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + normalized_item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if normalized_item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + operator_callable: CallableOperator = self._get_operator(self.operator) + return operator_callable(normalized_item, self.version) + + def filter( + self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None + ) -> Iterable[VersionTypeVar]: + + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later in case nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = r""" + (?P(==|!=|<=|>=|<|>)) + \s* + (?P + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: + super().__init__(spec, prereleases) + + warnings.warn( + "Creating a LegacyVersion has been deprecated and will be " + "removed in the next major release", + DeprecationWarning, + ) + + def _coerce_version(self, version: UnparsedVersion) -> LegacyVersion: + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective: LegacyVersion, spec: str) -> bool: + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective: LegacyVersion, spec: str) -> bool: + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective: LegacyVersion, spec: str) -> bool: + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal( + self, prospective: LegacyVersion, spec: str + ) -> bool: + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective: LegacyVersion, spec: str) -> bool: + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective: LegacyVersion, spec: str) -> bool: + return prospective > self._coerce_version(spec) + + +def _require_version_compare( + fn: Callable[["Specifier", ParsedVersion, str], bool] +) -> Callable[["Specifier", ParsedVersion, str], bool]: + @functools.wraps(fn) + def wrapped(self: "Specifier", prospective: ParsedVersion, spec: str) -> bool: + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = r""" + (?P(~=|==|!=|<=|>=|<|>|===)) + (?P + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective: ParsedVersion, spec: str) -> bool: + + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore suffix segments. + prefix = ".".join( + list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( + prospective, prefix + ) + + @_require_version_compare + def _compare_equal(self, prospective: ParsedVersion, spec: str) -> bool: + + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + split_spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + split_prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + shortened_prospective = split_prospective[: len(split_spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + padded_spec, padded_prospective = _pad_version( + split_spec, shortened_prospective + ) + + return padded_prospective == padded_spec + else: + # Convert our spec string into a Version + spec_version = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec_version.local: + prospective = Version(prospective.public) + + return prospective == spec_version + + @_require_version_compare + def _compare_not_equal(self, prospective: ParsedVersion, spec: str) -> bool: + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective: ParsedVersion, spec: str) -> bool: + + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal( + self, prospective: ParsedVersion, spec: str + ) -> bool: + + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective: ParsedVersion, spec_str: str) -> bool: + + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective: ParsedVersion, spec_str: str) -> bool: + + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is technically greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self) -> bool: + + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version: str) -> List[str]: + result: List[str] = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _is_not_suffix(segment: str) -> bool: + return not any( + segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") + ) + + +def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]: + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) + + # Insert our padding + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) + + return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) + + +class SpecifierSet(BaseSpecifier): + def __init__( + self, specifiers: str = "", prereleases: Optional[bool] = None + ) -> None: + + # Split on , to break each individual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed: Set[_IndividualSpecifier] = set() + for specifier in split_specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self) -> str: + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"" + + def __str__(self) -> str: + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self) -> int: + return hash(self._specs) + + def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet": + if isinstance(other, str): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other: object) -> bool: + if isinstance(other, (str, _IndividualSpecifier)): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __len__(self) -> int: + return len(self._specs) + + def __iter__(self) -> Iterator[_IndividualSpecifier]: + return iter(self._specs) + + @property + def prereleases(self) -> Optional[bool]: + + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + def __contains__(self, item: UnparsedVersion) -> bool: + return self.contains(item) + + def contains( + self, item: UnparsedVersion, prereleases: Optional[bool] = None + ) -> bool: + + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all(s.contains(item, prereleases=prereleases) for s in self._specs) + + def filter( + self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None + ) -> Iterable[VersionTypeVar]: + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered: List[VersionTypeVar] = [] + found_prereleases: List[VersionTypeVar] = [] + + item: UnparsedVersion + parsed_version: Union[Version, LegacyVersion] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py new file mode 100644 index 0000000..9a3d25a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py @@ -0,0 +1,487 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import logging +import platform +import sys +import sysconfig +from importlib.machinery import EXTENSION_SUFFIXES +from typing import ( + Dict, + FrozenSet, + Iterable, + Iterator, + List, + Optional, + Sequence, + Tuple, + Union, + cast, +) + +from . import _manylinux, _musllinux + +logger = logging.getLogger(__name__) + +PythonVersion = Sequence[int] +MacVersion = Tuple[int, int] + +INTERPRETER_SHORT_NAMES: Dict[str, str] = { + "python": "py", # Generic. + "cpython": "cp", + "pypy": "pp", + "ironpython": "ip", + "jython": "jy", +} + + +_32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32 + + +class Tag: + """ + A representation of the tag triple for a wheel. + + Instances are considered immutable and thus are hashable. Equality checking + is also supported. + """ + + __slots__ = ["_interpreter", "_abi", "_platform", "_hash"] + + def __init__(self, interpreter: str, abi: str, platform: str) -> None: + self._interpreter = interpreter.lower() + self._abi = abi.lower() + self._platform = platform.lower() + # The __hash__ of every single element in a Set[Tag] will be evaluated each time + # that a set calls its `.disjoint()` method, which may be called hundreds of + # times when scanning a page of links for packages with tags matching that + # Set[Tag]. Pre-computing the value here produces significant speedups for + # downstream consumers. + self._hash = hash((self._interpreter, self._abi, self._platform)) + + @property + def interpreter(self) -> str: + return self._interpreter + + @property + def abi(self) -> str: + return self._abi + + @property + def platform(self) -> str: + return self._platform + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Tag): + return NotImplemented + + return ( + (self._hash == other._hash) # Short-circuit ASAP for perf reasons. + and (self._platform == other._platform) + and (self._abi == other._abi) + and (self._interpreter == other._interpreter) + ) + + def __hash__(self) -> int: + return self._hash + + def __str__(self) -> str: + return f"{self._interpreter}-{self._abi}-{self._platform}" + + def __repr__(self) -> str: + return f"<{self} @ {id(self)}>" + + +def parse_tag(tag: str) -> FrozenSet[Tag]: + """ + Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. + + Returning a set is required due to the possibility that the tag is a + compressed tag set. + """ + tags = set() + interpreters, abis, platforms = tag.split("-") + for interpreter in interpreters.split("."): + for abi in abis.split("."): + for platform_ in platforms.split("."): + tags.add(Tag(interpreter, abi, platform_)) + return frozenset(tags) + + +def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: + value = sysconfig.get_config_var(name) + if value is None and warn: + logger.debug( + "Config variable '%s' is unset, Python ABI tag may be incorrect", name + ) + return value + + +def _normalize_string(string: str) -> str: + return string.replace(".", "_").replace("-", "_") + + +def _abi3_applies(python_version: PythonVersion) -> bool: + """ + Determine if the Python version supports abi3. + + PEP 384 was first implemented in Python 3.2. + """ + return len(python_version) > 1 and tuple(python_version) >= (3, 2) + + +def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: + py_version = tuple(py_version) # To allow for version comparison. + abis = [] + version = _version_nodot(py_version[:2]) + debug = pymalloc = ucs4 = "" + with_debug = _get_config_var("Py_DEBUG", warn) + has_refcount = hasattr(sys, "gettotalrefcount") + # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled + # extension modules is the best option. + # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 + has_ext = "_d.pyd" in EXTENSION_SUFFIXES + if with_debug or (with_debug is None and (has_refcount or has_ext)): + debug = "d" + if py_version < (3, 8): + with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) + if with_pymalloc or with_pymalloc is None: + pymalloc = "m" + if py_version < (3, 3): + unicode_size = _get_config_var("Py_UNICODE_SIZE", warn) + if unicode_size == 4 or ( + unicode_size is None and sys.maxunicode == 0x10FFFF + ): + ucs4 = "u" + elif debug: + # Debug builds can also load "normal" extension modules. + # We can also assume no UCS-4 or pymalloc requirement. + abis.append(f"cp{version}") + abis.insert( + 0, + "cp{version}{debug}{pymalloc}{ucs4}".format( + version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4 + ), + ) + return abis + + +def cpython_tags( + python_version: Optional[PythonVersion] = None, + abis: Optional[Iterable[str]] = None, + platforms: Optional[Iterable[str]] = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a CPython interpreter. + + The tags consist of: + - cp-- + - cp-abi3- + - cp-none- + - cp-abi3- # Older Python versions down to 3.2. + + If python_version only specifies a major version then user-provided ABIs and + the 'none' ABItag will be used. + + If 'abi3' or 'none' are specified in 'abis' then they will be yielded at + their normal position and not at the beginning. + """ + if not python_version: + python_version = sys.version_info[:2] + + interpreter = f"cp{_version_nodot(python_version[:2])}" + + if abis is None: + if len(python_version) > 1: + abis = _cpython_abis(python_version, warn) + else: + abis = [] + abis = list(abis) + # 'abi3' and 'none' are explicitly handled later. + for explicit_abi in ("abi3", "none"): + try: + abis.remove(explicit_abi) + except ValueError: + pass + + platforms = list(platforms or platform_tags()) + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + if _abi3_applies(python_version): + yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) + yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) + + if _abi3_applies(python_version): + for minor_version in range(python_version[1] - 1, 1, -1): + for platform_ in platforms: + interpreter = "cp{version}".format( + version=_version_nodot((python_version[0], minor_version)) + ) + yield Tag(interpreter, "abi3", platform_) + + +def _generic_abi() -> Iterator[str]: + abi = sysconfig.get_config_var("SOABI") + if abi: + yield _normalize_string(abi) + + +def generic_tags( + interpreter: Optional[str] = None, + abis: Optional[Iterable[str]] = None, + platforms: Optional[Iterable[str]] = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a generic interpreter. + + The tags consist of: + - -- + + The "none" ABI will be added if it was not explicitly provided. + """ + if not interpreter: + interp_name = interpreter_name() + interp_version = interpreter_version(warn=warn) + interpreter = "".join([interp_name, interp_version]) + if abis is None: + abis = _generic_abi() + platforms = list(platforms or platform_tags()) + abis = list(abis) + if "none" not in abis: + abis.append("none") + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + + +def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: + """ + Yields Python versions in descending order. + + After the latest version, the major-only version will be yielded, and then + all previous versions of that major version. + """ + if len(py_version) > 1: + yield f"py{_version_nodot(py_version[:2])}" + yield f"py{py_version[0]}" + if len(py_version) > 1: + for minor in range(py_version[1] - 1, -1, -1): + yield f"py{_version_nodot((py_version[0], minor))}" + + +def compatible_tags( + python_version: Optional[PythonVersion] = None, + interpreter: Optional[str] = None, + platforms: Optional[Iterable[str]] = None, +) -> Iterator[Tag]: + """ + Yields the sequence of tags that are compatible with a specific version of Python. + + The tags consist of: + - py*-none- + - -none-any # ... if `interpreter` is provided. + - py*-none-any + """ + if not python_version: + python_version = sys.version_info[:2] + platforms = list(platforms or platform_tags()) + for version in _py_interpreter_range(python_version): + for platform_ in platforms: + yield Tag(version, "none", platform_) + if interpreter: + yield Tag(interpreter, "none", "any") + for version in _py_interpreter_range(python_version): + yield Tag(version, "none", "any") + + +def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: + if not is_32bit: + return arch + + if arch.startswith("ppc"): + return "ppc" + + return "i386" + + +def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]: + formats = [cpu_arch] + if cpu_arch == "x86_64": + if version < (10, 4): + return [] + formats.extend(["intel", "fat64", "fat32"]) + + elif cpu_arch == "i386": + if version < (10, 4): + return [] + formats.extend(["intel", "fat32", "fat"]) + + elif cpu_arch == "ppc64": + # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? + if version > (10, 5) or version < (10, 4): + return [] + formats.append("fat64") + + elif cpu_arch == "ppc": + if version > (10, 6): + return [] + formats.extend(["fat32", "fat"]) + + if cpu_arch in {"arm64", "x86_64"}: + formats.append("universal2") + + if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: + formats.append("universal") + + return formats + + +def mac_platforms( + version: Optional[MacVersion] = None, arch: Optional[str] = None +) -> Iterator[str]: + """ + Yields the platform tags for a macOS system. + + The `version` parameter is a two-item tuple specifying the macOS version to + generate platform tags for. The `arch` parameter is the CPU architecture to + generate platform tags for. Both parameters default to the appropriate value + for the current system. + """ + version_str, _, cpu_arch = platform.mac_ver() + if version is None: + version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) + else: + version = version + if arch is None: + arch = _mac_arch(cpu_arch) + else: + arch = arch + + if (10, 0) <= version and version < (11, 0): + # Prior to Mac OS 11, each yearly release of Mac OS bumped the + # "minor" version number. The major version was always 10. + for minor_version in range(version[1], -1, -1): + compat_version = 10, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=10, minor=minor_version, binary_format=binary_format + ) + + if version >= (11, 0): + # Starting with Mac OS 11, each yearly release bumps the major version + # number. The minor versions are now the midyear updates. + for major_version in range(version[0], 10, -1): + compat_version = major_version, 0 + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=major_version, minor=0, binary_format=binary_format + ) + + if version >= (11, 0): + # Mac OS 11 on x86_64 is compatible with binaries from previous releases. + # Arm64 support was introduced in 11.0, so no Arm binaries from previous + # releases exist. + # + # However, the "universal2" binary format can have a + # macOS version earlier than 11.0 when the x86_64 part of the binary supports + # that version of macOS. + if arch == "x86_64": + for minor_version in range(16, 3, -1): + compat_version = 10, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=compat_version[0], + minor=compat_version[1], + binary_format=binary_format, + ) + else: + for minor_version in range(16, 3, -1): + compat_version = 10, minor_version + binary_format = "universal2" + yield "macosx_{major}_{minor}_{binary_format}".format( + major=compat_version[0], + minor=compat_version[1], + binary_format=binary_format, + ) + + +def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: + linux = _normalize_string(sysconfig.get_platform()) + if is_32bit: + if linux == "linux_x86_64": + linux = "linux_i686" + elif linux == "linux_aarch64": + linux = "linux_armv7l" + _, arch = linux.split("_", 1) + yield from _manylinux.platform_tags(linux, arch) + yield from _musllinux.platform_tags(arch) + yield linux + + +def _generic_platforms() -> Iterator[str]: + yield _normalize_string(sysconfig.get_platform()) + + +def platform_tags() -> Iterator[str]: + """ + Provides the platform tags for this installation. + """ + if platform.system() == "Darwin": + return mac_platforms() + elif platform.system() == "Linux": + return _linux_platforms() + else: + return _generic_platforms() + + +def interpreter_name() -> str: + """ + Returns the name of the running interpreter. + """ + name = sys.implementation.name + return INTERPRETER_SHORT_NAMES.get(name) or name + + +def interpreter_version(*, warn: bool = False) -> str: + """ + Returns the version of the running interpreter. + """ + version = _get_config_var("py_version_nodot", warn=warn) + if version: + version = str(version) + else: + version = _version_nodot(sys.version_info[:2]) + return version + + +def _version_nodot(version: PythonVersion) -> str: + return "".join(map(str, version)) + + +def sys_tags(*, warn: bool = False) -> Iterator[Tag]: + """ + Returns the sequence of tag triples for the running interpreter. + + The order of the sequence corresponds to priority order for the + interpreter, from most to least important. + """ + + interp_name = interpreter_name() + if interp_name == "cp": + yield from cpython_tags(warn=warn) + else: + yield from generic_tags() + + if interp_name == "pp": + yield from compatible_tags(interpreter="pp3") + else: + yield from compatible_tags() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000..bab11b8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py @@ -0,0 +1,136 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import re +from typing import FrozenSet, NewType, Tuple, Union, cast + +from .tags import Tag, parse_tag +from .version import InvalidVersion, Version + +BuildTag = Union[Tuple[()], Tuple[int, str]] +NormalizedName = NewType("NormalizedName", str) + + +class InvalidWheelFilename(ValueError): + """ + An invalid wheel filename was found, users should refer to PEP 427. + """ + + +class InvalidSdistFilename(ValueError): + """ + An invalid sdist filename was found, users should refer to the packaging user guide. + """ + + +_canonicalize_regex = re.compile(r"[-_.]+") +# PEP 427: The build number must start with a digit. +_build_tag_regex = re.compile(r"(\d+)(.*)") + + +def canonicalize_name(name: str) -> NormalizedName: + # This is taken from PEP 503. + value = _canonicalize_regex.sub("-", name).lower() + return cast(NormalizedName, value) + + +def canonicalize_version(version: Union[Version, str]) -> str: + """ + This is very similar to Version.__str__, but has one subtle difference + with the way it handles the release segment. + """ + if isinstance(version, str): + try: + parsed = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + else: + parsed = version + + parts = [] + + # Epoch + if parsed.epoch != 0: + parts.append(f"{parsed.epoch}!") + + # Release segment + # NB: This strips trailing '.0's to normalize + parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in parsed.release))) + + # Pre-release + if parsed.pre is not None: + parts.append("".join(str(x) for x in parsed.pre)) + + # Post-release + if parsed.post is not None: + parts.append(f".post{parsed.post}") + + # Development release + if parsed.dev is not None: + parts.append(f".dev{parsed.dev}") + + # Local version segment + if parsed.local is not None: + parts.append(f"+{parsed.local}") + + return "".join(parts) + + +def parse_wheel_filename( + filename: str, +) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]: + if not filename.endswith(".whl"): + raise InvalidWheelFilename( + f"Invalid wheel filename (extension must be '.whl'): {filename}" + ) + + filename = filename[:-4] + dashes = filename.count("-") + if dashes not in (4, 5): + raise InvalidWheelFilename( + f"Invalid wheel filename (wrong number of parts): {filename}" + ) + + parts = filename.split("-", dashes - 2) + name_part = parts[0] + # See PEP 427 for the rules on escaping the project name + if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: + raise InvalidWheelFilename(f"Invalid project name: {filename}") + name = canonicalize_name(name_part) + version = Version(parts[1]) + if dashes == 5: + build_part = parts[2] + build_match = _build_tag_regex.match(build_part) + if build_match is None: + raise InvalidWheelFilename( + f"Invalid build number: {build_part} in '{filename}'" + ) + build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) + else: + build = () + tags = parse_tag(parts[-1]) + return (name, version, build, tags) + + +def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: + if filename.endswith(".tar.gz"): + file_stem = filename[: -len(".tar.gz")] + elif filename.endswith(".zip"): + file_stem = filename[: -len(".zip")] + else: + raise InvalidSdistFilename( + f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" + f" {filename}" + ) + + # We are requiring a PEP 440 version, which cannot contain dashes, + # so we split on the last dash. + name_part, sep, version_part = file_stem.rpartition("-") + if not sep: + raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") + + name = canonicalize_name(name_part) + version = Version(version_part) + return (name, version) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py new file mode 100644 index 0000000..de9a09a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py @@ -0,0 +1,504 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import collections +import itertools +import re +import warnings +from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union + +from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType + +__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] + +InfiniteTypes = Union[InfinityType, NegativeInfinityType] +PrePostDevType = Union[InfiniteTypes, Tuple[str, int]] +SubLocalType = Union[InfiniteTypes, int, str] +LocalType = Union[ + NegativeInfinityType, + Tuple[ + Union[ + SubLocalType, + Tuple[SubLocalType, str], + Tuple[NegativeInfinityType, SubLocalType], + ], + ..., + ], +] +CmpKey = Tuple[ + int, Tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType +] +LegacyCmpKey = Tuple[int, Tuple[str, ...]] +VersionComparisonMethod = Callable[ + [Union[CmpKey, LegacyCmpKey], Union[CmpKey, LegacyCmpKey]], bool +] + +_Version = collections.namedtuple( + "_Version", ["epoch", "release", "dev", "pre", "post", "local"] +) + + +def parse(version: str) -> Union["LegacyVersion", "Version"]: + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion: + _key: Union[CmpKey, LegacyCmpKey] + + def __hash__(self) -> int: + return hash(self._key) + + # Please keep the duplicated `isinstance` check + # in the six comparisons hereunder + # unless you find a way to avoid adding overhead function calls. + def __lt__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key < other._key + + def __le__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key <= other._key + + def __eq__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key == other._key + + def __ge__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key >= other._key + + def __gt__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key > other._key + + def __ne__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key != other._key + + +class LegacyVersion(_BaseVersion): + def __init__(self, version: str) -> None: + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + warnings.warn( + "Creating a LegacyVersion has been deprecated and will be " + "removed in the next major release", + DeprecationWarning, + ) + + def __str__(self) -> str: + return self._version + + def __repr__(self) -> str: + return f"" + + @property + def public(self) -> str: + return self._version + + @property + def base_version(self) -> str: + return self._version + + @property + def epoch(self) -> int: + return -1 + + @property + def release(self) -> None: + return None + + @property + def pre(self) -> None: + return None + + @property + def post(self) -> None: + return None + + @property + def dev(self) -> None: + return None + + @property + def local(self) -> None: + return None + + @property + def is_prerelease(self) -> bool: + return False + + @property + def is_postrelease(self) -> bool: + return False + + @property + def is_devrelease(self) -> bool: + return False + + +_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) + +_legacy_version_replacement_map = { + "pre": "c", + "preview": "c", + "-": "final-", + "rc": "c", + "dev": "@", +} + + +def _parse_version_parts(s: str) -> Iterator[str]: + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version: str) -> LegacyCmpKey: + + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts: List[str] = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + + return epoch, tuple(parts) + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P[0-9]+)!)? # epoch + (?P[0-9]+(?:\.[0-9]+)*) # release segment + (?P

      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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..773ada2506ec734129f1144f67d804783ffa6486 GIT binary patch literal 38664 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73f075e5a1c6ed0af29b8ec3bddeba2c7681d4f1 GIT binary patch literal 651 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f57cee4850c031bc36e6ee908569013ed948d1f0 GIT binary patch literal 2376 zcmaJ>%}*Og6rWjtur|9Gs38WWmD7+AS1MZ|CM3-lUjZuwDjS-1rD|ln6SHC0c4yZ# zRF0HGq!Ou7PgM@R^;V^a{t3DFLS&>yBcdF7>WvDbL^*Y4)?bjybC`Mae)HbEdGGh; zPgM;AHqLK+nNM^B@HgMoN1!Gg{K|wUzyJocfDLsBxhz?d?bCfi_E~;Apa<-r9u#}O z)nUuJY=`ua*axhz-Klp9IcO=is;hRF-epJhh~2Gs+dX=Z-K+NsyuH}L!Lj4D_T>{eHne{BmV0WGr%cUD9&gsdQ>;3Ef(rom-?QZ>N@Kmv3j#=vZ>}IGT`X zf5Y|ynorNo-K^QgTI|MK5qAGT3zkF+bJOX$+n!k>NTaFgTa(EoO0Q-z%`k*^V&a%K z*0}t=^Ea1MlPG=c{J^cLnVGNCsl~j|0kT$Qs zh*nn9H&dB~26iH27V;LJ-g0rR241>zH7bdvRx@xAXWJhbvoO%10d&cbw!s}}z=w+N z+XnZb?$3aPk47@nGntlJ=6IRwBf_gHDv;+lAE^M;czXrh9j>2iu1yYX zfrNkQ2J7KY(?JApV&Y(fb{4WWMkVoAtR$i|;FL?4P#Gb!V7dqqKl4TSB_zZq+T&ms z*+m0eH6w>`CK8oTytafFk#I&3{=*VpdBO=sI0s3PPrR0-hfTD@yV;=uf|=(;fchP5 z-J$Bb__Jzv&_1h}H*;AF9aTp+O{e^xHiS^l$~q204!<(a#)EhFG`rwxIc?Qp@78W$ z7Z>8Q#57E87CRemv81s`?qYYU;FxO`*6b}@*wid@O)G7=>&3$O$mp2nm@fXbl+A5q z^Vrc!W=TVvxL_2CmSZ2UfnCj6%Q<=e`+DyhDQ%Gf7Q^?kW34<=&+j-xojo?aeE{}k z^-;%jIkqbg?!|_F>DpHJ;urRmGk+wX*@r&qRCq`J@GuNK-T7zVFkPJKPVNUmsQ)i{ z__;j1bMDH{wal)(a;N}xXm{vpRk^mOoZcOptST3UaJi~n5yF+Ka`hg6TH6r{MrHaQauWW+!wAacO@@r))pCx9t zAUNOTFzw=Ko?yJ;Aq}3>2uD139wZv4n`=qgaT>lvdx%C6eIq(ZG!Jhms`B&hde-!O z@Rp&%2g~4w>8yKd(L@o(I`3Jv@I|}wy!-~d=kr9plP@zHmglR4la6Q5nPk(x4?_6* w5`g0`!P!^ft5;z0C75_4cR=Y4VAJbv07sbSB{+W=JPZ4F`p>-vY!#mW13oG-tpET3 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..004730653ce3ea463bacf1e4700321366ebb89e4 GIT binary patch literal 4514 zcmbUlZA=^4@$K4c)?iozCgvjn6G9Rv7hLm^yXKN3In3pw0U9uAWnHy0-i4UhYx;IM z1>{80DN;eoHKb}qBAt5lPfL{k$o*>iqf+|sr2b(;TDz-6jnwN8{-Khnr~A{+?0OyJ zgkF0i^LFOVym|BH&6_umKUG&(5`f;z7pHzB5b}2>0%wgirlrzo6I1}emu5?ALBF)EmlXj)t>B?B8iC3hm(w>;d#Q9Wpx+Ye`5SE-K zlKTdcDrL`ohc#zRn5znUHjoH11~;xGGs*^IQH^8g&W=Trsz#F&vl=i?De=^tnp8ou zZXhEim8mf;uE|63#HFMn2U){YK+SH$^L?6`u!UeuJ?b0CD4KjlD^ay;Xf~xK-=EXu zflF~ZCTloMrZAuy2Z&=s;?PKB@O;9u*lL{xV(S_pKLMx7B*sW2#!Bu5GRa8n4NuHb zz#V`)Wlmyb*CZ=BZ#eH42FEIjyet z7RVJQ<{cx!N~01DwahkLRMuvxl0YZgfX>FhtzSd)3uc*UHis-SS@H=4fNc{)G&>xK z=CZ}^7qn%GXs?`TRYh(A0d8@G20>UW{}>NhS1Rb;%K6Dp04cPdhDfpQ-+pKx-t03+&cc%-*TA{HQy;yxyfCc6FJvzT9 z$9L#_$DjF5+5#fmR))c9hC6ClCSW^!%V8Qfx(vpMWie~oX?Sp#AWTFho|f-1v=PKr zR35O*M%(87C1#h(ccZWmn(O4bP@fa_>B7F85Y~n88Xtb$W)QS&MmH~$IVQ*s8~nNW zOk9CTy+>#p^p{L-@Ts^mH4A~YEnw``5g|*=kA6zXhcMq&_NrrtjX(>^AnUMoTybF^rfnElt<^B?_yUPTC+^$vG*rpQ$unbVA%G~_J4!&+L69>{huvfV(E3u|c zi7f8b-q&R%$8qQc-oDp))0m{nUiG} z=1!j9!3RfPm$&19cEgy^&V1m0=XLJo2xj*Zi@qV2LCYIf1l3H%@O*ox8i1d5F9t3p zwE$e?85)Rd0Zd`QqZlU?59S798<@a0{tXapqF7i^JgJ6TR%X*Og%Z)IRG{dC+y^+t zd}DBfqoX6EhAWksnt}?0ljMonDT)V*c3{J!kZX7(Dh>@AE^DOWIvX8Bn*U&Ad^jSW zjT+oo^wen7sGovcA~8#;tiTs;jg+hyl_HcB7HQol&PiF8pr%1940mKOIyewLJAB#@ zrZSo+E1B7;OQICl;zo_BE~88)C0R+xM%~z%k z6FmbrR-q^|r{K{N5lm6BYzmlQ-CTV@&kH3t7g}}#FqP=D*%;t1+B z+u>YmSZ@t4Ie%VdcpD0Oy7jj1$3pkh)sdo0A81UohwE(tTa|#@(L@cZF4E^~^obYRy{X+YcLG zIM{|=n=aDOWXa@wJ-V;wLF9KMpN~BH;a_~i&v5~zIsz-TD;Iv%u-d4%haa4J$b3Hd z@QmIYS!*18bY%x^XC7X7RQvn!M;E@R{p0vr@Atj{#TPgG(65{Ckk-(T=N z73!9buk2nIy4LtEvoH&?v<8$82W#=6gSDn8Lh=yP8EH0!xJML!JR4709P^Q27Sjd~ z84{jH+MMBls;(q?;i3!01r1b@b?adN&DlJlws7pUo)4aiJCNUj#m;kIeapgI>d>&CS4@ zo|;SaVuCAu_gPQDIx7pBc{XkRbHIE!8XR5-s(Aqv68!W`LeZ{RuS6j|Q7GW8n}@>1 z4R-+as_@9H0>ZR{?nMkA9j1G}=8sz&^&TCAK71aihoRYYFbwnZ9l|vIgB*QEy8lLw bJR=95k)CIy{e^3QVM1%Q2VN3HOlAK8Cw#5R literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73020eb8cd80702f0194b2e554d29256a89f234e GIT binary patch literal 12288 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 DS-xMc literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ca48fada1afd63daa114e51f9333869220c58fb GIT binary patch literal 9998 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 N_uA#JD14Ik{|!D%7JL8z literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42126e6474d5decc7e35e5b148daa520e1214638 GIT binary patch literal 3194 zcma(TO>Y~=b#}Q+Ex$yGlql2sb`0B$YY~#|#xMlAt|Wf|7L`a;4n%_m#U09&$R#to z3`~LsghFU3z=0j0g-X%w}3=+6=@wCNK>%mvBQ#`@RVE;_Y1a(2vlCu zGkN`mVC{U#h*bzj1q!|5~3y~9Gbg|(t_sL@Ft|zT7tEVotlU{ z(xN7BNRL|r63QOd*@ks#9oUUM*qau^zzOGkX-QKyq(mpI{UE~y>#i!gB_z5RQN%;t z?6Q`+E0*l%m#C9qvq7N(RoRsY_K;*`#5ps==g=tp998bGjK#MVAarjOZ0? zVtr(WWVB3l1{-T;z7Q>t{3qcfdi=(*`)<1}5Gt1FJ$-J4@&yI~xM2(Dz&lHlW zwd4vmqJ>N$s(yfVEl;BC78*9AMKgT?1c8r@6-uNFzFiK!GQ^mz(@7v0rvd!5j-DyL z&5oLKc67MqG@$&N<-i7e)?t#Y zvD%6qd(Y-qcHvgs<0v803FL@G{4kLq1KkV+80Z1edTi3i5R6{#YEzz@=nP{!4#3uY z(|53F_tUflXCU=5V>M?KbU%33iHk>pFVw5B+~%rHJ&y2{ORWwtZ2_CiRsfILJQ3 z+sNOxf2o^)i7Lw_6RU@#)0vgOcoCZ#sQhv_sL|A zbzm@=hH&Rk|Kk;y{SOS=oi$arJ zcpB6^(gAoX&n_&?FA!#R>Wt0D)wx;fv>2%KdVG=Xl`Hd0u^IJxoXU&w%L{QDT!DB> z6$!yQ%#ir9Sm!waQa2M#T{E-s+3EQ8*j3uedGmTYqhURTX<+f%{6c(sDXzw^EzH8^ z#th^WW;HU(E+M2KWLrs|$uijWM_^dtETu8l%Ko-6W{8WxW7Gkxqegf52jq7Brh2*2 zKm7NpzfINq&(-?RefrK$|6A1?4S)Z~mHO~_ZFqd!KmKg!&HB)IZD{fvZD9NqRr8~$M3f2`&|w&Oqkz^tE~s-2wL_D}8m z=5v4WZh5o(R0+SHkXT~i$$_N;=%$3*P;U=Q3!1nFUO+}GjNYDJ;2ax=pDKexlp*+T zL(@_b%8&{cApwC?NwJkruKugs^U3#@Ua(Zq>MWXR(Y^YNydOs4!2oyzo*Or*|-FN*|fLnY2&tT0n_(0h9j5fT1ds;no zsunu+@Ob^r$r}7ZlQr*T^-3ccx*z&z@~L;Y;qR^b_}jrfydWwT39z<;l>$|zZdJ|Y zwPKd7y{h_tF`2a}2Y<%iaccu_;MNvc#i_ zu#!UMbT*$fxvJ2xSS?8kXS1pr5eQ2_ym0)^s+TP35C)Dj!utSz+CYt-zV*46k|g)O z^g86>rW-jso1!51-B101VA^%qh^Di(3fzB#kpg?9K-1YRAHBcy;QYhL(>Ko62G2DS zAf62DvZ;AOmO~HZ{~(z7WAQu0B3|k=O9kkDEj4|udTBK`gcVB~up*TQea`Bkd9y}k z49%IrQ%ozjgz)mv7ZhmRGs*KP!`#EvCpU;8-~|jsa*o1VMOt0SV#n(5Y|G X#JA|oH)!-n=a>+>H~134#IO8cvofL4 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1aa2ffea8cbd6aae69696b7bb1f63a85553ccd54 GIT binary patch literal 507 zcmYLGJ#Q015WS6UIoc>tL6c_aaFJcYM-!na0fR&nqy$p9Iqlt!eH-8Hu6FkfmkNFb z`~^hKuSgY9fZXN}1ck~K>*Oq^n3<<}(!4iwzPU-07*D4slfSWEF2O1~ZF9|H^CgkV zD3N4Dkev2bl>b$(eJ8hQ)M+|{?%5Ceu23E-BkK|YKPn$Q7+p3H40u)9QjHsM7@WeH z(h~>;!VH~PMuV=a3>}y;F+tBL z-4%5xjN65w(D0%Z`i2G%rO+%}!Tm`kRLOEv4d_|#8QWox7K9xRy7PXTN|UGQd?QU; zX%X~%)E?&jlUGN_Z{8k$ORks37nWB#@SMN*(FA{u0W}Prl8O(}PlK`CI&+HQKzo&y z$g2kRjF&3owuvJ36Sni1dlhhdWq?~{d0ecealAFiTOG_ci}mNX*WGi=Coa$LAH;Ok kA%y%{>yhr&o#gKQPaD7Ky +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 +# fmt: off +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) +# fmt: on diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..ef09c60 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import Big5DistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self) -> str: + return "Big5" + + @property + def language(self) -> str: + return "Chinese" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000..176cb99 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,261 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import Tuple, Union + +from .big5freq import ( + BIG5_CHAR_TO_FREQ_ORDER, + BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO, +) +from .euckrfreq import ( + EUCKR_CHAR_TO_FREQ_ORDER, + EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO, +) +from .euctwfreq import ( + EUCTW_CHAR_TO_FREQ_ORDER, + EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO, +) +from .gb2312freq import ( + GB2312_CHAR_TO_FREQ_ORDER, + GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO, +) +from .jisfreq import ( + JIS_CHAR_TO_FREQ_ORDER, + JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO, +) +from .johabfreq import JOHAB_TO_EUCKR_ORDER_TABLE + + +class CharDistributionAnalysis: + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self) -> None: + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order: Tuple[int, ...] = tuple() + self._table_size = 0 # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = 0.0 + self._done = False + self._total_chars = 0 + self._freq_chars = 0 + self.reset() + + def reset(self) -> None: + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char: Union[bytes, bytearray], char_len: int) -> None: + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self) -> float: + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = self._freq_chars / ( + (self._total_chars - self._freq_chars) * self.typical_distribution_ratio + ) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self) -> bool: + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, _: Union[bytes, bytearray]) -> int: + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self) -> None: + super().__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self) -> None: + super().__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + return -1 + + +class JOHABDistributionAnalysis(CharDistributionAnalysis): + def __init__(self) -> None: + super().__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: + first_char = byte_str[0] + if 0x88 <= first_char < 0xD4: + code = first_char * 256 + byte_str[1] + return JOHAB_TO_EUCKR_ORDER_TABLE.get(code, -1) + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self) -> None: + super().__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self) -> None: + super().__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + return 157 * (first_char - 0xA4) + second_char - 0x40 + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self) -> None: + super().__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if 0x81 <= first_char <= 0x9F: + order = 188 * (first_char - 0x81) + elif 0xE0 <= first_char <= 0xEF: + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self) -> None: + super().__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xA1 + return -1 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..6def56b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import List, Optional, Union + +from .charsetprober import CharSetProber +from .enums import LanguageFilter, ProbingState + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: + super().__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers: List[CharSetProber] = [] + self._best_guess_prober: Optional[CharSetProber] = None + + def reset(self) -> None: + super().reset() + self._active_num = 0 + for prober in self.probers: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self) -> Optional[str]: + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self) -> Optional[str]: + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + for prober in self.probers: + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + self._state = ProbingState.FOUND_IT + return self.state + if state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self) -> float: + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + if state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober.active: + self.logger.debug("%s not active", prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug( + "%s %s confidence = %s", prober.charset_name, prober.language, conf + ) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..a103ca1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,147 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re +from typing import Optional, Union + +from .enums import LanguageFilter, ProbingState + +INTERNATIONAL_WORDS_PATTERN = re.compile( + b"[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?" +) + + +class CharSetProber: + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: + self._state = ProbingState.DETECTING + self.active = True + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self) -> None: + self._state = ProbingState.DETECTING + + @property + def charset_name(self) -> Optional[str]: + return None + + @property + def language(self) -> Optional[str]: + raise NotImplementedError + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + raise NotImplementedError + + @property + def state(self) -> ProbingState: + return self._state + + def get_confidence(self) -> float: + return 0.0 + + @staticmethod + def filter_high_byte_only(buf: Union[bytes, bytearray]) -> bytes: + buf = re.sub(b"([\x00-\x7F])+", b" ", buf) + return buf + + @staticmethod + def filter_international_words(buf: Union[bytes, bytearray]) -> bytearray: + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = INTERNATIONAL_WORDS_PATTERN.findall(buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b"\x80": + last_char = b" " + filtered.extend(last_char) + + return filtered + + @staticmethod + def remove_xml_tags(buf: Union[bytes, bytearray]) -> bytes: + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + buf = memoryview(buf).cast("c") + + for curr, buf_char in enumerate(buf): + # Check if we're coming out of or entering an XML tag + + # https://github.com/python/typeshed/issues/8182 + if buf_char == b">": # type: ignore[comparison-overlap] + prev = curr + 1 + in_tag = False + # https://github.com/python/typeshed/issues/8182 + elif buf_char == b"<": # type: ignore[comparison-overlap] + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b" ") + in_tag = True + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2a91e19568af5b3682b0c45857de96c1ed17ab7 GIT binary patch literal 214 zcmZ8bK?=e!5Nxc12>pXs4|dUBMG%TdZ+Z>2UD~y65|Xr#m-q(X;xl}K^wyK<)q&la zSr%sAQM3v?lKNIo{F&B2hPl5y0~c)AgCUDsmF0C-q5(w;c#oox8uBXB1^R%7fO8UL cIggbamxopsU4uux@GY1hGl_4=7}KFwKa&DFwg3PC literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fa08d0dbc1ebfa7420d9f2406f7a5dffb66a547 GIT binary patch literal 4031 zcma)9O>7&-6`mz`m*nzCqWmk_ut$dDnu$n8PGh*VVb`^y#6VyhmK>xk3~I$4N-HgQ z+1aHO5;W=nDJmldEMFoOL4XuJ^hY}6m_rZgsfS*qq=4zIiy8=e$c>Ja9&+k?ORh*M zHqa5c^Y`Y>n|a@S@9FRHxI&=3Hvi7dpJRl4jUB&0-z!_|P^}P+ zpbi?rvX~dkQeG;{d08Nus7Xes9L|TmwroVoN?s92#QW3wwGb0obP#lEVHVROEUqc= zi!zzTaI~aou@9ttLQ86K7?awgo_tgblte87vwf^z>zhAK2oDDc>s#{-B}5>#KrN6O zP>%_OC=*4lR~))Hs~2afqs}v%S|+0wr)7&XTG9 zhZP+L)|o|1)6E%MQQmk@EmsVd%P9(l@)9l1s=O^oZL7>Yo!GEI2gjZ#=TGJ6qHb!| zqMaT+^ZFU+IJ2~9nI&C=Js5p8^ZJhXj)ELj?V_&#KzKCss-j#iQPc7d0cWakYXOvL zBUE=fN7ms?x>>0@w8X74wH-K0Mp3@OE4!8oy5Xx1eyF}G4Fyb?n;JkGTRkRwana5SvU2vYPkFDS*vPj1ODOd*`9uOqoR>cdOpsJa{R}aSsJiLh5LLlf9AF1Pv;oP}*aTFe zkEhXJ)W;>YN+9e(&*Gj2100E?Z3Q;C8};TYDp$+Yb5@Q{f-0{`9gEH|fC~)tsLZt2 zIJHVgE=PT&pz7(G!|YzQ=;R!|249@+SOe%b40uHV9vt=d>(Sd@16KAbdLC?YlumeP zqKgb(Dz2k#K<$`p!#O-Pc+?jcI3>Joj{wS+#<)q@FRS{3YB1BWFZI~=0yF5;)U;(8 zQ&XO3O5jM7ZrH!LdLT#Z$sascSLr_UdNhZRmNUC*I4PNjQ9%UnQ{`N(xnhYi%@sA^ zDpx8Rmd)_dc)}r$@Z^X=9>tHhxlnaQyjgw#hU^f0I>-NhF)RJL4W=0eucr?ZusGi#ZzWk%0rZQWt%idvjkXPBL> z=#?z+0k9a)cE~SVG<3fWzRpx?ZlaA@k4Xwvi6i6>qjf9rxl6WBlE~0T_R2rPV|On% z`wx6eBxztteA0J#b^nLIS`wS#$OHMFyyV=EJ&nd5oc-|Z<5;p41))}qNb+yqeE-c4 zt~TR|2k+i{_wM-PP@>s)V0mt{Z+Ig-+ziE+=DrLKHU|zaA6(|Er#>Cp92(geOmCzw ze!lR9v3Y4?r@Ct!83i>7C{C8`0w%;_)pojku!9XBLV(31Qm z9qab|7K~EA-L2OTtaa|oKc7JEGm+E|rViD=_PFCM$T|$jNs3mvj0p%nVG8K0mXV6Q zoCIhYXl)jA58!f@LpHLT%Mq+Oig6q1b!YJi1HrGym zQf`1xyTZ#U(G_QzQE^2)hAWwH5ZeuPgzJ%Xx|7M&U%mlx7;e}!YP+K(>;rBwHOK*} zRdpcAauwTwDcFhs2tM`S|J`6Ri2W$@wPqvY^ra(JWvL@P?9 z!`nob!fdbRSTj7(jGsq=h$kR{0L09lt@o{7{cP|r=RZ$x zWZ!B9J&^#2$RsxKD0*}=dUSR2tLTZlV^8DB2l;#XZ%JHImV_om;dA%S-OoLNI2;Hj zk8Fp@!NHaM!~AzqIiA=~kVxW5Y^d3vTpnFH`|#|iKmNmo-(C1Z``i3q=eL7_c;dUD z7*U?>17&;&FD_gt;MKu@6hWSWf${N_fB*;;3Yt|c6nF{-c^XA!c%A@bj**Jv^>d7E zE@`_tS@r)NX%mRW+X11$U@;y#Iwfp<@ezWkPuc4c9CBJ zA&lYnNAPI{1wnWghza7>F(UN;lPLctuWXW6{zHcTMMmNBlZTu82b;sEo<)uev>DyE z{KmaYtsu0YD)E*CHC%3DpcTSam>fCYLOEC`Czguu-`5 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..43f6e14 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,112 @@ +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + + +import argparse +import sys +from typing import Iterable, List, Optional + +from .. import __version__ +from ..universaldetector import UniversalDetector + + +def description_of( + lines: Iterable[bytes], + name: str = "stdin", + minimal: bool = False, + should_rename_legacy: bool = False, +) -> Optional[str]: + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + :param should_rename_legacy: Should we rename legacy encodings to + their more modern equivalents? + :type should_rename_legacy: ``bool`` + """ + u = UniversalDetector(should_rename_legacy=should_rename_legacy) + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if minimal: + return result["encoding"] + if result["encoding"]: + return f'{name}: {result["encoding"]} with confidence {result["confidence"]}' + return f"{name}: no result" + + +def main(argv: Optional[List[str]] = None) -> None: + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description=( + "Takes one or more file paths and reports their detected encodings" + ) + ) + parser.add_argument( + "input", + help="File whose encoding we would like to determine. (default: stdin)", + type=argparse.FileType("rb"), + nargs="*", + default=[sys.stdin.buffer], + ) + parser.add_argument( + "--minimal", + help="Print only the encoding to standard output", + action="store_true", + ) + parser.add_argument( + "-l", + "--legacy", + help="Rename legacy encodings to more modern ones.", + action="store_true", + ) + parser.add_argument( + "--version", action="version", version=f"%(prog)s {__version__}" + ) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print( + "You are running chardetect interactively. Press " + "CTRL-D twice at the start of a blank line to signal the " + "end of your input. If you want help, run chardetect " + "--help\n", + file=sys.stderr, + ) + print( + description_of( + f, f.name, minimal=args.minimal, should_rename_legacy=args.legacy + ) + ) + + +if __name__ == "__main__": + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000..8ed4a87 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,90 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .codingstatemachinedict import CodingStateMachineDict +from .enums import MachineState + + +class CodingStateMachine: + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + + def __init__(self, sm: CodingStateMachineDict) -> None: + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = MachineState.START + self.active = True + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self) -> None: + self._curr_state = MachineState.START + + def next_state(self, c: int) -> int: + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model["class_table"][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model["char_len_table"][byte_class] + # from byte's class and state_table, we get its next state + curr_state = self._curr_state * self._model["class_factor"] + byte_class + self._curr_state = self._model["state_table"][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self) -> int: + return self._curr_char_len + + def get_coding_state_machine(self) -> str: + return self._model["name"] + + @property + def language(self) -> str: + return self._model["language"] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py new file mode 100644 index 0000000..7a3c4c7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py @@ -0,0 +1,19 @@ +from typing import TYPE_CHECKING, Tuple + +if TYPE_CHECKING: + # TypedDict was introduced in Python 3.8. + # + # TODO: Remove the else block and TYPE_CHECKING check when dropping support + # for Python 3.7. + from typing import TypedDict + + class CodingStateMachineDict(TypedDict, total=False): + class_table: Tuple[int, ...] + class_factor: int + state_table: Tuple[int, ...] + char_len_table: Tuple[int, ...] + name: str + language: str # Optional key + +else: + CodingStateMachineDict = dict diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..fa7307e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self) -> str: + return "CP949" + + @property + def language(self) -> str: + return "Korean" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..5e3e198 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py @@ -0,0 +1,85 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +from enum import Enum, Flag + + +class InputState: + """ + This enum represents the different states a universal detector can be in. + """ + + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(Flag): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + + NONE = 0x00 + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(Enum): + """ + This enum represents the different states a prober can be in. + """ + + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState: + """ + This enum represents the different states a state machine can be in. + """ + + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood: + """ + This enum represents the likelihood of a character following the previous one. + """ + + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls) -> int: + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory: + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..fd71383 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py @@ -0,0 +1,102 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import Optional, Union + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, MachineState, ProbingState +from .escsm import ( + HZ_SM_MODEL, + ISO2022CN_SM_MODEL, + ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL, +) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: + super().__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = 0 + self._detected_charset: Optional[str] = None + self._detected_language: Optional[str] = None + self._state = ProbingState.DETECTING + self.reset() + + def reset(self) -> None: + super().reset() + for coding_sm in self.coding_sm: + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self) -> Optional[str]: + return self._detected_charset + + @property + def language(self) -> Optional[str]: + return self._detected_language + + def get_confidence(self) -> float: + return 0.99 if self._detected_charset else 0.00 + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..11d4adf --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,261 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .codingstatemachinedict import CodingStateMachineDict +from .enums import MachineState + +# fmt: off +HZ_CLS = ( + 1, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 + 0, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 4, 0, 5, 2, 0, # 78 - 7f + 1, 1, 1, 1, 1, 1, 1, 1, # 80 - 87 + 1, 1, 1, 1, 1, 1, 1, 1, # 88 - 8f + 1, 1, 1, 1, 1, 1, 1, 1, # 90 - 97 + 1, 1, 1, 1, 1, 1, 1, 1, # 98 - 9f + 1, 1, 1, 1, 1, 1, 1, 1, # a0 - a7 + 1, 1, 1, 1, 1, 1, 1, 1, # a8 - af + 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7 + 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf + 1, 1, 1, 1, 1, 1, 1, 1, # c0 - c7 + 1, 1, 1, 1, 1, 1, 1, 1, # c8 - cf + 1, 1, 1, 1, 1, 1, 1, 1, # d0 - d7 + 1, 1, 1, 1, 1, 1, 1, 1, # d8 - df + 1, 1, 1, 1, 1, 1, 1, 1, # e0 - e7 + 1, 1, 1, 1, 1, 1, 1, 1, # e8 - ef + 1, 1, 1, 1, 1, 1, 1, 1, # f0 - f7 + 1, 1, 1, 1, 1, 1, 1, 1, # f8 - ff +) + +HZ_ST = ( +MachineState.START, MachineState.ERROR, 3, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07 +MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f +MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.START, MachineState.START, 4, MachineState.ERROR, # 10-17 + 5, MachineState.ERROR, 6, MachineState.ERROR, 5, 5, 4, MachineState.ERROR, # 18-1f + 4, MachineState.ERROR, 4, 4, 4, MachineState.ERROR, 4, MachineState.ERROR, # 20-27 + 4, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 28-2f +) +# fmt: on + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL: CodingStateMachineDict = { + "class_table": HZ_CLS, + "class_factor": 6, + "state_table": HZ_ST, + "char_len_table": HZ_CHAR_LEN_TABLE, + "name": "HZ-GB-2312", + "language": "Chinese", +} + +# fmt: off +ISO2022CN_CLS = ( + 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 + 0, 3, 0, 0, 0, 0, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 4, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 + 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f + 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 + 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f + 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 + 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef + 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 + 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff +) + +ISO2022CN_ST = ( + MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07 + MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f + MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17 + MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, # 18-1f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 20-27 + 5, 6, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 28-2f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 30-37 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, # 38-3f +) +# fmt: on + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL: CodingStateMachineDict = { + "class_table": ISO2022CN_CLS, + "class_factor": 9, + "state_table": ISO2022CN_ST, + "char_len_table": ISO2022CN_CHAR_LEN_TABLE, + "name": "ISO-2022-CN", + "language": "Chinese", +} + +# fmt: off +ISO2022JP_CLS = ( + 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 0, 0, 0, 0, 2, 2, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 7, 0, 0, 0, # 20 - 27 + 3, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 6, 0, 4, 0, 8, 0, 0, 0, # 40 - 47 + 0, 9, 5, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 + 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f + 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 + 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f + 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 + 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef + 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 + 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff +) + +ISO2022JP_ST = ( + MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07 + MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17 + MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, # 18-1f + MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 20-27 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 6, MachineState.ITS_ME, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, # 28-2f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, # 30-37 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 38-3f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, MachineState.START, # 40-47 +) +# fmt: on + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL: CodingStateMachineDict = { + "class_table": ISO2022JP_CLS, + "class_factor": 10, + "state_table": ISO2022JP_ST, + "char_len_table": ISO2022JP_CHAR_LEN_TABLE, + "name": "ISO-2022-JP", + "language": "Japanese", +} + +# fmt: off +ISO2022KR_CLS = ( + 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 3, 0, 0, 0, # 20 - 27 + 0, 4, 0, 0, 0, 0, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 5, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 + 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f + 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 + 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f + 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 + 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef + 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 + 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff +) + +ISO2022KR_ST = ( + MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f + MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 10-17 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 18-1f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 20-27 +) +# fmt: on + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL: CodingStateMachineDict = { + "class_table": ISO2022KR_CLS, + "class_factor": 6, + "state_table": ISO2022KR_ST, + "char_len_table": ISO2022KR_CHAR_LEN_TABLE, + "name": "ISO-2022-KR", + "language": "Korean", +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..39487f4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,102 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import Union + +from .chardistribution import EUCJPDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .enums import MachineState, ProbingState +from .jpcntx import EUCJPContextAnalysis +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self) -> None: + super().reset() + self.context_analyzer.reset() + + @property + def charset_name(self) -> str: + return "EUC-JP" + + @property + def language(self) -> str: + return "Japanese" + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + assert self.coding_sm is not None + assert self.distribution_analyzer is not None + + for i, byte in enumerate(byte_str): + # PY3K: byte_str is a byte array, so byte is an int, not a byte + coding_state = self.coding_sm.next_state(byte) + if coding_state == MachineState.ERROR: + self.logger.debug( + "%s %s prober hit error at byte %s", + self.charset_name, + self.language, + i, + ) + self._state = ProbingState.NOT_ME + break + if coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + if coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1 : i + 1], char_len) + self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if self.context_analyzer.got_enough_data() and ( + self.get_confidence() > self.SHORTCUT_THRESHOLD + ): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self) -> float: + assert self.distribution_analyzer is not None + + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..7dc3b10 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,196 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +# fmt: off +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) +# fmt: on diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000..1fc5de0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self) -> str: + return "EUC-KR" + + @property + def language(self) -> str: + return "Korean" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..4900ccc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,388 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table +EUCTW_TABLE_SIZE = 5376 + +# fmt: off +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1, 1800, 1506, 255, 1431, 198, 9, 82, 6, 7310, 177, 202, 3615, 1256, 2808, 110, # 2742 + 3735, 33, 3241, 261, 76, 44, 2113, 16, 2931, 2184, 1176, 659, 3868, 26, 3404, 2643, # 2758 + 1198, 3869, 3313, 4060, 410, 2211, 302, 590, 361, 1963, 8, 204, 58, 4296, 7311, 1931, # 2774 + 63, 7312, 7313, 317, 1614, 75, 222, 159, 4061, 2412, 1480, 7314, 3500, 3068, 224, 2809, # 2790 + 3616, 3, 10, 3870, 1471, 29, 2774, 1135, 2852, 1939, 873, 130, 3242, 1123, 312, 7315, # 2806 + 4297, 2051, 507, 252, 682, 7316, 142, 1914, 124, 206, 2932, 34, 3501, 3173, 64, 604, # 2822 + 7317, 2494, 1976, 1977, 155, 1990, 645, 641, 1606, 7318, 3405, 337, 72, 406, 7319, 80, # 2838 + 630, 238, 3174, 1509, 263, 939, 1092, 2644, 756, 1440, 1094, 3406, 449, 69, 2969, 591, # 2854 + 179, 2095, 471, 115, 2034, 1843, 60, 50, 2970, 134, 806, 1868, 734, 2035, 3407, 180, # 2870 + 995, 1607, 156, 537, 2893, 688, 7320, 319, 1305, 779, 2144, 514, 2374, 298, 4298, 359, # 2886 + 2495, 90, 2707, 1338, 663, 11, 906, 1099, 2545, 20, 2436, 182, 532, 1716, 7321, 732, # 2902 + 1376, 4062, 1311, 1420, 3175, 25, 2312, 1056, 113, 399, 382, 1949, 242, 3408, 2467, 529, # 2918 + 3243, 475, 1447, 3617, 7322, 117, 21, 656, 810, 1297, 2295, 2329, 3502, 7323, 126, 4063, # 2934 + 706, 456, 150, 613, 4299, 71, 1118, 2036, 4064, 145, 3069, 85, 835, 486, 2114, 1246, # 2950 + 1426, 428, 727, 1285, 1015, 800, 106, 623, 303, 1281, 7324, 2127, 2354, 347, 3736, 221, # 2966 + 3503, 3110, 7325, 1955, 1153, 4065, 83, 296, 1199, 3070, 192, 624, 93, 7326, 822, 1897, # 2982 + 2810, 3111, 795, 2064, 991, 1554, 1542, 1592, 27, 43, 2853, 859, 139, 1456, 860, 4300, # 2998 + 437, 712, 3871, 164, 2392, 3112, 695, 211, 3017, 2096, 195, 3872, 1608, 3504, 3505, 3618, # 3014 + 3873, 234, 811, 2971, 2097, 3874, 2229, 1441, 3506, 1615, 2375, 668, 2076, 1638, 305, 228, # 3030 + 1664, 4301, 467, 415, 7327, 262, 2098, 1593, 239, 108, 300, 200, 1033, 512, 1247, 2077, # 3046 + 7328, 7329, 2173, 3176, 3619, 2673, 593, 845, 1062, 3244, 88, 1723, 2037, 3875, 1950, 212, # 3062 + 266, 152, 149, 468, 1898, 4066, 4302, 77, 187, 7330, 3018, 37, 5, 2972, 7331, 3876, # 3078 + 7332, 7333, 39, 2517, 4303, 2894, 3177, 2078, 55, 148, 74, 4304, 545, 483, 1474, 1029, # 3094 + 1665, 217, 1869, 1531, 3113, 1104, 2645, 4067, 24, 172, 3507, 900, 3877, 3508, 3509, 4305, # 3110 + 32, 1408, 2811, 1312, 329, 487, 2355, 2247, 2708, 784, 2674, 4, 3019, 3314, 1427, 1788, # 3126 + 188, 109, 499, 7334, 3620, 1717, 1789, 888, 1217, 3020, 4306, 7335, 3510, 7336, 3315, 1520, # 3142 + 3621, 3878, 196, 1034, 775, 7337, 7338, 929, 1815, 249, 439, 38, 7339, 1063, 7340, 794, # 3158 + 3879, 1435, 2296, 46, 178, 3245, 2065, 7341, 2376, 7342, 214, 1709, 4307, 804, 35, 707, # 3174 + 324, 3622, 1601, 2546, 140, 459, 4068, 7343, 7344, 1365, 839, 272, 978, 2257, 2572, 3409, # 3190 + 2128, 1363, 3623, 1423, 697, 100, 3071, 48, 70, 1231, 495, 3114, 2193, 7345, 1294, 7346, # 3206 + 2079, 462, 586, 1042, 3246, 853, 256, 988, 185, 2377, 3410, 1698, 434, 1084, 7347, 3411, # 3222 + 314, 2615, 2775, 4308, 2330, 2331, 569, 2280, 637, 1816, 2518, 757, 1162, 1878, 1616, 3412, # 3238 + 287, 1577, 2115, 768, 4309, 1671, 2854, 3511, 2519, 1321, 3737, 909, 2413, 7348, 4069, 933, # 3254 + 3738, 7349, 2052, 2356, 1222, 4310, 765, 2414, 1322, 786, 4311, 7350, 1919, 1462, 1677, 2895, # 3270 + 1699, 7351, 4312, 1424, 2437, 3115, 3624, 2590, 3316, 1774, 1940, 3413, 3880, 4070, 309, 1369, # 3286 + 1130, 2812, 364, 2230, 1653, 1299, 3881, 3512, 3882, 3883, 2646, 525, 1085, 3021, 902, 2000, # 3302 + 1475, 964, 4313, 421, 1844, 1415, 1057, 2281, 940, 1364, 3116, 376, 4314, 4315, 1381, 7, # 3318 + 2520, 983, 2378, 336, 1710, 2675, 1845, 321, 3414, 559, 1131, 3022, 2742, 1808, 1132, 1313, # 3334 + 265, 1481, 1857, 7352, 352, 1203, 2813, 3247, 167, 1089, 420, 2814, 776, 792, 1724, 3513, # 3350 + 4071, 2438, 3248, 7353, 4072, 7354, 446, 229, 333, 2743, 901, 3739, 1200, 1557, 4316, 2647, # 3366 + 1920, 395, 2744, 2676, 3740, 4073, 1835, 125, 916, 3178, 2616, 4317, 7355, 7356, 3741, 7357, # 3382 + 7358, 7359, 4318, 3117, 3625, 1133, 2547, 1757, 3415, 1510, 2313, 1409, 3514, 7360, 2145, 438, # 3398 + 2591, 2896, 2379, 3317, 1068, 958, 3023, 461, 311, 2855, 2677, 4074, 1915, 3179, 4075, 1978, # 3414 + 383, 750, 2745, 2617, 4076, 274, 539, 385, 1278, 1442, 7361, 1154, 1964, 384, 561, 210, # 3430 + 98, 1295, 2548, 3515, 7362, 1711, 2415, 1482, 3416, 3884, 2897, 1257, 129, 7363, 3742, 642, # 3446 + 523, 2776, 2777, 2648, 7364, 141, 2231, 1333, 68, 176, 441, 876, 907, 4077, 603, 2592, # 3462 + 710, 171, 3417, 404, 549, 18, 3118, 2393, 1410, 3626, 1666, 7365, 3516, 4319, 2898, 4320, # 3478 + 7366, 2973, 368, 7367, 146, 366, 99, 871, 3627, 1543, 748, 807, 1586, 1185, 22, 2258, # 3494 + 379, 3743, 3180, 7368, 3181, 505, 1941, 2618, 1991, 1382, 2314, 7369, 380, 2357, 218, 702, # 3510 + 1817, 1248, 3418, 3024, 3517, 3318, 3249, 7370, 2974, 3628, 930, 3250, 3744, 7371, 59, 7372, # 3526 + 585, 601, 4078, 497, 3419, 1112, 1314, 4321, 1801, 7373, 1223, 1472, 2174, 7374, 749, 1836, # 3542 + 690, 1899, 3745, 1772, 3885, 1476, 429, 1043, 1790, 2232, 2116, 917, 4079, 447, 1086, 1629, # 3558 + 7375, 556, 7376, 7377, 2020, 1654, 844, 1090, 105, 550, 966, 1758, 2815, 1008, 1782, 686, # 3574 + 1095, 7378, 2282, 793, 1602, 7379, 3518, 2593, 4322, 4080, 2933, 2297, 4323, 3746, 980, 2496, # 3590 + 544, 353, 527, 4324, 908, 2678, 2899, 7380, 381, 2619, 1942, 1348, 7381, 1341, 1252, 560, # 3606 + 3072, 7382, 3420, 2856, 7383, 2053, 973, 886, 2080, 143, 4325, 7384, 7385, 157, 3886, 496, # 3622 + 4081, 57, 840, 540, 2038, 4326, 4327, 3421, 2117, 1445, 970, 2259, 1748, 1965, 2081, 4082, # 3638 + 3119, 1234, 1775, 3251, 2816, 3629, 773, 1206, 2129, 1066, 2039, 1326, 3887, 1738, 1725, 4083, # 3654 + 279, 3120, 51, 1544, 2594, 423, 1578, 2130, 2066, 173, 4328, 1879, 7386, 7387, 1583, 264, # 3670 + 610, 3630, 4329, 2439, 280, 154, 7388, 7389, 7390, 1739, 338, 1282, 3073, 693, 2857, 1411, # 3686 + 1074, 3747, 2440, 7391, 4330, 7392, 7393, 1240, 952, 2394, 7394, 2900, 1538, 2679, 685, 1483, # 3702 + 4084, 2468, 1436, 953, 4085, 2054, 4331, 671, 2395, 79, 4086, 2441, 3252, 608, 567, 2680, # 3718 + 3422, 4087, 4088, 1691, 393, 1261, 1791, 2396, 7395, 4332, 7396, 7397, 7398, 7399, 1383, 1672, # 3734 + 3748, 3182, 1464, 522, 1119, 661, 1150, 216, 675, 4333, 3888, 1432, 3519, 609, 4334, 2681, # 3750 + 2397, 7400, 7401, 7402, 4089, 3025, 0, 7403, 2469, 315, 231, 2442, 301, 3319, 4335, 2380, # 3766 + 7404, 233, 4090, 3631, 1818, 4336, 4337, 7405, 96, 1776, 1315, 2082, 7406, 257, 7407, 1809, # 3782 + 3632, 2709, 1139, 1819, 4091, 2021, 1124, 2163, 2778, 1777, 2649, 7408, 3074, 363, 1655, 3183, # 3798 + 7409, 2975, 7410, 7411, 7412, 3889, 1567, 3890, 718, 103, 3184, 849, 1443, 341, 3320, 2934, # 3814 + 1484, 7413, 1712, 127, 67, 339, 4092, 2398, 679, 1412, 821, 7414, 7415, 834, 738, 351, # 3830 + 2976, 2146, 846, 235, 1497, 1880, 418, 1992, 3749, 2710, 186, 1100, 2147, 2746, 3520, 1545, # 3846 + 1355, 2935, 2858, 1377, 583, 3891, 4093, 2573, 2977, 7416, 1298, 3633, 1078, 2549, 3634, 2358, # 3862 + 78, 3750, 3751, 267, 1289, 2099, 2001, 1594, 4094, 348, 369, 1274, 2194, 2175, 1837, 4338, # 3878 + 1820, 2817, 3635, 2747, 2283, 2002, 4339, 2936, 2748, 144, 3321, 882, 4340, 3892, 2749, 3423, # 3894 + 4341, 2901, 7417, 4095, 1726, 320, 7418, 3893, 3026, 788, 2978, 7419, 2818, 1773, 1327, 2859, # 3910 + 3894, 2819, 7420, 1306, 4342, 2003, 1700, 3752, 3521, 2359, 2650, 787, 2022, 506, 824, 3636, # 3926 + 534, 323, 4343, 1044, 3322, 2023, 1900, 946, 3424, 7421, 1778, 1500, 1678, 7422, 1881, 4344, # 3942 + 165, 243, 4345, 3637, 2521, 123, 683, 4096, 764, 4346, 36, 3895, 1792, 589, 2902, 816, # 3958 + 626, 1667, 3027, 2233, 1639, 1555, 1622, 3753, 3896, 7423, 3897, 2860, 1370, 1228, 1932, 891, # 3974 + 2083, 2903, 304, 4097, 7424, 292, 2979, 2711, 3522, 691, 2100, 4098, 1115, 4347, 118, 662, # 3990 + 7425, 611, 1156, 854, 2381, 1316, 2861, 2, 386, 515, 2904, 7426, 7427, 3253, 868, 2234, # 4006 + 1486, 855, 2651, 785, 2212, 3028, 7428, 1040, 3185, 3523, 7429, 3121, 448, 7430, 1525, 7431, # 4022 + 2164, 4348, 7432, 3754, 7433, 4099, 2820, 3524, 3122, 503, 818, 3898, 3123, 1568, 814, 676, # 4038 + 1444, 306, 1749, 7434, 3755, 1416, 1030, 197, 1428, 805, 2821, 1501, 4349, 7435, 7436, 7437, # 4054 + 1993, 7438, 4350, 7439, 7440, 2195, 13, 2779, 3638, 2980, 3124, 1229, 1916, 7441, 3756, 2131, # 4070 + 7442, 4100, 4351, 2399, 3525, 7443, 2213, 1511, 1727, 1120, 7444, 7445, 646, 3757, 2443, 307, # 4086 + 7446, 7447, 1595, 3186, 7448, 7449, 7450, 3639, 1113, 1356, 3899, 1465, 2522, 2523, 7451, 519, # 4102 + 7452, 128, 2132, 92, 2284, 1979, 7453, 3900, 1512, 342, 3125, 2196, 7454, 2780, 2214, 1980, # 4118 + 3323, 7455, 290, 1656, 1317, 789, 827, 2360, 7456, 3758, 4352, 562, 581, 3901, 7457, 401, # 4134 + 4353, 2248, 94, 4354, 1399, 2781, 7458, 1463, 2024, 4355, 3187, 1943, 7459, 828, 1105, 4101, # 4150 + 1262, 1394, 7460, 4102, 605, 4356, 7461, 1783, 2862, 7462, 2822, 819, 2101, 578, 2197, 2937, # 4166 + 7463, 1502, 436, 3254, 4103, 3255, 2823, 3902, 2905, 3425, 3426, 7464, 2712, 2315, 7465, 7466, # 4182 + 2332, 2067, 23, 4357, 193, 826, 3759, 2102, 699, 1630, 4104, 3075, 390, 1793, 1064, 3526, # 4198 + 7467, 1579, 3076, 3077, 1400, 7468, 4105, 1838, 1640, 2863, 7469, 4358, 4359, 137, 4106, 598, # 4214 + 3078, 1966, 780, 104, 974, 2938, 7470, 278, 899, 253, 402, 572, 504, 493, 1339, 7471, # 4230 + 3903, 1275, 4360, 2574, 2550, 7472, 3640, 3029, 3079, 2249, 565, 1334, 2713, 863, 41, 7473, # 4246 + 7474, 4361, 7475, 1657, 2333, 19, 463, 2750, 4107, 606, 7476, 2981, 3256, 1087, 2084, 1323, # 4262 + 2652, 2982, 7477, 1631, 1623, 1750, 4108, 2682, 7478, 2864, 791, 2714, 2653, 2334, 232, 2416, # 4278 + 7479, 2983, 1498, 7480, 2654, 2620, 755, 1366, 3641, 3257, 3126, 2025, 1609, 119, 1917, 3427, # 4294 + 862, 1026, 4109, 7481, 3904, 3760, 4362, 3905, 4363, 2260, 1951, 2470, 7482, 1125, 817, 4110, # 4310 + 4111, 3906, 1513, 1766, 2040, 1487, 4112, 3030, 3258, 2824, 3761, 3127, 7483, 7484, 1507, 7485, # 4326 + 2683, 733, 40, 1632, 1106, 2865, 345, 4113, 841, 2524, 230, 4364, 2984, 1846, 3259, 3428, # 4342 + 7486, 1263, 986, 3429, 7487, 735, 879, 254, 1137, 857, 622, 1300, 1180, 1388, 1562, 3907, # 4358 + 3908, 2939, 967, 2751, 2655, 1349, 592, 2133, 1692, 3324, 2985, 1994, 4114, 1679, 3909, 1901, # 4374 + 2185, 7488, 739, 3642, 2715, 1296, 1290, 7489, 4115, 2198, 2199, 1921, 1563, 2595, 2551, 1870, # 4390 + 2752, 2986, 7490, 435, 7491, 343, 1108, 596, 17, 1751, 4365, 2235, 3430, 3643, 7492, 4366, # 4406 + 294, 3527, 2940, 1693, 477, 979, 281, 2041, 3528, 643, 2042, 3644, 2621, 2782, 2261, 1031, # 4422 + 2335, 2134, 2298, 3529, 4367, 367, 1249, 2552, 7493, 3530, 7494, 4368, 1283, 3325, 2004, 240, # 4438 + 1762, 3326, 4369, 4370, 836, 1069, 3128, 474, 7495, 2148, 2525, 268, 3531, 7496, 3188, 1521, # 4454 + 1284, 7497, 1658, 1546, 4116, 7498, 3532, 3533, 7499, 4117, 3327, 2684, 1685, 4118, 961, 1673, # 4470 + 2622, 190, 2005, 2200, 3762, 4371, 4372, 7500, 570, 2497, 3645, 1490, 7501, 4373, 2623, 3260, # 4486 + 1956, 4374, 584, 1514, 396, 1045, 1944, 7502, 4375, 1967, 2444, 7503, 7504, 4376, 3910, 619, # 4502 + 7505, 3129, 3261, 215, 2006, 2783, 2553, 3189, 4377, 3190, 4378, 763, 4119, 3763, 4379, 7506, # 4518 + 7507, 1957, 1767, 2941, 3328, 3646, 1174, 452, 1477, 4380, 3329, 3130, 7508, 2825, 1253, 2382, # 4534 + 2186, 1091, 2285, 4120, 492, 7509, 638, 1169, 1824, 2135, 1752, 3911, 648, 926, 1021, 1324, # 4550 + 4381, 520, 4382, 997, 847, 1007, 892, 4383, 3764, 2262, 1871, 3647, 7510, 2400, 1784, 4384, # 4566 + 1952, 2942, 3080, 3191, 1728, 4121, 2043, 3648, 4385, 2007, 1701, 3131, 1551, 30, 2263, 4122, # 4582 + 7511, 2026, 4386, 3534, 7512, 501, 7513, 4123, 594, 3431, 2165, 1821, 3535, 3432, 3536, 3192, # 4598 + 829, 2826, 4124, 7514, 1680, 3132, 1225, 4125, 7515, 3262, 4387, 4126, 3133, 2336, 7516, 4388, # 4614 + 4127, 7517, 3912, 3913, 7518, 1847, 2383, 2596, 3330, 7519, 4389, 374, 3914, 652, 4128, 4129, # 4630 + 375, 1140, 798, 7520, 7521, 7522, 2361, 4390, 2264, 546, 1659, 138, 3031, 2445, 4391, 7523, # 4646 + 2250, 612, 1848, 910, 796, 3765, 1740, 1371, 825, 3766, 3767, 7524, 2906, 2554, 7525, 692, # 4662 + 444, 3032, 2624, 801, 4392, 4130, 7526, 1491, 244, 1053, 3033, 4131, 4132, 340, 7527, 3915, # 4678 + 1041, 2987, 293, 1168, 87, 1357, 7528, 1539, 959, 7529, 2236, 721, 694, 4133, 3768, 219, # 4694 + 1478, 644, 1417, 3331, 2656, 1413, 1401, 1335, 1389, 3916, 7530, 7531, 2988, 2362, 3134, 1825, # 4710 + 730, 1515, 184, 2827, 66, 4393, 7532, 1660, 2943, 246, 3332, 378, 1457, 226, 3433, 975, # 4726 + 3917, 2944, 1264, 3537, 674, 696, 7533, 163, 7534, 1141, 2417, 2166, 713, 3538, 3333, 4394, # 4742 + 3918, 7535, 7536, 1186, 15, 7537, 1079, 1070, 7538, 1522, 3193, 3539, 276, 1050, 2716, 758, # 4758 + 1126, 653, 2945, 3263, 7539, 2337, 889, 3540, 3919, 3081, 2989, 903, 1250, 4395, 3920, 3434, # 4774 + 3541, 1342, 1681, 1718, 766, 3264, 286, 89, 2946, 3649, 7540, 1713, 7541, 2597, 3334, 2990, # 4790 + 7542, 2947, 2215, 3194, 2866, 7543, 4396, 2498, 2526, 181, 387, 1075, 3921, 731, 2187, 3335, # 4806 + 7544, 3265, 310, 313, 3435, 2299, 770, 4134, 54, 3034, 189, 4397, 3082, 3769, 3922, 7545, # 4822 + 1230, 1617, 1849, 355, 3542, 4135, 4398, 3336, 111, 4136, 3650, 1350, 3135, 3436, 3035, 4137, # 4838 + 2149, 3266, 3543, 7546, 2784, 3923, 3924, 2991, 722, 2008, 7547, 1071, 247, 1207, 2338, 2471, # 4854 + 1378, 4399, 2009, 864, 1437, 1214, 4400, 373, 3770, 1142, 2216, 667, 4401, 442, 2753, 2555, # 4870 + 3771, 3925, 1968, 4138, 3267, 1839, 837, 170, 1107, 934, 1336, 1882, 7548, 7549, 2118, 4139, # 4886 + 2828, 743, 1569, 7550, 4402, 4140, 582, 2384, 1418, 3437, 7551, 1802, 7552, 357, 1395, 1729, # 4902 + 3651, 3268, 2418, 1564, 2237, 7553, 3083, 3772, 1633, 4403, 1114, 2085, 4141, 1532, 7554, 482, # 4918 + 2446, 4404, 7555, 7556, 1492, 833, 1466, 7557, 2717, 3544, 1641, 2829, 7558, 1526, 1272, 3652, # 4934 + 4142, 1686, 1794, 416, 2556, 1902, 1953, 1803, 7559, 3773, 2785, 3774, 1159, 2316, 7560, 2867, # 4950 + 4405, 1610, 1584, 3036, 2419, 2754, 443, 3269, 1163, 3136, 7561, 7562, 3926, 7563, 4143, 2499, # 4966 + 3037, 4406, 3927, 3137, 2103, 1647, 3545, 2010, 1872, 4144, 7564, 4145, 431, 3438, 7565, 250, # 4982 + 97, 81, 4146, 7566, 1648, 1850, 1558, 160, 848, 7567, 866, 740, 1694, 7568, 2201, 2830, # 4998 + 3195, 4147, 4407, 3653, 1687, 950, 2472, 426, 469, 3196, 3654, 3655, 3928, 7569, 7570, 1188, # 5014 + 424, 1995, 861, 3546, 4148, 3775, 2202, 2685, 168, 1235, 3547, 4149, 7571, 2086, 1674, 4408, # 5030 + 3337, 3270, 220, 2557, 1009, 7572, 3776, 670, 2992, 332, 1208, 717, 7573, 7574, 3548, 2447, # 5046 + 3929, 3338, 7575, 513, 7576, 1209, 2868, 3339, 3138, 4409, 1080, 7577, 7578, 7579, 7580, 2527, # 5062 + 3656, 3549, 815, 1587, 3930, 3931, 7581, 3550, 3439, 3777, 1254, 4410, 1328, 3038, 1390, 3932, # 5078 + 1741, 3933, 3778, 3934, 7582, 236, 3779, 2448, 3271, 7583, 7584, 3657, 3780, 1273, 3781, 4411, # 5094 + 7585, 308, 7586, 4412, 245, 4413, 1851, 2473, 1307, 2575, 430, 715, 2136, 2449, 7587, 270, # 5110 + 199, 2869, 3935, 7588, 3551, 2718, 1753, 761, 1754, 725, 1661, 1840, 4414, 3440, 3658, 7589, # 5126 + 7590, 587, 14, 3272, 227, 2598, 326, 480, 2265, 943, 2755, 3552, 291, 650, 1883, 7591, # 5142 + 1702, 1226, 102, 1547, 62, 3441, 904, 4415, 3442, 1164, 4150, 7592, 7593, 1224, 1548, 2756, # 5158 + 391, 498, 1493, 7594, 1386, 1419, 7595, 2055, 1177, 4416, 813, 880, 1081, 2363, 566, 1145, # 5174 + 4417, 2286, 1001, 1035, 2558, 2599, 2238, 394, 1286, 7596, 7597, 2068, 7598, 86, 1494, 1730, # 5190 + 3936, 491, 1588, 745, 897, 2948, 843, 3340, 3937, 2757, 2870, 3273, 1768, 998, 2217, 2069, # 5206 + 397, 1826, 1195, 1969, 3659, 2993, 3341, 284, 7599, 3782, 2500, 2137, 2119, 1903, 7600, 3938, # 5222 + 2150, 3939, 4151, 1036, 3443, 1904, 114, 2559, 4152, 209, 1527, 7601, 7602, 2949, 2831, 2625, # 5238 + 2385, 2719, 3139, 812, 2560, 7603, 3274, 7604, 1559, 737, 1884, 3660, 1210, 885, 28, 2686, # 5254 + 3553, 3783, 7605, 4153, 1004, 1779, 4418, 7606, 346, 1981, 2218, 2687, 4419, 3784, 1742, 797, # 5270 + 1642, 3940, 1933, 1072, 1384, 2151, 896, 3941, 3275, 3661, 3197, 2871, 3554, 7607, 2561, 1958, # 5286 + 4420, 2450, 1785, 7608, 7609, 7610, 3942, 4154, 1005, 1308, 3662, 4155, 2720, 4421, 4422, 1528, # 5302 + 2600, 161, 1178, 4156, 1982, 987, 4423, 1101, 4157, 631, 3943, 1157, 3198, 2420, 1343, 1241, # 5318 + 1016, 2239, 2562, 372, 877, 2339, 2501, 1160, 555, 1934, 911, 3944, 7611, 466, 1170, 169, # 5334 + 1051, 2907, 2688, 3663, 2474, 2994, 1182, 2011, 2563, 1251, 2626, 7612, 992, 2340, 3444, 1540, # 5350 + 2721, 1201, 2070, 2401, 1996, 2475, 7613, 4424, 528, 1922, 2188, 1503, 1873, 1570, 2364, 3342, # 5366 + 3276, 7614, 557, 1073, 7615, 1827, 3445, 2087, 2266, 3140, 3039, 3084, 767, 3085, 2786, 4425, # 5382 + 1006, 4158, 4426, 2341, 1267, 2176, 3664, 3199, 778, 3945, 3200, 2722, 1597, 2657, 7616, 4427, # 5398 + 7617, 3446, 7618, 7619, 7620, 3277, 2689, 1433, 3278, 131, 95, 1504, 3946, 723, 4159, 3141, # 5414 + 1841, 3555, 2758, 2189, 3947, 2027, 2104, 3665, 7621, 2995, 3948, 1218, 7622, 3343, 3201, 3949, # 5430 + 4160, 2576, 248, 1634, 3785, 912, 7623, 2832, 3666, 3040, 3786, 654, 53, 7624, 2996, 7625, # 5446 + 1688, 4428, 777, 3447, 1032, 3950, 1425, 7626, 191, 820, 2120, 2833, 971, 4429, 931, 3202, # 5462 + 135, 664, 783, 3787, 1997, 772, 2908, 1935, 3951, 3788, 4430, 2909, 3203, 282, 2723, 640, # 5478 + 1372, 3448, 1127, 922, 325, 3344, 7627, 7628, 711, 2044, 7629, 7630, 3952, 2219, 2787, 1936, # 5494 + 3953, 3345, 2220, 2251, 3789, 2300, 7631, 4431, 3790, 1258, 3279, 3954, 3204, 2138, 2950, 3955, # 5510 + 3956, 7632, 2221, 258, 3205, 4432, 101, 1227, 7633, 3280, 1755, 7634, 1391, 3281, 7635, 2910, # 5526 + 2056, 893, 7636, 7637, 7638, 1402, 4161, 2342, 7639, 7640, 3206, 3556, 7641, 7642, 878, 1325, # 5542 + 1780, 2788, 4433, 259, 1385, 2577, 744, 1183, 2267, 4434, 7643, 3957, 2502, 7644, 684, 1024, # 5558 + 4162, 7645, 472, 3557, 3449, 1165, 3282, 3958, 3959, 322, 2152, 881, 455, 1695, 1152, 1340, # 5574 + 660, 554, 2153, 4435, 1058, 4436, 4163, 830, 1065, 3346, 3960, 4437, 1923, 7646, 1703, 1918, # 5590 + 7647, 932, 2268, 122, 7648, 4438, 947, 677, 7649, 3791, 2627, 297, 1905, 1924, 2269, 4439, # 5606 + 2317, 3283, 7650, 7651, 4164, 7652, 4165, 84, 4166, 112, 989, 7653, 547, 1059, 3961, 701, # 5622 + 3558, 1019, 7654, 4167, 7655, 3450, 942, 639, 457, 2301, 2451, 993, 2951, 407, 851, 494, # 5638 + 4440, 3347, 927, 7656, 1237, 7657, 2421, 3348, 573, 4168, 680, 921, 2911, 1279, 1874, 285, # 5654 + 790, 1448, 1983, 719, 2167, 7658, 7659, 4441, 3962, 3963, 1649, 7660, 1541, 563, 7661, 1077, # 5670 + 7662, 3349, 3041, 3451, 511, 2997, 3964, 3965, 3667, 3966, 1268, 2564, 3350, 3207, 4442, 4443, # 5686 + 7663, 535, 1048, 1276, 1189, 2912, 2028, 3142, 1438, 1373, 2834, 2952, 1134, 2012, 7664, 4169, # 5702 + 1238, 2578, 3086, 1259, 7665, 700, 7666, 2953, 3143, 3668, 4170, 7667, 4171, 1146, 1875, 1906, # 5718 + 4444, 2601, 3967, 781, 2422, 132, 1589, 203, 147, 273, 2789, 2402, 898, 1786, 2154, 3968, # 5734 + 3969, 7668, 3792, 2790, 7669, 7670, 4445, 4446, 7671, 3208, 7672, 1635, 3793, 965, 7673, 1804, # 5750 + 2690, 1516, 3559, 1121, 1082, 1329, 3284, 3970, 1449, 3794, 65, 1128, 2835, 2913, 2759, 1590, # 5766 + 3795, 7674, 7675, 12, 2658, 45, 976, 2579, 3144, 4447, 517, 2528, 1013, 1037, 3209, 7676, # 5782 + 3796, 2836, 7677, 3797, 7678, 3452, 7679, 2602, 614, 1998, 2318, 3798, 3087, 2724, 2628, 7680, # 5798 + 2580, 4172, 599, 1269, 7681, 1810, 3669, 7682, 2691, 3088, 759, 1060, 489, 1805, 3351, 3285, # 5814 + 1358, 7683, 7684, 2386, 1387, 1215, 2629, 2252, 490, 7685, 7686, 4173, 1759, 2387, 2343, 7687, # 5830 + 4448, 3799, 1907, 3971, 2630, 1806, 3210, 4449, 3453, 3286, 2760, 2344, 874, 7688, 7689, 3454, # 5846 + 3670, 1858, 91, 2914, 3671, 3042, 3800, 4450, 7690, 3145, 3972, 2659, 7691, 3455, 1202, 1403, # 5862 + 3801, 2954, 2529, 1517, 2503, 4451, 3456, 2504, 7692, 4452, 7693, 2692, 1885, 1495, 1731, 3973, # 5878 + 2365, 4453, 7694, 2029, 7695, 7696, 3974, 2693, 1216, 237, 2581, 4174, 2319, 3975, 3802, 4454, # 5894 + 4455, 2694, 3560, 3457, 445, 4456, 7697, 7698, 7699, 7700, 2761, 61, 3976, 3672, 1822, 3977, # 5910 + 7701, 687, 2045, 935, 925, 405, 2660, 703, 1096, 1859, 2725, 4457, 3978, 1876, 1367, 2695, # 5926 + 3352, 918, 2105, 1781, 2476, 334, 3287, 1611, 1093, 4458, 564, 3146, 3458, 3673, 3353, 945, # 5942 + 2631, 2057, 4459, 7702, 1925, 872, 4175, 7703, 3459, 2696, 3089, 349, 4176, 3674, 3979, 4460, # 5958 + 3803, 4177, 3675, 2155, 3980, 4461, 4462, 4178, 4463, 2403, 2046, 782, 3981, 400, 251, 4179, # 5974 + 1624, 7704, 7705, 277, 3676, 299, 1265, 476, 1191, 3804, 2121, 4180, 4181, 1109, 205, 7706, # 5990 + 2582, 1000, 2156, 3561, 1860, 7707, 7708, 7709, 4464, 7710, 4465, 2565, 107, 2477, 2157, 3982, # 6006 + 3460, 3147, 7711, 1533, 541, 1301, 158, 753, 4182, 2872, 3562, 7712, 1696, 370, 1088, 4183, # 6022 + 4466, 3563, 579, 327, 440, 162, 2240, 269, 1937, 1374, 3461, 968, 3043, 56, 1396, 3090, # 6038 + 2106, 3288, 3354, 7713, 1926, 2158, 4467, 2998, 7714, 3564, 7715, 7716, 3677, 4468, 2478, 7717, # 6054 + 2791, 7718, 1650, 4469, 7719, 2603, 7720, 7721, 3983, 2661, 3355, 1149, 3356, 3984, 3805, 3985, # 6070 + 7722, 1076, 49, 7723, 951, 3211, 3289, 3290, 450, 2837, 920, 7724, 1811, 2792, 2366, 4184, # 6086 + 1908, 1138, 2367, 3806, 3462, 7725, 3212, 4470, 1909, 1147, 1518, 2423, 4471, 3807, 7726, 4472, # 6102 + 2388, 2604, 260, 1795, 3213, 7727, 7728, 3808, 3291, 708, 7729, 3565, 1704, 7730, 3566, 1351, # 6118 + 1618, 3357, 2999, 1886, 944, 4185, 3358, 4186, 3044, 3359, 4187, 7731, 3678, 422, 413, 1714, # 6134 + 3292, 500, 2058, 2345, 4188, 2479, 7732, 1344, 1910, 954, 7733, 1668, 7734, 7735, 3986, 2404, # 6150 + 4189, 3567, 3809, 4190, 7736, 2302, 1318, 2505, 3091, 133, 3092, 2873, 4473, 629, 31, 2838, # 6166 + 2697, 3810, 4474, 850, 949, 4475, 3987, 2955, 1732, 2088, 4191, 1496, 1852, 7737, 3988, 620, # 6182 + 3214, 981, 1242, 3679, 3360, 1619, 3680, 1643, 3293, 2139, 2452, 1970, 1719, 3463, 2168, 7738, # 6198 + 3215, 7739, 7740, 3361, 1828, 7741, 1277, 4476, 1565, 2047, 7742, 1636, 3568, 3093, 7743, 869, # 6214 + 2839, 655, 3811, 3812, 3094, 3989, 3000, 3813, 1310, 3569, 4477, 7744, 7745, 7746, 1733, 558, # 6230 + 4478, 3681, 335, 1549, 3045, 1756, 4192, 3682, 1945, 3464, 1829, 1291, 1192, 470, 2726, 2107, # 6246 + 2793, 913, 1054, 3990, 7747, 1027, 7748, 3046, 3991, 4479, 982, 2662, 3362, 3148, 3465, 3216, # 6262 + 3217, 1946, 2794, 7749, 571, 4480, 7750, 1830, 7751, 3570, 2583, 1523, 2424, 7752, 2089, 984, # 6278 + 4481, 3683, 1959, 7753, 3684, 852, 923, 2795, 3466, 3685, 969, 1519, 999, 2048, 2320, 1705, # 6294 + 7754, 3095, 615, 1662, 151, 597, 3992, 2405, 2321, 1049, 275, 4482, 3686, 4193, 568, 3687, # 6310 + 3571, 2480, 4194, 3688, 7755, 2425, 2270, 409, 3218, 7756, 1566, 2874, 3467, 1002, 769, 2840, # 6326 + 194, 2090, 3149, 3689, 2222, 3294, 4195, 628, 1505, 7757, 7758, 1763, 2177, 3001, 3993, 521, # 6342 + 1161, 2584, 1787, 2203, 2406, 4483, 3994, 1625, 4196, 4197, 412, 42, 3096, 464, 7759, 2632, # 6358 + 4484, 3363, 1760, 1571, 2875, 3468, 2530, 1219, 2204, 3814, 2633, 2140, 2368, 4485, 4486, 3295, # 6374 + 1651, 3364, 3572, 7760, 7761, 3573, 2481, 3469, 7762, 3690, 7763, 7764, 2271, 2091, 460, 7765, # 6390 + 4487, 7766, 3002, 962, 588, 3574, 289, 3219, 2634, 1116, 52, 7767, 3047, 1796, 7768, 7769, # 6406 + 7770, 1467, 7771, 1598, 1143, 3691, 4198, 1984, 1734, 1067, 4488, 1280, 3365, 465, 4489, 1572, # 6422 + 510, 7772, 1927, 2241, 1812, 1644, 3575, 7773, 4490, 3692, 7774, 7775, 2663, 1573, 1534, 7776, # 6438 + 7777, 4199, 536, 1807, 1761, 3470, 3815, 3150, 2635, 7778, 7779, 7780, 4491, 3471, 2915, 1911, # 6454 + 2796, 7781, 3296, 1122, 377, 3220, 7782, 360, 7783, 7784, 4200, 1529, 551, 7785, 2059, 3693, # 6470 + 1769, 2426, 7786, 2916, 4201, 3297, 3097, 2322, 2108, 2030, 4492, 1404, 136, 1468, 1479, 672, # 6486 + 1171, 3221, 2303, 271, 3151, 7787, 2762, 7788, 2049, 678, 2727, 865, 1947, 4493, 7789, 2013, # 6502 + 3995, 2956, 7790, 2728, 2223, 1397, 3048, 3694, 4494, 4495, 1735, 2917, 3366, 3576, 7791, 3816, # 6518 + 509, 2841, 2453, 2876, 3817, 7792, 7793, 3152, 3153, 4496, 4202, 2531, 4497, 2304, 1166, 1010, # 6534 + 552, 681, 1887, 7794, 7795, 2957, 2958, 3996, 1287, 1596, 1861, 3154, 358, 453, 736, 175, # 6550 + 478, 1117, 905, 1167, 1097, 7796, 1853, 1530, 7797, 1706, 7798, 2178, 3472, 2287, 3695, 3473, # 6566 + 3577, 4203, 2092, 4204, 7799, 3367, 1193, 2482, 4205, 1458, 2190, 2205, 1862, 1888, 1421, 3298, # 6582 + 2918, 3049, 2179, 3474, 595, 2122, 7800, 3997, 7801, 7802, 4206, 1707, 2636, 223, 3696, 1359, # 6598 + 751, 3098, 183, 3475, 7803, 2797, 3003, 419, 2369, 633, 704, 3818, 2389, 241, 7804, 7805, # 6614 + 7806, 838, 3004, 3697, 2272, 2763, 2454, 3819, 1938, 2050, 3998, 1309, 3099, 2242, 1181, 7807, # 6630 + 1136, 2206, 3820, 2370, 1446, 4207, 2305, 4498, 7808, 7809, 4208, 1055, 2605, 484, 3698, 7810, # 6646 + 3999, 625, 4209, 2273, 3368, 1499, 4210, 4000, 7811, 4001, 4211, 3222, 2274, 2275, 3476, 7812, # 6662 + 7813, 2764, 808, 2606, 3699, 3369, 4002, 4212, 3100, 2532, 526, 3370, 3821, 4213, 955, 7814, # 6678 + 1620, 4214, 2637, 2427, 7815, 1429, 3700, 1669, 1831, 994, 928, 7816, 3578, 1260, 7817, 7818, # 6694 + 7819, 1948, 2288, 741, 2919, 1626, 4215, 2729, 2455, 867, 1184, 362, 3371, 1392, 7820, 7821, # 6710 + 4003, 4216, 1770, 1736, 3223, 2920, 4499, 4500, 1928, 2698, 1459, 1158, 7822, 3050, 3372, 2877, # 6726 + 1292, 1929, 2506, 2842, 3701, 1985, 1187, 2071, 2014, 2607, 4217, 7823, 2566, 2507, 2169, 3702, # 6742 + 2483, 3299, 7824, 3703, 4501, 7825, 7826, 666, 1003, 3005, 1022, 3579, 4218, 7827, 4502, 1813, # 6758 + 2253, 574, 3822, 1603, 295, 1535, 705, 3823, 4219, 283, 858, 417, 7828, 7829, 3224, 4503, # 6774 + 4504, 3051, 1220, 1889, 1046, 2276, 2456, 4004, 1393, 1599, 689, 2567, 388, 4220, 7830, 2484, # 6790 + 802, 7831, 2798, 3824, 2060, 1405, 2254, 7832, 4505, 3825, 2109, 1052, 1345, 3225, 1585, 7833, # 6806 + 809, 7834, 7835, 7836, 575, 2730, 3477, 956, 1552, 1469, 1144, 2323, 7837, 2324, 1560, 2457, # 6822 + 3580, 3226, 4005, 616, 2207, 3155, 2180, 2289, 7838, 1832, 7839, 3478, 4506, 7840, 1319, 3704, # 6838 + 3705, 1211, 3581, 1023, 3227, 1293, 2799, 7841, 7842, 7843, 3826, 607, 2306, 3827, 762, 2878, # 6854 + 1439, 4221, 1360, 7844, 1485, 3052, 7845, 4507, 1038, 4222, 1450, 2061, 2638, 4223, 1379, 4508, # 6870 + 2585, 7846, 7847, 4224, 1352, 1414, 2325, 2921, 1172, 7848, 7849, 3828, 3829, 7850, 1797, 1451, # 6886 + 7851, 7852, 7853, 7854, 2922, 4006, 4007, 2485, 2346, 411, 4008, 4009, 3582, 3300, 3101, 4509, # 6902 + 1561, 2664, 1452, 4010, 1375, 7855, 7856, 47, 2959, 316, 7857, 1406, 1591, 2923, 3156, 7858, # 6918 + 1025, 2141, 3102, 3157, 354, 2731, 884, 2224, 4225, 2407, 508, 3706, 726, 3583, 996, 2428, # 6934 + 3584, 729, 7859, 392, 2191, 1453, 4011, 4510, 3707, 7860, 7861, 2458, 3585, 2608, 1675, 2800, # 6950 + 919, 2347, 2960, 2348, 1270, 4511, 4012, 73, 7862, 7863, 647, 7864, 3228, 2843, 2255, 1550, # 6966 + 1346, 3006, 7865, 1332, 883, 3479, 7866, 7867, 7868, 7869, 3301, 2765, 7870, 1212, 831, 1347, # 6982 + 4226, 4512, 2326, 3830, 1863, 3053, 720, 3831, 4513, 4514, 3832, 7871, 4227, 7872, 7873, 4515, # 6998 + 7874, 7875, 1798, 4516, 3708, 2609, 4517, 3586, 1645, 2371, 7876, 7877, 2924, 669, 2208, 2665, # 7014 + 2429, 7878, 2879, 7879, 7880, 1028, 3229, 7881, 4228, 2408, 7882, 2256, 1353, 7883, 7884, 4518, # 7030 + 3158, 518, 7885, 4013, 7886, 4229, 1960, 7887, 2142, 4230, 7888, 7889, 3007, 2349, 2350, 3833, # 7046 + 516, 1833, 1454, 4014, 2699, 4231, 4519, 2225, 2610, 1971, 1129, 3587, 7890, 2766, 7891, 2961, # 7062 + 1422, 577, 1470, 3008, 1524, 3373, 7892, 7893, 432, 4232, 3054, 3480, 7894, 2586, 1455, 2508, # 7078 + 2226, 1972, 1175, 7895, 1020, 2732, 4015, 3481, 4520, 7896, 2733, 7897, 1743, 1361, 3055, 3482, # 7094 + 2639, 4016, 4233, 4521, 2290, 895, 924, 4234, 2170, 331, 2243, 3056, 166, 1627, 3057, 1098, # 7110 + 7898, 1232, 2880, 2227, 3374, 4522, 657, 403, 1196, 2372, 542, 3709, 3375, 1600, 4235, 3483, # 7126 + 7899, 4523, 2767, 3230, 576, 530, 1362, 7900, 4524, 2533, 2666, 3710, 4017, 7901, 842, 3834, # 7142 + 7902, 2801, 2031, 1014, 4018, 213, 2700, 3376, 665, 621, 4236, 7903, 3711, 2925, 2430, 7904, # 7158 + 2431, 3302, 3588, 3377, 7905, 4237, 2534, 4238, 4525, 3589, 1682, 4239, 3484, 1380, 7906, 724, # 7174 + 2277, 600, 1670, 7907, 1337, 1233, 4526, 3103, 2244, 7908, 1621, 4527, 7909, 651, 4240, 7910, # 7190 + 1612, 4241, 2611, 7911, 2844, 7912, 2734, 2307, 3058, 7913, 716, 2459, 3059, 174, 1255, 2701, # 7206 + 4019, 3590, 548, 1320, 1398, 728, 4020, 1574, 7914, 1890, 1197, 3060, 4021, 7915, 3061, 3062, # 7222 + 3712, 3591, 3713, 747, 7916, 635, 4242, 4528, 7917, 7918, 7919, 4243, 7920, 7921, 4529, 7922, # 7238 + 3378, 4530, 2432, 451, 7923, 3714, 2535, 2072, 4244, 2735, 4245, 4022, 7924, 1764, 4531, 7925, # 7254 + 4246, 350, 7926, 2278, 2390, 2486, 7927, 4247, 4023, 2245, 1434, 4024, 488, 4532, 458, 4248, # 7270 + 4025, 3715, 771, 1330, 2391, 3835, 2568, 3159, 2159, 2409, 1553, 2667, 3160, 4249, 7928, 2487, # 7286 + 2881, 2612, 1720, 2702, 4250, 3379, 4533, 7929, 2536, 4251, 7930, 3231, 4252, 2768, 7931, 2015, # 7302 + 2736, 7932, 1155, 1017, 3716, 3836, 7933, 3303, 2308, 201, 1864, 4253, 1430, 7934, 4026, 7935, # 7318 + 7936, 7937, 7938, 7939, 4254, 1604, 7940, 414, 1865, 371, 2587, 4534, 4535, 3485, 2016, 3104, # 7334 + 4536, 1708, 960, 4255, 887, 389, 2171, 1536, 1663, 1721, 7941, 2228, 4027, 2351, 2926, 1580, # 7350 + 7942, 7943, 7944, 1744, 7945, 2537, 4537, 4538, 7946, 4539, 7947, 2073, 7948, 7949, 3592, 3380, # 7366 + 2882, 4256, 7950, 4257, 2640, 3381, 2802, 673, 2703, 2460, 709, 3486, 4028, 3593, 4258, 7951, # 7382 + 1148, 502, 634, 7952, 7953, 1204, 4540, 3594, 1575, 4541, 2613, 3717, 7954, 3718, 3105, 948, # 7398 + 3232, 121, 1745, 3837, 1110, 7955, 4259, 3063, 2509, 3009, 4029, 3719, 1151, 1771, 3838, 1488, # 7414 + 4030, 1986, 7956, 2433, 3487, 7957, 7958, 2093, 7959, 4260, 3839, 1213, 1407, 2803, 531, 2737, # 7430 + 2538, 3233, 1011, 1537, 7960, 2769, 4261, 3106, 1061, 7961, 3720, 3721, 1866, 2883, 7962, 2017, # 7446 + 120, 4262, 4263, 2062, 3595, 3234, 2309, 3840, 2668, 3382, 1954, 4542, 7963, 7964, 3488, 1047, # 7462 + 2704, 1266, 7965, 1368, 4543, 2845, 649, 3383, 3841, 2539, 2738, 1102, 2846, 2669, 7966, 7967, # 7478 + 1999, 7968, 1111, 3596, 2962, 7969, 2488, 3842, 3597, 2804, 1854, 3384, 3722, 7970, 7971, 3385, # 7494 + 2410, 2884, 3304, 3235, 3598, 7972, 2569, 7973, 3599, 2805, 4031, 1460, 856, 7974, 3600, 7975, # 7510 + 2885, 2963, 7976, 2886, 3843, 7977, 4264, 632, 2510, 875, 3844, 1697, 3845, 2291, 7978, 7979, # 7526 + 4544, 3010, 1239, 580, 4545, 4265, 7980, 914, 936, 2074, 1190, 4032, 1039, 2123, 7981, 7982, # 7542 + 7983, 3386, 1473, 7984, 1354, 4266, 3846, 7985, 2172, 3064, 4033, 915, 3305, 4267, 4268, 3306, # 7558 + 1605, 1834, 7986, 2739, 398, 3601, 4269, 3847, 4034, 328, 1912, 2847, 4035, 3848, 1331, 4270, # 7574 + 3011, 937, 4271, 7987, 3602, 4036, 4037, 3387, 2160, 4546, 3388, 524, 742, 538, 3065, 1012, # 7590 + 7988, 7989, 3849, 2461, 7990, 658, 1103, 225, 3850, 7991, 7992, 4547, 7993, 4548, 7994, 3236, # 7606 + 1243, 7995, 4038, 963, 2246, 4549, 7996, 2705, 3603, 3161, 7997, 7998, 2588, 2327, 7999, 4550, # 7622 + 8000, 8001, 8002, 3489, 3307, 957, 3389, 2540, 2032, 1930, 2927, 2462, 870, 2018, 3604, 1746, # 7638 + 2770, 2771, 2434, 2463, 8003, 3851, 8004, 3723, 3107, 3724, 3490, 3390, 3725, 8005, 1179, 3066, # 7654 + 8006, 3162, 2373, 4272, 3726, 2541, 3163, 3108, 2740, 4039, 8007, 3391, 1556, 2542, 2292, 977, # 7670 + 2887, 2033, 4040, 1205, 3392, 8008, 1765, 3393, 3164, 2124, 1271, 1689, 714, 4551, 3491, 8009, # 7686 + 2328, 3852, 533, 4273, 3605, 2181, 617, 8010, 2464, 3308, 3492, 2310, 8011, 8012, 3165, 8013, # 7702 + 8014, 3853, 1987, 618, 427, 2641, 3493, 3394, 8015, 8016, 1244, 1690, 8017, 2806, 4274, 4552, # 7718 + 8018, 3494, 8019, 8020, 2279, 1576, 473, 3606, 4275, 3395, 972, 8021, 3607, 8022, 3067, 8023, # 7734 + 8024, 4553, 4554, 8025, 3727, 4041, 4042, 8026, 153, 4555, 356, 8027, 1891, 2888, 4276, 2143, # 7750 + 408, 803, 2352, 8028, 3854, 8029, 4277, 1646, 2570, 2511, 4556, 4557, 3855, 8030, 3856, 4278, # 7766 + 8031, 2411, 3396, 752, 8032, 8033, 1961, 2964, 8034, 746, 3012, 2465, 8035, 4279, 3728, 698, # 7782 + 4558, 1892, 4280, 3608, 2543, 4559, 3609, 3857, 8036, 3166, 3397, 8037, 1823, 1302, 4043, 2706, # 7798 + 3858, 1973, 4281, 8038, 4282, 3167, 823, 1303, 1288, 1236, 2848, 3495, 4044, 3398, 774, 3859, # 7814 + 8039, 1581, 4560, 1304, 2849, 3860, 4561, 8040, 2435, 2161, 1083, 3237, 4283, 4045, 4284, 344, # 7830 + 1173, 288, 2311, 454, 1683, 8041, 8042, 1461, 4562, 4046, 2589, 8043, 8044, 4563, 985, 894, # 7846 + 8045, 3399, 3168, 8046, 1913, 2928, 3729, 1988, 8047, 2110, 1974, 8048, 4047, 8049, 2571, 1194, # 7862 + 425, 8050, 4564, 3169, 1245, 3730, 4285, 8051, 8052, 2850, 8053, 636, 4565, 1855, 3861, 760, # 7878 + 1799, 8054, 4286, 2209, 1508, 4566, 4048, 1893, 1684, 2293, 8055, 8056, 8057, 4287, 4288, 2210, # 7894 + 479, 8058, 8059, 832, 8060, 4049, 2489, 8061, 2965, 2490, 3731, 990, 3109, 627, 1814, 2642, # 7910 + 4289, 1582, 4290, 2125, 2111, 3496, 4567, 8062, 799, 4291, 3170, 8063, 4568, 2112, 1737, 3013, # 7926 + 1018, 543, 754, 4292, 3309, 1676, 4569, 4570, 4050, 8064, 1489, 8065, 3497, 8066, 2614, 2889, # 7942 + 4051, 8067, 8068, 2966, 8069, 8070, 8071, 8072, 3171, 4571, 4572, 2182, 1722, 8073, 3238, 3239, # 7958 + 1842, 3610, 1715, 481, 365, 1975, 1856, 8074, 8075, 1962, 2491, 4573, 8076, 2126, 3611, 3240, # 7974 + 433, 1894, 2063, 2075, 8077, 602, 2741, 8078, 8079, 8080, 8081, 8082, 3014, 1628, 3400, 8083, # 7990 + 3172, 4574, 4052, 2890, 4575, 2512, 8084, 2544, 2772, 8085, 8086, 8087, 3310, 4576, 2891, 8088, # 8006 + 4577, 8089, 2851, 4578, 4579, 1221, 2967, 4053, 2513, 8090, 8091, 8092, 1867, 1989, 8093, 8094, # 8022 + 8095, 1895, 8096, 8097, 4580, 1896, 4054, 318, 8098, 2094, 4055, 4293, 8099, 8100, 485, 8101, # 8038 + 938, 3862, 553, 2670, 116, 8102, 3863, 3612, 8103, 3498, 2671, 2773, 3401, 3311, 2807, 8104, # 8054 + 3613, 2929, 4056, 1747, 2930, 2968, 8105, 8106, 207, 8107, 8108, 2672, 4581, 2514, 8109, 3015, # 8070 + 890, 3614, 3864, 8110, 1877, 3732, 3402, 8111, 2183, 2353, 3403, 1652, 8112, 8113, 8114, 941, # 8086 + 2294, 208, 3499, 4057, 2019, 330, 4294, 3865, 2892, 2492, 3733, 4295, 8115, 8116, 8117, 8118, # 8102 +) +# fmt: on diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..a37ab18 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCTWDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import EUCTW_SM_MODEL + + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self) -> str: + return "EUC-TW" + + @property + def language(self) -> str: + return "Taiwan" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..b32bfc7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,284 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +# fmt: off +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) +# fmt: on diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..d423e73 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import GB2312DistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import GB2312_SM_MODEL + + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self) -> str: + return "GB2312" + + @property + def language(self) -> str: + return "Chinese" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..785d005 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,316 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import Optional, Union + +from .charsetprober import CharSetProber +from .enums import ProbingState +from .sbcharsetprober import SingleByteCharSetProber + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + + +class HebrewProber(CharSetProber): + SPACE = 0x20 + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xEA + NORMAL_KAF = 0xEB + FINAL_MEM = 0xED + NORMAL_MEM = 0xEE + FINAL_NUN = 0xEF + NORMAL_NUN = 0xF0 + FINAL_PE = 0xF3 + NORMAL_PE = 0xF4 + FINAL_TSADI = 0xF5 + NORMAL_TSADI = 0xF6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self) -> None: + super().__init__() + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + self._prev = self.SPACE + self._before_prev = self.SPACE + self._logical_prober: Optional[SingleByteCharSetProber] = None + self._visual_prober: Optional[SingleByteCharSetProber] = None + self.reset() + + def reset(self) -> None: + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = self.SPACE + self._before_prev = self.SPACE + # These probers are owned by the group prober. + + def set_model_probers( + self, + logical_prober: SingleByteCharSetProber, + visual_prober: SingleByteCharSetProber, + ) -> None: + self._logical_prober = logical_prober + self._visual_prober = visual_prober + + def is_final(self, c: int) -> bool: + return c in [ + self.FINAL_KAF, + self.FINAL_MEM, + self.FINAL_NUN, + self.FINAL_PE, + self.FINAL_TSADI, + ] + + def is_non_final(self, c: int) -> bool: + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == self.SPACE: + # We stand on a space - a word just ended + if self._before_prev != self.SPACE: + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ( + (self._before_prev == self.SPACE) + and (self.is_final(self._prev)) + and (cur != self.SPACE) + ): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self) -> str: + assert self._logical_prober is not None + assert self._visual_prober is not None + + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = ( + self._logical_prober.get_confidence() - self._visual_prober.get_confidence() + ) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self) -> str: + return "Hebrew" + + @property + def state(self) -> ProbingState: + assert self._logical_prober is not None + assert self._visual_prober is not None + + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and ( + self._visual_prober.state == ProbingState.NOT_ME + ): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..3293576 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +# fmt: off +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) +# fmt: on diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py new file mode 100644 index 0000000..c129699 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py @@ -0,0 +1,2382 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# The frequency data itself is the same as euc-kr. +# This is just a mapping table to euc-kr. + +JOHAB_TO_EUCKR_ORDER_TABLE = { + 0x8861: 0, + 0x8862: 1, + 0x8865: 2, + 0x8868: 3, + 0x8869: 4, + 0x886A: 5, + 0x886B: 6, + 0x8871: 7, + 0x8873: 8, + 0x8874: 9, + 0x8875: 10, + 0x8876: 11, + 0x8877: 12, + 0x8878: 13, + 0x8879: 14, + 0x887B: 15, + 0x887C: 16, + 0x887D: 17, + 0x8881: 18, + 0x8882: 19, + 0x8885: 20, + 0x8889: 21, + 0x8891: 22, + 0x8893: 23, + 0x8895: 24, + 0x8896: 25, + 0x8897: 26, + 0x88A1: 27, + 0x88A2: 28, + 0x88A5: 29, + 0x88A9: 30, + 0x88B5: 31, + 0x88B7: 32, + 0x88C1: 33, + 0x88C5: 34, + 0x88C9: 35, + 0x88E1: 36, + 0x88E2: 37, + 0x88E5: 38, + 0x88E8: 39, + 0x88E9: 40, + 0x88EB: 41, + 0x88F1: 42, + 0x88F3: 43, + 0x88F5: 44, + 0x88F6: 45, + 0x88F7: 46, + 0x88F8: 47, + 0x88FB: 48, + 0x88FC: 49, + 0x88FD: 50, + 0x8941: 51, + 0x8945: 52, + 0x8949: 53, + 0x8951: 54, + 0x8953: 55, + 0x8955: 56, + 0x8956: 57, + 0x8957: 58, + 0x8961: 59, + 0x8962: 60, + 0x8963: 61, + 0x8965: 62, + 0x8968: 63, + 0x8969: 64, + 0x8971: 65, + 0x8973: 66, + 0x8975: 67, + 0x8976: 68, + 0x8977: 69, + 0x897B: 70, + 0x8981: 71, + 0x8985: 72, + 0x8989: 73, + 0x8993: 74, + 0x8995: 75, + 0x89A1: 76, + 0x89A2: 77, + 0x89A5: 78, + 0x89A8: 79, + 0x89A9: 80, + 0x89AB: 81, + 0x89AD: 82, + 0x89B0: 83, + 0x89B1: 84, + 0x89B3: 85, + 0x89B5: 86, + 0x89B7: 87, + 0x89B8: 88, + 0x89C1: 89, + 0x89C2: 90, + 0x89C5: 91, + 0x89C9: 92, + 0x89CB: 93, + 0x89D1: 94, + 0x89D3: 95, + 0x89D5: 96, + 0x89D7: 97, + 0x89E1: 98, + 0x89E5: 99, + 0x89E9: 100, + 0x89F3: 101, + 0x89F6: 102, + 0x89F7: 103, + 0x8A41: 104, + 0x8A42: 105, + 0x8A45: 106, + 0x8A49: 107, + 0x8A51: 108, + 0x8A53: 109, + 0x8A55: 110, + 0x8A57: 111, + 0x8A61: 112, + 0x8A65: 113, + 0x8A69: 114, + 0x8A73: 115, + 0x8A75: 116, + 0x8A81: 117, + 0x8A82: 118, + 0x8A85: 119, + 0x8A88: 120, + 0x8A89: 121, + 0x8A8A: 122, + 0x8A8B: 123, + 0x8A90: 124, + 0x8A91: 125, + 0x8A93: 126, + 0x8A95: 127, + 0x8A97: 128, + 0x8A98: 129, + 0x8AA1: 130, + 0x8AA2: 131, + 0x8AA5: 132, + 0x8AA9: 133, + 0x8AB6: 134, + 0x8AB7: 135, + 0x8AC1: 136, + 0x8AD5: 137, + 0x8AE1: 138, + 0x8AE2: 139, + 0x8AE5: 140, + 0x8AE9: 141, + 0x8AF1: 142, + 0x8AF3: 143, + 0x8AF5: 144, + 0x8B41: 145, + 0x8B45: 146, + 0x8B49: 147, + 0x8B61: 148, + 0x8B62: 149, + 0x8B65: 150, + 0x8B68: 151, + 0x8B69: 152, + 0x8B6A: 153, + 0x8B71: 154, + 0x8B73: 155, + 0x8B75: 156, + 0x8B77: 157, + 0x8B81: 158, + 0x8BA1: 159, + 0x8BA2: 160, + 0x8BA5: 161, + 0x8BA8: 162, + 0x8BA9: 163, + 0x8BAB: 164, + 0x8BB1: 165, + 0x8BB3: 166, + 0x8BB5: 167, + 0x8BB7: 168, + 0x8BB8: 169, + 0x8BBC: 170, + 0x8C61: 171, + 0x8C62: 172, + 0x8C63: 173, + 0x8C65: 174, + 0x8C69: 175, + 0x8C6B: 176, + 0x8C71: 177, + 0x8C73: 178, + 0x8C75: 179, + 0x8C76: 180, + 0x8C77: 181, + 0x8C7B: 182, + 0x8C81: 183, + 0x8C82: 184, + 0x8C85: 185, + 0x8C89: 186, + 0x8C91: 187, + 0x8C93: 188, + 0x8C95: 189, + 0x8C96: 190, + 0x8C97: 191, + 0x8CA1: 192, + 0x8CA2: 193, + 0x8CA9: 194, + 0x8CE1: 195, + 0x8CE2: 196, + 0x8CE3: 197, + 0x8CE5: 198, + 0x8CE9: 199, + 0x8CF1: 200, + 0x8CF3: 201, + 0x8CF5: 202, + 0x8CF6: 203, + 0x8CF7: 204, + 0x8D41: 205, + 0x8D42: 206, + 0x8D45: 207, + 0x8D51: 208, + 0x8D55: 209, + 0x8D57: 210, + 0x8D61: 211, + 0x8D65: 212, + 0x8D69: 213, + 0x8D75: 214, + 0x8D76: 215, + 0x8D7B: 216, + 0x8D81: 217, + 0x8DA1: 218, + 0x8DA2: 219, + 0x8DA5: 220, + 0x8DA7: 221, + 0x8DA9: 222, + 0x8DB1: 223, + 0x8DB3: 224, + 0x8DB5: 225, + 0x8DB7: 226, + 0x8DB8: 227, + 0x8DB9: 228, + 0x8DC1: 229, + 0x8DC2: 230, + 0x8DC9: 231, + 0x8DD6: 232, + 0x8DD7: 233, + 0x8DE1: 234, + 0x8DE2: 235, + 0x8DF7: 236, + 0x8E41: 237, + 0x8E45: 238, + 0x8E49: 239, + 0x8E51: 240, + 0x8E53: 241, + 0x8E57: 242, + 0x8E61: 243, + 0x8E81: 244, + 0x8E82: 245, + 0x8E85: 246, + 0x8E89: 247, + 0x8E90: 248, + 0x8E91: 249, + 0x8E93: 250, + 0x8E95: 251, + 0x8E97: 252, + 0x8E98: 253, + 0x8EA1: 254, + 0x8EA9: 255, + 0x8EB6: 256, + 0x8EB7: 257, + 0x8EC1: 258, + 0x8EC2: 259, + 0x8EC5: 260, + 0x8EC9: 261, + 0x8ED1: 262, + 0x8ED3: 263, + 0x8ED6: 264, + 0x8EE1: 265, + 0x8EE5: 266, + 0x8EE9: 267, + 0x8EF1: 268, + 0x8EF3: 269, + 0x8F41: 270, + 0x8F61: 271, + 0x8F62: 272, + 0x8F65: 273, + 0x8F67: 274, + 0x8F69: 275, + 0x8F6B: 276, + 0x8F70: 277, + 0x8F71: 278, + 0x8F73: 279, + 0x8F75: 280, + 0x8F77: 281, + 0x8F7B: 282, + 0x8FA1: 283, + 0x8FA2: 284, + 0x8FA5: 285, + 0x8FA9: 286, + 0x8FB1: 287, + 0x8FB3: 288, + 0x8FB5: 289, + 0x8FB7: 290, + 0x9061: 291, + 0x9062: 292, + 0x9063: 293, + 0x9065: 294, + 0x9068: 295, + 0x9069: 296, + 0x906A: 297, + 0x906B: 298, + 0x9071: 299, + 0x9073: 300, + 0x9075: 301, + 0x9076: 302, + 0x9077: 303, + 0x9078: 304, + 0x9079: 305, + 0x907B: 306, + 0x907D: 307, + 0x9081: 308, + 0x9082: 309, + 0x9085: 310, + 0x9089: 311, + 0x9091: 312, + 0x9093: 313, + 0x9095: 314, + 0x9096: 315, + 0x9097: 316, + 0x90A1: 317, + 0x90A2: 318, + 0x90A5: 319, + 0x90A9: 320, + 0x90B1: 321, + 0x90B7: 322, + 0x90E1: 323, + 0x90E2: 324, + 0x90E4: 325, + 0x90E5: 326, + 0x90E9: 327, + 0x90EB: 328, + 0x90EC: 329, + 0x90F1: 330, + 0x90F3: 331, + 0x90F5: 332, + 0x90F6: 333, + 0x90F7: 334, + 0x90FD: 335, + 0x9141: 336, + 0x9142: 337, + 0x9145: 338, + 0x9149: 339, + 0x9151: 340, + 0x9153: 341, + 0x9155: 342, + 0x9156: 343, + 0x9157: 344, + 0x9161: 345, + 0x9162: 346, + 0x9165: 347, + 0x9169: 348, + 0x9171: 349, + 0x9173: 350, + 0x9176: 351, + 0x9177: 352, + 0x917A: 353, + 0x9181: 354, + 0x9185: 355, + 0x91A1: 356, + 0x91A2: 357, + 0x91A5: 358, + 0x91A9: 359, + 0x91AB: 360, + 0x91B1: 361, + 0x91B3: 362, + 0x91B5: 363, + 0x91B7: 364, + 0x91BC: 365, + 0x91BD: 366, + 0x91C1: 367, + 0x91C5: 368, + 0x91C9: 369, + 0x91D6: 370, + 0x9241: 371, + 0x9245: 372, + 0x9249: 373, + 0x9251: 374, + 0x9253: 375, + 0x9255: 376, + 0x9261: 377, + 0x9262: 378, + 0x9265: 379, + 0x9269: 380, + 0x9273: 381, + 0x9275: 382, + 0x9277: 383, + 0x9281: 384, + 0x9282: 385, + 0x9285: 386, + 0x9288: 387, + 0x9289: 388, + 0x9291: 389, + 0x9293: 390, + 0x9295: 391, + 0x9297: 392, + 0x92A1: 393, + 0x92B6: 394, + 0x92C1: 395, + 0x92E1: 396, + 0x92E5: 397, + 0x92E9: 398, + 0x92F1: 399, + 0x92F3: 400, + 0x9341: 401, + 0x9342: 402, + 0x9349: 403, + 0x9351: 404, + 0x9353: 405, + 0x9357: 406, + 0x9361: 407, + 0x9362: 408, + 0x9365: 409, + 0x9369: 410, + 0x936A: 411, + 0x936B: 412, + 0x9371: 413, + 0x9373: 414, + 0x9375: 415, + 0x9377: 416, + 0x9378: 417, + 0x937C: 418, + 0x9381: 419, + 0x9385: 420, + 0x9389: 421, + 0x93A1: 422, + 0x93A2: 423, + 0x93A5: 424, + 0x93A9: 425, + 0x93AB: 426, + 0x93B1: 427, + 0x93B3: 428, + 0x93B5: 429, + 0x93B7: 430, + 0x93BC: 431, + 0x9461: 432, + 0x9462: 433, + 0x9463: 434, + 0x9465: 435, + 0x9468: 436, + 0x9469: 437, + 0x946A: 438, + 0x946B: 439, + 0x946C: 440, + 0x9470: 441, + 0x9471: 442, + 0x9473: 443, + 0x9475: 444, + 0x9476: 445, + 0x9477: 446, + 0x9478: 447, + 0x9479: 448, + 0x947D: 449, + 0x9481: 450, + 0x9482: 451, + 0x9485: 452, + 0x9489: 453, + 0x9491: 454, + 0x9493: 455, + 0x9495: 456, + 0x9496: 457, + 0x9497: 458, + 0x94A1: 459, + 0x94E1: 460, + 0x94E2: 461, + 0x94E3: 462, + 0x94E5: 463, + 0x94E8: 464, + 0x94E9: 465, + 0x94EB: 466, + 0x94EC: 467, + 0x94F1: 468, + 0x94F3: 469, + 0x94F5: 470, + 0x94F7: 471, + 0x94F9: 472, + 0x94FC: 473, + 0x9541: 474, + 0x9542: 475, + 0x9545: 476, + 0x9549: 477, + 0x9551: 478, + 0x9553: 479, + 0x9555: 480, + 0x9556: 481, + 0x9557: 482, + 0x9561: 483, + 0x9565: 484, + 0x9569: 485, + 0x9576: 486, + 0x9577: 487, + 0x9581: 488, + 0x9585: 489, + 0x95A1: 490, + 0x95A2: 491, + 0x95A5: 492, + 0x95A8: 493, + 0x95A9: 494, + 0x95AB: 495, + 0x95AD: 496, + 0x95B1: 497, + 0x95B3: 498, + 0x95B5: 499, + 0x95B7: 500, + 0x95B9: 501, + 0x95BB: 502, + 0x95C1: 503, + 0x95C5: 504, + 0x95C9: 505, + 0x95E1: 506, + 0x95F6: 507, + 0x9641: 508, + 0x9645: 509, + 0x9649: 510, + 0x9651: 511, + 0x9653: 512, + 0x9655: 513, + 0x9661: 514, + 0x9681: 515, + 0x9682: 516, + 0x9685: 517, + 0x9689: 518, + 0x9691: 519, + 0x9693: 520, + 0x9695: 521, + 0x9697: 522, + 0x96A1: 523, + 0x96B6: 524, + 0x96C1: 525, + 0x96D7: 526, + 0x96E1: 527, + 0x96E5: 528, + 0x96E9: 529, + 0x96F3: 530, + 0x96F5: 531, + 0x96F7: 532, + 0x9741: 533, + 0x9745: 534, + 0x9749: 535, + 0x9751: 536, + 0x9757: 537, + 0x9761: 538, + 0x9762: 539, + 0x9765: 540, + 0x9768: 541, + 0x9769: 542, + 0x976B: 543, + 0x9771: 544, + 0x9773: 545, + 0x9775: 546, + 0x9777: 547, + 0x9781: 548, + 0x97A1: 549, + 0x97A2: 550, + 0x97A5: 551, + 0x97A8: 552, + 0x97A9: 553, + 0x97B1: 554, + 0x97B3: 555, + 0x97B5: 556, + 0x97B6: 557, + 0x97B7: 558, + 0x97B8: 559, + 0x9861: 560, + 0x9862: 561, + 0x9865: 562, + 0x9869: 563, + 0x9871: 564, + 0x9873: 565, + 0x9875: 566, + 0x9876: 567, + 0x9877: 568, + 0x987D: 569, + 0x9881: 570, + 0x9882: 571, + 0x9885: 572, + 0x9889: 573, + 0x9891: 574, + 0x9893: 575, + 0x9895: 576, + 0x9896: 577, + 0x9897: 578, + 0x98E1: 579, + 0x98E2: 580, + 0x98E5: 581, + 0x98E9: 582, + 0x98EB: 583, + 0x98EC: 584, + 0x98F1: 585, + 0x98F3: 586, + 0x98F5: 587, + 0x98F6: 588, + 0x98F7: 589, + 0x98FD: 590, + 0x9941: 591, + 0x9942: 592, + 0x9945: 593, + 0x9949: 594, + 0x9951: 595, + 0x9953: 596, + 0x9955: 597, + 0x9956: 598, + 0x9957: 599, + 0x9961: 600, + 0x9976: 601, + 0x99A1: 602, + 0x99A2: 603, + 0x99A5: 604, + 0x99A9: 605, + 0x99B7: 606, + 0x99C1: 607, + 0x99C9: 608, + 0x99E1: 609, + 0x9A41: 610, + 0x9A45: 611, + 0x9A81: 612, + 0x9A82: 613, + 0x9A85: 614, + 0x9A89: 615, + 0x9A90: 616, + 0x9A91: 617, + 0x9A97: 618, + 0x9AC1: 619, + 0x9AE1: 620, + 0x9AE5: 621, + 0x9AE9: 622, + 0x9AF1: 623, + 0x9AF3: 624, + 0x9AF7: 625, + 0x9B61: 626, + 0x9B62: 627, + 0x9B65: 628, + 0x9B68: 629, + 0x9B69: 630, + 0x9B71: 631, + 0x9B73: 632, + 0x9B75: 633, + 0x9B81: 634, + 0x9B85: 635, + 0x9B89: 636, + 0x9B91: 637, + 0x9B93: 638, + 0x9BA1: 639, + 0x9BA5: 640, + 0x9BA9: 641, + 0x9BB1: 642, + 0x9BB3: 643, + 0x9BB5: 644, + 0x9BB7: 645, + 0x9C61: 646, + 0x9C62: 647, + 0x9C65: 648, + 0x9C69: 649, + 0x9C71: 650, + 0x9C73: 651, + 0x9C75: 652, + 0x9C76: 653, + 0x9C77: 654, + 0x9C78: 655, + 0x9C7C: 656, + 0x9C7D: 657, + 0x9C81: 658, + 0x9C82: 659, + 0x9C85: 660, + 0x9C89: 661, + 0x9C91: 662, + 0x9C93: 663, + 0x9C95: 664, + 0x9C96: 665, + 0x9C97: 666, + 0x9CA1: 667, + 0x9CA2: 668, + 0x9CA5: 669, + 0x9CB5: 670, + 0x9CB7: 671, + 0x9CE1: 672, + 0x9CE2: 673, + 0x9CE5: 674, + 0x9CE9: 675, + 0x9CF1: 676, + 0x9CF3: 677, + 0x9CF5: 678, + 0x9CF6: 679, + 0x9CF7: 680, + 0x9CFD: 681, + 0x9D41: 682, + 0x9D42: 683, + 0x9D45: 684, + 0x9D49: 685, + 0x9D51: 686, + 0x9D53: 687, + 0x9D55: 688, + 0x9D57: 689, + 0x9D61: 690, + 0x9D62: 691, + 0x9D65: 692, + 0x9D69: 693, + 0x9D71: 694, + 0x9D73: 695, + 0x9D75: 696, + 0x9D76: 697, + 0x9D77: 698, + 0x9D81: 699, + 0x9D85: 700, + 0x9D93: 701, + 0x9D95: 702, + 0x9DA1: 703, + 0x9DA2: 704, + 0x9DA5: 705, + 0x9DA9: 706, + 0x9DB1: 707, + 0x9DB3: 708, + 0x9DB5: 709, + 0x9DB7: 710, + 0x9DC1: 711, + 0x9DC5: 712, + 0x9DD7: 713, + 0x9DF6: 714, + 0x9E41: 715, + 0x9E45: 716, + 0x9E49: 717, + 0x9E51: 718, + 0x9E53: 719, + 0x9E55: 720, + 0x9E57: 721, + 0x9E61: 722, + 0x9E65: 723, + 0x9E69: 724, + 0x9E73: 725, + 0x9E75: 726, + 0x9E77: 727, + 0x9E81: 728, + 0x9E82: 729, + 0x9E85: 730, + 0x9E89: 731, + 0x9E91: 732, + 0x9E93: 733, + 0x9E95: 734, + 0x9E97: 735, + 0x9EA1: 736, + 0x9EB6: 737, + 0x9EC1: 738, + 0x9EE1: 739, + 0x9EE2: 740, + 0x9EE5: 741, + 0x9EE9: 742, + 0x9EF1: 743, + 0x9EF5: 744, + 0x9EF7: 745, + 0x9F41: 746, + 0x9F42: 747, + 0x9F45: 748, + 0x9F49: 749, + 0x9F51: 750, + 0x9F53: 751, + 0x9F55: 752, + 0x9F57: 753, + 0x9F61: 754, + 0x9F62: 755, + 0x9F65: 756, + 0x9F69: 757, + 0x9F71: 758, + 0x9F73: 759, + 0x9F75: 760, + 0x9F77: 761, + 0x9F78: 762, + 0x9F7B: 763, + 0x9F7C: 764, + 0x9FA1: 765, + 0x9FA2: 766, + 0x9FA5: 767, + 0x9FA9: 768, + 0x9FB1: 769, + 0x9FB3: 770, + 0x9FB5: 771, + 0x9FB7: 772, + 0xA061: 773, + 0xA062: 774, + 0xA065: 775, + 0xA067: 776, + 0xA068: 777, + 0xA069: 778, + 0xA06A: 779, + 0xA06B: 780, + 0xA071: 781, + 0xA073: 782, + 0xA075: 783, + 0xA077: 784, + 0xA078: 785, + 0xA07B: 786, + 0xA07D: 787, + 0xA081: 788, + 0xA082: 789, + 0xA085: 790, + 0xA089: 791, + 0xA091: 792, + 0xA093: 793, + 0xA095: 794, + 0xA096: 795, + 0xA097: 796, + 0xA098: 797, + 0xA0A1: 798, + 0xA0A2: 799, + 0xA0A9: 800, + 0xA0B7: 801, + 0xA0E1: 802, + 0xA0E2: 803, + 0xA0E5: 804, + 0xA0E9: 805, + 0xA0EB: 806, + 0xA0F1: 807, + 0xA0F3: 808, + 0xA0F5: 809, + 0xA0F7: 810, + 0xA0F8: 811, + 0xA0FD: 812, + 0xA141: 813, + 0xA142: 814, + 0xA145: 815, + 0xA149: 816, + 0xA151: 817, + 0xA153: 818, + 0xA155: 819, + 0xA156: 820, + 0xA157: 821, + 0xA161: 822, + 0xA162: 823, + 0xA165: 824, + 0xA169: 825, + 0xA175: 826, + 0xA176: 827, + 0xA177: 828, + 0xA179: 829, + 0xA181: 830, + 0xA1A1: 831, + 0xA1A2: 832, + 0xA1A4: 833, + 0xA1A5: 834, + 0xA1A9: 835, + 0xA1AB: 836, + 0xA1B1: 837, + 0xA1B3: 838, + 0xA1B5: 839, + 0xA1B7: 840, + 0xA1C1: 841, + 0xA1C5: 842, + 0xA1D6: 843, + 0xA1D7: 844, + 0xA241: 845, + 0xA245: 846, + 0xA249: 847, + 0xA253: 848, + 0xA255: 849, + 0xA257: 850, + 0xA261: 851, + 0xA265: 852, + 0xA269: 853, + 0xA273: 854, + 0xA275: 855, + 0xA281: 856, + 0xA282: 857, + 0xA283: 858, + 0xA285: 859, + 0xA288: 860, + 0xA289: 861, + 0xA28A: 862, + 0xA28B: 863, + 0xA291: 864, + 0xA293: 865, + 0xA295: 866, + 0xA297: 867, + 0xA29B: 868, + 0xA29D: 869, + 0xA2A1: 870, + 0xA2A5: 871, + 0xA2A9: 872, + 0xA2B3: 873, + 0xA2B5: 874, + 0xA2C1: 875, + 0xA2E1: 876, + 0xA2E5: 877, + 0xA2E9: 878, + 0xA341: 879, + 0xA345: 880, + 0xA349: 881, + 0xA351: 882, + 0xA355: 883, + 0xA361: 884, + 0xA365: 885, + 0xA369: 886, + 0xA371: 887, + 0xA375: 888, + 0xA3A1: 889, + 0xA3A2: 890, + 0xA3A5: 891, + 0xA3A8: 892, + 0xA3A9: 893, + 0xA3AB: 894, + 0xA3B1: 895, + 0xA3B3: 896, + 0xA3B5: 897, + 0xA3B6: 898, + 0xA3B7: 899, + 0xA3B9: 900, + 0xA3BB: 901, + 0xA461: 902, + 0xA462: 903, + 0xA463: 904, + 0xA464: 905, + 0xA465: 906, + 0xA468: 907, + 0xA469: 908, + 0xA46A: 909, + 0xA46B: 910, + 0xA46C: 911, + 0xA471: 912, + 0xA473: 913, + 0xA475: 914, + 0xA477: 915, + 0xA47B: 916, + 0xA481: 917, + 0xA482: 918, + 0xA485: 919, + 0xA489: 920, + 0xA491: 921, + 0xA493: 922, + 0xA495: 923, + 0xA496: 924, + 0xA497: 925, + 0xA49B: 926, + 0xA4A1: 927, + 0xA4A2: 928, + 0xA4A5: 929, + 0xA4B3: 930, + 0xA4E1: 931, + 0xA4E2: 932, + 0xA4E5: 933, + 0xA4E8: 934, + 0xA4E9: 935, + 0xA4EB: 936, + 0xA4F1: 937, + 0xA4F3: 938, + 0xA4F5: 939, + 0xA4F7: 940, + 0xA4F8: 941, + 0xA541: 942, + 0xA542: 943, + 0xA545: 944, + 0xA548: 945, + 0xA549: 946, + 0xA551: 947, + 0xA553: 948, + 0xA555: 949, + 0xA556: 950, + 0xA557: 951, + 0xA561: 952, + 0xA562: 953, + 0xA565: 954, + 0xA569: 955, + 0xA573: 956, + 0xA575: 957, + 0xA576: 958, + 0xA577: 959, + 0xA57B: 960, + 0xA581: 961, + 0xA585: 962, + 0xA5A1: 963, + 0xA5A2: 964, + 0xA5A3: 965, + 0xA5A5: 966, + 0xA5A9: 967, + 0xA5B1: 968, + 0xA5B3: 969, + 0xA5B5: 970, + 0xA5B7: 971, + 0xA5C1: 972, + 0xA5C5: 973, + 0xA5D6: 974, + 0xA5E1: 975, + 0xA5F6: 976, + 0xA641: 977, + 0xA642: 978, + 0xA645: 979, + 0xA649: 980, + 0xA651: 981, + 0xA653: 982, + 0xA661: 983, + 0xA665: 984, + 0xA681: 985, + 0xA682: 986, + 0xA685: 987, + 0xA688: 988, + 0xA689: 989, + 0xA68A: 990, + 0xA68B: 991, + 0xA691: 992, + 0xA693: 993, + 0xA695: 994, + 0xA697: 995, + 0xA69B: 996, + 0xA69C: 997, + 0xA6A1: 998, + 0xA6A9: 999, + 0xA6B6: 1000, + 0xA6C1: 1001, + 0xA6E1: 1002, + 0xA6E2: 1003, + 0xA6E5: 1004, + 0xA6E9: 1005, + 0xA6F7: 1006, + 0xA741: 1007, + 0xA745: 1008, + 0xA749: 1009, + 0xA751: 1010, + 0xA755: 1011, + 0xA757: 1012, + 0xA761: 1013, + 0xA762: 1014, + 0xA765: 1015, + 0xA769: 1016, + 0xA771: 1017, + 0xA773: 1018, + 0xA775: 1019, + 0xA7A1: 1020, + 0xA7A2: 1021, + 0xA7A5: 1022, + 0xA7A9: 1023, + 0xA7AB: 1024, + 0xA7B1: 1025, + 0xA7B3: 1026, + 0xA7B5: 1027, + 0xA7B7: 1028, + 0xA7B8: 1029, + 0xA7B9: 1030, + 0xA861: 1031, + 0xA862: 1032, + 0xA865: 1033, + 0xA869: 1034, + 0xA86B: 1035, + 0xA871: 1036, + 0xA873: 1037, + 0xA875: 1038, + 0xA876: 1039, + 0xA877: 1040, + 0xA87D: 1041, + 0xA881: 1042, + 0xA882: 1043, + 0xA885: 1044, + 0xA889: 1045, + 0xA891: 1046, + 0xA893: 1047, + 0xA895: 1048, + 0xA896: 1049, + 0xA897: 1050, + 0xA8A1: 1051, + 0xA8A2: 1052, + 0xA8B1: 1053, + 0xA8E1: 1054, + 0xA8E2: 1055, + 0xA8E5: 1056, + 0xA8E8: 1057, + 0xA8E9: 1058, + 0xA8F1: 1059, + 0xA8F5: 1060, + 0xA8F6: 1061, + 0xA8F7: 1062, + 0xA941: 1063, + 0xA957: 1064, + 0xA961: 1065, + 0xA962: 1066, + 0xA971: 1067, + 0xA973: 1068, + 0xA975: 1069, + 0xA976: 1070, + 0xA977: 1071, + 0xA9A1: 1072, + 0xA9A2: 1073, + 0xA9A5: 1074, + 0xA9A9: 1075, + 0xA9B1: 1076, + 0xA9B3: 1077, + 0xA9B7: 1078, + 0xAA41: 1079, + 0xAA61: 1080, + 0xAA77: 1081, + 0xAA81: 1082, + 0xAA82: 1083, + 0xAA85: 1084, + 0xAA89: 1085, + 0xAA91: 1086, + 0xAA95: 1087, + 0xAA97: 1088, + 0xAB41: 1089, + 0xAB57: 1090, + 0xAB61: 1091, + 0xAB65: 1092, + 0xAB69: 1093, + 0xAB71: 1094, + 0xAB73: 1095, + 0xABA1: 1096, + 0xABA2: 1097, + 0xABA5: 1098, + 0xABA9: 1099, + 0xABB1: 1100, + 0xABB3: 1101, + 0xABB5: 1102, + 0xABB7: 1103, + 0xAC61: 1104, + 0xAC62: 1105, + 0xAC64: 1106, + 0xAC65: 1107, + 0xAC68: 1108, + 0xAC69: 1109, + 0xAC6A: 1110, + 0xAC6B: 1111, + 0xAC71: 1112, + 0xAC73: 1113, + 0xAC75: 1114, + 0xAC76: 1115, + 0xAC77: 1116, + 0xAC7B: 1117, + 0xAC81: 1118, + 0xAC82: 1119, + 0xAC85: 1120, + 0xAC89: 1121, + 0xAC91: 1122, + 0xAC93: 1123, + 0xAC95: 1124, + 0xAC96: 1125, + 0xAC97: 1126, + 0xACA1: 1127, + 0xACA2: 1128, + 0xACA5: 1129, + 0xACA9: 1130, + 0xACB1: 1131, + 0xACB3: 1132, + 0xACB5: 1133, + 0xACB7: 1134, + 0xACC1: 1135, + 0xACC5: 1136, + 0xACC9: 1137, + 0xACD1: 1138, + 0xACD7: 1139, + 0xACE1: 1140, + 0xACE2: 1141, + 0xACE3: 1142, + 0xACE4: 1143, + 0xACE5: 1144, + 0xACE8: 1145, + 0xACE9: 1146, + 0xACEB: 1147, + 0xACEC: 1148, + 0xACF1: 1149, + 0xACF3: 1150, + 0xACF5: 1151, + 0xACF6: 1152, + 0xACF7: 1153, + 0xACFC: 1154, + 0xAD41: 1155, + 0xAD42: 1156, + 0xAD45: 1157, + 0xAD49: 1158, + 0xAD51: 1159, + 0xAD53: 1160, + 0xAD55: 1161, + 0xAD56: 1162, + 0xAD57: 1163, + 0xAD61: 1164, + 0xAD62: 1165, + 0xAD65: 1166, + 0xAD69: 1167, + 0xAD71: 1168, + 0xAD73: 1169, + 0xAD75: 1170, + 0xAD76: 1171, + 0xAD77: 1172, + 0xAD81: 1173, + 0xAD85: 1174, + 0xAD89: 1175, + 0xAD97: 1176, + 0xADA1: 1177, + 0xADA2: 1178, + 0xADA3: 1179, + 0xADA5: 1180, + 0xADA9: 1181, + 0xADAB: 1182, + 0xADB1: 1183, + 0xADB3: 1184, + 0xADB5: 1185, + 0xADB7: 1186, + 0xADBB: 1187, + 0xADC1: 1188, + 0xADC2: 1189, + 0xADC5: 1190, + 0xADC9: 1191, + 0xADD7: 1192, + 0xADE1: 1193, + 0xADE5: 1194, + 0xADE9: 1195, + 0xADF1: 1196, + 0xADF5: 1197, + 0xADF6: 1198, + 0xAE41: 1199, + 0xAE45: 1200, + 0xAE49: 1201, + 0xAE51: 1202, + 0xAE53: 1203, + 0xAE55: 1204, + 0xAE61: 1205, + 0xAE62: 1206, + 0xAE65: 1207, + 0xAE69: 1208, + 0xAE71: 1209, + 0xAE73: 1210, + 0xAE75: 1211, + 0xAE77: 1212, + 0xAE81: 1213, + 0xAE82: 1214, + 0xAE85: 1215, + 0xAE88: 1216, + 0xAE89: 1217, + 0xAE91: 1218, + 0xAE93: 1219, + 0xAE95: 1220, + 0xAE97: 1221, + 0xAE99: 1222, + 0xAE9B: 1223, + 0xAE9C: 1224, + 0xAEA1: 1225, + 0xAEB6: 1226, + 0xAEC1: 1227, + 0xAEC2: 1228, + 0xAEC5: 1229, + 0xAEC9: 1230, + 0xAED1: 1231, + 0xAED7: 1232, + 0xAEE1: 1233, + 0xAEE2: 1234, + 0xAEE5: 1235, + 0xAEE9: 1236, + 0xAEF1: 1237, + 0xAEF3: 1238, + 0xAEF5: 1239, + 0xAEF7: 1240, + 0xAF41: 1241, + 0xAF42: 1242, + 0xAF49: 1243, + 0xAF51: 1244, + 0xAF55: 1245, + 0xAF57: 1246, + 0xAF61: 1247, + 0xAF62: 1248, + 0xAF65: 1249, + 0xAF69: 1250, + 0xAF6A: 1251, + 0xAF71: 1252, + 0xAF73: 1253, + 0xAF75: 1254, + 0xAF77: 1255, + 0xAFA1: 1256, + 0xAFA2: 1257, + 0xAFA5: 1258, + 0xAFA8: 1259, + 0xAFA9: 1260, + 0xAFB0: 1261, + 0xAFB1: 1262, + 0xAFB3: 1263, + 0xAFB5: 1264, + 0xAFB7: 1265, + 0xAFBC: 1266, + 0xB061: 1267, + 0xB062: 1268, + 0xB064: 1269, + 0xB065: 1270, + 0xB069: 1271, + 0xB071: 1272, + 0xB073: 1273, + 0xB076: 1274, + 0xB077: 1275, + 0xB07D: 1276, + 0xB081: 1277, + 0xB082: 1278, + 0xB085: 1279, + 0xB089: 1280, + 0xB091: 1281, + 0xB093: 1282, + 0xB096: 1283, + 0xB097: 1284, + 0xB0B7: 1285, + 0xB0E1: 1286, + 0xB0E2: 1287, + 0xB0E5: 1288, + 0xB0E9: 1289, + 0xB0EB: 1290, + 0xB0F1: 1291, + 0xB0F3: 1292, + 0xB0F6: 1293, + 0xB0F7: 1294, + 0xB141: 1295, + 0xB145: 1296, + 0xB149: 1297, + 0xB185: 1298, + 0xB1A1: 1299, + 0xB1A2: 1300, + 0xB1A5: 1301, + 0xB1A8: 1302, + 0xB1A9: 1303, + 0xB1AB: 1304, + 0xB1B1: 1305, + 0xB1B3: 1306, + 0xB1B7: 1307, + 0xB1C1: 1308, + 0xB1C2: 1309, + 0xB1C5: 1310, + 0xB1D6: 1311, + 0xB1E1: 1312, + 0xB1F6: 1313, + 0xB241: 1314, + 0xB245: 1315, + 0xB249: 1316, + 0xB251: 1317, + 0xB253: 1318, + 0xB261: 1319, + 0xB281: 1320, + 0xB282: 1321, + 0xB285: 1322, + 0xB289: 1323, + 0xB291: 1324, + 0xB293: 1325, + 0xB297: 1326, + 0xB2A1: 1327, + 0xB2B6: 1328, + 0xB2C1: 1329, + 0xB2E1: 1330, + 0xB2E5: 1331, + 0xB357: 1332, + 0xB361: 1333, + 0xB362: 1334, + 0xB365: 1335, + 0xB369: 1336, + 0xB36B: 1337, + 0xB370: 1338, + 0xB371: 1339, + 0xB373: 1340, + 0xB381: 1341, + 0xB385: 1342, + 0xB389: 1343, + 0xB391: 1344, + 0xB3A1: 1345, + 0xB3A2: 1346, + 0xB3A5: 1347, + 0xB3A9: 1348, + 0xB3B1: 1349, + 0xB3B3: 1350, + 0xB3B5: 1351, + 0xB3B7: 1352, + 0xB461: 1353, + 0xB462: 1354, + 0xB465: 1355, + 0xB466: 1356, + 0xB467: 1357, + 0xB469: 1358, + 0xB46A: 1359, + 0xB46B: 1360, + 0xB470: 1361, + 0xB471: 1362, + 0xB473: 1363, + 0xB475: 1364, + 0xB476: 1365, + 0xB477: 1366, + 0xB47B: 1367, + 0xB47C: 1368, + 0xB481: 1369, + 0xB482: 1370, + 0xB485: 1371, + 0xB489: 1372, + 0xB491: 1373, + 0xB493: 1374, + 0xB495: 1375, + 0xB496: 1376, + 0xB497: 1377, + 0xB4A1: 1378, + 0xB4A2: 1379, + 0xB4A5: 1380, + 0xB4A9: 1381, + 0xB4AC: 1382, + 0xB4B1: 1383, + 0xB4B3: 1384, + 0xB4B5: 1385, + 0xB4B7: 1386, + 0xB4BB: 1387, + 0xB4BD: 1388, + 0xB4C1: 1389, + 0xB4C5: 1390, + 0xB4C9: 1391, + 0xB4D3: 1392, + 0xB4E1: 1393, + 0xB4E2: 1394, + 0xB4E5: 1395, + 0xB4E6: 1396, + 0xB4E8: 1397, + 0xB4E9: 1398, + 0xB4EA: 1399, + 0xB4EB: 1400, + 0xB4F1: 1401, + 0xB4F3: 1402, + 0xB4F4: 1403, + 0xB4F5: 1404, + 0xB4F6: 1405, + 0xB4F7: 1406, + 0xB4F8: 1407, + 0xB4FA: 1408, + 0xB4FC: 1409, + 0xB541: 1410, + 0xB542: 1411, + 0xB545: 1412, + 0xB549: 1413, + 0xB551: 1414, + 0xB553: 1415, + 0xB555: 1416, + 0xB557: 1417, + 0xB561: 1418, + 0xB562: 1419, + 0xB563: 1420, + 0xB565: 1421, + 0xB569: 1422, + 0xB56B: 1423, + 0xB56C: 1424, + 0xB571: 1425, + 0xB573: 1426, + 0xB574: 1427, + 0xB575: 1428, + 0xB576: 1429, + 0xB577: 1430, + 0xB57B: 1431, + 0xB57C: 1432, + 0xB57D: 1433, + 0xB581: 1434, + 0xB585: 1435, + 0xB589: 1436, + 0xB591: 1437, + 0xB593: 1438, + 0xB595: 1439, + 0xB596: 1440, + 0xB5A1: 1441, + 0xB5A2: 1442, + 0xB5A5: 1443, + 0xB5A9: 1444, + 0xB5AA: 1445, + 0xB5AB: 1446, + 0xB5AD: 1447, + 0xB5B0: 1448, + 0xB5B1: 1449, + 0xB5B3: 1450, + 0xB5B5: 1451, + 0xB5B7: 1452, + 0xB5B9: 1453, + 0xB5C1: 1454, + 0xB5C2: 1455, + 0xB5C5: 1456, + 0xB5C9: 1457, + 0xB5D1: 1458, + 0xB5D3: 1459, + 0xB5D5: 1460, + 0xB5D6: 1461, + 0xB5D7: 1462, + 0xB5E1: 1463, + 0xB5E2: 1464, + 0xB5E5: 1465, + 0xB5F1: 1466, + 0xB5F5: 1467, + 0xB5F7: 1468, + 0xB641: 1469, + 0xB642: 1470, + 0xB645: 1471, + 0xB649: 1472, + 0xB651: 1473, + 0xB653: 1474, + 0xB655: 1475, + 0xB657: 1476, + 0xB661: 1477, + 0xB662: 1478, + 0xB665: 1479, + 0xB669: 1480, + 0xB671: 1481, + 0xB673: 1482, + 0xB675: 1483, + 0xB677: 1484, + 0xB681: 1485, + 0xB682: 1486, + 0xB685: 1487, + 0xB689: 1488, + 0xB68A: 1489, + 0xB68B: 1490, + 0xB691: 1491, + 0xB693: 1492, + 0xB695: 1493, + 0xB697: 1494, + 0xB6A1: 1495, + 0xB6A2: 1496, + 0xB6A5: 1497, + 0xB6A9: 1498, + 0xB6B1: 1499, + 0xB6B3: 1500, + 0xB6B6: 1501, + 0xB6B7: 1502, + 0xB6C1: 1503, + 0xB6C2: 1504, + 0xB6C5: 1505, + 0xB6C9: 1506, + 0xB6D1: 1507, + 0xB6D3: 1508, + 0xB6D7: 1509, + 0xB6E1: 1510, + 0xB6E2: 1511, + 0xB6E5: 1512, + 0xB6E9: 1513, + 0xB6F1: 1514, + 0xB6F3: 1515, + 0xB6F5: 1516, + 0xB6F7: 1517, + 0xB741: 1518, + 0xB742: 1519, + 0xB745: 1520, + 0xB749: 1521, + 0xB751: 1522, + 0xB753: 1523, + 0xB755: 1524, + 0xB757: 1525, + 0xB759: 1526, + 0xB761: 1527, + 0xB762: 1528, + 0xB765: 1529, + 0xB769: 1530, + 0xB76F: 1531, + 0xB771: 1532, + 0xB773: 1533, + 0xB775: 1534, + 0xB777: 1535, + 0xB778: 1536, + 0xB779: 1537, + 0xB77A: 1538, + 0xB77B: 1539, + 0xB77C: 1540, + 0xB77D: 1541, + 0xB781: 1542, + 0xB785: 1543, + 0xB789: 1544, + 0xB791: 1545, + 0xB795: 1546, + 0xB7A1: 1547, + 0xB7A2: 1548, + 0xB7A5: 1549, + 0xB7A9: 1550, + 0xB7AA: 1551, + 0xB7AB: 1552, + 0xB7B0: 1553, + 0xB7B1: 1554, + 0xB7B3: 1555, + 0xB7B5: 1556, + 0xB7B6: 1557, + 0xB7B7: 1558, + 0xB7B8: 1559, + 0xB7BC: 1560, + 0xB861: 1561, + 0xB862: 1562, + 0xB865: 1563, + 0xB867: 1564, + 0xB868: 1565, + 0xB869: 1566, + 0xB86B: 1567, + 0xB871: 1568, + 0xB873: 1569, + 0xB875: 1570, + 0xB876: 1571, + 0xB877: 1572, + 0xB878: 1573, + 0xB881: 1574, + 0xB882: 1575, + 0xB885: 1576, + 0xB889: 1577, + 0xB891: 1578, + 0xB893: 1579, + 0xB895: 1580, + 0xB896: 1581, + 0xB897: 1582, + 0xB8A1: 1583, + 0xB8A2: 1584, + 0xB8A5: 1585, + 0xB8A7: 1586, + 0xB8A9: 1587, + 0xB8B1: 1588, + 0xB8B7: 1589, + 0xB8C1: 1590, + 0xB8C5: 1591, + 0xB8C9: 1592, + 0xB8E1: 1593, + 0xB8E2: 1594, + 0xB8E5: 1595, + 0xB8E9: 1596, + 0xB8EB: 1597, + 0xB8F1: 1598, + 0xB8F3: 1599, + 0xB8F5: 1600, + 0xB8F7: 1601, + 0xB8F8: 1602, + 0xB941: 1603, + 0xB942: 1604, + 0xB945: 1605, + 0xB949: 1606, + 0xB951: 1607, + 0xB953: 1608, + 0xB955: 1609, + 0xB957: 1610, + 0xB961: 1611, + 0xB965: 1612, + 0xB969: 1613, + 0xB971: 1614, + 0xB973: 1615, + 0xB976: 1616, + 0xB977: 1617, + 0xB981: 1618, + 0xB9A1: 1619, + 0xB9A2: 1620, + 0xB9A5: 1621, + 0xB9A9: 1622, + 0xB9AB: 1623, + 0xB9B1: 1624, + 0xB9B3: 1625, + 0xB9B5: 1626, + 0xB9B7: 1627, + 0xB9B8: 1628, + 0xB9B9: 1629, + 0xB9BD: 1630, + 0xB9C1: 1631, + 0xB9C2: 1632, + 0xB9C9: 1633, + 0xB9D3: 1634, + 0xB9D5: 1635, + 0xB9D7: 1636, + 0xB9E1: 1637, + 0xB9F6: 1638, + 0xB9F7: 1639, + 0xBA41: 1640, + 0xBA45: 1641, + 0xBA49: 1642, + 0xBA51: 1643, + 0xBA53: 1644, + 0xBA55: 1645, + 0xBA57: 1646, + 0xBA61: 1647, + 0xBA62: 1648, + 0xBA65: 1649, + 0xBA77: 1650, + 0xBA81: 1651, + 0xBA82: 1652, + 0xBA85: 1653, + 0xBA89: 1654, + 0xBA8A: 1655, + 0xBA8B: 1656, + 0xBA91: 1657, + 0xBA93: 1658, + 0xBA95: 1659, + 0xBA97: 1660, + 0xBAA1: 1661, + 0xBAB6: 1662, + 0xBAC1: 1663, + 0xBAE1: 1664, + 0xBAE2: 1665, + 0xBAE5: 1666, + 0xBAE9: 1667, + 0xBAF1: 1668, + 0xBAF3: 1669, + 0xBAF5: 1670, + 0xBB41: 1671, + 0xBB45: 1672, + 0xBB49: 1673, + 0xBB51: 1674, + 0xBB61: 1675, + 0xBB62: 1676, + 0xBB65: 1677, + 0xBB69: 1678, + 0xBB71: 1679, + 0xBB73: 1680, + 0xBB75: 1681, + 0xBB77: 1682, + 0xBBA1: 1683, + 0xBBA2: 1684, + 0xBBA5: 1685, + 0xBBA8: 1686, + 0xBBA9: 1687, + 0xBBAB: 1688, + 0xBBB1: 1689, + 0xBBB3: 1690, + 0xBBB5: 1691, + 0xBBB7: 1692, + 0xBBB8: 1693, + 0xBBBB: 1694, + 0xBBBC: 1695, + 0xBC61: 1696, + 0xBC62: 1697, + 0xBC65: 1698, + 0xBC67: 1699, + 0xBC69: 1700, + 0xBC6C: 1701, + 0xBC71: 1702, + 0xBC73: 1703, + 0xBC75: 1704, + 0xBC76: 1705, + 0xBC77: 1706, + 0xBC81: 1707, + 0xBC82: 1708, + 0xBC85: 1709, + 0xBC89: 1710, + 0xBC91: 1711, + 0xBC93: 1712, + 0xBC95: 1713, + 0xBC96: 1714, + 0xBC97: 1715, + 0xBCA1: 1716, + 0xBCA5: 1717, + 0xBCB7: 1718, + 0xBCE1: 1719, + 0xBCE2: 1720, + 0xBCE5: 1721, + 0xBCE9: 1722, + 0xBCF1: 1723, + 0xBCF3: 1724, + 0xBCF5: 1725, + 0xBCF6: 1726, + 0xBCF7: 1727, + 0xBD41: 1728, + 0xBD57: 1729, + 0xBD61: 1730, + 0xBD76: 1731, + 0xBDA1: 1732, + 0xBDA2: 1733, + 0xBDA5: 1734, + 0xBDA9: 1735, + 0xBDB1: 1736, + 0xBDB3: 1737, + 0xBDB5: 1738, + 0xBDB7: 1739, + 0xBDB9: 1740, + 0xBDC1: 1741, + 0xBDC2: 1742, + 0xBDC9: 1743, + 0xBDD6: 1744, + 0xBDE1: 1745, + 0xBDF6: 1746, + 0xBE41: 1747, + 0xBE45: 1748, + 0xBE49: 1749, + 0xBE51: 1750, + 0xBE53: 1751, + 0xBE77: 1752, + 0xBE81: 1753, + 0xBE82: 1754, + 0xBE85: 1755, + 0xBE89: 1756, + 0xBE91: 1757, + 0xBE93: 1758, + 0xBE97: 1759, + 0xBEA1: 1760, + 0xBEB6: 1761, + 0xBEB7: 1762, + 0xBEE1: 1763, + 0xBF41: 1764, + 0xBF61: 1765, + 0xBF71: 1766, + 0xBF75: 1767, + 0xBF77: 1768, + 0xBFA1: 1769, + 0xBFA2: 1770, + 0xBFA5: 1771, + 0xBFA9: 1772, + 0xBFB1: 1773, + 0xBFB3: 1774, + 0xBFB7: 1775, + 0xBFB8: 1776, + 0xBFBD: 1777, + 0xC061: 1778, + 0xC062: 1779, + 0xC065: 1780, + 0xC067: 1781, + 0xC069: 1782, + 0xC071: 1783, + 0xC073: 1784, + 0xC075: 1785, + 0xC076: 1786, + 0xC077: 1787, + 0xC078: 1788, + 0xC081: 1789, + 0xC082: 1790, + 0xC085: 1791, + 0xC089: 1792, + 0xC091: 1793, + 0xC093: 1794, + 0xC095: 1795, + 0xC096: 1796, + 0xC097: 1797, + 0xC0A1: 1798, + 0xC0A5: 1799, + 0xC0A7: 1800, + 0xC0A9: 1801, + 0xC0B1: 1802, + 0xC0B7: 1803, + 0xC0E1: 1804, + 0xC0E2: 1805, + 0xC0E5: 1806, + 0xC0E9: 1807, + 0xC0F1: 1808, + 0xC0F3: 1809, + 0xC0F5: 1810, + 0xC0F6: 1811, + 0xC0F7: 1812, + 0xC141: 1813, + 0xC142: 1814, + 0xC145: 1815, + 0xC149: 1816, + 0xC151: 1817, + 0xC153: 1818, + 0xC155: 1819, + 0xC157: 1820, + 0xC161: 1821, + 0xC165: 1822, + 0xC176: 1823, + 0xC181: 1824, + 0xC185: 1825, + 0xC197: 1826, + 0xC1A1: 1827, + 0xC1A2: 1828, + 0xC1A5: 1829, + 0xC1A9: 1830, + 0xC1B1: 1831, + 0xC1B3: 1832, + 0xC1B5: 1833, + 0xC1B7: 1834, + 0xC1C1: 1835, + 0xC1C5: 1836, + 0xC1C9: 1837, + 0xC1D7: 1838, + 0xC241: 1839, + 0xC245: 1840, + 0xC249: 1841, + 0xC251: 1842, + 0xC253: 1843, + 0xC255: 1844, + 0xC257: 1845, + 0xC261: 1846, + 0xC271: 1847, + 0xC281: 1848, + 0xC282: 1849, + 0xC285: 1850, + 0xC289: 1851, + 0xC291: 1852, + 0xC293: 1853, + 0xC295: 1854, + 0xC297: 1855, + 0xC2A1: 1856, + 0xC2B6: 1857, + 0xC2C1: 1858, + 0xC2C5: 1859, + 0xC2E1: 1860, + 0xC2E5: 1861, + 0xC2E9: 1862, + 0xC2F1: 1863, + 0xC2F3: 1864, + 0xC2F5: 1865, + 0xC2F7: 1866, + 0xC341: 1867, + 0xC345: 1868, + 0xC349: 1869, + 0xC351: 1870, + 0xC357: 1871, + 0xC361: 1872, + 0xC362: 1873, + 0xC365: 1874, + 0xC369: 1875, + 0xC371: 1876, + 0xC373: 1877, + 0xC375: 1878, + 0xC377: 1879, + 0xC3A1: 1880, + 0xC3A2: 1881, + 0xC3A5: 1882, + 0xC3A8: 1883, + 0xC3A9: 1884, + 0xC3AA: 1885, + 0xC3B1: 1886, + 0xC3B3: 1887, + 0xC3B5: 1888, + 0xC3B7: 1889, + 0xC461: 1890, + 0xC462: 1891, + 0xC465: 1892, + 0xC469: 1893, + 0xC471: 1894, + 0xC473: 1895, + 0xC475: 1896, + 0xC477: 1897, + 0xC481: 1898, + 0xC482: 1899, + 0xC485: 1900, + 0xC489: 1901, + 0xC491: 1902, + 0xC493: 1903, + 0xC495: 1904, + 0xC496: 1905, + 0xC497: 1906, + 0xC4A1: 1907, + 0xC4A2: 1908, + 0xC4B7: 1909, + 0xC4E1: 1910, + 0xC4E2: 1911, + 0xC4E5: 1912, + 0xC4E8: 1913, + 0xC4E9: 1914, + 0xC4F1: 1915, + 0xC4F3: 1916, + 0xC4F5: 1917, + 0xC4F6: 1918, + 0xC4F7: 1919, + 0xC541: 1920, + 0xC542: 1921, + 0xC545: 1922, + 0xC549: 1923, + 0xC551: 1924, + 0xC553: 1925, + 0xC555: 1926, + 0xC557: 1927, + 0xC561: 1928, + 0xC565: 1929, + 0xC569: 1930, + 0xC571: 1931, + 0xC573: 1932, + 0xC575: 1933, + 0xC576: 1934, + 0xC577: 1935, + 0xC581: 1936, + 0xC5A1: 1937, + 0xC5A2: 1938, + 0xC5A5: 1939, + 0xC5A9: 1940, + 0xC5B1: 1941, + 0xC5B3: 1942, + 0xC5B5: 1943, + 0xC5B7: 1944, + 0xC5C1: 1945, + 0xC5C2: 1946, + 0xC5C5: 1947, + 0xC5C9: 1948, + 0xC5D1: 1949, + 0xC5D7: 1950, + 0xC5E1: 1951, + 0xC5F7: 1952, + 0xC641: 1953, + 0xC649: 1954, + 0xC661: 1955, + 0xC681: 1956, + 0xC682: 1957, + 0xC685: 1958, + 0xC689: 1959, + 0xC691: 1960, + 0xC693: 1961, + 0xC695: 1962, + 0xC697: 1963, + 0xC6A1: 1964, + 0xC6A5: 1965, + 0xC6A9: 1966, + 0xC6B7: 1967, + 0xC6C1: 1968, + 0xC6D7: 1969, + 0xC6E1: 1970, + 0xC6E2: 1971, + 0xC6E5: 1972, + 0xC6E9: 1973, + 0xC6F1: 1974, + 0xC6F3: 1975, + 0xC6F5: 1976, + 0xC6F7: 1977, + 0xC741: 1978, + 0xC745: 1979, + 0xC749: 1980, + 0xC751: 1981, + 0xC761: 1982, + 0xC762: 1983, + 0xC765: 1984, + 0xC769: 1985, + 0xC771: 1986, + 0xC773: 1987, + 0xC777: 1988, + 0xC7A1: 1989, + 0xC7A2: 1990, + 0xC7A5: 1991, + 0xC7A9: 1992, + 0xC7B1: 1993, + 0xC7B3: 1994, + 0xC7B5: 1995, + 0xC7B7: 1996, + 0xC861: 1997, + 0xC862: 1998, + 0xC865: 1999, + 0xC869: 2000, + 0xC86A: 2001, + 0xC871: 2002, + 0xC873: 2003, + 0xC875: 2004, + 0xC876: 2005, + 0xC877: 2006, + 0xC881: 2007, + 0xC882: 2008, + 0xC885: 2009, + 0xC889: 2010, + 0xC891: 2011, + 0xC893: 2012, + 0xC895: 2013, + 0xC896: 2014, + 0xC897: 2015, + 0xC8A1: 2016, + 0xC8B7: 2017, + 0xC8E1: 2018, + 0xC8E2: 2019, + 0xC8E5: 2020, + 0xC8E9: 2021, + 0xC8EB: 2022, + 0xC8F1: 2023, + 0xC8F3: 2024, + 0xC8F5: 2025, + 0xC8F6: 2026, + 0xC8F7: 2027, + 0xC941: 2028, + 0xC942: 2029, + 0xC945: 2030, + 0xC949: 2031, + 0xC951: 2032, + 0xC953: 2033, + 0xC955: 2034, + 0xC957: 2035, + 0xC961: 2036, + 0xC965: 2037, + 0xC976: 2038, + 0xC981: 2039, + 0xC985: 2040, + 0xC9A1: 2041, + 0xC9A2: 2042, + 0xC9A5: 2043, + 0xC9A9: 2044, + 0xC9B1: 2045, + 0xC9B3: 2046, + 0xC9B5: 2047, + 0xC9B7: 2048, + 0xC9BC: 2049, + 0xC9C1: 2050, + 0xC9C5: 2051, + 0xC9E1: 2052, + 0xCA41: 2053, + 0xCA45: 2054, + 0xCA55: 2055, + 0xCA57: 2056, + 0xCA61: 2057, + 0xCA81: 2058, + 0xCA82: 2059, + 0xCA85: 2060, + 0xCA89: 2061, + 0xCA91: 2062, + 0xCA93: 2063, + 0xCA95: 2064, + 0xCA97: 2065, + 0xCAA1: 2066, + 0xCAB6: 2067, + 0xCAC1: 2068, + 0xCAE1: 2069, + 0xCAE2: 2070, + 0xCAE5: 2071, + 0xCAE9: 2072, + 0xCAF1: 2073, + 0xCAF3: 2074, + 0xCAF7: 2075, + 0xCB41: 2076, + 0xCB45: 2077, + 0xCB49: 2078, + 0xCB51: 2079, + 0xCB57: 2080, + 0xCB61: 2081, + 0xCB62: 2082, + 0xCB65: 2083, + 0xCB68: 2084, + 0xCB69: 2085, + 0xCB6B: 2086, + 0xCB71: 2087, + 0xCB73: 2088, + 0xCB75: 2089, + 0xCB81: 2090, + 0xCB85: 2091, + 0xCB89: 2092, + 0xCB91: 2093, + 0xCB93: 2094, + 0xCBA1: 2095, + 0xCBA2: 2096, + 0xCBA5: 2097, + 0xCBA9: 2098, + 0xCBB1: 2099, + 0xCBB3: 2100, + 0xCBB5: 2101, + 0xCBB7: 2102, + 0xCC61: 2103, + 0xCC62: 2104, + 0xCC63: 2105, + 0xCC65: 2106, + 0xCC69: 2107, + 0xCC6B: 2108, + 0xCC71: 2109, + 0xCC73: 2110, + 0xCC75: 2111, + 0xCC76: 2112, + 0xCC77: 2113, + 0xCC7B: 2114, + 0xCC81: 2115, + 0xCC82: 2116, + 0xCC85: 2117, + 0xCC89: 2118, + 0xCC91: 2119, + 0xCC93: 2120, + 0xCC95: 2121, + 0xCC96: 2122, + 0xCC97: 2123, + 0xCCA1: 2124, + 0xCCA2: 2125, + 0xCCE1: 2126, + 0xCCE2: 2127, + 0xCCE5: 2128, + 0xCCE9: 2129, + 0xCCF1: 2130, + 0xCCF3: 2131, + 0xCCF5: 2132, + 0xCCF6: 2133, + 0xCCF7: 2134, + 0xCD41: 2135, + 0xCD42: 2136, + 0xCD45: 2137, + 0xCD49: 2138, + 0xCD51: 2139, + 0xCD53: 2140, + 0xCD55: 2141, + 0xCD57: 2142, + 0xCD61: 2143, + 0xCD65: 2144, + 0xCD69: 2145, + 0xCD71: 2146, + 0xCD73: 2147, + 0xCD76: 2148, + 0xCD77: 2149, + 0xCD81: 2150, + 0xCD89: 2151, + 0xCD93: 2152, + 0xCD95: 2153, + 0xCDA1: 2154, + 0xCDA2: 2155, + 0xCDA5: 2156, + 0xCDA9: 2157, + 0xCDB1: 2158, + 0xCDB3: 2159, + 0xCDB5: 2160, + 0xCDB7: 2161, + 0xCDC1: 2162, + 0xCDD7: 2163, + 0xCE41: 2164, + 0xCE45: 2165, + 0xCE61: 2166, + 0xCE65: 2167, + 0xCE69: 2168, + 0xCE73: 2169, + 0xCE75: 2170, + 0xCE81: 2171, + 0xCE82: 2172, + 0xCE85: 2173, + 0xCE88: 2174, + 0xCE89: 2175, + 0xCE8B: 2176, + 0xCE91: 2177, + 0xCE93: 2178, + 0xCE95: 2179, + 0xCE97: 2180, + 0xCEA1: 2181, + 0xCEB7: 2182, + 0xCEE1: 2183, + 0xCEE5: 2184, + 0xCEE9: 2185, + 0xCEF1: 2186, + 0xCEF5: 2187, + 0xCF41: 2188, + 0xCF45: 2189, + 0xCF49: 2190, + 0xCF51: 2191, + 0xCF55: 2192, + 0xCF57: 2193, + 0xCF61: 2194, + 0xCF65: 2195, + 0xCF69: 2196, + 0xCF71: 2197, + 0xCF73: 2198, + 0xCF75: 2199, + 0xCFA1: 2200, + 0xCFA2: 2201, + 0xCFA5: 2202, + 0xCFA9: 2203, + 0xCFB1: 2204, + 0xCFB3: 2205, + 0xCFB5: 2206, + 0xCFB7: 2207, + 0xD061: 2208, + 0xD062: 2209, + 0xD065: 2210, + 0xD069: 2211, + 0xD06E: 2212, + 0xD071: 2213, + 0xD073: 2214, + 0xD075: 2215, + 0xD077: 2216, + 0xD081: 2217, + 0xD082: 2218, + 0xD085: 2219, + 0xD089: 2220, + 0xD091: 2221, + 0xD093: 2222, + 0xD095: 2223, + 0xD096: 2224, + 0xD097: 2225, + 0xD0A1: 2226, + 0xD0B7: 2227, + 0xD0E1: 2228, + 0xD0E2: 2229, + 0xD0E5: 2230, + 0xD0E9: 2231, + 0xD0EB: 2232, + 0xD0F1: 2233, + 0xD0F3: 2234, + 0xD0F5: 2235, + 0xD0F7: 2236, + 0xD141: 2237, + 0xD142: 2238, + 0xD145: 2239, + 0xD149: 2240, + 0xD151: 2241, + 0xD153: 2242, + 0xD155: 2243, + 0xD157: 2244, + 0xD161: 2245, + 0xD162: 2246, + 0xD165: 2247, + 0xD169: 2248, + 0xD171: 2249, + 0xD173: 2250, + 0xD175: 2251, + 0xD176: 2252, + 0xD177: 2253, + 0xD181: 2254, + 0xD185: 2255, + 0xD189: 2256, + 0xD193: 2257, + 0xD1A1: 2258, + 0xD1A2: 2259, + 0xD1A5: 2260, + 0xD1A9: 2261, + 0xD1AE: 2262, + 0xD1B1: 2263, + 0xD1B3: 2264, + 0xD1B5: 2265, + 0xD1B7: 2266, + 0xD1BB: 2267, + 0xD1C1: 2268, + 0xD1C2: 2269, + 0xD1C5: 2270, + 0xD1C9: 2271, + 0xD1D5: 2272, + 0xD1D7: 2273, + 0xD1E1: 2274, + 0xD1E2: 2275, + 0xD1E5: 2276, + 0xD1F5: 2277, + 0xD1F7: 2278, + 0xD241: 2279, + 0xD242: 2280, + 0xD245: 2281, + 0xD249: 2282, + 0xD253: 2283, + 0xD255: 2284, + 0xD257: 2285, + 0xD261: 2286, + 0xD265: 2287, + 0xD269: 2288, + 0xD273: 2289, + 0xD275: 2290, + 0xD281: 2291, + 0xD282: 2292, + 0xD285: 2293, + 0xD289: 2294, + 0xD28E: 2295, + 0xD291: 2296, + 0xD295: 2297, + 0xD297: 2298, + 0xD2A1: 2299, + 0xD2A5: 2300, + 0xD2A9: 2301, + 0xD2B1: 2302, + 0xD2B7: 2303, + 0xD2C1: 2304, + 0xD2C2: 2305, + 0xD2C5: 2306, + 0xD2C9: 2307, + 0xD2D7: 2308, + 0xD2E1: 2309, + 0xD2E2: 2310, + 0xD2E5: 2311, + 0xD2E9: 2312, + 0xD2F1: 2313, + 0xD2F3: 2314, + 0xD2F5: 2315, + 0xD2F7: 2316, + 0xD341: 2317, + 0xD342: 2318, + 0xD345: 2319, + 0xD349: 2320, + 0xD351: 2321, + 0xD355: 2322, + 0xD357: 2323, + 0xD361: 2324, + 0xD362: 2325, + 0xD365: 2326, + 0xD367: 2327, + 0xD368: 2328, + 0xD369: 2329, + 0xD36A: 2330, + 0xD371: 2331, + 0xD373: 2332, + 0xD375: 2333, + 0xD377: 2334, + 0xD37B: 2335, + 0xD381: 2336, + 0xD385: 2337, + 0xD389: 2338, + 0xD391: 2339, + 0xD393: 2340, + 0xD397: 2341, + 0xD3A1: 2342, + 0xD3A2: 2343, + 0xD3A5: 2344, + 0xD3A9: 2345, + 0xD3B1: 2346, + 0xD3B3: 2347, + 0xD3B5: 2348, + 0xD3B7: 2349, +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py new file mode 100644 index 0000000..d7364ba --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import JOHABDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import JOHAB_SM_MODEL + + +class JOHABProber(MultiByteCharSetProber): + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(JOHAB_SM_MODEL) + self.distribution_analyzer = JOHABDistributionAnalysis() + self.reset() + + @property + def charset_name(self) -> str: + return "Johab" + + @property + def language(self) -> str: + return "Korean" diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..2f53bdd --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,238 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import List, Tuple, Union + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +# fmt: off +jp2_char_context = ( + (0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), + (2, 4, 0, 4, 0, 3, 0, 4, 0, 3, 4, 4, 4, 2, 4, 3, 3, 4, 3, 2, 3, 3, 4, 2, 3, 3, 3, 2, 4, 1, 4, 3, 3, 1, 5, 4, 3, 4, 3, 4, 3, 5, 3, 0, 3, 5, 4, 2, 0, 3, 1, 0, 3, 3, 0, 3, 3, 0, 1, 1, 0, 4, 3, 0, 3, 3, 0, 4, 0, 2, 0, 3, 5, 5, 5, 5, 4, 0, 4, 1, 0, 3, 4), + (0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2), + (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 4, 4, 3, 5, 3, 5, 1, 5, 3, 4, 3, 4, 4, 3, 4, 3, 3, 4, 3, 5, 4, 4, 3, 5, 5, 3, 5, 5, 5, 3, 5, 5, 3, 4, 5, 5, 3, 1, 3, 2, 0, 3, 4, 0, 4, 2, 0, 4, 2, 1, 5, 3, 2, 3, 5, 0, 4, 0, 2, 0, 5, 4, 4, 5, 4, 5, 0, 4, 0, 0, 4, 4), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + (0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 5, 4, 3, 3, 3, 3, 4, 3, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 4, 4, 4, 4, 5, 3, 4, 4, 3, 4, 5, 5, 4, 5, 5, 1, 4, 5, 4, 3, 0, 3, 3, 1, 3, 3, 0, 4, 4, 0, 3, 3, 1, 5, 3, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 0, 4, 1, 1, 3, 4), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + (0, 4, 0, 3, 0, 3, 0, 4, 0, 3, 4, 4, 3, 2, 2, 1, 2, 1, 3, 1, 3, 3, 3, 3, 3, 4, 3, 1, 3, 3, 5, 3, 3, 0, 4, 3, 0, 5, 4, 3, 3, 5, 4, 4, 3, 4, 4, 5, 0, 1, 2, 0, 1, 2, 0, 2, 2, 0, 1, 0, 0, 5, 2, 2, 1, 4, 0, 3, 0, 1, 0, 4, 4, 3, 5, 4, 3, 0, 2, 1, 0, 4, 3), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + (0, 3, 0, 5, 0, 4, 0, 2, 1, 4, 4, 2, 4, 1, 4, 2, 4, 2, 4, 3, 3, 3, 4, 3, 3, 3, 3, 1, 4, 2, 3, 3, 3, 1, 4, 4, 1, 1, 1, 4, 3, 3, 2, 0, 2, 4, 3, 2, 0, 3, 3, 0, 3, 1, 1, 0, 0, 0, 3, 3, 0, 4, 2, 2, 3, 4, 0, 4, 0, 3, 0, 4, 4, 5, 3, 4, 4, 0, 3, 0, 0, 1, 4), + (1, 4, 0, 4, 0, 4, 0, 4, 0, 3, 5, 4, 4, 3, 4, 3, 5, 4, 3, 3, 4, 3, 5, 4, 4, 4, 4, 3, 4, 2, 4, 3, 3, 1, 5, 4, 3, 2, 4, 5, 4, 5, 5, 4, 4, 5, 4, 4, 0, 3, 2, 2, 3, 3, 0, 4, 3, 1, 3, 2, 1, 4, 3, 3, 4, 5, 0, 3, 0, 2, 0, 4, 5, 5, 4, 5, 4, 0, 4, 0, 0, 5, 4), + (0, 5, 0, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 3, 4, 0, 4, 4, 4, 3, 4, 3, 4, 3, 3, 1, 4, 2, 4, 3, 4, 0, 5, 4, 1, 4, 5, 4, 4, 5, 3, 2, 4, 3, 4, 3, 2, 4, 1, 3, 3, 3, 2, 3, 2, 0, 4, 3, 3, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 4, 3, 0, 4, 1, 0, 1, 3), + (0, 3, 1, 4, 0, 3, 0, 2, 0, 3, 4, 4, 3, 1, 4, 2, 3, 3, 4, 3, 4, 3, 4, 3, 4, 4, 3, 2, 3, 1, 5, 4, 4, 1, 4, 4, 3, 5, 4, 4, 3, 5, 5, 4, 3, 4, 4, 3, 1, 2, 3, 1, 2, 2, 0, 3, 2, 0, 3, 1, 0, 5, 3, 3, 3, 4, 3, 3, 3, 3, 4, 4, 4, 4, 5, 4, 2, 0, 3, 3, 2, 4, 3), + (0, 2, 0, 3, 0, 1, 0, 1, 0, 0, 3, 2, 0, 0, 2, 0, 1, 0, 2, 1, 3, 3, 3, 1, 2, 3, 1, 0, 1, 0, 4, 2, 1, 1, 3, 3, 0, 4, 3, 3, 1, 4, 3, 3, 0, 3, 3, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 4, 1, 0, 2, 3, 2, 2, 2, 1, 3, 3, 3, 4, 4, 3, 2, 0, 3, 1, 0, 3, 3), + (0, 4, 0, 4, 0, 3, 0, 3, 0, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 3, 4, 2, 4, 3, 4, 3, 3, 2, 4, 3, 4, 5, 4, 1, 4, 5, 3, 5, 4, 5, 3, 5, 4, 0, 3, 5, 5, 3, 1, 3, 3, 2, 2, 3, 0, 3, 4, 1, 3, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 5, 3, 0, 4, 1, 0, 3, 4), + (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 2, 2, 1, 0, 1, 0, 0, 0, 3, 0, 3, 0, 3, 0, 1, 3, 1, 0, 3, 1, 3, 3, 3, 1, 3, 3, 3, 0, 1, 3, 1, 3, 4, 0, 0, 3, 1, 1, 0, 3, 2, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 3, 3, 2, 0, 3, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 3, 0, 3, 0, 0, 2, 3), + (2, 3, 0, 3, 0, 2, 0, 1, 0, 3, 3, 4, 3, 1, 3, 1, 1, 1, 3, 1, 4, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 4, 3, 1, 4, 3, 2, 5, 5, 4, 4, 4, 4, 3, 3, 4, 4, 4, 0, 2, 1, 1, 3, 2, 0, 1, 2, 0, 0, 1, 0, 4, 1, 3, 3, 3, 0, 3, 0, 1, 0, 4, 4, 4, 5, 5, 3, 0, 2, 0, 0, 4, 4), + (0, 2, 0, 1, 0, 3, 1, 3, 0, 2, 3, 3, 3, 0, 3, 1, 0, 0, 3, 0, 3, 2, 3, 1, 3, 2, 1, 1, 0, 0, 4, 2, 1, 0, 2, 3, 1, 4, 3, 2, 0, 4, 4, 3, 1, 3, 1, 3, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 1, 1, 2, 0, 3, 0, 0, 0, 3, 4, 2, 4, 3, 2, 0, 1, 0, 0, 3, 3), + (0, 1, 0, 4, 0, 5, 0, 4, 0, 2, 4, 4, 2, 3, 3, 2, 3, 3, 5, 3, 3, 3, 4, 3, 4, 2, 3, 0, 4, 3, 3, 3, 4, 1, 4, 3, 2, 1, 5, 5, 3, 4, 5, 1, 3, 5, 4, 2, 0, 3, 3, 0, 1, 3, 0, 4, 2, 0, 1, 3, 1, 4, 3, 3, 3, 3, 0, 3, 0, 1, 0, 3, 4, 4, 4, 5, 5, 0, 3, 0, 1, 4, 5), + (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 3, 1, 3, 0, 4, 0, 1, 1, 3, 0, 3, 4, 3, 2, 3, 1, 0, 3, 3, 2, 3, 1, 3, 0, 2, 3, 0, 2, 1, 4, 1, 2, 2, 0, 0, 3, 3, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 2, 2, 0, 3, 2, 1, 3, 3, 0, 2, 0, 2, 0, 0, 3, 3, 1, 2, 4, 0, 3, 0, 2, 2, 3), + (2, 4, 0, 5, 0, 4, 0, 4, 0, 2, 4, 4, 4, 3, 4, 3, 3, 3, 1, 2, 4, 3, 4, 3, 4, 4, 5, 0, 3, 3, 3, 3, 2, 0, 4, 3, 1, 4, 3, 4, 1, 4, 4, 3, 3, 4, 4, 3, 1, 2, 3, 0, 4, 2, 0, 4, 1, 0, 3, 3, 0, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 3, 5, 3, 4, 5, 2, 0, 3, 0, 0, 4, 5), + (0, 3, 0, 4, 0, 1, 0, 1, 0, 1, 3, 2, 2, 1, 3, 0, 3, 0, 2, 0, 2, 0, 3, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 1, 0, 0, 0, 4, 0, 3, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 3, 1, 0, 3, 0, 0, 0, 1, 4, 4, 4, 3, 0, 0, 4, 0, 0, 1, 4), + (1, 4, 1, 5, 0, 3, 0, 3, 0, 4, 5, 4, 4, 3, 5, 3, 3, 4, 4, 3, 4, 1, 3, 3, 3, 3, 2, 1, 4, 1, 5, 4, 3, 1, 4, 4, 3, 5, 4, 4, 3, 5, 4, 3, 3, 4, 4, 4, 0, 3, 3, 1, 2, 3, 0, 3, 1, 0, 3, 3, 0, 5, 4, 4, 4, 4, 4, 4, 3, 3, 5, 4, 4, 3, 3, 5, 4, 0, 3, 2, 0, 4, 4), + (0, 2, 0, 3, 0, 1, 0, 0, 0, 1, 3, 3, 3, 2, 4, 1, 3, 0, 3, 1, 3, 0, 2, 2, 1, 1, 0, 0, 2, 0, 4, 3, 1, 0, 4, 3, 0, 4, 4, 4, 1, 4, 3, 1, 1, 3, 3, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 0, 2, 0, 0, 4, 3, 2, 4, 3, 5, 4, 3, 3, 3, 4, 3, 3, 4, 3, 3, 0, 2, 1, 0, 3, 3), + (0, 2, 0, 4, 0, 3, 0, 2, 0, 2, 5, 5, 3, 4, 4, 4, 4, 1, 4, 3, 3, 0, 4, 3, 4, 3, 1, 3, 3, 2, 4, 3, 0, 3, 4, 3, 0, 3, 4, 4, 2, 4, 4, 0, 4, 5, 3, 3, 2, 2, 1, 1, 1, 2, 0, 1, 5, 0, 3, 3, 2, 4, 3, 3, 3, 4, 0, 3, 0, 2, 0, 4, 4, 3, 5, 5, 0, 0, 3, 0, 2, 3, 3), + (0, 3, 0, 4, 0, 3, 0, 1, 0, 3, 4, 3, 3, 1, 3, 3, 3, 0, 3, 1, 3, 0, 4, 3, 3, 1, 1, 0, 3, 0, 3, 3, 0, 0, 4, 4, 0, 1, 5, 4, 3, 3, 5, 0, 3, 3, 4, 3, 0, 2, 0, 1, 1, 1, 0, 1, 3, 0, 1, 2, 1, 3, 3, 2, 3, 3, 0, 3, 0, 1, 0, 1, 3, 3, 4, 4, 1, 0, 1, 2, 2, 1, 3), + (0, 1, 0, 4, 0, 4, 0, 3, 0, 1, 3, 3, 3, 2, 3, 1, 1, 0, 3, 0, 3, 3, 4, 3, 2, 4, 2, 0, 1, 0, 4, 3, 2, 0, 4, 3, 0, 5, 3, 3, 2, 4, 4, 4, 3, 3, 3, 4, 0, 1, 3, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 4, 2, 3, 3, 3, 0, 3, 0, 0, 0, 4, 4, 4, 5, 3, 2, 0, 3, 3, 0, 3, 5), + (0, 2, 0, 3, 0, 0, 0, 3, 0, 1, 3, 0, 2, 0, 0, 0, 1, 0, 3, 1, 1, 3, 3, 0, 0, 3, 0, 0, 3, 0, 2, 3, 1, 0, 3, 1, 0, 3, 3, 2, 0, 4, 2, 2, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 0, 1, 3, 1, 2, 0, 0, 0, 1, 0, 0, 1, 4), + (0, 3, 0, 3, 0, 5, 0, 1, 0, 2, 4, 3, 1, 3, 3, 2, 1, 1, 5, 2, 1, 0, 5, 1, 2, 0, 0, 0, 3, 3, 2, 2, 3, 2, 4, 3, 0, 0, 3, 3, 1, 3, 3, 0, 2, 5, 3, 4, 0, 3, 3, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 2, 2, 3, 3, 3, 0, 2, 0, 1, 0, 3, 4, 4, 2, 5, 4, 0, 3, 0, 0, 3, 5), + (0, 3, 0, 3, 0, 3, 0, 1, 0, 3, 3, 3, 3, 0, 3, 0, 2, 0, 2, 1, 1, 0, 2, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 0, 3, 2, 0, 0, 3, 3, 1, 2, 3, 1, 0, 3, 3, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 3, 1, 2, 3, 0, 3, 0, 1, 0, 3, 2, 1, 0, 4, 3, 0, 1, 1, 0, 3, 3), + (0, 4, 0, 5, 0, 3, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 4, 3, 5, 3, 3, 2, 5, 3, 4, 4, 4, 3, 4, 3, 4, 5, 5, 3, 4, 4, 3, 4, 4, 5, 4, 4, 4, 3, 4, 5, 5, 4, 2, 3, 4, 2, 3, 4, 0, 3, 3, 1, 4, 3, 2, 4, 3, 3, 5, 5, 0, 3, 0, 3, 0, 5, 5, 5, 5, 4, 4, 0, 4, 0, 1, 4, 4), + (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 5, 4, 4, 2, 3, 2, 5, 1, 3, 2, 5, 1, 4, 2, 3, 2, 3, 3, 4, 3, 3, 3, 3, 2, 5, 4, 1, 3, 3, 5, 3, 4, 4, 0, 4, 4, 3, 1, 1, 3, 1, 0, 2, 3, 0, 2, 3, 0, 3, 0, 0, 4, 3, 1, 3, 4, 0, 3, 0, 2, 0, 4, 4, 4, 3, 4, 5, 0, 4, 0, 0, 3, 4), + (0, 3, 0, 3, 0, 3, 1, 2, 0, 3, 4, 4, 3, 3, 3, 0, 2, 2, 4, 3, 3, 1, 3, 3, 3, 1, 1, 0, 3, 1, 4, 3, 2, 3, 4, 4, 2, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 3, 1, 3, 3, 1, 3, 3, 0, 4, 1, 0, 2, 2, 1, 4, 3, 2, 3, 3, 5, 4, 3, 3, 5, 4, 4, 3, 3, 0, 4, 0, 3, 2, 2, 4, 4), + (0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 2, 0, 1, 2, 1, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 1, 1, 3, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 3, 4, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1), + (0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 4, 1, 4, 0, 3, 0, 4, 0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 1, 5, 1, 4, 0, 0, 3, 0, 5, 0, 5, 2, 0, 1, 0, 0, 0, 2, 1, 4, 0, 1, 3, 0, 0, 3, 0, 0, 3, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), + (1, 4, 0, 5, 0, 3, 0, 2, 0, 3, 5, 4, 4, 3, 4, 3, 5, 3, 4, 3, 3, 0, 4, 3, 3, 3, 3, 3, 3, 2, 4, 4, 3, 1, 3, 4, 4, 5, 4, 4, 3, 4, 4, 1, 3, 5, 4, 3, 3, 3, 1, 2, 2, 3, 3, 1, 3, 1, 3, 3, 3, 5, 3, 3, 4, 5, 0, 3, 0, 3, 0, 3, 4, 3, 4, 4, 3, 0, 3, 0, 2, 4, 3), + (0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 4, 0, 4, 1, 4, 2, 4, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 1, 1, 1, 0, 3, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 3, 2, 0, 2, 2, 0, 1, 0, 0, 0, 2, 3, 2, 3, 3, 0, 0, 0, 0, 2, 1, 0), + (0, 5, 1, 5, 0, 3, 0, 3, 0, 5, 4, 4, 5, 1, 5, 3, 3, 0, 4, 3, 4, 3, 5, 3, 4, 3, 3, 2, 4, 3, 4, 3, 3, 0, 3, 3, 1, 4, 4, 3, 4, 4, 4, 3, 4, 5, 5, 3, 2, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 2, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 5, 3, 3, 0, 3, 4, 0, 4, 3), + (0, 5, 0, 5, 0, 3, 0, 2, 0, 4, 4, 3, 5, 2, 4, 3, 3, 3, 4, 4, 4, 3, 5, 3, 5, 3, 3, 1, 4, 0, 4, 3, 3, 0, 3, 3, 0, 4, 4, 4, 4, 5, 4, 3, 3, 5, 5, 3, 2, 3, 1, 2, 3, 2, 0, 1, 0, 0, 3, 2, 2, 4, 4, 3, 1, 5, 0, 4, 0, 3, 0, 4, 3, 1, 3, 2, 1, 0, 3, 3, 0, 3, 3), + (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 5, 5, 3, 4, 3, 3, 2, 5, 4, 4, 3, 5, 3, 5, 3, 4, 0, 4, 3, 4, 4, 3, 2, 4, 4, 3, 4, 5, 4, 4, 5, 5, 0, 3, 5, 5, 4, 1, 3, 3, 2, 3, 3, 1, 3, 1, 0, 4, 3, 1, 4, 4, 3, 4, 5, 0, 4, 0, 2, 0, 4, 3, 4, 4, 3, 3, 0, 4, 0, 0, 5, 5), + (0, 4, 0, 4, 0, 5, 0, 1, 1, 3, 3, 4, 4, 3, 4, 1, 3, 0, 5, 1, 3, 0, 3, 1, 3, 1, 1, 0, 3, 0, 3, 3, 4, 0, 4, 3, 0, 4, 4, 4, 3, 4, 4, 0, 3, 5, 4, 1, 0, 3, 0, 0, 2, 3, 0, 3, 1, 0, 3, 1, 0, 3, 2, 1, 3, 5, 0, 3, 0, 1, 0, 3, 2, 3, 3, 4, 4, 0, 2, 2, 0, 4, 4), + (2, 4, 0, 5, 0, 4, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 5, 3, 5, 3, 5, 2, 5, 3, 4, 3, 3, 4, 3, 4, 5, 3, 2, 1, 5, 4, 3, 2, 3, 4, 5, 3, 4, 1, 2, 5, 4, 3, 0, 3, 3, 0, 3, 2, 0, 2, 3, 0, 4, 1, 0, 3, 4, 3, 3, 5, 0, 3, 0, 1, 0, 4, 5, 5, 5, 4, 3, 0, 4, 2, 0, 3, 5), + (0, 5, 0, 4, 0, 4, 0, 2, 0, 5, 4, 3, 4, 3, 4, 3, 3, 3, 4, 3, 4, 2, 5, 3, 5, 3, 4, 1, 4, 3, 4, 4, 4, 0, 3, 5, 0, 4, 4, 4, 4, 5, 3, 1, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 0, 2, 2, 0, 3, 3, 2, 4, 3, 3, 3, 5, 3, 4, 1, 3, 3, 5, 3, 2, 0, 0, 0, 0, 4, 3, 1, 3, 3), + (0, 1, 0, 3, 0, 3, 0, 1, 0, 1, 3, 3, 3, 2, 3, 3, 3, 0, 3, 0, 0, 0, 3, 1, 3, 0, 0, 0, 2, 2, 2, 3, 0, 0, 3, 2, 0, 1, 2, 4, 1, 3, 3, 0, 0, 3, 3, 3, 0, 1, 0, 0, 2, 1, 0, 0, 3, 0, 3, 1, 0, 3, 0, 0, 1, 3, 0, 2, 0, 1, 0, 3, 3, 1, 3, 3, 0, 0, 1, 1, 0, 3, 3), + (0, 2, 0, 3, 0, 2, 1, 4, 0, 2, 2, 3, 1, 1, 3, 1, 1, 0, 2, 0, 3, 1, 2, 3, 1, 3, 0, 0, 1, 0, 4, 3, 2, 3, 3, 3, 1, 4, 2, 3, 3, 3, 3, 1, 0, 3, 1, 4, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1, 1, 0, 3, 1, 3, 2, 2, 0, 1, 0, 0, 0, 2, 3, 3, 3, 1, 0, 0, 0, 0, 0, 2, 3), + (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 5, 5, 3, 3, 4, 3, 3, 1, 5, 4, 4, 2, 4, 4, 4, 3, 4, 2, 4, 3, 5, 5, 4, 3, 3, 4, 3, 3, 5, 5, 4, 5, 5, 1, 3, 4, 5, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 1, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 5, 3, 3, 1, 4, 3, 0, 4, 0, 1, 5, 3), + (0, 5, 0, 5, 0, 4, 0, 2, 0, 4, 4, 3, 4, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 4, 4, 5, 3, 3, 5, 2, 4, 4, 4, 3, 4, 4, 3, 3, 4, 4, 5, 5, 3, 3, 4, 3, 4, 3, 3, 4, 3, 3, 3, 3, 1, 2, 2, 1, 4, 3, 3, 5, 4, 4, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 4, 4, 1, 0, 4, 2, 0, 2, 4), + (0, 4, 0, 4, 0, 3, 0, 1, 0, 3, 5, 2, 3, 0, 3, 0, 2, 1, 4, 2, 3, 3, 4, 1, 4, 3, 3, 2, 4, 1, 3, 3, 3, 0, 3, 3, 0, 0, 3, 3, 3, 5, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 3, 1, 2, 2, 3, 0, 3, 0, 2, 0, 4, 4, 3, 3, 4, 1, 0, 3, 0, 0, 2, 4), + (0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 3, 1, 3, 0, 3, 2, 0, 0, 0, 1, 0, 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 2, 0, 0, 0, 0, 0, 0, 2), + (0, 2, 1, 3, 0, 2, 0, 2, 0, 3, 3, 3, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 4, 2, 2, 1, 2, 1, 4, 0, 4, 3, 1, 3, 3, 3, 2, 4, 3, 5, 4, 3, 3, 3, 3, 3, 3, 3, 0, 1, 3, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 4, 2, 0, 2, 3, 0, 3, 3, 0, 3, 3, 4, 2, 3, 1, 4, 0, 1, 2, 0, 2, 3), + (0, 3, 0, 3, 0, 1, 0, 3, 0, 2, 3, 3, 3, 0, 3, 1, 2, 0, 3, 3, 2, 3, 3, 2, 3, 2, 3, 1, 3, 0, 4, 3, 2, 0, 3, 3, 1, 4, 3, 3, 2, 3, 4, 3, 1, 3, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 4, 1, 1, 0, 3, 0, 3, 1, 0, 2, 3, 3, 3, 3, 3, 1, 0, 0, 2, 0, 3, 3), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3), + (0, 2, 0, 3, 1, 3, 0, 3, 0, 2, 3, 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1, 3, 0, 2, 3, 1, 1, 4, 3, 3, 2, 3, 3, 1, 2, 2, 4, 1, 3, 3, 0, 1, 4, 2, 3, 0, 1, 3, 0, 3, 0, 0, 1, 3, 0, 2, 0, 0, 3, 3, 2, 1, 3, 0, 3, 0, 2, 0, 3, 4, 4, 4, 3, 1, 0, 3, 0, 0, 3, 3), + (0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 3, 2, 2, 1, 3, 0, 1, 1, 3, 0, 3, 2, 3, 1, 2, 0, 2, 0, 1, 1, 3, 3, 3, 0, 3, 3, 1, 1, 2, 3, 2, 3, 3, 1, 2, 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 2, 1, 2, 1, 3, 0, 3, 0, 0, 0, 3, 4, 4, 4, 3, 2, 0, 2, 0, 0, 2, 4), + (0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 3), + (0, 3, 0, 3, 0, 2, 0, 3, 0, 3, 3, 3, 2, 3, 2, 2, 2, 0, 3, 1, 3, 3, 3, 2, 3, 3, 0, 0, 3, 0, 3, 2, 2, 0, 2, 3, 1, 4, 3, 4, 3, 3, 2, 3, 1, 5, 4, 4, 0, 3, 1, 2, 1, 3, 0, 3, 1, 1, 2, 0, 2, 3, 1, 3, 1, 3, 0, 3, 0, 1, 0, 3, 3, 4, 4, 2, 1, 0, 2, 1, 0, 2, 4), + (0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 4, 2, 5, 1, 4, 0, 2, 0, 2, 1, 3, 1, 4, 0, 2, 1, 0, 0, 2, 1, 4, 1, 1, 0, 3, 3, 0, 5, 1, 3, 2, 3, 3, 1, 0, 3, 2, 3, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 1, 0, 3, 0, 2, 0, 1, 0, 3, 3, 3, 4, 3, 3, 0, 0, 0, 0, 2, 3), + (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3), + (0, 1, 0, 3, 0, 4, 0, 3, 0, 2, 4, 3, 1, 0, 3, 2, 2, 1, 3, 1, 2, 2, 3, 1, 1, 1, 2, 1, 3, 0, 1, 2, 0, 1, 3, 2, 1, 3, 0, 5, 5, 1, 0, 0, 1, 3, 2, 1, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 3, 4, 0, 1, 1, 1, 3, 2, 0, 2, 0, 1, 0, 2, 3, 3, 1, 2, 3, 0, 1, 0, 1, 0, 4), + (0, 0, 0, 1, 0, 3, 0, 3, 0, 2, 2, 1, 0, 0, 4, 0, 3, 0, 3, 1, 3, 0, 3, 0, 3, 0, 1, 0, 3, 0, 3, 1, 3, 0, 3, 3, 0, 0, 1, 2, 1, 1, 1, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 0, 0, 2, 0, 0, 0, 0, 2, 3, 3, 3, 3, 0, 0, 0, 0, 1, 4), + (0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 1, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 2, 3, 0, 0, 2, 2, 3, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 2, 3), + (2, 4, 0, 5, 0, 5, 0, 4, 0, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 2, 3, 0, 5, 5, 4, 1, 5, 4, 3, 1, 5, 4, 3, 4, 4, 3, 3, 4, 3, 3, 0, 3, 2, 0, 2, 3, 0, 3, 0, 0, 3, 3, 0, 5, 3, 2, 3, 3, 0, 3, 0, 3, 0, 3, 4, 5, 4, 5, 3, 0, 4, 3, 0, 3, 4), + (0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 3, 4, 3, 2, 3, 2, 3, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 1, 0, 2, 0, 0, 1, 1, 0, 2, 0, 0, 3, 1, 0, 5, 3, 2, 1, 3, 0, 3, 0, 1, 2, 4, 3, 2, 4, 3, 3, 0, 3, 2, 0, 4, 4), + (0, 3, 0, 3, 0, 1, 0, 0, 0, 1, 4, 3, 3, 2, 3, 1, 3, 1, 4, 2, 3, 2, 4, 2, 3, 4, 3, 0, 2, 2, 3, 3, 3, 0, 3, 3, 3, 0, 3, 4, 1, 3, 3, 0, 3, 4, 3, 3, 0, 1, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 0, 3, 1, 2, 1, 3, 0, 4, 0, 1, 0, 4, 3, 3, 4, 3, 3, 0, 2, 0, 0, 3, 3), + (0, 3, 0, 4, 0, 1, 0, 3, 0, 3, 4, 3, 3, 0, 3, 3, 3, 1, 3, 1, 3, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 3, 3, 1, 3, 3, 2, 5, 4, 3, 3, 4, 5, 3, 2, 5, 3, 4, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 0, 4, 2, 2, 1, 3, 0, 3, 0, 2, 0, 4, 4, 3, 5, 3, 2, 0, 1, 1, 0, 3, 4), + (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 4, 3, 3, 2, 3, 3, 3, 1, 4, 3, 4, 1, 5, 3, 4, 3, 4, 0, 4, 2, 4, 3, 4, 1, 5, 4, 0, 4, 4, 4, 4, 5, 4, 1, 3, 5, 4, 2, 1, 4, 1, 1, 3, 2, 0, 3, 1, 0, 3, 2, 1, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 3, 3, 3, 0, 4, 2, 0, 3, 4), + (1, 4, 0, 4, 0, 3, 0, 1, 0, 3, 3, 3, 1, 1, 3, 3, 2, 2, 3, 3, 1, 0, 3, 2, 2, 1, 2, 0, 3, 1, 2, 1, 2, 0, 3, 2, 0, 2, 2, 3, 3, 4, 3, 0, 3, 3, 1, 2, 0, 1, 1, 3, 1, 2, 0, 0, 3, 0, 1, 1, 0, 3, 2, 2, 3, 3, 0, 3, 0, 0, 0, 2, 3, 3, 4, 3, 3, 0, 1, 0, 0, 1, 4), + (0, 4, 0, 4, 0, 4, 0, 0, 0, 3, 4, 4, 3, 1, 4, 2, 3, 2, 3, 3, 3, 1, 4, 3, 4, 0, 3, 0, 4, 2, 3, 3, 2, 2, 5, 4, 2, 1, 3, 4, 3, 4, 3, 1, 3, 3, 4, 2, 0, 2, 1, 0, 3, 3, 0, 0, 2, 0, 3, 1, 0, 4, 4, 3, 4, 3, 0, 4, 0, 1, 0, 2, 4, 4, 4, 4, 4, 0, 3, 2, 0, 3, 3), + (0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2), + (0, 2, 0, 3, 0, 4, 0, 4, 0, 1, 3, 3, 3, 0, 4, 0, 2, 1, 2, 1, 1, 1, 2, 0, 3, 1, 1, 0, 1, 0, 3, 1, 0, 0, 3, 3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 2, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 2, 0, 3, 0, 0, 0, 0, 1, 0, 0, 3, 3, 4, 3, 1, 0, 1, 0, 3, 0, 2), + (0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 1, 0, 2, 0, 3, 1, 0, 1, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 2, 3, 0, 1, 4, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 3), + (0, 2, 0, 5, 0, 5, 0, 1, 0, 2, 4, 3, 3, 2, 5, 1, 3, 2, 3, 3, 3, 0, 4, 1, 2, 0, 3, 0, 4, 0, 2, 2, 1, 1, 5, 3, 0, 0, 1, 4, 2, 3, 2, 0, 3, 3, 3, 2, 0, 2, 4, 1, 1, 2, 0, 1, 1, 0, 3, 1, 0, 1, 3, 1, 2, 3, 0, 2, 0, 0, 0, 1, 3, 5, 4, 4, 4, 0, 3, 0, 0, 1, 3), + (0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 5, 4, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 3, 4, 5, 4, 2, 4, 2, 3, 4, 3, 1, 4, 4, 1, 3, 5, 4, 4, 5, 5, 4, 4, 5, 5, 5, 2, 3, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 4, 4, 4, 0, 3, 0, 4, 0, 3, 3, 4, 4, 5, 0, 0, 4, 3, 0, 4, 5), + (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 4, 4, 4, 3, 3, 2, 4, 3, 4, 3, 4, 3, 5, 3, 4, 3, 2, 1, 4, 2, 4, 4, 3, 1, 3, 4, 2, 4, 5, 5, 3, 4, 5, 4, 1, 5, 4, 3, 0, 3, 2, 2, 3, 2, 1, 3, 1, 0, 3, 3, 3, 5, 3, 3, 3, 5, 4, 4, 2, 3, 3, 4, 3, 3, 3, 2, 1, 0, 3, 2, 1, 4, 3), + (0, 4, 0, 5, 0, 4, 0, 3, 0, 3, 5, 5, 3, 2, 4, 3, 4, 0, 5, 4, 4, 1, 4, 4, 4, 3, 3, 3, 4, 3, 5, 5, 2, 3, 3, 4, 1, 2, 5, 5, 3, 5, 5, 2, 3, 5, 5, 4, 0, 3, 2, 0, 3, 3, 1, 1, 5, 1, 4, 1, 0, 4, 3, 2, 3, 5, 0, 4, 0, 3, 0, 5, 4, 3, 4, 3, 0, 0, 4, 1, 0, 4, 4), + (1, 3, 0, 4, 0, 2, 0, 2, 0, 2, 5, 5, 3, 3, 3, 3, 3, 0, 4, 2, 3, 4, 4, 4, 3, 4, 0, 0, 3, 4, 5, 4, 3, 3, 3, 3, 2, 5, 5, 4, 5, 5, 5, 4, 3, 5, 5, 5, 1, 3, 1, 0, 1, 0, 0, 3, 2, 0, 4, 2, 0, 5, 2, 3, 2, 4, 1, 3, 0, 3, 0, 4, 5, 4, 5, 4, 3, 0, 4, 2, 0, 5, 4), + (0, 3, 0, 4, 0, 5, 0, 3, 0, 3, 4, 4, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 4, 3, 3, 2, 2, 0, 3, 3, 3, 3, 3, 1, 3, 3, 3, 0, 4, 4, 3, 4, 4, 1, 1, 4, 4, 2, 0, 3, 1, 0, 1, 1, 0, 4, 1, 0, 2, 3, 1, 3, 3, 1, 3, 4, 0, 3, 0, 1, 0, 3, 1, 3, 0, 0, 1, 0, 2, 0, 0, 4, 4), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + (0, 3, 0, 3, 0, 2, 0, 3, 0, 1, 5, 4, 3, 3, 3, 1, 4, 2, 1, 2, 3, 4, 4, 2, 4, 4, 5, 0, 3, 1, 4, 3, 4, 0, 4, 3, 3, 3, 2, 3, 2, 5, 3, 4, 3, 2, 2, 3, 0, 0, 3, 0, 2, 1, 0, 1, 2, 0, 0, 0, 0, 2, 1, 1, 3, 1, 0, 2, 0, 4, 0, 3, 4, 4, 4, 5, 2, 0, 2, 0, 0, 1, 3), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 4, 2, 1, 1, 0, 1, 0, 3, 2, 0, 0, 3, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 4, 0, 4, 2, 1, 0, 0, 0, 0, 0, 1), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 2, 0, 2, 1, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2), + (0, 4, 0, 4, 0, 4, 0, 3, 0, 4, 4, 3, 4, 2, 4, 3, 2, 0, 4, 4, 4, 3, 5, 3, 5, 3, 3, 2, 4, 2, 4, 3, 4, 3, 1, 4, 0, 2, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3, 4, 1, 3, 4, 3, 2, 1, 2, 1, 3, 3, 3, 4, 4, 3, 3, 5, 0, 4, 0, 3, 0, 4, 3, 3, 3, 2, 1, 0, 3, 0, 0, 3, 3), + (0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 5, 5, 3, 3, 3, 3, 4, 3, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 3, 5, 3, 3, 1, 3, 2, 4, 5, 5, 5, 5, 4, 3, 4, 5, 5, 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 1, 2, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 4, 3, 2, 2, 1, 2, 0, 3, 0, 0, 4, 1), +) +# fmt: on + + +class JapaneseContextAnalysis: + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self) -> None: + self._total_rel = 0 + self._rel_sample: List[int] = [] + self._need_to_skip_char_num = 0 + self._last_char_order = -1 + self._done = False + self.reset() + + def reset(self) -> None: + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str: Union[bytes, bytearray], num_bytes: int) -> None: + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i : i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[ + jp2_char_context[self._last_char_order][order] + ] += 1 + self._last_char_order = order + + def got_enough_data(self) -> bool: + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self) -> float: + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + return self.DONT_KNOW + + def get_order(self, _: Union[bytes, bytearray]) -> Tuple[int, int]: + return -1, 1 + + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self) -> None: + super().__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self) -> str: + return self._charset_name + + def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]: + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]: + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..9946682 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,4649 @@ +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +BULGARIAN_LANG_MODEL = { + 63: { # 'e' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 1, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 0, # 'и' + 26: 1, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 1, # 'о' + 13: 1, # 'п' + 7: 1, # 'р' + 8: 1, # 'с' + 5: 1, # 'т' + 19: 0, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 45: { # '\xad' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 1, # 'М' + 36: 0, # 'Н' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 0, # 'о' + 13: 0, # 'п' + 7: 0, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 0, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 31: { # 'А' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 1, # 'А' + 32: 1, # 'Б' + 35: 2, # 'В' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 2, # 'З' + 40: 1, # 'И' + 59: 1, # 'Й' + 33: 1, # 'К' + 46: 2, # 'Л' + 38: 1, # 'М' + 36: 2, # 'Н' + 41: 1, # 'О' + 30: 2, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 2, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 2, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 1, # 'а' + 18: 2, # 'б' + 9: 2, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 1, # 'е' + 23: 1, # 'ж' + 15: 2, # 'з' + 2: 0, # 'и' + 26: 2, # 'й' + 12: 2, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 0, # 'о' + 13: 2, # 'п' + 7: 2, # 'р' + 8: 2, # 'с' + 5: 2, # 'т' + 19: 1, # 'у' + 29: 2, # 'ф' + 25: 1, # 'х' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 32: { # 'Б' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 2, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 1, # 'Е' + 55: 1, # 'Ж' + 47: 2, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 2, # 'Н' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 2, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 1, # 'Щ' + 61: 2, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 2, # 'р' + 8: 1, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 2, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 35: { # 'В' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 2, # 'Ф' + 49: 0, # 'Х' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 2, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 2, # 'р' + 8: 2, # 'с' + 5: 2, # 'т' + 19: 1, # 'у' + 29: 0, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 2, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 43: { # 'Г' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Н' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 1, # 'Щ' + 61: 1, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 2, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 1, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 37: { # 'Д' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 2, # 'В' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 2, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 2, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 2, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 44: { # 'Е' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 1, # 'Б' + 35: 2, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 1, # 'Й' + 33: 2, # 'К' + 46: 2, # 'Л' + 38: 1, # 'М' + 36: 2, # 'Н' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 2, # 'Ф' + 49: 1, # 'Х' + 53: 2, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 1, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 0, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 0, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 0, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 2, # 'н' + 4: 0, # 'о' + 13: 1, # 'п' + 7: 2, # 'р' + 8: 2, # 'с' + 5: 1, # 'т' + 19: 1, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 55: { # 'Ж' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 0, # 'Б' + 35: 1, # 'В' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Н' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 1, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 47: { # 'З' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 2, # 'Н' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 1, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 1, # 'о' + 13: 0, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 1, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 40: { # 'И' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 1, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 2, # 'З' + 40: 1, # 'И' + 59: 1, # 'Й' + 33: 2, # 'К' + 46: 2, # 'Л' + 38: 2, # 'М' + 36: 2, # 'Н' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 0, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 1, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 2, # 'Я' + 1: 1, # 'а' + 18: 1, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 1, # 'д' + 3: 1, # 'е' + 23: 0, # 'ж' + 15: 3, # 'з' + 2: 0, # 'и' + 26: 1, # 'й' + 12: 1, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 2, # 'н' + 4: 0, # 'о' + 13: 1, # 'п' + 7: 2, # 'р' + 8: 2, # 'с' + 5: 2, # 'т' + 19: 0, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 59: { # 'Й' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 1, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 0, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 0, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 33: { # 'К' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 2, # 'Н' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 1, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 3, # 'р' + 8: 1, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 46: { # 'Л' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 2, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Н' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 0, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 0, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 38: { # 'М' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 2, # 'В' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Х' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 0, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 36: { # 'Н' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 2, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 1, # 'Й' + 33: 2, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 1, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 0, # 'р' + 8: 0, # 'с' + 5: 1, # 'т' + 19: 1, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 2, # 'ю' + 16: 2, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 41: { # 'О' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 1, # 'Б' + 35: 2, # 'В' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 1, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 1, # 'Й' + 33: 2, # 'К' + 46: 2, # 'Л' + 38: 2, # 'М' + 36: 2, # 'Н' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Х' + 53: 0, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 1, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 1, # 'а' + 18: 2, # 'б' + 9: 2, # 'в' + 20: 2, # 'г' + 11: 1, # 'д' + 3: 1, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 0, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 0, # 'о' + 13: 2, # 'п' + 7: 2, # 'р' + 8: 2, # 'с' + 5: 3, # 'т' + 19: 1, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 1, # 'ц' + 21: 2, # 'ч' + 27: 0, # 'ш' + 24: 2, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 30: { # 'П' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 2, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 3, # 'л' + 14: 0, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 3, # 'р' + 8: 1, # 'с' + 5: 1, # 'т' + 19: 2, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 39: { # 'Р' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 2, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 0, # 'р' + 8: 1, # 'с' + 5: 0, # 'т' + 19: 3, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 28: { # 'С' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 3, # 'А' + 32: 2, # 'Б' + 35: 2, # 'В' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 2, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 2, # 'р' + 8: 0, # 'с' + 5: 3, # 'т' + 19: 2, # 'у' + 29: 2, # 'ф' + 25: 1, # 'х' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 34: { # 'Т' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 2, # 'Б' + 35: 1, # 'В' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 2, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Х' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 3, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 2, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 51: { # 'У' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 1, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 0, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 2, # 'Т' + 51: 0, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 2, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 2, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'р' + 8: 2, # 'с' + 5: 1, # 'т' + 19: 1, # 'у' + 29: 0, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 48: { # 'Ф' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Н' + 41: 1, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 2, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 1, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 49: { # 'Х' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 0, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 2, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 53: { # 'Ц' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 0, # 'Б' + 35: 1, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 2, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 2, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 1, # 'о' + 13: 0, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 1, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 50: { # 'Ч' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'А' + 32: 1, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Н' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 1, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 1, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 54: { # 'Ш' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Н' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 2, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 1, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 57: { # 'Щ' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 1, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 1, # 'о' + 13: 0, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 1, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 61: { # 'Ъ' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 0, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 2, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 0, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Х' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 1, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 1, # 'л' + 14: 0, # 'м' + 6: 1, # 'н' + 4: 0, # 'о' + 13: 0, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 0, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 60: { # 'Ю' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 1, # 'Б' + 35: 0, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 0, # 'Е' + 55: 1, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 2, # 'г' + 11: 1, # 'д' + 3: 0, # 'е' + 23: 2, # 'ж' + 15: 1, # 'з' + 2: 1, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 0, # 'о' + 13: 1, # 'п' + 7: 1, # 'р' + 8: 1, # 'с' + 5: 1, # 'т' + 19: 0, # 'у' + 29: 0, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 56: { # 'Я' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 1, # 'Б' + 35: 1, # 'В' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 1, # 'С' + 34: 2, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 1, # 'и' + 26: 1, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 2, # 'м' + 6: 2, # 'н' + 4: 0, # 'о' + 13: 2, # 'п' + 7: 1, # 'р' + 8: 1, # 'с' + 5: 1, # 'т' + 19: 0, # 'у' + 29: 0, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 1: { # 'а' + 63: 1, # 'e' + 45: 1, # '\xad' + 31: 1, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 3, # 'и' + 26: 3, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 3, # 'у' + 29: 3, # 'ф' + 25: 3, # 'х' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 3, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 18: { # 'б' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 3, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 0, # 'т' + 19: 3, # 'у' + 29: 0, # 'ф' + 25: 2, # 'х' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 3, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 9: { # 'в' + 63: 1, # 'e' + 45: 1, # '\xad' + 31: 0, # 'А' + 32: 1, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 0, # 'в' + 20: 2, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 3, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 2, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 2, # 'х' + 22: 2, # 'ц' + 21: 3, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 20: { # 'г' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 3, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'р' + 8: 2, # 'с' + 5: 2, # 'т' + 19: 3, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 11: { # 'д' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 2, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 1, # 'т' + 19: 3, # 'у' + 29: 1, # 'ф' + 25: 2, # 'х' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 3: { # 'е' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 2, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 2, # 'и' + 26: 3, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 2, # 'у' + 29: 3, # 'ф' + 25: 3, # 'х' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 3, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 23: { # 'ж' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'р' + 8: 1, # 'с' + 5: 1, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 15: { # 'з' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 3, # 'у' + 29: 1, # 'ф' + 25: 2, # 'х' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 2, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 2: { # 'и' + 63: 1, # 'e' + 45: 1, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 1, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 1, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 3, # 'и' + 26: 3, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 2, # 'у' + 29: 3, # 'ф' + 25: 3, # 'х' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 3, # 'щ' + 17: 2, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 26: { # 'й' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 2, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 2, # 'з' + 2: 1, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 2, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 1, # 'у' + 29: 2, # 'ф' + 25: 1, # 'х' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 12: { # 'к' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 1, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 3, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 3, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 10: { # 'л' + 63: 1, # 'e' + 45: 1, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 1, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 1, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 2, # 'п' + 7: 2, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 3, # 'у' + 29: 2, # 'ф' + 25: 2, # 'х' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ъ' + 52: 2, # 'ь' + 42: 3, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 14: { # 'м' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 1, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 3, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 2, # 'р' + 8: 2, # 'с' + 5: 1, # 'т' + 19: 3, # 'у' + 29: 2, # 'ф' + 25: 1, # 'х' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 6: { # 'н' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 1, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 2, # 'б' + 9: 2, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 2, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 2, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 3, # 'у' + 29: 3, # 'ф' + 25: 2, # 'х' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ъ' + 52: 2, # 'ь' + 42: 2, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 4: { # 'о' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 3, # 'и' + 26: 3, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 2, # 'у' + 29: 3, # 'ф' + 25: 3, # 'х' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 3, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 13: { # 'п' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 3, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'р' + 8: 2, # 'с' + 5: 2, # 'т' + 19: 3, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 2, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 7: { # 'р' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 2, # 'п' + 7: 1, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 3, # 'у' + 29: 2, # 'ф' + 25: 3, # 'х' + 22: 3, # 'ц' + 21: 2, # 'ч' + 27: 3, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ъ' + 52: 1, # 'ь' + 42: 2, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 8: { # 'с' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 2, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 1, # 'с' + 5: 3, # 'т' + 19: 3, # 'у' + 29: 2, # 'ф' + 25: 2, # 'х' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 2, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ъ' + 52: 2, # 'ь' + 42: 2, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 5: { # 'т' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 2, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 3, # 'у' + 29: 1, # 'ф' + 25: 2, # 'х' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ъ' + 52: 2, # 'ь' + 42: 2, # 'ю' + 16: 3, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 19: { # 'у' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 2, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 2, # 'и' + 26: 2, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 1, # 'у' + 29: 2, # 'ф' + 25: 2, # 'х' + 22: 2, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 2, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 29: { # 'ф' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 1, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 2, # 'р' + 8: 2, # 'с' + 5: 2, # 'т' + 19: 2, # 'у' + 29: 0, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 2, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 25: { # 'х' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 3, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'р' + 8: 1, # 'с' + 5: 2, # 'т' + 19: 3, # 'у' + 29: 0, # 'ф' + 25: 1, # 'х' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 22: { # 'ц' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'р' + 8: 1, # 'с' + 5: 1, # 'т' + 19: 2, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 0, # 'ю' + 16: 2, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 21: { # 'ч' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 3, # 'в' + 20: 1, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 2, # 'р' + 8: 0, # 'с' + 5: 2, # 'т' + 19: 3, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 27: { # 'ш' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 2, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 2, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 1, # 'т' + 19: 2, # 'у' + 29: 1, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ъ' + 52: 1, # 'ь' + 42: 1, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 24: { # 'щ' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 1, # 'р' + 8: 0, # 'с' + 5: 2, # 'т' + 19: 3, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 1, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 2, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 17: { # 'ъ' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 2, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 1, # 'и' + 26: 2, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 1, # 'у' + 29: 1, # 'ф' + 25: 2, # 'х' + 22: 2, # 'ц' + 21: 3, # 'ч' + 27: 2, # 'ш' + 24: 3, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 2, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 52: { # 'ь' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 1, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 0, # 'р' + 8: 0, # 'с' + 5: 1, # 'т' + 19: 0, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 1, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 1, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 42: { # 'ю' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 2, # 'б' + 9: 1, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 1, # 'е' + 23: 2, # 'ж' + 15: 2, # 'з' + 2: 1, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 2, # 'н' + 4: 1, # 'о' + 13: 1, # 'п' + 7: 2, # 'р' + 8: 2, # 'с' + 5: 2, # 'т' + 19: 1, # 'у' + 29: 1, # 'ф' + 25: 1, # 'х' + 22: 2, # 'ц' + 21: 3, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 1, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 16: { # 'я' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 3, # 'д' + 3: 2, # 'е' + 23: 1, # 'ж' + 15: 2, # 'з' + 2: 1, # 'и' + 26: 2, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 1, # 'о' + 13: 2, # 'п' + 7: 2, # 'р' + 8: 3, # 'с' + 5: 3, # 'т' + 19: 1, # 'у' + 29: 1, # 'ф' + 25: 3, # 'х' + 22: 2, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 2, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 1, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 58: { # 'є' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 0, # 'о' + 13: 0, # 'п' + 7: 0, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 0, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, + 62: { # '№' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'А' + 32: 0, # 'Б' + 35: 0, # 'В' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Н' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Х' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 0, # 'о' + 13: 0, # 'п' + 7: 0, # 'р' + 8: 0, # 'с' + 5: 0, # 'т' + 19: 0, # 'у' + 29: 0, # 'ф' + 25: 0, # 'х' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ъ' + 52: 0, # 'ь' + 42: 0, # 'ю' + 16: 0, # 'я' + 58: 0, # 'є' + 62: 0, # '№' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 77, # 'A' + 66: 90, # 'B' + 67: 99, # 'C' + 68: 100, # 'D' + 69: 72, # 'E' + 70: 109, # 'F' + 71: 107, # 'G' + 72: 101, # 'H' + 73: 79, # 'I' + 74: 185, # 'J' + 75: 81, # 'K' + 76: 102, # 'L' + 77: 76, # 'M' + 78: 94, # 'N' + 79: 82, # 'O' + 80: 110, # 'P' + 81: 186, # 'Q' + 82: 108, # 'R' + 83: 91, # 'S' + 84: 74, # 'T' + 85: 119, # 'U' + 86: 84, # 'V' + 87: 96, # 'W' + 88: 111, # 'X' + 89: 187, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 65, # 'a' + 98: 69, # 'b' + 99: 70, # 'c' + 100: 66, # 'd' + 101: 63, # 'e' + 102: 68, # 'f' + 103: 112, # 'g' + 104: 103, # 'h' + 105: 92, # 'i' + 106: 194, # 'j' + 107: 104, # 'k' + 108: 95, # 'l' + 109: 86, # 'm' + 110: 87, # 'n' + 111: 71, # 'o' + 112: 116, # 'p' + 113: 195, # 'q' + 114: 85, # 'r' + 115: 93, # 's' + 116: 97, # 't' + 117: 113, # 'u' + 118: 196, # 'v' + 119: 197, # 'w' + 120: 198, # 'x' + 121: 199, # 'y' + 122: 200, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 194, # '\x80' + 129: 195, # '\x81' + 130: 196, # '\x82' + 131: 197, # '\x83' + 132: 198, # '\x84' + 133: 199, # '\x85' + 134: 200, # '\x86' + 135: 201, # '\x87' + 136: 202, # '\x88' + 137: 203, # '\x89' + 138: 204, # '\x8a' + 139: 205, # '\x8b' + 140: 206, # '\x8c' + 141: 207, # '\x8d' + 142: 208, # '\x8e' + 143: 209, # '\x8f' + 144: 210, # '\x90' + 145: 211, # '\x91' + 146: 212, # '\x92' + 147: 213, # '\x93' + 148: 214, # '\x94' + 149: 215, # '\x95' + 150: 216, # '\x96' + 151: 217, # '\x97' + 152: 218, # '\x98' + 153: 219, # '\x99' + 154: 220, # '\x9a' + 155: 221, # '\x9b' + 156: 222, # '\x9c' + 157: 223, # '\x9d' + 158: 224, # '\x9e' + 159: 225, # '\x9f' + 160: 81, # '\xa0' + 161: 226, # 'Ё' + 162: 227, # 'Ђ' + 163: 228, # 'Ѓ' + 164: 229, # 'Є' + 165: 230, # 'Ѕ' + 166: 105, # 'І' + 167: 231, # 'Ї' + 168: 232, # 'Ј' + 169: 233, # 'Љ' + 170: 234, # 'Њ' + 171: 235, # 'Ћ' + 172: 236, # 'Ќ' + 173: 45, # '\xad' + 174: 237, # 'Ў' + 175: 238, # 'Џ' + 176: 31, # 'А' + 177: 32, # 'Б' + 178: 35, # 'В' + 179: 43, # 'Г' + 180: 37, # 'Д' + 181: 44, # 'Е' + 182: 55, # 'Ж' + 183: 47, # 'З' + 184: 40, # 'И' + 185: 59, # 'Й' + 186: 33, # 'К' + 187: 46, # 'Л' + 188: 38, # 'М' + 189: 36, # 'Н' + 190: 41, # 'О' + 191: 30, # 'П' + 192: 39, # 'Р' + 193: 28, # 'С' + 194: 34, # 'Т' + 195: 51, # 'У' + 196: 48, # 'Ф' + 197: 49, # 'Х' + 198: 53, # 'Ц' + 199: 50, # 'Ч' + 200: 54, # 'Ш' + 201: 57, # 'Щ' + 202: 61, # 'Ъ' + 203: 239, # 'Ы' + 204: 67, # 'Ь' + 205: 240, # 'Э' + 206: 60, # 'Ю' + 207: 56, # 'Я' + 208: 1, # 'а' + 209: 18, # 'б' + 210: 9, # 'в' + 211: 20, # 'г' + 212: 11, # 'д' + 213: 3, # 'е' + 214: 23, # 'ж' + 215: 15, # 'з' + 216: 2, # 'и' + 217: 26, # 'й' + 218: 12, # 'к' + 219: 10, # 'л' + 220: 14, # 'м' + 221: 6, # 'н' + 222: 4, # 'о' + 223: 13, # 'п' + 224: 7, # 'р' + 225: 8, # 'с' + 226: 5, # 'т' + 227: 19, # 'у' + 228: 29, # 'ф' + 229: 25, # 'х' + 230: 22, # 'ц' + 231: 21, # 'ч' + 232: 27, # 'ш' + 233: 24, # 'щ' + 234: 17, # 'ъ' + 235: 75, # 'ы' + 236: 52, # 'ь' + 237: 241, # 'э' + 238: 42, # 'ю' + 239: 16, # 'я' + 240: 62, # '№' + 241: 242, # 'ё' + 242: 243, # 'ђ' + 243: 244, # 'ѓ' + 244: 58, # 'є' + 245: 245, # 'ѕ' + 246: 98, # 'і' + 247: 246, # 'ї' + 248: 247, # 'ј' + 249: 248, # 'љ' + 250: 249, # 'њ' + 251: 250, # 'ћ' + 252: 251, # 'ќ' + 253: 91, # '§' + 254: 252, # 'ў' + 255: 253, # 'џ' +} + +ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-5", + language="Bulgarian", + char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER, + language_model=BULGARIAN_LANG_MODEL, + typical_positive_ratio=0.969392, + keep_ascii_letters=False, + alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", +) + +WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 77, # 'A' + 66: 90, # 'B' + 67: 99, # 'C' + 68: 100, # 'D' + 69: 72, # 'E' + 70: 109, # 'F' + 71: 107, # 'G' + 72: 101, # 'H' + 73: 79, # 'I' + 74: 185, # 'J' + 75: 81, # 'K' + 76: 102, # 'L' + 77: 76, # 'M' + 78: 94, # 'N' + 79: 82, # 'O' + 80: 110, # 'P' + 81: 186, # 'Q' + 82: 108, # 'R' + 83: 91, # 'S' + 84: 74, # 'T' + 85: 119, # 'U' + 86: 84, # 'V' + 87: 96, # 'W' + 88: 111, # 'X' + 89: 187, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 65, # 'a' + 98: 69, # 'b' + 99: 70, # 'c' + 100: 66, # 'd' + 101: 63, # 'e' + 102: 68, # 'f' + 103: 112, # 'g' + 104: 103, # 'h' + 105: 92, # 'i' + 106: 194, # 'j' + 107: 104, # 'k' + 108: 95, # 'l' + 109: 86, # 'm' + 110: 87, # 'n' + 111: 71, # 'o' + 112: 116, # 'p' + 113: 195, # 'q' + 114: 85, # 'r' + 115: 93, # 's' + 116: 97, # 't' + 117: 113, # 'u' + 118: 196, # 'v' + 119: 197, # 'w' + 120: 198, # 'x' + 121: 199, # 'y' + 122: 200, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 206, # 'Ђ' + 129: 207, # 'Ѓ' + 130: 208, # '‚' + 131: 209, # 'ѓ' + 132: 210, # '„' + 133: 211, # '…' + 134: 212, # '†' + 135: 213, # '‡' + 136: 120, # '€' + 137: 214, # '‰' + 138: 215, # 'Љ' + 139: 216, # '‹' + 140: 217, # 'Њ' + 141: 218, # 'Ќ' + 142: 219, # 'Ћ' + 143: 220, # 'Џ' + 144: 221, # 'ђ' + 145: 78, # '‘' + 146: 64, # '’' + 147: 83, # '“' + 148: 121, # '”' + 149: 98, # '•' + 150: 117, # '–' + 151: 105, # '—' + 152: 222, # None + 153: 223, # '™' + 154: 224, # 'љ' + 155: 225, # '›' + 156: 226, # 'њ' + 157: 227, # 'ќ' + 158: 228, # 'ћ' + 159: 229, # 'џ' + 160: 88, # '\xa0' + 161: 230, # 'Ў' + 162: 231, # 'ў' + 163: 232, # 'Ј' + 164: 233, # '¤' + 165: 122, # 'Ґ' + 166: 89, # '¦' + 167: 106, # '§' + 168: 234, # 'Ё' + 169: 235, # '©' + 170: 236, # 'Є' + 171: 237, # '«' + 172: 238, # '¬' + 173: 45, # '\xad' + 174: 239, # '®' + 175: 240, # 'Ї' + 176: 73, # '°' + 177: 80, # '±' + 178: 118, # 'І' + 179: 114, # 'і' + 180: 241, # 'ґ' + 181: 242, # 'µ' + 182: 243, # '¶' + 183: 244, # '·' + 184: 245, # 'ё' + 185: 62, # '№' + 186: 58, # 'є' + 187: 246, # '»' + 188: 247, # 'ј' + 189: 248, # 'Ѕ' + 190: 249, # 'ѕ' + 191: 250, # 'ї' + 192: 31, # 'А' + 193: 32, # 'Б' + 194: 35, # 'В' + 195: 43, # 'Г' + 196: 37, # 'Д' + 197: 44, # 'Е' + 198: 55, # 'Ж' + 199: 47, # 'З' + 200: 40, # 'И' + 201: 59, # 'Й' + 202: 33, # 'К' + 203: 46, # 'Л' + 204: 38, # 'М' + 205: 36, # 'Н' + 206: 41, # 'О' + 207: 30, # 'П' + 208: 39, # 'Р' + 209: 28, # 'С' + 210: 34, # 'Т' + 211: 51, # 'У' + 212: 48, # 'Ф' + 213: 49, # 'Х' + 214: 53, # 'Ц' + 215: 50, # 'Ч' + 216: 54, # 'Ш' + 217: 57, # 'Щ' + 218: 61, # 'Ъ' + 219: 251, # 'Ы' + 220: 67, # 'Ь' + 221: 252, # 'Э' + 222: 60, # 'Ю' + 223: 56, # 'Я' + 224: 1, # 'а' + 225: 18, # 'б' + 226: 9, # 'в' + 227: 20, # 'г' + 228: 11, # 'д' + 229: 3, # 'е' + 230: 23, # 'ж' + 231: 15, # 'з' + 232: 2, # 'и' + 233: 26, # 'й' + 234: 12, # 'к' + 235: 10, # 'л' + 236: 14, # 'м' + 237: 6, # 'н' + 238: 4, # 'о' + 239: 13, # 'п' + 240: 7, # 'р' + 241: 8, # 'с' + 242: 5, # 'т' + 243: 19, # 'у' + 244: 29, # 'ф' + 245: 25, # 'х' + 246: 22, # 'ц' + 247: 21, # 'ч' + 248: 27, # 'ш' + 249: 24, # 'щ' + 250: 17, # 'ъ' + 251: 75, # 'ы' + 252: 52, # 'ь' + 253: 253, # 'э' + 254: 42, # 'ю' + 255: 16, # 'я' +} + +WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel( + charset_name="windows-1251", + language="Bulgarian", + char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER, + language_model=BULGARIAN_LANG_MODEL, + typical_positive_ratio=0.969392, + keep_ascii_letters=False, + alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..cfb8639 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,4397 @@ +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +GREEK_LANG_MODEL = { + 60: { # 'e' + 60: 2, # 'e' + 55: 1, # 'o' + 58: 2, # 't' + 36: 1, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 55: { # 'o' + 60: 0, # 'e' + 55: 2, # 'o' + 58: 2, # 't' + 36: 1, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 1, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 1, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 58: { # 't' + 60: 2, # 'e' + 55: 1, # 'o' + 58: 1, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 1, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 36: { # '·' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 61: { # 'Ά' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 1, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 1, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 46: { # 'Έ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 2, # 'β' + 20: 2, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 2, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 1, # 'σ' + 2: 2, # 'τ' + 12: 0, # 'υ' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 54: { # 'Ό' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 2, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 2, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 31: { # 'Α' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 2, # 'Β' + 43: 2, # 'Γ' + 41: 1, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 2, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 2, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Ν' + 59: 1, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 2, # 'Υ' + 56: 2, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 2, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 1, # 'θ' + 5: 0, # 'ι' + 11: 2, # 'κ' + 16: 3, # 'λ' + 10: 2, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 2, # 'ς' + 7: 2, # 'σ' + 2: 0, # 'τ' + 12: 3, # 'υ' + 28: 2, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 2, # 'ύ' + 27: 0, # 'ώ' + }, + 51: { # 'Β' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 1, # 'Η' + 52: 0, # 'Θ' + 47: 1, # 'Ι' + 44: 0, # 'Κ' + 53: 1, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 2, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 43: { # 'Γ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 1, # 'Α' + 51: 0, # 'Β' + 43: 2, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 1, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 1, # 'Κ' + 53: 1, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 1, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 2, # 'Υ' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 41: { # 'Δ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 2, # 'ή' + 15: 2, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 1, # 'ό' + 26: 2, # 'ύ' + 27: 2, # 'ώ' + }, + 34: { # 'Ε' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 2, # 'Γ' + 41: 2, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 2, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Ν' + 59: 1, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 2, # 'Υ' + 56: 0, # 'Φ' + 50: 2, # 'Χ' + 57: 2, # 'Ω' + 17: 3, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 3, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 1, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 1, # 'θ' + 5: 2, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 2, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 2, # 'σ' + 2: 2, # 'τ' + 12: 2, # 'υ' + 28: 2, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 1, # 'ύ' + 27: 0, # 'ώ' + }, + 40: { # 'Η' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 1, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 2, # 'Θ' + 47: 0, # 'Ι' + 44: 2, # 'Κ' + 53: 0, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 1, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 1, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 1, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 52: { # 'Θ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 1, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 1, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 2, # 'ύ' + 27: 0, # 'ώ' + }, + 47: { # 'Ι' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 1, # 'Β' + 43: 1, # 'Γ' + 41: 2, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 2, # 'Κ' + 53: 2, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 0, # 'Υ' + 56: 2, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 1, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 2, # 'σ' + 2: 1, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 1, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 44: { # 'Κ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 1, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 1, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 1, # 'Τ' + 45: 2, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 1, # 'Ω' + 17: 3, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ό' + 26: 2, # 'ύ' + 27: 2, # 'ώ' + }, + 53: { # 'Λ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 2, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 2, # 'Σ' + 33: 0, # 'Τ' + 45: 2, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 1, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ό' + 26: 2, # 'ύ' + 27: 0, # 'ώ' + }, + 38: { # 'Μ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 2, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 2, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 2, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 2, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 49: { # 'Ν' + 60: 2, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 2, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 1, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 1, # 'ω' + 19: 2, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 59: { # 'Ξ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 1, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 1, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 39: { # 'Ο' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 1, # 'Β' + 43: 2, # 'Γ' + 41: 2, # 'Δ' + 34: 2, # 'Ε' + 40: 1, # 'Η' + 52: 2, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 2, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 2, # 'Υ' + 56: 2, # 'Φ' + 50: 2, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 2, # 'κ' + 16: 2, # 'λ' + 10: 2, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 2, # 'τ' + 12: 2, # 'υ' + 28: 1, # 'φ' + 23: 1, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 2, # 'ύ' + 27: 0, # 'ώ' + }, + 35: { # 'Π' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 2, # 'Λ' + 38: 1, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 1, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 2, # 'Ω' + 17: 2, # 'ά' + 18: 1, # 'έ' + 22: 1, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 2, # 'ό' + 26: 0, # 'ύ' + 27: 3, # 'ώ' + }, + 48: { # 'Ρ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 1, # 'Γ' + 41: 1, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 2, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 1, # 'Τ' + 45: 1, # 'Υ' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 1, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 1, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 3, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ό' + 26: 2, # 'ύ' + 27: 0, # 'ώ' + }, + 37: { # 'Σ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 1, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 0, # 'Λ' + 38: 2, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 2, # 'Υ' + 56: 0, # 'Φ' + 50: 2, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 2, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 2, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 2, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 2, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ό' + 26: 2, # 'ύ' + 27: 2, # 'ώ' + }, + 33: { # 'Τ' + 60: 0, # 'e' + 55: 1, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 2, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 1, # 'Τ' + 45: 1, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 2, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 2, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ό' + 26: 2, # 'ύ' + 27: 3, # 'ώ' + }, + 45: { # 'Υ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 2, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 2, # 'Η' + 52: 2, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 1, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 1, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 56: { # 'Φ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 1, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 1, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 2, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 1, # 'ύ' + 27: 1, # 'ώ' + }, + 50: { # 'Χ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 1, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 1, # 'Ν' + 59: 0, # 'Ξ' + 39: 1, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 1, # 'Ω' + 17: 2, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 2, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 57: { # 'Ω' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 1, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 1, # 'Λ' + 38: 0, # 'Μ' + 49: 2, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 2, # 'ρ' + 14: 2, # 'ς' + 7: 2, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 1, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 17: { # 'ά' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 3, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 2, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 3, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 18: { # 'έ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 3, # 'ε' + 32: 2, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 3, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 22: { # 'ή' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 1, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 15: { # 'ί' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 3, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 1, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 3, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 1: { # 'α' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 3, # 'ί' + 1: 0, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 2, # 'ε' + 32: 3, # 'ζ' + 13: 1, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ό' + 26: 2, # 'ύ' + 27: 0, # 'ώ' + }, + 29: { # 'β' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 2, # 'γ' + 21: 2, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 3, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 2, # 'ό' + 26: 2, # 'ύ' + 27: 2, # 'ώ' + }, + 20: { # 'γ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 3, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 3, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 2, # 'ύ' + 27: 3, # 'ώ' + }, + 21: { # 'δ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 3, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 3, # 'ώ' + }, + 3: { # 'ε' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 3, # 'ί' + 1: 2, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 2, # 'ε' + 32: 2, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 3, # 'ω' + 19: 2, # 'ό' + 26: 3, # 'ύ' + 27: 2, # 'ώ' + }, + 32: { # 'ζ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 2, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 1, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 2, # 'ό' + 26: 0, # 'ύ' + 27: 2, # 'ώ' + }, + 13: { # 'η' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 25: { # 'θ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 1, # 'λ' + 10: 3, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 3, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 3, # 'ώ' + }, + 5: { # 'ι' + 60: 0, # 'e' + 55: 1, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 2, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 0, # 'ύ' + 27: 3, # 'ώ' + }, + 11: { # 'κ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 2, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 2, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 2, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 3, # 'ώ' + }, + 16: { # 'λ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 1, # 'β' + 20: 2, # 'γ' + 21: 1, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 2, # 'θ' + 5: 3, # 'ι' + 11: 2, # 'κ' + 16: 3, # 'λ' + 10: 2, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 2, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 3, # 'ώ' + }, + 10: { # 'μ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 3, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 2, # 'υ' + 28: 3, # 'φ' + 23: 0, # 'χ' + 42: 2, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 2, # 'ύ' + 27: 2, # 'ώ' + }, + 6: { # 'ν' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 2, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 1, # 'λ' + 10: 0, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 3, # 'ώ' + }, + 30: { # 'ξ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 3, # 'τ' + 12: 2, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 2, # 'ό' + 26: 3, # 'ύ' + 27: 1, # 'ώ' + }, + 4: { # 'ο' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 2, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 2, # 'ω' + 19: 1, # 'ό' + 26: 3, # 'ύ' + 27: 2, # 'ώ' + }, + 9: { # 'π' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 3, # 'λ' + 10: 0, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 2, # 'ς' + 7: 0, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 2, # 'ύ' + 27: 3, # 'ώ' + }, + 8: { # 'ρ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 1, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 3, # 'ο' + 9: 2, # 'π' + 8: 2, # 'ρ' + 14: 0, # 'ς' + 7: 2, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 3, # 'ώ' + }, + 14: { # 'ς' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 0, # 'τ' + 12: 0, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 7: { # 'σ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 3, # 'β' + 20: 0, # 'γ' + 21: 2, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 2, # 'ώ' + }, + 2: { # 'τ' + 60: 0, # 'e' + 55: 2, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 2, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 2, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 2, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 3, # 'ώ' + }, + 12: { # 'υ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 2, # 'ε' + 32: 2, # 'ζ' + 13: 2, # 'η' + 25: 3, # 'θ' + 5: 2, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 2, # 'ω' + 19: 2, # 'ό' + 26: 0, # 'ύ' + 27: 2, # 'ώ' + }, + 28: { # 'φ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 2, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 1, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 1, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 2, # 'ύ' + 27: 2, # 'ώ' + }, + 23: { # 'χ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 2, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 2, # 'μ' + 6: 3, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'π' + 8: 3, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 3, # 'τ' + 12: 3, # 'υ' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ό' + 26: 3, # 'ύ' + 27: 3, # 'ώ' + }, + 42: { # 'ψ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 1, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'π' + 8: 0, # 'ρ' + 14: 0, # 'ς' + 7: 0, # 'σ' + 2: 2, # 'τ' + 12: 1, # 'υ' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 24: { # 'ω' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 1, # 'ά' + 18: 0, # 'έ' + 22: 2, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 2, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 19: { # 'ό' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 1, # 'ε' + 32: 2, # 'ζ' + 13: 2, # 'η' + 25: 2, # 'θ' + 5: 2, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 1, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 26: { # 'ύ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 2, # 'β' + 20: 2, # 'γ' + 21: 1, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 2, # 'φ' + 23: 2, # 'χ' + 42: 2, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, + 27: { # 'ώ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'Ό' + 31: 0, # 'Α' + 51: 0, # 'Β' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Ν' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Υ' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 1, # 'β' + 20: 0, # 'γ' + 21: 3, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 1, # 'η' + 25: 2, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 1, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'π' + 8: 3, # 'ρ' + 14: 3, # 'ς' + 7: 3, # 'σ' + 2: 3, # 'τ' + 12: 0, # 'υ' + 28: 1, # 'φ' + 23: 1, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ό' + 26: 0, # 'ύ' + 27: 0, # 'ώ' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +WINDOWS_1253_GREEK_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 82, # 'A' + 66: 100, # 'B' + 67: 104, # 'C' + 68: 94, # 'D' + 69: 98, # 'E' + 70: 101, # 'F' + 71: 116, # 'G' + 72: 102, # 'H' + 73: 111, # 'I' + 74: 187, # 'J' + 75: 117, # 'K' + 76: 92, # 'L' + 77: 88, # 'M' + 78: 113, # 'N' + 79: 85, # 'O' + 80: 79, # 'P' + 81: 118, # 'Q' + 82: 105, # 'R' + 83: 83, # 'S' + 84: 67, # 'T' + 85: 114, # 'U' + 86: 119, # 'V' + 87: 95, # 'W' + 88: 99, # 'X' + 89: 109, # 'Y' + 90: 188, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 72, # 'a' + 98: 70, # 'b' + 99: 80, # 'c' + 100: 81, # 'd' + 101: 60, # 'e' + 102: 96, # 'f' + 103: 93, # 'g' + 104: 89, # 'h' + 105: 68, # 'i' + 106: 120, # 'j' + 107: 97, # 'k' + 108: 77, # 'l' + 109: 86, # 'm' + 110: 69, # 'n' + 111: 55, # 'o' + 112: 78, # 'p' + 113: 115, # 'q' + 114: 65, # 'r' + 115: 66, # 's' + 116: 58, # 't' + 117: 76, # 'u' + 118: 106, # 'v' + 119: 103, # 'w' + 120: 87, # 'x' + 121: 107, # 'y' + 122: 112, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 255, # '€' + 129: 255, # None + 130: 255, # '‚' + 131: 255, # 'ƒ' + 132: 255, # '„' + 133: 255, # '…' + 134: 255, # '†' + 135: 255, # '‡' + 136: 255, # None + 137: 255, # '‰' + 138: 255, # None + 139: 255, # '‹' + 140: 255, # None + 141: 255, # None + 142: 255, # None + 143: 255, # None + 144: 255, # None + 145: 255, # '‘' + 146: 255, # '’' + 147: 255, # '“' + 148: 255, # '”' + 149: 255, # '•' + 150: 255, # '–' + 151: 255, # '—' + 152: 255, # None + 153: 255, # '™' + 154: 255, # None + 155: 255, # '›' + 156: 255, # None + 157: 255, # None + 158: 255, # None + 159: 255, # None + 160: 253, # '\xa0' + 161: 233, # '΅' + 162: 61, # 'Ά' + 163: 253, # '£' + 164: 253, # '¤' + 165: 253, # '¥' + 166: 253, # '¦' + 167: 253, # '§' + 168: 253, # '¨' + 169: 253, # '©' + 170: 253, # None + 171: 253, # '«' + 172: 253, # '¬' + 173: 74, # '\xad' + 174: 253, # '®' + 175: 253, # '―' + 176: 253, # '°' + 177: 253, # '±' + 178: 253, # '²' + 179: 253, # '³' + 180: 247, # '΄' + 181: 253, # 'µ' + 182: 253, # '¶' + 183: 36, # '·' + 184: 46, # 'Έ' + 185: 71, # 'Ή' + 186: 73, # 'Ί' + 187: 253, # '»' + 188: 54, # 'Ό' + 189: 253, # '½' + 190: 108, # 'Ύ' + 191: 123, # 'Ώ' + 192: 110, # 'ΐ' + 193: 31, # 'Α' + 194: 51, # 'Β' + 195: 43, # 'Γ' + 196: 41, # 'Δ' + 197: 34, # 'Ε' + 198: 91, # 'Ζ' + 199: 40, # 'Η' + 200: 52, # 'Θ' + 201: 47, # 'Ι' + 202: 44, # 'Κ' + 203: 53, # 'Λ' + 204: 38, # 'Μ' + 205: 49, # 'Ν' + 206: 59, # 'Ξ' + 207: 39, # 'Ο' + 208: 35, # 'Π' + 209: 48, # 'Ρ' + 210: 250, # None + 211: 37, # 'Σ' + 212: 33, # 'Τ' + 213: 45, # 'Υ' + 214: 56, # 'Φ' + 215: 50, # 'Χ' + 216: 84, # 'Ψ' + 217: 57, # 'Ω' + 218: 120, # 'Ϊ' + 219: 121, # 'Ϋ' + 220: 17, # 'ά' + 221: 18, # 'έ' + 222: 22, # 'ή' + 223: 15, # 'ί' + 224: 124, # 'ΰ' + 225: 1, # 'α' + 226: 29, # 'β' + 227: 20, # 'γ' + 228: 21, # 'δ' + 229: 3, # 'ε' + 230: 32, # 'ζ' + 231: 13, # 'η' + 232: 25, # 'θ' + 233: 5, # 'ι' + 234: 11, # 'κ' + 235: 16, # 'λ' + 236: 10, # 'μ' + 237: 6, # 'ν' + 238: 30, # 'ξ' + 239: 4, # 'ο' + 240: 9, # 'π' + 241: 8, # 'ρ' + 242: 14, # 'ς' + 243: 7, # 'σ' + 244: 2, # 'τ' + 245: 12, # 'υ' + 246: 28, # 'φ' + 247: 23, # 'χ' + 248: 42, # 'ψ' + 249: 24, # 'ω' + 250: 64, # 'ϊ' + 251: 75, # 'ϋ' + 252: 19, # 'ό' + 253: 26, # 'ύ' + 254: 27, # 'ώ' + 255: 253, # None +} + +WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel( + charset_name="windows-1253", + language="Greek", + char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER, + language_model=GREEK_LANG_MODEL, + typical_positive_ratio=0.982851, + keep_ascii_letters=False, + alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ", +) + +ISO_8859_7_GREEK_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 82, # 'A' + 66: 100, # 'B' + 67: 104, # 'C' + 68: 94, # 'D' + 69: 98, # 'E' + 70: 101, # 'F' + 71: 116, # 'G' + 72: 102, # 'H' + 73: 111, # 'I' + 74: 187, # 'J' + 75: 117, # 'K' + 76: 92, # 'L' + 77: 88, # 'M' + 78: 113, # 'N' + 79: 85, # 'O' + 80: 79, # 'P' + 81: 118, # 'Q' + 82: 105, # 'R' + 83: 83, # 'S' + 84: 67, # 'T' + 85: 114, # 'U' + 86: 119, # 'V' + 87: 95, # 'W' + 88: 99, # 'X' + 89: 109, # 'Y' + 90: 188, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 72, # 'a' + 98: 70, # 'b' + 99: 80, # 'c' + 100: 81, # 'd' + 101: 60, # 'e' + 102: 96, # 'f' + 103: 93, # 'g' + 104: 89, # 'h' + 105: 68, # 'i' + 106: 120, # 'j' + 107: 97, # 'k' + 108: 77, # 'l' + 109: 86, # 'm' + 110: 69, # 'n' + 111: 55, # 'o' + 112: 78, # 'p' + 113: 115, # 'q' + 114: 65, # 'r' + 115: 66, # 's' + 116: 58, # 't' + 117: 76, # 'u' + 118: 106, # 'v' + 119: 103, # 'w' + 120: 87, # 'x' + 121: 107, # 'y' + 122: 112, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 255, # '\x80' + 129: 255, # '\x81' + 130: 255, # '\x82' + 131: 255, # '\x83' + 132: 255, # '\x84' + 133: 255, # '\x85' + 134: 255, # '\x86' + 135: 255, # '\x87' + 136: 255, # '\x88' + 137: 255, # '\x89' + 138: 255, # '\x8a' + 139: 255, # '\x8b' + 140: 255, # '\x8c' + 141: 255, # '\x8d' + 142: 255, # '\x8e' + 143: 255, # '\x8f' + 144: 255, # '\x90' + 145: 255, # '\x91' + 146: 255, # '\x92' + 147: 255, # '\x93' + 148: 255, # '\x94' + 149: 255, # '\x95' + 150: 255, # '\x96' + 151: 255, # '\x97' + 152: 255, # '\x98' + 153: 255, # '\x99' + 154: 255, # '\x9a' + 155: 255, # '\x9b' + 156: 255, # '\x9c' + 157: 255, # '\x9d' + 158: 255, # '\x9e' + 159: 255, # '\x9f' + 160: 253, # '\xa0' + 161: 233, # '‘' + 162: 90, # '’' + 163: 253, # '£' + 164: 253, # '€' + 165: 253, # '₯' + 166: 253, # '¦' + 167: 253, # '§' + 168: 253, # '¨' + 169: 253, # '©' + 170: 253, # 'ͺ' + 171: 253, # '«' + 172: 253, # '¬' + 173: 74, # '\xad' + 174: 253, # None + 175: 253, # '―' + 176: 253, # '°' + 177: 253, # '±' + 178: 253, # '²' + 179: 253, # '³' + 180: 247, # '΄' + 181: 248, # '΅' + 182: 61, # 'Ά' + 183: 36, # '·' + 184: 46, # 'Έ' + 185: 71, # 'Ή' + 186: 73, # 'Ί' + 187: 253, # '»' + 188: 54, # 'Ό' + 189: 253, # '½' + 190: 108, # 'Ύ' + 191: 123, # 'Ώ' + 192: 110, # 'ΐ' + 193: 31, # 'Α' + 194: 51, # 'Β' + 195: 43, # 'Γ' + 196: 41, # 'Δ' + 197: 34, # 'Ε' + 198: 91, # 'Ζ' + 199: 40, # 'Η' + 200: 52, # 'Θ' + 201: 47, # 'Ι' + 202: 44, # 'Κ' + 203: 53, # 'Λ' + 204: 38, # 'Μ' + 205: 49, # 'Ν' + 206: 59, # 'Ξ' + 207: 39, # 'Ο' + 208: 35, # 'Π' + 209: 48, # 'Ρ' + 210: 250, # None + 211: 37, # 'Σ' + 212: 33, # 'Τ' + 213: 45, # 'Υ' + 214: 56, # 'Φ' + 215: 50, # 'Χ' + 216: 84, # 'Ψ' + 217: 57, # 'Ω' + 218: 120, # 'Ϊ' + 219: 121, # 'Ϋ' + 220: 17, # 'ά' + 221: 18, # 'έ' + 222: 22, # 'ή' + 223: 15, # 'ί' + 224: 124, # 'ΰ' + 225: 1, # 'α' + 226: 29, # 'β' + 227: 20, # 'γ' + 228: 21, # 'δ' + 229: 3, # 'ε' + 230: 32, # 'ζ' + 231: 13, # 'η' + 232: 25, # 'θ' + 233: 5, # 'ι' + 234: 11, # 'κ' + 235: 16, # 'λ' + 236: 10, # 'μ' + 237: 6, # 'ν' + 238: 30, # 'ξ' + 239: 4, # 'ο' + 240: 9, # 'π' + 241: 8, # 'ρ' + 242: 14, # 'ς' + 243: 7, # 'σ' + 244: 2, # 'τ' + 245: 12, # 'υ' + 246: 28, # 'φ' + 247: 23, # 'χ' + 248: 42, # 'ψ' + 249: 24, # 'ω' + 250: 64, # 'ϊ' + 251: 75, # 'ϋ' + 252: 19, # 'ό' + 253: 26, # 'ύ' + 254: 27, # 'ώ' + 255: 253, # None +} + +ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-7", + language="Greek", + char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER, + language_model=GREEK_LANG_MODEL, + typical_positive_ratio=0.982851, + keep_ascii_letters=False, + alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ", +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..56d2975 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,4380 @@ +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +HEBREW_LANG_MODEL = { + 50: { # 'a' + 50: 0, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 2, # 'l' + 54: 2, # 'n' + 49: 0, # 'o' + 51: 2, # 'r' + 43: 1, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 1, # 'ק' + 7: 0, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 60: { # 'c' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 0, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 0, # 'n' + 49: 1, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 61: { # 'd' + 50: 1, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 2, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 0, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 1, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 42: { # 'e' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 2, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 2, # 'l' + 54: 2, # 'n' + 49: 1, # 'o' + 51: 2, # 'r' + 43: 2, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 1, # '–' + 52: 2, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 53: { # 'i' + 50: 1, # 'a' + 60: 2, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 0, # 'i' + 56: 1, # 'l' + 54: 2, # 'n' + 49: 2, # 'o' + 51: 1, # 'r' + 43: 2, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 56: { # 'l' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 2, # 'e' + 53: 2, # 'i' + 56: 2, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 0, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 54: { # 'n' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 0, # 'r' + 43: 1, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 2, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 49: { # 'o' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 2, # 'n' + 49: 1, # 'o' + 51: 2, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 51: { # 'r' + 50: 2, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 2, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 2, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 2, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 43: { # 's' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 0, # 'd' + 42: 2, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 2, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, + 44: { # 't' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 0, # 'd' + 42: 2, # 'e' + 53: 2, # 'i' + 56: 1, # 'l' + 54: 0, # 'n' + 49: 1, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 2, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 63: { # 'u' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 0, # 'o' + 51: 1, # 'r' + 43: 2, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 34: { # '\xa0' + 50: 1, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 0, # 'e' + 53: 1, # 'i' + 56: 0, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 0, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 2, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 1, # 'ב' + 20: 1, # 'ג' + 16: 1, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 1, # 'ח' + 22: 1, # 'ט' + 1: 2, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 2, # 'מ' + 23: 0, # 'ן' + 12: 1, # 'נ' + 19: 1, # 'ס' + 13: 1, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 55: { # '´' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 1, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 2, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 1, # 'ן' + 12: 1, # 'נ' + 19: 1, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 48: { # '¼' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 1, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 39: { # '½' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 57: { # '¾' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 30: { # 'ְ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 1, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 1, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 2, # 'ב' + 20: 2, # 'ג' + 16: 2, # 'ד' + 3: 2, # 'ה' + 2: 2, # 'ו' + 24: 2, # 'ז' + 14: 2, # 'ח' + 22: 2, # 'ט' + 1: 2, # 'י' + 25: 2, # 'ך' + 15: 2, # 'כ' + 4: 2, # 'ל' + 11: 1, # 'ם' + 6: 2, # 'מ' + 23: 0, # 'ן' + 12: 2, # 'נ' + 19: 2, # 'ס' + 13: 2, # 'ע' + 26: 0, # 'ף' + 18: 2, # 'פ' + 27: 0, # 'ץ' + 21: 2, # 'צ' + 17: 2, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 59: { # 'ֱ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 1, # 'ב' + 20: 1, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 1, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 2, # 'ל' + 11: 0, # 'ם' + 6: 2, # 'מ' + 23: 0, # 'ן' + 12: 1, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 41: { # 'ֲ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 2, # 'ב' + 20: 1, # 'ג' + 16: 2, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 1, # 'ח' + 22: 1, # 'ט' + 1: 1, # 'י' + 25: 1, # 'ך' + 15: 1, # 'כ' + 4: 2, # 'ל' + 11: 0, # 'ם' + 6: 2, # 'מ' + 23: 0, # 'ן' + 12: 2, # 'נ' + 19: 1, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 2, # 'צ' + 17: 1, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 33: { # 'ִ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 1, # 'ִ' + 37: 0, # 'ֵ' + 36: 1, # 'ֶ' + 31: 0, # 'ַ' + 29: 1, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 1, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 2, # 'ב' + 20: 2, # 'ג' + 16: 2, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 2, # 'ז' + 14: 1, # 'ח' + 22: 1, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 2, # 'כ' + 4: 2, # 'ל' + 11: 2, # 'ם' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # 'נ' + 19: 2, # 'ס' + 13: 1, # 'ע' + 26: 0, # 'ף' + 18: 2, # 'פ' + 27: 1, # 'ץ' + 21: 2, # 'צ' + 17: 2, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 37: { # 'ֵ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 1, # 'ֶ' + 31: 1, # 'ַ' + 29: 1, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 2, # 'ב' + 20: 1, # 'ג' + 16: 2, # 'ד' + 3: 2, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 2, # 'ח' + 22: 1, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 1, # 'כ' + 4: 2, # 'ל' + 11: 2, # 'ם' + 6: 1, # 'מ' + 23: 2, # 'ן' + 12: 2, # 'נ' + 19: 1, # 'ס' + 13: 2, # 'ע' + 26: 1, # 'ף' + 18: 1, # 'פ' + 27: 1, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 36: { # 'ֶ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 1, # 'ֶ' + 31: 1, # 'ַ' + 29: 1, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 2, # 'ב' + 20: 1, # 'ג' + 16: 2, # 'ד' + 3: 2, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 2, # 'ח' + 22: 1, # 'ט' + 1: 2, # 'י' + 25: 2, # 'ך' + 15: 1, # 'כ' + 4: 2, # 'ל' + 11: 2, # 'ם' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # 'נ' + 19: 2, # 'ס' + 13: 1, # 'ע' + 26: 1, # 'ף' + 18: 1, # 'פ' + 27: 2, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 31: { # 'ַ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 1, # 'ֶ' + 31: 0, # 'ַ' + 29: 2, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 2, # 'ב' + 20: 2, # 'ג' + 16: 2, # 'ד' + 3: 2, # 'ה' + 2: 1, # 'ו' + 24: 2, # 'ז' + 14: 2, # 'ח' + 22: 2, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 2, # 'כ' + 4: 2, # 'ל' + 11: 2, # 'ם' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # 'נ' + 19: 2, # 'ס' + 13: 2, # 'ע' + 26: 2, # 'ף' + 18: 2, # 'פ' + 27: 1, # 'ץ' + 21: 2, # 'צ' + 17: 2, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 29: { # 'ָ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 1, # 'ַ' + 29: 2, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 1, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 2, # 'ב' + 20: 2, # 'ג' + 16: 2, # 'ד' + 3: 3, # 'ה' + 2: 2, # 'ו' + 24: 2, # 'ז' + 14: 2, # 'ח' + 22: 1, # 'ט' + 1: 2, # 'י' + 25: 2, # 'ך' + 15: 2, # 'כ' + 4: 2, # 'ל' + 11: 2, # 'ם' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # 'נ' + 19: 1, # 'ס' + 13: 2, # 'ע' + 26: 1, # 'ף' + 18: 2, # 'פ' + 27: 1, # 'ץ' + 21: 2, # 'צ' + 17: 2, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 35: { # 'ֹ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 1, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 2, # 'ב' + 20: 1, # 'ג' + 16: 2, # 'ד' + 3: 2, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 1, # 'ח' + 22: 1, # 'ט' + 1: 1, # 'י' + 25: 1, # 'ך' + 15: 2, # 'כ' + 4: 2, # 'ל' + 11: 2, # 'ם' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # 'נ' + 19: 2, # 'ס' + 13: 2, # 'ע' + 26: 1, # 'ף' + 18: 2, # 'פ' + 27: 1, # 'ץ' + 21: 2, # 'צ' + 17: 2, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 62: { # 'ֻ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 1, # 'ב' + 20: 1, # 'ג' + 16: 1, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 1, # 'ח' + 22: 0, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 2, # 'ל' + 11: 1, # 'ם' + 6: 1, # 'מ' + 23: 1, # 'ן' + 12: 1, # 'נ' + 19: 1, # 'ס' + 13: 1, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 28: { # 'ּ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 3, # 'ְ' + 59: 0, # 'ֱ' + 41: 1, # 'ֲ' + 33: 3, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 3, # 'ַ' + 29: 3, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 0, # 'ּ' + 38: 2, # 'ׁ' + 45: 1, # 'ׂ' + 9: 2, # 'א' + 8: 2, # 'ב' + 20: 1, # 'ג' + 16: 2, # 'ד' + 3: 1, # 'ה' + 2: 2, # 'ו' + 24: 1, # 'ז' + 14: 1, # 'ח' + 22: 1, # 'ט' + 1: 2, # 'י' + 25: 2, # 'ך' + 15: 2, # 'כ' + 4: 2, # 'ל' + 11: 1, # 'ם' + 6: 2, # 'מ' + 23: 1, # 'ן' + 12: 2, # 'נ' + 19: 1, # 'ס' + 13: 2, # 'ע' + 26: 1, # 'ף' + 18: 1, # 'פ' + 27: 1, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 38: { # 'ׁ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 2, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 1, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 45: { # 'ׂ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 1, # 'ֵ' + 36: 2, # 'ֶ' + 31: 1, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 0, # 'ב' + 20: 1, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 2, # 'ו' + 24: 0, # 'ז' + 14: 1, # 'ח' + 22: 0, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 1, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # 'נ' + 19: 0, # 'ס' + 13: 1, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 1, # 'ר' + 10: 0, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 9: { # 'א' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 2, # 'ֱ' + 41: 2, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 3, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 2, # 'ע' + 26: 3, # 'ף' + 18: 3, # 'פ' + 27: 1, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 8: { # 'ב' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 3, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 2, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 1, # 'ף' + 18: 3, # 'פ' + 27: 2, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 20: { # 'ג' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 2, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 1, # 'ִ' + 37: 1, # 'ֵ' + 36: 1, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 0, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 3, # 'ב' + 20: 2, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 2, # 'ח' + 22: 2, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 1, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 2, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 2, # 'פ' + 27: 1, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 16: { # 'ד' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 1, # 'ז' + 14: 2, # 'ח' + 22: 2, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 2, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 2, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 0, # 'ץ' + 21: 2, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 3: { # 'ה' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'ְ' + 59: 1, # 'ֱ' + 41: 2, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 3, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 0, # 'ף' + 18: 3, # 'פ' + 27: 1, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, + 2: { # 'ו' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 1, # 'ֵ' + 36: 1, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 3, # 'ֹ' + 62: 0, # 'ֻ' + 28: 3, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 3, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 3, # 'ף' + 18: 3, # 'פ' + 27: 3, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, + 24: { # 'ז' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 1, # 'ֲ' + 33: 1, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 2, # 'ב' + 20: 2, # 'ג' + 16: 2, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 2, # 'ז' + 14: 2, # 'ח' + 22: 1, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 2, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 2, # 'נ' + 19: 1, # 'ס' + 13: 2, # 'ע' + 26: 1, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 2, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 1, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 14: { # 'ח' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 1, # 'ֱ' + 41: 2, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 3, # 'ב' + 20: 2, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 2, # 'ח' + 22: 2, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 2, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 1, # 'ע' + 26: 2, # 'ף' + 18: 2, # 'פ' + 27: 2, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 22: { # 'ט' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 1, # 'ֵ' + 36: 1, # 'ֶ' + 31: 2, # 'ַ' + 29: 1, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 1, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 1, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 2, # 'ז' + 14: 3, # 'ח' + 22: 2, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 2, # 'כ' + 4: 3, # 'ל' + 11: 2, # 'ם' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 2, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 1, # 'ץ' + 21: 2, # 'צ' + 17: 2, # 'ק' + 7: 3, # 'ר' + 10: 2, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 1: { # 'י' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 1, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 3, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 3, # 'ף' + 18: 3, # 'פ' + 27: 3, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, + 25: { # 'ך' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 2, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 1, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 1, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 15: { # 'כ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 3, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 2, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 2, # 'ט' + 1: 3, # 'י' + 25: 3, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 2, # 'ע' + 26: 3, # 'ף' + 18: 3, # 'פ' + 27: 1, # 'ץ' + 21: 2, # 'צ' + 17: 2, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 4: { # 'ל' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 3, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 3, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 2, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 11: { # 'ם' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 1, # 'ב' + 20: 1, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 1, # 'ח' + 22: 0, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 1, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # 'נ' + 19: 0, # 'ס' + 13: 1, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 1, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, + 6: { # 'מ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 0, # 'ף' + 18: 3, # 'פ' + 27: 2, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 23: { # 'ן' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 1, # 'ב' + 20: 1, # 'ג' + 16: 1, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 0, # 'ז' + 14: 1, # 'ח' + 22: 1, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 1, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # 'נ' + 19: 1, # 'ס' + 13: 1, # 'ע' + 26: 1, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 1, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, + 12: { # 'נ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 2, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 19: { # 'ס' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 1, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 1, # 'ָ' + 35: 1, # 'ֹ' + 62: 2, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 1, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 2, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 2, # 'ס' + 13: 3, # 'ע' + 26: 3, # 'ף' + 18: 3, # 'פ' + 27: 0, # 'ץ' + 21: 2, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 1, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 13: { # 'ע' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'ְ' + 59: 1, # 'ֱ' + 41: 2, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 1, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 2, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 2, # 'ע' + 26: 1, # 'ף' + 18: 2, # 'פ' + 27: 2, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 26: { # 'ף' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 1, # 'ו' + 24: 0, # 'ז' + 14: 1, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 1, # 'ס' + 13: 0, # 'ע' + 26: 1, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 1, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 18: { # 'פ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 1, # 'ֵ' + 36: 2, # 'ֶ' + 31: 1, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 2, # 'ב' + 20: 3, # 'ג' + 16: 2, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 2, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 2, # 'ם' + 6: 2, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 2, # 'פ' + 27: 2, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 27: { # 'ץ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 1, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 1, # 'ר' + 10: 0, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 21: { # 'צ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 1, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 2, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 1, # 'ז' + 14: 3, # 'ח' + 22: 2, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 1, # 'כ' + 4: 3, # 'ל' + 11: 2, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 1, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 2, # 'ץ' + 21: 2, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 0, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 17: { # 'ק' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 1, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 2, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 2, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 1, # 'ך' + 15: 1, # 'כ' + 4: 3, # 'ל' + 11: 2, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 2, # 'ץ' + 21: 3, # 'צ' + 17: 2, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 7: { # 'ר' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 2, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 1, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 2, # 'ֹ' + 62: 1, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 3, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 3, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 3, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 3, # 'ץ' + 21: 3, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, + 10: { # 'ש' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 1, # 'ִ' + 37: 1, # 'ֵ' + 36: 1, # 'ֶ' + 31: 1, # 'ַ' + 29: 1, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 3, # 'ׁ' + 45: 2, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 3, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 2, # 'ז' + 14: 3, # 'ח' + 22: 3, # 'ט' + 1: 3, # 'י' + 25: 3, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # 'נ' + 19: 2, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 1, # 'ץ' + 21: 2, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 1, # '…' + }, + 5: { # 'ת' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 1, # '¼' + 39: 1, # '½' + 57: 0, # '¾' + 30: 2, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 2, # 'ִ' + 37: 2, # 'ֵ' + 36: 2, # 'ֶ' + 31: 2, # 'ַ' + 29: 2, # 'ָ' + 35: 1, # 'ֹ' + 62: 1, # 'ֻ' + 28: 2, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 3, # 'א' + 8: 3, # 'ב' + 20: 3, # 'ג' + 16: 2, # 'ד' + 3: 3, # 'ה' + 2: 3, # 'ו' + 24: 2, # 'ז' + 14: 3, # 'ח' + 22: 2, # 'ט' + 1: 3, # 'י' + 25: 2, # 'ך' + 15: 3, # 'כ' + 4: 3, # 'ל' + 11: 3, # 'ם' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # 'נ' + 19: 2, # 'ס' + 13: 3, # 'ע' + 26: 2, # 'ף' + 18: 3, # 'פ' + 27: 1, # 'ץ' + 21: 2, # 'צ' + 17: 3, # 'ק' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, + 32: { # '–' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 1, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 1, # 'ב' + 20: 1, # 'ג' + 16: 1, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 0, # 'ז' + 14: 1, # 'ח' + 22: 0, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 1, # 'ס' + 13: 1, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 1, # 'צ' + 17: 0, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 52: { # '’' + 50: 1, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 1, # 'r' + 43: 2, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 1, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 47: { # '“' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 2, # 'א' + 8: 1, # 'ב' + 20: 1, # 'ג' + 16: 1, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 1, # 'ח' + 22: 1, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # 'נ' + 19: 1, # 'ס' + 13: 1, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 1, # 'צ' + 17: 1, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 46: { # '”' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 1, # 'ב' + 20: 1, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 1, # 'צ' + 17: 0, # 'ק' + 7: 1, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 0, # '†' + 40: 0, # '…' + }, + 58: { # '†' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 0, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 0, # 'ה' + 2: 0, # 'ו' + 24: 0, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 0, # 'י' + 25: 0, # 'ך' + 15: 0, # 'כ' + 4: 0, # 'ל' + 11: 0, # 'ם' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 0, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # '”' + 58: 2, # '†' + 40: 0, # '…' + }, + 40: { # '…' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 0, # 'l' + 54: 1, # 'n' + 49: 0, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'ְ' + 59: 0, # 'ֱ' + 41: 0, # 'ֲ' + 33: 0, # 'ִ' + 37: 0, # 'ֵ' + 36: 0, # 'ֶ' + 31: 0, # 'ַ' + 29: 0, # 'ָ' + 35: 0, # 'ֹ' + 62: 0, # 'ֻ' + 28: 0, # 'ּ' + 38: 0, # 'ׁ' + 45: 0, # 'ׂ' + 9: 1, # 'א' + 8: 0, # 'ב' + 20: 0, # 'ג' + 16: 0, # 'ד' + 3: 1, # 'ה' + 2: 1, # 'ו' + 24: 1, # 'ז' + 14: 0, # 'ח' + 22: 0, # 'ט' + 1: 1, # 'י' + 25: 0, # 'ך' + 15: 1, # 'כ' + 4: 1, # 'ל' + 11: 0, # 'ם' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # 'נ' + 19: 0, # 'ס' + 13: 0, # 'ע' + 26: 0, # 'ף' + 18: 1, # 'פ' + 27: 0, # 'ץ' + 21: 0, # 'צ' + 17: 0, # 'ק' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # '”' + 58: 0, # '†' + 40: 2, # '…' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +WINDOWS_1255_HEBREW_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 69, # 'A' + 66: 91, # 'B' + 67: 79, # 'C' + 68: 80, # 'D' + 69: 92, # 'E' + 70: 89, # 'F' + 71: 97, # 'G' + 72: 90, # 'H' + 73: 68, # 'I' + 74: 111, # 'J' + 75: 112, # 'K' + 76: 82, # 'L' + 77: 73, # 'M' + 78: 95, # 'N' + 79: 85, # 'O' + 80: 78, # 'P' + 81: 121, # 'Q' + 82: 86, # 'R' + 83: 71, # 'S' + 84: 67, # 'T' + 85: 102, # 'U' + 86: 107, # 'V' + 87: 84, # 'W' + 88: 114, # 'X' + 89: 103, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 50, # 'a' + 98: 74, # 'b' + 99: 60, # 'c' + 100: 61, # 'd' + 101: 42, # 'e' + 102: 76, # 'f' + 103: 70, # 'g' + 104: 64, # 'h' + 105: 53, # 'i' + 106: 105, # 'j' + 107: 93, # 'k' + 108: 56, # 'l' + 109: 65, # 'm' + 110: 54, # 'n' + 111: 49, # 'o' + 112: 66, # 'p' + 113: 110, # 'q' + 114: 51, # 'r' + 115: 43, # 's' + 116: 44, # 't' + 117: 63, # 'u' + 118: 81, # 'v' + 119: 77, # 'w' + 120: 98, # 'x' + 121: 75, # 'y' + 122: 108, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 124, # '€' + 129: 202, # None + 130: 203, # '‚' + 131: 204, # 'ƒ' + 132: 205, # '„' + 133: 40, # '…' + 134: 58, # '†' + 135: 206, # '‡' + 136: 207, # 'ˆ' + 137: 208, # '‰' + 138: 209, # None + 139: 210, # '‹' + 140: 211, # None + 141: 212, # None + 142: 213, # None + 143: 214, # None + 144: 215, # None + 145: 83, # '‘' + 146: 52, # '’' + 147: 47, # '“' + 148: 46, # '”' + 149: 72, # '•' + 150: 32, # '–' + 151: 94, # '—' + 152: 216, # '˜' + 153: 113, # '™' + 154: 217, # None + 155: 109, # '›' + 156: 218, # None + 157: 219, # None + 158: 220, # None + 159: 221, # None + 160: 34, # '\xa0' + 161: 116, # '¡' + 162: 222, # '¢' + 163: 118, # '£' + 164: 100, # '₪' + 165: 223, # '¥' + 166: 224, # '¦' + 167: 117, # '§' + 168: 119, # '¨' + 169: 104, # '©' + 170: 125, # '×' + 171: 225, # '«' + 172: 226, # '¬' + 173: 87, # '\xad' + 174: 99, # '®' + 175: 227, # '¯' + 176: 106, # '°' + 177: 122, # '±' + 178: 123, # '²' + 179: 228, # '³' + 180: 55, # '´' + 181: 229, # 'µ' + 182: 230, # '¶' + 183: 101, # '·' + 184: 231, # '¸' + 185: 232, # '¹' + 186: 120, # '÷' + 187: 233, # '»' + 188: 48, # '¼' + 189: 39, # '½' + 190: 57, # '¾' + 191: 234, # '¿' + 192: 30, # 'ְ' + 193: 59, # 'ֱ' + 194: 41, # 'ֲ' + 195: 88, # 'ֳ' + 196: 33, # 'ִ' + 197: 37, # 'ֵ' + 198: 36, # 'ֶ' + 199: 31, # 'ַ' + 200: 29, # 'ָ' + 201: 35, # 'ֹ' + 202: 235, # None + 203: 62, # 'ֻ' + 204: 28, # 'ּ' + 205: 236, # 'ֽ' + 206: 126, # '־' + 207: 237, # 'ֿ' + 208: 238, # '׀' + 209: 38, # 'ׁ' + 210: 45, # 'ׂ' + 211: 239, # '׃' + 212: 240, # 'װ' + 213: 241, # 'ױ' + 214: 242, # 'ײ' + 215: 243, # '׳' + 216: 127, # '״' + 217: 244, # None + 218: 245, # None + 219: 246, # None + 220: 247, # None + 221: 248, # None + 222: 249, # None + 223: 250, # None + 224: 9, # 'א' + 225: 8, # 'ב' + 226: 20, # 'ג' + 227: 16, # 'ד' + 228: 3, # 'ה' + 229: 2, # 'ו' + 230: 24, # 'ז' + 231: 14, # 'ח' + 232: 22, # 'ט' + 233: 1, # 'י' + 234: 25, # 'ך' + 235: 15, # 'כ' + 236: 4, # 'ל' + 237: 11, # 'ם' + 238: 6, # 'מ' + 239: 23, # 'ן' + 240: 12, # 'נ' + 241: 19, # 'ס' + 242: 13, # 'ע' + 243: 26, # 'ף' + 244: 18, # 'פ' + 245: 27, # 'ץ' + 246: 21, # 'צ' + 247: 17, # 'ק' + 248: 7, # 'ר' + 249: 10, # 'ש' + 250: 5, # 'ת' + 251: 251, # None + 252: 252, # None + 253: 128, # '\u200e' + 254: 96, # '\u200f' + 255: 253, # None +} + +WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel( + charset_name="windows-1255", + language="Hebrew", + char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER, + language_model=HEBREW_LANG_MODEL, + typical_positive_ratio=0.984004, + keep_ascii_letters=False, + alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ", +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..09a0d32 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,4649 @@ +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +HUNGARIAN_LANG_MODEL = { + 28: { # 'A' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 2, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 2, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 2, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 2, # 'N' + 47: 1, # 'O' + 46: 2, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 2, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 2, # 'p' + 10: 2, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 1, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 1, # 'Á' + 44: 0, # 'É' + 61: 1, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 40: { # 'B' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 0, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 1, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 3, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 54: { # 'C' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 0, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 0, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 1, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 3, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 45: { # 'D' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 0, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 0, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 1, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 0, # 'ű' + }, + 32: { # 'E' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 2, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 2, # 'K' + 41: 2, # 'L' + 34: 2, # 'M' + 35: 2, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 1, # 't' + 21: 2, # 'u' + 19: 1, # 'v' + 62: 1, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 0, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 0, # 'Ú' + 63: 1, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 50: { # 'F' + 28: 1, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 0, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 0, # 'V' + 55: 1, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 1, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 1, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 0, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 0, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 49: { # 'G' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 2, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 0, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 0, # 'ű' + }, + 38: { # 'H' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 0, # 'D' + 32: 1, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 1, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 1, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 1, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 0, # 'V' + 55: 1, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 1, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 0, # 'n' + 8: 3, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Á' + 44: 2, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 2, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 39: { # 'I' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 2, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 2, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 2, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 0, # 'e' + 27: 1, # 'f' + 12: 2, # 'g' + 20: 1, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 0, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 53: { # 'J' + 28: 2, # 'A' + 40: 0, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 1, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 0, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 0, # 'ü' + 42: 1, # 'ő' + 56: 0, # 'ű' + }, + 36: { # 'K' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 1, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 3, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 2, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'ő' + 56: 0, # 'ű' + }, + 41: { # 'L' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 1, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 34: { # 'M' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 3, # 'a' + 18: 0, # 'b' + 26: 1, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 3, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 1, # 'ű' + }, + 35: { # 'N' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 2, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 2, # 'Y' + 52: 1, # 'Z' + 2: 3, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 0, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 1, # 'ő' + 56: 0, # 'ű' + }, + 47: { # 'O' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 2, # 'K' + 41: 2, # 'L' + 34: 2, # 'M' + 35: 2, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 1, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 1, # 's' + 3: 2, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 1, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 0, # 'Í' + 58: 1, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 46: { # 'P' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 0, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 1, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 1, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 0, # 'Ú' + 63: 1, # 'Ü' + 14: 3, # 'á' + 15: 2, # 'é' + 30: 0, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 0, # 'ű' + }, + 43: { # 'R' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 2, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 2, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 33: { # 'S' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 3, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 1, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 1, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 1, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 2, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 37: { # 'T' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 1, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 2, # 'Á' + 44: 2, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 57: { # 'U' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 0, # 'f' + 12: 2, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 1, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 48: { # 'V' + 28: 2, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 0, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 2, # 'Á' + 44: 2, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 0, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 55: { # 'Y' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 2, # 'Z' + 2: 1, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 1, # 'o' + 23: 1, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 1, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 52: { # 'Z' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 0, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 1, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 1, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 1, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 2, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 2, # 'Á' + 44: 1, # 'É' + 61: 1, # 'Í' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 2: { # 'a' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 2, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 2, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 2, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 18: { # 'b' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 2, # 's' + 3: 1, # 't' + 21: 3, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 3, # 'ó' + 24: 2, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 2, # 'ő' + 56: 1, # 'ű' + }, + 26: { # 'c' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 1, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 1, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 1, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 2, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 2, # 't' + 21: 2, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 2, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 17: { # 'd' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 2, # 'k' + 6: 1, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 2, # 'ő' + 56: 1, # 'ű' + }, + 1: { # 'e' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 2, # 'e' + 27: 3, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 2, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 2, # 'u' + 19: 3, # 'v' + 62: 2, # 'x' + 16: 2, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 27: { # 'f' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 0, # 'p' + 10: 3, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 2, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 3, # 'ö' + 31: 1, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 12: { # 'g' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 2, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 2, # 'k' + 6: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 3, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 3, # 'ó' + 24: 2, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 2, # 'ő' + 56: 1, # 'ű' + }, + 20: { # 'h' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 2, # 's' + 3: 1, # 't' + 21: 3, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 0, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 2, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 9: { # 'i' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 3, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 2, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 3, # 'ó' + 24: 1, # 'ö' + 31: 2, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 1, # 'ű' + }, + 22: { # 'j' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 1, # 'i' + 22: 2, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 1, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 3, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 7: { # 'k' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 2, # 'ó' + 24: 3, # 'ö' + 31: 1, # 'ú' + 29: 3, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 6: { # 'l' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 1, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 3, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 3, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 3, # 'ő' + 56: 1, # 'ű' + }, + 13: { # 'm' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 1, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 8: 3, # 'o' + 23: 3, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 3, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'ő' + 56: 2, # 'ű' + }, + 4: { # 'n' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 1, # 'x' + 16: 3, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 3, # 'ü' + 42: 2, # 'ő' + 56: 1, # 'ű' + }, + 8: { # 'o' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 1, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 2, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 2, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 23: { # 'p' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 1, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 2, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 3, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 10: { # 'r' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 2, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 3, # 'ú' + 29: 3, # 'ü' + 42: 2, # 'ő' + 56: 2, # 'ű' + }, + 5: { # 's' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 2, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 2, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 3, # 'k' + 6: 2, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 3, # 'ú' + 29: 3, # 'ü' + 42: 2, # 'ő' + 56: 1, # 'ű' + }, + 3: { # 't' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 1, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 3, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 3, # 'ú' + 29: 3, # 'ü' + 42: 3, # 'ő' + 56: 2, # 'ű' + }, + 21: { # 'u' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 2, # 'b' + 26: 2, # 'c' + 17: 3, # 'd' + 1: 2, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 2, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 1, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 1, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 0, # 'ö' + 31: 1, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 19: { # 'v' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 2, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'ő' + 56: 1, # 'ű' + }, + 62: { # 'x' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 0, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 1, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 16: { # 'y' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 2, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'ő' + 56: 2, # 'ű' + }, + 11: { # 'z' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 2, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 3, # 'k' + 6: 2, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 3, # 'ü' + 42: 2, # 'ő' + 56: 1, # 'ű' + }, + 51: { # 'Á' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 1, # 'F' + 49: 2, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 2, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 1, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 44: { # 'É' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 0, # 'F' + 49: 2, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 2, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 0, # 'Á' + 44: 1, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 61: { # 'Í' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 1, # 'J' + 36: 0, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 2, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 1, # 'm' + 4: 0, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 0, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 58: { # 'Ó' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 2, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 0, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 1, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 59: { # 'Ö' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 0, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 0, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 60: { # 'Ú' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 2, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 2, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 63: { # 'Ü' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 0, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 0, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 0, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 1, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 14: { # 'á' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 1, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 2, # 'h' + 9: 2, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 2, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 15: { # 'é' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 3, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 0, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 30: { # 'í' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 2, # 's' + 3: 3, # 't' + 21: 0, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 25: { # 'ó' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 3, # 'd' + 1: 1, # 'e' + 27: 2, # 'f' + 12: 2, # 'g' + 20: 2, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 1, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 24: { # 'ö' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 0, # 'a' + 18: 3, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 0, # 'e' + 27: 1, # 'f' + 12: 2, # 'g' + 20: 1, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 0, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 0, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 31: { # 'ú' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 3, # 'j' + 7: 1, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 2, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 29: { # 'ü' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 2, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 0, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 42: { # 'ő' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 2, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 1, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, + 56: { # 'ű' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 0, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Á' + 44: 0, # 'É' + 61: 0, # 'Í' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'ő' + 56: 0, # 'ű' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 28, # 'A' + 66: 40, # 'B' + 67: 54, # 'C' + 68: 45, # 'D' + 69: 32, # 'E' + 70: 50, # 'F' + 71: 49, # 'G' + 72: 38, # 'H' + 73: 39, # 'I' + 74: 53, # 'J' + 75: 36, # 'K' + 76: 41, # 'L' + 77: 34, # 'M' + 78: 35, # 'N' + 79: 47, # 'O' + 80: 46, # 'P' + 81: 72, # 'Q' + 82: 43, # 'R' + 83: 33, # 'S' + 84: 37, # 'T' + 85: 57, # 'U' + 86: 48, # 'V' + 87: 64, # 'W' + 88: 68, # 'X' + 89: 55, # 'Y' + 90: 52, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 2, # 'a' + 98: 18, # 'b' + 99: 26, # 'c' + 100: 17, # 'd' + 101: 1, # 'e' + 102: 27, # 'f' + 103: 12, # 'g' + 104: 20, # 'h' + 105: 9, # 'i' + 106: 22, # 'j' + 107: 7, # 'k' + 108: 6, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 8, # 'o' + 112: 23, # 'p' + 113: 67, # 'q' + 114: 10, # 'r' + 115: 5, # 's' + 116: 3, # 't' + 117: 21, # 'u' + 118: 19, # 'v' + 119: 65, # 'w' + 120: 62, # 'x' + 121: 16, # 'y' + 122: 11, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 161, # '€' + 129: 162, # None + 130: 163, # '‚' + 131: 164, # None + 132: 165, # '„' + 133: 166, # '…' + 134: 167, # '†' + 135: 168, # '‡' + 136: 169, # None + 137: 170, # '‰' + 138: 171, # 'Š' + 139: 172, # '‹' + 140: 173, # 'Ś' + 141: 174, # 'Ť' + 142: 175, # 'Ž' + 143: 176, # 'Ź' + 144: 177, # None + 145: 178, # '‘' + 146: 179, # '’' + 147: 180, # '“' + 148: 78, # '”' + 149: 181, # '•' + 150: 69, # '–' + 151: 182, # '—' + 152: 183, # None + 153: 184, # '™' + 154: 185, # 'š' + 155: 186, # '›' + 156: 187, # 'ś' + 157: 188, # 'ť' + 158: 189, # 'ž' + 159: 190, # 'ź' + 160: 191, # '\xa0' + 161: 192, # 'ˇ' + 162: 193, # '˘' + 163: 194, # 'Ł' + 164: 195, # '¤' + 165: 196, # 'Ą' + 166: 197, # '¦' + 167: 76, # '§' + 168: 198, # '¨' + 169: 199, # '©' + 170: 200, # 'Ş' + 171: 201, # '«' + 172: 202, # '¬' + 173: 203, # '\xad' + 174: 204, # '®' + 175: 205, # 'Ż' + 176: 81, # '°' + 177: 206, # '±' + 178: 207, # '˛' + 179: 208, # 'ł' + 180: 209, # '´' + 181: 210, # 'µ' + 182: 211, # '¶' + 183: 212, # '·' + 184: 213, # '¸' + 185: 214, # 'ą' + 186: 215, # 'ş' + 187: 216, # '»' + 188: 217, # 'Ľ' + 189: 218, # '˝' + 190: 219, # 'ľ' + 191: 220, # 'ż' + 192: 221, # 'Ŕ' + 193: 51, # 'Á' + 194: 83, # 'Â' + 195: 222, # 'Ă' + 196: 80, # 'Ä' + 197: 223, # 'Ĺ' + 198: 224, # 'Ć' + 199: 225, # 'Ç' + 200: 226, # 'Č' + 201: 44, # 'É' + 202: 227, # 'Ę' + 203: 228, # 'Ë' + 204: 229, # 'Ě' + 205: 61, # 'Í' + 206: 230, # 'Î' + 207: 231, # 'Ď' + 208: 232, # 'Đ' + 209: 233, # 'Ń' + 210: 234, # 'Ň' + 211: 58, # 'Ó' + 212: 235, # 'Ô' + 213: 66, # 'Ő' + 214: 59, # 'Ö' + 215: 236, # '×' + 216: 237, # 'Ř' + 217: 238, # 'Ů' + 218: 60, # 'Ú' + 219: 70, # 'Ű' + 220: 63, # 'Ü' + 221: 239, # 'Ý' + 222: 240, # 'Ţ' + 223: 241, # 'ß' + 224: 84, # 'ŕ' + 225: 14, # 'á' + 226: 75, # 'â' + 227: 242, # 'ă' + 228: 71, # 'ä' + 229: 82, # 'ĺ' + 230: 243, # 'ć' + 231: 73, # 'ç' + 232: 244, # 'č' + 233: 15, # 'é' + 234: 85, # 'ę' + 235: 79, # 'ë' + 236: 86, # 'ě' + 237: 30, # 'í' + 238: 77, # 'î' + 239: 87, # 'ď' + 240: 245, # 'đ' + 241: 246, # 'ń' + 242: 247, # 'ň' + 243: 25, # 'ó' + 244: 74, # 'ô' + 245: 42, # 'ő' + 246: 24, # 'ö' + 247: 248, # '÷' + 248: 249, # 'ř' + 249: 250, # 'ů' + 250: 31, # 'ú' + 251: 56, # 'ű' + 252: 29, # 'ü' + 253: 251, # 'ý' + 254: 252, # 'ţ' + 255: 253, # '˙' +} + +WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel( + charset_name="windows-1250", + language="Hungarian", + char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER, + language_model=HUNGARIAN_LANG_MODEL, + typical_positive_ratio=0.947368, + keep_ascii_letters=True, + alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű", +) + +ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 28, # 'A' + 66: 40, # 'B' + 67: 54, # 'C' + 68: 45, # 'D' + 69: 32, # 'E' + 70: 50, # 'F' + 71: 49, # 'G' + 72: 38, # 'H' + 73: 39, # 'I' + 74: 53, # 'J' + 75: 36, # 'K' + 76: 41, # 'L' + 77: 34, # 'M' + 78: 35, # 'N' + 79: 47, # 'O' + 80: 46, # 'P' + 81: 71, # 'Q' + 82: 43, # 'R' + 83: 33, # 'S' + 84: 37, # 'T' + 85: 57, # 'U' + 86: 48, # 'V' + 87: 64, # 'W' + 88: 68, # 'X' + 89: 55, # 'Y' + 90: 52, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 2, # 'a' + 98: 18, # 'b' + 99: 26, # 'c' + 100: 17, # 'd' + 101: 1, # 'e' + 102: 27, # 'f' + 103: 12, # 'g' + 104: 20, # 'h' + 105: 9, # 'i' + 106: 22, # 'j' + 107: 7, # 'k' + 108: 6, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 8, # 'o' + 112: 23, # 'p' + 113: 67, # 'q' + 114: 10, # 'r' + 115: 5, # 's' + 116: 3, # 't' + 117: 21, # 'u' + 118: 19, # 'v' + 119: 65, # 'w' + 120: 62, # 'x' + 121: 16, # 'y' + 122: 11, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 159, # '\x80' + 129: 160, # '\x81' + 130: 161, # '\x82' + 131: 162, # '\x83' + 132: 163, # '\x84' + 133: 164, # '\x85' + 134: 165, # '\x86' + 135: 166, # '\x87' + 136: 167, # '\x88' + 137: 168, # '\x89' + 138: 169, # '\x8a' + 139: 170, # '\x8b' + 140: 171, # '\x8c' + 141: 172, # '\x8d' + 142: 173, # '\x8e' + 143: 174, # '\x8f' + 144: 175, # '\x90' + 145: 176, # '\x91' + 146: 177, # '\x92' + 147: 178, # '\x93' + 148: 179, # '\x94' + 149: 180, # '\x95' + 150: 181, # '\x96' + 151: 182, # '\x97' + 152: 183, # '\x98' + 153: 184, # '\x99' + 154: 185, # '\x9a' + 155: 186, # '\x9b' + 156: 187, # '\x9c' + 157: 188, # '\x9d' + 158: 189, # '\x9e' + 159: 190, # '\x9f' + 160: 191, # '\xa0' + 161: 192, # 'Ą' + 162: 193, # '˘' + 163: 194, # 'Ł' + 164: 195, # '¤' + 165: 196, # 'Ľ' + 166: 197, # 'Ś' + 167: 75, # '§' + 168: 198, # '¨' + 169: 199, # 'Š' + 170: 200, # 'Ş' + 171: 201, # 'Ť' + 172: 202, # 'Ź' + 173: 203, # '\xad' + 174: 204, # 'Ž' + 175: 205, # 'Ż' + 176: 79, # '°' + 177: 206, # 'ą' + 178: 207, # '˛' + 179: 208, # 'ł' + 180: 209, # '´' + 181: 210, # 'ľ' + 182: 211, # 'ś' + 183: 212, # 'ˇ' + 184: 213, # '¸' + 185: 214, # 'š' + 186: 215, # 'ş' + 187: 216, # 'ť' + 188: 217, # 'ź' + 189: 218, # '˝' + 190: 219, # 'ž' + 191: 220, # 'ż' + 192: 221, # 'Ŕ' + 193: 51, # 'Á' + 194: 81, # 'Â' + 195: 222, # 'Ă' + 196: 78, # 'Ä' + 197: 223, # 'Ĺ' + 198: 224, # 'Ć' + 199: 225, # 'Ç' + 200: 226, # 'Č' + 201: 44, # 'É' + 202: 227, # 'Ę' + 203: 228, # 'Ë' + 204: 229, # 'Ě' + 205: 61, # 'Í' + 206: 230, # 'Î' + 207: 231, # 'Ď' + 208: 232, # 'Đ' + 209: 233, # 'Ń' + 210: 234, # 'Ň' + 211: 58, # 'Ó' + 212: 235, # 'Ô' + 213: 66, # 'Ő' + 214: 59, # 'Ö' + 215: 236, # '×' + 216: 237, # 'Ř' + 217: 238, # 'Ů' + 218: 60, # 'Ú' + 219: 69, # 'Ű' + 220: 63, # 'Ü' + 221: 239, # 'Ý' + 222: 240, # 'Ţ' + 223: 241, # 'ß' + 224: 82, # 'ŕ' + 225: 14, # 'á' + 226: 74, # 'â' + 227: 242, # 'ă' + 228: 70, # 'ä' + 229: 80, # 'ĺ' + 230: 243, # 'ć' + 231: 72, # 'ç' + 232: 244, # 'č' + 233: 15, # 'é' + 234: 83, # 'ę' + 235: 77, # 'ë' + 236: 84, # 'ě' + 237: 30, # 'í' + 238: 76, # 'î' + 239: 85, # 'ď' + 240: 245, # 'đ' + 241: 246, # 'ń' + 242: 247, # 'ň' + 243: 25, # 'ó' + 244: 73, # 'ô' + 245: 42, # 'ő' + 246: 24, # 'ö' + 247: 248, # '÷' + 248: 249, # 'ř' + 249: 250, # 'ů' + 250: 31, # 'ú' + 251: 56, # 'ű' + 252: 29, # 'ü' + 253: 251, # 'ý' + 254: 252, # 'ţ' + 255: 253, # '˙' +} + +ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-2", + language="Hungarian", + char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER, + language_model=HUNGARIAN_LANG_MODEL, + typical_positive_ratio=0.947368, + keep_ascii_letters=True, + alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű", +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py new file mode 100644 index 0000000..39a5388 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py @@ -0,0 +1,5725 @@ +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +RUSSIAN_LANG_MODEL = { + 37: { # 'А' + 37: 0, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 2, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Х' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 1, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 0, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 1, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 2, # 'у' + 39: 2, # 'ф' + 26: 2, # 'х' + 28: 0, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 1, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 44: { # 'Б' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 1, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 2, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 33: { # 'В' + 37: 2, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 2, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 3, # 'с' + 6: 2, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 1, # 'х' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 1, # 'ъ' + 18: 3, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 0, # 'ю' + 16: 1, # 'я' + }, + 46: { # 'Г' + 37: 1, # 'А' + 44: 1, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 2, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 1, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 41: { # 'Д' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 2, # 'Е' + 56: 1, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 2, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 3, # 'ж' + 20: 1, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 48: { # 'Е' + 37: 1, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 2, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 2, # 'Р' + 32: 2, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Х' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 2, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 2, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 1, # 'н' + 1: 0, # 'о' + 15: 1, # 'п' + 9: 1, # 'р' + 7: 3, # 'с' + 6: 0, # 'т' + 14: 0, # 'у' + 39: 1, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 2, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 56: { # 'Ж' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 1, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 2, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 1, # 'м' + 5: 0, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 1, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 2, # 'ю' + 16: 0, # 'я' + }, + 51: { # 'З' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 0, # 'г' + 13: 2, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 1, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 1, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 1, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 1, # 'я' + }, + 42: { # 'И' + 37: 1, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 2, # 'Е' + 56: 1, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 2, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Х' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 1, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 2, # 'з' + 4: 1, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 1, # 'о' + 15: 1, # 'п' + 9: 2, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 1, # 'у' + 39: 1, # 'ф' + 26: 2, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 60: { # 'Й' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Х' + 58: 1, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 1, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 0, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 0, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 36: { # 'К' + 37: 2, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 2, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 1, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 0, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 49: { # 'Л' + 37: 2, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 1, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 0, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 0, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 1, # 'л' + 12: 0, # 'м' + 5: 1, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 0, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 2, # 'ю' + 16: 1, # 'я' + }, + 38: { # 'М' + 37: 1, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 0, # 'Ь' + 47: 1, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 1, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 1, # 'р' + 7: 1, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 3, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 31: { # 'Н' + 37: 2, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 1, # 'З' + 42: 2, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Х' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 1, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 1, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 3, # 'у' + 39: 0, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 2, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 34: { # 'О' + 37: 0, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 2, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 2, # 'Л' + 38: 1, # 'М' + 31: 2, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 2, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Х' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 1, # 'а' + 21: 2, # 'б' + 10: 1, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 0, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 1, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 0, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 1, # 'у' + 39: 1, # 'ф' + 26: 2, # 'х' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 35: { # 'П' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 2, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 0, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 3, # 'р' + 7: 1, # 'с' + 6: 1, # 'т' + 14: 2, # 'у' + 39: 1, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 2, # 'ь' + 30: 1, # 'э' + 27: 0, # 'ю' + 16: 2, # 'я' + }, + 45: { # 'Р' + 37: 2, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 2, # 'Е' + 56: 1, # 'Ж' + 51: 0, # 'З' + 42: 2, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 2, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Х' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 1, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 1, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 2, # 'ы' + 17: 0, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 2, # 'я' + }, + 32: { # 'С' + 37: 1, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 2, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Х' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 1, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 2, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 1, # 'с' + 6: 3, # 'т' + 14: 2, # 'у' + 39: 1, # 'ф' + 26: 1, # 'х' + 28: 1, # 'ц' + 22: 1, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 1, # 'ъ' + 18: 1, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 40: { # 'Т' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 2, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 1, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 1, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 1, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 3, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 52: { # 'У' + 37: 1, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Х' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 1, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 2, # 'и' + 23: 1, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 1, # 'н' + 1: 2, # 'о' + 15: 1, # 'п' + 9: 2, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 0, # 'у' + 39: 1, # 'ф' + 26: 1, # 'х' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 53: { # 'Ф' + 37: 1, # 'А' + 44: 1, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 0, # 'с' + 6: 1, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 55: { # 'Х' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 2, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 0, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 1, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 1, # 'ь' + 30: 1, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 58: { # 'Ц' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 0, # 'о' + 15: 0, # 'п' + 9: 0, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 1, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 50: { # 'Ч' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 1, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 1, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 1, # 'о' + 15: 0, # 'п' + 9: 1, # 'р' + 7: 0, # 'с' + 6: 3, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 1, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 57: { # 'Ш' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 1, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 2, # 'о' + 15: 2, # 'п' + 9: 1, # 'р' + 7: 0, # 'с' + 6: 2, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 1, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 63: { # 'Щ' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 1, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 1, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 1, # 'о' + 15: 0, # 'п' + 9: 0, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 1, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 62: { # 'Ы' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Х' + 58: 1, # 'Ц' + 50: 0, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 0, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 0, # 'о' + 15: 0, # 'п' + 9: 0, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 0, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 61: { # 'Ь' + 37: 0, # 'А' + 44: 1, # 'Б' + 33: 1, # 'В' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 1, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 1, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 0, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 0, # 'о' + 15: 0, # 'п' + 9: 0, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 0, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 47: { # 'Э' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 0, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 2, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 1, # 'п' + 9: 2, # 'р' + 7: 1, # 'с' + 6: 3, # 'т' + 14: 1, # 'у' + 39: 1, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 59: { # 'Ю' + 37: 1, # 'А' + 44: 1, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 1, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 0, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 1, # 'п' + 9: 1, # 'р' + 7: 1, # 'с' + 6: 0, # 'т' + 14: 0, # 'у' + 39: 0, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 43: { # 'Я' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 1, # 'В' + 46: 1, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Х' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 0, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 0, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 1, # 'й' + 11: 1, # 'к' + 8: 1, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 1, # 'п' + 9: 1, # 'р' + 7: 1, # 'с' + 6: 0, # 'т' + 14: 0, # 'у' + 39: 0, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 3: { # 'а' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 3, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 3, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 3, # 'у' + 39: 2, # 'ф' + 26: 3, # 'х' + 28: 3, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 2, # 'э' + 27: 3, # 'ю' + 16: 3, # 'я' + }, + 21: { # 'б' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 1, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 2, # 'т' + 14: 3, # 'у' + 39: 0, # 'ф' + 26: 2, # 'х' + 28: 1, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 3, # 'щ' + 54: 2, # 'ъ' + 18: 3, # 'ы' + 17: 2, # 'ь' + 30: 1, # 'э' + 27: 2, # 'ю' + 16: 3, # 'я' + }, + 10: { # 'в' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 3, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 3, # 'у' + 39: 1, # 'ф' + 26: 2, # 'х' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 3, # 'ш' + 29: 2, # 'щ' + 54: 2, # 'ъ' + 18: 3, # 'ы' + 17: 3, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 3, # 'я' + }, + 19: { # 'г' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 3, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 3, # 'у' + 39: 1, # 'ф' + 26: 1, # 'х' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 1, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 13: { # 'д' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 3, # 'у' + 39: 1, # 'ф' + 26: 2, # 'х' + 28: 3, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 2, # 'ъ' + 18: 3, # 'ы' + 17: 3, # 'ь' + 30: 1, # 'э' + 27: 2, # 'ю' + 16: 3, # 'я' + }, + 2: { # 'е' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 2, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 2, # 'у' + 39: 2, # 'ф' + 26: 3, # 'х' + 28: 3, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 1, # 'э' + 27: 2, # 'ю' + 16: 3, # 'я' + }, + 24: { # 'ж' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 1, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 1, # 'п' + 9: 2, # 'р' + 7: 2, # 'с' + 6: 1, # 'т' + 14: 3, # 'у' + 39: 1, # 'ф' + 26: 0, # 'х' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 2, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 20: { # 'з' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 3, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 3, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 2, # 'ъ' + 18: 3, # 'ы' + 17: 2, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 3, # 'я' + }, + 4: { # 'и' + 37: 1, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 3, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 2, # 'у' + 39: 2, # 'ф' + 26: 3, # 'х' + 28: 3, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 2, # 'э' + 27: 3, # 'ю' + 16: 3, # 'я' + }, + 23: { # 'й' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 2, # 'з' + 4: 1, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 1, # 'п' + 9: 2, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 1, # 'у' + 39: 2, # 'ф' + 26: 1, # 'х' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 2, # 'я' + }, + 11: { # 'к' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 3, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 3, # 'у' + 39: 1, # 'ф' + 26: 2, # 'х' + 28: 2, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 1, # 'ы' + 17: 1, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 8: { # 'л' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 3, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 1, # 'р' + 7: 3, # 'с' + 6: 2, # 'т' + 14: 3, # 'у' + 39: 2, # 'ф' + 26: 2, # 'х' + 28: 1, # 'ц' + 22: 3, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 3, # 'ы' + 17: 3, # 'ь' + 30: 1, # 'э' + 27: 3, # 'ю' + 16: 3, # 'я' + }, + 12: { # 'м' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 1, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 3, # 'с' + 6: 2, # 'т' + 14: 3, # 'у' + 39: 2, # 'ф' + 26: 2, # 'х' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 3, # 'ы' + 17: 2, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 3, # 'я' + }, + 5: { # 'н' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 1, # 'п' + 9: 2, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 3, # 'у' + 39: 2, # 'ф' + 26: 2, # 'х' + 28: 3, # 'ц' + 22: 3, # 'ч' + 25: 2, # 'ш' + 29: 2, # 'щ' + 54: 1, # 'ъ' + 18: 3, # 'ы' + 17: 3, # 'ь' + 30: 1, # 'э' + 27: 3, # 'ю' + 16: 3, # 'я' + }, + 1: { # 'о' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 3, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 2, # 'у' + 39: 2, # 'ф' + 26: 3, # 'х' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 2, # 'э' + 27: 3, # 'ю' + 16: 3, # 'я' + }, + 15: { # 'п' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 3, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 3, # 'у' + 39: 1, # 'ф' + 26: 0, # 'х' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ъ' + 18: 3, # 'ы' + 17: 2, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 3, # 'я' + }, + 9: { # 'р' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 2, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 3, # 'у' + 39: 2, # 'ф' + 26: 3, # 'х' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 3, # 'ш' + 29: 2, # 'щ' + 54: 0, # 'ъ' + 18: 3, # 'ы' + 17: 3, # 'ь' + 30: 2, # 'э' + 27: 2, # 'ю' + 16: 3, # 'я' + }, + 7: { # 'с' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 1, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 3, # 'у' + 39: 2, # 'ф' + 26: 3, # 'х' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 2, # 'ъ' + 18: 3, # 'ы' + 17: 3, # 'ь' + 30: 2, # 'э' + 27: 3, # 'ю' + 16: 3, # 'я' + }, + 6: { # 'т' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 2, # 'т' + 14: 3, # 'у' + 39: 2, # 'ф' + 26: 2, # 'х' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 2, # 'щ' + 54: 2, # 'ъ' + 18: 3, # 'ы' + 17: 3, # 'ь' + 30: 2, # 'э' + 27: 2, # 'ю' + 16: 3, # 'я' + }, + 14: { # 'у' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 2, # 'и' + 23: 2, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 3, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 1, # 'у' + 39: 2, # 'ф' + 26: 3, # 'х' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 2, # 'э' + 27: 3, # 'ю' + 16: 2, # 'я' + }, + 39: { # 'ф' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 1, # 'п' + 9: 2, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 2, # 'у' + 39: 2, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 1, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 2, # 'ы' + 17: 1, # 'ь' + 30: 2, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 26: { # 'х' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 3, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 1, # 'п' + 9: 3, # 'р' + 7: 2, # 'с' + 6: 2, # 'т' + 14: 2, # 'у' + 39: 1, # 'ф' + 26: 1, # 'х' + 28: 1, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 0, # 'щ' + 54: 1, # 'ъ' + 18: 0, # 'ы' + 17: 1, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 28: { # 'ц' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 1, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 1, # 'р' + 7: 0, # 'с' + 6: 1, # 'т' + 14: 3, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 1, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 3, # 'ы' + 17: 1, # 'ь' + 30: 0, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 22: { # 'ч' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 1, # 'с' + 6: 3, # 'т' + 14: 3, # 'у' + 39: 1, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 3, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 25: { # 'ш' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 1, # 'с' + 6: 2, # 'т' + 14: 3, # 'у' + 39: 2, # 'ф' + 26: 1, # 'х' + 28: 1, # 'ц' + 22: 1, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 3, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 0, # 'я' + }, + 29: { # 'щ' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 1, # 'о' + 15: 0, # 'п' + 9: 2, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 2, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 2, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 0, # 'я' + }, + 54: { # 'ъ' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 0, # 'о' + 15: 0, # 'п' + 9: 0, # 'р' + 7: 0, # 'с' + 6: 0, # 'т' + 14: 0, # 'у' + 39: 0, # 'ф' + 26: 0, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 1, # 'ю' + 16: 2, # 'я' + }, + 18: { # 'ы' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 2, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 1, # 'о' + 15: 3, # 'п' + 9: 3, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 1, # 'у' + 39: 0, # 'ф' + 26: 3, # 'х' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 2, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 0, # 'ю' + 16: 2, # 'я' + }, + 17: { # 'ь' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 3, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 0, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 2, # 'п' + 9: 1, # 'р' + 7: 3, # 'с' + 6: 2, # 'т' + 14: 0, # 'у' + 39: 2, # 'ф' + 26: 1, # 'х' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 3, # 'ш' + 29: 2, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 1, # 'э' + 27: 3, # 'ю' + 16: 3, # 'я' + }, + 30: { # 'э' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 1, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 1, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 2, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 2, # 'с' + 6: 3, # 'т' + 14: 1, # 'у' + 39: 2, # 'ф' + 26: 1, # 'х' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 1, # 'э' + 27: 1, # 'ю' + 16: 1, # 'я' + }, + 27: { # 'ю' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 1, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 1, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 1, # 'и' + 23: 1, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 1, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 0, # 'у' + 39: 1, # 'ф' + 26: 2, # 'х' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 1, # 'э' + 27: 2, # 'ю' + 16: 1, # 'я' + }, + 16: { # 'я' + 37: 0, # 'А' + 44: 0, # 'Б' + 33: 0, # 'В' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Н' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Х' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 2, # 'и' + 23: 2, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 0, # 'о' + 15: 2, # 'п' + 9: 2, # 'р' + 7: 3, # 'с' + 6: 3, # 'т' + 14: 1, # 'у' + 39: 1, # 'ф' + 26: 3, # 'х' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ъ' + 18: 0, # 'ы' + 17: 0, # 'ь' + 30: 0, # 'э' + 27: 2, # 'ю' + 16: 2, # 'я' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +IBM866_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 37, # 'А' + 129: 44, # 'Б' + 130: 33, # 'В' + 131: 46, # 'Г' + 132: 41, # 'Д' + 133: 48, # 'Е' + 134: 56, # 'Ж' + 135: 51, # 'З' + 136: 42, # 'И' + 137: 60, # 'Й' + 138: 36, # 'К' + 139: 49, # 'Л' + 140: 38, # 'М' + 141: 31, # 'Н' + 142: 34, # 'О' + 143: 35, # 'П' + 144: 45, # 'Р' + 145: 32, # 'С' + 146: 40, # 'Т' + 147: 52, # 'У' + 148: 53, # 'Ф' + 149: 55, # 'Х' + 150: 58, # 'Ц' + 151: 50, # 'Ч' + 152: 57, # 'Ш' + 153: 63, # 'Щ' + 154: 70, # 'Ъ' + 155: 62, # 'Ы' + 156: 61, # 'Ь' + 157: 47, # 'Э' + 158: 59, # 'Ю' + 159: 43, # 'Я' + 160: 3, # 'а' + 161: 21, # 'б' + 162: 10, # 'в' + 163: 19, # 'г' + 164: 13, # 'д' + 165: 2, # 'е' + 166: 24, # 'ж' + 167: 20, # 'з' + 168: 4, # 'и' + 169: 23, # 'й' + 170: 11, # 'к' + 171: 8, # 'л' + 172: 12, # 'м' + 173: 5, # 'н' + 174: 1, # 'о' + 175: 15, # 'п' + 176: 191, # '░' + 177: 192, # '▒' + 178: 193, # '▓' + 179: 194, # '│' + 180: 195, # '┤' + 181: 196, # '╡' + 182: 197, # '╢' + 183: 198, # '╖' + 184: 199, # '╕' + 185: 200, # '╣' + 186: 201, # '║' + 187: 202, # '╗' + 188: 203, # '╝' + 189: 204, # '╜' + 190: 205, # '╛' + 191: 206, # '┐' + 192: 207, # '└' + 193: 208, # '┴' + 194: 209, # '┬' + 195: 210, # '├' + 196: 211, # '─' + 197: 212, # '┼' + 198: 213, # '╞' + 199: 214, # '╟' + 200: 215, # '╚' + 201: 216, # '╔' + 202: 217, # '╩' + 203: 218, # '╦' + 204: 219, # '╠' + 205: 220, # '═' + 206: 221, # '╬' + 207: 222, # '╧' + 208: 223, # '╨' + 209: 224, # '╤' + 210: 225, # '╥' + 211: 226, # '╙' + 212: 227, # '╘' + 213: 228, # '╒' + 214: 229, # '╓' + 215: 230, # '╫' + 216: 231, # '╪' + 217: 232, # '┘' + 218: 233, # '┌' + 219: 234, # '█' + 220: 235, # '▄' + 221: 236, # '▌' + 222: 237, # '▐' + 223: 238, # '▀' + 224: 9, # 'р' + 225: 7, # 'с' + 226: 6, # 'т' + 227: 14, # 'у' + 228: 39, # 'ф' + 229: 26, # 'х' + 230: 28, # 'ц' + 231: 22, # 'ч' + 232: 25, # 'ш' + 233: 29, # 'щ' + 234: 54, # 'ъ' + 235: 18, # 'ы' + 236: 17, # 'ь' + 237: 30, # 'э' + 238: 27, # 'ю' + 239: 16, # 'я' + 240: 239, # 'Ё' + 241: 68, # 'ё' + 242: 240, # 'Є' + 243: 241, # 'є' + 244: 242, # 'Ї' + 245: 243, # 'ї' + 246: 244, # 'Ў' + 247: 245, # 'ў' + 248: 246, # '°' + 249: 247, # '∙' + 250: 248, # '·' + 251: 249, # '√' + 252: 250, # '№' + 253: 251, # '¤' + 254: 252, # '■' + 255: 255, # '\xa0' +} + +IBM866_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="IBM866", + language="Russian", + char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) + +WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # 'Ђ' + 129: 192, # 'Ѓ' + 130: 193, # '‚' + 131: 194, # 'ѓ' + 132: 195, # '„' + 133: 196, # '…' + 134: 197, # '†' + 135: 198, # '‡' + 136: 199, # '€' + 137: 200, # '‰' + 138: 201, # 'Љ' + 139: 202, # '‹' + 140: 203, # 'Њ' + 141: 204, # 'Ќ' + 142: 205, # 'Ћ' + 143: 206, # 'Џ' + 144: 207, # 'ђ' + 145: 208, # '‘' + 146: 209, # '’' + 147: 210, # '“' + 148: 211, # '”' + 149: 212, # '•' + 150: 213, # '–' + 151: 214, # '—' + 152: 215, # None + 153: 216, # '™' + 154: 217, # 'љ' + 155: 218, # '›' + 156: 219, # 'њ' + 157: 220, # 'ќ' + 158: 221, # 'ћ' + 159: 222, # 'џ' + 160: 223, # '\xa0' + 161: 224, # 'Ў' + 162: 225, # 'ў' + 163: 226, # 'Ј' + 164: 227, # '¤' + 165: 228, # 'Ґ' + 166: 229, # '¦' + 167: 230, # '§' + 168: 231, # 'Ё' + 169: 232, # '©' + 170: 233, # 'Є' + 171: 234, # '«' + 172: 235, # '¬' + 173: 236, # '\xad' + 174: 237, # '®' + 175: 238, # 'Ї' + 176: 239, # '°' + 177: 240, # '±' + 178: 241, # 'І' + 179: 242, # 'і' + 180: 243, # 'ґ' + 181: 244, # 'µ' + 182: 245, # '¶' + 183: 246, # '·' + 184: 68, # 'ё' + 185: 247, # '№' + 186: 248, # 'є' + 187: 249, # '»' + 188: 250, # 'ј' + 189: 251, # 'Ѕ' + 190: 252, # 'ѕ' + 191: 253, # 'ї' + 192: 37, # 'А' + 193: 44, # 'Б' + 194: 33, # 'В' + 195: 46, # 'Г' + 196: 41, # 'Д' + 197: 48, # 'Е' + 198: 56, # 'Ж' + 199: 51, # 'З' + 200: 42, # 'И' + 201: 60, # 'Й' + 202: 36, # 'К' + 203: 49, # 'Л' + 204: 38, # 'М' + 205: 31, # 'Н' + 206: 34, # 'О' + 207: 35, # 'П' + 208: 45, # 'Р' + 209: 32, # 'С' + 210: 40, # 'Т' + 211: 52, # 'У' + 212: 53, # 'Ф' + 213: 55, # 'Х' + 214: 58, # 'Ц' + 215: 50, # 'Ч' + 216: 57, # 'Ш' + 217: 63, # 'Щ' + 218: 70, # 'Ъ' + 219: 62, # 'Ы' + 220: 61, # 'Ь' + 221: 47, # 'Э' + 222: 59, # 'Ю' + 223: 43, # 'Я' + 224: 3, # 'а' + 225: 21, # 'б' + 226: 10, # 'в' + 227: 19, # 'г' + 228: 13, # 'д' + 229: 2, # 'е' + 230: 24, # 'ж' + 231: 20, # 'з' + 232: 4, # 'и' + 233: 23, # 'й' + 234: 11, # 'к' + 235: 8, # 'л' + 236: 12, # 'м' + 237: 5, # 'н' + 238: 1, # 'о' + 239: 15, # 'п' + 240: 9, # 'р' + 241: 7, # 'с' + 242: 6, # 'т' + 243: 14, # 'у' + 244: 39, # 'ф' + 245: 26, # 'х' + 246: 28, # 'ц' + 247: 22, # 'ч' + 248: 25, # 'ш' + 249: 29, # 'щ' + 250: 54, # 'ъ' + 251: 18, # 'ы' + 252: 17, # 'ь' + 253: 30, # 'э' + 254: 27, # 'ю' + 255: 16, # 'я' +} + +WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="windows-1251", + language="Russian", + char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) + +IBM855_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # 'ђ' + 129: 192, # 'Ђ' + 130: 193, # 'ѓ' + 131: 194, # 'Ѓ' + 132: 68, # 'ё' + 133: 195, # 'Ё' + 134: 196, # 'є' + 135: 197, # 'Є' + 136: 198, # 'ѕ' + 137: 199, # 'Ѕ' + 138: 200, # 'і' + 139: 201, # 'І' + 140: 202, # 'ї' + 141: 203, # 'Ї' + 142: 204, # 'ј' + 143: 205, # 'Ј' + 144: 206, # 'љ' + 145: 207, # 'Љ' + 146: 208, # 'њ' + 147: 209, # 'Њ' + 148: 210, # 'ћ' + 149: 211, # 'Ћ' + 150: 212, # 'ќ' + 151: 213, # 'Ќ' + 152: 214, # 'ў' + 153: 215, # 'Ў' + 154: 216, # 'џ' + 155: 217, # 'Џ' + 156: 27, # 'ю' + 157: 59, # 'Ю' + 158: 54, # 'ъ' + 159: 70, # 'Ъ' + 160: 3, # 'а' + 161: 37, # 'А' + 162: 21, # 'б' + 163: 44, # 'Б' + 164: 28, # 'ц' + 165: 58, # 'Ц' + 166: 13, # 'д' + 167: 41, # 'Д' + 168: 2, # 'е' + 169: 48, # 'Е' + 170: 39, # 'ф' + 171: 53, # 'Ф' + 172: 19, # 'г' + 173: 46, # 'Г' + 174: 218, # '«' + 175: 219, # '»' + 176: 220, # '░' + 177: 221, # '▒' + 178: 222, # '▓' + 179: 223, # '│' + 180: 224, # '┤' + 181: 26, # 'х' + 182: 55, # 'Х' + 183: 4, # 'и' + 184: 42, # 'И' + 185: 225, # '╣' + 186: 226, # '║' + 187: 227, # '╗' + 188: 228, # '╝' + 189: 23, # 'й' + 190: 60, # 'Й' + 191: 229, # '┐' + 192: 230, # '└' + 193: 231, # '┴' + 194: 232, # '┬' + 195: 233, # '├' + 196: 234, # '─' + 197: 235, # '┼' + 198: 11, # 'к' + 199: 36, # 'К' + 200: 236, # '╚' + 201: 237, # '╔' + 202: 238, # '╩' + 203: 239, # '╦' + 204: 240, # '╠' + 205: 241, # '═' + 206: 242, # '╬' + 207: 243, # '¤' + 208: 8, # 'л' + 209: 49, # 'Л' + 210: 12, # 'м' + 211: 38, # 'М' + 212: 5, # 'н' + 213: 31, # 'Н' + 214: 1, # 'о' + 215: 34, # 'О' + 216: 15, # 'п' + 217: 244, # '┘' + 218: 245, # '┌' + 219: 246, # '█' + 220: 247, # '▄' + 221: 35, # 'П' + 222: 16, # 'я' + 223: 248, # '▀' + 224: 43, # 'Я' + 225: 9, # 'р' + 226: 45, # 'Р' + 227: 7, # 'с' + 228: 32, # 'С' + 229: 6, # 'т' + 230: 40, # 'Т' + 231: 14, # 'у' + 232: 52, # 'У' + 233: 24, # 'ж' + 234: 56, # 'Ж' + 235: 10, # 'в' + 236: 33, # 'В' + 237: 17, # 'ь' + 238: 61, # 'Ь' + 239: 249, # '№' + 240: 250, # '\xad' + 241: 18, # 'ы' + 242: 62, # 'Ы' + 243: 20, # 'з' + 244: 51, # 'З' + 245: 25, # 'ш' + 246: 57, # 'Ш' + 247: 30, # 'э' + 248: 47, # 'Э' + 249: 29, # 'щ' + 250: 63, # 'Щ' + 251: 22, # 'ч' + 252: 50, # 'Ч' + 253: 251, # '§' + 254: 252, # '■' + 255: 255, # '\xa0' +} + +IBM855_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="IBM855", + language="Russian", + char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) + +KOI8_R_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # '─' + 129: 192, # '│' + 130: 193, # '┌' + 131: 194, # '┐' + 132: 195, # '└' + 133: 196, # '┘' + 134: 197, # '├' + 135: 198, # '┤' + 136: 199, # '┬' + 137: 200, # '┴' + 138: 201, # '┼' + 139: 202, # '▀' + 140: 203, # '▄' + 141: 204, # '█' + 142: 205, # '▌' + 143: 206, # '▐' + 144: 207, # '░' + 145: 208, # '▒' + 146: 209, # '▓' + 147: 210, # '⌠' + 148: 211, # '■' + 149: 212, # '∙' + 150: 213, # '√' + 151: 214, # '≈' + 152: 215, # '≤' + 153: 216, # '≥' + 154: 217, # '\xa0' + 155: 218, # '⌡' + 156: 219, # '°' + 157: 220, # '²' + 158: 221, # '·' + 159: 222, # '÷' + 160: 223, # '═' + 161: 224, # '║' + 162: 225, # '╒' + 163: 68, # 'ё' + 164: 226, # '╓' + 165: 227, # '╔' + 166: 228, # '╕' + 167: 229, # '╖' + 168: 230, # '╗' + 169: 231, # '╘' + 170: 232, # '╙' + 171: 233, # '╚' + 172: 234, # '╛' + 173: 235, # '╜' + 174: 236, # '╝' + 175: 237, # '╞' + 176: 238, # '╟' + 177: 239, # '╠' + 178: 240, # '╡' + 179: 241, # 'Ё' + 180: 242, # '╢' + 181: 243, # '╣' + 182: 244, # '╤' + 183: 245, # '╥' + 184: 246, # '╦' + 185: 247, # '╧' + 186: 248, # '╨' + 187: 249, # '╩' + 188: 250, # '╪' + 189: 251, # '╫' + 190: 252, # '╬' + 191: 253, # '©' + 192: 27, # 'ю' + 193: 3, # 'а' + 194: 21, # 'б' + 195: 28, # 'ц' + 196: 13, # 'д' + 197: 2, # 'е' + 198: 39, # 'ф' + 199: 19, # 'г' + 200: 26, # 'х' + 201: 4, # 'и' + 202: 23, # 'й' + 203: 11, # 'к' + 204: 8, # 'л' + 205: 12, # 'м' + 206: 5, # 'н' + 207: 1, # 'о' + 208: 15, # 'п' + 209: 16, # 'я' + 210: 9, # 'р' + 211: 7, # 'с' + 212: 6, # 'т' + 213: 14, # 'у' + 214: 24, # 'ж' + 215: 10, # 'в' + 216: 17, # 'ь' + 217: 18, # 'ы' + 218: 20, # 'з' + 219: 25, # 'ш' + 220: 30, # 'э' + 221: 29, # 'щ' + 222: 22, # 'ч' + 223: 54, # 'ъ' + 224: 59, # 'Ю' + 225: 37, # 'А' + 226: 44, # 'Б' + 227: 58, # 'Ц' + 228: 41, # 'Д' + 229: 48, # 'Е' + 230: 53, # 'Ф' + 231: 46, # 'Г' + 232: 55, # 'Х' + 233: 42, # 'И' + 234: 60, # 'Й' + 235: 36, # 'К' + 236: 49, # 'Л' + 237: 38, # 'М' + 238: 31, # 'Н' + 239: 34, # 'О' + 240: 35, # 'П' + 241: 43, # 'Я' + 242: 45, # 'Р' + 243: 32, # 'С' + 244: 40, # 'Т' + 245: 52, # 'У' + 246: 56, # 'Ж' + 247: 33, # 'В' + 248: 61, # 'Ь' + 249: 62, # 'Ы' + 250: 51, # 'З' + 251: 57, # 'Ш' + 252: 47, # 'Э' + 253: 63, # 'Щ' + 254: 50, # 'Ч' + 255: 70, # 'Ъ' +} + +KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="KOI8-R", + language="Russian", + char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) + +MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 37, # 'А' + 129: 44, # 'Б' + 130: 33, # 'В' + 131: 46, # 'Г' + 132: 41, # 'Д' + 133: 48, # 'Е' + 134: 56, # 'Ж' + 135: 51, # 'З' + 136: 42, # 'И' + 137: 60, # 'Й' + 138: 36, # 'К' + 139: 49, # 'Л' + 140: 38, # 'М' + 141: 31, # 'Н' + 142: 34, # 'О' + 143: 35, # 'П' + 144: 45, # 'Р' + 145: 32, # 'С' + 146: 40, # 'Т' + 147: 52, # 'У' + 148: 53, # 'Ф' + 149: 55, # 'Х' + 150: 58, # 'Ц' + 151: 50, # 'Ч' + 152: 57, # 'Ш' + 153: 63, # 'Щ' + 154: 70, # 'Ъ' + 155: 62, # 'Ы' + 156: 61, # 'Ь' + 157: 47, # 'Э' + 158: 59, # 'Ю' + 159: 43, # 'Я' + 160: 191, # '†' + 161: 192, # '°' + 162: 193, # 'Ґ' + 163: 194, # '£' + 164: 195, # '§' + 165: 196, # '•' + 166: 197, # '¶' + 167: 198, # 'І' + 168: 199, # '®' + 169: 200, # '©' + 170: 201, # '™' + 171: 202, # 'Ђ' + 172: 203, # 'ђ' + 173: 204, # '≠' + 174: 205, # 'Ѓ' + 175: 206, # 'ѓ' + 176: 207, # '∞' + 177: 208, # '±' + 178: 209, # '≤' + 179: 210, # '≥' + 180: 211, # 'і' + 181: 212, # 'µ' + 182: 213, # 'ґ' + 183: 214, # 'Ј' + 184: 215, # 'Є' + 185: 216, # 'є' + 186: 217, # 'Ї' + 187: 218, # 'ї' + 188: 219, # 'Љ' + 189: 220, # 'љ' + 190: 221, # 'Њ' + 191: 222, # 'њ' + 192: 223, # 'ј' + 193: 224, # 'Ѕ' + 194: 225, # '¬' + 195: 226, # '√' + 196: 227, # 'ƒ' + 197: 228, # '≈' + 198: 229, # '∆' + 199: 230, # '«' + 200: 231, # '»' + 201: 232, # '…' + 202: 233, # '\xa0' + 203: 234, # 'Ћ' + 204: 235, # 'ћ' + 205: 236, # 'Ќ' + 206: 237, # 'ќ' + 207: 238, # 'ѕ' + 208: 239, # '–' + 209: 240, # '—' + 210: 241, # '“' + 211: 242, # '”' + 212: 243, # '‘' + 213: 244, # '’' + 214: 245, # '÷' + 215: 246, # '„' + 216: 247, # 'Ў' + 217: 248, # 'ў' + 218: 249, # 'Џ' + 219: 250, # 'џ' + 220: 251, # '№' + 221: 252, # 'Ё' + 222: 68, # 'ё' + 223: 16, # 'я' + 224: 3, # 'а' + 225: 21, # 'б' + 226: 10, # 'в' + 227: 19, # 'г' + 228: 13, # 'д' + 229: 2, # 'е' + 230: 24, # 'ж' + 231: 20, # 'з' + 232: 4, # 'и' + 233: 23, # 'й' + 234: 11, # 'к' + 235: 8, # 'л' + 236: 12, # 'м' + 237: 5, # 'н' + 238: 1, # 'о' + 239: 15, # 'п' + 240: 9, # 'р' + 241: 7, # 'с' + 242: 6, # 'т' + 243: 14, # 'у' + 244: 39, # 'ф' + 245: 26, # 'х' + 246: 28, # 'ц' + 247: 22, # 'ч' + 248: 25, # 'ш' + 249: 29, # 'щ' + 250: 54, # 'ъ' + 251: 18, # 'ы' + 252: 17, # 'ь' + 253: 30, # 'э' + 254: 27, # 'ю' + 255: 255, # '€' +} + +MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="MacCyrillic", + language="Russian", + char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) + +ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # '\x80' + 129: 192, # '\x81' + 130: 193, # '\x82' + 131: 194, # '\x83' + 132: 195, # '\x84' + 133: 196, # '\x85' + 134: 197, # '\x86' + 135: 198, # '\x87' + 136: 199, # '\x88' + 137: 200, # '\x89' + 138: 201, # '\x8a' + 139: 202, # '\x8b' + 140: 203, # '\x8c' + 141: 204, # '\x8d' + 142: 205, # '\x8e' + 143: 206, # '\x8f' + 144: 207, # '\x90' + 145: 208, # '\x91' + 146: 209, # '\x92' + 147: 210, # '\x93' + 148: 211, # '\x94' + 149: 212, # '\x95' + 150: 213, # '\x96' + 151: 214, # '\x97' + 152: 215, # '\x98' + 153: 216, # '\x99' + 154: 217, # '\x9a' + 155: 218, # '\x9b' + 156: 219, # '\x9c' + 157: 220, # '\x9d' + 158: 221, # '\x9e' + 159: 222, # '\x9f' + 160: 223, # '\xa0' + 161: 224, # 'Ё' + 162: 225, # 'Ђ' + 163: 226, # 'Ѓ' + 164: 227, # 'Є' + 165: 228, # 'Ѕ' + 166: 229, # 'І' + 167: 230, # 'Ї' + 168: 231, # 'Ј' + 169: 232, # 'Љ' + 170: 233, # 'Њ' + 171: 234, # 'Ћ' + 172: 235, # 'Ќ' + 173: 236, # '\xad' + 174: 237, # 'Ў' + 175: 238, # 'Џ' + 176: 37, # 'А' + 177: 44, # 'Б' + 178: 33, # 'В' + 179: 46, # 'Г' + 180: 41, # 'Д' + 181: 48, # 'Е' + 182: 56, # 'Ж' + 183: 51, # 'З' + 184: 42, # 'И' + 185: 60, # 'Й' + 186: 36, # 'К' + 187: 49, # 'Л' + 188: 38, # 'М' + 189: 31, # 'Н' + 190: 34, # 'О' + 191: 35, # 'П' + 192: 45, # 'Р' + 193: 32, # 'С' + 194: 40, # 'Т' + 195: 52, # 'У' + 196: 53, # 'Ф' + 197: 55, # 'Х' + 198: 58, # 'Ц' + 199: 50, # 'Ч' + 200: 57, # 'Ш' + 201: 63, # 'Щ' + 202: 70, # 'Ъ' + 203: 62, # 'Ы' + 204: 61, # 'Ь' + 205: 47, # 'Э' + 206: 59, # 'Ю' + 207: 43, # 'Я' + 208: 3, # 'а' + 209: 21, # 'б' + 210: 10, # 'в' + 211: 19, # 'г' + 212: 13, # 'д' + 213: 2, # 'е' + 214: 24, # 'ж' + 215: 20, # 'з' + 216: 4, # 'и' + 217: 23, # 'й' + 218: 11, # 'к' + 219: 8, # 'л' + 220: 12, # 'м' + 221: 5, # 'н' + 222: 1, # 'о' + 223: 15, # 'п' + 224: 9, # 'р' + 225: 7, # 'с' + 226: 6, # 'т' + 227: 14, # 'у' + 228: 39, # 'ф' + 229: 26, # 'х' + 230: 28, # 'ц' + 231: 22, # 'ч' + 232: 25, # 'ш' + 233: 29, # 'щ' + 234: 54, # 'ъ' + 235: 18, # 'ы' + 236: 17, # 'ь' + 237: 30, # 'э' + 238: 27, # 'ю' + 239: 16, # 'я' + 240: 239, # '№' + 241: 68, # 'ё' + 242: 240, # 'ђ' + 243: 241, # 'ѓ' + 244: 242, # 'є' + 245: 243, # 'ѕ' + 246: 244, # 'і' + 247: 245, # 'ї' + 248: 246, # 'ј' + 249: 247, # 'љ' + 250: 248, # 'њ' + 251: 249, # 'ћ' + 252: 250, # 'ќ' + 253: 251, # '§' + 254: 252, # 'ў' + 255: 255, # 'џ' +} + +ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-5", + language="Russian", + char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..489cad9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,4380 @@ +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +THAI_LANG_MODEL = { + 5: { # 'ก' + 5: 2, # 'ก' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 2, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 3, # 'ฎ' + 57: 2, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 2, # 'ณ' + 20: 2, # 'ด' + 19: 3, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 1, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 1, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 3, # 'ร' + 61: 2, # 'ฤ' + 15: 3, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 3, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 1, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 2, # 'ื' + 32: 2, # 'ุ' + 35: 1, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 3, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 30: { # 'ข' + 5: 1, # 'ก' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 1, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 2, # 'ณ' + 20: 0, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 2, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 2, # 'ี' + 40: 3, # 'ึ' + 27: 1, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 2, # '่' + 7: 3, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 24: { # 'ค' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 2, # 'ค' + 8: 2, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 2, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 0, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 3, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 2, # 'า' + 36: 3, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'แ' + 41: 3, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 8: { # 'ง' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 3, # 'ค' + 8: 2, # 'ง' + 26: 2, # 'จ' + 52: 1, # 'ฉ' + 34: 2, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 1, # 'ฝ' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 2, # 'ศ' + 46: 1, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 1, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 1, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 3, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 26: { # 'จ' + 5: 2, # 'ก' + 30: 1, # 'ข' + 24: 0, # 'ค' + 8: 2, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 1, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 1, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 3, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 2, # 'ิ' + 13: 1, # 'ี' + 40: 3, # 'ึ' + 27: 1, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 2, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 52: { # 'ฉ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 3, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 3, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 1, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 1, # 'ั' + 1: 1, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 34: { # 'ช' + 5: 1, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 1, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 1, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 1, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 1, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 51: { # 'ซ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 1, # 'ั' + 1: 1, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 2, # 'ี' + 40: 3, # 'ึ' + 27: 2, # 'ื' + 32: 1, # 'ุ' + 35: 1, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 1, # '่' + 7: 2, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 47: { # 'ญ' + 5: 1, # 'ก' + 30: 1, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 3, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 2, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 0, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 58: { # 'ฎ' + 5: 2, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 1, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 57: { # 'ฏ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 49: { # 'ฐ' + 5: 1, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 53: { # 'ฑ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 55: { # 'ฒ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 43: { # 'ณ' + 5: 1, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 3, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 3, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 3, # 'ะ' + 10: 0, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 20: { # 'ด' + 5: 2, # 'ก' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 3, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 2, # 'า' + 36: 2, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 1, # 'ึ' + 27: 2, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 2, # 'ๆ' + 37: 2, # '็' + 6: 1, # '่' + 7: 3, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 19: { # 'ต' + 5: 2, # 'ก' + 30: 1, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 1, # 'ต' + 44: 2, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 2, # 'ภ' + 9: 1, # 'ม' + 16: 1, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 0, # 'ห' + 4: 3, # 'อ' + 63: 1, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 1, # 'ึ' + 27: 1, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'แ' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 2, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 44: { # 'ถ' + 5: 1, # 'ก' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 1, # 'ี' + 40: 3, # 'ึ' + 27: 2, # 'ื' + 32: 2, # 'ุ' + 35: 3, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 14: { # 'ท' + 5: 1, # 'ก' + 30: 1, # 'ข' + 24: 3, # 'ค' + 8: 1, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 3, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 3, # 'ย' + 2: 3, # 'ร' + 61: 1, # 'ฤ' + 15: 1, # 'ล' + 12: 2, # 'ว' + 42: 3, # 'ศ' + 46: 1, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 2, # 'ิ' + 13: 3, # 'ี' + 40: 2, # 'ึ' + 27: 1, # 'ื' + 32: 3, # 'ุ' + 35: 1, # 'ู' + 11: 0, # 'เ' + 28: 1, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 48: { # 'ธ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 1, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 2, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 2, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 3: { # 'น' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 3, # 'ค' + 8: 1, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 1, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 2, # 'ถ' + 14: 3, # 'ท' + 48: 3, # 'ธ' + 3: 2, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'ฝ' + 31: 2, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 1, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 1, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 3, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'แ' + 41: 3, # 'โ' + 29: 3, # 'ใ' + 33: 3, # 'ไ' + 50: 2, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 17: { # 'บ' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 1, # 'ง' + 26: 1, # 'จ' + 52: 1, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 2, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 2, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 2, # '่' + 7: 2, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 25: { # 'ป' + 5: 2, # 'ก' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 1, # 'ฎ' + 57: 3, # 'ฏ' + 49: 1, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 0, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 1, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 1, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 3, # 'ั' + 1: 1, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 2, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 3, # '็' + 6: 1, # '่' + 7: 2, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 39: { # 'ผ' + 5: 1, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 1, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 2, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 1, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 1, # 'ื' + 32: 0, # 'ุ' + 35: 3, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 1, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 62: { # 'ฝ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 1, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 1, # 'ี' + 40: 2, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 1, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 31: { # 'พ' + 5: 1, # 'ก' + 30: 1, # 'ข' + 24: 1, # 'ค' + 8: 1, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 1, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 2, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 1, # 'ึ' + 27: 3, # 'ื' + 32: 1, # 'ุ' + 35: 2, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 0, # '่' + 7: 1, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 54: { # 'ฟ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 2, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 2, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 1, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 1, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 2, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 45: { # 'ภ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 3, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 2, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 9: { # 'ม' + 5: 2, # 'ก' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 2, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 3, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 2, # 'ร' + 61: 2, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 1, # 'ศ' + 46: 1, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 3, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'แ' + 41: 2, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 2, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 16: { # 'ย' + 5: 3, # 'ก' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 2, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 3, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 3, # 'ี' + 40: 1, # 'ึ' + 27: 2, # 'ื' + 32: 2, # 'ุ' + 35: 3, # 'ู' + 11: 2, # 'เ' + 28: 1, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 2, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 2, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 2: { # 'ร' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 2, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 3, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 3, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 3, # 'ถ' + 14: 3, # 'ท' + 48: 1, # 'ธ' + 3: 2, # 'น' + 17: 2, # 'บ' + 25: 3, # 'ป' + 39: 2, # 'ผ' + 62: 1, # 'ฝ' + 31: 2, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 2, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 1, # 'ฯ' + 22: 3, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 2, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 3, # 'ู' + 11: 3, # 'เ' + 28: 3, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 3, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 61: { # 'ฤ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 2, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 15: { # 'ล' + 5: 2, # 'ก' + 30: 3, # 'ข' + 24: 1, # 'ค' + 8: 3, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 3, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 3, # 'อ' + 63: 2, # 'ฯ' + 22: 3, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 2, # 'ึ' + 27: 3, # 'ื' + 32: 2, # 'ุ' + 35: 3, # 'ู' + 11: 2, # 'เ' + 28: 1, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 2, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 12: { # 'ว' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 1, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 2, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 42: { # 'ศ' + 5: 1, # 'ก' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 1, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 2, # 'ว' + 42: 1, # 'ศ' + 46: 2, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 0, # 'ี' + 40: 3, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 2, # 'ู' + 11: 0, # 'เ' + 28: 1, # 'แ' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 46: { # 'ษ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 2, # 'ฎ' + 57: 1, # 'ฏ' + 49: 2, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 3, # 'ณ' + 20: 0, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 18: { # 'ส' + 5: 2, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 2, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 3, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 2, # 'ภ' + 9: 3, # 'ม' + 16: 1, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 2, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 3, # 'ู' + 11: 2, # 'เ' + 28: 0, # 'แ' + 41: 1, # 'โ' + 29: 0, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 1, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 21: { # 'ห' + 5: 3, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 1, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 3, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 0, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 1, # 'ุ' + 35: 1, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 3, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 4: { # 'อ' + 5: 3, # 'ก' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 2, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 1, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 1, # '็' + 6: 2, # '่' + 7: 2, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 63: { # 'ฯ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 22: { # 'ะ' + 5: 3, # 'ก' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 1, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 3, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 1, # 'ธ' + 3: 2, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 1, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 10: { # 'ั' + 5: 3, # 'ก' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 3, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 3, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 2, # 'ฐ' + 53: 0, # 'ฑ' + 55: 3, # 'ฒ' + 43: 3, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 1: { # 'า' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 3, # 'ค' + 8: 3, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 3, # 'ช' + 51: 1, # 'ซ' + 47: 2, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 3, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 2, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 1, # 'ฝ' + 31: 3, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 3, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 3, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 36: { # 'ำ' + 5: 2, # 'ก' + 30: 1, # 'ข' + 24: 3, # 'ค' + 8: 2, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 1, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 3, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 23: { # 'ิ' + 5: 3, # 'ก' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 3, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 3, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'ฝ' + 31: 3, # 'พ' + 54: 1, # 'ฟ' + 45: 2, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 3, # 'ศ' + 46: 2, # 'ษ' + 18: 2, # 'ส' + 21: 3, # 'ห' + 4: 1, # 'อ' + 63: 1, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 1, # 'แ' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 2, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 13: { # 'ี' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'ฝ' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 3, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 2, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 40: { # 'ึ' + 5: 3, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 3, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 27: { # 'ื' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 3, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 32: { # 'ุ' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 3, # 'ค' + 8: 3, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 1, # 'ฒ' + 43: 3, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 2, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 1, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 1, # 'ว' + 42: 1, # 'ศ' + 46: 2, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'แ' + 41: 1, # 'โ' + 29: 0, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 2, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 35: { # 'ู' + 5: 3, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 2, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 0, # 'บ' + 25: 3, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'แ' + 41: 1, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 11: { # 'เ' + 5: 3, # 'ก' + 30: 3, # 'ข' + 24: 3, # 'ค' + 8: 2, # 'ง' + 26: 3, # 'จ' + 52: 3, # 'ฉ' + 34: 3, # 'ช' + 51: 2, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 3, # 'ป' + 39: 2, # 'ผ' + 62: 1, # 'ฝ' + 31: 3, # 'พ' + 54: 1, # 'ฟ' + 45: 3, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 28: { # 'แ' + 5: 3, # 'ก' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 1, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 3, # 'ต' + 44: 2, # 'ถ' + 14: 3, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 3, # 'ผ' + 62: 0, # 'ฝ' + 31: 2, # 'พ' + 54: 2, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 41: { # 'โ' + 5: 2, # 'ก' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 1, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 1, # 'บ' + 25: 3, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 0, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 29: { # 'ใ' + 5: 2, # 'ก' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 3, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 1, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 33: { # 'ไ' + 5: 1, # 'ก' + 30: 2, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 3, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 1, # 'บ' + 25: 3, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 2, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 0, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 3, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 2, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 50: { # 'ๆ' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 37: { # '็' + 5: 2, # 'ก' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 2, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 1, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 6: { # '่' + 5: 2, # 'ก' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 1, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 1, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 1, # 'ฝ' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 0, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 7: { # '้' + 5: 2, # 'ก' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 3, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 38: { # '์' + 5: 2, # 'ก' + 30: 1, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 1, # 'ฤ' + 15: 1, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'แ' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 56: { # '๑' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 2, # '๑' + 59: 1, # '๒' + 60: 1, # '๕' + }, + 59: { # '๒' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 1, # '๑' + 59: 1, # '๒' + 60: 3, # '๕' + }, + 60: { # '๕' + 5: 0, # 'ก' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'ญ' + 58: 0, # 'ฎ' + 57: 0, # 'ฏ' + 49: 0, # 'ฐ' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'ฝ' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'แ' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 2, # '๑' + 59: 1, # '๒' + 60: 0, # '๕' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +TIS_620_THAI_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 182, # 'A' + 66: 106, # 'B' + 67: 107, # 'C' + 68: 100, # 'D' + 69: 183, # 'E' + 70: 184, # 'F' + 71: 185, # 'G' + 72: 101, # 'H' + 73: 94, # 'I' + 74: 186, # 'J' + 75: 187, # 'K' + 76: 108, # 'L' + 77: 109, # 'M' + 78: 110, # 'N' + 79: 111, # 'O' + 80: 188, # 'P' + 81: 189, # 'Q' + 82: 190, # 'R' + 83: 89, # 'S' + 84: 95, # 'T' + 85: 112, # 'U' + 86: 113, # 'V' + 87: 191, # 'W' + 88: 192, # 'X' + 89: 193, # 'Y' + 90: 194, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 64, # 'a' + 98: 72, # 'b' + 99: 73, # 'c' + 100: 114, # 'd' + 101: 74, # 'e' + 102: 115, # 'f' + 103: 116, # 'g' + 104: 102, # 'h' + 105: 81, # 'i' + 106: 201, # 'j' + 107: 117, # 'k' + 108: 90, # 'l' + 109: 103, # 'm' + 110: 78, # 'n' + 111: 82, # 'o' + 112: 96, # 'p' + 113: 202, # 'q' + 114: 91, # 'r' + 115: 79, # 's' + 116: 84, # 't' + 117: 104, # 'u' + 118: 105, # 'v' + 119: 97, # 'w' + 120: 98, # 'x' + 121: 92, # 'y' + 122: 203, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 209, # '\x80' + 129: 210, # '\x81' + 130: 211, # '\x82' + 131: 212, # '\x83' + 132: 213, # '\x84' + 133: 88, # '\x85' + 134: 214, # '\x86' + 135: 215, # '\x87' + 136: 216, # '\x88' + 137: 217, # '\x89' + 138: 218, # '\x8a' + 139: 219, # '\x8b' + 140: 220, # '\x8c' + 141: 118, # '\x8d' + 142: 221, # '\x8e' + 143: 222, # '\x8f' + 144: 223, # '\x90' + 145: 224, # '\x91' + 146: 99, # '\x92' + 147: 85, # '\x93' + 148: 83, # '\x94' + 149: 225, # '\x95' + 150: 226, # '\x96' + 151: 227, # '\x97' + 152: 228, # '\x98' + 153: 229, # '\x99' + 154: 230, # '\x9a' + 155: 231, # '\x9b' + 156: 232, # '\x9c' + 157: 233, # '\x9d' + 158: 234, # '\x9e' + 159: 235, # '\x9f' + 160: 236, # None + 161: 5, # 'ก' + 162: 30, # 'ข' + 163: 237, # 'ฃ' + 164: 24, # 'ค' + 165: 238, # 'ฅ' + 166: 75, # 'ฆ' + 167: 8, # 'ง' + 168: 26, # 'จ' + 169: 52, # 'ฉ' + 170: 34, # 'ช' + 171: 51, # 'ซ' + 172: 119, # 'ฌ' + 173: 47, # 'ญ' + 174: 58, # 'ฎ' + 175: 57, # 'ฏ' + 176: 49, # 'ฐ' + 177: 53, # 'ฑ' + 178: 55, # 'ฒ' + 179: 43, # 'ณ' + 180: 20, # 'ด' + 181: 19, # 'ต' + 182: 44, # 'ถ' + 183: 14, # 'ท' + 184: 48, # 'ธ' + 185: 3, # 'น' + 186: 17, # 'บ' + 187: 25, # 'ป' + 188: 39, # 'ผ' + 189: 62, # 'ฝ' + 190: 31, # 'พ' + 191: 54, # 'ฟ' + 192: 45, # 'ภ' + 193: 9, # 'ม' + 194: 16, # 'ย' + 195: 2, # 'ร' + 196: 61, # 'ฤ' + 197: 15, # 'ล' + 198: 239, # 'ฦ' + 199: 12, # 'ว' + 200: 42, # 'ศ' + 201: 46, # 'ษ' + 202: 18, # 'ส' + 203: 21, # 'ห' + 204: 76, # 'ฬ' + 205: 4, # 'อ' + 206: 66, # 'ฮ' + 207: 63, # 'ฯ' + 208: 22, # 'ะ' + 209: 10, # 'ั' + 210: 1, # 'า' + 211: 36, # 'ำ' + 212: 23, # 'ิ' + 213: 13, # 'ี' + 214: 40, # 'ึ' + 215: 27, # 'ื' + 216: 32, # 'ุ' + 217: 35, # 'ู' + 218: 86, # 'ฺ' + 219: 240, # None + 220: 241, # None + 221: 242, # None + 222: 243, # None + 223: 244, # '฿' + 224: 11, # 'เ' + 225: 28, # 'แ' + 226: 41, # 'โ' + 227: 29, # 'ใ' + 228: 33, # 'ไ' + 229: 245, # 'ๅ' + 230: 50, # 'ๆ' + 231: 37, # '็' + 232: 6, # '่' + 233: 7, # '้' + 234: 67, # '๊' + 235: 77, # '๋' + 236: 38, # '์' + 237: 93, # 'ํ' + 238: 246, # '๎' + 239: 247, # '๏' + 240: 68, # '๐' + 241: 56, # '๑' + 242: 59, # '๒' + 243: 65, # '๓' + 244: 69, # '๔' + 245: 60, # '๕' + 246: 70, # '๖' + 247: 80, # '๗' + 248: 71, # '๘' + 249: 87, # '๙' + 250: 248, # '๚' + 251: 249, # '๛' + 252: 250, # None + 253: 251, # None + 254: 252, # None + 255: 253, # None +} + +TIS_620_THAI_MODEL = SingleByteCharSetModel( + charset_name="TIS-620", + language="Thai", + char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER, + language_model=THAI_LANG_MODEL, + typical_positive_ratio=0.926386, + keep_ascii_letters=False, + alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛", +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..291857c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,4380 @@ +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +TURKISH_LANG_MODEL = { + 23: { # 'A' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 1, # 'i' + 24: 0, # 'j' + 10: 2, # 'k' + 5: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 37: { # 'B' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 2, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 1, # 'Ş' + 19: 1, # 'ş' + }, + 47: { # 'C' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 1, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 2, # 'l' + 13: 2, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 2, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 39: { # 'D' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 1, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 1, # 'Ş' + 19: 0, # 'ş' + }, + 29: { # 'E' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 1, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 1, # 'j' + 10: 0, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 1, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 52: { # 'F' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 1, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 2, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 1, # 'b' + 28: 1, # 'c' + 12: 1, # 'd' + 2: 0, # 'e' + 18: 1, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 1, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 2, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 2, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 2, # 'ş' + }, + 36: { # 'G' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 2, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 2, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 1, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 1, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 0, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 1, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 2, # 'Ş' + 19: 1, # 'ş' + }, + 45: { # 'H' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 2, # 'G' + 45: 1, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 1, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 2, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 1, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 2, # 'ğ' + 41: 1, # 'İ' + 6: 0, # 'ı' + 40: 2, # 'Ş' + 19: 1, # 'ş' + }, + 53: { # 'I' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 2, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 1, # 'Ş' + 19: 1, # 'ş' + }, + 60: { # 'J' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 0, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 1, # 's' + 9: 0, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 16: { # 'K' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 1, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 0, # 'u' + 32: 3, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ğ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 49: { # 'L' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 2, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 2, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 0, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 1, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 2, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 1, # 'ü' + 30: 1, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 20: { # 'M' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 2, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 0, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 46: { # 'N' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 1, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 1, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 1, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 1, # 'Ş' + 19: 1, # 'ş' + }, + 42: { # 'O' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 1, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 2, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 2, # 'İ' + 6: 1, # 'ı' + 40: 1, # 'Ş' + 19: 1, # 'ş' + }, + 48: { # 'P' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 2, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 1, # 'İ' + 6: 0, # 'ı' + 40: 2, # 'Ş' + 19: 1, # 'ş' + }, + 44: { # 'R' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 1, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 2, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 1, # 'ü' + 30: 1, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 1, # 'Ş' + 19: 1, # 'ş' + }, + 35: { # 'S' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 1, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 1, # 'l' + 13: 2, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 1, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 2, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 2, # 'Ş' + 19: 1, # 'ş' + }, + 31: { # 'T' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 2, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 1, # 'j' + 10: 2, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 2, # 'r' + 8: 0, # 's' + 9: 2, # 't' + 14: 2, # 'u' + 32: 1, # 'v' + 57: 1, # 'w' + 58: 1, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 51: { # 'U' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 1, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 1, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 38: { # 'V' + 23: 1, # 'A' + 37: 1, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 2, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 1, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 1, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 2, # 'Ş' + 19: 1, # 'ş' + }, + 62: { # 'W' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 0, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 43: { # 'Y' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 1, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 2, # 'N' + 42: 0, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 1, # 'j' + 10: 1, # 'k' + 5: 1, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 1, # 'Ü' + 59: 1, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 1, # 'İ' + 6: 0, # 'ı' + 40: 2, # 'Ş' + 19: 1, # 'ş' + }, + 56: { # 'Z' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 2, # 'Z' + 1: 2, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 1, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 1, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 1: { # 'a' + 23: 3, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 2, # 'Z' + 1: 2, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 2, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 3, # 'v' + 57: 2, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 1, # 'î' + 34: 1, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 21: { # 'b' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 3, # 'g' + 25: 1, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 1, # 'r' + 8: 2, # 's' + 9: 2, # 't' + 14: 2, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 28: { # 'c' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 2, # 'E' + 52: 0, # 'F' + 36: 2, # 'G' + 45: 2, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 2, # 'T' + 51: 2, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 3, # 'Y' + 56: 0, # 'Z' + 1: 1, # 'a' + 21: 1, # 'b' + 28: 2, # 'c' + 12: 2, # 'd' + 2: 1, # 'e' + 18: 1, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 1, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 2, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 1, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 1, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 1, # 'î' + 34: 2, # 'ö' + 17: 2, # 'ü' + 30: 2, # 'ğ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 2, # 'ş' + }, + 12: { # 'd' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 2, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 1, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 2, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 1, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 2: { # 'e' + 23: 2, # 'A' + 37: 0, # 'B' + 47: 2, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 2, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 3, # 'v' + 57: 2, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 1, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 18: { # 'f' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 1, # 'i' + 24: 1, # 'j' + 10: 1, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 1, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 1, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 27: { # 'g' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 2, # 'r' + 8: 2, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 25: { # 'h' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 3: { # 'i' + 23: 2, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 1, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 3, # 'g' + 25: 1, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 1, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 1, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 1, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ğ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 24: { # 'j' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 1, # 'j' + 10: 2, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 2, # 'r' + 8: 3, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 10: { # 'k' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 1, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 2, # 'r' + 8: 2, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 3, # 'ü' + 30: 1, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 5: { # 'l' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 1, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 1, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 2, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 13: { # 'm' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 2, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 2, # 'u' + 32: 2, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 4: { # 'n' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 2, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 1, # 'f' + 27: 2, # 'g' + 25: 3, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 3, # 'p' + 7: 2, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 15: { # 'o' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 2, # 'L' + 20: 0, # 'M' + 46: 2, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 2, # 'ğ' + 41: 2, # 'İ' + 6: 3, # 'ı' + 40: 2, # 'Ş' + 19: 2, # 'ş' + }, + 26: { # 'p' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 1, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 2, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 7: { # 'r' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 2, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 1, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 3, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 8: { # 's' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 2, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 9: { # 't' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 3, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 14: { # 'u' + 23: 3, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 2, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 2, # 'Z' + 1: 2, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 2, # 'e' + 18: 2, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 2, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 1, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 32: { # 'v' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 1, # 'j' + 10: 1, # 'k' + 5: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 1, # 'r' + 8: 2, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 57: { # 'w' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 1, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 1, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 1, # 's' + 9: 0, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 2, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 58: { # 'x' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 1, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 1, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 2, # 's' + 9: 1, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 11: { # 'y' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 1, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 2, # 'r' + 8: 1, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 22: { # 'z' + 23: 2, # 'A' + 37: 2, # 'B' + 47: 1, # 'C' + 39: 2, # 'D' + 29: 3, # 'E' + 52: 1, # 'F' + 36: 2, # 'G' + 45: 2, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 2, # 'N' + 42: 2, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 3, # 'T' + 51: 2, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 1, # 'Z' + 1: 1, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 2, # 'd' + 2: 2, # 'e' + 18: 3, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 2, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 0, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 2, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 2, # 'Ü' + 59: 1, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 2, # 'ü' + 30: 2, # 'ğ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 1, # 'Ş' + 19: 2, # 'ş' + }, + 63: { # '·' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 1, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 54: { # 'Ç' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 0, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 0, # 'h' + 3: 3, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 2, # 'r' + 8: 0, # 's' + 9: 1, # 't' + 14: 0, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 2, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 50: { # 'Ö' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 2, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 2, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 1, # 'N' + 42: 2, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 2, # 'd' + 2: 0, # 'e' + 18: 1, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 0, # 'j' + 10: 2, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 3, # 'n' + 15: 2, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 1, # 's' + 9: 2, # 't' + 14: 0, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 2, # 'ü' + 30: 1, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 55: { # 'Ü' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 1, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 1, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 59: { # 'â' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 1, # 'Ş' + 19: 0, # 'ş' + }, + 33: { # 'ç' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 0, # 'e' + 18: 2, # 'f' + 27: 1, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 0, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 2, # 's' + 9: 3, # 't' + 14: 0, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 61: { # 'î' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 1, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 1, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 34: { # 'ö' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 1, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 2, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 1, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 3, # 's' + 9: 1, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 2, # 'ğ' + 41: 1, # 'İ' + 6: 1, # 'ı' + 40: 2, # 'Ş' + 19: 1, # 'ş' + }, + 17: { # 'ü' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 1, # 'f' + 27: 2, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 1, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 2, # 'r' + 8: 3, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 1, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 30: { # 'ğ' + 23: 0, # 'A' + 37: 2, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 2, # 'N' + 42: 2, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 3, # 'j' + 10: 1, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 2, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 2, # 'İ' + 6: 2, # 'ı' + 40: 2, # 'Ş' + 19: 1, # 'ş' + }, + 41: { # 'İ' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 1, # 'E' + 52: 0, # 'F' + 36: 2, # 'G' + 45: 2, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 1, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 2, # 'd' + 2: 1, # 'e' + 18: 0, # 'f' + 27: 3, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 2, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 2, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 1, # 'Ü' + 59: 1, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 1, # 'ü' + 30: 2, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 1, # 'ş' + }, + 6: { # 'ı' + 23: 2, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 2, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 3, # 'v' + 57: 1, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ğ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Ş' + 19: 0, # 'ş' + }, + 40: { # 'Ş' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 1, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 2, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 2, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 1, # 'Z' + 1: 0, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 0, # 'e' + 18: 3, # 'f' + 27: 0, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 3, # 'r' + 8: 2, # 's' + 9: 2, # 't' + 14: 1, # 'u' + 32: 3, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 1, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 1, # 'ü' + 30: 2, # 'ğ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 1, # 'Ş' + 19: 2, # 'ş' + }, + 19: { # 'ş' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 2, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 1, # 'h' + 3: 1, # 'i' + 24: 0, # 'j' + 10: 2, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 1, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ğ' + 41: 1, # 'İ' + 6: 1, # 'ı' + 40: 1, # 'Ş' + 19: 1, # 'ş' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +ISO_8859_9_TURKISH_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 255, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 255, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 255, # ' ' + 33: 255, # '!' + 34: 255, # '"' + 35: 255, # '#' + 36: 255, # '$' + 37: 255, # '%' + 38: 255, # '&' + 39: 255, # "'" + 40: 255, # '(' + 41: 255, # ')' + 42: 255, # '*' + 43: 255, # '+' + 44: 255, # ',' + 45: 255, # '-' + 46: 255, # '.' + 47: 255, # '/' + 48: 255, # '0' + 49: 255, # '1' + 50: 255, # '2' + 51: 255, # '3' + 52: 255, # '4' + 53: 255, # '5' + 54: 255, # '6' + 55: 255, # '7' + 56: 255, # '8' + 57: 255, # '9' + 58: 255, # ':' + 59: 255, # ';' + 60: 255, # '<' + 61: 255, # '=' + 62: 255, # '>' + 63: 255, # '?' + 64: 255, # '@' + 65: 23, # 'A' + 66: 37, # 'B' + 67: 47, # 'C' + 68: 39, # 'D' + 69: 29, # 'E' + 70: 52, # 'F' + 71: 36, # 'G' + 72: 45, # 'H' + 73: 53, # 'I' + 74: 60, # 'J' + 75: 16, # 'K' + 76: 49, # 'L' + 77: 20, # 'M' + 78: 46, # 'N' + 79: 42, # 'O' + 80: 48, # 'P' + 81: 69, # 'Q' + 82: 44, # 'R' + 83: 35, # 'S' + 84: 31, # 'T' + 85: 51, # 'U' + 86: 38, # 'V' + 87: 62, # 'W' + 88: 65, # 'X' + 89: 43, # 'Y' + 90: 56, # 'Z' + 91: 255, # '[' + 92: 255, # '\\' + 93: 255, # ']' + 94: 255, # '^' + 95: 255, # '_' + 96: 255, # '`' + 97: 1, # 'a' + 98: 21, # 'b' + 99: 28, # 'c' + 100: 12, # 'd' + 101: 2, # 'e' + 102: 18, # 'f' + 103: 27, # 'g' + 104: 25, # 'h' + 105: 3, # 'i' + 106: 24, # 'j' + 107: 10, # 'k' + 108: 5, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 15, # 'o' + 112: 26, # 'p' + 113: 64, # 'q' + 114: 7, # 'r' + 115: 8, # 's' + 116: 9, # 't' + 117: 14, # 'u' + 118: 32, # 'v' + 119: 57, # 'w' + 120: 58, # 'x' + 121: 11, # 'y' + 122: 22, # 'z' + 123: 255, # '{' + 124: 255, # '|' + 125: 255, # '}' + 126: 255, # '~' + 127: 255, # '\x7f' + 128: 180, # '\x80' + 129: 179, # '\x81' + 130: 178, # '\x82' + 131: 177, # '\x83' + 132: 176, # '\x84' + 133: 175, # '\x85' + 134: 174, # '\x86' + 135: 173, # '\x87' + 136: 172, # '\x88' + 137: 171, # '\x89' + 138: 170, # '\x8a' + 139: 169, # '\x8b' + 140: 168, # '\x8c' + 141: 167, # '\x8d' + 142: 166, # '\x8e' + 143: 165, # '\x8f' + 144: 164, # '\x90' + 145: 163, # '\x91' + 146: 162, # '\x92' + 147: 161, # '\x93' + 148: 160, # '\x94' + 149: 159, # '\x95' + 150: 101, # '\x96' + 151: 158, # '\x97' + 152: 157, # '\x98' + 153: 156, # '\x99' + 154: 155, # '\x9a' + 155: 154, # '\x9b' + 156: 153, # '\x9c' + 157: 152, # '\x9d' + 158: 151, # '\x9e' + 159: 106, # '\x9f' + 160: 150, # '\xa0' + 161: 149, # '¡' + 162: 148, # '¢' + 163: 147, # '£' + 164: 146, # '¤' + 165: 145, # '¥' + 166: 144, # '¦' + 167: 100, # '§' + 168: 143, # '¨' + 169: 142, # '©' + 170: 141, # 'ª' + 171: 140, # '«' + 172: 139, # '¬' + 173: 138, # '\xad' + 174: 137, # '®' + 175: 136, # '¯' + 176: 94, # '°' + 177: 80, # '±' + 178: 93, # '²' + 179: 135, # '³' + 180: 105, # '´' + 181: 134, # 'µ' + 182: 133, # '¶' + 183: 63, # '·' + 184: 132, # '¸' + 185: 131, # '¹' + 186: 130, # 'º' + 187: 129, # '»' + 188: 128, # '¼' + 189: 127, # '½' + 190: 126, # '¾' + 191: 125, # '¿' + 192: 124, # 'À' + 193: 104, # 'Á' + 194: 73, # 'Â' + 195: 99, # 'Ã' + 196: 79, # 'Ä' + 197: 85, # 'Å' + 198: 123, # 'Æ' + 199: 54, # 'Ç' + 200: 122, # 'È' + 201: 98, # 'É' + 202: 92, # 'Ê' + 203: 121, # 'Ë' + 204: 120, # 'Ì' + 205: 91, # 'Í' + 206: 103, # 'Î' + 207: 119, # 'Ï' + 208: 68, # 'Ğ' + 209: 118, # 'Ñ' + 210: 117, # 'Ò' + 211: 97, # 'Ó' + 212: 116, # 'Ô' + 213: 115, # 'Õ' + 214: 50, # 'Ö' + 215: 90, # '×' + 216: 114, # 'Ø' + 217: 113, # 'Ù' + 218: 112, # 'Ú' + 219: 111, # 'Û' + 220: 55, # 'Ü' + 221: 41, # 'İ' + 222: 40, # 'Ş' + 223: 86, # 'ß' + 224: 89, # 'à' + 225: 70, # 'á' + 226: 59, # 'â' + 227: 78, # 'ã' + 228: 71, # 'ä' + 229: 82, # 'å' + 230: 88, # 'æ' + 231: 33, # 'ç' + 232: 77, # 'è' + 233: 66, # 'é' + 234: 84, # 'ê' + 235: 83, # 'ë' + 236: 110, # 'ì' + 237: 75, # 'í' + 238: 61, # 'î' + 239: 96, # 'ï' + 240: 30, # 'ğ' + 241: 67, # 'ñ' + 242: 109, # 'ò' + 243: 74, # 'ó' + 244: 87, # 'ô' + 245: 102, # 'õ' + 246: 34, # 'ö' + 247: 95, # '÷' + 248: 81, # 'ø' + 249: 108, # 'ù' + 250: 76, # 'ú' + 251: 72, # 'û' + 252: 17, # 'ü' + 253: 6, # 'ı' + 254: 19, # 'ş' + 255: 107, # 'ÿ' +} + +ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-9", + language="Turkish", + char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER, + language_model=TURKISH_LANG_MODEL, + typical_positive_ratio=0.97029, + keep_ascii_letters=True, + alphabet="ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş", +) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..59a01d9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,147 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import List, Union + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +# fmt: off +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) +# fmt: on + + +class Latin1Prober(CharSetProber): + def __init__(self) -> None: + super().__init__() + self._last_char_class = OTH + self._freq_counter: List[int] = [] + self.reset() + + def reset(self) -> None: + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + super().reset() + + @property + def charset_name(self) -> str: + return "ISO-8859-1" + + @property + def language(self) -> str: + return "" + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + byte_str = self.remove_xml_tags(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self) -> float: + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + confidence = ( + 0.0 + if total < 0.01 + else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total + ) + confidence = max(confidence, 0.0) + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence *= 0.73 + return confidence diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py new file mode 100644 index 0000000..1425d10 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py @@ -0,0 +1,162 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This code was modified from latin1prober.py by Rob Speer . +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Rob Speer - adapt to MacRoman encoding +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import List, Union + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +ODD = 8 # character that is unlikely to appear +CLASS_NUM = 9 # total classes + +# The change from Latin1 is that we explicitly look for extended characters +# that are infrequently-occurring symbols, and consider them to always be +# improbable. This should let MacRoman get out of the way of more likely +# encodings in most situations. + +# fmt: off +MacRoman_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + ACV, ACV, ACO, ACV, ACO, ACV, ACV, ASV, # 80 - 87 + ASV, ASV, ASV, ASV, ASV, ASO, ASV, ASV, # 88 - 8F + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASV, # 90 - 97 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, ASO, # A0 - A7 + OTH, OTH, ODD, ODD, OTH, OTH, ACV, ACV, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, ASV, ASV, # B8 - BF + OTH, OTH, ODD, OTH, ODD, OTH, OTH, OTH, # C0 - C7 + OTH, OTH, OTH, ACV, ACV, ACV, ACV, ASV, # C8 - CF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, ODD, # D0 - D7 + ASV, ACV, ODD, OTH, OTH, OTH, OTH, OTH, # D8 - DF + OTH, OTH, OTH, OTH, OTH, ACV, ACV, ACV, # E0 - E7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # E8 - EF + ODD, ACV, ACV, ACV, ACV, ASV, ODD, ODD, # F0 - F7 + ODD, ODD, ODD, ODD, ODD, ODD, ODD, ODD, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +MacRomanClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO ODD + 0, 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, 1, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, 1, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, 1, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, 1, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, 1, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, 1, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, 1, # ASO + 0, 1, 1, 1, 1, 1, 1, 1, 1, # ODD +) +# fmt: on + + +class MacRomanProber(CharSetProber): + def __init__(self) -> None: + super().__init__() + self._last_char_class = OTH + self._freq_counter: List[int] = [] + self.reset() + + def reset(self) -> None: + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + + # express the prior that MacRoman is a somewhat rare encoding; + # this can be done by starting out in a slightly improbable state + # that must be overcome + self._freq_counter[2] = 10 + + super().reset() + + @property + def charset_name(self) -> str: + return "MacRoman" + + @property + def language(self) -> str: + return "" + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + byte_str = self.remove_xml_tags(byte_str) + for c in byte_str: + char_class = MacRoman_CharToClass[c] + freq = MacRomanClassModel[(self._last_char_class * CLASS_NUM) + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self) -> float: + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + confidence = ( + 0.0 + if total < 0.01 + else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total + ) + confidence = max(confidence, 0.0) + # lower the confidence of MacRoman so that other more accurate + # detector can take priority. + confidence *= 0.73 + return confidence diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..666307e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,95 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import Optional, Union + +from .chardistribution import CharDistributionAnalysis +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, MachineState, ProbingState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: + super().__init__(lang_filter=lang_filter) + self.distribution_analyzer: Optional[CharDistributionAnalysis] = None + self.coding_sm: Optional[CodingStateMachine] = None + self._last_char = bytearray(b"\0\0") + + def reset(self) -> None: + super().reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = bytearray(b"\0\0") + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + assert self.coding_sm is not None + assert self.distribution_analyzer is not None + + for i, byte in enumerate(byte_str): + coding_state = self.coding_sm.next_state(byte) + if coding_state == MachineState.ERROR: + self.logger.debug( + "%s %s prober hit error at byte %s", + self.charset_name, + self.language, + i, + ) + self._state = ProbingState.NOT_ME + break + if coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + if coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if self.distribution_analyzer.got_enough_data() and ( + self.get_confidence() > self.SHORTCUT_THRESHOLD + ): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self) -> float: + assert self.distribution_analyzer is not None + return self.distribution_analyzer.get_confidence() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..6cb9cc7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,57 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .big5prober import Big5Prober +from .charsetgroupprober import CharSetGroupProber +from .cp949prober import CP949Prober +from .enums import LanguageFilter +from .eucjpprober import EUCJPProber +from .euckrprober import EUCKRProber +from .euctwprober import EUCTWProber +from .gb2312prober import GB2312Prober +from .johabprober import JOHABProber +from .sjisprober import SJISProber +from .utf8prober import UTF8Prober + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: + super().__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber(), + JOHABProber(), + ] + self.reset() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..7bbe97e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,661 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .codingstatemachinedict import CodingStateMachineDict +from .enums import MachineState + +# BIG5 + +# fmt: off +BIG5_CLS = ( + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as legal value + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 + 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f + 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 + 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f + 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 + 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f + 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 + 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f + 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 + 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f + 4, 4, 4, 4, 4, 4, 4, 4, # 80 - 87 + 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f + 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97 + 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f + 4, 3, 3, 3, 3, 3, 3, 3, # a0 - a7 + 3, 3, 3, 3, 3, 3, 3, 3, # a8 - af + 3, 3, 3, 3, 3, 3, 3, 3, # b0 - b7 + 3, 3, 3, 3, 3, 3, 3, 3, # b8 - bf + 3, 3, 3, 3, 3, 3, 3, 3, # c0 - c7 + 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf + 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7 + 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df + 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 + 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef + 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 + 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) +# fmt: on + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL: CodingStateMachineDict = { + "class_table": BIG5_CLS, + "class_factor": 5, + "state_table": BIG5_ST, + "char_len_table": BIG5_CHAR_LEN_TABLE, + "name": "Big5", +} + +# CP949 +# fmt: off +CP949_CLS = ( + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, # 00 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, # 10 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 3f + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 4f + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 50 - 5f + 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, # 60 - 6f + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 70 - 7f + 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 80 - 8f + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 9f + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, # a0 - af + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, # b0 - bf + 7, 7, 7, 7, 7, 7, 9, 2, 2, 3, 2, 2, 2, 2, 2, 2, # c0 - cf + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # d0 - df + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # e0 - ef + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) +# fmt: on + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL: CodingStateMachineDict = { + "class_table": CP949_CLS, + "class_factor": 10, + "state_table": CP949_ST, + "char_len_table": CP949_CHAR_LEN_TABLE, + "name": "CP949", +} + +# EUC-JP +# fmt: off +EUCJP_CLS = ( + 4, 4, 4, 4, 4, 4, 4, 4, # 00 - 07 + 4, 4, 4, 4, 4, 4, 5, 5, # 08 - 0f + 4, 4, 4, 4, 4, 4, 4, 4, # 10 - 17 + 4, 4, 4, 5, 4, 4, 4, 4, # 18 - 1f + 4, 4, 4, 4, 4, 4, 4, 4, # 20 - 27 + 4, 4, 4, 4, 4, 4, 4, 4, # 28 - 2f + 4, 4, 4, 4, 4, 4, 4, 4, # 30 - 37 + 4, 4, 4, 4, 4, 4, 4, 4, # 38 - 3f + 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 47 + 4, 4, 4, 4, 4, 4, 4, 4, # 48 - 4f + 4, 4, 4, 4, 4, 4, 4, 4, # 50 - 57 + 4, 4, 4, 4, 4, 4, 4, 4, # 58 - 5f + 4, 4, 4, 4, 4, 4, 4, 4, # 60 - 67 + 4, 4, 4, 4, 4, 4, 4, 4, # 68 - 6f + 4, 4, 4, 4, 4, 4, 4, 4, # 70 - 77 + 4, 4, 4, 4, 4, 4, 4, 4, # 78 - 7f + 5, 5, 5, 5, 5, 5, 5, 5, # 80 - 87 + 5, 5, 5, 5, 5, 5, 1, 3, # 88 - 8f + 5, 5, 5, 5, 5, 5, 5, 5, # 90 - 97 + 5, 5, 5, 5, 5, 5, 5, 5, # 98 - 9f + 5, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 + 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef + 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 + 0, 0, 0, 0, 0, 0, 0, 5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) +# fmt: on + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL: CodingStateMachineDict = { + "class_table": EUCJP_CLS, + "class_factor": 6, + "state_table": EUCJP_ST, + "char_len_table": EUCJP_CHAR_LEN_TABLE, + "name": "EUC-JP", +} + +# EUC-KR +# fmt: off +EUCKR_CLS = ( + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 + 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f + 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47 + 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f + 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57 + 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f + 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67 + 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f + 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77 + 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f + 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 + 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f + 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 + 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f + 0, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 3, 3, 3, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 3, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 + 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef + 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 + 2, 2, 2, 2, 2, 2, 2, 0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) +# fmt: on + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL: CodingStateMachineDict = { + "class_table": EUCKR_CLS, + "class_factor": 4, + "state_table": EUCKR_ST, + "char_len_table": EUCKR_CHAR_LEN_TABLE, + "name": "EUC-KR", +} + +# JOHAB +# fmt: off +JOHAB_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,0,0, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,0,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,3,3,3,3,3,3,3, # 30 - 37 + 3,3,3,3,3,3,3,3, # 38 - 3f + 3,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,2, # 78 - 7f + 6,6,6,6,8,8,8,8, # 80 - 87 + 8,8,8,8,8,8,8,8, # 88 - 8f + 8,7,7,7,7,7,7,7, # 90 - 97 + 7,7,7,7,7,7,7,7, # 98 - 9f + 7,7,7,7,7,7,7,7, # a0 - a7 + 7,7,7,7,7,7,7,7, # a8 - af + 7,7,7,7,7,7,7,7, # b0 - b7 + 7,7,7,7,7,7,7,7, # b8 - bf + 7,7,7,7,7,7,7,7, # c0 - c7 + 7,7,7,7,7,7,7,7, # c8 - cf + 7,7,7,7,5,5,5,5, # d0 - d7 + 5,9,9,9,9,9,9,5, # d8 - df + 9,9,9,9,9,9,9,9, # e0 - e7 + 9,9,9,9,9,9,9,9, # e8 - ef + 9,9,9,9,9,9,9,9, # f0 - f7 + 9,9,5,5,5,5,5,0 # f8 - ff +) + +JOHAB_ST = ( +# cls = 0 1 2 3 4 5 6 7 8 9 + MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,3 ,3 ,4 , # MachineState.START + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR , # MachineState.ERROR + MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START , # 3 + MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START , # 4 +) +# fmt: on + +JOHAB_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 0, 0, 2, 2, 2) + +JOHAB_SM_MODEL: CodingStateMachineDict = { + "class_table": JOHAB_CLS, + "class_factor": 10, + "state_table": JOHAB_ST, + "char_len_table": JOHAB_CHAR_LEN_TABLE, + "name": "Johab", +} + +# EUC-TW +# fmt: off +EUCTW_CLS = ( + 2, 2, 2, 2, 2, 2, 2, 2, # 00 - 07 + 2, 2, 2, 2, 2, 2, 0, 0, # 08 - 0f + 2, 2, 2, 2, 2, 2, 2, 2, # 10 - 17 + 2, 2, 2, 0, 2, 2, 2, 2, # 18 - 1f + 2, 2, 2, 2, 2, 2, 2, 2, # 20 - 27 + 2, 2, 2, 2, 2, 2, 2, 2, # 28 - 2f + 2, 2, 2, 2, 2, 2, 2, 2, # 30 - 37 + 2, 2, 2, 2, 2, 2, 2, 2, # 38 - 3f + 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 + 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f + 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 + 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f + 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 + 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f + 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 + 2, 2, 2, 2, 2, 2, 2, 2, # 78 - 7f + 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 + 0, 0, 0, 0, 0, 0, 6, 0, # 88 - 8f + 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 + 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f + 0, 3, 4, 4, 4, 4, 4, 4, # a0 - a7 + 5, 5, 1, 1, 1, 1, 1, 1, # a8 - af + 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7 + 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf + 1, 1, 3, 1, 3, 3, 3, 3, # c0 - c7 + 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf + 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7 + 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df + 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 + 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef + 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 + 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) +# fmt: on + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL: CodingStateMachineDict = { + "class_table": EUCTW_CLS, + "class_factor": 7, + "state_table": EUCTW_ST, + "char_len_table": EUCTW_CHAR_LEN_TABLE, + "name": "x-euc-tw", +} + +# GB2312 +# fmt: off +GB2312_CLS = ( + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 3, 3, 3, 3, 3, 3, 3, 3, # 30 - 37 + 3, 3, 1, 1, 1, 1, 1, 1, # 38 - 3f + 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 + 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f + 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 + 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f + 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 + 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f + 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 + 2, 2, 2, 2, 2, 2, 2, 4, # 78 - 7f + 5, 6, 6, 6, 6, 6, 6, 6, # 80 - 87 + 6, 6, 6, 6, 6, 6, 6, 6, # 88 - 8f + 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 97 + 6, 6, 6, 6, 6, 6, 6, 6, # 98 - 9f + 6, 6, 6, 6, 6, 6, 6, 6, # a0 - a7 + 6, 6, 6, 6, 6, 6, 6, 6, # a8 - af + 6, 6, 6, 6, 6, 6, 6, 6, # b0 - b7 + 6, 6, 6, 6, 6, 6, 6, 6, # b8 - bf + 6, 6, 6, 6, 6, 6, 6, 6, # c0 - c7 + 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf + 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7 + 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df + 6, 6, 6, 6, 6, 6, 6, 6, # e0 - e7 + 6, 6, 6, 6, 6, 6, 6, 6, # e8 - ef + 6, 6, 6, 6, 6, 6, 6, 6, # f0 - f7 + 6, 6, 6, 6, 6, 6, 6, 0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) +# fmt: on + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL: CodingStateMachineDict = { + "class_table": GB2312_CLS, + "class_factor": 7, + "state_table": GB2312_ST, + "char_len_table": GB2312_CHAR_LEN_TABLE, + "name": "GB2312", +} + +# Shift_JIS +# fmt: off +SJIS_CLS = ( + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 + 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f + 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 + 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f + 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 + 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f + 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 + 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f + 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 + 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f + 3, 3, 3, 3, 3, 2, 2, 3, # 80 - 87 + 3, 3, 3, 3, 3, 3, 3, 3, # 88 - 8f + 3, 3, 3, 3, 3, 3, 3, 3, # 90 - 97 + 3, 3, 3, 3, 3, 3, 3, 3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 + 3, 3, 3, 3, 3, 4, 4, 4, # e8 - ef + 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 + 3, 3, 3, 3, 3, 0, 0, 0, # f8 - ff +) + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) +# fmt: on + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL: CodingStateMachineDict = { + "class_table": SJIS_CLS, + "class_factor": 6, + "state_table": SJIS_ST, + "char_len_table": SJIS_CHAR_LEN_TABLE, + "name": "Shift_JIS", +} + +# UCS2-BE +# fmt: off +UCS2BE_CLS = ( + 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 + 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 + 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f + 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 + 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f + 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7 + 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af + 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7 + 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf + 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7 + 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf + 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7 + 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df + 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 + 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef + 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 + 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) +# fmt: on + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL: CodingStateMachineDict = { + "class_table": UCS2BE_CLS, + "class_factor": 6, + "state_table": UCS2BE_ST, + "char_len_table": UCS2BE_CHAR_LEN_TABLE, + "name": "UTF-16BE", +} + +# UCS2-LE +# fmt: off +UCS2LE_CLS = ( + 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 + 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 + 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f + 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 + 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f + 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7 + 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af + 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7 + 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf + 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7 + 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf + 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7 + 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df + 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 + 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef + 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 + 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) +# fmt: on + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL: CodingStateMachineDict = { + "class_table": UCS2LE_CLS, + "class_factor": 6, + "state_table": UCS2LE_ST, + "char_len_table": UCS2LE_CHAR_LEN_TABLE, + "name": "UTF-16LE", +} + +# UTF-8 +# fmt: off +UTF8_CLS = ( + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as a legal value + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 + 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f + 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47 + 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f + 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57 + 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f + 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67 + 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f + 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77 + 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f + 2, 2, 2, 2, 3, 3, 3, 3, # 80 - 87 + 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f + 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97 + 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f + 5, 5, 5, 5, 5, 5, 5, 5, # a0 - a7 + 5, 5, 5, 5, 5, 5, 5, 5, # a8 - af + 5, 5, 5, 5, 5, 5, 5, 5, # b0 - b7 + 5, 5, 5, 5, 5, 5, 5, 5, # b8 - bf + 0, 0, 6, 6, 6, 6, 6, 6, # c0 - c7 + 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf + 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7 + 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df + 7, 8, 8, 8, 8, 8, 8, 8, # e0 - e7 + 8, 8, 8, 8, 8, 9, 8, 8, # e8 - ef + 10, 11, 11, 11, 11, 11, 11, 11, # f0 - f7 + 12, 13, 13, 13, 14, 15, 0, 0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) +# fmt: on + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL: CodingStateMachineDict = { + "class_table": UTF8_CLS, + "class_factor": 16, + "state_table": UTF8_ST, + "char_len_table": UTF8_CHAR_LEN_TABLE, + "name": "UTF-8", +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89ee2e354e8a8a34edb4b9f55a3fcf331235f77d GIT binary patch literal 219 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 None: + super().__init__() + self.name = name + self.iso_code = iso_code + self.use_ascii = use_ascii + self.charsets = charsets + if self.use_ascii: + if alphabet: + alphabet += ascii_letters + else: + alphabet = ascii_letters + elif not alphabet: + raise ValueError("Must supply alphabet if use_ascii is False") + self.alphabet = "".join(sorted(set(alphabet))) if alphabet else None + self.wiki_start_pages = wiki_start_pages + + def __repr__(self) -> str: + param_str = ", ".join( + f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_") + ) + return f"{self.__class__.__name__}({param_str})" + + +LANGUAGES = { + "Arabic": Language( + name="Arabic", + iso_code="ar", + use_ascii=False, + # We only support encodings that use isolated + # forms, because the current recommendation is + # that the rendering system handles presentation + # forms. This means we purposefully skip IBM864. + charsets=["ISO-8859-6", "WINDOWS-1256", "CP720", "CP864"], + alphabet="ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّ", + wiki_start_pages=["الصفحة_الرئيسية"], + ), + "Belarusian": Language( + name="Belarusian", + iso_code="be", + use_ascii=False, + charsets=["ISO-8859-5", "WINDOWS-1251", "IBM866", "MacCyrillic"], + alphabet="АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШЫЬЭЮЯабвгдеёжзійклмнопрстуўфхцчшыьэюяʼ", + wiki_start_pages=["Галоўная_старонка"], + ), + "Bulgarian": Language( + name="Bulgarian", + iso_code="bg", + use_ascii=False, + charsets=["ISO-8859-5", "WINDOWS-1251", "IBM855"], + alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", + wiki_start_pages=["Начална_страница"], + ), + "Czech": Language( + name="Czech", + iso_code="cz", + use_ascii=True, + charsets=["ISO-8859-2", "WINDOWS-1250"], + alphabet="áčďéěíňóřšťúůýžÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ", + wiki_start_pages=["Hlavní_strana"], + ), + "Danish": Language( + name="Danish", + iso_code="da", + use_ascii=True, + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], + alphabet="æøåÆØÅ", + wiki_start_pages=["Forside"], + ), + "German": Language( + name="German", + iso_code="de", + use_ascii=True, + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], + alphabet="äöüßẞÄÖÜ", + wiki_start_pages=["Wikipedia:Hauptseite"], + ), + "Greek": Language( + name="Greek", + iso_code="el", + use_ascii=False, + charsets=["ISO-8859-7", "WINDOWS-1253"], + alphabet="αβγδεζηθικλμνξοπρσςτυφχψωάέήίόύώΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎΏ", + wiki_start_pages=["Πύλη:Κύρια"], + ), + "English": Language( + name="English", + iso_code="en", + use_ascii=True, + charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"], + wiki_start_pages=["Main_Page"], + ), + "Esperanto": Language( + name="Esperanto", + iso_code="eo", + # Q, W, X, and Y not used at all + use_ascii=False, + charsets=["ISO-8859-3"], + alphabet="abcĉdefgĝhĥijĵklmnoprsŝtuŭvzABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ", + wiki_start_pages=["Vikipedio:Ĉefpaĝo"], + ), + "Spanish": Language( + name="Spanish", + iso_code="es", + use_ascii=True, + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], + alphabet="ñáéíóúüÑÁÉÍÓÚÜ", + wiki_start_pages=["Wikipedia:Portada"], + ), + "Estonian": Language( + name="Estonian", + iso_code="et", + use_ascii=False, + charsets=["ISO-8859-4", "ISO-8859-13", "WINDOWS-1257"], + # C, F, Š, Q, W, X, Y, Z, Ž are only for + # loanwords + alphabet="ABDEGHIJKLMNOPRSTUVÕÄÖÜabdeghijklmnoprstuvõäöü", + wiki_start_pages=["Esileht"], + ), + "Finnish": Language( + name="Finnish", + iso_code="fi", + use_ascii=True, + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], + alphabet="ÅÄÖŠŽåäöšž", + wiki_start_pages=["Wikipedia:Etusivu"], + ), + "French": Language( + name="French", + iso_code="fr", + use_ascii=True, + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], + alphabet="œàâçèéîïùûêŒÀÂÇÈÉÎÏÙÛÊ", + wiki_start_pages=["Wikipédia:Accueil_principal", "Bœuf (animal)"], + ), + "Hebrew": Language( + name="Hebrew", + iso_code="he", + use_ascii=False, + charsets=["ISO-8859-8", "WINDOWS-1255"], + alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ", + wiki_start_pages=["עמוד_ראשי"], + ), + "Croatian": Language( + name="Croatian", + iso_code="hr", + # Q, W, X, Y are only used for foreign words. + use_ascii=False, + charsets=["ISO-8859-2", "WINDOWS-1250"], + alphabet="abcčćdđefghijklmnoprsštuvzžABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽ", + wiki_start_pages=["Glavna_stranica"], + ), + "Hungarian": Language( + name="Hungarian", + iso_code="hu", + # Q, W, X, Y are only used for foreign words. + use_ascii=False, + charsets=["ISO-8859-2", "WINDOWS-1250"], + alphabet="abcdefghijklmnoprstuvzáéíóöőúüűABCDEFGHIJKLMNOPRSTUVZÁÉÍÓÖŐÚÜŰ", + wiki_start_pages=["Kezdőlap"], + ), + "Italian": Language( + name="Italian", + iso_code="it", + use_ascii=True, + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], + alphabet="ÀÈÉÌÒÓÙàèéìòóù", + wiki_start_pages=["Pagina_principale"], + ), + "Lithuanian": Language( + name="Lithuanian", + iso_code="lt", + use_ascii=False, + charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"], + # Q, W, and X not used at all + alphabet="AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽaąbcčdeęėfghiįyjklmnoprsštuųūvzž", + wiki_start_pages=["Pagrindinis_puslapis"], + ), + "Latvian": Language( + name="Latvian", + iso_code="lv", + use_ascii=False, + charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"], + # Q, W, X, Y are only for loanwords + alphabet="AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽaābcčdeēfgģhiījkķlļmnņoprsštuūvzž", + wiki_start_pages=["Sākumlapa"], + ), + "Macedonian": Language( + name="Macedonian", + iso_code="mk", + use_ascii=False, + charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"], + alphabet="АБВГДЃЕЖЗЅИЈКЛЉМНЊОПРСТЌУФХЦЧЏШабвгдѓежзѕијклљмнњопрстќуфхцчџш", + wiki_start_pages=["Главна_страница"], + ), + "Dutch": Language( + name="Dutch", + iso_code="nl", + use_ascii=True, + charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"], + wiki_start_pages=["Hoofdpagina"], + ), + "Polish": Language( + name="Polish", + iso_code="pl", + # Q and X are only used for foreign words. + use_ascii=False, + charsets=["ISO-8859-2", "WINDOWS-1250"], + alphabet="AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻaąbcćdeęfghijklłmnńoóprsśtuwyzźż", + wiki_start_pages=["Wikipedia:Strona_główna"], + ), + "Portuguese": Language( + name="Portuguese", + iso_code="pt", + use_ascii=True, + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], + alphabet="ÁÂÃÀÇÉÊÍÓÔÕÚáâãàçéêíóôõú", + wiki_start_pages=["Wikipédia:Página_principal"], + ), + "Romanian": Language( + name="Romanian", + iso_code="ro", + use_ascii=True, + charsets=["ISO-8859-2", "WINDOWS-1250"], + alphabet="ăâîșțĂÂÎȘȚ", + wiki_start_pages=["Pagina_principală"], + ), + "Russian": Language( + name="Russian", + iso_code="ru", + use_ascii=False, + charsets=[ + "ISO-8859-5", + "WINDOWS-1251", + "KOI8-R", + "MacCyrillic", + "IBM866", + "IBM855", + ], + alphabet="абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", + wiki_start_pages=["Заглавная_страница"], + ), + "Slovak": Language( + name="Slovak", + iso_code="sk", + use_ascii=True, + charsets=["ISO-8859-2", "WINDOWS-1250"], + alphabet="áäčďéíĺľňóôŕšťúýžÁÄČĎÉÍĹĽŇÓÔŔŠŤÚÝŽ", + wiki_start_pages=["Hlavná_stránka"], + ), + "Slovene": Language( + name="Slovene", + iso_code="sl", + # Q, W, X, Y are only used for foreign words. + use_ascii=False, + charsets=["ISO-8859-2", "WINDOWS-1250"], + alphabet="abcčdefghijklmnoprsštuvzžABCČDEFGHIJKLMNOPRSŠTUVZŽ", + wiki_start_pages=["Glavna_stran"], + ), + # Serbian can be written in both Latin and Cyrillic, but there's no + # simple way to get the Latin alphabet pages from Wikipedia through + # the API, so for now we just support Cyrillic. + "Serbian": Language( + name="Serbian", + iso_code="sr", + alphabet="АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШабвгдђежзијклљмнњопрстћуфхцчџш", + charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"], + wiki_start_pages=["Главна_страна"], + ), + "Thai": Language( + name="Thai", + iso_code="th", + use_ascii=False, + charsets=["ISO-8859-11", "TIS-620", "CP874"], + alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛", + wiki_start_pages=["หน้าหลัก"], + ), + "Turkish": Language( + name="Turkish", + iso_code="tr", + # Q, W, and X are not used by Turkish + use_ascii=False, + charsets=["ISO-8859-3", "ISO-8859-9", "WINDOWS-1254"], + alphabet="abcçdefgğhıijklmnoöprsştuüvyzâîûABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZÂÎÛ", + wiki_start_pages=["Ana_Sayfa"], + ), + "Vietnamese": Language( + name="Vietnamese", + iso_code="vi", + use_ascii=False, + # Windows-1258 is the only common 8-bit + # Vietnamese encoding supported by Python. + # From Wikipedia: + # For systems that lack support for Unicode, + # dozens of 8-bit Vietnamese code pages are + # available.[1] The most common are VISCII + # (TCVN 5712:1993), VPS, and Windows-1258.[3] + # Where ASCII is required, such as when + # ensuring readability in plain text e-mail, + # Vietnamese letters are often encoded + # according to Vietnamese Quoted-Readable + # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4] + # though usage of either variable-width + # scheme has declined dramatically following + # the adoption of Unicode on the World Wide + # Web. + charsets=["WINDOWS-1258"], + alphabet="aăâbcdđeêghiklmnoôơpqrstuưvxyAĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXY", + wiki_start_pages=["Chữ_Quốc_ngữ"], + ), +} diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py new file mode 100644 index 0000000..7d36e64 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py @@ -0,0 +1,16 @@ +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + # TypedDict was introduced in Python 3.8. + # + # TODO: Remove the else block and TYPE_CHECKING check when dropping support + # for Python 3.7. + from typing import TypedDict + + class ResultDict(TypedDict): + encoding: Optional[str] + confidence: float + language: Optional[str] + +else: + ResultDict = dict diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0ffbcdd --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,162 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import Dict, List, NamedTuple, Optional, Union + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetModel(NamedTuple): + charset_name: str + language: str + char_to_order_map: Dict[int, int] + language_model: Dict[int, Dict[int, int]] + typical_positive_ratio: float + keep_ascii_letters: bool + alphabet: str + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__( + self, + model: SingleByteCharSetModel, + is_reversed: bool = False, + name_prober: Optional[CharSetProber] = None, + ) -> None: + super().__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = is_reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = 255 + self._seq_counters: List[int] = [] + self._total_seqs = 0 + self._total_char = 0 + self._control_char = 0 + self._freq_char = 0 + self.reset() + + def reset(self) -> None: + super().reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + self._control_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self) -> Optional[str]: + if self._name_prober: + return self._name_prober.charset_name + return self._model.charset_name + + @property + def language(self) -> Optional[str]: + if self._name_prober: + return self._name_prober.language + return self._model.language + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + # TODO: Make filter_international_words keep things in self.alphabet + if not self._model.keep_ascii_letters: + byte_str = self.filter_international_words(byte_str) + else: + byte_str = self.remove_xml_tags(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model.char_to_order_map + language_model = self._model.language_model + for char in byte_str: + order = char_to_order_map.get(char, CharacterCategory.UNDEFINED) + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + lm_cat = language_model[self._last_order][order] + else: + lm_cat = language_model[order][self._last_order] + self._seq_counters[lm_cat] += 1 + self._last_order = order + + charset_name = self._model.charset_name + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug( + "%s confidence = %s, we have a winner", charset_name, confidence + ) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug( + "%s confidence = %s, below negative shortcut threshold %s", + charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD, + ) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self) -> float: + r = 0.01 + if self._total_seqs > 0: + r = ( + ( + self._seq_counters[SequenceLikelihood.POSITIVE] + + 0.25 * self._seq_counters[SequenceLikelihood.LIKELY] + ) + / self._total_seqs + / self._model.typical_positive_ratio + ) + # The more control characters (proportionnaly to the size + # of the text), the less confident we become in the current + # charset. + r = r * (self._total_char - self._control_char) / self._total_char + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..890ae84 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .hebrewprober import HebrewProber +from .langbulgarianmodel import ISO_8859_5_BULGARIAN_MODEL, WINDOWS_1251_BULGARIAN_MODEL +from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL +from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL + +# from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL, +# WINDOWS_1250_HUNGARIAN_MODEL) +from .langrussianmodel import ( + IBM855_RUSSIAN_MODEL, + IBM866_RUSSIAN_MODEL, + ISO_8859_5_RUSSIAN_MODEL, + KOI8_R_RUSSIAN_MODEL, + MACCYRILLIC_RUSSIAN_MODEL, + WINDOWS_1251_RUSSIAN_MODEL, +) +from .langthaimodel import TIS_620_THAI_MODEL +from .langturkishmodel import ISO_8859_9_TURKISH_MODEL +from .sbcharsetprober import SingleByteCharSetProber + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self) -> None: + super().__init__() + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber( + WINDOWS_1255_HEBREW_MODEL, is_reversed=False, name_prober=hebrew_prober + ) + # TODO: See if using ISO-8859-8 Hebrew model works better here, since + # it's actually the visual one + visual_hebrew_prober = SingleByteCharSetProber( + WINDOWS_1255_HEBREW_MODEL, is_reversed=True, name_prober=hebrew_prober + ) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + # TODO: ORDER MATTERS HERE. I changed the order vs what was in master + # and several tests failed that did not before. Some thought + # should be put into the ordering, and we should consider making + # order not matter here, because that is very counter-intuitive. + self.probers = [ + SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL), + SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL), + SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL), + SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL), + SingleByteCharSetProber(IBM866_RUSSIAN_MODEL), + SingleByteCharSetProber(IBM855_RUSSIAN_MODEL), + SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL), + SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL), + SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL), + SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL), + # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL), + SingleByteCharSetProber(TIS_620_THAI_MODEL), + SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL), + hebrew_prober, + logical_hebrew_prober, + visual_hebrew_prober, + ] + self.reset() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..91df077 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,105 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import Union + +from .chardistribution import SJISDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .enums import MachineState, ProbingState +from .jpcntx import SJISContextAnalysis +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import SJIS_SM_MODEL + + +class SJISProber(MultiByteCharSetProber): + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self) -> None: + super().reset() + self.context_analyzer.reset() + + @property + def charset_name(self) -> str: + return self.context_analyzer.charset_name + + @property + def language(self) -> str: + return "Japanese" + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + assert self.coding_sm is not None + assert self.distribution_analyzer is not None + + for i, byte in enumerate(byte_str): + coding_state = self.coding_sm.next_state(byte) + if coding_state == MachineState.ERROR: + self.logger.debug( + "%s %s prober hit error at byte %s", + self.charset_name, + self.language, + i, + ) + self._state = ProbingState.NOT_ME + break + if coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + if coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte + self.context_analyzer.feed( + self._last_char[2 - char_len :], char_len + ) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed( + byte_str[i + 1 - char_len : i + 3 - char_len], char_len + ) + self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if self.context_analyzer.got_enough_data() and ( + self.get_confidence() > self.SHORTCUT_THRESHOLD + ): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self) -> float: + assert self.distribution_analyzer is not None + + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..30c441d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,362 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re +from typing import List, Optional, Union + +from .charsetgroupprober import CharSetGroupProber +from .charsetprober import CharSetProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .macromanprober import MacRomanProber +from .mbcsgroupprober import MBCSGroupProber +from .resultdict import ResultDict +from .sbcsgroupprober import SBCSGroupProber +from .utf1632prober import UTF1632Prober + + +class UniversalDetector: + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b"[\x80-\xFF]") + ESC_DETECTOR = re.compile(b"(\033|~{)") + WIN_BYTE_DETECTOR = re.compile(b"[\x80-\x9F]") + ISO_WIN_MAP = { + "iso-8859-1": "Windows-1252", + "iso-8859-2": "Windows-1250", + "iso-8859-5": "Windows-1251", + "iso-8859-6": "Windows-1256", + "iso-8859-7": "Windows-1253", + "iso-8859-8": "Windows-1255", + "iso-8859-9": "Windows-1254", + "iso-8859-13": "Windows-1257", + } + # Based on https://encoding.spec.whatwg.org/#names-and-labels + # but altered to match Python names for encodings and remove mappings + # that break tests. + LEGACY_MAP = { + "ascii": "Windows-1252", + "iso-8859-1": "Windows-1252", + "tis-620": "ISO-8859-11", + "iso-8859-9": "Windows-1254", + "gb2312": "GB18030", + "euc-kr": "CP949", + "utf-16le": "UTF-16", + } + + def __init__( + self, + lang_filter: LanguageFilter = LanguageFilter.ALL, + should_rename_legacy: bool = False, + ) -> None: + self._esc_charset_prober: Optional[EscCharSetProber] = None + self._utf1632_prober: Optional[UTF1632Prober] = None + self._charset_probers: List[CharSetProber] = [] + self.result: ResultDict = { + "encoding": None, + "confidence": 0.0, + "language": None, + } + self.done = False + self._got_data = False + self._input_state = InputState.PURE_ASCII + self._last_char = b"" + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = False + self.should_rename_legacy = should_rename_legacy + self.reset() + + @property + def input_state(self) -> int: + return self._input_state + + @property + def has_win_bytes(self) -> bool: + return self._has_win_bytes + + @property + def charset_probers(self) -> List[CharSetProber]: + return self._charset_probers + + def reset(self) -> None: + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {"encoding": None, "confidence": 0.0, "language": None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b"" + if self._esc_charset_prober: + self._esc_charset_prober.reset() + if self._utf1632_prober: + self._utf1632_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str: Union[bytes, bytearray]) -> None: + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not byte_str: + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = { + "encoding": "UTF-8-SIG", + "confidence": 1.0, + "language": "", + } + elif byte_str.startswith((codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {"encoding": "UTF-32", "confidence": 1.0, "language": ""} + elif byte_str.startswith(b"\xFE\xFF\x00\x00"): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = { + # TODO: This encoding is not supported by Python. Should remove? + "encoding": "X-ISO-10646-UCS-4-3412", + "confidence": 1.0, + "language": "", + } + elif byte_str.startswith(b"\x00\x00\xFF\xFE"): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = { + # TODO: This encoding is not supported by Python. Should remove? + "encoding": "X-ISO-10646-UCS-4-2143", + "confidence": 1.0, + "language": "", + } + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {"encoding": "UTF-16", "confidence": 1.0, "language": ""} + + self._got_data = True + if self.result["encoding"] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif ( + self._input_state == InputState.PURE_ASCII + and self.ESC_DETECTOR.search(self._last_char + byte_str) + ): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # next we will look to see if it is appears to be either a UTF-16 or + # UTF-32 encoding + if not self._utf1632_prober: + self._utf1632_prober = UTF1632Prober() + + if self._utf1632_prober.state == ProbingState.DETECTING: + if self._utf1632_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = { + "encoding": self._utf1632_prober.charset_name, + "confidence": self._utf1632_prober.get_confidence(), + "language": "", + } + self.done = True + return + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = { + "encoding": self._esc_charset_prober.charset_name, + "confidence": self._esc_charset_prober.get_confidence(), + "language": self._esc_charset_prober.language, + } + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + self._charset_probers.append(MacRomanProber()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = { + "encoding": prober.charset_name, + "confidence": prober.get_confidence(), + "language": prober.language, + } + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self) -> ResultDict: + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug("no data received!") + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {"encoding": "ascii", "confidence": 1.0, "language": ""} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + assert charset_name is not None + lower_charset_name = charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith("iso-8859"): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get( + lower_charset_name, charset_name + ) + # Rename legacy encodings with superset encodings if asked + if self.should_rename_legacy: + charset_name = self.LEGACY_MAP.get( + (charset_name or "").lower(), charset_name + ) + self.result = { + "encoding": charset_name, + "confidence": confidence, + "language": max_prober.language, + } + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() <= logging.DEBUG: + if self.result["encoding"] is None: + self.logger.debug("no probers hit minimum threshold") + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug( + "%s %s confidence = %s", + prober.charset_name, + prober.language, + prober.get_confidence(), + ) + else: + self.logger.debug( + "%s %s confidence = %s", + group_prober.charset_name, + group_prober.language, + group_prober.get_confidence(), + ) + return self.result diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py new file mode 100644 index 0000000..6bdec63 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# +# Contributor(s): +# Jason Zavaglia +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +from typing import List, Union + +from .charsetprober import CharSetProber +from .enums import ProbingState + + +class UTF1632Prober(CharSetProber): + """ + This class simply looks for occurrences of zero bytes, and infers + whether the file is UTF16 or UTF32 (low-endian or big-endian) + For instance, files looking like ( \0 \0 \0 [nonzero] )+ + have a good probability to be UTF32BE. Files looking like ( \0 [nonzero] )+ + may be guessed to be UTF16BE, and inversely for little-endian varieties. + """ + + # how many logical characters to scan before feeling confident of prediction + MIN_CHARS_FOR_DETECTION = 20 + # a fixed constant ratio of expected zeros or non-zeros in modulo-position. + EXPECTED_RATIO = 0.94 + + def __init__(self) -> None: + super().__init__() + self.position = 0 + self.zeros_at_mod = [0] * 4 + self.nonzeros_at_mod = [0] * 4 + self._state = ProbingState.DETECTING + self.quad = [0, 0, 0, 0] + self.invalid_utf16be = False + self.invalid_utf16le = False + self.invalid_utf32be = False + self.invalid_utf32le = False + self.first_half_surrogate_pair_detected_16be = False + self.first_half_surrogate_pair_detected_16le = False + self.reset() + + def reset(self) -> None: + super().reset() + self.position = 0 + self.zeros_at_mod = [0] * 4 + self.nonzeros_at_mod = [0] * 4 + self._state = ProbingState.DETECTING + self.invalid_utf16be = False + self.invalid_utf16le = False + self.invalid_utf32be = False + self.invalid_utf32le = False + self.first_half_surrogate_pair_detected_16be = False + self.first_half_surrogate_pair_detected_16le = False + self.quad = [0, 0, 0, 0] + + @property + def charset_name(self) -> str: + if self.is_likely_utf32be(): + return "utf-32be" + if self.is_likely_utf32le(): + return "utf-32le" + if self.is_likely_utf16be(): + return "utf-16be" + if self.is_likely_utf16le(): + return "utf-16le" + # default to something valid + return "utf-16" + + @property + def language(self) -> str: + return "" + + def approx_32bit_chars(self) -> float: + return max(1.0, self.position / 4.0) + + def approx_16bit_chars(self) -> float: + return max(1.0, self.position / 2.0) + + def is_likely_utf32be(self) -> bool: + approx_chars = self.approx_32bit_chars() + return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( + self.zeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO + and self.nonzeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO + and not self.invalid_utf32be + ) + + def is_likely_utf32le(self) -> bool: + approx_chars = self.approx_32bit_chars() + return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( + self.nonzeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO + and not self.invalid_utf32le + ) + + def is_likely_utf16be(self) -> bool: + approx_chars = self.approx_16bit_chars() + return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( + (self.nonzeros_at_mod[1] + self.nonzeros_at_mod[3]) / approx_chars + > self.EXPECTED_RATIO + and (self.zeros_at_mod[0] + self.zeros_at_mod[2]) / approx_chars + > self.EXPECTED_RATIO + and not self.invalid_utf16be + ) + + def is_likely_utf16le(self) -> bool: + approx_chars = self.approx_16bit_chars() + return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( + (self.nonzeros_at_mod[0] + self.nonzeros_at_mod[2]) / approx_chars + > self.EXPECTED_RATIO + and (self.zeros_at_mod[1] + self.zeros_at_mod[3]) / approx_chars + > self.EXPECTED_RATIO + and not self.invalid_utf16le + ) + + def validate_utf32_characters(self, quad: List[int]) -> None: + """ + Validate if the quad of bytes is valid UTF-32. + + UTF-32 is valid in the range 0x00000000 - 0x0010FFFF + excluding 0x0000D800 - 0x0000DFFF + + https://en.wikipedia.org/wiki/UTF-32 + """ + if ( + quad[0] != 0 + or quad[1] > 0x10 + or (quad[0] == 0 and quad[1] == 0 and 0xD8 <= quad[2] <= 0xDF) + ): + self.invalid_utf32be = True + if ( + quad[3] != 0 + or quad[2] > 0x10 + or (quad[3] == 0 and quad[2] == 0 and 0xD8 <= quad[1] <= 0xDF) + ): + self.invalid_utf32le = True + + def validate_utf16_characters(self, pair: List[int]) -> None: + """ + Validate if the pair of bytes is valid UTF-16. + + UTF-16 is valid in the range 0x0000 - 0xFFFF excluding 0xD800 - 0xFFFF + with an exception for surrogate pairs, which must be in the range + 0xD800-0xDBFF followed by 0xDC00-0xDFFF + + https://en.wikipedia.org/wiki/UTF-16 + """ + if not self.first_half_surrogate_pair_detected_16be: + if 0xD8 <= pair[0] <= 0xDB: + self.first_half_surrogate_pair_detected_16be = True + elif 0xDC <= pair[0] <= 0xDF: + self.invalid_utf16be = True + else: + if 0xDC <= pair[0] <= 0xDF: + self.first_half_surrogate_pair_detected_16be = False + else: + self.invalid_utf16be = True + + if not self.first_half_surrogate_pair_detected_16le: + if 0xD8 <= pair[1] <= 0xDB: + self.first_half_surrogate_pair_detected_16le = True + elif 0xDC <= pair[1] <= 0xDF: + self.invalid_utf16le = True + else: + if 0xDC <= pair[1] <= 0xDF: + self.first_half_surrogate_pair_detected_16le = False + else: + self.invalid_utf16le = True + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + for c in byte_str: + mod4 = self.position % 4 + self.quad[mod4] = c + if mod4 == 3: + self.validate_utf32_characters(self.quad) + self.validate_utf16_characters(self.quad[0:2]) + self.validate_utf16_characters(self.quad[2:4]) + if c == 0: + self.zeros_at_mod[mod4] += 1 + else: + self.nonzeros_at_mod[mod4] += 1 + self.position += 1 + return self.state + + @property + def state(self) -> ProbingState: + if self._state in {ProbingState.NOT_ME, ProbingState.FOUND_IT}: + # terminal, decided states + return self._state + if self.get_confidence() > 0.80: + self._state = ProbingState.FOUND_IT + elif self.position > 4 * 1024: + # if we get to 4kb into the file, and we can't conclude it's UTF, + # let's give up + self._state = ProbingState.NOT_ME + return self._state + + def get_confidence(self) -> float: + return ( + 0.85 + if ( + self.is_likely_utf16le() + or self.is_likely_utf16be() + or self.is_likely_utf32le() + or self.is_likely_utf32be() + ) + else 0.00 + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..d96354d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import Union + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import MachineState, ProbingState +from .mbcssm import UTF8_SM_MODEL + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self) -> None: + super().__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = 0 + self.reset() + + def reset(self) -> None: + super().reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self) -> str: + return "utf-8" + + @property + def language(self) -> str: + return "" + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + if coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + if coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self) -> float: + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB**self._num_mb_chars + return 1.0 - unlike + return unlike diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..c5e9d85 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setuptools and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "5.1.0" +VERSION = __version__.split(".") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..383101c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py @@ -0,0 +1,7 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.6' + diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b027c463e049e97579a7369736e7d994aa590f4 GIT binary patch literal 511 zcmXv~yKWRQ6t#Cevya(L5rITH3Yt;G8g>&ZghYrUsx+`5xv?fYCOGTI$o3`~I=&*` zz_(B$8cPvK6cHU#x>Q^fa*K0cvd_8a>tr%Q5WA~)$0Ll;uhiT{?|*Uq8j1_lpav_X zF~hpYdOBm7CXDEu7lWG1P=jy1XiW0}rb5NTiV= z7LB;g?lw=BR#{i;ng?+n;)9d55B!5X=V#J1_RRC8HQp*wkw^}#6OruI%T>(ZgieWA zyjnYNU4>)$(s=pSzL#b``; zTW3#1ND_~fpt=+0lqz{d+b(>xW=hAJ$_Ah%xk~IJT literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c662fd71539b116ee15dbea110eb49be7def71a GIT binary patch literal 3969 zcmcgu&2JmW6`%d$H${o`m*ljeV<#yShifPONR^@vMN+b2iZVngt~YhJGyzAhZw%}|LDa+kir@GmJ@Gw$dgZfZ6ghIu>#w~3evy>#T&;63U3I!;URBGcq8DA(%_(PSa`?48yoUQgm)ag z6GPspOlbH)FIZy?tjNHMffXHC<6wmb)#@}OFE*jck`PNIB^SB0abM<2wlvQb$7LyrtKtW+ck)?H->A8IMPG3!bM#s2(poad zY|GYj)LD1y4ZXqYSE!q*Iril$)i;{7c1^F^m-R-|U8~pLOP_vMcWjrw(vwVB<#+lvH zUO4$sO?IGxjF2INLy++cs0@?g{qz>WUw5&Wcm_ml%I|)V0wxwqS+30F3&4ct+HRFP zf(izjCp_p-*A!kh0d@>t=MaF1ZRfy^>0NCv{Ih$?UikP!^*F=WM}qtBR_Y^$iFO~B z2sAhnSEN#3R3pG#ZPm4WsL z6NB#iS-_-Q2i^X*1>bK;4|wIRrYuvv|-LmU4?g!;yMQ9p+QFUnbQ?Ay^8An5K0fm5UG=W@ z&5^fvw8!Izchz0%-oig#|K`N|-;V$GsUP|aaTHT3hv_gB)8rx3^maI?M@;iCSIbqe zg}n|F-uLt*Vq{0bApjTLLDsfONA_#pu%e{`&cV}9y3Q}bHMH=4Sb7PL3BM&nsY0nh zsX?hi>9YcGbih&3^reD4B-pshoI0!Y$HNJJOlA#MACrD$56pO(C9~I{g-bODhwd+h zymEds`h42-%6Vj>zbD1wUzK(zZhw4ZYqzo&JN7Ve%*(i!7u<}OacP)zBrY|#c%ir% z8;T4aZ$dYA8bKuf%L^m>f-wBEi%SIihfJT2yD*n1?^`&)D8JhTj@ zI;Ob{DXu_ztB~57;kSH7!15bGD`14Ipb@r0M#KsmQ7dAMSy3ZqjTz%s%$Tsojkq;o zB;YQV-~nW8w$5n#=P*J0RfHtMF$B!wHWJvzUua{xwvmUnf$#~!9}zAg{0YHC_%lKo zpm_hlKJvIWQve}xWhtNI+T2n;U*x`v`9fjw0#|1WD|zl;$js%7%Ned_FJ_8dyKr`X zInTAFd?~-oqlNjov&&)#Gyex37A6dZhSw&BL~~5Ec|)Te>3zDAM=K_*-c-+H7d%xqvG2r?Dks-DA4vv1Wc|r?xk%V0jX$P2o&K{gjIw! z1RLQB!a6{atpM(46+1G7Ie336t5eA3B(f^_oooTClgR2Mvg+0Ptm0h%nblXI<;BU? z)KWh0YE^QZRVsFgHl7b{yfC)mCB>9~zwmuCOQ>D0khPg96!x?6 zHyDK>U~Y-KF=%XjqBV<X)z3itAlMaCwEY#X^Yrxr*BZBqykWYvPZ&FDp)`eK9`^{LZ`a{GQ!_ zaZsZUR-P!5Bt2CXNqrI`{;`(w$QMNjwUi%xl5`B=L?dSDj`jN(d-f^x+fFTlvkhXo>ZmyPOwX$cp4$0_|2)7`dx6sE8;hgwzThpiJPxn I_X)244FLW==l}o! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fa4645068b17676dc72d9cb4386dcc870658420 GIT binary patch literal 16440 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πIUY42+9_B9_oDBH>TmJhbmvZdw7 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 DGQ?ZU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f4f3d5da91a2c884ab1f68411937c93bc700f4c GIT binary patch literal 3569 zcmcguO>7&-6`t82?vhK=)(;&~mT6j1+E9s1#CFgYXc`zz6gO^pvFyM+h+S*f(o)ne zF*`IRg9RwVXl%ev95kpBz-WEQ!LAd)KrcP^SfCflKM=cS0S9q`=B7w4U>GgXH?!O& z2-urVR5kpX3pFcJGuQ)4!3;)AIG6aE$rZlFKy%pBj@qs@<-BLvhY!tk{=gdvs0ek-2EugLSp}VS z0jg+VU4kk{5lwJ;AmwDhbz8bS;BT`Xp@0_XMMV4k9ztV?h!~xQ(K=cbPop}{35CgA z%+nlV&6ZqhI5pbsn1p!AI?=0D(+DPe`)pp*skvy;lHu5U5V!9?R>6MC?JW46C&eW*+HX#nVg|?W!&uD(ZrumutN!KK9 ze$u3-oqdZ~hLwNIbmys4%~y$2HYvN+GZizxuw>fj@)he$zPd!`9Q*LW*AC@fi<%Qv zeP&*tHQjvGs^&}QOwf+xXPk;d^aVX{*%r0*ishOIt4m%6w6B^a%LXNFy#mJu2SaYHwYe2&|^#R z=sB@){#6F-HzxIpYi0qcXDikWb+dJg&SiCbDeKTVlVo)=`^FThnNzu>C&I87JEd1@ zK2AN+U2?sM?=-ma@D4Zy!k(M3+w(NG3xJ52`T}9NA?#uZJGZ9>&VUhzh(7>LR@sGxv$J_lWpLwjr-ao&5epN}g()%tapF~h%=(={} zy_@Ep(|?ri#oyi#adZ-25wFCqP5)2A|4>oWLTJz{CF>O2hcrIIXp-x3!!`dd!Pzl zLR~=dUU<}IqzlevCZ`3fd;T1PE0{wNR^byq7jJhi2V<;tBqsPaV!hLt#Ck(sa zvJYkffSZ-Xa-&Ha#HThR%1ZZ1HtttmTn_hkC%|~hyK-a(T`ib8bKP}!F{KM3rPTuc3 z(R{b1^sOuDyMVgXer`m4BmY(A(MWbpO8+Nzn19Se-I@k+9I_t3515%>8pwk9@)`aB zV+h;^`n9kETsOk>hC|4eLT}z34|1h1#5(rzBXF-n#$X4yQVF~yIKuflYqwowB1keI zd03=`=~#m5GJo}V^t6c{OX{UD$Pli5=PslPf++VrR9U8QRegFTa#j7OI|z~&;uH8o zDT98cP2k_e$Hm`?6L<#3!}5Rj9n4C(?fKTlz50&6gZRGVHISc!8u|`q9qrVMzV8S- zzV8_IpEnG7urBl+KZgz^4-$E$_j!5f6hFryrsalQ4xbU0bV~4`Bo6Z({0DQaWxn79 zyk~)Y7kZtf$kW_8r&fWS7UBVDuyGIx@pU}BhKIiqWZbtUB4O_a<2H9ocx*En!TsM1BE0_r%JP%` E8!}zDpa1{> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca648726d30ffa25452e6c47aeec6814aa16f0ab GIT binary patch literal 8145 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1fb330a1a3f6a2cbcaf10764307f8147ecf7a6c GIT binary patch literal 9107 zcmd^FZ)_V!cHbp;S4)Z#B~h{{>rdoZx|o(Fp8v+N6WjVj$%W5rB-p|JTe z6z(!EMq(s3$;_}3mSrTT#3h|GT!dp82Q$P-{4GWjWd4EE=oJwtw*t6g3AciBUBGph za7C%|787yJdv-Ijqk|y=jPC#rJIVa`@O9>fbCS8v2C6o2=m4u%U6$2oTA8{MOG!yN z&Kggo6rYaYO+S#kjB2$>?1Mu2V>aLjXM7V^5=whQNxi1FUr(f@^mSzy3|%og9wH=7 zpvXoQ?9u-G!{AIx4aS4#6`3f(L0Oek?E@qsC4vL8a#c;w24_inT2^~gO5##d4$jQW zscXSx;!<#SUcHh|9qieEAgCl%xqCJizZ$zNE5X^sY%qFFhR2d%Je^FF*i0-4(@e`Ni2J!(GTZh$wCX?H`3dGM(6rQ&WCh< zXe<;8>s(^{a77BG6>|O0b>~KXs;>5VeB+D&jom@m2q`GDO0U%;G8yY0tp8M;)9&j zBWVDl3*phRv%Mp_&^IPLYpg7~ZN9Fo=kbV^Al^lDIUd$_lJENuG+$B~{&}02s!gMbY`_RGP?omDy%g`RFBpof0ms z3Q+~US+BN)jk*v`CN5u5S6H1>LN49bl2xzTg=e=`xCc(qp>pPn7eRya3 zey`ThS*ZWy#?p@#fAn|${QffSm=+Dm47uib^oz0b8L3X`=eW&7FFU0Tvv=mnQpw=#{95xB(f|=S&T{(kWQll1xac z7Ihbqsp^u+qAo2KT0lYjfG*3IsOZUyeoge>QdiVxN0zz4+O0*^T8Va0o&o5MJEE3yQ{QnMFO#X>J`&8_ z0`TJev(8eZ%`+>GaDXMJKmdF^2$|vN6b9O{N*(WH|f) z)G{6uCQ$fw;3yM7z&@4U+?(sZ#=Ngn^L6G1)*G78&;PBmX5CZs*_lty{N(7;$;FeJ zXYXH}`KrJdjAbD=3}wjfD)X7nf@PIk@UmMg8}zLW`KFo zfE1**84!0+5<<~aK+4QF1gxU@P_z$)-Usqh=F2x9*5KngTw=g{%Mq>R$ZGQu&2!`% zO=w{UJjpWQ7*zgS3z3<&Lodg6r#IB)BnM%1W80(paTY+Fh7yKua3Ypx4?`tWWqLN1 zItwfs$)j#+a&N8I`}6g$Y4xw=LV)Gq+Lhnnu%&N{&WrWUdqC*h*1+Pmzy+9v^q`P0 zu&Mv+RSyQ&`v!SJ-fXC&yp_8uJm{_Gxez z8XMCa$E^TxLcXC|kzN5a$O-IriuN#0y=6{^>d*Kr%@+5DacD5N$%20GhVO*e>N|3w zC$&57w%lpS3BRwbf6}n??ho$#AUF6#tjdd>n%H@NYFU0P9{QF@!_ao|jBOWafes3G zu+_68>j2QV(JsU&RTPdb9aBl0=);nbb(!YCuo7TOeivgx|I2g5b9DN}E1x|ECYukr>E2!eh7yzijqJNR&L z&38QS8_|3tIq|8$xN1Lhf8zc;cH8@@dtIz4sdyW6UPIT`8^chRXJgn&J)50pR45zC zPU8jNHAQU0Tku_Lb=YaY+;_5Me-EQ|;-A6+h zYLB93n@!EyG{#{x1!EP&3g2pFGbpsm_sw4XJx%=H{cFoN9*al6zR4lVp{6%~2Lw*2 zK#gRpQ!eWSJTOJ^M)j7ZEQ@VZjs>B_V%ABr zD4gZ8g2evZVcx$X;y?sG2qB~plcwhsHBeDzJ~9E_32qSN9Fli|fDnzt*&8}LU$h)S zL+Z80K(b_+OTqVrHG;`FBv!=@gBqfl2Gg9|*fY>eIS&L@iX8^g_@+bib=-e<&9^Tn zuD5pLIdOT{;s?v`e;HYc{9@P22dgb_u8K_*t_(x322cIA;dkQb*H;nZ3$^t_z~dL% z+Q5G3VkBGKdg1!9Y|dplJDc0u+FsJe+IV;cZ?c!S^CE5c`zMSbK;KuOuk$J+u^ha2YKUmws46=0}6`E#%3o-*T)kX*;w0jmA?Z$ zbiRLdbZkK1IhaT$3s+8~bL#Az+J7ZRVsW^EwrR8C5hH$~NZ~4+X5hA0E+U1_#g$75 z-5ZyaNd@kUq6)pw(tQTwl8on>sDTE$dy1rI;1ruCl3r~HsOhLoVv4Nb>rq@OVvC2i z6h5JOwi}}-04L)trRk0b4 zW}ol>&TV~gq_M*i1 zzol*8?J(Wq{(v#r9!=b{yyKzoVd~e@kHmAOy!yXy`|Gx~{k^|Fu{wV7k@!JjCV%kM z<~@7iD7bv&;gQFlV^4X;W85RhOJfWR9slhA0v%24IA)J#6yy&J1UYyuZXw&w#u%;@IKDuB8i$7nUwAUR<8YclT-CefjPI4L+>{Ht@jZ z_q?U;c`Lu?q_*eeTGJ_nkzM)L16u2WeCr{t_0Y@qF(3L}VCJ#-!M7X@dq5#C`q`&= zG{lY0IAS=cfpu^3U@?(Uld^fa$*Wk~ezA!M10I zgHGLeBm~KWaGej4GGz3kbuds{_M0BT8#rU{>&8+qk^v-m+e3zt;1S#iso%rWMI_Tm zl1OHel>O}Y8uE~|z*jj7w|mFIaGtNZNoE+!#Abj$k%0ia$h{@VhO1d%<&G zI4)?4u=9?2W;df++k=XZMbi}iX~D@dlgvD8{ape4Y9in={8_jTe=$fV;WxZQDmI&l z!cTZA{e54r9)?W>Ud;3O0(RYW(CeHVcL?=RHXNSX3cxP<1KQul* z93CQQQQb8$KPwymU2y7-Daimg37WQFWYo*482n2idJV2KNIEVnN+NZc%!AzDpzIEZnDL)z{`k9Hqf_trn`Y$F|D_?oWuzbVs;lWPGpVOblf7To9^E1Ekd;9h}e-mJVhT&fe!i;h) zP6|q`9G;m?6P0R1H?G@sA$@6Dj;qFh2-@K->B^%oUbZfui*FkLU^qek6y(76#$gra zz_L#{j_v*zuH!#F3|qe?h-^*n+7<)Z)($883YH<;a*sRM&fL@%gZXBXt7RMh`1B&r jh`wixgYDjOuzdGZCzPHm=*Axl2bsSWPdNXPJ>mQ>{3V|N literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..11ec695 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\a' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..abf209e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,277 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL +from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def __setstate__(self, state): + self.__dict__ = state + + def __getstate__(self): + return self.__dict__ + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + # AttributeError in the case that the stream doesn't support being closed + # ValueError for the case that the stream has already been detached when atexit runs + except (AttributeError, ValueError): + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + try: + fd = wrapped.fileno() + except Exception: + fd = -1 + system_has_native_ansi = not on_windows or enable_vt_processing(fd) + have_tty = not self.stream.closed and self.stream.isatty() + need_conversion = conversion_supported and not system_has_native_ansi + + # should we strip ANSI sequences from our output? + if strip is None: + strip = need_conversion or not have_tty + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = need_conversion and have_tty + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command == BEL: + if paramstring.count(";") == 1: + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text + + + def flush(self): + self.wrapped.flush() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..d5fd4b7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py @@ -0,0 +1,121 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +def _wipe_internal_state_for_tests(): + global orig_stdout, orig_stderr + orig_stdout = None + orig_stderr = None + + global wrapped_stdout, wrapped_stderr + wrapped_stdout = None + wrapped_stderr = None + + global atexit_done + atexit_done = False + + global fixed_windows_console + fixed_windows_console = False + + try: + # no-op if it wasn't registered + atexit.unregister(reset_all) + except AttributeError: + # python 2: no atexit.unregister. Oh well, we did our best. + pass + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +def just_fix_windows_console(): + global fixed_windows_console + + if sys.platform != "win32": + return + if fixed_windows_console: + return + if wrapped_stdout is not None or wrapped_stderr is not None: + # Someone already ran init() and it did stuff, so we won't second-guess them + return + + # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the + # native ANSI support in the console as a side-effect. We only need to actually + # replace sys.stdout/stderr if we're in the old-style conversion mode. + new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False) + if new_stdout.convert: + sys.stdout = new_stdout + new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False) + if new_stderr.convert: + sys.stderr = new_stderr + + fixed_windows_console = True + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream + + +# Use this for initial setup as well, to reduce code duplication +_wipe_internal_state_for_tests() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py new file mode 100644 index 0000000..8c5661e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py @@ -0,0 +1 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1be70d8b63027ae913cf8d514fff4d8cc0a3767a GIT binary patch literal 217 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‚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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0757334c6c1e0a2186023a9c0ea9993fb139ff8d GIT binary patch literal 2507 zcmds3&u<$=6rS1j+H1#2)3_lhl+;mLf&+M!RwW1(B)6d{sc;buNbzNHyi2;tde_Ws znr@Xyp>l;PklJ1d|3VZhapS@zXD+SEA=(59i6X(xkt>Bn9C&Yc?Ko+K%9XM9&6{t2 zzHi=}=bzf!69mfH*-xfNB82>gjYg3|rT#4_%S0m@HA$HkC`DZ`g|b)>eO)vog$Q7x zDHSAvj1etTC7Ps*t75Q5A?l-1Kw~XvOsAS$C9B~^1sU4$mUbN4iI#Q(+HEcEHdo9f z|HRoD>UETC%h7K*<)T%b))^r3RfieY^!r!xrEmwoqG6-n1D@V{Y&l9v`IzgBD;IS~ zx6-4`&POS51K zS1LwDQLpQkW;3N^n>H(!i;AOjhbwcAVe)Ln^`ZtZI*xm@vw8MxfW+Zc9Pe_8tRG3$ zK_U5-h$pM6RV?eO>LpaQY-@8S>Pc1oe6DB)JuC@hnT(dE0s(!Y>8~@~!d-4~~ULy_srVDKsBX-ZVcrWS(^Zc+jvEVkmH_7Q?y& z!?0(cHwXX>z*qki#AQOkBOK6zGK0Mb$|7B88KE{kOC#UVWeBPTx;KBX*Ch|cdAdUL z8Nm~5?nUr!G6H)MR`(({Gp0H2l}`IScu||<0M-jwCwx2&;t%rI5_!_res|=~$kOO~ zM_2WHb!;ON_qE$&I~*PQ*6Ue%xPjk6@ADbBXTS_Dd7vx`hZC?5Z4&qIv@8gFd#TMi z0a@$?*cifCnIh46Rq zNjd}vKNc~(AwR-zHT2bI+k5_e_<7zTE*LRPIGqoF`Fh}nI7#N|Gx%VD-nFQ4z<{vAN}j9Ip&LPiPFTJXBW zDsJgok(F5%=Dr3W*FpG!@aw=U)$?DDe=+{>$caah^kzrzSJu+lW;}Io>~Z|~7NJtd z&waz+4?gaD+iz^h?b{-N+t~9&PTWo0NjyvqJd#gtOMui6-t{|u^>2O}cDj|xy-8P- zxgqffDc2|cD1){Z=>>4DPs$C(*9KyU3`w~&u{9+IcqZv3!aoL(Vi|g%Cm1%v=gIe2 zpN1f-`56Eo&OIJ{Ll0z%UHM#)FW+UuFc@8cyC7;JrSx}l>KD?pK@uAz{xmAkWB25z z1gfX9K)dg~g?e{QCPL?y5TU8M2wDxbTGGd2^yLr(t=1J{{Y|Vt#3Xvk$F>B}`~>w6 D9AM#( literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf79223762ff620cb52f9ed3b7e4424594b83a01 GIT binary patch literal 6631 zcmeHMO>7&-6`uVexg=LKYwO>xOeHpK29apViS5Ec4gFbF5lgK_*EKH-io3E%@h`J0 zDCeBQzAG(U7$bIZ(v-&^BYWOg8z&QYT^ zt`*XX?t#9jLNke~Fh*q^$L|?D4u!-RnZ#HWT4o+Y9~POtL(HEL<6+FDxKnVj^(FO< z`W{%zSzP$XC><2pW#i|q+Y64;+RJwUdwFd9{0G2Ku<;WQfS=dKuc7WNe73Pb-I(7t zcBmkR8+3nF!HAY(a{|>L&&0cDlUWVaj`i8zL{$Zb9(bUL*ew7%C||3pn^+3C&C1Li zD_Q+>>>QKARdq$G;+_!AYYv%8yv@y#l;7;F)pJ}*tbLg+nKePekX_d~Ko4M6{bhTs z3!1ysYS{uM*d__PM%QyNxb8vXMj`+SdnvYc|7@S8(d5L8rl@-Ru%Zp*vT81^j3=m~ zWcz0(Clxx9oy_SXRkRtJm2Sn;GYZ8YulwVws!(m{otb!AcS(~usz5an2h(*+DjMh# zuk)&sp47b=Flf-_*`G|B& z$;vqzF~JjoU#h8*Dug8b>dqH*0UIOPq*iPMInk*^am4IB1X8LKKz>A?9cg**+`O=M zylY-q6^^aFH8}4r3$K@i*H?vaJw4R?)51KzCWvLBwIsB@-}v+PhwYEPzbc&CukYx? zqmSaB2&cDT7ou|@U@=IQcV?1QQ9~e;oSRh>7H(k zAutu;SZ&fCHqSZLXtruKNc)wvW0S|hyVyqelvdkQ#_hicybU)>@rc)vXV`D}3EBc} z+KQwNNiz`LdsES*ICue-BJ6bcjiI;S9=oo4uJjELjYj(@raQX3|LVx_ccM!yJ&G$k zfT+km6r#s*TtxE(r-klBEwAqylx0!Wi#>W?ad1>j=s&Elzm77kMnoe$;w)R@0-sB(sKMk?tX5Y6#K6I_0(^2zsi-wp)Y{R zFhe`x7di*S--6q4bPxv;40i_EIZiUOFvzsv3tg2_j4upDwJ!`uMuG5o#BA4U)7cn7 zu&LH>wsr}++k>a`ItR0`2TyPj&g+~E##J-xUDp{YyeW63PN6l_71>?m1t#SgT@S;I z^?yNGNB>Xp#3a^e%=e8pPq;S>`QBb@#X8jjY&XqH1ZQE3k; zbpe%e3aF3_R`=XBsbf->wSXYi@+Fc;$28V4A+^~?fh_S=myH%14SOm+8%3a~Qv*3V zkI9_@721QH2*_=o*hrr)!=#<*6ZZDQ{H<$1ED!wD1^~ksqsqMt-o?(l;yyb6zb@e* ztHpjvC=mJvbnjFl#$KJr#C%^B_QRx|D#YF^z=U2v(g|c+BKkjSIbqXs(1$x%4yGNt z%eV;bb?#nFVvP5UVpDwvV|4!z_^7)XPbGCht07t8#RN|An*x!g>S9Qddm3YdBB5lhqZtuQ&wfl$FEQro&99oSREwwpv%rT_@Qj znY7*JAvm)Y=ebuLcEe3hhCpk0QzQ9p8Mp4)QRQ7Ddo^z0x);N+6sI>;-8~*19J>~! zCqWjcupBT@WAQ1r?|_aqmH-wi1!4=$q22GUPn+A{o2&-mO6Xk`+AUPAiA`m(t0Z=n z#q%Zc{92%;9Ox(oIv(*K27VD(37uJP=y}q+ES~$q#d&=@b5aXjuYB#mC9@w}FMD4b zfK`1=G|cGUTo#^HWQEc_;70opFc#J*MqWAq#6Z;0)vLQAs(Cx2#%1A#oGrBA;FAC z=hT9#3;A?hgB&LV57AnjYU*rKo1(Abq+TTFkz7P_3CR$W5g<#IXlP{06#bP!u%WgC zzVDE~x_rz2S65soHd&7=yu}gs$qj669wzSKBKJVNFP4L+O2JbfxmJSR%V+vmTmzfz z5!Wz-a|f9XqrLeWar;d^LDz*UA82i!*o%))nTl+nx!L%in`=oYx_njXptX6-Cbv1V z$wJF;48~!h&hRe)NeTxkCKMvCb+#q6S@ss?kQ8{ZHsHy_ld?jOnIbMO*L zDf~Ua4JCaSS$+>mClY*1cpT-%>{;m4OZ;IsXo l8?zh{j{Kc4xH44YL&&o8g^J;8QMgEc*U;zZ{@`PP{u@x$jMo4F literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py new file mode 100644 index 0000000..0a20c80 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py @@ -0,0 +1,76 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main + +from ..ansi import Back, Fore, Style +from ..ansitowin32 import AnsiToWin32 + +stdout_orig = sys.stdout +stderr_orig = sys.stderr + + +class AnsiTest(TestCase): + + def setUp(self): + # sanity check: stdout should be a file or StringIO object. + # It will only be AnsiToWin32 if init() has previously wrapped it + self.assertNotEqual(type(sys.stdout), AnsiToWin32) + self.assertNotEqual(type(sys.stderr), AnsiToWin32) + + def tearDown(self): + sys.stdout = stdout_orig + sys.stderr = stderr_orig + + + def testForeAttributes(self): + self.assertEqual(Fore.BLACK, '\033[30m') + self.assertEqual(Fore.RED, '\033[31m') + self.assertEqual(Fore.GREEN, '\033[32m') + self.assertEqual(Fore.YELLOW, '\033[33m') + self.assertEqual(Fore.BLUE, '\033[34m') + self.assertEqual(Fore.MAGENTA, '\033[35m') + self.assertEqual(Fore.CYAN, '\033[36m') + self.assertEqual(Fore.WHITE, '\033[37m') + self.assertEqual(Fore.RESET, '\033[39m') + + # Check the light, extended versions. + self.assertEqual(Fore.LIGHTBLACK_EX, '\033[90m') + self.assertEqual(Fore.LIGHTRED_EX, '\033[91m') + self.assertEqual(Fore.LIGHTGREEN_EX, '\033[92m') + self.assertEqual(Fore.LIGHTYELLOW_EX, '\033[93m') + self.assertEqual(Fore.LIGHTBLUE_EX, '\033[94m') + self.assertEqual(Fore.LIGHTMAGENTA_EX, '\033[95m') + self.assertEqual(Fore.LIGHTCYAN_EX, '\033[96m') + self.assertEqual(Fore.LIGHTWHITE_EX, '\033[97m') + + + def testBackAttributes(self): + self.assertEqual(Back.BLACK, '\033[40m') + self.assertEqual(Back.RED, '\033[41m') + self.assertEqual(Back.GREEN, '\033[42m') + self.assertEqual(Back.YELLOW, '\033[43m') + self.assertEqual(Back.BLUE, '\033[44m') + self.assertEqual(Back.MAGENTA, '\033[45m') + self.assertEqual(Back.CYAN, '\033[46m') + self.assertEqual(Back.WHITE, '\033[47m') + self.assertEqual(Back.RESET, '\033[49m') + + # Check the light, extended versions. + self.assertEqual(Back.LIGHTBLACK_EX, '\033[100m') + self.assertEqual(Back.LIGHTRED_EX, '\033[101m') + self.assertEqual(Back.LIGHTGREEN_EX, '\033[102m') + self.assertEqual(Back.LIGHTYELLOW_EX, '\033[103m') + self.assertEqual(Back.LIGHTBLUE_EX, '\033[104m') + self.assertEqual(Back.LIGHTMAGENTA_EX, '\033[105m') + self.assertEqual(Back.LIGHTCYAN_EX, '\033[106m') + self.assertEqual(Back.LIGHTWHITE_EX, '\033[107m') + + + def testStyleAttributes(self): + self.assertEqual(Style.DIM, '\033[2m') + self.assertEqual(Style.NORMAL, '\033[22m') + self.assertEqual(Style.BRIGHT, '\033[1m') + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py new file mode 100644 index 0000000..91ca551 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py @@ -0,0 +1,294 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from io import StringIO, TextIOWrapper +from unittest import TestCase, main +try: + from contextlib import ExitStack +except ImportError: + # python 2 + from contextlib2 import ExitStack + +try: + from unittest.mock import MagicMock, Mock, patch +except ImportError: + from mock import MagicMock, Mock, patch + +from ..ansitowin32 import AnsiToWin32, StreamWrapper +from ..win32 import ENABLE_VIRTUAL_TERMINAL_PROCESSING +from .utils import osname + + +class StreamWrapperTest(TestCase): + + def testIsAProxy(self): + mockStream = Mock() + wrapper = StreamWrapper(mockStream, None) + self.assertTrue( wrapper.random_attr is mockStream.random_attr ) + + def testDelegatesWrite(self): + mockStream = Mock() + mockConverter = Mock() + wrapper = StreamWrapper(mockStream, mockConverter) + wrapper.write('hello') + self.assertTrue(mockConverter.write.call_args, (('hello',), {})) + + def testDelegatesContext(self): + mockConverter = Mock() + s = StringIO() + with StreamWrapper(s, mockConverter) as fp: + fp.write(u'hello') + self.assertTrue(s.closed) + + def testProxyNoContextManager(self): + mockStream = MagicMock() + mockStream.__enter__.side_effect = AttributeError() + mockConverter = Mock() + with self.assertRaises(AttributeError) as excinfo: + with StreamWrapper(mockStream, mockConverter) as wrapper: + wrapper.write('hello') + + def test_closed_shouldnt_raise_on_closed_stream(self): + stream = StringIO() + stream.close() + wrapper = StreamWrapper(stream, None) + self.assertEqual(wrapper.closed, True) + + def test_closed_shouldnt_raise_on_detached_stream(self): + stream = TextIOWrapper(StringIO()) + stream.detach() + wrapper = StreamWrapper(stream, None) + self.assertEqual(wrapper.closed, True) + +class AnsiToWin32Test(TestCase): + + def testInit(self): + mockStdout = Mock() + auto = Mock() + stream = AnsiToWin32(mockStdout, autoreset=auto) + self.assertEqual(stream.wrapped, mockStdout) + self.assertEqual(stream.autoreset, auto) + + @patch('colorama.ansitowin32.winterm', None) + @patch('colorama.ansitowin32.winapi_test', lambda *_: True) + def testStripIsTrueOnWindows(self): + with osname('nt'): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + self.assertTrue(stream.strip) + + def testStripIsFalseOffWindows(self): + with osname('posix'): + mockStdout = Mock(closed=False) + stream = AnsiToWin32(mockStdout) + self.assertFalse(stream.strip) + + def testWriteStripsAnsi(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + stream.wrapped = Mock() + stream.write_and_convert = Mock() + stream.strip = True + + stream.write('abc') + + self.assertFalse(stream.wrapped.write.called) + self.assertEqual(stream.write_and_convert.call_args, (('abc',), {})) + + def testWriteDoesNotStripAnsi(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + stream.wrapped = Mock() + stream.write_and_convert = Mock() + stream.strip = False + stream.convert = False + + stream.write('abc') + + self.assertFalse(stream.write_and_convert.called) + self.assertEqual(stream.wrapped.write.call_args, (('abc',), {})) + + def assert_autoresets(self, convert, autoreset=True): + stream = AnsiToWin32(Mock()) + stream.convert = convert + stream.reset_all = Mock() + stream.autoreset = autoreset + stream.winterm = Mock() + + stream.write('abc') + + self.assertEqual(stream.reset_all.called, autoreset) + + def testWriteAutoresets(self): + self.assert_autoresets(convert=True) + self.assert_autoresets(convert=False) + self.assert_autoresets(convert=True, autoreset=False) + self.assert_autoresets(convert=False, autoreset=False) + + def testWriteAndConvertWritesPlainText(self): + stream = AnsiToWin32(Mock()) + stream.write_and_convert( 'abc' ) + self.assertEqual( stream.wrapped.write.call_args, (('abc',), {}) ) + + def testWriteAndConvertStripsAllValidAnsi(self): + stream = AnsiToWin32(Mock()) + stream.call_win32 = Mock() + data = [ + 'abc\033[mdef', + 'abc\033[0mdef', + 'abc\033[2mdef', + 'abc\033[02mdef', + 'abc\033[002mdef', + 'abc\033[40mdef', + 'abc\033[040mdef', + 'abc\033[0;1mdef', + 'abc\033[40;50mdef', + 'abc\033[50;30;40mdef', + 'abc\033[Adef', + 'abc\033[0Gdef', + 'abc\033[1;20;128Hdef', + ] + for datum in data: + stream.wrapped.write.reset_mock() + stream.write_and_convert( datum ) + self.assertEqual( + [args[0] for args in stream.wrapped.write.call_args_list], + [ ('abc',), ('def',) ] + ) + + def testWriteAndConvertSkipsEmptySnippets(self): + stream = AnsiToWin32(Mock()) + stream.call_win32 = Mock() + stream.write_and_convert( '\033[40m\033[41m' ) + self.assertFalse( stream.wrapped.write.called ) + + def testWriteAndConvertCallsWin32WithParamsAndCommand(self): + stream = AnsiToWin32(Mock()) + stream.convert = True + stream.call_win32 = Mock() + stream.extract_params = Mock(return_value='params') + data = { + 'abc\033[adef': ('a', 'params'), + 'abc\033[;;bdef': ('b', 'params'), + 'abc\033[0cdef': ('c', 'params'), + 'abc\033[;;0;;Gdef': ('G', 'params'), + 'abc\033[1;20;128Hdef': ('H', 'params'), + } + for datum, expected in data.items(): + stream.call_win32.reset_mock() + stream.write_and_convert( datum ) + self.assertEqual( stream.call_win32.call_args[0], expected ) + + def test_reset_all_shouldnt_raise_on_closed_orig_stdout(self): + stream = StringIO() + converter = AnsiToWin32(stream) + stream.close() + + converter.reset_all() + + def test_wrap_shouldnt_raise_on_closed_orig_stdout(self): + stream = StringIO() + stream.close() + with \ + patch("colorama.ansitowin32.os.name", "nt"), \ + patch("colorama.ansitowin32.winapi_test", lambda: True): + converter = AnsiToWin32(stream) + self.assertTrue(converter.strip) + self.assertFalse(converter.convert) + + def test_wrap_shouldnt_raise_on_missing_closed_attr(self): + with \ + patch("colorama.ansitowin32.os.name", "nt"), \ + patch("colorama.ansitowin32.winapi_test", lambda: True): + converter = AnsiToWin32(object()) + self.assertTrue(converter.strip) + self.assertFalse(converter.convert) + + def testExtractParams(self): + stream = AnsiToWin32(Mock()) + data = { + '': (0,), + ';;': (0,), + '2': (2,), + ';;002;;': (2,), + '0;1': (0, 1), + ';;003;;456;;': (3, 456), + '11;22;33;44;55': (11, 22, 33, 44, 55), + } + for datum, expected in data.items(): + self.assertEqual(stream.extract_params('m', datum), expected) + + def testCallWin32UsesLookup(self): + listener = Mock() + stream = AnsiToWin32(listener) + stream.win32_calls = { + 1: (lambda *_, **__: listener(11),), + 2: (lambda *_, **__: listener(22),), + 3: (lambda *_, **__: listener(33),), + } + stream.call_win32('m', (3, 1, 99, 2)) + self.assertEqual( + [a[0][0] for a in listener.call_args_list], + [33, 11, 22] ) + + def test_osc_codes(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout, convert=True) + with patch('colorama.ansitowin32.winterm') as winterm: + data = [ + '\033]0\x07', # missing arguments + '\033]0;foo\x08', # wrong OSC command + '\033]0;colorama_test_title\x07', # should work + '\033]1;colorama_test_title\x07', # wrong set command + '\033]2;colorama_test_title\x07', # should work + '\033]' + ';' * 64 + '\x08', # see issue #247 + ] + for code in data: + stream.write(code) + self.assertEqual(winterm.set_title.call_count, 2) + + def test_native_windows_ansi(self): + with ExitStack() as stack: + def p(a, b): + stack.enter_context(patch(a, b, create=True)) + # Pretend to be on Windows + p("colorama.ansitowin32.os.name", "nt") + p("colorama.ansitowin32.winapi_test", lambda: True) + p("colorama.win32.winapi_test", lambda: True) + p("colorama.winterm.win32.windll", "non-None") + p("colorama.winterm.get_osfhandle", lambda _: 1234) + + # Pretend that our mock stream has native ANSI support + p( + "colorama.winterm.win32.GetConsoleMode", + lambda _: ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ) + SetConsoleMode = Mock() + p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) + + stdout = Mock() + stdout.closed = False + stdout.isatty.return_value = True + stdout.fileno.return_value = 1 + + # Our fake console says it has native vt support, so AnsiToWin32 should + # enable that support and do nothing else. + stream = AnsiToWin32(stdout) + SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) + self.assertFalse(stream.strip) + self.assertFalse(stream.convert) + self.assertFalse(stream.should_wrap()) + + # Now let's pretend we're on an old Windows console, that doesn't have + # native ANSI support. + p("colorama.winterm.win32.GetConsoleMode", lambda _: 0) + SetConsoleMode = Mock() + p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) + + stream = AnsiToWin32(stdout) + SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) + self.assertTrue(stream.strip) + self.assertTrue(stream.convert) + self.assertTrue(stream.should_wrap()) + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py new file mode 100644 index 0000000..89f9b07 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py @@ -0,0 +1,189 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main, skipUnless + +try: + from unittest.mock import patch, Mock +except ImportError: + from mock import patch, Mock + +from ..ansitowin32 import StreamWrapper +from ..initialise import init, just_fix_windows_console, _wipe_internal_state_for_tests +from .utils import osname, replace_by + +orig_stdout = sys.stdout +orig_stderr = sys.stderr + + +class InitTest(TestCase): + + @skipUnless(sys.stdout.isatty(), "sys.stdout is not a tty") + def setUp(self): + # sanity check + self.assertNotWrapped() + + def tearDown(self): + _wipe_internal_state_for_tests() + sys.stdout = orig_stdout + sys.stderr = orig_stderr + + def assertWrapped(self): + self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped') + self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped') + self.assertTrue(isinstance(sys.stdout, StreamWrapper), + 'bad stdout wrapper') + self.assertTrue(isinstance(sys.stderr, StreamWrapper), + 'bad stderr wrapper') + + def assertNotWrapped(self): + self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped') + self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped') + + @patch('colorama.initialise.reset_all') + @patch('colorama.ansitowin32.winapi_test', lambda *_: True) + @patch('colorama.ansitowin32.enable_vt_processing', lambda *_: False) + def testInitWrapsOnWindows(self, _): + with osname("nt"): + init() + self.assertWrapped() + + @patch('colorama.initialise.reset_all') + @patch('colorama.ansitowin32.winapi_test', lambda *_: False) + def testInitDoesntWrapOnEmulatedWindows(self, _): + with osname("nt"): + init() + self.assertNotWrapped() + + def testInitDoesntWrapOnNonWindows(self): + with osname("posix"): + init() + self.assertNotWrapped() + + def testInitDoesntWrapIfNone(self): + with replace_by(None): + init() + # We can't use assertNotWrapped here because replace_by(None) + # changes stdout/stderr already. + self.assertIsNone(sys.stdout) + self.assertIsNone(sys.stderr) + + def testInitAutoresetOnWrapsOnAllPlatforms(self): + with osname("posix"): + init(autoreset=True) + self.assertWrapped() + + def testInitWrapOffDoesntWrapOnWindows(self): + with osname("nt"): + init(wrap=False) + self.assertNotWrapped() + + def testInitWrapOffIncompatibleWithAutoresetOn(self): + self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False)) + + @patch('colorama.win32.SetConsoleTextAttribute') + @patch('colorama.initialise.AnsiToWin32') + def testAutoResetPassedOn(self, mockATW32, _): + with osname("nt"): + init(autoreset=True) + self.assertEqual(len(mockATW32.call_args_list), 2) + self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True) + self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True) + + @patch('colorama.initialise.AnsiToWin32') + def testAutoResetChangeable(self, mockATW32): + with osname("nt"): + init() + + init(autoreset=True) + self.assertEqual(len(mockATW32.call_args_list), 4) + self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True) + self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True) + + init() + self.assertEqual(len(mockATW32.call_args_list), 6) + self.assertEqual( + mockATW32.call_args_list[4][1]['autoreset'], False) + self.assertEqual( + mockATW32.call_args_list[5][1]['autoreset'], False) + + + @patch('colorama.initialise.atexit.register') + def testAtexitRegisteredOnlyOnce(self, mockRegister): + init() + self.assertTrue(mockRegister.called) + mockRegister.reset_mock() + init() + self.assertFalse(mockRegister.called) + + +class JustFixWindowsConsoleTest(TestCase): + def _reset(self): + _wipe_internal_state_for_tests() + sys.stdout = orig_stdout + sys.stderr = orig_stderr + + def tearDown(self): + self._reset() + + @patch("colorama.ansitowin32.winapi_test", lambda: True) + def testJustFixWindowsConsole(self): + if sys.platform != "win32": + # just_fix_windows_console should be a no-op + just_fix_windows_console() + self.assertIs(sys.stdout, orig_stdout) + self.assertIs(sys.stderr, orig_stderr) + else: + def fake_std(): + # Emulate stdout=not a tty, stderr=tty + # to check that we handle both cases correctly + stdout = Mock() + stdout.closed = False + stdout.isatty.return_value = False + stdout.fileno.return_value = 1 + sys.stdout = stdout + + stderr = Mock() + stderr.closed = False + stderr.isatty.return_value = True + stderr.fileno.return_value = 2 + sys.stderr = stderr + + for native_ansi in [False, True]: + with patch( + 'colorama.ansitowin32.enable_vt_processing', + lambda *_: native_ansi + ): + self._reset() + fake_std() + + # Regular single-call test + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(sys.stdout, prev_stdout) + if native_ansi: + self.assertIs(sys.stderr, prev_stderr) + else: + self.assertIsNot(sys.stderr, prev_stderr) + + # second call without resetting is always a no-op + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(sys.stdout, prev_stdout) + self.assertIs(sys.stderr, prev_stderr) + + self._reset() + fake_std() + + # If init() runs first, just_fix_windows_console should be a no-op + init() + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(prev_stdout, sys.stdout) + self.assertIs(prev_stderr, sys.stderr) + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py new file mode 100644 index 0000000..0f84e4b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py @@ -0,0 +1,57 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main + +from ..ansitowin32 import StreamWrapper, AnsiToWin32 +from .utils import pycharm, replace_by, replace_original_by, StreamTTY, StreamNonTTY + + +def is_a_tty(stream): + return StreamWrapper(stream, None).isatty() + +class IsattyTest(TestCase): + + def test_TTY(self): + tty = StreamTTY() + self.assertTrue(is_a_tty(tty)) + with pycharm(): + self.assertTrue(is_a_tty(tty)) + + def test_nonTTY(self): + non_tty = StreamNonTTY() + self.assertFalse(is_a_tty(non_tty)) + with pycharm(): + self.assertFalse(is_a_tty(non_tty)) + + def test_withPycharm(self): + with pycharm(): + self.assertTrue(is_a_tty(sys.stderr)) + self.assertTrue(is_a_tty(sys.stdout)) + + def test_withPycharmTTYOverride(self): + tty = StreamTTY() + with pycharm(), replace_by(tty): + self.assertTrue(is_a_tty(tty)) + + def test_withPycharmNonTTYOverride(self): + non_tty = StreamNonTTY() + with pycharm(), replace_by(non_tty): + self.assertFalse(is_a_tty(non_tty)) + + def test_withPycharmNoneOverride(self): + with pycharm(): + with replace_by(None), replace_original_by(None): + self.assertFalse(is_a_tty(None)) + self.assertFalse(is_a_tty(StreamNonTTY())) + self.assertTrue(is_a_tty(StreamTTY())) + + def test_withPycharmStreamWrapped(self): + with pycharm(): + self.assertTrue(AnsiToWin32(StreamTTY()).stream.isatty()) + self.assertFalse(AnsiToWin32(StreamNonTTY()).stream.isatty()) + self.assertTrue(AnsiToWin32(sys.stdout).stream.isatty()) + self.assertTrue(AnsiToWin32(sys.stderr).stream.isatty()) + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py new file mode 100644 index 0000000..472fafb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py @@ -0,0 +1,49 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from contextlib import contextmanager +from io import StringIO +import sys +import os + + +class StreamTTY(StringIO): + def isatty(self): + return True + +class StreamNonTTY(StringIO): + def isatty(self): + return False + +@contextmanager +def osname(name): + orig = os.name + os.name = name + yield + os.name = orig + +@contextmanager +def replace_by(stream): + orig_stdout = sys.stdout + orig_stderr = sys.stderr + sys.stdout = stream + sys.stderr = stream + yield + sys.stdout = orig_stdout + sys.stderr = orig_stderr + +@contextmanager +def replace_original_by(stream): + orig_stdout = sys.__stdout__ + orig_stderr = sys.__stderr__ + sys.__stdout__ = stream + sys.__stderr__ = stream + yield + sys.__stdout__ = orig_stdout + sys.__stderr__ = orig_stderr + +@contextmanager +def pycharm(): + os.environ["PYCHARM_HOSTED"] = "1" + non_tty = StreamNonTTY() + with replace_by(non_tty), replace_original_by(non_tty): + yield + del os.environ["PYCHARM_HOSTED"] diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py new file mode 100644 index 0000000..d0955f9 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py @@ -0,0 +1,131 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main, skipUnless + +try: + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch + +from ..winterm import WinColor, WinStyle, WinTerm + + +class WinTermTest(TestCase): + + @patch('colorama.winterm.win32') + def testInit(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 7 + 6 * 16 + 8 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + self.assertEqual(term._fore, 7) + self.assertEqual(term._back, 6) + self.assertEqual(term._style, 8) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testGetAttrs(self): + term = WinTerm() + + term._fore = 0 + term._back = 0 + term._style = 0 + self.assertEqual(term.get_attrs(), 0) + + term._fore = WinColor.YELLOW + self.assertEqual(term.get_attrs(), WinColor.YELLOW) + + term._back = WinColor.MAGENTA + self.assertEqual( + term.get_attrs(), + WinColor.YELLOW + WinColor.MAGENTA * 16) + + term._style = WinStyle.BRIGHT + self.assertEqual( + term.get_attrs(), + WinColor.YELLOW + WinColor.MAGENTA * 16 + WinStyle.BRIGHT) + + @patch('colorama.winterm.win32') + def testResetAll(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 1 + 2 * 16 + 8 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + + term.set_console = Mock() + term._fore = -1 + term._back = -1 + term._style = -1 + + term.reset_all() + + self.assertEqual(term._fore, 1) + self.assertEqual(term._back, 2) + self.assertEqual(term._style, 8) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testFore(self): + term = WinTerm() + term.set_console = Mock() + term._fore = 0 + + term.fore(5) + + self.assertEqual(term._fore, 5) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testBack(self): + term = WinTerm() + term.set_console = Mock() + term._back = 0 + + term.back(5) + + self.assertEqual(term._back, 5) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testStyle(self): + term = WinTerm() + term.set_console = Mock() + term._style = 0 + + term.style(22) + + self.assertEqual(term._style, 22) + self.assertEqual(term.set_console.called, True) + + @patch('colorama.winterm.win32') + def testSetConsole(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 0 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + term.windll = Mock() + + term.set_console() + + self.assertEqual( + mockWin32.SetConsoleTextAttribute.call_args, + ((mockWin32.STDOUT, term.get_attrs()), {}) + ) + + @patch('colorama.winterm.win32') + def testSetConsoleOnStderr(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 0 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + term.windll = Mock() + + term.set_console(on_stderr=True) + + self.assertEqual( + mockWin32.SetConsoleTextAttribute.call_args, + ((mockWin32.STDERR, term.get_attrs()), {}) + ) + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..841b0e2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py @@ -0,0 +1,180 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + _GetConsoleMode = windll.kernel32.GetConsoleMode + _GetConsoleMode.argtypes = [ + wintypes.HANDLE, + POINTER(wintypes.DWORD) + ] + _GetConsoleMode.restype = wintypes.BOOL + + _SetConsoleMode = windll.kernel32.SetConsoleMode + _SetConsoleMode.argtypes = [ + wintypes.HANDLE, + wintypes.DWORD + ] + _SetConsoleMode.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) + + def GetConsoleMode(handle): + mode = wintypes.DWORD() + success = _GetConsoleMode(handle, byref(mode)) + if not success: + raise ctypes.WinError() + return mode.value + + def SetConsoleMode(handle, mode): + success = _SetConsoleMode(handle, mode) + if not success: + raise ctypes.WinError() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..aad867e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py @@ -0,0 +1,195 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +try: + from msvcrt import get_osfhandle +except ImportError: + def get_osfhandle(_): + raise OSError("This isn't windows!") + + +from . import win32 + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) + + +def enable_vt_processing(fd): + if win32.windll is None or not win32.winapi_test(): + return False + + try: + handle = get_osfhandle(fd) + mode = win32.GetConsoleMode(handle) + win32.SetConsoleMode( + handle, + mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ) + + mode = win32.GetConsoleMode(handle) + if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING: + return True + # Can get TypeError in testsuite where 'fd' is a Mock() + except (OSError, TypeError): + return False diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..e999438 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.3.8' + + +class DistlibException(Exception): + pass + + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + + class NullHandler(logging.Handler): + + def handle(self, record): + pass + + def emit(self, record): + pass + + def createLock(self): + self.lock = None + + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ded75a5a87e4fbb5bf08ac3efbd2a57cb9ccf0b1 GIT binary patch literal 1288 zcmaJ=%}d-+5TBRL#?7wZR%@+aMK4Qn(^d)|N=v&K?+$`iaKX3Kd`OE*-e9cf#o{+Y$8hO zx>GE3U60bbUUtnjoAg#)UtKHOwVNZT62#T2R(1l-&|dpo_}U8|aA$NzSf-`TaDOFm zJ)bJ2p_#Sn zG+nnGE70|v7YZ41V?pisNfbM9E~kXruxDA6$*N_$!|2_dg~@iHkT4~b zGCh7F8OqtD$e@#f+_|-g6ICkW5JEU&d67c>NQz{i+ixR9aKja*Pf??zf+!d%OK~Mz z-8ZVr)oguuU!@+l;k>mo?&1G{f@l{*iVoCn;mEvf1zVjrQOI(SB6>*Bh>QjuP)D)> z#Qk)mLjT|$=wy#q2r(FrQ?^}WCCfx7+I@CV!Nf1<&>g~j${%(QX4s}Uh}+0BXW*1b7jvJ!K@Ijh+68biPRDg<}n8saiNhy z3Au>UMboVN{8i&s>RIixJQoizFU`qcLQzRD#;WbWI=;8}Zf7nP#?-y=5^$@e+St%H zd8{%F>HE8P&(wiab>QRF7j=AFIS1tox=x{M|KY*JR~Y?W8G%&K1!UOJrK~20_DYBD dzWWPMtt8QS6;I_rnU>&08kinQoD4IRe*ne76fXb( literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2acec720fef33007f9e7b2b88de49a3f83ff13ad GIT binary patch literal 45624 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 DodPR+ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4a72c15ec7a758a850bc7ffce526bd05e1fe717 GIT binary patch literal 66046 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 as%n40VpYHEIV^HN5(9_3oj>a0k^V1S8vb|y literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dddf7ac984406a56b169d2c6736b72d2b5987446 GIT binary patch literal 60177 zcmce<33MFEc_vu*fvQ3kP=)&{+$a(U0fHBJlORYouU3<~pl+dy$N~rumof_^Q7Wiu zSssHDwGFi7M_|+*f>Q4z=x$F#mgb2Xd#sk!wp!Bc8pQ&Q>RNb~wl(9YIo?B)y>d_M z?RvjI@$b69d$-*wmUMJGSdOdP#hE$F zkbBtE?LjMM&N`Gm?Ctgr`?`I@Io&zKx!t+L{%-$ppgS;}*PS<<-<>~P&|NTG*j+SS z++93e(p@rK+Fd$a)?LQx+lI=AE4nL&gWbX5%I->*XCJB>uI{cLuIa8}*Nμkxd+ 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7e770cb33f435201944f2ed394e75bab4f24666 GIT binary patch literal 15144 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38ca57fb63522cf64e1ace30223939748aa61405 GIT binary patch literal 7701 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 Bx%mJ9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0878b3e11a62b0cec75fb74f857ec2456c0bc2ec GIT binary patch literal 19599 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5caae3b306c0952480096515ae21703615d797a9 GIT binary patch literal 88275 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa1099241978b9cf95a581e65b5f0e476d80e6d0 GIT binary patch literal 30385 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 Rm|lpg6_#bCmQQD+@IOa!^ke`4 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..e93dc27 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1138 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import shutil +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, HTTPHandler, + HTTPRedirectHandler, build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + # Leaving this around for now, in case it needs resurrecting in some way + # _userprog = None + # def splituser(host): + # """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + # global _userprog + # if _userprog is None: + # import re + # _userprog = re.compile('^(.*)@(.*)$') + + # match = _userprog.match(host) + # if match: return match.group(1, 2) + # return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + from urllib.parse import (urlparse, urlunparse, urljoin, quote, unquote, + urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, HTTPBasicAuthHandler, + HTTPPasswordMgr, HTTPHandler, + HTTPRedirectHandler, build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + + class CertificateError(ValueError): + pass + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" % + (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" % + (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if os.curdir not in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if normdir not in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + + +import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections.abc import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format( + filename, encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format( + filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, + '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' + A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[ + key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__( + key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union( + *self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError( + 'Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError( + 'Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover + # {{{ http://code.activestate.com/recipes/576693/ (r9) + # Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. + # Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % + len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args), )) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: + _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__, ) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items, ), inst_dict) + return self.__class__, (items, ) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self) == len( + other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext': 'ext_convert', + 'cfg': 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int( + idx + ) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + # rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance( + value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance( + value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..eb3765f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1359 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + +__all__ = [ + 'Distribution', 'BaseInstalledDistribution', 'InstalledDistribution', + 'EggInfoDistribution', 'DistributionPath' +] + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + try: + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [ + METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME + ] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join( + entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, + scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, + metadata=metadata, + env=self) + elif self._include_egg and entry.endswith( + ('.egg-info', '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + except Exception as e: + msg = 'Unable to read distribution at %s, perhaps due to bad metadata: %s' + logger.warning(msg, r.path, e) + import warnings + warnings.warn(msg % (r.path, e), stacklevel=2) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + reqts = getattr(md, req_attr) + logger.debug('%s: got requirements %r from metadata: %r', self.name, + req_attr, reqts) + return set( + md.get_requirements(reqts, extras=self.extras, env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and self.version == other.version + and self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find(LEGACY_METADATA_FILENAME) + if r is None: + raise ValueError('no %s found in %s' % + (METADATA_FILENAME, path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read().decode('utf-8') + self.modules = data.splitlines() + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + # base_location = os.path.dirname(self.path) + # base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + # if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix + and path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append( + (path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) + and self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + # sectioned files have bare newlines (separating sections) + if not line: # pragma: no cover + continue + if line.startswith('['): # pragma: no cover + logger.warning( + 'Unexpected line: quitting requirement scan: %r', line) + break + r = parse_requirement(line) + if not r: # pragma: no cover + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: # pragma: no cover + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode( + 'utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '' % (self.name, self.version, + self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + # otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) + and self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + # self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if label is not None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires + | dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + in finding the dependencies. + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = set() # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + seen = set(t[0] for t in todo) # already added to todo + + while todo: + d = todo.pop()[0] + req.add(d) + pred_list = graph.adjacency_list[d] + for pred in pred_list: + d = pred[0] + if d not in req and d not in seen: + seen.add(d) + todo.append(pred) + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..56cd286 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,508 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: # pragma: no cover + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.org/pypi' +DEFAULT_REALM = 'pypi' + + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from .util import _get_pypirc_command as cmd + return cmd() + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils. This populates + ``username``, ``password``, ``realm`` and ``url`` attributes from the + configuration. + """ + from .util import _load_pypirc + cfg = _load_pypirc(self) + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + """ + self.check_credentials() + from .util import _store_pypirc + _store_pypirc(self) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): # pragma: no cover + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, keystore=None): # pragma: no cover + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): # pragma: no cover + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): # pragma: no cover + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): # pragma: no cover + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..f9f0788 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py @@ -0,0 +1,1303 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata, MetadataInvalidError +from .util import (cached_property, ensure_slash, split_filename, get_project_data, + parse_requirement, parse_name_and_version, ServerProxy, + normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.org/pypi' + + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + try: + return client.list_packages() + finally: + client('close')() + + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: # pragma: no cover + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: # pragma: no cover + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + is_downloadable = basename.endswith(self.downloadable_extensions) + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme == 'https', 'pypi.org' in t.netloc, + is_downloadable, is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at a "digests" dictionary + or keys of the form 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + if 'digests' in info: + digests = info['digests'] + for algo in ('sha256', 'md5'): + if algo in digests: + result = (algo, digests[algo]) + break + if not result: + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + pass # logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + # urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(b)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.daemon = True + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + # logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 440. +default_locator = AggregatingLocator( + # JSONLocator(), # don't use as PEP 426 is withdrawn + SimpleScrapingLocator('https://pypi.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + # import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..420dcf1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py @@ -0,0 +1,384 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + + +class Manifest(object): + """ + A list of files built by exploring the filesystem and filtered by applying various + patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + self._exclude_pattern(pattern, anchor=True) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + self._exclude_pattern(pattern, anchor=False) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + self._exclude_pattern(pattern, prefix=thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects

      MqYVw&5O{3{l{IF NCoErZ?8O$({{wA0q2~Yq literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5423b3b9576776c8caa7f54511c91a2abbd0869 GIT binary patch literal 221 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 MhUs`pu%@K@ADyz+C;$Ke literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b0ea65c82849e239569e26c6f44359eaa8906d3 GIT binary patch literal 1898 zcmZ`)&2Jk;6rb_#dTqy>kETi^rH~aV2}X*S(3VQ5E!4D45zt0)i&S4$Ywsl9WWO{s zj_b&Q3UQzkqT&Px4!xrG58&g}oGNiil}fEvAXP#=a7#&0P`L1B?R98XCd$mbd2inS z=Dpv0{zcPr2*%9v$BSPn2>mXEWMsOV?K*6}K{l!&8`~)tS1_!SoARWJgvFWc%AQhD z;=SUgJ+-2GnMx*>({9$wRdVrOb^E-0B@g=yQS2;{>>SbTKB6sT?EL3)rN5ObXsgFQ zBHXeqZt07}C)DCj;OlO%=+yLufa)x0&>GQghjHpu8$!#9xjzKhiv=8wlp2m}m#o?{ z@$Cyiu>79ox`cveFxH&&R~#Dn9`Si06^*^`GY$svN6L+ANP`+->>Q;5jYbn7vppQ= zEypD`I2)r4AHbPShu2LOI|N&J;at#+VAstwO{ zTo$D%;SK87q;9;$qQbwBw->O8J%_n7LT21$EW!CYtD8Lcs=e{6!FJb<1~{$8?*p8t{(Ty5s9}=jQa|Gbf6xluE&FhZGeo^aypXQ^X5##zFac@P@$!}%GXIaQY! zUJEMAaGk0Vws<}8j}~X%G?>H5bT=N%2%XR{9iKzME!PObZeL+W{7NGMS`1s!P`B;u zhl3slbb_qxCz!6Ioqlxa$VTDqdzT-K%wNCsc=(lv!&CQ%r>=kaID6nJ$|_~NlR*cj zH>T$|hss~1A87|4YLoZ1$y+O%TJb58vt_)MlC&~@G(P!oeD?nM?7jTv_?55oyNb~5 z_QftnP`>}>i5n+wp1g7L+x#tev+wAJeDv=f6&*DGL>R9BI#T?h`Cw%B-j$8P`G2+~ zakjUs#{T24>~&mi#hCWkI{^Q?mr7I8kGM3Z{5*8#lzdmqfPD8tjmkNOoOU!Df9*DZQZ<1|roo?Vx6w^dPv4#vrssa|OC>Kp}ixN}6?Oy^M+; z79EN$lHeD6y^zX6JNm4aT&s~VZtDLb-OJC~K+|_wai7N>Vjq5y5r;l3c-AQc34Sx; zWPXpf;oFFg!L*k-367FQqCAZ2$lO literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03d4572b30ce08d23e7c628b3b9929e78c2eceb2 GIT binary patch literal 1932 zcmZ`)-EUMy6rZ`DyW71jv{)L7_C~OEjqC+MNJv3h`4SZf1ta@%b9e8wd)xb!nc0?Y zwn~g9l9&*m^uY&S4g3Kb6BGJG;tK>4$c-i>h6mq@t*NOmp1Hes`3TNtXXeZ~bLKba z{N~(W4Wodd?V0;{W?4n(4Ost37hE|oPu9~7#Ebguh-L9tqdd5)-Vp2%*27;YairgLub3#HoMl1j$nzK;lZ zT!%a63<(K!xEF<{AI*4mb2_3Xi<-1fOxI(adbOs|vU1^10rqqWC&QJd=erfBK1V|L zWE9Q4=lDLMpxKmaj)n6cjlzJ0yd))~?}v;;cEY!-W|5WrSvhJe~QPlEWUM@gMWw3Xy*0+da{`9!aEpe4Es*Ytdr zXq50K4eN3@-eS<a3UaMZcS9Vg?xno6HMmK&&^M&|?8JUBc?XJK~yNXr4WG*4)2;cezk7p`AJF6F6s&xsN{yg^0!lg+Hhce}&p zWJjDHL+lKb4KL2_lDB&<6`Z1)@E}DjQD!4AEaj-+3KhwseL^+R^T2}`Zk`l-3qsPm z2NuOM_QL7N7ON@|?~VzeBA%jcd}#$Cx9ZjfMkuq66HY?&DD_;=I!f3ak76smJ3kUK z529iPEqG;?@71ih#T!w$x4h>qi+P;v>V||_u@_sm7jg)`<6BYOtuf3>FKYFGW|1z( ztz=ub77;sJ?Zt?02fTvH>=)=RqqTmtb?5EU!CU9=4WGMw=Hbw*_lG9#3{71A@L_)N zG3ryN@LCQH?s`x>xGGD7g|D;~4fVft-x$ARj9;6-Ym^@&B|n8%B-xn455~stkDaTyINmR+ve4JgixiYk|EO)avNlzY{ZDndK*td?A=lQ=E=Pf_ueXKmoK;Ir}*f_E6d z{Y6F`Dz#u==Y7cVRY?>216qZ%5gmnYBR2_ewds??bR0xcNZCo~AeF*rEC-CoR|B5z(_dOUGTam^1#=D*IgVX8wP|dBWuufkCXa4~wJr|Y$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f07debc6638cfe2a67e32f4c6f4a9e6964eee76 GIT binary patch literal 3083 zcmaJ@U2NOd6~31uB~qgPBHM8sCuW?qwYFNS+ht80V?YEqMGM|9D@ zoWK|b-Jf&LJ@@B)-#zz_$z&YCH?j1s>W@T({?0nVC-)jVzk|ldNJnL)W1TZ`8T&O? z=Ae$4kvd=IG1Kv;P>+_Qep@hOb+IhgrLt6ym*c)HY9{J(S@zp8Gg(iSQ+``C)AdX_ zgAs=au8jr@cvO=^H*mLC&gl~A)8nLXk=GO7=ga-NOn5yBvK0K&WI)gK^s=4>{oxfZ zf2ehCmbewY;#QO@u?VfWhHWXPT{Sdi(WZ(?sugWTaqK45h@u;gOO1slGja;?FWAg; zdF*9MO~ce*vfeVNZPkh8f=sp>#8RDxVS(Fx#LK>7Ic~)?{TW`O)TZ9i{i6BiLW9~G zah$GlFj&~j;kqtV43p^K`&hlQL{x{k&4z2+rlXQ-RW+THdC5V!* zk$Pj=phRN5_G^gRl0t@ejDGgFIU0z@BqbZY&s~b8Yk!^iwXdeiyq^plgRx zJ+d^75FOe#j;|#GyGQk-Rqpc_s%rtLLkU8)^uA87*+y+n7mh&hM(-r%VYe9mt9TjZ zqpiXP!_t+Cr4%42<18o"Lw#jun&!`_>PmK55xlsS9fsL%+2*aVj_@Cz1(*7&SV ziQ-;?Ic$sk{}JC^rEHmb(c^5#iAEE3ZJ-p~ii-0|=QU`o8TqugN_g=AXxkat`x-z@Wfv- zvmbru*Oz`<{!RH-;?JjNewf|N%&xrx#orQrpQT1NM@zTP-umjMGPjkwxG7$|AB%r* z_Pux3@t_^!-?69kJeV~-#f5k)LN&aqBI1Ml9lUQx6sQ#(PyBCe>$H;JOxGjk8 z#dO%WVLIA=F2SYTWoV3+Z3*ty|AuZd%rU|H>GH%;Zx}UJ0&$KV|jEq&(%cWZ=_y za1Fhd=RAH1$l_(Hro8|OVnwZ2Ea06E8aeRcV=radY7=O!YPPj#R9nZsNlBwZ+4SK8 z$AXRKTZ3Ifhg%O91bHu_E$g1F*>#vpS9RiOUM$Fpkf?gA1%(gsxqRGIpho zXjUmB5A9Xvg-`mtM2A@WC@Y3paf}tmS-~C-9?x{fEJgCuDl ze^TvmViLrek?p?0?ZMIQ6X&*vPyS01vWFfD%;I5$4ci?;^3eLTTZv~j`DgyUE1|yP zmk6_g1BFkPKOK1a53g@#F8{X^VY0o4SvIme!`=Z7_MG#utKZ9|(a7xtE)58`lj-wk z_}j-sCOIROaWz})3N-Z7gJT;)>IXe41^Dm zLRt3o4g&-W;gwzpZ$8TIB5&w%t!5g99yT05(B9zV2IOsxH2l|>pST`Dz&rK0Aw1Dc zr?BsZt!Qs2o&>d-L{mhnhYAxD{%6MX3>maDEYdfs!9Df>* vZKp>%5vV`U4Ri#kJ5iMF>%>?~MCn{dVy!qzWjhJhl2KIJO+t%K!lM2Mnj|tY literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f22598b70526de9cb45f7adb74f1bc941737ef50 GIT binary patch literal 1702 zcmZuxO>7fK6rR~1+v`8_L!b_b4oyNa4c?{^B}FL`DMT%*0MQ=_OK9bIC(b(S-R;ac z!I5ccRaJ@9iX%u>rCbp`aOkm@aP1{gkVuzSLTWkm<~B%3^wKx$*r8Qtwe#Ma_vX#} z`DT8~WReKR*!;(paSfs0q|h0u9cKGeU~VBB+1N$JHpN8@vf?T=wWwmbrn*{9FX|Dm zxv^Tj7{^FK6jggV4tFUv?&7voOxik4*)giyai9tK4XV;q4%D+rJNcznOgC^o^@lXS zkjG)-VjvvfE4je$o2ommJyj~tQ_p_a_vha!xh`d(Il$_kN13(gh&hV~P9)SQ=cNh_ zHLp~oVSJ{&FYK#PQL;;-WZ4d*W#O|%s0&&P>@dcts57q&rRk0sa4P)Umm!5)sHxmg z&Z94|fkfA&D)s*vw$fDZD(yv#gx*oxY7>2nZ0$R>QXq>xNrqP`Ub;_8}LdEByCKC^}s_%ID7?YS~5>inZOace6 z9bJ(y8M(3Ko#4_=R*#V94YTG6vuu9EDdXle71SeVnPWR9RAXNFff;2e&UoCJaj98r zP;bF>of$J|h&kUIFO0oma!1hP0o*gVcH9h{z_c7sPzKl6^aIMGl5#Uj$Bg1A1dXuo zh4id|2GC>n5=54UpZ@^U4b<9;(udYl`E@N1b4$tSdw)q}Z>Cq$>jSUf8+nkJ_`P>@ zD|>i#cy-_Us}t+#x3*QKFS#6R#ZY$OVdlt2=E&;8W~T5b(v0j@jy%kbZsbO{dIq+J zPPBA1czheFgW2Wt&s5Mq?Lq16&66u9Z%(dE-qvp~ZKjT`Ysa4Tg03YU{QWeE(gS}X z<%KZD?|t|naq8zi{Vg4qpYx*-_*ZXEY3RqjXC~COo&>OK6Z#a6ue}`y{=W9|)DiXm z2!=VI3F8t901?&)`@)!Lz#~>+@?i-NKp_j(0=#)XgL>^C&6D~+ zQ%l7dKSJ3@$oLf#O9u+g f$Q^9OC6_?yJuO3WNfgU2mp{MyGzAhn3@7{pz1FvD literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dcc46cf43d3e62f62b227ce2f927170e275b42d GIT binary patch literal 2043 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 Generator[None, None, None]: + target = os.environ + + # Save values from the target and change them. + non_existent_marker = object() + saved_values: Dict[str, Union[object, str]] = {} + for name, new_value in changes.items(): + try: + saved_values[name] = target[name] + except KeyError: + saved_values[name] = non_existent_marker + target[name] = new_value + + try: + yield + finally: + # Restore original values in the target. + for name, original_value in saved_values.items(): + if original_value is non_existent_marker: + del target[name] + else: + assert isinstance(original_value, str) # for mypy + target[name] = original_value + + +@contextlib.contextmanager +def get_build_tracker() -> Generator["BuildTracker", None, None]: + root = os.environ.get("PIP_BUILD_TRACKER") + with contextlib.ExitStack() as ctx: + if root is None: + root = ctx.enter_context(TempDirectory(kind="build-tracker")).path + ctx.enter_context(update_env_context_manager(PIP_BUILD_TRACKER=root)) + logger.debug("Initialized build tracking at %s", root) + + with BuildTracker(root) as tracker: + yield tracker + + +class TrackerId(str): + """Uniquely identifying string provided to the build tracker.""" + + +class BuildTracker: + """Ensure that an sdist cannot request itself as a setup requirement. + + When an sdist is prepared, it identifies its setup requirements in the + context of ``BuildTracker.track()``. If a requirement shows up recursively, this + raises an exception. + + This stops fork bombs embedded in malicious packages.""" + + def __init__(self, root: str) -> None: + self._root = root + self._entries: Dict[TrackerId, InstallRequirement] = {} + logger.debug("Created build tracker: %s", self._root) + + def __enter__(self) -> "BuildTracker": + logger.debug("Entered build tracker: %s", self._root) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.cleanup() + + def _entry_path(self, key: TrackerId) -> str: + hashed = hashlib.sha224(key.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req: InstallRequirement, key: TrackerId) -> None: + """Add an InstallRequirement to build tracking.""" + + # Get the file to write information about this requirement. + entry_path = self._entry_path(key) + + # Try reading from the file. If it exists and can be read from, a build + # is already in progress, so a LookupError is raised. + try: + with open(entry_path) as fp: + contents = fp.read() + except FileNotFoundError: + pass + else: + message = "{} is already being built: {}".format(req.link, contents) + raise LookupError(message) + + # If we're here, req should really not be building already. + assert key not in self._entries + + # Start tracking this requirement. + with open(entry_path, "w", encoding="utf-8") as fp: + fp.write(str(req)) + self._entries[key] = req + + logger.debug("Added %s to build tracker %r", req, self._root) + + def remove(self, req: InstallRequirement, key: TrackerId) -> None: + """Remove an InstallRequirement from build tracking.""" + + # Delete the created file and the corresponding entry. + os.unlink(self._entry_path(key)) + del self._entries[key] + + logger.debug("Removed %s from build tracker %r", req, self._root) + + def cleanup(self) -> None: + for key, req in list(self._entries.items()): + self.remove(req, key) + + logger.debug("Removed build tracker: %r", self._root) + + @contextlib.contextmanager + def track(self, req: InstallRequirement, key: str) -> Generator[None, None, None]: + """Ensure that `key` cannot install itself as a setup requirement. + + :raises LookupError: If `key` was already provided in a parent invocation of + the context introduced by this method.""" + tracker_id = TrackerId(key) + self.add(req, tracker_id) + yield + self.remove(req, tracker_id) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py new file mode 100644 index 0000000..c66ac35 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py @@ -0,0 +1,39 @@ +"""Metadata generation logic for source distributions. +""" + +import os + +from pip._vendor.pyproject_hooks import BuildBackendHookCaller + +from pip._internal.build_env import BuildEnvironment +from pip._internal.exceptions import ( + InstallationSubprocessError, + MetadataGenerationFailed, +) +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory + + +def generate_metadata( + build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str +) -> str: + """Generate metadata using mechanisms described in PEP 517. + + Returns the generated metadata directory. + """ + metadata_tmpdir = TempDirectory(kind="modern-metadata", globally_managed=True) + + metadata_dir = metadata_tmpdir.path + + with build_env: + # Note that BuildBackendHookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + runner = runner_with_spinner_message("Preparing metadata (pyproject.toml)") + with backend.subprocess_runner(runner): + try: + distinfo_dir = backend.prepare_metadata_for_build_wheel(metadata_dir) + except InstallationSubprocessError as error: + raise MetadataGenerationFailed(package_details=details) from error + + return os.path.join(metadata_dir, distinfo_dir) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py new file mode 100644 index 0000000..27c69f0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py @@ -0,0 +1,41 @@ +"""Metadata generation logic for source distributions. +""" + +import os + +from pip._vendor.pyproject_hooks import BuildBackendHookCaller + +from pip._internal.build_env import BuildEnvironment +from pip._internal.exceptions import ( + InstallationSubprocessError, + MetadataGenerationFailed, +) +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory + + +def generate_editable_metadata( + build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str +) -> str: + """Generate metadata using mechanisms described in PEP 660. + + Returns the generated metadata directory. + """ + metadata_tmpdir = TempDirectory(kind="modern-metadata", globally_managed=True) + + metadata_dir = metadata_tmpdir.path + + with build_env: + # Note that BuildBackendHookCaller implements a fallback for + # prepare_metadata_for_build_wheel/editable, so we don't have to + # consider the possibility that this hook doesn't exist. + runner = runner_with_spinner_message( + "Preparing editable metadata (pyproject.toml)" + ) + with backend.subprocess_runner(runner): + try: + distinfo_dir = backend.prepare_metadata_for_build_editable(metadata_dir) + except InstallationSubprocessError as error: + raise MetadataGenerationFailed(package_details=details) from error + + return os.path.join(metadata_dir, distinfo_dir) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py new file mode 100644 index 0000000..e60988d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py @@ -0,0 +1,74 @@ +"""Metadata generation logic for legacy source distributions. +""" + +import logging +import os + +from pip._internal.build_env import BuildEnvironment +from pip._internal.cli.spinners import open_spinner +from pip._internal.exceptions import ( + InstallationError, + InstallationSubprocessError, + MetadataGenerationFailed, +) +from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +def _find_egg_info(directory: str) -> str: + """Find an .egg-info subdirectory in `directory`.""" + filenames = [f for f in os.listdir(directory) if f.endswith(".egg-info")] + + if not filenames: + raise InstallationError(f"No .egg-info directory found in {directory}") + + if len(filenames) > 1: + raise InstallationError( + "More than one .egg-info directory found in {}".format(directory) + ) + + return os.path.join(directory, filenames[0]) + + +def generate_metadata( + build_env: BuildEnvironment, + setup_py_path: str, + source_dir: str, + isolated: bool, + details: str, +) -> str: + """Generate metadata using setup.py-based defacto mechanisms. + + Returns the generated metadata directory. + """ + logger.debug( + "Running setup.py (path:%s) egg_info for package %s", + setup_py_path, + details, + ) + + egg_info_dir = TempDirectory(kind="pip-egg-info", globally_managed=True).path + + args = make_setuptools_egg_info_args( + setup_py_path, + egg_info_dir=egg_info_dir, + no_user_config=isolated, + ) + + with build_env: + with open_spinner("Preparing metadata (setup.py)") as spinner: + try: + call_subprocess( + args, + cwd=source_dir, + command_desc="python setup.py egg_info", + spinner=spinner, + ) + except InstallationSubprocessError as error: + raise MetadataGenerationFailed(package_details=details) from error + + # Return the .egg-info directory. + return _find_egg_info(egg_info_dir) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py new file mode 100644 index 0000000..064811a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py @@ -0,0 +1,37 @@ +import logging +import os +from typing import Optional + +from pip._vendor.pyproject_hooks import BuildBackendHookCaller + +from pip._internal.utils.subprocess import runner_with_spinner_message + +logger = logging.getLogger(__name__) + + +def build_wheel_pep517( + name: str, + backend: BuildBackendHookCaller, + metadata_directory: str, + tempd: str, +) -> Optional[str]: + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert metadata_directory is not None + try: + logger.debug("Destination directory: %s", tempd) + + runner = runner_with_spinner_message( + f"Building wheel for {name} (pyproject.toml)" + ) + with backend.subprocess_runner(runner): + wheel_name = backend.build_wheel( + tempd, + metadata_directory=metadata_directory, + ) + except Exception: + logger.error("Failed building wheel for %s", name) + return None + return os.path.join(tempd, wheel_name) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py new file mode 100644 index 0000000..719d69d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py @@ -0,0 +1,46 @@ +import logging +import os +from typing import Optional + +from pip._vendor.pyproject_hooks import BuildBackendHookCaller, HookMissing + +from pip._internal.utils.subprocess import runner_with_spinner_message + +logger = logging.getLogger(__name__) + + +def build_wheel_editable( + name: str, + backend: BuildBackendHookCaller, + metadata_directory: str, + tempd: str, +) -> Optional[str]: + """Build one InstallRequirement using the PEP 660 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert metadata_directory is not None + try: + logger.debug("Destination directory: %s", tempd) + + runner = runner_with_spinner_message( + f"Building editable for {name} (pyproject.toml)" + ) + with backend.subprocess_runner(runner): + try: + wheel_name = backend.build_editable( + tempd, + metadata_directory=metadata_directory, + ) + except HookMissing as e: + logger.error( + "Cannot build editable %s because the build " + "backend does not have the %s hook", + name, + e, + ) + return None + except Exception: + logger.error("Failed building editable for %s", name) + return None + return os.path.join(tempd, wheel_name) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py new file mode 100644 index 0000000..c5f0492 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py @@ -0,0 +1,102 @@ +import logging +import os.path +from typing import List, Optional + +from pip._internal.cli.spinners import open_spinner +from pip._internal.utils.setuptools_build import make_setuptools_bdist_wheel_args +from pip._internal.utils.subprocess import call_subprocess, format_command_args + +logger = logging.getLogger(__name__) + + +def format_command_result( + command_args: List[str], + command_output: str, +) -> str: + """Format command information for logging.""" + command_desc = format_command_args(command_args) + text = f"Command arguments: {command_desc}\n" + + if not command_output: + text += "Command output: None" + elif logger.getEffectiveLevel() > logging.DEBUG: + text += "Command output: [use --verbose to show]" + else: + if not command_output.endswith("\n"): + command_output += "\n" + text += f"Command output:\n{command_output}" + + return text + + +def get_legacy_build_wheel_path( + names: List[str], + temp_dir: str, + name: str, + command_args: List[str], + command_output: str, +) -> Optional[str]: + """Return the path to the wheel in the temporary build directory.""" + # Sort for determinism. + names = sorted(names) + if not names: + msg = ("Legacy build of wheel for {!r} created no files.\n").format(name) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + return None + + if len(names) > 1: + msg = ( + "Legacy build of wheel for {!r} created more than one file.\n" + "Filenames (choosing first): {}\n" + ).format(name, names) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + +def build_wheel_legacy( + name: str, + setup_py_path: str, + source_dir: str, + global_options: List[str], + build_options: List[str], + tempd: str, +) -> Optional[str]: + """Build one unpacked package using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + wheel_args = make_setuptools_bdist_wheel_args( + setup_py_path, + global_options=global_options, + build_options=build_options, + destination_dir=tempd, + ) + + spin_message = f"Building wheel for {name} (setup.py)" + with open_spinner(spin_message) as spinner: + logger.debug("Destination directory: %s", tempd) + + try: + output = call_subprocess( + wheel_args, + command_desc="python setup.py bdist_wheel", + cwd=source_dir, + spinner=spinner, + ) + except Exception: + spinner.finish("error") + logger.error("Failed building wheel for %s", name) + return None + + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + name=name, + command_args=wheel_args, + command_output=output, + ) + return wheel_path diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/check.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/check.py new file mode 100644 index 0000000..90c6a58 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/check.py @@ -0,0 +1,187 @@ +"""Validation of dependencies of packages +""" + +import logging +from typing import Callable, Dict, List, NamedTuple, Optional, Set, Tuple + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.specifiers import LegacySpecifier +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import LegacyVersion + +from pip._internal.distributions import make_distribution_for_install_requirement +from pip._internal.metadata import get_default_environment +from pip._internal.metadata.base import DistributionVersion +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.deprecation import deprecated + +logger = logging.getLogger(__name__) + + +class PackageDetails(NamedTuple): + version: DistributionVersion + dependencies: List[Requirement] + + +# Shorthands +PackageSet = Dict[NormalizedName, PackageDetails] +Missing = Tuple[NormalizedName, Requirement] +Conflicting = Tuple[NormalizedName, DistributionVersion, Requirement] + +MissingDict = Dict[NormalizedName, List[Missing]] +ConflictingDict = Dict[NormalizedName, List[Conflicting]] +CheckResult = Tuple[MissingDict, ConflictingDict] +ConflictDetails = Tuple[PackageSet, CheckResult] + + +def create_package_set_from_installed() -> Tuple[PackageSet, bool]: + """Converts a list of distributions into a PackageSet.""" + package_set = {} + problems = False + env = get_default_environment() + for dist in env.iter_installed_distributions(local_only=False, skip=()): + name = dist.canonical_name + try: + dependencies = list(dist.iter_dependencies()) + package_set[name] = PackageDetails(dist.version, dependencies) + except (OSError, ValueError) as e: + # Don't crash on unreadable or broken metadata. + logger.warning("Error parsing requirements for %s: %s", name, e) + problems = True + return package_set, problems + + +def check_package_set( + package_set: PackageSet, should_ignore: Optional[Callable[[str], bool]] = None +) -> CheckResult: + """Check if a package set is consistent + + If should_ignore is passed, it should be a callable that takes a + package name and returns a boolean. + """ + + warn_legacy_versions_and_specifiers(package_set) + + missing = {} + conflicting = {} + + for package_name, package_detail in package_set.items(): + # Info about dependencies of package_name + missing_deps: Set[Missing] = set() + conflicting_deps: Set[Conflicting] = set() + + if should_ignore and should_ignore(package_name): + continue + + for req in package_detail.dependencies: + name = canonicalize_name(req.name) + + # Check if it's missing + if name not in package_set: + missed = True + if req.marker is not None: + missed = req.marker.evaluate({"extra": ""}) + if missed: + missing_deps.add((name, req)) + continue + + # Check if there's a conflict + version = package_set[name].version + if not req.specifier.contains(version, prereleases=True): + conflicting_deps.add((name, version, req)) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str) + + return missing, conflicting + + +def check_install_conflicts(to_install: List[InstallRequirement]) -> ConflictDetails: + """For checking if the dependency graph would be consistent after \ + installing given requirements + """ + # Start from the current state + package_set, _ = create_package_set_from_installed() + # Install packages + would_be_installed = _simulate_installation_of(to_install, package_set) + + # Only warn about directly-dependent packages; create a whitelist of them + whitelist = _create_whitelist(would_be_installed, package_set) + + return ( + package_set, + check_package_set( + package_set, should_ignore=lambda name: name not in whitelist + ), + ) + + +def _simulate_installation_of( + to_install: List[InstallRequirement], package_set: PackageSet +) -> Set[NormalizedName]: + """Computes the version of packages after installing to_install.""" + # Keep track of packages that were installed + installed = set() + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + abstract_dist = make_distribution_for_install_requirement(inst_req) + dist = abstract_dist.get_metadata_distribution() + name = dist.canonical_name + package_set[name] = PackageDetails(dist.version, list(dist.iter_dependencies())) + + installed.add(name) + + return installed + + +def _create_whitelist( + would_be_installed: Set[NormalizedName], package_set: PackageSet +) -> Set[NormalizedName]: + packages_affected = set(would_be_installed) + + for package_name in package_set: + if package_name in packages_affected: + continue + + for req in package_set[package_name].dependencies: + if canonicalize_name(req.name) in packages_affected: + packages_affected.add(package_name) + break + + return packages_affected + + +def warn_legacy_versions_and_specifiers(package_set: PackageSet) -> None: + for project_name, package_details in package_set.items(): + if isinstance(package_details.version, LegacyVersion): + deprecated( + reason=( + f"{project_name} {package_details.version} " + f"has a non-standard version number." + ), + replacement=( + f"to upgrade to a newer version of {project_name} " + f"or contact the author to suggest that they " + f"release a version with a conforming version number" + ), + issue=12063, + gone_in="24.1", + ) + for dep in package_details.dependencies: + if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier): + deprecated( + reason=( + f"{project_name} {package_details.version} " + f"has a non-standard dependency specifier {dep}." + ), + replacement=( + f"to upgrade to a newer version of {project_name} " + f"or contact the author to suggest that they " + f"release a version with a conforming dependency specifiers" + ), + issue=12063, + gone_in="24.1", + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..3544568 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,255 @@ +import collections +import logging +import os +from typing import Container, Dict, Generator, Iterable, List, NamedTuple, Optional, Set + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.metadata import BaseDistribution, get_environment +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.direct_url_helpers import direct_url_as_pep440_direct_reference + +logger = logging.getLogger(__name__) + + +class _EditableInfo(NamedTuple): + requirement: str + comments: List[str] + + +def freeze( + requirement: Optional[List[str]] = None, + local_only: bool = False, + user_only: bool = False, + paths: Optional[List[str]] = None, + isolated: bool = False, + exclude_editable: bool = False, + skip: Container[str] = (), +) -> Generator[str, None, None]: + installations: Dict[str, FrozenRequirement] = {} + + dists = get_environment(paths).iter_installed_distributions( + local_only=local_only, + skip=(), + user_only=user_only, + ) + for dist in dists: + req = FrozenRequirement.from_dist(dist) + if exclude_editable and req.editable: + continue + installations[req.canonical_name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options: Set[str] = set() + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files: Dict[str, List[str]] = collections.defaultdict(list) + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if ( + not line.strip() + or line.strip().startswith("#") + or line.startswith( + ( + "-r", + "--requirement", + "-f", + "--find-links", + "-i", + "--index-url", + "--pre", + "--trusted-host", + "--process-dependency-links", + "--extra-index-url", + "--use-feature", + ) + ) + ): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith("-e") or line.startswith("--editable"): + if line.startswith("-e"): + line = line[2:].strip() + else: + line = line[len("--editable") :].strip().lstrip("=") + line_req = install_req_from_editable( + line, + isolated=isolated, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub("", line).strip(), + isolated=isolated, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, + line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + else: + line_req_canonical_name = canonicalize_name(line_req.name) + if line_req_canonical_name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but " + "package %r is not installed", + req_file_path, + COMMENT_RE.sub("", line).strip(), + line_req.name, + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[line_req_canonical_name]).rstrip() + del installations[line_req_canonical_name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in req_files.items(): + if len(files) > 1: + logger.warning( + "Requirement %s included multiple times [%s]", + name, + ", ".join(sorted(set(files))), + ) + + yield ("## The following requirements were added by pip freeze:") + for installation in sorted(installations.values(), key=lambda x: x.name.lower()): + if installation.canonical_name not in skip: + yield str(installation).rstrip() + + +def _format_as_name_version(dist: BaseDistribution) -> str: + dist_version = dist.version + if isinstance(dist_version, Version): + return f"{dist.raw_name}=={dist_version}" + return f"{dist.raw_name}==={dist_version}" + + +def _get_editable_info(dist: BaseDistribution) -> _EditableInfo: + """ + Compute and return values (req, comments) for use in + FrozenRequirement.from_dist(). + """ + editable_project_location = dist.editable_project_location + assert editable_project_location + location = os.path.normcase(os.path.abspath(editable_project_location)) + + from pip._internal.vcs import RemoteNotFoundError, RemoteNotValidError, vcs + + vcs_backend = vcs.get_backend_for_dir(location) + + if vcs_backend is None: + display = _format_as_name_version(dist) + logger.debug( + 'No VCS found for editable requirement "%s" in: %r', + display, + location, + ) + return _EditableInfo( + requirement=location, + comments=[f"# Editable install with no version control ({display})"], + ) + + vcs_name = type(vcs_backend).__name__ + + try: + req = vcs_backend.get_src_requirement(location, dist.raw_name) + except RemoteNotFoundError: + display = _format_as_name_version(dist) + return _EditableInfo( + requirement=location, + comments=[f"# Editable {vcs_name} install with no remote ({display})"], + ) + except RemoteNotValidError as ex: + display = _format_as_name_version(dist) + return _EditableInfo( + requirement=location, + comments=[ + f"# Editable {vcs_name} install ({display}) with either a deleted " + f"local remote or invalid URI:", + f"# '{ex.url}'", + ], + ) + except BadCommand: + logger.warning( + "cannot determine version of editable source in %s " + "(%s command not found in path)", + location, + vcs_backend.name, + ) + return _EditableInfo(requirement=location, comments=[]) + except InstallationError as exc: + logger.warning("Error when trying to get requirement for VCS system %s", exc) + else: + return _EditableInfo(requirement=req, comments=[]) + + logger.warning("Could not determine repository location of %s", location) + + return _EditableInfo( + requirement=location, + comments=["## !! Could not determine repository location"], + ) + + +class FrozenRequirement: + def __init__( + self, + name: str, + req: str, + editable: bool, + comments: Iterable[str] = (), + ) -> None: + self.name = name + self.canonical_name = canonicalize_name(name) + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist: BaseDistribution) -> "FrozenRequirement": + editable = dist.editable + if editable: + req, comments = _get_editable_info(dist) + else: + comments = [] + direct_url = dist.direct_url + if direct_url: + # if PEP 610 metadata is present, use it + req = direct_url_as_pep440_direct_reference(direct_url, dist.raw_name) + else: + # name==version requirement + req = _format_as_name_version(dist) + + return cls(dist.raw_name, req, editable, comments=comments) + + def __str__(self) -> str: + req = self.req + if self.editable: + req = f"-e {req}" + return "\n".join(list(self.comments) + [str(req)]) + "\n" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py new file mode 100644 index 0000000..24d6a5d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py @@ -0,0 +1,2 @@ +"""For modules related to installing packages. +""" diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..840d4340a6f814adf3e4c41979ebbff921cf9edd GIT binary patch literal 284 zcmXw#!Ab)$5QdXlv=sUdxfXPX+N%gc>9IFGcnRrdSjWvKAsL13!PoE^d=}rpt1lq- z){|Lm|I7S812f;u=WI3=MT_>KS(f@egp=ga>?g&%3o9N)FXyA(7Kn)-;%_>1Hm!F0{6x*7`&2hmnUj=sZIW_Zd@$H8Og&N@NLEm|G4J zVhYd5cRthBA#^?ZS8%k2*z;5H%W82AnHaB5dmvH-O`b7%;~+##hAH?AM<~#xORRMj e`@`hspZ+$T7o6eDJbdBjOiKAXl5(8JCH?`2o>a>K literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..060c02635aefc666e4c9484c89f6b5fac3e1ca59 GIT binary patch literal 1835 zcmZuxO^6&t6t4cA?)l%{*^Jr5q+=3v#GPi7C_zM7iGm~>!Jv@w(CO{2o$YM@Syhu{ zmJuQ-8uSoP$ZZqMS4%qu@;sh zqi5t;56!6DE9bZrR-$UJDj^wR>GIrmpxrO7Z%BpJYxo9MadSVIzKN9yD(|2Qp7N`> z>DOS?0XMMjHvv!i@=D8}{#5Nv59Q9x`WxqP-}QzT_5Qn&oKIM4Zx%#C+b@fSDb#s&P*0LLEgNWA&xAPD`p z;wu43;t0nKeB~ha0XbpP2kT(uu3;zNnI%a`oyp#gOZpV%8y=j-p@ZegS$Mr4Cd+Q< zBzZi_^_1Y1;2Kv~lL+(LfMN#*acICWS7TQ=^X;8<=%g-Ner&SR_KJ-Oco|7(R1%tr=(&tcUl|#9)Qw3*;E*PM zyOH+VL+vP9KvcRaOXwo(C84jTuPGPNRcWt(s1^Q>zW(7m1tToi5(#qqf+M?pi4q^E zv6N6|LB$55#uN~S#gxvoRgw()t7Qv>CDv}4ySZ!q@Oy(e4&r_>^B-ziD+#fV(~d^O zeR(}jimG}^yb|<@XiHKNstRhooetS5@O3XiftOV;i6S@lfmhVyig(pN-_f`ZV z!?AUS1b$$j!E}u!sSSL-jM-vL186%t8UhLJFj%&WtDNjEoUjFj=O;<0b{eF%6T}P? z=rTJ=G0B^h+LM;Gw|m$L^PYxm^5$gD*`6Z@;GE(XbO`D?+B}4`%I9Z4Ir~#{;k#46 zs;B>~JU=#O$L-_e_Th13c3hhp?>o9#D^>ODXEvu%x%K72M@ZM|)fKxLG)>c3sbOOR7I;9lU+v>!nNsoav}Gd-KALrK}_@165{jp1d)i znZhcg)-zc}pem}=vzkD4)M{r9ftsi>lT8UUjha?ABTx%jN3&Uh_94Bz*#<;jfK&bp Dql@({ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af72b0ee49281c8025cf0f5fbc5bd17ce58f1750 GIT binary patch literal 33877 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py new file mode 100644 index 0000000..bebe24e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py @@ -0,0 +1,46 @@ +"""Legacy editable installation process, i.e. `setup.py develop`. +""" +import logging +from typing import Optional, Sequence + +from pip._internal.build_env import BuildEnvironment +from pip._internal.utils.logging import indent_log +from pip._internal.utils.setuptools_build import make_setuptools_develop_args +from pip._internal.utils.subprocess import call_subprocess + +logger = logging.getLogger(__name__) + + +def install_editable( + *, + global_options: Sequence[str], + prefix: Optional[str], + home: Optional[str], + use_user_site: bool, + name: str, + setup_py_path: str, + isolated: bool, + build_env: BuildEnvironment, + unpacked_source_directory: str, +) -> None: + """Install a package in editable mode. Most arguments are pass-through + to setuptools. + """ + logger.info("Running setup.py develop for %s", name) + + args = make_setuptools_develop_args( + setup_py_path, + global_options=global_options, + no_user_config=isolated, + prefix=prefix, + home=home, + use_user_site=use_user_site, + ) + + with indent_log(): + with build_env: + call_subprocess( + args, + command_desc="python setup.py develop", + cwd=unpacked_source_directory, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py new file mode 100644 index 0000000..f67180c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py @@ -0,0 +1,734 @@ +"""Support for installing and building the "wheel" binary package format. +""" + +import collections +import compileall +import contextlib +import csv +import importlib +import logging +import os.path +import re +import shutil +import sys +import warnings +from base64 import urlsafe_b64encode +from email.message import Message +from itertools import chain, filterfalse, starmap +from typing import ( + IO, + TYPE_CHECKING, + Any, + BinaryIO, + Callable, + Dict, + Generator, + Iterable, + Iterator, + List, + NewType, + Optional, + Sequence, + Set, + Tuple, + Union, + cast, +) +from zipfile import ZipFile, ZipInfo + +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.distlib.util import get_export_entry +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import InstallationError +from pip._internal.locations import get_major_minor_version +from pip._internal.metadata import ( + BaseDistribution, + FilesystemWheel, + get_wheel_distribution, +) +from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl +from pip._internal.models.scheme import SCHEME_KEYS, Scheme +from pip._internal.utils.filesystem import adjacent_tmp_file, replace +from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file, partition +from pip._internal.utils.unpacking import ( + current_umask, + is_within_directory, + set_extracted_file_to_default_mode_plus_executable, + zip_item_is_executable, +) +from pip._internal.utils.wheel import parse_wheel + +if TYPE_CHECKING: + from typing import Protocol + + class File(Protocol): + src_record_path: "RecordPath" + dest_path: str + changed: bool + + def save(self) -> None: + pass + + +logger = logging.getLogger(__name__) + +RecordPath = NewType("RecordPath", str) +InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]] + + +def rehash(path: str, blocksize: int = 1 << 20) -> Tuple[str, str]: + """Return (encoded_digest, length) for path using hashlib.sha256()""" + h, length = hash_file(path, blocksize) + digest = "sha256=" + urlsafe_b64encode(h.digest()).decode("latin1").rstrip("=") + return (digest, str(length)) + + +def csv_io_kwargs(mode: str) -> Dict[str, Any]: + """Return keyword arguments to properly open a CSV file + in the given mode. + """ + return {"mode": mode, "newline": "", "encoding": "utf-8"} + + +def fix_script(path: str) -> bool: + """Replace #!python with #!/path/to/python + Return True if file was changed. + """ + # XXX RECORD hashes will need to be updated + assert os.path.isfile(path) + + with open(path, "rb") as script: + firstline = script.readline() + if not firstline.startswith(b"#!python"): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b"#!" + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, "wb") as script: + script.write(firstline) + script.write(rest) + return True + + +def wheel_root_is_purelib(metadata: Message) -> bool: + return metadata.get("Root-Is-Purelib", "").lower() == "true" + + +def get_entrypoints(dist: BaseDistribution) -> Tuple[Dict[str, str], Dict[str, str]]: + console_scripts = {} + gui_scripts = {} + for entry_point in dist.iter_entry_points(): + if entry_point.group == "console_scripts": + console_scripts[entry_point.name] = entry_point.value + elif entry_point.group == "gui_scripts": + gui_scripts[entry_point.name] = entry_point.value + return console_scripts, gui_scripts + + +def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]: + """Determine if any scripts are not on PATH and format a warning. + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir: Dict[str, Set[str]] = collections.defaultdict(set) + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(os.path.normpath(i)).rstrip(os.sep) + for i in os.environ.get("PATH", "").split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append( + os.path.normcase(os.path.normpath(os.path.dirname(sys.executable))) + ) + warn_for: Dict[str, Set[str]] = { + parent_dir: scripts + for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(os.path.normpath(parent_dir)) not in not_warn_dirs + } + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, dir_scripts in warn_for.items(): + sorted_scripts: List[str] = sorted(dir_scripts) + if len(sorted_scripts) == 1: + start_text = f"script {sorted_scripts[0]} is" + else: + start_text = "scripts {} are".format( + ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] + ) + + msg_lines.append( + f"The {start_text} installed in '{parent_dir}' which is not on PATH." + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Add a note if any directory starts with ~ + warn_for_tilde = any( + i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i + ) + if warn_for_tilde: + tilde_warning_msg = ( + "NOTE: The current PATH contains path(s) starting with `~`, " + "which may not be expanded by all applications." + ) + msg_lines.append(tilde_warning_msg) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def _normalized_outrows( + outrows: Iterable[InstalledCSVRow], +) -> List[Tuple[str, str, str]]: + """Normalize the given rows of a RECORD file. + + Items in each row are converted into str. Rows are then sorted to make + the value more predictable for tests. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted( + (record_path, hash_, str(size)) for record_path, hash_, size in outrows + ) + + +def _record_to_fs_path(record_path: RecordPath, lib_dir: str) -> str: + return os.path.join(lib_dir, record_path) + + +def _fs_to_record_path(path: str, lib_dir: str) -> RecordPath: + # On Windows, do not handle relative paths if they belong to different + # logical disks + if os.path.splitdrive(path)[0].lower() == os.path.splitdrive(lib_dir)[0].lower(): + path = os.path.relpath(path, lib_dir) + + path = path.replace(os.path.sep, "/") + return cast("RecordPath", path) + + +def get_csv_rows_for_installed( + old_csv_rows: List[List[str]], + installed: Dict[RecordPath, RecordPath], + changed: Set[RecordPath], + generated: List[str], + lib_dir: str, +) -> List[InstalledCSVRow]: + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows: List[InstalledCSVRow] = [] + for row in old_csv_rows: + if len(row) > 3: + logger.warning("RECORD line has more than three elements: %s", row) + old_record_path = cast("RecordPath", row[0]) + new_record_path = installed.pop(old_record_path, old_record_path) + if new_record_path in changed: + digest, length = rehash(_record_to_fs_path(new_record_path, lib_dir)) + else: + digest = row[1] if len(row) > 1 else "" + length = row[2] if len(row) > 2 else "" + installed_rows.append((new_record_path, digest, length)) + for f in generated: + path = _fs_to_record_path(f, lib_dir) + digest, length = rehash(f) + installed_rows.append((path, digest, length)) + return installed_rows + [ + (installed_record_path, "", "") for installed_record_path in installed.values() + ] + + +def get_console_script_specs(console: Dict[str, str]) -> List[str]: + """ + Given the mapping from entrypoint name to callable, return the relevant + console script specs. + """ + # Don't mutate caller's version + console = console.copy() + + scripts_to_generate = [] + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop("pip", None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append("pip = " + pip_script) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + scripts_to_generate.append(f"pip{sys.version_info[0]} = {pip_script}") + + scripts_to_generate.append(f"pip{get_major_minor_version()} = {pip_script}") + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r"pip(\d+(\.\d+)?)?$", k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop("easy_install", None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append("easy_install = " + easy_install_script) + + scripts_to_generate.append( + f"easy_install-{get_major_minor_version()} = {easy_install_script}" + ) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r"easy_install(-\d+\.\d+)?$", k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console entry points specified in the wheel + scripts_to_generate.extend(starmap("{} = {}".format, console.items())) + + return scripts_to_generate + + +class ZipBackedFile: + def __init__( + self, src_record_path: RecordPath, dest_path: str, zip_file: ZipFile + ) -> None: + self.src_record_path = src_record_path + self.dest_path = dest_path + self._zip_file = zip_file + self.changed = False + + def _getinfo(self) -> ZipInfo: + return self._zip_file.getinfo(self.src_record_path) + + def save(self) -> None: + # directory creation is lazy and after file filtering + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + parent_dir = os.path.dirname(self.dest_path) + ensure_dir(parent_dir) + + # When we open the output file below, any existing file is truncated + # before we start writing the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(self.dest_path): + os.unlink(self.dest_path) + + zipinfo = self._getinfo() + + with self._zip_file.open(zipinfo) as f: + with open(self.dest_path, "wb") as dest: + shutil.copyfileobj(f, dest) + + if zip_item_is_executable(zipinfo): + set_extracted_file_to_default_mode_plus_executable(self.dest_path) + + +class ScriptFile: + def __init__(self, file: "File") -> None: + self._file = file + self.src_record_path = self._file.src_record_path + self.dest_path = self._file.dest_path + self.changed = False + + def save(self) -> None: + self._file.save() + self.changed = fix_script(self.dest_path) + + +class MissingCallableSuffix(InstallationError): + def __init__(self, entry_point: str) -> None: + super().__init__( + f"Invalid script entry point: {entry_point} - A callable " + "suffix is required. Cf https://packaging.python.org/" + "specifications/entry-points/#use-for-scripts for more " + "information." + ) + + +def _raise_for_invalid_entrypoint(specification: str) -> None: + entry = get_export_entry(specification) + if entry is not None and entry.suffix is None: + raise MissingCallableSuffix(str(entry)) + + +class PipScriptMaker(ScriptMaker): + def make( + self, specification: str, options: Optional[Dict[str, Any]] = None + ) -> List[str]: + _raise_for_invalid_entrypoint(specification) + return super().make(specification, options) + + +def _install_wheel( + name: str, + wheel_zip: ZipFile, + wheel_path: str, + scheme: Scheme, + pycompile: bool = True, + warn_script_location: bool = True, + direct_url: Optional[DirectUrl] = None, + requested: bool = False, +) -> None: + """Install a wheel. + + :param name: Name of the project to install + :param wheel_zip: open ZipFile for wheel being installed + :param scheme: Distutils scheme dictating the install directories + :param req_description: String used in place of the requirement, for + logging + :param pycompile: Whether to byte-compile installed Python files + :param warn_script_location: Whether to check that scripts are installed + into a directory on PATH + :raises UnsupportedWheel: + * when the directory holds an unpacked wheel with incompatible + Wheel-Version + * when the .dist-info dir does not match the wheel + """ + info_dir, metadata = parse_wheel(wheel_zip, name) + + if wheel_root_is_purelib(metadata): + lib_dir = scheme.purelib + else: + lib_dir = scheme.platlib + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed: Dict[RecordPath, RecordPath] = {} + changed: Set[RecordPath] = set() + generated: List[str] = [] + + def record_installed( + srcfile: RecordPath, destfile: str, modified: bool = False + ) -> None: + """Map archive RECORD paths to installation RECORD paths.""" + newpath = _fs_to_record_path(destfile, lib_dir) + installed[srcfile] = newpath + if modified: + changed.add(newpath) + + def is_dir_path(path: RecordPath) -> bool: + return path.endswith("/") + + def assert_no_path_traversal(dest_dir_path: str, target_path: str) -> None: + if not is_within_directory(dest_dir_path, target_path): + message = ( + "The wheel {!r} has a file {!r} trying to install" + " outside the target directory {!r}" + ) + raise InstallationError( + message.format(wheel_path, target_path, dest_dir_path) + ) + + def root_scheme_file_maker( + zip_file: ZipFile, dest: str + ) -> Callable[[RecordPath], "File"]: + def make_root_scheme_file(record_path: RecordPath) -> "File": + normed_path = os.path.normpath(record_path) + dest_path = os.path.join(dest, normed_path) + assert_no_path_traversal(dest, dest_path) + return ZipBackedFile(record_path, dest_path, zip_file) + + return make_root_scheme_file + + def data_scheme_file_maker( + zip_file: ZipFile, scheme: Scheme + ) -> Callable[[RecordPath], "File"]: + scheme_paths = {key: getattr(scheme, key) for key in SCHEME_KEYS} + + def make_data_scheme_file(record_path: RecordPath) -> "File": + normed_path = os.path.normpath(record_path) + try: + _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2) + except ValueError: + message = ( + "Unexpected file in {}: {!r}. .data directory contents" + " should be named like: '/'." + ).format(wheel_path, record_path) + raise InstallationError(message) + + try: + scheme_path = scheme_paths[scheme_key] + except KeyError: + valid_scheme_keys = ", ".join(sorted(scheme_paths)) + message = ( + "Unknown scheme key used in {}: {} (for file {!r}). .data" + " directory contents should be in subdirectories named" + " with a valid scheme key ({})" + ).format(wheel_path, scheme_key, record_path, valid_scheme_keys) + raise InstallationError(message) + + dest_path = os.path.join(scheme_path, dest_subpath) + assert_no_path_traversal(scheme_path, dest_path) + return ZipBackedFile(record_path, dest_path, zip_file) + + return make_data_scheme_file + + def is_data_scheme_path(path: RecordPath) -> bool: + return path.split("/", 1)[0].endswith(".data") + + paths = cast(List[RecordPath], wheel_zip.namelist()) + file_paths = filterfalse(is_dir_path, paths) + root_scheme_paths, data_scheme_paths = partition(is_data_scheme_path, file_paths) + + make_root_scheme_file = root_scheme_file_maker(wheel_zip, lib_dir) + files: Iterator[File] = map(make_root_scheme_file, root_scheme_paths) + + def is_script_scheme_path(path: RecordPath) -> bool: + parts = path.split("/", 2) + return len(parts) > 2 and parts[0].endswith(".data") and parts[1] == "scripts" + + other_scheme_paths, script_scheme_paths = partition( + is_script_scheme_path, data_scheme_paths + ) + + make_data_scheme_file = data_scheme_file_maker(wheel_zip, scheme) + other_scheme_files = map(make_data_scheme_file, other_scheme_paths) + files = chain(files, other_scheme_files) + + # Get the defined entry points + distribution = get_wheel_distribution( + FilesystemWheel(wheel_path), + canonicalize_name(name), + ) + console, gui = get_entrypoints(distribution) + + def is_entrypoint_wrapper(file: "File") -> bool: + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + path = file.dest_path + name = os.path.basename(path) + if name.lower().endswith(".exe"): + matchname = name[:-4] + elif name.lower().endswith("-script.py"): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return matchname in console or matchname in gui + + script_scheme_files: Iterator[File] = map( + make_data_scheme_file, script_scheme_paths + ) + script_scheme_files = filterfalse(is_entrypoint_wrapper, script_scheme_files) + script_scheme_files = map(ScriptFile, script_scheme_files) + files = chain(files, script_scheme_files) + + for file in files: + file.save() + record_installed(file.src_record_path, file.dest_path, file.changed) + + def pyc_source_file_paths() -> Generator[str, None, None]: + # We de-duplicate installation paths, since there can be overlap (e.g. + # file in .data maps to same location as file in wheel root). + # Sorting installation paths makes it easier to reproduce and debug + # issues related to permissions on existing files. + for installed_path in sorted(set(installed.values())): + full_installed_path = os.path.join(lib_dir, installed_path) + if not os.path.isfile(full_installed_path): + continue + if not full_installed_path.endswith(".py"): + continue + yield full_installed_path + + def pyc_output_path(path: str) -> str: + """Return the path the pyc file would have been written to.""" + return importlib.util.cache_from_source(path) + + # Compile all of the pyc files for the installed files + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings("ignore") + for path in pyc_source_file_paths(): + success = compileall.compile_file(path, force=True, quiet=True) + if success: + pyc_path = pyc_output_path(path) + assert os.path.exists(pyc_path) + pyc_record_path = cast( + "RecordPath", pyc_path.replace(os.path.sep, "/") + ) + record_installed(pyc_record_path, pyc_path) + logger.debug(stdout.getvalue()) + + maker = PipScriptMaker(None, scheme.scripts) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {""} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + # Generate the console and GUI entry points specified in the wheel + scripts_to_generate = get_console_script_specs(console) + + gui_scripts_to_generate = list(starmap("{} = {}".format, gui.items())) + + generated_console_scripts = maker.make_multiple(scripts_to_generate) + generated.extend(generated_console_scripts) + + generated.extend(maker.make_multiple(gui_scripts_to_generate, {"gui": True})) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + generated_file_mode = 0o666 & ~current_umask() + + @contextlib.contextmanager + def _generate_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]: + with adjacent_tmp_file(path, **kwargs) as f: + yield f + os.chmod(f.name, generated_file_mode) + replace(f.name, path) + + dest_info_dir = os.path.join(lib_dir, info_dir) + + # Record pip as the installer + installer_path = os.path.join(dest_info_dir, "INSTALLER") + with _generate_file(installer_path) as installer_file: + installer_file.write(b"pip\n") + generated.append(installer_path) + + # Record the PEP 610 direct URL reference + if direct_url is not None: + direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME) + with _generate_file(direct_url_path) as direct_url_file: + direct_url_file.write(direct_url.to_json().encode("utf-8")) + generated.append(direct_url_path) + + # Record the REQUESTED file + if requested: + requested_path = os.path.join(dest_info_dir, "REQUESTED") + with open(requested_path, "wb"): + pass + generated.append(requested_path) + + record_text = distribution.read_text("RECORD") + record_rows = list(csv.reader(record_text.splitlines())) + + rows = get_csv_rows_for_installed( + record_rows, + installed=installed, + changed=changed, + generated=generated, + lib_dir=lib_dir, + ) + + # Record details of all files installed + record_path = os.path.join(dest_info_dir, "RECORD") + + with _generate_file(record_path, **csv_io_kwargs("w")) as record_file: + # Explicitly cast to typing.IO[str] as a workaround for the mypy error: + # "writer" has incompatible type "BinaryIO"; expected "_Writer" + writer = csv.writer(cast("IO[str]", record_file)) + writer.writerows(_normalized_outrows(rows)) + + +@contextlib.contextmanager +def req_error_context(req_description: str) -> Generator[None, None, None]: + try: + yield + except InstallationError as e: + message = f"For req: {req_description}. {e.args[0]}" + raise InstallationError(message) from e + + +def install_wheel( + name: str, + wheel_path: str, + scheme: Scheme, + req_description: str, + pycompile: bool = True, + warn_script_location: bool = True, + direct_url: Optional[DirectUrl] = None, + requested: bool = False, +) -> None: + with ZipFile(wheel_path, allowZip64=True) as z: + with req_error_context(req_description): + _install_wheel( + name=name, + wheel_zip=z, + wheel_path=wheel_path, + scheme=scheme, + pycompile=pycompile, + warn_script_location=warn_script_location, + direct_url=direct_url, + requested=requested, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py b/myenv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..956717d --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,730 @@ +"""Prepares a distribution for installation +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import mimetypes +import os +import shutil +from pathlib import Path +from typing import Dict, Iterable, List, Optional + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.distributions import make_distribution_for_install_requirement +from pip._internal.distributions.installed import InstalledDistribution +from pip._internal.exceptions import ( + DirectoryUrlHashUnsupported, + HashMismatch, + HashUnpinned, + InstallationError, + MetadataInconsistent, + NetworkConnectionError, + VcsHashUnsupported, +) +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution, get_metadata_distribution +from pip._internal.models.direct_url import ArchiveInfo +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.network.download import BatchDownloader, Downloader +from pip._internal.network.lazy_wheel import ( + HTTPRangeRequestUnsupported, + dist_from_wheel_url, +) +from pip._internal.network.session import PipSession +from pip._internal.operations.build.build_tracker import BuildTracker +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils._log import getLogger +from pip._internal.utils.direct_url_helpers import ( + direct_url_for_editable, + direct_url_from_link, +) +from pip._internal.utils.hashes import Hashes, MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, + hash_file, + hide_url, + redact_auth_from_requirement, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.unpacking import unpack_file +from pip._internal.vcs import vcs + +logger = getLogger(__name__) + + +def _get_prepared_distribution( + req: InstallRequirement, + build_tracker: BuildTracker, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, +) -> BaseDistribution: + """Prepare a distribution for installation.""" + abstract_dist = make_distribution_for_install_requirement(req) + tracker_id = abstract_dist.build_tracker_id + if tracker_id is not None: + with build_tracker.track(req, tracker_id): + abstract_dist.prepare_distribution_metadata( + finder, build_isolation, check_build_deps + ) + return abstract_dist.get_metadata_distribution() + + +def unpack_vcs_link(link: Link, location: str, verbosity: int) -> None: + vcs_backend = vcs.get_backend_for_scheme(link.scheme) + assert vcs_backend is not None + vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity) + + +class File: + def __init__(self, path: str, content_type: Optional[str]) -> None: + self.path = path + if content_type is None: + self.content_type = mimetypes.guess_type(path)[0] + else: + self.content_type = content_type + + +def get_http_url( + link: Link, + download: Downloader, + download_dir: Optional[str] = None, + hashes: Optional[Hashes] = None, +) -> File: + temp_dir = TempDirectory(kind="unpack", globally_managed=True) + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, download_dir, hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = None + else: + # let's download to a tmp dir + from_path, content_type = download(link, temp_dir.path) + if hashes: + hashes.check_against_path(from_path) + + return File(from_path, content_type) + + +def get_file_url( + link: Link, download_dir: Optional[str] = None, hashes: Optional[Hashes] = None +) -> File: + """Get file and optionally check its hash.""" + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, download_dir, hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link.file_path + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(from_path) + return File(from_path, None) + + +def unpack_url( + link: Link, + location: str, + download: Downloader, + verbosity: int, + download_dir: Optional[str] = None, + hashes: Optional[Hashes] = None, +) -> Optional[File]: + """Unpack link into location, downloading if required. + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if link.is_vcs: + unpack_vcs_link(link, location, verbosity=verbosity) + return None + + assert not link.is_existing_dir() + + # file urls + if link.is_file: + file = get_file_url(link, download_dir, hashes=hashes) + + # http urls + else: + file = get_http_url( + link, + download, + download_dir, + hashes=hashes, + ) + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies, except wheels + if not link.is_wheel: + unpack_file(file.path, location, file.content_type) + + return file + + +def _check_download_dir( + link: Link, + download_dir: str, + hashes: Optional[Hashes], + warn_on_hash_mismatch: bool = True, +) -> Optional[str]: + """Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + + if not os.path.exists(download_path): + return None + + # If already downloaded, does its hash match? + logger.info("File was already downloaded %s", download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + if warn_on_hash_mismatch: + logger.warning( + "Previously-downloaded file %s has bad hash. Re-downloading.", + download_path, + ) + os.unlink(download_path) + return None + return download_path + + +class RequirementPreparer: + """Prepares a Requirement""" + + def __init__( + self, + build_dir: str, + download_dir: Optional[str], + src_dir: str, + build_isolation: bool, + check_build_deps: bool, + build_tracker: BuildTracker, + session: PipSession, + progress_bar: str, + finder: PackageFinder, + require_hashes: bool, + use_user_site: bool, + lazy_wheel: bool, + verbosity: int, + legacy_resolver: bool, + ) -> None: + super().__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.build_tracker = build_tracker + self._session = session + self._download = Downloader(session, progress_bar) + self._batch_download = BatchDownloader(session, progress_bar) + self.finder = finder + + # Where still-packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Is build isolation allowed? + self.build_isolation = build_isolation + + # Should check build dependencies? + self.check_build_deps = check_build_deps + + # Should hash-checking be required? + self.require_hashes = require_hashes + + # Should install in user site-packages? + self.use_user_site = use_user_site + + # Should wheels be downloaded lazily? + self.use_lazy_wheel = lazy_wheel + + # How verbose should underlying tooling be? + self.verbosity = verbosity + + # Are we using the legacy resolver? + self.legacy_resolver = legacy_resolver + + # Memoized downloaded files, as mapping of url: path. + self._downloaded: Dict[str, str] = {} + + # Previous "header" printed for a link-based InstallRequirement + self._previous_requirement_header = ("", "") + + def _log_preparing_link(self, req: InstallRequirement) -> None: + """Provide context for the requirement being prepared.""" + if req.link.is_file and not req.is_wheel_from_cache: + message = "Processing %s" + information = str(display_path(req.link.file_path)) + else: + message = "Collecting %s" + information = redact_auth_from_requirement(req.req) if req.req else str(req) + + # If we used req.req, inject requirement source if available (this + # would already be included if we used req directly) + if req.req and req.comes_from: + if isinstance(req.comes_from, str): + comes_from: Optional[str] = req.comes_from + else: + comes_from = req.comes_from.from_path() + if comes_from: + information += f" (from {comes_from})" + + if (message, information) != self._previous_requirement_header: + self._previous_requirement_header = (message, information) + logger.info(message, information) + + if req.is_wheel_from_cache: + with indent_log(): + logger.info("Using cached %s", req.link.filename) + + def _ensure_link_req_src_dir( + self, req: InstallRequirement, parallel_builds: bool + ) -> None: + """Ensure source_dir of a linked InstallRequirement.""" + # Since source_dir is only set for editable requirements. + if req.link.is_wheel: + # We don't need to unpack wheels, so no need for a source + # directory. + return + assert req.source_dir is None + if req.link.is_existing_dir(): + # build local directories in-tree + req.source_dir = req.link.file_path + return + + # We always delete unpacked sdists after pip runs. + req.ensure_has_source_dir( + self.build_dir, + autodelete=True, + parallel_builds=parallel_builds, + ) + req.ensure_pristine_source_checkout() + + def _get_linked_req_hashes(self, req: InstallRequirement) -> Hashes: + # By the time this is called, the requirement's link should have + # been checked so we can tell what kind of requirements req is + # and raise some more informative errors than otherwise. + # (For example, we can raise VcsHashUnsupported for a VCS URL + # rather than HashMissing.) + if not self.require_hashes: + return req.hashes(trust_internet=True) + + # We could check these first 2 conditions inside unpack_url + # and save repetition of conditions, but then we would + # report less-useful error messages for unhashable + # requirements, complaining that there's no hash provided. + if req.link.is_vcs: + raise VcsHashUnsupported() + if req.link.is_existing_dir(): + raise DirectoryUrlHashUnsupported() + + # Unpinned packages are asking for trouble when a new version + # is uploaded. This isn't a security check, but it saves users + # a surprising hash mismatch in the future. + # file:/// URLs aren't pinnable, so don't complain about them + # not being pinned. + if not req.is_direct and not req.is_pinned: + raise HashUnpinned() + + # If known-good hashes are missing for this requirement, + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + return req.hashes(trust_internet=False) or MissingHashes() + + def _fetch_metadata_only( + self, + req: InstallRequirement, + ) -> Optional[BaseDistribution]: + if self.legacy_resolver: + logger.debug( + "Metadata-only fetching is not used in the legacy resolver", + ) + return None + if self.require_hashes: + logger.debug( + "Metadata-only fetching is not used as hash checking is required", + ) + return None + # Try PEP 658 metadata first, then fall back to lazy wheel if unavailable. + return self._fetch_metadata_using_link_data_attr( + req + ) or self._fetch_metadata_using_lazy_wheel(req.link) + + def _fetch_metadata_using_link_data_attr( + self, + req: InstallRequirement, + ) -> Optional[BaseDistribution]: + """Fetch metadata from the data-dist-info-metadata attribute, if possible.""" + # (1) Get the link to the metadata file, if provided by the backend. + metadata_link = req.link.metadata_link() + if metadata_link is None: + return None + assert req.req is not None + logger.verbose( + "Obtaining dependency information for %s from %s", + req.req, + metadata_link, + ) + # (2) Download the contents of the METADATA file, separate from the dist itself. + metadata_file = get_http_url( + metadata_link, + self._download, + hashes=metadata_link.as_hashes(), + ) + with open(metadata_file.path, "rb") as f: + metadata_contents = f.read() + # (3) Generate a dist just from those file contents. + metadata_dist = get_metadata_distribution( + metadata_contents, + req.link.filename, + req.req.name, + ) + # (4) Ensure the Name: field from the METADATA file matches the name from the + # install requirement. + # + # NB: raw_name will fall back to the name from the install requirement if + # the Name: field is not present, but it's noted in the raw_name docstring + # that that should NEVER happen anyway. + if canonicalize_name(metadata_dist.raw_name) != canonicalize_name(req.req.name): + raise MetadataInconsistent( + req, "Name", req.req.name, metadata_dist.raw_name + ) + return metadata_dist + + def _fetch_metadata_using_lazy_wheel( + self, + link: Link, + ) -> Optional[BaseDistribution]: + """Fetch metadata using lazy wheel, if possible.""" + # --use-feature=fast-deps must be provided. + if not self.use_lazy_wheel: + return None + if link.is_file or not link.is_wheel: + logger.debug( + "Lazy wheel is not used as %r does not point to a remote wheel", + link, + ) + return None + + wheel = Wheel(link.filename) + name = canonicalize_name(wheel.name) + logger.info( + "Obtaining dependency information from %s %s", + name, + wheel.version, + ) + url = link.url.split("#", 1)[0] + try: + return dist_from_wheel_url(name, url, self._session) + except HTTPRangeRequestUnsupported: + logger.debug("%s does not support range requests", url) + return None + + def _complete_partial_requirements( + self, + partially_downloaded_reqs: Iterable[InstallRequirement], + parallel_builds: bool = False, + ) -> None: + """Download any requirements which were only fetched by metadata.""" + # Download to a temporary directory. These will be copied over as + # needed for downstream 'download', 'wheel', and 'install' commands. + temp_dir = TempDirectory(kind="unpack", globally_managed=True).path + + # Map each link to the requirement that owns it. This allows us to set + # `req.local_file_path` on the appropriate requirement after passing + # all the links at once into BatchDownloader. + links_to_fully_download: Dict[Link, InstallRequirement] = {} + for req in partially_downloaded_reqs: + assert req.link + links_to_fully_download[req.link] = req + + batch_download = self._batch_download( + links_to_fully_download.keys(), + temp_dir, + ) + for link, (filepath, _) in batch_download: + logger.debug("Downloading link %s to %s", link, filepath) + req = links_to_fully_download[link] + # Record the downloaded file path so wheel reqs can extract a Distribution + # in .get_dist(). + req.local_file_path = filepath + # Record that the file is downloaded so we don't do it again in + # _prepare_linked_requirement(). + self._downloaded[req.link.url] = filepath + + # If this is an sdist, we need to unpack it after downloading, but the + # .source_dir won't be set up until we are in _prepare_linked_requirement(). + # Add the downloaded archive to the install requirement to unpack after + # preparing the source dir. + if not req.is_wheel: + req.needs_unpacked_archive(Path(filepath)) + + # This step is necessary to ensure all lazy wheels are processed + # successfully by the 'download', 'wheel', and 'install' commands. + for req in partially_downloaded_reqs: + self._prepare_linked_requirement(req, parallel_builds) + + def prepare_linked_requirement( + self, req: InstallRequirement, parallel_builds: bool = False + ) -> BaseDistribution: + """Prepare a requirement to be obtained from req.link.""" + assert req.link + self._log_preparing_link(req) + with indent_log(): + # Check if the relevant file is already available + # in the download directory + file_path = None + if self.download_dir is not None and req.link.is_wheel: + hashes = self._get_linked_req_hashes(req) + file_path = _check_download_dir( + req.link, + self.download_dir, + hashes, + # When a locally built wheel has been found in cache, we don't warn + # about re-downloading when the already downloaded wheel hash does + # not match. This is because the hash must be checked against the + # original link, not the cached link. It that case the already + # downloaded file will be removed and re-fetched from cache (which + # implies a hash check against the cache entry's origin.json). + warn_on_hash_mismatch=not req.is_wheel_from_cache, + ) + + if file_path is not None: + # The file is already available, so mark it as downloaded + self._downloaded[req.link.url] = file_path + else: + # The file is not available, attempt to fetch only metadata + metadata_dist = self._fetch_metadata_only(req) + if metadata_dist is not None: + req.needs_more_preparation = True + return metadata_dist + + # None of the optimizations worked, fully prepare the requirement + return self._prepare_linked_requirement(req, parallel_builds) + + def prepare_linked_requirements_more( + self, reqs: Iterable[InstallRequirement], parallel_builds: bool = False + ) -> None: + """Prepare linked requirements more, if needed.""" + reqs = [req for req in reqs if req.needs_more_preparation] + for req in reqs: + # Determine if any of these requirements were already downloaded. + if self.download_dir is not None and req.link.is_wheel: + hashes = self._get_linked_req_hashes(req) + file_path = _check_download_dir(req.link, self.download_dir, hashes) + if file_path is not None: + self._downloaded[req.link.url] = file_path + req.needs_more_preparation = False + + # Prepare requirements we found were already downloaded for some + # reason. The other downloads will be completed separately. + partially_downloaded_reqs: List[InstallRequirement] = [] + for req in reqs: + if req.needs_more_preparation: + partially_downloaded_reqs.append(req) + else: + self._prepare_linked_requirement(req, parallel_builds) + + # TODO: separate this part out from RequirementPreparer when the v1 + # resolver can be removed! + self._complete_partial_requirements( + partially_downloaded_reqs, + parallel_builds=parallel_builds, + ) + + def _prepare_linked_requirement( + self, req: InstallRequirement, parallel_builds: bool + ) -> BaseDistribution: + assert req.link + link = req.link + + hashes = self._get_linked_req_hashes(req) + + if hashes and req.is_wheel_from_cache: + assert req.download_info is not None + assert link.is_wheel + assert link.is_file + # We need to verify hashes, and we have found the requirement in the cache + # of locally built wheels. + if ( + isinstance(req.download_info.info, ArchiveInfo) + and req.download_info.info.hashes + and hashes.has_one_of(req.download_info.info.hashes) + ): + # At this point we know the requirement was built from a hashable source + # artifact, and we verified that the cache entry's hash of the original + # artifact matches one of the hashes we expect. We don't verify hashes + # against the cached wheel, because the wheel is not the original. + hashes = None + else: + logger.warning( + "The hashes of the source archive found in cache entry " + "don't match, ignoring cached built wheel " + "and re-downloading source." + ) + req.link = req.cached_wheel_source_link + link = req.link + + self._ensure_link_req_src_dir(req, parallel_builds) + + if link.is_existing_dir(): + local_file = None + elif link.url not in self._downloaded: + try: + local_file = unpack_url( + link, + req.source_dir, + self._download, + self.verbosity, + self.download_dir, + hashes, + ) + except NetworkConnectionError as exc: + raise InstallationError( + f"Could not install requirement {req} because of HTTP " + f"error {exc} for URL {link}" + ) + else: + file_path = self._downloaded[link.url] + if hashes: + hashes.check_against_path(file_path) + local_file = File(file_path, content_type=None) + + # If download_info is set, we got it from the wheel cache. + if req.download_info is None: + # Editables don't go through this function (see + # prepare_editable_requirement). + assert not req.editable + req.download_info = direct_url_from_link(link, req.source_dir) + # Make sure we have a hash in download_info. If we got it as part of the + # URL, it will have been verified and we can rely on it. Otherwise we + # compute it from the downloaded file. + # FIXME: https://github.com/pypa/pip/issues/11943 + if ( + isinstance(req.download_info.info, ArchiveInfo) + and not req.download_info.info.hashes + and local_file + ): + hash = hash_file(local_file.path)[0].hexdigest() + # We populate info.hash for backward compatibility. + # This will automatically populate info.hashes. + req.download_info.info.hash = f"sha256={hash}" + + # For use in later processing, + # preserve the file path on the requirement. + if local_file: + req.local_file_path = local_file.path + + dist = _get_prepared_distribution( + req, + self.build_tracker, + self.finder, + self.build_isolation, + self.check_build_deps, + ) + return dist + + def save_linked_requirement(self, req: InstallRequirement) -> None: + assert self.download_dir is not None + assert req.link is not None + link = req.link + if link.is_vcs or (link.is_existing_dir() and req.editable): + # Make a .zip of the source_dir we already created. + req.archive(self.download_dir) + return + + if link.is_existing_dir(): + logger.debug( + "Not copying link to destination directory " + "since it is a directory: %s", + link, + ) + return + if req.local_file_path is None: + # No distribution was downloaded for this requirement. + return + + download_location = os.path.join(self.download_dir, link.filename) + if not os.path.exists(download_location): + shutil.copy(req.local_file_path, download_location) + download_path = display_path(download_location) + logger.info("Saved %s", download_path) + + def prepare_editable_requirement( + self, + req: InstallRequirement, + ) -> BaseDistribution: + """Prepare an editable requirement.""" + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info("Obtaining %s", req) + + with indent_log(): + if self.require_hashes: + raise InstallationError( + f"The editable requirement {req} cannot be installed when " + "requiring hashes, because there is no single file to " + "hash." + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable() + assert req.source_dir + req.download_info = direct_url_for_editable(req.unpacked_source_directory) + + dist = _get_prepared_distribution( + req, + self.build_tracker, + self.finder, + self.build_isolation, + self.check_build_deps, + ) + + req.check_if_exists(self.use_user_site) + + return dist + + def prepare_installed_requirement( + self, + req: InstallRequirement, + skip_reason: str, + ) -> BaseDistribution: + """Prepare an already-installed requirement.""" + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + f"is set to {req.satisfied_by}" + ) + logger.info( + "Requirement %s: %s (%s)", skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if self.require_hashes: + logger.debug( + "Since it is already installed, we are trusting this " + "package without checking its hash. To ensure a " + "completely repeatable environment, install into an " + "empty virtualenv." + ) + return InstalledDistribution(req).get_metadata_distribution() diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/pyproject.py b/myenv/lib/python3.12/site-packages/pip/_internal/pyproject.py new file mode 100644 index 0000000..8de36b8 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/pyproject.py @@ -0,0 +1,179 @@ +import importlib.util +import os +from collections import namedtuple +from typing import Any, List, Optional + +from pip._vendor import tomli +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement + +from pip._internal.exceptions import ( + InstallationError, + InvalidPyProjectBuildRequires, + MissingPyProjectBuildRequires, +) + + +def _is_list_of_str(obj: Any) -> bool: + return isinstance(obj, list) and all(isinstance(item, str) for item in obj) + + +def make_pyproject_path(unpacked_source_directory: str) -> str: + return os.path.join(unpacked_source_directory, "pyproject.toml") + + +BuildSystemDetails = namedtuple( + "BuildSystemDetails", ["requires", "backend", "check", "backend_path"] +) + + +def load_pyproject_toml( + use_pep517: Optional[bool], pyproject_toml: str, setup_py: str, req_name: str +) -> Optional[BuildSystemDetails]: + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + directory paths to import the backend from (backend-path), + relative to the project root. + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if not has_pyproject and not has_setup: + raise InstallationError( + f"{req_name} does not appear to be a Python project: " + f"neither 'setup.py' nor 'pyproject.toml' found." + ) + + if has_pyproject: + with open(pyproject_toml, encoding="utf-8") as f: + pp_toml = tomli.loads(f.read()) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). + if has_pyproject and not has_setup: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format(build_system["build-backend"]) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file + # or if we cannot import setuptools or wheels. + + # We fallback to PEP 517 when without setuptools or without the wheel package, + # so setuptools can be installed as a default build backend. + # For more info see: + # https://discuss.python.org/t/pip-without-setuptools-could-the-experience-be-improved/11810/9 + # https://github.com/pypa/pip/issues/8559 + elif use_pep517 is None: + use_pep517 = ( + has_pyproject + or not importlib.util.find_spec("setuptools") + or not importlib.util.find_spec("wheel") + ) + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + + build_system = { + "requires": ["setuptools>=40.8.0"], + "build-backend": "setuptools.build_meta:__legacy__", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise MissingPyProjectBuildRequires(package=req_name) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InvalidPyProjectBuildRequires( + package=req_name, + reason="It is not a list of strings.", + ) + + # Each requirement must be valid as per PEP 508 + for requirement in requires: + try: + Requirement(requirement) + except InvalidRequirement as error: + raise InvalidPyProjectBuildRequires( + package=req_name, + reason=f"It contains an invalid requirement: {requirement!r}", + ) from error + + backend = build_system.get("build-backend") + backend_path = build_system.get("backend-path", []) + check: List[str] = [] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend. So we + # make a note to check that this requirement is present once + # we have set up the environment. + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0"] + + return BuildSystemDetails(requires, backend, check, backend_path) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/req/__init__.py new file mode 100644 index 0000000..16de903 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/req/__init__.py @@ -0,0 +1,92 @@ +import collections +import logging +from typing import Generator, List, Optional, Sequence, Tuple + +from pip._internal.utils.logging import indent_log + +from .req_file import parse_requirements +from .req_install import InstallRequirement +from .req_set import RequirementSet + +__all__ = [ + "RequirementSet", + "InstallRequirement", + "parse_requirements", + "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +class InstallationResult: + def __init__(self, name: str) -> None: + self.name = name + + def __repr__(self) -> str: + return f"InstallationResult(name={self.name!r})" + + +def _validate_requirements( + requirements: List[InstallRequirement], +) -> Generator[Tuple[str, InstallRequirement], None, None]: + for req in requirements: + assert req.name, f"invalid to-be-installed requirement: {req}" + yield req.name, req + + +def install_given_reqs( + requirements: List[InstallRequirement], + global_options: Sequence[str], + root: Optional[str], + home: Optional[str], + prefix: Optional[str], + warn_script_location: bool, + use_user_site: bool, + pycompile: bool, +) -> List[InstallationResult]: + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + to_install = collections.OrderedDict(_validate_requirements(requirements)) + + if to_install: + logger.info( + "Installing collected packages: %s", + ", ".join(to_install.keys()), + ) + + installed = [] + + with indent_log(): + for req_name, requirement in to_install.items(): + if requirement.should_reinstall: + logger.info("Attempting uninstall: %s", req_name) + with indent_log(): + uninstalled_pathset = requirement.uninstall(auto_confirm=True) + else: + uninstalled_pathset = None + + try: + requirement.install( + global_options, + root=root, + home=home, + prefix=prefix, + warn_script_location=warn_script_location, + use_user_site=use_user_site, + pycompile=pycompile, + ) + except Exception: + # if install did not succeed, rollback previous uninstall + if uninstalled_pathset and not requirement.install_succeeded: + uninstalled_pathset.rollback() + raise + else: + if uninstalled_pathset and requirement.install_succeeded: + uninstalled_pathset.commit() + + installed.append(InstallationResult(req_name)) + + return installed diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0947499ea4f3140050450998f3f6f851e9edda2d GIT binary patch literal 3761 zcmahLTWl1`vFEk#^*+37jJ<{d~ydBax7wRL}0%#&;yO zJJnU))!kLq)m8nMa5#Vf_Fn$}#P5On8)aN*Z4#>~2BAfyAcfITrqMDP26$Fu3tWaP z@EN`!WQ2kz<0*JEUWUqWny=u`_<`mXK?@XunV>^^v``_O2|Kh`YbiuB5e7{l#rJC_ z6J-%*@;hAx)>|CE2Rcy5w6f@Jr1-BPC2)^z_9c`c=5cr{uu2GX*o%`mJkB~iqcGzf zrN((Be2vevZIErj9-MTfB3Nir(KRZzM#b?Kr4_yed?DB=;j9-|lCWO;3?sFDO%)lD z1l#{M)-lOi2C@0`s%hE2cZ!y3=vmG7jpFx9SkGZwxKt`?SYqsesw-HxWX+iPn%W0l z@nV*kSSBE=5?p{$llGp~O)INu7uUO?w`Bu6iY0J7ICMIV3G`6rV4ii;T)5F-jY#GILkr;VwozzWrOvCBI4A!rtHFYdqoUtYiegDwj zeQ8s*@L(~UyPTcCX1b^r)3T~tn83lL!7XVSSk;o{q2i3~bD7!BrrS5zIphwufp(@J z&^)Ro+86kr`B#BKxn`VF+A-QOd?zq)gTU~-Gw>?BeU(_+_H~)_V`Oi zBJ@T|3`sy^(tSjd1WXksxJYFAH3~NdY0R2b9u$sAcXs_wx+~r3x}U8?4pn@I$QBrZ zqlLBTcCu^-WVv7{C5_S{S$@Bi)tV!mX%Ry0Cmn$9B4@6n3W?BOis(k>4nWsXon?fr zw@2#;nqOX8rA^(#2#0TXKL`47V>X>*hu|pI!k)yS>lJs>aP5X~bsW%l5d$tQqha&| zh~7D-%zT?`&A>V8cIE^0A$t#IQMmdV*)lWE{(@O#81&PA9^&%1+!Q0RBeOlKekH4^ zif9>wV|cK6r?4V!(DsPfI2@LUu!GIftJa9$#u2s2&JtPc)vHaYIbHCXZvpxT`qw46#CLfvZL0H>Q6)UGbf+bbjYS>jR;(_4JbO^ulzlC3a)-`s8hHp|IrZToFL} z-zIg>)%0G-3lo|#mepj#Nj;{`6T^TDI%&`gS|oT}owgHGS)$8kj;KYNe{xQU+u;)A z9{7k%FO2Ok&g6_jQPptH2aCHv6O0qqe+Cm5k+l}`d1~?|umrcGjNBydwsXF+kLRr%j+R3Y(`pZi2EeAKugjtb4}p4sMB{C1%cV(I|7kl{)}Y1S`={+XSuz#MiG7 zdJim{3(N(}!8}c3n}8hqKQ?gXwPMAf*Ju&U(>t>X6#gT@wPh}(c<684CY@D0b0I$h zt?2dL1dwOhGFRryLfKRHe&oI9Z3r;vMBZgz z77b+wz}99&xGmhM-|#SVv;JlOC|u~hkj$o72E7Ys0g{u`+`DLs=|)z{U2zv8qN8={ z+qE{Mp!IfFdc9rO`YM`2?z*q;M|Eh7NWR%pKm=%}U=d%z1WJgiPl&26T9a6G>Zqte zVIK-OqJ5Sjj$ttewHXpZb{tBIIGMddrzpmht{GW{_UnpR(rNhthOXmQBFR}~c1LqZ zIxT0wQaK9*U7;glk2%Zk7H8W}S{5$Ar3SH*-poUE^b$MqFS4m++@{k_z z19^j@UW#amClW>dfTXw`Z0-al+_Z!55Cs#g468ZINlLZ{9wiePo-wLEZrFU@P<5NX zjAu+jQ-Li&ekhoB)SNU*ngaEwsgCVm)6Dj|eX%AXo26V1V{nP>fy7c!E!%%;I)|M+ zW%~%2J_b&*J=tOr>xxrIq_C4x$u6q;|Fp>tfCJnu{Y?V4@zdGvf6igzu?`l_+MN79K0p(W|UQfy@Y+?U?i z6JN`X;PqfFl&*!MH_l!^do#ai+%lHhdY3|d&jrpOs0UE2b^h$%{jEPqt)P@}wAPbe z?m1BHIk41o@EPj#AFYOVES$M{xfbbIjto4E3_OXpEe3A|E2%gC;CmE3`6Rjh=kKi` zCN|2{`VTDkpQ!eq_|v6I|B0pki5K zv$nO1{yTTnq~o=n>Dsp5dIZIGJx9J+d}SL-^xiqTJaFdWz?oX2cR4XsO$+s{yk(Gm>@Cy#is2@Y2WQ9+>IIzC|f520Tu4jl3w|&|A#+@H7 zr_Vo3pLf>WQ%&r7l-O5`ChL9}e)*zz!x}HmHRE8qKV}%36KI5{v-OA7OW(1^W9%(*4hCp` zHU9~y&M^%0If{RdTK2G~L_J2SIPwH4fmBuKdfp1WM0$3JZU6($1KT~| z0~)MAEfWDNI|Q?FIEJ4%hz6->hRVREH2M373wRvbZJW373tQh090F*|RlN5w0AqWN}-lDqKBU&Eob@O}KWnHe5Ga z$DSRb`f$T&1B*LDjp3%zCKh*vn!~$Bcd@uTv^y-0iY#6dY6-WFwz7C>s4d(++Royh z(4KI|Xa|dzg*wAsqg^as9`c5}N4vv&NB8pF1SeJeTYj|1#L1?qQDcDeciDHJ*PcfE zeD|810v8jC4>rbqYbM zMcyH)PA-?~ja1~9k6Wb%QIx+79E(MhIpLE44q0n|vXIf&=o zcs^?4&Tx`=lapHRo3tj64(fFef~FNTPdPa0gk+N1@S~9anWXmj?2K*?TJM%c)W~{8 z@0L1{c8tY3b>~&;Mc2Dxpz_)&{xUgc#Y({X&XH* z^|5{(L!0-Z%}+}->ROsH>Q-q#a!#<+1E`(N1;%0!V|oxd&+O=@*5iKklj_m>c@S^> z|I^QW3#iAxes2$bVBe!(qre*Y0uGC3sK;9+M+-#@) zbz9+q097Np~NKFywMWNU7;MU3{-$QikA@}3HO4_oV0 zVC-@*G9d=T(;+!5M`D3kFd7lZql)-kM2!VPp;zVa&IA>f*QttE0!lDCql#lu)7N>Whpooh@sY4R3nMb#8fnZ>SeDU3k6iwIVp#x z(NskSt;+gzNsh&2MVyI9vVz`4q`;+MC>XoWGVwA|k=2-1i_G5TW1T}c0_a#+4n)wc zsCY>hXH>ji4yp20*5|9i*kmvwP6wwcUwfq(q!Ema;oZ@3=aa+fbN+&M{aLRq;~a{H zLh=}meMT4#j>R&X355ceLb6{9Qd>L| za?G#fml={=(}CEeKNj`RC?Pb=igJi$%vZ)#uQ^k%*FlB+<4QE_$AXAajhX5vvO>X# zoGG2AX6MNSsy|~@$r&{q^6x zaPi{a3m3iZzn~`mf?9{6F)3Ic;XrI`GGm!gqBGN8LD_|@3?I%|FPldhJe(2})q4Z9XfAGzv{lugvjDV+$m%{$E)oA+@< z?qJ+iXMXMtf#Mt&BN}$m+!vc?gLW2F#(Yj$^+E-=bDY<777INT7?UTXAuuGbkTI)r zOsNG`#uAENl@-=bFVAi&&9kU@DYq1(ctuuX#;EN>;t~ARE(G)3r>^o1PsKYk3+@e9 zL*n?#;om*>(Xsnary7s0xdzu=CsVGIN#UeI21u;wU)xcP=DF0eP)ioAhWnkBpBm~!RoH)638BNpe4`i%Q5MkvBd&N)lWlcO@f z%f&7D3GZ^~g+30LZ`bUfI%%W5%Gi!721E=yj-1>9D_#oFv4R7b&Y}r$&Ilgl9+8e0 zmPY4bC`d;S+si)jIXdxVR;@-~SY055vroD%P6kxH0EnadX{N|*?MY%6j%7)SPEVuS z;J6rxvSw*7U=`EZ$13;w*z;_2*XtLqUWkdl-ivu=)D32IqRZFq1^>2;hXNDoY@;Gi z$k%Z4gC9|^3fnf@B8~@eEJ!_Q6GR4eGCC8I@M^4UG#IUkC@mP$U(ouP?a*psEKO8p z{j6li_O?oe*Y~IwAM-sK&TCiNP%`5fp9zIDj%Ws_$yiRF8+z_JWe?>EQ_)}~V^twp z$dckllGm#2$4xmvK|9fyr@>N%=_tw)(@<$k&?JibR;=}7&lVnE#-2O@!sArpKOvas zw%lAt*M}EAxbVo{wPANH483FDC@s4+xj4Dyuyk1GPiMt5sC#^rCkyK89$luj{l4Ytn z|7^ta?VTc_W5;!0=Y(^%7;S8JF-~la+t5ba`+`9Mj&J>n84%Qld}+x(MSFb5l|Oq5 z>O*gfkFnPg;LtE8*McQSL}Q_E<5m!1qJxb2(a!G`1KV;Vfw0Dc^~{L)%~xM6pf2F0 z8b$6MQ6}H3jP~T%m^@8dO#w$!^DkAeMD|X`V$*|teV0OkN%}pb$XD9riHYMQ(deas z^7^H~?8Ods<`U#;C=*fT`f)H*6}p07OUyON_qrMlLms9>>&`WeUbbq~T_)zw?c`&K?me5spn! zW$Mj!Ixw}G*vMRu&M1Ce9Q9K{Zv~SvGp4AjNye6-it$ott0{d5GEOKnN=&8JDCLyk z#t=i#2uzTI%)~Qx6evC_LfeBWD9}xmr|7{2t=X@RL3Nc?rIclp5*&!(NP31I&7{ke zAjk{htip`Du%Q``F?kU7VoEfW5unRl&e$(OxRxW5s@hQ*ttYyeT&U2VWWl!(QD4Wp zp69YPoU3+zXv@kqcdxXqHThCP{rpQyhd;MD-oAR{>f3WS=9Vr#w6%R+*S7r9THS$# zl1H|xbz4Kq*05%4TDNtkY@I8%hqiqiwT+3F)@r-gYmcOAk1V($Wj-ovN|!Znl%WjR^VvoQ3j zyF6<{u`MU(E?Y9ca}+0^%X90gA3T+=ti5ye_R;sw-Sgk|uT}Og;CS7g_B1X;vYe@T z_oLmNiK!J+)?zB@*)$6tCz|DOQnTvTE8A0*?ei~w>Z(PNtcfq_{(1Mlk2+SH*1DhG zw3vz33|i~auC}DmrX7rS+BdYYiXV#on1e#WInJ=&kIjbIdkDv+Bme`n z+~nf?FlVsxe2k7auzx?;zge=z%~v?3DsGl+IC#vMR3!gk?i-;D!LSr zYLXlcT(N`KXiMRtD>)5?myR|Z=egr3o)dL>FjUlve+DhjUAGCq&7Mqc(=R4DvCm_P8U<&|dd>SrLz+BYte5XgeG!tXhs051|^FWAtD1cX*!rtww>n&i@B9X3F%KZ#xSmm8$&6lrj1CF-|3`B9OP3gdCBtO)F2&9$;e#ObFw*O>hoI7*OOp#*Pd1Xv_wtFA24SLK`k3Ztk-He6d7Rql>(+Ya3ypDu_N+16XRaAq3_3>wQ{VVN>s(TH08}2ow z>iYFQH8kF-x7Wcv!H2*H$*=t^rPy(C>IwW80IMBE)j1f2t zh-p)wdkDN|Po2F=r$|r*)u1ECEW^Mrb)k|D03G2E#(c9KL)us{7AYR@yM;G7oSeFJ#_6#mqSuXSdz`Yq^B=w?@K#d=ZCU_%i`Ry zcdnQp+It|)INXqRJZ0&!%7qz7IMw^JW})Q37iO!&xnRzga&FK3^IvXNb8bj#yk(f* zu$SI)FS?V}#~-MFX&=f~Fp6w770gd~hQu3KR)DJxiLuaK;saTScd@-pZ% zwlK4es7$gR%K?+fB4$lzf!>lh_9}!c{fe9Llsf|fy>tE?U;#y)^HWK7UFVdGhyY-p z#*MvH`7XseDbKa$1@nRW~Otr>eWN z7CdCFoTnD-J(9K2lbx$*NOYviTe1#%baLfYOGCHqTP{3lbyJPocri7L&Cth)Y?q$z z>vMAf`Exu0N^$;13HWPnUhP2 za2Ysoj(>x<12`exZq)S_pX0XXvyW?Zp|6l342qqP`A&d~OhF@{k?{bg9cn{QV}Sf; zaKnj>c~f4Xs7Hei{88wFu*Aq3I{7lPo&+KpJ0gK25>vI>5;^nI4*ouG6 zbv!8?|8mR2m9>I3P_c@(WXG`w=O2uG(voZ+UaL5rbf3ZpPfpEl6aWwd)fomVKpGkp zo~fCZl`!^?0jl_6l7(e9<3W+}-~{2bG04Me26aFsXQQLMiAE{&6x^WTEegI*!A%PO z83n{#bJh?#kUjXZWl1!}m*t$ZU?Dn-A)H`0HY_1~+*!;X61Rc@nZal*aR(@JVgO#K zU$B@!P@oGI1@qbSUbpf#9$32}`ss#Htp~JDv|bhKF7;1mR&0$ZgijVQEXK!NY)NXb zC{{_4G0Rx65@V`L`-`zTEznpr7bKmwh9 z9EvSaJ7&iMsuzOclUj_;i?s~wk}2{;szIUMM)Oq}%PattlVrQ`D117^E**W0l42j5 z^nrxHM&mIMiXp}O6l)dLBSFf|7rr_fgqaFvF~9?mH+6w=Mo~!k%t5NU4eb15-Z$d4 z6i9fm-A-q$+B=vo43(HxVWHi&%+Kb*PxAm&5&+{ZP?#}w>T`%-D^ziICxhkQxbeo4 z1Pm_isoc#{ER&6#4=Mo!-9Bv~(C04wtp z*t$%TjYL&LEMP4rg`Qngl(plM>=0J;w?M=w+CJDPUci*GH9JC(Nsk!RVW|90$Bs4> zBc?@RQ3EY1aJ9*=UuH56##ntpwFm2+d|I}+RR0gZWv*{YRROt3-|I(xD}lo$6Xuz(o+7kr0U zF3ETdX=JUVlpSiZw}df=Jcm(EQ|+{%G-Cys78F{UWPYFu07(I^jAhKIU74Z`+tq+V zrWLQ5X`zfCW!$hlkd&yM(q_H8=i(l|C&ck+C{?l2X7B1#+LW5RqmO8al__ZIJRc1 zOPu_ft@&Zc;nnyjCx86r!;UjhJ<6&!1n1jlZ=6lrUr5{CTNbm$O7DS2vgT?^3QdeR zW?Te-`861L8>6Jtmd0fBe<6IEf7`Q-S>`sk0^jU86Z8uc;q&aYK8&-PO76JgCdq7U za%KeoN?iWFUXonCR5NKVk{=Ko?M()>) zU+&;D=(z&4ujm{V8*y7PN~7mrb)UnCOo{pT8Zl*mtj&mnqTPt+??#PtuDENeBcE=> zpbuM-gE8HCF&6_%#DjXfcjjT8SR&XvSf#y2UOZ=;nsZCG7@1hvCE4@wabbZU=OxEY z_YXXhGoKEceFi;fJfLyibkCKsAw0Hl^^q7weJI5{Nwl*`R=n@UehsF*-muQOH$af?>TvB}_As=N$0lf)H|Xw&pZ*3lsz6<}^6M9m9~VzBYZ?Yh^QDLMm@{V#inBK7vjCq4MF1}3td((S z4kz%Z*U-{2Bx-;j$?*kZ+i%ljn2MO8>1G^815_9YmML#P#!eyiT?tX5Eg(q@ z@xO;BmG;PYAgdW8nkj!`yk_$jZB2yR&KjPe57S`&57hhj0G3Vlj{O@IEz7-Y75f&3 zvRzz#)4h_rB`~*^?1#Cn5pvzTN0;pB%0|s)V)@)(R(jJ-2UZ7GyC0lNHk?=*+GyCj zGPKsPFIlxO>p(HUy)Z90zuel-u)-3Dcf(VD>+0gwTW>6a0i`^9(+&HVZ0WMvhmE}} z;kCwNsj_3YZRzr=L`kZA&&Ok%9OiSwcVvs^b&E6gl|sgAe2%|ud(_ahWc#$DIVm1m z4JQwcBzK)zt9TYJBAyzUG!k{ooy+yf+P$f=y-Q}`lgmSE6-8S z8bCFtGv&ICBhR%p3&b+jL9NzIA!Ry zJgTT!u%+SaGq^bT&awGn7(eD;+HjSS-D};|m~u6~ck14myJwg`!0=kr{x#PDP`Nw^ zU}hGoKG#~b0n_vFJF|Rm9yCu!ltMrCcn z{KKOQ!(UiAyPLTgEk2d#_?b)m(W@W6_Q7i_*B(^;QQaTZJ=}8&r0=${S*I>{hyrwv)6w5+S;L)*Vuj`Cehhm!Zol97cXZ1Ra`x(^P5gAv;nlgd zJ*OAVk4h^D-Pb_MMQ+t!v!8`>wD0qv4?^8g6iH4CAe4NvqNXwwZ zl^Fge(QMb6;yF*CUke~F4viOu!wcYYD**G{(T^tRSKR(Ff1maeF8b&qV8IF<(mx6V zghLhMqjOLZD>~CJMqY^Uy(0fxZtA0ZxzG zZ0F2xNSEve#gp*(*T4A^b?jD>)iEV_i7Lf*g)cqO*?EqD676x za=T=wtpKJ2&0GMx!d86=Sqw^ai$TVjmpZnYi*0x*Th?dMgza)~f%0mJSwY9HVpf~H zOj;~=!URui%ap!Ije6*=oPt}{Gr%Z|NUlnM@$_O6ZQKfpwka=t<0~6}iq4@O7bI** zp9n4Q=ai+l_`G}zyA;00Aq&;V*88Lt;9};|oXoGAOZ7a4@9M5FhWuM#F14Li$c<2W z1HtU*EBaSs1{Mde3#J^=$B2gii6q0(iG3oI^U=^YD1D^D9F;?ARK!Ov$BCSq8(B-Is|Wl8PMRFcvMc`OR=Uwp3^4P$pJbTn!Q z`^!XQjmR;0tZD0>Y-o_{{*Xx69+;DDiBmce zUm03Cw91ng?ZLbkEk12=?@HTUX>31O=9txP%VnkAWwltp-16!!B-Fs&$<~1f4G-L( zoJ@)%Yo%wB_A{^(qwS9w19;1I%EkS$tNv8GIpbtnp-f0ABciuF)JUs4+-2(z(9lLMm;59TyuN;l6(UYNO+|oW*gG zKM5G?pGU#G0KvqIjFn9Nvg&md5Hq?PMEq64hu4vDL8i``yqRfvno6)&vbWLEk+B&r z1!kbzOoBnPeoBP%6y!H2JMTyYe!{t;?TNjZU!2D0@yef}QOLYg^W9ds4MMh~(qd&FO~Dbkp7~kKIG=SA)#CYHJVYX)j)~n*404cCA;+~#r!mR%3q)W@Fz~a zgb1W6D=~3**{x?6pCxNukB9Nc0 zSFl>T^4?jx`S`52bmx8`flI?UifszU@;iwnw>_96l-Ec6Z_T<2e58Z9c!yi8T!LuKa z-IpJ_`;)JJ>rrKGe%IZ4ZSl2VcjxIl)>HoE9!&3UTi-pH+C8|{Qcjz(+}MnTn@m6h z*=GE&h!nE#V!~B{-ea1itx{MM%G34lfEMFtDsZMPDk9zJ%x_!NMD5sd;p^Ta^&49o zZ^-4w@fS0&(RZYHO|v)H3N!qU0?^Z^nadIMVSVbfzk5@-R>_Pa(r1z)Kv?F9gvG2c zb5`9;fy>aY1NichiSW5fX@wJq6{DA?@adwaYoEnmcM#~c8ra4T30jFzL})d!RQiJ? z>I|HeXd<8rXmH!MzjlK6LyIw%R}ysl(R+0Q5iGAVuC#&{%~I?g|NKb0YVVSC=ko2# z$*R4}BM9b4ZoUL*06czRaUkj1y=CScP^3S!e_&tf_}$)*de`g&kR&Xwo6kc>a97N~ zgg>8AT9LICCTT)|=J|Yf#*hc|l=gh5|HUYD^(wY%2MWZ3+Z>l-d z5KylHSPWVEgdYElg1?}E*tJ5NidnO?mF~skWBW19f&OXbzu}QMzZ$~|hUUuiUzqH? zuvx|N?!V$n|B7?q|IfLRb#5fZjr=XQ@8{gv&$z>X%N_nXcjz;&`!lZRGj8BB?$~GC z(a*ReECh}BmxACj&D-#il(TW6cHPmCax^3c)*S8g*0j5N-7Tiv;<|fJ%DrdJ-8t{b zS{;0A!kp!BTed8ZtqiOVeRMq8F_03EZc<{l4j(%4iGk&zyT^eIBffHOweq9i*ktjn zyN2&uZp^~5r|&`AgRwv8V$o0D*rb%~fquSy8Tc`7E7gFx%^%G@82jYlC+bfJl6^0v zyf1E2RyM-d^OY-OSq`^VX_Ic*fg0YE7^2!d%R^L~=T`?@eDfC^f^1U>|MUu=YTS|s zPHoaX+sz$&27p2{Pk*?lwIf~KknZ-S4<1R^HsKFkq}#gEr$&BRi|lkob=Hjgqq4e0 zb#nLq)q~01hg0=OQe^{1@$&ja)$P)(gDP{veLd@<7`{7ePMlwEyZc(IsxweFkn(UYBOaZt?pb#qU( z>F=W0E4+s$pfqcydrcR+KeE(rTJW50ujQ@D*8VI<_oFXt(mmVn;VaV4CZeo(igI zByO0Kc*zvzhj|v8hD|Is51Uym3=1r_3|m-i9kwAhhfNdqVLMN4g|K77IqaNp4Z9}X z!|sWa;gSi@uxG+M?42kbE}bYFE}JMHE@yQu;fjgM;YyaahN~v3hpQ)QhHKcnEnGWM zH(bZk_Hg|~!*ByjJHm|tlXd7;0WhLSE ziH_k8q&=hjaHs5*%jGV4%ZRBC3qXIv-LhNWGRh-=i)`2P^>El{;$&g`im_z5Sn?wO zh1|Q5`pBfGhI^jcvh*W9Q>XW-b;`1J`sB*-?-;%3V&q=Uy%{OwUNh3U7`amJ%}614 z#7O62vji(zzJ9lesq|ga&JZoxvv`OT#Vcs zxi=#<>KQ&Hm&$IbTsDozjoe(E+k5$lRB;dm=w~ihZlsX=hLO(2$bB>SW~4^V!^gk& zn3b6^i}k|~4}9%@s#rhA2e_MD&@_s_mvNwHIh?C4CN9o>l$qT4TgEJNv2ns~ncis- z&~la=J}D3Uf9mNJX26dx=0-D8@)={?;jXPkjW?SU0uRXH{%)5cjQN+wV zQa5`1Mz+VVo=0v4@_Is_=h!zoB_H~`#MW{v)^b~REidQIP?UZ6`W}4!6?{3Z2I0R9 zUPMVRN}gwZ^r4S_`Gt?n`T`Gs6Ln4Ft9i?vNsgGL?P&EaX@}gMS>0#wKAiWy6Yt;7 zd*6lkm!#d9oh_V$Roa8nm#0lZ6VFcQb%aLBcVMQ$c}f26R7jC0T_r%SH5-eg#Y;I6UWb;89b$#k4C07`|&_H9Jm&iHDMqW zjA@Qjazs`Fv8bZi&%}^oMdw3mOtTM7#zN6ZAgo!gOihMm^z95zNKuxn`b=8cnTQ&r z?x@-cML{3+`4c>e`CY{HWLAdeuFG;j365P3MkiTs7ekYmWmQFM6qYK1kShB}qKY5A z#->zi5SWTZ{gNDvO4PtJD#!d&O4zRk$FK&-u@6Qs$+0PgIw-jq2)+^+l~0BulB{Uu zv@)_^$y>3Ritluf#bT3j3e-5QA6C`X{hjzr>Na0{-`0+q_U}<9S+?bn zyJSNi1AECX@c=Uiz`{Pw`&?QX+XyLddj>UE-r8uckm{GEP>dY_XD~V;tNsxsI)Ocp zVwq<$dP{>ji}zaI-ID*&f{EIa-A>HPIg z0w(<^3&s5YnffPosm~~TnWnh|!5o(^=Nh-n3-|4{sfI2+uJ4!^-tnetni08EnKvr@ zg}rtIjX0laa1bZ~L(zfu`!%QEKM|Ft!jyLV{okDmgfk^(?6xLci$=qW3oR8|8--R~ z=|=D&r}!wng@Q&ScnJwrLhvS+_HeyBQk}j>UXNwV!>Zb}1##NSRoAC&l(KWkb5P33 zRn?_klyYhkfW8+ZDWWxjL?WqY{l=B41Rm($c$x|DNz9+x4dPk_cQ03SCp z=-KE&kOLoy2f&yBFlNMpYyt3CC97luWwZm^+NNz-7pK1P=W(hvJM9atg=VEw9*Jr~ zKp9mv0f%4JPgXld7z{#;$UfQgoZ*8A$lG%bRNJnjg6DZb`LtP~4bmX`dhX1>%yjo8NisJGo+HqxfM< z`@65-d3`02Y}wB0J#5=TaSJ*hoHfWl-@h* zn3hztsX9s3tRsvND%Hr%!-{lvgW1D?7lLof-1s4aa~zN38_OYQlfl2vT4MBV?7{K2 z7(CXjHEtcx@6V`%!)eqR;9jl;pKgoMSnP@0aFk7P{>S`BnFBU!kK52~~9eEIas_*%{W&p3;vY2NjqN=&(H zmTOk4KdE_aHdQ<4od8I8b<)+EDsNnKH$HNq-tSbRi*Fo0YUl6rHiViDs|+?F7RZlcLqmBYI2a}v6u?d9Ll58p$#k~ptLZ$` z>l4R_9k9QrH355W0URnZp9Q2KGBrV6%bHWANwFDdPMQtdX;t%vMk7&0_Ja*&qK;N6 z-}z$W0G&i>w?;F2!~bGqV2J`cY<|0C2X!8SiVeBK~(XV0vxVH)HAz z;!pX)!g9V42yUK~Uqnnq$GdGv`P`u6QDq_!(>c!^*R+@Fk=UcPf4Pk5A2@OOidO$* zCCHzwjPYJ18c5Ix`29LpPh6YNrd*^^2uo{Tnl(YBAsBkpsmaNx5|brJ=+GCCIO#V8 zM1iuH1f~+r*AaCFE^9I*ArD_LxK~JuAT5jf4+y~2Ik}qd_3FN4bziEq^0xO6y$izf zm6Y9mvt*%!BG-az!zR>N=Z3%-xl7kw&G%f*386XRY6jZ2yVq?s_iQx}>JBb=KCRn1 z?@5(c&Yeq@Hh;#MEc@q$l*_xg>-PRz``0TvlNFu!T%9W&Kk$snUj2Wy|9do71u0!NJvsKnnC-0dD|#Umv+0RD z)`S?C@-fWR06ZA#HJDnsCpiCtecw{Mc^n0YtJEh-B=a&oMZ2 zxKq^`MZ{wPRqX9WI3`}3iiweEJ~OB@m)Aq#uy_q@C1dTRz5-sE&>P{sjpq>j5wA<3 zaqeXh=~KrhPlFzJ}`nGHQ z2%~5!4JwLrj9L7`ac~rx@EeoL;hD}1ebQ+eBTan=!_iYCM~AAfWG(DTVd&)?hi{15p@W@P_Pr6cjrDw_G*wr2i{u0b(tPLd9(`&U%W z$%H{tZmXI-5`{t#vY~Pb&6LXs@HJLl+v;o3thCOu3iVWUbQBVp?Rr3ozy_dsG8EOX zS5Qdfs#)b5VA3TeNPS6^<5rm(9$Iwh;T4&(9NFQuQq)%h`ULd(n4(aAO+s$eY*Gjs zOlZbzfom$u5r}K2F<>#ki~^IB7)vXgnv}rb=XIi#(lBOl&hCBa^6K0S z6shZ-`;wje=1<*sw}E3>cZv60kWwqw-5p7H$GUr4(!Fhi9lnN^^@i=qhV77CdpwUh zQ;Fv@CujGhsv6d-x{_60^UnNaMcsNuSF)mOy`n!^(LZlT-!~5}99kMkqWhYL`O~So zhIz<5-kXQtI{aRDs=oQ%zB_%1Iv>l_r}1HJ%3ZzgZc4hFmZbIOoyq2%_uadw&5^f` z5O-8}d+65C^3h~v*ZheG)wQ=rZ;jrL-ip3|?Ss+xMn8zY7hN4&>pHSl{oMSi2OV7> zoOSgg2_>_C{dM+oG(iS%CQ0s+VS&eifYgbbad3ao+0*%Iu?_}Ytx`;k={Ic zMc0}Xj8&i)q;4`9U#lOsRJtWo#bRG1)mpx>PK;g~mxEYTUDLuo9LpWZUraWq9@bM7 zE2&(EITht(9aY7_XhhB|>PcuisRNaifH9`TfpIUtC#Zwaff$X1r;QcU>y8Cpm7zHj z<&hE0h7A=^uwbwgibds1o%Ex#X^|>2iX(~GGGwvld28Ay4$-u;BNp#foCr+o8!oHR zJ@qht1AVjJ4BkRlS#A1IDT-bEfBIh5xBkuSGm6g)^Vdz|U$P!Fd)6B}vV~ue<&5Zv zW9#%iqR%Bg8*R}9;3@=5ys<>Ar|v))R>!GPXt1XgQHlmtF*GqrJIA(<6nUzc71e$E zj)3s8>bgpml!2_T0NYo#`34*k43m|WsT)W@XXI=Xk@Z<}iUM7+%V_NYs;eZuQYX6b zuRKRxP*4kEsGdav1n~e9*6Z)t>K|0~tXx^$yH@oqsFk-aVXyntUY~N8-aNB#hN24# z7brTna1O{CR1p6mL_3_Isil=Vnnjn{$Iysw%pt3oO;8fx-(rCs&;o-xtb(!)c0#-C zkYH%fc+gmxozVFuPrBmZ)+p0i+--TXs<7GJB%uaNpY^LQ>QSE)!#&&{ssRA{bI;Ku! zHa4<8|H59U>ns?jC89>bcYt*0MkP7}20LF=BT71njNak|w5G4&>;Kqv+w^^lg(Et& zmwU&;j6kNDtqd)S0dW-kS%jH0dUU%F5s%DKW>C{djxgo=GWbbvtjNJBpj2Z;vU4t6 zkt3MvOyg5lg!O-cmV=aTjOPc30~Jrj)?~%jm3^zjYZcF}+n>8>3z%BAGL;9OFLwd~WdC*JdS>)9wl+e0wdWvay)as|y zEy6JivbuE>0{?aVMqW_g+Ml1)>=YfcZLwB~f& zMYTb6#5XW>O2hUgh3{)p1k7oYOV}GF^P!L1JW62?mQZ< zYAz5fNJ-=_q-u`K@IJdho=y;7nb4_OA>zVUMj=?!Y3N4f6xg<3fH~tLP%twBwdzy|n9IX_uiuK5}pC5vZUmYjyRq?_Pxu9tZDE z-yH>xEY}rdCJ&DTB$LOMIy`nu?(Y}28 zens!6EuHVi@5I+zb|zbPuAcsQY^~+gt<#^@wXN6rl6Ah7?)!B+KW%A!_xhddRPRA; z{kyh1ws*aEyesy#+8wD{al>L3s~1m09%>ZV8=grvJhQqlacFR@VQ9T{=w9j2!|M7U zIv?%EC#JV^Wf%D`)N(A}8v_SUl<dtq><>P!TBhERdrbU^%qclzvFDH+rWr05KjIaT?6%#ax@mG2{^mFsLJ z5kJs5-OtiIp^hr_fy|l2=gxDf5vdLDXQokQkY03WJy=Jt$w~%($e{^tmWpor;brAE zDl)32Lry;YyoI8fwl9Yth7t&HeuT=p-5nlZUCU#u!p};6TC!Gkc)>Z(&+q-Ts%6=> zR@FW4eAv3}GtT4iKy?6Danq zq0+Rw$BChP535KqRYbh0;$sW)bgqvkU7*1wtZT;K#z_P}U^Mw%=#D~y5W0MO8BQPe4z0rkr`y)Qzxx&zf zQx{+6W-)7$xVS0jhqvHR$`%~OcqP=L4`WZv5Ga6#40>-MFb5ZN8TE=;U_hraTY7-j z`0-*Khb6}gvtDhmNSWjC@V!iEDr=<&nyQ2an@%BnfUpFhrL3z~-1-K-Zr1v`HHV7e z06J55JURs@DUyPj%+~p=8u8aP=4q%Qp~_cZcR=4(SYUDSu2|=#D(BiO;F;@G;7_XU0>N ze?hOVOm_@VwIWCP6AGA(bcs@=*;R=F%;GFvmv0O}qQFf1CV!=zCZ93%OkR51fIcW^ zflJDp|9SJgHAM>2o@7POT16kUqfM>z_WSnwU%JXtT|Mhv&nCN`oj-lw-To=rh1bM= zNqf`0eQ{e_Fgw1DTrJkf29t8e0U;;YLV(==N4X9Deo>C(VR|;%gk&d{jnDsjcePl;2#zIIIV$m?Ku^q>G@) zAn|>o_|1&=?Ro(2RjAAW%1P(E8{#bW6d~YcN7%5P{6KNw8Ig|C79MPLV5*taYK zLzB+bG0u$I85%TVU1l1Fn65FODa`6@{*o4wj_w?ns;Hh9{=m*Y2vggN%uQa)MctIy zCs6Pg)D?`dj4$CWHA~0S9HQlc#}w(T0M!fPFZ*O!fq#dreA--03}Eh#7=@l$F2@qY zs2BFkAS7xIJW-F72^alLSt?IHbH$)E3x$B?M!>Q;C%sET&ihS*+7Ajq+nWO6A9%lK zMT$QMvtOCqtoi zEpQ>Elfl>;Lh|_wmlO8iFs$49G5ZTtEbw{MJ!Ta@46?DA)_jt_iSX%F{)YCKM4376 zfk#}fSo3ry?49~?v1@h%#c1x_af1v&(^E)`p*iUjb=0F@5h41c2{by6+cA16)rF$OV^*a(_!v< zpPlKhm9rc42FbXhdG6$!=N`Js<}T60uwg4 zLeQ+t=|=tRBW0Bg&R7B2g_yG~rwDYA8CD@nh+hZv^GZn0TG2>qwM5 z6wro&v*C#B14V^(hIvkB4UmCXU`vZeSdYw)!f=Ql2`Orfjjt0^P|}waLR}gd1I>;( zF#@VNj}KkAaANQZ>B%f`^$hAXm622On^r=TfF>r(S4=9Q3HV0ndVXD|hr@_`on2DY55iQnZ{?Yv?EP@>>b|vY2NTr?@0A`*H8kC_Kdf$D-j%4{vR1m~*A)$^ zt{sWecKAZv99kG!8hH2YowLiawZ@)bxO>wrnAoEZ&R&}Gwk5oM340&Hl&5w1nGg29 zw|8aVTKleqXV;p2SK5L~zf%cB-#BhPZs!XimzWO*xvwK(=-vUb;8GaG^0TI#fLfFv z#pyOwSKwod@|s!dgmSnj^^@Oa7E1O&>6E$FGP8pnuFJH+u$^a|-5Ey+g$ms7MR{T} zHm#Et{Rk;{G4DYz`hSI3GpkeAl)pg=8FW1I_TP+Gu#3zqMLADp6#N72{s|niwdIaAFN{2N1ZEay-j2@;8tzb)H!Z~yMQNlt#L_oogNm{TIfXdT*bbnZ z{4KhIEz;45DL{LDNuCS`f?%m(HN_2tkP?m1wFEJH69J%4mUM90u2vWGkxL-eHhZi!xc=91Yz+HDp6Gxv34=~L|oPa z+q8M&#=R`83T)n!z}dLjPQC*8QdDNHB=D0Dh*C%mPO;142Clt23Oqh_O`MzxhqH?U zbAZ^sbN7y2;z4%H`#^ucUab%Cg&Vq)0d^ag+VoSk!&m*8eSw++8rt9(?uP{ddoZI% zvO6r2*BgBR5d}82s~3kZpLr1y8|1NoqMOgzh!}8k>YCaI-@3@C5}lgtiz=i2*l=ti z74+}lvw#2o9sBq0-`|hH8MM>)hC>s$aie#HZG&&UtOVf|Cx+!1yRjpM@FBXqNNaP| ze^u*KoY=^Yk1b;s7R{=kL~?gyCmQCJLbRdTGB<2A zI}SIyE3C`{gc&*oI>};`3&>O`_#I)CFcLaO5jnyrc8h3Wl-6zQtvjJbSRGhvrE6A> z?WFNNwfN$L%Ie!^Zk<^gTdUkMf8v)F(CyYfgme7CTL+hID^+V1{R;z-)g0T?9?o08 z1nl0jW^Z{^hQ2e{{b=3M23|A6hE%{s6Ye4Gw?RtP0xmkMvLnPT@vm~quHs6=eZ11eg{6S=<#f{Brah0vC4I41QbBUph~2UJODBBv}slD8t>U zn_O$@CnS1|o{7skp1E5FyfzgH(GNiA2mF$(PQv#{72Cz$t-WYLeBA*NzY!4z;8HhP zUMz=*2}2r)CUXH4rzY!CCY~e=O7_IeEl_=^Ow9tvuBTr3gm1AxU#D3Z+R+3WQ!^>o z24~uGYF9!E`6y7oz)Jd8r4k#YnE{{*=?0V}y$UfnpX##Xfl4cvatgBN! z$ipQas>{4QU}a^$j6wC(NhLt}MC~;*SlcHq;wXPa zlXQv3lPKGov~5j!t8c!x@Y>SOHE+wj@W5WXRC(XtO#H!(g&Rwi@7CR^OMo%6x23Iu zmj?|zi`9j@}$=Bh7u#qb@ z4wCXQElCsswoX=lLSbUPK1%S6)FyMm-f~ylN<3XDSv7tLy-3jfFK>NgwDs133LOZkn`S1*@g9!_4#> zT3cZ^Og_R=vR`U}*^}rOyP-~d0Xl{2XZz`cd+9^mFgg-wo(Jhvl|Q8{+_asTB*@~= zD1Sf||B8aYrC@@}y_>w(nU}Zn4wb)6<#ywD2$(;-=76hx#@XCOJXz*NnWhHg6kMlP z?tB+>%{ztPl_8NUbH9M;Lp19U)5vLFd`AQ(79AJiYHa1iUI`}r+k}&7btk126q4_oM)c?y8dpAN=Of>TNwK&RYSoL1us$XJqn(q zfb4Wk(a%(@n&Si$adEJ8{n5XnVy0s`M=25!7*%Ij0V*s$suIcDuHTWcAJl&`2X;XA%Fq@Z3XJOTsD6*~mg-Sqd)iTpGLMO?tcM+z(5t7S%<0 z>G|cIE7s*_lTH1J>i%TO_BrQ6clG?Sn`al!CTetjIFtM%{fvfHS?F4D%rDE zvSrShc5|LuJtt9nc&+3JvM{Q5U8qe8wJE`~E;J{FW|pW)LNcbD`lL|L5)DbAp|Gef zDb%r?Z1Zg8#-z~5ikgx_6B0id{N5mY&-OwirJKCZni5>u;;tq8a>eo(dBrDMcPDH2 zBrEoAa9-Y&?qc&ZdKvoO5bK3Cwh2ejxN0%Bbb9&nO7~CtKkQF*?oT!zNY*^N!3k*W zVU1a3v*|RC+Re)Xd|864`+j!hr$-Wf$C91Lli~pG5TLf3+jEZp&rRo6`8&b)T7T63 zLHB#ze>QQi>0E-Vf7r19f0<2NOt|Ipz2gh~+vc101^e$`_>A%rTsv8)8|G`)9rZ~^ z{nEZQN5`D?bE}u%@(3TX<@1hOzWWipKD*NgIbSa<%&8h&r?2IkQl7H38S%rCnzRKm zwga2&hc|!PMz5spTO6Zn1Id!Ew1cvoTp4~4gHmqJ>P>jX<&G60;q6IUdN)cadyj*! zUNWaSM9c0CiqehT*1kuU7T%h2R;JB}=_qBpr2-6Wt=X_q>O7yBV@LO+lH)voIOQx& zn^UKPimn z@bQ&whKLJih>ZNDp;xvvtWRo&WwCm|CMPZ8h70eXzsRF|&m)e)^m$Vi*5vfEKiRlD z%_05q)(wi%+dX{m(&aRVX!-e-ovY@Reed}<==E`%iLY6z!&MT#Che@`%NNJitG6Yq zao+?l>Are?_tL>MhiK(I+@kp1>BDxuW7(bN5Un?4{gmCyuyF9HD9O{ F{x8TSY;ynr literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9263c884af633a4725746d683811e530df9a539e GIT binary patch literal 38432 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 M;?J$HvAyU20WhWurvLx| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a5fffc3caf38be6109de48d8b791c1de2a35c86 GIT binary patch literal 7236 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de414d8c7e99fd436788e5121f4a24a729ef6b86 GIT binary patch literal 32995 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/constructors.py b/myenv/lib/python3.12/site-packages/pip/_internal/req/constructors.py new file mode 100644 index 0000000..7e2d0e5 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/req/constructors.py @@ -0,0 +1,576 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +import copy +import logging +import os +import re +from typing import Collection, Dict, List, Optional, Set, Tuple, Union + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier + +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.req.req_file import ParsedRequirement +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.filetypes import is_archive_file +from pip._internal.utils.misc import is_installable_dir +from pip._internal.utils.packaging import get_requirement +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import is_url, vcs + +__all__ = [ + "install_req_from_editable", + "install_req_from_line", + "parse_editable", +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def _strip_extras(path: str) -> Tuple[str, Optional[str]]: + m = re.match(r"^(.+)(\[[^\]]+\])$", path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def convert_extras(extras: Optional[str]) -> Set[str]: + if not extras: + return set() + return get_requirement("placeholder" + extras.lower()).extras + + +def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requirement: + """ + Returns a new requirement based on the given one, with the supplied extras. If the + given requirement already has extras those are replaced (or dropped if no new extras + are given). + """ + match: Optional[re.Match[str]] = re.fullmatch( + # see https://peps.python.org/pep-0508/#complete-grammar + r"([\w\t .-]+)(\[[^\]]*\])?(.*)", + str(req), + flags=re.ASCII, + ) + # ireq.req is a valid requirement so the regex should always match + assert ( + match is not None + ), f"regex match on requirement {req} failed, this should never happen" + pre: Optional[str] = match.group(1) + post: Optional[str] = match.group(3) + assert ( + pre is not None and post is not None + ), f"regex group selection for requirement {req} failed, this should never happen" + extras: str = "[%s]" % ",".join(sorted(new_extras)) if new_extras else "" + return Requirement(f"{pre}{extras}{post}") + + +def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]: + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith("file:"): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + get_requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, set() + + for version_control in vcs: + if url.lower().startswith(f"{version_control}:"): + url = f"{version_control}+{url}" + break + + link = Link(url) + + if not link.is_vcs: + backends = ", ".join(vcs.all_schemes) + raise InstallationError( + f"{editable_req} is not a valid editable requirement. " + f"It should either be a path to a local project or a VCS URL " + f"(beginning with {backends})." + ) + + package_name = link.egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '{}', please specify one " + "with #egg=your_package_name".format(editable_req) + ) + return package_name, url, set() + + +def check_first_requirement_in_file(filename: str) -> None: + """Check if file is parsable as a requirements file. + + This is heavily based on ``pkg_resources.parse_requirements``, but + simplified to just check the first meaningful line. + + :raises InvalidRequirement: If the first meaningful line cannot be parsed + as an requirement. + """ + with open(filename, encoding="utf-8", errors="ignore") as f: + # Create a steppable iterator, so we can handle \-continuations. + lines = ( + line + for line in (line.strip() for line in f) + if line and not line.startswith("#") # Skip blank lines/comments. + ) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if " #" in line: + line = line[: line.find(" #")] + # If there is a line continuation, drop it, and append the next line. + if line.endswith("\\"): + line = line[:-2].strip() + next(lines, "") + Requirement(line) + return + + +def deduce_helpful_msg(req: str) -> str: + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + if not os.path.exists(req): + return f" File '{req}' does not exist." + msg = " The path does exist. " + # Try to parse and check if it is a requirements file. + try: + check_first_requirement_in_file(req) + except InvalidRequirement: + logger.debug("Cannot parse '%s' as requirements file", req) + else: + msg += ( + f"The argument you provided " + f"({req}) appears to be a" + f" requirements file. If that is the" + f" case, use the '-r' flag to install" + f" the packages specified within it." + ) + return msg + + +class RequirementParts: + def __init__( + self, + requirement: Optional[Requirement], + link: Optional[Link], + markers: Optional[Marker], + extras: Set[str], + ): + self.requirement = requirement + self.link = link + self.markers = markers + self.extras = extras + + +def parse_req_from_editable(editable_req: str) -> RequirementParts: + name, url, extras_override = parse_editable(editable_req) + + if name is not None: + try: + req: Optional[Requirement] = Requirement(name) + except InvalidRequirement: + raise InstallationError(f"Invalid requirement: '{name}'") + else: + req = None + + link = Link(url) + + return RequirementParts(req, link, None, extras_override) + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req: str, + comes_from: Optional[Union[InstallRequirement, str]] = None, + *, + use_pep517: Optional[bool] = None, + isolated: bool = False, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, + constraint: bool = False, + user_supplied: bool = False, + permit_editable_wheels: bool = False, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, +) -> InstallRequirement: + parts = parse_req_from_editable(editable_req) + + return InstallRequirement( + parts.requirement, + comes_from=comes_from, + user_supplied=user_supplied, + editable=True, + permit_editable_wheels=permit_editable_wheels, + link=parts.link, + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + global_options=global_options, + hash_options=hash_options, + config_settings=config_settings, + extras=parts.extras, + ) + + +def _looks_like_path(name: str) -> bool: + """Checks whether the string "looks like" a path on the filesystem. + + This does not check whether the target actually exists, only judge from the + appearance. + + Returns true if any of the following conditions is true: + * a path separator is found (either os.path.sep or os.path.altsep); + * a dot is found (which represents the current directory). + """ + if os.path.sep in name: + return True + if os.path.altsep is not None and os.path.altsep in name: + return True + if name.startswith("."): + return True + return False + + +def _get_url_from_path(path: str, name: str) -> Optional[str]: + """ + First, it checks whether a provided path is an installable directory. If it + is, returns the path. + + If false, check if the path is an archive file (such as a .whl). + The function checks if the path is a file. If false, if the path has + an @, it will treat it as a PEP 440 URL requirement and return the path. + """ + if _looks_like_path(name) and os.path.isdir(path): + if is_installable_dir(path): + return path_to_url(path) + # TODO: The is_installable_dir test here might not be necessary + # now that it is done in load_pyproject_toml too. + raise InstallationError( + f"Directory {name!r} is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found." + ) + if not is_archive_file(path): + return None + if os.path.isfile(path): + return path_to_url(path) + urlreq_parts = name.split("@", 1) + if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]): + # If the path contains '@' and the part before it does not look + # like a path, try to treat it as a PEP 440 URL req instead. + return None + logger.warning( + "Requirement %r looks like a filename, but the file does not exist", + name, + ) + return path_to_url(path) + + +def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementParts: + if is_url(name): + marker_sep = "; " + else: + marker_sep = ";" + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _strip_extras(path) + url = _get_url_from_path(p, name) + if url is not None: + link = Link(url) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == "file" and re.search(r"\.\./", link.url): + link = Link(path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req_as_string = f"{wheel.name}=={wheel.version}" + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + extras = convert_extras(extras_as_string) + + def with_source(text: str) -> str: + if not line_source: + return text + return f"{text} (from {line_source})" + + def _parse_req_string(req_as_string: str) -> Requirement: + try: + req = get_requirement(req_as_string) + except InvalidRequirement: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif "=" in req_as_string and not any( + op in req_as_string for op in operators + ): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = "" + msg = with_source(f"Invalid requirement: {req_as_string!r}") + if add_msg: + msg += f"\nHint: {add_msg}" + raise InstallationError(msg) + else: + # Deprecate extras after specifiers: "name>=1.0[extras]" + # This currently works by accident because _strip_extras() parses + # any extras in the end of the string and those are saved in + # RequirementParts + for spec in req.specifier: + spec_str = str(spec) + if spec_str.endswith("]"): + msg = f"Extras after version '{spec_str}'." + raise InstallationError(msg) + return req + + if req_as_string is not None: + req: Optional[Requirement] = _parse_req_string(req_as_string) + else: + req = None + + return RequirementParts(req, link, markers, extras) + + +def install_req_from_line( + name: str, + comes_from: Optional[Union[str, InstallRequirement]] = None, + *, + use_pep517: Optional[bool] = None, + isolated: bool = False, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, + constraint: bool = False, + line_source: Optional[str] = None, + user_supplied: bool = False, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, +) -> InstallRequirement: + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + + :param line_source: An optional string describing where the line is from, + for logging purposes in case of an error. + """ + parts = parse_req_from_line(name, line_source) + + return InstallRequirement( + parts.requirement, + comes_from, + link=parts.link, + markers=parts.markers, + use_pep517=use_pep517, + isolated=isolated, + global_options=global_options, + hash_options=hash_options, + config_settings=config_settings, + constraint=constraint, + extras=parts.extras, + user_supplied=user_supplied, + ) + + +def install_req_from_req_string( + req_string: str, + comes_from: Optional[InstallRequirement] = None, + isolated: bool = False, + use_pep517: Optional[bool] = None, + user_supplied: bool = False, +) -> InstallRequirement: + try: + req = get_requirement(req_string) + except InvalidRequirement: + raise InstallationError(f"Invalid requirement: '{req_string}'") + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if ( + req.url + and comes_from + and comes_from.link + and comes_from.link.netloc in domains_not_allowed + ): + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + f"{comes_from.name} depends on {req} " + ) + + return InstallRequirement( + req, + comes_from, + isolated=isolated, + use_pep517=use_pep517, + user_supplied=user_supplied, + ) + + +def install_req_from_parsed_requirement( + parsed_req: ParsedRequirement, + isolated: bool = False, + use_pep517: Optional[bool] = None, + user_supplied: bool = False, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, +) -> InstallRequirement: + if parsed_req.is_editable: + req = install_req_from_editable( + parsed_req.requirement, + comes_from=parsed_req.comes_from, + use_pep517=use_pep517, + constraint=parsed_req.constraint, + isolated=isolated, + user_supplied=user_supplied, + config_settings=config_settings, + ) + + else: + req = install_req_from_line( + parsed_req.requirement, + comes_from=parsed_req.comes_from, + use_pep517=use_pep517, + isolated=isolated, + global_options=( + parsed_req.options.get("global_options", []) + if parsed_req.options + else [] + ), + hash_options=( + parsed_req.options.get("hashes", {}) if parsed_req.options else {} + ), + constraint=parsed_req.constraint, + line_source=parsed_req.line_source, + user_supplied=user_supplied, + config_settings=config_settings, + ) + return req + + +def install_req_from_link_and_ireq( + link: Link, ireq: InstallRequirement +) -> InstallRequirement: + return InstallRequirement( + req=ireq.req, + comes_from=ireq.comes_from, + editable=ireq.editable, + link=link, + markers=ireq.markers, + use_pep517=ireq.use_pep517, + isolated=ireq.isolated, + global_options=ireq.global_options, + hash_options=ireq.hash_options, + config_settings=ireq.config_settings, + user_supplied=ireq.user_supplied, + ) + + +def install_req_drop_extras(ireq: InstallRequirement) -> InstallRequirement: + """ + Creates a new InstallationRequirement using the given template but without + any extras. Sets the original requirement as the new one's parent + (comes_from). + """ + return InstallRequirement( + req=( + _set_requirement_extras(ireq.req, set()) if ireq.req is not None else None + ), + comes_from=ireq, + editable=ireq.editable, + link=ireq.link, + markers=ireq.markers, + use_pep517=ireq.use_pep517, + isolated=ireq.isolated, + global_options=ireq.global_options, + hash_options=ireq.hash_options, + constraint=ireq.constraint, + extras=[], + config_settings=ireq.config_settings, + user_supplied=ireq.user_supplied, + permit_editable_wheels=ireq.permit_editable_wheels, + ) + + +def install_req_extend_extras( + ireq: InstallRequirement, + extras: Collection[str], +) -> InstallRequirement: + """ + Returns a copy of an installation requirement with some additional extras. + Makes a shallow copy of the ireq object. + """ + result = copy.copy(ireq) + result.extras = {*ireq.extras, *extras} + result.req = ( + _set_requirement_extras(ireq.req, result.extras) + if ireq.req is not None + else None + ) + return result diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/req_file.py b/myenv/lib/python3.12/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 0000000..1ef3d5e --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,554 @@ +""" +Requirements file parsing +""" + +import logging +import optparse +import os +import re +import shlex +import urllib.parse +from optparse import Values +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Generator, + Iterable, + List, + Optional, + Tuple, +) + +from pip._internal.cli import cmdoptions +from pip._internal.exceptions import InstallationError, RequirementsFileParseError +from pip._internal.models.search_scope import SearchScope +from pip._internal.network.session import PipSession +from pip._internal.network.utils import raise_for_status +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.urls import get_url_scheme + +if TYPE_CHECKING: + # NoReturn introduced in 3.6.2; imported only for type checking to maintain + # pip compatibility with older patch versions of Python 3.6 + from typing import NoReturn + + from pip._internal.index.package_finder import PackageFinder + +__all__ = ["parse_requirements"] + +ReqFileLines = Iterable[Tuple[int, str]] + +LineParser = Callable[[str], Tuple[str, Values]] + +SCHEME_RE = re.compile(r"^(http|https|file):", re.I) +COMMENT_RE = re.compile(r"(^|\s+)#.*$") + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r"(?P\$\{(?P[A-Z0-9_]+)\})") + +SUPPORTED_OPTIONS: List[Callable[..., optparse.Option]] = [ + cmdoptions.index_url, + cmdoptions.extra_index_url, + cmdoptions.no_index, + cmdoptions.constraints, + cmdoptions.requirements, + cmdoptions.editable, + cmdoptions.find_links, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.prefer_binary, + cmdoptions.require_hashes, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.use_new_feature, +] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ: List[Callable[..., optparse.Option]] = [ + cmdoptions.global_options, + cmdoptions.hash, + cmdoptions.config_settings, +] + +SUPPORTED_OPTIONS_EDITABLE_REQ: List[Callable[..., optparse.Option]] = [ + cmdoptions.config_settings, +] + + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] +SUPPORTED_OPTIONS_EDITABLE_REQ_DEST = [ + str(o().dest) for o in SUPPORTED_OPTIONS_EDITABLE_REQ +] + +logger = logging.getLogger(__name__) + + +class ParsedRequirement: + def __init__( + self, + requirement: str, + is_editable: bool, + comes_from: str, + constraint: bool, + options: Optional[Dict[str, Any]] = None, + line_source: Optional[str] = None, + ) -> None: + self.requirement = requirement + self.is_editable = is_editable + self.comes_from = comes_from + self.options = options + self.constraint = constraint + self.line_source = line_source + + +class ParsedLine: + def __init__( + self, + filename: str, + lineno: int, + args: str, + opts: Values, + constraint: bool, + ) -> None: + self.filename = filename + self.lineno = lineno + self.opts = opts + self.constraint = constraint + + if args: + self.is_requirement = True + self.is_editable = False + self.requirement = args + elif opts.editables: + self.is_requirement = True + self.is_editable = True + # We don't support multiple -e on one line + self.requirement = opts.editables[0] + else: + self.is_requirement = False + + +def parse_requirements( + filename: str, + session: PipSession, + finder: Optional["PackageFinder"] = None, + options: Optional[optparse.Values] = None, + constraint: bool = False, +) -> Generator[ParsedRequirement, None, None]: + """Parse a requirements file and yield ParsedRequirement instances. + + :param filename: Path or url of requirements file. + :param session: PipSession instance. + :param finder: Instance of pip.index.PackageFinder. + :param options: cli options. + :param constraint: If true, parsing a constraint file rather than + requirements file. + """ + line_parser = get_line_parser(finder) + parser = RequirementsFileParser(session, line_parser) + + for parsed_line in parser.parse(filename, constraint): + parsed_req = handle_line( + parsed_line, options=options, finder=finder, session=session + ) + if parsed_req is not None: + yield parsed_req + + +def preprocess(content: str) -> ReqFileLines: + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + """ + lines_enum: ReqFileLines = enumerate(content.splitlines(), start=1) + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def handle_requirement_line( + line: ParsedLine, + options: Optional[optparse.Values] = None, +) -> ParsedRequirement: + # preserve for the nested code path + line_comes_from = "{} {} (line {})".format( + "-c" if line.constraint else "-r", + line.filename, + line.lineno, + ) + + assert line.is_requirement + + # get the options that apply to requirements + if line.is_editable: + supported_dest = SUPPORTED_OPTIONS_EDITABLE_REQ_DEST + else: + supported_dest = SUPPORTED_OPTIONS_REQ_DEST + req_options = {} + for dest in supported_dest: + if dest in line.opts.__dict__ and line.opts.__dict__[dest]: + req_options[dest] = line.opts.__dict__[dest] + + line_source = f"line {line.lineno} of {line.filename}" + return ParsedRequirement( + requirement=line.requirement, + is_editable=line.is_editable, + comes_from=line_comes_from, + constraint=line.constraint, + options=req_options, + line_source=line_source, + ) + + +def handle_option_line( + opts: Values, + filename: str, + lineno: int, + finder: Optional["PackageFinder"] = None, + options: Optional[optparse.Values] = None, + session: Optional[PipSession] = None, +) -> None: + if opts.hashes: + logger.warning( + "%s line %s has --hash but no requirement, and will be ignored.", + filename, + lineno, + ) + + if options: + # percolate options upward + if opts.require_hashes: + options.require_hashes = opts.require_hashes + if opts.features_enabled: + options.features_enabled.extend( + f for f in opts.features_enabled if f not in options.features_enabled + ) + + # set finder options + if finder: + find_links = finder.find_links + index_urls = finder.index_urls + no_index = finder.search_scope.no_index + if opts.no_index is True: + no_index = True + index_urls = [] + if opts.index_url and not no_index: + index_urls = [opts.index_url] + if opts.extra_index_urls and not no_index: + index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + find_links.append(value) + + if session: + # We need to update the auth urls in session + session.update_index_urls(index_urls) + + search_scope = SearchScope( + find_links=find_links, + index_urls=index_urls, + no_index=no_index, + ) + finder.search_scope = search_scope + + if opts.pre: + finder.set_allow_all_prereleases() + + if opts.prefer_binary: + finder.set_prefer_binary() + + if session: + for host in opts.trusted_hosts or []: + source = f"line {lineno} of {filename}" + session.add_trusted_host(host, source=source) + + +def handle_line( + line: ParsedLine, + options: Optional[optparse.Values] = None, + finder: Optional["PackageFinder"] = None, + session: Optional[PipSession] = None, +) -> Optional[ParsedRequirement]: + """Handle a single parsed requirements line; This can result in + creating/yielding requirements, or updating the finder. + + :param line: The parsed line to be processed. + :param options: CLI options. + :param finder: The finder - updated by non-requirement lines. + :param session: The session - updated by non-requirement lines. + + Returns a ParsedRequirement object if the line is a requirement line, + otherwise returns None. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + """ + + if line.is_requirement: + parsed_req = handle_requirement_line(line, options) + return parsed_req + else: + handle_option_line( + line.opts, + line.filename, + line.lineno, + finder, + options, + session, + ) + return None + + +class RequirementsFileParser: + def __init__( + self, + session: PipSession, + line_parser: LineParser, + ) -> None: + self._session = session + self._line_parser = line_parser + + def parse( + self, filename: str, constraint: bool + ) -> Generator[ParsedLine, None, None]: + """Parse a given file, yielding parsed lines.""" + yield from self._parse_and_recurse(filename, constraint) + + def _parse_and_recurse( + self, filename: str, constraint: bool + ) -> Generator[ParsedLine, None, None]: + for line in self._parse_file(filename, constraint): + if not line.is_requirement and ( + line.opts.requirements or line.opts.constraints + ): + # parse a nested requirements file + if line.opts.requirements: + req_path = line.opts.requirements[0] + nested_constraint = False + else: + req_path = line.opts.constraints[0] + nested_constraint = True + + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib.parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join( + os.path.dirname(filename), + req_path, + ) + + yield from self._parse_and_recurse(req_path, nested_constraint) + else: + yield line + + def _parse_file( + self, filename: str, constraint: bool + ) -> Generator[ParsedLine, None, None]: + _, content = get_file_content(filename, self._session) + + lines_enum = preprocess(content) + + for line_number, line in lines_enum: + try: + args_str, opts = self._line_parser(line) + except OptionParsingError as e: + # add offending line + msg = f"Invalid requirement: {line}\n{e.msg}" + raise RequirementsFileParseError(msg) + + yield ParsedLine( + filename, + line_number, + args_str, + opts, + constraint, + ) + + +def get_line_parser(finder: Optional["PackageFinder"]) -> LineParser: + def parse_line(line: str) -> Tuple[str, Values]: + # Build new parser for each line since it accumulates appendable + # options. + parser = build_parser() + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + defaults.format_control = finder.format_control + + args_str, options_str = break_args_options(line) + + try: + options = shlex.split(options_str) + except ValueError as e: + raise OptionParsingError(f"Could not split options: {options_str}") from e + + opts, _ = parser.parse_args(options, defaults) + + return args_str, opts + + return parse_line + + +def break_args_options(line: str) -> Tuple[str, str]: + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(" ") + args = [] + options = tokens[:] + for token in tokens: + if token.startswith("-") or token.startswith("--"): + break + else: + args.append(token) + options.pop(0) + return " ".join(args), " ".join(options) + + +class OptionParsingError(Exception): + def __init__(self, msg: str) -> None: + self.msg = msg + + +def build_parser() -> optparse.OptionParser: + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self: Any, msg: str) -> "NoReturn": + raise OptionParsingError(msg) + + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum: ReqFileLines) -> ReqFileLines: + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line: List[str] = [] + for line_number, line in lines_enum: + if not line.endswith("\\") or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = " " + line + if new_line: + new_line.append(line) + assert primary_line_number is not None + yield primary_line_number, "".join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip("\\")) + + # last line contains \ + if new_line: + assert primary_line_number is not None + yield primary_line_number, "".join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum: ReqFileLines) -> ReqFileLines: + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub("", line) + line = line.strip() + if line: + yield line_number, line + + +def expand_env_variables(lines_enum: ReqFileLines) -> ReqFileLines: + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discussion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line + + +def get_file_content(url: str, session: PipSession) -> Tuple[str, str]: + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + Respects # -*- coding: declarations on the retrieved files. + + :param url: File path or url. + :param session: PipSession instance. + """ + scheme = get_url_scheme(url) + + # Pip has special support for file:// URLs (LocalFSAdapter). + if scheme in ["http", "https", "file"]: + resp = session.get(url) + raise_for_status(resp) + return resp.url, resp.text + + # Assume this is a bare path. + try: + with open(url, "rb") as f: + content = auto_decode(f.read()) + except OSError as exc: + raise InstallationError(f"Could not open requirements file: {exc}") + return url, content diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/req_install.py b/myenv/lib/python3.12/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..a65611c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,923 @@ +import functools +import logging +import os +import shutil +import sys +import uuid +import zipfile +from optparse import Values +from pathlib import Path +from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.pyproject_hooks import BuildBackendHookCaller + +from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError, PreviousBuildDirError +from pip._internal.locations import get_scheme +from pip._internal.metadata import ( + BaseDistribution, + get_default_environment, + get_directory_distribution, + get_wheel_distribution, +) +from pip._internal.metadata.base import FilesystemWheel +from pip._internal.models.direct_url import DirectUrl +from pip._internal.models.link import Link +from pip._internal.operations.build.metadata import generate_metadata +from pip._internal.operations.build.metadata_editable import generate_editable_metadata +from pip._internal.operations.build.metadata_legacy import ( + generate_metadata as generate_metadata_legacy, +) +from pip._internal.operations.install.editable_legacy import ( + install_editable as install_editable_legacy, +) +from pip._internal.operations.install.wheel import install_wheel +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.misc import ( + ConfiguredBuildBackendHookCaller, + ask_path_exists, + backup_dir, + display_path, + hide_url, + is_installable_dir, + redact_auth_from_requirement, + redact_auth_from_url, +) +from pip._internal.utils.packaging import safe_extra +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.unpacking import unpack_file +from pip._internal.utils.virtualenv import running_under_virtualenv +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + + +class InstallRequirement: + """ + Represents something that may be installed later on, may have information + about where to fetch the relevant requirement and also contains logic for + installing the said requirement. + """ + + def __init__( + self, + req: Optional[Requirement], + comes_from: Optional[Union[str, "InstallRequirement"]], + editable: bool = False, + link: Optional[Link] = None, + markers: Optional[Marker] = None, + use_pep517: Optional[bool] = None, + isolated: bool = False, + *, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + constraint: bool = False, + extras: Collection[str] = (), + user_supplied: bool = False, + permit_editable_wheels: bool = False, + ) -> None: + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + self.editable = editable + self.permit_editable_wheels = permit_editable_wheels + + # source_dir is the local directory where the linked requirement is + # located, or unpacked. In case unpacking is needed, creating and + # populating source_dir is done by the RequirementPreparer. Note this + # is not necessarily the directory where pyproject.toml or setup.py is + # located - that one is obtained via unpacked_source_directory. + self.source_dir: Optional[str] = None + if self.editable: + assert link + if link.is_file: + self.source_dir = os.path.normpath(os.path.abspath(link.file_path)) + + # original_link is the direct URL that was provided by the user for the + # requirement, either directly or via a constraints file. + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + + # When this InstallRequirement is a wheel obtained from the cache of locally + # built wheels, this is the source link corresponding to the cache entry, which + # was used to download and build the cached wheel. + self.cached_wheel_source_link: Optional[Link] = None + + # Information about the location of the artifact that was downloaded . This + # property is guaranteed to be set in resolver results. + self.download_info: Optional[DirectUrl] = None + + # Path to any downloaded or already-existing package. + self.local_file_path: Optional[str] = None + if self.link and self.link.is_file: + self.local_file_path = self.link.file_path + + if extras: + self.extras = extras + elif req: + self.extras = req.extras + else: + self.extras = set() + if markers is None and req: + markers = req.marker + self.markers = markers + + # This holds the Distribution object if this requirement is already installed. + self.satisfied_by: Optional[BaseDistribution] = None + # Whether the installation process should try to uninstall an existing + # distribution before installing this requirement. + self.should_reinstall = False + # Temporary build location + self._temp_build_dir: Optional[TempDirectory] = None + # Set to True after successful installation + self.install_succeeded: Optional[bool] = None + # Supplied options + self.global_options = global_options if global_options else [] + self.hash_options = hash_options if hash_options else {} + self.config_settings = config_settings + # Set to True after successful preparation of this requirement + self.prepared = False + # User supplied requirement are explicitly requested for installation + # by the user via CLI arguments or requirements files, as opposed to, + # e.g. dependencies, extras or constraints. + self.user_supplied = user_supplied + + self.isolated = isolated + self.build_env: BuildEnvironment = NoOpBuildEnvironment() + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory: Optional[str] = None + + # The static build requirements (from pyproject.toml) + self.pyproject_requires: Optional[List[str]] = None + + # Build requirements that we will check are available + self.requirements_to_check: List[str] = [] + + # The PEP 517 backend we should use to build the project + self.pep517_backend: Optional[BuildBackendHookCaller] = None + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = use_pep517 + + # If config settings are provided, enforce PEP 517. + if self.config_settings: + if self.use_pep517 is False: + logger.warning( + "--no-use-pep517 ignored for %s " + "because --config-settings are specified.", + self, + ) + self.use_pep517 = True + + # This requirement needs more preparation before it can be built + self.needs_more_preparation = False + + # This requirement needs to be unpacked before it can be installed. + self._archive_source: Optional[Path] = None + + def __str__(self) -> str: + if self.req: + s = redact_auth_from_requirement(self.req) + if self.link: + s += f" from {redact_auth_from_url(self.link.url)}" + elif self.link: + s = redact_auth_from_url(self.link.url) + else: + s = "" + if self.satisfied_by is not None: + if self.satisfied_by.location is not None: + location = display_path(self.satisfied_by.location) + else: + location = "" + s += f" in {location}" + if self.comes_from: + if isinstance(self.comes_from, str): + comes_from: Optional[str] = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += f" (from {comes_from})" + return s + + def __repr__(self) -> str: + return "<{} object: {} editable={!r}>".format( + self.__class__.__name__, str(self), self.editable + ) + + def format_debug(self) -> str: + """An un-tested helper for getting state, for debugging.""" + attributes = vars(self) + names = sorted(attributes) + + state = (f"{attr}={attributes[attr]!r}" for attr in sorted(names)) + return "<{name} object: {{{state}}}>".format( + name=self.__class__.__name__, + state=", ".join(state), + ) + + # Things that are valid for all kinds of requirements? + @property + def name(self) -> Optional[str]: + if self.req is None: + return None + return self.req.name + + @functools.lru_cache() # use cached_property in python 3.8+ + def supports_pyproject_editable(self) -> bool: + if not self.use_pep517: + return False + assert self.pep517_backend + with self.build_env: + runner = runner_with_spinner_message( + "Checking if build backend supports build_editable" + ) + with self.pep517_backend.subprocess_runner(runner): + return "build_editable" in self.pep517_backend._supported_features() + + @property + def specifier(self) -> SpecifierSet: + assert self.req is not None + return self.req.specifier + + @property + def is_direct(self) -> bool: + """Whether this requirement was specified as a direct URL.""" + return self.original_link is not None + + @property + def is_pinned(self) -> bool: + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + assert self.req is not None + specifiers = self.req.specifier + return len(specifiers) == 1 and next(iter(specifiers)).operator in {"==", "==="} + + def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> bool: + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ("",) + if self.markers is not None: + return any( + self.markers.evaluate({"extra": extra}) + # TODO: Remove these two variants when packaging is upgraded to + # support the marker comparison logic specified in PEP 685. + or self.markers.evaluate({"extra": safe_extra(extra)}) + or self.markers.evaluate({"extra": canonicalize_name(extra)}) + for extra in extras_requested + ) + else: + return True + + @property + def has_hash_options(self) -> bool: + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.hash_options) + + def hashes(self, trust_internet: bool = True) -> Hashes: + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.hash_options.copy() + if trust_internet: + link = self.link + elif self.is_direct and self.user_supplied: + link = self.original_link + else: + link = None + if link and link.hash: + assert link.hash_name is not None + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + def from_path(self) -> Optional[str]: + """Format a nice indicator to show where this "comes from" """ + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + comes_from: Optional[str] + if isinstance(self.comes_from, str): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += "->" + comes_from + return s + + def ensure_build_location( + self, build_dir: str, autodelete: bool, parallel_builds: bool + ) -> str: + assert build_dir is not None + if self._temp_build_dir is not None: + assert self._temp_build_dir.path + return self._temp_build_dir.path + if self.req is None: + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir = TempDirectory( + kind=tempdir_kinds.REQ_BUILD, globally_managed=True + ) + + return self._temp_build_dir.path + + # This is the only remaining place where we manually determine the path + # for the temporary directory. It is only needed for editables where + # it is the value of the --src option. + + # When parallel builds are enabled, add a UUID to the build directory + # name so multiple builds do not interfere with each other. + dir_name: str = canonicalize_name(self.req.name) + if parallel_builds: + dir_name = f"{dir_name}_{uuid.uuid4().hex}" + + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug("Creating directory %s", build_dir) + os.makedirs(build_dir) + actual_build_dir = os.path.join(build_dir, dir_name) + # `None` indicates that we respect the globally-configured deletion + # settings, which is what we actually want when auto-deleting. + delete_arg = None if autodelete else False + return TempDirectory( + path=actual_build_dir, + delete=delete_arg, + kind=tempdir_kinds.REQ_BUILD, + globally_managed=True, + ).path + + def _set_requirement(self) -> None: + """Set requirement after generating metadata.""" + assert self.req is None + assert self.metadata is not None + assert self.source_dir is not None + + # Construct a Requirement object from the generated metadata + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + + self.req = Requirement( + "".join( + [ + self.metadata["Name"], + op, + self.metadata["Version"], + ] + ) + ) + + def warn_on_mismatching_name(self) -> None: + assert self.req is not None + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) == metadata_name: + # Everything is fine. + return + + # If we're here, there's a mismatch. Log a warning about it. + logger.warning( + "Generating metadata for package %s " + "produced metadata for project name %s. Fix your " + "#egg=%s fragments.", + self.name, + metadata_name, + self.name, + ) + self.req = Requirement(metadata_name) + + def check_if_exists(self, use_user_site: bool) -> None: + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.should_reinstall appropriately. + """ + if self.req is None: + return + existing_dist = get_default_environment().get_distribution(self.req.name) + if not existing_dist: + return + + version_compatible = self.req.specifier.contains( + existing_dist.version, + prereleases=True, + ) + if not version_compatible: + self.satisfied_by = None + if use_user_site: + if existing_dist.in_usersite: + self.should_reinstall = True + elif running_under_virtualenv() and existing_dist.in_site_packages: + raise InstallationError( + f"Will not install to the user site because it will " + f"lack sys.path precedence to {existing_dist.raw_name} " + f"in {existing_dist.location}" + ) + else: + self.should_reinstall = True + else: + if self.editable: + self.should_reinstall = True + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + else: + self.satisfied_by = existing_dist + + # Things valid for wheels + @property + def is_wheel(self) -> bool: + if not self.link: + return False + return self.link.is_wheel + + @property + def is_wheel_from_cache(self) -> bool: + # When True, it means that this InstallRequirement is a local wheel file in the + # cache of locally built wheels. + return self.cached_wheel_source_link is not None + + # Things valid for sdists + @property + def unpacked_source_directory(self) -> str: + assert self.source_dir, f"No source dir for {self}" + return os.path.join( + self.source_dir, self.link and self.link.subdirectory_fragment or "" + ) + + @property + def setup_py_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + setup_py = os.path.join(self.unpacked_source_directory, "setup.py") + + return setup_py + + @property + def setup_cfg_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + setup_cfg = os.path.join(self.unpacked_source_directory, "setup.cfg") + + return setup_cfg + + @property + def pyproject_toml_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + return make_pyproject_path(self.unpacked_source_directory) + + def load_pyproject_toml(self) -> None: + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pyproject_toml_data = load_pyproject_toml( + self.use_pep517, self.pyproject_toml_path, self.setup_py_path, str(self) + ) + + if pyproject_toml_data is None: + assert not self.config_settings + self.use_pep517 = False + return + + self.use_pep517 = True + requires, backend, check, backend_path = pyproject_toml_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = ConfiguredBuildBackendHookCaller( + self, + self.unpacked_source_directory, + backend, + backend_path=backend_path, + ) + + def isolated_editable_sanity_check(self) -> None: + """Check that an editable requirement if valid for use with PEP 517/518. + + This verifies that an editable that has a pyproject.toml either supports PEP 660 + or as a setup.py or a setup.cfg + """ + if ( + self.editable + and self.use_pep517 + and not self.supports_pyproject_editable() + and not os.path.isfile(self.setup_py_path) + and not os.path.isfile(self.setup_cfg_path) + ): + raise InstallationError( + f"Project {self} has a 'pyproject.toml' and its build " + f"backend is missing the 'build_editable' hook. Since it does not " + f"have a 'setup.py' nor a 'setup.cfg', " + f"it cannot be installed in editable mode. " + f"Consider using a build backend that supports PEP 660." + ) + + def prepare_metadata(self) -> None: + """Ensure that project metadata is available. + + Under PEP 517 and PEP 660, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ + assert self.source_dir, f"No source dir for {self}" + details = self.name or f"from {self.link}" + + if self.use_pep517: + assert self.pep517_backend is not None + if ( + self.editable + and self.permit_editable_wheels + and self.supports_pyproject_editable() + ): + self.metadata_directory = generate_editable_metadata( + build_env=self.build_env, + backend=self.pep517_backend, + details=details, + ) + else: + self.metadata_directory = generate_metadata( + build_env=self.build_env, + backend=self.pep517_backend, + details=details, + ) + else: + self.metadata_directory = generate_metadata_legacy( + build_env=self.build_env, + setup_py_path=self.setup_py_path, + source_dir=self.unpacked_source_directory, + isolated=self.isolated, + details=details, + ) + + # Act on the newly generated metadata, based on the name and version. + if not self.name: + self._set_requirement() + else: + self.warn_on_mismatching_name() + + self.assert_source_matches_version() + + @property + def metadata(self) -> Any: + if not hasattr(self, "_metadata"): + self._metadata = self.get_dist().metadata + + return self._metadata + + def get_dist(self) -> BaseDistribution: + if self.metadata_directory: + return get_directory_distribution(self.metadata_directory) + elif self.local_file_path and self.is_wheel: + assert self.req is not None + return get_wheel_distribution( + FilesystemWheel(self.local_file_path), + canonicalize_name(self.req.name), + ) + raise AssertionError( + f"InstallRequirement {self} has no metadata directory and no wheel: " + f"can't make a distribution." + ) + + def assert_source_matches_version(self) -> None: + assert self.source_dir, f"No source dir for {self}" + version = self.metadata["version"] + if self.req and self.req.specifier and version not in self.req.specifier: + logger.warning( + "Requested %s, but installing version %s", + self, + version, + ) + else: + logger.debug( + "Source in %s has version %s, which satisfies requirement %s", + display_path(self.source_dir), + version, + self, + ) + + # For both source distributions and editables + def ensure_has_source_dir( + self, + parent_dir: str, + autodelete: bool = False, + parallel_builds: bool = False, + ) -> None: + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.ensure_build_location( + parent_dir, + autodelete=autodelete, + parallel_builds=parallel_builds, + ) + + def needs_unpacked_archive(self, archive_source: Path) -> None: + assert self._archive_source is None + self._archive_source = archive_source + + def ensure_pristine_source_checkout(self) -> None: + """Ensure the source directory has not yet been built in.""" + assert self.source_dir is not None + if self._archive_source is not None: + unpack_file(str(self._archive_source), self.source_dir) + elif is_installable_dir(self.source_dir): + # If a checkout exists, it's unwise to keep going. + # version inconsistencies are logged later, but do not fail + # the installation. + raise PreviousBuildDirError( + f"pip can't proceed with requirements '{self}' due to a " + f"pre-existing build directory ({self.source_dir}). This is likely " + "due to a previous installation that failed . pip is " + "being responsible and not assuming it can delete this. " + "Please delete it and try again." + ) + + # For editable installations + def update_editable(self) -> None: + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == "file": + # Static paths don't get updated + return + vcs_backend = vcs.get_backend_for_scheme(self.link.scheme) + # Editable requirements are validated in Requirement constructors. + # So here, if it's neither a path nor a valid VCS URL, it's a bug. + assert vcs_backend, f"Unsupported VCS URL {self.link.url}" + hidden_url = hide_url(self.link.url) + vcs_backend.obtain(self.source_dir, url=hidden_url, verbosity=0) + + # Top-level Actions + def uninstall( + self, auto_confirm: bool = False, verbose: bool = False + ) -> Optional[UninstallPathSet]: + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + assert self.req + dist = get_default_environment().get_distribution(self.req.name) + if not dist: + logger.warning("Skipping %s as it is not installed.", self.name) + return None + logger.info("Found existing installation: %s", dist) + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _get_archive_name(self, path: str, parentdir: str, rootdir: str) -> str: + def _clean_zip_name(name: str, prefix: str) -> str: + assert name.startswith( + prefix + os.path.sep + ), f"name {name!r} doesn't start with prefix {prefix!r}" + name = name[len(prefix) + 1 :] + name = name.replace(os.path.sep, "/") + return name + + assert self.req is not None + path = os.path.join(parentdir, path) + name = _clean_zip_name(path, rootdir) + return self.req.name + "/" + name + + def archive(self, build_dir: Optional[str]) -> None: + """Saves archive to provided build_dir. + + Used for saving downloaded VCS requirements as part of `pip download`. + """ + assert self.source_dir + if build_dir is None: + return + + create_archive = True + archive_name = "{}-{}.zip".format(self.name, self.metadata["version"]) + archive_path = os.path.join(build_dir, archive_name) + + if os.path.exists(archive_path): + response = ask_path_exists( + f"The file {display_path(archive_path)} exists. (i)gnore, (w)ipe, " + "(b)ackup, (a)bort ", + ("i", "w", "b", "a"), + ) + if response == "i": + create_archive = False + elif response == "w": + logger.warning("Deleting %s", display_path(archive_path)) + os.remove(archive_path) + elif response == "b": + dest_file = backup_dir(archive_path) + logger.warning( + "Backing up %s to %s", + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == "a": + sys.exit(-1) + + if not create_archive: + return + + zip_output = zipfile.ZipFile( + archive_path, + "w", + zipfile.ZIP_DEFLATED, + allowZip64=True, + ) + with zip_output: + dir = os.path.normcase(os.path.abspath(self.unpacked_source_directory)) + for dirpath, dirnames, filenames in os.walk(dir): + for dirname in dirnames: + dir_arcname = self._get_archive_name( + dirname, + parentdir=dirpath, + rootdir=dir, + ) + zipdir = zipfile.ZipInfo(dir_arcname + "/") + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip_output.writestr(zipdir, "") + for filename in filenames: + file_arcname = self._get_archive_name( + filename, + parentdir=dirpath, + rootdir=dir, + ) + filename = os.path.join(dirpath, filename) + zip_output.write(filename, file_arcname) + + logger.info("Saved %s", display_path(archive_path)) + + def install( + self, + global_options: Optional[Sequence[str]] = None, + root: Optional[str] = None, + home: Optional[str] = None, + prefix: Optional[str] = None, + warn_script_location: bool = True, + use_user_site: bool = False, + pycompile: bool = True, + ) -> None: + assert self.req is not None + scheme = get_scheme( + self.req.name, + user=use_user_site, + home=home, + root=root, + isolated=self.isolated, + prefix=prefix, + ) + + if self.editable and not self.is_wheel: + if self.config_settings: + logger.warning( + "--config-settings ignored for legacy editable install of %s. " + "Consider upgrading to a version of setuptools " + "that supports PEP 660 (>= 64).", + self, + ) + install_editable_legacy( + global_options=global_options if global_options is not None else [], + prefix=prefix, + home=home, + use_user_site=use_user_site, + name=self.req.name, + setup_py_path=self.setup_py_path, + isolated=self.isolated, + build_env=self.build_env, + unpacked_source_directory=self.unpacked_source_directory, + ) + self.install_succeeded = True + return + + assert self.is_wheel + assert self.local_file_path + + install_wheel( + self.req.name, + self.local_file_path, + scheme=scheme, + req_description=str(self.req), + pycompile=pycompile, + warn_script_location=warn_script_location, + direct_url=self.download_info if self.is_direct else None, + requested=self.user_supplied, + ) + self.install_succeeded = True + + +def check_invalid_constraint_type(req: InstallRequirement) -> str: + # Check for unsupported forms + problem = "" + if not req.name: + problem = "Unnamed requirements are not allowed as constraints" + elif req.editable: + problem = "Editable requirements are not allowed as constraints" + elif req.extras: + problem = "Constraints cannot have extras" + + if problem: + deprecated( + reason=( + "Constraints are only allowed to take the form of a package " + "name and a version specifier. Other forms were originally " + "permitted as an accident of the implementation, but were " + "undocumented. The new implementation of the resolver no " + "longer supports these forms." + ), + replacement="replacing the constraint with a requirement", + # No plan yet for when the new resolver becomes default + gone_in=None, + issue=8210, + ) + + return problem + + +def _has_option(options: Values, reqs: List[InstallRequirement], option: str) -> bool: + if getattr(options, option, None): + return True + for req in reqs: + if getattr(req, option, None): + return True + return False + + +def check_legacy_setup_py_options( + options: Values, + reqs: List[InstallRequirement], +) -> None: + has_build_options = _has_option(options, reqs, "build_options") + has_global_options = _has_option(options, reqs, "global_options") + if has_build_options or has_global_options: + deprecated( + reason="--build-option and --global-option are deprecated.", + issue=11859, + replacement="to use --config-settings", + gone_in="24.2", + ) + logger.warning( + "Implying --no-binary=:all: due to the presence of " + "--build-option / --global-option. " + ) + options.format_control.disallow_binaries() diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/req_set.py b/myenv/lib/python3.12/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..bf36114 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,119 @@ +import logging +from collections import OrderedDict +from typing import Dict, List + +from pip._vendor.packaging.specifiers import LegacySpecifier +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import LegacyVersion + +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.deprecation import deprecated + +logger = logging.getLogger(__name__) + + +class RequirementSet: + def __init__(self, check_supported_wheels: bool = True) -> None: + """Create a RequirementSet.""" + + self.requirements: Dict[str, InstallRequirement] = OrderedDict() + self.check_supported_wheels = check_supported_wheels + + self.unnamed_requirements: List[InstallRequirement] = [] + + def __str__(self) -> str: + requirements = sorted( + (req for req in self.requirements.values() if not req.comes_from), + key=lambda req: canonicalize_name(req.name or ""), + ) + return " ".join(str(req.req) for req in requirements) + + def __repr__(self) -> str: + requirements = sorted( + self.requirements.values(), + key=lambda req: canonicalize_name(req.name or ""), + ) + + format_string = "<{classname} object; {count} requirement(s): {reqs}>" + return format_string.format( + classname=self.__class__.__name__, + count=len(requirements), + reqs=", ".join(str(req.req) for req in requirements), + ) + + def add_unnamed_requirement(self, install_req: InstallRequirement) -> None: + assert not install_req.name + self.unnamed_requirements.append(install_req) + + def add_named_requirement(self, install_req: InstallRequirement) -> None: + assert install_req.name + + project_name = canonicalize_name(install_req.name) + self.requirements[project_name] = install_req + + def has_requirement(self, name: str) -> bool: + project_name = canonicalize_name(name) + + return ( + project_name in self.requirements + and not self.requirements[project_name].constraint + ) + + def get_requirement(self, name: str) -> InstallRequirement: + project_name = canonicalize_name(name) + + if project_name in self.requirements: + return self.requirements[project_name] + + raise KeyError(f"No project with the name {name!r}") + + @property + def all_requirements(self) -> List[InstallRequirement]: + return self.unnamed_requirements + list(self.requirements.values()) + + @property + def requirements_to_install(self) -> List[InstallRequirement]: + """Return the list of requirements that need to be installed. + + TODO remove this property together with the legacy resolver, since the new + resolver only returns requirements that need to be installed. + """ + return [ + install_req + for install_req in self.all_requirements + if not install_req.constraint and not install_req.satisfied_by + ] + + def warn_legacy_versions_and_specifiers(self) -> None: + for req in self.requirements_to_install: + version = req.get_dist().version + if isinstance(version, LegacyVersion): + deprecated( + reason=( + f"pip has selected the non standard version {version} " + f"of {req}. In the future this version will be " + f"ignored as it isn't standard compliant." + ), + replacement=( + "set or update constraints to select another version " + "or contact the package author to fix the version number" + ), + issue=12063, + gone_in="24.1", + ) + for dep in req.get_dist().iter_dependencies(): + if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier): + deprecated( + reason=( + f"pip has selected {req} {version} which has non " + f"standard dependency specifier {dep}. " + f"In the future this version of {req} will be " + f"ignored as it isn't standard compliant." + ), + replacement=( + "set or update constraints to select another version " + "or contact the package author to fix the version number" + ), + issue=12063, + gone_in="24.1", + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py b/myenv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..707fde1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,649 @@ +import functools +import os +import sys +import sysconfig +from importlib.util import cache_from_source +from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import get_bin_prefix, get_bin_user +from pip._internal.metadata import BaseDistribution +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.egg_link import egg_link_path_from_location +from pip._internal.utils.logging import getLogger, indent_log +from pip._internal.utils.misc import ask, normalize_path, renames, rmtree +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory +from pip._internal.utils.virtualenv import running_under_virtualenv + +logger = getLogger(__name__) + + +def _script_names( + bin_dir: str, script_name: str, is_gui: bool +) -> Generator[str, None, None]: + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + exe_name = os.path.join(bin_dir, script_name) + yield exe_name + if not WINDOWS: + return + yield f"{exe_name}.exe" + yield f"{exe_name}.exe.manifest" + if is_gui: + yield f"{exe_name}-script.pyw" + else: + yield f"{exe_name}-script.py" + + +def _unique( + fn: Callable[..., Generator[Any, None, None]] +) -> Callable[..., Generator[Any, None, None]]: + @functools.wraps(fn) + def unique(*args: Any, **kw: Any) -> Generator[Any, None, None]: + seen: Set[Any] = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + + return unique + + +@_unique +def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]: + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + + If RECORD is not found, raises UninstallationError, + with possible information from the INSTALLER file. + + https://packaging.python.org/specifications/recording-installed-packages/ + """ + location = dist.location + assert location is not None, "not installed" + + entries = dist.iter_declared_entries() + if entries is None: + msg = f"Cannot uninstall {dist}, RECORD file not found." + installer = dist.installer + if not installer or installer == "pip": + dep = f"{dist.raw_name}=={dist.version}" + msg += ( + " You might be able to recover from this via: " + f"'pip install --force-reinstall --no-deps {dep}'." + ) + else: + msg += f" Hint: The package was installed by {installer}." + raise UninstallationError(msg) + + for entry in entries: + path = os.path.join(location, entry) + yield path + if path.endswith(".py"): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + ".pyc") + yield path + path = os.path.join(dn, base + ".pyo") + yield path + + +def compact(paths: Iterable[str]) -> Set[str]: + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths: Set[str] = set() + for path in sorted(paths, key=len): + should_skip = any( + path.startswith(shortpath.rstrip("*")) + and path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths: Iterable[str]) -> Set[str]: + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = {os.path.normcase(p): p for p in paths} + remaining = set(case_map) + unchecked = sorted({os.path.split(p)[0] for p in case_map.values()}, key=len) + wildcards: Set[str] = set() + + def norm_join(*a: str) -> str: + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) for w in wildcards): + # This directory has already been handled. + continue + + all_files: Set[str] = set() + all_subdirs: Set[str] = set() + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) for d in subdirs) + all_files.update(norm_join(root, dirname, f) for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +def compress_for_output_listing(paths: Iterable[str]) -> Tuple[Set[str], Set[str]]: + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = set(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + _normcased_files = set(map(os.path.normcase, files)) + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if ( + os.path.isfile(file_) + and os.path.normcase(file_) not in _normcased_files + ): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | {os.path.join(folder, "*") for folder in folders} + + return will_remove, will_skip + + +class StashedUninstallPathSet: + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + + def __init__(self) -> None: + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs: Dict[str, TempDirectory] = {} + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves: List[Tuple[str, str]] = [] + + def _get_directory_stash(self, path: str) -> str: + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir: TempDirectory = AdjacentTempDirectory(path) + except OSError: + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path: str) -> str: + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path: str) -> str: + """Stashes the directory or file and returns its new location. + Handle symlinks as files to avoid modifying the symlink targets. + """ + path_is_dir = os.path.isdir(path) and not os.path.islink(path) + if path_is_dir: + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if path_is_dir and os.path.isdir(new_path): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self) -> None: + """Commits the uninstall by removing stashed files.""" + for save_dir in self._save_dirs.values(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self) -> None: + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logger.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug("Replacing %s from %s", new_path, path) + if os.path.isfile(new_path) or os.path.islink(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self) -> bool: + return bool(self._moves) + + +class UninstallPathSet: + """A set of file paths to be removed in the uninstallation of a + requirement.""" + + def __init__(self, dist: BaseDistribution) -> None: + self._paths: Set[str] = set() + self._refuse: Set[str] = set() + self._pth: Dict[str, UninstallPthEntries] = {} + self._dist = dist + self._moved_paths = StashedUninstallPathSet() + # Create local cache of normalize_path results. Creating an UninstallPathSet + # can result in hundreds/thousands of redundant calls to normalize_path with + # the same args, which hurts performance. + self._normalize_path_cached = functools.lru_cache()(normalize_path) + + def _permitted(self, path: str) -> bool: + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + # aka is_local, but caching normalized sys.prefix + if not running_under_virtualenv(): + return True + return path.startswith(self._normalize_path_cached(sys.prefix)) + + def add(self, path: str) -> None: + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(self._normalize_path_cached(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self._paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == ".py": + self.add(cache_from_source(path)) + + def add_pth(self, pth_file: str, entry: str) -> None: + pth_file = self._normalize_path_cached(pth_file) + if self._permitted(pth_file): + if pth_file not in self._pth: + self._pth[pth_file] = UninstallPthEntries(pth_file) + self._pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def remove(self, auto_confirm: bool = False, verbose: bool = False) -> None: + """Remove paths in ``self._paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self._paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self._dist.raw_name, + ) + return + + dist_name_version = f"{self._dist.raw_name}-{self._dist.version}" + logger.info("Uninstalling %s:", dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + moved = self._moved_paths + + for_rename = compress_for_rename(self._paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.verbose("Removing file or directory %s", path) + + for pth in self._pth.values(): + pth.remove() + + logger.info("Successfully uninstalled %s", dist_name_version) + + def _allowed_to_proceed(self, verbose: bool) -> bool: + """Display which files would be deleted and prompt for confirmation""" + + def _display(msg: str, paths: Iterable[str]) -> None: + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self._paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = set(self._paths) + will_skip = set() + + _display("Would remove:", will_remove) + _display("Would not remove (might be manually added):", will_skip) + _display("Would not remove (outside of prefix):", self._refuse) + if verbose: + _display("Will actually move:", compress_for_rename(self._paths)) + + return ask("Proceed (Y/n)? ", ("y", "n", "")) != "n" + + def rollback(self) -> None: + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + logger.error( + "Can't roll back %s; was not uninstalled", + self._dist.raw_name, + ) + return + logger.info("Rolling back uninstall of %s", self._dist.raw_name) + self._moved_paths.rollback() + for pth in self._pth.values(): + pth.rollback() + + def commit(self) -> None: + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist: BaseDistribution) -> "UninstallPathSet": + dist_location = dist.location + info_location = dist.info_location + if dist_location is None: + logger.info( + "Not uninstalling %s since it is not installed", + dist.canonical_name, + ) + return cls(dist) + + normalized_dist_location = normalize_path(dist_location) + if not dist.local: + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.canonical_name, + normalized_dist_location, + sys.prefix, + ) + return cls(dist) + + if normalized_dist_location in { + p + for p in {sysconfig.get_path("stdlib"), sysconfig.get_path("platstdlib")} + if p + }: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.canonical_name, + normalized_dist_location, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path_from_location(dist.raw_name) + + # Distribution is installed with metadata in a "flat" .egg-info + # directory. This means it is not a modern .dist-info installation, an + # egg, or legacy editable. + setuptools_flat_installation = ( + dist.installed_with_setuptools_egg_info + and info_location is not None + and os.path.exists(info_location) + # If dist is editable and the location points to a ``.egg-info``, + # we are in fact in the legacy editable case. + and not info_location.endswith(f"{dist.setuptools_filename}.egg-info") + ) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if setuptools_flat_installation: + if info_location is not None: + paths_to_remove.add(info_location) + installed_files = dist.iter_declared_entries() + if installed_files is not None: + for installed_file in installed_files: + paths_to_remove.add(os.path.join(dist_location, installed_file)) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.is_file("top_level.txt"): + try: + namespace_packages = dist.read_text("namespace_packages.txt") + except FileNotFoundError: + namespaces = [] + else: + namespaces = namespace_packages.splitlines(keepends=False) + for top_level_pkg in [ + p + for p in dist.read_text("top_level.txt").splitlines() + if p and p not in namespaces + ]: + path = os.path.join(dist_location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(f"{path}.py") + paths_to_remove.add(f"{path}.pyc") + paths_to_remove.add(f"{path}.pyo") + + elif dist.installed_by_distutils: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.raw_name, + ) + ) + + elif dist.installed_as_egg: + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist_location) + easy_install_egg = os.path.split(dist_location)[1] + easy_install_pth = os.path.join( + os.path.dirname(dist_location), + "easy-install.pth", + ) + paths_to_remove.add_pth(easy_install_pth, "./" + easy_install_egg) + + elif dist.installed_with_dist_info: + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # PEP 660 modern editable is handled in the ``.dist-info`` case + # above, so this only covers the setuptools-style editable. + with open(develop_egg_link) as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + normalized_link_pointer = paths_to_remove._normalize_path_cached( + link_pointer + ) + assert os.path.samefile( + normalized_link_pointer, normalized_dist_location + ), ( + f"Egg-link {develop_egg_link} (to {link_pointer}) does not match " + f"installed location of {dist.raw_name} (at {dist_location})" + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join( + os.path.dirname(develop_egg_link), "easy-install.pth" + ) + paths_to_remove.add_pth(easy_install_pth, dist_location) + + else: + logger.debug( + "Not sure how to uninstall: %s - Check: %s", + dist, + dist_location, + ) + + if dist.in_usersite: + bin_dir = get_bin_user() + else: + bin_dir = get_bin_prefix() + + # find distutils scripts= scripts + try: + for script in dist.iter_distutils_script_names(): + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, f"{script}.bat")) + except (FileNotFoundError, NotADirectoryError): + pass + + # find console_scripts and gui_scripts + def iter_scripts_to_remove( + dist: BaseDistribution, + bin_dir: str, + ) -> Generator[str, None, None]: + for entry_point in dist.iter_entry_points(): + if entry_point.group == "console_scripts": + yield from _script_names(bin_dir, entry_point.name, False) + elif entry_point.group == "gui_scripts": + yield from _script_names(bin_dir, entry_point.name, True) + + for s in iter_scripts_to_remove(dist, bin_dir): + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries: + def __init__(self, pth_file: str) -> None: + self.file = pth_file + self.entries: Set[str] = set() + self._saved_lines: Optional[List[bytes]] = None + + def add(self, entry: str) -> None: + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + # os.path.splitdrive is used instead of os.path.isabs because isabs + # treats non-absolute paths with drive letter markings like c:foo\bar + # as absolute paths. It also does not recognize UNC paths if they don't + # have more than "\\sever\share". Valid examples: "\\server\share\" or + # "\\server\share\folder". + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace("\\", "/") + self.entries.add(entry) + + def remove(self) -> None: + logger.verbose("Removing pth entries from %s:", self.file) + + # If the file doesn't exist, log a warning and return + if not os.path.isfile(self.file): + logger.warning("Cannot remove entries from nonexistent file %s", self.file) + return + with open(self.file, "rb") as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b"\r\n" in line for line in lines): + endline = "\r\n" + else: + endline = "\n" + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.verbose("Removing entry: %s", entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, "wb") as fh: + fh.writelines(lines) + + def rollback(self) -> bool: + if self._saved_lines is None: + logger.error("Cannot roll back changes to %s, none were made", self.file) + return False + logger.debug("Rolling %s back to previous state", self.file) + with open(self.file, "wb") as fh: + fh.writelines(self._saved_lines) + return True diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f6932f107b8fae2714f73f1a78ff5a3d8c97f0d GIT binary patch literal 215 zcmZ9GJqiLb5QR7XfC%2f)?oAa+(Jtqih(@7z;0rd?OoxldZ7`zVY8f0vV crCiwX9j#kabqY6b7~c@lKEb;$gmC>xKkd9bmH+?% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64b574fdb25da171a57a0adea2ac5ed8b26ff357 GIT binary patch literal 1203 zcma)5OKTKC5bmDW&aO#B6B8puR%6sf%oz2gL41oSQ4~E4!Z6vXY{txMyL%(+NyLNy zAip8_Q@m{OA`PM-9=t_Y5Ik8myAeeXHcWNZ*F7~~eO2>%bhO5BEv!9k-7pyYNWsps zhED$xIvXrv5l>jkeV!V=k($2A2{RHawSBwv&BRG7euXpO;DQPEG``s~z+N%P^Q#8C z!6NGgi|kkUHCleH>oh8#$!(b0y%Hu#xSW8tZpTt-_fDbWJPVTs*L!bfQsMDEXm?@( zDP#)KvERb`pqi9uXE{TszlhET1LpIH`9{Q%nni>nq!yXrtT;%@@+*-I4#vaN6)SQO zb-R^@t4A(}67GS_lXVcfD)L+f0@_kfHdmp!7RXLf?Tj>wwk4jbI5 zW{UfhXf~MQxRvYGaDUD>`O+rW<4d`^nHEV|B}CVR$OXz{Nk~=%bxiC+BPmzCUjHGy zG*e#Fdmuqb?>Z>R>Q_Y^#okqrYbr0iLgbG@UCLyP;(BQpvUM+sm%XB^R`cx4{K9EZ z#tKdrVRJ2Pf%J;F@Par~AW(fzP~jbFg}014%okl-*&lCsq6VlQrbvIPoRmva&l z-5?hch^MoEaQyeBGUEiL-G^qWQPpk`WMK+Hpld;p=20gheM9`4Vt!= z^E?q1ipR<9N3%IdR+1A{Ldlf9yNJ#Uwr!a9k+;(`y@RK=rWdwNif-L0_Yc*nzK!vA zjlik7AvoF_t8Y~geWRn2X_<1Vu}eFuTf|vQ&{Pa~+34vRY~}o~R$_zN^z5iK;6DBD zJJ_VMAZn{V+54)^=YW?~TuG)sFV8W4*@to^}3 RequirementSet: + raise NotImplementedError() + + def get_installation_order( + self, req_set: RequirementSet + ) -> List[InstallRequirement]: + raise NotImplementedError() diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c35d7665fb6005ea1885f378f0d5b55186439ce9 GIT binary patch literal 222 zcmZ8bI|{-;5Y74l5xj$~g&Cr)2tu&5(>BCph+{Up%kD(j!gF{A&*CvWfuyr?)B0fM zy*KlU_nOV7Q9x3ks-EBd`bRekmq+BIg*ZGTI|#1pGv7NjilKm`L+fCVjB1`*DhX0_ zHERRL>MQb2IXX*(#-qA{q%#=L7p>NDvI0kpOOqFMUZDd+1~O8NR^<{bIxSl!tw3Ux i7ap?kB+jzf`0r%X=(3f#wd2r6gmJz2422MO7}O8S$UZ>; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99ef8252d59e0603ac6ddbbde67a74bd29cc1578 GIT binary patch literal 22457 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 None: + """ + Check whether the given Python version is compatible with a distribution's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + + :raises UnsupportedPythonVersion: When the given Python version isn't + compatible. + """ + # This idiosyncratically converts the SpecifierSet to str and let + # check_requires_python then parse it again into SpecifierSet. But this + # is the legacy resolver so I'm just not going to bother refactoring. + try: + requires_python = str(dist.requires_python) + except FileNotFoundError as e: + raise NoneMetadataError(dist, str(e)) + try: + is_compatible = check_requires_python( + requires_python, + version_info=version_info, + ) + except specifiers.InvalidSpecifier as exc: + logger.warning( + "Package %r has an invalid Requires-Python: %s", dist.raw_name, exc + ) + return + + if is_compatible: + return + + version = ".".join(map(str, version_info)) + if ignore_requires_python: + logger.debug( + "Ignoring failed Requires-Python check for package %r: %s not in %r", + dist.raw_name, + version, + requires_python, + ) + return + + raise UnsupportedPythonVersion( + "Package {!r} requires a different Python: {} not in {!r}".format( + dist.raw_name, version, requires_python + ) + ) + + +class Resolver(BaseResolver): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer: RequirementPreparer, + finder: PackageFinder, + wheel_cache: Optional[WheelCache], + make_install_req: InstallRequirementProvider, + use_user_site: bool, + ignore_dependencies: bool, + ignore_installed: bool, + ignore_requires_python: bool, + force_reinstall: bool, + upgrade_strategy: str, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> None: + super().__init__() + assert upgrade_strategy in self._allowed_strategies + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + self._py_version_info = py_version_info + + self.preparer = preparer + self.finder = finder + self.wheel_cache = wheel_cache + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + self._make_install_req = make_install_req + + self._discovered_dependencies: DiscoveredDependencies = defaultdict(list) + + def resolve( + self, root_reqs: List[InstallRequirement], check_supported_wheels: bool + ) -> RequirementSet: + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + requirement_set = RequirementSet(check_supported_wheels=check_supported_wheels) + for req in root_reqs: + if req.constraint: + check_invalid_constraint_type(req) + self._add_requirement_to_set(requirement_set, req) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # _populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs: List[InstallRequirement] = [] + hash_errors = HashErrors() + for req in chain(requirement_set.all_requirements, discovered_reqs): + try: + discovered_reqs.extend(self._resolve_one(requirement_set, req)) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + return requirement_set + + def _add_requirement_to_set( + self, + requirement_set: RequirementSet, + install_req: InstallRequirement, + parent_req_name: Optional[str] = None, + extras_requested: Optional[Iterable[str]] = None, + ) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]]: + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + install_req.name, + install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + tags = compatibility_tags.get_supported() + if requirement_set.check_supported_wheels and not wheel.supported(tags): + raise InstallationError( + f"{wheel.filename} is not a supported wheel on this platform." + ) + + # This next bit is really a sanity check. + assert ( + not install_req.user_supplied or parent_req_name is None + ), "a user supplied req shouldn't have a parent" + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not install_req.name: + requirement_set.add_unnamed_requirement(install_req) + return [install_req], None + + try: + existing_req: Optional[ + InstallRequirement + ] = requirement_set.get_requirement(install_req.name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None + and existing_req + and not existing_req.constraint + and existing_req.extras == install_req.extras + and existing_req.req + and install_req.req + and existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: {} (already in {}, name={!r})".format( + install_req, existing_req, install_req.name + ) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + requirement_set.add_named_requirement(install_req) + # We'd want to rescan this requirement later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = install_req.link and not ( + existing_req.link and install_req.link.path == existing_req.link.path + ) + if does_not_satisfy_constraint: + raise InstallationError( + f"Could not satisfy constraints for '{install_req.name}': " + "installation from path or url cannot be " + "constrained to a version" + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + # If we're now installing a user supplied requirement, + # mark the existing object as such. + if install_req.user_supplied: + existing_req.user_supplied = True + existing_req.extras = tuple( + sorted(set(existing_req.extras) | set(install_req.extras)) + ) + logger.debug( + "Setting %s extras to: %s", + existing_req, + existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def _is_upgrade_allowed(self, req: InstallRequirement) -> bool: + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.user_supplied or req.constraint + + def _set_req_to_reinstall(self, req: InstallRequirement) -> None: + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or req.satisfied_by.in_usersite: + req.should_reinstall = True + req.satisfied_by = None + + def _check_skip_installed( + self, req_to_install: InstallRequirement + ) -> Optional[str]: + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return "already satisfied, skipping upgrade" + return "already satisfied" + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return "already up-to-date" + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _find_requirement_link(self, req: InstallRequirement) -> Optional[Link]: + upgrade = self._is_upgrade_allowed(req) + best_candidate = self.finder.find_requirement(req, upgrade) + if not best_candidate: + return None + + # Log a warning per PEP 592 if necessary before returning. + link = best_candidate.link + if link.is_yanked: + reason = link.yanked_reason or "" + msg = ( + # Mark this as a unicode string to prevent + # "UnicodeEncodeError: 'ascii' codec can't encode character" + # in Python 2 when the reason contains non-ascii characters. + "The candidate selected for download or install is a " + f"yanked version: {best_candidate}\n" + f"Reason for being yanked: {reason}" + ) + logger.warning(msg) + + return link + + def _populate_link(self, req: InstallRequirement) -> None: + """Ensure that if a link can be found for this, that it is found. + + Note that req.link may still be None - if the requirement is already + installed and not needed to be upgraded based on the return value of + _is_upgrade_allowed(). + + If preparer.require_hashes is True, don't use the wheel cache, because + cached wheels, always built locally, have different hashes than the + files downloaded from the index server and thus throw false hash + mismatches. Furthermore, cached wheels at present have undeterministic + contents due to file modification times. + """ + if req.link is None: + req.link = self._find_requirement_link(req) + + if self.wheel_cache is None or self.preparer.require_hashes: + return + cache_entry = self.wheel_cache.get_cache_entry( + link=req.link, + package_name=req.name, + supported_tags=get_supported(), + ) + if cache_entry is not None: + logger.debug("Using cached wheel link: %s", cache_entry.link) + if req.link is req.original_link and cache_entry.persistent: + req.cached_wheel_source_link = req.link + if cache_entry.origin is not None: + req.download_info = cache_entry.origin + else: + # Legacy cache entry that does not have origin.json. + # download_info may miss the archive_info.hashes field. + req.download_info = direct_url_from_link( + req.link, link_is_in_wheel_cache=cache_entry.persistent + ) + req.link = cache_entry.link + + def _get_dist_for(self, req: InstallRequirement) -> BaseDistribution: + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + if req.editable: + return self.preparer.prepare_editable_requirement(req) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement(req, skip_reason) + + # We eagerly populate the link, since that's our "legacy" behavior. + self._populate_link(req) + dist = self.preparer.prepare_linked_requirement(req) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" + or self.force_reinstall + or self.ignore_installed + or req.link.scheme == "file" + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + "Requirement already satisfied (use --upgrade to upgrade): %s", + req, + ) + return dist + + def _resolve_one( + self, + requirement_set: RequirementSet, + req_to_install: InstallRequirement, + ) -> List[InstallRequirement]: + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # Parse and return dependencies + dist = self._get_dist_for(req_to_install) + # This will raise UnsupportedPythonVersion if the given Python + # version isn't compatible with the distribution's Requires-Python. + _check_dist_requires_python( + dist, + version_info=self._py_version_info, + ignore_requires_python=self.ignore_requires_python, + ) + + more_reqs: List[InstallRequirement] = [] + + def add_req(subreq: Requirement, extras_requested: Iterable[str]) -> None: + # This idiosyncratically converts the Requirement to str and let + # make_install_req then parse it again into Requirement. But this is + # the legacy resolver so I'm just not going to bother refactoring. + sub_install_req = self._make_install_req(str(subreq), req_to_install) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = self._add_requirement_to_set( + requirement_set, + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append(add_to_parent) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + # 'unnamed' requirements can only come from being directly + # provided by the user. + assert req_to_install.user_supplied + self._add_requirement_to_set( + requirement_set, req_to_install, parent_req_name=None + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ",".join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.iter_provided_extras()) + ) + for missing in missing_requested: + logger.warning( + "%s %s does not provide the extra '%s'", + dist.raw_name, + dist.version, + missing, + ) + + available_requested = sorted( + set(dist.iter_provided_extras()) & set(req_to_install.extras) + ) + for subreq in dist.iter_dependencies(available_requested): + add_req(subreq, extras_requested=available_requested) + + return more_reqs + + def get_installation_order( + self, req_set: RequirementSet + ) -> List[InstallRequirement]: + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs: Set[InstallRequirement] = set() + + def schedule(req: InstallRequirement) -> None: + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96d20ef0ee22f843ee08695db232a83086cbc004 GIT binary patch literal 226 zcmZ9GO$x$5425U>0TH}|TNfItTM>lf(w%NgwV}pNXNH+n=+aYo2G8O#Jb}1#EZ2x-q!saGgF_GK5aGfx{W9D;(S~DDB=h1oCAfq0qjtYVl zeZ|Itb>@t`)}9Uup>9!MK+yqg%O|53vt$mQ7^gNrR(XjYELq4%Gdi6saOjO{n2i46 j1>oK1v+ZZFtWD7jwG)@hCtC literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07e63a8d8192f008febb1f936bb1c856d851d411 GIT binary patch literal 8355 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 Q-#%*IA;fPGNVx6)8|+zON&o-= literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa24c22bd14fb6f78a769d525e7ddff00fc1e9af GIT binary patch literal 30416 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b3aa98efae582bcf6be70d9e58557043bbf66d3 GIT binary patch literal 6226 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 Ql+d@ldB;BqT=|;+0|vo!X8-^I literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54cb39482839ef243496fc4105ef8d766a455507 GIT binary patch literal 10396 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..564ac2c584f9aa6e1c796e74771f93bc83be045f GIT binary patch literal 12369 zcma)CYiu0Xb-uIj_k+89zeaqBT!~AXq$ulUS&FEaMbok*+wsQsYPB;Ym)w_UW<^on zO=(xCmxf$XbsW)Y8{24tD3F0VXn;6Hff{N5wE?)I++B}lgh3q?`BSVd26o*1=s9<0 zc2_i2bg+BpKF>Y(-gEEy&bjk%PN$8)Gcxz|^h3jh{3j-~$D&5=-C+p1K{&!OaS~GA zOo*XrT}VgY`j8&py0{@>3>g!qkSSpfnG=?fC1DL&6Sj~oVGr3EY^#qu63&p5#tm^- z!X0uaJRuKF8zJot)zP>q?o0SXei}E&>k|#31{$}-8xu{TCK|WKn-eXe78b(rEzC`TcRt}mFNz2)3htzljsfg(zrXmJ<%8HOZ12OY1$JH zBzA;$K-|mK#djtKLIa6lC`i-3_+VlvG{g|zD7auu{`fiMpn_==o z!#cw2W@oest-krOTQH~igm&x5al+MKAzTCBbxW`2dbvifiEHMq{3uf5T6hz0QR4i= zQ##C>GI6a}452+-8*k%B`3@zQYyW0VXl>&k2ClSr9nfy?0u$)`J$5%4Fw4$!&z?RS zK62vdky9rpkIRPfSX7b?6ERVeEl;GSSSlHb%lfmtBpc6V(s5okL?fc~Q%3eiBgs@U z7LCMXm-%oqlHdb6+3~H2$e-cUDM8`|*?)!?Q}GNEIhjbOL@{30>qu; zF@cXtJa=4(q-P+*_RI{=$B#s!Gg#GmIuf0WO!LQLNsiX{o#9{1K$8TYluiqLIwH{Q z=2%jcBJp@w;9m^$mn1&P;Y)~!K&0-ZQdrXza$Pk^7+;lp;2C(6TfW)qw2-yb#3i*XT&m+du7K@0P- zNK{G*3lKHIq-Ek#6c27fzm;~Y@S&O11#A~aOs8uDa{;apc>`*LpH#k(mL547;| z9uUVm5Gya|<2{g8OQ#H+A9CyRRCTPex-wW{pNq^E@l z$A?9bEQz09klpEpFbInXA`Xm9r3Rx8bxrVPhd&OOuFspy4I*JKeU=mm_#kC9gx$*g5&by+5B$m+AktTk)STC(={m|Iq*G)ux28d(#hpbxbK z=!Z>OiX)J!P+R~poD5in?NBWAV$hF49|i#of*9C-P*n#Z_X%@^Zigds!8$>=nrF2YLpdC{dXz#R5wRg%4 zlAwIZ)^Io)kBDM8EIJ{Rt$7x|et9U7l!l^1Pk~T~L&tbH8Q5_l#>Ixld2vokrH9f& zYL=G{C+X=llvv=C7l-1p3qy(!j1CTu452Uu)5=LC4y9x1As8^6aBwyb!5GvtPKjRR zu`$gB!5B<02qVDMWiM=Bdaev=lZ7J_IS9U5BpYqS>RK`vEKPSTEhTs7JG+YA`wQ@M z?_ag-Uv=;Qtg)lyYcAEdm)e7+rtVTpU#V>;#=G}IWW#4`vgHj|9pwhn^Kjm9$HJD_ zhw$BA3Iy|p*B$quA0k_YREnNJqTB!*C^{F01*C^H7p5CaluZIJWrSo@)koNjAX1=W z><59l0fIA2v+oaPYg?#ASw_=#IlWXB#4X!r^|KY>tWt))G&EApL=KRrO%G70-F#{( zYz?*NoPpCxcnHyF)}zI$?~6pROFk{FZOxo9X_M-|nJYDFd9WFcw{%J>XM#glpEGAo zvv^8wdVojm(5@-Tn%^^M?JqGo3vA5_pAv3I`eb$QnJV*XmvE0L`IcGSDx02J+%KCR zZA6^;3VF|>^*BzJb=N^VVnvq7e zlG$BatooLAYjJICV+0OE`|MsVzxv*~7p+~+1+Dg1Yilv-5iOQ=NfoMFk3*w1dr)gr zeQWcj)uCt+kgb-_kgGp_z}`4qrJ}{M4vkLEopmo-IBV7!-lml%|K$Oc#jn$}|9;DCen6IyBYEj+z-{_JG6 zjusORJ)rJstw!}NbV+Bl)a+AQtor8cS?5+#TV1(j=IWnsnnfMty}mUMIZxIjd^_uz zeY)C*7852o$LzCOs`>^>Tko4K)+7t`XG7JtTI>=d>Okt8@40TNNCz3Myb z)ufE>sV#O#)>*Bwth;J5;NE+oNK-7G=d~Ku_iVHp*J9baYCqY!aq>Kzzd0Ao zxhsqcl0L8pT;a-TakUP4IZL{U)S=brA;O-V^#Pnzc8^w@5UE>>a{!jK_1;?7Xr(zD zKr!npVBhAf-?h#&^W>8LSu)RblVKt<^RNQX!U@F?kdHqqB?0$jz$oD1CflPaFgAn; z-~+J+>$oT=MS#hRVC=|sr%#>^pE-K=iHWC=o(Yd1{nk^*V~3o20zluEh+GN_sZ5d+ zFAq@Eu*rh@PK}K)z*cOB=L3v@>l;O@LVHjtp+dWd%sohT!*r_3OKXO2JQ&WBpE8qR zp%~D$1uk;%a#scGs4!^oKs*J8qIeJ@N}V*c z5RtJ(^8WBIcK>Ym2T%U<3%`7!FnVf{2zW-rMCj-Eg=6O~zuYUbF_DeL1wO(puoc+O z&c~z~R+`~i5tw6D6wXFOng^_+sm8Gs*9@|N|JY!V0{UPD(6dsCrCDqwsSySHv(vGQeDYwx zAfR%P%_=R~fOHVhVdcOsMLwIOsW@^E5~e^w%@`GhCTK07-mA*3@F-H$r9{~bus9~9 zl0q|9Knx?>&P-?vEt}PqmK~}Qh4#59jA3O2<#GeszUutYDGu|3kP-wmTLc7GvPnd* z0VkUik#rh{E1NDx;;>!h#+s(J<})3xa1`6xVAn}t?*sIfEr@A>9Z|NN;unt6URtqI zeT3tv=yLZ_K`E3?inBnj$G$l5euSk|IFqaxe&S3j6UTOHj$#m<#HRL`80NW{6anXk zY^lWTVk(2yBV7bD)R~H5IYg*X$)($FWapKP9w z2*A&@>`~nu)rCWZD6^`qOgjVvtacs339y1I)-)KrXm^V=H>@v9M*`x6 z%bqiu*`>0IOD66Hw7W>kCQ{#gW8(Tm(Z8?Y-}k}ZHUH7P^{%g@C!weedoo*n@X__pbHs zUpnzwW7iwG{E52?(Phi=OQT&-T^P zr^|ZMJ9dxgdR=9rbGq`!md}0fxs3+m+qSxA@=o0odGm&iw6G;d-L=W3$)aOh!Le=4 z(On3f+R*D-Z1>1v#`;kHBn;2rUi9rM_;#)NcIU@SZeKoI^0nPKc>Ulz&lY?47kc;K z_U-?yxx3grP-q@_@7rt5yFVwU`j%2hZ?R*n&@uLYthjrkuzO;y?HwC>LvzcQMj!%H;%zQlNJrP(&%O0r zvHj6P`=cLP*V-S;PnO*6tM1f5X2e(PzfG|i8H?Dnk~ z-gf=KRkrBr$C)op#MgX%d#SnW?T)uPN^QNxwqT(xSZZ!BwRRR;gN4@M?bb)%?*M?Mzt)XDKBoWmm=WWT z7$?nEApJN{2pMQ=heK<<+;wkp^NbU{NojexuI=sJXTB>RY2Gd9}RRIxSXxOMWe$)xW3H zdgS!rEPw+HpPV6U7$?_^*Gy6UG|cw%Fvriqoac-=Q`U4{chzbjQGL#oGoFP~Mvc#t zfH4w+YR7pAU<)|3DafeR&Io|uh^^=tfHv%zY8w3IgEpIX-Xc0u+(v+R;&4#2sEz>w z18S?K0x$-28xLSB1+Yy3gav3v@y&{CDp{cylLpyyGl2PK_;^}m`J|YERyw0W)9^@KW#sdYSo61Bhk>fl@^6g|rnQ7zOn!@i-9h z6{bLEb ztTvYQ2pkMxB#6RUS|7Z$2~oCAWs-1dl8OUph3g?H1{YXofX7U16viuODp^msl5vU0FVyi z@n6d>WmnyOtCsQA!1x-3?!I+*L($!R+ugnHtIwZY_xNu(t~-jJu7am4Z@gO-HB>)?q;%>fGEge9!vRQ>x=9`5(TVC8~g3WhiYhZLme!bTWu$AXU_ z`05IgTTZMR8p~~D_rA}YJB)+tb-iUHyg@N~JIZE^Sx7_2%50%NP_|;yMq0n-~*<|i#3<$8=Ykk*cJBgUFYOV>NSH}yBq-n6_s zRA?Ug1NL4%#3UJGBY=a|j)w}(!(}~9o_a!wtXmuJ88N4PUf*sUDK++%@x5+!uDaNQ zb=#LlNKw0(j+093<+l5-PQRnw)_w=(_W9>!PtEZirkmsdOw4@>8J7kX$-RGq$$XW( z%DifM)%vOpuBmWx>7yyC*DNvenvG+mib9tvY8EX*PRHq|40)2bl6$0zDqkWRHO_b$ZVz(CtPbeHjRC64CFUX{Fjp;E^{9Gu{AF^}4h1rv?!;&?vYg_>i5g$s05 z6H=8MyI=h!BA{w!BFSmc+MrrN@lbuD>7A(zTo!?115XURTJoTfy9-vp(ODsKjKDfrUV(e48Utt!?O0#_MP z_)F0dCi(gJ0zfNpOSu@IIwFeclz&c0@(7<_) z^T}!Ov!NFXl9Z=-3giL0PDjuIm!e`pg=|VlC0KMU4Y2e|U0X`5h;BJxT1AGiTq2aJ zSc5i}=0RfE{@5TtsG^&|rZtgfz%4pG18rfz(o9elDn25Bl&gix{A-X%gHCfG@5l^5 zqUfCF+|$^{Q6dNGOdZ(*SpkFr#|5k4AvFOKq3kT`n*#t7!)s!6I3idBZ)b|~qPXs0 zpCFp>P9W0xmteP^-@rZyq$`S_5s9bUghTIH^t5`)N489R{S1C}h)9OC2~d zqNV^&%vttU6a#}HC@E(yXG#_yw&68PjY0J9L| z$_5mB;X18PMV6vo5y2SX+eLg7RP{s1xx5`g>=xj=>d~h(zJj{q0t868&L92Q;a%>1eWI*~)H?V%>`V6L z@jI60b-R1Dv9Dn711HydSKuc*-`#nWd;joS*X~tI=iR2()wa=}pZ&o956`YOJ(@Q! z8(woN;HV8)fX`T7hL-|7{}N;0$KXv2et^LZ3|@giwsEm35O*-M(DI-r0G$|1s~Bl#12@3Dul z-G7}~9540nSUg@fxQ&OH@16LYv)3Ol6O6yZeM#S+)37{1?C!f>{~PsrQ_0u#1+iFJ z@cOvx@-LMRWN$ zI-!=sdu?KAV#WWFqXQSOv%C{n{CpQN+VVYDPHk97UH$SiH=eux+#4^fd3%c9p@Mg4 z^`S#+-ouNJee7;tHT16RTQl_L53bwm7ANWAf#Vl!Gdh#^p;W|~didYNFOO=mX%_Yx zVoz;1Cqqq>BV#y5SOlr6wWX>%cV}hbjwgJUF4~H-oh<3h^7B5cMF$ z4;v|d!jrU15rrHJhqQVqCcmy~cNkA|B2wrq8=q-zg3jl(xoD6?~Wf;JRuSDDi5s+v< zakQ_TduQ8Q&#c*dL9p$0a0)!K(z9ysST%Ie6%OnZp24P9Adt;?{{bpWcpOtEX#o|q zfc*%#;)*$lnm|C)fEtVRvPf=)@2>{oqq`)Rg3qhyM_JHv5H3mMqJUdaZm6vRQ-R-I z!Of6>UkB0KD8-0+0_%2cU3Uvye(JD2A;d%zSu8>HNR*{M_m8*UKRUSTFBhytobx&3}xSP9)5 zsyI^{T5jID4!A&++qQ4efLWsV%!6nt2n{$@)LIT^g zTXllo#0jqiI0PBy6XN}Zcs?Pn zPl)w5`Z6L z=3dsX*7vP?`U str: + if not extras: + return project + extras_expr = ",".join(sorted(extras)) + return f"{project}[{extras_expr}]" + + +class Constraint: + def __init__( + self, specifier: SpecifierSet, hashes: Hashes, links: FrozenSet[Link] + ) -> None: + self.specifier = specifier + self.hashes = hashes + self.links = links + + @classmethod + def empty(cls) -> "Constraint": + return Constraint(SpecifierSet(), Hashes(), frozenset()) + + @classmethod + def from_ireq(cls, ireq: InstallRequirement) -> "Constraint": + links = frozenset([ireq.link]) if ireq.link else frozenset() + return Constraint(ireq.specifier, ireq.hashes(trust_internet=False), links) + + def __bool__(self) -> bool: + return bool(self.specifier) or bool(self.hashes) or bool(self.links) + + def __and__(self, other: InstallRequirement) -> "Constraint": + if not isinstance(other, InstallRequirement): + return NotImplemented + specifier = self.specifier & other.specifier + hashes = self.hashes & other.hashes(trust_internet=False) + links = self.links + if other.link: + links = links.union([other.link]) + return Constraint(specifier, hashes, links) + + def is_satisfied_by(self, candidate: "Candidate") -> bool: + # Reject if there are any mismatched URL constraints on this package. + if self.links and not all(_match_link(link, candidate) for link in self.links): + return False + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + return self.specifier.contains(candidate.version, prereleases=True) + + +class Requirement: + @property + def project_name(self) -> NormalizedName: + """The "project name" of a requirement. + + This is different from ``name`` if this requirement contains extras, + in which case ``name`` would contain the ``[...]`` part, while this + refers to the name of the project. + """ + raise NotImplementedError("Subclass should override") + + @property + def name(self) -> str: + """The name identifying this requirement in the resolver. + + This is different from ``project_name`` if this requirement contains + extras, where ``project_name`` would not contain the ``[...]`` part. + """ + raise NotImplementedError("Subclass should override") + + def is_satisfied_by(self, candidate: "Candidate") -> bool: + return False + + def get_candidate_lookup(self) -> CandidateLookup: + raise NotImplementedError("Subclass should override") + + def format_for_error(self) -> str: + raise NotImplementedError("Subclass should override") + + +def _match_link(link: Link, candidate: "Candidate") -> bool: + if candidate.source_link: + return links_equivalent(link, candidate.source_link) + return False + + +class Candidate: + @property + def project_name(self) -> NormalizedName: + """The "project name" of the candidate. + + This is different from ``name`` if this candidate contains extras, + in which case ``name`` would contain the ``[...]`` part, while this + refers to the name of the project. + """ + raise NotImplementedError("Override in subclass") + + @property + def name(self) -> str: + """The name identifying this candidate in the resolver. + + This is different from ``project_name`` if this candidate contains + extras, where ``project_name`` would not contain the ``[...]`` part. + """ + raise NotImplementedError("Override in subclass") + + @property + def version(self) -> CandidateVersion: + raise NotImplementedError("Override in subclass") + + @property + def is_installed(self) -> bool: + raise NotImplementedError("Override in subclass") + + @property + def is_editable(self) -> bool: + raise NotImplementedError("Override in subclass") + + @property + def source_link(self) -> Optional[Link]: + raise NotImplementedError("Override in subclass") + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + raise NotImplementedError("Override in subclass") + + def get_install_requirement(self) -> Optional[InstallRequirement]: + raise NotImplementedError("Override in subclass") + + def format_for_error(self) -> str: + raise NotImplementedError("Subclass should override") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py new file mode 100644 index 0000000..4125cda --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py @@ -0,0 +1,597 @@ +import logging +import sys +from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast + +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import Version + +from pip._internal.exceptions import ( + HashError, + InstallationSubprocessError, + MetadataInconsistent, +) +from pip._internal.metadata import BaseDistribution +from pip._internal.models.link import Link, links_equivalent +from pip._internal.models.wheel import Wheel +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.direct_url_helpers import direct_url_from_link +from pip._internal.utils.misc import normalize_version_info + +from .base import Candidate, CandidateVersion, Requirement, format_name + +if TYPE_CHECKING: + from .factory import Factory + +logger = logging.getLogger(__name__) + +BaseCandidate = Union[ + "AlreadyInstalledCandidate", + "EditableCandidate", + "LinkCandidate", +] + +# Avoid conflicting with the PyPI package "Python". +REQUIRES_PYTHON_IDENTIFIER = cast(NormalizedName, "") + + +def as_base_candidate(candidate: Candidate) -> Optional[BaseCandidate]: + """The runtime version of BaseCandidate.""" + base_candidate_classes = ( + AlreadyInstalledCandidate, + EditableCandidate, + LinkCandidate, + ) + if isinstance(candidate, base_candidate_classes): + return candidate + return None + + +def make_install_req_from_link( + link: Link, template: InstallRequirement +) -> InstallRequirement: + assert not template.editable, "template is editable" + if template.req: + line = str(template.req) + else: + line = link.url + ireq = install_req_from_line( + line, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + global_options=template.global_options, + hash_options=template.hash_options, + config_settings=template.config_settings, + ) + ireq.original_link = template.original_link + ireq.link = link + ireq.extras = template.extras + return ireq + + +def make_install_req_from_editable( + link: Link, template: InstallRequirement +) -> InstallRequirement: + assert template.editable, "template not editable" + ireq = install_req_from_editable( + link.url, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + permit_editable_wheels=template.permit_editable_wheels, + global_options=template.global_options, + hash_options=template.hash_options, + config_settings=template.config_settings, + ) + ireq.extras = template.extras + return ireq + + +def _make_install_req_from_dist( + dist: BaseDistribution, template: InstallRequirement +) -> InstallRequirement: + if template.req: + line = str(template.req) + elif template.link: + line = f"{dist.canonical_name} @ {template.link.url}" + else: + line = f"{dist.canonical_name}=={dist.version}" + ireq = install_req_from_line( + line, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + global_options=template.global_options, + hash_options=template.hash_options, + config_settings=template.config_settings, + ) + ireq.satisfied_by = dist + return ireq + + +class _InstallRequirementBackedCandidate(Candidate): + """A candidate backed by an ``InstallRequirement``. + + This represents a package request with the target not being already + in the environment, and needs to be fetched and installed. The backing + ``InstallRequirement`` is responsible for most of the leg work; this + class exposes appropriate information to the resolver. + + :param link: The link passed to the ``InstallRequirement``. The backing + ``InstallRequirement`` will use this link to fetch the distribution. + :param source_link: The link this candidate "originates" from. This is + different from ``link`` when the link is found in the wheel cache. + ``link`` would point to the wheel cache, while this points to the + found remote link (e.g. from pypi.org). + """ + + dist: BaseDistribution + is_installed = False + + def __init__( + self, + link: Link, + source_link: Link, + ireq: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[CandidateVersion] = None, + ) -> None: + self._link = link + self._source_link = source_link + self._factory = factory + self._ireq = ireq + self._name = name + self._version = version + self.dist = self._prepare() + + def __str__(self) -> str: + return f"{self.name} {self.version}" + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({str(self._link)!r})" + + def __hash__(self) -> int: + return hash((self.__class__, self._link)) + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return links_equivalent(self._link, other._link) + return False + + @property + def source_link(self) -> Optional[Link]: + return self._source_link + + @property + def project_name(self) -> NormalizedName: + """The normalised name of the project the candidate refers to""" + if self._name is None: + self._name = self.dist.canonical_name + return self._name + + @property + def name(self) -> str: + return self.project_name + + @property + def version(self) -> CandidateVersion: + if self._version is None: + self._version = self.dist.version + return self._version + + def format_for_error(self) -> str: + return "{} {} (from {})".format( + self.name, + self.version, + self._link.file_path if self._link.is_file else self._link, + ) + + def _prepare_distribution(self) -> BaseDistribution: + raise NotImplementedError("Override in subclass") + + def _check_metadata_consistency(self, dist: BaseDistribution) -> None: + """Check for consistency of project name and version of dist.""" + if self._name is not None and self._name != dist.canonical_name: + raise MetadataInconsistent( + self._ireq, + "name", + self._name, + dist.canonical_name, + ) + if self._version is not None and self._version != dist.version: + raise MetadataInconsistent( + self._ireq, + "version", + str(self._version), + str(dist.version), + ) + + def _prepare(self) -> BaseDistribution: + try: + dist = self._prepare_distribution() + except HashError as e: + # Provide HashError the underlying ireq that caused it. This + # provides context for the resulting error message to show the + # offending line to the user. + e.req = self._ireq + raise + except InstallationSubprocessError as exc: + # The output has been presented already, so don't duplicate it. + exc.context = "See above for output." + raise + + self._check_metadata_consistency(dist) + return dist + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + requires = self.dist.iter_dependencies() if with_requires else () + for r in requires: + yield from self._factory.make_requirements_from_spec(str(r), self._ireq) + yield self._factory.make_requires_python_requirement(self.dist.requires_python) + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return self._ireq + + +class LinkCandidate(_InstallRequirementBackedCandidate): + is_editable = False + + def __init__( + self, + link: Link, + template: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[CandidateVersion] = None, + ) -> None: + source_link = link + cache_entry = factory.get_wheel_cache_entry(source_link, name) + if cache_entry is not None: + logger.debug("Using cached wheel link: %s", cache_entry.link) + link = cache_entry.link + ireq = make_install_req_from_link(link, template) + assert ireq.link == link + if ireq.link.is_wheel and not ireq.link.is_file: + wheel = Wheel(ireq.link.filename) + wheel_name = canonicalize_name(wheel.name) + assert name == wheel_name, f"{name!r} != {wheel_name!r} for wheel" + # Version may not be present for PEP 508 direct URLs + if version is not None: + wheel_version = Version(wheel.version) + assert version == wheel_version, "{!r} != {!r} for wheel {}".format( + version, wheel_version, name + ) + + if cache_entry is not None: + assert ireq.link.is_wheel + assert ireq.link.is_file + if cache_entry.persistent and template.link is template.original_link: + ireq.cached_wheel_source_link = source_link + if cache_entry.origin is not None: + ireq.download_info = cache_entry.origin + else: + # Legacy cache entry that does not have origin.json. + # download_info may miss the archive_info.hashes field. + ireq.download_info = direct_url_from_link( + source_link, link_is_in_wheel_cache=cache_entry.persistent + ) + + super().__init__( + link=link, + source_link=source_link, + ireq=ireq, + factory=factory, + name=name, + version=version, + ) + + def _prepare_distribution(self) -> BaseDistribution: + preparer = self._factory.preparer + return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True) + + +class EditableCandidate(_InstallRequirementBackedCandidate): + is_editable = True + + def __init__( + self, + link: Link, + template: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[CandidateVersion] = None, + ) -> None: + super().__init__( + link=link, + source_link=link, + ireq=make_install_req_from_editable(link, template), + factory=factory, + name=name, + version=version, + ) + + def _prepare_distribution(self) -> BaseDistribution: + return self._factory.preparer.prepare_editable_requirement(self._ireq) + + +class AlreadyInstalledCandidate(Candidate): + is_installed = True + source_link = None + + def __init__( + self, + dist: BaseDistribution, + template: InstallRequirement, + factory: "Factory", + ) -> None: + self.dist = dist + self._ireq = _make_install_req_from_dist(dist, template) + self._factory = factory + self._version = None + + # This is just logging some messages, so we can do it eagerly. + # The returned dist would be exactly the same as self.dist because we + # set satisfied_by in _make_install_req_from_dist. + # TODO: Supply reason based on force_reinstall and upgrade_strategy. + skip_reason = "already satisfied" + factory.preparer.prepare_installed_requirement(self._ireq, skip_reason) + + def __str__(self) -> str: + return str(self.dist) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.dist!r})" + + def __hash__(self) -> int: + return hash((self.__class__, self.name, self.version)) + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return self.name == other.name and self.version == other.version + return False + + @property + def project_name(self) -> NormalizedName: + return self.dist.canonical_name + + @property + def name(self) -> str: + return self.project_name + + @property + def version(self) -> CandidateVersion: + if self._version is None: + self._version = self.dist.version + return self._version + + @property + def is_editable(self) -> bool: + return self.dist.editable + + def format_for_error(self) -> str: + return f"{self.name} {self.version} (Installed)" + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + if not with_requires: + return + for r in self.dist.iter_dependencies(): + yield from self._factory.make_requirements_from_spec(str(r), self._ireq) + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return None + + +class ExtrasCandidate(Candidate): + """A candidate that has 'extras', indicating additional dependencies. + + Requirements can be for a project with dependencies, something like + foo[extra]. The extras don't affect the project/version being installed + directly, but indicate that we need additional dependencies. We model that + by having an artificial ExtrasCandidate that wraps the "base" candidate. + + The ExtrasCandidate differs from the base in the following ways: + + 1. It has a unique name, of the form foo[extra]. This causes the resolver + to treat it as a separate node in the dependency graph. + 2. When we're getting the candidate's dependencies, + a) We specify that we want the extra dependencies as well. + b) We add a dependency on the base candidate. + See below for why this is needed. + 3. We return None for the underlying InstallRequirement, as the base + candidate will provide it, and we don't want to end up with duplicates. + + The dependency on the base candidate is needed so that the resolver can't + decide that it should recommend foo[extra1] version 1.0 and foo[extra2] + version 2.0. Having those candidates depend on foo=1.0 and foo=2.0 + respectively forces the resolver to recognise that this is a conflict. + """ + + def __init__( + self, + base: BaseCandidate, + extras: FrozenSet[str], + *, + comes_from: Optional[InstallRequirement] = None, + ) -> None: + """ + :param comes_from: the InstallRequirement that led to this candidate if it + differs from the base's InstallRequirement. This will often be the + case in the sense that this candidate's requirement has the extras + while the base's does not. Unlike the InstallRequirement backed + candidates, this requirement is used solely for reporting purposes, + it does not do any leg work. + """ + self.base = base + self.extras = frozenset(canonicalize_name(e) for e in extras) + # If any extras are requested in their non-normalized forms, keep track + # of their raw values. This is needed when we look up dependencies + # since PEP 685 has not been implemented for marker-matching, and using + # the non-normalized extra for lookup ensures the user can select a + # non-normalized extra in a package with its non-normalized form. + # TODO: Remove this attribute when packaging is upgraded to support the + # marker comparison logic specified in PEP 685. + self._unnormalized_extras = extras.difference(self.extras) + self._comes_from = comes_from if comes_from is not None else self.base._ireq + + def __str__(self) -> str: + name, rest = str(self.base).split(" ", 1) + return "{}[{}] {}".format(name, ",".join(self.extras), rest) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(base={self.base!r}, extras={self.extras!r})" + + def __hash__(self) -> int: + return hash((self.base, self.extras)) + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return self.base == other.base and self.extras == other.extras + return False + + @property + def project_name(self) -> NormalizedName: + return self.base.project_name + + @property + def name(self) -> str: + """The normalised name of the project the candidate refers to""" + return format_name(self.base.project_name, self.extras) + + @property + def version(self) -> CandidateVersion: + return self.base.version + + def format_for_error(self) -> str: + return "{} [{}]".format( + self.base.format_for_error(), ", ".join(sorted(self.extras)) + ) + + @property + def is_installed(self) -> bool: + return self.base.is_installed + + @property + def is_editable(self) -> bool: + return self.base.is_editable + + @property + def source_link(self) -> Optional[Link]: + return self.base.source_link + + def _warn_invalid_extras( + self, + requested: FrozenSet[str], + valid: FrozenSet[str], + ) -> None: + """Emit warnings for invalid extras being requested. + + This emits a warning for each requested extra that is not in the + candidate's ``Provides-Extra`` list. + """ + invalid_extras_to_warn = frozenset( + extra + for extra in requested + if extra not in valid + # If an extra is requested in an unnormalized form, skip warning + # about the normalized form being missing. + and extra in self.extras + ) + if not invalid_extras_to_warn: + return + for extra in sorted(invalid_extras_to_warn): + logger.warning( + "%s %s does not provide the extra '%s'", + self.base.name, + self.version, + extra, + ) + + def _calculate_valid_requested_extras(self) -> FrozenSet[str]: + """Get a list of valid extras requested by this candidate. + + The user (or upstream dependant) may have specified extras that the + candidate doesn't support. Any unsupported extras are dropped, and each + cause a warning to be logged here. + """ + requested_extras = self.extras.union(self._unnormalized_extras) + valid_extras = frozenset( + extra + for extra in requested_extras + if self.base.dist.is_extra_provided(extra) + ) + self._warn_invalid_extras(requested_extras, valid_extras) + return valid_extras + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + factory = self.base._factory + + # Add a dependency on the exact base + # (See note 2b in the class docstring) + yield factory.make_requirement_from_candidate(self.base) + if not with_requires: + return + + valid_extras = self._calculate_valid_requested_extras() + for r in self.base.dist.iter_dependencies(valid_extras): + yield from factory.make_requirements_from_spec( + str(r), + self._comes_from, + valid_extras, + ) + + def get_install_requirement(self) -> Optional[InstallRequirement]: + # We don't return anything here, because we always + # depend on the base candidate, and we'll get the + # install requirement from that. + return None + + +class RequiresPythonCandidate(Candidate): + is_installed = False + source_link = None + + def __init__(self, py_version_info: Optional[Tuple[int, ...]]) -> None: + if py_version_info is not None: + version_info = normalize_version_info(py_version_info) + else: + version_info = sys.version_info[:3] + self._version = Version(".".join(str(c) for c in version_info)) + + # We don't need to implement __eq__() and __ne__() since there is always + # only one RequiresPythonCandidate in a resolution, i.e. the host Python. + # The built-in object.__eq__() and object.__ne__() do exactly what we want. + + def __str__(self) -> str: + return f"Python {self._version}" + + @property + def project_name(self) -> NormalizedName: + return REQUIRES_PYTHON_IDENTIFIER + + @property + def name(self) -> str: + return REQUIRES_PYTHON_IDENTIFIER + + @property + def version(self) -> CandidateVersion: + return self._version + + def format_for_error(self) -> str: + return f"Python {self.version}" + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + return () + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return None diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py new file mode 100644 index 0000000..4adeb43 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py @@ -0,0 +1,812 @@ +import contextlib +import functools +import logging +from typing import ( + TYPE_CHECKING, + Dict, + FrozenSet, + Iterable, + Iterator, + List, + Mapping, + NamedTuple, + Optional, + Sequence, + Set, + Tuple, + TypeVar, + cast, +) + +from pip._vendor.packaging.requirements import InvalidRequirement +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.resolvelib import ResolutionImpossible + +from pip._internal.cache import CacheEntry, WheelCache +from pip._internal.exceptions import ( + DistributionNotFound, + InstallationError, + MetadataInconsistent, + UnsupportedPythonVersion, + UnsupportedWheel, +) +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution, get_default_environment +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import ( + install_req_drop_extras, + install_req_from_link_and_ireq, +) +from pip._internal.req.req_install import ( + InstallRequirement, + check_invalid_constraint_type, +) +from pip._internal.resolution.base import InstallRequirementProvider +from pip._internal.utils.compatibility_tags import get_supported +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.packaging import get_requirement +from pip._internal.utils.virtualenv import running_under_virtualenv + +from .base import Candidate, CandidateVersion, Constraint, Requirement +from .candidates import ( + AlreadyInstalledCandidate, + BaseCandidate, + EditableCandidate, + ExtrasCandidate, + LinkCandidate, + RequiresPythonCandidate, + as_base_candidate, +) +from .found_candidates import FoundCandidates, IndexCandidateInfo +from .requirements import ( + ExplicitRequirement, + RequiresPythonRequirement, + SpecifierRequirement, + SpecifierWithoutExtrasRequirement, + UnsatisfiableRequirement, +) + +if TYPE_CHECKING: + from typing import Protocol + + class ConflictCause(Protocol): + requirement: RequiresPythonRequirement + parent: Candidate + + +logger = logging.getLogger(__name__) + +C = TypeVar("C") +Cache = Dict[Link, C] + + +class CollectedRootRequirements(NamedTuple): + requirements: List[Requirement] + constraints: Dict[str, Constraint] + user_requested: Dict[str, int] + + +class Factory: + def __init__( + self, + finder: PackageFinder, + preparer: RequirementPreparer, + make_install_req: InstallRequirementProvider, + wheel_cache: Optional[WheelCache], + use_user_site: bool, + force_reinstall: bool, + ignore_installed: bool, + ignore_requires_python: bool, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> None: + self._finder = finder + self.preparer = preparer + self._wheel_cache = wheel_cache + self._python_candidate = RequiresPythonCandidate(py_version_info) + self._make_install_req_from_spec = make_install_req + self._use_user_site = use_user_site + self._force_reinstall = force_reinstall + self._ignore_requires_python = ignore_requires_python + + self._build_failures: Cache[InstallationError] = {} + self._link_candidate_cache: Cache[LinkCandidate] = {} + self._editable_candidate_cache: Cache[EditableCandidate] = {} + self._installed_candidate_cache: Dict[str, AlreadyInstalledCandidate] = {} + self._extras_candidate_cache: Dict[ + Tuple[int, FrozenSet[NormalizedName]], ExtrasCandidate + ] = {} + + if not ignore_installed: + env = get_default_environment() + self._installed_dists = { + dist.canonical_name: dist + for dist in env.iter_installed_distributions(local_only=False) + } + else: + self._installed_dists = {} + + @property + def force_reinstall(self) -> bool: + return self._force_reinstall + + def _fail_if_link_is_unsupported_wheel(self, link: Link) -> None: + if not link.is_wheel: + return + wheel = Wheel(link.filename) + if wheel.supported(self._finder.target_python.get_unsorted_tags()): + return + msg = f"{link.filename} is not a supported wheel on this platform." + raise UnsupportedWheel(msg) + + def _make_extras_candidate( + self, + base: BaseCandidate, + extras: FrozenSet[str], + *, + comes_from: Optional[InstallRequirement] = None, + ) -> ExtrasCandidate: + cache_key = (id(base), frozenset(canonicalize_name(e) for e in extras)) + try: + candidate = self._extras_candidate_cache[cache_key] + except KeyError: + candidate = ExtrasCandidate(base, extras, comes_from=comes_from) + self._extras_candidate_cache[cache_key] = candidate + return candidate + + def _make_candidate_from_dist( + self, + dist: BaseDistribution, + extras: FrozenSet[str], + template: InstallRequirement, + ) -> Candidate: + try: + base = self._installed_candidate_cache[dist.canonical_name] + except KeyError: + base = AlreadyInstalledCandidate(dist, template, factory=self) + self._installed_candidate_cache[dist.canonical_name] = base + if not extras: + return base + return self._make_extras_candidate(base, extras, comes_from=template) + + def _make_candidate_from_link( + self, + link: Link, + extras: FrozenSet[str], + template: InstallRequirement, + name: Optional[NormalizedName], + version: Optional[CandidateVersion], + ) -> Optional[Candidate]: + base: Optional[BaseCandidate] = self._make_base_candidate_from_link( + link, template, name, version + ) + if not extras or base is None: + return base + return self._make_extras_candidate(base, extras, comes_from=template) + + def _make_base_candidate_from_link( + self, + link: Link, + template: InstallRequirement, + name: Optional[NormalizedName], + version: Optional[CandidateVersion], + ) -> Optional[BaseCandidate]: + # TODO: Check already installed candidate, and use it if the link and + # editable flag match. + + if link in self._build_failures: + # We already tried this candidate before, and it does not build. + # Don't bother trying again. + return None + + if template.editable: + if link not in self._editable_candidate_cache: + try: + self._editable_candidate_cache[link] = EditableCandidate( + link, + template, + factory=self, + name=name, + version=version, + ) + except MetadataInconsistent as e: + logger.info( + "Discarding [blue underline]%s[/]: [yellow]%s[reset]", + link, + e, + extra={"markup": True}, + ) + self._build_failures[link] = e + return None + + return self._editable_candidate_cache[link] + else: + if link not in self._link_candidate_cache: + try: + self._link_candidate_cache[link] = LinkCandidate( + link, + template, + factory=self, + name=name, + version=version, + ) + except MetadataInconsistent as e: + logger.info( + "Discarding [blue underline]%s[/]: [yellow]%s[reset]", + link, + e, + extra={"markup": True}, + ) + self._build_failures[link] = e + return None + return self._link_candidate_cache[link] + + def _iter_found_candidates( + self, + ireqs: Sequence[InstallRequirement], + specifier: SpecifierSet, + hashes: Hashes, + prefers_installed: bool, + incompatible_ids: Set[int], + ) -> Iterable[Candidate]: + if not ireqs: + return () + + # The InstallRequirement implementation requires us to give it a + # "template". Here we just choose the first requirement to represent + # all of them. + # Hopefully the Project model can correct this mismatch in the future. + template = ireqs[0] + assert template.req, "Candidates found on index must be PEP 508" + name = canonicalize_name(template.req.name) + + extras: FrozenSet[str] = frozenset() + for ireq in ireqs: + assert ireq.req, "Candidates found on index must be PEP 508" + specifier &= ireq.req.specifier + hashes &= ireq.hashes(trust_internet=False) + extras |= frozenset(ireq.extras) + + def _get_installed_candidate() -> Optional[Candidate]: + """Get the candidate for the currently-installed version.""" + # If --force-reinstall is set, we want the version from the index + # instead, so we "pretend" there is nothing installed. + if self._force_reinstall: + return None + try: + installed_dist = self._installed_dists[name] + except KeyError: + return None + # Don't use the installed distribution if its version does not fit + # the current dependency graph. + if not specifier.contains(installed_dist.version, prereleases=True): + return None + candidate = self._make_candidate_from_dist( + dist=installed_dist, + extras=extras, + template=template, + ) + # The candidate is a known incompatibility. Don't use it. + if id(candidate) in incompatible_ids: + return None + return candidate + + def iter_index_candidate_infos() -> Iterator[IndexCandidateInfo]: + result = self._finder.find_best_candidate( + project_name=name, + specifier=specifier, + hashes=hashes, + ) + icans = list(result.iter_applicable()) + + # PEP 592: Yanked releases are ignored unless the specifier + # explicitly pins a version (via '==' or '===') that can be + # solely satisfied by a yanked release. + all_yanked = all(ican.link.is_yanked for ican in icans) + + def is_pinned(specifier: SpecifierSet) -> bool: + for sp in specifier: + if sp.operator == "===": + return True + if sp.operator != "==": + continue + if sp.version.endswith(".*"): + continue + return True + return False + + pinned = is_pinned(specifier) + + # PackageFinder returns earlier versions first, so we reverse. + for ican in reversed(icans): + if not (all_yanked and pinned) and ican.link.is_yanked: + continue + func = functools.partial( + self._make_candidate_from_link, + link=ican.link, + extras=extras, + template=template, + name=name, + version=ican.version, + ) + yield ican.version, func + + return FoundCandidates( + iter_index_candidate_infos, + _get_installed_candidate(), + prefers_installed, + incompatible_ids, + ) + + def _iter_explicit_candidates_from_base( + self, + base_requirements: Iterable[Requirement], + extras: FrozenSet[str], + ) -> Iterator[Candidate]: + """Produce explicit candidates from the base given an extra-ed package. + + :param base_requirements: Requirements known to the resolver. The + requirements are guaranteed to not have extras. + :param extras: The extras to inject into the explicit requirements' + candidates. + """ + for req in base_requirements: + lookup_cand, _ = req.get_candidate_lookup() + if lookup_cand is None: # Not explicit. + continue + # We've stripped extras from the identifier, and should always + # get a BaseCandidate here, unless there's a bug elsewhere. + base_cand = as_base_candidate(lookup_cand) + assert base_cand is not None, "no extras here" + yield self._make_extras_candidate(base_cand, extras) + + def _iter_candidates_from_constraints( + self, + identifier: str, + constraint: Constraint, + template: InstallRequirement, + ) -> Iterator[Candidate]: + """Produce explicit candidates from constraints. + + This creates "fake" InstallRequirement objects that are basically clones + of what "should" be the template, but with original_link set to link. + """ + for link in constraint.links: + self._fail_if_link_is_unsupported_wheel(link) + candidate = self._make_base_candidate_from_link( + link, + template=install_req_from_link_and_ireq(link, template), + name=canonicalize_name(identifier), + version=None, + ) + if candidate: + yield candidate + + def find_candidates( + self, + identifier: str, + requirements: Mapping[str, Iterable[Requirement]], + incompatibilities: Mapping[str, Iterator[Candidate]], + constraint: Constraint, + prefers_installed: bool, + ) -> Iterable[Candidate]: + # Collect basic lookup information from the requirements. + explicit_candidates: Set[Candidate] = set() + ireqs: List[InstallRequirement] = [] + for req in requirements[identifier]: + cand, ireq = req.get_candidate_lookup() + if cand is not None: + explicit_candidates.add(cand) + if ireq is not None: + ireqs.append(ireq) + + # If the current identifier contains extras, add requires and explicit + # candidates from entries from extra-less identifier. + with contextlib.suppress(InvalidRequirement): + parsed_requirement = get_requirement(identifier) + if parsed_requirement.name != identifier: + explicit_candidates.update( + self._iter_explicit_candidates_from_base( + requirements.get(parsed_requirement.name, ()), + frozenset(parsed_requirement.extras), + ), + ) + for req in requirements.get(parsed_requirement.name, []): + _, ireq = req.get_candidate_lookup() + if ireq is not None: + ireqs.append(ireq) + + # Add explicit candidates from constraints. We only do this if there are + # known ireqs, which represent requirements not already explicit. If + # there are no ireqs, we're constraining already-explicit requirements, + # which is handled later when we return the explicit candidates. + if ireqs: + try: + explicit_candidates.update( + self._iter_candidates_from_constraints( + identifier, + constraint, + template=ireqs[0], + ), + ) + except UnsupportedWheel: + # If we're constrained to install a wheel incompatible with the + # target architecture, no candidates will ever be valid. + return () + + # Since we cache all the candidates, incompatibility identification + # can be made quicker by comparing only the id() values. + incompat_ids = {id(c) for c in incompatibilities.get(identifier, ())} + + # If none of the requirements want an explicit candidate, we can ask + # the finder for candidates. + if not explicit_candidates: + return self._iter_found_candidates( + ireqs, + constraint.specifier, + constraint.hashes, + prefers_installed, + incompat_ids, + ) + + return ( + c + for c in explicit_candidates + if id(c) not in incompat_ids + and constraint.is_satisfied_by(c) + and all(req.is_satisfied_by(c) for req in requirements[identifier]) + ) + + def _make_requirements_from_install_req( + self, ireq: InstallRequirement, requested_extras: Iterable[str] + ) -> Iterator[Requirement]: + """ + Returns requirement objects associated with the given InstallRequirement. In + most cases this will be a single object but the following special cases exist: + - the InstallRequirement has markers that do not apply -> result is empty + - the InstallRequirement has both a constraint (or link) and extras + -> result is split in two requirement objects: one with the constraint + (or link) and one with the extra. This allows centralized constraint + handling for the base, resulting in fewer candidate rejections. + """ + if not ireq.match_markers(requested_extras): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + ireq.name, + ireq.markers, + ) + elif not ireq.link: + if ireq.extras and ireq.req is not None and ireq.req.specifier: + yield SpecifierWithoutExtrasRequirement(ireq) + yield SpecifierRequirement(ireq) + else: + self._fail_if_link_is_unsupported_wheel(ireq.link) + # Always make the link candidate for the base requirement to make it + # available to `find_candidates` for explicit candidate lookup for any + # set of extras. + # The extras are required separately via a second requirement. + cand = self._make_base_candidate_from_link( + ireq.link, + template=install_req_drop_extras(ireq) if ireq.extras else ireq, + name=canonicalize_name(ireq.name) if ireq.name else None, + version=None, + ) + if cand is None: + # There's no way we can satisfy a URL requirement if the underlying + # candidate fails to build. An unnamed URL must be user-supplied, so + # we fail eagerly. If the URL is named, an unsatisfiable requirement + # can make the resolver do the right thing, either backtrack (and + # maybe find some other requirement that's buildable) or raise a + # ResolutionImpossible eventually. + if not ireq.name: + raise self._build_failures[ireq.link] + yield UnsatisfiableRequirement(canonicalize_name(ireq.name)) + else: + # require the base from the link + yield self.make_requirement_from_candidate(cand) + if ireq.extras: + # require the extras on top of the base candidate + yield self.make_requirement_from_candidate( + self._make_extras_candidate(cand, frozenset(ireq.extras)) + ) + + def collect_root_requirements( + self, root_ireqs: List[InstallRequirement] + ) -> CollectedRootRequirements: + collected = CollectedRootRequirements([], {}, {}) + for i, ireq in enumerate(root_ireqs): + if ireq.constraint: + # Ensure we only accept valid constraints + problem = check_invalid_constraint_type(ireq) + if problem: + raise InstallationError(problem) + if not ireq.match_markers(): + continue + assert ireq.name, "Constraint must be named" + name = canonicalize_name(ireq.name) + if name in collected.constraints: + collected.constraints[name] &= ireq + else: + collected.constraints[name] = Constraint.from_ireq(ireq) + else: + reqs = list( + self._make_requirements_from_install_req( + ireq, + requested_extras=(), + ) + ) + if not reqs: + continue + template = reqs[0] + if ireq.user_supplied and template.name not in collected.user_requested: + collected.user_requested[template.name] = i + collected.requirements.extend(reqs) + # Put requirements with extras at the end of the root requires. This does not + # affect resolvelib's picking preference but it does affect its initial criteria + # population: by putting extras at the end we enable the candidate finder to + # present resolvelib with a smaller set of candidates to resolvelib, already + # taking into account any non-transient constraints on the associated base. This + # means resolvelib will have fewer candidates to visit and reject. + # Python's list sort is stable, meaning relative order is kept for objects with + # the same key. + collected.requirements.sort(key=lambda r: r.name != r.project_name) + return collected + + def make_requirement_from_candidate( + self, candidate: Candidate + ) -> ExplicitRequirement: + return ExplicitRequirement(candidate) + + def make_requirements_from_spec( + self, + specifier: str, + comes_from: Optional[InstallRequirement], + requested_extras: Iterable[str] = (), + ) -> Iterator[Requirement]: + """ + Returns requirement objects associated with the given specifier. In most cases + this will be a single object but the following special cases exist: + - the specifier has markers that do not apply -> result is empty + - the specifier has both a constraint and extras -> result is split + in two requirement objects: one with the constraint and one with the + extra. This allows centralized constraint handling for the base, + resulting in fewer candidate rejections. + """ + ireq = self._make_install_req_from_spec(specifier, comes_from) + return self._make_requirements_from_install_req(ireq, requested_extras) + + def make_requires_python_requirement( + self, + specifier: SpecifierSet, + ) -> Optional[Requirement]: + if self._ignore_requires_python: + return None + # Don't bother creating a dependency for an empty Requires-Python. + if not str(specifier): + return None + return RequiresPythonRequirement(specifier, self._python_candidate) + + def get_wheel_cache_entry( + self, link: Link, name: Optional[str] + ) -> Optional[CacheEntry]: + """Look up the link in the wheel cache. + + If ``preparer.require_hashes`` is True, don't use the wheel cache, + because cached wheels, always built locally, have different hashes + than the files downloaded from the index server and thus throw false + hash mismatches. Furthermore, cached wheels at present have + nondeterministic contents due to file modification times. + """ + if self._wheel_cache is None: + return None + return self._wheel_cache.get_cache_entry( + link=link, + package_name=name, + supported_tags=get_supported(), + ) + + def get_dist_to_uninstall(self, candidate: Candidate) -> Optional[BaseDistribution]: + # TODO: Are there more cases this needs to return True? Editable? + dist = self._installed_dists.get(candidate.project_name) + if dist is None: # Not installed, no uninstallation required. + return None + + # We're installing into global site. The current installation must + # be uninstalled, no matter it's in global or user site, because the + # user site installation has precedence over global. + if not self._use_user_site: + return dist + + # We're installing into user site. Remove the user site installation. + if dist.in_usersite: + return dist + + # We're installing into user site, but the installed incompatible + # package is in global site. We can't uninstall that, and would let + # the new user installation to "shadow" it. But shadowing won't work + # in virtual environments, so we error out. + if running_under_virtualenv() and dist.in_site_packages: + message = ( + f"Will not install to the user site because it will lack " + f"sys.path precedence to {dist.raw_name} in {dist.location}" + ) + raise InstallationError(message) + return None + + def _report_requires_python_error( + self, causes: Sequence["ConflictCause"] + ) -> UnsupportedPythonVersion: + assert causes, "Requires-Python error reported with no cause" + + version = self._python_candidate.version + + if len(causes) == 1: + specifier = str(causes[0].requirement.specifier) + message = ( + f"Package {causes[0].parent.name!r} requires a different " + f"Python: {version} not in {specifier!r}" + ) + return UnsupportedPythonVersion(message) + + message = f"Packages require a different Python. {version} not in:" + for cause in causes: + package = cause.parent.format_for_error() + specifier = str(cause.requirement.specifier) + message += f"\n{specifier!r} (required by {package})" + return UnsupportedPythonVersion(message) + + def _report_single_requirement_conflict( + self, req: Requirement, parent: Optional[Candidate] + ) -> DistributionNotFound: + if parent is None: + req_disp = str(req) + else: + req_disp = f"{req} (from {parent.name})" + + cands = self._finder.find_all_candidates(req.project_name) + skipped_by_requires_python = self._finder.requires_python_skipped_reasons() + + versions_set: Set[CandidateVersion] = set() + yanked_versions_set: Set[CandidateVersion] = set() + for c in cands: + is_yanked = c.link.is_yanked if c.link else False + if is_yanked: + yanked_versions_set.add(c.version) + else: + versions_set.add(c.version) + + versions = [str(v) for v in sorted(versions_set)] + yanked_versions = [str(v) for v in sorted(yanked_versions_set)] + + if yanked_versions: + # Saying "version X is yanked" isn't entirely accurate. + # https://github.com/pypa/pip/issues/11745#issuecomment-1402805842 + logger.critical( + "Ignored the following yanked versions: %s", + ", ".join(yanked_versions) or "none", + ) + if skipped_by_requires_python: + logger.critical( + "Ignored the following versions that require a different python " + "version: %s", + "; ".join(skipped_by_requires_python) or "none", + ) + logger.critical( + "Could not find a version that satisfies the requirement %s " + "(from versions: %s)", + req_disp, + ", ".join(versions) or "none", + ) + if str(req) == "requirements.txt": + logger.info( + "HINT: You are attempting to install a package literally " + 'named "requirements.txt" (which cannot exist). Consider ' + "using the '-r' flag to install the packages listed in " + "requirements.txt" + ) + + return DistributionNotFound(f"No matching distribution found for {req}") + + def get_installation_error( + self, + e: "ResolutionImpossible[Requirement, Candidate]", + constraints: Dict[str, Constraint], + ) -> InstallationError: + assert e.causes, "Installation error reported with no cause" + + # If one of the things we can't solve is "we need Python X.Y", + # that is what we report. + requires_python_causes = [ + cause + for cause in e.causes + if isinstance(cause.requirement, RequiresPythonRequirement) + and not cause.requirement.is_satisfied_by(self._python_candidate) + ] + if requires_python_causes: + # The comprehension above makes sure all Requirement instances are + # RequiresPythonRequirement, so let's cast for convenience. + return self._report_requires_python_error( + cast("Sequence[ConflictCause]", requires_python_causes), + ) + + # Otherwise, we have a set of causes which can't all be satisfied + # at once. + + # The simplest case is when we have *one* cause that can't be + # satisfied. We just report that case. + if len(e.causes) == 1: + req, parent = e.causes[0] + if req.name not in constraints: + return self._report_single_requirement_conflict(req, parent) + + # OK, we now have a list of requirements that can't all be + # satisfied at once. + + # A couple of formatting helpers + def text_join(parts: List[str]) -> str: + if len(parts) == 1: + return parts[0] + + return ", ".join(parts[:-1]) + " and " + parts[-1] + + def describe_trigger(parent: Candidate) -> str: + ireq = parent.get_install_requirement() + if not ireq or not ireq.comes_from: + return f"{parent.name}=={parent.version}" + if isinstance(ireq.comes_from, InstallRequirement): + return str(ireq.comes_from.name) + return str(ireq.comes_from) + + triggers = set() + for req, parent in e.causes: + if parent is None: + # This is a root requirement, so we can report it directly + trigger = req.format_for_error() + else: + trigger = describe_trigger(parent) + triggers.add(trigger) + + if triggers: + info = text_join(sorted(triggers)) + else: + info = "the requested packages" + + msg = ( + f"Cannot install {info} because these package versions " + "have conflicting dependencies." + ) + logger.critical(msg) + msg = "\nThe conflict is caused by:" + + relevant_constraints = set() + for req, parent in e.causes: + if req.name in constraints: + relevant_constraints.add(req.name) + msg = msg + "\n " + if parent: + msg = msg + f"{parent.name} {parent.version} depends on " + else: + msg = msg + "The user requested " + msg = msg + req.format_for_error() + for key in relevant_constraints: + spec = constraints[key].specifier + msg += f"\n The user requested (constraint) {key}{spec}" + + msg = ( + msg + + "\n\n" + + "To fix this you could try to:\n" + + "1. loosen the range of package versions you've specified\n" + + "2. remove package versions to allow pip attempt to solve " + + "the dependency conflict\n" + ) + + logger.info(msg) + + return DistributionNotFound( + "ResolutionImpossible: for help visit " + "https://pip.pypa.io/en/latest/topics/dependency-resolution/" + "#dealing-with-dependency-conflicts" + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py new file mode 100644 index 0000000..8663097 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py @@ -0,0 +1,155 @@ +"""Utilities to lazily create and visit candidates found. + +Creating and visiting a candidate is a *very* costly operation. It involves +fetching, extracting, potentially building modules from source, and verifying +distribution metadata. It is therefore crucial for performance to keep +everything here lazy all the way down, so we only touch candidates that we +absolutely need, and not "download the world" when we only need one version of +something. +""" + +import functools +from collections.abc import Sequence +from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, Set, Tuple + +from pip._vendor.packaging.version import _BaseVersion + +from .base import Candidate + +IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]] + +if TYPE_CHECKING: + SequenceCandidate = Sequence[Candidate] +else: + # For compatibility: Python before 3.9 does not support using [] on the + # Sequence class. + # + # >>> from collections.abc import Sequence + # >>> Sequence[str] + # Traceback (most recent call last): + # File "", line 1, in + # TypeError: 'ABCMeta' object is not subscriptable + # + # TODO: Remove this block after dropping Python 3.8 support. + SequenceCandidate = Sequence + + +def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candidate]: + """Iterator for ``FoundCandidates``. + + This iterator is used when the package is not already installed. Candidates + from index come later in their normal ordering. + """ + versions_found: Set[_BaseVersion] = set() + for version, func in infos: + if version in versions_found: + continue + candidate = func() + if candidate is None: + continue + yield candidate + versions_found.add(version) + + +def _iter_built_with_prepended( + installed: Candidate, infos: Iterator[IndexCandidateInfo] +) -> Iterator[Candidate]: + """Iterator for ``FoundCandidates``. + + This iterator is used when the resolver prefers the already-installed + candidate and NOT to upgrade. The installed candidate is therefore + always yielded first, and candidates from index come later in their + normal ordering, except skipped when the version is already installed. + """ + yield installed + versions_found: Set[_BaseVersion] = {installed.version} + for version, func in infos: + if version in versions_found: + continue + candidate = func() + if candidate is None: + continue + yield candidate + versions_found.add(version) + + +def _iter_built_with_inserted( + installed: Candidate, infos: Iterator[IndexCandidateInfo] +) -> Iterator[Candidate]: + """Iterator for ``FoundCandidates``. + + This iterator is used when the resolver prefers to upgrade an + already-installed package. Candidates from index are returned in their + normal ordering, except replaced when the version is already installed. + + The implementation iterates through and yields other candidates, inserting + the installed candidate exactly once before we start yielding older or + equivalent candidates, or after all other candidates if they are all newer. + """ + versions_found: Set[_BaseVersion] = set() + for version, func in infos: + if version in versions_found: + continue + # If the installed candidate is better, yield it first. + if installed.version >= version: + yield installed + versions_found.add(installed.version) + candidate = func() + if candidate is None: + continue + yield candidate + versions_found.add(version) + + # If the installed candidate is older than all other candidates. + if installed.version not in versions_found: + yield installed + + +class FoundCandidates(SequenceCandidate): + """A lazy sequence to provide candidates to the resolver. + + The intended usage is to return this from `find_matches()` so the resolver + can iterate through the sequence multiple times, but only access the index + page when remote packages are actually needed. This improve performances + when suitable candidates are already installed on disk. + """ + + def __init__( + self, + get_infos: Callable[[], Iterator[IndexCandidateInfo]], + installed: Optional[Candidate], + prefers_installed: bool, + incompatible_ids: Set[int], + ): + self._get_infos = get_infos + self._installed = installed + self._prefers_installed = prefers_installed + self._incompatible_ids = incompatible_ids + + def __getitem__(self, index: Any) -> Any: + # Implemented to satisfy the ABC check. This is not needed by the + # resolver, and should not be used by the provider either (for + # performance reasons). + raise NotImplementedError("don't do this") + + def __iter__(self) -> Iterator[Candidate]: + infos = self._get_infos() + if not self._installed: + iterator = _iter_built(infos) + elif self._prefers_installed: + iterator = _iter_built_with_prepended(self._installed, infos) + else: + iterator = _iter_built_with_inserted(self._installed, infos) + return (c for c in iterator if id(c) not in self._incompatible_ids) + + def __len__(self) -> int: + # Implemented to satisfy the ABC check. This is not needed by the + # resolver, and should not be used by the provider either (for + # performance reasons). + raise NotImplementedError("don't do this") + + @functools.lru_cache(maxsize=1) + def __bool__(self) -> bool: + if self._prefers_installed and self._installed: + return True + return any(self) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py new file mode 100644 index 0000000..315fb9c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py @@ -0,0 +1,255 @@ +import collections +import math +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + Iterator, + Mapping, + Sequence, + TypeVar, + Union, +) + +from pip._vendor.resolvelib.providers import AbstractProvider + +from .base import Candidate, Constraint, Requirement +from .candidates import REQUIRES_PYTHON_IDENTIFIER +from .factory import Factory + +if TYPE_CHECKING: + from pip._vendor.resolvelib.providers import Preference + from pip._vendor.resolvelib.resolvers import RequirementInformation + + PreferenceInformation = RequirementInformation[Requirement, Candidate] + + _ProviderBase = AbstractProvider[Requirement, Candidate, str] +else: + _ProviderBase = AbstractProvider + +# Notes on the relationship between the provider, the factory, and the +# candidate and requirement classes. +# +# The provider is a direct implementation of the resolvelib class. Its role +# is to deliver the API that resolvelib expects. +# +# Rather than work with completely abstract "requirement" and "candidate" +# concepts as resolvelib does, pip has concrete classes implementing these two +# ideas. The API of Requirement and Candidate objects are defined in the base +# classes, but essentially map fairly directly to the equivalent provider +# methods. In particular, `find_matches` and `is_satisfied_by` are +# requirement methods, and `get_dependencies` is a candidate method. +# +# The factory is the interface to pip's internal mechanisms. It is stateless, +# and is created by the resolver and held as a property of the provider. It is +# responsible for creating Requirement and Candidate objects, and provides +# services to those objects (access to pip's finder and preparer). + + +D = TypeVar("D") +V = TypeVar("V") + + +def _get_with_identifier( + mapping: Mapping[str, V], + identifier: str, + default: D, +) -> Union[D, V]: + """Get item from a package name lookup mapping with a resolver identifier. + + This extra logic is needed when the target mapping is keyed by package + name, which cannot be directly looked up with an identifier (which may + contain requested extras). Additional logic is added to also look up a value + by "cleaning up" the extras from the identifier. + """ + if identifier in mapping: + return mapping[identifier] + # HACK: Theoretically we should check whether this identifier is a valid + # "NAME[EXTRAS]" format, and parse out the name part with packaging or + # some regular expression. But since pip's resolver only spits out three + # kinds of identifiers: normalized PEP 503 names, normalized names plus + # extras, and Requires-Python, we can cheat a bit here. + name, open_bracket, _ = identifier.partition("[") + if open_bracket and name in mapping: + return mapping[name] + return default + + +class PipProvider(_ProviderBase): + """Pip's provider implementation for resolvelib. + + :params constraints: A mapping of constraints specified by the user. Keys + are canonicalized project names. + :params ignore_dependencies: Whether the user specified ``--no-deps``. + :params upgrade_strategy: The user-specified upgrade strategy. + :params user_requested: A set of canonicalized package names that the user + supplied for pip to install/upgrade. + """ + + def __init__( + self, + factory: Factory, + constraints: Dict[str, Constraint], + ignore_dependencies: bool, + upgrade_strategy: str, + user_requested: Dict[str, int], + ) -> None: + self._factory = factory + self._constraints = constraints + self._ignore_dependencies = ignore_dependencies + self._upgrade_strategy = upgrade_strategy + self._user_requested = user_requested + self._known_depths: Dict[str, float] = collections.defaultdict(lambda: math.inf) + + def identify(self, requirement_or_candidate: Union[Requirement, Candidate]) -> str: + return requirement_or_candidate.name + + def get_preference( + self, + identifier: str, + resolutions: Mapping[str, Candidate], + candidates: Mapping[str, Iterator[Candidate]], + information: Mapping[str, Iterable["PreferenceInformation"]], + backtrack_causes: Sequence["PreferenceInformation"], + ) -> "Preference": + """Produce a sort key for given requirement based on preference. + + The lower the return value is, the more preferred this group of + arguments is. + + Currently pip considers the following in order: + + * Prefer if any of the known requirements is "direct", e.g. points to an + explicit URL. + * If equal, prefer if any requirement is "pinned", i.e. contains + operator ``===`` or ``==``. + * If equal, calculate an approximate "depth" and resolve requirements + closer to the user-specified requirements first. If the depth cannot + by determined (eg: due to no matching parents), it is considered + infinite. + * Order user-specified requirements by the order they are specified. + * If equal, prefers "non-free" requirements, i.e. contains at least one + operator, such as ``>=`` or ``<``. + * If equal, order alphabetically for consistency (helps debuggability). + """ + try: + next(iter(information[identifier])) + except StopIteration: + # There is no information for this identifier, so there's no known + # candidates. + has_information = False + else: + has_information = True + + if has_information: + lookups = (r.get_candidate_lookup() for r, _ in information[identifier]) + candidate, ireqs = zip(*lookups) + else: + candidate, ireqs = None, () + + operators = [ + specifier.operator + for specifier_set in (ireq.specifier for ireq in ireqs if ireq) + for specifier in specifier_set + ] + + direct = candidate is not None + pinned = any(op[:2] == "==" for op in operators) + unfree = bool(operators) + + try: + requested_order: Union[int, float] = self._user_requested[identifier] + except KeyError: + requested_order = math.inf + if has_information: + parent_depths = ( + self._known_depths[parent.name] if parent is not None else 0.0 + for _, parent in information[identifier] + ) + inferred_depth = min(d for d in parent_depths) + 1.0 + else: + inferred_depth = math.inf + else: + inferred_depth = 1.0 + self._known_depths[identifier] = inferred_depth + + requested_order = self._user_requested.get(identifier, math.inf) + + # Requires-Python has only one candidate and the check is basically + # free, so we always do it first to avoid needless work if it fails. + requires_python = identifier == REQUIRES_PYTHON_IDENTIFIER + + # Prefer the causes of backtracking on the assumption that the problem + # resolving the dependency tree is related to the failures that caused + # the backtracking + backtrack_cause = self.is_backtrack_cause(identifier, backtrack_causes) + + return ( + not requires_python, + not direct, + not pinned, + not backtrack_cause, + inferred_depth, + requested_order, + not unfree, + identifier, + ) + + def find_matches( + self, + identifier: str, + requirements: Mapping[str, Iterator[Requirement]], + incompatibilities: Mapping[str, Iterator[Candidate]], + ) -> Iterable[Candidate]: + def _eligible_for_upgrade(identifier: str) -> bool: + """Are upgrades allowed for this project? + + This checks the upgrade strategy, and whether the project was one + that the user specified in the command line, in order to decide + whether we should upgrade if there's a newer version available. + + (Note that we don't need access to the `--upgrade` flag, because + an upgrade strategy of "to-satisfy-only" means that `--upgrade` + was not specified). + """ + if self._upgrade_strategy == "eager": + return True + elif self._upgrade_strategy == "only-if-needed": + user_order = _get_with_identifier( + self._user_requested, + identifier, + default=None, + ) + return user_order is not None + return False + + constraint = _get_with_identifier( + self._constraints, + identifier, + default=Constraint.empty(), + ) + return self._factory.find_candidates( + identifier=identifier, + requirements=requirements, + constraint=constraint, + prefers_installed=(not _eligible_for_upgrade(identifier)), + incompatibilities=incompatibilities, + ) + + def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool: + return requirement.is_satisfied_by(candidate) + + def get_dependencies(self, candidate: Candidate) -> Sequence[Requirement]: + with_requires = not self._ignore_dependencies + return [r for r in candidate.iter_dependencies(with_requires) if r is not None] + + @staticmethod + def is_backtrack_cause( + identifier: str, backtrack_causes: Sequence["PreferenceInformation"] + ) -> bool: + for backtrack_cause in backtrack_causes: + if identifier == backtrack_cause.requirement.name: + return True + if backtrack_cause.parent and identifier == backtrack_cause.parent.name: + return True + return False diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py new file mode 100644 index 0000000..12adeff --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py @@ -0,0 +1,80 @@ +from collections import defaultdict +from logging import getLogger +from typing import Any, DefaultDict + +from pip._vendor.resolvelib.reporters import BaseReporter + +from .base import Candidate, Requirement + +logger = getLogger(__name__) + + +class PipReporter(BaseReporter): + def __init__(self) -> None: + self.reject_count_by_package: DefaultDict[str, int] = defaultdict(int) + + self._messages_at_reject_count = { + 1: ( + "pip is looking at multiple versions of {package_name} to " + "determine which version is compatible with other " + "requirements. This could take a while." + ), + 8: ( + "pip is still looking at multiple versions of {package_name} to " + "determine which version is compatible with other " + "requirements. This could take a while." + ), + 13: ( + "This is taking longer than usual. You might need to provide " + "the dependency resolver with stricter constraints to reduce " + "runtime. See https://pip.pypa.io/warnings/backtracking for " + "guidance. If you want to abort this run, press Ctrl + C." + ), + } + + def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None: + self.reject_count_by_package[candidate.name] += 1 + + count = self.reject_count_by_package[candidate.name] + if count not in self._messages_at_reject_count: + return + + message = self._messages_at_reject_count[count] + logger.info("INFO: %s", message.format(package_name=candidate.name)) + + msg = "Will try a different candidate, due to conflict:" + for req_info in criterion.information: + req, parent = req_info.requirement, req_info.parent + # Inspired by Factory.get_installation_error + msg += "\n " + if parent: + msg += f"{parent.name} {parent.version} depends on " + else: + msg += "The user requested " + msg += req.format_for_error() + logger.debug(msg) + + +class PipDebuggingReporter(BaseReporter): + """A reporter that does an info log for every event it sees.""" + + def starting(self) -> None: + logger.info("Reporter.starting()") + + def starting_round(self, index: int) -> None: + logger.info("Reporter.starting_round(%r)", index) + + def ending_round(self, index: int, state: Any) -> None: + logger.info("Reporter.ending_round(%r, state)", index) + + def ending(self, state: Any) -> None: + logger.info("Reporter.ending(%r)", state) + + def adding_requirement(self, requirement: Requirement, parent: Candidate) -> None: + logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent) + + def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None: + logger.info("Reporter.rejecting_candidate(%r, %r)", criterion, candidate) + + def pinning(self, candidate: Candidate) -> None: + logger.info("Reporter.pinning(%r)", candidate) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py new file mode 100644 index 0000000..4af4a9f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py @@ -0,0 +1,166 @@ +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name + +from pip._internal.req.constructors import install_req_drop_extras +from pip._internal.req.req_install import InstallRequirement + +from .base import Candidate, CandidateLookup, Requirement, format_name + + +class ExplicitRequirement(Requirement): + def __init__(self, candidate: Candidate) -> None: + self.candidate = candidate + + def __str__(self) -> str: + return str(self.candidate) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.candidate!r})" + + @property + def project_name(self) -> NormalizedName: + # No need to canonicalize - the candidate did this + return self.candidate.project_name + + @property + def name(self) -> str: + # No need to canonicalize - the candidate did this + return self.candidate.name + + def format_for_error(self) -> str: + return self.candidate.format_for_error() + + def get_candidate_lookup(self) -> CandidateLookup: + return self.candidate, None + + def is_satisfied_by(self, candidate: Candidate) -> bool: + return candidate == self.candidate + + +class SpecifierRequirement(Requirement): + def __init__(self, ireq: InstallRequirement) -> None: + assert ireq.link is None, "This is a link, not a specifier" + self._ireq = ireq + self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) + + def __str__(self) -> str: + return str(self._ireq.req) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({str(self._ireq.req)!r})" + + @property + def project_name(self) -> NormalizedName: + assert self._ireq.req, "Specifier-backed ireq is always PEP 508" + return canonicalize_name(self._ireq.req.name) + + @property + def name(self) -> str: + return format_name(self.project_name, self._extras) + + def format_for_error(self) -> str: + # Convert comma-separated specifiers into "A, B, ..., F and G" + # This makes the specifier a bit more "human readable", without + # risking a change in meaning. (Hopefully! Not all edge cases have + # been checked) + parts = [s.strip() for s in str(self).split(",")] + if len(parts) == 0: + return "" + elif len(parts) == 1: + return parts[0] + + return ", ".join(parts[:-1]) + " and " + parts[-1] + + def get_candidate_lookup(self) -> CandidateLookup: + return None, self._ireq + + def is_satisfied_by(self, candidate: Candidate) -> bool: + assert candidate.name == self.name, ( + f"Internal issue: Candidate is not for this requirement " + f"{candidate.name} vs {self.name}" + ) + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + assert self._ireq.req, "Specifier-backed ireq is always PEP 508" + spec = self._ireq.req.specifier + return spec.contains(candidate.version, prereleases=True) + + +class SpecifierWithoutExtrasRequirement(SpecifierRequirement): + """ + Requirement backed by an install requirement on a base package. + Trims extras from its install requirement if there are any. + """ + + def __init__(self, ireq: InstallRequirement) -> None: + assert ireq.link is None, "This is a link, not a specifier" + self._ireq = install_req_drop_extras(ireq) + self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) + + +class RequiresPythonRequirement(Requirement): + """A requirement representing Requires-Python metadata.""" + + def __init__(self, specifier: SpecifierSet, match: Candidate) -> None: + self.specifier = specifier + self._candidate = match + + def __str__(self) -> str: + return f"Python {self.specifier}" + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({str(self.specifier)!r})" + + @property + def project_name(self) -> NormalizedName: + return self._candidate.project_name + + @property + def name(self) -> str: + return self._candidate.name + + def format_for_error(self) -> str: + return str(self) + + def get_candidate_lookup(self) -> CandidateLookup: + if self.specifier.contains(self._candidate.version, prereleases=True): + return self._candidate, None + return None, None + + def is_satisfied_by(self, candidate: Candidate) -> bool: + assert candidate.name == self._candidate.name, "Not Python candidate" + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + return self.specifier.contains(candidate.version, prereleases=True) + + +class UnsatisfiableRequirement(Requirement): + """A requirement that cannot be satisfied.""" + + def __init__(self, name: NormalizedName) -> None: + self._name = name + + def __str__(self) -> str: + return f"{self._name} (unavailable)" + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({str(self._name)!r})" + + @property + def project_name(self) -> NormalizedName: + return self._name + + @property + def name(self) -> str: + return self._name + + def format_for_error(self) -> str: + return str(self) + + def get_candidate_lookup(self) -> CandidateLookup: + return None, None + + def is_satisfied_by(self, candidate: Candidate) -> bool: + return False diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py new file mode 100644 index 0000000..c12beef --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py @@ -0,0 +1,317 @@ +import contextlib +import functools +import logging +import os +from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible +from pip._vendor.resolvelib import Resolver as RLResolver +from pip._vendor.resolvelib.structs import DirectedGraph + +from pip._internal.cache import WheelCache +from pip._internal.index.package_finder import PackageFinder +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import install_req_extend_extras +from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_set import RequirementSet +from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider +from pip._internal.resolution.resolvelib.provider import PipProvider +from pip._internal.resolution.resolvelib.reporter import ( + PipDebuggingReporter, + PipReporter, +) +from pip._internal.utils.packaging import get_requirement + +from .base import Candidate, Requirement +from .factory import Factory + +if TYPE_CHECKING: + from pip._vendor.resolvelib.resolvers import Result as RLResult + + Result = RLResult[Requirement, Candidate, str] + + +logger = logging.getLogger(__name__) + + +class Resolver(BaseResolver): + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer: RequirementPreparer, + finder: PackageFinder, + wheel_cache: Optional[WheelCache], + make_install_req: InstallRequirementProvider, + use_user_site: bool, + ignore_dependencies: bool, + ignore_installed: bool, + ignore_requires_python: bool, + force_reinstall: bool, + upgrade_strategy: str, + py_version_info: Optional[Tuple[int, ...]] = None, + ): + super().__init__() + assert upgrade_strategy in self._allowed_strategies + + self.factory = Factory( + finder=finder, + preparer=preparer, + make_install_req=make_install_req, + wheel_cache=wheel_cache, + use_user_site=use_user_site, + force_reinstall=force_reinstall, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + py_version_info=py_version_info, + ) + self.ignore_dependencies = ignore_dependencies + self.upgrade_strategy = upgrade_strategy + self._result: Optional[Result] = None + + def resolve( + self, root_reqs: List[InstallRequirement], check_supported_wheels: bool + ) -> RequirementSet: + collected = self.factory.collect_root_requirements(root_reqs) + provider = PipProvider( + factory=self.factory, + constraints=collected.constraints, + ignore_dependencies=self.ignore_dependencies, + upgrade_strategy=self.upgrade_strategy, + user_requested=collected.user_requested, + ) + if "PIP_RESOLVER_DEBUG" in os.environ: + reporter: BaseReporter = PipDebuggingReporter() + else: + reporter = PipReporter() + resolver: RLResolver[Requirement, Candidate, str] = RLResolver( + provider, + reporter, + ) + + try: + limit_how_complex_resolution_can_be = 200000 + result = self._result = resolver.resolve( + collected.requirements, max_rounds=limit_how_complex_resolution_can_be + ) + + except ResolutionImpossible as e: + error = self.factory.get_installation_error( + cast("ResolutionImpossible[Requirement, Candidate]", e), + collected.constraints, + ) + raise error from e + + req_set = RequirementSet(check_supported_wheels=check_supported_wheels) + # process candidates with extras last to ensure their base equivalent is + # already in the req_set if appropriate. + # Python's sort is stable so using a binary key function keeps relative order + # within both subsets. + for candidate in sorted( + result.mapping.values(), key=lambda c: c.name != c.project_name + ): + ireq = candidate.get_install_requirement() + if ireq is None: + if candidate.name != candidate.project_name: + # extend existing req's extras + with contextlib.suppress(KeyError): + req = req_set.get_requirement(candidate.project_name) + req_set.add_named_requirement( + install_req_extend_extras( + req, get_requirement(candidate.name).extras + ) + ) + continue + + # Check if there is already an installation under the same name, + # and set a flag for later stages to uninstall it, if needed. + installed_dist = self.factory.get_dist_to_uninstall(candidate) + if installed_dist is None: + # There is no existing installation -- nothing to uninstall. + ireq.should_reinstall = False + elif self.factory.force_reinstall: + # The --force-reinstall flag is set -- reinstall. + ireq.should_reinstall = True + elif installed_dist.version != candidate.version: + # The installation is different in version -- reinstall. + ireq.should_reinstall = True + elif candidate.is_editable or installed_dist.editable: + # The incoming distribution is editable, or different in + # editable-ness to installation -- reinstall. + ireq.should_reinstall = True + elif candidate.source_link and candidate.source_link.is_file: + # The incoming distribution is under file:// + if candidate.source_link.is_wheel: + # is a local wheel -- do nothing. + logger.info( + "%s is already installed with the same version as the " + "provided wheel. Use --force-reinstall to force an " + "installation of the wheel.", + ireq.name, + ) + continue + + # is a local sdist or path -- reinstall + ireq.should_reinstall = True + else: + continue + + link = candidate.source_link + if link and link.is_yanked: + # The reason can contain non-ASCII characters, Unicode + # is required for Python 2. + msg = ( + "The candidate selected for download or install is a " + "yanked version: {name!r} candidate (version {version} " + "at {link})\nReason for being yanked: {reason}" + ).format( + name=candidate.name, + version=candidate.version, + link=link, + reason=link.yanked_reason or "", + ) + logger.warning(msg) + + req_set.add_named_requirement(ireq) + + reqs = req_set.all_requirements + self.factory.preparer.prepare_linked_requirements_more(reqs) + for req in reqs: + req.prepared = True + req.needs_more_preparation = False + return req_set + + def get_installation_order( + self, req_set: RequirementSet + ) -> List[InstallRequirement]: + """Get order for installation of requirements in RequirementSet. + + The returned list contains a requirement before another that depends on + it. This helps ensure that the environment is kept consistent as they + get installed one-by-one. + + The current implementation creates a topological ordering of the + dependency graph, giving more weight to packages with less + or no dependencies, while breaking any cycles in the graph at + arbitrary points. We make no guarantees about where the cycle + would be broken, other than it *would* be broken. + """ + assert self._result is not None, "must call resolve() first" + + if not req_set.requirements: + # Nothing is left to install, so we do not need an order. + return [] + + graph = self._result.graph + weights = get_topological_weights(graph, set(req_set.requirements.keys())) + + sorted_items = sorted( + req_set.requirements.items(), + key=functools.partial(_req_set_item_sorter, weights=weights), + reverse=True, + ) + return [ireq for _, ireq in sorted_items] + + +def get_topological_weights( + graph: "DirectedGraph[Optional[str]]", requirement_keys: Set[str] +) -> Dict[Optional[str], int]: + """Assign weights to each node based on how "deep" they are. + + This implementation may change at any point in the future without prior + notice. + + We first simplify the dependency graph by pruning any leaves and giving them + the highest weight: a package without any dependencies should be installed + first. This is done again and again in the same way, giving ever less weight + to the newly found leaves. The loop stops when no leaves are left: all + remaining packages have at least one dependency left in the graph. + + Then we continue with the remaining graph, by taking the length for the + longest path to any node from root, ignoring any paths that contain a single + node twice (i.e. cycles). This is done through a depth-first search through + the graph, while keeping track of the path to the node. + + Cycles in the graph result would result in node being revisited while also + being on its own path. In this case, take no action. This helps ensure we + don't get stuck in a cycle. + + When assigning weight, the longer path (i.e. larger length) is preferred. + + We are only interested in the weights of packages that are in the + requirement_keys. + """ + path: Set[Optional[str]] = set() + weights: Dict[Optional[str], int] = {} + + def visit(node: Optional[str]) -> None: + if node in path: + # We hit a cycle, so we'll break it here. + return + + # Time to visit the children! + path.add(node) + for child in graph.iter_children(node): + visit(child) + path.remove(node) + + if node not in requirement_keys: + return + + last_known_parent_count = weights.get(node, 0) + weights[node] = max(last_known_parent_count, len(path)) + + # Simplify the graph, pruning leaves that have no dependencies. + # This is needed for large graphs (say over 200 packages) because the + # `visit` function is exponentially slower then, taking minutes. + # See https://github.com/pypa/pip/issues/10557 + # We will loop until we explicitly break the loop. + while True: + leaves = set() + for key in graph: + if key is None: + continue + for _child in graph.iter_children(key): + # This means we have at least one child + break + else: + # No child. + leaves.add(key) + if not leaves: + # We are done simplifying. + break + # Calculate the weight for the leaves. + weight = len(graph) - 1 + for leaf in leaves: + if leaf not in requirement_keys: + continue + weights[leaf] = weight + # Remove the leaves from the graph, making it simpler. + for leaf in leaves: + graph.remove(leaf) + + # Visit the remaining graph. + # `None` is guaranteed to be the root node by resolvelib. + visit(None) + + # Sanity check: all requirement keys should be in the weights, + # and no other keys should be in the weights. + difference = set(weights.keys()).difference(requirement_keys) + assert not difference, difference + + return weights + + +def _req_set_item_sorter( + item: Tuple[str, InstallRequirement], + weights: Dict[Optional[str], int], +) -> Tuple[int, str]: + """Key function used to sort install requirements for installation. + + Based on the "weight" mapping calculated in ``get_installation_order()``. + The canonical package name is returned as the second member as a tie- + breaker to ensure the result is predictable, which is useful in tests. + """ + name = canonicalize_name(item[0]) + return weights[name], name diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py b/myenv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py new file mode 100644 index 0000000..0f64ae0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py @@ -0,0 +1,248 @@ +import datetime +import functools +import hashlib +import json +import logging +import optparse +import os.path +import sys +from dataclasses import dataclass +from typing import Any, Callable, Dict, Optional + +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.rich.console import Group +from pip._vendor.rich.markup import escape +from pip._vendor.rich.text import Text + +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import get_default_environment +from pip._internal.metadata.base import DistributionVersion +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.network.session import PipSession +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.entrypoints import ( + get_best_invocation_for_this_pip, + get_best_invocation_for_this_python, +) +from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace +from pip._internal.utils.misc import ensure_dir + +_WEEK = datetime.timedelta(days=7) + +logger = logging.getLogger(__name__) + + +def _get_statefile_name(key: str) -> str: + key_bytes = key.encode() + name = hashlib.sha224(key_bytes).hexdigest() + return name + + +def _convert_date(isodate: str) -> datetime.datetime: + """Convert an ISO format string to a date. + + Handles the format 2020-01-22T14:24:01Z (trailing Z) + which is not supported by older versions of fromisoformat. + """ + return datetime.datetime.fromisoformat(isodate.replace("Z", "+00:00")) + + +class SelfCheckState: + def __init__(self, cache_dir: str) -> None: + self._state: Dict[str, Any] = {} + self._statefile_path = None + + # Try to load the existing state + if cache_dir: + self._statefile_path = os.path.join( + cache_dir, "selfcheck", _get_statefile_name(self.key) + ) + try: + with open(self._statefile_path, encoding="utf-8") as statefile: + self._state = json.load(statefile) + except (OSError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + @property + def key(self) -> str: + return sys.prefix + + def get(self, current_time: datetime.datetime) -> Optional[str]: + """Check if we have a not-outdated version loaded already.""" + if not self._state: + return None + + if "last_check" not in self._state: + return None + + if "pypi_version" not in self._state: + return None + + # Determine if we need to refresh the state + last_check = _convert_date(self._state["last_check"]) + time_since_last_check = current_time - last_check + if time_since_last_check > _WEEK: + return None + + return self._state["pypi_version"] + + def set(self, pypi_version: str, current_time: datetime.datetime) -> None: + # If we do not have a path to cache in, don't bother saving. + if not self._statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self._statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self._statefile_path)) + + state = { + # Include the key so it's easy to tell which pip wrote the + # file. + "key": self.key, + "last_check": current_time.isoformat(), + "pypi_version": pypi_version, + } + + text = json.dumps(state, sort_keys=True, separators=(",", ":")) + + with adjacent_tmp_file(self._statefile_path) as f: + f.write(text.encode()) + + try: + # Since we have a prefix-specific state file, we can just + # overwrite whatever is there, no need to check. + replace(f.name, self._statefile_path) + except OSError: + # Best effort. + pass + + +@dataclass +class UpgradePrompt: + old: str + new: str + + def __rich__(self) -> Group: + if WINDOWS: + pip_cmd = f"{get_best_invocation_for_this_python()} -m pip" + else: + pip_cmd = get_best_invocation_for_this_pip() + + notice = "[bold][[reset][blue]notice[reset][bold]][reset]" + return Group( + Text(), + Text.from_markup( + f"{notice} A new release of pip is available: " + f"[red]{self.old}[reset] -> [green]{self.new}[reset]" + ), + Text.from_markup( + f"{notice} To update, run: " + f"[green]{escape(pip_cmd)} install --upgrade pip" + ), + ) + + +def was_installed_by_pip(pkg: str) -> bool: + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + dist = get_default_environment().get_distribution(pkg) + return dist is not None and "pip" == dist.installer + + +def _get_current_remote_pip_version( + session: PipSession, options: optparse.Values +) -> Optional[str]: + # Lets use PackageFinder to see what the latest pip version is + link_collector = LinkCollector.create( + session, + options=options, + suppress_no_index=True, + ) + + # Pass allow_yanked=False so we don't suggest upgrading to a + # yanked version. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=False, # Explicitly set to False + ) + + finder = PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + best_candidate = finder.find_best_candidate("pip").best_candidate + if best_candidate is None: + return None + + return str(best_candidate.version) + + +def _self_version_check_logic( + *, + state: SelfCheckState, + current_time: datetime.datetime, + local_version: DistributionVersion, + get_remote_version: Callable[[], Optional[str]], +) -> Optional[UpgradePrompt]: + remote_version_str = state.get(current_time) + if remote_version_str is None: + remote_version_str = get_remote_version() + if remote_version_str is None: + logger.debug("No remote pip version found") + return None + state.set(remote_version_str, current_time) + + remote_version = parse_version(remote_version_str) + logger.debug("Remote version of pip: %s", remote_version) + logger.debug("Local version of pip: %s", local_version) + + pip_installed_by_pip = was_installed_by_pip("pip") + logger.debug("Was pip installed by pip? %s", pip_installed_by_pip) + if not pip_installed_by_pip: + return None # Only suggest upgrade if pip is installed by pip. + + local_version_is_older = ( + local_version < remote_version + and local_version.base_version != remote_version.base_version + ) + if local_version_is_older: + return UpgradePrompt(old=str(local_version), new=remote_version_str) + + return None + + +def pip_self_version_check(session: PipSession, options: optparse.Values) -> None: + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_dist = get_default_environment().get_distribution("pip") + if not installed_dist: + return + + try: + upgrade_prompt = _self_version_check_logic( + state=SelfCheckState(cache_dir=options.cache_dir), + current_time=datetime.datetime.now(datetime.timezone.utc), + local_version=installed_dist.version, + get_remote_version=functools.partial( + _get_current_remote_pip_version, session, options + ), + ) + if upgrade_prompt is not None: + logger.warning("%s", upgrade_prompt, extra={"rich": True}) + except Exception: + logger.warning("There was an error checking the latest version of pip.") + logger.debug("See below for error", exc_info=True) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..921e2a07638c688430144dc72fb580f15a6084a1 GIT binary patch literal 210 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 BDo_9b literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0de876a46f63bdf30bfa035e49f8308bddbd820 GIT binary patch literal 2228 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b5701819c68d1e9d75c62f4604db32f0c072f27 GIT binary patch literal 4201 zcmai1UyKvS8J}IR*X#e>`R?E#M~43xIGX_Zhae3C0;s`6;nJj5qSc;v?Av3#yPa9z z;ln2#5mJK`DVLXUQd^0KKBOX*@|cG{AhoI@^~G19oVG~4sEO3P8IFgRr+%|*?->%c zV|jMw+i&KZ`F(%)FX?mwK|6HmXSMwqg#O7Vy_W3`)+7O;8|WRRqcYM3T{MNV;6KH( z2+xQasY_+49xX@fa#^m&%CWjqRs_x~nelp}obbm{Gg(iS(=e9H84;a9dh8m~6_ULb z2_%&_=%O}2Br>SSj{zwTKYg>FAizU%RdEz(dXmIQ)*q!vPEV5|Jwu{I_9UYO+2en3&;#>lXk1mry{W z*l-P#75h*tI8B-a(SEl91}qBQHMAlrluv!SH>}#!s2Q+>%BJkut`fXhoiGMcJOxxh zYBmMXtA+{ssuNEJ^%2YVBu?=pKJ#Qs+y=EOGVI)I3Jkc#uKgLh8>l5+-Q@P(p{oOK z4|LQ*Eukg0A}y&Ez17`8Ku!3$U5iJ+;Yz*5x5QvX_qeehZJJAars=}1u8euPB~NoS zo@p)AKzBUkHIO^g+(@G93g7Ucz9kF6#o6Lf&Lzku<(;-Jw1{vy?{Gm3%4`5CwD1=QJqlvF#m z@j()|lLsE8w%y$G`72+(_tng8_v?v!skb{3lp6mwo?AS7ckAK1@gt9AG&p*HVEgjG z_V$jS+!=WNBY8#1e3H4IS)9G6JpZjSwp6=$`O8gTy>$D?*F*P|l5a&%c@Z}-U*R9Y z;6@*u(_MuDIc$2LLUr+rNH4ev$PJBX0k0d(k11G-xPDmXo33-Jp`maS%1b3Lrjx4H zFx?3V39{xm#M1M!r}RROmtuZ=0(%B;3cSYGW3taDe0(X7^@02N8W=Gw=4z&?cDGUk zRna}bb^!kDCFmB=w^Hi9G`cK}F6Hm;I(qxaJ?ZRY1u0|g*v1SG#O|D%p^Tl6>HIXSy!e*_l2`{n;yT0TJkA$t2^(>oR77l zH0j2Be63jT&4+>;y7n{=;Lo&H%ngHsp7Jbka7mkD!{2QW!<7c5aQjdUpjiWTz~Mm(umdmQ2^ioH@4>|f zTlag@`ms;i^}1&1<2;vP?r8k*Tz6HQ*75i_TzI^@^7xhhE#^4~b~(OQEfm*qKv6$p zI{aR~1FuUy$Nd>wjrt^|081T1nK5JNa4|ykNe~mDQkoO5%+KxP>bf$IXARSY+6?xt z@bV1+o+MM+jA1t@t^mX}QkdI!(E#)F6?|p>K)?lzmW@pt7${~9$FV7#pfERf0y{Pw zf!BI{0Sll2X@$AdKern_vkE}x3U~(edEc7=XP+YkI6PQk?)6jaH|0hO4pX%oaAmOV zDc5z_(PFV?xKoYE0%!;7Do68cC|@D0cxC>HfGc4jgc!op$YJ=ey$RhrDgbpJyC zUOxU>7%pQ5*Gf6OfJE-jqt$SASl?$Ew=ZvW>;+5-pM z$_uNh+&8(+4gvGpPCOb*bT$S>hyqK!$c12Ywm>;4(ma^M)AjVK`CX{QA@+?nznx{Ok zdSiZ}Is?UyO$)(i1MnBR;W^M`1b8UVsgy%UU*YRw?*^YZeT7g~RW-}9-Qar+K5`;p zpk4&NK7z7{*E_xfo+*%?D93{DqSxpfz{0(R4ME?D2!ilP6a{HbK|=QLDEkle;yv`@ zcc}OsDy)v~ZKILLvLM8l&OAo&=qPCG_BI+`WOvZE&LB)yHgA2H9uO`FE9t?-mzPd1 z9$QZ1PJ~ldGeEgs??m|o^qd{+#QdRx(i=K)f0#hY+~P~iiOrp)KTq-b;p^iae@{@m zoLI~9H*0$p;XntY9eY-`JpU+tLJ-agtEp@!>W^Ue!OcrMJ{{}Cg1Le+Ba4;mA9Uiu jJb`jsmJWY9-bn`Y6iN*(p1gj%6YS&*dYtv&`D*_!s8UfY literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eef780aac976a83f1e451014b57aa2e5c6045cfc GIT binary patch literal 3578 zcma)8T}&g_6~5yc+vD*V+hF{|pWT2rG239XY!xZWHpzxWf+V1JH)-Tl8X3<8hPB7; zoq-gvBNRm~`_i!K1FWKIi4-ZRmIv~b*FIM23l3EFj#w#DD^-0nf+wDO?$~2{5i5FS z-*fK0=bU@)z2}^7{^9Wm2-=N%A1?esMCf01U^Q2hIsFotZ6qU^$)P-xW*Exba<)91 zX7gN{%iGiTyd&)}=h>Vy&!>5l=W?#RkQPkdo^$8Lv!JY{0FLz-dXmInq?ET!H_OFTw|9`223C7@Oi@H)!Gr0t3 zxZfn%MP&s~sq+QHHK`Ds)juFP!wIZ8=ln3MQ3mw5_Z0OWPEkBLpb{f9YcML?7Eqbh zsixULkF)qT)v0x}J#Owvrb;&1wq!kwwG8xf3rptXc8E13;h`_K=jeA`ltbuo)9W=4 zJ%_q=OmYp^wzbdgyz3s8Z{r?soH{Xjv>h&v66141F zC(&%v=riWZ(}XR(HYG!sdoHu!`z7);YTCY*SQ3Ir;AHz!f7_Ix=$EE8*`Mocfju&5Mc1pjUsqCSsRJ*MeIQ5VM6*w`DfHGaK(eZBm~dU?&G zEzdPFqd-<~oioGd%(X<9!LMX;ik#80At;)nYI;V^VuMp4&xjM8FdV?-GdiIGX|Ob@ zT-icCujrB@6B_#lx0ulu4M(O}#Hvha=o@0^W(K!ZP}BrR+^|Gw@EGn6hYi;}$t+OU zHI3SfK|5bh=2bnJO@5$Zq9xzKI#y$oM3I%`B-ZZfg<`Tu3QJgjQ`MBY98Ts}vAUAX zDRarq<^bwo8Syh;v2QYpl3x z#5<-lnpDKan>SNZbCTeBOfXy$83Jc%LTgYm(FXd7>#B003Ku%!BDL<|PVa-CZ@gRc zb#F`^JN;Xu+sOyXZ(ccaUa#>zTWi(OOO?<|H8J?b?ETrQ7_ErW-M(*!z8>1|`yu*$ zv^qXr8J|97ZDHXA*<8YX_n89;fvxH7*$1=Ve0<~@H?3@c`ry+FAK!G>+`V7Ce*g8V zJNlzLS`&M#;y^_l*hxQ<9!k~0@yg)%KgApW_C|I_A0;0q_g*>jP8{$P2i}PbW}N=2 zbLdCsP>uIj`EZ2~??k_QwR-(_1%8p+NBmn)oIa|e?c90v(Zi2+mBYbQC6uc0De6P; zfD4|&g&;%F3d78Xe>uRg&-Ug{{q_@^OGuX-j-A--MCNq0BYj%&dav1W0o4HF- z1j~w^fiOte2(2lk2f74Hs6L@DWCmq|Au-@Jx@U|GLT`jR9vZ@2vh0vyDg%El3f%@e zb_b5d(2j5@4j+30JMxid_{`3VjyhuP4nk#S3@!(dWCUq1DH;Tt^vNQ|IVqdTF5+yn z^nxTpJpAeSbkc$zI(wm!KeeyqGKhg<(*l{cs&z?aw!}6|9Qz#5xddP=?caiTWv*;5 zJ4!a}99gTVh&v0Y)yi5@XpYJ9V$MTHn5-EEMcF4Xr~WKD9{<*w7OzV$FfB53Y7JN3hS-RAoTF( z%q>U=dWi|2;eddJPp3wW4=!L`nuDqd)m)-kp+NxCuc#&s&~?B8YFo;HOlDbMGy-(y z69sDTvMyN#-4Lm) z8KKrGsV5AyMRf4Jgzz_Z3_a6ptZMvU$`wsZN&GlM5RgJ%0iN9SFeN{1D z5#vzGuL%|Yg-!Or6W#Tn@JM{&L_~pW2V(r7CteGW-k&-VP+;gl9Nc=f79OsKQo+UC@;H(c}e9Q(tyK(rbdsRTx9eZ#fkUz|C)?ykCk`i82JiArSR%**?PI^tbI zy&DN#Ro7s}HF)HTn)-pNFH!L&z{;N^wa8#o!^u$%4m3pM3v6<=KzMuR!OW)Xi91jW zMz=oRWp+otO?;i$?LX*wd2{kvQvs#X+Byy>e`8>3k8sTTxO>7^7fYi+DZ}^{GZbdo^pGqc* zoAut{<_d+J`QCp;rvGMGob#`Nlgl~$OL7bLqUfRN(A8OnVVVM^82=@R0 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e153f305aaaef18cf1bd4465d79fb563690d14c GIT binary patch literal 3241 zcmbVO-ESMm5#Ku=KShalZCSFDSnJ5C&Di3_R*)dh2NJ|~;y_i4IB5+A&f&ycl1Cly z*xjXB3Ur`{JV-zQMSu|*NP?rZFlT$=W2{oKJlCHGd$MYk zc~G}RTd22v2fd(VqbFgC+bzqt>nu!gCY#(ZY3OplVT@z&-+C3gH6jONH60Xtnxi>- zhup>a(45!;^d0gkNT2H!{VK^D_97U_P-w3Q{td<@wdpK;o7S1M9b4M;hV3;Ol>rPC zU{6!HCyMT!rE_g+HyU0W!lF#bDx(4yi{_k=u599ds4Zw?zG87Ef+jC9aZ13XGE-Zm z<)&Z4Sp{WaHjwNBZ82K1eLs*C5`bdhyCvIm7y4`FSjol_SJEmNx2fZn%ZxK$QZJ~u zr9ws-`yHdUCj!s~^Rygrita&dmGks;%azrjDXAauIvQ8O&!e{jqTY}};0gNN3$#?V z{R(pi8*JHa{4z#B?1)I&_2B(70cz2x?yALy$s&NvDr~Z`OTjmdtkn zroz0;B=hM-?mDh{k%@U3G|UDMYD~W73wO?AX1xt?H9dC@T!Ov((}i>AO@#MU1bMUJ zHcZR)CF5`+Ovs-n%m~PZMmx+|(VI%2;J*M*@GlC`Et2mJll0I^VmWayH?e+by?Q@o zetqVzsh2l~4lOc@ z*9iWv5`%p78-oA~=?iZuK+Qzh+2 z8mSO~MIRu9+=bcL_=_E_hH%=`Zi|wCrh}coYc* z{rG;+x5wZE3jJ@Z@}_thQ8*y!0rgRJ6x=crF8c$NYjKtaK;yjS3aCG`fzSG6{|+b_ zRF-KfO3b&p8;A?)8|U)C@RGVvhv;^pRzm=2$=g`k%C7I=6ePpKyH_v0ZC$H zSx-5*6sU#g^F4chFx9K}Kh5%PBh!5&Z6RwPEv<)5;u&dK)x7ht4q?I1UtF!64=>j4nn)#n|>KP($w`0JhJoZ$_rY zAR(^6OGGtrXv_6HT5AePdlwp&@v_T70U3m}!<{OkvJA(g7$)Fi!F-1!^>9399BEw9 z93MmJ2zKMx;bjmQ5Kl!I#|#R73}pjl{y2(B@E7kb0*xS%MO21&S&ki+FR>2YBI%wa zuq;$n#5Y>?Fg=!`v@7#*W__ zK{A{`GMv~Z!~DTs5OUx!AB8SV$aVuN14q8&NE+c7)bhfhmKO&3>4g*n5gy+?MV0%) z_90Q3P{9wAmSuaMWkHFNyq5)41u%495Jk|cHatqbR1ch{$6n!i7(z}Kb?CY=P1F8H z((0G_J2~-h^3wnGn5K8LB>v=vaRROdL;7N}o6Ty8+odjn$GUT8`cLi_irwQG?ZBPM eE`i6_r~fkj=cz3eyT_jFso~L6e@8%6?))G4_9rO- literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59559c4137da0391a62666b2b9dc0f7b56283591 GIT binary patch literal 2173 zcma)7&2JM&6rcUf#&+U><2p$pY)C0_P_iT@2pURNaMBOaP!*^u1F|-rNwUsn*X)c7 zjvO_uD%Ghfk*J4QY7aT|Kt&H6`#B!#>}pQ1UdrZHbSd>}lTe`8I_eo~ExY@ex!! z&4AChDePR}7dukjNJ26Sqn-u6pDNjd4#B_$N_l|z>^p4_AHm>5S|zqp5g0;Y*hRfX z*!{hj>Md~b@N=e`i}S8{#lXasuIF>vk)0YLMzXih>=fFhIz0F;+U0HEbm+kVs+q5Y7 z@u=_8i{d)}Dfo^nirH}cG#@?O2T)`Ua?m|thacCg;+t0D06TKXkD5JbJQP39 zJr4JBfJ9r?2MmUvx9@We#5-4iyu5@m%c`!<7YM>CCJyZ-b-{M1h<2DtY&By$4$2U- zph83_P{|Tfk=1OwKtQEyRyWOgot{I@O*^BTXnYZooP!n+^@YCi2(`l~uA0U&QtceF zM&hb%sh=0fl5HjC_E?h!p40XN4%?nH-V+YHl8!TmF&hs#tl!)KCb~oLU4tySf{83w zhKMGFTnXn)gSf$&xyx6RpUi!f{$j?JG18sPk}EGdc0Pw)xtXHddr*$9fD70?OjQsq z=y{X)$;Tx}W}$_7d&O0JsVka>h1i&3YKvKNtRU*EJKBmxw2XEGBL{1#G0SSc&^|E^*piD%|bYXG!ypS#0|QwgO>^z7<>VEX=Uat!HTG_|8P7 z=fn#jN%4|M58C85hf3$mVl8;&x3}v#@_-*y%^HTI_u3W17zP^wxCwUM({6I5g4-(m0I} z2=&~b-k5%-bk~*PsxrJYQ&UDCE3f_1kc(OJ=yC?7=xk2wJ@6kJhc+{0yPh_ye z=ECJ2*6{rO>IWY!sb9Vc%&*H-2)28H+n(1zchb8yOFK* ZCu-ei)`JbXhm$u^15mOfykx|?*?&R5^JV}5 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5966d358065c934f692fa9c71f3d2d72851f29b4 GIT binary patch literal 4008 zcmb7HUu+Y}8J}IR|HS#@IDed63S~%u$Xr;r{HYEOkRYK65d_q5N9zh%8}B$?v))wQTORsS1v1XaCWP(4Y8=UqX$}%Uc3MOGrhkprf?c3TeT8 z7t^BK2GRj&MO`We)4^gW9TNDwfF3SJ(h;{W=`F=*Itu-u8YF>2!r!LZ7W$igzxN6H zRQ&(utD*lOeZZI5Y(cs-8%TGMC_Su()kt1U$3#R>0XOIPJ<>s9k3{cn4BbXqaTcB{ z-3ZMiHC!0-=QZ0ZdIXx|Wl_Ai?ty++ zPE^}IlG446emnFN6(K7Mu7o+1jQxcRol1(1bWUTo6S-j7nrSF{QgEcAq8ZSJFQ1(n zyKs5h30Ru-N{}6NU6RQ);z$aeWlo3^yF`s_10a`&0*&Y8htOFb^gowtSH z);F)O3jTowWQYClO*KrTq^P`rEk}uAQ$@#fRIw~Van7Vz(RFO+Lxu&osd2-$)f&l1~%S2W9j-8=Rrlk0?( zHN_^diN>%6ruFu>s9Dxj5QB>(n^z2t6W61>}itjo>+g4RfxcOV2Vn@3((4S=AWcCDc(TryNb^@@v;dypLECMlbm+As$-XLPWA#Vp}0K=%&Pa2~*G=kf4? zBF8lh-Tb2|kXKBXoDt=|B ziiVxaras`FmHH;JiGjzcrfR7%!miq;l>)mKh<(an8o)~xE5sg$Keb^wSYGIQ84oHp`bz$`Wktuoe=TsWyiwGED)~D; zYVd3U!o{0qi{zd+zoE?#GB0kKx1Bz=!Cc+sh!rYnW^DGyb~hVAf_@W!jvM2)`>F&f-?MMzyoD7tMFKtfv}w6fhXfJM>6bm z0)B;7G9GW4wBockMj9BS97M)aC`gY%x{*;R0g)MgWGBK04A|1?%$dNh8FF4BQ{69XPSlb8_MQMg(>BEcGq+t;ToP$AWwqp$sJ_z3rKWMw(_VCJ+i4}aN*0%GHo!Cb>@85!f-mdj1>c>Bht@nZSjU6aSd=B__lT`|S>JRJuQsDmjMrmetz^L%|!7GI}zt?P=Of)Z6MLPJF zy<*Lkey=Jv`J0MWVH#E81}BB<$N%SBy7hW`8J?VscvmdibUVs}8|8mRoX8AZHtw&K z(*zyl)gGvl0Vew)G*>_XAmk;ymEdMkO)dKo+wEebxQ(hQdi^Xrx-JDyE z?W)IiEeBR&dln`(La6_%OV!2d^2AEt0r1u@!hJtI{n_}v@zot8^&KPNt54XkcZ@!b z_1%cAhfrH=VbV2sQkY8iIW0UYB{| zFt~Y!Gw}LHHxb}@6WnQ!p4uAe76{0hPOzvHOvqG<8W0o3Tzq#1QdV=0@T(1p2~W)! z5EC`kQr4zC&_I@BQzrn~hMP&aH`Y}a{AUTeyy50KUvqE#tH|*pEY-Jvy)&#q}tzwd}4*gWC-+ z$CnSS4jrlwL4CA7bhI`I`O5q2VX0TFq4<|kB(*;M%FesxyCXHJ4}>R%?|f&qcVE4C zUv2ok+OhL1y;FY=2Hpw%p)I~1KrOAe!#BfsfO_s2sod9yC}3nv~zADZ=Vvj|$Si0OwrJaR2}S literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0e545298d53434a2ada686d566fb50216612c0a GIT binary patch literal 7473 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 bCze~f*D#;0W|)q&6~#LitxqvB_V~X657A#h literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e87e63e82425e701a37dbd3cf25f62e24c6bbe38 GIT binary patch literal 1179 zcmZ8f&2JM&6rb5I+Z()2Tm^x+ED47$61!?ZNQf_`;D|^lMTrB^UY50YoDA77&5Q$H zLF+>gt$J~LAxDlyT=+AP=m86)T6?P0_Q1^|^unn#8v`LD?eD#L@Ar0o^WMCyR&~JF z!uIXWKO_MD7MqVtnK*mTx$_vTg8;Z7fPoakNOC18d^waO#Z|bkxN4xf8j?^c&^pp_ zUW3X(=@Pd=*{vLkSBkif)Q;rphjLRz?ua{eC|(tDq$4d8cB;UNK=(*s@KbB3+EIe( z9~IZ=%~!rxVaVH^>&u|jk`deNBESRg!ZWE$|3yWp-|S>n?bWjb>wIZTY*EHA~G(1?52|82cDzlOT60MK;VLKd)}M2P!!| z!)b1~%eM|hEqPM9S^RGweUcl^#nl6}T#5Y%x-+`ZYY;eY331Cwdu%I- z&)VNCIFyg}OzO9{{Y^xj6sL}dV}?lVhfbH_kUB!BcqY_NdwC60Z*l`qB*+Zca+H7c zYYu(zk6s^~`^Da!8R{qg)K3oeldtvp{`yZ6LWUh-+TQO{?aqxx219@2FqR>N?<5G7|1JHX+=LZ`<|F8!%D2)wp>h$kdU(H?o xl74YCclpc6<Q zlZi}}O|UjEAaU|I;l$F0sF^d9LxfFo+etdqo*+DBG4pbPB#UKYT}i@G zlTMkB+t$Iv{sT#7ax&-`*-2xJu%u%;$&6`nLgC_)C2kg2(mP4QDZ8yj%YT47hdB4Ve)2SS2|;Ie-wwWhsof zi1cJaq+BIA`F^v0)2M=GAfkdM!mAd+(68YqkZl@IOBHDZZAaXLv{=o>Cwaox`Bq-u zfvAkpB~+HC&{g>on!nH%ykqA;gma(7*d z1K=)~I2oqYrf%r$NW+L+Gzz7LQj(-mSL}-#T2~^>(fINLAgq5bdo-w=Z<{Jd5vq z9N+UGzNZ!+{5oM*OB#J(<0uY#LN={mV1rDPMUJE(^0yMD# z06!9;ij-Langk;sI@2=m@K;r2-s#)-n*e6(EAm8_@BQ!n3Pk0K?7?mY@~;C7K&kq% zug?Pf-Z^d*3YX#M{eSq&dNh)tB6ZqT43;%bJ>mu%em8ou=-8AuKomGObmk2F`T(9W z!dn1D;}Gwv*-Uoapc%&vQNqN|Zo~wtW8AQ^1ONw1WNQ!%)LiNGJz5z9Z>OonFJyqlNPPD1-cJx+sZm70VuLk0E zNl{`8efu8w4L|4`uBuz=>(GwfKOVhvv>Mp>D4;#ru&cIVVCMAmX#B?H-Gh&!{R`c1 zKJFfP&^>Ukr`Emydh}VeyBg?zxipB{dR`!`#GU|1WqALy6hm#BUm(c*cMx^P>LIX} z*)}-P7lBkCnr%xZ(0pGwwMU-cjfGBxQ-|gGLl|@mipAx7DBc0aTCJx^Vu0-m^hRhn z^0n{I1J!U_%K_KZq6xi)kCWE!6N!jR^Ba?)anbt(A2k{b(*}S8_WHd_*QUnJ>^N+g zH%bLA_9jJ#m;Ke=W~QZO4c5q2ujc$fytW0|;Ki|wBIa3K_{hPEtp^gQeAncZ6L=&!2%UMJBbbOWrV z;-7PafH&x>R9qw#h@s*(y#q8@%)^aHLPaC+Ht;xZSv^v;bEN`#mx|Ue&c-f)f+A!5 z6osFn$nR)dJt*PRcy@e_-6}33Vb>$;ao61VJ$45iVAcnEanIbx_p*0BT|{8kKf@6` UaAW7JJUcS0ew$oEF!a*?3tenTmH+?% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4a4d7abdb84c089ef6f0597e60adff41597167c GIT binary patch literal 7569 zcmbVRYfxP0dH&9AZ?L<-az|K4fF-REyF$p9po=975J(Y@CD|QsB(IM49AIH@{?0)N zx=d7$ra_53MxHi8QCgwaGe+ZNLViU*o&M@f|F9-5a!*mT98da_&G*kR$T!;K?86%!f zDT$z9Rt_rq*x9(ARE*e|Sz+h&cxu$F9!lwkl1M1nxS!HA4RU4$)f6=v8=Fi`=#Z77 z*aH%-;q*Dpn4~Gwp^qsCUwAPnP(Lh>WqV#e#Nrpa55}wwSfSI-Z2UJQ?huVcIF&?r zm5T^!vnpt!CTR}MsX3aUeuT#m|5Z`tM?_V+Aw^tji|V`~M%e;Nk+5qVW)uA=Ayr?!pzR6x~6QrA``QQ%Ifd{GS zGs+2hiYl3mMrC76G2| z4%g<9;hRXMr&3*`>9i_eRT7h$?qS8lro$SF&k^_&_oCkWg8<9+#zu?%V)X2 z+MVUbIaXg56i&L2TmnhD2; z7u}mtsFJj|*(;xrRe-RZ9+8#AXqv{2v80?*lA11O((#l5IF*gGoB&wsR-;6EN>huY z;fQ0}H5g=6gC@oDVSv6AH?*V6BeZ(gWx*Jdq|*e&beMuy;9M--r9cu;@yk)-hM)O@BZ8Fd13y-?{_}G zsNT!YI~RlxD)SPQ=N+U;o)h2mZomk{l+u7ES_TXhRt5~ajfMOdB_a|XgqPC zO<+tAOA69JOy6+Y7)pZBCN;QDmEuIS0fL}|He-4hwh~g>6y1R-hb5&ZcU8xuVF;7y zb6Dk!MnTfy)_uiWXZcR3)IWgWI{Dn+wDA0g^}qD*{XDR1rE=F}7pbaS4>Zi3`ISGg z9%!8VCfu>VdQMnxk?$Y7du**GoNEcMwsb!sf_s3wd1mh9eEqt=W})ML*WIq1f6sbV z<9d7WUmN-tl%>~~JAU5vv#w8s+`+z2yZU~}ecI3u?S=0R=AGF4DNI&BAN&4auDF{2 z@I)Yu1Dsw7%lbua{j0p=7o8%6u_9ui0!4_S=}kzKqDkd$08Yk>h=OYS8!ss5LIK2^ z*eIkn?6jL?xpI;JG_W1(WZ z zsVtpoCa}%)ND#UV!FBR`e+^8qWc+mY;p|%YWG;MiHQfKpnt@gSz=~^tVk6T%2I?k? zgll?$N2AvGu_D1ko8nF4&~T(6>En>v`i+n zCXdFi0%;b#*s9)eAyxs zW2<&zxC#vnX5M3Ngzq2}Ol-qjs8hMDaF6_5vG2Rw6uBn6MW#T!X5KxChLp?{As(30cM#=Fcf{U6T=P1w&hokH{$) zQ)Xs&Nz<9Y8!2YCF$0KMI=%96u+ozHR@jE=#HE1+LE)f@>3I_^J7%4m?hDfyD@iM$ zjv`5zj>!xxM`L;i#96y$iLmL2Qe0NhY01pX*j5}(8#+btF(tMuQ^d(YxS$;MKigeF zo@$xh8MTkd_6cTMaG#nU+OBc{hR}Zl0hlO0QdKi2t~a&bZ@t^P*3_A6>RfH=dO}3^ z8E$SU&kNo&+~;ktAo&alhhj#Xav6 z!g<^0#r3M%I~BJp7WzM{YI`g|QC@&{c^BE)et-P#_`L-7Yq&W)H#DzU16^Ji|TH@%SG!zS_h8Q_piJt0j6I@)SWxeGrt91=2es zix4DA72)9Em5ivb7ee{za%q?YW&#P+}}`1!^k9jN+9)EoO?0b9N=- z6Pld9GOopp|CbbjQs{#fQnWxI&6L6^NSB_8SyPTsoOq^bTkvAlW$cav0dy-#RqdL8 zZ_dB>$1TejR)f8({=+M-!}h6V6l1LH)Ev-@-S8MB%5Iobi?{g#`dMUKC0Qh^7!Pj< z@K-0CQq+`p(3U;T8a+A+y(u38q$=VN11-yav->m zKXD*fg`3g4Aprb%tLHlw#8q!=o^bB&#aggB*8=-;fqhGdRs#pV6rk`+tO2=kcR$mS zso$&KD=bOf&a#s#;_D)`0DOI&&j|)K^EvrhbOvxUTRv2Yh0_89zX{HV1AC4KvhUeq zXeg;^B=Zt`gYlTGP;jzsW8=aApb2#meF=h~Xdw$NH%6M4%^^Y-dD1dEJV2mPVESl! zWTx6i*Je=y+UjVjfT{6(=SLSGT>M9L)7(39mAinTX4d_IHGg}~-@Z7sH1ioSQ$q_f z(+*&!syc?ZG7A?^fFW%^B+8JstwCKTmHW4x#}IoyfcJ&z(su+{I+8oW>PkADu+$Qw zpwtQl9~CRhd{nDI$ChYlp!FG;@4IvM_Ssc`+ls5r+Dxg{kLSoXa~Tq4oB4Wwb6d|4 z;Dn;M<(t?`K#VNoUZfpR%bYj*Jf_fND-Z}eYh?uDh(@({V3S2&W!WighMoV|BZJ#S zb+aga!C+k~!P+x1^OK5lN5jx~rp*?(sAcy@xADEc1MS$W z3G=W>7BL+pUpKc>3C{JZ_Vija@RYxH}5CzsN{qGOn9Q?eh{xPoaxBCzL z^z6g4Yx`fx?SEx;|B0s(6mAf)x@JRgczqj!tICrnF1Lq)tAK2TuZ3(h$yqAcg3n3l z+(o0NCmKzr)yV{=E2GhOCY6L;18)y%Iu?ymB_XB>6UIrlZ2v-Gu1?gG4(AB&O=~2EbULUOKiE$P zNIo()Fv^EG>A=FFMPczT7AtctU7!f11Izn1Fv>d|(vih$c>>XL-v&ncDqiYd)N$bM zB^Uvsyi1bm7Hbz{OFfHY51z{t$YN`V@;+W_UtsftAuCAXg@HVQXc2lsl=rwL&qDiC z0+Dq{cr-EiFMfE=_-&w%{#~GzvZr>}92wzM;YMXdglB1d2AAx|Y+iN1V>UjpJLkwX zF5&_*aGPFmWAGOOOS)!0ffwsEoluz7Hj<{y(*bvBQrA@U<5TjKwg8|L$I?^yRvb6*xfqo^td81_7e$FEqc=P+0nZCj{I?v?FvQk(lgpC#KnOP9H%CdF z`*G3KMQ;?$i(P%`)E<1d9^h3?!Sk?QX0gJX5j{Bv(}1%*;@SOkg=Iz`)uA|B}g z1f`nQa#w1%Y>VCU53nh`iy$%jnie{KG@EPgT5EnO*Zk6I^EXy~y(_L>wktR|yw%~L zo4yS(jbd;a0|f&{TS#T}3I<3n3e$B1+FIvrOd85Zk=`kFSKy^ycuq{CY{;PCQ3uzV%UH(-5(wX_#{nhs++1Bj#uGm8h=a*!u2W<|C&8{yZ0 zQ1RD*P!Z6&<@B+GL}znrL-w;l2qZ4XoS@C?WyfxM&tEwA+VCj`vHtTGpR(PJ;`A~G zNVLyfM=YIijG_Pl&k}tI0&sIV?%#;-H{|phIsG5x^&ENq*W|$OgsNYQtzWo^B*QNd k)lJvEPaq0k_kIaKc5J@&JlFZBDmZ?hL>M_krtK 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df80e8c5a93eb186f1b66921aa982e7ddd266d1f GIT binary patch literal 34136 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..018d6b64982e4431fa86e582520bf3df88287039 GIT binary patch literal 4565 zcmaJ_&2JRR74M$unQ705ZLs+UQ`iQ37Pn`CNJ+fFYPE)hESLzhB-#y#D= z)jc+L2FWC=$m9}p!nu)K5c@~u7%7(-Wu-X1hp4S&w%(h58mSMOC84=Bn%aL|5+qRyL}s-iqss6tg+S(0CMNriFDj#cAJ@v63@ zRTE1IRf#D~eVAdU&9a1VObGJ$!P%yg|Shhb~0=W-R%DT%}$+{J+5QnWZ zPCT=;YF5N%f$30_Q-8KsOW1DBqF@i0X)}`(#<|N$mHEC|VPt)UMK($c04m1?+Z;bY zglL~Ez``dF{0)EBf^Mhj5 zTxEQYfJp)%Qid2IQ$}e@*jjc$`|&yr2EI)2%#1+LK!B-)F0RC~Jc?%!fuWPdjr`r_j~DQY@D zF7fCqe0`E;M4%%KGh`ge#`98ZD39bUnf}EY{&*%2Yu`~E$M>;?xsG^*KOC&s?y_kY zT~U_(aL{p!P&zpv<&>>Tc%bGi*UDwa87;cCz^esel0(LDr=($Jj~=MtN*vxdzk%kt z5=7H*2*x_yPN$+i*6MMdtZP)QsGB)Ofw4woK}X`lREN0JsVlFdgS8TicvPOKYxTB- zn2;FnN?cU(n&|?Qh{qqXpwEGB6>1A5Pz7t41ip+ZQ7P8B>3J;jx2!Z+081twU9-|< zbDqh~sHk9MA)0eg+u(439#(k)G@LrvUxq3zh03}Tarc8iM?Rp`lE)*FOC<73A6LJN z=E#jQxyx%1AaK-R-uuL3+{Z%}PeD$kD{D{;h5DEf(fjjp}oki1=`5m4tCn zNMtc+<40`BW2xq5%&5Uz+RPb-;~J=g0rfSng>fhfVOrKQ)HEC}E?&F)@lWsGzI}7C zxcK86x56Y8=c*ax6Fdp7=NJfF$7TSUP=oD!AEOPeAm45js!mWS6+VVN{K9n>z)3jI zEov3!nZFviUO^ny!3U0S!G4A62GqTRZ7mnPjbO!fF3n!JSn#cY8S)HfegQ5Ig(B2r z#sR>BIJpbmG%kwj30@74;fYl2S;5dLqJI1!=yw5L|5IqTl(%C_ZuqwgPZt`Q6I=6t zOC8P9aY#@pgvR+j*x!W+fKxzKlut2+w4e@uE|Ny9l$v`ShhKVCeJXCqZXuaV3Paz8}yYi4xc2K=u)GejggZbyUfo-O~@faQ>vdjmNUdt@&0`Nepb?-<^L^ zXk;%owToNxi14kZb_{xm86N@OQg2o2)UJ17<^N(5tH&r{64f6VNgVhQU$I(3>6t5P}rZ~3>4?iOhV8kX{s}m1n~5Qd=x{N;$e!iHDMSlu_4$9M_^e2N8lr!adN*iB2}b2 zCV+eeUjH*_wv=xUDhI}Xf3BhB8=3q+Gm{X5dq>W~-`kWXqA-h5_{najk)3R6lUws& zr*fFe$9L~Fh9{f)B;;=@(?}h`$h1kD z(}n?kW7&ivE8<#{5KqE(vNj7$QH?I3r}hKd7AFy%0^(o8>tBKf0z3@?{^I^0uYQ@i zvo-%3Qg&(kW>Y(g(2XD_CwJ?O;hCmBv#oV8$;TJ2U(XM7{23nV0eckSAsZ%x4G(Vi z95Laj6~{Oalax_7=;8k22k?u858`AT`k}TAzb8ex;#guhW*38>=qvu-* zn1H%==vXU-JzY6^vW3L3MKZlT@#K>?8616YDB_1N@-IHS)k;7gSYhj&$Yl zvDN_gy6iZb)FXEIcG#g0?9nbM934Ipk--<0Iwkf=;Yddn2e6k`a))*npWbR^aFkUt zBRiL#8m%0T29?pHts(3Uw*?=-(dBF;7{0F$9^bw6%xEQ`A6bq)Jz{t}03+d({{YD3 B+0_65 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a1492de901256fc50955e8a3b83cce21e5a32b5 GIT binary patch literal 8733 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92ade7bcf3ae137612e844e0633aee5260e4ba1e GIT binary patch literal 12077 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 AIsgCw literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6204575ed56ae0e13ba03a84e3a5e01b448021c0 GIT binary patch literal 11123 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 JcW4@({{y^e!r=e_ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d05c8dddd11059909b85ba2179e83ab88c127e93 GIT binary patch literal 2420 zcmah~O-vg{6rSC+*FU@15b_H&*(iUwNw6Sl)1WF+0!>63ffDkgA|zzI6TD`<>&%Ry zP`h%g9-uwMtt!P)8zs3VN~PwQBllk7a)2(0O4as&da(qRDo%Z~_7b3KJF@5f%$qlF z-hA)v4-E}r1fy&G#@Np?Lcems8~!@8N`SeGbfgO=8mduYNN{CwNOGyqrK0K2$V0M# zbV>J_flP2H2)rMMbQ#Myv=98;^67!kd_!S9=xReChd@^9R$LB)tWF6rWrYXO9}}G5 zK$aP{l`vNX(10Rvv#-B*;O3ws<%sFX1hX8ml6=t{K42vHuU>@-f*0~=LLkBv%A@pV zySlwD=;BkcCg>6mG|hK!8&B)i| z>zR1QV)11BI>m&>FJOi(t(O?O5%0xxoY~oUme^^`&RNtLHE}#Mg{_IWX^h6RQ!Hg$ zr#d>j;?!XHWHyl;PmEz2&l=hIh+#2IAT9A6GfWzXT+oi}loJ`lYy^Z6noQvgCJhh- ze`b0drXpGlgiD7$`FJtfyr@L(oS8jS8Y~~2SK7)~D$0QcDE->x9!1weo}oeFC(dTeU~6Q(6Jo+ypkz}+%T+^t=| zdbvZ>uBC8oWzsNBZ4_&ngpReuD7DQT1IE&|RAK_VzHaAihV`0xHbEHeaMkO6*I_K= zh&Clr2+|2!Hp%bmJa_98y=>?^=qO^W{{=vn27at7V8+hD1 z-_|*=bQODFh8ypkm_4x&-d_ptFHe3ae;;`gS!nO6wD-*Q&bRl?hc6X-0C>eqgulQR zU~#Cp!1@Xv`|iJ%ss{n8Ttd2-N8gCLbYJp{^HYIsz%b1VblXV(C%lFshJsKK3lhvi zUL^j!sQbp-q0S}UUl6U9*AODIF6YH*@DKV3Q@n%p0FUXu=*77uBA(-IBh6oQ+sKP~ ziF@{Z6r@e(p2>^!G}{1cUh=H;;P@~^8p}(%+imr*8~H(y72ed?4)2)sPLF#{ClFD= zQq>z;kRAca&-dxk7F3Y(5wRX#9+PV;PLZ+Qem?;||i>Afl;pulQ+dAngU2`a`KB^@M*7y#Z z%VurD%f_}emNKZ8H52R>lt;I=!qMb5=yf6PcIy?6jTH_HD1Z=;QS6TQ#}p?_885g= zgQdtWzH2v3PLK!6`#Ry+biy|hW)8nch)u{|u25mU%PT8KGO^{zlo7)ka~cvfX&56W zX3(T*%;#2`BaAq*g&ADNEkDX5;VG@x9=PMB$32o0u*B<+{sB`FRf9;4-Z?vab}<-T zlSEanBGKO~EQh+EpL%|5uIWXfXVuR&pjYL!AbR7_gUk0WFSK=5+B%;dns0l%;@ej| zSDct(r7LCO7p19mqx{j2yWU)GYMzx}g&LQe_LPr)d0r@Kzo<5rnr1JS z=mz`s#KNBA75J&g-NjPpOkcURq8?t3HkZzo&d+=}<6Bmu#rNI55NjYDs{{(KmSyN{ z9d2WDU&o0+rnt)MZ8Dq6Le>d?a7Rwsyf@a~OoI1tKY?yDbF=ycxo5aJUk|>UvGtsZ z&yrKHmw#pGHJGZBAP7q+w1gU#Q1cSn^$NBAj#{g-B(#^MDgyE___+B|!zyR1YCwpV cl2rtxoLuFky7REmSQ@M%Amza|PTW)f29k;<%>V!Z literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c78a76ee2f44a1d1ce3aeec42a8ebc57d9a95659 GIT binary patch literal 4495 zcmbVPO>7g{9e*<(f9JyxlK?^NgM69T5R_BXpJW%C5&AcKaf?(HHs64-j1;5@8cI5?kQDg4m=t;I zNqTrIB_(J@&71cneR+S{&MA~koS~?Skr&l#@Aw^ zEnQWqWe2VoEY;9uZSI_^r?sL&j?)sgNd7ogEpogdr>EsCp+Bb|o`>h?(2c=6vQ{J) zEVD@FGqOfW%=VeYDw=wlt?U*b2p)JgC!tzKmiry$#F|(WEUzop$09!&`QUd2A1CYWtiWY=4$mvSpc{ zp-pzicQldLtwcKUF(oEVj1i0Ic*Il{H8Dcyv}F_$1=Gk8Ygni1q(&0?5^R{z)X7Al zWK9`*U;N~$#5RK@3Th#dQgw@%V7x@pQZ<^Wo)+fD3njZPWfpZ^)w8Lht`IYI2fmvv za2)nf4Amlf8$wO3_Xq9`{ITOv+r#`9<6kB}PnP#xTn}GdlP;P~Fld`uS-^0!9tHu- zT6J%PteROB;Yn5IX31|ii%De7H4A8-604CR8mS$pVXj3KJfm7uxKJv{z0|c2yK&Vj zTQ&eE_fN@`8Nv*}dCf4Z*quxO0%YSI3erecPM1=3EtilD3o6i76KZPvL*Iku za=2$r>Um#1?BZNKaS*nu=Lx*CGAq!KfUK(TBIJGtRS9z=6A)C)e`iRqNpRJASOuq0 z2$tQ;Zgs|Ec#Op$HmoUP&Zv~cV`Lj&n1&h{D-EfQK?+5xof?EQj$w z!(-38N6Ot}Ytq>JcdbP@0w?&s2+!3b9M-QEi><&*j#+0%sk_kv3L=Y{j+c4B-amU> z7dwL%gn1#y%(0$jPX$CpHG4I@OZW39c_*V>k92i)D=w(3{PiL|mgB+X$h_WbP48$&=36?3= z0Ew}YfmSEf!KIrVQYpS>=;Rpl3DtrrMNPrFVPSA`B_XHNgi;Ka#~D>4P5{h>>U++4 zi&p0NxtL%Fh@LhSfP!nWpe-8ImI|^pWlK3j)t%4?f?90JC=lJ2*y?tO0t8z8M7IC> z_^4?bCInQgvwRA!lw!NuLWVN0$JmLfJt=^`)RsYf1rx)NZg^-GDh@jx` zd(`)MU}a!+zT7^zc)cR}ywSHl)Ux|`iPg)`n@?Ae5R5$)Hrk@gXP3_Y{@jbUp7pk# za@)~wJkaqC>;0Nl|9unQ4T3lNRcl+t1MNG?g77cR!za<-4h|pjJnIaC`0R*xIPQP; zp@+$FUY`sOpZ7c)6rfJSj9QUE;=%k^5E=#Z0-8sQ?RDg9$KJAJ>gc!S<0*$s6;@N!XghFTVXP zZh0GL43p(X$oP0$f&th8IzWLNI1cINMp__gHKRhdw5DVW&rCroYdBv92xGoVi-m$g z0kwbJ2=Zg>^EMjC;cO2f(G-C!Fny<%vY`{4t%jw@m zWbk>+S&K7zSW#4m{%ECRSTi6@@r-P;q{(8=i7@u!1{q9-L|YBD-(IQ(WHlCh>xb^e z3ZVtyP>nALs$lENX-mCB;&_1S2p~SHUC}+_F(J%mU}G~QEcvd>yd(?N(e=wuOs`uMjr3pyV9#j-;2mc z>yeM1c9$bVcfA|o$a?s|!#$5XS2|aJT0V5SRQ=tsO}5+?Gn2>=%~pbM6b-uZeZ1@`jRvnf8IYyYuhvk0m~NTUI=r zsty9-VsJztaDBXl3Y&(_fzd{Cv4tx5PT1VPLF{(JrRFWkGZw*PE7+`lIEzaJGf!a4z) zHp+2ks1aGM|6p^e6pX7yfctG6!4FPx?nf?{k@2KqXhhbJ)eK(exR@~|huiB$!;BIi zi%AZ*Wr*SsT&A?0EH_#w@O8DDXJOte`aGQwa7f&W}}02kbd zc^9}*H|z1UpOrwF%pUe8FQVO5L*b_i2Fc`Cq+kps5@P!FS~?f`;q!f3ksF)Bpeg literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..685439f3adeb21737b0311b1a2c63befd8e7d7c0 GIT binary patch literal 5941 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 Kk4TN~$bSG0Q|oa6 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py new file mode 100644 index 0000000..e06947c --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py @@ -0,0 +1,109 @@ +"""Functions brought over from jaraco.text. + +These functions are not supposed to be used within `pip._internal`. These are +helper functions brought over from `jaraco.text` to enable vendoring newer +copies of `pkg_resources` without having to vendor `jaraco.text` and its entire +dependency cone; something that our vendoring setup is not currently capable of +handling. + +License reproduced from original source below: + +Copyright Jason R. Coombs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +import functools +import itertools + + +def _nonblank(str): + return str and not str.startswith("#") + + +@functools.singledispatch +def yield_lines(iterable): + r""" + Yield valid lines of a string or iterable. + + >>> list(yield_lines('')) + [] + >>> list(yield_lines(['foo', 'bar'])) + ['foo', 'bar'] + >>> list(yield_lines('foo\nbar')) + ['foo', 'bar'] + >>> list(yield_lines('\nfoo\n#bar\nbaz #comment')) + ['foo', 'baz #comment'] + >>> list(yield_lines(['foo\nbar', 'baz', 'bing\n\n\n'])) + ['foo', 'bar', 'baz', 'bing'] + """ + return itertools.chain.from_iterable(map(yield_lines, iterable)) + + +@yield_lines.register(str) +def _(text): + return filter(_nonblank, map(str.strip, text.splitlines())) + + +def drop_comment(line): + """ + Drop comments. + + >>> drop_comment('foo # bar') + 'foo' + + A hash without a space may be in a URL. + + >>> drop_comment('http://example.com/foo#bar') + 'http://example.com/foo#bar' + """ + return line.partition(" #")[0] + + +def join_continuation(lines): + r""" + Join lines continued by a trailing backslash. + + >>> list(join_continuation(['foo \\', 'bar', 'baz'])) + ['foobar', 'baz'] + >>> list(join_continuation(['foo \\', 'bar', 'baz'])) + ['foobar', 'baz'] + >>> list(join_continuation(['foo \\', 'bar \\', 'baz'])) + ['foobarbaz'] + + Not sure why, but... + The character preceeding the backslash is also elided. + + >>> list(join_continuation(['goo\\', 'dly'])) + ['godly'] + + A terrible idea, but... + If no line is available to continue, suppress the lines. + + >>> list(join_continuation(['foo', 'bar\\', 'baz\\'])) + ['foo'] + """ + lines = iter(lines) + for item in lines: + while item.endswith("\\"): + try: + item = item[:-2].strip() + next(lines) + except StopIteration: + return + yield item diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/_log.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/_log.py new file mode 100644 index 0000000..92c4c6a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/_log.py @@ -0,0 +1,38 @@ +"""Customize logging + +Defines custom logger class for the `logger.verbose(...)` method. + +init_logging() must be called before any other modules that call logging.getLogger. +""" + +import logging +from typing import Any, cast + +# custom log level for `--verbose` output +# between DEBUG and INFO +VERBOSE = 15 + + +class VerboseLogger(logging.Logger): + """Custom Logger, defining a verbose log-level + + VERBOSE is between INFO and DEBUG. + """ + + def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None: + return self.log(VERBOSE, msg, *args, **kwargs) + + +def getLogger(name: str) -> VerboseLogger: + """logging.getLogger, but ensures our VerboseLogger class is returned""" + return cast(VerboseLogger, logging.getLogger(name)) + + +def init_logging() -> None: + """Register our VerboseLogger and VERBOSE log level. + + Should be called before any calls to getLogger(), + i.e. in pip._internal.__init__ + """ + logging.setLoggerClass(VerboseLogger) + logging.addLevelName(VERBOSE, "VERBOSE") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..16933bf --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py @@ -0,0 +1,52 @@ +""" +This code wraps the vendored appdirs module to so the return values are +compatible for the current pip code base. + +The intention is to rewrite current usages gradually, keeping the tests pass, +and eventually drop this after all usages are changed. +""" + +import os +import sys +from typing import List + +from pip._vendor import platformdirs as _appdirs + + +def user_cache_dir(appname: str) -> str: + return _appdirs.user_cache_dir(appname, appauthor=False) + + +def _macos_user_config_dir(appname: str, roaming: bool = True) -> str: + # Use ~/Application Support/pip, if the directory exists. + path = _appdirs.user_data_dir(appname, appauthor=False, roaming=roaming) + if os.path.isdir(path): + return path + + # Use a Linux-like ~/.config/pip, by default. + linux_like_path = "~/.config/" + if appname: + linux_like_path = os.path.join(linux_like_path, appname) + + return os.path.expanduser(linux_like_path) + + +def user_config_dir(appname: str, roaming: bool = True) -> str: + if sys.platform == "darwin": + return _macos_user_config_dir(appname, roaming) + + return _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming) + + +# for the discussion regarding site_config_dir locations +# see +def site_config_dirs(appname: str) -> List[str]: + if sys.platform == "darwin": + return [_appdirs.site_data_dir(appname, appauthor=False, multipath=True)] + + dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True) + if sys.platform == "win32": + return [dirval] + + # Unix-y system. Look in /etc as well. + return dirval.split(os.pathsep) + ["/etc"] diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/compat.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/compat.py new file mode 100644 index 0000000..3f4d300 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/compat.py @@ -0,0 +1,63 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" + +import logging +import os +import sys + +__all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"] + + +logger = logging.getLogger(__name__) + + +def has_tls() -> bool: + try: + import _ssl # noqa: F401 # ignore unused + + return True + except ImportError: + pass + + from pip._vendor.urllib3.util import IS_PYOPENSSL + + return IS_PYOPENSSL + + +def get_path_uid(path: str) -> int: + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, "O_NOFOLLOW"): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError(f"{path} is a symlink; Will not return uid for symlinks") + return file_uid + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py new file mode 100644 index 0000000..b6ed9a7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py @@ -0,0 +1,165 @@ +"""Generate and work with PEP 425 Compatibility Tags. +""" + +import re +from typing import List, Optional, Tuple + +from pip._vendor.packaging.tags import ( + PythonVersion, + Tag, + compatible_tags, + cpython_tags, + generic_tags, + interpreter_name, + interpreter_version, + mac_platforms, +) + +_osx_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)") + + +def version_info_to_nodot(version_info: Tuple[int, ...]) -> str: + # Only use up to the first two numbers. + return "".join(map(str, version_info[:2])) + + +def _mac_platforms(arch: str) -> List[str]: + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + mac_version = (int(major), int(minor)) + arches = [ + # Since we have always only checked that the platform starts + # with "macosx", for backwards-compatibility we extract the + # actual prefix provided by the user in case they provided + # something like "macosxcustom_". It may be good to remove + # this as undocumented or deprecate it in the future. + "{}_{}".format(name, arch[len("macosx_") :]) + for arch in mac_platforms(mac_version, actual_arch) + ] + else: + # arch pattern didn't match (?!) + arches = [arch] + return arches + + +def _custom_manylinux_platforms(arch: str) -> List[str]: + arches = [arch] + arch_prefix, arch_sep, arch_suffix = arch.partition("_") + if arch_prefix == "manylinux2014": + # manylinux1/manylinux2010 wheels run on most manylinux2014 systems + # with the exception of wheels depending on ncurses. PEP 599 states + # manylinux1/manylinux2010 wheels should be considered + # manylinux2014 wheels: + # https://www.python.org/dev/peps/pep-0599/#backwards-compatibility-with-manylinux2010-wheels + if arch_suffix in {"i686", "x86_64"}: + arches.append("manylinux2010" + arch_sep + arch_suffix) + arches.append("manylinux1" + arch_sep + arch_suffix) + elif arch_prefix == "manylinux2010": + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches.append("manylinux1" + arch_sep + arch_suffix) + return arches + + +def _get_custom_platforms(arch: str) -> List[str]: + arch_prefix, arch_sep, arch_suffix = arch.partition("_") + if arch.startswith("macosx"): + arches = _mac_platforms(arch) + elif arch_prefix in ["manylinux2014", "manylinux2010"]: + arches = _custom_manylinux_platforms(arch) + else: + arches = [arch] + return arches + + +def _expand_allowed_platforms(platforms: Optional[List[str]]) -> Optional[List[str]]: + if not platforms: + return None + + seen = set() + result = [] + + for p in platforms: + if p in seen: + continue + additions = [c for c in _get_custom_platforms(p) if c not in seen] + seen.update(additions) + result.extend(additions) + + return result + + +def _get_python_version(version: str) -> PythonVersion: + if len(version) > 1: + return int(version[0]), int(version[1:]) + else: + return (int(version[0]),) + + +def _get_custom_interpreter( + implementation: Optional[str] = None, version: Optional[str] = None +) -> str: + if implementation is None: + implementation = interpreter_name() + if version is None: + version = interpreter_version() + return f"{implementation}{version}" + + +def get_supported( + version: Optional[str] = None, + platforms: Optional[List[str]] = None, + impl: Optional[str] = None, + abis: Optional[List[str]] = None, +) -> List[Tag]: + """Return a list of supported tags for each version specified in + `versions`. + + :param version: a string version, of the form "33" or "32", + or None. The version will be assumed to support our ABI. + :param platform: specify a list of platforms you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abis: specify a list of abis you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported: List[Tag] = [] + + python_version: Optional[PythonVersion] = None + if version is not None: + python_version = _get_python_version(version) + + interpreter = _get_custom_interpreter(impl, version) + + platforms = _expand_allowed_platforms(platforms) + + is_cpython = (impl or interpreter_name()) == "cp" + if is_cpython: + supported.extend( + cpython_tags( + python_version=python_version, + abis=abis, + platforms=platforms, + ) + ) + else: + supported.extend( + generic_tags( + interpreter=interpreter, + abis=abis, + platforms=platforms, + ) + ) + supported.extend( + compatible_tags( + python_version=python_version, + interpreter=interpreter, + platforms=platforms, + ) + ) + + return supported diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py new file mode 100644 index 0000000..8668b3b --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py @@ -0,0 +1,11 @@ +"""For when pip wants to check the date or time. +""" + +import datetime + + +def today_is_later_than(year: int, month: int, day: int) -> bool: + today = datetime.date.today() + given = datetime.date(year, month, day) + + return today > given diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..72bd6f2 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,120 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" + +import logging +import warnings +from typing import Any, Optional, TextIO, Type, Union + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version # NOTE: tests patch this name. + +DEPRECATION_MSG_PREFIX = "DEPRECATION: " + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning: Any = None + + +# Warnings <-> Logging Integration +def _showwarning( + message: Union[Warning, str], + category: Type[Warning], + filename: str, + lineno: int, + file: Optional[TextIO] = None, + line: Optional[str] = None, +) -> None: + if file is not None: + if _original_showwarning is not None: + _original_showwarning(message, category, filename, lineno, file, line) + elif issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + logger.warning(message) + else: + _original_showwarning(message, category, filename, lineno, file, line) + + +def install_warning_logger() -> None: + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated( + *, + reason: str, + replacement: Optional[str], + gone_in: Optional[str], + feature_flag: Optional[str] = None, + issue: Optional[int] = None, +) -> None: + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. Should be a complete sentence. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises an error if pip's current version is greater than or equal to + this. + feature_flag: + Command-line flag of the form --use-feature={feature_flag} for testing + upcoming functionality. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + """ + + # Determine whether or not the feature is already gone in this version. + is_gone = gone_in is not None and parse(current_version) >= parse(gone_in) + + message_parts = [ + (reason, f"{DEPRECATION_MSG_PREFIX}{{}}"), + ( + gone_in, + "pip {} will enforce this behaviour change." + if not is_gone + else "Since pip {}, this is no longer supported.", + ), + ( + replacement, + "A possible replacement is {}.", + ), + ( + feature_flag, + "You can use the flag --use-feature={} to test the upcoming behaviour." + if not is_gone + else None, + ), + ( + issue, + "Discussion can be found at https://github.com/pypa/pip/issues/{}", + ), + ] + + message = " ".join( + format_str.format(value) + for value, format_str in message_parts + if format_str is not None and value is not None + ) + + # Raise as an error if this behaviour is deprecated. + if is_gone: + raise PipDeprecationWarning(message) + + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py new file mode 100644 index 0000000..0e8e5e1 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py @@ -0,0 +1,87 @@ +from typing import Optional + +from pip._internal.models.direct_url import ArchiveInfo, DirectUrl, DirInfo, VcsInfo +from pip._internal.models.link import Link +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import vcs + + +def direct_url_as_pep440_direct_reference(direct_url: DirectUrl, name: str) -> str: + """Convert a DirectUrl to a pip requirement string.""" + direct_url.validate() # if invalid, this is a pip bug + requirement = name + " @ " + fragments = [] + if isinstance(direct_url.info, VcsInfo): + requirement += "{}+{}@{}".format( + direct_url.info.vcs, direct_url.url, direct_url.info.commit_id + ) + elif isinstance(direct_url.info, ArchiveInfo): + requirement += direct_url.url + if direct_url.info.hash: + fragments.append(direct_url.info.hash) + else: + assert isinstance(direct_url.info, DirInfo) + requirement += direct_url.url + if direct_url.subdirectory: + fragments.append("subdirectory=" + direct_url.subdirectory) + if fragments: + requirement += "#" + "&".join(fragments) + return requirement + + +def direct_url_for_editable(source_dir: str) -> DirectUrl: + return DirectUrl( + url=path_to_url(source_dir), + info=DirInfo(editable=True), + ) + + +def direct_url_from_link( + link: Link, source_dir: Optional[str] = None, link_is_in_wheel_cache: bool = False +) -> DirectUrl: + if link.is_vcs: + vcs_backend = vcs.get_backend_for_scheme(link.scheme) + assert vcs_backend + url, requested_revision, _ = vcs_backend.get_url_rev_and_auth( + link.url_without_fragment + ) + # For VCS links, we need to find out and add commit_id. + if link_is_in_wheel_cache: + # If the requested VCS link corresponds to a cached + # wheel, it means the requested revision was an + # immutable commit hash, otherwise it would not have + # been cached. In that case we don't have a source_dir + # with the VCS checkout. + assert requested_revision + commit_id = requested_revision + else: + # If the wheel was not in cache, it means we have + # had to checkout from VCS to build and we have a source_dir + # which we can inspect to find out the commit id. + assert source_dir + commit_id = vcs_backend.get_revision(source_dir) + return DirectUrl( + url=url, + info=VcsInfo( + vcs=vcs_backend.name, + commit_id=commit_id, + requested_revision=requested_revision, + ), + subdirectory=link.subdirectory_fragment, + ) + elif link.is_existing_dir(): + return DirectUrl( + url=link.url_without_fragment, + info=DirInfo(), + subdirectory=link.subdirectory_fragment, + ) + else: + hash = None + hash_name = link.hash_name + if hash_name: + hash = f"{hash_name}={link.hash}" + return DirectUrl( + url=link.url_without_fragment, + info=ArchiveInfo(hash=hash), + subdirectory=link.subdirectory_fragment, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py new file mode 100644 index 0000000..4a384a6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py @@ -0,0 +1,80 @@ +import os +import re +import sys +from typing import List, Optional + +from pip._internal.locations import site_packages, user_site +from pip._internal.utils.virtualenv import ( + running_under_virtualenv, + virtualenv_no_global, +) + +__all__ = [ + "egg_link_path_from_sys_path", + "egg_link_path_from_location", +] + + +def _egg_link_names(raw_name: str) -> List[str]: + """ + Convert a Name metadata value to a .egg-link name, by applying + the same substitution as pkg_resources's safe_name function. + Note: we cannot use canonicalize_name because it has a different logic. + + We also look for the raw name (without normalization) as setuptools 69 changed + the way it names .egg-link files (https://github.com/pypa/setuptools/issues/4167). + """ + return [ + re.sub("[^A-Za-z0-9.]+", "-", raw_name) + ".egg-link", + f"{raw_name}.egg-link", + ] + + +def egg_link_path_from_sys_path(raw_name: str) -> Optional[str]: + """ + Look for a .egg-link file for project name, by walking sys.path. + """ + egg_link_names = _egg_link_names(raw_name) + for path_item in sys.path: + for egg_link_name in egg_link_names: + egg_link = os.path.join(path_item, egg_link_name) + if os.path.isfile(egg_link): + return egg_link + return None + + +def egg_link_path_from_location(raw_name: str) -> Optional[str]: + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites: List[str] = [] + if running_under_virtualenv(): + sites.append(site_packages) + if not virtualenv_no_global() and user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + egg_link_names = _egg_link_names(raw_name) + for site in sites: + for egg_link_name in egg_link_names: + egglink = os.path.join(site, egg_link_name) + if os.path.isfile(egglink): + return egglink + return None diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..008f06a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,36 @@ +import codecs +import locale +import re +import sys +from typing import List, Tuple + +BOMS: List[Tuple[bytes, str]] = [ + (codecs.BOM_UTF8, "utf-8"), + (codecs.BOM_UTF16, "utf-16"), + (codecs.BOM_UTF16_BE, "utf-16-be"), + (codecs.BOM_UTF16_LE, "utf-16-le"), + (codecs.BOM_UTF32, "utf-32"), + (codecs.BOM_UTF32_BE, "utf-32-be"), + (codecs.BOM_UTF32_LE, "utf-32-le"), +] + +ENCODING_RE = re.compile(rb"coding[:=]\s*([-\w.]+)") + + +def auto_decode(data: bytes) -> str: + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom) :].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b"\n")[:2]: + if line[0:1] == b"#" and ENCODING_RE.search(line): + result = ENCODING_RE.search(line) + assert result is not None + encoding = result.groups()[0].decode("ascii") + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py new file mode 100644 index 0000000..1501369 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py @@ -0,0 +1,84 @@ +import itertools +import os +import shutil +import sys +from typing import List, Optional + +from pip._internal.cli.main import main +from pip._internal.utils.compat import WINDOWS + +_EXECUTABLE_NAMES = [ + "pip", + f"pip{sys.version_info.major}", + f"pip{sys.version_info.major}.{sys.version_info.minor}", +] +if WINDOWS: + _allowed_extensions = {"", ".exe"} + _EXECUTABLE_NAMES = [ + "".join(parts) + for parts in itertools.product(_EXECUTABLE_NAMES, _allowed_extensions) + ] + + +def _wrapper(args: Optional[List[str]] = None) -> int: + """Central wrapper for all old entrypoints. + + Historically pip has had several entrypoints defined. Because of issues + arising from PATH, sys.path, multiple Pythons, their interactions, and most + of them having a pip installed, users suffer every time an entrypoint gets + moved. + + To alleviate this pain, and provide a mechanism for warning users and + directing them to an appropriate place for help, we now define all of + our old entrypoints as wrappers for the current one. + """ + sys.stderr.write( + "WARNING: pip is being invoked by an old script wrapper. This will " + "fail in a future version of pip.\n" + "Please see https://github.com/pypa/pip/issues/5599 for advice on " + "fixing the underlying issue.\n" + "To avoid this problem you can invoke Python with '-m pip' instead of " + "running pip directly.\n" + ) + return main(args) + + +def get_best_invocation_for_this_pip() -> str: + """Try to figure out the best way to invoke pip in the current environment.""" + binary_directory = "Scripts" if WINDOWS else "bin" + binary_prefix = os.path.join(sys.prefix, binary_directory) + + # Try to use pip[X[.Y]] names, if those executables for this environment are + # the first on PATH with that name. + path_parts = os.path.normcase(os.environ.get("PATH", "")).split(os.pathsep) + exe_are_in_PATH = os.path.normcase(binary_prefix) in path_parts + if exe_are_in_PATH: + for exe_name in _EXECUTABLE_NAMES: + found_executable = shutil.which(exe_name) + binary_executable = os.path.join(binary_prefix, exe_name) + if ( + found_executable + and os.path.exists(binary_executable) + and os.path.samefile( + found_executable, + binary_executable, + ) + ): + return exe_name + + # Use the `-m` invocation, if there's no "nice" invocation. + return f"{get_best_invocation_for_this_python()} -m pip" + + +def get_best_invocation_for_this_python() -> str: + """Try to figure out the best way to invoke the current Python.""" + exe = sys.executable + exe_name = os.path.basename(exe) + + # Try to use the basename, if it's the first executable. + found_executable = shutil.which(exe_name) + if found_executable and os.path.samefile(found_executable, exe): + return exe_name + + # Use the full executable name, because we couldn't find something simpler. + return exe diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..83c2df7 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,153 @@ +import fnmatch +import os +import os.path +import random +import sys +from contextlib import contextmanager +from tempfile import NamedTemporaryFile +from typing import Any, BinaryIO, Generator, List, Union, cast + +from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed + +from pip._internal.utils.compat import get_path_uid +from pip._internal.utils.misc import format_size + + +def check_path_owner(path: str) -> bool: + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if sys.platform == "win32" or not hasattr(os, "geteuid"): + return True + + assert os.path.isabs(path) + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) + return False # assume we don't own the path + + +@contextmanager +def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]: + """Return a file-like object pointing to a tmp file next to path. + + The file is created securely and is ensured to be written to disk + after the context reaches its end. + + kwargs will be passed to tempfile.NamedTemporaryFile to control + the way the temporary file will be opened. + """ + with NamedTemporaryFile( + delete=False, + dir=os.path.dirname(path), + prefix=os.path.basename(path), + suffix=".tmp", + **kwargs, + ) as f: + result = cast(BinaryIO, f) + try: + yield result + finally: + result.flush() + os.fsync(result.fileno()) + + +# Tenacity raises RetryError by default, explicitly raise the original exception +_replace_retry = retry(reraise=True, stop=stop_after_delay(1), wait=wait_fixed(0.25)) + +replace = _replace_retry(os.replace) + + +# test_writable_dir and _test_writable_dir_win are copied from Flit, +# with the author's agreement to also place them under pip's license. +def test_writable_dir(path: str) -> bool: + """Check if a directory is writable. + + Uses os.access() on POSIX, tries creating files on Windows. + """ + # If the directory doesn't exist, find the closest parent that does. + while not os.path.isdir(path): + parent = os.path.dirname(path) + if parent == path: + break # Should never get here, but infinite loops are bad + path = parent + + if os.name == "posix": + return os.access(path, os.W_OK) + + return _test_writable_dir_win(path) + + +def _test_writable_dir_win(path: str) -> bool: + # os.access doesn't work on Windows: http://bugs.python.org/issue2528 + # and we can't use tempfile: http://bugs.python.org/issue22107 + basename = "accesstest_deleteme_fishfingers_custard_" + alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" + for _ in range(10): + name = basename + "".join(random.choice(alphabet) for _ in range(6)) + file = os.path.join(path, name) + try: + fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL) + except FileExistsError: + pass + except PermissionError: + # This could be because there's a directory with the same name. + # But it's highly unlikely there's a directory called that, + # so we'll assume it's because the parent dir is not writable. + # This could as well be because the parent dir is not readable, + # due to non-privileged user access. + return False + else: + os.close(fd) + os.unlink(file) + return True + + # This should never be reached + raise OSError("Unexpected condition testing for writable directory") + + +def find_files(path: str, pattern: str) -> List[str]: + """Returns a list of absolute paths of files beneath path, recursively, + with filenames which match the UNIX-style shell glob pattern.""" + result: List[str] = [] + for root, _, files in os.walk(path): + matches = fnmatch.filter(files, pattern) + result.extend(os.path.join(root, f) for f in matches) + return result + + +def file_size(path: str) -> Union[int, float]: + # If it's a symlink, return 0. + if os.path.islink(path): + return 0 + return os.path.getsize(path) + + +def format_file_size(path: str) -> str: + return format_size(file_size(path)) + + +def directory_size(path: str) -> Union[int, float]: + size = 0.0 + for root, _dirs, files in os.walk(path): + for filename in files: + file_path = os.path.join(root, filename) + size += file_size(file_path) + return size + + +def format_directory_size(path: str) -> str: + return format_size(directory_size(path)) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py new file mode 100644 index 0000000..5948570 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py @@ -0,0 +1,27 @@ +"""Filetype information. +""" + +from typing import Tuple + +from pip._internal.utils.misc import splitext + +WHEEL_EXTENSION = ".whl" +BZ2_EXTENSIONS: Tuple[str, ...] = (".tar.bz2", ".tbz") +XZ_EXTENSIONS: Tuple[str, ...] = ( + ".tar.xz", + ".txz", + ".tlz", + ".tar.lz", + ".tar.lzma", +) +ZIP_EXTENSIONS: Tuple[str, ...] = (".zip", WHEEL_EXTENSION) +TAR_EXTENSIONS: Tuple[str, ...] = (".tar.gz", ".tgz", ".tar") +ARCHIVE_EXTENSIONS = ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS + + +def is_archive_file(name: str) -> bool: + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..81342af --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,88 @@ +import os +import sys +from typing import Optional, Tuple + + +def glibc_version_string() -> Optional[str]: + "Returns glibc version string, or None if not using glibc." + return glibc_version_string_confstr() or glibc_version_string_ctypes() + + +def glibc_version_string_confstr() -> Optional[str]: + "Primary implementation of glibc_version_string using os.confstr." + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module: + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183 + if sys.platform == "win32": + return None + try: + gnu_libc_version = os.confstr("CS_GNU_LIBC_VERSION") + if gnu_libc_version is None: + return None + # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17": + _, version = gnu_libc_version.split() + except (AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def glibc_version_string_ctypes() -> Optional[str]: + "Fallback implementation of glibc_version_string using ctypes." + + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver() -> Tuple[str, str]: + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..843cffc --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,151 @@ +import hashlib +from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, Optional + +from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError +from pip._internal.utils.misc import read_chunks + +if TYPE_CHECKING: + from hashlib import _Hash + + # NoReturn introduced in 3.6.2; imported only for type checking to maintain + # pip compatibility with older patch versions of Python 3.6 + from typing import NoReturn + + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = "sha256" + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ["sha256", "sha384", "sha512"] + + +class Hashes: + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + + def __init__(self, hashes: Optional[Dict[str, List[str]]] = None) -> None: + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + allowed = {} + if hashes is not None: + for alg, keys in hashes.items(): + # Make sure values are always sorted (to ease equality checks) + allowed[alg] = sorted(keys) + self._allowed = allowed + + def __and__(self, other: "Hashes") -> "Hashes": + if not isinstance(other, Hashes): + return NotImplemented + + # If either of the Hashes object is entirely empty (i.e. no hash + # specified at all), all hashes from the other object are allowed. + if not other: + return self + if not self: + return other + + # Otherwise only hashes that present in both objects are allowed. + new = {} + for alg, values in other._allowed.items(): + if alg not in self._allowed: + continue + new[alg] = [v for v in values if v in self._allowed[alg]] + return Hashes(new) + + @property + def digest_count(self) -> int: + return sum(len(digests) for digests in self._allowed.values()) + + def is_hash_allowed(self, hash_name: str, hex_digest: str) -> bool: + """Return whether the given hex digest is allowed.""" + return hex_digest in self._allowed.get(hash_name, []) + + def check_against_chunks(self, chunks: Iterable[bytes]) -> None: + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in self._allowed.keys(): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError(f"Unknown hash name: {hash_name}") + + for chunk in chunks: + for hash in gots.values(): + hash.update(chunk) + + for hash_name, got in gots.items(): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn": + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file: BinaryIO) -> None: + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path: str) -> None: + with open(path, "rb") as file: + return self.check_against_file(file) + + def has_one_of(self, hashes: Dict[str, str]) -> bool: + """Return whether any of the given hashes are allowed.""" + for hash_name, hex_digest in hashes.items(): + if self.is_hash_allowed(hash_name, hex_digest): + return True + return False + + def __bool__(self) -> bool: + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Hashes): + return NotImplemented + return self._allowed == other._allowed + + def __hash__(self) -> int: + return hash( + ",".join( + sorted( + ":".join((alg, digest)) + for alg, digest_list in self._allowed.items() + for digest in digest_list + ) + ) + ) + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + + def __init__(self) -> None: + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super().__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn": + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/logging.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..95982df --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,348 @@ +import contextlib +import errno +import logging +import logging.handlers +import os +import sys +import threading +from dataclasses import dataclass +from io import TextIOWrapper +from logging import Filter +from typing import Any, ClassVar, Generator, List, Optional, TextIO, Type + +from pip._vendor.rich.console import ( + Console, + ConsoleOptions, + ConsoleRenderable, + RenderableType, + RenderResult, + RichCast, +) +from pip._vendor.rich.highlighter import NullHighlighter +from pip._vendor.rich.logging import RichHandler +from pip._vendor.rich.segment import Segment +from pip._vendor.rich.style import Style + +from pip._internal.utils._log import VERBOSE, getLogger +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX +from pip._internal.utils.misc import ensure_dir + +_log_state = threading.local() +subprocess_logger = getLogger("pip.subprocessor") + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + + +def _is_broken_pipe_error(exc_class: Type[BaseException], exc: BaseException) -> bool: + if exc_class is BrokenPipeError: + return True + + # On Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if not WINDOWS: + return False + + return isinstance(exc, OSError) and exc.errno in (errno.EINVAL, errno.EPIPE) + + +@contextlib.contextmanager +def indent_log(num: int = 2) -> Generator[None, None, None]: + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + # For thread-safety + _log_state.indentation = get_indentation() + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation() -> int: + return getattr(_log_state, "indentation", 0) + + +class IndentingFormatter(logging.Formatter): + default_time_format = "%Y-%m-%dT%H:%M:%S" + + def __init__( + self, + *args: Any, + add_timestamp: bool = False, + **kwargs: Any, + ) -> None: + """ + A logging.Formatter that obeys the indent_log() context manager. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = add_timestamp + super().__init__(*args, **kwargs) + + def get_message_start(self, formatted: str, levelno: int) -> str: + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return "" + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return "" + if levelno < logging.ERROR: + return "WARNING: " + + return "ERROR: " + + def format(self, record: logging.LogRecord) -> str: + """ + Calls the standard formatter, but will indent all of the log message + lines by our current indentation level. + """ + formatted = super().format(record) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + prefix = "" + if self.add_timestamp: + prefix = f"{self.formatTime(record)} " + prefix += " " * get_indentation() + formatted = "".join([prefix + line for line in formatted.splitlines(True)]) + return formatted + + +@dataclass +class IndentedRenderable: + renderable: RenderableType + indent: int + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + segments = console.render(self.renderable, options) + lines = Segment.split_lines(segments) + for line in lines: + yield Segment(" " * self.indent) + yield from line + yield Segment("\n") + + +class RichPipStreamHandler(RichHandler): + KEYWORDS: ClassVar[Optional[List[str]]] = [] + + def __init__(self, stream: Optional[TextIO], no_color: bool) -> None: + super().__init__( + console=Console(file=stream, no_color=no_color, soft_wrap=True), + show_time=False, + show_level=False, + show_path=False, + highlighter=NullHighlighter(), + ) + + # Our custom override on Rich's logger, to make things work as we need them to. + def emit(self, record: logging.LogRecord) -> None: + style: Optional[Style] = None + + # If we are given a diagnostic error to present, present it with indentation. + assert isinstance(record.args, tuple) + if getattr(record, "rich", False): + (rich_renderable,) = record.args + assert isinstance( + rich_renderable, (ConsoleRenderable, RichCast, str) + ), f"{rich_renderable} is not rich-console-renderable" + + renderable: RenderableType = IndentedRenderable( + rich_renderable, indent=get_indentation() + ) + else: + message = self.format(record) + renderable = self.render_message(record, message) + if record.levelno is not None: + if record.levelno >= logging.ERROR: + style = Style(color="red") + elif record.levelno >= logging.WARNING: + style = Style(color="yellow") + + try: + self.console.print(renderable, overflow="ignore", crop=False, style=style) + except Exception: + self.handleError(record) + + def handleError(self, record: logging.LogRecord) -> None: + """Called when logging is unable to log some output.""" + + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if ( + exc_class + and exc + and self.console.file is sys.stdout + and _is_broken_pipe_error(exc_class, exc) + ): + raise BrokenStdoutLoggingError() + + return super().handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + def _open(self) -> TextIOWrapper: + ensure_dir(os.path.dirname(self.baseFilename)) + return super()._open() + + +class MaxLevelFilter(Filter): + def __init__(self, level: int) -> None: + self.level = level + + def filter(self, record: logging.LogRecord) -> bool: + return record.levelno < self.level + + +class ExcludeLoggerFilter(Filter): + + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record: logging.LogRecord) -> bool: + # The base Filter class allows only records from a logger (or its + # children). + return not super().filter(record) + + +def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str]) -> int: + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 2: + level_number = logging.DEBUG + elif verbosity == 1: + level_number = VERBOSE + elif verbosity == -1: + level_number = logging.WARNING + elif verbosity == -2: + level_number = logging.ERROR + elif verbosity <= -3: + level_number = logging.CRITICAL + else: + level_number = logging.INFO + + level = logging.getLevelName(level_number) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.RichPipStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_subprocess", "exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "stream": log_streams["stderr"], + "no_color": no_color, + "filters": ["restrict_to_subprocess"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "encoding": "utf-8", + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": handlers, + }, + "loggers": {"pip._vendor": {"level": vendored_log_level}}, + } + ) + + return level_number diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/misc.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..1ad3f61 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,783 @@ +import contextlib +import errno +import getpass +import hashlib +import io +import logging +import os +import posixpath +import shutil +import stat +import sys +import sysconfig +import urllib.parse +from functools import partial +from io import StringIO +from itertools import filterfalse, tee, zip_longest +from pathlib import Path +from types import FunctionType, TracebackType +from typing import ( + Any, + BinaryIO, + Callable, + ContextManager, + Dict, + Generator, + Iterable, + Iterator, + List, + Optional, + TextIO, + Tuple, + Type, + TypeVar, + Union, + cast, +) + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.pyproject_hooks import BuildBackendHookCaller +from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed + +from pip import __version__ +from pip._internal.exceptions import CommandError, ExternallyManagedEnvironment +from pip._internal.locations import get_major_minor_version +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.virtualenv import running_under_virtualenv + +__all__ = [ + "rmtree", + "display_path", + "backup_dir", + "ask", + "splitext", + "format_size", + "is_installable_dir", + "normalize_path", + "renames", + "get_prog", + "captured_stdout", + "ensure_dir", + "remove_auth_from_url", + "check_externally_managed", + "ConfiguredBuildBackendHookCaller", +] + +logger = logging.getLogger(__name__) + +T = TypeVar("T") +ExcInfo = Tuple[Type[BaseException], BaseException, TracebackType] +VersionInfo = Tuple[int, int, int] +NetlocTuple = Tuple[str, Tuple[Optional[str], Optional[str]]] +OnExc = Callable[[FunctionType, Path, BaseException], Any] +OnErr = Callable[[FunctionType, Path, ExcInfo], Any] + + +def get_pip_version() -> str: + pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") + pip_pkg_dir = os.path.abspath(pip_pkg_dir) + + return f"pip {__version__} from {pip_pkg_dir} (python {get_major_minor_version()})" + + +def normalize_version_info(py_version_info: Tuple[int, ...]) -> Tuple[int, int, int]: + """ + Convert a tuple of ints representing a Python version to one of length + three. + + :param py_version_info: a tuple of ints representing a Python version, + or None to specify no version. The tuple can have any length. + + :return: a tuple of length three if `py_version_info` is non-None. + Otherwise, return `py_version_info` unchanged (i.e. None). + """ + if len(py_version_info) < 3: + py_version_info += (3 - len(py_version_info)) * (0,) + elif len(py_version_info) > 3: + py_version_info = py_version_info[:3] + + return cast("VersionInfo", py_version_info) + + +def ensure_dir(path: str) -> None: + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + # Windows can raise spurious ENOTEMPTY errors. See #6426. + if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY: + raise + + +def get_prog() -> str: + try: + prog = os.path.basename(sys.argv[0]) + if prog in ("__main__.py", "-c"): + return f"{sys.executable} -m pip" + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return "pip" + + +# Retry every half second for up to 3 seconds +# Tenacity raises RetryError by default, explicitly raise the original exception +@retry(reraise=True, stop=stop_after_delay(3), wait=wait_fixed(0.5)) +def rmtree( + dir: str, + ignore_errors: bool = False, + onexc: Optional[OnExc] = None, +) -> None: + if ignore_errors: + onexc = _onerror_ignore + if onexc is None: + onexc = _onerror_reraise + handler: OnErr = partial( + # `[func, path, Union[ExcInfo, BaseException]] -> Any` is equivalent to + # `Union[([func, path, ExcInfo] -> Any), ([func, path, BaseException] -> Any)]`. + cast(Union[OnExc, OnErr], rmtree_errorhandler), + onexc=onexc, + ) + if sys.version_info >= (3, 12): + # See https://docs.python.org/3.12/whatsnew/3.12.html#shutil. + shutil.rmtree(dir, onexc=handler) # type: ignore + else: + shutil.rmtree(dir, onerror=handler) # type: ignore + + +def _onerror_ignore(*_args: Any) -> None: + pass + + +def _onerror_reraise(*_args: Any) -> None: + raise + + +def rmtree_errorhandler( + func: FunctionType, + path: Path, + exc_info: Union[ExcInfo, BaseException], + *, + onexc: OnExc = _onerror_reraise, +) -> None: + """ + `rmtree` error handler to 'force' a file remove (i.e. like `rm -f`). + + * If a file is readonly then it's write flag is set and operation is + retried. + + * `onerror` is the original callback from `rmtree(... onerror=onerror)` + that is chained at the end if the "rm -f" still fails. + """ + try: + st_mode = os.stat(path).st_mode + except OSError: + # it's equivalent to os.path.exists + return + + if not st_mode & stat.S_IWRITE: + # convert to read/write + try: + os.chmod(path, st_mode | stat.S_IWRITE) + except OSError: + pass + else: + # use the original function to repeat the operation + try: + func(path) + return + except OSError: + pass + + if not isinstance(exc_info, BaseException): + _, exc_info, _ = exc_info + onexc(func, path, exc_info) + + +def display_path(path: str) -> str: + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if path.startswith(os.getcwd() + os.path.sep): + path = "." + path[len(os.getcwd()) :] + return path + + +def backup_dir(dir: str, ext: str = ".bak") -> str: + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message: str, options: Iterable[str]) -> str: + for action in os.environ.get("PIP_EXISTS_ACTION", "").split(): + if action in options: + return action + return ask(message, options) + + +def _check_no_input(message: str) -> None: + """Raise an error if no input is allowed.""" + if os.environ.get("PIP_NO_INPUT"): + raise Exception( + f"No input was expected ($PIP_NO_INPUT set); question: {message}" + ) + + +def ask(message: str, options: Iterable[str]) -> str: + """Ask the message interactively, with the given possible responses""" + while 1: + _check_no_input(message) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + "Your response ({!r}) was not one of the expected responses: " + "{}".format(response, ", ".join(options)) + ) + else: + return response + + +def ask_input(message: str) -> str: + """Ask for input interactively.""" + _check_no_input(message) + return input(message) + + +def ask_password(message: str) -> str: + """Ask for a password interactively.""" + _check_no_input(message) + return getpass.getpass(message) + + +def strtobool(val: str) -> int: + """Convert a string representation of truth to true (1) or false (0). + + True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values + are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if + 'val' is anything else. + """ + val = val.lower() + if val in ("y", "yes", "t", "true", "on", "1"): + return 1 + elif val in ("n", "no", "f", "false", "off", "0"): + return 0 + else: + raise ValueError(f"invalid truth value {val!r}") + + +def format_size(bytes: float) -> str: + if bytes > 1000 * 1000: + return f"{bytes / 1000.0 / 1000:.1f} MB" + elif bytes > 10 * 1000: + return f"{int(bytes / 1000)} kB" + elif bytes > 1000: + return f"{bytes / 1000.0:.1f} kB" + else: + return f"{int(bytes)} bytes" + + +def tabulate(rows: Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]]: + """Return a list of formatted rows and a list of column sizes. + + For example:: + + >>> tabulate([['foobar', 2000], [0xdeadbeef]]) + (['foobar 2000', '3735928559'], [10, 4]) + """ + rows = [tuple(map(str, row)) for row in rows] + sizes = [max(map(len, col)) for col in zip_longest(*rows, fillvalue="")] + table = [" ".join(map(str.ljust, row, sizes)).rstrip() for row in rows] + return table, sizes + + +def is_installable_dir(path: str) -> bool: + """Is path is a directory containing pyproject.toml or setup.py? + + If pyproject.toml exists, this is a PEP 517 project. Otherwise we look for + a legacy setuptools layout by identifying setup.py. We don't check for the + setup.cfg because using it without setup.py is only available for PEP 517 + projects, which are already covered by the pyproject.toml check. + """ + if not os.path.isdir(path): + return False + if os.path.isfile(os.path.join(path, "pyproject.toml")): + return True + if os.path.isfile(os.path.join(path, "setup.py")): + return True + return False + + +def read_chunks( + file: BinaryIO, size: int = io.DEFAULT_BUFFER_SIZE +) -> Generator[bytes, None, None]: + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def normalize_path(path: str, resolve_symlinks: bool = True) -> str: + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = os.path.expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path: str) -> Tuple[str, str]: + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith(".tar"): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old: str, new: str) -> None: + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path: str) -> bool: + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + Caution: this function assumes the head of path has been normalized + with normalize_path. + """ + if not running_under_virtualenv(): + return True + return path.startswith(normalize_path(sys.prefix)) + + +def write_output(msg: Any, *args: Any) -> None: + logger.info(msg, *args) + + +class StreamWrapper(StringIO): + orig_stream: TextIO + + @classmethod + def from_stream(cls, orig_stream: TextIO) -> "StreamWrapper": + ret = cls() + ret.orig_stream = orig_stream + return ret + + # compileall.compile_dir() needs stdout.encoding to print to stdout + # type ignore is because TextIOBase.encoding is writeable + @property + def encoding(self) -> str: # type: ignore + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name: str) -> Generator[StreamWrapper, None, None]: + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout() -> ContextManager[StreamWrapper]: + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output("stdout") + + +def captured_stderr() -> ContextManager[StreamWrapper]: + """ + See captured_stdout(). + """ + return captured_output("stderr") + + +# Simulates an enum +def enum(*sequential: Any, **named: Any) -> Type[Any]: + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums["reverse_mapping"] = reverse + return type("Enum", (), enums) + + +def build_netloc(host: str, port: Optional[int]) -> str: + """ + Build a netloc from a host-port pair + """ + if port is None: + return host + if ":" in host: + # Only wrap host with square brackets when it is IPv6 + host = f"[{host}]" + return f"{host}:{port}" + + +def build_url_from_netloc(netloc: str, scheme: str = "https") -> str: + """ + Build a full URL from a netloc. + """ + if netloc.count(":") >= 2 and "@" not in netloc and "[" not in netloc: + # It must be a bare IPv6 address, so wrap it with brackets. + netloc = f"[{netloc}]" + return f"{scheme}://{netloc}" + + +def parse_netloc(netloc: str) -> Tuple[Optional[str], Optional[int]]: + """ + Return the host-port pair from a netloc. + """ + url = build_url_from_netloc(netloc) + parsed = urllib.parse.urlparse(url) + return parsed.hostname, parsed.port + + +def split_auth_from_netloc(netloc: str) -> NetlocTuple: + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if "@" not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit("@", 1) + pw: Optional[str] = None + if ":" in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user, pw = auth.split(":", 1) + else: + user, pw = auth, None + + user = urllib.parse.unquote(user) + if pw is not None: + pw = urllib.parse.unquote(pw) + + return netloc, (user, pw) + + +def redact_netloc(netloc: str) -> str: + """ + Replace the sensitive data in a netloc with "****", if it exists. + + For example: + - "user:pass@example.com" returns "user:****@example.com" + - "accesstoken@example.com" returns "****@example.com" + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + if password is None: + user = "****" + password = "" + else: + user = urllib.parse.quote(user) + password = ":****" + return f"{user}{password}@{netloc}" + + +def _transform_url( + url: str, transform_netloc: Callable[[str], Tuple[Any, ...]] +) -> Tuple[str, NetlocTuple]: + """Transform and replace netloc in a url. + + transform_netloc is a function taking the netloc and returning a + tuple. The first element of this tuple is the new netloc. The + entire tuple is returned. + + Returns a tuple containing the transformed url as item 0 and the + original tuple returned by transform_netloc as item 1. + """ + purl = urllib.parse.urlsplit(url) + netloc_tuple = transform_netloc(purl.netloc) + # stripped url + url_pieces = (purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment) + surl = urllib.parse.urlunsplit(url_pieces) + return surl, cast("NetlocTuple", netloc_tuple) + + +def _get_netloc(netloc: str) -> NetlocTuple: + return split_auth_from_netloc(netloc) + + +def _redact_netloc(netloc: str) -> Tuple[str]: + return (redact_netloc(netloc),) + + +def split_auth_netloc_from_url( + url: str, +) -> Tuple[str, str, Tuple[Optional[str], Optional[str]]]: + """ + Parse a url into separate netloc, auth, and url with no auth. + + Returns: (url_without_auth, netloc, (username, password)) + """ + url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc) + return url_without_auth, netloc, auth + + +def remove_auth_from_url(url: str) -> str: + """Return a copy of url with 'username:password@' removed.""" + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc)[0] + + +def redact_auth_from_url(url: str) -> str: + """Replace the password in a given url with ****.""" + return _transform_url(url, _redact_netloc)[0] + + +def redact_auth_from_requirement(req: Requirement) -> str: + """Replace the password in a given requirement url with ****.""" + if not req.url: + return str(req) + return str(req).replace(req.url, redact_auth_from_url(req.url)) + + +class HiddenText: + def __init__(self, secret: str, redacted: str) -> None: + self.secret = secret + self.redacted = redacted + + def __repr__(self) -> str: + return f"" + + def __str__(self) -> str: + return self.redacted + + # This is useful for testing. + def __eq__(self, other: Any) -> bool: + if type(self) != type(other): + return False + + # The string being used for redaction doesn't also have to match, + # just the raw, original string. + return self.secret == other.secret + + +def hide_value(value: str) -> HiddenText: + return HiddenText(value, redacted="****") + + +def hide_url(url: str) -> HiddenText: + redacted = redact_auth_from_url(url) + return HiddenText(url, redacted=redacted) + + +def protect_pip_from_modification_on_windows(modifying_pip: bool) -> None: + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip", + f"pip{sys.version_info.major}", + f"pip{sys.version_info.major}.{sys.version_info.minor}", + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and WINDOWS and os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [sys.executable, "-m", "pip"] + sys.argv[1:] + raise CommandError( + "To modify pip, please run the following command:\n{}".format( + " ".join(new_command) + ) + ) + + +def check_externally_managed() -> None: + """Check whether the current environment is externally managed. + + If the ``EXTERNALLY-MANAGED`` config file is found, the current environment + is considered externally managed, and an ExternallyManagedEnvironment is + raised. + """ + if running_under_virtualenv(): + return + marker = os.path.join(sysconfig.get_path("stdlib"), "EXTERNALLY-MANAGED") + if not os.path.isfile(marker): + return + raise ExternallyManagedEnvironment.from_config(marker) + + +def is_console_interactive() -> bool: + """Is this console interactive?""" + return sys.stdin is not None and sys.stdin.isatty() + + +def hash_file(path: str, blocksize: int = 1 << 20) -> Tuple[Any, int]: + """Return (hash, length) for path using hashlib.sha256()""" + + h = hashlib.sha256() + length = 0 + with open(path, "rb") as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + return h, length + + +def pairwise(iterable: Iterable[Any]) -> Iterator[Tuple[Any, Any]]: + """ + Return paired elements. + + For example: + s -> (s0, s1), (s2, s3), (s4, s5), ... + """ + iterable = iter(iterable) + return zip_longest(iterable, iterable) + + +def partition( + pred: Callable[[T], bool], + iterable: Iterable[T], +) -> Tuple[Iterable[T], Iterable[T]]: + """ + Use a predicate to partition entries into false entries and true entries, + like + + partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 + """ + t1, t2 = tee(iterable) + return filterfalse(pred, t1), filter(pred, t2) + + +class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller): + def __init__( + self, + config_holder: Any, + source_dir: str, + build_backend: str, + backend_path: Optional[str] = None, + runner: Optional[Callable[..., None]] = None, + python_executable: Optional[str] = None, + ): + super().__init__( + source_dir, build_backend, backend_path, runner, python_executable + ) + self.config_holder = config_holder + + def build_wheel( + self, + wheel_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + metadata_directory: Optional[str] = None, + ) -> str: + cs = self.config_holder.config_settings + return super().build_wheel( + wheel_directory, config_settings=cs, metadata_directory=metadata_directory + ) + + def build_sdist( + self, + sdist_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + ) -> str: + cs = self.config_holder.config_settings + return super().build_sdist(sdist_directory, config_settings=cs) + + def build_editable( + self, + wheel_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + metadata_directory: Optional[str] = None, + ) -> str: + cs = self.config_holder.config_settings + return super().build_editable( + wheel_directory, config_settings=cs, metadata_directory=metadata_directory + ) + + def get_requires_for_build_wheel( + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_wheel(config_settings=cs) + + def get_requires_for_build_sdist( + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_sdist(config_settings=cs) + + def get_requires_for_build_editable( + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_editable(config_settings=cs) + + def prepare_metadata_for_build_wheel( + self, + metadata_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + _allow_fallback: bool = True, + ) -> str: + cs = self.config_holder.config_settings + return super().prepare_metadata_for_build_wheel( + metadata_directory=metadata_directory, + config_settings=cs, + _allow_fallback=_allow_fallback, + ) + + def prepare_metadata_for_build_editable( + self, + metadata_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + _allow_fallback: bool = True, + ) -> str: + cs = self.config_holder.config_settings + return super().prepare_metadata_for_build_editable( + metadata_directory=metadata_directory, + config_settings=cs, + _allow_fallback=_allow_fallback, + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/models.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/models.py new file mode 100644 index 0000000..b6bb21a --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/models.py @@ -0,0 +1,39 @@ +"""Utilities for defining models +""" + +import operator +from typing import Any, Callable, Type + + +class KeyBasedCompareMixin: + """Provides comparison capabilities that is based on a key""" + + __slots__ = ["_compare_key", "_defining_class"] + + def __init__(self, key: Any, defining_class: Type["KeyBasedCompareMixin"]) -> None: + self._compare_key = key + self._defining_class = defining_class + + def __hash__(self) -> int: + return hash(self._compare_key) + + def __lt__(self, other: Any) -> bool: + return self._compare(other, operator.__lt__) + + def __le__(self, other: Any) -> bool: + return self._compare(other, operator.__le__) + + def __gt__(self, other: Any) -> bool: + return self._compare(other, operator.__gt__) + + def __ge__(self, other: Any) -> bool: + return self._compare(other, operator.__ge__) + + def __eq__(self, other: Any) -> bool: + return self._compare(other, operator.__eq__) + + def _compare(self, other: Any, method: Callable[[Any, Any], bool]) -> bool: + if not isinstance(other, self._defining_class): + return NotImplemented + + return method(self._compare_key, other._compare_key) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..b9f6af4 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py @@ -0,0 +1,57 @@ +import functools +import logging +import re +from typing import NewType, Optional, Tuple, cast + +from pip._vendor.packaging import specifiers, version +from pip._vendor.packaging.requirements import Requirement + +NormalizedExtra = NewType("NormalizedExtra", str) + +logger = logging.getLogger(__name__) + + +def check_requires_python( + requires_python: Optional[str], version_info: Tuple[int, ...] +) -> bool: + """ + Check if the given Python version matches a "Requires-Python" specifier. + + :param version_info: A 3-tuple of ints representing a Python + major-minor-micro version to check (e.g. `sys.version_info[:3]`). + + :return: `True` if the given Python version satisfies the requirement. + Otherwise, return `False`. + + :raises InvalidSpecifier: If `requires_python` has an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + python_version = version.parse(".".join(map(str, version_info))) + return python_version in requires_python_specifier + + +@functools.lru_cache(maxsize=512) +def get_requirement(req_string: str) -> Requirement: + """Construct a packaging.Requirement object with caching""" + # Parsing requirement strings is expensive, and is also expected to happen + # with a low diversity of different arguments (at least relative the number + # constructed). This method adds a cache to requirement object creation to + # minimize repeated parsing of the same string to construct equivalent + # Requirement objects. + return Requirement(req_string) + + +def safe_extra(extra: str) -> NormalizedExtra: + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + + This function is duplicated from ``pkg_resources``. Note that this is not + the same to either ``canonicalize_name`` or ``_egg_link_name``. + """ + return cast(NormalizedExtra, re.sub("[^A-Za-z0-9.-]+", "_", extra).lower()) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..96d1b24 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,146 @@ +import sys +import textwrap +from typing import List, Optional, Sequence + +# Shim to wrap setup.py invocation with setuptools +# Note that __file__ is handled via two {!r} *and* %r, to ensure that paths on +# Windows are correctly handled (it should be "C:\\Users" not "C:\Users"). +_SETUPTOOLS_SHIM = textwrap.dedent( + """ + exec(compile(''' + # This is -- a caller that pip uses to run setup.py + # + # - It imports setuptools before invoking setup.py, to enable projects that directly + # import from `distutils.core` to work with newer packaging standards. + # - It provides a clear error message when setuptools is not installed. + # - It sets `sys.argv[0]` to the underlying `setup.py`, when invoking `setup.py` so + # setuptools doesn't think the script is `-c`. This avoids the following warning: + # manifest_maker: standard file '-c' not found". + # - It generates a shim setup.py, for handling setup.cfg-only projects. + import os, sys, tokenize + + try: + import setuptools + except ImportError as error: + print( + "ERROR: Can not execute `setup.py` since setuptools is not available in " + "the build environment.", + file=sys.stderr, + ) + sys.exit(1) + + __file__ = %r + sys.argv[0] = __file__ + + if os.path.exists(__file__): + filename = __file__ + with tokenize.open(__file__) as f: + setup_py_code = f.read() + else: + filename = "" + setup_py_code = "from setuptools import setup; setup()" + + exec(compile(setup_py_code, filename, "exec")) + ''' % ({!r},), "", "exec")) + """ +).rstrip() + + +def make_setuptools_shim_args( + setup_py_path: str, + global_options: Optional[Sequence[str]] = None, + no_user_config: bool = False, + unbuffered_output: bool = False, +) -> List[str]: + """ + Get setuptools command arguments with shim wrapped setup file invocation. + + :param setup_py_path: The path to setup.py to be wrapped. + :param global_options: Additional global options. + :param no_user_config: If True, disables personal user configuration. + :param unbuffered_output: If True, adds the unbuffered switch to the + argument list. + """ + args = [sys.executable] + if unbuffered_output: + args += ["-u"] + args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)] + if global_options: + args += global_options + if no_user_config: + args += ["--no-user-cfg"] + return args + + +def make_setuptools_bdist_wheel_args( + setup_py_path: str, + global_options: Sequence[str], + build_options: Sequence[str], + destination_dir: str, +) -> List[str]: + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + args = make_setuptools_shim_args( + setup_py_path, global_options=global_options, unbuffered_output=True + ) + args += ["bdist_wheel", "-d", destination_dir] + args += build_options + return args + + +def make_setuptools_clean_args( + setup_py_path: str, + global_options: Sequence[str], +) -> List[str]: + args = make_setuptools_shim_args( + setup_py_path, global_options=global_options, unbuffered_output=True + ) + args += ["clean", "--all"] + return args + + +def make_setuptools_develop_args( + setup_py_path: str, + *, + global_options: Sequence[str], + no_user_config: bool, + prefix: Optional[str], + home: Optional[str], + use_user_site: bool, +) -> List[str]: + assert not (use_user_site and prefix) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + ) + + args += ["develop", "--no-deps"] + + if prefix: + args += ["--prefix", prefix] + if home is not None: + args += ["--install-dir", home] + + if use_user_site: + args += ["--user", "--prefix="] + + return args + + +def make_setuptools_egg_info_args( + setup_py_path: str, + egg_info_dir: Optional[str], + no_user_config: bool, +) -> List[str]: + args = make_setuptools_shim_args(setup_py_path, no_user_config=no_user_config) + + args += ["egg_info"] + + if egg_info_dir: + args += ["--egg-base", egg_info_dir] + + return args diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py new file mode 100644 index 0000000..79580b0 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py @@ -0,0 +1,260 @@ +import logging +import os +import shlex +import subprocess +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Iterable, + List, + Mapping, + Optional, + Union, +) + +from pip._vendor.rich.markup import escape + +from pip._internal.cli.spinners import SpinnerInterface, open_spinner +from pip._internal.exceptions import InstallationSubprocessError +from pip._internal.utils.logging import VERBOSE, subprocess_logger +from pip._internal.utils.misc import HiddenText + +if TYPE_CHECKING: + # Literal was introduced in Python 3.8. + # + # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7. + from typing import Literal + +CommandArgs = List[Union[str, HiddenText]] + + +def make_command(*args: Union[str, HiddenText, CommandArgs]) -> CommandArgs: + """ + Create a CommandArgs object. + """ + command_args: CommandArgs = [] + for arg in args: + # Check for list instead of CommandArgs since CommandArgs is + # only known during type-checking. + if isinstance(arg, list): + command_args.extend(arg) + else: + # Otherwise, arg is str or HiddenText. + command_args.append(arg) + + return command_args + + +def format_command_args(args: Union[List[str], CommandArgs]) -> str: + """ + Format command arguments for display. + """ + # For HiddenText arguments, display the redacted form by calling str(). + # Also, we don't apply str() to arguments that aren't HiddenText since + # this can trigger a UnicodeDecodeError in Python 2 if the argument + # has type unicode and includes a non-ascii character. (The type + # checker doesn't ensure the annotations are correct in all cases.) + return " ".join( + shlex.quote(str(arg)) if isinstance(arg, HiddenText) else shlex.quote(arg) + for arg in args + ) + + +def reveal_command_args(args: Union[List[str], CommandArgs]) -> List[str]: + """ + Return the arguments in their raw, unredacted form. + """ + return [arg.secret if isinstance(arg, HiddenText) else arg for arg in args] + + +def call_subprocess( + cmd: Union[List[str], CommandArgs], + show_stdout: bool = False, + cwd: Optional[str] = None, + on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise", + extra_ok_returncodes: Optional[Iterable[int]] = None, + extra_environ: Optional[Mapping[str, Any]] = None, + unset_environ: Optional[Iterable[str]] = None, + spinner: Optional[SpinnerInterface] = None, + log_failed_cmd: Optional[bool] = True, + stdout_only: Optional[bool] = False, + *, + command_desc: str, +) -> str: + """ + Args: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + log_failed_cmd: if false, failed commands are not logged, only raised. + stdout_only: if true, return only stdout, else return both. When true, + logging of both stdout and stderr occurs when the subprocess has + terminated, else logging occurs as subprocess output is produced. + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # Most places in pip use show_stdout=False. What this means is-- + # + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. + # + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. + if show_stdout: + # Then log the subprocess output at INFO level. + log_subprocess: Callable[..., None] = subprocess_logger.info + used_level = logging.INFO + else: + # Then log the subprocess output using VERBOSE. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.verbose + used_level = VERBOSE + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + + log_subprocess("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + # Convert HiddenText objects to the underlying str. + reveal_command_args(cmd), + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE, + cwd=cwd, + env=env, + errors="backslashreplace", + ) + except Exception as exc: + if log_failed_cmd: + subprocess_logger.critical( + "Error %s while executing command %s", + exc, + command_desc, + ) + raise + all_output = [] + if not stdout_only: + assert proc.stdout + assert proc.stdin + proc.stdin.close() + # In this mode, stdout and stderr are in the same pipe. + while True: + line: str = proc.stdout.readline() + if not line: + break + line = line.rstrip() + all_output.append(line + "\n") + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + assert spinner + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + output = "".join(all_output) + else: + # In this mode, stdout and stderr are in different pipes. + # We must use communicate() which is the only safe way to read both. + out, err = proc.communicate() + # log line by line to preserve pip log indenting + for out_line in out.splitlines(): + log_subprocess(out_line) + all_output.append(out) + for err_line in err.splitlines(): + log_subprocess(err_line) + all_output.append(err) + output = out + + proc_had_error = proc.returncode and proc.returncode not in extra_ok_returncodes + if use_spinner: + assert spinner + if proc_had_error: + spinner.finish("error") + else: + spinner.finish("done") + if proc_had_error: + if on_returncode == "raise": + error = InstallationSubprocessError( + command_description=command_desc, + exit_code=proc.returncode, + output_lines=all_output if not showing_subprocess else None, + ) + if log_failed_cmd: + subprocess_logger.error("%s", error, extra={"rich": True}) + subprocess_logger.verbose( + "[bold magenta]full command[/]: [blue]%s[/]", + escape(format_command_args(cmd)), + extra={"markup": True}, + ) + subprocess_logger.verbose( + "[bold magenta]cwd[/]: %s", + escape(cwd or "[inherit]"), + extra={"markup": True}, + ) + + raise error + elif on_returncode == "warn": + subprocess_logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, + proc.returncode, + cwd, + ) + elif on_returncode == "ignore": + pass + else: + raise ValueError(f"Invalid value: on_returncode={on_returncode!r}") + return output + + +def runner_with_spinner_message(message: str) -> Callable[..., None]: + """Provide a subprocess_runner that shows a spinner message. + + Intended for use with for BuildBackendHookCaller. Thus, the runner has + an API that matches what's expected by BuildBackendHookCaller.subprocess_runner. + """ + + def runner( + cmd: List[str], + cwd: Optional[str] = None, + extra_environ: Optional[Mapping[str, Any]] = None, + ) -> None: + with open_spinner(message) as spinner: + call_subprocess( + cmd, + command_desc=message, + cwd=cwd, + extra_environ=extra_environ, + spinner=spinner, + ) + + return runner diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..4eec5f3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,296 @@ +import errno +import itertools +import logging +import os.path +import tempfile +import traceback +from contextlib import ExitStack, contextmanager +from pathlib import Path +from typing import ( + Any, + Callable, + Dict, + Generator, + List, + Optional, + TypeVar, + Union, +) + +from pip._internal.utils.misc import enum, rmtree + +logger = logging.getLogger(__name__) + +_T = TypeVar("_T", bound="TempDirectory") + + +# Kinds of temporary directories. Only needed for ones that are +# globally-managed. +tempdir_kinds = enum( + BUILD_ENV="build-env", + EPHEM_WHEEL_CACHE="ephem-wheel-cache", + REQ_BUILD="req-build", +) + + +_tempdir_manager: Optional[ExitStack] = None + + +@contextmanager +def global_tempdir_manager() -> Generator[None, None, None]: + global _tempdir_manager + with ExitStack() as stack: + old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack + try: + yield + finally: + _tempdir_manager = old_tempdir_manager + + +class TempDirectoryTypeRegistry: + """Manages temp directory behavior""" + + def __init__(self) -> None: + self._should_delete: Dict[str, bool] = {} + + def set_delete(self, kind: str, value: bool) -> None: + """Indicate whether a TempDirectory of the given kind should be + auto-deleted. + """ + self._should_delete[kind] = value + + def get_delete(self, kind: str) -> bool: + """Get configured auto-delete flag for a given TempDirectory type, + default True. + """ + return self._should_delete.get(kind, True) + + +_tempdir_registry: Optional[TempDirectoryTypeRegistry] = None + + +@contextmanager +def tempdir_registry() -> Generator[TempDirectoryTypeRegistry, None, None]: + """Provides a scoped global tempdir registry that can be used to dictate + whether directories should be deleted. + """ + global _tempdir_registry + old_tempdir_registry = _tempdir_registry + _tempdir_registry = TempDirectoryTypeRegistry() + try: + yield _tempdir_registry + finally: + _tempdir_registry = old_tempdir_registry + + +class _Default: + pass + + +_default = _Default() + + +class TempDirectory: + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + cleanup() + Deletes the temporary directory + + When used as a context manager, if the delete attribute is True, on + exiting the context the temporary directory is deleted. + """ + + def __init__( + self, + path: Optional[str] = None, + delete: Union[bool, None, _Default] = _default, + kind: str = "temp", + globally_managed: bool = False, + ignore_cleanup_errors: bool = True, + ): + super().__init__() + + if delete is _default: + if path is not None: + # If we were given an explicit directory, resolve delete option + # now. + delete = False + else: + # Otherwise, we wait until cleanup and see what + # tempdir_registry says. + delete = None + + # The only time we specify path is in for editables where it + # is the value of the --src option. + if path is None: + path = self._create(kind) + + self._path = path + self._deleted = False + self.delete = delete + self.kind = kind + self.ignore_cleanup_errors = ignore_cleanup_errors + + if globally_managed: + assert _tempdir_manager is not None + _tempdir_manager.enter_context(self) + + @property + def path(self) -> str: + assert not self._deleted, f"Attempted to access deleted path: {self._path}" + return self._path + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.path!r}>" + + def __enter__(self: _T) -> _T: + return self + + def __exit__(self, exc: Any, value: Any, tb: Any) -> None: + if self.delete is not None: + delete = self.delete + elif _tempdir_registry: + delete = _tempdir_registry.get_delete(self.kind) + else: + delete = True + + if delete: + self.cleanup() + + def _create(self, kind: str) -> str: + """Create a temporary directory and store its path in self.path""" + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) + logger.debug("Created temporary directory: %s", path) + return path + + def cleanup(self) -> None: + """Remove the temporary directory created and reset state""" + self._deleted = True + if not os.path.exists(self._path): + return + + errors: List[BaseException] = [] + + def onerror( + func: Callable[..., Any], + path: Path, + exc_val: BaseException, + ) -> None: + """Log a warning for a `rmtree` error and continue""" + formatted_exc = "\n".join( + traceback.format_exception_only(type(exc_val), exc_val) + ) + formatted_exc = formatted_exc.rstrip() # remove trailing new line + if func in (os.unlink, os.remove, os.rmdir): + logger.debug( + "Failed to remove a temporary file '%s' due to %s.\n", + path, + formatted_exc, + ) + else: + logger.debug("%s failed with %s.", func.__qualname__, formatted_exc) + errors.append(exc_val) + + if self.ignore_cleanup_errors: + try: + # first try with tenacity; retrying to handle ephemeral errors + rmtree(self._path, ignore_errors=False) + except OSError: + # last pass ignore/log all errors + rmtree(self._path, onexc=onerror) + if errors: + logger.warning( + "Failed to remove contents in a temporary directory '%s'.\n" + "You can safely remove it manually.", + self._path, + ) + else: + rmtree(self._path) + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original: str, delete: Optional[bool] = None) -> None: + self.original = original.rstrip("/\\") + super().__init__(delete=delete) + + @classmethod + def _generate_names(cls, name: str) -> Generator[str, None, None]: + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1 + ): + new_name = "~" + "".join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i + ): + new_name = "~" + "".join(candidate) + name + if new_name != name: + yield new_name + + def _create(self, kind: str) -> str: + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + path = os.path.realpath(path) + break + else: + # Final fallback on the default behavior. + path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) + + logger.debug("Created temporary directory: %s", path) + return path diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py new file mode 100644 index 0000000..78b5c13 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py @@ -0,0 +1,257 @@ +"""Utilities related archives. +""" + +import logging +import os +import shutil +import stat +import tarfile +import zipfile +from typing import Iterable, List, Optional +from zipfile import ZipInfo + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.filetypes import ( + BZ2_EXTENSIONS, + TAR_EXTENSIONS, + XZ_EXTENSIONS, + ZIP_EXTENSIONS, +) +from pip._internal.utils.misc import ensure_dir + +logger = logging.getLogger(__name__) + + +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + +try: + import bz2 # noqa + + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug("bz2 module is not available") + +try: + # Only for Python 3.3+ + import lzma # noqa + + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug("lzma module is not available") + + +def current_umask() -> int: + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def split_leading_dir(path: str) -> List[str]: + path = path.lstrip("/").lstrip("\\") + if "/" in path and ( + ("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path + ): + return path.split("/", 1) + elif "\\" in path: + return path.split("\\", 1) + else: + return [path, ""] + + +def has_leading_dir(paths: Iterable[str]) -> bool: + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def is_within_directory(directory: str, target: str) -> bool: + """ + Return true if the absolute path of target is within the directory + """ + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + return prefix == abs_directory + + +def set_extracted_file_to_default_mode_plus_executable(path: str) -> None: + """ + Make file present at path have execute for user/group/world + (chmod +x) is no-op on windows per python docs + """ + os.chmod(path, (0o777 & ~current_umask() | 0o111)) + + +def zip_item_is_executable(info: ZipInfo) -> bool: + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + return bool(mode and stat.S_ISREG(mode) and mode & 0o111) + + +def unzip_file(filename: str, location: str, flatten: bool = True) -> None: + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, "rb") + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if not is_within_directory(location, fn): + message = ( + "The zip file ({}) has a file ({}) trying to install " + "outside target directory ({})" + ) + raise InstallationError(message.format(filename, fn, location)) + if fn.endswith("/") or fn.endswith("\\"): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, "wb") as destfp: + shutil.copyfileobj(fp, destfp) + finally: + fp.close() + if zip_item_is_executable(info): + set_extracted_file_to_default_mode_plus_executable(fn) + finally: + zipfp.close() + + +def untar_file(filename: str, location: str) -> None: + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith(".gz") or filename.lower().endswith(".tgz"): + mode = "r:gz" + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = "r:bz2" + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = "r:xz" + elif filename.lower().endswith(".tar"): + mode = "r" + else: + logger.warning( + "Cannot determine compression type for file %s", + filename, + ) + mode = "r:*" + tar = tarfile.open(filename, mode, encoding="utf-8") + try: + leading = has_leading_dir([member.name for member in tar.getmembers()]) + for member in tar.getmembers(): + fn = member.name + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if not is_within_directory(location, path): + message = ( + "The tar file ({}) has a file ({}) trying to install " + "outside target directory ({})" + ) + raise InstallationError(message.format(filename, path, location)) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + tar._extract_member(member, path) + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + "In the tar file %s the member %s is invalid: %s", + filename, + member.name, + exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + "In the tar file %s the member %s is invalid: %s", + filename, + member.name, + exc, + ) + continue + ensure_dir(os.path.dirname(path)) + assert fp is not None + with open(path, "wb") as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + tar.utime(member, path) + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + set_extracted_file_to_default_mode_plus_executable(path) + finally: + tar.close() + + +def unpack_file( + filename: str, + location: str, + content_type: Optional[str] = None, +) -> None: + filename = os.path.realpath(filename) + if ( + content_type == "application/zip" + or filename.lower().endswith(ZIP_EXTENSIONS) + or zipfile.is_zipfile(filename) + ): + unzip_file(filename, location, flatten=not filename.endswith(".whl")) + elif ( + content_type == "application/x-gzip" + or tarfile.is_tarfile(filename) + or filename.lower().endswith(TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS) + ): + untar_file(filename, location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + "Cannot unpack file %s (downloaded from %s, content-type: %s); " + "cannot detect archive format", + filename, + location, + content_type, + ) + raise InstallationError(f"Cannot determine archive format of {location}") diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/urls.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/urls.py new file mode 100644 index 0000000..6ba2e04 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/urls.py @@ -0,0 +1,62 @@ +import os +import string +import urllib.parse +import urllib.request +from typing import Optional + +from .compat import WINDOWS + + +def get_url_scheme(url: str) -> Optional[str]: + if ":" not in url: + return None + return url.split(":", 1)[0].lower() + + +def path_to_url(path: str) -> str: + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib.parse.urljoin("file:", urllib.request.pathname2url(path)) + return url + + +def url_to_path(url: str) -> str: + """ + Convert a file: URL to a path. + """ + assert url.startswith( + "file:" + ), f"You can only turn file: urls into filenames (not {url!r})" + + _, netloc, path, _, _ = urllib.parse.urlsplit(url) + + if not netloc or netloc == "localhost": + # According to RFC 8089, same as empty authority. + netloc = "" + elif WINDOWS: + # If we have a UNC path, prepend UNC share notation. + netloc = "\\\\" + netloc + else: + raise ValueError( + f"non-local file URIs are not supported on this platform: {url!r}" + ) + + path = urllib.request.url2pathname(netloc + path) + + # On Windows, urlsplit parses the path as something like "/C:/Users/foo". + # This creates issues for path-related functions like io.open(), so we try + # to detect and strip the leading slash. + if ( + WINDOWS + and not netloc # Not UNC. + and len(path) >= 3 + and path[0] == "/" # Leading slash to strip. + and path[1] in string.ascii_letters # Drive letter. + and path[2:4] in (":", ":/") # Colon + end of string, or colon + absolute path. + ): + path = path[1:] + + return path diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py new file mode 100644 index 0000000..882e36f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py @@ -0,0 +1,104 @@ +import logging +import os +import re +import site +import sys +from typing import List, Optional + +logger = logging.getLogger(__name__) +_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile( + r"include-system-site-packages\s*=\s*(?Ptrue|false)" +) + + +def _running_under_venv() -> bool: + """Checks if sys.base_prefix and sys.prefix match. + + This handles PEP 405 compliant virtual environments. + """ + return sys.prefix != getattr(sys, "base_prefix", sys.prefix) + + +def _running_under_legacy_virtualenv() -> bool: + """Checks if sys.real_prefix is set. + + This handles virtual environments created with pypa's virtualenv. + """ + # pypa/virtualenv case + return hasattr(sys, "real_prefix") + + +def running_under_virtualenv() -> bool: + """True if we're running inside a virtual environment, False otherwise.""" + return _running_under_venv() or _running_under_legacy_virtualenv() + + +def _get_pyvenv_cfg_lines() -> Optional[List[str]]: + """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines + + Returns None, if it could not read/access the file. + """ + pyvenv_cfg_file = os.path.join(sys.prefix, "pyvenv.cfg") + try: + # Although PEP 405 does not specify, the built-in venv module always + # writes with UTF-8. (pypa/pip#8717) + with open(pyvenv_cfg_file, encoding="utf-8") as f: + return f.read().splitlines() # avoids trailing newlines + except OSError: + return None + + +def _no_global_under_venv() -> bool: + """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion + + PEP 405 specifies that when system site-packages are not supposed to be + visible from a virtual environment, `pyvenv.cfg` must contain the following + line: + + include-system-site-packages = false + + Additionally, log a warning if accessing the file fails. + """ + cfg_lines = _get_pyvenv_cfg_lines() + if cfg_lines is None: + # We're not in a "sane" venv, so assume there is no system + # site-packages access (since that's PEP 405's default state). + logger.warning( + "Could not access 'pyvenv.cfg' despite a virtual environment " + "being active. Assuming global site-packages is not accessible " + "in this environment." + ) + return True + + for line in cfg_lines: + match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line) + if match is not None and match.group("value") == "false": + return True + return False + + +def _no_global_under_legacy_virtualenv() -> bool: + """Check if "no-global-site-packages.txt" exists beside site.py + + This mirrors logic in pypa/virtualenv for determining whether system + site-packages are visible in the virtual environment. + """ + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_site_packages_file = os.path.join( + site_mod_dir, + "no-global-site-packages.txt", + ) + return os.path.exists(no_global_site_packages_file) + + +def virtualenv_no_global() -> bool: + """Returns a boolean, whether running in venv with no system site-packages.""" + # PEP 405 compliance needs to be checked first since virtualenv >=20 would + # return True for both checks, but is only able to use the PEP 405 config. + if _running_under_venv(): + return _no_global_under_venv() + + if _running_under_legacy_virtualenv(): + return _no_global_under_legacy_virtualenv() + + return False diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py b/myenv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py new file mode 100644 index 0000000..3551f8f --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py @@ -0,0 +1,134 @@ +"""Support functions for working with wheel files. +""" + +import logging +from email.message import Message +from email.parser import Parser +from typing import Tuple +from zipfile import BadZipFile, ZipFile + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import UnsupportedWheel + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def parse_wheel(wheel_zip: ZipFile, name: str) -> Tuple[str, Message]: + """Extract information from the provided wheel, ensuring it meets basic + standards. + + Returns the name of the .dist-info directory and the parsed WHEEL metadata. + """ + try: + info_dir = wheel_dist_info_dir(wheel_zip, name) + metadata = wheel_metadata(wheel_zip, info_dir) + version = wheel_version(metadata) + except UnsupportedWheel as e: + raise UnsupportedWheel(f"{name} has an invalid wheel, {str(e)}") + + check_compatibility(version, name) + + return info_dir, metadata + + +def wheel_dist_info_dir(source: ZipFile, name: str) -> str: + """Returns the name of the contained .dist-info directory. + + Raises AssertionError or UnsupportedWheel if not found, >1 found, or + it doesn't match the provided name. + """ + # Zip file path separators must be / + subdirs = {p.split("/", 1)[0] for p in source.namelist()} + + info_dirs = [s for s in subdirs if s.endswith(".dist-info")] + + if not info_dirs: + raise UnsupportedWheel(".dist-info directory not found") + + if len(info_dirs) > 1: + raise UnsupportedWheel( + "multiple .dist-info directories found: {}".format(", ".join(info_dirs)) + ) + + info_dir = info_dirs[0] + + info_dir_name = canonicalize_name(info_dir) + canonical_name = canonicalize_name(name) + if not info_dir_name.startswith(canonical_name): + raise UnsupportedWheel( + f".dist-info directory {info_dir!r} does not start with {canonical_name!r}" + ) + + return info_dir + + +def read_wheel_metadata_file(source: ZipFile, path: str) -> bytes: + try: + return source.read(path) + # BadZipFile for general corruption, KeyError for missing entry, + # and RuntimeError for password-protected files + except (BadZipFile, KeyError, RuntimeError) as e: + raise UnsupportedWheel(f"could not read {path!r} file: {e!r}") + + +def wheel_metadata(source: ZipFile, dist_info_dir: str) -> Message: + """Return the WHEEL metadata of an extracted wheel, if possible. + Otherwise, raise UnsupportedWheel. + """ + path = f"{dist_info_dir}/WHEEL" + # Zip file path separators must be / + wheel_contents = read_wheel_metadata_file(source, path) + + try: + wheel_text = wheel_contents.decode() + except UnicodeDecodeError as e: + raise UnsupportedWheel(f"error decoding {path!r}: {e!r}") + + # FeedParser (used by Parser) does not raise any exceptions. The returned + # message may have .defects populated, but for backwards-compatibility we + # currently ignore them. + return Parser().parsestr(wheel_text) + + +def wheel_version(wheel_data: Message) -> Tuple[int, ...]: + """Given WHEEL metadata, return the parsed Wheel-Version. + Otherwise, raise UnsupportedWheel. + """ + version_text = wheel_data["Wheel-Version"] + if version_text is None: + raise UnsupportedWheel("WHEEL is missing Wheel-Version") + + version = version_text.strip() + + try: + return tuple(map(int, version.split("."))) + except ValueError: + raise UnsupportedWheel(f"invalid Wheel-Version: {version!r}") + + +def check_compatibility(version: Tuple[int, ...], name: str) -> None: + """Raises errors or warns if called with an incompatible Wheel-Version. + + pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "{}'s Wheel-Version ({}) is not compatible with this version " + "of pip".format(name, ".".join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + "Installing from a newer Wheel-Version (%s)", + ".".join(map(str, version)), + ) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..b6beddb --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,15 @@ +# Expose a limited set of classes and functions so callers outside of +# the vcs package don't need to import deeper than `pip._internal.vcs`. +# (The test directory may still need to import from a vcs sub-package.) +# Import all vcs modules to register each VCS in the VcsSupport object. +import pip._internal.vcs.bazaar +import pip._internal.vcs.git +import pip._internal.vcs.mercurial +import pip._internal.vcs.subversion # noqa: F401 +from pip._internal.vcs.versioncontrol import ( # noqa: F401 + RemoteNotFoundError, + RemoteNotValidError, + is_url, + make_vcs_requirement_url, + vcs, +) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..920a97d3b83354b50d4747394413ff8abf351913 GIT binary patch literal 549 zcmZXQ%}OId6osq0O($lMK?XrkAzf^CI&M z^DOfQouw;xLO{Wlw?jq-a-qJ%J*T+!^LJ;b&!|qOcaz(Qv4^(#SJba+`Hkc^D_O}k z%lJy8wZ?1RT4|&^Cdm@h&AO(S^~`p*ZTeZCvpFBekL|GQVW;_Y1I7iocHzp^w!B1i z_@8+vwOX5r@_CKA**9_u`K<6c!p~YE7_ecL#AFUXH2amR(p=d9Xr)fcOvmz8!bjY{g~a5MDvcn0W|v&~>LT}Oqp0iDK}UW;2TIxUhGUBVx>B(hg0 zj18g?-#v{KR}jDsMyN_9M&PHxRiZ-o1Hy&%YOFz+IoO%dYAmXGxOet6{dyw23UFM> zVk#%#1>H%!e}bS-5IMCfU*+@6k9yaAyss_Xy& literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..098734a1e690838ce8e91dad2f25e04aa9f09d2c GIT binary patch literal 5041 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 XlRnPWuxRr;(%$ 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..060fdfaa6fb5fa183fc6f5a77606368b077ba79b GIT binary patch literal 12502 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..897b1bdde08d083528cc7bd5395c3c21e8d69abf GIT binary patch literal 29028 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..20a17ed --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,112 @@ +import logging +from typing import List, Optional, Tuple + +from pip._internal.utils.misc import HiddenText, display_path +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs.versioncontrol import ( + AuthInfo, + RemoteNotFoundError, + RevOptions, + VersionControl, + vcs, +) + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = "bzr" + dirname = ".bzr" + repo_name = "branch" + schemes = ( + "bzr+http", + "bzr+https", + "bzr+ssh", + "bzr+sftp", + "bzr+ftp", + "bzr+lp", + "bzr+file", + ) + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return ["-r", rev] + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info( + "Checking out %s%s to %s", + url, + rev_display, + display_path(dest), + ) + if verbosity <= 0: + flag = "--quiet" + elif verbosity == 1: + flag = "" + else: + flag = f"-{'v'*verbosity}" + cmd_args = make_command( + "checkout", "--lightweight", flag, rev_options.to_args(), url, dest + ) + self.run_command(cmd_args) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + self.run_command(make_command("switch", url), cwd=dest) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + output = self.run_command( + make_command("info"), show_stdout=False, stdout_only=True, cwd=dest + ) + if output.startswith("Standalone "): + # Older versions of pip used to create standalone branches. + # Convert the standalone branch to a checkout by calling "bzr bind". + cmd_args = make_command("bind", "-q", url) + self.run_command(cmd_args, cwd=dest) + + cmd_args = make_command("update", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// re-add it + url, rev, user_pass = super().get_url_rev_and_auth(url) + if url.startswith("ssh://"): + url = "bzr+" + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location: str) -> str: + urls = cls.run_command( + ["info"], show_stdout=False, stdout_only=True, cwd=location + ) + for line in urls.splitlines(): + line = line.strip() + for x in ("checkout of branch: ", "parent branch: "): + if line.startswith(x): + repo = line.split(x)[1] + if cls._is_local_repository(repo): + return path_to_url(repo) + return repo + raise RemoteNotFoundError + + @classmethod + def get_revision(cls, location: str) -> str: + revision = cls.run_command( + ["revno"], + show_stdout=False, + stdout_only=True, + cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/git.py b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..8c242cf --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,526 @@ +import logging +import os.path +import pathlib +import re +import urllib.parse +import urllib.request +from typing import List, Optional, Tuple + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.utils.misc import HiddenText, display_path, hide_url +from pip._internal.utils.subprocess import make_command +from pip._internal.vcs.versioncontrol import ( + AuthInfo, + RemoteNotFoundError, + RemoteNotValidError, + RevOptions, + VersionControl, + find_path_to_project_root_from_repo_root, + vcs, +) + +urlsplit = urllib.parse.urlsplit +urlunsplit = urllib.parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +GIT_VERSION_REGEX = re.compile( + r"^git version " # Prefix. + r"(\d+)" # Major. + r"\.(\d+)" # Dot, minor. + r"(?:\.(\d+))?" # Optional dot, patch. + r".*$" # Suffix, including any pre- and post-release segments we don't care about. +) + +HASH_REGEX = re.compile("^[a-fA-F0-9]{40}$") + +# SCP (Secure copy protocol) shorthand. e.g. 'git@example.com:foo/bar.git' +SCP_REGEX = re.compile( + r"""^ + # Optional user, e.g. 'git@' + (\w+@)? + # Server, e.g. 'github.com'. + ([^/:]+): + # The server-side path. e.g. 'user/project.git'. Must start with an + # alphanumeric character so as not to be confusable with a Windows paths + # like 'C:/foo/bar' or 'C:\foo\bar'. + (\w[^:]*) + $""", + re.VERBOSE, +) + + +def looks_like_hash(sha: str) -> bool: + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = "git" + dirname = ".git" + repo_name = "clone" + schemes = ( + "git+http", + "git+https", + "git+ssh", + "git+git", + "git+file", + ) + # Prevent the user's environment variables from interfering with pip: + # https://github.com/pypa/pip/issues/1130 + unset_environ = ("GIT_DIR", "GIT_WORK_TREE") + default_arg_rev = "HEAD" + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return [rev] + + def is_immutable_rev_checkout(self, url: str, dest: str) -> bool: + _, rev_options = self.get_url_rev_options(hide_url(url)) + if not rev_options.rev: + return False + if not self.is_commit_id_equal(dest, rev_options.rev): + # the current commit is different from rev, + # which means rev was something else than a commit hash + return False + # return False in the rare case rev is both a commit hash + # and a tag or a branch; we don't want to cache in that case + # because that branch/tag could point to something else in the future + is_tag_or_branch = bool(self.get_revision_sha(dest, rev_options.rev)[0]) + return not is_tag_or_branch + + def get_git_version(self) -> Tuple[int, ...]: + version = self.run_command( + ["version"], + command_desc="git version", + show_stdout=False, + stdout_only=True, + ) + match = GIT_VERSION_REGEX.match(version) + if not match: + logger.warning("Can't parse git version: %s", version) + return () + return (int(match.group(1)), int(match.group(2))) + + @classmethod + def get_current_branch(cls, location: str) -> Optional[str]: + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + # git-symbolic-ref exits with empty stdout if "HEAD" is a detached + # HEAD rather than a symbolic ref. In addition, the -q causes the + # command to exit with status code 1 instead of 128 in this case + # and to suppress the message to stderr. + args = ["symbolic-ref", "-q", "HEAD"] + output = cls.run_command( + args, + extra_ok_returncodes=(1,), + show_stdout=False, + stdout_only=True, + cwd=location, + ) + ref = output.strip() + + if ref.startswith("refs/heads/"): + return ref[len("refs/heads/") :] + + return None + + @classmethod + def get_revision_sha(cls, dest: str, rev: str) -> Tuple[Optional[str], bool]: + """ + Return (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + output = cls.run_command( + ["show-ref", rev], + cwd=dest, + show_stdout=False, + stdout_only=True, + on_returncode="ignore", + ) + refs = {} + # NOTE: We do not use splitlines here since that would split on other + # unicode separators, which can be maliciously used to install a + # different revision. + for line in output.strip().split("\n"): + line = line.rstrip("\r") + if not line: + continue + try: + ref_sha, ref_name = line.split(" ", maxsplit=2) + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError(f"unexpected show-ref line: {line!r}") + + refs[ref_name] = ref_sha + + branch_ref = f"refs/remotes/origin/{rev}" + tag_ref = f"refs/tags/{rev}" + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + @classmethod + def _should_fetch(cls, dest: str, rev: str) -> bool: + """ + Return true if rev is a ref or is a commit that we don't have locally. + + Branches and tags are not considered in this method because they are + assumed to be always available locally (which is a normal outcome of + ``git clone`` and ``git fetch --tags``). + """ + if rev.startswith("refs/"): + # Always fetch remote refs. + return True + + if not looks_like_hash(rev): + # Git fetch would fail with abbreviated commits. + return False + + if cls.has_commit(dest, rev): + # Don't fetch if we have the commit locally. + return False + + return True + + @classmethod + def resolve_revision( + cls, dest: str, url: HiddenText, rev_options: RevOptions + ) -> RevOptions: + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + # The arg_rev property's implementation for Git ensures that the + # rev return value is always non-None. + assert rev is not None + + sha, is_branch = cls.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options.branch_name = rev if is_branch else None + + return rev_options + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + + if not cls._should_fetch(dest, rev): + return rev_options + + # fetch the requested revision + cls.run_command( + make_command("fetch", "-q", url, rev_options.to_args()), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = cls.get_revision(dest, rev="FETCH_HEAD") + rev_options = rev_options.make_new(sha) + + return rev_options + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return cls.get_revision(dest) == name + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info("Cloning %s%s to %s", url, rev_display, display_path(dest)) + if verbosity <= 0: + flags: Tuple[str, ...] = ("--quiet",) + elif verbosity == 1: + flags = () + else: + flags = ("--verbose", "--progress") + if self.get_git_version() >= (2, 17): + # Git added support for partial clone in 2.17 + # https://git-scm.com/docs/partial-clone + # Speeds up cloning by functioning without a complete copy of repository + self.run_command( + make_command( + "clone", + "--filter=blob:none", + *flags, + url, + dest, + ) + ) + else: + self.run_command(make_command("clone", *flags, url, dest)) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, "branch_name", None) + logger.debug("Rev options %s, branch_name %s", rev_options, branch_name) + if branch_name is None: + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not self.is_commit_id_equal(dest, rev_options.rev): + cmd_args = make_command( + "checkout", + "-q", + rev_options.to_args(), + ) + self.run_command(cmd_args, cwd=dest) + elif self.get_current_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = f"origin/{branch_name}" + cmd_args = [ + "checkout", + "-b", + branch_name, + "--track", + track_branch, + ] + self.run_command(cmd_args, cwd=dest) + else: + sha = self.get_revision(dest) + rev_options = rev_options.make_new(sha) + + logger.info("Resolved %s to commit %s", url, rev_options.rev) + + #: repo may contain submodules + self.update_submodules(dest) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + self.run_command( + make_command("config", "remote.origin.url", url), + cwd=dest, + ) + cmd_args = make_command("checkout", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + # First fetch changes from the default remote + if self.get_git_version() >= (1, 9): + # fetch tags in addition to everything else + self.run_command(["fetch", "-q", "--tags"], cwd=dest) + else: + self.run_command(["fetch", "-q"], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.resolve_revision(dest, url, rev_options) + cmd_args = make_command("reset", "--hard", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + @classmethod + def get_remote_url(cls, location: str) -> str: + """ + Return URL of the first remote encountered. + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + # We need to pass 1 for extra_ok_returncodes since the command + # exits with return code 1 if there are no matching lines. + stdout = cls.run_command( + ["config", "--get-regexp", r"remote\..*\.url"], + extra_ok_returncodes=(1,), + show_stdout=False, + stdout_only=True, + cwd=location, + ) + remotes = stdout.splitlines() + try: + found_remote = remotes[0] + except IndexError: + raise RemoteNotFoundError + + for remote in remotes: + if remote.startswith("remote.origin.url "): + found_remote = remote + break + url = found_remote.split(" ")[1] + return cls._git_remote_to_pip_url(url.strip()) + + @staticmethod + def _git_remote_to_pip_url(url: str) -> str: + """ + Convert a remote url from what git uses to what pip accepts. + + There are 3 legal forms **url** may take: + + 1. A fully qualified url: ssh://git@example.com/foo/bar.git + 2. A local project.git folder: /path/to/bare/repository.git + 3. SCP shorthand for form 1: git@example.com:foo/bar.git + + Form 1 is output as-is. Form 2 must be converted to URI and form 3 must + be converted to form 1. + + See the corresponding test test_git_remote_url_to_pip() for examples of + sample inputs/outputs. + """ + if re.match(r"\w+://", url): + # This is already valid. Pass it though as-is. + return url + if os.path.exists(url): + # A local bare remote (git clone --mirror). + # Needs a file:// prefix. + return pathlib.PurePath(url).as_uri() + scp_match = SCP_REGEX.match(url) + if scp_match: + # Add an ssh:// prefix and replace the ':' with a '/'. + return scp_match.expand(r"ssh://\1\2/\3") + # Otherwise, bail out. + raise RemoteNotValidError(url) + + @classmethod + def has_commit(cls, location: str, rev: str) -> bool: + """ + Check if rev is a commit that is available in the local repository. + """ + try: + cls.run_command( + ["rev-parse", "-q", "--verify", "sha^" + rev], + cwd=location, + log_failed_cmd=False, + ) + except InstallationError: + return False + else: + return True + + @classmethod + def get_revision(cls, location: str, rev: Optional[str] = None) -> str: + if rev is None: + rev = "HEAD" + current_rev = cls.run_command( + ["rev-parse", rev], + show_stdout=False, + stdout_only=True, + cwd=location, + ) + return current_rev.strip() + + @classmethod + def get_subdirectory(cls, location: str) -> Optional[str]: + """ + Return the path to Python project root, relative to the repo root. + Return None if the project root is in the repo root. + """ + # find the repo root + git_dir = cls.run_command( + ["rev-parse", "--git-dir"], + show_stdout=False, + stdout_only=True, + cwd=location, + ).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + repo_root = os.path.abspath(os.path.join(git_dir, "..")) + return find_path_to_project_root_from_repo_root(location, repo_root) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don't + work with a ssh:// scheme (e.g. GitHub). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith("file"): + initial_slashes = path[: -len(path.lstrip("/"))] + newpath = initial_slashes + urllib.request.url2pathname(path).replace( + "\\", "/" + ).lstrip("/") + after_plus = scheme.find("+") + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + if "://" not in url: + assert "file:" not in url + url = url.replace("git+", "git+ssh://") + url, rev, user_pass = super().get_url_rev_and_auth(url) + url = url.replace("ssh://", "") + else: + url, rev, user_pass = super().get_url_rev_and_auth(url) + + return url, rev, user_pass + + @classmethod + def update_submodules(cls, location: str) -> None: + if not os.path.exists(os.path.join(location, ".gitmodules")): + return + cls.run_command( + ["submodule", "update", "--init", "--recursive", "-q"], + cwd=location, + ) + + @classmethod + def get_repository_root(cls, location: str) -> Optional[str]: + loc = super().get_repository_root(location) + if loc: + return loc + try: + r = cls.run_command( + ["rev-parse", "--show-toplevel"], + cwd=location, + show_stdout=False, + stdout_only=True, + on_returncode="raise", + log_failed_cmd=False, + ) + except BadCommand: + logger.debug( + "could not determine if %s is under git control " + "because git is not available", + location, + ) + return None + except InstallationError: + return None + return os.path.normpath(r.rstrip("\r\n")) + + @staticmethod + def should_add_vcs_url_prefix(repo_url: str) -> bool: + """In either https or ssh form, requirements must be prefixed with git+.""" + return True + + +vcs.register(Git) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..c183d41 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,163 @@ +import configparser +import logging +import os +from typing import List, Optional, Tuple + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.utils.misc import HiddenText, display_path +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs.versioncontrol import ( + RevOptions, + VersionControl, + find_path_to_project_root_from_repo_root, + vcs, +) + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = "hg" + dirname = ".hg" + repo_name = "clone" + schemes = ( + "hg+file", + "hg+http", + "hg+https", + "hg+ssh", + "hg+static-http", + ) + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return [f"--rev={rev}"] + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info( + "Cloning hg %s%s to %s", + url, + rev_display, + display_path(dest), + ) + if verbosity <= 0: + flags: Tuple[str, ...] = ("--quiet",) + elif verbosity == 1: + flags = () + elif verbosity == 2: + flags = ("--verbose",) + else: + flags = ("--verbose", "--debug") + self.run_command(make_command("clone", "--noupdate", *flags, url, dest)) + self.run_command( + make_command("update", *flags, rev_options.to_args()), + cwd=dest, + ) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + repo_config = os.path.join(dest, self.dirname, "hgrc") + config = configparser.RawConfigParser() + try: + config.read(repo_config) + config.set("paths", "default", url.secret) + with open(repo_config, "w") as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning("Could not switch Mercurial repository to %s: %s", url, exc) + else: + cmd_args = make_command("update", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + self.run_command(["pull", "-q"], cwd=dest) + cmd_args = make_command("update", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location: str) -> str: + url = cls.run_command( + ["showconfig", "paths.default"], + show_stdout=False, + stdout_only=True, + cwd=location, + ).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location: str) -> str: + """ + Return the repository-local changeset revision number, as an integer. + """ + current_revision = cls.run_command( + ["parents", "--template={rev}"], + show_stdout=False, + stdout_only=True, + cwd=location, + ).strip() + return current_revision + + @classmethod + def get_requirement_revision(cls, location: str) -> str: + """ + Return the changeset identification hash, as a 40-character + hexadecimal string + """ + current_rev_hash = cls.run_command( + ["parents", "--template={node}"], + show_stdout=False, + stdout_only=True, + cwd=location, + ).strip() + return current_rev_hash + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """Always assume the versions don't match""" + return False + + @classmethod + def get_subdirectory(cls, location: str) -> Optional[str]: + """ + Return the path to Python project root, relative to the repo root. + Return None if the project root is in the repo root. + """ + # find the repo root + repo_root = cls.run_command( + ["root"], show_stdout=False, stdout_only=True, cwd=location + ).strip() + if not os.path.isabs(repo_root): + repo_root = os.path.abspath(os.path.join(location, repo_root)) + return find_path_to_project_root_from_repo_root(location, repo_root) + + @classmethod + def get_repository_root(cls, location: str) -> Optional[str]: + loc = super().get_repository_root(location) + if loc: + return loc + try: + r = cls.run_command( + ["root"], + cwd=location, + show_stdout=False, + stdout_only=True, + on_returncode="raise", + log_failed_cmd=False, + ) + except BadCommand: + logger.debug( + "could not determine if %s is under hg control " + "because hg is not available", + location, + ) + return None + except InstallationError: + return None + return os.path.normpath(r.rstrip("\r\n")) + + +vcs.register(Mercurial) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..16d93a6 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,324 @@ +import logging +import os +import re +from typing import List, Optional, Tuple + +from pip._internal.utils.misc import ( + HiddenText, + display_path, + is_console_interactive, + is_installable_dir, + split_auth_from_netloc, +) +from pip._internal.utils.subprocess import CommandArgs, make_command +from pip._internal.vcs.versioncontrol import ( + AuthInfo, + RemoteNotFoundError, + RevOptions, + VersionControl, + vcs, +) + +logger = logging.getLogger(__name__) + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r"(.*)") + + +class Subversion(VersionControl): + name = "svn" + dirname = ".svn" + repo_name = "checkout" + schemes = ("svn+ssh", "svn+http", "svn+https", "svn+svn", "svn+file") + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url: str) -> bool: + return True + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return ["-r", rev] + + @classmethod + def get_revision(cls, location: str) -> str: + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, _ in os.walk(location): + if cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, "entries") + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._get_svn_url_rev(base) + + if base == location: + assert dirurl is not None + base = dirurl + "/" # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return str(revision) + + @classmethod + def get_netloc_and_auth( + cls, netloc: str, scheme: str + ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]: + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == "ssh": + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super().get_netloc_and_auth(netloc, scheme) + + return split_auth_from_netloc(netloc) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + # hotfix the URL scheme after removing svn+ from svn+ssh:// re-add it + url, rev, user_pass = super().get_url_rev_and_auth(url) + if url.startswith("ssh://"): + url = "svn+" + url + return url, rev, user_pass + + @staticmethod + def make_rev_args( + username: Optional[str], password: Optional[HiddenText] + ) -> CommandArgs: + extra_args: CommandArgs = [] + if username: + extra_args += ["--username", username] + if password: + extra_args += ["--password", password] + + return extra_args + + @classmethod + def get_remote_url(cls, location: str) -> str: + # In cases where the source is in a subdirectory, we have to look up in + # the location until we find a valid project root. + orig_location = location + while not is_installable_dir(location): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding a Python project. + logger.warning( + "Could not find Python project for directory %s (tried all " + "parent directories)", + orig_location, + ) + raise RemoteNotFoundError + + url, _rev = cls._get_svn_url_rev(location) + if url is None: + raise RemoteNotFoundError + + return url + + @classmethod + def _get_svn_url_rev(cls, location: str) -> Tuple[Optional[str], int]: + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, cls.dirname, "entries") + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = "" + + url = None + if data.startswith("8") or data.startswith("9") or data.startswith("10"): + entries = list(map(str.splitlines, data.split("\n\x0c\n"))) + del entries[0][0] # get rid of the '8' + url = entries[0][3] + revs = [int(d[9]) for d in entries if len(d) > 9 and d[9]] + [0] + elif data.startswith("= 1.7 + # Note that using get_remote_call_options is not necessary here + # because `svn info` is being run against a local directory. + # We don't need to worry about making sure interactive mode + # is being used to prompt for passwords, because passwords + # are only potentially needed for remote server requests. + xml = cls.run_command( + ["info", "--xml", location], + show_stdout=False, + stdout_only=True, + ) + match = _svn_info_xml_url_re.search(xml) + assert match is not None + url = match.group(1) + revs = [int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """Always assume the versions don't match""" + return False + + def __init__(self, use_interactive: Optional[bool] = None) -> None: + if use_interactive is None: + use_interactive = is_console_interactive() + self.use_interactive = use_interactive + + # This member is used to cache the fetched version of the current + # ``svn`` client. + # Special value definitions: + # None: Not evaluated yet. + # Empty tuple: Could not parse version. + self._vcs_version: Optional[Tuple[int, ...]] = None + + super().__init__() + + def call_vcs_version(self) -> Tuple[int, ...]: + """Query the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + # svn, version 1.12.0-SlikSvn (SlikSvn/1.12.0) + # compiled May 28 2019, 13:44:56 on x86_64-microsoft-windows6.2 + version_prefix = "svn, version " + version = self.run_command(["--version"], show_stdout=False, stdout_only=True) + if not version.startswith(version_prefix): + return () + + version = version[len(version_prefix) :].split()[0] + version_list = version.partition("-")[0].split(".") + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return () + + return parsed_version + + def get_vcs_version(self) -> Tuple[int, ...]: + """Return the version of the currently installed Subversion client. + + If the version of the Subversion client has already been queried, + a cached value will be used. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + if self._vcs_version is not None: + # Use cached version, if available. + # If parsing the version failed previously (empty tuple), + # do not attempt to parse it again. + return self._vcs_version + + vcs_version = self.call_vcs_version() + self._vcs_version = vcs_version + return vcs_version + + def get_remote_call_options(self) -> CommandArgs: + """Return options to be used on calls to Subversion that contact the server. + + These options are applicable for the following ``svn`` subcommands used + in this class. + + - checkout + - switch + - update + + :return: A list of command line arguments to pass to ``svn``. + """ + if not self.use_interactive: + # --non-interactive switch is available since Subversion 0.14.4. + # Subversion < 1.8 runs in interactive mode by default. + return ["--non-interactive"] + + svn_version = self.get_vcs_version() + # By default, Subversion >= 1.8 runs in non-interactive mode if + # stdin is not a TTY. Since that is how pip invokes SVN, in + # call_subprocess(), pip must pass --force-interactive to ensure + # the user can be prompted for a password, if required. + # SVN added the --force-interactive option in SVN 1.8. Since + # e.g. RHEL/CentOS 7, which is supported until 2024, ships with + # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip + # can't safely add the option if the SVN version is < 1.8 (or unknown). + if svn_version >= (1, 8): + return ["--force-interactive"] + + return [] + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info( + "Checking out %s%s to %s", + url, + rev_display, + display_path(dest), + ) + if verbosity <= 0: + flag = "--quiet" + else: + flag = "" + cmd_args = make_command( + "checkout", + flag, + self.get_remote_call_options(), + rev_options.to_args(), + url, + dest, + ) + self.run_command(cmd_args) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + cmd_args = make_command( + "switch", + self.get_remote_call_options(), + rev_options.to_args(), + url, + dest, + ) + self.run_command(cmd_args) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + cmd_args = make_command( + "update", + self.get_remote_call_options(), + rev_options.to_args(), + dest, + ) + self.run_command(cmd_args) + + +vcs.register(Subversion) diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py new file mode 100644 index 0000000..46ca279 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py @@ -0,0 +1,705 @@ +"""Handles all VCS (version control) support""" + +import logging +import os +import shutil +import sys +import urllib.parse +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Iterable, + Iterator, + List, + Mapping, + Optional, + Tuple, + Type, + Union, +) + +from pip._internal.cli.spinners import SpinnerInterface +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.utils.misc import ( + HiddenText, + ask_path_exists, + backup_dir, + display_path, + hide_url, + hide_value, + is_installable_dir, + rmtree, +) +from pip._internal.utils.subprocess import ( + CommandArgs, + call_subprocess, + format_command_args, + make_command, +) +from pip._internal.utils.urls import get_url_scheme + +if TYPE_CHECKING: + # Literal was introduced in Python 3.8. + # + # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7. + from typing import Literal + + +__all__ = ["vcs"] + + +logger = logging.getLogger(__name__) + +AuthInfo = Tuple[Optional[str], Optional[str]] + + +def is_url(name: str) -> bool: + """ + Return true if the name looks like a URL. + """ + scheme = get_url_scheme(name) + if scheme is None: + return False + return scheme in ["http", "https", "file", "ftp"] + vcs.all_schemes + + +def make_vcs_requirement_url( + repo_url: str, rev: str, project_name: str, subdir: Optional[str] = None +) -> str: + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = project_name.replace("-", "_") + req = f"{repo_url}@{rev}#egg={egg_project_name}" + if subdir: + req += f"&subdirectory={subdir}" + + return req + + +def find_path_to_project_root_from_repo_root( + location: str, repo_root: str +) -> Optional[str]: + """ + Find the the Python project's root by searching up the filesystem from + `location`. Return the path to project root relative to `repo_root`. + Return None if the project root is `repo_root`, or cannot be found. + """ + # find project root. + orig_location = location + while not is_installable_dir(location): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding a Python project. + logger.warning( + "Could not find a Python project for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + if os.path.samefile(repo_root, location): + return None + + return os.path.relpath(location, repo_root) + + +class RemoteNotFoundError(Exception): + pass + + +class RemoteNotValidError(Exception): + def __init__(self, url: str): + super().__init__(url) + self.url = url + + +class RevOptions: + + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Instances of this class should be treated as if immutable. + """ + + def __init__( + self, + vc_class: Type["VersionControl"], + rev: Optional[str] = None, + extra_args: Optional[CommandArgs] = None, + ) -> None: + """ + Args: + vc_class: a VersionControl subclass. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + if extra_args is None: + extra_args = [] + + self.extra_args = extra_args + self.rev = rev + self.vc_class = vc_class + self.branch_name: Optional[str] = None + + def __repr__(self) -> str: + return f"" + + @property + def arg_rev(self) -> Optional[str]: + if self.rev is None: + return self.vc_class.default_arg_rev + + return self.rev + + def to_args(self) -> CommandArgs: + """ + Return the VCS-specific command arguments. + """ + args: CommandArgs = [] + rev = self.arg_rev + if rev is not None: + args += self.vc_class.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self) -> str: + if not self.rev: + return "" + + return f" (to revision {self.rev})" + + def make_new(self, rev: str) -> "RevOptions": + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport: + _registry: Dict[str, "VersionControl"] = {} + schemes = ["ssh", "git", "hg", "bzr", "sftp", "svn"] + + def __init__(self) -> None: + # Register more schemes with urlparse for various version control + # systems + urllib.parse.uses_netloc.extend(self.schemes) + super().__init__() + + def __iter__(self) -> Iterator[str]: + return self._registry.__iter__() + + @property + def backends(self) -> List["VersionControl"]: + return list(self._registry.values()) + + @property + def dirnames(self) -> List[str]: + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self) -> List[str]: + schemes: List[str] = [] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls: Type["VersionControl"]) -> None: + if not hasattr(cls, "name"): + logger.warning("Cannot register VCS %s", cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls() + logger.debug("Registered VCS backend: %s", cls.name) + + def unregister(self, name: str) -> None: + if name in self._registry: + del self._registry[name] + + def get_backend_for_dir(self, location: str) -> Optional["VersionControl"]: + """ + Return a VersionControl object if a repository of that type is found + at the given directory. + """ + vcs_backends = {} + for vcs_backend in self._registry.values(): + repo_path = vcs_backend.get_repository_root(location) + if not repo_path: + continue + logger.debug("Determine that %s uses VCS: %s", location, vcs_backend.name) + vcs_backends[repo_path] = vcs_backend + + if not vcs_backends: + return None + + # Choose the VCS in the inner-most directory. Since all repository + # roots found here would be either `location` or one of its + # parents, the longest path should have the most path components, + # i.e. the backend representing the inner-most repository. + inner_most_repo_path = max(vcs_backends, key=len) + return vcs_backends[inner_most_repo_path] + + def get_backend_for_scheme(self, scheme: str) -> Optional["VersionControl"]: + """ + Return a VersionControl object or None. + """ + for vcs_backend in self._registry.values(): + if scheme in vcs_backend.schemes: + return vcs_backend + return None + + def get_backend(self, name: str) -> Optional["VersionControl"]: + """ + Return a VersionControl object or None. + """ + name = name.lower() + return self._registry.get(name) + + +vcs = VcsSupport() + + +class VersionControl: + name = "" + dirname = "" + repo_name = "" + # List of supported schemes for this Version Control + schemes: Tuple[str, ...] = () + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ: Tuple[str, ...] = () + default_arg_rev: Optional[str] = None + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url: str) -> bool: + """ + Return whether the vcs prefix (e.g. "git+") should be added to a + repository's remote url when used in a requirement. + """ + return not remote_url.lower().startswith(f"{cls.name}:") + + @classmethod + def get_subdirectory(cls, location: str) -> Optional[str]: + """ + Return the path to Python project root, relative to the repo root. + Return None if the project root is in the repo root. + """ + return None + + @classmethod + def get_requirement_revision(cls, repo_dir: str) -> str: + """ + Return the revision string that should be used in a requirement. + """ + return cls.get_revision(repo_dir) + + @classmethod + def get_src_requirement(cls, repo_dir: str, project_name: str) -> str: + """ + Return the requirement string to use to redownload the files + currently at the given repository directory. + + Args: + project_name: the (unescaped) project name. + + The return value has a form similar to the following: + + {repository_url}@{revision}#egg={project_name} + """ + repo_url = cls.get_remote_url(repo_dir) + + if cls.should_add_vcs_url_prefix(repo_url): + repo_url = f"{cls.name}+{repo_url}" + + revision = cls.get_requirement_revision(repo_dir) + subdir = cls.get_subdirectory(repo_dir) + req = make_vcs_requirement_url(repo_url, revision, project_name, subdir=subdir) + + return req + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def is_immutable_rev_checkout(self, url: str, dest: str) -> bool: + """ + Return true if the commit hash checked out at dest matches + the revision in url. + + Always return False, if the VCS does not support immutable commit + hashes. + + This method does not check if there are local uncommitted changes + in dest after checkout, as pip currently has no use case for that. + """ + return False + + @classmethod + def make_rev_options( + cls, rev: Optional[str] = None, extra_args: Optional[CommandArgs] = None + ) -> RevOptions: + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(cls, rev, extra_args=extra_args) + + @classmethod + def _is_local_repository(cls, repo: str) -> bool: + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or bool(drive) + + @classmethod + def get_netloc_and_auth( + cls, netloc: str, scheme: str + ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]: + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) + if "+" not in scheme: + raise ValueError( + f"Sorry, {url!r} is a malformed VCS url. " + "The format is +://, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp" + ) + # Remove the vcs prefix. + scheme = scheme.split("+", 1)[1] + netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) + rev = None + if "@" in path: + path, rev = path.rsplit("@", 1) + if not rev: + raise InstallationError( + f"The URL {url!r} has an empty revision (after @) " + "which is not supported. Include a revision after @ " + "or remove @ from the URL." + ) + url = urllib.parse.urlunsplit((scheme, netloc, path, query, "")) + return url, rev, user_pass + + @staticmethod + def make_rev_args( + username: Optional[str], password: Optional[HiddenText] + ) -> CommandArgs: + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url: HiddenText) -> Tuple[HiddenText, RevOptions]: + """ + Return the URL and RevOptions object to use in obtain(), + as a tuple (url, rev_options). + """ + secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret) + username, secret_password = user_pass + password: Optional[HiddenText] = None + if secret_password is not None: + password = hide_value(secret_password) + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return hide_url(secret_url), rev_options + + @staticmethod + def normalize_url(url: str) -> str: + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib.parse.unquote(url).rstrip("/") + + @classmethod + def compare_urls(cls, url1: str, url2: str) -> bool: + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return cls.normalize_url(url1) == cls.normalize_url(url2) + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + verbosity: verbosity level. + """ + raise NotImplementedError + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def obtain(self, dest: str, url: HiddenText, verbosity: int) -> None: + """ + Install or update in editable mode the package represented by this + VersionControl object. + + :param dest: the repository directory in which to install or update. + :param url: the repository URL starting with a vcs prefix. + :param verbosity: verbosity level. + """ + url, rev_options = self.get_url_rev_options(url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options, verbosity=verbosity) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_remote_url(dest) + if self.compare_urls(existing_url, url.secret): + logger.debug( + "%s in %s exists, and has correct URL (%s)", + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + "Updating %s %s%s", + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, url, rev_options) + else: + logger.info("Skipping because already up-to-date.") + return + + logger.warning( + "%s %s in %s exists with URL %s", + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ("(s)witch, (i)gnore, (w)ipe, (b)ackup ", ("s", "i", "w", "b")) + else: + logger.warning( + "Directory %s already exists, and is not a %s %s.", + dest, + self.name, + self.repo_name, + ) + # https://github.com/python/mypy/issues/1174 + prompt = ("(i)gnore, (w)ipe, (b)ackup ", ("i", "w", "b")) # type: ignore + + logger.warning( + "The plan is to install the %s repository %s", + self.name, + url, + ) + response = ask_path_exists(f"What to do? {prompt[0]}", prompt[1]) + + if response == "a": + sys.exit(-1) + + if response == "w": + logger.warning("Deleting %s", display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options, verbosity=verbosity) + return + + if response == "b": + dest_dir = backup_dir(dest) + logger.warning("Backing up %s to %s", display_path(dest), dest_dir) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options, verbosity=verbosity) + return + + # Do nothing if the response is "i". + if response == "s": + logger.info( + "Switching %s %s to %s%s", + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + + def unpack(self, location: str, url: HiddenText, verbosity: int) -> None: + """ + Clean up current location and download the url repository + (and vcs infos) into location + + :param url: the repository URL starting with a vcs prefix. + :param verbosity: verbosity level. + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location, url=url, verbosity=verbosity) + + @classmethod + def get_remote_url(cls, location: str) -> str: + """ + Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + raise NotImplementedError + + @classmethod + def get_revision(cls, location: str) -> str: + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd: Union[List[str], CommandArgs], + show_stdout: bool = True, + cwd: Optional[str] = None, + on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise", + extra_ok_returncodes: Optional[Iterable[int]] = None, + command_desc: Optional[str] = None, + extra_environ: Optional[Mapping[str, Any]] = None, + spinner: Optional[SpinnerInterface] = None, + log_failed_cmd: bool = True, + stdout_only: bool = False, + ) -> str: + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = make_command(cls.name, *cmd) + if command_desc is None: + command_desc = format_command_args(cmd) + try: + return call_subprocess( + cmd, + show_stdout, + cwd, + on_returncode=on_returncode, + extra_ok_returncodes=extra_ok_returncodes, + command_desc=command_desc, + extra_environ=extra_environ, + unset_environ=cls.unset_environ, + spinner=spinner, + log_failed_cmd=log_failed_cmd, + stdout_only=stdout_only, + ) + except FileNotFoundError: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + raise BadCommand( + f"Cannot find command {cls.name!r} - do you have " + f"{cls.name!r} installed and in your PATH?" + ) + except PermissionError: + # errno.EACCES = Permission denied + # This error occurs, for instance, when the command is installed + # only for another user. So, the current user don't have + # permission to call the other user command. + raise BadCommand( + f"No permission to execute {cls.name!r} - install it " + f"locally, globally (ask admin), or check your PATH. " + f"See possible solutions at " + f"https://pip.pypa.io/en/latest/reference/pip_freeze/" + f"#fixing-permission-denied." + ) + + @classmethod + def is_repository_directory(cls, path: str) -> bool: + """ + Return whether a directory path is a repository directory. + """ + logger.debug("Checking in %s for %s (%s)...", path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def get_repository_root(cls, location: str) -> Optional[str]: + """ + Return the "root" (top-level) directory controlled by the vcs, + or `None` if the directory is not in any. + + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For + example, the Git override checks that Git is actually available. + """ + if cls.is_repository_directory(location): + return location + return None diff --git a/myenv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py b/myenv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py new file mode 100644 index 0000000..b1debe3 --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py @@ -0,0 +1,354 @@ +"""Orchestrator for building wheels from InstallRequirements. +""" + +import logging +import os.path +import re +import shutil +from typing import Iterable, List, Optional, Tuple + +from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version +from pip._vendor.packaging.version import InvalidVersion, Version + +from pip._internal.cache import WheelCache +from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel +from pip._internal.metadata import FilesystemWheel, get_wheel_distribution +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.operations.build.wheel import build_wheel_pep517 +from pip._internal.operations.build.wheel_editable import build_wheel_editable +from pip._internal.operations.build.wheel_legacy import build_wheel_legacy +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ensure_dir, hash_file +from pip._internal.utils.setuptools_build import make_setuptools_clean_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + +_egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE) + +BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] + + +def _contains_egg_info(s: str) -> bool: + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def _should_build( + req: InstallRequirement, + need_wheel: bool, +) -> bool: + """Return whether an InstallRequirement should be built into a wheel.""" + if req.constraint: + # never build requirements that are merely constraints + return False + if req.is_wheel: + if need_wheel: + logger.info( + "Skipping %s, due to already being wheel.", + req.name, + ) + return False + + if need_wheel: + # i.e. pip wheel, not pip install + return True + + # From this point, this concerns the pip install command only + # (need_wheel=False). + + if not req.source_dir: + return False + + if req.editable: + # we only build PEP 660 editable requirements + return req.supports_pyproject_editable() + + return True + + +def should_build_for_wheel_command( + req: InstallRequirement, +) -> bool: + return _should_build(req, need_wheel=True) + + +def should_build_for_install_command( + req: InstallRequirement, +) -> bool: + return _should_build(req, need_wheel=False) + + +def _should_cache( + req: InstallRequirement, +) -> Optional[bool]: + """ + Return whether a built InstallRequirement can be stored in the persistent + wheel cache, assuming the wheel cache is available, and _should_build() + has determined a wheel needs to be built. + """ + if req.editable or not req.source_dir: + # never cache editable requirements + return False + + if req.link and req.link.is_vcs: + # VCS checkout. Do not cache + # unless it points to an immutable commit hash. + assert not req.editable + assert req.source_dir + vcs_backend = vcs.get_backend_for_scheme(req.link.scheme) + assert vcs_backend + if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir): + return True + return False + + assert req.link + base, ext = req.link.splitext() + if _contains_egg_info(base): + return True + + # Otherwise, do not cache. + return False + + +def _get_cache_dir( + req: InstallRequirement, + wheel_cache: WheelCache, +) -> str: + """Return the persistent or temporary cache directory where the built + wheel need to be stored. + """ + cache_available = bool(wheel_cache.cache_dir) + assert req.link + if cache_available and _should_cache(req): + cache_dir = wheel_cache.get_path_for_link(req.link) + else: + cache_dir = wheel_cache.get_ephem_path_for_link(req.link) + return cache_dir + + +def _verify_one(req: InstallRequirement, wheel_path: str) -> None: + canonical_name = canonicalize_name(req.name or "") + w = Wheel(os.path.basename(wheel_path)) + if canonicalize_name(w.name) != canonical_name: + raise InvalidWheelFilename( + f"Wheel has unexpected file name: expected {canonical_name!r}, " + f"got {w.name!r}", + ) + dist = get_wheel_distribution(FilesystemWheel(wheel_path), canonical_name) + dist_verstr = str(dist.version) + if canonicalize_version(dist_verstr) != canonicalize_version(w.version): + raise InvalidWheelFilename( + f"Wheel has unexpected file name: expected {dist_verstr!r}, " + f"got {w.version!r}", + ) + metadata_version_value = dist.metadata_version + if metadata_version_value is None: + raise UnsupportedWheel("Missing Metadata-Version") + try: + metadata_version = Version(metadata_version_value) + except InvalidVersion: + msg = f"Invalid Metadata-Version: {metadata_version_value}" + raise UnsupportedWheel(msg) + if metadata_version >= Version("1.2") and not isinstance(dist.version, Version): + raise UnsupportedWheel( + f"Metadata 1.2 mandates PEP 440 version, but {dist_verstr!r} is not" + ) + + +def _build_one( + req: InstallRequirement, + output_dir: str, + verify: bool, + build_options: List[str], + global_options: List[str], + editable: bool, +) -> Optional[str]: + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + artifact = "editable" if editable else "wheel" + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning( + "Building %s for %s failed: %s", + artifact, + req.name, + e, + ) + return None + + # Install build deps into temporary directory (PEP 518) + with req.build_env: + wheel_path = _build_one_inside_env( + req, output_dir, build_options, global_options, editable + ) + if wheel_path and verify: + try: + _verify_one(req, wheel_path) + except (InvalidWheelFilename, UnsupportedWheel) as e: + logger.warning("Built %s for %s is invalid: %s", artifact, req.name, e) + return None + return wheel_path + + +def _build_one_inside_env( + req: InstallRequirement, + output_dir: str, + build_options: List[str], + global_options: List[str], + editable: bool, +) -> Optional[str]: + with TempDirectory(kind="wheel") as temp_dir: + assert req.name + if req.use_pep517: + assert req.metadata_directory + assert req.pep517_backend + if global_options: + logger.warning( + "Ignoring --global-option when building %s using PEP 517", req.name + ) + if build_options: + logger.warning( + "Ignoring --build-option when building %s using PEP 517", req.name + ) + if editable: + wheel_path = build_wheel_editable( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_pep517( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_legacy( + name=req.name, + setup_py_path=req.setup_py_path, + source_dir=req.unpacked_source_directory, + global_options=global_options, + build_options=build_options, + tempd=temp_dir.path, + ) + + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + wheel_hash, length = hash_file(wheel_path) + shutil.move(wheel_path, dest_path) + logger.info( + "Created wheel for %s: filename=%s size=%d sha256=%s", + req.name, + wheel_name, + length, + wheel_hash.hexdigest(), + ) + logger.info("Stored in directory: %s", output_dir) + return dest_path + except Exception as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, + e, + ) + # Ignore return, we can't do anything else useful. + if not req.use_pep517: + _clean_one_legacy(req, global_options) + return None + + +def _clean_one_legacy(req: InstallRequirement, global_options: List[str]) -> bool: + clean_args = make_setuptools_clean_args( + req.setup_py_path, + global_options=global_options, + ) + + logger.info("Running setup.py clean for %s", req.name) + try: + call_subprocess( + clean_args, command_desc="python setup.py clean", cwd=req.source_dir + ) + return True + except Exception: + logger.error("Failed cleaning build dir for %s", req.name) + return False + + +def build( + requirements: Iterable[InstallRequirement], + wheel_cache: WheelCache, + verify: bool, + build_options: List[str], + global_options: List[str], +) -> BuildResult: + """Build wheels. + + :return: The list of InstallRequirement that succeeded to build and + the list of InstallRequirement that failed to build. + """ + if not requirements: + return [], [] + + # Build the wheels. + logger.info( + "Building wheels for collected packages: %s", + ", ".join(req.name for req in requirements), # type: ignore + ) + + with indent_log(): + build_successes, build_failures = [], [] + for req in requirements: + assert req.name + cache_dir = _get_cache_dir(req, wheel_cache) + wheel_file = _build_one( + req, + cache_dir, + verify, + build_options, + global_options, + req.editable and req.permit_editable_wheels, + ) + if wheel_file: + # Record the download origin in the cache + if req.download_info is not None: + # download_info is guaranteed to be set because when we build an + # InstallRequirement it has been through the preparer before, but + # let's be cautious. + wheel_cache.record_download_origin(cache_dir, req.download_info) + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + req.local_file_path = req.link.file_path + assert req.link.is_wheel + build_successes.append(req) + else: + build_failures.append(req) + + # notify success/failure + if build_successes: + logger.info( + "Successfully built %s", + " ".join([req.name for req in build_successes]), # type: ignore + ) + if build_failures: + logger.info( + "Failed to build %s", + " ".join([req.name for req in build_failures]), # type: ignore + ) + # Return a list of requirements that failed to build + return build_successes, build_failures diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/__init__.py b/myenv/lib/python3.12/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..c1884ba --- /dev/null +++ b/myenv/lib/python3.12/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,121 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("certifi") + vendored("colorama") + vendored("distlib") + vendored("distro") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("six.moves.urllib.parse") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pep517") + vendored("pkg_resources") + vendored("platformdirs") + vendored("progress") + vendored("requests") + vendored("requests.exceptions") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") + vendored("resolvelib") + vendored("rich") + vendored("rich.console") + vendored("rich.highlighter") + vendored("rich.logging") + vendored("rich.markup") + vendored("rich.progress") + vendored("rich.segment") + vendored("rich.style") + vendored("rich.text") + vendored("rich.traceback") + vendored("tenacity") + vendored("tomli") + vendored("truststore") + vendored("urllib3") diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bfa7ce4cc0881270833e45cd5ee5da624788e4b GIT binary patch literal 4711 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 R#6WI^{bIf8lR5+3{||-XW6A&k literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc b/myenv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2f28a16ae7c87e4a10e4e452f35f83c67b2fc0d GIT binary patch literal 122068 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

      _@oh7oe)-!@t9+djI)kq_EvpSAF8 z*(X|CIC2u^7II`!V$bSeLs^S@B<^|QMrA~&W9w@5ar)+pjqVcAl|C>zn3x?rNjWeI5P4wTjP&XK_t!OCO8$GDNBDB}hyxW*a*iRa%ziUW=L3YjP62gp}r=$d4j_xet~a z+|b$=%4iAKQV`xmEYaj<22#PP!tp(YleXvF9z27K)Ix|G-uKn!Q9LPY>H^_bu*lvw zfRKMM-INM+-&^`_GN2H9o@LMo6U3hz`1or-Kz8+ zEg$4I z_VhjAHJj{PtES}QsE^OY3B1s${5bg|Pb7V$%`TJrb~1M*HgKbAVV}rUO0Y7GIk&CK zd>UC0kC2Bkx+;-tugj4cat*Bp3HTcTWpVw&X&)FSn4A#xb%G&;XPCRjTt1pFPh3;E zH5k1z*GL)QPfYf`)JQi!3#KC%4^%(u_2gJh3IsQwV%e1u+`KxfQCQ0>4PEIO(m3UC z1}%#*UNsT*b~Q!#W}G$R8_V@FSs3Yk4XTbmp@E;Q7OYBt!prhn6|stgStXjHl<+nf zU6fM@%M~)J0W`RUK{q2(gZr=bxRKS~-&F)PaXgVOb@ys1+`?j8x{ny=3c2N6v?9JJ z@*nM@PLHPM2d*8WV^A-v*-83?oviw6A2lh`XBICoRx^-mVxt^8RPPs9!vWR|J4j&A z?6y!V#j3vS{q079OwN1glPd^K7bPFhVTC9@;u(jA>x2K;Txn(Oi!UFpsNWZ6a<8(g zQmcuqP!9?`-fG^(bMN>^u+#91gzNs*5Z4KD))?$)N&^{OHV`NKt}Io>!MKH~@)gcF z(D+%(#&I@%@!|`|F`Re)uV@DpL>?{1E09fH@!ee7D4=&fiAklOTfkW)SCH$pt|!la z(RrjV6ErP-nG}ARYQCU#E--Jh#>S;*NC&s*lYcf|G1sk3W)N0 zOPa+9hAnTB*vTQaHHpHQT7nl97UKQ(MM5$1mzc~6q{nXqMP?z^Zgo2EW`{2msws%) zw67{98~)QbDwDa%Y>w$@#By0MA>xvChpw{qO%DUhh!|~WRDph~I8m))UBVgtq4&%y zl_tFGF)DrW;XbIAM2$b*rUgcS#QA0{@uz{!7L}9Sftr_M#(2eRYbyhEYD-U@{6f zszW`UhI334xo4>jFf(C78n1@ed7n!1_N4n^OI(_)(^j$s{NA9}DE>%&eBF+q^H>(p|E@YJ&VPq0Ib~n-$Jrv_ zziKz!YscTL*4SOxWi-JMwmJtEPU??AhiUkqCKctk*+*;_>S)QD^e5JFBA3c6Lfu(* zHPBNpH!jiq30b(+f85Z34qjLf{uam!x{?P~^zI) zAQvk61A!0pBz}+5gEK2k_pk;i?O5D5X8{Vcg@C`3MaJg6BI4|1Cjxj~D)VIOz>c|* z6VtVnH__Rah8OqU;&$YZ&XpKI+{PX=OdVR%!BH58_xP{um=q!^VKOG|3+fB>{n-Z6 zuy>Io&L(n-T4xWmW3w9>s^;<*pU#r8krCe_)EI?f#3-&wVhw^r3QqP-3ityVaS=a6 zOt-A5Ox38()UFylv8>cFLIfG#o$ST*;nfcfmc_;?Gv+RD-ActNj|t+G&GJnA8Q4{8 zhMJ|XUij5{JD~Reg=7qT%{<~;)?&<)Kh*T*Ek_SDYcFMnwfDDE!>+3lOZ-P@+5QgC zT|}98r_Qn2h1Vno2n3ulGEX>^p6y`5tqP9Y?zOKF-YN^8ll6g+dNY07yjpP5sMlgg z5j98pm?u%$-Ww~zgM9l-SGCUJsQ2G*%kXwqR2U)zg+U&p9 z+$J**CEI67y;RuDUZ!~@zAmqhW`aTe?Wc0tflB@*;2P^;&?b&uQ)qLQlN|~%9WmO; zCiQu$)A*0h73uv2X7V-DpxV>fxXJ#T5;!_t{R+peYA;iueu&nsJ4Wg8(<~9ztKqe3Gm;;$Sn2Mm3Ul}+1TQxx}0v3z($o?s0I zF@FfFye&}7BPCr@q1juo*$#Ua>b%HilgMVXC7WZw7ReJ>03}^%o{WvN`rEx%7TaoZ zs?l=H|1)bC^7*}aSkCADo3+51k-t1b>f|?isgp;jtQz)CI1=Gux!lXRy9b^>RM;-%G~H4XOGcd*J#$CG3F?lS<~=E{sZ^k(D`95 zt9;H~ey06boopm8)VjbWveIqoak7mdC#>DdTuvJ~0v>X%m7z}jzH=o*zo(WzZ9^W0 z3fUpW^SdV_tGY%F&_LqO-fb1RlkoUfCR;vDp^TClqQ}4;QpOnZr)E}>Kj0+K&AUBr z?j!%1KXoHdV0!UGwZ|QNJv0ceR|5#$>D}5C51*HudpL>KFr%Bs#TSbTB5^B8nIF;V@a;vJn0xyX30*xkS7k z?Jl?esNbPk_9%_a%AP9xQftj35SA-=TjQV8wn+p(vWX+map%Sr$;S8EwH7+tWEN!_ zU*h*PnN`_>5}DtHkOJHqLuF{`ikY(lZmuSWDXc42M=><$SWObw)%Q&P5--$O^HG)v zTWf~HGMQCyhLhH@M(bIt4SZkEcgAqiCYH^t+WPcAi+;6Ti3C_@rr~KCt6W1IfRf`L zyp9V=V}0eFY>(h#{4{k1ZZzwXfC`y7f#Ara$B3x6=#|Ihd{6#RKp*Vu^Pf}voF zB!Q@Rd;{VK{17D4Gti0CC~FdtwaG%P$v@W!oUw|;vJD22z@+=Zq|PjuRB;d{o-qH0 zuBX$L38Y9Rg;Wf(h%M+;<3l}?mD(MEp)R@`_cxccCH;?vZ1g z+jH-LY1N6w50hj@TKRDwi5%|ASF3cgK{>9E99yFTM6DN>un%rjCwsflEq^v6IWd{@ zP`whCawHn@l98J0Vq=l>PQ*6EcqUTzbeC&dC_h@*6m|Acj)aRC=OiFfsm=PfHOEy; zs*ybode&qf@#8^$;PBdEE*-+&WZ}D&Cl{)|?zXIQ<}c>~!jP4HNLtG&pUO)29t+s* z4hQI+`R`Naq{0XjV&wfCn-0!`22>K}p?oP%cY2A;XDoei_w#4Oe_3yi;@Qf_p!eZ{w! zzYY{A%4f;O&59LupLjc282T&+{ndNRmKpmbTi#3kRO7f0O{DvVaKGqrHkrfSLFmFY zby4r9ytcOb!pOOo?q1>DHz>W`yBRWR=x+RM-NPOxMg7Ry(~*iex4Me77}_Rx4_r&)ru!g?0)Q2#uRufmQ92e`bM z5U?28K*lF?p8{^TWur}s-I{Or$h5tI3v4-s_h%|84TtU`aXJq-#g`w~pJGFvea&-0fSY z#nZ>TV68@Qruhx)QGS?a{g^!6Yt7Z)or!T!kP@BeYD)R<^t9#+22ArF6owW@+^MV8 zGnbspRRDb$p0nVmG=hnEI%3?%cGU6h<7>#2+B`vtq~1OH4%xo$hC;TA@8>X)~&24x3mxw*EUB8;*x7y=U1{VnAm~hEM%dwcO@pT zbo2c=r(~_h*XaD;WA0?eCLY#k#ShAcMZh59UBy5 zxIyz~CwK6Si8G27e5>KV`h@P(lYr}jxM?0mz``~?>|$eL)BAZ*abmDIi8vQBT)>M?Fs5@rpDo37tTh; z0y9=EjwcVSM#lQUJfKWAghbxy8Yl}~h8GK6Z zVbuNsrCXO zs85;4iYV0!g(kvn=zbhiFQHJc+$08Vd!tY@lX7#V=naEH8N3(w)zJ|ve}2@W%OXVS zFrM;)f7)kP^K98KRSpzdcvK06u1;7K`lc$$*i1va?_w*B;h8}pC;KT7(mZ#@9?bMM zq^73~dx)0og*`U5)?g1hb7^OItBrdoz@AzoSb{yoYC%!I2zw?&>ih{{PoTFJV+^L% z;|o@T2Xd@jL$ty7>i{thm8rVw04tO0^)MUJYgZd$f(C2WL}n_TE0LTzHOvWO$blja zZWly?c&+(AQ*Z?1L5gVyOcjE|>txF+1{+*%tq$wK z!3w8S+q;+LVZ2`Jh&7eGY3RA8y5GWM@|kN=FK_3ffHi&$WvUoOHaZ+wct|D7m^FpH z5aKJjBc_fd20i&yhSq1=VC66^e}T*vMK}-p z+f_h!Ffz8N{I|u_aoZ&-{fb> z3glmFr{54b{urzeUr9L>|3dD_g$s$zAm6I`&mUhC3Twn!xxDBizS&XLNO_|!B40gk@5Ij5oQ`xA`a>{nKYiw`sw|G7To;6-|u-0xi0iiriie< zn;Vb9Z?^e{UIwC~KBoI(Tx+>k`iS%4D)4}bwC1A2vtLgnD#Flt>{Z}SzkuzaKiJ2L zj==njfn6I5HOM};Y4sG6rpL8zekxDib+RuT%6_T5)HdP1n;Tru5iYf4XLa3+IJ^#^Ehn!!kij#Px!H0EoL6 z{wbzdr?yH3d*B3$Afz4V@$2sUHZUa zRvW!o^Oz(aDf>vrx_CWfZ@CE%zflz-R zA)fl1cj(X9@yp}5B0=dcmHx2zKHOLPIWzJD5PZkORp$lO7OUE+{0It@3iu&V3-^hPuW_)6=wub=>jpOHPTk%(v`}ZD#%&f9< zbAPEaS5c<>$7SohOalSOdk^Gf4W!Pl@mqcDKz7qW>d>G4yF|1zy|Pl5TJ(2g1f`$d zos8yWGn#$MNAq)y<{jk9?wiUAzgc!0mi+W4-fo+@=2t0SrI5hEW;;f-xxeY*F$QIHBNL5G*OKB~dWq@F z1j(|^`UdXV&b*t@U>I5_^At}*3|0(s2VK>uJH}^~p?vjK{V5{LHB}ez&U+X}5=ySW z`dmWjM(=5iiJ|2Bn^jf_UCFa$H>))YJatG(a$R|Xm0WLECDUDD*iAu0*Yga?wW)%v z&lVJ$0fiA>1>smY0ml9?lh#0s3Xn!81xTcXkfD`dk&XaQb2{I&P0eH~NUFuzdD{&5 zMtj0L^rN?k9;<4m>2XxGr2=sMip@)yY;&SzOl@i`r#)h!-rv%d0+q+Fo07STbQS}X z%$4+otXfs#=2v#XX-xvyr$(*)Yzud&|F<1(e`mFo9 zl7PY5gzI+mbmYVS1HlW>{cy>L4S@(=^ZR4qipczj7fL0dautDw!q;egowet4N z?*#Gx^{Qkd`KoUM^wy*wNZ6CjOJo&^DL8-4lI^}LOP1{?;*}XWi-oU9&nVl{&Z2ij z0}13ExI2XCW&H>xyFRqneZykv#Z0|pdez&mqTqRh_xx_uRH6$BXa=9}Wp3uOt}-g| zXxaDqWfWsE$Z_#5$5iBw%e>de?XqbO!4!7K*cxU0?ibtxEZg;RIg7j_pg`K2h+4vR zcEf1w!4>C(_bUg1zKBc5Am59Q_t0L~2-d3J@NHWL8&g}pv&i_3yo2MTj#3XfiS6c;}2RZs38QMvkZ5*SEcl=E; z{pJRgb~uaV3(Xm5lA&gb5fc%H95vEMQ1-besS&yEaer17ZQ6Us>5uJMK=8I_H| z#q=DaRabBmr{a@yxF@>CHmL5}v9P7Cu|}$29Wbt(93{e^X5r630pb_nco8a{pQYG} zNWKWiZS0XjY&7Ke!+zFR+-zFClRhC7lz07*W$h&>zm@(*QK%fDh7gjK8LSt61Y-6- z%o&Ap`S-2#@M7(4p9ZzN!@NvoyL9ePP>#LfyMiN&i}uqJo^(Drcc}{OrviTr{Q(wV zjE-dB{{Y*2M?ERC;{Qiax{4OilQPx+QBNv@`D!6wOiK#P57hih=%o80Eq<5+!jD1! z=kYzqCSrWARsHYA_q@;`9N(Nzb{?PAFSE3|Bi#P~^vh9pTqpnMak0^Q>z9FkTlIhL zf7MqETpsNsxM*wt@ATWC|17otkMpk zBnWS_UXgiV8fKmR(6@Cb$fbxuUWef#n0?>#9yEiOMOlnknFKSmp&U^h9K@O=6)mc> zq=u__&UI&~3rNj>htk91xPxr9)ysb@ZbUuRF`cDNSR~_=VDKkOe;EuObTSQU ztQ-bE9=^MQ!Tg^80S03vcYXm3cHaR8F&4P` z_zfh1n*t!bXJz^sUVWDuy7!37E^3==zpzvZa{takLmOp zkPFF-0f08H9G|zF71$c6L4#QUqy7lUb&{3!YaP-iM>3`R{1QB%ohtg2^kdUbEnpc{ z))?9K9i2k$THU8ZPspdOVWNykQPRI;o?{xExFLZnrhG*4^&>Wt{^T(;m52%7-6ayU0h`4hLtfv50VA>C~qubR)zWVn-BwUvDGVN-#QUyeHi5(elwax$P!ZdoDBD|@}3rxS0gHwaBHh~;YUIbD3*?-_}pC+`UQ&5YV=I< z{B&l5!9({amq`oGqVocK?{QwgN+kGG_-V?=Z23KREPqU3zdg=-HbVJB`APYr{xhxq zI3WupWmulW5?*Cgdz9=wMI~rDtD!N^GD?uvp}}ZEGN+2fHA@r1`W%G4Ob^`;*O>yL zqVi2+m^Ni-Jn%r6pVgPM3ZVyLG{p>nvI-9izFp6I91sG$)mIH!1 zUNijG(x&o!hULLYGc0h%{m59=!{PzX#bpzoSyceZg z8>_GIn}rA=|0vZ5O1$5aA>>9LtU>AtwfsOoG;EU?aPi>@o7oEm-G#i- z8zGw0d-KQJ-ZJ<|;DbuSaygZj=1M(cClS ztCmlJnQU4UXmj5m zCv?p@8Y4`4M?q<v-XP>pjhpWiz#moX&M`2BNvm{=IAqgC~M8X|6bl`D^VI0*eedi;zU` zRqQdn57*ERWN69USMA7VV#5T8{t{|h>JHuj^cT2EX=iN{F5-i#gn|j0I`45Lwq+812@Z+}w zICTGH%Hm#}_%Sfd&BFn_rxDov<@_vhKI|*^+L!n65}Tgc7aen(DrCz{@2!AIE@5wG z))+5Cdg5IT3a=e4i&Xe(hx~oT;LFdAr9o`8)*FZ!spz_11Jf*8XgX%&wAPN&pD*=h zJDsbwD*3i%<2&tYGs9AqX6yHsp(_C%9=jDh#8Lg%547CZVCXtihA#Y@-odX3Bg#!x z9Dx>A)RA$Zw`SH@LD z2b(VCVKKjktl@h}fa>eN0{X+hdIJ0QCi7|Yxx0mNl2Xcwdx;+&)<_~m@^eygi_*m)&H~+mlcu!q2Kf~it1w43jd&|~@Gv--U z=~ucF*Y+~J5)M=$#0Lu; zVt~-i(BvrRyUK7)#h>=dte~^r&?;^8R`8HdyR#?ra3^$&*&(EcsQ3+pYZ;^xsx4`2 z3ej8#@Gce{8DjCCtMc)7zfsz+@D7dVW~ioNBOAT%^VN(tVuFLqsb|qYy`|jDkNpFm zn%U73=WD!&*zs=uWGre%suaI3Bd8@}sswJl2tX6Y2}u|*+tnhsNUxA2dwn1c9G56u zW@MZ?g~KB)b+8=JJDeAIq-zrjE59yyg5WW7<@<)>9yRJc!(i)d{)3PnnPaandmn+H ziNZ`FyO)5fA!)oNM~T>8siTiJMj47h{w z8hd})c+)YBH5!i9ORw;?*I371^!!MJErh>%?NA6`;&=$3UiAFW;>UGf1BJSOy~E7< zl#l<{uWI}_n(&?ur8R#bf6RThqIX~Mmw;oIpSwDcSVBju9|rsZ&QRxF{o$AG+!7)Q zWkm0Gj4{i6K6mbAg)^5I+PD^FKWCJO28h*STKxd&|A3vCU_@?j>8+$e$588FT485# zWZP>+XaT6Ad=DGTq0mtFj^QIe?nc5nC0NtUnmQIKyi+%7w;SW75oJ#LAho@4`f^P(8f?8FzK)p%TM}q!<|Kqk)pNfob4%uYqoV3Z zU14;cGiv>p?aKw{*7x=55j+giz32T_h!4_X_&4zR_uIf{pCWupvWelBnUPIw#2w~o zWbP-Bxw{|wf_e7B59=SXQrr15ROAnsN{57$?D=Jk{Y%Ha%R+L?!iV)llFkMz?Yg@H9Yi(=2R6o`N-Y^N50Lonv zr3&J0))hgm7!b+#`8qSZ*#zpx{yzWwcxZO!%*?sG&-=XZ=Y7(bJj1y}EUwoOBEeVJ zfMN|>F<1KlAc6P1B@86f$g9rR48!rrG%NH{NBWpH;{?rNHF5v+^RZQ1Me+NBi32ld zUY4t!dV^F+3m^%YU*$Y_hfYMGzhaCH>$ATs;4g?>?&$DAf$VJS39PZ2&Se2>xISZm z(E9(tUH|-$8vz1PaybORZX>0IsNc^+HRnuElfT0mO?gI6FK_)rSGukXYyNpWr6Myp`^{kj|>yBr%cqrpBb@t6PB^`68jTXL*?6}&JPA*b3a(&32XnYpoyf4XG?)iTB(=_8jCW(03tqsHi!0mnhFf(mip{Ct2F$yMfo10G z6OK00teeuKK2`3#{%%(yCB315NQI#e{9leRY>1SRjXiqc{FQGB8F+-&4^5-^vRVN~ zN7Gl6AI!+ax{1D=?;xhWE(ENzf6nm#L+1{2J9pG)b}lo`EZbTy#mQ!tXCcM@Z-8+Z z-vW$3y)Iy|dJZDk0!F69YcG--nAwk_n4{OB)bO&#nd6}}91w825b~hedkJkfuRrm+ z!rtqsE}R-(u1{0dR#G{XoJV+(bkJp37ngICIIXz3)SgtYy!j^{uzYChymBYO%V@Ls zn=#b63qdx@#4^9LMKL$_@?g!CWz*NWxw-QD@!0`s-ByYDFqjTP*_IC4S)abPxdeM_ z_A1dQ?WRv!G^mY&5$j88x=rZ46ti^RTfOFE_>JxwezP<=jEB47gxq zVkznUFeNI5cQkd9PGhesir;0vc%L$wi$9ue>l8qNFFRp<)@@2}L>~`C(j?!tch#q_ zfvD;Hqcc^hb348W)_FAWdi-4)%5Z8ob5cv*p{e5uu`D}y8hW6vO(34K`rt?3CrP&l zU&1ssgkO>ZhJ**18Z+(awe|M)%xT;(E*u1zlXB%|BpmzX0&WME8?So$42U`xNaoh} z)P9t{YEM88e-7@O%`Xq#v|ZcP#(Cl%$h$BxMmJF&l;I8(OZueo0!nECJpZm_lglnxdVya z$nPIJmzpJv@6)(L|E;{y|z5P8PVvyzuYV`8)G$&Sj znP%m3REQgR=ALhY6fRFWYiHF}HLV9)srMbU=VQFcX3qSa?ps*sEG zH1yP!?a_vmf_cKTmI}!E5jBbIBpx&n^G!RSVQqIe&kx&T0NOUJ-Tc}N*LWZQ#@E)I zo@(1(4ZUK!dFEK^F!*JV$D0hF^ZPft@=fWh1wurp+Ll+@I+apmBXX{wh63oMj=ua~ zd7;8nUZeo2rfO{}3j@EVW(c4g$o}aDeV(jnWC(?u-q#bro(pDQ7fvq{L?jL?e7(hB zx$d;xtUqcN-UEUXQ_9Yhw8`J0Lp?(1*!r zLq33E?V5bTgT3qp<9NymhO3QkWRj|s=GTdh@w_f? zJ97br+&Iq}saA`Bib@i)GVJc;*sdSI_;LQ__zzKS{JZ%o&+@8VpMAi?A8MVn!?j6c zANGz)sU=s`9_h4Q*^`c;ldI;!SKt!bjoQioJNX6vIHZRI&ewSL8lz~2pL;^A30Y{>zigPr8< z`j_+S@`Hen4^5hF9#V&|?GF6CYjVIpgg%k0IeCbh3*i4x)xngm&)(<4pYu<%_e)-6 z9vpmd(tq&aW@KuWoY;klU**An-B#eQj2xc@|ND8V6aL{Y3EmVxR+!*T_k{`GxK9`V zU=y6(gn{Eo?Ts51`?|^R*0@TH;D68WmZwY4Jckk7&5zwJzuTXAV(7ilxm$j>%*OxF zeo;aDpOxP&-~Rbs+poj6>*iT;PUeZp?>3RSSAMttrbD%z`LQnwKMA1q&yv|RO1uP_ zz*vB8{x9uSv66}wfMi7M7hR##{xodWtsk_C^Usx($^O9lc}ujC2MP%h>O30T-|vF7e-OVFxWlaZGwD=))1H~%W;1d8hvFpI#>SOe$KZE! zQ(YDMxC|WW4tdfDmK{du48 z=2CZG7NXPTcv$LF-!HGn?cmf0K8o5O;!=D?zVt7cq?g8b6@UW*_Y=t=rL;YbN+T6m zdCO5IXVy&hk(^mG{?gPu?H+0`8?=WRjsF=pWNmU!{32C$9F-Z>0dhnfi6hRF>RZ8U zW%ZTsMU+6hW9H0KE>!>Y%dzB9+ZdN(w-4G_K(nLinZ)NHP)2K}mBk`*zx?1|Zgu1Z zfhoxUX@Vi5&FWk2F4QlRIo`>(D^OLRD8BaA{ezGd^ zldaF?C)>`&mE~5yvAYkEsH~Iz6y_@nKavk%dKiUuhlxZ=M}PhaX3;Pi zgvedSVRUX9y*3>&{CFhs;G6E3`o+IY3^>xo zS~Te)&yFYxFVJx#qwk#5AX>FoXBsGs+8YaNg#QCt_QS-o4wOi;37ov!Vr>&^8|o~)7O*1usN8j_Xksx_D9HTEN(>qHJFxtJs40hb#W1c zVjEvmQL4A1Cv=c3QGE0Mq2Kqd^guOZ$N7KseyXAiSu>bMo)@LgL{4JdUuWyDKd^en z7d-f;M(=k^W_|>#nNnsSMTuQyzE3RmXWP8@41ZZ6|I1ed0&+*vK{LAhs2!#j8yaE1 z{MkGVynoA=IDus~|F>`eOAF_5ZmuJ}_~`w{>8UPD)(jG!YagqI%%f4NwxyknG80LL zwiH~-`pF^Z3#OtEF%*|h?{Z?OC)mE?Z$uLBa?l>%669;Y9)xUT%&BC=oca8&KZwTV z*H-|~sns_GoX*S>Y}C0QZ}j@tTF}2$EG2J0Y!`psLHR~@u90@~|I2(MtJcd}^f~g4 zR55W9Q{Qieh$*`4Kjj{P&&tMm~aw z{@3|N)HCPuT(^F0rl}y`h_m+K_Hy|~n$+Is&Np(Y-u^eMqf^_3W!R zF5gJGKKnfRM$ABd-fZCe|0&|Y*k%u-P#BI$prc1%Js`h;_+^LPIj?rU$V&3!u>w% z$3;jwYf4)gyAlfx@`TiLoOK$4AZ{F**`vtQQMd8>KW_PAk+Z;z`WulpcvOn`an!{0 z#k^grmElG+DWvT?k{1%^_pp-dn1kG=)nl;~xe<8mRSjsb>eD=3fJyKJ>VJEM+}ztz zqfu6zl{0#nsUs5O2%|a`*8Ur>PEPOawr@8QSTXrpNemA}QvM2dRT6)Hv5$SRyQlUh z<49BUjHAN#W@Dg3)BTfCLi>|)3ne-=$ywpAI@MgKCpk!)@hPU`snX14K(-UV2-T79 z=!(#3Z0Cw~X`lLQP5tFv>Ype2gzMy3XX`5J*I_sXHNVo?f8`5qcc)zo=|i&xW0|A<^wHGKVBWPTohZuWAVaTy9@$&;C=@|;L zyL}l!WXEa73RE@ZJp9D3xa($!16~)!Pv*QD9fcUQM{yS7%ryq8GPIXCjVrZuxymkb zfg7}1E@{uc)P+7NerCy{>$Wb`edGlag0p+wJ;FhKb2L8BiD!urTMVag3e?*!YiNZ74J!{^H-kKr^c1kpE9l}((*}9 zy*04jdicZoh6ASJ*##AQUsXFdc=eTatFOwrlqVc?EwjpUvnDE$&_52h>|#xCV|B~2 zQ&wkx81}8eA7kiDsx%aMd2&^_VRa;Zo*izmLV=daeF*$oQ&iJ0)-TeqGGzA-aypMG zvir3K{Zxb*qS?=up?GtB!*-SusUQjGn$8oUUuiwM3C;vFKft{-+<-;SFW);(*7YRz zZk4+j_c-(yAngmcywfB09k91tC^>i4O~<<}dPQXhSB^;u~i7-(?>jZaAhsed>$Bwz`5ow#Ogicu_WKUqS=`2b?c4 z6QFcnipXU#yZkKNK(_qB3P@uJE5ns*0mlcab4Z;tV|Y#9ipkToq)O=eZS@VO)zOP1 zN2O2A25ahZ`mX1rNW=Se_K`vQLNy=Sz1oJGKBUeuA@YF(GtUVImQFcCo;J z8jFdZLiWi;TkUE#IRdCkztVN}yI57zlkNOE8;q^BxYc~FG|s}0QoUi~u##?sU8?x; zXXu+3bhbs0)7~R2BM^dWryZH?iIdHfvz{V5lK8tHHstd6^jVwZ3PRiF?1ptL8Epo> z&FQ(hGYD<>`^WM^o3oA=atA4If7-3+NyY&fKEE{PQ#D1Gz z1BiBJ%uH5pa@r~U5Xj1sMp>=qsXRA+c{4Sf9L&6E;AfXGYfZr~m>Op@^n75NJ8I`J zab|Y*M^opq_Z3g0J3CSPDZf0ZG&!0oqUrJQ@q1lJ|8=pV}YFg8h_>C?;EjTY;H%4+#p8BuWCi>G%m~@(43Zl6#v3cEpOSx;xYz6L*-y05`zm zAWUf6Vk%iIB-C=Gum2ex?ti)~Iyifw=DF#A`YCtTieY8B>3?yuJN@rtG+gp6Z~Fbu zcTWHNyWHtt&kMQffB#9hqNgYmPaLnAPfdceRfQMl*dM6S6NBz<=WG;`PIM?DjuDvb zWg1u{WJz>^;Ci^bPro^|*B$zx^`I`l1^_OLxKH|^h{3Spk% zp}A(92Ow18)DhRx8Fw5wqQ^2ZyxLN$Brmu$s@&u%mlcckP3P$OPF%_H&S)h@n~GLv z-algYAC3HCgLEyAOFD_lIf*Wi&$IozclPI;8$U>p)Psb;MLDD5zy&MJdL zyWX(+<*?;mgGp+@r6c!tr6V>g8KB){M)<#B&$Ul>!yc{g9QMq7!kzTC<(=4b=M66Q z{DZP3mw4E-0vAdyg7qIeUF`X}KJxN-uYBCCXa;3CkwkosLcMvyFSw&^n8)T|!7F$} z-)pJjlyiPj$YW>U{Zh@8yAdxjgss@twg#e?6dLFgyq&6NJx_b}C zJt4F^)&%SnmjRpZX!l#@<}=X_B*^31`HvY~+YKVhCWd@-jTmQ(LCIQSTG&{FwN)Z`1NZq6I4 z-#ic1=Xt2^9+i*>@b7UKsxycr2O~N&y+HVtDxR~r8K! zc}+9xfI~Z+%u)@)69ynRqfL;>NhE+$lp6x1mmfYgui_Cio^PXZHBX7>Q$=o32oE1l zW2pPV3fKSX<)wVqJS4=(n@8kKv&&}kBG4z9HYV*MuYf)vQ$5JkMa}%NltcS~GX)_o zb2T>$+WXV|^c{NBLWAq-#7rRanNwA@~nYPTCSS{AAf7z#cI~nls zM>K-szb<4mfVUOku{?4m4RQ&sb3FOKpr!9FGd14=28hEOS}Mx=U-9E}3=E400^36& zn&B~dWIK*Q&{^yx?y_}$Ko@ez_KknK$QH+Rm_v^d*Sg4dHDyaK_mC}y9Faq|s~s2F zYW0yvGH-ayt>{$B@>rKtMl#?ypSk_qoc4$R6difgkjdhc>3nyR_cy5QXVQ@3U61h< zxdo89TmftN!}{ci-tbEOAxj_evK|`bFa!}=7zuE=j)bJla7O9H z3GjKz=OW$r&C=>8?s~-vplc-;#R2aF@h0A}C8^!ZO&<2L-@q8E`n^ku0 z?Bw|mdW7&nj}SiCmFNEw;`2EO;f#ND!_76w?K#~1*`qE>y(G@;k*)`R;Ns?T%9dQ| z;pP^J2rvlIw&icSxOuNW0*6%g-v782Euc(%Zy?k&HL1+GTi-#}^v)*pjH zbT;()vq-8n`|lcIF0s`tBg(sE_0J$z7qY7LDS&q;s{Bo%L#nLXIW zJUgQ|feVgxq2)&?I*9kwI@bw^1-z%$0BVfD@EN?vnr+fx=KwWUh9!^xOb5fd0O|ts z@L)iF_=o`YU80sTagGDL0BSdDtP7xq@mTz44}w(YY;FqkdzpM+E;ght+Zj!#rNYZsMWYT~rO_{UZ}e$J%Nsb)RI`8Qw$q-Fnx{ za^H>6cTaNLX_L+9pxXRo9Rt`iauVlD{3^Mv0L@=K+MT!yp3uZyQ!!PuhtNQ5R)@0? zew?2+q4tdo;xlJ#&Lp~PfTi#MV#GohwO9X7w;8+BJUn>Df)8uPeg}#Hga^QLfEVr# zycs;!29yx8Wab8LJimW#^%i-REHUuh<{{UBkLU`%Dr;o(C8VtFims4&kwebsaKrriz=~dd-b%V1IYIek;?0rpuG@ z-ZJ58PI2MLSSs$BBES6K*4dn2KrLMq|IjGj?%0m)KDM_!t-Sl#ZhJ^$yMdiMjIEuo z7@LmQ>4LZ4=CQ{1v;Sdib=*j$=BwHq<8pytC=GxX2xXEQ_Z($5dITg#MvwbekCR75D8wc7OYH z?JqNLKd!gSb(1f2uQ{;~5qb1pzCxcyGoTS2Sf>7!lh$=pO+`TaG8=Rdw655qv@oj*U2W9+?C zJD#X~=Zdz&+9-*E1^r<3hJHdM)P zJDl4nL-b>_aWtCdBw!#Tlg&qSAQ3#VwIKl`77l~>hH$cor*E|kP_5AqQ%n|y`w509o2;%eD~?GUTyi`GoqJ>^EcRi#^RAc;v?S(uizkksn%j zxW8)ka9$CUlv@vjuawxm%Na%4k|-#qo2!xVa$@(WmtC>@8@!+_t@x$E?%FE3cT@eh zI4?+s0UxUQ(8$w%Uev;2T8#Q1`>WQV7^F$U%Q>RzbECqT3qpi#n zlX7Q!Ovy_RKSPz47+Xze{>hAWksgxfA@DQlYds*IPM59Z3a!1wkUN1KAXOYn7xwa3 zJ*G!z+|MGsiyPxVEo6;l)SYe0ukX>SDE{Lvl|00E5`=gDjY{q|l_Y6MXf~wWyg#bT z`(IO|AmusEllr2J+Z;W}CB*G;767BnVXSZb;+@PVJHH!Uc)06*=4+w|Ir%3aKb}8q zsA-Rtyi)R0FXDD0_8vHmmHa0K)|{*OE9TVnO)l6zj)V8oYp}IDLF-q`GN)3w;Nbic ztpK@Oeuvk&>=KTD!zP~il3qxkHOi}KJ7qy7)7|BKgf!!& zm$=8Qo#Gl`e#rC^U(hgssmQk>4C-hBVK|I2h%k^|Li5k4nkf+j@CZY#Gs1B7VUFVH zaCYU>OZ@sCx9Z$9Iq&^eRuaWo>sVJeQ$g1Qf)nlJgIy%qEH%7@l=*I={MacZq9r@- zHYds>)^am}1X$t;tn#dso`Ev3{Kgl8Pch=6?A@lFXzIr#7kGmdh((c_x{}yW2klhT zsljx1n{xm;ElFK;z{g4vNl?7r*C2kJIpug+&$ec{Fxk%oWQHN6qE{;-U* z$*o(Dpebwi8LX&q+P~Z6DLa`PowaV#Xf24+l46`5fs#6ZxP$$T<#bLrxBgnxw5~|o z@oF{C9uBzs+VAL{+t+^BgDeE)rTW;J$pniDxcl1wNJUbv1|D?akv02wdgg5%F6YlDUnVI6!E01b_>}&GPzr&Env;Od3lgC^6>*V3 z#W*Sffj@^j!fgXIhk>+eJfBS#7yaJQg-){Ai?(uParN(9viJoUUydxkF~%i}2kwI` zeqA%bl=Q=jmLrP?*1Kf!6<&Dai+Uk_)L+ky?yLn&XlAZF8;iSKiTvSdyoohe4yz@FUhDXXbZ}MZY<3@QbwB3d^ zKkHrBuy2xY$Jib+w50K7s6uKOqT@wXR@29FLIl=Z$#c!}F75y*EZp%%5o!h+nxTn0 zPy9Y}Gp!8x-v3*cB0Q9xmxM@o{LwH~nCY|bAtWb=ilmBX{-$u%-Y0|t_axLT)-`CU zMqHuhZWrC2;}fmgJGj-q+#%z6ooHgAPPEYAOYsQ$?TR))FQ*etqb+nIH?T=+(L~)y z8^|^6^mbLMc400nc@l%6=|^~_P{2V1FWz~VL2k2>7xUaXPpkH1RhB-h=q`69hv5#n zm3-W{+?70-vL(lu(e83aApGZ6^58Y@NowdJoy(qhHJY z5nD-2ce72hDk6zPn;&tX5hPv2J3FF*ot(4q3^=TRCq`_io`4m*+3bu8v?HOb(@o8f z3mvcktz?g-b?e0xvhkdB4%n2Ne7G%!+Wmba*}dpjUZwdbg3gK#ZrZ~mp=L|H{bRhm zldB{4I^DkjgmhM8ugrLw^`hb%X@a=Gz7;`)jr|c^Hv0n`tn{rck_ij!(X5{px!q$M zrkfB3`$&bfKL;PwLMu@IwEuie#dw*ASV8AW1iSfpXh{Q$E1J5uLQN^AGPKY&U0IQ1rziq6T(*wZSZ!G~xjvmN;#IwGLW#&E-jj~l5z@OyE5d(!S~L2T+XhdL3^%~C!!2+1be5Y( z$_A4wpGbKR=ON0OYt6h#M7tNl#aVq%oUehY!H)V$KzJ3~{0N?9mz(u;b2zd4{L0pF z!^W_0qw}2dJS6tBTTpU)efs;g!KVRqQT7`y{Zqbr?R~x=eIA?D+0MPssbmCoHU}gw z^|KkD++MU9N}X9pn!ydJi}sV@V}A%)^){WS_OSi^BC~-Bjt>z zMJ56pqrE)Z;Fth#7ZJ%dJ*Sn5*!udAUUIhnKGu=j2TKevR8hxznFZ9$Bat79r$x*r zb#K0CVYEJ0{9tV)Fs6dt1+PoOOWhnEw2D&`I3|o*vV)=DDVEC$f?}5Y?BV;h99cFB zTr>hd6r6Lf?lYgN5W~P|(jDF(P5bAB18d_gQM=Vp;^jW)(VuBK%Rs0)3O@gV*K+nr z^k`se_Qkh48_n{c0x@8VKdFe|c-jpAY)VMMRpv=}+X6QkmN~BA2e=557BA7f z@b5&kC3atr`btKuXpJ7>%9e0owKeB!Vq$^Tur+i&`$w%?OSm7j)guzaSPU1W{ryL! z2lUfEZ6>ayUJ1o@6uGQXN)kYNR)xkIgC8p1Ku7!~syOQ0IwF7ZodWMAtRtBPfidsD z7_HnD3A_-tAy_p=ca-NuQ$q3qL|Ro_uJkLj`B)#4!C56e*-jvW)pR5u89JpuJ0td$ zr4Xp)hCoG)WI-3-f-v|E#j%<$!EBaklEW`YKRRhB2i}rFp)Hy|wMn=KTA1c-u+KRL zy%gfc{t45emWXe8rUj*-Q!6{G_de1a%mAZZ%7uj#EN2)*V>@sELEZP5D0HOMh-g0s zg3`~3oN$?Km=OElO;irT8j$Z1n0ajxY?`P!zGg3g&!K~`5ryo~BIGr^$zTz1aQpq);Z zZ#AzjXf#J`X)>hr9joaSNKK}mKkNwrxa{m6V1O&a-g=ivq0rP&VUwT&`IwuwVgdx7U!lF5;AAUeGE=*)&qf z6ec9|0R8F|2(!QMyv}Unk>i6_hqZ|HZ)PUUU-rDea8gN;(+gU`^-TDrvu^u zGTP~;UqfC7Rhu}JqarJ>+9Lby*Qq9C7w;l2L&juCM+xxAiyT!v9 z?)a#^CWo)?mL^0L?abO$f)D}Qs}H;xe@pT|D`pzeG$>`MOUQo&nY;#bXIFAsa|!tz zhY+}Fm1VjEFJl-aLQIsTu$+61&6ua?u3^k7pr3oax= z!yI#QNo*x)a*SLQF?8Ouxad3~+QvHK5o)rrI8z2g)!zvR=y-gCq3iBu!LKu~rarw5 z>-JcKKAE~^f$4MRO6E4FKS*%U>eW!4osa9|ORCIxT^kZZwdO1rPOCESa38eB8K~rM zh2Uk?&i8Kvy&mHg=yNO3uVSP{iFbU~+%-&Tv|(TP4l%It_D1+jq~-0Ngc>jB{HBiV z@i^Cv8Q&gV7D?=4X7^i3mnHyPpcN3xR2z`B4K3pn7VxVwo_wg}IPA*e^m^IB-IKar zMOt93NvNXeJ?ERHqAr?kSIQkVA1cvgWJOA=6V+@8dKt-?DiAw&m83`dSV>iMMjdHV z+6T`*U!R)5EFBYmJRcj5>{BJF#f1`K;^eG>!K|?6Op+`fSUdUhaN7ToKoPFo4Vi7N zXIJHjsJ+wRNB4b|iKJGp*;i>L-zrwWJNH&j;GsmwRmi6$uKq~>Yc+JH*PMG~Z%AYS z_=Upgh78h^&C4H!E7>y?tr#3`c@x=13?*Ihf`NRQH~)#9CDFi}R`Mvb6sQyn-9TCB z-Xyhwf%PtD&Pu2uyPP(L8zz;ds=>v5iX3xql-OYY> zdy~+w_@fjNt4N%psfztK+P0^Q8@=3iwL4xNIZqm+r=pwm)sx5z*Qt>sygF)VqDfzU zj&lb5&yZ?kKjYG~pG{LGGGQEA_fGxAbZoi?>+0Tb!!w%b=b=>aNID2v>Whlx2Fp25 zAxY)*@5Z0HYV%604mth%uAr-bKStS-9fBX0v^MNGIsN;wr(ON~7y5|p8}#C=le~&% z8uJBv3Hc~B$XUQ=Mjel)FbyUv!LP2ywPt;uDt?6d$<2lFFo;JZ$Qjq8QNp8vbyky3 z!Fei zEdEwE3v*_p#7N{N)|1Vy(x^vN1H0nKv#vb0Y$d;kkW#?3V{dhe8Ei-061LZdnIGrh z5;g!+mYk6$&rE^6A4N_uO`r9rUC5Zn$&O$g@DeXE{@DiVY>tBc!aO`NQ&D5Z24co7 z>Y|iEg|1SjH9IXzm5cSe_D_=BK^Vl;YM?z2XdA1b`{|`lI7PlmUNT%tZ|0>=O_DjO z4q4_}76Y7R166mC;Py)jlb*|vC10t6%-a;^Q-FpfTpk1v1U&9B?)oV zRV|IO-knPp1DJ!nF6Oz}u-qCu7Mwuc{s1FRf*AI|`uKY;9wl0;!+~dGi^8dIp?wAs z+0kyW$+VYGc|96vjlCLas45^3^=uk5DVk2LNPOy>ad&-sEVi6&(ZI`AvI_Aa+F+sX zj`X$^M=RF`6X$(EI&ozMfML^xeetcNGm6@;2JKTT7K9tVY3v)hE#j5!!NjSpK6)B| zBWedrGnX5gtjoC#uHWc~b0B}I;xlJMF1_O$#PkaMMuzW|NOdj<%lXX=O?~nHWT6Rq znx@ZVd;ig|9%-UMn9xLC)<06KpcPJIrFA{GA@GYr##a!H^B+A&zc%`F@m!4vT&ZOY zw9`l%$g`$nLY!KDqc9+s;5pCzyp!K8NVxoN3((H-yZg^|`Q0+gmYk#7;CC;= zQF8ol*+Q4!{Yf7ks~6H|Ju}U%Xg+10=jf+A$ul>QBof3-x5QnL ziVD0&q7N6&cbEA@LoSR4sJsx89uMI(o-Ybh{9~@>q5>S&eV1xW7%g5NSYR6Cq-L;1DJCYm>8F^MV{ud{#n5> z$D__%DstM&g36qBH)(faK z5+EbQ?ua#PS=5K+IV1#-U26p|)!XgHRv+=tVZIqRdNC`#MktWjN90s60>ZXhUY8o%Bea zXMM2~^aVyf7#xaSdTcv=an4a>87$Q4oiyhirL`st9d4VvSgiy0_fivbt8mYDt`o zse?Y)vZd8m?lvcY8T%?(WiTnWIyV}zCQeteuQE_}elyH#r?|uP66J!caqLxlvfD7n zgl3c$IX{{ya|~Qm|7K=y>zqqN&kOhytjL?TaLuKqv6BgCO0@dzp(tXP9%4|g{18o@ z-f1#aYFB%MPCabdi>Z09m272@E@^4PE5BaJA&uwd_mq<`hkz9r)8(mNqteq)_7Al~ zCo@BD%>24C3dTiNAI%baG#+6cl_*P_o0(4ydI9WAhpNcHWnXs~`$V2XZ9n;o{@Pb3akNl1W z{?f#|aB(cR&r~r==N*<@J#OfzNq2-1K&IYQ@#`~SD9Y?0@*K2|A>Ibv6z2my(ypo? zIX+lwZ)jDdu6MG>y7-8q*_rS4GBQ<1QdgFfdmdNKPO^+ft>JG1!PplJP%wmaI3sU% z)4g*1i0>D z;Os@Ur9IelIq>WX%S@4n7m?H?(&}E1xZgcr4-y1wyz&(OjCIyWlTPStm;~gy7nmqTeF_I!n_d@_1m41a}2?^ zyipYXE5X!=_Vj4-_*_crCyoR2X#DBU<4~i_9o!=1v5A2sJ|o(*|1$8)v{1~t%S`0g zmFI+H$~)RAKPrXN$KfTBpI7L=9?HO(v)7u$&(~wMIgxxhLPe}q;mTJqZ{xJfQFf&K z)~NOHj%elE*fnn)7u6Bt`=r`K&-h`xbFFL*9D@;F$@OmjUoS!)-!ak?>&P~M-*h=p z8Qz`pc=OmvPdltzQ{V>%IeeCR)^V-y41pQLt1i4l#>Gpt&n%phmTLMG_BmSjpWQDq zKERwAqhLN#JxRlfmd$FF8I|O{b{#l53`wgF*2jT>{dm?ktjx5pgPl^t2J&nm zzg7HJAqBE2rX%)a+{r*=X|*&xc~S401QrFdYAJqaed;vjaJ7sZ0uM~(d(KTfulMa2 z{sXQzRe!W{d&E8x&eUQ6COqN-gI57?I0WQ(-;3r?D=T|5iC%mH+l)PN@~C zv{#8*E(<2!@+nX3#S!1Ki%h22x27ML(K!O0M0W0gb8uD9_@+sN8#s&qjq) zEonyXC>H^v;j3oqNV- zB*MMHB*GnFspX)x@XS#4+UaXTbH9+IF9rVKbpLZ`Ee^2+-D{D7>q&>ZCPJ#;h;L0~ z!>2NrH{Af>(e_L_+}_s0L28|ZxR+6!lN0Qh4_UuioB*_vtimLv*M1nB5FMq~ZE~NP zq*{Rb-`E|kWRWSsMsq#t6JZLA$Z=~etmn`v<;i`g&RPg8?e!B{Rva;S ziiOp+)q8KbB2>N3n)gTMBvid>`q&93QLeRcG#@HU?gD^8g528b_h+6;K3re*>KUX? zV||!cRIp+Czm*{OoViD-sCI6Zx`5oa)R$eVDj%YOTS9enNoPA3YNm(TKXuN3M5if} zq8-QTHb>by>v55q@y?)6n%Co%KX(9-3(mczXl|*gfj^@=GT)&vlD_Idc*7^kiJSEW zttHXpq51nfyY*EPqRHU;I;n4cF2CVRa_(A7#9Ur4$c*a?a*iUdo|m1k>!ZXczM0Rn zz6uj#d+X?9E7?ZZyovHs7hlXIl$gmP_nwuMb`*R{v?+V8+ioPVleCQXI~O1b(Zlzc zAEyx;2FZ4pl4$qGYatJKvT|9036_8jj>CK%_Xlgn6-|F8oUUuH8P|TxaJN3i`P!Vm z2!~8KB{gN!-^{8XdzLE?2RYRT(c^G2;=8Yt zq;vvP;6Ei@?<1^-uKG6Zn9yfTXtW}HNXBvf5vz}q0=g}nPF9SjVXq#Z^u}I*n3!#` zDn}4n+#b(H$v;vqLTXI;IrE8Csq83l>?#R1;V2fcvO!y=4pwE0DTkoAo$4z&@^I5B z%B+R`zho`qsc=_ocfv`bF?8$o__L~PsP_>}fc7bup{(BiSCC81S?5sR{?TWSbfx<^lDgagBI?_!uMI+I z+W*F5rX34UB(ODpR2Fk_E%akl$GKsjmHYv7j7}I%Pr=CZVf<|gkBD45oHH;sJX6FP za>h;+pP2@-w}iFyTxqJUvE8VM0>IntgPOyYduO%i{gzBmVJ62dm!pE;1mMiz~~ zjN{diwJ2I~27kv?47L_sQE|3!)lh5Ec@x2`iu0^RcuRS9O~tuFsS*`_Gd=x$pYHnW zu2xsaWacwQw|^7rq-Gt^eVx+wnX8Zvz4ER;%|CrRUpAepll%2esAf79C->#9kFkE) zYAxJ|;>RAy{@*6TD!ge2NYj2npZ*6z>1lrmHgR}0|+*;Ti>C=A&#yDRzup;&~ zYvD2UeEJwD!1~~qbu?Fp4?8C$c+ke|({$G5$MPaaNq<>xHT@B4t_2;rQCkUjN7BF2 z?0D;$Qwo?j{83uZ$cO~w#Iu+z4Xx>N>W>QtBl??|1Y@W&x%i%7T@+;o(*=`7B=dD$ z6|2m|!QzE2${eFI;Yp@1SK+`?EBSTJS$Z@I?56nP86Btx9kdpfSPRdntzH`|shvBC zg-51G&IHptZy;FsGS~24efmeGW+B$w+q^YMLc%{%ySoMvWnM9B@XWe%&naAko2~SN zyw!aTZqBX2L3|i*!#`{#C!>}^i(r@VYS>#{NA-qVF3rQ&RKfA~Fld+iz9)#!J(6$Z zD>G;FF$O&yieC95**To!(S0&o6)&RF172xwl}3OEjHvT-JM*!5@uke`-tSccnf+>J zBGoQ%=b>p&dieRA^AcInvhT!}caBTeA=KB@n@*cUzw zTTg9l+1|^yJ}1woNBf9+h=mjTdd7}23Jl)k*q3?i;t%E|b{sUv0{XPMxEZMNtd>PK zLVL_(mMKp(*XHsbV1810n_KQQE;W_r>r3@+dCPBK>Q8Jh>9gDJy)@N3*s|T9c#S1@ zVJ`|peVP+1d)U1PHP_DFJ@@$u_6UC=OI*PBJN))k^Zok7%AQoQpuhvr{ki|(=jP+~ z#L8kGP2l~+c5ZsTueIOaf0E#u7$gwd>SqpL2NsjF2y{2N|DDTX+ z?3EK1IG01!6hu>Qzs#WbU#m3K*r=UN6&f~+>@BCv*z8~mUew8!Yh@X^l~%+m%DvK7 zO5>s%1V5An#+A;%2N|CR!;Jb4?CDh!|E05Al4!oEJ83HW3mHC8xO0k0@T%N8Apghp zvKw4kU>TnIM|HOP4r4BJF6Zsc7;as>>9iEP`JD^y|Ii6v zse3vUGx2U1_&Ptrpr5*lfhzT&@lGgAj=R&tHt5_VY|C@ovb~3uyjaATV~p(0640u% zr+EEL?C2Hm%h?`&6rHAR0^J?J3H0{QB0|JU9?y3Xd`qce(~P+ZgX>CaMWlPrSu83D z+^Vqa_cgeA@sC^w#%U*MlHOJf;AGFJRP9a2nRMD}%JK6muk?6RYUF)|Xr)G#M;dzB zn_J%VTS=)O<`_wB#Shj@DYFv8xvEcHS!#b=pC0gJq@jjjmOeFuAGeaH>K(hMJ$P0y z)k|lVz+i%QuS|c+1xHg+nW^X!Dms!Y@&dD=6mQ{qi^2`(kQ}^EP5=L~k{^PAK+%B1 z?yu_Hs={~VfYbE4a5S+j%rY!M6jy&?{z3nu_=EyHvF4vZdxFZiA2a*?OrJb@oEWme zyx$dH%!U|A{LU%*LaAT=S9}2lYh{ONc1`=_(Kn%cD@OQ>R*YbN+D4Q!&t%@0<&Yoa z0;P1kZuy<4-?kBxyxVE!c21*y_!n-QGuOS+<$}&jg{|nH)o;!n{1j4K`2I!V)S|m7 z#!>5xpYthr^AEix`TkqnHr`xTgo`wF^FY~hik;)l(tc7csi1GT;UA4$JIk+>iSlN4 zXDeX7Ve%vs75}hXI$ov6P&)SVuy0T1PD=Ci?ecE@$?KE$M_NwRjWc={#f~H1)Hy>; zxp4Kne6e9hY0mm(I3IHd5yR`;X3hC0T_fP@X?}$E&iOJu*>4-Y0}@y2oJK+F;t~qb zC?HKu8{?Ni#KLH1AVaxXM~KntzX|qd(Gt|ZWt;|!jhAvOsl7{zs=~&=v#0c|OD|o# z2yB}27ZDgR8vD_Cw}l&sxd5xzPA;zL|48howq^I9oA6iojGxPif0r!FhQ4sNl4!R% z&Z__(eI3O~bZyD3qyGjTr(fR<9w$(cy14IufQQb<)VRCDW91e986FSn+5a6L-@7^o zk4pz_#C+TJ-~$Yj-_X`qe6#jSshIIPjP1+`qL|xAe6sI&k7mB=oDX=!!q6Q|L~i_>LC%8XlbPc} z_6ONtu%1HpD!%^cd%3Tl>ipW*?d#aHFrzbnAYxQiK#XQSAR7Ms57@iyRzBlT0I;kp zEh}I{Yr4o|om(?H-zNrfnKkFzs0$c|nW5!DYm5;n<`S zJRT^kIy2CD?=p@}&m?QbY#xSHlhKgSIaM%dSs<$KMvxUSQR~E@)Jh zygb{$(TDyOb*U;Kga8)*Vx|uoZ+`u^IDWg;N`53Z*wC8tudrJZuk}vs?G<|y^QndK z8S3)^8kb$lo3#5Cyo2dj8s10V^bM1H1p|INc0`?hOb~4a1`|w`CU*3;k_!!g#5mOE zhZVsyIp%i~E7ct!aZ6mI49z~utX_90w@izqBl)2OjZr0Pug+f2yx!M4J|^05r9aAU zj;5_v(=zI>8?@DKVWY%0#6I}%I&)@~y_SBHDgOXz5$*&cJPQU^$Bzv*-r_Hcm-15# z(Ri6Bh95;5n&pLzr2Ed&=8R-QtP2StJ(%>lt*}aaX|N>=x4l`N4{Ws(H*!&DzcMNv zd#K3dpkF@uun{!_{$?e|nkOc6e8~P{s#iun84ursiBEgQc=Tz{_&mCl>bovzui>CJ zdirT`{Iy`}@XmXBt`tyi&p8i->tN%}e#C=O?j<8=8pfp&<$ZARvsKRQhHTDL8?de} zbre@-9*biyYch8v_V&bD)AhCNixU=r6^R`d)2mr)8p-H`snG~M@guThM9&OXd)2fRT8eE`QQ1_7=yP`2(A**~bWC>1Z1K@r45GCm$9J^q*xVI}jct4Xq)&pNkp& zXJy`{DA-o(7oujial^bCke*Ey!1H(A;CUj&%uk)0j6Z1iot5f!AH57yE?meQpblp> z6s}W&38#(?2R2*D-_k}nbs^eBh!)hBTPHNTIdxLg+ z;6!GmMMK)3mXQ@0bL{g;25;~-R7Mt%B17P+$?Dme8?!G1SMZQH}x0;j* zPJX)*e(_jxOh&F3&tnERhtK)@X?I^`wDJ=|#Ifo}ea|ikrw&7-z-fp9%MQ2WdWgSk z3T(d)P>sR$4j6~6*${KUIrU`q>v4I zP8fz9Wd83fYTE@FY6bo`0y)^5b)s@TGg(s>OsjW)E{YwTwSZOrv3(zaZ!WWVX+Qxf&a z1PU)!clp;CK0H*hUDDk4K^rju;|waXe_Qbe&2T3BBbY3y)n1CBYMEI1-QiSq)c3K> z61_=f6Mq<`|3bgDaB6W~`der$yX%@(#ioYfK*qrgS;O2D+4MF$I#O3G!}0b>{5$o1 zK7s9H&R)hLDJ$#kta;^itUyteO*iY(G}AiFGG>m>k1};pB|> zHhvhjo*GlJz<%e$dh4lW^f5TAxtaRv8@AwD{T)|;K2&jEFnwzy*U^Uc+&#u4!_4() z@t|fImO>SGB${ivZ*E$Z4xS&h*IAL4U`xk|!IoXeg?xKm6IiHnZ#_B7HxaP5mt%28 zo)q1`(n>x`&8lOS>|iSel=OLN%8CMG<~i29wOrX(%yY1@9tMDhXpzS6#MC;XS8z|W zFLqimvG=B#0}}_v&p3(8tAkHm%^Qnv;!m9wU7a{^lXc;4PVThQdjZvgzzeZ2R=&Jg z_8S&Ff2|AG`!S0Xle|bk_U1Hoy7%1#4*+D;DP&)KoKA^J^$M=RPFrmiP@#;vQ)#*_*@?Llo0<*wnzpr1a++ZcMbh)6)R7^EKYxBbn zAuUeko@F{{m0qGhTBgqj(~oLYkVMwyqDJ@fvGfhKl-v<+AY3k1u~@pME}FBoE*)%n ztCuQi_U)GOIX$>wh3PZ`tuPKAvXcJ-xY$dE$aiif*K*g?oSwvrZm}Y}gDrbm(V63h zru&w(9O#9e4a0V*a#eWK_He`6@JXTPR>pso9`55bq*#nRV6ljyXTm==ZND+SOsm6a z;o0Aq-XxsH%yKQUwiUG0WtF7H40cR%9=HEyX1_|OgyA(Ciy-un4Y8;G;^8xt(0b-uIFidqDwD9#g_>um)_mLJ;0C6~~0Ddtzt0GrBgBY0UWf z!mWLDZRU9M7E1$jSFA$CtMrbt_RCj$HQ#~O&&_Hvon7S>5A9kkufF=Awgc;@e`!#2 zrkX|!+%uN~=O+MlN9KR_(!Ew5D(zBYRY&G)e5c zp4`a!g^9g=7P|+2Xs@j`V&$NXdWJIS{25oEe%EXVo;Hy`bja0;YldVl!La)^S8Q5p zEh)7x9Y|Ha7|FXvJJym=X@@<6U<yaw?bMN^?1l`0HrpTlbwGzbTv^-aGRyc(edl z_2uJ;$8xO!nBVjI<(s`T3wXo3=R-d7WfYq2Ui-}kZ1=iH<`4Puo|#|duZuHt^4GmG zH*-xTC7Bz!@ceJVOAu{x6Mj7t{=(D|;q+y`P-^NxGx7iCltO~{vPZk~GSpf!W?)Cn z#iz#PcYs5+BeI9sEnB&r7%*oi@+lkcMGaoS(9!H!IXcfb#RfT$n5xvT6+-~QEb-#||vBXCN3 z-qO@iB8VuZwq2_29cdWc?9k0Cy2<`Zd^#6To%44PGx3a3BRsIUfQr^UBOQxCApKRp zgQ?zisq1mNH3#wAPMa38+w!7q2cihlGM-32H0ea=eWg?L~nYs=fce0$;K^$pD&7Cx_hm>o@)*EQ`7rf)gF z&UQ@mK`ZiUu%#WY=N#A4(TgaCVmMHTslP@2p=avSRUtb=uQ=9E-J*utpuN(H>@D~< zLtCTR0(#9nLu9?&DwMxw0z zI)XcoJ>PD#B3qEQ5w_EPt6M&SGw-IY%Dsj$KN~s8&$xR)xeTLedA*l!X}Ez^AQY`j zg&r(NTN9p!kl;%q+NcI^yv-aHCWIvj(ziZT(>r!?sAhyec40JqVF_0yv7!9!8#|Bt zQm#s4XYjXw>{RZ{xGIZ%g}(!0pi>*T+8%!@V!t1$+^YsMA2Sl+OVnN$4iGZdm)@mD z==}8u%Y!IiR(hCk)+ZA7t)?8T2Dz4kR8E%ycI{tL~b?HftmZk|U{j~P&89uZXxrAPRPM2Vdq z)QHb{TqEX^A>V0Wh~_U@qtul(T52=5QjA^_L8f6GtE{G_>K=ED9x3=8?##QM3~~{# zgBn&+HZrCgf_5rbOgSh*v20{+@zI6FCAs1z8CWxWsl|nJD1D*n?}_MgJ!4f~e^Gy% zzK!IfeyG23ay_{Hiyh(i94Tp#_kubayRfj6$MPiq+8?K+eplg&DwaIA8h`C=cm1$6=`UVRRyN*w)cYPm3ik(*xk_iY6siJI8Z7*N! zj9_BlO*2nrO2^OmD%V#V9X(`4H%fVbLb`g$x^Q(J2JYMbOl!b3Rl29OBz~+qJ~S1o zF0og*9k!Bp%dUZF`SZPqxi^>Q#yMY9Lds|rTLERn(!Xf>NjY{1ZS$yR_DT;g%Wj$R^;)x!?jhUiKTx zl$4z^WIIxpr3f!0;l*w^K^>a`Hf;~K?C%x+^7{DgK>{ay!Nh)6cs(Dm5M4RaC`Xr5 zg6a^}kRE1pZI<-QA&N%(_q6tm9nN;b6X28oX3&WpRaWvaMoAe4-lh)Lknuq%Chn_> z&iJb41Ti~l=E_Wv5xfWOVS=koz4ix4UG~SWP1yAxS;@<(J(M1`KG?Xo52=}3WvdNh zaINdJK?dg8SJTJ3;xMD(lbR*$+#xlDX*P(RqPe>o@<|_(iUT# zy}dQqXM^Z|9bwf;ZE*B7&3Cx8S7gR9JoBCG3}K`6ZDW{HeBTJpTGq^Dn*2c!izL^= zY=Qz|SDuO%O5fc`X+|57O+9*Et>>G~jEBZ+xghal z6^$xqLqeZgVfIsIZRQ_pf$HJA=ksvZGA;B10});cyd5ZkP2UzNxtKp5-gy8jIS&K; zj~H_vj>i_jaq3IC;&`Smi91NUkQPfNXTu9Z=0H~6so1Rhx;ASoX*M`w9b!L<)~8L9 zk6%P!3s_!%YX-}QuATf^ZfQGt4ZpcYtmGx!6}G=2a|I<@yH+v=^$R|(H5xR_Hb)AA ziFe9_iA=fMWSBNP35atvt%ue8V7@j^3R%)LmL|m`3fVX6_#6(BD?!oXuUwE#qj*VV z&d0*eoNFlZJGu6Zo6%nZ)f_120>7u~*SSATQ`C2>>Z3^!MIXy2^Bhg1k+O2DG7fc_ z*0rS+Jo|`euK)Z}OfB9PA9oj9+cG-Xk#ne*wHc|IhFrW4*%;fmhwQybSw_0rgmi^J zM@J|b4D+O`rIFNjdk{R^|^01vkJxPcPUw<9lr0L@#KqVSz8C zrJ6|)@rSsGVn45$gkJDFQ`*-`-tLx`)=Vn3l5hfI5KOF^G|Ls(p? z!#sA*8Uc2pLu9|;;WfGuB3`UHHOa5&+j-9m&M!wAI%=(jdqOxqe7i#Fn_UuGGCbCi zlkFblJ+IB6b`%-4KQFRPSm4QPqr1s#zu`0XUm*)L#|9g?r^nWsgIm1*uq{yHTI?!4 z%!z8>|-Mh{Zbc}*|GI}e@RJT^<=guOI{`BM7uMIJ4tamx`{do z^xqx(qWAQDMW5_Wf6Hed6>d1zj;{B&)u}tkg}ozE1V~Rhq9m9aPIwtY)D^@9N-h9r zt`J+gBCPEzA%dZ<940T(h>}Q6Z`nxMAI-aND0aR5LcP7OUWua({~NoX0A4@A{1JO7 z-M_dz-0-Zj34J{c!C`ln91ua}inFqDkI3L&srxRG*6kn@9qVA&KqlKM$0yCT#6 zMZwgdNJDktyjeqzqA6&f@gU`m3i0Ts4?uYob#6?eSdJJNtPpvCWY+G>)gJ)Iv$r!IN$R3=+#G7H|*oN4i3)nesXSB&B#{x^I&JZuT{`vv7kob%epa zrzPC8zLZng0mC3!)k^{&PhsT_{-CB;>__3pAGqKB#|Ap6&inPJ94YmS?TH-f%FA{j z+^~-1QnnuqfC_VtI~5_*M2R^FOo7JSNfWNPI=s~MAhDv%>NngW*&3KSrDSA-zmew1 zM>?G7!@ji+v#w?wW7)w~q-Pyt zVS7|V6+ZAj8b+w*gxJ-QF5}SN%TvB-6HwLBGh#iAFKHEu_i%f_>Y%o?1NrH>-v5S5 zKY#E0d%efK@hy_Ue2d;cr`{ijeS_YA3ltAk_+{xO+~&nRjyrRZ5QGFmQ-jx_Kqd+= zo3Oy3RHjzf2CvOL2(TuELeZ?O6qXCHcWMzW1y-|VU-guaZ0O%e38tyR>oa3PALV0& zRqFfiLw&sO2kQIs5DSmn;WOj>ZK*Bx6}NLed4O0~R1 zRq7>{IM|D`UYr|XqA5@&Tbaant;A~D5q{RH&(y%^*biIEN*G|2Dd;|jCN(lQ^-@tk z;X>$JE+=-g25lV!K*2YXWcxBYg)A>GE_Qp{abi>>UmYf}HaFP4s;2v3cbh^6yIL2| znueHn8{I@K5~6C3!?e@YgK=>rWY-Us+|_BiF&o# z3|Di^+>+k(pqAV()trkR&aVe^%Cc}mE1}A(gD*43g7Y4qWt3RRGu3E;;gsoj_7U&G zoW17Zx3uhXhyXfZb7rwYght(}T%i@F+yqsnhcw?)T;$XYq1XA`2bq&-vEWudl5X(| zq{1$gA1}TrY7@BkZgsE?gb`!8reYH4P67e+m|GPuQ;Y;;ywhYC!S%izeO8%LMy1o_o>IxLkgxhK2n|7AyM#)c=!AY+H5>X z1S8S9Z*|4cl8JlN!Gh`<3ho{{WN6-m2qhLaCIEViMw5rqHJP)=>$!+T3x=NYFMF{6 z{Uw&3vmlN52i@4ujm#Lub8@J0$|5<`G8FHuA*hTg;H(Gla(YLjJ=+VS;K^zD_2+~8wrB;v;SGbDdB@@@w>A*|F^4e4%b5e*k^qE^d zq~C<+QD$Gt8`7<5Nwnc7c;glPMD$l2P40L+A>3j~?rI+mTvs;!!Qq#nxMxkWTa6&u zw>EiPajc;u)^OxQLxxP~Q8T3Ap~ho?Qz_vY8jq0ll{}tMUYD#ZKB3{T9jYrfP3UpV zkb?D%d(`E>P}{JfI#F>aavJ8{D1l7u>Uuf70Tb(Mf5w+TV zaJa>Wv;s5S%PVu2!^PpjBL+~Ee$g;8V}F$Wy$&Bk+=8EVrw*ctmq5uy+Nh|OqdxKs z#XW{HQ*p6rZWn`vlJtLaNQkx3At5n*QjZE z;!pTi@N@7@iqe-8w;56}KhmO;T{!S13a)h+*Q@adrq6+K1B7ry2B}jy+mf!!Ul41k z7;;74gx*66zKpaeUWV{OQMf_8UdxjChIh>Cb+!3lcD|F*=bIQt6T>)Ge0nJgF+XuO z-4adol#QKX9sHjh2?;h8fpyV_K3AeemL_YK7bHh@=+M(Uk!_Y+EZb3F!p@P_V&Ns5 z9-&D<{s!&rv(d@^BQFm_za8IUG5spOjHDi*EO!jjvK!gkWL@lMt?EectJ*rQXbflhm@G@OSrj~m zqwdy6>{7%f+Tc9`B1w)BOO~Yqw`S!jYE^q(Vzrdn0i1LK{c($1@MU+elNAS{28yP= z02ziu4TRwR1x?}#oq=~c33A0kBTSRw3BOPN2t^_O{$}&E?s<*d>c!DZ=saBPQM#|c zz047Du#lqRqT(gPyXRwKz8UD~Pm@b9+?l`80)D}Jc-^e?Hb{rSk?00@-wXEryUFRT zCYdy?`(q8K7u&joZ*8gtb)=qOcf|pR>LW8daIMgWQ)>b}g$9@FGk?U4N*yVCP+rEf zbT6+}EvAlqL&*s)qUT533ak0`e#$qsN4n>yujiL4Wl_{$ZN;aNnXkYQf|_enx7h%_ zgTwXSfUSCIv_YF1-&djQU zQYA6)@zw`)#v<>rk5C-kSflYr`>UTaJ(b~*4-}#eEj9$4P$M%3sK4k5(vescEcK=z z2@HZlwr0S`*32rdRMdP#n9qpr>Y14?wDQDw!7`!p)s$E0eKjg`reu3(=-^S%z0D2No4ux1qapl+IhpVn*ufV5zI+(FJc)@lzatQsk?|67N2J<`htw5@K8l zg4)4x=nl92$F_kV`(TOG#4_=JPPy)-F?YT3;{Z&VvFV$d>4VxUi_BiFkx*?k)psr9 zRSlfaGuJRJK+3#x!DKB!oIV|^Sl@VDfbYrelT#5Y!#ai>4=?*GF!lLsPW+6DqG^hs zA$Ihgs`gRu5_F)!4tfqN#}JaU7t9 zU)3evh9Pyz5|&7VB;MaY>+BqTihOZvhaA?w31``jwGEFtWXY`9bg*&e*L3mN)IpCi zd~r68N@(=5{~iIF!w2&{LYA^x2ME=^cuh=Ud8u8{68a@GCAOoHUlCJv>Of{iU+WsK zaP$~77E$ENxoU*J$bgpq&HP#i#?XO*PujIO*A>uo(9PtZ9p(_eo!d#QQ>!eRZ@Vsj zQgK49wf777JyCaODNP#<`fY&c5BOM1B}_xB6)jex7f#Q)f@_l#I`Bn=puF8b*HpT) zcDKR0c&wv{(qBanyvk~-PWHK0#l3r0kQMY@uIiIlyWXYxJf$=H%}Qvt5AMD_V@5(J z{Jw`C#;tt%t&t>Iu&F!f*o~luGIk9uCt%j>aSSgtOvfq~f(x?Op(+neEU4y82U~jV z8XSqF#hbO7Bjj=pK`$A)jSO)!P%$`Do;bP#hwAEhP3vLA5O}Hy4~(I`u!FYlBMF@# z${%3#?n1Xg%bpB%A{Hi#Ap67`n#Su!2i>Z3(f1_#IhNBf5{1D5vO014c*R2Wjvgwb z%<09`H|9}iWOg_Hk2Tbl!+s06DO)=_27nD8D^dXUkIQWCXx_EC6QO=Zp=;%CYe0zE zM`Y%8>?f5=$SWS;rR`OLypsxRPN=MbSsjG1!f5C;lLz;9z2Lgv; zajirqr`PkJ&woIg>iE#X!j4GmjVy9}3~71Oo=0(NYG{!&9bo*PBT1?EF!*L5Dymy%){z^oIS=5N(V@v@t?7mM~4Dg=qPo zdp#Kecs53OMzy2oYxh^TFCBHTL~C6+MyT1k+Y$|V%)mBVuQc?TF*Z>!3cDvmSkScY z8__P(+Dd87KeiLJpwGRl_vP4dg2Vt$j=$@0g2c%+_XDjsMjkjafsDqtLcWjoPyoZ$UuFskRqet z_w`N@I=@Y7LRB>Jh9Z#6*o}SgbWFG~SNcIYRhr`i&t-Z}*V)L$cL*1qK1((rz7^}6 zS>e;`s6k03K~hP2_YRU2B7Ld1f3<*epAAq!a|V#gG6z$YxBEWdhs+P6K&rQQbH z0oIk@1MuQr<89cR$x#dy86C@DGQGq;jdQ{=jdO}+8n=9{al3(^CsrjsO%G=_tCtS7 zUZ!^koSJV{*?woHGXp+KyVz)ztA0$J-oG9o9%h`eWgm(s7Pa5U(V6QW;^xO+@{M>I zJt}%eZfL{JGFN}~<8fL%T8nCWCQCPNhp70p@gVJoNU|i3=}2}<97B9lK6cr73+l`0 zn33A#kI>7zoMDnxfX%FjnCtAdaw}Y7r1d%;9xUQNJHP~wuM?VHSU?!T3pvi@f_W7b z>lD+zI2z)9Gna7k+FO&%h$fEJa;WJ;4me@`Eg_0+XX75VcDI&v95NL2_s%PIdKbf^ zUfF+zam#CwA>i>sq*&KYMQ0b?!a1fs{k_T`X!_yONiP0MwE0Jv(nmAbq2o(0FbBVy zjj?chxJs7S8-IB?*m0>oDf-Yz_g5I4wMG5GAyNS(zmM}gH_e%%r}*R*%h)NAlxc0V zQz#bm;VVq;%W?SOyhY;Gs>m;w7}+9^2wtL`_^ko>>Ia48cBjbau~fm%Cd!vq8J3>Ru zW=Xk1H@4ia0R_84+Y)LNy)%{?2|z#4fL@52!Gby%!v`8G;olhKbEd!J=_oQE*fUR#JW^Lo301mHD=m^qMrzD5$}KB!^c`->=OOgQHLHXlwAt{5PjyHDnuwc z`lc6bvT(-v$SS)iNY~6^2J~9KFT~{u6*!j9tz}gu>2+|7*yFH0{Y`6MDg4yDCA=)o z(qj=E`*RD~);rdVVgZOIE-}LUXL^?Lz&6M0Qk6F)!TDWLin8Sce_xi!wiQlG5t$lm zlaq>wjm*M^;HZY>3J0dBBv}l{4gWL4@Fxw!KZ*Qufg&htN9R3FFHYB^2fhYk6a2L< zRoky9wzQxhA6WM^71s?|eO#&l>=Q)UFPVzao_4YVC!Z^Da^=_Q#kLFNbAYfFPjakc z6>#K6k=>tAjfgY{$0HBPz!A~EsJ+FPzs8ZIimF$ub)e+FD9?Lc)ylA_wR-P840ZBMjr|0Cq0>W7|Rhq2grX%5E4yWT^N$QA2eyVRb&CLjgJK&_?k@obF^%6JX%1??+N;#urO`?&8WR z3?wV~H?ZvVJT_7DFV_D5yn+yxZ^qcU1{w(X)tJYp6v8eV3p>PA8CU0WuDf0wDl+9+ z9knUWi?sY+(9<~8Alr+as3fAah5LMhaG%j3>^@FC&fFE-577N6Js?v6)gB{Ai`-x= z@MiRd4n;*Pilma(+b391uBBeJ{=W4Wy~ujOeO9!i!nx-0Ku@x6VMc{QHZ%>3CVV>& zjS`3SCD*Z+=ok^j+#z)qF}ro6(q}uOsgvnE@dyA<=6oJU1yTZPS^Esp4_uv7m!q&L zW@ZHIVJPZ5P=KI1il)}E){JR~I&~6PM1}?mg|_z!=vlEyk4@J8E6)rk81gv3wa)7S z-6@Ld+X@nhNA@OeNNc~OSNo8;lG}8BB76NPEpJtKzR2zNA7ID^Sld}0pCB;Y%8`RN z9o{2i0u^sef>-Bo6dzu>;Z>@-gny|*c79m&xJ0)X8UI3oH8bKVe;~Ntv>pD8#>hXG2`JNjXh39H)0&g!Y^jgTT+$4 z`!VA=DKyvW`@UaaCp##>Y*|Yf=*k;>7-&=p4g5z#+hXLwgKUCws*wq>el&R`IXMjKzFL z%M)WfNgVF8GPB0iRjg?|5)WCTNEAil)9FR^=T8(wTG#NzNtL|gWXqv>2rzqmOkqs{Ih;vFDSD6Sp*e!%0F;W5oCR+@Wkxw z3RF0NKP&(9g*XU(Orq*9SJ$YmE9;R`jA?) z!&jLhrb|>P@<2@=;X=(0o3dXvQP8_=m#yd@@eiX>bf{9MI?{4xfuJ_%iam+?!&T1M ztbYWXFd>DyfICM|GDwubIb1TRL-M)Mq>@nDOQ$I%hS;=W8>vSrfyIA z_7uOFX8_@5&Fs(UGR^E7G}C^aBEGxKm{NkKW(G~EPiuFyK1EuV+Zf+Sr>WoZTgJOt z+4sqnY3LqT78`lujr8+=Ie9z9u-f^}HSOt-3j1!*)L0CRXPrTCGO8^g_BaO^iMjgu7O2)K&gKdw%KS%0M_-NrmX=ePpFn*D9 ziS^8D-@%7~7P~TOl%!W8a_QLQEwm?}eYMwD?S0avJ@qp*gvgwHKlhrw$o(0$W_xEr zP-tW)Yh+YTu`~Q)cdOWsdGQgt%Ruf{hZ%@}6~#VoARH}Z5XI>Yct~fP(;@t3^1E;p z1|NA~Eu~Ky&M>v~up9PtNRIhfOXi$j1)$zlc?D|q3hK-06&f2oDsrHmTWp|hJX1X? zN*_;;81de!zv)Lgbq@k1)Q|alQnw;2knf8GnQ!8YqalN4w#IaCdXRl>Z>2ZqS#SD-;U#kuZPT-|xu(27gPIsMnkGw}aH1Z{lx? zjEh4z_M`ZR2wL3A;$JpQibj(^lw%oUmkm)VHUE_Ok1sCv;~cVvYlb2aV1>W#0}sT6 zW%ozrv9l+?K3j#oscAW(DasvNBKr%NrK=&iEf>cPc~87=+d-$u6SX~_eaqU z#Hx5XI^a34HScS5q+x7nwy|iLzF3(mL5@}L7&m+z=dlWgY4{2n`j35;p>uR{yJOKmMnZ?$MCh0v(#nsMmXtuy`FIb zQ6mGnOSz@L+_@>Tqrk&9(PUorhhQ#30b`u*+DMdqtXui)*Yxx@p+-?;4s$1~Hw#Y! z>eIZ!8;z!=Dm{$T#mP}UO%59LMzV27!C{P4vsBM8{r!Heq}4}FOg&kKFaqA0DEiDd z@8`7n@UF_08uW)96~}X(ckS-k8zjdqb7@zSHeZ(vD8n@@hl3j=udL}u+EVYoRA?7h z(PY1(I?^zaDYiB{f#@{Ya%|~W<>_Itr$cSpH!2gFCP#VRZlR_>IHA~T?n#<3)rg&| z$0qHd*v;bsC`U)DFxp+KR+EJ%0qRd9Q>BIhs{lBBIK+{ZP3o#BJ~0|OwrT98p#G4` z@2Nrn8jZBpxLJFh6mwYcA?G!)M~0DwZlBga3V5SQ&POCpD-eR+RctT?#%}(-9uS(H zlAP-{KT?C1P3&QSI}*`=o+Qt)d;C#NwiVfDHU!@#eVn%J#q;wcz>^#%8zwz4Y!=Rn(Zyt&gb5{tjf|? zTe16WHq^%BKqS3auCjS^h=a_}KKrpgLFEs*;WbrxB!e7_39XlH?1Kz4p|M%BxG0@K zx6Q==k+G>EhqICiws@La=V%k z6r`?li690ji}k9ybZMmZHzZQk1^HDi>|;N}`kmlJy*X~(&2Whe?B7WqHwNxe#R0b3 z7pjCRPt#;Cr- zf$id6rl5>>{W)%YgLSDkpKxhE@-Bu{O+GpvT${S8|6nR}jQM%n6>%*2Dl4UK$Yn*p zCH`-j8uvTl-Lt>yE4)>JN!@2|h5&;;RFTWrv^b*U)y|hu{q80BVIK*2c9hKC%jjeQ z&;F#BZfjWMy@Lrb;5PRybZO6#Hh&^RRED>41qgWdb4NLz{TCJ5PvcJws@~oe`nA$@ z6q&TA{K{KN!$PlWc4Y|>RCD23V$e^B`!}dmkxH4qaRUXt6I2RLR+&4_oJA%(<%k1Imw zM+>Yt`O8HgettFTeN_NUdkP`v^HXt^)(3cRSz(Y6Ij0ZGevjOLOmA)Z6pBa&>+ESc zvmcGz*tX9xXLDs)JqD#QGS-#~D@OA+P7hM&|Kc z7I#r{C@4=69BenQG*0N08AqAzu(!9ZNVaeXP%fa>fchi~Az%k3G$xuvRgy|kKfjK}Q7bW=>#sNM9Y&?^sj(obS1n@M*$Vuf#4|es1Qo%25yy%GJoe zU6iZy^jU*Y%O7m(x11h9G7)n{>F^mHEQG93lg%c_KB;#m^dsdMX+>IVo9!H^4;(?H zOr-TfHrs3S->e((%7Y9$Pf7v|Wpxe{p+dL?|2AVH7$HMU#3?I*{*qxT`vM9vm3yVQ z(hb`iDh;z0#B7OLeo&$`GL(j5(>o;4tj%lN_JM10lv6wg&Ndn~WPhG(hrqQWGj~^V z%0X9rFTeUxjYQ3li_HERX9k?T9~taA_?SLN1~{j6)c<+_ey*_G>gLWx&>E-J7V~nC z%$SBq5=2=M$Wwa-C`pEry2QsdiMQ)(cpfbXPxe+GwW+iE^ix^@GPxry7twSLcqCwCQ6~{#tY|dla=}wQ>QZ2l=(5tkS5) ziEi6`Y`MYm$Unry!Fahjt|zy|!rp~$20zAh5l#7i(+OC2s&ZHl_vvN()cY>H*3t0i z^aPEgsYjaCYyw!U+>M9ipmNf^A!Idl6bhEhXX`=xdLCNt2ISQo^L6K$)uRP|ogW9V<&oCeJy_vA>I4`u90`a5W^XSk z*h0I#IC;bE&ZE<-G1Le8r%B9#_}goyrDnN?#aGniNNduj-L?D7(O-9-a&m67^B6<6 z*=@TtyS%rXjMY@9<_%TTr&%AWaI?0h+8Qm@^2{j;nonN`rThC*LKPuN|wU=Re zq!h*rvMlc;TbX8AUUUmA?+XWODnnz^9aum^+ z-|j%zLeQp7ApFHGQA`%ougYlx}VI*e6U>ywuTJ zn3w($UV8Ew0V{3&J7sM#yYOSbsg?(M655MLJ$wT6hE_iyHbr*JJ3%W9`=4oZ{k z4eALQpcVb@)UP|!ms2>PcfqTOUdeDGI1zuH*0Pl37^AVuU}#RZh*gHU&%|aCk!E1nE#I-qJMDY#mUWt|%Coz5VU_cCrdV=NA?aQ*S#w!simyO+oNclz zNT9K+F6h0SmIGFamz>4dF8B653Y0$e^juDLDHtu57|fNz7a3&B%V68_|uOw*P(jI?UGAv1-i0F^+oJtSLfUlp@Opf%X0Vi8vi1!JAJZ>ZRY z6Em%S2x2^pa;lDBPZ?!hMH;R3(esDe{TB?pvrhh6vA7)7Wv3;5E3WlfeN==iJs7>z zscQ#j)HN62OXx=2I}|U+O6Dwte%)j1T2&=QMN^2|>krefk)k>NweDhr z(@aStniNL}jXqoAJY|Sxl$*-WzH(zOI4Or{mVXWS@?blH!8qnOJ&eNeUDJX|bZq$y zTV=zb(;jTu2*^=$7r8CcF^RneUixw-5H|C={ z1}J`)Yd*S8wC0=q@BPvt(CJkKNA0h*D-RiVFz*;D43J28)epq7NJYFun2t%2Bm7Mx*BDc8mN!)vPPNP zY!RBCh@^NJdvd3Fc%;vOYGK-Ufl7$G$GQsc-ApKj1@}>30G%9k`xjX(t;HNUS3nT8-QZ3t`HVQ4iUu~6VP-?=kc4_t@@6tN zl;`F8TxB+tzyRa@^JAfITVPA+J)|QCbz6K}iXsHDl1F>VuJa4$kXLmRuVzdUA@6fg zHwJg~Y7>Dq_NxBP^x5{KBHo3VTeCR4C8Nst?_^Z@tL;q|-XvgsYaC8&*b)w}M57FF zc-;nvdT(K02ypnGzc?IznzZ=``Z)Y%$N>5D0EfeOsE{xEN;+Ic*DB4VUusa0b|q;c z>9^At6Efs*Ze20(#YG>T!aK$CP3b?*3BlB$HT2G_vD9N&Z1N>JzSui4)Rq0i<#)}L z_f4XISNVe6^5x!6q4H~LL+!tcShiLIu{d4j7h7tk{XX7GZD_*QS2NpTavg7@sAZdD z7GG*vWC({NE#=afMZ;!En!Hs@Qb&l0mu`WGH}uL9vDCIwUp#7`&9||3Ftzdt#Qfs0 z(J06vXrPl`m9;Y2S~@VYU$ssYd){aXc!Ux4rx!?7^Tm2b@{Q;gEJ!{=|AnvaCM-)1 zdiP)dy98Xn6$0MpBRr3jz2l#uXPQA&z|p>i?5IYa0mZuQW829{7Oo_JhNN>$pixNq zQh1&-Xd3S@+SXQbM9IxeoOdS!{Xa>L5DC}+ zD@($+#X=->o#hLWaDOWGrdw);go?enh@GG-XNSw5lqv6%@F$;AzB;#jxmO=5-#=Ww zU#7gT+0Iw_{M_<=ykd#H??A%qbBw|D|1k-_8rmG$3JDMLv2Joe!oqD^&?U9=AEI8Z z>BAc)Pq$CVRnvVc-q@Za%5VQ5=e1IjJy|$Pc$OTr*C)9|JP&;GrSQ#$THjgvp7Vhb z?~?W9c;JY9$FjNW_8OhUHA4285FOd$;}F#*$Fqo35Dip7gFy}%PX!+LxpaP;)j#Az zG#@3vcFqphXYpd74{P3zBN66zHUqOTxGq(BpVR* zN$Ww|W4~0NmFkmqzdx{`KP*U{zXBHM4MouiNa+XrII7+u$P$qDWvXr?a@SSo6Zd4L zzGtc3?Sm~&8&Q{n3YT$4*~D{;$ujRj%k0jB2SWO2)p8Rb?69o+=G`S7Lxv!jQM^kf z6T+4FWWJp$ImIf$J;Sf$XQ4`t>Qc!e;Yxg3U$Kr#`dTG@GL`H{C0Qx$rdcxjW;!Ps zEeyx0Q)7M7tA=|$XeBM6F1p7$?>7dMV4Ejb4XLH2>y=+;7+#lsld-QRVQV`-GitQIAe$^z z%LsZtwt=q7O{P}gE(-lNf#AM*)Cab&%=^1SfkN*cB*PT;S#=_?l6I}%`Qc2FS=&{H zk&5LmE0O)+C#*zn?Ya{Al|CoUdYapOrrq1tOV9B?0t8!V_)1%P1jPe?!t4|b{YhvF z?)&^3rl6nA&$pO@CrzUKn<@CQurf3SX>hqKh=QR6rfH_&leOP+3jRcW|G^Y|;ueFq zeq>XyBgm9v#a(F<<(sBpZ&Nk5G6h#t-0e=aJo&mN6Ls|AZ3T(cpsIE;xVOCep*c1i zk7Td*6Xu0)_YK2lGsjAXSm%}XZVGP}%7c-j1)+py-+LS5hNCKBj!5YQo8;^~IwbLn zfjp|lNa;yYNf%NIs5Mx|2AitV*Xw=Pw8)GbyG(8`R{zqy+1m+_(m^ORvn3z?yP2iD zx573*yHZxD<}Hv_Cl=56Q*O1d^Bn8U0=mUXR1;^e4HHqQ>h%4giqZ$I(FCFn`di3b zA;}%+@Ye7;eKQ6z2>vjJ4#6wpa1OS8V2hB({^MkqV;?wJ7kQ6<=qwPn;|l`;jna=< z=6~Ct>9)k#G6PLxZseBYPMm07O$*~3qc*D`7`p56Y)$<_sEEPh0bxn%QJ+zBN|$X~ z@3T*ZY&^+4!v2v%GDD`_wWeYA#n=PBY_`+@gEGkT0vdsF265&UtZ>a+c&jW3E3Etcm>v!_C610S1W)+ zx>#qbGDG6C_cU1MfUlb)nX(<2>Aa@Pa{%AtLs!gD3JNLmZUbvotSJ2f3xiDky7=SY zj6;M!${Gz=cbM=;%9`(UkoK0~Dg6O}%)Fe!{7ex~J6f8a zcCxf$p8Di9kuRU8zIlz^dNuQ~vwc)jKPym-&!>8lTM9vjE2{xa^Lz5_nN*)h=m$eYfRf$TfdKWC&5 zIp0U!nhI|bIo}U9H~gS6Z^13e7dsRI!?)f3kg4QTP0J$l^QSYZkrU zTBi7x_yPZPCXii_N`czke!Vk+6p}W7hH68sm!KgB%aX#rZn5+(a^hjk?9wla-gOl% zCyjW8D)Js09qI^+QoB-ut{e!=bA9CnI6idKFnsv05@T0KkJmB*|Oe(-kKVYFe+dy zLZkhoDV^F-un38v3xJDOD&tHRnfO_3!x-U$LyngF>6pNg{*sKaIcKBFsitIM0{k#p z6Udj*_OYganUFW|qVKL@w=8lz>H>h*l}F9fr^H9zw(m{oO#hY_+vj)O@N<^3?Q`t> z3-`ZT;UDBMxcgNY+$r;(ewX5Zv{$$6_x{8f(=&A%3S^tOK|^>f_eO_ zdIYDC5-ag+IPEuVH$Vt5G?Fqp#CONUdlC2^i`_+aAnwsN$8_~6KFPC9{?dtCXJT5>0qTKB^{ z3pa1hNDUuMuBsq=Rb=+9${ys~Bb%?PddcvpQFbgft%&x<2!te_%@vfxC#!KfIJ{o} zjT66^t0eyPe7$?L=bJ;%^ZaM8Mw+HJdfp*kQIdmLE=Dfr5HRmJRmB_gmrWdE8eS?} zgch(CFE+(N4??O$W2s41-lku>oqKnlWeQ&s9EQpqnPQ|IA??KkWR6D-(2Wn?sHeYD z&7-Z_ivd84LsVYrU+iIYbz=A!Z^HhY5SX`_rJ#D&@UuC|-?(QiS-?p!AEx)f$>$d_ zASl**cO}z4eX$TH#Pk*KW?HFtIQKKrTs;Fxp8*gp{>UD0zo7}L=P22$#2o;G1OK+A zRi41Kgg|%oBpY31GU}|z7BZe-870rA$u*@ADd)nroCkTiFm}Y{@eaNQ@#v?})2PveeR>^_%jyxnPZ_z=Obu!J^&2npW#ioe!55vE3}W z5t@m(?aol=?fEuz{Zl7*t)D6Kx_&N#jtOu&@bky_AuX0z?7huujJ@E(SKjKE_s}_K zs~7desH!Sa;)^7XO&nWFBr$^8t%|fxU^aA6uP$*eaqfqg%i0yppT#4r0z&DNv+&f} zJJ<8{!8Rw&ln_I&ev^4g4%(LKsiot^pa%-GNS~SBAWv_pRc=dC=-_rFy^J&-4D)|h zJCdbt6aD0u7+JFS!>{ItUSK! zPx}^`eMsvKIjU-HC&No?fdZli`{-AjvDArZyR^m^&R5wu)ci84)bA?)SLhdX$2-6l z#f7^GDuAPnZ-9Z$Xh*%+a@G(o0|}@i`YcAH=OQwAr_!51Vo!Qael+X6bHT|#Vpse^ zrzqBWCz3Y*9jknuH#TIAJh8Wv*gsGqUt*7Y-Bq+FY2qHpxXBW5y15B2|fqhDHH~ySIR=i-`CUZ z>OP&@TroBTtT?4i_X}F}9)k^~?__b3@%Ks=UJT-a&quuao$z^82A`w!8W-IRJ||Wf zK7X(Z+kR(Y-N%7}@daCRU~C4NkAB4=v*CC$TBNZHv2*d+ZOjFzjPesLcIYhJuk!k? z`8PN{TELePUse2DoE~L-t8lm=^B>^!%=fc6{rgo86@T?k7KhH6?QnV;Y4e|@LqhOh zvY#1fq0_c?IDLi+`F8mqo!!&&9ZQ;z)8oGtIzP0~p);^GVcPU`@KC6;@;&Jp^F8o(wDRiiwj3VDl_l>|fo(HZproy=DxkI$r>N=lX> z6rVOj5XNV+m=Gd})zXuFf>^v6L9DV$wm=XO!vY<{KuZ-tsB%XLQX95L6!Vrt6d$n& zMec?LQ)G^9gCWOeyh@I8a?H*B{-o^6d>^atkMh#x`wRZ}VfwyU-vL@9jKX{z8%O?3Sa++h~L?P?k1-IuT0jcFV>vOt^@7mtmbneu&3;BU>ORFRTAm+S%_*qhQL|%F#aLk-%55ohmow zl1KH|n`X93EG7AG;PG=cAA-lj(3z{ED?C8%!e?I2!sBN1Fv!BAelvIsWPz0nkG*7& z3E)xh)vfXyOZTv~7~N%&QB7w>ScLWWv@{vSc>msyFLuK9ng{4A3$((KiHH)Zkx^L_FIpp74y=qCSkr}1Fn1P4K3(s zx*9cYvkX!1c|Swc>|%C*>qsKGC%)#eN;#7|X9X%&;v_Cz=zI24z4NdtQMVZomJHuM zUjnU-r~%Ojm70h8f?y*7zBI566BLNt46i(?B)W8Fv*qBDjG59P^yf#DRt}8K(Zpf> zS@#T9j0%L^2JhTuK-{)`Wt2LX%5(W!bU;Tb>vCj$gQ`3ahW$T@biLFtngPZWuql1HU`d6ml_=U&N z!=N*+i#zyTRIdS}>tY6$>Wsnjn>%C>ddJ3~&e5GBf!%9#JtIqw(Mzx&oNn>-}`4T(O9{&*N)F>Rt6x>e@O?b7ZWz@Dn z!O89XPY-}HmPP){=$-y-TlyhFJksY|dhhGn1lGz)E6c%~L{a13s9*c?;-3-n_9q*` zZ6mDh#{vG*Qx^r)cEt-5y4){kHi?a(O|b>~AiQCr*Ka)aCNEc{JKnajHxAYid$F&K zS5YDe&A(f`lb7S35NEa1M(*nY;jahtwKmyMR$H;(JA)3xU~>bgZb9pQ#e*$(lLrre zUR~F!cU`1)h>`0WTljh(Ewr^V^o`!cDOKXSh*G!F#{j^Rg_73|yeF7Yi z`Wo*6iZS-8Or=^fk}x=vaJwaR_ureUfl{&7)r+Wqd^CCR?a!5~n~ig6W^Xk!(>1g9 zu23`eG?P9L)}{3}@!yy{md1Bbb;y=9?KZKfh!;nzZNGjl`Py8*TXXY8=A24RF7HX? zP1o{Dyw7;$T;*>X8>%xhrz(^8K;<2%ylx#IuN-6fb3+>4A%IgGFw|hb8!2pj)}j2GSCLz zc%}<~`fmMO^0e#UwNm$-v^0Qzp%Qi@~s1e5#JCXiYJ2t>}kfJdyi% zFKga7CNg^&sm&WNi_E@{2k}ONVsP2enfcKnqt{1f>|h-CO)+Qxgc zb}x68ji<6fH&R*C6t0vZ7RiN0k(tNC0su&nA0(^#^y)LJ&$Rf*%^NGG^;OCCYm5&y zZ>*YjVDrZBPkX=RwaIHDtulc8fkUKvjnD%oUmZv zirNM*!M*jhiL}>;?J%>TZ1TQ%Q_=@RP;Ii0v*r$|9Jx%h@;r@DN_BE8Rj2nBrcMB% zIE{;gLMD=iRQ9(5Z&IN7ifCTrvDC-?MN^MftQDPC1aFejj@Bn9?_|qVwEKmRYZiOx zW(mUGNA535U3^nj^QK)U6~@!0voPZ<%&)EZplJ!%xpZlH-hrp}@0EDP;V4UC>1$=J zuT4ACWlSiqge(L#_iai?iUrY>QFJ!HD z^5P0s`y349mM*So^Pbt2V|0lpIKw@ISH|LG$9NdErZD97i z8pNKZ#Z7 zSslb89KqH%OV4zAF7VIUXCCkbJQzFjI5OyOYx~T*Xlo@|cn6*NZu`vR5fc>rF9s(3 zsA4EI*GyBzYR)XyZl8G+y?3PMwr{=L!PdZPyr9$1Ovm$`lB-;p+dyeu-P z+IM3G3M_oT`+R58mU>fEsJEI+4SMnkSJ60=4#Q9Zu-CC}#R5H&B!9nI@vP|eBS2@1 z`^~=u4(hwsDXU~N5gTBY66`nse39&}w%@#$Ku(>PeZqeC zhb4?do5XW{)653%S5(+OSNi*M+RAGhlv8ktPv2$Uc`EvVy}JEn4R9C(G<`fv%I(Xt z&*^6IAfq$IPx~@+{m=9dW!tPto?A}5A?`=wWoY8rfo(NIP8buJBRnE>Ml7)*@lrJL zbX{U`b>wP7R&pQ88wC*0lS5nBms`Q3*3I>R)gDF%4`YIdalym*;9;_RaM&L_3vq(y zxuNIlL(eydp67+0?+!gnThgD1xy_#3^Rm$M^3e0D(DUlhvln_^AA0TxJ!{iRe`?FD zJN~nF&h)4BlF)N$=o#%KlczlNJUH}R6?%?_p6f%;qy6Xj7du4eT#n7QmQCq;X_j@# zGr5V*`>~V=VivO7_R7Gu^5rY_?!CK{z!~PbrL*RLqL?DV_l_m2i(=jLV+Ue==&qIb z)onFJ>m#ij4H?!(X8)X=)v2NExt`3eh^q_gQs?KFwwDC{%JD_TF=>3d6zNQ|Iz@2; zO70Lsmv+_{5zX#Z&bbrber=@X2Wl2p)r6iLxnHT%7Yijr;=$o<62yBr7TqZsI zL1WDGFbFuAF*fmM7Yl~X)p1t4x@PSJ6(S$$HBcC;{M(X0hoc%f_WhmPdWyw>+&{ z0f0#s1W*87*XxW(QFjB8B3K9}wH2L_*2Y50!`VxKV0fHfqpeYfdfJ&OHIWj`z*Pk{ z6BNpsQE$fw&=A|wmm^(R$5*Gg*J3~0Q)p(e&<5BlV-&*?_Iit+^f5La%aKP7FUWWd zkpGeB)t_5Kx%riax>s|LCXAE??V%uNr)$W|l@I+S#QDKGty+0yse7Nh`0Rz51+P%Jv1QVbY& zn#nMKO!Y+yaa$rn%7W)~yQb|BTTceiS z7~X$OEgQ_^q0oEGsO5`?|08PIhaLpfa?~RZ$q&I?8K_`+7dvX%m9&fsb}-hnfLeB4 z>!{@m%zy#4413g7^qv_mEyQ0AwLD9DKrQ0c<&l<4nB;FJ8IaylI3)9g)>%0u^9%7O zpJZxr^c zW&`$F8X6W3K8T$~n>`D0SMK$E)Ne8UE0RrbG(FY(NXFoq zQa+7Rllby>uGvFlvC<^g|Xx{ zotZNmBh)MEi`Igu-gxRXRI4O8tKGJ@O7MyI8Cbju8gey1O>5bF>D_Z)+i%SHfN$i3 zRHaeqN@z)ey7Y?bEA{MtoRasn{couD`bp>1N=?fX%T(s#Jm#HN-R41M^LRajv zm($m9c)<1p!`}z4a33f0F|b$3UYV_cF(6>xwA~eSxFWBPtf)QgG7F9 z*n7b4Z1a*+UVD$B!o^!HoV6!ZkEk|VFUIJXXtpFOix5HY^SJ_a;iR(m6MVfc?v=+o zwu#J~LJzAe+G--TZSrEoJ)V3M2Q&{pt?3h7&~!a=g!(O@Vz_y?xpy5v*6dLXpLc?iq z2?cw4AEPA>Y-?Yc#i;go=0@@MN}g0iWDf(`@=GG^M>zYCgUrEU$V?nykTFnB+G8^? zPFl$g<^KJEK(76fxnr@vu>1(e5wFOXK7x*)%<;-g8ZW7yy#_gA4*M_Lb3r6}I~gcNTpADKTiza~|+ zyqejcc$Oyh2{{8LM|;uKc^I0TKN%?>Mvt;AQB2K6n3{2ii((w^J^fyEgw{Lh zMT}mkn={XV^bH-_n|(a1A*>{~F2012s%vPA>GH?!Xc4hweG#{6HqtnrADv#)9junQ zkO1x4I#Zi!z*IdZ+ZkqC`3?>`Gv2G2br7cNp0UK*Xv&P$AOB6O_3?BeV>BM)EvYHN zW_)U9y&ULdiE;iX?WENv_xm%L!_t2Y5IrBe0_%h}28JkVV3ej(**LkDNm@|3gsimL z=k?!e+t&ppksL!})5`hv z?q;WZseo?Lp-NuE>>Q|38}4zwYHMKZ zf!^@Yxz1N@C28~JHZ1p~_gORqYShYqIyLHVD&${RaL~Q3q8mvQW`o`(tY*3D%vLRL zd98opgY3n`)>!CGA{*ANF--q@GT8Wi+m==!8jQ#zm^8E@=hh{C${igs_Q5`Kr1fQ) zKgbPQ`YRAd@BIrH8{l#IrZ~48q-9NEe>OySEwj+n!KE?GqDYsR>UM%FgG>E@ppRs% zYUx&t3|l}bbvTNZwrewnM1@QXvBTDecj_T}5@IDP|f92vM4sc&Doz{;|sQ z)9W&>j8U&Y8Iz63Xz6I)50$N_%QlOuWO?mI4j<{{B9=uuCT=-)Fvt<+B3}P_wv6n74#Uul_{7OhVq97f&+A<-O}^LIYeMQ;S_>$HyW1a>F}&B(b!Dt}#a zQfd6TeDC9hWGNKMWpw#LA9HTp8;6ka2T$*)P2^POy)l)L(hXl&sCx4Xz*OIFf!vcIP1XA+lvGG^H&CkhxOmc3{g*32ae3_%X`I= zNbUO2O5s`Q&o!xu`PCJdjEP+JGl_8Sldeu)#zGlQ5=mJub$2i!{90dUFk)6!B4E_4 z4~qt_s2)|9_yUdGSeKnJDfJfrTIOz9x_7nu_V{$3tU&J!sa)wZN5M1%*F0}?RyL%p4|Nov&g2u%vm6H%)j8_9ZZH4o$x2MauHV0 zgfr;H+t59)vLUES8E5r7+5erT8vK^MLkz-&djSJB0?O%yG&<&O47tEssW-*6ABZ|7 z2d97L@$8*WCjw>R(my)e+fNZ4f%ZA%bZ5jHNm|B;H%=OcMuu=4`HE8(4pSlD{t&5bR7Ez>;S$ z)j^#LHM(Ts$A1tQVApPupfP(*_iGVG2tFOr@v);eabJOzhBhII$iouf01w~yL`b$FjWH*kaGPrPylFh+jP zrp6qiyF#BKy1h`6)8l!`%FnD^N}tY1o$%a%VwG-k!t)2JvnluV??M2FmgS#Zqr&pjGmw2hR0=rt|$_;eJ?*YG2FL^nF7=2yRc$}p1N6G*pjFBKlx*~_G zM@0uLlzEK$fAq^h2>-=uqW;>7cOo+nr?at&mm;llR8mCv$x!VnJjX9D%8#_>*}z#` zS*#50Uk%`@_)P`TNZoqxX-w+U%U`pmA2nVgQ{TPJYLcTml%4)%XJ>IjVA5Ok7_(;2pDfJ@1`A`Fr{!(PPR&Ss;jfWr2+aZ`WU|iNeco3Tq3x^(dK9$-@%bwodGTLzd`4-obDGV3U1=V%E z@|x=4>||0QR9@d6w0d0g-bP!v7Jf)2QWWO$jX~3k?;rN?fMQf24 zlGA0~5W>USKmr{Ey$cwxl+wdGAfoExiqEMU49`bX151 zK00%PEU?dePhU+IZIQbz3|SM_MF)J~-K+HXb64XH-BBi9{i9orpP)^(U^QOu9Ru{t z4re0>_6)ygZ~kh0p1oY| z_3U(vU!k$3#~A;se2%Vl-3oitUuO#~ys>KK8KuN4Z?Vj|?x4Ghq39&=za0N{t;e6WyMK+cS(jGQA#+o9{S4!@l| zVLjv;-nXcSq|RU&J`wFBPL83;Vfdu9HC>WfY;)l=3vMV zS>XY5^js7PZjT1tLL%}Jjh>~+iJ~3_Fd5RfFYPqm8EoDx%>*!MzYZ3^{x=ecx7lhD zTCY-Z?chXtkapqAMqeQQlBzNSu_$1*8G%^rZSzYLQ$M>tED)RNVpbq(T`Z<~GcC}8 z$H{6!%*cjy5Wo8CDiGD7Xrh3Qv2D@QyZH~+&_KHHc5c`}LLS-zeYCRr@^Bo_l7}j; zW+q!Tu63{dZ&u0cf3V0aj0=CmaO`^Lcx9FHc5%!YDk}i$lq&aDp%JDJ4OYwa&s!qP@EJ~+0qiWW?sjBk;Ra&;-P=-e{>*pvRLIMhYLDz&w$D2F$kcCqA$MCvW19x>E=1<>HQ1UFU*y_fMm@x4!^hC0>A-x97{0qK?$D z(BM-4c6Gj_$Z} z`c}-h^iI}8@Y-O|svw^2cVtoCno18KHF;EGaI$gxuM&+#U!`}XXmY1SadO0VUojJ3 zrMD#^@<8MEOiUva^NH2UynlE6+;--Ff}aC6IQ%?l#uo9D#m2Y7&lJU3zW=x5=O_Pz zpB5?a|3dtPc_yCK>0E!eG4Uy~qso})Chvk4!;hcVrUpIm8G=3kQ}5xpk8w4!qiqP7 z;uGG28~IQ{z~{ytB?T5&g?Lb2a%5iXil#L>V9_!dh82^VN1j|}#r|jWCb;zb#<4bb zn>d;G@}^4$u4uj@AKTlTO+WMPL(NxoNs=}RZ3vR&h&p#^IUi`{A#Fm zJu>63RIZUWE!X(uPxypeH#@T&{KfI78!7MFNvy}tP}mVmjOfvk8rB)_z-&2)isP$0 z5(@{mB^JcnusKcX4Zx4wzGC?$AEo>8HOud|R9-G$TQ6^G_JJXe~ zs_DvC>96Qv*RwrB`)%w{42e4Ex#09TKAXt*EPj6NJv-g-Ge$_y zexDSw^@ell*IqwTO=#Ch{qf~CGS~a4)ko1t%bkFFGc>J|MgaaD!aPRf8_^Q}Og7UJ zT5nZ>71g-37$&+9#^CFe{@w6}S{-RMi){R(eAz1v6aUG?PoY`E#9*HjBTs;jd9>p2 zajHY5NOk1?KK*C)6F&Z)B!`dZ3m>bKefp#7wZ?$8oy|B@T}%x15#lhC-TF7cTOIb6 zMJZ@3i?{o^#`=aDlUd2(Q#7^v;ovQ!Dh3X(Q3(J|-@z|~xm{RXn;PR|u^gk*2U^SM z5iDeoyFMaoz3o8N^t1y}(;^_@ka-#90{tzqK9(F&fF3ZSX9j-@sWOazb;$zGkQYQi z-*suv3g>O9Tvxo!DYvidr=y=jD)Gk){vN_7!8g&bn!X_4dw!LkPL8f=tCa=<7f2iH zxhcK8%X=N~;O9#CC!6ayFnfEV?X!=*v$F+89)AjVVea|l+*$XriJjnoI5zwJ;F(jx zi*n2V^|#^j8y4o}b#{K2@;74Or+w~ap*PV6YreOd?-sPKKB(PbK62YX#I?^Q<&;Nd zqxakA6rbC*{O0=4H_DgZQ#11Aq>r3@IpvBB@#e~xTgdxA^5uWz%m0`1<$}vI^5uc{ zjC^_EvJ8sm%9p9X`XBky`akj|{of~FqKV3TuKYn>hF@cwyCvs6QJKhjPZnMpewUMl zA~4|_H@v6_DgAgA|9MaR9K=nYSoCM0v7RmJw3s4s~o>PvYq)BCB> zMB#np=ZuiW?~uC4I2C3J$5swra}4gcQkU3xsWwkNMUpVZ(% z7`eI>FrbX6jGr?1RM3~J;BXo$vE&)S*A3q2?AJHbzvipD z;XX%`XBK;d{qNh#dAm4$j&j5omj%m3A|_?mCoUe*|E=>W^z(k&wAp+rUGsT7pSsMa zK50G=<+`GQtMl7$_t$HY2Zr?+TQR(c6@kA*8-|xq=a69~ zO;<)9IEgk!b&J1))6T_4ZWBuhh*ug-^=W0A^St9x6k6LnCX-#Fb=n|R90%huN2YQr9o9Hy!&hL=QI z*Fi@Nhmq7AI=ox;2F|dp&QHHWD(%v&@(m;3QqfzIYaJ?vm0H(ynMa`i=fb0R0FU%9 zRY?5IzZ=KmRUdrqRJMhZg=b#jHW=qJX4b6bY@nSE_gfQeOgTqf$&RcO?jn&!vatV@ zU>7m7bBA+>o@WUU*h5sMIdO|Frik2Xv~8rnt;H?+FQkX|4P&XHRT!$w30DV8qWW)3 z_u{l&YhAiWgTib?p{>O$`orb69fr7|pLD_d7k2)K_fTgzhdC9@g~Ic(t=fW@w3P$h zCgEBP5c99Mk*)Lc*hmdF3D^F`Z4y31hKEaCMa!qTiXN2J!URTQUF80O-m+iV$r^cS zq{yl9`JS~txPa@2Oi2KK+ZR+fgMC5VWZu0@Te3JVL|XSycanv_VN8HYg(L^6yuFiZ zRt_?`QHn06sLSOh$6E&dgIwtgwMmwBm2F*JnCE?k0daFz*|D-(!;;2D13y`owsgWa z1eqL-c1&;!PGiQM<;<&9%ta`Qg9SNzfIqR1+5-dwZ3B>DetoH+^s10IUU@Ds$!oea zXJ_tl!)wmJv$#zE%?P2HuH-oHaUC~^nOkl1|o zezrtn+f&r#@=5HRi_K49a10LKI6Rh|S{2w6E0#7MN0`giW8;_g$e-A^7XOnv^fnA; zOT7rhr@VL=431WGH2xqO_ex`lVOCAkVqbcOM5pe{8CH*vVn?)4Dt`Oz^Y!D+IA0Zw z;>%_1EPqg>A-@_;&0Nj6^!$%#>Lz8>a~t@#knNsfgY|}a>-E6B17qv#hO^f=jcAW#DyAL8nX& zEn?e%YvY#=m4?QWrL;D2PH7$PPAxh?QJeU*Zphfu3Fp)$uPCXj*c55ep(Hqet=2x? zdGIpbL_tKWF{P0!Z{u4mc{+QERH6RD~VMsj$HXGG7>7S@eCrT zwZF~cq(zPAO&motG`^{EP^O7h=>M4}Vu_`Z857k?d}>Kvr1iHHs!MDL$`9%iAo6*m4>gTAJ%4$2{lmpeKy_W*!JY)%|I7kC%^48n*H zEyL`sE`+0by7gHsennYcQ!E3*^G$K9f`4S;N0XBxg56ny-FwcCkFmdHIGO2E`--f* zaL_!rbi!W{xMx{q&GZOvF}cLx)~Z4PmCwhhIDQ)q)M1fG&;zw#+r^5x`N?!_rOCdW zegWu9tY7Ry<@D<=5s3O_(6#nsy1wEGOV5ILFRW)>z?(kGwWEGq%VTDJXD1z5vezaL zUcc&4K)lW?2Tx=d_~lQgP|cthNY=uYQ~pzn>r!LUiQl)i{XC67(c$2htOqBNlojJj zC+sYs?x&-6q0~!0h;k7TVCfZ2EN_3_$LCnZXTYiA!qQ2nC(kI0x93kMNDA0K`#eJ# zTBS9ozf(VP|0^ykovbIjq3Fy#xu^Bml zN7AV!zrDRtpBUx`|6rKtKSjyW+$`rtn(5E9Nn;bI7ucvDpksBC{TthN%HjuR1~WkH z7Ogn1^pcN3v*O4M-G~dov9*BFP4CrJe8q~Su3~CQ(|PO;oa-(92$WemOrnq~$CmJ~ zly_qvIz7QU!vL>#TR&sgfJOVRmR?)&eq#^8ZQ>qoR2m=jAx%<4^K^C>fG5t7%eQwr zs;s88=l^2vOyHxc&iM6qsI6lvY4CPEbm zbQ0md;|R94wXMFjZ?)Uo#kX2fR7}`{)CIBPUUB7)!{&x52>idlbMBob1jWAp|L61P z^U=(`_pHx(_Vb+Q2&&y|e$$?&XENku`OG-xv!>~k>@!AE@;c!E-S9NlcdOR-gJ?4M z_J;Rj#67X_tnaGq`pTCv!mQuk;0JKp4L>d}Z|*0^wQ5T@9@*}+YU@j$9rrbFJf@k@ z5#f$QYyGuo9taPuym#8=ViDI=l3jRv^Xl|gYO`#1A4);i>HE)|q1-u^9(_g7_~^ik zcT9#C1zjbRX5dhnEP_$>9~e zpmf{wxYa5tszp%X5ac$8cUqecv_-wHVm#60sBiOna^j{EeorHsW(-p0kO~`-B(Tqd z{TX_~i>N0qidBE~r4e{FyF@G5U z#`r+(i^DfSt9~ytZ7+$@mBs1vSbm0)dDD!Zm9Amg{rojtiEE{^bw!#z!E)~s`EydE zefeB(jx}9ywN-EH-K)b z^|JiFzQ)9IeWg@CmS{m*w~jI`EHhFu{X?@Z+s(SfA{QfXPvdh=-oEPX7YrJCYsIYw zG+*1#oG8l5^aHhK}7gvz3(^HEd7n)s|U@lWC%$i^cyM%Gzjt;jiFSlbxu z4zHbNV_Lc%g>@hgFSfeQ@kU4%<%wyAI^z%+i_}Z6Yr|Z;6_uIV-k_VgMpMvor2 zY1dhMdYx=@-~Cnsk`~z0&zX7$c)Q~^M%=%>J@9;DCM)N`<<(z3lx z{9RyIUrDYNbDqKK~`OUVa&Ge=stAGR!C7%cCZk zb_(tEQ~h>^dLLp}rZsX~KF=PXpZ7cOUhDKw8aMe{%zf6zF1NcHI*htNOEirAN%kB1 zOqO1ADQpO7?wy2!yjZHX9uB<#5X;p5h_9&ZlWP+#B^cnBlr>?}hmHcp(5$;NDeD=0 z>2eqWE*F!+HtP<|JGe9UVy$23e=aM`ku_BW0xe}7@HsDXADYbi;`3bYab1dQ@~zEK z%7x36Z;5zLdu%6da4U2pYyZXgQVo29@eLCJTA!fKt zN=IG%J8mXM+@iB^b$#T`S;J0GUiA*{oQ+NIISU&~Xk}N^@Pt=9+2sLMzQfeZRcLue z9XWFk10rZ+++p1(9ai@X1hVoi&@|0tmf7bhO0>aveLQ-CKjzGRhVHww!XQ2_$JdTs z317Phk7N&gZ2(Kv%}?lQF?-}|&RpHYVtHE$o}hrYRk8{NyzLYG7;3d(YvI2x6>s}g zj5sl>KR5ty+b#3PYx)dtyBDlUujWCP&2$Eteje6>zLWJICg>x5V?KX+h+z~phYR@J zi)zpCxp8VyNpADF(Q7(LWVqc|)x|NimiwBP>uG_}jhgy#f+paDU zQnNJPkIu~<8A9g@_^-bcUj`eqXmJ3_bQ!yb>-_vFLA%Lgt2*Vc*{(&Ne3`Z7{!wF0 z%f9BzAzaVoTb4S;q9k#~rku?WRxD>e{@Zrj;3z70N}-R&wb}lj7Gnhis!vWP-x&f` zjQA7{N|Ue&V64AThFu5yz3lNq_Fa<`+jdObmn(u$MoTCGT?cSG4eSW~~_OQACP_6J330^-Yc4)wZPRo$=|IXS<3DEY>%wk-TFpVg7NOh%8(6oERiQ{6un- z)kunQVHX`LLGKi9;;vDz_F_eUKF-4Nz3?N~M*h+KK;AdM-NS;}DA%G`c(IuZ^PB7v zay-7&bme!U+1^kRO^!!Yf7w|$4tfQN&oD?lu7r+2>?>z-g|Z!;rG#^~tdTe78uK-3`8dn;LyIE>$E< zWJOb>1;zc?uMZnA>^+pRKNJ%Kzl^MHekijZxZB1i)0m;c|A%nB;WOYm+3-NYb!>OI zCIkG;6vB1V`T(wn`f$B%a~@oq&J5tXQ*h1tpSt63Ki~`gvhgZjal-@)k8?38AMW?X zP}s_k93KCz8y;)%n(wylZ=Lx69^R8a1KwL9aZB{0y2Jb6bkBJFAqfy{m3@48AHl9f z7LQBL2;iM5fOlSg4ioYjO>8T6S|_82x;tv!7dYC+v9oU(s3dmuaaxrS#(Uusv})I+ zRVYGPEvYb^qyay2uUe9M7>U51HTa?r=9d_Cv+Ko;}0k7O6;e0o>A;?MfaNNVO)`hp@Wk;K?*6T6CA2Efy&_sLvs`Blsa)85|O zr_)FSid&zU*aN<{m>kPwrffY3)3G)+hO=P3otyjfQ1AY0So^bSV#`Vva8UT#{(YQ* z{d*aEDzdV9W4+szShuq_vA&pi&SZb|qy9^jlu8$I_R(4-IYMVN2ya##wNhtYv-(Ut zc~trhUIhA0)HuVn=+Q}QG@Q8#(Bo9m^MZzv7Q}pd<1t0!xA~BVmW&301XQf*Ff$kc!099(;@bD>c&jX0 ztUnHaytNog0)4b2Go)}C0QQt#S_@w>&@x0PQE^>wf0$u!%4ufsV9tdVeR%7y0QNzu z4hgrN1vw;|D(RH5Hk2{N-KL7_26s~}so33*F$V~is(0TV|)CnuRbtWFGcX~+P`ZNd^;LEv%Zf9d^W%K5AKT3Ib!PfFMpl<#Q_Gifk;IztN z?|xY8uI03zFE0`o!qPytKq@nDU^z8VumUI>cqW#y8MrRz7R!tG)wwH?i_XPca``$9 z`(*M^h_^Yyw4~brbi0vld1AZh#;i}~HtQFgv>he1xA(^=t(gxwx?yWebaOtFVgU`= zG-`q`1ylpP4BhlCpd0r^$R_a?;Lt`O00oQtFG(N9LrxyVlV3~s7diO)f9mEeS~j{n zq&IiG17_+En7P~=2?a z49xTKlJ{JlTY!a+tEZU7K@QTEdiQP<9yWAEM;uep{9J&DWfpM_FW_Wl>Z)qc&eYA~ zUh&JIUZ;0C^<$h)OqUtlt0{6{5!$g|;e!e8L!O=&!MjbMd=6fP@o?NfYw&G9mIFJb z)_q=<;zJBJpU-THvO_ZW=O75;+)3=Y;9VD>Yt>@5E7&Q@FSNBlNG^X}vmxhJU|F&OiJa{Pg(qdP0%^3;gtD zNa3?_`-||?3+sY4`~Q=lZWte+B>Ys!u^UR}gLF53I`dRBy)Vp9)l)t{9WTRfFZrqJ zcIT&qssHcsQ{&$uxXLiLaqe^8%Q$})?Moj*0*PZQR(kYM;1-dT&XdpMCp*`y;=c|& zB9onOLylQzOZjAHEvl&ZeLArI@J0Km8|!EZ{2%-c^ET%P!3E*0HI5Kj<=y=^$IzGt zY7)EzYZr`qZ~QmrfQfuK;}9LU-Ua)UhW4=$EAttLW%$eSO{tq5+${rqXQdZbb01j$u)O%Vq4!?`=-vuXXdoZuZ%McMpP2Lqt-na z_t{l#W^a9bee!55lGWCKc36!Jk*{=Oi2xE;_5{(uVR&Dese%cbP2s9L1B zyM=Yqee=FwBhT;l@F_tj9qI&^=dEiQUo_Q>187yW>H}=1Qs-vv|KajWY(q+{;J3SC z*qV+_y`mlOmPr30^V(pDr~g3Qa>$9b%^Te%i8nv}UGJu0?h9NQ@)!-C@EG+FFC`DB zZY+*;&O9(VV|YnoNiTQCu#(8?S*6MP;iYc z#d2sn!?r#yJG1sN{ogwgw-q_7eiqlp7kSeOe{`RTy97FJ@?L4=8*xx04t+n$hDBSF z3NcsLAT9%Tz7n4EPe&(hjiy2e>^}rA>@i#9T^&H!*a7#I6nVoiIn91fC2~53=34Bb zc=0_M`Uy>|+swWG=(Nr8D@8!q;lvUWccK z%Zp4(&;>d98pMYNFsO_sW|iSm?$bOz(Y2p*^9dqoAW~ikk*})n)Uk6oiijdM8t2qFRG34h$` zU26M@MK(HZSJQ`*NaCa=FS3b@6o_v1y>mo_k{mg**=ZX@!C+7FrSBi0-9T^p$qd-U zT3=tP=PBmd==Px0ZpM_gcT$7T8aRaTz7v*k+O;{#BA)eU7V)Z>0t;%G%iv*rXOWj^ zn{S;+axAhux2_klu8T+8bxpr&s0sfbdyrnGDc2b<-V(#*#E{bIFw2=;dd?H#fAZlG z!-wIty-R(?P}I(AC{NqeBxcPto$ph)08h?RXFi^sYdU7UiBZ3c4P`&<+=BhEXZb9U zI!3=rFX7Shky_tr-RRCNs#{S%3e1|p#|69Lo76P;1lr@SU0a-vv0a(p=0zkeNcMp~ zN0+*&$YV-HkCG?u^CHS8Axihdn$}%S-;GcD0E*+{DK4Ad>P>*;8rn9_I^5`mB^C9_ zWB!{_x2^g9L0rlP1~1obaLsS$^DV-OyznToM9TYx;*pP=AI}!D^Gcnd6D{B;y+Nzq z29PY4JfBhGoWwd-u* zdhec**YDySH9_s`FNz&~LIs&_j5tXr>40`rW;SKi7oD{Hf=!CdUGE^3ZGQg-=5D*SV8Z1{-&eC>2!giU#c*$2z6_kOHYFp(Evu@wFyLND)>3y#P`$Y{+8dge z$ssG-I}JyE%ms{Ue$L0|Jx7j0llZ-KWeK;wuj{(vdS>%x8Rx0$u*dWd)BXk3oZ^O#4WuNf`DS$K6XuRms$B(>q063V-a zZ2=oKH~k-UxuEtO!jr+#=Oy()({KTrO7G!u|7>-j;6-3(biSWiG!%q5ERKQ znXLT2iDhBIe`#v$4$ySk#-1=^WFcaB%>)ezD*~kOal$ra`Mb#ryrV{V&;W1i0S}b- zh<(96L~Q6B!}UCB{Okx8=Z(@F7h##Ipk40d7W=(!mpc`9=FEQ^kZPF@wiCfdw%+4zAd7qWMbDF=8s%g2PxUw2Gp)EzUFXXS<{>KtP{=h04W78P~NA0bVO zV04q4ppG+c!O4yhQ!8c-R$%L4(cEzlUbbX#|0t*yhuG@Ov%ovf{_VaariGomh=Jg_ zP=8DIJ$_8d?}0>bj!1~#b02Aey{=%1^2ci!nYRF^j*=#K)|mN7;Q7W48X{Agz?5q2 zlxqAbX-48LjmZ||fC8AXm|~Gmr*(gr3IRF|$!Qg}$uq+y(DyzH`}An?G$@X{ykSIB zMR*41a@I6`MS;7)d7*ZvRrU;i!u<0>wIkvc6|?Ge4~Ogzr|oC_m|W{z^R$dOLq{^> zCdZsvE4;^{wW!NAz;EjM*r{QBh+c9yOh3_3U99l5YtSC#QPZWRCI?11f4psqh$kR9 zHsYen=KdMPUk&lWmsd8;L3)Twc>4h{F^3V+idlbA_JcoU2i7X>aM(sOJEEbNn;>c8 zh49dnN0Yr}{6b;1E~nd!#*=^4Do+0Tzn0Quw5;ukmcg0hjeaOQC^e&RY1OlBPt3ym_3XCjq$S3c zoI0UzePndWjMwTTeP)pbmP+eP!rj?|nmMdy%17OhNJ)^pOpmT~Eclt<1xZ?0%sgw6erhD-QQ| z)Znd|9?_Jne_H#K+tMJKhy&mwD``R|~(+QcQY zN>L?@wO^LlRx_(#V&{#{trI99h8=DM9VDup)<<}SvBR?adKIDy{$c+^< zk$+p84$V6b$IBTR-L_6=pwg<$vyGAEO#>Q|Q^U0!{Jr%^8l1CZC+wr;hSW^7lO?q4 z&);u%#EliRIM#(OJ&wY8ZS$dJy=~iR)rCfC|A__3G1^+HT8Y|N1&ac>-b>ZQ+*+?l zr#JFAiIb};szFu&q;p}H0+&2|wCD3iOz`FTaryFmLQb9^VB|S8s`Q0f-`4^%I7*=I zXxbMc8cB10lT}32J;i@`M!+4{t9nr)Pj?HKG0fUxgqiQU+;24Vph?5!vaQx8YnT+< zxtr?U57}ypd-YXYR1@+p^|qauH@%CFEtsAKt}}lyg8;x(H^?C82f$9>3R1BmT-(eK zGRB7^FF3cP&F?7!Bb_qZ)j?P3|KU?&XYHa|$m^kR@js_=ZDPl_oHLe3R?jG>;Cr=P zNpA-K+&c1id&SSK>(@82{nCdnHHDWZcHG!{c=3tf#Vk6cnQ0}5Qz z6d~J?65{9H&-8?S=!>11XA?UoI`b75&OswJpP3i5iz5yB)Nf7;E{?LISq|u7eB!kV zD^ow{qsmesRM?EJl*RP3k4D!48A0>@(Zto&#bzO^8cGSUcIL;00z$`VY9^7VmsRxl zo`ub-@X<8Ik{36WrjMf3(ucJK3ajW{_5O3-5o1cyy8!&dT7UDlzUmELv)8KBs8M4k zQP`I^dxn$7G`vpDJCQnv7rIG0sGaur3Nz?sk>ACT=P8Gh`bG59jS>;+( zz*-$jRALJGf6(K}+|2_^Yg?|hEz_uT%i(-5U6?pr%CiB4zryIo4W&E`NLC+Mgz`Sw zdA$Q>+fbwg3s7j2E|T9BN8k8LrKY?r8n9h_5rhpbXNq9v>)w$k@!71P)>0}Z8kEbv z?oJao98IEYwDaE*1n6nJUeUZk`~dGXT}Yo<@-;jKG3S~UK&&#B8gy8cBvoW5X%~JC zHKZVHZ#xjihwJmX6LIMp?L{gZGg0o{GM3dxb8}_1L1Fb!30WPY?@_F?p-l%`MK4eJ zsZ3w1cIBxynC=~UDq6(_wy!JbEB8rx5$V$_R*8tIHR`nUIP(xjBePVEi#~JAP+tj= z8*)3BL|2M#p~|SL*C13)?j41sMGX-7F;+kHdW!xx-BFq?-gxi+Nn;CLyX`pLn0JRM zu10{vE8mn0y|v;_UTRhoq7iBWS9+?EdUVo41Fz!`R=GPX?o&CA?W|NI{8L>)FPh>u zUGrQI3vgG+^Lr-IA!>7aH2G-7Y<*1HlTvaA>m0Q7$iz(^g|1xZUyXqpivH=e9t^Ew zmwD12oz@@2wc%s)pXV>B7rW|{*Ry${V{`lBR4wd7*0#CXkz_am)pX5hg40^77PA9b zVg?}d6cww>9Q(bShxnvZz0vLoa}uX|=u2jl=H|v|^5U-OoTVl&CWFzh;5K+E||1!KmY`CD<7-|8ce&bAJuI}p9d-gmfI^9sG~h+^_gFg z)yE)>PBTHmS1k>&$AYh|gU)3S%m4vXq4?K_GUt2D#0)-aHO44QlI`(AuI5ZlAwcD| z8xFT}bc7k0VmG`4HMq!Y)84bKF_p1wE*e(gZP%pdEEBR98fR8-t#_~cD1Avj9M0&9 zrf$(cqKfg$fFg4zuDB`{>S6;PS=IuHQkeK zeQ=Z@8X9-3J@z(itKic`A1bTgrHnz;pnh?=@ylF1lMLNW6_Jd`2mR}QEtVl45Vh1l zU^frOOHT(e4~cmAXYO7sksTe@sKXcet$VRlU(dp-U;y58a$Y4v%V;E;dZ416Z%m$1 za5$l;OeGn%O6v;+?}y*;3Xc^tp@`RuQ3OZs)(#QzZ}#>>7dFZyr{~taY2R)8CQ8v) z&D=M81K2tWwzsxjY>(W%M1e&W>LoS&Ps41b<-Fq(EVB?+E;EEmmcRrSgf+upCVbe% z2Mt%K=?TX)Ku|Qu#P!M1ctHVx0fgOmNQVBvgaBRsG`-{4;V@@{<-|0C?oP|R+*?Y_ zDkMYK(^gPNE9tHJs_Nu1vGmX7ob~N%c}b^A15VaIUy58zj@x47g+{O00dO@8U5Yn6 zDk$VJ&-B`DYN}ob&CgZ)s}*s}wBII}4C07oxI?m7gf7RLusENtx>j{sN>y8AzI(2=LtZP0#04RLA-B zqItNbVx9SGZ=alN@)7Fju6Muj1*^?u=mkJ+98+lDtWT-;8}qTgqS`06AYI=Xa1Ez* zp!C?psD~g6wr77%`vrS`A4nv!vwaq(WcnQ*4F5>geZ-EKBE1A@bC;KSADkmTk}gf; zuy5ZcMom!r-EOuH_8qFd53%ITzJsX4ApEnyBwfWq4tKH>u z6dKS?B2&Zg^&icMglc!I2*T|?{f+Ff>5&sNJradnj;vn9Yy3U+#6k*llwvG8X}mA3=ljz7 z86&M{b|o(|!g^otVz4prKXmI#T@a-S?QIN4UH>EZ4NrGkqiQ@D3XT!>(OZ|9;f+Ob zv$OGAJxrSFxrh8UQG?v3tv2OjjV8Z?&|WU#piyh|PTOccB>rdsSe(3QgEQ~@G+#S= zWCf`tu3^A-R_;YxIvYeCz^tK5f2|^N3!4_s%_pnz)W|ly_acWtOT>QVz|r=;WTl~N zrk*aNbigm%2_K~=2N zFDt#5!wi=M_*5Xkg;=__dAif41eQjAPXWnp`3l?-`Q5JXd8lO(4p~mp!Jz*;txWgD zdD!PydGdUWh8xK9DMD9-zc0^^*0(v!3~>bED76=BPt$KFG^|qc`i~^_H1b+_kL7=l zkDQxfAwu0iPCs|l=g8^P4j1e~{|$YLRIQvY2L;5{1*1y+2Km*WmD6QENz#Fo}k20fY~DRjAvr$9343k7##>+{M8?MjMxjSMLe z+DBCCPUiLA`9pF-`{-Bfy9VAZK8Ja#zywKp%^3mRaGn*~6{>WUeYd*GRx0BiLffo{ z5}cPgtuy6UNQSOqQ3@rufXjylV52c-CAUVIC%H#40YSk)r|q|fUxc>slI+^~bM=}| z5M&yVE=F?WXbslmmJ+ir$TEISN_{v#u-xtz+%X}psEFmihQ7M0Un0Iynr z`Xr)X)tq@{XrJHdR}rf@|3eI8um?eXpB2=8)awg^iU$jiEICm3Y+?4{0EZj!)^>xj9VWkECN(A9p38 zG|fu$KdIIzOK})vnbY_>_z1ymE$Y3Y&EMY-E>`goZkDo;rbr{B*Rgb60 zbX>;%U}fBWy54=kt1kCfCz_}s85LE8W~L1-TG&L$j2KmWgp{Ea2f9&){##xxE1|Se|=4Ld%Z{weo(l>!+ zvP$3TV>B+5Js(^?^O5}ivmsai-tjI*Yk3z!SLQ-+Y3p3s>o%Xl1GsAp4^V>>4956X zLQf!C0!8pH)Vp!|E51|?a#GDq1V^%<`0tt4DNq75Yj(>%DZDV z?LxoUSMCuoLkE{yHTyn_NzK+@wXl-E`lm$`H!_&E(;K;C2emHDcZuC%)hlJ3{0x8C zzN~f5AJzt&mp|+=BQbOSuu^Y3Tub;_(1+SK=T{S%u+qKb61z|?u`|>tM83cb^u?&k zEzxgC&}i28>H*EV-aWxrt+zYAKkWRT{b8uqf>^N}V$Qr~I*=30X`RGK<;d#M0VWq; zuRavGxgN~OYSyopfqnT7Fmkr~dbM0$=Bh*AAI7=4kIeRN)<2fjtB24e%4RF0Dk`%2 z^-l&0ty}H93-#+?_M~5dl&epjSu5x^jN9=k(3`$+BVIg?jZ%he)sfTt8Ug|2p_{^y&}x z7tBKAzMQXD@16gPDn_LO8T9XS{a@NC!2iYg1HJloqc2;%`h~b*j=o+k+L8t-ddq5( zJWGEQ?Um7~x58+Tp@p=#SI)5Cz-$7&S_-=NF$_DD&TGQdf zMm`ki)f#15;DtjH7C$jzL{BQW&gs5z@4!>X~`q&z@$3iDu4eRdf zV@8YgkyZ`gtA;^^tS8RmJgj;h^U3OC@A6>vu?k|b4DP7GYF{6d4v`E+gv`EUZUDu^ zM`)Li-Mn-69Uy(I4T+3)^JRz@?M7Rs1^U=zeOBlK^}RoT+3z)dCa(?ub9XB5ZwMI8 zJUE(CPcjrx*ez0ckNi&cS42~@P?z8JE(8YYw^3;W_;>U3{V`}a@bis;sLbHao!!KT zkDAK-80l`gx%SaW(VH2;Ip|@%{IQ19@1t2*J?zhisOf1d|cS9d4*zw1BQ&pG#Nzk$R|$QCYo7HF&f|O zz26U9C7=0ICXz^PNpF_m&NGVg+5SPD*%E?J&_PJ~AO z&%wL*r$`p{*QWlISR}tcjk92M#eV7YRQe-Y&6N(K)DxzY!b3tA`_;m#b`}qs2$SeG zk^3}YCSq@@^M2UZz_)3NCQ+9Dq`*?i{MP43xe-XxbuuPR=fT1Bw8&2TeMpY=*jTt8 zIZ*$H$_msz^%ab&d9+4kukiDV{1IKE5tXLTU_^lRHnrb;N&%pTgAy9YacY~a>MHjg zQ*L@*xt3q6%s!OK{46(*%wi1$94{OQ{$6;AUE^teENBL3AYpFaNZ%)mvoLrg*J4_? zm**ZcZH(rX{WaBiq~>TQ7SwC={= zN_*%p;BWV0Q0_f{o2Jq|^S57v;N1^F2K=o?)w=Vy+(hmxJ40>z{LMAxcIR(jr_7%DTXrD%{Oza3 z7Bv40{=UcKKWT%8LJ^aaG9qfTxbl z4>myp^Di#}^qC^5Waz$q@=f&V>H(8a#_>G;MvGkls@ScsskZ+eRFR23g-899i5^c* zM~L3!NeEOEni6+U@irRQc4$_A+XH*YL1+q5X!KGeCrM9tFV>qViqLT8DV@BASr>SiJAkXJC6b4zMP38)77|z0Yg6@4m-7v!^9Rtu>spy}vio z+TLST=_qxV8vf~iw$e!6`RSg2r7y|Qe*th~a|^;X0krt=eI~7eY876T_eP_`<|d4h z6R#sieXpNvZVUsb?VA>=Ut=nONR^D=$NTd^TA(@$QsWVvQBqCQJ4{8^0KX*Cy)qW@6^Mxk3m^2EL~|98@Tl>fay#QX~$jD8x}b63)CxBTyFr}^Z9 zHvXbEz?({Mgj%_qM_}#J+;e)0EoAMhK;P&_k9V<_`B~U= z^f-89*#GtHmY;WoD0eK^mp?jI<=g{NN`xxBB zXtNmarA0=ES~7a9pCzM@VZs4Dc0Ov~y}`R|VAw~50R+CVH>xc?wyRQwZRqxWZKXf* zu84iyq$yb*IOlGL-^)JPeDWCwjbws+MXkuk@Dhy6$u7vH42qaRdCn z2YMWj=>Ed=IMzfmSbA&%AqwcR&V1}fkDE&J=y3w@`7C;TA4_g`dVGcL)IxeJQ#*U4 z$NyF2atk z`M&96%(m8M?-1S<(&G;Rc#rgWzE3oJl8Q0Y+nMwgY-iq4Z6FvU3xEnnV|Mc_e z@trH6#|se`J<#KFruBvCvE6KjT6%n&p%>8O{pMpgdc2r%XXWEc0QXt+cq#Va?(}#% z?H1DGY_+pTdOTRI^gxdvGUI=P9@)ye^wS}vNw=rA+`c+=6^)FkCiFf$7onUauZ9i% zZWxPQIW(S{$oafiZwLo|xV-(W!?#|yi*JhirdG1qWJV_eRqu3&FD4$$oE*!!1QyW$ z8{7BL|J^s|`ac!l+voQG%a05CZ@}L6qtx2?LbS`~#ZwSRoHk51@j`k7x7epb3!gYH zIExXSU5h8Lok$Frf=Dj&@7QcQ1HZ>xAh{f|m+c}s4_;V@xI0NWyqyaJtcg<-+FJ`N1!%t&nL5Q{p_jIi&xd33%#;;qsMb-^&E7BCvOwVeQ`1!; zAP(O>Uhk(gSg;QE(3@7mW`(J}Bz-+)%s#Rm_+`36vfIF$$7ToJ;17CrTH%!@J|Z|q z7i>yeeXBsLE2XTQLRVlIrnjTh<+QZ6H7)<8PjNnF?#Lm8S&#Ldd%Ygxpg^t1KX&xE z9)I%ew8DE{kMDlieLW`VO)3=oS5ND)Z|fIdkG?ecdF%1k2L$=k@hG2mTaWWr?Dcvqg)X!n^)MBmKAy;@j~=E)R8&5Fy!?Lm^;oGl zsnElp^t2u~{UEy@Y(sQo5(h6R*l%y4p}cj-;}4gsi^MXNV9O$M7Fqfy_|GI;es?nO2LEqu=??#>-lRg2tv$hi`|Q1k|E|q@g8w^w*#rDn@o9JXKak#i zBF#DY|5)vPF8rTCU)%%yAK;ULzd6%P_DK>=l(Tu)w4a8VJ-I~qS8LlFa?aFlG`Ic|1^O888{L%%Ps=ZZdvdfN%~sl)rXymc`zYLtHs_o< zSGt1yH|#3LBTw7?*8{cxO3I>ha29DF&^sl`S_FHqo4j>$Ko^X5@&dar`V*);uG?7H z7e(YC={o)G(LL>r64*%>C7D}@fy~U!tw&&A1E5DhWc}la^@j3zavBb%A*A$(S9v<{ z%AsGU^{eumw6$}=uQetCnA5O&*b_1LqiFGJvJ*Hz?1)#rr_*|E?}=>??m2$gE3stX zcq%@yw6W^lcycDbmXd*|r%HzLw?bR^^IHVewyiB^vkcAOH6c8@6U#ZEq{119Km`Ul zf@bTro|YpoMx8PFCsd>EpbBrM?7-w85TE+=nHM0lxJicYFeD#v$5MsqEH3mki1*9O0lv<@-&dekFb26($#(mKsc zy1(l#Al=_a)RY{sC3l5HLja=%eC#n>i{s+waB|*P;y%<05E8%&oQOV04)GTnt3HWV zttQ{HIegslY43Q|8_~!XC!zb=qmlQWADm93+@c-jn6gv1EMC0M`9Zy1E~jmU!P+j) zR;{Yg|YAGcfb?;$Y&9$RZw||8TzZC50knv7ReDBX;k3QT zk9aW&G8(akN;o-vHA~unJFZ}ve7JP7m&*uKr|~^g%yEBeD0|*krbF_kF2>@0BJD&g z#+SyP+X?cb#UozK8M8c|I%c`rWlcO6QjaH_ky?zw?T8gGZ>-vqR>}vnt}Gtwy2Sg& zJ~Anq87e5sM2Q$-n#W}9G}A}h@+!e+Hd|ApNm4jdJo!zoi1ji--h>#-YwZ-`xxYnjr&#h@ zl%0!+Z6yiMYmLt64MJ7Ixs^?nQF}KcniS4WRGA6qj#d#DsBmrxp%(rlByIJq-xALK zYZ~{%xqs8>c9}SBh0m+OL+nw1oDxlF(}oVIR9%IATBNU(}jC z<46T&Pd}7(CN!jL*qS_=qxyFu;mU#2tQw7k_G944NZO4!|f*?Lc<>Dizmp3&Kjqe=_y$jxq zk4Opi*66+?@REy*Q29(+xAMr2&^Uss#1t`cRx0!80xITa(kf*@#mGQF*h!Koof|wB z+k?wAMm`}BnTyZYG!3@%d=?qzgVbH#d>9lwY-3E~hY;>44Xi9U97-C_&l8auTDBQ4av9`y) ztEGHu;Wx2!Q0etk+yj$BnixNM?1LdiO~1!hTKF-#Nb_ZRs!z)g<@`9@I~Q{>bF<)P z*45@CDBh-J((wy-c_58aWa;&PYhoAd*v{GC#|ouwj$& z)HF+6+@av74FprJuy<|0MKdNhgq6oqjy@+pMAMbZ4YAhZtH}=$X(*a?tj6GjJ zg2hWe`kK*?)@AjhuUmm@u9g5<$#I5$v@%+}(&$C+IuAZ!R3nr907lvN8_@vgPD@1$ zkLdrbe>B-E=9ZiokG#|Lb;I+C&s!I-de`?8Xxoebf;<~u^M+XJ!V^n5{?jxlR)rSx zx~cR*y!b=!V%VzE{5hN^;B?Y@TJcVLTVzU~O2*MCW$W*3l68RA*vL<_qWGyjxb_|_#;H%VbFB63MsM9Ng4mp!(!X~XUKD5s|Vu6lOB{Jv)oRZq?UBfma ziPySfE|&x*HWoLplVD`LI&?NFPz6?0KsVSj(gD-7o}KP&fOp{`uo4blouNbdVso3lXK?Po_2}8mumP*!S`OY!+k)~C zOI=IOyc@j6$R^;pR&ea+{nInL$-_X8Q)WPK#xKoWB#M7v8e=Xomy1#I=JHZzNKv!n z1I=KI^yI{->dg{AXXcBamnD8q@m@f(W}c?VU{fTVSHzjG`^jvv`zU5IXXi$SBvIq7C=_sIP;BgChVV#!lt9dDP!iZ|GW zIRS0`Tvp`yxVt7m?xS^D2+2=4ur+~BlISv~jY5pu+GXZ|Jr{x7jaAPpB7C-z8{Kk} zUbvrDbeC3QLwt?m+0;G31X0d^0EOp+lXfdg0MUnpKR!5)ZS}$VgoRm3_4vmeCyW1Px zca2u~X_SLjJ~VZxEIATjg6)x~0!SWc;kWG_AAVxs(|}B@>Zu&ml&(o*(NWCQWrs34 zgN$Rngt1JSG^sU3;pVJ}(YIdm!2c`I2d3mvZa|;lMdlIVQ|iKli{aq#k66b$Ecr%M zkw$3rXxddOO4DqkyCIz@&>0O%u1`mKY2`;^)H>*`sQHjQqG|bo2(R>(ji z6=8XCw5ltfJQMuno;MJwV>>kQ9Z&bgJS@^h;Py?DL@=DFzlF??7FTV=} zq2xs*me`EO&0z{WEj#e1(d)+n&Co0H-)|bJ@ElClSgi6WMOMyuARgI%{Ux&YkaU+B z$4p&m46lb~83+lKEPK3}#6)H0Znt>V$7bxhbS(9hn0=Pj>ea1pGHBOJ|F^+-)>mk0 zbQAY=?eL6Hi15*uk)$#})BS}8+_zZHR-g=B6K|}b+HWa*0E`j&cM5%hWCaz z!U;k>&NgR9H}lYLBMUPm!?)%gz^}$gKC%I*UEVKgh(-?2N3GgiBeBS`S$z#!eg9}< zK$~Q;B(X;xf8u=wv)Uw}O^!pKAXzI1^U}{~w#=R<6pl~49oT4oAwX;jm8Sooc`}h$ z$EPLn9UFD=Nvl~ zG9~i##FG0dWo)B+vaUcdv<@xR;N+6OB}p<`Xi z8L1NhiAYmCjSo7%p96!zA7B9xYzAGJ9trU!N(x}n^htMEWB_>pi@#Y|7%!6an|P8G zk6PAv>dJDF|CUB_36P&~16ux8BLWQ=fXluz7s*R(05WVV^29;{_gC7=jH*ux;PT#9 zi}kDu;wkca^XUd2KTE6QJfY#tU(E}vX^qC5ODh2xsoKy_-0QmV0MGwM_WM!#ek6}M z!NLaOZ*Ap%e9Zhpd_`xDPcv1usbaro5Vz@%s0s_JFCwzx+Wn%*(PfI>aL+3zXFdCe zqS-NJD@b48IcB7J>>N|0zbnSA1waMX_~XsroCa4DW_0B(AsE?v_4uCZkJ*KTw)TEqjewCx%hrY z2TL~8d2nTOAm({VQsDpxZiiJC1JaOt&gRzjgFm7p|R0IB2qNB;`4RrV8|4 z2X})lXt6u%>2@4`EK z+fLL8WaKVc{1aK&BK?@69~d8agm{`7yq>Nf-o<~~fr7jo)6r@Dk~s->Q)Tq%o5I|q z8SU6rA{VpwA8g>&>c$qsfo$d{5&QCb_szwKwj$>Mai-Lx6|?nFWutn%U%T3XJ5in} zZAqNV(2eX(#if_q!rnEnO0r#9$(<-eqmhsOB-Dh~swsnN?&V!L^tRy0qY!C~ziL!rYmY zyJEG{`#B837!};v<}6%6Vq8sps4c@S%nhYv+m0%wZ?z_ei<71NFy^i`{KMvMXKj_y zT$b&~a_^3rV3AvYC^K4$ALYa5m+O<%mWZv9{Q{Su1H1jRyvX|*#o@gyg2{0Ht$D&h zEH>swhu+I;#Bfg(RNMYw@H6zus}dYO82!*N13^IA_9x23lQ)IskdP*$e|_Us+l=AT zRl+3&PHR8z3j_(QU&;3<{ooyL_Y-EctpvIcl>uGuxM7P&2?Nx6JUL(%9mk8w>HBSj zWiDHShNuWG`gL1)pfX# zcAy*_i=5d-)>xw-%iYcJ!7}f)XN55QlH)sU&`?<}?Ql?>&m^gptZkm81^{oScjI+RQPq25F7FAp)%hBnpJ zN^oAlk{=JA-fFtA!T#;~lnj+=gi5-kN1f8Mnyy0f|FLV^Z0F6#$0%r0yJ1j$5O<`f2 zS@mEd3wRMr)#7YGxlvOu^1}NTqgwQ3l}!ylV4WfvH+z#2GIld3HN1L(4SzhFcZ(ZL zo14AM30VljAJ6V@!ykvKl4BeC(&Rp-p+k9REQrktmYCpe{0`T*v9#*!M`d_S@I?Zl zYVRW~AH0u)Z)w9SxE5vW_#d`6yRXNO&%QV&$jRyTLR)zeq&4M&69j#nNR z$qQld7N0h`=dv!G{yJrLJ7<~si}-`#R5nG-MfMz|3)VtdvoZP$y8eki8_Er<-?=xJr4Ej1e&WxltkT47TqzU@{sv_AYOcR!$6GYf>Y?8cdZ)%&^ijAXu~33gK}! z3t`gc!@OCMd(oaxug2%yFfu=8V(sTun!qd_>nN zrW3udLDiqh$WY$)l964d*r#OZBH#ccyN0oUK}Kc>+%U4+K*WHNHNIjQ*ufRSCB zw2aK<-QoyqDNc7M@dW`RbNgCGHbs^Eb50e0L+9{L*uWMAStWAJM)!qhnGGt26&D4} zrYn!xbneD%PM3G1CuXw*ARA`m!ydTA-3Ru-XD)v_kI$SU3o$Y34v-3b*YpbrevRQZ zO+Hy$jQ{G3g&40QiBadOh31I`wcj$RjADUv+S~MktyY$P(lq*jVX9I+#4&8si`Er1 zT?v0#B#CY=lT6>ZJ^wLtSHO3SxIjoujG)_K%TM&yyhb~6Ms4=S6f8yo%NfdSMS2tW z$a2hfk};ra57weVEz@ZF_lD)vBP?^Es*xh9LHSH%XnF)6^9l?B zmaN*{47jLyTtSCF*LY;<*me7+-&xbko6WZ|XM+?aYkz%gu>MT8X|D+57a&#q zb}l8BdR898XI%A;JT=(yn49rQIQgG+T1RSSoyXc2onnUiwD?3~%PCb$qLbD{i`RI) zh**ry*RXIdsc+ZvjdktyEUZ@n7DBa}s7tJyzb#3IRthv= zAa0OyQe((7Y9q(d)7c`^C1F+`!0#w9&0vpw9A193e>7m*19ch z2v^|HzSgrFbaFli4%vR*NlzIk<3c=f5~Q=^RqxaEjGq|#-|4-goq4b?YMev*RU@p6 zju=TK&wpxaco>wimOUdy8^}tkj8D39q#3DJ$np=J z4l#^w)y7S95?N+umZr|-Qmg(eq9|HF>M(wnVishD^P~3C4yW~pi1@^|kaM%k5BJ$& z?a!vQ3zzjrW82s3f{Sat~lB1_S#Oso^m|>N1?k=hU%NMNy%cIG`Bc8z<>TYn_PL;9&iq{ysBbH=6 z1sARiYWpSF7E3HEYm9u_OcW`G9v->0`*Q{@ImI>jrv8*PL zADKUA^$?xKsxf>mDkJ7@K|2|$W-3}`tb1vbu~c(;ps+rzO}TPw$Qbj59hF~o3KK%T zp3b*k=7~x$T#N;w-$*1iZw;8)dXo&DNfj9`(|OcCds=xas*63X95ttvPxMYfAvA6q zW1mRm_b1>J9bEsLqIyGs>C9wPO@`(&351w7!qvd>2L5YOJDMAV9>4iCjArX0GX!;Az<)4 zhJ}i}r=JH9XagtaCjtw5C$hBSgww@ham-?RJgLQ(swSO$iVU`?e%7yPSJ{kT-!S{c zHUa;+EM&oHw6B_vn4cn4|Fkv?wsnQpB{6Cg1jH2Dx=-P^X4y7*Yf;D2lDP{oZnVYG z?kz=~%goP{*8Kn*O?^Pu-LvffO3fHZq}0$4&Eo?G8NDl+Yg$jI}f&0OVE}zwBl7cM1nXmY6I8_8{MHmarb%7roAoFCjjUpK1`k*^;*#e zfW^7+4JJ(;Wv!Y|do~vDUi?aplV*Sd$sh_ zUFTm6U7yPppWNWmpCPrf{;mD|G5&}j@kvKEw7pH-LmwfUg)8 zcMO$z%Z{6UOB^_F58$nTk=pBCKOQopd_TajSJF?Qsb%>Cp65PbYO`5p)9Jo`r(&6k zW@9UF9-_+NhTB!(?X73-$*(^9gppSh@wZ(CDWO%h3jva$c`L=kH^*>E!-6i8hgFV7 zxV$k>^}p4^v}!o$DyIsDu&G_M37y%AiMlH=Q6H_in?+MyBksf?{SJOhISI1g@tylW z@di&Yf=yyo^6L)%>R&85%Tqq?DRDX44)^B5CXBGc6N(vvgq8C_l8ogG+L!o3hQT!g z=Z}$@6!cy&8^)oPOk89*l}XaueS9)vjFGb8V{=l#RYDJ~5FB!{Olq6gn=u5k?C~cL zVCgq|4rm_8vNvWZDg0({JIJ&+K@B}fegv{?dzY1EFH<0pWt;qlR`3p-pNK45>N~3{ zjk~Lwan%Gf)Iytq8oePflUNL{CK6N3s*OYXYCVm^3!U1Zm{*IDz|N$FEFeHxE`gJF zTPE+l$1U@<`SAVz&Fr$o~e3eh9||ITFl%Z;X(VaI6i9YcjANlq>EX5}??_Lm*79NidA$ZMdSgl%*YJ0EIb-LeDl zkNUOEm*mu;-pP6Ozm#7;l&!y?t^Y^W-wgXy?|%J3-p-eDcy6pVoavu~=UyJ3FYkuu zIHh~Q^Yd9~PGV5exW%!74JO2ULiQbxB7N`2$PMg2@cVyQIUm0Z`QwzOTGG$N?=1m- zKW*^)=|>FC3|W$|(u@1;#vQFbZxBBjYN5RFTzpY{(qtam1AkN&qAOq@{~Od^h;jgG z|4t~o7yR*#jvi3^Ep)s9wSU=Z`Qzrl^G>`2gzA`P`Qt0RTYL}i#2@8v3i#tIA6nF2 zq)I2)N<00Ae#1MTKVBfS5T^Bcc+-`KH=W(^=0YF$!V(`@{&)o3JfA;;H$KWpteRq0 zl6jqr1TXo9rJ5c{U`uC_)R=UCep)?^*#$Gd`Y1Hrw^yNKAa4nO#RraMX`-0D#wXR1 zwM#@LHKs+Igw*%5+l>f6C%NxupR4?$R_z@DNvh@q7Vr}AraudJy8o_fDK`^KyR`rj@h}SgG z93|sK$R_V?h}s-BdlG%CG@Yay)2|dZ4r@_ntJkhFroT?zNE7*&(|S3IU(}shn*Nrl zP@~NWtH1Y#6{VM2)e5}`XjB6|pz$3PsRC&Hl|>a z+JsRciEW|Df{D%KvtZlR!L+6tCMc>5@b+&88|K1I!!7nF2;gLr~>vq~1a%G0;`R-s0tfu5}a^<$uN=b9nb=*{1Gvq<)g z?{DWTs+tWS~mAPmjUd)O1{pS^E@(8@Si zEccVNcR@}*&Yo4QcTLWU;^Oo(=EH22!vqQ{I(RWhHeu;Bq$ zkk4=bNAbC!L&~XS%nUG4Le%WL8k56X8`|G*c|cefTDK@)oK6?g!JUoPuiw}kYRpPh zKcC;Rk07#;pi?NIe|yU3cc{VZ(4QHUH81uye^`?|8OhM)%u~ov!z}1-HeDGL!xu6& z6!{jTXS{GeyG8B&9uix0xCX^_Qytbz_BRavfDY$QwO+Dc@ow=ODu?8JKvo1?M3sKE z!Aj2As&s^XcZlE6RlGxTD(%ki^(7fv11NgTSM+-(EkI_i3o#~H7uK*C^{a=amEc3k z=JPv`ser0hHlk^J|1{uZLtQBn0f9tlHGLjORa?rgjn{TR;IjGrkij`4H9Z4rGk&EU zA3FAM_|QFwBH>QAynX|g3+(l1`Y<6Yj#rs!l0aV41gRJ&9L$Q%Y1dhiS!(2j&0BN~ z&?pd@+fmVteu2o$=Jor{LrlH(aS>x;R2guB_2?p{0`gXpA@-fU-%F?b5f5e_0kiuN z?PlBs)L%`Pd(KyMrE2$(uc(fhnq)GTPIGjgd0hSEp3Ql9XwlN|9_aBY7DN-=ogNcR zb#Li$^L>Il(sh&}^) z{M%!e9>0n>3Fz^Yt1LYZhU0AZDll~ddK{Rx^tc5sAJF3ienYSFu8il> z<3T>r?1>%+GVnrr?Bq=WJ)VJ2I`CiT)8l{sts6al{1*!LM2{QB??#VzaW%6yhG1%@pQXpy0PwTu@t}u$qQ~B}Yw58@_4k-R z?3IUlrpNoGU?{oM7pKRVyVF17nw5{ESh;+9RAgr=S`G$(_<-o~o_zU;%PUVlu7gG6 zO)>Fre-iXV?e~9SdK^G6dqa;q%=(6I1^$*EH)D6wweTK6_epW&Zl z90Z{T5u2q)?Ig{Hhjy2bCoy_j%F&}spNqnjMATh=kEO>SKbE7%E52jtaSrc{(?s&| zb|g_ik8|F!^f*zKOn0f_=lBi9dFRvPr6T2I=&yjHM|yO9q7gkBuY@ljgIky9{54CD z@7ktLWGYf;5UR!#=&C z>Dbki6F2rLzF}~jtMQb7pub}399(xQixpeVsjH@Ma8D|+OQTIQ&C7fO&q>>*lNV5w z?YkQ8TwTYQGxsjmAMfVhs-biFa$^@q4$WPwoCTe$czaF%g=i{!FH}4Dr)}WT)%v2F zp_b|?8XG|)*9e6j;yHl6fR7w$K6c|HPv0j#($~uMY8Jkz`Gx|SzClVkGW~fp&-Ckh2;})vY`V;C zlIKOH-Zu*B?J~+dLCW4QRC9~3+Y4j7?=!cw&MoF-cK(hJ*@AN5BHkkAa$L56U(7yb zurs%drkn@+MpJ_idI*}BRPqBd0_|ECOLP*C-3(K*@?S2bq8=7L_&zz&(uY%`V@juy z7->vtG+8#RefEvTMNNNq9_%%;morzcY&KwSZ_hj|J;PaeW}nH4e-+>G6VAJp4r|YF z^1$Q=Vjq%#3Giu9r|LIv;@jNG3wCS2Xf_JF^W*mP72=%>=-O`Z9c`QtrE@rAJy72{ z$N1wVN32fQP>lGEgx8nR{Ioqil;`f8G8x*zLIzxtEH`4Di~b_wTQ8*iyY$hX42t7^ zCyWWr|MM4Sn6FZ0cZQkUa<>V>PxPKdouh|~7~dCTm`7SmWYGV7F2n4nq2x2n3G^8# zFdsc&8Rlh(v4HTtd6{LHV|lmuQsD;-bCQe)-=G+~&N9p)s&u3Zq=p~-H`~y`ysHKA z6lGHxP&2Vlob0Idb}r0vQypt$;+L@sJ#y0#KtwE0>+_mbK}p8pd3C(eis|1n#ao4iMvo@G4p z(`+@9=!xezH~(DU#0{t^4~_Q!1MahyB`M%O_nMF0xX)O|$=yMg`v_gpV&otx;3Ne4UZF9)dr#Dg!CC8SCO4$TTk=RDY4lsflcv$yr0 z_RYzOnc`3lhC?;Lp@w>2BSNROy=i}E;rL$8!n$6GH)|5>Y9>dPG}Sl@Pw#_-HQmHh zlkh!~F5%Q=@uI}AbKCE40ap{5!48zn<3oj1(lr+B? zO^y#Iqver(nqRPe*3f5hVqGzPiZ!aRoxl7bh5S2re%s{InX_Rf=p0X;5=|b*;TX7Y zgR}73UTjz}!I)ve)!q%K?bpg24|K4?#O;l>y%JY(X`Pc`#P;B z^J`?O)3(+46GQWl>R+^&#n@$b*Ae{X&VvoG&fX&jPCFS%G3KuaAT!#t!UDcJav!Jd zA!;jiRc-RjLu&sIZEpe}RdxRVXR<&*@P>*?E7hn`N!>^VB^pWsLGI{8aY1MW#ZoC% zR0}6G)$xU#zT7Tca={}>Qj)u|7g^f=7H%%P&-(L); zmDPBo-XwK+I&0_nX|3^%3L{Z;v)%c7=#Pdk?t5=G=el>tsiHxi`(4Ou{pTiJD5JW>OPJ{8{eZgp25u) zFyo*9Rr?}c-pl{UFynjA)4oWT*T%c0|719NSkJy_z>M2owaoaBs^q(g*82@D;+@ut z>im&9XtJYWDPtiEjngn*n6w>^*qVV?)8UEb3P5JWY^!kyEr>cS$!x2ob=QerzRwv4 zDgqId8s|#2m-;Q#lTlbW&QudWt$$7X$^Ar#HkxECT%}^IIUJ`*dMLVRsQAs1b#V^( z1N)LuhBKq5XmMl|)YKpNVCc_pmt+gk`(i8UV`jh3KbpAC?}wlXG=k9#d1?+_KJw>X z=#u=BfL$7hoz+6bE)fm=Z#PqZ<)3nQqz(B|HyzR7lm1JT6WJKb^=WX=^qEDM_WY3c z@}bN7&=3E&blKfnVLL=`--0f^yZ1ns$I)*OrRw68E=(@BYC%UCbJ?X z;YZRed?n$?4VEr@s*+Ea2R>jM+Qx*#txiy#p49Q_@&)KEO_z|+9_Z4j0zO@uu!bzU zbPbm?VGUVydC|W#V~AGKB`EdjQqc|L^qx=_f0NH&)je+0#?1EAB9wCU&!S&kv!CUf z%By*DztpOo+5YcD(FL0etuXh$-;?t_txrrX8-<$G*i-vIY@~Z1KL}jf|LO964vGR5 z$87NZ&WuFI@&RymaDXs3CK1k?t|El01YGas?NwE(g<_*AkBHAe?NF_7J}2hfXbpw$=zgiug~L zw<1h(O9wn{pu@-7nS^au)4l21)|D`cD@%E z2lJgT=Zl^1S(TNL^E0F zjHr!emNTNQ+LOYHbu^xLc*u+=O=h29h?BondY_h`$hL!Fm;(hCU;WhjF6Z1{Qp>O) z*Zb$)6kf?=mSXsz$SkYDxoYqr#DXD(R5713r91zc`JEaI(z6~(36yKMOMO zb1dC?cvLrM$w8z?YW$+eX;w~=Fj*PmpH{p^c8}p4sYeamk|kC4uMrJ2QVzX`tPV;( zY>y8D)gX>xx=Q~vdRq&4hae>+pc&~Zz?y;{Rnr$6e+$?S(x{jBjhWGP)u!>Jg@SA+eedUzu-3Vy!ICczbPpCuhsi?YvJ01JlD3 zFs{D{ISaZ`dvZ;K+vc`Hl?xHTRkl!UUC|_Td)v}kc71JH! zOBf-S+80->&DiP7LZmB&=L}i{XfNeOKLDx=eW)IUA2>@sF(<9t1=WNcs7hGP-w4%D zfy$_xJ9;`zm6VL_*vn~_p97v^7>CR6iq|Zj!ig*X%_3|Id5;a#z(;liv+t!wo7IWF z3B=niGr*&%_l8;Rgj;$<4*ABIXE7#YjcAfr_tVA>Yo1g$8`cv+I)kJU~{KlH{ z*K1;5hHReZ$s^;FyVZ#b%)15afnlpmHL>NPaJ;JB zV%1rs1Cc?Y`q#Yhk1WDflwq`_{>Jx!f0|QFo4t{YIHd%4;Ynmb-dy1Q>{`?mfr5x6 z@Z7YWifSGnCS?=_MyP-&Rz$2q49|qaTm0@m@5_c-FwDGPXgk9I^Uh4@g!qM6s%}P<;s5 zCJM=N#=EFFxM zxLxfO48C4crs#J!2j&BjFSe2eC}S;x}`&>`Cf#{Oc*z&FRNKPXTUy?qs|kSOZLxP6Vc zE87w?<{}|Z6#3%!6!E=b#sE777y|ut(;YTc@*IR!py&=b!^T_==iSmK_?Ch%#{4~_ z=nj9*D!K=&QXdgTa&Y}0Z9~0z7fFssT1)c38Ntt3;!PQ*NkS-UFOK8x-exE&= z{8REPybfOL6bMT4yIGp|OjE*`Ne@zj&xi=G&FGMb{s?L==^lhQW3dhG!HAvaD#+DW zvll}xU?Rng84EBSMC=-Y%t!^x=8%?0se? z7S|iw>tyNx$nnPJmdagJO?|bWp1m7>JKeVg>+Y~?3rf@4a^r2@PL3RQ9v1K)D;*E_ zi!mEPv2_&l?L%?~?JoDosWL^pnDyf{nfnGGfjj9xCo+j#TbyuPa3`Y)bE%7FxD7*3 zg<0MWN5IfnY4GuIvj1}H?;y?-SGxE95Gk3X$Yl6MJ^2l{oSGazXot6+x4v)Yq$&iQ ztk}))3^!ijJvKrbD_%ji>Ds)iMW{SF-VyBI>}KNrnzl0fSY*Vmf8A=nM zTjK2tw1^4djBfzOl`yp?m626u;H=Gtvle}ZF#=F6KD}}P5;>AWghkor-J6`=HL~(c z=bFEPUXBYm&3C~+Q+JD3F801a*Yfeq2)P5OJ)LDab^1x^ad_+gOSuK$Bp5HmeGf%_ zY&{1T1_qE_o17LJ$svtJzXCZ*#WTPT2jVtzpLFEd`QB9OTJ{X&4whREXKweNI4a=G z%M#PO9u>jR6%?t2c4C2TFy_;{nVdW@YA<2{z!5^Qn@nl|RAqpZH~=7)&Hi!a$fGd4jMb zyp>FEB+(yMATHvafOAZbTIDcSpBDgxsG#={QdZMDf?TB16fxs)I(N&S;403W`c6F^nONYmp>y{*!*p(hBS`YAcU+`E%c z7&xOcBU*i9_J|fzfc7(HPSC}*@UYCl=h8)%LDLta&pdWspAOBFyWi`64JWNF-N@d- zn914yLzz6LrtvE_0Y_^ECkH=#%YGzsTJl^ZP7*55oz!=c8~V8GZLOm~@4}??_3cvz zk-y4$_+%;Esl_!bPY#9r{Xyt5!&g%uqmfFV9pEe(lh?R2-)XuX5rY=mfag4Mn(3)cw?JINf0R{o*`KH!%ngxRKW!PG1{uo;r4+7%hbr7;KxE9=iZTu@k zw{?lqn#QWK{OA!tcv^l<;vD&xY7#U1dwmEo_PPEh^u?7ULI{`F)40vPwKl`=*?;es zs4mpn?gJo0&F*JYHv|>4;ay5Q;LD<>^C9pO;Gg_>Cz~li(XJfeG)18V27ReN=yzE+ zOU+RZ*_iJM=hq&=u<6a;8?bnflyx&{+kE7o4i_m z+|%ajnqM28?T5b!bWEv_v&Er&4O7m0=?II#c22bBT&nE8xw`x9%aV=_kvqI=Pktj~&3!S-?YXv<)rg9Siw*ak;gah<;?s5kgd=s2@n*<6i0( zJ_HKghCp6OcKI6O=4-4%N95+0wy8fbtem~nGUNBo-b=NSDN(8hx}4_8dnS%T^9sWnaAQ+Cd zWyW%>H^r*6X}S-q&^SMhqGjx|rDgQ|21PUcAnlJG{Mn}@t(eL}*h75DOCVa3Zi-xO zHf~fWP4^sM;>ATvkO z9H7rQ=`O;MPVLQu;Wt@py3g+ze=n+KjsH-M-%f_r2jRXc#hC~Cp^?;?C5MuN7A5MlfML}8DwXOFx*BO(?Zu@R7f2`9c^|QdDegWtwo^!jEU_3 zm7S?)Md|DBD*k#`aXgP(;6{u+CXbvl8+es&TT4_sr8M_Cf2xN&xVCKdC|*7CnZ7Li zH*r*5m2NSADeUqHvLTa|0%f!Y&wn|rGOo0{U0!Wp-Y0Icxw{fil(nc_;vthrjwG|3 zGv!5W&IVMJi*Y?DqYVpiWH;kllDj%_)&}cCETfk&K2Dr!*XXzf`LK4tI=tz+8V^@X zjrQkfk|cJ{4tqX2j()UT*Ogy5O=dK)PWEVgxGHZkXmFYqnRb2X$Ox;_CS?g}6cVF1 zaEV8BW@OT`)8d0#@dw6vqx`|B@^p0G4tHLgqSiDLjmT+6YIeo$H@FQs3x9!JWzTaw}^qb~sI==!xtkSkJQl?KJ01 z?{#Kwv*$H+gy9HzHa>6DT%p*e1#}a$iP7_nv9p1=yuX18$z@{nt`S=F8|U!UWdVii zMXRxFd{T9Td1#(ZCzh`(=WNqv;3PGcL7UV3V?muPx^{jb&jp_+RPvvOu~C1aTD{Y< zGSAk69jLNfd9VKjh^9b)i-Ayo`}uzd@YfqvVtR7VHcMv+uQKg3YSpDVB@hahj;d?v zba^+wC@t)v-Ifd$((6TNhwmGprl@uP^S*;?M`Wv}Tvkk}`TG!u0C*Nbc2KG|aq0%q zSxxM7ymxQ#CRjDm{q1sj0&3%mk>c9QRn9f7JVX*BcDRXCne4MRn)6^?-VvXIX0vWk z%(9oxX~r$L3k>Re1r3qq+bkUeAX8>g*t8F-q87FR(_cEE-i< z)2v83EuY#%;t`E8vx>~Yu#kqWqKPAgKoB047|%6-o65%de??O2Xf}Vnb1?$}CL*NJglN!e zn~V7cog2`r1JL!E(#JDIfl|tQqk7(`rW&uysGj|kR%5(+aYpq#uga>Pvw4?3D3rJ* zqk7JM#HyZSRq0^$ogDnh)wZD#yko7KxpA8QfT?FZ0l5xDi&;+k2wu$-R1HD_j;SJy z#EK}Zb&|QoX}+Y`wqtxx)DhY=M(-g*>DGbBy2V!(Ou*HJ!lydVnNaUcc%G>4Cx=eO}b^@56s(`S(CG(hUFJk;T8a z@4~-H5o+0Fz`r@w+*CF|Ede^=5+|=&^iwjz{#TL8%1A1 zZbQparGfOLlx3r5zaZxDgyH29>t|}BEx5Oom8jF?6fDnw&n)xpfW%2=XiDkqjk=uS zRsLJ|n)@wKS=>L6hu&c-k+{xRPpmfNCVL-m;JUi3QDq6|>nS!p+G~H_0<%!B0j4e^ z`);v8Xg)9p5zmnY$5XSj;4qbeW3d_u?m7R1N|4tJR=^%k#`}@pzhN=n(IkF0_@Y=2 zKNCXt#LtX@Y`930tobaFtvUS6B>t+ln=pTyBP8_hb5$TvHKB%EC2Q;!j5w9gXsm&3 zcwM6CJgO+d&9y0t-I8zSXE08~&m6CY6|QAf9Bjpq(vv}0hW3Jz1WsgGSN~5OEda=y z2WJ62(}kXIuF!r>Jd)x#HBhV&1-s)146bb{qpv}LyHb@7HZwf9#&75sybCy+avx4~n*JmL7Ap44-VD&1HUxK?y_w}^Sd(#w zVm3O>Z%8cDPPMKk$!2da8C+ZTR{9O>P3L6{Lljr_X224}-sY5wy)93Dw%yvv3wqK= z#cGpke0Az!^Op6E-5nsO_a^MzCOKR1CC_%#ikC?-FwT3A;cFPP&6suCTF$0%2J-95 zHi9dq)|_I#UR^fL{I%J97re=XH6UM-8O>r=aprs*vzTM{t}x#%L-8fNAB`k2(DZkO ziNuDkhit`!=sU;sy;h$weJ_h)X*P?mr}<@OoKwqYiAG5{Gxz|~L3-EXh;WlvFk+ib zVWO93MoJnT&GMA=m^IuvT1j}JX9r`o;ca|Pood){I`ss*Bl?E7c*SHR?#-` zsl-^MU$OVJF?VX!G-Y=ke2LTaTN%@_p|5~51}~RT&fuf^ERQ+0y-Ti=)0khW2}Y)| zvZ{>a@!pxvaCODZn2&StW3Fm}v^^DMElpY#@Z%T3xBHa?W=L zqy2={l=^O3|A%G?E%3figQ;hjk-)ykkYZ6>QLO%oz30Dg`ztk66DXmX{v=OQPf6Pi z>RWP}PiJwQ|A@coRqEFaTmF(#wO9Z1oVL277szus zThmtTEkQHYc#2aWB7xP(jf~v8M!vEYrl@^mCwVrn?dbo=Bxk%TsdLb{Gmo9W%luBg zL@Qa3ZB)ePQk^Gbu9ewxVJ#)A)?PO^bds7pCOvxjRE*++e ztgO~PVzfk;7!;PZ7w9Vq&2b7Z=QvRyRc$%WKQ{=U2WH`O?w!JAckeP(yv`ep-zziL z&NnmMfb&A}j<($At-Cz0%6(22y*2At4kGwheRr2*%B>tVghX!BRx+BzmBmsiMiF!} znv06LWpH9KcR|lA-Gg3p*)(=xD_@shLoJfdX=o&HD@cvui-B8jvH-w8P;|jJ^}lt+ z|FZurmwi+JFY)D@`hRQYH;q55|KZ`xM06`aw z|C{>Xx;!)fZ`J>nOLNAb)&EO;$?1PNFAQBi_T01fKQ3zL-tg^jYrPOX$h9_O+}8IB z&f+qx0yp^+!cn`5odxp8g_YqS!zJ&jYX0$VlG(|viE%OnN@sA(H@IuONOBODpB%+D z-W3fs}!D!*;&M6KcyE-MfleQ{gWu<%ypG<;kMl~MKI67>w-A;b*Z8CZ39=RlS(8y>XK~BUs3GoC z_x;8GM}(fTMTg5jb)CPqD?4QCPVf-9_6saA%9B;{$Pplii=p_=eZTIbe$9Mtx?`tO zlaM$Gw+rmeP~}Mi)zgpj4q9Abi@(Z#<^oP>oSs@o_}hx@OV-`I}09$tng_X zF3N?)tt8k9Eo|ImmOD;y@#JQ>PVq#sp!KNF!ot`}E@JM{d0N%O&U>Mv+MnrPl z5&cNphK@O6i2cN`>eMPk^-8Cs)XrCPPf_kmoHgo?7S)J}w|0mLa=S_jU z*6XWvyK8yJDak8Ji@gK*oSG%qQ*vn6^1brB6Qk3+ynO@y=_a~G5hf!sb9)`qf?8uTJS2;&w%U>ynU7DHkDCI2 zN^(>PM8L;K<@@mX@jUC+i(p`5S*Op_ zxugK+%E?HgJ2cA;ogYI#;m}r$eb*V)VNjiEoPN2d6mh)9x#~`)9%bk3vm%N8BZMUY>R$RS1-Ah>!W)UT`{nB$Pc5Wtbd{N3345Qp-6cLSAW!1w$AA8 zwzojMUEE0qJC*3Oz9+cl z&%@UpbICCWBJnAqjrCgCd4!Mm6Gw-lb50yh7{yhza^mO$rzy@4z-6ed(S9eE)W06a zLvn;+Zmp5{D!N4fjl|cxal$Pj{dn9U zz<%Vpeo5!Oc3l~~EUUl0b4Bo+Pk;4`JO33t7x3&fUqP##ccl0KkPA%id0gwY!MW-( z*l?ZVDU73hY@~cc_WoP!{eegiH*qY}$>c9PJvpfVDal^_;D)`qmxX-9Z!u!7?X>4` zal)c}Eq9u3(p#>z#P&l0VXIZ=ZAzs<5{f~P2gs0+C955c77yXshcZr+BAN_S*d{q!n9@Ywur9zR)711$}MxT)^?D`ubm2cJm zC%pZ&&WnO|!bliHo0~+K8_+Bi)qnJP_s9ZO+M_((mHrg{@4wS7TDhAX4wduQBl-3h`>7r>D4%=T zIWF;G(1O)}+p-R`8hzkwB3fDRT;F`W_vRH@i`%Dn6R)&eev=8mGy%)$d_$T1Ci_gY zZZ)~(Bw1G*ZwaOpglYU|5=nl3letqQ28%Xcn(Z)~Em==l<2=)E>^C)*6H#*XWf<)E z{N?7*f8Ut@>q^tZg8*gyV&68uNmSkl@_#W-O?Ne;pu0x8Dp7aF(<8q*`M-dkX9&WN zD7hCbK31wy$-&L%Tj$rmV4Hz|XF-{De%-;lbbgbEh?@wUUw7PYonMWrWV%ZZj`|Hv z<((fz;^#M63o7;)MRG5L4v_B2dm@i1$PeyK+pi%We!T+!PCiQFaQoTPDy1>ldC2!dnrbR4giX7ZF{^WnoZ!&tm zD%rr3D5%fzz>P2;;f9Le@_lbZKfG9hCw_jDaZLO-si~J6 zFVcnoL3BRAdt5bh@|)bm*!~y!O$?d)aseZQMew`)-g*96`FpgW6LTkeKV!xcWBPGT z_yjk0WoaJLJTYftaP{2ZqGTJcp$JBKsXlmRXqBdf7Cdd9`S)IV-a#s1vs^t=#QQ7` z8t_{a{l-o5N>V7_Vxs7eQ^la{O?-az+xegsRoAeqoLo#Nl+(kP7&ruo?fr?^n}x4q~%c1iAx$_3}YFP_fzjXa@Z17ob@W zg;>J@zxwEA%da{p@Yr|l{JiKl^aSsGekC~%h=(w?J@Tv1`4I4{4O#pO8LX4+LqD35 z=2wRsGAjBrLm@^W!>^8E8wyJYZr6*b8KSZcb|WT>$gilL!?V^vJ*l}6zT_Zd3dWm! zo^@Ub+#(yh&bin?`F%^gOAHz2tn>dlKjDqZp|;S9OvyIrwlOs+sp?7wtHU{=&Z%E!yfC zcpwC>B$*$2^>EQ_m+RokOlb2B6jf)YC#&CMH9vD1<14&?3b=Rs22}XQX?@g~cM|ZZ zj=e3{kd6iPABfz^i-U1QfHOseH?TL-OB((o_5Og&`>av?n0`~k&8KR>8d}V1%BwHU zp|R8WEPm46yYm;&!!RB*v)}n|=EFGN;-8%rUxx>}CieB*xmAp5FO6y7L_4M<9~%!u z{)WqD@AJviyQ-a~FP+Ppn_%8T0RQ2o=r=j?w%CsE&MItrt-kNM+C|ySXjA*8=`;30 z>0{?+w{{;DIov0)Aii`9kKqJoe^!)|ZpB%$!h}cj#Z64}yywq{LrtJ)=T$lJ_`ZG{ zU*~7IZTu0z`12?SF_UMd?NVuRpJnG+Nu1UXLwTamIWTcfe-l155g#L_ZPPSe*N_~1 z3bi1MiWYDG{suS^#`sGtVc={tOs)UVL>N`n+%_`5+G#!)IVL~$^+<#`sf)!%_rOKNoksakB_myxA9b+3BE6N7Fi z?M;~DrQRSgTw8fzzqxO4UU_ajyV>~9nahWM!t_TCv6z0j_2&_#Pip zsFH6pJm5Dpgm>Y@%!!(ysTZc@@mqz|OcY%Uj`k>ze*psin>@bY0wK3n`Gfxj)zZ}d z3@b+--^!+*eC)nJhBX>gTY;RKxQjrphInFM$e^TJ3BMkHkX^&%)Xe;gF6+pv7PN1%Mie!fzl-xbKvmC`5avyrqH z{EQxtG5}SBt&{tiahbCs&7Z-)0`T7W1>n^Rye=aZ{q+X?Vse1?$cBkEZbb z0DWJd``vH9d;fj&yf4N~?=q~lNk_l3`I>hCpI_&5>KeWTexEG({`4|{zWU@v4^w*3624>)==SyGTT_+prX9AoCXL3*Ad^Ns{v0>#e#bsh|V?4+?J2!Uc8nBC2x_tfFNZ~icU@oRe=e=q9TN<3pl6MX06yHxiE7VHP9y$|1HX@pwlurm&!o1#V2H}B53Zz04qi7o zkhpgfE}x3;VCiK5{ns)8JqoR95BB@@#uJsJ*Y8C?-|GBGe5TlfRqr1-Zx{9c3iELn z_5O(QVjPVS0*vD~=Nrbcj#1^PUKi*y8p99JqEct`VEI^b@a7AHQ9i|ygw&l1gNO}1 zMa|UzDyNBiO@xH3`gc)$QorZX#%rvv=TYZJsMyC;tjno5P<*DGp1S z+GQtr91qyzoO(y;%JUNPA>c!v_>>$(DmBhc_P-uB4Y=>@a6@h06pBcLB&4-bb(4#2 z(E{U63jC9}m0AKHAb{L_*fD;eiK4EbNum?2r0=Ut6HR3;`pdx&t^l|2-BNZtuLwB0 zhd(TTn*;)_<$fM-pRaow{Hxt~w?Sq2PwQR7pW-d6BtV2%p@n*zxX#8!CLS`4a&w?A zT5Vd*x4KDnUN~{dMjP_}GH-NFq$W|fm9rv2)O#sr8%Yvv)Vt!l>JlS&)Fj4m;VwG) zc5j6ObaYT8-Zpb@92x#mk@L{LcY{G4_tRpEZ7Fpbl>xAlJDi-R$!3jN7`1U#xzlNS z&%ASKakbO*91oF6)!y)U|9P=$&hy)Wn45DWiF0<;P5QM*k-FqxG$rX_HH+Gabr?qGefj~00EPRteob* z06X+~@mXkJW=+7lh#~BXhBMs{-7)Cy}(Ej%Da>QZd#eHlZn( z@@VmHGASqx%{7NGnq9F|%kF}~&T|oe%wPI?YQ<{y>96^ar_QIX{#JCsSoVJGSb*#n zpP`xL_WQwo(Qum9XtkHm|Ts&WTWD03lF0y;bn;%LMz#uU0)L6@UEY? zm+|8czD1Baq_8QCB(FB7maMJ!g0>h->9bmK)0#r{EpDs7Vg>puRuI7Ag^jPL_lclI zYCth#C;>)ege3-_#L!&gzg4_L)siUwIN8i^-ib4MGm$WX`S+^{5*BZISK;vr=<)2H zGXLK6F6EtZ!Rle&MHB!jG&%Uv`PTfaQzhR8dxqaoCGS}NEtJGuXLRYSV{QO*#`M!v zRR;q?&Rz<3g4x4%^Uo<{wvHylJcI{>pXMk-pwf34X;$2{2I&34V7pdxp`BZyN8PBN zQS9PZ7uw%NubpYT4509S2&JbEgYX!ukB9L}+rU)>4A^@FW$t|W#-MhW+uY@!E%lyb ztm>sy105pB%~UC5Sm_HS=t;FI3o|zKE-;SBxs@Js6t2tkSvfMO?+wAEF)gLW zrPr_3+YSuiNnLF8lc8s;z50`L+WMv1LN#*L+Cc9;V+`=iv?kIM$=RNkf-c+B0koH; z!9AS$of^-lv_4NhX}#$B+-c+3@iG5YTw z;xX@td_(`$S^fXFc*J!7=jZmH6^}TQFD4#w3Nt5<I-d?jb{;;!nd7tsA@bSaokBMsf6j!@Bqr@2(RndBmGIOU}uUEmOT{ zSv!7@ygVaT((xvgWVZ6s&$u*~4c(%~52MxE__7|W)cUe*%XdVdn)h~>8jvm%-{1O| zoh361Vk;Y~x29_}%=J7Z$3c0lFIqWa z*LVSU5`m99=FS}J4%I+r&gE}cN#3ln#5YNqZ6(67TWr%Xw>8x(_V%#Y^Nq2m8&!s~ zGu&41JF&NhEgYL4TeUT|y0LoUtb&EzO-~C?S6EVY9*;TWUHYU5^C|v$bPNBOu`P5K zjtx;aANoP;z z&z%RNLkJt*h@U&xw!~TrvN1AwaYak>wuUM)pBu1aJLfhWThXEjodM>>yq#}?#)bp* zE^^Vl5*j@>Gj42>3C;Qx zWR%5%ecSM!Uc_1&?`f$&lNARh8+X1r>x6lqoAD0=z{j+ldaN=#0Cx2qXI7ulh2qPU zq>RZ8)(J#u*Wpp3LsQ8#P`RG-MF8Z6Ua)su7`RhsjWYX0&XTqBJ~!*}XnOQJGb^$t z-eKx%Wj@Za#SUX*bpFliV@%oU1tXI+jWyd^TIzo@?{kCLIBkq%Bw6j)Mrg67M~lBm zF9KDp{71Dywd4=VON|Zii4~Q_pxK`Z@(ppQfS~y&^QfeI{D$zCNZ6h-r15&{@U-HG zmA4NuJ)9uPx7;}Kr&uSHl*Tr|8;x=pZyVYLf0^Z^uA+Cv%XN8E@U$k$j`IPbVPVo0 z{ae~eK{YZ_678)>{9_#?7)f%Vb~a~engda&1OzhUtNP+pHQL-V`(KqS8vbrIgh?H` zyP#&c%m1WTo`6-ubk`BF}RQ(ll?_A6~v=?cTx`vb5!iV1aX z7Ne0dJ8qb~)cwoq5aFmNE5e}-k;*nFw#3NEkJ&$oB!|Adb-%nY3!5adR7cCmVVzz`Q6)uQ`c64nNJtb>4RLL zRWw0jA?|Y=AkdesOwixBuEg*i5USbe8YJ@8cY^qwCB==OcSRo}r~N{mks&g^t<7y; z1^~>_;CO*?cl~scad(}I#gj#%X8)A+Xw8AMwG2^QBdm{Vsc0@<-xHj2TvxJ}COYM3 zmrZlZt$FU0-({RUPWk<1w}Wb@{2^l|JLUd?F|4kQyjKV#Zr9B^1yQ1BEj|}IDAg}k zd(jP}j?Lq1uYvlCKTSs?yk+?GSat%;2K-w2fuo?r=dBnyy=x^=)--;uk^6xh^5ca5AEIM-G^B@a(80l{(v<~3 z`?1y+PVqURr2^DD1CH;*?BnHJ&R;OTBLRAiMi>8hWp`4~Ype{^E6r5UAR8HMUN&xw zJx%?y%#kn4pxoqTA%g?Rl*Y84FNdv}Mk8^8^oc*XqKHF{E4@}!&;TAobS9-v(2xJu z$b;1o3=%(%@oH!a^o+r+X#ClT7Py#7BVs3KUns$ z^W&m9@9&q#!%?gFRR81l5yh$=Kebn9Z%Zfbqs$wQ>i5$Z)1KlOgo#=a0~lMc7CCwl z+Z1wpe59sZKX%5obl#Q$m^k?}iD#u@Wo{!CWAp*VnkzGXe0`+6g+TLJM@B+uo+m`& zBe?cOm#5vJOMKeBjUx;r^iQ`1{jwOmlhKD{3ljL+(%GIvzmKddzO#AZMZ-wsvPPG6 z>5x%HtDmng{t407)z18OMihRkcE+@VV}AYJeK6^t3NP)bxUKw_YmB+RG{*qI%?j#PZid8cs2GTwQ06|cG#TO*+HxLG^giZ$Ww8yO5= zwua+tA{86m?VG}AuJQGCs<_gv+*1Er*{ECHijUmw8`uo$7D?6?==@B{%(;T0F6nM{ zm!=0*vC2(2rZAeo8gLMfeO@wiFeUo|3vtLLIUkeN8&TFuX7;7P0AMOrq3wiC*{WWj zaI43CIMpF@-YLZ1R*Qax%Ug-g28iOBRqi7}=cgPO>Au4~u6q_Z+uw34K5;8L-0kmV zq#DnDo^)C$n0bi%SkS`oL~Zvk0UBDV=;(Yn!|&65h)`}r-5%~NIlFsTc#YS(sieop zJPqpJx~aIw$L^%HR87eu$|8`n66ZrSA90!`k~qJg8|xlA_!VS8IGh~R7D;qdqv-44 z1~*UB>iQ{>_^TX8nAIosPe_LO7JDU1e#Xz;*pR&Xk7^FyaB8w|bvW5~oenEpj!LFP zqi*6f97b-5?3*=QBSC=sdiSREudL3w!Mz&zh4}# zTsMPrLK`|At9J(dA7T4X&0%!yg(Tg;Zi~W{Xl2XY11{PDySq>I^lh6d8Aw$Cpmd|_` z+YF!iT6|`u;WO7xUM$`+qZfQdlL$c;gyYMj4{(_kNI>>;IB*ABqMT<7aRljyZhQ_b zMm+xpI58KBUy14{Oqda=Ul^w6EmptnookqH(L%-Arq$6t{-AZ)Mc-;MGk+-T-1n>4 zmO74>DDP(nt&6WPM_gYD_;X?uYKO#8Wp}*1NSM0Bh3t2X1n&A?Zfp}rS~i+3(iq<& zp-tg9@zHajePV?(}SXq0N$y$rzSh3dYfuOHV%;1>E#SnBssP^Ek zAOo75x&lJH(q!nE?JPMJnw|hnJIxztL+2dX0oXS+g8mF$w?Wq%ocXT_>9LdY>OV-F zKq4*dK~EQ~)EvC>)MVjIv^W~&JY3T!l!Myq@FVVpA_dW%WzH{P-6{Kca^R1kp90GffQ_$Y+@c)!!2%LEsh2cR0uW2Fg zM!Iflahe~Mqb#=(E2j{7%#u)GpxxjsAcGjQgWQT#dNa?8#5*(V$&7pEFf-`XNd`0el2UF;vbv#wYOqf2T<4V%8s7@1La@_8JyGY36Ue;U&ke2Nm=qddg-h_>e-a$A3!}iUEUe>@B{_DHp;Or{==@7Y9y4WyW&DGC z9s7+WkA2`&7#jq126I7h8q*%Ce^I$m3A^hc#H)i-C=9Qw^X4pGDtOYTcVDbnJH~|B zJ|~g~eTLIq!gw3!;CeBqdk)nyW$`3N;6m@uQKOSsiuL_EFUr8@Ce9`N{J|_0( z1Y7+F=qCq5`_VzvLu)XE<1bi4J+eZ;25lVbT#xu87BcOd+ziWsAx+5IBBrl{SLB$%a z6nXx#isTc77)NQcvIk#to{1%tlZy{oQ|R{(@*c=2^$R}iLNA;o)e$~RP2u=Jk-PEB zuiNBK+6K7~fa%!NS60t7^uBclqhDSZS6lKMvMsIR3e54z65W zmk6<(+>)Sa&fnsK^0{|sk4*bIkGOS4e?o0?x_BoXzZ@B9%eA+Q{_UF#xniGo7b02o zZb^+9HDfr!nxPyqv=Y5?{S4G98c+6}$^TijCxZ3sT536->d%v{s~0&4gMnN9GI0vE z3#<8mtFCl{3|b0BzkB=+Vgh^wLJC<6_+1bnr!~8w^G63eOHL^P*rN^9I@c+-8Rkso z0g=R+{owW}MTL0qhU7(i5FpLr#^G&?r68SZuo?`uv&M$#aty6z-CK2&R@YTNJ!5?x z!#y?G3r(iiYByGySN|j+!QbS&A>Bici_RB-pE7T#yfE2k1fK%me`7(Fj&biV)=Kon(OD=BYL1)4NTWcyx zh&7e?rYXIw=f3c)vH8!9ZQg-)mt3f76)ml)f=}H0I4VCt@ym*RQ4g`5-LXq_ zB0r9=Cr+LM;e$pQewN~wxgSQHPxycU8`aHHS;4a6*CDSvpIp4u0=dO&<2iK(t>ms( znVj4GBrrje6S*uaXAPKnD5h1Z8yht+bV|IhAAW%7&0^Y<7fVk(se2T8{JGAV#v!FG z-Y9PW0k8pv*0YMU{-qa%b-Lwgq!-GOv=47HTP--A{^%^JE6ErZsD4d%Ga5uidz;2@ zJx7i;TplP}Y){ABtjfHE3J(v-{6Q=}_8 zed|ETL&Mhu`amxv^tS8_0h}nUdZQ3z9Z30R8#Kjy(k}*R>4GZP%Wswlc-XPa25+ z!gisQeY7o(N${Z>%^}_5G+G2Q)qzqdhWQ&n$U-*n?Q_>3>^WN8i0r~m|m`E8`y_>X|&`d?1kxvRAv1)`BN&$a@7jSlbnKNJZe5AZZi(YTWJX59TAv&Y+es(cvr~fT6F?yHfy9S`bH$wg32N{VkCJ!^!au8 z;4j=YA39C%z&aMI`kD{xcW~@JTEIhWCwlkkYh~wGKJns4_3VuBf5d8E1c^gSYx#Fy))2y(^7rJF|Ix1HpETvq$dtc5 zr~Hy#%U^HGug;X0?U@-bq0?!U8vI;h%CE_kUz}5Z<*wyNn)0t?$}h|*&q>DI_P=k+ zo0A_F|BX52*Y8^Xv-QGHDri4K2y1$>)Ji}P2KWwBm@NHvawBEaGKJsYweWqWa95`A zluY66yB41L*FwPHD%POoiJ8Lryv+gQ$EM}gnZn~Tg}3e6a3zPKVu88RGqAs~|Kn|u$`&Uk>flO6 z_)(4@;B_}~204@2&S1M?i+2&`Yv;l=|BH8|`r`h}dQR(~p7G;vm4B^8{xvQ5pS=hH zUG=*5k`lL+O_Zv&E%hCkjjtcc%@!w?Rr>(D`sY;tC{tg7{*OAKDRnL~+{lUlq28D4 z)Ni}$?X7x;e#?5#ntD&EUT@Xw#Q*Va`n$!{dsy`pv1zU;`Zo2ZntFd#JzejTn&bB; z9$bo|BNdbk_|v4i$drx0YB1KOL|?DD@pY-MOa-~p$b-Vag}(3-BeGRm%q*Yy}m|x>7{xs@w}Ao zH~u#D?l<*9s>dqKOU1rry{UhJUtOj1P$rxtb?UdMm)b<}|2Dy?k4=FNPT1L%=(#;Q z(#tqiL?2SKjk0BpT1X41(LHK6pu|fx{&Noo{_GRpHy7%qN&RbzB zf8lGGCE_%1WzKc#u%B-d1U|^rp>)SC7VD`GJ=!9P*&V(UC^em`(}Q>Xl6!-OkZ0+-NieJAB0`f=-91)W8U?IK+!f6xr=5QRge?`$Rg+5z%P zz7>vtH!Lq?!B`s4HwYyo*}0khSlm=B`(CXsVAdaETf@Sq!IiV{06*=Y!Ic)>D2#{W zoQWX6n(qja8*gQ({z0Ryw=aWhz<0-WM3Un=I%9?|6Q^U~?&nsnF*|jrhB5=%3p*&; zrTv_8BG^auvs+kw&tzgd@bL^x8)Rg;>J{eyt4KOjzgH*8hP0p6irrH=x}+YgS%u%I z@mAk=+lNcQ`FejO(IXruSnG7G&QH?Fq>J;y$r|l^uak#QLTl1CIYv6OmU9U`n;J--dfIZ7LZ3!1z8ABy-%FxM2rabC0|x&xrEDzkY5% zncj)H1H6~tU|N%N?5udHQX)zMd0ayvCR^6w_#;ejJMU5&s(ox~hh2I{P4K0@FRl;AAiD- z$`eltKUw~RBab@zm}3Wa4hZ^>w=SH-Tr49Ju&to=^OA)lx)z?w;iJA~&isKu;4D2Q zpt1NxJS>udiCDhUE1}%1Nwjez=KK!>_p<_ zewyz-<&^aK&OUwj#m6(XY>NBj{{6lyx*et>)7+;HKIG7{!wx@UfWES0brBbX5;>zd znsF{yh%^eH{sE*&+#WyI)gsc#b%v@`{|r=I`|ajUlMScgxy66(@c(Y~|8DjFYKl}( zasRc>(kptEI!kK{OKY5^&pJyZy-I6ZH}`7Y_?_AwJNWt)L4GGwsH&9b9;=+V5;00z z<8kU>552IyXLaLOL!BmF&+S&?LYsB4GTa?m%iPUdu6Yb3cP0-&R(*2JeGOc+RNyol zNSEdd?ZP>;0`4#Cz3(fCt)*vTqi2R4DXZ3}p8Ax=L8NT7UKaT;|7HeEB$8g{`7c}i zm(%p}3t3=Px2UqI|MmV8|Gfc-qZNxyC3}s4%4eg{AkQGqS$cNgQZU#0Rxe^md#viw z5nr}&QdjHFl7(k|jfEM1$KX!XoE$v=Y0lU_ZUjCm`DMKas!L025?_orOlr3 zGw1#|zwbkNyFVl|&VK&OVDM&~`}i+gOv%hR_wwHd;}6EU(UkkI0{7otE$)=~t>sw>&89c-Rnavi*a%D7k^8Y{atkW}Er`X+iNNwa z)l0Ltp8a#qhm!5r#B#nkM%iTJ+8`$=hYQMx(~W(o6_Y#@JP;Z47O5!Fp7(a<>nb=l z_t0%V;Q#-bT#Gk&23DdQdwVN{GISQd`M_27Th{VCxO-b)yzuM^RZFj?80VO3oG)7@ zI~y=nqRS^cudP%gt0p^Bmh)rcvwG^7?EHe;X`Rbf^Yn{n_~(Lklbs9nNJ^PySPfvDUOc74v zG@lK906Mo!^KQllc5yW{in>mN7Y=b1bm2bQVQ6{=TsTXHB*#A0xbwTt@0Jn391gvR zt%^nYk~9B)^Lch?_wQul<@?p<`?UPzIlI;`FyE)z`USh!C(kAIBes6w?)8hz_oHn6 zqTTCvGv9mJ`rUS~PXbcfe;*=umdx(HdwnQ`@6X!r#k+s+VZLks$5}G1$L{U-G~chb z-+S)_wH??RlPK`zq6!z@0eFp#dNhO zt~j(jqcm{#wj|79pYA3Ggv~E>A6$A;7suGJIJdHMMkS#Sa-fq>rloXc{`m;#{Ds4H zhBJDgvxJcRwouZ2s`2yh&U~}#{OI8eaj)Zdto(QV+uF}C`{L|rnD|1k=cUp*TRQ*D zsy}>{Ig0L`j5=-o3pHaOk-Zj7v-1J*oja0rn<5HvD=}zQL${xDl zPTspAf_zSpB6yZI`cI=AFcbF^A^OKT`6a0V#oliY)?p`pad;C(*cu77hT~4SU;@w{ zsO^y~shZZOB5}@o*2!g8{{jQPvZn_8vNr}(!TPam}iPskZz$DQ5Y0<$O!2=i$C zyvNM{xRq}ZuVEXEo)_ErX4T00v2OBI8UvHcko2&rFd`K5j=bk9r|AS!7LZTV4?x~8 zjsGmTqdg&23o|_L8K0Au`pX;Jss1xbY3Sv3qj%r z4P5I`xn}ylsRc-P^FBR4(S5SV$=v)*I!dDQrLO3*ac7U{o2t2~+F80D`zAT~C;DCsM=|_rfiwzGwm>RH=R+#`c=eF=^=Qg+ zhk;(jA*PKe!4tczG&Fmr57o*A#Z-iuWq>=ip*#)Txj{2NaL>2U`7CWiTKih?y{^jd zJT}Lo^KnXWOyf?&0rFzG@ckY5?^P3nXhPNQZ`?Vj-ehM^!dC#nG%zleTDMe=L z_)!x4=x2V=;9(ZS}WPZZQcCc>#kr3>AH9ObtA|T^;HlwvU@%5SIpGA zWS2gZH{=cAxaCeAsB-52gQCd=c?1NS6IRar3wiCm{+-mG*v|C7{%P;_Lt*sD^& z9TVJqkiH|9N{nT>GGCmpl*uy8FGEkUW`BJ)Ykj6>8Ox(qlXn{3NzSs9>MY5xiaOUg z0918uL;vLHyBc@)a~9~Jgw)STeXomz-nRGKR~-^9t~%Cfeur-hyQPjXW{+vlfC`8P zRN(S{1B7b2MDA{W-=*KZ?C%>h^%Xc_;zT$Yb_+01CPUNsdZ&3YznK-nRPf$0BeBmR@d>*s#4D{ZaI{Kre}z^RnKUo;RjW{qlHza^=BHjTI5jqG^%xS@I=4i zZnR|es;VB*S5^0IP)UISX+VzyP}Y5Vyq-xIGj;fzD9G4t@Hv)GS#$N9o zOYwayAx@z0Z%{_N)Y)M^*f(`%=?_&$NB4FXHEIG!i(k%KAek}$GZi_u=+bstS@0je zN)xK?ZMHhmgx2a!#5u~tVqX1m*!jV8b@2};JIAbYetkQijJnkPJANsHUJ7rNZmyW5 zhu6(RQS=5*|4ncqNuZ-(Ozr;pwGX{&(uitjbuwA=>yL^g zrkZ1I^z6;IUDW^K5&CR=j8?iLArGxH93p6nM$y^$cK4ngsdfSNF z2TE*_&EYscgO%Q0$A_3Kt`l4CT~4f_v?>#g&2Gywe}+;mtYJkg{kmck9L5!7 zCS8H z;GN^QU$Hi~@tMW*hFn@db!wE5oqeC*x0lxPf`<+MKv4-CWT|%Vy#00?-}1rf@!bTm z>~VZ@+1c@}A1?gVaV@d!AJ6P6d1mRqa`FXJXGCYy|LM0EssHZj{ui@~wVoP|v}?&( zZ~}s2DN>L79Mz(|uB{x^P;QxJsrUFSvM*6FkelaC$P{~vTb9y3PN0uoUU*^s zRag;4M(e+aFMtw`?j=yJSQ4P32vCfjCKG&{L8|O9(zAC{J;``3sGt+IHV z*9F?R>l(7yM3f#Up}iziQxm(Sluf4P&cdsh&6<_XMxkDMF7PToU?-YR#;J6k__vGng3 zOxt}aXmSzL_0JzN1E%W;T{A+b`Fp18qsR!%j{rfbLOmo0pKQx}&%f&fs^D?~`k+dl zJ3+{_iz_!Au-cw4^6A0a9+1RY-n+wmdRXE8>I+tZXcnUIp0n@03wh}i$*UqALnO)s zCkmSK!%&{3krmFu>!})$h_RTMgO@Qu{CPB-0{ZaD!I zu#7qhg`lesKH{I2X+HNKpU#C>1m~*g+rnOxWRK~JHyzH>64|8X;(ratXBv+CbLTf4 z{j)7t|5{qeS{ivx`Zn!zL~m8}DoaPeaJ7YjNxOk)9e;eeRa3RhmzmDX>~u!2f!#cF; z(b3)w2PcQ4mN^SV=RkI`kDb51lZLBtCwyj4~t2BJq!iS7ixl z-HiCPk3l2IaKOzM6SCI*VGTosMPuEcEsC=kq|gQFLc3w{Wy6nz$LGvgtpT#{OvyY5@4Nad||Eldl3mSmcl{X*#AoX|Ye_EyQ^P_R+l}_`u)X+jbmvT$5 zWOf6|bq)c|bmG`fyc1*&sqq40D#C5pg2wz;EzN@%?;BS`l&N6M}A+P@} z8T_u5*R#{Zh#B6stG@Pkm3=gj*TYyV$!T|2H-23@>nSo~z5xHOCIH)=H0WVMC%QJV zAJ0?_5cDP}efM?4@PE#%`V(`svq<)MhQyzgg_xco3ZIxRT)!@tRy&!XYRq#^mq?0V zEQOuB+$6=%H?6Rzi|VS#cG+XL90Kt~Bak;j*F*O<0(skCgQ=VgdkWUQDPK6V*Sr%Y zK=J2FGf3{+^Clxim!<2RYU&t%;w*ePieo`;G_2FXc)jNSQB3S0%fx;M6RSsPWiv6KA7t~dsiy70_t{3hEpMdh$MCN@eFpRG zXg2`~m@a>&P2YewRi$~;xEyQ_OBdRmH>Lfl;!mqhn!MERU>UaYfh9RLRO^pflr-?~1kfjrt@d>F%q;4elZMw)P zaSz*Ch?VM~r)EW(M^o#53*j8 zgWt6U7}2F{-+JqjR06C1%N4m9EQkhoGinwqOd* z&a$th2UU6X81gH5&BHhH5c-zkUI-Hyt^8Wd> zcFD{j{wYmspO1L1-=JM?$wUq|53Ybj z!EsN3M3NIInjGAi2L01F>0jeI74oR6WL+9xfwQ2W0892BkKoGo7gQbWEc!~6gs&zq zuduYMz;*7#Yn9@i)Pw5;5);s053_hcr;zg9s|@WBhh=jChGHb~q#|M>@dxamE#A?e znxofEcWY7tC33TOI6*Bm1o3%a(3a6pjbYmEoodHyG}3VVUFn-ccx6W2=Jht3m*mkm z$VW*8)<8x+-pp_^EO+Xz^6{v2;oaqD42FbAGzuH_8vKS9YRk^@o;eEx9LPbgf#?8lv~Hoit{~pR~<7C;iLA1GOL1 zu!z0`wcnT2ZjxAJ?=>sWziEDe@=>^(KR@LS!!pD9wOP14JM2PLl}L=;=?J z@%)t126x{vB>0}9P&h$9XFm!Nj+*B*PZ65Yd*wtf75(Dw9^m~1FH=gA#>gj)e~1}> zv^I-i>kmu26Hb8u(ykKk%YF1@$bQ#3wt5r$lJq5Lysi8CpwvHSd?R$vC#)(U;hIUW z@z79S=RYjJ6dW5r0ROOoV(34%V{h*2gjiFTGH?3&w*U2e9i+4Vo~9}}^twN5GFN`` zC+CKi{>pjKR88sB80x{E&lqS#_{o0?X8eWM%=`L6qsJYSe*duEi$?a|DIo(pQ_gG& zA|t_Ai{7V5|5SnDC4=v|+cfA6d|Ay6e#KIhcd#DS$|{(n(bs<(v?5uiRvuIS7FhUu9|gn9RVb>N|7?9is~HH+wIlIvTd!Gdq%+E45B27= z2^28-(=O;M@@9=0iwAlu6%!A%3S&1Ki-)6I0Z{_v7nmZp(C%7=wHux0_bJnfRzdM+ z`H7fwn*YrY(~tK0Q)q6t4z5u>V8(tw1Yn4ZPRX|WqsV%~DK z4b^8DVyd}REDc1EbBsJ)>>MjZ zt)H`S^xlHl2`9!D*Z6zL+*`~Q99-T^4*90nkZ;bS>-jfOG-9|O!)))@5mZvSrk>k_ z1%GnzoIlFB)8!rfqT#1qUa|B#;x~qIGtw|Nga%nJx5bPSmy8`L#I;F|HaWDa+X||| z5emXer>PfjMpk^#IOG_o>HF;4k{Qq~$4Dl*ck@=B8&8@+2!J+pAIZD*najh}LyA}3 z@QE@^xCKpiUI-dna1;An(Au!PXhF^Pe=GTfnM19_7mt>gC%8qx&Jq3G#`9(^`=CdeO)7VgWwA1WLbhA2U*Cj9I<_8kvg_8|M@J};=-fx4t z=9Ci|XPWo7b-Poy7eDE&r>afSMuO_Hv-pNLKB#sBGwZ6$jf{~ld!Fqyza#<6Z6;Gx zZz5Ip(rE|cug>eOx}`zgbA!5f*}A=1@BbffZvr1xb^ia)ga82|H(-EhwM31Thzs!x zN+e1K6PUq?qJUb9))u8wS6~LTDh4NkT&JVhx^>^b+SRsx3#b(nmH=9jMFsbO3imQ9 zxP?U|zxU_dJ4?`hzu({g_4@sNwPfzSXL-(Zp7We%JJ0!%sY@g?rSaEJQAqNeid!zH zo&L@{ZdoW5Cj&!W^)BrzoNFahHS-p*CcMnPuwZ5Dz(AmKrTr#zJF|0WbNZq-r=TwN zr=khSH1))!e#3)Eoa{3B0mu-gP#iGi%iV2-60 zN!=Q(In`=vqFBx4R&$iUVJ3}0JGDVTw5XIcTVW7RNZyxOUL6E>Za51lb} z%s$KQ1=G#w_w4f&3#YDwudHy+eF;FxoW_2wMs`mI-0JtNg)f>teEafKyyZkRne%wp zERZiA5P!;Rgq_Oy93G+uvP^R~wyt*H%oX~k`!iZJd1c@ zH$qX^wi$j@^;*sF*y(Vo)xYq#)NL;acvztq*wSE|^9SbWjO+)xfd{!BKYXO}5cyDh z##c6^X7vcC?l<>(nBX?Cu+mzeo-d>VY%Bg#6YUmiytT*K@x|e!cWVJvxnJ-8ibfh` zrpdsAi4U@HUK;CHm*OC<*Zg(nxb8aot*PtrU#3F+b)7Yl>FuGtZ#KQwFugNs)$eHt zermk_Is1)POD%^yf&%JJwF;Sur7WdOP#3OzGw}hZF#A~d-cHnw@hyuOYAg5fGFHq{ zlplnHn@AHj=aZ2A62WQi_Ys1!_5#U{#4?jso+Vit1^5!DjBa#R1@&l(3GZX-2@*)` z;`BECl;-*&!Drn-N`VZbSK{I7kkfqf~4f4fa`{Jn8Rggj9ZHHC;++_BHP9jD2nX zIhp-z1>i(DO++12sw!J5{%VdqmKr}awnGno?4i$@(mg0m0=yH_UVoWJWpmGO^mW7_ zzw3%SU#0eTQ+qY9J?;BzKh4l<)kf&`@Qxp+k7sI5F%H26CmMNn?oTo`x;WKjnwv{= zHFv}}gSkKc+@td!{>%S%xxU?Y=Y2TPkN2IY%_zhV{ieG@oNsTVoP6chqOW@b?`K|* z&RE*alta86!&mKhWv`k=%l<!>&@|vjd$XId@d^{{MqP1Fe)wD5wFmb)`KKH@k!&qH>cMy zV*GtDY!+vHe@`xA)is`bdW@*=k7s|xKi2)6Y5kP6K1C~Arit92(WVFaA^Jr~kw@H^ zGZsM+E^F5B=}1Aq?gw$A6^%Pd40@hqDQ5`^MI>o8kUGp4 zIN6MQ{<)czFkBlw;$o(sO_`Ek)=xHmj}`K)Y4|r3cVB@e`0Kgx+*4x3`dmF8pdCN_`2SO`3k%SS(tXQ;9 z&!t7-K^PGp+?5`qF7(!+Q?XW@8FEVFF0a9qJ5C}~Vgf2Ov?@`;`P+-|>f}uj@NOrL z87-RfM0K)**l&^hm)$Cw@+5KRfyaZsJ{40~IR=C7qPkOeBoS73Fa$G}xpaz2-n#dX zMuES4{xDyY{t3@8yVKbG^EK%le$l6`rlY{Z{6U_NaiPvSyVI#>@M84nscJ&v3QYCB>|al^Kna;6E$8OvrHidRxW! z@An!hr4ibk{-F2R(|bJE@1k?H`T7rNgG@%#lzmu>ytZQ8T4`<1n5BhO4@8ZjW> zh|BmTJ73OLY~35?Uj>`|PGupn6~_mOERCO*h1lu9^P1t6KKB&Mbk`cBdHcHvHH_eh z5SqWAvHuJNHh)%zdHb0c;PHT2Z2rtpZkGbt%QPXW|4R!LUjKPk=5 zefkV;IBQc9P_8zFJYNwKR!b|?p0ShOCd@Ds%QlEqz4{pg)Zy_FYjg1ty2pI} zgd8`!UCi1y_#icy_=w&=@Jw)jUa6+dx+1U04tg`Xf;-4Wlkr~sj>F|^W6v5}DM0}& z-g;E5wXtOx8?*TLe-}4#@Bbohg1i1$0Qj?0qo#PUp@DpJji76!&zzsUSsdP^mos)N zxpc5wnYf8xeZ|Ok58jutR}Q7Vk(0Ez&DlhuYCL9jozXh<74a2 z6E@zS9FF_adVd}=_fZ%c zIf$XnJD{0(Z?x0)l3WWtJ(tRV@qjdU90SO+w1K~DY~jY(@%izk#@F>XY5zL9<;R%5 z3Azv7>w)^~HsPQB68GH3Onl*5Zye0UW_S$z;xLcc-}C$XyXntrQpBWnkAlH6vdm5y zsq*@LIlVBaKRabephn|eiSJQ9o-HqGr2VX>PTFX&Kc(LWTi4PeKardm8vwTR(cC(a zXE@5VmmNR8tgnJ=AEp`u(|RZ=1Jkg=!(eiEGe^cgwA-oI?!rwU_Lg+Bzdm+5zcgS4 zttKP>WG%sPiGNVjBXal`eOUM0&%e1PsGy7dCAis5s0QnXao1OMIVZkM0ma+3J3q$$ zpdcK{sr~0@$NR|aomd`LJMs{_drV!AA4rcsQ&cM7-D!Mq&*Pum{#?^1{*JrARA>Yw zt!D&KQvtY@9L7}~O_o1(pI>)^sR|eW`iM%4yuq)0wW3d-F8vj@5X;6xQ z^llLJxo`4q!Dt1J#Q)xS3;XP!&}Gxx3Ru-7SvQi2r=2<_0VAF*^i67WqKlvRpuV_zze5QLQhsv@%hxB$Cv0o2XWkXU!|6 z@K6I}>?oG*h`Bwbh&kWSaI0DHip2){ZB!<{J8V z5zjx=eP_?kC-ENxt$UU*oQzI-0yTUp|0Wu$oF&pq0MLlVg>h+cHF=UKxibWM=`vNI5Xbm@&!SgvtKGQ@73^3v-UE6d4F z^9mA6ZIZFXq(CZZG1-%VkDiY)36M(MN9ks9)^ER#IW$TN*KMsat80UV2&Q1W{$4(R zRAve`@r-b_9$_qBxMFTMCq33W;h(~3qi|v3amHrm;vrRKWM?AYA;HYY{Jr}lfnDTm ze!&FQ^E0upAa*UH&HU9O^^es%NSWqWeQh00Bo6ezQcCmu!e+YD`_(6YRQSnLBR9^N zdE?AjxVpq@8p5K1G+58N?sARu^LJ-?{bu^uKuEy*Ft9md$N;3CT zTF}XhJq^vBR?A;_GNa@O27>WvZPwlYG_NSy{C9q7WzT$G%e*jF$4)B>yH7wvVFx4< z^Ziz&sH_u8DlC@LsV75gGL!z0Mr6LdQ#Rj{^kd7I0CbV|xqoM--f!{g|A{R9&#;DV zAeGZb!N|doCl8JF5>aOODMvn7)Pk8bc;uV%6HTopU)(zPY}(d#m>SjW(SUb0WAxL) z>Zr=Qz205{1|IAE&Y$HmYVWTz^-j*tRS&OHfnVykl+u2zXs2?yU2r?C8R6x_(a~%t zv3r)Xk#i7zRXGWKGv|Bd?m-9D;YA@p5d=p`t0w71ax$lUj1(pd(v0~PNFF-nQ*KVo zc?W$}BL1e@G(-8uO60E&)q2kqil%x#r%|Ow{i%6yAh~!S*bXOe85SPiA~6`T?7aus z!4;^Gm48IxjVg$gXG*2-&2!J>|cd*(Kjjn}bhlJ-0XF^7-JT;77p&mCpvvB`f}Z*xVWKXU5{k zfqIFBlr~Fgt4SW!R55~f!gdV|A6sCQoYLaU`Y_sj_-BR27Pbi@QI0PDAzShHD-=(q z9i^6`=^9{-kpJsSU^xNwA2+MYS`ctd?68*#CogtJ^NafRk;$R-|0v(dbqwS-Y-T#S z&zOf_$8RsS39uK*dF72(DNh&-FTGo}G*riW1E0>r+-)(J{8i+sTCi#>6-XAHljoo+ zzR_ysF5@31m36k1N59-N_5bF&u;f#Q{1{G$hJjC`sQZ|{IG{uKYbj(w;}IOe4Q1ilTm7TrrB*3yevrRD>KJ#Rl$9s#bFjX%a( zEb`O}2)H(zM-4rPWzGR56S>7E{a6_W#g4r_PrgeRtbTQGPKyKk@;8o8nIz_j@JhZjD2*|cdY>^G@nu^E2O zCJ`S)#0&&DzEL&g^N*kV>+CPo(l-wEAsp(IbFtZ&mV+(I$Dv8$6S{W019E zaLbTK3u49gtJc!G!OB@Nus<^pDszMb#_F*71m050PYHML316GqFt#5%)l5)HUO#+FoBI~ZdL%jU1YPDC8^dpiSSsJ!S4yfKYd$;?LSrWBG9e$Nxnfdal zq>r_*KO+n;JKmRdpS<;W9_`*U>`UpmzKA%LQPt(v4 z9bYMEpV0SsnpqYjSLO^|n?PIr(%5wJX|&K<_%TznruXp|eCvYt358~!d#1nd^G)t_ zHP@9h;oJ^|&Re+^MXt6uhR$oe$|M zfG#!apRe@`IDg>1Xu_SS_iE+gOs9#~ewkMO;B^uIu0O7xnGg5z!ON1uT!)zJgAmO@ z*Iap~Lxnq>NT!4T$adU}5a(27-m7C(ww6vQghr?IKIA?utQZ()sc0|1XnKM7a*|$t zxYY-IlG;s;DwSl&a{K+hy!{~?x^G;t+B`qQi0GV%TqMsZI^UBk4PU_3DuYrD_X-m; zZLU75J`WX9`$>D?8|H;E8lP9B>w><~U>vtx+HjFBPuyAczBB7o5g~`c@MydhPOJ_( zH$i*R>Q7@Qn}C#^&V^oyOyjXL+5@MA6Xz8L)6eGkD{{`5^Gag%?SU)Iw~S5Cmmd@7 zl?AyKDzCiA4B1w9kGvBbn1Rb`zFKI})ldHCY(w4li%Y%BGyIdT<~9*_4BeC#VH>iV zaGWvz+alVF3=SQa69V9wp(?n%U#CXx`Is%rf(tL^g*eSJ=ZY2n;m9c2GDaANES&$R znm|}814QN-NiZGv*AHkdm;Nx!7_0tduz$SiUAo!(c#U(gDTxt`mLs@GmE-Vb0rVIH zv_6aro^9%xy{+msXJebzlE4t~D;zn2P=t)lM3#Q1b&BG)V^JNDRVPiX1#`j%PYZoa$Aunv`;M$fkTTqw?jk46w0F+5>lZ;ADBPf0tAvz!Kv@MXz?0+S&Ov zuLO0u|BD{ok63e=_Ej&(&iy89z4lxkUdWqm_@H;cbtcJJ#D38e7G98^H_W+_BUKoh z=S@ZcI2lc_n*d%G)ed@vMHYjqbq#jAwPa2K(QF}ZwclPCYIO?|+ed^F+s2-E zcX4sZZfol(;ALT=qlT;5*VU0nW%?$BsM6Awm+X%cJI1!|>SZlmhiS0ShVaAsfVp!? z;mEe_C2bvLeKz)Kvx_T;ltUI&ESycswk)7nkTZayp!CpSO(buDb?-OCNfguDRLSfZ z;LW{{X2`miLPHi4bLV(UP7@yiS;eUX^5$n)gB@a@+QT+SU&W6WeR#H0ZM@{4lc^!~q`U?*RT5L=s(0;!E^|P-yo) zd>&mLe*Ry}oz`74QGU7X=}HL6(ErXlj*49K3x-FM2ASku#E$JKPal(cS^NmzuW*-w z3?r|GmAc_0=XV=C6l+05gL_#EqBPcnyG2Nm{Mb(-NjFIl`Eeeo&&iKZN^tar$c!x7 z&+S3~S$-b-r(5Cy>(O8L7LhHd(&AyVrQ2p?*hbN-)f}g}?zNDIf2`@u%EM1&vL1BiOftl^SSJtb4ck_T7mlDPwJxKjG=)9_02 z>kTos08erFz%AjMY486+54jiYUm#5I904vrMLTI%hzK@Q98tANw@1j-tXzj z`#*vzzeEifB~)mM9dO3cyxED&665V1MeYhF%aiEm%txXhsv=TFUWB~zbyoMU!lI{6 z9Qc=CNcX>*cON)AGVfH;Yw%PxxIXiKYxezddcP#|UdoYI{;%uNg?^rS-wPBRrjmS@ zfosTUDLs8H<+ni9O}wi0<*P#qYk58s*1~z9#Cw;88b=3+xPfVh+Qrv*Iyd7w`KiW+>-zc32&kN`!-3Wvzs7K|vs6C3mC& zJjkdcGER5<5Ic*-1V+tf6P$bPvg6N2G_y&AOLHX61q5|kOC=Vg^op>vAAf{NG~&sF zYWL+M2L#gpspmS=&rP=t^80z+`I3I-J#2X2VlztFW9kKbcoO*yV?d?y_b$=7lk2(fr!*sR+;@Y_b3c1h7OJVXA zbAKwUYqr-J_eml{o|BayAn?(mwz8m4*!=XK-P6R~=++!MM?u=9yBu?8Pi7&svwpC< zU5MSyn9J<7`F6J#Qiau7yPI{_QB0C2|7^kb7EKnO+h7+~%l76f-p-ppq+D+)x!=}1 z?z79Fo}iP%QLlY+j5r5ufNxiPIiec*h(0-<{ZF?^dHs0L55o1e)nF_%+dz&A-MHvy z>6Bg`tIYc_O>kx7v%Pk{nQfPa6+bHyBzdL#D{zcGYy$nRhtV<;W6Frw4BM6%*|3rgb(aQZEv+$ONz98SNVhCzF{a=|5xV}3F zpBH~7PA*OPQ)53O_^c&bQQSG9A{f6(46`^YV@IAr173-}qukt3mL6)>2O_Z6V7Y8V zKs8Kksl<6+`(twQum*d7gFL-tdNZbo6W`ZTigT6ks?m8=i$BQTLMV^=D|X7URfX*K z=GOUJnG}znS>KX>|G_88zpT*`XBkTxyT$<1rP%aIZ<`m~k7``ByPfgxP+SiUTqXm6 zwhkdUBLFUh9jm_j10q?vLz3yQTYR3E)RFvH#+Yy)FeLVs%)1C!e$`zbtIL95PAh2{dCDgKZ{qwZvb%np9WNE;L-PbE}>MvfGZ=!I*1~Z=X9 zlFkh(<-1wHqH`PrlD_vn>E7KGH9CLPbbiY5icijUj&9UP77rn7w_`H=WSVcj*RU5! z{Yop8ozygWM?Cs+O15cUJ=3STf--p-E|Cmnm-^u8g|Wc$7ooaoRiTa}zr#YOO{Zpv z+SmXJISE1-al5tfe8HcZ-<3WZ{@miVs94cVBh@d@y~tY9SGi=5vKD@g(vADS86O(1 zK43Kkc;cS%pz_TgWi9%Uz7%JgaLY4*#YwlW#$-0Eet90kiO=6xK}2s`3r|!PV?q;1KpFE+M-Gx;!> z&g%x#HQivkR4{SQiT=BvhkajzUv_8clP<(agpAeJy(OBBX99cgo7bOL;U||)v}gCK zKW#-ch!J^Tc<=Ub+pdz--NPq+C6FpjQ6vzax#{U%*H!cW^qC+1?d*a;U1~N9>Og9I zuS9zfE7IP!ub{GxLxwXue~Gm*JiR?Uv-OSbPc7xpaCvY~+o7Rt`${YK%-r)2x(?Z` z&7G<7sz!r_oZ-CMRId-VC)$Rl3T^B&;puxYyG3WdeAGE>j}Eo%AIh=hEn7DIB+_<( z%hEq6uO}p>y?*A3d;8Fvy`k+;|GLWcktY`1bY(-$@T2=g_HLu;9ub)SlYjh!_g@rA zWbgLK^wv<@KALO&&Wsr|)PJ~b--)D|y*O2h?gDg`t@fTs+q*p~H`J%5-BmC?ReB~^ zi7dBUy#FG5+0I@D2*Nix7!9o0nlKQCE7_a&go119D_zQ5T4%q)3Zw_hZScx%s3Ts) z6m73+y@ct%FNWq8eWR=E@~>lSyK=#2UF&{4##(e0s?*GsFWusP?McQL=()9`SFmku zk8{qnLxFh}Xl#jHJs82}hHsaE;IF|0XSS-e%A7@+xv$re6eu<7p_>hLA^th9i_LV4 z6R;NQzKCU)A202~ck9n(d#u_7@!nb#+53ixjf8+(e3jha-*g&YOe&8H=&XhOmsPEv zvG(h|3Dbua%%axUvIy|_!?%uqwz)B-us$g zK2vn=o8IW2xG6KbzF#)F-C%C{95XsU%Hmy4AU)hFU-PnpSmzmeM`U4#Fn=gTy7xdx`pP~;$Jt{x~DGbBippXJBDRz z9G%}ZrZQt?*=;_X6e(ryaVkM0BYg;HWUDc%O;su55q-!Y}6m#U%kFWL*{ct};?LS}U77I1R6kCWN2@gX(pB5I2or|Xfb?tYCt zHEOtD?0m1-pZv!fznH%}mFY;~3GA092QS_=YQAuNhV*WF6?MUE=PvJGYeR6YuC7_|p11CsDvT))81YCUg<=_bxz4`20waluy+J#K zaN}bkJJY4mm*r}Z8OzaxLsrk8NXU0f@ZKyS?|031tG0RW5NHP67 z#pvZFW4ExWL@FLmhoUG48poa*E7enCB~SHLuceRj@M1dT0NO%~Q-P520CxlVdqp0+UN$xLTi^6r_z7^M|LzQ1bqsUG?2~yLs}Jwp3c!Z{az|(bw;Bx! zwG8kEDd9Q(733&?oW#?0#($swFgxC=Ru6s+c~klsipO4L?0?MA-&AvrvI*cc>K|F4 z&f>TYQ3Q$i%KXsut!rj=DSrGd=gOtCxR|wsU`O18ZQnavG03r!^clJNl5qo@JL=ex zHK)WsZ0~WJ+-iD@y7xY6MH%6Zz)M_k+YwKH}@MmCuIRXqHUI<&e3K88_y0vj}pwq z>C-av`oD&Eg}Jdf3vXo>-eoM)47@pg`e5cH*Dbn9qr^FWi8vbRVRR)Gj=n2M%yXKF zFTN$Gn5_iNo_~dL82x&A2?!#P2D6G8y{Cpx=Qfu?3CcKQ=~#^)7q#INt5dZ^leTlu zWWZUyj4!e$?^T4#BXmvfmqQJy!moy>A86hbDyj;sh=NVZwL0XetI;|+~K#R}<#fSUeE2EX(_ zLKUs_i5|R3SV(KEOzj3a`1$gj_qkJdp5q~R#^Ne?XKr<4p8o2RiGT zE{!ravCh7VoCLLubY*X|IfWB%?^AnWo2{~bL^Rl;Lmb?Sczv5SfMZ3~Z_Fk&5XV7U zwa|olZ;i3vt&*mXrLxsnD)UDtd;|Apc&OFqwMYpt71e zRK$MRY>25w{Sgo=!fR@aL~GhT`K>ifvAag|J)FABY@=)Ls^v-ltr=J3ZLD|eO_=yw z`v>~PU5!2edM#nk15AzF`GeG@BEc^oZ+rZvds#4L6mroJDqFG1QnOQlo(v`qFfLNXJI=$jOP)04%?TN;D%6-$OAh1kVgO}{x+KW zP6?4_=4J~~1My$F&ts(UvXStNDFY9M6VC?sM6ACd44LB&8T7N?BPrJwrPulNteCF1 z*bf>=y2ZSAG}xSk7{(pd<=pyrhzW=t>(eRMF}+!}PRS2YOjmZ1GZQh=K|P7DO#h6< z*CgPvFtC&F;D@zjLP?^76le*s**U(1UoY}{ax`^miR?RM-HN7Uaa~j9t+U>bQslR4 zLe`SJC22MN!n}=EbVx9FBFTV?Dj+;c!XO6CH9X$xB`=kVBD7OX3ob@#uaHBI=X^@^(R|Bl(+j!xFlTUA~)y@ee!FU5+1SV_>@G)ax!rZ5L2v)>4 zn>Sf8@)sDywuLv6Aw%OyMf;%9t_!N8z9BNo#E-7?M8Y~vw&9OYW#|V9EB!0z5qn1Z zAN+OuA?)V?#N_n~C-Er^=pD9|zi|8r{*GX=Xods2AGVjiW!{G_MSy8l3}S=5TEex& zg6Fk(!q(D@A)8)Sr3B|>;RgLEhw`}#;kn!^PIzR$W zj;X%=h=6tf3MnIP6tb31E(`~E)f8Aw8z@r4;lTUZlWM^8Px)J4wW;pzferSXTnLN9 zkmiS2mDn}a$3Zno9|JRe{KW6$w&J`_Uf6Mzfcl-kcuOA;1T;2Zr;cof(TY=n(>Rvft)s-Nw@_5hI!$7)@SYWR8Og zn_eB@F#Q9^Nj@BVsY`%)xsRLX2$dP!hemczZ0n7krpM;(O;bh%tOr)OC-4>eol^`) z(cR-k&e#f;v=lffQ&<8gte4n4jkyPHYs|ur;QbAMtJd8;(F>K&@gF7ed%^ki1d)~+ z>E}0cj2hATyqX@di8aC4Tr(>d7rEbo@cGT>W+fBgXMI(tdl5fXL+AUbaTztPraNZM z{W+hq{Y8^BQNbIZpN5k_bbIbuk2jb{k3Q>EUPr65<<+E#qcnVj)m`q^Y-Ejqb6+1SPJl0yCN1MA0fzN*Z~O*q^vNA@II=V$tv?EDNN z4I%C@_KFROjvm$nZD#uqwi#wg|C@=+`G`2VITeo<#&J-@`d~b7u^ugmPZz_6slzn0 z{0XVwAq*kb7YQO}nF9~6$mzPyUY}@_)Afv~U3gY?+iXtq=2Z?P``T7=N`di$rXR`S z2N!68=K@XN=k23DypmA6>qyt(8gV~u`dclXGt#{!NsGL%ki_%I_gkyF65D!kKmD4Bl8OcQhiSU{<2iki zAA+xOJ@7nmc5Uy7{YE&+;W}=6-u!MPvAQ>xKA#rh(KyYNtu|Wy{+t_(7*Wag@_`%} zi_C_lv!-XrxN)(x>juhUd&WbfX)e;0&(3cikrJyXc@*~(-hnFats$+-J}*RUPN*hU zm1MRjZ(h)9rHysPpX>H5%g+RiymyuS4>;R7nW#-CD8(6&(j0)>Vt{bA6AqC9z`ck< zhTnRp6Z{N8ni3`i1m1+Y6AwnmaIkUF@5L>WJ!E*ELthn~qg@fTujklrcglU2c^{S` zU3;5I?jn`^+W$zIgTI_IeeC3+WX57v!bn!aJJu4j5@N6A6KMMR#k&8J^WyKqL>2c{ z$2fIRGSHpA)4$E^2j2KU^{>5+Ccne{Y;H)6EY;X?ttanbmyOzS29DJoQ;|>e(O_Cj zOquIM`8&d!-`0U+k?C8`Ll`U!@Y%V{&6fvXy@4dn77 zpF*z^2_@H}AcYd|5C$bfV>q$4kXza!qNUzaOPhXch~Xw&twa?)#6!g1VXTqqvrT)Q zE2ygX$Ssz&q$t$VzjFnmh2#j1vtgzsOY17)k4}^S@4eWiCNR}rAtdkYMo`$|H}4ca z_a(T*`VkJqVJS|=im0WDZGSR!3w<+(uVhik z?w_nHIT#Y3b7yAO0bH)+&8_ zhlTymZ|SpH;}}9t?-p76yuwJb2I-T~i1p^hWTMOv zIf^%+UZEjO8r)esq$Ji~33Uc14iw{eN5s$+rADp2jNAdG4_ZrZ?%P@0PlZVAIXH2M zLJv^Lh%}>qqe3GWHrS4HOFsZWRVp`DjjwpXoo`f*dtyBes2fe3r4gZb_1L^4R5Y?w zN=GDBTuQWjKaM;!a+;!PE-?X(%1!bJ)f#nJp@|NM@B3&;tZ!m}&)Dk3{^HnI6Rw82?NUZid{1J3 zFXHO}I^j|zIPcd|Ykuc}Z7_Umzbtm+%?9dZ;ot@i7ZN|%)*wU9cObZiCBr}mvW~J4%pFZXBRDMI$ zo;qzcl=~jjZVjCb7M^#9h?V$N?tjovmfw*o6>6C!1m=;!CCrmY20y*Tkb#NJTH#zt zzXsMa;m_u%9y1k@!d-nmN$?kLg%nK&Q1(`wKkLJGafS0E^`9)RpdyADtLb&<*;*3n z7fBA`v|w^vSz<>It~6sdZvxLBhpd|}EV2fi4_M>+c8-HS`zp)X1Brdbu@fbnrq1at zpb8h6dsW7$wS_TiCiZa<;5vSUr%%@TH6UpK`v94mZKh0Fmq@9(XaJ)_iqn(;M) zF_s!O{?#ZY)MiM|eXwM2T#FP3ER2?G*Jh=bGtPi>)i4cAF>PATzcka^0hh>+Sd;GT zDd*d%Vw7{1aewRnHWqr*k!&;Q&05R-%~~$dizSo$COU`>lYVcO?jo233)yO#&yUnZ zB9f0NoJv61`cQJ@-x7zQZ@HmiQT{Y7)$FKaZ`Il>WF5HYZ_uvNj$xC_@l#rsB~5lom>Ww|qLjCClBFA# zX%fO?2Ce()X^g9GgOQ~0?zksPOV{#Bma?B=1CDdYn0^*pS7LZ4+x^_uI|Ea;GdY(efQ0?nWCB#$)jON(7)wA6dyUyB{1dL;w1n*NjOUoz`WY$Xr0x{anA;I@M<7t41o zj`hj5sSz{WFrQ}d$(whG%v=d<$Weh|%SoZ{QR$sLrN*&NMt$dE!!+C*M9rT61zfRE ztN{buqt#Ycf3^p>eZ0n-gcO*{0Cyj*{*3%*xaD4FHCGOFvzL(Xm+2Cz9^sSfemz5~ zJNR4G3Y>S3!z4u8h9A=ZH1&U!`(s+q^{=zY5qm`>u^n5X)vP!Wlc^Un!_H$E`HxNz zJrU9>%TI=$;Pfv$T?8vYNqrFFaiv3B&F|5lI6(eUOcaG$Z#fz=Tdh&D40A>&mf`kL zQK`QSCwt3qyO!TVZ%oaPQK!y6+OT`~O`=S){2Sv#CHtIN7ev@{w0qa_9=Lq5%$Ljp zxX6T7umHZn$~3*Zds%jr+X+84EtHxT9yKlSJ2mKe^Tli7WyhiguVN8RSk1C~Yr~8N zk-d+O+T*+p$*lpxnu1umuEhs=xCb(HX2`|;v*y6ei)OG$#To5pnyU#u!@mJXQ^5GJ<Ar!$WT6Oa^2#dz?_;>5OEIT6Pne zFn1!WfZ#qU{@#>d@~*6k;8RoXZUI`x=VAXUI8%<0CtSJK^wLkw2HENV0~aIbd#GyU zAVtxNRhKxChjI79k4ubRisIYG1hB&foqLHuZm8ZJyTf-RpZ-34(%!&&l-=d?UhxGD z_U1_9?L#3lf5on6*yl`9EDZt_%_*IBnJ9kWP*J=dQiF~$1qh~t=fCM($x#>6wV_%q zR4vkZB3|DfPb4bqb=cv#L)q6cO?KnldMkD8ff9U?5FA5t2D*=o9nAE{d@ zbL^j@>|6&z$GWCm%*FvvOIAHxqchUOYRn1yUDom(1~ub}WFDbL!0 zQ}>%4Sm^|tzt1an;6G41S-Q+r4VtP96it95D%v8N?l#2+J${i-iA&&Wq3{`n&84^anFDQ}hDG%oJ&-PKDssNAxiOE-(oe z7aI~_J?MysA-VK1fmgbtcPe!Ivb+OH16f3UO*$*Z!a!!cm8lzM$S+bV-rvq z|68nHHbo3V{q4aM6N@uW5H45*cBZI6qZ*wcOLGV_pI&L}^su z3NSfhP6Q~v-idSkScovX8U_J>eSXeOc!y`7lD;;>ukat%!^T&ak*E~^FQJyQx5$a? z&OL>gu({_ZIexXOton+;+|3k5Lu*x8EY;!U&DpZ^UZkwGuuOneu1J^W=z(_L30Jb? zKPv=)GbSL12KV+KbTb$)4qZ~!YWUM+EV|J#XU4~Iygqg{7D}v?SK>*3Cz?9-7vXGv zHq^2)J>p+Ubo7o)&!uC7A9A^;2|b*V6P+|aW^b#mFN!-dOKIT5c$76%?}-278^+w` z&k$uBh0}0yPLbk5o#_lsCy3I2Gjs*VqLtW_#J2s?$Ya>Q{+uoRply;l{*!Al%?VvXWB^l6++S!axftJ?Fjxk`$(-E7%o9$YhGmZd@<+r~shL*Ohx`hWVv~plmBy;qJJfiv&@cUB)}gWh%o5hsIn|#*Ioc{6O1fk>q^XISrnq z@fxvX-wfB&w51KbVclATcg%v`xI}& z(eYOmy7PkKO(5993Mt5g47R?Q+Z#aG;jATR8Jyl^O05A8Iz54}q9Hj0K70yS(s0hw zp2N}?0)pEkiGu|kFXforZAI>L$zt zlr`m)r6jk0glez3LK;eM_32W0NM2BzJ7Ewe$5`q*T+aJ?M3U8DV#Sl73sI_7evz;> zZiO5j(Ns+>UXGI^Z9B>Kalkk_UZGgD`tvy#MzHkBs{pHGF)xYgxHj6`V&C^| z=&4Th^c+b^>L4XUE}^G@MUsc)8?gK`%|2TC>!6BcOO-UH;} z&l!g>JARVB9hu<^CYEd-3~>CUR55}}&u_Pk;OxmJ_;cH~9^vWh*c-Yq8(zGJ#kWA47lmR!K~D~BOv!2#&vP9HJIX~NB4&Kn$<*T?Mtmw;Vj z`8Saw;R1ddMw?r@2Gs#t{UWMmuwd;Oe6Oa>%V`t)Jr)RKp2^T#HzqLnOW?~+ni?6T zMw*5hKqeQtL;2z9XUnlpn!y%9M9#Tek(?nQb&uM-$}L5Kj7rc49I>3RjRB^NQehBj zNCcLX!2$jJdEDTDdj+kB){LJ9zkp%PzslH-or~|nIL=!LFz;;*Z}T|v;?NXH9AOhV zfQ|hsaoci9Fi>Aq><|9q?0m?ubL3QZ;=1Hj)BLQwx79k+UIDgL&ubQPl0v~^$vL#8 zFv7&DFlS}HLD0F`FI2VM7*c4M5EN_SuYpTq5sam-WRDRj!*&6p-5qiIe`3v!yw+hu#!guI4y{E&FOP`Bnr zo91pXswk$_cIPg%+r*w=owcOHJ%%;n&6gQ+ℑ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

      UY)!+;M-=D(&IdNcOu|1&o(fhy6wG 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

      XO6Hoozd=MjP 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�c0B$u~BD9kgI{4G^_n<~gH2~hJDE3>*!<3ZSp z<+hZiVOI)VhQe1MHki)SYqMMg#vVe2>Zb<4ki2jNb%@a0CGJSin#I++}v6%HZ5Yqt5e8yQLl5tUH>h zfc08gMKWa_bp@N&-08A!!y%mL@EXHt#^R5=m>BUeN5)UYv3bgv=exVm0Gk*iMtup4 zUm9xvbK9+=r^1Xe{k>0mXwu-RgII^ZJLBwnXtuSlXiw6+xJ1|9(D(f@<(#tu9=&c;lsWF)jFr=c?7nE@|2(Qo6C->>UePW{AR=!X(hS&QP}{p>ju1bU2r)4LGd z_NrkgcLv|2OIiw+o?ZM8CAZN}!P4V$VPx+Z01_7sfUIN%6QbFt?2Js{Y#g7xkox)k z!0eZ)f8ahCEg$N*_@|piPmO=tFSeHg&6wk^7=4s2BAUNG{XCOZCF1Q*OD7KNkR>y> z-YjEk4q>OM0mC}X#F^96xQC&rjP=^j!sz_1uo&6Rxl4p<2>r|LMu6YMpAsUGgz97*{+z*S@{k{sC3j@@!gPrYr%pfGEt_bXni0plsv`Y`-SMh?yg zJ3jkkTAV<9U8bz%ce2;n`AZHDOB@`FK(Dc_j_!mVFIe@FmdUUP4T|&Osr?GIkG)MR zCIKAV+{Uup`4ir+g#zt`D!;{>uKyr@i2?lO#)3UAl0Kt&3|fgDk*)A!l|~QU#2}~h zH`ZSz{mCFV%Q|d8%3bBR=lavbdFt;O^zl{x#NzT3ReoFEekn4|`Jjg@17?aW49C$0 zViNb;d>2tDIPqRka3{g0dekGsr2fe z2_@gjR~RBm!L6RPA_s$-crIUq9hR?PWRH1ZUu6Qoz`Ie&R z3cg6@o*#N69{T=W}qW{Ey@FNX8s=O8<;KxS7)r-)QVsN^;&|g!zU($ds-BPJxjR(7Mmf3+rhNXJ^$! z(q~nX%dJ^Q?binGv}N9ivucUIV9N&1WUk=yC!L1KLEFaVpDmgK>J0*0nSaiqAPZT7 zK+OR1W&ZJ2ws2grIWm7<)q6C2WwrjdnOFB=DDh_rj>+X_7*zfeuXI^xhNbbtfRyYO zWU%KB=PwtWq2Af(4$qAI-WLq-DM+bkcuzNC0jXP!!Iu_XYJ%Llq&YK)sV+W$IOzzM z0@r2yU52g2dx_}PmniTl@cFxzziUJHdmCmdZNZ}0LeHEM@V;G1V6fDCBmnN9Ae8}& zxX9aW8O?9zWwu*H&n)kJawWVd0#Xt!Q2xByAa%i6rLaAvEr_H}tqpw>tJ2n^siA?Gr`5(TCQpGi6dt-TpRR!Y-*4Vlu~8pT-Z#fe|7e`{P&r%?65pGmGw5f2;X#bU)N+UvYQQdTO3YP54>NJc-9ZC?Ka;P~7#8^Fb(mRc;Ngl4AaRD&I+>9PC?vFEem=CK)vsIP zXsFeZ_?C}JyMoU;NwA;sq+hjbtm&ji?xhdIx^h@eD5-SAGR|{q_)oUV1VU^d80S$~ z!Lzc54`3K|^P^|Lyq6?ZN&lRg-df88`G;Z+GS&y_4~lK}sO7Tf{RJ%F1Yp?^@_aM7hh?rmcJnUU)$^Czweg|! z3}(z&HSNlr6!x0hNo^pVx-lqb$W{(F)Na2J8@}ytq6S5!ws;wLx0gaMTC^A2Jz2V; z3J|v1Fcr!oU!J={6;8DGQ(zn12bDd7p46ho!gVCH2AHA5$GJZEs6iR zA%b1!)Sp>0TLVS-yvwR#y)5_Aq*rf60zt0w>RyjkWtY)nLH?S)KpU4=cM@J@yYAdr z7y&7-`zw#o5Lfu+4MbbW0i`T9Mj&9vy(QWyWq4l4&MSc3qjs3lgZ%ZI#+Q^NmPhC4 zbc48(x3?QP!cmz*-P$bJ2q1di2zRLl@k^Uij~FmD;H3lOe0(uuAG5&=#+mv7d*-og zH62We8gx?WHar|b6;*EXby}I^N8mDfm4aRw#T>O-1W;Q|^O1(W8H^EtwrXKp4MB{F z1^^EevN()XowJ?RJmErV%_i%H66FkA%5_CJzOc$0`nm6KSk$ddGtWvk`344xKr~rK zx#m93+uLr;SWoIb!_Cgm%QUhMMyP*UWdYOgW&xD#7|i2>cOhwo-bYf)B14x7l7wJJ zze~4=ggf8cJP>63)Ru(erQRI2j%0G=ShCgOOaDeBqe5%VXbp+a(Ij%p#<11%L_^vD zNlN;Dj&9kh*fK0}haY}8mmsTvKdDb-M4t8F>|Jr%roXQ?Ws@|8lDyiFZ1^@OtUb-uf~_w35>?)_hgE!VZ*za(t zVf@pw*wawa2?w7E47&Z@X%U__&&Hm5#jQYUsrT%gGNw1EIMb z0&om0G-I57b#6c~pn3;$6k>7pnh+dx4h-AE?VgwhgusO8_amvNnp00Vr%3+S&ew1- zE(w`-zQU}gNZJY|-VyPqV->Re3(GfKCoF$2_Iz{d11{1NqQ9=IxrRRNuljhAyUf_% zC|gdZenMlA@FqQY$19Jc8Sr10)^T16Il2CU`f02jF$bBp3P*ZmM<8TFDo{!p3XW#j z=|hy%t-z^MSnyJWRoLy2+p?^RuzN`?K$+hb1Y1J>o~T4ae`N^`($L^QwM1w2j8tby z9m@$kBqY1R2q(4}z~O>e5ggV+CB<;~^zSr5c=PjKI{2PWh^@TOmH}=mgWL0}L_fv~ zsW)3q)6aJd&O?gZKf71^*IE0ox%Tb5T>Ep>h-*J)?PFe)j9H=1+x3!VI?>()H`D>q z;r{VQYXXW5(SD{;99$%yXx%T37R~nwHB_|jTNcKn&vOuM4Mx)Sk!E_5_F-fYS=2KV zE&49F6*At|ifC>Ijk?!DiG7)EB;9}n&X#TY!pU0YnL$=7$(2>+CmGJ-MN;lk(WLRl zQ7<@&1`824&n7L-4@PiOcaP#EgU>2fD!-n>-ny<(Qn@9wCUNFUeg+w3ujW6(a4&-jlw;%st`h8;BG zZ632c!YIkj4m8b8wn}iYOK7)Ng;bm8T*HIq^D!)c&rri)i}ffM%>uB2^JEral&Ki` z*hl+NZUeY!EN~_5`agaSfmjY!j-V#?GLV@FI3W8Qt%#;%n`ins4y|I`*O)QmA=hm{ z5rDI_j5EIVXI9HU2x%qTsdd9q$8C`GXMI}>sZo4AW*m2;@G%E-mh>wOWoHfL#b+7H zt@P?YrC-jw11X`)U;Juo$=qESxqsyvVV<%a!-1D+e&BxH1{6{kOQ0exwR2BR2DSWY zwC1JVjk2!zG!;)&CnxX=lJe7^@i2gqy9&|}{IT|30Qc-l14o;i?alVSdr^1xIx7ZQ z#21%Y{zmMQ=-o2dk?j?)mcNTCt}_3YwT44N;zDNj?V3?*M3W#zm=l#UPMCEd%L%Y( zC`c|ZQC*x_TXG4h!02RSJ>&;7GE;&zhPZ{%`E?^Ve1UiNu_ zwl>b$A;&woM-Lzv6(t35KFBU`Ea=651spacn4*5;9NHPnALk@&w zw}7_EpPJKGT>78Xvm8p7sTg(V&6*_8D_OU&BDSNX=b1Oc!ye-b=@S3aXI6EigC;Jg z#7mFTA?K~Ee;HdcXCuCDjo}5~PYz8%1m)eU)rn?=4A#p3<;mQk*+EzSwcxf}6a>xn zOo)SoSSXC+2znqiAJ8vLf+R{^zhm&TXXP%u&Pr zS?=}eFIjC~QiIp~+v_@i&=iLCDG!N`=q`wiRdY|{A->_%sTFgVVLhwYe?mvh_fB2r zrH*PK2|#A>@5gie2A2dZqQt*=rNf6>O}f@tYibnxk9L<0d`oVl3)kb%Su(1X>a5e` zNs-LGbM!ObfwVDdqQAxXH@X+cwV{|04ZJGpz|p&fX|PbTPB+`V53$T^ToXh|Ai6OVu6FFa%=f1o&(QYe0nN)}YT#=X-Y z-YGRS?^K0mBq;Np{_su%;GL@QZnk@;Kcb3u{x(tkp8a)Kv{KmyO%p3AR<)V@MPj>H z48Yg#MD>&Wp{D-urVTW_n9`-L)cz3uK*>T^AsT^?wo)rfS%<3?yqZMmBueMFQoUqE zH}fZg-+PY!^6f+fpu65R@H>#e_Rt{=+RBIdUO*^qXjbq zn-uup#5c3}Muvx0m3U3eV5VA0&8kk=Uk4J^m`H_@Xig*9@P^aua9TZ(jt-=s+V**7 zkEdFMWu%se(o7|dq=BAmiK!?9cRTI_ckwsw2;(SVPR`V^64eN0*~A1+Bl*`;F}n_t6cY*j$WQa!wJ2{d$wwiL zDbH3)M9xh1{4+ifeV`pU8F@A3{_aa@=Pi@)EIvZ@4(VBMEx|?pKbBDM9e%m~ELtVC z#_^2Uu=HrLi_|gh+UHJ_lt;5CP{Cak>&C+!ndRB*cpKzP<9T4$lR5TNnf)#ED~x<# zwmom}_7s;?X9wxNEZ;?JaKU!|!0G>NzKbQllQ1nw@ayNhIQ3@drcxBrKb!Aj0H&e9 zkrKJZ94W6|*bdbGwfQbOZ(@Y;|9rlScCoGWb~s2TR()Z%`Wbje5eK&QXR*VZm(RrYT`G9efyqDpSo^44O6K}G|GgP_DmpY~ zUHwYkywTu#S7;`i=r9qK&WkRr0(E2n$ZqvJ9hfZf7c7M4ipoE_(aLk@B{__=^UO8u zNlIsUDQ)&X8xi~We0(7&*4KH-RK7xG_9E19w@@$6p*j1tM7dR3vC$v4~YL z_Gj3S*7Bu1``hqk*FCxK?&|T~{XM^1&%E;Ay|RJ@ zIF*)&!D?{lf6pz<2T0&?n`Xl7w+qqvk<1z8Yr~;V2G;3UNqvi+PL$X_)d;cEH6V9K zVIhcbh@c0KTDQW}Q|Z?1`!tam%n=6E+f}(WIMTn0oxz~4seO;SU61DQi|Q}zl#A|N z7M*Ep<+2}_Tk;gm!(s=@vr*<{-w~@S9JP46){Fji=VN8W!6GA{q&pug^F3I%Z8jnU3lxES=iLjfPIF2;whRL);we5q@O+URi}S@DLRIm#O({|qXy@tsc* z@16n`4!(73ww5KMMWkR>tVX?Z^2Ls7&9$;z)CFZ6Kvd9n5bcn!myhqW&_30RU6hZA zs8UDL%0gR@Hd@=S0L)EkEtGhk4s!JN5Whul46u@)J%eY@2%x+x6K{a-xXi-Q!}6|K z#>bX*B^55j0sJL-__WD39muRD@qY@}JyL zgkR@UH+vRjSme)e`^Cr{ox1g0SD9bWP+~jY6|ZTwpH)t1uF4m)1CROmQNzphW9_`s zsJY4H-r4q>!^~DFUX~fW2dv#KVuR@RLbnjPkeJxd3X5m&kMH&V$o#@Jc zW&TZY2DhMgpe~okAB|4c^-mYZF#fJbY#o+&{Yigw_DUB6o6GN0Hh8O~OX-rcHXJ;j zGnj0k#6romfK>nktMJmYSe-Y?Wy*P4+ZIj`mnp~Ze#+^oI9%(u{TrKqAxX}@<%f;q znPxD0_`3wZR`_@}bHU>&hk7i2xhhp(Oyu!xWMzq@-rK@Pl-c$Ph0ay?-# zRe~HO)MqsmlW}t;f1pIR0utm*CP9v(xlX3Y#rmAq707jq{5!bq3)DPx55@Z6-vm85 zeT^ZUIIedsj;nFWrLvu2VW109CTt1cm)jF?foZS&&b5-4ClgJ&N87;9yZvX){C*Z7 zI}uv!iiNtOMhEc)$osEF&+yXy(k(kBm&aDOw^f!z-PV-9V#m@Nom#*Wdp@ey^Qd0W zoS%YCr~@q%;c&0Tt~K$(q`2|8ab&(Ka^o0&WX}Y@^ZSPd4!GNjeug23g*@!d8GWSm z`7{>QB2{E7*;#4FzjrQr+6}Xd!l_E%&4YN%wFcr9yB9#5kEgnb53^}&g?&WHb0+>0 zZIGZ>wX1NX0sgTn*@com(&;GTtU&KBpU!br=v7$R7JEZq@H#*5=W&EEUXS1%gnyGV z$4l=tzuodDY;~g2=Io@jIgPI5&nH;goWm_`&JMix(l~SvEhNi{`$3|djY5fdK2eVH zpV)aHj~-(;Wd99(b8=ijL5vIhVQolLza=mcGrz(xH^<;vHp-^-QFdk@WykbU*4Rgx z+^h~;#DiQP+xJmc)<@X~hV~ktu*yQ~3h=hH@fkDmNdPE&a`VCl_YJ`4NiN874$tc= zU(TT65SE-&7OIV2Rd(A=EGY#`^>xpDIe%^XKg*ZHfuHua8a&Wrz$T)Vxxi{!?A^i= zW?yB85nU`dr&~}xikI0{eLp*w3WfPE=yhJB2*Jp6Qn*#I(LkrMj{;eL}xkf-C~fR92_ zSs+_dJF!zZGXxq0=YzWb#<+D7Xo*%HA>s?q2O$#{&Iet!9MR_g@O)5*Qzq<)&iL%1 zw21$*AfHM;8`Q6WMAOIRGHb53Uo9ods`+&jPkw{Nsmck24FG73-=O}T$-s@l7IN-0 zj3a-ZA&=Dlm3VmBP}^|TwK+%$Nh5H3O2K7GA_$*^raxB2d;iL}0IV!Ei~JY4Psu8! z##eIYKT~${8SU&O5d@i>kS(K)T!a-cyui0-ohbLJL6yzem- z?o?u2(39=A(mRw=(cz{4%X`gUq7st>H2(6gW$Gw1c)~>z9!$rJ-d`+>cHQ19KhxKX z|1WjYTp|8{BhzGrI;tdK`lr7s674ho|I@PstHDP_TUoR|;{UJQB>tb8{@BD7ob<#9H11 z6p(q7DF1tZEyR?s(3olU<*X<;|Kvxm*hTv%j|F}GnSX%g36bG{h(Y8XRDcBm>V9#6 z`cJ43LBuL|Rh-!RA4ti8Ir78HZEWcs+}Ida&=$S!Ne?#I?2*S zUd4=peZ`qy`3E5Y-pNhl%x@dANu0R=Bf)&ulTI)v&|F2%+&JK+85U`tpJaANh9%K% zSDT@Keu}y3gRWP4;d}dI=7{eZZ>|mPtK-cZKTqU0#A}(d=#eFnap->3e@B-^`cOXJ zyqph3gv`8my!jv0&VOmVdDm|N4Q%26{dn`*(7!m|d=f;jSd?qFMr`OEZ$66c>PzCy z2^RbRalHAu!@exuyzPm;3FBjKUWW+xeZ@&FsrMYh!Z$1oZsnFX0?0ECC zP|tYtKmFxj6>t9TRxaNBURwOW9&i3=RSyLC?~XSQdD0iYAm04SC0`hCegUr@lb^!R zybQ``>ep?Pk2k;b)J@~f$A;_>v3H@{8| zV#*@EzOQ)m$<`lXt`_h3Ul(uw>}@%VV~=?A_m=f2P6F@$hIsQa(-GtTr^K6Ii^iLe zH@~4t@#X~qt|;DoHxrd5aQS=qR_v694x3!+29 zsm3Zw3Wt>bHGfqbrt?Z$5Jat13)Fsb$$601YWvHf{blz=s{zeTwa zr7KHIDDk4kw8>qYW)CETSEV=Nx^`-WlE-PVIiTFBbGqq^oOPhZEYlpS$(gFrUt`1z z*DoB1370_TIqD)k8jbcY_nTl~3$RRa9dF&@=*Yki9OiyGORcfmOJy4^?zbuRc{sip zxD1J;536lF#=`C!k0xj8xDz6E2Uf?(Ek3z&lksOicn`m$f8veM}PPq{(8h)GCs(4cNB+!2iLAauO;CLC#(Wb^IWy%r7p8S*expj z$Q$~^s+Ur|{UXvhB!*z1&%^C0b(B$VI!!(GT#*Hn3^1j0ZE-TziOTtP)80zP zdY3JNj`bbOwe&-%PeP$kvW_nrSuG3owb zUQ=(9>baDyR>V5&=FEcoPc*Y&xy1o20_R;;)tL`V#0th0RPA3}^~8MD@j=yzvPuP2 zUp}L#)uH*S2Uyin6>>+062D|j@wS~fS(oA$i&Y>EXhlAqq7rCGxvls8=v|&ak!z4 z@yQn-N_?W&nBHt4yF<3vUt`|2PAUd0M|?EhxDx?Jp~Qta2#pcRt0()z8N8i)FUZe< zmU(kp`BT4PA9C~UwZ9TBx2t1i{t^0ZTZkYeS?g$g&SzDb$<9k{SM9HRk`*JPOlqM& z;$qpRx2tZ(00}~5u}+s9+g{=V2!##w3A`_=QB>9v%LvS{=vv8wo%1=8y4iS;%tQ~{ zFRgBwe~(#_!3*Px$^G#k_&fau_OS=QWM0Gm`CvPZvAz&ifuvs@#s0uys%cyTlf4=L zR#=J2kMk15?ww2TjqMj|(>aZw;kqNsBdLMaq2ya2wPjmBKpfx8b51V;GH9~4m9&zB zU>xJ-Mkx^xmeVhRV zaL3OIS#*-JfHGJ}`$aV+v3IkpbmEe`DU^;Iwh}}vw8)+Tuou~wFtg`gz~#?jsW>;D zXX}m&HKq5Mk0-Oaj>A#GwXkY}6e$=`Wxp4n7gu*3v5cfu5@efF?>MwI)-Upg&uD}S z8>l6pU%CB%S##aT$DeG&irr@^LZsc097K{aTj8$E!?`u)$%x|uP)jZ{i|-XbXorPz zN>3P(qlL^YLxe&~^W5oBS*zW_7~?gTuXLo-7g$nb$$xC308jexGn|m*YXlL-f(TE0Ll-;${R^Q>x6)V)51ylPZ#?Kw zb9p>ip=L5l!#4Og*R+!O**{8iCI^${u*e+r-VLo(XYeiu(~w`d989Y}-M4V11~J|9 zSqGQravHw~26_c#zr*ac0y=|F3u)*d^ zT-B&r9ckHRJ^vHjpsF-U6wm+*WdttWQf@QN32go@Q&hE>N6w0A^K*M=C^ZjE!Uin9+>?Ac>9058os$oQG$IV<5Znb1sN;4>YbeF_)&EK91gypJ&`Kns@Kw# z!Njp;MVI+WHP2GAIDi~L9NCCX>I z8PWtHo4pg4t_Yk>c57F3APx^DE^PqHN~t%= z&QvC!GtmZT>BnB`Yo*jX4`xG(vYY>A`iaXT{K;tPC%c;oPZ3+VX<;WCb{GY>CcHOC z$^Add(9`*kevuT6f&4q;0DzNY7dKQQNHtVxl#3f`w6D2#4+3P)E*LW_k-Y9C_19!L zADby#Wt^028V+T1AWR|0GZ8`~F zm^o-;b30f)XsVBd803CryeV>&<+Cm-YvWYgycAkvi63h;?<)0?&-{2`z6R+dWgDS} zjlvpI8@kWMh4xq*!&RfUM;kNqHLMMz#^J68DInFx`S}_lecq7&oGv}f9(h{6h60F) zf8(sAs(MycZTv7_gIExkfpVN`w742%plr+6$hXm|8sqY9Ovu;Bw=q#QTJvqp%GJPm zIH@R$B|Bjtal0&*lOz)5Wp)@+uV-`97QG+W>%B$w6}|U*y>ICCJiOO)ZLjB=Ue8rM zp2_u_8c&#vq_`)Z?e17hhni3G$d6$WG(2`M^s-E z7y*20$fFt0?UR|ZVQ=L8q0xESXBy=LZm@b)?C#1osOM%{N2tkq^C-~2P-N&Q9(iwc zb5Gq%p~Rj-$Yh6YFl3lqW*H`Rxt%N6~(OkDNdOE=wbg*r1S%FlWV~t?b7C<8xPMk?Z@3tTz456`ne(rKv?dt zzZ)LH)={nuk&7)cLYVEXR@o8g1LDj628L^Khi7YpiGnzp!FMA<$eDln2`-Q01|ebQ zpxdvaxFAD3n{+b79UtzipudF1X7H^AzA%D3yoYx`V~GiJ@NeM#?M3fB-p?$0ZqfSW zp6gyBe^hYEb-pZDFE+Ih7Rh(>W1JrdLLD1|{)r}rQ+!hD6^?A|bQd9S;C}vG%~lj>9ef-R*NZC~9>i)U>{9h|%p~NTG~>vg`S8wa=@h zoUzYS*cXTJSsm4cdzC~7`)i{T)PAXwt_N~*)4cNwg}<9Hd)V?5!|VU<^&73zRF)o{ zrG(!`IIzS}7{@C0b-_+vrjdbI^CvQrCyPG`#-UWFOD@d~z)L@-QE_wDL>q_Aq3c2a zU>ksY`gh5HC^ch;M`R>9rQF!?PuxvbKVe2Mb0^dCmeBoUYg@W6sOi1{jR0jheMF@T z=|1_gZwLdu0{-RWUpS+pM9OHyXOu@qoKX?o1ElclFDvJR(dAVRZ{3u+Mmmqb;YYL{ z{Nt9nLn5iSB18XSN!vD*S&I1mnGqX=4-I{68o@(=*M4H~sP}rDZ~FTO7JniBgo-UYBt~HA8)uWN+~Wy2p@X zNco``2u{lzPAT(XxN{X#SgEhHH|mnzZIt-#u(=A`IJMkM?@aK9q`jL<-)}D6 zh>XnxVtB8y2XG@Nm+UQdZ-0FSOa0n~yQ0o1kk6zwm0Cm56bfBrC#aM(2URZAnC{9voi$sMCUU46*@Nu=$wyt4etZO(geZEiZ<2 zs!PDeR9w0geZL`e$vb{wewbNiFndZVnSj{wh1G3ymQO{+lETeco6V3V~$BDt{sZnX)fdiC@)(OD&l#q({7S zBr~xp`;>`yj^0IcnmgBvgpz;Zg`JKo@RJ-qFcHXdyMd5t`GwkRr$nleHK#sRf ziU9xe^eTK9Cq!Uw;-Yn*hZ2WsaZ?|7sppNoeL{lKGU+1g-w4g_P|uNFZQ5;slKM$;qAD z-$RL+;DMh$Tk?dJcKuQEgtuM>4>pZ*B@#6}S{2ER+{}L_39d>WTH&v=pX6Kb_Pgxo zdjG9&3BeSk3IdT{P$n`UqLhylf5-Y7G?KCCJBc>jN}+CX z5omwOV zF$Pj?$fb+?_Jjax>CSGkp8#}?f1UkY?_arF5kLnyfC9`NZ`3}eqXW_#Sr0W%8rmOZ z_8~v3Yfc3d#wz~u`63j4Vp zh#R^1)7`UwVO5`i*^DV5nPtDL?(_Ru4|;~*z}Q945-&mtyNE))!{-p2`jd44;yqWC z$F3DgPeMbX+V?4FPEX|ly4;qBaQYN19_ob4_kfq$}4Ew!dOeNKgGCVu_DX?1x;?bvcYbLHIX>VJz@YU7;d z)Vp23*D# z_B-L!nrtP_m|itH*ALPqtjE7jwE!AZ?I53aYEf4C@5AYz<{Db>Ul26JhW&nazR(3@ zxf?D0`Qw7uTX?B`sdEY^gIZ<=Nv^qo?efm%n?gFQ7ez%sTjydO5K?c9izf9jrGA zs2;8oztwinfz{M%8`hzWu7#%5#_3G562nvKi6Zux<9C@;z*3=V-MGr=@uH76?$$yu z&(zDLj6qSF1f?y|Oe5+27^o(|$g@8eLgeJhw(HdiDiMlfU-Gzn`-;0Q>}cCOjg?1P5o?E8Sd?&Z+c9r2e?`MOz+#?Vzuvfmfz^1MXj z$X%+I`iQ}{b7ME+!P_z@EO=#K`dQ=8dzHUj9f_l*Rq7l?FD<4h{$6{K-flsmMfU$p z*}wmS5W2zO=>qb1qC1Hjp|v&C6rNiu+UH98E{P3kZ>uVaZJi4gYOM<3KwaBM`CDk- z>|f+M^5I#XGI17@Dgzs;d12FyV2zDGYfAHGKp57VP-^8USA z&FR%B0WJSLoaNA?4Nb;n}y@ha)qstRCsSGxe9LDZDp)LQzZ2;szXx zDGxtJLxajB;-<>Zrk1}#LbHg{R1s${>ubJasT|C=iJxCF-|ejmt@@{+!x!dTL+AcT z>{bl>?VD}b-~V1PUnZ591sch6!Hi37{+clpdi)*gGB-0N1QTfwR2U0BE;m}1^fdYOiA4(7vwYq1%v)F&wkzC7l)^%fmkIqqwpR`=5 zPspdw2)ozHZ`$>wp8Y#JS9NzK^89ZT`ari@LUa~u%}|x2Md^~ZC>qaz?$+`GNgef= zyhC2wGqM}=x3{- zpRFTl{D&QuEF+*#cMfw^o?az$9Kr_Gcw9J@yJ*R{F7aiD+^7tZXIF>F4^fHw=s#`i zb8;=aaZR)A#)R1K?ZxXeH_w1~oaOd&2t_$6R)vzXW9m?~!r9-^H)a$;#T?EO=;ZY8 ze=RFMAuzcwGJNr91OJiHWj1fMFHUD2i#2)U*IGySRcw3pYu$83NdS?55q)=Vuv#q} zlFO(4RrhG#05*0lFTgw9vLSO=H_(Qz@o|`neU3=6V7u0N4 z&BJ+EQ0S`b^I3_bsPBv1u_S&6<#- zNUDozy`KGuoA!Sr?I~1I$sH(5`HDN|DjNTD6{C}3saMLzb#4_6;U(04`-_fVJZhL*J=$3p(e{kOtw~=}+D^rWU zBP5ln<-3dRV%4R$&d7B&0Z4KGdiHWnC0@Vv9N-vAzCqJPBsz_|pg#A1kIv@u0a4Na zHvxQ?qDrC5m(qqRCaIX6$3qbruLu@=oNysvQLKqeBZ5!bM&@^25kTN-g8&PhwNyCq z`nEp$>kj%Gto}ai)t~0yV|1lK?N#VsS%PniM(3`Yjn{8$ogCZavy+3*?$KvQ@}P+@ ziCz;i(M!6bo5;7^M4}TF09BFIT@XdUxGmTZ3q@j>OBj>DH%2|p8E&^R7Nu`}NT z^*;HH>a`Wsn|71xNWbj5wlI&bM>P;|yyrj;*FdV=Kn4T@8Ki+!q1r6Mh& z(4s{&6&|~ijOHvG&5+{J{8pnGsL@AV@1I8uDAE6aYtABGzIT*F{HC^P2tVQu)a#JB=czz(UVZl_^_(O7omS1s@Q9vSZIvy zeSf@0_5cqBxOc56%rBc(Uyhw978{mQJZhJf%9u^jhLRNq8ne+9{Oi(=>z$ToHo7^n z(4R%@xW%xD%Az;>vf`{s_cbM>`xG?IUzuF-6cuz=8 zdrX}9=M16?)*`&k%G0BMSkuA?@~p-Q@%FX|OoG2gQsYK4Kjpy04dldlY7=Q;Fh#3p z^N%l_ShS}w!~-_OTvAv;WctF=_zqVdw5aaJ$f9o=w;g-s96etJt6J=q7eATX{te?5O5Vnn`}# zv7H0`QWn+3Xu-7bGWt#daOjvX;al*BqqlZFos+xs!yNX7!@QM26%R9ZVSb3SE_FkE zpvMruK!2TMc(KlZ;8!f_FL{{IlfNnyTm1EEybSn$CFeP9ht!o-68m?6i`3$SL5e=Nh%a32cNF7?tYa(Hq%s-DA>ybZd?eymG|#U##9 zJzX&@`?2xE<$dGJWW$%w{qO37pW2MAx)@A=FXAVMJU5kPU(-Q=gs~Njh-WV+K3*yQ zWc5Z+<=||7(kuUoDFg)xln`3r}_m9aAl zcIy%+(P8&8RS-UBb}!d}@K>ALq=3`i7iWdwSq=V09D7xtRhIR8T3AtxX3Y0<_ytGG z^CRqPJ?vdK=5UG^o7%h9`FEk!eWAU}S+Umnmr}{BSXy5u9$rF@F2KZC$~PTLyCA63 zGFY<*?bL=<7%c$>j2%m2`L++$k)#$&_6B{87C3yI!COOgZh97sxL zvJB^raJ#Xp<$fIkBJS3TaOMXbsc>f;7L%z>UL3nQC$XN%n{N(H3**~Q{Vq(53Az!R zF0#+zkK)+hxmD;MJ~!qfY&M6+ysfBHBFnf^*h0siV3Wa;wrkEj=M8Ta$^674oCBD${)pO=G@$IWjcsP1ljFY12ad;H&nF zN2He0>Ol^zkS%wTNzHTtiN~&k!>Of?PMf6=oZyP)h@0xnavTj+H! z1pw^{%&aUXhW|7lmJ5<2WRdh#Y=`Ii7z7Eo$9DL<{BeT?nJWJTc1%I0D%p`*65EB? z_+j1Q=}4m8(?XXY%pV>MJh7(Kn$9)5X7_Z=$*r#;oHybK#wmtpvkG&|D?Mk&Qjx(r z$uwSnO-B1!sxwxVZrGq(Q;ysK&@R8p5I9E2{}S|VrnUQ4?a?4S>`zS;0lN8I2|oS&)>ND)_8(qiia$= zO%&t>962xj9FiRX2&4y({CpKE!{pljq2$obD1yE2KWyD&@>uw-H!bR(d*&IGjwm}Y zC5|_#a!EtwsptN5g2r1hp)qwV--Y>3DW|>6C`Lr=oT&Q-HO49+Dq=&FVh~AJ5ii@E z`mAdZ>)DK6iVfj!(W9LoM>h^ngNRnJnlEZK2TGFq1^bw2Cp>h;gIY79kEVRnLPVzt zq&!Z&zbOUS+wN{oy{$GO;J?N0f)d5NDEtB`LTbd-YQ4-oZGgsq?g$-==CU-Ru}Wh)cO7dPx;$dpUju%tw& zSd3c9Tco#U&MJ3udc3~kvKayktO8LF^e0Ay%N>!dg7mc&vZZS_w1tI*YF!0p?R0JgVEgi!73ZgR7vwW$s;%Wivj8Uy8YQoR07fMAWN7L7cK zT%*a)3c9;Xjks<)s38(PQZ^P62Xn+kJp8!zOBZzjAhiJqba-4=s7lxF;Aw{cQVD>NP*6o^2y zv!Z*Mh6b9di*3ro*&T)8D*kY0lMGlH3Pk{6$4H)WUlgVxb%y#APk zpqjp+x`SH4=KL8Bs^1Nk=2+}EUaE3k!anOCJ(6#(xJ2I+7XFWG+`?}|xt8-=`X(J5 z?pMT6g@4HL&up4NBB%f67Aks^|GgRbxNk6e3#SL*(<7;fP3#wLVlJu3aqiME1y|;3 zRhpYZ^ycV{1IJ^_v!59ay8V_Mu3EJ8w%JjXPMGa)HGNfg_H9Vq@fpLFSe>J+zg+0R zaCb1JBQVhzWkpi8+551PO$hEIQ$GXE4(rcrXY3s`=KA{*dfs|Q-}HQZ&}&`L>&uu- zis^azAA8gD-H#bP-ySo1-e8Lf?)^*X`PJ2KSx3;Smi2H(!|MOiVT_UD?G9=F5Y*f{ zsJWYJ_DRn#zLTftSEm~mC5-C9yw9dNkUtzW@>gsdUrx{0ss+BBAAC6@`0{u59eQcy>RLyO{tX#-uDx|q4;9@!;Y#5?r0N-(%7$0 zmN-vjNs&aq-hUWoibTJ2Gf^NzUk=x0r|eNI&v#B8VB+?L99z@+u~s#H4ZEKgXZ?8Q zzaGkHRVeA=$RBpHP>lK{x$sxN#)*t5I|l@fZP|ir2(wsT1|7QOC!mrd44iUw$DU6Z=le<=s zWFwios@DqOG~1!S$ot3?Ws^>CrR;q#Gt2eHFgEadh*iDHZiN;J>(U&K*_jVNy6L|@%qoF&JYj%8}EDA^Ij5QWdDUVXa8*b z?Xd3b5`HMkYaE7>Vaw%&9D*n&$Kg0#VkqrukV;F>3racm2Fk3mQE7h=#0;R3e!y(s z2luIx!V{_932{>5rPt=g$h193mk52v1#PH>H^m8nI7Dv{C5C(GsR+SI`2=?>)8TC5uQU5TdCzD3RQ#;`K(y21d3EoGk~iC0 zG_)ekU;7;Jtn))jF@r+9ZE^ir8*Q{&CB^%HK_&FHppxw5Ur>p27D1(#H?7po=u(Ti zLIwSwY!SrL;=h1Lj6>DqItj$yV?El>l!eHr;>29LorW3bJ2Vgv^Cf0xPsLE0^SG{A#j&9R(bM}bfeh6}TrIut5%=g70r?g0g4<%%Ya%%hn>v4*w*7J@<*%df;+Tg#vdL;z0 zum*@1wwLU=`|1wTb}E4#`N6)t!zP2hb(`LU6~5*NyVn;CHgS}QEnffoi;SOK&Nn@1 zQOhS1>`fO1Dp=f3Fkq*rC`)yxKu}C~HCt1s&iye|dhGlE{E?hTWpT64bcJ&iO8xh5# z))57qQld8CtX;jX3G`=sm411F-@PnY&yieA$9Hn@=NUpN4QgGOd7u>9CYKkr?jl-< zyov{M*t7_7AD&FfBY(^*jf;w;H0sg(yF7RIMl}Cxk#?OXF&&)Q;}+th<2B17?dvzC z)G2>eP+kQ;_?CjFh6~COxzQPb7OTSrU;mbZk#NDszop=Z#(A1o7~@~RrJ&4EHvv&_ z`nMFkK3q`#kc|V=dO@zW_$FIxJv>)v@TLo~)#L-P{f32XV(jeNe7fdCwj7wqu~O2< zRgt%G5!ZfZUq*$9e@G)D!{EG}gTNH@F!*l6)IYL7R3v_}8XOCpwFQdvpnH30V~Nfkn}Bo-B&D zq+-x$8dXk>?Gvc6CcbhoE?a(@XyV%!Pu62!+?AVOV`)}&nSM7AMq^7rI9JK19;T|- z%*kuB6QsqS|0PuUGx3{Ner%8OH>iAVxcu#u&n`m~h3$$%wh7r4TlKUnzM`~mPpmT) zhQ7mEEo$D-o{&B1?1>wj=||>=>j(QmQ7$?7cs?=wyrDe-y-(?$to0;&ugI;lAF&%1 zkceSnc_`fhL;OGf{BayLa(D6h^T@$ITeKeFBdL}^pD)fpBgto>f#agqKDkWb?5ef#p6S_VDe`V@ zf~9_P&J{(iX9eu^vjCcbJ~S6X-7qu?it!pg3qkWh6Kf>AZ!*=J_-cnTvw!4me!c1) zF^u)Z1d%T>bkFle*+W8>;^a0_HR3HiAFAs7kN|-{OSTFzj>5}vU_e@>hX_%0F0cLp zwfWP+f1SMueMf!s-_p008sACZCP*2^h|%|;PeT~F`IHUm`*XMg8u(h`BsAauA^O&x z^{w>14pN4pG5VgjDg@2aF&m@rqr45#_nf*seMfM!=*H>$0c*H0efKE+U(y#D)d9>> z9KLO^9AXT;|M~UgA}t&d=x^8Gw!5Fx-!q_Ro-&W4;&}Q#`uk6G9O&;W`As#`-;v~- z?rGyX{DCv2!=Io?Aapq$-nXX?KlWtBN1E=fdr`RSU%o2U83Gx^ znSLFchmfrM8w*x-2l2x1VQN7St>e5i!mTek3EC|}%p_mlWrsrV9jWWn;V~q)Zz8br1M=s5DeF8tP50e=1d!AdSkW>%v2L@L(-P}?weF?F zVJO92!Cj#lf03P0*V=YhM!MmBxAWGpjrYCpyZu_el<&OnR?Z}?D?V8}nNS4Cq&eF= zg+)isDRbS40DdY!hQK2~f^%d3@8CO>CO3rd)7AeCd^`PD@C_+|Z?YT-gT%iW2!H<{ zAHHzJQ|^9V#qd>wpncN$#l`=8ro{#GUT6Ji8o^m3r2PoyGb!w>Z_K~_smUe_cMBP- z$ImmN!n`iE#IAUw^(Ij_mmvspe02Le%ws zU_UuYy0}+Pl3E@QOHtQDz8>=Jgn?@|oJaEJYt4JQ7dtn>jlGz>!>8x%b4lb`sb zq;jm+y6o#)}Z)wK_|0Hi?>Nv8NoC13e0b59#rJ_np8vK0 z4YeMl_3Xkx|9t&(^w0JZtHA%XbnJ%ur(C_Ee=59l&Y<>|JoeB(rMyD_oYzzT*m-19 zkXbCeWhXhV0iSZIh3yfS>b-WBFvArL_~8>BxXii2nO!aKHf+0qG1)kaB;SGBaobus zhPcQ#8`8~QL;7%b>7I_Ko?uh$CBo#~`L%fJCGrC(&;=vp*IeteN@PGXo{zt#Il>MVZSSYm8CmbY9?=#958xRs>GQje1av=CJ!_%u9d zKUEk9L5sYB28OT&N{AS3-MOLvr+ye<5Bz2G8B`(#SG2{wp8h}qOv@f3Fntni)ywivsYgvcfooEL_W^KFEnR~5C4)|tu*IiYMn zHhr;2sv+WAKa1CVPQIDvMT9NA$;?lTai@6y&!bat89}mL`N4>w*_-@Hy&_yc&#%1x zVH;KI_M*9xpZRd6*rr{H%*0%ZgFD@1!>#v(%!)|z&olu-9j)(zGYxlArm@t#I3a`$ zHL%=sJ{Kx?D(nYm8DhPcnPOMHhd|4vjzc2X>Ug5#lFLgOb?Rt6C)h}889?Sb z7bYujm6Owk)Qf{VEST0kYwVH;i|tH(rrqWcstU= z*rLV%7EgT=Z0Fw_t)c6d(`~;ueFiiqTTyoQM7;N-K9B zdRJs!;d`O;&^JrV1?Qoa@=viE)tfjEeKfpw>?!bCq}?q7awm^_o`){+K45VXI{X`H zKb?{Irc}3g=256UHXCP~apNC2=6)nwkr2&*-i_Cgy5IsvWR+y>?(Zr^l7BEJd((25 zW547^p~Pw7^Uv6)JxB3Ycogq6`lHCUA{QGRfG+VWta@lX{|?5Z@PgZ1b+<>RL&rM6 zhX2G6*yH?iiT47l;?P-SmzKdt2uHhhY zV4(I12Bc$@I!N4?hM?JulZ|Eyv<$hl&xRn3T&vT~8uciZp2S1GbXFcXx=C0!%>~tV)F(R+ z{$o|#ipPzgJ1+6QF|*xCVjj*lruaAs%I7Kaj4BFW}NP0s8Lr zo0Z%L&9?qZsB=jLy**r$+!5)ct}Ock6YLq&^9^hNS+@xY0mo}e+sh&L*C!e~NI4fk zeOeCcDwRIg;pa40T9ZUU>1K%xJKO)!s!xY=13z41=pa``I-;P;N5UgjmZ-{`)*Dtv zA>Z6*s{(tS2mE9KUgdDPPlLmyrMAF&d?owDIuWwq7;+v7+1(gg=uvL7(Bu9*!UU84 zN4!>$?BZ&TbXP{&bw$2>*N4*!^m)|ghw|Z(nWvT4C*N=Vfh?v1gRqF{a>t3uB0@}Z z(K*vU(6UgsK90u9{YQ_fvrK1;2-G57hR&oA)>W=MKfJ8ep7J4M)sk}cSXoKjT(|Qv zGF|!-wZt3d{q`eNDVJG^3n3PB;lLxnIhp^HS!r?PntdrEyK7JW%211#J-*yqdbCZB zyOJa65jtbuC2ni+#B&R(PwL&?amfjB(le8J*@pQsQr(a~zCx#)(q}X41}B^%?MKpO z;b03Od37@_o-f(^wGm-kB`Q01(uQMAZR`YlyBO@?xr0{AIR`^mGi+?s8SqNk6t?`3k3)Sc>PT=jAPbm7reOooZIz zv74kZDz(JD?u_Y?)Z4TRt&JtyZA#IoNe8(gT62%!;94+>!2glte{4?({`E~F?;D%a zWx#YM#OV6R&kp;+&s0J!@JC3@{)_6q9?1(``*V{n&htke{#YJUL-v1JPJHqmG3_%|G}O!0$zPd-X3m#SHf*kTZ`JK z15|N5bKma;BT-vT=$aoKZ^Rw)o1;Zs3*MTh&t}K0RPfdko8r-UL3)`I@3)_5y!lz* z#qasJSnll*1wISj%Cyf=W1a0eWT)C4hFx|8mKS{2KU7s!fvR%$Mra&$8;)bU9^+`O z&5hwVBi$J0SRV15Jy9?NDDj;1YUgpx0Eh5UIA2ZvyFT8{N9AB~pOKQFyj@-pe6qmexZ;P}RdV_6V;ZgzLb19)CN(CH#G_{Xs>he&_yRBzcvX ze^Yye-yF#vQfq+2p9gz{gMG){kq|%35#6-q^$$aI^>7y-FsDh~uuQm&7umB>kf0Da zy#agS&-*FXkN>=rp3R4t7`pl>bVH>58mbn^jeWL#!wl0~_GBanO|n>}TQ4doxt@;P z4&!MmxspeJhw=7LIBVf^a`Hv`cRP%Vs`i1K5-xEOHN}BTvuE)uuZ?Y}`NyuSC{f0E z_)|ku{83sp{&b;^$=_@FSoV7d`Q@;?zh{N>>ddeVOEz}(Q5{KM=$IH6LTJyQGuw_Y zC9!^<=4{0<9mr-fLI>ZmjExD-Eto`Whe8v%=*JFs>;66tu7y&79iX9ofCT#N7jg`_ z(tGMKkqUGVBr1Qu4A(PB3hFc^Aa0Q2LS=V!ELEyT+L?X=? zii%sei={VbdP1ag?fY)*d9>hyb>$eBSDDNqT2eUo8DBzJ?>*jR@67RGfX9>G{vLQ7*`vP~8JxFUxWD$GzYrdOg02bS@i654 z`{GfzHGC%?wK?!Dc--v>MEk-V4y7N(8>FCzVwrvy!3JU8SVwE#k3k8T`tNvE@F=KXzSB6F(4B zFU=lAoBUBiG5&mDQk^%4oP2k`v4MOmrl>%Ie;i2gAg~Zf@R&n``7_|ZH)!fR<+u~F zglVNo-@9#Th*l*uoRc$Oj&Fs+A^v+DcKp8l_cUYv4*qMI_$|D5XB6H$BgcC^_0pPW z3*q^Vc<;GqLhuYZq^JDu&YSFAd47Ao0)D#$BEfI>!|Fw?Lqi-iIpMgcAxhdjI|D5Ptg6 za8G(a2$zKD{Txc`{}jDvj`&u3Z_xuDqxZW{h2W__xF@|2;7yp`@BKJW?>Vte(fedp zi6MI5{K0=u?_lDV^<9g7$|)pwiNQQvFk+4Q*={2Gi3cO5WZ$rq`e*q-$(>D1{2Wi|sGH0Ih@5o@}_Ujb^6J0C&Sv4=mpX)`T@Ds+gFMDuS;=snJqnSLM(Jf4j1mZRAzz+?59((;h093PM6 z*&FF>Ko;ir^VL$<;@`t&vo?fcAzHF zGS?9)gNydQl_F-jcaCd(&xX{e*0|ER)Xa-yo)j3`p_|PA$rLkBzN5wR9X-ew_G9~! zb%4z#EW^I;hAbZeQ|%y9j{bZvjrP(t?_jOe@bLr<#M8JF7+>9NP~O&%p6Ds9O)Vom zv0Sc+2F~`#gBMSa*Qi57Ug6DRssSIIt6kqv^I;(>7U^8Ava8P|E4Fi3ysmS#hKl2j zG&-oTk+Zccy(ZT#4!p0T{a+2zLG9qDgNj_e1Jw-$(_A1)J&_*lSs(SBR7jjt*XdK) z8j-K>Y#6AqRvX31Yt^URmoBkLkV0cswD@oq)3t_{Cbz#AXR9le5I;D@2!M$LH$yy|KUsKi5@bWK?^AbF2;pb77WFRPzQvX35v&?fDk9 z*(p~dQpfk4Yxa4FxB=^FfCaZ>g+UX$;l z>nk^~L41iu(|<4#PB&X2AQW_L&=_cdnB4_tCK**3*3$?kjtY%#np{N+Bbo0#wVE4g zGbLl5oQ%`@B2JbMb1oSrYr&`6#6*(SmbV=f(@htp*{g%cOuuK|3QcF)m14n-t#XR} zdfx6%cKI{7IIg@f;o}6$&(e9Ab@zGXf~}OgFB<8yna=Z%qa8s|tLd#V(jQ*)=HIcb zd+t&Ve~CGLR(61S%q4F2(s|L8odm9R3Ld7brDTy2Cer`d%0@3qb-Tw0ZLY|VFFxnW zUtG1bA6f=}F0X7tg+!94p*zS$f?dC0m4L40@Ho-xBYEARi*Pa}?>{ShX{7nSVluH2 zh$23N-*Gx5wsUXE`j8=qa0dxB_|Ex2|63Vqb&demEeG!%ASX79TxmnL4@xerV;7p{ z+W$avb?H&1+%r*^`b8;WiIHRp@92HeGgJ6;*`P;%BIq(hw%fZ2AbWWicP{HzILVa~ zK5aZ*p&y;YstpU7%WA!2Z(r6uc*z`^q4$*l`1{*OsYFyIyfgMx>O7ql2X&1H@`}^B zjV}D_mo(Lxn4xm~i)BXOpGr*Q=irVrQiw|m?C!Z zGl6ZD6MjVkdsz>8j0EbdX@BH^zN*z1F$X1U4)sZ}Cw-)k69rNYjsOb;dur!OX&e9E zB>y%lC*RP#?%*qmvOB~3lG{hi_7W10skVgN`30Mj;Vh+aUlsljA|348WiD&<<_>ik z3>)o;Z~K+BT4&XY8s&#a@(4V{-g z&cp%@u`<*^>zV0#)lD7elJaN;l9T!J>}EW={@t>Kd^w{^v%jRpV3~4UY4!yMIbF>z z4f!=Rqgu=h`E}0Zr+c>ha4aq>rgP$%lCe)qtZF43pcx(x9csP0r;v|WZvd^ci2=0Mlbu)NwNUmoxTHJ81}Rp zWFr9kT35cTfKKD3-kKnwf~k57>~-sM{EfLMxF`PG)TdA9Eeh&iXpK(xy#*I75c5v< zoqjiT+SB)->5F-q_BR+O`!v-(92TAesRA$G$UG(Yai0r8dXFLbAa#3#_XVW8zjpHN z!*d@KC)2@3;b}GA2;jMWei)vGFfdJg4|r~+6`x11atJbbT1I>eEOK-;aL`D;O0kt4 zU)JtP4wkV4f#q|^ zvuQZw>WEzXFp5BXcTES;iCiR$o48>FsV~R$+$%V}=8{h^~mfgjw??7ga%U_g9 zg=VjLB9d&vawX1E`txTqT)<=YS69%zBXeh866pTsw;A^`_E_tD+~`gd?6 zFT~`TIdD!5k4MXj5GIEd4(hjln`PM~Jng{QEnMBseH#tFeyjkTlcE8E9 zzXQs`UN7CzjUo!MO zh_VuLG#+VCsgIMwee@NsHr~fq)JQy`B(jZbvl5)#!{5UXZ-yUgd2rp9W-nuz!9;#A zJ@99&KeW=|^SNt%S_dz-p}Zrcjk`4anQLGUHEAG0JGTC>Z6g!uR!XOn+D!ft^J@4T z%lpa>V~(~{k=tQu1)Ii{^Y=YJSt#e0ovV)|mCp$6M$BokJ82L&v3FP`t=wZXDyIlN zs>v_uPc&P>Cm}cGfO&FLVt`6{h8Ci+%mxclU8T)v2QZy3^4oN}`NVH=MenpfuF1Nb zD>^qS`5=Auyxd!~SAHjW5Fgz7Hv2bTduMNj!oC@G7ad~i_inz2)bHdwoTvG{A#CIS z-e=|Q;o2}OC#d6niY=C7MJ3t;Af4a9i;spIXl?Kw3Rm7il@HCA{^!!r zx==ZK)Zo(WQhw#w@Mwzj?jqjtM+WBq9sKd-{O`jbYbf=-`QsyS7vhht=l(y-A7AhH zJ^16!JvPc8*YessywvB9ssp}_KjyRk%<;!+sJQ`uJUcVQA3vq(Z{d%J3mSkwt`ApU zQ(4F#zkB+B!yoQGQ~&-xcX33JTX#fR+pOvEbWzK$(atRp%OY~?y~3Zur5bt!8+6O# z?*^;grsoGTCEud-7t)Q#0C*qlVEty<2!x8&XMqXjvPb=p=@SA0D8WHa< zNnNaS3)*5VE`M({yu`R+E1FCn!$$R`jV?3P)|#+69MX(7(q!qfL_NhX%_GgRnzbzv zP3X;at2-!iISsgquLVtI{;pMhG&9@M&Ux2iCPfL8)Ce=pwcg`+P{7`k$K->p&g_sU z@I>5BKP6m-3*~3K>~!f~%>Na(PW85aTeQC3((YmCv2G26A5C3fDL1T2h=6+Tuu&X` zo58*F7GEcy0820Y#qOqdW*uB8Mffy?dRIY7?#Qb3`j%>Kwre$vvL6UyKFm<_mP~69 zD067~87l?g^zOgSwP-`p_P<&@!Ee#96K?SV`v6K^b7uuuZ=Z}!^P~-zWf< zWR>vc!mgj;j|S}@aqDK_l5QZQ8}{s5-cPFJmTnn3VZV4jmwF_5G-!~%tbk!#I|g^u z4_-a^Ib8f)F5Z8s4!S&Rx!k*+GrSDuEYu3_x$b)1t&gMWgDbs%?jwjCshlfBk%?Y& zFEIKKeo2ng_ZmJi86wFD@4#oZ1XLchQ3y_f`=<{PqK(Kw!2ftK!638!fesox2 zq7pO>mS-R2k-;UQo-jDO@&W!D9hX2|`t2C#_q!5B(Swfd%06yR8%2~kpN-$~mr%H; z%VxZl#@|57w)MjlB%rq_u@H1xLZ=Xgi&DS5{!ZS8}Zq+HpN)Zh7Up8wp| zgi^gj_Ac+JJo|0sSze{MLg`Ks`~dMt&0y z4nC&LBHz8&dCH1o0{&GJM4ZzA(xidNBi$I!jH}fIgJau2y}2MGO*5?Q^T;I3e;p%2 zl!#v+dZ8P^1E3{Qt4!A<+O%!VVE+=2$R{nMVY?V5jf2nV!S1a;54?QfKk)M5*nrue zR?(2BPkB%SMmKr16^a(*&)>YPdzJ00&MgBB?-(39;;$ws{Pv@=vTz}e=KsKnsT@h} zVBQuQ%k-Q2s^r3Vo`1>g*T7ZW%pHHB9(To*3NO01#=PgZQ4cHLyyx$kMjg0jPkGPl z3%%#FkW=4#zS8^i&SF5iHury{Oa974*+$ET{*0S64f`Nnn*hyjsT2^#`_@lFZ{kkE(`-xGF9Ske?mqo}zA2*@x6cr4Gu$uF2Xy+& zl%l#t^|gjd2sT=!gkcm@w{kzmQ|HJf9Z9x+sUZ=lm_3JIZlBQE7vk{=u^P(kvzmp9 zuhw>STi_usx2e?RL&=ig^PKt2GC zilt){h2ean9fVAb=gQsL@A!qy-C_}%?#v#xhVqG_ZAd$V`vGb{w2qBjI}HGIsmqR9 zU0%k6!AbrPS6=g4LHW%oqP1_Mx16agyT-Y!a~gZ5z~YF`LKgD>B*dA7dTu;P;QFl&a8t^NS7YH|P5w z%g?|r&Y1wKnCBJ+b8;m4OFM~Ia&o0F92pwyX<{8hnN97By}1!1Ydb3+7+FO;~yX>+De1-e3hx>y^z8(uKt2AL}59b5ijZ@DZ0%iwsngvOE^*C$JxbK7#HKg-K4OwwLQEKjj5hgJMyz9hLufOA zrxV-c+Yy-aBhgM@ei(JONn}gGt(jX5KzhxAvyfKjGyx}fzc@g)=o`4Ww}tRlAyab2 zgPX?4LZ&>5ZGe&U|JnoI4KQ-~y*)~N4~#T#o5RQme$ugzkvYs-JpDHqDRxLi+Cvzb z1~`Qn`SJ$=Mm~f|W9f0?k>&?%0`++WTQ-zSxzaEl+Vm~+PQ6Q@;?*tK^eyu)xhMA? zE8D!bp-tcV@TRZ$LH-V(A7;8veCW#z`oc}$GPmhVmssfOfn#w1lZ)cY6H<=@{lqpV@D?f78r9fi*}0vsXxJ%DpLfI#y;a z%OfT7%PqjgeP-DnuXN3;z6F7@24?K}cDEv+seCt@GkvWlp95BXyX3J;nb! zFmlDlFtSj#dPpIbd#kq#Fw$UiuT2rZx_8qU`KBk2xGhlcnv+jJSRrj|9UA@yH;D#6lkV53PnVQs%wCt;0xJcF#OU zPPu2(7-?{dHa|u9@E&pdcVXlNU#^0|ejkh+&(hGBntk{Q4oqjXT=ZXJ<2KASsuW`5 z8d@yG#!K4-*y#0HfekZ`B|<2R)cGq17HMjBpk#G^C$TsPFH*XY{2cBb=9hKWM79z; zUV5g?>u(?UmF+gOEN6d|71mg0eXGWr73x+s-mq3Q0Bh#wk-SPWgXqb-K+)*6sA;RK*XITIea_BYls-UN+j3)a7GJeTvDT0>o} zeUX}iTE9@EEQz9_exG3BDIEHv+Q;?#b-DHXnp^_mez^dNLDO#z=BxbrJ`H{>D>E_l zF<1XKxU`_YL!#C9t-Qni`aWIex<%k+uKoi(`+v}o7Vdwm!v3erU`-4?$kl%Z6<^T* zDI3AS;_?CvXpfr~zS_YsP}{SGUSZ5t*aNw<}sg@p`K12{V^9Slpr ztj3<(aUF}a&?CO4E&ilmex%1ZNYcRhklT;?#2)dfAR+rLan#t4=RvD#@>D# zJ~E0yMh?YCiy7TY!k;D_QGHo?c%43rs5d+qBI*^{{q6ML5oV4e???2G!129L;o^WQ>bzeKMk!9B*}sAKHq_(mu%%^se^O4JzA7hkt^nUlJm zeK>p)O)LqdPRWOJe7akXRR1vq`fYt}KEDDU^q%~!LyX_xK0$*H!)JrxT&r={s$;Q$ zDKmyT0e|cLA>hx^YX^KV_8i=LAuh{~aA=34jtdWS2ODNk&Ffz{!mD}*Adhj?H$|4u zh$_#G{pqy=Q_TC3VbI4&Ee2o@@_3Kj;4tE|%8&g10_F|3I$P@6TD?Bps-pSTYFNvh z=C|sr+y%WH6uy>u3s7=nl_^83`EmK|=4+XurUr!Z{q754d?#NEd`~U&aZW9~YWVdL zB8Onlq2G1ALx?~0EenVKS&oR)!wsG0Hw5?RD0zzCkk4x!oB5PJ!jd!QCv9jWq+xL>x=$s2Dgb%OBjegIRq$< zE>QE?RiAFM)=QhNm9k-Ao4A;~vg{bnu&4)rDzYAY9=QObI6395%$X^$?Iy}zX=OLs z%n3caEcTn(2r9Pv*!8dxcvoz?^B3qmfal{)!+sf{7Q_b~cMKPAPs4cO)M_-EI+znS z98f!`F&atEW@d|~dsng%hzkREvK`5bW~OPsJ6bY>|8~|^$ww=;!kU3DgO>#R@R{CE z=(YS;9fR_FN@vW_o|1BHK5!QeSYoaYCM@lLl-ZFnP5|1mzwKv+w3h50w#bFyHK)pY7EO>&oB!fuoenivk9#$u0?upJ_A*zWY=EUyU+ z!R*3INQ}VFs4`MJad4=%5x9%w2i(&8(6n8BReHjpME7QqWCt^@_N`{|H=39*n(dx< z^)pj)`F?pEF1*Fzkb`pD6eA7WusO#Ox8rN0=@HRr|E1A+YdI}9FLK3rtvNC!wV}Ef z+^V`1tvMbN--j8e{r2X7#)FqA-l0t}408M2Av&(zH$R3Ga&)}Q(UG0)ff{Ovjun;= z&Yj;RSrzA5KMCE7+VlM8hu&Id2><+Mtmdsvo!<;4Qg!DyTaI*uJd%4+pNU!uXUl`O zy`5QR_V8|@VTEi|(Ym`KbxEw|)rmvGRL$Lxx~mU@ot9gn36`aUNO}ogrZ7oYLx#kJ zLAXj2OtfO^5J5O!C_&OW!w^C4haj0|XtM2_pPo`Q__^#d*uwA}Paj;#&a~ax&DMG} zL)@*m94>S_@86hXXyE2sa7VF4O|XL^F5);}rlj$Y3Ns*n2!5!5BVs!xFeUI6!W( zEeeZj_Qq;lsntXdkh9HOoYopzQ6^0siF4NG=D^udl{WX}>Xx%{>V#oTK zcyJUob+UQYxAcy$oGE7EI%~V-HgpwLLS}~OBXzIx*u|KtOE<8=6$yv-R zXsaRhmfg!6b=hNee%R0FtMk-B20$HoUhPd_9(DZpO+(EGh5WZr=Z8Iaez=Rq@YLvD zUNIHP9hF8r^|?EbN0d>uqKu*(SZx_&;YI0*$ymv`M%{!5d z(z+C~=MU|eHCYOyk*E&oLR^r;DUZm^BL`VLkcfy1kiu!%3Q}2E43DrdGqgeiRjJuq z_M%X$?c4BX#9EPnz{qhh^f)c`4e^$Epu4d`<;S_;o+J3^ZS&^9qHG<%0)0=&OL?{n z%hr2v%DQgGwT*2q*sZk8DpM9rV|4lR$Jrw~)P*Wt&0_5zs-xZ+WQF$&Fowr{6@}qjZD)8wBtDZnOb#9(W86OyNZY%Q-{y%4zT>0_>fu)M3chA!^x@3UlzLW<6=SGd+WNLMf8{U|r_ zHrsWqYv#b=MgGBTkXjHAAI)qK4}TX@2YD0^e+@tLs7-e3u_vnL`@14%{Z?Mjg0p{z z(G2G`704u$eALy#sc(TE0W30IkPLG4c>}J}H{~ZaSH;z97nrD4)3`~coeZqNeDOKLVh^$0g@6A(O{jDbkbp;P&t150~QpWK-Ev75e(Q{og`c)@={R_f z>~5`Cs|KnK71=XXC^7Va-Ut;59DnwHmRybxC^=daDU+&; z21CWp^PWcdx*k~mw#QQ>KlC7Dn1$YNlajjANrg_5 zx%_=4@}jCE)RAPj^_J|3jLGZ>@1mDspVg4Vjb~M&s90FbDwUqa=h*l(=?CMBw4X%n zY&rkQ$9EvL5`j;w)^K$v1+)3hAu-U^ALgd&CVEMp7v)}(j$JhsS7H-m)WhyyAY;E! z+xf;BNA5gRR4u2=l~yL4mzXn8ZM1;w4V+RLFkZL=XM58iIoh|x z3{W=>HUg7Z@)FZYj+f`>LG-#_99Y!#SBQ|LLwF22*butXj!u`cB4wa6N-p-ZArS+f~0 z$$=4`>?yZ*sz znTr|TPfp=nobJ{Jx74642sk$qfDo4HeOvg`~Z=abUdi zmI0yJf*;lT5%8ITVRq)YifCpucIHX`^$-gvMS=uYGvmFkGQWJVo*_Sv>`C(ToQXa8 z1;PI>_$hSOdsWP_n0320^#5WOZM4N|78Dwl3zVN{naj`9rF6b%FXiW<=N7J zw?mN4S+_$3xp}(1XPCEWnA|+8tl@_K%VIShkxVC3e%NU2P;Q0MPjJHiuF+edH0>%LAD|8x5{Lk{=s?5-P(vZCak0Jrh`Yr~IX0ETaZ)l_mAic=j zv099&1!WD1d|HM(#!Jj&2W5|K?XJAKwOTX+v|@z=9=+5=8w@zY?*Zz)^Pj;8*hw^b zj9E(mB4$R!2k6$1)H3HGdL@$7J~GQiw^WPNFO3#2ja+fHdl^YC7shH{iAF}^X4rWl zg9L`Rz2^1sFIuCRx61r%a&39QTPmxMNDbdZYT-m~zYEDd*Q6vnp?nK8hvDD^C*yY66ee=nS5vg^yobU$LDs?)i9M-ukb(_#C|Bm%DDO{SVdaGHd-Bft8#dMN zZKp?a&BD4G-Dqktk}QKX7B^}x!OXZOHv!HvQYI_QH9mO_53zybCFj_ma?7TUf<3RV ztkCOJ-MDD#D74u1T!E$Mqb5XC;~+<}(h>~9mukn5!f$i=@DNQ+Y15xf(pnT(yXKO9 zGmGV-RK@zi9d7RZm?xrgz26_js84hoKr#+ZnIwjK@Mcl#WjP!PGs<>g3eQV031&~? zQ5I14pKK&}OaBdb?ngU$Y-Xz{0gaDf{KLv3eXe$j+du1brFw|8zX^KGsR1|=Jqu&F+Q!!7%qKWZbhfoulu7a=rk4X9|Ia$80ss>8Hk0B!BUQH^^8jt| zj8&FBV2+kyYgG}w+R6vSGP~HQRXC*=dm6Wx(y?Rq3iinczy2sQTTymjsgM1h1k~GX z_l(SKu}sTQ=%`%t>@IXjjbIj$}>D#zZj)TkV5^Lvx59ZOl0n`Gw@=VzA&$Ut{CdY66< zkpJSm^XPdzl1ls^vGF;Dob*s;`z!^cdpTr$fJg;{xM%K@@cGNf^u~O^H)S|0X;B%M3mLxZ{hw?8*h2WRr%^ zx>3>8T9V#kL*a55T$OKOw`(ygGj0u>N{u0vdoMh)Lh=u zptN~k(uMHM$fD_S6~b%k4WX5rC>tUpmfMZ#@(b`qGHF#K$pe5H3fbjsj=nSyf+YDf zp_lRmTsK!l)0m>12_;3SGPTxx!tR)531tUFaLz#K7+CEcb*WCSn(6;Z{owBC6!=W{ z_UXPO9t^wN)TLI|&EwKOxeHu}*(dnP;pFU9{LS$jCe4oT;aAs}x2Ptcr`BOLy z$dV=7&USv7#Q#MFcxaA@dvf+~JoV_`?jp|qHrMW)3QA_L%sn&TSA05!d2D+IChK=p zS$oH%9dJW9{09;|lGl^7+50|afO!DVm`>W%zPcEBS6z&}+u)A8|Dxp6HdYk6=U91M zqNxM4S1vOzN~lqs5Eksd>?78RVi!=5i{>QXPm-bly9?-H3We zqQ#u8-s-}~b*Ok=WP2cr^wDBx%zW+@WVpQa!nPMgs}Zm z-EpzhH@Z^x3pT)XKCsHpaDOawSG<)?YZ- z01{;4oTgP90SUNjS7rAW_NnlS%C(l|%6-MSIw{gx#DD5_Qe;(jy&9jl7H(}`uf5D? z*LU@ff@@JL^%@3~cp{dLmvBgQcuA@El4is9)vd3`5+CDB*}C8dFADDI9-yH78eLYR0NPQ(!7t!@Z{BlV z^orpv(|2=QW651ioJ6$$ylDSLYWCutz!v%kyvlu;cxNrb8!di9%ck=pGq;+i51D9j ztmdhUPmatyyqFioyx2@H;=I_57n|{-mtGvii(b574Ik~T7kl%fH!mP-v_vm<)^wha2Ey-66Pj!)*ebpmq?cg3VuXRON z!qTjK#`U)=Xvw?uT~zwMfqa+|6-|AK4*q)XT_BKj;-%ij7znV;unPWj#3252OfCO8 zu`!lfz~9rF5CCT5%gT8;rUT6Y@8r?xQ*8QQS$gN2ZS4K z`wYINY|KiI5adMmea@*~vDC>Z(Q{bRO)S@Jy}PoZ+%AzPK*8TbZ`natiOQEA=s&l$ zp2faHikCS_ozH$!VBe0**|!t8^OuEzmi9VYtSswE%So8o6)Ut*2N~Ha9dmcFfZ^SrxRtBjtbnN0t@~`$uPvHh?dNeRG*T8rh!26*F%DKNU zlHAU306;?{cuPX84G(_=)s!N&J0loL19s+@{T+?_ZtnRs$O&Q-yMRzr9NC( z+3YZNC&V)sjKkJ#sWSP-^%k@*&kvhd5ObwhFVj7>5Y)83DS(FX3_vlKt$#v2dwbY( zrvPju9}Zk2KiRmfa@AWF4=vh@tWe-37Xzyh@hr=|4?f5tsFph|#oOqha_=eL`@DdI zD$=ftaP+0j`-lGpHe*jB(*8TXbRE*YwCe_g!{PlJ*DS-NDvg?e_}{a`871Z0`2ThM z|1N*~%{#$w89_iKBJJkjOcW%2@1ft6Pq5l>JC1lqcDJQIt~31Z^1~0Oplr`8l_}W1 zF9b@|mvTqo=}3gsb2M{oB_RWy*zm=-K#(~QDA!#;UtpChozPF1cD!lIIcj+AeE;GA|08&dDhnL}Ed;FaFre_*FLOc`6t3(sP>vUQ;X7>C&L* z$Cc5f!fOxrd_RR?3hSSq^UX6)IQyRC+4Wp9j@NrKIJPqr3IzZ$uX9aJC?8CueN4Up z(yV*G{K4wl?b;$vfD-|beG=js-GcQ){We`4`W~5C(r1rkQPS2uCEM{+?n->d^PL_% zhTAw+vGECo%Df2PMb^VRk^SO*y>lh$vh2iQoiVo*jCn74upMzJkw+D=N$ktjFUsv~ zDeTw1rEf!TR0FA9ZsL#k@;eK8Rk+nY%*jQF?K8mrbQp;wIg z;uM8HVrbSJ<@TjDm9dMyjIJ7vWMO|=JCV}wQ~KoW=9CNQIpnWF1A^z{G0VGcE#T{O zvx`JWV~jCUvzdO~7fptaX6HiI$ChadWKt{j#@s^Si;Odw0Zu(*={fdw_^3NJntBQ2 z8V0&#_eretGux)tbiNa*ue2e872ZnwW$owrLmOZ+T4}w`^m;G_Ye(iY$7;g zwjZBZ+dGo{6)i-jZmo6_Yd3?;iM732w^yku9Bf|nprIq*n1UPs+1}2KsPNwowzo3e z<}}%`mU}Cn1=||uMD>_@qbsF|N`k^h(BT*;uKr4>G5*+4U;X$VboIvT>S}8n@Q9$N zPJ20#{{5cTc*&rr`x$pE^;TAQ)6r&0YiC3Hj6ooyDpvDx%a3t1!BnUTZr_L|7FK&V z?(htoxF5HEs3KAizl)_W#{OFw?Z3j?msY#3l%7{pk@jstm#+62qne6I0(`B128b@!jG7qw zhc~CdNA0?vsKBj0j?cPxcYo$Fi+3{iw!7%lwe0DNC3GBk{4YcB{>U#>8vwoFRRO&n znk)DcKz_GF;Oh+yl>qo#;fCxE3goysEbF)i$;Alj(cMm&O z*)oXY@Gp5GTrMv!Ef+f`Q+BSEEx5k^7L{#M*&9L|As>c*-|zF2 z$IWfPHO^0t5bw9N>SY;Koj@7CsDj>&OreH)Wc z|3Qe!=`F3c6>&|9 zfr!8JqM(1mV6^Hv=sWGp8$R@<4*Dye^r8QqFXE-y8yHR=`qFQQ{<=OP=ov={dRbT@ z=*tBC59!XJ53$lqu#!I?gx)GhAoTbqg?w%RW3$;+%=$S6&O}s!ST|sVOyE}@F=iM*s;<1M##55mG>R{o%+D%YOoTTS@# zVK6Z-sP^uTXkz}L^#dy`bEuD$N4k}1d3n75hhEJR`uRp&n;7~6a#qwjFf^9PwO9Gd zkd9zfAkV9Zsp1z=gQ(9C@fpz zmtFB9W!EARIeODUg(|gmjH0h!E~0W<6tYxk6j?=X z=X>s2p!?4)Uwka}CAXj3+OEk2{o^X{3dF}EZ`mZrb>}Dts?6kg9s8Yq2Lif9%csMK8oq}rEI%t&3%G13XY1#s%3(rBu_+`nWqlGITY_Vu!3=vV6it{ED{$-UPb23(-=RD)fd z7bjP-6w|ab3yrIPljX#n`Zr$5@wkP6N-ffE>7s_>FIir8#8c;0vwg-=Xe5gX+5$HO zQhF`*4$mt4RIGEvAhi}vA6%(L1>2Zwt&vz_QFY*!EAzY`A+mgmr7mXE7Fx8F#y z^Nbvwi%VeNWPDZawAL!S)F5Q<_%MKp>S(5QP-p!hffP-(*7AQsi|QNgSxCAUw)IxT*R^8<;LlWPKhWy8U;;d_u7x z{$7D?6;0O~g}|lCL3OZ{4NbgdXpga`t<`^`dX*ohu4(hWkOE1~o38!VV0^5$8y`}@&d;&5!`?x)xU^A%k=;?#`OIUg>ZU13XltId-#=`SRz5ntnHvdvlNkQQ zl8K>X{a11zS2zqYLuX{_ZM>4Jdff|>I~G~O5RFmAXAJIkJhwxeX4S62Xw5#AEl0?O zK#FZ2-vLX=U%>^Uwm7ruTFm-vVLsC`@7eNa=;%1u;&`_E_o-~1-vF{0J)j)|dW=pA z2ss_d^tTmO^A74%%tg)~4)#m!eEDJtL#E`F6$u!G!-(1{sgf5HDwlYte()|~bN5!Z zQOXXtS_s|hXvqX82GPt-l^q}fVvXYuO+ZKm@;AGubIEUp2j*Ql6(QLn41A!!{?%1Zkwh$y?e06L`^G@Ee4EEc!MsaQls;@hxt0ALUg`WFX7 zBB^*x1@yPf|69Rd?}QTZoWp{#T{Zat35OK26qc*P&`_R51^M1(udlbTKs_76_^!4T zOm5|Loq&K=*${%&TovU+PPL=IJrO>)+OH%4#CYB`P1!nOuJxO(q#ShY^t$OqHuTho zt^Xl6&J#MfxiVV(Y4ORVY(8ZB$iu zAA8qkeNt{Z@0~t&<3f94EC6YR1=AwK6d-CMl3XF*YfddIx5CuB%QP7B4aDW&mbF2s zFAF|wb=R_MhzGSIwL3pr{HipyhU&UvpRS^%(an24PE~MeRChh6R=P@t`NVw9+bHOy z@su|Z;gG(9+U%DkIv~&yC~MkleK?jn1!e6xKdYmtfO(oJqkp@hbgI^UXtEC_fTHoO667|%CTsP!jkMaKGOqIOR{0@omE%p`^UG!5KqWRMGpFj@ zU%!$8p_`Rfde7dcZ3TY>pt}uV4^)GoyHTb3VRySb%6l!xf2(62Y-xElJSx_M`Tw0Q>jPl?PGVI{*m0&D# zP?Y`dOmm}YHgDU5=+(#a1UrUktCZP>A5G(AIY|G)9Z>fY z(F8&XI#D2hdUS=iU#pJIy1Gn({zMU=Uabmrl@RXrJj0$#wx7?0A12EORl<(tb3oA6 zcRw%3N=1!c`js3Pz4^Gfe5P#~Im8x>`4Ru5Wt+NT`z(^Y1Fm#P+Ko!ut$L!`wQ56h ztxmO8ul8Hr028DAR%>&uuE@1IyHo(e#;&{javy$UABJNTPFb*+iXpFu+1uu)xe>E7 zp1#BJLHZ_Bsj-?jTK3J^w`?XzWy;WV-OsP~)_(JJHwl4S-;4TH%z>@T6~t49^3>bW z{%?7c|H*p!K;Gx=SA+)t&?SDqi$#1I>EN&W-E+G7GiG;&C4rXJ-Zc8-tLslit-m3D ze@pek^%qfpx?rGZe`m>K2b`rw{+rBh$oJP1zVa}9MXI7LvpwYK1HLl7aQ)pflm51q zyCY|xJNRa=Q&}e>g3nNA6Hd)5EldvhzHWbIr;uB(N}4rNuj^f0J*phMzpx^w2GV1QUY_g`_ej`0Ct)qU z&z9ce*%lVDTRinuwEwHoDfp}v&;E%LxJ~&AbhkyW{tEU=EuQD?Dg~5%j!&+Ar!&+; zBfU#^bfGV}O36ot)~(MPCQG)I5V9<2e+l(baN$V%->k&9-VCvw&Po>CETOA0EJCR~ zdx2;YvHddS*z1rYcdE~1vHb|};obT>4yx4g%j6+_uag383?65!RWc5-v;iKY0UlSH zzmC2A04qVNOCu_=EZmrDW`p4QwTc%6we+^)@^jdYUSBf29Q}31Qdp7vtg^Htk@jI$ z-ZBML^V9at?{%ct__nssC5z|z7}eIlrY_EA*FdRsOf^W^jdf&~L%=+pv(M$KcnqQM}DOBwYhOpW@ac zivUceHilsXs?Cd-H!rH-xyqh}rCX@%{e@I+Z0|Y0!MvP50b7j6Ie{48NOGZ!ppe13C^Gdc835ck%)DLZ z-M2tTLV~6gI!lxvT}g|`EwCV7{Gn`B4TEMC&gbk@Ny;l$!n6@W6=Qbvy-m%yxXzs) zODw1k%tbF*>MTRp4x1K3RgM>qes;D#98aBQixsJb>;=$3c#6!t+6FOg>+DHRSRMW& zGu_IaUgwBzBH%23*l%CyPjj}mSF{$@#CKU<`j$L5WC!om4(^3qJN7%6JYbS( zG>o})!(;ggSk=5c*7Rt5Yipab`F5Gxa_!ph4ci^sv)y>lcK@-;=&g2b=8#|F3P#Dw z&t@aWs2Pj};B*_R?~UMjhX1@w!{GTYJ+nZxa{dC*^M|OW^-pr~0Oh`I-9HDO65ayT zyGJ)^cvr9PftSxo900$v6nMxX+y}%M7UaW?G!{%bz6Au)awGByta6b)ZgDQI>fqV? zanIh`t+(Mc2~(>H@5VQnPaa|az}K(57rwlN-XBr$zESVb(ffPJqUg$d1Fl0KoW^?8 zf8I&YKhHmJt>+gIN|OU03s-*G0}G!h>1JZ+!r4=RqJ4AGFPw4b4f>P&c+9_;pr7GE zj=oc8D;jC&uU(y046dM#?nY9!vb|O3#~MIl=vY@)OYwrT$5~nO3ouifKI?Spqd55~ zH`Aip-HNjRCR^mA@)mOhlIv@fG&OkS`X0^Hp~t^yUl>&@UV=dSqkm!vVb^}cO2&fx zHP++X1OB%x36OG!A-ShV$-!s&eRDBSIh}#cqaJap4$VHagS8h~`M2HVvUJ zeWl)|uAISty_4?6hQ;qE7>i?57A5&>aNffYDQSH$BkV^YUSPEGLML47ZJuw)u+eHx z7!JCw^S-%u3qrSWlEm;OmlMJnQP!9P$$ZuIqO%LQs&G4QpY2-Y^pB2>*4$wzCocm` zp(Wbyz(X8=r}Issh`c}3F1T!;O^MJb+y93_xpoNJ ziH?kpWR4B^%bSte0xZs4 zn|&JlJ12JlgEIm;4y%nHG%VWESHr-w-RaFpG0w!W+KR4UYik3y$Yt=tB5xYE&1Wxz za|SQ5ut;yzecIzOKH@x1rsTj8+<(b2%JsP;IXFSc6IOEMD+w&QT1(e;Q{!UjGe;uj z91L56e1ayM8#0rc6bLw$?Wpot>SN}<1{kx#n~vv9VWy4lj8Hd;xc*hDSBhOLRjLG^J|W<;?4XE2qjkktvRE46bF(?g`Xi7$4$C4iC{gy2$%w}?N%K)%IKP%_dYCLr( zWp`jiK0kU-P9s0s9GFR(RK)FFiEs~*^7Nf^HA`Dh@UCZeGTyN2l!_o4JB~bUFtdwC@`Ynk210$s5P;JBJ?v&P&Qcy`2l#BzmHm3rbf-bx4FW zz!lE1dIh6rJ$zmfUbH*;&Cat!52>Io3!#U-+cGgA4J6J3JG%%woCt98w-Zm!&btFT10TiDI5LEfGkfCW_zm%)04Rq~8;s7b zIC_|TpE7JR^6d+E>T9C#3B#Don)HGS*eAxN@5wgC5YG(!q~Tc<^pKaR&~?1?Q%odm z{X2PU4|GAmTha^gkWHF79vUx!p{JJZVK%a~60d)UckPwn>Q6o&oCA&#z`y~B06uWL z)ap4bszc)Lj*U4I$af0~BFQz3-jSj1q&kkF+aXhdWcsJNA%*e>h<&1uFt#Fag&jH4 zIG~hNMKHiuH1c!7;4V%a%};4AV}MBVWxt^i7w9W&5b_`Yn?fcb;_xqTL$&o!IfHHxXhW%W;J>A-kR zn!Rl_juHbD(!~HQ8%fSIz%)?_x@Y|jEN=h>%ZdHA)>XPE_6qJZ@{mU9lx$9;McbkIev|4EN;RW zKS+p&UyE*4+|dPv{Q8mc&IP72a{RglT?*e!m2;{o5Sm{en<3%^e7n#0;M@L!#qsS( zeunt=neW55kA?YmD7|Nkp-jLZKDFL}Okw`jvD@ThqGq0d6&~dC@6(5Dgn!?;CB(lk z@Q{7qY8e0a7FXr@cQ;Q6=8t}ej)7`ZN zonzCnYG8XRMbpNn(VACTsHnPgs1~xR(!2YB>nAXo04c6U@& za%n9|{K=*at|=3@1m^{<(M-u6A%s^&zpY)_Z!|WbxMdP`eFf*{yKglDexjbCg{e4= zAlv6=H(yD=X_e|v{qn8kr~XL0=2hHY#e=sEMK`3Yv(i6WQ+IMB@TtQNay^Ybr@ZQ6Wx(OvkZUZL8HsECIBBf4{$eyk2DPJ@>57dCs$)=R7Ba z>0O{?sjo>Pz$Jlo;Z2;y{8#g0`7O0j^rXz9%gnT96#b{2!{HP%`f@0`O@sv{&ALcR z#$-Zsy-81M0pF(mLE{q*Ss^kLGRZK)mamFCDY%* zjgBKT?q-s6GW^ZVagFG>pc}1%ba1ykGLsIYslsr42BJM@e(;ks%5x`)jJpcu1pN@D zbDLLl`%X&do>DsNrF5=x(Kq*!zWIuUPq_TD{JI0hl1^Z7DZiR!-r-cjDbceR3J0so zzjm7Esrl%K+J(Usaw3z2GGRg_LC3v`CTJ4#-jlx~98+l(0Ss0)s>1pw!K!M5^j-&Q zi*-@k=sk+NtFT9~_TGHJNY?B!_l*0*IK#tdnErNqxBswd2*-U*ocb*kS@ z!VDlIFTnyYOg5=ZCz2?iw(I!q$zL+K3X;COTxA=P|5MX7*-RALBCFXR%|rCTpz$dN z3!jJ8h`4h^jucpiJx#X5v#U@b$+iRDT z4NpA8>XDpJR4b1I8MVR&y@|nCo9{`gGfC*yqHZRZy9$KjK_oXhxBv}~Z=)Z3m%^zP z9SXlsf)YTNPRCSlDg$riX=ic`c9{p|GK!Xt6iZ?-pDKSNaf?r?rHmTtU+~qhHtz_1 zV_!WVyWIJvSNHnkm$2oRJ6{a^i-dmD9ZTxo3cQ(K1e!qFO+-_Qy zYX4^?+m@S-2ZH86XQGuQO~hVYNiWK)ilbbK%6gM%nLB4ngd>NAVmHEHw|hs^q*PL( zx>)7%0%{~jO1a$VjZqsYq}M5ig>Ha^2vmpSqYKO-MMlO9ss3)56w_(yFI4@Ss(i0~ z^iC~ozt6Vtt`EQM-Y2A(d6zDuV^?d@hm3A)4qh64*|zb3X#-1yBKI(e2BRTgVVc;^ zEjs=n?lnzpOATV3ce`z(?p91piEF6d&>ehjL7SO&qC#;vR(hgJXbOa6qTa!%iY~6< z6nHx@UG~t%i)_vH$>DT+`zghrln&sfD2VxqLuk~jekLUxzrvrC<*;U*&0uwCJoSuc zo%c)HV9hF4vYnJAzZS?g_~Q}Jf0`8a4C3=%;^&5x7}E#W8E~C;I6m30|0=`!tyRPf z#WyRg^GbFe$Rt~3{rehduBAn1n6wRbd+JDNZepO{5ZJwQL%R7;>w`}ddN$NHawmvw z`<3atZ79z+^r1=f8_G-EE5SO_BYM7(FYw>*X^4sEv@c6rVH!@873R9y%4M@976iW2 z__8nc8w5)mUxIMvU5zh$?%etEWaoYCUFRKTyN>ZCKDq`E{_I>|SL)E}z~5I4?eHz-rYsiLU&H0Jq~h_m%xEs!OQG%YYyUX*yBWS=j`uGKiM z9hw}+hPt8Yaa6^x$lVljT4^n1pLi6=Se2!IPlYRE`7n^A3}>V{yCNi5rHnYICHsDo z-}eX1rDE1?s=UK#78ZHiIy3rSZadke>9HEEmgC{1CN5>I+x~m6H6Vw*lzv~V_vxZ; z*5dI!@9O94LY1+alz?$41CN0JJFq4zVS6`?}1n+?cVNBJ;{D&q&Q4?qr`&de# zu8Lo0CI+1)H8FPz!9p?|)pHWJ4?Kr?N$O7-+L-h-y=Kgk#D+W(#xhmF1u!sgs*VrZ z%7g$gU!`%HL&C7?^{H9f=-u-RqbH^;4iVlHM+#bo?kC65FJl}he*ZWg0Tli?_DGE* z)qnWPcl7;Kzwbl+zL)RR_j{?=yEl>1_c!lO*$-3wUrbu!yfi*ds{@~2PQPEK_nQp% z^Z`I4hi9PIXp#l?j>M^{42NfCxQKdehI1`iEj2$TeuLS_j^B`P<-%lKxEeN7^4zx5 zg&#O3UcaaIS~#&ow6tp!G6)YfNlM6^Y%*|Rp0{scP4~iwHPrnvTlu@=h{kN3W6?MM z#1t^mY_zfAYZL6yIK`Yw@&1#wrrSu^zJu?`YFuhrcKrs(bggY3u;fzTnz-FCsUSf~ zSiq+sNfL>aeZHJO9S=2W8)XTrp^n{khcY`{E#x$vV`SD_SqCy&`HBCe@CzEF+6vBv zXwjCdwhjx&D&G99qRDqV%@2WoJp=nFat1Aab8Mr3)&p6vZG_c{qP@9(tjt@{y&5yy zh#DY}^U2*8(KG+5lIV!(ZZtAWt;TaY7e=_qtcDk5sMYVXh=>y20+BiT@%JCzEo1M9 zUViCVh`@r=5cx#hH0DDjpS~e+2qM2cZfA&WFc2|T!*&C?Yk`RDi)H~jO}fk|1(D-^ zZXr^nwhjg&OCR(hB5Irok-9TOQMRliOKQSB4ltP+6QyRE1IWLaV*N~5{(dGv(Z9gN zRHl3r{K48?p##Zs^;0w5r|N&1&fgjJ?eOzJd_VZ{h18hhZyD(_8_!jp9f=|yEuFCM zeQc4DS$_N^EaUw;?^Qoi<@+V7R37nK z5*`uSeVfA?0If?mjM!^<7HShv+GghBI-zWv<{}8lH1B_i`wYmJYjs{N=UCH^zN%x$ z_g-Z6vASW6WUrWR%=Ei4%5-C9MmG?b^Hia%b!O!Zr-0v$Ztp;KL(v*6{Oq~8oc|dj zc>I8V$kW2_$IZ57zaQE)r?T(s$J#VFy1jeuq#r|4{qX1IAk&W@GB5AYo(Ow;~m zQ0eaHglUa1Cv`Qc`PfGtc%BY;?bl%zZTDLFNjwE6dH>SW@t}+M7d`Dq8Vm)heefrS z4yV{!Gb8eD`Y6R3wtLUTs5LiLV8h2f3rti2H?u%Y1++zilQwFej8XDplgl>k4a?vX zdy}jj9f@q7eDl)`nzA?IZW*e)_*D{^w&?;TL*bDTFb$e}$q}`%VCy(ax~1cc7N?f} zVM-f2xzp5-WZP0NqY^2@;fy3T?gxOlYW8l$TQ+T_T=+A_@{3fFO^nkoQcu`KvY*)_ z`&?!3wAnT8qs*hO6FV|L1vd4;aHu@XhK*L`}jZ>;2FIOYPz5&5Mra$^}X zYB0a5n4rX6*=$q$^e8^Cl$gKJ4+0T)m?*?8bro38xTvCZgTkd&#Ru;b!r1}qLQW`l z%|4sLTw-(kKoBEb{_+j^=B*EJ81dNK-F(|$s-mxrqG;@l0)?kO{fzifwsgJHm7(o~ zD*lkLv?KRn7idimu~X?3!JnO`Nt7o5G{Kg5(80BrwL~IIiKM!BTWF+Kka&IdF-r$lUa-H)=-|0FLN{^5jw zRV?GU!W||y^T&s?zl*8+B?$;694kx+I1XhW6n#?o zG$9`^i&nWs$Xv=Gu}GOA`xaA0bdv)I0L=1E>Mf)AErmhrIiUD8$pPs*Y_m3lZDQL7 zP!;oEk7Rl8;#wi>`5*An#>QJ9V-21u!DQ^V+S$NW7nd&c-WR`)SInejI67>WDtK0M zF?;r@ao1vYME&X0&A~_7-u+KCR*E%rt3X{#>a*&X_s&!(+G(tjB)&2#{An(w6AKQ| zSWjuR(--7ovI0#VH6;gYW-qfwdz~0n>^#Q?P|Y7PU*1%;sBl)1HNEPGa@p+tj3!wy zclQO~B8yj|g0J!f`DqGWmNoA{`j?m}SftJm^f=!uam$U&EWpUO{CIilAnIC4_AAY0 zHJ`jPFo|ddtZlZ_c@Ey60D#zUfSk z%}A~_EVeghtj_Dn$ScnVX0}ZI#!cNwA2<|YK+tl<2%Ox! zQcq`P12>XuGk|do?#(G+oR$6kz`&_(S77KasT44tk675(s0nP6Ip^K&qloTiuC%8% zDx+uR8Zv!6X@Ksrzo+eE!DHL$kBrm0Pk{lkFX#R11jvtW&E4n?X{EndE+<1<7eRYW z-uOZF^K=uQxg?k1om@EgHpeQ==ip?nE?oN%rP#7>K2|L<-G(jil>d@seq}uGdoq?~ zW*q)K8J*0G(%-(T>9v}^7+qD<<=>O>`OJ(RK>oXGl+vE6@k;P@_ZjQ2Ph~piyEBbV zWvck@Oh=?L744ddn~OX9NFI?a#_Smfk{s{M%ehpQSzU|rozjvo^0nj@Sh}dwYRQiR zN?Cyji~(P=DzYp>ha=a@$;oND6lf&vMCmI!2LsHMI(SH1<+Wd&S>9=W-t5C9 z>qz{SSH)vCr<{O8caJkf|Do%f^}FfPGnXDL{SIdJ-}KCD z!6IM3tKyLzJ72$R29bC(6xM;lYELfLUXqM+>hzu(=WD{cAX6f@&c|;?WH|#%?`zPxix#T?U5WC zMw=d`+^l5D`Yt15%0BZ>8Z_&?yKbc`7um_P>%-392`PN>;gw^$_XFnd#`OGMXd&d! z-v-v#4~Ex=j3hOGiCgGo7ke+6@Twd9L*aD;-CzaYH{KA7+f+hMOhN@HNpN;$w^NpIQ7Z zfS6JI+MdP#nkxR8F>v}+qnaHL4d)?~D20DmVTSSI7A4aqbeLqntO)}zIwh!keo#tT zCZexp4Cg03`}5w49>Y0!=l)Q9Y-aHfK*@Bg9@k7~LSyw!NocGF=qVzY9F8`5llvdQ z0mcsdwov{L^?KFRX22?ze-CvfK4+wUiN!mWs8NZ7GfP~e5}S9|@JURqs-a%lQSMLo zn%&j%FeKWVlKx~$`KF}Xl>FajgxWx%5gYf)tEiw#!o#~l2#X(%heRvS8{`MI76aX%b0s`ULMUs zgVGJ9@8IymIWt|Tg|TK?z{BLsh}slZ?HJ_OYGNu9jl^ks5+d*1aW{W)HF@3hP&z`9 zB?P2b)_TlUIOyEVSI%7(aeZbt8d3r4Lb}GOe@g2b{R^dQFlO|Lg5KQT<}}S$Oa;X; zAK+igXbm3sqkYM71(Vlh1pa#8?8W*%MkT%qDjm#wZ;t6P&S&0XWhiO!oJR(+gTVzX zF4lIGl?e#1`Q(I^wbboR(V&bsiW99HuEqz+mhaA617!I(Qx}gNb1|nOI4kol!i>d6Uaw1BL>iw09mUe#hZp z(_YNJ?z0-9+SwEeTm-SJDO1qOSas3J=m(Jx;61|(CnOw}0-?8lL?n}o3c|6y+-UDA z9N;7@OqEQ36bdIgF4C?%3U=~h=Li5>>_9cOle>uQ6g5Wxeq)Q~N6*ElnJc8_P}cM! z+7-Vt9=vwGRF7`&&*%jHaGFc?jVndU6vymubYDS4^lL0m;4Nx-fiMQULP87ZQS()L z$g$~7l-)To%muG}A)tZBS$K$H_dCfbN}v@OfG$4~E7EF3cE}ACw}o1}bHXf|0;kDQ zHgMQjClrNEcCXZVBD#ec6zeDbnGCGy{Da2Sh{aJE^-re)Tg(&BeD3hmR{3f2A8gu# zCBh|4>qtwl=j6F(4$C3hW3DOiUYwA5PVfm+8Po2c6Evs7xmDZ7m$&Bx+nVh;LC2gE zT+dPbks#dhNzis~1N<_l z`9<9t!gfBJK&~?~EL*+aA}k)rtlrC4IJZmP^s}wt?rrcs6n#0=`bkbW;4x+v5#|10 zETUJPrrCykVv(qdzQSU9PXqB!+-DrMojopd2|emBq2y89=QZu-sO?yom|a3mP+c91 z%{*$mF}Z~PKOVI`lO;4~E^YQaYP-3%#}e|7+QK4!>kn$DCG@Djgg&kxlz5ei^6_(J z-B>n+h-+b-B$G#P*L%00r?teX+e+QE47QDGda5z2t0NZM&o>xdwM% zPj?37HJxdxC+1;GT`_TPGvZr^;^TaJ;I*D>j(2V{3Yj?<%mU$7Us^K0%elKU3 z=F^Bhj%_-GgTFqMmPS@G*Sa&Y+SkIU$zZ!g{Ml<|-Xx;5G?pn!Zd@X%D#JPzirpkV z{@wmk1OwL4VQ4Y%pecJ=s>E&mjMeZhtTjw6a3m>$ckxJZUlH60_VI>n(T!(ctnZv~ zVKp+Ft7F5#?mXui-kCO6=YoS|>}mO^p)OxDe3g=BH_iLgwfGBBPD?kKIHpUhPxYFw za<)o+8*9I@A#?bTl9D@@xE)1uvLBKpgWVmeen=e(CUR8JM9^9UT&&c#fv3p2UQYAt z3`y5D5&(fD#o(~NIR{^_t*7VgerVi3;R{aGD(@_lSAjy|o^yC9EW0;v>qz&vf)eJsJWw0?0dR`!BuW+0pjyiHFI6-Zv#HlpfF*w?HhR% zQPg0sYb$eA*{z(wU`MK0NDOuAZ8w;%B-P733w8M-o~(^`x|bNhoZB5HP}#4gb7?5! zY;yM526?^2Z{aRU(3&as=AU^iPCJ>iocL4<7H-Lx8Kt1j`xRLP_vyA5lAFBSNi!xo zB-{eVmsPrwrxHCSex=UA>go>>*;OEe0?{}^*#+HWD$6*)S>W7pG0`K84iJib9Z&~~ zDxF`n?cWkvgHZS}x=De+mgS6Ur@uvs$auIedr81p||a)`5kFbY%uR(|Q(o9ZvywI%Ou?U-ndSc}GiS4oGrYq8q2Z|j1A&zh}s<}#DS2Q9gZ9lF&Z zVT6NH`bL#wMT;O$a(o2Z2LkuF9s^XQnJ$aM9k6 zvBtilVt571ZbFbyb#*6mac4+J&%=q;Ac{G9j>vMj zNF$0GXJK{x{M8y@$suwAIgc!?A>we*jW-qQQe!BFe)LbIq)Y?lH>lrakI7S#%)_&r ze2$dilHd+e&gpQm3xNfsX_E#UAN10*noYtPGU3rDY$~FPlsZgrh)$|foaggls(``@ zFJ&MUpTU_3PGLeni@c9LjcZK4xrSXxTHqaOj6>6cC?ar@Vaxl>wE89=u|#c2UasX9 zzwNTI+7>L(=ybi7@%JEJ1&$VTj#IxG&13q=KeTVSC~DV{5^3Idn#zurIyJN~96O@r zr;U8ykerGz(?5$MVMd|iogw5|fF(wU|488Vs`780rgq*Gc6SZGmC-S|A);Muaq?`G zDI(B%TNKl^3wawMaB!j1bbx{RiJ>^dfFwb+nFy7pm#P}bWqG6ixEioF8I&-`$(w(A z4DA4SO`{us&Xn*Tx)n1}jT!mCYT1=6jzhOm2gk%(zbpW&niLrTh}?Aw zztIk`xyLw~%Sd(?{`r6HKZ!-hBqL00p^DzF^W>ZE!g2Orj$8hv)3mR;)V$K1oN}E} zUvk^FbNkJ}Q;=`=3Xm1^8O*5C7e~SEd>DlT%TnNpjs~B6#unXA>;OZ71?3iJ!00@} zfjLcYFjHKEos{!qxfExPBQ5w`FCza~FXnC{`{`ZLvH0$E)xYb$;17eF$j5l@F@6iJ zo(8eZeSwkc-y!ayo80)wV4te^sdUfJ1#&cfL6lV^7`B<%Bt%X#h9>X&D@3c1-9=mA zV|L!eGo{iuJx?+G6*k?_2p%?z=_uIG4c*b&uCUL)k-~w^&p#7UV*?(f@NS;Q911g< zb%saLp&tWi;c|<7(2b*z!%%1EbinVir>xu(a*lo-ARIJdqoS+Yeot|V{tXZ=l!JxN z2gY(jX^ZO|y=aSbG5-eyyS6wNwJXdTyVp&H57UxpanXW9c;b6M9D#-v341>J zTo`y^VF4|XDm)@W%gO~=c@%L*E^^Ct*ldyOj6N4PA68oAFw?zlYHkZv5t>W2m$P^7 zjOGu3ol|M^v?x!@7UzOioIM7We>R?`^M>8cFT>zsh@w?fob%qE;vDyRLn&E@v@n!+ zNcPA^xWOsTxHYO_)fQ(_XCJa|+~Q1lZ;CViUGgj@&l9F;hTO_%JraqZP(+5JrS!{w zq||a6*xXR82A0ymixf2eDdS#K&%dfjdjb1HQce-<+*J9^dLj_ACHk>YKa3 zqEmNYNyB$M&vXfH*v2mdMJ5*LR_^HF!f^42x@_F!i9@#yi56utmOwKPNj`G&Kz&Zm z>&A}>A&wkTL>^61A(MgdmZa=@VMz?Q9B1%Df~MN(_*&7r7u>cCzO%;wTbm)o&|VP` zUF$o$w>|_~!sTm1&gn~ZL58O2X!SqZ<~@SJ0v|b}tjKSGQ0JQN_%zsJhg*!Ot_#Vp z-k02w9ethIm*}baMI+)v47fdfhvUpX>mb#(o#h`{w@LlO^?fkz+=F|8nTQBo^(ar& zwT6{=YHvgar|Evdf)y7ZjS;o0Ps0J>ST^wsvwMZ2*wWT?h3RqtbKj=A8=PlO4$c{h z3w#$`S_V4+hLhYCUS;HCCgn7TK|&Gjq}*xC>7MFxJ}k=)Ow#fZB&{na+6F#5|T!Lv)?3lRiH)cmK!QxC7Vbv?3}(BPbX*2yTu?yDn;VLcLb*Nlq)>E6Rq={YWCu98zahh2eVo~jeIo5$z*-ee zl(vK-A6PuZb}=N|88D=;5HVcdUcUh+P9b7dydSsKFLjz80ajJf^`YWLRq>yIi(i3@ zRk6YNmJaTV4`?Xz5xBUjD)3fS`D=AIjdGqDFmleozTtRvpsM`!h8hws;9}(JUL)sR zSZ0#ODXAApy_M8UxlUJ7Z<4Z=)LTi%D=C|#93^EdX|R%V=x84$5leV!!yY7sc-CGb*Xw&%VX^0%S zR}vxv>=O|Ax9}wTrlnGre*%}wbC4zrQ()O3x@QQL0SjyOe+*bw>*89N08xU~ZaN9fYypjgLGKM6sfz1QSDqd>RAEmti$GG=J%pojNfZ~*MSa28)H{`&MH4*4Th&%0^Zz?;vU-G0eg@wy=& zgrZwQ^WOMp%U?b_YW?KU{5zI+Ha~UK$qzwaj&@@|;ga7)?63S}lN%e`6>^?j&;Pfp z_|Nb1aA2t$_}pz>dPpenmD{@b5P2O2T0=aMrB#l1t*wWUb8}eR6YV_h;D2kV{EZtQ z#vZoD&w3Uip3u%yQG1^W-a` z(icOmtp`%&D^-D3mV4iZ(Fz?1Y&}G-C%-deSKo$%=-heG`PM}m(;K1E6{?EF&1c3z zP~hFVv3F!m->UfKUsGRK?}k$=V*@#k+o7bm^O6vxwsxC-kV#MWD4kxQbeKv$PMZ1d@ah7m>2S6@6vr5d zF3NNEL+(Pg*rdD0VZWTnf@xb`JONo-hWtDu5UoHq9Wc0X+aj1@yNEGN&`4VGp-5X8 zseepjRdh$V_}i-D)-&S+_dX-u4^8#ea4}|{eYKu+Pj}?oP0k%83##w ziVw!qyWhUy=n6OTK^J%3xPe#0>_s%qq7;Oxa!$W}-S}AKs@7?>A})b&pmp?|fqRgM zXw^Dxq7r+h6Opdk8%8S;$!cu&=sD*dKvL_p6P1*m&WD86-f*xIAypgKk{D_< zH$_HJD$?V0=6E#Lz0qYRmL>6qjKCukg(^=h#vqrWr6ta=ah8p`2QM*`*gPDQUZM_p zKeZnxFVWn}c}wV5VlOpaz9JM|8IFhhXN8>+E5gx^Gvgx%G4pSPi@i|s8zIdyqD=uu zIdYJ55T)D4#=~VKt}>|5#6(xcFT!XwT`~t#pQWjfbb}7tK!*@PCk<;~Nis6Xrc&bv z20je@G59bL<7FH2%xd97n~+6BO?vcS=puzf#b1Tu6TvjZ8L$}z&kcOT??G8(qX=tN z#L_q1{LOISjjHmu4L9F!)SQ83;W#)@-eI`;c)0m_W$-RAfFyDA@o@9=%HUlvE0V;` z$HUFfD}#42|0Iciy zb>wNSCpN-ZMQafQ(UY}@)o&nx>*p_|Es}qz?!!&Y`apAd>o-EW;uUWECYkh+0z*YXFa+HEbG8T=bU0^!1k5c+DN^{VcQFg%8%)ael z(G%vDSehdX1EKhtpcCp9DU;p!z~Nli5-#SB?r#Cvb=hQ%>;Stiw@;+q2Jo;^QqTk??Lw>9ifig`1X2JxVwuY~3~&|OH0R{hv`HiljMoCvUd zkxzV+rLQSV4Jq&%&b5Z0g2X}$^3r25&gMy_*G}Ra872VEo*Cl1{YQW`6aND3&h4*} zh=CCkBN*I#JsOnZG-Klz4zsN0bX2inSbMfPKmQnLO8IV12>ZmNbmnEL{(R2C7c5dW z1u}LfuE6an?H^IP($1Ij4D4Z!;SOM8NBzdcpX3)cw-j57@E-M{A36u>L!<=|FRlM9 z@%PUefATx*Hzx~WRi7cxl>ZldCh78Ae}>vH=Ttw#GRofu1)VGV*Q7?-zg`5sJ%U}2 zqXV*FN)z^)CS!{qL5kTy)iE0{@Kfn}#<;6+5(WMR=mok%ck9_?-=?kA=ps%ml{4lA zOAKHn@Sr$1x9Q-BU%Tw1nqKeX8^jF!`F)-ohEPkr&6Nq{j&BIO;YPQ*D>j76KXqmw zK^fUO;scL&ixZqG!ev1>=NY3%SIX#d7}?l8g39FUsd+=v=&_YlsLTPB!B`<>a}88x z7X1{z?uXsOz#F?}OUmxS!hj55_xQbrBfH0$(ET08?$HmsN58((yx`H{KzmgH)7|E} zn~{J@STO9w%J8wZVJZo=vV8RQEgxGO#w$stkG{U?V{5|*CCT>D*SCFaZIGB%E8|CB z-}te$;UFc+`q9_7er#>nQ%QZ41hLs*j!n7FNKdBnK&OxyH>Quw;Rwr1s{$WK)&@d* ze37((Bz6F2i5!VPu*OPTu%lCDzw9~vWCnt(Yy!V(*r_R9sq}${ghmz#ac}%AaUeT_ zVsZwK@Q{H&7CVB?@x2Ya`wz%a75xBJ9S4VrLIZ+#MOW~0{TBaaGcRXs=B2y?VujU5wKFdl@A;X?{< z_$T2UHo4_jZ)zCG`hYhezt*DwDxIkGi|pyC2Z}qLl5( z;(WZ%>esoE=L%<$Ijasq)Y|xUCxw!Kn<@< zMdJ_JtC^CF!seZ9tdeG^ASePaOy*pZQ#^+DV(>r&X1I z;WSBzVVSNWKlDK}qihl~(DLQy_d!Xflaj5)m?D2kk>q^<8;EU#kY}BgR$pYDlup7u zG90yje%uF8TOg@#3Wzq@+y^ioMp_+I+QlV!{C($r08=JA10J45W6CuI&F1NiLtO#i<6 zv23)|T_eA~RcSn{-`~eE0()v(DTRP_>(W%KdF9NvLF(!@6tO1{jkYSQrGN-q#a>cYIiV;x_D`j~Y^?-QXA-x;okGYmRMrH4FYx0vJZ$ z4@Ws3urLfU+ryGshe7eWvj@Fu;*CHjc z5L474YU&mjVMjfaQZ)6vCW{QzpWLt-AZ5!ZiZW8LUu9)3s;4*Wy@rl76s<2*tCU(s z52=$1TE5z8`hax{g+1jQC~RbLE{+%rzQP?!-C!ncRkm8QcP=hvs& z#@l&CZf6|#8n*@snJvnqeZ400=>73-Ibr$tQGzY^DZgSbyf;dYNw|cVI(@!SZQA#H zpWHlNl&vb?_hL83~MrQ^y~Ivxh8S3soN9*j`x{9`d3fUMh)*U%Pj9$1IRj|1=bt0`C!Ha2u(AQ zW$e8l@uO-`Bs#iF+e+l5&!!7Lc-w@HB--KniEE|O`UD~rA75?Az&fwuF^ib$8?0_{mu!s zet`VWy&x=N$(gy{S?60h6U-!yAguJ#qXO)=q4@Ot#H#n9t@!d7clG}7f(R$_Cr!l@ z|6EPW(bcfYw~5>mdJfvFfB3O)agRBVb%Z&ubq5BR51giYNgvHG&QlMu4Pcc<1MSRJ zB4m6Z7&ea=>7&Lw<4yx$fV<#KfXm7(z&?mP8CG;y-!a2XLHQ1+=_0M(;vH`Me3oe? z*S2A9+)rtdu6$>9KRwCYf~_$2RM3xCe8%;#*|J&oMIbzteA;SSCL7h8f<*x~fp6V- z_BV7W%MC1JkJl}Kv#yUD+s}>Wv2t?}^$lQ@fT6B@y<_Rw1NynfK}l2~ieR zjNvXRiZ$J@?2(FbXE#b*n+h^yxMp0Vvp-ZU&y2r{g(lfX^bPM_DV_?D(LfU}_Mv;@vfrX!LM!ZFNrx@q@Bp&$!PYr?u+o?!+dQks+~!BBlB zu1!%W#(rl_zHy;Z_j1t%3%!2h7$Szf=wk2e>~E|$3Y7AbyKbeB1aVM~C>K#I6Nwiv zFwi0x_@GgTiJYVTTxrHAF#qj{$V$jDJM%gx+AOmfQn4j#J~iV4UrV}?SL-T4oW`&S zcg5zjfU)@$j&Y!hxCitCV%EfuKBVPi9qtpQxAL(+wRL-$;|*W7h^a#07Irs=Gu^oQNaPcNgVb-wDx2M0MN)LT?x2Bskn9k>A)k99K>k{afS zI24qRS@VN$(RI0?OJ4Rp0NV`dNa(7AN)r%3PzWZj!U$vRODI|UpkxhADp_sb2a{~z zoTV}vy}6TeMemQNs8O(Huvn~uHQ#7Q!>`^nO$rv|!B?;*@1$UDr?zEMu%5;nBfKLkhU~JvXr&t=v2KaOmVP^i@ri^<}UQCf>*(E8}VO z?;h)BZ-hs!o7rdbHDF{-93no^bgjfUBD{yE>FQv*RwfR3hrE%BKU9HEPV+i&CADO= zP!B*c&RnP`s>&QCMk=neWv2OM#&$>DE|vL8ggaw#ccXMA){-bWEMFclSOrW-?Wi1f zJ~EWX1Y<%Z{sn8jDt0|&dx;zs-Kg9r7KMw~Bb3j)5DC7XaEemH10RJ0pWu9nl0AWJ zH3f-0sJPsp6JNg$)sC)$e(!@tgexf$O`wJj9$E^NI9@%(p3*dr?~vw1jG|U`_dY-- zw=KxiJIHJ-SfQ5=;q2l=Y1Pgt}r5!26rx(o=%t}=&) ze#1-}{$$Gg^d`H|`+aqa)U56P8W=I)c+QNU;e2YTjBO9q|3`=FP%|7Z5uvUOesu>^ zobh_MrYEUH;)xkXiqJApT7jrTq6-^hMuB~WFB+;p3?sd$00kvxh@%@3!xuM1+UVoS zha$SM8kI$&jP=S{FP_~+67E%5-iSM_$kw826u=2-?f6rzprkah4tIFP6JxZ?q)Y31 z0ygn9U1LYE;ABa2w1Z1=(h zKTRCStmELzs@1iIPlyGH+a>ywP8)-+rwtK~S+?%;}qbAKEREU{s5?xOc%ihtzN~anDzk3U1tad zI1V!^%kAv~57GJ)=M66aK9N?8P>XY?L@U3=6w{@>5EYqdix{aqS)~4D^-l z7Tp^XsLjn*o8P{TS)v8htJKX_*{5b)?y-Hi$i+rh3^>SS$z%Q+trP~WTD|cT81zJD zBs3plq<=FLjj-j=bE((kz)bW}-^qU5Cmlj8gb+zCRHa&pQfDfyc7K;GIn5S zk;q3TFi1FdGGO-_8G?5qbS@;zvTgKnV%6eqzV`8PS>7d7ki1VZx;1$}MC8*6VCbl; zaWRigLYOUe6_pYa=Z7VozrGC;HlqM#T=HdPMiG2=M#;$N)kQ()mrK?E%E&jpgU-Fn z4&90Yv~EB7Um4f)=!oQz846OUEF7I?LN4{V$ZOYQs=}M(F;%mzrj;I>0sSH_mummH z>O%+&2AyZNdXFz+j1Wu{e2snm$dU;ej_k>Eb(jG@$vlI4aqdoWv~Qs~Y0dv-90vU3x`EJIFf0J`6vcaQR=$Luuc@-d;4AjYnu{ATWxKx)<%ES>E( zj^yZ%GSET6A8l~oi_-Pu<1VcGfI_A|`Mk#m?VVZ9+#Vw>UykqmBpxGk>c$~t{^J#a zMZ(*0aeajbsL)!3PAne0;nB%I_z$9x9GlHmcm}Dx#~@JGM3tjplt%K79IeD+&W;QBckqy1Y*y4*R*61!_!)CseNMg%n7fy**vxPh8v|%vc zc*SsPnG$s|O7}m7lx4wv@RPyG#<#nLqqRlLf+vvXVxJBMsRVC3_(0B{6!gYbs!QU5 zM+4vV_U2qL5ARtpwDSC2ZuB~$`?N+xf@=!7b#Z2XRrFi$6*G$$mvF;DkuL1eHICdq zSWz{ik-K=WHg-!GPtsujJ37HRX*Lw!t6!@!vcKyJ$16G!E9V)!EKWDo`F^_kxs~IqqODaJYoqN#wAZEL z3)$Gq`)r)#B+wfMNdLLtsQXz5tmB9?%h<=S)%cs~vu>&bQVYR}3zcO67WrP$wfnD4`5XU{kr`%Xh zE~PW~DnvSsY$;?m50jG*HIe~UZ61*c3Af=Q+a@om(Mvt1HZ{zaT@uP0h2@Jd-+7_++a9p)jh{6;AdsYVe5?zo4+*VG{cy z3S8dm0;LTGRA9lr?ZC)V@2)vow0}E;m7HsqS@-d-<$RY&#t9UBcW12Ggq>XLUUu=VT0^5OaHv{ek^uNS!*>@>@zQK5X9Gn*iVH6P0By^ zvJO{9aL61WGhWNb`1TKA>|cbmm_9&Fx!{O1(o=a6f8lL|)3ld)^Djaw1qV|XA<24} zx(MlMUbxGaGFXW&CL7lmaX^Ka7c@No3L_KBs6dF5=ZRftxE#(#4GFP%2%8AS&MpbX zLvXs4h&Ztu=rwi}kWNIgMCwwJJ<5-UoagPgT9$vF{9BMPY7wo+d>US=3FebbX$8`f ziquXC6|2#*`ak&BqL}InRDGV;#}uMB%4&|zH0$^lL%|qUZTp?PmWg19+SPc|bWCm1 zF-m&3vk9#h3Up0s(hm4RiEhZK5%0Vv%tDvz!!(k(`z z_~-(~)Er{2Es{Y>{ob2431X7I8>zx?2@#>Y{y%>G+r1-|Ol;t5b#>8Da7O_ebahZD ze!d-@zH(72cL-r2WKad()9*1JwgOX^`hIY{g)DRQPO5I=pDNk!`@9W2G-hkYJF! z|9HE1hZ@TS)ibK5=l#c|NNi)%?bF1szgEo`m9X*%kb7-rWgERycCKt{kIJB9-ub4o zkLw^LpCl?wWuhLs)+lwgQmT9FJnx;Iy7!}GjfSF_!F#<;TIwF9*HPb~j&71PCgWc! z-tc$czqk4{vFrc){d+%xv7+`$-jc~oQX{kS#sB60J)Qp2-Fqmu)rOdT1m1uznfLB( z+DE&);x{ZqUG~0@s15gRaqnKrUdleLxqr`(XC5A&ynpX$1_x6{6oF;LOoh6CuO520(L3R7&6 z@7vp_Xa9QJ{yin4k#XN1$0n_8;@`LT?f`q=o}?KL%y%}XWfQA+#dF>|k>q>SP)2D=+KiU0;hnW+ZyLO%5Y))G51&C#d`}a5jxyOf(86Q5H3Q14A{rLC* zJ2yFO!pJV(yTlu^cVB{>)uC04$Xk{bpjSQN9g2R50Ew3;0wg;>Mpg{P&&f@^_LP&Q z`HEC@oZN_fx*rr@*Or{0*W7a3k5cn9k9n7))fkdzCK4B+KV~#AWiAV3AhDY34k4U= z-C?CIDS0!Vvw8U}fZf-m@o+K^!jC?rb-s}t-}jWi`-ha@Mf)NENzS?(jrN7NYsJSr z?y7y|8Sxk03wf(zzR3dmcxPcN6Nk?QqKl2npd=~}Kotp@2) zq_XDAG9-0Nx){ph+LB4Wt~Kb3p{C$PCnG4!+aX>tR#o|07aEwfES3q4PO|F*ERN6i|z$2oAzNk<7!a)HQ?%<8WM+VigIznB< zhfSqp`XqxQpDyLq8E|jm!+Ir4^%RV|?G#(6KT}4MQ*x(D)Y=k3Qvxe3ug-uwjbWNz z;0aFq8eJC0K$r7Ff<4LLr(Hz>rl_fKx*quF40y2cZ#>iA%L{}2Mfu>b4cEhizvqr+ zTgFHdY_FXGkD5(*67DpeayabVVS4kA!ZqgCnlrT%mPJYRGLK(IbEh$q)4`*8M=Ni# z+c|Vfu_E-(yIba`c>lNCZ&Q=^nsM^*pcyC+kNU7;mMcD~izpM(>P)lMxx84n2_ERa zNu7|-3uowg;o(kWX~ie2h?jd!|9E)NbkG@4Q^w1q$?@6)ws>;6I15g|4Z4QVQ`2$C znnOpO0r%Z!eja|z{5&>~A2*tF0e$kmHUeo*70-lD5eoO9VB9a5Xp@iuARxH0~EVeAX?`7mD$#9uEt zGs)scvkOaGUYJbsLX9f9eojAjlAxu{C%a0X(<2my`{_ZRw+<13 z@Ku9q68@==KXk!p`MCy@X&8h|;WMvNi$RtadPudurX8Iop6m<=7vdlXlJG(3JlFh! zBIegdF`U8~#CG0O%Yur`!pvA6-hn3>f*4+AunxtUMhS?-U%MY7))cR3zQN!di_X+v zD|}<^^1=g)$)rvfzOh7Xstptf?i7JL+{9K5E=>TJCWA{g)4`W=>hxZc7#hntmS;cI z&JV*EN$5WWU%tbhxAdn5hh)!N#A6cgzSo|2x5S7}(N|jSW!o=dj#`S8 zF(11CVp-#-LM88-$BjuUpUKjDhPq(uli4Lc>>tMySDD?8a#<}_W& z>XvMefG_5!^Zlnnab(jfDSbybZ%o!|&6UlvR+gk9H_q;@Y0oU~k%dPoLw;JMW%?fd z&m^XjGxe(tW1|hb=Dm&zS(n*{HE|WUbKp#tCY(XI?L^hoP6~c@SYe4^st}y;8$2oC6E64T0=b~kKW7UuGFK4JUZ26 zVPd?6Y-XnAQIQPqLGjD@px+)1{fqbiRf{i=a?D5)sWJZ3<-d;?e@V)tgVr4*{w3*i zSlAS-$e|4hpHwyH$fU5^zkx^cxrW?GuuaOTJIkn3qP5kQa#Zg`IsS1Cl;f!4q};lv zp&aSuf_-@x2x-5hnPUEa$?ZJu3ZdQXmz-@fLSOHbW*bY<*T&+V_Dd!#+%0`Q8#~W# z_De2hy5V4-vm@-2)<=dIdMbeZfc=t16!eZLO43g4m&{EAAj3YQ+ilO)evvkXu&%G@ zB!1uV?mR!_Q?GDrCOY3t%oamVQvi%R6q+_1*yy&d%jw+D$JcOtW^U#4qIL@l`0U*x z{um!RQ7-Xk=IQU~0^{q)(~-E!7|))-CPfy)77>c~JJ}gf0K?6L@fL)mU6K~^u(OXh ze~jhnQpr(p>U>i+(o(`X;Sy)SPdZ3**YGDub=7P5Z>n_$jOF=so<%b8^d+!o-N_xv zbsoq36X^_uBA=CbKd=16n8DV|c>Y+R{%AMS&iTqu$##?^x}x-QPU)Ai zQK-PW6?G`CUu(0y%MO%aFe- z`Yz%nG5pH|WT}MRnIwX6nADl1($TT;ekiT&?)Hz|(nVwA z*+=ulsnbyDGVf(%CRUlt0nWc*&)MW}v&mLu@yEZ`daLX@#z-aH^p+j1RXYvC;S$*o zyK*98bj@ZlIO=BJVJ@!aTN(FqQLb>W%ge5uM%ySdZPx#!YwK zV7bK)r4=_y$gvo!lt$S1dk;LuzGL3&F~i9kxyG*CjPYY1wlH{}8uZUGG*HAY96JgM z6fRz4*}umTW=S{xsohX?D^qFCj^jD~i&l=II?uc)=e*`IHk;G@tpEW;as`p+^|$mL zH`dE-L(1bzH2Xx(;nm%Y6M0t%p)Xe_hLL=lj8A*yOZiHxs@C28xbWC86_76zVYTAA>04QW@j5nb0~1Fckg~87j#j4eX;(S<9ng#Xc1;k`Su`+ zX?np8VfedqjpLA|cE~hkyv13--Xyq^5ka-jgvoQU8(_K9h#S8ei=dHrp6{~LGP9GV z7o_`dGm9DZ6Z%?5IU@3x8{4J(6!4d$2rP3}6JAzd9gLS%I=}c`8s}kltiasx@F{t9 z!%*YiKctbB-eQhYw`fLWL2F@vQm04D`=}^|LzNe^$1peag6&>+-*D{5gkBC8f2A`f zx?)s^c8{}|kUD@*)O+Xl{z>#$4M-~I3B568GsCg|7pVjBvrPvUsco9(tR~U!U(-|) zd?)%|PweR+gW4|gLQ^A&S|E&95`Ly)uKUaU{b zXa;hq4I!VeliX*4s`L5vcwX`nAs zsl3pkMPA44Tz6)Sj$HO&w|apB{=%C=utYg&Uwb5k1poaw2h;llxw%l7&fkPy*p!^) zx0$#0+nKi!2Wj4rUn^zN&P6yeG)m;jjol&BIxNx&J0m$c*>%W`=er6f6~C4x64OWY zv?XEa!11B&_)X#n`z9jGjW?CHumCx1MFgG!Z;K>MKyyp^O47!u70)QALDS^=~ztmt3V%V((B?4S!!Y*SlHurm8WhhCjTpr7axzQaB!p zjw`eEu|09H&p&kx4{-&B}D-NXoS-?_Df{`ib%6!*K@drGQ={a|fB z=$W@SBgZ!(U+sg!Fe{^bZek2(=-zvWi{rq77&G+8`wKD_yPPE&ZTOfgir_kC#9T06 zAdyl`{|#%jy;bcjN$&S!q?6|s7?^a>zu?_7q{lLpQF$O4=uGG^Ms`4Hm#LCOW7eg=hTQ2QFLctQWj`FYgM&$jn%hz8p^qbg^sYy-|00m38W`;_YxWXMEBQ_M4Q*Gft5lZ1LXblZsCbMc?ZDySA^*Cn?U0 z`6MPcM0?Wp)M@dKek6-;^nT~(S%$=t_=(!pCY-GTPk(QwseXelmH@R92a&^=G5q#% zhC=M|E>JE;E-#b1-$C#a`6lC}WJBHFNv5KAbmDe(VhNKV7Ye_Y?OuNR>-&lOHQRK< zA4zOdp4YXv9p#>ycmjSX$9M7L6#q+Wda&MbtZdAv1l;Os;Agr89!I(YH+DX5w*`7V$CAA+KFC;^8dUo-&%JX7?q{VsAkTSi->u}wHwSk z=+;x(?qd_3X0hr8Mf@=rEo?yE-MDXK)*11U6|yUuo^ohK7B$=1C~P-qdbljeXb1q* z^iN9TvWhU5av(q%xUn12kEV(#ZUhyw?d#p05*#lrG~9`=e)=zONVf{?sWh*wFq_KGsI+I@S) z3C3RWW~j8yI|!*?)I;_P!)!}eN(E<&XZww?pf>=%r{GQ^DuboX@+*5yCXO4qMrksX zWjI;SV)C+rv$!m8A7dTsg>{KKPtOI}S%Dask^ydw|u?R{9BsBg?$;5iI@O86ayubDyK#szr zvBIO)wHtjOQ`?FAvyh`7BiOboslzF@dLN0+M zqQ;G$TU(#KY{XSJ0`<_q98{7o_s{ zkZ%|**lOg}GqWXZ4*SMIzXqYOWt|43usNXpN<96XT|&4Os<0BFOeS@zN!6R5Tws!) zL-mqGQ;_mY)=_0&mUWum7UYo#+19(3df4nb$$a+Rmbdwzk!LtACni_{*Li!NMz~Im zFH z8B5Ytznzyf-8;8)6yr;^^BY^d{^ibJ$wfWS=H`M(!{g|ct`JM*zQ*SEbtU{@HC1MP zafWr5qH6&~s%WX-&wh+Q@ro%HL@pe~*ix<4A8fKq%IlSENt{d`w|8kMk&3$q07$3# z1FFt&Zl6gMfN#Cy_JM0YZ|%7iHOg3ja7HHQ=WW!Xj5%a92ZR<-xee^qx!Rv{R4{Yo zR6+s6-=E=&R27(>c~|!~&~}=BZKnCc!h*yK?FvRJy7G2yPdj&N@0XC_#1>vM+fzS# z^e)TKeWh}LPOa(OiT&v(jof1z8Q-JWB)?dRik-uYk;ZYq?KzOA)nTdDb|8P~WzmM^ z3z{b6;gW8y^G`k=rIU1kx{W?*ILq<`K0EAydgL^}+jBmgpSSzH`i=5FYkH;Sm+q97 zAz{I`*N=2jMr^10`<)u&Mh6!r&X6l{q~doh>a6;r9%DWcaHuDzs`exOm*2gKIsWN% zmpjcxIEXKqjbh)TO{has)${HPSV;6YiZv2vqIFkq<8-ZwgZ<`8)ZD)^tpBWo@A6mh zofTjy|27T_u-!6m;hfa@nX(?NENIS^94tqHg3@gZp>2pI1j6!9z7%=GFyV${$L_sX zV-_+@&Gpmja4|*Q@|@=1D0BRBR-;U*>%5<>Mf=AXu?2VJyoH43$nv%qF6o{>^)k?b zLX@9&#SINpqGx6=8{Ov$Q^&7NgIvzI&O0Ncc)>#B<}i=q3$DLBRs7m3>T0G$$72zt z`3KTP^C$`n$Q)Yo{?}v&xz*MVZr!rrV2CObrT5k+7K5=8%dp8|;Wm!VC(3~OlvH`F z)|mO)6dM=c6ZpF+`p_;#?^MxKDeB|1FZ?kwTV4ZN7ChK5fAKEm!zzCv*gMzqr*X#p zFDV=&56AY9MYqO}&MAv7jMKYYt2ruJ3>1;gjI6Ev1-^+CF#x49C6ycZgfD z;UQ#GNDLn_uJ=ALY_8Gp8Lv^OR-x0*k}TG_+) z@DBlN1Qd+j+=4)&Fx&DlxMAV9I<6u#aG=aqif@*b7_ve+{zi0m^tbb?Xs~` zIilKl5$hOXby2wdLyKP!NJO7wXRc%sYSMpY80O9bi}KfBXYwl3-QS%ll*%;tyEBP* zBl=L&`MYMqzqvEVmwWI(GaZj^tegjfXKv3kK@UisTLfIGN8W@c+c~Zk<$Y%|X=||? zJe8;o69yQ+NNKc`fFI&yN-^uxrd`YFycst)+<9Wd&Iw1doB`aOCf~QI9q?~6Vc%Q9N5UfB+HA5O{`n6jKUXvQP&OPobVHz-xNo87ZYTs>5hov$dv1?6& zVDGt-8yU_n@GA?)Vird-K`3w9m=8i9Y@iQdOP?RZM*Gb}7dvf`TdXqi#ydlow@i%Y1)<1)KSP z%})6j@AO@Vc{20=d8haHQu#&SU)3h>8~!fSH|L@!H-7pUoejliwF~&>PVjrc(Hjpn z;^YLOYvU4SNsb3q-L^+&F6g~ea%eo~xckQe8Mvf0YtcpQz-*TGZyTo5-CBax3P|1j zJA?nh$#~Oz%@J1xF=#$<*EPW@B=W!FG;cSvO@3wk&G%${B{QRZ_jkcIzsCQ`%(!IN zjNSB92kF%PVY%hW?iaC3=`^<_3&#glB)k8vN$Y{NVUBcg&5zS8w`gIm>Hb&Wlku#~ zjP{1gDSb|Q9S2gM_pvlC$W?-KELaJgLz0y zOW`ls^5&m!v;C568b}_CN?wX!+C?WaRV=Uo4?UM=p%4(gL5 zgX6WRpzm1yKQbzpT}r5#G*gCmUZDfO2k4L9sVVAT@v_9$wJFV8+I6e6>jH1f&#eQC zRM5Kq<}fZf5me}ws=u8{j*ZIInVE69CZJf8radKJp<-*ka3$TP@uO_xEiY-lKQrpR z{-jj<0uhu-CScP;!H zY_K*N|Ja#KzZ_mm$)8F83}akt{ItgM4yvgMYTNE5_&mY~D7bh{+Z$)O@9%i z)io!N>Om*M^>3C5zRfZcg&&AaA2EUR&>mIPiddqz1zQ9 z42W|6J_tRiZFD}MrMl6~)zu|#d_;i|h%FlKUDLfa;=*9pg*tEF>Bg$qWWTmRoAxqo z;J9_RM+ZC+&dGw=1d0H&={l0`G_9h);TZ0gBXGD{!#Ih_pADXATLQ$=?ag(iM7P9Q zrY)D5iEgQaTjUxCsc!El3(uxwt4sv;Eq>aso;{nn-stW9En@%%*3bNMmKKJousjiU zFuN=^VnU^HBbqT8SNKZ|YGWRSo)g#V+}codd=W$Dm^IcU5sC@;9kVeOA2wx}g7Xlw zWqVb$%kx^!Wlo6lCEuyZxDj|K{rrn=bIE{Srs6Fw8#<7fY$x$w8Zh0PS#=Ht*?S2` zAJM!i{{9+%T@KdFA`ck4$$!-eEM+ZWisi^lUrn|GbvhoACyGj$$Z7G2v{5qF@}qg< zQ8FCMM2|W_CN*056$21N7?B$=CnE4$u_#%GAv7L)j9lJNzWPGfVo&Bdi#ea5o!tgC z*SJK)AVWeH{ZFsoL?hOqxuq+?(CF$g6Xr@b33>}|*PwagMmjD8WJMYjiL$(U;=mnW z!`Xdr+sq24j_p~&k_6||lk(Fpy-Hm5N@-SlzktCO5f;Na;{0Ais zqmCU}xortC#_l0OOSypGtc7{}@d~oUZTdfsmBE*!*b!v2Qlg75WMSr5YbggOLBGV@ zVzx9=GSx$~GuZ0RGL`Ai5_YQmBPEI2uUXw`UT)xnd_pYm#HB2C`>swWM)PXnS9!ju zlJ9fq^EAU5V#k(lpJhf=q7lhEy-YC3@oxHTvEg19010ug9sRK7!A(otNEran*>aTh z<7}>qUdVdDNYF8qkc;tSUtB*EqFu57m$NLSrmJ2#J=N;$D2e8uo<-jEPtSAhqj|oM zXI2`uKT-HFzjWs7OD!wCaEI;8HFSnX{=uteU29samYgg7oG17>Pgl;kJ!HoTzQ2)+ z>@f12u8D{Tk(NB_`Ffk`p^}IBN+kzvwPSzJujCuH%>8Cs$l=Bq_A{K!aGL)vk`SqQ zRuxe2<1cK%NBx3JOu>DH1{i7zaJq&3BOAJkG*Y)OC8uf#PV+?SsnijDu>*rw#?1(i zt6Ulct`}mekg{MT7-8UKrF)Nj12V8)aDbBQ5jq&esv2}$PF!W7*&;>OMZiB^m&E1j z99ul+wng@v*+Oei%J!4J{hBNuPEO1ArpDFX9qKNur`y}IV=<}$W=TzGx5mN_t5fJb-qam{Qt1_Ch$=g_y2z)M5D!S@M>BQ(l%{F#S*HtiD=!( z^;z9Wys<^asu=4PHBnkr7PC>d>ng2BZM|r*uH zz321U-C*?F@Avo5L)p(~W%G$BKlEW^yJcRd zuBH*M@BKH3MWtt>7n{wFA9&2i$Ja3b@DS=g?H3F4lbQPbmhdfiCSMb_sK~#*g1#PG zn;MY5z8SXiaoEp4My-VO_4``Um*yql~~>R~dobVK@sS{Qp8=mmTg${ZnR8 zqy9CZVRH7jM*0!h$zjRI!ji94QgT27`@`e{fnCNRloHrI@A)AH!J!pS$a8Z{LmnS!) zumW*S_~c87>){jBn<~*4fej!oBeIH1&MfQC+NZk3ssEXzuKH*olKSRRMp8$-58x#v zb@m!Ra(jlu|I1Anxe}5(kXgIp1ASBEo(m53le+`y8totHoBkxVch5j11#x)!U7V2i ztK1%I!2V0UoGH-N4gK^1_lwog*Z6_yYnbz0=nKKQisf2?zP1v5ZO_-ekC*tv;p8;G zEIKv`dM0|=fVk%H$*1ZmPE)(d`Av*Wy;Q>2fWFesYQ;f{)ovcMq9mRz!UY}M{f)(8 zyX4Oy-!fGAyX5r#gY!@Tu%hd%GWKFV6Aa1hF{LnQt+H(x%(Hz@JX|Z4vT2kedy2JJ z#Vp_qlYi)SH5f-PSmkP>_Vn^kGI}4IqsPk9^vjffUBMq1Xc7!Z;g}ZKu&|C`d73R8 zRJz*qoV}ujpJZ+-oyEifnyiieWsC=|fGz37qV2VavL04awNhw5l!``ugLU?W#n!wtY)&Z5_{s zhPcqq18VlIEZEa3d*|CcfqK=N|LGcVUM_oeabI3O*Ir&1$`9$i(e!!Y=frf%@RQ?g z$EY_N&SJD$1$?E@o+qSOBpe-fX*^5+*V}iXPp_`_eLAp7>oR)Pr1gkc$d(+=@BwZ$ z)>{C`H2i?WA!Zg{=-5}^$eO5cWKYDoE-Fwh17Xn~N!`7FpJwOoIInpGHH-WTbmp$_FgFlM1PGu{w3>HZtFKQ z1%BOrPCs5P&wS56R6c*Qy=uI)_wOG07akU+5vJzQ-M`V@|2O`0-HIX~8HhifOaA|b zKTRsBcOd>W(&}YTtb{*tSJr>SpLX^9X;^XWHyZYzJ|iGevIyw0m+4hR9hLHZu_?H! zkXF@u7w1zM!I3{Y6UPLMY1+l~kyp3cNs(7|RA@=cuY@p`HONR+uh*auYZavo47B~- ziWMU);A(@Ix>io{=wWj7&=x%iNGl^jWsz5>`pB!3Q68TO^JItubIeLNPL@$!c85OY{j< z2fKy3+F58}@)-WEyW}NJI3dm5PBz>pT7Lt zJn5ixjeFYZ5EwP<7ga)ea;ci<@%L<4{erY_!{VBW5>s6L6ugZ=O zkX~3-_6KqHuE9SP6D~HI74DT6(8jZW6*OYZKgJ%MU=C_@@VLqiLMI@3L7Z&2@r%Hi zxk5$7M*UipfycgdFeb2qxkbVB<=Bh0n3lBfFy^eP_Ax=`bIjRW@U?l`OlakB=ky?R zPD=IV&Y7bh{DMvQrvAw#Yu(_k#`9lm(0|6UKMU^kZ?AFR(fyhqdKF%s89Jp8!uCnG z`#Yt-T49N7)$4)zZJ^DvyRBv3>hxxpzlCt>=7oCB=7Ns~@_0ZV56EZ|6x1miST$7< z)EZZB=0QZA$ZYJxo?vsfb4jwN>!CV98%Ah)FkLngUhYT{PRoI2Jm7dKB+g7QUwwl~ zi#TVt@^a(&l0LTaLP^&635-)Iy_DF^gppI- z$;fy01`xLq5Wr=r54GGGTjhzKm5Fs%>(24P;diUx#d$8X?0sk?2b6mdFa6q76ldk$pxhtu(toDH85++}<_}SB z&xDW$PlE(+10tK^wx*s5tvo}HMzDI!pTM*(Krxh`cH8>=ems?qMdWJyt{bVg&D9tk zVUnA31C34QV=0r9+$_BwQ+Pc^uczs?(N5WLsaH3bdJUGSx^@+4QNCFG9!y|oFUVag zgvtkObI3EOGC!B$3GSXJu!wll`vBX~YsPZm<~X#l4eTp5rx)xitd7iq6!x@9$NoWX z=2Z8|C$EDzGg_n+ZnmHW6mXk7C9FIy5Vc0ehH0GsuM2WBs@-!Ej-dfXxjN9*iWuXJ z%wqIos~??v=a&!DZf@ocSG~11bXMQxB&l+vzxi6f4V^P?(1y-xw_o)L-A~5TdZL;X z)`v5m1jjl{^e5IAI73=<+|MGjh5H6Wz=sPO0RGT?f-ef?3+t;OyNByrLAmUXz%28L z;@o=kiS&KiT@GF-EvgFp$!AYcSJ4`*^|h{1Ar8-&GpjhC|JnSFA;IyLHHSw2baIpa zoEi?zzp~Tkh5L7;+0J@fp)9#bvz|E)@94yxYaa7zJBhKbcg&bj@wJx@LpE@P>Yl<) z#k1*I%nBkcM5Vck9Zx)*AG|^JiV&G+$>A?&{6o1SwFDeuBSE_{cTkA`%G{Fe@My@+ z_YJ^7;}&ymhyA1yro+^oM!uAy2{Fsnv91-{(2n*w0|cFbzRLj0jh^!2VMLj*T2DMA z1}sZWQeK1pBNZd=x6Lbd{WfNAK~ zVGi=ra=g4$&SB)}@C&jMsij-Q+ocC`5*?XzA^}cTw~vCU%~(NSVqFg-S&bi}gBFLb zk5mF!PP zcBE#+lr9tBw)b!wheEp@J1ZCmS?zmzFA1B-_LnRoid%avOt1)K`xB9TM9%3u_c#Sq zZzT6e=<1$W`gDONVF>6Ui&YPvTwaiZCqqVsc>={W;e>dRJ%){@Rqk&T^^2X6pqo4n z8QwUIq49avC|?I9!~!pz1S;}-9A(&#OV6wl7O=*XJcUGi+FDA; zaeGRJSeodZSwA?|^?N=yMS^w?dlm)+<*cEp1eOVThg<{e_AwLO@Qr%m$wbMSW8ZjW z53AYRl0qL$s;HrF)cB9*4r5KR&K+j8s3P}Td9U}9h$u58qlKbzusLO4hKZMw$hGzz zyBfhz;V-E0u1$bXJ9D%5p`*Fcx2z;>hcNAfL*C@9Z@6{0szoE=x9oy!QxJ@4YQbG7 z)6^2xx25V6y{f(j>eFu(14s--ZnF2=c7#x5HGKYG!TA0oeXi9X7Mew&vKBwm_7t_T zkYTmyQ{7KC`!;UmQ*Ebqs_p($(#KRM!H*PK+UZ2Pj6Q=pG>}_kNe!ptPi5hBu{WMTj(}Y_zS)){nK{tbA)d`< zi~iPfZb3TBI{t~s%`2OmDfuFx5L(AI5JqSkW1&{|a?dcevFf8e%Qbkp#+vI`muW!e zfd>}Tn_;?yVbZ{Fmt>F#FjQEECWq?`^x!~epsDB%RiK5?&XsDU7%+DZ8T!Mb+$z0= z)k@lv2QT${nIo{MqFbeS7e7}?c&!fyt<1T~1a>P#UsNr^u0DmZE0JF+YTZQ3JS1Pw zCkG(l7zjk&<({@e@e&MwR;YkMAzeF}7WvPhkVK{8=N7^XsH}xoclb75C>m84gyNnA6v{aNz#$D?^l@u(t|e6K$}%W=w{aY_m_td$b1D^;nEuK$Mz;q$^c zh1>+QHz7QbI5qO+Vi>oO(wE`dGda0&D0Iikl^pIt0Zp)8ZBW&*^fXO+AwZ3oy7Fw3F4N$5H8 zif&+T#vP&Fyy{Z;JxCPRXjRHT$Fnre?&F#>A2eqk>8%d!ak|LGn?ev1oR#R|%G4ST zcsee^)vdI#2~W$U9W%$eRc?EvC?=y}gs!`j9;SpXjmys5GPqM(HUCRHKkM(@R(Y+$ z&EPCY>Ay8+-Xg?;T`#N^YEAm_Sl3#VTkFg-F1Wc*@j_;A3Y2+0mrWvZ6|^0sG}-Iqo2MZR=)UrYlR`7bb` zAkJ!3T<9J2Gy$Bz(IPs5-Lk31-qknGnO_QW%@yj~LB#au`h=dW(I>DJ$&F<09=q|} z2t=7iAbi4rrfZ$3g%|X~kbrr?=SJ?p-jXxNYf_v4`&8Iv79$t3PHYD_bxPyBg2G

    ATEk(Gk}^LlT!fK^>tzeTAK7Aa)O1ifP>=9cp||B~?*ut7A;jMoKQB4&5`F zWaA(0YE%DIyGqB|JlLaYm#5iN+;<7*$z3pK`R2He0%#qM<;EUmTa!lLLrtI}-{S)| zMX;a@xLphqNI01~r@{3C0fgh4{J34C95^aP8r*9-KQ76S+g0bl)pmy4tl@G5ZmI)U z*%|IS4aWufal2MHa05HTMKm1OCZ?AEd8hXdyr)`(di3Y)V0VS; zIHp3+H8clZJBBF@URVQr5T-A1mB#nsJ~Zz|x8XHj$0Up;3h+2k#t7#Q#ASX3d?cJT z!^g+wP$7Q!PjblS#eeAM3o!~v+K=?|i*@-ZtDzDD7JK2d8e7V*8wDE8_zWg7Udu}U zS&r7;CrbN`*e$u|RDqHPf(a#cGx*pXYQ#^HlBxV?oiiGgIR2UHFopFM2Nf^@h;Oth zqwOH_)u@Ph8M+Ugp?G0qC*(D9G;P&{-v59r@}Y${^z6Z-WT_1X=$ zqCcx1?`MjUd$+vJ>B>$ghXrP~b%C46xl*8*6eBW73dG)CnFnDsu$irjoYtU!DB7-I_iTmH=9SVWhZ)z$@09DP)oql8JuiAEppmYL`-?8$HjY{n<5 zvZGTaOX=V6d6If%nX)F0@elz~rX-}6>22!*&w@=<2W9Gv$UArmufUF@=5v-Rb4sl$ zE3SW|b&}=N`gNLmWtr2}V~i;%Q{Ga`%xUWa=Y$tjnNx+&C#6hmUg|Q(sWN9)>N53j zbd+Q{OTW%nuPk$+dWnZC9z@I<&>mAOL7yk5%0KBz9UT$MR#pe|GYMor1` zas4_)y|T=w)nkk)C{x~2%Pel|Qfx$qs4{ISvq;LsmZ~oEa8>5CJYA;#jTT6j)Aj32 z^~y45smB;oP^P>k%dF-lt!-UGMnoF;xLxcV;1`5ayJ34)7rI$F*UWE6E2I+X->6se zT&Q0ssaF>IxO$YuViYQGX@w$cG)~E)g(f)kP+g4?`2a7W*U&xiI>ffl1 zcSuvePE)Tece;9vF$LwyTY9;fEEf%Rt}53QcAuAWlMOYf%9Wi@^4p-wkFJnxXX)4Z z>Xqd#RFC3WhH~XCz1%F8i^giHaz{zIcS^a*#)`x3l&|B;6`!cfohs!%u3yE&ix-ze z1S%!Q6qGA(>E(L$?OT_y+%Rw7I$sJ+w$`qyQ1Q1a=jwm7PI9}R&*Ffk%9^D<535B% z@|a#w4hupn9ms+#4CkAwjL3;nRJW89ogthY+e$+nn_b|DTp$k~USP04we%DI9$cR)HSXStCK z4K14)!ga=o>_VSNPbjpra&~yd)+(G2E3OWoPB=28aPvE9|_%y@dEK=SiTHCiWUAu7ylG|*e3zf!$*%n za(LrT7eA=*YhC=S_J=RMb@T$k-|pg1Rrr-I{-gWDm!3Czx8SqR75yJ5{DCh1tNX*3 zUNkyS@LzH9b8w6q^2>AaJNAw5_K4AK08sUqPu)>u{6=Nd4il-W;beT+hZt$NbRQQz z3Lv5nq0OQXQXki=jMlpuUAF&>bf*;^CK(m8<+%hsuJUPc^SN*T`RGn4dWV}&Qa@I! zeAtsH#un^9AKj@$aqkisBRxqy*(UkGyH=ERPw!&H-XOp^z0k#J5N{m>`;o0D2vebqVxpj z-db!m8J1wcThfRyWPSCxm7Wj{zwR9{Un(1@JAvpfl&;!&rkH$HT6oubg=;NFcTx~u zg+8IIz*<8q3$QFh<5B+nfFbpvLh!DQxFZEm)?(aM6JF)D%6u+Xj)O%h5zFUd*-5Ot z@G75Gmgi!DQAHzpBv#19LdZ2$R%jIldn4#hcNl;UBX8&jqV3>K=`8R#y*XIX*b1|W zBnvLEkO}Z+m*&)!VTB)1U`?TE);L?xXgiW<7=8#^kGirRf(G6cn&u5=-$DD@K|?X! zl+$fyU0FBj2L#Dl6WT1yiP2~M=>ppnCh*{Rh)#g@h&lxJAuJRfL3F2EeKhl6(W_X5 zncu^t6<|>J08#lMCY3IQ>1R|$e=%T^=^=h)eu&l1H;vp!*2CuD$Ce)s+c14Ia%IM8 zJ=a*D`^;u?hiHltPNovZOUoC%r0zSW_;;YXxnMqvf;x}mg6-j)40zSW_;;YXxDM>u) z;!o80Q{#P{UZD^+SH$9P4})*jP-W8Kl}ymOBry}jXVOewcPsL-?TZ)pYc65H{ZT_I&P8c zk@%Q`<#?a4ZfqMI7&oHy+4mzx2(qgAxUH-Txi>R+OdZ$}V4z(EdhZxzPajEGm;Ppl z2sui3&Wjt-E<(;12x_~zW>Z_4335zDj;YBpNlpdGK>(9dQ^>iWvQ_jnmkEXL%qK>Q ztaowFA~*zu1VD%%!5QM^*m--;-?R~eT3;SNFXjC9IoKq*c{DFS#te%GxJz11>!$XA zb#9d(2Ms<%{M6r4Dv3sDG|ra@3GRI8D-fj1I}PQ1a6SA8;=?O=C;}k@zAKLpK~cpJ zFM?O#jDNTZJ88`PoOXZFTAcG&nVX6E$Q<>)mwbkSA5@}}PvU*9VC=hI&k;afuZiOY zkmX9{7||=`1K!IJF-xE6@AxCmKkz>CojW3dZe(rTV@Wx% zq%7zoRnU4wbJH>*GAdmAThMuhb;oigCY~5SRdf}KW~`;!&4`OC%7r=evruy?jowL} z--^1Gkf3@Sl$+&`U;&&S#H^F_L88PT(aje(}Ih&{! zZd>DoTJ$RtWi9r{XHCQxM%&{dF*$;lgBQe)xf8p>h%v&bNJj42eNZRFRfJ;HcaSF3 z)$NkyQSOANDR-q8+w87>5B>rDeq|x`duEz`f3+|D-ta^EeJS)C9??*`tDxUFU!wGT zn>2=`e&0XphxB_xQop&sPyL>|rK1B%yaJ0G*alyNAFbantD4rj>?kZzL0$hu74m^YfNlco z*iKZ^tLe>P8TmPY{(~6N|Bn%saSkRC=ufb&gw42H4o=)9XNpw5Ml_#+;)L(S;do5i zS1DIrWvbKR(Up?!=GPt8o&6P5J|-&fkHsgWMxpcxs3Q#=mb2T0sioj(! zxWul(izZVDI?(Vd5sHldn_jw&VTo^W{^@Xqp(;|p3fPEYBxzyz&%O)&pBbA*r9=-w z<)S(2nYasyuH7^d_+0u2ZhIc6f5>tB2Pgphhu2fu52Cl)=lw~wpPc>l4=BlLKZt{g zpkdoUd^?D>gP%xO*2*>&o7s*Z-H0AjOra5xDVNFEG!K>#Q+b645kDEZlb8ukwg#_a z8)E3C!Q{SEI~wvowIg?Y(y2W?eu-*Ng{%mux>N`xp4)Psrep8^<8P=7w5k8T|By_b z{zEzw)qnUyxZ~M~UN@1S*%QJHL;|^&8u~DMG_{5XkKI-pav?2}_9Q&AR8102~ z$jWpM5d5*nId(XZ{{HCkjk-5X+5dp`t$qI=4{ZPU(q9C#m&gwG%NyCy!mYykw2k<2 z^_Mk-QJS5~W9lFW8cTTSuV8l?<6OZp&XG`_2pe=~J^tu_=np<(f3WxX=c0Z02>T!Z zy!2!BS5(%~U+SM8dR3ul-n~%!KFn$CVLIc9>LQZZsOs?K&rr@sN~L9ro1)SgX0}Z# ztjv9ky`}xTdfhusuLmdfx`=v>^Ye8q$Ev4SqV>9*exAWEiSd$Na*=r6sc7;#;9Q}} z*n)^a4(|=P)i9W|cE_~Ng12STBa^A6Ap6z=`>83=msF3;`C>}NBeSY#Umlsjg>xNU zGJWhA@HAMithNt-@lX!zP&&-+cWO|t{4x>qFwHL$P`-4(Oawv1;zWpLE4NI5{Ajn# z6)%We=D(i(f9;l8t^F?J*)@oU?|NqzLs8&%S<9cKlji>=?@VKMvD^Uo7H%AJuFb>J zWnqe!A>$v?Z*#_(@({?_$h(f4$pCt!!861JPM8Efd&6yBC$|Hnzr3@#=%l5r#0a5P`g3x7-Tr|+uw7n6Zx zweJ($?AsQ5YmRMOoWpAzO)TO3rP32T0XgaAYS2;)J1i-Mp5VHalY7=!Xay2){#E$nOb0RxegfeoIsT##YMzA@ z2BwZ9-2Mu~S2Knw2V%&g5F_$;u;a%qg|KG608We*nAVr(+C+E@%7tl!d4w@7dObMI zjCb?n|2N!YOu?JY|HIsyKuJ|y`~Th0Evr1t!ndH2s^nl(R9q3Tv} z3ACz8J*p!~1UkfF?>HGjlJ#}oHPa-pIUto=&k2c+!vcMOZMqWId9GimwUFFXUHnxz zt=gq|7lF08);n)M{AN{N9kDtxb5hmbC`<0_E10_a5&75YDz?S+DW3ibKxm!~aX|kQ zAHZ6PX7zc<1r7!jxF%ITuBq$r)n6<~$OmcyhIg$IN+9jT%|U_wE<6jyBN%1KTh zteRAzF`9(v?Hzfy8>l-@F;N^Jj)Q}5O>^Lr3>}5f8*u0ipTABxUt~qY;clViaTFEq z=vKPj{wzZoVX6x_>F34)ohHOa(?IoF;FEqMtHQ~EK}Q_?;{teigZguh<^tXVeOT6{ z*8E?lnFyK-BE&L%c<#SC7<{t6L2#VLskOCC->)m;v0<8yLe)}tR~+~Y40_91CG(** z4{zq4p^v?#Rb|JC{$L+zjzuXpOvO}2nY`dnLJC+8_43O(vseb3HV~{DiA8Rn7xuFx zF7aVufMGv2o%+BZ&cr}3=1eb)4&w}8)ygzaTA+C^qm8BtZ~uPsyLNGk|Jd<6?^$+?6R+g-KKk+KC_mi7k+oZs2RD19{3mX;&0F0gk|f`O~eFUt8Sc7WYRlx zPa>ROM+MOIWvi*)^EVoN&m;E2fjpNUEqpBG+YBw!p*y)PS8~4}YpL!kSr@TM*a&Jh zTA1r)9@be1aBb2BMJ`k=isv{W+N5nDDi4Aom+?`z*+Dx#FG=7#7rX?@#zoNBpU%doi z2!HTKq>;#9YstDHj6kmO^dWmzVEHKY{N~~!Gd~SrZ<@bQwP#U&dRJ{Nn_Ji>(rA9A z8P#4q_l9OJV7G%JiW?q^mLOX1P!_~5;(X$_6zPOKpmh<8{LAE95&7>%<8_C_utfh+ z<4r$NFS%HeyvPw0+?91Vj_U>mC;J1H!Nh+e=R$C$4?(gG1RJ{Ac%6n)&v-YhGOR5b z^6$68;s}8y8t=2FFDNvx%hXG*)TD?|v&l$7^@+9KM?|skM`)~56R=d&*wSqNjesJY zpW^&R@nnf?wa@7np$}dy-dKY{(%sp-Gu>sEDVCWA0Ghe1rmiBEeM8SdhXB%(yb3Z% zgd(iQp=bSDIISUgx>PI9=Is|Xx$pNuXnhHUF5Gex2wf9)sD{|^=>_rPB+rlFQIhCS zv7jFrx-N_cUf!R-0DuPoK-MokZ$Fk3sxHkIn+%;>D{KYV2HvWHn(4;F?34gk4JMk zrgyya&*~C6_t~VQea5P?MZB@CHg=g$txVe{=Z*q>qWKArYPGnlFcq}<3ANsTg?~6O zlRobnV?jHtrvD0#S!okgk*S*E=?zn0ocUq+0co4z7)S{F+v)5a6U&3AzfRGh6cYp) z5X-(mHzbbQ3T?Z&N~)5H_@oW;lclzNR-4tXstfSxq=M_*_BBC5c)4|&)kaVat1TJT zHmdWU^mE;?s>3!V%MhjZ#xAeR?)%3iba20Qgm;PR>x`xueIUxWViMS-N3g|+zXSQ zzvr|XEgv?lO#V1Op)S3#GoIqJ)^7BE(|a3)Am?3M)@}q~`xwBgEbAM}T5nlbQ-^nW zkoA+{mh~sDwNA<7sdjDhC~-U+p@byb&mu07?dL7qf%*kMgW8?);{|HW&9(;^)V6a_ z>lQ+-9R$GBlUZv@f^!>ICC{~4i~nN6cABMIu4HW3l73ibkRFw<|w4}D4 zt~OR0+71cj#kygg>I?_H2nTy>FpoU#26M}i-xQ*(vI!UM?7ae}SL z;`oXWlG7>Kq#@NCl zS>M*M)(-pDXnm`*+H`isY8x2U_D@$^Rw)tS;`R~(?r$Zv4Y1m3t+r`lZEaC))5%JA z?2JtWx3N}R2)FY}YTMUptFhXqgtd*2YLm5Ga8pVIw<-1_bk;1qjDQPAx{uaZ&>u7#= zxab|0qAX}5sYhbdVPDED4q^pT|FC|}t1?iG4MA~Z1PbAYCS57fq))RKu_=LKrrrXC zMEV|I!9g_aBan-#J5=NnRd=bICrgQDeX&&+&icrb>ITT(lwGgl`9~`Nxz<9vyZtBy zbvVu$ipFD}>)W}lf!*~chE^AET$p-0(b+T(Q&0l!!#~9o;dbVM9*?*DEM5<;t9+3n z$>(I)O5I1Gh?@Quk-k_X__S^iGtmf1O=aw$^jiX7jqsP3Mbc*O4KSpFW2Y zvg41ywatImlvV1fp^jO=ufiW*qQ5pj(OcWA5aFP-=FuVAo(pVMgkJ~no` z>b?)~|H$-&-$!+B@SDrt_wn~+6Sw$%Z+|Kq$i?@1|M{}_M!&1}c7ygtbspd!S@yoK zKc(z_PybUksK+QCl{wH{*JiVv)lYdc9BD6D@^SAQ!>LH&p6tE>MY9yhH&HC~!##CxV#%>nPp z{E6j-tNCZUxr%>JN>K4seRLIPc?|7n0bGm;K?LIsE>5NfXB7iplu0rXVZZlr)t^mL zQ2j6T)m7i-QVrgYC>?DU;bDygl$bfc1l|LJdW-P>MG@X@n}PSEH@f-MPXramI6|l_ zD(N@0sQG-d*zbpm{r(G&o5K6i8-Xxz(ND4dGN@00d_uSc^Lai=0bI`1R|l8TJbtJC z-md@piRy2#m$3gm@JR^kZ*={yAt|VT1LlRG{?B;aw0;wO^najL87K~MdkNuRQBr>Z z|8>+9)ZbC8f8}QCzizpMkA5P0a+*X)Pt)NDVgF49Bw9B~LH&QwR|lW#jdf(GDX?-$ zIIibK%$c7^M%GyWL%h7Jq<(BPn%|p?^@dSA#cjst^-< zlbI+V^Wr}+6J=>_#ru&?2rRTj^+~VlM|7duc>XX2=}8V^XAhU~rp!9l@$8Yz{Z}1f z-?KkpScDy7`(`7N>so%N>8L*ajN)WXLM9LE|2{D8H?$ZEC5+n;l-$mH;kTGSatku7 zB>o~m<&Ui$8k_z{iSp(-t2#HQ->*y^oxe=G@C47v*@Mg>gAS{ia8grdb#h1AT|LIN zD;MG^4^j=)Wp@|0(0cO|nt_pYf~jskx%m|0r%>kcpp05R4z1tcgPX`g{=)a0O1>YU z@B2Pj_Wi<=@7w8nBLfc056zFRZ+`I`^*)x3@s$eWB?aC?OYl#mgTZ{N6aP@!uH0ay z{Y}dELiI!2T~?8(T%8E-tXix9`tPuhwO^Z3rXo+!K z_VmWNvCMRJJEVaSV`G_vl$@j7c(&S_*lMe)XRi%JkY0zWW{vmgyFj+wR2lA*WIdGz zf8m+vxH}mz*sSf6+P3*gK2`W@fOj}wV!=WFo|Zor<&R~)BsUqPIjTaU?^9uSTsa!{ zQ!q5(n|a@5krJsaa2B%spd?GGTl14}sS5wXKtIgNaA=b@Na$gc)}N=KO!JenDZ0uJ z7h?3}TXFw1fgP(xC*Lc4#U5dQkj*U@wWOUy?k&}QlCYZqe$kDMLwadn2c}@qEN&R? zMS3uC{*4A0tEc%%f!kkTo`^#s$tO*9)?Lmf2hilTEmF#M=H>&o<90Ov0FOa`KT-RO zh3Zu`+A=m?BSzCEySsUi#PjFyV0$ZaFDb!kohe~2x-OP^RWk$@VxUZq9|w{zR6?P8 z&3_e9dRK@Pv#Z1CN2)~`tyxZw-79F%eXlA$Y0+4Tj>-;f(?&N`7|)Lz>utHmZq#mR zt?CTvcp)ps36Gt5&XI&htZmS3W(fLhds~Q~0~eKae5G;mvv6Uff?hZfuWQxJ9T_^t`(P zSUVrgX_G`rzYt1Dlz{>X|HcUr+LSq}i}vPlqxOCs%(=V5JM#(S3JNNEm;53qxu|KJ z2JBV5ZA9Bvy1&4LNA#-6CUg)*%wFy0I=h|dCh~VIq1UYpIkHz+n-P%)sn@#Hh%T+} zA6VU@#-Q#QTBEu3a6Y8Vc#0kQQ?RY8VZ)NgCDvrtdK%TTQ-_;LQyU9eJIJ%HL(WNbb0sG6gh8j&Z z5+dpGEXp&LN-0#IduoyR#&8R1OU`q|_e5t$d`OhJ8ffMG1o#IMTJ`NuDL|r;Gv1g@ z*cXV%kj+x3{8J_Xy8KlZD=|NUUbev~F0F;>=e7ck+9+7zJ^qGP`9)#WXg!2%3f;D_ zv5b<&CEk<^ZgL6aV?G5IACKgj7t2VkFm@P-pM@???LMk22es<5Tz2+##qIaVnRJM^ zI|@+AUcwhAU>uyX3L-m|QHvEwHV8A>MRNL6Iut5FYP}62U5c-@NyAqsK7u+k)EVGw zI+7zJK_53++Mf^bRx_nr!ks*^Z7}hdcp+6Y)5M4FRmXlH`SFz1+AioOwC_D>;aKKK zF%RU4;5GcKE~M&UCYx&f6Rb?ByfLUn^5(@@Aa4wYfxL-jAE21`n7)-u?+{-d6axZc z4B6j_K>n`22ICf#0|L_bbM<{*@w*cxhtzxjwMxA`1@gl#AJBj=x z`e3LHiM+diR5Z8@lwewGVwpvT9D)4n$HY3lsd~-GA_@M9E20DW*IIa_iz7kgUs7dr z^IP)2u5ICTjw3?ko5c`g{J;Qe31r;ak8CRADrBY02g1!n-FIYMt+JHMI3?*%GEOxh z;F8B9=sLCyrPlv5`S$xgCEpw;6R|VI*z|`iOq!M+`8d+7tzXj=OudAcY_ekw-k9ZX z+(3h&1VXX9LA_ika&}1qa9xGgw33V_1XLi!sQ@pZefUymzwTkOMI4;W;7`Ah{gYuQs-QJ zcSYF$x_GV&NyoJnNpq^2&!4F-*Q%=+2)MERj-VgEuBlA!K+Mv;>noG};fl^M5#oy$ zJ5vz)PmPvBz{@P|`si57BxY2V*l1ngm*bDVb$8RZzYJU)0{;dCdzVD+X^wWIMD%UR zp8=Mmd>5(?jmy%KTNt0gJnOFuX8hRX6NUG4KdSE7j(vB@LgE79BZn1KjC5{&Au26pU(e z8`GR#+-ZtEIA5x!q+A&@A2Th9{1f%28KyT@CVM3~s-ZVNR5)Pogy2-3wX7@jRloWZ zsJc2(#WKT#OzZg=k1Enzv7)Dg#ww^@73udo6?F|Ns^Md?BE1zWQXEuypw%i5NV05o zBDY$m0}bhIs!Zf>sqf9lMCF?;obF3Rd<9~cm@n_U^hD?K`)2Bm@_JR_{p4@W-)9wa zvV?td<#&o{qA;p@ZAX1c{iQ(J(JJo1s( zSMbkZBD0_H>|Km;-+!Mc*FSIM7OV%Zi1Z0x zl&BUoTkW3>L34)`RbYEfYF^>sI?K}=1(gG-bJ}o$ly!<+tZ!yf19=b(tPUENg$cSz zq_EvF{CmZb)(Yjz5d-KV_!x?WtqcMT4Sdkkt@#N!IF@u?oj8(C;9#s?n?b_v9>tef zp&^W+?Phv;-uPKWq%G>Y@icU}$E=UyYo9p2w#-Xbfs@aSnQEpWsWNmuJ50#s6jKb+ zaA)Z#wO+$T(ry@$Gt4xpJ(J@rnZAG?jHO|h14cGR$KsBx^|q!VD_pL}SJITXrnB^% z`4Vi#v2nzYWiO&q|1+yucB6F$j>^<2iADCrP(&#WWo)*Ibw}yEW*aCkXk}mEp<_W2 zpIQqMB(u}?ZJNXT0K$pSyf9*UH@z3z`RGCt8sE`I050k_EHZ=F{Xmt?=7hSY=4R9tW#yj zi$#0}_nc!S%2Zt($40OZ!nM-`HyH3xh%c${qKa#8DhZ$-%ly1JCY>b^7AwBCVTT-*w_YO-MNC_S(fD8u1kQQ5gyP4Wp?)dxg!c>S!)je@d)WPlk+2Jy3MZwM?5=g zS&8WWVx6(+))(iIvSQ)5bZ%lWxdg4=el<@m!axHUW0PpUiyAh`S)Lx zeBWB%uZ#GG>HDXi^BsNvw3ed2f6A>=j%SU4;2joUjff*bg1k%<%PT!S%M^%YR}S9k z$-Ak|a*JQM;!Uo&I8Isd6I{9o*=6kF62u0|GVVZnOa9I_rRVP*!A}C~aJP;G_>RGt zm(qA5x(CblFtJ>1CZ33jmc|pY`lL4Xi02=6_HGMg(&L9fp)gB!bZ_@Nh(b5Z41cj~ zLNuMfvqokEj?wd@Dq|hP4d1@opPLNNA^iWaKW4HB`r~X9)}PCMVEwVM>et_{)Bbm^ z#}rH#*7Bn+bnS?54j#_F_@B40>Oy!}kO0I=pHI9_uKo3l-s|Ps_YBf@TKm6g|1~4( z|GfQ`sx=tDo#=M$U$%pdUp@@p^|y&x&RWj1!<;`^8yB>>kRbhN(MqKM1>c`2e*fF%zV9f?b>0#>R8%Y<_9NW?M&E@V zWw8kP#Vpw>y}OpzVFoXu+hdh)4RXxo^M>esdhvaKy`LdD$5M8q|E8Y$>gh~9?WU(Y zc#_@D>%s#Z$=2W}`;EO>!-eZ_$-6`@It$X)l7C>1@O9B-{pe4t(ypxUS?9+xzqW5M zOMMxZ;c&=&9`G)VO?mz%&5!QL;WU|d*F{^yyQ{m!aYDdz4qtG02IdvzDmyUM%_o$I z0`bq4nwuZZ#t^G|aY5|sZPan$HR?Tg1}oEI3)A06dpC10hrdedeuNF6dE?9Nvzovh zlG1TuQ0|%${G_@pw7Y1KhaVHRCA{dQiFpakTg(i49K|o^3wR@Osf7S#v7l5A0hR>d@J6#IGNOG z%yV?(`?i?TFHK2{?=vsn_{zke#rt@s!THNTD%X!j4=FvbBb0a2oy=mPJECm@B}UHg zr7j_7{d25f69xt({4pD?EGw{z$R;we<5uHKxn=P_bLq*1JeH)6Tr~eB{wsy*Qw}dm zf#o-<4J=IgV|$|@+lchlRI&RVDu(Pur5TA~nz7f@yO7C_jIF%CO@2FO9}e)VBPw7{1}P zY^#6D>qVmq`@?Y0WVm$>ax?A#S|s(YOfB;!U9me$o>1NsQED72eP9=R z+q-i+RQ)AWBi)nBeA+cOcFo@QuGe*wdDt6EbP$W<*e~5Kw$@bP4Pq!AD~j}7ayrO4 zU=X^n{c0bX$?lqth|joDeX=`-X0-#uC;*mT;w}Id*9+;*+xP6AO!j=ODrz35ScRN@ zNkQ8s#oNe@s_{I*bTrdi`WcT9zfa_U4QGD3GI=V1kmphpu;Zq$4GNw#)^7QVWu~ew z?&s;JD$8&BVxZ94d2IT=gC{HpNqg?vF{vVOgYmnpi1eSetYaBic^fg88Z?9>P@(#t zeZxkery-+5yQsJ7i?)i6-xl%BTS0;^<3_-DpH+sZcyah9#cl?kX^}m%qX&kDZc+Yq zlMU3x^IK;^pe6Vm`4CK6r6s4^O_7aW3nu#c#$iPa{NwdHTX7mEQhBGS$royArQ$2 zgDPle7$rJVzRLrafPe~W<3#!c-Nj-Ueg7BwFX_L|>-+k~jdFl`n|=j4H|zi4NL(z_ z&yo+1_`#5nAEX-FFNIY0FJS|X*UQoF+`51b#IhSyIQ^7#*oxGaaonpbu>eigq6$G1 zEwDy}3#`25C(3!|CQ6v&O}sFwzO7?F$EWk06SC#fJ&W9O$u>`f@63@qA+42Kyz%4n zM{+nC&yMKuHA1a?1=f${QtGc-lSJz*@7T|^4l(e>vf3Z_6}Exo+YW1_YC`d!|wz5-W=-)nlTuXd7~dNTbi=@P2YVx&rM;p!`D z&rT$#JIss|%RHqPg2mDYES5&ln?*_s5moap>w+}b0au_t?ydTwfPl%@V0(hNDLZrpXvG*wdNUC$?b$QaglSJR1znB{` z6^YaM|6ZBhskfMq488G=jrh}Wb@+0=yWkW=MBGwi=h&*1cl<~iApAw1O?5D#6Myo6 zGj4=hTfb{WsKX-Zfi113^5062wP%?0fY0n{3DI}y#(ZbBBjRm{cNza4}>2~A~6+7yC?{dmNY0KC}-*cr? zJa=oj%nkQu@Qp@Cal#13C1G^i2Ss6Y(M!xxq_24QGPI88B6`t;O+gutRJU1OnU7u| zjGI?yUq%b*zdDFS6OZQ(s4tc$a%jTsQ5{t{WQ*4P18!%Wy@4fwD>#44y)}9<*1j(7 zN!Z7-caxNxH|OI{oH^G)*jY1 z08F|a5dE}Jzq1Po`YtVMt${2aI5f9pXzm5uOVi3^p!WqK7e&$oZ5yr3cp>XYbNg(; zxgymaEv|NW;gKygi{9JQEbiejLOx)3W(YdH{WJY?di!AgvNL`UIf39g#VB;}f??f( zW%*sL&5BKj9ied}R~Py!^Jw zw?fZT-@_;VqGg&d&D;nv79Ar(4;Yqv#;@X$s3RfVGgEmFArZ@7rnhy&aG8tR$(~J` z+JVI8zbkI{iL~F|w1B-^Ad{ChTm6;EZQ9M#`r9C#w5l*|LorQpfGi)eSgbsAAgLOl z+U+nwe=5B$(y!^gL-7XTq%}6hp|6SJ5=eG4Q5bL^T#Sj_%#CgrG4o>XB|uY`f#5kw;rbvM}52S@-qIK9|hH5a8#v$VF&a;gpGSY{$RCV|w{8M@#! zE>G5;`EIII{o3Ri*D?VA>De2ePJvC|?-c(t3UQ?4s!LtYK3$zLD) z4~HE>?~ev8NZMzNhxY)zd61^ND?70By;O1%eED-JBKZFavh2rjYD|eb()wQ?EB&9zdMv3r=D&UR)PTIv@>*$Ff3Wp;E1jf8^BPR8K7( zC!p{}s@a28@;d#g8k3B^5Mxgj_>QrW32l^c;Vks(v?Gl zt_&;f%J|N7WjDSA=S`dqQ_jI(NP~@gd%!a6go5or;XGIvtF`rwZ)#)4t+SK+7t!Uz zE5d_OaCR~dABcItt+R7yqK*v_OZdgl1e767;pr$XmZ&W_9mT1VREx!23ePujQke*B z|NZeOu!s2%mpIL*`k&|wTCl!kpNqJ1oJ8q(SnFz5%rGw)uYB8O5AeE=6x1%McV2rB zct8GtmEp8f?;Of)V&8?n&q0fqChsg}fTPBisn?0NuykRM*{=wiHvx@M;bpNRe1Ln! z3*%&zfpU&~!)*8mLO%M$0D2QOkbVKEtU+Jw$!$ z=2fNIIXoWAULe}cPj!xlFC=$vpRrcZPW1}1#j?kf!?G&E6Is{uT@iQ4S|Q$5l6B88 z>yKSl=XhvYYd6Wd5uCDG*9qHb_*GKl9XC8I-9kYTdo`F<^vJLh@L2$ib zgB=B<+`Q8u^UnQd-kIiI{0>w)Gn!v%{&9^G*3%^8#X#9_R3er+!qTC3Y;LmPEWOZK zZ~}YWzwEPm6IpO>vm}-wX2Cg3Z&+}EQM7+<2iS1T2@E(JfGgL_uy3{^^*)x5espIG ziUpz|^PH-fv_Ml_WK-B;=r1Of_NU~R%*>fTcX|+o@1uZs!^3VCK!eD7AIt1-i0>@; zv8?#Fn|669LP4PcztIf%vCFi22)Rd~hG4vq&K(-^W7(Cwd5y>h{}rCZZ!|pvL;H|{ zG5a_b1@@tSW*-`8_Mw6P9enUQ-fjya5X-(rii1MtD;|YOREG7mX#e?U%|>6@LOdx9 z*!^Z_mpS?|x8E<%W9=7Wck_M}`*x%MfMs{|Y!h>v>Sk64`X}3`p}_1sjpEzLKI9!s zzx*af<>Z0sY;v;++V%F=_YKi^^%BuFAo(g>IX`2XreV(X9^pi053+`U4{W*yi-o_t zB~-LOC2HiF$|HD>h;_fqrBz?PmQPqpr|A8%;&1iybU%@T>6u6?%CmUkM?dYesXQZY zvW2rAlNE)W#zH=wsh3HsQl7Q4JR#B^1CJFjQ9|v9hWkaKmKqkYPUlUM`90z)Uun$isI1m<4xot9sr>1(2o@P zi15p){g8D~yRwDlJC;-bkf?rzRdtw|eJ7X(iIta^6~)RgA1sQMwG@;{c@*zOU$Ftm z+v^%951YxSeVtNy*sbQjmxrTlWXMCO8uS7Ln^6rm!mYlm8u(&u!5)7syFwgor?=_W zGM*xR%lrCO#w*Y|cqR%@)SCm&u8-DnW-j9f?^hXw)Q?a;D&9><{Bzq)JeotBiAOz^ ziO0VNR4?&Z!$-TO4*9r?@H?%KIZJo)@pKZ5j*ad^%61`B{!;FdB}zk3de!QQje$&LLQj1?Us7z$kjXTQe2Y*YIu&wT7~PT|H(E2naq>E1pb(>*u$-KD_|&=}r9A)O zRGt&*Zy>5Kd1~RX%2bN8Sv0Kwoc>E%*l$FEJfH=u94n~1?4#G1+YQQi!d_Yk=UnH^ zxaT5$B~{0%17T*xn;iF)7CF?_lKaZL@7W#|1S{_<#x@S|ev9?qRo0wa-%Kxw`9~rh zXpTL0LZ|+7#x#GqMMYEc2Z{8zbCTO}K}b_@%v$T?8Fag%c?ze`v`S@jbhL!|SnlV( za61aDOKyWwe)v`Ur$zepHW~%UB=f*v8J^n8Tlgmth0co>H_`Fr z3EZ)W8?WwYs_gtJ@wyq5INei9m*wga2m0HVsvZX|2lXq-5enCpRpg$uKqywS*bL-e zbDB8mjxbB6J$s43CpfR0*Oc4_h^-?2e*W<70Ad{-s$&{>Jit$xU}<6+KN>1D@;+aN z!Cld%YJG(w2=yDU<28ujtVlk%77GIoc(y12$KK5b{1GN0B1Bnh{fiJUK*Rw1z#P!b zn{)YQ5$`t|_NIvE>hmw5BW4d|-uqT0f2<#3^1UlM89ot^$Q?t*}-XZCa%-TCU;X zzagANcE0+LHaWK@Pf+3rhp2Z_m0T9aOY0xk+W0}T&h7WPNcyo%C(t&LUQolQlHT@3o?vktv(-{Qo_E6y zO;?wbW~@nyx{E&*DC=;gmI5L9X|ZE}v(vDA<~E0~yiRvIxjjzfNgfeZS*EU!E?wJZ zteQ=&S>t5Qnr0gNAID7f?tLEl{Se5Kp-I*+zvn#wgR`gj(h;NY;tCDHh}6l@RHIsB znZ50csrXFHSKeD=oUFG#vp6gRMR;iBajWJD*ICxXx-22Id7)P6BwS$cN;ZeKE|0~U z@P{@{pu&?}Z!-0FsJhVIr&|ZIe-t7&8sDtvB7Hmc$Br53ySq=3zWb4P^q(Z|9dm<4 z?{0$Hy?Q;d)cD&e1!Z~4JZM1Y5j8(rnS70JZ@l2T;Qs{1QrwS@=dTTV6wC(JL4#FR z7HC^b2P26Wf*i47?!kXZR2s70{cokw+aNqg*N*N!`TO_Moz7*_KPd?WC^hfESoT$j zF?3=I=KEf%@Xv5lJQVYdU4et4ZZ*!m{x?(-v{yK-euO+0TiC@I_xQE|S$K)TGj86B zlKA7;Rp|K)d=}zvCxiaHz4q@x&JSf=Xmh(*;sh=STsLBRDX`8pRV1= z-_lIgD=DgVb-b|8c{^xnuXQ%;qIYPot_v?e`1~TLz3_#DO_8x$kvrV3BSN*e7`L|h zD1`kgxwTVqI@xQLbcD&;7_GE-%mUi$2n%OF5-!8_o9Gg?m}z^UsN-NU8mv-HvR7f_ zVXFy^0}_$C|Og;Omy|K<0BL4O29|X zs*iW{bNs`)@UA!SHpf4#een-zU}el>NGbDRVmIX+1551S(R`ixOd0{qsMM=w1BEI8(8!;$SamA7k`P&Hw0h}|iUm!IkuiEu3-}atf!BC6-06voY;3q`pZ+pMO*Cue>+nFg5#tYd`VvKIPdYTcSP$`r^vT;e; z)tcS;l0XFUu1+*`Y;ST%`OC!3apmHsVN-E~LqXZO=E@tL0IM}E|9OT^PlP@`I#_ID4Hlc`6XY#>nvWZkh@Ji1@i=rplY6=U3xSXH z*p|X>55*v$K8oKey9DQv$3pqh?D8|s z{mgJbi`~ykRG~4s$+lIu=!hC76dmn|-uzT7Jfe<&ocLOF#5lb#n%u4*{uWNo=!YYd z%lT26g_BqEKUqBe@W;2cRINV(7X(jZa#we)R(p?)s?pC4-|&H)I&A#`jkagd}Inakxy$CX+woCO&^T8!T8jGTXi2Mx43 z6|$P+hue7_6*_)sdpwHg{Dxk0rAIwSIJ6KC8e{@jgUBCF@j1yY+Q&Ckq{Pq1hBRgj zy$M3*LPq37L$P$9q&V2+#+2g-EX-E;j60r&U>;o~RDIg;T}N0kU$%kUTc1GxH5?)K za`1S*mO3N6&Mi<=@$~8|?H7YvxgjHn4c3xhom z_Gkdc826cJ{^$w6l%ZiDQ@4xr6F#7Xrw#SmAABb&5}o^mkFc zCHMJ7Ct6sC{3yG%q^;Y!-BM(he{!(^phE&O!N&7h^+I-}8X$ zeLnKOZrh#QmxNYh7l)(l&NT-t(4Fyh4{N@veOTentTve*&Oxr1Hd~VVVV$ zg>HK;6#))iI#38c7eB22OB?_T)ejs1Uney>wB66UWRxRkNYKpy6m9%9p0jn4BkEoo zbgLfS)oZoag;zVdZC+mMHcB)H#Q_oEErHUk)9k#zx9t;>d!+!h^_i^?`j+VFh3YLO zNP^?(iVxrq0$AaCAe@%pGU)b#K#!8LfJNz={_9Fw%|cX856nMl7_2;n0jEr#6bWzK zJNsVKgT4E90Zz{E=%9z$<#frI&`jrffP(O_Z0?@;jrfkkPhlpOhF{V?hcvynrU;q= zGIHNn{;!UnS0`K78J^UndYCS@#_N2Q$lks;w@=`-r-yha(P~XS%a9eevHGU!lr-ux@qSDL89*zT7YM(y<~0%H>9`_)a`%&V;l@vWFWv~g zONEXV_uQw8aL3(EJ&ewjXFsw~wTmJLEYghQk9B=r*rGIF9Ye7Lq8HrUKFhq_xlhv| zksb#Qm`!`K#raLoT22CV{ZoBT&+^=x`Cz4It#@yCx^HrCC8zC6rDyeaZ`ZkRa#H2n zZ}~w2EZu_2^7k(0N6|Zacl^xY$Hc$|FW`n97g=R6b5*A#i{H&PfyD3D4RJPwN)F?9 z^XXX?a-UTt@w6RgEo9vm%mrfExggTRc1=nC-tmGw z)%EIVqrU(1{;B$~e^d1A`q#ttuN`1{yIcQenIJHZlv*zaWrDKo?0b_YE}u4$f_@=$ zk-5tqZ|So{+h%?rp>tqjZjnK$PC3${?{sjHZIj6#1ta79+#LpuS%#;I%J`d?Ftxm5 ztPHx{^)ap3t*AX{4qpqVEkvfw!=z0`M^^aDLeFgfOD4n>L#=;Ff^*w%0HTCaS>T;FCAJotJCj z4T1?r?PmxFJFb`^)w3f#gE4Wn06b!bbY1@(o>b@Yk43J>*vnsJpgICw4j+HS-s)Dj z-|VjNs^eI&%hb;W$!z&L%ZOU^ZvJWMDlL0H^?2(ZWf5`~Pl~tjvJMR(kBBLnzujhT z(PZnaNVYDj5 zphV;c)t9H*&D42WS)JSsv4Grbo{}&=+3)#+ObSB*z_X9g-FKt;1rCZ=S`+GF8h`!2 z?SHSbw#xc{rt1GBs=s(1S+l~708tn5>=_YAZi7q$Shuw8)lOFPccB~VG+gDQvx+*B-|Y%w??i{G;UDIE60G`bVvlW~Tbf?^EeD#%? zef#=l`rVph+3``$W9;ji^gFf1vTae>IrjDK^t*M%vIC>ChuPQJ>35onWqU_ukK=3o z#7XbAGi$}t>oteg>zByc{{FXCwEcrh>-BQ`s$Sn_UpH96_76L`5l3am+SjjxvQ=)x zQQ7_M>z6^<8n%n_$D)l2klJWze}7F-uvQG`;?XD$3J=--{@bLte^_U!at8PVsbhBA zcxX%h-u2WuCjE=5^$70@Mn+EjUvfh_X}|o;mfY%&9~AM95tiy1_{IM3^^6E*T5|WQ zVbH6_A%4Io{;bP9t{!a~i+vztHdhuxQ)$5eLZEk50F&2D<&+Q3|k>5=0 zv8{89{Z&W{@R9UBq+e(0DxuQ_E?xN*AIs%WN9oEh|8v)Z+tCQ?*F6<3|MpRS)$;{i zbLm+pM}z)67p31_mj0(GeTOJr?TSCRc5f(2PoCt`wzjl(^0;v&`@8hMW$Al@b+O0x z=a93`ONaAkcer$L;PD?DkFM!h6v;F9etY@5KR)Ca?s6A1O*%ef_4o~&d{^j>((k&9 zB6wGO{)5GL-6i8sDZbnH(ZzTBJ}`XO`K93g^q1qg&#=l%&aj@-zCxa;U0=kBZM$rB z)4GL#?RtdQ1A~QCNH{DSj!%_Wj@2Hq z-tNBrNZSOspx~OnsFrlDW%j(Pk6CRrcAWbv(X?l3lf|aMbl>c1ZQ^4zABy-#bsW~8 z>)+ro_k7T93++yQ1;kX7f<;Zo)6SpC#eG+{8jC@^)nb>c z#@~tx9md8oBdHcZnWLpY7=B?;5Mw1Zo?8Y4{R>F;p8flp5_gso`$wwI%CfuHsZ~AHMJ6>ZjZeoe-$Q5-Qef<;!rm+mSGU9tTbtxq&AO?kSXstLl%Lussx26UzPk%dv;u4kD|PvzipsO_V0J}SM2?HQ5Rm$B>t z8b-Q97uTiUlesv~-GrGFNELnQJY9mb#UX*|D0$`TxG0RA*p@=24r{gRU$d>N6raPu zH2F25SmTD+{Z|D10Sk{d zevPsg)_9M8xMm}Fb=f2MvW{66K!*xd%w%cIPj}2Ygf@!KD-Wi$_o~-t#8X~vr zGo}$P!V@dZc`bc_C(x&!Smqr*svDaS(wShE;3zsecVljx(a|golKUSR8poeXU>DzdM5ZdjD_gd$^Mu@4dzPMg;XO z{^Z|}SL;gM=D-4Q6w+NxJUJFzbk>kjUB2g@j?n>oaS+<3xDfUyXzma~h2kj?N_Zn|`|E*0f z5fo=RUYqfJ^=;3qPoG4rg>L6b+NkVS*4yqd%7{>dP8I`)nCYt+&+>S#a21ligr(*S zjXO5I`Y7tc34hmkesBwqEjgd`zhJu=3!8etvIi9YG>N6mh+2geqr#=nX>{Y*jclqD zv}4_Qt)54!w-3_J_>V8rw)iTW>HqCy4f=lzkN>9szp*Up{{#4PSnb9BUnv?d^!$K4 z^#7{uHrxN#?kekloicx?|2;_ce*Nqw{Ri6J`9N>GF|XV37}y7hPYNi$_&bGq)2-~B z6o(F~SM#p57nz)XGFyVd`%siw=s9~^EJcOEbCf9u0#`q!;{SSvkNN6{!lIiwpJ{6P zq*c?XE1tfzABwdEOYVUBSoU+7@e9>m7^3Vf0~0wI^m8JPaU}Qp8TbHYj8j6B{5hI* zVGu7gkESUM9lxcjJ7epTV6Gcxpv*<5UuyX8T4PCOQ;kY=Yh!@PQtX2$u!Mj(2Dg7HD*!hzJF#jRNB z_0_S-;(h7$onx6Bl_R|#Pt51_l-Cv5?5RDquV9{@&)W!3Py>mMs~=CG#xweYBI)&L zD{oqXQT5~F1!7M&z8;(Wh}vjet{TQQKLHdg9@oUgV@J%7_jxg%{# zP_6~+emx8@}?)^sM#)hRql5A_g=yG`}AGDtwDKo zFf%dR6$;W53j_XKn*S2zKdQtok{;X+v4MtN-x&pit~2G^;6&1Ub^Ir-+=!ibHzqidPXs|7Yw9Bu2| z`x^^4^Nh9iNA6kwBh^tDu%-G>{6K@(6GQ30{DR>@J^0{lz2^9eqQ2`70aP>8HM>66 z)?KV7n`=9+GRELf(kvA%w)iJhFIyPNi|2U^x zYiYl5X#G}XsqVW-0-~zkRuxax@x_Go7-$foQ~ihA5NGC`L;`TCp7^x#v*y-+O(Z;^ z91v>*LgyNul|F)W^+!b9Zw!nsj=)^5kFa4gEKnz$)CvBf^?Ry~;3(2Sx}ew7>if~h zBlQTWs$g62B}x6cO#K{QX=jkNnW=Ys0M$p)?3mmm^^5r$>vKze1(1mKxr-}H^m`vZ zdHQ{X=qviYvVNuIyS9EUzZ^+^h97#Fsb8)K{%HOQ*Az{Trclr%=~r5t8pF~tIgU2- zakeNL)n#6+&l9+AyCz21Z>D}6zcleHek#2~C5a0I`gKK%h@Eqb^@E4ItRpRFj*rK>H?_sO$H&IHj~E~8e&ZCn9_xO`jr^c4Or%Zk8PsLeh4XlZTM4P=f9Jd^ zD_6!b{+3A<=63s>Z6Hiqwce_^1SHD+!_Z)6S5mxz2g3N^W3`Ps+nMT#84SyG?5bL} zJtZlw{^4Sdc2Nn9;gje%KbDb zXVSbdpo_}Q49fj(lXAT&_e!-Z*DEN8zcq6`V8!n#cUe&GXI3tjF}6z^A0N~MX)!_C z!8Z~Qh3c(nrls(R!x+#=Xt5~J10plKx?XlAw3@M>Caex3&7|>3~Wm}WNzGkNS;0-^ds3~m^crB{A zX-kkP+7eUUF#mqYBJAs@AYU(1)DzK{{sPVEvY*nec>Wd}p$@ni{juc8hvZ`V-zY*l zF0eUYF4M!@^>+BCj(ghSM$!@6WLdng{tjvu=YWe0tv^vu@hCo2{z?Pq48h^WmEy)V zTQ=7V4wy*1F{&M%gF5Z7KP+l28|SQuIFTI8fJ%le!~4@RK@#pGaI(DmR4lxqr4P#D zeQq+C6r+Md_1c>pLmMsrGggAjoBpkvh_-MdPUqB=CISz{z@971SR#MO+j1K^;=*pA zXe@gW%$-@8PKA*Gy%%lQ$8Re-FX5oslE2Re%pHfZ%nFe~dhiW%P0%UMaI{{P_gK{C z)oK$fQKIq9)Q4dW@%$q;FBp9l{h1BXHQt{ehNk)57o2wM)cz|30T|7I|5ESj1T5XW zP@9=!gvB{20O-8k27>1K5%tm%3p{34#ImRJ5$+&@FVkfJLDaw0kC5lih{c#rX2>NU zlOGm^AeK|~xg>{%PnpXG>E9(!F>)3L9CRaHlV;(4(Z2^t-t*x9rnIkkzLt9jL*!24>CAg$a7Kzo{uO4nd!F#|B}r+k>kk)AOa)T=ULVYiU~$PH$YrJZ$hI?LF}cgH z<9n!2j^evb&CkE0@7k7f@F(9XrTGpB^L0}`-I5vQJFqlgSGD)Ivi5p~-$B6DsNxpf zAzXi#jd!9Z4En#}DMov)`ZCo`{?f1tZ|}Zt@~id}Cdaa!ZHAmABaln>bHS)E;E&gq zjB&ggeVq@?caduR@e~c}pRD=~x&FSdtN$*LO!eRC>gy($9w_($(+1Udg{zPG?e`?} zn>wXzBo6`s_|EwH3G*8!8opEJR{e2RV@9#`g#eR3( zUc#aLlcc4W=(kv)q=G)W0s(})WSLv-#b4;gyw8w#9rbVVXNH2@2GtkT_+8f?R8d-9 znuys%WXkfMpCg5<=Ruui7r~$`t4Lv%TmJ)d@6y!=(To%pwi&iC28c?5Pe){5p)c2A zow5c=tSB+=+Is!py;J_@vrI|P2z}{Bb)xKj(cv{N{qUNFTU5?pxJ79bqKE3rndRln z-m%&}XX{c1&gxfwRzHzJrYojv&%0`^EmOPZw#C52d0F$VvVQ9sT$s5ljT78#z+Jy3 z;=aEPx=wL2Y+a-INH41Kc0FoqA=LDjSQ`uSfxXlGnf$~5Y9`j9_>B*wLjSyb~Id-;sp!(0H{&;?n)mG^F#>Q!+*1C!e zow^xlyuG4|9Nh8eQdU43&mFPeKWp!;OCWCZy^QZn>jpDzlgEpbhq-#HmX=TUU%$6> z!|%VJ|5HBrck?eks`+1hwaq_zRr&lMuL;23Cv2KCYZNGu?23C{Q9hV(`!l6y?q=P4 zRw_pHne%y@vCr;2BeKu#$m74U&wl!tvWQ$`&z0I|g<0OJCyc_M{uY=P1}`M5%|i78 zp1h5Z2KhU#3;A{P37F?wxj8tuSY6}DlikmT>Ug}|rE<^VT@T88+wC`qv9ihl)y>%5 zdWK0M35gVgBbr5{>ANknXO*oI3d$n}PxPi;AU*jFdEfr?KcgFNZVs9v{{7(~3 ziQ2ew>ZbjR7f!6%q=%0?=0}z1^tVoKTi(fb;PSowJmfR@Z8SZ_^Bl*=pG5xZFLtch z2zM}JmE5Bxx4xy%N>kw*y;#PAWo75gL~yfV@~xJEv0+OAS>;l8nq$A4+tTM1vF*c$pbJecp_rqAJ$CYiD_Da2;G~H5)AP^oQTZ3ti>qgL_9+ z*LdY?@y5@@;eoksYt^6%XLTl+$cE&0t$nz&ihUD;MSs;&xxt(A*cyd5PsS3MPQePr z6*+C1sJ*IQEC2cW?`5s{6S>1{ae&y&z3{p(E_MW`mG*vGouGa#h-&f+Q8YXr;Ywx+&TXHLlGZxRoj_2@?z4F|V>suPV)GB{3ih%v2 zd$DX?@n9)?n2K2VoYPn}@j-{zCUKVU`Rv~W`gwpJQK)NvPN*qma%R1M+xvi8PizI9(}3!gD&q%h?JlC!DhBKkj7a+IQ~dzI$^I^Xp=01THN5@x zw2Cn3m1qMmTI}2nz&y3Ha5*aE^i=<&KS%sNI7XFPu6?am47!wBo!Y_L(D9)s$l5Wh z*kPUOt*K1CoyZO2D&-Wp*QH`X?ls<3$~~VvXOjoI{L=2_@7Bwd=`)GIfoQkh{ykm zlqE`8{8{Xjx$*3}@fU?D&wmy>X)f+a-7Z8I924t1mvsnrk$LYqh>kiSP0R7zg$>e6 z@Zx0)-h>fn9=62Orny%2&igFZHiwojygtgYM5iLQoTsnP@O4Sh@`ab<6qEi?b&$i0 zZ@D(;SKAW*H$WxOmva}?slCr)qvpD<#AdEP)R+4Jdx}jAb&HNItUnN26ZkPF_0LlK z(XkyhP7ZQdE`Nmkjt3Zm^XvYAbYfk6(LxKBI%MR*uowU}q;@3TX=$7j``w)RQ>_qt zpcJQSmhnfjq(2w8u8ZpWzu<2}p%QJ7eqb*>>7mG8dIFF19zDg-t}u8o3Eqr_(f-;1 z-i3i=a{8L76W-<1C1nQ3^tCVo=XXtUMPyrUl1{)BjHu&Z1KXCuc;2f&{2SF@_<(4s z`gNYI>N0$C{&KGb)Ifaw!pX>-RTvuBA+gxNI*gU$7%md9*1PqJlktN2HRBxym0)Nw z`-%B;>8`NW{DH0cOTCUBOqT0^E16{mU_WU>-DdZb)_GIz`5){jbx@5z^> zOYu5iu!wG3y;V{wKe7Q*vXiD};f6D=@luntNvZdAc#o;uH&=E$dwrCc8v-HTIE0va zkJ5+FW0zJ%{r_g&w2GkXnzvz(Sl@a4zRu^5g+*}9>+h*aWNgH%3p*_JUYEKgp6^;8 z5U$w8lGv14!55`M%8q3mPJ~3UjPnMHMv=`U#4dmuzEutWt0rq4erS-0%^|&G*+UqS z|7jqHLi)z3e&$z)c03v46Y^Ky;dD@9c*|w#p_+zMiO;+c%jxQXC>NYWxvX>6_lVyt ziRFe_&S%o^1Uv_>^o(*ESF)%St+~^|=?QS{jj0|H*Is@HtIeTw6vnL^TRv>f?a>;@ zkC3--^d2Ht$Frflz|i-RcPMMvNK*Vx- z)C%LF$N9pjTJHo9JHb@6a`q!pm{^ktG@N)&o~gOv4Juz_8@<~a@?Bilnm-4+#DD4V zT02_{`%3;Sfg+ke8>~Iq!-kj0z0n#w`~#^ToGO&V1@;>6V}y`)d(m1HiK{){XE|!l zgl*$mQcvU`ewRxx{R_h6PAcc7J2A#Tx8~M1W!4b`g(9ku>z3ZddlTFiBWduirB=B* zG?4iR@!V@IxUIR(!-+8-)X*ir5NVD-+0jAiX{&RLZiG1braGCQ*tI|JZtV?EvM>0p z7?{0%Z-@1zb%bo) z|Hh{DkjRf?PR83dc?%^m;I}q@0c(313{UnH1nazG{^TH7mz|Sal-i}W&lmmKa>dl4 z{nvx};e{Ts|2mJKp}944*X-=?LVB^EsL=6263i(yf0Zo`p5HHVwHI_ zq?EskQhIV#Vniupskq~Mn;`$^lp5B5oi9_NP|e zTGH!RCA;LCwgY?i@s@7&72!%cH&20UqFW{aBNM!m%V4xHFyT1T+`5LcuzQ%y9m}RN zmZ|q>EWHRTrmff$*^0e%`$#^AJEljFJkj@mq{VSj`x`S=u6#O|TEoO0%i)XUnDkej zk{71G>YN%F&-X=tC6If5LJ(r)eszNzR?AKf-btdZ_(F0kc=TcLXr<>BE-X$7Jft6^jI;W1|I4EjK^by{bOe9luU*_@uT9o!zfYv72-2 z9W-YieR}}Dx{#Pl791krkO+GXos4mPpO z8Kj^r@xtdrcuC}sK=um^;z?bD0?Yt@J=&an06<9hk_vHJYyNZ|-cL?!m7_qbG=0TS zPvlP`^NM62+!xtq;*<9)%?;a9`H{8Gw6w#`VjO%TW9n5(xb&9XKfG^m0x2l|%S7(A zj)xVp$chN@-s6)R+`A?BfuGVO8$9SoSbU8)JIDir`@ljqnQhZm!M#M@?N+3u(bipDm$55q+sdC!5KB2BPCY<|1_UcR=vcH-XYVkTRwf?e7fRmyfrttJe$m?RiXL(2j9iPzB8Y$f?z)HR<6y@r^~m| zyWA?;bUxkJFTJtFuch8fh^XS>MGpCJP$2sCg|g zs@S;Huve_O2F9pUv0PBk!Q4Q8iraO3@_$_)_RhYjQ0YY@;`tM2c>BD$HLRIkRC<6N zAz5Qbla0R*(=?(SHPzq;8yQH{-M!3u%ZZDUuJ26dr^HH6_IJ2mYk^>W#%S6#TF1RR zUi%Nqzjob!Q~vwt$1i&uala{z149g0=xnBuDnd&uzJzn z4X#X*d3w|DPp69WC;xF;l>S*Vd#6Ua(5Rs3%_!@BXNs21pMSbWn4d@urc!ph9xkDd^Q2Z{altFBcIk!JsZE zR*GYyCN@7FptO~ZYP=Hk4C~p)zq7F=XE|wckg79Pr=t-3Vxf!Z zPpi4t4&RsV!&^vX=Dd z*vIiLe0z6i!-M5!g6jtr8|MFG@6F?@F0TLofJCBz??gdUmwK(S2G>xfO+@UCvfOCU zR7A0g#tmuRs3w3#CG;l3?e%I}wNkaMty*cJZnz+e0s_GuchpY>_qh!MZV=b}p06|S zyCkUf^Zot)`u%=+DEGb0%=^rlGiS~=XKJd(L?*u{a)W_>)&7o^!-XL6V5j!X`OPhl zHT+OOA!#R%VHRIf8mk%|xrBO~Rquna9*UzlxCY4vjlof(c??*c^jsPe1WM>@<1bH^vjxx;ZZC}s-gXX!6BB^9r z^#gdbP4O*RvkVd!~2%8AFo#%uY+f5?78EHDLF6oO7Tl zqI4V~!sY12ul)jwLPOqx<4MfA(x^cPBP%?>BE(GqZ$6uimT4Wei+cRhBTRysGqwE_P zrhWeLSkltc&?gu6DSyZ&2pvl<#Ap>?UV)2y9c413m7XwAX_1-*FXta!EaBNc9kg6% z6PnMbFEc`k7Puk2?*cgI=kYFmiWLBB#;LOVN9cR!bLrE0>Bk%V>QP;>#dG-5=^9u_ z$S41w*2kW_8WN6YH81I7&))KXqL1B*Iq3gDA4^a3c**KxpHJLcAIs-YN+9ygTlhb; zGukFWWh{A@A~>ZlLIpqenL1O0FTC96J%4P!2;I7Tf|-plVp-H5)83DSjj8g`d9 z?Pr8P_sY{eN2Yxp&39g9G>@RgX;MU*(aB2sTav@O`K}?soy?mN51&=gZ3dG>pEzA%C3hhw+(ssIzm^u*Z(RkqzcwXj0{o!kehI<@c?T6X8@x_h#wtA(xj@=DLbWM^@= zUXaJP{%%5m_||-`WQTI`{P#yNDUHO!4dT2%i}&eEU__ozxzXHr>2}akM6L9mem=WH zwtip1x6&i+gMe)EKa9?ZZyx|o4)1Hk*H^*KEpY=eEL57-iSL3lW3L)slpf0?$$PTe zTxzdveb8JTaL&Td=m2S^t5ydsTQmZx!s=%+{UsOAwDG{#jYqQ!h7S_bk}XZVXI{K@ zZC-eAT6L1c*+mnE3YwvdCFAlBKka?WCx{lUFNyq z--1MB_pk-lgQK|3tpB>tnR)tGvvoFL_Cl&+HCt5gaQyfbiUth2Ioa6{%`;V#! z1FP^EkEnZs#&z3_mHDGj1B!P!EV|~pCui8HvA?<}W8(~3TV|I8g0jYkE6W8Kep6mn1Vz-{Dm{lDOC)>VLiN`;Iy2J__4#yhI z#8_RX^n{IAez&*_pVH*#;L<5*iJcAG$#U!xAG5s0m)B?H7ZAw&z4aH&f7y}L7D0j6 za$kck(oUu&@Qbw|u`)fD$(v{VWIQa$Cu5}k2!u^EghAZMo;!h}qaq;qIXF<1n`4S& zsfj^Qg4Yc+MR0Bv#oyf&Yh&Csgxc_u91X4|0&+K&J9bonSa1&hu};&s(>;#}YyT^34|7IHY&`d>{5P=j8wH??3;n%X{jMtn2Y;R$lCWZ}uAt zhEsSZSSWH;gecKH8G4|95_KI{oYflQ>nGGgiwaHssW45I0pD|)ow8S^3g3Sp0#I~@ z{#gSh_a`pndHK(Sfefg$x#sVQPb$2Qq`~bC8T}nnMLuFTk9_&=dRPP|+Wt77u#4h# zmMfUB9c;Rli5Rpy0Rmv$eXijf_K@J9El_BZ{T7H?EFbXN&efvwRjp`IZ1SkW2Hq_H zt`-kW&+PTSWgWmE<|~pzYI<$5yn6ErX36IA#Dz;V|&r=U9IPSq>0i3>f8m z6pS9|5I*I2-m?3*z_-!G#DTKJ?N0Q)dh%HH@8KB*9unu{fdY@^E3sWPjxTNO+ zv-HKS{IjvtUHU#e5CK$fr*b#r7vlEE|7&Gki(3n~9M{$nxqUreR zX5{84K1u6g)rd$m_IZ2mKnvLP4p=cEL|6;x~ ze9+tNe{iWQH+DP!;cMu@Z8^6KEhJ3@7yBAln~G~}FtCtUMDrUfYcVlB>@GeoGWmPL zHYmYO&Gy~gi%D2H6u+EkYkwv)U&*k*GSgS}F5Wg)bx}n_|5Lyf@tEoPr;p3(yL`q~ zBAyz8Xu#dnB!zK~jSuC8{PYYebjxR3llYi8LWrEbZSnO}wDnf5$P#r&2UURU1+ouXQsND~3H~Xi4KD%GlYOx&V&laqQtJ|I#Z7GYo70f!Kc=zl{9Iiro zHLHHLtwn76b4@4}6QGdZSVa{yZ)7KEvT$(%DN#LK7dLq22Ax77D&|p|sPL?ik)Zw6{IRri4H+;EXSt3f!SQHgkwoQJ`yTz%x{FPyCb@ z2t${2s)t+LdHPk`GOV3u5AiSYtFA_UZ~?1+(DDP&rEVRjcOd&mR(7M?FD#2AVfmEY zT*~C7Q!C1(5i?w}OKR|AGuf=4=zPewkfa8*7lhlrYEmNr0s+xDr@J>qcfA*yw=^~w z^3u<-Jm=;YF8M)M5#-f?`9K!+{k3?f3imlmW83fQD8W3eM62`i<~v z8KENT{)xKQ&Vopn2HF>Qo1eeQ5p-f+I+I6yL;=!9$OJb(k50vU@f3cgSCd-jd z+W~DwlBF?Kc=AKPr&rB>(`~A`>=vjP779;P{NhK%V(RsVVP13WMZp3kKAxA9xuKwo|ktG1IltqNniP~C8`d-b-ImwKPm_@Mb?WR5AP0dp-7{{t6<{rP+yl6|&66 z65)Pr=suP=f~qdMi2<-5cerBVykBaQu*RC#_89V71AGJd-;Dtd=BGIGtGh<%(&0E7 zKJ$TM@wN$WpI-=L!}OhSKn@9qD4KopGoEmMDftd}H1uR&%v90o%WaaRt~LCo7S0Aj z#v;cs)4%%|{X4#nbP(?u+6J^9es#h8-MCIany1e{<4RBUs@O!M#Fpn_Sgse((vO+# zpotm<$!WdPXK))!`QDO0#rSQ4crNhm&L*Y^k+pC=Yr@0l9AOiwBCaedsDdJgl4xml z+sNWb!=)2RrZTxdk?!~xfg>ArTc8G4Mh_}T-@)UIT#$Uk6Hq4v)Fc4f;(EY;-XPa< zp1>V*3g8Mpf`;G4&XCoYps9cSX0Fi$u=pwJCpGIx`Za2J`7HB}eu>CftKIMLrcnKt zRDbBWV?a55O+`z`Cyp+yt@@8YPePrqOdm}%8F=GE?{0y=`}M6lIkE#AQgz~_4i=MZ zNSn&2OKOH5Ts5*+`Zw0qDD!6M6kkt%&n~=vOjxVj1*$QE+b-)#RP`Ficd2tP5D^~e z{@p^2+YP)>e`NosmH%Ov^4D4U&F)_+KO?Vv-um%!xAo)(llS67moR4w8b@?#Z(P{k zIJH;zwe6)NNTIFXepDSSW$%=7@a28)LABp@WHI=_p3+mpvhv7X3oLhOR{soRNzCw$ z5ZyNEJLGylkgagUW zrK*w1R)0;ks07VAAEdVGO<1f7F_c%o%{!u~&?;gB(F8x7)~hyE))R$i6D4XA@3>2z zGqDC6fS>h=cvOs*z)}hnxL(?j2^Dze|B_mR!TG+zf0#2H-7W9XL@KUzNb<&#VCT5l zmx8Bjt8P_u!BtnOCahO&YfX!#=E)?h>Lr+*P|qzAdSRU&$|skcsH@bqWBDNrR=OQ! z@Bc(AVaBQ3C0^@|*ubU2OKLYzmEM(qG%huZggO4ErF-*lZoVbX#)>=1KSJ+u3t2O4 zsQo<4AvXOC!%aT8U{N}{ z)^$K%?Hm;(Jq!E7^p$2(RaCmM2_G^SCPgzJ&GfcggtpWiL)G;4CPO4O$v8-AB0p*=IidrD($!MY_&sqZ|C~09f5y*dOCP@%&gY*=tAdh~^y-Q=LCG~? z*<)Q$a{8>G_^u)8SF z^~Xt40#rsao{ECQryARA#By6)Bdb4GPg~H>eC~zXwzyUd{c+hEUM|>G_o=}*e$o`W zSqs_>^O!4{4YFo z0zzz1yE-Tdp-gz5kp=#`G7*^RiW}XwPa3AB3VVbax-}{F2N**>ZUT2>c>w)%G7_0r zZE+bitW+W{4IV5u>8C9&l~#YweGy{uCxSAA#cNxA=~?;-aX5II;qV6fZo30gg?$%U z8o|`yvr;8O7Oe4PuEZLrPxY*^ilBgD!GjZejvua=pY5rvg1fqku;AFRU~#q}wT}uP zevUD$nxwkphb1QT^dIQB%6}jd7Fk1)LC*yb5{Ei?`4wnMsa|Xi;_!f_>$Z(;Q}~b` zv3U?)h3J?n{PbYM!W71byQzPYT6I&C?!ZYneyAe!8ME;h*Y;ywKM(Q$?%5KHlqm%R z%YWRpdv0IQJxG(_+0E zp2&0TQ~XQ96UZ`wrPm6RB8i9CoP&~ES5Y6jS#i2Heqafl7?fOV3qf$vb=J6Lg9%D* z5)}p|b0m2NCG(v9EbOqKWD)IBuaqBmNQtZm4cm`j>WVmxmI5??VLh|s09_|GRzF<8 z^5f<(Whqy}9?^(`oZ!JhY+3DDn`}Sjdu|A6%<^=m18BQ8Idu4?lH0vRZjObTl!9;l z+<8QR%eq_a`XOf{TN%$oFqSdFn~lBvNP^UJN_48!WglKD$s=ut2n+F~0) z$Z2E2sAc1W^1_$S)bQO`c8j&#Y^*iIdDFA#MOMDZ`4f%vD{(cPUyfQhzxUK`OZjZE z()1Q2t(?4^l{azNz91P4P=afewGHkPgG$ud^kLk4dBQ#M`VfF$;W^v)XL`;yVv=W_ zU&#_Fjt=)LuU>3diHSYai#*7~6xYvMmOfZ8*!cMSv$F45_?nnI-R0-cCG(^925z@s zBSEj1%y0E`@b^vc!1ugADE%J_*!u;7!Sa{4oBZtKM{5#a%4hbZLR3D|e(J>ISXpM# zT^XNnJZ*9FMl$Yyj@jgrh5wSx%yT5l3ivGRw-yRF~<@SMu%bR#ueZvuof{^3yU(Xv zBk5bcJ#V%|YwqY*=?gwh?=*bm7Q+Oy+f`pCUiOAICPpm)4~F)roB9cpoItUtc_r?J znVGi2^K#jt$j#~+NxMI*JTQ_EtSnljfOT$@;Hp=lPER+}JhGZg8)DYwtb)6p!5 zWW=~?eky4U^>nGg{dgX+AOyMM$a+tsQe2yO-N#$Uyn->tK1hBmnP%(QeA}>>r>B}^ zcpCg@`dq_Kblx@o$4bdvfW$_+G8v8su5=Z@u&@vUR^Y>Ds6|BcscE5yEJh0Fgc^__ zG(@ra{A0onJ7Dp021_}J+eN%BZ!&e^=lj#l@dj7}WCr-CXWL?7BplBh@zgh>CjI%0 zvPx;tW$$9SAB}DIgKBj$wAvsP9`LPST|?#YtMjZKq17OlDdH#|iHxlWm1q>-+Lri^ zZ>y!R%7TawUtx=trw;5%6PUFhGAU~rEi*tDxqFV5%}%%cQxxJlX!$j)JDtq%Z%wZX z>}?;Pq~pch;wn1K>`=!S#DpvO^@)h4OhlB1@MN(|kMK6wWtnyg&yHb@yL%9FPBE=ny}5cAA~>UtD)W&VP|Q zG}FMvT^h*xFE)=rK4aG=+XbhT7I3shs?eVuNalkS9?$r+O1gq9+~)I0G!hCwg7KR; zF_w(g<9DfuC60r4)=k7EkG#OYO$?9xG;Ni1<^VdQ{VRCnOVpXfI}60AVFQN&eOESc z@nOCzu{+e2a6Yj=2Yq(iOp+$~brSCqM1hpZ9{exWCd4BW%m$-yd{y?mJTG6gzn^K( z%M-QUXk*Djee@CvFWao$Q#JAw%df$_+A3<`r#tQh2W({hzI7d)z@s`s4psA5B(Igh zr`nD&c?JYnm;_|mSF2owP~uiM5GtW3seUcbi?yQYRhTDEQcQ&1mFBBBp={6EgyzRE z)T>nC&!2#P%x6b7daauk?!nK=Krcq63FYHEsEHKRxf)!-=u#Hcpw`-k>(dArLKqFY zC-ABWW47BR6TUMDD}^hmHX{{oS@S}N8Tl6SE&O5xb@c9$-Z#rCtm_ARm2s%UzBSXoC}*ZMe7^=YPD>?{agRyGG_Uiu zj-r+?+S7{4Rq2b)?_P9RwrDRaIw4zhR`;UYWQ!JA(V5wzQ@R)Jl`UFqMQ3M=j_qFb zZ#?j@My%+nY|+Z@MQ_a(japHcEn3>W=$YA~O;%LFr5*zv&_@?!os}uNd3lJ~Y}qy4 z%O0648)7zFc7FG=d*#Z8sLht0)xE5ictgVG6lFg{P3s%OeeJw$b}oLqENb$;$qE`4^oQrSWjF#^=;@ zzth9~lSY<7%L%q>w`q;7u}eE$Ox_7XLOMA{V>B2KFF(vZy*Bssp4`*pb5B3WJ^g*| z>Ac+K3%Scra+eBx=@w6D``vv`uUITur4G86pZHW8+qIfU;Fe~Y2cPf-Y#1{!zv|$x zOq?Zbh8tuh3KY1$gHbIW5a)qMlvc0A++RIYC15w@HI(H%4j7M~;nqce(zA%TZ*P2k z#RXa)LU!Dz>F_ck`4z>@#+7tI;elZsgnN{yoG0InAG3KMRy0N-rSbKZ?ucRI3aYE- zmdWsV+3qxg=9V9yblTyW_#_zRJwz^4CwyUJsF_2)fBrdg+s)3m?DCth?b9MR8gAuk)u=9yu<08OmfWM{9L!V<7*<1Qo~T*Y``2V&J{6M| z7UC-UE7#jASTJI7#Gq8+%h$`8tKa}TryDiHmT7_~2G9B1Z0KU2+s4iju0B2&T&eL& zHLfTgqM=c`b*BsL6#k+vbD?E`f@hc21H!wjLpu%42!s<2grR@7R;4--bw#m9!eV=d z#ST_6=6F3J1QRKRcw5;17`aB{gy+YHZaiB+QCFYX=`7#N=fk=mU8+&!H6{umi6!af z16WdnmTDlQ_C2ai#aGYt6>khHF0hKEfkIBLs3n^z#j&B(Cd%EkXt#m8(=^IX_xDPX zsrka(&p(nd!+o07QrdH`M6uhc>T?-hMJxIC zpDbP)=DOlDOA6X=59bGDdH3U4)o!hObSxTMwfMEswcGoQl7jU85U#&B+%_KIDek?K zJxbdEQP7+#Xte83!8A~OQTis<3%9PG?>&`A-pFN5kJyB5=pFLa9Hoc+>ZTdp_|*ej zgqZI9>d@Ez3%{Co*w^!`Og;q7t=iP$dJ)U?^*+VbT@!TIHbX!9izOcsnP-J-B2Za& zYm@ie)3z3y1C%2!aqc-vk`^?7QA7b;X-zyf>3G16yb*h^6TiD)#rEuVU1w$|8QoF? z%6FG3c8hy{?>>B}xlGpZSaOjyz%q`}CEP3U9y&;{9~#sz{zl1E;evVpP(_<7;UsXU zy^L`vRrp|>Y0un{GVRaTn}YS`U3dEX5t|_)Ln$~zP6Qu#MXg_)IVU%rSRjjIh_CYn z&cLtSZ6|7oy?@7Tc}X^?Ou~247gendS{~;VjzLT0E6nBx+m}bsq>!6Olb*ijk>eeh za6^>3w)F;Avv&x?cJxAlWbiBZ^S{$w1fVDpW1qtNw2C7+TpzWu%CM%?{aP-?>l6dq zkNIesV62oK&LMvY9uk5&Y$!&*ja%#N5O~l9442j)2yUX<#q|0kLeu-&NOegonB|(t*`k_vDWt{t(7VorQv@x2`gRLs>F8xN=wh(WbUQbS7fdehM!ZJd z5l{gYuRPOJ@dE&zrDD;p!tqlB?&7tm_>N`WsrbzAc`EL=7lZY6RE)Owp1Wwd$g`PL zbOLM(=X!|R!D_SDnfNuW40Ggair70vd2y{$!0Sb|07T3VL=+^H`JS1m>yBLCMZ z1TkP9!#U}{=1C`L-VQIePj#K>U*_IAM?^tl9^w;Q)f8IqaoCncgxJmQD|335D7M*1 z*4FE+l-9*)l0%Ed&x7;>Lk;5nP1$js*_&}e*Rc~Ej9ffP6<>w}Wh zoG5N08AUr{_-5>TsebK?JPcz6!xDOaD{ zt9&aW#rR6PIVso8RAHMu+DY*{j9EW#RJL<5JnxotX}F$QH(VzZfnhDagPF|8)M;dt zBU4PyD6A$CB_$94jV<0((}UOvBqo><{!`L2i4GL(4~r3FvZ1Gk1unMxK78Jc{bD~* z-4DU5%ms~6C84Mzy%G7M=BqFZY-dgC zXP2w2Pdbx3m9>o>I-wv?-T87Y>_R}uk@^G6+AyH56A_VVqFsrnGIW{r2op4TCSjQ; zOx_^X6aw6n&oYFeIAW^d4o1f5{vA@7qMVO22>Wn5LSi$;g`J^)J(W=W+a~&W{!Q%t z24lAede!f0ezbsgm=%%df6{~C{5Gonl4`L;;Z%Nz=RaGGOhe90-$@I3^MRE$X7>Ag zfB=*oj9Bn@F5R+6_bEuVnpig*9Wcq0?Z9P^2oh1}AP zc#&kpWUsRH^E^^}si8ei0d-{;dHnwvgn;LBb};-O%TE{lkJAH>|HprB_C~)stx@yx&Rp?`v!g zpEXL_m+JSg%e8O&c=m0RS>#ZL2&p4MAWls(+_$}qQ=ciBFK{gYFEz>Qn?!xdJ@!9Q z!5qK#GU@jAYRr`EgO$c2Heyq9%kB%eZp)Uu;u!2`4}iu|EcxCJJap{ICRW|fOz9G9 zyNf)|m|i{*b#Bj%f**kMgUj;voIfg-#(tIG=fS=N*eRJ0djLbJ@q5mJ{h~2~J(Q;h z8SH+~xe3@Gd)VD}`GEHY@bo>N9Ax$T4e-!A`qcTHb?7pp(rc3FqI&pDhFWgV(lO&V z(|F5=wv1dg;0p!-L`<-m1UQSzM3f59Uf1u7&h+0Q2cxsx^HqA@m@B`Ik)XV_w|*~; z3hfQ@^*kq9$-zOyCgPlj6}?LH?BM^gIgIiQWzXMfC?AqY6ovZuv|KFD-I@A)(JlSg-?e$|<{xPwHJ*X#xtVj0#XABEa#)1bGwYkX+4 zuX1YlDlgOHu*$BPDzf-$9<5IQ44A1r(pMg;${h24bY~)F$Gq#{9xA(aC~e{K=|gw( zWh33oe$2?I?0qV$B(SmME&z&Y-oQMRZ{~X1H@(sK^r;i9r|Us_moL9>AZ~W!)!I64 zfby@t>{H##-W`@bOl5CXSx;h0$RT3<8{ahxr*7^aL7|%skDYF2{+pZh<^p>Ixxi9t z6Mf6rr!C^CP4+EI4~7FhWP=qfJ-Q?PXL^u#tAWj<%*9=AUsZQKSnskj#~=5hRkndP zdvh?2V^pnR>M}xy{%v)V%1vLdvAzcJJ~zk%`;Sg@R*-u!<;Rw z@)IIKWKuxd-sr}Xc|-aD8>|GLrFXvWxVZ%lJLt;?y9u+wxF$)06NDksTHuT&@kY2S zO6ilmX>&clr~bX?{z=c$w{FPx+4r|>C;EFloDpDdImGw(vt4ujJ$9n+@2LW;OMib` zmh113tF!$*#0vWU?(&0df9GCl{XOT$UHe;@-`@#ehW&-{%{?~9_?pjsNBWk!+;|5; zH)FZ={*zqP$Jj9cSZHb^9v!;X=3#j2-opJc>pMHK^zVX4Vr&;9QZoesGd{HPXG{(( zs%LO$tnA=R>%3L+S!qO>Ehx(4q`xNZDhl^+X!FSlP*Ln*kt=^}O!+WqPQd20fqKi@ zSk6cCjjG9;7;`c~@U#B|oqY8_xvSn5%c->U0V3v+^+gfMuHklHDnw z5Qz#=%0csF5b+xi*j*aPKEmT09+f6?tJg&0IZcFok#erFFj`Dli`=IQ*@00vG~}&V z8w6mguMyGWgAAxrhoDk-|L6h1)38$=aVSK+q3N4cKfizP@Xva-7KMIfAZt9$CB& z0&zoL#XW)%Snfb&d_4%ziUn8bN8D|1^u@=s_)ve_Z_U&1Apg>PtwZ9awjil?dhe)w zZkhatB=M2Iz@mYM(H|cTbQps>=N0w#o1%fRqJ4cd5Ps-70+>?2!G1}X<%#-TV@}KO z^QL%-g3Z`HWV5-8gER^svhbnzD=dugCAhPQJdz0>`trc;!9#<0_Q6Aa;wR;qds+z{ zi{ypN+dYzU1@pHK3^GkeV#*k4@|OZeIb#V*)nQmlC>6~={Lbd#pe1>&QNR0rEYXoy zV0>%dO;{h^XA5?4!;;|0W!>NZ->pAr$$x2|^Z(HQV&wJdbqf8MK~F5Oq@a3fXqHbUPb5|hvzFLRhkOS+#cZvBmeJaK9F0Uwi9~TGAA$;T z)*;kQ&Y4GBp+dOYfISXiJHcA2Jgn`=EJBC!zUi znhM;CZ!Eu9<$tI0BtTI4UTXjPZ!Diu`Kweugr~pCpR;xO>J#K|CX9hj>`Iw2xrk_m zG*oDALCAQFaqo#khM7I#21$;K!HOE;E7%*Z3_0e8&gXO7;S9yQ5_dsFpn|G)B_9mI zYQ{KztekiXy!wXxorfHr4SpuOX?%Hw@sL*c+V|zx^HuL{f7Cs}efz8|KQW%Kplo!O zuu^_{Y4$(D+>DfxJF9Pag&5&zT_#>nEKWhrbXi>NU~e0i**2EC91~rzw0F$5>DZ&a zSme}w*~-vm72vtN*z!raoqo|DUt5Fr8oJ3B^ap0WX&s|AXQlpme6+1RoZAHVUQdKM zlHft}_mQofbuc+KLU=}E1$$EJ-Hgk{m1s)y9B7q0qV$w;bgWgxC{~N6+^`Mtry}(F zqC9>|KF@3N=L2IlJR*=)a~Eoon(F6_N<{a)bNA-d%CtNXcKB-T90<>%i=k}oN@6-m zjUJbtaai_zF@0YNv@-M4?SJ<^1?_*yj*r`|>pcw*0zQ@)?XhMh-Fy@3Y_6_HPxeG{YVgA{xH(pblmD z<~cm2zlScHV~CQRuFRAw^nLWH7lxT7tMR026iRQ#f@3LuYCso^^!kaWpr;Rwq1jd% zf2CU9utFTK98!;GJ6hWQFmz#Js>~|1-aear+lX_s&`(24zOt~6W_n(p*PHY( zRoH(i^pIrVso`fE71dnU@O;X^k!4W_>*X8Ws06Y}3r)q6XO+vZQUy}s>NsXghx zHHpnitN7)hPOk?)FCoJH=-z$!+KSxPCujxJ+;EP;;`k{Io9uDyCG;+w#^E6eHPqH7 z8prB*x8k>!b6=WGxP`d}fbY_bk@&77IdO8U<$8mgd9OFa6!Xhc&T#rv z`kIK_Wd@7Ay7_u-I4nKi>SHZUAdP5Cb-m_GwV#smYZFBk%bDcH4q_-Pni=nqK2rAxcu44j-554vXjALDr#Y}rZeLVE17U}69v-0W*oglmp+NhoZ+_p!My7yb8`ZFf-QuxDV%zNqWENrYr}ieqmOqqft(l+IAmxHHwS^fpZnWj32IW&E_r{?oF|8Ho=6?7StgJlR zz$26Y$sb9(QJEs9$do+MHp3WY3>g}$noIs6zSa9MQ44zq{HjRAySoZ65^pY`h~7|H zyVqb8C^`{5tBxl7b5Zz2rH9i#;r4;O5vixXDeN6YSz27yzxdEPdPJOjK83_(3fj|c zL`O?EKo~iU<&lNuFRD%Uu938|OZDa@JsNsEimf7DS~8X)2Jo>+yO^&$k+{cLwFg>yJbHcnx9< z!||Fl*pJr{Jo@kBHR~tgc%3AicO9?)8ENCSm?GakUc0G;2|tj8Yh=!U(|FxNkG_7q zeo9aN55{XkkQ*UhtchGUUqew0xwU;& zj+)SCvk?)VudvTR07(1FX&XEGFAWL5WOAGA76YEfd5}?)2AkI3Haw#wH9T$$LA$4; zoG928E*9Ot<-_xh{9ula;MVjN59e7|e$aAoj=rj@JbgV|k)^Mlp)2u&*Ln2c>8o;Z zNMBpH=tf_c4LAB47ryysez5S+eEJ%2@Hf*}lpcLOeXT_;`!Dq6{Xg(jI~>*+>!?&? zktZv68gpAG((7n)EX)!#i?mGFBzNb@IdCxJww;L?1tWK2BrfHi zv9=M0!I>kGe~#2s%$-NtBg;w}T(^wh(gF@?s$2$t9#cKP0>t7hS+FZEzdP-E@Vi_y z?ZE##BFjrVx7Z4H-1+&oYd?=4I>i5Nqs-GU#}+*Gr2orHL0(DW5CwR+JSG9LX~J|6EBuDUPv6>AkH}( z84=+G*eOfOYX)x6%}InJ$eJ>&Byvou*C55CkWrrFH%}-*X&|fX40;DY#E&?!@sIl#e$JbYf}d_)hvBy8zl9ZqK9wS99HyjVrfl}73mAK zCK^604hDh#8QU7+E(+23`97l+l==t z=X3og50O-I3tE?kyYzS-#n(55l0lxyUHg@Mx;IWpRZ3Z{4wW$mBbJ)osu2R`YGR*$ z@+KWlboC>S$HXl^%D>gAVP#(;9ZVXiGS!7DBlTv!d6GVO1Wyufmi#e5o-4d`OwKQJ zm;{#O47JI=4QtxQlx)|`#tF>E3-wuwL@6SN$$^q0B668zv{+Y)RIL;u;ww1;KWY^d z|G_KNhQT9*Y!l76b7yW};Bnt7z-RUvS77JHnp}yDp#7KaGeVW%)f00n!P$Vn;QX&w z2{N`;#Qx^8CVGL8dD_8Z=oU59ctjUn=*ubYJmbz!uGK5T=1MPEuA+)t%7j-Q)c;U|a5}_6=-TZ7d zHaRMWBH3gEitx*Mw^$+;5QU^Vf63KprVgoQ-BokS!cQ>I`NU=062F!j{BZs63oP$~ zI4Gn%hT`CbJXmhQ|M+NyjM(|vfry>3=&#)BD@{jni#~;kpjVKTYTM+M zHayeYWEkPWu}WQbqLNmfR>42xqhW@^I&LNr*niwiF0LS>*o-L}l*CIUEu2M;Lh=)y zJD(hd znLy>`8T@?4e@uMJo3ScGe7GPd@IXJOj7#@^OgfQ1p$S)HbOmr?Xv{B&3?JRG& z=6t^oK(pvQ`iGlNZ3DsP-H(z9}vRrcV>OnQ{;dPuKm?;e=Yqf zte+$Y@aKxjF&TtJF4_DViKB|#lvV7oOdJK@V4HY?b0IjE2aO;~%m+jP91|n46b>YI znii3*R9lRq6`Nhj6?o+&X3F!G&3E?%bVBKJcQ5CC4O$}aD4EJ`Q3v@OpNM}!0iHg_ z^eO7444rrTSETd2Pgj&KqKL?CWxUw`lCU0TjhV&_#fwgI{Z&5^@EaRrT>Z9kHsMIaEgC8(?6W$@8ie-uXn*x(!L1 zc>=?jFI=R^O=p7S(6BR=`TWLl>FwYaS$~4t-?!^uZD1I>u5aR36YiG;k>gjhIUbSO z)d8~I&3NOu7SXv@U3cYU2U69|{{zqcn769Eb9U^;|9pEQNLRac8$YJFYsj^cW3R|_ zqk{(t68L;}50=;Io#nvauv;v7!x~_-93(ryXq2!;Tp@UHo7p{8?sJ7)sob@iQC-UQ zhxw>nFDo}8Q*KuGa!-cs6S9O;)amA-DdD^K|L2;w$N|GP4LV<(YzFSX~MZ$rKDRm?=2Fd%+)M z3Wg}m6r9z);C7jUMR-!L08O6tkcTI5^&-W$ykcq8E<~x zX)hxU-}5hHgmT8Gl8I%zQ_`bx;6NW)KI7A?e2T>A^7D0A<$T=_!#bQ((mGtBSX{wPeAY7r%evMuTvF7RpJ~cYt<(~`tyep^E!S;E-#L&6 zsN=Z@2QZf-Qu<)31+M+GlM34J%kq;@b$KGgZ@Fi=m(9+q;MvTdzR`mJ)%k*u5lRBMU<2SS_H+Gg`%(Inl`XTlW}(>V zdT&0};z&?;_Y@{F=6mSE&G{7k-I2o|#Y-7<70dQjHjebNovptaf2Iw76xq_oZad*Q z@w$?b#)r1;J=X%RH-&kp>$o33KIZDpxPkgF|5|El3~QbHpNmloe2kQWud7}R>^!CX zvjCoII1B?^Y|HCr0kV90I%e)oI;WT_+ff_l|9?C-5IfOJ!8I%Na-eJP9jkI!h_GQz zjXL*ah=VKPU1h( zN-PXG6RV!EBQcORG#ZV)Gsk5ohzj;`!h{7QS}c!dOcxSHynG;dQ^$7-=JZI>n>nPp zn3k^O-_}^-SqmqBI!NtqPs&$IK7ZD|h4(k5shQ6^;fjpX+9Q~BgJ zTI6=h7Jv{1=O~xkE;Dop54z0I!?vcL=KenZ#0}X3z5PAcUz5Mu7iZuP=P#ir9v{}9 zX}`=r&$(RjA#w}Fr)awUT_c$~t9+295Lo|&GOx~wNz6;mkyKbyrPJY$&FWVxqCCmZ z-&VttYvz4fnzqj0ruw=3ZDFHgahw7(Px2_!MA_T^wiDbhwNS#Udl#fNEi@@MXt|X3 z0jU6)mfDh6)nw3qjF&gJg69>R!oykqz8gGhF$0f8=n$SAJv=7WoCrLCunCbF5F|MZ zgud;uR^_SdhL21Cm)}=&neR)y55NEW9St8QnZ3k5PH-cA$o={`MJdneKra9mDG`FD zSn2iPM_&Vv*6IJv_^8PYJkpCoczSwxI%v&}5Io6+64xc82hHLaqV|5PGy!}tVIM>{ zb`Sg9?8)=Yp(QoYVv+6_gNf%3=*ZA3@5|Y7JXb8l?0h~KYt~~NzTaIe*1y-1om-Q_ z_e!=JzSk1J)qAbe;rlnbymzmCbW%Zj5UhbICVZwARzef5*Ry*Tq$e3v8{JQ^1q*mE zV~d$*L+N$J8#~==zwBR-?w75vwara76=&naYoPXV>4zwmJ?}+qVK*yue3wGkQAqTS zO(+LE>vfKweO)Fi4G0Gl76qL0VDcJ!v1fy6{b}#Io+-1{1pPBbrKBI>xG*WBo@+*) zr21e{+P$8`^Xp@&;e;hO(qF2|RuqLv&fQj8Kyz6Wm1KUT#BG+mS^~>N072j6BRY}K zjrb=zBqpGG4voUaON#VW%7w52jrVOc@i+UL6q&$Tw9S_4L#Znxc<1~H1J{)`(UMLq zn5eJL=Z5%R!nra%MM|=d^3w5AAFt<^Dn5I>jw*;Mdp#-aZ!2rEH#e6pvES?L#4Emh zRoOaw;PZLA(`GWz02PfTEJ{mXQw_0}U`DGZM{eT)7jpMZ}(N9~;YJT+R4*i`-3M@kWf4*OG;BYbMN-X);=r;8y*(KPcqs21m?Td*& zMKs>2elzY!Fa(QjYQ83rQ-!^BNG+ohi6#E!R4UQ3&I-4z@pq;A(MQ@^HgTyx3^@oF z+u|b*9&Ax#iDgYs7mZI`uWRxy2F*tp(;?D z5Zf&_qf#we5i|;^ey47uDbONX1P)C!u(^sK{kfmv3t%L4{&cprB8r#7Ppp1Ru`Owt z=9f^3uWQw#?OC@=X>VE0!`jq=jqS9R_*X>l+FHu_(I1!V?1HboCF6Rka6JTtKfuGz z>}@G$J*CwMKeA?|EYk(gZH^>8Rj2w*(<@0Oe=t&6n{Ojs5$>wN`asUpMDkZRaxg-Ys0u`uM5VOj{q_9NlYQad>}|?)zo$ zLm;Aj#IL8`UifbctAJjbU-5m$e5ub87(mP+XjI}abxx~e?^ z(kfVn@R+!U-H>V(d|*MkC`vn}CBmIuR@}u2Igx77SmHbr=?9tysVZ5O`%5DTn2(tv z50i-VTTMl&L!8}tk6@V^%?UE;QxOfkT$+__Jf7n1$nB3PzSebYB;-=WuA4bUcqJxf zgdId?oCj}hw!A?A;OoucdDH~Jw_3Msf#MioPZ>)^QL!E zmH5=kf`;NyrD|XYALwg{cwLIOCcT7$%f7UgmG7-*op;kS9FZ6B(e@|uM3630hkY}X zKl8w6OK|uIbDCCR{>=B;H~hWrP<+`^_2~ew#{Loax)Sy=QbYf6y3)MYNl(hPV#+j3gob-CZM9MFsu=so4w zj}JZ9T1|pg#0>zP85VOp`C=VEq!_m1{Ir?(P5K7_v3DRobUyvGx=Ne*KY{Pu&EY2& zsjiy#f>CwwKyT&DECej7UaqRt`g>Swd|2yBt2IQrbw!LsnLpH6Cx?V*baY`Z7O$^y z_8Bm#;MV-cGGImwuH?;SO`w2}REHnw5q@MZeI%0sb0pB5PJgqwieKh&_12Ca2_NC^ zwhWl!*~))O!ho;If9X5eaF5$5AQ|O9TVn}Se77^l+?(mz$lSFRLgQjN<6GVSJCOJC z1N!Irg|FYZuN00#w_#h4&8NeWxDX&bsU#}Wufq@B`hI-oxg0;r=NH%?N0M9Y?O1X` zG*-1yM+=x!PCQqsE)xZ@4X%6VQ&l6IuO%7CBqkk%qkusVX%k=59F`+f4HEBDXIr z*q_PJ>ZZO2AGn{+H|w+h{d=G*eVpNk^ZrtWcl;cE-3&#XZZ2NHMAJ#~n8DZ-sagp% z_#?7=>IOgic@xhtBE;KR^T(7fV1FzlJ3QhpyGAkAWNS-Kg!6T>`;z!i5lYZ92x+G} zPJ?hnK01jujCa-s!`6v2E!{q3p%?~;!ddF-?&wcju+UmXvCCU!$+T?OqT5F1EoA!T z`sZm|GX2i)e*ZXG?#1EdpgIH|p)(qhYDut}89uz}vRsYZR;C}aTmCShBs3>zIhh`J z-Xna9HYN$Fd85UvB+=cI#Cmf8%xlJ_5q2~W}m z&TKjML8Z@ygtw~Sx4k*f-_<=oMP<_?-ptdy3{+_X`&fk31Q;RqUnl$TQAD%VS3;&i z^JO4HT_zMldbu1P-Y#2~JgL-{0Rd}@h%$uU0MBIz#af#;${U2{`(nBws$GvzvXSLc) zm?xX+=dA@S&Q!Ek%-f7xcO6Ca$H9Uo!negULOVrgs%Y+nOi^`&M+I)v1LAJzh$h?& z5H;pVF_c%`6K|T|GXIUqH=$i*Jva~j&6ZYyJR=4+gA#%1J~t~-;HLcAlX}<2n?1zD zzxRV3b%}out~nc$vrrJ%-jB6o47Yy0$cx*s_;+NV!58omn56i(d-5UrBroZ;lAiG| zXurfK6j~1w_Mv9$=ZId&Y@CC>S>}c`U z#D*g!GDMU=L+9yw{Te}`uRjAOm*-^AWA6DskX0jtTu-<5u{_J`Z~pdJr0WHhC`FXZ^1G$`m2=QonFox(hEBc4>_#|N`l0NJ2d&7x{XOyE#p-2F6Fk5zu z+{yFsk>@g3>;s$9P!*BJ17N(G{Ec>R*uQd+p z&f^an2t9>};Rc`}7x z(}FRzRMEtx?w3p=)(cC*T1gT2%4ZwUGKG%I;xasroN!60fw+gLeEY zA@NpTNi`+G={xDh>^xOeepsFJqrx&PM^WbI`mQFNy=LEUu{+(Gf4|`nW!@@E??DL# zwPqS%)Q16Zl}hm#_?9&Mg#gZUsTDjuQ?AqPYz@8EfHb`}y&UFSlRPc+c8lxy)c1n7 zuc!YgPAw)Bf^mAWTNA$D-t_VGIVyp^na}>SOvmW$ks{%3X&=amEE#pg?}o>Uqj=P4 z#0U~JcXc%Mbpmf^^%x@4QI`{rV-`kz(!>t&y@}yl~e!ruB3X{EgnuNI>?W9Y%^KOiYZ{kQETuGx$+%|Lfrtke@MC(6# zEHzvi_65*4+k?KXfnHk{EFj+}>%!opsY*?91H1its9QrH)prtmELY{;y;##kH_X@n zKmJ8=JZ3V>j~w~`Lj21k-x~k2-maIXoVT~woRgW<+!%0^zMcQ# zytzT0?)kdQQSw(HK_^E313rEMfk}165+q`&i+dC65R1Rt5vy7m%oqrRi1pY|lVCe3 zOTqTa6N5bU)rQUwgW{{on)o;uh0E@4!nJYGs^GU1&>Gn&G(I?ZRnT$@H&#w!uzz34 zBmeTC%*)p7OP&AhU-rnnoRxj~{p`#BnU}X@UoJ&#^)(;lO8Kal@J^VxTfgF)HB~Dc zt`HYCZT-XQp!nDd)tJJYwtOQM84cR5a)@e07ARpw3_MWGr!b znR|BWWfVKSY!n)3D)eN=D|k#+dS9?cY{rD-NeO$t<$;A4ZzkG!X|*E z{|KOB69SY%DTJzF%6Ek*Y7l7$Mh075A-Z)*S8N$XuP^cto!A8;pTsFOc+;?d5DQ$J zNJDRmS*@2_H99KsDJPn^vzA=}_LU9~<4e8C+_hytbx($iIZrkU|Ma8W^*-)$$}TDs zS9On@uYQp^Mcv}?WP2=0wY({=DxO zbEtE&Mq~PN&EUMHJ=FgfXh~N{$ws`YeaqZ!&6jIh^kuiw@Q58>z2vh(Zw=9~g*wcjxcCMWUV!D&B$3g+Bv2 zmYiGG1dc+KzVI0+En#?r5;j`|E!Timf+Ho!MH9>7k4MKRcA6axno*UtCFbn1DF5oj zgyceva!_)cZ!O_l<)y#KIMaiY^O^0mCQu+C&3<;w%=4Ae34lcBsa&Z@Zj=P2ec#hW zI|7Be4|13MCVqq7eMgJr`ZK&M(knm9*^BrZG|a!8PZ5+X>JFrbIw+YV0D_WR1y1@7 zMgcQr<(K5{!FWS72%SzwJ4iB}_*n;x;F=bdU>-!=lV5JYeZp->cU#Tw47+LB8|r|P zgO=ZO0bRN`j>(%Pw^<73aF*N<-q~qJm{4 zw;3g}x+8ro1ej;DcshOfP1s4Z;_uhw1I*hjg1)y^KEdR+CNiV?d!abbHzT?vzBDs$d^q(3i{g^=t1R7N1D}{rwH0T>|(9^~Cp+YSoc(K5~#4!ez202LpSj zcYm}`UOGp~|0wrT4x`x72xG^DMfX`Y5^zSg-o@T3ZBdZ?c> zv;AZ|)!(JQtJ`FCpg6{j>^X_1-p`oG>a)4gb`wXzAC|*j0JPvbMiu2_)q72XlW*B> z;{6}>yNP?S*`0h*LezlUZHmdJ!}PWszGf7uTHR=QSHRY|^cjcrDQLBQLrU0(fd@V6 zO;jV&?BzNcwm1Ci+Ee=Zy!Hltm-cLHb!xynnr|Uoic)RNoM#5>$wP1y@#1UpUp$?6 zUT|_6`hI5v)?kRd9DAUKqBMDAe-5)5#mHdX@;cm+%wCy{LFNtB@>rlQi&bQ037VRB%mmZ{~1L1mv ziu#XF|0NZbeOrZp=ThDS_UMK7SN2;BovEjcr@O1Kl+H#Jrozi|B{d|cWagvq%OosJ zIxsG)k1ha!P#?YVL%kb%h#E-jaVS4-@+TWQ+yCk575Th2HMvN67}#^{jW^J4Z55LC zBOstQxgQ4A+Nuj9lg_GTXIyOpHuG7H5;&&}KU>^veLb%xknIL|nT1}o5vE0$~!cPp?>_0Jt zPndywAumAE<)zeJV-d^2uouA$cERipb6dCL)5;4P&&WZf7L_?B!yohDLL0awFqr;e zpM9eJjaKbzZ*H^O=kY_f>JzcVrf%s6q8{Spk&&9J;RTa^r&5EKfqwX=8sqgMYt zf-2U!r4l_8dEX+<8TlgoP&X*#*Vd0N<81hBSfKHJ$G@jvar)K%k}n@-Z!@#AHb-FA zQluEOa%lAjD1xWjm`iZEnh2hD! znh<+kW8;@hG6GQ+3{pgIYVe_NHbE1hd1L63a@Q^PZ26b_Qkx4s4 z%;bGatjd2n8Q;_jCFboLORQF6(I)VvnBt(hlZ)D_b0WcvPq^avr1Bn~zwF$xp|fdf z5oitBV`3Q#TK(Z-n>}s3g64|_UwmqD!F(|GLjZ)TFMiEpJ)1)c9y0JM@ySP zSYw`hq0|hx2#(k<*)3Qal#Fnaup_o@FyX6m57GzEP>g+!L)#Yjc~O0z21{c@=1E5h znuQ}8thEMWg#olxCyg$~`;M%ZydbIt4HS8YVdka=w4p8^mJE7O@q$YUYDfFmZ@?)IV7Db~WtCu;>rViDJ6l2KV4Q%$&IKtsd#ynb5g44Ps1u z1WR5{B!pDnT_s(n3hzJo&H~%ft;9T{*t01VOAI(iW#?~1?$im=CNJW5EPhB3tt2#x zbD5~UMbHTMm@>$ri={U4iCgy;aJ=NKt{pw8MMXZoZp3IQ>v(4D!? z1Ak`8k;`d$Q=Y%z(I0q!!NR?>{(|}s#DF%sH9PR=+x!o)#Fj9Ef=U0YA~%_M3(mu? zo=FdJE@w>4;HJp>B=#HHn|=P~`Mr3K7i0SRV#t(*9%Ab+G@|J-1@Ie!&}KV}UJZ-~ zS-secO43bYnLC7nUKSB^vp;_k)lUzVow>MuxaS}76;Y*dKG+N~a^8%~cpWFbg+7MU z=6@91&mt~9M9r5%{u;K0rD~@bHXu7B0UsATD(c=8$&zoB&^L5AfiBh$V~G~{CU5r5 zwO^NAkBspq_q63XHMN3oH8F*?wU69=aLwLSB%^UOYzWpi^dIdo&*idmCx^g*JzFL) zTbspObmtyqtZNgu>$?2`Kd)3jeb-q`y64HGmJ54W@Bsb~Kn7hKT!MhTl~6s!htK4B4O(!qon)>?!WJ^}nCG_= zdt!+fjcBH?uVbuWyw7g*jQ16!YyvoUFN2r#AqwU>u^#mejy4)*dkh(Xd_u#Z1W~P# zM{prUvlmefvyPX?l2on(Q`8QpT9DAU^rhm|EZv4jD_-RTB?5O%;vHt zz7y<>u@0jtOtIOFJbGEq%O(D01(yW^dSF?ZzJsFQTvjfM6K^^V_!VSPANsGav$Dj* zbUqtP-t28+_^4`v2hZ#IkeV6K$%T+tB?@ra1{C0i?c9obTpl(l1Evvn>Q=mWrY zzZyvB!n;oEKky?iXe9aOM}%$56Bv-^W_SU6A!tjEQb4;otae%1#KmHFSc$9>=~MOU~EV#p4lsQp4+F zJ-&<$8Cf)`-^2Qj`%7hiKDL6>#YerbbshtCYUqBdJ=|)0!?>1>aeSSb3fzg|MJvh4 zCKw|;1jgI!A{cm1gqyhrC{2O43o2}CWKU95x@~Dc>U&hgQYY5KO++{14Z1 zHiG2KKwF%?TyrKnKTSw#rUw$W|6Bkcs!86N;eb1|A1V1$ysZoWJLfy`zf41n6oC;B zV^k3j@+{>V}?#FEXd4_wpEu7c$IpxC#U4?J&B=;XOV&+(uKSJm3 z;rI5$$~T~m)YJpRi{6@j__V2}AM6d&c6+dNEV(*`;wqUZ;3pJs;X*X4IkEzoh-1 zOE>h4ztJPM-P4UFn`(o5dN;mhCBk)3Ej%YPo8iOSUm9DQ?#W^7iDk2UHWC;0=2yc9 zE%D!ab67%|f1uYlzw{q!f7k48)@1t|vG^6GJ=o7~=APc2brpk_FsMaY`1w%&jxORg z5bRN--QE}zNN_yEZ{B9jP+W!`I?|+hli3Ha@>Z-ut8pR4P+)Wx>|4;?cc_mjB-j@0 zW+)n5`btxQE4py|g6hN)>%nj=5yiPpX0fVe!S%ie9zUDn7Zvwt*e=^2ZI@lM@t>gk zq7G~ov6))LRsp1b&6K6jHBB3fb$4V3$Jx!4oG>kxCrglsnT0whTbxRh*B>R@SlvV) zay_-QK+P@DKj@X`FXQ0c4iq@%+*Mn4Vl0;HI?ULcKKT`!e4buhpW`@>;7rLu!q*Fiz;HN$&pxMBuqt$b=$~F5tvvyY2zida_7z-O-#8sir>R? zyGq2BuP>Y@hPTG`wEF7%|18k>W(Pkz@_ximyK*ZGjqf(%<7npA>hFl58$U4&;j+t) z__;4DpsEQN3*2rC#GDLL7mNZ|*SgpsP;|4W-*3ZD)6nmZpJB&;SNxp$U+{BO%Xh+0 zJo+8+^Xrdu_z5X!De#$Fy_+ccrTmR33F-_Czzjj1>2hBG$129(P z; zdj$Bs=!pN0-~WracY%+py86EpBpA6kK|#}ci#2Lcu|dTWF*Y%YoY6s}$i<3^A{YfF zLV{2f2Q#Bg$Emc{s!wT4)u-ZJt3^P?a7WaN*P=cu-p?3Cya8S+@AtR&IcF{g;rYDp z`~T;o%sKn)%i3$Nwf5R;uf6u};PssJxX<^rc2}Q&-J=EPV{_b&F!0@;4c~4b{WyGg zUDFvpJA?1J>Yasey(CI|$;1EgGmn%YP zdD$Y)Xo{kY$4B2&Ux*f%tGA_bmr2M~8d>q&zIXs5_e!vm68DaE5%S}{-nb32zC!qw zgsYgc7LXiHTxH6Y{DK#S+P3$pC{wAGkoG9xX!gjt+Xy38N6Ws(-t6DUGy)Abb01Tg zJWH6kxhNATwOGIX1y)Zc1jE;TdZ12vmrI~zvj91wys+gQq?+@C^{#vPKgG|s>fd+V zPH;@OR7nEgKo%c~X5n`A(k!&`GnBUJ5nO^Do{T=Tf@2ZhQH1m>Lk?!8a6mmq564XG z#`=g;Z}mYNv;Zt}SA5B&gkl`|AG`QlAzRGgik3-c{<*g9EcA#yH?>XRJaep6YX~cn z(XWf9@1>!cz%-;8CsF6kL#ZiXxX#W+!8G(nBumV;E_SN{IcFYnxKqGg{Q##X7S#1I z7BbZ0`en20`k2OBucN_1A2LJD$jngd{TXVx^oUUGjjJVriKl`N5;FFU)?)X?lMaSs zz@ybog7j|>>toVWMV}p)P2Jf#$~)*ND>6EYyD=k?=RiNq>Hl0OkpX@I@751;!CT{l zx731nLKb+Q`Ni?U^4~;9Cs3I}@k<%)w00cbqv=P-8u#M{*#Du72`+!UkABmR z_e<;=X}m|jX2<&_Y>qoQ-u;f<`SJebKNq3-jyTg9G6pGA|X01K`Z26N{BeEC0unx6YbHi$nq|99B=-_EDE zJexJ2o+5y659Gf)<52pMnXfv5Km6_v;s0*NPQf4AS@^qo@Qb_8Nw0q<3;yJZx$r-B zNDlmF|6F_ZZPjaFEs55PVJ)%RXRlaRyZB?vYAsf@Hk^-WE#1_1X(^(0KPy_zop@0i zmpoZ?l=$t^L7seVK+u{Ev{p{wWe&DkHUFw1+5GlT_l^4vzh&3Q{T>(HEq-g*H%q=Y z>}w!sy@m#(@4#C--(X-dD{3 z(eZZQ%0+1Yc;7uOgV11H+kV;kc;9o7Ki+>kdMC&GmJc)IZ8>iIQ(5C3&I2!hynAGU z_ao!I$9BQ#biCjFnHlf7C*+Q|w}0y-`+o#Gn{_#wUy&Q@u!G+7MLXy*Y>PzU;;7(< z&fwBe>?L^FJq^7kI%5oUC9;;vSmd7K6@2jpTksSWOjg*BM|vL@cps1CBS*d=uCAoG z2k139%!wo)EK!Aa^Bm1-%&NLEg|a7pH5I%50(0{4_`;US^Z(Pj8yZ%V8}Ho*_O4#? zJhi;~p$x0G1_RPU2v!7KRLy(275twsjf4Y;p0tx3C zFtBfUaxbCifkSHOFFDXS-NcDmJP?W*|B^O)ttk6qnh#q!<5_g~8&LW7SHaJ>{$L6@ zH*bk1+t@Re+av0LitG}2`Fk0nwnFT8t2S<%4H;^X0WGx)GfK5M1$F?fD}kIKOY9~U2xg%90| zu_d#Kr$wUnttP@|np=Cp0V36#p0nK3i=Ft$;6b5yE#TK`xI^(`9>Yt}k@a^q0Sd00 z4eh`kv0pOV9?z`%A-_XYlbW>fEHg_r&Tp0UDTw0xO9cX#Vng<=T{UE1Q}7kGAE5QP z7NPnwhA)=k{x}7+rK-pM3&x7RCkLL9DEHaEEj|EhxEo7U>WQtQ9s#8KD1E3(pQzFz z{~}R(!c<{)IXfnsbqq_>+@|-jO@H((g^Plw?f#dQ4B1T|PE!&G;ndYl?$lmJ96X?+ zYuWV=#-@LTNQ#jzJ1f#$qO zvB_I4qD~I6S4569S48&muQ@6;cB)kM+fM=9cW>oQ?yqYr6BLaF^zp>ddEI1yN9FgL z9lGM3zl`R5WN<#2xDh(x=pIh;59WJo!pU;XBum>o`oq$u_4vZpt0KwABy`Q$UBytQ z--jV=OkWZ|=yxdoI(a(pd+VjS{SL(+uz3xNO4ByNGm_)6DD}E?ixuPKv0H58t=FYz zksEr;^s8rjiAjo)B`f{~{nZ7}S@}ACC%K!o*>=wpQR1VW(Vbo{thr(z`NXl4$>w0z zhA;Um*h_bhIhDE@G!DE{tNyNbs``|-VnSq0?Vel(@oQ>_o2@+KHl@A2)W8N>8UBRo z*W_319%dS(t&ilrSOZ0=b4G|pFjZE%VQf)Pis?D6ipFwHUm`Fi2-nF?O-_QiDRo95 zxIZJCj>6&DQ*_d=qPUP;%J&B3YSGQ62qLGUz&+(1iQJ-l`^aTu0<$A`3MaV7X@i|3 zR@WI(WAO{LsM>JDEs*X5_XS_Vp|6T8@!V7CLjZ zj=Be_A&x7XnXs-#J@&jK$s~TsxEe_h-qZ9GeV5Bc4y6@OpUb|uSoZBJtE_#yL>?qr z_HANDfM4v}D{wlU3hj1g-~P17+P6!seH%~I0(bBqW#5*lm+jgZxD{M3EO#O!{WBJB z=`k5QvN?KW=V#x-{Zss(ef##Qz7hHpYXC<~B7ZXW?d6Y2xw)zs=h)KkiAkg*Qmf?= z%d`%1Jj?dB4gNmfu)j#pvv%$O>bNH}U#xZq=~G~NkDmo|xaD4&XY)Q&X(gnkPv$9$ zziLMgXb*g9%?>F`h)`_mC5q5<5d^KcYwjz5L*!%82*t022P4V;{gI9Giz#xS#)Cxi zaM(&K51)QblE2b^yx;qHtoQMLK01jCvd2~+T>olbIajbTVm*DtamfaUAT1>tn_m)l zB$9Yc&$hmEz4|_&w1n@uYE0KGRk~Ad1w=W194u5AJ*e0!DV*YpDc+dfmw1}WkVD2= z)6yGEvxgf9UUPotC+l*T^ZD!LYcG~&Z_PJ7jCnld#Ur#f5|F{Sw8+oA7n0?FW0&@jA{cs1*9clU0QoJZH0A?!QyV!8izgEe)8Clr4U$w5C)(uF@3W+yqdOsi>pFh9?_ z@@N0ORL|q4TiQ(tLSlYJ4f2optv?Kf<`s&6 z+|^Th8c}*i8l~q5Uy;ERjT~!fDsRe<=_HP&r!b25C|s@s_xwlEttYBl<&S$Rk4TCQoh zL&nOZ8bEaTLHri1vT>A6f@Vo33>)y-9kFKPwpBIzk|6i>GV^V9jpRKbj=85kJc zaWsW|N)>(iw0wN5eRth}b|-PpC_%V%e4=3to{CIQ6PFos(jAZurb#o=yUDqusZ2ho z3mz#~FGT3;)e?VVUlw-uXsqC#W>dYm)NR#|fd7J;*^k&GcLj7^upnSiDHU7j#rg75rt3M~`;3adDBT+eywA&I3DK z%yt8O2waUSQ>cv*J3D5Uxeh2OF*V#+u5lt+o|a0k@sb^WWh=PGEZ9S_waONsZ7RH~ zN!VA@`g0Pk%}!$IG$(OWlvh^w#S#;@{s*~i9C6+IH%ghSUd_$*?mI84(*mijdcS4D zSHeIKx*ml)gsxwL98FV?dRbAq@OQMm5=c5NPbCV{26v~N-JU0$9H*W=@yn!@ zk-+Ihh1pDx(MLr4jGLIDjv}v>M^55j{zCUl6SMbU=}ijQ>(5`A^+a(x#0NRCZvEC` z&5S(6Vvvy-jx4y*QUNq0GV@1$xM4BT1*4ru0cPasb^LqQ-@YKW6Y5qi+@HA-a5tK@ zc~tOc1Yg<#oH;%V*dmpzjNDsQL=jB2uC&9k7j3UHG{_9{qePgVW+rcg>Ka?=OjTO1 zN?S~&77m7@*?vD(-^=y=i0tonvawkfs4IoaqKgIWdY7T(8qbS3_M>1BNM1nl$t%5=_BcgEuR_xp6LNpVy4I9^ix}T3``~IC(IYbF7Ci3>7!`fryt$_ z(d&U-b^iyqG|Mqpmkwci(p|+NC!zakhp;RfQmWB4%RqO~vdr3ObR@Gj(xM2vIF*^T z(fKa{WcJ#qfGjMD3HC~262dC0Dt+Aq%W)opvC)NdvPU+oCI zec`=Gs;Doyao=_S+*qb*v#j8(=(I~nS$%FO{x!9)8gdCbThT_kK>Hk@D0;UD;F;0Z zm}7fG5B!gM5}x(!02&0eazK;gKK`V*vFQeFL?rbYk0STlQ_HBF_m9jmFRrH%$R$e* zaKx!1mdb|)Ium?KXJb=EpFe?1`G2U*z(-Z1eigm?l7iL?JlHEiD|3TJVQ?rg7{MF-%*3F-X5BYSLKiV`Fzu{CZCr*j4^c(q&Ux zRcFoXZxN33_%5xtW$$FYJlYu6dp^q4b*MnV;^wvKAM)_Fzv5-R=sr~& zlQ~8gzq}YqVt%c{#W#|CSZL!O7tK&6Ufpdh>1n)<#>1%*nC$@IO`5Bf-fjO$o?4u` z9KCmHaog7bvxycnwyIF9V0UUzv0tcI@-&nJu@%vYVl$Rb2NNrEyc@CcmLo zZSzPgG>HYKni1-MZQ@jmfdA>KuGI)~6;^+qTDNVR*3fTDzeR_uA>BM^4uW?kf`G(E zDX$#C`qX{xauyf-{^K$NTrD7VHf9r*SL6}t!Ppf!1+>k5h>T{yb$jrq?loS1lUK8q z0>45Ty8hUWlULTPG2yoVFqys2ye!SQ+4N%#Z^~3-YA_vCd*NNJ(vb#kx})*Xs+%K$ zMN6PvQ}mypwAPY9txp4sKmljc2ptc}B)XQX(4H{BYzje~AE`)N18b$W>iW?u^1We{b5bn*LAH4#U6!H%#z`LJp^LjEH%y-nP{(IlpeI4sL}&# ziMEY}!FoanUMeS5kWk4wAWG-pb+D}zHblK8f|8o(Kqxi^Y=l#o^P~cUg2w>WprE_o zAA}JC9qRc6>RBnlXVLo<>|;8dkEjyyl?-W!&3Xe2Qd9IfL?!aDx{twXgsW*5WR?R> z25cY(?3QvcKCyh-Y;JH7kd@Mp2Pr;9jqWgZOfORO0^q-gKTS)$sMWxRREbUFWAvNC zmWuqg%S6-*RIk=sYN|#}q2GH8F>{642eXZkqVp>v2}3T5!z;Y{*o32I^KKxivyim- zkSu4E0!WVZAo)o?BrlT7=mijd3B*)QMo&1V-$iMhBe*FR7P?myXbbc&V2j z@_0!SjJ5fvZu6#{W++0A9;T|2MNGLInHD_O@EAiNWAnGAjXXS-eW7(4h%Jd0k*;{ zEDV?fJx>K}wbb$1>fz4V$^aFyK<$?e)R-)wCR(6?j+g*BfW>cClz`-LM3R)ZPq&>> z5+LzfkeD4RI26CcWVRZ0V`*Bq_!+)L@9I0KHfkq2&2PFb6F}LB~LiHmq3NFvq3#YawK_@-N_rFoxD(7SBHg@ z-INnp>v;>-CuY3USFl{L>j@^h*}x+a6;}xQ^ic+K0cg_+xPKn1clvu)ciO+o7_*GI zDwIkK{D6PxdTG-%oSC{^OEyBQikt&`^KpRKGjQ;+!uQA*L!2!CGyNQY#;(3L*)#_ z^ABbSJXT5CVy!(kg_ibCAI_V_o2{2ALY3YC5oXy{o4i^r+f-u2r`8$SwNA;Y^)lZ4 z^;ytgLyKZ?rd4+@YD{kgi^Nmuj0lc3OrJ{xzh-*K5Wz&=)Ne7W)>1HPC^iWUrDyU_ zhClUvkpI1vb!qwv{>gl|xTp;+9fAFUI+^*Rj1KYSMK1dDG{*F2^qc*JB|;v5SEr}J zGjoJ4Rd#Z23L? z@(<;ezt@!4Jm_3V_=yF)LZ=1~B|N7OFyHkaPctAQizXvt!q67mB?NDXpTOgGM8;SM zD_3OnHkkvF(S=vV!`a(1@wRLx?ndD}8+H5?u$!?aRP(0s>%9B|L<>T{r=1~sYKDlv z2_t9cE)_+k*BJJ$DF`sTSNc_wGVB-ehzFE>zXW;b|S zq$}r=Mc3Tt$u%wP@+7dy(WwOfK$#mP)e^(4P`kur4$yfvufT!a=vJ83nYYZa)|hdP zn|l@+N5a*?-gkZ$jN@D$(*>Y(jwzqMN@H*2xp$w%TwlI-&TpHU)AEJxHvkmyo3|WF ze{7&cUV#{qy#R@Sh}cX22@rrk0DWZ7bOY%N#VfjhV@S{RSCFB7SN!>O3*+SZQ<(Rg z`HX$(>T{7jfxP_~U)c22j9d+tc;BN~toD|8=~BS5{SA8)Ao4bwApaYQR%`KJ>kmLF zfe(p~E77cJWj9{O3x7=iW>%Nz7>6)1EVM5e5^oPOynO;hLr%j(NAbL!R!{4s)m=>X zpw%ytMwSmO+2q0fAHzt7ZUVR$N3;;NDIEcqkWu+XR3w@3(`A;ij75mZ67QhF)q2EUQ(^(RXVsgZ_k5t;Lq6LQD5b z|05XZfX*DPS?xIp7EF>3e#krDu!JbcuO` z?!!rpimV`!yH27{`L@$hvdn^#(4boS%{7wiw4TO}aYawrG2-K}bp4}xnAK4UUgdMrb-DTa@F9I(I6ENfcKkD%$b=!d#PiQMHk#+3k-F3O z&p7;XYkqwAcDp=099M$CKVx_A;~%|`yYtcR>%Dgyi`Q*Xf{FXM9si7NA4vhq^3Pa; zQ;Te!CwcWPp#mA8@y~eiivO?tGY)*<$Ne*=IsYsFjN=HGx>Noc0~Vkx<1d2hWscQk zZE0=3nSPu3lis@S)GYsuKmGd0{4=iN>ks`ic6~kLpK*4tT>p$DCxd^?KLf#uA-~}n z;^E*=p*SyoY?N_Bpqb>@GVE4$+~C3GQ9lo9VlLWnhfJ(;z?DQg4kK@E8*-o!gP!~= zVIR)X)?&{aY}FOxEirqZyd|7bl9v^j z3D#+vZ|P={MHsBnc6kq8K7C5M0k#IS;>VDtt!YWF*9g9R_qevvjH_ALJkR4|o2+g&~sS20YJ=f%zxbli^Z~h7Iy$ zc;Oy-GBnRtqZ=}w46BSM1FO#pYWLc0C~%*dA@>Cf6dk?SxGtDoEzFbxQ8x&$r-X)j zgMR6O27~@S$PZW3l}|IjHk-P<2_uhMH;z_ssz4bz=<*nT)b!KpYK2!yr7?fqjewFV z`IJYk$a(QER=%C`2r{d!I;qdbgQ06VxeoSn-RI>xShts zNIj@DjXqMoMvdlqC){Y@Q-6KX^edwg_F~%yIxUJ-mqe-R>=*DvFut$oizt%LHu9s+ z63iuLNs^lNO|Ssi<0diqm}tNX1ZA%Bx3|e0D1XJg2KKNk z%N_UF*Q_0C42|Ps?q=3+lAcYl(L#f&GclIp>|~bM^s-UbqDH@e=MXul*S+9vC$cGpk4Tif0ZV@GiP}O~5pTd7jfa&la*d#aJtcO< zeS!*?qhd%+a=^glIbrF29-rl4q+k8X@oJNP`DOs*eXIBWp!dB%burb(4n`RS-V-gn zeIV~P?h8%tPO`B-#L7pJm7%**?kck=F8-<^%~(|%QFa-@t`s*TILuH+4vWT*AW!ED z{DTcc=Ni;x0Sy-T#w*9HyRGw)J7v9$S&taM4FM3pnn6ylrHn^sHyU^u%B|`lXdk3s z5WL=d7wE#4e)Xqs8@z9hetCDj_eSr1lYYICEuCvdb}_{6k8C@igOT0n30aNoN>wJA z;>%NiWY?Gmn49>O-P8cfFjbIO!zO^}gQHiHE4^d`7qIKIg*{e2$opnsByWx0i47!}QiMpf(X#Z3HW-7TL8X)31gs4&C>E2<{H8OFyEXLc(@M_j%sY(2q|MGdD_ zMbj%WHVnPs4rDd92{d63x+J`FF2-esLoQJRC=IPspLHwTZ@xA(v+lpV#ttaXZ7dXT zGC6* z*YJLe_gxW5_yq+G8E)Z0WN1hnG8_&WE+D@l!}qm8WOn2{GW^93$ncIls%W*2%@FG2?R{2-I#$LUX?<;Z275~eV&jdYiVDW z=D@PzX0OLbtJ-Yem-rV3mQH6t=?S?r;3|_jm;oQ<)xe?Ukw(Nl`bABF_u9LvWFy`{}YqT=oNNa%!gOZY~XDoC-}Yaj~;%PqZjAHTW=ufY{RFu6L|MB zxqWzx4I~C$2^ROo=PkUF6d8Em!Ne1cgZRw7hkPPRE3LN?tQ@OQdN}`>e7S4l^k$;s z2IbcaFB81-n|KjX$4`(^=O#02gBK@d{VYcr1EKaaI_us^#t@u4{Wcjxu;0C38Njz! zegQqnx6e0YInGSq7kGB$?d;~fOa-|Fd<+em2(;GveejRAe{Lu3|2(Jt0|PrYR>y?B z+dFFmy2w<(9j0l<&ew zXO;iL*kFD8rQHv#$FRK^tw(#M*fYQ8bxzj%qZIMpZT^?BBxil^3rIQNFAeG=KRSI{ zDD>uSx304?HG4|GNm_JBY2FA(4RT~vj+RpGDElS;J2_R zO{BQBUwQtt1Yh&$oqfjj-;@`me@B*Jzb3SFWN~@|G#&Jh_t%kCX1_VT+!%MGYES#b z>2;a+EUTyj{RjIwZ1=2FdHbFIVqeuII>Ec{Q{Q5^(9|2Glkd+a+4e81{-R9%w!VJ` z_F!Y~J(yxS?W3Cn{bBt2(&ONr{`Jj#x8pY-1laNO-Wi_k_dzJX_TA9K>P&fqzY~y9 z;7dyV5s-$(|0by_67~g*q_m=TC=rX@^~MAd+6&8z1Pj`VMjnl%ksp~yH1bkj*6>+o zfM38I=|w-Rx1B-p7d_PLt!4J|js{TgIxR6R?-OuG!Nbf1s3o& z^K0OprV4;Jst=xaMZIH`oM+Bay*Go6bh&K(hAs_WSa_>@(D%!l2R#)iJ={!+cDybA zzWzABoX|(P{UoM5H9q}E#>b=YSBZgd+R3J)ZVZr5KhWcd3_TipIc94>FP5IJ4f5Of zS75ZP@;8W|{dcw(KF^XMCFwgQ4RqhPi5yz$4*R>jMq78)wcVO06s7V2?CV))HML)2 z!aQPMIslK$5<=0GnW*E3%Ye`e-Y#`}c=b4Kaw=c0AL=5+-V5A%fWPtxogh}Lx*3~_ zrj@!2|6BVJX521?QnQ!opQli-ITu`0HWcfEy<0+djD56~iXHgy0kQ+*cDAl{ zicA~Dg)K8`S=KjGm!y?$kJ+-!KOpOVx4OGYl?m4iR&<29OuUlpesrCSq6#<`RSmMo zuXiD>0mxpj@m4p@$ai0r6pgG+aU&i@tuELljdr)yLF36Aue#l`~mbl0JpLM=I zocNC_eFhqOnd1{*Q28{6d&S+$Zx^rWrUr;3v2Qt*R5D{ie#Z9Q!12(A;xI?m6@9;6 zzHbdITI=Qirt2H9JHrj!D;Yn!uhhPZb^c@}0Ur zpn>Ds4d#Jd)%|8;?yUcdDAimauuv%19Rfr6+F0onZgmEaES}ok4263(b_=uhnc&Rc zB#v{1`Z;>ikp+UUa1B5sgWsUh===(Z1FvTd#T5|C=0SAc6%Z!@!gwsHOa9EskrKAkZWLlGdGsFC3k&WUW&u&G()d{sa<%fRjoWHNk9K9D(Q;^b z)^`<5pe_4{5$e)x9jpygOQ`-ZjE|>K%4Y3ivN}Q5h51<{LDsG&Yg3T*mi(+ef~>_R z>+B%wwEV0+gRCVc>--?=sQj#VlVD*jGg;RJSqJ53y(h?8W3swI*3$f}mjqd(CaY|k z7FotNk&Ubge%8$^Jj4chHM`~@_T)@n53@nuh532=W%7Ec4f5WSpI5TkAYt>0;+6x$ zZQsq71U?f7*lb8Yp_rGeq-7suCnsaZaFK+GFVWK7T~hb0rI5`l%3Aia-<_6T`tE2m z=KlI`{ktVTbl?6pEZDYU8aL8gt1~m3w)iSAS4PmiIO3zDV72D)-`mb8PT!q*JO#`< z36uI!CN-H!y(^P?awgSyuGwP0$)w(sd3+}G_(|qbgXf-)M4p38|9%>G6|w*`_km_z zrC{de{P!iLWK3_K?(hHF_YZ=1XYj!3*WFXV$t`y46`Notf_32iai)i=EiHYczdWpE zU-v_%)p)zcw;&Q~*kDDmofo)A+rIktx>V8Szte`@cJ2dxrlCicx3P(5P)mNJW^AX7 zdkbX{0ZTT~{yFKx1bg65)7gEU6}yr@Rg|71IR2OSb+&!qwWUWE6464=tLXFshoAj9 z`vQj$ikrOv!s5lh|AFItMH`;G(?$~1LB7PUgb=BadQc=?58Y%!nY1JB1KDqj(9W!S zGP9ELtTS_RPw7agN>=ZZAk`ArOuqxN*O0CMHc}Q@nXF;LSD9@a0{yPI<6-G%!F$h+ zXN!derR{ zKHalFMwOWkf7)@+!tdk4FTnlow|B!|R;4wgZ=m;&Bqt$iGSzdrEIO{&11W0nwd@Z` zyw_&CFtQeP$7*VKN$L`RjF(nMeEuiLutnn+Pi0dC`TTcWqWeQ&dQOh9m)}3KMUx)STTNb zJA|_-YQZ1&1H$QT2*=Spz;$$GQxu{oo8AZffL{I;WGIzIDVN^w{UN>B`}DN%1h`K^ zvFj~+zWh`GbZ&3D{%CK02?zho>&?*o-n1SVz-Ea3%zWTmj>_rofXU4N(p03U7rWT)uHzr~SDr)1Rz<_U!maU>_J}E`$!n7XW@Fc@%5NaN;W`_3L6*{a;Q( zKiY>6Ca9YGTG#H@KoDzJP&K!ETTaxmx;1yQ-krk4oEtvv-D@(3>UZrG#aoSw0d4rS zQKkrm> z0;;)27ua6{cAcn4{_5{)vpmLChC!S4aRoZE+k@_qaTOU!r%#C&O=rWQ`ZwH-yO@uw z{f{KR%rba!8BMs)^D)*Q0SA%95!^^tR2j7wBo316OsaZmvV>^|y~KT#C%H+!HQg=~ zZ@yvUw))Vc&0WSfuyY=3XLCatf9n3$%ecVHcv+B<(tq<3&mysw!>;4&6U|+010%e0 zGrcUwl4ZaP;U`U}w}rT4t-#qbaQ@YJv8B4c;H3Io!&c1Sc#WivStrk-_lJ)*r>?`P zlS;ToPR78^%R--rN_u_U5+zVy{W5M6>8M5ihn`ro_C8~7#>}Z&9*Vu9P4dN{U4KykD>_4fRlOLBt>II!-o+U46kq#B z)Vvcq>}lsQi-c`g1J#<(L+7sLms=)(-fQXTXu*^Nl=)Cq)wZ0C;h#Sry5?&v5J7zz zFv6HP9B%54O_zlt0L9^g+t{^A3IH}R(Dt*mv{X2Ja*A+qF3)EzrH!H?YPqkz+{YIu zvCbgqnr1bO1+5+W4(+8267jAq#*s&a>Jz#NC0kQa8(mUHD*DM1Emb)(9$tN|hK+SH zriGjM*Dd+QNM?nBRkRUKnvbgeU+EYNA<+D}sop&-G8*7Y)Kbs`gYwHY%31wuhSphpLPxh@?>&4Oh%8!3Sxk#pVEO6O z4z07kJANfw(d@TQkRSBGJIG*yO%cqgIFf2A!B^Qy$rfdz4Pk@AWVNv{G`m>6=PYPx z$03@B-7f}?EYO$mtd$y$@al#QWz-vP`<{(##WyBpD+#dC6B-Biwqr)>cyeechswd( z>qA5JD+jbMF@;vgwLUkGscEJ4iDe8mQjLqxKinE#Z39t-S4T~KRN3#F)NcwXur$33 z7aA{;fRn>VF)wnNbNi1hV86d7Ik4T#HD4b$?iCUI5;yP;2Ja}3@_=1l+3-eCHgeyh zpP2Dz3iZ3gWG0WGNHYU*i`dVU*1AWyUoDCcRahu)lAwvo6CH`K`ki3qCX*)xr5vd86cwKtzrFKZvuw$FPlg3@ugGMxPLi7LZ;~S`GcE48`w(-rXff zvtOrU34y%vx$BA%8Nrpl!gy7w0Y=i}zUyw4!&ktu>E$L*@coMSvRIJor{OJAJ}b4B z3g#dqk7!R{O9nuwFObYU;?;Dw;9V|)IBm!(oT@%;I^2~gYU0POLu)t3er-8-%In8* ziQ+0dAFYbn32)w) zrT0_5z%*gt%ZgoD=IJb}Knq6dF!7*uS@K~{YI3prC7U@WG^%?EW~r?3uD3ra&0;%I zQBNSR9~Je2u2Ce#IA2M5m~t|JNlCfrdf>tzeudE0ya2+#9&V zm^qY7my70Ra?(V}+32`t{O$eqBe3~6sYrQfaSy?e8rbckC|JS&ak=~JN%~ejOcf;d zJCh%GB${%^-3I@_(~l$%oP0NHo$1ySvIHGD}3q7ohK)`U=2U3 zbQf|n)Yn*|^$twKkLb&0nzd?aUM9=erv9#`{wBZvTY~!M+4|?_70s>RWSX_=Z+V$A z^`F$Guw`#X4|IJ`w9S2B0vxKqS@H5YJYrZY8Gv`F{PQg8IkU`kV5K=GJdA&02MSUZ$-2%S`=i{Q3t4_1D1rL(v;}fTCS~@&-?HwGsom z-oPtIh~74-8RE~`V28oBs=Y3zJ;!fvA!TfP?L3Hs_}Ni=CM$fDpEbj*;K6IJt7)&v zZ|@e$*!Je}KzsA~*-?8YD}0rowX^n$TaJXeW)nQJZRWIsmVRI|N;z7ZombqOC$jKp zGQux;8SQv!LH)e8oD*xo_0~cO!lgqKYurDaQ_iFIn6nT*p8KAY2N08I5EDo_M-VEa zGs+5DPmazYX3tR=;LP=mtrcgd&#WUXAo7XJ8QkK#iF`Jr5;>~eEkwthQ6ZZ z-_+K>@$&l$3eA^I9q;j8W8bN9L&v>l!LO;I$w}@XoiPZxXc{}uX`4~ZLP`3mldLP9 zU)Xy3rnZ8@j#E53L_SwKi8tM+?=fN5Xgy+La3GeN=-1iCY$W-4N@ZeCqWTrD;sn|3 zQ_5D=4Ju@u7lH}25|$G}0+&P(4r@h|N_q98QVr4$ZtH96;=y-mSGulL-O$-P3Jz+y z-APWVPy;f3n3FH6&$i}Z5uwFGuf=qKNJ;og7M<99U%}vALT$e$MO`HZ2v6=oHHs_G ze!jtoaVx3dJl^J-T}oPh4Ip2%v_z-%BKK_}MM+{RQrsU7Gk>wTn65+;X=bInE25f` z+!36}WfYiAHoAASjpiwc(_Ck8b@z+!DQK;sGsU*sR$cK?5oU5O0TmTi=~?dMv_d#F z{v1q8=%M&W51M#SK|$;O$;Pc5Zb>*><1bu&mjdCvI+5A`uO6NH{#K1!JKj?Nv->y5 z^sg)1*MHO~w{6|x*&h>MgcdY&u@hbf?&}wn^GQw$q1bhX7+T89bdsdh(W!=+>U*;P zz@~ecmF3TpvQ7+W1GfA3%(UHSGN0x~sy=PKbVptHViMYZ`u!i2*MFUZ;ohp2@}HPy zrL65L%>U0gEo1xt_eJ;ET@vtAGC_DM%feIWhG`7BO7H64!@4(pF|S#edLttueu%GK z$^v|SnT@ZW7GE<)?+m_*fUk3W&A{nEU@YOm#gRcz`==Sk73++P zL=L}$CmmR}RE~F%m=dufk0kfBpZ5%S^AA7d&EHtwy!ApIXU=2GJ~MLB7K;DgRAAhj zwiaG7Y3I2#NvY6DU4_2nel^Y{f+g3=(vVS!0IdDw-H{+ z$M3L!e>)JhX&t`X4*weeJ{yfx*Jw(jcPZx1N%gjE>jn<_@RXcZ*0yaIqNweLY)^b4 z$&T?$;^BxRK(Q8nE8XYM18%~yo6y$^9@~7ra5#e*Y@@qED@LDfk@DqZk@6?+2#F=Z z($?>692`+k(p`rkF^|Nr>? zFE{=FruYZ_KRna_bMyN@CaeEip=S60g8%RP56^Yle?ty{5J;X(yV6rDrxyD9VNxnuiC1&LZbP6b!NakWTD%;%>umYQH_$L!B4yT28vHHpLB-u_fUXwLGCmx4q zf~m$T99wK|rIbmZykdv?$Cxap4CLCFJbsk^Q6UYYpOZ+-e|79RLj1rZ04aSrSoHKS zi~s9AxfYuPA4g%0T)i!H!#Tn`SlW;2CEdtN7S`X&S|E7-%6a%N3Gj~trHB9Iw0*PD zU;c_kf6ueC(f`}ecZ_~JFSIZi0s0db{Wa%yg8s*_d*-6wj-QYI9nya``q5WC`rje` z-=$;V|K4-Je{(+mJEwnmB!3(X{WA_XA==YJ^2WjF&pGncqyMr1|85rkAxkrp81ld4 zC5!*-&&tOC?w|d?!GHVcPVhe%Cx!nT_#gW#OaH*MllY$ot85SdeVJNz694136ciwU zUX+w*+lst+N>2!&6YmKSKxngKK-XW`F{-`GV&i*$;bZ)GDr^H#59r) zcSipsgB^xhA4?2lHqhoz#rQ3|6d;Eb?~Hpe=Y?Xo=_z>`Cmg<#pJ1|PYrI_#q2Jms zy$S(UGTKH6sd_FHKdGyVXzkP14)-+hQa6TMkDGA7?n9sY2?0vV+Kc3eM%x#U)UUYP=;db*ba@b2t9AW<_Jsp zvPfdBHoE{yi|Av;l&L91SKuwe=2vMXHHvR5BZ*Dgl_UGBPQUd|zt8Z<$4U6>-9y*v zeiodOyM?ZuW}iswNh`$MAMk?H_Vy;DH#2Q^-IEEkFP?nMxQ*%g)=!+oDyQv(P3-U< z9ZvN;+C&9UX{7pXill0`h1<4vo4QXV+4bm1qJAJiDEC&U@N=i|GxD~K3oYm}o68SQ zEDTqzY8e??aAM)?TD^DC`w-r{%&zUi`!0I_1@F7euHA+Au6jR|_pY;RxpMTxBE9d; zd(rILBHp{{eOKPQ&93d{3`T1S#aA*k&SG}C^!H0M_K~E)`QeRjn7gH}n?UCyiB~|- zfEUF-RH$mUR?BPVJF4V^1PciGtCq}rgV2fbYuAsdUlEKL;vDHb8 zEa})Iv%Xi86&UmIA`mtEQ$Jn=PO|#Ek)lwQ6{S^u6N*h>FLHH_G3au@$EAcUs_8TB z7A1BWGv7m2bjRbl^Lfm)hg(l!WN`DQD|R&uF|&uRX~n?RNAt4ive8}Dwd4prs^P(G z)r4YaXIhOUn%!0P7^u@HsZHXCf>A@6qjhj3L!RNPH;GbA9%oSoz3N84=Ob*?R4ol% zqiuLlYXUC^$n9||oNxUYWM>+nqZ0gv7WCY6cEnH_QRLTg1GX8!*e}7hu|sACF>zJF z>V^`7n)>Qe4Q516#0+SpYFX%-|Kba+s=-(7fQnH{+}{rc18vn8oP|^pi0=jz9n80VQfzK=f&*xa@4e;q~kd%`iUxPJt%9r6uRNB z?AywlVGLC7KBQVwq-5z@ud#VGt53ARJ@ZU)Z1oe5UtQp?A1Pngn0kcCaxKPEd=Usn zy%jqy99k5L9U?Mr`=)y+rd&Mj8j3BmPd$mBYrnFt|E+!M6^b7to?d*>5h+~oe}Uo_6tEz8|_D!;6yb!v8H-CeJ;j)z!x z&N|_^OUJc@V&zo8^OTnJLosc?=y_~Y>+#gkb=;+`$3$m#8`pXy5Q(4+P@i)q(g2lK z@Ejk1lxsep`tGHUaPkb!*k!u0&Tlz=jCjV{ITw$ebXm)|%h=`+j)qGBTC}xXe5pxV zmOr2}=`-kGjUi;*@$(Nl!5%O`4<`9KN%EgzpI7jd0?DlW# zi{ya43opLxqW+Vesu3ljxXysgnpryT@>cqM6)!Zu@01q$pV#P0PGj0eb*=w~nIT9<9IfdI=Spq2Jq3^~4MMkDWBd5=eYLMKo4on7KShXLg5SexKLGv3Nh& zCf4HQVdPiaH$QE?zYCj|;|6fzxNrEIEJdg#MxU^SsbV zpG#?ECC@qd3JBys2r~~~!hz`O4KNK3DE1;x0UZuBXK#@m>8DH?Ntu@E%}~W(s6EK` zeZY~onQS%6CyFAbJPAl6#!vTr1tqQz2Ctc9My+e>5wlKcVthjJo>U!B&x^VTSTZX; zgp4qm3TSum zl+F3YK~w+pjcE!#rJcT^_P4Dj$NI#m^pk0WJi|=b7>T`Z5zDFKJ{=n4xb`d`4^N9y9NnLRZ|auNyB>R_AW3( ztwop8M2{BOXv|1wX!xWs#($-!#0*v@ABG=4ZPrCwX3i+;6Mmxq)i*`@e|h>S=ZS{R z&;0emx8il-C3l>&>VTq8#vJ6f^rwt>IW$_!66rVWYL>XkBAg44DMw-H%CW7`9b3wr zr5}_zyJ08(#^jQY6S`w)ImcM{9Op$A@ZLJvIa z6h7~4dEY5q>wm1Hs$muG9zW7>R_(UI#J_Eu&r$YYfI*u8nfS)Q=`|Y(J;15p2VM>r zzCweM!q0;SSygeRXT*pi`GlasYp-y-`!6{pewU6zxmf?1Bj!IV%pGt?&LG> zE2!EvbaOk3PYok{H4a6+Gj4po-&L|GOh&G^8@%h}Ju;vDb90;8iYoX{sEHwEtA>;n z>cqcU_Y;TeR1`_P)Mq_vo%Y@yYMu5zGv;rWq2^TGDXcD*W&91Ds%0&8PSw(u6Ed;# zxk{!b?o@r&5+x+p%)VNA^?QZ)&<#^jKk&xwem0%o9G`HzdAZor^mO-KWJugK}(sF903kXHZLn|ImYZ8td={8d_F9{B>SF7@xgmd z`9LLG*EPC_9e8e*zm(!hFW=7o0cP@9AGcFmXu(W2q-<~~Mb$Nk!lui%Nu~SiU!6^y z1SjD|g(P%AlW|(>=Ngv+C&eN1n$S(i3_n2No3QXfCq?N84C@|8d6~1vIEfF23LERW zi`aM;j+V!P+yYWX-!&*Z1Vr`4-2lnG{WlbwwL;)!n`+Y&`W58d7w_3GWI=TjU+I{` z8j3i{b4xgJ(0_SYG-CbZK67wl>&d2%lZ=YpPfpgmj5d35vP!@FsXkD!>w5FP(!4t? zJIS!**=Ot@j&!WJ);LSIc7?T8K^394KPhKw-`_h+-|gxYKAo&9ix9gac{EoYRfr$L ztm2Y&HHk-zdo3w_AeT_A3*#6`?)NlMg;RA5vJF+D0}@ws)u%d)3Xhb}15(wXGV!A* zgOdcN+Yv6Fr>(o0)LT%Zd8-ZGw33f>X@t#PqcsU0#Kx>+cI)2?#oMSmX+fc>o7!uO zabcfIy+n&sTLs*Yn5=V#YKa`y<|GT+T1Liwhp3kXEHQa%%^ikB`b*lIcWq$O0^n$f zePWYELpJ$UfiY`^h9zqxJ->c+)9YUA(U^xSowjLiK`RUWIwX`H_oHh*BGg4cIJBjI zFqjy^(MKOsS(r3f{uctrs3o}VL=vkw1`vVJ1zZF%WUy{uaQE;q<|U8JQO=23t$_4>Il;;cz6G_A1>|t@oM!WH>vl{Qt!QSVF1I4PViR- zqX|`({Blre$WlIXE>~z86qX8wW%Z#2R!GBTp;(F54V|E|G(h8dQv-@bGWaA((U+x^ z#yQIs-dY>_>&o;>-gDr!yaFxzjOBAp2I7EW;HhB9?<2sGKhTzE;<}I8=koNiG-UC@ z{x^IJ$#q9OTtP?G@~Z>WqUhY#ZJ z)d4Rwq(*HE7cO-c28v(r7o5eu?iaybY5F+l#WfA_^`Y2c5nEzuZDKk4)~gLw>qFNaM32HtJId;- zMniu$LjWSbUkLj9_8y%jXg^8EN%ZKXp)8UdTG23|or7!vto5mL=}CKbPZ*kIk;GGU z;f3&`A9P_ucwtT#+9SQ!(gi}iVBqq)P!Ue7^SV$Uf3u~fHt|JbDfK;F^{>!%zk%%d zSmq?2b+_#`x}XZrxX^Wf2FvL>X*C|f`7{}Q+wd@`otR@bNNlbWW=GB=Zk4W@#Pw~rZk z1Be}7k^V2bT%Ta5x2&(-vZFUtLbEc0@;%TpwFVjhj zFLM!c1jRqo&&L9y@cOw{^h-Z8EYL}J-w7|yA)IxQ-mitFyxZ=+7-q=<*@s_zx*_p8 zr2cwC)f-pL%JdiEo#`q)M;J3Q4g5cRPpg@hD%_9$&FAb-4lBW)yU{YxC6uz55Q zfBunq9EKq9;sAY~N&Q16^`T7a8JX12GO54Mq&}Q^luY&N{VMZVf(XsxKJ38R_j|K` z!kVBZls3Y&`a}8u)V-Cke=O0C8h4-ZT+~YXAMdc_NxZMGXQSkyJeHwxkzZ?Iv{j^Y zeYq2g{fkjxgC~M8z_DBFJ=S-|wVMS*Wr4f<47q`KEoU}gPm@ffUVvcqqItXQ@YzHxhK6RQW!6@8(Cx7BbY4B^=QCCtJbgnICWG^ z@`F5b{zy3tbTwtcT?^!3J+Z&=!&lqA#tLcXdX{Fss;11`Y`IR)G1DJfMi&8m1<({E zT3-ByI&?js*dEnO+0m+WFBWg@_U%};!(iP%-E;2eGEimExU~>^h@DltR=Y|WXRUB4 zmcLfB^9{9_fwbdyD)sGf{JcQ{fE|vXH*V=VNY>8d!ugIcFdJxfN5J=#qR+y50U=|d zb!jWYyj9x2;k(<>n*|Z5xP6+BikKM0pHH#JZ2G0_F*?-^f2anHh^=8Ei5(^`5Bb(8 zUx4G-Tzy-o#n(LYyLGDHAC8#zV>+IuKFZDU%6V{J$fvaYUya;wPXWI4bkc19vqDLk z@A>aG76%s~az~IXS7R!?a^CtfKfjINb;yxHJg*vnP45-FbN(!Pf}shW+#FJjr$$e9 z+yi@)&W!NhvC*ray=NQ{IL}tQxxKKZaCro);p`HfW%1}Gd3CXX`@jNc`PLK&n=TrAmKT-or zj*bG2y6e7njJ{QmRRxLtF6763^cR`)pjq}WNpA6iTzC-PHPOeS!bT)Dfvv)K#o5VS z@NK4-3Xh3nCQj!i#K+vnIwe_;iCngyBMIzC#^R46Tl-6XHG~i==3rBqk+E$vnhL0_ z2CGelGCQ*5*h9c3>?O7wQb&zkx^yubo>m>Rd!#v2s8d-%W5K-3z%A{wLIL#jF$2Hcv^tlmOn^-ir z^fJNo0FRx3ZR@x-y;AU<))0DhW|u`Ce7h6rWLwK%0DNbV1+Wcw2$My?b@PCmc{0Gg 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

    ri-ccX*u!-(OcL!s;gJR)x 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 WMrVAAS#J4Bk>{0s!%ub^;QoJR%cBbb literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/context_amd64.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/context_amd64.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1cedbf59c3fe00eabf00196bfd92a618afdff2e GIT binary patch literal 19678 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/context_i386.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/context_i386.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4090bb1ad8d7d3aa9e407fb593d6dfff075ed3b5 GIT binary patch literal 11704 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/gdi32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/gdi32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6ccbe907f7cc6df219d1159f0a44645ac432839 GIT binary patch literal 13631 zcmdUV3wT?{b>;;Kl6Zp;kRT~iA}Q)YITmfnmMmL-fWRdQ2?P)Tq@;;sl;m7ep!iS# zNU{{lffFZ@Wv8YSCt{*Bkz+NsYbSNvv`w3RbRSK-Nq0+zN(J5JZrg44!R>BWw$x4H zbT|Fa3@!l4YPy^6+wa@n@8h{MXU?2C^Pe+kW-j<$m&>l;`R?rK)WN-q@)uMwo|nxV=iuIZth?n?qqe`#p=16HE<7Wsb?TV9mUd`7|GE z;a=9tn^+rfW*fMVweuF%!CToz-o`fZ4Xl&5vo7Ajy7@-7nQvk}ypwI=U2H4wX508? zww?E|UT$VPV8dOo;eD{-ZfytKiFzOE_n>|+Y}y5zc58j?K5aL6}xKrX2DYk@PExE3VJRLpMx;}1e+2r?n) zJOH_a7%!}a*)VX30EZ~#V!+`2z#t9`62Kq{3`Y1CHp;iMLwp-M%(t^6yq7V)gMEPC z#UAJHV;|&qvnTjYmg0Tv7x+DFjNi+~`7SoWcQelKV;aAoP4Yc#itlAd`2#G?_pxdI zAUnn%Vl#X{o8=F)IsOQn=Z~`E{4w?+?q?a^&$2wgay-aRaFw0p1MCzZWKZ%TcAAIS z8Ge9$m>*;dJj~AWVfGY{u#fO4%kvm}n!lfYl*ie}c!E8{lkDSsgnfdKvQP3u>>NML zp5;f_dCu5#`~&QH{y6&-{~-HC{seo0r`RI@1@@$3Vy~H{DEZ5lQ_$0f) zr`Qrd%0AE2>H`YJGe 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/kernel32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/kernel32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a0155424324c29625ab7f258e511bdf63c2fd62 GIT binary patch literal 152282 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�hKI9^{R}yG}YfiyNgo2c7WcIpgm4h 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 MKT!6^o61Q3|7UQlVgLXD literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/psapi.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/psapi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33e7a9b87d21c3db18a13cdb04f155b8c1ec8994 GIT binary patch literal 13143 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/shell32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/shell32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab509f3a4519088d5470e7c040e955eea02164d1 GIT binary patch literal 12831 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 Vim@D}zbE}M(>l1H{c#%$_+PvDj}ZU> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/shlwapi.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/shlwapi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bf612137b4dd06831f055a146c69f6e2e677d14 GIT binary patch literal 28435 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 EFUY6;EdT%j literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/user32.cpython-312.pyc b/myenv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__pycache__/user32.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ec031523815c2ebed7afbfbfb15f9253161a2bd GIT binary patch literal 61032 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

  3. + + attrs + +